diff options
| author | Shauren <shauren.trinity@gmail.com> | 2025-04-25 22:50:11 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2025-04-25 22:50:11 +0200 |
| commit | f9bf082be962d45de79f936d625f644253e9b810 (patch) | |
| tree | a7c40c0b5baf522d04896721df5c5d91e25c834e /src/server/game/Entities | |
| parent | 05709a24976cc4cd378ee62bdfec52510892aa5b (diff) | |
Core: Updated to 11.1.5
Diffstat (limited to 'src/server/game/Entities')
| -rw-r--r-- | src/server/game/Entities/Creature/GossipDef.cpp | 5 | ||||
| -rw-r--r-- | src/server/game/Entities/Creature/GossipDef.h | 6 | ||||
| -rw-r--r-- | src/server/game/Entities/Item/ItemTemplate.h | 6 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/Updates/UpdateFields.cpp | 93 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/Updates/UpdateFields.h | 11 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 32 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.h | 5 |
7 files changed, 72 insertions, 86 deletions
diff --git a/src/server/game/Entities/Creature/GossipDef.cpp b/src/server/game/Entities/Creature/GossipDef.cpp index d5785084f88..85d6ecb7e3d 100644 --- a/src/server/game/Entities/Creature/GossipDef.cpp +++ b/src/server/game/Entities/Creature/GossipDef.cpp @@ -287,6 +287,7 @@ void PlayerMenu::SendGossipMenu(uint32 titleTextId, ObjectGuid objectGUID) text.QuestFlags[0] = quest->GetFlags(); text.QuestFlags[1] = quest->GetFlagsEx(); text.QuestFlags[2] = quest->GetFlagsEx2(); + text.QuestFlags[3] = quest->GetFlagsEx3(); text.Repeatable = quest->IsTurnIn() && quest->IsRepeatable() && !quest->IsDailyOrWeekly() && !quest->IsMonthly(); text.ResetByScheduler = quest->IsResetByScheduler(); text.Important = quest->IsImportant(); @@ -418,6 +419,7 @@ void PlayerMenu::SendQuestGiverQuestListMessage(Object* questgiver) text.QuestFlags[0] = quest->GetFlags(); text.QuestFlags[1] = quest->GetFlagsEx(); text.QuestFlags[2] = quest->GetFlagsEx2(); + text.QuestFlags[3] = quest->GetFlagsEx3(); text.Repeatable = quest->IsTurnIn() && quest->IsRepeatable() && !quest->IsDailyOrWeekly() && !quest->IsMonthly(); text.ResetByScheduler = quest->IsResetByScheduler(); text.Important = quest->IsImportant(); @@ -495,6 +497,7 @@ void PlayerMenu::SendQuestGiverQuestDetails(Quest const* quest, ObjectGuid npcGU packet.QuestFlags[0] = quest->GetFlags() & (sWorld->getBoolConfig(CONFIG_QUEST_IGNORE_AUTO_ACCEPT) ? ~QUEST_FLAGS_AUTO_ACCEPT : ~0); packet.QuestFlags[1] = quest->GetFlagsEx(); packet.QuestFlags[2] = quest->GetFlagsEx2(); + packet.QuestFlags[3] = quest->GetFlagsEx3(); packet.SuggestedPartyMembers = quest->GetSuggestedPlayers(); // Is there a better way? what about game objects? @@ -602,6 +605,7 @@ void PlayerMenu::SendQuestGiverOfferReward(Quest const* quest, ObjectGuid npcGUI offer.QuestFlags[0] = quest->GetFlags(); offer.QuestFlags[1] = quest->GetFlagsEx(); offer.QuestFlags[2] = quest->GetFlagsEx2(); + offer.QuestFlags[3] = quest->GetFlagsEx3(); packet.PortraitTurnIn = quest->GetQuestTurnInPortrait(); packet.PortraitGiver = quest->GetQuestGiverPortrait(); @@ -668,6 +672,7 @@ void PlayerMenu::SendQuestGiverRequestItems(Quest const* quest, ObjectGuid npcGU packet.QuestFlags[0] = quest->GetFlags(); packet.QuestFlags[1] = quest->GetFlagsEx(); packet.QuestFlags[2] = quest->GetFlagsEx2(); + packet.QuestFlags[3] = quest->GetFlagsEx3(); packet.SuggestPartyMembers = quest->GetSuggestedPlayers(); packet.QuestInfoID = quest->GetQuestInfoID(); diff --git a/src/server/game/Entities/Creature/GossipDef.h b/src/server/game/Entities/Creature/GossipDef.h index 524a98a687e..03ac95cb8f7 100644 --- a/src/server/game/Entities/Creature/GossipDef.h +++ b/src/server/game/Entities/Creature/GossipDef.h @@ -92,6 +92,12 @@ enum class GossipOptionNpc : uint8 CharacterBanker = 56, AccountBanker = 57, ProfessionRespec = 58, + Placeholder1 = 59, + Placeholder2 = 60, + Placeholder3 = 61, + GuildRename = 62, + Placeholder4 = 63, + ItemUpgrade = 64, Count }; diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h index 6dcdf08e85c..c7853ca5214 100644 --- a/src/server/game/Entities/Item/ItemTemplate.h +++ b/src/server/game/Entities/Item/ItemTemplate.h @@ -472,10 +472,12 @@ enum ItemSubclassConsumable ITEM_SUBCLASS_ITEM_ENHANCEMENT = 6, ITEM_SUBCLASS_BANDAGE = 7, ITEM_SUBCLASS_CONSUMABLE_OTHER = 8, - ITEM_SUBCLASS_VANTUS_RUNE = 9 + ITEM_SUBCLASS_VANTUS_RUNE = 9, + ITEM_SUBCLASS_UTILITY_CURIO = 10, + ITEM_SUBCLASS_COMBAT_CURIO = 11, }; -#define MAX_ITEM_SUBCLASS_CONSUMABLE 10 +#define MAX_ITEM_SUBCLASS_CONSUMABLE 12 enum ItemSubclassContainer { diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.cpp b/src/server/game/Entities/Object/Updates/UpdateFields.cpp index cc073ad6592..c575c61f10b 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.cpp +++ b/src/server/game/Entities/Object/Updates/UpdateFields.cpp @@ -3061,7 +3061,7 @@ void BitVectors::ClearChangesMask() void PlayerDataElement::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const { - data.WriteBits(Type, 1); + data << uint32(Type); if (Type == 1) { data << float(FloatValue); @@ -3070,12 +3070,11 @@ void PlayerDataElement::WriteCreate(ByteBuffer& data, Player const* owner, Playe { data << int64(Int64Value); } - data.FlushBits(); } void PlayerDataElement::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const { - data.WriteBits(Type, 1); + data << uint32(Type); if (Type == 1) { data << float(FloatValue); @@ -3084,7 +3083,6 @@ void PlayerDataElement::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Pl { data << int64(Int64Value); } - data.FlushBits(); } bool PlayerDataElement::operator==(PlayerDataElement const& right) const @@ -4760,7 +4758,7 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f data << uint8(MultiActionBars); data << uint8(LifetimeMaxRank); data << uint8(NumRespecs); - data << uint8(PvpMedals); + data << uint32(PvpMedals); for (uint32 i = 0; i < 12; ++i) { data << uint32(BuybackPrice[i]); @@ -4807,10 +4805,6 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f { data << uint32(BankBagSlotFlags[i]); } - for (uint32 i = 0; i < 1000; ++i) - { - data << uint64(QuestCompleted[i]); - } data << int32(Honor); data << int32(HonorNextLevel); data << int32(PerksProgramCurrency); @@ -4883,6 +4877,14 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f { data << uint64(KnownTitles[i]); } + for (uint32 i = 0; i < CharacterDataElements.size(); ++i) + { + CharacterDataElements[i].WriteCreate(data, owner, receiver); + } + for (uint32 i = 0; i < AccountDataElements.size(); ++i) + { + AccountDataElements[i].WriteCreate(data, owner, receiver); + } for (uint32 i = 0; i < DailyQuestsCompleted.size(); ++i) { data << int32(DailyQuestsCompleted[i]); @@ -5004,14 +5006,6 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f data << FrozenPerksVendorItem; Field_1410->WriteCreate(data, owner, receiver); data << DungeonScore; - for (uint32 i = 0; i < CharacterDataElements.size(); ++i) - { - CharacterDataElements[i].WriteCreate(data, owner, receiver); - } - for (uint32 i = 0; i < AccountDataElements.size(); ++i) - { - AccountDataElements[i].WriteCreate(data, owner, receiver); - } for (uint32 i = 0; i < PvpInfo.size(); ++i) { PvpInfo[i].WriteCreate(data, owner, receiver); @@ -5054,10 +5048,8 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, Player const* owner, Player const* receiver) const { - for (uint32 i = 0; i < 1; ++i) - data << uint32(changesMask.GetBlocksMask(i)); - data.WriteBits(changesMask.GetBlocksMask(1), 16); - for (uint32 i = 0; i < 48; ++i) + data.WriteBits(changesMask.GetBlocksMask(0), 17); + for (uint32 i = 0; i < 17; ++i) if (changesMask.GetBlock(i)) data.WriteBits(changesMask.GetBlock(i), 32); @@ -5419,6 +5411,26 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } + if (changesMask[8]) + { + for (uint32 i = 0; i < CharacterDataElements.size(); ++i) + { + if (CharacterDataElements.HasChanged(i) || ignoreNestedChangesMask) + { + CharacterDataElements[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } + } + if (changesMask[9]) + { + for (uint32 i = 0; i < AccountDataElements.size(); ++i) + { + if (AccountDataElements.HasChanged(i) || ignoreNestedChangesMask) + { + AccountDataElements[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } + } if (changesMask[11]) { for (uint32 i = 0; i < DailyQuestsCompleted.size(); ++i) @@ -5682,26 +5694,6 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } if (changesMask[0]) { - if (changesMask[8]) - { - for (uint32 i = 0; i < CharacterDataElements.size(); ++i) - { - if (CharacterDataElements.HasChanged(i) || ignoreNestedChangesMask) - { - CharacterDataElements[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); - } - } - } - if (changesMask[9]) - { - for (uint32 i = 0; i < AccountDataElements.size(); ++i) - { - if (AccountDataElements.HasChanged(i) || ignoreNestedChangesMask) - { - AccountDataElements[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); - } - } - } if (changesMask[10]) { for (uint32 i = 0; i < PvpInfo.size(); ++i) @@ -5956,7 +5948,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } if (changesMask[97]) { - data << uint8(PvpMedals); + data << uint32(PvpMedals); } if (changesMask[98]) { @@ -6300,19 +6292,9 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } if (changesMask[498]) { - for (uint32 i = 0; i < 1000; ++i) - { - if (changesMask[499 + i]) - { - data << uint64(QuestCompleted[i]); - } - } - } - if (changesMask[1499]) - { for (uint32 i = 0; i < 17; ++i) { - if (changesMask[1500 + i]) + if (changesMask[499 + i]) { data << float(ItemUpgradeHighWatermark[i]); } @@ -6333,6 +6315,8 @@ void ActivePlayerData::ClearChangesMask() Base::ClearChangesMask(ResearchSiteProgress); Base::ClearChangesMask(Research); Base::ClearChangesMask(KnownTitles); + Base::ClearChangesMask(CharacterDataElements); + Base::ClearChangesMask(AccountDataElements); Base::ClearChangesMask(DailyQuestsCompleted); Base::ClearChangesMask(AvailableQuestLineXQuestIDs); Base::ClearChangesMask(Heirlooms); @@ -6358,8 +6342,6 @@ void ActivePlayerData::ClearChangesMask() Base::ClearChangesMask(CategoryCooldownMods); Base::ClearChangesMask(WeeklySpellUses); Base::ClearChangesMask(TrackedCollectableSources); - Base::ClearChangesMask(CharacterDataElements); - Base::ClearChangesMask(AccountDataElements); Base::ClearChangesMask(PvpInfo); Base::ClearChangesMask(CharacterRestrictions); Base::ClearChangesMask(TraitConfigs); @@ -6476,7 +6458,6 @@ void ActivePlayerData::ClearChangesMask() Base::ClearChangesMask(ProfessionSkillLine); Base::ClearChangesMask(BagSlotFlags); Base::ClearChangesMask(BankBagSlotFlags); - Base::ClearChangesMask(QuestCompleted); Base::ClearChangesMask(ItemUpgradeHighWatermark); _changesMask.ResetAll(); } diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h index bc02576f7f6..d394afda2d9 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.h +++ b/src/server/game/Entities/Object/Updates/UpdateFields.h @@ -1034,7 +1034,7 @@ struct Research : public IsUpdateFieldStructureTag bool operator!=(Research const& right) const { return !(*this == right); } }; -struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<1517> +struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<516> { UpdateField<bool, 0, 1> BackpackAutoSortDisabled; UpdateField<bool, 0, 2> BackpackSellJunkDisabled; @@ -1046,6 +1046,8 @@ struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMas UpdateFieldArray<DynamicUpdateFieldBase<uint32>, 1, 43, 44> ResearchSiteProgress; UpdateFieldArray<DynamicUpdateFieldBase<UF::Research>, 1, 45, 46> Research; DynamicUpdateField<uint64, 0, 7> KnownTitles; + DynamicUpdateField<UF::PlayerDataElement, 0, 8> CharacterDataElements; + DynamicUpdateField<UF::PlayerDataElement, 0, 9> AccountDataElements; DynamicUpdateField<int32, 0, 11> DailyQuestsCompleted; DynamicUpdateField<int32, 0, 12> AvailableQuestLineXQuestIDs; DynamicUpdateField<int32, 0, 13> Heirlooms; @@ -1071,8 +1073,6 @@ struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMas DynamicUpdateField<UF::CategoryCooldownMod, 32, 37> CategoryCooldownMods; DynamicUpdateField<UF::WeeklySpellUse, 32, 38> WeeklySpellUses; DynamicUpdateField<UF::CollectableSourceTrackedData, 32, 39> TrackedCollectableSources; - DynamicUpdateField<UF::PlayerDataElement, 0, 8> CharacterDataElements; - DynamicUpdateField<UF::PlayerDataElement, 0, 9> AccountDataElements; DynamicUpdateField<UF::PVPInfo, 0, 10> PvpInfo; DynamicUpdateField<UF::CharacterRestriction, 0, 23> CharacterRestrictions; DynamicUpdateField<UF::TraitConfig, 32, 33> TraitConfigs; @@ -1127,7 +1127,7 @@ struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMas UpdateField<uint8, 70, 94> MultiActionBars; UpdateField<uint8, 70, 95> LifetimeMaxRank; UpdateField<uint8, 70, 96> NumRespecs; - UpdateField<uint8, 70, 97> PvpMedals; + UpdateField<uint32, 70, 97> PvpMedals; UpdateField<uint16, 70, 98> TodayHonorableKills; UpdateField<uint16, 70, 99> YesterdayHonorableKills; UpdateField<uint32, 70, 100> LifetimeHonorableKills; @@ -1189,8 +1189,7 @@ struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMas UpdateFieldArray<int32, 2, 481, 482> ProfessionSkillLine; UpdateFieldArray<uint32, 5, 484, 485> BagSlotFlags; UpdateFieldArray<uint32, 7, 490, 491> BankBagSlotFlags; - UpdateFieldArray<uint64, 1000, 498, 499> QuestCompleted; - UpdateFieldArray<float, 17, 1499, 1500> ItemUpgradeHighWatermark; + UpdateFieldArray<float, 17, 498, 499> ItemUpgradeHighWatermark; void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 48a0156ffce..c1e09611a53 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -14277,7 +14277,9 @@ void Player::OnGossipSelect(WorldObject* source, int32 gossipOptionId, uint32 me PlayerInteractionType::ProfessionsCraftingOrder, PlayerInteractionType::Professions, PlayerInteractionType::ProfessionsCustomerOrder, PlayerInteractionType::TraitSystem, PlayerInteractionType::BarbersChoice, PlayerInteractionType::MajorFactionRenown, PlayerInteractionType::PersonalTabardVendor, PlayerInteractionType::ForgeMaster, PlayerInteractionType::CharacterBanker, - PlayerInteractionType::AccountBanker, PlayerInteractionType::ProfessionRespec + PlayerInteractionType::AccountBanker, PlayerInteractionType::ProfessionRespec, PlayerInteractionType::PlaceholderType72, + PlayerInteractionType::PlaceholderType75, PlayerInteractionType::PlaceholderType76, PlayerInteractionType::GuildRename, + PlayerInteractionType::PlaceholderType77, PlayerInteractionType::ItemUpgrade }; PlayerInteractionType interactionType = GossipOptionNpcToInteractionType[AsUnderlyingType(gossipOptionNpc)]; @@ -16569,26 +16571,17 @@ void Player::SetQuestCompletedBit(uint32 questId, bool completed) uint32 fieldOffset = (questBit - 1) / QUESTS_COMPLETED_BITS_PER_BLOCK; uint64 flag = UI64LIT(1) << ((questBit - 1) % QUESTS_COMPLETED_BITS_PER_BLOCK); - if (fieldOffset < QUESTS_COMPLETED_BITS_SIZE) - { - if (completed) - SetUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::QuestCompleted, fieldOffset), flag); - else - RemoveUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::QuestCompleted, fieldOffset), flag); - } + + auto field = m_values + .ModifyValue(&Player::m_activePlayerData) + .ModifyValue(&UF::ActivePlayerData::BitVectors) + .ModifyValue(&UF::BitVectors::Values, PLAYER_DATA_FLAG_CHARACTER_QUEST_COMPLETED_INDEX) + .ModifyValue(&UF::BitVector::Values, fieldOffset); if (completed) - SetUpdateFieldFlagValue(m_values - .ModifyValue(&Player::m_activePlayerData) - .ModifyValue(&UF::ActivePlayerData::BitVectors) - .ModifyValue(&UF::BitVectors::Values, PLAYER_DATA_FLAG_CHARACTER_QUEST_COMPLETED_INDEX) - .ModifyValue(&UF::BitVector::Values, fieldOffset), flag); + SetUpdateFieldFlagValue(field, flag); else - RemoveUpdateFieldFlagValue(m_values - .ModifyValue(&Player::m_activePlayerData) - .ModifyValue(&UF::ActivePlayerData::BitVectors) - .ModifyValue(&UF::BitVectors::Values, PLAYER_DATA_FLAG_CHARACTER_QUEST_COMPLETED_INDEX) - .ModifyValue(&UF::BitVector::Values, fieldOffset), flag); + RemoveUpdateFieldFlagValue(field, flag); } void Player::AreaExploredOrEventHappens(uint32 questId) @@ -29851,7 +29844,7 @@ void Player::SendPlayerChoice(ObjectGuid sender, int32 choiceId) ObjectMgr::GetLocaleString(playerChoiceLocale->Question, locale, displayPlayerChoice.Question); displayPlayerChoice.Responses.resize(playerChoice->Responses.size()); - displayPlayerChoice.CloseChoiceFrame = false; + displayPlayerChoice.InfiniteRange = false; displayPlayerChoice.HideWarboardHeader = playerChoice->HideWarboardHeader; displayPlayerChoice.KeepOpenAfterChoice = playerChoice->KeepOpenAfterChoice; @@ -29945,7 +29938,6 @@ void Player::SendPlayerChoice(ObjectGuid sender, int32 choiceId) WorldPackets::Quest::PlayerChoiceResponseMawPower& mawPower = playerChoiceResponse.MawPower.emplace(); mawPower.TypeArtFileID = playerChoiceResponseTemplate.MawPower->TypeArtFileID; mawPower.Rarity = playerChoiceResponseTemplate.MawPower->Rarity; - mawPower.RarityColor = playerChoiceResponseTemplate.MawPower->RarityColor; mawPower.SpellID = playerChoiceResponseTemplate.MawPower->SpellID; mawPower.MaxStacks = playerChoiceResponseTemplate.MawPower->MaxStacks; } diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index ae955a9b683..69329a69358 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -158,6 +158,8 @@ enum PlayerDataFlagConstants PLAYER_DATA_FLAG_ACCOUNT_COMBINED_QUEST_REWARDS_INDEX = 7, PLAYER_DATA_FLAG_CHARACTER_CONTENTPUSH_INDEX = 8, PLAYER_DATA_FLAG_CHARACTER_QUEST_COMPLETED_INDEX = 9, + + // = 12 stores quests completed under ctrOptions & 0x2000 }; enum SpellModType : uint8 @@ -594,8 +596,7 @@ typedef std::map<uint32, QuestSaveType> QuestStatusSaveMap; // Size of client completed quests bit map enum PlayerQuestCompletedConstants { - QUESTS_COMPLETED_BITS_SIZE = UF::size<decltype(UF::ActivePlayerData::QuestCompleted)>(), - QUESTS_COMPLETED_BITS_PER_BLOCK = UF::size_of_value_type<decltype(UF::ActivePlayerData::QuestCompleted)>() * 8 + QUESTS_COMPLETED_BITS_PER_BLOCK = UF::size_of_value_type<decltype(UF::BitVector::Values)>() * 8 }; enum PlayerQuestLogConstants |
