--- a/net/minecraft/world/level/portal/TeleportTransition.java
+++ b/net/minecraft/world/level/portal/TeleportTransition.java
@@ -19,15 +_,34 @@
     boolean asPassenger,
     Set<Relative> relatives,
     TeleportTransition.PostTeleportTransition postTeleportTransition
+    , org.bukkit.event.player.PlayerTeleportEvent.TeleportCause cause // CraftBukkit
 ) {
     public static final TeleportTransition.PostTeleportTransition DO_NOTHING = entity -> {};
     public static final TeleportTransition.PostTeleportTransition PLAY_PORTAL_SOUND = TeleportTransition::playPortalSound;
     public static final TeleportTransition.PostTeleportTransition PLACE_PORTAL_TICKET = TeleportTransition::placePortalTicket;
 
+    // CraftBukkit start
+    public TeleportTransition(ServerLevel newLevel, Vec3 position, Vec3 deltaMovement, float yRot, float xRot, boolean missingRespawnBlock, boolean asPassenger, Set<Relative> relatives, TeleportTransition.PostTeleportTransition postTeleportTransition) {
+        this(newLevel, position, deltaMovement, yRot, xRot, missingRespawnBlock, asPassenger, relatives, postTeleportTransition, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.UNKNOWN);
+    }
+
+    public TeleportTransition(org.bukkit.event.player.PlayerTeleportEvent.TeleportCause cause) {
+        this(null, Vec3.ZERO, Vec3.ZERO, 0.0F, 0.0F, false, false, Set.of(), DO_NOTHING, cause);
+    }
+    // CraftBukkit end
+
     public TeleportTransition(
         ServerLevel newLevel, Vec3 position, Vec3 deltaMovement, float yRot, float xRot, TeleportTransition.PostTeleportTransition postTeleportTransition
     ) {
-        this(newLevel, position, deltaMovement, yRot, xRot, Set.of(), postTeleportTransition);
+        // CraftBukkit start
+        this(newLevel, position, deltaMovement, yRot, xRot, postTeleportTransition, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.UNKNOWN);
+    }
+
+    public TeleportTransition(
+        ServerLevel newLevel, Vec3 position, Vec3 deltaMovement, float yRot, float xRot, TeleportTransition.PostTeleportTransition postTeleportTransition, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause cause
+    ) {
+        this(newLevel, position, deltaMovement, yRot, xRot, Set.of(), postTeleportTransition, cause);
+        // CraftBukkit end
     }
 
     public TeleportTransition(
@@ -39,11 +_,30 @@
         Set<Relative> relatives,
         TeleportTransition.PostTeleportTransition postTeleportTransition
     ) {
-        this(newLevel, position, deltaMovement, yRot, xRot, false, false, relatives, postTeleportTransition);
+        // CraftBukkit start
+        this(newLevel, position, deltaMovement, yRot, xRot, relatives, postTeleportTransition, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.UNKNOWN);
+    }
+    public TeleportTransition(
+        ServerLevel newLevel,
+        Vec3 position,
+        Vec3 deltaMovement,
+        float yRot,
+        float xRot,
+        Set<Relative> relatives,
+        TeleportTransition.PostTeleportTransition postTeleportTransition,
+        org.bukkit.event.player.PlayerTeleportEvent.TeleportCause cause
+    ) {
+        this(newLevel, position, deltaMovement, yRot, xRot, false, false, relatives, postTeleportTransition, cause);
+        // CraftBukkit end
     }
 
     public TeleportTransition(ServerLevel level, Entity entity, TeleportTransition.PostTeleportTransition postTeleportTransition) {
-        this(level, findAdjustedSharedSpawnPos(level, entity), Vec3.ZERO, 0.0F, 0.0F, false, false, Set.of(), postTeleportTransition);
+        // CraftBukkit start
+        this(level, entity, postTeleportTransition, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.UNKNOWN);
+    }
+    public TeleportTransition(ServerLevel level, Entity entity, TeleportTransition.PostTeleportTransition postTeleportTransition, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause cause) {
+        this(level, findAdjustedSharedSpawnPos(level, entity), Vec3.ZERO, level.getSharedSpawnAngle(), 0.0F, false, false, Set.of(), postTeleportTransition, cause); // Paper - MC-200092 - fix first spawn pos yaw being ignored
+        // CraftBukkit end
     }
 
     private static void playPortalSound(Entity entity) {
@@ -57,7 +_,7 @@
     }
 
     public static TeleportTransition missingRespawnBlock(ServerLevel level, Entity entity, TeleportTransition.PostTeleportTransition postTeleportTransition) {
-        return new TeleportTransition(level, findAdjustedSharedSpawnPos(level, entity), Vec3.ZERO, 0.0F, 0.0F, true, false, Set.of(), postTeleportTransition);
+        return new TeleportTransition(level, findAdjustedSharedSpawnPos(level, entity), Vec3.ZERO, level.getSharedSpawnAngle(), 0.0F, true, false, Set.of(), postTeleportTransition); // Paper - MC-200092 - fix spawn pos yaw being ignored
     }
 
     private static Vec3 findAdjustedSharedSpawnPos(ServerLevel level, Entity entity) {
