diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index 337dcd07f..a491487c1 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -28,6 +28,7 @@ use pocketmine\entity\DroppedItem; use pocketmine\entity\Entity; use pocketmine\entity\Human; use pocketmine\entity\Living; +use pocketmine\event\block\SignChangeEvent; use pocketmine\event\entity\EntityDamageByEntityEvent; use pocketmine\event\entity\EntityDamageEvent; use pocketmine\event\inventory\InventoryCloseEvent; @@ -1986,18 +1987,28 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ } $this->craftingType = 0; - $t = $this->getLevel()->getTile(new Vector3($packet->x, $packet->y, $packet->z)); + $t = $this->getLevel()->getTile($v = new Vector3($packet->x, $packet->y, $packet->z)); if($t instanceof Sign){ - if(!isset($t->namedtag->Creator) or $t->namedtag["Creator"] !== $this->username){ + $nbt = new NBT(NBT::LITTLE_ENDIAN); + $nbt->read($packet->namedtag); + $nbt = $nbt->getData(); + if($nbt["id"] !== Tile::SIGN){ $t->spawnTo($this); }else{ - $nbt = new NBT(NBT::LITTLE_ENDIAN); - $nbt->read($packet->namedtag); - $nbt = $nbt->getData(); - if($nbt["id"] !== Tile::SIGN){ - $t->spawnTo($this); + $ev = new SignChangeEvent($this->getLevel()->getBlock($v), $this, [ + $nbt["Text1"], $nbt["Text2"], $nbt["Text3"], $nbt["Text4"] + ]); + + if(!isset($t->namedtag->Creator) or $t->namedtag["Creator"] !== $this->username){ + $ev->setCancelled(true); + } + + $this->server->getPluginManager()->callEvent($ev); + + if(!$ev->isCancelled()){ + $t->setText($ev->getLine(0), $ev->getLine(1), $ev->getLine(2), $ev->getLine(3)); }else{ - $t->setText($nbt["Text1"], $nbt["Text2"], $nbt["Text3"], $nbt["Text4"]); + $t->spawnTo($this); } } } diff --git a/src/pocketmine/PocketMine.php b/src/pocketmine/PocketMine.php index 1bac8fd29..f6f64e51d 100644 --- a/src/pocketmine/PocketMine.php +++ b/src/pocketmine/PocketMine.php @@ -74,10 +74,9 @@ namespace pocketmine { use raklib\RakLib; const VERSION = "Alpha_1.4dev"; - const API_VERSION = "1.2.1"; + const API_VERSION = "1.3.0"; const CODENAME = "絶好(Zekkou)ケーキ(Cake)"; const MINECRAFT_VERSION = "v0.9.5 alpha"; - const PHP_VERSION = "5.5"; if(\Phar::running(true) !== ""){ @define("pocketmine\\PATH", \Phar::running(true) . "/"); diff --git a/src/pocketmine/Server.php b/src/pocketmine/Server.php index 797da1c58..c23900935 100644 --- a/src/pocketmine/Server.php +++ b/src/pocketmine/Server.php @@ -1668,10 +1668,9 @@ class Server{ Timings::$serverCommandTimer->startTiming(); if(($line = $this->console->getLine()) !== null){ $this->pluginManager->callEvent($ev = new ServerCommandEvent($this->consoleSender, $line)); - if($ev->isCancelled()){ - return; + if(!$ev->isCancelled()){ + $this->dispatchCommand($ev->getSender(), $ev->getCommand()); } - $this->dispatchCommand($this->consoleSender, $ev->getCommand()); } Timings::$serverCommandTimer->stopTiming(); } @@ -2002,7 +2001,7 @@ class Server{ "os" => Utils::getOS(), "memory_total" => $this->getConfigString("memory-limit"), "memory_usage" => memory_get_usage(), - "php_version" => \pocketmine\PHP_VERSION, + "php_version" => PHP_VERSION, "version" => $version->get(false), "build" => $version->getBuild(), "mc_version" => \pocketmine\MINECRAFT_VERSION, diff --git a/src/pocketmine/event/block/BlockEvent.php b/src/pocketmine/event/block/BlockEvent.php index e5bb1eb61..e40e05f33 100644 --- a/src/pocketmine/event/block/BlockEvent.php +++ b/src/pocketmine/event/block/BlockEvent.php @@ -24,12 +24,20 @@ */ namespace pocketmine\event\block; +use pocketmine\block\Block; use pocketmine\event\Event; abstract class BlockEvent extends Event{ /** @var \pocketmine\block\Block */ protected $block; + /** + * @param Block $block + */ + protected function __construct(Block $block){ + $this->block = $block; + } + public function getBlock(){ return $this->block; } diff --git a/src/pocketmine/event/block/SignChangeEvent.php b/src/pocketmine/event/block/SignChangeEvent.php new file mode 100644 index 000000000..a434965e6 --- /dev/null +++ b/src/pocketmine/event/block/SignChangeEvent.php @@ -0,0 +1,81 @@ +player = $thePlayer; + $this->lines = $theLines; + } + + /** + * @return Player + */ + public function getPlayer(){ + return $this->player; + } + + /** + * @return string[] + */ + public function getLines(){ + return $this->lines; + } + + /** + * @param int $index 0-3 + * + * @return string + */ + public function getLine($index){ + return $this->lines[$index]; + } + + /** + * @param int $index 0-3 + * @param string $line + */ + public function setLine($index, $line){ + $this->lines[$index] = $line; + } +} \ No newline at end of file diff --git a/src/pocketmine/event/server/RemoteServerCommandEvent.php b/src/pocketmine/event/server/RemoteServerCommandEvent.php new file mode 100644 index 000000000..412c992c8 --- /dev/null +++ b/src/pocketmine/event/server/RemoteServerCommandEvent.php @@ -0,0 +1,40 @@ +notify(); }, $this->workers[$n]); }else{ - $this->server->dispatchCommand($response = new RemoteConsoleCommandSender(), $this->workers[$n]->cmd); + + $response = new RemoteConsoleCommandSender(); + $command = $this->workers[$n]->cmd; + + $this->server->getPluginManager()->callEvent($ev = new RemoteServerCommandEvent($response, $command)); + + if(!$ev->isCancelled()){ + $this->server->dispatchCommand($ev->getSender(), $ev->getCommand()); + } + $this->workers[$n]->response = TextFormat::clean($response->getMessage()); $this->workers[$n]->synchronized(function(RCONInstance $thread){ $thread->notify();