--- a/net/minecraft/world/level/portal/DimensionTransition.java
+++ b/net/minecraft/world/level/portal/DimensionTransition.java
@@ -6,35 +6,48 @@
 import net.minecraft.server.level.ServerPlayer;
 import net.minecraft.world.entity.Entity;
 import net.minecraft.world.phys.Vec3;
+// CraftBukkit start
+import org.bukkit.event.player.PlayerTeleportEvent;
 
-public record DimensionTransition(
-    ServerLevel newLevel,
-    Vec3 pos,
-    Vec3 speed,
-    float yRot,
-    float xRot,
-    boolean missingRespawnBlock,
-    DimensionTransition.PostDimensionTransition postDimensionTransition
-) {
-    public static final DimensionTransition.PostDimensionTransition DO_NOTHING = entity -> {
+public record DimensionTransition(ServerLevel newLevel, Vec3 pos, Vec3 speed, float yRot, float xRot, boolean missingRespawnBlock, DimensionTransition.PostDimensionTransition postDimensionTransition, PlayerTeleportEvent.TeleportCause cause) {
+
+    public DimensionTransition(ServerLevel newLevel, Vec3 pos, Vec3 speed, float yRot, float xRot, boolean missingRespawnBlock, DimensionTransition.PostDimensionTransition postDimensionTransition) {
+        this(newLevel, pos, speed, yRot, xRot, missingRespawnBlock, postDimensionTransition, PlayerTeleportEvent.TeleportCause.UNKNOWN);
+    }
+
+    public DimensionTransition(PlayerTeleportEvent.TeleportCause cause) {
+        this(null, Vec3.ZERO, Vec3.ZERO, 0.0F, 0.0F, false, DO_NOTHING, cause);
+    }
+    // CraftBukkit end
+
+    public static final DimensionTransition.PostDimensionTransition DO_NOTHING = (entity) -> {
     };
     public static final DimensionTransition.PostDimensionTransition PLAY_PORTAL_SOUND = DimensionTransition::playPortalSound;
     public static final DimensionTransition.PostDimensionTransition PLACE_PORTAL_TICKET = DimensionTransition::placePortalTicket;
 
-    public DimensionTransition(
-        ServerLevel world, Vec3 pos, Vec3 velocity, float yaw, float pitch, DimensionTransition.PostDimensionTransition postDimensionTransition
-    ) {
-        this(world, pos, velocity, yaw, pitch, false, postDimensionTransition);
+    public DimensionTransition(ServerLevel world, Vec3 pos, Vec3 velocity, float yaw, float pitch, DimensionTransition.PostDimensionTransition postDimensionTransition) {
+        // CraftBukkit start
+        this(world, pos, velocity, yaw, pitch, postDimensionTransition, PlayerTeleportEvent.TeleportCause.UNKNOWN);
+    }
+
+    public DimensionTransition(ServerLevel worldserver, Vec3 vec3d, Vec3 vec3d1, float f, float f1, DimensionTransition.PostDimensionTransition dimensiontransition_a, PlayerTeleportEvent.TeleportCause cause) {
+        this(worldserver, vec3d, vec3d1, f, f1, false, dimensiontransition_a, cause);
     }
 
     public DimensionTransition(ServerLevel world, Entity entity, DimensionTransition.PostDimensionTransition postDimensionTransition) {
-        this(world, findAdjustedSharedSpawnPos(world, entity), Vec3.ZERO, 0.0F, 0.0F, false, postDimensionTransition);
+        this(world, entity, postDimensionTransition, PlayerTeleportEvent.TeleportCause.UNKNOWN);
+    }
+
+    public DimensionTransition(ServerLevel worldserver, Entity entity, DimensionTransition.PostDimensionTransition dimensiontransition_a, PlayerTeleportEvent.TeleportCause cause) {
+        this(worldserver, findAdjustedSharedSpawnPos(worldserver, entity), Vec3.ZERO, worldserver.getSharedSpawnAngle(), 0.0F, false, dimensiontransition_a, cause); // Paper - MC-200092 - fix spawn pos yaw being ignored
+        // CraftBukkit end
     }
 
     private static void playPortalSound(Entity entity) {
-        if (entity instanceof ServerPlayer serverPlayer) {
-            serverPlayer.connection.send(new ClientboundLevelEventPacket(1032, BlockPos.ZERO, 0, false));
+        if (entity instanceof ServerPlayer entityplayer) {
+            entityplayer.connection.send(new ClientboundLevelEventPacket(1032, BlockPos.ZERO, 0, false));
         }
+
     }
 
     private static void placePortalTicket(Entity entity) {
@@ -42,7 +55,7 @@
     }
 
     public static DimensionTransition missingRespawnBlock(ServerLevel world, Entity entity, DimensionTransition.PostDimensionTransition postDimensionTransition) {
-        return new DimensionTransition(world, findAdjustedSharedSpawnPos(world, entity), Vec3.ZERO, 0.0F, 0.0F, true, postDimensionTransition);
+        return new DimensionTransition(world, findAdjustedSharedSpawnPos(world, entity), Vec3.ZERO, world.getSharedSpawnAngle(), 0.0F, true, postDimensionTransition); // Paper - MC-200092 - fix spawn pos yaw being ignored
     }
 
     private static Vec3 findAdjustedSharedSpawnPos(ServerLevel world, Entity entity) {
@@ -51,10 +64,11 @@
 
     @FunctionalInterface
     public interface PostDimensionTransition {
+
         void onTransition(Entity entity);
 
         default DimensionTransition.PostDimensionTransition then(DimensionTransition.PostDimensionTransition next) {
-            return entity -> {
+            return (entity) -> {
                 this.onTransition(entity);
                 next.onTransition(entity);
             };
