Main/Assets/Code/Logic/DropAscription/DropAscriptionSystem.cs

105 lines
3.5 KiB
C#
Raw Normal View History

2025-01-25 04:38:09 +08:00
using Thousandto.Code.Center;
using Thousandto.Code.Global;
using System.Collections.Generic;
namespace Thousandto.Code.Logic
{
//掉落归属系统
public class DropAscriptionSystem
{
#region//私有变量
private Dictionary<ulong, Dictionary<ulong, int>> _playerDropMonsters = new Dictionary<ulong, Dictionary<ulong, int>>();
private Dictionary<ulong, ulong> _monsterTopRankPlayer = new Dictionary<ulong, ulong>();
#endregion
#region//函数
//改变消息
public void UpdateMonsterDropOwners(ulong monsterID, List<long> owners)
{
if(owners == null || owners.Count <= 0)
{
_monsterTopRankPlayer.Remove(monsterID);
}
else
{
_monsterTopRankPlayer[monsterID] = (ulong)owners[0];
}
//先移除这个monster的所有数据
var removeList = new List<ulong>(_playerDropMonsters.Count);
var iterPlayer = _playerDropMonsters.GetEnumerator();
while (iterPlayer.MoveNext())
{
var valueDic = iterPlayer.Current.Value;
if (valueDic.ContainsKey(monsterID))
{
valueDic.Remove(monsterID);
}
if (valueDic.Count <= 0)
{
//此玩家已经不在任何列表了,移除他
removeList.Add(iterPlayer.Current.Key);
}
}
for (int i = 0; i < removeList.Count; ++i)
{
_playerDropMonsters.Remove(removeList[i]);
}
if (owners != null && owners.Count > 0)
{
//重新设置这个monster的所有数据只需要前三个目标数据
for (int i = 0; i < owners.Count && i < 3; ++i)
{
Dictionary<ulong, int> curMonsterDic = null;
if(!_playerDropMonsters.TryGetValue((ulong)owners[i], out curMonsterDic))
{
curMonsterDic = new Dictionary<ulong, int>();
_playerDropMonsters.Add((ulong)owners[i], curMonsterDic);
}
curMonsterDic[monsterID] = i;
}
}
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_HUD_UPDATE_DROPINFO);
}
//获取玩家最高排名
public int GetPlayerMaxRank(ulong roleID, out ulong monsterId)
{
int result = int.MaxValue;
monsterId = 0;
Dictionary<ulong, int> curMonsterDic = null;
if(_playerDropMonsters.TryGetValue(roleID, out curMonsterDic))
{
var iter = curMonsterDic.GetEnumerator();
try
{
while(iter.MoveNext())
{
if(iter.Current.Value < result)
{
monsterId = iter.Current.Key;
result = iter.Current.Value;
}
}
}
finally
{
iter.Dispose();
}
}
return result;
}
//获取第一名的玩家id
public ulong GetRankTopPlayerID(ulong monsterID)
{
ulong result = 0;
_monsterTopRankPlayer.TryGetValue(monsterID, out result);
return result;
}
#endregion
}
}