Core/PacketIO: 9.1.0 opcodes and packet structures
Port From (https://github.com/TrinityCore/TrinityCore/commit/cd5357dc185f95c6ef78089c5ab8bd2b885dd89f)
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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");
|
||||
|
||||
|
||||
@@ -1091,6 +1091,10 @@ namespace Game
|
||||
features.IsMuted = !CanSpeak();
|
||||
|
||||
SendPacket(features);
|
||||
|
||||
FeatureSystemStatus2 features2 = new();
|
||||
features2.TextToSpeechFeatureEnabled = false;
|
||||
SendPacket(features2);
|
||||
}
|
||||
|
||||
[WorldPacketHandler(ClientOpcodes.SetFactionAtWar)]
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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
@@ -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];
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user