Core/PacketIO: 9.1.0 opcodes and packet structures

This commit is contained in:
Shauren
2021-08-08 00:18:05 +02:00
parent 07f51437fc
commit cd5357dc18
64 changed files with 1814 additions and 1327 deletions
@@ -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
+2
View File
@@ -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;
+25 -1
View File
@@ -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;
}
+1
View File
@@ -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];
+5
View File
@@ -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
+39 -35
View File
@@ -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)
+12 -6
View File
@@ -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;
}
+28 -26
View File
@@ -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)
+2
View File
@@ -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;
}
+9 -2
View File
@@ -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__
+1 -1
View File
@@ -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);
+12 -2
View File
@@ -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)
+12 -5
View File
@@ -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
+10 -8
View File
@@ -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);
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -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);