From 7b2c87c7edfd042de4bcc6532e446ee0a0596adb Mon Sep 17 00:00:00 2001 From: Uleat Date: Sun, 20 Jan 2019 23:40:40 -0500 Subject: [PATCH] Added bi-state dynamic lookup return --- common/eq_limits.cpp | 228 ++++++++++++++++++++--------------- common/eq_limits.h | 12 +- common/inventory_profile.cpp | 5 +- 3 files changed, 139 insertions(+), 106 deletions(-) diff --git a/common/eq_limits.cpp b/common/eq_limits.cpp index 8727ba24b..b6e47ea36 100644 --- a/common/eq_limits.cpp +++ b/common/eq_limits.cpp @@ -37,8 +37,8 @@ void EQEmu::InitializeDynamicLookups() { global_dictionary_init = true; } +static std::unique_ptr constants_dynamic_nongm_lookup_entries[EQEmu::versions::ClientVersionCount]; static std::unique_ptr constants_dynamic_gm_lookup_entries[EQEmu::versions::ClientVersionCount]; -static std::unique_ptr constants_dynamic_lookup_entries[EQEmu::versions::ClientVersionCount]; static const EQEmu::constants::LookupEntry constants_static_lookup_entries[EQEmu::versions::ClientVersionCount] = { /*[ClientVersion::Unknown] =*/ @@ -119,6 +119,23 @@ void EQEmu::constants::InitializeDynamicLookups() { // use static references for now } +const EQEmu::constants::LookupEntry* EQEmu::constants::DynamicLookup(versions::ClientVersion client_version, bool gm_flag) +{ + if (gm_flag) + return DynamicGMLookup(client_version); + else + return DynamicNonGMLookup(client_version); +} + +const EQEmu::constants::LookupEntry* EQEmu::constants::DynamicNonGMLookup(versions::ClientVersion client_version) +{ + client_version = versions::ValidateClientVersion(client_version); + if (constants_dynamic_nongm_lookup_entries[static_cast(client_version)]) + return constants_dynamic_nongm_lookup_entries[static_cast(client_version)].get(); + + return &constants_static_lookup_entries[static_cast(client_version)]; +} + const EQEmu::constants::LookupEntry* EQEmu::constants::DynamicGMLookup(versions::ClientVersion client_version) { client_version = versions::ValidateClientVersion(client_version); @@ -128,22 +145,13 @@ const EQEmu::constants::LookupEntry* EQEmu::constants::DynamicGMLookup(versions: return &constants_static_lookup_entries[static_cast(client_version)]; } -const EQEmu::constants::LookupEntry* EQEmu::constants::DynamicLookup(versions::ClientVersion client_version) -{ - client_version = versions::ValidateClientVersion(client_version); - if (constants_dynamic_lookup_entries[static_cast(client_version)]) - return constants_dynamic_lookup_entries[static_cast(client_version)].get(); - - return &constants_static_lookup_entries[static_cast(client_version)]; -} - const EQEmu::constants::LookupEntry* EQEmu::constants::StaticLookup(versions::ClientVersion client_version) { return &constants_static_lookup_entries[static_cast(versions::ValidateClientVersion(client_version))]; } +static std::unique_ptr inventory_dynamic_nongm_lookup_entries[EQEmu::versions::MobVersionCount]; static std::unique_ptr inventory_dynamic_gm_lookup_entries[EQEmu::versions::MobVersionCount]; -static std::unique_ptr inventory_dynamic_lookup_entries[EQEmu::versions::MobVersionCount]; static const EQEmu::inventory::LookupEntry inventory_static_lookup_entries[EQEmu::versions::MobVersionCount] = { /*[MobVersion::Unknown] =*/ @@ -775,6 +783,63 @@ void EQEmu::inventory::InitializeDynamicLookups() { if ((dynamic_check_mask & RuleI(World, ExpansionSettings)) == dynamic_check_mask) return; + // Dynamic Lookups (promotive methodology) (all mob versions allowed) + for (uint32 iter = static_cast(EQEmu::versions::MobVersion::Unknown); iter <= static_cast(EQEmu::versions::LastPCMobVersion); ++iter) { + // no need to dynamic this condition since it is the lowest compatibility standard + if ((dynamic_check_mask & ~constants_static_lookup_entries[iter].ExpansionsMask) == dynamic_check_mask) + continue; + + // only client versions whose supported expansions are affected need to be considered + if ((constants_static_lookup_entries[iter].ExpansionsMask & RuleI(World, ExpansionSettings)) == constants_static_lookup_entries[iter].ExpansionsMask) + continue; + + // direct manipulation of lookup indices is safe so long as (int)ClientVersion:: == (int)MobVersion:: + inventory_dynamic_nongm_lookup_entries[iter] = std::unique_ptr(new LookupEntry(inventory_static_lookup_entries[iter])); + + // clamp affected fields to the lowest standard + inventory_dynamic_nongm_lookup_entries[iter]->InventoryTypeSize.Bank = Titanium::invtype::BANK_SIZE; // bank size + inventory_dynamic_nongm_lookup_entries[iter]->EquipmentBitmask = Titanium::invslot::EQUIPMENT_BITMASK; // power source + inventory_dynamic_nongm_lookup_entries[iter]->GeneralBitmask = Titanium::invslot::GENERAL_BITMASK; // general size + inventory_dynamic_nongm_lookup_entries[iter]->PossessionsBitmask = 0; // we'll fix later + inventory_dynamic_nongm_lookup_entries[iter]->CorpseBitmask = 0; // we'll fix later + + if (RuleI(World, ExpansionSettings) & EQEmu::expansions::bitPoR) { + // update bank size + if (constants_static_lookup_entries[iter].ExpansionsMask & EQEmu::expansions::bitPoR) + inventory_dynamic_nongm_lookup_entries[iter]->InventoryTypeSize.Bank = SoF::invtype::BANK_SIZE; + } + + if (RuleI(World, ExpansionSettings) & EQEmu::expansions::bitTBS) { + // update power source + if (constants_static_lookup_entries[iter].ExpansionsMask & EQEmu::expansions::bitTBS) + inventory_dynamic_nongm_lookup_entries[iter]->EquipmentBitmask = SoF::invslot::EQUIPMENT_BITMASK; + } + + if (RuleI(World, ExpansionSettings) & EQEmu::expansions::bitHoT) { + // update general size + if (constants_static_lookup_entries[iter].ExpansionsMask & EQEmu::expansions::bitHoT) + inventory_dynamic_nongm_lookup_entries[iter]->GeneralBitmask = RoF::invslot::GENERAL_BITMASK; + } + + // fixup possessions bitmask + inventory_dynamic_nongm_lookup_entries[iter]->PossessionsBitmask = + ( + inventory_dynamic_nongm_lookup_entries[iter]->EquipmentBitmask | + inventory_dynamic_nongm_lookup_entries[iter]->GeneralBitmask | + inventory_dynamic_nongm_lookup_entries[iter]->CursorBitmask + ); + + // fixup corpse bitmask + inventory_dynamic_nongm_lookup_entries[iter]->CorpseBitmask = + ( + inventory_dynamic_nongm_lookup_entries[iter]->GeneralBitmask | + inventory_dynamic_nongm_lookup_entries[iter]->CursorBitmask | + (inventory_dynamic_nongm_lookup_entries[iter]->EquipmentBitmask << 34) + ); + + // expansion-related fields are now updated and all other fields reflect the static entry values + } + // Dynamic GM Lookups (demotive methodology) (client-linked mob versions only) for (uint32 iter = static_cast(EQEmu::versions::MobVersion::Unknown); iter <= static_cast(EQEmu::versions::LastPCMobVersion); ++iter) { // no need to dynamic this condition since it is the lowest compatibility standard @@ -846,7 +911,7 @@ void EQEmu::inventory::InitializeDynamicLookups() { inventory_dynamic_gm_lookup_entries[iter]->EquipmentBitmask | inventory_dynamic_gm_lookup_entries[iter]->GeneralBitmask | inventory_dynamic_gm_lookup_entries[iter]->CursorBitmask - ); + ); // fixup corpse bitmask inventory_dynamic_gm_lookup_entries[iter]->CorpseBitmask = @@ -854,63 +919,6 @@ void EQEmu::inventory::InitializeDynamicLookups() { inventory_dynamic_gm_lookup_entries[iter]->GeneralBitmask | inventory_dynamic_gm_lookup_entries[iter]->CursorBitmask | (inventory_dynamic_gm_lookup_entries[iter]->EquipmentBitmask << 34) - ); - - // expansion-related fields are now updated and all other fields reflect the static entry values - } - - // Dynamic Lookups (promotive methodology) (all mob versions allowed) - for (uint32 iter = static_cast(EQEmu::versions::MobVersion::Unknown); iter <= static_cast(EQEmu::versions::LastPCMobVersion); ++iter) { - // no need to dynamic this condition since it is the lowest compatibility standard - if ((dynamic_check_mask & ~constants_static_lookup_entries[iter].ExpansionsMask) == dynamic_check_mask) - continue; - - // only client versions whose supported expansions are affected need to be considered - if ((constants_static_lookup_entries[iter].ExpansionsMask & RuleI(World, ExpansionSettings)) == constants_static_lookup_entries[iter].ExpansionsMask) - continue; - - // direct manipulation of lookup indices is safe so long as (int)ClientVersion:: == (int)MobVersion:: - inventory_dynamic_lookup_entries[iter] = std::unique_ptr(new LookupEntry(inventory_static_lookup_entries[iter])); - - // clamp affected fields to the lowest standard - inventory_dynamic_lookup_entries[iter]->InventoryTypeSize.Bank = Titanium::invtype::BANK_SIZE; // bank size - inventory_dynamic_lookup_entries[iter]->EquipmentBitmask = Titanium::invslot::EQUIPMENT_BITMASK; // power source - inventory_dynamic_lookup_entries[iter]->GeneralBitmask = Titanium::invslot::GENERAL_BITMASK; // general size - inventory_dynamic_lookup_entries[iter]->PossessionsBitmask = 0; // we'll fix later - inventory_dynamic_lookup_entries[iter]->CorpseBitmask = 0; // we'll fix later - - if (RuleI(World, ExpansionSettings) & EQEmu::expansions::bitPoR) { - // update bank size - if (constants_static_lookup_entries[iter].ExpansionsMask & EQEmu::expansions::bitPoR) - inventory_dynamic_lookup_entries[iter]->InventoryTypeSize.Bank = SoF::invtype::BANK_SIZE; - } - - if (RuleI(World, ExpansionSettings) & EQEmu::expansions::bitTBS) { - // update power source - if (constants_static_lookup_entries[iter].ExpansionsMask & EQEmu::expansions::bitTBS) - inventory_dynamic_lookup_entries[iter]->EquipmentBitmask = SoF::invslot::EQUIPMENT_BITMASK; - } - - if (RuleI(World, ExpansionSettings) & EQEmu::expansions::bitHoT) { - // update general size - if (constants_static_lookup_entries[iter].ExpansionsMask & EQEmu::expansions::bitHoT) - inventory_dynamic_lookup_entries[iter]->GeneralBitmask = RoF::invslot::GENERAL_BITMASK; - } - - // fixup possessions bitmask - inventory_dynamic_lookup_entries[iter]->PossessionsBitmask = - ( - inventory_dynamic_lookup_entries[iter]->EquipmentBitmask | - inventory_dynamic_lookup_entries[iter]->GeneralBitmask | - inventory_dynamic_lookup_entries[iter]->CursorBitmask - ); - - // fixup corpse bitmask - inventory_dynamic_lookup_entries[iter]->CorpseBitmask = - ( - inventory_dynamic_lookup_entries[iter]->GeneralBitmask | - inventory_dynamic_lookup_entries[iter]->CursorBitmask | - (inventory_dynamic_lookup_entries[iter]->EquipmentBitmask << 34) ); // expansion-related fields are now updated and all other fields reflect the static entry values @@ -919,6 +927,23 @@ void EQEmu::inventory::InitializeDynamicLookups() { // only client versions that require a change from their static definitions have been given a dynamic (gm) lookup entry } +const EQEmu::inventory::LookupEntry* EQEmu::inventory::DynamicLookup(versions::MobVersion mob_version, bool gm_flag) +{ + if (gm_flag) + return DynamicGMLookup(mob_version); + else + return DynamicNonGMLookup(mob_version); +} + +const EQEmu::inventory::LookupEntry* EQEmu::inventory::DynamicNonGMLookup(versions::MobVersion mob_version) +{ + mob_version = versions::ValidateMobVersion(mob_version); + if (inventory_dynamic_nongm_lookup_entries[static_cast(mob_version)]) + return inventory_dynamic_nongm_lookup_entries[static_cast(mob_version)].get(); + + return &inventory_static_lookup_entries[static_cast(mob_version)]; +} + const EQEmu::inventory::LookupEntry* EQEmu::inventory::DynamicGMLookup(versions::MobVersion mob_version) { mob_version = versions::ValidateMobVersion(mob_version); @@ -928,22 +953,13 @@ const EQEmu::inventory::LookupEntry* EQEmu::inventory::DynamicGMLookup(versions: return &inventory_static_lookup_entries[static_cast(mob_version)]; } -const EQEmu::inventory::LookupEntry* EQEmu::inventory::DynamicLookup(versions::MobVersion mob_version) -{ - mob_version = versions::ValidateMobVersion(mob_version); - if (inventory_dynamic_lookup_entries[static_cast(mob_version)]) - return inventory_dynamic_lookup_entries[static_cast(mob_version)].get(); - - return &inventory_static_lookup_entries[static_cast(mob_version)]; -} - const EQEmu::inventory::LookupEntry* EQEmu::inventory::StaticLookup(versions::MobVersion mob_version) { return &inventory_static_lookup_entries[static_cast(versions::ValidateMobVersion(mob_version))]; } +static std::unique_ptr behavior_dynamic_nongm_lookup_entries[EQEmu::versions::MobVersionCount]; static std::unique_ptr behavior_dynamic_gm_lookup_entries[EQEmu::versions::MobVersionCount]; -static std::unique_ptr behavior_dynamic_lookup_entries[EQEmu::versions::MobVersionCount]; static const EQEmu::behavior::LookupEntry behavior_static_lookup_entries[EQEmu::versions::MobVersionCount] = { /*[MobVersion::Unknown] =*/ @@ -1048,6 +1064,23 @@ void EQEmu::behavior::InitializeDynamicLookups() { // use static references for now } +const EQEmu::behavior::LookupEntry* EQEmu::behavior::DynamicLookup(versions::MobVersion mob_version, bool gm_flag) +{ + if (gm_flag) + return DynamicGMLookup(mob_version); + else + return DynamicNonGMLookup(mob_version); +} + +const EQEmu::behavior::LookupEntry* EQEmu::behavior::DynamicNonGMLookup(versions::MobVersion mob_version) +{ + mob_version = versions::ValidateMobVersion(mob_version); + if (behavior_dynamic_nongm_lookup_entries[static_cast(mob_version)]) + return behavior_dynamic_nongm_lookup_entries[static_cast(mob_version)].get(); + + return &behavior_static_lookup_entries[static_cast(mob_version)]; +} + const EQEmu::behavior::LookupEntry* EQEmu::behavior::DynamicGMLookup(versions::MobVersion mob_version) { mob_version = versions::ValidateMobVersion(mob_version); @@ -1057,22 +1090,13 @@ const EQEmu::behavior::LookupEntry* EQEmu::behavior::DynamicGMLookup(versions::M return &behavior_static_lookup_entries[static_cast(mob_version)]; } -const EQEmu::behavior::LookupEntry* EQEmu::behavior::DynamicLookup(versions::MobVersion mob_version) -{ - mob_version = versions::ValidateMobVersion(mob_version); - if (behavior_dynamic_lookup_entries[static_cast(mob_version)]) - return behavior_dynamic_lookup_entries[static_cast(mob_version)].get(); - - return &behavior_static_lookup_entries[static_cast(mob_version)]; -} - const EQEmu::behavior::LookupEntry* EQEmu::behavior::StaticLookup(versions::MobVersion mob_version) { return &behavior_static_lookup_entries[static_cast(versions::ValidateMobVersion(mob_version))]; } +static std::unique_ptr spells_dynamic_nongm_lookup_entries[EQEmu::versions::ClientVersionCount]; static std::unique_ptr spells_dynamic_gm_lookup_entries[EQEmu::versions::ClientVersionCount]; -static std::unique_ptr spells_dynamic_lookup_entries[EQEmu::versions::ClientVersionCount]; static const EQEmu::spells::LookupEntry spells_static_lookup_entries[EQEmu::versions::ClientVersionCount] = { /*[ClientVersion::Unknown] =*/ @@ -1193,6 +1217,23 @@ void EQEmu::spells::InitializeDynamicLookups() { // use static references for now } +const EQEmu::spells::LookupEntry* EQEmu::spells::DynamicLookup(versions::ClientVersion client_version, bool gm_flag) +{ + if (gm_flag) + return DynamicGMLookup(client_version); + else + return DynamicNonGMLookup(client_version); +} + +const EQEmu::spells::LookupEntry* EQEmu::spells::DynamicNonGMLookup(versions::ClientVersion client_version) +{ + client_version = versions::ValidateClientVersion(client_version); + if (spells_dynamic_nongm_lookup_entries[static_cast(client_version)]) + return spells_dynamic_nongm_lookup_entries[static_cast(client_version)].get(); + + return &spells_static_lookup_entries[static_cast(client_version)]; +} + const EQEmu::spells::LookupEntry* EQEmu::spells::DynamicGMLookup(versions::ClientVersion client_version) { client_version = versions::ValidateClientVersion(client_version); @@ -1202,15 +1243,6 @@ const EQEmu::spells::LookupEntry* EQEmu::spells::DynamicGMLookup(versions::Clien return &spells_static_lookup_entries[static_cast(client_version)]; } -const EQEmu::spells::LookupEntry* EQEmu::spells::DynamicLookup(versions::ClientVersion client_version) -{ - client_version = versions::ValidateClientVersion(client_version); - if (spells_dynamic_lookup_entries[static_cast(client_version)]) - return spells_dynamic_lookup_entries[static_cast(client_version)].get(); - - return &spells_static_lookup_entries[static_cast(client_version)]; -} - const EQEmu::spells::LookupEntry* EQEmu::spells::StaticLookup(versions::ClientVersion client_version) { return &spells_static_lookup_entries[static_cast(versions::ValidateClientVersion(client_version))]; diff --git a/common/eq_limits.h b/common/eq_limits.h index 0c862fe38..1f83c4606 100644 --- a/common/eq_limits.h +++ b/common/eq_limits.h @@ -61,8 +61,9 @@ namespace EQEmu void InitializeDynamicLookups(); + const LookupEntry* DynamicLookup(versions::ClientVersion client_version, bool gm_flag); + const LookupEntry* DynamicNonGMLookup(versions::ClientVersion client_version); const LookupEntry* DynamicGMLookup(versions::ClientVersion client_version); - const LookupEntry* DynamicLookup(versions::ClientVersion client_version); const LookupEntry* StaticLookup(versions::ClientVersion client_version); } /*constants*/ @@ -158,8 +159,9 @@ namespace EQEmu void InitializeDynamicLookups(); + const LookupEntry* DynamicLookup(versions::MobVersion mob_version, bool gm_flag); + const LookupEntry* DynamicNonGMLookup(versions::MobVersion mob_version); const LookupEntry* DynamicGMLookup(versions::MobVersion mob_version); - const LookupEntry* DynamicLookup(versions::MobVersion mob_version); const LookupEntry* StaticLookup(versions::MobVersion mob_version); } /*inventory*/ @@ -178,8 +180,9 @@ namespace EQEmu void InitializeDynamicLookups(); + const LookupEntry* DynamicLookup(versions::MobVersion mob_version, bool gm_flag); + const LookupEntry* DynamicNonGMLookup(versions::MobVersion mob_version); const LookupEntry* DynamicGMLookup(versions::MobVersion mob_version); - const LookupEntry* DynamicLookup(versions::MobVersion mob_version); const LookupEntry* StaticLookup(versions::MobVersion mob_version); } /*behavior*/ @@ -226,8 +229,9 @@ namespace EQEmu void InitializeDynamicLookups(); + const LookupEntry* DynamicLookup(versions::ClientVersion client_version, bool gm_flag); + const LookupEntry* DynamicNonGMLookup(versions::ClientVersion client_version); const LookupEntry* DynamicGMLookup(versions::ClientVersion client_version); - const LookupEntry* DynamicLookup(versions::ClientVersion client_version); const LookupEntry* StaticLookup(versions::ClientVersion client_version); } /*spells*/ diff --git a/common/inventory_profile.cpp b/common/inventory_profile.cpp index 2fe73ee19..826c84fb4 100644 --- a/common/inventory_profile.cpp +++ b/common/inventory_profile.cpp @@ -127,10 +127,7 @@ void EQEmu::InventoryProfile::SetInventoryVersion(versions::MobVersion inventory void EQEmu::InventoryProfile::SetGMInventory(bool gmi_flag) { m_gm_inventory = gmi_flag; - if (m_gm_inventory) - m_lookup = inventory::DynamicGMLookup(m_mob_version); - else - m_lookup = inventory::DynamicLookup(m_mob_version); + m_lookup = inventory::DynamicLookup(m_mob_version, gmi_flag); } void EQEmu::InventoryProfile::CleanDirty() {