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];
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)
+1 -1
View File
@@ -9112,7 +9112,7 @@ namespace Game
if (!result.IsEmpty())
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())
_equipmentSetGuid = result.Read<ulong>(0) + 1;
+17 -11
View File
@@ -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);