123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284 |
- using System;
- using System.Collections.Generic;
- using System.Text;
- using CommonAI.Zone.Instance;
- using CommonAI.Zone.Formula;
- using CommonLang;
- using CommonLang.Vector;
- namespace CommonAI.Zone.Helper
- {
- public abstract class HateSystem : IComparer<HateSystem.HateInfo>
- {
- public class HateInfo
- {
- public InstanceUnit Unit;
- public long HateValue;
- public int hitNums; //连击数
- public HateInfo(InstanceUnit unit)
- {
- this.Unit = unit;
- this.HateValue = 0;
- this.hitNums = 0;
- }
- }
- private InstanceUnit owner;
- private TimeInterval<int> m_Timer;
- private int m_Capacity;
- protected readonly HashMap<uint, HateInfo> unitMap = new HashMap<uint, HateInfo>();
- protected readonly List<HateInfo> unitList = new List<HateInfo>(); // 第一个是仇恨值最高的
- public int Count
- {
- get { return unitList.Count; }
- }
- public int Capacity
- {
- get { return m_Capacity; }
- }
- public InstanceUnit Owner
- {
- get { return owner; }
- }
- public HateSystem(InstanceUnit owner) :
- this(owner, owner.Templates.CFG.AI_HATE_SYSTEM_CAPACITY_MS, owner.Templates.CFG.AI_NPC_CHECK_IN_GUARD_LIMIT_TIME_MS)
- {
- }
- public HateSystem(InstanceUnit owner, int capacity, int updateIntervalMS)
- {
- this.owner = owner;
- this.m_Capacity = capacity;
- this.m_Timer = new TimeInterval<int>(updateIntervalMS);
- }
- protected virtual void onTargetAdded(HateInfo target) { }
- protected virtual void onTargetRemoved(HateInfo target) { }
- protected virtual void onOwnerHitted(HateInfo attacker, AttackSource attack, int reduceHP)
- {
- attacker.HateValue += reduceHP;
- }
-
- public void OnHitted(InstanceUnit attacker, AttackSource attack, int reduceHP)
- {
- HateInfo ret = Add(attacker);
- onOwnerHitted(ret, attack, reduceHP);
- Sort();
- }
- public HateInfo Add(InstanceUnit target)
- {
- HateInfo ret;
- if (!unitMap.TryGetValue(target.ID, out ret))
- {
- ret = new HateInfo(target);
- unitMap.Add(target.ID, ret);
- unitList.Add(ret);
- onTargetAdded(ret);
- }
- return ret;
- }
- public void Remove(InstanceUnit unit)
- {
- HateInfo u = unitMap.RemoveByKey(unit.ID);
- if (u != null)
- {
- unitList.Remove(u);
- onTargetRemoved(u);
- }
- }
- public bool Contains(InstanceUnit unit)
- {
- return unitMap.ContainsKey(unit.ID);
- }
- public bool ContainsID(uint unitID)
- {
- return unitMap.ContainsKey(unitID);
- }
- public HateInfo getHateInfo(uint unitId)
- {
- return this.unitMap.Get(unitId);
- }
- public virtual void Reset()
- {
- for (int i = 0; i < unitList.Count; ++i)
- {
- HateInfo u = unitList[i];
- u.HateValue = 0;
- }
- this.Sort();
- }
- public virtual void Update(int intervalMS)
- {
- if (unitList.Count > 0 && m_Timer.Update(intervalMS))
- {
- this.Sort();
- while (unitList.Count > m_Capacity)
- {
- int i = unitList.Count - 1;
- HateInfo u = unitList[i];
- unitList.RemoveAt(i);
- unitMap.Remove(u.Unit.ID);
- onTargetRemoved(u);
- }
- for (int i = 0; i < unitList.Count; ++i)
- {
- HateInfo u = unitList[i];
- if (u.Unit.Enable && u.Unit.IsActive)
- {
- }
- else
- {
- unitList.RemoveAt(i);
- unitMap.Remove(u.Unit.ID);
- onTargetRemoved(u);
- i--;
- }
- }
- }
- }
- public virtual void Sort()
- {
- unitList.Sort(this);
- }
- public virtual void Clear()
- {
- for (int i = 0; i < unitList.Count; ++i)
- {
- HateInfo u = unitList[i];
- onTargetRemoved(u);
- }
- unitMap.Clear();
- unitList.Clear();
- }
- /// <summary>
- /// 当前首要目标
- /// </summary>
- public virtual InstanceUnit GetHated(bool onlyMonster = false)
- {
- for (int i = 0; i < unitList.Count; ++i)
- {
- HateInfo u = unitList[i];
- if (u.Unit.Enable && u.Unit.IsActive)
- {
- // 现在宠物也能拉仇恨,死亡了
- //if(u.Unit is InstancePet)
- //{
- // return (u.Unit as InstancePet).Master;
- //}
- //Console.WriteLine(" ------ getHated -- " + u.Unit.Name + ", " + unitList.Count + ", index = " + i);
- if(!onlyMonster || (onlyMonster && u.Unit.IsMonster))
- {
- return u.Unit;
- }
- }
- else
- {
- unitList.RemoveAt(i);
- unitMap.Remove(u.Unit.ID);
- onTargetRemoved(u);
- i--;
- }
- }
- return null;
- }
- /// <summary>
- /// 强制删除buff追击目标
- /// </summary>
- public virtual void forceRemoveAtkTraget() {}
- public virtual int updateHateList(float guargRangeLimit, Vector2 orginPosition)
- {
- for (int i = 0; i < unitList.Count; ++i)
- {
- HateInfo u = unitList[i];
- if (!u.Unit.Enable || !u.Unit.IsActive || !CMath.intersectRound(u.Unit.X, u.Unit.Y, u.Unit.BodyBlockSize, orginPosition.X, orginPosition.Y, guargRangeLimit))
- {
- unitList.RemoveAt(i);
- unitMap.Remove(u.Unit.ID);
- onTargetRemoved(u);
- //Console.WriteLine(" - - - - updateHateList : " + u.Unit.Name);
- i--;
- }
- }
- return unitMap.Count;
- }
- public void print()
- {
- for (int i = 0; i < unitList.Count; ++i)
- {
- HateInfo u = unitList[i];
- Console.WriteLine(" - - - - print hate : " + u.Unit.Name);
- }
- }
- public virtual int GetHateList(List<HateInfo> ret)
- {
- int count = 0;
- for (int i = 0; i < unitList.Count; ++i)
- {
- HateInfo u = unitList[i];
- if (u.Unit.Enable && u.Unit.IsActive)
- {
- ret.Add(u);
- count++;
- }
- else
- {
- unitList.RemoveAt(i);
- unitMap.Remove(u.Unit.ID);
- onTargetRemoved(u);
- i--;
- }
- }
- return count;
- }
- public string GetHatePlayerInfo()
- {
- string hateInfo = "";
- for (int i = 0; i < unitList.Count; ++i)
- {
- if (unitList[i].Unit.IsPlayer)
- {
- hateInfo = hateInfo + "_" + unitList[i].Unit.PlayerUUID;
- }
- else
- {
- hateInfo = hateInfo + "#" + unitList[i].Unit.Info.ID;
- }
- }
- return hateInfo;
- }
- public int getHateSize()
- {
- return unitMap.Count;
- }
- public virtual int Compare(HateSystem.HateInfo x, HateSystem.HateInfo y)
- {
- //Console.WriteLine(" - - - - x:" + x.HateValue + ", y:" + y.HateValue);
- long value = y.HateValue - x.HateValue;
- if(value != 0)
- {
- return value > 0 ? 1 : -1;
- }
- return 0;
- }
- }
- }
|