Hi everyone, I'm making a server core with multiple classes, doing them I'm learning pmmp API at same time, I know php and a little php OOP, but I need some help because there are things that I don't understand, how do I spawn a simple npc in my lobby with custom pos? I watched other threads but were useless for them. Thx for you help, I appreciate it!
PHP: public function spawnNPC(Player $player) { $nbt = new CompoundTag; $nbt->Pos = new ListTag("Pos", [ new DoubleTag("", $player->getX()), new DoubleTag("", $player->getY()), new DoubleTag("", $player->getZ()) ]); $nbt->Motion = new ListTag("Motion", [ new DoubleTag("", 0), new DoubleTag("", 0), new DoubleTag("", 0) ]); $nbt->Rotation = new ListTag("Rotation", [ new FloatTag("", $player->getYaw()), new FloatTag("", $player->getPitch()) ]); $nbt->Health = new ShortTag("Health", 20); $nbt->Skin = new CompoundTag("Skin", [ "Data" => new StringTag("Data", $player->getSkin()->getSkinData()), "Name" => new StringTag("Name", $player->getSkin()->getSkinId())]); $human = new Human($player->getLevel(), $nbt); $human->setNameTag($player->getName()); $human->setNameTagVisible(false); $human->spawnTo($player);}
PHP: $pk = new AddPlayerPacket(); $pk->entityRuntimeId = Entity::$entityCount++; $pk->uuid = UUID::fromRandom(); $pk->username = "NPC"; $pk->position = $position; $pk->item = ItemFactory::get(Item::AIR, 0, 0); self::$plugin->getServer()->broadcastPacket([$player], $pk); 1. Not a real entity so its less lag 2. Here. I posted code
Thanks, it seems working, i edited pmmp adding nbt, and fixed few things, it seems working but it gives this error related at the entity skin: InvalidStateException: "Human must have a valid skin set". So i think the $player->getSkin()->getSkinData(); is not working properly, any help? Thanks.
i used GamakCZ method, so should be this: $nbt->Skin = new CompoundTag("Skin", [ "Data" => new StringTag("Data", $player->getSkin()->getSkinData()), "Name" => new StringTag("Name", $player->getSkin()->getSkinId())]);
[14:13:39] [Server thread/CRITICAL]: Could not pass event 'pocketmine\event\player\PlayerJoinEvent' to 'HyCrystal v1': Human must have a valid skin set on WMCore\Loader [14:13:39] [Server thread/CRITICAL]: InvalidStateException: "Human must have a valid skin set" (EXCEPTION) in "src/pocketmine/entity/Human" at line 92 [14:13:39] [Server thread/DEBUG]: #0 WallMine PE Core/src/WMCore/Loader(72): pocketmine\entity\Human->__construct(pocketmine\level\Level object, pocketmine\nbt\tag\CompoundTag object) [14:13:39] [Server thread/DEBUG]: #1 src/pocketmine/plugin/MethodEventExecutor(38): WMCore\Loader->onJoin(pocketmine\event\player\PlayerJoinEvent object) [14:13:39] [Server thread/DEBUG]: #2 src/pocketmine/plugin/RegisteredListener(98): pocketmine\plugin\MethodEventExecutor->execute(WMCore\Loader object, pocketmine\event\player\PlayerJoinEvent object) [14:13:39] [Server thread/DEBUG]: #3 src/pocketmine/plugin/PluginManager(683): pocketmine\plugin\RegisteredListener->callEvent(pocketmine\event\player\PlayerJoinEvent object) [14:13:39] [Server thread/DEBUG]: #4 src/pocketmine/Player(969): pocketmine\plugin\PluginManager->callEvent(pocketmine\event\player\PlayerJoinEvent object) [14:13:39] [Server thread/DEBUG]: #5 src/pocketmine/Player(917): pocketmine\Player->doFirstSpawn() [14:13:39] [Server thread/DEBUG]: #6 src/pocketmine/level/Level(2550): pocketmine\Player->sendChunk(integer -2, integer 1, pocketmine\network\mcpe\protocol\BatchPacket object) [14:13:39] [Server thread/DEBUG]: #7 src/pocketmine/level/Level(2595): pocketmine\level\Level->sendChunkFromCache(integer -2, integer 1) [14:13:39] [Server thread/DEBUG]: #8 src/pocketmine/level/format/io/ChunkRequestTask(88): pocketmine\level\Level->chunkRequestCallback(integer -2, integer 1, pocketmine\network\mcpe\protocol\BatchPacket object) [14:13:39] [Server thread/DEBUG]: #9 src/pocketmine/scheduler/AsyncPool(162): pocketmine\level\format\io\ChunkRequestTask->onCompletion(pocketmine\Server object) [14:13:39] [Server thread/DEBUG]: #10 src/pocketmine/scheduler/ServerScheduler(342): pocketmine\scheduler\AsyncPool->collectTasks() [14:13:39] [Server thread/DEBUG]: #11 src/pocketmine/Server(2543): pocketmine\scheduler\ServerScheduler->mainThreadHeartbeat(integer 784) [14:13:39] [Server thread/DEBUG]: #12 src/pocketmine/Server(2285): pocketmine\Server->tick() [14:13:39] [Server thread/DEBUG]: #13 src/pocketmine/Server(2158): pocketmine\Server->tickProcessor() [14:13:39] [Server thread/DEBUG]: #14 src/pocketmine/Server(1744): pocketmine\Server->start() [14:13:39] [Server thread/DEBUG]: #15 src/pocketmine/PocketMine(385): pocketmine\Server->__construct(BaseClassLoader object, pocketmine\utils\MainLogger object, string C:\Users\Enrico\Desktop\PocketMine-MP\, string C:\Users\Enrico\Desktop\PocketMine-MP\plugins\) [14:13:39] [Server thread/DEBUG]: #16 C:/Users/Enrico/Desktop/PocketMine-MP/PocketMine-MP.phar(1): require(string phar://C:/Users/Enrico/Desktop/PocketMine-MP/PocketMine-MP.phar/src/pocketmine/PocketMine.php) and yes, is registered: $player = $e->getPlayer();
thanks, now is working, but if i want to add it a function onTouch() and a custom skin, what should i have to do? i have to store skin or with my method it auto change evry player join
Code that @Daniktheboss gave you register entity only to the client, you have to register it in server if you want to check touching it etc without DataPacketReceiveEvent.