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); }
/// <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; }
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); }
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(); } }
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); }
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; }
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); }
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; }
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); }
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); }
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; }
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; }
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); }
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); }
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); }
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); }