Core/Player: Fix equipment set GUID handling

Core/Items: Fixed saving and equipping sets with empty slots
This commit is contained in:
hondacrx
2018-04-12 10:08:38 -04:00
parent ce9815d557
commit 04539f0bd2
3 changed files with 23 additions and 16 deletions
+5 -4
View File
@@ -6590,13 +6590,14 @@ namespace Game.Entities
} }
} }
EquipmentSetInfo eqSlot = _equipmentSets[newEqSet.Guid]; ulong setGuid = (newEqSet.Guid != 0) ? newEqSet.Guid : Global.ObjectMgr.GenerateEquipmentSetGuid();
EquipmentSetUpdateState old_state = eqSlot.state;
EquipmentSetInfo eqSlot = _equipmentSets[setGuid];
eqSlot.Data = newEqSet; eqSlot.Data = newEqSet;
if (eqSlot.Data.Guid == 0) if (eqSlot.Data.Guid == 0)
{ {
eqSlot.Data.Guid = Global.ObjectMgr.GenerateEquipmentSetGuid(); eqSlot.Data.Guid = setGuid;
EquipmentSetID data = new EquipmentSetID(); EquipmentSetID data = new EquipmentSetID();
data.GUID = eqSlot.Data.Guid; data.GUID = eqSlot.Data.Guid;
@@ -6605,7 +6606,7 @@ namespace Game.Entities
SendPacket(data); 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) public void DeleteEquipmentSet(ulong id)
+1 -1
View File
@@ -9112,7 +9112,7 @@ namespace Game
if (!result.IsEmpty()) if (!result.IsEmpty())
Global.ArenaTeamMgr.SetNextArenaTeamId(result.Read<uint>(0) + 1); Global.ArenaTeamMgr.SetNextArenaTeamId(result.Read<uint>(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()) if (!result.IsEmpty())
_equipmentSetGuid = result.Read<ulong>(0) + 1; _equipmentSetGuid = result.Read<ulong>(0) + 1;
+17 -11
View File
@@ -1325,16 +1325,20 @@ namespace Game
saveEquipmentSet.Set.Appearances[i] = 0; saveEquipmentSet.Set.Appearances[i] = 0;
ObjectGuid itemGuid = saveEquipmentSet.Set.Pieces[i]; 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) /// cheating check 2 (sent guid does not match equipped item)
if (!item && !itemGuid.IsEmpty()) if (item.GetGUID() != itemGuid)
return; return;
}
/// cheating check 2 (sent guid does not match equipped item) else
if (item && item.GetGUID() != itemGuid) saveEquipmentSet.Set.IgnoreMask |= 1u << i;
return;
} }
else else
{ {
@@ -1344,10 +1348,12 @@ namespace Game
if (!CliDB.ItemModifiedAppearanceStorage.ContainsKey(saveEquipmentSet.Set.Appearances[i])) if (!CliDB.ItemModifiedAppearanceStorage.ContainsKey(saveEquipmentSet.Set.Appearances[i]))
return; return;
var pairValue = GetCollectionMgr().HasItemAppearance((uint)saveEquipmentSet.Set.Appearances[i]); (bool hasAppearance, bool isTemporary) = GetCollectionMgr().HasItemAppearance((uint)saveEquipmentSet.Set.Appearances[i]);
if (!pairValue.Item1) if (!hasAppearance)
return; return;
} }
else
saveEquipmentSet.Set.IgnoreMask |= 1u << i;
} }
} }
else else
@@ -1403,7 +1409,7 @@ namespace Game
[WorldPacketHandler(ClientOpcodes.UseEquipmentSet)] [WorldPacketHandler(ClientOpcodes.UseEquipmentSet)]
void HandleUseEquipmentSet(UseEquipmentSet 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) 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); Log.outDebug(LogFilter.Player, "{0}: ContainerSlot: {1}, Slot: {2}", useEquipmentSet.Items[i].Item.ToString(), useEquipmentSet.Items[i].ContainerSlot, useEquipmentSet.Items[i].Slot);