From 373fb3f0e7588dcb72810e9577595ae56659f20d Mon Sep 17 00:00:00 2001 From: Akkadius Date: Sun, 19 Apr 2020 04:36:39 -0500 Subject: [PATCH] Decouple zone calls, cleanup logic --- common/database.cpp | 72 +++--------- common/database.h | 13 +- common/database_instances.cpp | 30 ----- world/CMakeLists.txt | 2 + world/adventure.cpp | 5 +- world/adventure_manager.cpp | 3 +- world/client.cpp | 79 +++++++------ world/clientlist.cpp | 25 ++-- world/console.cpp | 15 +-- world/console.old.cpp | 22 ++-- world/eql_config.cpp | 5 +- world/eqw.cpp | 2 +- world/main.cpp | 6 +- world/world_store.cpp | 132 +++++++++++++++++++++ world/world_store.h | 64 ++++++++++ world/worlddb.cpp | 38 +++++- world/zonelist.cpp | 5 +- world/zoneserver.cpp | 13 +- zone/aa.cpp | 1 + zone/api_service.cpp | 1 + zone/attack.cpp | 26 ++-- zone/bot.h | 13 +- zone/bot_command.cpp | 215 +++++++++++++++++----------------- zone/bot_database.cpp | 69 +++++------ zone/client.cpp | 9 +- zone/client.h | 1 + zone/client_packet.cpp | 8 +- zone/client_process.cpp | 5 +- zone/command.cpp | 40 +++---- zone/corpse.cpp | 28 ++--- zone/data_bucket.cpp | 3 +- zone/doors.cpp | 9 +- zone/effects.cpp | 3 +- zone/forage.cpp | 1 + zone/guild_mgr.cpp | 1 + zone/inventory.cpp | 39 +++--- zone/loottables.cpp | 1 + zone/main.cpp | 9 +- zone/mob_appearance.cpp | 3 +- zone/mod_functions_base.cpp | 1 + zone/npc.h | 3 +- zone/object.cpp | 1 + zone/petitions.h | 1 + zone/pets.cpp | 5 +- zone/quest.h | 1 + zone/questmgr.cpp | 25 ++-- zone/spawn2.cpp | 9 +- zone/spawngroup.cpp | 1 + zone/tasks.cpp | 1 + zone/tradeskills.cpp | 1 + zone/worldserver.cpp | 12 +- zone/zone.cpp | 10 +- zone/zone.h | 1 + zone/zone_store.cpp | 57 ++++++++- zone/zone_store.h | 14 ++- zone/zonedb.cpp | 3 +- zone/zoning.cpp | 10 +- 57 files changed, 705 insertions(+), 467 deletions(-) create mode 100644 world/world_store.cpp create mode 100644 world/world_store.h diff --git a/common/database.cpp b/common/database.cpp index a40dcfb72..ff52a196e 100644 --- a/common/database.cpp +++ b/common/database.cpp @@ -1082,50 +1082,6 @@ bool Database::GetZoneGraveyard(const uint32 graveyard_id, uint32* graveyard_zon return true; } -bool Database::LoadZoneNames() { - std::string query("SELECT zoneidnumber, short_name FROM zone"); - - auto results = QueryDatabase(query); - - if (!results.Success()) - { - return false; - } - - for (auto row= results.begin();row != results.end();++row) - { - uint32 zoneid = atoi(row[0]); - std::string zonename = row[1]; - zonename_array.insert(std::pair(zoneid,zonename)); - } - - return true; -} - -uint32 Database::GetZoneID(const char* zonename) { - - if (zonename == nullptr) - return 0; - - for (auto & iter : zonename_array) - if (strcasecmp(iter.second.c_str(), zonename) == 0) - return iter.first; - - return 0; -} - -const char* Database::GetZoneName(uint32 zoneID, bool ErrorUnknown) { - auto iter = zonename_array.find(zoneID); - - if (iter != zonename_array.end()) - return iter->second.c_str(); - - if (ErrorUnknown) - return "UNKNOWN"; - - return 0; -} - uint8 Database::GetPEQZone(uint32 zoneID, uint32 version){ std::string query = StringFormat("SELECT peqzone from zone where zoneidnumber='%i' AND (version=%i OR version=0) ORDER BY version DESC", zoneID, version); @@ -1342,29 +1298,31 @@ uint8 Database::GetServerType() { return atoi(row[0]); } -bool Database::MoveCharacterToZone(const char* charname, const char* zonename, uint32 zoneid) { - if(zonename == nullptr || strlen(zonename) == 0) - return false; +bool Database::MoveCharacterToZone(uint32 character_id, uint32 zone_id) +{ + std::string query = StringFormat( + "UPDATE `character_data` SET `zone_id` = %i, `x` = -1, `y` = -1, `z` = -1 WHERE `id` = %i", + zone_id, + character_id + ); - std::string query = StringFormat("UPDATE `character_data` SET `zone_id` = %i, `x` = -1, `y` = -1, `z` = -1 WHERE `name` = '%s'", zoneid, charname); auto results = QueryDatabase(query); if (!results.Success()) { return false; } - if (results.RowsAffected() == 0) - return false; - - return true; + return results.RowsAffected() != 0; } -bool Database::MoveCharacterToZone(const char* charname, const char* zonename) { - return MoveCharacterToZone(charname, zonename, GetZoneID(zonename)); -} +bool Database::MoveCharacterToZone(const char *charname, uint32 zone_id) +{ + std::string query = StringFormat( + "UPDATE `character_data` SET `zone_id` = %i, `x` = -1, `y` = -1, `z` = -1 WHERE `name` = '%s'", + zone_id, + charname + ); -bool Database::MoveCharacterToZone(uint32 iCharID, const char* iZonename) { - std::string query = StringFormat("UPDATE `character_data` SET `zone_id` = %i, `x` = -1, `y` = -1, `z` = -1 WHERE `id` = %i", GetZoneID(iZonename), iCharID); auto results = QueryDatabase(query); if (!results.Success()) { diff --git a/common/database.h b/common/database.h index 8a5a9abf1..579f9915f 100644 --- a/common/database.h +++ b/common/database.h @@ -108,9 +108,8 @@ public: bool AddToNameFilter(const char* name); bool CreateCharacter(uint32 account_id, char* name, uint16 gender, uint16 race, uint16 class_, uint8 str, uint8 sta, uint8 cha, uint8 dex, uint8 int_, uint8 agi, uint8 wis, uint8 face); bool DeleteCharacter(char* character_name); - bool MoveCharacterToZone(const char* charname, const char* zonename); - bool MoveCharacterToZone(const char* charname, const char* zonename,uint32 zoneid); - bool MoveCharacterToZone(uint32 iCharID, const char* iZonename); + bool MoveCharacterToZone(const char* charname, uint32 zone_id); + bool MoveCharacterToZone(uint32 character_id, uint32 zone_id); bool ReserveName(uint32 account_id, char* name); bool SaveCharacterCreate(uint32 character_id, uint32 account_id, PlayerProfile_Struct* pp); bool SetHackerFlag(const char* accountname, const char* charactername, const char* hacked); @@ -155,7 +154,6 @@ public: bool VerifyInstanceAlive(uint16 instance_id, uint32 char_id); bool VerifyZoneInstance(uint32 zone_id, uint16 instance_id); - uint16 GetInstanceID(const char* zone, uint32 charid, int16 version); uint16 GetInstanceID(uint32 zone, uint32 charid, int16 version); uint16 GetInstanceVersion(uint16 instance_id); uint32 GetTimeRemainingInstance(uint16 instance_id, bool &is_perma); @@ -243,16 +241,11 @@ public: /* General Queries */ bool GetSafePoints(const char* short_name, uint32 version, float* safe_x = 0, float* safe_y = 0, float* safe_z = 0, int16* minstatus = 0, uint8* minlevel = 0, char *flag_needed = nullptr); - bool GetSafePoints(uint32 zoneID, uint32 version, float* safe_x = 0, float* safe_y = 0, float* safe_z = 0, int16* minstatus = 0, uint8* minlevel = 0, char *flag_needed = nullptr) { return GetSafePoints(GetZoneName(zoneID), version, safe_x, safe_y, safe_z, minstatus, minlevel, flag_needed); } bool GetZoneGraveyard(const uint32 graveyard_id, uint32* graveyard_zoneid = 0, float* graveyard_x = 0, float* graveyard_y = 0, float* graveyard_z = 0, float* graveyard_heading = 0); bool GetZoneLongName(const char* short_name, char** long_name, char* file_name = 0, float* safe_x = 0, float* safe_y = 0, float* safe_z = 0, uint32* graveyard_id = 0, uint32* maxclients = 0); bool LoadPTimers(uint32 charid, PTimerList &into); - bool LoadZoneNames(); - - const char* GetZoneName(uint32 zone_id, bool ErrorUnknown = false); uint32 GetZoneGraveyardID(uint32 zone_id, uint32 version); - uint32 GetZoneID(const char* zonename); uint8 GetPEQZone(uint32 zoneID, uint32 version); uint8 GetRaceSkill(uint8 skillid, uint8 in_race); @@ -275,8 +268,6 @@ public: /* EQEmuLogSys */ void LoadLogSettings(EQEmuLogSys::LogSettings* log_settings); - std::map zonename_array; - private: Mutex Mvarcache; diff --git a/common/database_instances.cpp b/common/database_instances.cpp index 4e562cecb..3ded72f17 100644 --- a/common/database_instances.cpp +++ b/common/database_instances.cpp @@ -306,36 +306,6 @@ bool Database::VerifyZoneInstance(uint32 zone_id, uint16 instance_id) return true; } -uint16 Database::GetInstanceID(const char* zone, uint32 character_id, int16 version) { - - std::string query = StringFormat( - "SELECT " - "instance_list.id " - "FROM " - "instance_list, " - "instance_list_player " - "WHERE " - "instance_list.zone = %u " - "AND instance_list.version = %u " - "AND instance_list.id = instance_list_player.id " - "AND instance_list_player.charid = %u " - "LIMIT 1 ", - GetZoneID(zone), - version, - character_id - ); - auto results = QueryDatabase(query); - - if (!results.Success()) - return 0; - - if (results.RowCount() == 0) - return 0; - - auto row = results.begin(); - return atoi(row[0]); -} - uint16 Database::GetInstanceID(uint32 zone, uint32 character_id, int16 version) { if (!zone) diff --git a/world/CMakeLists.txt b/world/CMakeLists.txt index 9906b0cfc..ab14ed603 100644 --- a/world/CMakeLists.txt +++ b/world/CMakeLists.txt @@ -24,6 +24,7 @@ SET(world_sources world_console_connection.cpp world_server_command_handler.cpp worlddb.cpp + world_store.cpp zonelist.cpp zoneserver.cpp ) @@ -54,6 +55,7 @@ SET(world_headers world_tcp_connection.h world_server_command_handler.h worlddb.h + world_store.h zonelist.h zoneserver.h ) diff --git a/world/adventure.cpp b/world/adventure.cpp index 2a61baf65..153e20b18 100644 --- a/world/adventure.cpp +++ b/world/adventure.cpp @@ -11,6 +11,7 @@ #include "zonelist.h" #include "clientlist.h" #include "cliententry.h" +#include "world_store.h" extern ZSList zoneserver_list; extern ClientList client_list; @@ -143,7 +144,7 @@ bool Adventure::Process() bool Adventure::CreateInstance() { - uint32 zone_id = content_db.GetZoneID(adventure_template->zone); + uint32 zone_id = ZoneID(adventure_template->zone); if(!zone_id) { return false; @@ -362,7 +363,7 @@ void Adventure::Finished(AdventureWinStatus ws) afe.points = 0; } adventure_manager.AddFinishedEvent(afe); - + database.UpdateAdventureStatsEntry(database.GetCharacterID((*iter).c_str()), GetTemplate()->theme, (ws != AWS_Lose) ? true : false); } ++iter; diff --git a/world/adventure_manager.cpp b/world/adventure_manager.cpp index 21ad8a8e4..c379a06aa 100644 --- a/world/adventure_manager.cpp +++ b/world/adventure_manager.cpp @@ -10,6 +10,7 @@ #include "zonelist.h" #include "clientlist.h" #include "cliententry.h" +#include "world_store.h" #include #include @@ -771,7 +772,7 @@ void AdventureManager::PlayerClickedDoor(const char *player, int zone_id, int do sizeof(ServerPlayerClickedAdventureDoorReply_Struct)); ServerPlayerClickedAdventureDoorReply_Struct *sr = (ServerPlayerClickedAdventureDoorReply_Struct*)pack->pBuffer; strcpy(sr->player, player); - sr->zone_id = content_db.GetZoneID(t->zone); + sr->zone_id = ZoneID(t->zone); sr->instance_id = (*iter)->GetInstanceID(); sr->x = t->dest_x; sr->y = t->dest_y; diff --git a/world/client.cpp b/world/client.cpp index ebc01e03e..840d9f89a 100644 --- a/world/client.cpp +++ b/world/client.cpp @@ -46,6 +46,7 @@ #include "clientlist.h" #include "wguild_mgr.h" #include "sof_char_create_data.h" +#include "world_store.h" #include #include @@ -64,7 +65,7 @@ #include #include #else - + #ifdef FREEBSD //Timothy Whitman - January 7, 2003 #include #endif @@ -109,7 +110,7 @@ Client::Client(EQStreamInterface* ieqs) m_ClientVersion = eqs->ClientVersion(); m_ClientVersionBit = EQEmu::versions::ConvertClientVersionToClientVersionBit(m_ClientVersion); - + numclients++; } @@ -171,7 +172,7 @@ void Client::SendEnterWorld(std::string name) void Client::SendExpansionInfo() { auto outapp = new EQApplicationPacket(OP_ExpansionInfo, sizeof(ExpansionInfo_Struct)); ExpansionInfo_Struct *eis = (ExpansionInfo_Struct*)outapp->pBuffer; - + if (RuleB(World, UseClientBasedExpansionSettings)) { eis->Expansions = EQEmu::expansions::ConvertClientVersionToExpansionsMask(eqs->ClientVersion()); } @@ -430,7 +431,7 @@ bool Client::HandleSendLoginInfoPacket(const EQApplicationPacket *app) if (!is_player_zoning) { // Track who is in and who is out of the game char *inout= (char *) ""; - + if (cle->GetOnline() == CLE_Status::Never){ // Desktop -> Char Select inout = (char *) "In"; @@ -439,21 +440,21 @@ bool Client::HandleSendLoginInfoPacket(const EQApplicationPacket *app) // Game -> Char Select inout=(char *) "Out"; } - + // Always at Char select at this point. // Either from a fresh client launch or coming back from the game. // Exiting the game entirely does not come through here. // Could use a Logging Out Completely message somewhere. cle->SetOnline(CLE_Status::CharSelect); - + LogInfo("Account ({}) Logging({}) to character select :: LSID [{}] ", cle->AccountName(), inout, cle->LSID()); } else { cle->SetOnline(); } - + const WorldConfig *Config=WorldConfig::get(); - + if(Config->UpdateStats) { auto pack = new ServerPacket; pack->opcode = ServerOP_LSPlayerJoinWorld; @@ -466,10 +467,10 @@ bool Client::HandleSendLoginInfoPacket(const EQApplicationPacket *app) loginserverlist.SendPacket(pack); safe_delete(pack); } - + if (!is_player_zoning) SendGuildList(); - + SendLogServer(); SendApproveWorld(); SendEnterWorld(cle->name()); @@ -509,18 +510,18 @@ bool Client::HandleNameApprovalPacket(const EQApplicationPacket *app) outapp->size = 1; bool valid = false; - if(!database.CheckNameFilter(char_name)) { - valid = false; + if(!database.CheckNameFilter(char_name)) { + valid = false; } /* Name must begin with an upper-case letter. */ - else if (islower(char_name[0])) { - valid = false; - } - else if (database.ReserveName(GetAccountID(), char_name)) { - valid = true; + else if (islower(char_name[0])) { + valid = false; } - else { - valid = false; + else if (database.ReserveName(GetAccountID(), char_name)) { + valid = true; + } + else { + valid = false; } outapp->pBuffer[0] = valid? 1 : 0; @@ -690,7 +691,7 @@ bool Client::HandleCharacterCreatePacket(const EQApplicationPacket *app) { return true; } -bool Client::HandleEnterWorldPacket(const EQApplicationPacket *app) { +bool Client::HandleEnterWorldPacket(const EQApplicationPacket *app) { if (GetAccountID() == 0) { LogInfo("Enter world with no logged in account"); eqs->Close(); @@ -785,7 +786,7 @@ bool Client::HandleEnterWorldPacket(const EQApplicationPacket *app) { if (tutorial_enabled) { zone_id = RuleI(World, TutorialZoneID); - database.MoveCharacterToZone(charid, content_db.GetZoneName(zone_id)); + database.MoveCharacterToZone(charid, zone_id); } else { LogInfo("[{}] is trying to go to tutorial but are not allowed", char_name); @@ -796,9 +797,9 @@ bool Client::HandleEnterWorldPacket(const EQApplicationPacket *app) { } } - if (zone_id == 0 || !content_db.GetZoneName(zone_id)) { + if (zone_id == 0 || !ZoneName(zone_id)) { // This is to save people in an invalid zone, once it's removed from the DB - database.MoveCharacterToZone(charid, "arena"); + database.MoveCharacterToZone(charid, ZoneID("arena")); LogInfo("Zone not found in database zone_id=[{}], moveing char to arena character:[{}]", zone_id, char_name); } @@ -856,7 +857,7 @@ bool Client::HandleEnterWorldPacket(const EQApplicationPacket *app) { } QueuePacket(outapp); safe_delete(outapp); - + // set mailkey - used for duration of character session int MailKey = emu_random.Int(1, INT_MAX); @@ -1154,7 +1155,7 @@ void Client::EnterWorld(bool TryBootup) { else zone_server = zoneserver_list.FindByZoneID(zone_id); - const char *zone_name = content_db.GetZoneName(zone_id, true); + const char *zone_name = ZoneName(zone_id, true); if (zone_server) { if (false == enter_world_triggered) { //Drop any clients we own in other zones. @@ -1204,9 +1205,9 @@ void Client::EnterWorld(bool TryBootup) { LogInfo( "({}) [{}] [{}] (Zone ID [{}]: Instance ID: [{}]) ", char_name, - (seen_character_select ? "Zoning from character select" : "Zoning to"), - zone_name, - zone_id, + (seen_character_select ? "Zoning from character select" : "Zoning to"), + zone_name, + zone_id, instance_id ); @@ -1267,7 +1268,7 @@ void Client::Clearance(int8 response) return; } - const char* zonename = content_db.GetZoneName(zone_id); + const char* zonename = ZoneName(zone_id); if (zonename == 0) { LogInfo("zonename is nullptr in Client::Clearance!!"); TellClientZoneUnavailable(); @@ -1322,7 +1323,7 @@ void Client::Clearance(int8 response) void Client::TellClientZoneUnavailable() { auto outapp = new EQApplicationPacket(OP_ZoneUnavail, sizeof(ZoneUnavail_Struct)); ZoneUnavail_Struct* ua = (ZoneUnavail_Struct*)outapp->pBuffer; - const char* zonename = content_db.GetZoneName(zone_id); + const char* zonename = ZoneName(zone_id); if (zonename) strcpy(ua->zonename, zonename); QueuePacket(outapp); @@ -1502,7 +1503,7 @@ bool Client::OPCharCreate(char *name, CharCreate_Struct *cc) // strcpy(pp.servername, WorldConfig::get()->ShortName.c_str()); memset(pp.spell_book, 0xFF, (sizeof(uint32) * EQEmu::spells::SPELLBOOK_SIZE)); - + memset(pp.mem_spells, 0xFF, (sizeof(uint32) * EQEmu::spells::SPELL_GEM_COUNT)); for(i = 0; i < BUFF_COUNT; i++) @@ -1522,11 +1523,11 @@ bool Client::OPCharCreate(char *name, CharCreate_Struct *cc) else { LogInfo("Found 'TitaniumStartZoneID' rule setting: [{}]", RuleI(World, TitaniumStartZoneID)); if (RuleI(World, TitaniumStartZoneID) > 0) { /* if there's a startzone variable put them in there */ - + pp.zone_id = RuleI(World, TitaniumStartZoneID); cc->start_zone = pp.zone_id; } - } + } /* use normal starting zone logic to either get defaults, or if startzone was set, load that from the db table.*/ bool ValidStartZone = content_db.GetStartZone(&pp, cc, m_ClientVersionBit & EQEmu::versions::maskTitaniumAndEarlier); @@ -1568,7 +1569,7 @@ bool Client::OPCharCreate(char *name, CharCreate_Struct *cc) /* Overrides if we have the tutorial flag set! */ if (cc->tutorial && RuleB(World, EnableTutorialButton)) { pp.zone_id = RuleI(World, TutorialZoneID); - content_db.GetSafePoints(pp.zone_id, 0, &pp.x, &pp.y, &pp.z); + content_db.GetSafePoints(ZoneName(pp.zone_id), 0, &pp.x, &pp.y, &pp.z); } /* Will either be the same as home or tutorial if enabled. */ @@ -1581,11 +1582,11 @@ bool Client::OPCharCreate(char *name, CharCreate_Struct *cc) } Log(Logs::Detail, Logs::WorldServer, "Current location: %s (%d) %0.2f, %0.2f, %0.2f, %0.2f", - content_db.GetZoneName(pp.zone_id), pp.zone_id, pp.x, pp.y, pp.z, pp.heading); + ZoneName(pp.zone_id), pp.zone_id, pp.x, pp.y, pp.z, pp.heading); Log(Logs::Detail, Logs::WorldServer, "Bind location: %s (%d) %0.2f, %0.2f, %0.2f", - content_db.GetZoneName(pp.binds[0].zoneId), pp.binds[0].zoneId, pp.binds[0].x, pp.binds[0].y, pp.binds[0].z); + ZoneName(pp.binds[0].zoneId), pp.binds[0].zoneId, pp.binds[0].x, pp.binds[0].y, pp.binds[0].z); Log(Logs::Detail, Logs::WorldServer, "Home location: %s (%d) %0.2f, %0.2f, %0.2f", - content_db.GetZoneName(pp.binds[4].zoneId), pp.binds[4].zoneId, pp.binds[4].x, pp.binds[4].y, pp.binds[4].z); + ZoneName(pp.binds[4].zoneId), pp.binds[4].zoneId, pp.binds[4].x, pp.binds[4].y, pp.binds[4].z); /* Starting Items inventory */ content_db.SetStartingItems(&pp, &inv, pp.race, pp.class_, pp.deity, pp.zone_id, pp.name, GetAdmin()); @@ -2090,7 +2091,7 @@ bool Client::StoreCharacter( return false; } - const char *zone_name = content_db.GetZoneName(p_player_profile_struct->zone_id); + const char *zone_name = ZoneName(p_player_profile_struct->zone_id); if (zone_name == nullptr) { /* Zone not in the DB, something to prevent crash... */ strn0cpy(zone, "qeynos", 49); @@ -2134,4 +2135,4 @@ bool Client::StoreCharacter( } return true; -} \ No newline at end of file +} diff --git a/world/clientlist.cpp b/world/clientlist.cpp index b29af5a6b..0149b3b9f 100644 --- a/world/clientlist.cpp +++ b/world/clientlist.cpp @@ -33,6 +33,7 @@ #include "../common/event_sub.h" #include "web_interface.h" #include "wguild_mgr.h" +#include "world_store.h" #include extern WebInterfaceList web_interface; @@ -107,7 +108,7 @@ void ClientList::GetCLEIP(uint32 iIP) { iterator.Reset(); while(iterator.MoreElements()) { - countCLEIPs = iterator.GetData(); + countCLEIPs = iterator.GetData(); if ((countCLEIPs->GetIP() == iIP) && ((countCLEIPs->Admin() < (RuleI(World, ExemptMaxClientsStatus))) || (RuleI(World, ExemptMaxClientsStatus) < 0))) { // If the IP matches, and the connection admin status is below the exempt status, or exempt status is less than 0 (no-one is exempt) IPInstances++; // Increment the occurences of this IP address LogClientLogin("Account ID: [{}] Account Name: [{}] IP: [{}]", countCLEIPs->LSID(), countCLEIPs->LSName(), long2ip(countCLEIPs->GetIP()).c_str()); @@ -129,7 +130,7 @@ void ClientList::GetCLEIP(uint32 iIP) { if (IPInstances > (RuleI(World, MaxClientsPerIP))) { // If the number of connections exceeds the lower limit if (RuleB(World, MaxClientsSetByStatus)) { // If MaxClientsSetByStatus is set to True, override other IP Limit Rules LogClientLogin("Account ID: [{}] Account Name: [{}] IP: [{}] IP Instances: [{}] Max IP Instances: [{}]", countCLEIPs->LSID(), countCLEIPs->LSName(), long2ip(countCLEIPs->GetIP()).c_str(), IPInstances, countCLEIPs->Admin()); - if (IPInstances > countCLEIPs->Admin()) { // The IP Limit is set by the status of the account if status > MaxClientsPerIP + if (IPInstances > countCLEIPs->Admin()) { // The IP Limit is set by the status of the account if status > MaxClientsPerIP if(RuleB(World, IPLimitDisconnectAll)) { LogClientLogin("Disconnect: All accounts on IP [{}]", long2ip(countCLEIPs->GetIP()).c_str()); DisconnectByIP(iIP); @@ -142,7 +143,7 @@ void ClientList::GetCLEIP(uint32 iIP) { } } } else if ((countCLEIPs->Admin() < RuleI(World, AddMaxClientsStatus)) || (RuleI(World, AddMaxClientsStatus) < 0)) { // Else if the Admin status of the connection is not eligible for the higher limit, or there is no higher limit (AddMaxClientStatus < 0) - if(RuleB(World, IPLimitDisconnectAll)) { + if(RuleB(World, IPLimitDisconnectAll)) { LogClientLogin("Disconnect: All accounts on IP [{}]", long2ip(countCLEIPs->GetIP()).c_str()); DisconnectByIP(iIP); return; @@ -152,7 +153,7 @@ void ClientList::GetCLEIP(uint32 iIP) { iterator.RemoveCurrent(); continue; } - } else if (IPInstances > RuleI(World, AddMaxClientsPerIP)) { // else they are eligible for the higher limit, but if they exceed that + } else if (IPInstances > RuleI(World, AddMaxClientsPerIP)) { // else they are eligible for the higher limit, but if they exceed that if(RuleB(World, IPLimitDisconnectAll)) { LogClientLogin("Disconnect: All accounts on IP [{}]", long2ip(countCLEIPs->GetIP()).c_str()); DisconnectByIP(iIP); @@ -293,7 +294,7 @@ void ClientList::SendCLEList(const int16& admin, const char* to, WorldTCPConnect if (cle->LSID()) AppendAnyLenString(&output, &outsize, &outlen, "%s LSID: %i LSName: %s WorldAdmin: %i", newline, cle->LSID(), cle->LSName(), cle->WorldAdmin()); if (cle->CharID()) - AppendAnyLenString(&output, &outsize, &outlen, "%s CharID: %i CharName: %s Zone: %s (%i)", newline, cle->CharID(), cle->name(), content_db.GetZoneName(cle->zone()), cle->zone()); + AppendAnyLenString(&output, &outsize, &outlen, "%s CharID: %i CharName: %s Zone: %s (%i)", newline, cle->CharID(), cle->name(), ZoneName(cle->zone()), cle->zone()); if (outlen >= 3072) { connection->SendEmoteMessageRaw(to, 0, 0, 10, output); safe_delete(output); @@ -500,7 +501,7 @@ void ClientList::SendWhoAll(uint32 fromid,const char* to, int16 admin, Who_All_S countclients.Reset(); while(countclients.MoreElements()){ countcle = countclients.GetData(); - const char* tmpZone = content_db.GetZoneName(countcle->zone()); + const char* tmpZone = ZoneName(countcle->zone()); if ( (countcle->Online() >= CLE_Status::Zoning) && (!countcle->GetGM() || countcle->Anon() != 1 || admin >= countcle->Admin()) && @@ -580,7 +581,7 @@ void ClientList::SendWhoAll(uint32 fromid,const char* to, int16 admin, Who_All_S while(iterator.MoreElements()) { cle = iterator.GetData(); - const char* tmpZone = content_db.GetZoneName(cle->zone()); + const char* tmpZone = ZoneName(cle->zone()); if ( (cle->Online() >= CLE_Status::Zoning) && (!cle->GetGM() || cle->Anon() != 1 || admin >= cle->Admin()) && @@ -965,7 +966,7 @@ void ClientList::ConsoleSendWhoAll(const char* to, int16 admin, Who_All_Struct* iterator.Reset(); while (iterator.MoreElements()) { cle = iterator.GetData(); - const char* tmpZone = content_db.GetZoneName(cle->zone()); + const char* tmpZone = ZoneName(cle->zone()); if ( (cle->Online() >= CLE_Status::Zoning) && (whom == 0 || ( @@ -1086,7 +1087,7 @@ void ClientList::ConsoleSendWhoAll(const char* to, int16 admin, Who_All_Struct* AppendAnyLenString(&output, &outsize, &outlen, "\r\n"); else AppendAnyLenString(&output, &outsize, &outlen, "\n"); - + //console_list.SendConsoleWho(connection, to, admin, &output, &outsize, &outlen); } if (output) @@ -1282,7 +1283,7 @@ void ClientList::GetClients(const char *zone_name, std::vectorzone() == zoneid) @@ -1358,7 +1359,7 @@ void ClientList::SendClientVersionSummary(const char *Name) } zoneserver_list.SendEmoteMessage(Name, 0, 0, 13, "There are %i Titanium, %i SoF, %i SoD, %i UF, %i RoF, %i RoF2 clients currently connected.", - ClientTitaniumCount, ClientSoFCount, ClientSoDCount, ClientUnderfootCount, ClientRoFCount, ClientRoF2Count); + ClientTitaniumCount, ClientSoFCount, ClientSoDCount, ClientUnderfootCount, ClientRoFCount, ClientRoF2Count); } void ClientList::OnTick(EQ::Timer *t) @@ -1378,7 +1379,7 @@ void ClientList::OnTick(EQ::Timer *t) while (Iterator.MoreElements()) { ClientListEntry* cle = Iterator.GetData(); - + Json::Value outclient; outclient["Online"] = cle->Online(); diff --git a/world/console.cpp b/world/console.cpp index aa67751e7..8840b3070 100644 --- a/world/console.cpp +++ b/world/console.cpp @@ -30,6 +30,7 @@ #include "../common/string_util.h" #include "../common/md5.h" #include "eqemu_api_world_data_service.h" +#include "world_store.h" #include extern ClientList client_list; @@ -541,7 +542,7 @@ void ConsoleZoneShutdown( s->ZoneServerID = atoi(args[0].c_str()); } else { - s->zoneid = content_db.GetZoneID(args[0].c_str()); + s->zoneid = ZoneID(args[0].c_str()); } ZoneServer *zs = 0; @@ -549,7 +550,7 @@ void ConsoleZoneShutdown( zs = zoneserver_list.FindByID(s->ZoneServerID); } else if (s->zoneid != 0) { - zs = zoneserver_list.FindByName(content_db.GetZoneName(s->zoneid)); + zs = zoneserver_list.FindByName(ZoneName(s->zoneid)); } else { connection->SendLine("Error: ZoneShutdown: neither ID nor name specified"); @@ -633,10 +634,10 @@ void ConsoleZoneLock( return; } - uint16 tmp = content_db.GetZoneID(args[1].c_str()); + uint16 tmp = ZoneID(args[1].c_str()); if (tmp) { if (zoneserver_list.SetLockedZone(tmp, true)) { - zoneserver_list.SendEmoteMessage(0, 0, 80, 15, "Zone locked: %s", content_db.GetZoneName(tmp)); + zoneserver_list.SendEmoteMessage(0, 0, 80, 15, "Zone locked: %s", ZoneName(tmp)); } else { connection->SendLine("Failed to change lock"); @@ -651,10 +652,10 @@ void ConsoleZoneLock( return; } - uint16 tmp = content_db.GetZoneID(args[1].c_str()); + uint16 tmp = ZoneID(args[1].c_str()); if (tmp) { if (zoneserver_list.SetLockedZone(tmp, false)) { - zoneserver_list.SendEmoteMessage(0, 0, 80, 15, "Zone unlocked: %s", content_db.GetZoneName(tmp)); + zoneserver_list.SendEmoteMessage(0, 0, 80, 15, "Zone unlocked: %s", ZoneName(tmp)); } else { connection->SendLine("Failed to change lock"); @@ -936,4 +937,4 @@ void RegisterConsoleFunctions(std::unique_ptr& console) console->RegisterCall("zonestatus", 50, "zonestatus", std::bind(ConsoleZoneStatus, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));console->RegisterCall("ping", 50, "ping", std::bind(ConsoleNull, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); console->RegisterCall("quit", 50, "quit", std::bind(ConsoleQuit, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); console->RegisterCall("exit", 50, "exit", std::bind(ConsoleQuit, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); -} \ No newline at end of file +} diff --git a/world/console.old.cpp b/world/console.old.cpp index e3b530dd3..d7589d6eb 100644 --- a/world/console.old.cpp +++ b/world/console.old.cpp @@ -230,7 +230,7 @@ bool Console::Process() { std::string connecting_ip = inet_ntoa(in); SendMessage(2, StringFormat("Establishing connection from IP: %s Port: %d", inet_ntoa(in), GetPort()).c_str()); - + if (connecting_ip.find("127.0.0.1") != std::string::npos) { SendMessage(2, StringFormat("Connecting established from local host, auto assuming admin").c_str()); state = CONSOLE_STATE_CONNECTED; @@ -244,7 +244,7 @@ bool Console::Process() { } prompt_timer.Disable(); - + } if (timeout_timer.Check()) { @@ -269,7 +269,7 @@ bool Console::Process() { LogInfo("New launcher from [{}]:[{}]", inet_ntoa(in), GetPort()); launcher_list.Add(tcpc); tcpc = 0; - } + } else if(tcpc->GetPacketMode() == EmuTCPConnection::packetModeUCS) { LogInfo("New UCS Connection from [{}]:[{}]", inet_ntoa(in), GetPort()); @@ -281,7 +281,7 @@ bool Console::Process() { LogInfo("New QS Connection from [{}]:[{}]", inet_ntoa(in), GetPort()); QSLink.SetConnection(tcpc); tcpc = 0; - } + } else { LogInfo("Unsupported packet mode from [{}]:[{}]", inet_ntoa(in), GetPort()); } @@ -616,7 +616,7 @@ void Console::ProcessCommand(const char* command) { if(sep.arg[1][0]==0 || sep.arg[2][0] == 0) SendMessage(1, "Usage: movechar [charactername] [zonename]"); else { - if (!content_db.GetZoneID(sep.arg[2])) + if (!ZoneID(sep.arg[2])) SendMessage(1, "Error: Zone '%s' not found", sep.arg[2]); else if (!database.CheckUsedName((char*) sep.arg[1])) { if (!database.MoveCharacterToZone((char*) sep.arg[1], (char*) sep.arg[2])) @@ -711,13 +711,13 @@ void Console::ProcessCommand(const char* command) { if (sep.arg[1][0] >= '0' && sep.arg[1][0] <= '9') s->ZoneServerID = atoi(sep.arg[1]); else - s->zoneid = content_db.GetZoneID(sep.arg[1]); + s->zoneid = ZoneID(sep.arg[1]); ZoneServer* zs = 0; if (s->ZoneServerID != 0) zs = zoneserver_list.FindByID(s->ZoneServerID); else if (s->zoneid != 0) - zs = zoneserver_list.FindByName(content_db.GetZoneName(s->zoneid)); + zs = zoneserver_list.FindByName(ZoneName(s->zoneid)); else SendMessage(1, "Error: ZoneShutdown: neither ID nor name specified"); @@ -828,10 +828,10 @@ void Console::ProcessCommand(const char* command) { zoneserver_list.ListLockedZones(0, this); } else if (strcasecmp(sep.arg[1], "lock") == 0 && admin >= 101) { - uint16 tmp = content_db.GetZoneID(sep.arg[2]); + uint16 tmp = ZoneID(sep.arg[2]); if (tmp) { if (zoneserver_list.SetLockedZone(tmp, true)) - zoneserver_list.SendEmoteMessage(0, 0, 80, 15, "Zone locked: %s", content_db.GetZoneName(tmp)); + zoneserver_list.SendEmoteMessage(0, 0, 80, 15, "Zone locked: %s", ZoneName(tmp)); else SendMessage(1, "Failed to change lock"); } @@ -839,10 +839,10 @@ void Console::ProcessCommand(const char* command) { SendMessage(1, "Usage: #zonelock lock [zonename]"); } else if (strcasecmp(sep.arg[1], "unlock") == 0 && admin >= 101) { - uint16 tmp = content_db.GetZoneID(sep.arg[2]); + uint16 tmp = ZoneID(sep.arg[2]); if (tmp) { if (zoneserver_list.SetLockedZone(tmp, false)) - zoneserver_list.SendEmoteMessage(0, 0, 80, 15, "Zone unlocked: %s", content_db.GetZoneName(tmp)); + zoneserver_list.SendEmoteMessage(0, 0, 80, 15, "Zone unlocked: %s", ZoneName(tmp)); else SendMessage(1, "Failed to change lock"); } diff --git a/world/eql_config.cpp b/world/eql_config.cpp index 578e0d3a7..2b536c666 100644 --- a/world/eql_config.cpp +++ b/world/eql_config.cpp @@ -21,6 +21,7 @@ #include "launcher_link.h" #include "launcher_list.h" #include "../common/string_util.h" +#include "world_store.h" #include #include @@ -156,7 +157,7 @@ void EQLConfig::StartZone(Const_char *zone_ref) { bool EQLConfig::BootStaticZone(Const_char *short_name, uint16 port) { //make sure the short name is valid. - if(content_db.GetZoneID(short_name) == 0) + if(ZoneID(short_name) == 0) return false; //database update @@ -191,7 +192,7 @@ bool EQLConfig::BootStaticZone(Const_char *short_name, uint16 port) { bool EQLConfig::ChangeStaticZone(Const_char *short_name, uint16 port) { //make sure the short name is valid. - if(content_db.GetZoneID(short_name) == 0) + if(ZoneID(short_name) == 0) return false; //check internal state diff --git a/world/eqw.cpp b/world/eqw.cpp index a0c10fead..8d997edca 100644 --- a/world/eqw.cpp +++ b/world/eqw.cpp @@ -188,7 +188,7 @@ std::map EQW::GetPlayerDetails(Const_char *char_name) { res["character"] = cle->name(); res["account"] = cle->AccountName(); res["account_id"] = itoa(cle->AccountID()); - res["location_short"] = cle->zone()?content_db.GetZoneName(cle->zone()):"No Zone"; + res["location_short"] = cle->zone()?ZoneName(cle->zone()):"No Zone"; res["location_long"] = res["location_short"]; res["location_id"] = itoa(cle->zone()); res["ip"] = long2ip(cle->GetIP()); diff --git a/world/main.cpp b/world/main.cpp index c0ca4f9e3..a4c2f230f 100644 --- a/world/main.cpp +++ b/world/main.cpp @@ -94,7 +94,9 @@ union semun { #include "world_server_command_handler.h" #include "../common/content/world_content_service.h" #include "../common/repositories/merchantlist_temp_repository.h" +#include "world_store.h" +WorldStore world_store; ClientList client_list; GroupLFPList LFPGroupList; ZSList zoneserver_list; @@ -329,9 +331,7 @@ int main(int argc, char** argv) { LogInfo("Loading zones"); - // Load to both context for now... this needs to be cleaned up as this has always been cludgy - content_db.LoadZoneNames(); - database.zonename_array = content_db.zonename_array; + world_store.LoadZones(); LogInfo("Clearing groups"); database.ClearGroup(); diff --git a/world/world_store.cpp b/world/world_store.cpp new file mode 100644 index 000000000..36a88f998 --- /dev/null +++ b/world/world_store.cpp @@ -0,0 +1,132 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "world_store.h" + +WorldStore::WorldStore() = default; +WorldStore::~WorldStore()= default; + +void WorldStore::LoadZones() +{ + zones = ZoneRepository::All(); +} + +uint32 WorldStore::GetZoneID(const char *in_zone_name) +{ + if (in_zone_name == nullptr) { + return 0; + } + + std::string zone_name = in_zone_name; + + return GetZoneID(zone_name); +} + +uint32 WorldStore::GetZoneID(std::string zone_name) +{ + for (auto &z: zones) { + if (z.short_name == zone_name) { + return z.zoneidnumber; + } + } + + return 0; +} + +/** + * @param zone_id + * @param error_unknown + * @return + */ +const char *WorldStore::GetZoneName(uint32 zone_id, bool error_unknown) +{ + for (auto &z: zones) { + if (z.zoneidnumber == zone_id) { + return z.short_name.c_str(); + } + } + + if (error_unknown) { + return "UNKNOWN"; + } + + return nullptr; +} + +/** + * @param zone_id + * @return + */ +std::string WorldStore::GetZoneName(uint32 zone_id) +{ + for (auto &z: zones) { + if (z.zoneidnumber == zone_id) { + return z.short_name; + } + } + + return std::string(); +} + +/** + * @param zone_id + * @return + */ +std::string WorldStore::GetZoneLongName(uint32 zone_id) +{ + for (auto &z: zones) { + if (z.zoneidnumber == zone_id) { + return z.long_name; + } + } + + return std::string(); +} + +/** + * @param zone_id + * @param version + * @return + */ +ZoneRepository::Zone WorldStore::GetZone(uint32 zone_id, int version) +{ + for (auto &z: zones) { + if (z.zoneidnumber == zone_id && z.version == version) { + return z; + } + } + + return ZoneRepository::Zone(); +} + +/** + * @param in_zone_name + * @return + */ +ZoneRepository::Zone WorldStore::GetZone(const char *in_zone_name) +{ + for (auto &z: zones) { + if (z.short_name == in_zone_name) { + return z; + } + } + + return ZoneRepository::Zone(); +} diff --git a/world/world_store.h b/world/world_store.h new file mode 100644 index 000000000..985419ff0 --- /dev/null +++ b/world/world_store.h @@ -0,0 +1,64 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_WORLD_STORE_H +#define EQEMU_WORLD_STORE_H + +#include "worlddb.h" +#include "../common/repositories/zone_repository.h" + +class WorldStore { +public: + WorldStore(); + virtual ~WorldStore(); + + std::vector zones{}; + + void LoadZones(); + + ZoneRepository::Zone GetZone(uint32 zone_id, int version = 0); + ZoneRepository::Zone GetZone(const char *in_zone_name); + uint32 GetZoneID(const char *in_zone_name); + uint32 GetZoneID(std::string zone_name); + std::string GetZoneName(uint32 zone_id); + std::string GetZoneLongName(uint32 zone_id); + const char *GetZoneName(uint32 zone_id, bool error_unknown = false); + +}; + +extern WorldStore world_store; + +/** + * Global helpers + */ +inline uint32 ZoneID(const char *in_zone_name) { return world_store.GetZoneID(in_zone_name); } +inline uint32 ZoneID(std::string zone_name) { return world_store.GetZoneID(zone_name); } +inline const char *ZoneName(uint32 zone_id, bool error_unknown = false) +{ + return world_store.GetZoneName( + zone_id, + error_unknown + ); +} +inline const char *ZoneLongName(uint32 zone_id) { return world_store.GetZoneLongName(zone_id).c_str(); } +inline ZoneRepository::Zone GetZone(uint32 zone_id, int version = 0) { return world_store.GetZone(zone_id, version); }; +inline ZoneRepository::Zone GetZone(const char *in_zone_name) { return world_store.GetZone(in_zone_name); }; + +#endif //EQEMU_WORLD_STORE_H diff --git a/world/worlddb.cpp b/world/worlddb.cpp index cf6411cc5..2adfd9fa4 100644 --- a/world/worlddb.cpp +++ b/world/worlddb.cpp @@ -26,6 +26,7 @@ #include #include "sof_char_create_data.h" #include "../common/repositories/criteria/content_filter_criteria.h" +#include "world_store.h" WorldDatabase database; WorldDatabase content_db; @@ -209,7 +210,13 @@ void WorldDatabase::GetCharSelectInfo(uint32 account_id, EQApplicationPacket **o /* If a bind_id is specified, make them start there */ if (atoi(row_d[1]) != 0) { player_profile_struct.binds[4].zoneId = (uint32) atoi(row_d[1]); - GetSafePoints(player_profile_struct.binds[4].zoneId, 0, &player_profile_struct.binds[4].x, &player_profile_struct.binds[4].y, &player_profile_struct.binds[4].z); + content_db.GetSafePoints( + ZoneName(player_profile_struct.binds[4].zoneId), + 0, + &player_profile_struct.binds[4].x, + &player_profile_struct.binds[4].y, + &player_profile_struct.binds[4].z + ); } /* Otherwise, use the zone and coordinates given */ else { @@ -217,7 +224,15 @@ void WorldDatabase::GetCharSelectInfo(uint32 account_id, EQApplicationPacket **o float x = atof(row_d[2]); float y = atof(row_d[3]); float z = atof(row_d[4]); - if (x == 0 && y == 0 && z == 0) { content_db.GetSafePoints(player_profile_struct.binds[4].zoneId, 0, &x, &y, &z); } + if (x == 0 && y == 0 && z == 0) { + content_db.GetSafePoints( + ZoneName(player_profile_struct.binds[4].zoneId), + 0, + &x, + &y, + &z + ); + } player_profile_struct.binds[4].x = x; player_profile_struct.binds[4].y = y; player_profile_struct.binds[4].z = z; @@ -459,11 +474,24 @@ bool WorldDatabase::GetStartZone( } if (p_player_profile_struct->x == 0 && p_player_profile_struct->y == 0 && p_player_profile_struct->z == 0) { - content_db.GetSafePoints(p_player_profile_struct->zone_id, 0, &p_player_profile_struct->x, &p_player_profile_struct->y, &p_player_profile_struct->z); + content_db.GetSafePoints( + ZoneName(p_player_profile_struct->zone_id), + 0, + &p_player_profile_struct->x, + &p_player_profile_struct->y, + &p_player_profile_struct->z + ); } - if (p_player_profile_struct->binds[0].x == 0 && p_player_profile_struct->binds[0].y == 0 && p_player_profile_struct->binds[0].z == 0) { - content_db.GetSafePoints(p_player_profile_struct->binds[0].zoneId, 0, &p_player_profile_struct->binds[0].x, &p_player_profile_struct->binds[0].y, &p_player_profile_struct->binds[0].z); + if (p_player_profile_struct->binds[0].x == 0 && p_player_profile_struct->binds[0].y == 0 && + p_player_profile_struct->binds[0].z == 0) { + content_db.GetSafePoints( + ZoneName(p_player_profile_struct->binds[0].zoneId), + 0, + &p_player_profile_struct->binds[0].x, + &p_player_profile_struct->binds[0].y, + &p_player_profile_struct->binds[0].z + ); } return true; diff --git a/world/zonelist.cpp b/world/zonelist.cpp index a046c6a90..cd01d8ae1 100644 --- a/world/zonelist.cpp +++ b/world/zonelist.cpp @@ -27,6 +27,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #include "../common/json/json.h" #include "../common/event_sub.h" #include "web_interface.h" +#include "world_store.h" extern uint32 numzones; extern bool holdzones; @@ -263,7 +264,7 @@ void ZSList::ListLockedZones(const char* to, WorldTCPConnection* connection) { int x = 0; for (auto &zone : pLockedZones) { if (zone) { - connection->SendEmoteMessageRaw(to, 0, 0, 0, content_db.GetZoneName(zone, true)); + connection->SendEmoteMessageRaw(to, 0, 0, 0, ZoneName(zone, true)); x++; } } @@ -529,7 +530,7 @@ void ZSList::SOPZoneBootup(const char* adminname, uint32 ZoneServerID, const cha ZoneServer* zs = 0; ZoneServer* zs2 = 0; uint32 zoneid; - if (!(zoneid = content_db.GetZoneID(zonename))) + if (!(zoneid = ZoneID(zonename))) SendEmoteMessage(adminname, 0, 0, 0, "Error: SOP_ZoneBootup: zone '%s' not found in 'zone' table. Typo protection=ON.", zonename); else { if (ZoneServerID != 0) diff --git a/world/zoneserver.cpp b/world/zoneserver.cpp index 45b7f93c7..7cd6793fb 100644 --- a/world/zoneserver.cpp +++ b/world/zoneserver.cpp @@ -35,6 +35,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #include "adventure_manager.h" #include "ucs.h" #include "queryserv.h" +#include "world_store.h" extern ClientList client_list; extern GroupLFPList LFPGroupList; @@ -86,7 +87,7 @@ ZoneServer::~ZoneServer() { bool ZoneServer::SetZone(uint32 iZoneID, uint32 iInstanceID, bool iStaticZone) { is_booting_up = false; - const char* zn = MakeLowerString(content_db.GetZoneName(iZoneID)); + const char* zn = MakeLowerString(ZoneName(iZoneID)); char* longname; if (iZoneID) @@ -566,7 +567,7 @@ void ZoneServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) { SetZone_Struct* szs = (SetZone_Struct*)pack->pBuffer; if (szs->zoneid != 0) { - if (content_db.GetZoneName(szs->zoneid)) + if (ZoneName(szs->zoneid)) SetZone(szs->zoneid, szs->instanceid, szs->staticzone); else SetZone(0); @@ -648,7 +649,7 @@ void ZoneServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) { if (s->ZoneServerID != 0) zs = zoneserver_list.FindByID(s->ZoneServerID); else if (s->zoneid != 0) - zs = zoneserver_list.FindByName(content_db.GetZoneName(s->zoneid)); + zs = zoneserver_list.FindByName(ZoneName(s->zoneid)); else zoneserver_list.SendEmoteMessage(s->adminname, 0, 0, 0, "Error: SOP_ZoneShutdown: neither ID nor name specified"); @@ -660,7 +661,7 @@ void ZoneServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) { } case ServerOP_ZoneBootup: { ServerZoneStateChange_struct* s = (ServerZoneStateChange_struct *)pack->pBuffer; - zoneserver_list.SOPZoneBootup(s->adminname, s->ZoneServerID, content_db.GetZoneName(s->zoneid), s->makestatic); + zoneserver_list.SOPZoneBootup(s->adminname, s->ZoneServerID, ZoneName(s->zoneid), s->makestatic); break; } case ServerOP_ZoneStatus: { @@ -1018,13 +1019,13 @@ void ZoneServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) { break; case 1: if (zoneserver_list.SetLockedZone(s->zoneID, true)) - zoneserver_list.SendEmoteMessage(0, 0, 80, 15, "Zone locked: %s", content_db.GetZoneName(s->zoneID)); + zoneserver_list.SendEmoteMessage(0, 0, 80, 15, "Zone locked: %s", ZoneName(s->zoneID)); else this->SendEmoteMessageRaw(s->adminname, 0, 0, 0, "Failed to change lock"); break; case 2: if (zoneserver_list.SetLockedZone(s->zoneID, false)) - zoneserver_list.SendEmoteMessage(0, 0, 80, 15, "Zone unlocked: %s", content_db.GetZoneName(s->zoneID)); + zoneserver_list.SendEmoteMessage(0, 0, 80, 15, "Zone unlocked: %s", ZoneName(s->zoneID)); else this->SendEmoteMessageRaw(s->adminname, 0, 0, 0, "Failed to change lock"); break; diff --git a/zone/aa.cpp b/zone/aa.cpp index 45ad357a2..e11b4a2ae 100644 --- a/zone/aa.cpp +++ b/zone/aa.cpp @@ -33,6 +33,7 @@ Copyright (C) 2001-2016 EQEMu Development Team (http://eqemulator.net) #include "string_ids.h" #include "titles.h" #include "zonedb.h" +#include "zone_store.h" extern QueryServ* QServ; diff --git a/zone/api_service.cpp b/zone/api_service.cpp index b038da1a6..f97c451b1 100644 --- a/zone/api_service.cpp +++ b/zone/api_service.cpp @@ -22,6 +22,7 @@ #include "../common/net/websocket_server.h" #include "../common/eqemu_logsys.h" #include "zonedb.h" +#include "zone_store.h" #include "client.h" #include "entity.h" #include "corpse.h" diff --git a/zone/attack.cpp b/zone/attack.cpp index 6c72fbe6a..90b43c4e0 100644 --- a/zone/attack.cpp +++ b/zone/attack.cpp @@ -283,7 +283,7 @@ bool Mob::CheckHitChance(Mob* other, DamageHitInfo &hit) bool lua_ret = false; bool ignoreDefault = false; lua_ret = LuaParser::Instance()->CheckHitChance(this, other, hit, ignoreDefault); - + if(ignoreDefault) { return lua_ret; } @@ -323,7 +323,7 @@ bool Mob::AvoidDamage(Mob *other, DamageHitInfo &hit) bool lua_ret = false; bool ignoreDefault = false; lua_ret = LuaParser::Instance()->AvoidDamage(this, other, hit, ignoreDefault); - + if (ignoreDefault) { return lua_ret; } @@ -866,7 +866,7 @@ int Mob::GetBestMeleeSkill() { EQEmu::skills::Skill1HBlunt, EQEmu::skills::Skill1HSlashing, EQEmu::skills::Skill2HBlunt, - EQEmu::skills::Skill2HSlashing, + EQEmu::skills::Skill2HSlashing, EQEmu::skills::SkillHandtoHand, EQEmu::skills::Skill1HPiercing, EQEmu::skills::Skill2HPiercing, @@ -879,7 +879,7 @@ int Mob::GetBestMeleeSkill() value = GetSkill(meleeSkills[i]); bestSkill = std::max(value, bestSkill); } - + return bestSkill; } @@ -892,7 +892,7 @@ int Mob::offense(EQEmu::skills::SkillType skill) case EQEmu::skills::SkillArchery: case EQEmu::skills::SkillThrowing: stat_bonus = GetDEX(); - break; + break; // Mobs with no weapons default to H2H. // Since H2H is capped at 100 for many many classes, @@ -943,7 +943,7 @@ void Mob::MeleeMitigation(Mob *attacker, DamageHitInfo &hit, ExtraAttackOptions #ifdef LUA_EQEMU bool ignoreDefault = false; LuaParser::Instance()->MeleeMitigation(this, attacker, hit, opts, ignoreDefault); - + if (ignoreDefault) { return; } @@ -1735,7 +1735,7 @@ bool Client::Death(Mob* killerMob, int32 damage, uint16 spell, EQEmu::skills::Sk if (!RuleB(Character, UseDeathExpLossMult)) { exploss = (int)(GetLevel() * (GetLevel() / 18.0) * 12000); } - + if (RuleB(Zone, LevelBasedEXPMods)) { // Death in levels with xp_mod (such as hell levels) was resulting // in losing more that appropriate since the loss was the same but @@ -1893,7 +1893,7 @@ bool Client::Death(Mob* killerMob, int32 damage, uint16 spell, EQEmu::skills::Sk dead_timer.Start(5000, true); m_pp.zone_id = m_pp.binds[0].zoneId; m_pp.zoneInstance = m_pp.binds[0].instance_id; - database.MoveCharacterToZone(this->CharacterID(), content_db.GetZoneName(m_pp.zone_id)); + database.MoveCharacterToZone(this->CharacterID(), m_pp.zone_id); Save(); GoToDeath(); } @@ -2452,7 +2452,7 @@ bool NPC::Death(Mob* killer_mob, int32 damage, uint16 spell, EQEmu::skills::Skil bool allow_merchant_corpse = RuleB(Merchant, AllowCorpse); bool is_merchant = (class_ == MERCHANT || class_ == ADVENTUREMERCHANT || MerchantType != 0); - + if (!HasOwner() && !IsMerc() && !GetSwarmInfo() && (!is_merchant || allow_merchant_corpse) && ((killer && (killer->IsClient() || (killer->HasOwner() && killer->GetUltimateOwner()->IsClient()) || (killer->IsNPC() && killer->CastToNPC()->GetSwarmInfo() && killer->CastToNPC()->GetSwarmInfo()->GetOwner() && killer->CastToNPC()->GetSwarmInfo()->GetOwner()->IsClient()))) @@ -4093,7 +4093,7 @@ void Mob::TrySpellProc(const EQEmu::ItemInstance *inst, const EQEmu::ItemData *w if (IsPet() && hand != EQEmu::invslot::slotPrimary) //Pets can only proc spell procs from their primay hand (ie; beastlord pets) continue; // If pets ever can proc from off hand, this will need to change - if (SpellProcs[i].base_spellID == POISON_PROC && + if (SpellProcs[i].base_spellID == POISON_PROC && (!weapon || weapon->ItemType != EQEmu::item::ItemType1HPiercing)) continue; // Old school poison will only proc with 1HP equipped. @@ -4113,7 +4113,7 @@ void Mob::TrySpellProc(const EQEmu::ItemInstance *inst, const EQEmu::ItemData *w // Spell procs (buffs) if (SpellProcs[i].spellID != SPELL_UNKNOWN) { if (SpellProcs[i].base_spellID == POISON_PROC) { - poison_slot=i; + poison_slot=i; continue; // Process the poison proc last per @mackal } @@ -4160,7 +4160,7 @@ void Mob::TrySpellProc(const EQEmu::ItemInstance *inst, const EQEmu::ItemData *w RemoveProcFromWeapon(spell_id); } } - } + } if (HasSkillProcs() && hand != EQEmu::invslot::slotRange) { //We check ranged skill procs within the attack functions. uint16 skillinuse = 28; @@ -4696,7 +4696,7 @@ void Mob::ApplyDamageTable(DamageHitInfo &hit) #ifdef LUA_EQEMU bool ignoreDefault = false; LuaParser::Instance()->ApplyDamageTable(this, hit, ignoreDefault); - + if (ignoreDefault) { return; } diff --git a/zone/bot.h b/zone/bot.h index b456fd77f..ab2499f2e 100644 --- a/zone/bot.h +++ b/zone/bot.h @@ -29,6 +29,7 @@ #include "groups.h" #include "corpse.h" #include "zonedb.h" +#include "zone_store.h" #include "string_ids.h" #include "../common/misc_functions.h" #include "../common/global_define.h" @@ -320,7 +321,7 @@ public: void SetStopMeleeLevel(uint8 level); void SetGuardMode(); void SetHoldMode(); - + // Mob AI Virtual Override Methods virtual void AI_Process(); virtual void AI_Stop(); @@ -351,7 +352,7 @@ public: virtual void UpdateEquipmentLight() { m_Light.Type[EQEmu::lightsource::LightEquipment] = m_inv.FindBrightestLightType(); m_Light.Level[EQEmu::lightsource::LightEquipment] = EQEmu::lightsource::TypeToLevel(m_Light.Type[EQEmu::lightsource::LightEquipment]); } const EQEmu::InventoryProfile& GetBotInv() const { return m_inv; } - // Static Class Methods + // Static Class Methods //static void DestroyBotRaidObjects(Client* client); // Can be removed after bot raids are dumped static Bot* LoadBot(uint32 botID); static uint32 SpawnedBotCount(uint32 botOwnerCharacterID); @@ -405,7 +406,7 @@ public: static BotSpell GetDebuffBotSpell(Bot* botCaster, Mob* target); static BotSpell GetBestBotSpellForCure(Bot* botCaster, Mob* target); static BotSpell GetBestBotSpellForResistDebuff(Bot* botCaster, Mob* target); - + static NPCType *CreateDefaultNPCTypeStructForBot(std::string botName, std::string botLastName, uint8 botLevel, uint16 botRace, uint8 botClass, uint8 gender); // Static Bot Group Methods @@ -451,7 +452,7 @@ public: bool IsBotNonSpellFighter() { return IsNonSpellFighterClass(GetClass()); } bool CanHeal(); int GetRawACNoShield(int &shield_ac); - + // new heal rotation code bool CreateHealRotation(uint32 cycle_duration_ms = 5000, bool fast_heals = false, bool adaptive_targeting = false, bool casting_override = false); bool DestroyHealRotation(); @@ -597,7 +598,7 @@ public: int32 GetBasePR() { return _basePR; } int32 GetBaseDR() { return _baseDR; } int32 GetBaseCorrup() { return _baseCorrup; } - + protected: virtual void PetAIProcess(); virtual void BotMeditate(bool isSitting); @@ -656,7 +657,7 @@ private: int32 max_end; int32 end_regen; uint32 timers[MaxTimer]; - + Timer m_evade_timer; // can be moved to pTimers at some point Timer m_alt_combat_hate_timer; Timer m_auto_defend_timer; diff --git a/zone/bot_command.cpp b/zone/bot_command.cpp index 3b539d052..1da51cf06 100644 --- a/zone/bot_command.cpp +++ b/zone/bot_command.cpp @@ -24,7 +24,7 @@ 2. Add the function in this file. 3. In the bot_command_init function you must add a call to bot_command_add for your function. - + Notes: If you want an alias for your bot command, add an entry to the `bot_command_settings` table in your database. The access level you set with bot_command_add is the default setting if the bot command isn't @@ -60,6 +60,7 @@ #include "bot_command.h" #include "zonedb.h" +#include "zone_store.h" #include "guild_mgr.h" #include "map.h" #include "doors.h" @@ -120,18 +121,18 @@ public: static void Load() { bot_command_spells.clear(); bcst_levels_map bot_levels_map; - + for (int i = BCEnum::SpellTypeFirst; i <= BCEnum::SpellTypeLast; ++i) { bot_command_spells[static_cast(i)]; bot_levels_map[static_cast(i)]; } - + for (int spell_id = 2; spell_id < SPDAT_RECORDS; ++spell_id) { if (spells[spell_id].player_1[0] == '\0') continue; if (spells[spell_id].targettype != ST_Target && spells[spell_id].CastRestriction != 0) // watch continue; - + auto target_type = BCEnum::TT_None; switch (spells[spell_id].targettype) { case ST_GroupTeleport: @@ -196,7 +197,7 @@ public: } if (target_type == BCEnum::TT_None) continue; - + uint8 class_levels[16] = { 0 }; bool player_spell = false; for (int class_type = WARRIOR; class_type <= BERSERKER; ++class_type) { @@ -209,7 +210,7 @@ public: } if (!player_spell) continue; - + STBaseEntry* entry_prototype = nullptr; while (true) { switch (spells[spell_id].effectid[EFFECTIDTOINDEX(1)]) { @@ -310,7 +311,7 @@ public: } if (entry_prototype) break; - + switch (spells[spell_id].effectid[EFFECTIDTOINDEX(2)]) { case SE_Succor: entry_prototype = new STEscapeEntry; @@ -334,7 +335,7 @@ public: } if (entry_prototype) break; - + while (spells[spell_id].typedescnum == 27) { if (!spells[spell_id].goodEffect) break; @@ -351,7 +352,7 @@ public: } if (entry_prototype) break; - + switch (spells[spell_id].SpellAffectIndex) { case 1: { bool valid_spell = false; @@ -453,7 +454,7 @@ public: } if (!entry_prototype) continue; - + if (target_type == BCEnum::TT_Self && (entry_prototype->BCST() != BCEnum::SpT_Stance && entry_prototype->BCST() != BCEnum::SpT_SummonCorpse)) { #ifdef BCSTSPELLDUMP LogError("DELETING entry_prototype (primary clause) - name: [{}], target_type: [{}], BCST: [{}]", @@ -532,12 +533,12 @@ public: spell_entry = new STBaseEntry(entry_prototype); break; } - + assert(spell_entry); spell_entry->caster_class = class_type; spell_entry->spell_level = class_levels[class_index]; - + bot_command_spells[spell_entry->BCST()].push_back(spell_entry); if (bot_levels.find(class_type) == bot_levels.end() || bot_levels[class_type] > class_levels[class_index]) @@ -546,7 +547,7 @@ public: delete(entry_prototype); } - + remove_inactive(); order_all(); load_teleport_zone_names(); @@ -1152,7 +1153,7 @@ private: auto bcst_id = static_cast(i); spell_dump << StringFormat("BCSpells::spell_dump(): - '%s' returned %u spells:\n", BCEnum::SpellTypeEnumToString(bcst_id).c_str(), bot_command_spells[bcst_id].size()); - + bcst_list& map_entry = bot_command_spells[bcst_id]; for (auto list_iter = map_entry.begin(); list_iter != map_entry.end(); ++list_iter) { STBaseEntry* list_entry = *list_iter; @@ -1229,7 +1230,7 @@ private: spell_dump << "\n"; ++entry_count; } - + spell_dump << StringFormat("required_bots_map[%s] = \"%s\"\n", BCEnum::SpellTypeEnumToString(static_cast(i)).c_str(), required_bots_map[static_cast(i)].c_str()); @@ -1477,7 +1478,7 @@ int bot_command_init(void) working_bcl_iter.first.c_str() ); } - + continue; } @@ -1487,7 +1488,7 @@ int bot_command_init(void) working_bcl_iter.first.c_str(), bcs_iter->second.first ); - + if (bcs_iter->second.second.empty()) { continue; } @@ -1522,11 +1523,11 @@ int bot_command_init(void) LogInfo("Failed to process 'Injected Bot Commands' update operation."); } } - + bot_command_dispatch = bot_command_real_dispatch; BCSpells::Load(); - + return bot_command_count; } @@ -1710,10 +1711,10 @@ namespace MyBots auto test_bot = my_bot->CastToBot(); if (!test_bot->GetOwner() || !test_bot->GetOwner()->IsClient() || test_bot->GetOwner()->CastToClient() != bot_owner) return false; - + return true; } - + static bool IsMyBotInTargetsGroup(Client *bot_owner, Mob *grouped_bot) { if (!bot_owner || !grouped_bot || !grouped_bot->GetGroup() || !IsMyBot(bot_owner, grouped_bot)) return false; @@ -1724,7 +1725,7 @@ namespace MyBots if (!target_mob->GetGroup() || (!target_mob->IsClient() && !target_mob->IsBot())) return false; - + return (grouped_bot->GetGroup() == target_mob->GetGroup()); } @@ -1757,7 +1758,7 @@ namespace MyBots sbl.clear(); if (!bot_owner || !name) return; - + auto selectable_bot_list = entity_list.GetBotsByBotOwnerCharacterID(bot_owner->CharacterID()); for (auto bot_iter : selectable_bot_list) { if (!strcasecmp(bot_iter->GetCleanName(), name)) { @@ -1765,7 +1766,7 @@ namespace MyBots return; } } - + if (!clear_list) UniquifySBL(sbl); } @@ -1785,7 +1786,7 @@ namespace MyBots if (IsMyBot(bot_owner, member_iter)) sbl.push_back(member_iter); } - + if (!clear_list) UniquifySBL(sbl); } @@ -1806,7 +1807,7 @@ namespace MyBots if (IsMyBot(bot_owner, member_iter)) sbl.push_back(member_iter); } - + if (!clear_list) UniquifySBL(sbl); } @@ -1835,11 +1836,11 @@ namespace MyBots if (IsMyBot(bot_owner, member_iter)) sbl.push_back(member_iter); } - + if (!clear_list) UniquifySBL(sbl); } - + static void PopulateSBL_ByHealRotation(Client *bot_owner, std::list &sbl, const char* name, bool clear_list = true) { if (clear_list) sbl.clear(); @@ -1890,11 +1891,11 @@ namespace MyBots if (IsMyBot(bot_owner, hrm_iter)) sbl.push_back(hrm_iter); } - + if (!clear_list) UniquifySBL(sbl); } - + static void PopulateSBL_ByHealRotationTargets(Client *bot_owner, std::list &sbl, const char* name, bool clear_list = true) { if (clear_list) sbl.clear(); @@ -1915,7 +1916,7 @@ namespace MyBots if (IsMyBot(bot_owner, hrm_iter)) sbl.push_back(static_cast(hrm_iter)); } - + if (!clear_list) UniquifySBL(sbl); } @@ -2461,7 +2462,7 @@ namespace ActionableBots sbl.remove_if([bot_owner](Bot* l) { return (!MyBots::IsMyBot(bot_owner, l)); }); sbl.remove_if([bot_owner](Bot* l) { return (!l->IsBotArcher()); }); } - + static void Filter_ByHighestSkill(Client* bot_owner, std::list& sbl, EQEmu::skills::SkillType skill_type, float& skill_value) { sbl.remove_if([bot_owner](Bot* l) { return (!MyBots::IsMyBot(bot_owner, l)); }); skill_value = 0.0f; @@ -2610,7 +2611,7 @@ void bot_command_apply_poison(Client *c, const Seperator *sep) c->Message(m_fail, "Your rogue bot must be level 18 before %s can apply poison!", (my_rogue_bot->GetGender() == 1 ? "she" : "he")); return; } - + const auto poison_instance = c->GetInv().GetItem(EQEmu::invslot::slotCursor); if (!poison_instance) { @@ -2748,7 +2749,7 @@ void bot_command_attack(Client *c, const Seperator *sep) return; } if (helper_is_help_or_usage(sep->arg[1])) { - + c->Message(m_usage, "usage: %s [actionable: byname | ownergroup | botgroup | namesgroup | healrotation | default: spawned] ([actionable_name])", sep->arg[0]); return; } @@ -2756,7 +2757,7 @@ void bot_command_attack(Client *c, const Seperator *sep) Mob* target_mob = ActionableTarget::AsSingle_ByAttackable(c); if (!target_mob) { - + c->Message(m_fail, "You must an enemy to use this command"); return; } @@ -2765,7 +2766,7 @@ void bot_command_attack(Client *c, const Seperator *sep) if (ab_arg.empty()) { ab_arg = "spawned"; } - + std::list sbl; if (ActionableBots::PopulateSBL(c, ab_arg.c_str(), sbl, ab_mask, sep->arg[2]) == ActionableBots::ABT_None) { return; @@ -2831,7 +2832,7 @@ void bot_command_bind_affinity(Client *c, const Seperator *sep) c->Message(m_fail, "Failed to bind %s to this location", target_mob->GetCleanName()); break; } - + helper_no_available_bots(c, my_bot); } @@ -2866,7 +2867,7 @@ void bot_command_bot(Client *c, const Seperator *sep) "botlist", "botoutofcombat", "botreport", "botspawn", "botstance", "botsummon", "bottogglearcher", "bottogglehelm", "botupdate" }; */ - + if (helper_command_alias_fail(c, "bot_command_bot", sep->arg[0], "bot")) return; @@ -2890,7 +2891,7 @@ void bot_command_botgroup(Client *c, const Seperator *sep) "botgroupaddmember", "botgroupcreate", "botgroupdelete", "botgrouplist", "botgroupload", "botgroupremovemember" }; */ - + if (helper_command_alias_fail(c, "bot_command_botgroup", sep->arg[0], "botgroup")) return; @@ -2946,7 +2947,7 @@ void bot_command_charm(Client *c, const Seperator *sep) break; } - + helper_no_available_bots(c, my_bot); } @@ -3016,7 +3017,7 @@ void bot_command_cure(Client *c, const Seperator *sep) cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id); break; } - + helper_no_available_bots(c, my_bot); } @@ -3031,7 +3032,7 @@ void bot_command_defensive(Client *c, const Seperator *sep) return; } const int ab_mask = ActionableBots::ABM_Type1; - + std::list sbl; if (ActionableBots::PopulateSBL(c, sep->arg[1], sbl, ab_mask, sep->arg[2]) == ActionableBots::ABT_None) return; @@ -3127,7 +3128,7 @@ void bot_command_depart(Client *c, const Seperator *sep) cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id); break; } - + helper_no_available_bots(c, my_bot); } @@ -3170,7 +3171,7 @@ void bot_command_escape(Client *c, const Seperator *sep) cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id); break; } - + helper_no_available_bots(c, my_bot); } @@ -3182,7 +3183,7 @@ void bot_command_find_aliases(Client *c, const Seperator *sep) c->Message(m_usage, "usage: %s [alias | command]", sep->arg[0]); return; } - + auto find_iter = bot_command_aliases.find(sep->arg[1]); if (find_iter == bot_command_aliases.end()) { c->Message(m_fail, "No bot commands or aliases match '%s'", sep->arg[1]); @@ -3248,7 +3249,7 @@ void bot_command_follow(Client *c, const Seperator *sep) std::list sbl; if (ActionableBots::PopulateSBL(c, sep->arg[ab_arg], sbl, ab_mask, sep->arg[name_arg]) == ActionableBots::ABT_None) return; - + sbl.remove(nullptr); for (auto bot_iter : sbl) { bot_iter->WipeHateList(); @@ -3366,7 +3367,7 @@ void bot_command_heal_rotation(Client *c, const Seperator *sep) subcommand_list.push_back("healrotationstart"); subcommand_list.push_back("healrotationstop"); /* VS2012 code - end */ - + /* VS2013 code const std::list subcommand_list = { "healrotationadaptivetargeting", "healrotationaddmember", "healrotationaddtarget", "healrotationadjustcritical", "healrotationadjustsafe", @@ -3375,7 +3376,7 @@ void bot_command_heal_rotation(Client *c, const Seperator *sep) "healrotationresetlimits", "healrotationsethot", "healrotationstart", "healrotationstop" }; */ - + if (helper_command_alias_fail(c, "bot_command_heal_rotation", sep->arg[0], "healrotation")) return; @@ -3401,7 +3402,7 @@ void bot_command_help(Client *c, const Seperator *sep) { if (helper_command_alias_fail(c, "bot_command_help", sep->arg[0], "help")) return; - + c->Message(m_message, "Available EQEMu bot commands:"); int bot_commands_shown = 0; @@ -3505,7 +3506,7 @@ void bot_command_identify(Client *c, const Seperator *sep) cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id); break; } - + helper_no_available_bots(c, my_bot); } @@ -3581,7 +3582,7 @@ void bot_command_invisibility(Client *c, const Seperator *sep) cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id); break; } - + helper_no_available_bots(c, my_bot); } @@ -3647,7 +3648,7 @@ void bot_command_item_use(Client* c, const Seperator* sep) msg = StringFormat("%cinventorygive byname %s", BOT_COMMAND_CHAR, bot_iter->GetCleanName()); text_link = bot_iter->CreateSayLink(c, msg.c_str(), bot_iter->GetCleanName()); - + for (auto slot_iter : equipable_slot_list) { // needs more failure criteria - this should cover the bulk for now @@ -3717,7 +3718,7 @@ void bot_command_levitation(Client *c, const Seperator *sep) cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id); break; } - + helper_no_available_bots(c, my_bot); } @@ -3787,7 +3788,7 @@ void bot_command_mesmerize(Client *c, const Seperator *sep) auto target_mob = actionable_targets.Select(c, local_entry->target_type, ENEMY); if (!target_mob) continue; - + if (spells[local_entry->spell_id].max[EFFECTIDTOINDEX(1)] < target_mob->GetLevel()) continue; @@ -3850,7 +3851,7 @@ void bot_command_movement_speed(Client *c, const Seperator *sep) cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id); break; } - + helper_no_available_bots(c, my_bot); } @@ -3859,7 +3860,7 @@ void bot_command_owner_option(Client *c, const Seperator *sep) if (helper_is_help_or_usage(sep->arg[1])) { c->Message(m_usage, "usage: %s [option] [argument]", sep->arg[0]); - + std::string window_title = "Bot Owner Options"; std::string window_text = "" @@ -3944,7 +3945,7 @@ void bot_command_owner_option(Client *c, const Seperator *sep) "" "" "
show current settings
"; - + c->SendPopupToClient(window_title.c_str(), window_text.c_str()); return; @@ -3964,7 +3965,7 @@ void bot_command_owner_option(Client *c, const Seperator *sep) else { c->SetBotOption(Client::booDeathMarquee, !c->GetBotOption(Client::booDeathMarquee)); } - + database.botdb.SaveOwnerOption(c->CharacterID(), Client::booDeathMarquee, c->GetBotOption(Client::booDeathMarquee)); c->Message(m_action, "Bot 'death marquee' is now %s.", (c->GetBotOption(Client::booDeathMarquee) == true ? "enabled" : "disabled")); @@ -4054,7 +4055,7 @@ void bot_command_owner_option(Client *c, const Seperator *sep) c->Message(m_action, "Bot 'spawn message' is now %s.", argument.c_str()); } else if (!owner_option.compare("altcombat")) { - + if (RuleB(Bots, AllowOwnerOptionAltCombat)) { if (!argument.compare("enable")) { @@ -4130,7 +4131,7 @@ void bot_command_owner_option(Client *c, const Seperator *sep) c->Message(m_action, "Bot 'monk wu message' is now %s.", (c->GetBotOption(Client::booMonkWuMessage) == true ? "enabled" : "disabled")); } else if (!owner_option.compare("current")) { - + std::string window_title = "Current Bot Owner Options Settings"; std::string window_text = fmt::format( "" @@ -4156,7 +4157,7 @@ void bot_command_owner_option(Client *c, const Seperator *sep) (c->GetBotOption(Client::booBuffCounter) ? "enabled" : "disabled"), (c->GetBotOption(Client::booMonkWuMessage) ? "enabled" : "disabled") ); - + c->SendPopupToClient(window_title.c_str(), window_text.c_str()); } else { @@ -4172,7 +4173,7 @@ void bot_command_pet(Client *c, const Seperator *sep) subcommand_list.push_back("petremove"); subcommand_list.push_back("petsettype"); /* VS2012 code - end */ - + /* VS2013 code const std::list subcommand_list = { "petgetlost", "petremove", "petsettype" }; */ @@ -4205,7 +4206,7 @@ void bot_command_pick_lock(Client *c, const Seperator *sep) } Bot* my_bot = sbl.front(); - + my_bot->InterruptSpell(); Bot::BotGroupSay(my_bot, "Attempting to pick the lock.."); @@ -4310,7 +4311,7 @@ void bot_command_pull(Client *c, const Seperator *sep) if (bot_iter->GetAppearance() == eaDead || bot_iter->GetBotStance() == EQEmu::constants::stancePassive) { continue; } - + switch (bot_iter->GetClass()) { case ROGUE: case MONK: @@ -4385,7 +4386,7 @@ void bot_command_pull(Client *c, const Seperator *sep) if (bot_puller) { bot_puller->SetPullFlag(); } - + helper_no_available_bots(c, bot_puller); } @@ -4452,7 +4453,7 @@ void bot_command_resistance(Client *c, const Seperator *sep) return true; if (_l->resist_value[RESISTANCEIDTOINDEX(resistance_type)] == _r->resist_value[RESISTANCEIDTOINDEX(resistance_type)] && spells[_l->spell_id].mana == spells[_r->spell_id].mana && _l->resist_total > _r->resist_total) return true; - + return false; }); @@ -4480,14 +4481,14 @@ void bot_command_resistance(Client *c, const Seperator *sep) cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id); break; } - + helper_no_available_bots(c, my_bot); } void bot_command_resurrect(Client *c, const Seperator *sep) { // Obscure bot spell code prohibits the aoe portion from working correctly... - + bcst_list* local_list = &bot_command_spells[BCEnum::SpT_Resurrect]; if (helper_spell_list_fail(c, local_list, BCEnum::SpT_Resurrect) || helper_command_alias_fail(c, "bot_command_resurrect", sep->arg[0], "resurrect")) return; @@ -4516,7 +4517,7 @@ void bot_command_resurrect(Client *c, const Seperator *sep) // continue; if (local_entry->aoe) continue; - + auto target_mob = actionable_targets.Select(c, local_entry->target_type, FRIENDLY); //if (!target_mob && !local_entry->aoe) // continue; @@ -4573,14 +4574,14 @@ void bot_command_rune(Client *c, const Seperator *sep) cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id); break; } - + helper_no_available_bots(c, my_bot); } void bot_command_send_home(Client *c, const Seperator *sep) { // Obscure bot spell code prohibits the aoe portion from working correctly... - + bcst_list* local_list = &bot_command_spells[BCEnum::SpT_SendHome]; if (helper_spell_list_fail(c, local_list, BCEnum::SpT_SendHome) || helper_command_alias_fail(c, "bot_command_send_home", sep->arg[0], "sendhome")) return; @@ -4607,7 +4608,7 @@ void bot_command_send_home(Client *c, const Seperator *sep) continue; if (local_entry->group != group) continue; - + auto target_mob = actionable_targets.Select(c, local_entry->target_type, FRIENDLY); if (!target_mob) continue; @@ -4668,7 +4669,7 @@ void bot_command_size(Client *c, const Seperator *sep) cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id); break; } - + helper_no_available_bots(c, my_bot); } @@ -4679,7 +4680,7 @@ void bot_command_summon_corpse(Client *c, const Seperator *sep) // temp c->Message(m_fail, "This command is currently unavailable..."); return; - + bcst_list* local_list = &bot_command_spells[BCEnum::SpT_SummonCorpse]; if (helper_spell_list_fail(c, local_list, BCEnum::SpT_SummonCorpse) || helper_command_alias_fail(c, "bot_command_summon_corpse", sep->arg[0], "summoncorpse")) return; @@ -4698,7 +4699,7 @@ void bot_command_summon_corpse(Client *c, const Seperator *sep) auto local_entry = list_iter; if (helper_spell_check_fail(local_entry)) continue; - + auto target_mob = ActionableTarget::AsSingle_ByPlayer(c); if (!target_mob) continue; @@ -4711,7 +4712,7 @@ void bot_command_summon_corpse(Client *c, const Seperator *sep) continue; cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id); - + break; } @@ -4771,12 +4772,12 @@ void bot_command_taunt(Client *c, const Seperator *sep) if (ActionableBots::PopulateSBL(c, sep->arg[ab_arg], sbl, ab_mask, sep->arg[(ab_arg + 1)]) == ActionableBots::ABT_None) return; sbl.remove(nullptr); - + int taunting_count = 0; for (auto bot_iter : sbl) { if (!bot_iter->GetSkill(EQEmu::skills::SkillTaunt)) continue; - + if (toggle_taunt) bot_iter->SetTaunting(!bot_iter->IsTaunting()); else @@ -4814,10 +4815,10 @@ void bot_command_track(Client *c, const Seperator *sep) std::list sbl; MyBots::PopulateSBL_BySpawnedBots(c, sbl); - + uint16 class_mask = (PLAYER_CLASS_RANGER_BIT | PLAYER_CLASS_DRUID_BIT | PLAYER_CLASS_BARD_BIT); ActionableBots::Filter_ByClasses(c, sbl, class_mask); - + Bot* my_bot = ActionableBots::AsSpawned_ByMinLevelAndClass(c, sbl, 1, RANGER); if (tracking_scope.empty()) { if (!my_bot) @@ -4903,7 +4904,7 @@ void bot_command_water_breathing(Client *c, const Seperator *sep) cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id); break; } - + helper_no_available_bots(c, my_bot); } @@ -4926,14 +4927,14 @@ void bot_subcommand_bot_appearance(Client *c, const Seperator *sep) subcommand_list.push_back("bottattoo"); subcommand_list.push_back("botwoad"); /* VS2012 code - end */ - + /* VS2013 code const std::list subcommand_list = { "botbeardcolor", "botbeardstyle", "botdetails", "boteyes", "botface", "bothaircolor", "bothairstyle", "botheritage", "bottattoo", "botwoad" }; */ - + if (helper_command_alias_fail(c, "bot_subcommand_bot_appearance", sep->arg[0], "botappearance")) return; @@ -5102,7 +5103,7 @@ void bot_subcommand_bot_clone(Client *c, const Seperator *sep) if (!database.botdb.CreateCloneBotInventory(c->CharacterID(), my_bot->GetBotID(), clone_id)) c->Message(m_fail, "%s for clone '%s'", BotDatabase::fail::CreateCloneBotInventory(), bot_name.c_str()); - + c->Message(m_action, "Bot '%s' was successfully cloned to bot '%s'", my_bot->GetCleanName(), bot_name.c_str()); } @@ -5257,7 +5258,7 @@ void bot_subcommand_bot_delete(Client *c, const Seperator *sep) void bot_subcommand_bot_details(Client *c, const Seperator *sep) { // TODO: Trouble-shoot model update issue - + if (helper_command_alias_fail(c, "bot_subcommand_bot_details", sep->arg[0], "botdetails")) return; if (helper_is_help_or_usage(sep->arg[1])) { @@ -5296,10 +5297,10 @@ void bot_subcommand_bot_details(Client *c, const Seperator *sep) void bot_subcommand_bot_dye_armor(Client *c, const Seperator *sep) { // TODO: Trouble-shoot model update issue - + const std::string msg_matslot = StringFormat("mat_slot: %c(All), %i(Head), %i(Chest), %i(Arms), %i(Wrists), %i(Hands), %i(Legs), %i(Feet)", '*', EQEmu::textures::armorHead, EQEmu::textures::armorChest, EQEmu::textures::armorArms, EQEmu::textures::armorWrist, EQEmu::textures::armorHands, EQEmu::textures::armorLegs, EQEmu::textures::armorFeet); - + if (helper_command_alias_fail(c, "bot_subcommand_bot_dye_armor", sep->arg[0], "botdyearmor")) return; if (helper_is_help_or_usage(sep->arg[1])) { @@ -5377,7 +5378,7 @@ void bot_subcommand_bot_dye_armor(Client *c, const Seperator *sep) void bot_subcommand_bot_eyes(Client *c, const Seperator *sep) { // TODO: Trouble-shoot model update issue - + // not sure if left/right bias is allowed in pc-type entities (something is keeping them from being different) if (helper_command_alias_fail(c, "bot_subcommand_bot_eyes", sep->arg[0], "boteyes")) return; @@ -5611,7 +5612,7 @@ void bot_subcommand_bot_hairstyle(Client *c, const Seperator *sep) void bot_subcommand_bot_heritage(Client *c, const Seperator *sep) { // TODO: Trouble-shoot model update issue - + if (helper_command_alias_fail(c, "bot_subcommand_bot_heritage", sep->arg[0], "botheritage")) return; if (helper_is_help_or_usage(sep->arg[1])) { @@ -5640,7 +5641,7 @@ void bot_subcommand_bot_heritage(Client *c, const Seperator *sep) fail_type = BCEnum::AFT_Value; else my_bot->SetDrakkinHeritage(uvalue); - + if (helper_bot_appearance_fail(c, my_bot, fail_type, "heritage")) return; @@ -5856,7 +5857,7 @@ void bot_subcommand_bot_out_of_combat(Client *c, const Seperator *sep) bot_iter->SetAltOutOfCombatBehavior(!bot_iter->GetAltOutOfCombatBehavior()); else bot_iter->SetAltOutOfCombatBehavior(behavior_state); - + helper_bot_out_of_combat(c, bot_iter); } } @@ -6069,7 +6070,7 @@ void bot_subcommand_bot_spawn(Client *c, const Seperator *sep) c->Message(m_fail, "You can't spawn bots while you are engaged."); return; } - + //if (c->IsEngaged()) { // c->Message(m_fail, "You can't spawn bots while you are engaged."); // return; @@ -6143,7 +6144,7 @@ void bot_subcommand_bot_stance(Client *c, const Seperator *sep) bool current_flag = false; auto bst = EQEmu::constants::stanceUnknown; - + if (!strcasecmp(sep->arg[1], "current")) current_flag = true; else if (sep->IsNumber(1)) { @@ -6268,7 +6269,7 @@ void bot_subcommand_bot_summon(Client *c, const Seperator *sep) void bot_subcommand_bot_tattoo(Client *c, const Seperator *sep) { // TODO: Trouble-shoot model update issue - + if (helper_command_alias_fail(c, "bot_subcommand_bot_tattoo", sep->arg[0], "bottattoo")) return; if (helper_is_help_or_usage(sep->arg[1])) { @@ -6336,7 +6337,7 @@ void bot_subcommand_bot_toggle_archer(Client *c, const Seperator *sep) for (auto bot_iter : sbl) { if (!bot_iter) continue; - + if (toggle_archer) bot_iter->SetBotArcher(!bot_iter->IsBotArcher()); else @@ -6925,7 +6926,7 @@ void bot_subcommand_botgroup_load(Client *c, const Seperator *sep) safe_delete(botgroup_leader); return; } - + Group* group_inst = new Group(botgroup_leader); entity_list.AddGroup(group_inst); @@ -7052,7 +7053,7 @@ void bot_subcommand_circle(Client *c, const Seperator *sep) cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id); break; } - + helper_no_available_bots(c, my_bot); } @@ -7536,7 +7537,7 @@ void bot_subcommand_heal_rotation_create(Client *c, const Seperator *sep) sep->arg[0], CASTING_CYCLE_DEFAULT_INTERVAL_S, CASTING_CYCLE_MINIMUM_INTERVAL_S, CASTING_CYCLE_MAXIMUM_INTERVAL_S); return; } - + std::string interval_arg; std::string fast_heals_arg; std::string adaptive_targeting_arg; @@ -7594,10 +7595,10 @@ void bot_subcommand_heal_rotation_create(Client *c, const Seperator *sep) hr_fast_heals = true; hr_interval_s = atoi(interval_arg.c_str()); } - + if (hr_interval_s < CASTING_CYCLE_MINIMUM_INTERVAL_S || hr_interval_s > CASTING_CYCLE_MAXIMUM_INTERVAL_S) hr_interval_s = CASTING_CYCLE_DEFAULT_INTERVAL_S; - + hr_interval_s *= 1000; // convert to milliseconds for Bot/HealRotation constructor if (!creator_member->CreateHealRotation(hr_interval_s, hr_fast_heals, hr_adaptive_targeting, hr_casting_override)) { @@ -7613,12 +7614,12 @@ void bot_subcommand_heal_rotation_create(Client *c, const Seperator *sep) if (!database.botdb.LoadHealRotation(creator_member, member_list, target_list, load_flag, member_fail, target_fail)) c->Message(m_fail, "%s", BotDatabase::fail::LoadHealRotation()); - + if (!load_flag) { c->Message(m_action, "Successfully added %s as a current member to a new Heal Rotation", creator_member->GetCleanName()); return; } - + if (!member_fail) { MyBots::PopulateSBL_BySpawnedBots(c, sbl); for (auto member_iter : member_list) { @@ -7663,7 +7664,7 @@ void bot_subcommand_heal_rotation_create(Client *c, const Seperator *sep) else { c->Message(m_fail, "%s", BotDatabase::fail::LoadHealRotationTargets()); } - + c->Message(m_action, "Successfully loaded %s's Heal Rotation", creator_member->GetCleanName()); } @@ -8198,7 +8199,7 @@ void bot_subcommand_inventory_list(Client *c, const Seperator *sep) c->Message(m_message, "I need something for my %s (slot %i)", EQEmu::invslot::GetInvPossessionsSlotName(i), i); continue; } - + item = inst->GetItem(); if ((i == EQEmu::invslot::slotPrimary) && item->IsType2HWeapon()) { is2Hweapon = true; @@ -8272,7 +8273,7 @@ void bot_subcommand_inventory_remove(Client *c, const Seperator *sep) c->MessageString(Chat::White, PICK_LORE); return; } - + std::string error_message; if (itm) { c->PushItemOnCursor(*itminst, true); @@ -8517,7 +8518,7 @@ void bot_subcommand_pet_set_type(Client *c, const Seperator *sep) c->Message(m_fail, "You have no spawned Magician bots capable of using this pet type: '%s'", pet_arg.c_str()); return; } - + uint16 reclaim_energy_id = 331; for (auto bot_iter : sbl) { if (!bot_iter) @@ -8588,7 +8589,7 @@ void bot_subcommand_portal(Client *c, const Seperator *sep) cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id); break; } - + helper_no_available_bots(c, my_bot); } diff --git a/zone/bot_database.cpp b/zone/bot_database.cpp index 28b5288e0..67aa709fa 100644 --- a/zone/bot_database.cpp +++ b/zone/bot_database.cpp @@ -24,6 +24,7 @@ #include "../common/eqemu_logsys.h" #include "zonedb.h" +#include "zone_store.h" #include "bot.h" #include "client.h" @@ -192,7 +193,7 @@ bool BotDatabase::QueryBotCount(const uint32 owner_id, uint32& bot_count) return false; if (!results.RowCount()) return true; - + auto row = results.begin(); bot_count = atoi(row[0]); @@ -314,7 +315,7 @@ bool BotDatabase::LoadBotID(const uint32 owner_id, const std::string& bot_name, return false; if (!results.RowCount()) return true; - + auto row = results.begin(); bot_id = atoi(row[0]); @@ -451,7 +452,7 @@ bool BotDatabase::SaveNewBot(Bot* bot_inst, uint32& bot_id) { if (!bot_inst) return false; - + query = StringFormat( "INSERT INTO `bot_data` (" " `owner_id`," @@ -596,7 +597,7 @@ bool BotDatabase::SaveBot(Bot* bot_inst) { if (!bot_inst) return false; - + query = StringFormat( "UPDATE `bot_data`" " SET" @@ -1014,7 +1015,7 @@ bool BotDatabase::LoadTimers(Bot* bot_inst) if (timer_id >= 0 && timer_id < MaxTimer && timer_value < (Timer::GetCurrentTime() + max_value)) bot_timers[timer_id] = timer_value; } - + return true; } @@ -1127,7 +1128,7 @@ bool BotDatabase::QueryInventoryCount(const uint32 bot_id, uint32& item_count) { if (!bot_id) return false; - + query = StringFormat("SELECT COUNT(`inventories_index`) FROM `bot_inventories` WHERE `bot_id` = '%u'", bot_id); auto results = database.QueryDatabase(query); if (!results.Success()) @@ -1173,7 +1174,7 @@ bool BotDatabase::LoadItems(const uint32 bot_id, EQEmu::InventoryProfile& invent return false; if (!results.RowCount()) return true; - + for (auto row = results.begin(); row != results.end(); ++row) { int16 slot_id = atoi(row[0]); if (slot_id < EQEmu::invslot::EQUIPMENT_BEGIN || slot_id > EQEmu::invslot::EQUIPMENT_END) @@ -1281,7 +1282,7 @@ bool BotDatabase::LoadItemBySlot(const uint32 bot_id, const uint32 slot_id, uint { if (!bot_id || slot_id > EQEmu::invslot::EQUIPMENT_END) return false; - + query = StringFormat("SELECT `item_id` FROM `bot_inventories` WHERE `bot_id` = '%i' AND `slot_id` = '%i' LIMIT 1", bot_id, slot_id); auto results = database.QueryDatabase(query); if (!results.Success()) @@ -1305,11 +1306,11 @@ bool BotDatabase::SaveItemBySlot(Bot* bot_inst, const uint32 slot_id, const EQEm if (!item_inst || !item_inst->GetID()) return true; - + uint32 augment_id[EQEmu::invaug::SOCKET_COUNT] = { 0, 0, 0, 0, 0, 0 }; for (int augment_iter = EQEmu::invaug::SOCKET_BEGIN; augment_iter <= EQEmu::invaug::SOCKET_END; ++augment_iter) augment_id[augment_iter] = item_inst->GetAugmentItemID(augment_iter); - + uint16 item_charges = 0; if (item_inst->GetCharges() >= 0) item_charges = item_inst->GetCharges(); @@ -1400,7 +1401,7 @@ bool BotDatabase::LoadEquipmentColor(const uint32 bot_id, const uint8 material_s int16 slot_id = EQEmu::InventoryProfile::CalcSlotFromMaterial(material_slot_id); if (slot_id == INVALID_INDEX) return false; - + query = StringFormat("SELECT `inst_color` FROM `bot_inventories` WHERE `bot_id` = '%u' AND `slot_id` = '%u' LIMIT 1", bot_id, slot_id); auto results = database.QueryDatabase(query); if (!results.Success()) @@ -1451,7 +1452,7 @@ bool BotDatabase::LoadPetIndex(const uint32 bot_id, uint32& pet_index) { if (!bot_id) return false; - + query = StringFormat("SELECT `pets_index` FROM `bot_pets` WHERE `bot_id` = '%u' LIMIT 1", bot_id); auto results = database.QueryDatabase(query); if (!results.Success()) @@ -1461,7 +1462,7 @@ bool BotDatabase::LoadPetIndex(const uint32 bot_id, uint32& pet_index) auto row = results.begin(); pet_index = atoi(row[0]); - + return true; } @@ -1479,7 +1480,7 @@ bool BotDatabase::LoadPetSpellID(const uint32 bot_id, uint32& pet_spell_id) auto row = results.begin(); pet_spell_id = atoi(row[0]); - + return true; } @@ -1506,7 +1507,7 @@ bool BotDatabase::LoadPetStats(const uint32 bot_id, std::string& pet_name, uint3 pet_name = row[1]; pet_mana = atoi(row[2]); pet_hp = atoi(row[3]); - + return true; } @@ -1514,7 +1515,7 @@ bool BotDatabase::SavePetStats(const uint32 bot_id, const std::string& pet_name, { if (!bot_id || pet_name.empty() || !pet_spell_id || pet_spell_id > SPDAT_RECORDS) return false; - + if (!DeletePetItems(bot_id)) return false; if (!DeletePetBuffs(bot_id)) @@ -1607,14 +1608,14 @@ bool BotDatabase::LoadPetBuffs(const uint32 bot_id, SpellBuff_Struct* pet_buffs) ++buff_index; } - + return true; } bool BotDatabase::SavePetBuffs(const uint32 bot_id, const SpellBuff_Struct* pet_buffs, bool delete_flag) { // Only use 'delete_flag' if not invoked after a botdb.SavePetStats() call - + if (!bot_id || !pet_buffs) return false; @@ -1701,14 +1702,14 @@ bool BotDatabase::LoadPetItems(const uint32 bot_id, uint32* pet_items) pet_items[item_index] = atoi(row[0]); ++item_index; } - + return true; } bool BotDatabase::SavePetItems(const uint32 bot_id, const uint32* pet_items, bool delete_flag) { // Only use 'delete_flag' if not invoked after a botdb.SavePetStats() call - + if (!bot_id || !pet_items) return false; @@ -1777,7 +1778,7 @@ bool BotDatabase::LoadInspectMessage(const uint32 bot_id, InspectMessage_Struct& return true; memcpy(inspect_message.text, bot_message.c_str(), bot_message.size()); - + return true; } @@ -1785,7 +1786,7 @@ bool BotDatabase::SaveInspectMessage(const uint32 bot_id, const InspectMessage_S { if (!bot_id) return false; - + if (!DeleteInspectMessage(bot_id)) return false; @@ -1825,7 +1826,7 @@ bool BotDatabase::SaveAllInspectMessages(const uint32 owner_id, const InspectMes if (!DeleteAllInspectMessages(owner_id)) return false; - + std::string bot_message = inspect_message.text; if (bot_message.size() > 255) bot_message = bot_message.substr(0, 255); @@ -1907,7 +1908,7 @@ bool BotDatabase::SaveHelmAppearance(const uint32 owner_id, const uint32 bot_id, { if (!owner_id || !bot_id) return false; - + query = StringFormat( "UPDATE `bot_data`" " SET `show_helm` = '%u'" @@ -2025,7 +2026,7 @@ bool BotDatabase::CreateCloneBot(const uint32 owner_id, const uint32 bot_id, con { if (!owner_id || !bot_id || clone_name.empty()) return false; - + query = StringFormat( "INSERT INTO `bot_data`" " (" @@ -2198,7 +2199,7 @@ bool BotDatabase::CreateCloneBotInventory(const uint32 owner_id, const uint32 bo DeleteItems(clone_id); return false; } - + return true; } @@ -2237,7 +2238,7 @@ bool BotDatabase::LoadOwnerOptions(Client *owner) } for (auto row : results) { - + owner->SetBotOption(static_cast(atoul(row[0])), (atoul(row[1]) != 0)); } @@ -2369,7 +2370,7 @@ bool BotDatabase::LoadBotGroupIDByLeaderID(const uint32 leader_id, uint32& botgr auto row = results.begin(); botgroup_id = atoi(row[0]); - + return true; } @@ -2387,7 +2388,7 @@ bool BotDatabase::LoadBotGroupIDByMemberID(const uint32 member_id, uint32& botgr auto row = results.begin(); botgroup_id = atoi(row[0]); - + return true; } @@ -2405,7 +2406,7 @@ bool BotDatabase::LoadLeaderIDByBotGroupName(const std::string& group_name, uint auto row = results.begin(); leader_id = atoi(row[0]); - + return true; } @@ -2423,7 +2424,7 @@ bool BotDatabase::LoadLeaderIDByBotGroupID(const uint32 group_id, uint32& leader auto row = results.begin(); leader_id = atoi(row[0]); - + return true; } @@ -2441,7 +2442,7 @@ bool BotDatabase::LoadBotGroupNameByBotGroupID(const uint32 group_id, std::strin auto row = results.begin(); botgroup_name = row[0]; - + return true; } @@ -2459,7 +2460,7 @@ bool BotDatabase::LoadBotGroupNameByLeaderID(const uint32 leader_id, std::string auto row = results.begin(); botgroup_name = row[0]; - + return true; } @@ -2603,7 +2604,7 @@ bool BotDatabase::LoadBotGroup(const std::string& group_name, std::mapZoneID = content_db.GetZoneID(Spell.teleport_zone); + PendingTranslocateData.zone_id = ts->ZoneID = ZoneID(Spell.teleport_zone); PendingTranslocateData.instance_id = 0; PendingTranslocateData.y = ts->y = Spell.base[0]; PendingTranslocateData.x = ts->x = Spell.base[1]; @@ -5287,7 +5288,7 @@ void Client::SetStartZone(uint32 zoneid, float x, float y, float z) } // check to make sure the zone is valid - const char *target_zone_name = content_db.GetZoneName(zoneid); + const char *target_zone_name = ZoneName(zoneid); if(target_zone_name == nullptr) return; @@ -5297,7 +5298,7 @@ void Client::SetStartZone(uint32 zoneid, float x, float y, float z) } if (x == 0 && y == 0 && z == 0) { - content_db.GetSafePoints(m_pp.binds[4].zoneId, 0, &m_pp.binds[4].x, &m_pp.binds[4].y, &m_pp.binds[4].z); + content_db.GetSafePoints(ZoneName(m_pp.binds[4].zoneId), 0, &m_pp.binds[4].x, &m_pp.binds[4].y, &m_pp.binds[4].z); } else { m_pp.binds[4].x = x; @@ -9298,7 +9299,7 @@ void Client::SetBotOption(BotOwnerOption boo, bool flag) { void Client::SendToGuildHall() { std::string zone_short_name = "guildhall"; - uint32 zone_id = content_db.GetZoneID(zone_short_name.c_str()); + uint32 zone_id = ZoneID(zone_short_name.c_str()); if (zone_id == 0) { return; } diff --git a/zone/client.h b/zone/client.h index 960656175..6a7a68b51 100644 --- a/zone/client.h +++ b/zone/client.h @@ -58,6 +58,7 @@ namespace EQEmu #include "questmgr.h" #include "zone.h" #include "zonedb.h" +#include "zone_store.h" #ifdef _WINDOWS // since windows defines these within windef.h (which windows.h include) diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index 05a51f8a5..f152bf61c 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -790,7 +790,7 @@ void Client::CompleteConnect() //enforce some rules.. if (!CanBeInZone()) { LogDebug("[CLIENT] Kicking char from zone, not allowed here"); - GoToSafeCoords(content_db.GetZoneID("arena"), 0); + GoToSafeCoords(ZoneID("arena"), 0); return; } @@ -6419,7 +6419,7 @@ void Client::Handle_OP_GMZoneRequest(const EQApplicationPacket *app) uint16 zid = gmzr->zone_id; if (gmzr->zone_id == 0) zid = zonesummon_id; - const char * zname = content_db.GetZoneName(zid); + const char * zname = ZoneName(zid); if (zname == nullptr) tarzone[0] = 0; else @@ -12441,7 +12441,7 @@ void Client::Handle_OP_SetStartCity(const EQApplicationPacket *app) { // if the character has a start city, don't let them use the command if (m_pp.binds[4].zoneId != 0 && m_pp.binds[4].zoneId != 189) { - Message(Chat::Yellow, "Your home city has already been set.", m_pp.binds[4].zoneId, content_db.GetZoneName(m_pp.binds[4].zoneId)); + Message(Chat::Yellow, "Your home city has already been set.", m_pp.binds[4].zoneId, ZoneName(m_pp.binds[4].zoneId)); return; } @@ -12507,7 +12507,7 @@ void Client::Handle_OP_SetStartCity(const EQApplicationPacket *app) zoneid = atoi(row[0]); char* name = nullptr; - content_db.GetZoneLongName(content_db.GetZoneName(zoneid), &name); + content_db.GetZoneLongName(ZoneName(zoneid), &name); Message(Chat::Yellow, "%d - %s", zoneid, name); } diff --git a/zone/client_process.cpp b/zone/client_process.cpp index b380ae497..a63174705 100644 --- a/zone/client_process.cpp +++ b/zone/client_process.cpp @@ -53,6 +53,7 @@ #include "worldserver.h" #include "zone.h" #include "zonedb.h" +#include "zone_store.h" extern QueryServ* QServ; extern Zone* zone; @@ -129,7 +130,7 @@ bool Client::Process() { CheckManaEndUpdate(); if (dead && dead_timer.Check()) { - database.MoveCharacterToZone(GetName(), content_db.GetZoneName(m_pp.binds[0].zoneId)); + database.MoveCharacterToZone(GetName(), m_pp.binds[0].zoneId); m_pp.zone_id = m_pp.binds[0].zoneId; m_pp.zoneInstance = m_pp.binds[0].instance_id; @@ -2087,7 +2088,7 @@ void Client::HandleRespawnFromHover(uint32 Option) m_pp.zone_id = chosen->zone_id; m_pp.zoneInstance = chosen->instance_id; - database.MoveCharacterToZone(CharacterID(), content_db.GetZoneName(chosen->zone_id)); + database.MoveCharacterToZone(CharacterID(), chosen->zone_id); Save(); diff --git a/zone/command.cpp b/zone/command.cpp index 317667168..634f01206 100755 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -1171,7 +1171,7 @@ void command_zone(Client *c, const Seperator *sep) return; } - zoneid = content_db.GetZoneID(sep->arg[1]); + zoneid = ZoneID(sep->arg[1]); if(zoneid == 0) { c->Message(Chat::White, "Unable to locate zone '%s'", sep->arg[1]); return; @@ -1306,7 +1306,7 @@ void command_peqzone(Client *c, const Seperator *sep) return; } else { - zoneid = content_db.GetZoneID(sep->arg[1]); + zoneid = ZoneID(sep->arg[1]); destzone = content_db.GetPEQZone(zoneid, 0); if(zoneid == 0) { c->Message(Chat::White, "Unable to locate zone '%s'", sep->arg[1]); @@ -1344,7 +1344,7 @@ void command_movechar(Client *c, const Seperator *sep) if (tmp) { if (c->Admin() >= commandMovecharSelfOnly || tmp == c->AccountID()) - if (!database.MoveCharacterToZone((char*) sep->arg[1], (char*) sep->arg[2])) + if (!database.MoveCharacterToZone((char*) sep->arg[1], ZoneID(sep->arg[2]))) c->Message(Chat::White, "Character Move Failed!"); else c->Message(Chat::White, "Character has been moved."); @@ -2105,7 +2105,7 @@ void command_zheader(Client *c, const Seperator *sep) if(sep->arg[1][0]==0) { c->Message(Chat::White, "Usage: #zheader "); } - else if(content_db.GetZoneID(sep->argplus[1])==0) + else if(ZoneID(sep->argplus[1])==0) c->Message(Chat::White, "Invalid Zone Name: %s", sep->argplus[1]); else { @@ -4290,7 +4290,7 @@ void command_zoneshutdown(Client *c, const Seperator *sep) if (sep->arg[1][0] >= '0' && sep->arg[1][0] <= '9') s->ZoneServerID = atoi(sep->arg[1]); else - s->zoneid = content_db.GetZoneID(sep->arg[1]); + s->zoneid = ZoneID(sep->arg[1]); worldserver.SendPacket(pack); safe_delete(pack); } @@ -4308,7 +4308,7 @@ void command_zonebootup(Client *c, const Seperator *sep) ServerZoneStateChange_struct* s = (ServerZoneStateChange_struct *) pack->pBuffer; s->ZoneServerID = atoi(sep->arg[1]); strcpy(s->adminname, c->GetName()); - s->zoneid = content_db.GetZoneID(sep->arg[2]); + s->zoneid = ZoneID(sep->arg[2]); s->makestatic = (bool) (strcasecmp(sep->arg[3], "static") == 0); worldserver.SendPacket(pack); safe_delete(pack); @@ -4491,7 +4491,7 @@ void command_zonelock(Client *c, const Seperator *sep) worldserver.SendPacket(pack); } else if (strcasecmp(sep->arg[1], "lock") == 0 && c->Admin() >= commandLockZones) { - uint16 tmp = content_db.GetZoneID(sep->arg[2]); + uint16 tmp = ZoneID(sep->arg[2]); if (tmp) { s->op = 1; s->zoneID = tmp; @@ -4501,7 +4501,7 @@ void command_zonelock(Client *c, const Seperator *sep) c->Message(Chat::White, "Usage: #zonelock lock [zonename]"); } else if (strcasecmp(sep->arg[1], "unlock") == 0 && c->Admin() >= commandLockZones) { - uint16 tmp = content_db.GetZoneID(sep->arg[2]); + uint16 tmp = ZoneID(sep->arg[2]); if (tmp) { s->op = 2; s->zoneID = tmp; @@ -4908,7 +4908,7 @@ void command_gmzone(Client *c, const Seperator *sep) const char *zone_short_name = sep->arg[1]; auto zone_version = static_cast(sep->arg[2] ? atoi(sep->arg[2]) : 0); std::string identifier = "gmzone"; - uint32 zone_id = content_db.GetZoneID(zone_short_name); + uint32 zone_id = ZoneID(zone_short_name); uint32 duration = 100000000; uint16 instance_id = 0; @@ -9206,7 +9206,7 @@ void command_flagedit(Client *c, const Seperator *sep) { if(sep->arg[2][0] != '\0') { zoneid = atoi(sep->arg[2]); if(zoneid < 1) { - zoneid = content_db.GetZoneID(sep->arg[2]); + zoneid = ZoneID(sep->arg[2]); } } if(zoneid < 1) { @@ -9231,7 +9231,7 @@ void command_flagedit(Client *c, const Seperator *sep) { return; } - c->Message(Chat::Yellow, "Success! Zone %s now requires a flag, named %s", content_db.GetZoneName(zoneid), flag_name); + c->Message(Chat::Yellow, "Success! Zone %s now requires a flag, named %s", ZoneName(zoneid), flag_name); return; } @@ -9240,7 +9240,7 @@ void command_flagedit(Client *c, const Seperator *sep) { if(sep->arg[2][0] != '\0') { zoneid = atoi(sep->arg[2]); if(zoneid < 1) { - zoneid = content_db.GetZoneID(sep->arg[2]); + zoneid = ZoneID(sep->arg[2]); } } @@ -9258,7 +9258,7 @@ void command_flagedit(Client *c, const Seperator *sep) { return; } - c->Message(Chat::Yellow, "Success! Zone %s no longer requires a flag.", content_db.GetZoneName(zoneid)); + c->Message(Chat::Yellow, "Success! Zone %s no longer requires a flag.", ZoneName(zoneid)); return; } @@ -9282,7 +9282,7 @@ void command_flagedit(Client *c, const Seperator *sep) { if(sep->arg[2][0] != '\0') { zoneid = atoi(sep->arg[2]); if(zoneid < 1) { - zoneid = content_db.GetZoneID(sep->arg[2]); + zoneid = ZoneID(sep->arg[2]); } } if(zoneid < 1) { @@ -9305,7 +9305,7 @@ void command_flagedit(Client *c, const Seperator *sep) { if(sep->arg[2][0] != '\0') { zoneid = atoi(sep->arg[2]); if(zoneid < 1) { - zoneid = content_db.GetZoneID(sep->arg[2]); + zoneid = ZoneID(sep->arg[2]); } } if(zoneid < 1) { @@ -9770,7 +9770,7 @@ void command_setgraveyard(Client *c, const Seperator *sep) return; } - zoneid = content_db.GetZoneID(sep->arg[1]); + zoneid = ZoneID(sep->arg[1]); if(zoneid > 0) { graveyard_id = content_db.CreateGraveyardRecord(zoneid, t->GetPosition()); @@ -9806,7 +9806,7 @@ void command_deletegraveyard(Client *c, const Seperator *sep) return; } - zoneid = content_db.GetZoneID(sep->arg[1]); + zoneid = ZoneID(sep->arg[1]); graveyard_id = content_db.GetZoneGraveyardID(zoneid, 0); if(zoneid > 0 && graveyard_id > 0) { @@ -10211,12 +10211,12 @@ void command_instance(Client *c, const Seperator *sep) } else { - zone_id = content_db.GetZoneID(sep->arg[2]); + zone_id = ZoneID(sep->arg[2]); } uint32 version = atoi(sep->arg[3]); uint32 duration = atoi(sep->arg[4]); - zn = content_db.GetZoneName(zone_id); + zn = ZoneName(zone_id); if(!zn) { @@ -10371,7 +10371,7 @@ void command_setstartzone(Client *c, const Seperator *sep) startzone = 0; } else { - startzone = content_db.GetZoneID(sep->arg[1]); + startzone = ZoneID(sep->arg[1]); if(startzone == 0) { c->Message(Chat::White, "Unable to locate zone '%s'", sep->arg[1]); return; diff --git a/zone/corpse.cpp b/zone/corpse.cpp index 9ab4fed0b..d6d48a724 100644 --- a/zone/corpse.cpp +++ b/zone/corpse.cpp @@ -141,7 +141,7 @@ Corpse* Corpse::LoadCharacterCorpseEntity(uint32 in_dbid, uint32 in_charid, std: pc->consented_guild_id = guild_consent_id; pc->UpdateEquipmentLight(); // itemlist populated above..need to determine actual values - + safe_delete_array(pcs); return pc; @@ -339,7 +339,7 @@ Corpse::Corpse(Client* client, int32 in_rezexp) : Mob ( // TODO soulbound items need not be added to corpse, but they need // to go into the regular slots on the player, out of bags std::list removed_list; - + // ideally, we would start at invslot::slotGeneral1 and progress to invslot::slotCursor.. // ..then regress and process invslot::EQUIPMENT_BEGIN through invslot::EQUIPMENT_END... // without additional work to database loading of player corpses, this order is not @@ -837,7 +837,7 @@ bool Corpse::Process() { spc->zone_id = zone->graveyard_zoneid(); worldserver.SendPacket(pack); safe_delete(pack); - LogDebug("Moved [{}] player corpse to the designated graveyard in zone [{}]", this->GetName(), content_db.GetZoneName(zone->graveyard_zoneid())); + LogDebug("Moved [{}] player corpse to the designated graveyard in zone [{}]", this->GetName(), ZoneName(zone->graveyard_zoneid())); corpse_db_id = 0; } @@ -941,7 +941,7 @@ void Corpse::MakeLootRequestPackets(Client* client, const EQApplicationPacket* a SendLootReqErrorPacket(client, LootResponse::TooFar); return; } - + if (being_looted_by != 0xFFFFFFFF && being_looted_by != client->GetID()) { SendLootReqErrorPacket(client, LootResponse::SomeoneElse); return; @@ -1078,16 +1078,16 @@ void Corpse::MakeLootRequestPackets(Client* client, const EQApplicationPacket* a auto loot_slot = EQEmu::invslot::CORPSE_BEGIN; auto corpse_mask = client->GetInv().GetLookup()->CorpseBitmask; - + for (auto item_data : itemlist) { // every loot session must either set all items' lootslots to 'invslot::SLOT_INVALID' // or to a valid enumerated client-versioned corpse slot (lootslot is not equip_slot) item_data->lootslot = 0xFFFF; - + // align server and client corpse slot mappings so translators can function properly while (loot_slot <= EQEmu::invslot::CORPSE_END && (((uint64)1 << loot_slot) & corpse_mask) == 0) ++loot_slot; - + if (loot_slot > EQEmu::invslot::CORPSE_END) continue; @@ -1098,7 +1098,7 @@ void Corpse::MakeLootRequestPackets(Client* client, const EQApplicationPacket* a if (item_data->equip_slot < EQEmu::invslot::POSSESSIONS_BEGIN || item_data->equip_slot > EQEmu::invslot::POSSESSIONS_END) continue; } - + const auto *item = database.GetItem(item_data->item_id); auto inst = database.CreateItem( item, @@ -1121,7 +1121,7 @@ void Corpse::MakeLootRequestPackets(Client* client, const EQApplicationPacket* a client->SendItemPacket(loot_slot, inst, ItemPacketLoot); safe_delete(inst); - + item_data->lootslot = loot_slot++; } @@ -1574,21 +1574,21 @@ void Corpse::UpdateEquipmentLight() for (auto iter = itemlist.begin(); iter != itemlist.end(); ++iter) { if ((*iter)->equip_slot < EQEmu::invslot::EQUIPMENT_BEGIN || (*iter)->equip_slot > EQEmu::invslot::EQUIPMENT_END) { continue; } if ((*iter)->equip_slot == EQEmu::invslot::slotAmmo) { continue; } - + auto item = database.GetItem((*iter)->item_id); if (item == nullptr) { continue; } - + if (EQEmu::lightsource::IsLevelGreater(item->Light, m_Light.Type[EQEmu::lightsource::LightEquipment])) m_Light.Type[EQEmu::lightsource::LightEquipment] = item->Light; } - + uint8 general_light_type = 0; for (auto iter = itemlist.begin(); iter != itemlist.end(); ++iter) { if ((*iter)->equip_slot < EQEmu::invslot::GENERAL_BEGIN || (*iter)->equip_slot > EQEmu::invslot::GENERAL_END) { continue; } - + auto item = database.GetItem((*iter)->item_id); if (item == nullptr) { continue; } - + if (!item->IsClassCommon()) { continue; } if (item->Light < 9 || item->Light > 13) { continue; } diff --git a/zone/data_bucket.cpp b/zone/data_bucket.cpp index 1ccb21953..b0d45080b 100644 --- a/zone/data_bucket.cpp +++ b/zone/data_bucket.cpp @@ -2,6 +2,7 @@ #include #include "../common/string_util.h" #include "zonedb.h" +#include "zone_store.h" #include #include #include @@ -172,4 +173,4 @@ uint32 DataBucket::ParseStringTimeToInt(std::string time_string) duration = unit * 31556926; return duration; -} \ No newline at end of file +} diff --git a/zone/doors.cpp b/zone/doors.cpp index 82521aac2..9fb5ea456 100644 --- a/zone/doors.cpp +++ b/zone/doors.cpp @@ -28,6 +28,7 @@ #include "string_ids.h" #include "worldserver.h" #include "zonedb.h" +#include "zone_store.h" #include "../common/repositories/criteria/content_filter_criteria.h" #include @@ -452,7 +453,7 @@ void Doors::HandleClick(Client* sender, uint8 trigger) { if (!disable_add_to_key_ring) { sender->KeyRingAdd(player_key); } - if (content_db.GetZoneID(destination_zone_name) == zone->GetZoneID()) { + if (ZoneID(destination_zone_name) == zone->GetZoneID()) { sender->MovePC( zone->GetZoneID(), zone->GetInstanceID(), @@ -463,7 +464,7 @@ void Doors::HandleClick(Client* sender, uint8 trigger) { ); } else { sender->MovePC( - content_db.GetZoneID(destination_zone_name), + ZoneID(destination_zone_name), static_cast(destination_instance_id), m_Destination.x, m_Destination.y, @@ -474,7 +475,7 @@ void Doors::HandleClick(Client* sender, uint8 trigger) { } if ((!IsDoorOpen() || open_type == 58) && (!required_key_item)) { - if (content_db.GetZoneID(destination_zone_name) == zone->GetZoneID()) { + if (ZoneID(destination_zone_name) == zone->GetZoneID()) { sender->MovePC( zone->GetZoneID(), zone->GetInstanceID(), @@ -485,7 +486,7 @@ void Doors::HandleClick(Client* sender, uint8 trigger) { ); } else { sender->MovePC( - content_db.GetZoneID(destination_zone_name), + ZoneID(destination_zone_name), static_cast(this->destination_instance_id), m_Destination.x, m_Destination.y, diff --git a/zone/effects.cpp b/zone/effects.cpp index 7e2ecdbc7..1cc708463 100644 --- a/zone/effects.cpp +++ b/zone/effects.cpp @@ -28,6 +28,7 @@ #include "string_ids.h" #include "worldserver.h" #include "zonedb.h" +#include "zone_store.h" #include "position.h" float Mob::GetActSpellRange(uint16 spell_id, float range, bool IsBard) @@ -554,7 +555,7 @@ int Client::GetDiscSlotBySpellID(int32 spellid) if(m_pp.disciplines.values[i] == spellid) return i; } - + return -1; } diff --git a/zone/forage.cpp b/zone/forage.cpp index 6d24f50a8..eb198afba 100644 --- a/zone/forage.cpp +++ b/zone/forage.cpp @@ -30,6 +30,7 @@ #include "titles.h" #include "water_map.h" #include "zonedb.h" +#include "zone_store.h" #include "../common/repositories/criteria/content_filter_criteria.h" #include diff --git a/zone/guild_mgr.cpp b/zone/guild_mgr.cpp index 200f67d90..4fbb9f10d 100644 --- a/zone/guild_mgr.cpp +++ b/zone/guild_mgr.cpp @@ -24,6 +24,7 @@ #include "guild_mgr.h" #include "worldserver.h" #include "zonedb.h" +#include "zone_store.h" ZoneGuildManager guild_mgr; GuildBankManager *GuildBanks; diff --git a/zone/inventory.cpp b/zone/inventory.cpp index 3ee86df47..3d1b2b331 100644 --- a/zone/inventory.cpp +++ b/zone/inventory.cpp @@ -23,6 +23,7 @@ #include "quest_parser_collection.h" #include "worldserver.h" #include "zonedb.h" +#include "zone_store.h" extern WorldServer worldserver; @@ -231,7 +232,7 @@ bool Client::SummonItem(uint32 item_id, int16 charges, uint32 aug1, uint32 aug2, bool enforcewear = RuleB(Inventory, EnforceAugmentWear); bool enforcerestr = RuleB(Inventory, EnforceAugmentRestriction); bool enforceusable = RuleB(Inventory, EnforceAugmentUsability); - + for (int iter = EQEmu::invaug::SOCKET_BEGIN; iter <= EQEmu::invaug::SOCKET_END; ++iter) { const EQEmu::ItemData* augtest = database.GetItem(augments[iter]); @@ -249,7 +250,7 @@ bool Client::SummonItem(uint32 item_id, int16 charges, uint32 aug1, uint32 aug2, if(CheckLoreConflict(augtest)) { // DuplicateLoreMessage(augtest->ID); Message(Chat::Red, "You already have a lore %s (%u) in your inventory.", augtest->Name, augtest->ID); - + return false; } // check that augment is an actual augment @@ -257,7 +258,7 @@ bool Client::SummonItem(uint32 item_id, int16 charges, uint32 aug1, uint32 aug2, Message(Chat::Red, "%s (%u) (Aug%i) is not an actual augment.", augtest->Name, augtest->ID, iter + 1); LogInventory("Player [{}] on account [{}] attempted to use a non-augment item (Aug[{}]) as an augment.\n(Item: [{}], Aug1: [{}], Aug2: [{}], Aug3: [{}], Aug4: [{}], Aug5: [{}], Aug6: [{}])\n", GetName(), account_name, item->ID, (iter + 1), aug1, aug2, aug3, aug4, aug5, aug6); - + return false; } @@ -504,7 +505,7 @@ bool Client::SummonItem(uint32 item_id, int16 charges, uint32 aug1, uint32 aug2, // validation passed..so, set the charges and create the actual item // if the item is stackable and the charge amount is -1 or 0 then set to 1 charge. - // removed && item->MaxCharges == 0 if -1 or 0 was passed max charges is irrelevant + // removed && item->MaxCharges == 0 if -1 or 0 was passed max charges is irrelevant if(charges <= 0 && item->Stackable) charges = 1; @@ -534,7 +535,7 @@ bool Client::SummonItem(uint32 item_id, int16 charges, uint32 aug1, uint32 aug2, // attune item if(attuned && inst->GetItem()->Attuneable) inst->SetAttuned(true); - + inst->SetOrnamentIcon(ornament_icon); inst->SetOrnamentationIDFile(ornament_idfile); inst->SetOrnamentHeroModel(ornament_hero_model); @@ -584,7 +585,7 @@ void Client::DropItem(int16 slot_id, bool recurse) { LogInventory("[{}] (char_id: [{}]) Attempting to drop item from slot [{}] on the ground", GetCleanName(), CharacterID(), slot_id); - + if(GetInv().CheckNoDrop(slot_id, recurse) && RuleI(World, FVNoDropFlag) == 0 || RuleI(Character, MinStatusForNoDropExemptions) < Admin() && RuleI(World, FVNoDropFlag) == 2) { @@ -1016,7 +1017,7 @@ bool Client::PutItemInInventory(int16 slot_id, const EQEmu::ItemInstance& inst, SendItemPacket(slot_id, &inst, ((slot_id == EQEmu::invslot::slotCursor) ? ItemPacketLimbo : ItemPacketTrade)); //SendWearChange(EQEmu::InventoryProfile::CalcMaterialFromSlot(slot_id)); } - + if (slot_id == EQEmu::invslot::slotCursor) { auto s = m_inv.cursor_cbegin(), e = m_inv.cursor_cend(); return database.SaveCursor(this->CharacterID(), s, e); @@ -1054,7 +1055,7 @@ void Client::PutLootInInventory(int16 slot_id, const EQEmu::ItemInstance &inst, else { SendLootItemInPacket(&inst, slot_id); } - + if (bag_item_data) { for (int index = EQEmu::invbag::SLOT_BEGIN; index <= EQEmu::invbag::SLOT_END; ++index) { if (bag_item_data[index] == nullptr) @@ -1168,7 +1169,7 @@ bool Client::AutoPutLootInInventory(EQEmu::ItemInstance& inst, bool try_worn, bo if (worn_slot_material != EQEmu::textures::materialInvalid) { SendWearChange(worn_slot_material); } - + parse->EventItem(EVENT_EQUIP_ITEM, this, &inst, nullptr, "", i); return true; } @@ -1245,7 +1246,7 @@ bool MakeItemLink(char* &ret_link, const ItemData *item, uint32 aug0, uint32 aug //int hash = GetItemLinkHash(inst); //eventually this will work (currently crashes zone), but for now we'll skip the extra overhead int hash = NOT_USED; - + // Tested with UF and RoF..there appears to be a problem with using non-augment arguments below... // Currently, enabling them causes misalignments in what the client expects. I haven't looked // into it further to determine the cause..but, the function is setup to accept the parameters. @@ -1935,7 +1936,7 @@ bool Client::SwapItem(MoveItem_Struct* move_in) { fail_message = "Your class, deity and/or race may not equip that item."; else if (fail_state == EQEmu::InventoryProfile::swapLevel) fail_message = "You are not sufficient level to use this item."; - + if (fail_message) Message(Chat::Red, "%s", fail_message); @@ -2203,7 +2204,7 @@ void Client::DyeArmor(EQEmu::TintProfile* dye){ EQEmu::ItemInstance* inst = this->m_inv.GetItem(slot2); if(inst){ uint32 armor_color = ((uint32)dye->Slot[i].Red << 16) | ((uint32)dye->Slot[i].Green << 8) | ((uint32)dye->Slot[i].Blue); - inst->SetColor(armor_color); + inst->SetColor(armor_color); database.SaveCharacterMaterialColor(this->CharacterID(), i, armor_color); database.SaveInventory(CharacterID(),inst,slot2); if(dye->Slot[i].UseTint) @@ -2225,7 +2226,7 @@ void Client::DyeArmor(EQEmu::TintProfile* dye){ auto outapp = new EQApplicationPacket(OP_Dye, 0); QueuePacket(outapp); safe_delete(outapp); - + } #if 0 @@ -2318,7 +2319,7 @@ bool Client::DecreaseByID(uint32 type, uint8 amt) { for (x = EQEmu::invbag::CURSOR_BAG_BEGIN; x <= EQEmu::invbag::CURSOR_BAG_END; ++x) { if (num >= amt) break; - + TempItem = nullptr; ins = GetInv().GetItem(x); if (ins) @@ -2343,7 +2344,7 @@ bool Client::DecreaseByID(uint32 type, uint8 amt) { TempItem = ins->GetItem(); if (TempItem && TempItem->ID != type) continue; - + if (ins->GetCharges() < amt) { amt -= ins->GetCharges(); DeleteItemInInventory(x, amt, true); @@ -2534,7 +2535,7 @@ void Client::DisenchantSummonedBags(bool client_update) if (!new_item) { continue; } auto new_inst = database.CreateBaseItem(new_item); if (!new_inst) { continue; } - + if (CopyBagContents(new_inst, inst)) { LogInventory("Disenchant Summoned Bags: Replacing [{}] with [{}] in slot [{}]", inst->GetItem()->Name, new_inst->GetItem()->Name, slot_id); PutItemInInventory(slot_id, *new_inst, client_update); @@ -2708,7 +2709,7 @@ void Client::RemoveDuplicateLore(bool client_update) } safe_delete(inst); } - + for (auto slot_id = EQEmu::invslot::GENERAL_BEGIN; slot_id <= EQEmu::invslot::GENERAL_END; ++slot_id) { if (((uint64)1 << slot_id) & GetInv().GetLookup()->PossessionsBitmask == 0) continue; @@ -3002,7 +3003,7 @@ void Client::CreateBandolier(const EQApplicationPacket *app) LogInventory("Char: [{}] Creating Bandolier Set [{}], Set Name: [{}]", GetName(), bs->Number, bs->Name); strcpy(m_pp.bandoliers[bs->Number].Name, bs->Name); - const EQEmu::ItemInstance* InvItem = nullptr; + const EQEmu::ItemInstance* InvItem = nullptr; const EQEmu::ItemData *BaseItem = nullptr; int16 WeaponSlot = 0; @@ -3033,7 +3034,7 @@ void Client::RemoveBandolier(const EQApplicationPacket *app) memset(m_pp.bandoliers[bds->Number].Name, 0, 32); for(int i = bandolierPrimary; i <= bandolierAmmo; i++) { m_pp.bandoliers[bds->Number].Items[i].ID = 0; - m_pp.bandoliers[bds->Number].Items[i].Icon = 0; + m_pp.bandoliers[bds->Number].Items[i].Icon = 0; } database.DeleteCharacterBandolier(this->CharacterID(), bds->Number); } diff --git a/zone/loottables.cpp b/zone/loottables.cpp index 666b3d55e..c2a7b868f 100644 --- a/zone/loottables.cpp +++ b/zone/loottables.cpp @@ -26,6 +26,7 @@ #include "mob.h" #include "npc.h" #include "zonedb.h" +#include "zone_store.h" #include "global_loot_manager.h" #include "../common/repositories/criteria/content_filter_criteria.h" diff --git a/zone/main.cpp b/zone/main.cpp index b44ee3421..a0ab30ff2 100644 --- a/zone/main.cpp +++ b/zone/main.cpp @@ -56,6 +56,7 @@ #include "bot_command.h" #endif #include "zonedb.h" +#include "zone_store.h" #include "zone_config.h" #include "titles.h" #include "guild_mgr.h" @@ -318,11 +319,7 @@ int main(int argc, char** argv) { LogInfo("Loading zone names"); - // Load to both context for now... this needs to be cleaned up as this has always been cludgy - content_db.LoadZoneNames(); - database.zonename_array = content_db.zonename_array; - - zone_store.LoadZonesStore(); + zone_store.LoadZones(); LogInfo("Loading items"); if (!database.LoadItems(hotfix_name)) { @@ -474,7 +471,7 @@ int main(int argc, char** argv) { } else if (!Zone::Bootup(ZoneID(zone_name), instance_id, true)) { LogError("Zone Bootup failed :: Zone::Bootup"); - zone = 0; + zone = nullptr; } //register all the patches we have avaliable with the stream identifier. diff --git a/zone/mob_appearance.cpp b/zone/mob_appearance.cpp index fe4e07eee..bf049fed6 100644 --- a/zone/mob_appearance.cpp +++ b/zone/mob_appearance.cpp @@ -27,6 +27,7 @@ #include "mob.h" #include "quest_parser_collection.h" #include "zonedb.h" +#include "zone_store.h" #ifdef BOTS #include "bot.h" @@ -545,4 +546,4 @@ void Mob::WearChange(uint8 material_slot, uint16 texture, uint32 color, uint32 h entity_list.QueueClients(this, outapp); safe_delete(outapp); -} \ No newline at end of file +} diff --git a/zone/mod_functions_base.cpp b/zone/mod_functions_base.cpp index e9e172997..477050534 100644 --- a/zone/mod_functions_base.cpp +++ b/zone/mod_functions_base.cpp @@ -8,6 +8,7 @@ #include "zone.h" #include "spawngroup.h" #include "zonedb.h" +#include "zone_store.h" #include "npc.h" #include "mob.h" #include "client.h" diff --git a/zone/npc.h b/zone/npc.h index 7c108b4b7..762a37d21 100644 --- a/zone/npc.h +++ b/zone/npc.h @@ -23,6 +23,7 @@ #include "mob.h" #include "qglobals.h" #include "zonedb.h" +#include "zone_store.h" #include "zonedump.h" #include @@ -512,7 +513,7 @@ protected: uint32 npc_spells_id; uint8 casting_spell_AIindex; - + uint32* pDontCastBefore_casting_spell; std::vector AIspells; bool HasAISpell; diff --git a/zone/object.cpp b/zone/object.cpp index 21ce0721a..2a76d9894 100644 --- a/zone/object.cpp +++ b/zone/object.cpp @@ -26,6 +26,7 @@ #include "quest_parser_collection.h" #include "zonedb.h" +#include "zone_store.h" #include "../common/repositories/criteria/content_filter_criteria.h" #include diff --git a/zone/petitions.h b/zone/petitions.h index 057169d45..4a6e9d2ff 100644 --- a/zone/petitions.h +++ b/zone/petitions.h @@ -25,6 +25,7 @@ #include "client.h" #include "zonedb.h" +#include "zone_store.h" class Client; diff --git a/zone/pets.cpp b/zone/pets.cpp index 6a5ae12ca..707bf8464 100644 --- a/zone/pets.cpp +++ b/zone/pets.cpp @@ -27,6 +27,7 @@ #include "pets.h" #include "zonedb.h" +#include "zone_store.h" #include @@ -230,7 +231,7 @@ void Mob::MakePoweredPet(uint16 spell_id, const char* pettype, int16 petpower, memcpy(npc_type, base, sizeof(NPCType)); // If pet power is set to -1 in the DB, use stat scaling - if ((this->IsClient() + if ((this->IsClient() #ifdef BOTS || this->IsBot() #endif @@ -620,7 +621,7 @@ void NPC::SetPetState(SpellBuff_Struct *pet_buffs, uint32 *items) { if (item2) { bool noDrop=(item2->NoDrop == 0); // Field is reverse logic - bool petCanHaveNoDrop = (RuleB(Pets, CanTakeNoDrop) && + bool petCanHaveNoDrop = (RuleB(Pets, CanTakeNoDrop) && _CLIENTPET(this) && GetPetType() <= petOther); if (!noDrop || petCanHaveNoDrop) { diff --git a/zone/quest.h b/zone/quest.h index 65a4b2e1e..9bfad6991 100644 --- a/zone/quest.h +++ b/zone/quest.h @@ -19,6 +19,7 @@ #define __QUEST_H__ #include "zonedb.h" +#include "zone_store.h" typedef struct _tag_quest_entry{ char *m_pQuestName; diff --git a/zone/questmgr.cpp b/zone/questmgr.cpp index 6929e695d..3dcd70e47 100644 --- a/zone/questmgr.cpp +++ b/zone/questmgr.cpp @@ -35,6 +35,7 @@ #include "worldserver.h" #include "zone.h" #include "zonedb.h" +#include "zone_store.h" #include #include @@ -397,7 +398,7 @@ void QuestManager::Zone(const char *zone_name) { ztz->response = 0; ztz->current_zone_id = zone->GetZoneID(); ztz->current_instance_id = zone->GetInstanceID(); - ztz->requested_zone_id = content_db.GetZoneID(zone_name); + ztz->requested_zone_id = ZoneID(zone_name); ztz->admin = initiator->Admin(); strcpy(ztz->name, initiator->GetName()); ztz->guild_id = initiator->GuildID(); @@ -639,9 +640,9 @@ void QuestManager::resumetimer(const char *timer_name) { bool QuestManager::ispausedtimer(const char *timer_name) { QuestManagerCurrentQuestVars(); - + std::list::iterator pcur = PTimerList.begin(), pend; - + pend = PTimerList.end(); while (pcur != pend) { @@ -1017,7 +1018,7 @@ uint16 QuestManager::scribespells(uint8 max_level, uint8 min_level) { ((spell_id >= 0 && spell_id < SPDAT_RECORDS) ? spells[spell_id].name : "Out-of-range"), spell_id ); - + break; } if (spell_id < 0 || spell_id >= SPDAT_RECORDS) { @@ -1940,7 +1941,7 @@ int QuestManager::getplayercorpsecount(uint32 char_id) { return database.CountCharacterCorpses(char_id); } return 0; - + } int QuestManager::getplayercorpsecountbyzoneid(uint32 char_id, uint32 zone_id) { @@ -2628,7 +2629,7 @@ int QuestManager::countitem(uint32 item_id) { { EQEmu::invslot::SHARED_BANK_BEGIN, EQEmu::invslot::SHARED_BANK_END }, { EQEmu::invbag::SHARED_BANK_BAGS_BEGIN, EQEmu::invbag::SHARED_BANK_BAGS_END }, }; - const size_t size = sizeof(slots) / sizeof(slots[0]); + const size_t size = sizeof(slots) / sizeof(slots[0]); for (int slot_index = 0; slot_index < size; ++slot_index) { for (int slot_id = slots[slot_index][0]; slot_id <= slots[slot_index][1]; ++slot_id) { item = initiator->GetInv().GetItem(slot_id); @@ -2753,7 +2754,7 @@ uint16 QuestManager::CreateInstance(const char *zone, int16 version, uint32 dura QuestManagerCurrentQuestVars(); if(initiator) { - uint32 zone_id = content_db.GetZoneID(zone); + uint32 zone_id = ZoneID(zone); if(zone_id == 0) return 0; @@ -2806,10 +2807,10 @@ uint32 QuestManager::GetInstanceTimer() { uint32 QuestManager::GetInstanceTimerByID(uint16 instance_id) { if (instance_id == 0) return 0; - + std::string query = StringFormat("SELECT ((start_time + duration) - UNIX_TIMESTAMP()) AS `remaining` FROM `instance_list` WHERE `id` = %lu", (unsigned long)instance_id); auto results = database.QueryDatabase(query); - + if (results.Success()) { auto row = results.begin(); uint32 timer = atoi(row[0]); @@ -2823,13 +2824,13 @@ uint16 QuestManager::GetInstanceID(const char *zone, int16 version) QuestManagerCurrentQuestVars(); if (initiator) { - return database.GetInstanceID(zone, initiator->CharacterID(), version); + return database.GetInstanceID(ZoneID(zone), initiator->CharacterID(), version); } return 0; } uint16 QuestManager::GetInstanceIDByCharID(const char *zone, int16 version, uint32 char_id) { - return database.GetInstanceID(zone, char_id, version); + return database.GetInstanceID(ZoneID(zone), char_id, version); } void QuestManager::AssignToInstance(uint16 instance_id) @@ -3181,7 +3182,7 @@ uint16 QuestManager::CreateDoor(const char* model, float x, float y, float z, fl } int32 QuestManager::GetZoneID(const char *zone) { - return static_cast(content_db.GetZoneID(zone)); + return static_cast(ZoneID(zone)); } const char* QuestManager::GetZoneLongName(const char *zone) { diff --git a/zone/spawn2.cpp b/zone/spawn2.cpp index 1272e1487..37b8cc943 100644 --- a/zone/spawn2.cpp +++ b/zone/spawn2.cpp @@ -26,6 +26,7 @@ #include "worldserver.h" #include "zone.h" #include "zonedb.h" +#include "zone_store.h" extern EntityList entity_list; extern Zone* zone; @@ -461,7 +462,7 @@ bool ZoneDatabase::PopulateZoneSpawnListClose(uint32 zoneid, LinkedList } } - const char *zone_name = content_db.GetZoneName(zoneid); + const char *zone_name = ZoneName(zoneid); std::string query = StringFormat( "SELECT " "id, " @@ -565,7 +566,7 @@ bool ZoneDatabase::PopulateZoneSpawnList(uint32 zoneid, LinkedList &spa } } - const char *zone_name = content_db.GetZoneName(zoneid); + const char *zone_name = ZoneName(zoneid); std::string query = StringFormat( "SELECT " "id, " @@ -1217,7 +1218,7 @@ void SpawnConditionManager::SetCondition(const char *zone_short, uint32 instance auto pack = new ServerPacket(ServerOP_SpawnCondition, sizeof(ServerSpawnCondition_Struct)); ServerSpawnCondition_Struct* ssc = (ServerSpawnCondition_Struct*)pack->pBuffer; - ssc->zoneID = content_db.GetZoneID(zone_short); + ssc->zoneID = ZoneID(zone_short); ssc->instanceID = instance_id; ssc->condition_id = condition_id; ssc->value = new_value; @@ -1349,7 +1350,7 @@ void SpawnConditionManager::ToggleEvent(uint32 event_id, bool enabled, bool stri auto pack = new ServerPacket(ServerOP_SpawnEvent, sizeof(ServerSpawnEvent_Struct)); ServerSpawnEvent_Struct* sse = (ServerSpawnEvent_Struct*)pack->pBuffer; - sse->zoneID = content_db.GetZoneID(zone_short_name.c_str()); + sse->zoneID = ZoneID(zone_short_name.c_str()); sse->event_id = event_id; worldserver.SendPacket(pack); diff --git a/zone/spawngroup.cpp b/zone/spawngroup.cpp index 49aeea35b..97f3dab9a 100644 --- a/zone/spawngroup.cpp +++ b/zone/spawngroup.cpp @@ -24,6 +24,7 @@ #include "spawngroup.h" #include "zone.h" #include "zonedb.h" +#include "zone_store.h" #include "../common/repositories/criteria/content_filter_criteria.h" extern EntityList entity_list; diff --git a/zone/tasks.cpp b/zone/tasks.cpp index 4e4488b39..88f1fa6f8 100644 --- a/zone/tasks.cpp +++ b/zone/tasks.cpp @@ -31,6 +31,7 @@ Copyright (C) 2001-2008 EQEMu Development Team (http://eqemulator.net) #include "../common/string_util.h" #include "../common/say_link.h" #include "zonedb.h" +#include "zone_store.h" #include "../common/repositories/goallists_repository.h" #include "client.h" #include "entity.h" diff --git a/zone/tradeskills.cpp b/zone/tradeskills.cpp index 71374bc75..a5798236c 100644 --- a/zone/tradeskills.cpp +++ b/zone/tradeskills.cpp @@ -33,6 +33,7 @@ #include "string_ids.h" #include "titles.h" #include "zonedb.h" +#include "zone_store.h" #include "../common/repositories/character_recipe_list_repository.h" #include "../common/repositories/tradeskill_recipe_repository.h" diff --git a/zone/worldserver.cpp b/zone/worldserver.cpp index e7c5ac85f..0f4cddcfc 100644 --- a/zone/worldserver.cpp +++ b/zone/worldserver.cpp @@ -583,7 +583,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) case ServerOP_ZonePlayer: { ServerZonePlayer_Struct* szp = (ServerZonePlayer_Struct*)pack->pBuffer; Client* client = entity_list.GetClientByName(szp->name); - printf("Zoning %s to %s(%u) - %u\n", client != nullptr ? client->GetCleanName() : "Unknown", szp->zone, content_db.GetZoneID(szp->zone), szp->instance_id); + printf("Zoning %s to %s(%u) - %u\n", client != nullptr ? client->GetCleanName() : "Unknown", szp->zone, ZoneID(szp->zone), szp->instance_id); if (client != 0) { if (strcasecmp(szp->adminname, szp->name) == 0) client->Message(Chat::White, "Zoning to: %s", szp->zone); @@ -593,17 +593,17 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) SendEmoteMessage(szp->adminname, 0, 0, "Summoning %s to %s %1.1f, %1.1f, %1.1f", szp->name, szp->zone, szp->x_pos, szp->y_pos, szp->z_pos); } if (!szp->instance_id) { - client->MovePC(content_db.GetZoneID(szp->zone), szp->instance_id, szp->x_pos, szp->y_pos, szp->z_pos, client->GetHeading(), szp->ignorerestrictions, GMSummon); + client->MovePC(ZoneID(szp->zone), szp->instance_id, szp->x_pos, szp->y_pos, szp->z_pos, client->GetHeading(), szp->ignorerestrictions, GMSummon); } else { - if (database.GetInstanceID(client->CharacterID(), content_db.GetZoneID(szp->zone)) == 0) { + if (database.GetInstanceID(client->CharacterID(), ZoneID(szp->zone)) == 0) { client->AssignToInstance(szp->instance_id); - client->MovePC(content_db.GetZoneID(szp->zone), szp->instance_id, szp->x_pos, szp->y_pos, szp->z_pos, client->GetHeading(), szp->ignorerestrictions, GMSummon); + client->MovePC(ZoneID(szp->zone), szp->instance_id, szp->x_pos, szp->y_pos, szp->z_pos, client->GetHeading(), szp->ignorerestrictions, GMSummon); } else { - client->RemoveFromInstance(database.GetInstanceID(client->CharacterID(), content_db.GetZoneID(szp->zone))); + client->RemoveFromInstance(database.GetInstanceID(client->CharacterID(), ZoneID(szp->zone))); client->AssignToInstance(szp->instance_id); - client->MovePC(content_db.GetZoneID(szp->zone), szp->instance_id, szp->x_pos, szp->y_pos, szp->z_pos, client->GetHeading(), szp->ignorerestrictions, GMSummon); + client->MovePC(ZoneID(szp->zone), szp->instance_id, szp->x_pos, szp->y_pos, szp->z_pos, client->GetHeading(), szp->ignorerestrictions, GMSummon); } } } diff --git a/zone/zone.cpp b/zone/zone.cpp index 6c3b57950..025ea7e5d 100755 --- a/zone/zone.cpp +++ b/zone/zone.cpp @@ -84,7 +84,7 @@ Zone* zone = 0; void UpdateWindowTitle(char* iNewTitle); bool Zone::Bootup(uint32 iZoneID, uint32 iInstanceID, bool iStaticZone) { - const char* zonename = content_db.GetZoneName(iZoneID); + const char* zonename = ZoneName(iZoneID); if (iZoneID == 0 || zonename == 0) return false; @@ -190,7 +190,7 @@ bool Zone::LoadZoneObjects() for (auto row = results.begin(); row != results.end(); ++row) { if (atoi(row[9]) == 0) { // Type == 0 - Static Object - const char *shortname = content_db.GetZoneName(atoi(row[1]), false); // zoneid -> zone_shortname + const char *shortname = ZoneName(atoi(row[1]), false); // zoneid -> zone_shortname if (!shortname) continue; @@ -1158,7 +1158,7 @@ bool Zone::LoadZoneCFG(const char* filename, uint16 instance_id) map_name = nullptr; if (!content_db.GetZoneCFG( - content_db.GetZoneID(filename), + ZoneID(filename), instance_id, &newzone_data, can_bind, @@ -1177,7 +1177,7 @@ bool Zone::LoadZoneCFG(const char* filename, uint16 instance_id) if (instance_id != 0) { safe_delete_array(map_name); if (!content_db.GetZoneCFG( - content_db.GetZoneID(filename), + ZoneID(filename), 0, &newzone_data, can_bind, @@ -1799,7 +1799,7 @@ ZonePoint* Zone::GetClosestZonePoint(const glm::vec3& location, uint32 to, Clien ZonePoint* Zone::GetClosestZonePoint(const glm::vec3& location, const char* to_name, Client* client, float max_distance) { if(to_name == nullptr) return GetClosestZonePointWithoutZone(location.x, location.y, location.z, client, max_distance); - return GetClosestZonePoint(location, content_db.GetZoneID(to_name), client, max_distance); + return GetClosestZonePoint(location, ZoneID(to_name), client, max_distance); } ZonePoint* Zone::GetClosestZonePointWithoutZone(float x, float y, float z, Client* client, float max_distance) { diff --git a/zone/zone.h b/zone/zone.h index 5249ff994..16d44226e 100755 --- a/zone/zone.h +++ b/zone/zone.h @@ -25,6 +25,7 @@ #include "../common/random.h" #include "../common/string_util.h" #include "zonedb.h" +#include "zone_store.h" #include "../common/repositories/grid_repository.h" #include "../common/repositories/grid_entries_repository.h" #include "qglobals.h" diff --git a/zone/zone_store.cpp b/zone/zone_store.cpp index 37f50181b..4088e4980 100644 --- a/zone/zone_store.cpp +++ b/zone/zone_store.cpp @@ -23,7 +23,7 @@ ZoneStore::ZoneStore() = default; ZoneStore::~ZoneStore() = default; -void ZoneStore::LoadZonesStore() +void ZoneStore::LoadZones() { zones = ZoneRepository::All(); } @@ -50,6 +50,11 @@ uint32 ZoneStore::GetZoneID(std::string zone_name) return 0; } +/** + * @param zone_id + * @param error_unknown + * @return + */ const char *ZoneStore::GetZoneName(uint32 zone_id, bool error_unknown) { for (auto &z: zones) { @@ -65,6 +70,10 @@ const char *ZoneStore::GetZoneName(uint32 zone_id, bool error_unknown) return nullptr; } +/** + * @param zone_id + * @return + */ std::string ZoneStore::GetZoneName(uint32 zone_id) { for (auto &z: zones) { @@ -75,3 +84,49 @@ std::string ZoneStore::GetZoneName(uint32 zone_id) return std::string(); } + +/** + * @param zone_id + * @return + */ +std::string ZoneStore::GetZoneLongName(uint32 zone_id) +{ + for (auto &z: zones) { + if (z.zoneidnumber == zone_id) { + return z.long_name; + } + } + + return std::string(); +} + +/** + * @param zone_id + * @param version + * @return + */ +ZoneRepository::Zone ZoneStore::GetZone(uint32 zone_id, int version) +{ + for (auto &z: zones) { + if (z.zoneidnumber == zone_id && z.version == version) { + return z; + } + } + + return ZoneRepository::Zone(); +} + +/** + * @param in_zone_name + * @return + */ +ZoneRepository::Zone ZoneStore::GetZone(const char *in_zone_name) +{ + for (auto &z: zones) { + if (z.short_name == in_zone_name) { + return z; + } + } + + return ZoneRepository::Zone(); +} diff --git a/zone/zone_store.h b/zone/zone_store.h index 6721a3d0c..4057336d5 100644 --- a/zone/zone_store.h +++ b/zone/zone_store.h @@ -31,12 +31,15 @@ public: std::vector zones; - void LoadZonesStore(); + void LoadZones(); + ZoneRepository::Zone GetZone(uint32 zone_id, int version = 0); + ZoneRepository::Zone GetZone(const char *in_zone_name); uint32 GetZoneID(const char *in_zone_name); uint32 GetZoneID(std::string zone_name); std::string GetZoneName(uint32 zone_id); - const char *GetZoneName(uint32 zone_id, bool error_unknown); + std::string GetZoneLongName(uint32 zone_id); + const char *GetZoneName(uint32 zone_id, bool error_unknown = false); }; extern ZoneStore zone_store; @@ -46,14 +49,15 @@ extern ZoneStore zone_store; */ inline uint32 ZoneID(const char *in_zone_name) { return zone_store.GetZoneID(in_zone_name); } inline uint32 ZoneID(std::string zone_name) { return zone_store.GetZoneID(zone_name); } -inline std::string ZoneName(uint32 zone_id) { return zone_store.GetZoneName(zone_id); } -inline const char *ZoneName(uint32 zone_id, bool error_unknown) +inline const char *ZoneName(uint32 zone_id, bool error_unknown = false) { return zone_store.GetZoneName( zone_id, error_unknown ); } - +inline const char *ZoneLongName(uint32 zone_id) { return zone_store.GetZoneLongName(zone_id).c_str(); } +inline ZoneRepository::Zone GetZone(uint32 zone_id, int version = 0) { return zone_store.GetZone(zone_id, version); }; +inline ZoneRepository::Zone GetZone(const char *in_zone_name) { return zone_store.GetZone(in_zone_name); }; #endif //EQEMU_ZONE_STORE_H diff --git a/zone/zonedb.cpp b/zone/zonedb.cpp index a1313eacd..759602d5a 100755 --- a/zone/zonedb.cpp +++ b/zone/zonedb.cpp @@ -11,6 +11,7 @@ #include "merc.h" #include "zone.h" #include "zonedb.h" +#include "zone_store.h" #include "aura.h" #include "../common/repositories/criteria/content_filter_criteria.h" @@ -3566,7 +3567,7 @@ void ZoneDatabase::ListAllInstances(Client* client, uint32 charid) client->Message(Chat::White, "%s is part of the following instances:", name); for (auto row = results.begin(); row != results.end(); ++row) { - client->Message(Chat::White, "%s - id: %lu, version: %lu", content_db.GetZoneName(atoi(row[1])), + client->Message(Chat::White, "%s - id: %lu, version: %lu", ZoneName(atoi(row[1])), (unsigned long)atoi(row[0]), (unsigned long)atoi(row[2])); } } diff --git a/zone/zoning.cpp b/zone/zoning.cpp index ac453fefc..08235579a 100644 --- a/zone/zoning.cpp +++ b/zone/zoning.cpp @@ -159,7 +159,7 @@ void Client::Handle_OP_ZoneChange(const EQApplicationPacket *app) { } /* Check for Valid Zone */ - const char *target_zone_name = content_db.GetZoneName(target_zone_id); + const char *target_zone_name = ZoneName(target_zone_id); if(target_zone_name == nullptr) { //invalid zone... Message(Chat::Red, "Invalid target zone ID."); @@ -376,7 +376,7 @@ void Client::DoZoneSuccess(ZoneChange_Struct *zc, uint16 zone_id, uint32 instanc if(this->GetPet()) entity_list.RemoveFromHateLists(this->GetPet()); - LogInfo("Zoning [{}] to: [{}] ([{}]) - ([{}]) x [{}] y [{}] z [{}]", m_pp.name, content_db.GetZoneName(zone_id), zone_id, instance_id, dest_x, dest_y, dest_z); + LogInfo("Zoning [{}] to: [{}] ([{}]) - ([{}]) x [{}] y [{}] z [{}]", m_pp.name, ZoneName(zone_id), zone_id, instance_id, dest_x, dest_y, dest_z); //set the player's coordinates in the new zone so they have them //when they zone into it @@ -430,7 +430,7 @@ void Client::DoZoneSuccess(ZoneChange_Struct *zc, uint16 zone_id, uint32 instanc } void Client::MovePC(const char* zonename, float x, float y, float z, float heading, uint8 ignorerestrictions, ZoneMode zm) { - ProcessMovePC(content_db.GetZoneID(zonename), 0, x, y, z, heading, ignorerestrictions, zm); + ProcessMovePC(ZoneID(zonename), 0, x, y, z, heading, ignorerestrictions, zm); } //designed for in zone moving @@ -510,7 +510,7 @@ void Client::ZonePC(uint32 zoneID, uint32 instance_id, float x, float y, float z const char* pShortZoneName = nullptr; char* pZoneName = nullptr; - pShortZoneName = content_db.GetZoneName(zoneID); + pShortZoneName = ZoneName(zoneID); content_db.GetZoneLongName(pShortZoneName, &pZoneName); if(!pZoneName) { @@ -856,7 +856,7 @@ void Client::SendZoneFlagInfo(Client *to) const { for(; cur != end; ++cur) { uint32 zoneid = *cur; - const char *short_name = content_db.GetZoneName(zoneid); + const char *short_name = ZoneName(zoneid); char *long_name = nullptr; content_db.GetZoneLongName(short_name, &long_name);