using CommonAI.Zone.Helper; using CommonAI.Zone.Instance; using XmdsCommonServer.Plugin; using XmdsCommonServer.XLS.Data; using XmdsCommonSkill.Plugin.Buffs; using System; using static CommonAI.Zone.Instance.InstanceUnit; using XmdsCommon.Plugin; using CommonAI.Zone; using XmdsCommonServer.Plugin.Units; using CommonAI.Zone.Formula; using XmdsCommonSkill.Plugin.Skills; using XmdsCommonServer.Plugin.XmdsSkillTemplate.DamageCalculator; using CommonLang; using CommonAI.Data; using static CommonAI.Zone.Helper.HateSystem; using System.Collections.Generic; using XmdsCommonServer.Message; using CommonAI.ZoneServer.JSGModule; namespace XmdsCommonSkill.Plugin.PassiveSkills.Remedy { /// /// boss-山大王管辖boss被动 /// class Boss_91001 : XmdsPassiveSkillBase { public static int ID = 91001; public override int SkillID { get { return ID; } } //绑定buffID private static int mBuffID = (int)XmdsBuffBase.XmdsBuffList.BOSS_WEAK; private static XmdsSkillValue mValueSet1; // 血量百分比N时,触发护卫事件 private static XmdsSkillValue mValueSet2; // 山大王死亡时触发虚弱逻辑:每隔N1秒N2概率虚弱N3秒 private static XmdsSkillValue mValueSet3; // 山大王死亡期间,受伤增加 //内部变量 private int mUUID_1 = 0; private int mTriggerHP; private bool mTriggerHelp; private float mDamageDeeper; private XmdsVirtual mOwner; //虚弱逻辑 private long mNextWeakTime; public short mWeakRate; public int mWeakInterval; protected override void OnInit(GameSkill skillInfo, XmdsVirtual owner) { XmdsBuffPack pack = XmdsBuffFactory.GetInstance().GetXmdsBuffPack(mBuffID); BuffTemplate bt = pack.mBuffTemplate; bt.IsHarmful = true; bt.LifeTimeMS = mValueSet2.GetValue(skillInfo.SkillLevel, 3); pack.BindTemplateAndDispose(); owner.RegistSendBuff(bt); this.mUUID_1 = owner.RegistOnHitDamage(OnHandleHitDmage, skillInfo, true); this.mTriggerHP = CUtils.CastInt(owner.MirrorProp.MaxHP * XmdsUnitProp.PER * mValueSet1.GetValue(skillInfo.SkillLevel)); this.mOwner = owner; this.mDamageDeeper = mValueSet3.GetValue(skillInfo.SkillLevel) * XmdsUnitProp.PER; this.mWeakRate = (short)mValueSet2.GetValue(skillInfo.SkillLevel, 2); this.mWeakInterval = mValueSet2.GetValue(skillInfo.SkillLevel, 1); } protected override void OnDispose(XmdsVirtual owner) { owner.UnRegistOnHitDamage(this.mUUID_1); } protected override void OnUpdate(int intervalMS, bool slowRefresh) { if(!slowRefresh) { return; } if (this.mOwner.GetBattleStatus() <= BattleStatus.ReadyBattle) { mNextWeakTime = 0; mTriggerHelp = false; return; } int kingID = this.mOwner.mUnit.Parent.GetZoneKingID(); if (kingID > 0 && mNextWeakTime < CommonLang.CUtils.localTimeMS && !JSGMountainKingModule.IsKingAlive(this.mOwner.mUnit.Parent, kingID) && this.mOwner.RandomPercent(this.mWeakRate)) { this.mNextWeakTime = this.mWeakInterval + CommonLang.CUtils.localTimeMS; this.mOwner.mUnit.AddBuff(mBuffID); } } private float OnHandleHitDmage(float damage, XmdsVirtual hitted, XmdsVirtual attacker, AttackSource source, ref XmdsVirtual.AtkResult result, DamageType damageType, GameSkill skill, ref bool isEndDispatch) { int kingID = hitted.mUnit.Parent.GetZoneKingID(); if (kingID <= 0) { return damage; } if (!JSGMountainKingModule.IsKingAlive(hitted.mUnit.Parent, kingID)) { damage += damage * this.mDamageDeeper; } else if (!mTriggerHelp && hitted.mUnit.IsActive && hitted.mUnit.Virtual.GetBattleStatus() >= BattleStatus.PVE) { //一刀就干到了触发值的,可以过滤,毕竟第二刀就死了 int leftHP = (int)(hitted.mUnit.CurrentHP - damage); if (leftHP > 0 && leftHP < mTriggerHP) { mTriggerHelp = true; List ret = new List(); hitted.GetHateSystem().GetHateList(ret); // MountainKingHelpEventB2R notifyEvent = new MountainKingHelpEventB2R(); notifyEvent.mapId = hitted.mUnit.Parent.GetSceneID(); notifyEvent.monsterId = hitted.mUnit.Info.ID; notifyEvent.monsterObjectId = hitted.mUnit.ID; int playerCount = Math.Min(3, ret.Count); for (int i = 0; i < ret.Count; i++) { InstanceUnit player = ret[i].Unit; if (player == null || !player.IsPlayer) { continue; } notifyEvent.players.Add(player.PlayerUUID); } if (notifyEvent.players.Count > 0) { hitted.mUnit.queueEvent(notifyEvent); } else { log.Warn("触发大王护卫事件,找不到仇恨目标:" + hitted.mUnit.Parent.GetSceneID() + ", " + hitted.mUnit.Info.ID + ", " + ret.Count + ", 本次伤害:" + damage + ", 剩余血量: " + leftHP + ", PV状态: " + hitted.mUnit.Virtual.GetBattleStatus() + ", 本次攻击者信息:" + attacker.mUnit.PlayerUUID + ", " + attacker.mUnit.Info.ID + ", " + JSGModule.GetAttackSourceDes(source)); } } } return damage; } protected override void OnInitSkillParam() { XmdsSkillData data = XmdsDataMgr.GetInstance().GetXmdsSkillData(ID); InitData(data, out mValueSet1, XmdsSkillData.XmdsSkillDataKey.ValueSet); InitData(data, out mValueSet2, XmdsSkillData.XmdsSkillDataKey.ValueSet2); InitData(data, out mValueSet3, XmdsSkillData.XmdsSkillDataKey.ValueSet3); } } }