diff --git a/bukkit/paper-loader/build.gradle.kts b/bukkit/paper-loader/build.gradle.kts index aba556f45..41bb27752 100644 --- a/bukkit/paper-loader/build.gradle.kts +++ b/bukkit/paper-loader/build.gradle.kts @@ -217,6 +217,9 @@ fun registerPaperTask( languageVersion = JavaLanguageVersion.of(javaVersion) } systemProperties["com.mojang.eula.agree"] = true + systemProperties["net.momirealms.craftengine.dev"] = true + jvmArgs("-Dsun.stdout.encoding=UTF-8") + jvmArgs("-Dsun.stderr.encoding=UTF-8") jvmArgs("-Ddisable.watchdog=true") jvmArgs("-Xlog:redefine+class*=info") jvmArgs("-XX:+AllowEnhancedClassRedefinition") diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/ArmorStandData.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/ArmorStandData.java index b57c49046..6ebb93b9f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/ArmorStandData.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/data/ArmorStandData.java @@ -1,8 +1,16 @@ package net.momirealms.craftengine.bukkit.entity.data; +import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; + public class ArmorStandData extends LivingEntityData { public static final ArmorStandData ArmorStandFlags = new ArmorStandData<>(ArmorStandData.class, EntityDataValue.Serializers$BYTE, (byte) 0); // rotations + public static final ArmorStandData HeadPose = new ArmorStandData<>(ArmorStandData.class, EntityDataValue.Serializers$ROTATIONS, CoreReflections.instance$ArmorStand$DEFAULT_HEAD_POSE); + public static final ArmorStandData BodyPose = new ArmorStandData<>(ArmorStandData.class, EntityDataValue.Serializers$ROTATIONS, CoreReflections.instance$ArmorStand$DEFAULT_BODY_POSE); + public static final ArmorStandData LeftArmPose = new ArmorStandData<>(ArmorStandData.class, EntityDataValue.Serializers$ROTATIONS, CoreReflections.instance$ArmorStand$DEFAULT_LEFT_ARM_POSE); + public static final ArmorStandData RightArmPose = new ArmorStandData<>(ArmorStandData.class, EntityDataValue.Serializers$ROTATIONS, CoreReflections.instance$ArmorStand$DEFAULT_RIGHT_ARM_POSE); + public static final ArmorStandData LeftLegPose = new ArmorStandData<>(ArmorStandData.class, EntityDataValue.Serializers$ROTATIONS, CoreReflections.instance$ArmorStand$DEFAULT_LEFT_LEG_POSE); + public static final ArmorStandData RightLegPose = new ArmorStandData<>(ArmorStandData.class, EntityDataValue.Serializers$ROTATIONS, CoreReflections.instance$ArmorStand$DEFAULT_RIGHT_LEG_POSE); public ArmorStandData(Class clazz, Object serializer, T defaultValue) { super(clazz, serializer, defaultValue); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java index c1f11650e..06ea0d4a1 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java @@ -4644,4 +4644,35 @@ public final class CoreReflections { "world.scores.PlayerTeam" ) ); + + public static final Class clazz$Rotations = requireNonNull( + BukkitReflectionUtils.findReobfOrMojmapClass( + "core.Vector3f", + "core.Rotations" + ) + ); + + public static final Constructor constructor$Rotations = requireNonNull( + ReflectionUtils.getConstructor(clazz$Rotations, float.class, float.class, float.class) + ); + + public static final Object instance$ArmorStand$DEFAULT_HEAD_POSE; + public static final Object instance$ArmorStand$DEFAULT_BODY_POSE; + public static final Object instance$ArmorStand$DEFAULT_LEFT_ARM_POSE; + public static final Object instance$ArmorStand$DEFAULT_RIGHT_ARM_POSE; + public static final Object instance$ArmorStand$DEFAULT_LEFT_LEG_POSE; + public static final Object instance$ArmorStand$DEFAULT_RIGHT_LEG_POSE; + + static { + try { + instance$ArmorStand$DEFAULT_HEAD_POSE = constructor$Rotations.newInstance(0.0F, 0.0F, 0.0F); + instance$ArmorStand$DEFAULT_BODY_POSE = constructor$Rotations.newInstance(0.0F, 0.0F, 0.0F); + instance$ArmorStand$DEFAULT_LEFT_ARM_POSE = constructor$Rotations.newInstance(-10.0F, 0.0F, -10.0F); + instance$ArmorStand$DEFAULT_RIGHT_ARM_POSE = constructor$Rotations.newInstance(-15.0F, 0.0F, 10.0F); + instance$ArmorStand$DEFAULT_LEFT_LEG_POSE = constructor$Rotations.newInstance(-1.0F, 0.0F, -1.0F); + instance$ArmorStand$DEFAULT_RIGHT_LEG_POSE = constructor$Rotations.newInstance(1.0F, 0.0F, 1.0F); + } catch (ReflectiveOperationException e) { + throw new ReflectionInitException("Failed to init ArmorStand", e); + } + } } 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 d9ebbbe69..d690465e9 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 @@ -168,6 +168,8 @@ public class BukkitServerPlayer extends Player { private int lastHitFurnitureTick; // 控制展示实体可见距离 private double displayEntityViewDistance; + // 是否是基岩版 + private Tristate isBedrock = Tristate.UNDEFINED; public BukkitServerPlayer(BukkitCraftEngine plugin, @Nullable Channel channel) { this.channel = channel; @@ -1517,6 +1519,14 @@ public class BukkitServerPlayer extends Player { return FastNMS.INSTANCE.method$Inventory$clearOrCountMatchingItems(inventory, predicate, count, craftSlots); } + @Override + public boolean isBedrock() { + if (this.isBedrock == Tristate.UNDEFINED) { + this.isBedrock = Tristate.of(this.plugin.compatibilityManager().isBedrockPlayer(this)); + } + return this.isBedrock.asBoolean(); + } + @Override public void addTrackedFurniture(int entityId, Furniture furniture) { this.trackedFurniture.put(entityId, new VirtualCullableObject(furniture)); diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java b/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java index f7f85bdf5..b5814c9b4 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java @@ -232,6 +232,8 @@ public abstract class Player extends AbstractEntity implements NetWorkUser { public abstract int clearOrCountMatchingInventoryItems(Key itemId, int count); + public abstract boolean isBedrock(); + @Override public void remove() { } diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/VersionHelper.java b/core/src/main/java/net/momirealms/craftengine/core/util/VersionHelper.java index 633dcba99..a412035c4 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/VersionHelper.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/VersionHelper.java @@ -9,6 +9,7 @@ import java.util.Objects; public class VersionHelper { public static final boolean PREMIUM = true; + public static final boolean IS_RUNNING_IN_DEV = Boolean.getBoolean("net.momirealms.craftengine.dev"); public static final MinecraftVersion MINECRAFT_VERSION; public static final boolean COMPONENT_RELEASE; private static final int version;