using System.Linq; namespace Turbo.Plugins.LightningMod { public class NecSkeletalMagePlugin : AbstractSkillHandler, ISkillHandler { public NecSkeletalMagePlugin() : base(CastType.BuffSkill, CastPhase.AutoCast, CastPhase.Attack, CastPhase.AttackIdle) { Enabled = false; } public override void Load(IController hud) { base.Load(hud); AssignedSnoPower = Hud.Sno.SnoPowers.Necromancer_SkeletalMage; CreateCastRule() .IfTrue(ctx => ctx.Skill.Rune == 4).ThenContinueElseNoCast()//弓箭手符文 .IfCanCastSkill(100, 150, 1000).ThenContinueElseNoCast() .IfInTown().ThenNoCastElseContinue() .IfCastingIdentify().ThenNoCastElseContinue() .IfCastingPortal().ThenNoCastElseContinue() .IfOnCooldown().ThenNoCastElseContinue() .IfPrimaryResourceAmountIsAbove(ctx => (int)(40 - 40 * Hud.Game.Me.Stats.ResourceCostReduction) + 1).ThenContinueElseNoCast()//确保有保底能量 .IfEliteOrBossIsNearby(ctx => 55).ThenContinueElseNoCast()//附近55码内有精英或BOSS .IfTrue(ctx => {//施放亡者领域时施放召唤骷髅弓箭手确保亡者领域全程覆盖攻速BUFF var buffSimulacrum = Hud.Game.Me.Powers.GetBuff(Hud.Sno.SnoPowers.Necromancer_Simulacrum.Sno);//血魂双分期间 var buffSkeletalMage = Hud.Game.Me.Powers.GetBuff(Hud.Sno.SnoPowers.Necromancer_SkeletalMage.Sno);//骷髅法师 return buffSkeletalMage?.IconCounts[6] < 2 && buffSimulacrum?.TimeElapsedSeconds[1] < 0.5 && buffSimulacrum?.TimeElapsedSeconds[1] != 0; }).ThenCastElseContinue() .IfSpecificBuffIsActive(Hud.Sno.SnoPowers.AquilaCuirass, 1).ThenContinueElseNoCast()//天鹰激活 .IfSpecificBuffIsActive(Hud.Sno.SnoPowers.Necromancer_SkeletalMage, 6).ThenNoCastElseContinue()//骷髅法师激活 .IfSpecificBuffIsAboutToExpire(Hud.Sno.SnoPowers.Necromancer_SkeletalMage, 3, 100, 500).ThenCastElseContinue()//弓箭手BUFF即将过期(0.5秒以内) ; CreateCastRule() .IfTrue(ctx => ctx.Skill.Rune == 1).ThenContinueElseNoCast()//精魂灌注符文 .IfCanCastSkill(100, 150, 1000).ThenContinueElseNoCast() .IfInTown().ThenNoCastElseContinue() .IfCastingIdentify().ThenNoCastElseContinue() .IfCastingPortal().ThenNoCastElseContinue() .IfOnCooldown().ThenNoCastElseContinue() .IfEnoughMonstersNearby(ctx => 55, ctx => 1).ThenContinueElseNoCast()//至少周围要有怪 .IfPrimaryResourceAmountIsAbove(ctx => (int)(40 - 40 * Hud.Game.Me.Stats.ResourceCostReduction) + 1).ThenContinueElseNoCast()//确保有保底能量 .IfTrue(ctx => { int skeletons = 2; if (ctx.Hud.Game.ActorQuery.IsEliteOrBossCloserThan(55))//有精英时 { skeletons = 2; } else if (ctx.Skill.Player.Density.GetDensity(55) <= 15)//没有精英且小于等于15个怪时 { skeletons = 2; } else//没有精英且大于15个怪时 { skeletons = 8; } var buff = Hud.Game.Me.Powers.GetBuff(Hud.Sno.SnoPowers.Necromancer_SkeletalMage.Sno); return (buff?.IconCounts[6] < skeletons);//小于指定骷髅数施放 }).ThenCastElseContinue()//优先保证骷髅最低数量再保证骷髅质量 .IfPrimaryResourcePercentageIsAbove((Hud.Game.Me.Powers.BuffIsActive(Hud.Sno.SnoPowers.Necromancer_LandOfTheDead.Sno) || Hud.Game.Me.Powers.BuffIsActive(Hud.Sno.SnoPowers.Necromancer_Simulacrum.Sno) || (Hud.Game.Actors.Where(x => x.SnoActor.Kind == ActorKind.HealthGlobe && x.IsOnScreen).Count() * Hud.Game.Me.Stats.ResourceMaxEssence * GetReapersWrapspercent() + (Hud.Game.Me.Powers.UsedSkills.Any(x => x.SnoPower.Sno == 460757) ? Hud.Game.Actors.Where(x => x.SnoActor.Sno == ActorSnoEnum._p6_necro_corpse_flesh && x.CentralXyDistanceToMe <= 60).Count() * 10 : 0) + Hud.Game.Me.Stats.ResourceCurEssence >= Hud.Game.Me.Stats.ResourceMaxEssence)) ? 100 : 90).ThenContinueElseNoCast()//高能时 .IfTrue(ctx => { var actorsSkeletonMage = Hud.Game.Actors.Where(x => x.SnoActor.Sno == ActorSnoEnum._p6_necro_skeletonmage_c && x.GetAttributeValueAsInt(Hud.Sno.Attributes.Pet_Owner, 0xFFFFF) == 0 && (x.GetAttributeValue(Hud.Sno.Attributes.Multiplicative_Damage_Percent_Bonus, 0xFFFFF) >= (Hud.Game.Me.Stats.ResourceMaxEssence * 0.9 - (40 - 40 * Hud.Game.Me.Stats.ResourceCostReduction)) * 3 / 100 + 1));//自己招的高能骷髅,随动最大精魂上限的90% return actorsSkeletonMage.Count() < 10; }).ThenCastElseContinue()//10个高能骷髅时往下判断 .IfSpecificBuffIsAboutToExpire(Hud.Sno.SnoPowers.Necromancer_SkeletalMage, 6, 100, 500).ThenCastElseContinue()//有高能骷髅即将消失(0.5秒以内) ; } private float GetReapersWrapspercent() { float percent = 0; if (Hud.Game.Me.CubeSnoItem2 != null && Hud.Game.Me.CubeSnoItem2.Sno == Hud.Sno.SnoItems.Unique_Bracer_103_x1.Sno) { percent = 0.3f; } else { var Reapers = Hud.Game.Items.FirstOrDefault(item => item.Location == ItemLocation.Bracers && item.SnoItem.Sno == Hud.Sno.SnoItems.Unique_Bracer_103_x1.Sno); percent = Reapers == null ? 0 : (float)Reapers.Perfections.FirstOrDefault(p => p.Attribute.Code == "Item_Power_Passive").Cur; } return percent; } } }