java 如何在Minecraft插件中使用正常的Minecraft命令?

3lxsmp7m  于 2022-12-02  发布在  Java
关注(0)|答案(2)|浏览(204)

我想编写一个Minecraft插件,我想使用Minecraft中的标准命令,如/worldboarder set命令。
具体来说,我想编写一个插件,设置1000块世界板,每小时它得到50块小。有可能在我的插件中循环使用标准命令吗?像命令/世界板设置1000和我如何在我的插件中使用它们。
我想这样做:

int distance = 1000;
while(distance > 100) {
    wait(3600000);
    // "/worldboarder set " + distance -50; // here how to run cmd ?
}
7eumitmz

7eumitmz1#

首先,你不能在服务器中使用wait函数,这会冻结整个服务器,这是一个大问题。你必须使用Scheduler(见下文)。
然后,要运行一个简单的注解,必须使用以下代码:

Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "mycmd arg1 arg2");

所以,你必须这样做:

private int border = 1000; // actual border value
private BukkitTask task; // bukkit task to cancel it

@Override
public void onEnable() {
   task = getServer().getScheduler().runTaskTimer(this, () -> { // start lambda expression
      Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "worldboarder set " + border); // run cmd
      if(border == 100) { // no longer need to change world border.
         task.cancel(); // cancel actual task to never run it again
         return;
      }
      border -= 50; // reduce border amount for next time
   }, 20, 60 * 60 * 20);
}

少量附加信息:

  • runTaskTimer方法接受的参数很少:插件、可运行的调度程序、开始前的时间(单位:tick)和每次调用之间的时间(单位:tick)
  • 20个刻度= 1秒。例如您希望每小时:60 * 60 =秒/小时,因此60 * 60 * 20 =滴答/小时
  • 开始前的时间是20(所以1 s),因为spigot在完全加载世界之前启动插件。所以它不会找到世界。而且它会在服务器完全启动后(所以在世界之后)开始运行调度程序。1 s只是为了确保,比如在启动时等待1 s不会改变游戏的任何内容。
  • 命令中不需要“/”。/是默认的字符来表示它是一个命令。比如在这里我们明确地说它是一个命令,我们就不必使用它。Example

文件:

mctunoxg

mctunoxg2#

在较新的bukkit版本中,可以使用bukkit.WorldBorder对象(https://hub.spigotmc.org/javadocs/spigot/org/bukkit/WorldBorder.html
可以通过先获取世界,然后获取其WorldBorder对象来修改世界的世界边界

World world = Bukkit.getWorld("world"); // Most of the time the default world is named "world"
WorldBorder border = world.getWorldBorder();

然后你就可以对世界边界为所欲为了

border.setSize(border.getSize() - 50); // Reduce the size of the border by 50 instantly

希望这将是有用的,如果有人发现这篇文章

相关问题