diff --git a/Source/Contents/NavigationLink.cpp b/Source/Contents/NavigationLink.cpp index c9957dd..51d6420 100644 --- a/Source/Contents/NavigationLink.cpp +++ b/Source/Contents/NavigationLink.cpp @@ -1,6 +1,12 @@ #include "Contents/NavigationManager.h" // OFFSET: 0x00B8D8D0 +// FUNCTION: fn_19436 +CNavi_Link::~CNavi_Link() { + this->type = 200; + this->linkedInfo = nullptr; + this->linkedLinks.clear(); +} // OFFSET: 0x00B8E5F0 // FUNCTION: fn_19473 @@ -15,6 +21,12 @@ const char* CNavi_Link::GetName() const { } // OFFSET: 0x00B8E7D0 +// FUNCTION: fn_19483 +NaviCell* CNavi_Link::GetCell(NaviCell* out) const { + out->x = this->cellX; + out->y = this->cellY; + return out; +} // OFFSET: 0x00B8E830 // FUNCTION: fn_19487 @@ -35,3 +47,10 @@ int CNavi_Link::GetId() const { } // OFFSET: 0x00B8E8F0 +// FUNCTION: fn_19497 +CNaviInfo* CNavi_Link::GetInfo() const { + if (this->type == 400) { + return g_navigationManager.GetLinkedPlayerInfo(); + } + return this->info; +} diff --git a/Source/Contents/NavigationRequest.cpp b/Source/Contents/NavigationRequest.cpp index 76a3aac..df40627 100644 --- a/Source/Contents/NavigationRequest.cpp +++ b/Source/Contents/NavigationRequest.cpp @@ -69,5 +69,25 @@ CNaviInfo* CNavi_Object::GetInfo() const { } // OFFSET: 0x00B89940 +// FUNCTION: fn_19387 +bool CNaviData::SetDestination(CNaviInfo* info, int cellX, int cellY) { + if (info == nullptr) { + return false; + } + this->info = info; + this->cellX = cellX; + this->cellY = cellY; + return true; +} // OFFSET: 0x00BA1260 +// FUNCTION: fn_19638 +bool CNavigationManager::UpdateGround() { + CGameMode* mode = static_cast(g_world.ActiveGameMode()); + if (mode == nullptr || mode->scene == nullptr || mode->scene->terrain == nullptr) { + return false; + } + this->ground = mode->scene->ground; + this->pathFinder.attr = mode->scene->terrain; + return true; +} diff --git a/Source/Contents/NavigationSource.cpp b/Source/Contents/NavigationSource.cpp index 4ef8fc6..2ddb4d3 100644 --- a/Source/Contents/NavigationSource.cpp +++ b/Source/Contents/NavigationSource.cpp @@ -109,10 +109,66 @@ int CNavigationManager::SaveCurrentTarget() { } // OFFSET: 0x00B880D0 +// FUNCTION: fn_19364 +CNaviData::CNaviData() : info(nullptr), cellX(0), cellY(0), range(50000) { +} // OFFSET: 0x00B88530 +// FUNCTION: fn_19371 +CNaviData::~CNaviData() { + this->Clear(); + + for (CNavi_Object*& object : this->objects) { + if (object != nullptr) { + delete object; + } + object = nullptr; + } + this->objects.clear(); + + for (CNaviInfo*& info : this->destinations) { + if (info != nullptr) { + delete info; + } + info = nullptr; + } + this->destinations.clear(); +} // OFFSET: 0x00B8CC10 +// FUNCTION: fn_19429 +CNaviInfo::~CNaviInfo() { + this->index = 0; + this->type = 5001; + this->name.clear(); + this->title.clear(); + this->cellX = 0; + this->cellY = 0; + + for (CNavi_Object*& npc : this->npcs) { + if (npc != nullptr) { + delete npc; + } + npc = nullptr; + } + this->npcs.clear(); + + for (CNavi_Object*& mob : this->mobs) { + if (mob != nullptr) { + delete mob; + } + mob = nullptr; + } + this->mobs.clear(); + + for (CNavi_Link*& link : this->links) { + if (link != nullptr) { + delete link; + } + link = nullptr; + } + this->links.clear(); +} // INLINED NavigationTarget::~NavigationTarget() { @@ -124,13 +180,93 @@ NavigationTarget::~NavigationTarget() { } // OFFSET: 0x00B92580 +// FUNCTION: fn_19551 +CNavigationManager::CNavigationManager() { + this->viewIcon = 1; + this->unknown_127C = false; + this->unknown_127D = false; + this->unknown_127E = false; + this->unknown_1250 = -1; + this->unknown_124C = -1; + this->unknown_1248 = false; + this->unknown_1254 = false; + this->Reset(true); + this->pathFinder.useNodePool = true; + this->unknown_1244 = nullptr; + + char buffer[0x104]; + for (int i = 0; i < 8; ++i) { + std::memset(buffer, 0, sizeof(buffer)); + std::sprintf(buffer, "유저인터페이스\\navigation_interface3\\navi_grid%d_%d.tga", this->viewIcon, i); + this->labels[i].assign(buffer, std::strlen(buffer)); + } + + this->unknown_12B4 = false; +} // OFFSET: 0x00B92CA0 +// FUNCTION: fn_45448 +CNavigationManager::~CNavigationManager() { + this->Reset(true); + this->unknown_1244 = nullptr; +} // OFFSET: 0x00B959D0 +// FUNCTION: fn_19574 +void CNavigationManager::ClearRouteNodes() { + for (NaviRouteLine& line : this->routeLines) { + line.text.clear(); + } + this->routeLines.clear(); +} // OFFSET: 0x00B95A20 +// FUNCTION: fn_19575 +void CNavigationManager::ClearNodePaths() { + for (std::size_t i = 0; i < this->nodePaths.size(); ++i) { + this->nodePaths[i].clear(); + } + this->nodePaths.clear(); +} // OFFSET: 0x00B961A0 +// FUNCTION: fn_45452 +CNaviInfo* CNavigationManager::GetLinkedPlayerInfo() { + if (!this->unknown_1244->HasName(g_session.m_navigationPlayerMap)) { + this->unknown_1244 = this->FindObject(g_session.m_navigationPlayerMap); + } + return this->unknown_1244; +} // OFFSET: 0x00B96BA0 +// FUNCTION: fn_19593 +void CNavigationManager::Reset(bool clearAll) { + if (clearAll) { + this->ClearNodePaths(); + this->unknown_12C4 = -1; + this->unknown_12C8 = -1; + this->states.clear(); + } + + this->savedTarget = NavigationTarget(); + this->currentTarget = NavigationTarget(); + this->routeResult = 0; + this->nodes.clear(); + this->unknown_115C = false; + this->selectedNode = -1; + this->movementRoute.segment = 0; + this->unknown_117C = false; + this->ground = nullptr; + this->unknown_1258 = 0; + this->unknown_1260 = 0; + this->unknown_1264.clear(); + this->unknown_1280 = 0; + this->unknown_1284 = 0; + this->unknown_1288 = nullptr; + this->unknown_128C = -1; + this->unknown_1290 = -1; + this->cells.clear(); + this->unknown_12A0 = nullptr; + this->unknown_12A4 = nullptr; + this->ClearRouteNodes(); +}