Postado Setembro 15, 2019 5 anos Estou com um pequeno problema na minha função cleanMap. Basicamente, ela remove apenas itens comuns do chão. Não remove corpos de monstros, nem itens com Action ID. Preciso modificar ela de forma que remova itens com Action ID e corpos quando for executada. Agradeço se alguém puder ajudar. Segue a função na source: Spoiler uint32_t Map::clean() const { uint64_t start = OTSYS_TIME(); size_t count = 0, tiles = 0; if (g_game.getGameState() == GAME_STATE_NORMAL) { g_game.setGameState(GAME_STATE_MAINTAIN); } std::vector<const QTreeNode*> nodes { &root }; std::vector<Item*> toRemove; do { const QTreeNode* node = nodes.back(); nodes.pop_back(); if (node->isLeaf()) { const QTreeLeafNode* leafNode = static_cast<const QTreeLeafNode*>(node); for (uint8_t z = 0; z < MAP_MAX_LAYERS; ++z) { Floor* floor = leafNode->getFloor(z); if (!floor) { continue; } for (auto& row : floor->tiles) { for (auto tile : row) { if (!tile || tile->hasFlag(TILESTATE_PROTECTIONZONE)) { continue; } TileItemVector* itemList = tile->getItemList(); if (!itemList) { continue; } ++tiles; for (Item* item : *itemList) { if (item->isCleanable()) { toRemove.push_back(item); } } for (Item* item : toRemove) { g_game.internalRemoveItem(item, -1); } count += toRemove.size(); toRemove.clear(); } } } } else { for (auto childNode : node->child) { if (childNode) { nodes.push_back(childNode); } } } } while (!nodes.empty()); if (g_game.getGameState() == GAME_STATE_MAINTAIN) { g_game.setGameState(GAME_STATE_NORMAL); } std::cout << "> CLEAN: Removed " << count << " item" << (count != 1 ? "s" : "") << " from " << tiles << " tile" << (tiles != 1 ? "s" : "") << " in " << (OTSYS_TIME() - start) / (1000.) << " seconds." << std::endl; return count; } Já descobri! No item.h eu posso modificar para que itens com Action ID sejam "removíveis" durante o cleanMap. Editado Setembro 15, 2019 5 anos por MatCollier (veja o histórico de edições)
Participe da conversa
Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.