Core/PacketIO: 9.1.0 opcodes and packet structures

Port From (https://github.com/TrinityCore/TrinityCore/commit/cd5357dc185f95c6ef78089c5ab8bd2b885dd89f)
This commit is contained in:
hondacrx
2021-08-08 13:10:49 -04:00
parent 5dd83ff0cd
commit 491ec3333c
39 changed files with 1720 additions and 1342 deletions
@@ -416,6 +416,11 @@ namespace Framework.Constants
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,
}
public enum CriteriaFailEvent : byte
File diff suppressed because it is too large Load Diff
@@ -76,7 +76,7 @@ namespace Framework.Database
PrepareStatement(WorldStatements.SEL_WAYPOINT_SCRIPT_ID_BY_GUID, "SELECT id FROM waypoint_scripts WHERE guid = ?");
PrepareStatement(WorldStatements.DEL_CREATURE, "DELETE FROM creature WHERE guid = ?");
PrepareStatement(WorldStatements.SEL_COMMANDS, "SELECT name, permission, help FROM command");
PrepareStatement(WorldStatements.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 = ?");
PrepareStatement(WorldStatements.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 = ?");
PrepareStatement(WorldStatements.SEL_WAYPOINT_SCRIPT_BY_ID, "SELECT guid, delay, command, datalong, datalong2, dataint, x, y, z, o FROM waypoint_scripts WHERE id = ?");
PrepareStatement(WorldStatements.SEL_CREATURE_BY_ID, "SELECT guid FROM creature WHERE id = ?");
PrepareStatement(WorldStatements.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_");
@@ -3441,6 +3441,67 @@ namespace Game.Achievements
case ModifierTreeType.PlayerMythicPlusRatingEqualOrGreaterThan: // 321 NYI
case ModifierTreeType.PlayerMythicPlusRunCountInCurrentExpansionEqualOrGreaterThan: // 322 NYI
return false;
case ModifierTreeType.PlayerHasCustomizationChoice: // 323
{
int customizationChoiceIndex = referencePlayer.m_playerData.Customizations.FindIndexIf(choice =>
{
return choice.ChrCustomizationChoiceID == reqValue;
});
if (customizationChoiceIndex < 0)
return false;
break;
}
case ModifierTreeType.PlayerBestWeeklyWinPvpTier: // 324
{
var pvpTier = CliDB.PvpTierStorage.LookupByKey(reqValue);
if (pvpTier == null)
return false;
if (pvpTier.BracketID >= referencePlayer.m_activePlayerData.PvpInfo.GetSize())
return false;
var 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.GetSize())
return false;
var pvpInfo = referencePlayer.m_activePlayerData.PvpInfo[secondaryAsset];
var pvpTier = CliDB.PvpTierStorage.LookupByKey(pvpInfo.WeeklyBestWinPvpTierID);
if (pvpTier == null)
return false;
if (pvpTier.Rank < reqValue)
return false;
break;
}
case ModifierTreeType.PlayerHasVanillaCollectorsEdition: // 326
return false;
case ModifierTreeType.PlayerHasItemWithKeystoneLevelModifierEqualOrGreaterThan: // 327
{
bool bagScanReachedEnd = referencePlayer.ForEachItem(ItemSearchLocation.Inventory, item =>
{
if (item.GetEntry() != reqValue)
return true;
if (item.GetModifier(ItemModifier.ChallengeKeystoneLevel) < secondaryAsset)
return true;
return false;
});
if (bagScanReachedEnd)
return false;
break;
}
default:
return false;
}
@@ -1724,6 +1724,10 @@ namespace Game
// SMSG_AUCTION_LIST_BIDDER_ITEMS_RESULT, SMSG_AUCTION_LIST_OWNER_ITEMS_RESULT, SMSG_AUCTION_REPLICATE_RESPONSE (if commodity)
if (sendKey)
auctionItem.AuctionBucketKey.Set(new AuctionBucketKey(AuctionsBucketKey.ForItem(Items[0])));
// all
if (!Items[0].m_itemData.Creator._value.IsEmpty())
auctionItem.Creator.Set(Items[0].m_itemData.Creator);
}
public static ulong CalculateMinIncrement(ulong bidAmount)
+3 -2
View File
@@ -658,7 +658,7 @@ namespace Game.Chat
return;
}
SendToAll(new ChannelSayBuilder(this, lang, what, guid), !playerInfo.IsModerator() ? guid : ObjectGuid.Empty);
SendToAll(new ChannelSayBuilder(this, lang, what, guid, _channelGuid), !playerInfo.IsModerator() ? guid : ObjectGuid.Empty);
}
public void AddonSay(ObjectGuid guid, string prefix, string what, bool isLogged)
@@ -883,9 +883,10 @@ namespace Game.Chat
}
public uint GetChannelId() { return _channelId; }
public ObjectGuid GetChannelGuid() { return _channelGuid; }
public bool IsConstant() { return _channelId != 0; }
public ObjectGuid GetGUID() { return _channelGuid; }
public bool IsLFG() { return GetFlags().HasAnyFlag(ChannelFlags.Lfg); }
bool IsAnnounce() { return _announceEnabled; }
void SetAnnounce(bool nannounce) { _announceEnabled = nannounce; }
@@ -73,7 +73,7 @@ namespace Game.Chat
//notify.InstanceID = 0;
notify.Data.ChannelFlags = _source.GetFlags();
notify.Data.Channel = _source.GetName(localeIdx);
notify.Data.ChannelGUID = _source.GetChannelGuid();
notify.Data.ChannelGUID = _source.GetGUID();
return notify;
}
@@ -105,12 +105,13 @@ namespace Game.Chat
class ChannelSayBuilder : MessageBuilder
{
public ChannelSayBuilder(Channel source, Language lang, string what, ObjectGuid guid)
public ChannelSayBuilder(Channel source, Language lang, string what, ObjectGuid guid, ObjectGuid channelGuid)
{
_source = source;
_lang = lang;
_what = what;
_guid = guid;
_channelGuid = channelGuid;
}
public override PacketSenderOwning<ChatPkt> Invoke(Locale locale = Locale.enUS)
@@ -128,6 +129,8 @@ namespace Game.Chat
packet.Data.TargetGUID = _guid;
}
packet.Data.ChannelGUID.Set(_channelGuid);
return packet;
}
@@ -135,6 +138,7 @@ namespace Game.Chat
Language _lang;
string _what;
ObjectGuid _guid;
ObjectGuid _channelGuid;
}
class ChannelWhisperBuilder : MessageBuilder
@@ -58,6 +58,15 @@ namespace Game.Chat
return null;
}
public static Channel GetChannelForPlayerByGuid(ObjectGuid channelGuid, Player playerSearcher)
{
foreach (Channel channel in playerSearcher.GetJoinedChannels())
if (channel.GetGUID() == channelGuid)
return channel;
return null;
}
public Channel GetJoinChannel(uint channelId, string name, AreaTableRecord zoneEntry = null)
{
if (channelId != 0) // builtin
+10 -6
View File
@@ -1334,16 +1334,20 @@ namespace Game.Entities
CreatureTemplate cInfo = GetCreatureTemplate();
// level
var levels = cInfo.GetMinMaxLevel();
int minlevel = Math.Min(levels[0], levels[1]);
int maxlevel = Math.Max(levels[0], levels[1]);
var minMaxLevels = cInfo.GetMinMaxLevel();
int minlevel = Math.Min(minMaxLevels[0], minMaxLevels[1]);
int maxlevel = Math.Max(minMaxLevels[0], minMaxLevels[1]);
int level = (minlevel == maxlevel ? minlevel : RandomHelper.IRand(minlevel, maxlevel));
SetLevel((uint)level);
CreatureLevelScaling scaling = cInfo.GetLevelScaling(GetMap().GetDifficultyID());
SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ScalingLevelMin), scaling.MinLevel);
SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ScalingLevelMax), scaling.MaxLevel);
var levels = Global.DB2Mgr.GetContentTuningData(scaling.ContentTuningID, 0);
if (levels != null)
{
SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ScalingLevelMin), levels.Value.MinLevel);
SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ScalingLevelMax), levels.Value.MaxLevel);
}
int mindelta = Math.Min(scaling.DeltaLevelMax, scaling.DeltaLevelMin);
int maxdelta = Math.Max(scaling.DeltaLevelMax, scaling.DeltaLevelMin);
@@ -2483,7 +2487,7 @@ namespace Game.Entities
CreatureTemplate cinfo = GetCreatureTemplate();
CreatureLevelScaling scaling = cinfo.GetLevelScaling(GetMap().GetDifficultyID());
return (scaling.MinLevel != 0 && scaling.MaxLevel != 0);
return scaling.ContentTuningID != 0;
}
ulong GetMaxHealthByLevel(uint level)
@@ -85,6 +85,7 @@ namespace Game.Entities
public float ModExperience;
public bool RacialLeader;
public uint MovementId;
public int CreatureDifficultyID;
public int WidgetSetID;
public int WidgetSetUnitConditionID;
public bool RegenHealth;
@@ -266,6 +267,7 @@ namespace Game.Entities
stats.HealthScalingExpansion = HealthScalingExpansion;
stats.VignetteID = VignetteID;
stats.Class = (int)UnitClass;
stats.CreatureDifficultyID = CreatureDifficultyID;
stats.WidgetSetID = WidgetSetID;
stats.WidgetSetUnitConditionID = WidgetSetUnitConditionID;
@@ -454,8 +456,6 @@ namespace Game.Entities
public class CreatureLevelScaling
{
public ushort MinLevel;
public ushort MaxLevel;
public short DeltaLevelMin;
public short DeltaLevelMax;
public uint ContentTuningID;
+3 -1
View File
@@ -431,6 +431,7 @@ namespace Game.Misc
packet.QuestID = quest.Id;
packet.PortraitGiver = quest.QuestGiverPortrait;
packet.PortraitGiverMount = quest.QuestGiverPortraitMount;
packet.PortraitGiverModelSceneID = quest.QuestGiverPortraitModelSceneId;
packet.PortraitTurnIn = quest.QuestTurnInPortrait;
packet.QuestSessionBonus = 0; //quest.GetQuestSessionBonus(); // this is only sent while quest session is active
packet.AutoLaunched = autoLaunched;
@@ -558,6 +559,7 @@ namespace Game.Misc
packet.PortraitTurnIn = quest.QuestTurnInPortrait;
packet.PortraitGiver = quest.QuestGiverPortrait;
packet.PortraitGiverMount = quest.QuestGiverPortraitMount;
packet.PortraitGiverModelSceneID = quest.QuestGiverPortraitModelSceneId;
packet.QuestPackageID = quest.PackageID;
packet.QuestData = offer;
@@ -768,7 +770,7 @@ namespace Game.Misc
public class PointOfInterest
{
public uint Id;
public Vector2 Pos;
public Vector3 Pos;
public uint Icon;
public uint Flags;
public uint Importance;
+184 -174
View File
@@ -20,6 +20,7 @@ using Framework.Dynamic;
using Framework.GameMath;
using Game.DataStorage;
using Game.Networking;
using Game.Networking.Packets;
using Game.Spells;
using System;
using System.Collections.Generic;
@@ -1219,21 +1220,22 @@ namespace Game.Entities
public UpdateField<ObjectGuid> GuildGUID = new(96, 116);
public UpdateField<ObjectGuid> SkinningOwnerGUID = new(96, 117);
public UpdateField<uint> SilencedSchoolMask = new(96, 118);
public UpdateFieldArray<uint> NpcFlags = new(2, 119, 120);
public UpdateFieldArray<int> Power = new(6, 122, 123);
public UpdateFieldArray<uint> MaxPower = new(6, 122, 129);
public UpdateFieldArray<float> PowerRegenFlatModifier = new(6, 122, 135);
public UpdateFieldArray<float> PowerRegenInterruptedFlatModifier = new(6, 122, 141);
public UpdateFieldArray<VisibleItem> VirtualItems = new(3, 147, 148);
public UpdateFieldArray<uint> AttackRoundBaseTime = new(2, 151, 152);
public UpdateFieldArray<int> Stats = new(4, 154, 155);
public UpdateFieldArray<int> StatPosBuff = new(4, 154, 159);
public UpdateFieldArray<int> StatNegBuff = new(4, 154, 163);
public UpdateFieldArray<int> Resistances = new(7, 167, 168);
public UpdateFieldArray<int> BonusResistanceMods = new(7, 167, 175);
public UpdateFieldArray<int> ManaCostModifier = new(7, 167, 182);
public UpdateField<ObjectGuid> NameplateAttachToGUID = new(96, 119); // When set, nameplate of this unit will instead appear on that object
public UpdateFieldArray<uint> NpcFlags = new(2, 120, 121);
public UpdateFieldArray<int> Power = new(6, 123, 124);
public UpdateFieldArray<uint> MaxPower = new(6, 123, 130);
public UpdateFieldArray<float> PowerRegenFlatModifier = new(6, 123, 136);
public UpdateFieldArray<float> PowerRegenInterruptedFlatModifier = new(6, 123, 142);
public UpdateFieldArray<VisibleItem> VirtualItems = new(3, 148, 149);
public UpdateFieldArray<uint> AttackRoundBaseTime = new(2, 152, 153);
public UpdateFieldArray<int> Stats = new(4, 155, 156);
public UpdateFieldArray<int> StatPosBuff = new(4, 155, 160);
public UpdateFieldArray<int> StatNegBuff = new(4, 155, 164);
public UpdateFieldArray<int> Resistances = new(7, 168, 169);
public UpdateFieldArray<int> BonusResistanceMods = new(7, 168, 176);
public UpdateFieldArray<int> ManaCostModifier = new(7, 168, 183);
public UnitData() : base(0, TypeId.Unit, 189) { }
public UnitData() : base(0, TypeId.Unit, 190) { }
public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Unit owner, Player receiver)
{
@@ -1413,6 +1415,7 @@ namespace Game.Entities
data.WriteInt32(ChannelObjects.Size());
data.WritePackedGuid(SkinningOwnerGUID);
data.WriteUInt32(SilencedSchoolMask);
data.WritePackedGuid(NameplateAttachToGUID);
for (int i = 0; i < PassiveSpells.Size(); ++i)
PassiveSpells[i].WriteCreate(data, owner, receiver);
@@ -1426,7 +1429,7 @@ namespace Game.Entities
public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Unit owner, Player receiver)
{
UpdateMask allowedMaskForTarget = new(192, new uint[] { 0xFFFFDFFFu, 0xE1FF7FFFu, 0x001EFFFFu, 0xFFFFFF81u, 0x03F8007Fu, 0x00000000u });
UpdateMask allowedMaskForTarget = new(192, new uint[] { 0xFFFFDFFFu, 0xE1FF7FFFu, 0x001EFFFFu, 0xFFFFFF81u, 0x07F000FFu, 0x00000000u });
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver);
}
@@ -1434,16 +1437,16 @@ namespace Game.Entities
public void AppendAllowedFieldsMaskForFlag(UpdateMask allowedMaskForTarget, UpdateFieldFlag fieldVisibilityFlags)
{
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner))
allowedMaskForTarget.OR(new UpdateMask(192, new uint[] { 0x00002000u, 0x1E008000u, 0xFFE10000u, 0x0400007Eu, 0xFC07FF80u, 0x1FFFFFFFu }));
allowedMaskForTarget.OR(new UpdateMask(190, new uint[] { 0x00002000u, 0x1E008000u, 0xFFE10000u, 0x0800007Eu, 0xF80FFF00u, 0x3FFFFFFFu }));
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.UnitAll))
allowedMaskForTarget.OR(new UpdateMask(192, new uint[] { 0x00000000u, 0x00000000u, 0x00000000u, 0x04000000u, 0x0007FF80u, 0x00000000u }));
allowedMaskForTarget.OR(new UpdateMask(190, new uint[] { 0x00000000u, 0x00000000u, 0x00000000u, 0x08000000u, 0x000FFF00u, 0x00000000u }));
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Empath))
allowedMaskForTarget.OR(new UpdateMask(192, new uint[] { 0x00000000u, 0x1E000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00007F80u }));
allowedMaskForTarget.OR(new UpdateMask(190, new uint[] { 0x00000000u, 0x1E000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x0000FF00u }));
}
public void FilterDisallowedFieldsMaskForFlag(UpdateMask changesMask, UpdateFieldFlag fieldVisibilityFlags)
{
UpdateMask allowedMaskForTarget = new(192, new[] { 0xFFFFDFFFu, 0xE1FF7FFFu, 0x001EFFFFu, 0xFFFFFF81u, 0x03F8007Fu, 0x00000000u });
UpdateMask allowedMaskForTarget = new(190, new[] { 0xFFFFDFFFu, 0xE1FF7FFFu, 0x001EFFFFu, 0xFFFFFF81u, 0x07F000FFu, 0x00000000u });
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
changesMask.AND(allowedMaskForTarget);
}
@@ -1977,90 +1980,94 @@ namespace Game.Entities
{
data.WriteUInt32(SilencedSchoolMask);
}
if (changesMask[119])
{
data.WritePackedGuid(NameplateAttachToGUID);
}
}
if (changesMask[119])
if (changesMask[120])
{
for (int i = 0; i < 2; ++i)
{
if (changesMask[120 + i])
if (changesMask[121 + i])
{
data.WriteUInt32(GetViewerDependentNpcFlags(NpcFlags[i], i, owner, receiver));
}
}
}
if (changesMask[122])
if (changesMask[123])
{
for (int i = 0; i < 6; ++i)
{
if (changesMask[123 + i])
if (changesMask[124 + i])
{
data.WriteInt32(Power[i]);
}
if (changesMask[129 + i])
if (changesMask[130 + i])
{
data.WriteUInt32(MaxPower[i]);
}
if (changesMask[135 + i])
if (changesMask[136 + i])
{
data.WriteFloat(PowerRegenFlatModifier[i]);
}
if (changesMask[141 + i])
if (changesMask[142 + i])
{
data.WriteFloat(PowerRegenInterruptedFlatModifier[i]);
}
}
}
if (changesMask[147])
if (changesMask[148])
{
for (int 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 (int i = 0; i < 2; ++i)
{
if (changesMask[152 + i])
if (changesMask[153 + i])
{
data.WriteUInt32(AttackRoundBaseTime[i]);
}
}
}
if (changesMask[154])
if (changesMask[155])
{
for (int i = 0; i < 4; ++i)
{
if (changesMask[155 + i])
if (changesMask[156 + i])
{
data.WriteInt32(Stats[i]);
}
if (changesMask[159 + i])
if (changesMask[160 + i])
{
data.WriteInt32(StatPosBuff[i]);
}
if (changesMask[163 + i])
if (changesMask[164 + i])
{
data.WriteInt32(StatNegBuff[i]);
}
}
}
if (changesMask[167])
if (changesMask[168])
{
for (int i = 0; i < 7; ++i)
{
if (changesMask[168 + i])
if (changesMask[169 + i])
{
data.WriteInt32(Resistances[i]);
}
if (changesMask[175 + i])
if (changesMask[176 + i])
{
data.WriteInt32(BonusResistanceMods[i]);
}
if (changesMask[182 + i])
if (changesMask[183 + i])
{
data.WriteInt32(ManaCostModifier[i]);
}
@@ -2185,6 +2192,7 @@ namespace Game.Entities
ClearChangesMask(GuildGUID);
ClearChangesMask(SkinningOwnerGUID);
ClearChangesMask(SilencedSchoolMask);
ClearChangesMask(NameplateAttachToGUID);
ClearChangesMask(NpcFlags);
ClearChangesMask(Power);
ClearChangesMask(MaxPower);
@@ -2518,11 +2526,12 @@ namespace Game.Entities
public UpdateField<CTROptions> CtrOptions = new(0, 30);
public UpdateField<int> CovenantID = new(0, 31);
public UpdateField<int> SoulbindID = new(32, 33);
public UpdateFieldArray<QuestLog>QuestLog = new(125, 34, 35);
public UpdateFieldArray<VisibleItem> VisibleItems = new(19, 160, 161);
public UpdateFieldArray<float>AvgItemLevel = new(4, 180, 181);
public UpdateField<DungeonScoreSummary> DungeonScore = new(32, 34);
public UpdateFieldArray<QuestLog>QuestLog = new(125, 35, 36);
public UpdateFieldArray<VisibleItem>VisibleItems = new(19, 161, 162);
public UpdateFieldArray<float>AvgItemLevel = new(6, 181, 182);
public PlayerData() : base(0, TypeId.Player, 185) { }
public PlayerData() : base(0, TypeId.Player, 188) { }
public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver)
{
@@ -2559,7 +2568,7 @@ namespace Game.Entities
data.WriteUInt32(VirtualPlayerRealm);
data.WriteUInt32(CurrentSpecID);
data.WriteInt32(TaxiMountAnimKitID);
for (int i = 0; i < 4; ++i)
for (int i = 0; i < 6; ++i)
{
data.WriteFloat(AvgItemLevel[i]);
}
@@ -2588,15 +2597,16 @@ namespace Game.Entities
}
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.PartyMember))
{
data.WriteBit((bool)HasQuestSession);
data.WriteBit(HasQuestSession);
}
data.WriteBit((bool)HasLevelLink);
data.WriteBit(HasLevelLink);
DungeonScore._value.Write(data);
data.FlushBits();
}
public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver)
{
UpdateMask allowedMaskForTarget = new(185, new[] { 0xFFFFFFEDu, 0x00000003u, 0x00000000u, 0x00000000u, 0x00000000u, 0x01FFFFFFu });
UpdateMask allowedMaskForTarget = new(188, new[] { 0xFFFFFFEDu, 0x00000007u, 0x00000000u, 0x00000000u, 0x00000000u, 0x0FFFFFFEu });
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver);
}
@@ -2604,12 +2614,12 @@ namespace Game.Entities
public void AppendAllowedFieldsMaskForFlag(UpdateMask allowedMaskForTarget, UpdateFieldFlag fieldVisibilityFlags)
{
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.PartyMember))
allowedMaskForTarget.OR(new UpdateMask(185, new[] { 0x00000012u, 0xFFFFFFFCu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x00000000u }));
allowedMaskForTarget.OR(new UpdateMask(188, new[] { 0x00000012u, 0xFFFFFFF8u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x00000001u }));
}
public void FilterDisallowedFieldsMaskForFlag(UpdateMask changesMask, UpdateFieldFlag fieldVisibilityFlags)
{
UpdateMask allowedMaskForTarget = new(185, new[] { 0xFFFFFFEDu, 0x00000003u, 0x00000000u, 0x00000000u, 0x00000000u, 0x01FFFFFFu });
UpdateMask allowedMaskForTarget = new(188, new[] { 0xFFFFFFEDu, 0x00000007u, 0x00000000u, 0x00000000u, 0x00000000u, 0x0FFFFFFEu });
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
changesMask.AND(allowedMaskForTarget);
}
@@ -2801,12 +2811,16 @@ namespace Game.Entities
{
data.WriteInt32(SoulbindID);
}
if (changesMask[34])
{
DungeonScore._value.Write(data);
}
}
if (changesMask[34])
if (changesMask[35])
{
for (int i = 0; i < 125; ++i)
{
if (changesMask[35 + i])
if (changesMask[36 + i])
{
if (noQuestLogChangesMask)
QuestLog[i].WriteCreate(data, owner, receiver);
@@ -2815,21 +2829,21 @@ namespace Game.Entities
}
}
}
if (changesMask[160])
if (changesMask[161])
{
for (int 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 (int i = 0; i < 4; ++i)
for (int i = 0; i < 6; ++i)
{
if (changesMask[181 + i])
if (changesMask[182 + i])
{
data.WriteFloat(AvgItemLevel[i]);
}
@@ -2872,6 +2886,7 @@ namespace Game.Entities
ClearChangesMask(CtrOptions);
ClearChangesMask(CovenantID);
ClearChangesMask(SoulbindID);
ClearChangesMask(DungeonScore);
ClearChangesMask(QuestLog);
ClearChangesMask(VisibleItems);
ClearChangesMask(AvgItemLevel);
@@ -3024,8 +3039,9 @@ namespace Game.Entities
public UpdateField<uint> WeeklyBestRating = new(0, 7);
public UpdateField<uint> SeasonBestRating = new(0, 8);
public UpdateField<uint> PvpTierID = new(0, 9);
public UpdateField<uint> WeeklyBestWinPvpTierID = new(0, 10);
public PVPInfo() : base(10) { }
public PVPInfo() : base(11) { }
public void WriteCreate(WorldPacket data, Player owner, Player receiver)
{
@@ -3037,6 +3053,7 @@ namespace Game.Entities
data.WriteUInt32(WeeklyBestRating);
data.WriteUInt32(SeasonBestRating);
data.WriteUInt32(PvpTierID);
data.WriteUInt32(WeeklyBestWinPvpTierID);
data.WriteBit(Disqualified);
data.FlushBits();
}
@@ -3047,7 +3064,7 @@ namespace Game.Entities
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 10);
data.WriteBits(changesMask.GetBlock(0), 11);
if (changesMask[0])
{
@@ -3091,6 +3108,10 @@ namespace Game.Entities
{
data.WriteUInt32(PvpTierID);
}
if (changesMask[10])
{
data.WriteUInt32(WeeklyBestWinPvpTierID);
}
}
data.FlushBits();
}
@@ -3106,6 +3127,7 @@ namespace Game.Entities
ClearChangesMask(WeeklyBestRating);
ClearChangesMask(SeasonBestRating);
ClearChangesMask(PvpTierID);
ClearChangesMask(WeeklyBestWinPvpTierID);
_changesMask.ResetAll();
}
}
@@ -3498,38 +3520,35 @@ namespace Game.Entities
public UpdateField<ulong> GuildClubMemberID = new(98, 101);
public UpdateField<uint> Honor = new(98, 102);
public UpdateField<uint> HonorNextLevel = new(98, 103);
public UpdateField<long> PvpRewardAchieved = new(98, 104);
public UpdateField<int> PvpTierMaxFromWins = new(98, 105);
public UpdateField<long> PvpLastWeeksRewardAchieved = new(98, 106);
public UpdateField<int> PvpLastWeeksTierMaxFromWins = new(98, 107);
public UpdateField<long> PvpLastWeeksRewardClaimed = new(98, 108);
public UpdateField<byte> NumBankSlots = new(98, 109);
public UpdateField<ActivePlayerUnk901> Field_1410 = new(98, 111);
public UpdateField<Optional<QuestSession>> QuestSession = new(98, 110);
public UpdateField<int> UiChromieTimeExpansionID = new(98, 112);
public UpdateField<int> TransportServerTime = new(98, 113);
public UpdateField<uint> WeeklyRewardsPeriodSinceOrigin = new(98, 114); // week count since Cfg_RegionsEntry::ChallengeOrigin
public UpdateFieldArray<ObjectGuid> InvSlots = new(199, 115, 116);
public UpdateFieldArray<uint> TrackResourceMask = new(2, 315, 316);
public UpdateFieldArray<ulong> ExploredZones = new(192, 318, 319);
public UpdateFieldArray<RestInfo> RestInfo = new(2, 511, 512);
public UpdateFieldArray<int> ModDamageDonePos = new(7, 514, 515);
public UpdateFieldArray<int> ModDamageDoneNeg = new(7, 514, 522);
public UpdateFieldArray<float> ModDamageDonePercent = new(7, 514, 529);
public UpdateFieldArray<float> ModHealingDonePercent = new(7, 514, 536);
public UpdateFieldArray<float> WeaponDmgMultipliers = new(3, 543, 544);
public UpdateFieldArray<float> WeaponAtkSpeedMultipliers = new(3, 543, 547);
public UpdateFieldArray<uint> BuybackPrice = new(12, 550, 551);
public UpdateFieldArray<uint> BuybackTimestamp = new(12, 550, 563);
public UpdateFieldArray<uint> CombatRatings = new(32, 575, 576);
public UpdateFieldArray<PVPInfo> PvpInfo = new(6, 608, 609);
public UpdateFieldArray<uint> NoReagentCostMask = new(4, 615, 616);
public UpdateFieldArray<uint> ProfessionSkillLine = new(2, 620, 621);
public UpdateFieldArray<uint> BagSlotFlags = new(4, 623, 624);
public UpdateFieldArray<uint> BankBagSlotFlags = new(7, 628, 629);
public UpdateFieldArray<ulong> QuestCompleted = new(875, 636, 637);
public UpdateField<byte>NumBankSlots = new(98, 104);
public UpdateField<ActivePlayerUnk901> Field_1410 = new(98, 106);
public UpdateField<Optional<QuestSession>> QuestSession = new(98, 105);
public UpdateField<int> UiChromieTimeExpansionID = new(98, 107);
public UpdateField<int> TransportServerTime = new(98, 108);
public UpdateField<uint> WeeklyRewardsPeriodSinceOrigin = new(98, 109); // week count since Cfg_RegionsEntry::ChallengeOrigin
public UpdateField<short> DEBUGSoulbindConduitRank = new(98, 110);
public UpdateField<DungeonScoreData> DungeonScore = new(98, 111);
public UpdateFieldArray<ObjectGuid> InvSlots = new(199, 112, 113);
public UpdateFieldArray<uint> TrackResourceMask = new(2, 312, 313);
public UpdateFieldArray<ulong> ExploredZones = new(240, 315, 316);
public UpdateFieldArray<RestInfo> RestInfo = new(2, 556, 557);
public UpdateFieldArray<int> ModDamageDonePos = new(7, 559, 560);
public UpdateFieldArray<int> ModDamageDoneNeg = new(7, 559, 567);
public UpdateFieldArray<float> ModDamageDonePercent = new(7, 559, 574);
public UpdateFieldArray<float> ModHealingDonePercent = new(7, 559, 581);
public UpdateFieldArray<float> WeaponDmgMultipliers = new(3, 588, 589);
public UpdateFieldArray<float> WeaponAtkSpeedMultipliers = new(3, 588, 592);
public UpdateFieldArray<uint> BuybackPrice = new(12, 595, 596);
public UpdateFieldArray<uint> BuybackTimestamp = new(12, 595, 608);
public UpdateFieldArray<uint> CombatRatings = new(32, 620, 621);
public UpdateFieldArray<PVPInfo> PvpInfo = new(6, 653, 654);
public UpdateFieldArray<uint> NoReagentCostMask = new(4, 660, 661);
public UpdateFieldArray<uint> ProfessionSkillLine = new(2, 665, 666);
public UpdateFieldArray<uint> BagSlotFlags = new(4, 668, 669);
public UpdateFieldArray<uint> BankBagSlotFlags = new(7, 673, 674);
public UpdateFieldArray<ulong> QuestCompleted = new(875, 681, 682);
public ActivePlayerData() : base(0, TypeId.ActivePlayer, 1512) { }
public ActivePlayerData() : base(0, TypeId.ActivePlayer, 1557) { }
public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver)
{
@@ -3575,7 +3594,7 @@ namespace Game.Entities
data.WriteFloat(VersatilityBonus);
data.WriteFloat(PvpPowerDamage);
data.WriteFloat(PvpPowerHealing);
for (int i = 0; i < 192; ++i)
for (int i = 0; i < 240; ++i)
{
data.WriteUInt64(ExploredZones[i]);
}
@@ -3663,11 +3682,6 @@ namespace Game.Entities
}
data.WriteUInt32(Honor);
data.WriteUInt32(HonorNextLevel);
data.WriteInt64(PvpRewardAchieved);
data.WriteInt32(PvpTierMaxFromWins);
data.WriteInt64(PvpLastWeeksRewardAchieved);
data.WriteInt32(PvpLastWeeksTierMaxFromWins);
data.WriteInt64(PvpLastWeeksRewardClaimed);
data.WriteUInt8(NumBankSlots);
data.WriteInt32(ResearchSites.Size());
data.WriteInt32(ResearchSiteProgress.Size());
@@ -3701,6 +3715,7 @@ namespace Game.Entities
data.WriteInt32(UiChromieTimeExpansionID);
data.WriteInt32(TransportServerTime);
data.WriteUInt32(WeeklyRewardsPeriodSinceOrigin);
data.WriteInt16(DEBUGSoulbindConduitRank);
for (int i = 0; i < KnownTitles.Size(); ++i)
{
data.WriteUInt64(KnownTitles[i]);
@@ -3790,16 +3805,17 @@ namespace Game.Entities
PvpInfo[i].WriteCreate(data, owner, receiver);
}
data.FlushBits();
data.WriteBit((bool)BackpackAutoSortDisabled);
data.WriteBit((bool)BankAutoSortDisabled);
data.WriteBit((bool)SortBagsRightToLeft);
data.WriteBit((bool)InsertItemsLeftToRight);
data.WriteBit(BackpackAutoSortDisabled);
data.WriteBit(BankAutoSortDisabled);
data.WriteBit(SortBagsRightToLeft);
data.WriteBit(InsertItemsLeftToRight);
data.WriteBits(QuestSession.GetValue().HasValue, 1);
((ActivePlayerUnk901)Field_1410).WriteCreate(data, owner, receiver);
if (QuestSession.GetValue().HasValue)
{
QuestSession.GetValue().Value.WriteCreate(data, owner, receiver);
}
DungeonScore._value.Write(data);
for (int i = 0; i < CharacterRestrictions.Size(); ++i)
{
CharacterRestrictions[i].WriteCreate(data, owner, receiver);
@@ -3817,8 +3833,8 @@ namespace Game.Entities
for (uint i = 0; i < 1; ++i)
data.WriteUInt32(changesMask.GetBlocksMask(i));
data.WriteBits(changesMask.GetBlocksMask(1), 16);
for (uint i = 0; i < 48; ++i)
data.WriteBits(changesMask.GetBlocksMask(1), 17);
for (uint i = 0; i < 49; ++i)
if (changesMask.GetBlock(i) != 0)
data.WriteBits(changesMask.GetBlock(i), 32);
@@ -4541,211 +4557,199 @@ namespace Game.Entities
}
if (changesMask[104])
{
data.WriteInt64(PvpRewardAchieved);
}
if (changesMask[105])
{
data.WriteInt32(PvpTierMaxFromWins);
}
if (changesMask[106])
{
data.WriteInt64(PvpLastWeeksRewardAchieved);
data.WriteUInt8(NumBankSlots);
}
if (changesMask[107])
{
data.WriteInt32(PvpLastWeeksTierMaxFromWins);
data.WriteInt32(UiChromieTimeExpansionID);
}
if (changesMask[108])
{
data.WriteInt64(PvpLastWeeksRewardClaimed);
data.WriteInt32(TransportServerTime);
}
if (changesMask[109])
{
data.WriteUInt8(NumBankSlots);
}
if (changesMask[112])
{
data.WriteInt32(UiChromieTimeExpansionID);
}
if (changesMask[113])
{
data.WriteInt32(TransportServerTime);
}
if (changesMask[114])
{
data.WriteUInt32(WeeklyRewardsPeriodSinceOrigin);
}
if (changesMask[110])
{
data.WriteInt16(DEBUGSoulbindConduitRank);
}
}
if (changesMask[98])
{
data.WriteBits(QuestSession.GetValue().HasValue, 1);
if (changesMask[111])
if (changesMask[106])
{
((ActivePlayerUnk901)Field_1410).WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
if (changesMask[110])
if (changesMask[105])
{
if (QuestSession.GetValue().HasValue)
{
QuestSession.GetValue().Value.WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
if (changesMask[111])
{
DungeonScore._value.Write(data);
}
}
if (changesMask[115])
if (changesMask[112])
{
for (int i = 0; i < 199; ++i)
{
if (changesMask[116 + i])
if (changesMask[113 + i])
{
data.WritePackedGuid(InvSlots[i]);
}
}
}
if (changesMask[315])
if (changesMask[312])
{
for (int i = 0; i < 2; ++i)
{
if (changesMask[316 + i])
if (changesMask[313 + i])
{
data.WriteUInt32(TrackResourceMask[i]);
}
}
}
if (changesMask[318])
if (changesMask[315])
{
for (int i = 0; i < 192; ++i)
for (int i = 0; i < 240; ++i)
{
if (changesMask[319 + i])
if (changesMask[316 + i])
{
data.WriteUInt64(ExploredZones[i]);
}
}
}
if (changesMask[511])
if (changesMask[556])
{
for (int 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 (int i = 0; i < 7; ++i)
{
if (changesMask[515 + i])
if (changesMask[560 + i])
{
data.WriteInt32(ModDamageDonePos[i]);
}
if (changesMask[522 + i])
if (changesMask[567 + i])
{
data.WriteInt32(ModDamageDoneNeg[i]);
}
if (changesMask[529 + i])
if (changesMask[574 + i])
{
data.WriteFloat(ModDamageDonePercent[i]);
}
if (changesMask[536 + i])
if (changesMask[581 + i])
{
data.WriteFloat(ModHealingDonePercent[i]);
}
}
}
if (changesMask[543])
if (changesMask[588])
{
for (int i = 0; i < 3; ++i)
{
if (changesMask[544 + i])
if (changesMask[589 + i])
{
data.WriteFloat(WeaponDmgMultipliers[i]);
}
if (changesMask[547 + i])
if (changesMask[592 + i])
{
data.WriteFloat(WeaponAtkSpeedMultipliers[i]);
}
}
}
if (changesMask[550])
if (changesMask[595])
{
for (int i = 0; i < 12; ++i)
{
if (changesMask[551 + i])
if (changesMask[596 + i])
{
data.WriteUInt32(BuybackPrice[i]);
}
if (changesMask[563 + i])
if (changesMask[608 + i])
{
data.WriteUInt32(BuybackTimestamp[i]);
}
}
}
if (changesMask[575])
if (changesMask[620])
{
for (int i = 0; i < 32; ++i)
{
if (changesMask[576 + i])
if (changesMask[621 + i])
{
data.WriteUInt32(CombatRatings[i]);
}
}
}
if (changesMask[615])
if (changesMask[660])
{
for (int i = 0; i < 4; ++i)
{
if (changesMask[616 + i])
if (changesMask[661 + i])
{
data.WriteUInt32(NoReagentCostMask[i]);
}
}
}
if (changesMask[620])
if (changesMask[665])
{
for (int i = 0; i < 2; ++i)
{
if (changesMask[621 + i])
if (changesMask[666 + i])
{
data.WriteUInt32(ProfessionSkillLine[i]);
}
}
}
if (changesMask[623])
if (changesMask[668])
{
for (int i = 0; i < 4; ++i)
{
if (changesMask[624 + i])
if (changesMask[669 + i])
{
data.WriteUInt32(BagSlotFlags[i]);
}
}
}
if (changesMask[628])
if (changesMask[673])
{
for (int i = 0; i < 7; ++i)
{
if (changesMask[629 + i])
if (changesMask[674 + i])
{
data.WriteUInt32(BankBagSlotFlags[i]);
}
}
}
if (changesMask[636])
if (changesMask[681])
{
for (int i = 0; i < 875; ++i)
{
if (changesMask[637 + i])
if (changesMask[682 + i])
{
data.WriteUInt64(QuestCompleted[i]);
}
}
}
if (changesMask[608])
if (changesMask[653])
{
for (int i = 0; i < 6; ++i)
{
if (changesMask[609 + i])
if (changesMask[654 + i])
{
PvpInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
@@ -4855,17 +4859,14 @@ namespace Game.Entities
ClearChangesMask(GuildClubMemberID);
ClearChangesMask(Honor);
ClearChangesMask(HonorNextLevel);
ClearChangesMask(PvpRewardAchieved);
ClearChangesMask(PvpTierMaxFromWins);
ClearChangesMask(PvpLastWeeksRewardAchieved);
ClearChangesMask(PvpLastWeeksTierMaxFromWins);
ClearChangesMask(PvpLastWeeksRewardClaimed);
ClearChangesMask(NumBankSlots);
ClearChangesMask(Field_1410);
ClearChangesMask(QuestSession);
ClearChangesMask(UiChromieTimeExpansionID);
ClearChangesMask(TransportServerTime);
ClearChangesMask(WeeklyRewardsPeriodSinceOrigin);
ClearChangesMask(DEBUGSoulbindConduitRank);
ClearChangesMask(DungeonScore);
ClearChangesMask(InvSlots);
ClearChangesMask(TrackResourceMask);
ClearChangesMask(ExploredZones);
@@ -5665,12 +5666,13 @@ namespace Game.Entities
public class ConversationData : BaseUpdateData<Conversation>
{
public UpdateField<List<ConversationLine>> Lines = new(0, 1);
public DynamicUpdateField<ConversationActorField> Actors = new(0, 2);
public UpdateField<uint> LastLineEndTime = new(0, 3);
public UpdateField<uint> Progress = new(0, 4);
public UpdateField<bool> DontPlayBroadcastTextSounds = new(0, 1);
public UpdateField<List<ConversationLine>> Lines = new(0, 2);
public DynamicUpdateField<ConversationActorField> Actors = new(0, 3);
public UpdateField<uint> LastLineEndTime = new(0, 4);
public UpdateField<uint>Progress = new(0, 5);
public ConversationData() : base(0, TypeId.Conversation, 5) { }
public ConversationData() : base(0, TypeId.Conversation, 6) { }
public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Conversation owner, Player receiver)
{
@@ -5681,11 +5683,13 @@ namespace Game.Entities
{
((List<ConversationLine>)Lines)[i].WriteCreate(data, owner, receiver);
}
data.WriteBit(DontPlayBroadcastTextSounds);
data.WriteInt32(Actors.Size());
for (int i = 0; i < Actors.Size(); ++i)
{
Actors[i].WriteCreate(data, owner, receiver);
}
data.FlushBits();
}
public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Conversation owner, Player receiver)
@@ -5695,11 +5699,15 @@ namespace Game.Entities
public void WriteUpdate(WorldPacket data, UpdateMask changesMask, bool ignoreNestedChangesMask, Conversation owner, Player receiver)
{
data.WriteBits(_changesMask.GetBlock(0), 5);
data.WriteBits(_changesMask.GetBlock(0), 6);
if (_changesMask[0])
{
if (_changesMask[1])
{
data.WriteBit(DontPlayBroadcastTextSounds);
}
if (changesMask[2])
{
List<ConversationLine> list = Lines;
data.WriteBits(list.Count, 32);
@@ -5712,7 +5720,7 @@ namespace Game.Entities
data.FlushBits();
if (_changesMask[0])
{
if (_changesMask[2])
if (_changesMask[3])
{
if (!ignoreNestedChangesMask)
Actors.WriteUpdateMask(data);
@@ -5723,7 +5731,7 @@ namespace Game.Entities
data.FlushBits();
if (_changesMask[0])
{
if (_changesMask[2])
if (_changesMask[3])
{
for (int i = 0; i < Actors.Size(); ++i)
{
@@ -5733,19 +5741,21 @@ namespace Game.Entities
}
}
}
if (_changesMask[3])
if (_changesMask[4])
{
data.WriteUInt32(LastLineEndTime);
}
if (_changesMask[4])
if (_changesMask[5])
{
data.WriteUInt32(Progress);
}
}
data.FlushBits();
}
public override void ClearChangesMask()
{
ClearChangesMask(DontPlayBroadcastTextSounds);
ClearChangesMask(Lines);
ClearChangesMask(Actors);
ClearChangesMask(LastLineEndTime);
+4 -1
View File
@@ -2509,6 +2509,7 @@ namespace Game.Entities
public uint TransportID;
public float Magnitude;
public byte Type;
public int Unused910;
public void Read(WorldPacket data)
{
@@ -2518,7 +2519,9 @@ namespace Game.Entities
TransportID = data.ReadUInt32();
Magnitude = data.ReadFloat();
Type = data.ReadBits<byte>(2);
bool has910 = data.HasBit();
if (has910)
Unused910 = data.ReadInt32();
}
public void Write(WorldPacket data)
+4 -2
View File
@@ -501,8 +501,10 @@ namespace Game.Entities
public ObjectGuid[] Pieces = new ObjectGuid[EquipmentSlot.End];
public int[] Appearances = new int[EquipmentSlot.End]; // ItemModifiedAppearanceID
public int[] Enchants = new int[2]; // SpellItemEnchantmentID
public int Unknown901_1;
public int Unknown901_2;
public int SecondaryShoulderApparanceID; // Secondary shoulder appearance
public int SecondaryShoulderSlot; // Always 2 if secondary shoulder apperance is used
public int SecondaryWeaponAppearanceID; // For legion artifacts: linked child item appearance
public int SecondaryWeaponSlot; // For legion artifacts: which slot is used by child item
}
public enum EquipmentSetType
+41 -41
View File
@@ -672,9 +672,8 @@ namespace Game
pointsOfInterestStorage.Clear(); // need for reload case
// 0 1 2 3 4 5 6 7
SQLResult result = DB.World.Query("SELECT ID, PositionX, PositionY, Icon, Flags, Importance, Name, Unknown905 FROM points_of_interest");
// 0 1 2 3 4 5 6 7 8
var result = DB.World.Query("SELECT ID, PositionX, PositionY, PositionZ, Icon, Flags, Importance, Name, Unknown905 FROM points_of_interest");
if (result.IsEmpty())
{
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 Points of Interest definitions. DB table `points_of_interest` is empty.");
@@ -688,16 +687,16 @@ namespace Game
PointOfInterest POI = new();
POI.Id = id;
POI.Pos = new Vector2(result.Read<float>(1), result.Read<float>(2));
POI.Icon = result.Read<uint>(3);
POI.Flags = result.Read<uint>(4);
POI.Importance = result.Read<uint>(5);
POI.Name = result.Read<string>(6);
POI.Unknown905 = result.Read<uint>(7);
POI.Pos = new Vector3(result.Read<float>(1), result.Read<float>(2), result.Read<float>(3));
POI.Icon = result.Read<uint>(4);
POI.Flags = result.Read<uint>(5);
POI.Importance = result.Read<uint>(6);
POI.Name = result.Read<string>(7);
POI.Unknown905 = result.Read<uint>(8);
if (!GridDefines.IsValidMapCoord(POI.Pos.X, POI.Pos.Y))
if (!GridDefines.IsValidMapCoord(POI.Pos.X, POI.Pos.Y, POI.Pos.Z))
{
Log.outError(LogFilter.Sql, $"Table `points_of_interest` (ID: {id}) have invalid coordinates (PositionX: {POI.Pos.X} PositionY: {POI.Pos.Y}), ignored.");
Log.outError(LogFilter.Sql, $"Table `points_of_interest` (ID: {id}) have invalid coordinates (PositionX: {POI.Pos.X} PositionY: {POI.Pos.Y} PositionZ: {POI.Pos.Z}), ignored.");
continue;
}
@@ -1821,13 +1820,14 @@ namespace Game
creature.ModExperience = fields.Read<float>(68);
creature.RacialLeader = fields.Read<bool>(69);
creature.MovementId = fields.Read<uint>(70);
creature.WidgetSetID = fields.Read<int>(71);
creature.WidgetSetUnitConditionID = fields.Read<int>(72);
creature.RegenHealth = fields.Read<bool>(73);
creature.MechanicImmuneMask = fields.Read<uint>(74);
creature.SpellSchoolImmuneMask = fields.Read<uint>(75);
creature.FlagsExtra = (CreatureFlagsExtra)fields.Read<uint>(76);
creature.ScriptID = GetScriptId(fields.Read<string>(77));
creature.CreatureDifficultyID = fields.Read<int>(71);
creature.WidgetSetID = fields.Read<int>(72);
creature.WidgetSetUnitConditionID = fields.Read<int>(73);
creature.RegenHealth = fields.Read<bool>(74);
creature.MechanicImmuneMask = fields.Read<uint>(75);
creature.SpellSchoolImmuneMask = fields.Read<uint>(76);
creature.FlagsExtra = (CreatureFlagsExtra)fields.Read<uint>(77);
creature.ScriptID = GetScriptId(fields.Read<string>(78));
_creatureTemplateStorage[entry] = creature;
}
@@ -2338,8 +2338,8 @@ namespace Game
{
uint oldMSTime = Time.GetMSTime();
// 0 1 2 3 4 5 6
SQLResult result = DB.World.Query("SELECT Entry, DifficultyID, LevelScalingMin, LevelScalingMax, LevelScalingDeltaMin, LevelScalingDeltaMax, ContentTuningID FROM creature_template_scaling ORDER BY Entry");
// 0 1 2 3 4
var result = DB.World.Query("SELECT Entry, DifficultyID, LevelScalingDeltaMin, LevelScalingDeltaMax, ContentTuningID FROM creature_template_scaling ORDER BY Entry");
if (result.IsEmpty())
{
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 creature template scaling definitions. DB table `creature_template_scaling` is empty.");
@@ -2360,11 +2360,9 @@ namespace Game
}
CreatureLevelScaling creatureLevelScaling = new();
creatureLevelScaling.MinLevel = result.Read<ushort>(2);
creatureLevelScaling.MaxLevel = result.Read<ushort>(3);
creatureLevelScaling.DeltaLevelMin = result.Read<short>(4);
creatureLevelScaling.DeltaLevelMax = result.Read<short>(5);
creatureLevelScaling.ContentTuningID = result.Read<uint>(6);
creatureLevelScaling.DeltaLevelMin = result.Read<short>(2);
creatureLevelScaling.DeltaLevelMax = result.Read<short>(3);
creatureLevelScaling.ContentTuningID = result.Read<uint>(4);
template.scalingStorage[difficulty] = creatureLevelScaling;
@@ -6555,35 +6553,37 @@ namespace Game
_exclusiveQuestGroups.Clear();
SQLResult result = DB.World.Query("SELECT " +
//0 1 2 3 4 5 6 7 8 9
//0 1 2 3 4 5 6 7 8 9
"ID, QuestType, QuestPackageID, ContentTuningID, QuestSortID, QuestInfoID, SuggestedGroupNum, RewardNextQuest, RewardXPDifficulty, RewardXPMultiplier, " +
//10 11 12 13 14 15 16 17
//10 11 12 13 14 15 16 17
"RewardMoney, RewardMoneyDifficulty, RewardMoneyMultiplier, RewardBonusMoney, RewardSpell, RewardHonor, RewardKillHonor, StartItem, " +
//18 19 20 21 22 23
//18 19 20 21 22 23
"RewardArtifactXPDifficulty, RewardArtifactXPMultiplier, RewardArtifactCategoryID, Flags, FlagsEx, FlagsEx2, " +
//24 25 26 27 28 29 30 31
//24 25 26 27 28 29 30 31
"RewardItem1, RewardAmount1, ItemDrop1, ItemDropQuantity1, RewardItem2, RewardAmount2, ItemDrop2, ItemDropQuantity2, " +
//32 33 34 35 36 37 38 39
//32 33 34 35 36 37 38 39
"RewardItem3, RewardAmount3, ItemDrop3, ItemDropQuantity3, RewardItem4, RewardAmount4, ItemDrop4, ItemDropQuantity4, " +
//40 41 42 43 44 45
//40 41 42 43 44 45
"RewardChoiceItemID1, RewardChoiceItemQuantity1, RewardChoiceItemDisplayID1, RewardChoiceItemID2, RewardChoiceItemQuantity2, RewardChoiceItemDisplayID2, " +
//46 47 48 49 50 51
//46 47 48 49 50 51
"RewardChoiceItemID3, RewardChoiceItemQuantity3, RewardChoiceItemDisplayID3, RewardChoiceItemID4, RewardChoiceItemQuantity4, RewardChoiceItemDisplayID4, " +
//52 53 54 55 56 57
//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");
+4
View File
@@ -1091,6 +1091,10 @@ namespace Game
features.IsMuted = !CanSpeak();
SendPacket(features);
FeatureSystemStatus2 features2 = new();
features2.TextToSpeechFeatureEnabled = false;
SendPacket(features2);
}
[WorldPacketHandler(ClientOpcodes.SetFactionAtWar)]
+7 -6
View File
@@ -16,6 +16,7 @@
*/
using Framework.Constants;
using Framework.Dynamic;
using Game.Chat;
using Game.DataStorage;
using Game.Entities;
@@ -85,7 +86,7 @@ namespace Game
[WorldPacketHandler(ClientOpcodes.ChatMessageChannel)]
void HandleChatMessageChannel(ChatMessageChannel packet)
{
HandleChat(ChatMsg.Channel, packet.Language, packet.Text, packet.Target);
HandleChat(ChatMsg.Channel, packet.Language, packet.Text, packet.Target, packet.ChannelGUID);
}
[WorldPacketHandler(ClientOpcodes.ChatMessageEmote)]
@@ -94,7 +95,7 @@ namespace Game
HandleChat(ChatMsg.Emote, Language.Universal, packet.Text);
}
void HandleChat(ChatMsg type, Language lang, string msg, string target = "")
void HandleChat(ChatMsg type, Language lang, string msg, string target = "", ObjectGuid channelGuid = default)
{
Player sender = GetPlayer();
@@ -340,7 +341,7 @@ namespace Game
return;
}
}
Channel chn = ChannelManager.GetChannelForPlayerByNamePart(target, sender);
Channel chn = !channelGuid.IsEmpty() ? ChannelManager.GetChannelForPlayerByGuid(channelGuid, sender) : ChannelManager.GetChannelForPlayerByNamePart(target, sender);
if (chn != null)
{
Global.ScriptMgr.OnPlayerChat(GetPlayer(), type, lang, msg, chn);
@@ -378,10 +379,10 @@ namespace Game
[WorldPacketHandler(ClientOpcodes.ChatAddonMessageTargeted)]
void HandleChatAddonMessageTargeted(ChatAddonMessageTargeted chatAddonMessageTargeted)
{
HandleChatAddon(chatAddonMessageTargeted.Params.Type, chatAddonMessageTargeted.Params.Prefix, chatAddonMessageTargeted.Params.Text, chatAddonMessageTargeted.Params.IsLogged, chatAddonMessageTargeted.Target);
HandleChatAddon(chatAddonMessageTargeted.Params.Type, chatAddonMessageTargeted.Params.Prefix, chatAddonMessageTargeted.Params.Text, chatAddonMessageTargeted.Params.IsLogged, chatAddonMessageTargeted.Target, chatAddonMessageTargeted.ChannelGUID);
}
void HandleChatAddon(ChatMsg type, string prefix, string text, bool isLogged, string target = "")
void HandleChatAddon(ChatMsg type, string prefix, string text, bool isLogged, string target = "", Optional<ObjectGuid> channelGuid = default)
{
Player sender = GetPlayer();
@@ -445,7 +446,7 @@ namespace Game
break;
}
case ChatMsg.Channel:
Channel chn = ChannelManager.GetChannelForPlayerByNamePart(target, sender);
Channel chn = channelGuid.HasValue ? ChannelManager.GetChannelForPlayerByGuid(channelGuid.Value, sender) : ChannelManager.GetChannelForPlayerByNamePart(target, sender);
if (chn != null)
chn.AddonSay(sender.GetGUID(), prefix, text, isLogged);
break;
@@ -928,6 +928,7 @@ namespace Game.Networking.Packets
public Optional<ulong> BidAmount;
public List<ItemGemData> Gems = new();
public Optional<AuctionBucketKey> AuctionBucketKey;
public Optional<ObjectGuid> Creator;
public void Write(WorldPacket data)
{
@@ -941,6 +942,7 @@ namespace Game.Networking.Packets
data.WriteBit(CensorServerSideInfo);
data.WriteBit(CensorBidInfo);
data.WriteBit(AuctionBucketKey.HasValue);
data.WriteBit(Creator.HasValue);
if (!CensorBidInfo)
{
data.WriteBit(Bidder.HasValue);
@@ -982,6 +984,9 @@ namespace Game.Networking.Packets
data.WriteUInt32(EndTime);
}
if (Creator.HasValue)
data.WritePackedGuid(Creator.Value);
if (!CensorBidInfo)
{
if (Bidder.HasValue)
@@ -530,6 +530,7 @@ namespace Game.Networking.Packets
public int BestSeasonRating;
public int PvpTierID;
public int Unused3;
public int WeeklyBestWinPvpTierID;
public bool Disqualified;
public void Write(WorldPacket data)
@@ -547,6 +548,7 @@ namespace Game.Networking.Packets
data.WriteInt32(BestSeasonRating);
data.WriteInt32(PvpTierID);
data.WriteInt32(Unused3);
data.WriteInt32(WeeklyBestWinPvpTierID);
data.WriteBit(Disqualified);
data.FlushBits();
}
@@ -32,7 +32,6 @@ namespace Game.Networking.Packets
_worldPacket.WriteUInt16(Trap);
_worldPacket.WriteInt32(Slots.Count);
_worldPacket.WriteInt32(Pets.Count);
_worldPacket.WriteInt32(MaxPets);
_worldPacket.WriteBit(HasJournalLock);
_worldPacket.FlushBits();
@@ -47,7 +46,6 @@ namespace Game.Networking.Packets
bool HasJournalLock = true;
public List<BattlePetSlot> Slots = new();
public List<BattlePetStruct> Pets = new();
int MaxPets = 1000;
}
class BattlePetJournalLockAcquired : ServerPacket
+14 -5
View File
@@ -64,6 +64,7 @@ namespace Game.Networking.Packets
public override void Read()
{
Language = (Language)_worldPacket.ReadInt32();
ChannelGUID = _worldPacket.ReadPackedGuid();
uint targetLen = _worldPacket.ReadBits<uint>(9);
uint textLen = _worldPacket.ReadBits<uint>(9);
Target = _worldPacket.ReadString(targetLen);
@@ -71,6 +72,7 @@ namespace Game.Networking.Packets
}
public Language Language = Language.Universal;
public ObjectGuid ChannelGUID;
public string Text;
public string Target;
}
@@ -95,11 +97,13 @@ namespace Game.Networking.Packets
{
uint targetLen = _worldPacket.ReadBits<uint>(9);
Params.Read(_worldPacket);
ChannelGUID.Set(_worldPacket.ReadPackedGuid());
Target = _worldPacket.ReadString(targetLen);
}
public string Target;
public ChatAddonMessageParams Params = new();
public Optional<ObjectGuid> ChannelGUID; // not optional in the packet. Optional for api reasons
}
public class ChatMessageDND : ClientPacket
@@ -229,6 +233,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteBit(HideChatLog);
_worldPacket.WriteBit(FakeSenderName);
_worldPacket.WriteBit(Unused_801.HasValue);
_worldPacket.WriteBit(ChannelGUID.HasValue);
_worldPacket.FlushBits();
_worldPacket.WriteString(SenderName);
@@ -239,9 +244,12 @@ namespace Game.Networking.Packets
if (Unused_801.HasValue)
_worldPacket.WriteUInt32(Unused_801.Value);
if (ChannelGUID.HasValue)
_worldPacket.WritePackedGuid(ChannelGUID.Value);
}
public ChatMsg SlashCmd = 0;
public ChatMsg SlashCmd;
public Language _Language = Language.Universal;
public ObjectGuid SenderGUID;
public ObjectGuid SenderGuildGUID;
@@ -256,11 +264,12 @@ namespace Game.Networking.Packets
public string Channel = "";
public string ChatText = "";
public uint AchievementID;
public ChatFlags _ChatFlags = 0;
public float DisplayTime = 0.0f;
public ChatFlags _ChatFlags;
public float DisplayTime;
public Optional<uint> Unused_801;
public bool HideChatLog = false;
public bool FakeSenderName = false;
public bool HideChatLog;
public bool FakeSenderName;
public Optional<ObjectGuid> ChannelGUID;
}
public class EmoteMessage : ServerPacket
@@ -575,14 +575,14 @@ namespace Game.Networking.Packets
attackRoundInfo.WriteUInt8((byte)ContentTuning.TuningType);
attackRoundInfo.WriteUInt8(ContentTuning.TargetLevel);
attackRoundInfo.WriteUInt8(ContentTuning.Expansion);
attackRoundInfo.WriteUInt8(ContentTuning.TargetMinScalingLevel);
attackRoundInfo.WriteUInt8(ContentTuning.TargetMaxScalingLevel);
attackRoundInfo.WriteInt16(ContentTuning.PlayerLevelDelta);
attackRoundInfo.WriteInt8(ContentTuning.TargetScalingLevelDelta);
attackRoundInfo.WriteFloat(ContentTuning.PlayerItemLevel);
attackRoundInfo.WriteFloat(ContentTuning.TargetItemLevel);
attackRoundInfo.WriteUInt16(ContentTuning.ScalingHealthItemLevelCurveID);
attackRoundInfo.WriteUInt32((uint)ContentTuning.Flags);
attackRoundInfo.WriteUInt32(ContentTuning.PlayerContentTuningID);
attackRoundInfo.WriteUInt32(ContentTuning.TargetContentTuningID);
WriteLogDataBit();
FlushBits();
@@ -62,8 +62,10 @@ namespace Game.Networking.Packets
foreach (var id in equipSet.Enchants)
_worldPacket.WriteInt32(id);
_worldPacket.WriteInt32(equipSet.Unknown901_1);
_worldPacket.WriteInt32(equipSet.Unknown901_2);
_worldPacket.WriteInt32(equipSet.SecondaryShoulderApparanceID);
_worldPacket.WriteInt32(equipSet.SecondaryShoulderSlot);
_worldPacket.WriteInt32(equipSet.SecondaryWeaponAppearanceID);
_worldPacket.WriteInt32(equipSet.SecondaryWeaponSlot);
_worldPacket.WriteBit(equipSet.AssignedSpecIndex != -1);
_worldPacket.WriteBits(equipSet.SetName.GetByteCount(), 8);
@@ -103,8 +105,10 @@ namespace Game.Networking.Packets
Set.Enchants[0] = _worldPacket.ReadInt32();
Set.Enchants[1] = _worldPacket.ReadInt32();
Set.Unknown901_1 = _worldPacket.ReadInt32();
Set.Unknown901_2 = _worldPacket.ReadInt32();
Set.SecondaryShoulderApparanceID = _worldPacket.ReadInt32();
Set.SecondaryShoulderSlot = _worldPacket.ReadInt32();
Set.SecondaryWeaponAppearanceID = _worldPacket.ReadInt32();
Set.SecondaryWeaponSlot = _worldPacket.ReadInt32();
bool hasSpecIndex = _worldPacket.HasBit();
@@ -556,6 +556,18 @@ namespace Game.Networking.Packets
}
}
struct GarrisonSpecGroup
{
public int ChrSpecializationID;
public int SoulbindID;
public void Write(WorldPacket data)
{
data.WriteInt32(ChrSpecializationID);
data.WriteInt32(SoulbindID);
}
}
class GarrisonInfo
{
public void Write(WorldPacket data)
@@ -574,6 +586,7 @@ namespace Game.Networking.Packets
data.WriteInt32(Talents.Count);
data.WriteInt32(Collections.Count);
data.WriteInt32(EventLists.Count);
data.WriteInt32(SpecGroups.Count);
data.WriteInt32(CanStartMission.Count);
data.WriteInt32(ArchivedMissions.Count);
data.WriteUInt32(NumFollowerActivationsRemaining);
@@ -601,6 +614,9 @@ namespace Game.Networking.Packets
foreach (GarrisonEventList eventList in EventLists)
eventList.Write(data);
foreach (var specGroup in SpecGroups)
specGroup.Write(data);
foreach (var id in ArchivedMissions)
data.WriteInt32(id);
@@ -647,6 +663,7 @@ namespace Game.Networking.Packets
public List<GarrisonTalent> Talents = new();
public List<GarrisonCollection> Collections = new();
public List<GarrisonEventList> EventLists = new();
public List<GarrisonSpecGroup> SpecGroups = new();
public List<bool> CanStartMission = new();
public List<int> ArchivedMissions = new();
}
@@ -229,10 +229,16 @@ namespace Game.Networking.Packets
public override void Read()
{
uint nameLen = _worldPacket.ReadBits<uint>(9);
bool hasUnused910 = _worldPacket.HasBit();
Name = _worldPacket.ReadString(nameLen);
if (hasUnused910)
Unused910.Set(_worldPacket.ReadInt32());
}
public string Name;
public Optional<int> Unused910;
}
public class GuildInvite : ServerPacket
@@ -1640,6 +1646,9 @@ namespace Game.Networking.Packets
data.WriteBits(OfficerNote.GetByteCount(), 8);
data.WriteBit(Authenticated);
data.WriteBit(SorEligible);
data.FlushBits();
DungeonScore.Write(data);
data.WriteString(Name);
data.WriteString(Note);
@@ -1666,6 +1675,7 @@ namespace Game.Networking.Packets
public bool Authenticated;
public bool SorEligible;
public GuildRosterProfessionData[] Profession = new GuildRosterProfessionData[2];
public DungeonScoreSummary DungeonScore = new();
}
public class GuildEventEntry
@@ -299,6 +299,7 @@ namespace Game.Networking.Packets
data.WriteInt32(WeeklyBestRating);
data.WriteInt32(SeasonBestRating);
data.WriteInt32(PvpTierID);
data.WriteInt32(WeeklyBestWinPvpTierID);
data.WriteBit(Disqualified);
data.FlushBits();
}
@@ -312,6 +313,7 @@ namespace Game.Networking.Packets
public int WeeklyBestRating;
public int SeasonBestRating;
public int PvpTierID;
public int WeeklyBestWinPvpTierID;
public byte Bracket;
public bool Disqualified;
}
@@ -167,12 +167,10 @@ namespace Game.Networking.Packets
{
Mailbox = _worldPacket.ReadPackedGuid();
MailID = _worldPacket.ReadUInt32();
BiReceipt = _worldPacket.HasBit();
}
public ObjectGuid Mailbox;
public uint MailID;
public bool BiReceipt;
}
public class MailDelete : ClientPacket
@@ -323,7 +323,11 @@ namespace Game.Networking.Packets
data.WriteUInt32(movementForce.TransportID);
data.WriteFloat(movementForce.Magnitude);
data.WriteBits(movementForce.Type, 2);
data.WriteBit(movementForce.Unused910 != 0);
data.FlushBits();
if (movementForce.Unused910 != 0)
data.WriteInt32(movementForce.Unused910);
}
}
@@ -0,0 +1,179 @@
/*
* Copyright (C) 2012-2020 CypherCore <http://github.com/CypherCore>
*
* 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 3 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/>.
*/
using Game.Entities;
using System.Collections.Generic;
namespace Game.Networking.Packets
{
public struct DungeonScoreMapSummary
{
public int ChallengeModeID;
public int MapScore;
public int BestRunLevel;
public int BestRunDurationMS;
public bool FinishedSuccess;
public void Write(WorldPacket data)
{
data.WriteInt32(ChallengeModeID);
data.WriteInt32(MapScore);
data.WriteInt32(BestRunLevel);
data.WriteInt32(BestRunDurationMS);
data.WriteBit(FinishedSuccess);
data.FlushBits();
}
}
public class DungeonScoreSummary
{
public int CurrentSeasonScore;
public List<DungeonScoreMapSummary> Runs = new();
public void Write(WorldPacket data)
{
data.WriteInt32(CurrentSeasonScore);
data.WriteInt32(Runs.Count);
foreach (var dungeonScoreMapSummary in Runs)
dungeonScoreMapSummary.Write(data);
}
}
public struct MythicPlusMember
{
public ObjectGuid BnetAccountGUID;
public ulong GuildClubMemberID;
public ObjectGuid GUID;
public ObjectGuid GuildGUID;
public uint NativeRealmAddress;
public uint VirtualRealmAddress;
public short ChrSpecializationID;
public short RaceID;
public int ItemLevel;
public int CovenantID;
public int SoulbindID;
public void Write(WorldPacket data)
{
data.WritePackedGuid(BnetAccountGUID);
data.WriteUInt64(GuildClubMemberID);
data.WritePackedGuid(GUID);
data.WritePackedGuid(GuildGUID);
data.WriteUInt32(NativeRealmAddress);
data.WriteUInt32(VirtualRealmAddress);
data.WriteInt16(ChrSpecializationID);
data.WriteInt16(RaceID);
data.WriteInt32(ItemLevel);
data.WriteInt32(CovenantID);
data.WriteInt32(SoulbindID);
}
}
public class MythicPlusRun
{
public int MapChallengeModeID;
public bool Completed;
public uint Level;
public int DurationMs;
public long StartDate;
public long CompletionDate;
public int Season;
public List<MythicPlusMember> Members = new();
public int RunScore;
public int[] KeystoneAffixIDs = new int[4];
public void Write(WorldPacket data)
{
data.WriteInt32(MapChallengeModeID);
data.WriteUInt32(Level);
data.WriteInt32(DurationMs);
data.WriteInt64(StartDate);
data.WriteInt64(CompletionDate);
data.WriteInt32(Season);
foreach (var id in KeystoneAffixIDs)
data.WriteInt32(id);
data.WriteInt32(Members.Count);
data.WriteInt32(RunScore);
foreach (var member in Members)
member.Write(data);
data.WriteBit(Completed);
data.FlushBits();
}
}
public class DungeonScoreBestRunForAffix
{
public int KeystoneAffixID;
public MythicPlusRun Run = new();
public int Score;
public void Write(WorldPacket data)
{
data.WriteInt32(KeystoneAffixID);
data.WriteInt32(Score);
Run.Write(data);
}
}
public class DungeonScoreMapData
{
public int MapChallengeModeID;
public List<DungeonScoreBestRunForAffix> BestRuns = new();
public int OverAllScore;
public void Write(WorldPacket data)
{
data.WriteInt32(MapChallengeModeID);
data.WriteInt32(BestRuns.Count);
data.WriteInt32(OverAllScore);
foreach (var bestRun in BestRuns)
bestRun.Write(data);
}
}
public class DungeonScoreSeasonData
{
public int Season;
public List<DungeonScoreMapData> Maps = new();
public int SeasonScore;
public void Write(WorldPacket data)
{
data.WriteInt32(Season);
data.WriteInt32(Maps.Count);
data.WriteInt32(SeasonScore);
foreach (var map in Maps)
map.Write(data);
}
}
public class DungeonScoreData
{
public List<DungeonScoreSeasonData> Seasons = new();
public int TotalRuns;
public void Write(WorldPacket data)
{
data.WriteInt32(Seasons.Count);
data.WriteInt32(TotalRuns);
foreach (var season in Seasons)
season.Write(data);
}
}
}
+2 -3
View File
@@ -205,8 +205,7 @@ namespace Game.Networking.Packets
public override void Write()
{
_worldPacket.WriteUInt32(Id);
_worldPacket.WriteFloat(Pos.X);
_worldPacket.WriteFloat(Pos.Y);
_worldPacket.WriteVector3(Pos);
_worldPacket.WriteUInt32(Icon);
_worldPacket.WriteUInt32(Importance);
_worldPacket.WriteUInt32(Unknown905);
@@ -218,7 +217,7 @@ namespace Game.Networking.Packets
public uint Id;
public uint Flags;
public Vector2 Pos;
public Vector3 Pos;
public uint Icon;
public uint Importance;
public uint Unknown905;
@@ -1001,6 +1001,8 @@ namespace Game.Networking.Packets
data.WriteBit(PetStats.HasValue);
data.FlushBits();
DungeonScore.Write(data);
if (PetStats.HasValue)
PetStats.Value.Write(data);
}
@@ -1032,6 +1034,7 @@ namespace Game.Networking.Packets
public uint WmoDoodadPlacementID;
public sbyte[] PartyType = new sbyte[2];
public CTROptions ChromieTime;
public DungeonScoreSummary DungeonScore = new();
}
struct PartyPlayerInfo
@@ -91,11 +91,13 @@ namespace Game.Networking.Packets
uint titleLen = _worldPacket.ReadBits<uint>(7);
Unit = _worldPacket.ReadPackedGuid();
Unused910 = _worldPacket.ReadUInt32();
Title = _worldPacket.ReadString(titleLen);
}
public ObjectGuid Unit;
public string Title;
public uint Unused910;
}
public class PetitionShowSignatures : ClientPacket
@@ -132,6 +132,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteUInt32(Stats.RequiredExpansion);
_worldPacket.WriteUInt32(Stats.VignetteID);
_worldPacket.WriteInt32(Stats.Class);
_worldPacket.WriteInt32(Stats.CreatureDifficultyID);
_worldPacket.WriteInt32(Stats.WidgetSetID);
_worldPacket.WriteInt32(Stats.WidgetSetUnitConditionID);
@@ -720,6 +721,7 @@ namespace Game.Networking.Packets
public uint RequiredExpansion;
public uint VignetteID;
public int Class;
public int CreatureDifficultyID;
public int WidgetSetID;
public int WidgetSetUnitConditionID;
public uint[] Flags = new uint[2];
@@ -166,6 +166,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteUInt32(Info.PortraitGiver);
_worldPacket.WriteUInt32(Info.PortraitGiverMount);
_worldPacket.WriteInt32(Info.PortraitGiverModelSceneID);
_worldPacket.WriteUInt32(Info.PortraitTurnIn);
for (uint i = 0; i < SharedConst.QuestRewardReputationsCount; ++i)
@@ -312,6 +313,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteUInt32(QuestPackageID);
_worldPacket.WriteUInt32(PortraitGiver);
_worldPacket.WriteUInt32(PortraitGiverMount);
_worldPacket.WriteInt32(PortraitGiverModelSceneID);
_worldPacket.WriteUInt32(PortraitTurnIn);
_worldPacket.WriteBits(QuestTitle.GetByteCount(), 9);
@@ -332,6 +334,7 @@ namespace Game.Networking.Packets
public uint PortraitTurnIn;
public uint PortraitGiver;
public uint PortraitGiverMount;
public int PortraitGiverModelSceneID;
public string QuestTitle = "";
public string RewardText = "";
public string PortraitGiverText = "";
@@ -430,6 +433,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteInt32(QuestPackageID);
_worldPacket.WriteUInt32(PortraitGiver);
_worldPacket.WriteUInt32(PortraitGiverMount);
_worldPacket.WriteInt32(PortraitGiverModelSceneID);
_worldPacket.WriteUInt32(PortraitTurnIn);
_worldPacket.WriteUInt32(QuestFlags[0]); // Flags
_worldPacket.WriteUInt32(QuestFlags[1]); // FlagsEx
@@ -494,6 +498,7 @@ namespace Game.Networking.Packets
public uint PortraitTurnIn;
public uint PortraitGiver;
public uint PortraitGiverMount;
public int PortraitGiverModelSceneID;
public int QuestStartItemID;
public int QuestSessionBonus;
public string PortraitGiverText = "";
@@ -839,6 +844,7 @@ namespace Game.Networking.Packets
_worldPacket.WritePackedGuid(SenderGUID);
_worldPacket.WriteInt32(UiTextureKitID);
_worldPacket.WriteUInt32(SoundKitID);
_worldPacket.WriteUInt8(NumRerolls);
_worldPacket.WriteBits(Question.GetByteCount(), 8);
_worldPacket.WriteBit(CloseChoiceFrame);
_worldPacket.WriteBit(HideWarboardHeader);
@@ -855,6 +861,7 @@ namespace Game.Networking.Packets
public int ChoiceID;
public int UiTextureKitID;
public uint SoundKitID;
public byte NumRerolls;
public string Question;
public List<PlayerChoiceResponse> Responses = new();
public bool CloseChoiceFrame;
@@ -870,10 +877,12 @@ namespace Game.Networking.Packets
{
ChoiceID = _worldPacket.ReadInt32();
ResponseID = _worldPacket.ReadInt32();
IsReroll = _worldPacket.HasBit();
}
public int ChoiceID;
public int ResponseID;
public bool IsReroll;
}
//Structs
@@ -970,6 +979,7 @@ namespace Game.Networking.Packets
public uint RewardNumSkillUps; // reward skill points
public uint PortraitGiver; // quest giver entry ?
public uint PortraitGiverMount;
public int PortraitGiverModelSceneID;
public uint PortraitTurnIn; // quest turn in entry ?
public string PortraitGiverText;
public string PortraitGiverName;
+8 -13
View File
@@ -1240,9 +1240,8 @@ namespace Game.Networking.Packets
ScalingHealthItemLevelCurveID = (ushort)target.m_unitData.ScalingHealthItemLevelCurveID;
TargetLevel = (byte)target.GetLevel();
Expansion = (byte)creatureTemplate.HealthScalingExpansion;
TargetMinScalingLevel = (byte)creatureScaling.MinLevel;
TargetMaxScalingLevel = (byte)creatureScaling.MaxLevel;
TargetScalingLevelDelta = (sbyte)attacker.m_unitData.ScalingLevelDelta;
TargetContentTuningID = creatureScaling.ContentTuningID;
return true;
}
@@ -1257,9 +1256,8 @@ namespace Game.Networking.Packets
ScalingHealthItemLevelCurveID = (ushort)target.m_unitData.ScalingHealthItemLevelCurveID;
TargetLevel = (byte)target.GetLevel();
Expansion = (byte)creatureTemplate.HealthScalingExpansion;
TargetMinScalingLevel = (byte)creatureScaling.MinLevel;
TargetMaxScalingLevel = (byte)creatureScaling.MaxLevel;
TargetScalingLevelDelta = (sbyte)target.m_unitData.ScalingLevelDelta;
TargetContentTuningID = creatureScaling.ContentTuningID;
return true;
}
@@ -1274,9 +1272,8 @@ namespace Game.Networking.Packets
PlayerItemLevel = 0;
TargetLevel = (byte)target.GetLevel();
Expansion = (byte)creatureTemplate.HealthScalingExpansion;
TargetMinScalingLevel = (byte)creatureScaling.MinLevel;
TargetMaxScalingLevel = (byte)creatureScaling.MaxLevel;
TargetScalingLevelDelta = (sbyte)accessor.m_unitData.ScalingLevelDelta;
TargetContentTuningID = creatureScaling.ContentTuningID;
return true;
}
@@ -1323,10 +1320,10 @@ namespace Game.Networking.Packets
data.WriteUInt16(ScalingHealthItemLevelCurveID);
data.WriteUInt8(TargetLevel);
data.WriteUInt8(Expansion);
data.WriteUInt8(TargetMinScalingLevel);
data.WriteUInt8(TargetMaxScalingLevel);
data.WriteInt8(TargetScalingLevelDelta);
data.WriteUInt32((uint)Flags);
data.WriteUInt32(PlayerContentTuningID);
data.WriteUInt32(TargetContentTuningID);
data.WriteBits(TuningType, 4);
data.FlushBits();
}
@@ -1338,10 +1335,10 @@ namespace Game.Networking.Packets
public ushort ScalingHealthItemLevelCurveID;
public byte TargetLevel;
public byte Expansion;
public byte TargetMinScalingLevel;
public byte TargetMaxScalingLevel;
public sbyte TargetScalingLevelDelta;
public ContentTuningFlags Flags = ContentTuningFlags.NoLevelScaling | ContentTuningFlags.NoItemLevelScaling;
public ContentTuningFlags Flags = ContentTuningFlags.NoLevelScaling | ContentTuningFlags.NoItemLevelScaling;
public uint PlayerContentTuningID;
public uint TargetContentTuningID;
public enum ContentTuningType
{
@@ -1581,13 +1578,11 @@ namespace Game.Networking.Packets
{
public int ItemID;
public int Slot;
public int Count;
public void Read(WorldPacket data)
{
ItemID = data.ReadInt32();
Slot = data.ReadInt32();
Count = data.ReadInt32();
}
}
@@ -233,6 +233,19 @@ namespace Game.Networking.Packets
}
}
public class FeatureSystemStatus2 : ServerPacket
{
public FeatureSystemStatus2() : base(ServerOpcodes.FeatureSystemStatus2) { }
public override void Write()
{
_worldPacket.WriteBit(TextToSpeechFeatureEnabled);
_worldPacket.FlushBits();
}
public bool TextToSpeechFeatureEnabled;
}
public class FeatureSystemStatusGlueScreen : ServerPacket
{
public FeatureSystemStatusGlueScreen() : base(ServerOpcodes.FeatureSystemStatusGlueScreen) { }
@@ -141,6 +141,7 @@ namespace Game.Networking.Packets
bool hasLFGListApplicant = _worldPacket.HasBit();
bool hasClubMessage = _worldPacket.HasBit();
bool hasClubFinderResult = _worldPacket.HasBit();
bool hasUnk910 = _worldPacket.HasBit();
_worldPacket.ResetBitPos();
@@ -196,6 +197,12 @@ namespace Game.Networking.Packets
ClubFinderResult.HasValue = true;
ClubFinderResult.Value.Read(_worldPacket);
}
if (hasUnk910)
{
Unused910.HasValue = true;
Unused910.Value.Read(_worldPacket);
}
}
public SupportTicketHeader Header;
@@ -212,6 +219,7 @@ namespace Game.Networking.Packets
public Optional<SupportTicketLFGListApplicant> LFGListApplicant;
public Optional<SupportTicketCommunityMessage> CommunityMessage;
public Optional<SupportTicketClubFinderResult> ClubFinderResult;
public Optional<SupportTicketUnused910> Unused910;
public struct SupportTicketChatLine
{
@@ -460,6 +468,19 @@ namespace Game.Networking.Packets
ClubName = data.ReadString(data.ReadBits<uint>(12));
}
}
public struct SupportTicketUnused910
{
public string field_0;
public ObjectGuid field_104;
public void Read(WorldPacket data)
{
uint field_0Length = data.ReadBits<uint>(7);
field_104 = data.ReadPackedGuid();
field_0 = data.ReadString(field_0Length);
}
}
}
class Complaint : ClientPacket
+29 -26
View File
@@ -89,46 +89,47 @@ namespace Game
QuestGiverPortrait = fields.Read<uint>(66);
QuestGiverPortraitMount = fields.Read<uint>(67);
QuestTurnInPortrait = fields.Read<uint>(68);
QuestGiverPortraitModelSceneId = fields.Read<int>(68);
QuestTurnInPortrait = fields.Read<uint>(69);
for (int i = 0; i < SharedConst.QuestRewardReputationsCount; ++i)
{
RewardFactionId[i] = fields.Read<uint>(69 + i * 4);
RewardFactionValue[i] = fields.Read<int>(70 + i * 4);
RewardFactionOverride[i] = fields.Read<int>(71 + i * 4);
RewardFactionCapIn[i] = fields.Read<int>(72 + i * 4);
RewardFactionId[i] = fields.Read<uint>(70 + i * 4);
RewardFactionValue[i] = fields.Read<int>(71 + i * 4);
RewardFactionOverride[i] = fields.Read<int>(72 + i * 4);
RewardFactionCapIn[i] = fields.Read<int>(73 + i * 4);
}
RewardReputationMask = fields.Read<uint>(89);
RewardReputationMask = fields.Read<uint>(90);
for (int i = 0; i < SharedConst.QuestRewardCurrencyCount; ++i)
{
RewardCurrencyId[i] = fields.Read<uint>(90 + i * 2);
RewardCurrencyCount[i] = fields.Read<uint>(91 + i * 2);
RewardCurrencyId[i] = fields.Read<uint>(91 + i * 2);
RewardCurrencyCount[i] = fields.Read<uint>(92 + i * 2);
if (RewardCurrencyId[i] != 0)
++_rewCurrencyCount;
}
SoundAccept = fields.Read<uint>(98);
SoundTurnIn = fields.Read<uint>(99);
AreaGroupID = fields.Read<uint>(100);
LimitTime = fields.Read<uint>(101);
AllowableRaces = (long)fields.Read<ulong>(102);
TreasurePickerID = fields.Read<int>(103);
Expansion = fields.Read<int>(104);
ManagedWorldStateID = fields.Read<int>(105);
QuestSessionBonus = fields.Read<int>(106);
SoundAccept = fields.Read<uint>(99);
SoundTurnIn = fields.Read<uint>(100);
AreaGroupID = fields.Read<uint>(101);
LimitTime = fields.Read<uint>(102);
AllowableRaces = (long)fields.Read<ulong>(103);
TreasurePickerID = fields.Read<int>(104);
Expansion = fields.Read<int>(105);
ManagedWorldStateID = fields.Read<int>(106);
QuestSessionBonus = fields.Read<int>(107);
LogTitle = fields.Read<string>(107);
LogDescription = fields.Read<string>(108);
QuestDescription = fields.Read<string>(109);
AreaDescription = fields.Read<string>(110);
PortraitGiverText = fields.Read<string>(111);
PortraitGiverName = fields.Read<string>(112);
PortraitTurnInText = fields.Read<string>(113);
PortraitTurnInName = fields.Read<string>(114);
QuestCompletionLog = fields.Read<string>(115);
LogTitle = fields.Read<string>(108);
LogDescription = fields.Read<string>(109);
QuestDescription = fields.Read<string>(110);
AreaDescription = fields.Read<string>(111);
PortraitGiverText = fields.Read<string>(112);
PortraitGiverName = fields.Read<string>(113);
PortraitTurnInText = fields.Read<string>(114);
PortraitTurnInName = fields.Read<string>(115);
QuestCompletionLog = fields.Read<string>(116);
}
public void LoadRewardDisplaySpell(SQLFields fields)
@@ -503,6 +504,7 @@ namespace Game
QueryData.Info.RewardFactionFlags = RewardReputationMask;
QueryData.Info.PortraitGiver = QuestGiverPortrait;
QueryData.Info.PortraitGiverMount = QuestGiverPortraitMount;
QueryData.Info.PortraitGiverModelSceneID = QuestGiverPortraitModelSceneId;
QueryData.Info.PortraitTurnIn = QuestTurnInPortrait;
for (byte i = 0; i < SharedConst.QuestItemDropCount; ++i)
@@ -651,6 +653,7 @@ namespace Game
public uint RewardSkillPoints;
public uint QuestGiverPortrait;
public uint QuestGiverPortraitMount;
public int QuestGiverPortraitModelSceneId;
public uint QuestTurnInPortrait;
public uint[] RewardFactionId = new uint[SharedConst.QuestRewardReputationsCount];
public int[] RewardFactionValue = new int[SharedConst.QuestRewardReputationsCount];
-1
View File
@@ -869,7 +869,6 @@ namespace Game
long _logoutTime;
bool m_inQueue;
SessionFlags m_flags;
ObjectGuid m_playerLoading; // code processed in LoginPlayer
bool m_playerLogout; // code processed in LogoutPlayer
bool m_playerRecentlyLogout;