XmdsBuff_AttackCreateSpell.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. 
  2. using CommonAI.Data;
  3. using CommonAI.Zone;
  4. using CommonAI.Zone.Formula;
  5. using CommonAI.Zone.Helper;
  6. using CommonAI.Zone.Instance;
  7. using XmdsCommon.Plugin;
  8. using XmdsCommonServer.Plugin;
  9. using XmdsCommonServer.Plugin.XmdsSkillTemplate.DamageCalculator;
  10. using XmdsCommonServer.Plugin.XmdsSkillTemplate.Skills;
  11. using XmdsCommonSkill.Plugin.Interface;
  12. using static XmdsCommonSkill.Plugin.Interface.ComSpellTemplate;
  13. namespace XmdsCommonSkill.Plugin.Buffs
  14. {
  15. //攻击创建额外法术
  16. public class XmdsBuff_AttackCreateSpell : XmdsBuffBase
  17. {
  18. public XmdsSkillType pointSkillType = 0; // 0-所有类型技能
  19. public XmdsSpellID createSpellID = 0; // 创建法术ID
  20. public int spellTriggerTimes = 0; // 法术触发次数
  21. public int excludeSkillID = 0;
  22. public int addBuffID = 0; // 附加的BuffID
  23. // 额外伤害
  24. public int damageAddition = 0; // 伤害加成
  25. public int addFixedDamage = 0; // 附加固定伤害
  26. public int chainLevel = 0; // 弹射
  27. private int mTriggerSkillID = 0; //触发效果的技能ID
  28. private int mHandleUUID1 = 0;
  29. private int mHandleUUID2 = 0;
  30. public override int GetAbilityID()
  31. {
  32. return (int)XmdsCommon.Plugin.XmdsBuffProperties.XmdsBuffAbility.AttackCreateSpell;
  33. }
  34. public override void CopyTo(UnitBuff other)
  35. {
  36. var ret = other as XmdsBuff_AttackCreateSpell;
  37. ret.pointSkillType = this.pointSkillType; //0-所有类型技能
  38. ret.createSpellID = this.createSpellID; //创建法术ID
  39. ret.spellTriggerTimes = this.spellTriggerTimes;
  40. ret.excludeSkillID = this.excludeSkillID;
  41. ret.addBuffID = this.addBuffID;
  42. ret.damageAddition = this.damageAddition; //伤害加成
  43. ret.addFixedDamage = this.addFixedDamage;
  44. ret.chainLevel = this.chainLevel;
  45. base.CopyTo(other);
  46. }
  47. protected override void OnBindTemplate(ref BuffTemplate buffTemplate)
  48. {
  49. //DOT类技能首帧无效.
  50. buffTemplate.FirstTimeEnable = false;
  51. base.OnBindTemplate(ref buffTemplate);
  52. }
  53. public override void BuffBegin(XmdsVirtual hitter, XmdsVirtual attacker, InstanceUnit.BuffState state)
  54. {
  55. mHandleUUID1 = hitter.RegistOnHitOther(OnHitOther, null, true);
  56. mHandleUUID2 = hitter.RegistLaunchSkillOver(OnLaunchSkillOver, null, true);
  57. }
  58. public override void BuffEnd(XmdsVirtual hitter, InstanceUnit.BuffState state, bool replace)
  59. {
  60. hitter.UnRegistOnHitOther(mHandleUUID1);
  61. hitter.UnRegistLaunchSkillOver(mHandleUUID2);
  62. }
  63. protected virtual float OnHitOther(float damage, XmdsVirtual hitted, XmdsVirtual attacker, AttackSource source,
  64. ref XmdsVirtual.AtkResult result, DamageType damageType, GameSkill skill, ref bool isEndDispatch)
  65. {
  66. //技能类型和技能id匹配时
  67. if(this.mTriggerSkillID > 0 && (this.pointSkillType == XmdsSkillType.none || this.pointSkillType == source.FromSkillType))
  68. {
  69. //额外伤害
  70. if (damageAddition != 0)
  71. {
  72. damage += damage * XmdsUnitProp.PER * this.damageAddition;
  73. }
  74. damage += this.addFixedDamage;
  75. //创建法术
  76. if(this.createSpellID != 0 && this.spellTriggerTimes > 0)
  77. {
  78. this.spellTriggerTimes--;
  79. LaunchSpell ls = ComSpellTemplate.Instance().GetSpellByID(this.createSpellID);
  80. ls.ChainLevel = this.chainLevel;
  81. attacker.mUnit.Parent.unitLaunchSpell(this.pointSkillType, attacker.mUnit, ls,
  82. hitted.mUnit.X, hitted.mUnit.Y, hitted.mUnit.ID);
  83. }
  84. // 添加buff
  85. if(this.addBuffID != 0)
  86. {
  87. hitted.mUnit.AddBuff(this.addBuffID, attacker.mUnit);
  88. }
  89. }
  90. return damage;
  91. }
  92. private int OnLaunchSkillOver(GameSkill info, XmdsCommonServer.Plugin.XmdsVirtual launcher, CommonAI.Zone.Instance.InstanceUnit.SkillState skill)
  93. {
  94. if ((this.pointSkillType == XmdsSkillType.none || skill.GetSkillType() == this.pointSkillType) && (this.excludeSkillID == 0 || this.excludeSkillID != skill.Data.ID))
  95. {
  96. if(this.mTriggerSkillID > 0)
  97. {
  98. launcher.mUnit.removeBuff(this.BindBuffID);
  99. }
  100. else
  101. {
  102. this.mTriggerSkillID = skill.Data.ID;
  103. }
  104. }
  105. return 0;
  106. }
  107. protected override void OnDispose()
  108. {
  109. base.OnDispose();
  110. }
  111. }
  112. }