From df3e4561629e046909dbd51fbf5db7bf4a62254c Mon Sep 17 00:00:00 2001 From: Shoghi Cervantes Date: Wed, 2 Apr 2014 05:59:26 +0200 Subject: [PATCH] Added /give, /gamemode --- src/pocketmine/BlockAPI.php | 76 --------------- src/pocketmine/command/SimpleCommandMap.php | 4 + .../command/defaults/GamemodeCommand.php | 95 +++++++++++++++++++ .../command/defaults/GiveCommand.php | 84 ++++++++++++++++ 4 files changed, 183 insertions(+), 76 deletions(-) create mode 100644 src/pocketmine/command/defaults/GamemodeCommand.php create mode 100644 src/pocketmine/command/defaults/GiveCommand.php diff --git a/src/pocketmine/BlockAPI.php b/src/pocketmine/BlockAPI.php index 9312dd5ac..f9a5789f5 100644 --- a/src/pocketmine/BlockAPI.php +++ b/src/pocketmine/BlockAPI.php @@ -78,80 +78,4 @@ class BlockAPI{ return $output; } - public function blockUpdateAround(Position $pos, $type = Level::BLOCK_UPDATE_NORMAL, $delay = false){ - if($delay !== false){ - $this->scheduleBlockUpdate($pos->getSide(0), $delay, $type); - $this->scheduleBlockUpdate($pos->getSide(1), $delay, $type); - $this->scheduleBlockUpdate($pos->getSide(2), $delay, $type); - $this->scheduleBlockUpdate($pos->getSide(3), $delay, $type); - $this->scheduleBlockUpdate($pos->getSide(4), $delay, $type); - $this->scheduleBlockUpdate($pos->getSide(5), $delay, $type); - }else{ - $this->blockUpdate($pos->getSide(0), $type); - $this->blockUpdate($pos->getSide(1), $type); - $this->blockUpdate($pos->getSide(2), $type); - $this->blockUpdate($pos->getSide(3), $type); - $this->blockUpdate($pos->getSide(4), $type); - $this->blockUpdate($pos->getSide(5), $type); - } - } - - public function blockUpdate(Position $pos, $type = Level::BLOCK_UPDATE_NORMAL){ - if(!($pos instanceof block\Block)){ - $block = $pos->level->getBlock($pos); - }else{ - $pos = new Position($pos->x, $pos->y, $pos->z, $pos->level); - $block = $pos->level->getBlock($pos); - } - if($block === false){ - return false; - } - - $level = $block->onUpdate($type); - if($level === Level::BLOCK_UPDATE_NORMAL){ - $this->blockUpdateAround($block, $level); - } - - return $level; - } - - public function scheduleBlockUpdate(Position $pos, $delay, $type = Level::BLOCK_UPDATE_SCHEDULED){ - $type = (int) $type; - if($delay < 0){ - return false; - } - - $index = $pos->x . "." . $pos->y . "." . $pos->z . "." . $pos->level->getName() . "." . $type; - $delay = microtime(true) + $delay * 0.05; - if(!isset($this->scheduledUpdates[$index])){ - $this->scheduledUpdates[$index] = $pos; - $this->server->query("INSERT INTO blockUpdates (x, y, z, level, type, delay) VALUES (" . $pos->x . ", " . $pos->y . ", " . $pos->z . ", '" . $pos->level->getName() . "', " . $type . ", " . $delay . ");"); - - return true; - } - - return false; - } - - public function blockUpdateTick(){ - $time = microtime(true); - if(count($this->scheduledUpdates) > 0){ - $update = $this->server->query("SELECT x,y,z,level,type FROM blockUpdates WHERE delay <= " . $time . ";"); - if($update instanceof \SQLite3Result){ - $upp = array(); - while(($up = $update->fetchArray(SQLITE3_ASSOC)) !== false){ - $index = $up["x"] . "." . $up["y"] . "." . $up["z"] . "." . $up["level"] . "." . $up["type"]; - if(isset($this->scheduledUpdates[$index])){ - $upp[] = array((int) $up["type"], $this->scheduledUpdates[$index]); - unset($this->scheduledUpdates[$index]); - } - } - $this->server->query("DELETE FROM blockUpdates WHERE delay <= " . $time . ";"); - foreach($upp as $b){ - $this->blockUpdate($b[1], $b[0]); - } - } - } - } - } diff --git a/src/pocketmine/command/SimpleCommandMap.php b/src/pocketmine/command/SimpleCommandMap.php index 7e62e2c77..2930e208d 100644 --- a/src/pocketmine/command/SimpleCommandMap.php +++ b/src/pocketmine/command/SimpleCommandMap.php @@ -27,6 +27,8 @@ use pocketmine\command\defaults\BanListCommand; use pocketmine\command\defaults\DefaultGamemodeCommand; use pocketmine\command\defaults\DeopCommand; use pocketmine\command\defaults\DifficultyCommand; +use pocketmine\command\defaults\GamemodeCommand; +use pocketmine\command\defaults\GiveCommand; use pocketmine\command\defaults\HelpCommand; use pocketmine\command\defaults\KickCommand; use pocketmine\command\defaults\ListCommand; @@ -86,6 +88,8 @@ class SimpleCommandMap implements CommandMap{ $this->register("pocketmine", new SaveOnCommand("save-on")); $this->register("pocketmine", new SaveOffCommand("save-off")); $this->register("pocketmine", new SaveCommand("save-all")); + $this->register("pocketmine", new GiveCommand("give")); + $this->register("pocketmine", new GamemodeCommand("gamemode")); } diff --git a/src/pocketmine/command/defaults/GamemodeCommand.php b/src/pocketmine/command/defaults/GamemodeCommand.php new file mode 100644 index 000000000..a9423fc41 --- /dev/null +++ b/src/pocketmine/command/defaults/GamemodeCommand.php @@ -0,0 +1,95 @@ + [player]" + ); + $this->setPermission("pocketmine.command.gamemode"); + } + + public function execute(CommandSender $sender, $currentAlias, array $args){ + if(!$this->testPermission($sender)){ + return true; + } + + if(count($args) === 0){ + $sender->sendMessage(TextFormat::RED . "Usage: " . $this->usageMessage); + + return false; + } + + $gameMode = Server::getGamemodeFromString($args[0]); + + if($gameMode === -1){ + $sender->sendMessage("Unknown game mode"); + + return true; + Server::getInstance()->setConfigInt("gamemode", $gameMode); + $sender->sendMessage("Default game mode set to " . strtolower(Server::getGamemodeString($gameMode))); + } + + $target = $sender; + if(isset($args[1])){ + $target = Server::getInstance()->getPlayer($args[1]); + if($target === null){ + $sender->sendMessage("Can't find player " . $args[1]); + + return true; + } + }elseif(!($sender instanceof Player)){ + $sender->sendMessage(TextFormat::RED . "Usage: " . $this->usageMessage); + + return true; + } + + if($gameMode !== $target->getGamemode()){ + $target->setGamemode($gameMode); + if($gameMode !== $target->getGamemode()){ + $sender->sendMessage("Game mode change for " . $target->getName() . " failed!"); + }else{ + if($target === $sender){ + Command::broadcastCommandMessage($sender, "Set own gamemode to " . strtolower(Server::getGamemodeString($gameMode)) . " mode"); + }else{ + Command::broadcastCommandMessage($sender, "Set " . $target->getName() . "'s gamemode to " . strtolower(Server::getGamemodeString($gameMode)) . " mode"); + } + } + }else{ + $sender->sendMessage($target->getName() . " already has game mode " . strtolower(Server::getGamemodeString($gameMode))); + + return true; + } + + return true; + } +} \ No newline at end of file diff --git a/src/pocketmine/command/defaults/GiveCommand.php b/src/pocketmine/command/defaults/GiveCommand.php new file mode 100644 index 000000000..6cdc8e215 --- /dev/null +++ b/src/pocketmine/command/defaults/GiveCommand.php @@ -0,0 +1,84 @@ + [amount]" + ); + $this->setPermission("pocketmine.command.give"); + } + + public function execute(CommandSender $sender, $currentAlias, array $args){ + if(!$this->testPermission($sender)){ + return true; + } + + if(count($args) < 2){ + $sender->sendMessage(TextFormat::RED . "Usage: " . $this->usageMessage); + + return false; + } + + $player = Server::getInstance()->getPlayer($args[0]); + $item = Item::fromString($args[1]); + + if(!isset($args[2])){ + $item->setCount($item->getMaxStackSize()); + }else{ + $item->setCount((int) $args[2]); + } + + 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] . "."); + + return true; + } + $player->addItem(clone $item); + }else{ + $sender->sendMessage(TextFormat::RED . "Can't find player " . $args[0]); + + return true; + } + + Command::broadcastCommandMessage($sender, "Gave " . $player->getName() . " " . $item->getCount() . " of " . $item->getName() . " (" . $item->getID() . ":" . $item->getMetadata() . ")"); + + return true; + } +} \ No newline at end of file