Remedy_510000.cs 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. using CommonAI.Zone;
  2. using CommonAI.Zone.Helper;
  3. using CommonAI.Zone.Instance;
  4. using CommonLang;
  5. using XmdsCommon.Plugin;
  6. using XmdsCommonServer.Plugin;
  7. using XmdsCommonServer.Plugin.XmdsSkillTemplate.Skills;
  8. using XmdsCommonServer.XLS.Data;
  9. using XmdsCommonSkill.Plugin.Buffs;
  10. using XmdsCommonSkill.Plugin.Interface;
  11. using XmdsCommonSkill.Plugin.PassiveSkills.Magic;
  12. using XmdsCommonSkill.Plugin.PassiveSkills.Remedy;
  13. using static CommonAI.Zone.Instance.InstanceUnit;
  14. using static XmdsCommonSkill.Plugin.Interface.ComSpellTemplate;
  15. namespace XmdsCommonSkill.Plugin.Skills.Remedy
  16. {
  17. /// <summary>
  18. /// 治疗普攻:
  19. /// </summary>
  20. public class Remedy_510000 : RemedySkillBase
  21. {
  22. public static readonly int ID = 510000;
  23. private static readonly byte MAX_MUTIL_STEP = 3;
  24. // 伤害倍数:固定值_百分比
  25. protected XmdsSkillValue valueSet;
  26. //强化普攻伤害系数
  27. public AbstractSkill damagePer_3_4;
  28. public AbstractSkill damagePer_3_5;
  29. public AbstractSkill damagePer_5_5;
  30. //至宝被动
  31. public AbstractSkill damagePer_ZhiBao;
  32. //锁定index
  33. private static readonly int damgeAddAll = -1;
  34. private static readonly int damageIndex_Normal = 1; // 普通普攻
  35. private static readonly int damageIndex_3_4 = 2; // 飞花伤害
  36. private static readonly int damageIndex_3_5 = 3; // 弹射伤害
  37. //Action帧
  38. private static readonly int actionqueueIndex_3_4 = 3;
  39. private static readonly int actionqueueIndex_3_5 = 4;
  40. private static readonly int actionqueueIndex_ZhiBao = 5;
  41. //攻击间隔
  42. private int mAttackInterval;
  43. //当前动作形态
  44. private byte mCurActionStep = 0;
  45. //下一次可攻击时间
  46. private long mNextAttackTime = 0;
  47. public override int SkillID {get{return ID;}}
  48. protected override void OnInit(GameSkill info, XmdsVirtual unit, ref SkillTemplate template)
  49. {
  50. base.OnInit(info, unit, ref template);
  51. unit.RegistTryLaunchSkillEvent(OnTryLaunchSkillEventHandle, info);
  52. unit.RegistLaunchSkillOver(OnLaunchSkillOver, info);
  53. unit.RegistSkillBlockEvent(OnSkillBlockEvent, info);
  54. this.RegistEvent(EventType.UseFormluaType, OnUseFormluaTypeEvent);
  55. }
  56. protected override void OnInitOver(XmdsVirtual unit, GameSkill info)
  57. {
  58. //普攻伤害加成
  59. this.damagePer_3_4 = unit.SkillHelper.GetPlayerSkillById(Remedy_510340.ID);
  60. //3-5, 3-6的效果
  61. this.damagePer_3_5 = unit.SkillHelper.GetPlayerSkillById(Remedy_510350.ID);
  62. if (this.damagePer_3_5 == null)
  63. {
  64. this.damagePer_3_5 = unit.SkillHelper.GetPlayerSkillById(Remedy_510360.ID);
  65. }
  66. this.damagePer_5_5 = unit.SkillHelper.GetPlayerSkillById(Remedy_510550.ID);
  67. if (this.damagePer_5_5 == null)
  68. {
  69. this.damagePer_5_5 = unit.SkillHelper.GetPlayerSkillById(Remedy_510560.ID);
  70. }
  71. this.damagePer_ZhiBao = unit.SkillHelper.GetPlayerSkillByIdExt(Other_100200_ZhiBao.ID);
  72. }
  73. //接口之前相互手动调用
  74. public override void DoSkillDispose(int skillID)
  75. {
  76. if (this.damagePer_ZhiBao != null && this.damagePer_ZhiBao.SkillID == skillID)
  77. {
  78. this.damagePer_ZhiBao = null;
  79. }
  80. }
  81. protected override void OnSkillDamagePerEvent(BattleParams param)
  82. {
  83. //1. 至宝改变技能形态
  84. if(param.AtkProp.DamagePerID == Other_100200_ZhiBao.DAMAGE_INDEX)
  85. {
  86. param.SkillDamageAdd = damagePer_ZhiBao == null ? 0 : damagePer_ZhiBao.GetSkillValue(AbstractSkillType.Value1);
  87. param.SkillDamagePer = damagePer_ZhiBao == null ? 0 : damagePer_ZhiBao.GetSkillValue(AbstractSkillType.Value4);
  88. return;
  89. }
  90. ///////////////////////2. 自有技能逻辑
  91. //3-5弹射有加血,特殊处理
  92. if(param.UseDamageType == CommonAI.Data.DamageType.Heal && param.AtkProp.DamagePerID == damageIndex_3_5)
  93. {
  94. param.SkillDamagePer = this.GetSkillDamageAdd(param.Attacker, param.AtkProp.DamagePerID, AbstractSkillType.Value2);
  95. return;
  96. }
  97. param.SkillDamageAdd = valueSet.GetValue(1);
  98. param.SkillDamagePer = valueSet.GetValue(2);
  99. //5-5的全部基础伤害加成
  100. //MMO-16584 sub MMO-16572修改成治疗buff状态下才有这个效果
  101. if(param.Attacker.mUnit.GetBuffByID(Remedy_510500.Buff_ID) != null)
  102. {
  103. param.SkillDamagePer += this.GetSkillDamageAdd(param.Attacker, damgeAddAll);
  104. }
  105. //特殊普攻形态伤害加成
  106. if(param.AtkProp.DamagePerID != damgeAddAll)
  107. {
  108. param.SkillDamagePer += this.GetSkillDamageAdd(param.Attacker, param.AtkProp.DamagePerID);
  109. }
  110. }
  111. private bool OnTryLaunchSkillEventHandle(GameSkill info, ref InstanceUnit.SkillState skill, XmdsVirtual launcher, ref InstanceUnit.LaunchSkillParam param)
  112. {
  113. if (this.mNextAttackTime > CommonLang.CUtils.localTimeMS)
  114. {
  115. return false;
  116. }
  117. if(damagePer_ZhiBao != null && damagePer_ZhiBao.GetSkillValue(AbstractSkillType.Value2) > 0)
  118. {
  119. skill.LockActionStep = actionqueueIndex_ZhiBao;
  120. }
  121. else if (launcher.mUnit.GetBuffByID(Remedy_510350.Buff_ID_3_5) != null)
  122. {
  123. skill.LockActionStep = actionqueueIndex_3_5;
  124. }
  125. else if (launcher.mUnit.GetBuffByID(Remedy_510340.Buff_ID_3_4) != null)
  126. {
  127. skill.LockActionStep = actionqueueIndex_3_4;
  128. }
  129. else
  130. {
  131. skill.LockActionStep = mCurActionStep;
  132. }
  133. return true;
  134. }
  135. private int OnLaunchSkillOver(GameSkill info, XmdsCommonServer.Plugin.XmdsVirtual launcher, CommonAI.Zone.Instance.InstanceUnit.SkillState skill)
  136. {
  137. //攻速影响攻击间隔
  138. float finalInterval = (mAttackInterval/* + skill.Data.ActionQueue[mCurActionStep].TotalTimeMS*/) / (XmdsUnitProp.PER * launcher.MirrorProp.AttackSpeed);
  139. this.mNextAttackTime = (int)finalInterval + CommonLang.CUtils.localTimeMS;
  140. if (damagePer_ZhiBao != null && damagePer_ZhiBao.GetSkillValue(AbstractSkillType.Value2) > 0)
  141. {
  142. skill.LockActionStep = actionqueueIndex_ZhiBao;
  143. //技能使用强化效果, 偷懒用这个接口
  144. damagePer_ZhiBao.GetSkillValue(AbstractSkillType.Value3);
  145. }
  146. else if (launcher.mUnit.GetBuffByID(Remedy_510340.Buff_ID_3_4) != null)
  147. {
  148. skill.LockActionStep = actionqueueIndex_3_4;
  149. launcher.mUnit.removeBuff(Remedy_510340.Buff_ID_3_4);
  150. }
  151. else if (launcher.mUnit.GetBuffByID(Remedy_510350.Buff_ID_3_5) != null)
  152. {
  153. skill.LockActionStep = actionqueueIndex_3_5;
  154. launcher.mUnit.removeBuff(Remedy_510350.Buff_ID_3_5);
  155. }
  156. else
  157. {
  158. skill.LockActionStep = mCurActionStep;
  159. if (++mCurActionStep >= MAX_MUTIL_STEP)
  160. {
  161. mCurActionStep = 0;
  162. }
  163. }
  164. return 0;
  165. }
  166. // 技能被打断监听
  167. private bool OnSkillBlockEvent(XmdsVirtual launcher, InstanceUnit.StateSkill skill, InstanceUnit.State newState)
  168. {
  169. //float finalInterval = mAttackInterval / (XmdsUnitProp.PER * launcher.MirrorProp.AttackSpeed);
  170. //this.mNextAttackTime = (int)finalInterval + CommonLang.CUtils.localTimeMS;
  171. return true;
  172. }
  173. private void OnUseFormluaTypeEvent(BattleParams param)
  174. {
  175. if (damageIndex_3_5 == param.AtkProp.DamagePerID)
  176. {
  177. param.UseDamageType = base.AutoGetDamageType(param);
  178. }
  179. else
  180. {
  181. param.UseDamageType = CommonAI.Data.DamageType.Damage;
  182. }
  183. }
  184. protected override void OnInitConfig()
  185. {
  186. XmdsSkillData data = XmdsDataMgr.GetInstance().GetXmdsSkillData(ID);
  187. base.InitBaseConfig(data);
  188. InitData(data, out valueSet, XmdsSkillData.XmdsSkillDataKey.DmgRate);
  189. XmdsSkillValue tempValue;
  190. InitData(data, out tempValue, XmdsSkillData.XmdsSkillDataKey.ValueSet);
  191. this.mAttackInterval = tempValue.GetValue();
  192. }
  193. private int GetSkillDamageAdd(XmdsVirtual unit, int type, AbstractSkillType skillType = AbstractSkillType.Value1)
  194. {
  195. if (type == damageIndex_Normal)
  196. {
  197. }
  198. else if (type == damageIndex_3_4)
  199. {
  200. return this.damagePer_3_4 == null ? 0 : this.damagePer_3_4.GetSkillValue(skillType);
  201. }
  202. else if (type == damageIndex_3_5)
  203. {
  204. return this.damagePer_3_5 == null ? 0 : this.damagePer_3_5.GetSkillValue(skillType);
  205. }
  206. else if (type == damgeAddAll)
  207. {
  208. return this.damagePer_5_5 == null ? 0 : this.damagePer_5_5.GetSkillValue(skillType);
  209. }
  210. return 0;
  211. }
  212. }
  213. }