diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index 73cb34c6a..5f4d7c71f 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -31,6 +31,7 @@ use pocketmine\entity\Item as DroppedItem; use pocketmine\entity\Living; use pocketmine\entity\Projectile; use pocketmine\event\block\SignChangeEvent; +use pocketmine\event\entity\EntityDamageByBlockEvent; use pocketmine\event\entity\EntityDamageByEntityEvent; use pocketmine\event\entity\EntityDamageEvent; use pocketmine\event\entity\EntityRegainHealthEvent; @@ -59,7 +60,9 @@ use pocketmine\event\player\PlayerQuitEvent; use pocketmine\event\player\PlayerRespawnEvent; use pocketmine\event\server\DataPacketReceiveEvent; use pocketmine\event\server\DataPacketSendEvent; +use pocketmine\event\TextContainer; use pocketmine\event\Timings; +use pocketmine\event\TranslationContainer; use pocketmine\inventory\BaseTransaction; use pocketmine\inventory\BigShapelessRecipe; use pocketmine\inventory\CraftingTransactionGroup; @@ -218,6 +221,12 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ /** @var PermissibleBase */ private $perm = null; + public function getLeaveMessage(){ + return new TranslationContainer(TextFormat::YELLOW . "%multiplayer.player.leave", [ + $this->getDisplayName() + ]); + } + public function getClientId(){ return $this->randomClientId; } @@ -642,7 +651,11 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ $pk->status = PlayStatusPacket::PLAYER_SPAWN; $this->dataPacket($pk); - $this->server->getPluginManager()->callEvent($ev = new PlayerJoinEvent($this, TextFormat::YELLOW . $this->getName() . " joined the game")); + $this->server->getPluginManager()->callEvent($ev = new PlayerJoinEvent($this, + new TranslationContainer(TextFormat::YELLOW . "%multiplayer.player.joined", [ + $this->getDisplayName() + ]) + )); if(strlen(trim($ev->getJoinMessage())) > 0){ $this->server->broadcastMessage($ev->getJoinMessage()); } @@ -916,10 +929,10 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ if(($this->gamemode & 0x01) === ($gm & 0x01)){ $this->gamemode = $gm; - $this->sendMessage("Your gamemode has been changed to " . Server::getGamemodeString($this->getGamemode()) . ".\n"); + $this->sendMessage(new TranslationContainer("gameMode.changed")); }else{ $this->gamemode = $gm; - $this->sendMessage("Your gamemode has been changed to " . Server::getGamemodeString($this->getGamemode()) . ".\n"); + $this->sendMessage(new TranslationContainer("gameMode.changed")); $this->inventory->clearAll(); $this->inventory->sendContents($this); $this->inventory->sendContents($this->getViewers()); @@ -1381,11 +1394,11 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ } if(!$this->server->isWhitelisted(strtolower($this->getName()))){ - $this->close(TextFormat::YELLOW . $this->username . " has left the game", "Server is white-listed"); + $this->close($this->getLeaveMessage(), "Server is white-listed"); return; }elseif($this->server->getNameBans()->isBanned(strtolower($this->getName())) or $this->server->getIPBans()->isBanned($this->getAddress())){ - $this->close(TextFormat::YELLOW . $this->username . " has left the game", "You are banned"); + $this->close($this->getLeaveMessage(), "You are banned"); return; } @@ -1400,7 +1413,7 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ foreach($this->server->getOnlinePlayers() as $p){ if($p !== $this and strtolower($p->getName()) === strtolower($this->getName())){ if($p->kick("logged in from another location") === false){ - $this->close(TextFormat::YELLOW . $this->getName() . " has left the game", "Logged in from another location"); + $this->close($this->getLeaveMessage(), "Logged in from another location"); return; }else{ @@ -1431,7 +1444,7 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ } if(!($nbt instanceof Compound)){ - $this->close(TextFormat::YELLOW . $this->username . " has left the game", "Invalid data"); + $this->close($this->getLeaveMessage(), "Invalid data"); return; } @@ -1450,7 +1463,7 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ $this->server->getPluginManager()->callEvent($ev = new PlayerLoginEvent($this, "Plugin reason")); if($ev->isCancelled()){ - $this->close(TextFormat::YELLOW . $this->username . " has left the game", $ev->getKickMessage()); + $this->close($this->getLeaveMessage(), $ev->getKickMessage()); return; } @@ -2372,7 +2385,7 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ * @return bool */ public function kick($reason = ""){ - $this->server->getPluginManager()->callEvent($ev = new PlayerKickEvent($this, $reason, TextFormat::YELLOW . $this->username . " has left the game")); + $this->server->getPluginManager()->callEvent($ev = new PlayerKickEvent($this, $reason, $this->getLeaveMessage())); if(!$ev->isCancelled()){ $message = "Kicked by admin." . ($reason !== "" ? " Reason: " . $reason : ""); $this->close($ev->getQuitMessage(), $message); @@ -2386,9 +2399,17 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ /** * Sends a direct chat message to a player * - * @param string $message + * @param string|TextContainer $message */ public function sendMessage($message){ + if($message instanceof TextContainer){ + if($message instanceof TranslationContainer){ + $this->sendTranslation($message->getText(), $message->getParameters()); + return; + } + $message = $message->getText(); + } + $mes = explode("\n", $message); foreach($mes as $m){ if($m !== ""){ @@ -2534,84 +2555,104 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ return; } - $message = $this->getName() . " died"; - $cause = $this->getLastDamageCause(); - $ev = null; - if($cause instanceof EntityDamageEvent){ - $ev = $cause; - $cause = $ev->getCause(); - } + $message = "death.attack.generic"; - switch($cause){ + $params = [ + $this->getName() + ]; + + $cause = $this->getLastDamageCause(); + + switch($cause->getCause()){ case EntityDamageEvent::CAUSE_ENTITY_ATTACK: - if($ev instanceof EntityDamageByEntityEvent){ - $e = $ev->getDamager(); + if($cause instanceof EntityDamageByEntityEvent){ + $e = $cause->getDamager(); if($e instanceof Player){ - $message = $this->getName() . " was killed by " . $e->getName(); + $message = "death.attack.player"; + $params[] = $e->getName(); break; }elseif($e instanceof Living){ - $message = $this->getName() . " was slain by " . $e->getName(); + $message = "death.attack.mob"; + $params[] = $e->getName(); break; + }else{ + $params[] = "Unknown"; } } - $message = $this->getName() . " was killed"; break; case EntityDamageEvent::CAUSE_PROJECTILE: - if($ev instanceof EntityDamageByEntityEvent){ - $e = $ev->getDamager(); + if($cause instanceof EntityDamageByEntityEvent){ + $e = $cause->getDamager(); if($e instanceof Living){ - $message = $this->getName() . " was shot by " . $e->getName(); + $message = "death.attack.arrow"; + $params[] = $e->getName(); break; + }else{ + $params[] = "Unknown"; } } - $message = $this->getName() . " was shot by arrow"; break; case EntityDamageEvent::CAUSE_SUICIDE: - $message = $this->getName() . " died"; + $message = "death.attack.generic"; break; case EntityDamageEvent::CAUSE_VOID: - $message = $this->getName() . " fell out of the world"; + $message = "death.attack.outOfWorld"; break; case EntityDamageEvent::CAUSE_FALL: - if($ev instanceof EntityDamageEvent){ - if($ev->getFinalDamage() > 2){ - $message = $this->getName() . " fell from a high place"; + if($cause instanceof EntityDamageEvent){ + if($cause->getFinalDamage() > 2){ + $message = "death.fell.accident.generic"; break; } } - $message = $this->getName() . " hit the ground too hard"; + $message = "death.attack.fall"; break; case EntityDamageEvent::CAUSE_SUFFOCATION: - $message = $this->getName() . " suffocated in a wall"; + $message = "death.attack.inWall"; break; case EntityDamageEvent::CAUSE_LAVA: - $message = $this->getName() . " tried to swim in lava"; + $message = "death.attack.lava"; break; case EntityDamageEvent::CAUSE_FIRE: - $message = $this->getName() . " went up in flames"; + $message = "death.attack.onFire"; break; case EntityDamageEvent::CAUSE_FIRE_TICK: - $message = $this->getName() . " burned to death"; + $message = "death.attack.inFire"; break; case EntityDamageEvent::CAUSE_DROWNING: - $message = $this->getName() . " drowned"; + $message = "death.attack.drown"; break; case EntityDamageEvent::CAUSE_CONTACT: - $message = $this->getName() . " was pricked to death"; + if($cause instanceof EntityDamageByBlockEvent){ + if($cause->getDamager()->getId() === Block::CACTUS){ + $message = "death.attack.cactus"; + } + } break; case EntityDamageEvent::CAUSE_BLOCK_EXPLOSION: case EntityDamageEvent::CAUSE_ENTITY_EXPLOSION: - $message = $this->getName() . " blew up"; + if($cause instanceof EntityDamageByEntityEvent){ + $e = $cause->getDamager(); + if($e instanceof Living){ + $message = "death.attack.explosion.player"; + $params[] = $e->getName(); + } + }else{ + $message = "death.attack.explosion"; + } break; case EntityDamageEvent::CAUSE_MAGIC: + $message = "death.attack.magic"; + break; + case EntityDamageEvent::CAUSE_CUSTOM: default: @@ -2624,7 +2665,7 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ Entity::kill(); - $this->server->getPluginManager()->callEvent($ev = new PlayerDeathEvent($this, $this->getDrops(), $message)); + $this->server->getPluginManager()->callEvent($ev = new PlayerDeathEvent($this, $this->getDrops(), new TranslationContainer($message, $params))); if(!$ev->getKeepInventory()){ foreach($ev->getDrops() as $item){ diff --git a/src/pocketmine/Server.php b/src/pocketmine/Server.php index 4a52bb250..f158e9cc1 100644 --- a/src/pocketmine/Server.php +++ b/src/pocketmine/Server.php @@ -48,18 +48,18 @@ use pocketmine\event\level\LevelLoadEvent; use pocketmine\event\server\ServerCommandEvent; use pocketmine\event\Timings; use pocketmine\event\TimingsHandler; +use pocketmine\event\TranslationContainer; use pocketmine\inventory\CraftingManager; use pocketmine\inventory\InventoryType; use pocketmine\inventory\Recipe; use pocketmine\item\Item; +use pocketmine\lang\BaseLang; use pocketmine\level\format\anvil\Anvil; use pocketmine\level\format\leveldb\LevelDB; use pocketmine\level\format\LevelProviderManager; use pocketmine\level\format\mcregion\McRegion; use pocketmine\level\generator\biome\Biome; use pocketmine\level\generator\Flat; -use pocketmine\level\generator\GenerationInstanceManager; -use pocketmine\level\generator\GenerationRequestManager; use pocketmine\level\generator\Generator; use pocketmine\level\generator\normal\Normal; use pocketmine\level\Level; @@ -196,6 +196,9 @@ class Server{ private $networkCompressionAsync = true; private $networkCompressionLevel = 7; + /** @var BaseLang */ + private $baseLang; + private $serverID; private $autoloader; @@ -380,13 +383,13 @@ class Server{ public static function getGamemodeString($mode){ switch((int) $mode){ case Player::SURVIVAL: - return "SURVIVAL"; + return "%gameMode.survival"; case Player::CREATIVE: - return "CREATIVE"; + return "%gameMode.creative"; case Player::ADVENTURE: - return "ADVENTURE"; + return "%gameMode.adventure"; case Player::SPECTATOR: - return "SPECTATOR"; + return "%gameMode.spectator"; } return "UNKNOWN"; @@ -404,22 +407,26 @@ class Server{ case (string) Player::SURVIVAL: case "survival": case "s": + case strtolower(Server::getInstance()->getLanguage()->get("gameMode.survival")): return Player::SURVIVAL; case (string) Player::CREATIVE: case "creative": case "c": + case strtolower(Server::getInstance()->getLanguage()->get("gameMode.creative")): return Player::CREATIVE; case (string) Player::ADVENTURE: case "adventure": case "a": + case strtolower(Server::getInstance()->getLanguage()->get("gameMode.adventure")): return Player::ADVENTURE; case (string) Player::SPECTATOR: case "spectator": case "view": case "v": + case strtolower(Server::getInstance()->getLanguage()->get("gameMode.spectator")): return Player::SPECTATOR; } return -1; @@ -1512,6 +1519,8 @@ class Server{ "auto-save" => true, ]); + $this->baseLang = new BaseLang($this->getProperty("settings.settings.language", "en")); + ServerScheduler::$WORKERS = $this->getProperty("settings.async-workers", ServerScheduler::$WORKERS); if($this->getProperty("network.batch-threshold", 256) >= 0){ @@ -1859,11 +1868,8 @@ class Server{ return true; } - if($sender instanceof Player){ - $sender->sendMessage("Unknown command. Type \"/help\" for help."); - }else{ - $sender->sendMessage("Unknown command. Type \"help\" for help."); - } + + $sender->sendMessage(new TranslationContainer(TextFormat::RED . "%commands.generic.notFound")); return false; } @@ -1943,7 +1949,7 @@ class Server{ $this->pluginManager->disablePlugins(); foreach($this->players as $player){ - $player->close(TextFormat::YELLOW . $player->getName() . " has left the game", $this->getProperty("settings.shutdown-message", "Server closed")); + $player->close($player->getLeaveMessage(), $this->getProperty("settings.shutdown-message", "Server closed")); } foreach($this->getLevels() as $level){ @@ -2005,7 +2011,7 @@ class Server{ $this->getScheduler()->scheduleRepeatingTask(new CallbackTask([$this, "checkTicks"]), 20 * 5); - $this->logger->info("Default game type: " . self::getGamemodeString($this->getGamemode())); + $this->logger->info("Default game type: " . $this->getLanguage()->get(self::getGamemodeString($this->getGamemode()))); $this->logger->info("Done (" . round(microtime(true) - \pocketmine\START_TIME, 3) . 's)! For help, type "help" or "?"'); @@ -2254,7 +2260,18 @@ class Server{ $this->scheduler->scheduleAsyncTask($this->lastSendUsage); } - + + + /** + * @return BaseLang + */ + public function getLanguage(){ + return $this->baseLang; + } + + /** + * @return Network + */ public function getNetwork(){ return $this->network; } diff --git a/src/pocketmine/command/Command.php b/src/pocketmine/command/Command.php index 21717ad36..ebf5177fa 100644 --- a/src/pocketmine/command/Command.php +++ b/src/pocketmine/command/Command.php @@ -24,7 +24,9 @@ */ namespace pocketmine\command; +use pocketmine\event\TextContainer; use pocketmine\event\TimingsHandler; +use pocketmine\event\TranslationContainer; use pocketmine\Server; use pocketmine\utils\TextFormat; @@ -124,7 +126,7 @@ abstract class Command{ } if($this->permissionMessage === null){ - $target->sendMessage(TextFormat::RED . "You don't have permissions to use this command."); + $target->sendMessage(new TranslationContainer(TextFormat::RED . "%commands.generic.permission")); }elseif($this->permissionMessage !== ""){ $target->sendMessage(str_replace("", $this->permission, $this->permissionMessage)); } @@ -285,12 +287,25 @@ abstract class Command{ * @param bool $sendToSource */ public static function broadcastCommandMessage(CommandSender $source, $message, $sendToSource = true){ - $result = $source->getName() . ": " . $message; + if($message instanceof TextContainer){ + $m = clone $message; + $result = $source->getName() . ": " . $m->getText(); - //Command minecarts or command blocks are not implemented + $users = Server::getInstance()->getPluginManager()->getPermissionSubscriptions(Server::BROADCAST_CHANNEL_ADMINISTRATIVE); + $colored = TextFormat::GRAY . TextFormat::ITALIC . "[$result" . TextFormat::GRAY . TextFormat::ITALIC . "]"; - $users = Server::getInstance()->getPluginManager()->getPermissionSubscriptions(Server::BROADCAST_CHANNEL_ADMINISTRATIVE); - $colored = TextFormat::GRAY . TextFormat::ITALIC . "[$result" . TextFormat::GRAY . TextFormat::ITALIC . "]"; + $m->setText($result); + $result = clone $m; + $m->setText($colored); + $colored = clone $m; + }else{ + $result = $source->getName() . ": " . $message; + + //Command minecarts or command blocks are not implemented + + $users = Server::getInstance()->getPluginManager()->getPermissionSubscriptions(Server::BROADCAST_CHANNEL_ADMINISTRATIVE); + $colored = TextFormat::GRAY . TextFormat::ITALIC . "[$result" . TextFormat::GRAY . TextFormat::ITALIC . "]"; + } if($sendToSource === true and !($source instanceof ConsoleCommandSender)){ $source->sendMessage($message); } diff --git a/src/pocketmine/command/ConsoleCommandSender.php b/src/pocketmine/command/ConsoleCommandSender.php index 8ae7ed728..c27432539 100644 --- a/src/pocketmine/command/ConsoleCommandSender.php +++ b/src/pocketmine/command/ConsoleCommandSender.php @@ -21,6 +21,7 @@ namespace pocketmine\command; +use pocketmine\event\TextContainer; use pocketmine\permission\PermissibleBase; use pocketmine\permission\PermissionAttachment; use pocketmine\plugin\Plugin; @@ -102,6 +103,10 @@ class ConsoleCommandSender implements CommandSender{ * @param string $message */ public function sendMessage($message){ + if($message instanceof TextContainer){ + $message = $this->getServer()->getLanguage()->translate($message); + } + foreach(explode("\n", trim($message)) as $line){ MainLogger::getLogger()->info($line); } diff --git a/src/pocketmine/command/PluginCommand.php b/src/pocketmine/command/PluginCommand.php index f0074de65..f1d34e751 100644 --- a/src/pocketmine/command/PluginCommand.php +++ b/src/pocketmine/command/PluginCommand.php @@ -21,6 +21,7 @@ namespace pocketmine\command; +use pocketmine\event\TranslationContainer; use pocketmine\plugin\Plugin; use pocketmine\utils\TextFormat; @@ -56,7 +57,7 @@ class PluginCommand extends Command implements PluginIdentifiableCommand{ $success = $this->executor->onCommand($sender, $this, $commandLabel, $args); if(!$success and $this->usageMessage !== ""){ - $sender->sendMessage(TextFormat::RED . "Usage: " . $this->usageMessage); + $sender->sendMessage(new TranslationContainer("commands.generic.usage", [$this->usageMessage])); } return $success; diff --git a/src/pocketmine/command/SimpleCommandMap.php b/src/pocketmine/command/SimpleCommandMap.php index 7abcdcb1c..7217a041c 100644 --- a/src/pocketmine/command/SimpleCommandMap.php +++ b/src/pocketmine/command/SimpleCommandMap.php @@ -57,8 +57,10 @@ use pocketmine\command\defaults\TimingsCommand; use pocketmine\command\defaults\VanillaCommand; use pocketmine\command\defaults\VersionCommand; use pocketmine\command\defaults\WhitelistCommand; +use pocketmine\event\TranslationContainer; use pocketmine\Server; use pocketmine\utils\MainLogger; +use pocketmine\utils\TextFormat; class SimpleCommandMap implements CommandMap{ @@ -186,6 +188,7 @@ class SimpleCommandMap implements CommandMap{ try{ $target->execute($sender, $sentCommandLabel, $args); }catch(\Exception $e){ + $sender->sendMessage(new TranslationContainer(TextFormat::RED . "%commands.generic.exception")); $this->server->getLogger()->critical("Unhandled exception executing command '" . $commandLine . "' in " . $target . ": " . $e->getMessage()); $logger = $sender->getServer()->getLogger(); if($logger instanceof MainLogger){ diff --git a/src/pocketmine/command/defaults/BanCommand.php b/src/pocketmine/command/defaults/BanCommand.php index 39eb8321b..4ecbe95b7 100644 --- a/src/pocketmine/command/defaults/BanCommand.php +++ b/src/pocketmine/command/defaults/BanCommand.php @@ -23,6 +23,7 @@ namespace pocketmine\command\defaults; use pocketmine\command\Command; use pocketmine\command\CommandSender; +use pocketmine\event\TranslationContainer; use pocketmine\Player; use pocketmine\utils\TextFormat; @@ -43,7 +44,7 @@ class BanCommand extends VanillaCommand{ } if(count($args) === 0){ - $sender->sendMessage(TextFormat::RED . "Usage: " . $this->usageMessage); + $sender->sendMessage(new TranslationContainer("commands.generic.usage", [$this->usageMessage])); return false; } diff --git a/src/pocketmine/command/defaults/BanIpCommand.php b/src/pocketmine/command/defaults/BanIpCommand.php index 82432ca07..78f62cf55 100644 --- a/src/pocketmine/command/defaults/BanIpCommand.php +++ b/src/pocketmine/command/defaults/BanIpCommand.php @@ -23,6 +23,7 @@ namespace pocketmine\command\defaults; use pocketmine\command\Command; use pocketmine\command\CommandSender; +use pocketmine\event\TranslationContainer; use pocketmine\Player; use pocketmine\utils\TextFormat; @@ -43,7 +44,7 @@ class BanIpCommand extends VanillaCommand{ } if(count($args) === 0){ - $sender->sendMessage(TextFormat::RED . "Usage: " . $this->usageMessage); + $sender->sendMessage(new TranslationContainer("commands.generic.usage", [$this->usageMessage])); return false; } @@ -57,7 +58,7 @@ class BanIpCommand extends VanillaCommand{ if(($player = $sender->getServer()->getPlayer($value)) instanceof Player){ $this->processIPBan($player->getAddress(), $sender, $reason); }else{ - $sender->sendMessage(TextFormat::RED . "Usage: " . $this->usageMessage); + $sender->sendMessage(new TranslationContainer("commands.generic.usage", [$this->usageMessage])); return false; } diff --git a/src/pocketmine/command/defaults/DefaultGamemodeCommand.php b/src/pocketmine/command/defaults/DefaultGamemodeCommand.php index 9f8bbf4e0..a89bcbb4a 100644 --- a/src/pocketmine/command/defaults/DefaultGamemodeCommand.php +++ b/src/pocketmine/command/defaults/DefaultGamemodeCommand.php @@ -22,6 +22,7 @@ namespace pocketmine\command\defaults; use pocketmine\command\CommandSender; +use pocketmine\event\TranslationContainer; use pocketmine\Server; use pocketmine\utils\TextFormat; @@ -42,7 +43,7 @@ class DefaultGamemodeCommand extends VanillaCommand{ } if(count($args) === 0){ - $sender->sendMessage(TextFormat::RED . "Usage: " . $this->usageMessage); + $sender->sendMessage(new TranslationContainer("commands.generic.usage", [$this->usageMessage])); return false; } @@ -51,7 +52,7 @@ class DefaultGamemodeCommand extends VanillaCommand{ if($gameMode !== -1){ $sender->getServer()->setConfigInt("gamemode", $gameMode); - $sender->sendMessage("Default game mode set to " . strtolower(Server::getGamemodeString($gameMode))); + $sender->sendMessage(new TranslationContainer("commands.defaultgamemode.success", [Server::getGamemodeString($gameMode)])); }else{ $sender->sendMessage("Unknown game mode"); } diff --git a/src/pocketmine/command/defaults/DeopCommand.php b/src/pocketmine/command/defaults/DeopCommand.php index 8a192f6cb..3e5d2570b 100644 --- a/src/pocketmine/command/defaults/DeopCommand.php +++ b/src/pocketmine/command/defaults/DeopCommand.php @@ -23,6 +23,7 @@ namespace pocketmine\command\defaults; use pocketmine\command\Command; use pocketmine\command\CommandSender; +use pocketmine\event\TranslationContainer; use pocketmine\Player; use pocketmine\utils\TextFormat; @@ -43,7 +44,7 @@ class DeopCommand extends VanillaCommand{ } if(count($args) === 0){ - $sender->sendMessage(TextFormat::RED . "Usage: " . $this->usageMessage); + $sender->sendMessage(new TranslationContainer("commands.generic.usage", [$this->usageMessage])); return false; } diff --git a/src/pocketmine/command/defaults/DifficultyCommand.php b/src/pocketmine/command/defaults/DifficultyCommand.php index 892e91cb4..f581da36a 100644 --- a/src/pocketmine/command/defaults/DifficultyCommand.php +++ b/src/pocketmine/command/defaults/DifficultyCommand.php @@ -22,6 +22,7 @@ namespace pocketmine\command\defaults; use pocketmine\command\CommandSender; +use pocketmine\event\TranslationContainer; use pocketmine\network\protocol\SetDifficultyPacket; use pocketmine\Server; use pocketmine\utils\TextFormat; @@ -43,7 +44,7 @@ class DifficultyCommand extends VanillaCommand{ } if(count($args) !== 1){ - $sender->sendMessage(TextFormat::RED . "Usage: " . $this->usageMessage); + $sender->sendMessage(new TranslationContainer("commands.generic.usage", [$this->usageMessage])); return false; } diff --git a/src/pocketmine/command/defaults/EffectCommand.php b/src/pocketmine/command/defaults/EffectCommand.php index 0777691eb..31e08f322 100644 --- a/src/pocketmine/command/defaults/EffectCommand.php +++ b/src/pocketmine/command/defaults/EffectCommand.php @@ -25,6 +25,7 @@ use pocketmine\command\Command; use pocketmine\command\CommandSender; use pocketmine\entity\Effect; use pocketmine\entity\InstantEffect; +use pocketmine\event\TranslationContainer; use pocketmine\utils\TextFormat; class EffectCommand extends VanillaCommand{ @@ -33,7 +34,7 @@ class EffectCommand extends VanillaCommand{ parent::__construct( $name, "Adds/Removes effects on players", - "/effect [seconds] [amplifier]" + "%commands.effect.usage" ); $this->setPermission("pocketmine.command.effect"); } @@ -44,7 +45,7 @@ class EffectCommand extends VanillaCommand{ } if(count($args) < 2){ - $sender->sendMessage(TextFormat::RED . "Usage: " . $this->usageMessage); + $sender->sendMessage(new TranslationContainer("commands.generic.usage", [$this->usageMessage])); return true; } @@ -61,7 +62,7 @@ class EffectCommand extends VanillaCommand{ $player->removeEffect($effect->getId()); } - $sender->sendMessage("Took all effects from " . $player->getDisplayName()); + $sender->sendMessage(new TranslationContainer("commands.effect.success.removed.all", [$player->getDisplayName()])); return true; } @@ -72,7 +73,7 @@ class EffectCommand extends VanillaCommand{ } if($effect === null){ - $sender->sendMessage(TextFormat::RED . "Effect {$args[1]} not found"); + $sender->sendMessage(new TranslationContainer(TextFormat::RED . "%commands.effect.notFound", [(string) $args[1]])); return true; } @@ -92,19 +93,30 @@ class EffectCommand extends VanillaCommand{ $amplification = (int) $args[3]; } + if(count($args) >= 5){ + $v = strtolower($args[4]); + if($v === "on" or $v === "true" or $v === "t" or $v === "1"){ + $effect->setVisible(false); + } + } + if($duration === 0){ if(!$player->hasEffect($effect->getId())){ - $sender->sendMessage("Couldn't take ". $effect->getName() ." from ". $player->getDisplayName()); + if(count($player->getEffects()) === 0){ + $sender->sendMessage(new TranslationContainer("commands.effect.failure.notActive.all", [$player->getDisplayName()])); + }else{ + $sender->sendMessage(new TranslationContainer("commands.effect.failure.notActive", [$effect->getName(), $player->getDisplayName()])); + } return true; } $player->removeEffect($effect->getId()); - $sender->sendMessage("Took ". $effect->getName() ." from ". $player->getDisplayName()); + $sender->sendMessage(new TranslationContainer("commands.effect.success.removed", [$effect->getName(), $player->getDisplayName()])); }else{ $effect->setDuration($duration)->setAmplifier($amplification); $player->addEffect($effect); - self::broadcastCommandMessage($sender, "Given ". $effect->getName() ." (ID ". $effect->getId().") * ". $effect->getAmplifier()." to ". $player->getDisplayName() ." for ". ($effect->getDuration() / 20) ." seconds"); + self::broadcastCommandMessage($sender, new TranslationContainer("%commands.effect.success", [$effect->getName(), $effect->getId(), $effect->getAmplifier(), $player->getDisplayName(), $effect->getDuration() / 20])); } diff --git a/src/pocketmine/command/defaults/GamemodeCommand.php b/src/pocketmine/command/defaults/GamemodeCommand.php index 5f6e125e3..7d33ea78c 100644 --- a/src/pocketmine/command/defaults/GamemodeCommand.php +++ b/src/pocketmine/command/defaults/GamemodeCommand.php @@ -23,6 +23,7 @@ namespace pocketmine\command\defaults; use pocketmine\command\Command; use pocketmine\command\CommandSender; +use pocketmine\event\TranslationContainer; use pocketmine\Player; use pocketmine\Server; use pocketmine\utils\TextFormat; @@ -44,7 +45,7 @@ class GamemodeCommand extends VanillaCommand{ } if(count($args) === 0){ - $sender->sendMessage(TextFormat::RED . "Usage: " . $this->usageMessage); + $sender->sendMessage(new TranslationContainer("commands.generic.usage", [$this->usageMessage])); return false; } @@ -66,7 +67,7 @@ class GamemodeCommand extends VanillaCommand{ return true; } }elseif(!($sender instanceof Player)){ - $sender->sendMessage(TextFormat::RED . "Usage: " . $this->usageMessage); + $sender->sendMessage(new TranslationContainer("commands.generic.usage", [$this->usageMessage])); return true; } diff --git a/src/pocketmine/command/defaults/GiveCommand.php b/src/pocketmine/command/defaults/GiveCommand.php index e253da4b2..92bcd69de 100644 --- a/src/pocketmine/command/defaults/GiveCommand.php +++ b/src/pocketmine/command/defaults/GiveCommand.php @@ -23,6 +23,7 @@ namespace pocketmine\command\defaults; use pocketmine\command\Command; use pocketmine\command\CommandSender; +use pocketmine\event\TranslationContainer; use pocketmine\item\Item; use pocketmine\Player; use pocketmine\utils\TextFormat; @@ -33,7 +34,7 @@ class GiveCommand extends VanillaCommand{ parent::__construct( $name, "Gives the specified player a certain amount of items", - "/give [amount]" + "/give [amount]" //No translation :( ); $this->setPermission("pocketmine.command.give"); } @@ -44,7 +45,7 @@ class GiveCommand extends VanillaCommand{ } if(count($args) < 2){ - $sender->sendMessage(TextFormat::RED . "Usage: " . $this->usageMessage); + $sender->sendMessage(new TranslationContainer("commands.generic.usage", [$this->usageMessage])); return true; } @@ -59,13 +60,8 @@ class GiveCommand extends VanillaCommand{ } if($player instanceof Player){ - if(($player->getGamemode() & 0x01) === 0x01){ - $sender->sendMessage(TextFormat::RED . "Player is in creative mode"); - - return true; - } - if($item->getId() == 0){ - $sender->sendMessage(TextFormat::RED . "There is no item called " . $args[1] . "."); + if($item->getId() === 0){ + $sender->sendMessage(new TranslationContainer(TextFormat::RED . "%commands.give.item.notFound", [$args[1]])); return true; } @@ -78,8 +74,11 @@ class GiveCommand extends VanillaCommand{ return true; } - Command::broadcastCommandMessage($sender, "Gave " . $player->getName() . " " . $item->getCount() . " of " . $item->getName() . " (" . $item->getId() . ":" . $item->getDamage() . ")"); - + Command::broadcastCommandMessage($sender, new TranslationContainer("%commands.give.success", [ + $item->getName() . " (" . $item->getId() . ":" . $item->getDamage() . ")", + (string) $item->getCount(), + $player->getName() + ])); return true; } } \ No newline at end of file diff --git a/src/pocketmine/command/defaults/KickCommand.php b/src/pocketmine/command/defaults/KickCommand.php index bbe2ff280..63b889f33 100644 --- a/src/pocketmine/command/defaults/KickCommand.php +++ b/src/pocketmine/command/defaults/KickCommand.php @@ -23,6 +23,7 @@ namespace pocketmine\command\defaults; use pocketmine\command\Command; use pocketmine\command\CommandSender; +use pocketmine\event\TranslationContainer; use pocketmine\Player; use pocketmine\utils\TextFormat; @@ -43,7 +44,7 @@ class KickCommand extends VanillaCommand{ } if(count($args) === 0){ - $sender->sendMessage(TextFormat::RED . "Usage: " . $this->usageMessage); + $sender->sendMessage(new TranslationContainer("commands.generic.usage", [$this->usageMessage])); return false; } diff --git a/src/pocketmine/command/defaults/ListCommand.php b/src/pocketmine/command/defaults/ListCommand.php index cf1044b62..c0c8ed706 100644 --- a/src/pocketmine/command/defaults/ListCommand.php +++ b/src/pocketmine/command/defaults/ListCommand.php @@ -22,6 +22,7 @@ namespace pocketmine\command\defaults; use pocketmine\command\CommandSender; +use pocketmine\event\TranslationContainer; use pocketmine\Player; @@ -31,7 +32,7 @@ class ListCommand extends VanillaCommand{ parent::__construct( $name, "Lists all online players", - "/list" + "%command.players.usage" ); $this->setPermission("pocketmine.command.list"); } @@ -51,7 +52,7 @@ class ListCommand extends VanillaCommand{ } } - $sender->sendMessage("There are " . $onlineCount . "/" . $sender->getServer()->getMaxPlayers() . " players online:\n" . substr($online, 0, -2)); + $sender->sendMessage(new TranslationContainer("%commands.players.list " . substr($online, 0, -2), [$onlineCount, $sender->getServer()->getMaxPlayers()])); return true; } diff --git a/src/pocketmine/command/defaults/MeCommand.php b/src/pocketmine/command/defaults/MeCommand.php index 28acf25b1..d5a9ed5b0 100644 --- a/src/pocketmine/command/defaults/MeCommand.php +++ b/src/pocketmine/command/defaults/MeCommand.php @@ -22,6 +22,7 @@ namespace pocketmine\command\defaults; use pocketmine\command\CommandSender; +use pocketmine\event\TranslationContainer; use pocketmine\Player; use pocketmine\utils\TextFormat; @@ -42,7 +43,7 @@ class MeCommand extends VanillaCommand{ } if(count($args) === 0){ - $sender->sendMessage(TextFormat::RED . "Usage: " . $this->usageMessage); + $sender->sendMessage(new TranslationContainer("commands.generic.usage", [$this->usageMessage])); return false; } diff --git a/src/pocketmine/command/defaults/OpCommand.php b/src/pocketmine/command/defaults/OpCommand.php index 7c8396c14..5361290e9 100644 --- a/src/pocketmine/command/defaults/OpCommand.php +++ b/src/pocketmine/command/defaults/OpCommand.php @@ -23,6 +23,7 @@ namespace pocketmine\command\defaults; use pocketmine\command\Command; use pocketmine\command\CommandSender; +use pocketmine\event\TranslationContainer; use pocketmine\Player; use pocketmine\utils\TextFormat; @@ -43,7 +44,7 @@ class OpCommand extends VanillaCommand{ } if(count($args) === 0){ - $sender->sendMessage(TextFormat::RED . "Usage: " . $this->usageMessage); + $sender->sendMessage(new TranslationContainer("commands.generic.usage", [$this->usageMessage])); return false; } diff --git a/src/pocketmine/command/defaults/PardonCommand.php b/src/pocketmine/command/defaults/PardonCommand.php index 4555bd9ca..59726cc98 100644 --- a/src/pocketmine/command/defaults/PardonCommand.php +++ b/src/pocketmine/command/defaults/PardonCommand.php @@ -23,6 +23,7 @@ namespace pocketmine\command\defaults; use pocketmine\command\Command; use pocketmine\command\CommandSender; +use pocketmine\event\TranslationContainer; use pocketmine\utils\TextFormat; class PardonCommand extends VanillaCommand{ @@ -42,7 +43,7 @@ class PardonCommand extends VanillaCommand{ } if(count($args) !== 1){ - $sender->sendMessage(TextFormat::RED . "Usage: " . $this->usageMessage); + $sender->sendMessage(new TranslationContainer("commands.generic.usage", [$this->usageMessage])); return false; } diff --git a/src/pocketmine/command/defaults/PardonIpCommand.php b/src/pocketmine/command/defaults/PardonIpCommand.php index fe4c80f10..913b46561 100644 --- a/src/pocketmine/command/defaults/PardonIpCommand.php +++ b/src/pocketmine/command/defaults/PardonIpCommand.php @@ -23,6 +23,7 @@ namespace pocketmine\command\defaults; use pocketmine\command\Command; use pocketmine\command\CommandSender; +use pocketmine\event\TranslationContainer; use pocketmine\utils\TextFormat; class PardonIpCommand extends VanillaCommand{ @@ -42,7 +43,7 @@ class PardonIpCommand extends VanillaCommand{ } if(count($args) !== 1){ - $sender->sendMessage(TextFormat::RED . "Usage: " . $this->usageMessage); + $sender->sendMessage(new TranslationContainer("commands.generic.usage", [$this->usageMessage])); return false; } diff --git a/src/pocketmine/command/defaults/ParticleCommand.php b/src/pocketmine/command/defaults/ParticleCommand.php index db52bff9b..b00ea8e38 100644 --- a/src/pocketmine/command/defaults/ParticleCommand.php +++ b/src/pocketmine/command/defaults/ParticleCommand.php @@ -23,6 +23,7 @@ namespace pocketmine\command\defaults; use pocketmine\block\Block; use pocketmine\command\CommandSender; +use pocketmine\event\TranslationContainer; use pocketmine\item\Item; use pocketmine\level\particle\BubbleParticle; use pocketmine\level\particle\CriticalParticle; @@ -55,7 +56,7 @@ class ParticleCommand extends VanillaCommand{ parent::__construct( $name, "Adds particles to a world", - "/particle [count] [data]" + "/particle [count] [data]" //No translation, different! ); $this->setPermission("pocketmine.command.particle"); } @@ -66,7 +67,7 @@ class ParticleCommand extends VanillaCommand{ } if(count($args) < 7){ - $sender->sendMessage(TextFormat::RED . "Usage: " . $this->usageMessage); + $sender->sendMessage(new TranslationContainer("commands.generic.usage", [$this->usageMessage])); return true; } @@ -92,12 +93,12 @@ class ParticleCommand extends VanillaCommand{ $particle = $this->getParticle($name, $pos, $xd, $yd, $zd, $data); if($particle === null){ - $sender->sendMessage(TextFormat::RED . "Unknown particle name (" . $name . ")"); + $sender->sendMessage(new TranslationContainer(TextFormat::RED . "%commands.particle.notFound", [$name])); return true; } - $sender->sendMessage("Playing particle ". $name ." for ". $count ." times"); + $sender->sendMessage(new TranslationContainer("commands.particle.success", [$name, $count])); $random = new Random((int) (microtime(true) * 1000) + mt_rand()); diff --git a/src/pocketmine/command/defaults/SayCommand.php b/src/pocketmine/command/defaults/SayCommand.php index b55e8c7c4..0f4be7cfc 100644 --- a/src/pocketmine/command/defaults/SayCommand.php +++ b/src/pocketmine/command/defaults/SayCommand.php @@ -23,6 +23,7 @@ namespace pocketmine\command\defaults; use pocketmine\command\CommandSender; use pocketmine\command\ConsoleCommandSender; +use pocketmine\event\TranslationContainer; use pocketmine\Player; use pocketmine\utils\TextFormat; @@ -43,7 +44,7 @@ class SayCommand extends VanillaCommand{ } if(count($args) === 0){ - $sender->sendMessage(TextFormat::RED . "Usage: " . $this->usageMessage); + $sender->sendMessage(new TranslationContainer("commands.generic.usage", [$this->usageMessage])); return false; } diff --git a/src/pocketmine/command/defaults/SetWorldSpawnCommand.php b/src/pocketmine/command/defaults/SetWorldSpawnCommand.php index 7625059d2..a732d3469 100644 --- a/src/pocketmine/command/defaults/SetWorldSpawnCommand.php +++ b/src/pocketmine/command/defaults/SetWorldSpawnCommand.php @@ -23,6 +23,7 @@ namespace pocketmine\command\defaults; use pocketmine\command\Command; use pocketmine\command\CommandSender; +use pocketmine\event\TranslationContainer; use pocketmine\math\Vector3; use pocketmine\Player; use pocketmine\utils\TextFormat; @@ -56,7 +57,7 @@ class SetWorldSpawnCommand extends VanillaCommand{ $level = $sender->getServer()->getDefaultLevel(); $pos = new Vector3($this->getInteger($sender, $args[0]), $this->getInteger($sender, $args[1]), $this->getInteger($sender, $args[2])); }else{ - $sender->sendMessage(TextFormat::RED . "Usage: " . $this->usageMessage); + $sender->sendMessage(new TranslationContainer("commands.generic.usage", [$this->usageMessage])); return true; } diff --git a/src/pocketmine/command/defaults/SpawnpointCommand.php b/src/pocketmine/command/defaults/SpawnpointCommand.php index 2aad6c167..71574d56d 100644 --- a/src/pocketmine/command/defaults/SpawnpointCommand.php +++ b/src/pocketmine/command/defaults/SpawnpointCommand.php @@ -23,6 +23,7 @@ namespace pocketmine\command\defaults; use pocketmine\command\Command; use pocketmine\command\CommandSender; +use pocketmine\event\TranslationContainer; use pocketmine\level\Position; use pocketmine\Player; use pocketmine\utils\TextFormat; @@ -89,7 +90,7 @@ class SpawnpointCommand extends VanillaCommand{ } } - $sender->sendMessage(TextFormat::RED . "Usage: " . $this->usageMessage); + $sender->sendMessage(new TranslationContainer("commands.generic.usage", [$this->usageMessage])); return true; } diff --git a/src/pocketmine/command/defaults/TeleportCommand.php b/src/pocketmine/command/defaults/TeleportCommand.php index 6d4d231ac..539036b3e 100644 --- a/src/pocketmine/command/defaults/TeleportCommand.php +++ b/src/pocketmine/command/defaults/TeleportCommand.php @@ -23,6 +23,7 @@ namespace pocketmine\command\defaults; use pocketmine\command\Command; use pocketmine\command\CommandSender; +use pocketmine\event\TranslationContainer; use pocketmine\math\Vector3; use pocketmine\Player; use pocketmine\utils\TextFormat; @@ -44,7 +45,7 @@ class TeleportCommand extends VanillaCommand{ } if(count($args) < 1 or count($args) > 4){ - $sender->sendMessage(TextFormat::RED . "Usage: " . $this->usageMessage); + $sender->sendMessage(new TranslationContainer("commands.generic.usage", [$this->usageMessage])); return true; } @@ -102,7 +103,7 @@ class TeleportCommand extends VanillaCommand{ return true; } - $sender->sendMessage(TextFormat::RED . "Usage: " . $this->usageMessage); + $sender->sendMessage(new TranslationContainer("commands.generic.usage", [$this->usageMessage])); return true; } diff --git a/src/pocketmine/command/defaults/TellCommand.php b/src/pocketmine/command/defaults/TellCommand.php index 13e58b204..889fa19b6 100644 --- a/src/pocketmine/command/defaults/TellCommand.php +++ b/src/pocketmine/command/defaults/TellCommand.php @@ -22,6 +22,7 @@ namespace pocketmine\command\defaults; use pocketmine\command\CommandSender; +use pocketmine\event\TranslationContainer; use pocketmine\Player; use pocketmine\utils\TextFormat; @@ -43,7 +44,7 @@ class TellCommand extends VanillaCommand{ } if(count($args) < 2){ - $sender->sendMessage(TextFormat::RED . "Usage: " . $this->usageMessage); + $sender->sendMessage(new TranslationContainer("commands.generic.usage", [$this->usageMessage])); return false; } diff --git a/src/pocketmine/command/defaults/TimeCommand.php b/src/pocketmine/command/defaults/TimeCommand.php index ee31afa3f..c84a30157 100644 --- a/src/pocketmine/command/defaults/TimeCommand.php +++ b/src/pocketmine/command/defaults/TimeCommand.php @@ -23,6 +23,7 @@ namespace pocketmine\command\defaults; use pocketmine\command\Command; use pocketmine\command\CommandSender; +use pocketmine\event\TranslationContainer; use pocketmine\level\Level; use pocketmine\utils\TextFormat; @@ -39,7 +40,7 @@ class TimeCommand extends VanillaCommand{ public function execute(CommandSender $sender, $currentAlias, array $args){ if(count($args) < 1){ - $sender->sendMessage(TextFormat::RED . "Usage: " . $this->usageMessage); + $sender->sendMessage(new TranslationContainer("commands.generic.usage", [$this->usageMessage])); return false; } @@ -74,7 +75,7 @@ class TimeCommand extends VanillaCommand{ if(count($args) < 2){ - $sender->sendMessage(TextFormat::RED . "Usage: " . $this->usageMessage); + $sender->sendMessage(new TranslationContainer("commands.generic.usage", [$this->usageMessage])); return false; } @@ -115,7 +116,7 @@ class TimeCommand extends VanillaCommand{ } Command::broadcastCommandMessage($sender, "Added " . $value . " to time"); }else{ - $sender->sendMessage(TextFormat::RED . "Usage: " . $this->usageMessage); + $sender->sendMessage(new TranslationContainer("commands.generic.usage", [$this->usageMessage])); } return true; diff --git a/src/pocketmine/command/defaults/TimingsCommand.php b/src/pocketmine/command/defaults/TimingsCommand.php index c1d998b25..6f991033b 100644 --- a/src/pocketmine/command/defaults/TimingsCommand.php +++ b/src/pocketmine/command/defaults/TimingsCommand.php @@ -23,6 +23,7 @@ namespace pocketmine\command\defaults; use pocketmine\command\CommandSender; use pocketmine\event\TimingsHandler; +use pocketmine\event\TranslationContainer; use pocketmine\utils\TextFormat; class TimingsCommand extends VanillaCommand{ @@ -44,7 +45,7 @@ class TimingsCommand extends VanillaCommand{ } if(count($args) !== 1){ - $sender->sendMessage(TextFormat::RED . "Usage: " . $this->usageMessage); + $sender->sendMessage(new TranslationContainer("commands.generic.usage", [$this->usageMessage])); return true; } diff --git a/src/pocketmine/entity/Effect.php b/src/pocketmine/entity/Effect.php index 00fdb153f..6e86de00e 100644 --- a/src/pocketmine/entity/Effect.php +++ b/src/pocketmine/entity/Effect.php @@ -60,23 +60,27 @@ class Effect{ public static function init(){ self::$effects = new \SplFixedArray(256); - self::$effects[Effect::SPEED] = new Effect(Effect::SPEED, "Speed", 124, 175, 198); - self::$effects[Effect::SLOWNESS] = new Effect(Effect::SLOWNESS, "Slowness", 90, 108, 129, true); - self::$effects[Effect::SWIFTNESS] = new Effect(Effect::SWIFTNESS, "Swiftness", 217, 192, 67); - self::$effects[Effect::FATIGUE] = new Effect(Effect::FATIGUE, "Mining Fatigue", 74, 66, 23, true); - self::$effects[Effect::STRENGTH] = new Effect(Effect::STRENGTH, "Strength", 147, 36, 35); - //self::$effects[Effect::HEALING] = new InstantEffect(Effect::HEALING, "Healing", 248, 36, 35); - //self::$effects[Effect::HARMING] = new InstantEffect(Effect::HARMING, "Harming", 67, 10, 9, true); - self::$effects[Effect::NAUSEA] = new Effect(Effect::NAUSEA, "Nausea", 85, 29, 74, true); - self::$effects[Effect::JUMP] = new Effect(Effect::JUMP, "Jump", 34, 255, 76); - self::$effects[Effect::REGENERATION] = new Effect(Effect::REGENERATION, "Regeneration", 205, 92, 171); - self::$effects[Effect::DAMAGE_RESISTANCE] = new Effect(Effect::DAMAGE_RESISTANCE, "Damage Resistance", 153, 69, 58); - self::$effects[Effect::FIRE_RESISTANCE] = new Effect(Effect::FIRE_RESISTANCE, "Fire Resistance", 228, 154, 58); - self::$effects[Effect::WATER_BREATHING] = new Effect(Effect::WATER_BREATHING, "Water Breathing", 46, 82, 153); - self::$effects[Effect::INVISIBILITY] = new Effect(Effect::INVISIBILITY, "Invisibility", 127, 131, 146); - self::$effects[Effect::WEAKNESS] = new Effect(Effect::WEAKNESS, "Weakness", 72, 77, 72 , true); - self::$effects[Effect::POISON] = new Effect(Effect::POISON, "Poison", 78, 147, 49, true); - self::$effects[Effect::WITHER] = new Effect(Effect::WITHER, "Wither", 53, 42, 39, true); + self::$effects[Effect::SPEED] = new Effect(Effect::SPEED, "%potion.moveSpeed", 124, 175, 198); + self::$effects[Effect::SLOWNESS] = new Effect(Effect::SLOWNESS, "%potion.moveSlowdown", 90, 108, 129, true); + self::$effects[Effect::SWIFTNESS] = new Effect(Effect::SWIFTNESS, "%potion.digSpeed", 217, 192, 67); + self::$effects[Effect::FATIGUE] = new Effect(Effect::FATIGUE, "%potion.digSlowDown", 74, 66, 23, true); + self::$effects[Effect::STRENGTH] = new Effect(Effect::STRENGTH, "%potion.damageBoost", 147, 36, 35); + //self::$effects[Effect::HEALING] = new InstantEffect(Effect::HEALING, "%potion.heal", 248, 36, 35); + //self::$effects[Effect::HARMING] = new InstantEffect(Effect::HARMING, "%potion.harm", 67, 10, 9, true); + self::$effects[Effect::JUMP] = new Effect(Effect::JUMP, "%potion.jump", 34, 255, 76); + self::$effects[Effect::NAUSEA] = new Effect(Effect::NAUSEA, "%potion.confusion", 85, 29, 74, true); + self::$effects[Effect::REGENERATION] = new Effect(Effect::REGENERATION, "%potion.regeneration", 205, 92, 171); + self::$effects[Effect::DAMAGE_RESISTANCE] = new Effect(Effect::DAMAGE_RESISTANCE, "%potion.resistance", 153, 69, 58); + self::$effects[Effect::FIRE_RESISTANCE] = new Effect(Effect::FIRE_RESISTANCE, "%potion.fireResistance", 228, 154, 58); + self::$effects[Effect::WATER_BREATHING] = new Effect(Effect::WATER_BREATHING, "waterBreathing", 46, 82, 153); + self::$effects[Effect::INVISIBILITY] = new Effect(Effect::INVISIBILITY, "%potion.invisibility", 127, 131, 146); + //Hunger + self::$effects[Effect::WEAKNESS] = new Effect(Effect::WEAKNESS, "%potion.weaknesss", 72, 77, 72 , true); + self::$effects[Effect::POISON] = new Effect(Effect::POISON, "%potion.poison", 78, 147, 49, true); + self::$effects[Effect::WITHER] = new Effect(Effect::WITHER, "%potion.wither", 53, 42, 39, true); + //Health Boost + //Absorption + //Saturation } /** diff --git a/src/pocketmine/entity/Entity.php b/src/pocketmine/entity/Entity.php index 27f7db0c9..21467a2b1 100644 --- a/src/pocketmine/entity/Entity.php +++ b/src/pocketmine/entity/Entity.php @@ -587,7 +587,7 @@ abstract class Entity extends Location implements Metadatable{ } /** - * @return int|EntityDamageEvent|null + * @return EntityDamageEvent|null */ public function getLastDamageCause(){ return $this->lastDamageCause; diff --git a/src/pocketmine/event/TextContainer.php b/src/pocketmine/event/TextContainer.php new file mode 100644 index 000000000..149b3c90f --- /dev/null +++ b/src/pocketmine/event/TextContainer.php @@ -0,0 +1,56 @@ +text = $text; + } + + public function setText($text){ + $this->text = $text; + } + + /** + * @return string + */ + public function getText(){ + return $this->text; + } + + public function send(Player $p){ + $p->sendMessage($this->getText()); + } + + /** + * @return string + */ + public function __toString(){ + return $this->getText(); + } +} \ No newline at end of file diff --git a/src/pocketmine/event/TranslationContainer.php b/src/pocketmine/event/TranslationContainer.php new file mode 100644 index 000000000..cebd8505a --- /dev/null +++ b/src/pocketmine/event/TranslationContainer.php @@ -0,0 +1,84 @@ +setParameters($params); + } + + /** + * @return string[] + */ + public function getParameters(){ + return $this->params; + } + + /** + * @param int $i + * + * @return string + */ + public function getParameter($i){ + return isset($this->params[$i]) ? $this->params[$i] : null; + } + + /** + * @param int $i + * @param string $str + */ + public function setParameter($i, $str){ + if($i < 0 or $i > count($this->params)){ //Intended, allow to set the last + throw new \InvalidArgumentException("Invalid index $i, have " . count($this->params)); + } + + $this->params[(int) $i] = $str; + } + + /** + * @param string[] $params + */ + public function setParameters(array $params){ + $i = 0; + foreach($params as $str){ + $this->params[$i] = (string) $str; + + ++$i; + } + } + + public function send(Player $p){ + $p->sendTranslation($this->getText(), $this->getParameters()); + } +} \ No newline at end of file diff --git a/src/pocketmine/event/player/PlayerDeathEvent.php b/src/pocketmine/event/player/PlayerDeathEvent.php index a4b98c82d..f705b7ae7 100644 --- a/src/pocketmine/event/player/PlayerDeathEvent.php +++ b/src/pocketmine/event/player/PlayerDeathEvent.php @@ -22,19 +22,21 @@ namespace pocketmine\event\player; use pocketmine\event\entity\EntityDeathEvent; +use pocketmine\event\TextContainer; use pocketmine\item\Item; use pocketmine\Player; class PlayerDeathEvent extends EntityDeathEvent{ public static $handlerList = null; + /** @var TextContainer|string */ private $deathMessage; private $keepInventory = false; /** * @param Player $entity * @param Item[] $drops - * @param string $deathMessage + * @param string|TextContainer $deathMessage */ public function __construct(Player $entity, array $drops, $deathMessage){ parent::__construct($entity, $drops); @@ -48,10 +50,16 @@ class PlayerDeathEvent extends EntityDeathEvent{ return $this->entity; } + /** + * @return TextContainer|string + */ public function getDeathMessage(){ return $this->deathMessage; } + /** + * @param string|TextContainer $deathMessage + */ public function setDeathMessage($deathMessage){ $this->deathMessage = $deathMessage; } diff --git a/src/pocketmine/event/player/PlayerJoinEvent.php b/src/pocketmine/event/player/PlayerJoinEvent.php index c684f442c..e8cbbb998 100644 --- a/src/pocketmine/event/player/PlayerJoinEvent.php +++ b/src/pocketmine/event/player/PlayerJoinEvent.php @@ -21,6 +21,7 @@ namespace pocketmine\event\player; +use pocketmine\event\TextContainer; use pocketmine\Player; /** @@ -29,7 +30,7 @@ use pocketmine\Player; class PlayerJoinEvent extends PlayerEvent{ public static $handlerList = null; - /** @var string */ + /** @var string|TextContainer */ protected $joinMessage; public function __construct(Player $player, $joinMessage){ @@ -38,12 +39,15 @@ class PlayerJoinEvent extends PlayerEvent{ } /** - * @param string $joinMessage + * @param string|TextContainer $joinMessage */ public function setJoinMessage($joinMessage){ $this->joinMessage = $joinMessage; } + /** + * @return string|TextContainer + */ public function getJoinMessage(){ return $this->joinMessage; } diff --git a/src/pocketmine/lang/BaseLang.php b/src/pocketmine/lang/BaseLang.php new file mode 100644 index 000000000..399b4b0e3 --- /dev/null +++ b/src/pocketmine/lang/BaseLang.php @@ -0,0 +1,159 @@ +langName = strtolower($lang); + + if($path === null){ + $path = \pocketmine\PATH . "src/pocketmine/lang/base/"; + } + + $this->loadLang($path . $this->langName . ".ini", $this->lang); + $this->loadLang($path . self::FALLBACK_LANGUAGE . ".ini", $this->fallbackLang); + } + + public function getName(){ + return $this->get("language.name"); + } + + public function getLang(){ + return $this->langName; + } + + protected function loadLang($path, array &$d){ + if(file_exists($path) and strlen($content = file_get_contents($path)) > 0){ + foreach(explode("\n", $content) as $line){ + $line = trim($line); + if($line === "" or $line{0} === "#"){ + continue; + } + + $t = explode("=", $line); + if(count($t) < 2){ + continue; + } + + $key = trim(array_shift($t)); + $value = trim(implode("=", $t)); + + if($value === ""){ + continue; + } + + $d[$key] = $value; + } + } + } + + public function translate(TextContainer $c){ + if($c instanceof TranslationContainer){ + $baseText = $this->get($c->getText()); + $baseText = $this->parseTranslation( $baseText !== null ? $baseText : $c->getText()); + + foreach($c->getParameters() as $i => $p){ + $baseText = str_replace("{%$i}", $this->parseTranslation($p), $baseText); + } + }else{ + $baseText = $this->parseTranslation($c->getText()); + } + + return $baseText; + } + + public function internalGet($id){ + if(isset($this->lang[$id])){ + return $this->lang[$id]; + }elseif(isset($this->fallbackLang[$id])){ + return $this->fallbackLang[$id]; + } + + return null; + } + + public function get($id){ + $id = trim($id, "%"); + if(isset($this->lang[$id])){ + return $this->lang[$id]; + }elseif(isset($this->fallbackLang[$id])){ + return $this->fallbackLang[$id]; + } + + return $id; + } + + protected function parseTranslation($text){ + $newString = ""; + + $replaceString = null; + + $len = strlen($text); + for($i = 0; $i < $len; ++$i){ + $c = $text{$i}; + if($replaceString !== null){ + if((ord($c) >= 0x30 and ord($c) <= 0x39) or (ord($c) >= 0x41 and ord($c) <= 0x5a) or (ord($c) >= 0x61 and ord($c) <= 0x7a) or $c === "."){ + $replaceString .= $c; + }else{ + if(($t = $this->internalGet(substr($replaceString, 1)))){ + $newString .= $t; + }else{ + $newString .= $replaceString; + } + $replaceString = null; + + if($c === "%"){ + $replaceString = $c; + }else{ + $newString .= $c; + } + } + }elseif($c === "%"){ + $replaceString = $c; + }else{ + $newString .= $c; + } + } + + if($replaceString !== null){ + if(($t = $this->internalGet(substr($replaceString, 1)))){ + $newString .= $t; + }else{ + $newString .= $replaceString; + } + } + + return $newString; + } +} diff --git a/src/pocketmine/lang/base/en.ini b/src/pocketmine/lang/base/en.ini new file mode 100644 index 000000000..21ab7330c --- /dev/null +++ b/src/pocketmine/lang/base/en.ini @@ -0,0 +1,84 @@ +# Language file compatible with Minecraft: Pocket Edition identifiers +# +# A message doesn't need to be there to be shown correctly on the client. +# Only messages shown in PocketMine itself need to be here + +language.name=English + +multiplayer.player.joined={%0} joined the game +multiplayer.player.leave={%0} left the game + +death.fell.accident.generic={%0} fell from a high place +death.attack.inFire={%0} went up in flames +death.attack.onFire={%0} burned to death +death.attack.lava={%0} tried to swim in lava +death.attack.inWall={%0} suffocated in a wall +death.attack.drown={%0} drowned +death.attack.cactus={%0} was pricked to death +death.attack.generic={%0} died +death.attack.explosion={%0} blew up +death.attack.explosion.player={%0} was blown up by {%1} +death.attack.magic={%0} was killed by magic +death.attack.wither={%0} withered away +death.attack.mob={%0} was slain by {%1} +death.attack.player={%0} was slain by {%1} +death.attack.player.item={%0} was slain by {%1} using {%2} +death.attack.arrow={%0} was shot by {%1} +death.attack.arrow.item={%0} was shot by {%1} using {%2} +death.attack.fall={%0} hit the ground too hard +death.attack.outOfWorld={%0} fell out of the world + +gameMode.survival=Survival Mode +gameMode.creative=Creative Mode +gameMode.adventure=Adventure Mode +gameMode.spectator=Spectator Mode +gameMode.changed=Your game mode has been updated + +potion.moveSpeed=Speed +potion.moveSlowdown=Slowness +potion.digSpeed=Haste +potion.digSlowDown=Mining Fatigue +potion.damageBoost=Strength +potion.heal=Instant Health +potion.harm=Instant Damage +potion.jump=Jump Boost +potion.confusion=Nausea +potion.regeneration=Regeneration +potion.resistance=Resistance +potion.fireResistance=Fire Resistance +potion.waterBreathing=Water Breathing +potion.invisibility=Invisibility +potion.blindness=Blindness +potion.nightVision=Night Vision +potion.hunger=Hunger +potion.weakness=Weakness +potion.poison=Poison +potion.wither=Wither +potion.healthBoost=Health Boost +potion.absorption=Absorption +potion.saturation=Saturation + +commands.generic.exception=An unknown error occurred while attempting to perform this command +commands.generic.permission=You do not have permission to use this command +commands.generic.notFound=Unknown command. Try /help for a list of commands +commands.generic.usage=Usage: {%0} + +commands.give.item.notFound=There is no such item with name {%0} +commands.give.success=Given {%0} * {%1} to {%2} + +commands.effect.usage=/effect [seconds] [amplifier] [hideParticles] OR /effect clear +commands.effect.notFound=There is no such mob effect with ID {%0} +commands.effect.success=Given {%0} (ID {%1}) * {%2} to {%3} for {%4} seconds +commands.effect.success.removed=Took {%0} from {%1} +commands.effect.success.removed.all=Took all effects from {%0} +commands.effect.failure.notActive=Couldn't take {%0} from {%1} as they do not have the effect +commands.effect.failure.notActive.all=Couldn't take any effects from {%0} as they do not have any + +commands.particle.success=Playing effect {%0} for {%1} times +commands.particle.notFound=Unknown effect name {%0} + +commands.players.usage=/list +commands.players.list=There are {%0}/{%1} players online: + +commands.defaultgamemode.usage=/defaultgamemode +commands.defaultgamemode.success=The world's default game mode is now {%0} \ No newline at end of file diff --git a/src/pocketmine/level/Level.php b/src/pocketmine/level/Level.php index 0efb2a7ad..f990c3c2b 100644 --- a/src/pocketmine/level/Level.php +++ b/src/pocketmine/level/Level.php @@ -443,7 +443,7 @@ class Level implements ChunkManager, Metadatable{ $defaultLevel = $this->server->getDefaultLevel(); foreach($this->getPlayers() as $player){ if($this === $defaultLevel or $defaultLevel === null){ - $player->close(TextFormat::YELLOW . $player->getName() . " has left the game", "Forced default level unload"); + $player->close($player->getLeaveMessage(), "Forced default level unload"); }elseif($defaultLevel instanceof Level){ $player->teleport($this->server->getDefaultLevel()->getSafeSpawn()); } diff --git a/src/pocketmine/network/RakLibInterface.php b/src/pocketmine/network/RakLibInterface.php index 578f8abd7..0d37d3598 100644 --- a/src/pocketmine/network/RakLibInterface.php +++ b/src/pocketmine/network/RakLibInterface.php @@ -117,7 +117,9 @@ class RakLibInterface implements ServerInstance, AdvancedSourceInterface{ unset($this->players[$identifier]); unset($this->batchedPackets[$identifier]); unset($this->identifiersACK[$identifier]); - $player->close(TextFormat::YELLOW . $player->getName() . " has left the game", $reason); + if(!$player->closed){ + $player->close($player->getLeaveMessage(), $reason); + } } }