public class ClientsideEntityRegister { private final TutorialPlugin main; @Getter private final Set> entities = new HashSet<>(); public ClientsideEntityRegister(TutorialPlugin main) { this.main = main; registerListener(); } public void registerEntity(ClientsideEntity entity) { entities.add(entity); for (ClientsideEntity sub : entity.getExtraEntities()) registerEntity(sub); } private void registerListener() { ProtocolManager manager = ProtocolLibrary.getProtocolManager(); manager.addPacketListener(new PacketAdapter(main, PacketType.Play.Client.USE_ENTITY) { @Override public void onPacketReceiving(PacketEvent event) { PacketContainer packet = event.getPacket(); Player player = event.getPlayer(); int entityId = packet.getIntegers().read(0); if (entityId >= 100000) entityId -= 90000; // Entity ID was 100,000 instead of 10,000 when reading, for no apparent reason. ClickData.ClickType type = ClickData.ClickType .fromType(packet.getEntityUseActions().readSafely(0)); for (ClientsideEntity entity : entities) { if (entity.getEntityId() != entityId) continue; ClickData data = new ClickData(type, player); entity.registerClick(data); return; } } }); } public void unregisterEntity(ClientsideEntity entity) { for (ClientsideEntity entity1 : entity.getExtraEntities()) { entity1.hide(); entities.remove(entity1); } entity.hide(); entities.remove(entity); } }