feat: 添加指令用于获取存档加载的全部无限存储元件

This commit is contained in:
C-H716 2025-09-20 19:28:11 +08:00
parent d6ac6e8045
commit 55628250bc
5 changed files with 104 additions and 1 deletions

View File

@ -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

View File

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

View File

@ -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;
}
}

View File

@ -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<CommandSourceStack> dispatcher) {
dispatcher.register(Commands.literal("eap").then(
Commands.literal("give_infinity_disks").executes(InfinityDiskGiveCommand::execute)
));
}
private static int execute(CommandContext<CommandSourceStack> 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;
}
}
}

View File

@ -48,6 +48,13 @@ public class InfinityStorageManager extends SavedData {
*/
private final Map<UUID, InfinityDataStorage> cells = new HashMap<>();
/**
* 返回当前已加载的所有 UUID 的不可变视图用于命令或调试用途
*/
public java.util.Set<UUID> 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<UUID, InfinityDataStorage> 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());