From 4e07b26cc7d5318b3c43fb029d425cf370fae660 Mon Sep 17 00:00:00 2001 From: Emagi Date: Thu, 5 Dec 2024 09:22:50 -0500 Subject: [PATCH] add LUA functions for player levels in an instance --- source/WorldServer/LuaFunctions.cpp | 50 +++++++++++++++++++++++++++- source/WorldServer/LuaFunctions.h | 5 +++ source/WorldServer/LuaInterface.cpp | 5 +++ source/WorldServer/WorldDatabase.cpp | 16 ++++++++- source/WorldServer/WorldDatabase.h | 1 + 5 files changed, 75 insertions(+), 2 deletions(-) diff --git a/source/WorldServer/LuaFunctions.cpp b/source/WorldServer/LuaFunctions.cpp index b5667e2..1695465 100644 --- a/source/WorldServer/LuaFunctions.cpp +++ b/source/WorldServer/LuaFunctions.cpp @@ -14413,4 +14413,52 @@ int EQ2Emu_lua_GetChoiceSpawnID(lua_State* state) { } lua_interface->SetInt32Value(state, spawn_id); return 1; -} \ No newline at end of file +} + +int EQ2Emu_lua_GetZonePlayerMinLevel(lua_State* state) { + ZoneServer* zone = lua_interface->GetZone(state); + lua_interface->ResetFunctionStack(state); + + int32 level = 0; + if (zone) { + level = zone->getGroupraidMinLevel(); + } + lua_interface->SetInt32Value(state, level); + return 1; +} + +int EQ2Emu_lua_GetZonePlayerMaxLevel(lua_State* state) { + ZoneServer* zone = lua_interface->GetZone(state); + lua_interface->ResetFunctionStack(state); + + int32 level = 0; + if (zone) { + level = zone->getGroupraidMaxLevel(); + } + lua_interface->SetInt32Value(state, level); + return 1; +} + +int EQ2Emu_lua_GetZonePlayerAvgLevel(lua_State* state) { + ZoneServer* zone = lua_interface->GetZone(state); + lua_interface->ResetFunctionStack(state); + + int32 level = 0; + if (zone) { + level = zone->getGroupraidAvgLevel(); + } + lua_interface->SetInt32Value(state, level); + return 1; +} + +int EQ2Emu_lua_GetZonePlayerFirstLevel(lua_State* state) { + ZoneServer* zone = lua_interface->GetZone(state); + lua_interface->ResetFunctionStack(state); + + int32 level = 0; + if (zone) { + level = zone->getGroupraidFirstLevel(); + } + lua_interface->SetInt32Value(state, level); + return 1; +} diff --git a/source/WorldServer/LuaFunctions.h b/source/WorldServer/LuaFunctions.h index 66606d7..d4c75f6 100644 --- a/source/WorldServer/LuaFunctions.h +++ b/source/WorldServer/LuaFunctions.h @@ -667,4 +667,9 @@ int EQ2Emu_lua_CreatePersistedRespawn(lua_State* state); int EQ2Emu_lua_CreateChoiceWindow(lua_State* state); int EQ2Emu_lua_ClearChoice(lua_State* state); int EQ2Emu_lua_GetChoiceSpawnID(lua_State* state); + +int EQ2Emu_lua_GetZonePlayerMinLevel(lua_State* state); +int EQ2Emu_lua_GetZonePlayerMaxLevel(lua_State* state); +int EQ2Emu_lua_GetZonePlayerAvgLevel(lua_State* state); +int EQ2Emu_lua_GetZonePlayerFirstLevel(lua_State* state); #endif \ No newline at end of file diff --git a/source/WorldServer/LuaInterface.cpp b/source/WorldServer/LuaInterface.cpp index af817e9..6a6ce70 100644 --- a/source/WorldServer/LuaInterface.cpp +++ b/source/WorldServer/LuaInterface.cpp @@ -1572,6 +1572,11 @@ void LuaInterface::RegisterFunctions(lua_State* state) { lua_register(state,"CreateChoiceWindow", EQ2Emu_lua_CreateChoiceWindow); lua_register(state,"ClearChoice", EQ2Emu_lua_ClearChoice); lua_register(state,"GetChoiceSpawnID", EQ2Emu_lua_GetChoiceSpawnID); + + lua_register(state,"GetZonePlayerMinLevel", EQ2Emu_lua_GetZonePlayerMinLevel); + lua_register(state,"GetZonePlayerMaxLevel", EQ2Emu_lua_GetZonePlayerMaxLevel); + lua_register(state,"GetZonePlayerAvgLevel", EQ2Emu_lua_GetZonePlayerAvgLevel); + lua_register(state,"GetZonePlayerFirstLevel", EQ2Emu_lua_GetZonePlayerFirstLevel); } void LuaInterface::LogError(const char* error, ...) { diff --git a/source/WorldServer/WorldDatabase.cpp b/source/WorldServer/WorldDatabase.cpp index 80d3269..e73d6be 100644 --- a/source/WorldServer/WorldDatabase.cpp +++ b/source/WorldServer/WorldDatabase.cpp @@ -3005,8 +3005,10 @@ void WorldDatabase::LoadZoneInfo(ZoneServer* zone, int32 minLevel, int32 maxLeve zone->SetupInstance(CreateNewInstance(zone->GetZoneID(), minLevel, maxLevel, avgLevel, firstLevel)); zone->setGroupRaidLevels(minLevel, maxLevel, avgLevel, firstLevel); } - else + else { zone->SetupInstance(zone->GetInstanceID()); + LoadZonePlayerLevels(zone); + } } zone->SetCanBind(atoul(row[23])); zone->SetCanGate(atoul(row[24])); @@ -3016,6 +3018,18 @@ void WorldDatabase::LoadZoneInfo(ZoneServer* zone, int32 minLevel, int32 maxLeve safe_delete_array(escaped); } + +void WorldDatabase::LoadZonePlayerLevels(ZoneServer* zone) { + Query query; + int32 ruleset_id; + MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT player_minlevel, player_maxlevel, player_avglevel, player_firstlevel FROM instances WHERE id = %u and zone_id = %u", zone->GetInstanceID(), zone->GetZoneID()); + if (result && mysql_num_rows(result) > 0) { + MYSQL_ROW row; + row = mysql_fetch_row(result); + zone->setGroupRaidLevels(atoul(row[0]), atoul(row[1]), atoul(row[2]), atoul(row[3])); + } +} + void WorldDatabase::LoadZoneInfo(ZoneInfo* zone_info) { Query query; int32 ruleset_id; diff --git a/source/WorldServer/WorldDatabase.h b/source/WorldServer/WorldDatabase.h index e572fd2..847ea0a 100644 --- a/source/WorldServer/WorldDatabase.h +++ b/source/WorldServer/WorldDatabase.h @@ -218,6 +218,7 @@ public: void LoadCharacterQuestProgress(Client* client); void LoadCharacterFriendsIgnoreList(Player* player); void LoadZoneInfo(ZoneServer* zone, int32 minLevel=0, int32 maxLevel=0, int32 avgLevel=0, int32 firstLevel=0); + void LoadZonePlayerLevels(ZoneServer* zone); void LoadZoneInfo(ZoneInfo* zone_info); int32 GetZoneID(const char* name); void SaveZoneInfo(int32 zone_id, const char* field, sint32 value);