diff --git a/zone/mob_ai.cpp b/zone/mob_ai.cpp index 8f42ce438..134beee0a 100644 --- a/zone/mob_ai.cpp +++ b/zone/mob_ai.cpp @@ -957,7 +957,6 @@ void Mob::ProcessForcedMovement() // this flag won't be set if the mob can't be pushed (rooted etc) if (AI_movement_timer->Check()) { bool bPassed = true; - auto z_off = GetZOffset(); glm::vec3 normal; // no zone map = fucked @@ -965,42 +964,42 @@ void Mob::ProcessForcedMovement() // in front m_CollisionBox[0].x = m_Position.x + 3.0f * g_Math.FastSin(0.0f); m_CollisionBox[0].y = m_Position.y + 3.0f * g_Math.FastCos(0.0f); - m_CollisionBox[0].z = m_Position.z + z_off; + m_CollisionBox[0].z = m_Position.z; // 45 right front m_CollisionBox[1].x = m_Position.x + 3.0f * g_Math.FastSin(64.0f); m_CollisionBox[1].y = m_Position.y + 3.0f * g_Math.FastCos(64.0f); - m_CollisionBox[1].z = m_Position.z + z_off; + m_CollisionBox[1].z = m_Position.z; // to right m_CollisionBox[2].x = m_Position.x + 3.0f * g_Math.FastSin(128.0f); m_CollisionBox[2].y = m_Position.y + 3.0f * g_Math.FastCos(128.0f); - m_CollisionBox[2].z = m_Position.z + z_off; + m_CollisionBox[2].z = m_Position.z; // 45 right back m_CollisionBox[3].x = m_Position.x + 3.0f * g_Math.FastSin(192.0f); m_CollisionBox[3].y = m_Position.y + 3.0f * g_Math.FastCos(192.0f); - m_CollisionBox[3].z = m_Position.z + z_off; + m_CollisionBox[3].z = m_Position.z; // behind m_CollisionBox[4].x = m_Position.x + 3.0f * g_Math.FastSin(256.0f); m_CollisionBox[4].y = m_Position.y + 3.0f * g_Math.FastCos(256.0f); - m_CollisionBox[4].z = m_Position.z + z_off; + m_CollisionBox[4].z = m_Position.z; // 45 left back m_CollisionBox[5].x = m_Position.x + 3.0f * g_Math.FastSin(320.0f); m_CollisionBox[5].y = m_Position.y + 3.0f * g_Math.FastCos(320.0f); - m_CollisionBox[5].z = m_Position.z + z_off; + m_CollisionBox[5].z = m_Position.z; // to left m_CollisionBox[6].x = m_Position.x + 3.0f * g_Math.FastSin(384.0f); m_CollisionBox[6].y = m_Position.y + 3.0f * g_Math.FastCos(384.0f); - m_CollisionBox[6].z = m_Position.z + z_off; + m_CollisionBox[6].z = m_Position.z; // 45 left front m_CollisionBox[7].x = m_Position.x + 3.0f * g_Math.FastSin(448.0f); m_CollisionBox[7].y = m_Position.y + 3.0f * g_Math.FastCos(448.0f); - m_CollisionBox[7].z = m_Position.z + z_off; + m_CollisionBox[7].z = m_Position.z; // collision happened, need to move along the wall float distance = 0.0f, shortest = std::numeric_limits::infinity(); @@ -1024,6 +1023,8 @@ void Mob::ProcessForcedMovement() pLastChange = Timer::GetCurrentTime(); FixZ(); // so we teleport to the ground locally, we want the client to interpolate falling etc } else if (--ForcedMovement) { + if (normal.z < -0.15f) // prevent too much wall climbing. ex. OMM's room in anguish + normal.z = 0.0f; auto proj = glm::proj(static_cast(m_Delta), normal); m_Delta.x -= proj.x; m_Delta.y -= proj.y;