From 7e69739e439d1af1d2a9d05b8d1377e465ce128b Mon Sep 17 00:00:00 2001 From: Emagi Date: Wed, 29 Jan 2025 15:13:26 -0500 Subject: [PATCH] allow LUA Functions for movement to use nav path --- source/WorldServer/LuaFunctions.cpp | 7 ++++-- source/WorldServer/NPC.cpp | 2 ++ source/WorldServer/Spawn.cpp | 39 +++++++++++++++++++---------- source/WorldServer/Spawn.h | 6 +++-- 4 files changed, 37 insertions(+), 17 deletions(-) diff --git a/source/WorldServer/LuaFunctions.cpp b/source/WorldServer/LuaFunctions.cpp index 06c03f3..38ecd91 100644 --- a/source/WorldServer/LuaFunctions.cpp +++ b/source/WorldServer/LuaFunctions.cpp @@ -1198,8 +1198,10 @@ int EQ2Emu_lua_MovementLoopAdd(lua_State* state) { int8 num_args = (int8)lua_interface->GetNumberOfArgs(state); float heading = lua_interface->GetFloatValue(state, 8); + bool exclude_heading = lua_interface->GetBooleanValue(state, 9); + bool use_nav_path = lua_interface->GetBooleanValue(state, 10); if (spawn) { - spawn->AddMovementLocation(x, y, z, speed, delay, function.c_str(), heading, (num_args > 7) ? true : false ); + spawn->AddMovementLocation(x, y, z, speed, delay, function.c_str(), heading, (num_args > 7 && !exclude_heading) ? true : false, use_nav_path); spawn->GetZone()->AddMovementNPC(spawn); } lua_interface->ResetFunctionStack(state); @@ -1262,12 +1264,13 @@ int EQ2Emu_lua_MoveToLocation(lua_State* state) { float speed = lua_interface->GetFloatValue(state, 5); string lua_function = lua_interface->GetStringValue(state, 6); bool more_points = lua_interface->GetBooleanValue(state, 7); + bool use_nav_path = lua_interface->GetBooleanValue(state, 8); if (spawn) { if (speed == 0) speed = spawn->GetSpeed(); - spawn->AddRunningLocation(x, y, z, speed, 0.0f, true, !more_points, lua_function); + spawn->AddRunningLocation(x, y, z, speed, 0.0f, true, !more_points, lua_function, false, use_nav_path); } lua_interface->ResetFunctionStack(state); return 0; diff --git a/source/WorldServer/NPC.cpp b/source/WorldServer/NPC.cpp index 645019f..ad217c5 100644 --- a/source/WorldServer/NPC.cpp +++ b/source/WorldServer/NPC.cpp @@ -232,6 +232,8 @@ void NPC::SetRunbackLocation(float x, float y, float z, int32 gridid, bool set_h runback->gridid = gridid; runback->stage = 0; runback->reset_hp_on_runback = set_hp_runback; + runback->use_nav_path = false; + runback->mapped = false; } MovementLocation* NPC::GetRunbackLocation(){ diff --git a/source/WorldServer/Spawn.cpp b/source/WorldServer/Spawn.cpp index 211804e..591c31a 100644 --- a/source/WorldServer/Spawn.cpp +++ b/source/WorldServer/Spawn.cpp @@ -3217,12 +3217,13 @@ void Spawn::ProcessMovement(bool isSpawnListLocked){ data2 = movement_loop[tmp_index]; else data2 = movement_loop[0]; - AddRunningLocation(data->x, data->y, data->z, data->speed, 0, true, false, "", true); - AddRunningLocation(data2->x, data2->y, data2->z, data2->speed, 0, true, true, "", true); + + AddRunningLocation(data->x, data->y, data->z, data->speed, 0, true, false, "", true, data->use_nav_path); + AddRunningLocation(data2->x, data2->y, data2->z, data2->speed, 0, true, true, "", true, data2->use_nav_path); } // delay at target location, only need to set 1 location else - AddRunningLocation(data->x, data->y, data->z, data->speed); + AddRunningLocation(data->x, data->y, data->z, data->speed, 0, true, true, "", true, data->use_nav_path); } movement_start_time = 0; resume_movement = false; @@ -3299,13 +3300,13 @@ void Spawn::ProcessMovement(bool isSpawnListLocked){ else data2 = movement_loop[0]; // set the first location (adds it to movement_locations that we just cleared) - AddRunningLocation(data->x, data->y, data->z, data->speed, 0, true, false, "", true); + AddRunningLocation(data->x, data->y, data->z, data->speed, 0, true, false, "", true, data->use_nav_path); // set the location after that - AddRunningLocation(data2->x, data2->y, data2->z, data2->speed, 0, true, true, "", true); + AddRunningLocation(data2->x, data2->y, data2->z, data2->speed, 0, true, true, "", true, data2->use_nav_path); } // there is a delay at the next location so we only need to set it else { - AddRunningLocation(data->x, data->y, data->z, data->speed, 0, true, true, "", true); + AddRunningLocation(data->x, data->y, data->z, data->speed, 0, true, true, "", true, data->use_nav_path); } // reset this timer to 0 now that we are moving again @@ -3320,7 +3321,7 @@ void Spawn::ProcessMovement(bool isSpawnListLocked){ // not moving, have a target location but not at it yet else if (data) { SetSpeed(data->speed); - AddRunningLocation(data->x, data->y, data->z, data->speed); + AddRunningLocation(data->x, data->y, data->z, data->speed, 0, true, true, "", true, data->use_nav_path); } } MMovementLoop.releasewritelock(); @@ -3360,7 +3361,7 @@ void Spawn::ResetMovement(){ ValidateRunning(true, true); } -void Spawn::AddMovementLocation(float x, float y, float z, float speed, int16 delay, const char* lua_function, float heading, bool include_heading){ +void Spawn::AddMovementLocation(float x, float y, float z, float speed, int16 delay, const char* lua_function, float heading, bool include_heading, bool use_nav_path){ LogWrite(LUA__DEBUG, 5, "LUA", "AddMovementLocation: x: %.2f, y: %.2f, z: %.2f, speed: %.2f, delay: %i, lua: %s", x, y, z, speed, delay, string(lua_function).c_str()); @@ -3376,6 +3377,7 @@ void Spawn::AddMovementLocation(float x, float y, float z, float speed, int16 de data->heading = heading; data->use_movement_location_heading = include_heading; + data->use_nav_path = use_nav_path; MMovementLoop.lock(); movement_loop.push_back(data); MMovementLoop.unlock(); @@ -3476,7 +3478,7 @@ MovementLocation* Spawn::GetLastRunningLocation(){ return ret; } -void Spawn::AddRunningLocation(float x, float y, float z, float speed, float distance_away, bool attackable, bool finished_adding_locations, string lua_function, bool isMapped){ +void Spawn::AddRunningLocation(float x, float y, float z, float speed, float distance_away, bool attackable, bool finished_adding_locations, string lua_function, bool isMapped, bool useNavPath){ if(speed == 0) return; @@ -3511,6 +3513,7 @@ void Spawn::AddRunningLocation(float x, float y, float z, float speed, float dis data->lua_function = lua_function; data->gridid = 0; // used for runback defaults data->reset_hp_on_runback = false; + data->use_nav_path = useNavPath; MMovementLocations.lock_shared(); if(movement_locations->size() > 0) @@ -3714,11 +3717,21 @@ void Spawn::CalculateRunningLocation(bool stop){ MovementLocation* current_location = movement_locations->at(0); if (movement_locations->size() > 1) { MovementLocation* data = movement_locations->at(1); - RunToLocation(current_location->x, current_location->y, current_location->z, data->x, data->y, data->z); + if(current_location->use_nav_path) { + GetZone()->movementMgr->NavigateTo((Entity*)this, current_location->x, current_location->y, current_location->z); + } + else { + RunToLocation(current_location->x, current_location->y, current_location->z, data->x, data->y, data->z); + } + } + else { + if(current_location->use_nav_path) { + GetZone()->movementMgr->NavigateTo((Entity*)this, current_location->x, current_location->y, current_location->z); + } + else { + RunToLocation(current_location->x, current_location->y, current_location->z, 0, 0, 0); + } } - else - RunToLocation(current_location->x, current_location->y, current_location->z, 0, 0, 0); - continueElseIf = false; } } diff --git a/source/WorldServer/Spawn.h b/source/WorldServer/Spawn.h index 73b6ef5..492f69f 100644 --- a/source/WorldServer/Spawn.h +++ b/source/WorldServer/Spawn.h @@ -224,6 +224,7 @@ struct MovementData{ string lua_function; float heading; bool use_movement_location_heading; + bool use_nav_path; }; struct BasicInfoStruct{ @@ -265,6 +266,7 @@ struct MovementLocation{ int32 gridid; int8 stage; bool reset_hp_on_runback; + bool use_nav_path; }; struct SpawnUpdate { @@ -1142,7 +1144,7 @@ public: void InitializeFooterPacketData(Player* player, PacketStruct* packet); void MoveToLocation(Spawn* spawn, float distance, bool immediate = true, bool isMappedLocation = false); - void AddMovementLocation(float x, float y, float z, float speed, int16 delay, const char* lua_function, float heading, bool include_heading = false); + void AddMovementLocation(float x, float y, float z, float speed, int16 delay, const char* lua_function, float heading, bool include_heading = false, bool use_nav_path = false); void ProcessMovement(bool isSpawnListLocked=false); void ResetMovement(); bool ValidateRunning(bool lockMovementLocation, bool lockMovementLoop); @@ -1154,7 +1156,7 @@ public: MovementLocation* GetLastRunningLocation(); void NewWaypointChange(MovementLocation* data); bool CalculateChange(); - void AddRunningLocation(float x, float y, float z, float speed, float distance_away = 0, bool attackable = true, bool finished_adding_locations = true, string lua_function = "", bool isMapped=false); + void AddRunningLocation(float x, float y, float z, float speed, float distance_away = 0, bool attackable = true, bool finished_adding_locations = true, string lua_function = "", bool isMapped=false, bool useNavPath=false); bool RemoveRunningLocation(); void ClearRunningLocations();