protected override void DoAction(BossPartStateController controller)
        {
            BossPart bossPart = controller.bossPart;

            Ability ability = AbilityUtils.FindAbilityByName(
                "Boss_MiniDebuffAoeAbility",
                bossPart.GetAbilityAgent().abilitiesMulti
                );

            if (!ability || !(ability is AoeAbility))
            {
                return;
            }
            AoeAbility aoeAbility = (AoeAbility)ability;

            var reachabeEnemies = WorkManager.FindReachableObjects(controller.nearbyEnemies, bossPart.transform.position, ability.range);

            // wait till at least 2 targets are reachable
            if (ability != null && ability.IsReady() && reachabeEnemies.Count > 1)
            {
                var abilityTarget = AoeUtils.GetAoeTargetPosition(
                    ability.range,
                    reachabeEnemies,
                    bossPart.GetPlayer()
                    );

                bossPart.UseAbility(abilityTarget, aoeAbility);
            }
        }
        protected override void DoAction(UnitStateController controller)
        {
            Unit    unit         = controller.unit;
            Ability abilityToUse = controller.abilityToUse;

            if (!abilityToUse || !(abilityToUse is AoeAbility))
            {
                return;
            }

            AoeAbility aoeAbility = (AoeAbility)abilityToUse;

            if (controller.aoeAbilityTarget == new Vector3())
            {
                controller.unit.UseAbility(unit.transform.position, aoeAbility);
                controller.abilityToUse = null;
            }

            Vector3 currentPosition = unit.transform.position;
            Vector3 direction       = controller.aoeAbilityTarget - currentPosition;

            if (direction.sqrMagnitude < aoeAbility.range * aoeAbility.range)
            {
                controller.unit.UseAbility(controller.aoeAbilityTarget, aoeAbility);

                if (!unit.aiming)
                {
                    controller.abilityToUse = null;
                }
            }
        }
示例#3
0
        public EarthSpirit(Unit9 owner, MultiSleeper abilitySleeper, Sleeper orbwalkSleeper, ControllableUnitMenu menu)
            : base(owner, abilitySleeper, orbwalkSleeper, menu)
        {
            this.ComboAbilities = new Dictionary <AbilityId, Func <ActiveAbility, UsableAbility> >
            {
                { AbilityId.earth_spirit_boulder_smash, x => this.smash = new BoulderSmash(x) },
                { AbilityId.earth_spirit_rolling_boulder, x => this.rolling = new RollingBoulder(x) },
                { AbilityId.earth_spirit_geomagnetic_grip, x => this.grip = new GeomagneticGrip(x) },
                { AbilityId.earth_spirit_magnetize, x => this.mag = new AoeAbility(x) },
                { AbilityId.earth_spirit_stone_caller, x => this.stone = new StoneRemnant(x) },
                //{ AbilityId.earth_spirit_petrify, x => this.petrify = new NukeAbility(x) },

                { AbilityId.item_blink, x => this.blink = new BlinkAbility(x) },
                { AbilityId.item_swift_blink, x => this.blink = new BlinkAbility(x) },
                { AbilityId.item_arcane_blink, x => this.blink = new BlinkAbility(x) },
                { AbilityId.item_overwhelming_blink, x => this.blink = new BlinkAbility(x) },
                { AbilityId.item_force_staff, x => this.force = new ForceStaff(x) },
                { AbilityId.item_spirit_vessel, x => this.vessel = new DebuffAbility(x) },
                { AbilityId.item_urn_of_shadows, x => this.urn = new DebuffAbility(x) },
                { AbilityId.item_veil_of_discord, x => this.veil = new DebuffAbility(x) },
                { AbilityId.item_blade_mail, x => this.bladeMail = new ShieldAbility(x) },
                { AbilityId.item_heavens_halberd, x => this.halberd = new DisableAbility(x) },
                { AbilityId.item_shivas_guard, x => this.shiva = new DebuffAbility(x) },
            };

            this.MoveComboAbilities.Add(AbilityId.earth_spirit_rolling_boulder, x => this.rollingBlink = new RollingBoulderBlink(x));
            this.MoveComboAbilities.Add(AbilityId.earth_spirit_stone_caller, x => this.stoneBlink      = new StoneRemnantBlink(x));
            this.MoveComboAbilities.Add(AbilityId.earth_spirit_boulder_smash, _ => this.smash);
        }
示例#4
0
 public virtual void UseAbility(Vector3 position, AoeAbility ability)
 {
     if (!isBusy && ability.IsReady())
     {
         ability.Use(position);
     }
 }
示例#5
0
        public Storm(Unit9 owner, MultiSleeper abilitySleeper, Sleeper orbwalkSleeper, ControllableUnitMenu menu)
            : base(owner, abilitySleeper, orbwalkSleeper, menu)
        {
            this.ComboAbilities = new Dictionary <AbilityId, Func <ActiveAbility, UsableAbility> >
            {
                { AbilityId.brewmaster_storm_cyclone, x => this.cyclone = new Cyclone(x) },
                { AbilityId.brewmaster_storm_dispel_magic, x => this.dispel = new Dispel(x) },
                { AbilityId.brewmaster_storm_wind_walk, x => this.windWalk = new WindWalk(x) },
                { AbilityId.brewmaster_cinder_brew, x => this.cender = new DebuffAbility(x) },
            };

            this.MoveComboAbilities.Add(AbilityId.brewmaster_storm_wind_walk, _ => this.windWalk);
        }
示例#6
0
文件: Enigma.cs 项目: vana41203/O9K
        public Enigma(Unit9 owner, MultiSleeper abilitySleeper, Sleeper orbwalkSleeper, ControllableUnitMenu menu)
            : base(owner, abilitySleeper, orbwalkSleeper, menu)
        {
            this.ComboAbilities = new Dictionary <AbilityId, Func <ActiveAbility, UsableAbility> >
            {
                { AbilityId.enigma_malefice, x => this.malefice = new DisableAbility(x) },
                { AbilityId.enigma_midnight_pulse, x => this.pulse = new AoeAbility(x) },
                { AbilityId.enigma_black_hole, x => this.blackHole = new BlackHole(x) },

                { AbilityId.item_black_king_bar, x => this.bkb = new ShieldAbility(x) },
                { AbilityId.item_ghost, x => this.ghost = new ShieldAbility(x) },
                { AbilityId.item_blink, x => this.blink = new BlinkDaggerEnigma(x) },
                { AbilityId.item_refresher, x => this.refresher = new UntargetableAbility(x) },
                { AbilityId.item_refresher_shard, x => this.refresherShard = new UntargetableAbility(x) },
                { AbilityId.item_shivas_guard, x => this.shiva = new DebuffAbility(x) },
            };
        }
示例#7
0
        public Venomancer(Unit9 owner, MultiSleeper abilitySleeper, Sleeper orbwalkSleeper, ControllableUnitMenu menu)
            : base(owner, abilitySleeper, orbwalkSleeper, menu)
        {
            this.ComboAbilities = new Dictionary <AbilityId, Func <ActiveAbility, UsableAbility> >
            {
                { AbilityId.venomancer_venomous_gale, x => this.gale = new DebuffAbility(x) },
                { AbilityId.venomancer_plague_ward, x => this.ward = new PlagueWardAbility(x) },
                { AbilityId.venomancer_poison_nova, x => this.nova = new PoisonNova(x) },

                { AbilityId.item_veil_of_discord, x => this.veil = new DebuffAbility(x) },
                { AbilityId.item_blink, x => this.blink = new BlinkDaggerAOE(x) },
                { AbilityId.item_shivas_guard, x => this.shiva = new DebuffAbility(x) },
                { AbilityId.item_force_staff, x => this.force = new ForceStaff(x) },
                { AbilityId.item_orchid, x => this.orchid = new DisableAbility(x) },
                { AbilityId.item_bloodthorn, x => this.bloodthorn = new Bloodthorn(x) },
            };

            this.MoveComboAbilities.Add(AbilityId.venomancer_venomous_gale, _ => this.gale);
        }
示例#8
0
        public Razor(Unit9 owner, MultiSleeper abilitySleeper, Sleeper orbwalkSleeper, ControllableUnitMenu menu)
            : base(owner, abilitySleeper, orbwalkSleeper, menu)
        {
            this.ComboAbilities = new Dictionary <AbilityId, Func <ActiveAbility, UsableAbility> >
            {
                { AbilityId.razor_plasma_field, x => this.plasma = new NukeAbility(x) },
                { AbilityId.razor_static_link, x => this.link = new StaticLink(x) },
                { AbilityId.razor_eye_of_the_storm, x => this.storm = new AoeAbility(x) },

                { AbilityId.item_phase_boots, x => this.phase = new SpeedBuffAbility(x) },
                { AbilityId.item_force_staff, x => this.force = new ForceStaff(x) },
                { AbilityId.item_hurricane_pike, x => this.pike = new HurricanePike(x) },
                { AbilityId.item_blade_mail, x => this.bladeMail = new ShieldAbility(x) },
                { AbilityId.item_rod_of_atos, x => this.atos = new DisableAbility(x) },
                { AbilityId.item_black_king_bar, x => this.bkb = new ShieldAbility(x) },
                { AbilityId.item_shivas_guard, x => this.shiva = new DebuffAbility(x) },
                { AbilityId.item_heavens_halberd, x => this.halberd = new DisableAbility(x) },
            };
        }
        protected override void DoAction(UnitStateController controller)
        {
            Unit        unit        = controller.unit;
            WorldObject chaseTarget = controller.enemyAbilityTarget
                ? controller.enemyAbilityTarget
                : controller.chaseTarget;
            Ability ability = controller.abilityToUse;

            if (!ability)
            {
                return;
            }

            if (ability is AoeAbility)
            {
                AoeAbility aoeAbility = (AoeAbility)ability;
                // for now, all AoE are self-AoE
                controller.unit.UseAbility(unit.transform.position, aoeAbility);
                controller.abilityToUse = null;

                return;
            }

            // if no target or canтot attack, return
            if (!ability || chaseTarget == null || !unit.CanAttack())
            {
                return;
            }

            Vector3 currentPosition      = unit.transform.position;
            Vector3 currentEnemyPosition = WorkManager.GetTargetClosestPoint(unit, chaseTarget);
            Vector3 direction            = currentEnemyPosition - currentPosition;

            if (direction.sqrMagnitude < ability.range * ability.range)
            {
                controller.unit.UseAbility(chaseTarget, ability);

                if (!unit.aiming)
                {
                    controller.abilityToUse = null;
                }
            }
        }
示例#10
0
        public Pugna(Unit9 owner, MultiSleeper abilitySleeper, Sleeper orbwalkSleeper, ControllableUnitMenu menu)
            : base(owner, abilitySleeper, orbwalkSleeper, menu)
        {
            this.ComboAbilities = new Dictionary <AbilityId, Func <ActiveAbility, UsableAbility> >
            {
                { AbilityId.pugna_nether_blast, x => this.blast = new NukeAbility(x) },
                { AbilityId.pugna_decrepify, x => this.decrepify = new DebuffAbility(x) },
                { AbilityId.pugna_nether_ward, x => this.ward = new AoeAbility(x) },
                { AbilityId.pugna_life_drain, x => this.drain = new TargetableAbility(x) },

                { AbilityId.item_blink, x => this.blink = new BlinkAbility(x) },
                { AbilityId.item_dagon_5, x => this.dagon = new NukeAbility(x) },
                { AbilityId.item_sheepstick, x => this.hex = new DisableAbility(x) },
                { AbilityId.item_orchid, x => this.orchid = new DisableAbility(x) },
                { AbilityId.item_veil_of_discord, x => this.veil = new DebuffAbility(x) },
                { AbilityId.item_bloodthorn, x => this.bloodthorn = new Bloodthorn(x) },
                { AbilityId.item_nullifier, x => this.nullifier = new Nullifier(x) },
                { AbilityId.item_rod_of_atos, x => this.atos = new DisableAbility(x) },
            };
        }
        protected override void DoAction(UnitStateController controller)
        {
            Unit    unit         = controller.unit;
            Ability abilityToUse = controller.abilityToUse;

            if (!abilityToUse)
            {
                return;
            }

            if (abilityToUse is AoeAbility)
            {
                AoeAbility aoeAbility = (AoeAbility)abilityToUse;
                // for now, all AoE are self-AoE
                controller.unit.UseAbility(unit.transform.position, aoeAbility);
                controller.abilityToUse = null;

                return;
            }

            Vector3            currentPosition  = unit.transform.position;
            List <WorldObject> reachableEnemies = controller.nearbyEnemies
                                                  .Where(p =>
            {
                Vector3 currentEnemyPosition = WorkManager.GetTargetClosestPoint(unit, p);
                Vector3 direction            = currentEnemyPosition - currentPosition;

                return(direction.sqrMagnitude < abilityToUse.range * abilityToUse.range);
            })
                                                  .ToList();

            if (reachableEnemies.Count > 0)
            {
                controller.unit.UseAbility(reachableEnemies, abilityToUse);
                controller.abilityToUse = null;
            }
        }