From 4cc1cf4f7e634269b96392c9245aeb29227745cf Mon Sep 17 00:00:00 2001 From: CPunch Date: Mon, 21 Sep 2020 14:55:34 -0500 Subject: [PATCH] minor chunk refactor --- src/ChunkManager.cpp | 35 +++++++++++++++++++++++++---------- src/ChunkManager.hpp | 4 +++- src/NPCManager.cpp | 2 +- src/PlayerManager.cpp | 7 +++---- 4 files changed, 32 insertions(+), 16 deletions(-) diff --git a/src/ChunkManager.cpp b/src/ChunkManager.cpp index c454a93..bfd0883 100644 --- a/src/ChunkManager.cpp +++ b/src/ChunkManager.cpp @@ -27,7 +27,7 @@ void ChunkManager::addNPC(int posX, int posY, int32_t id) { chunk->NPCs.insert(id); - NPCManager::addNPC(grabChunks(pos.first, pos.second), id); + NPCManager::addNPC(grabChunks(pos), id); } void ChunkManager::addPlayer(int posX, int posY, CNSocket* sock) { @@ -45,26 +45,41 @@ void ChunkManager::addPlayer(int posX, int posY, CNSocket* sock) { chunk->players.insert(sock); } +void ChunkManager::removePlayer(std::pair chunkPos, CNSocket* sock) { + if (!checkChunk(chunkPos)) + return; // do nothing if chunk doesn't even exist + + Chunk* chunk = chunks[chunkPos]; + + chunk->players.erase(sock); // gone + + // TODO: if players and NPCs are empty, free chunk and remove it from surrounding views +} + +bool ChunkManager::checkChunk(std::pair chunk) { + return chunks.find(chunk) != chunks.end(); +} + std::pair ChunkManager::grabChunk(int posX, int posY) { return std::make_pair(posX / (settings::PLAYERDISTANCE / 3), posY / (settings::PLAYERDISTANCE / 3)); } -std::vector ChunkManager::grabChunks(int chunkX, int chunkY) { - std::vector delta; - delta.reserve(9); +std::vector ChunkManager::grabChunks(std::pair chunk) { + std::vector chnks; + chnks.reserve(9); + // grabs surrounding chunks if they exist for (int i = -1; i < 2; i++) { for (int z = -1; z < 2; z++) { - std::pair pos(chunkX+i, chunkY+z); + std::pair pos(chunk.first+i, chunk.second+z); - // if chunk exists, add it to the delta - if (chunks.find(pos) != chunks.end()) { - delta.push_back(chunks[pos]); - } + // if chunk exists, add it to the vector + if (checkChunk(pos)) + chnks.push_back(chunks[pos]); } } - return delta; + return chnks; } // returns the chunks that aren't shared (only from from) diff --git a/src/ChunkManager.hpp b/src/ChunkManager.hpp index 06993d7..16244c4 100644 --- a/src/ChunkManager.hpp +++ b/src/ChunkManager.hpp @@ -21,7 +21,9 @@ namespace ChunkManager { void addNPC(int posX, int posY, int32_t id); void addPlayer(int posX, int posY, CNSocket* sock); + void removePlayer(std::pair chunkPos, CNSocket* sock); + bool checkChunk(std::pair chunk); std::pair grabChunk(int posX, int posY); - std::vector grabChunks(int chunkX, int chunkY); + std::vector grabChunks(std::pair chunkPos); std::vector getDeltaChunks(std::vector from, std::vector to); } diff --git a/src/NPCManager.cpp b/src/NPCManager.cpp index 2dac9e1..fce1c71 100644 --- a/src/NPCManager.cpp +++ b/src/NPCManager.cpp @@ -71,7 +71,7 @@ void NPCManager::removeNPC(int32_t id) { exitData.iNPC_ID = id; // remove it from the clients - for (Chunk* chunk : ChunkManager::grabChunks(pos.first, pos.second)) { + for (Chunk* chunk : ChunkManager::grabChunks(pos)) { for (CNSocket* sock : chunk->players) { // send to socket sock->sendPacket((void*)&exitData, P_FE2CL_NPC_EXIT, sizeof(sP_FE2CL_NPC_EXIT)); diff --git a/src/PlayerManager.cpp b/src/PlayerManager.cpp index 3f8a2de..4052995 100644 --- a/src/PlayerManager.cpp +++ b/src/PlayerManager.cpp @@ -99,9 +99,8 @@ void PlayerManager::removePlayerFromChunks(std::vector chunks, CNSocket* } } - // remove us from that old stinky chunk (+ a sanity check) - if (ChunkManager::chunks.find(players[sock].chunkPos) != ChunkManager::chunks.end()) - ChunkManager::chunks[players[sock].chunkPos]->players.erase(sock); + // remove us from that old stinky chunk + ChunkManager::removePlayer(players[sock].chunkPos, sock); } void PlayerManager::addPlayerToChunks(std::vector chunks, CNSocket* sock) { @@ -169,7 +168,7 @@ void PlayerManager::updatePlayerPosition(CNSocket* sock, int X, int Y, int Z) { return; // add player to chunk - std::vector allChunks = ChunkManager::grabChunks(newPos.first, newPos.second); + std::vector allChunks = ChunkManager::grabChunks(newPos); // first, remove all the old npcs & players from the old chunks removePlayerFromChunks(ChunkManager::getDeltaChunks(view.currentChunks, allChunks), sock);