From 584296efe1c584b15ad129b7b59b2c818e2cce42 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 16 Jun 2025 23:07:45 +0800 Subject: [PATCH] =?UTF-8?q?feat(entity):=20=E6=B7=BB=E5=8A=A0=E5=BF=AB?= =?UTF-8?q?=E4=B9=90=E6=81=B6=E9=AD=82=E5=8F=8A=E5=85=B6=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E5=AE=9E=E4=BD=93=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/entity/data/AgeableMobData.java | 9 ++++ .../bukkit/entity/data/AnimalData.java | 8 ++++ .../bukkit/entity/data/HappyGhastData.java | 10 ++++ .../bukkit/entity/data/PathfinderMobData.java | 8 ++++ .../plugin/command/feature/TestCommand.java | 48 +++++++++---------- 5 files changed, 58 insertions(+), 25 deletions(-) create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/AgeableMobData.java create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/AnimalData.java create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/HappyGhastData.java create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/PathfinderMobData.java diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/AgeableMobData.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/AgeableMobData.java new file mode 100644 index 000000000..919a48491 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/AgeableMobData.java @@ -0,0 +1,9 @@ +package net.momirealms.craftengine.bukkit.entity.data; + +public class AgeableMobData extends PathfinderMobData { + public static final MobData Baby = new AgeableMobData<>(16, EntityDataValue.Serializers$BOOLEAN, false); + + public AgeableMobData(int id, Object serializer, T defaultValue) { + super(id, serializer, defaultValue); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/AnimalData.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/AnimalData.java new file mode 100644 index 000000000..2d2f70fc7 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/AnimalData.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.bukkit.entity.data; + +public class AnimalData extends AgeableMobData { + + public AnimalData(int id, Object serializer, T defaultValue) { + super(id, serializer, defaultValue); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/HappyGhastData.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/HappyGhastData.java new file mode 100644 index 000000000..ba260364f --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/HappyGhastData.java @@ -0,0 +1,10 @@ +package net.momirealms.craftengine.bukkit.entity.data; + +public class HappyGhastData extends AnimalData { + public static final HappyGhastData IsLeashHolder = new HappyGhastData<>(17, EntityDataValue.Serializers$BOOLEAN, false); + public static final BaseEntityData StaysStill = new HappyGhastData<>(18, EntityDataValue.Serializers$BOOLEAN, false); + + public HappyGhastData(int id, Object serializer, T defaultValue) { + super(id, serializer, defaultValue); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/PathfinderMobData.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/PathfinderMobData.java new file mode 100644 index 000000000..cf2bc0e9c --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/PathfinderMobData.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.bukkit.entity.data; + +public class PathfinderMobData extends MobData { + + public PathfinderMobData(int id, Object serializer, T defaultValue) { + super(id, serializer, defaultValue); + } +} 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 27a4709e7..a8d5c862d 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,5 +1,6 @@ package net.momirealms.craftengine.bukkit.plugin.command.feature; +import net.momirealms.craftengine.bukkit.entity.data.HappyGhastData; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; @@ -12,7 +13,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.incendo.cloud.Command; import org.incendo.cloud.bukkit.parser.location.LocationParser; -import org.incendo.cloud.parser.standard.StringArrayParser; +import org.incendo.cloud.parser.standard.IntegerParser; import java.util.ArrayList; import java.util.List; @@ -29,37 +30,34 @@ public class TestCommand extends BukkitCommandFeature { return builder .senderType(Player.class) .required("location", LocationParser.locationParser()) - // .required("remove", StringArrayParser.stringArrayParser()) + .required("remove", IntegerParser.integerParser()) .handler(context -> { Player player = context.sender(); - // String[] removeEntityIds = context.get("remove"); - // int removeHitboxId = Integer.parseInt(removeEntityIds[0]); - // int removePlayerId = Integer.parseInt(removeEntityIds[1]); - // if (removeHitboxId >= 0 && removePlayerId >= 0) { - // try { - // Object packet = NetworkReflections.constructor$ClientboundRemoveEntitiesPacket.newInstance((Object) new int[]{removeHitboxId, removePlayerId}); - // plugin().adapt(player).sendPacket(packet, true); - // player.sendMessage("发送成功"); - // } catch (ReflectiveOperationException e) { - // player.sendMessage("发送失败"); - // } - // return; - // } + int removeEntityId = context.get("remove"); + if (removeEntityId >= 0) { + try { + Object packet = NetworkReflections.constructor$ClientboundRemoveEntitiesPacket.newInstance((Object) new int[]{removeEntityId}); + plugin().adapt(player).sendPacket(packet, true); + player.sendMessage("发送成功"); + } catch (ReflectiveOperationException e) { + player.sendMessage("发送失败"); + } + return; + } Location location = context.get("location"); - // int hitboxId = CoreReflections.instance$Entity$ENTITY_COUNTER.incrementAndGet(); - int playerId = CoreReflections.instance$Entity$ENTITY_COUNTER.incrementAndGet(); + int entityId = CoreReflections.instance$Entity$ENTITY_COUNTER.incrementAndGet(); List packets = new ArrayList<>(); - // packets.add(FastNMS.INSTANCE.constructor$ClientboundAddEntityPacket( - // hitboxId, UUID.randomUUID(), location.x(), location.y(), location.z(), 0, location.getYaw(), - // MEntityTypes.HAPPY_GHAST, 0, CoreReflections.instance$Vec3$Zero, 0 - // )); + List cachedShulkerValues = new ArrayList<>(); + HappyGhastData.MobFlags.addEntityDataIfNotDefaultValue((byte) 0x01, cachedShulkerValues); // NO AI + // HappyGhastData.SharedFlags.addEntityDataIfNotDefaultValue((byte) 0x20, cachedShulkerValues); // Invisible + HappyGhastData.StaysStill.addEntityDataIfNotDefaultValue(true, cachedShulkerValues); packets.add(FastNMS.INSTANCE.constructor$ClientboundAddEntityPacket( - playerId, UUID.randomUUID(), location.x(), location.y()/* + 4*/, location.z(), 0, location.getYaw(), - MEntityTypes.PLAYER, 0, CoreReflections.instance$Vec3$Zero, 0 + entityId, UUID.randomUUID(), location.x(), location.y(), location.z(), 0, location.getYaw(), + MEntityTypes.HAPPY_GHAST, 0, CoreReflections.instance$Vec3$Zero, 0 )); - player.sendMessage("player: " + MEntityTypes.PLAYER); + packets.add(FastNMS.INSTANCE.constructor$ClientboundSetEntityDataPacket(entityId, List.copyOf(cachedShulkerValues))); plugin().adapt(player).sendPackets(packets, true); - player.sendMessage("发送成功 id: [" + /*hitboxId + ", " +*/ playerId + "]"); + player.sendMessage("发送成功 id: " + entityId); }); }