Triggers.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using CommonLang;
  5. using CommonAI.RTS;
  6. using CommonLang.Vector;
  7. using CommonAI.RTS.Manhattan;
  8. using CommonAI.Zone.Helper;
  9. using CommonAI.Zone.ZoneEditor;
  10. using CommonLang.Log;
  11. namespace CommonAI.Zone.Instance
  12. {
  13. public class Ability : IDisposable
  14. {
  15. public InstanceZone Zone { get; private set; }
  16. public Ability(InstanceZone zone)
  17. {
  18. this.Zone = zone;
  19. }
  20. public virtual void Dispose()
  21. {
  22. }
  23. }
  24. //-------------------------------------------------------------------------------------------
  25. public class TransportUnitTrigger : Ability
  26. {
  27. public string Name { get; private set; }
  28. public string NextPositionName;
  29. public UnitInfo.UnitType AcceptUnitType = UnitInfo.UnitType.TYPE_PLAYER;
  30. public bool AcceptUnitTypeForAll = false;
  31. public byte AcceptForce = 0;
  32. public bool AcceptForceForAll = false;
  33. public LaunchEffect TransportEffect;
  34. private InstanceFlag mNext;
  35. private ZoneRegion mOwner;
  36. public TransportUnitTrigger(InstanceZone zone, string name)
  37. : base(zone)
  38. {
  39. this.Name = name;
  40. }
  41. public void bindToRegion(ZoneRegion region)
  42. {
  43. InstanceZone zone = region.Parent;
  44. this.mNext = zone.getFlag(this.NextPositionName);
  45. this.mOwner = region;
  46. if (mNext != null)
  47. {
  48. region.OnUnitEnter += this.onUnitEnter;
  49. }
  50. }
  51. private bool Select(InstanceUnit unit)
  52. {
  53. if (!AcceptUnitTypeForAll && unit.Info.UType != this.AcceptUnitType)
  54. {
  55. return false;
  56. }
  57. if (!AcceptForceForAll && unit.Force != this.AcceptForce)
  58. {
  59. return false;
  60. }
  61. return true;
  62. }
  63. private void onUnitEnter(ZoneRegion region, InstanceUnit obj)
  64. {
  65. if (Select(obj))
  66. {
  67. if (TransportEffect != null)
  68. {
  69. mOwner.Parent.queueEvent(new AddEffectEvent(0, region.X, region.Y, region.Direction, TransportEffect));
  70. }
  71. obj.transport(mNext.X, mNext.Y);
  72. obj.resetAI();
  73. ZoneRegion rg = mNext as ZoneRegion;
  74. if (rg != null)
  75. {
  76. rg.addInRegionViewed(obj);
  77. }
  78. }
  79. }
  80. }
  81. public class RegionDamageTrigger : Ability
  82. {
  83. public static Logger log = LoggerFactory.GetDefLogger();
  84. private RegionDamageAbilityData mData;
  85. // 间隔触发器
  86. private TimeTaskMS mTimeTask;
  87. //初始化标记
  88. private bool mInit;
  89. //区域内单位
  90. private List<InstanceUnit> mReginUnit = new List<InstanceUnit>();
  91. public RegionDamageTrigger(InstanceZone scene, RegionDamageAbilityData data)
  92. : base(scene)
  93. {
  94. this.mData = data;
  95. //修正数据
  96. if(data.interval < 300)
  97. {
  98. mData.interval = 300;
  99. log.Warn("RegionDamageTrigger触发间隔错误:" + data.Name + ", " + data.interval);
  100. }
  101. }
  102. public void bindToRegion(ZoneRegion region)
  103. {
  104. if (this.mInit) { return; }
  105. this.mInit = true;
  106. mTimeTask = region.Parent.AddTimeTask(mData.interval, mData.interval, 0, OnTimeTrigger);
  107. region.OnFlagDisabled += this.onRegionStop;
  108. region.OnFlagEnabled += this.onRegionStart;
  109. region.OnUnitEnter += this.onUnitEnter;
  110. region.OnUnitLeave += this.onUnitLeave;
  111. if (!region.Enable)
  112. {
  113. this.mTimeTask.Pause();
  114. }
  115. }
  116. private void onRegionStart(InstanceFlag region)
  117. {
  118. ZoneRegion zoneRegion = region as ZoneRegion;
  119. if(zoneRegion == null)
  120. {
  121. return;
  122. }
  123. //统计下区域内单位数量
  124. mReginUnit.Clear();
  125. this.mTimeTask.Resume();
  126. }
  127. private void onRegionStop(InstanceFlag region)
  128. {
  129. this.mTimeTask.Pause();
  130. }
  131. private bool Select(InstanceUnit unit)
  132. {
  133. return mData.force == -1 || unit.Virtual.GetForceID() == mData.force;
  134. }
  135. private void onUnitEnter(ZoneRegion region, InstanceUnit obj)
  136. {
  137. if (Select(obj))
  138. {
  139. this.mReginUnit.Add(obj);
  140. }
  141. }
  142. private void onUnitLeave(ZoneRegion region, InstanceUnit obj)
  143. {
  144. if (Select(obj))
  145. {
  146. this.mReginUnit.Remove(obj);
  147. }
  148. }
  149. private void OnTimeTrigger(TimeTaskMS task)
  150. {
  151. //开始处理伤害
  152. foreach (InstanceUnit unit in this.mReginUnit)
  153. {
  154. if(!unit.IsActive)
  155. {
  156. continue;
  157. }
  158. if (this.mData.attack != 0)
  159. {
  160. unit.AddHP(-this.mData.attack, unit);
  161. }
  162. if (this.mData.attackPer != 0)
  163. {
  164. int addValue = CUtils.CastInt(unit.MaxHP * 0.0001f * this.mData.attackPer);
  165. if(addValue == 0)
  166. {
  167. addValue = this.mData.attackPer > 0 ? 1 : -1;
  168. }
  169. //扣血| 非满血加血
  170. if(addValue > 0 || unit.CurrentHP < unit.MaxHP)
  171. {
  172. unit.AddHP(-addValue, unit);
  173. }
  174. }
  175. if (this.mData.DoBuff != null)
  176. {
  177. unit.AddBuff(mData.DoBuff, unit);
  178. }
  179. }
  180. }
  181. }
  182. }