From 519c861139e2b92573b74ba40c982ea8dee37d54 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Sat, 10 May 2025 20:16:01 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84entityview=E4=B8=BA=E5=AE=9E?= =?UTF-8?q?=E4=BD=93=E5=A4=84=E7=90=86=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../furniture/BukkitFurnitureManager.java | 5 +- .../plugin/command/feature/TestCommand.java | 11 +- .../plugin/network/BukkitNetworkManager.java | 9 +- .../plugin/network/PacketConsumers.java | 176 +++--------------- .../handler/ArmorStandPacketHandler.java | 62 ++++++ .../handler/BlockDisplayPacketHandler.java | 76 ++++++++ .../handler/CustomTridentPacketHandler.java} | 29 +-- .../handler/FurniturePacketHandler.java | 20 ++ .../handler/TextDisplayPacketHandler.java | 59 ++++++ .../plugin/user/BukkitServerPlayer.java | 34 +--- .../craftengine/bukkit/util/Reflections.java | 2 + .../plugin/network/ByteBufPacketEvent.java | 30 +-- .../plugin/network/EntityPacketHandler.java | 13 ++ .../core}/plugin/network/NMSPacketEvent.java | 2 +- .../core/plugin/network/NetWorkUser.java | 10 +- 15 files changed, 283 insertions(+), 255 deletions(-) create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ArmorStandPacketHandler.java create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/BlockDisplayPacketHandler.java rename bukkit/src/main/java/net/momirealms/craftengine/bukkit/{util/CustomTridentUtils.java => plugin/network/handler/CustomTridentPacketHandler.java} (86%) create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/FurniturePacketHandler.java create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/TextDisplayPacketHandler.java rename {bukkit/src/main/java/net/momirealms/craftengine/bukkit => core/src/main/java/net/momirealms/craftengine/core}/plugin/network/ByteBufPacketEvent.java (53%) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/network/EntityPacketHandler.java rename {bukkit/src/main/java/net/momirealms/craftengine/bukkit => core/src/main/java/net/momirealms/craftengine/core}/plugin/network/NMSPacketEvent.java (95%) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java index 4b79032ed..e2d204063 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java @@ -4,6 +4,7 @@ import net.momirealms.craftengine.bukkit.entity.furniture.hitbox.InteractionHitB import net.momirealms.craftengine.bukkit.nms.CollisionEntity; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.plugin.network.handler.FurniturePacketHandler; import net.momirealms.craftengine.bukkit.util.EntityUtils; import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.core.entity.furniture.*; @@ -301,14 +302,14 @@ public class BukkitFurnitureManager extends AbstractFurnitureManager { LoadedFurniture furniture = addNewFurniture(display, customFurniture, getAnchorType(display, customFurniture)); furniture.initializeColliders(); for (Player player : display.getTrackedPlayers()) { - this.plugin.adapt(player).furnitureView().computeIfAbsent(furniture.baseEntityId(), k -> new ArrayList<>()).addAll(furniture.fakeEntityIds()); + this.plugin.adapt(player).entityPacketHandlers().computeIfAbsent(furniture.baseEntityId(), k -> new FurniturePacketHandler(furniture.fakeEntityIds())); this.plugin.networkManager().sendPacket(player, furniture.spawnPacket(player)); } } } else { LoadedFurniture furniture = addNewFurniture(display, customFurniture, getAnchorType(display, customFurniture)); for (Player player : display.getTrackedPlayers()) { - this.plugin.adapt(player).furnitureView().computeIfAbsent(furniture.baseEntityId(), k -> new ArrayList<>()).addAll(furniture.fakeEntityIds()); + this.plugin.adapt(player).entityPacketHandlers().computeIfAbsent(furniture.baseEntityId(), k -> new FurniturePacketHandler(furniture.fakeEntityIds())); this.plugin.networkManager().sendPacket(player, furniture.spawnPacket(player)); } if (preventChange) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java index d9a512893..2dc46a53d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java @@ -1,9 +1,7 @@ package net.momirealms.craftengine.bukkit.plugin.command.feature; import net.momirealms.craftengine.bukkit.item.BukkitItemManager; -import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; -import net.momirealms.craftengine.bukkit.util.CustomTridentUtils; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; @@ -12,22 +10,17 @@ import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import org.bukkit.entity.Trident; import org.bukkit.inventory.ItemStack; -import org.bukkit.persistence.PersistentDataContainer; -import org.bukkit.persistence.PersistentDataType; import org.checkerframework.checker.nullness.qual.NonNull; import org.incendo.cloud.Command; import org.incendo.cloud.bukkit.parser.NamespacedKeyParser; import org.incendo.cloud.context.CommandContext; import org.incendo.cloud.context.CommandInput; -import org.incendo.cloud.parser.standard.*; +import org.incendo.cloud.parser.standard.ByteParser; +import org.incendo.cloud.parser.standard.StringParser; import org.incendo.cloud.suggestion.Suggestion; import org.incendo.cloud.suggestion.SuggestionProvider; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; import java.util.Optional; import java.util.concurrent.CompletableFuture; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java index 95bca0475..cf568a561 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java @@ -14,9 +14,7 @@ import net.momirealms.craftengine.bukkit.plugin.network.id.PacketIds1_20_5; import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.core.plugin.CraftEngine; -import net.momirealms.craftengine.core.plugin.network.ConnectionState; -import net.momirealms.craftengine.core.plugin.network.NetWorkUser; -import net.momirealms.craftengine.core.plugin.network.NetworkManager; +import net.momirealms.craftengine.core.plugin.network.*; import net.momirealms.craftengine.core.util.*; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -152,7 +150,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes registerNMSPacketConsumer(PacketConsumers.LOGIN_ACKNOWLEDGED, Reflections.clazz$ServerboundLoginAcknowledgedPacket); registerNMSPacketConsumer(PacketConsumers.RESOURCE_PACK_RESPONSE, Reflections.clazz$ServerboundResourcePackPacket); registerNMSPacketConsumer(PacketConsumers.ENTITY_EVENT, Reflections.clazz$ClientboundEntityEventPacket); - registerNMSPacketConsumer(PacketConsumers.MOVE_ENTITY_ALL, Reflections.clazz$ClientboundMoveEntityPacket$PosRot); + registerNMSPacketConsumer(PacketConsumers.MOVE_AND_ROTATE_ENTITY, Reflections.clazz$ClientboundMoveEntityPacket$PosRot); registerByteBufPacketConsumer(PacketConsumers.LEVEL_CHUNK_WITH_LIGHT, this.packetIds.clientboundLevelChunkWithLightPacket()); registerByteBufPacketConsumer(PacketConsumers.SECTION_BLOCK_UPDATE, this.packetIds.clientboundSectionBlocksUpdatePacket()); registerByteBufPacketConsumer(PacketConsumers.BLOCK_UPDATE, this.packetIds.clientboundBlockUpdatePacket()); @@ -549,7 +547,8 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes FriendlyByteBuf buf = new FriendlyByteBuf(buffer); int preProcessIndex = buf.readerIndex(); int packetId = buf.readVarInt(); - ByteBufPacketEvent event = new ByteBufPacketEvent(packetId, buf); + int preIndex = buf.readerIndex(); + ByteBufPacketEvent event = new ByteBufPacketEvent(packetId, buf, preIndex); BukkitNetworkManager.this.handleByteBufPacket(this.player, event); if (event.isCancelled()) { buf.clear(); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java index 183b20b31..7aae1ac37 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java @@ -17,6 +17,10 @@ import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.pack.BukkitPackManager; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.injector.BukkitInjector; +import net.momirealms.craftengine.bukkit.plugin.network.handler.ArmorStandPacketHandler; +import net.momirealms.craftengine.bukkit.plugin.network.handler.BlockDisplayPacketHandler; +import net.momirealms.craftengine.bukkit.plugin.network.handler.FurniturePacketHandler; +import net.momirealms.craftengine.bukkit.plugin.network.handler.TextDisplayPacketHandler; import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; import net.momirealms.craftengine.bukkit.util.*; import net.momirealms.craftengine.core.block.ImmutableBlockState; @@ -31,11 +35,7 @@ import net.momirealms.craftengine.core.pack.host.ResourcePackDownloadData; import net.momirealms.craftengine.core.pack.host.ResourcePackHost; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.config.Config; -import net.momirealms.craftengine.core.plugin.network.ConnectionState; -import net.momirealms.craftengine.core.plugin.network.NetWorkUser; -import net.momirealms.craftengine.core.plugin.network.NetworkManager; -import net.momirealms.craftengine.core.plugin.network.ProtocolVersion; -import net.momirealms.craftengine.core.plugin.scheduler.SchedulerTask; +import net.momirealms.craftengine.core.plugin.network.*; import net.momirealms.craftengine.core.util.*; import net.momirealms.craftengine.core.world.BlockHitResult; import net.momirealms.craftengine.core.world.BlockPos; @@ -421,7 +421,8 @@ public class PacketConsumers { return; } EnumSet> enums = FastNMS.INSTANCE.field$ClientboundPlayerInfoUpdatePacket$actions(packet); - outer: { + outer: + { for (Object entry : enums) { if (entry == Reflections.instance$ClientboundPlayerInfoUpdatePacket$Action$UPDATE_DISPLAY_NAME) { break outer; @@ -1578,9 +1579,11 @@ public class PacketConsumers { buf.writeShort(za); } } else if (type == Reflections.instance$EntityType$BLOCK_DISPLAY$registryId) { - user.entityView().put(id, Reflections.instance$EntityType$BLOCK_DISPLAY); + user.entityPacketHandlers().put(id, BlockDisplayPacketHandler.INSTANCE); } else if (type == Reflections.instance$EntityType$TEXT_DISPLAY$registryId) { - user.entityView().put(id, Reflections.instance$EntityType$TEXT_DISPLAY); + user.entityPacketHandlers().put(id, TextDisplayPacketHandler.INSTANCE); + } else if (type == Reflections.instance$EntityType$ARMOR_STAND$registryId) { + user.entityPacketHandlers().put(id, ArmorStandPacketHandler.INSTANCE); } } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundAddEntityPacket", e); @@ -1595,7 +1598,7 @@ public class PacketConsumers { int entityId = FastNMS.INSTANCE.field$ClientboundAddEntityPacket$entityId(packet); LoadedFurniture furniture = BukkitFurnitureManager.instance().loadedFurnitureByRealEntityId(entityId); if (furniture != null) { - user.furnitureView().computeIfAbsent(furniture.baseEntityId(), k -> new ArrayList<>()).addAll(furniture.fakeEntityIds()); + user.entityPacketHandlers().computeIfAbsent(entityId, k -> new FurniturePacketHandler(furniture.fakeEntityIds())); user.sendPacket(furniture.spawnPacket((Player) user.platformPlayer()), false); if (Config.hideBaseEntity() && !furniture.hasExternalModel()) { event.setCancelled(true); @@ -1608,8 +1611,6 @@ public class PacketConsumers { if (furniture != null) { event.setCancelled(true); } - } else if (entityType == Reflections.instance$EntityType$TRIDENT) { - CustomTridentUtils.handleCustomTrident(user, event, packet); } } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundAddEntityPacket", e); @@ -1620,10 +1621,6 @@ public class PacketConsumers { public static final TriConsumer SYNC_ENTITY_POSITION = (user, event, packet) -> { try { int entityId = FastNMS.INSTANCE.method$ClientboundEntityPositionSyncPacket$id(packet); - if (user.tridentView().containsKey(entityId)) { - event.replacePacket(CustomTridentUtils.buildCustomTridentPositionSync(packet, entityId)); - return; - } if (BukkitFurnitureManager.instance().isFurnitureRealEntity(entityId)) { event.setCancelled(true); } @@ -1650,17 +1647,9 @@ public class PacketConsumers { IntList intList = buf.readIntIdList(); for (int i = 0, size = intList.size(); i < size; i++) { int entityId = intList.getInt(i); - user.entityView().remove(entityId); - List entities = user.furnitureView().remove(entityId); - SchedulerTask task = user.tridentTaskView().remove(entityId); - if (task != null) { - task.cancel(); - } - user.tridentView().remove(entityId); - if (entities == null) continue; - for (int subEntityId : entities) { + EntityPacketHandler handler = user.entityPacketHandlers().remove(entityId); + if (handler != null && handler.handleEntitiesRemove(intList)) { isChange = true; - intList.add(subEntityId); } } if (isChange) { @@ -2012,131 +2001,11 @@ public class PacketConsumers { try { FriendlyByteBuf buf = event.getBuffer(); int id = buf.readVarInt(); - if (user.tridentView().containsKey(id)) { - List packedItems = FastNMS.INSTANCE.method$ClientboundSetEntityDataPacket$unpack(buf); - List newPackedItems = CustomTridentUtils.buildCustomTridentSetEntityDataPacket(user, packedItems, id); - event.setChanged(true); - buf.clear(); - buf.writeVarInt(event.packetID()); - buf.writeVarInt(id); - FastNMS.INSTANCE.method$ClientboundSetEntityDataPacket$pack(newPackedItems, buf); - return; + EntityPacketHandler handler = user.entityPacketHandlers().get(id); + if (handler != null) { + handler.handleSetEntityData(user, event); } - Object entityType = user.entityView().get(id); - if (entityType == Reflections.instance$EntityType$BLOCK_DISPLAY) { - boolean isChanged = false; - List packedItems = FastNMS.INSTANCE.method$ClientboundSetEntityDataPacket$unpack(buf); - for (int i = 0; i < packedItems.size(); i++) { - Object packedItem = packedItems.get(i); - int entityDataId = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$id(packedItem); - if (entityDataId == EntityDataUtils.BLOCK_STATE_DATA_ID) { - Object blockState = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$value(packedItem); - int stateId = BlockStateUtils.blockStateToId(blockState); - int newStateId; - if (!user.clientModEnabled()) { - newStateId = remap(stateId); - } else { - newStateId = remapMOD(stateId); - } - Object serializer = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$serializer(packedItem); - packedItems.set(i, FastNMS.INSTANCE.constructor$SynchedEntityData$DataValue( - entityDataId, serializer, BlockStateUtils.idToBlockState(newStateId) - )); - isChanged = true; - } else if (Config.interceptEntityName() && entityDataId == EntityDataUtils.CUSTOM_NAME_DATA_ID) { - Optional optionalTextComponent = (Optional) FastNMS.INSTANCE.field$SynchedEntityData$DataValue$value(packedItem); - if (optionalTextComponent.isPresent()) { - Object textComponent = optionalTextComponent.get(); - String json = ComponentUtils.minecraftToJson(textComponent); - Map tokens = CraftEngine.instance().fontManager().matchTags(json); - if (!tokens.isEmpty()) { - Component component = AdventureHelper.jsonToComponent(json); - for (Map.Entry token : tokens.entrySet()) { - component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); - } - Object serializer = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$serializer(packedItem); - packedItems.set(i, FastNMS.INSTANCE.constructor$SynchedEntityData$DataValue( - entityDataId, serializer, Optional.of(ComponentUtils.adventureToMinecraft(component)) - )); - isChanged = true; - } - } - } - } - if (isChanged) { - event.setChanged(true); - buf.clear(); - buf.writeVarInt(event.packetID()); - buf.writeVarInt(id); - FastNMS.INSTANCE.method$ClientboundSetEntityDataPacket$pack(packedItems, buf); - } - } else if (entityType == Reflections.instance$EntityType$TEXT_DISPLAY) { - if (Config.interceptTextDisplay()) { - boolean isChanged = false; - List packedItems = FastNMS.INSTANCE.method$ClientboundSetEntityDataPacket$unpack(buf); - for (int i = 0; i < packedItems.size(); i++) { - Object packedItem = packedItems.get(i); - int entityDataId = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$id(packedItem); - if (entityDataId == EntityDataUtils.TEXT_DATA_ID) { - Object textComponent = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$value(packedItem); - if (textComponent == Reflections.instance$Component$empty) break; - String json = ComponentUtils.minecraftToJson(textComponent); - Map tokens = CraftEngine.instance().fontManager().matchTags(json); - if (!tokens.isEmpty()) { - Component component = AdventureHelper.jsonToComponent(json); - for (Map.Entry token : tokens.entrySet()) { - component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); - } - Object serializer = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$serializer(packedItem); - packedItems.set(i, FastNMS.INSTANCE.constructor$SynchedEntityData$DataValue(entityDataId, serializer, ComponentUtils.adventureToMinecraft(component))); - isChanged = true; - break; - } - } - } - if (isChanged) { - event.setChanged(true); - buf.clear(); - buf.writeVarInt(event.packetID()); - buf.writeVarInt(id); - FastNMS.INSTANCE.method$ClientboundSetEntityDataPacket$pack(packedItems, buf); - } - } - } else if (entityType == Reflections.instance$EntityType$ARMOR_STAND) { - if (Config.interceptArmorStand()) { - boolean isChanged = false; - List packedItems = FastNMS.INSTANCE.method$ClientboundSetEntityDataPacket$unpack(buf); - for (int i = 0; i < packedItems.size(); i++) { - Object packedItem = packedItems.get(i); - int entityDataId = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$id(packedItem); - if (entityDataId == EntityDataUtils.CUSTOM_NAME_DATA_ID) { - Optional optionalTextComponent = (Optional) FastNMS.INSTANCE.field$SynchedEntityData$DataValue$value(packedItem); - if (optionalTextComponent.isPresent()) { - Object textComponent = optionalTextComponent.get(); - String json = ComponentUtils.minecraftToJson(textComponent); - Map tokens = CraftEngine.instance().fontManager().matchTags(json); - if (!tokens.isEmpty()) { - Component component = AdventureHelper.jsonToComponent(json); - for (Map.Entry token : tokens.entrySet()) { - component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); - } - Object serializer = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$serializer(packedItem); - packedItems.set(i, FastNMS.INSTANCE.constructor$SynchedEntityData$DataValue(entityDataId, serializer, Optional.of(ComponentUtils.adventureToMinecraft(component)))); - isChanged = true; - break; - } - } - } - } - if (isChanged) { - event.setChanged(true); - buf.clear(); - buf.writeVarInt(event.packetID()); - buf.writeVarInt(id); - FastNMS.INSTANCE.method$ClientboundSetEntityDataPacket$pack(packedItems, buf); - } - } - } else if (Config.interceptEntityName()) { + if (Config.interceptEntityName()) { boolean isChanged = false; List packedItems = FastNMS.INSTANCE.method$ClientboundSetEntityDataPacket$unpack(buf); for (int i = 0; i < packedItems.size(); i++) { @@ -2187,7 +2056,8 @@ public class PacketConsumers { if (hasDisplay) { displayName = buf.readNbt(false); } - outside : if (displayName != null) { + outside: + if (displayName != null) { Map tokens = CraftEngine.instance().fontManager().matchTags(displayName.getAsString()); if (tokens.isEmpty()) break outside; Component component = AdventureHelper.tagToComponent(displayName); @@ -2341,12 +2211,10 @@ public class PacketConsumers { } }; - public static final TriConsumer MOVE_ENTITY_ALL = (user, event, packet) -> { + public static final TriConsumer MOVE_AND_ROTATE_ENTITY = (user, event, packet) -> { try { int entityId = BukkitInjector.internalFieldAccessor().field$ClientboundMoveEntityPacket$entityId(packet); - if (user.tridentView().containsKey(entityId)) { - event.replacePacket(CustomTridentUtils.buildCustomTridentMove(packet, entityId)); - } + } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundMoveEntityPacket$PosRot", e); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ArmorStandPacketHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ArmorStandPacketHandler.java new file mode 100644 index 000000000..769363ce5 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ArmorStandPacketHandler.java @@ -0,0 +1,62 @@ +package net.momirealms.craftengine.bukkit.plugin.network.handler; + +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.bukkit.nms.FastNMS; +import net.momirealms.craftengine.bukkit.util.ComponentUtils; +import net.momirealms.craftengine.bukkit.util.EntityDataUtils; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.config.Config; +import net.momirealms.craftengine.core.plugin.network.ByteBufPacketEvent; +import net.momirealms.craftengine.core.plugin.network.EntityPacketHandler; +import net.momirealms.craftengine.core.plugin.network.NetWorkUser; +import net.momirealms.craftengine.core.util.AdventureHelper; +import net.momirealms.craftengine.core.util.FriendlyByteBuf; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public class ArmorStandPacketHandler implements EntityPacketHandler { + public static final ArmorStandPacketHandler INSTANCE = new ArmorStandPacketHandler(); + + @Override + public void handleSetEntityData(NetWorkUser user, ByteBufPacketEvent event) { + if (!Config.interceptArmorStand()) { + return; + } + FriendlyByteBuf buf = event.getBuffer(); + int id = buf.readVarInt(); + boolean isChanged = false; + List packedItems = FastNMS.INSTANCE.method$ClientboundSetEntityDataPacket$unpack(buf); + for (int i = 0; i < packedItems.size(); i++) { + Object packedItem = packedItems.get(i); + int entityDataId = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$id(packedItem); + if (entityDataId == EntityDataUtils.CUSTOM_NAME_DATA_ID) { + @SuppressWarnings("unchecked") + Optional optionalTextComponent = (Optional) FastNMS.INSTANCE.field$SynchedEntityData$DataValue$value(packedItem); + if (optionalTextComponent.isPresent()) { + Object textComponent = optionalTextComponent.get(); + String json = ComponentUtils.minecraftToJson(textComponent); + Map tokens = CraftEngine.instance().fontManager().matchTags(json); + if (!tokens.isEmpty()) { + Component component = AdventureHelper.jsonToComponent(json); + for (Map.Entry token : tokens.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); + } + Object serializer = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$serializer(packedItem); + packedItems.set(i, FastNMS.INSTANCE.constructor$SynchedEntityData$DataValue(entityDataId, serializer, Optional.of(ComponentUtils.adventureToMinecraft(component)))); + isChanged = true; + break; + } + } + } + } + if (isChanged) { + event.setChanged(true); + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeVarInt(id); + FastNMS.INSTANCE.method$ClientboundSetEntityDataPacket$pack(packedItems, buf); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/BlockDisplayPacketHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/BlockDisplayPacketHandler.java new file mode 100644 index 000000000..8ed3f8f7b --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/BlockDisplayPacketHandler.java @@ -0,0 +1,76 @@ +package net.momirealms.craftengine.bukkit.plugin.network.handler; + +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.bukkit.nms.FastNMS; +import net.momirealms.craftengine.bukkit.plugin.network.PacketConsumers; +import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.bukkit.util.ComponentUtils; +import net.momirealms.craftengine.bukkit.util.EntityDataUtils; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.config.Config; +import net.momirealms.craftengine.core.plugin.network.ByteBufPacketEvent; +import net.momirealms.craftengine.core.plugin.network.EntityPacketHandler; +import net.momirealms.craftengine.core.plugin.network.NetWorkUser; +import net.momirealms.craftengine.core.util.AdventureHelper; +import net.momirealms.craftengine.core.util.FriendlyByteBuf; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public class BlockDisplayPacketHandler implements EntityPacketHandler { + public static final BlockDisplayPacketHandler INSTANCE = new BlockDisplayPacketHandler(); + + @Override + public void handleSetEntityData(NetWorkUser user, ByteBufPacketEvent event) { + FriendlyByteBuf buf = event.getBuffer(); + int id = buf.readVarInt(); + boolean isChanged = false; + List packedItems = FastNMS.INSTANCE.method$ClientboundSetEntityDataPacket$unpack(buf); + for (int i = 0; i < packedItems.size(); i++) { + Object packedItem = packedItems.get(i); + int entityDataId = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$id(packedItem); + if (entityDataId == EntityDataUtils.BLOCK_STATE_DATA_ID) { + Object blockState = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$value(packedItem); + int stateId = BlockStateUtils.blockStateToId(blockState); + int newStateId; + if (!user.clientModEnabled()) { + newStateId = PacketConsumers.remap(stateId); + } else { + newStateId = PacketConsumers.remapMOD(stateId); + } + Object serializer = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$serializer(packedItem); + packedItems.set(i, FastNMS.INSTANCE.constructor$SynchedEntityData$DataValue( + entityDataId, serializer, BlockStateUtils.idToBlockState(newStateId) + )); + isChanged = true; + } else if (Config.interceptEntityName() && entityDataId == EntityDataUtils.CUSTOM_NAME_DATA_ID) { + @SuppressWarnings("unchecked") + Optional optionalTextComponent = (Optional) FastNMS.INSTANCE.field$SynchedEntityData$DataValue$value(packedItem); + if (optionalTextComponent.isPresent()) { + Object textComponent = optionalTextComponent.get(); + String json = ComponentUtils.minecraftToJson(textComponent); + Map tokens = CraftEngine.instance().fontManager().matchTags(json); + if (!tokens.isEmpty()) { + Component component = AdventureHelper.jsonToComponent(json); + for (Map.Entry token : tokens.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); + } + Object serializer = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$serializer(packedItem); + packedItems.set(i, FastNMS.INSTANCE.constructor$SynchedEntityData$DataValue( + entityDataId, serializer, Optional.of(ComponentUtils.adventureToMinecraft(component)) + )); + isChanged = true; + } + } + } + } + if (isChanged) { + event.setChanged(true); + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeVarInt(id); + FastNMS.INSTANCE.method$ClientboundSetEntityDataPacket$pack(packedItems, buf); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/CustomTridentUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/CustomTridentPacketHandler.java similarity index 86% rename from bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/CustomTridentUtils.java rename to bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/CustomTridentPacketHandler.java index 7f87849de..487fa4152 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/CustomTridentUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/CustomTridentPacketHandler.java @@ -1,16 +1,15 @@ -package net.momirealms.craftengine.bukkit.util; +package net.momirealms.craftengine.bukkit.plugin.network.handler; import net.momirealms.craftengine.bukkit.entity.data.ItemDisplayEntityData; import net.momirealms.craftengine.bukkit.item.BukkitItemManager; import net.momirealms.craftengine.bukkit.nms.FastNMS; -import net.momirealms.craftengine.bukkit.plugin.network.NMSPacketEvent; +import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.core.entity.CustomTrident; import net.momirealms.craftengine.core.item.CustomItem; import net.momirealms.craftengine.core.item.Enchantment; import net.momirealms.craftengine.core.item.Item; -import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.network.NMSPacketEvent; import net.momirealms.craftengine.core.plugin.network.NetWorkUser; -import net.momirealms.craftengine.core.plugin.scheduler.SchedulerTask; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MCUtils; import net.momirealms.craftengine.core.util.VersionHelper; @@ -25,9 +24,10 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.UUID; -import java.util.concurrent.TimeUnit; -public class CustomTridentUtils { +public final class CustomTridentPacketHandler { + + private CustomTridentPacketHandler() {} public static void handleCustomTrident(NetWorkUser user, NMSPacketEvent event, Object packet) { int entityId = FastNMS.INSTANCE.field$ClientboundAddEntityPacket$entityId(packet); @@ -40,19 +40,10 @@ public class CustomTridentUtils { if (notCustomTrident(trident)) return; Object newPacket = modifyCustomTridentPacket(packet, entityId); List itemDisplayValues = buildEntityDataValues(trident); - user.tridentView().put(entityId, itemDisplayValues); user.sendPacket(newPacket, true); user.sendPacket(FastNMS.INSTANCE.constructor$ClientboundSetEntityDataPacket(entityId, itemDisplayValues), true); event.setCancelled(true); if (serverEntity != null) { - // 这里直接暴力更新 - SchedulerTask task = CraftEngine.instance().scheduler().asyncRepeating(() -> { - FastNMS.INSTANCE.method$ServerEntity$sendChanges(serverEntity); - if (canSpawnParticle(nmsEntity)) { - world.spawnParticle(ParticleUtils.getParticle("BUBBLE"), trident.getLocation(), 1, 0, 0, 0, 0); - } - }, 0, 5, TimeUnit.MILLISECONDS); - user.tridentTaskView().put(entityId, task); } } @@ -150,14 +141,6 @@ public class CustomTridentUtils { newPackedItems.add(packedItem); } } - List newData = user.tridentView().getOrDefault(entityId, List.of()); - if (newData.isEmpty()) { - Trident trident = getTridentById(user, entityId); - if (notCustomTrident(trident)) return newPackedItems; - newData = buildEntityDataValues(trident); - user.tridentView().put(entityId, newData); - } - newPackedItems.addAll(newData); return newPackedItems; } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/FurniturePacketHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/FurniturePacketHandler.java new file mode 100644 index 000000000..70c0d6778 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/FurniturePacketHandler.java @@ -0,0 +1,20 @@ +package net.momirealms.craftengine.bukkit.plugin.network.handler; + +import it.unimi.dsi.fastutil.ints.IntList; +import net.momirealms.craftengine.core.plugin.network.EntityPacketHandler; + +import java.util.List; + +public class FurniturePacketHandler implements EntityPacketHandler { + private final List fakeEntities; + + public FurniturePacketHandler(List fakeEntities) { + this.fakeEntities = fakeEntities; + } + + @Override + public boolean handleEntitiesRemove(IntList entityIds) { + entityIds.addAll(this.fakeEntities); + return true; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/TextDisplayPacketHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/TextDisplayPacketHandler.java new file mode 100644 index 000000000..35eb26ddd --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/TextDisplayPacketHandler.java @@ -0,0 +1,59 @@ +package net.momirealms.craftengine.bukkit.plugin.network.handler; + +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.bukkit.nms.FastNMS; +import net.momirealms.craftengine.bukkit.util.ComponentUtils; +import net.momirealms.craftengine.bukkit.util.EntityDataUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.config.Config; +import net.momirealms.craftengine.core.plugin.network.ByteBufPacketEvent; +import net.momirealms.craftengine.core.plugin.network.EntityPacketHandler; +import net.momirealms.craftengine.core.plugin.network.NetWorkUser; +import net.momirealms.craftengine.core.util.AdventureHelper; +import net.momirealms.craftengine.core.util.FriendlyByteBuf; + +import java.util.List; +import java.util.Map; + +public class TextDisplayPacketHandler implements EntityPacketHandler { + public static final TextDisplayPacketHandler INSTANCE = new TextDisplayPacketHandler(); + + @Override + public void handleSetEntityData(NetWorkUser user, ByteBufPacketEvent event) { + if (!Config.interceptTextDisplay()) { + return; + } + FriendlyByteBuf buf = event.getBuffer(); + int id = buf.readVarInt(); + boolean isChanged = false; + List packedItems = FastNMS.INSTANCE.method$ClientboundSetEntityDataPacket$unpack(buf); + for (int i = 0; i < packedItems.size(); i++) { + Object packedItem = packedItems.get(i); + int entityDataId = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$id(packedItem); + if (entityDataId == EntityDataUtils.TEXT_DATA_ID) { + Object textComponent = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$value(packedItem); + if (textComponent == Reflections.instance$Component$empty) break; + String json = ComponentUtils.minecraftToJson(textComponent); + Map tokens = CraftEngine.instance().fontManager().matchTags(json); + if (!tokens.isEmpty()) { + Component component = AdventureHelper.jsonToComponent(json); + for (Map.Entry token : tokens.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); + } + Object serializer = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$serializer(packedItem); + packedItems.set(i, FastNMS.INSTANCE.constructor$SynchedEntityData$DataValue(entityDataId, serializer, ComponentUtils.adventureToMinecraft(component))); + isChanged = true; + break; + } + } + } + if (isChanged) { + event.setChanged(true); + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeVarInt(id); + FastNMS.INSTANCE.method$ClientboundSetEntityDataPacket$pack(packedItems, buf); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java index a9e2d0eba..b1f33c52d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java @@ -19,8 +19,8 @@ import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.network.ConnectionState; +import net.momirealms.craftengine.core.plugin.network.EntityPacketHandler; import net.momirealms.craftengine.core.plugin.network.ProtocolVersion; -import net.momirealms.craftengine.core.plugin.scheduler.SchedulerTask; import net.momirealms.craftengine.core.util.Direction; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.VersionHelper; @@ -91,11 +91,8 @@ public class BukkitServerPlayer extends Player { // cache interaction range here private int lastUpdateInteractionRangeTick; private double cachedInteractionRange; - // for better fake furniture visual sync - private final Map> furnitureView = new ConcurrentHashMap<>(); - private final Map entityTypeView = new ConcurrentHashMap<>(); - private final Map> tridentView = new ConcurrentHashMap<>(); - private final Map addTridentPacketView = new ConcurrentHashMap<>(); + + private final Map entityTypeView = new ConcurrentHashMap<>(); public BukkitServerPlayer(BukkitCraftEngine plugin, Channel channel) { this.channel = channel; @@ -107,13 +104,6 @@ public class BukkitServerPlayer extends Player { this.serverPlayerRef = new WeakReference<>(FastNMS.INSTANCE.method$CraftPlayer$getHandle(player)); this.uuid = player.getUniqueId(); this.name = player.getName(); -// if (Reflections.method$CraftPlayer$setSimplifyContainerDesyncCheck != null) { -// try { -// Reflections.method$CraftPlayer$setSimplifyContainerDesyncCheck.invoke(player, true); -// } catch (Exception e) { -// this.plugin.logger().warn("Failed to setSimplifyContainerDesyncCheck", e); -// } -// } } @Override @@ -731,25 +721,10 @@ public class BukkitServerPlayer extends Player { } @Override - public Map> furnitureView() { - return this.furnitureView; - } - - @Override - public Map entityView() { + public Map entityPacketHandlers() { return this.entityTypeView; } - @Override - public Map> tridentView() { - return this.tridentView; - } - - @Override - public Map tridentTaskView() { - return this.addTridentPacketView; - } - public void setResendSound() { resentSoundTick = gameTicks(); } @@ -812,7 +787,6 @@ public class BukkitServerPlayer extends Player { @Override public void clearView() { this.entityTypeView.clear(); - this.furnitureView.clear(); } @Override diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java index 035a3e303..1ab0294db 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java @@ -6408,6 +6408,7 @@ public class Reflections { public static final int instance$EntityType$TEXT_DISPLAY$registryId; public static final int instance$EntityType$FALLING_BLOCK$registryId; public static final int instance$EntityType$TRIDENT$registryId; + public static final int instance$EntityType$ARMOR_STAND$registryId; static { try { @@ -6416,6 +6417,7 @@ public class Reflections { instance$EntityType$TEXT_DISPLAY$registryId = (int) Reflections.method$Registry$getId.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, instance$EntityType$TEXT_DISPLAY); instance$EntityType$FALLING_BLOCK$registryId = (int) Reflections.method$Registry$getId.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, instance$EntityType$FALLING_BLOCK); instance$EntityType$TRIDENT$registryId = (int) Reflections.method$Registry$getId.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, instance$EntityType$TRIDENT); + instance$EntityType$ARMOR_STAND$registryId = (int) Reflections.method$Registry$getId.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, instance$EntityType$ARMOR_STAND); } catch (Exception e) { throw new RuntimeException(e); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/ByteBufPacketEvent.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/ByteBufPacketEvent.java similarity index 53% rename from bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/ByteBufPacketEvent.java rename to core/src/main/java/net/momirealms/craftengine/core/plugin/network/ByteBufPacketEvent.java index 023bb5b94..585921ca0 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/ByteBufPacketEvent.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/ByteBufPacketEvent.java @@ -1,31 +1,28 @@ -package net.momirealms.craftengine.bukkit.plugin.network; +package net.momirealms.craftengine.core.plugin.network; import net.momirealms.craftengine.core.util.Cancellable; import net.momirealms.craftengine.core.util.FriendlyByteBuf; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Optional; - public class ByteBufPacketEvent implements Cancellable { private boolean cancelled; - private List delayedTasks = null; private final FriendlyByteBuf buf; private boolean changed; private final int packetID; + private final int preIndex; - public ByteBufPacketEvent(int packetID, FriendlyByteBuf buf) { + public ByteBufPacketEvent(int packetID, FriendlyByteBuf buf, int preIndex) { this.buf = buf; this.packetID = packetID; + this.preIndex = preIndex; } public int packetID() { - return packetID; + return this.packetID; } public FriendlyByteBuf getBuffer() { - return buf; + this.buf.readerIndex(this.preIndex); + return this.buf; } public void setChanged(boolean dirty) { @@ -33,18 +30,7 @@ public class ByteBufPacketEvent implements Cancellable { } public boolean changed() { - return changed; - } - - public void addDelayedTask(Runnable task) { - if (delayedTasks == null) { - delayedTasks = new ArrayList<>(); - } - delayedTasks.add(task); - } - - public List getDelayedTasks() { - return Optional.ofNullable(delayedTasks).orElse(Collections.emptyList()); + return this.changed; } @Override diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/EntityPacketHandler.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/EntityPacketHandler.java new file mode 100644 index 000000000..8a2c9e78e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/EntityPacketHandler.java @@ -0,0 +1,13 @@ +package net.momirealms.craftengine.core.plugin.network; + +import it.unimi.dsi.fastutil.ints.IntList; + +public interface EntityPacketHandler { + + default boolean handleEntitiesRemove(IntList entityIds) { + return false; + } + + default void handleSetEntityData(NetWorkUser user, ByteBufPacketEvent event) { + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/NMSPacketEvent.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NMSPacketEvent.java similarity index 95% rename from bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/NMSPacketEvent.java rename to core/src/main/java/net/momirealms/craftengine/core/plugin/network/NMSPacketEvent.java index d753f4815..e95726ddb 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/NMSPacketEvent.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NMSPacketEvent.java @@ -1,4 +1,4 @@ -package net.momirealms.craftengine.bukkit.plugin.network; +package net.momirealms.craftengine.core.plugin.network; import net.momirealms.craftengine.core.util.Cancellable; import org.jetbrains.annotations.NotNull; diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java index 177e8d12c..cf9442fee 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java @@ -2,11 +2,9 @@ package net.momirealms.craftengine.core.plugin.network; import io.netty.channel.Channel; import net.momirealms.craftengine.core.plugin.Plugin; -import net.momirealms.craftengine.core.plugin.scheduler.SchedulerTask; import net.momirealms.craftengine.core.util.Key; import org.jetbrains.annotations.ApiStatus; -import java.util.List; import java.util.Map; import java.util.UUID; @@ -43,13 +41,7 @@ public interface NetWorkUser { Object platformPlayer(); - Map> furnitureView(); - - Map entityView(); - - Map> tridentView(); - - Map tridentTaskView(); + Map entityPacketHandlers(); boolean clientModEnabled();