当前位置: 首页 > 知识库问答 >
问题:

Minecraft Forge自定义玩家命令问题

李森
2023-03-14

我第一次尝试做一个新的命令,并遵循这个教程,虽然有点旧,但我相信它仍然有效。完成后,我试着运行我的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());
    }

}

和我实际的命令库类:

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,这是我自己创建的,只是一个爆炸威力增加的火球。

共有2个答案

左丘源
2023-03-14

请参阅@Unihedron answer,了解此代码实际问题的修复方法。这个答案更简单地清理了他的代码。

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

您可能想要使用的是:

  • 命令Base.parse双倍(ITokdSender, String)-解析给定的字符串并安全返回双倍
  • -与上述相同,但具有所需的最小值
  • ase.parseDoubleBackMin(ITokdSender,String,int min)
  • 命令Base.parse双重边界(ITokdSender,String,int min,int max)-同上,但也有上限

所有这些都有一个整数对应。此外,这对您的上下文没有用处,但可能用于将来:

    解析给定的字符串并安全返回一个布尔值

查看命令库类,了解更多有用的静态方法。

例如,与此相反:

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

《我的世界》会自动告诉玩家输入是否有问题,并安全地将解析后的值返回给你。

祝你的mod好运,玩得开心!

姚俊贤
2023-03-14

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

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

阅读更多:

  • 在Bukkit插件中读取参数作为奖励的整数
 类似资料:
  • 3.3 自定义命令 命令语法 定义命令与定义映射的用法其实很相似: :command {lhs} {rhs} 只不过在使用自定义命令时,{lhs} 是直接输入到命令行中的,当你按下回车时,vim 就将 {lhs} 替换为 {rhs} 再执行。所以这在形式上与下面这个映射等效: : nnoremap :{lhs}<CR> :{rhs}<CR> 当然,由于 :command 所支持的参数与 :ma

  • 问题内容: 我有一个名为“ example”的库,该库正在安装到我的全局site- packages目录中。但是,我希望能够安装两个版本,一个用于生产版本,一个用于测试版本(我有一个Web应用程序,而其他东西也都以这种方式进行了版本化)。 有没有一种方法可以指定,例如“ python setup.py stage”,它不仅可以将其他鸡蛋安装到站点程序包中,还可以将模块从“ example”重命名为

  • 假设我需要一个新的git命令gitnew,它生成一个新分支,该分支与origin/master是最新的。 是否有一种方法可以使此脚本在powershell的Windows上的所有存储库中都可用? 编辑:为了澄清我想要一个git脚本,而不是一个PowerShell函数。我提到PowerShell的唯一原因是因为我不使用git bash。

  • 应用服务启动可以在多个地方进行调整,以下介绍两种方案,Dockerfile 和 平台详情页调整 Dockerfile CMD启动方式 看一下简单的例子: FROM hub.kpaas.nsini.com/app/hello:v0.0.3 CMD ["/go/bin/hello"] 启动命令写在CMD这个后面,如果后面有多个参数可以以逗号隔开例如: CMD ["static-web", "-pa

  • 是否可以使用用户扩展在Selenium IDE中创建自定义命令.js并使其能够将自身更改为自定义导出格式,如果是这样,如何? 我将使用SeleniumIDE记录测试,这些测试将以完全自定义的Java格式导出,作为全自动测试系统的一部分运行。格式不是JUnit,而是每个测试都是它自己的类,并根据整个系统的输入动态加载。 我想要做的是在Selenium IDE中创建一个名为“take snapshot

  • 应用可以通过manage.py注册它们自己的动作。例如,你可能想为你正在发布的Django应用添加一个manage.py动作。在本页文档中,我们将为教程中的 polls应用构建一个自定义的 closepoll命令。 要做到这点,只需向该应用添加一个management/commands目录。Django将为该目录中名字没有以下划线开始的每个Python模块注册一个manage.py命令。例如: p