Core/Player: Fix equipment set GUID handling
Core/Items: Fixed saving and equipping sets with empty slots
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user