1

我正在尝试第一次创建一个新命令,并且正在遵循这个稍微旧的教程 ,但我相信它仍然可以工作。完成后,我尝试运行我的 mod,一切都运行良好,但我的命令不存在。这是我的代码:

public class MainRegistry {
    @EventHandler
    public void serverStart(FMLServerStartingEvent event) {
        MinecraftServer server = MinecraftServer.getServer();
        ICommandManager command = server.getCommandManager();
        ServerCommandManager manager = (ServerCommandManager) command;
        manager.registerCommand(new FireBall5());
    }

}

我的实际CommandBase课程:

public class FireBall5 extends CommandBase {
    @Override
    public String getCommandName() {
        return "fireball 5";
    }

    @Override
    public String getCommandUsage(ICommandSender var1) {
        return "Shoots fireball with explosive power 5";
    }

    @Override
    public void processCommand(ICommandSender icommandsender, String[] var2) {
        if (icommandsender instanceof EntityPlayer) {
            EntityPlayer player = (EntityPlayer) icommandsender;
            World par2World = player.worldObj;
            if (!par2World.isRemote)
                par2World.spawnEntityInWorld(new PlayerFireBall(par2World, 5.0f));
        }

    }

}

它正在呼唤我自己创造的实体PlayerFireBall,只是一个增加了爆炸力的火球。

4

2 回答 2

2

有关此代码实际问题的修复,请参阅@Unihedron 答案。这个答案只是进一步清理了他的代码。

CommandBase您从中继承的实际上有几个静态方法,可以使从参数中解析数字等更加安全。

您可能想要使用的是:

  • CommandBase.parseDouble(ICommandSender, String)- 解析给定的字符串并安全返回一个双精度
  • CommandBase.parseDoubleWithMin(ICommandSender, String, int min)- 与上述相同,但具有所需的最小值
  • CommandBase.parseDoubleBounded(ICommandSender, String, int min, int max)- 同上,但也有上限

所有这些也有一个整数对应物。此外,对您的上下文没有用,但可能供将来使用是这样的:

  • CommandBase.parseBoolean(ICommandSender, String)- 解析给定的字符串并安全地返回一个布尔值

查看CommandBase该类以获取更多有用的静态方法。

因此,例如,而不是这样:

if (var2.length > 0) try {
    power = Float.parseFloat(var2[0]); // Parse the first argument.
} catch(NumberFormatException ex) {}

尝试这个:

 if(var2.length > 0){
    //bounded because you don't want a size less than 0, could really be anything
    power = CommandBase.parseDoubleWithMin(sender, var2[0], 0);
}

Minecraft 会自动告诉玩家输入是否有问题,并安全地将解析后的值返回给您。

祝你的模组好运,玩得开心!

于 2014-08-09T18:08:37.763 回答
2

命令不能包含空格。要执行您的命令,请按照以下步骤操作:

@Override
public String getCommandName() {
    return "fireball"; // Remove the argument - Leave the command only.
}

必须像这样读取参数:

{
    if (sender instanceof EntityPlayer) {
        final EntityPlayer player = (EntityPlayer) sender;
        final World par2World = player.worldObj;

        final float power;

    // The "default" method:
        // power = 5; // Write the default value here!
        if (var2.length > 0) try {
            power = Float.parseFloat(var2[0]); // Parse the first argument.
        } catch(NumberFormatException ex) {}

    // The "validation" method:
        if (var2.length == 0) {
            sender.sendMessage("You forgot to specify the fireball power.");
            return;
        }
        if ( !var2[0].matches("\\d{2}")) { // Asserts this argument is two digits
            sender.sendMessage("Incorrect.");
            return;
        }
        power = Float.parseFloat(var2[0]);

        if ( !par2World.isRemote)
            par2World.spawnEntityInWorld(new PlayerFireBall(par2World, power));
    }
}

阅读更多:

于 2014-08-08T15:45:20.880 回答