feat: 添加指令用于获取存档加载的全部无限存储元件
This commit is contained in:
parent
d6ac6e8045
commit
55628250bc
|
|
@ -3,7 +3,7 @@ org.gradle.jvmargs=-Xmx1G
|
||||||
loom.platform = forge
|
loom.platform = forge
|
||||||
|
|
||||||
# Mod properties
|
# Mod properties
|
||||||
mod_version = 1.4.2-fix1
|
mod_version = 1.4.2-fix2
|
||||||
maven_group = com.extendedae_plus
|
maven_group = com.extendedae_plus
|
||||||
archives_name = extendedae_plus
|
archives_name = extendedae_plus
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,8 @@ import net.minecraftforge.common.MinecraftForge;
|
||||||
import net.minecraftforge.event.level.LevelEvent;
|
import net.minecraftforge.event.level.LevelEvent;
|
||||||
import net.minecraftforge.eventbus.api.IEventBus;
|
import net.minecraftforge.eventbus.api.IEventBus;
|
||||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
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.common.Mod;
|
||||||
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
|
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
|
||||||
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
|
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
|
||||||
|
|
@ -53,6 +55,8 @@ public class ExtendedAEPlus {
|
||||||
// 注册到Forge事件总线
|
// 注册到Forge事件总线
|
||||||
MinecraftForge.EVENT_BUS.register(this);
|
MinecraftForge.EVENT_BUS.register(this);
|
||||||
MinecraftForge.EVENT_BUS.addListener(ExtendedAEPlus::onLevelLoad);
|
MinecraftForge.EVENT_BUS.addListener(ExtendedAEPlus::onLevelLoad);
|
||||||
|
// 注册命令注册监听
|
||||||
|
MinecraftForge.EVENT_BUS.addListener(this::onRegisterCommands);
|
||||||
// 注册通用配置
|
// 注册通用配置
|
||||||
ModConfig.init();
|
ModConfig.init();
|
||||||
// 注册 InfinityBigIntegerCellInventory 的事件监听(tick flush 与停止时 flush)
|
// 注册 InfinityBigIntegerCellInventory 的事件监听(tick flush 与停止时 flush)
|
||||||
|
|
@ -123,4 +127,8 @@ public class ExtendedAEPlus {
|
||||||
InfinityStorageManager.getForLevel(serverLevel);
|
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.LongTag;
|
||||||
import net.minecraft.nbt.Tag;
|
import net.minecraft.nbt.Tag;
|
||||||
import net.minecraft.network.chat.Component;
|
import net.minecraft.network.chat.Component;
|
||||||
|
import net.minecraft.resources.ResourceLocation;
|
||||||
import net.minecraft.world.item.Item;
|
import net.minecraft.world.item.Item;
|
||||||
import net.minecraft.world.item.ItemStack;
|
import net.minecraft.world.item.ItemStack;
|
||||||
import net.minecraft.world.item.TooltipFlag;
|
import net.minecraft.world.item.TooltipFlag;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
|
import net.minecraftforge.registries.ForgeRegistries;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import java.math.BigInteger;
|
import java.math.BigInteger;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
public class InfinityBigIntegerCellItem extends Item {
|
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<>();
|
private final Map<UUID, InfinityDataStorage> cells = new HashMap<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 返回当前已加载的所有 UUID 的不可变视图,用于命令或调试用途
|
||||||
|
*/
|
||||||
|
public java.util.Set<UUID> getAllLoadedUUIDs() {
|
||||||
|
return java.util.Collections.unmodifiableSet(cells.keySet());
|
||||||
|
}
|
||||||
|
|
||||||
public InfinityStorageManager() {
|
public InfinityStorageManager() {
|
||||||
setDirty();
|
setDirty();
|
||||||
}
|
}
|
||||||
|
|
@ -203,6 +210,19 @@ public class InfinityStorageManager extends SavedData {
|
||||||
File file = level.getServer().getWorldPath(new LevelResource("data"))
|
File file = level.getServer().getWorldPath(new LevelResource("data"))
|
||||||
.resolve(FILE_NAME + ".dat").toFile();
|
.resolve(FILE_NAME + ".dat").toFile();
|
||||||
NbtIo.writeCompressed(nbt, file);
|
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) {
|
} catch (Throwable ex) {
|
||||||
LOGGER.info("InfinityStorageManager forceSaveAll error: {}", ex.getMessage());
|
LOGGER.info("InfinityStorageManager forceSaveAll error: {}", ex.getMessage());
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user