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());