Я пытаюсь сделать новую команду в первый раз и следовал этому учебнику, который немного стар, но я считаю, что он все равно будет работать. Закончив его, я попробовал запустить мой мод, и все прошло отлично, но моей команды не было. Вот мой код:
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
который я создал сам, и просто огненный шар с повышенной силой взрыва.
Команды не могут содержать пробелы. Чтобы выполнить свою команду, выполните следующие действия:
@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));
}
}
Прочитайте больше:
См. Ответ @Unihedron для исправления фактической проблемы с этим кодом. Этот ответ просто очищает его код еще больше.
CommandBase
из которого вы наследуете на самом деле, имеет несколько статических методов, которые значительно упрощают разбор пар и такие аргументы.
Те, которые вы, возможно, захотите использовать:
CommandBase.parseDouble(ICommandSender, String)
- анализирует заданную строку и возвращает double безопасно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 автоматически сообщит игроку, если что-то не так с ним, и безопасно вернет вам разобранное значение.
Удачи вам в моде и получайте удовольствие!
serverStart()
, используйтеevent.registerServerCommand(new Fireball5());
Это гарантирует, что если MC когда-либо изменит способ выполнения команд, ваш код все равно будет работать нормально.