From 782f84e67e0b3d938e895282f06517097c274fe5 Mon Sep 17 00:00:00 2001 From: Emagi Date: Tue, 28 Jan 2025 09:52:44 -0500 Subject: [PATCH] smooth out pathing by not enforcing Y all the time, still need to do something about gaps in objects that cause spawns to fall through :-/ --- source/WorldServer/Spawn.cpp | 11 ++++++++--- .../WorldServer/Zone/mob_movement_manager.cpp | 18 +++++++++--------- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/source/WorldServer/Spawn.cpp b/source/WorldServer/Spawn.cpp index 67551b6..ef14d64 100644 --- a/source/WorldServer/Spawn.cpp +++ b/source/WorldServer/Spawn.cpp @@ -2112,7 +2112,10 @@ void Spawn::InitializePosPacketData(Player* player, PacketStruct* packet, bool b { m_GridMutex.writelock(__FUNCTION__, __LINE__); std::map::iterator itr = established_grid_id.find(version); - if ( itr == established_grid_id.end() || itr->second.npc_save || itr->second.timestamp <= (Timer::GetCurrentTime2())) + if (!EngagedInCombat() && player->GetMap() == GetMap()) { + new_y = GetY(); + } + else if ( itr == established_grid_id.end() || itr->second.npc_save || itr->second.timestamp <= (Timer::GetCurrentTime2())) { if(itr != established_grid_id.end() && itr->second.x == GetX() && itr->second.z == GetZ() && !itr->second.npc_save) { itr->second.timestamp = Timer::GetCurrentTime2()+100; @@ -3642,10 +3645,12 @@ bool Spawn::CalculateChange(){ else { SetX(nx + tar_vx, false); SetZ(nz + tar_vz, false); - if ( IsWidget() ) + if(IsWidget()) { SetY(ny + tar_vy, false, true); - else + } + else { SetY(ny + tar_vy, false); + } } int32 newGrid = GetLocation(); diff --git a/source/WorldServer/Zone/mob_movement_manager.cpp b/source/WorldServer/Zone/mob_movement_manager.cpp index 5f9a43e..842b157 100644 --- a/source/WorldServer/Zone/mob_movement_manager.cpp +++ b/source/WorldServer/Zone/mob_movement_manager.cpp @@ -324,9 +324,9 @@ public: glm::vec2 ndir = glm::normalize(dir); double distance_moved = frame_time * current_speed * 0.4f * 1.45f; - mob->SetX(m_move_to_x); - mob->SetZ(m_move_to_z); - mob->SetY(m_move_to_y); + mob->SetX(m_move_to_x, false); + mob->SetZ(m_move_to_z, false); + mob->SetY(m_move_to_y, true, true); if (distance_moved > len) { return true; } @@ -338,9 +338,9 @@ public: double start_y = m_move_to_y - m_total_v_dist; double y_at_pos = start_y + (m_total_v_dist * (total_distance_traveled / m_total_h_dist)); - mob->SetX(npos.x); - mob->SetZ(npos.y); - mob->SetY(y_at_pos); + mob->SetX(npos.x, false); + mob->SetZ(npos.y, false); + mob->SetY(y_at_pos, true, true); } return false; @@ -364,9 +364,9 @@ public: virtual bool Process(MobMovementManager* mob_movement_manager, Entity* mob) { - mob->SetX(m_teleport_to_x); - mob->SetZ(m_teleport_to_z); - mob->SetY(m_teleport_to_y); + mob->SetX(m_teleport_to_x, false); + mob->SetZ(m_teleport_to_z, false); + mob->SetY(m_teleport_to_y, true, true); mob->SetHeading(mob_movement_manager->FixHeading(m_teleport_to_heading)); //mob_movement_manager->SendCommandToClients(mob, 0.0, 0.0, 0.0, 0.0, 0, ClientRangeAny);