package me.libraryaddict.disguise.utilities.packets; import com.comphenix.protocol.PacketType; import com.comphenix.protocol.PacketType.Play.Server; import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.events.PacketListener; import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.DisguiseConfig; import me.libraryaddict.disguise.LibsDisguises; import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.utilities.DisguiseUtilities; import me.libraryaddict.disguise.utilities.packets.packetlisteners.*; import me.libraryaddict.disguise.utilities.reflection.NmsVersion; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import java.util.ArrayList; public class PacketsManager { private static PacketListener clientInteractEntityListener; private static PacketListener inventoryListener; private static boolean inventoryModifierEnabled; private static PacketListener mainListener; private static PacketListener soundsListener; private static boolean soundsListenerEnabled; private static PacketListener viewDisguisesListener; private static boolean viewDisguisesListenerEnabled; private static PacketsHandler packetsHandler; private static PacketListener destroyListener; private static PacketListener scoreboardTeamListener; public static void addPacketListeners() { // Add a client listener to cancel them interacting with uninteractable disguised entitys. // You ain't supposed to be allowed to 'interact' with a item that cannot be clicked. // Because it kicks you for hacking. clientInteractEntityListener = new PacketListenerClientInteract(LibsDisguises.getInstance()); PacketListener tabListListener = new PacketListenerTabList(LibsDisguises.getInstance()); ProtocolLibrary.getProtocolManager().addPacketListener(clientInteractEntityListener); ProtocolLibrary.getProtocolManager().addPacketListener(tabListListener); ProtocolLibrary.getProtocolManager().addPacketListener(new PacketListenerClientCustomPayload()); // Now I call this and the main listener is registered! setupMainPacketsListener(); } /** * Creates the packet listeners */ public static void init() { soundsListener = new PacketListenerSounds(LibsDisguises.getInstance()); // Self disguise (/vsd) listener viewDisguisesListener = new PacketListenerViewSelfDisguise(LibsDisguises.getInstance()); inventoryListener = new PacketListenerInventory(LibsDisguises.getInstance()); packetsHandler = new PacketsHandler(); } public static PacketsHandler getPacketsHandler() { return packetsHandler; } public static boolean isHearDisguisesEnabled() { return soundsListenerEnabled; } public static boolean isInventoryListenerEnabled() { return inventoryModifierEnabled; } public static void setInventoryListenerEnabled(boolean enabled) { if (inventoryModifierEnabled != enabled) { inventoryModifierEnabled = enabled; if (inventoryModifierEnabled) { ProtocolLibrary.getProtocolManager().addPacketListener(inventoryListener); } else { ProtocolLibrary.getProtocolManager().removePacketListener(inventoryListener); } for (Player player : Bukkit.getOnlinePlayers()) { Disguise disguise = DisguiseAPI.getDisguise(player, player); if (disguise != null) { if (viewDisguisesListenerEnabled && disguise.isSelfDisguiseVisible() && (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf())) { player.updateInventory(); } } } } } public static boolean isViewDisguisesListenerEnabled() { return viewDisguisesListenerEnabled; } public static void setHearDisguisesListener(boolean enabled) { if (soundsListenerEnabled != enabled) { soundsListenerEnabled = enabled; if (soundsListenerEnabled) { ProtocolLibrary.getProtocolManager().addPacketListener(soundsListener); } else { ProtocolLibrary.getProtocolManager().removePacketListener(soundsListener); } } } public static void setupMainPacketsListener() { if (clientInteractEntityListener != null) { if (mainListener != null) { ProtocolLibrary.getProtocolManager().removePacketListener(mainListener); } ArrayList packetsToListen = new ArrayList<>(); // Add spawn packets { packetsToListen.add(Server.NAMED_ENTITY_SPAWN); packetsToListen.add(Server.SPAWN_ENTITY_EXPERIENCE_ORB); packetsToListen.add(Server.SPAWN_ENTITY); packetsToListen.add(Server.SPAWN_ENTITY_LIVING); packetsToListen.add(Server.SPAWN_ENTITY_PAINTING); } // Add packets that always need to be enabled to ensure safety { packetsToListen.add(Server.ENTITY_METADATA); } if (DisguiseConfig.isCollectPacketsEnabled()) { packetsToListen.add(Server.COLLECT); } if (DisguiseConfig.isMiscDisguisesForLivingEnabled()) { packetsToListen.add(Server.UPDATE_ATTRIBUTES); } // Add movement packets if (DisguiseConfig.isMovementPacketsEnabled()) { packetsToListen.add(Server.ENTITY_LOOK); packetsToListen.add(Server.REL_ENTITY_MOVE_LOOK); packetsToListen.add(Server.ENTITY_HEAD_ROTATION); packetsToListen.add(Server.ENTITY_TELEPORT); packetsToListen.add(Server.REL_ENTITY_MOVE); packetsToListen.add(Server.ENTITY_VELOCITY); } // Add equipment packet if (DisguiseConfig.isEquipmentPacketsEnabled()) { packetsToListen.add(Server.ENTITY_EQUIPMENT); } // Add the packet that ensures if they are sleeping or not if (DisguiseConfig.isAnimationPacketsEnabled()) { packetsToListen.add(Server.ANIMATION); } // Add the packet that makes sure that entities with armor do not send unpickupable armor on death if (DisguiseConfig.isEntityStatusPacketsEnabled()) { packetsToListen.add(Server.ENTITY_STATUS); } mainListener = new PacketListenerMain(LibsDisguises.getInstance(), packetsToListen); destroyListener = new PacketListenerEntityDestroy(LibsDisguises.getInstance()); ProtocolLibrary.getProtocolManager().addPacketListener(mainListener); ProtocolLibrary.getProtocolManager().addPacketListener(destroyListener); if (NmsVersion.v1_13.isSupported()) { scoreboardTeamListener = new PacketListenerScoreboardTeam(); ProtocolLibrary.getProtocolManager().addPacketListener(scoreboardTeamListener); } } } public static void setViewDisguisesListener(boolean enabled) { if (viewDisguisesListenerEnabled != enabled) { viewDisguisesListenerEnabled = enabled; if (viewDisguisesListenerEnabled) { ProtocolLibrary.getProtocolManager().addPacketListener(viewDisguisesListener); } else { ProtocolLibrary.getProtocolManager().removePacketListener(viewDisguisesListener); } for (Player player : Bukkit.getOnlinePlayers()) { Disguise disguise = DisguiseAPI.getDisguise(player, player); if (disguise != null) { if (disguise.isSelfDisguiseVisible()) { if (enabled) { DisguiseUtilities.setupFakeDisguise(disguise); } else { DisguiseUtilities.removeSelfDisguise(disguise); } if (inventoryModifierEnabled && (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf())) { player.updateInventory(); } } } } } } }