Core/PacketIO: 9.1.0 opcodes and packet structures
This commit is contained in:
@@ -0,0 +1,6 @@
|
||||
ALTER TABLE `creature_template` ADD `CreatureDifficultyID` int(11) NOT NULL DEFAULT '0' AFTER `movementId`;
|
||||
ALTER TABLE `creature_template_scaling` DROP `LevelScalingMin`, DROP `LevelScalingMax`;
|
||||
ALTER TABLE `points_of_interest` ADD `PositionZ` float NOT NULL DEFAULT '0' AFTER `PositionY`;
|
||||
ALTER TABLE `quest_template` ADD `PortraitGiverModelSceneID` int(11) NOT NULL DEFAULT '0' AFTER `PortraitGiverMount`;
|
||||
|
||||
DELETE FROM `creature_template_scaling` WHERE `ContentTuningID`=0;
|
||||
@@ -78,7 +78,7 @@ void WorldDatabaseConnection::DoPrepareStatements()
|
||||
PrepareStatement(WORLD_SEL_WAYPOINT_SCRIPT_ID_BY_GUID, "SELECT id FROM waypoint_scripts WHERE guid = ?", CONNECTION_SYNCH);
|
||||
PrepareStatement(WORLD_DEL_CREATURE, "DELETE FROM creature WHERE guid = ?", CONNECTION_ASYNC);
|
||||
PrepareStatement(WORLD_SEL_COMMANDS, "SELECT name, permission, help FROM command", CONNECTION_SYNCH);
|
||||
PrepareStatement(WORLD_SEL_CREATURE_TEMPLATE, "SELECT entry, difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, name, femaleName, subname, TitleAlt, IconName, gossip_menu_id, minlevel, maxlevel, HealthScalingExpansion, RequiredExpansion, VignetteID, faction, npcflag, speed_walk, speed_run, scale, `rank`, dmgschool, BaseAttackTime, RangeAttackTime, BaseVariance, RangeVariance, unit_class, unit_flags, unit_flags2, unit_flags3, dynamicflags, family, trainer_class, type, type_flags, type_flags2, lootid, pickpocketloot, skinloot, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, VehicleId, mingold, maxgold, AIName, MovementType, InhabitType, HoverHeight, HealthModifier, HealthModifierExtra, ManaModifier, ManaModifierExtra, ArmorModifier, DamageModifier, ExperienceModifier, RacialLeader, movementId, WidgetSetID, WidgetSetUnitConditionID, RegenHealth, mechanic_immune_mask, spell_school_immune_mask, flags_extra, ScriptName FROM creature_template WHERE entry = ? OR 1 = ?", CONNECTION_SYNCH);
|
||||
PrepareStatement(WORLD_SEL_CREATURE_TEMPLATE, "SELECT entry, difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, name, femaleName, subname, TitleAlt, IconName, gossip_menu_id, minlevel, maxlevel, HealthScalingExpansion, RequiredExpansion, VignetteID, faction, npcflag, speed_walk, speed_run, scale, `rank`, dmgschool, BaseAttackTime, RangeAttackTime, BaseVariance, RangeVariance, unit_class, unit_flags, unit_flags2, unit_flags3, dynamicflags, family, trainer_class, type, type_flags, type_flags2, lootid, pickpocketloot, skinloot, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, VehicleId, mingold, maxgold, AIName, MovementType, InhabitType, HoverHeight, HealthModifier, HealthModifierExtra, ManaModifier, ManaModifierExtra, ArmorModifier, DamageModifier, ExperienceModifier, RacialLeader, movementId, CreatureDifficultyID, WidgetSetID, WidgetSetUnitConditionID, RegenHealth, mechanic_immune_mask, spell_school_immune_mask, flags_extra, ScriptName FROM creature_template WHERE entry = ? OR 1 = ?", CONNECTION_SYNCH);
|
||||
PrepareStatement(WORLD_SEL_WAYPOINT_SCRIPT_BY_ID, "SELECT guid, delay, command, datalong, datalong2, dataint, x, y, z, o FROM waypoint_scripts WHERE id = ?", CONNECTION_SYNCH);
|
||||
PrepareStatement(WORLD_SEL_CREATURE_BY_ID, "SELECT guid FROM creature WHERE id = ?", CONNECTION_SYNCH);
|
||||
PrepareStatement(WORLD_SEL_GAMEOBJECT_NEAREST, "SELECT guid, id, position_x, position_y, position_z, map, (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) AS order_ FROM gameobject WHERE map = ? AND (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) <= ? ORDER BY order_", CONNECTION_SYNCH);
|
||||
|
||||
@@ -3673,6 +3673,57 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6
|
||||
case ModifierTreeType::PlayerMythicPlusRatingEqualOrGreaterThan: // 321 NYI
|
||||
case ModifierTreeType::PlayerMythicPlusRunCountInCurrentExpansionEqualOrGreaterThan: // 322 NYI
|
||||
return false;
|
||||
case ModifierTreeType::PlayerHasCustomizationChoice: // 323
|
||||
{
|
||||
int32 customizationChoiceIndex = referencePlayer->m_playerData->Customizations.FindIndexIf([reqValue](UF::ChrCustomizationChoice const& choice)
|
||||
{
|
||||
return choice.ChrCustomizationChoiceID == reqValue;
|
||||
});
|
||||
if (customizationChoiceIndex < 0)
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
case ModifierTreeType::PlayerBestWeeklyWinPvpTier: // 324
|
||||
{
|
||||
PvpTierEntry const* pvpTier = sPvpTierStore.LookupEntry(reqValue);
|
||||
if (!pvpTier)
|
||||
return false;
|
||||
if (std::size_t(pvpTier->BracketID) >= referencePlayer->m_activePlayerData->PvpInfo.size())
|
||||
return false;
|
||||
UF::PVPInfo const& pvpInfo = referencePlayer->m_activePlayerData->PvpInfo[pvpTier->BracketID];
|
||||
if (pvpTier->ID != pvpInfo.WeeklyBestWinPvpTierID || *pvpInfo.Disqualified)
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
case ModifierTreeType::PlayerBestWeeklyWinPvpTierInBracketEqualOrGreaterThan: // 325
|
||||
{
|
||||
if (secondaryAsset >= referencePlayer->m_activePlayerData->PvpInfo.size())
|
||||
return false;
|
||||
UF::PVPInfo const& pvpInfo = referencePlayer->m_activePlayerData->PvpInfo[secondaryAsset];
|
||||
PvpTierEntry const* pvpTier = sPvpTierStore.LookupEntry(pvpInfo.WeeklyBestWinPvpTierID);
|
||||
if (!pvpTier)
|
||||
return false;
|
||||
if (pvpTier->Rank < int32(reqValue))
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
case ModifierTreeType::PlayerHasVanillaCollectorsEdition: // 326
|
||||
return false;
|
||||
case ModifierTreeType::PlayerHasItemWithKeystoneLevelModifierEqualOrGreaterThan: // 327
|
||||
{
|
||||
bool bagScanReachedEnd = referencePlayer->ForEachItem(ItemSearchLocation::Inventory, [reqValue, secondaryAsset](Item const* item)
|
||||
{
|
||||
if (item->GetEntry() != reqValue)
|
||||
return ItemSearchCallbackResult::Continue;
|
||||
|
||||
if (item->GetModifier(ITEM_MODIFIER_CHALLENGE_KEYSTONE_LEVEL) < secondaryAsset)
|
||||
return ItemSearchCallbackResult::Continue;
|
||||
|
||||
return ItemSearchCallbackResult::Stop;
|
||||
});
|
||||
if (bagScanReachedEnd)
|
||||
return false;
|
||||
}
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -244,6 +244,10 @@ void AuctionPosting::BuildAuctionItem(WorldPackets::AuctionHouse::AuctionItem* a
|
||||
// SMSG_AUCTION_LIST_BIDDER_ITEMS_RESULT, SMSG_AUCTION_LIST_OWNER_ITEMS_RESULT, SMSG_AUCTION_REPLICATE_RESPONSE (if commodity)
|
||||
if (sendKey)
|
||||
auctionItem->AuctionBucketKey.emplace(AuctionsBucketKey::ForItem(Items[0]));
|
||||
|
||||
// all
|
||||
if (!Items[0]->m_itemData->Creator->IsEmpty())
|
||||
auctionItem->Creator = *Items[0]->m_itemData->Creator;
|
||||
}
|
||||
|
||||
uint64 AuctionPosting::CalculateMinIncrement(uint64 bidAmount)
|
||||
|
||||
@@ -739,6 +739,7 @@ void Channel::Say(ObjectGuid const& guid, std::string const& what, uint32 lang)
|
||||
LocaleConstant localeIdx = sWorld->GetAvailableDbcLocale(locale);
|
||||
|
||||
Trinity::PacketSenderOwning<WorldPackets::Chat::Chat>* packet = new Trinity::PacketSenderOwning<WorldPackets::Chat::Chat>();
|
||||
packet->Data.ChannelGUID = _channelGuid;
|
||||
if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
|
||||
packet->Data.Initialize(CHAT_MSG_CHANNEL, Language(lang), player, player, what, 0, GetName(localeIdx));
|
||||
else
|
||||
@@ -783,6 +784,7 @@ void Channel::AddonSay(ObjectGuid const& guid, std::string const& prefix, std::s
|
||||
LocaleConstant localeIdx = sWorld->GetAvailableDbcLocale(locale);
|
||||
|
||||
Trinity::PacketSenderOwning<WorldPackets::Chat::Chat>* packet = new Trinity::PacketSenderOwning<WorldPackets::Chat::Chat>();
|
||||
packet->Data.ChannelGUID = _channelGuid;
|
||||
if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
|
||||
packet->Data.Initialize(CHAT_MSG_CHANNEL, isLogged ? LANG_ADDON_LOGGED : LANG_ADDON, player, player, what, 0, GetName(localeIdx), DEFAULT_LOCALE, prefix);
|
||||
else
|
||||
|
||||
@@ -180,6 +180,8 @@ class TC_GAME_API Channel
|
||||
uint32 GetChannelId() const { return _channelId; }
|
||||
bool IsConstant() const { return _channelId != 0; }
|
||||
|
||||
ObjectGuid GetGUID() const { return _channelGuid; }
|
||||
|
||||
bool IsLFG() const { return (GetFlags() & CHANNEL_FLAG_LFG) != 0; }
|
||||
|
||||
bool IsAnnounce() const { return _announceEnabled; }
|
||||
|
||||
@@ -73,6 +73,15 @@ Channel* ChannelMgr::GetChannelForPlayerByNamePart(std::string const& namePart,
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Channel* ChannelMgr::GetChannelForPlayerByGuid(ObjectGuid channelGuid, Player* playerSearcher)
|
||||
{
|
||||
for (Channel* channel : playerSearcher->GetJoinedChannels())
|
||||
if (channel->GetGUID() == channelGuid)
|
||||
return channel;
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Channel* ChannelMgr::GetJoinChannel(uint32 channelId, std::string const& name, AreaTableEntry const* zoneEntry /*= nullptr*/)
|
||||
{
|
||||
if (channelId) // builtin
|
||||
|
||||
@@ -38,6 +38,7 @@ class TC_GAME_API ChannelMgr
|
||||
public:
|
||||
static ChannelMgr* ForTeam(uint32 team);
|
||||
static Channel* GetChannelForPlayerByNamePart(std::string const& namePart, Player* playerSearcher);
|
||||
static Channel* GetChannelForPlayerByGuid(ObjectGuid channelGuid, Player* playerSearcher);
|
||||
|
||||
Channel* GetJoinChannel(uint32 channelId, std::string const& name, AreaTableEntry const* zoneEntry = nullptr);
|
||||
Channel* GetChannel(uint32 channelId, std::string const& name, Player* player, bool notify = true, AreaTableEntry const* zoneEntry = nullptr) const;
|
||||
|
||||
@@ -106,7 +106,7 @@ bool ChatLink::ValidateName(char* buffer, char const* /*context*/)
|
||||
return true;
|
||||
}
|
||||
|
||||
// |color|Hitem:item_id:perm_ench_id:gem1:gem2:gem3:0:random_property:property_seed:reporter_level:reporter_spec:modifiers_mask:context:numBonusListIDs:bonusListIDs(%d):numModifiers:(modifierType(%d):modifierValue(%d)):gem1numBonusListIDs:gem1bonusListIDs(%d):gem2numBonusListIDs:gem2bonusListIDs(%d):gem3numBonusListIDs:gem3bonusListIDs(%d)|h[name]|h|r
|
||||
// |color|Hitem:item_id:perm_ench_id:gem1:gem2:gem3:0:random_property:property_seed:reporter_level:reporter_spec:modifiers_mask:context:numBonusListIDs:bonusListIDs(%d):numModifiers:(modifierType(%d):modifierValue(%d)):gem1numBonusListIDs:gem1bonusListIDs(%d):gem2numBonusListIDs:gem2bonusListIDs(%d):gem3numBonusListIDs:gem3bonusListIDs(%d):creator:use_enchant_id|h[name]|h|r
|
||||
// |cffa335ee|Hitem:124382:0:0:0:0:0:0:0:0:0:0:0:4:42:562:565:567|h[Edict of Argus]|h|r");
|
||||
bool ItemChatLink::Initialize(std::istringstream& iss)
|
||||
{
|
||||
@@ -365,6 +365,30 @@ bool ItemChatLink::Initialize(std::istringstream& iss)
|
||||
}
|
||||
}
|
||||
|
||||
if (!CheckDelimiter(iss, DELIMITER, "item"))
|
||||
return false;
|
||||
|
||||
// guid as string
|
||||
if (HasValue(iss))
|
||||
{
|
||||
std::array<char, 128> guidBuffer = { };
|
||||
if (!iss.getline(guidBuffer.data(), 128, DELIMITER))
|
||||
{
|
||||
TC_LOG_TRACE("chat.system", "ChatHandler::isValidChatMessage('%s'): sequence finished unexpectedly while reading creator guid string", iss.str().c_str());
|
||||
return false;
|
||||
}
|
||||
iss.unget(); // put next : back into stream
|
||||
}
|
||||
|
||||
if (!CheckDelimiter(iss, DELIMITER, "item"))
|
||||
return false;
|
||||
|
||||
if (HasValue(iss) && !ReadInt32(iss, _useEnchantId))
|
||||
{
|
||||
TC_LOG_TRACE("chat.system", "ChatHandler::isValidChatMessage('%s'): sequence finished unexpectedly while reading on use enchatment id", iss.str().c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -76,6 +76,7 @@ protected:
|
||||
int32 _reporterLevel;
|
||||
int32 _reporterSpec;
|
||||
int32 _context;
|
||||
int32 _useEnchantId;
|
||||
std::vector<int32> _bonusListIDs;
|
||||
std::vector<std::pair<uint32, int32>> _modifiers;
|
||||
std::vector<int32> _gemBonusListIDs[3];
|
||||
|
||||
@@ -1299,6 +1299,11 @@ enum class ModifierTreeType : int32
|
||||
RapidRenownCatchupActive = 320, /*NYI*/ // Rapid Renown Catchup Active
|
||||
PlayerMythicPlusRatingEqualOrGreaterThan = 321, /*NYI*/ // Player has Mythic+ Rating of at least "{#DungeonScore}"
|
||||
PlayerMythicPlusRunCountInCurrentExpansionEqualOrGreaterThan = 322, /*NYI*/ // Player has completed at least "{#MythicKeystoneRuns}" Mythic+ runs in current expansion
|
||||
PlayerHasCustomizationChoice = 323, // (Mainline) Player has Customization Choice "{ChrCustomizationChoice}"
|
||||
PlayerBestWeeklyWinPvpTier = 324, // (Mainline) Player has best weekly win in PVP tier {PvpTier}
|
||||
PlayerBestWeeklyWinPvpTierInBracketEqualOrGreaterThan = 325, // (Mainline) Player has best weekly win at or above "{@PVP_TIER_ENUM}" for "{@PVP_BRACKET}"
|
||||
PlayerHasVanillaCollectorsEdition = 326, // Player has Vanilla Collector's Edition
|
||||
PlayerHasItemWithKeystoneLevelModifierEqualOrGreaterThan = 327,
|
||||
};
|
||||
|
||||
enum class ModifierTreeOperator : int8
|
||||
|
||||
@@ -211,6 +211,7 @@ WorldPacket CreatureTemplate::BuildQueryData(LocaleConstant loc) const
|
||||
stats.HealthScalingExpansion = HealthScalingExpansion;
|
||||
stats.VignetteID = VignetteID;
|
||||
stats.Class = unit_class;
|
||||
stats.CreatureDifficultyID = CreatureDifficultyID;
|
||||
stats.WidgetSetID = WidgetSetID;
|
||||
stats.WidgetSetUnitConditionID = WidgetSetUnitConditionID;
|
||||
|
||||
@@ -243,8 +244,6 @@ CreatureLevelScaling const* CreatureTemplate::GetLevelScaling(Difficulty difficu
|
||||
{
|
||||
DefaultCreatureLevelScaling()
|
||||
{
|
||||
MinLevel = 0;
|
||||
MaxLevel = 0;
|
||||
DeltaLevelMin = 0;
|
||||
DeltaLevelMax = 0;
|
||||
ContentTuningID = 0;
|
||||
@@ -1535,8 +1534,11 @@ void Creature::SelectLevel()
|
||||
|
||||
CreatureLevelScaling const* scaling = cInfo->GetLevelScaling(GetMap()->GetDifficultyID());
|
||||
|
||||
SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::ScalingLevelMin), scaling->MinLevel);
|
||||
SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::ScalingLevelMax), scaling->MaxLevel);
|
||||
if (Optional<ContentTuningLevels> levels = sDB2Manager.GetContentTuningData(scaling->ContentTuningID, 0))
|
||||
{
|
||||
SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::ScalingLevelMin), levels->MinLevel);
|
||||
SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::ScalingLevelMax), levels->MaxLevel);
|
||||
}
|
||||
|
||||
int32 mindelta = std::min(scaling->DeltaLevelMax, scaling->DeltaLevelMin);
|
||||
int32 maxdelta = std::max(scaling->DeltaLevelMax, scaling->DeltaLevelMin);
|
||||
@@ -2798,7 +2800,7 @@ bool Creature::HasScalableLevels() const
|
||||
CreatureTemplate const* cinfo = GetCreatureTemplate();
|
||||
CreatureLevelScaling const* scaling = cinfo->GetLevelScaling(GetMap()->GetDifficultyID());
|
||||
|
||||
return (scaling->MinLevel != 0 && scaling->MaxLevel != 0);
|
||||
return scaling->ContentTuningID != 0;
|
||||
}
|
||||
|
||||
uint64 Creature::GetMaxHealthByLevel(uint8 level) const
|
||||
|
||||
@@ -327,8 +327,6 @@ struct CreatureModel
|
||||
|
||||
struct CreatureLevelScaling
|
||||
{
|
||||
uint16 MinLevel;
|
||||
uint16 MaxLevel;
|
||||
int16 DeltaLevelMin;
|
||||
int16 DeltaLevelMax;
|
||||
int32 ContentTuningID;
|
||||
@@ -395,6 +393,7 @@ struct TC_GAME_API CreatureTemplate
|
||||
float ModExperience;
|
||||
bool RacialLeader;
|
||||
uint32 movementId;
|
||||
int32 CreatureDifficultyID;
|
||||
int32 WidgetSetID;
|
||||
int32 WidgetSetUnitConditionID;
|
||||
bool RegenHealth;
|
||||
|
||||
@@ -431,6 +431,7 @@ void PlayerMenu::SendQuestGiverQuestDetails(Quest const* quest, ObjectGuid npcGU
|
||||
packet.QuestID = quest->GetQuestId();
|
||||
packet.PortraitGiver = quest->GetQuestGiverPortrait();
|
||||
packet.PortraitGiverMount = quest->GetQuestGiverPortraitMount();
|
||||
packet.PortraitGiverModelSceneID = quest->GetQuestGiverPortraitModelSceneId();
|
||||
packet.PortraitTurnIn = quest->GetQuestTurnInPortrait();
|
||||
packet.QuestSessionBonus = 0; //quest->GetQuestSessionBonus(); // this is only sent while quest session is active
|
||||
packet.AutoLaunched = autoLaunched;
|
||||
@@ -531,6 +532,7 @@ void PlayerMenu::SendQuestGiverOfferReward(Quest const* quest, ObjectGuid npcGUI
|
||||
packet.PortraitTurnIn = quest->GetQuestTurnInPortrait();
|
||||
packet.PortraitGiver = quest->GetQuestGiverPortrait();
|
||||
packet.PortraitGiverMount = quest->GetQuestGiverPortraitMount();
|
||||
packet.PortraitGiverModelSceneID = quest->GetQuestGiverPortraitModelSceneId();
|
||||
packet.QuestPackageID = quest->GetQuestPackageID();
|
||||
|
||||
_session->SendPacket(packet.Write());
|
||||
|
||||
@@ -118,6 +118,7 @@ struct MovementForce
|
||||
uint32 TransportID = 0;
|
||||
float Magnitude = 0.0f;
|
||||
uint8 Type = 0;
|
||||
int32 Unused910 = 0;
|
||||
};
|
||||
|
||||
class MovementForces
|
||||
|
||||
@@ -1115,6 +1115,7 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi
|
||||
data << uint32(ChannelObjects.size());
|
||||
data << SkinningOwnerGUID;
|
||||
data << uint32(SilencedSchoolMask);
|
||||
data << NameplateAttachToGUID;
|
||||
for (std::size_t i = 0; i < PassiveSpells.size(); ++i)
|
||||
{
|
||||
PassiveSpells[i].WriteCreate(data, owner, receiver);
|
||||
@@ -1131,7 +1132,7 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi
|
||||
|
||||
void UnitData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const
|
||||
{
|
||||
Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xE1FF7FFFu, 0x001EFFFFu, 0xFFFFFF81u, 0x03F8007Fu, 0x00000000u });
|
||||
Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xE1FF7FFFu, 0x001EFFFFu, 0xFFFFFF81u, 0x07F000FFu, 0x00000000u });
|
||||
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
|
||||
WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver);
|
||||
}
|
||||
@@ -1139,16 +1140,16 @@ void UnitData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi
|
||||
void UnitData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const
|
||||
{
|
||||
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner))
|
||||
allowedMaskForTarget |= { 0x00002000u, 0x1E008000u, 0xFFE10000u, 0x0400007Eu, 0xFC07FF80u, 0x1FFFFFFFu };
|
||||
allowedMaskForTarget |= { 0x00002000u, 0x1E008000u, 0xFFE10000u, 0x0800007Eu, 0xF80FFF00u, 0x3FFFFFFFu };
|
||||
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::UnitAll))
|
||||
allowedMaskForTarget |= { 0x00000000u, 0x00000000u, 0x00000000u, 0x04000000u, 0x0007FF80u, 0x00000000u };
|
||||
allowedMaskForTarget |= { 0x00000000u, 0x00000000u, 0x00000000u, 0x08000000u, 0x000FFF00u, 0x00000000u };
|
||||
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Empath))
|
||||
allowedMaskForTarget |= { 0x00000000u, 0x1E000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00007F80u };
|
||||
allowedMaskForTarget |= { 0x00000000u, 0x1E000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x0000FF00u };
|
||||
}
|
||||
|
||||
void UnitData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const
|
||||
{
|
||||
Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xE1FF7FFFu, 0x001EFFFFu, 0xFFFFFF81u, 0x03F8007Fu, 0x00000000u });
|
||||
Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xE1FF7FFFu, 0x001EFFFFu, 0xFFFFFF81u, 0x07F000FFu, 0x00000000u });
|
||||
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
|
||||
changesMask &= allowedMaskForTarget;
|
||||
}
|
||||
@@ -1682,90 +1683,94 @@ void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor
|
||||
{
|
||||
data << uint32(SilencedSchoolMask);
|
||||
}
|
||||
if (changesMask[119])
|
||||
{
|
||||
data << NameplateAttachToGUID;
|
||||
}
|
||||
}
|
||||
if (changesMask[119])
|
||||
if (changesMask[120])
|
||||
{
|
||||
for (std::size_t i = 0; i < 2; ++i)
|
||||
{
|
||||
if (changesMask[120 + i])
|
||||
if (changesMask[121 + i])
|
||||
{
|
||||
data << uint32(ViewerDependentValue<NpcFlagsTag>::GetValue(NpcFlags[i], i, owner, receiver));
|
||||
}
|
||||
}
|
||||
}
|
||||
if (changesMask[122])
|
||||
if (changesMask[123])
|
||||
{
|
||||
for (std::size_t i = 0; i < 6; ++i)
|
||||
{
|
||||
if (changesMask[123 + i])
|
||||
if (changesMask[124 + i])
|
||||
{
|
||||
data << int32(Power[i]);
|
||||
}
|
||||
if (changesMask[129 + i])
|
||||
if (changesMask[130 + i])
|
||||
{
|
||||
data << int32(MaxPower[i]);
|
||||
}
|
||||
if (changesMask[135 + i])
|
||||
if (changesMask[136 + i])
|
||||
{
|
||||
data << float(PowerRegenFlatModifier[i]);
|
||||
}
|
||||
if (changesMask[141 + i])
|
||||
if (changesMask[142 + i])
|
||||
{
|
||||
data << float(PowerRegenInterruptedFlatModifier[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (changesMask[147])
|
||||
if (changesMask[148])
|
||||
{
|
||||
for (std::size_t i = 0; i < 3; ++i)
|
||||
{
|
||||
if (changesMask[148 + i])
|
||||
if (changesMask[149 + i])
|
||||
{
|
||||
VirtualItems[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (changesMask[151])
|
||||
if (changesMask[152])
|
||||
{
|
||||
for (std::size_t i = 0; i < 2; ++i)
|
||||
{
|
||||
if (changesMask[152 + i])
|
||||
if (changesMask[153 + i])
|
||||
{
|
||||
data << uint32(AttackRoundBaseTime[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (changesMask[154])
|
||||
if (changesMask[155])
|
||||
{
|
||||
for (std::size_t i = 0; i < 4; ++i)
|
||||
{
|
||||
if (changesMask[155 + i])
|
||||
if (changesMask[156 + i])
|
||||
{
|
||||
data << int32(Stats[i]);
|
||||
}
|
||||
if (changesMask[159 + i])
|
||||
if (changesMask[160 + i])
|
||||
{
|
||||
data << int32(StatPosBuff[i]);
|
||||
}
|
||||
if (changesMask[163 + i])
|
||||
if (changesMask[164 + i])
|
||||
{
|
||||
data << int32(StatNegBuff[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (changesMask[167])
|
||||
if (changesMask[168])
|
||||
{
|
||||
for (std::size_t i = 0; i < 7; ++i)
|
||||
{
|
||||
if (changesMask[168 + i])
|
||||
if (changesMask[169 + i])
|
||||
{
|
||||
data << int32(Resistances[i]);
|
||||
}
|
||||
if (changesMask[175 + i])
|
||||
if (changesMask[176 + i])
|
||||
{
|
||||
data << int32(BonusResistanceMods[i]);
|
||||
}
|
||||
if (changesMask[182 + i])
|
||||
if (changesMask[183 + i])
|
||||
{
|
||||
data << int32(ManaCostModifier[i]);
|
||||
}
|
||||
@@ -1890,6 +1895,7 @@ void UnitData::ClearChangesMask()
|
||||
Base::ClearChangesMask(GuildGUID);
|
||||
Base::ClearChangesMask(SkinningOwnerGUID);
|
||||
Base::ClearChangesMask(SilencedSchoolMask);
|
||||
Base::ClearChangesMask(NameplateAttachToGUID);
|
||||
Base::ClearChangesMask(NpcFlags);
|
||||
Base::ClearChangesMask(Power);
|
||||
Base::ClearChangesMask(MaxPower);
|
||||
@@ -2115,7 +2121,7 @@ void PlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi
|
||||
data << uint32(VirtualPlayerRealm);
|
||||
data << uint32(CurrentSpecID);
|
||||
data << int32(TaxiMountAnimKitID);
|
||||
for (std::size_t i = 0; i < 4; ++i)
|
||||
for (std::size_t i = 0; i < 6; ++i)
|
||||
{
|
||||
data << float(AvgItemLevel[i]);
|
||||
}
|
||||
@@ -2147,12 +2153,13 @@ void PlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi
|
||||
data.WriteBit(HasQuestSession);
|
||||
}
|
||||
data.WriteBit(HasLevelLink);
|
||||
data << DungeonScore;
|
||||
data.FlushBits();
|
||||
}
|
||||
|
||||
void PlayerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const
|
||||
{
|
||||
Mask allowedMaskForTarget({ 0xFFFFFFEDu, 0x00000003u, 0x00000000u, 0x00000000u, 0x00000000u, 0x01FFFFFFu });
|
||||
Mask allowedMaskForTarget({ 0xFFFFFFEDu, 0x00000007u, 0x00000000u, 0x00000000u, 0x00000000u, 0x0FFFFFFEu });
|
||||
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
|
||||
WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver);
|
||||
}
|
||||
@@ -2160,12 +2167,12 @@ void PlayerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi
|
||||
void PlayerData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const
|
||||
{
|
||||
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::PartyMember))
|
||||
allowedMaskForTarget |= { 0x00000012u, 0xFFFFFFFCu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x00000000u };
|
||||
allowedMaskForTarget |= { 0x00000012u, 0xFFFFFFF8u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x00000001u };
|
||||
}
|
||||
|
||||
void PlayerData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const
|
||||
{
|
||||
Mask allowedMaskForTarget({ 0xFFFFFFEDu, 0x00000003u, 0x00000000u, 0x00000000u, 0x00000000u, 0x01FFFFFFu });
|
||||
Mask allowedMaskForTarget({ 0xFFFFFFEDu, 0x00000007u, 0x00000000u, 0x00000000u, 0x00000000u, 0x0FFFFFFEu });
|
||||
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
|
||||
changesMask &= allowedMaskForTarget;
|
||||
}
|
||||
@@ -2357,12 +2364,16 @@ void PlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ign
|
||||
{
|
||||
data << int32(SoulbindID);
|
||||
}
|
||||
if (changesMask[34])
|
||||
{
|
||||
data << DungeonScore;
|
||||
}
|
||||
}
|
||||
if (changesMask[34])
|
||||
if (changesMask[35])
|
||||
{
|
||||
for (std::size_t i = 0; i < 125; ++i)
|
||||
{
|
||||
if (changesMask[35 + i])
|
||||
if (changesMask[36 + i])
|
||||
{
|
||||
if (noQuestLogChangesMask)
|
||||
QuestLog[i].WriteCreate(data, owner, receiver);
|
||||
@@ -2371,21 +2382,21 @@ void PlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ign
|
||||
}
|
||||
}
|
||||
}
|
||||
if (changesMask[160])
|
||||
if (changesMask[161])
|
||||
{
|
||||
for (std::size_t i = 0; i < 19; ++i)
|
||||
{
|
||||
if (changesMask[161 + i])
|
||||
if (changesMask[162 + i])
|
||||
{
|
||||
VisibleItems[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (changesMask[180])
|
||||
if (changesMask[181])
|
||||
{
|
||||
for (std::size_t i = 0; i < 4; ++i)
|
||||
for (std::size_t i = 0; i < 6; ++i)
|
||||
{
|
||||
if (changesMask[181 + i])
|
||||
if (changesMask[182 + i])
|
||||
{
|
||||
data << float(AvgItemLevel[i]);
|
||||
}
|
||||
@@ -2428,6 +2439,7 @@ void PlayerData::ClearChangesMask()
|
||||
Base::ClearChangesMask(CtrOptions);
|
||||
Base::ClearChangesMask(CovenantID);
|
||||
Base::ClearChangesMask(SoulbindID);
|
||||
Base::ClearChangesMask(DungeonScore);
|
||||
Base::ClearChangesMask(QuestLog);
|
||||
Base::ClearChangesMask(VisibleItems);
|
||||
Base::ClearChangesMask(AvgItemLevel);
|
||||
@@ -2555,6 +2567,7 @@ void PVPInfo::WriteCreate(ByteBuffer& data, Player const* owner, Player const* r
|
||||
data << uint32(WeeklyBestRating);
|
||||
data << uint32(SeasonBestRating);
|
||||
data << uint32(PvpTierID);
|
||||
data << uint32(WeeklyBestWinPvpTierID);
|
||||
data.WriteBit(Disqualified);
|
||||
data.FlushBits();
|
||||
}
|
||||
@@ -2565,7 +2578,7 @@ void PVPInfo::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const
|
||||
if (ignoreChangesMask)
|
||||
changesMask.SetAll();
|
||||
|
||||
data.WriteBits(changesMask.GetBlock(0), 10);
|
||||
data.WriteBits(changesMask.GetBlock(0), 11);
|
||||
|
||||
if (changesMask[0])
|
||||
{
|
||||
@@ -2609,6 +2622,10 @@ void PVPInfo::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const
|
||||
{
|
||||
data << uint32(PvpTierID);
|
||||
}
|
||||
if (changesMask[10])
|
||||
{
|
||||
data << uint32(WeeklyBestWinPvpTierID);
|
||||
}
|
||||
}
|
||||
data.FlushBits();
|
||||
}
|
||||
@@ -2624,6 +2641,7 @@ void PVPInfo::ClearChangesMask()
|
||||
Base::ClearChangesMask(WeeklyBestRating);
|
||||
Base::ClearChangesMask(SeasonBestRating);
|
||||
Base::ClearChangesMask(PvpTierID);
|
||||
Base::ClearChangesMask(WeeklyBestWinPvpTierID);
|
||||
_changesMask.ResetAll();
|
||||
}
|
||||
|
||||
@@ -2906,7 +2924,7 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
|
||||
Skill->WriteCreate(data, owner, receiver);
|
||||
data << int32(CharacterPoints);
|
||||
data << int32(MaxTalentTiers);
|
||||
data << int32(TrackCreatureMask);
|
||||
data << uint32(TrackCreatureMask);
|
||||
for (std::size_t i = 0; i < 2; ++i)
|
||||
{
|
||||
data << uint32(TrackResourceMask[i]);
|
||||
@@ -2934,7 +2952,7 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
|
||||
data << float(VersatilityBonus);
|
||||
data << float(PvpPowerDamage);
|
||||
data << float(PvpPowerHealing);
|
||||
for (std::size_t i = 0; i < 192; ++i)
|
||||
for (std::size_t i = 0; i < 240; ++i)
|
||||
{
|
||||
data << uint64(ExploredZones[i]);
|
||||
}
|
||||
@@ -3022,11 +3040,6 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
|
||||
}
|
||||
data << int32(Honor);
|
||||
data << int32(HonorNextLevel);
|
||||
data << int64(PvpRewardAchieved);
|
||||
data << int32(PvpTierMaxFromWins);
|
||||
data << int64(PvpLastWeeksRewardAchieved);
|
||||
data << int32(PvpLastWeeksTierMaxFromWins);
|
||||
data << int64(PvpLastWeeksRewardClaimed);
|
||||
data << uint8(NumBankSlots);
|
||||
data << uint32(ResearchSites.size());
|
||||
data << uint32(ResearchSiteProgress.size());
|
||||
@@ -3060,6 +3073,7 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
|
||||
data << int32(UiChromieTimeExpansionID);
|
||||
data << int32(TransportServerTime);
|
||||
data << uint32(WeeklyRewardsPeriodSinceOrigin);
|
||||
data << int16(DEBUGSoulbindConduitRank);
|
||||
for (std::size_t i = 0; i < KnownTitles.size(); ++i)
|
||||
{
|
||||
data << uint64(KnownTitles[i]);
|
||||
@@ -3159,6 +3173,7 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
|
||||
{
|
||||
QuestSession->WriteCreate(data, owner, receiver);
|
||||
}
|
||||
data << DungeonScore;
|
||||
for (std::size_t i = 0; i < CharacterRestrictions.size(); ++i)
|
||||
{
|
||||
CharacterRestrictions[i].WriteCreate(data, owner, receiver);
|
||||
@@ -3175,8 +3190,8 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
|
||||
{
|
||||
for (std::size_t i = 0; i < 1; ++i)
|
||||
data << uint32(changesMask.GetBlocksMask(i));
|
||||
data.WriteBits(changesMask.GetBlocksMask(1), 16);
|
||||
for (std::size_t i = 0; i < 48; ++i)
|
||||
data.WriteBits(changesMask.GetBlocksMask(1), 17);
|
||||
for (std::size_t i = 0; i < 49; ++i)
|
||||
if (changesMask.GetBlock(i))
|
||||
data.WriteBits(changesMask.GetBlock(i), 32);
|
||||
|
||||
@@ -3641,7 +3656,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
|
||||
}
|
||||
if (changesMask[39])
|
||||
{
|
||||
data << int32(TrackCreatureMask);
|
||||
data << uint32(TrackCreatureMask);
|
||||
}
|
||||
if (changesMask[40])
|
||||
{
|
||||
@@ -3899,211 +3914,199 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
|
||||
}
|
||||
if (changesMask[104])
|
||||
{
|
||||
data << int64(PvpRewardAchieved);
|
||||
}
|
||||
if (changesMask[105])
|
||||
{
|
||||
data << int32(PvpTierMaxFromWins);
|
||||
}
|
||||
if (changesMask[106])
|
||||
{
|
||||
data << int64(PvpLastWeeksRewardAchieved);
|
||||
data << uint8(NumBankSlots);
|
||||
}
|
||||
if (changesMask[107])
|
||||
{
|
||||
data << int32(PvpLastWeeksTierMaxFromWins);
|
||||
data << int32(UiChromieTimeExpansionID);
|
||||
}
|
||||
if (changesMask[108])
|
||||
{
|
||||
data << int64(PvpLastWeeksRewardClaimed);
|
||||
data << int32(TransportServerTime);
|
||||
}
|
||||
if (changesMask[109])
|
||||
{
|
||||
data << uint8(NumBankSlots);
|
||||
}
|
||||
if (changesMask[112])
|
||||
{
|
||||
data << int32(UiChromieTimeExpansionID);
|
||||
}
|
||||
if (changesMask[113])
|
||||
{
|
||||
data << int32(TransportServerTime);
|
||||
}
|
||||
if (changesMask[114])
|
||||
{
|
||||
data << uint32(WeeklyRewardsPeriodSinceOrigin);
|
||||
}
|
||||
if (changesMask[110])
|
||||
{
|
||||
data << int16(DEBUGSoulbindConduitRank);
|
||||
}
|
||||
}
|
||||
if (changesMask[98])
|
||||
{
|
||||
data.WriteBits(QuestSession.is_initialized(), 1);
|
||||
if (changesMask[111])
|
||||
if (changesMask[106])
|
||||
{
|
||||
Field_1410->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
|
||||
}
|
||||
if (changesMask[110])
|
||||
if (changesMask[105])
|
||||
{
|
||||
if (QuestSession.is_initialized())
|
||||
{
|
||||
QuestSession->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
|
||||
}
|
||||
}
|
||||
if (changesMask[111])
|
||||
{
|
||||
data << DungeonScore;
|
||||
}
|
||||
}
|
||||
if (changesMask[115])
|
||||
if (changesMask[112])
|
||||
{
|
||||
for (std::size_t i = 0; i < 199; ++i)
|
||||
{
|
||||
if (changesMask[116 + i])
|
||||
if (changesMask[113 + i])
|
||||
{
|
||||
data << InvSlots[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
if (changesMask[315])
|
||||
if (changesMask[312])
|
||||
{
|
||||
for (std::size_t i = 0; i < 2; ++i)
|
||||
{
|
||||
if (changesMask[316 + i])
|
||||
if (changesMask[313 + i])
|
||||
{
|
||||
data << uint32(TrackResourceMask[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (changesMask[318])
|
||||
if (changesMask[315])
|
||||
{
|
||||
for (std::size_t i = 0; i < 192; ++i)
|
||||
for (std::size_t i = 0; i < 240; ++i)
|
||||
{
|
||||
if (changesMask[319 + i])
|
||||
if (changesMask[316 + i])
|
||||
{
|
||||
data << uint64(ExploredZones[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (changesMask[511])
|
||||
if (changesMask[556])
|
||||
{
|
||||
for (std::size_t i = 0; i < 2; ++i)
|
||||
{
|
||||
if (changesMask[512 + i])
|
||||
if (changesMask[557 + i])
|
||||
{
|
||||
RestInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (changesMask[514])
|
||||
if (changesMask[559])
|
||||
{
|
||||
for (std::size_t i = 0; i < 7; ++i)
|
||||
{
|
||||
if (changesMask[515 + i])
|
||||
if (changesMask[560 + i])
|
||||
{
|
||||
data << int32(ModDamageDonePos[i]);
|
||||
}
|
||||
if (changesMask[522 + i])
|
||||
if (changesMask[567 + i])
|
||||
{
|
||||
data << int32(ModDamageDoneNeg[i]);
|
||||
}
|
||||
if (changesMask[529 + i])
|
||||
if (changesMask[574 + i])
|
||||
{
|
||||
data << float(ModDamageDonePercent[i]);
|
||||
}
|
||||
if (changesMask[536 + i])
|
||||
if (changesMask[581 + i])
|
||||
{
|
||||
data << float(ModHealingDonePercent[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (changesMask[543])
|
||||
if (changesMask[588])
|
||||
{
|
||||
for (std::size_t i = 0; i < 3; ++i)
|
||||
{
|
||||
if (changesMask[544 + i])
|
||||
if (changesMask[589 + i])
|
||||
{
|
||||
data << float(WeaponDmgMultipliers[i]);
|
||||
}
|
||||
if (changesMask[547 + i])
|
||||
if (changesMask[592 + i])
|
||||
{
|
||||
data << float(WeaponAtkSpeedMultipliers[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (changesMask[550])
|
||||
if (changesMask[595])
|
||||
{
|
||||
for (std::size_t i = 0; i < 12; ++i)
|
||||
{
|
||||
if (changesMask[551 + i])
|
||||
if (changesMask[596 + i])
|
||||
{
|
||||
data << uint32(BuybackPrice[i]);
|
||||
}
|
||||
if (changesMask[563 + i])
|
||||
if (changesMask[608 + i])
|
||||
{
|
||||
data << uint32(BuybackTimestamp[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (changesMask[575])
|
||||
if (changesMask[620])
|
||||
{
|
||||
for (std::size_t i = 0; i < 32; ++i)
|
||||
{
|
||||
if (changesMask[576 + i])
|
||||
if (changesMask[621 + i])
|
||||
{
|
||||
data << int32(CombatRatings[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (changesMask[615])
|
||||
if (changesMask[660])
|
||||
{
|
||||
for (std::size_t i = 0; i < 4; ++i)
|
||||
{
|
||||
if (changesMask[616 + i])
|
||||
if (changesMask[661 + i])
|
||||
{
|
||||
data << uint32(NoReagentCostMask[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (changesMask[620])
|
||||
if (changesMask[665])
|
||||
{
|
||||
for (std::size_t i = 0; i < 2; ++i)
|
||||
{
|
||||
if (changesMask[621 + i])
|
||||
if (changesMask[666 + i])
|
||||
{
|
||||
data << int32(ProfessionSkillLine[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (changesMask[623])
|
||||
if (changesMask[668])
|
||||
{
|
||||
for (std::size_t i = 0; i < 4; ++i)
|
||||
{
|
||||
if (changesMask[624 + i])
|
||||
if (changesMask[669 + i])
|
||||
{
|
||||
data << uint32(BagSlotFlags[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (changesMask[628])
|
||||
if (changesMask[673])
|
||||
{
|
||||
for (std::size_t i = 0; i < 7; ++i)
|
||||
{
|
||||
if (changesMask[629 + i])
|
||||
if (changesMask[674 + i])
|
||||
{
|
||||
data << uint32(BankBagSlotFlags[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (changesMask[636])
|
||||
if (changesMask[681])
|
||||
{
|
||||
for (std::size_t i = 0; i < 875; ++i)
|
||||
{
|
||||
if (changesMask[637 + i])
|
||||
if (changesMask[682 + i])
|
||||
{
|
||||
data << uint64(QuestCompleted[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (changesMask[608])
|
||||
if (changesMask[653])
|
||||
{
|
||||
for (std::size_t i = 0; i < 6; ++i)
|
||||
{
|
||||
if (changesMask[609 + i])
|
||||
if (changesMask[654 + i])
|
||||
{
|
||||
PvpInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
|
||||
}
|
||||
@@ -4213,17 +4216,14 @@ void ActivePlayerData::ClearChangesMask()
|
||||
Base::ClearChangesMask(GuildClubMemberID);
|
||||
Base::ClearChangesMask(Honor);
|
||||
Base::ClearChangesMask(HonorNextLevel);
|
||||
Base::ClearChangesMask(PvpRewardAchieved);
|
||||
Base::ClearChangesMask(PvpTierMaxFromWins);
|
||||
Base::ClearChangesMask(PvpLastWeeksRewardAchieved);
|
||||
Base::ClearChangesMask(PvpLastWeeksTierMaxFromWins);
|
||||
Base::ClearChangesMask(PvpLastWeeksRewardClaimed);
|
||||
Base::ClearChangesMask(NumBankSlots);
|
||||
Base::ClearChangesMask(Field_1410);
|
||||
Base::ClearChangesMask(QuestSession);
|
||||
Base::ClearChangesMask(UiChromieTimeExpansionID);
|
||||
Base::ClearChangesMask(TransportServerTime);
|
||||
Base::ClearChangesMask(WeeklyRewardsPeriodSinceOrigin);
|
||||
Base::ClearChangesMask(DEBUGSoulbindConduitRank);
|
||||
Base::ClearChangesMask(DungeonScore);
|
||||
Base::ClearChangesMask(InvSlots);
|
||||
Base::ClearChangesMask(TrackResourceMask);
|
||||
Base::ClearChangesMask(ExploredZones);
|
||||
@@ -4904,11 +4904,13 @@ void ConversationData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
|
||||
{
|
||||
(*Lines)[i].WriteCreate(data, owner, receiver);
|
||||
}
|
||||
data.WriteBit(DontPlayBroadcastTextSounds);
|
||||
data << uint32(Actors.size());
|
||||
for (std::size_t i = 0; i < Actors.size(); ++i)
|
||||
{
|
||||
Actors[i].WriteCreate(data, owner, receiver);
|
||||
}
|
||||
data.FlushBits();
|
||||
}
|
||||
|
||||
void ConversationData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Conversation const* owner, Player const* receiver) const
|
||||
@@ -4918,11 +4920,15 @@ void ConversationData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
|
||||
|
||||
void ConversationData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, Conversation const* owner, Player const* receiver) const
|
||||
{
|
||||
data.WriteBits(changesMask.GetBlock(0), 5);
|
||||
data.WriteBits(changesMask.GetBlock(0), 6);
|
||||
|
||||
if (changesMask[0])
|
||||
{
|
||||
if (changesMask[1])
|
||||
{
|
||||
data.WriteBit(DontPlayBroadcastTextSounds);
|
||||
}
|
||||
if (changesMask[2])
|
||||
{
|
||||
data.WriteBits(Lines->size(), 32);
|
||||
for (std::size_t i = 0; i < Lines->size(); ++i)
|
||||
@@ -4934,7 +4940,7 @@ void ConversationData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
|
||||
data.FlushBits();
|
||||
if (changesMask[0])
|
||||
{
|
||||
if (changesMask[2])
|
||||
if (changesMask[3])
|
||||
{
|
||||
if (!ignoreNestedChangesMask)
|
||||
Actors.WriteUpdateMask(data);
|
||||
@@ -4945,7 +4951,7 @@ void ConversationData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
|
||||
data.FlushBits();
|
||||
if (changesMask[0])
|
||||
{
|
||||
if (changesMask[2])
|
||||
if (changesMask[3])
|
||||
{
|
||||
for (std::size_t i = 0; i < Actors.size(); ++i)
|
||||
{
|
||||
@@ -4955,19 +4961,21 @@ void ConversationData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
|
||||
}
|
||||
}
|
||||
}
|
||||
if (changesMask[3])
|
||||
if (changesMask[4])
|
||||
{
|
||||
data << int32(LastLineEndTime);
|
||||
}
|
||||
if (changesMask[4])
|
||||
if (changesMask[5])
|
||||
{
|
||||
data << uint32(Progress);
|
||||
}
|
||||
}
|
||||
data.FlushBits();
|
||||
}
|
||||
|
||||
void ConversationData::ClearChangesMask()
|
||||
{
|
||||
Base::ClearChangesMask(DontPlayBroadcastTextSounds);
|
||||
Base::ClearChangesMask(Lines);
|
||||
Base::ClearChangesMask(Actors);
|
||||
Base::ClearChangesMask(LastLineEndTime);
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
#define UpdateFields_h__
|
||||
|
||||
#include "EnumFlag.h"
|
||||
#include "MythicPlusPacketsCommon.h"
|
||||
#include "ObjectGuid.h"
|
||||
#include "Position.h"
|
||||
#include "QuaternionData.h"
|
||||
@@ -251,7 +252,7 @@ struct PassiveSpellHistory : public IsUpdateFieldStructureTag
|
||||
bool operator!=(PassiveSpellHistory const& right) const { return !(*this == right); }
|
||||
};
|
||||
|
||||
struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<189>
|
||||
struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<190>
|
||||
{
|
||||
UpdateField<std::vector<uint32>, 0, 1> StateWorldEffectIDs;
|
||||
DynamicUpdateField<UF::PassiveSpellHistory, 0, 2> PassiveSpells;
|
||||
@@ -373,20 +374,21 @@ struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<189>
|
||||
UpdateField<ObjectGuid, 96, 116> GuildGUID;
|
||||
UpdateField<ObjectGuid, 96, 117> SkinningOwnerGUID;
|
||||
UpdateField<uint32, 96, 118> SilencedSchoolMask;
|
||||
UpdateFieldArray<uint32, 2, 119, 120> NpcFlags;
|
||||
UpdateField<ObjectGuid, 96, 119> NameplateAttachToGUID; // When set, nameplate of this unit will instead appear on that object
|
||||
UpdateFieldArray<uint32, 2, 120, 121> NpcFlags;
|
||||
struct NpcFlagsTag : ViewerDependentValueTag<uint32> {};
|
||||
UpdateFieldArray<int32, 6, 122, 123> Power;
|
||||
UpdateFieldArray<int32, 6, 122, 129> MaxPower;
|
||||
UpdateFieldArray<float, 6, 122, 135> PowerRegenFlatModifier;
|
||||
UpdateFieldArray<float, 6, 122, 141> PowerRegenInterruptedFlatModifier;
|
||||
UpdateFieldArray<UF::VisibleItem, 3, 147, 148> VirtualItems;
|
||||
UpdateFieldArray<uint32, 2, 151, 152> AttackRoundBaseTime;
|
||||
UpdateFieldArray<int32, 4, 154, 155> Stats;
|
||||
UpdateFieldArray<int32, 4, 154, 159> StatPosBuff;
|
||||
UpdateFieldArray<int32, 4, 154, 163> StatNegBuff;
|
||||
UpdateFieldArray<int32, 7, 167, 168> Resistances;
|
||||
UpdateFieldArray<int32, 7, 167, 175> BonusResistanceMods;
|
||||
UpdateFieldArray<int32, 7, 167, 182> ManaCostModifier;
|
||||
UpdateFieldArray<int32, 6, 123, 124> Power;
|
||||
UpdateFieldArray<int32, 6, 123, 130> MaxPower;
|
||||
UpdateFieldArray<float, 6, 123, 136> PowerRegenFlatModifier;
|
||||
UpdateFieldArray<float, 6, 123, 142> PowerRegenInterruptedFlatModifier;
|
||||
UpdateFieldArray<UF::VisibleItem, 3, 148, 149> VirtualItems;
|
||||
UpdateFieldArray<uint32, 2, 152, 153> AttackRoundBaseTime;
|
||||
UpdateFieldArray<int32, 4, 155, 156> Stats;
|
||||
UpdateFieldArray<int32, 4, 155, 160> StatPosBuff;
|
||||
UpdateFieldArray<int32, 4, 155, 164> StatNegBuff;
|
||||
UpdateFieldArray<int32, 7, 168, 169> Resistances;
|
||||
UpdateFieldArray<int32, 7, 168, 176> BonusResistanceMods;
|
||||
UpdateFieldArray<int32, 7, 168, 183> ManaCostModifier;
|
||||
|
||||
void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const;
|
||||
void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const;
|
||||
@@ -448,7 +450,7 @@ struct CTROptions : public IsUpdateFieldStructureTag
|
||||
bool operator!=(CTROptions const& right) const { return !(*this == right); }
|
||||
};
|
||||
|
||||
struct PlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<185>
|
||||
struct PlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<188>
|
||||
{
|
||||
UpdateField<bool, 0, 1> HasQuestSession;
|
||||
UpdateField<bool, 0, 2> HasLevelLink;
|
||||
@@ -482,9 +484,10 @@ struct PlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<185>
|
||||
UpdateField<UF::CTROptions, 0, 30> CtrOptions;
|
||||
UpdateField<int32, 0, 31> CovenantID;
|
||||
UpdateField<int32, 32, 33> SoulbindID;
|
||||
UpdateFieldArray<UF::QuestLog, 125, 34, 35> QuestLog;
|
||||
UpdateFieldArray<UF::VisibleItem, 19, 160, 161> VisibleItems;
|
||||
UpdateFieldArray<float, 4, 180, 181> AvgItemLevel;
|
||||
UpdateField<WorldPackets::MythicPlus::DungeonScoreSummary, 32, 34> DungeonScore;
|
||||
UpdateFieldArray<UF::QuestLog, 125, 35, 36> QuestLog;
|
||||
UpdateFieldArray<UF::VisibleItem, 19, 161, 162> VisibleItems;
|
||||
UpdateFieldArray<float, 6, 181, 182> AvgItemLevel;
|
||||
|
||||
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;
|
||||
@@ -520,7 +523,7 @@ struct RestInfo : public IsUpdateFieldStructureTag, public HasChangesMask<3>
|
||||
void ClearChangesMask();
|
||||
};
|
||||
|
||||
struct PVPInfo : public IsUpdateFieldStructureTag, public HasChangesMask<10>
|
||||
struct PVPInfo : public IsUpdateFieldStructureTag, public HasChangesMask<11>
|
||||
{
|
||||
UpdateField<bool, 0, 1> Disqualified;
|
||||
UpdateField<uint32, 0, 2> WeeklyPlayed;
|
||||
@@ -531,6 +534,7 @@ struct PVPInfo : public IsUpdateFieldStructureTag, public HasChangesMask<10>
|
||||
UpdateField<uint32, 0, 7> WeeklyBestRating;
|
||||
UpdateField<uint32, 0, 8> SeasonBestRating;
|
||||
UpdateField<uint32, 0, 9> PvpTierID;
|
||||
UpdateField<uint32, 0, 10> WeeklyBestWinPvpTierID;
|
||||
|
||||
void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const;
|
||||
void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const;
|
||||
@@ -647,7 +651,7 @@ struct ReplayedQuest : public IsUpdateFieldStructureTag, public HasChangesMask<3
|
||||
void ClearChangesMask();
|
||||
};
|
||||
|
||||
struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<1512>
|
||||
struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<1557>
|
||||
{
|
||||
UpdateField<bool, 0, 1> BackpackAutoSortDisabled;
|
||||
UpdateField<bool, 0, 2> BankAutoSortDisabled;
|
||||
@@ -685,7 +689,7 @@ struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMas
|
||||
UpdateField<UF::SkillInfo, 34, 36> Skill;
|
||||
UpdateField<int32, 34, 37> CharacterPoints;
|
||||
UpdateField<int32, 34, 38> MaxTalentTiers;
|
||||
UpdateField<int32, 34, 39> TrackCreatureMask;
|
||||
UpdateField<uint32, 34, 39> TrackCreatureMask;
|
||||
UpdateField<float, 34, 40> MainhandExpertise;
|
||||
UpdateField<float, 34, 41> OffhandExpertise;
|
||||
UpdateField<float, 34, 42> RangedExpertise;
|
||||
@@ -748,36 +752,33 @@ struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMas
|
||||
UpdateField<uint64, 98, 101> GuildClubMemberID;
|
||||
UpdateField<int32, 98, 102> Honor;
|
||||
UpdateField<int32, 98, 103> HonorNextLevel;
|
||||
UpdateField<int64, 98, 104> PvpRewardAchieved;
|
||||
UpdateField<int32, 98, 105> PvpTierMaxFromWins;
|
||||
UpdateField<int64, 98, 106> PvpLastWeeksRewardAchieved;
|
||||
UpdateField<int32, 98, 107> PvpLastWeeksTierMaxFromWins;
|
||||
UpdateField<int64, 98, 108> PvpLastWeeksRewardClaimed;
|
||||
UpdateField<uint8, 98, 109> NumBankSlots;
|
||||
UpdateField<UF::ActivePlayerUnk901, 98, 111> Field_1410;
|
||||
OptionalUpdateField<UF::QuestSession, 98, 110> QuestSession;
|
||||
UpdateField<int32, 98, 112> UiChromieTimeExpansionID;
|
||||
UpdateField<int32, 98, 113> TransportServerTime;
|
||||
UpdateField<uint32, 98, 114> WeeklyRewardsPeriodSinceOrigin; // week count since Cfg_RegionsEntry::ChallengeOrigin
|
||||
UpdateFieldArray<ObjectGuid, 199, 115, 116> InvSlots;
|
||||
UpdateFieldArray<uint32, 2, 315, 316> TrackResourceMask;
|
||||
UpdateFieldArray<uint64, 192, 318, 319> ExploredZones;
|
||||
UpdateFieldArray<UF::RestInfo, 2, 511, 512> RestInfo;
|
||||
UpdateFieldArray<int32, 7, 514, 515> ModDamageDonePos;
|
||||
UpdateFieldArray<int32, 7, 514, 522> ModDamageDoneNeg;
|
||||
UpdateFieldArray<float, 7, 514, 529> ModDamageDonePercent;
|
||||
UpdateFieldArray<float, 7, 514, 536> ModHealingDonePercent;
|
||||
UpdateFieldArray<float, 3, 543, 544> WeaponDmgMultipliers;
|
||||
UpdateFieldArray<float, 3, 543, 547> WeaponAtkSpeedMultipliers;
|
||||
UpdateFieldArray<uint32, 12, 550, 551> BuybackPrice;
|
||||
UpdateFieldArray<uint32, 12, 550, 563> BuybackTimestamp;
|
||||
UpdateFieldArray<int32, 32, 575, 576> CombatRatings;
|
||||
UpdateFieldArray<UF::PVPInfo, 6, 608, 609> PvpInfo;
|
||||
UpdateFieldArray<uint32, 4, 615, 616> NoReagentCostMask;
|
||||
UpdateFieldArray<int32, 2, 620, 621> ProfessionSkillLine;
|
||||
UpdateFieldArray<uint32, 4, 623, 624> BagSlotFlags;
|
||||
UpdateFieldArray<uint32, 7, 628, 629> BankBagSlotFlags;
|
||||
UpdateFieldArray<uint64, 875, 636, 637> QuestCompleted;
|
||||
UpdateField<uint8, 98, 104> NumBankSlots;
|
||||
UpdateField<UF::ActivePlayerUnk901, 98, 106> Field_1410;
|
||||
OptionalUpdateField<UF::QuestSession, 98, 105> QuestSession;
|
||||
UpdateField<int32, 98, 107> UiChromieTimeExpansionID;
|
||||
UpdateField<int32, 98, 108> TransportServerTime;
|
||||
UpdateField<uint32, 98, 109> WeeklyRewardsPeriodSinceOrigin; // week count since Cfg_RegionsEntry::ChallengeOrigin
|
||||
UpdateField<int16, 98, 110> DEBUGSoulbindConduitRank;
|
||||
UpdateField<WorldPackets::MythicPlus::DungeonScoreData, 98, 111> DungeonScore;
|
||||
UpdateFieldArray<ObjectGuid, 199, 112, 113> InvSlots;
|
||||
UpdateFieldArray<uint32, 2, 312, 313> TrackResourceMask;
|
||||
UpdateFieldArray<uint64, 240, 315, 316> ExploredZones;
|
||||
UpdateFieldArray<UF::RestInfo, 2, 556, 557> RestInfo;
|
||||
UpdateFieldArray<int32, 7, 559, 560> ModDamageDonePos;
|
||||
UpdateFieldArray<int32, 7, 559, 567> ModDamageDoneNeg;
|
||||
UpdateFieldArray<float, 7, 559, 574> ModDamageDonePercent;
|
||||
UpdateFieldArray<float, 7, 559, 581> ModHealingDonePercent;
|
||||
UpdateFieldArray<float, 3, 588, 589> WeaponDmgMultipliers;
|
||||
UpdateFieldArray<float, 3, 588, 592> WeaponAtkSpeedMultipliers;
|
||||
UpdateFieldArray<uint32, 12, 595, 596> BuybackPrice;
|
||||
UpdateFieldArray<uint32, 12, 595, 608> BuybackTimestamp;
|
||||
UpdateFieldArray<int32, 32, 620, 621> CombatRatings;
|
||||
UpdateFieldArray<UF::PVPInfo, 6, 653, 654> PvpInfo;
|
||||
UpdateFieldArray<uint32, 4, 660, 661> NoReagentCostMask;
|
||||
UpdateFieldArray<int32, 2, 665, 666> ProfessionSkillLine;
|
||||
UpdateFieldArray<uint32, 4, 668, 669> BagSlotFlags;
|
||||
UpdateFieldArray<uint32, 7, 673, 674> BankBagSlotFlags;
|
||||
UpdateFieldArray<uint64, 875, 681, 682> QuestCompleted;
|
||||
|
||||
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;
|
||||
@@ -931,12 +932,13 @@ struct ConversationActor : public IsUpdateFieldStructureTag
|
||||
bool operator!=(ConversationActor const& right) const { return !(*this == right); }
|
||||
};
|
||||
|
||||
struct ConversationData : public IsUpdateFieldStructureTag, public HasChangesMask<5>
|
||||
struct ConversationData : public IsUpdateFieldStructureTag, public HasChangesMask<6>
|
||||
{
|
||||
UpdateField<std::vector<UF::ConversationLine>, 0, 1> Lines;
|
||||
DynamicUpdateField<UF::ConversationActor, 0, 2> Actors;
|
||||
UpdateField<int32, 0, 3> LastLineEndTime;
|
||||
UpdateField<uint32, 0, 4> Progress;
|
||||
UpdateField<bool, 0, 1> DontPlayBroadcastTextSounds;
|
||||
UpdateField<std::vector<UF::ConversationLine>, 0, 2> Lines;
|
||||
DynamicUpdateField<UF::ConversationActor, 0, 3> Actors;
|
||||
UpdateField<int32, 0, 4> LastLineEndTime;
|
||||
UpdateField<uint32, 0, 5> Progress;
|
||||
|
||||
void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Conversation const* owner, Player const* receiver) const;
|
||||
void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Conversation const* owner, Player const* receiver) const;
|
||||
|
||||
@@ -54,8 +54,10 @@ struct EquipmentSetInfo
|
||||
std::array<ObjectGuid, EQUIPMENT_SET_SLOTS> Pieces;
|
||||
std::array<int32, EQUIPMENT_SET_SLOTS> Appearances; ///< ItemModifiedAppearanceID
|
||||
std::array<int32, 2> Enchants; ///< SpellItemEnchantmentID
|
||||
int32 Unknown901_1 = 0;
|
||||
int32 Unknown901_2 = 0;
|
||||
int32 SecondaryShoulderApparanceID = 0; ///< Secondary shoulder appearance
|
||||
int32 SecondaryShoulderSlot = 0; ///< Always 2 if secondary shoulder apperance is used
|
||||
int32 SecondaryWeaponAppearanceID = 0; ///< For legion artifacts: linked child item appearance
|
||||
int32 SecondaryWeaponSlot = 0; ///< For legion artifacts: which slot is used by child item
|
||||
} Data;
|
||||
|
||||
/// Server-side data
|
||||
|
||||
@@ -358,9 +358,11 @@ void ObjectMgr::LoadCreatureTemplates()
|
||||
// "spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, VehicleId, mingold, maxgold, AIName, MovementType, "
|
||||
// 60 61 62 63 64 65 66 67 68
|
||||
// "InhabitType, HoverHeight, HealthModifier, HealthModifierExtra, ManaModifier, ManaModifierExtra, ArmorModifier, DamageModifier, ExperienceModifier, "
|
||||
// 69 70 71 72 73 74 75 76
|
||||
// "RacialLeader, movementId, WidgetSetID, WidgetSetUnitConditionID, RegenHealth, mechanic_immune_mask, spell_school_immune_mask, flags_extra, "
|
||||
// 77
|
||||
// 69 70 71 72 73 74
|
||||
// "RacialLeader, movementId, CreatureDifficultyID, WidgetSetID, WidgetSetUnitConditionID, RegenHealth, "
|
||||
// 75 76 77
|
||||
// "mechanic_immune_mask, spell_school_immune_mask, flags_extra, "
|
||||
// 78
|
||||
// "ScriptName FROM creature_template WHERE entry = ? OR 1 = ?");
|
||||
|
||||
WorldDatabasePreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_CREATURE_TEMPLATE);
|
||||
@@ -462,13 +464,14 @@ void ObjectMgr::LoadCreatureTemplate(Field* fields)
|
||||
creatureTemplate.ModExperience = fields[68].GetFloat();
|
||||
creatureTemplate.RacialLeader = fields[69].GetBool();
|
||||
creatureTemplate.movementId = fields[70].GetUInt32();
|
||||
creatureTemplate.WidgetSetID = fields[71].GetInt32();
|
||||
creatureTemplate.WidgetSetUnitConditionID = fields[72].GetInt32();
|
||||
creatureTemplate.RegenHealth = fields[73].GetBool();
|
||||
creatureTemplate.MechanicImmuneMask = fields[74].GetUInt32();
|
||||
creatureTemplate.SpellSchoolImmuneMask = fields[75].GetUInt32();
|
||||
creatureTemplate.flags_extra = fields[76].GetUInt32();
|
||||
creatureTemplate.ScriptID = GetScriptId(fields[77].GetString());
|
||||
creatureTemplate.CreatureDifficultyID = fields[71].GetInt32();
|
||||
creatureTemplate.WidgetSetID = fields[72].GetInt32();
|
||||
creatureTemplate.WidgetSetUnitConditionID = fields[73].GetInt32();
|
||||
creatureTemplate.RegenHealth = fields[74].GetBool();
|
||||
creatureTemplate.MechanicImmuneMask = fields[75].GetUInt32();
|
||||
creatureTemplate.SpellSchoolImmuneMask = fields[76].GetUInt32();
|
||||
creatureTemplate.flags_extra = fields[77].GetUInt32();
|
||||
creatureTemplate.ScriptID = GetScriptId(fields[78].GetString());
|
||||
}
|
||||
|
||||
void ObjectMgr::LoadCreatureTemplateModels()
|
||||
@@ -638,8 +641,8 @@ void ObjectMgr::LoadCreatureScalingData()
|
||||
{
|
||||
uint32 oldMSTime = getMSTime();
|
||||
|
||||
// 0 1 2 3 4 5 6
|
||||
QueryResult result = WorldDatabase.Query("SELECT Entry, DifficultyID, LevelScalingMin, LevelScalingMax, LevelScalingDeltaMin, LevelScalingDeltaMax, ContentTuningID FROM creature_template_scaling ORDER BY Entry");
|
||||
// 0 1 2 3 4
|
||||
QueryResult result = WorldDatabase.Query("SELECT Entry, DifficultyID, LevelScalingDeltaMin, LevelScalingDeltaMax, ContentTuningID FROM creature_template_scaling ORDER BY Entry");
|
||||
|
||||
if (!result)
|
||||
{
|
||||
@@ -663,11 +666,9 @@ void ObjectMgr::LoadCreatureScalingData()
|
||||
}
|
||||
|
||||
CreatureLevelScaling creatureLevelScaling;
|
||||
creatureLevelScaling.MinLevel = fields[2].GetUInt16();
|
||||
creatureLevelScaling.MaxLevel = fields[3].GetUInt16();
|
||||
creatureLevelScaling.DeltaLevelMin = fields[4].GetInt16();
|
||||
creatureLevelScaling.DeltaLevelMax = fields[5].GetInt16();
|
||||
creatureLevelScaling.ContentTuningID = fields[6].GetInt32();
|
||||
creatureLevelScaling.DeltaLevelMin = fields[2].GetInt16();
|
||||
creatureLevelScaling.DeltaLevelMax = fields[3].GetInt16();
|
||||
creatureLevelScaling.ContentTuningID = fields[4].GetInt32();
|
||||
|
||||
itr->second.scalingStore[difficulty] = creatureLevelScaling;
|
||||
|
||||
@@ -4127,19 +4128,21 @@ void ObjectMgr::LoadQuests()
|
||||
"RewardChoiceItemID3, RewardChoiceItemQuantity3, RewardChoiceItemDisplayID3, RewardChoiceItemID4, RewardChoiceItemQuantity4, RewardChoiceItemDisplayID4, "
|
||||
//52 53 54 55 56 57
|
||||
"RewardChoiceItemID5, RewardChoiceItemQuantity5, RewardChoiceItemDisplayID5, RewardChoiceItemID6, RewardChoiceItemQuantity6, RewardChoiceItemDisplayID6, "
|
||||
//58 59 60 61 62 63 64 65 66 67 68
|
||||
"POIContinent, POIx, POIy, POIPriority, RewardTitle, RewardArenaPoints, RewardSkillLineID, RewardNumSkillUps, PortraitGiver, PortraitGiverMount, PortraitTurnIn, "
|
||||
//69 70 71 72 73 74 75 76
|
||||
//58 59 60 61 62 63 64 65
|
||||
"POIContinent, POIx, POIy, POIPriority, RewardTitle, RewardArenaPoints, RewardSkillLineID, RewardNumSkillUps, "
|
||||
//66 67 68 69
|
||||
"PortraitGiver, PortraitGiverMount, PortraitGiverModelSceneID, PortraitTurnIn, "
|
||||
//70 71 72 73 74 75 76 77
|
||||
"RewardFactionID1, RewardFactionValue1, RewardFactionOverride1, RewardFactionCapIn1, RewardFactionID2, RewardFactionValue2, RewardFactionOverride2, RewardFactionCapIn2, "
|
||||
//77 78 79 80 81 82 83 84
|
||||
//78 79 80 81 82 83 84 85
|
||||
"RewardFactionID3, RewardFactionValue3, RewardFactionOverride3, RewardFactionCapIn3, RewardFactionID4, RewardFactionValue4, RewardFactionOverride4, RewardFactionCapIn4, "
|
||||
//85 86 87 88 89
|
||||
//86 87 88 89 90
|
||||
"RewardFactionID5, RewardFactionValue5, RewardFactionOverride5, RewardFactionCapIn5, RewardFactionFlags, "
|
||||
//90 91 92 93 94 95 96 97
|
||||
//91 92 93 94 95 96 97 98
|
||||
"RewardCurrencyID1, RewardCurrencyQty1, RewardCurrencyID2, RewardCurrencyQty2, RewardCurrencyID3, RewardCurrencyQty3, RewardCurrencyID4, RewardCurrencyQty4, "
|
||||
//98 99 100 101 102 103 104 105 106
|
||||
//99 100 101 102 103 104 105 106 107
|
||||
"AcceptedSoundKitID, CompleteSoundKitID, AreaGroupID, TimeAllowed, AllowableRaces, TreasurePickerID, Expansion, ManagedWorldStateID, QuestSessionBonus, "
|
||||
//107 108 109 110 111 112 113 114 115
|
||||
//108 109 110 111 112 113 114 115 116
|
||||
"LogTitle, LogDescription, QuestDescription, AreaDescription, PortraitGiverText, PortraitGiverName, PortraitTurnInText, PortraitTurnInName, QuestCompletionLog"
|
||||
" FROM quest_template");
|
||||
if (!result)
|
||||
@@ -7844,8 +7847,8 @@ void ObjectMgr::LoadPointsOfInterest()
|
||||
|
||||
uint32 count = 0;
|
||||
|
||||
// 0 1 2 3 4 5 6 7
|
||||
QueryResult result = WorldDatabase.Query("SELECT ID, PositionX, PositionY, Icon, Flags, Importance, Name, Unknown905 FROM points_of_interest");
|
||||
// 0 1 2 3 4 5 6 7 8
|
||||
QueryResult result = WorldDatabase.Query("SELECT ID, PositionX, PositionY, PositionZ, Icon, Flags, Importance, Name, Unknown905 FROM points_of_interest");
|
||||
|
||||
if (!result)
|
||||
{
|
||||
@@ -7861,16 +7864,17 @@ void ObjectMgr::LoadPointsOfInterest()
|
||||
|
||||
PointOfInterest pointOfInterest;
|
||||
pointOfInterest.ID = id;
|
||||
pointOfInterest.Pos.Relocate(fields[1].GetFloat(), fields[2].GetFloat());
|
||||
pointOfInterest.Icon = fields[3].GetUInt32();
|
||||
pointOfInterest.Flags = fields[4].GetUInt32();
|
||||
pointOfInterest.Importance = fields[5].GetUInt32();
|
||||
pointOfInterest.Name = fields[6].GetString();
|
||||
pointOfInterest.Unknown905 = fields[7].GetInt32();
|
||||
pointOfInterest.Pos.Relocate(fields[1].GetFloat(), fields[2].GetFloat(), fields[3].GetFloat());
|
||||
pointOfInterest.Icon = fields[4].GetUInt32();
|
||||
pointOfInterest.Flags = fields[5].GetUInt32();
|
||||
pointOfInterest.Importance = fields[6].GetUInt32();
|
||||
pointOfInterest.Name = fields[7].GetString();
|
||||
pointOfInterest.Unknown905 = fields[8].GetInt32();
|
||||
|
||||
if (!Trinity::IsValidMapCoord(pointOfInterest.Pos.GetPositionX(), pointOfInterest.Pos.GetPositionY()))
|
||||
if (!Trinity::IsValidMapCoord(pointOfInterest.Pos.GetPositionX(), pointOfInterest.Pos.GetPositionY(), pointOfInterest.Pos.GetPositionZ()))
|
||||
{
|
||||
TC_LOG_ERROR("sql.sql", "Table `points_of_interest` (ID: %u) have invalid coordinates (PositionX: %f PositionY: %f), ignored.", id, pointOfInterest.Pos.GetPositionX(), pointOfInterest.Pos.GetPositionY());
|
||||
TC_LOG_ERROR("sql.sql", "Table `points_of_interest` (ID: %u) have invalid coordinates (PositionX: %f PositionY: %f, PositionZ: %f), ignored.",
|
||||
id, pointOfInterest.Pos.GetPositionX(), pointOfInterest.Pos.GetPositionY(), pointOfInterest.Pos.GetPositionZ());
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
@@ -1415,6 +1415,10 @@ void WorldSession::SendFeatureSystemStatus()
|
||||
features.IsMuted = !CanSpeak();
|
||||
|
||||
SendPacket(features.Write());
|
||||
|
||||
WorldPackets::System::FeatureSystemStatus2 features2;
|
||||
features2.TextToSpeechFeatureEnabled = false;
|
||||
SendPacket(features2.Write());
|
||||
}
|
||||
|
||||
void WorldSession::HandleSetFactionAtWar(WorldPackets::Character::SetFactionAtWar& packet)
|
||||
|
||||
@@ -87,7 +87,7 @@ void WorldSession::HandleChatMessageWhisperOpcode(WorldPackets::Chat::ChatMessag
|
||||
|
||||
void WorldSession::HandleChatMessageChannelOpcode(WorldPackets::Chat::ChatMessageChannel& chatMessageChannel)
|
||||
{
|
||||
HandleChatMessage(CHAT_MSG_CHANNEL, Language(chatMessageChannel.Language), chatMessageChannel.Text, chatMessageChannel.Target);
|
||||
HandleChatMessage(CHAT_MSG_CHANNEL, Language(chatMessageChannel.Language), chatMessageChannel.Text, chatMessageChannel.Target, chatMessageChannel.ChannelGUID);
|
||||
}
|
||||
|
||||
void WorldSession::HandleChatMessageEmoteOpcode(WorldPackets::Chat::ChatMessageEmote& chatMessageEmote)
|
||||
@@ -95,7 +95,7 @@ void WorldSession::HandleChatMessageEmoteOpcode(WorldPackets::Chat::ChatMessageE
|
||||
HandleChatMessage(CHAT_MSG_EMOTE, LANG_UNIVERSAL, chatMessageEmote.Text);
|
||||
}
|
||||
|
||||
void WorldSession::HandleChatMessage(ChatMsg type, Language lang, std::string msg, std::string target /*= ""*/)
|
||||
void WorldSession::HandleChatMessage(ChatMsg type, Language lang, std::string msg, std::string target /*= ""*/, Optional<ObjectGuid> channelGuid /*= {}*/)
|
||||
{
|
||||
Player* sender = GetPlayer();
|
||||
|
||||
@@ -374,7 +374,10 @@ void WorldSession::HandleChatMessage(ChatMsg type, Language lang, std::string ms
|
||||
}
|
||||
}
|
||||
|
||||
if (Channel* chn = ChannelMgr::GetChannelForPlayerByNamePart(target, sender))
|
||||
Channel* chn = channelGuid
|
||||
? ChannelMgr::GetChannelForPlayerByGuid(*channelGuid, sender)
|
||||
: ChannelMgr::GetChannelForPlayerByNamePart(target, sender);
|
||||
if (chn)
|
||||
{
|
||||
sScriptMgr->OnPlayerChat(sender, type, lang, msg, chn);
|
||||
chn->Say(sender->GetGUID(), msg, lang);
|
||||
@@ -411,10 +414,10 @@ void WorldSession::HandleChatAddonMessageOpcode(WorldPackets::Chat::ChatAddonMes
|
||||
void WorldSession::HandleChatAddonMessageTargetedOpcode(WorldPackets::Chat::ChatAddonMessageTargeted& chatAddonMessageTargeted)
|
||||
{
|
||||
HandleChatAddonMessage(chatAddonMessageTargeted.Params.Type, chatAddonMessageTargeted.Params.Prefix, chatAddonMessageTargeted.Params.Text,
|
||||
chatAddonMessageTargeted.Params.IsLogged, chatAddonMessageTargeted.Target);
|
||||
chatAddonMessageTargeted.Params.IsLogged, chatAddonMessageTargeted.Target, chatAddonMessageTargeted.ChannelGUID);
|
||||
}
|
||||
|
||||
void WorldSession::HandleChatAddonMessage(ChatMsg type, std::string prefix, std::string text, bool isLogged, std::string target /*= ""*/)
|
||||
void WorldSession::HandleChatAddonMessage(ChatMsg type, std::string prefix, std::string text, bool isLogged, std::string target /*= ""*/, Optional<ObjectGuid> channelGuid /*= {}*/)
|
||||
{
|
||||
Player* sender = GetPlayer();
|
||||
|
||||
@@ -480,7 +483,10 @@ void WorldSession::HandleChatAddonMessage(ChatMsg type, std::string prefix, std:
|
||||
}
|
||||
case CHAT_MSG_CHANNEL:
|
||||
{
|
||||
if (Channel* chn = ChannelMgr::GetChannelForPlayerByNamePart(target, sender))
|
||||
Channel* chn = channelGuid
|
||||
? ChannelMgr::GetChannelForPlayerByGuid(*channelGuid, sender)
|
||||
: ChannelMgr::GetChannelForPlayerByNamePart(target, sender);
|
||||
if (chn)
|
||||
chn->AddonSay(sender->GetGUID(), prefix, text.c_str(), isLogged);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -88,46 +88,47 @@ Quest::Quest(Field* questRecord)
|
||||
|
||||
_questGiverPortrait = questRecord[66].GetUInt32();
|
||||
_questGiverPortraitMount = questRecord[67].GetUInt32();
|
||||
_questTurnInPortrait = questRecord[68].GetUInt32();
|
||||
_questGiverPortraitModelSceneId = questRecord[68].GetInt32();
|
||||
_questTurnInPortrait = questRecord[69].GetUInt32();
|
||||
|
||||
for (uint32 i = 0; i < QUEST_REWARD_REPUTATIONS_COUNT; ++i)
|
||||
{
|
||||
RewardFactionId[i] = questRecord[69 + i * 4].GetUInt32();
|
||||
RewardFactionValue[i] = questRecord[70 + i * 4].GetInt32();
|
||||
RewardFactionOverride[i] = questRecord[71 + i * 4].GetInt32();
|
||||
RewardFactionCapIn[i] = questRecord[72 + i * 4].GetInt32();
|
||||
RewardFactionId[i] = questRecord[70 + i * 4].GetUInt32();
|
||||
RewardFactionValue[i] = questRecord[71 + i * 4].GetInt32();
|
||||
RewardFactionOverride[i] = questRecord[72 + i * 4].GetInt32();
|
||||
RewardFactionCapIn[i] = questRecord[73 + i * 4].GetInt32();
|
||||
}
|
||||
|
||||
_rewardReputationMask = questRecord[89].GetUInt32();
|
||||
_rewardReputationMask = questRecord[90].GetUInt32();
|
||||
|
||||
for (uint32 i = 0; i < QUEST_REWARD_CURRENCY_COUNT; ++i)
|
||||
{
|
||||
RewardCurrencyId[i] = questRecord[90 + i * 2].GetUInt32();
|
||||
RewardCurrencyCount[i] = questRecord[91 + i * 2].GetUInt32();
|
||||
RewardCurrencyId[i] = questRecord[91 + i * 2].GetUInt32();
|
||||
RewardCurrencyCount[i] = questRecord[92 + i * 2].GetUInt32();
|
||||
|
||||
if (RewardCurrencyId[i])
|
||||
++_rewCurrencyCount;
|
||||
}
|
||||
|
||||
_soundAccept = questRecord[98].GetUInt32();
|
||||
_soundTurnIn = questRecord[99].GetUInt32();
|
||||
_areaGroupID = questRecord[100].GetUInt32();
|
||||
_limitTime = questRecord[101].GetUInt32();
|
||||
_allowableRaces.RawValue = questRecord[102].GetUInt64();
|
||||
_treasurePickerID = questRecord[103].GetInt32();
|
||||
_expansion = questRecord[104].GetInt32();
|
||||
_managedWorldStateID = questRecord[105].GetInt32();
|
||||
_questSessionBonus = questRecord[106].GetInt32();
|
||||
_soundAccept = questRecord[99].GetUInt32();
|
||||
_soundTurnIn = questRecord[100].GetUInt32();
|
||||
_areaGroupID = questRecord[101].GetUInt32();
|
||||
_limitTime = questRecord[102].GetUInt32();
|
||||
_allowableRaces.RawValue = questRecord[103].GetUInt64();
|
||||
_treasurePickerID = questRecord[104].GetInt32();
|
||||
_expansion = questRecord[105].GetInt32();
|
||||
_managedWorldStateID = questRecord[106].GetInt32();
|
||||
_questSessionBonus = questRecord[107].GetInt32();
|
||||
|
||||
_logTitle = questRecord[107].GetString();
|
||||
_logDescription = questRecord[108].GetString();
|
||||
_questDescription = questRecord[109].GetString();
|
||||
_areaDescription = questRecord[110].GetString();
|
||||
_portraitGiverText = questRecord[111].GetString();
|
||||
_portraitGiverName = questRecord[112].GetString();
|
||||
_portraitTurnInText = questRecord[113].GetString();
|
||||
_portraitTurnInName = questRecord[114].GetString();
|
||||
_questCompletionLog = questRecord[115].GetString();
|
||||
_logTitle = questRecord[108].GetString();
|
||||
_logDescription = questRecord[109].GetString();
|
||||
_questDescription = questRecord[110].GetString();
|
||||
_areaDescription = questRecord[111].GetString();
|
||||
_portraitGiverText = questRecord[112].GetString();
|
||||
_portraitGiverName = questRecord[113].GetString();
|
||||
_portraitTurnInText = questRecord[114].GetString();
|
||||
_portraitTurnInName = questRecord[115].GetString();
|
||||
_questCompletionLog = questRecord[116].GetString();
|
||||
}
|
||||
|
||||
void Quest::LoadRewardDisplaySpell(Field* fields)
|
||||
@@ -532,6 +533,7 @@ WorldPacket Quest::BuildQueryData(LocaleConstant loc) const
|
||||
response.Info.RewardFactionFlags = GetRewardReputationMask();
|
||||
response.Info.PortraitGiver = GetQuestGiverPortrait();
|
||||
response.Info.PortraitGiverMount = GetQuestGiverPortraitMount();
|
||||
response.Info.PortraitGiverModelSceneID = GetQuestGiverPortraitModelSceneId();
|
||||
response.Info.PortraitTurnIn = GetQuestTurnInPortrait();
|
||||
|
||||
for (uint8 i = 0; i < QUEST_ITEM_DROP_COUNT; ++i)
|
||||
|
||||
@@ -562,6 +562,7 @@ class TC_GAME_API Quest
|
||||
int32 GetQuestSessionBonus() const { return _questSessionBonus; }
|
||||
uint32 GetQuestGiverPortrait() const { return _questGiverPortrait; }
|
||||
int32 GetQuestGiverPortraitMount() const { return _questGiverPortraitMount; }
|
||||
int32 GetQuestGiverPortraitModelSceneId() const { return _questGiverPortraitModelSceneId; }
|
||||
uint32 GetQuestTurnInPortrait() const { return _questTurnInPortrait; }
|
||||
bool IsDaily() const { return (_flags & QUEST_FLAGS_DAILY) != 0; }
|
||||
bool IsWeekly() const { return (_flags & QUEST_FLAGS_WEEKLY) != 0; }
|
||||
@@ -652,6 +653,7 @@ class TC_GAME_API Quest
|
||||
uint32 _rewardSkillPoints = 0;
|
||||
uint32 _questGiverPortrait = 0;
|
||||
int32 _questGiverPortraitMount = 0;
|
||||
int32 _questGiverPortraitModelSceneId = 0;
|
||||
uint32 _questTurnInPortrait = 0;
|
||||
uint32 _rewardReputationMask;
|
||||
uint32 _soundAccept = 0;
|
||||
|
||||
@@ -195,6 +195,7 @@ ByteBuffer& operator<<(ByteBuffer& data, AuctionItem const& auctionItem)
|
||||
data.WriteBit(auctionItem.CensorServerSideInfo);
|
||||
data.WriteBit(auctionItem.CensorBidInfo);
|
||||
data.WriteBit(auctionItem.AuctionBucketKey.is_initialized());
|
||||
data.WriteBit(auctionItem.Creator.is_initialized());
|
||||
if (!auctionItem.CensorBidInfo)
|
||||
{
|
||||
data.WriteBit(auctionItem.Bidder.is_initialized());
|
||||
@@ -236,6 +237,9 @@ ByteBuffer& operator<<(ByteBuffer& data, AuctionItem const& auctionItem)
|
||||
data << int32(auctionItem.EndTime);
|
||||
}
|
||||
|
||||
if (auctionItem.Creator)
|
||||
data << *auctionItem.Creator;
|
||||
|
||||
if (!auctionItem.CensorBidInfo)
|
||||
{
|
||||
if (auctionItem.Bidder)
|
||||
|
||||
@@ -130,6 +130,7 @@ namespace WorldPackets
|
||||
Optional<uint64> BidAmount;
|
||||
std::vector<Item::ItemGemData> Gems;
|
||||
Optional<WorldPackets::AuctionHouse::AuctionBucketKey> AuctionBucketKey;
|
||||
Optional<ObjectGuid> Creator;
|
||||
};
|
||||
|
||||
struct AuctionBidderNotification
|
||||
|
||||
@@ -65,7 +65,6 @@ WorldPacket const* WorldPackets::BattlePet::BattlePetJournal::Write()
|
||||
_worldPacket << uint16(Trap);
|
||||
_worldPacket << uint32(Slots.size());
|
||||
_worldPacket << uint32(Pets.size());
|
||||
_worldPacket << int32(MaxPets);
|
||||
_worldPacket.WriteBit(HasJournalLock);
|
||||
_worldPacket.FlushBits();
|
||||
|
||||
|
||||
@@ -72,7 +72,6 @@ namespace WorldPackets
|
||||
bool HasJournalLock = true;
|
||||
std::vector<std::reference_wrapper<BattlePetSlot>> Slots;
|
||||
std::vector<std::reference_wrapper<BattlePet>> Pets;
|
||||
int32 MaxPets = 1000;
|
||||
};
|
||||
|
||||
class BattlePetJournalLockAcquired final : public ServerPacket
|
||||
|
||||
@@ -325,6 +325,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Battleground::RatedPvpInf
|
||||
data << int32(bracketInfo.BestSeasonRating);
|
||||
data << int32(bracketInfo.PvpTierID);
|
||||
data << int32(bracketInfo.Unused3);
|
||||
data << int32(bracketInfo.WeeklyBestWinPvpTierID);
|
||||
data.WriteBit(bracketInfo.Disqualified);
|
||||
data.FlushBits();
|
||||
|
||||
|
||||
@@ -448,6 +448,7 @@ namespace WorldPackets
|
||||
int32 BestSeasonRating = 0;
|
||||
int32 PvpTierID = 0;
|
||||
int32 Unused3 = 0;
|
||||
int32 WeeklyBestWinPvpTierID = 0;
|
||||
bool Disqualified = false;
|
||||
} Bracket[6];
|
||||
};
|
||||
|
||||
@@ -41,6 +41,7 @@ void WorldPackets::Chat::ChatMessageWhisper::Read()
|
||||
void WorldPackets::Chat::ChatMessageChannel::Read()
|
||||
{
|
||||
_worldPacket >> Language;
|
||||
_worldPacket >> ChannelGUID;
|
||||
uint32 targetLen = _worldPacket.ReadBits(9);
|
||||
uint32 textLen = _worldPacket.ReadBits(9);
|
||||
Target = _worldPacket.ReadString(targetLen);
|
||||
@@ -70,6 +71,7 @@ void WorldPackets::Chat::ChatAddonMessageTargeted::Read()
|
||||
_worldPacket.ResetBitPos();
|
||||
|
||||
_worldPacket >> Params;
|
||||
_worldPacket >> *ChannelGUID;
|
||||
Target = _worldPacket.ReadString(targetLen);
|
||||
}
|
||||
|
||||
@@ -180,6 +182,7 @@ WorldPacket const* WorldPackets::Chat::Chat::Write()
|
||||
_worldPacket.WriteBit(HideChatLog);
|
||||
_worldPacket.WriteBit(FakeSenderName);
|
||||
_worldPacket.WriteBit(Unused_801.is_initialized());
|
||||
_worldPacket.WriteBit(ChannelGUID.is_initialized());
|
||||
_worldPacket.FlushBits();
|
||||
|
||||
_worldPacket.WriteString(SenderName);
|
||||
@@ -191,6 +194,9 @@ WorldPacket const* WorldPackets::Chat::Chat::Write()
|
||||
if (Unused_801)
|
||||
_worldPacket << uint32(*Unused_801);
|
||||
|
||||
if (ChannelGUID)
|
||||
_worldPacket << *ChannelGUID;
|
||||
|
||||
return &_worldPacket;
|
||||
}
|
||||
|
||||
|
||||
@@ -72,6 +72,7 @@ namespace WorldPackets
|
||||
void Read() override;
|
||||
|
||||
int32 Language = LANG_UNIVERSAL;
|
||||
ObjectGuid ChannelGUID;
|
||||
std::string Text;
|
||||
std::string Target;
|
||||
};
|
||||
@@ -99,12 +100,16 @@ namespace WorldPackets
|
||||
class ChatAddonMessageTargeted final : public ClientPacket
|
||||
{
|
||||
public:
|
||||
ChatAddonMessageTargeted(WorldPacket&& packet) : ClientPacket(CMSG_CHAT_ADDON_MESSAGE_TARGETED, std::move(packet)) { }
|
||||
ChatAddonMessageTargeted(WorldPacket&& packet) : ClientPacket(CMSG_CHAT_ADDON_MESSAGE_TARGETED, std::move(packet))
|
||||
{
|
||||
ChannelGUID.emplace();
|
||||
}
|
||||
|
||||
void Read() override;
|
||||
|
||||
std::string Target;
|
||||
ChatAddonMessageParams Params;
|
||||
Optional<ObjectGuid> ChannelGUID; // not optional in the packet. Optional for api reasons
|
||||
};
|
||||
|
||||
class ChatMessageDND final : public ClientPacket
|
||||
@@ -144,7 +149,8 @@ namespace WorldPackets
|
||||
Chat() : ServerPacket(SMSG_CHAT, 100) { }
|
||||
Chat(Chat const& chat);
|
||||
|
||||
void Initialize(ChatMsg chatType, Language language, WorldObject const* sender, WorldObject const* receiver, std::string message, uint32 achievementId = 0, std::string channelName = "", LocaleConstant locale = DEFAULT_LOCALE, std::string addonPrefix = "");
|
||||
void Initialize(ChatMsg chatType, Language language, WorldObject const* sender, WorldObject const* receiver, std::string message, uint32 achievementId = 0,
|
||||
std::string channelName = "", LocaleConstant locale = DEFAULT_LOCALE, std::string addonPrefix = "");
|
||||
void SetSender(WorldObject const* sender, LocaleConstant locale);
|
||||
void SetReceiver(WorldObject const* receiver, LocaleConstant locale);
|
||||
|
||||
@@ -170,6 +176,7 @@ namespace WorldPackets
|
||||
Optional<uint32> Unused_801;
|
||||
bool HideChatLog = false;
|
||||
bool FakeSenderName = false;
|
||||
Optional<ObjectGuid> ChannelGUID;
|
||||
};
|
||||
|
||||
class Emote final : public ServerPacket
|
||||
|
||||
@@ -345,14 +345,14 @@ WorldPacket const* WorldPackets::CombatLog::AttackerStateUpdate::Write()
|
||||
attackRoundInfo << uint8(ContentTuning.Type);
|
||||
attackRoundInfo << uint8(ContentTuning.TargetLevel);
|
||||
attackRoundInfo << uint8(ContentTuning.Expansion);
|
||||
attackRoundInfo << uint8(ContentTuning.TargetMinScalingLevel);
|
||||
attackRoundInfo << uint8(ContentTuning.TargetMaxScalingLevel);
|
||||
attackRoundInfo << int16(ContentTuning.PlayerLevelDelta);
|
||||
attackRoundInfo << int8(ContentTuning.TargetScalingLevelDelta);
|
||||
attackRoundInfo << float(ContentTuning.PlayerItemLevel);
|
||||
attackRoundInfo << float(ContentTuning.TargetItemLevel);
|
||||
attackRoundInfo << uint16(ContentTuning.ScalingHealthItemLevelCurveID);
|
||||
attackRoundInfo << uint32(ContentTuning.Flags);
|
||||
attackRoundInfo << int32(ContentTuning.PlayerContentTuningID);
|
||||
attackRoundInfo << int32(ContentTuning.TargetContentTuningID);
|
||||
|
||||
WriteLogDataBit();
|
||||
FlushBits();
|
||||
|
||||
@@ -74,9 +74,8 @@ bool ContentTuningParams::GenerateDataForUnits<Creature, Player>(Creature* attac
|
||||
ScalingHealthItemLevelCurveID = target->m_unitData->ScalingHealthItemLevelCurveID;
|
||||
TargetLevel = target->getLevel();
|
||||
Expansion = creatureTemplate->HealthScalingExpansion;
|
||||
TargetMinScalingLevel = uint8(creatureScaling->MinLevel);
|
||||
TargetMaxScalingLevel = uint8(creatureScaling->MaxLevel);
|
||||
TargetScalingLevelDelta = int8(attacker->m_unitData->ScalingLevelDelta);
|
||||
TargetContentTuningID = creatureScaling->ContentTuningID;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -93,9 +92,8 @@ bool ContentTuningParams::GenerateDataForUnits<Player, Creature>(Player* attacke
|
||||
ScalingHealthItemLevelCurveID = target->m_unitData->ScalingHealthItemLevelCurveID;
|
||||
TargetLevel = target->getLevel();
|
||||
Expansion = creatureTemplate->HealthScalingExpansion;
|
||||
TargetMinScalingLevel = uint8(creatureScaling->MinLevel);
|
||||
TargetMaxScalingLevel = uint8(creatureScaling->MaxLevel);
|
||||
TargetScalingLevelDelta = int8(target->m_unitData->ScalingLevelDelta);
|
||||
TargetContentTuningID = creatureScaling->ContentTuningID;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -111,9 +109,8 @@ bool ContentTuningParams::GenerateDataForUnits<Creature, Creature>(Creature* att
|
||||
PlayerItemLevel = 0;
|
||||
TargetLevel = target->getLevel();
|
||||
Expansion = creatureTemplate->HealthScalingExpansion;
|
||||
TargetMinScalingLevel = uint8(creatureScaling->MinLevel);
|
||||
TargetMaxScalingLevel = uint8(creatureScaling->MaxLevel);
|
||||
TargetScalingLevelDelta = int8(accessor->m_unitData->ScalingLevelDelta);
|
||||
TargetContentTuningID = creatureScaling->ContentTuningID;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -174,10 +171,10 @@ ByteBuffer& operator<<(ByteBuffer& data, ContentTuningParams const& contentTunin
|
||||
data << uint16(contentTuningParams.ScalingHealthItemLevelCurveID);
|
||||
data << uint8(contentTuningParams.TargetLevel);
|
||||
data << uint8(contentTuningParams.Expansion);
|
||||
data << uint8(contentTuningParams.TargetMinScalingLevel);
|
||||
data << uint8(contentTuningParams.TargetMaxScalingLevel);
|
||||
data << int8(contentTuningParams.TargetScalingLevelDelta);
|
||||
data << uint32(contentTuningParams.Flags);
|
||||
data << int32(contentTuningParams.PlayerContentTuningID);
|
||||
data << int32(contentTuningParams.TargetContentTuningID);
|
||||
data.WriteBits(contentTuningParams.Type, 4);
|
||||
data.FlushBits();
|
||||
return data;
|
||||
|
||||
@@ -72,10 +72,10 @@ namespace WorldPackets
|
||||
uint16 ScalingHealthItemLevelCurveID = 0;
|
||||
uint8 TargetLevel = 0;
|
||||
uint8 Expansion = 0;
|
||||
uint8 TargetMinScalingLevel = 0;
|
||||
uint8 TargetMaxScalingLevel = 0;
|
||||
int8 TargetScalingLevelDelta = 0;
|
||||
uint32 Flags = NO_LEVEL_SCALING | NO_ITEM_LEVEL_SCALING;
|
||||
int32 PlayerContentTuningID = 0;
|
||||
int32 TargetContentTuningID = 0;
|
||||
|
||||
template<class T, class U>
|
||||
bool GenerateDataForUnits(T* attacker, U* target);
|
||||
|
||||
@@ -45,8 +45,10 @@ WorldPacket const* WorldPackets::EquipmentSet::LoadEquipmentSet::Write()
|
||||
|
||||
_worldPacket.append(equipSet->Enchants.data(), equipSet->Enchants.size());
|
||||
|
||||
_worldPacket << int32(equipSet->Unknown901_1);
|
||||
_worldPacket << int32(equipSet->Unknown901_2);
|
||||
_worldPacket << int32(equipSet->SecondaryShoulderApparanceID);
|
||||
_worldPacket << int32(equipSet->SecondaryShoulderSlot);
|
||||
_worldPacket << int32(equipSet->SecondaryWeaponAppearanceID);
|
||||
_worldPacket << int32(equipSet->SecondaryWeaponSlot);
|
||||
|
||||
_worldPacket.WriteBit(equipSet->AssignedSpecIndex != -1);
|
||||
_worldPacket.WriteBits(equipSet->SetName.length(), 8);
|
||||
@@ -79,8 +81,10 @@ void WorldPackets::EquipmentSet::SaveEquipmentSet::Read()
|
||||
_worldPacket >> Set.Enchants[0];
|
||||
_worldPacket >> Set.Enchants[1];
|
||||
|
||||
_worldPacket >> Set.Unknown901_1;
|
||||
_worldPacket >> Set.Unknown901_2;
|
||||
_worldPacket >> Set.SecondaryShoulderApparanceID;
|
||||
_worldPacket >> Set.SecondaryShoulderSlot;
|
||||
_worldPacket >> Set.SecondaryWeaponAppearanceID;
|
||||
_worldPacket >> Set.SecondaryWeaponSlot;
|
||||
|
||||
bool hasSpecIndex = _worldPacket.ReadBit();
|
||||
|
||||
|
||||
@@ -190,6 +190,14 @@ ByteBuffer& operator<<(ByteBuffer& data, GarrisonEventList const& eventList)
|
||||
return data;
|
||||
}
|
||||
|
||||
ByteBuffer& operator<<(ByteBuffer& data, GarrisonSpecGroup const& specGroup)
|
||||
{
|
||||
data << int32(specGroup.ChrSpecializationID);
|
||||
data << int32(specGroup.SoulbindID);
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
ByteBuffer& operator<<(ByteBuffer& data, GarrisonInfo const& garrison)
|
||||
{
|
||||
ASSERT(garrison.Missions.size() == garrison.MissionRewards.size());
|
||||
@@ -210,6 +218,7 @@ ByteBuffer& operator<<(ByteBuffer& data, GarrisonInfo const& garrison)
|
||||
data << uint32(garrison.Talents.size());
|
||||
data << uint32(garrison.Collections.size());
|
||||
data << uint32(garrison.EventLists.size());
|
||||
data << uint32(garrison.SpecGroups.size());
|
||||
data << uint32(garrison.CanStartMission.size());
|
||||
data << uint32(garrison.ArchivedMissions.size());
|
||||
data << int32(garrison.NumFollowerActivationsRemaining);
|
||||
@@ -237,6 +246,9 @@ ByteBuffer& operator<<(ByteBuffer& data, GarrisonInfo const& garrison)
|
||||
for (GarrisonEventList const& eventList : garrison.EventLists)
|
||||
data << eventList;
|
||||
|
||||
for (GarrisonSpecGroup const& specGroup : garrison.SpecGroups)
|
||||
data << specGroup;
|
||||
|
||||
if (!garrison.ArchivedMissions.empty())
|
||||
data.append(garrison.ArchivedMissions.data(), garrison.ArchivedMissions.size());
|
||||
|
||||
|
||||
@@ -174,6 +174,12 @@ namespace WorldPackets
|
||||
std::vector<GarrisonEventEntry> Events;
|
||||
};
|
||||
|
||||
struct GarrisonSpecGroup
|
||||
{
|
||||
int32 ChrSpecializationID = 0;
|
||||
int32 SoulbindID = 0;
|
||||
};
|
||||
|
||||
struct GarrisonInfo
|
||||
{
|
||||
int32 GarrTypeID = 0;
|
||||
@@ -193,6 +199,7 @@ namespace WorldPackets
|
||||
std::vector<GarrisonTalent> Talents;
|
||||
std::vector<GarrisonCollection> Collections;
|
||||
std::vector<GarrisonEventList> EventLists;
|
||||
std::vector<GarrisonSpecGroup> SpecGroups;
|
||||
std::vector<bool> CanStartMission;
|
||||
std::vector<int32> ArchivedMissions;
|
||||
};
|
||||
|
||||
@@ -118,7 +118,13 @@ void WorldPackets::Guild::DeclineGuildInvites::Read()
|
||||
void WorldPackets::Guild::GuildInviteByName::Read()
|
||||
{
|
||||
uint32 nameLen = _worldPacket.ReadBits(9);
|
||||
if (_worldPacket.ReadBit())
|
||||
Unused910.emplace();
|
||||
|
||||
Name = _worldPacket.ReadString(nameLen);
|
||||
|
||||
if (Unused910)
|
||||
_worldPacket >> *Unused910;
|
||||
}
|
||||
|
||||
WorldPacket const* WorldPackets::Guild::GuildInvite::Write()
|
||||
@@ -181,6 +187,8 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Guild::GuildRosterMemberD
|
||||
data.WriteBit(rosterMemberData.SorEligible);
|
||||
data.FlushBits();
|
||||
|
||||
data << rosterMemberData.DungeonScore;
|
||||
|
||||
data.WriteString(rosterMemberData.Name);
|
||||
data.WriteString(rosterMemberData.Note);
|
||||
data.WriteString(rosterMemberData.OfficerNote);
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include "Packet.h"
|
||||
#include "ItemPacketsCommon.h"
|
||||
#include "Guild.h"
|
||||
#include "MythicPlusPacketsCommon.h"
|
||||
#include "ObjectGuid.h"
|
||||
#include "PacketUtilities.h"
|
||||
|
||||
@@ -120,6 +121,7 @@ namespace WorldPackets
|
||||
bool Authenticated = false;
|
||||
bool SorEligible = false;
|
||||
GuildRosterProfessionData Profession[2];
|
||||
MythicPlus::DungeonScoreSummary DungeonScore;
|
||||
};
|
||||
|
||||
class GuildRoster final : public ServerPacket
|
||||
@@ -203,6 +205,7 @@ namespace WorldPackets
|
||||
void Read() override;
|
||||
|
||||
std::string Name;
|
||||
Optional<int32> Unused910;
|
||||
};
|
||||
|
||||
class GuildInvite final : public ServerPacket
|
||||
|
||||
@@ -131,6 +131,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Inspect::PVPBracketData c
|
||||
data << int32(bracket.WeeklyBestRating);
|
||||
data << int32(bracket.SeasonBestRating);
|
||||
data << int32(bracket.PvpTierID);
|
||||
data << int32(bracket.WeeklyBestWinPvpTierID);
|
||||
data.WriteBit(bracket.Disqualified);
|
||||
data.FlushBits();
|
||||
|
||||
|
||||
@@ -104,6 +104,7 @@ namespace WorldPackets
|
||||
int32 WeeklyBestRating = 0;
|
||||
int32 SeasonBestRating = 0;
|
||||
int32 PvpTierID = 0;
|
||||
int32 WeeklyBestWinPvpTierID = 0;
|
||||
uint8 Bracket = 0;
|
||||
bool Disqualified = false;
|
||||
};
|
||||
|
||||
@@ -213,7 +213,6 @@ void WorldPackets::Mail::MailMarkAsRead::Read()
|
||||
{
|
||||
_worldPacket >> Mailbox;
|
||||
_worldPacket >> MailID;
|
||||
BiReceipt = _worldPacket.ReadBit();
|
||||
}
|
||||
|
||||
void WorldPackets::Mail::MailDelete::Read()
|
||||
|
||||
@@ -159,7 +159,6 @@ namespace WorldPackets
|
||||
|
||||
ObjectGuid Mailbox;
|
||||
int32 MailID = 0;
|
||||
bool BiReceipt = false;
|
||||
};
|
||||
|
||||
class MailDelete final : public ClientPacket
|
||||
|
||||
@@ -469,7 +469,11 @@ void WorldPackets::Movement::CommonMovement::WriteMovementForceWithDirection(Mov
|
||||
data << uint32(movementForce.TransportID);
|
||||
data << float(movementForce.Magnitude);
|
||||
data.WriteBits(movementForce.Type, 2);
|
||||
data.WriteBit(movementForce.Unused910 != 0);
|
||||
data.FlushBits();
|
||||
|
||||
if (movementForce.Unused910)
|
||||
data << int32(movementForce.Unused910);
|
||||
}
|
||||
|
||||
void WorldPackets::Movement::MonsterMove::InitializeSplineData(::Movement::MoveSpline const& moveSpline)
|
||||
@@ -693,6 +697,9 @@ ByteBuffer& operator>>(ByteBuffer& data, MovementForce& movementForce)
|
||||
data >> movementForce.TransportID;
|
||||
data >> movementForce.Magnitude;
|
||||
movementForce.Type = data.ReadBits(2);
|
||||
bool has910 = data.ReadBit();
|
||||
if (has910)
|
||||
data >> movementForce.Unused910;
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,124 @@
|
||||
/*
|
||||
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
|
||||
*
|
||||
* 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; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; 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, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "MythicPlusPacketsCommon.h"
|
||||
|
||||
namespace WorldPackets
|
||||
{
|
||||
namespace MythicPlus
|
||||
{
|
||||
ByteBuffer& operator<<(ByteBuffer& data, DungeonScoreMapSummary const& dungeonScoreMapSummary)
|
||||
{
|
||||
data << int32(dungeonScoreMapSummary.ChallengeModeID);
|
||||
data << int32(dungeonScoreMapSummary.MapScore);
|
||||
data << int32(dungeonScoreMapSummary.BestRunLevel);
|
||||
data << int32(dungeonScoreMapSummary.BestRunDurationMS);
|
||||
data.WriteBit(dungeonScoreMapSummary.FinishedSuccess);
|
||||
data.FlushBits();
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
ByteBuffer& operator<<(ByteBuffer& data, DungeonScoreSummary const& dungeonScoreSummary)
|
||||
{
|
||||
data << int32(dungeonScoreSummary.CurrentSeasonScore);
|
||||
data << uint32(dungeonScoreSummary.Runs.size());
|
||||
for (DungeonScoreMapSummary const& dungeonScoreMapSummary : dungeonScoreSummary.Runs)
|
||||
data << dungeonScoreMapSummary;
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
ByteBuffer& operator<<(ByteBuffer& data, MythicPlusMember const& mythicPlusMember)
|
||||
{
|
||||
data << mythicPlusMember.BnetAccountGUID;
|
||||
data << uint64(mythicPlusMember.GuildClubMemberID);
|
||||
data << mythicPlusMember.GUID;
|
||||
data << mythicPlusMember.GuildGUID;
|
||||
data << uint32(mythicPlusMember.NativeRealmAddress);
|
||||
data << uint32(mythicPlusMember.VirtualRealmAddress);
|
||||
data << int16(mythicPlusMember.ChrSpecializationID);
|
||||
data << int16(mythicPlusMember.RaceID);
|
||||
data << int32(mythicPlusMember.ItemLevel);
|
||||
data << int32(mythicPlusMember.CovenantID);
|
||||
data << int32(mythicPlusMember.SoulbindID);
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
ByteBuffer& operator<<(ByteBuffer& data, MythicPlusRun const& mythicPlusRun)
|
||||
{
|
||||
data << int32(mythicPlusRun.MapChallengeModeID);
|
||||
data << uint32(mythicPlusRun.Level);
|
||||
data << int32(mythicPlusRun.DurationMs);
|
||||
data << mythicPlusRun.StartDate;
|
||||
data << mythicPlusRun.CompletionDate;
|
||||
data << int32(mythicPlusRun.Season);
|
||||
data.append(mythicPlusRun.KeystoneAffixIDs.data(), mythicPlusRun.KeystoneAffixIDs.size());
|
||||
data << uint32(mythicPlusRun.Members.size());
|
||||
data << int32(mythicPlusRun.RunScore);
|
||||
for (MythicPlusMember const& member : mythicPlusRun.Members)
|
||||
data << member;
|
||||
|
||||
data.WriteBit(mythicPlusRun.Completed);
|
||||
data.FlushBits();
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
ByteBuffer& operator<<(ByteBuffer& data, DungeonScoreBestRunForAffix const& dungeonScoreBestRunForAffix)
|
||||
{
|
||||
data << int32(dungeonScoreBestRunForAffix.KeystoneAffixID);
|
||||
data << int32(dungeonScoreBestRunForAffix.Score);
|
||||
data << dungeonScoreBestRunForAffix.Run;
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
ByteBuffer& operator<<(ByteBuffer& data, DungeonScoreMapData const& dungeonScoreMapData)
|
||||
{
|
||||
data << int32(dungeonScoreMapData.MapChallengeModeID);
|
||||
data << uint32(dungeonScoreMapData.BestRuns.size());
|
||||
data << int32(dungeonScoreMapData.OverAllScore);
|
||||
for (DungeonScoreBestRunForAffix const& bestRun : dungeonScoreMapData.BestRuns)
|
||||
data << bestRun;
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
ByteBuffer& operator<<(ByteBuffer& data, DungeonScoreSeasonData const& dungeonScoreSeasonData)
|
||||
{
|
||||
data << int32(dungeonScoreSeasonData.Season);
|
||||
data << uint32(dungeonScoreSeasonData.Maps.size());
|
||||
data << int32(dungeonScoreSeasonData.SeasonScore);
|
||||
for (DungeonScoreMapData const& map : dungeonScoreSeasonData.Maps)
|
||||
data << map;
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
ByteBuffer& operator<<(ByteBuffer& data, DungeonScoreData const& dungeonScoreData)
|
||||
{
|
||||
data << uint32(dungeonScoreData.Seasons.size());
|
||||
data << int32(dungeonScoreData.TotalRuns);
|
||||
for (DungeonScoreSeasonData const& season : dungeonScoreData.Seasons)
|
||||
data << season;
|
||||
|
||||
return data;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
/*
|
||||
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
|
||||
*
|
||||
* 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; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; 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, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef MythicPlusPacketsCommon_h__
|
||||
#define MythicPlusPacketsCommon_h__
|
||||
|
||||
#include "Packet.h"
|
||||
#include "ObjectGuid.h"
|
||||
#include "PacketUtilities.h"
|
||||
|
||||
namespace WorldPackets
|
||||
{
|
||||
namespace MythicPlus
|
||||
{
|
||||
struct DungeonScoreMapSummary
|
||||
{
|
||||
int32 ChallengeModeID = 0;
|
||||
int32 MapScore = 0;
|
||||
int32 BestRunLevel = 0;
|
||||
int32 BestRunDurationMS = 0;
|
||||
bool FinishedSuccess = false;
|
||||
};
|
||||
|
||||
struct DungeonScoreSummary
|
||||
{
|
||||
int32 CurrentSeasonScore = 0;
|
||||
std::vector<DungeonScoreMapSummary> Runs;
|
||||
};
|
||||
|
||||
struct MythicPlusMember
|
||||
{
|
||||
ObjectGuid BnetAccountGUID;
|
||||
uint64 GuildClubMemberID = 0;
|
||||
ObjectGuid GUID;
|
||||
ObjectGuid GuildGUID;
|
||||
uint32 NativeRealmAddress = 0;
|
||||
uint32 VirtualRealmAddress = 0;
|
||||
int16 ChrSpecializationID = 0;
|
||||
int16 RaceID = 0;
|
||||
int32 ItemLevel = 0;
|
||||
int32 CovenantID = 0;
|
||||
int32 SoulbindID = 0;
|
||||
};
|
||||
|
||||
struct MythicPlusRun
|
||||
{
|
||||
int32 MapChallengeModeID = 0;
|
||||
bool Completed = false;
|
||||
uint32 Level = 0;
|
||||
int32 DurationMs = 0;
|
||||
Timestamp<> StartDate;
|
||||
Timestamp<> CompletionDate;
|
||||
int32 Season;
|
||||
std::vector<MythicPlusMember> Members;
|
||||
int32 RunScore;
|
||||
std::array<int32, 4> KeystoneAffixIDs;
|
||||
};
|
||||
|
||||
struct DungeonScoreBestRunForAffix
|
||||
{
|
||||
int32 KeystoneAffixID = 0;
|
||||
MythicPlusRun Run;
|
||||
int32 Score = 0;
|
||||
};
|
||||
|
||||
struct DungeonScoreMapData
|
||||
{
|
||||
int32 MapChallengeModeID = 0;
|
||||
std::vector<DungeonScoreBestRunForAffix> BestRuns;
|
||||
int32 OverAllScore = 0;
|
||||
|
||||
};
|
||||
|
||||
struct DungeonScoreSeasonData
|
||||
{
|
||||
int32 Season = 0;
|
||||
std::vector<DungeonScoreMapData> Maps;
|
||||
int32 SeasonScore = 0;
|
||||
};
|
||||
|
||||
struct DungeonScoreData
|
||||
{
|
||||
std::vector<DungeonScoreSeasonData> Seasons;
|
||||
int32 TotalRuns = 0;
|
||||
};
|
||||
|
||||
ByteBuffer& operator<<(ByteBuffer& data, DungeonScoreSummary const& dungeonScoreSummary);
|
||||
ByteBuffer& operator<<(ByteBuffer& data, DungeonScoreData const& dungeonScoreData);
|
||||
}
|
||||
}
|
||||
|
||||
#endif // MythicPlusPacketsCommon_h__
|
||||
@@ -203,7 +203,7 @@ namespace WorldPackets
|
||||
|
||||
int32 ID = 0;
|
||||
uint32 Flags = 0;
|
||||
TaggedPosition<Position::XY> Pos;
|
||||
TaggedPosition<Position::XYZ> Pos;
|
||||
int32 Icon = 0;
|
||||
int32 Importance = 0;
|
||||
int32 Unknown905 = 0;
|
||||
|
||||
@@ -223,6 +223,8 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::PartyMemberStats c
|
||||
data.WriteBit(memberStats.PetStats.is_initialized());
|
||||
data.FlushBits();
|
||||
|
||||
data << memberStats.DungeonScore;
|
||||
|
||||
if (memberStats.PetStats.is_initialized())
|
||||
data << *memberStats.PetStats;
|
||||
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include "AuthenticationPackets.h"
|
||||
#include "ObjectGuid.h"
|
||||
#include "Group.h"
|
||||
#include "MythicPlusPacketsCommon.h"
|
||||
#include "Optional.h"
|
||||
|
||||
namespace WorldPackets
|
||||
@@ -208,9 +209,11 @@ namespace WorldPackets
|
||||
uint16 SpecID = 0;
|
||||
uint16 WmoGroupID = 0;
|
||||
uint32 WmoDoodadPlacementID = 0;
|
||||
int8 PartyType[2];
|
||||
int8 PartyType[2] = { };
|
||||
|
||||
CTROptions ChromieTime;
|
||||
|
||||
MythicPlus::DungeonScoreSummary DungeonScore;
|
||||
};
|
||||
|
||||
class PartyMemberFullState final : public ServerPacket
|
||||
|
||||
@@ -88,6 +88,7 @@ void WorldPackets::Petition::PetitionBuy::Read()
|
||||
uint32 titleLen = _worldPacket.ReadBits(7);
|
||||
|
||||
_worldPacket >> Unit;
|
||||
_worldPacket >> Unused910;
|
||||
Title = _worldPacket.ReadString(titleLen);
|
||||
}
|
||||
|
||||
|
||||
@@ -101,6 +101,7 @@ namespace WorldPackets
|
||||
|
||||
ObjectGuid Unit;
|
||||
std::string Title;
|
||||
uint32 Unused910 = 0;
|
||||
};
|
||||
|
||||
class PetitionShowSignatures final : public ClientPacket
|
||||
|
||||
@@ -80,6 +80,7 @@ WorldPacket const* WorldPackets::Query::QueryCreatureResponse::Write()
|
||||
_worldPacket << int32(Stats.RequiredExpansion);
|
||||
_worldPacket << int32(Stats.VignetteID);
|
||||
_worldPacket << int32(Stats.Class);
|
||||
_worldPacket << int32(Stats.CreatureDifficultyID);
|
||||
_worldPacket << int32(Stats.WidgetSetID);
|
||||
_worldPacket << int32(Stats.WidgetSetUnitConditionID);
|
||||
|
||||
|
||||
@@ -83,6 +83,7 @@ namespace WorldPackets
|
||||
uint32 RequiredExpansion = 0;
|
||||
uint32 VignetteID = 0;
|
||||
int32 Class = 0;
|
||||
int32 CreatureDifficultyID = 0;
|
||||
int32 WidgetSetID = 0;
|
||||
int32 WidgetSetUnitConditionID = 0;
|
||||
std::array<uint32, 2> Flags;
|
||||
|
||||
@@ -128,6 +128,7 @@ WorldPacket const* QueryQuestInfoResponse::Write()
|
||||
|
||||
_worldPacket << int32(Info.PortraitGiver);
|
||||
_worldPacket << int32(Info.PortraitGiverMount);
|
||||
_worldPacket << int32(Info.PortraitGiverModelSceneID);
|
||||
_worldPacket << int32(Info.PortraitTurnIn);
|
||||
|
||||
for (uint32 i = 0; i < QUEST_REWARD_REPUTATIONS_COUNT; ++i)
|
||||
@@ -337,6 +338,7 @@ WorldPacket const* QuestGiverOfferRewardMessage::Write()
|
||||
_worldPacket << int32(QuestPackageID);
|
||||
_worldPacket << int32(PortraitGiver);
|
||||
_worldPacket << int32(PortraitGiverMount);
|
||||
_worldPacket << int32(PortraitGiverModelSceneID);
|
||||
_worldPacket << int32(PortraitTurnIn);
|
||||
|
||||
_worldPacket.WriteBits(QuestTitle.size(), 9);
|
||||
@@ -401,6 +403,7 @@ WorldPacket const* QuestGiverQuestDetails::Write()
|
||||
_worldPacket << int32(QuestPackageID);
|
||||
_worldPacket << int32(PortraitGiver);
|
||||
_worldPacket << int32(PortraitGiverMount);
|
||||
_worldPacket << int32(PortraitGiverModelSceneID);
|
||||
_worldPacket << int32(PortraitTurnIn);
|
||||
_worldPacket << uint32(QuestFlags[0]); // Flags
|
||||
_worldPacket << uint32(QuestFlags[1]); // FlagsEx
|
||||
@@ -733,6 +736,7 @@ WorldPacket const* DisplayPlayerChoice::Write()
|
||||
_worldPacket << SenderGUID;
|
||||
_worldPacket << int32(UiTextureKitID);
|
||||
_worldPacket << uint32(SoundKitID);
|
||||
_worldPacket << uint8(NumRerolls);
|
||||
_worldPacket.WriteBits(Question.length(), 8);
|
||||
_worldPacket.WriteBit(CloseChoiceFrame);
|
||||
_worldPacket.WriteBit(HideWarboardHeader);
|
||||
@@ -750,6 +754,7 @@ void ChoiceResponse::Read()
|
||||
{
|
||||
_worldPacket >> ChoiceID;
|
||||
_worldPacket >> ResponseID;
|
||||
IsReroll = _worldPacket.ReadBit();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -155,6 +155,7 @@ namespace WorldPackets
|
||||
int32 RewardNumSkillUps = 0; // reward skill points
|
||||
int32 PortraitGiver = 0; // quest giver entry ?
|
||||
int32 PortraitGiverMount = 0;
|
||||
int32 PortraitGiverModelSceneID = 0;
|
||||
int32 PortraitTurnIn = 0; // quest turn in entry ?
|
||||
std::string PortraitGiverText;
|
||||
std::string PortraitGiverName;
|
||||
@@ -299,6 +300,7 @@ namespace WorldPackets
|
||||
int32 PortraitTurnIn = 0;
|
||||
int32 PortraitGiver = 0;
|
||||
int32 PortraitGiverMount = 0;
|
||||
int32 PortraitGiverModelSceneID = 0;
|
||||
std::string QuestTitle;
|
||||
std::string RewardText;
|
||||
std::string PortraitGiverText;
|
||||
@@ -390,6 +392,7 @@ namespace WorldPackets
|
||||
int32 PortraitTurnIn = 0;
|
||||
int32 PortraitGiver = 0;
|
||||
int32 PortraitGiverMount = 0;
|
||||
int32 PortraitGiverModelSceneID = 0;
|
||||
int32 QuestStartItemID = 0;
|
||||
int32 QuestSessionBonus = 0;
|
||||
std::string PortraitGiverText;
|
||||
@@ -714,6 +717,7 @@ namespace WorldPackets
|
||||
int32 ChoiceID = 0;
|
||||
int32 UiTextureKitID = 0;
|
||||
uint32 SoundKitID = 0;
|
||||
uint8 NumRerolls = 0;
|
||||
std::string Question;
|
||||
std::vector<PlayerChoiceResponse> Responses;
|
||||
bool CloseChoiceFrame = false;
|
||||
@@ -730,6 +734,7 @@ namespace WorldPackets
|
||||
|
||||
int32 ChoiceID = 0;
|
||||
int32 ResponseID = 0;
|
||||
bool IsReroll = false;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -209,7 +209,6 @@ ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Spells::SpellOptionalReag
|
||||
{
|
||||
data >> optionalReagent.ItemID;
|
||||
data >> optionalReagent.Slot;
|
||||
data >> optionalReagent.Count;
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
@@ -244,7 +244,6 @@ namespace WorldPackets
|
||||
{
|
||||
int32 ItemID = 0;
|
||||
int32 Slot = 0;
|
||||
int32 Count = 0;
|
||||
};
|
||||
|
||||
struct SpellExtraCurrencyCost
|
||||
|
||||
@@ -150,6 +150,15 @@ WorldPacket const* FeatureSystemStatus::Write()
|
||||
return &_worldPacket;
|
||||
}
|
||||
|
||||
WorldPacket const* FeatureSystemStatus2::Write()
|
||||
{
|
||||
_worldPacket.WriteBit(TextToSpeechFeatureEnabled);
|
||||
_worldPacket.FlushBits();
|
||||
|
||||
return &_worldPacket;
|
||||
}
|
||||
|
||||
|
||||
WorldPacket const* FeatureSystemStatusGlueScreen::Write()
|
||||
{
|
||||
_worldPacket.WriteBit(BpayStoreEnabled);
|
||||
|
||||
@@ -98,7 +98,7 @@ namespace WorldPackets
|
||||
uint32 DaysInCycle = 0;
|
||||
};
|
||||
|
||||
FeatureSystemStatus() : ServerPacket(SMSG_FEATURE_SYSTEM_STATUS, 48) { }
|
||||
FeatureSystemStatus() : ServerPacket(SMSG_FEATURE_SYSTEM_STATUS, 200) { }
|
||||
|
||||
WorldPacket const* Write() override;
|
||||
|
||||
@@ -152,10 +152,20 @@ namespace WorldPackets
|
||||
RafSystemFeatureInfo RAFSystem;
|
||||
};
|
||||
|
||||
class FeatureSystemStatus2 final : ServerPacket
|
||||
{
|
||||
public:
|
||||
FeatureSystemStatus2() : ServerPacket(SMSG_FEATURE_SYSTEM_STATUS2, 1) { }
|
||||
|
||||
WorldPacket const* Write() override;
|
||||
|
||||
bool TextToSpeechFeatureEnabled = false;
|
||||
};
|
||||
|
||||
class FeatureSystemStatusGlueScreen final : public ServerPacket
|
||||
{
|
||||
public:
|
||||
FeatureSystemStatusGlueScreen() : ServerPacket(SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN, 1) { }
|
||||
FeatureSystemStatusGlueScreen() : ServerPacket(SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN, 64) { }
|
||||
|
||||
WorldPacket const* Write() override;
|
||||
|
||||
|
||||
@@ -250,6 +250,17 @@ ByteBuffer& operator>>(ByteBuffer& data, Optional<WorldPackets::Ticket::SupportT
|
||||
return data;
|
||||
}
|
||||
|
||||
ByteBuffer& operator>>(ByteBuffer& data, Optional<WorldPackets::Ticket::SupportTicketSubmitComplaint::SupportTicketUnused910>& unused)
|
||||
{
|
||||
unused = boost::in_place();
|
||||
|
||||
uint32 field_0Length = data.ReadBits(7);
|
||||
data >> unused->field_104;
|
||||
unused->field_0 = data.ReadString(field_0Length);
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
void WorldPackets::Ticket::SupportTicketSubmitComplaint::Read()
|
||||
{
|
||||
_worldPacket >> Header;
|
||||
@@ -266,6 +277,7 @@ void WorldPackets::Ticket::SupportTicketSubmitComplaint::Read()
|
||||
bool hasLFGListApplicant = _worldPacket.ReadBit();
|
||||
bool hasClubMessage = _worldPacket.ReadBit();
|
||||
bool hasClubFinderResult = _worldPacket.ReadBit();
|
||||
bool hasUnk910 = _worldPacket.ReadBit();
|
||||
|
||||
_worldPacket.ResetBitPos();
|
||||
|
||||
@@ -300,6 +312,9 @@ void WorldPackets::Ticket::SupportTicketSubmitComplaint::Read()
|
||||
|
||||
if (hasClubFinderResult)
|
||||
_worldPacket >> ClubFinderResult;
|
||||
|
||||
if (hasUnk910)
|
||||
_worldPacket >> Unused910;
|
||||
}
|
||||
|
||||
ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Ticket::Complaint::ComplaintOffender& complaintOffender)
|
||||
|
||||
@@ -89,7 +89,7 @@ namespace WorldPackets
|
||||
|
||||
void Read() override;
|
||||
|
||||
int32 CaseID;
|
||||
int32 CaseID = 0;
|
||||
};
|
||||
|
||||
class SubmitUserFeedback final : public ClientPacket
|
||||
@@ -156,8 +156,8 @@ namespace WorldPackets
|
||||
|
||||
struct SupportTicketCalendarEventInfo
|
||||
{
|
||||
uint64 EventID;
|
||||
uint64 InviteID;
|
||||
uint64 EventID = 0;
|
||||
uint64 InviteID = 0;
|
||||
std::string EventTitle;
|
||||
};
|
||||
|
||||
@@ -200,12 +200,18 @@ namespace WorldPackets
|
||||
|
||||
struct SupportTicketClubFinderResult
|
||||
{
|
||||
uint64 ClubFinderPostingID;
|
||||
uint64 ClubID;
|
||||
uint64 ClubFinderPostingID = 0;
|
||||
uint64 ClubID = 0;
|
||||
ObjectGuid ClubFinderGUID;
|
||||
std::string ClubName;
|
||||
};
|
||||
|
||||
struct SupportTicketUnused910
|
||||
{
|
||||
std::string field_0;
|
||||
ObjectGuid field_104;
|
||||
};
|
||||
|
||||
SupportTicketSubmitComplaint(WorldPacket&& packet) : ClientPacket(CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT, std::move(packet)) { }
|
||||
|
||||
void Read() override;
|
||||
@@ -224,6 +230,7 @@ namespace WorldPackets
|
||||
Optional<SupportTicketLFGListApplicant> LFGListApplicant;
|
||||
Optional<SupportTicketCommunityMessage> CommunityMessage;
|
||||
Optional<SupportTicketClubFinderResult> ClubFinderResult;
|
||||
Optional<SupportTicketUnused910> Unused910;
|
||||
};
|
||||
|
||||
class Complaint final : public ClientPacket
|
||||
|
||||
@@ -627,7 +627,6 @@ void OpcodeTable::Initialize()
|
||||
DEFINE_HANDLER(CMSG_MOVE_UPDATE_FALL_SPEED, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes);
|
||||
DEFINE_HANDLER(CMSG_MOVE_WATER_WALK_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage);
|
||||
DEFINE_HANDLER(CMSG_MYTHIC_PLUS_REQUEST_MAP_STATS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
|
||||
DEFINE_HANDLER(CMSG_MYTHIC_PLUS_WEEKLY_REWARD_REQUEST, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
|
||||
DEFINE_HANDLER(CMSG_NEUTRAL_PLAYER_SELECT_FACTION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
|
||||
DEFINE_HANDLER(CMSG_NEXT_CINEMATIC_CAMERA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleNextCinematicCamera);
|
||||
DEFINE_HANDLER(CMSG_OBJECT_UPDATE_FAILED, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleObjectUpdateFailedOpcode);
|
||||
@@ -883,7 +882,6 @@ void OpcodeTable::Initialize()
|
||||
DEFINE_HANDLER(CMSG_TWITTER_CHECK_STATUS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
|
||||
DEFINE_HANDLER(CMSG_TWITTER_CONNECT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
|
||||
DEFINE_HANDLER(CMSG_TWITTER_DISCONNECT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
|
||||
DEFINE_HANDLER(CMSG_TWITTER_POST, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
|
||||
DEFINE_HANDLER(CMSG_UI_MAP_QUEST_LINES_REQUEST, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
|
||||
DEFINE_HANDLER(CMSG_UNACCEPT_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUnacceptTradeOpcode);
|
||||
DEFINE_HANDLER(CMSG_UNDELETE_CHARACTER, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleCharUndeleteOpcode);
|
||||
@@ -908,6 +906,7 @@ void OpcodeTable::Initialize()
|
||||
DEFINE_HANDLER(CMSG_VAS_GET_QUEUE_MINUTES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
|
||||
DEFINE_HANDLER(CMSG_VAS_GET_SERVICE_STATUS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
|
||||
DEFINE_HANDLER(CMSG_VIOLENCE_LEVEL, STATUS_AUTHED, PROCESS_INPLACE, &WorldSession::HandleViolenceLevel);
|
||||
DEFINE_HANDLER(CMSG_VOICE_CHANNEL_STT_TOKEN_REQUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
|
||||
DEFINE_HANDLER(CMSG_VOICE_CHAT_JOIN_CHANNEL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
|
||||
DEFINE_HANDLER(CMSG_VOICE_CHAT_LOGIN, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
|
||||
DEFINE_HANDLER(CMSG_VOID_STORAGE_TRANSFER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleVoidStorageTransfer);
|
||||
@@ -1042,8 +1041,6 @@ void OpcodeTable::Initialize()
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_START_DISTRIBUTION_ASSIGN_TO_TARGET_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_START_PURCHASE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_VALIDATE_PURCHASE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_VAS_GUILD_FOLLOW_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_VAS_GUILD_MASTER_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PETS_HEALED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_CAGE_DATE_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_DELETED, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
@@ -1054,7 +1051,6 @@ void OpcodeTable::Initialize()
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_LICENSE_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_RESTORED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_REVOKED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_SET_MAX_PETS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_TRAP_LEVEL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_UPDATES, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BINDER_CONFIRM, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
@@ -1223,6 +1219,7 @@ void OpcodeTable::Initialize()
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_PLAYER_CHOICE, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_PROMOTION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_QUEST_POPUP, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_SOULBIND_UPDATE_MESSAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_TOAST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_WORLD_TEXT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DONT_AUTO_PUSH_SPELLS_TO_ACTION_BAR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
@@ -1254,6 +1251,7 @@ void OpcodeTable::Initialize()
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_FAILED_QUEST_TURN_IN, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_FEATURE_SYSTEM_STATUS, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_FEATURE_SYSTEM_STATUS2, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_FEIGN_DEATH_RESISTED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_FISH_ESCAPED, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_FISH_NOT_HOOKED, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
@@ -1280,6 +1278,7 @@ void OpcodeTable::Initialize()
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_ADD_EVENT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_ADD_FOLLOWER_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_ADD_MISSION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_ADD_SPEC_GROUPS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_APPLY_TALENT_SOCKET_DATA_CHANGES, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_AUTO_TROOP_MIN_LEVEL_UPDATE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
|
||||
@@ -1289,6 +1288,7 @@ void OpcodeTable::Initialize()
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_CHANGE_MISSION_START_TIME_RESULT,STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_CLEAR_COLLECTION, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_CLEAR_EVENT_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_CLEAR_SPEC_GROUPS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_COLLECTION_REMOVE_ENTRY, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_COLLECTION_UPDATE_ENTRY, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_COMPLETE_BUILDING_CONSTRUCTION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
|
||||
@@ -1641,10 +1641,8 @@ void OpcodeTable::Initialize()
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MULTI_FLOOR_NEW_FLOOR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MYTHIC_PLUS_ALL_MAP_STATS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MYTHIC_PLUS_CURRENT_AFFIXES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MYTHIC_PLUS_NEW_SEASON_RECORD, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MYTHIC_PLUS_NEW_WEEK_RECORD, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MYTHIC_PLUS_SEASON_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MYTHIC_PLUS_WEEKLY_REWARD_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_NEUTRAL_PLAYER_FACTION_SELECT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_NEW_TAXI_PATH, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_NEW_WORLD, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
@@ -1724,6 +1722,7 @@ void OpcodeTable::Initialize()
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_IS_ADVENTURE_MAP_POI_VALID, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_OPEN_SUBSCRIPTION_INTERSTITIAL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_SAVE_GUILD_EMBLEM, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_SHOW_UI_EVENT_TOAST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_SKINNED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_TABARD_VENDOR_ACTIVATE, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_TUTORIAL_HIGHLIGHT_SPELL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
@@ -1756,6 +1755,7 @@ void OpcodeTable::Initialize()
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_CREATURE_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_GAME_OBJECT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_GARRISON_PET_NAME_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_GUILD_FOLLOW_INFO_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_GUILD_INFO_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_ITEM_TEXT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_NPC_TEXT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
|
||||
@@ -1765,6 +1765,7 @@ void OpcodeTable::Initialize()
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_PLAYER_NAME_BY_COMMUNITY_ID_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_PLAYER_NAME_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_QUEST_INFO_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_REALM_GUILD_MASTER_INFO_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_TIME_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_COMPLETION_NPC_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_CONFIRM_ACCEPT, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
@@ -1779,6 +1780,7 @@ void OpcodeTable::Initialize()
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_STATUS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_STATUS_MULTIPLE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_LOG_FULL, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_NON_LOG_UPDATE_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_POI_QUERY_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_POI_UPDATE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_PUSH_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
@@ -1790,7 +1792,6 @@ void OpcodeTable::Initialize()
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UPDATE_ADD_CREDIT_SIMPLE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UPDATE_ADD_PVP_CREDIT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UPDATE_COMPLETE, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UPDATE_COMPLETE_BY_SPELL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UPDATE_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UPDATE_FAILED_TIMER, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEUE_SUMMARY_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
@@ -2021,6 +2022,7 @@ void OpcodeTable::Initialize()
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_VENDOR_INVENTORY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_VIGNETTE_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOICE_CHANNEL_INFO_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOICE_CHANNEL_STT_TOKEN_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOICE_LOGIN_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_ITEM_SWAP_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_STORAGE_CONTENTS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
|
||||
|
||||
+1037
-1035
File diff suppressed because it is too large
Load Diff
@@ -1506,10 +1506,10 @@ class TC_GAME_API WorldSession
|
||||
void HandleChatMessageOpcode(WorldPackets::Chat::ChatMessage& chatMessage);
|
||||
void HandleChatMessageWhisperOpcode(WorldPackets::Chat::ChatMessageWhisper& chatMessageWhisper);
|
||||
void HandleChatMessageChannelOpcode(WorldPackets::Chat::ChatMessageChannel& chatMessageChannel);
|
||||
void HandleChatMessage(ChatMsg type, Language lang, std::string msg, std::string target = "");
|
||||
void HandleChatMessage(ChatMsg type, Language lang, std::string msg, std::string target = "", Optional<ObjectGuid> channelGuid = {});
|
||||
void HandleChatAddonMessageOpcode(WorldPackets::Chat::ChatAddonMessage& chatAddonMessage);
|
||||
void HandleChatAddonMessageTargetedOpcode(WorldPackets::Chat::ChatAddonMessageTargeted& chatAddonMessageTargeted);
|
||||
void HandleChatAddonMessage(ChatMsg type, std::string prefix, std::string text, bool isLogged, std::string target = "");
|
||||
void HandleChatAddonMessage(ChatMsg type, std::string prefix, std::string text, bool isLogged, std::string target = "", Optional<ObjectGuid> channelGuid = {});
|
||||
void HandleChatMessageAFKOpcode(WorldPackets::Chat::ChatMessageAFK& chatMessageAFK);
|
||||
void HandleChatMessageDNDOpcode(WorldPackets::Chat::ChatMessageDND& chatMessageDND);
|
||||
void HandleChatMessageEmoteOpcode(WorldPackets::Chat::ChatMessageEmote& chatMessageEmote);
|
||||
|
||||
Reference in New Issue
Block a user