From 501204a4d2e843433d35956868c6b0cfb918879d Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Thu, 6 Feb 2020 01:52:35 -0500 Subject: [PATCH] Add hot_zone filtering for global loot We do this in GlobalLootEntry::PassesRules since we want to check if the hot zone status changes during run time Value can be null, if null it's not checked. If the value is 0 the zone must not be a hot zone (I guess one might want that) and if it's not 0, the zone must be a hot zone --- common/version.h | 2 +- utils/sql/db_update_manifest.txt | 1 + utils/sql/git/required/2020_02_06_globalloot.sql | 2 ++ zone/global_loot_manager.cpp | 9 +++++++++ zone/global_loot_manager.h | 1 + zone/loottables.cpp | 7 ++++++- 6 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 utils/sql/git/required/2020_02_06_globalloot.sql diff --git a/common/version.h b/common/version.h index ca37150ec..13579c3d2 100644 --- a/common/version.h +++ b/common/version.h @@ -34,7 +34,7 @@ * Manifest: https://github.com/EQEmu/Server/blob/master/utils/sql/db_update_manifest.txt */ -#define CURRENT_BINARY_DATABASE_VERSION 9148 +#define CURRENT_BINARY_DATABASE_VERSION 9149 #ifdef BOTS #define CURRENT_BINARY_BOTS_DATABASE_VERSION 9026 diff --git a/utils/sql/db_update_manifest.txt b/utils/sql/db_update_manifest.txt index 8e3172b87..fdaa4a946 100644 --- a/utils/sql/db_update_manifest.txt +++ b/utils/sql/db_update_manifest.txt @@ -402,6 +402,7 @@ 9146|2020_01_10_character_soft_deletes.sql|SHOW COLUMNS FROM `character_data` LIKE 'deleted_at'|empty| 9147|2020_01_24_grid_centerpoint_wp.sql|SHOW COLUMNS FROM `grid_entries` LIKE 'centerpoint'|empty| 9148|2020_01_28_corpse_guild_consent_id.sql|SHOW COLUMNS FROM `character_corpses` LIKE 'guild_consent_id'|empty| +9149|2020_02_06_globalloot.sql|SHOW COLUMNS FROM `global_loot` LIKE 'hot_zone'|empty| # Upgrade conditions: # This won't be needed after this system is implemented, but it is used database that are not diff --git a/utils/sql/git/required/2020_02_06_globalloot.sql b/utils/sql/git/required/2020_02_06_globalloot.sql new file mode 100644 index 000000000..83144bbb8 --- /dev/null +++ b/utils/sql/git/required/2020_02_06_globalloot.sql @@ -0,0 +1,2 @@ +ALTER TABLE `global_loot` ADD `hot_zone` TINYINT NULL; + diff --git a/zone/global_loot_manager.cpp b/zone/global_loot_manager.cpp index ccdf88840..706769f77 100644 --- a/zone/global_loot_manager.cpp +++ b/zone/global_loot_manager.cpp @@ -1,6 +1,9 @@ #include "global_loot_manager.h" #include "npc.h" #include "client.h" +#include "zone.h" + +extern Zone *zone; std::vector GlobalLootManager::GetGlobalLootTables(NPC *mob) const { @@ -78,6 +81,12 @@ bool GlobalLootEntry::PassesRules(NPC *mob) const if (mob->GetBodyType() == r.value) bPassesBodyType = true; break; + case GlobalLoot::RuleTypes::HotZone: // value == 0 must not be hot_zone, value != must be hot_zone + if (zone->IsHotzone() && !r.value) + return false; + if (!zone->IsHotzone() && r.value) + return false; + break; default: break; } diff --git a/zone/global_loot_manager.h b/zone/global_loot_manager.h index fec5a7215..1de6e7831 100644 --- a/zone/global_loot_manager.h +++ b/zone/global_loot_manager.h @@ -17,6 +17,7 @@ enum class RuleTypes { BodyType = 4, Rare = 5, Raid = 6, + HotZone = 7, Max }; diff --git a/zone/loottables.cpp b/zone/loottables.cpp index 500af9d70..794883c1f 100644 --- a/zone/loottables.cpp +++ b/zone/loottables.cpp @@ -464,7 +464,7 @@ void NPC::CheckGlobalLootTables() void ZoneDatabase::LoadGlobalLoot() { auto query = StringFormat("SELECT id, loottable_id, description, min_level, max_level, rare, raid, race, " - "class, bodytype, zone FROM global_loot WHERE enabled = 1"); + "class, bodytype, zone, hot_zone FROM global_loot WHERE enabled = 1"); auto results = QueryDatabase(query); if (!results.Success() || results.RowCount() == 0) @@ -482,6 +482,7 @@ void ZoneDatabase::LoadGlobalLoot() continue; } + GlobalLootEntry e(atoi(row[0]), atoi(row[1]), row[2] ? row[2] : ""); auto min_level = atoi(row[3]); @@ -521,6 +522,10 @@ void ZoneDatabase::LoadGlobalLoot() e.AddRule(GlobalLoot::RuleTypes::BodyType, std::stoi(b)); } + // null is not used + if (row[11]) + e.AddRule(GlobalLoot::RuleTypes::HotZone, atoi(row[11])); + zone->AddGlobalLootEntry(e); } }