Ir para conteúdo

Featured Replies

Postado

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 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.

Visitante
Responder

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Conteúdo Similar

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.7k

Informação Importante

Confirmação de Termo