feat: 添加指令用于获取存档加载的全部无限存储元件
This commit is contained in:
parent
d6ac6e8045
commit
55628250bc
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -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());
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user