XmdsBuff_Shield_AbsorbDamage.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  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. mHandleUUID = hitter.RegistOnHitDamage(OnHandleHitDmage, null);
  58. XmdsVirtual.FormatLog("BuffBegin : 单位【{0}】增加吸收伤害护盾.", hitter.mProp.ServerData.BaseInfo.name);
  59. }
  60. protected override void OnBuffEnd(XmdsCommonServer.Plugin.XmdsVirtual hitter, InstanceUnit.BuffState state, bool replace)
  61. {
  62. //取消监听.
  63. hitter.UnRegistOnHitDamage(mHandleUUID);
  64. XmdsVirtual.FormatLog("BuffBegin : 单位【{0}】失去吸收伤害护盾.", hitter.mProp.ServerData.BaseInfo.name);
  65. //护盾破碎,创建法术
  66. if(this.breakSpellID != 0)
  67. {
  68. // //播放声音特效.
  69. hitter.mUnit.Parent.unitLaunchSpell(XmdsSkillType.none, hitter.mUnit,
  70. ComSpellTemplate.Instance().GetSpellByID(this.breakSpellID),
  71. hitter.mUnit.X, hitter.mUnit.Y, hitter.mUnit.ID);
  72. }
  73. }
  74. //单位被攻击时.伤害吸收计算.
  75. private float OnHandleHitDmage(float damage, XmdsVirtual hitted, XmdsVirtual attacker, AttackSource source,
  76. ref XmdsVirtual.AtkResult result, DamageType damageType, GameSkill skill, ref bool isEndDispatch)
  77. {
  78. float ret = damage;
  79. if(this.mNextHitTime > CommonLang.CUtils.localTimeMS)
  80. {
  81. return damage;
  82. }
  83. //damage > 0是伤害,damage < 0是加血机制.
  84. if (damage > 0 && AbsorbDamageSum > 0)
  85. {
  86. ret = damage - AbsorbDamageSum;
  87. if (ret < 0)
  88. {
  89. ret = 0;
  90. source.OutClientState = (byte)XmdsCommonServer.Plugin.XmdsVirtual.UnitHitEventState.Absorb;
  91. }
  92. int abDamage = CUtils.CastInt(damage - ret);
  93. AbsorbDamageSum -= abDamage;
  94. if (AbsorbDamageSum <= 0)
  95. {
  96. //破盾.
  97. hitted.mUnit.removeBuff(BindBuffID, BuffState.ENDResult_HuDunBreak);
  98. //过量伤害吸收.
  99. if (AbsorbOverFlowDamage)
  100. {
  101. ret = 0;
  102. }
  103. }
  104. //触发频率
  105. if(this.HitInterval > 0)
  106. {
  107. this.mNextHitTime = CommonLang.CUtils.localTimeMS + this.HitInterval;
  108. }
  109. this.OnAbsortDamage(hitted, attacker, source);
  110. }
  111. return ret;
  112. }
  113. protected virtual void OnAbsortDamage(XmdsVirtual hitted, XmdsVirtual attacker, AttackSource source)
  114. {
  115. }
  116. }
  117. }