Skip to content

Commit

Permalink
Fixes for master loot
Browse files Browse the repository at this point in the history
Fix master loot not working if someone else looted first - use the list sent by the server for consequent loot attempts like in old client
Fix master loot not working after dc/logout - use group members list like in old client
  • Loading branch information
celguar committed Oct 30, 2023
1 parent e69e729 commit 8bf5295
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 15 deletions.
2 changes: 2 additions & 0 deletions HermesProxy/GlobalSessionData.cs
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,8 @@ public class GameSessionData
public List<ClientCastRequest> PendingClientCasts = new List<ClientCastRequest>();
public List<ClientCastRequest> PendingClientPetCasts = new List<ClientCastRequest>();
public WowGuid64 LastLootTargetGuid;
public List<WowGuid128> MasterLootPlayersList = new();
public List<WowGuid128> MasterLootPlayersListSent = new();
public List<int> ActionButtons = new();
public Dictionary<WowGuid128, Dictionary<byte, int>> UnitAuraDurationUpdateTime = new();
public Dictionary<WowGuid128, Dictionary<byte, int>> UnitAuraDurationLeft = new();
Expand Down
57 changes: 42 additions & 15 deletions HermesProxy/World/Client/PacketHandlers/LootHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,43 @@ void HandleLootResponse(WorldPacket packet)
loot.Items.Add(lootItem);
}
SendPacketToClient(loot);

// send master loot list
if (loot.LootMethod == LootMethod.MasterLoot &&
GetSession().GameState.CurrentGroups[0] != null &&
GetSession().GameState.CurrentGroups[0].LootSettings.Method == LootMethod.MasterLoot &&
GetSession().GameState.CurrentGroups[0].LootSettings.LootMaster == GetSession().GameState.CurrentPlayerGuid &&
!GetSession().GameState.MasterLootPlayersListSent.Contains(loot.LootObj))
{
LootList lootList = new LootList();
lootList.Owner = loot.Owner;
lootList.LootObj = loot.LootObj;
lootList.Master = GetSession().GameState.CurrentPlayerGuid;
SendPacketToClient(lootList);

MasterLootCandidateList list = new MasterLootCandidateList();
list.LootObj = loot.LootObj;
// use the latest list sent by server
if (GetSession().GameState.MasterLootPlayersList.Count != 0)
{
foreach (var guid in GetSession().GameState.MasterLootPlayersList)
{
list.Players.Add(guid);
}
}
// use group list instead (after logout/dc)
else
{
foreach (var player in GetSession().GameState.CurrentGroups[0].PlayerList)
{
list.Players.Add(player.GUID);
}
}
SendPacketToClient(list);

// mark as sent
GetSession().GameState.MasterLootPlayersListSent.Add(loot.LootObj);
}
}

[PacketHandler(Opcode.SMSG_LOOT_RELEASE)]
Expand Down Expand Up @@ -193,24 +230,14 @@ void HandleLootAllPassed(WorldPacket packet)
[PacketHandler(Opcode.SMSG_LOOT_MASTER_LIST)]
void HandleLootMasterList(WorldPacket packet)
{
if (GetSession().GameState.LastLootTargetGuid == null)
return;

LootList list = new LootList();
list.Owner = GetSession().GameState.LastLootTargetGuid.To128(GetSession().GameState);
list.LootObj = GetSession().GameState.LastLootTargetGuid.ToLootGuid();
list.Master = GetSession().GameState.CurrentPlayerGuid;
SendPacketToClient(list);

MasterLootCandidateList loot = new MasterLootCandidateList();
loot.LootObj = GetSession().GameState.LastLootTargetGuid.ToLootGuid();
byte count = packet.ReadUInt8();
for (byte i = 0; i < count; i++)
// save this list for consequent loot attempts
GetSession().GameState.MasterLootPlayersList.Clear();
byte num = packet.ReadUInt8();
for (byte i = 0; i < num; i++)
{
WowGuid128 guid = packet.ReadGuid().To128(GetSession().GameState);
loot.Players.Add(guid);
GetSession().GameState.MasterLootPlayersList.Add(guid);
}
SendPacketToClient(loot);
}
}
}

0 comments on commit 8bf5295

Please sign in to comment.