本篇教程由作者设定使用 CC BY-NC-ND 协议。
在等价交换重制版的简介里写着:
可是你发现实际测试下来还不如reloadEMC有用?该怎么办?答案很简单,自己做一个。
想要制作模组之前先读一下如何制作并且维护你的mod?(forge版)(只支持1.18.X)教程。
如何制作reloadEMC指令?
在moze_intel.projecte.network.commands里有一个ReloadEmcCMD.java文件。当时的指令是这么实现的
package moze_intel.projecte.network.commands;
import moze_intel.projecte.config.CustomEMCParser;
import moze_intel.projecte.emc.EMCMapper;
import moze_intel.projecte.network.PacketHandler;
import net.minecraft.command.CommandBase;
import net.minecraft.command.ICommandSender;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.text.TextComponentTranslation;
import javax.annotation.Nonnull;
public class ReloadEmcCMD extends CommandBase
{
@Nonnull
@Override
public String getName()
{
return "reloadEMC";
}
@Nonnull
@Override
public String getUsage(@Nonnull ICommandSender sender)
{
return "/projecte reloadEMC";
}
@Override
public void execute(@Nonnull MinecraftServer server, @Nonnull ICommandSender sender, @Nonnull String[] params)
{
sender.sendMessage(new TextComponentTranslation("pe.command.reload.started"));
EMCMapper.clearMaps();
CustomEMCParser.init();
EMCMapper.map();
sender.sendMessage(new TextComponentTranslation("pe.command.reload.success"));
PacketHandler.sendFragmentedEmcPacketToAll();
}
@Override
public int getRequiredPermissionLevel()
{
return 4;
}
}
虽然到了高版本大部分方法都已经变了,但是指令的核心方法没有变。
1.18.2的指令作为例子:
package github.com.gengyoubo.la.network.commands;
import com.mojang.brigadier.Command;
import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.context.CommandContext;
import moze_intel.projecte.config.CustomEMCParser;
import moze_intel.projecte.emc.EMCMappingHandler;
import moze_intel.projecte.network.PacketHandler;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.Commands;
import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.server.ReloadableServerResources;
import net.minecraft.server.packs.resources.ResourceManager;
import static moze_intel.projecte.emc.EMCMappingHandler.clearEmcMap;
public class ReloadEmcCMD implements Command<CommandSourceStack> {
public ReloadableServerResources serverResources;
public ResourceManager resourceManager;
@Override
public int run(CommandContext<CommandSourceStack> context) {
CommandSourceStack source = context.getSource();
source.sendSuccess(new TranslatableComponent("pe.command.reload.started"), true);
// 执行指令逻辑
clearEmcMap();
CustomEMCParser.init();
EMCMappingHandler.map(serverResources,resourceManager);
source.sendSuccess(new TranslatableComponent("pe.command.reload.success"), true);
// 发送更新包
PacketHandler.sendFragmentedEmcPacketToAll();
return 1;
}
public static void register(CommandDispatcher<CommandSourceStack> dispatcher) {
dispatcher.register(
Commands.literal("reloadEMC")
.requires(source -> source.hasPermission(4)) // 设置权限等级为4
.executes(new ReloadEmcCMD())
);
}
}
它的核心就是
clearEmcMap();
CustomEMCParser.init();
EMCMappingHandler.map(serverResources,resourceManager);
在1.12.2中,它是
EMCMapper.clearMaps();
CustomEMCParser.init();
EMCMapper.map();
或许你已经发现了,虽然把类的名称改了,但是核心方法没有变。只要像上面那样写就可以了。
演示
虽然和reload指令没有什么很大的区别。但是因为只加载EMC,所以很快,在使用整合包中很有用!
参考
/reloadEMC