예제 #1
0
 public function onCommand(CommandSender $sender, Command $cmd, $label, array $args)
 {
     if ($cmd->getName() != "reg") {
         return false;
     }
     if (count($args) == 0) {
         $args = ["count"];
     }
     $scmd = strtolower(array_shift($args));
     switch ($scmd) {
         case "count":
             if (count($args) != 0) {
                 return false;
             }
             $cnt = count(glob($this->owner->getServer()->getDataPath() . "players/*.dat"));
             $sender->sendMessage(mc::n(mc::_("One player registered"), mc::_("%1% players registered", $cnt), $cnt));
             return true;
         case "ls":
         case "list":
             $pageNumber = $this->getPageNumber($args);
             if (count($args) == 0) {
                 $pattern = "*";
             } elseif (count($args) == 1) {
                 $pattern = implode(" ", $args);
             } else {
                 return false;
             }
             $f = glob($this->owner->getServer()->getDataPath() . "players/" . $pattern . ".dat");
             $txt = [mc::n(mc::_("One player found"), mc::_("%1% players found", count($f)), count($f))];
             $cols = 8;
             $i = 0;
             foreach ($f as $n) {
                 $n = basename($n, ".dat");
                 if ($i++ % $cols == 0) {
                     $txt[] = $n;
                 } else {
                     $txt[count($txt) - 1] .= ", " . $n;
                 }
             }
             return $this->paginateText($sender, $pageNumber, $txt);
         case "rm":
             if (count($args) != 1) {
                 return false;
             }
             $victim = strtolower(array_shift($args));
             $target = $this->owner->getServer()->getPlayer($victim);
             if ($target !== null) {
                 $sender->sendMessage(TextFormat::RED . mc::_("Can not delete player re-gistration while they are on-line"));
                 return true;
             }
             $target = $this->owner->getServer()->getOfflinePlayer($victim);
             if ($target == null || !$target->hasPlayedBefore()) {
                 $sender->sendMessage(mc::_("%1% can not be found.", $victim));
                 return true;
             }
             $f = $this->owner->getServer()->getDataPath() . "players/" . $victim . ".dat";
             if (!is_file($f)) {
                 $sender->sendMessage(TextFormat::RED . mc::_("Problem deleting %1%", $victim));
                 return true;
             }
             unlink($f);
             $sender->sendMessage(TextFormat::RED . mc::_("%1% was deleted.", $victim));
             return true;
         case "since":
             $pageNumber = $this->getPageNumber($args);
             if (count($args) == 0) {
                 return false;
             }
             if (($when = strtotime(implode(" ", $args))) === false) {
                 return false;
             }
             $f = glob($this->owner->getServer()->getDataPath() . "players/*.dat");
             $tab = [[mc::_("Date/Time"), "x"]];
             foreach ($f as $n) {
                 $n = basename($n, ".dat");
                 $target = $this->owner->getServer()->getOfflinePlayer($n);
                 if ($target == null || !$target->hasPlayedBefore()) {
                     continue;
                 }
                 if (($regdate = $target->getFirstPlayed() / 1000) > $when) {
                     $tab[] = [date(mc::_("d-M-Y H:i"), $regdate), $n];
                 }
             }
             $cnt = count($tab) - 1;
             if ($cnt == 0) {
                 $sender->sendMessage(mc::_("No players found"));
                 return true;
             }
             $tab[0][1] = mc::n(mc::_("One player found"), mc::_("%1% players found", $cnt), $cnt);
             return $this->paginateTable($sender, $pageNumber, $tab);
     }
     return false;
 }
예제 #2
0
 private function cmdPlayers(CommandSender $c, $pageNumber)
 {
     $all = [];
     foreach ($this->owner->getServer()->getOnlinePlayers() as $p) {
         $all[$p->getName()] = mc::_("*current-server*");
     }
     foreach ($this->servers as $id => $ln) {
         $dat = preg_split('/\\s+/', $ln, 3);
         $host = array_shift($dat);
         $port = array_shift($dat);
         $Query = new MinecraftQuery();
         try {
             $Query->Connect($host, $port, 1);
         } catch (MinecraftQueryException $e) {
             $this->owner->getLogger()->warning(mc::_("Query %1% failed: %2%", $host, $e->getMessage()));
             continue;
         }
         if (($players = $Query->GetPlayers()) === false) {
             continue;
         }
         if (count($players) == 0) {
             continue;
         }
         foreach ($players as $p) {
             if ($c->hasPermission("gb.cmd.query.players.showip")) {
                 $all[$p] = "{$id} ({$host}:{$port})";
             } else {
                 $all[$p] = "{$id}";
             }
         }
     }
     if (count($all) == 0) {
         $c->sendMessage(TextFormat::YELLOW . "Nobody is on-line at the moment");
     }
     $txt = [mc::n(mc::_("One player found"), mc::_("%1% players found", count($all)), count($all))];
     ksort($all, SORT_NATURAL);
     foreach ($all as $i => $j) {
         $txt[] = $i . " @ " . $j;
     }
     return $this->paginateText($c, $pageNumber, $txt);
 }
예제 #3
0
 public function onCommand(CommandSender $sender, Command $cmd, $label, array $args)
 {
     switch ($cmd->getName()) {
         case "nick":
             if (!MPMU::inGame($sender)) {
                 return true;
             }
             if (count($args) == 0) {
                 $sender->sendName(mc::_("Current nick is: %1%", $sender->getDisplayName()));
                 return true;
             }
             if (count($args) !== 1) {
                 return false;
             }
             $this->owner->getServer(mc::_("%1% is now known as %2%", $sender->getDisplayName(), $args[0]));
             $sender->setDisplayName($args[0]);
             return true;
         case "clearchat":
             if (!MPMU::inGame($sender)) {
                 return true;
             }
             if (count($args) != 0) {
                 return false;
             }
             for ($i = 0; $i < 32; ++$i) {
                 $sender->sendMessage(" ");
             }
             return true;
         case "chat-on":
         case "chat-off":
             if (count($args) > 0) {
                 switch ($n = strtolower(array_shift($args))) {
                     case "--list":
                     case "--ls":
                     case "-l":
                         if (!MPMU::access($sender, "gb.cmd.togglechat.others")) {
                             return true;
                         }
                         $pageNumber = $this->getPageNumber($args);
                         $txt = [""];
                         $cols = 8;
                         $i = 0;
                         foreach ($this->owner->getServer()->getOnlinePlayers() as $p) {
                             if (!$this->getState($p, false)) {
                                 continue;
                             }
                             $n = $p->getDisplayName();
                             if ($i++ % $cols == 0) {
                                 $txt[] = $n;
                             } else {
                                 $txt[count($txt) - 1] .= ", " . $n;
                             }
                         }
                         if ($i == 0) {
                             $sender->sendMessage(mc::_("No players with chat off"));
                             if (!$this->chat) {
                                 $sender->sendMessage(mc::_("Chat is GLOBALLY off"));
                             }
                             return true;
                         }
                         if ($this->chat) {
                             $txt[0] = mc::n(mc::_("One player with chat off"), mc::_("%1% players with chat off", $i), $i);
                         } else {
                             $txt[0] = mc::_("Chat is GLOBALLY off");
                         }
                         return $this->paginateText($sender, $pageNumber, $txt);
                     case "--server":
                     case "--global":
                     case "-g":
                         if (count($args)) {
                             return false;
                         }
                         if (!MPMU::access($sender, "gb.cmd.togglechat.global")) {
                             return true;
                         }
                         if ($cmd->getName() == "chat-off") {
                             $this->chat = false;
                             $this->owner->getServer()->broadcastMessage(mc::_("Chat disabled globally from %1%", $sender->getName()));
                         } else {
                             $this->chat = true;
                             $this->owner->getServer()->broadcastMessage(mc::_("Chat enabled globally from %1%", $sender->getName()));
                         }
                         return true;
                     default:
                         if (count($args)) {
                             return false;
                         }
                         if (!MPMU::access($sender, "gb.cmd.togglechat.others")) {
                             return true;
                         }
                         $player = $this->owner->getServer()->getPlayer($n);
                         if ($player === null) {
                             $sender->sendMessage(mc::_("Unable to find %1%", $n));
                             return true;
                         }
                         if ($cmd->getName() == "chat-off") {
                             $this->setState($player, true);
                             $player->sendMessage(mc::_("Chat disabled from %1%", $sender->getName()));
                             $sender->sendMessage(mc::_("Chat disabled for %1%", $player->getDisplayName()));
                         } else {
                             $this->unsetState($player);
                             $player->sendMessage(mc::_("Chat enabled from %1%", $sender->getName()));
                             $sender->sendMessage(mc::_("Chat enabled for %1%", $player->getDisplayName()));
                         }
                         return true;
                 }
                 return false;
             }
             if (!MPMU::inGame($sender)) {
                 return true;
             }
             if ($cmd->getName() == "chat-off") {
                 $this->setState($sender, true);
                 $sender->sendMessage(mc::_("Chat disabled"));
             } else {
                 $this->unsetState($sender);
                 $sender->sendMessage(mc::_("Chat enabled"));
             }
             return true;
     }
     return false;
 }
예제 #4
0
 public function onCommand(CommandSender $sender, Command $cmd, $label, array $args)
 {
     if ($cmd->getName() != "skin") {
         return false;
     }
     $pageNumber = $this->getPageNumber($args);
     if (isset($args[0])) {
         $human = $this->owner->getServer()->getPlayer($args[0]);
         if ($human !== null) {
             array_shift($args);
         } else {
             $human = $sender;
         }
     }
     if (count($args) == 0) {
         $args = ["ls"];
     }
     switch (strtolower(array_shift($args))) {
         case "ls":
             $skins = glob($this->owner->getDataFolder() . "*.skin");
             if (count($skins) == 0) {
                 $sender->sendMessage(mc::_("No skins found"));
                 return true;
             }
             $txt = [mc::n(mc::_("Found one skin"), mc::_("Found %1% skins", count($skins)), count($skins))];
             $cols = 8;
             $i = 0;
             foreach ($skins as $n) {
                 $n = basename($n, ".skin");
                 if ($i++ % $cols == 0) {
                     $txt[] = $n;
                 } else {
                     $txt[count($txt) - 1] .= ", " . $n;
                 }
             }
             return $this->paginateText($sender, $pageNumber, $txt);
         case "save":
             if (count($args) != 1) {
                 return false;
             }
             if (!MPMU::inGame($human)) {
                 return true;
             }
             if ($human !== $sender && !MPMU::access($sender, "gb.cmd.skin.other")) {
                 return true;
             }
             $fn = preg_replace('/\\.skin$/', '', basename($args[0])) . ".skin";
             $bin = zlib_encode($human->getSkinData(), ZLIB_ENCODING_DEFLATE, 9);
             file_put_contents($this->owner->getDataFolder() . $fn, $bin);
             $sender->sendMessage(mc::_("Wrote %1% bytes to %2%", strlen($bin), $fn));
             return true;
         case "load":
             $slim = false;
             if (isset($args[0]) && $args[0] == "--slim") {
                 $slim = true;
                 array_shift($args);
             }
             if ($human !== $sender && !MPMU::access($sender, "gb.cmd.skin.other")) {
                 return true;
             }
             if (count($args) != 1) {
                 return false;
             }
             if (!MPMU::inGame($human)) {
                 return true;
             }
             $fn = preg_replace('/\\.skin$/', '', basename($args[0])) . ".skin";
             $bin = file_get_contents($this->owner->getDataFolder() . $fn);
             if ($bin === false) {
                 $sender->sendMessage(mc::_("Unable to read %1%", $fn));
                 return true;
             }
             $human->setSkin(zlib_decode($bin), $slim);
             $sender->sendMessage(mc::_("Updated skin for %1%", $human->getName()));
             return true;
     }
     return false;
 }
예제 #5
0
 private function rmInvItem(CommandSender $sender, array $args)
 {
     if (count($args) == 0) {
         return false;
     }
     if (($target = $this->owner->getServer()->getPlayer($args[0])) === null) {
         if (!MPMU::inGame($sender)) {
             return true;
         }
         $target = $sender;
         $other = false;
     } else {
         if (!MPMU::access($sender, "gb.cmd.rminv.others")) {
             return true;
         }
         array_shift($args);
         $other = true;
     }
     if (count($args) == 0) {
         return false;
     }
     if ($target->isCreative() || $target->isSpectator()) {
         $sender->sendMessage(mc::_("%1% is in %2% mode", $target->getDisplayName(), MPMU::gamemodeStr($target->getGamemode())));
         return true;
     }
     $count = null;
     if (count($args) > 1 && is_numeric($args[count($args) - 1])) {
         $count = array_pop($args);
     }
     $args = strtolower(implode("_", $args));
     if ($args == "hand") {
         $item = clone $target->getInventory()->getItemInHand();
         if ($item->getId() == 0) {
             $sender->sendMessage(mc::_("Must be holding something"));
             return true;
         }
     } else {
         $item = Item::fromString($args);
         if ($item->getId() == 0) {
             $sender->sendMessage(mc::_("There is no item called %1%", $args));
             return true;
         }
     }
     $k = 0;
     foreach ($target->getInventory()->getContents() as $slot => &$inv) {
         if ($inv->getId() != $item->getId()) {
             continue;
         }
         if ($count !== null) {
             if ($inv->getCount() > $count) {
                 $k += $count;
                 $inv->setCount($inv->getCount() - $count);
                 $target->getInventory()->setItem($slot, clone $inv);
                 break;
             }
             $count -= $inv->getCount();
         }
         $k += $inv->getCount();
         $target->getInventory()->clear($slot);
         if ($count === 0) {
             break;
         }
     }
     if ($k) {
         $sender->sendMessage(mc::n(mc::_("one item of %1% removed", ItemName::str($item)), mc::_("%2% items of %1% removed", ItemName::str($item), $k), $k));
         if ($other) {
             $target->sendMessage(mc::n(mc::_("%2% took one item of %1% from you", ItemName::str($item), $sender->getName()), mc::_("%3% took %2% items of %1% from you", ItemName::str($item), $k, $sender->getName()), $k));
         }
     } else {
         $sender->sendMessage(mc::_("No items were removed!"));
     }
     return true;
 }
예제 #6
0
 public function onPlayerJoin(PlayerJoinEvent $e)
 {
     $pl = $e->getPlayer();
     if ($pl == null) {
         return;
     }
     if (!$pl->hasPermission("gb.cmd.rpt.read")) {
         return;
     }
     list($id, $rpt) = $this->rpt->getAll();
     if (count($rpt)) {
         $pl->sendMessage(mc::n(mc::_("One report on file"), mc::_("%1% reports on file", count($rpt)), count($rpt)));
     }
 }