From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: MrHua269 Date: Fri, 31 Jan 2025 20:28:45 +0800 Subject: [PATCH] Add missing teleportation apis for folia diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java index b17ace9118c94a756fa2901621c6b2b9bd9e5764..8a728a3af515da522cd5fab1e731bbc0607f0596 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java @@ -1660,6 +1660,9 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc if (respawnComplete != null) { respawnComplete.accept(ServerPlayer.this); } + // Luminol - Add missing teleportation apis + new me.earthme.luminol.api.entity.player.PostPlayerRespawnEvent(ServerPlayer.this.getBukkitEntity()).callEvent(); + // Luminol end } ); }); diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java index 3ad00cc095588574218ca6d729ead119403202e0..ccf1914b4f48ecc0f4fe980510f42d5415ec1daa 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java @@ -4160,6 +4160,31 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess } // TODO any events that can modify go HERE + // Luminol start - Add missing teleportation apis + org.bukkit.Location destinationLoc; + + if (pitch == null) { + if (yaw == null) { + destinationLoc = io.papermc.paper.util.MCUtil.toLocation(destination, pos, Float.NaN, Float.NaN); + } else { + destinationLoc = io.papermc.paper.util.MCUtil.toLocation(destination, pos, yaw, Float.NaN); + } + }else { + if (yaw == null) { + destinationLoc = io.papermc.paper.util.MCUtil.toLocation(destination, pos, Float.NaN, pitch); + }else { + destinationLoc = io.papermc.paper.util.MCUtil.toLocation(destination, pos, yaw, pitch); + } + } + + final me.earthme.luminol.api.entity.EntityTeleportAsyncEvent wrapped = new me.earthme.luminol.api.entity.EntityTeleportAsyncEvent( + this.getBukkitEntity(), + cause, + destinationLoc + ); + + wrapped.callEvent(); + // Luminol end // check for same region if (destination == this.level()) { @@ -4276,7 +4301,18 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess // we just select the spawn position case END: { if (destination.getTypeKey() == net.minecraft.world.level.dimension.LevelStem.END) { - BlockPos targetPos = ServerLevel.END_SPAWN_POINT; + BlockPos targetPos = ServerLevel.END_SPAWN_POINT; // Luminol - Rename + // Luminol start - Add missing teleportation apis + final org.bukkit.Location orginalPortalLocation = io.papermc.paper.util.MCUtil.toLocation(origin, originPortal); + final org.bukkit.Location targetPortalLocation = io.papermc.paper.util.MCUtil.toLocation(destination, targetPos); + + final me.earthme.luminol.api.portal.PortalLocateEvent portalLocateEvent = new me.earthme.luminol.api.portal.PortalLocateEvent( + orginalPortalLocation, + targetPortalLocation + ); + + portalLocateEvent.callEvent(); + // Luminol end // need to load chunks so we can create the platform destination.moonrise$loadChunksAsync( targetPos, 16, // load 16 blocks to be safe from block physics @@ -4301,7 +4337,18 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess } ); } else { - BlockPos spawnPos = destination.getSharedSpawnPos(); + BlockPos spawnPos = destination.getSharedSpawnPos(); // Luminol - Rename + // Luminol start - Add missing teleportation apis + final org.bukkit.Location orginalPortalLocation = io.papermc.paper.util.MCUtil.toLocation(origin, originPortal); + final org.bukkit.Location targetPortalLocation = io.papermc.paper.util.MCUtil.toLocation(destination, spawnPos); + + final me.earthme.luminol.api.portal.PortalLocateEvent portalLocateEvent = new me.earthme.luminol.api.portal.PortalLocateEvent( + orginalPortalLocation, + targetPortalLocation + ); + + portalLocateEvent.callEvent(); + // Luminol end // need to load chunk for heightmap destination.moonrise$loadChunksAsync( spawnPos, 0, @@ -4356,8 +4403,18 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess WorldBorder destinationBorder = destination.getWorldBorder(); double dimensionScale = net.minecraft.world.level.dimension.DimensionType.getTeleportationScale(origin.dimensionType(), destination.dimensionType()); - BlockPos targetPos = destination.getWorldBorder().clampToBounds(this.getX() * dimensionScale, this.getY(), this.getZ() * dimensionScale); + BlockPos targetPos = destination.getWorldBorder().clampToBounds(this.getX() * dimensionScale, this.getY(), this.getZ() * dimensionScale); // Luminol - Rename + // Luminol start - Add missing teleportation apis + final org.bukkit.Location orginalPortalLocation = io.papermc.paper.util.MCUtil.toLocation(origin, originPortal); + final org.bukkit.Location targetPortalLocation = io.papermc.paper.util.MCUtil.toLocation(destination, targetPos); + + final me.earthme.luminol.api.portal.PortalLocateEvent portalLocateEvent = new me.earthme.luminol.api.portal.PortalLocateEvent( + orginalPortalLocation, + targetPortalLocation + ); + portalLocateEvent.callEvent(); + // Luminol end ca.spottedleaf.concurrentutil.completable.CallbackCompletable portalFound = new ca.spottedleaf.concurrentutil.completable.CallbackCompletable<>(); @@ -4494,9 +4551,18 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess if (!this.canPortalAsync(destination, takePassengers)) { return false; } + // Luminol start - Add missing teleportation events + if (!new me.earthme.luminol.api.entity.PreEntityPortalEvent( + this.getBukkitEntity(), + io.papermc.paper.util.MCUtil.toLocation(this.level, portalPos), + destination.getWorld() + ).callEvent()) { + return false; + } + // Luminol end // Kaiiju start - sync end platform spawning & entity teleportation final java.util.function.Consumer tpComplete = type == PortalType.END && destination.getTypeKey() == net.minecraft.world.level.dimension.LevelStem.END ? - e -> net.minecraft.world.level.levelgen.feature.EndPlatformFeature.createEndPlatform(destination, ServerLevel.END_SPAWN_POINT.below(), true, null) : teleportComplete; + e -> { if (new me.earthme.luminol.api.portal.EndPlatformCreateEvent().callEvent() && ca.spottedleaf.moonrise.common.util.TickThread.isTickThreadFor(e.level, ServerLevel.END_SPAWN_POINT.below())) net.minecraft.world.level.levelgen.feature.EndPlatformFeature.createEndPlatform(destination, ServerLevel.END_SPAWN_POINT.below(), true, null); } : teleportComplete; // Luminol - Add missing teleportation events & Fix teleportation api threading issue // Kaiiju end Vec3 initialPosition = this.position(); @@ -4570,6 +4636,9 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess tpComplete.accept(teleported); } // Kaiiju end + // Luminol start - Add missing teleportation events + new me.earthme.luminol.api.entity.PostEntityPortalEvent(teleported.getBukkitEntity()).callEvent(); + // Luminol end } ); }); diff --git a/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java b/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java index 95e2dff6782bf7767ecb1a23e618862919ea71aa..386c38273e21ba6b48f9fad67fddc39255138e14 100644 --- a/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java +++ b/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java @@ -193,6 +193,18 @@ public class TheEndGatewayBlockEntity extends TheEndPortalBlockEntity { portalTile.trySearchForExit(portalWorld, portalPos); return false; } + // Luminol start - Add missing teleportation apis + final org.bukkit.Location orginalPortalLocation = io.papermc.paper.util.MCUtil.toLocation(toTeleport.level(), portalPos); + final org.bukkit.Location targetPortalLocation = io.papermc.paper.util.MCUtil.toLocation(portalWorld, teleportPos); + + final me.earthme.luminol.api.portal.PortalLocateEvent portalLocateEvent = new me.earthme.luminol.api.portal.PortalLocateEvent( + orginalPortalLocation, + targetPortalLocation + ); + + portalLocateEvent.callEvent(); + // Luminol end + // note: we handle the position from the TeleportTransition net.minecraft.world.level.portal.TeleportTransition teleport = net.minecraft.world.level.block.EndGatewayBlock.getTeleportTransition(