From 55628250bcccfb9f7aa8a63810177af0b711889f Mon Sep 17 00:00:00 2001 From: C-H716 <1536152356@qq.com> Date: Sat, 20 Sep 2025 19:28:11 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=8C=87=E4=BB=A4?= =?UTF-8?q?=E7=94=A8=E4=BA=8E=E8=8E=B7=E5=8F=96=E5=AD=98=E6=A1=A3=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E7=9A=84=E5=85=A8=E9=83=A8=E6=97=A0=E9=99=90=E5=AD=98?= =?UTF-8?q?=E5=82=A8=E5=85=83=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle.properties | 2 +- .../com/extendedae_plus/ExtendedAEPlus.java | 8 +++ .../ae/items/InfinityBigIntegerCellItem.java | 14 +++++ .../command/InfinityDiskGiveCommand.java | 61 +++++++++++++++++++ .../util/storage/InfinityStorageManager.java | 20 ++++++ 5 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/extendedae_plus/command/InfinityDiskGiveCommand.java diff --git a/gradle.properties b/gradle.properties index 2c5731e..b86c90f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ org.gradle.jvmargs=-Xmx1G loom.platform = forge # Mod properties -mod_version = 1.4.2-fix1 +mod_version = 1.4.2-fix2 maven_group = com.extendedae_plus archives_name = extendedae_plus diff --git a/src/main/java/com/extendedae_plus/ExtendedAEPlus.java b/src/main/java/com/extendedae_plus/ExtendedAEPlus.java index 25d675e..3e02a54 100644 --- a/src/main/java/com/extendedae_plus/ExtendedAEPlus.java +++ b/src/main/java/com/extendedae_plus/ExtendedAEPlus.java @@ -17,6 +17,8 @@ import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.level.LevelEvent; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.RegisterCommandsEvent; +import com.extendedae_plus.command.InfinityDiskGiveCommand; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; @@ -53,6 +55,8 @@ public class ExtendedAEPlus { // 注册到Forge事件总线 MinecraftForge.EVENT_BUS.register(this); MinecraftForge.EVENT_BUS.addListener(ExtendedAEPlus::onLevelLoad); + // 注册命令注册监听 + MinecraftForge.EVENT_BUS.addListener(this::onRegisterCommands); // 注册通用配置 ModConfig.init(); // 注册 InfinityBigIntegerCellInventory 的事件监听(tick flush 与停止时 flush) @@ -123,4 +127,8 @@ public class ExtendedAEPlus { InfinityStorageManager.getForLevel(serverLevel); } } + + private void onRegisterCommands(RegisterCommandsEvent event) { + InfinityDiskGiveCommand.register(event.getDispatcher()); + } } diff --git a/src/main/java/com/extendedae_plus/ae/items/InfinityBigIntegerCellItem.java b/src/main/java/com/extendedae_plus/ae/items/InfinityBigIntegerCellItem.java index dde5b96..75baebf 100644 --- a/src/main/java/com/extendedae_plus/ae/items/InfinityBigIntegerCellItem.java +++ b/src/main/java/com/extendedae_plus/ae/items/InfinityBigIntegerCellItem.java @@ -7,15 +7,18 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.LongTag; import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; +import net.minecraftforge.registries.ForgeRegistries; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; import java.math.BigInteger; import java.util.List; +import java.util.Objects; public class InfinityBigIntegerCellItem extends Item { @@ -79,4 +82,15 @@ public class InfinityBigIntegerCellItem extends Item { } } } + + /** + * 创建一个带有指定 UUID 的 Infinity 磁盘 ItemStack + */ + public static ItemStack withUUID(java.util.UUID uuid) { + ItemStack stack = new ItemStack(Objects.requireNonNull( + ForgeRegistries.ITEMS.getValue(new ResourceLocation("extendedae_plus", "infinity_biginteger_cell") + ))); + stack.getOrCreateTag().putUUID("uuid", uuid); + return stack; + } } \ No newline at end of file diff --git a/src/main/java/com/extendedae_plus/command/InfinityDiskGiveCommand.java b/src/main/java/com/extendedae_plus/command/InfinityDiskGiveCommand.java new file mode 100644 index 0000000..306e483 --- /dev/null +++ b/src/main/java/com/extendedae_plus/command/InfinityDiskGiveCommand.java @@ -0,0 +1,61 @@ +package com.extendedae_plus.command; + +import com.extendedae_plus.ae.items.InfinityBigIntegerCellItem; +import com.extendedae_plus.util.storage.InfinityStorageManager; +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.context.CommandContext; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.item.ItemStack; + +import java.util.UUID; + +/** + * /eap give_infinity_disks + * 为执行命令的玩家生成当前世界已加载的所有 Infinity 磁盘(按 UUID)并发放到玩家物品栏 + */ +public class InfinityDiskGiveCommand { + + public static void register(CommandDispatcher dispatcher) { + dispatcher.register(Commands.literal("eap").then( + Commands.literal("give_infinity_disks").executes(InfinityDiskGiveCommand::execute) + )); + } + + private static int execute(CommandContext ctx) { + CommandSourceStack source = ctx.getSource(); + try { + ServerPlayer player = source.getPlayerOrException(); + if (player.level() == null || !(player.level() instanceof ServerLevel)) { + source.sendFailure(Component.literal("This command must be run on server side.")); + return 0; + } + InfinityStorageManager mgr = InfinityStorageManager.getForLevel((ServerLevel) player.level()); + if (mgr == null) { + source.sendFailure(Component.literal("InfinityStorageManager is not initialized.")); + return 0; + } + + int given = 0; + for (UUID id : mgr.getAllLoadedUUIDs()) { + ItemStack stack = InfinityBigIntegerCellItem.withUUID(id); + if (!player.getInventory().add(stack)) { + // 若玩家物品栏已满,则扔在地上 + player.drop(stack, false); + } + given++; + } + final int finalGiven = given; + source.sendSuccess(() -> Component.literal("Gave " + finalGiven + " infinity disks."), false); + return given; + } catch (Exception ex) { + source.sendFailure(Component.literal("Error: " + ex.getMessage())); + return 0; + } + } +} + + diff --git a/src/main/java/com/extendedae_plus/util/storage/InfinityStorageManager.java b/src/main/java/com/extendedae_plus/util/storage/InfinityStorageManager.java index 5f8f3fe..6ba1080 100644 --- a/src/main/java/com/extendedae_plus/util/storage/InfinityStorageManager.java +++ b/src/main/java/com/extendedae_plus/util/storage/InfinityStorageManager.java @@ -48,6 +48,13 @@ public class InfinityStorageManager extends SavedData { */ private final Map cells = new HashMap<>(); + /** + * 返回当前已加载的所有 UUID 的不可变视图,用于命令或调试用途 + */ + public java.util.Set getAllLoadedUUIDs() { + return java.util.Collections.unmodifiableSet(cells.keySet()); + } + public InfinityStorageManager() { setDirty(); } @@ -203,6 +210,19 @@ public class InfinityStorageManager extends SavedData { File file = level.getServer().getWorldPath(new LevelResource("data")) .resolve(FILE_NAME + ".dat").toFile(); NbtIo.writeCompressed(nbt, file); + + // 打印所有已保存的无限磁盘 UUID 及相关信息 + StringBuilder sb = new StringBuilder(); + sb.append("Saving Infinity Disks (UUIDs and info):\n"); + for (Map.Entry entry : cells.entrySet()) { + UUID uuid = entry.getKey(); + InfinityDataStorage data = entry.getValue(); + int types = (data.keys != null) ? data.keys.size() : 0; + sb.append(" - UUID: ").append(uuid) + .append(", Types: ").append(types) + .append("\n"); + } + LOGGER.info(sb.toString()); } } catch (Throwable ex) { LOGGER.info("InfinityStorageManager forceSaveAll error: {}", ex.getMessage());