From 7c405230cc7a74e10efb8dd768d8d5e3d74e952f Mon Sep 17 00:00:00 2001 From: hondacrx Date: Wed, 11 Sep 2019 23:42:27 -0400 Subject: [PATCH] Misc bug fixes --- .../Framework/Constants/Update/UpdateFlags.cs | 54 -- .../Framework/Constants/Update/UpdateType.cs | 9 + Source/Game/DungeonFinding/LFGManager.cs | 4 + Source/Game/Entities/Item/Item.cs | 2 +- .../Entities/Object/Update/UpdateField.cs | 7 +- .../Entities/Object/Update/UpdateFields.cs | 466 +++++++++--------- Source/Game/Entities/Object/WorldObject.cs | 2 +- Source/Game/Entities/Player/Player.Groups.cs | 3 +- Source/Game/Entities/Player/Player.cs | 2 +- Source/Game/Entities/Player/PlayerTaxi.cs | 12 +- Source/Game/Entities/Unit/Unit.cs | 2 +- Source/Game/Groups/Group.cs | 27 +- Source/Game/Groups/GroupManager.cs | 5 +- Source/Game/Handlers/QueryHandler.cs | 2 + Source/Game/Network/Packets/PartyPackets.cs | 2 +- 15 files changed, 282 insertions(+), 317 deletions(-) delete mode 100644 Source/Framework/Constants/Update/UpdateFlags.cs diff --git a/Source/Framework/Constants/Update/UpdateFlags.cs b/Source/Framework/Constants/Update/UpdateFlags.cs deleted file mode 100644 index f8e221582..000000000 --- a/Source/Framework/Constants/Update/UpdateFlags.cs +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2012-2019 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 . - */ - -using System; - -namespace Framework.Constants -{ - [Flags] - public enum UpdateFlag - { - None = 0x0, - Self = 0x1, - Transport = 0x2, - HasTarget = 0x4, - Living = 0x8, - StationaryPosition = 0x10, - Vehicle = 0x20, - TransportPosition = 0x40, - Rotation = 0x80, - AnimKits = 0x100, - Areatrigger = 0x0200, - Gameobject = 0x0400, - //UPDATEFLAG_REPLACE_ACTIVE = 0x0800, - //UPDATEFLAG_NO_BIRTH_ANIM = 0x1000, - //UPDATEFLAG_ENABLE_PORTALS = 0x2000, - //UPDATEFLAG_PLAY_HOVER_ANIM = 0x4000, - //UPDATEFLAG_IS_SUPPRESSING_GREETINGS = 0x8000 - //UPDATEFLAG_SCENEOBJECT = 0x10000, - //UPDATEFLAG_SCENE_PENDING_INSTANCE = 0x20000 - } - - public enum UpdateFieldFlag - { - None = 0, - Owner = 0x01, - PartyMember = 0x02, - UnitAll = 0x04, - Empath = 0x08 - } -} diff --git a/Source/Framework/Constants/Update/UpdateType.cs b/Source/Framework/Constants/Update/UpdateType.cs index 08e8b713b..792326262 100644 --- a/Source/Framework/Constants/Update/UpdateType.cs +++ b/Source/Framework/Constants/Update/UpdateType.cs @@ -24,4 +24,13 @@ namespace Framework.Constants CreateObject2 = 2, OutOfRangeObjects = 3, } + + public enum UpdateFieldFlag + { + None = 0, + Owner = 0x01, + PartyMember = 0x02, + UnitAll = 0x04, + Empath = 0x08 + } } diff --git a/Source/Game/DungeonFinding/LFGManager.cs b/Source/Game/DungeonFinding/LFGManager.cs index 667b948ae..d511fbfa7 100644 --- a/Source/Game/DungeonFinding/LFGManager.cs +++ b/Source/Game/DungeonFinding/LFGManager.cs @@ -1688,6 +1688,9 @@ namespace Game.DungeonFinding public void AddPlayerToGroup(ObjectGuid gguid, ObjectGuid guid) { + if (!GroupsStore.ContainsKey(gguid)) + GroupsStore[gguid] = new LFGGroupData(); + GroupsStore[gguid].AddPlayer(guid); } @@ -1695,6 +1698,7 @@ namespace Game.DungeonFinding { if (!GroupsStore.ContainsKey(gguid)) GroupsStore[gguid] = new LFGGroupData(); + GroupsStore[gguid].SetLeader(leader); } diff --git a/Source/Game/Entities/Item/Item.cs b/Source/Game/Entities/Item/Item.cs index 67681822a..74c661687 100644 --- a/Source/Game/Entities/Item/Item.cs +++ b/Source/Game/Entities/Item/Item.cs @@ -1233,7 +1233,7 @@ namespace Game.Entities data.WriteBytes(buffer); } - void BuildValuesUpdateWithFlag(ByteBuffer data, UpdateFieldFlag flags, Player target) + public override void BuildValuesUpdateWithFlag(WorldPacket data, UpdateFieldFlag flags, Player target) { UpdateMask valuesMask = new UpdateMask(14); valuesMask.Set((int)TypeId.Item); diff --git a/Source/Game/Entities/Object/Update/UpdateField.cs b/Source/Game/Entities/Object/Update/UpdateField.cs index 0c4c71812..45b91331b 100644 --- a/Source/Game/Entities/Object/Update/UpdateField.cs +++ b/Source/Game/Entities/Object/Update/UpdateField.cs @@ -38,6 +38,7 @@ namespace Game.Entities public void ClearChangesMask(BaseUpdateData updateData) { _changesMask.Reset(updateData.Bit); + updateData.ClearChangesMask(); } public void ClearChangesMask(BaseUpdateData updateData, ref UpdateField updateField) where T : new() where U : new() @@ -341,13 +342,13 @@ namespace Game.Entities public void ClearChangesMask(UpdateField updateField) where U : new() { - if (typeof(U).BaseType == typeof(IHasChangesMask)) + if (typeof(U).GetInterfaces().Any(x => typeof(IHasChangesMask) == x)) ((IHasChangesMask)updateField._value).ClearChangesMask(); } public void ClearChangesMask(UpdateFieldArray updateField) where U : new() { - if (typeof(U).BaseType == typeof(IHasChangesMask)) + if (typeof(U).GetInterfaces().Any(x => typeof(IHasChangesMask) == x)) { for (int i = 0; i < updateField.GetSize(); ++i) ((IHasChangesMask)updateField[i]).ClearChangesMask(); @@ -356,7 +357,7 @@ namespace Game.Entities public void ClearChangesMask(DynamicUpdateField updateField) where U : new() { - if (typeof(U).BaseType == typeof(IHasChangesMask)) + if (typeof(U).GetInterfaces().Any(x => typeof(IHasChangesMask) == x)) { for (int i = 0; i < updateField.Size(); ++i) ((IHasChangesMask)updateField[i]).ClearChangesMask(); diff --git a/Source/Game/Entities/Object/Update/UpdateFields.cs b/Source/Game/Entities/Object/Update/UpdateFields.cs index 80c61ff4e..a1ca98a39 100644 --- a/Source/Game/Entities/Object/Update/UpdateFields.cs +++ b/Source/Game/Entities/Object/Update/UpdateFields.cs @@ -376,14 +376,14 @@ namespace Game.Entities public void WriteUpdate(WorldPacket data, UpdateMask changesMask, UpdateFieldFlag fieldVisibilityFlags, Item owner, Player receiver) { - data.WriteBits(_changesMask.GetBlocksMask(0), 2); + data.WriteBits(changesMask.GetBlocksMask(0), 2); for (uint i = 0; i < 2; ++i) - if (_changesMask.GetBlock(i) != 0) - data.WriteBits(_changesMask.GetBlock(i), 32); + if (changesMask.GetBlock(i) != 0) + data.WriteBits(changesMask.GetBlock(i), 32); - if (_changesMask[0]) + if (changesMask[0]) { - if (_changesMask[1]) + if (changesMask[1]) { List bonusList = BonusListIDs; data.WriteBits(bonusList.Count, 32); @@ -392,25 +392,25 @@ namespace Game.Entities } } data.FlushBits(); - if (_changesMask[0]) + if (changesMask[0]) { - if (_changesMask[2]) + if (changesMask[2]) { Modifiers.WriteUpdateMask(data); } - if (_changesMask[3]) + if (changesMask[3]) { ArtifactPowers.WriteUpdateMask(data); } - if (_changesMask[4]) + if (changesMask[4]) { Gems.WriteUpdateMask(data); } } data.FlushBits(); - if (_changesMask[0]) + if (changesMask[0]) { - if (_changesMask[2]) + if (changesMask[2]) { for (int i = 0; i < Modifiers.Size(); ++i) { @@ -420,7 +420,7 @@ namespace Game.Entities } } } - if (_changesMask[3]) + if (changesMask[3]) { for (int i = 0; i < ArtifactPowers.Size(); ++i) { @@ -430,7 +430,7 @@ namespace Game.Entities } } } - if (_changesMask[4]) + if (changesMask[4]) { for (int i = 0; i < Gems.Size(); ++i) { @@ -440,82 +440,82 @@ namespace Game.Entities } } } - if (_changesMask[5]) + if (changesMask[5]) { data.WritePackedGuid(Owner); } - if (_changesMask[6]) + if (changesMask[6]) { data.WritePackedGuid(ContainedIn); } - if (_changesMask[7]) + if (changesMask[7]) { data.WritePackedGuid(Creator); } - if (_changesMask[8]) + if (changesMask[8]) { data.WritePackedGuid(GiftCreator); } - if (_changesMask[9]) + if (changesMask[9]) { data.WriteUInt32(StackCount); } - if (_changesMask[10]) + if (changesMask[10]) { data.WriteUInt32(Expiration); } - if (_changesMask[11]) + if (changesMask[11]) { data.WriteUInt32(DynamicFlags); } - if (_changesMask[12]) + if (changesMask[12]) { data.WriteUInt32(Durability); } - if (_changesMask[13]) + if (changesMask[13]) { data.WriteUInt32(MaxDurability); } - if (_changesMask[14]) + if (changesMask[14]) { data.WriteUInt32(CreatePlayedTime); } - if (_changesMask[15]) + if (changesMask[15]) { data.WriteUInt32(ModifiersMask); } - if (_changesMask[16]) + if (changesMask[16]) { data.WriteInt32(Context); } - if (_changesMask[17]) + if (changesMask[17]) { data.WriteUInt64(ArtifactXP); } - if (_changesMask[18]) + if (changesMask[18]) { data.WriteUInt8(ItemAppearanceModID); } - if (_changesMask[19]) + if (changesMask[19]) { data.WriteUInt32(Field_130); } } - if (_changesMask[20]) + if (changesMask[20]) { for (int i = 0; i < 5; ++i) { - if (_changesMask[21 + i]) + if (changesMask[21 + i]) { data.WriteInt32(SpellCharges[i]); } } } - if (_changesMask[26]) + if (changesMask[26]) { for (int i = 0; i < 13; ++i) { - if (_changesMask[27 + i]) + if (changesMask[27 + i]) { Enchantment[i].WriteUpdate(data, fieldVisibilityFlags, owner, receiver); } @@ -768,27 +768,27 @@ namespace Game.Entities } public void WriteUpdate(WorldPacket data, UpdateMask changesMask, UpdateFieldFlag fieldVisibilityFlags, Item owner, Player receiver) { - data.WriteBits(_changesMask.GetBlock(0), 9); + data.WriteBits(changesMask.GetBlock(0), 9); - if (_changesMask[0]) + if (changesMask[0]) { - if (_changesMask[1]) + if (changesMask[1]) { UnlockedEssences.WriteUpdateMask(data); } - if (_changesMask[2]) + if (changesMask[2]) { SelectedEssences.WriteUpdateMask(data); } - if (_changesMask[3]) + if (changesMask[3]) { UnlockedEssenceMilestones.WriteUpdateMask(data); } } data.FlushBits(); - if (_changesMask[0]) + if (changesMask[0]) { - if (_changesMask[1]) + if (changesMask[1]) { for (int i = 0; i < UnlockedEssences.Size(); ++i) { @@ -798,7 +798,7 @@ namespace Game.Entities } } } - if (_changesMask[2]) + if (changesMask[2]) { for (int i = 0; i < SelectedEssences.Size(); ++i) { @@ -808,7 +808,7 @@ namespace Game.Entities } } } - if (_changesMask[3]) + if (changesMask[3]) { for (int i = 0; i < UnlockedEssenceMilestones.Size(); ++i) { @@ -818,23 +818,23 @@ namespace Game.Entities } } } - if (_changesMask[4]) + if (changesMask[4]) { data.WriteUInt64(Xp); } - if (_changesMask[5]) + if (changesMask[5]) { data.WriteUInt32(Level); } - if (_changesMask[6]) + if (changesMask[6]) { data.WriteUInt32(AuraLevel); } - if (_changesMask[7]) + if (changesMask[7]) { data.WriteUInt32(KnowledgeLevel); } - if (_changesMask[8]) + if (changesMask[8]) { data.WriteUInt32(DEBUGknowledgeWeek); } @@ -889,7 +889,6 @@ namespace Game.Entities } public override void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Unit owner, Player receiver) { - data.WriteBits(_changesMask.GetBlock(0), 4); data.FlushBits(); @@ -1269,14 +1268,14 @@ namespace Game.Entities public void WriteUpdate(WorldPacket data, UpdateMask changesMask, UpdateFieldFlag fieldVisibilityFlags, Unit owner, Player receiver) { - data.WriteBits(_changesMask.GetBlocksMask(0), 6); + data.WriteBits(changesMask.GetBlocksMask(0), 6); for (uint i = 0; i < 6; ++i) - if (_changesMask.GetBlock(i) != 0) - data.WriteBits(_changesMask.GetBlock(i), 32); + if (changesMask.GetBlock(i) != 0) + data.WriteBits(changesMask.GetBlock(i), 32); - if (_changesMask[0]) + if (changesMask[0]) { - if (_changesMask[1]) + if (changesMask[1]) { List list = StateWorldEffectIDs; data.WriteBits(list.Count, 32); @@ -1287,25 +1286,25 @@ namespace Game.Entities } } data.FlushBits(); - if (_changesMask[0]) + if (changesMask[0]) { - if (_changesMask[2]) + if (changesMask[2]) { PassiveSpells.WriteUpdateMask(data); } - if (_changesMask[3]) + if (changesMask[3]) { WorldEffects.WriteUpdateMask(data); } - if (_changesMask[4]) + if (changesMask[4]) { ChannelObjects.WriteUpdateMask(data); } } data.FlushBits(); - if (_changesMask[0]) + if (changesMask[0]) { - if (_changesMask[2]) + if (changesMask[2]) { for (int i = 0; i < PassiveSpells.Size(); ++i) { @@ -1315,7 +1314,7 @@ namespace Game.Entities } } } - if (_changesMask[3]) + if (changesMask[3]) { for (int i = 0; i < WorldEffects.Size(); ++i) { @@ -1325,7 +1324,7 @@ namespace Game.Entities } } } - if (_changesMask[4]) + if (changesMask[4]) { for (int i = 0; i < ChannelObjects.Size(); ++i) { @@ -1335,527 +1334,527 @@ namespace Game.Entities } } } - if (_changesMask[5]) + if (changesMask[5]) { data.WriteUInt32(GetViewerDependentDisplayId(DisplayID, owner, receiver)); } - if (_changesMask[6]) + if (changesMask[6]) { data.WriteUInt32(StateSpellVisualID); } - if (_changesMask[7]) + if (changesMask[7]) { data.WriteUInt32(StateAnimID); } - if (_changesMask[8]) + if (changesMask[8]) { data.WriteUInt32(StateAnimKitID); } - if (_changesMask[9]) + if (changesMask[9]) { data.WriteUInt32(StateWorldEffectsQuestObjectiveID); } - if (_changesMask[10]) + if (changesMask[10]) { data.WritePackedGuid(Charm); } - if (_changesMask[11]) + if (changesMask[11]) { data.WritePackedGuid(Summon); } - if (_changesMask[12]) + if (changesMask[12]) { data.WritePackedGuid(Critter); } - if (_changesMask[13]) + if (changesMask[13]) { data.WritePackedGuid(CharmedBy); } - if (_changesMask[14]) + if (changesMask[14]) { data.WritePackedGuid(SummonedBy); } - if (_changesMask[15]) + if (changesMask[15]) { data.WritePackedGuid(CreatedBy); } - if (_changesMask[16]) + if (changesMask[16]) { data.WritePackedGuid(DemonCreator); } - if (_changesMask[17]) + if (changesMask[17]) { data.WritePackedGuid(LookAtControllerTarget); } - if (_changesMask[18]) + if (changesMask[18]) { data.WritePackedGuid(Target); } - if (_changesMask[19]) + if (changesMask[19]) { data.WritePackedGuid(BattlePetCompanionGUID); } - if (_changesMask[20]) + if (changesMask[20]) { data.WriteUInt64(BattlePetDBID); } - if (_changesMask[21]) + if (changesMask[21]) { ((UnitChannel)ChannelData).WriteUpdate(data, fieldVisibilityFlags, owner, receiver); } - if (_changesMask[22]) + if (changesMask[22]) { data.WriteUInt32(SummonedByHomeRealm); } - if (_changesMask[23]) + if (changesMask[23]) { data.WriteUInt8(Race); } - if (_changesMask[24]) + if (changesMask[24]) { data.WriteUInt8(ClassId); } - if (_changesMask[25]) + if (changesMask[25]) { data.WriteUInt8(PlayerClassId); } - if (_changesMask[26]) + if (changesMask[26]) { data.WriteUInt8(Sex); } - if (_changesMask[27]) + if (changesMask[27]) { data.WriteUInt8(DisplayPower); } - if (_changesMask[28]) + if (changesMask[28]) { data.WriteUInt32(OverrideDisplayPowerID); } - if (_changesMask[29]) + if (changesMask[29]) { data.WriteUInt64(Health); } - if (_changesMask[30]) + if (changesMask[30]) { data.WriteUInt64(MaxHealth); } - if (_changesMask[31]) + if (changesMask[31]) { data.WriteUInt32(Level); } } - if (_changesMask[32]) + if (changesMask[32]) { - if (_changesMask[33]) + if (changesMask[33]) { data.WriteInt32(EffectiveLevel); } - if (_changesMask[34]) + if (changesMask[34]) { data.WriteInt32(ContentTuningID); } - if (_changesMask[35]) + if (changesMask[35]) { data.WriteInt32(ScalingLevelMin); } - if (_changesMask[36]) + if (changesMask[36]) { data.WriteInt32(ScalingLevelMax); } - if (_changesMask[37]) + if (changesMask[37]) { data.WriteInt32(ScalingLevelDelta); } - if (_changesMask[38]) + if (changesMask[38]) { data.WriteInt32(ScalingFactionGroup); } - if (_changesMask[39]) + if (changesMask[39]) { data.WriteInt32(ScalingHealthItemLevelCurveID); } - if (_changesMask[40]) + if (changesMask[40]) { data.WriteInt32(ScalingDamageItemLevelCurveID); } - if (_changesMask[41]) + if (changesMask[41]) { data.WriteUInt32(GetViewerDependentFactionTemplate(FactionTemplate, owner, receiver)); } - if (_changesMask[42]) + if (changesMask[42]) { data.WriteUInt32(GetViewerDependentFlags(Flags, owner, receiver)); } - if (_changesMask[43]) + if (changesMask[43]) { data.WriteUInt32(Flags2); } - if (_changesMask[44]) + if (changesMask[44]) { data.WriteUInt32(Flags3); } - if (_changesMask[45]) + if (changesMask[45]) { data.WriteUInt32(GetViewerDependentAuraState(AuraState, owner, receiver)); } - if (_changesMask[46]) + if (changesMask[46]) { data.WriteUInt32(RangedAttackRoundBaseTime); } - if (_changesMask[47]) + if (changesMask[47]) { data.WriteFloat(BoundingRadius); } - if (_changesMask[48]) + if (changesMask[48]) { data.WriteFloat(CombatReach); } - if (_changesMask[49]) + if (changesMask[49]) { data.WriteFloat(DisplayScale); } - if (_changesMask[50]) + if (changesMask[50]) { data.WriteUInt32(NativeDisplayID); } - if (_changesMask[51]) + if (changesMask[51]) { data.WriteFloat(NativeXDisplayScale); } - if (_changesMask[52]) + if (changesMask[52]) { data.WriteUInt32(MountDisplayID); } - if (_changesMask[53]) + if (changesMask[53]) { data.WriteInt32(CosmeticMountDisplayID); } - if (_changesMask[54]) + if (changesMask[54]) { data.WriteFloat(MinDamage); } - if (_changesMask[55]) + if (changesMask[55]) { data.WriteFloat(MaxDamage); } - if (_changesMask[56]) + if (changesMask[56]) { data.WriteFloat(MinOffHandDamage); } - if (_changesMask[57]) + if (changesMask[57]) { data.WriteFloat(MaxOffHandDamage); } - if (_changesMask[58]) + if (changesMask[58]) { data.WriteUInt8(StandState); } - if (_changesMask[59]) + if (changesMask[59]) { data.WriteUInt8(PetTalentPoints); } - if (_changesMask[60]) + if (changesMask[60]) { data.WriteUInt8(VisFlags); } - if (_changesMask[61]) + if (changesMask[61]) { data.WriteUInt8(AnimTier); } - if (_changesMask[62]) + if (changesMask[62]) { data.WriteUInt32(PetNumber); } - if (_changesMask[63]) + if (changesMask[63]) { data.WriteUInt32(PetNameTimestamp); } } - if (_changesMask[64]) + if (changesMask[64]) { - if (_changesMask[65]) + if (changesMask[65]) { data.WriteUInt32(PetExperience); } - if (_changesMask[66]) + if (changesMask[66]) { data.WriteUInt32(PetNextLevelExperience); } - if (_changesMask[67]) + if (changesMask[67]) { data.WriteFloat(ModCastingSpeed); } - if (_changesMask[68]) + if (changesMask[68]) { data.WriteFloat(ModSpellHaste); } - if (_changesMask[69]) + if (changesMask[69]) { data.WriteFloat(ModHaste); } - if (_changesMask[70]) + if (changesMask[70]) { data.WriteFloat(ModRangedHaste); } - if (_changesMask[71]) + if (changesMask[71]) { data.WriteFloat(ModHasteRegen); } - if (_changesMask[72]) + if (changesMask[72]) { data.WriteFloat(ModTimeRate); } - if (_changesMask[73]) + if (changesMask[73]) { data.WriteUInt32(CreatedBySpell); } - if (_changesMask[74]) + if (changesMask[74]) { data.WriteInt32(EmoteState); } - if (_changesMask[75]) + if (changesMask[75]) { data.WriteUInt32(BaseMana); } - if (_changesMask[76]) + if (changesMask[76]) { data.WriteUInt32(BaseHealth); } - if (_changesMask[77]) + if (changesMask[77]) { data.WriteUInt8(SheatheState); } - if (_changesMask[78]) + if (changesMask[78]) { data.WriteUInt8((byte)GetViewerDependentPvpFlags(PvpFlags, owner, receiver)); } - if (_changesMask[79]) + if (changesMask[79]) { data.WriteUInt8(PetFlags); } - if (_changesMask[80]) + if (changesMask[80]) { data.WriteUInt8(ShapeshiftForm); } - if (_changesMask[81]) + if (changesMask[81]) { data.WriteInt32(AttackPower); } - if (_changesMask[82]) + if (changesMask[82]) { data.WriteInt32(AttackPowerModPos); } - if (_changesMask[83]) + if (changesMask[83]) { data.WriteInt32(AttackPowerModNeg); } - if (_changesMask[84]) + if (changesMask[84]) { data.WriteFloat(AttackPowerMultiplier); } - if (_changesMask[85]) + if (changesMask[85]) { data.WriteInt32(RangedAttackPower); } - if (_changesMask[86]) + if (changesMask[86]) { data.WriteInt32(RangedAttackPowerModPos); } - if (_changesMask[87]) + if (changesMask[87]) { data.WriteInt32(RangedAttackPowerModNeg); } - if (_changesMask[88]) + if (changesMask[88]) { data.WriteFloat(RangedAttackPowerMultiplier); } - if (_changesMask[89]) + if (changesMask[89]) { data.WriteInt32(MainHandWeaponAttackPower); } - if (_changesMask[90]) + if (changesMask[90]) { data.WriteInt32(OffHandWeaponAttackPower); } - if (_changesMask[91]) + if (changesMask[91]) { data.WriteInt32(RangedWeaponAttackPower); } - if (_changesMask[92]) + if (changesMask[92]) { data.WriteInt32(SetAttackSpeedAura); } - if (_changesMask[93]) + if (changesMask[93]) { data.WriteFloat(Lifesteal); } - if (_changesMask[94]) + if (changesMask[94]) { data.WriteFloat(MinRangedDamage); } - if (_changesMask[95]) + if (changesMask[95]) { data.WriteFloat(MaxRangedDamage); } } - if (_changesMask[96]) + if (changesMask[96]) { - if (_changesMask[97]) + if (changesMask[97]) { data.WriteFloat(ManaCostModifierModifier); } - if (_changesMask[98]) + if (changesMask[98]) { data.WriteFloat(MaxHealthModifier); } - if (_changesMask[99]) + if (changesMask[99]) { data.WriteFloat(HoverHeight); } - if (_changesMask[100]) + if (changesMask[100]) { data.WriteUInt32(MinItemLevelCutoff); } - if (_changesMask[101]) + if (changesMask[101]) { data.WriteUInt32(MinItemLevel); } - if (_changesMask[102]) + if (changesMask[102]) { data.WriteUInt32(MaxItemLevel); } - if (_changesMask[103]) + if (changesMask[103]) { data.WriteInt32(AzeriteItemLevel); } - if (_changesMask[104]) + if (changesMask[104]) { data.WriteInt32(WildBattlePetLevel); } - if (_changesMask[105]) + if (changesMask[105]) { data.WriteUInt32(BattlePetCompanionNameTimestamp); } - if (_changesMask[106]) + if (changesMask[106]) { data.WriteInt32(InteractSpellID); } - if (_changesMask[107]) + if (changesMask[107]) { data.WriteInt32(ScaleDuration); } - if (_changesMask[108]) + if (changesMask[108]) { data.WriteInt32(SpellOverrideNameID); } - if (_changesMask[109]) + if (changesMask[109]) { data.WriteInt32(LooksLikeMountID); } - if (_changesMask[110]) + if (changesMask[110]) { data.WriteInt32(LooksLikeCreatureID); } - if (_changesMask[111]) + if (changesMask[111]) { data.WriteInt32(LookAtControllerID); } - if (_changesMask[112]) + if (changesMask[112]) { data.WriteInt32(TaxiNodesID); } - if (_changesMask[113]) + if (changesMask[113]) { data.WritePackedGuid(GuildGUID); } } - if (_changesMask[114]) + if (changesMask[114]) { for (int i = 0; i < 2; ++i) { - if (_changesMask[115 + i]) + if (changesMask[115 + i]) { data.WriteUInt32(GetViewerDependentNpcFlags(NpcFlags[i], i, owner, receiver)); } } } - if (_changesMask[117]) + if (changesMask[117]) { for (int i = 0; i < 6; ++i) { - if (_changesMask[118 + i]) + if (changesMask[118 + i]) { data.WriteInt32(Power[i]); } - if (_changesMask[124 + i]) + if (changesMask[124 + i]) { data.WriteUInt32(MaxPower[i]); } - if (_changesMask[130 + i]) + if (changesMask[130 + i]) { data.WriteFloat(PowerRegenFlatModifier[i]); } - if (_changesMask[136 + i]) + if (changesMask[136 + i]) { data.WriteFloat(PowerRegenInterruptedFlatModifier[i]); } } } - if (_changesMask[142]) + if (changesMask[142]) { for (int i = 0; i < 3; ++i) { - if (_changesMask[143 + i]) + if (changesMask[143 + i]) { VirtualItems[i].WriteUpdate(data, fieldVisibilityFlags, owner, receiver); } } } - if (_changesMask[146]) + if (changesMask[146]) { for (int i = 0; i < 2; ++i) { - if (_changesMask[147 + i]) + if (changesMask[147 + i]) { data.WriteUInt32(AttackRoundBaseTime[i]); } } } - if (_changesMask[149]) + if (changesMask[149]) { for (int i = 0; i < 4; ++i) { - if (_changesMask[150 + i]) + if (changesMask[150 + i]) { data.WriteInt32(Stats[i]); } - if (_changesMask[154 + i]) + if (changesMask[154 + i]) { data.WriteInt32(StatPosBuff[i]); } - if (_changesMask[158 + i]) + if (changesMask[158 + i]) { data.WriteInt32(StatNegBuff[i]); } } } - if (_changesMask[162]) + if (changesMask[162]) { for (int i = 0; i < 7; ++i) { - if (_changesMask[163 + i]) + if (changesMask[163 + i]) { data.WriteInt32(Resistances[i]); } - if (_changesMask[170 + i]) + if (changesMask[170 + i]) { data.WriteInt32(BonusResistanceMods[i]); } - if (_changesMask[177 + i]) + if (changesMask[177 + i]) { data.WriteInt32(PowerCostModifier[i]); } - if (_changesMask[184 + i]) + if (changesMask[184 + i]) { data.WriteFloat(PowerCostMultiplier[i]); } @@ -2323,22 +2322,22 @@ namespace Game.Entities } public void WriteUpdate(WorldPacket data, UpdateMask changesMask, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver) { - data.WriteBits(_changesMask.GetBlocksMask(0), 6); + data.WriteBits(changesMask.GetBlocksMask(0), 6); for (uint i = 0; i < 6; ++i) - if (_changesMask.GetBlock(i) != 0) - data.WriteBits(_changesMask.GetBlock(i), 32); + if (changesMask.GetBlock(i) != 0) + data.WriteBits(changesMask.GetBlock(i), 32); - if (_changesMask[0]) + if (changesMask[0]) { - if (_changesMask[1]) + if (changesMask[1]) { ArenaCooldowns.WriteUpdateMask(data); } } data.FlushBits(); - if (_changesMask[0]) + if (changesMask[0]) { - if (_changesMask[1]) + if (changesMask[1]) { for (int i = 0; i < ArenaCooldowns.Size(); ++i) { @@ -2349,158 +2348,159 @@ namespace Game.Entities } } } - if (_changesMask[2]) + if (changesMask[2]) { data.WritePackedGuid(DuelArbiter); } - if (_changesMask[3]) + if (changesMask[3]) { data.WritePackedGuid(WowAccount); } - if (_changesMask[4]) + if (changesMask[4]) { data.WritePackedGuid(LootTargetGUID); } - if (_changesMask[5]) + if (changesMask[5]) { data.WriteUInt32(PlayerFlags); } - if (_changesMask[6]) + if (changesMask[6]) { data.WriteUInt32(PlayerFlagsEx); } - if (_changesMask[7]) + if (changesMask[7]) { data.WriteUInt32(GuildRankID); } - if (_changesMask[8]) + if (changesMask[8]) { data.WriteUInt32(GuildDeleteDate); } - if (_changesMask[9]) + if (changesMask[9]) { data.WriteUInt32(GuildLevel); } - if (_changesMask[10]) + if (changesMask[10]) { data.WriteUInt8(SkinID); } - if (_changesMask[11]) + if (changesMask[11]) { data.WriteUInt8(FaceID); } - if (_changesMask[12]) + if (changesMask[12]) { data.WriteUInt8(HairStyleID); } - if (_changesMask[13]) + if (changesMask[13]) { data.WriteUInt8(HairColorID); } - if (_changesMask[14]) + if (changesMask[14]) { data.WriteUInt8(FacialHairStyleID); } - if (_changesMask[15]) + if (changesMask[15]) { data.WriteUInt8(PartyType); } - if (_changesMask[16]) + if (changesMask[16]) { data.WriteUInt8(NativeSex); } - if (_changesMask[17]) + if (changesMask[17]) { data.WriteUInt8(Inebriation); } - if (_changesMask[18]) + if (changesMask[18]) { data.WriteUInt8(PvpTitle); } - if (_changesMask[19]) + if (changesMask[19]) { data.WriteUInt8(ArenaFaction); } - if (_changesMask[20]) + if (changesMask[20]) { data.WriteUInt32(DuelTeam); } - if (_changesMask[21]) + if (changesMask[21]) { data.WriteInt32(GuildTimeStamp); } - if (_changesMask[22]) + if (changesMask[22]) { data.WriteUInt32(PlayerTitle); } - if (_changesMask[23]) + if (changesMask[23]) { data.WriteInt32(FakeInebriation); } - if (_changesMask[24]) + if (changesMask[24]) { data.WriteUInt32(VirtualPlayerRealm); } - if (_changesMask[25]) + if (changesMask[25]) { data.WriteUInt32(CurrentSpecID); } - if (_changesMask[26]) + if (changesMask[26]) { data.WriteInt32(TaxiMountAnimKitID); } - if (_changesMask[27]) + if (changesMask[27]) { data.WriteUInt8(CurrentBattlePetBreedQuality); } - if (_changesMask[28]) + if (changesMask[28]) { data.WriteUInt32(HonorLevel); } - if (_changesMask[29]) + if (changesMask[29]) { data.WriteInt32(Field_B0); } - if (_changesMask[30]) + if (changesMask[30]) { data.WriteInt32(Field_B4); } } - if (_changesMask[31]) + if (changesMask[31]) { for (int i = 0; i < 3; ++i) { - if (_changesMask[32 + i]) + if (changesMask[32 + i]) { data.WriteUInt8(CustomDisplayOption[i]); } } } - if (_changesMask[35]) + if (changesMask[35]) { for (int i = 0; i < 100; ++i) { - if (_changesMask[36 + i]) + if (changesMask[36 + i]) { QuestLog[i].WriteUpdate(data, fieldVisibilityFlags, owner, receiver); } } } - if (_changesMask[136]) + if (changesMask[136]) { for (int i = 0; i < 19; ++i) { - if (_changesMask[137 + i]) + if (changesMask[137 + i]) { + //todo needs fixed on clearing VisibleItems[i].WriteUpdate(data, fieldVisibilityFlags, owner, receiver); } } } - if (_changesMask[156]) + if (changesMask[156]) { for (int i = 0; i < 4; ++i) { - if (_changesMask[157 + i]) + if (changesMask[157 + i]) { data.WriteFloat(AvgItemLevel[i]); } diff --git a/Source/Game/Entities/Object/WorldObject.cs b/Source/Game/Entities/Object/WorldObject.cs index c5b90b542..72cbd3c9f 100644 --- a/Source/Game/Entities/Object/WorldObject.cs +++ b/Source/Game/Entities/Object/WorldObject.cs @@ -738,7 +738,7 @@ namespace Game.Entities return UpdateFieldFlag.None; } - void BuildValuesUpdateWithFlag(ByteBuffer data, UpdateFieldFlag flags, Player target) + public virtual void BuildValuesUpdateWithFlag(WorldPacket data, UpdateFieldFlag flags, Player target) { data.WriteUInt32(0); data.WriteUInt32(0); diff --git a/Source/Game/Entities/Player/Player.Groups.cs b/Source/Game/Entities/Player/Player.Groups.cs index 1be8a52f2..346202239 100644 --- a/Source/Game/Entities/Player/Player.Groups.cs +++ b/Source/Game/Entities/Player/Player.Groups.cs @@ -186,8 +186,7 @@ namespace Game.Entities public int NextGroupUpdateSequenceNumber(GroupCategory category) { - var groupUpdate = m_groupUpdateSequences[(int)category]; - return groupUpdate.UpdateSequenceNumber++; + return m_groupUpdateSequences[(int)category].UpdateSequenceNumber++; } public bool IsAtGroupRewardDistance(WorldObject pRewardSource) diff --git a/Source/Game/Entities/Player/Player.cs b/Source/Game/Entities/Player/Player.cs index ceebbd4fe..1a4400ec8 100644 --- a/Source/Game/Entities/Player/Player.cs +++ b/Source/Game/Entities/Player/Player.cs @@ -7544,7 +7544,7 @@ namespace Game.Entities data.WriteBytes(buffer); } - void BuildValuesUpdateWithFlag(WorldPacket data, UpdateFieldFlag flags, Player target) + public override void BuildValuesUpdateWithFlag(WorldPacket data, UpdateFieldFlag flags, Player target) { UpdateMask valuesMask = new UpdateMask((int)TypeId.Max); valuesMask.Set((int)TypeId.Unit); diff --git a/Source/Game/Entities/Player/PlayerTaxi.cs b/Source/Game/Entities/Player/PlayerTaxi.cs index d38518d1f..956f5f953 100644 --- a/Source/Game/Entities/Player/PlayerTaxi.cs +++ b/Source/Game/Entities/Player/PlayerTaxi.cs @@ -21,6 +21,7 @@ using Game.DataStorage; using Game.Network.Packets; using System.Collections.Generic; using System.Text; +using System; namespace Game.Entities { @@ -116,15 +117,18 @@ namespace Game.Entities public void AppendTaximaskTo(ShowTaxiNodes data, bool all) { + data.CanLandNodes = new byte[PlayerConst.TaxiMaskSize]; + data.CanUseNodes = new byte[PlayerConst.TaxiMaskSize]; + if (all) { - data.CanLandNodes = CliDB.TaxiNodesMask; // all existed nodes - data.CanUseNodes = CliDB.TaxiNodesMask; + Buffer.BlockCopy(CliDB.TaxiNodesMask, 0, data.CanLandNodes, 0, PlayerConst.TaxiMaskSize); // all existed nodes + Buffer.BlockCopy(CliDB.TaxiNodesMask, 0, data.CanLandNodes, 0, PlayerConst.TaxiMaskSize); } else { - data.CanLandNodes = m_taximask; // known nodes - data.CanUseNodes = m_taximask; + Buffer.BlockCopy(m_taximask, 0, data.CanLandNodes, 0, PlayerConst.TaxiMaskSize); // known nodes + Buffer.BlockCopy(m_taximask, 0, data.CanUseNodes, 0, PlayerConst.TaxiMaskSize); } } diff --git a/Source/Game/Entities/Unit/Unit.cs b/Source/Game/Entities/Unit/Unit.cs index 51983b6c0..d5bd4587b 100644 --- a/Source/Game/Entities/Unit/Unit.cs +++ b/Source/Game/Entities/Unit/Unit.cs @@ -2729,7 +2729,7 @@ namespace Game.Entities data.WriteBytes(buffer); } - void BuildValuesUpdateWithFlag(WorldPacket data, UpdateFieldFlag flags, Player target) + public override void BuildValuesUpdateWithFlag(WorldPacket data, UpdateFieldFlag flags, Player target) { UpdateMask valuesMask = new UpdateMask(14); valuesMask.Set((int)TypeId.Unit); diff --git a/Source/Game/Groups/Group.cs b/Source/Game/Groups/Group.cs index 7cb28d695..ea3cb5f99 100644 --- a/Source/Game/Groups/Group.cs +++ b/Source/Game/Groups/Group.cs @@ -133,7 +133,7 @@ namespace Game.Groups m_lootThreshold = (ItemQuality)field.Read(3); for (byte i = 0; i < MapConst.TargetIconsCount; ++i) - m_targetIcons[i].SetRawValue(field.Read(4 + i).ToByteArray()); + m_targetIcons[i].SetRawValue(field.Read(4 + i)); m_groupFlags = (GroupFlags)field.Read(12); if (m_groupFlags.HasAnyFlag(GroupFlags.Raid)) @@ -910,19 +910,20 @@ namespace Game.Groups public void GroupLoot(Loot loot, WorldObject lootedObject) { byte itemSlot = 0; - foreach (var i in loot.items) + for (var i = 0; i < loot.items.Count; ++i, ++itemSlot) { - if (i.freeforall) + LootItem lootItem = loot.items[i]; + if (lootItem.freeforall) continue; - ItemTemplate item = Global.ObjectMgr.GetItemTemplate(i.itemid); + ItemTemplate item = Global.ObjectMgr.GetItemTemplate(lootItem.itemid); if (item == null) continue; //roll for over-threshold item if it's one-player loot if (item.GetQuality() >= m_lootThreshold) { - Roll r = new Roll(i); + Roll r = new Roll(lootItem); for (GroupReference refe = GetFirstMember(); refe != null; refe = refe.next()) { @@ -930,7 +931,7 @@ namespace Game.Groups if (!playerToRoll || playerToRoll.GetSession() == null) continue; - bool allowedForPlayer = i.AllowedForPlayer(playerToRoll); + bool allowedForPlayer = lootItem.AllowedForPlayer(playerToRoll); if (allowedForPlayer && playerToRoll.IsAtGroupRewardDistance(lootedObject)) { r.totalPlayersRolling++; @@ -984,7 +985,7 @@ namespace Game.Groups } } else - i.is_underthreshold = true; + lootItem.is_underthreshold = true; } foreach (var i in loot.quest_items) @@ -1076,15 +1077,15 @@ namespace Game.Groups if (roll == null) return; - var rollType = roll.playerVote.LookupByKey(playerGuid); // this condition means that player joins to the party after roll begins - if (rollType == 0) + if (!roll.playerVote.ContainsKey(playerGuid)) return; if (roll.getLoot() != null) if (roll.getLoot().items.Empty()) return; + RollType rollType = RollType.MaxTypes; switch (choice) { case RollType.Pass: // Player choose pass @@ -1109,13 +1110,15 @@ namespace Game.Groups break; } + roll.playerVote[playerGuid] = rollType; + if (roll.totalPass + roll.totalNeed + roll.totalGreed >= roll.totalPlayersRolling) CountTheRoll(roll, null); } public void EndRoll(Loot pLoot, Map allowedMap) { - foreach (var roll in RollId) + foreach (var roll in RollId.ToList()) { if (roll.getLoot() == pLoot) { @@ -1902,7 +1905,7 @@ namespace Game.Groups if (difficultyDic == null) return; - foreach (var pair in difficultyDic) + foreach (var pair in difficultyDic.ToList()) { InstanceSave instanceSave = pair.Value.save; MapRecord entry = CliDB.MapStorage.LookupByKey(pair.Key); @@ -2484,7 +2487,7 @@ namespace Game.Groups Roll GetRoll(ObjectGuid lootObjectGuid, byte lootListId) { foreach (var roll in RollId) - if (roll.getTarget().GetGUID() == lootObjectGuid && roll.itemSlot == lootListId && roll.isValid()) + if (roll.getTarget() != null && roll.getTarget().GetGUID() == lootObjectGuid && roll.itemSlot == lootListId && roll.isValid()) return roll; return null; } diff --git a/Source/Game/Groups/GroupManager.cs b/Source/Game/Groups/GroupManager.cs index 2a0d4cd50..c201bbd47 100644 --- a/Source/Game/Groups/GroupManager.cs +++ b/Source/Game/Groups/GroupManager.cs @@ -71,10 +71,7 @@ namespace Game.Groups public Group GetGroupByDbStoreId(uint storageId) { - if (storageId < GroupDbStore.Count) - return GroupDbStore[storageId]; - - return null; + return GroupDbStore.LookupByKey(storageId); } public ulong GenerateGroupId() diff --git a/Source/Game/Handlers/QueryHandler.cs b/Source/Game/Handlers/QueryHandler.cs index 838426749..8ed6822a0 100644 --- a/Source/Game/Handlers/QueryHandler.cs +++ b/Source/Game/Handlers/QueryHandler.cs @@ -128,6 +128,8 @@ namespace Game queryCreatureResponse.Stats.NameAlt[0] = nameAlt; } } + + SendPacket(queryCreatureResponse); } else { diff --git a/Source/Game/Network/Packets/PartyPackets.cs b/Source/Game/Network/Packets/PartyPackets.cs index 68d636530..d39afe1de 100644 --- a/Source/Game/Network/Packets/PartyPackets.cs +++ b/Source/Game/Network/Packets/PartyPackets.cs @@ -1032,7 +1032,7 @@ namespace Game.Network.Packets public void Write(WorldPacket data) { data.WriteBits(Name.GetByteCount(), 6); - data.WriteBits(VoiceStateID.GetByteCount(), 6); + data.WriteBits(VoiceStateID.GetByteCount() + 1, 6); data.WriteBit(FromSocialQueue); data.WriteBit(VoiceChatSilenced); data.WritePackedGuid(GUID);