Inheritance: extends BlockEvent, implements pocketmine\event\Cancellable
Beispiel #1
0
 public function onSignChange(SignChangeEvent $event)
 {
     if (strtolower(TextFormat::clean($event->getLine(0))) === "[advancedkits]" and !$event->getPlayer()->hasPermission("advancedkits.admin")) {
         $event->getPlayer()->sendMessage($this->ak->langManager->getTranslation("no-perm-sign"));
         $event->setCancelled();
     }
 }
 /**
  * @param SignChangeEvent $event
  * @priority HIGHEST
  * @ignoreCancelled true
  */
 public function onSignChange(SignChangeEvent $event)
 {
     if (!$this->plugin->getStorage()->getShield($event->getBlock()->getLevel())->isAllowed(Shield::EDITING)) {
         $event->setCancelled(true);
         $event->getPlayer()->sendTip($this->plugin->getConfig()->get("signChangeNotAllowed"));
     }
 }
 /**
  * @param SignChangeEvent $event
  */
 public function onSignChange(SignChangeEvent $event)
 {
     $player = $event->getPlayer();
     if (strtolower(trim($event->getLine(0))) == "status" || strtolower(trim($event->getLine(0))) == "[status]") {
         if ($player->hasPermission("signstatus") or $player->hasPermission("signstatus.create")) {
             $tps = $this->getServer()->getTicksPerSecond();
             $p = count($this->getServer()->getOnlinePlayers());
             $level = $event->getBlock()->getLevel()->getName();
             $full = $this->getServer()->getMaxPlayers();
             $load = $this->getServer()->getTickUsage();
             $format = $this->format->getAll();
             for ($x = 0; $x <= 3; $x++) {
                 $v = $format["format"][$x + 1];
                 $v = str_replace("{ONLINE}", $p, $v);
                 $v = str_replace("{MAX_ONLINE}", $full, $v);
                 $v = str_replace("{WORLD_NAME}", $level, $v);
                 $v = str_replace("{TPS}", $tps, $v);
                 $v = str_replace("{SERVER_LOAD}", $load, $v);
                 $event->setLine($x, $v);
             }
             //$event->setText(F::GREEN."[STATUS]",F::YELLOW."TPS: [$tps]",F::AQUA."ONLINE: ".F::GREEN.$p.F::WHITE."/".F::RED.$full.",".F::GOLD."******");
             $event->getPlayer()->sendMessage($this->prefix . $this->translation->get("sign_created"));
         } else {
             $player->sendMessage($this->prefix . $this->translation->get("sign_no_perms"));
             $event->setCancelled();
         }
     }
 }
Beispiel #4
0
 public function signchange(SignChangeEvent $event)
 {
     $event->setLine(0, "sJimin's");
     $event->setLine(1, "First");
     $event->setLine(2, "Plugin");
     $event->setLine(3, "work!");
 }
 public function onSignChangeEvent(SignChangeEvent $event, Player $sender)
 {
     $lines = $event->getLines();
     if ($lines[0] != null) {
         if (strtolower($lines[0]) === "[" + strtolower($this->plugin->getName()) + "]" && $sender->hasPermission("blockhunt.moderator.signcreate")) {
             SignsHandler::createSign($event, $lines, new Position($event->getBlock()->getX(), $event->getBlock()->getY(), $event->getBlock()->getZ(), $event->getBlock()->getLevel()));
         }
     }
 }
Beispiel #6
0
 public function onSign(SignChangeEvent $event)
 {
     $event->setLine(0, $this->replaceColor($event->getLine(0)));
     $event->setLine(1, $this->replaceColor($event->getLine(1)));
     $event->setLine(2, $this->replaceColor($event->getLine(2)));
     $event->setLine(3, $this->replaceColor($event->getLine(3)));
 }
Beispiel #7
0
 public function onSignChange(SignChangeEvent $event)
 {
     if (($data = $this->checkTag($event->getLine(0), $event->getLine(1))) !== false) {
         $player = $event->getPlayer();
         if (!$player->hasPermission("economyairport.create")) {
             $player->sendMessage($this->getMessage("no-permission-create"));
             return;
         }
         $block = $event->getBlock();
         switch ($event->getLine(1)) {
             case "departure":
                 if (!is_numeric($event->getLine(2))) {
                     $player->sendMessage($this->getMessage("cost-must-be-numeric"));
                     break;
                 }
                 if (trim($event->getLine(3)) === "") {
                     $player->sendMessage($this->getMessage("no-target-airport"));
                     break;
                 }
                 foreach ($this->airport as $d) {
                     if ($d["type"] === 1 and $d["name"] === $event->getLine(3)) {
                         $targetX = $d[0];
                         $targetY = $d[1];
                         $targetZ = $d[2];
                         $targetLevel = $d[3];
                         break;
                     }
                 }
                 if (!isset($targetX)) {
                     $player->sendMessage($this->getMessage("no-arrival"));
                     break;
                 }
                 $this->airport[$block->getX() . ":" . $block->getY() . ":" . $block->getZ() . ":" . $block->getLevel()->getFolderName()] = array("type" => 0, "cost" => $cost = round($event->getLine(2)), "target" => $event->getLine(3), "targetX" => $targetX, "targetY" => $targetY, "targetZ" => $targetZ, "targetLevel" => $targetLevel);
                 $mu = EconomyAPI::getInstance()->getMonetaryUnit();
                 $event->setLine(0, str_replace("%MONETARY_UNIT%", $mu, $data[0]));
                 $event->setLine(1, str_replace("%MONETARY_UNIT%", $mu, $data[1]));
                 $event->setLine(2, str_replace(["%1", "%MONETARY_UNIT%"], [$cost, $mu], $data[2]));
                 $event->setLine(3, str_replace(["%2", "%MONETARY_UNIT%"], [$event->getLine(3)], $data[3]));
                 $player->sendMessage($this->getMessage("departure-created", [$event->getLine(3), $cost]));
                 break;
             case "arrival":
                 if (trim($event->getLine(2)) === "") {
                     $player->sendMessage($this->getMessage("no-airport-name"));
                     break;
                 }
                 if (strpos($event->getLine(2), ":")) {
                     $player->sendMessage($this->getMessage("invalid-airport-name"));
                     break;
                 }
                 $this->airport[$block->getX() . ":" . $block->getY() . ":" . $block->getZ() . ":" . $block->getLevel()->getFolderName()] = array($block->getX(), $block->getY(), $block->getZ(), $block->getLevel()->getFolderName(), "name" => $event->getLine(2), "type" => 1);
                 $player->sendMessage($this->getMessage("arrival-created", [$event->getLine(2), "%2"]));
                 $event->setLine(0, $data[0]);
                 $event->setLine(1, $data[1]);
                 $event->setLine(2, str_replace("%1", $event->getLine(2), $data[2]));
                 $event->setLine(3, "");
                 break;
         }
     }
 }
 public function signChangeEvent(SignChangeEvent $event)
 {
     $line = str_replace(["[", "]", "/"], "", strtolower(trim($event->getLine(0))));
     if ($line == "signsell") {
         $this->signSell($event);
     }
     if ($line == "signbuy" || $line == "sign" || $line == "signshop") {
         $this->signBuy($event);
     }
     return;
 }
Beispiel #9
0
 public function onSignChange(SignChangeEvent $event)
 {
     if (!$event->getPlayer()->hasPermission("potiondispenser.create")) {
         return;
     }
     $text = $event->getLines();
     $prefix = strtoupper($text[0]);
     if ($prefix !== "[DISPENSER]" && $prefix !== "[POTION SHOP]") {
         return;
     }
     $effect = explode(':', $text[1] . $text[2]);
     if (count($effect) < 1) {
         return;
     }
     if ($effect[0] === "clear") {
         $this->registerDispenser(array("name" => "clear", "cost" => (int) $text[3]), $event->getBlock(), $event->getPlayer());
         $event->setLine(0, $this->getTranslation("DISPENSER"));
         $event->setLine(1, TextFormat::GOLD . $this->getTranslation("POTION_NAME_NO_LEV", $this->getTranslation("CLEAR")));
         $event->setLine(2, "");
         $event->setLine(3, $this->getTranslation("DISPENSER_COST", (int) $text[3] . EconomyAPI::getInstance()->getMonetaryUnit()));
         return;
     } elseif (count($effect) < 2) {
         return;
     }
     $effectInstance = Effect::getEffectByName($effect[0]);
     if ($effectInstance === null) {
         $effectInstance = Effect::getEffect($effect[0]);
         if ($effectInstance === null) {
             return;
         }
     }
     $effectId = $effectInstance->getId();
     $amplifier = (int) $effect[1];
     if ($effectInstance instanceof InstantEffect) {
         $duration = 1;
     } else {
         if (count($effect) < 3) {
             return;
         }
         $duration = (int) $effect[2] * 20;
     }
     $this->registerDispenser(array("name" => $effectId, "amplifier" => $amplifier, "duration" => $duration, "cost" => $text[3]), $event->getBlock(), $event->getPlayer());
     $event->setLine(0, $this->getTranslation("DISPENSER"));
     $color = $effectInstance->isBad() ? TextFormat::RED : TextFormat::AQUA;
     $event->setLine(1, $color . $this->getTranslation("POTION_NAME", $this->getServer()->getLanguage()->translate(new TextContainer($effectInstance->getName())), $amplifier + 1));
     if ($effectInstance instanceof InstantEffect) {
         $event->setLine(2, "");
     } else {
         $event->setLine(2, $this->getTranslation("DURATION", (int) $effect[2]));
     }
     $price = (int) $text[3] . EconomyAPI::getInstance()->getMonetaryUnit();
     $event->setLine(3, $this->getTranslation("DISPENSER_COST", $price));
 }
Beispiel #10
0
 public function onSignChange(SignChangeEvent $event)
 {
     $line = $event->getLines();
     if (($val = $this->getTag($line[0])) !== false) {
         $player = $event->getPlayer();
         if (!$player->hasPermission("economypshop.shop.create")) {
             $player->sendMessage($this->getMessage("no-permission-create-shop"));
             return;
         }
         $money = EconomyAPI::getInstance()->myMoney($player->getName());
         if ($money < $this->getConfig()->get("shop-tax")) {
             $player->sendMessage($this->getMessage("no-shop-tax"));
             return;
         }
         EconomyAPI::getInstance()->reduceMoney($player->getName(), $this->getConfig()->get("shop-tax"), "EconomyPShop");
         $cost = $line[1];
         $item = $line[2];
         $amount = $line[3];
         if (!is_numeric($cost) or !is_numeric($amount)) {
             $player->sendMessage($this->getMessage("insert-right-format"));
             return;
         }
         // Item identify
         $item = $this->getItem($line[2]);
         if ($item === false) {
             $player->sendMessage($this->getMessage("item-not-support", array($line[2], "", "")));
             return;
         }
         if ($item[1] === false) {
             // Item name found
             $id = explode(":", strtolower($line[2]));
             $line[2] = $item[0];
         } else {
             $tmp = $this->getItem(strtolower($line[2]));
             $id = explode(":", $tmp[0]);
         }
         $id[0] = (int) $id[0];
         if (!isset($id[1])) {
             $id[1] = 0;
         }
         // Item identify end
         $block = $event->getBlock();
         $this->shop[$block->getX() . ":" . $block->getY() . ":" . $block->getZ() . ":" . $block->getLevel()->getFolderName()] = ["x" => $block->getX(), "y" => $block->getY(), "z" => $block->getZ(), "level" => $block->getLevel()->getFolderName(), "owner" => $player->getName(), "price" => (int) $line[1], "item" => (int) $id[0], "itemName" => $line[2], "meta" => (int) $id[1], "amount" => (int) $line[3]];
         $mu = EconomyAPI::getInstance()->getMonetaryUnit();
         $event->setLine(0, str_replace("%MONETARY_UNIT%", $mu, $val[0]));
         $event->setLine(1, str_replace(["%MONETARY_UNIT%", "%1"], [$mu, $cost], $val[1]));
         $event->setLine(2, str_replace(["%MONETARY_UNIT%", "%2"], [$mu, $line[2]], $val[2]));
         $event->setLine(3, str_replace(["%MONETARY_UNIT%", "%3"], [$mu, $amount], $val[3]));
         $player->sendMessage($this->getMessage("shop-created", [$line[2], $cost, $amount]));
     }
 }
Beispiel #11
0
 public function onSignChange(SignChangeEvent $event)
 {
     $tag = $event->getLine(0);
     if (($val = $this->checkTag($tag)) !== false) {
         $player = $event->getPlayer();
         if (!$player->hasPermission("economysell.sell.create")) {
             $player->sendMessage($this->getMessage("no-permission-create"));
             return;
         }
         if (!is_numeric($event->getLine(1)) or !is_numeric($event->getLine(3))) {
             $player->sendMessage($this->getMessage("wrong-format"));
             return;
         }
         $item = Item::fromString($event->getLine(2));
         if ($item === false) {
             $player->sendMessage($this->getMessage("item-not-support", array($event->getLine(2), "", "")));
             return;
         }
         $block = $event->getBlock();
         $this->sell[$block->getX() . ":" . $block->getY() . ":" . $block->getZ() . ":" . $player->getLevel()->getName()] = array("x" => $block->getX(), "y" => $block->getY(), "z" => $block->getZ(), "level" => $player->getLevel()->getName(), "cost" => (int) $event->getLine(1), "item" => (int) $item->getID(), "itemName" => $item->getName(), "meta" => (int) $item->getDamage(), "amount" => (int) $event->getLine(3));
         $player->sendMessage($this->getMessage("sell-created", [$item->getName(), (int) $event->getLine(3), ""]));
         $mu = EconomyAPI::getInstance()->getMonetaryUnit();
         $event->setLine(0, $val[0]);
         $event->setLine(1, str_replace(["%MONETARY_UNIT%", "%1"], [$mu, $event->getLine(1)], $val[1]));
         $event->setLine(2, str_replace(["%MONETARY_UNIT%", "%2"], [$mu, $item->getName()], $val[2]));
         $event->setLine(3, str_replace(["%MONETARY_UNIT%", "%3"], [$mu, $event->getLine(3)], $val[3]));
     }
 }
 public function signCatch(SignChangeEvent $event)
 {
     if ($event->getLine(0) == null and $event->getLine(1) == null and $event->getLine(2) == null and $event->getLine(3) == null) {
         return;
     }
     $block = $event->getBlock();
     if ($block->getID() != 0) {
         $this->list[$block->x . "." . $block->y . "." . $block->z]['id'] = $block->getID();
         $this->list[$block->x . "." . $block->y . "." . $block->z]['damage'] = $block->getDamage();
         $this->list[$block->x . "." . $block->y . "." . $block->z]['t0'] = $event->getLine(0);
         $this->list[$block->x . "." . $block->y . "." . $block->z]['t1'] = $event->getLine(1);
         $this->list[$block->x . "." . $block->y . "." . $block->z]['t2'] = $event->getLine(2);
         $this->list[$block->x . "." . $block->y . "." . $block->z]['t3'] = $event->getLine(3);
         $this->initialize_schedule_delay($this, "signReplaceCatch", 40, [$block->x, $block->y, $block->z]);
     }
 }
Beispiel #13
0
 public function placeSign(SignChangeEvent $ev)
 {
     //echo __METHOD__.",".__LINE__."\n";//##DEBUG
     if ($ev->getBlock()->getId() != Block::SIGN_POST && $ev->getBlock()->getId() != Block::WALL_SIGN) {
         return;
     }
     $tile = $ev->getPlayer()->getLevel()->getTile($ev->getBlock());
     if (!$tile instanceof Sign) {
         return;
     }
     //echo __METHOD__.",".__LINE__."\n";//##DEBUG
     $sign = $ev->getLines();
     if (!isset($this->signtxt[$sign[0]])) {
         return;
     }
     //echo __METHOD__.",".__LINE__."\n";//##DEBUG
     $pl = $ev->getPlayer();
     if (!MPMU::access($pl, "killrate.signs.place")) {
         //echo __METHOD__.",".__LINE__."\n";//##DEBUG
         SignUtils::breakSignLater($this->owner, $tile);
         return;
     }
     //echo __METHOD__.",".__LINE__."\n";//##DEBUG
     $pl->sendMessage(mc::_("Placed [KillRate] sign"));
     //echo __METHOD__.",".__LINE__."\n";//##DEBUG
     $this->owner->getServer()->getScheduler()->scheduleDelayedTask(new PluginCallbackTask($this->owner, [$this, "updateTimer"], []), 10);
 }
 public function onSignChange(SignChangeEvent $event)
 {
     $player = $event->getPlayer();
     if ($event->isCancelled()) {
         return;
     }
     if ($event->getLine(0) == "색상체크" or $event->getLine(0) == "colorcheck") {
         $event->setLine(0, "[색상체크]");
         $event->setLine(1, "표지판을 터치시");
         $event->setLine(2, "본인의 위험지수와");
         $event->setLine(3, "색상체크가 뜹니다");
         $player->sendMessage(TextFormat::DARK_AQUA . "[PSYCHOPASS-API] 색상체크 표지판을 생성했습니다");
     }
 }
Beispiel #15
0
 public function onSignChange(SignChangeEvent $event)
 {
     $lines = $event->getLines();
     if (strtoupper($lines[0]) !== "WARP") {
         return;
     }
     if (!$event->getPlayer()->hasPermission("warp.mk")) {
         return;
     }
     if (!isset(XcelNgien::$worlds[$lines[1]])) {
         $event->getPlayer()->sendMessage(TextFormat::RED . "Wrong world!");
         return;
     }
     $loc = $this->encodeLoc($event->getBlock());
     self::$warpData[$loc] = ["world" => $lines[1]];
     $this->saveWarpData();
     $this->updateSigns($loc);
 }
Beispiel #16
0
 public function SignChange(SignChangeEvent $event)
 {
     if (!$event->getPlayer()->isOp()) {
         return;
     }
     if (strtolower($event->getLine(0)) != $this->get("QuestNPC-line0")) {
         return;
     }
     if ($event->getLine(1) != null) {
         $message = $event->getLine(1);
     }
     if ($event->getLine(2) == null) {
         $this->alert($event->getPlayer(), $this->get("PleaseChooseType"));
         $this->alert($event->getPlayer(), $this->get("TypeList"));
         return;
     } else {
         switch ($event->getLine(2)) {
             case $this->get("Type-Heal"):
                 // TODO 힐링형 - 긍정의사보이면 힐링
                 break;
             case $this->get("Type-Coll"):
                 // TODO 수집형 - 긍정의사보이면 뭔가 모아오게함
                 break;
             case $this->get("Type-Find"):
                 // TODO 탐색형 - 긍정의사보이면 다른 NPC를 찾아오게함
                 break;
             case $this->get("Type-Question"):
                 // TODO 문제형 - 긍정의사보이면 문제를 냄
                 break;
             case $this->get("Type-Abil"):
                 // TODO 능력형 - 긍정의사보이면 아이템을 받고 능력을 줌
                 break;
             default:
                 $this->alert($event->getPlayer(), $this->get("PleaseChooseType"));
                 $this->alert($event->getPlayer(), $this->get("TypeList"));
                 return;
         }
     }
     $block = $event->getBlock()->getSide(0);
     $blockPos = "{$block->x}.{$block->y}.{$block->z}";
     $this->db["QuestNPC"][$block->level->getFolderName()][$blockPos]["nametag"] = $message;
     $block->level->setBlock($block->getSide(1), Block::get(Block::AIR));
     $this->message($event->getPlayer(), $this->get("QuestNPC-added"));
 }
Beispiel #17
0
 public function onSignChange(SignChangeEvent $event)
 {
     if ($event->getLine(0) === $this->getPlugin()->getConfig()->get('sign-trigger')) {
         if ($event->getPlayer()->hasPermission("battlekits.sign.create")) {
             if (!empty($event->getLine(1))) {
                 $event->getPlayer()->sendMessage("You have successfully created kit sign.");
             } else {
                 $event->getPlayer()->sendMessage("You must set a kit.");
                 $event->setCancelled();
             }
         } else {
             $event->getPlayer()->sendMessage("You don't have permission to make kit signs.");
             $event->setCancelled();
         }
     }
 }
 public function signChange(SignChangeEvent $event)
 {
     $message = "";
     foreach ($event->getLines() as $index => $line) {
         if ($line != null) {
             $message .= " (" . $index . " : " . $line . ") ";
         }
     }
     if ($message == null) {
         return;
     }
     $message = $this->get("sign-set") . " : " . $event->getPlayer()->getName() . "  : " . $message;
     $message = $message . " (X:" . $event->getBlock()->x . " Y:" . $event->getBlock()->y . " Z: " . $event->getBlock()->z . ")";
     $this->getServer()->getLogger()->info($message);
     foreach ($this->getServer()->getOnlinePlayers() as $player) {
         if ($player->isOp()) {
             $this->message($player, $message);
         }
     }
 }
Beispiel #19
0
 public function onSignChange(SignChangeEvent $event)
 {
     $line = $event->getLines();
     if (($val = $this->getTag($line[0])) !== false) {
         $player = $event->getPlayer();
         if (!$player->hasPermission("economypshop.shop.create")) {
             $player->sendMessage($this->getMessage("no-permission-create-shop"));
             return;
         }
         $money = \onebone\economyapi\EconomyAPI::getInstance()->myMoney($player->getName());
         if ($money < $this->getConfig()->get("shop-tax")) {
             $player->sendMessage($this->getMessage("no-shop-tax"));
             return;
         }
         \onebone\economyapi\EconomyAPI::getInstance()->reduceMoney($player->getName(), $this->getConfig()->get("shop-tax"), "EconomyPShop");
         $cost = $line[1];
         $item = $line[2];
         $amount = $line[3];
         if (!is_numeric($cost) or !is_numeric($amount)) {
             $player->sendMessage($this->getMessage("insert-right-format"));
             return;
         }
         if ($cost < 0 or $amount < 1 or (int) $amount != $amount) {
             $player->sendMessage($this->getMessage("wrong-num"));
             return;
         }
         $item = Item::fromString($line[2]);
         if (!$item instanceof Item) {
             $player->sendMessage($this->getMessage("item-not-support", array($line[2], "", "")));
             return;
         }
         $block = $event->getBlock();
         $this->shop[$block->getX() . ":" . $block->getY() . ":" . $block->getZ() . ":" . $block->getLevel()->getFolderName()] = ["x" => $block->getX(), "y" => $block->getY(), "z" => $block->getZ(), "level" => $block->getLevel()->getFolderName(), "owner" => $player->getName(), "price" => (int) $line[1], "item" => (int) $item->getID(), "itemName" => $line[2], "meta" => (int) $item->getDamage(), "amount" => (int) $line[3]];
         $mu = \onebone\economyapi\EconomyAPI::getInstance()->getMonetaryUnit();
         $event->setLine(0, str_replace("%MONETARY_UNIT%", $mu, $val[0]));
         $event->setLine(1, str_replace(["%MONETARY_UNIT%", "%1"], [$mu, $cost], $val[1]));
         $event->setLine(2, str_replace(["%MONETARY_UNIT%", "%2"], [$mu, $item->getName()], $val[2]));
         $event->setLine(3, str_replace(["%MONETARY_UNIT%", "%3"], [$mu, $amount], $val[3]));
         $player->sendMessage($this->getMessage("shop-created", [$item->getName(), $cost, $amount]));
     }
 }
Beispiel #20
0
 public function onSignChange(SignChangeEvent $event)
 {
     $player = $event->getPlayer();
     if ($event->getLine(0) == "givemoney") {
         if (!$player->isOp()) {
             $player->sendMessage(TextFormat::RED . "OP만 사용가능합니다");
             return;
         }
         if (!is_numeric($event->getLine(1))) {
             $player->sendMessage(TextFormat::RED . "두번째는 반드시 숫자로해야합....설치Fail");
             return;
         }
         $event->setLine(0, "[터치시 돈 획득]");
         $event->setLine(1, "보상: " . "\$" . $event->getLine(1));
         $event->setLine(2, "주의 ! 하루에");
         $event->setLine(3, "한번씩만 가능합니다 !");
         $player->sendMessage(TextFormat::DARK_AQUA . "세팅완료 ! ㅇㅁㅇ! ");
     }
 }
Beispiel #21
0
 public function signPlace(SignChangeEvent $event)
 {
     if ($event->getPlayer()->isOp()) {
         return;
     }
     $message = "";
     foreach ($event->getLines() as $line) {
         $message .= $line . "\n";
     }
     if (!isset($this->signCheck[$event->getPlayer()->getName() . ">" . $message])) {
         $this->signCheck[$event->getPlayer()->getName() . ">" . $message] = false;
         $blockPos = "{$event->getBlock()->x}:{$event->getBlock()->y}:{$event->getBlock()->z}";
         $this->getServer()->getScheduler()->scheduleAsyncTask(new GentlemanAsyncTask($event->getPlayer()->getName(), [$event->getBlock()->getId(), $event->getBlock()->getDamage(), $blockPos], $message, $this->badQueue, $this->dictionary, "sign", true));
         $event->setCancelled();
         return;
     } else {
         if (!$this->signCheck[$event->getPlayer()->getName() . ">" . $message]) {
             $event->setCancelled();
             return;
         } else {
             unset($this->signCheck[$event->getPlayer()->getName() . ">" . $message]);
         }
     }
 }
Beispiel #22
0
 /** Stuff for next update once SignChangeEvent is implemented */
 public function tileupdate(SignChangeEvent $event)
 {
     if ($event->getBlock()->getID() == 323 || $event->getBlock()->getID() == 63 || $event->getBlock()->getID() == 68) {
         //Server::getInstance()->broadcastMessage("lv1");
         $sign = $event->getPlayer()->getLevel()->getTile($event->getBlock());
         if (!$sign instanceof Sign) {
             return true;
         }
         $sign = $event->getLines();
         if ($sign[0] == '[WORLD]') {
             //Server::getInstance()->broadcastMessage("lv2");
             if ($event->getPlayer()->isOp()) {
                 //Server::getInstance()->broadcastMessage("lv3");
                 if (empty($sign[1]) !== true) {
                     //Server::getInstance()->broadcastMessage("lv4");
                     if (Server::getInstance()->loadLevel($sign[1]) !== false) {
                         //Server::getInstance()->broadcastMessage("lv5");
                         $event->getPlayer()->sendMessage("[SignPortal] Portal to world '" . $sign[1] . "' created");
                         return true;
                     }
                     $event->getPlayer()->sendMessage("[SignPortal] World '" . $sign[1] . "' does not exist!");
                     //Server::getInstance()->broadcastMessage("f4");
                     $event->setLine(0, "[BROKEN]");
                     return false;
                 }
                 $event->getPlayer()->sendMessage("[SignPortal] World name not set");
                 //Server::getInstance()->broadcastMessage("f3");
                 $event->setLine(0, "[BROKEN]");
                 return false;
             }
             $event->getPlayer()->sendMessage("[SignPortal] You must be an OP to make a portal");
             //Server::getInstance()->broadcastMessage("f2");
             $event->setLine(0, "[BROKEN]");
             return false;
         }
     }
     return true;
 }
Beispiel #23
0
 public function signChange(SignChangeEvent $event)
 {
     if ($event->getLine(0) === "[BedWars]") {
         $line1 = $event->getLine(1);
         if (!isset($line1)) {
             $event->getPlayer()->sendMessage(TextFormat::RED . "Please specify a valid arena name!");
         } else {
             foreach ($this->getConfig()->get("Arenas") as $arena => $g) {
                 if ($event->getLine(1) === $g["name"]) {
                     $sign = $event->getBlock();
                     if ($sign instanceof Sign) {
                         $pingame = count($this->getServer()->getLevelByName($g["name"])->getPlayers());
                         $sign->setText("[BedWars]", $g["world"], "{$pingame} / 8", $g["status"]);
                     }
                 }
             }
         }
     }
 }
 /**
  * @param SignChangeEvent $event
  */
 public function onSignChange(SignChangeEvent $event)
 {
     $player = $event->getPlayer();
     if (strtolower(trim($event->getLine(0))) == "status" || strtolower(trim($event->getLine(0))) == "[狀態]") {
         if ($player->hasPermission("signstatus")) {
             $tps = $this->getServer()->getTicksPerSecond();
             $p = count($this->getServer()->getOnlinePlayers());
             $level = $event->getBlock()->getLevel()->getName();
             $full = $this->getServer()->getMaxPlayers();
             $event->setLine(0, F::GREEN . "[狀態]");
             $event->setLine(1, F::YELLOW . "TPS: [" . $tps . "]");
             $event->setLine(2, F::AQUA . "在線: " . F::GREEN . $p . F::WHITE . "/" . F::RED . $full . "");
             $event->setLine(3, F::GOLD . "******");
             $this->sign->setNested("sign.x", $event->getBlock()->getX());
             $this->sign->setNested("sign.y", $event->getBlock()->getY());
             $this->sign->setNested("sign.z", $event->getBlock()->getZ());
             $this->sign->setNested("sign.enabled", true);
             $this->sign->setNested("sign.level", $level);
             $this->sign->save();
             $this->sign->reload();
             $event->getPlayer()->sendMessage($this->prefix . $this->translation->get("sign_created"));
         } else {
             $player->sendMessage($this->prefix . $this->translation->get("sign_no_perms"));
             $event->setCancelled();
         }
     }
 }
Beispiel #25
0
 public function signCreate(SignChangeEvent $event)
 {
     $line = $event->getLines();
     $error = [];
     if (str_replace([" ", "[", "]", "/"], "", strtolower(trim($line[0]))) !== "tntrun") {
         return;
     }
     if (!$event->getPlayer()->hasPermission("tntrun.create")) {
         $event->setCancelled();
         return;
     }
     if (!is_numeric($line[2])) {
         $error[] = "<Number_of_players> is not numeric";
     } else {
         if ($line[2] <= 0) {
             $error[] = "<Number_of_players> must be greater than 0";
         }
     }
     if (!is_numeric($line[3])) {
         $error[] = "<Time> is not numeric";
     } else {
         if ($line[3] <= 0) {
             $error[] = "<Time> must be greater than 0";
         }
     }
     if (count($error)) {
         $this->tntRun->getSign()->newSign($event->getBlock(), ["arena" => trim($line[1]), "direction" => $event->getBlock()->getDamage(), "n_players" => $line[2], "time" => $line[3]]);
         $event->getPlayer()->sendMessage("[TNTRun] " . TextFormat::DARK_GREEN . "The Sign was created successfully!");
     } else {
         foreach ($error as $e) {
             $event->getPlayer()->sendMessage("[TNTRun] " . TextFormat::DARK_RED . $e);
         }
         $event->setCancelled();
     }
 }
Beispiel #26
0
 public function SignChangedEvent(SignChangeEvent $event)
 {
     if ($event->getLine(0) === "엘레베이터" && $event->getLine(1) === "상승") {
         $event->setLine(0, TextFormat::GOLD . "==========");
         $event->setLine(1, TextFormat::RED . "[엘" . TextFormat::GOLD . "레" . TextFormat::YELLOW . "베" . TextFormat::GREEN . "이" . TextFormat::BLUE . "터]");
         $event->setLine(2, TextFormat::RED . "↑↑상승↑↑");
         $event->setLine(3, TextFormat::GOLD . "==========");
     }
     if ($event->getLine(0) == "엘레베이터" && $event->getLine(1) == "하강") {
         $event->setLine(0, TextFormat::GOLD . "==========");
         $event->setLine(1, TextFormat::RED . "[엘" . TextFormat::GOLD . "레" . TextFormat::YELLOW . "베" . TextFormat::GREEN . "이" . TextFormat::BLUE . "터]");
         $event->setLine(2, TextFormat::RED . "↓↓하강↓↓");
         $event->setLine(3, TextFormat::GOLD . "==========");
     }
 }
 public function tileupdate(SignChangeEvent $event)
 {
     if ($event->getBlock()->getID() == Item::SIGN_POST || $event->getBlock()->getID() == Block::SIGN_POST || $event->getBlock()->getID() == Block::WALL_SIGN) {
         $signTile = $event->getPlayer()->getLevel()->getTile($event->getBlock());
         if (!$signTile instanceof Sign) {
             return true;
         }
         $signLines = $event->getLines();
         if ($signLines[0] == OneVsOne::SIGN_TITLE) {
             if ($event->getPlayer()->isOp()) {
                 $this->arenaManager->addSign($signTile);
                 $event->setLine(1, "-Waiting: " . $this->arenaManager->getNumberOfPlayersInQueue());
                 $event->setLine(2, "-Arenas:" . $this->arenaManager->getNumberOfFreeArenas());
                 $event->setLine(3, "-+===+-");
                 return true;
             }
         }
     }
 }
Beispiel #28
0
 public function placeSign(SignChangeEvent $ev)
 {
     //echo __METHOD__.",".__LINE__."\n";//##DEBUG
     if ($ev->getBlock()->getId() != Block::SIGN_POST && $ev->getBlock()->getId() != Block::WALL_SIGN) {
         return;
     }
     $tile = $ev->getPlayer()->getLevel()->getTile($ev->getBlock());
     if (!$tile instanceof Sign) {
         return;
     }
     //echo __METHOD__.",".__LINE__."\n";//##DEBUG
     $sign = $ev->getLines();
     if (!isset($this->cfg["signs"][$sign[0]])) {
         return;
     }
     //echo __METHOD__.",".__LINE__."\n";//##DEBUG
     $pl = $ev->getPlayer();
     if (!MPMU::access($pl, "killrate.signs.place")) {
         //echo __METHOD__.",".__LINE__."\n";//##DEBUG
         $l = $pl->getLevel();
         $l->setBlockIdAt($tile->getX(), $tile->getY(), $tile->getZ(), Block::AIR);
         $l->setBlockDataAt($tile->getX(), $tile->getY(), $tile->getZ(), 0);
         $tile->close();
         return;
     }
     //echo __METHOD__.",".__LINE__."\n";//##DEBUG
     $pl->sendMessage(mc::_("Placed [KillRate] sign"));
     $this->stats = [];
     //echo __METHOD__.",".__LINE__."\n";//##DEBUG
     $this->getServer()->getScheduler()->scheduleDelayedTask(new PluginCallbackTask($this, [$this, "updateTimer"], []), 10);
 }
Beispiel #29
0
 public function onSignChange(SignChangeEvent $event)
 {
     $getLine0 = $event->getLine(0);
     $getLine1 = $event->getLine(1);
     $player = $event->getPlayer();
     $effectType = array("1", "2", "3", "4", "5", "8", "9", "10", "11", "12", "13", "14", "18", "19", "20", "21");
     foreach ($effectType as $effectArray) {
         if ($getLine0 == "effect" && $getLine1 == $effectArray) {
             $event->setLine(0, "-----------");
             $event->setLine(1, TextFormat::RED . "[E" . TextFormat::GOLD . "f" . TextFormat::YELLOW . "f" . TextFormat::GREEN . "e" . TextFormat::BLUE . "c" . TextFormat::DARK_PURPLE . "t]");
             $event->setLine(2, TextFormat::AQUA . EffectName::getEffect($effectArray)->getName());
             $event->setLine(3, "-----------");
         }
         if ($getLine0 == "effect" && $getLine1 == "remove") {
             $event->setLine(0, "-----------");
             $event->setLine(1, TextFormat::RED . "[E" . TextFormat::GOLD . "f" . TextFormat::YELLOW . "f" . TextFormat::GREEN . "e" . TextFormat::BLUE . "c" . TextFormat::DARK_PURPLE . "t]");
             $event->setLine(2, TextFormat::AQUA . "효과제거");
             $event->setLine(3, "-----------");
         }
     }
 }
Beispiel #30
-2
 /**
  * Handles a Minecraft packet
  * TODO: Separate all of this in handlers
  *
  * WARNING: Do not use this, it's only for internal use.
  * Changes to this function won't be recorded on the version.
  *
  * @param DataPacket $packet
  */
 public function handleDataPacket(DataPacket $packet)
 {
     if ($this->connected === false) {
         return;
     }
     if ($packet::NETWORK_ID === ProtocolInfo::BATCH_PACKET) {
         /** @var BatchPacket $packet */
         $this->server->getNetwork()->processBatch($packet, $this);
         return;
     }
     $timings = Timings::getReceiveDataPacketTimings($packet);
     $timings->startTiming();
     $this->server->getPluginManager()->callEvent($ev = new DataPacketReceiveEvent($this, $packet));
     if ($ev->isCancelled()) {
         $timings->stopTiming();
         return;
     }
     switch ($packet::NETWORK_ID) {
         case ProtocolInfo::LOGIN_PACKET:
             if ($this->loggedIn) {
                 break;
             }
             $this->username = TextFormat::clean($packet->username);
             $this->displayName = $this->username;
             $this->setNameTag($this->username);
             $this->iusername = strtolower($this->username);
             if (count($this->server->getOnlinePlayers()) >= $this->server->getMaxPlayers() and $this->kick("disconnectionScreen.serverFull", false)) {
                 break;
             }
             if ($packet->protocol1 !== ProtocolInfo::CURRENT_PROTOCOL) {
                 if ($packet->protocol1 < ProtocolInfo::CURRENT_PROTOCOL) {
                     $message = "disconnectionScreen.outdatedClient";
                     $pk = new PlayStatusPacket();
                     $pk->status = PlayStatusPacket::LOGIN_FAILED_CLIENT;
                     $this->directDataPacket($pk);
                 } else {
                     $message = "disconnectionScreen.outdatedServer";
                     $pk = new PlayStatusPacket();
                     $pk->status = PlayStatusPacket::LOGIN_FAILED_SERVER;
                     $this->directDataPacket($pk);
                 }
                 $this->close("", $message, false);
                 break;
             }
             $this->randomClientId = $packet->clientId;
             $this->loginData = ["clientId" => $packet->clientId, "loginData" => null];
             $this->uuid = $packet->clientUUID;
             $this->rawUUID = $this->uuid->toBinary();
             $this->clientSecret = $packet->clientSecret;
             $valid = true;
             $len = strlen($packet->username);
             if ($len > 16 or $len < 3) {
                 $valid = false;
             }
             for ($i = 0; $i < $len and $valid; ++$i) {
                 $c = ord($packet->username[$i]);
                 if ($c >= ord("a") and $c <= ord("z") or $c >= ord("A") and $c <= ord("Z") or $c >= ord("0") and $c <= ord("9") or $c === ord("_")) {
                     continue;
                 }
                 $valid = false;
                 break;
             }
             if (!$valid or $this->iusername === "rcon" or $this->iusername === "console") {
                 $this->close("", "disconnectionScreen.invalidName");
                 break;
             }
             if (strlen($packet->skin) !== 64 * 32 * 4 and strlen($packet->skin) !== 64 * 64 * 4) {
                 $this->close("", "disconnectionScreen.invalidSkin");
                 break;
             }
             $this->setSkin($packet->skin, $packet->skinname, $packet->oldclient, $packet->slim, $packet->transparent);
             $this->server->getPluginManager()->callEvent($ev = new PlayerPreLoginEvent($this, "Plugin reason"));
             if ($ev->isCancelled()) {
                 $this->close("", $ev->getKickMessage());
                 break;
             }
             $this->onPlayerPreLogin();
             break;
         case ProtocolInfo::MOVE_PLAYER_PACKET:
             $newPos = new Vector3($packet->x, $packet->y - $this->getEyeHeight(), $packet->z);
             $revert = false;
             if (!$this->isAlive() or $this->spawned !== true) {
                 $revert = true;
                 $this->forceMovement = new Vector3($this->x, $this->y, $this->z);
             }
             if ($this->teleportPosition !== null or $this->forceMovement instanceof Vector3 and (($dist = $newPos->distanceSquared($this->forceMovement)) > 0.1 or $revert)) {
                 $this->sendPosition($this->forceMovement, $packet->yaw, $packet->pitch);
             } else {
                 $packet->yaw %= 360;
                 $packet->pitch %= 360;
                 if ($packet->yaw < 0) {
                     $packet->yaw += 360;
                 }
                 $this->setRotation($packet->yaw, $packet->pitch);
                 $this->newPosition = $newPos;
                 $this->forceMovement = null;
             }
             break;
         case ProtocolInfo::MOB_EQUIPMENT_PACKET:
             if ($this->spawned === false or !$this->isAlive()) {
                 break;
             }
             if ($packet->slot === 0x28 or $packet->slot === 0 or $packet->slot === 255) {
                 //0 for 0.8.0 compatibility
                 $packet->slot = -1;
                 //Air
             } else {
                 $packet->slot -= 9;
                 //Get real block slot
             }
             /** @var Item $item */
             $item = null;
             if ($this->isCreative()) {
                 //Creative mode match
                 $item = $packet->item;
                 $slot = Item::getCreativeItemIndex($item);
             } else {
                 $item = $this->inventory->getItem($packet->slot);
                 $slot = $packet->slot;
             }
             if ($packet->slot === -1) {
                 //Air
                 if ($this->isCreative()) {
                     $found = false;
                     for ($i = 0; $i < $this->inventory->getHotbarSize(); ++$i) {
                         if ($this->inventory->getHotbarSlotIndex($i) === -1) {
                             $this->inventory->setHeldItemIndex($i);
                             $found = true;
                             break;
                         }
                     }
                     if (!$found) {
                         //couldn't find a empty slot (error)
                         $this->inventory->sendContents($this);
                         break;
                     }
                 } else {
                     if ($packet->selectedSlot >= 0 and $packet->selectedSlot < 9) {
                         $this->inventory->setHeldItemIndex($packet->selectedSlot);
                         $this->inventory->setHeldItemSlot($packet->slot);
                     } else {
                         $this->inventory->sendContents($this);
                         break;
                     }
                 }
             } elseif ($item === null or $slot === -1 or !$item->deepEquals($packet->item)) {
                 // packet error or not implemented
                 $this->inventory->sendContents($this);
                 break;
             } elseif ($this->isCreative()) {
                 $this->inventory->setHeldItemIndex($packet->selectedSlot);
                 $this->inventory->setItem($packet->selectedSlot, $item);
                 $this->inventory->setHeldItemSlot($packet->selectedSlot);
             } else {
                 if ($packet->selectedSlot >= 0 and $packet->selectedSlot < $this->inventory->getHotbarSize()) {
                     $this->inventory->setHeldItemIndex($packet->selectedSlot);
                     $this->inventory->setHeldItemSlot($slot);
                 } else {
                     $this->inventory->sendContents($this);
                     break;
                 }
             }
             $this->inventory->sendHeldItem($this->hasSpawned);
             $this->setDataFlag(self::DATA_FLAGS, self::DATA_FLAG_ACTION, false);
             break;
         case ProtocolInfo::USE_ITEM_PACKET:
             if ($this->spawned === false or !$this->isAlive() or $this->blocked) {
                 break;
             }
             $blockVector = new Vector3($packet->x, $packet->y, $packet->z);
             $this->craftingType = 0;
             if ($packet->face >= 0 and $packet->face <= 5) {
                 //Use Block, place
                 $this->setDataFlag(self::DATA_FLAGS, self::DATA_FLAG_ACTION, false);
                 if (!$this->canInteract($blockVector->add(0.5, 0.5, 0.5), 13) or $this->isSpectator()) {
                 } elseif ($this->isCreative()) {
                     $item = $this->inventory->getItemInHand();
                     if ($this->level->useItemOn($blockVector, $item, $packet->face, $packet->fx, $packet->fy, $packet->fz, $this) === true) {
                         break;
                     }
                 } elseif (!$this->inventory->getItemInHand()->deepEquals($packet->item)) {
                     $this->inventory->sendHeldItem($this);
                 } else {
                     $item = $this->inventory->getItemInHand();
                     $oldItem = clone $item;
                     //TODO: Implement adventure mode checks
                     if ($this->level->useItemOn($blockVector, $item, $packet->face, $packet->fx, $packet->fy, $packet->fz, $this)) {
                         if (!$item->deepEquals($oldItem) or $item->getCount() !== $oldItem->getCount()) {
                             $this->inventory->setItemInHand($item);
                             $this->inventory->sendHeldItem($this->hasSpawned);
                         }
                         break;
                     }
                 }
                 $this->inventory->sendHeldItem($this);
                 if ($blockVector->distanceSquared($this) > 10000) {
                     break;
                 }
                 $target = $this->level->getBlock($blockVector);
                 $block = $target->getSide($packet->face);
                 $this->level->sendBlocks([$this], [$target, $block], UpdateBlockPacket::FLAG_ALL_PRIORITY);
                 break;
             } elseif ($packet->face === 0xff) {
                 $aimPos = (new Vector3($packet->x / 32768, $packet->y / 32768, $packet->z / 32768))->normalize();
                 if ($this->isCreative()) {
                     $item = $this->inventory->getItemInHand();
                 } elseif (!$this->inventory->getItemInHand()->deepEquals($packet->item)) {
                     $this->inventory->sendHeldItem($this);
                     break;
                 } else {
                     $item = $this->inventory->getItemInHand();
                 }
                 $ev = new PlayerInteractEvent($this, $item, $aimPos, $packet->face, PlayerInteractEvent::RIGHT_CLICK_AIR);
                 $this->server->getPluginManager()->callEvent($ev);
                 if ($ev->isCancelled()) {
                     $this->inventory->sendHeldItem($this);
                     break;
                 }
                 if ($item->getId() === Item::SNOWBALL) {
                     $nbt = new Compound("", ["Pos" => new Enum("Pos", [new Double("", $this->x), new Double("", $this->y + $this->getEyeHeight()), new Double("", $this->z)]), "Motion" => new Enum("Motion", [new Double("", $aimPos->x), new Double("", $aimPos->y), new Double("", $aimPos->z)]), "Rotation" => new Enum("Rotation", [new Float("", $this->yaw), new Float("", $this->pitch)])]);
                     $f = 1.5;
                     $snowball = Entity::createEntity("Snowball", $this->chunk, $nbt, $this);
                     $snowball->setMotion($snowball->getMotion()->multiply($f));
                     if ($this->isSurvival()) {
                         $item->setCount($item->getCount() - 1);
                         $this->inventory->setItemInHand($item->getCount() > 0 ? $item : Item::get(Item::AIR));
                     }
                     if ($snowball instanceof Projectile) {
                         $this->server->getPluginManager()->callEvent($projectileEv = new ProjectileLaunchEvent($snowball));
                         if ($projectileEv->isCancelled()) {
                             $snowball->kill();
                         } else {
                             $snowball->spawnToAll();
                             $this->level->addSound(new LaunchSound($this), $this->getViewers());
                         }
                     } else {
                         $snowball->spawnToAll();
                     }
                 }
                 $this->setDataFlag(self::DATA_FLAGS, self::DATA_FLAG_ACTION, true);
                 $this->startAction = $this->server->getTick();
             }
             break;
         case ProtocolInfo::PLAYER_ACTION_PACKET:
             if ($this->spawned === false or $this->blocked === true or !$this->isAlive() and $packet->action !== PlayerActionPacket::ACTION_RESPAWN and $packet->action !== PlayerActionPacket::ACTION_DIMENSION_CHANGE) {
                 break;
             }
             $packet->eid = $this->id;
             $pos = new Vector3($packet->x, $packet->y, $packet->z);
             switch ($packet->action) {
                 case PlayerActionPacket::ACTION_START_BREAK:
                     if ($this->lastBreak !== PHP_INT_MAX or $pos->distanceSquared($this) > 10000) {
                         break;
                     }
                     $target = $this->level->getBlock($pos);
                     $ev = new PlayerInteractEvent($this, $this->inventory->getItemInHand(), $target, $packet->face, $target->getId() === 0 ? PlayerInteractEvent::LEFT_CLICK_AIR : PlayerInteractEvent::LEFT_CLICK_BLOCK);
                     $this->getServer()->getPluginManager()->callEvent($ev);
                     if ($ev->isCancelled()) {
                         $this->inventory->sendHeldItem($this);
                         break;
                     }
                     $this->lastBreak = microtime(true);
                     break;
                 case PlayerActionPacket::ACTION_ABORT_BREAK:
                     $this->lastBreak = PHP_INT_MAX;
                     break;
                 case PlayerActionPacket::ACTION_RELEASE_ITEM:
                     if ($this->startAction > -1 and $this->getDataFlag(self::DATA_FLAGS, self::DATA_FLAG_ACTION)) {
                         if ($this->inventory->getItemInHand()->getId() === Item::BOW) {
                             $bow = $this->inventory->getItemInHand();
                             if ($this->isSurvival() and !$this->inventory->contains(Item::get(Item::ARROW, 0, 1))) {
                                 $this->inventory->sendContents($this);
                                 break;
                             }
                             $nbt = new Compound("", ["Pos" => new Enum("Pos", [new Double("", $this->x), new Double("", $this->y + $this->getEyeHeight()), new Double("", $this->z)]), "Motion" => new Enum("Motion", [new Double("", -sin($this->yaw / 180 * M_PI) * cos($this->pitch / 180 * M_PI)), new Double("", -sin($this->pitch / 180 * M_PI)), new Double("", cos($this->yaw / 180 * M_PI) * cos($this->pitch / 180 * M_PI))]), "Rotation" => new Enum("Rotation", [new Float("", $this->yaw), new Float("", $this->pitch)]), "Fire" => new Short("Fire", $this->isOnFire() ? 45 * 60 : 0)]);
                             $diff = $this->server->getTick() - $this->startAction;
                             $p = $diff / 20;
                             $f = min(($p ** 2 + $p * 2) / 3, 1) * 2;
                             $ev = new EntityShootBowEvent($this, $bow, Entity::createEntity("Arrow", $this->chunk, $nbt, $this, $f == 2 ? true : false), $f);
                             if ($f < 0.1 or $diff < 5) {
                                 $ev->setCancelled();
                             }
                             $this->server->getPluginManager()->callEvent($ev);
                             if ($ev->isCancelled()) {
                                 $ev->getProjectile()->kill();
                                 $this->inventory->sendContents($this);
                             } else {
                                 $ev->getProjectile()->setMotion($ev->getProjectile()->getMotion()->multiply($ev->getForce()));
                                 if ($this->isSurvival()) {
                                     $this->inventory->removeItem(Item::get(Item::ARROW, 0, 1));
                                     $bow->setDamage($bow->getDamage() + 1);
                                     if ($bow->getDamage() >= 385) {
                                         $this->inventory->setItemInHand(Item::get(Item::AIR, 0, 0));
                                     } else {
                                         $this->inventory->setItemInHand($bow);
                                     }
                                 }
                                 if ($ev->getProjectile() instanceof Projectile) {
                                     $this->server->getPluginManager()->callEvent($projectileEv = new ProjectileLaunchEvent($ev->getProjectile()));
                                     if ($projectileEv->isCancelled()) {
                                         $ev->getProjectile()->kill();
                                     } else {
                                         $ev->getProjectile()->spawnToAll();
                                         $this->level->addSound(new LaunchSound($this), $this->getViewers());
                                     }
                                 } else {
                                     $ev->getProjectile()->spawnToAll();
                                 }
                             }
                         }
                     } elseif ($this->inventory->getItemInHand()->getId() === Item::BUCKET and $this->inventory->getItemInHand()->getDamage() === 1) {
                         //Milk!
                         $this->server->getPluginManager()->callEvent($ev = new PlayerItemConsumeEvent($this, $this->inventory->getItemInHand()));
                         if ($ev->isCancelled()) {
                             $this->inventory->sendContents($this);
                             break;
                         }
                         $pk = new EntityEventPacket();
                         $pk->eid = $this->getId();
                         $pk->event = EntityEventPacket::USE_ITEM;
                         $this->dataPacket($pk);
                         Server::broadcastPacket($this->getViewers(), $pk);
                         if ($this->isSurvival()) {
                             $slot = $this->inventory->getItemInHand();
                             --$slot->count;
                             $this->inventory->setItemInHand($slot);
                             $this->inventory->addItem(Item::get(Item::BUCKET, 0, 1));
                         }
                         $this->removeAllEffects();
                     } else {
                         $this->inventory->sendContents($this);
                     }
                     break;
                 case PlayerActionPacket::ACTION_STOP_SLEEPING:
                     $this->stopSleep();
                     break;
                 case PlayerActionPacket::ACTION_RESPAWN:
                     if ($this->spawned === false or $this->isAlive() or !$this->isOnline()) {
                         break;
                     }
                     if ($this->server->isHardcore()) {
                         $this->setBanned(true);
                         break;
                     }
                     $this->craftingType = 0;
                     $this->server->getPluginManager()->callEvent($ev = new PlayerRespawnEvent($this, $this->getSpawn()));
                     $this->teleport($ev->getRespawnPosition());
                     $this->setSprinting(false);
                     $this->setSneaking(false);
                     $this->extinguish();
                     $this->setDataProperty(self::DATA_AIR, self::DATA_TYPE_SHORT, 300);
                     $this->deadTicks = 0;
                     $this->noDamageTicks = 60;
                     $this->setHealth($this->getMaxHealth());
                     $this->removeAllEffects();
                     $this->sendData($this);
                     $this->sendSettings();
                     $this->inventory->sendContents($this);
                     $this->inventory->sendArmorContents($this);
                     $this->blocked = false;
                     $this->spawnToAll();
                     $this->scheduleUpdate();
                     break;
                 case PlayerActionPacket::ACTION_START_SPRINT:
                     $ev = new PlayerToggleSprintEvent($this, true);
                     $this->server->getPluginManager()->callEvent($ev);
                     if ($ev->isCancelled()) {
                         $this->sendData($this);
                     } else {
                         $this->setSprinting(true);
                     }
                     break;
                 case PlayerActionPacket::ACTION_STOP_SPRINT:
                     $ev = new PlayerToggleSprintEvent($this, false);
                     $this->server->getPluginManager()->callEvent($ev);
                     if ($ev->isCancelled()) {
                         $this->sendData($this);
                     } else {
                         $this->setSprinting(false);
                     }
                     break;
                 case PlayerActionPacket::ACTION_START_SNEAK:
                     $ev = new PlayerToggleSneakEvent($this, true);
                     $this->server->getPluginManager()->callEvent($ev);
                     if ($ev->isCancelled()) {
                         $this->sendData($this);
                     } else {
                         $this->setSneaking(true);
                     }
                     break;
                 case PlayerActionPacket::ACTION_STOP_SNEAK:
                     $ev = new PlayerToggleSneakEvent($this, false);
                     $this->server->getPluginManager()->callEvent($ev);
                     if ($ev->isCancelled()) {
                         $this->sendData($this);
                     } else {
                         $this->setSneaking(false);
                     }
                     break;
             }
             $this->startAction = -1;
             $this->setDataFlag(self::DATA_FLAGS, self::DATA_FLAG_ACTION, false);
             break;
         case ProtocolInfo::REMOVE_BLOCK_PACKET:
             if ($this->spawned === false or $this->blocked === true or !$this->isAlive()) {
                 break;
             }
             $this->craftingType = 0;
             $vector = new Vector3($packet->x, $packet->y, $packet->z);
             if ($this->isCreative()) {
                 $item = $this->inventory->getItemInHand();
             } else {
                 $item = $this->inventory->getItemInHand();
             }
             $oldItem = clone $item;
             if ($this->canInteract($vector->add(0.5, 0.5, 0.5), $this->isCreative() ? 13 : 6) and $this->level->useBreakOn($vector, $item, $this)) {
                 if ($this->isSurvival()) {
                     if (!$item->deepEquals($oldItem) or $item->getCount() !== $oldItem->getCount()) {
                         $this->inventory->setItemInHand($item);
                         $this->inventory->sendHeldItem($this->hasSpawned);
                     }
                 }
                 break;
             }
             $this->inventory->sendContents($this);
             $target = $this->level->getBlock($vector);
             $tile = $this->level->getTile($vector);
             $this->level->sendBlocks([$this], [$target], UpdateBlockPacket::FLAG_ALL_PRIORITY);
             $this->inventory->sendHeldItem($this);
             if ($tile instanceof Spawnable) {
                 $tile->spawnTo($this);
             }
             break;
         case ProtocolInfo::MOB_ARMOR_EQUIPMENT_PACKET:
             break;
         case ProtocolInfo::INTERACT_PACKET:
             if ($this->spawned === false or !$this->isAlive() or $this->blocked) {
                 break;
             }
             $this->craftingType = 0;
             $target = $this->level->getEntity($packet->target);
             $cancelled = false;
             if ($target instanceof Player and $this->server->getConfigBoolean("pvp", true) === false) {
                 $cancelled = true;
             }
             if ($target instanceof Entity and $this->getGamemode() !== Player::VIEW and $this->isAlive() and $target->isAlive()) {
                 if ($target instanceof DroppedItem or $target instanceof Arrow) {
                     $this->kick("Attempting to attack an invalid entity");
                     $this->server->getLogger()->warning($this->getServer()->getLanguage()->translateString("pocketmine.player.invalidEntity", [$this->getName()]));
                     break;
                 }
                 $item = $this->inventory->getItemInHand();
                 $damageTable = [Item::WOODEN_SWORD => 4, Item::GOLD_SWORD => 4, Item::STONE_SWORD => 5, Item::IRON_SWORD => 6, Item::DIAMOND_SWORD => 7, Item::WOODEN_AXE => 3, Item::GOLD_AXE => 3, Item::STONE_AXE => 3, Item::IRON_AXE => 5, Item::DIAMOND_AXE => 6, Item::WOODEN_PICKAXE => 2, Item::GOLD_PICKAXE => 2, Item::STONE_PICKAXE => 3, Item::IRON_PICKAXE => 4, Item::DIAMOND_PICKAXE => 5, Item::WOODEN_SHOVEL => 1, Item::GOLD_SHOVEL => 1, Item::STONE_SHOVEL => 2, Item::IRON_SHOVEL => 3, Item::DIAMOND_SHOVEL => 4];
                 $damage = [EntityDamageEvent::MODIFIER_BASE => isset($damageTable[$item->getId()]) ? $damageTable[$item->getId()] : 1];
                 if (!$this->canInteract($target, 8)) {
                     $cancelled = true;
                 } elseif ($target instanceof Player) {
                     if (($target->getGamemode() & 0x1) > 0) {
                         break;
                     } elseif ($this->server->getConfigBoolean("pvp") !== true or $this->server->getDifficulty() === 0) {
                         $cancelled = true;
                     }
                     $armorValues = [Item::LEATHER_CAP => 1, Item::LEATHER_TUNIC => 3, Item::LEATHER_PANTS => 2, Item::LEATHER_BOOTS => 1, Item::CHAIN_HELMET => 1, Item::CHAIN_CHESTPLATE => 5, Item::CHAIN_LEGGINGS => 4, Item::CHAIN_BOOTS => 1, Item::GOLD_HELMET => 1, Item::GOLD_CHESTPLATE => 5, Item::GOLD_LEGGINGS => 3, Item::GOLD_BOOTS => 1, Item::IRON_HELMET => 2, Item::IRON_CHESTPLATE => 6, Item::IRON_LEGGINGS => 5, Item::IRON_BOOTS => 2, Item::DIAMOND_HELMET => 3, Item::DIAMOND_CHESTPLATE => 8, Item::DIAMOND_LEGGINGS => 6, Item::DIAMOND_BOOTS => 3];
                     $points = 0;
                     foreach ($target->getInventory()->getArmorContents() as $index => $i) {
                         if (isset($armorValues[$i->getId()])) {
                             $points += $armorValues[$i->getId()];
                         }
                     }
                     $damage[EntityDamageEvent::MODIFIER_ARMOR] = -floor($damage[EntityDamageEvent::MODIFIER_BASE] * $points * 0.04);
                 }
                 $ev = new EntityDamageByEntityEvent($this, $target, EntityDamageEvent::CAUSE_ENTITY_ATTACK, $damage);
                 if ($cancelled) {
                     $ev->setCancelled();
                 }
                 $target->attack($ev->getFinalDamage(), $ev);
                 if ($ev->isCancelled()) {
                     if ($item->isTool() and $this->isSurvival()) {
                         $this->inventory->sendContents($this);
                     }
                     break;
                 }
                 if ($item->isTool() and $this->isSurvival()) {
                     if ($item->useOn($target) and $item->getDamage() >= $item->getMaxDurability()) {
                         $this->inventory->setItemInHand(Item::get(Item::AIR, 0, 1));
                     } else {
                         $this->inventory->setItemInHand($item);
                     }
                 }
             }
             break;
         case ProtocolInfo::ANIMATE_PACKET:
             if ($this->spawned === false or !$this->isAlive()) {
                 break;
             }
             $this->server->getPluginManager()->callEvent($ev = new PlayerAnimationEvent($this, $packet->action));
             if ($ev->isCancelled()) {
                 break;
             }
             $pk = new AnimatePacket();
             $pk->eid = $this->getId();
             $pk->action = $ev->getAnimationType();
             Server::broadcastPacket($this->getViewers(), $pk);
             break;
         case ProtocolInfo::SET_HEALTH_PACKET:
             //Not used
             break;
         case ProtocolInfo::ENTITY_EVENT_PACKET:
             if ($this->spawned === false or $this->blocked === true or !$this->isAlive()) {
                 break;
             }
             $this->craftingType = 0;
             $this->setDataFlag(self::DATA_FLAGS, self::DATA_FLAG_ACTION, false);
             //TODO: check if this should be true
             switch ($packet->event) {
                 case 9:
                     //Eating
                     $items = [Item::APPLE => 4, Item::MUSHROOM_STEW => 10, Item::BEETROOT_SOUP => 10, Item::BREAD => 5, Item::RAW_PORKCHOP => 3, Item::COOKED_PORKCHOP => 8, Item::RAW_BEEF => 3, Item::STEAK => 8, Item::COOKED_CHICKEN => 6, Item::RAW_CHICKEN => 2, Item::MELON_SLICE => 2, Item::GOLDEN_APPLE => 10, Item::PUMPKIN_PIE => 8, Item::CARROT => 4, Item::POTATO => 1, Item::BAKED_POTATO => 6, Item::COOKIE => 2, Item::COOKED_FISH => 5, Item::COOKED_SALMON => 6, Item::RAW_FISH => 2, Item::RAW_SALMON => 2, Item::CLOWN_FISH => 1, Item::PUFFER_FISH => 1];
                     $slot = $this->inventory->getItemInHand();
                     if ($this->getHealth() < $this->getMaxHealth() and isset($items[$slot->getId()])) {
                         $this->server->getPluginManager()->callEvent($ev = new PlayerItemConsumeEvent($this, $slot));
                         if ($ev->isCancelled()) {
                             $this->inventory->sendContents($this);
                             break;
                         }
                         $pk = new EntityEventPacket();
                         $pk->eid = $this->getId();
                         $pk->event = EntityEventPacket::USE_ITEM;
                         $this->dataPacket($pk);
                         Server::broadcastPacket($this->getViewers(), $pk);
                         $amount = $items[$slot->getId()];
                         $ev = new EntityRegainHealthEvent($this, $amount, EntityRegainHealthEvent::CAUSE_EATING);
                         $this->heal($ev->getAmount(), $ev);
                         --$slot->count;
                         $this->inventory->setItemInHand($slot);
                         if ($slot->getId() === Item::MUSHROOM_STEW or $slot->getId() === Item::BEETROOT_SOUP) {
                             $this->inventory->addItem(Item::get(Item::BOWL, 0, 1));
                         } elseif ($slot->getId() === Item::PUFFER_FISH) {
                             //Pufferfish
                             //$this->addEffect(Effect::getEffect(Effect::HUNGER)->setAmplifier(2)->setDuration(15 * 20));
                             $this->addEffect(Effect::getEffect(Effect::NAUSEA)->setAmplifier(1)->setDuration(15 * 20));
                             $this->addEffect(Effect::getEffect(Effect::POISON)->setAmplifier(3)->setDuration(60 * 20));
                         }
                     }
                     break;
             }
             break;
         case ProtocolInfo::DROP_ITEM_PACKET:
             if ($this->spawned === false or $this->blocked === true or !$this->isAlive()) {
                 break;
             }
             $item = $this->inventory->getItemInHand();
             $ev = new PlayerDropItemEvent($this, $item);
             $this->server->getPluginManager()->callEvent($ev);
             if ($ev->isCancelled()) {
                 $this->inventory->sendContents($this);
                 break;
             }
             $this->inventory->setItemInHand(Item::get(Item::AIR, 0, 1));
             $motion = $this->getDirectionVector()->multiply(0.4);
             $this->level->dropItem($this->add(0, 1.3, 0), $item, $motion, 40);
             $this->setDataFlag(self::DATA_FLAGS, self::DATA_FLAG_ACTION, false);
             break;
         case ProtocolInfo::TEXT_PACKET:
             if ($this->spawned === false or !$this->isAlive()) {
                 break;
             }
             $this->craftingType = 0;
             if ($packet->type === TextPacket::TYPE_CHAT) {
                 $packet->message = TextFormat::clean($packet->message, $this->removeFormat);
                 foreach (explode("\n", $packet->message) as $message) {
                     if (trim($message) != "" and strlen($message) <= 255 and $this->messageCounter-- > 0) {
                         $ev = new PlayerCommandPreprocessEvent($this, $message);
                         if (mb_strlen($ev->getMessage(), "UTF-8") > 320) {
                             $ev->setCancelled();
                         }
                         $this->server->getPluginManager()->callEvent($ev);
                         if ($ev->isCancelled()) {
                             break;
                         }
                         if (substr($ev->getMessage(), 0, 1) === "/") {
                             //Command
                             Timings::$playerCommandTimer->startTiming();
                             $this->server->dispatchCommand($ev->getPlayer(), substr($ev->getMessage(), 1));
                             Timings::$playerCommandTimer->stopTiming();
                         } else {
                             $this->server->getPluginManager()->callEvent($ev = new PlayerChatEvent($this, $ev->getMessage()));
                             if (!$ev->isCancelled()) {
                                 $this->server->broadcastMessage($this->getServer()->getLanguage()->translateString($ev->getFormat(), [$ev->getPlayer()->getDisplayName(), $ev->getMessage()]), $ev->getRecipients());
                             }
                         }
                     }
                 }
             }
             break;
         case ProtocolInfo::CONTAINER_CLOSE_PACKET:
             if ($this->spawned === false or $packet->windowid === 0) {
                 break;
             }
             $this->craftingType = 0;
             $this->currentTransaction = null;
             if (isset($this->windowIndex[$packet->windowid])) {
                 $this->server->getPluginManager()->callEvent(new InventoryCloseEvent($this->windowIndex[$packet->windowid], $this));
                 $this->removeWindow($this->windowIndex[$packet->windowid]);
             } else {
                 unset($this->windowIndex[$packet->windowid]);
             }
             break;
         case ProtocolInfo::CRAFTING_EVENT_PACKET:
             if ($this->spawned === false or !$this->isAlive()) {
                 break;
             } elseif (!isset($this->windowIndex[$packet->windowId])) {
                 $this->inventory->sendContents($this);
                 $pk = new ContainerClosePacket();
                 $pk->windowid = $packet->windowId;
                 $this->dataPacket($pk);
                 break;
             }
             $recipe = $this->server->getCraftingManager()->getRecipe($packet->id);
             if ($recipe === null or ($recipe instanceof BigShapelessRecipe or $recipe instanceof BigShapedRecipe) and $this->craftingType === 0) {
                 $this->inventory->sendContents($this);
                 break;
             }
             foreach ($packet->input as $i => $item) {
                 if ($item->getDamage() === -1 or $item->getDamage() === 0xffff) {
                     $item->setDamage(null);
                 }
                 if ($i < 9 and $item->getId() > 0) {
                     $item->setCount(1);
                 }
             }
             $canCraft = true;
             if ($recipe instanceof ShapedRecipe) {
                 for ($x = 0; $x < 3 and $canCraft; ++$x) {
                     for ($y = 0; $y < 3; ++$y) {
                         $item = $packet->input[$y * 3 + $x];
                         $ingredient = $recipe->getIngredient($x, $y);
                         if ($item->getCount() > 0) {
                             if ($ingredient === null or !$ingredient->deepEquals($item, $ingredient->getDamage() !== null, $ingredient->getCompoundTag() !== null)) {
                                 $canCraft = false;
                                 break;
                             }
                         }
                     }
                 }
             } elseif ($recipe instanceof ShapelessRecipe) {
                 $needed = $recipe->getIngredientList();
                 for ($x = 0; $x < 3 and $canCraft; ++$x) {
                     for ($y = 0; $y < 3; ++$y) {
                         $item = clone $packet->input[$y * 3 + $x];
                         foreach ($needed as $k => $n) {
                             if ($n->deepEquals($item, $n->getDamage() !== null, $n->getCompoundTag() !== null)) {
                                 $remove = min($n->getCount(), $item->getCount());
                                 $n->setCount($n->getCount() - $remove);
                                 $item->setCount($item->getCount() - $remove);
                                 if ($n->getCount() === 0) {
                                     unset($needed[$k]);
                                 }
                             }
                         }
                         if ($item->getCount() > 0) {
                             $canCraft = false;
                             break;
                         }
                     }
                 }
                 if (count($needed) > 0) {
                     $canCraft = false;
                 }
             } else {
                 $canCraft = false;
             }
             /** @var Item[] $ingredients */
             $ingredients = $packet->input;
             $result = $packet->output[0];
             if (!$canCraft or !$recipe->getResult()->deepEquals($result)) {
                 $this->server->getLogger()->debug("Unmatched recipe " . $recipe->getId() . " from player " . $this->getName() . ": expected " . $recipe->getResult() . ", got " . $result . ", using: " . implode(", ", $ingredients));
                 $this->inventory->sendContents($this);
                 break;
             }
             $used = array_fill(0, $this->inventory->getSize(), 0);
             foreach ($ingredients as $ingredient) {
                 $slot = -1;
                 foreach ($this->inventory->getContents() as $index => $i) {
                     if ($ingredient->getId() !== 0 and $ingredient->deepEquals($i, $i->getDamage() !== null) and $i->getCount() - $used[$index] >= 1) {
                         $slot = $index;
                         $used[$index]++;
                         break;
                     }
                 }
                 if ($ingredient->getId() !== 0 and $slot === -1) {
                     $canCraft = false;
                     break;
                 }
             }
             if (!$canCraft) {
                 $this->server->getLogger()->debug("Unmatched recipe " . $recipe->getId() . " from player " . $this->getName() . ": client does not have enough items, using: " . implode(", ", $ingredients));
                 $this->inventory->sendContents($this);
                 break;
             }
             $this->server->getPluginManager()->callEvent($ev = new CraftItemEvent($this, $ingredients, $recipe));
             if ($ev->isCancelled()) {
                 $this->inventory->sendContents($this);
                 break;
             }
             foreach ($used as $slot => $count) {
                 if ($count === 0) {
                     continue;
                 }
                 $item = $this->inventory->getItem($slot);
                 if ($item->getCount() > $count) {
                     $newItem = clone $item;
                     $newItem->setCount($item->getCount() - $count);
                 } else {
                     $newItem = Item::get(Item::AIR, 0, 0);
                 }
                 $this->inventory->setItem($slot, $newItem);
             }
             $extraItem = $this->inventory->addItem($recipe->getResult());
             if (count($extraItem) > 0) {
                 foreach ($extraItem as $item) {
                     $this->level->dropItem($this, $item);
                 }
             }
             switch ($recipe->getResult()->getId()) {
                 case Item::WORKBENCH:
                     $this->awardAchievement("buildWorkBench");
                     break;
                 case Item::WOODEN_PICKAXE:
                     $this->awardAchievement("buildPickaxe");
                     break;
                 case Item::FURNACE:
                     $this->awardAchievement("buildFurnace");
                     break;
                 case Item::WOODEN_HOE:
                     $this->awardAchievement("buildHoe");
                     break;
                 case Item::BREAD:
                     $this->awardAchievement("makeBread");
                     break;
                 case Item::CAKE:
                     //TODO: detect complex recipes like cake that leave remains
                     $this->awardAchievement("bakeCake");
                     $this->inventory->addItem(Item::get(Item::BUCKET, 0, 3));
                     break;
                 case Item::STONE_PICKAXE:
                 case Item::GOLD_PICKAXE:
                 case Item::IRON_PICKAXE:
                 case Item::DIAMOND_PICKAXE:
                     $this->awardAchievement("buildBetterPickaxe");
                     break;
                 case Item::WOODEN_SWORD:
                     $this->awardAchievement("buildSword");
                     break;
                 case Item::DIAMOND:
                     $this->awardAchievement("diamond");
                     break;
             }
             break;
         case ProtocolInfo::CONTAINER_SET_SLOT_PACKET:
             if ($this->spawned === false or $this->blocked === true or !$this->isAlive()) {
                 break;
             }
             if ($packet->slot < 0) {
                 break;
             }
             if ($packet->windowid === 0) {
                 //Our inventory
                 if ($packet->slot >= $this->inventory->getSize()) {
                     break;
                 }
                 if ($this->isCreative()) {
                     if (Item::getCreativeItemIndex($packet->item) !== -1) {
                         $this->inventory->setItem($packet->slot, $packet->item);
                         $this->inventory->setHotbarSlotIndex($packet->slot, $packet->slot);
                         //links $hotbar[$packet->slot] to $slots[$packet->slot]
                     }
                 }
                 $transaction = new BaseTransaction($this->inventory, $packet->slot, $this->inventory->getItem($packet->slot), $packet->item);
             } elseif ($packet->windowid === ContainerSetContentPacket::SPECIAL_ARMOR) {
                 //Our armor
                 if ($packet->slot >= 4) {
                     break;
                 }
                 $transaction = new BaseTransaction($this->inventory, $packet->slot + $this->inventory->getSize(), $this->inventory->getArmorItem($packet->slot), $packet->item);
             } elseif (isset($this->windowIndex[$packet->windowid])) {
                 $this->craftingType = 0;
                 $inv = $this->windowIndex[$packet->windowid];
                 $transaction = new BaseTransaction($inv, $packet->slot, $inv->getItem($packet->slot), $packet->item);
             } else {
                 break;
             }
             if ($transaction->getSourceItem()->deepEquals($transaction->getTargetItem()) and $transaction->getTargetItem()->getCount() === $transaction->getSourceItem()->getCount()) {
                 //No changes!
                 //No changes, just a local inventory update sent by the server
                 break;
             }
             if ($this->currentTransaction === null or $this->currentTransaction->getCreationTime() < microtime(true) - 8) {
                 if ($this->currentTransaction !== null) {
                     foreach ($this->currentTransaction->getInventories() as $inventory) {
                         if ($inventory instanceof PlayerInventory) {
                             $inventory->sendArmorContents($this);
                         }
                         $inventory->sendContents($this);
                     }
                 }
                 $this->currentTransaction = new SimpleTransactionGroup($this);
             }
             $this->currentTransaction->addTransaction($transaction);
             if ($this->currentTransaction->canExecute()) {
                 $achievements = [];
                 foreach ($this->currentTransaction->getTransactions() as $ts) {
                     $inv = $ts->getInventory();
                     if ($inv instanceof FurnaceInventory) {
                         if ($ts->getSlot() === 2) {
                             switch ($inv->getResult()->getId()) {
                                 case Item::IRON_INGOT:
                                     $achievements[] = "acquireIron";
                                     break;
                             }
                         }
                     }
                 }
                 if ($this->currentTransaction->execute()) {
                     foreach ($achievements as $a) {
                         $this->awardAchievement($a);
                     }
                 }
                 $this->currentTransaction = null;
             }
             break;
         case ProtocolInfo::BLOCK_ENTITY_DATA_PACKET:
             if ($this->spawned === false or $this->blocked === true or !$this->isAlive()) {
                 break;
             }
             $this->craftingType = 0;
             $pos = new Vector3($packet->x, $packet->y, $packet->z);
             if ($pos->distanceSquared($this) > 10000) {
                 break;
             }
             $t = $this->level->getTile($pos);
             if ($t instanceof Sign) {
                 $nbt = new NBT(NBT::LITTLE_ENDIAN);
                 $nbt->read($packet->namedtag);
                 $nbt = $nbt->getData();
                 if ($nbt["id"] !== Tile::SIGN) {
                     $t->spawnTo($this);
                 } else {
                     $ev = new SignChangeEvent($t->getBlock(), $this, [TextFormat::clean($nbt["Text1"], $this->removeFormat), TextFormat::clean($nbt["Text2"], $this->removeFormat), TextFormat::clean($nbt["Text3"], $this->removeFormat), TextFormat::clean($nbt["Text4"], $this->removeFormat)]);
                     if (!isset($t->namedtag->Creator) or $t->namedtag["Creator"] !== $this->getRawUniqueId()) {
                         $ev->setCancelled();
                     } else {
                         foreach ($ev->getLines() as $line) {
                             if (mb_strlen($line, "UTF-8") > 16) {
                                 $ev->setCancelled();
                             }
                         }
                     }
                     $this->server->getPluginManager()->callEvent($ev);
                     if (!$ev->isCancelled()) {
                         $t->setText($ev->getLine(0), $ev->getLine(1), $ev->getLine(2), $ev->getLine(3));
                     } else {
                         $t->spawnTo($this);
                     }
                 }
             }
             break;
         default:
             break;
     }
     $timings->stopTiming();
 }