From 43dbb6f0c3b39161689f05bbcf8f91f5acb9e226 Mon Sep 17 00:00:00 2001 From: barpec12 Date: Tue, 23 Jun 2020 16:26:57 +0200 Subject: [PATCH] Fix teleportation to different sector coordinates, call an event before transfering player to another sector. --- .../client/event/PlayerTransferEvent.java | 48 +++++++++++++++++++ .../listener/bukkit/PlayerMoveListener.java | 8 ++++ .../listener/bukkit/PlayerPortalListener.java | 3 +- .../bukkit/PlayerTeleportListener.java | 48 ++++++++++++++++++- .../client/util/PlayerUtils.java | 16 ++++--- 5 files changed, 114 insertions(+), 9 deletions(-) create mode 100644 NetworkClient/src/main/java/org/mcservernetwork/client/event/PlayerTransferEvent.java diff --git a/NetworkClient/src/main/java/org/mcservernetwork/client/event/PlayerTransferEvent.java b/NetworkClient/src/main/java/org/mcservernetwork/client/event/PlayerTransferEvent.java new file mode 100644 index 0000000..a7903e7 --- /dev/null +++ b/NetworkClient/src/main/java/org/mcservernetwork/client/event/PlayerTransferEvent.java @@ -0,0 +1,48 @@ +package org.mcservernetwork.client.event; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.mcservernetwork.commons.net.Sector; + +/** + * @author barpec12 on 23.06.2020 + */ +public class PlayerTransferEvent extends Event { + private static final HandlerList handlers = new HandlerList(); + + private boolean isCancelled = false; + private Location from; + private Location to; + private Sector sectorTo; + private Player player; + + public PlayerTransferEvent(Location from, Location to, Sector sectorTo, Player player){ + this.from = from; + this.to = to; + this.sectorTo = sectorTo; + this.player = player; + } + + public boolean isCancelled() { + return this.isCancelled; + } + public void setCancelled(boolean isCancelled) { + this.isCancelled = isCancelled; + } + public Location getFrom(){ + return from; + } + public Location getTo(){ + return to; + } + public Sector getSectorTo(){ + return sectorTo; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } +} diff --git a/NetworkClient/src/main/java/org/mcservernetwork/client/listener/bukkit/PlayerMoveListener.java b/NetworkClient/src/main/java/org/mcservernetwork/client/listener/bukkit/PlayerMoveListener.java index 7f90604..deb1257 100644 --- a/NetworkClient/src/main/java/org/mcservernetwork/client/listener/bukkit/PlayerMoveListener.java +++ b/NetworkClient/src/main/java/org/mcservernetwork/client/listener/bukkit/PlayerMoveListener.java @@ -11,6 +11,7 @@ import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerMoveEvent; import org.mcservernetwork.client.Client; +import org.mcservernetwork.client.event.PlayerTransferEvent; import org.mcservernetwork.client.util.ColorUtils; import org.mcservernetwork.client.util.PlayerUtils; import org.mcservernetwork.client.util.SectorLocationUtils; @@ -88,6 +89,13 @@ public void onPlayerMove(PlayerMoveEvent event) { return; } + PlayerTransferEvent e = new PlayerTransferEvent(fromLocation, location, in, player); + Bukkit.getPluginManager().callEvent(e); + + if(e.isCancelled()){ + return; + } + PacketTransfer packet = new PacketTransfer(); packet.targetSectorName = in.getSectorName(); packet.uniqueId = player.getUniqueId().toString(); diff --git a/NetworkClient/src/main/java/org/mcservernetwork/client/listener/bukkit/PlayerPortalListener.java b/NetworkClient/src/main/java/org/mcservernetwork/client/listener/bukkit/PlayerPortalListener.java index 5bac608..f5b0c20 100644 --- a/NetworkClient/src/main/java/org/mcservernetwork/client/listener/bukkit/PlayerPortalListener.java +++ b/NetworkClient/src/main/java/org/mcservernetwork/client/listener/bukkit/PlayerPortalListener.java @@ -5,12 +5,13 @@ import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerPortalEvent; +import org.bukkit.event.player.PlayerTeleportEvent; public class PlayerPortalListener implements Listener { @EventHandler public void onPortalUse(PlayerPortalEvent event) { - Bukkit.getPluginManager().callEvent(new PlayerMoveEvent(event.getPlayer(), + Bukkit.getPluginManager().callEvent(new PlayerTeleportEvent(event.getPlayer(), event.getFrom(), event.getTo())); } } diff --git a/NetworkClient/src/main/java/org/mcservernetwork/client/listener/bukkit/PlayerTeleportListener.java b/NetworkClient/src/main/java/org/mcservernetwork/client/listener/bukkit/PlayerTeleportListener.java index d4cc6dd..460da1b 100644 --- a/NetworkClient/src/main/java/org/mcservernetwork/client/listener/bukkit/PlayerTeleportListener.java +++ b/NetworkClient/src/main/java/org/mcservernetwork/client/listener/bukkit/PlayerTeleportListener.java @@ -1,16 +1,60 @@ package org.mcservernetwork.client.listener.bukkit; import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.boss.BossBar; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerTeleportEvent; +import org.mcservernetwork.client.event.PlayerTransferEvent; +import org.mcservernetwork.client.util.PlayerUtils; +import org.mcservernetwork.client.util.SectorLocationUtils; +import org.mcservernetwork.client.util.manager.PlayerTransferManager; +import org.mcservernetwork.commons.NetworkAPI; +import org.mcservernetwork.commons.net.Channel; +import org.mcservernetwork.commons.net.Sector; +import org.mcservernetwork.commons.net.packet.PacketTransfer; public class PlayerTeleportListener implements Listener { @EventHandler public void onPlayerTeleport(PlayerTeleportEvent event) { - Bukkit.getPluginManager().callEvent(new PlayerMoveEvent(event.getPlayer(), - event.getFrom(), event.getTo())); + Location location = event.getTo(); + Location fromLocation = event.getFrom(); + Player player = event.getPlayer(); + Sector in = SectorLocationUtils.getSectorIn(location); + if (in == null) + return; + + PlayerTransferEvent e = new PlayerTransferEvent(fromLocation, location, in, player); + Bukkit.getPluginManager().callEvent(e); + + if(e.isCancelled()){ + e.setCancelled(true); + return; + } + PacketTransfer packet = new PacketTransfer(); + packet.targetSectorName = in.getSectorName(); + packet.uniqueId = player.getUniqueId().toString(); + packet.info = PlayerUtils.wrap(player, location); + + PlayerTransferManager.setTransferring(player); + + BossBar bossBar = PlayerMoveListener.BOSSBARS.get(player.getUniqueId()); + if(bossBar != null){ + bossBar.removeAll(); + PlayerMoveListener.BOSSBARS.remove(player.getUniqueId()); + } + + Entity vehicle = player.getVehicle(); + + if (vehicle != null) { + vehicle.remove(); + } + event.setCancelled(true); + NetworkAPI.Net.publish(Channel.TRANSFER_REQUEST, packet); } } diff --git a/NetworkClient/src/main/java/org/mcservernetwork/client/util/PlayerUtils.java b/NetworkClient/src/main/java/org/mcservernetwork/client/util/PlayerUtils.java index 527c943..c43c319 100644 --- a/NetworkClient/src/main/java/org/mcservernetwork/client/util/PlayerUtils.java +++ b/NetworkClient/src/main/java/org/mcservernetwork/client/util/PlayerUtils.java @@ -19,6 +19,10 @@ public class PlayerUtils { public static PacketPlayerInfo wrap(Player player) { + return wrap(player, player.getLocation()); + } + + public static PacketPlayerInfo wrap(Player player, Location location) { PacketPlayerInfo info = new PacketPlayerInfo(); info.inventoryContents = BukkitSerializer.serializeItems(player.getInventory().getContents()); @@ -28,12 +32,12 @@ public static PacketPlayerInfo wrap(Player player) { info.vehicleEntityType = player.getVehicle() != null ? player.getVehicle().getType().name() : null; - info.x = player.getLocation().getBlockX(); - info.y = player.getLocation().getBlockY(); - info.z = player.getLocation().getBlockZ(); - info.yaw = player.getLocation().getYaw(); - info.pitch = player.getLocation().getPitch(); - info.world = player.getWorld().getName(); + info.x = location.getBlockX(); + info.y = location.getBlockY(); + info.z = location.getBlockZ(); + info.yaw = location.getYaw(); + info.pitch = location.getPitch(); + info.world = location.getWorld().getName(); info.allowFlight = player.getAllowFlight(); info.displayName = player.getDisplayName();