首先现在项目的run/mods目录中添加ChatCommandsManager模组以便于调试运行。

然后再在项目代码中添加一个用于判断模组是否含有ChatCommandsManager模组的函数。

例:

public static boolean hasAPI(){
    for(IModInfo modInfo: ModList.get().getMods()){
        if(modInfo.getModId().equals("ccm")) {
            return true;
        }
    }
    return false;
}

然后在主函数中调用此函数进行判断,如果没有则抛出RuntimeException,反之,则进行写配置文件的操作(在模组加载时写配置文件正常情况下并不会影响ChatCommandsManager对配置文件的读取,因为ChatCommandsManager模组默认会最后一个被加载。)。

例:

public POS() throws IOException {
    MinecraftForge.EVENT_BUS.register(this);
    init();     //主类中调用初始化函数。
}
public static void init() throws IOException {
    if(!hasAPI()){      //检测是否含有ChatCommandsManager模组。
        throw new RuntimeException("POS mod requires ChatCommandsManager mod!");
    }
    if(!new File("config/ccm/mods").exists()){      //检测并创建目录。
        new File("config/ccm/mods").mkdirs();
    }
    if(!new File("config/ccm/mods/fpos.json").exists()){       //检测并写配置文件。
        JsonObject object = new JsonObject();
        object.addProperty("name","fpos");    //写配置文件项“name”
        object.addProperty("id","pos");     //写配置文件项“id”
        object.addProperty("main","cn.ksmcbrigade.POS.Manager");         //写配置文件项“main”
        object.addProperty("function","runFPos");          //写配置文件项“function”
        Files.write(Paths.get("config/ccm/mods/fpos.json"),object.toString().getBytes());       //写配置到文件。
    }
}

以上代码可能会抛出IOException,请用 try/catch 包裹或添加异常签名(示例为添加异常签名),否则将无法正常编译运行。


接下来创建配置文件内指定的类文件,然后在类文件内添加对应的函数。

例:

package cn.ksmcbrigade.POS;

import net.minecraft.client.Minecraft;
import net.minecraft.network.chat.Component;
import net.minecraft.world.entity.player.Player;

import java.util.Arrays;

public class Manager {
    public static void runFPos(Player playera, String[] args){
        Player player = Minecraft.getInstance().player;
        if(Arrays.equals(args, new String[0])){
            player.sendMessage(Component.nullToEmpty("pos: "+player.getX()+","+player.getY()+","+player.getZ()),player.getUUID());
        }
        else{
            Player friend = null;
            for(Player entity:player.getLevel().getEntitiesOfClass(Player.class,player.getBoundingBox().inflate(1000))){
                if(entity.getName().getString().equals(args[0])){
                    friend = entity;
                }
            }
            if(friend==null){
                player.sendMessage(Component.nullToEmpty("Can't find friend!"),player.getUUID());
            }
            else{
                player.sendMessage(Component.nullToEmpty("pos: "+friend.getX()+","+friend.getY()+","+friend.getZ()),player.getUUID());
            }
        }
    }
}

提示:函数的player与args参数即使不用也一定要加上,否则输入指令时将会报错并导致游戏崩溃。

注意:需要将模组使用build导出后在启动器测试,在IDE内测试可能会报错。