Other_100005.cs 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  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_1 = owner.RegistAddOtherHPEvent(OnAddOtherHPEvnet, skillInfo);
  53. mUUID_2 = owner.RegistTryAddBuffEvent(OnTryAddBuffEvent, skillInfo);
  54. }
  55. public bool OnAddOtherHPEvnet(int hp, InstanceUnit sender, InstanceUnit hitter, AttackSource source, out int finalHP)
  56. {
  57. //加血跳过
  58. if(hp <= 0)
  59. {
  60. finalHP = hp;
  61. return true;
  62. }
  63. this.lastHitTime = CommonLang.CUtils.localTimeMS;
  64. finalHP = hp;
  65. if (source != null && source.FromSkillType == XmdsSkillType.normalAtk)
  66. {
  67. if (HIT_DAMAGE > 1 && HIT_DAMAGE_REDUCE > 0 && hitter.GetBuffByID(BuffID) != null)
  68. {
  69. float damageReduce = HIT_DAMAGE * HIT_DAMAGE_REDUCE * XmdsUnitProp.PER;
  70. finalHP = CUtils.CastInt(HIT_DAMAGE - damageReduce);
  71. }
  72. else
  73. {
  74. finalHP = HIT_DAMAGE;
  75. }
  76. return false;
  77. }
  78. (sender.Virtual as XmdsVirtual).SendBattleHintNumberB2C(0, XmdsVirtual.UnitHitEventState.Immunity, hitter.ID);
  79. finalHP = 0;
  80. return false;
  81. }
  82. //private float OnHandleHitDmage(float damage, XmdsVirtual hitted, XmdsVirtual attacker, AttackSource source,
  83. // ref XmdsVirtual.AtkResult result, DamageType damageType, GameSkill skill, ref bool isEndDispatch)
  84. //{
  85. // this.lastHitTime = CommonLang.CUtils.localTimeMS;
  86. // isEndDispatch = true;
  87. // if (source.FromSkillType == XmdsSkillType.normalAtk && attacker.mUnit.IsPlayer)
  88. // {
  89. // if (HIT_DAMAGE > 1 && HIT_DAMAGE_REDUCE > 0 && hitted.mUnit.GetBuffByID(BuffID) != null)
  90. // {
  91. // float damageReduce = HIT_DAMAGE * HIT_DAMAGE_REDUCE * XmdsUnitProp.PER;
  92. // return HIT_DAMAGE - damageReduce;
  93. // }
  94. // return HIT_DAMAGE;
  95. // }
  96. // attacker.SendBattleHintNumberB2C(0, XmdsVirtual.UnitHitEventState.Immunity, hitted.mUnit.ID);
  97. // return 0;
  98. //}
  99. private bool OnTryAddBuffEvent(ref BuffTemplate buff, XmdsVirtual attacker, XmdsVirtual hitter, GameSkill skill)
  100. {
  101. // 只允许加这个buff
  102. return (buff.TemplateID == BuffID) ? true : false;
  103. }
  104. protected override void OnUpdate(int intervalMS, bool slowRefresh)
  105. {
  106. base.OnUpdate(intervalMS, slowRefresh);
  107. //开始回血判断
  108. long noDamageTimePass = CommonLang.CUtils.localTimeMS - lastHitTime;
  109. if (mOwner == null || noDamageTimePass < NotDamgeAddHPTime)
  110. {
  111. timePass = 0;
  112. return;
  113. }
  114. timePass += intervalMS;
  115. //回血判断
  116. if (mOwner.mUnit.CurrentHP < mOwner.mUnit.MaxHP && timePass > HPRebornInterval)
  117. {
  118. timePass = 0;
  119. //队伍范围内找友军
  120. //int addHp = (int)(mOwner.mUnit.MaxHP * XmdsUnitProp.PER * HPRebornValue);
  121. this.mOwner.mUnit.AddHP(HPRebornValue, this.mOwner.mUnit);
  122. }
  123. }
  124. // //防御加成
  125. // int damageReduce = GetDamageReduceByAlliesCount(alliestCount);
  126. // if (damageReduce != preDamageReduce)
  127. // {
  128. // if (damageReduce > 0)
  129. // {
  130. // var buff = this.mOwner.GetRegisBuffVirtual(BuffID) as XmdsBuff_PropChange;
  131. // buff.CurrentValue = damageReduce;
  132. // this.mOwner.mUnit.AddBuff(BuffID, this.mOwner.mUnit);
  133. // }
  134. // else
  135. // {
  136. // this.mOwner.mUnit.removeBuff(BuffID);
  137. // }
  138. // }
  139. //}
  140. ///** 获得附近队友数量 */
  141. //private int AlliesCounting()
  142. //{
  143. // int alliesCount = 0;
  144. // using (var list = ListObjectPool<InstanceUnit>.AllocAutoRelease())
  145. // {
  146. // mOwner.mUnit.Parent.getObjectsRoundRange<InstanceUnit>(
  147. // (obj, dx, dy, dr) =>
  148. // {
  149. // var u = obj as InstanceUnit;
  150. // if (u.Virtual is XmdsVirtual_Player && CMath.includeRoundPoint(dx, dy, dr, u.X, u.Y))
  151. // {
  152. // //己方单位.
  153. // if (mOwner.IsAllies(u.Virtual as XmdsVirtual))
  154. // {
  155. // alliesCount++;
  156. // }
  157. // }
  158. // return true;
  159. // },
  160. // mOwner.mUnit.X,
  161. // mOwner.mUnit.Y,
  162. // 6,
  163. // list, mOwner.mUnit.AoiStatus);
  164. // }
  165. // return alliesCount++;
  166. //}
  167. ///** 根据队友数量,获得减伤比例 */
  168. //private int GetDamageReduceByAlliesCount(int alliesCount)
  169. //{
  170. // if(alliesCount <= 0)
  171. // {
  172. // return 0;
  173. // }
  174. // else if(alliesCount <= 3)
  175. // {
  176. // return 1000;
  177. // }
  178. // else if(alliesCount <= 5)
  179. // {
  180. // return 2000;
  181. // }
  182. // else if(alliesCount <= 10)
  183. // {
  184. // return 5000;
  185. // }
  186. // return 8000;
  187. //}
  188. ///** 根据队友数量,获得减伤比例 */
  189. //private float GetHealByAlliesCount(int alliesCount)
  190. //{
  191. // int precent = 1000;
  192. // if (alliesCount <= 0)
  193. // {
  194. // precent = 500;
  195. // }
  196. // else if (alliesCount <= 3)
  197. // {
  198. // precent = 600;
  199. // }
  200. // else if (alliesCount <= 5)
  201. // {
  202. // precent = 800;
  203. // }
  204. // else if (alliesCount <= 10)
  205. // {
  206. // precent = 1000;
  207. // }
  208. // return precent * XmdsUnitProp.PER;
  209. //}
  210. protected override void OnInitSkillParam()
  211. {
  212. XmdsSkillData data = XmdsDataMgr.GetInstance().GetXmdsSkillData(ID);
  213. InitData(data, out valueSet, XmdsSkillData.XmdsSkillDataKey.ValueSet);
  214. XmdsSkillValue valueTemp;
  215. InitData(data, out valueTemp, XmdsSkillData.XmdsSkillDataKey.ValueSet2);
  216. HIT_DAMAGE = Math.Max(1, valueTemp.GetValue());
  217. InitData(data, out valueTemp, XmdsSkillData.XmdsSkillDataKey.ValueSet3);
  218. HIT_DAMAGE_REDUCE = valueTemp.GetValue();
  219. InitData(data, out valueTemp, XmdsSkillData.XmdsSkillDataKey.ValueSet4);
  220. NotDamgeAddHPTime = valueTemp.GetValue() * 1000;
  221. InitData(data, out valueTemp, XmdsSkillData.XmdsSkillDataKey.ValueSet5);
  222. HPRebornValue = valueTemp.GetValue();
  223. InitData(data, out valueTemp, XmdsSkillData.XmdsSkillDataKey.ValueSet6);
  224. HPRebornInterval = valueTemp.GetValue() * 1000;
  225. }
  226. protected override void OnDispose(XmdsVirtual owner)
  227. {
  228. owner.UnRegistAddOtherHPEvent(mUUID_1);
  229. //owner.UnRegistOnHitDamage(mUUID_1);
  230. owner.UnRegistTryAddBuffEvent(mUUID_2);
  231. owner.RemovePropChangeOperation(mOpID1);
  232. }
  233. }
  234. }