void InventoryHandler::handleScriptItem(Player *player, PacketReader &packet) { if (player->getNpc() != nullptr || player->getShop() != 0 || player->getTradeId() != 0) { // Player is busy :O! Hack InventoryPacket::blankUpdate(player); // We don't want stuck players, do we? return; } if (!player->updateTickCount(packet.get<int32_t>())) { // Tickcount was the same or less than 100 of the difference. return; } int16_t slot = packet.get<int16_t>(); int32_t itemid = packet.get<int32_t>(); Item *item = player->getInventory()->getItem(Inventories::UseInventory, slot); if (item == nullptr || item->getId() != itemid) { // Hacking or hacking failure InventoryPacket::blankUpdate(player); // We don't want stuck players, do we? return; } string scriptName = ScriptDataProvider::Instance()->getItemScript(itemid); if (scriptName == "") { // Hacking or no script for item found. InventoryPacket::blankUpdate(player); // We don't want stuck players, do we? return; } int32_t npcid = ItemDataProvider::Instance()->getItemNpc(itemid); // Lets run the NPC! Npc *npc = new Npc(npcid, player, scriptName); if (!npc->checkEnd()) { // NPC is running/script found! // Delete the item used. Inventory::takeItem(player, itemid, 1); npc->run(); } else { // NPC didn't ran/no script found O.o! Lets unstuck the player. InventoryPacket::blankUpdate(player); // We don't want stuck players, do we? } }