Other_100005.cs 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. using CommonAI.Zone.Helper;
  2. using CommonAI.Zone.Instance;
  3. using XmdsCommonServer.Plugin;
  4. using XmdsCommonServer.XLS.Data;
  5. using XmdsCommonSkill.Plugin.Buffs;
  6. using System;
  7. using static CommonAI.Zone.Instance.InstanceUnit;
  8. using XmdsCommon.Plugin;
  9. using CommonAI.Zone;
  10. using XmdsCommonServer.Plugin.Units;
  11. using CommonAI.Zone.Formula;
  12. using XmdsCommonSkill.Plugin.Skills;
  13. using XmdsCommonServer.Plugin.XmdsSkillTemplate.DamageCalculator;
  14. using XmdsCommonSkill.Plugin.Skills.Magic;
  15. using CommonLang;
  16. using CommonAI.Data;
  17. using System.Collections.Generic;
  18. namespace XmdsCommonSkill.Plugin.PassiveSkills.Magic
  19. {
  20. /// <summary>
  21. /// 封神战-旗子被动
  22. /// </summary>
  23. public class Other_100005 : XmdsPassiveSkillBase
  24. {
  25. /// 技能ID.
  26. public static readonly int ID = 100005;
  27. private static readonly int BuffID = (int)XmdsBuffBase.XmdsBuffList.PVP_FLAG_DAMAGEREDUCE;
  28. private static XmdsSkillValue valueSet;
  29. private static int HIT_DAMAGE = 1; //单次攻击掉血
  30. private static int HIT_DAMAGE_REDUCE = 0; //免伤逻辑
  31. private static int HPRebornInterval = 0; //HP恢复频率
  32. private static int NotDamgeAddHPTime = 0; //没有收到伤害多久,开始回血
  33. private static int HPRebornValue = 0; //HP恢复比例
  34. private int mNeedHitTimes = 0;
  35. private int mUUID_1 = 0;
  36. private int mUUID_2 = 0;
  37. private int mOpID1 = 0;
  38. //私有数据
  39. private XmdsVirtual mOwner = null;
  40. private int timePass = 0; //旗子被动刷新间隔
  41. private long lastHitTime = 0; //最后一次被攻击时间
  42. public override int SkillID { get { return ID; } }
  43. protected override void OnInit(GameSkill skillInfo, XmdsVirtual owner)
  44. {
  45. this.mOwner = owner;
  46. mNeedHitTimes = Math.Max(10, valueSet.GetValue(owner.mUnit.gameServerFlag == 0 ? skillInfo.SkillLevel : owner.mUnit.gameServerFlag));
  47. XmdsVirtual.PropChangeOperation pco = owner.CreatePropChangeOpertation(null);
  48. pco.Type = XmdsVirtual.UnitAttributeType.SetMaxHP;
  49. pco.Value = mNeedHitTimes * HIT_DAMAGE;
  50. mOpID1 = owner.AddPropChangeOperation(pco);
  51. mUUID_1 = owner.RegistOnHitDamage(OnHandleHitDmage, skillInfo, true);
  52. mUUID_2 = owner.RegistTryAddBuffEvent(OnTryAddBuffEvent, skillInfo);
  53. }
  54. private float OnHandleHitDmage(float damage, XmdsVirtual hitted, XmdsVirtual attacker, AttackSource source,
  55. ref XmdsVirtual.AtkResult result, DamageType damageType, GameSkill skill, ref bool isEndDispatch)
  56. {
  57. this.lastHitTime = CommonLang.CUtils.localTimeMS;
  58. isEndDispatch = true;
  59. if (source.FromSkillType == XmdsSkillType.normalAtk && attacker.mUnit.IsPlayer)
  60. {
  61. if(HIT_DAMAGE > 1 && HIT_DAMAGE_REDUCE > 0 && hitted.mUnit.GetBuffByID(BuffID) != null)
  62. {
  63. float damageReduce = HIT_DAMAGE * HIT_DAMAGE_REDUCE * XmdsUnitProp.PER;
  64. return HIT_DAMAGE - damageReduce;
  65. }
  66. return HIT_DAMAGE;
  67. }
  68. attacker.SendBattleHintNumberB2C(0, XmdsVirtual.UnitHitEventState.Immunity, hitted.mUnit.ID);
  69. return 0;
  70. }
  71. private bool OnTryAddBuffEvent(ref BuffTemplate buff, XmdsVirtual attacker, XmdsVirtual hitter, GameSkill skill)
  72. {
  73. // 只允许加这个buff
  74. return (buff.TemplateID == BuffID) ? true : false;
  75. }
  76. protected override void OnUpdate(int intervalMS, bool slowRefresh)
  77. {
  78. base.OnUpdate(intervalMS, slowRefresh);
  79. //开始回血判断
  80. long noDamageTimePass = CommonLang.CUtils.localTimeMS - lastHitTime;
  81. if (mOwner == null || noDamageTimePass < NotDamgeAddHPTime)
  82. {
  83. timePass = 0;
  84. return;
  85. }
  86. timePass += intervalMS;
  87. //回血判断
  88. if (mOwner.mUnit.CurrentHP < mOwner.mUnit.MaxHP && timePass > HPRebornInterval)
  89. {
  90. timePass = 0;
  91. //队伍范围内找友军
  92. //int addHp = (int)(mOwner.mUnit.MaxHP * XmdsUnitProp.PER * HPRebornValue);
  93. this.mOwner.mUnit.AddHP(HPRebornValue, this.mOwner.mUnit);
  94. }
  95. }
  96. // //防御加成
  97. // int damageReduce = GetDamageReduceByAlliesCount(alliestCount);
  98. // if (damageReduce != preDamageReduce)
  99. // {
  100. // if (damageReduce > 0)
  101. // {
  102. // var buff = this.mOwner.GetRegisBuffVirtual(BuffID) as XmdsBuff_PropChange;
  103. // buff.CurrentValue = damageReduce;
  104. // this.mOwner.mUnit.AddBuff(BuffID, this.mOwner.mUnit);
  105. // }
  106. // else
  107. // {
  108. // this.mOwner.mUnit.removeBuff(BuffID);
  109. // }
  110. // }
  111. //}
  112. ///** 获得附近队友数量 */
  113. //private int AlliesCounting()
  114. //{
  115. // int alliesCount = 0;
  116. // using (var list = ListObjectPool<InstanceUnit>.AllocAutoRelease())
  117. // {
  118. // mOwner.mUnit.Parent.getObjectsRoundRange<InstanceUnit>(
  119. // (obj, dx, dy, dr) =>
  120. // {
  121. // var u = obj as InstanceUnit;
  122. // if (u.Virtual is XmdsVirtual_Player && CMath.includeRoundPoint(dx, dy, dr, u.X, u.Y))
  123. // {
  124. // //己方单位.
  125. // if (mOwner.IsAllies(u.Virtual as XmdsVirtual))
  126. // {
  127. // alliesCount++;
  128. // }
  129. // }
  130. // return true;
  131. // },
  132. // mOwner.mUnit.X,
  133. // mOwner.mUnit.Y,
  134. // 6,
  135. // list, mOwner.mUnit.AoiStatus);
  136. // }
  137. // return alliesCount++;
  138. //}
  139. ///** 根据队友数量,获得减伤比例 */
  140. //private int GetDamageReduceByAlliesCount(int alliesCount)
  141. //{
  142. // if(alliesCount <= 0)
  143. // {
  144. // return 0;
  145. // }
  146. // else if(alliesCount <= 3)
  147. // {
  148. // return 1000;
  149. // }
  150. // else if(alliesCount <= 5)
  151. // {
  152. // return 2000;
  153. // }
  154. // else if(alliesCount <= 10)
  155. // {
  156. // return 5000;
  157. // }
  158. // return 8000;
  159. //}
  160. ///** 根据队友数量,获得减伤比例 */
  161. //private float GetHealByAlliesCount(int alliesCount)
  162. //{
  163. // int precent = 1000;
  164. // if (alliesCount <= 0)
  165. // {
  166. // precent = 500;
  167. // }
  168. // else if (alliesCount <= 3)
  169. // {
  170. // precent = 600;
  171. // }
  172. // else if (alliesCount <= 5)
  173. // {
  174. // precent = 800;
  175. // }
  176. // else if (alliesCount <= 10)
  177. // {
  178. // precent = 1000;
  179. // }
  180. // return precent * XmdsUnitProp.PER;
  181. //}
  182. protected override void OnInitSkillParam()
  183. {
  184. XmdsSkillData data = XmdsDataMgr.GetInstance().GetXmdsSkillData(ID);
  185. InitData(data, out valueSet, XmdsSkillData.XmdsSkillDataKey.ValueSet);
  186. XmdsSkillValue valueTemp;
  187. InitData(data, out valueTemp, XmdsSkillData.XmdsSkillDataKey.ValueSet2);
  188. HIT_DAMAGE = Math.Max(1, valueTemp.GetValue());
  189. InitData(data, out valueTemp, XmdsSkillData.XmdsSkillDataKey.ValueSet3);
  190. HIT_DAMAGE_REDUCE = valueTemp.GetValue();
  191. InitData(data, out valueTemp, XmdsSkillData.XmdsSkillDataKey.ValueSet4);
  192. NotDamgeAddHPTime = valueTemp.GetValue() * 1000;
  193. InitData(data, out valueTemp, XmdsSkillData.XmdsSkillDataKey.ValueSet5);
  194. HPRebornValue = valueTemp.GetValue();
  195. InitData(data, out valueTemp, XmdsSkillData.XmdsSkillDataKey.ValueSet6);
  196. HPRebornInterval = valueTemp.GetValue() * 1000;
  197. }
  198. protected override void OnDispose(XmdsVirtual owner)
  199. {
  200. owner.UnRegistOnHitDamage(mUUID_1);
  201. owner.UnRegistTryAddBuffEvent(mUUID_2);
  202. owner.RemovePropChangeOperation(mOpID1);
  203. }
  204. }
  205. }