Boss_91001.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. using CommonAI.Zone.Helper;
  2. using CommonAI.Zone.Instance;
  3. using XmdsCommonServer.Plugin;
  4. using XmdsCommonServer.XLS.Data;
  5. using XmdsCommonSkill.Plugin.Buffs;
  6. using System;
  7. using static CommonAI.Zone.Instance.InstanceUnit;
  8. using XmdsCommon.Plugin;
  9. using CommonAI.Zone;
  10. using XmdsCommonServer.Plugin.Units;
  11. using CommonAI.Zone.Formula;
  12. using XmdsCommonSkill.Plugin.Skills;
  13. using XmdsCommonServer.Plugin.XmdsSkillTemplate.DamageCalculator;
  14. using CommonLang;
  15. using CommonAI.Data;
  16. using static CommonAI.Zone.Helper.HateSystem;
  17. using System.Collections.Generic;
  18. using XmdsCommonServer.Message;
  19. using CommonAI.ZoneServer.JSGModule;
  20. namespace XmdsCommonSkill.Plugin.PassiveSkills.Remedy
  21. {
  22. /// <summary>
  23. /// boss-山大王管辖boss被动
  24. /// </summary>
  25. class Boss_91001 : XmdsPassiveSkillBase
  26. {
  27. public static int ID = 91001;
  28. public override int SkillID { get { return ID; } }
  29. //绑定buffID
  30. private static int mBuffID = (int)XmdsBuffBase.XmdsBuffList.BOSS_WEAK;
  31. private static XmdsSkillValue mValueSet1; // 血量百分比N时,触发护卫事件
  32. private static XmdsSkillValue mValueSet2; // 山大王死亡时触发虚弱逻辑:每隔N1秒N2概率虚弱N3秒
  33. private static XmdsSkillValue mValueSet3; // 山大王死亡期间,受伤增加
  34. //内部变量
  35. private int mUUID_1 = 0;
  36. private int mTriggerHP;
  37. private bool mTriggerHelp;
  38. private float mDamageDeeper;
  39. private XmdsVirtual mOwner;
  40. //虚弱逻辑
  41. private long mNextWeakTime;
  42. public short mWeakRate;
  43. public int mWeakInterval;
  44. protected override void OnInit(GameSkill skillInfo, XmdsVirtual owner)
  45. {
  46. XmdsBuffPack pack = XmdsBuffFactory.GetInstance().GetXmdsBuffPack(mBuffID);
  47. BuffTemplate bt = pack.mBuffTemplate;
  48. bt.IsHarmful = true;
  49. bt.LifeTimeMS = mValueSet2.GetValue(skillInfo.SkillLevel, 3);
  50. pack.BindTemplateAndDispose();
  51. owner.RegistSendBuff(bt);
  52. this.mUUID_1 = owner.RegistOnHitDamage(OnHandleHitDmage, skillInfo, true);
  53. this.mTriggerHP = CUtils.CastInt(owner.MirrorProp.MaxHP * XmdsUnitProp.PER * mValueSet1.GetValue(skillInfo.SkillLevel));
  54. this.mOwner = owner;
  55. this.mDamageDeeper = mValueSet3.GetValue(skillInfo.SkillLevel) * XmdsUnitProp.PER;
  56. this.mWeakRate = (short)mValueSet2.GetValue(skillInfo.SkillLevel, 2);
  57. this.mWeakInterval = mValueSet2.GetValue(skillInfo.SkillLevel, 1);
  58. }
  59. protected override void OnDispose(XmdsVirtual owner)
  60. {
  61. owner.UnRegistOnHitDamage(this.mUUID_1);
  62. }
  63. protected override void OnUpdate(int intervalMS, bool slowRefresh)
  64. {
  65. if(!slowRefresh)
  66. {
  67. return;
  68. }
  69. if (this.mOwner.GetBattleStatus() <= BattleStatus.ReadyBattle)
  70. {
  71. mNextWeakTime = 0;
  72. mTriggerHelp = false;
  73. return;
  74. }
  75. int kingID = this.mOwner.mUnit.Parent.GetZoneKingID();
  76. if (kingID > 0 && mNextWeakTime < CommonLang.CUtils.localTimeMS && !JSGMountainKingModule.IsKingAlive(this.mOwner.mUnit.Parent, kingID)
  77. && this.mOwner.RandomPercent(this.mWeakRate))
  78. {
  79. this.mNextWeakTime = this.mWeakInterval + CommonLang.CUtils.localTimeMS;
  80. this.mOwner.mUnit.AddBuff(mBuffID);
  81. }
  82. }
  83. private float OnHandleHitDmage(float damage, XmdsVirtual hitted, XmdsVirtual attacker, AttackSource source,
  84. ref XmdsVirtual.AtkResult result, DamageType damageType, GameSkill skill, ref bool isEndDispatch)
  85. {
  86. int kingID = hitted.mUnit.Parent.GetZoneKingID();
  87. if (kingID <= 0)
  88. {
  89. return damage;
  90. }
  91. if (!JSGMountainKingModule.IsKingAlive(hitted.mUnit.Parent, kingID))
  92. {
  93. damage += damage * this.mDamageDeeper;
  94. }
  95. else if (!mTriggerHelp && hitted.mUnit.IsActive && hitted.mUnit.Virtual.GetBattleStatus() >= BattleStatus.PVE)
  96. {
  97. //一刀就干到了触发值的,可以过滤,毕竟第二刀就死了
  98. int leftHP = (int)(hitted.mUnit.CurrentHP - damage);
  99. if (leftHP > 0 && leftHP < mTriggerHP)
  100. {
  101. mTriggerHelp = true;
  102. List<HateInfo> ret = new List<HateInfo>();
  103. hitted.GetHateSystem().GetHateList(ret);
  104. //
  105. MountainKingHelpEventB2R notifyEvent = new MountainKingHelpEventB2R();
  106. notifyEvent.mapId = hitted.mUnit.Parent.GetSceneID();
  107. notifyEvent.monsterId = hitted.mUnit.Info.ID;
  108. notifyEvent.monsterObjectId = hitted.mUnit.ID;
  109. int playerCount = Math.Min(3, ret.Count);
  110. for (int i = 0; i < ret.Count; i++)
  111. {
  112. InstanceUnit player = ret[i].Unit;
  113. if (player == null || !player.IsPlayer)
  114. {
  115. continue;
  116. }
  117. notifyEvent.players.Add(player.PlayerUUID);
  118. }
  119. if (notifyEvent.players.Count > 0)
  120. {
  121. hitted.mUnit.queueEvent(notifyEvent);
  122. }
  123. else
  124. {
  125. log.Warn("触发大王护卫事件,找不到仇恨目标:" + hitted.mUnit.Parent.GetSceneID() + ", " + hitted.mUnit.Info.ID + ", " + ret.Count
  126. + ", 本次伤害:" + damage + ", 剩余血量: " + leftHP + ", PV状态: " + hitted.mUnit.Virtual.GetBattleStatus()
  127. + ", 本次攻击者信息:" + attacker.mUnit.PlayerUUID + ", " + attacker.mUnit.Info.ID + ", " + JSGModule.GetAttackSourceDes(source));
  128. }
  129. }
  130. }
  131. return damage;
  132. }
  133. protected override void OnInitSkillParam()
  134. {
  135. XmdsSkillData data = XmdsDataMgr.GetInstance().GetXmdsSkillData(ID);
  136. InitData(data, out mValueSet1, XmdsSkillData.XmdsSkillDataKey.ValueSet);
  137. InitData(data, out mValueSet2, XmdsSkillData.XmdsSkillDataKey.ValueSet2);
  138. InitData(data, out mValueSet3, XmdsSkillData.XmdsSkillDataKey.ValueSet3);
  139. }
  140. }
  141. }