XmdsBuff_Shield_AbsorbDamage.cs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. using CommonAI.Zone.Instance;
  2. using CommonAI.Zone.Formula;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. using XmdsCommon.Plugin;
  8. using XmdsCommonServer.Plugin;
  9. using XmdsCommonServer.Plugin.XmdsSkillTemplate.Skills;
  10. using CommonAI.Zone;
  11. using XmdsCommonSkill.Plugin.Interface;
  12. using static XmdsCommonSkill.Plugin.Interface.ComSpellTemplate;
  13. using CommonAI.Data;
  14. using CommonAI.Zone.Helper;
  15. using CommonLang;
  16. using static CommonAI.Zone.Instance.InstanceUnit;
  17. namespace XmdsCommonSkill.Plugin.Buffs
  18. {
  19. /// <summary>
  20. /// FileName: XmdsBuff_Shield_AbsorbDamage.cs
  21. /// Author: Alex.Yu
  22. /// Corporation:...
  23. /// Description: 护盾型吸收伤害.
  24. /// DateTime: 2015/6/8 21:05:08
  25. /// </summary>
  26. public class XmdsBuff_Shield_AbsorbDamage : XmdsBuffBase
  27. {
  28. /// <summary>
  29. /// 吸收伤害总量.
  30. /// </summary>
  31. public int AbsorbDamageSum = 0;
  32. public XmdsSpellID breakSpellID = 0;
  33. /** 触发频率 ms*/
  34. public int HitInterval = 0;
  35. /// <summary>
  36. /// 是否吸收过量伤害.
  37. /// </summary>
  38. public bool AbsorbOverFlowDamage = false;
  39. private long mNextHitTime;
  40. private int mHandleUUID = 0;
  41. public override int GetAbilityID()
  42. {
  43. return (int)XmdsCommon.Plugin.XmdsBuffProperties.XmdsBuffAbility.SHIELD_AbsorbDamage;
  44. }
  45. public override void CopyTo(UnitBuff other)
  46. {
  47. var ret = other as XmdsBuff_Shield_AbsorbDamage;
  48. ret.AbsorbDamageSum = this.AbsorbDamageSum;
  49. ret.AbsorbOverFlowDamage = this.AbsorbOverFlowDamage;
  50. ret.breakSpellID = this.breakSpellID;
  51. ret.HitInterval = this.HitInterval;
  52. base.CopyTo(other);
  53. }
  54. protected override void OnBuffBegin(XmdsCommonServer.Plugin.XmdsVirtual hitter, XmdsCommonServer.Plugin.XmdsVirtual attacker, InstanceUnit.BuffState state)
  55. {
  56. //注册监听.
  57. if(hitter.mUnit.IsPet)
  58. {
  59. mHandleUUID = hitter.RegistShareMasterDmgEvent(OnShareMasterDmgEvent, null);
  60. }
  61. else
  62. {
  63. mHandleUUID = hitter.RegistOnHitDamage(OnHandleHitDmage, null);
  64. }
  65. XmdsVirtual.FormatLog("BuffBegin : 单位【{0}】增加吸收伤害护盾.", hitter.mProp.ServerData.BaseInfo.name);
  66. }
  67. protected override void OnBuffEnd(XmdsCommonServer.Plugin.XmdsVirtual hitter, InstanceUnit.BuffState state, bool replace)
  68. {
  69. //取消监听.
  70. if(hitter.mUnit.IsPet)
  71. {
  72. hitter.UnRegistShareMasterDmgEvent(mHandleUUID);
  73. }
  74. else
  75. {
  76. hitter.UnRegistOnHitDamage(mHandleUUID);
  77. }
  78. XmdsVirtual.FormatLog("BuffBegin : 单位【{0}】失去吸收伤害护盾.", hitter.mProp.ServerData.BaseInfo.name);
  79. //护盾破碎,创建法术
  80. if(this.breakSpellID != 0)
  81. {
  82. // //播放声音特效.
  83. hitter.mUnit.Parent.unitLaunchSpell(XmdsSkillType.none, hitter.mUnit,
  84. ComSpellTemplate.Instance().GetSpellByID(this.breakSpellID),
  85. hitter.mUnit.X, hitter.mUnit.Y, hitter.mUnit.ID);
  86. }
  87. }
  88. //单位被攻击时.伤害吸收计算.
  89. private float OnHandleHitDmage(float damage, XmdsVirtual hitted, XmdsVirtual attacker, AttackSource source,
  90. ref XmdsVirtual.AtkResult result, DamageType damageType, GameSkill skill, ref bool isEndDispatch)
  91. {
  92. return DoAbsortDmg(damage, hitted, attacker, source);
  93. }
  94. private int OnShareMasterDmgEvent(int hp, InstanceUnit sender, InstanceUnit unit, GameSkill skill, ref bool isEndDispatch)
  95. {
  96. return (int)(DoAbsortDmg(hp, unit.Virtual as XmdsVirtual, sender == null ? null : (sender.Virtual as XmdsVirtual)));
  97. }
  98. private float DoAbsortDmg(float damage, XmdsVirtual hitted, XmdsVirtual attacker, AttackSource source = null)
  99. {
  100. float ret = damage;
  101. if (this.mNextHitTime > CommonLang.CUtils.localTimeMS)
  102. {
  103. return damage;
  104. }
  105. //damage > 0是伤害,damage < 0是加血机制.
  106. if (damage > 0 && AbsorbDamageSum > 0)
  107. {
  108. ret = damage - AbsorbDamageSum;
  109. if (ret < 0)
  110. {
  111. ret = 0;
  112. if(source != null)
  113. {
  114. source.OutClientState = (byte)XmdsCommonServer.Plugin.XmdsVirtual.UnitHitEventState.Absorb;
  115. }
  116. }
  117. int abDamage = CUtils.CastInt(damage - ret);
  118. AbsorbDamageSum -= abDamage;
  119. if (AbsorbDamageSum <= 0)
  120. {
  121. //破盾.
  122. hitted.mUnit.removeBuff(BindBuffID, BuffState.ENDResult_HuDunBreak);
  123. //过量伤害吸收.
  124. if (AbsorbOverFlowDamage)
  125. {
  126. ret = 0;
  127. }
  128. }
  129. //触发频率
  130. if (this.HitInterval > 0)
  131. {
  132. this.mNextHitTime = CommonLang.CUtils.localTimeMS + this.HitInterval;
  133. }
  134. this.OnAbsortDamage(hitted, attacker, source);
  135. }
  136. return ret;
  137. }
  138. protected virtual void OnAbsortDamage(XmdsVirtual hitted, XmdsVirtual attacker, AttackSource source)
  139. {
  140. if(hitted.mUnit.IsPet)
  141. {
  142. //手动推送吸收伤害消息
  143. UnitHitEvent evt = new UnitHitEvent(hitted.mUnit.ID);
  144. evt.senderId = attacker == null ? 0 : attacker.mUnit.ID;
  145. evt.senderMasterId = hitted.GetMasterID();
  146. evt.hitMasterId = attacker == null ? 0 : attacker.GetMasterID();
  147. evt.client_state = (byte)XmdsCommonServer.Plugin.XmdsVirtual.UnitHitEventState.Absorb;
  148. hitted.mUnit.queueEvent(evt);
  149. }
  150. }
  151. }
  152. }