From 1d1ffc66fe1370467d2a24873730251ffe97657f Mon Sep 17 00:00:00 2001 From: Alex King <89047260+Kinglykrab@users.noreply.github.com> Date: Sat, 26 Nov 2022 10:11:40 -0500 Subject: [PATCH] [Quest API] Add Proximity Range Methods to Perl/Lua. (#2572) # Perl - Add `quest::set_proximity_range(x_range, y_range)`. - Add `quest::set_proximity_range(x_range, y_range, z_range)`. - Add `quest::set_proximity_range(x_range, y_range, z_range, enable_say)`. # Lua - Add `eq.set_proximity_range(x_range, y_range)`. - Add `eq.set_proximity_range(x_range, y_range, z_range)`. - Add `eq.set_proximity_range(x_range, y_range, z_range, enable_say)`. # Notes - Allows a shorthand for setting proximities. - Automatically uses NPC's current location versus having to provide it. --- zone/embparser_api.cpp | 22 +++++++++++++++++++-- zone/lua_general.cpp | 22 +++++++++++++++++++-- zone/questmgr.cpp | 43 ++++++++++++++++++++++++++++++++---------- zone/questmgr.h | 3 ++- 4 files changed, 75 insertions(+), 15 deletions(-) diff --git a/zone/embparser_api.cpp b/zone/embparser_api.cpp index a29a44c59..cf3852332 100644 --- a/zone/embparser_api.cpp +++ b/zone/embparser_api.cpp @@ -861,9 +861,9 @@ void Perl__set_proximity(float min_x, float max_x, float min_y, float max_y, flo quest_manager.set_proximity(min_x, max_x, min_y, max_y, min_z, max_z); } -void Perl__set_proximity(float min_x, float max_x, float min_y, float max_y, float min_z, float max_z, bool say) +void Perl__set_proximity(float min_x, float max_x, float min_y, float max_y, float min_z, float max_z, bool enable_say) { - quest_manager.set_proximity(min_x, max_x, min_y, max_y, min_z, max_z, say); + quest_manager.set_proximity(min_x, max_x, min_y, max_y, min_z, max_z, enable_say); } void Perl__clear_proximity() @@ -3867,6 +3867,21 @@ void Perl__sethotzone(bool is_hotzone) zone->SetIsHotzone(is_hotzone); } +void Perl__set_proximity_range(float x_range, float y_range) +{ + quest_manager.set_proximity_range(x_range, y_range); +} + +void Perl__set_proximity_range(float x_range, float y_range, float z_range) +{ + quest_manager.set_proximity_range(x_range, y_range, z_range); +} + +void Perl__set_proximity_range(float x_range, float y_range, float z_range, bool enable_say) +{ + quest_manager.set_proximity_range(x_range, y_range, z_range, enable_say); +} + void perl_register_quest() { perl::interpreter perl(PERL_GET_THX); @@ -4396,6 +4411,9 @@ void perl_register_quest() package.add("set_proximity", (void(*)(float, float, float, float))&Perl__set_proximity); package.add("set_proximity", (void(*)(float, float, float, float, float, float))&Perl__set_proximity); package.add("set_proximity", (void(*)(float, float, float, float, float, float, bool))&Perl__set_proximity); + package.add("set_proximity_range", (void(*)(float, float))&Perl__set_proximity_range); + package.add("set_proximity_range", (void(*)(float, float, float))&Perl__set_proximity_range); + package.add("set_proximity_range", (void(*)(float, float, float, bool))&Perl__set_proximity_range); package.add("set_zone_flag", &Perl__set_zone_flag); package.add("setallskill", &Perl__setallskill); package.add("setanim", &Perl__setanim); diff --git a/zone/lua_general.cpp b/zone/lua_general.cpp index da72efe2e..11eb12234 100644 --- a/zone/lua_general.cpp +++ b/zone/lua_general.cpp @@ -542,8 +542,8 @@ void lua_set_proximity(float min_x, float max_x, float min_y, float max_y, float quest_manager.set_proximity(min_x, max_x, min_y, max_y, min_z, max_z); } -void lua_set_proximity(float min_x, float max_x, float min_y, float max_y, float min_z, float max_z, bool say) { - quest_manager.set_proximity(min_x, max_x, min_y, max_y, min_z, max_z, say); +void lua_set_proximity(float min_x, float max_x, float min_y, float max_y, float min_z, float max_z, bool enable_say) { + quest_manager.set_proximity(min_x, max_x, min_y, max_y, min_z, max_z, enable_say); } void lua_clear_proximity() { @@ -3579,6 +3579,21 @@ void lua_set_hotzone(bool is_hotzone) zone->SetIsHotzone(is_hotzone); } +void lua_set_proximity_range(float x_range, float y_range) +{ + quest_manager.set_proximity_range(x_range, y_range); +} + +void lua_set_proximity_range(float x_range, float y_range, float z_range) +{ + quest_manager.set_proximity_range(x_range, y_range, z_range); +} + +void lua_set_proximity_range(float x_range, float y_range, float z_range, bool enable_say) +{ + quest_manager.set_proximity_range(x_range, y_range, z_range, enable_say); +} + #define LuaCreateNPCParse(name, c_type, default_value) do { \ cur = table[#name]; \ if(luabind::type(cur) != LUA_TNIL) { \ @@ -3847,6 +3862,9 @@ luabind::scope lua_register_general() { luabind::def("set_proximity", (void(*)(float,float,float,float))&lua_set_proximity), luabind::def("set_proximity", (void(*)(float,float,float,float,float,float))&lua_set_proximity), luabind::def("set_proximity", (void(*)(float,float,float,float,float,float,bool))&lua_set_proximity), + luabind::def("set_proximity_range", (void(*)(float,float))&lua_set_proximity_range), + luabind::def("set_proximity_range", (void(*)(float,float,float))&lua_set_proximity_range), + luabind::def("set_proximity_range", (void(*)(float,float,float,bool))&lua_set_proximity_range), luabind::def("clear_proximity", &lua_clear_proximity), luabind::def("enable_proximity_say", &lua_enable_proximity_say), luabind::def("disable_proximity_say", &lua_disable_proximity_say), diff --git a/zone/questmgr.cpp b/zone/questmgr.cpp index 733f67a87..66e0800ba 100644 --- a/zone/questmgr.cpp +++ b/zone/questmgr.cpp @@ -1821,23 +1821,46 @@ void QuestManager::respawn(int npcTypeID, int grid) { } } -void QuestManager::set_proximity(float minx, float maxx, float miny, float maxy, float minz, float maxz, bool bSay) +void QuestManager::set_proximity_range(float x_range, float y_range, float z_range, bool enable_say) { QuestManagerCurrentQuestVars(); if (!owner || !owner->IsNPC()) { return; } - entity_list.AddProximity(owner->CastToNPC()); + auto n = owner->CastToNPC(); - owner->CastToNPC()->proximity->min_x = minx; - owner->CastToNPC()->proximity->max_x = maxx; - owner->CastToNPC()->proximity->min_y = miny; - owner->CastToNPC()->proximity->max_y = maxy; - owner->CastToNPC()->proximity->min_z = minz; - owner->CastToNPC()->proximity->max_z = maxz; - owner->CastToNPC()->proximity->say = bSay; - owner->CastToNPC()->proximity->proximity_set = true; + entity_list.AddProximity(n); + + n->proximity->min_x = n->GetX() - x_range; + n->proximity->max_x = n->GetX() + x_range; + n->proximity->min_y = n->GetY() - y_range; + n->proximity->max_y = n->GetY() + y_range; + n->proximity->min_z = n->GetZ() - z_range; + n->proximity->max_z = n->GetZ() + z_range; + n->proximity->say = enable_say; + n->proximity->proximity_set = true; +} + +void QuestManager::set_proximity(float min_x, float max_x, float min_y, float max_y, float min_z, float max_z, bool enable_say) +{ + QuestManagerCurrentQuestVars(); + if (!owner || !owner->IsNPC()) { + return; + } + + auto n = owner->CastToNPC(); + + entity_list.AddProximity(n); + + n->proximity->min_x = min_x; + n->proximity->max_x = max_x; + n->proximity->min_y = min_y; + n->proximity->max_y = max_y; + n->proximity->min_z = min_z; + n->proximity->max_z = max_z; + n->proximity->say = enable_say; + n->proximity->proximity_set = true; } void QuestManager::clear_proximity() { diff --git a/zone/questmgr.h b/zone/questmgr.h index 25da9de8b..ef951a76e 100644 --- a/zone/questmgr.h +++ b/zone/questmgr.h @@ -177,7 +177,8 @@ public: void setnexthpevent(int at); void setnextinchpevent(int at); void respawn(int npc_type, int grid); - void set_proximity(float minx, float maxx, float miny, float maxy, float minz=-999999, float maxz=999999, bool bSay = false); + void set_proximity(float min_x, float max_x, float min_y, float max_y, float min_z = -999999.0f, float max_z = 999999.0f, bool enable_say = false); + void set_proximity_range(float x_range, float y_range, float z_range = 999999.0f, bool enable_say = false); void clear_proximity(); void enable_proximity_say(); void disable_proximity_say();