XmdsBuff_NextAttackCrit_AddHP.cs 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. 
  2. using CommonAI.Data;
  3. using CommonAI.Zone.Formula;
  4. using CommonAI.Zone.Helper;
  5. using CommonAI.Zone.Instance;
  6. using System;
  7. using XmdsCommon.Plugin;
  8. using XmdsCommonServer.Plugin;
  9. using XmdsCommonServer.Plugin.XmdsSkillTemplate.DamageCalculator;
  10. using XmdsCommonServer.Plugin.XmdsSkillTemplate.Skills;
  11. namespace XmdsCommonSkill.Plugin.Buffs
  12. {
  13. //下次普通攻击暴击 & 回血
  14. public class XmdsBuff_NextAttackCrit_AddHP : XmdsBuffBase
  15. {
  16. public int excludeSkillID = 0;
  17. public int addHPPer = 0;
  18. public int criteRate = 10000;
  19. private int mTriggerSkillID = 0; //触发效果的技能ID
  20. private int mOpID = 0;
  21. private int mHandleUUID1 = 0;
  22. private int mHandleUUID2 = 0;
  23. public override int GetAbilityID()
  24. {
  25. return (int)XmdsCommon.Plugin.XmdsBuffProperties.XmdsBuffAbility.NextAttakCrit_AddHP;
  26. }
  27. public override void CopyTo(UnitBuff other)
  28. {
  29. var ret = other as XmdsBuff_NextAttackCrit_AddHP;
  30. ret.excludeSkillID = this.excludeSkillID;
  31. ret.addHPPer = this.addHPPer;
  32. ret.criteRate = this.criteRate;
  33. base.CopyTo(other);
  34. }
  35. protected override void OnBuffBegin(XmdsCommonServer.Plugin.XmdsVirtual hitter, XmdsCommonServer.Plugin.XmdsVirtual attacker, CommonAI.Zone.Instance.InstanceUnit.BuffState state)
  36. {
  37. XmdsVirtual.PropChangeOperation pco = hitter.CreatePropChangeOpertation(this);
  38. pco.Type = XmdsVirtual.UnitAttributeType.CritRate_NormalAtk;
  39. pco.Value = this.criteRate;
  40. pco.OpType = XmdsVirtual.PropChangeOperation.OperateType.Percent;
  41. mOpID = hitter.AddPropChangeOperation(pco);
  42. mHandleUUID1 = hitter.RegistOnHitOther(OnHandleHitOther, null);
  43. mHandleUUID2 = hitter.RegistLaunchSkillOver(OnLaunchSkillOver, null, true);
  44. }
  45. private float OnHandleHitOther(float damage, XmdsVirtual hitted, XmdsVirtual attacker, AttackSource source,
  46. ref XmdsVirtual.AtkResult result, DamageType damageType, GameSkill skill, ref bool isEndDispatch)
  47. {
  48. if (this.mTriggerSkillID > 0 && source.FromSkillType == XmdsSkillType.normalAtk)
  49. {
  50. int addHP = System.Math.Max(1, Convert.ToInt32(damage * XmdsUnitProp.PER * addHPPer));
  51. attacker.mUnit.AddHP(addHP, attacker.mUnit);
  52. }
  53. return damage;
  54. }
  55. // buff效果也可能是在其他模块监听的OnLaunchSkillOver调用的
  56. private int OnLaunchSkillOver(GameSkill info, XmdsCommonServer.Plugin.XmdsVirtual launcher, CommonAI.Zone.Instance.InstanceUnit.SkillState skill)
  57. {
  58. if (skill.GetSkillType() == XmdsSkillType.normalAtk && (this.excludeSkillID == 0 || this.excludeSkillID != skill.Data.ID))
  59. {
  60. if (this.mTriggerSkillID > 0)
  61. {
  62. launcher.mUnit.removeBuff(this.BindBuffID);
  63. }
  64. else
  65. {
  66. this.mTriggerSkillID = skill.Data.ID;
  67. }
  68. }
  69. return 0;
  70. }
  71. protected override void OnBuffEnd(XmdsCommonServer.Plugin.XmdsVirtual hitter, CommonAI.Zone.Instance.InstanceUnit.BuffState state, bool replace)
  72. {
  73. //取消监听.
  74. hitter.UnRegistOnHitOther(mHandleUUID1);
  75. hitter.UnRegistLaunchSkillOver(mHandleUUID2);
  76. if(mOpID > 0)
  77. {
  78. hitter.RemovePropChangeOperation(mOpID);
  79. }
  80. }
  81. protected override void OnDispose()
  82. {
  83. base.OnDispose();
  84. }
  85. }
  86. }