Localized remaining disconnection screens (except one or two that should never actually happen)

This commit is contained in:
Dylan K. Taylor 2022-12-27 20:05:59 +00:00
parent 6b8b7311f0
commit 7ac6bd79a9
No known key found for this signature in database
GPG Key ID: 8927471A91CAFD3D
16 changed files with 486 additions and 43 deletions

View File

@ -43,7 +43,7 @@
"pocketmine/classloader": "^0.2.0", "pocketmine/classloader": "^0.2.0",
"pocketmine/color": "^0.2.0", "pocketmine/color": "^0.2.0",
"pocketmine/errorhandler": "^0.6.0", "pocketmine/errorhandler": "^0.6.0",
"pocketmine/locale-data": "~2.11.0", "pocketmine/locale-data": "~2.15.0",
"pocketmine/log": "^0.4.0", "pocketmine/log": "^0.4.0",
"pocketmine/log-pthreads": "^0.4.0", "pocketmine/log-pthreads": "^0.4.0",
"pocketmine/math": "^0.4.0", "pocketmine/math": "^0.4.0",

14
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "2d4da4bb4787764fbe706a04311c3cbf", "content-hash": "d833363f328eda3b1e080c3c5a7c76a4",
"packages": [ "packages": [
{ {
"name": "adhocore/json-comment", "name": "adhocore/json-comment",
@ -591,16 +591,16 @@
}, },
{ {
"name": "pocketmine/locale-data", "name": "pocketmine/locale-data",
"version": "2.11.0", "version": "2.15.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/pmmp/Language.git", "url": "https://github.com/pmmp/Language.git",
"reference": "4b33d8fa53eda53d9662a7478806ebae2e4a5c53" "reference": "87feaefdd8364730a2350e58fa274b1b493a9d3f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/pmmp/Language/zipball/4b33d8fa53eda53d9662a7478806ebae2e4a5c53", "url": "https://api.github.com/repos/pmmp/Language/zipball/87feaefdd8364730a2350e58fa274b1b493a9d3f",
"reference": "4b33d8fa53eda53d9662a7478806ebae2e4a5c53", "reference": "87feaefdd8364730a2350e58fa274b1b493a9d3f",
"shasum": "" "shasum": ""
}, },
"type": "library", "type": "library",
@ -608,9 +608,9 @@
"description": "Language resources used by PocketMine-MP", "description": "Language resources used by PocketMine-MP",
"support": { "support": {
"issues": "https://github.com/pmmp/Language/issues", "issues": "https://github.com/pmmp/Language/issues",
"source": "https://github.com/pmmp/Language/tree/2.11.0" "source": "https://github.com/pmmp/Language/tree/2.15.0"
}, },
"time": "2022-11-25T14:24:34+00:00" "time": "2022-12-27T19:59:39+00:00"
}, },
{ {
"name": "pocketmine/log", "name": "pocketmine/log",

View File

@ -567,7 +567,8 @@ class Server{
}, },
static function() use ($playerPromiseResolver, $session) : void{ static function() use ($playerPromiseResolver, $session) : void{
if($session->isConnected()){ if($session->isConnected()){
$session->disconnect("Spawn terrain generation failed"); $session->getLogger()->error("Spawn terrain generation failed");
$session->disconnectWithError(KnownTranslationFactory::pocketmine_disconnect_error_internal());
} }
$playerPromiseResolver->reject(); $playerPromiseResolver->reject();
} }

View File

@ -55,7 +55,7 @@ class BanCommand extends VanillaCommand{
$sender->getServer()->getNameBans()->addBan($name, $reason, null, $sender->getName()); $sender->getServer()->getNameBans()->addBan($name, $reason, null, $sender->getName());
if(($player = $sender->getServer()->getPlayerExact($name)) instanceof Player){ if(($player = $sender->getServer()->getPlayerExact($name)) instanceof Player){
$player->kick($reason !== "" ? "Banned by admin. Reason: " . $reason : "Banned by admin."); $player->kick($reason !== "" ? KnownTranslationFactory::pocketmine_disconnect_ban($reason) : KnownTranslationFactory::pocketmine_disconnect_ban_noReason());
} }
Command::broadcastCommandMessage($sender, KnownTranslationFactory::commands_ban_success($player !== null ? $player->getName() : $name)); Command::broadcastCommandMessage($sender, KnownTranslationFactory::commands_ban_success($player !== null ? $player->getName() : $name));

View File

@ -78,7 +78,7 @@ class BanIpCommand extends VanillaCommand{
foreach($sender->getServer()->getOnlinePlayers() as $player){ foreach($sender->getServer()->getOnlinePlayers() as $player){
if($player->getNetworkSession()->getIp() === $ip){ if($player->getNetworkSession()->getIp() === $ip){
$player->kick("Banned by admin. Reason: " . ($reason !== "" ? $reason : "IP banned.")); $player->kick(KnownTranslationFactory::pocketmine_disconnect_ban($reason !== "" ? $reason : KnownTranslationFactory::pocketmine_disconnect_ban_ip()));
} }
} }

View File

@ -55,7 +55,7 @@ class KickCommand extends VanillaCommand{
$reason = trim(implode(" ", $args)); $reason = trim(implode(" ", $args));
if(($player = $sender->getServer()->getPlayerByPrefix($name)) instanceof Player){ if(($player = $sender->getServer()->getPlayerByPrefix($name)) instanceof Player){
$player->kick("Kicked by admin." . ($reason !== "" ? " Reason: " . $reason : "")); $player->kick($reason !== "" ? KnownTranslationFactory::pocketmine_disconnect_kick($reason) : KnownTranslationFactory::pocketmine_disconnect_kick_noReason());
if($reason !== ""){ if($reason !== ""){
Command::broadcastCommandMessage($sender, KnownTranslationFactory::commands_kick_success_reason($player->getName(), $reason)); Command::broadcastCommandMessage($sender, KnownTranslationFactory::commands_kick_success_reason($player->getName(), $reason));
}else{ }else{

View File

@ -122,7 +122,7 @@ class WhitelistCommand extends VanillaCommand{
$server = $sender->getServer(); $server = $sender->getServer();
$server->removeWhitelist($args[1]); $server->removeWhitelist($args[1]);
if(!$server->isWhitelisted($args[1])){ if(!$server->isWhitelisted($args[1])){
$server->getPlayerExact($args[1])?->kick("Server whitelisted."); $server->getPlayerExact($args[1])?->kick(KnownTranslationFactory::pocketmine_disconnect_kick(KnownTranslationFactory::pocketmine_disconnect_whitelisted()));
} }
Command::broadcastCommandMessage($sender, KnownTranslationFactory::commands_whitelist_remove_success($args[1])); Command::broadcastCommandMessage($sender, KnownTranslationFactory::commands_whitelist_remove_success($args[1]));
} }
@ -135,9 +135,10 @@ class WhitelistCommand extends VanillaCommand{
} }
private function kickNonWhitelistedPlayers(Server $server) : void{ private function kickNonWhitelistedPlayers(Server $server) : void{
$message = KnownTranslationFactory::pocketmine_disconnect_kick(KnownTranslationFactory::pocketmine_disconnect_whitelisted());
foreach($server->getOnlinePlayers() as $player){ foreach($server->getOnlinePlayers() as $player){
if(!$server->isWhitelisted($player->getName())){ if(!$server->isWhitelisted($player->getName())){
$player->kick("Server whitelisted."); $player->kick($message);
} }
} }
} }

View File

@ -26,6 +26,7 @@ namespace pocketmine\event\player;
use pocketmine\event\Cancellable; use pocketmine\event\Cancellable;
use pocketmine\event\CancellableTrait; use pocketmine\event\CancellableTrait;
use pocketmine\event\Event; use pocketmine\event\Event;
use pocketmine\lang\KnownTranslationFactory;
use pocketmine\lang\Translatable; use pocketmine\lang\Translatable;
use pocketmine\network\mcpe\NetworkSession; use pocketmine\network\mcpe\NetworkSession;
@ -36,12 +37,14 @@ use pocketmine\network\mcpe\NetworkSession;
class PlayerDuplicateLoginEvent extends Event implements Cancellable{ class PlayerDuplicateLoginEvent extends Event implements Cancellable{
use CancellableTrait; use CancellableTrait;
private Translatable|string $disconnectMessage = "Logged in from another location"; private Translatable|string $disconnectMessage;
public function __construct( public function __construct(
private NetworkSession $connectingSession, private NetworkSession $connectingSession,
private NetworkSession $existingSession private NetworkSession $existingSession
){} ){
$this->disconnectMessage = KnownTranslationFactory::disconnectionScreen_loggedinOtherLocation();
}
public function getConnectingSession() : NetworkSession{ public function getConnectingSession() : NetworkSession{
return $this->connectingSession; return $this->connectingSession;

View File

@ -25,6 +25,7 @@ namespace pocketmine\event\player;
use pocketmine\event\Cancellable; use pocketmine\event\Cancellable;
use pocketmine\event\CancellableTrait; use pocketmine\event\CancellableTrait;
use pocketmine\lang\Translatable;
use pocketmine\player\Player; use pocketmine\player\Player;
/** /**
@ -37,7 +38,7 @@ class PlayerTransferEvent extends PlayerEvent implements Cancellable{
Player $player, Player $player,
protected string $address, protected string $address,
protected int $port, protected int $port,
protected string $message protected Translatable|string $message
){ ){
$this->player = $player; $this->player = $player;
} }
@ -73,14 +74,14 @@ class PlayerTransferEvent extends PlayerEvent implements Cancellable{
/** /**
* Returns the disconnect reason shown in the server log and on the console. * Returns the disconnect reason shown in the server log and on the console.
*/ */
public function getMessage() : string{ public function getMessage() : Translatable|string{
return $this->message; return $this->message;
} }
/** /**
* Sets the disconnect reason shown in the server log and on the console. * Sets the disconnect reason shown in the server log and on the console.
*/ */
public function setMessage(string $message) : void{ public function setMessage(Translatable|string $message) : void{
$this->message = $message; $this->message = $message;
} }
} }

View File

@ -661,6 +661,12 @@ final class KnownTranslationFactory{
]); ]);
} }
public static function death_attack_fireworks(Translatable|string $param0) : Translatable{
return new Translatable(KnownTranslationKeys::DEATH_ATTACK_FIREWORKS, [
0 => $param0,
]);
}
public static function death_attack_generic(Translatable|string $param0) : Translatable{ public static function death_attack_generic(Translatable|string $param0) : Translatable{
return new Translatable(KnownTranslationKeys::DEATH_ATTACK_GENERIC, [ return new Translatable(KnownTranslationKeys::DEATH_ATTACK_GENERIC, [
0 => $param0, 0 => $param0,
@ -760,6 +766,10 @@ final class KnownTranslationFactory{
return new Translatable(KnownTranslationKeys::DISCONNECTIONSCREEN_INVALIDSKIN, []); return new Translatable(KnownTranslationKeys::DISCONNECTIONSCREEN_INVALIDSKIN, []);
} }
public static function disconnectionScreen_loggedinOtherLocation() : Translatable{
return new Translatable(KnownTranslationKeys::DISCONNECTIONSCREEN_LOGGEDINOTHERLOCATION, []);
}
public static function disconnectionScreen_noReason() : Translatable{ public static function disconnectionScreen_noReason() : Translatable{
return new Translatable(KnownTranslationKeys::DISCONNECTIONSCREEN_NOREASON, []); return new Translatable(KnownTranslationKeys::DISCONNECTIONSCREEN_NOREASON, []);
} }
@ -1574,6 +1584,47 @@ final class KnownTranslationFactory{
return new Translatable(KnownTranslationKeys::POCKETMINE_DEBUG_ENABLE, []); return new Translatable(KnownTranslationKeys::POCKETMINE_DEBUG_ENABLE, []);
} }
public static function pocketmine_disconnect_ban(Translatable|string $reason) : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_BAN, [
"reason" => $reason,
]);
}
public static function pocketmine_disconnect_ban_hardcore() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_BAN_HARDCORE, []);
}
public static function pocketmine_disconnect_ban_ip() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_BAN_IP, []);
}
public static function pocketmine_disconnect_ban_noReason() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_BAN_NOREASON, []);
}
public static function pocketmine_disconnect_error(Translatable|string $error, Translatable|string $errorId) : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_ERROR, [
"error" => $error,
"errorId" => $errorId,
]);
}
public static function pocketmine_disconnect_error_authentication() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_ERROR_AUTHENTICATION, []);
}
public static function pocketmine_disconnect_error_badPacket() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_ERROR_BADPACKET, []);
}
public static function pocketmine_disconnect_error_internal() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_ERROR_INTERNAL, []);
}
public static function pocketmine_disconnect_error_loginTimeout() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_ERROR_LOGINTIMEOUT, []);
}
public static function pocketmine_disconnect_incompatibleProtocol(Translatable|string $param0) : Translatable{ public static function pocketmine_disconnect_incompatibleProtocol(Translatable|string $param0) : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_INCOMPATIBLEPROTOCOL, [ return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_INCOMPATIBLEPROTOCOL, [
0 => $param0, 0 => $param0,
@ -1602,6 +1653,28 @@ final class KnownTranslationFactory{
return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_INVALIDSESSION_TOOLATE, []); return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_INVALIDSESSION_TOOLATE, []);
} }
public static function pocketmine_disconnect_kick(Translatable|string $reason) : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_KICK, [
"reason" => $reason,
]);
}
public static function pocketmine_disconnect_kick_noReason() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_KICK_NOREASON, []);
}
public static function pocketmine_disconnect_transfer() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_TRANSFER, []);
}
public static function pocketmine_disconnect_whitelisted() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_WHITELISTED, []);
}
public static function pocketmine_disconnect_xblImpersonation() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_DISCONNECT_XBLIMPERSONATION, []);
}
public static function pocketmine_level_ambiguousFormat(Translatable|string $param0) : Translatable{ public static function pocketmine_level_ambiguousFormat(Translatable|string $param0) : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_LEVEL_AMBIGUOUSFORMAT, [ return new Translatable(KnownTranslationKeys::POCKETMINE_LEVEL_AMBIGUOUSFORMAT, [
0 => $param0, 0 => $param0,
@ -1707,6 +1780,274 @@ final class KnownTranslationFactory{
]); ]);
} }
public static function pocketmine_network_session_close(Translatable|string $reason) : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_NETWORK_SESSION_CLOSE, [
"reason" => $reason,
]);
}
public static function pocketmine_network_session_open() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_NETWORK_SESSION_OPEN, []);
}
public static function pocketmine_network_session_playerName(Translatable|string $playerName) : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_NETWORK_SESSION_PLAYERNAME, [
"playerName" => $playerName,
]);
}
public static function pocketmine_permission_broadcast_admin() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_BROADCAST_ADMIN, []);
}
public static function pocketmine_permission_broadcast_user() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_BROADCAST_USER, []);
}
public static function pocketmine_permission_command_ban_ip() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_BAN_IP, []);
}
public static function pocketmine_permission_command_ban_list() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_BAN_LIST, []);
}
public static function pocketmine_permission_command_ban_player() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_BAN_PLAYER, []);
}
public static function pocketmine_permission_command_clear_other() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_CLEAR_OTHER, []);
}
public static function pocketmine_permission_command_clear_self() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_CLEAR_SELF, []);
}
public static function pocketmine_permission_command_defaultgamemode() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_DEFAULTGAMEMODE, []);
}
public static function pocketmine_permission_command_difficulty() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_DIFFICULTY, []);
}
public static function pocketmine_permission_command_dumpmemory() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_DUMPMEMORY, []);
}
public static function pocketmine_permission_command_effect_other() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_EFFECT_OTHER, []);
}
public static function pocketmine_permission_command_effect_self() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_EFFECT_SELF, []);
}
public static function pocketmine_permission_command_enchant_other() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_ENCHANT_OTHER, []);
}
public static function pocketmine_permission_command_enchant_self() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_ENCHANT_SELF, []);
}
public static function pocketmine_permission_command_gamemode_other() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_GAMEMODE_OTHER, []);
}
public static function pocketmine_permission_command_gamemode_self() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_GAMEMODE_SELF, []);
}
public static function pocketmine_permission_command_gc() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_GC, []);
}
public static function pocketmine_permission_command_give_other() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_GIVE_OTHER, []);
}
public static function pocketmine_permission_command_give_self() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_GIVE_SELF, []);
}
public static function pocketmine_permission_command_help() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_HELP, []);
}
public static function pocketmine_permission_command_kick() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_KICK, []);
}
public static function pocketmine_permission_command_kill_other() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_KILL_OTHER, []);
}
public static function pocketmine_permission_command_kill_self() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_KILL_SELF, []);
}
public static function pocketmine_permission_command_list() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_LIST, []);
}
public static function pocketmine_permission_command_me() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_ME, []);
}
public static function pocketmine_permission_command_op_give() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_OP_GIVE, []);
}
public static function pocketmine_permission_command_op_take() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_OP_TAKE, []);
}
public static function pocketmine_permission_command_particle() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_PARTICLE, []);
}
public static function pocketmine_permission_command_plugins() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_PLUGINS, []);
}
public static function pocketmine_permission_command_save_disable() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_SAVE_DISABLE, []);
}
public static function pocketmine_permission_command_save_enable() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_SAVE_ENABLE, []);
}
public static function pocketmine_permission_command_save_perform() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_SAVE_PERFORM, []);
}
public static function pocketmine_permission_command_say() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_SAY, []);
}
public static function pocketmine_permission_command_seed() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_SEED, []);
}
public static function pocketmine_permission_command_setworldspawn() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_SETWORLDSPAWN, []);
}
public static function pocketmine_permission_command_spawnpoint_other() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_SPAWNPOINT_OTHER, []);
}
public static function pocketmine_permission_command_spawnpoint_self() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_SPAWNPOINT_SELF, []);
}
public static function pocketmine_permission_command_status() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_STATUS, []);
}
public static function pocketmine_permission_command_stop() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_STOP, []);
}
public static function pocketmine_permission_command_teleport_other() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_TELEPORT_OTHER, []);
}
public static function pocketmine_permission_command_teleport_self() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_TELEPORT_SELF, []);
}
public static function pocketmine_permission_command_tell() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_TELL, []);
}
public static function pocketmine_permission_command_time_add() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_TIME_ADD, []);
}
public static function pocketmine_permission_command_time_query() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_TIME_QUERY, []);
}
public static function pocketmine_permission_command_time_set() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_TIME_SET, []);
}
public static function pocketmine_permission_command_time_start() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_TIME_START, []);
}
public static function pocketmine_permission_command_time_stop() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_TIME_STOP, []);
}
public static function pocketmine_permission_command_timings() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_TIMINGS, []);
}
public static function pocketmine_permission_command_title_other() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_TITLE_OTHER, []);
}
public static function pocketmine_permission_command_title_self() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_TITLE_SELF, []);
}
public static function pocketmine_permission_command_transferserver() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_TRANSFERSERVER, []);
}
public static function pocketmine_permission_command_unban_ip() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_UNBAN_IP, []);
}
public static function pocketmine_permission_command_unban_player() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_UNBAN_PLAYER, []);
}
public static function pocketmine_permission_command_version() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_VERSION, []);
}
public static function pocketmine_permission_command_whitelist_add() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_WHITELIST_ADD, []);
}
public static function pocketmine_permission_command_whitelist_disable() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_WHITELIST_DISABLE, []);
}
public static function pocketmine_permission_command_whitelist_enable() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_WHITELIST_ENABLE, []);
}
public static function pocketmine_permission_command_whitelist_list() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_WHITELIST_LIST, []);
}
public static function pocketmine_permission_command_whitelist_reload() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_WHITELIST_RELOAD, []);
}
public static function pocketmine_permission_command_whitelist_remove() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_WHITELIST_REMOVE, []);
}
public static function pocketmine_permission_group_console() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_GROUP_CONSOLE, []);
}
public static function pocketmine_permission_group_operator() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_GROUP_OPERATOR, []);
}
public static function pocketmine_permission_group_user() : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_GROUP_USER, []);
}
public static function pocketmine_player_invalidEntity(Translatable|string $param0) : Translatable{ public static function pocketmine_player_invalidEntity(Translatable|string $param0) : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PLAYER_INVALIDENTITY, [ return new Translatable(KnownTranslationKeys::POCKETMINE_PLAYER_INVALIDENTITY, [
0 => $param0, 0 => $param0,

View File

@ -146,6 +146,7 @@ final class KnownTranslationKeys{
public const DEATH_ATTACK_EXPLOSION_PLAYER = "death.attack.explosion.player"; public const DEATH_ATTACK_EXPLOSION_PLAYER = "death.attack.explosion.player";
public const DEATH_ATTACK_FALL = "death.attack.fall"; public const DEATH_ATTACK_FALL = "death.attack.fall";
public const DEATH_ATTACK_FALLINGBLOCK = "death.attack.fallingBlock"; public const DEATH_ATTACK_FALLINGBLOCK = "death.attack.fallingBlock";
public const DEATH_ATTACK_FIREWORKS = "death.attack.fireworks";
public const DEATH_ATTACK_GENERIC = "death.attack.generic"; public const DEATH_ATTACK_GENERIC = "death.attack.generic";
public const DEATH_ATTACK_INFIRE = "death.attack.inFire"; public const DEATH_ATTACK_INFIRE = "death.attack.inFire";
public const DEATH_ATTACK_INWALL = "death.attack.inWall"; public const DEATH_ATTACK_INWALL = "death.attack.inWall";
@ -163,6 +164,7 @@ final class KnownTranslationKeys{
public const DEFAULT_VALUES_INFO = "default_values_info"; public const DEFAULT_VALUES_INFO = "default_values_info";
public const DISCONNECTIONSCREEN_INVALIDNAME = "disconnectionScreen.invalidName"; public const DISCONNECTIONSCREEN_INVALIDNAME = "disconnectionScreen.invalidName";
public const DISCONNECTIONSCREEN_INVALIDSKIN = "disconnectionScreen.invalidSkin"; public const DISCONNECTIONSCREEN_INVALIDSKIN = "disconnectionScreen.invalidSkin";
public const DISCONNECTIONSCREEN_LOGGEDINOTHERLOCATION = "disconnectionScreen.loggedinOtherLocation";
public const DISCONNECTIONSCREEN_NOREASON = "disconnectionScreen.noReason"; public const DISCONNECTIONSCREEN_NOREASON = "disconnectionScreen.noReason";
public const DISCONNECTIONSCREEN_NOTAUTHENTICATED = "disconnectionScreen.notAuthenticated"; public const DISCONNECTIONSCREEN_NOTAUTHENTICATED = "disconnectionScreen.notAuthenticated";
public const DISCONNECTIONSCREEN_OUTDATEDCLIENT = "disconnectionScreen.outdatedClient"; public const DISCONNECTIONSCREEN_OUTDATEDCLIENT = "disconnectionScreen.outdatedClient";
@ -342,12 +344,26 @@ final class KnownTranslationKeys{
public const POCKETMINE_DATA_PLAYEROLD = "pocketmine.data.playerOld"; public const POCKETMINE_DATA_PLAYEROLD = "pocketmine.data.playerOld";
public const POCKETMINE_DATA_SAVEERROR = "pocketmine.data.saveError"; public const POCKETMINE_DATA_SAVEERROR = "pocketmine.data.saveError";
public const POCKETMINE_DEBUG_ENABLE = "pocketmine.debug.enable"; public const POCKETMINE_DEBUG_ENABLE = "pocketmine.debug.enable";
public const POCKETMINE_DISCONNECT_BAN = "pocketmine.disconnect.ban";
public const POCKETMINE_DISCONNECT_BAN_HARDCORE = "pocketmine.disconnect.ban.hardcore";
public const POCKETMINE_DISCONNECT_BAN_IP = "pocketmine.disconnect.ban.ip";
public const POCKETMINE_DISCONNECT_BAN_NOREASON = "pocketmine.disconnect.ban.noReason";
public const POCKETMINE_DISCONNECT_ERROR = "pocketmine.disconnect.error";
public const POCKETMINE_DISCONNECT_ERROR_AUTHENTICATION = "pocketmine.disconnect.error.authentication";
public const POCKETMINE_DISCONNECT_ERROR_BADPACKET = "pocketmine.disconnect.error.badPacket";
public const POCKETMINE_DISCONNECT_ERROR_INTERNAL = "pocketmine.disconnect.error.internal";
public const POCKETMINE_DISCONNECT_ERROR_LOGINTIMEOUT = "pocketmine.disconnect.error.loginTimeout";
public const POCKETMINE_DISCONNECT_INCOMPATIBLEPROTOCOL = "pocketmine.disconnect.incompatibleProtocol"; public const POCKETMINE_DISCONNECT_INCOMPATIBLEPROTOCOL = "pocketmine.disconnect.incompatibleProtocol";
public const POCKETMINE_DISCONNECT_INVALIDSESSION = "pocketmine.disconnect.invalidSession"; public const POCKETMINE_DISCONNECT_INVALIDSESSION = "pocketmine.disconnect.invalidSession";
public const POCKETMINE_DISCONNECT_INVALIDSESSION_BADSIGNATURE = "pocketmine.disconnect.invalidSession.badSignature"; public const POCKETMINE_DISCONNECT_INVALIDSESSION_BADSIGNATURE = "pocketmine.disconnect.invalidSession.badSignature";
public const POCKETMINE_DISCONNECT_INVALIDSESSION_MISSINGKEY = "pocketmine.disconnect.invalidSession.missingKey"; public const POCKETMINE_DISCONNECT_INVALIDSESSION_MISSINGKEY = "pocketmine.disconnect.invalidSession.missingKey";
public const POCKETMINE_DISCONNECT_INVALIDSESSION_TOOEARLY = "pocketmine.disconnect.invalidSession.tooEarly"; public const POCKETMINE_DISCONNECT_INVALIDSESSION_TOOEARLY = "pocketmine.disconnect.invalidSession.tooEarly";
public const POCKETMINE_DISCONNECT_INVALIDSESSION_TOOLATE = "pocketmine.disconnect.invalidSession.tooLate"; public const POCKETMINE_DISCONNECT_INVALIDSESSION_TOOLATE = "pocketmine.disconnect.invalidSession.tooLate";
public const POCKETMINE_DISCONNECT_KICK = "pocketmine.disconnect.kick";
public const POCKETMINE_DISCONNECT_KICK_NOREASON = "pocketmine.disconnect.kick.noReason";
public const POCKETMINE_DISCONNECT_TRANSFER = "pocketmine.disconnect.transfer";
public const POCKETMINE_DISCONNECT_WHITELISTED = "pocketmine.disconnect.whitelisted";
public const POCKETMINE_DISCONNECT_XBLIMPERSONATION = "pocketmine.disconnect.xblImpersonation";
public const POCKETMINE_LEVEL_AMBIGUOUSFORMAT = "pocketmine.level.ambiguousFormat"; public const POCKETMINE_LEVEL_AMBIGUOUSFORMAT = "pocketmine.level.ambiguousFormat";
public const POCKETMINE_LEVEL_BACKGROUNDGENERATION = "pocketmine.level.backgroundGeneration"; public const POCKETMINE_LEVEL_BACKGROUNDGENERATION = "pocketmine.level.backgroundGeneration";
public const POCKETMINE_LEVEL_BADDEFAULTFORMAT = "pocketmine.level.badDefaultFormat"; public const POCKETMINE_LEVEL_BADDEFAULTFORMAT = "pocketmine.level.badDefaultFormat";
@ -365,6 +381,72 @@ final class KnownTranslationKeys{
public const POCKETMINE_LEVEL_UNKNOWNGENERATOR = "pocketmine.level.unknownGenerator"; public const POCKETMINE_LEVEL_UNKNOWNGENERATOR = "pocketmine.level.unknownGenerator";
public const POCKETMINE_LEVEL_UNLOADING = "pocketmine.level.unloading"; public const POCKETMINE_LEVEL_UNLOADING = "pocketmine.level.unloading";
public const POCKETMINE_LEVEL_UNSUPPORTEDFORMAT = "pocketmine.level.unsupportedFormat"; public const POCKETMINE_LEVEL_UNSUPPORTEDFORMAT = "pocketmine.level.unsupportedFormat";
public const POCKETMINE_NETWORK_SESSION_CLOSE = "pocketmine.network.session.close";
public const POCKETMINE_NETWORK_SESSION_OPEN = "pocketmine.network.session.open";
public const POCKETMINE_NETWORK_SESSION_PLAYERNAME = "pocketmine.network.session.playerName";
public const POCKETMINE_PERMISSION_BROADCAST_ADMIN = "pocketmine.permission.broadcast.admin";
public const POCKETMINE_PERMISSION_BROADCAST_USER = "pocketmine.permission.broadcast.user";
public const POCKETMINE_PERMISSION_COMMAND_BAN_IP = "pocketmine.permission.command.ban.ip";
public const POCKETMINE_PERMISSION_COMMAND_BAN_LIST = "pocketmine.permission.command.ban.list";
public const POCKETMINE_PERMISSION_COMMAND_BAN_PLAYER = "pocketmine.permission.command.ban.player";
public const POCKETMINE_PERMISSION_COMMAND_CLEAR_OTHER = "pocketmine.permission.command.clear.other";
public const POCKETMINE_PERMISSION_COMMAND_CLEAR_SELF = "pocketmine.permission.command.clear.self";
public const POCKETMINE_PERMISSION_COMMAND_DEFAULTGAMEMODE = "pocketmine.permission.command.defaultgamemode";
public const POCKETMINE_PERMISSION_COMMAND_DIFFICULTY = "pocketmine.permission.command.difficulty";
public const POCKETMINE_PERMISSION_COMMAND_DUMPMEMORY = "pocketmine.permission.command.dumpmemory";
public const POCKETMINE_PERMISSION_COMMAND_EFFECT_OTHER = "pocketmine.permission.command.effect.other";
public const POCKETMINE_PERMISSION_COMMAND_EFFECT_SELF = "pocketmine.permission.command.effect.self";
public const POCKETMINE_PERMISSION_COMMAND_ENCHANT_OTHER = "pocketmine.permission.command.enchant.other";
public const POCKETMINE_PERMISSION_COMMAND_ENCHANT_SELF = "pocketmine.permission.command.enchant.self";
public const POCKETMINE_PERMISSION_COMMAND_GAMEMODE_OTHER = "pocketmine.permission.command.gamemode.other";
public const POCKETMINE_PERMISSION_COMMAND_GAMEMODE_SELF = "pocketmine.permission.command.gamemode.self";
public const POCKETMINE_PERMISSION_COMMAND_GC = "pocketmine.permission.command.gc";
public const POCKETMINE_PERMISSION_COMMAND_GIVE_OTHER = "pocketmine.permission.command.give.other";
public const POCKETMINE_PERMISSION_COMMAND_GIVE_SELF = "pocketmine.permission.command.give.self";
public const POCKETMINE_PERMISSION_COMMAND_HELP = "pocketmine.permission.command.help";
public const POCKETMINE_PERMISSION_COMMAND_KICK = "pocketmine.permission.command.kick";
public const POCKETMINE_PERMISSION_COMMAND_KILL_OTHER = "pocketmine.permission.command.kill.other";
public const POCKETMINE_PERMISSION_COMMAND_KILL_SELF = "pocketmine.permission.command.kill.self";
public const POCKETMINE_PERMISSION_COMMAND_LIST = "pocketmine.permission.command.list";
public const POCKETMINE_PERMISSION_COMMAND_ME = "pocketmine.permission.command.me";
public const POCKETMINE_PERMISSION_COMMAND_OP_GIVE = "pocketmine.permission.command.op.give";
public const POCKETMINE_PERMISSION_COMMAND_OP_TAKE = "pocketmine.permission.command.op.take";
public const POCKETMINE_PERMISSION_COMMAND_PARTICLE = "pocketmine.permission.command.particle";
public const POCKETMINE_PERMISSION_COMMAND_PLUGINS = "pocketmine.permission.command.plugins";
public const POCKETMINE_PERMISSION_COMMAND_SAVE_DISABLE = "pocketmine.permission.command.save.disable";
public const POCKETMINE_PERMISSION_COMMAND_SAVE_ENABLE = "pocketmine.permission.command.save.enable";
public const POCKETMINE_PERMISSION_COMMAND_SAVE_PERFORM = "pocketmine.permission.command.save.perform";
public const POCKETMINE_PERMISSION_COMMAND_SAY = "pocketmine.permission.command.say";
public const POCKETMINE_PERMISSION_COMMAND_SEED = "pocketmine.permission.command.seed";
public const POCKETMINE_PERMISSION_COMMAND_SETWORLDSPAWN = "pocketmine.permission.command.setworldspawn";
public const POCKETMINE_PERMISSION_COMMAND_SPAWNPOINT_OTHER = "pocketmine.permission.command.spawnpoint.other";
public const POCKETMINE_PERMISSION_COMMAND_SPAWNPOINT_SELF = "pocketmine.permission.command.spawnpoint.self";
public const POCKETMINE_PERMISSION_COMMAND_STATUS = "pocketmine.permission.command.status";
public const POCKETMINE_PERMISSION_COMMAND_STOP = "pocketmine.permission.command.stop";
public const POCKETMINE_PERMISSION_COMMAND_TELEPORT_OTHER = "pocketmine.permission.command.teleport.other";
public const POCKETMINE_PERMISSION_COMMAND_TELEPORT_SELF = "pocketmine.permission.command.teleport.self";
public const POCKETMINE_PERMISSION_COMMAND_TELL = "pocketmine.permission.command.tell";
public const POCKETMINE_PERMISSION_COMMAND_TIME_ADD = "pocketmine.permission.command.time.add";
public const POCKETMINE_PERMISSION_COMMAND_TIME_QUERY = "pocketmine.permission.command.time.query";
public const POCKETMINE_PERMISSION_COMMAND_TIME_SET = "pocketmine.permission.command.time.set";
public const POCKETMINE_PERMISSION_COMMAND_TIME_START = "pocketmine.permission.command.time.start";
public const POCKETMINE_PERMISSION_COMMAND_TIME_STOP = "pocketmine.permission.command.time.stop";
public const POCKETMINE_PERMISSION_COMMAND_TIMINGS = "pocketmine.permission.command.timings";
public const POCKETMINE_PERMISSION_COMMAND_TITLE_OTHER = "pocketmine.permission.command.title.other";
public const POCKETMINE_PERMISSION_COMMAND_TITLE_SELF = "pocketmine.permission.command.title.self";
public const POCKETMINE_PERMISSION_COMMAND_TRANSFERSERVER = "pocketmine.permission.command.transferserver";
public const POCKETMINE_PERMISSION_COMMAND_UNBAN_IP = "pocketmine.permission.command.unban.ip";
public const POCKETMINE_PERMISSION_COMMAND_UNBAN_PLAYER = "pocketmine.permission.command.unban.player";
public const POCKETMINE_PERMISSION_COMMAND_VERSION = "pocketmine.permission.command.version";
public const POCKETMINE_PERMISSION_COMMAND_WHITELIST_ADD = "pocketmine.permission.command.whitelist.add";
public const POCKETMINE_PERMISSION_COMMAND_WHITELIST_DISABLE = "pocketmine.permission.command.whitelist.disable";
public const POCKETMINE_PERMISSION_COMMAND_WHITELIST_ENABLE = "pocketmine.permission.command.whitelist.enable";
public const POCKETMINE_PERMISSION_COMMAND_WHITELIST_LIST = "pocketmine.permission.command.whitelist.list";
public const POCKETMINE_PERMISSION_COMMAND_WHITELIST_RELOAD = "pocketmine.permission.command.whitelist.reload";
public const POCKETMINE_PERMISSION_COMMAND_WHITELIST_REMOVE = "pocketmine.permission.command.whitelist.remove";
public const POCKETMINE_PERMISSION_GROUP_CONSOLE = "pocketmine.permission.group.console";
public const POCKETMINE_PERMISSION_GROUP_OPERATOR = "pocketmine.permission.group.operator";
public const POCKETMINE_PERMISSION_GROUP_USER = "pocketmine.permission.group.user";
public const POCKETMINE_PLAYER_INVALIDENTITY = "pocketmine.player.invalidEntity"; public const POCKETMINE_PLAYER_INVALIDENTITY = "pocketmine.player.invalidEntity";
public const POCKETMINE_PLAYER_INVALIDMOVE = "pocketmine.player.invalidMove"; public const POCKETMINE_PLAYER_INVALIDMOVE = "pocketmine.player.invalidMove";
public const POCKETMINE_PLAYER_LOGIN = "pocketmine.player.logIn"; public const POCKETMINE_PLAYER_LOGIN = "pocketmine.player.logIn";

View File

@ -132,6 +132,7 @@ use function get_class;
use function in_array; use function in_array;
use function json_encode; use function json_encode;
use function ksort; use function ksort;
use function random_bytes;
use function strcasecmp; use function strcasecmp;
use function strlen; use function strlen;
use function strtolower; use function strtolower;
@ -236,7 +237,11 @@ class NetworkSession{
protected function createPlayer() : void{ protected function createPlayer() : void{
$this->server->createPlayer($this, $this->info, $this->authenticated, $this->cachedOfflinePlayerData)->onCompletion( $this->server->createPlayer($this, $this->info, $this->authenticated, $this->cachedOfflinePlayerData)->onCompletion(
\Closure::fromCallable([$this, 'onPlayerCreated']), \Closure::fromCallable([$this, 'onPlayerCreated']),
fn() => $this->disconnect("Player creation failed") //TODO: this should never actually occur... right? function() : void{
//TODO: this should never actually occur... right?
$this->logger->error("Failed to create player");
$this->disconnectWithError(KnownTranslationFactory::pocketmine_disconnect_error_internal());
}
); );
} }
@ -594,6 +599,10 @@ class NetworkSession{
}, $reason); }, $reason);
} }
public function disconnectWithError(Translatable|string $reason) : void{
$this->disconnect(KnownTranslationFactory::pocketmine_disconnect_error($reason, bin2hex(random_bytes(6))));
}
public function disconnectIncompatibleProtocol(int $protocolVersion) : void{ public function disconnectIncompatibleProtocol(int $protocolVersion) : void{
$this->tryDisconnect( $this->tryDisconnect(
function() use ($protocolVersion) : void{ function() use ($protocolVersion) : void{
@ -606,7 +615,8 @@ class NetworkSession{
/** /**
* Instructs the remote client to connect to a different server. * Instructs the remote client to connect to a different server.
*/ */
public function transfer(string $ip, int $port, Translatable|string $reason = "transfer") : void{ public function transfer(string $ip, int $port, Translatable|string|null $reason = null) : void{
$reason ??= KnownTranslationFactory::pocketmine_disconnect_transfer();
$this->tryDisconnect(function() use ($ip, $port, $reason) : void{ $this->tryDisconnect(function() use ($ip, $port, $reason) : void{
$this->sendDataPacket(TransferPacket::create($ip, $port), true); $this->sendDataPacket(TransferPacket::create($ip, $port), true);
if($this->player !== null){ if($this->player !== null){
@ -649,7 +659,7 @@ class NetworkSession{
} }
if($error !== null){ if($error !== null){
$this->disconnect(KnownTranslationFactory::pocketmine_disconnect_invalidSession($error)); $this->disconnectWithError(KnownTranslationFactory::pocketmine_disconnect_invalidSession($error));
return; return;
} }
@ -1146,7 +1156,7 @@ class NetworkSession{
if($this->info === null){ if($this->info === null){
if(time() >= $this->connectTime + 10){ if(time() >= $this->connectTime + 10){
$this->disconnect("Login timeout"); $this->disconnectWithError(KnownTranslationFactory::pocketmine_disconnect_error_loginTimeout());
} }
return; return;

View File

@ -71,7 +71,7 @@ class LoginPacketHandler extends PacketHandler{
$extraData = $this->fetchAuthData($packet->chainDataJwt); $extraData = $this->fetchAuthData($packet->chainDataJwt);
if(!Player::isValidUserName($extraData->displayName)){ if(!Player::isValidUserName($extraData->displayName)){
$this->session->disconnect(KnownTranslationFactory::disconnectionScreen_invalidName()); $this->session->disconnectWithError(KnownTranslationFactory::disconnectionScreen_invalidName());
return true; return true;
} }
@ -81,7 +81,7 @@ class LoginPacketHandler extends PacketHandler{
$skin = SkinAdapterSingleton::get()->fromSkinData(ClientDataToSkinDataHelper::fromClientData($clientData)); $skin = SkinAdapterSingleton::get()->fromSkinData(ClientDataToSkinDataHelper::fromClientData($clientData));
}catch(\InvalidArgumentException | InvalidSkinException $e){ }catch(\InvalidArgumentException | InvalidSkinException $e){
$this->session->getLogger()->debug("Invalid skin: " . $e->getMessage()); $this->session->getLogger()->debug("Invalid skin: " . $e->getMessage());
$this->session->disconnect(KnownTranslationFactory::disconnectionScreen_invalidSkin()); $this->session->disconnectWithError(KnownTranslationFactory::disconnectionScreen_invalidSkin());
return true; return true;
} }
@ -120,12 +120,19 @@ class LoginPacketHandler extends PacketHandler{
$ev->setKickReason(PlayerPreLoginEvent::KICK_REASON_SERVER_FULL, KnownTranslationFactory::disconnectionScreen_serverFull()); $ev->setKickReason(PlayerPreLoginEvent::KICK_REASON_SERVER_FULL, KnownTranslationFactory::disconnectionScreen_serverFull());
} }
if(!$this->server->isWhitelisted($playerInfo->getUsername())){ if(!$this->server->isWhitelisted($playerInfo->getUsername())){
//TODO: l10n $ev->setKickReason(PlayerPreLoginEvent::KICK_REASON_SERVER_WHITELISTED, KnownTranslationFactory::pocketmine_disconnect_whitelisted());
$ev->setKickReason(PlayerPreLoginEvent::KICK_REASON_SERVER_WHITELISTED, "Server is whitelisted");
} }
if($this->server->getNameBans()->isBanned($playerInfo->getUsername()) || $this->server->getIPBans()->isBanned($this->session->getIp())){
//TODO: l10n $banMessage = null;
$ev->setKickReason(PlayerPreLoginEvent::KICK_REASON_BANNED, "You are banned"); if(($banEntry = $this->server->getNameBans()->getEntry($playerInfo->getUsername())) !== null){
$banReason = $banEntry->getReason();
$banMessage = $banReason === "" ? KnownTranslationFactory::pocketmine_disconnect_ban_noReason() : KnownTranslationFactory::pocketmine_disconnect_ban($banReason);
}elseif(($banEntry = $this->server->getIPBans()->getEntry($this->session->getIp())) !== null){
$banReason = $banEntry->getReason();
$banMessage = KnownTranslationFactory::pocketmine_disconnect_ban($banReason !== "" ? $banReason : KnownTranslationFactory::pocketmine_disconnect_ban_ip());
}
if($banMessage !== null){
$ev->setKickReason(PlayerPreLoginEvent::KICK_REASON_BANNED, $banMessage);
} }
$ev->call(); $ev->call();

View File

@ -86,7 +86,7 @@ class ResourcePacksPacketHandler extends PacketHandler{
private function disconnectWithError(string $error) : void{ private function disconnectWithError(string $error) : void{
$this->session->getLogger()->error("Error downloading resource packs: " . $error); $this->session->getLogger()->error("Error downloading resource packs: " . $error);
$this->session->disconnect(KnownTranslationFactory::disconnectionScreen_resourcePack()); $this->session->disconnectWithError(KnownTranslationFactory::disconnectionScreen_resourcePack());
} }
public function handleResourcePackClientResponse(ResourcePackClientResponsePacket $packet) : bool{ public function handleResourcePackClientResponse(ResourcePackClientResponsePacket $packet) : bool{

View File

@ -23,6 +23,7 @@ declare(strict_types=1);
namespace pocketmine\network\mcpe\raklib; namespace pocketmine\network\mcpe\raklib;
use pocketmine\lang\KnownTranslationFactory;
use pocketmine\network\AdvancedNetworkInterface; use pocketmine\network\AdvancedNetworkInterface;
use pocketmine\network\mcpe\compression\ZlibCompressor; use pocketmine\network\mcpe\compression\ZlibCompressor;
use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\convert\TypeConverter;
@ -46,10 +47,8 @@ use raklib\server\ServerEventListener;
use raklib\utils\InternetAddress; use raklib\utils\InternetAddress;
use function addcslashes; use function addcslashes;
use function base64_encode; use function base64_encode;
use function bin2hex;
use function implode; use function implode;
use function mt_rand; use function mt_rand;
use function random_bytes;
use function rtrim; use function rtrim;
use function substr; use function substr;
use const PHP_INT_MAX; use const PHP_INT_MAX;
@ -182,14 +181,12 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{
try{ try{
$session->handleEncoded($buf); $session->handleEncoded($buf);
}catch(PacketHandlingException $e){ }catch(PacketHandlingException $e){
$errorId = bin2hex(random_bytes(6));
$logger = $session->getLogger(); $logger = $session->getLogger();
$logger->error("Bad packet (error ID $errorId): " . $e->getMessage()); $logger->error("Bad packet: " . $e->getMessage());
//intentionally doesn't use logException, we don't want spammy packet error traces to appear in release mode //intentionally doesn't use logException, we don't want spammy packet error traces to appear in release mode
$logger->debug(implode("\n", Utils::printableExceptionInfo($e))); $logger->debug(implode("\n", Utils::printableExceptionInfo($e)));
$session->disconnect("Packet processing error (Error ID: $errorId)"); $session->disconnectWithError(KnownTranslationFactory::pocketmine_disconnect_error_badPacket());
$this->interface->blockAddress($address, 5); $this->interface->blockAddress($address, 5);
} }
} }

View File

@ -2081,14 +2081,14 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{
/** /**
* Transfers a player to another server. * Transfers a player to another server.
* *
* @param string $address The IP address or hostname of the destination server * @param string $address The IP address or hostname of the destination server
* @param int $port The destination port, defaults to 19132 * @param int $port The destination port, defaults to 19132
* @param string $message Message to show in the console when closing the player * @param Translatable|string|null $message Message to show in the console when closing the player, null will use the default message
* *
* @return bool if transfer was successful. * @return bool if transfer was successful.
*/ */
public function transfer(string $address, int $port = 19132, string $message = "transfer") : bool{ public function transfer(string $address, int $port = 19132, Translatable|string|null $message = null) : bool{
$ev = new PlayerTransferEvent($this, $address, $port, $message); $ev = new PlayerTransferEvent($this, $address, $port, $message ?? KnownTranslationFactory::pocketmine_disconnect_transfer());
$ev->call(); $ev->call();
if(!$ev->isCancelled()){ if(!$ev->isCancelled()){
$this->getNetworkSession()->transfer($ev->getAddress(), $ev->getPort(), $ev->getMessage()); $this->getNetworkSession()->transfer($ev->getAddress(), $ev->getPort(), $ev->getMessage());
@ -2303,7 +2303,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{
public function respawn() : void{ public function respawn() : void{
if($this->server->isHardcore()){ if($this->server->isHardcore()){
if($this->kick("You have been banned because you died in hardcore mode")){ //this allows plugins to prevent the ban by cancelling PlayerKickEvent if($this->kick(KnownTranslationFactory::pocketmine_disconnect_ban(KnownTranslationFactory::pocketmine_disconnect_ban_hardcore()))){ //this allows plugins to prevent the ban by cancelling PlayerKickEvent
$this->server->getNameBans()->addBan($this->getName(), "Died in hardcore mode"); $this->server->getNameBans()->addBan($this->getName(), "Died in hardcore mode");
} }
return; return;