diff --git a/src/main/java/com/moulberry/axiom/event/AxiomTeleportEvent.java b/src/main/java/com/moulberry/axiom/event/AxiomTeleportEvent.java index 2b7f800..bed8a60 100644 --- a/src/main/java/com/moulberry/axiom/event/AxiomTeleportEvent.java +++ b/src/main/java/com/moulberry/axiom/event/AxiomTeleportEvent.java @@ -1,7 +1,6 @@ package com.moulberry.axiom.event; import org.bukkit.Location; -import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.event.Cancellable; import org.bukkit.event.Event; diff --git a/src/main/java/com/moulberry/axiom/event/AxiomUnknownTeleportEvent.java b/src/main/java/com/moulberry/axiom/event/AxiomUnknownTeleportEvent.java new file mode 100644 index 0000000..21dc403 --- /dev/null +++ b/src/main/java/com/moulberry/axiom/event/AxiomUnknownTeleportEvent.java @@ -0,0 +1,80 @@ +package com.moulberry.axiom.event; + +import org.bukkit.NamespacedKey; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +public class AxiomUnknownTeleportEvent extends Event implements Cancellable { + + private static final HandlerList HANDLERS = new HandlerList(); + + private final Player player; + private final NamespacedKey world; + private final double x; + private final double y; + private final double z; + private final float yaw; + private final float pitch; + private boolean cancelled = false; + + public AxiomUnknownTeleportEvent(Player player, NamespacedKey world, double x, double y, double z, float yaw, float pitch) { + this.player = player; + this.world = world; + this.x = x; + this.y = y; + this.z = z; + this.yaw = yaw; + this.pitch = pitch; + } + + public Player getPlayer() { + return this.player; + } + + public NamespacedKey getWorld() { + return this.world; + } + + public double getX() { + return this.x; + } + + public double getY() { + return this.y; + } + + public double getZ() { + return this.z; + } + + public float getYaw() { + return this.yaw; + } + + public float getPitch() { + return this.pitch; + } + + @Override + public boolean isCancelled() { + return this.cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } + + public static HandlerList getHandlerList() { + return HANDLERS; + } + + @Override + public @NotNull HandlerList getHandlers() { + return HANDLERS; + } + +} diff --git a/src/main/java/com/moulberry/axiom/packet/SetBlockBufferPacketListener.java b/src/main/java/com/moulberry/axiom/packet/SetBlockBufferPacketListener.java index 2c2cacb..a13eb1b 100644 --- a/src/main/java/com/moulberry/axiom/packet/SetBlockBufferPacketListener.java +++ b/src/main/java/com/moulberry/axiom/packet/SetBlockBufferPacketListener.java @@ -92,8 +92,8 @@ public class SetBlockBufferPacketListener { private void applyBlockBuffer(ServerPlayer player, MinecraftServer server, BlockBuffer buffer, ResourceKey worldKey) { server.execute(() -> { - ServerLevel world = server.getLevel(worldKey); - if (world == null) return; + ServerLevel world = player.serverLevel(); + if (!world.dimension().equals(worldKey)) return; if (!this.plugin.canUseAxiom(player.getBukkitEntity())) { return; @@ -278,8 +278,8 @@ public class SetBlockBufferPacketListener { private void applyBiomeBuffer(ServerPlayer player, MinecraftServer server, BiomeBuffer biomeBuffer, ResourceKey worldKey) { server.execute(() -> { - ServerLevel world = server.getLevel(worldKey); - if (world == null) return; + ServerLevel world = player.serverLevel(); + if (!world.dimension().equals(worldKey)) return; if (!this.plugin.canUseAxiom(player.getBukkitEntity())) { return; diff --git a/src/main/java/com/moulberry/axiom/packet/TeleportPacketListener.java b/src/main/java/com/moulberry/axiom/packet/TeleportPacketListener.java index b8b6ec7..dfabcfa 100644 --- a/src/main/java/com/moulberry/axiom/packet/TeleportPacketListener.java +++ b/src/main/java/com/moulberry/axiom/packet/TeleportPacketListener.java @@ -1,7 +1,7 @@ package com.moulberry.axiom.packet; import com.moulberry.axiom.AxiomPaper; -import com.moulberry.axiom.event.AxiomGameModeChangeEvent; +import com.moulberry.axiom.event.AxiomUnknownTeleportEvent; import com.moulberry.axiom.event.AxiomTeleportEvent; import io.netty.buffer.Unpooled; import net.minecraft.core.registries.Registries; @@ -9,6 +9,8 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.Level; import org.bukkit.*; +import org.bukkit.craftbukkit.v1_20_R2.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_20_R2.util.CraftNamespacedKey; import org.bukkit.entity.Player; import org.bukkit.plugin.messaging.PluginMessageListener; import org.jetbrains.annotations.NotNull; @@ -34,12 +36,24 @@ public class TeleportPacketListener implements PluginMessageListener { float yRot = friendlyByteBuf.readFloat(); float xRot = friendlyByteBuf.readFloat(); + // Prevent teleport based on config value + boolean allowTeleportBetweenWorlds = this.plugin.configuration.getBoolean("allow-teleport-between-worlds"); + if (!allowTeleportBetweenWorlds && !((CraftPlayer)player).getHandle().serverLevel().dimension().equals(resourceKey)) { + return; + } + + // Call unknown teleport event + AxiomUnknownTeleportEvent preTeleportEvent = new AxiomUnknownTeleportEvent(player, + CraftNamespacedKey.fromMinecraft(resourceKey.location()), x, y, z, yRot, xRot); + Bukkit.getPluginManager().callEvent(preTeleportEvent); + if (preTeleportEvent.isCancelled()) return; + + // Get bukkit world NamespacedKey namespacedKey = new NamespacedKey(resourceKey.location().getNamespace(), resourceKey.location().getPath()); World world = Bukkit.getWorld(namespacedKey); if (world == null) return; // Prevent teleport based on config value - boolean allowTeleportBetweenWorlds = this.plugin.configuration.getBoolean("allow-teleport-between-worlds"); if (!allowTeleportBetweenWorlds && world != player.getWorld()) { return; }