如何在Minecraft插件中调用原版命令实现世界边界自动缩小?
Minecraft插件调用世界边界命令的实现方案
能否在循环逻辑中直接调用原版命令
可以调用原版命令,但你给出的while+wait写法完全不可行:Minecraft服务端(Bukkit/Spigot/Paper等主流端)的主线程负责所有游戏逻辑运算,直接阻塞会导致整个服务端卡死,必须使用服务端内置的调度器实现定时逻辑。
具体实现方案
推荐优先使用原生API设置世界边界,无需执行命令,兼容性和稳定性更高,其次才是调用命令的方案:
方案1:原生API实现(推荐)
Spigot 1.8+版本已内置世界边界操作API,不需要调用命令:
import org.bukkit.World; import org.bukkit.WorldBorder; import org.bukkit.plugin.java.JavaPlugin; public class BorderPlugin extends JavaPlugin { private int currentSize = 1000; @Override public void onEnable() { // 初始化主世界边界为1000格 World overWorld = getServer().getWorld("world"); WorldBorder border = overWorld.getWorldBorder(); border.setSize(currentSize); // 启动定时调度任务,20tick=1秒,1小时对应72000tick getServer().getScheduler().runTaskTimer(this, () -> { if (currentSize <= 100) { // 边界缩小到下限后取消任务 getServer().getScheduler().cancelTasks(this); return; } currentSize -= 50; border.setSize(currentSize); }, 72000L, 72000L); } }
方案2:调用原版命令实现
如果你确实需要执行命令,使用Bukkit.dispatchCommand方法即可,注意命令不需要带前置斜杠:
// 以控制台身份执行命令,默认拥有所有命令权限 getServer().dispatchCommand(getServer().getConsoleSender(), "worldborder set " + (currentSize - 50));
注意事项
- 原版命令拼写为
worldborder,你示例中的worldboarder多了字母a,会导致命令执行失败 - 绝对不要在插件主线程使用
Thread.sleep、wait这类阻塞方法,所有定时逻辑必须用服务端调度器实现 - 原生API调用不受权限、其他命令修改类插件的影响,优先选择方案1实现
内容的提问来源于stack exchange,提问作者Cedric Valentin Piehl
相关产品推荐
相关产品推荐

