本篇教程由作者设定使用 CC BY-NC-ND 协议。

在等价交换重制版的简介里写着:

如何让高版本也能reloadEMC?-第1张图片可是你发现实际测试下来还不如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();

或许你已经发现了,虽然把类的名称改了,但是核心方法没有变。只要像上面那样写就可以了。

演示

如何让高版本也能reloadEMC?-第2张图片

如何让高版本也能reloadEMC?-第3张图片

如何让高版本也能reloadEMC?-第4张图片

虽然和reload指令没有什么很大的区别。但是因为只加载EMC,所以很快,在使用整合包中很有用!

参考

/reloadEMC