diff --git a/world/login_server.cpp b/world/login_server.cpp index 97c9f5214..00a321953 100644 --- a/world/login_server.cpp +++ b/world/login_server.cpp @@ -306,6 +306,20 @@ void LoginServer::SendStatus() { delete pack; } +void LoginServer::SendPacket(ServerPacket *pack) +{ + if (IsLegacy) { + if (legacy_client) { + legacy_client->SendPacket(pack); + } + } + else { + if (client) { + client->SendPacket(pack); + } + } +} + void LoginServer::SendAccountUpdate(ServerPacket* pack) { ServerLSAccountUpdate_Struct* s = (ServerLSAccountUpdate_Struct *)pack->pBuffer; if (CanUpdate()) { @@ -315,3 +329,19 @@ void LoginServer::SendAccountUpdate(ServerPacket* pack) { SendPacket(pack); } } + +bool LoginServer::Connected() +{ + if (IsLegacy) { + if (legacy_client) { + return legacy_client->Connected(); + } + } + else { + if (client) { + return client->Connected(); + } + } + + return false; +} diff --git a/world/login_server.h b/world/login_server.h index 33fdac18c..03f80afe0 100644 --- a/world/login_server.h +++ b/world/login_server.h @@ -40,9 +40,9 @@ public: void SendNewInfo(); void SendStatus(); - void SendPacket(ServerPacket* pack) { if (IsLegacy) legacy_client->SendPacket(pack); else client->SendPacket(pack); } + void SendPacket(ServerPacket* pack); void SendAccountUpdate(ServerPacket* pack); - bool Connected() { return IsLegacy ? legacy_client->Connected() : client->Connected(); } + bool Connected(); bool MiniLogin() { return minilogin; } bool CanUpdate() { return CanAccountUpdate; } diff --git a/zone/mob_movement_manager.cpp b/zone/mob_movement_manager.cpp index 603dc2234..bdf75704f 100644 --- a/zone/mob_movement_manager.cpp +++ b/zone/mob_movement_manager.cpp @@ -735,7 +735,7 @@ void MobMovementManager::UpdatePathGround(Mob * who, float x, float y, float z, auto &ent = (*eiter); if (route.size() == 0) { - //handle stuck behavior + HandleStuckBehavior(who, x, y, z, mode); return; } @@ -782,13 +782,23 @@ void MobMovementManager::UpdatePathGround(Mob * who, float x, float y, float z, } } + PushStopMoving(ent.second); + if (stuck) { - //handle stuck + HandleStuckBehavior(who, x, y, z, mode); } } -void MobMovementManager::UpdatePathUnderwater(Mob * who, float x, float y, float z, MobMovementMode mode) +void MobMovementManager::UpdatePathUnderwater(Mob *who, float x, float y, float z, MobMovementMode mode) { + auto eiter = _impl->Entries.find(who); + auto &ent = (*eiter); + if (zone->watermap->InLiquid(who->GetPosition()) && zone->watermap->InLiquid(glm::vec3(x, y, z)) && zone->zonemap->CheckLoS(who->GetPosition(), glm::vec3(x, y, z))) { + PushSwimTo(ent.second, x, y, z, mode); + PushStopMoving(ent.second); + return; + } + auto partial = false; auto stuck = false; auto route = zone->pathing->FindRoute( @@ -796,13 +806,10 @@ void MobMovementManager::UpdatePathUnderwater(Mob * who, float x, float y, float glm::vec3(x, y, z), partial, stuck, - PathingWater | PathingLava | PathingVWater | PathingPortal | PathingPrefer); - - auto eiter = _impl->Entries.find(who); - auto &ent = (*eiter); + PathingNotDisabled ^ PathingZoneLine); if (route.size() == 0) { - //handle stuck behavior + HandleStuckBehavior(who, x, y, z, mode); return; } @@ -812,6 +819,30 @@ void MobMovementManager::UpdatePathUnderwater(Mob * who, float x, float y, float glm::vec3 previous_pos(who->GetX(), who->GetY(), who->GetZ()); bool first_node = true; + while (iter != route.end()) { + auto ¤t_node = (*iter); + + if (!zone->watermap->InLiquid(current_node.pos)) { + stuck = true; + + while (iter != route.end()) { + iter = route.erase(iter); + } + + break; + } + else { + iter++; + } + } + + if (route.size() == 0) { + HandleStuckBehavior(who, x, y, z, mode); + return; + } + + iter = route.begin(); + while (iter != route.end()) { auto ¤t_node = (*iter); @@ -840,17 +871,14 @@ void MobMovementManager::UpdatePathUnderwater(Mob * who, float x, float y, float CalculateHeadingAngleBetweenPositions(current_node.pos.x, current_node.pos.y, next_node.pos.x, next_node.pos.y)); } else { - if (zone->watermap->InLiquid(previous_pos)) { - PushSwimTo(ent.second, next_node.pos.x, next_node.pos.y, next_node.pos.z, mode); - } - else { - PushMoveTo(ent.second, next_node.pos.x, next_node.pos.y, next_node.pos.z, mode); - } + PushSwimTo(ent.second, next_node.pos.x, next_node.pos.y, next_node.pos.z, mode); } } + PushStopMoving(ent.second); + if (stuck) { - //handle stuck + HandleStuckBehavior(who, x, y, z, mode); } } @@ -904,3 +932,7 @@ void MobMovementManager::PushStopMoving(MobMovementEntry &ent) { ent.Commands.push_back(std::unique_ptr(new StopMovingCommand())); } + +void MobMovementManager::HandleStuckBehavior(Mob * who, float x, float y, float z, MobMovementMode mode) +{ +} diff --git a/zone/mob_movement_manager.h b/zone/mob_movement_manager.h index 57cbfe4e1..8966aa24b 100644 --- a/zone/mob_movement_manager.h +++ b/zone/mob_movement_manager.h @@ -66,6 +66,7 @@ private: void PushSwimTo(MobMovementEntry &ent, float x, float y, float z, MobMovementMode mode); void PushRotateTo(MobMovementEntry &ent, Mob *who, float to, MobMovementMode mode); void PushStopMoving(MobMovementEntry &ent); + void HandleStuckBehavior(Mob *who, float x, float y, float z, MobMovementMode mode); struct Implementation; std::unique_ptr _impl;