From a4c171cb1d601325d31ab728f44caf2287197bcb Mon Sep 17 00:00:00 2001 From: Noudess Date: Fri, 15 Mar 2019 10:28:23 -0400 Subject: [PATCH 1/3] Fix issue with roambox wait time after switch to navmesh. --- zone/mob_ai.cpp | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/zone/mob_ai.cpp b/zone/mob_ai.cpp index 5a31cc12b..907a47e3c 100644 --- a/zone/mob_ai.cpp +++ b/zone/mob_ai.cpp @@ -38,6 +38,8 @@ #include #include +#define ROAMBOX_MOVE_IN_PROGESS (666) + extern EntityList entity_list; extern FastMath g_Math; @@ -1572,9 +1574,21 @@ void NPC::AI_DoMovement() { /** * Roambox logic sets precedence */ + if (roambox_distance > 0) { - if (!IsMoving()) { + // Check if we're already moving to a WP + // If so, if we're not moving we have arrived and need to set delay + + if (GetCWP() == ROAMBOX_MOVE_IN_PROGESS && !IsMoving()) { + // We have arrived + time_until_can_move = Timer::GetCurrentTime() + RandomTimer(roambox_min_delay, roambox_delay); + SetCurrentWP(0); + return; + } + + // Set a new destination + if (!IsMoving() && time_until_can_move < Timer::GetCurrentTime()) { auto move_x = static_cast(zone->random.Real(-roambox_distance, roambox_distance)); auto move_y = static_cast(zone->random.Real(-roambox_distance, roambox_distance)); @@ -1642,12 +1656,10 @@ void NPC::AI_DoMovement() { roambox_min_y, roambox_max_y, roambox_destination_y); - } + Log(Logs::Detail, Logs::NPCRoamBox, "Dest Z is (%f)", roambox_destination_z); - NavigateTo(roambox_destination_x, roambox_destination_y, roambox_destination_z); - - if (m_Position.x == roambox_destination_x && m_Position.y == roambox_destination_y) { - time_until_can_move = Timer::GetCurrentTime() + RandomTimer(roambox_min_delay, roambox_delay); + SetCurrentWP(ROAMBOX_MOVE_IN_PROGESS); + NavigateTo(roambox_destination_x, roambox_destination_y, roambox_destination_z); } return; From 3d1dda888d1ba5e32906e868484f1021da118e2c Mon Sep 17 00:00:00 2001 From: Noudess Date: Mon, 25 Mar 2019 14:58:26 -0400 Subject: [PATCH 2/3] Use constants for waypoint values that are not actual waypoints --- zone/mob_ai.cpp | 15 ++++++++------- zone/waypoints.cpp | 9 ++++++--- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/zone/mob_ai.cpp b/zone/mob_ai.cpp index 907a47e3c..0ed475384 100644 --- a/zone/mob_ai.cpp +++ b/zone/mob_ai.cpp @@ -38,8 +38,6 @@ #include #include -#define ROAMBOX_MOVE_IN_PROGESS (666) - extern EntityList entity_list; extern FastMath g_Math; @@ -1574,13 +1572,14 @@ void NPC::AI_DoMovement() { /** * Roambox logic sets precedence */ + using EQEmu::waypoints::WaypointStatus; if (roambox_distance > 0) { // Check if we're already moving to a WP // If so, if we're not moving we have arrived and need to set delay - if (GetCWP() == ROAMBOX_MOVE_IN_PROGESS && !IsMoving()) { + if (GetCWP() == WaypointStatus::wpsRoamBoxPauseInProgress && !IsMoving()) { // We have arrived time_until_can_move = Timer::GetCurrentTime() + RandomTimer(roambox_min_delay, roambox_delay); SetCurrentWP(0); @@ -1658,7 +1657,7 @@ void NPC::AI_DoMovement() { roambox_destination_y); Log(Logs::Detail, Logs::NPCRoamBox, "Dest Z is (%f)", roambox_destination_z); - SetCurrentWP(ROAMBOX_MOVE_IN_PROGESS); + SetCurrentWP(WaypointStatus::wpsRoamBoxPauseInProgress); NavigateTo(roambox_destination_x, roambox_destination_y, roambox_destination_z); } @@ -1672,7 +1671,7 @@ void NPC::AI_DoMovement() { int32 gridno = CastToNPC()->GetGrid(); - if (gridno > 0 || cur_wp == -2) { + if (gridno > 0 || cur_wp == WaypointStatus::wpsQuestControlNoGrid) { if (pause_timer_complete == true) { // time to pause at wp is over AI_SetupNextWaypoint(); } // endif (pause_timer_complete==true) @@ -1704,7 +1703,7 @@ void NPC::AI_DoMovement() { // as that is where roamer is unset and we don't want // the next trip through to move again based on grid stuff. doMove = false; - if (cur_wp == -2) { + if (cur_wp == WaypointStatus::wpsQuestControlNoGrid) { AI_SetupNextWaypoint(); } @@ -1803,8 +1802,10 @@ void NPC::AI_SetupNextWaypoint() { pause_timer_complete = false; Log(Logs::Detail, Logs::Pathing, "We are departing waypoint %d.", cur_wp); + using EQEmu::waypoints::WaypointStatus; + //if we were under quest control (with no grid), we are done now.. - if (cur_wp == -2) { + if (cur_wp == WaypointStatus::wpsQuestControlNoGrid) { Log(Logs::Detail, Logs::Pathing, "Non-grid quest mob has reached its quest ordered waypoint. Leaving pathing mode."); roamer = false; cur_wp = 0; diff --git a/zone/waypoints.cpp b/zone/waypoints.cpp index cf79aae08..7a7ab917e 100644 --- a/zone/waypoints.cpp +++ b/zone/waypoints.cpp @@ -108,7 +108,7 @@ void NPC::ResumeWandering() { // we were paused by a quest AI_walking_timer->Disable(); SetGrid(0 - GetGrid()); - if (cur_wp == -1) + if (cur_wp == EQEmu::waypoints::WaypointStatus::wpsQuestControlGrid) { // got here by a MoveTo() cur_wp = save_wp; UpdateWaypoint(cur_wp); // have him head to last destination from here @@ -166,6 +166,9 @@ void NPC::PauseWandering(int pausetime) void NPC::MoveTo(const glm::vec4& position, bool saveguardspot) { // makes mob walk to specified location + + using EQEmu::waypoints::WaypointStatus; + if (IsNPC() && GetGrid() != 0) { // he is on a grid if (GetGrid() < 0) @@ -177,7 +180,7 @@ void NPC::MoveTo(const glm::vec4& position, bool saveguardspot) if (cur_wp >= 0) { // we've not already done a MoveTo() save_wp = cur_wp; // save the current waypoint - cur_wp = -1; // flag this move as quest controlled + cur_wp = WaypointStatus::wpsQuestControlGrid; } Log(Logs::Detail, Logs::AI, "MoveTo %s, pausing regular grid wandering. Grid %d, save_wp %d", to_string(static_cast(position)).c_str(), -GetGrid(), save_wp); } @@ -185,7 +188,7 @@ void NPC::MoveTo(const glm::vec4& position, bool saveguardspot) { // not on a grid roamer = true; save_wp = 0; - cur_wp = -2; // flag as quest controlled w/no grid + cur_wp = WaypointStatus::wpsQuestControlNoGrid; Log(Logs::Detail, Logs::AI, "MoveTo %s without a grid.", to_string(static_cast(position)).c_str()); } From 0852468b8827ebce67e3808e0bfee2f024f5cc1e Mon Sep 17 00:00:00 2001 From: Noudess Date: Mon, 25 Mar 2019 17:54:17 -0400 Subject: [PATCH 3/3] Add constants for waypoints --- common/emu_constants.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/common/emu_constants.h b/common/emu_constants.h index ee8fdfcee..72ddfa11b 100644 --- a/common/emu_constants.h +++ b/common/emu_constants.h @@ -307,6 +307,14 @@ namespace EQEmu } // namespace bug + namespace waypoints { + enum WaypointStatus : int { + wpsRoamBoxPauseInProgress = -3, + wpsQuestControlNoGrid = -2, + wpsQuestControlGrid = -1 + }; + } // waypoint_status behavior + } /*EQEmu*/ #endif /*COMMON_EMU_CONSTANTS_H*/