diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/model/bettermodel/BetterModelModel.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/model/bettermodel/BetterModelModel.java index bfda089ba..1a8008a7c 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/model/bettermodel/BetterModelModel.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/model/bettermodel/BetterModelModel.java @@ -16,7 +16,7 @@ public class BetterModelModel extends AbstractExternalModel { @Override public void bindModel(AbstractEntity entity) { - org.bukkit.entity.Entity bukkitEntity = (org.bukkit.entity.Entity) entity.literalObject(); + org.bukkit.entity.Entity bukkitEntity = (org.bukkit.entity.Entity) entity.platformEntity(); BetterModelUtils.bindModel(bukkitEntity, id()); } } diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/model/modelengine/ModelEngineModel.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/model/modelengine/ModelEngineModel.java index a4d35dc4e..7d7943aa2 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/model/modelengine/ModelEngineModel.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/model/modelengine/ModelEngineModel.java @@ -16,7 +16,7 @@ public class ModelEngineModel extends AbstractExternalModel { @Override public void bindModel(AbstractEntity entity) { - org.bukkit.entity.Entity bukkitEntity = (org.bukkit.entity.Entity) entity.literalObject(); + org.bukkit.entity.Entity bukkitEntity = (org.bukkit.entity.Entity) entity.platformEntity(); ModelEngineUtils.bindModel(bukkitEntity, id()); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FallingBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FallingBlockBehavior.java index f71bbf15b..a9fb489ba 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FallingBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FallingBlockBehavior.java @@ -1,6 +1,8 @@ package net.momirealms.craftengine.bukkit.block.behavior; +import net.momirealms.craftengine.bukkit.api.BukkitAdaptors; import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.entity.BukkitEntity; import net.momirealms.craftengine.bukkit.entity.data.BaseEntityData; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; @@ -80,8 +82,8 @@ public class FallingBlockBehavior extends BukkitBlockBehavior { public void onBrokenAfterFall(Object thisBlock, Object[] args) throws Exception { Object level = args[0]; Object fallingBlockEntity = args[2]; - Object entityData = CoreReflections.field$Entity$entityData.get(fallingBlockEntity); - if (!BaseEntityData.Silent.get(entityData)) { + BukkitEntity entity = BukkitAdaptors.adapt(FastNMS.INSTANCE.method$Entity$getBukkitEntity(fallingBlockEntity)); + if (!entity.getEntityData(BaseEntityData.Silent)) { Object blockState = CoreReflections.field$FallingBlockEntity$blockState.get(fallingBlockEntity); Optional optionalCustomState = BlockStateUtils.getOptionalCustomBlockState(blockState); if (optionalCustomState.isEmpty()) return; @@ -94,16 +96,16 @@ public class FallingBlockBehavior extends BukkitBlockBehavior { } @Override - public void onLand(Object thisBlock, Object[] args) throws Exception { + public void onLand(Object thisBlock, Object[] args) { Object fallingBlock = args[4]; Object level = args[0]; Object pos = args[1]; - Object entityData = CoreReflections.field$Entity$entityData.get(fallingBlock); + BukkitEntity entity = BukkitAdaptors.adapt(FastNMS.INSTANCE.method$Entity$getBukkitEntity(fallingBlock)); Object blockState = args[2]; int stateId = BlockStateUtils.blockStateToId(blockState); ImmutableBlockState immutableBlockState = BukkitBlockManager.instance().getImmutableBlockState(stateId); if (immutableBlockState == null || immutableBlockState.isEmpty()) return; - if (!BaseEntityData.Silent.get(entityData)) { + if (!entity.getEntityData(BaseEntityData.Silent)) { net.momirealms.craftengine.core.world.World world = new BukkitWorld(FastNMS.INSTANCE.method$Level$getCraftWorld(level)); if (this.landSound != null) { world.playBlockSound(Vec3d.atCenterOf(LocationUtils.fromBlockPos(pos)), this.landSound); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/BukkitEntity.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/BukkitEntity.java index caf677a3a..667fbf44c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/BukkitEntity.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/BukkitEntity.java @@ -1,8 +1,10 @@ package net.momirealms.craftengine.bukkit.entity; +import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.util.EntityUtils; import net.momirealms.craftengine.bukkit.world.BukkitWorld; import net.momirealms.craftengine.core.entity.AbstractEntity; +import net.momirealms.craftengine.core.entity.data.EntityData; import net.momirealms.craftengine.core.util.Direction; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.world.World; @@ -19,17 +21,17 @@ public class BukkitEntity extends AbstractEntity { @Override public double x() { - return literalObject().getX(); + return platformEntity().getX(); } @Override public double y() { - return literalObject().getY(); + return platformEntity().getY(); } @Override public double z() { - return literalObject().getZ(); + return platformEntity().getZ(); } @Override @@ -38,22 +40,22 @@ public class BukkitEntity extends AbstractEntity { @Override public int entityID() { - return literalObject().getEntityId(); + return platformEntity().getEntityId(); } @Override public float xRot() { - return literalObject().getYaw(); + return platformEntity().getYaw(); } @Override public float yRot() { - return literalObject().getPitch(); + return platformEntity().getPitch(); } @Override public World world() { - return new BukkitWorld(literalObject().getWorld()); + return new BukkitWorld(platformEntity().getWorld()); } @Override @@ -62,22 +64,43 @@ public class BukkitEntity extends AbstractEntity { } @Override - public org.bukkit.entity.Entity literalObject() { + public org.bukkit.entity.Entity platformEntity() { return this.entity.get(); } + @Override + public Object serverEntity() { + return FastNMS.INSTANCE.method$CraftEntity$getHandle(platformEntity()); + } + @Override public Key type() { - return EntityUtils.getEntityType(literalObject()); + return EntityUtils.getEntityType(platformEntity()); } @Override public String name() { - return literalObject().getName(); + return platformEntity().getName(); } @Override public UUID uuid() { - return literalObject().getUniqueId(); + return platformEntity().getUniqueId(); + } + + @Override + public Object entityData() { + return FastNMS.INSTANCE.field$Entity$entityData(serverEntity()); + } + + @SuppressWarnings("unchecked") + @Override + public T getEntityData(EntityData data) { + return (T) FastNMS.INSTANCE.method$SynchedEntityData$get(entityData(), data.entityDataAccessor()); + } + + @Override + public void setEntityData(EntityData data, T value, boolean force) { + FastNMS.INSTANCE.method$SynchedEntityData$set(entityData(), data.entityDataAccessor(), value, force); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/BaseEntityData.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/BaseEntityData.java index 2b101a64f..93b8cb707 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/BaseEntityData.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/BaseEntityData.java @@ -4,7 +4,7 @@ import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflect import java.util.Optional; -public class BaseEntityData extends SimpleEntityData { +public class BaseEntityData extends BukkitEntityData { public static final BaseEntityData SharedFlags = new BaseEntityData<>(BaseEntityData.class, EntityDataValue.Serializers$BYTE, (byte) 0); public static final BaseEntityData AirSupply = new BaseEntityData<>(BaseEntityData.class, EntityDataValue.Serializers$INT, 300); public static final BaseEntityData> CustomName = new BaseEntityData<>(BaseEntityData.class, EntityDataValue.Serializers$OPTIONAL_COMPONENT, Optional.empty()); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/SimpleEntityData.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/BukkitEntityData.java similarity index 74% rename from bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/SimpleEntityData.java rename to bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/BukkitEntityData.java index 5cb42e2f6..2e3ee3eae 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/SimpleEntityData.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/BukkitEntityData.java @@ -2,15 +2,16 @@ package net.momirealms.craftengine.bukkit.entity.data; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.core.entity.data.ClassTreeIdRegistry; +import net.momirealms.craftengine.core.entity.data.EntityData; -public class SimpleEntityData implements EntityData { +public class BukkitEntityData implements EntityData { public static final ClassTreeIdRegistry ID_REGISTRY = new ClassTreeIdRegistry(); private final int id; private final Object serializer; private final T defaultValue; private final Object entityDataAccessor; - public SimpleEntityData(Class clazz, Object serializer, T defaultValue) { + public BukkitEntityData(Class clazz, Object serializer, T defaultValue) { this.id = ID_REGISTRY.define(clazz); this.serializer = serializer; this.defaultValue = defaultValue; @@ -36,4 +37,9 @@ public class SimpleEntityData implements EntityData { public Object entityDataAccessor() { return entityDataAccessor; } + + @Override + public Object create(Object entityDataAccessor, Object value) { + return EntityDataValue.create(entityDataAccessor, value); + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/EntityData.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/EntityData.java deleted file mode 100644 index 0574a93f9..000000000 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/EntityData.java +++ /dev/null @@ -1,40 +0,0 @@ -package net.momirealms.craftengine.bukkit.entity.data; - -import net.momirealms.craftengine.bukkit.nms.FastNMS; - -import java.util.List; - -public interface EntityData { - - Object serializer(); - - int id(); - - T defaultValue(); - - Object entityDataAccessor(); - - default Object createEntityDataIfNotDefaultValue(T value) { - if (defaultValue().equals(value)) return null; - return EntityDataValue.create(id(), serializer(), entityDataAccessor(), value); - } - - default void addEntityDataIfNotDefaultValue(T value, List list) { - if (!defaultValue().equals(value)) { - list.add(EntityDataValue.create(id(), serializer(), entityDataAccessor(), value)); - } - } - - default void addEntityData(T value, List list) { - list.add(EntityDataValue.create(id(), serializer(), entityDataAccessor(), value)); - } - - @SuppressWarnings("unchecked") - default T get(Object entityData) { - return (T) FastNMS.INSTANCE.method$SynchedEntityData$get(entityData, entityDataAccessor()); - } - - static EntityData of(Class clazz, Object serializer, T defaultValue) { - return new SimpleEntityData<>(clazz, serializer, defaultValue); - } -} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/EntityDataValue.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/EntityDataValue.java index 30d191d09..39e6f1950 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/EntityDataValue.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/EntityDataValue.java @@ -99,7 +99,7 @@ public class EntityDataValue { throw new IllegalAccessError("Utility class"); } - public static Object create(int id, Object serializer, Object entityDataAccessor, Object value) { + public static Object create(Object entityDataAccessor, Object value) { return FastNMS.INSTANCE.method$SynchedEntityData$DataValue$create(entityDataAccessor, value); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TotemAnimationCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TotemAnimationCommand.java index 03aac1937..0545ee0b4 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TotemAnimationCommand.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TotemAnimationCommand.java @@ -3,7 +3,10 @@ package net.momirealms.craftengine.bukkit.plugin.command.feature; import net.kyori.adventure.text.Component; import net.momirealms.craftengine.bukkit.api.BukkitAdaptors; import net.momirealms.craftengine.bukkit.item.ComponentTypes; +import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; +import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; +import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MSoundEvents; import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; import net.momirealms.craftengine.bukkit.util.KeyUtils; import net.momirealms.craftengine.bukkit.util.PlayerUtils; @@ -34,11 +37,13 @@ import org.incendo.cloud.parser.standard.FloatParser; import org.incendo.cloud.suggestion.Suggestion; import org.incendo.cloud.suggestion.SuggestionProvider; +import java.util.Collection; import java.util.Map; import java.util.Optional; import java.util.concurrent.CompletableFuture; public class TotemAnimationCommand extends BukkitCommandFeature { + public static final Object FIX_TOTEM_SOUND_PACKET = FastNMS.INSTANCE.constructor$ClientboundSoundPacket(FastNMS.INSTANCE.method$Holder$direct(MSoundEvents.TOTEM_USE), CoreReflections.instance$SoundSource$MUSIC, 0, Integer.MIN_VALUE, 0, 0, 0, 0); public TotemAnimationCommand(CraftEngineCommandManager commandManager, CraftEngine plugin) { super(commandManager, plugin); @@ -85,17 +90,21 @@ public class TotemAnimationCommand extends BukkitCommandFeature { } boolean removeSound = context.flags().hasFlag("no-sound"); MultiplePlayerSelector selector = context.get("players"); - for (Player player : selector.values()) { + Collection players = selector.values(); + for (Player player : players) { BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(player); Item item = customItem.buildItem(serverPlayer); if (VersionHelper.isOrAbove1_21_2()) { item.setJavaComponent(ComponentTypes.DEATH_PROTECTION, Map.of()); } - // TODO 存在第一次进服 未正确移除图腾声音的问题 PlayerUtils.sendTotemAnimation(serverPlayer, item, soundData, removeSound); } - // TODO 消息提示 + if (players.size() == 1) { + handleFeedback(context, MessageConstants.COMMAND_TOTEM_SUCCESS_SINGLE, Component.text(namespacedKey.toString()), Component.text(players.iterator().next().getName())); + } else if (players.size() > 1) { + handleFeedback(context, MessageConstants.COMMAND_TOTEM_SUCCESS_MULTIPLE, Component.text(namespacedKey.toString()), Component.text(players.size())); + } }); } 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 e0f6210a7..ba59dcb7b 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 @@ -36,6 +36,7 @@ import net.momirealms.craftengine.bukkit.item.BukkitItemManager; import net.momirealms.craftengine.bukkit.item.behavior.FurnitureItemBehavior; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.plugin.command.feature.TotemAnimationCommand; import net.momirealms.craftengine.bukkit.plugin.injector.ProtectedFieldVisitor; import net.momirealms.craftengine.bukkit.plugin.network.handler.*; import net.momirealms.craftengine.bukkit.plugin.network.id.PacketIds1_20; @@ -423,6 +424,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes player.getScheduler().runAtFixedRate(plugin.javaPlugin(), (t) -> user.tick(), () -> {}, 1, 1); } + user.sendPacket(TotemAnimationCommand.FIX_TOTEM_SOUND_PACKET, false); } } @@ -2385,7 +2387,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes } } - @SuppressWarnings("all") + @SuppressWarnings({"deprecation", "all"}) public HoverEvent.ShowItem replaceShowItem(HoverEvent.ShowItem showItem, BukkitServerPlayer player) { Object nmsItemStack; if (VersionHelper.COMPONENT_RELEASE) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/leaves/LeavesReflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/leaves/LeavesReflections.java index dd5522890..10de64942 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/leaves/LeavesReflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/leaves/LeavesReflections.java @@ -8,10 +8,13 @@ package net.momirealms.craftengine.bukkit.plugin.reflection.leaves; //import java.lang.reflect.Field; //import java.util.Optional; +import net.momirealms.craftengine.core.util.MiscUtils; import net.momirealms.craftengine.core.util.ReflectionUtils; +import net.momirealms.craftengine.core.util.VersionHelper; import java.lang.reflect.Field; import java.util.List; +import java.util.Optional; // TODO API 太新了需要1.21.8,目前先采用其他方式解决假人问题 public final class LeavesReflections { @@ -36,14 +39,21 @@ public final class LeavesReflections { // public static final Field field$BotRemoveEvent$handlers = Optional.ofNullable(clazz$BotRemoveEvent) // .map(it -> ReflectionUtils.getDeclaredField(it, HandlerList.class, 0)) // .orElse(null); - - - public static final Class clazz$ServerBot = ReflectionUtils.getClazz("org.leavesmc.leaves.bot.ServerBot"); +// +// +// public static final Class clazz$ServerBot = ReflectionUtils.getClazz("org.leavesmc.leaves.bot.ServerBot"); // 注入BotList来实现全版本的监听 - public static final Class clazz$BotList = ReflectionUtils.getClazz("org.leavesmc.leaves.bot.BotList"); + public static final Class clazz$BotList = MiscUtils.requireNonNullIf( + ReflectionUtils.getClazz("org.leavesmc.leaves.bot.BotList"), + VersionHelper.isLeaves() + ); - public static final Field field$BotList$INSTANCE = ReflectionUtils.getDeclaredField(clazz$BotList, clazz$BotList, 0); + public static final Field field$BotList$INSTANCE = Optional.ofNullable(clazz$BotList) + .map(c -> ReflectionUtils.getDeclaredField(c, c, 0)) + .orElse(null); - public static final Field field$BotList$bots = ReflectionUtils.getDeclaredField(clazz$BotList, List.class, 0); + public static final Field field$BotList$bots = Optional.ofNullable(clazz$BotList) + .map(c -> ReflectionUtils.getDeclaredField(c, List.class, 0)) + .orElse(null); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/MSoundEvents.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/MSoundEvents.java index 747dde390..e02250d2c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/MSoundEvents.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/MSoundEvents.java @@ -5,22 +5,15 @@ import net.momirealms.craftengine.bukkit.nms.FastNMS; public final class MSoundEvents { private MSoundEvents() {} - public static final Object EMPTY; - public static final Object TRIDENT_RIPTIDE_1; - public static final Object TRIDENT_RIPTIDE_2; - public static final Object TRIDENT_RIPTIDE_3; - public static final Object TRIDENT_THROW; + public static final Object EMPTY = getById("intentionally_empty"); + public static final Object TRIDENT_RIPTIDE_1 = getById("item.trident_riptide_1"); + public static final Object TRIDENT_RIPTIDE_2 = getById("item.trident_riptide_2"); + public static final Object TRIDENT_RIPTIDE_3 = getById("item.trident.riptide_3"); + public static final Object TRIDENT_THROW = getById("item.trident.throw"); + public static final Object TOTEM_USE = getById("item.totem.use"); private static Object getById(String id) { Object rl = FastNMS.INSTANCE.method$ResourceLocation$fromNamespaceAndPath("minecraft", id); return FastNMS.INSTANCE.method$Registry$getValue(MBuiltInRegistries.SOUND_EVENT, rl); } - - static { - EMPTY = getById("intentionally_empty"); - TRIDENT_RIPTIDE_1 = getById("item.trident_riptide_1"); - TRIDENT_RIPTIDE_2 = getById("item.trident_riptide_2"); - TRIDENT_RIPTIDE_3 = getById("item.trident.riptide_3"); - TRIDENT_THROW = getById("item.trident.throw"); - } } 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 65eaf3b2f..7e4467372 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 @@ -8,15 +8,13 @@ import io.netty.channel.ChannelHandler; import net.kyori.adventure.text.Component; import net.momirealms.craftengine.bukkit.api.CraftEngineBlocks; import net.momirealms.craftengine.bukkit.block.entity.BlockEntityHolder; +import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.*; +import net.momirealms.craftengine.core.entity.data.EntityData; import net.momirealms.craftengine.bukkit.item.BukkitItemManager; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.gui.CraftEngineGUIHolder; import net.momirealms.craftengine.bukkit.plugin.network.payload.DiscardedPayload; -import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; -import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MAttributeHolders; -import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MMobEffects; -import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.NetworkReflections; import net.momirealms.craftengine.bukkit.util.*; import net.momirealms.craftengine.bukkit.world.BukkitWorld; import net.momirealms.craftengine.core.advancement.AdvancementType; @@ -943,10 +941,15 @@ public class BukkitServerPlayer extends Player { } @Override - public org.bukkit.entity.Player literalObject() { + public org.bukkit.entity.Player platformEntity() { return platformPlayer(); } + @Override + public Object serverEntity() { + return serverPlayer(); + } + @Override public Map entityPacketHandlers() { return this.entityTypeView; @@ -1143,4 +1146,20 @@ public class BukkitServerPlayer extends Player { DamageType type = Registry.DAMAGE_TYPE.get(KeyUtils.toNamespacedKey(damageType)); this.platformPlayer().damage(amount, DamageSource.builder(type != null ? type : DamageType.GENERIC).build()); } + + @Override + public Object entityData() { + return FastNMS.INSTANCE.field$Entity$entityData(serverEntity()); + } + + @SuppressWarnings("unchecked") + @Override + public T getEntityData(EntityData data) { + return (T) FastNMS.INSTANCE.method$SynchedEntityData$get(entityData(), data.entityDataAccessor()); + } + + @Override + public void setEntityData(EntityData data, T value, boolean force) { + FastNMS.INSTANCE.method$SynchedEntityData$set(entityData(), data.entityDataAccessor(), value, force); + } } diff --git a/common-files/src/main/resources/translations/en.yml b/common-files/src/main/resources/translations/en.yml index 745d94e46..e7a1325d6 100644 --- a/common-files/src/main/resources/translations/en.yml +++ b/common-files/src/main/resources/translations/en.yml @@ -54,6 +54,8 @@ command.search_usage.not_found: "No usage found for this item" command.search_recipe.no_item: "Please hold an item before running this command" command.search_usage.no_item: "Please hold an item before running this command" command.totem_animation.failure.not_totem: "Item '' is not minecraft:totem_of_undying" +commands.totem_animation.success.single: "Played totem animation to " +commands.totem_animation.success.multiple: "Played totem animation to players" command.resource.enable.success: "Enabled resource . Run /ce reload all to apply changes" command.resource.enable.failure.unknown: "Unknown resource " command.resource.disable.success: "Disabled resource . Run /ce reload all to apply changes" diff --git a/common-files/src/main/resources/translations/zh_cn.yml b/common-files/src/main/resources/translations/zh_cn.yml index 5549ef095..4298f19fa 100644 --- a/common-files/src/main/resources/translations/zh_cn.yml +++ b/common-files/src/main/resources/translations/zh_cn.yml @@ -54,6 +54,8 @@ command.search_usage.not_found: "找不到此物品的用途" command.search_recipe.no_item: "请手持物品后再执行此命令" command.search_usage.no_item: "请手持物品后再执行此命令" command.totem_animation.failure.not_totem: "'' 不是 totem_of_undying 类型" +commands.totem_animation.success.single: "已将图腾动画播放给" +commands.totem_animation.success.multiple: "已将图腾动画播放给名玩家" command.resource.enable.success: "已启用 . 执行 /ce reload all 以应用更改" command.resource.enable.failure.unknown: "未知资源 " command.resource.disable.success: "已禁用 . 执行 /ce reload all 以应用更改" diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/Entity.java b/core/src/main/java/net/momirealms/craftengine/core/entity/Entity.java index aac181c4b..ba2a81d73 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/Entity.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/Entity.java @@ -1,5 +1,6 @@ package net.momirealms.craftengine.core.entity; +import net.momirealms.craftengine.core.entity.data.EntityData; import net.momirealms.craftengine.core.util.Direction; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.world.World; @@ -30,9 +31,21 @@ public interface Entity { Direction getDirection(); - Object literalObject(); + Object platformEntity(); + + Object serverEntity(); String name(); UUID uuid(); + + Object entityData(); + + T getEntityData(EntityData entityData); + + default void setEntityData(EntityData data, T value) { + setEntityData(data, value, false); + } + + void setEntityData(EntityData data, T value, boolean force); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/data/EntityData.java b/core/src/main/java/net/momirealms/craftengine/core/entity/data/EntityData.java new file mode 100644 index 000000000..1351831e6 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/data/EntityData.java @@ -0,0 +1,35 @@ +package net.momirealms.craftengine.core.entity.data; + +import java.util.List; + +public interface EntityData { + + Object serializer(); + + int id(); + + T defaultValue(); + + Object entityDataAccessor(); + + Object create(Object entityDataAccessor, Object value); + + default Object createEntityDataIfNotDefaultValue(T value) { + if (defaultValue().equals(value)) return null; + return create(entityDataAccessor(), value); + } + + default Object createEntityData(Object value) { + return create(entityDataAccessor(), value); + } + + default void addEntityDataIfNotDefaultValue(T value, List list) { + if (!defaultValue().equals(value)) { + list.add(create(entityDataAccessor(), value)); + } + } + + default void addEntityData(T value, List list) { + list.add(create(entityDataAccessor(), value)); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MessageConstants.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MessageConstants.java index 274e7cf0c..91c6db67b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MessageConstants.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MessageConstants.java @@ -30,4 +30,6 @@ public interface MessageConstants { TranslatableComponent.Builder COMMAND_UPLOAD_ON_PROGRESS = Component.translatable().key("command.upload.on_progress"); TranslatableComponent.Builder COMMAND_SEND_RESOURCE_PACK_SUCCESS_SINGLE = Component.translatable().key("command.send_resource_pack.success.single"); TranslatableComponent.Builder COMMAND_SEND_RESOURCE_PACK_SUCCESS_MULTIPLE = Component.translatable().key("command.send_resource_pack.success.multiple"); + TranslatableComponent.Builder COMMAND_TOTEM_SUCCESS_SINGLE = Component.translatable().key("commands.totem_animation.success.single"); + TranslatableComponent.Builder COMMAND_TOTEM_SUCCESS_MULTIPLE = Component.translatable().key("commands.totem_animation.success.multiple"); } diff --git a/gradle.properties b/gradle.properties index a1115c45f..a606d91b8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ org.gradle.jvmargs=-Xmx1G # Rule: [major update].[feature update].[bug fix] project_version=0.0.63.9 config_version=47 -lang_version=32 +lang_version=33 project_group=net.momirealms latest_supported_version=1.21.10 @@ -50,7 +50,7 @@ byte_buddy_version=1.17.5 ahocorasick_version=0.6.3 snake_yaml_version=2.5 anti_grief_version=1.0.2 -nms_helper_version=1.0.101 +nms_helper_version=1.0.102 evalex_version=3.5.0 reactive_streams_version=1.0.4 amazon_awssdk_version=2.34.5