首先现在项目的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内测试可能会报错。