diff --git a/bukkit/build.gradle.kts b/bukkit/build.gradle.kts index 6dea04b48..10489df7f 100644 --- a/bukkit/build.gradle.kts +++ b/bukkit/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("com.gradleup.shadow") version "9.2.2" + id("com.gradleup.shadow") version "9.3.0" id("maven-publish") } @@ -170,7 +170,7 @@ publishing { tasks.register("publishRelease") { group = "publishing" description = "Publishes to the release repository" - dependsOn("publishMavenJavaPublicationToReleaseRepository") + dependsOn("publishMavenJavaPublicationToReleasesRepository") } tasks.register("publishSnapshot") { diff --git a/bukkit/legacy/build.gradle.kts b/bukkit/legacy/build.gradle.kts index 75ecb2c84..0196a21b3 100644 --- a/bukkit/legacy/build.gradle.kts +++ b/bukkit/legacy/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("com.gradleup.shadow") version "9.2.2" + id("com.gradleup.shadow") version "9.3.0" } repositories { diff --git a/bukkit/loader/build.gradle.kts b/bukkit/loader/build.gradle.kts index 592494310..9db291d7d 100644 --- a/bukkit/loader/build.gradle.kts +++ b/bukkit/loader/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("com.gradleup.shadow") version "9.2.2" + id("com.gradleup.shadow") version "9.3.0" id("de.eldoria.plugin-yml.bukkit") version "0.7.1" } diff --git a/bukkit/paper-loader/build.gradle.kts b/bukkit/paper-loader/build.gradle.kts index c7b4e9d09..8dd12dd6a 100644 --- a/bukkit/paper-loader/build.gradle.kts +++ b/bukkit/paper-loader/build.gradle.kts @@ -4,7 +4,7 @@ import xyz.jpenilla.runtask.pluginsapi.DownloadPluginsSpec import java.net.URI plugins { - id("com.gradleup.shadow") version "9.2.2" + id("com.gradleup.shadow") version "9.3.0" id("de.eldoria.plugin-yml.paper") version "0.7.1" id("xyz.jpenilla.run-paper") version "3.0.2" } @@ -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/entity/furniture/BukkitFurniture.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurniture.java index 237f8de2a..09446dee3 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurniture.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurniture.java @@ -178,4 +178,12 @@ public class BukkitFurniture extends Furniture { public Entity getBukkitEntity() { return this.metaEntity.get(); } + + /** + * Use {@link #getBukkitEntity()} instead + */ + @Deprecated + public Entity baseEntity() { + return getBukkitEntity(); + } } \ No newline at end of file diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitCommandManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitCommandManager.java index 5f44c5689..3ea7fa6a2 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitCommandManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitCommandManager.java @@ -60,6 +60,7 @@ public class BukkitCommandManager extends AbstractCommandManager new DebugIsSectionInjectedCommand(this, plugin), new DebugMigrateTemplatesCommand(this, plugin), new DebugIsChunkPersistentLoadedCommand(this, plugin), + new DebugOptimizeFurnitureStructureCommand(this, plugin), new TotemAnimationCommand(this, plugin), new EnableResourceCommand(this, plugin), new DisableResourceCommand(this, plugin), diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugOptimizeFurnitureStructureCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugOptimizeFurnitureStructureCommand.java new file mode 100644 index 000000000..e3ff5fce1 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugOptimizeFurnitureStructureCommand.java @@ -0,0 +1,175 @@ +package net.momirealms.craftengine.bukkit.plugin.command.feature; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; +import net.momirealms.craftengine.core.plugin.command.sender.Sender; +import net.momirealms.craftengine.core.util.NBTUtils; +import net.momirealms.sparrow.nbt.CompoundTag; +import net.momirealms.sparrow.nbt.DoubleTag; +import net.momirealms.sparrow.nbt.ListTag; +import net.momirealms.sparrow.nbt.Tag; +import org.bukkit.NamespacedKey; +import org.bukkit.World; +import org.bukkit.command.CommandSender; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.Command; +import org.incendo.cloud.bukkit.parser.NamespacedKeyParser; +import org.incendo.cloud.bukkit.parser.WorldParser; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.parser.standard.DoubleParser; +import org.incendo.cloud.suggestion.Suggestion; +import org.incendo.cloud.suggestion.SuggestionProvider; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.file.FileVisitOption; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class DebugOptimizeFurnitureStructureCommand extends BukkitCommandFeature { + + public DebugOptimizeFurnitureStructureCommand(CraftEngineCommandManager commandManager, CraftEngine plugin) { + super(commandManager, plugin); + } + + @Override + public Command.Builder assembleCommand(org.incendo.cloud.CommandManager manager, Command.Builder builder) { + return builder + .required("world", WorldParser.worldParser()) + .required("file", NamespacedKeyParser.namespacedKeyComponent().suggestionProvider(new SuggestionProvider<>() { + @Override + public @NonNull CompletableFuture> suggestionsFuture(@NonNull CommandContext context, @NonNull CommandInput input) { + World world = context.get("world"); + Path generated = world.getWorldFolder().toPath().resolve("generated"); + if (!Files.exists(generated)) { + return CompletableFuture.completedFuture(Collections.emptyList()); + } + try { + return CompletableFuture.completedFuture(findStructures(generated).stream().map(Suggestion::suggestion).collect(Collectors.toList())); + } catch (IOException e) { + return CompletableFuture.completedFuture(Collections.emptyList()); + } + } + })) + .optional("y-offset", DoubleParser.doubleParser()) + .handler(context -> { + World world = context.get("world"); + NamespacedKey file = context.get("file"); + double offset = (double) context.optional("y-offset").orElse(0d); + Path filePath = world.getWorldFolder().toPath().resolve("generated").resolve(file.getNamespace()).resolve("structures").resolve(file.getKey() + ".nbt"); + Sender sender = plugin().senderFactory().wrap(context.sender()); + if (!Files.exists(filePath)) { + sender.sendMessage(Component.text("File not found", NamedTextColor.RED)); + return; + } + try (InputStream is = Files.newInputStream(filePath)) { + CompoundTag structureTag = NBTUtils.readCompressed(is); + ListTag entitiesTag = structureTag.getList("entities"); + if (entitiesTag == null) { + sender.sendMessage(Component.text("Entities not found", NamedTextColor.RED)); + return; + } + int count = 0; + ListTag toSave = new ListTag(); + for (Tag entityTag0 : entitiesTag) { + CompoundTag entityTag = (CompoundTag) entityTag0; + CompoundTag entityNBTTag = (CompoundTag) entityTag.get("nbt"); + if (entityNBTTag != null) { + CompoundTag bukkitValuesTag = (CompoundTag) entityNBTTag.get("BukkitValues"); + if (bukkitValuesTag != null) { + // 不保存碰撞实体 + if (bukkitValuesTag.containsKey("craftengine:collision")) { + count++; + continue; + } + if (bukkitValuesTag.containsKey("craftengine:furniture_id")) { + if (offset != 0) { + ListTag pos = (ListTag) entityTag.get("pos"); + double previousY = pos.getDouble(1); + pos.set(1, new DoubleTag(previousY + offset)); + count++; + } + } + } + } + toSave.add(entityTag); + } + if (count == 0) { + sender.sendMessage(Component.text("Nothing changed", NamedTextColor.WHITE)); + } else { + structureTag.put("entities", toSave); + try (OutputStream os = Files.newOutputStream(filePath)) { + NBTUtils.writeCompressed(structureTag, os); + } catch (IOException e) { + sender.sendMessage(Component.text("Internal error", NamedTextColor.RED)); + plugin().logger().severe("Cannot write structure NBT file", e); + return; + } + sender.sendMessage(Component.text(count + " entities modified", NamedTextColor.WHITE)); + } + } catch (IOException e) { + sender.sendMessage(Component.text("Internal error", NamedTextColor.RED)); + plugin().logger().severe("Cannot read structure NBT file", e); + } + }); + } + + @Override + public String getFeatureID() { + return "debug_optimize_furniture_structure"; + } + + public static List findStructures(Path startPath) throws IOException { + // 并行遍历文件树,使用自定义的BiPredicate进行过滤 + try (Stream stream = Files.walk(startPath, FileVisitOption.FOLLOW_LINKS)) { + return stream.filter(Files::isRegularFile) + .filter(path -> { + String filename = path.getFileName().toString(); + return filename.endsWith(".nbt") && + filename.length() > 4; // 确保有文件名(不只是.nbt) + }) + .map(path -> { + try { + return extractPair(startPath, path); + } catch (Exception e) { + return null; + } + }) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + } + } + + private static String extractPair(Path basePath, Path nbtFile) { + try { + Path relativePath = basePath.relativize(nbtFile); + List parts = new ArrayList<>(); + for (Path part : relativePath) { + parts.add(part.toString()); + } + // 检查是否符合 xxx/structures/xxx.nbt 模式 + if (parts.size() >= 3 && "structures".equals(parts.get(parts.size() - 2))) { + String firstXxx = parts.get(parts.size() - 3); + String fileName = parts.getLast(); + if (fileName.endsWith(".nbt")) { + String secondXxx = fileName.substring(0, fileName.length() - 4); + return firstXxx + ":" + secondXxx; + } + } + } catch (Exception ignored) { + } + return null; + } +} 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/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldManager.java index 98ef141a8..1f25f192b 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldManager.java @@ -295,21 +295,23 @@ public class BukkitWorldManager implements WorldManager, Listener { Object chunkSource = FastNMS.INSTANCE.method$ServerLevel$getChunkSource(worldServer); Object levelChunk = FastNMS.INSTANCE.method$ServerChunkCache$getChunkAtIfLoadedMainThread(chunkSource, chunk.getX(), chunk.getZ()); Object[] sections = FastNMS.INSTANCE.method$ChunkAccess$getSections(levelChunk); - for (int i = 0; i < ceSections.length; i++) { - CESection ceSection = ceSections[i]; - Object section = sections[i]; - WorldStorageInjector.uninjectLevelChunkSection(section); - if (Config.restoreVanillaBlocks()) { - if (!ceSection.statesContainer().isEmpty()) { - for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) { - for (int y = 0; y < 16; y++) { - ImmutableBlockState customState = ceSection.getBlockState(x, y, z); - if (!customState.isEmpty()) { - BlockStateWrapper wrapper = customState.restoreBlockState(); - if (wrapper != null) { - FastNMS.INSTANCE.method$LevelChunkSection$setBlockState(section, x, y, z, wrapper.literalObject(), false); - unsaved = true; + synchronized (sections) { + for (int i = 0; i < ceSections.length; i++) { + CESection ceSection = ceSections[i]; + Object section = sections[i]; + WorldStorageInjector.uninjectLevelChunkSection(section); + if (Config.restoreVanillaBlocks()) { + if (!ceSection.statesContainer().isEmpty()) { + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + for (int y = 0; y < 16; y++) { + ImmutableBlockState customState = ceSection.getBlockState(x, y, z); + if (!customState.isEmpty()) { + BlockStateWrapper wrapper = customState.restoreBlockState(); + if (wrapper != null) { + FastNMS.INSTANCE.method$LevelChunkSection$setBlockState(section, x, y, z, wrapper.literalObject(), false); + unsaved = true; + } } } } diff --git a/common-files/src/main/resources/commands.yml b/common-files/src/main/resources/commands.yml index e9929cd06..26ec2fe89 100644 --- a/common-files/src/main/resources/commands.yml +++ b/common-files/src/main/resources/commands.yml @@ -283,6 +283,13 @@ debug_furniture: - /craftengine debug furniture - /ce debug furniture +debug_optimize_furniture_structure: + enable: true + permission: ce.command.debug.optimize_furniture_structure + usage: + - /craftengine debug optimize-furniture-structure + - /ce debug optimize-furniture-structure + debug_test: enable: true permission: ce.command.debug.test diff --git a/common-files/src/main/resources/config.yml b/common-files/src/main/resources/config.yml index 26716aa71..6132f428e 100644 --- a/common-files/src/main/resources/config.yml +++ b/common-files/src/main/resources/config.yml @@ -562,7 +562,7 @@ chunk-system: client-optimization: # Requires a restart to fully apply. entity-culling: - enable: false + enable: true # Using server-side ray tracing algorithms to hide block entities/furniture and reduce client-side rendering pressure. ray-tracing: true # Cull entities based on distance diff --git a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/pickaxe_block_back.png b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/pickaxe_block_back.png deleted file mode 100644 index bee2f3c2b..000000000 Binary files a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/pickaxe_block_back.png and /dev/null differ diff --git a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/pickaxe_block_down.png b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/pickaxe_block_down.png deleted file mode 100644 index 51c403fbb..000000000 Binary files a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/pickaxe_block_down.png and /dev/null differ diff --git a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/pickaxe_block_front.png b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/pickaxe_block_front.png deleted file mode 100644 index 56b8678bf..000000000 Binary files a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/pickaxe_block_front.png and /dev/null differ diff --git a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/pickaxe_block_side.png b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/pickaxe_block_side.png deleted file mode 100644 index 4b2b7cffe..000000000 Binary files a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/pickaxe_block_side.png and /dev/null differ diff --git a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/pickaxe_block_top.png b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/pickaxe_block_top.png deleted file mode 100644 index a6c59abed..000000000 Binary files a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/pickaxe_block_top.png and /dev/null differ diff --git a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/place_block_back.png b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/place_block_back.png deleted file mode 100644 index f1ca41066..000000000 Binary files a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/place_block_back.png and /dev/null differ diff --git a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/place_block_down.png b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/place_block_down.png deleted file mode 100644 index c220083d7..000000000 Binary files a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/place_block_down.png and /dev/null differ diff --git a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/place_block_front.png b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/place_block_front.png deleted file mode 100644 index 2f3f0070a..000000000 Binary files a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/place_block_front.png and /dev/null differ diff --git a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/place_block_side.png b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/place_block_side.png deleted file mode 100644 index ff94ffb51..000000000 Binary files a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/place_block_side.png and /dev/null differ diff --git a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/place_block_top.png b/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/place_block_top.png deleted file mode 100644 index 43ec23e4f..000000000 Binary files a/common-files/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/place_block_top.png and /dev/null differ diff --git a/common-files/src/main/resources/translations/en.yml b/common-files/src/main/resources/translations/en.yml index edac2828b..1a2907784 100644 --- a/common-files/src/main/resources/translations/en.yml +++ b/common-files/src/main/resources/translations/en.yml @@ -46,7 +46,7 @@ info.resource_pack.validate: "Validated resource pack in ms" info.resource_pack.optimize: "Optimized resource pack in ms" info.resource_pack.optimize.json: "> Optimizing json files..." info.resource_pack.optimize.texture: "> Optimizing textures..." -info.resource_pack.optimize.result: "□ Before/After/Ratio: KB/ KB/%" +info.resource_pack.optimize.result: "□ Before/After/Ratio: //%" info.resource_pack.create: "Created resource pack zip in ms" info.resource_pack.upload: "Completed uploading resource pack" info.host.self.netty_server: "Netty HTTP server started on port: " diff --git a/common-files/src/main/resources/translations/zh_cn.yml b/common-files/src/main/resources/translations/zh_cn.yml index 5ea020fd7..7ef4922c2 100644 --- a/common-files/src/main/resources/translations/zh_cn.yml +++ b/common-files/src/main/resources/translations/zh_cn.yml @@ -46,7 +46,7 @@ info.resource_pack.validate: "验证资源包耗时 ms" info.resource_pack.optimize: "优化资源包耗时 ms" info.resource_pack.optimize.json: "> 正在优化json文件..." info.resource_pack.optimize.texture: "> 正在优化贴图文件..." -info.resource_pack.optimize.result: "□ 优化前/优化后/比例: KB/ KB/%" +info.resource_pack.optimize.result: "□ 优化前/优化后/比例: //%" info.resource_pack.create: "创建资源包文件耗时 ms" info.resource_pack.upload: "资源包上传完成" info.host.self.netty_server: "Netty HTTP 服务已在端口 开启" diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 6c138b529..f49d99ae4 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("com.gradleup.shadow") version "9.2.2" + id("com.gradleup.shadow") version "9.3.0" id("maven-publish") } @@ -175,7 +175,7 @@ publishing { tasks.register("publishRelease") { group = "publishing" description = "Publishes to the release repository" - dependsOn("publishMavenJavaPublicationToReleaseRepository") + dependsOn("publishMavenJavaPublicationToReleasesRepository") } tasks.register("publishSnapshot") { 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/NBTUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/NBTUtils.java new file mode 100644 index 000000000..6c92e63e8 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/NBTUtils.java @@ -0,0 +1,26 @@ +package net.momirealms.craftengine.core.util; + +import net.momirealms.sparrow.nbt.CompoundTag; +import net.momirealms.sparrow.nbt.NBT; + +import java.io.*; +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; + +public final class NBTUtils { + + private NBTUtils() { + } + + public static void writeCompressed(CompoundTag nbt, OutputStream stream) throws IOException { + try (DataOutputStream dataoutputstream = new DataOutputStream(new BufferedOutputStream(new GZIPOutputStream(stream)))) { + NBT.writeCompound(nbt, dataoutputstream, true); + } + } + + public static CompoundTag readCompressed(InputStream stream) throws IOException { + try (DataInputStream datainputstream = new DataInputStream(new BufferedInputStream(new GZIPInputStream(stream)))) { + return NBT.readCompound(datainputstream, true); + } + } +} 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 65acf2db1..d872722bb 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 @@ -8,6 +8,7 @@ import java.nio.charset.StandardCharsets; import java.util.Objects; public class VersionHelper { + public static final boolean IS_RUNNING_IN_DEV = Boolean.getBoolean("net.momirealms.craftengine.dev"); public static final boolean PREMIUM = false; public static final MinecraftVersion MINECRAFT_VERSION; public static final boolean COMPONENT_RELEASE; diff --git a/gradle.properties b/gradle.properties index 1488dee0e..1b68adee0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ org.gradle.jvmargs=-Xmx1G # Project settings -project_version=0.0.66 +project_version=0.0.66.2 config_version=60 lang_version=43 project_group=net.momirealms @@ -37,8 +37,8 @@ geantyref_version=1.3.16 zstd_version=1.5.7-6 commons_io_version=2.21.0 commons_lang3_version=3.20.0 -sparrow_nbt_version=0.10.6 -sparrow_util_version=0.68 +sparrow_nbt_version=0.10.9 +sparrow_util_version=0.69 fastutil_version=8.5.18 netty_version=4.1.128.Final joml_version=1.10.8 @@ -48,7 +48,7 @@ byte_buddy_version=1.18.1 ahocorasick_version=0.6.3 snake_yaml_version=2.5 anti_grief_version=1.0.5 -nms_helper_version=1.0.148 +nms_helper_version=1.0.149 evalex_version=3.5.0 reactive_streams_version=1.0.4 amazon_awssdk_version=2.38.7 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ab521aa07..cd4b7aa89 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists