diff --git a/zone/waypoints.cpp b/zone/waypoints.cpp index d767ca3c3..8181fe4a2 100644 --- a/zone/waypoints.cpp +++ b/zone/waypoints.cpp @@ -752,55 +752,55 @@ float Mob::GetFixedZ(glm::vec3 dest, int32 z_find_offset) timer.reset(); float new_z = dest.z; - if (zone->HasMap() && RuleB(Map, FixZWhenMoving) && - (flymode != 1 && flymode != 2)) - { - if (!RuleB(Watermap, CheckForWaterWhenMoving) || !zone->HasWaterMap() - || (zone->HasWaterMap() && - !zone->watermap->InWater(glm::vec3(m_Position)))) - { - /* Any more than 5 in the offset makes NPC's hop/snap to ceiling in small corridors */ - new_z = this->FindDestGroundZ(dest, z_find_offset); - if (new_z != BEST_Z_INVALID) - { - new_z += this->GetZOffset(); + if (zone->HasMap() && RuleB(Map, FixZWhenMoving)) { - // If bad new Z restore old one - if (new_z < -2000) { - new_z = m_Position.z; - } + if (flymode == 1 || flymode == 2) + return new_z; + + if (this->IsBoat()) + return new_z; + + if (zone->HasWaterMap() && zone->watermap->InWater(glm::vec3(m_Position))) + return new_z; + + /* + * Any more than 5 in the offset makes NPC's hop/snap to ceiling in small corridors + */ + new_z = this->FindDestGroundZ(dest, z_find_offset); + if (new_z != BEST_Z_INVALID) { + new_z += this->GetZOffset(); + + if (new_z < -2000) { + new_z = m_Position.z; } } auto duration = timer.elapsed(); Log(Logs::Moderate, Logs::FixZ, - "Mob::GetFixedZ() (%s) returned %4.3f at %4.3f, %4.3f, %4.3f - Took %lf", - this->GetCleanName(), new_z, dest.x, dest.y, dest.z, duration); + "Mob::GetFixedZ() (%s) returned %4.3f at %4.3f, %4.3f, %4.3f - Took %lf", + this->GetCleanName(), new_z, dest.x, dest.y, dest.z, duration); } return new_z; } -void Mob::FixZ(int32 z_find_offset /*= 5*/) -{ +void Mob::FixZ(int32 z_find_offset /*= 5*/) { glm::vec3 current_loc(m_Position); - float new_z = GetFixedZ(current_loc, z_find_offset); + float new_z = GetFixedZ(current_loc, z_find_offset); - if (!IsClient() && new_z != m_Position.z) - { + if (!IsClient() && new_z != m_Position.z) { if ((new_z > -2000) && new_z != BEST_Z_INVALID) { if (RuleB(Map, MobZVisualDebug)) this->SendAppearanceEffect(78, 0, 0, 0, 0); m_Position.z = new_z; - } - else { + } else { if (RuleB(Map, MobZVisualDebug)) this->SendAppearanceEffect(103, 0, 0, 0, 0); Log(Logs::General, Logs::FixZ, "%s is failing to find Z %f", - this->GetCleanName(), std::abs(m_Position.z - new_z)); + this->GetCleanName(), std::abs(m_Position.z - new_z)); } } }