1
0

allow LUA Functions for movement to use nav path

This commit is contained in:
Emagi 2025-01-29 15:13:26 -05:00
parent 7098c1dbf3
commit 7e69739e43
4 changed files with 37 additions and 17 deletions

View File

@ -1198,8 +1198,10 @@ int EQ2Emu_lua_MovementLoopAdd(lua_State* state) {
int8 num_args = (int8)lua_interface->GetNumberOfArgs(state); int8 num_args = (int8)lua_interface->GetNumberOfArgs(state);
float heading = lua_interface->GetFloatValue(state, 8); 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) { 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); spawn->GetZone()->AddMovementNPC(spawn);
} }
lua_interface->ResetFunctionStack(state); lua_interface->ResetFunctionStack(state);
@ -1262,12 +1264,13 @@ int EQ2Emu_lua_MoveToLocation(lua_State* state) {
float speed = lua_interface->GetFloatValue(state, 5); float speed = lua_interface->GetFloatValue(state, 5);
string lua_function = lua_interface->GetStringValue(state, 6); string lua_function = lua_interface->GetStringValue(state, 6);
bool more_points = lua_interface->GetBooleanValue(state, 7); bool more_points = lua_interface->GetBooleanValue(state, 7);
bool use_nav_path = lua_interface->GetBooleanValue(state, 8);
if (spawn) { if (spawn) {
if (speed == 0) if (speed == 0)
speed = spawn->GetSpeed(); 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); lua_interface->ResetFunctionStack(state);
return 0; return 0;

View File

@ -232,6 +232,8 @@ void NPC::SetRunbackLocation(float x, float y, float z, int32 gridid, bool set_h
runback->gridid = gridid; runback->gridid = gridid;
runback->stage = 0; runback->stage = 0;
runback->reset_hp_on_runback = set_hp_runback; runback->reset_hp_on_runback = set_hp_runback;
runback->use_nav_path = false;
runback->mapped = false;
} }
MovementLocation* NPC::GetRunbackLocation(){ MovementLocation* NPC::GetRunbackLocation(){

View File

@ -3217,12 +3217,13 @@ void Spawn::ProcessMovement(bool isSpawnListLocked){
data2 = movement_loop[tmp_index]; data2 = movement_loop[tmp_index];
else else
data2 = movement_loop[0]; 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 // delay at target location, only need to set 1 location
else 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; movement_start_time = 0;
resume_movement = false; resume_movement = false;
@ -3299,13 +3300,13 @@ void Spawn::ProcessMovement(bool isSpawnListLocked){
else else
data2 = movement_loop[0]; data2 = movement_loop[0];
// set the first location (adds it to movement_locations that we just cleared) // 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 // 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 // there is a delay at the next location so we only need to set it
else { 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 // 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 // not moving, have a target location but not at it yet
else if (data) { else if (data) {
SetSpeed(data->speed); 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(); MMovementLoop.releasewritelock();
@ -3360,7 +3361,7 @@ void Spawn::ResetMovement(){
ValidateRunning(true, true); 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", 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()); 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->heading = heading;
data->use_movement_location_heading = include_heading; data->use_movement_location_heading = include_heading;
data->use_nav_path = use_nav_path;
MMovementLoop.lock(); MMovementLoop.lock();
movement_loop.push_back(data); movement_loop.push_back(data);
MMovementLoop.unlock(); MMovementLoop.unlock();
@ -3476,7 +3478,7 @@ MovementLocation* Spawn::GetLastRunningLocation(){
return ret; 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) if(speed == 0)
return; return;
@ -3511,6 +3513,7 @@ void Spawn::AddRunningLocation(float x, float y, float z, float speed, float dis
data->lua_function = lua_function; data->lua_function = lua_function;
data->gridid = 0; // used for runback defaults data->gridid = 0; // used for runback defaults
data->reset_hp_on_runback = false; data->reset_hp_on_runback = false;
data->use_nav_path = useNavPath;
MMovementLocations.lock_shared(); MMovementLocations.lock_shared();
if(movement_locations->size() > 0) if(movement_locations->size() > 0)
@ -3714,11 +3717,21 @@ void Spawn::CalculateRunningLocation(bool stop){
MovementLocation* current_location = movement_locations->at(0); MovementLocation* current_location = movement_locations->at(0);
if (movement_locations->size() > 1) { if (movement_locations->size() > 1) {
MovementLocation* data = movement_locations->at(1); MovementLocation* data = movement_locations->at(1);
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); RunToLocation(current_location->x, current_location->y, current_location->z, data->x, data->y, data->z);
} }
else }
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); RunToLocation(current_location->x, current_location->y, current_location->z, 0, 0, 0);
}
}
continueElseIf = false; continueElseIf = false;
} }
} }

View File

@ -224,6 +224,7 @@ struct MovementData{
string lua_function; string lua_function;
float heading; float heading;
bool use_movement_location_heading; bool use_movement_location_heading;
bool use_nav_path;
}; };
struct BasicInfoStruct{ struct BasicInfoStruct{
@ -265,6 +266,7 @@ struct MovementLocation{
int32 gridid; int32 gridid;
int8 stage; int8 stage;
bool reset_hp_on_runback; bool reset_hp_on_runback;
bool use_nav_path;
}; };
struct SpawnUpdate { struct SpawnUpdate {
@ -1142,7 +1144,7 @@ public:
void InitializeFooterPacketData(Player* player, PacketStruct* packet); void InitializeFooterPacketData(Player* player, PacketStruct* packet);
void MoveToLocation(Spawn* spawn, float distance, bool immediate = true, bool isMappedLocation = false); 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 ProcessMovement(bool isSpawnListLocked=false);
void ResetMovement(); void ResetMovement();
bool ValidateRunning(bool lockMovementLocation, bool lockMovementLoop); bool ValidateRunning(bool lockMovementLocation, bool lockMovementLoop);
@ -1154,7 +1156,7 @@ public:
MovementLocation* GetLastRunningLocation(); MovementLocation* GetLastRunningLocation();
void NewWaypointChange(MovementLocation* data); void NewWaypointChange(MovementLocation* data);
bool CalculateChange(); 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(); bool RemoveRunningLocation();
void ClearRunningLocations(); void ClearRunningLocations();