diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index 827ab813e..1de4e297a 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -64,6 +64,7 @@ use pocketmine\event\player\PlayerRespawnEvent; use pocketmine\event\player\PlayerToggleFlightEvent; use pocketmine\event\player\PlayerToggleSneakEvent; use pocketmine\event\player\PlayerToggleSprintEvent; +use pocketmine\event\player\PlayerTransferEvent; use pocketmine\event\server\DataPacketReceiveEvent; use pocketmine\event\server\DataPacketSendEvent; use pocketmine\event\TextContainer; @@ -127,6 +128,7 @@ use pocketmine\network\protocol\SetTimePacket; use pocketmine\network\protocol\StartGamePacket; use pocketmine\network\protocol\TakeItemEntityPacket; use pocketmine\network\protocol\TextPacket; +use pocketmine\network\protocol\TransferPacket; use pocketmine\network\protocol\UpdateAttributesPacket; use pocketmine\network\protocol\UpdateBlockPacket; use pocketmine\network\SourceInterface; @@ -2987,6 +2989,31 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade $timings->stopTiming(); } + /** + * Transfers a player to another server. + * + * @param string $address The IP address or hostname of the destination server + * @param int $port The destination port, defaults to 19132 + * @param string $message Message to show in the console when closing the player + * + * @return bool if transfer was successful. + */ + public function transfer(string $address, int $port = 19132, string $message = "transfer") : bool{ + $this->server->getPluginManager()->callEvent($ev = new PlayerTransferEvent($this, $address, $port, $message)); + + if(!$ev->isCancelled()){ + $pk = new TransferPacket(); + $pk->address = $ev->getAddress(); + $pk->port = $ev->getPort(); + $this->dataPacket($pk); + $this->close("", $ev->getMessage(), false); + + return true; + } + + return false; + } + /** * Kicks a player from the server * diff --git a/src/pocketmine/command/SimpleCommandMap.php b/src/pocketmine/command/SimpleCommandMap.php index 6d356ea2d..c1b54a2bd 100644 --- a/src/pocketmine/command/SimpleCommandMap.php +++ b/src/pocketmine/command/SimpleCommandMap.php @@ -57,6 +57,7 @@ use pocketmine\command\defaults\TeleportCommand; use pocketmine\command\defaults\TellCommand; use pocketmine\command\defaults\TimeCommand; use pocketmine\command\defaults\TimingsCommand; +use pocketmine\command\defaults\TransferServerCommand; use pocketmine\command\defaults\VanillaCommand; use pocketmine\command\defaults\VersionCommand; use pocketmine\command\defaults\WhitelistCommand; @@ -115,6 +116,7 @@ class SimpleCommandMap implements CommandMap{ $this->register("pocketmine", new TimeCommand("time")); $this->register("pocketmine", new TimingsCommand("timings")); $this->register("pocketmine", new ReloadCommand("reload")); + $this->register("pocketmine", new TransferServerCommand("transferserver")); if($this->server->getProperty("debug.commands", false)){ $this->register("pocketmine", new StatusCommand("status")); diff --git a/src/pocketmine/command/defaults/TransferServerCommand.php b/src/pocketmine/command/defaults/TransferServerCommand.php new file mode 100644 index 000000000..b87fccc6e --- /dev/null +++ b/src/pocketmine/command/defaults/TransferServerCommand.php @@ -0,0 +1,56 @@ +setPermission("pocketmine.command.transferserver"); + } + + public function execute(CommandSender $sender, $commandLabel, array $args){ + if(count($args) < 1){ + $sender->sendMessage(new TranslationContainer("commands.generic.usage", [$this->usageMessage])); + + return false; + }elseif(!($sender instanceof Player)){ + $sender->sendMessage("This command must be executed as a player"); + + return false; + } + + $sender->transfer($args[0], (int) ($args[1] ?? 19132)); + + return true; + } +} \ No newline at end of file diff --git a/src/pocketmine/event/player/PlayerTransferEvent.php b/src/pocketmine/event/player/PlayerTransferEvent.php new file mode 100644 index 000000000..f361f43d1 --- /dev/null +++ b/src/pocketmine/event/player/PlayerTransferEvent.php @@ -0,0 +1,66 @@ +player = $player; + $this->address = $address; + $this->port = $port; + $this->message = $message; + } + + public function getAddress() : string{ + return $this->address; + } + + public function setAddress(string $address){ + $this->address = $address; + } + + public function getPort() : int{ + return $this->port; + } + + public function setPort(int $port){ + $this->port = $port; + } + + public function getMessage() : string{ + return $this->message; + } + + public function setMessage(string $message){ + $this->message = $message; + } +} \ No newline at end of file diff --git a/src/pocketmine/lang/locale b/src/pocketmine/lang/locale index 3499fe4a6..7ac7004e2 160000 --- a/src/pocketmine/lang/locale +++ b/src/pocketmine/lang/locale @@ -1 +1 @@ -Subproject commit 3499fe4a6a1973cc965396f184eb01c52de79aa4 +Subproject commit 7ac7004e2dde7d3e424aef2514f1eb8b98192ea9