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 c8468833e..8cfc37e8a 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 @@ -14,14 +14,14 @@ 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.BooleanParser; -import org.incendo.cloud.parser.standard.IntegerParser; +import org.incendo.cloud.parser.standard.*; import org.incendo.cloud.suggestion.Suggestion; import org.incendo.cloud.suggestion.SuggestionProvider; @@ -49,14 +49,10 @@ public class TestCommand extends BukkitCommandFeature { return CompletableFuture.completedFuture(plugin().itemManager().cachedSuggestions()); } })) - .required("interpolationDelay", IntegerParser.integerParser()) - .required("transformationInterpolationDuration", IntegerParser.integerParser()) - .required("positionRotationInterpolationDuration", IntegerParser.integerParser()) - // .required("displayType", ByteParser.byteParser()) - // .required("x", FloatParser.floatParser()) - // .required("y", FloatParser.floatParser()) - // .required("z", FloatParser.floatParser()) - // .required("w", FloatParser.floatParser()) + .required("interpolationDuration", IntegerParser.integerParser()) + .required("displayType", ByteParser.byteParser((byte) 0, (byte) 8)) + .required("translation", StringParser.stringParser()) + .required("rotationLeft", StringParser.stringParser()) .handler(context -> { Player player = context.sender(); if (context.get("forceUpdate")) { @@ -73,21 +69,13 @@ public class TestCommand extends BukkitCommandFeature { } NamespacedKey namespacedKey = context.get("id"); ItemStack item = new ItemStack(Material.TRIDENT); - // NamespacedKey displayTypeKey = Objects.requireNonNull(NamespacedKey.fromString("craftengine:display_type")); - // NamespacedKey customTridentX = Objects.requireNonNull(NamespacedKey.fromString("craftengine:custom_trident_x")); - // NamespacedKey customTridentY = Objects.requireNonNull(NamespacedKey.fromString("craftengine:custom_trident_y")); - // NamespacedKey customTridentZ = Objects.requireNonNull(NamespacedKey.fromString("craftengine:custom_trident_z")); - // NamespacedKey customTridentW = Objects.requireNonNull(NamespacedKey.fromString("craftengine:custom_trident_w")); - item.editMeta(meta -> { - meta.getPersistentDataContainer().set(CustomTridentUtils.customTridentKey, PersistentDataType.STRING, namespacedKey.asString()); - meta.getPersistentDataContainer().set(CustomTridentUtils.interpolationDelayKey, PersistentDataType.INTEGER, context.get("interpolationDelay")); - meta.getPersistentDataContainer().set(CustomTridentUtils.transformationInterpolationDurationaKey, PersistentDataType.INTEGER, context.get("transformationInterpolationDuration")); - meta.getPersistentDataContainer().set(CustomTridentUtils.positionRotationInterpolationDurationKey, PersistentDataType.INTEGER, context.get("positionRotationInterpolationDuration")); - // container.set(displayTypeKey, PersistentDataType.BYTE, context.get("displayType")); - // container.set(customTridentX, PersistentDataType.FLOAT, context.get("x")); - // container.set(customTridentY, PersistentDataType.FLOAT, context.get("y")); - // container.set(customTridentZ, PersistentDataType.FLOAT, context.get("z")); - // container.set(customTridentW, PersistentDataType.FLOAT, context.get("w")); + item.editMeta((meta) -> { + PersistentDataContainer container = meta.getPersistentDataContainer(); + container.set(CustomTridentUtils.customTridentKey, PersistentDataType.STRING, namespacedKey.asString()); + container.set(CustomTridentUtils.interpolationDurationaKey, PersistentDataType.INTEGER, context.get("interpolationDuration")); + container.set(CustomTridentUtils.displayTypeKey, PersistentDataType.BYTE, context.get("displayType")); + container.set(CustomTridentUtils.translationKey, PersistentDataType.STRING, context.get("translation")); + container.set(CustomTridentUtils.rotationLeftKey, PersistentDataType.STRING, context.get("rotationLeft")); Item ceItem = BukkitItemManager.instance().createWrappedItem(Key.of(namespacedKey.asString()), null); Optional customModelData = ceItem.customModelData(); customModelData.ifPresent(meta::setCustomModelData); 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 5280c2131..4589fe4ab 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 @@ -2334,7 +2334,9 @@ public class PacketConsumers { public static final TriConsumer SET_ENTITY_DATA = (user, event, packet) -> { try { int entityId = Reflections.field$clazz$ClientboundSetEntityDataPacket$id.getInt(packet); - CustomTridentUtils.modifyCustomTridentSetEntityData(user, event, entityId); + if (user.tridentView().containsKey(entityId)) { + CustomTridentUtils.modifyCustomTridentSetEntityData(user, event, entityId); + } } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundSetEntityDataPacket", e); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/CustomTridentUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/CustomTridentUtils.java index d4a938669..09a543a19 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/CustomTridentUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/CustomTridentUtils.java @@ -31,9 +31,10 @@ import java.util.concurrent.TimeUnit; public class CustomTridentUtils { public static final NamespacedKey customTridentKey = Objects.requireNonNull(NamespacedKey.fromString("craftengine:custom_trident")); - public static final NamespacedKey interpolationDelayKey = Objects.requireNonNull(NamespacedKey.fromString("craftengine:interpolation_delay")); - public static final NamespacedKey transformationInterpolationDurationaKey = Objects.requireNonNull(NamespacedKey.fromString("craftengine:transformation_interpolation_duration")); - public static final NamespacedKey positionRotationInterpolationDurationKey = Objects.requireNonNull(NamespacedKey.fromString("craftengine:position_rotation_interpolation_duration")); + public static final NamespacedKey interpolationDurationaKey = Objects.requireNonNull(NamespacedKey.fromString("craftengine:interpolation_duration")); + public static final NamespacedKey displayTypeKey = Objects.requireNonNull(NamespacedKey.fromString("craftengine:display_type")); + public static final NamespacedKey translationKey = Objects.requireNonNull(NamespacedKey.fromString("craftengine:translation")); + public static final NamespacedKey rotationLeftKey = Objects.requireNonNull(NamespacedKey.fromString("craftengine:rotation_left")); public static void handleCustomTrident(NetWorkUser user, NMSPacketEvent event, Object packet) throws IllegalAccessException { int entityId = FastNMS.INSTANCE.field$ClientboundAddEntityPacket$entityId(packet); @@ -47,7 +48,6 @@ public class CustomTridentUtils { serverEntity = null; } if (notCustomTrident(trident)) return; - user.tridentView().put(entityId, List.of()); modifyCustomTridentPacket(packet); List itemDisplayValues = buildEntityDataValues(trident); user.tridentView().put(entityId, itemDisplayValues); @@ -94,23 +94,26 @@ public class CustomTridentUtils { List itemDisplayValues = new ArrayList<>(); ItemStack itemStack = trident.getItemStack(); PersistentDataContainer container = itemStack.getItemMeta().getPersistentDataContainer(); - String customTrident = container.get(customTridentKey, PersistentDataType.STRING); + String customTrident = container.getOrDefault(customTridentKey, PersistentDataType.STRING, "craftengine:empty"); Item item = BukkitItemManager.instance().createWrappedItem(Key.of(customTrident), null); itemStack.getEnchantments().forEach((enchantment, level) -> item.addEnchantment(new Enchantment(Key.of(enchantment.getKey().toString()), level))); - Integer interpolationDelay = container.get(interpolationDelayKey, PersistentDataType.INTEGER); - Integer transformationInterpolationDuration = container.get(transformationInterpolationDurationaKey, PersistentDataType.INTEGER); - Integer positionRotationInterpolationDuration = container.get(positionRotationInterpolationDurationKey, PersistentDataType.INTEGER); - ItemDisplayEntityData.InterpolationDelay.addEntityDataIfNotDefaultValue(interpolationDelay, itemDisplayValues); - ItemDisplayEntityData.Translation.addEntityDataIfNotDefaultValue(new Vector3f(0, 0, -2), itemDisplayValues); - ItemDisplayEntityData.RotationLeft.addEntityDataIfNotDefaultValue(new Quaternionf(1, 1, 1, 1), itemDisplayValues); + Integer interpolationDurationa = container.getOrDefault(interpolationDurationaKey, PersistentDataType.INTEGER, 2); + Byte displayType = container.getOrDefault(displayTypeKey, PersistentDataType.BYTE, (byte) 0); + String translation = container.getOrDefault(translationKey, PersistentDataType.STRING, "0+0+0"); + String[] translations = translation.split("\\+"); + String rotationLeft = container.getOrDefault(rotationLeftKey, PersistentDataType.STRING, "0+0+0+0"); + String[] rotationLefts = rotationLeft.split("\\+"); + ItemDisplayEntityData.InterpolationDelay.addEntityDataIfNotDefaultValue(-1, itemDisplayValues); + ItemDisplayEntityData.Translation.addEntityDataIfNotDefaultValue(new Vector3f(Float.parseFloat(translations[0]), Float.parseFloat(translations[1]), Float.parseFloat(translations[2])), itemDisplayValues); + ItemDisplayEntityData.RotationLeft.addEntityDataIfNotDefaultValue(new Quaternionf(Float.parseFloat(rotationLefts[0]), Float.parseFloat(rotationLefts[1]), Float.parseFloat(rotationLefts[2]), Float.parseFloat(rotationLefts[3])), itemDisplayValues); if (VersionHelper.isOrAbove1_20_2()) { - ItemDisplayEntityData.TransformationInterpolationDuration.addEntityDataIfNotDefaultValue(transformationInterpolationDuration, itemDisplayValues); - ItemDisplayEntityData.PositionRotationInterpolationDuration.addEntityDataIfNotDefaultValue(positionRotationInterpolationDuration, itemDisplayValues); + ItemDisplayEntityData.TransformationInterpolationDuration.addEntityDataIfNotDefaultValue(interpolationDurationa, itemDisplayValues); + ItemDisplayEntityData.PositionRotationInterpolationDuration.addEntityDataIfNotDefaultValue(interpolationDurationa, itemDisplayValues); } else { - ItemDisplayEntityData.InterpolationDuration.addEntityDataIfNotDefaultValue(transformationInterpolationDuration, itemDisplayValues); + ItemDisplayEntityData.InterpolationDuration.addEntityDataIfNotDefaultValue(interpolationDurationa, itemDisplayValues); } ItemDisplayEntityData.DisplayedItem.addEntityDataIfNotDefaultValue(item.getLiteralObject(), itemDisplayValues); - ItemDisplayEntityData.DisplayType.addEntityDataIfNotDefaultValue((byte) 0, itemDisplayValues); + ItemDisplayEntityData.DisplayType.addEntityDataIfNotDefaultValue(displayType, itemDisplayValues); return itemDisplayValues; } @@ -144,17 +147,8 @@ public class CustomTridentUtils { } public static void modifyCustomTridentSetEntityData(NetWorkUser user, NMSPacketEvent event, int entityId) { - if (user.tridentView().containsKey(entityId)) { - Object packet = buildCustomTridentSetEntityDataPacket(user, entityId); - if (packet == null) return; - event.replacePacket(packet); - } else { - Trident trident = getTridentById(user, entityId); - if (trident == null) return; - if (notCustomTrident(trident)) return; - Object packet = buildCustomTridentSetEntityDataPacket(user, entityId); - if (packet == null) return; - event.replacePacket(packet); - } + Object packet = buildCustomTridentSetEntityDataPacket(user, entityId); + if (packet == null) return; + event.replacePacket(packet); } }