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];
|
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)
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user