From 19c301fb6efe4cfeeb632caec7027a9d50c830e3 Mon Sep 17 00:00:00 2001 From: derklaro Date: Tue, 28 Jan 2025 14:30:11 +0100 Subject: [PATCH 01/10] fix: minestom metadata entry types --- .../npclib/minestom/protocol/MinestomProtocolAdapter.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/minestom/src/main/java/com/github/juliarn/npclib/minestom/protocol/MinestomProtocolAdapter.java b/minestom/src/main/java/com/github/juliarn/npclib/minestom/protocol/MinestomProtocolAdapter.java index 7bdd79a..4559c38 100644 --- a/minestom/src/main/java/com/github/juliarn/npclib/minestom/protocol/MinestomProtocolAdapter.java +++ b/minestom/src/main/java/com/github/juliarn/npclib/minestom/protocol/MinestomProtocolAdapter.java @@ -177,10 +177,10 @@ public final class MinestomProtocolAdapter implements PlatformPacketAdapter(6); - META_ENTRY_FACTORY.put(byte.class, value -> Metadata.Byte((byte) value)); - META_ENTRY_FACTORY.put(int.class, value -> Metadata.VarInt((int) value)); - META_ENTRY_FACTORY.put(float.class, value -> Metadata.Float((float) value)); - META_ENTRY_FACTORY.put(boolean.class, value -> Metadata.Boolean((boolean) value)); + META_ENTRY_FACTORY.put(Byte.class, value -> Metadata.Byte((byte) value)); + META_ENTRY_FACTORY.put(Integer.class, value -> Metadata.VarInt((int) value)); + META_ENTRY_FACTORY.put(Float.class, value -> Metadata.Float((float) value)); + META_ENTRY_FACTORY.put(Boolean.class, value -> Metadata.Boolean((boolean) value)); META_ENTRY_FACTORY.put(String.class, value -> Metadata.String((String) value)); META_ENTRY_FACTORY.put( net.minestom.server.entity.EntityPose.class, From 7aa37b8cc1708af46bdde6e6f788fe2d203483c7 Mon Sep 17 00:00:00 2001 From: derklaro Date: Tue, 28 Jan 2025 14:31:05 +0100 Subject: [PATCH 02/10] refactor: ensure metadata entry type is not primitive nor void --- .../protocol/meta/DefaultEntityMetadataFactoryBuilder.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/api/src/main/java/com/github/juliarn/npclib/api/protocol/meta/DefaultEntityMetadataFactoryBuilder.java b/api/src/main/java/com/github/juliarn/npclib/api/protocol/meta/DefaultEntityMetadataFactoryBuilder.java index c1dbce4..0b3fedc 100644 --- a/api/src/main/java/com/github/juliarn/npclib/api/protocol/meta/DefaultEntityMetadataFactoryBuilder.java +++ b/api/src/main/java/com/github/juliarn/npclib/api/protocol/meta/DefaultEntityMetadataFactoryBuilder.java @@ -58,6 +58,10 @@ final class DefaultEntityMetadataFactoryBuilder implements EntityMetadataF @Override public @NotNull EntityMetadataFactory.Builder type(@NotNull Type type) { + if (type instanceof Class && (((Class) type).isPrimitive() || type == Void.class)) { + throw new IllegalArgumentException("Entity metadata type must not be a primitive or void"); + } + this.type = Objects.requireNonNull(type, "type"); return this; } From c8a04cd8c86d9c60b2339b3b9445579c605405a4 Mon Sep 17 00:00:00 2001 From: derklaro Date: Wed, 29 Jan 2025 17:06:21 +0100 Subject: [PATCH 03/10] refactor: remove name based world comparisons in minestom impl --- .../minestom/MinestomActionController.java | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/minestom/src/main/java/com/github/juliarn/npclib/minestom/MinestomActionController.java b/minestom/src/main/java/com/github/juliarn/npclib/minestom/MinestomActionController.java index 39353f6..ddb5a2e 100644 --- a/minestom/src/main/java/com/github/juliarn/npclib/minestom/MinestomActionController.java +++ b/minestom/src/main/java/com/github/juliarn/npclib/minestom/MinestomActionController.java @@ -129,7 +129,7 @@ private void handleMove(@NotNull PlayerMoveEvent event) { for (Npc npc : this.npcTracker.trackedNpcs()) { // check if the chunk of the npc is still loaded Position pos = npc.position(); - if (!npc.world().isChunkLoaded(pos.chunkX(), pos.chunkZ())) { + if (!npc.world().equals(player.getInstance()) || !npc.world().isChunkLoaded(pos.chunkX(), pos.chunkZ())) { // if the player is tracked by the npc, stop that npc.stopTrackingPlayer(player); continue; @@ -159,37 +159,36 @@ private void handleMove(@NotNull PlayerMoveEvent event) { private void handlePlayerInstanceSpawn(@NotNull PlayerSpawnEvent event) { // ensure that we stop tracking the player on NPCs which are not in the same world as the player - String instanceId = event.getInstance().getUniqueId().toString(); + Player player = event.getPlayer(); for (Npc npc : this.npcTracker.trackedNpcs()) { - if (!npc.position().worldId().equals(instanceId)) { + if (!npc.world().equals(player.getInstance())) { // the player is no longer in the same world, stop tracking - npc.stopTrackingPlayer(event.getPlayer()); + npc.stopTrackingPlayer(player); continue; } // the player is now in the same instance as the npc, check if we should track him - double distance = MinestomUtil.distance(npc, event.getPlayer().getPosition()); + double distance = MinestomUtil.distance(npc, player.getPosition()); if (this.spawnDistance >= distance) { - npc.trackPlayer(event.getPlayer()); + npc.trackPlayer(player); } } } private void handleStartSneak(@NotNull PlayerStartSneakingEvent event) { - this.handleToggleSneak(event.getPlayer(), event.getInstance(), true); + this.handleToggleSneak(event.getPlayer(), true); } private void handleStopSneak(@NotNull PlayerStopSneakingEvent event) { - this.handleToggleSneak(event.getPlayer(), event.getInstance(), false); + this.handleToggleSneak(event.getPlayer(), false); } - private void handleToggleSneak(@NotNull Player player, @NotNull Instance instance, boolean sneakActive) { - String instanceId = instance.getUniqueId().toString(); + private void handleToggleSneak(@NotNull Player player, boolean sneakActive) { for (Npc npc : this.npcTracker.trackedNpcs()) { double distance = MinestomUtil.distance(npc, player.getPosition()); // check if we should imitate the action - if (Objects.equals(instanceId, npc.position().worldId()) + if (npc.world().equals(player.getInstance()) && npc.tracksPlayer(player) && distance <= this.imitateDistance && npc.flagValueOrDefault(Npc.SNEAK_WHEN_PLAYER_SNEAKS)) { @@ -203,12 +202,11 @@ private void handleToggleSneak(@NotNull Player player, @NotNull Instance instanc private void handleHandAnimation(@NotNull PlayerHandAnimationEvent event) { Player player = event.getPlayer(); - String instanceId = event.getInstance().getUniqueId().toString(); for (Npc npc : this.npcTracker.trackedNpcs()) { double distance = MinestomUtil.distance(npc, player.getPosition()); // check if we should imitate the action - if (Objects.equals(instanceId, npc.position().worldId()) + if (npc.world().equals(player.getInstance()) && npc.tracksPlayer(player) && distance <= this.imitateDistance && npc.flagValueOrDefault(Npc.HIT_WHEN_PLAYER_HITS)) { From 2f261506a7a41e20720b1ce92fc5f39979d92b4b Mon Sep 17 00:00:00 2001 From: derklaro Date: Wed, 29 Jan 2025 17:08:40 +0100 Subject: [PATCH 04/10] refactor: remove unnecessary use of Objects.equals --- .../github/juliarn/npclib/bukkit/BukkitActionController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bukkit/src/main/java/com/github/juliarn/npclib/bukkit/BukkitActionController.java b/bukkit/src/main/java/com/github/juliarn/npclib/bukkit/BukkitActionController.java index 82ad6e2..7164fe9 100644 --- a/bukkit/src/main/java/com/github/juliarn/npclib/bukkit/BukkitActionController.java +++ b/bukkit/src/main/java/com/github/juliarn/npclib/bukkit/BukkitActionController.java @@ -177,7 +177,7 @@ public void handleSneak(@NotNull PlayerToggleSneakEvent event) { double distance = BukkitPlatformUtil.distance(npc, player.getLocation()); // check if we should imitate the action - if (Objects.equals(player.getWorld(), npc.world()) + if (npc.world().equals(player.getWorld()) && npc.tracksPlayer(player) && distance <= this.imitateDistance && npc.flagValueOrDefault(Npc.SNEAK_WHEN_PLAYER_SNEAKS)) { @@ -197,7 +197,7 @@ public void handleLeftClick(@NotNull PlayerInteractEvent event) { double distance = BukkitPlatformUtil.distance(npc, player.getLocation()); // check if we should imitate the action - if (Objects.equals(player.getWorld(), npc.world()) + if (npc.world().equals(player.getWorld()) && npc.tracksPlayer(player) && distance <= this.imitateDistance && npc.flagValueOrDefault(Npc.HIT_WHEN_PLAYER_HITS)) { From 80c361768d6e9faca36804c13ae697cd8890310d Mon Sep 17 00:00:00 2001 From: derklaro Date: Wed, 29 Jan 2025 18:06:38 +0100 Subject: [PATCH 05/10] feat: show second skin layer of npc in tablist --- .../npclib/bukkit/protocol/PacketEventsPacketAdapter.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/bukkit/src/main/java/com/github/juliarn/npclib/bukkit/protocol/PacketEventsPacketAdapter.java b/bukkit/src/main/java/com/github/juliarn/npclib/bukkit/protocol/PacketEventsPacketAdapter.java index 6cb5451..389ed44 100644 --- a/bukkit/src/main/java/com/github/juliarn/npclib/bukkit/protocol/PacketEventsPacketAdapter.java +++ b/bukkit/src/main/java/com/github/juliarn/npclib/bukkit/protocol/PacketEventsPacketAdapter.java @@ -213,7 +213,9 @@ final class PacketEventsPacketAdapter implements PlatformPacketAdapter ADD_ACTIONS = EnumSet.of( WrapperPlayServerPlayerInfoUpdate.Action.ADD_PLAYER, + WrapperPlayServerPlayerInfoUpdate.Action.UPDATE_HAT, WrapperPlayServerPlayerInfoUpdate.Action.UPDATE_LISTED, WrapperPlayServerPlayerInfoUpdate.Action.UPDATE_LATENCY, WrapperPlayServerPlayerInfoUpdate.Action.UPDATE_GAME_MODE, From 930a8cc62be88f86f453026be00ec96c834100b7 Mon Sep 17 00:00:00 2001 From: derklaro Date: Wed, 29 Jan 2025 18:07:48 +0100 Subject: [PATCH 06/10] chore: update dependencies Also replaces the use of Instance#getUniqueId with Instance#getUuid on minestom (upcoming breaking change) --- gradle/libs.versions.toml | 6 +++--- .../juliarn/npclib/minestom/MinestomWorldAccessor.java | 2 +- .../github/juliarn/npclib/minestom/util/MinestomUtil.java | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7c7bb6d..a2de4ba 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,17 +3,17 @@ # plugins spotless = "7.0.2" nexusPublish = "2.0.0" -checkstyleTools = "10.21.1" +checkstyleTools = "10.21.2" # general gson = "2.11.0" geantyref = "1.3.16" -annotations = "26.0.1" +annotations = "26.0.2" netty = "4.1.117.Final" # platform api versions sponge = "10.0.0" -minestom = "0d47d97417" +minestom = "32735340d7" paper = "1.21.4-R0.1-SNAPSHOT" # platform extensions diff --git a/minestom/src/main/java/com/github/juliarn/npclib/minestom/MinestomWorldAccessor.java b/minestom/src/main/java/com/github/juliarn/npclib/minestom/MinestomWorldAccessor.java index 68afc95..1205d3f 100644 --- a/minestom/src/main/java/com/github/juliarn/npclib/minestom/MinestomWorldAccessor.java +++ b/minestom/src/main/java/com/github/juliarn/npclib/minestom/MinestomWorldAccessor.java @@ -43,7 +43,7 @@ private static final class UuidBasedInstanceAccessor implements PlatformWorldAcc @Override public @NotNull String extractWorldIdentifier(@NotNull Instance world) { - return world.getUniqueId().toString(); + return world.getUuid().toString(); } @Override diff --git a/minestom/src/main/java/com/github/juliarn/npclib/minestom/util/MinestomUtil.java b/minestom/src/main/java/com/github/juliarn/npclib/minestom/util/MinestomUtil.java index 2804533..9e938ca 100644 --- a/minestom/src/main/java/com/github/juliarn/npclib/minestom/util/MinestomUtil.java +++ b/minestom/src/main/java/com/github/juliarn/npclib/minestom/util/MinestomUtil.java @@ -49,6 +49,6 @@ public static double distance(@NotNull Npc npc, @NotNull Pos pos) { } public static @NotNull Position positionFromMinestom(@NotNull Pos pos, @NotNull Instance world) { - return Position.position(pos.x(), pos.y(), pos.z(), pos.yaw(), pos.pitch(), world.getUniqueId().toString()); + return Position.position(pos.x(), pos.y(), pos.z(), pos.yaw(), pos.pitch(), world.getUuid().toString()); } } From b597c54743e441035f1b54083ab2a7b3e08cbe54 Mon Sep 17 00:00:00 2001 From: Pasqual Koschmieder Date: Mon, 3 Feb 2025 12:10:36 +0100 Subject: [PATCH 07/10] feat: add fabric implementation (#138) --- .github/workflows/validate.yml | 2 +- .idea/codeStyles/Project.xml | 2 - README.md | 25 +- build.gradle.kts | 1 + checkstyle.xml | 2 +- fabric/build.gradle.kts | 70 +++ .../npclib/fabric/FabricModInitializer.java | 35 ++ .../juliarn/npclib/fabric/FabricPlatform.java | 101 +++++ .../npclib/fabric/FabricPlatformLogger.java | 64 +++ .../fabric/FabricPlatformTaskManager.java | 53 +++ .../npclib/fabric/FabricVersionAccessor.java | 85 ++++ .../npclib/fabric/FabricWorldAccessor.java | 61 +++ .../controller/FabricActionController.java | 220 ++++++++++ .../FabricActionControllerEvents.java | 161 +++++++ .../fabric/mixins/MinecraftServerMixin.java | 41 ++ .../npclib/fabric/mixins/PlayerListMixin.java | 57 +++ .../ServerGamePacketListenerImplMixin.java | 169 ++++++++ .../fabric/mixins/ServerPlayerMixin.java | 51 +++ .../protocol/ByteArrayCustomPayload.java | 43 ++ .../fabric/protocol/EntityDataFactory.java | 34 ++ .../protocol/FabricProtocolAdapter.java | 404 ++++++++++++++++++ .../npclib/fabric/util/FabricUtil.java | 74 ++++ fabric/src/main/resources/fabric.mod.json | 31 ++ .../src/main/resources/npc_lib.accesswidener | 16 + fabric/src/main/resources/npc_lib.mixins.json | 14 + gradle/libs.versions.toml | 13 + settings.gradle.kts | 12 +- 27 files changed, 1827 insertions(+), 14 deletions(-) create mode 100644 fabric/build.gradle.kts create mode 100644 fabric/src/main/java/com/github/juliarn/npclib/fabric/FabricModInitializer.java create mode 100644 fabric/src/main/java/com/github/juliarn/npclib/fabric/FabricPlatform.java create mode 100644 fabric/src/main/java/com/github/juliarn/npclib/fabric/FabricPlatformLogger.java create mode 100644 fabric/src/main/java/com/github/juliarn/npclib/fabric/FabricPlatformTaskManager.java create mode 100644 fabric/src/main/java/com/github/juliarn/npclib/fabric/FabricVersionAccessor.java create mode 100644 fabric/src/main/java/com/github/juliarn/npclib/fabric/FabricWorldAccessor.java create mode 100644 fabric/src/main/java/com/github/juliarn/npclib/fabric/controller/FabricActionController.java create mode 100644 fabric/src/main/java/com/github/juliarn/npclib/fabric/controller/FabricActionControllerEvents.java create mode 100644 fabric/src/main/java/com/github/juliarn/npclib/fabric/mixins/MinecraftServerMixin.java create mode 100644 fabric/src/main/java/com/github/juliarn/npclib/fabric/mixins/PlayerListMixin.java create mode 100644 fabric/src/main/java/com/github/juliarn/npclib/fabric/mixins/ServerGamePacketListenerImplMixin.java create mode 100644 fabric/src/main/java/com/github/juliarn/npclib/fabric/mixins/ServerPlayerMixin.java create mode 100644 fabric/src/main/java/com/github/juliarn/npclib/fabric/protocol/ByteArrayCustomPayload.java create mode 100644 fabric/src/main/java/com/github/juliarn/npclib/fabric/protocol/EntityDataFactory.java create mode 100644 fabric/src/main/java/com/github/juliarn/npclib/fabric/protocol/FabricProtocolAdapter.java create mode 100644 fabric/src/main/java/com/github/juliarn/npclib/fabric/util/FabricUtil.java create mode 100644 fabric/src/main/resources/fabric.mod.json create mode 100644 fabric/src/main/resources/npc_lib.accesswidener create mode 100644 fabric/src/main/resources/npc_lib.mixins.json diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index 62a1d28..f850df9 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -22,7 +22,7 @@ jobs: - name: Setup java uses: actions/setup-java@v4 with: - java-version: 17 + java-version: 21 check-latest: true distribution: 'zulu' diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index b0cd35f..5cb222b 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -240,10 +240,8 @@ -