首页 > 其他分享 > 创建一个简单的命令

创建一个简单的命令

时间:2023-08-18 23:45:57浏览次数:34  
标签:sender 创建 玩家 命令 ItemStack CommandSender 简单 我们

创建一个简单的命令

设计命令

首先,你应该已经为这个命令想好了名字。在这个片段中,我们将使用 /kit 这个命令的例子。然而,这可以用你在自己的插件中选择使用的任何命令来代替。

建议为每个命令创建一个新的类,这样更有条理。你的类必须实现 CommandExecutor 接口。该类文件可能看起来类似于这样。

public class CommandKit implements CommandExecutor {

    // 当有人使用我们的命令时,将调用此方法
    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        return false;
    }
}

重命名参数,用一些代码填充方法主体。下面是每个参数的含义:

  • CommandSender 代表发送命令的东西。这可能是一个播放器,ConsoleCommandSender,或者 BlockCommandSender(一个命令块)。
  • 命令代表被调用的命令是什么。这几乎总是提前知道的。
  • label 表示发送者所输入的命令(不包括参数)的准确的第一个字。
  • args 是命令语句的剩余部分(不包括标签),由空格分割并放入一个数组中。

在为我们的示例命令向玩家提供物品之前,我们需要一个玩家对象。如果命令发送者是一个玩家,我们可以将其投递。在这种情况下,铸型将给我们带来对玩家对象的访问。

注意

onCommand 方法中传递给我们的 CommandSender 对象有时可以不用先投递给一个播放器。如果你想做的只是发送一个消息,那么检查它是否是一个玩家只是无谓地给你的代码增加杂乱无章的内容,并使你的命令的可用性稍微降低。

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        if (sender instanceof Player) {
            Player player = (Player) sender;
            // 在这里我们需要为我们的玩家提供物品
        }

        // 如果玩家(或控制台)正确使用我们的命令,我们可以返回 true
        return true;
    }

接下来,我们把物品交给我们的玩家。在这个例子中,我们将使用一颗钻石和 20 块砖。一个物品由一个 ItemStack 表示。所以让我们创建一个新的 ItemStack,并设置它们的数量。

我们的示例命令的代码将看起来像这样:

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        if (sender instanceof Player) {
            Player player = (Player) sender;

            // Create a new ItemStack (type: diamond)
            ItemStack diamond = new ItemStack(Material.DIAMOND);

            // Create a new ItemStack (type: brick)
            ItemStack bricks = new ItemStack(Material.BRICK);

            // Set the amount of the ItemStack
            bricks.setAmount(20);

            // Give the player our items (comma-seperated list of all ItemStack)
            player.getInventory().addItem(bricks, diamond);
        }

        // 如果玩家(或控制台)正确使用我们的命令,我们可以返回 true
        return true;
    }

Note

也可以通过创建一个新的ItemStack来直接设置金额,使用起来更容易,也更短:

ItemStack bricks = new ItemStack(Material.BRICK, 20);

注册命令

接下来,我们注册我们的命令。要做到这一点,请进入主类中的 onEnable() 方法。我们只需要添加如下高亮的一行:

    @Override
    public void onEnable() {
        // Register our command "kit" (set an instance of your command class as executor)
        this.getCommand("kit").setExecutor(new CommandKit());
    }

添加到 plugin.yml

最后一步是将我们的命令添加到 plugin.yml 中。打开它并添加与我们的例子类似的行,然后测试你的插件:

# Replace "kit" with the name of your command.
commands:
   kit:
      description: Your description
      usage: /<command>
      permission: yourplugin.yourcommandpermission

有些事情要记住:

  • 你在注册命令时使用的字符串必须与你的 plugin.yml 中使用的字符串相同。
  • 如果有必要,你可以用构造器参数提前初始化你的 CommandExecutor 实例,比如你的主插件类。
  • 在你的 onCommand 方法中,如果你想让 CommandSender 收到支配你的命令的正确用法的信息(如 plugin.yml 中定义的),返回 false。返回 true 以静静地停止执行。
  • 当一个无效的 CommandSender 试图使用一个命令时(例如当控制台使用/kit命令时),发送一个错误是推荐做法。

现在你已经完成了! 我们希望你学到了一些关于创建命令的基本知识。

标签:sender,创建,玩家,命令,ItemStack,CommandSender,简单,我们
From: https://www.cnblogs.com/iloveworld/p/17641833.html

相关文章

  • DOS命令
    盘符切换查看当前目录下的所有文件dir切换目录cdchangedirectorycd..cd/dE:cd/dD:\galcdgal清理屏幕cls(clearscreen)退出终端exit查看电脑的ipipconfig打开应用计算器clac画图mspaint记事本notepadping命令pingwww.baidu.com文件操作创建文......
  • 命令复习
    Linux命令Linux目录结构根目录/存放最经常使用的目录bin存放的是系统管理使用的系统管理程序sbin存放设备文件dev存放配置文件etc存放用户安装应用程序的文件usr普通用户家目录/属主目录home系统管理员root用户的家目录root系统识别一些设备,会......
  • C#.Net6 WebAPI制作简单自定义Token验证
    一、创建自定义类MyMiddleware继承中间件IMiddleware并实现接口二、在实现接口中的方法编写Token验证逻辑三、在WebAPI的Program类中的builder里注入自定义的类和app里配置自定义中间件builder.Services.AddScoped(typeof(MyMiddleware));app.UseMiddleware(typeof(MyMidd......
  • shell命令-补充
    1.whilewhilereadline 实现输出符合要求的行2.case基本结构进阶:在case外套用while实现循环输出实现简易计算器:3.grep作用Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep全称是GlobalRegularExpressionPrin......
  • kafka——命令备份——docker 启动
    dockerrun-d\--namezookeeper\-p2181:2181\-eZOOKEEPER_CLIENT_PORT=2181\confluentinc/cp-zookeeperdockerrun-d\--namekafka\-p9092:9092\-eKAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.1.100:9092\......
  • find -exec 命令后面的\;和+
    一个-exec只能执行一个命令,而且必须在命令后面加上终结符,终结符有两个:“;”和“+”。其中“;”会对每一个find到的文件去执行一次cmd命令。而”+“让find到的文件一次性执行完cmd命令。为什么必须有终结符?因为一个find后面可以有多个-execcmd,所以必须要有终结符分割他们。如果不......
  • Linux基础命令
    文件目录操作命令: 0.查看文件:ls[-al][dir]  :显示指定目录下的文件内容,-a表示显示所有,包括隐藏文件 1.切换工作路径:cd[dirName] ~ 表示用户的home目录.  表示目前所在的目录.. 表示当前目录的上级目录 2.显示文件内容:cat[-n]fileName-n表示有1开始输出带行数......
  • 【Oracle RAC Database】创建ASM磁盘组与RAC Database
    [grid@node01~]$asmca[oracle@node01~]$dbca[grid@node01~]$crsctlstatusres-t--------------------------------------------------------------------------------NAMETARGETSTATESERVERSTATE_DETAILS---------......
  • 【学习笔记】简单数论-同余
    同余若整数\(a\)和整数\(b\)除以正整数\(m\)的余数相等,则称\(a,b\)模\(m\)同余,记为\(a\equivb\pmod{p}\)。性质自反性:\(a\equiva\pmod{p}\)对称性:若\(a\equivb\pmod{p}\),则\(b\equiva\pmod{p}\)。传递性:若\(a\equivb\pmod{p},b\equiv......
  • 【学习笔记】简单数论-快速幂
    luoguP1226【模板】快速幂|取余运算#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#definesortstable_sort#defineendl'\n'llqpow(lla,llb,llp){llans=1;while(b>0){if(b&1){......