public static GameEntity CreateEnemy(Contexts contexts, Vector2 pos) { var enemy = contexts.game.CreateEntity(); enemy.AddPrefab("Prefabs/Enemies/spider"); enemy.AddPosition(pos); enemy.isEnemy = true; enemy.isRemovedWhenDead = true; MovementHelpers.AddMovementComponents(enemy, 2f, .25f, .5f, .8f, 1f); SightHelpers.AddSightComponents(enemy, 50); CombatHelpers.AddCombatComponents(enemy, 5f, 3f, .5f); var agent = new EntityGoapAgent(contexts, enemy); agent.AddAction(new CloseRangeAttackAction()); agent.AddAction(new GetCloseToTargetAction()); agent.AddAction(new TargetMinersAction()); agent.AddGoal(new DestroyMineGoal()); enemy.AddGoapAgent(agent); var animDirector = new AnimationDirector(enemy); enemy.AddAnimationDirector(animDirector); var combatDirector = new CombatDirector(enemy); combatDirector.AddAttack(new MeleeAttack(enemy, "spider_walk", new [] { 24 })); enemy.AddCombatDirector(combatDirector); return(enemy); }
private void Awake() { demonHealth = 180; beenHit = false; combatDirectorScript = GameObject.Find("Combat Director").GetComponent <CombatDirector>(); demonAudioSource = GameObject.Find("DemonHTP").GetComponent <AudioSource>(); }
//Combat Shrine private static void ShrineCombatBehavior_AddShrineStack(On.RoR2.ShrineCombatBehavior.orig_AddShrineStack orig, ShrineCombatBehavior self, Interactor interactor) { orig(self, interactor); var characterBody = interactor.GetComponent <CharacterBody>(); if (characterBody) { var inv = characterBody.inventory; if (inv) { if (inv.GetItemCount(ExtraShrineRollItemIndex) > 0 && Util.CheckRoll(ItemProcChance * inv.GetItemCount(ExtraShrineRollItemIndex), characterBody.master)) { GameObject gameObject = UnityEngine.Object.Instantiate <GameObject>(Resources.Load <GameObject>("Prefabs/NetworkedObjects/Encounters/MonstersOnShrineUseEncounter"), self.transform.position, Quaternion.identity); UnityEngine.Networking.NetworkServer.Spawn(gameObject); CombatDirector combarDirector = gameObject.GetComponent <CombatDirector>(); float monsterCredit = 100f * Stage.instance.entryDifficultyCoefficient; DirectorCard directorCard = combarDirector.SelectMonsterCardForCombatShrine(monsterCredit); if (directorCard != null) { Chat.AddMessage("<color=\"green\">Lucky Default Sphere <style=cShrine>has spawned an additional set of combat shrine monsters.</style>"); combarDirector.CombatShrineActivation(interactor, monsterCredit, directorCard); return; } UnityEngine.Networking.NetworkServer.Destroy(gameObject); } } } }
private void OnTriggerEnter(Collider other) { if (other.tag == "demon weapons") { CombatDirector combatDirectorScript = GameObject.Find("Combat Director").GetComponent <CombatDirector>(); if (!beenHit && !BlockBeenHit.blockBeenHit && DemonBehavior.demonCanDamage && other.name == "handTrigger" && DemonBehavior.demonBodyAnimator.GetCurrentAnimatorStateInfo(0).IsName("DemonLean") && DemonBehavior.demonBodyAnimator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 0.25f && DemonBehavior.demonBodyAnimator.GetCurrentAnimatorStateInfo(0).normalizedTime <= 0.75f) { beenHit = true; combatDirectorScript.flushEvadesQueue(); playerManager.playerHealth -= 10; //change to 10 if (playerManager.playerHealth < 0) { playerManager.playerHealth = 0; } playerManager.targetForTheRest.gameObject.GetComponent <AudioSource>().Play(); } else if (!beenHit && DemonBehavior.demonCanDamage && other.name == "hornTrigger" && DemonBehavior.demonBodyAnimator.GetCurrentAnimatorStateInfo(0).IsName("DemonBow") && DemonBehavior.demonBodyAnimator.GetCurrentAnimatorStateInfo(0).normalizedTime > 0.9f) { beenHit = true; combatDirectorScript.flushEvadesQueue(); //StartCoroutine(hornDamageEnable()); playerManager.playerHealth -= 25; //change to 25 if (playerManager.playerHealth < 0) { playerManager.playerHealth = 0; } playerManager.targetForTheRest.gameObject.GetComponent <AudioSource>().Play(); } else if (other.name == "DemonDeathBall(Clone)" && DemonBehavior.demonCanDamage) { playerManager.playerHealth -= 10; //change to required damage if (playerManager.playerHealth < 0) { playerManager.playerHealth = 0; } //play hurt sound playerManager.targetForTheRest.gameObject.GetComponent <AudioSource>().Play(); } /*if player health touches zero, spirit should instantly not be able to hurt demon. * This was to ensure that in case both demon and player were one hit away from dying * and both hit each other, the one whose triggers hit first, should survive, else * unwanted case will arise of both dying. Same piece of code done in vice versa in * spiritHit.cs*/ if (playerManager.playerHealth == 0) { if (playerManager.playerCanDamage) { playerManager.playerCanDamage = false; } } playerManagerScript.checkPlayerHealth(); } }
private void OnTriggerStay(Collider other) { if (other.tag == "demon weapons") { CombatDirector combatDirectorScript = GameObject.Find("Combat Director").GetComponent <CombatDirector>(); if (!beenHit && !BlockBeenHit.blockBeenHit && DemonBehavior.demonCanDamage && other.name == "handTrigger" && DemonBehavior.demonBodyAnimator.GetCurrentAnimatorStateInfo(0).IsName("DemonLean") && DemonBehavior.demonBodyAnimator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 0.25f && DemonBehavior.demonBodyAnimator.GetCurrentAnimatorStateInfo(0).normalizedTime <= 0.75f) { beenHit = true; combatDirectorScript.flushEvadesQueue(); playerManager.playerHealth -= 10; //change to 10 if (playerManager.playerHealth < 0) { playerManager.playerHealth = 0; } playerManager.targetForTheRest.gameObject.GetComponent <AudioSource>().Play(); } else if (!beenHit && DemonBehavior.demonCanDamage && other.name == "hornTrigger" && DemonBehavior.demonBodyAnimator.GetCurrentAnimatorStateInfo(0).IsName("DemonBow") && DemonBehavior.demonBodyAnimator.GetCurrentAnimatorStateInfo(0).normalizedTime > 0.9f) { beenHit = true; combatDirectorScript.flushEvadesQueue(); //StartCoroutine(hornDamageEnable()); playerManager.playerHealth -= 25; //change to 25 if (playerManager.playerHealth < 0) { playerManager.playerHealth = 0; } playerManager.targetForTheRest.gameObject.GetComponent <AudioSource>().Play(); } else if (other.name == "DemonDeathBall(Clone)" && DemonBehavior.demonCanDamage) { playerManager.playerHealth -= 10; //change to required damage if (playerManager.playerHealth < 0) { playerManager.playerHealth = 0; } //play hurt sound playerManager.targetForTheRest.gameObject.GetComponent <AudioSource>().Play(); } if (playerManager.playerHealth == 0) { if (playerManager.playerCanDamage) { playerManager.playerCanDamage = false; } } playerManagerScript.checkPlayerHealth(); } }
static void DisableMobSpawn(On.RoR2.CombatDirector.orig_Simulate orig, CombatDirector self, float deltaTime) { if (NetworkServer.active) { orig(self, VoteAPI.VoteResults.HasVote(Settings.MobSpawn.Item2) ? deltaTime : 0); } else { orig(self, deltaTime); } }
private static EliteIndex GetNextElite(CombatDirector self, ref float cost, out float scaledCost) { ChosenAffix.TryGetValue(self, out var affix); scaledCost = affix != null ? affix.costMultiplier * cost : cost; if (scaledCost < self.monsterCredit) { cost = scaledCost; return(affix?.eliteType ?? EliteIndex.None); } return(EliteIndex.None); }
private static void GetCoeffs(CombatDirector self, out float hpCoeff, out float dmgCoeff) { ChosenAffix.TryGetValue(self, out var affix); if (affix != null) { hpCoeff = affix.healthBoostCoeff; dmgCoeff = affix.damageBoostCoeff; } else { hpCoeff = 1; dmgCoeff = 1; } }
public override void IAInitialize(CombatDirector _director) { director = _director; if (sm == null) { SetStates(); } else { sm.SendInput(JabaliInputs.IDLE); } canupdate = true; }
public void Start() { target.holdoutZoneController.onCharged.AddListener(this.OnFinish); if (Run.instance) { availableTier1DropList = Run.instance.availableTier1DropList.Where(new Func <PickupIndex, bool>(ArenaMissionController.IsPickupAllowedForMonsters)).ToList <PickupIndex>(); availableTier2DropList = Run.instance.availableTier2DropList.Where(new Func <PickupIndex, bool>(ArenaMissionController.IsPickupAllowedForMonsters)).ToList <PickupIndex>(); availableTier3DropList = Run.instance.availableTier3DropList.Where(new Func <PickupIndex, bool>(ArenaMissionController.IsPickupAllowedForMonsters)).ToList <PickupIndex>(); monsterCards = Util.CreateReasonableDirectorCardSpawnList(50 * Run.instance.difficultyCoefficient, 6, 2); } instance = this; target.locked = true; if (NetworkServer.active) { this.rng = new Xoroshiro128Plus((ulong)Run.instance.stageRng.nextUint); for (int i = 0; i < this.directors.Length; i++) { CombatDirector combatDirector = this.directors[i]; combatDirector.maximumNumberToSpawnBeforeSkipping = 6; combatDirector.spawnDistanceMultiplier = 2; combatDirector.eliteBias = 1; combatDirector.onSpawnedServer.AddListener(delegate(GameObject targetGameObject) { this.ModifySpawnedMasters(targetGameObject); }); } bossDirector.onSpawnedServer.AddListener(delegate(GameObject targetGameObject) { this.ModifySpawnedMasters(targetGameObject); }); } if (DirectorCore.instance) { var coreCombatDirectors = DirectorCore.instance.gameObject.GetComponents <CombatDirector>(); foreach (CombatDirector coreDirector in coreCombatDirectors) { coreDirector.enabled = false; coreDirector.creditMultiplier = 0; } } else { Debug.LogWarning("[CRCore3]: CRMissionController.Start - DirectorCore not instantiated!"); } }
public static GameEntity CreateMiner(Contexts contexts, Vector2 pos) { var e = contexts.game.CreateEntity(); e.AddPrefab("Prefabs/Miners/miner_grunt"); e.AddPosition(pos); MovementHelpers.AddMovementComponents(e, 3f, .25f, .5f, .5f, .8f); SightHelpers.AddSightComponents(e, 10f); e.isMiner = true; var health = StatCalculator.Calculate(BaseHealth, 1); var damage = StatCalculator.Calculate(BaseMiningDamage, 1); var cooldown = StatCalculator.Calculate(BaseMiningSpeed, 1); CombatHelpers.AddCombatComponents(e, health, damage, cooldown); var animDirector = new AnimationDirector(e); e.AddAnimationDirector(animDirector); e.isKillable = true; var agent = new EntityGoapAgent(contexts, e); agent.AddAction(new CloseRangeAttackAction()); agent.AddAction(new GetCloseToTargetAction()); agent.AddAction(new TargetOreBranchAction()); agent.AddAction(new MineAction()); agent.AddGoal(new AcquireOreGoal()); e.AddGoapAgent(agent); var combatDirector = new CombatDirector(e); combatDirector.AddAttack(new MeleeAttack(e, "miner_grunt_mine_regular", new[] { 24 })); e.AddCombatDirector(combatDirector); e.AddBag(new List <int>()); return(e); }
private static bool IsEarlyEliteDefAvailable(SpawnCard.EliteRules rules) { if (disableEarlyEliteDef || !Enabled) { return(false); } if (!Run.instance || Run.instance.ambientLevel < ZetArtifactsPlugin.LoopifactEliteLevel.Value) { return(false); } if (rules == SpawnCard.EliteRules.Lunar && CombatDirector.IsEliteOnlyArtifactActive()) { return(true); } if (rules == SpawnCard.EliteRules.Default && Run.instance.loopClearCount == 0) { return(true); } return(false); }
public override void InvokeServer(Dictionary <string, string> contents) { CombatDirector director = getDirector(); if (director == null) { Chat.AddMessage("No Combat Director found, cannot force ambush"); return; } if (!(contents["Player name"] is string victimName)) { Chat.AddMessage("No player name provided"); return; } PlayerCharacterMasterController victim = null; foreach (PlayerCharacterMasterController playerController in PlayerCharacterMasterController.instances) { if (!victimName.Equals(playerController.networkUser.userName, StringComparison.OrdinalIgnoreCase)) { continue; } victim = playerController; break; } if (victim == null) { Chat.AddMessage("No player with name: " + victimName + " found"); return; } director.InvokePrivateMethod("GenerateAmbush", victim.transform.position); }
public void Awake() { purchaseInteraction = GetComponent <PurchaseInteraction>(); combatDirector = GetComponent <CombatDirector>(); combatSquad = GetComponent <CombatSquad>(); instances.Add(this); //combatDirector.eliteBias = 10f; combatDirector.shouldSpawnOneWave = false; if (NetworkServer.active) { purchaseInteraction.onPurchase.AddListener((interactor) => { AddShrineStack(interactor); }); startTime = MoreShrines.impShrineTime.Value; timeLeftUnrounded = (float)MoreShrines.impShrineTime.Value; var difficulty = Run.instance.difficultyCoefficient; var difficultyMultiplier = DifficultyCatalog.GetDifficultyDef(Run.instance.selectedDifficulty).scalingValue - 1; monsterCredit = ((baseCredit * (difficultyMultiplier + 1)) + ((baseCredit + 30) * (difficulty - 1))); impColor = UnityEngine.Random.ColorHSV(0f, 1f, 0.5f, 0.7f, 1f, 1f); impColorHex = "#" + ColorUtility.ToHtmlStringRGB(impColor); combatDirector.combatSquad.onDefeatedServer += OnDefeatedServer; combatDirector.onSpawnedServer.AddListener((gameObject) => { OnSpawnedServer(gameObject); //RpcOnSpawnedClient(gameObject.GetComponent<NetworkBehaviour>().netId); }); } gameObject.GetComponent <CustomDirector>().countToSpawn = impCount; //On.RoR2.CombatDirector.PrepareNewMonsterWave += CombatDirector_PrepareNewMonsterWave; On.RoR2.TeleporterInteraction.AddShrineStack += TeleporterInteraction_AddShrineStack; }
public static GameEntity CreateTurret(Contexts contexts, Vector2 pos) { var turret = contexts.game.CreateEntity(); turret.AddPosition(pos); turret.AddPrefab("Prefabs/Towers/tower_rifle"); var muzzle = contexts.game.CreateEntity(); muzzle.AddPrefab("Prefabs/Towers/tower_rifle_gun"); muzzle.isLookingAtTarget = true; muzzle.AddParent(turret.id.value); muzzle.AddPositionOffset(new Vector2(-0.056f, -0.118f)); CombatHelpers.AddCombatComponents(muzzle, 5f, .5f, .1f); SightHelpers.AddSightComponents(muzzle, 10f); var turretAgent = new EntityGoapAgent(contexts, muzzle); turretAgent.AddGoal(new DefendMineGoal()); turretAgent.AddAction(new TargetMineIntruderAction()); turretAgent.AddAction(new RangeAttackAction()); muzzle.AddGoapAgent(turretAgent); var turretAnim = new AnimationDirector(muzzle); muzzle.AddAnimationDirector(turretAnim); var turretCombat = new CombatDirector(muzzle); turretCombat.AddAttack(new MeleeAttack(muzzle, "tower_rifle_gun_fire", new[] { 3 })); muzzle.AddCombatDirector(turretCombat); return(turret); }
public bool AttemptSpawnOnTarget(On.RoR2.CombatDirector.orig_AttemptSpawnOnTarget orig, CombatDirector self, Transform spawnTarget, DirectorPlacementRule.PlacementMode placementMode) { //this.GetComponent< behaviourName as MonoBehaviour> if (self.gameObject == this.gameObject) { var credit = self.monsterCredit; var monsterCards = self.monsterCards; //MoreShrines.Print("We good?"); if (!this.cardPoolInitialized) { List <CardPool> cardPools = new List <CardPool>(); foreach (var category in monsterCards.categories) { foreach (var card in category.cards) { if (cardPools.Any(pool => pool.cost == card.cost)) { cardPools.Find(pool => pool.cost == card.cost).cards.Add(card); } else { var pool = new CardPool(); pool.cost = card.cost; pool.cards.Add(card); cardPools.Add(pool); } } } cardPoolInitialized = true; cardPools.Sort((item1, item2) => { return(item1.cost.CompareTo(item2.cost)); }); var poolIndex = 0; CardPool currentBasePool = cardPools[0]; foreach (var pool in cardPools) { if (pool.cost * countToSpawn < credit) { currentBasePool = pool; } else { break; } poolIndex++; } MoreShrines.Print("Preparing to spawn " + countToSpawn + " monsters."); CardPool buffPool = cardPools[0]; var buffCount = 0; for (var i = 0; i < countToSpawn; i++) { var count = countToSpawn - i; if (cardPools.Count > poolIndex + 1) { if (((countToSpawn - count) * currentBasePool.cost) + (count * cardPools[poolIndex + 1].cost) < credit) { buffPool = cardPools[poolIndex + 1]; buffCount++; } } } for (var i = 0; i < countToSpawn - buffCount; i++) { finalSpawnOrder.Add(currentBasePool); } for (var i = 0; i < buffCount; i++) { finalSpawnOrder.Add(buffPool); } } // if (finalSpawnOrder.Count > 0) { self.currentMonsterCard = finalSpawnOrder[0].cards[Random.Range(0, finalSpawnOrder[0].cards.Count - 1)]; SpawnCard spawnCard = self.currentMonsterCard.spawnCard; DirectorPlacementRule directorPlacementRule = new DirectorPlacementRule { placementMode = placementMode, spawnOnTarget = spawnTarget, preventOverhead = self.currentMonsterCard.preventOverhead }; DirectorCore.GetMonsterSpawnDistance(self.currentMonsterCard.spawnDistance, out directorPlacementRule.minDistance, out directorPlacementRule.maxDistance); directorPlacementRule.minDistance *= self.spawnDistanceMultiplier; DirectorSpawnRequest directorSpawnRequest = new DirectorSpawnRequest(spawnCard, directorPlacementRule, self.rng); directorSpawnRequest.ignoreTeamMemberLimit = self.ignoreTeamSizeLimit; directorSpawnRequest.teamIndexOverride = new TeamIndex?(self.teamIndex); directorSpawnRequest.onSpawnedServer = new Action <SpawnCard.SpawnResult>(onCardSpawned); if (!DirectorCore.instance.TrySpawnObject(directorSpawnRequest)) { /* * Debug.LogFormat("Spawn card {0} failed to spawn. Aborting cost procedures.", new object[] * { * spawnCard * });*/ self.enabled = false; return(false); } } else { self.enabled = false; return(false); } self.spawnCountInCurrentWave += 1; return(true); } else { return(orig(self, spawnTarget, placementMode)); } }
public void Awake() { On.RoR2.CombatDirector.AttemptSpawnOnTarget += AttemptSpawnOnTarget; director = gameObject.GetComponent <CombatDirector>(); }
public JabaliStates SetDirector(CombatDirector _director) { combatDirector = _director; return(this); }
private static void doMultiElite(GameObject gameObject, CombatDirector self) { DirectorCard card = self.lastAttemptedMonsterCard; float credit = self.monsterCredit; CharacterBody body = gameObject.GetComponentInChildren <CharacterMaster>().GetBody(); CombatDirector.EliteTierDef[] eliteDefs = typeof(CombatDirector).GetFieldValue <CombatDirector.EliteTierDef[]>("eliteTiers"); int currentEliteTypes = 1; foreach (BuffIndex buff in BuffCatalog.eliteBuffIndices) { BuffDef buffDef = BuffCatalog.GetBuffDef(buff); if (body.HasBuff(buff)) { currentEliteTypes += 1; } } if (currentEliteTypes > 1) { foreach (CombatDirector.EliteTierDef tierDef in eliteDefs) { foreach (EliteIndex eliteIndex in tierDef.eliteTypes) { if (credit > card.cost * tierDef.costMultiplier * currentEliteTypes) { BuffDef buffDef = BuffCatalog.GetBuffDef(BuffIndex.None); foreach (BuffIndex buff in BuffCatalog.eliteBuffIndices) { BuffDef tempDef = BuffCatalog.GetBuffDef(buff); if (tempDef.eliteIndex == eliteIndex) { buffDef = tempDef; } } if (buffDef != null) { if (!(body.HasBuff(buffDef.buffIndex))) { body.AddBuff(buffDef.buffIndex); self.monsterCredit -= card.cost * tierDef.costMultiplier * currentEliteTypes; credit -= card.cost * tierDef.costMultiplier * currentEliteTypes; currentEliteTypes++; float num3 = tierDef.healthBoostCoefficient; float damageBoostCoefficient = tierDef.damageBoostCoefficient; if (self.combatSquad) { int livingPlayerCount = Run.instance.livingPlayerCount; num3 *= Mathf.Pow((float)livingPlayerCount, 1f); } body.inventory.GiveItem(ItemIndex.BoostHp, Mathf.RoundToInt((num3 - 1f) * 10f)); body.inventory.GiveItem(ItemIndex.BoostDamage, Mathf.RoundToInt((damageBoostCoefficient - 1f) * 10f)); EliteDef eliteDef = EliteCatalog.GetEliteDef(eliteIndex); EquipmentIndex equipmentIndex = (eliteDef != null) ? eliteDef.eliteEquipmentIndex : EquipmentIndex.None; if (equipmentIndex != EquipmentIndex.None) { if (body.inventory.GetEquipmentIndex() == EquipmentIndex.None) { body.inventory.SetEquipmentIndex(equipmentIndex); } } } } } } } } }
public abstract void IAInitialize(CombatDirector _director);
public void Awake() { purchaseInteraction = GetComponent <PurchaseInteraction>(); combatDirector = GetComponent <CombatDirector>(); combatSquad = GetComponent <CombatSquad>(); purchaseInteraction.Networkcost = 1; purchaseInteraction.cost = 1; combatDirector.shouldSpawnOneWave = false; combatDirector.resetMonsterCardIfFailed = true; if (NetworkServer.active) { acceptNext = UnityEngine.Random.Range(1, 100) > 40; if (acceptNext == false) { combatDirector.teamIndex = TeamIndex.Monster; } var rand = UnityEngine.Random.Range(1, 100); purchaseInteraction.costType = CostTypes.getCostTypeIndex(MoreShrines.costTypeDefWispWhite); if (rand <= 40) { purchaseInteraction.costType = CostTypes.getCostTypeIndex(MoreShrines.costTypeDefWispGreen); tier = 2; } if (rand <= 5) { purchaseInteraction.costType = CostTypes.getCostTypeIndex(MoreShrines.costTypeDefWispRed); tier = 3; var particleSystem = symbolTransform.GetComponent <ParticleSystem>(); //particleSystem.colorOverLifetime.color.colorMin.r = 1.0f; Gradient grad = new Gradient(); grad.SetKeys(new GradientColorKey[] { new GradientColorKey(new Color(1.0f, 0.31f, 0f), 0.0f), new GradientColorKey(new Color(0.75f, 0f, 0.14f), 1.0f) }, new GradientAlphaKey[] { new GradientAlphaKey(1.0f, 0.0f), new GradientAlphaKey(1.0f, 1.0f) }); var colorOverLifetime = particleSystem.colorOverLifetime; colorOverLifetime.color = grad; var emission = particleSystem.emission; emission.rateOverTime = 20f; var main = particleSystem.main; main.maxParticles = 80; } purchaseInteraction.onPurchase.AddListener((interactor) => { AddShrineStack(interactor); }); combatDirector.onSpawnedServer.AddListener((gameobject) => { OnSpawnedServer(gameObject); }); if (!acceptNext) { combatSquad.onMemberDefeatedServer += CombatSquad_onMemberDefeatedServer; } } //gameObject.GetComponent<CustomDirector>().countToSpawn = wispCount; // On.RoR2.CombatDirector.PrepareNewMonsterWave += CombatDirector_PrepareNewMonsterWave; }
private static void CombatDirectorOnPrepareNewMonsterWave(On.RoR2.CombatDirector.orig_PrepareNewMonsterWave orig, CombatDirector self, DirectorCard monsterCard) { //NOTE: We're completely rewriting this method, so we don't call back to the orig self.SetFieldValue("currentMonsterCard", monsterCard); ChosenAffix[self] = null; if (!((CharacterSpawnCard)monsterCard.spawnCard).noElites) { var eliteSelection = new WeightedSelection <EliteAffixCard>(); foreach (var card in Cards) { var weight = card.GetSpawnWeight(monsterCard); if (weight > 0 && card.isAvailable()) { var cost = monsterCard.cost * card.costMultiplier; if (cost <= self.monsterCredit) { eliteSelection.AddChoice(card, weight); } } } if (eliteSelection.Count > 0) { var rng = self.GetFieldValue <Xoroshiro128Plus>("rng"); var card = eliteSelection.Evaluate(rng.nextNormalizedFloat); ChosenAffix[self] = card; } } self.lastAttemptedMonsterCard = monsterCard; self.SetFieldValue("spawnCountInCurrentWave", 0); }
private static void MultiEliteHook(On.RoR2.CombatDirector.orig_Awake orig, CombatDirector self) { orig(self); self.onSpawnedServer.AddListener((OG) => doMultiElite(OG, self)); }
public override void OnLoad() { equipmentDef.name = "MysticsItems_SirenPole"; ConfigManager.Balance.CreateEquipmentCooldownOption(equipmentDef, "Equipment: Warning System", 90f); equipmentDef.canDrop = true; ConfigManager.Balance.CreateEquipmentEnigmaCompatibleOption(equipmentDef, "Equipment: Warning System", false); ConfigManager.Balance.CreateEquipmentCanBeRandomlyTriggeredOption(equipmentDef, "Equipment: Warning System", false); equipmentDef.pickupModelPrefab = PrepareModel(Main.AssetBundle.LoadAsset <GameObject>("Assets/Equipment/Siren Pole/Model.prefab")); equipmentDef.pickupIconSprite = Main.AssetBundle.LoadAsset <Sprite>("Assets/Equipment/Siren Pole/Icon.png"); foreach (var mat in equipmentDef.pickupModelPrefab.GetComponentInChildren <Renderer>().sharedMaterials) { HopooShaderToMaterial.Standard.Apply(mat); HopooShaderToMaterial.Standard.Gloss(mat); } itemDisplayPrefab = PrepareItemDisplayModel(Main.AssetBundle.LoadAsset <GameObject>("Assets/Equipment/Siren Pole/ItemDisplayModel.prefab")); onSetupIDRS += () => { AddDisplayRule("CommandoBody", "Chest", new Vector3(0.17606F, 0.10938F, -0.13135F), new Vector3(0.29792F, 101.7337F, 14.83983F), new Vector3(0.07862F, 0.07862F, 0.07862F)); AddDisplayRule("HuntressBody", "Head", new Vector3(0.09063F, 0.20626F, -0.04851F), new Vector3(305F, 0F, 0F), new Vector3(0.019F, 0.019F, 0.019F)); AddDisplayRule("HuntressBody", "Head", new Vector3(-0.09086F, 0.20552F, -0.04818F), new Vector3(305F, 0F, 0F), new Vector3(0.019F, 0.019F, 0.019F)); AddDisplayRule("Bandit2Body", "Chest", new Vector3(-0.14208F, 0.31664F, -0.2016F), new Vector3(41.46172F, 268.9803F, 180F), new Vector3(0.0478F, 0.0478F, 0.0478F)); AddDisplayRule("ToolbotBody", "Chest", new Vector3(-1.82578F, 2.33771F, -1.55785F), new Vector3(0F, 36.0168F, 0F), new Vector3(0.349F, 0.349F, 0.349F)); AddDisplayRule("EngiBody", "Chest", new Vector3(-0.08444F, 0.34718F, -0.26302F), new Vector3(10.10721F, 23.50117F, 4.36377F), new Vector3(0.047F, 0.047F, 0.047F)); AddDisplayRule("MageBody", "Chest", new Vector3(0.1608F, 0.06538F, -0.13697F), new Vector3(8.71729F, 3.87203F, 0.58771F), new Vector3(0.05396F, 0.05396F, 0.05396F)); AddDisplayRule("MercBody", "HandR", new Vector3(0.17621F, 0.22065F, 0F), new Vector3(0F, 0F, 101.9694F), new Vector3(0.08846F, 0.08846F, 0.08846F)); AddDisplayRule("TreebotBody", "PlatformBase", new Vector3(0.57548F, 1.38046F, -0.57101F), new Vector3(0F, 33.34396F, 0F), new Vector3(0.16617F, 0.16617F, 0.16617F)); AddDisplayRule("LoaderBody", "MechHandL", new Vector3(0.31421F, 0.28839F, 0.14368F), new Vector3(9.63979F, 331.6965F, 84.84715F), new Vector3(0.12826F, 0.12826F, 0.12703F)); AddDisplayRule("CrocoBody", "Head", new Vector3(-4.57107F, 4.06093F, 0.00616F), new Vector3(283.0015F, 97.09286F, 178.9819F), new Vector3(1.08323F, 1.08323F, 1.08323F)); AddDisplayRule("CaptainBody", "Chest", new Vector3(0.26173F, 0.18196F, 0.04468F), new Vector3(0F, 304.076F, 0F), new Vector3(0.09072F, 0.09072F, 0.09072F)); AddDisplayRule("ScavBody", "Backpack", new Vector3(0.93854F, 9.81353F, 0.67947F), new Vector3(23.62728F, 47.52236F, 14.61215F), new Vector3(1.66171F, 1.66171F, 1.66171F)); AddDisplayRule("EquipmentDroneBody", "GunBarrelBase", new Vector3(0.00002F, -0.72671F, 0.39234F), new Vector3(47.37738F, -0.00013F, 0.0009F), new Vector3(0.42601F, 0.42601F, 0.42601F)); if (SoftDependencies.SoftDependenciesCore.itemDisplaysSniper) { AddDisplayRule("SniperClassicBody", "AntennaL", new Vector3(-0.00958F, 0.16798F, 0.00024F), new Vector3(0F, 91.3699F, 0F), new Vector3(0.0678F, 0.0678F, 0.0678F)); } AddDisplayRule("RailgunnerBody", "Backpack", new Vector3(-0.19222F, -0.15375F, 0.0742F), new Vector3(0F, 90F, 0F), new Vector3(0.09801F, 0.09801F, 0.09801F)); AddDisplayRule("VoidSurvivorBody", "Head", new Vector3(0.47319F, 0.1069F, 0.00462F), new Vector3(-0.00001F, 180F, 259.7787F), new Vector3(0.08856F, 0.09671F, 0.08856F)); }; MysticsItemsSirenPoleController sirenPoleController = inWorldPrefab.AddComponent <MysticsItemsSirenPoleController>(); sirenPoleController.poleTransform = inWorldPrefab.transform.Find("PoleTransform"); HoldoutZoneController holdoutZoneController = inWorldPrefab.AddComponent <HoldoutZoneController>(); holdoutZoneController.baseRadius = baseRadius.Value; holdoutZoneController.baseChargeDuration = chargeTime.Value; holdoutZoneController.radiusSmoothTime = 0.3f; holdoutZoneController.radiusIndicator = inWorldPrefab.transform.Find("RadiusIndicator").gameObject.GetComponent <Renderer>(); holdoutZoneController.inBoundsObjectiveToken = "OBJECTIVE_MYSTICSITEMS_CHARGE_SIRENPOLE"; holdoutZoneController.outOfBoundsObjectiveToken = "OBJECTIVE_MYSTICSITEMS_CHARGE_SIRENPOLE"; holdoutZoneController.applyHealingNova = true; holdoutZoneController.applyFocusConvergence = true; holdoutZoneController.playerCountScaling = 0f; holdoutZoneController.dischargeRate = 0f; holdoutZoneController.enabled = false; sirenPoleController.holdoutZoneController = holdoutZoneController; On.RoR2.HoldoutZoneController.ChargeHoldoutZoneObjectiveTracker.ShouldBeFlashing += (orig, self) => { if (self.sourceDescriptor.master) { HoldoutZoneController holdoutZoneController2 = (HoldoutZoneController)self.sourceDescriptor.source; if (holdoutZoneController2 && holdoutZoneController.gameObject.GetComponent <MysticsItemsSirenPoleController>()) { return(false); } } return(orig(self)); }; CombatDirector phaseCombatDirector = inWorldPrefab.AddComponent <CombatDirector>(); phaseCombatDirector.customName = "WeakMonsters"; phaseCombatDirector.expRewardCoefficient = 0.1f; phaseCombatDirector.minSeriesSpawnInterval = 0.5f; phaseCombatDirector.maxSeriesSpawnInterval = 0.5f; phaseCombatDirector.minRerollSpawnInterval = 2f; phaseCombatDirector.maxRerollSpawnInterval = 4f; phaseCombatDirector.moneyWaveIntervals = new RangeFloat[] { }; phaseCombatDirector.teamIndex = TeamIndex.Monster; phaseCombatDirector.creditMultiplier = 1f; phaseCombatDirector.spawnDistanceMultiplier = 1f; phaseCombatDirector.shouldSpawnOneWave = true; phaseCombatDirector.targetPlayers = false; phaseCombatDirector.skipSpawnIfTooCheap = false; phaseCombatDirector.resetMonsterCardIfFailed = true; phaseCombatDirector.maximumNumberToSpawnBeforeSkipping = 5; phaseCombatDirector.eliteBias = 1f; phaseCombatDirector.ignoreTeamSizeLimit = true; phaseCombatDirector.fallBackToStageMonsterCards = false; phaseCombatDirector.monsterSpawnTimer = 0f; phaseCombatDirector.enabled = false; sirenPoleController.waveCombatDirector = phaseCombatDirector; TeleporterInteraction teleporterInteraction = inWorldPrefab.AddComponent <TeleporterInteraction>(); teleporterInteraction.enabled = false; ShakeEmitter shakeEmitter = inWorldPrefab.AddComponent <ShakeEmitter>(); shakeEmitter.duration = 0.2f; shakeEmitter.amplitudeTimeDecay = true; shakeEmitter.radius = 20f; shakeEmitter.shakeOnStart = true; shakeEmitter.shakeOnEnable = false; shakeEmitter.wave.frequency = 8f; shakeEmitter.wave.amplitude = 5f; shakeEmitter = inWorldPrefab.AddComponent <ShakeEmitter>(); shakeEmitter.duration = 0.2f; shakeEmitter.amplitudeTimeDecay = true; shakeEmitter.radius = 60f; shakeEmitter.shakeOnStart = false; shakeEmitter.shakeOnEnable = true; shakeEmitter.wave.frequency = 8f; shakeEmitter.wave.amplitude = 5f; sirenPoleController.waveShakeEmitter = shakeEmitter; inWorldPrefab.AddComponent <GenericDisplayNameProvider>().displayToken = "MYSTICSITEMS_SIRENPOLE_NAME"; inWorldPrefab.AddComponent <ProxyInteraction>(); inWorldPrefab.transform.Find("PoleTransform/InteractionCollider").gameObject.AddComponent <EntityLocator>().entity = inWorldPrefab; onTeleporterBeginChargingGlobalHook = new ILHook( typeof(MysticsItemsSirenPoleController).GetMethod("RunOnTeleporterBeginChargingGlobal"), il => { ILCursor c = new ILCursor(il); c.Emit(OpCodes.Ldsfld, typeof(TeleporterInteraction).GetField("onTeleporterBeginChargingGlobal", Main.bindingFlagAll)); c.Emit(OpCodes.Ldarg, 1); c.Emit(OpCodes.Callvirt, typeof(System.Action <TeleporterInteraction>).GetMethodCached("Invoke")); } ); onTeleporterChargedGlobalHook = new ILHook( typeof(MysticsItemsSirenPoleController).GetMethod("RunOnTeleporterChargedGlobal"), il => { ILCursor c = new ILCursor(il); c.Emit(OpCodes.Ldsfld, typeof(TeleporterInteraction).GetField("onTeleporterChargedGlobal", Main.bindingFlagAll)); c.Emit(OpCodes.Ldarg, 1); c.Emit(OpCodes.Callvirt, typeof(System.Action <TeleporterInteraction>).GetMethodCached("Invoke")); } ); On.RoR2.TeleporterInteraction.Awake += (orig, self) => { if (!self.GetComponent <MysticsItemsSirenPoleController>()) { orig(self); } }; On.RoR2.TeleporterInteraction.IdleToChargingState.OnEnter += (orig, self) => { MysticsItemsSirenPoleController.ForceEnd(); orig(self); }; On.RoR2.Language.GetLocalizedStringByToken += Language_GetLocalizedStringByToken; }
internal static void CombatDirector_SetNextSpawnAsBoss(On.RoR2.CombatDirector.orig_SetNextSpawnAsBoss orig, CombatDirector self) { orig(self); self.monsterCredit *= 100; var selected = DebugToolkit.nextBoss; //todo: fix this line. // selected.cost = (int)((self.monsterCredit / DebugToolkit.nextBossCount) / DebugToolkit.GetTierDef(DebugToolkit.nextBossElite).costMultiplier); self.OverrideCurrentMonsterCard(selected); self.SetFieldValue <CombatDirector.EliteTierDef>("currentActiveEliteTier", DebugToolkit.GetTierDef(DebugToolkit.nextBossElite)); self.SetFieldValue <EliteIndex>("currentActiveEliteIndex", DebugToolkit.nextBossElite); Log.Message($"{selected.spawnCard.name} cost has been set to {selected.cost} for {DebugToolkit.nextBossCount} {DebugToolkit.nextBossElite.ToString()} bosses with available credit: {self.monsterCredit}", Log.LogLevel.Info); DebugToolkit.nextBossCount = 1; DebugToolkit.nextBossElite = EliteIndex.None; On.RoR2.CombatDirector.SetNextSpawnAsBoss -= CombatDirector_SetNextSpawnAsBoss; }
public void Create(ShrineBaseType baseShrine, GameObject shrinePrefab, Color?symbolColor = null, Shader overrideShader = null, Color?materialColor = null) { var baseCard = Resources.Load <SpawnCard>(shrineDict[baseShrine]); var basePrefab = baseCard.prefab; var oldSymbol = basePrefab.transform.Find("Symbol"); var oldSymbolRenderer = oldSymbol.GetComponent <MeshRenderer>(); var oldSymbolMaterial = oldSymbolRenderer.material; if (shrinePrefab.GetComponent <ModelLocator>()) { modelTransform = shrinePrefab.GetComponent <ModelLocator>().modelTransform; foreach (MeshRenderer renderer in modelTransform.GetComponentsInChildren <MeshRenderer>()) { if (overrideShader != null) { renderer.material.shader = overrideShader; } else { renderer.material.shader = Shader.Find("Hopoo Games/Deferred/Standard"); } } foreach (MeshRenderer renderer in modelTransform.GetComponentsInChildren <MeshRenderer>()) { if (materialColor != null) { renderer.material.color = (Color)materialColor; } else { renderer.material.color = Color.white; } } } if (shrinePrefab.GetComponent <CombatDirector>()) { combatDirector = shrinePrefab.GetComponent <CombatDirector>(); } if (shrinePrefab.transform.Find("Symbol")) { symbolTransform = shrinePrefab.transform.Find("Symbol"); if (symbolTransform.GetComponent <MeshRenderer>()) { var symbolMesh = symbolTransform.gameObject.GetComponent <MeshRenderer>(); var texture = symbolMesh.material.mainTexture; symbolMesh.material = new Material(oldSymbolMaterial.shader); symbolMesh.material.CopyPropertiesFromMaterial(oldSymbolMaterial); symbolMesh.material.mainTexture = texture; if (symbolColor != null) { symbolMesh.material.SetColor("_TintColor", (Color)symbolColor); } } } this.shrinePrefab = shrinePrefab; }
private static void RunOnSpawn(CombatDirector self, CharacterMaster master) { ChosenAffix.TryGetValue(self, out var affix); affix?.onSpawned?.Invoke(master); }
public DummyEnemyStates SetDirector(CombatDirector _director) { combatDirector = _director; return(this); }
private static void CombatDirector_SetNextSpawnAsBoss(On.RoR2.CombatDirector.orig_SetNextSpawnAsBoss orig, CombatDirector self) { orig(self); if (RoR2Cheats.nextBossSet) { self.monsterCredit *= 100; var selected = RoR2Cheats.nextBoss; selected.cost = (int)((self.monsterCredit / RoR2Cheats.nextBossCount) / RoR2Cheats.GetTierDef(RoR2Cheats.nextBossElite).costMultiplier); self.OverrideCurrentMonsterCard(selected); self.SetFieldValue <CombatDirector.EliteTierDef>("currentActiveEliteTier", RoR2Cheats.GetTierDef(RoR2Cheats.nextBossElite)); self.SetFieldValue <EliteIndex>("currentActiveEliteIndex", RoR2Cheats.nextBossElite); Log.Message($"{selected.spawnCard.name} cost has been set to {selected.cost} for {RoR2Cheats.nextBossCount} {RoR2Cheats.nextBossElite.ToString()} bosses with available credit: {self.monsterCredit}"); RoR2Cheats.ResetNextBoss(); return; } }
internal static void CombatDirector_SetNextSpawnAsBoss(On.RoR2.CombatDirector.orig_SetNextSpawnAsBoss orig, CombatDirector self) { orig(self); var selected = CurrentRun.nextBoss; selected.spawnCard.directorCreditCost = (int)((self.monsterCredit / CurrentRun.nextBossCount) / Spawners.GetTierDef(CurrentRun.nextBossElite).costMultiplier); self.OverrideCurrentMonsterCard(selected); self.SetFieldValue<CombatDirector.EliteTierDef>("currentActiveEliteTier", Spawners.GetTierDef(CurrentRun.nextBossElite)); self.SetFieldValue<EliteIndex>("currentActiveEliteIndex", CurrentRun.nextBossElite); Log.Message($"{selected.spawnCard.name} cost has been set to {selected.cost} for {CurrentRun.nextBossCount} {CurrentRun.nextBossElite} bosses with available credit: {self.monsterCredit}",Log.LogLevel.Info); CurrentRun.nextBossCount = 1; CurrentRun.nextBossElite = EliteIndex.None; On.RoR2.CombatDirector.SetNextSpawnAsBoss -= CombatDirector_SetNextSpawnAsBoss; }