I was wondering what the best way was to check the text on a sign (I'm pretty sure there's multiple ways ) as I want as few lines of code as possible. I'm currently using this : PHP: public function onInteract(PlayerInteractEvent $event) { $signtext = $event->getPlayer()->getLevel()->getTile($this->main->getBlock())->getText(); if($event->getBlock()->getId() == 68) { if($signtext[0] == "-join-") { if($signtext[1] == "small") { $event->getPlayer()->teleport(new Vector3(141, 11, 33)); } elseif($signtext[1] == "medium") { $event->getPlayer()->teleport(new Vector3(184, 11, 28)); } elseif($signtext[1] == "large") { $event->getPlayer()->teleport(new Vector3(131, 11, -18)); } elseif($signtext[1] == "skyisland") { $event->getPlayer()->teleport(new Vector3(207, 27, 4)); } elseif($signtext[1] == "wasteland") { $event->getPlayer()->teleport(new Vector3(-4, 7, 106)); } elseif($signtext[1] == "end") { $event->getPlayer()->teleport(new Vector3(-62, 8, 165)); } elseif($signtext[1] == "village") { $event->getPlayer()->teleport(new Vector3(-120, 5, 164)); } elseif($signtext[1] == "nether") { $event->getPlayer()->teleport(new Vector3(-68, 13, 103)); } } } } Thanks
PHP: use pocketmine\tile\Sign;use pocketmine\tile\Tile; if($event->getBlock()->getID() == 323 || $event->getBlock()->getID() == 63 || $event->getBlock()->getID() == 68) { $sign = $event->getPlayer()->getLevel()->getTile($event->getBlock()); if(!($sign instanceof Sign)) { return; } }
yes... but checking is after PHP: if(!($sign instanceof Sign)) { return; } there u can check the lines PHP: $sign = $sign->getText(); $i = $sign[1]; $i2 = $sign[2]; $i3 = $sign[3];
-.- i didnt xD PHP: public function tileupdate(SignChangeEvent $event) { if($event->getBlock()->getID() == 323 || $event->getBlock()->getID() == 63 || $event->getBlock()->getID() == 68) { $sign = $event->getPlayer()->getLevel()->getTile($event->getBlock()); if(!($sign instanceof Sign)) { return true; } $sign = $event->getLines(); if($sign[0]=='[Bettkampf]') { if(!$event->getPlayer()->isOp()) { $event->setLine(0,"[Nichtig]"); return false; } } } return true; }
I would use switch and case like so PHP: $lines= $sign->getText();$ln1 = $lines[0];switch($ln1) {case "Word":break;case "DiffWord":break;} of course you can change it to do any line on the sign you may like
I am using this code: PHP: public function playerBlockTouch(PlayerInteractEvent $event){ if($event->getBlock()->getID() == 323 || $event->getBlock()->getID() == 63 || $event->getBlock()->getID() == 68){ $sign = $event->getPlayer()->getLevel()->getTile($event->getBlock()); if(!($sign instanceof Sign)){ return; } $sign = $sign->getText(); $this->getServer()->loadLevel("PVP"); if($sign[0]=='[PVP]'){ if(Server::getInstance()->loadLevel("PVP") != false){ $event->getPlayer()->sendMessage("[server] teleporting you to arena..."); $event->getPlayer()->teleport(new Position($x, $y, $z, $this->getServer()->getLevelByName("PVP")));}} Works perfectly for me.
Thanks for all your input I found this code works fastest PHP: public function onInteract(PlayerInteractEvent $event) { $sign = $event->getPlayer()->getLevel()->getTile($event->getBlock()); if($event->getBlock()->getId() == 323 || $event->getBlock()->getId() == 63 || $event->getBlock()->getId() == 68) { if($sign instanceof Sign) { $signtext = $sign->getText(); if($signtext[0] === "Tap to Join") { if($signtext[1] === "Small PvP") { $event->getPlayer()->teleport(new Vector3(141, 11, 33)); $event->getPlayer()->sendMessage("Teleporting you to Small PvP."); } elseif($signtext[1] === "Medium PvP") { $event->getPlayer()->teleport(new Vector3(184, 11, 28)); $event->getPlayer()->sendMessage("Teleported you to Medium PvP."); } elseif($signtext[1] === "Large PvP") { $event->getPlayer()->teleport(new Vector3(139, 11, -18)); $event->getPlayer()->sendMessage("Teleported you to Large PvP."); } elseif($signtext[1] === "Sky Land") { $event->getPlayer()->teleport(new Vector3(107, 27, 4)); $event->getPlayer()->sendMessage("Teleported you to Sky Islands PvP."); } elseif($signtext[1] === "Nether PvP") { $event->getPlayer()->teleport(new Vector3(-68, 13, 103)); $event->getPlayer()->sendMessage("Teleported you to Nether PvP."); } elseif($signtext[1] === "End PvP") { $event->getPlayer()->teleport(new Vector3(-62, 8, 165)); $event->getPlayer()->sendMessage("Teleported you to End PvP."); } elseif($signtext[1] === "Wasteland PvP") { $event->getPlayer()->teleport(new Vector3(-4, 7, 186)); $event->getPlayer()->sendMessage("Teleported you to Wasteland PvP."); } elseif($signtext[1] === "Small Village") { $event->getPlayer()->teleport(new Vector3(-120, 5, 164)); $event->getPlayer()->sendMessage("Teleported you to Small Village PvP."); } } } } }