--- a/net/minecraft/world/level/portal/TeleportTransition.java
+++ b/net/minecraft/world/level/portal/TeleportTransition.java
@@ -9,7 +9,19 @@
 import net.minecraft.world.entity.Relative;
 import net.minecraft.world.phys.Vec3D;
 
-public record TeleportTransition(WorldServer newLevel, Vec3D position, Vec3D deltaMovement, float yRot, float xRot, boolean missingRespawnBlock, boolean asPassenger, Set<Relative> relatives, TeleportTransition.a postTeleportTransition) {
+// CraftBukkit start
+import org.bukkit.event.player.PlayerTeleportEvent;
+
+public record TeleportTransition(WorldServer newLevel, Vec3D position, Vec3D deltaMovement, float yRot, float xRot, boolean missingRespawnBlock, boolean asPassenger, Set<Relative> relatives, TeleportTransition.a postTeleportTransition, PlayerTeleportEvent.TeleportCause cause) {
+
+    public TeleportTransition(WorldServer newLevel, Vec3D position, Vec3D deltaMovement, float yRot, float xRot, boolean missingRespawnBlock, boolean asPassenger, Set<Relative> relatives, TeleportTransition.a postTeleportTransition) {
+        this(newLevel, position, deltaMovement, yRot, xRot, missingRespawnBlock, asPassenger, relatives, postTeleportTransition, PlayerTeleportEvent.TeleportCause.UNKNOWN);
+    }
+
+    public TeleportTransition(PlayerTeleportEvent.TeleportCause cause) {
+        this(null, Vec3D.ZERO, Vec3D.ZERO, 0.0F, 0.0F, false, false, Set.of(), DO_NOTHING, cause);
+    }
+    // CraftBukkit end
 
     public static final TeleportTransition.a DO_NOTHING = (entity) -> {
     };
@@ -17,15 +29,33 @@
     public static final TeleportTransition.a PLACE_PORTAL_TICKET = TeleportTransition::placePortalTicket;
 
     public TeleportTransition(WorldServer worldserver, Vec3D vec3d, Vec3D vec3d1, float f, float f1, TeleportTransition.a teleporttransition_a) {
-        this(worldserver, vec3d, vec3d1, f, f1, Set.of(), teleporttransition_a);
+        // CraftBukkit start
+        this(worldserver, vec3d, vec3d1, f, f1, teleporttransition_a, PlayerTeleportEvent.TeleportCause.UNKNOWN);
+    }
+
+    public TeleportTransition(WorldServer worldserver, Vec3D vec3d, Vec3D vec3d1, float f, float f1, TeleportTransition.a teleporttransition_a, PlayerTeleportEvent.TeleportCause cause) {
+        this(worldserver, vec3d, vec3d1, f, f1, Set.of(), teleporttransition_a, cause);
+        // CraftBukkit end
     }
 
     public TeleportTransition(WorldServer worldserver, Vec3D vec3d, Vec3D vec3d1, float f, float f1, Set<Relative> set, TeleportTransition.a teleporttransition_a) {
-        this(worldserver, vec3d, vec3d1, f, f1, false, false, set, teleporttransition_a);
+        // CraftBukkit start
+        this(worldserver, vec3d, vec3d1, f, f1, set, teleporttransition_a, PlayerTeleportEvent.TeleportCause.UNKNOWN);
+    }
+
+    public TeleportTransition(WorldServer worldserver, Vec3D vec3d, Vec3D vec3d1, float f, float f1, Set<Relative> set, TeleportTransition.a teleporttransition_a, PlayerTeleportEvent.TeleportCause cause) {
+        this(worldserver, vec3d, vec3d1, f, f1, false, false, set, teleporttransition_a, cause);
+        // CraftBukkit end
     }
 
     public TeleportTransition(WorldServer worldserver, Entity entity, TeleportTransition.a teleporttransition_a) {
-        this(worldserver, findAdjustedSharedSpawnPos(worldserver, entity), Vec3D.ZERO, 0.0F, 0.0F, false, false, Set.of(), teleporttransition_a);
+        // CraftBukkit start
+        this(worldserver, entity, teleporttransition_a, PlayerTeleportEvent.TeleportCause.UNKNOWN);
+    }
+
+    public TeleportTransition(WorldServer worldserver, Entity entity, TeleportTransition.a teleporttransition_a, PlayerTeleportEvent.TeleportCause cause) {
+        this(worldserver, findAdjustedSharedSpawnPos(worldserver, entity), Vec3D.ZERO, 0.0F, 0.0F, false, false, Set.of(), teleporttransition_a, cause);
+        // CraftBukkit end
     }
 
     private static void playPortalSound(Entity entity) {
