mirror of
https://github.com/EQEmu/Server.git
synced 2026-09-03 09:26:36 +00:00
[Bots] Line of Sight and Mez optimizations and cleanup (#4746)
* [Bots] Line of Sight and Mez optimizations and cleanup - Renames `Map:CheckForLoSCheat` to `Map:CheckForDoorLoSCheat` to better reflect what it does. - Renames `Map:RangeCheckForLoSCheat` to `Map:RangeCheckForDoorLoSCheat` to better reflect what it does. - Adds the rule `Pets:PetsRequireLoS` to determine whether or not commanded pet attacks require an addition layer of LoS checks for edge-cases. - Adds the rule `Bots:BotsRequireLoS` to determine whether or not bots require LoS to `^attack`, `^pull` and `^precombat`. - Adds the rule `Map:ZonesToCheckDoorCheat` to control what if any zones will be checked.. - Corrects, removes and adds LoS checks where necessary. - Improves door checking logic for locked or triggered doors that could be blocking LoS. - Cleans up false positives for door cheat checks. - Adds `drawbox` option to `#door` command. This will spawn points at the center and each corner of the door's "box". It will also spawn points at your and your target's location. - Improves Mez and AE Mez logic - Adds more details to the rule `Bots:EpicPetSpellName` * Remove leftover debugging * Change return to continue for GetFirstIncomingMobToMez checks * Move mez chance fail to beginning of cast process
This commit is contained in:
@@ -35,6 +35,9 @@
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include <glm/ext/matrix_transform.hpp>
|
||||
#include <numbers>
|
||||
|
||||
#define OPEN_DOOR 0x02
|
||||
#define CLOSE_DOOR 0x03
|
||||
#define OPEN_INVDOOR 0x03
|
||||
@@ -970,3 +973,68 @@ bool Doors::GetIsDoorBlacklisted()
|
||||
bool Doors::IsDoorBlacklisted() {
|
||||
return m_is_blacklisted_to_open;
|
||||
}
|
||||
|
||||
bool Doors::IsDoorBetween(glm::vec4 loc_a, glm::vec4 loc_c, uint16 door_size, float door_depth, bool draw_box) {
|
||||
glm::vec4 door_loc = GetPosition();
|
||||
float half_size = door_size * 0.5f;
|
||||
float half_depth = door_depth * 0.5f;
|
||||
float normalized_heading = std::fmod(door_loc.w, 512.0f);
|
||||
float heading_radians = normalized_heading * (std::numbers::pi / 256.0f);
|
||||
glm::mat4 door_rotation = glm::rotate(glm::mat4(1.0f), -heading_radians, glm::vec3(0.0f, 0.0f, 1.0f));
|
||||
glm::vec3 box_corner_one = glm::vec3(door_size, -half_depth, 0.0f);
|
||||
glm::vec3 box_corner_two = glm::vec3(-door_size, -half_depth, 0.0f);
|
||||
glm::vec3 box_corner_three = glm::vec3(-door_size, half_depth, 0.0f);
|
||||
glm::vec3 box_corner_four = glm::vec3(door_size, half_depth, 0.0f);
|
||||
glm::vec3 door_center_offset = glm::vec3(-(door_size * 0.75f), half_depth * 0.5f, 0.0f);
|
||||
glm::vec3 door_center = glm::vec3(door_loc) + glm::vec3(door_rotation * glm::vec4(door_center_offset, 1.0f));
|
||||
glm::mat4 transform = glm::translate(glm::mat4(1.0f), door_center) * door_rotation;
|
||||
|
||||
box_corner_one = glm::vec3(transform * glm::vec4(box_corner_one, 1.0f));
|
||||
box_corner_two = glm::vec3(transform * glm::vec4(box_corner_two, 1.0f));
|
||||
box_corner_three = glm::vec3(transform * glm::vec4(box_corner_three, 1.0f));
|
||||
box_corner_four = glm::vec3(transform * glm::vec4(box_corner_four, 1.0f));
|
||||
|
||||
if (draw_box) {
|
||||
NPC::SpawnZonePointNodeNPC("loc_a", loc_a);
|
||||
NPC::SpawnZonePointNodeNPC("door_anchor", door_loc);
|
||||
NPC::SpawnZonePointNodeNPC("loc_c", loc_c);
|
||||
NPC::SpawnZonePointNodeNPC("box_corner_one", glm::vec4(box_corner_one.x, box_corner_one.y, box_corner_one.z, 0));
|
||||
NPC::SpawnZonePointNodeNPC("box_corner_two", glm::vec4(box_corner_two.x, box_corner_two.y, box_corner_two.z, 0));
|
||||
NPC::SpawnZonePointNodeNPC("box_corner_three", glm::vec4(box_corner_three.x, box_corner_three.y, box_corner_three.z, 0));
|
||||
NPC::SpawnZonePointNodeNPC("box_corner_four", glm::vec4(box_corner_four.x, box_corner_four.y, box_corner_four.z, 0));
|
||||
NPC::SpawnZonePointNodeNPC("box_center", glm::vec4(door_center.x, door_center.y, door_center.z, 0));
|
||||
}
|
||||
|
||||
// Check if LoS intersects box
|
||||
auto intersects_box = [](const glm::vec3& a, const glm::vec3& b, const glm::vec3& p1, const glm::vec3& p2) {
|
||||
glm::vec3 ab = b - a;
|
||||
glm::vec3 p1p2 = p2 - p1;
|
||||
|
||||
glm::vec3 cross = glm::cross(ab, p1p2);
|
||||
float cross_magnitude_squared = glm::dot(cross, cross);
|
||||
|
||||
if (cross_magnitude_squared < 1e-6f) {
|
||||
return false; // Lines are parallel or coincident
|
||||
}
|
||||
|
||||
float t = glm::dot(glm::cross(p1 - a, p1p2), cross) / cross_magnitude_squared;
|
||||
float u = glm::dot(glm::cross(p1 - a, ab), cross) / cross_magnitude_squared;
|
||||
|
||||
return (t >= 0.0f && t <= 1.0f && u >= 0.0f && u <= 1.0f);
|
||||
};
|
||||
|
||||
// Check intersection with each edge of the door bounding box
|
||||
glm::vec3 loc_a_vec3(loc_a.x, loc_a.y, loc_a.z);
|
||||
glm::vec3 loc_c_vec3(loc_c.x, loc_c.y, loc_c.z);
|
||||
|
||||
if (
|
||||
intersects_box(loc_a_vec3, loc_c_vec3, box_corner_one, box_corner_two) ||
|
||||
intersects_box(loc_a_vec3, loc_c_vec3, box_corner_two, box_corner_three) ||
|
||||
intersects_box(loc_a_vec3, loc_c_vec3, box_corner_three, box_corner_four) ||
|
||||
intersects_box(loc_a_vec3, loc_c_vec3, box_corner_four, box_corner_one)
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user