From cb9a1150ec94dc54875fc8e4da7fafeedbfecbf7 Mon Sep 17 00:00:00 2001 From: BattleDash Date: Sat, 26 Jun 2021 19:26:46 -0700 Subject: [PATCH] Fixes, remove player injections and tab removal packets. --- .../ai/commands/commands/PlayerAICommand.java | 2 +- src/main/java/net/nuggetmc/ai/npc/NPC.java | 2 +- .../java/net/nuggetmc/ai/npc/NPCManager.java | 104 +----------------- 3 files changed, 6 insertions(+), 102 deletions(-) diff --git a/src/main/java/net/nuggetmc/ai/commands/commands/PlayerAICommand.java b/src/main/java/net/nuggetmc/ai/commands/commands/PlayerAICommand.java index 8674f6e..1e59a52 100644 --- a/src/main/java/net/nuggetmc/ai/commands/commands/PlayerAICommand.java +++ b/src/main/java/net/nuggetmc/ai/commands/commands/PlayerAICommand.java @@ -35,7 +35,7 @@ public class PlayerAICommand extends CommandInstance { } @Command(name = "create", desc = "Create bots.", usage = " [skin]") - public void createBotCommand(@Sender Player sender, String name, @OptArg() String skin) { + public void createBotCommand(@Sender Player sender, String name, @OptArg("Technoblade") String skin) { NPC.createNPC(name, sender.getLocation(), skin.isEmpty() ? name : skin); } diff --git a/src/main/java/net/nuggetmc/ai/npc/NPC.java b/src/main/java/net/nuggetmc/ai/npc/NPC.java index f614979..79426f8 100644 --- a/src/main/java/net/nuggetmc/ai/npc/NPC.java +++ b/src/main/java/net/nuggetmc/ai/npc/NPC.java @@ -83,7 +83,7 @@ public class NPC extends EntityPlayer { connection.sendPacket(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER, this)); connection.sendPacket(new PacketPlayOutNamedEntitySpawn(this)); connection.sendPacket(new PacketPlayOutEntityMetadata(this.getId(), this.getDataWatcher(), true)); - connection.sendPacket(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.REMOVE_PLAYER, this)); + //connection.sendPacket(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.REMOVE_PLAYER, this)); PacketPlayOutEntityHeadRotation rotationPacket = new PacketPlayOutEntityHeadRotation(this, (byte) ((this.yaw * 256f) / 360f)); diff --git a/src/main/java/net/nuggetmc/ai/npc/NPCManager.java b/src/main/java/net/nuggetmc/ai/npc/NPCManager.java index 4704381..85c226a 100644 --- a/src/main/java/net/nuggetmc/ai/npc/NPCManager.java +++ b/src/main/java/net/nuggetmc/ai/npc/NPCManager.java @@ -1,20 +1,13 @@ package net.nuggetmc.ai.npc; -import io.netty.channel.*; -import net.minecraft.server.v1_16_R3.PacketPlayOutEntityMetadata; -import net.minecraft.server.v1_16_R3.PacketPlayOutNamedEntitySpawn; -import net.minecraft.server.v1_16_R3.PacketPlayOutPlayerInfo; import net.minecraft.server.v1_16_R3.PlayerConnection; import net.nuggetmc.ai.PlayerAI; import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v1_16_R3.entity.CraftPlayer; -import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import java.lang.reflect.Field; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -22,7 +15,7 @@ import java.util.Set; public class NPCManager implements Listener { - private PlayerAI plugin; + private final PlayerAI plugin; private final Set npcs = new HashSet<>(); private final Map npcConnections = new HashMap<>(); @@ -34,13 +27,13 @@ public class NPCManager implements Listener { public void add(NPC npc) { npcs.add(npc); - Bukkit.getScheduler().runTaskLater(PlayerAI.getInstance(), () -> { + Bukkit.getScheduler().runTaskLater(plugin, () -> { npcConnections.put(npc.getId(), npc); }, 10); } - public NPCManager(PlayerAI instance) { - plugin = instance; + public NPCManager(PlayerAI plugin) { + this.plugin = plugin; } public void reset() { @@ -59,95 +52,6 @@ public class NPCManager implements Listener { for (NPC npc : npcs) { npc.render(connection, true); } - - injectPlayer(event.getPlayer()); } - public void connectAll() { - for (Player player : Bukkit.getOnlinePlayers()) { - injectPlayer(player); - } - } - - @EventHandler - public void onQuit(PlayerQuitEvent event) { - removePlayer(event.getPlayer()); - } - - public void disconnectAll() { - for (Player player : Bukkit.getOnlinePlayers()) { - removePlayer(player); - } - } - - private void injectPlayer(Player player) { - ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() { - - @Override - public void channelRead(ChannelHandlerContext channelHandlerContext, Object packet) throws Exception { - super.channelRead(channelHandlerContext, packet); - } - - @Override - public void write(ChannelHandlerContext channelHandlerContext, Object packet, ChannelPromise channelPromise) throws Exception { - if (packet instanceof PacketPlayOutNamedEntitySpawn) { - renderNPC(player, (PacketPlayOutNamedEntitySpawn) packet); - } - - super.write(channelHandlerContext, packet, channelPromise); - } - }; - - ChannelPipeline pipeline = ((CraftPlayer) player).getHandle().playerConnection.networkManager.channel.pipeline(); - - try { - pipeline.addBefore("packet_handler", player.getName(), channelDuplexHandler); - } catch (IllegalArgumentException ignore) { } - } - - private void renderNPC(Player player, PacketPlayOutNamedEntitySpawn packet) { - PlayerConnection connection = ((CraftPlayer) player).getHandle().playerConnection; - Field field; - - try { - field = packet.getClass().getDeclaredField("a"); - } catch (NoSuchFieldException e) { - return; - } - - field.setAccessible(true); - - Object obj; - - try { - obj = field.get(packet); - } catch (IllegalAccessException e) { - return; - } - - if (!(obj instanceof Integer)) return; - int n = (int) obj; - - NPC npc = npcConnections.get(n); - if (npc == null) return; - - connection.sendPacket(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER, npc)); - connection.sendPacket(new PacketPlayOutEntityMetadata(npc.getId(), npc.getDataWatcher(), true)); - - PacketPlayOutPlayerInfo noTabPacket = new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.REMOVE_PLAYER, npc); - - Bukkit.getScheduler().runTaskLater(plugin, () -> { - if (!connection.isDisconnected()) { - connection.sendPacket(noTabPacket); - } - }, 5); - } - - public void removePlayer(Player player) { - Channel channel = ((CraftPlayer) player).getHandle().playerConnection.networkManager.channel; - channel.eventLoop().submit(() -> { - channel.pipeline().remove(player.getName()); - return null; - }); - } }