diff --git a/common/emu_versions.cpp b/common/emu_versions.cpp index d74835671..50c10c100 100644 --- a/common/emu_versions.cpp +++ b/common/emu_versions.cpp @@ -597,3 +597,28 @@ uint32 EQEmu::expansions::ConvertClientVersionToExpansionMask(versions::ClientVe return expansions::maskEverQuest; } } + +uint32 EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(uint32 expansion_mask) +{ + if (expansion_mask & bitRoK == bitRoK) return static_cast(Expansion::RoK); + if (expansion_mask & bitSoV == bitSoV) return static_cast(Expansion::SoV); + if (expansion_mask & bitSoL == bitSoL) return static_cast(Expansion::SoL); + if (expansion_mask & bitPoP == bitPoP) return static_cast(Expansion::PoP); + if (expansion_mask & bitLoY == bitLoY) return static_cast(Expansion::LoY); + if (expansion_mask & bitLDoN == bitLDoN) return static_cast(Expansion::LDoN); + if (expansion_mask & bitGoD == bitGoD) return static_cast(Expansion::GoD); + if (expansion_mask & bitOoW == bitOoW) return static_cast(Expansion::OoW); + if (expansion_mask & bitDoN == bitDoN) return static_cast(Expansion::DoN); + if (expansion_mask & bitDoD == bitDoD) return static_cast(Expansion::DoD); + if (expansion_mask & bitPoR == bitPoR) return static_cast(Expansion::PoR); + if (expansion_mask & bitTSS == bitTSS) return static_cast(Expansion::TSS); + if (expansion_mask & bitTBS == bitTBS) return static_cast(Expansion::TBS); + if (expansion_mask & bitSoF == bitSoF) return static_cast(Expansion::SoF); + if (expansion_mask & bitSoD == bitSoD) return static_cast(Expansion::SoD); + if (expansion_mask & bitUF == bitUF) return static_cast(Expansion::UF); + if (expansion_mask & bitHoT == bitHoT) return static_cast(Expansion::HoT); + if (expansion_mask & bitVoA == bitVoA) return static_cast(Expansion::VoA); + if (expansion_mask & bitRoF == bitRoF) return static_cast(Expansion::RoF); + if (expansion_mask & bitCotF == bitCotF) return static_cast(Expansion::CotF); + return static_cast(Expansion::EverQuest); +} diff --git a/common/emu_versions.h b/common/emu_versions.h index 17ea82b9f..ee2a8c26f 100644 --- a/common/emu_versions.h +++ b/common/emu_versions.h @@ -214,7 +214,7 @@ namespace EQEmu Expansion ConvertClientVersionToExpansion(versions::ClientVersion client_version); uint32 ConvertClientVersionToExpansionBit(versions::ClientVersion client_version); uint32 ConvertClientVersionToExpansionMask(versions::ClientVersion client_version); - + uint32 ConvertExpansionMaskToLatestExpansion(uint32 expansion_mask); } /*expansions*/ } /*EQEmu*/ diff --git a/common/shareddb.cpp b/common/shareddb.cpp index 9f849a62d..35d87646f 100644 --- a/common/shareddb.cpp +++ b/common/shareddb.cpp @@ -413,7 +413,7 @@ bool SharedDatabase::SetSharedPlatinum(uint32 account_id, int32 amount_to_add) { bool SharedDatabase::SetStartingItems(PlayerProfile_Struct* pp, EQEmu::InventoryProfile* inv, uint32 si_race, uint32 si_class, uint32 si_deity, uint32 si_current_zone, char* si_name, int admin_level) { const EQEmu::ItemData* myitem; - auto latest_expansion = EQEmu::expansions::ConvertExpansionBitToExpansion(RuleI(World, ExpansionSettings)); + auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings)); std::string query = StringFormat("SELECT itemid, item_charges, slot FROM starting_items " "WHERE (race = %i or race = 0) AND (class = %i or class = 0) AND " "(deityid = %i or deityid = 0) AND (zoneid = %i or zoneid = 0) AND " @@ -1936,7 +1936,7 @@ void SharedDatabase::GetLootTableInfo(uint32 &loot_table_count, uint32 &max_loot loot_table_count = 0; max_loot_table = 0; loot_table_entries = 0; - auto latest_expansion = EQEmu::expansions::ConvertExpansionBitToExpansion(RuleI(World, ExpansionSettings)); + auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings)); const std::string query = StringFormat("SELECT COUNT(*), MAX(id), (SELECT COUNT(*) FROM loottable_entries) FROM loottable WHERE min_expansion <= %i AND max_expansion >= %i", latest_expansion, latest_expansion); auto results = QueryDatabase(query); if (!results.Success()) { @@ -1957,7 +1957,7 @@ void SharedDatabase::GetLootDropInfo(uint32 &loot_drop_count, uint32 &max_loot_d loot_drop_count = 0; max_loot_drop = 0; loot_drop_entries = 0; - auto latest_expansion = EQEmu::expansions::ConvertExpansionBitToExpansion(RuleI(World, ExpansionSettings)); + auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings)); const std::string query = StringFormat("SELECT COUNT(*), MAX(id), (SELECT COUNT(*) FROM lootdrop_entries) FROM lootdrop WHERE min_expansion <= %i AND max_expansion >= %i", latest_expansion, latest_expansion); auto results = QueryDatabase(query); @@ -1981,10 +1981,11 @@ void SharedDatabase::LoadLootTables(void *data, uint32 size) { uint8 loot_table[sizeof(LootTable_Struct) + (sizeof(LootTableEntries_Struct) * 128)]; LootTable_Struct *lt = reinterpret_cast(loot_table); + auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings)); const std::string query = StringFormat("SELECT loottable.id, loottable.mincash, loottable.maxcash, loottable.avgcoin, " "loottable_entries.lootdrop_id, loottable_entries.multiplier, loottable_entries.droplimit, " "loottable_entries.mindrop, loottable_entries.probability FROM loottable LEFT JOIN loottable_entries " - "ON loottable.id = loottable_entries.loottable_id WHERE %d & loottable.expansions = loottable.expansions ORDER BY id", RuleI(World, ExpansionSettings)); + "ON loottable.id = loottable_entries.loottable_id WHERE min_expansion <= %i AND max_expansion >= %i ORDER BY id", latest_expansion, latest_expansion); auto results = QueryDatabase(query); if (!results.Success()) { return; @@ -2034,7 +2035,7 @@ void SharedDatabase::LoadLootDrops(void *data, uint32 size) { uint8 loot_drop[sizeof(LootDrop_Struct) + (sizeof(LootDropEntries_Struct) * 1260)]; LootDrop_Struct *ld = reinterpret_cast(loot_drop); - auto latest_expansion = EQEmu::expansions::ConvertExpansionBitToExpansion(RuleI(World, ExpansionSettings)); + auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings)); const std::string query = StringFormat("SELECT lootdrop.id, lootdrop_entries.item_id, lootdrop_entries.item_charges, " "lootdrop_entries.equip_item, lootdrop_entries.chance, lootdrop_entries.minlevel, " "lootdrop_entries.maxlevel, lootdrop_entries.multiplier FROM lootdrop JOIN lootdrop_entries " diff --git a/utils/deprecated/apathing/load_db.cpp b/utils/deprecated/apathing/load_db.cpp index 3c2984e52..7627183d0 100644 --- a/utils/deprecated/apathing/load_db.cpp +++ b/utils/deprecated/apathing/load_db.cpp @@ -146,7 +146,7 @@ bool load_spawns_from_db(MYSQL *m, const char *zone, list &db_spawns) bool load_doors_from_db(MYSQL *m, const char *zone, list &db_spawns) { char query[512]; - auto latest_expansion = EQEmu::expansions::ConvertExpansionBitToExpansion(RuleI(World, ExpansionSettings)); + auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings)); sprintf(query, "SELECT pos_x,pos_y,pos_z FROM doors " "WHERE zone='%s' AND min_expansion <= %i AND max_expansion >= %i", zone, latest_expansion, latest_expansion); diff --git a/world/adventure_manager.cpp b/world/adventure_manager.cpp index b98da1816..2243c6c9d 100644 --- a/world/adventure_manager.cpp +++ b/world/adventure_manager.cpp @@ -637,15 +637,18 @@ bool AdventureManager::LoadAdventureTemplates() "assa_y, assa_z, assa_h, text, duration, zone_in_time, win_points, lose_points, " "theme, zone_in_zone_id, zone_in_x, zone_in_y, zone_in_object_id, dest_x, dest_y, " "dest_z, dest_h, graveyard_zone_id, graveyard_x, graveyard_y, graveyard_z, " - "graveyard_radius, expansions FROM adventure_template"; + "graveyard_radius, min_expansion, max_expansion FROM adventure_template"; auto results = database.QueryDatabase(query); if (!results.Success()) { return false; } + auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings)); for (auto row = results.begin(); row != results.end(); ++row) { - int32 expansions = atoi(row[32]); - if (RuleI(World, ExpansionSettings) & expansions != expansions) { + uint32 min_expansion = atoi(row[32]); + uint32 max_expansion = atoi(row[33]); + + if (latest_expansion < min_expansion || latest_expansion > max_expansion) { continue; } auto aTemplate = new AdventureTemplate; diff --git a/zone/command.cpp b/zone/command.cpp index 2191ef255..ce46550f3 100755 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -9472,7 +9472,7 @@ void command_object(Client *c, const Seperator *sep) uint32 newid = 0; uint16 radius; EQApplicationPacket *app; - auto latest_expansion = EQEmu::expansions::ConvertExpansionBitToExpansion(RuleI(World, ExpansionSettings)); + auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings)); bool bNewObject = false; @@ -9504,7 +9504,7 @@ void command_object(Client *c, const Seperator *sep) else c->Message(0, "Objects within %u units of your current location:", radius); - auto latest_expansion = EQEmu::expansions::ConvertExpansionBitToExpansion(RuleI(World, ExpansionSettings)); + auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings)); std::string query; if (radius) diff --git a/zone/forage.cpp b/zone/forage.cpp index 05c7733d5..5fde3296a 100644 --- a/zone/forage.cpp +++ b/zone/forage.cpp @@ -54,7 +54,7 @@ uint32 ZoneDatabase::GetZoneForage(uint32 ZoneID, uint8 skill) { } uint32 chancepool = 0; - auto latest_expansion = EQEmu::expansions::ConvertExpansionBitToExpansion(RuleI(World, ExpansionSettings)); + auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings)); std::string query = StringFormat("SELECT itemid, chance FROM " "forage WHERE zoneid = '%i' AND level <= '%i' AND min_expansion <= %i AND max_expansion >= %i " "LIMIT %i", ZoneID, skill, latest_expansion, latest_expansion, FORAGE_ITEM_LIMIT); @@ -110,7 +110,7 @@ uint32 ZoneDatabase::GetZoneFishing(uint32 ZoneID, uint8 skill, uint32 &npc_id, chance[c]=0; } - auto latest_expansion = EQEmu::expansions::ConvertExpansionBitToExpansion(RuleI(World, ExpansionSettings)); + auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings)); std::string query = StringFormat("SELECT itemid, chance, npc_id, npc_chance " "FROM fishing WHERE (zoneid = '%i' || zoneid = 0) AND skill_level <= '%i' AND min_expansion <= %i AND max_expansion >= %i", ZoneID, skill, latest_expansion, latest_expansion); diff --git a/zone/loottables.cpp b/zone/loottables.cpp index 8198c1fa5..4970f20f1 100644 --- a/zone/loottables.cpp +++ b/zone/loottables.cpp @@ -463,7 +463,7 @@ void NPC::CheckGlobalLootTables() void ZoneDatabase::LoadGlobalLoot() { - auto latest_expansion = EQEmu::expansions::ConvertExpansionBitToExpansion(RuleI(World, ExpansionSettings)); + auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings)); auto query = StringFormat("SELECT id, loottable_id, description, min_level, max_level, rare, raid, race, " "class, bodytype, zone FROM global_loot WHERE enabled = 1 AND min_expansion <= %i AND max_expansion >= %i", latest_expansion, latest_expansion); diff --git a/zone/object.cpp b/zone/object.cpp index d93ff7e36..227cd529f 100644 --- a/zone/object.cpp +++ b/zone/object.cpp @@ -694,7 +694,7 @@ void ZoneDatabase::UpdateObject(uint32 id, uint32 type, uint32 icon, const Objec } Ground_Spawns* ZoneDatabase::LoadGroundSpawns(uint32 zone_id, int16 version, Ground_Spawns* gs) { - auto latest_expansion = EQEmu::expansions::ConvertExpansionBitToExpansion(RuleI(World, ExpansionSettings)); + auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings)); std::string query = StringFormat("SELECT max_x, max_y, max_z, " "min_x, min_y, heading, name, " "item, max_allowed, respawn_timer " diff --git a/zone/spawn2.cpp b/zone/spawn2.cpp index b8163b60e..e19bf7f0a 100644 --- a/zone/spawn2.cpp +++ b/zone/spawn2.cpp @@ -639,7 +639,7 @@ bool ZoneDatabase::PopulateZoneSpawnList(uint32 zoneid, LinkedList &spa Spawn2* ZoneDatabase::LoadSpawn2(LinkedList &spawn2_list, uint32 spawn2id, uint32 timeleft) { - auto latest_expansion = EQEmu::expansions::ConvertExpansionBitToExpansion(RuleI(World, ExpansionSettings)); + auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings)); std::string query = StringFormat("SELECT id, spawngroupID, x, y, z, heading, " "respawntime, variance, pathgrid, _condition, " "cond_value, enabled, animation FROM spawn2 " diff --git a/zone/titles.cpp b/zone/titles.cpp index c05be6422..3263a525d 100644 --- a/zone/titles.cpp +++ b/zone/titles.cpp @@ -35,10 +35,10 @@ TitleManager::TitleManager() { bool TitleManager::LoadTitles() { Titles.clear(); - + auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings)); std::string query = StringFormat("SELECT `id`, `skill_id`, `min_skill_value`, `max_skill_value`, " "`min_aa_points`, `max_aa_points`, `class`, `gender`, `char_id`, " - "`status`, `item_id`, `prefix`, `suffix`, `title_set` FROM titles WHERE %i & expansions = expansions", RuleI(World, ExpansionSettings)); + "`status`, `item_id`, `prefix`, `suffix`, `title_set` FROM titles WHERE `min_expansion` <= %i AND `max_expansion` >= %i", latest_expansion, latest_expansion); auto results = database.QueryDatabase(query); if (!results.Success()) { return false; diff --git a/zone/tribute.cpp b/zone/tribute.cpp index 99d04cac6..4cb9004f9 100644 --- a/zone/tribute.cpp +++ b/zone/tribute.cpp @@ -387,7 +387,8 @@ bool ZoneDatabase::LoadTributes() { tribute_list.clear(); - const std::string query = StringFormat("SELECT id, name, descr, unknown, isguild FROM tributes WHERE %i & expansions = expansions", RuleI(World, ExpansionSettings)); + auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings)); + const std::string query = StringFormat("SELECT id, name, descr, unknown, isguild FROM tributes WHERE min_expansion <= %i AND max_expansion >= %i", latest_expansion, latest_expansion); auto results = QueryDatabase(query); if (!results.Success()) { return false; diff --git a/zone/zone.cpp b/zone/zone.cpp index 5ae65a110..311a54522 100755 --- a/zone/zone.cpp +++ b/zone/zone.cpp @@ -168,7 +168,7 @@ bool Zone::Bootup(uint32 iZoneID, uint32 iInstanceID, bool iStaticZone) { //this really loads the objects into entity_list bool Zone::LoadZoneObjects() { - auto latest_expansion = EQEmu::expansions::ConvertExpansionBitToExpansion(RuleI(World, ExpansionSettings)); + auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings)); std::string query = StringFormat("SELECT id, zoneid, xpos, ypos, zpos, heading, itemid, charges, objectname, type, icon, " "unknown08, unknown10, unknown20, unknown24, unknown76, size, tilt_x, tilt_y, display_name " @@ -465,7 +465,7 @@ void Zone::LoadTempMerchantData() { void Zone::LoadNewMerchantData(uint32 merchantid) { std::list merlist; - auto latest_expansion = EQEmu::expansions::ConvertExpansionBitToExpansion(RuleI(World, ExpansionSettings)); + auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings)); std::string query = StringFormat("SELECT item, slot, faction_required, level_required, alt_currency_cost, " "classes_required, probability FROM merchantlist WHERE merchantid=%d AND min_expansion <= %i AND max_expansion >= %i ORDER BY slot", merchantid, latest_expansion, latest_expansion); auto results = database.QueryDatabase(query); @@ -1705,7 +1705,7 @@ bool ZoneDatabase::LoadStaticZonePoints(LinkedList* zone_point_list, { zone_point_list->Clear(); zone->numzonepoints = 0; - auto latest_expansion = EQEmu::expansions::ConvertExpansionBitToExpansion(RuleI(World, ExpansionSettings)); + auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings)); std::string query = StringFormat("SELECT x, y, z, target_x, target_y, " "target_z, target_zone_id, heading, target_heading, " "number, target_instance, client_version_mask " diff --git a/zone/zoning.cpp b/zone/zoning.cpp index 3abc6424b..e2b513c50 100644 --- a/zone/zoning.cpp +++ b/zone/zoning.cpp @@ -269,7 +269,7 @@ void Client::Handle_OP_ZoneChange(const EQApplicationPacket *app) { //not sure when we would use ZONE_ERROR_NOTREADY - auto latest_expansion = EQEmu::expansions::ConvertExpansionBitToExpansion(RuleI(World, ExpansionSettings)); + auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings)); //enforce min status and level if (!ignorerestrictions && (Admin() < minstatus || GetLevel() < minlevel || (uint32)latest_expansion <= minexpansion || (uint32)latest_expansion >= maxexpansion)) @@ -883,7 +883,7 @@ bool Client::CanBeInZone() { Log(Logs::Detail, Logs::None, "[CLIENT] Character does not meet min status requirement (%d < %d)!", Admin(), minstatus); return(false); } - auto latest_expansion = EQEmu::expansions::ConvertExpansionBitToExpansion(RuleI(World, ExpansionSettings)); + auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings)); if(Admin() < 150 && (uint32)latest_expansion < minexpansion && (uint32)latest_expansion > maxexpansion) { Log(Logs::Detail, Logs::None, "[CLIENT] Character does not have expansion"); return(false);