From 04539f0bd24fdde771cb88fd1b666f3f56f3bfbe Mon Sep 17 00:00:00 2001 From: hondacrx Date: Thu, 12 Apr 2018 10:08:38 -0400 Subject: [PATCH] Core/Player: Fix equipment set GUID handling Core/Items: Fixed saving and equipping sets with empty slots --- Source/Game/Entities/Player/Player.Items.cs | 9 ++++--- Source/Game/Globals/ObjectManager.cs | 2 +- Source/Game/Handlers/CharacterHandler.cs | 28 +++++++++++++-------- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/Source/Game/Entities/Player/Player.Items.cs b/Source/Game/Entities/Player/Player.Items.cs index 437752265..ea0cc5b18 100644 --- a/Source/Game/Entities/Player/Player.Items.cs +++ b/Source/Game/Entities/Player/Player.Items.cs @@ -6590,13 +6590,14 @@ namespace Game.Entities } } - EquipmentSetInfo eqSlot = _equipmentSets[newEqSet.Guid]; - EquipmentSetUpdateState old_state = eqSlot.state; + ulong setGuid = (newEqSet.Guid != 0) ? newEqSet.Guid : Global.ObjectMgr.GenerateEquipmentSetGuid(); + + EquipmentSetInfo eqSlot = _equipmentSets[setGuid]; eqSlot.Data = newEqSet; if (eqSlot.Data.Guid == 0) { - eqSlot.Data.Guid = Global.ObjectMgr.GenerateEquipmentSetGuid(); + eqSlot.Data.Guid = setGuid; EquipmentSetID data = new EquipmentSetID(); data.GUID = eqSlot.Data.Guid; @@ -6605,7 +6606,7 @@ namespace Game.Entities SendPacket(data); } - eqSlot.state = old_state == EquipmentSetUpdateState.New ? EquipmentSetUpdateState.New : EquipmentSetUpdateState.Changed; + eqSlot.state = eqSlot.state == EquipmentSetUpdateState.New ? EquipmentSetUpdateState.New : EquipmentSetUpdateState.Changed; } public void DeleteEquipmentSet(ulong id) diff --git a/Source/Game/Globals/ObjectManager.cs b/Source/Game/Globals/ObjectManager.cs index b895a6e1c..f4150d0ef 100644 --- a/Source/Game/Globals/ObjectManager.cs +++ b/Source/Game/Globals/ObjectManager.cs @@ -9112,7 +9112,7 @@ namespace Game if (!result.IsEmpty()) Global.ArenaTeamMgr.SetNextArenaTeamId(result.Read(0) + 1); - result = DB.Characters.Query("SELECT MAX(setguid) FROM character_equipmentsets"); + result = DB.Characters.Query("SELECT MAX(maxguid) FROM ((SELECT MAX(setguid) AS maxguid FROM character_equipmentsets) UNION (SELECT MAX(setguid) AS maxguid FROM character_transmog_outfits)) allsets"); if (!result.IsEmpty()) _equipmentSetGuid = result.Read(0) + 1; diff --git a/Source/Game/Handlers/CharacterHandler.cs b/Source/Game/Handlers/CharacterHandler.cs index 1027ab86b..df218eb5a 100644 --- a/Source/Game/Handlers/CharacterHandler.cs +++ b/Source/Game/Handlers/CharacterHandler.cs @@ -1325,16 +1325,20 @@ namespace Game saveEquipmentSet.Set.Appearances[i] = 0; ObjectGuid itemGuid = saveEquipmentSet.Set.Pieces[i]; + if (!itemGuid.IsEmpty()) + { + Item item = _player.GetItemByPos(InventorySlots.Bag0, i); - Item item = _player.GetItemByPos(InventorySlots.Bag0, i); + /// cheating check 1 (item equipped but sent empty guid) + if (!item) + return; - /// cheating check 1 (item equipped but sent empty guid) - if (!item && !itemGuid.IsEmpty()) - return; - - /// cheating check 2 (sent guid does not match equipped item) - if (item && item.GetGUID() != itemGuid) - return; + /// cheating check 2 (sent guid does not match equipped item) + if (item.GetGUID() != itemGuid) + return; + } + else + saveEquipmentSet.Set.IgnoreMask |= 1u << i; } else { @@ -1344,10 +1348,12 @@ namespace Game if (!CliDB.ItemModifiedAppearanceStorage.ContainsKey(saveEquipmentSet.Set.Appearances[i])) return; - var pairValue = GetCollectionMgr().HasItemAppearance((uint)saveEquipmentSet.Set.Appearances[i]); - if (!pairValue.Item1) + (bool hasAppearance, bool isTemporary) = GetCollectionMgr().HasItemAppearance((uint)saveEquipmentSet.Set.Appearances[i]); + if (!hasAppearance) return; } + else + saveEquipmentSet.Set.IgnoreMask |= 1u << i; } } else @@ -1403,7 +1409,7 @@ namespace Game [WorldPacketHandler(ClientOpcodes.UseEquipmentSet)] void HandleUseEquipmentSet(UseEquipmentSet useEquipmentSet) { - ObjectGuid ignoredItemGuid = new ObjectGuid(0, 1); + ObjectGuid ignoredItemGuid = new ObjectGuid(0x0C00040000000000, 0xFFFFFFFFFFFFFFFF); for (byte i = 0; i < EquipmentSlot.End; ++i) { Log.outDebug(LogFilter.Player, "{0}: ContainerSlot: {1}, Slot: {2}", useEquipmentSet.Items[i].Item.ToString(), useEquipmentSet.Items[i].ContainerSlot, useEquipmentSet.Items[i].Slot);