Exemplo n.º 1
0
        public override void InjectSkills(GameObject gameObject, BaseAI ai)
        {
            // Edit
            ai.minDistanceFromEnemy = 20;

            // Skills
            AISkillDriver skill1 = gameObject.AddComponent <AISkillDriver>() as AISkillDriver;

            skill1.customName                        = "Shoot";
            skill1.skillSlot                         = RoR2.SkillSlot.Primary;
            skill1.requireSkillReady                 = true;
            skill1.moveTargetType                    = AISkillDriver.TargetType.CurrentEnemy;
            skill1.minDistance                       = 0;
            skill1.maxDistance                       = 50;
            skill1.selectionRequiresTargetLoS        = true;
            skill1.activationRequiresTargetLoS       = true;
            skill1.activationRequiresAimConfirmation = true;
            skill1.movementType                      = AISkillDriver.MovementType.StrafeMovetarget;
            skill1.aimType         = AISkillDriver.AimType.AtMoveTarget;
            skill1.ignoreNodeGraph = false;
            skill1.resetCurrentEnemyOnNextDriverSelection = false;
            skill1.noRepeat     = false;
            skill1.shouldSprint = false;

            // Add default skills
            AddDefaultSkills(gameObject, ai);
        }
Exemplo n.º 2
0
 /// <summary>
 /// Copies skilldriver settings from "beingCopiedFrom" to "copier"
 /// Don't forget to set requiredSkill!
 /// </summary>
 /// <param name="beingCopiedFrom"></param>
 /// <param name="copier"></param>
 public static void CopyAISkillSettings(AISkillDriver beingCopiedFrom, AISkillDriver copier)
 {
     copier.activationRequiresAimConfirmation = beingCopiedFrom.activationRequiresAimConfirmation;
     copier.activationRequiresTargetLoS       = beingCopiedFrom.activationRequiresTargetLoS;
     copier.aimType                   = beingCopiedFrom.aimType;
     copier.buttonPressType           = beingCopiedFrom.buttonPressType;
     copier.customName                = beingCopiedFrom.customName;
     copier.driverUpdateTimerOverride = beingCopiedFrom.driverUpdateTimerOverride;
     copier.ignoreNodeGraph           = beingCopiedFrom.ignoreNodeGraph;
     copier.maxDistance               = beingCopiedFrom.maxDistance;
     copier.maxTargetHealthFraction   = beingCopiedFrom.maxTargetHealthFraction;
     copier.maxUserHealthFraction     = beingCopiedFrom.maxUserHealthFraction;
     copier.minDistance               = beingCopiedFrom.minDistance;
     copier.minTargetHealthFraction   = beingCopiedFrom.minTargetHealthFraction;
     copier.minUserHealthFraction     = beingCopiedFrom.minUserHealthFraction;
     copier.moveInputScale            = beingCopiedFrom.moveInputScale;
     copier.movementType              = beingCopiedFrom.movementType;
     copier.moveTargetType            = beingCopiedFrom.moveTargetType;
     copier.nextHighPriorityOverride  = beingCopiedFrom.nextHighPriorityOverride;
     copier.noRepeat                  = beingCopiedFrom.noRepeat;
     //Don't do this because the skilldef is not the same.
     //_out.requiredSkill = _in.requiredSkill;
     copier.requireEquipmentReady = beingCopiedFrom.requireEquipmentReady;
     copier.requireSkillReady     = beingCopiedFrom.requireSkillReady;
     copier.resetCurrentEnemyOnNextDriverSelection = beingCopiedFrom.resetCurrentEnemyOnNextDriverSelection;
     copier.selectionRequiresOnGround  = beingCopiedFrom.selectionRequiresOnGround;
     copier.selectionRequiresTargetLoS = beingCopiedFrom.selectionRequiresTargetLoS;
     copier.shouldFireEquipment        = beingCopiedFrom.shouldFireEquipment;
     copier.shouldSprint = beingCopiedFrom.shouldSprint;
     //shouldTapButton is deprecated, don't use it!
     //_out.shouldTapButton = _in.shouldTapButton;
     copier.skillSlot = beingCopiedFrom.skillSlot;
 }
Exemplo n.º 3
0
        public override void InjectSkills(GameObject gameObject, BaseAI ai)
        {
            AISkillDriver skill3 = gameObject.AddComponent <AISkillDriver>() as AISkillDriver;

            skill3.customName                        = "Utility";
            skill3.skillSlot                         = RoR2.SkillSlot.Utility;
            skill3.requireSkillReady                 = true;
            skill3.moveTargetType                    = AISkillDriver.TargetType.CurrentEnemy;
            skill3.minDistance                       = 10;
            skill3.maxDistance                       = 50;
            skill3.selectionRequiresTargetLoS        = true;
            skill3.activationRequiresTargetLoS       = true;
            skill3.activationRequiresAimConfirmation = false;
            skill3.movementType                      = AISkillDriver.MovementType.ChaseMoveTarget;
            skill3.aimType         = AISkillDriver.AimType.AtMoveTarget;
            skill3.ignoreNodeGraph = false;
            skill3.resetCurrentEnemyOnNextDriverSelection = false;
            skill3.noRepeat     = false;
            skill3.shouldSprint = false;

            AISkillDriver skill2 = gameObject.AddComponent <AISkillDriver>() as AISkillDriver;

            skill2.customName                        = "Secondary";
            skill2.skillSlot                         = RoR2.SkillSlot.Secondary;
            skill2.requireSkillReady                 = true;
            skill2.moveTargetType                    = AISkillDriver.TargetType.CurrentEnemy;
            skill2.minDistance                       = 0;
            skill2.maxDistance                       = 10;
            skill2.selectionRequiresTargetLoS        = true;
            skill2.activationRequiresTargetLoS       = true;
            skill2.activationRequiresAimConfirmation = true;
            skill2.movementType                      = AISkillDriver.MovementType.ChaseMoveTarget;
            skill2.aimType         = AISkillDriver.AimType.AtMoveTarget;
            skill2.ignoreNodeGraph = false;
            skill2.resetCurrentEnemyOnNextDriverSelection = false;
            skill2.noRepeat     = false;
            skill2.shouldSprint = false;

            // Skills
            AISkillDriver skill1 = gameObject.AddComponent <AISkillDriver>() as AISkillDriver;

            skill1.customName                        = "Primary";
            skill1.skillSlot                         = RoR2.SkillSlot.Primary;
            skill1.requireSkillReady                 = true;
            skill1.moveTargetType                    = AISkillDriver.TargetType.CurrentEnemy;
            skill1.minDistance                       = 0;
            skill1.maxDistance                       = 50;
            skill1.selectionRequiresTargetLoS        = true;
            skill1.activationRequiresTargetLoS       = true;
            skill1.activationRequiresAimConfirmation = true;
            skill1.movementType                      = AISkillDriver.MovementType.StrafeMovetarget;
            skill1.aimType         = AISkillDriver.AimType.AtCurrentEnemy;
            skill1.ignoreNodeGraph = false;
            skill1.resetCurrentEnemyOnNextDriverSelection = false;
            skill1.noRepeat     = false;
            skill1.shouldSprint = false;

            // Add default skills
            AddDefaultSkills(gameObject, ai, 0);
        }
Exemplo n.º 4
0
        public void Awake()
        {
            this.master       = base.GetComponent <CharacterMaster>();
            this.ai           = base.GetComponent <BaseAI>();
            this.stateMachine = base.GetComponent <EntityStateMachine>();

            if (ai is PlayerBotBaseAI)
            {
                customTargetSkillDriver = ai.skillDrivers.First(driver => driver.customName.Equals("CustomTargetLeash"));
                bodyInteractor          = master.GetBody().GetComponent <Interactor>();
                this.stageCache         = new StageCache();
            }
        }
Exemplo n.º 5
0
        private void ApplyDummyAI(BaseAI baseAI, GameObject leader)
        {
            baseAI.leader.gameObject        = leader;
            baseAI.neverRetaliateFriendlies = true;

            AISkillDriver waitNearLeaderDefault = baseAI.gameObject.AddComponent <AISkillDriver>();

            waitNearLeaderDefault.customName                        = "WaitNearLeaderDefault";
            waitNearLeaderDefault.skillSlot                         = SkillSlot.None;
            waitNearLeaderDefault.requiredSkill                     = null;
            waitNearLeaderDefault.requireSkillReady                 = false;
            waitNearLeaderDefault.requireEquipmentReady             = false;
            waitNearLeaderDefault.minUserHealthFraction             = float.NegativeInfinity;
            waitNearLeaderDefault.maxUserHealthFraction             = float.PositiveInfinity;
            waitNearLeaderDefault.minTargetHealthFraction           = float.NegativeInfinity;
            waitNearLeaderDefault.maxTargetHealthFraction           = float.PositiveInfinity;
            waitNearLeaderDefault.minDistance                       = 0f;
            waitNearLeaderDefault.maxDistance                       = float.PositiveInfinity;
            waitNearLeaderDefault.selectionRequiresTargetLoS        = false;
            waitNearLeaderDefault.selectionRequiresOnGround         = false;
            waitNearLeaderDefault.moveTargetType                    = AISkillDriver.TargetType.CurrentLeader;
            waitNearLeaderDefault.activationRequiresTargetLoS       = false;
            waitNearLeaderDefault.activationRequiresAimConfirmation = false;
            waitNearLeaderDefault.movementType                      = AISkillDriver.MovementType.Stop;
            waitNearLeaderDefault.moveInputScale                    = 1f;
            waitNearLeaderDefault.aimType                   = AISkillDriver.AimType.AtCurrentLeader;
            waitNearLeaderDefault.ignoreNodeGraph           = true;
            waitNearLeaderDefault.shouldSprint              = false;
            waitNearLeaderDefault.shouldFireEquipment       = false;
            waitNearLeaderDefault.buttonPressType           = AISkillDriver.ButtonPressType.Hold;
            waitNearLeaderDefault.driverUpdateTimerOverride = -1f;
            waitNearLeaderDefault.resetCurrentEnemyOnNextDriverSelection = false;
            waitNearLeaderDefault.noRepeat = false;
            waitNearLeaderDefault.nextHighPriorityOverride = null;

            PropertyInfo skillDriversProperty = typeof(BaseAI).GetProperty("skillDrivers", BindingFlags.Instance | BindingFlags.Public);

            if (skillDriversProperty != null)
            {
                skillDriversProperty.SetValue(baseAI, new AISkillDriver[] { waitNearLeaderDefault }, null);
            }

            typeof(BaseAI)
            .GetField("skillDriverUpdateTimer", BindingFlags.Instance | BindingFlags.NonPublic)
            .SetValue(baseAI, 0f);
            typeof(BaseAI)
            .GetField("targetRefreshTimer", BindingFlags.Instance | BindingFlags.NonPublic)
            .SetValue(baseAI, 0f);
        }
        private void ModifyDroneMaster()
        {
            DestroySkillDrivers(droneMasterRed);
            DestroySkillDrivers(droneMasterGreen);
            AISkillDriver skillDriver = droneMasterRed.AddComponent <AISkillDriver>();

            skillDriver.customName      = "Attack";
            skillDriver.skillSlot       = SkillSlot.Primary;
            skillDriver.moveTargetType  = TargetType.CurrentLeader;
            skillDriver.movementType    = MovementType.ChaseMoveTarget;
            skillDriver.aimType         = AimType.AtCurrentEnemy;
            skillDriver.buttonPressType = ButtonPressType.Hold;
            skillDriver                 = droneMasterRed.AddComponent <AISkillDriver>();
            skillDriver.customName      = "LeashToLeader";
            skillDriver.moveTargetType  = TargetType.CurrentLeader;
            skillDriver.movementType    = MovementType.ChaseMoveTarget;
            skillDriver.aimType         = AimType.AtCurrentEnemy;
            skillDriver.buttonPressType = ButtonPressType.Hold;
            skillDriver.resetCurrentEnemyOnNextDriverSelection = true;
            skillDriver.minDistance     = 20f;
            skillDriver                 = droneMasterRed.AddComponent <AISkillDriver>();
            skillDriver.customName      = "Standby";
            skillDriver.maxDistance     = 20f;
            skillDriver.moveTargetType  = TargetType.CurrentLeader;
            skillDriver.movementType    = MovementType.StrafeMovetarget;
            skillDriver.aimType         = AimType.AtCurrentEnemy;
            skillDriver.buttonPressType = ButtonPressType.Hold;
            skillDriver                 = droneMasterRed.AddComponent <AISkillDriver>();
            skillDriver.customName      = "RoamAttack";
            skillDriver.skillSlot       = SkillSlot.Primary;
            skillDriver.moveTargetType  = TargetType.CurrentEnemy;
            skillDriver.movementType    = MovementType.ChaseMoveTarget;
            skillDriver.aimType         = AimType.AtCurrentEnemy;
            skillDriver.buttonPressType = ButtonPressType.Hold;
            skillDriver                 = droneMasterRed.AddComponent <AISkillDriver>();
            skillDriver.customName      = "RoamMove";
            skillDriver.moveTargetType  = TargetType.CurrentEnemy;
            skillDriver.movementType    = MovementType.ChaseMoveTarget;
            skillDriver.aimType         = AimType.AtCurrentEnemy;
            skillDriver.buttonPressType = ButtonPressType.Hold;
            skillDriver.resetCurrentEnemyOnNextDriverSelection = true;
            droneMasterGreen.DeepCopyComponentsFrom <AISkillDriver>(droneMasterRed);
        }
Exemplo n.º 7
0
        private static void RebuildSkillDrivers()
        {
            BaseHelpers.DestroySkillDrivers(megaMushrumMaster);

            AISkillDriver SporeGrenade = megaMushrumMaster.AddComponent <AISkillDriver>();
            AISkillDriver SuicideBomb  = megaMushrumMaster.AddComponent <AISkillDriver>();
            AISkillDriver Harvest      = megaMushrumMaster.AddComponent <AISkillDriver>();
            AISkillDriver Flee         = megaMushrumMaster.AddComponent <AISkillDriver>();
            AISkillDriver Path         = megaMushrumMaster.AddComponent <AISkillDriver>();
            AISkillDriver StrafePath   = megaMushrumMaster.AddComponent <AISkillDriver>();

            SporeGrenade.customName                        = "Spore Grenade";
            SporeGrenade.skillSlot                         = SkillSlot.Primary;
            SporeGrenade.requireSkillReady                 = true;
            SporeGrenade.requireEquipmentReady             = false;
            SporeGrenade.moveTargetType                    = TargetType.CurrentEnemy;
            SporeGrenade.minUserHealthFraction             = 0.5f;
            SporeGrenade.maxUserHealthFraction             = float.PositiveInfinity;
            SporeGrenade.minTargetHealthFraction           = float.NegativeInfinity;
            SporeGrenade.maxTargetHealthFraction           = float.PositiveInfinity;
            SporeGrenade.minDistance                       = 0;
            SporeGrenade.maxDistance                       = 60;
            SporeGrenade.selectionRequiresTargetLoS        = false;
            SporeGrenade.activationRequiresTargetLoS       = true;
            SporeGrenade.activationRequiresAimConfirmation = true;
            SporeGrenade.movementType                      = MovementType.StrafeMovetarget;
            SporeGrenade.moveInputScale                    = 1;
            SporeGrenade.aimType                   = AimType.AtMoveTarget;
            SporeGrenade.ignoreNodeGraph           = false;
            SporeGrenade.driverUpdateTimerOverride = -1;
            SporeGrenade.resetCurrentEnemyOnNextDriverSelection = false;
            SporeGrenade.noRepeat            = false;
            SporeGrenade.shouldSprint        = false;
            SporeGrenade.shouldFireEquipment = false;
            SporeGrenade.shouldTapButton     = false;

            SuicideBomb.customName = "Suicide Bomb";
            SuicideBomb.skillSlot  = SkillSlot.Secondary;
            //SpiritPull.requiredSkill =
            SuicideBomb.requireSkillReady                 = true;
            SuicideBomb.requireEquipmentReady             = false;
            SuicideBomb.moveTargetType                    = TargetType.CurrentEnemy;
            SuicideBomb.minUserHealthFraction             = float.NegativeInfinity;
            SuicideBomb.maxUserHealthFraction             = float.PositiveInfinity;
            SuicideBomb.minTargetHealthFraction           = float.NegativeInfinity;
            SuicideBomb.maxTargetHealthFraction           = float.PositiveInfinity;
            SuicideBomb.minDistance                       = 0;
            SuicideBomb.maxDistance                       = 10;
            SuicideBomb.selectionRequiresTargetLoS        = false;
            SuicideBomb.activationRequiresTargetLoS       = false;
            SuicideBomb.activationRequiresAimConfirmation = false;
            SuicideBomb.movementType                      = MovementType.ChaseMoveTarget;
            SuicideBomb.moveInputScale                    = 1;
            SuicideBomb.aimType                   = AimType.AtMoveTarget;
            SuicideBomb.ignoreNodeGraph           = true;
            SuicideBomb.driverUpdateTimerOverride = -1;
            SuicideBomb.resetCurrentEnemyOnNextDriverSelection = false;
            SuicideBomb.noRepeat            = false;
            SuicideBomb.shouldSprint        = false;
            SuicideBomb.shouldFireEquipment = false;
            SuicideBomb.shouldTapButton     = false;

            Harvest.customName = "Harvest";
            Harvest.skillSlot  = SkillSlot.Utility;
            //Offspring.requiredSkill =
            Harvest.requireSkillReady                 = true;
            Harvest.requireEquipmentReady             = false;
            Harvest.moveTargetType                    = TargetType.CurrentEnemy;
            Harvest.minUserHealthFraction             = float.NegativeInfinity;
            Harvest.maxUserHealthFraction             = 0.5f;
            Harvest.minTargetHealthFraction           = float.NegativeInfinity;
            Harvest.maxTargetHealthFraction           = float.PositiveInfinity;
            Harvest.minDistance                       = 0;
            Harvest.maxDistance                       = float.PositiveInfinity;
            Harvest.selectionRequiresTargetLoS        = false;
            Harvest.activationRequiresTargetLoS       = false;
            Harvest.activationRequiresAimConfirmation = false;
            Harvest.movementType                      = MovementType.Stop;
            Harvest.moveInputScale                    = 1;
            Harvest.aimType                   = AimType.None;
            Harvest.ignoreNodeGraph           = false;
            Harvest.driverUpdateTimerOverride = 4;
            Harvest.resetCurrentEnemyOnNextDriverSelection = false;
            Harvest.noRepeat            = false;
            Harvest.shouldSprint        = false;
            Harvest.shouldFireEquipment = false;
            Harvest.shouldTapButton     = false;

            Flee.customName = "Flee";
            Flee.skillSlot  = SkillSlot.None;
            //Flee.requiredSkill =
            Flee.requireSkillReady                 = false;
            Flee.requireEquipmentReady             = false;
            Flee.moveTargetType                    = TargetType.CurrentEnemy;
            Flee.minUserHealthFraction             = float.NegativeInfinity;
            Flee.maxUserHealthFraction             = 0.5f;
            Flee.minTargetHealthFraction           = float.NegativeInfinity;
            Flee.maxTargetHealthFraction           = float.PositiveInfinity;
            Flee.minDistance                       = 0;
            Flee.maxDistance                       = 60;
            Flee.selectionRequiresTargetLoS        = false;
            Flee.activationRequiresTargetLoS       = false;
            Flee.activationRequiresAimConfirmation = false;
            Flee.movementType                      = MovementType.FleeMoveTarget;
            Flee.moveInputScale                    = 1;
            Flee.aimType                   = AimType.AtMoveTarget;
            Flee.ignoreNodeGraph           = false;
            Flee.driverUpdateTimerOverride = 3;
            Flee.resetCurrentEnemyOnNextDriverSelection = false;
            Flee.noRepeat            = false;
            Flee.shouldSprint        = true;
            Flee.shouldFireEquipment = false;
            Flee.shouldTapButton     = false;

            Path.customName = "Path";
            Path.skillSlot  = SkillSlot.None;
            //Path.requiredSkill =
            Path.requireSkillReady                 = false;
            Path.requireEquipmentReady             = false;
            Path.moveTargetType                    = TargetType.CurrentEnemy;
            Path.minUserHealthFraction             = float.NegativeInfinity;
            Path.maxUserHealthFraction             = float.PositiveInfinity;
            Path.minTargetHealthFraction           = float.NegativeInfinity;
            Path.maxTargetHealthFraction           = float.PositiveInfinity;
            Path.minDistance                       = 0;
            Path.maxDistance                       = float.PositiveInfinity;
            Path.selectionRequiresTargetLoS        = false;
            Path.activationRequiresTargetLoS       = false;
            Path.activationRequiresAimConfirmation = false;
            Path.movementType                      = MovementType.ChaseMoveTarget;
            Path.moveInputScale                    = 1;
            Path.aimType                   = AimType.AtMoveTarget;
            Path.ignoreNodeGraph           = true;
            Path.driverUpdateTimerOverride = -1;
            Path.resetCurrentEnemyOnNextDriverSelection = false;
            Path.noRepeat            = false;
            Path.shouldSprint        = false;
            Path.shouldFireEquipment = false;
            Path.shouldTapButton     = false;

            StrafePath.customName = "Strafe Path";
            StrafePath.skillSlot  = SkillSlot.None;
            //Path.requiredSkill =
            StrafePath.requireSkillReady                 = false;
            StrafePath.requireEquipmentReady             = false;
            StrafePath.moveTargetType                    = TargetType.CurrentEnemy;
            StrafePath.minUserHealthFraction             = float.NegativeInfinity;
            StrafePath.maxUserHealthFraction             = float.PositiveInfinity;
            StrafePath.minTargetHealthFraction           = float.NegativeInfinity;
            StrafePath.maxTargetHealthFraction           = float.PositiveInfinity;
            StrafePath.minDistance                       = 0;
            StrafePath.maxDistance                       = 30;
            StrafePath.selectionRequiresTargetLoS        = false;
            StrafePath.activationRequiresTargetLoS       = false;
            StrafePath.activationRequiresAimConfirmation = false;
            StrafePath.movementType                      = MovementType.StrafeMovetarget;
            StrafePath.moveInputScale                    = 1;
            StrafePath.aimType                   = AimType.AtMoveTarget;
            StrafePath.ignoreNodeGraph           = false;
            StrafePath.driverUpdateTimerOverride = -1;
            StrafePath.resetCurrentEnemyOnNextDriverSelection = false;
            StrafePath.noRepeat            = false;
            StrafePath.shouldSprint        = false;
            StrafePath.shouldFireEquipment = false;
            StrafePath.shouldTapButton     = false;
        }
Exemplo n.º 8
0
        public override void InjectSkills(GameObject gameObject, BaseAI ai)
        {
            // Edit
            ai.minDistanceFromEnemy = 0;

            AISkillDriver skill3 = gameObject.AddComponent <AISkillDriver>() as AISkillDriver;

            skill3.customName        = "Utility";
            skill3.skillSlot         = RoR2.SkillSlot.Utility;
            skill3.requireSkillReady = true;
            skill3.moveTargetType    = AISkillDriver.TargetType.CurrentEnemy;
            skill3.minDistance       = 0;
            skill3.maxDistance       = 40;
            //skill3.maxUserHealthFraction = .25f;
            skill3.selectionRequiresTargetLoS        = true;
            skill3.activationRequiresTargetLoS       = true;
            skill3.activationRequiresAimConfirmation = false;
            skill3.movementType    = AISkillDriver.MovementType.ChaseMoveTarget;
            skill3.aimType         = AISkillDriver.AimType.AtMoveTarget;
            skill3.ignoreNodeGraph = false;
            skill3.resetCurrentEnemyOnNextDriverSelection = false;
            skill3.noRepeat     = false;
            skill3.shouldSprint = true;

            AISkillDriver skill4 = gameObject.AddComponent <AISkillDriver>() as AISkillDriver;

            skill4.customName                        = "Special";
            skill4.skillSlot                         = RoR2.SkillSlot.Special;
            skill4.requireSkillReady                 = true;
            skill4.moveTargetType                    = AISkillDriver.TargetType.CurrentEnemy;
            skill4.minDistance                       = 0;
            skill4.maxDistance                       = 60;
            skill4.selectionRequiresTargetLoS        = true;
            skill4.activationRequiresTargetLoS       = false;
            skill4.activationRequiresAimConfirmation = false;
            skill4.movementType                      = AISkillDriver.MovementType.StrafeMovetarget;
            skill4.aimType         = AISkillDriver.AimType.AtMoveTarget;
            skill4.ignoreNodeGraph = false;
            skill4.resetCurrentEnemyOnNextDriverSelection = false;
            skill4.noRepeat     = false;
            skill4.shouldSprint = true;

            AISkillDriver skill2 = gameObject.AddComponent <AISkillDriver>() as AISkillDriver;

            skill2.customName                        = "Secondary";
            skill2.skillSlot                         = RoR2.SkillSlot.Secondary;
            skill2.requireSkillReady                 = true;
            skill2.moveTargetType                    = AISkillDriver.TargetType.CurrentEnemy;
            skill2.minDistance                       = 15;
            skill2.maxDistance                       = 80;
            skill2.selectionRequiresTargetLoS        = true;
            skill2.activationRequiresTargetLoS       = true;
            skill2.activationRequiresAimConfirmation = true;
            skill2.movementType                      = AISkillDriver.MovementType.ChaseMoveTarget;
            skill2.aimType         = AISkillDriver.AimType.AtMoveTarget;
            skill2.ignoreNodeGraph = false;
            skill2.resetCurrentEnemyOnNextDriverSelection = false;
            skill2.noRepeat     = false;
            skill2.shouldSprint = true;

            AISkillDriver skill5 = gameObject.AddComponent <AISkillDriver>() as AISkillDriver;

            skill5.customName                        = "ChaseTarget";
            skill5.skillSlot                         = RoR2.SkillSlot.None;
            skill5.requireSkillReady                 = false;
            skill5.moveTargetType                    = AISkillDriver.TargetType.CurrentEnemy;
            skill5.minDistance                       = 10;
            skill5.maxDistance                       = 60;
            skill5.selectionRequiresTargetLoS        = true;
            skill5.activationRequiresTargetLoS       = true;
            skill5.activationRequiresAimConfirmation = false;
            skill5.movementType                      = AISkillDriver.MovementType.ChaseMoveTarget;
            skill5.aimType         = AISkillDriver.AimType.AtMoveTarget;
            skill5.ignoreNodeGraph = false;
            skill5.resetCurrentEnemyOnNextDriverSelection = false;
            skill5.noRepeat     = false;
            skill5.shouldSprint = true;

            // Skills
            AISkillDriver skill1 = gameObject.AddComponent <AISkillDriver>() as AISkillDriver;

            skill1.customName                        = "Primary";
            skill1.skillSlot                         = RoR2.SkillSlot.Primary;
            skill1.requireSkillReady                 = true;
            skill1.moveTargetType                    = AISkillDriver.TargetType.CurrentEnemy;
            skill1.minDistance                       = 0;
            skill1.maxDistance                       = 10;
            skill1.selectionRequiresTargetLoS        = true;
            skill1.activationRequiresTargetLoS       = true;
            skill1.activationRequiresAimConfirmation = false;
            skill1.movementType                      = AISkillDriver.MovementType.ChaseMoveTarget;
            skill1.aimType         = AISkillDriver.AimType.AtMoveTarget;
            skill1.ignoreNodeGraph = true;
            skill1.resetCurrentEnemyOnNextDriverSelection = false;
            skill1.noRepeat     = false;
            skill1.shouldSprint = true;

            // Add default skills
            AddDefaultSkills(gameObject, ai);
        }
Exemplo n.º 9
0
        private static void RebuildSkillDrivers()
        {
            BaseHelpers.DestroySkillDrivers(grandParentMaster);

            AISkillDriver GroundSwipe = grandParentMaster.AddComponent <AISkillDriver>();
            AISkillDriver SpiritPull  = grandParentMaster.AddComponent <AISkillDriver>();
            AISkillDriver Offspring   = grandParentMaster.AddComponent <AISkillDriver>();
            AISkillDriver PortalJump  = grandParentMaster.AddComponent <AISkillDriver>();
            AISkillDriver Path        = grandParentMaster.AddComponent <AISkillDriver>();

            GroundSwipe.customName = "Ground Swipe";
            GroundSwipe.skillSlot  = SkillSlot.Primary;
            //GroundSwipe.requiredSkill =
            GroundSwipe.requireSkillReady                 = true;
            GroundSwipe.requireEquipmentReady             = false;
            GroundSwipe.moveTargetType                    = TargetType.CurrentEnemy;
            GroundSwipe.minUserHealthFraction             = float.NegativeInfinity;
            GroundSwipe.maxUserHealthFraction             = float.PositiveInfinity;
            GroundSwipe.minTargetHealthFraction           = float.NegativeInfinity;
            GroundSwipe.maxTargetHealthFraction           = float.PositiveInfinity;
            GroundSwipe.minDistance                       = 0;
            GroundSwipe.maxDistance                       = 15;
            GroundSwipe.selectionRequiresTargetLoS        = false;
            GroundSwipe.activationRequiresTargetLoS       = true;
            GroundSwipe.activationRequiresAimConfirmation = true;
            GroundSwipe.movementType                      = MovementType.ChaseMoveTarget;
            GroundSwipe.moveInputScale                    = 1;
            GroundSwipe.aimType                   = AimType.AtMoveTarget;
            GroundSwipe.ignoreNodeGraph           = true;
            GroundSwipe.driverUpdateTimerOverride = -1;
            GroundSwipe.resetCurrentEnemyOnNextDriverSelection = false;
            GroundSwipe.noRepeat            = false;
            GroundSwipe.shouldSprint        = false;
            GroundSwipe.shouldFireEquipment = false;
            GroundSwipe.shouldTapButton     = false;


            SpiritPull.customName = "Spirit Pull";
            SpiritPull.skillSlot  = SkillSlot.Secondary;
            //SpiritPull.requiredSkill =
            SpiritPull.requireSkillReady                 = true;
            SpiritPull.requireEquipmentReady             = false;
            SpiritPull.moveTargetType                    = TargetType.CurrentEnemy;
            SpiritPull.minUserHealthFraction             = float.NegativeInfinity;
            SpiritPull.maxUserHealthFraction             = float.PositiveInfinity;
            SpiritPull.minTargetHealthFraction           = float.NegativeInfinity;
            SpiritPull.maxTargetHealthFraction           = float.PositiveInfinity;
            SpiritPull.minDistance                       = 15;
            SpiritPull.maxDistance                       = 200;
            SpiritPull.selectionRequiresTargetLoS        = false;
            SpiritPull.activationRequiresTargetLoS       = false;
            SpiritPull.activationRequiresAimConfirmation = false;
            SpiritPull.movementType                      = MovementType.ChaseMoveTarget;
            SpiritPull.moveInputScale                    = 1;
            SpiritPull.aimType                   = AimType.AtMoveTarget;
            SpiritPull.ignoreNodeGraph           = true;
            SpiritPull.driverUpdateTimerOverride = -1;
            SpiritPull.resetCurrentEnemyOnNextDriverSelection = false;
            SpiritPull.noRepeat            = false;
            SpiritPull.shouldSprint        = false;
            SpiritPull.shouldFireEquipment = false;
            SpiritPull.shouldTapButton     = false;

            Offspring.customName = "Off Spring";
            Offspring.skillSlot  = SkillSlot.Utility;
            //Offspring.requiredSkill =
            Offspring.requireSkillReady                 = true;
            Offspring.requireEquipmentReady             = false;
            Offspring.moveTargetType                    = TargetType.CurrentEnemy;
            Offspring.minUserHealthFraction             = float.NegativeInfinity;
            Offspring.maxUserHealthFraction             = float.PositiveInfinity;
            Offspring.minTargetHealthFraction           = float.NegativeInfinity;
            Offspring.maxTargetHealthFraction           = float.PositiveInfinity;
            Offspring.minDistance                       = 15;
            Offspring.maxDistance                       = float.PositiveInfinity;
            Offspring.selectionRequiresTargetLoS        = false;
            Offspring.activationRequiresTargetLoS       = false;
            Offspring.activationRequiresAimConfirmation = false;
            Offspring.movementType                      = MovementType.ChaseMoveTarget;
            Offspring.moveInputScale                    = 1;
            Offspring.aimType                   = AimType.AtMoveTarget;
            Offspring.ignoreNodeGraph           = true;
            Offspring.driverUpdateTimerOverride = -1;
            Offspring.resetCurrentEnemyOnNextDriverSelection = false;
            Offspring.noRepeat            = false;
            Offspring.shouldSprint        = false;
            Offspring.shouldFireEquipment = false;
            Offspring.shouldTapButton     = false;


            PortalJump.customName = "Portal Jump";
            PortalJump.skillSlot  = SkillSlot.Special;
            //PortalJump. requiredSkill =
            PortalJump.requireSkillReady                 = true;
            PortalJump.requireEquipmentReady             = false;
            PortalJump.moveTargetType                    = TargetType.CurrentEnemy;
            PortalJump.minUserHealthFraction             = float.NegativeInfinity;
            PortalJump.maxUserHealthFraction             = float.PositiveInfinity;
            PortalJump.minTargetHealthFraction           = float.NegativeInfinity;
            PortalJump.maxTargetHealthFraction           = float.PositiveInfinity;
            PortalJump.minDistance                       = 50;
            PortalJump.maxDistance                       = float.PositiveInfinity;
            PortalJump.selectionRequiresTargetLoS        = false;
            PortalJump.activationRequiresTargetLoS       = false;
            PortalJump.activationRequiresAimConfirmation = false;
            PortalJump.movementType                      = MovementType.ChaseMoveTarget;
            PortalJump.moveInputScale                    = 1;
            PortalJump.aimType                   = AimType.AtMoveTarget;
            PortalJump.ignoreNodeGraph           = true;
            PortalJump.driverUpdateTimerOverride = -1;
            PortalJump.resetCurrentEnemyOnNextDriverSelection = false;
            PortalJump.noRepeat            = false;
            PortalJump.shouldSprint        = false;
            PortalJump.shouldFireEquipment = false;
            PortalJump.shouldTapButton     = false;


            Path.customName = "Path";
            Path.skillSlot  = SkillSlot.None;
            //Path.requiredSkill =
            Path.requireSkillReady                 = false;
            Path.requireEquipmentReady             = false;
            Path.moveTargetType                    = TargetType.CurrentEnemy;
            Path.minUserHealthFraction             = float.NegativeInfinity;
            Path.maxUserHealthFraction             = float.PositiveInfinity;
            Path.minTargetHealthFraction           = float.NegativeInfinity;
            Path.maxTargetHealthFraction           = float.PositiveInfinity;
            Path.minDistance                       = 0;
            Path.maxDistance                       = float.PositiveInfinity;
            Path.selectionRequiresTargetLoS        = false;
            Path.activationRequiresTargetLoS       = false;
            Path.activationRequiresAimConfirmation = false;
            Path.movementType                      = MovementType.ChaseMoveTarget;
            Path.moveInputScale                    = 1;
            Path.aimType                   = AimType.AtMoveTarget;
            Path.ignoreNodeGraph           = true;
            Path.driverUpdateTimerOverride = -1;
            Path.resetCurrentEnemyOnNextDriverSelection = false;
            Path.noRepeat            = false;
            Path.shouldSprint        = false;
            Path.shouldFireEquipment = false;
            Path.shouldTapButton     = false;
        }
Exemplo n.º 10
0
        public override void InjectSkills(GameObject gameObject, BaseAI ai)
        {
            AISkillDriver skill3 = gameObject.AddComponent <AISkillDriver>() as AISkillDriver;

            skill3.customName                        = "Utility";
            skill3.skillSlot                         = RoR2.SkillSlot.Utility;
            skill3.requireSkillReady                 = true;
            skill3.moveTargetType                    = AISkillDriver.TargetType.CurrentEnemy;
            skill3.minDistance                       = 0;
            skill3.maxDistance                       = 80;
            skill3.selectionRequiresTargetLoS        = true;
            skill3.activationRequiresTargetLoS       = true;
            skill3.activationRequiresAimConfirmation = true;
            skill3.movementType                      = AISkillDriver.MovementType.Stop;
            skill3.aimType         = AISkillDriver.AimType.AtCurrentEnemy;
            skill3.ignoreNodeGraph = false;
            skill3.resetCurrentEnemyOnNextDriverSelection = false;
            skill3.noRepeat        = true;
            skill3.shouldSprint    = false;
            skill3.buttonPressType = AISkillDriver.ButtonPressType.TapContinuous;

            AISkillDriver chaseSkill = gameObject.AddComponent <AISkillDriver>() as AISkillDriver;

            chaseSkill.customName                        = "ChaseTarget";
            chaseSkill.skillSlot                         = RoR2.SkillSlot.None;
            chaseSkill.requireSkillReady                 = false;
            chaseSkill.moveTargetType                    = AISkillDriver.TargetType.CurrentEnemy;
            chaseSkill.minDistance                       = 10;
            chaseSkill.maxDistance                       = 60;
            chaseSkill.selectionRequiresTargetLoS        = true;
            chaseSkill.activationRequiresTargetLoS       = true;
            chaseSkill.activationRequiresAimConfirmation = false;
            chaseSkill.movementType                      = AISkillDriver.MovementType.ChaseMoveTarget;
            chaseSkill.aimType         = AISkillDriver.AimType.AtCurrentEnemy;
            chaseSkill.ignoreNodeGraph = false;
            chaseSkill.resetCurrentEnemyOnNextDriverSelection = false;
            chaseSkill.noRepeat     = false;
            chaseSkill.shouldSprint = true;

            AISkillDriver skill2 = gameObject.AddComponent <AISkillDriver>() as AISkillDriver;

            skill2.customName                        = "Secondary";
            skill2.skillSlot                         = RoR2.SkillSlot.Secondary;
            skill2.requireSkillReady                 = true;
            skill2.moveTargetType                    = AISkillDriver.TargetType.CurrentEnemy;
            skill2.minDistance                       = 0;
            skill2.maxDistance                       = 10;
            skill2.minUserHealthFraction             = .75f;
            skill2.selectionRequiresTargetLoS        = true;
            skill2.activationRequiresTargetLoS       = true;
            skill2.activationRequiresAimConfirmation = true;
            skill2.movementType                      = AISkillDriver.MovementType.ChaseMoveTarget;
            skill2.aimType         = AISkillDriver.AimType.AtCurrentEnemy;
            skill2.ignoreNodeGraph = true;
            skill2.resetCurrentEnemyOnNextDriverSelection = false;
            skill2.noRepeat     = true;
            skill2.shouldSprint = true;

            // Skills
            AISkillDriver skill1 = gameObject.AddComponent <AISkillDriver>() as AISkillDriver;

            skill1.customName                        = "Primary";
            skill1.skillSlot                         = RoR2.SkillSlot.Primary;
            skill1.requireSkillReady                 = true;
            skill1.moveTargetType                    = AISkillDriver.TargetType.CurrentEnemy;
            skill1.minDistance                       = 0;
            skill1.maxDistance                       = 10;
            skill1.selectionRequiresTargetLoS        = true;
            skill1.activationRequiresTargetLoS       = true;
            skill1.activationRequiresAimConfirmation = false;
            skill1.movementType                      = AISkillDriver.MovementType.ChaseMoveTarget;
            skill1.aimType         = AISkillDriver.AimType.AtCurrentEnemy;
            skill1.ignoreNodeGraph = true;
            skill1.resetCurrentEnemyOnNextDriverSelection = false;
            skill1.noRepeat     = false;
            skill1.shouldSprint = true;

            // Add default skills
            AddDefaultSkills(gameObject, ai, 0);
        }
Exemplo n.º 11
0
        private static GameObject CreateDecoyMaster()
        {
            GameObject master = PrefabsCore.CreatePrefab("SniperDecoyMaster", true);

            NetworkIdentity netId = master.AddOrGetComponent <NetworkIdentity>();

            CharacterMaster charMaster = master.AddOrGetComponent <CharacterMaster>();

            charMaster.masterIndex        = new MasterCatalog.MasterIndex(-1);
            charMaster.bodyPrefab         = GetDecoyPrefab();
            charMaster.spawnOnStart       = false;
            charMaster.teamIndex          = TeamIndex.Player;
            charMaster.destroyOnBodyDeath = true;
            charMaster.isBoss             = false;
            charMaster.preventGameOver    = true;


            _ = master.AddOrGetComponent <Inventory>();


            BaseAI ai = master.AddOrGetComponent <BaseAI>();

            ai.fullVision = true;
            ai.neverRetaliateFriendlies = true;
            //ai.minDistanceFromEnemy = 0;
            ai.enemyAttentionDuration = 0;
            //ai.navigationType = BaseAI.NavigationType.Nodegraph;
            ai.desiredSpawnNodeGraphType = RoR2.Navigation.MapNodeGroup.GraphType.Ground;
            EntityStateMachine esm = ai.stateMachine = master.AddOrGetComponent <EntityStateMachine>();

            ai.isHealer          = false;
            ai.enemyAttention    = 0f;
            ai.aimVectorDampTime = 0f;
            ai.aimVectorMaxSpeed = 0f;
            //ai.desiredAimDirection = Vector3.up;
            //ai.drawAIPath = false;
            ai.selectedSkilldriverName = null;
            ai.debugEnemyHurtBox       = null;
            ai.currentEnemy            = null;
            ai.leader       = null;
            ai.customTarget = null;

            esm.customName       = "AI";
            esm.initialStateType = SkillsCore.StateType <BlankAI>();
            esm.mainStateType    = SkillsCore.StateType <BlankAI>();

            AISkillDriver driver = master.AddOrGetComponent <AISkillDriver>();

            driver.customName                        = "Sit there and look pretty";
            driver.skillSlot                         = SkillSlot.None;
            driver.requiredSkill                     = null;
            driver.requireSkillReady                 = false;
            driver.requireEquipmentReady             = false;
            driver.moveTargetType                    = AISkillDriver.TargetType.CurrentEnemy;
            driver.minUserHealthFraction             = Single.NegativeInfinity;
            driver.maxUserHealthFraction             = Single.PositiveInfinity;
            driver.minTargetHealthFraction           = Single.NegativeInfinity;
            driver.maxTargetHealthFraction           = Single.PositiveInfinity;
            driver.minDistance                       = Single.NegativeInfinity;
            driver.maxDistance                       = Single.PositiveInfinity;
            driver.selectionRequiresTargetLoS        = false;
            driver.activationRequiresTargetLoS       = false;
            driver.activationRequiresAimConfirmation = false;
            driver.movementType                      = AISkillDriver.MovementType.Stop;
            driver.moveInputScale                    = 0f;
            driver.aimType                   = AISkillDriver.AimType.None;
            driver.ignoreNodeGraph           = true;
            driver.driverUpdateTimerOverride = 1f;
            driver.resetCurrentEnemyOnNextDriverSelection = false;
            driver.noRepeat            = false;
            driver.shouldSprint        = true;
            driver.shouldFireEquipment = false;
            driver.shouldTapButton     = false;


            _ = master.AddOrGetComponent <MinionOwnership>();


            AIOwnership aiOwnership = master.AddOrGetComponent <AIOwnership>();

            aiOwnership.ownerMaster = null;


            foreach (IRuntimePrefabComponent comp in master.GetComponents <IRuntimePrefabComponent>())
            {
                comp.InitializePrefab();
            }


            MastersCore.Add(master);

            return(master);
        }
Exemplo n.º 12
0
        private void ModifyClayMan()
        {
            AISkillDriver clayPrimary = clayMaster.GetComponent <AISkillDriver>();

            clayPrimary.maxDistance = 16f;
            clayMaster.GetComponent <CharacterMaster>().bodyPrefab = clayObject;

            LanguageAPI.Add("CLAY_BODY_NAME", "Clay Man");

            LanguageAPI.Add("CLAY_BODY_LORE", "Quick with his sword and quicker with his feet; the agility of these clay 'people' is unexpected with a form so roughly shaped.\n\nWhen faced with one of the few creatures here which I feel some humanity in, my aloneness closes in. Why do they have clay pots on their heads? Could it be protection from this cruel reality, or maybe just to hide the scars from this brutal planet.");
            clayObject.AddComponent <Interactor>().maxInteractionDistance = 3f;
            clayObject.AddComponent <InteractionDriver>();

            ModelLocator clayModelLocator = clayObject.GetComponent <ModelLocator>();

            clayModelLocator.modelTransform.gameObject.layer = LayerIndex.entityPrecise.intVal;
            clayModelLocator.modelTransform.localScale      *= 1.2f;
            clayModelLocator.noCorpse = true;

            CharacterDeathBehavior clayCDB = clayObject.GetComponent <CharacterDeathBehavior>();

            clayCDB.deathState = Resources.Load <GameObject>("prefabs/characterbodies/WispBody").GetComponent <CharacterDeathBehavior>().deathState;

            CharacterBody clayCB = clayObject.GetComponent <CharacterBody>();

            clayCB.baseNameToken  = "CLAY_BODY_NAME";
            clayCB.baseJumpPower  = 22f;
            clayCB.baseMaxHealth  = 140f;
            clayCB.levelMaxHealth = clayCB.baseMaxHealth * 0.3f;
            clayCB.baseArmor      = 0f;
            clayCB.baseDamage     = 11f;
            clayCB.levelDamage    = clayCB.baseDamage * 0.2f;
            clayCB.baseMoveSpeed  = 9f;
            clayCB.baseRegen      = 0f;
            clayCB.levelRegen     = 0f;
            clayCB.bodyFlags      = CharacterBody.BodyFlags.ImmuneToGoo;

            //Debug.Log(clayCB.GetComponent<DeathRewards>().logUnlockableName);

            /*UnlockableDef clayLog = ScriptableObject.CreateInstance<UnlockableDef>();
             * clayCB.GetComponent<DeathRewards>().logUnlockableDef = clayLog;*/

            SetStateOnHurt claySSoH = clayObject.AddComponent <SetStateOnHurt>();

            claySSoH.canBeFrozen     = true;
            claySSoH.canBeStunned    = true;
            claySSoH.canBeHitStunned = false;
            claySSoH.hitThreshold    = 0.15f;

            SfxLocator claySFX = clayObject.GetComponent <SfxLocator>();

            claySFX.deathSound = "Play_clayboss_M1_explo";
            claySFX.barkSound  = "";

            //Ice Fix Credits: SushiDev
            int i = 0;

            EntityStateMachine[] esmr = new EntityStateMachine[2];
            foreach (EntityStateMachine esm in clayObject.GetComponentsInChildren <EntityStateMachine>())
            {
                switch (esm.customName)
                {
                case "Body":
                    claySSoH.targetStateMachine = esm;
                    break;

                default:
                    if (i < 2)
                    {
                        esmr[i] = esm;
                    }
                    i++;
                    break;
                }
            }

            #region hitbox
            Component[] clayComponents           = clayObject.GetComponentsInChildren <Transform>();
            Transform   clayTransform            = null;
            Transform   clayHeadTransform        = null;
            Transform   claySwordHitboxTransform = null;
            foreach (Transform t in clayComponents)
            {
                if (t.name == "chest")
                {
                    clayTransform = t;
                }
                else if (t.name == "head")
                {
                    clayHeadTransform = t;
                }
                else if (t.name == "Hitbox")
                {
                    claySwordHitboxTransform = t;
                }
                if (clayTransform != null && clayHeadTransform != null && claySwordHitboxTransform != null)
                {
                    break;
                }
            }

            ItemDisplays.headTransform = clayHeadTransform;

            HurtBoxGroup clayHurtBoxGroup = clayModelLocator.modelTransform.gameObject.AddComponent <HurtBoxGroup>();
            claySwordHitboxTransform.localScale *= 2.4f; //2.8 -> 2.4

            #region chest
            clayTransform.gameObject.layer = LayerIndex.entityPrecise.intVal;
            CapsuleCollider clayCollider = clayTransform.gameObject.AddComponent <CapsuleCollider>();
            clayCollider.center -= new Vector3(0, 0.6f, 0);
            clayCollider.height *= 0.25f;
            clayCollider.radius *= 1.16f;
            HurtBox clayHurtBox = clayTransform.gameObject.AddComponent <HurtBox>();
            clayHurtBox.isBullseye      = true;
            clayHurtBox.healthComponent = clayObject.GetComponent <HealthComponent>();
            clayHurtBox.damageModifier  = HurtBox.DamageModifier.Normal;
            clayHurtBox.hurtBoxGroup    = clayHurtBoxGroup;
            clayHurtBox.indexInGroup    = 0;
            //clayHurtBox.name = "ChestHurtbox";
            #endregion

            #region head


            clayHeadTransform.gameObject.layer = LayerIndex.entityPrecise.intVal;
            CapsuleCollider clayHeadCollider = clayHeadTransform.gameObject.AddComponent <CapsuleCollider>();
            clayHeadCollider.height *= 0.4f;
            clayHeadCollider.radius *= 0.3f;
            clayHeadCollider.center += new Vector3(0, 0.2f, 0);
            HurtBox clayHeadHurtBox = clayHeadTransform.gameObject.AddComponent <HurtBox>();
            clayHeadHurtBox.isBullseye      = false;
            clayHeadHurtBox.healthComponent = clayObject.GetComponent <HealthComponent>();
            clayHeadHurtBox.damageModifier  = HurtBox.DamageModifier.SniperTarget;
            clayHeadHurtBox.hurtBoxGroup    = clayHurtBoxGroup;
            clayHeadHurtBox.indexInGroup    = 1;
            //clayHeadHurtBox.name = "HeadHurtbox";

            #endregion

            HurtBox[] clayHurtBoxArray = new HurtBox[]
            {
                clayHurtBox, clayHeadHurtBox
            };

            clayHurtBoxGroup.bullseyeCount = 1;
            clayHurtBoxGroup.hurtBoxes     = clayHurtBoxArray;
            clayHurtBoxGroup.mainHurtBox   = clayHurtBox;

            #endregion

            EntityLocator clayLocator = clayObject.AddComponent <EntityLocator>();
            clayLocator.entity = clayObject;
        }
Exemplo n.º 13
0
        private static void RebuildSkillDrivers()
        {
            BaseHelpers.DestroySkillDrivers(clayManMaster);

            AISkillDriver Swing = clayManMaster.AddComponent <AISkillDriver>();
            AISkillDriver Chase = clayManMaster.AddComponent <AISkillDriver>();
            AISkillDriver Leap  = clayManMaster.AddComponent <AISkillDriver>();
            AISkillDriver anotherSkillDriver    = clayManMaster.AddComponent <AISkillDriver>();
            AISkillDriver andAnotherSkillDriver = clayManMaster.AddComponent <AISkillDriver>();

            Swing.skillSlot                         = SkillSlot.Primary;
            Swing.requireSkillReady                 = false;
            Swing.requireEquipmentReady             = false;
            Swing.moveTargetType                    = TargetType.CurrentEnemy;
            Swing.minUserHealthFraction             = float.NegativeInfinity;
            Swing.maxUserHealthFraction             = float.PositiveInfinity;
            Swing.minTargetHealthFraction           = float.NegativeInfinity;
            Swing.maxTargetHealthFraction           = float.PositiveInfinity;
            Swing.minDistance                       = 0;
            Swing.maxDistance                       = 2;
            Swing.selectionRequiresTargetLoS        = false;
            Swing.activationRequiresTargetLoS       = false;
            Swing.activationRequiresAimConfirmation = false;
            Swing.movementType                      = MovementType.ChaseMoveTarget;
            Swing.moveInputScale                    = 1;
            Swing.aimType                   = AimType.AtMoveTarget;
            Swing.ignoreNodeGraph           = true;
            Swing.driverUpdateTimerOverride = -1;
            Swing.resetCurrentEnemyOnNextDriverSelection = false;
            Swing.noRepeat            = false;
            Swing.shouldSprint        = false;
            Swing.shouldFireEquipment = false;
            Swing.shouldTapButton     = false;

            Leap.skillSlot                         = SkillSlot.Secondary;
            Leap.requireSkillReady                 = false;
            Leap.requireEquipmentReady             = false;
            Leap.moveTargetType                    = TargetType.CurrentEnemy;
            Leap.minUserHealthFraction             = float.NegativeInfinity;
            Leap.maxUserHealthFraction             = float.PositiveInfinity;
            Leap.minTargetHealthFraction           = float.NegativeInfinity;
            Leap.maxTargetHealthFraction           = float.PositiveInfinity;
            Leap.minDistance                       = 0;
            Leap.maxDistance                       = 30;
            Leap.selectionRequiresTargetLoS        = false;
            Leap.activationRequiresTargetLoS       = false;
            Leap.activationRequiresAimConfirmation = false;
            Leap.movementType                      = MovementType.ChaseMoveTarget;
            Leap.moveInputScale                    = 1;
            Leap.aimType                   = AimType.AtMoveTarget;
            Leap.ignoreNodeGraph           = true;
            Leap.driverUpdateTimerOverride = -1;
            Leap.resetCurrentEnemyOnNextDriverSelection = false;
            Leap.noRepeat            = false;
            Leap.shouldSprint        = false;
            Leap.shouldFireEquipment = false;
            Leap.shouldTapButton     = false;

            Chase.skillSlot                         = SkillSlot.None;
            Chase.requireSkillReady                 = false;
            Chase.requireEquipmentReady             = false;
            Chase.moveTargetType                    = TargetType.CurrentEnemy;
            Chase.minUserHealthFraction             = float.NegativeInfinity;
            Chase.maxUserHealthFraction             = float.PositiveInfinity;
            Chase.minTargetHealthFraction           = float.NegativeInfinity;
            Chase.maxTargetHealthFraction           = float.PositiveInfinity;
            Chase.minDistance                       = 10;
            Chase.maxDistance                       = 10;
            Chase.selectionRequiresTargetLoS        = true;
            Chase.activationRequiresTargetLoS       = false;
            Chase.activationRequiresAimConfirmation = false;
            Chase.movementType                      = MovementType.ChaseMoveTarget;
            Chase.moveInputScale                    = 1;
            Chase.aimType                   = AimType.AtMoveTarget;
            Chase.ignoreNodeGraph           = true;
            Chase.driverUpdateTimerOverride = -1;
            Chase.resetCurrentEnemyOnNextDriverSelection = false;
            Chase.noRepeat            = false;
            Chase.shouldSprint        = false;
            Chase.shouldFireEquipment = false;
            Chase.shouldTapButton     = false;

            anotherSkillDriver.customName                        = "FollowNodeGraphToTarget";
            anotherSkillDriver.skillSlot                         = SkillSlot.None;
            anotherSkillDriver.requireSkillReady                 = false;
            anotherSkillDriver.requireEquipmentReady             = false;
            anotherSkillDriver.moveTargetType                    = TargetType.CurrentEnemy;
            anotherSkillDriver.minUserHealthFraction             = float.NegativeInfinity;
            anotherSkillDriver.maxUserHealthFraction             = float.PositiveInfinity;
            anotherSkillDriver.minTargetHealthFraction           = float.NegativeInfinity;
            anotherSkillDriver.maxTargetHealthFraction           = float.PositiveInfinity;
            anotherSkillDriver.minDistance                       = 0;
            anotherSkillDriver.maxDistance                       = float.PositiveInfinity;
            anotherSkillDriver.selectionRequiresTargetLoS        = false;
            anotherSkillDriver.activationRequiresTargetLoS       = false;
            anotherSkillDriver.activationRequiresAimConfirmation = false;
            anotherSkillDriver.movementType                      = MovementType.ChaseMoveTarget;
            anotherSkillDriver.moveInputScale                    = 1;
            anotherSkillDriver.aimType                   = AimType.MoveDirection;
            anotherSkillDriver.ignoreNodeGraph           = false;
            anotherSkillDriver.driverUpdateTimerOverride = -1;
            anotherSkillDriver.resetCurrentEnemyOnNextDriverSelection = false;
            anotherSkillDriver.noRepeat            = false;
            anotherSkillDriver.shouldSprint        = false;
            anotherSkillDriver.shouldFireEquipment = false;
            anotherSkillDriver.shouldTapButton     = false;

            andAnotherSkillDriver.customName                        = "ChaseOffNodegraph";
            andAnotherSkillDriver.skillSlot                         = SkillSlot.None;
            andAnotherSkillDriver.requireSkillReady                 = false;
            andAnotherSkillDriver.requireEquipmentReady             = false;
            andAnotherSkillDriver.moveTargetType                    = TargetType.CurrentEnemy;
            andAnotherSkillDriver.minUserHealthFraction             = float.NegativeInfinity;
            andAnotherSkillDriver.maxUserHealthFraction             = float.PositiveInfinity;
            andAnotherSkillDriver.minTargetHealthFraction           = float.NegativeInfinity;
            andAnotherSkillDriver.maxTargetHealthFraction           = float.PositiveInfinity;
            andAnotherSkillDriver.minDistance                       = 0;
            andAnotherSkillDriver.maxDistance                       = 10;
            andAnotherSkillDriver.selectionRequiresTargetLoS        = true;
            andAnotherSkillDriver.activationRequiresTargetLoS       = false;
            andAnotherSkillDriver.activationRequiresAimConfirmation = false;
            andAnotherSkillDriver.movementType                      = MovementType.ChaseMoveTarget;
            andAnotherSkillDriver.moveInputScale                    = 1;
            andAnotherSkillDriver.aimType                   = AimType.AtMoveTarget;
            andAnotherSkillDriver.ignoreNodeGraph           = true;
            andAnotherSkillDriver.driverUpdateTimerOverride = -1;
            andAnotherSkillDriver.resetCurrentEnemyOnNextDriverSelection = false;
            andAnotherSkillDriver.noRepeat            = false;
            andAnotherSkillDriver.shouldSprint        = false;
            andAnotherSkillDriver.shouldFireEquipment = false;
            andAnotherSkillDriver.shouldTapButton     = false;
        }
Exemplo n.º 14
0
        public override void InjectSkills(GameObject gameObject, BaseAI ai)
        {
            AISkillDriver skill4 = gameObject.AddComponent <AISkillDriver>() as AISkillDriver;

            skill4.customName                        = "Special";
            skill4.skillSlot                         = RoR2.SkillSlot.Special;
            skill4.requireSkillReady                 = true;
            skill4.moveTargetType                    = AISkillDriver.TargetType.CurrentEnemy;
            skill4.minDistance                       = 0;
            skill4.maxDistance                       = float.PositiveInfinity;
            skill4.selectionRequiresTargetLoS        = false;
            skill4.activationRequiresTargetLoS       = false;
            skill4.activationRequiresAimConfirmation = true;
            skill4.movementType                      = AISkillDriver.MovementType.ChaseMoveTarget;
            skill4.aimType         = AISkillDriver.AimType.AtMoveTarget;
            skill4.ignoreNodeGraph = false;
            skill4.resetCurrentEnemyOnNextDriverSelection = false;
            skill4.noRepeat     = false;
            skill4.shouldSprint = false;

            AISkillDriver skill2 = gameObject.AddComponent <AISkillDriver>() as AISkillDriver;

            skill2.customName                        = "Secondary";
            skill2.skillSlot                         = RoR2.SkillSlot.Secondary;
            skill2.requireSkillReady                 = true;
            skill2.moveTargetType                    = AISkillDriver.TargetType.CurrentEnemy;
            skill2.minDistance                       = 0;
            skill2.maxDistance                       = 30;
            skill2.selectionRequiresTargetLoS        = true;
            skill2.activationRequiresTargetLoS       = true;
            skill2.activationRequiresAimConfirmation = true;
            skill2.movementType                      = AISkillDriver.MovementType.StrafeMovetarget;
            skill2.aimType         = AISkillDriver.AimType.AtCurrentEnemy;
            skill2.ignoreNodeGraph = false;
            skill2.resetCurrentEnemyOnNextDriverSelection = false;
            skill2.noRepeat     = false;
            skill2.shouldSprint = false;

            AISkillDriver skill3 = gameObject.AddComponent <AISkillDriver>() as AISkillDriver;

            skill3.customName                        = "UtilityOffensive";
            skill3.skillSlot                         = RoR2.SkillSlot.Utility;
            skill3.requireSkillReady                 = true;
            skill3.moveTargetType                    = AISkillDriver.TargetType.CurrentEnemy;
            skill3.minDistance                       = 5;
            skill3.maxDistance                       = 100;
            skill3.minUserHealthFraction             = .7f;
            skill3.selectionRequiresTargetLoS        = true;
            skill3.activationRequiresTargetLoS       = false;
            skill3.activationRequiresAimConfirmation = false;
            skill3.movementType                      = AISkillDriver.MovementType.ChaseMoveTarget;
            skill3.aimType         = AISkillDriver.AimType.AtMoveTarget;
            skill3.ignoreNodeGraph = true;
            skill3.resetCurrentEnemyOnNextDriverSelection = false;
            skill3.noRepeat     = false;
            skill3.shouldSprint = true;

            // Skills
            AISkillDriver skill1 = gameObject.AddComponent <AISkillDriver>() as AISkillDriver;

            skill1.customName                        = "Primary";
            skill1.skillSlot                         = RoR2.SkillSlot.Primary;
            skill1.requireSkillReady                 = false;
            skill1.moveTargetType                    = AISkillDriver.TargetType.CurrentEnemy;
            skill1.minDistance                       = 0;
            skill1.maxDistance                       = 50;
            skill1.selectionRequiresTargetLoS        = true;
            skill1.activationRequiresTargetLoS       = true;
            skill1.activationRequiresAimConfirmation = true;
            skill1.movementType                      = AISkillDriver.MovementType.StrafeMovetarget;
            skill1.aimType         = AISkillDriver.AimType.AtCurrentEnemy;
            skill1.ignoreNodeGraph = false;
            skill1.resetCurrentEnemyOnNextDriverSelection = false;
            skill1.noRepeat     = false;
            skill1.shouldSprint = false;

            skill4.nextHighPriorityOverride = skill1;

            // Add default skills
            AddDefaultSkills(gameObject, ai, 20);
        }
Exemplo n.º 15
0
        public override void InjectSkills(GameObject gameObject, BaseAI ai)
        {
            AISkillDriver skill4 = gameObject.AddComponent <AISkillDriver>() as AISkillDriver;

            skill4.customName                        = "Special";
            skill4.skillSlot                         = RoR2.SkillSlot.Special;
            skill4.requireSkillReady                 = true;
            skill4.moveTargetType                    = AISkillDriver.TargetType.NearestFriendlyInSkillRange;
            skill4.minDistance                       = 0;
            skill4.maxDistance                       = 50;
            skill4.minTargetHealthFraction           = float.NegativeInfinity;
            skill4.maxTargetHealthFraction           = .7f;
            skill4.selectionRequiresTargetLoS        = false;
            skill4.activationRequiresTargetLoS       = false;
            skill4.activationRequiresAimConfirmation = true;
            skill4.movementType                      = AISkillDriver.MovementType.Stop;
            skill4.aimType         = AISkillDriver.AimType.AtMoveTarget;
            skill4.ignoreNodeGraph = false;
            skill4.resetCurrentEnemyOnNextDriverSelection = false;
            skill4.noRepeat                  = true;
            skill4.shouldSprint              = false;
            skill4.buttonPressType           = AISkillDriver.ButtonPressType.Hold;
            skill4.driverUpdateTimerOverride = 5f;

            AISkillDriver skill3 = gameObject.AddComponent <AISkillDriver>() as AISkillDriver;

            skill3.customName                        = "Utility";
            skill3.skillSlot                         = RoR2.SkillSlot.Utility;
            skill3.requireSkillReady                 = true;
            skill3.moveTargetType                    = AISkillDriver.TargetType.CurrentEnemy;
            skill3.minDistance                       = 0;
            skill3.maxDistance                       = 50;
            skill3.selectionRequiresTargetLoS        = true;
            skill3.activationRequiresTargetLoS       = true;
            skill3.activationRequiresAimConfirmation = false;
            skill3.movementType                      = AISkillDriver.MovementType.ChaseMoveTarget;
            skill3.aimType         = AISkillDriver.AimType.AtMoveTarget;
            skill3.ignoreNodeGraph = false;
            skill3.resetCurrentEnemyOnNextDriverSelection = false;
            skill3.noRepeat     = false;
            skill3.shouldSprint = true;

            AISkillDriver skill1_alt = gameObject.AddComponent <AISkillDriver>() as AISkillDriver;

            skill1_alt.customName                        = "PrimaryBeam";
            skill1_alt.skillSlot                         = RoR2.SkillSlot.Primary;
            skill1_alt.requireSkillReady                 = true;
            skill1_alt.moveTargetType                    = AISkillDriver.TargetType.CurrentEnemy;
            skill1_alt.minDistance                       = 0;
            skill1_alt.maxDistance                       = 30;
            skill1_alt.minUserHealthFraction             = .9f;
            skill1_alt.selectionRequiresTargetLoS        = true;
            skill1_alt.activationRequiresTargetLoS       = true;
            skill1_alt.activationRequiresAimConfirmation = true;
            skill1_alt.movementType                      = AISkillDriver.MovementType.StrafeMovetarget;
            skill1_alt.aimType         = AISkillDriver.AimType.AtMoveTarget;
            skill1_alt.ignoreNodeGraph = true;
            skill1_alt.resetCurrentEnemyOnNextDriverSelection = false;
            skill1_alt.noRepeat     = false;
            skill1_alt.shouldSprint = false;

            AISkillDriver skill2 = gameObject.AddComponent <AISkillDriver>() as AISkillDriver;

            skill2.customName                        = "Secondary";
            skill2.skillSlot                         = RoR2.SkillSlot.Secondary;
            skill2.requireSkillReady                 = true;
            skill2.moveTargetType                    = AISkillDriver.TargetType.CurrentEnemy;
            skill2.minDistance                       = 0;
            skill2.maxDistance                       = 15;
            skill2.selectionRequiresTargetLoS        = true;
            skill2.activationRequiresTargetLoS       = true;
            skill2.activationRequiresAimConfirmation = true;
            skill2.movementType                      = AISkillDriver.MovementType.StrafeMovetarget;
            skill2.aimType         = AISkillDriver.AimType.AtMoveTarget;
            skill2.ignoreNodeGraph = false;
            skill2.resetCurrentEnemyOnNextDriverSelection = false;
            skill2.noRepeat     = false;
            skill2.shouldSprint = false;

            AISkillDriver chaseSkill = gameObject.AddComponent <AISkillDriver>() as AISkillDriver;

            chaseSkill.customName                        = "ChaseTarget";
            chaseSkill.skillSlot                         = RoR2.SkillSlot.None;
            chaseSkill.requireSkillReady                 = false;
            chaseSkill.moveTargetType                    = AISkillDriver.TargetType.CurrentEnemy;
            chaseSkill.minDistance                       = 10;
            chaseSkill.maxDistance                       = 60;
            chaseSkill.selectionRequiresTargetLoS        = true;
            chaseSkill.activationRequiresTargetLoS       = true;
            chaseSkill.activationRequiresAimConfirmation = false;
            chaseSkill.movementType                      = AISkillDriver.MovementType.ChaseMoveTarget;
            chaseSkill.aimType         = AISkillDriver.AimType.AtMoveTarget;
            chaseSkill.ignoreNodeGraph = false;
            chaseSkill.resetCurrentEnemyOnNextDriverSelection = false;
            chaseSkill.noRepeat     = false;
            chaseSkill.shouldSprint = true;

            AISkillDriver skill1 = gameObject.AddComponent <AISkillDriver>() as AISkillDriver;

            skill1.customName                        = "Primary";
            skill1.skillSlot                         = RoR2.SkillSlot.Primary;
            skill1.requireSkillReady                 = true;
            skill1.moveTargetType                    = AISkillDriver.TargetType.CurrentEnemy;
            skill1.minDistance                       = 0;
            skill1.maxDistance                       = 10;
            skill1.selectionRequiresTargetLoS        = true;
            skill1.activationRequiresTargetLoS       = true;
            skill1.activationRequiresAimConfirmation = false;
            skill1.movementType                      = AISkillDriver.MovementType.ChaseMoveTarget;
            skill1.aimType         = AISkillDriver.AimType.AtMoveTarget;
            skill1.ignoreNodeGraph = true;
            skill1.resetCurrentEnemyOnNextDriverSelection = false;
            skill1.noRepeat     = false;
            skill1.shouldSprint = false;

            // Add default skills
            AddDefaultSkills(gameObject, ai, 0);
        }
Exemplo n.º 16
0
        public override void InjectSkills(GameObject gameObject, BaseAI ai)
        {
            // Skills
            AISkillDriver skill3 = gameObject.AddComponent <AISkillDriver>() as AISkillDriver;

            skill3.customName        = "Utility";
            skill3.skillSlot         = RoR2.SkillSlot.Utility;
            skill3.requireSkillReady = true;
            skill3.moveTargetType    = AISkillDriver.TargetType.CurrentEnemy;
            skill3.minDistance       = 0;
            skill3.maxDistance       = 20;
            //skill3.maxUserHealthFraction = .25f;
            skill3.selectionRequiresTargetLoS        = true;
            skill3.activationRequiresTargetLoS       = false;
            skill3.activationRequiresAimConfirmation = false;
            skill3.movementType    = AISkillDriver.MovementType.FleeMoveTarget;
            skill3.aimType         = AISkillDriver.AimType.MoveDirection;
            skill3.ignoreNodeGraph = false;
            skill3.resetCurrentEnemyOnNextDriverSelection = false;
            skill3.noRepeat        = false;
            skill3.shouldSprint    = true;
            skill3.buttonPressType = AISkillDriver.ButtonPressType.TapContinuous;

            AISkillDriver skill2 = gameObject.AddComponent <AISkillDriver>() as AISkillDriver;

            skill2.customName                        = "Secondary";
            skill2.skillSlot                         = RoR2.SkillSlot.Secondary;
            skill2.requireSkillReady                 = true;
            skill2.moveTargetType                    = AISkillDriver.TargetType.CurrentEnemy;
            skill2.minDistance                       = 0;
            skill2.maxDistance                       = 25;
            skill2.selectionRequiresTargetLoS        = true;
            skill2.activationRequiresTargetLoS       = true;
            skill2.activationRequiresAimConfirmation = true;
            skill2.movementType                      = AISkillDriver.MovementType.StrafeMovetarget;
            skill2.aimType         = AISkillDriver.AimType.AtMoveTarget;
            skill2.ignoreNodeGraph = false;
            skill2.resetCurrentEnemyOnNextDriverSelection = false;
            skill2.noRepeat        = false;
            skill2.shouldSprint    = false;
            skill2.buttonPressType = AISkillDriver.ButtonPressType.TapContinuous;

            // Skills
            AISkillDriver skill1 = gameObject.AddComponent <AISkillDriver>() as AISkillDriver;

            skill1.customName                        = "Shoot";
            skill1.skillSlot                         = RoR2.SkillSlot.Primary;
            skill1.requireSkillReady                 = true;
            skill1.moveTargetType                    = AISkillDriver.TargetType.CurrentEnemy;
            skill1.minDistance                       = 0;
            skill1.maxDistance                       = 50;
            skill1.selectionRequiresTargetLoS        = true;
            skill1.activationRequiresTargetLoS       = true;
            skill1.activationRequiresAimConfirmation = true;
            skill1.movementType                      = AISkillDriver.MovementType.StrafeMovetarget;
            skill1.aimType         = AISkillDriver.AimType.AtMoveTarget;
            skill1.ignoreNodeGraph = false;
            skill1.resetCurrentEnemyOnNextDriverSelection = false;
            skill1.noRepeat        = false;
            skill1.shouldSprint    = false;
            skill1.buttonPressType = AISkillDriver.ButtonPressType.TapContinuous;

            AISkillDriver skill4 = gameObject.AddComponent <AISkillDriver>() as AISkillDriver;

            skill4.customName                        = "Special";
            skill4.skillSlot                         = RoR2.SkillSlot.Special;
            skill4.requireSkillReady                 = true;
            skill4.moveTargetType                    = AISkillDriver.TargetType.CurrentEnemy;
            skill4.minDistance                       = 0;
            skill4.maxDistance                       = 50;
            skill4.selectionRequiresTargetLoS        = false;
            skill4.activationRequiresTargetLoS       = false;
            skill4.activationRequiresAimConfirmation = false;
            skill4.movementType                      = AISkillDriver.MovementType.StrafeMovetarget;
            skill4.aimType         = AISkillDriver.AimType.AtMoveTarget;
            skill4.ignoreNodeGraph = false;
            skill4.resetCurrentEnemyOnNextDriverSelection = false;
            skill4.noRepeat        = false;
            skill4.shouldSprint    = false;
            skill4.buttonPressType = AISkillDriver.ButtonPressType.TapContinuous;

            // Add default skills
            AddDefaultSkills(gameObject, ai, 15);
        }
Exemplo n.º 17
0
        public override void InjectSkills(GameObject gameObject, BaseAI ai)
        {
            // Skills
            AISkillDriver skill4 = gameObject.AddComponent <AISkillDriver>() as AISkillDriver;

            skill4.customName                        = "DeployTurret";
            skill4.skillSlot                         = RoR2.SkillSlot.Special;
            skill4.requireSkillReady                 = true;
            skill4.moveTargetType                    = AISkillDriver.TargetType.CurrentEnemy;
            skill4.minDistance                       = 0;
            skill4.maxDistance                       = 60;
            skill4.selectionRequiresTargetLoS        = true;
            skill4.activationRequiresTargetLoS       = false;
            skill4.activationRequiresAimConfirmation = false;
            skill4.movementType                      = AISkillDriver.MovementType.StrafeMovetarget;
            skill4.aimType         = AISkillDriver.AimType.AtMoveTarget;
            skill4.ignoreNodeGraph = true;
            skill4.resetCurrentEnemyOnNextDriverSelection = false;
            skill4.noRepeat     = true;
            skill4.shouldSprint = false;

            AISkillDriver skill3 = gameObject.AddComponent <AISkillDriver>() as AISkillDriver;

            skill3.customName                        = "DeployShieldOnTeammate";
            skill3.skillSlot                         = RoR2.SkillSlot.Utility;
            skill3.requireSkillReady                 = true;
            skill3.moveTargetType                    = AISkillDriver.TargetType.NearestFriendlyInSkillRange;
            skill3.minDistance                       = 0;
            skill3.maxDistance                       = 50;
            skill3.minTargetHealthFraction           = float.NegativeInfinity;
            skill3.maxTargetHealthFraction           = .7f;
            skill3.selectionRequiresTargetLoS        = false;
            skill3.activationRequiresTargetLoS       = false;
            skill3.activationRequiresAimConfirmation = true;
            skill3.movementType                      = AISkillDriver.MovementType.ChaseMoveTarget;
            skill3.aimType         = AISkillDriver.AimType.AtMoveTarget;
            skill3.ignoreNodeGraph = false;
            skill3.resetCurrentEnemyOnNextDriverSelection = false;
            skill3.noRepeat     = true;
            skill3.shouldSprint = true;

            AISkillDriver skill2 = gameObject.AddComponent <AISkillDriver>() as AISkillDriver;

            skill2.customName                        = "PlaceMine";
            skill2.skillSlot                         = RoR2.SkillSlot.Secondary;
            skill2.requireSkillReady                 = true;
            skill2.moveTargetType                    = AISkillDriver.TargetType.CurrentEnemy;
            skill2.minDistance                       = 0;
            skill2.maxDistance                       = 25;
            skill2.selectionRequiresTargetLoS        = true;
            skill2.activationRequiresTargetLoS       = true;
            skill2.activationRequiresAimConfirmation = true;
            skill2.movementType                      = AISkillDriver.MovementType.StrafeMovetarget;
            skill2.aimType         = AISkillDriver.AimType.AtMoveTarget;
            skill2.ignoreNodeGraph = false;
            skill2.resetCurrentEnemyOnNextDriverSelection = false;
            skill2.noRepeat     = false;
            skill2.shouldSprint = false;

            AISkillDriver skill1 = gameObject.AddComponent <AISkillDriver>() as AISkillDriver;

            skill1.customName                        = "Shoot";
            skill1.skillSlot                         = RoR2.SkillSlot.Primary;
            skill1.requireSkillReady                 = true;
            skill1.moveTargetType                    = AISkillDriver.TargetType.CurrentEnemy;
            skill1.minDistance                       = 0;
            skill1.maxDistance                       = 40;
            skill1.selectionRequiresTargetLoS        = true;
            skill1.activationRequiresTargetLoS       = true;
            skill1.activationRequiresAimConfirmation = true;
            skill1.movementType                      = AISkillDriver.MovementType.StrafeMovetarget;
            skill1.aimType         = AISkillDriver.AimType.AtMoveTarget;
            skill1.ignoreNodeGraph = false;
            skill1.resetCurrentEnemyOnNextDriverSelection = false;
            skill1.noRepeat     = false;
            skill1.shouldSprint = false;

            // Add default skills
            AddDefaultSkills(gameObject, ai, 20);
        }