Проблемы с командами игроков в Minecraft Forge

1

Я пытаюсь сделать новую команду в первый раз и следовал этому учебнику, который немного стар, но я считаю, что он все равно будет работать. Закончив его, я попробовал запустить мой мод, и все прошло отлично, но моей команды не было. Вот мой код:

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 который я создал сам, и просто огненный шар с повышенной силой взрыва.

  • 0
    Я определил его как / firbeall 5, так как не знаю, как заставить команду принимать аргументы. Было бы полезно, если бы вы могли объяснить, как это сделать.
  • 0
    Кроме того, FML имеет очень хороший способ регистрации команд. Вместо всего, что есть в serverStart() , используйте event.registerServerCommand(new Fireball5()); Это гарантирует, что если MC когда-либо изменит способ выполнения команд, ваш код все равно будет работать нормально.
Теги:
minecraft
minecraft-forge

2 ответа

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));
    }
}

Прочитайте больше:

  • 1
    CommandBase также имеет несколько приятных функций для разбора входных параметров, таких как int, float и double. Если вы хотите немного упростить свой код, вы можете посмотреть на них.
2

См. Ответ @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 автоматически сообщит игроку, если что-то не так с ним, и безопасно вернет вам разобранное значение.

Удачи вам в моде и получайте удовольствие!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню