如何使用PocketMine-MP 4.0.0实现世界边界(限制玩家越界)?
PocketMine-MP 4.0.0 实现世界边界功能
核心思路
通过监听玩家移动事件,实时校验玩家坐标是否超出设定范围,若超出则强制将玩家位置修正到边界内,阻止越界移动。
具体实现步骤
- 注册事件监听器:在插件主类的
onEnable()方法中注册PlayerMoveEvent监听 - 定义边界参数:设置世界边界的最小/最大X、Z坐标(Y轴限制可选)
- 坐标校验逻辑:在事件回调中获取玩家当前位置,判断是否越界,越界则修正位置
完整代码示例
<?php namespace YourPluginNamespace; use pocketmine\plugin\PluginBase; use pocketmine\event\Listener; use pocketmine\event\player\PlayerMoveEvent; use pocketmine\math\Vector3; class Main extends PluginBase implements Listener { // 定义世界边界坐标(可按需修改) private const MIN_X = -100; private const MAX_X = 100; private const MIN_Z = -100; private const MAX_Z = 100; // 可选:添加Y轴高度限制 // private const MIN_Y = 0; // private const MAX_Y = 256; public function onEnable(): void { $this->getServer()->getPluginManager()->registerEvents($this, $this); $this->getLogger()->info("世界边界功能已启用"); } public function onPlayerMove(PlayerMoveEvent $event): void { $player = $event->getPlayer(); $newPos = $event->getTo(); // 修正X坐标到边界范围内 $x = max(self::MIN_X, min(self::MAX_X, $newPos->getX())); // 修正Z坐标到边界范围内 $z = max(self::MIN_Z, min(self::MAX_Z, $newPos->getZ())); // 可选:修正Y坐标 // $y = max(self::MIN_Y, min(self::MAX_Y, $newPos->getY())); // 若坐标存在修正,取消原移动并传送玩家到边界内 if($x !== $newPos->getX() || $z !== $newPos->getZ()){ $event->setCancelled(); // 保留原Y坐标,替换X/Z为边界内数值 $player->teleport(new Vector3($x, $newPos->getY(), $z)); // 可选:给玩家发送提示 // $player->sendMessage("已到达世界边界,无法继续前进"); } } }
注意事项
- 替换
YourPluginNamespace为你的插件实际命名空间 - 可根据需求调整边界坐标数值,或添加Y轴高度限制
- 若需要针对特定世界生效,可在事件中加入
$player->getWorld()->getName()的判断逻辑
内容的提问来源于stack exchange,提问作者NotU
相关产品推荐
相关产品推荐

