From cc0c5afd00667007e16000142181cb0594375cb9 Mon Sep 17 00:00:00 2001 From: hg <4683435+hgtw@users.noreply.github.com> Date: Sat, 16 May 2020 10:44:12 -0400 Subject: [PATCH] Add alternative CreateExpedition api This allows expedition creation to be passed via Lua tables This also allows for compass, safereturn, and/or zone in location data of dynamic zones to be set on expedition creation from lua api Usage example: local instance_info = { "anguish", 0, 21600, compass = { 300, 1353.15, 1712.19, 109.001 }, safereturn = { 300, 1349.13, 1715.00, 123.81, 0 }, zonein = { -9, -2466, -79, 0 } } local expedition_info = { "Anguish, the Fallen Palace", 6, 54, true } local dz = e.other:CreateExpedition(instance_info, expedition_info) --- zone/client.cpp | 5 ++++ zone/client.h | 1 + zone/lua_client.cpp | 73 +++++++++++++++++++++++++++++++++++++++++++++ zone/lua_client.h | 1 + 4 files changed, 80 insertions(+) diff --git a/zone/client.cpp b/zone/client.cpp index 5621d344a..242f57fbe 100644 --- a/zone/client.cpp +++ b/zone/client.cpp @@ -9584,6 +9584,11 @@ void Client::UpdateExpeditionInfoAndLockouts() LoadAllExpeditionLockouts(); } +Expedition* Client::CreateExpedition(DynamicZone& dz_instance, ExpeditionRequest& request) +{ + return Expedition::TryCreate(this, dz_instance, request); +} + Expedition* Client::CreateExpedition( std::string zone_name, uint32 version, uint32 duration, std::string expedition_name, uint32 min_players, uint32 max_players, bool has_replay_timer, bool disable_messages) diff --git a/zone/client.h b/zone/client.h index b08b21a83..b4d52d228 100644 --- a/zone/client.h +++ b/zone/client.h @@ -1116,6 +1116,7 @@ public: void AddExpeditionLockout(const ExpeditionLockoutTimer& lockout, bool update_db = false, bool update_client = true); void AddNewExpeditionLockout(const std::string& expedition_name, const std::string& event_name, uint32_t duration); + Expedition* CreateExpedition(DynamicZone& dz_instance, ExpeditionRequest& request); Expedition* CreateExpedition( std::string zone_name, uint32 version, uint32 duration, std::string expedition_name, uint32 min_players, uint32 max_players, bool has_replay_timer = false, bool disable_messages = false); diff --git a/zone/lua_client.cpp b/zone/lua_client.cpp index e55658d24..8ed8142ad 100644 --- a/zone/lua_client.cpp +++ b/zone/lua_client.cpp @@ -5,6 +5,7 @@ #include "client.h" #include "expedition_lockout_timer.h" +#include "expedition_request.h" #include "lua_client.h" #include "lua_expedition.h" #include "lua_npc.h" @@ -1646,6 +1647,77 @@ int Lua_Client::GetClientMaxLevel() { return self->GetClientMaxLevel(); } +Lua_Expedition Lua_Client::CreateExpedition(luabind::object dz_info, luabind::object expedition_info) { + Lua_Safe_Call_Class(Lua_Expedition); + + if (luabind::type(dz_info) != LUA_TTABLE || luabind::type(expedition_info) != LUA_TTABLE) + { + return nullptr; + } + + // luabind will catch thrown cast_failed exceptions for invalid args, we + // shouldn't need to validate here unless we want non-ambiguous quest errors + std::string zone_name = luabind::object_cast(dz_info[1]); + uint32_t zone_version = luabind::object_cast(dz_info[2]); + uint32_t zone_duration = luabind::object_cast(dz_info[3]); + + DynamicZone dz{ zone_name, zone_version, zone_duration, DynamicZoneType::Expedition }; + + // the dz_info table supports optional hash entries for 'compass', 'safereturn', and 'zonein' data + if (luabind::type(dz_info["compass"]) == LUA_TTABLE) + { + dz.SetCompass(DynamicZoneLocation{ + luabind::object_cast(dz_info["compass"][1]), + luabind::object_cast(dz_info["compass"][2]), + luabind::object_cast(dz_info["compass"][3]), + luabind::object_cast(dz_info["compass"][4]), + 0 + }); + } + + if (luabind::type(dz_info["safereturn"]) == LUA_TTABLE) + { + dz.SetSafeReturn(DynamicZoneLocation{ + luabind::object_cast(dz_info["safereturn"][1]), + luabind::object_cast(dz_info["safereturn"][2]), + luabind::object_cast(dz_info["safereturn"][3]), + luabind::object_cast(dz_info["safereturn"][4]), + luabind::object_cast(dz_info["safereturn"][5]) + }); + } + + if (luabind::type(dz_info["zonein"]) == LUA_TTABLE) + { + dz.SetZoneInLocation(DynamicZoneLocation{ + 0, + luabind::object_cast(dz_info["zonein"][1]), + luabind::object_cast(dz_info["zonein"][2]), + luabind::object_cast(dz_info["zonein"][3]), + luabind::object_cast(dz_info["zonein"][4]) + }); + } + + std::string expedition_name = luabind::object_cast(expedition_info[1]); + uint32_t min_players = luabind::object_cast(expedition_info[2]); + uint32_t max_players = luabind::object_cast(expedition_info[3]); + bool has_replay_timer = false; + bool disable_messages = false; + + if (luabind::type(expedition_info[4]) == LUA_TBOOLEAN) + { + has_replay_timer = luabind::object_cast(expedition_info[4]); + } + + if (luabind::type(expedition_info[5]) == LUA_TBOOLEAN) + { + disable_messages = luabind::object_cast(expedition_info[5]); + } + + ExpeditionRequest request{ expedition_name, min_players, max_players, has_replay_timer, disable_messages }; + + return self->CreateExpedition(dz, request); +} + Lua_Expedition Lua_Client::CreateExpedition(std::string zone_name, uint32 version, uint32 duration, std::string expedition_name, uint32 min_players, uint32 max_players) { Lua_Safe_Call_Class(Lua_Expedition); return self->CreateExpedition(zone_name, version, duration, expedition_name, min_players, max_players); @@ -2048,6 +2120,7 @@ luabind::scope lua_register_client() { .def("DisableAreaRegens", &Lua_Client::DisableAreaRegens) .def("SetClientMaxLevel", (void(Lua_Client::*)(int))&Lua_Client::SetClientMaxLevel) .def("GetClientMaxLevel", (int(Lua_Client::*)(void))&Lua_Client::GetClientMaxLevel) + .def("CreateExpedition", (Lua_Expedition(Lua_Client::*)(luabind::object, luabind::object))&Lua_Client::CreateExpedition) .def("CreateExpedition", (Lua_Expedition(Lua_Client::*)(std::string, uint32, uint32, std::string, uint32, uint32))&Lua_Client::CreateExpedition) .def("CreateExpedition", (Lua_Expedition(Lua_Client::*)(std::string, uint32, uint32, std::string, uint32, uint32, bool))&Lua_Client::CreateExpedition) .def("CreateExpedition", (Lua_Expedition(Lua_Client::*)(std::string, uint32, uint32, std::string, uint32, uint32, bool, bool))&Lua_Client::CreateExpedition) diff --git a/zone/lua_client.h b/zone/lua_client.h index e339ead7a..c2f80a6fa 100644 --- a/zone/lua_client.h +++ b/zone/lua_client.h @@ -339,6 +339,7 @@ public: void SetClientMaxLevel(int value); int GetClientMaxLevel(); + Lua_Expedition CreateExpedition(luabind::object dz_info, luabind::object expedition_info); Lua_Expedition CreateExpedition(std::string zone_name, uint32 version, uint32 duration, std::string expedition_name, uint32 min_players, uint32 max_players); Lua_Expedition CreateExpedition(std::string zone_name, uint32 version, uint32 duration, std::string expedition_name, uint32 min_players, uint32 max_players, bool has_replay_timer); Lua_Expedition CreateExpedition(std::string zone_name, uint32 version, uint32 duration, std::string expedition_name, uint32 min_players, uint32 max_players, bool has_replay_timer, bool disable_messages);