public void SetHale(NetworkUser networkUser) { if (networkUser) { if (networkUsers.Contains(networkUser)) { currentHale = networkUser; bossMemory = new BossGroup.BossMemory() { cachedMaster = currentHale.master, cachedBody = currentHale.GetCurrentBody() }; combatSquad = new CombatSquad(); combatSquad.AddMember(currentHale.master); bossGroup = new BossGroup() { combatSquad = this.combatSquad, bestObservedName = currentHale.userName, bestObservedSubtitle = "The Boss", }; bossGroup.AddBossMemory(currentHale.master); bossGroup.combatSquad = combatSquad; } else { Debug.LogError("Couldn't find NetworkUser" + networkUser + "in list of available NetworkUsers"); } } else { Debug.LogError("NetworkUser " + networkUser + " does not exist!"); } }
protected void Awake() { run = GetComponent <Run>(); initialStartingScenes = run.startingSceneGroup; //run.startingSceneGroup = ScriptableObject.CreateInstance<SceneCollection>(); //run.startingSceneGroup.SetSceneEntries(new SceneCollection.SceneEntry[] { // new SceneCollection.SceneEntry { // sceneDef = SceneCatalog.GetSceneDefFromSceneName("limbo"), // weight = 1, // }, //}); allySquad = gameObject.AddComponent <CombatSquad>(); allySquad.onMemberLost += AllySquad_onMemberLost; allies = new List <CharacterMaster>(); On.RoR2.Run.PickNextStageScene += Run_ForceVIPScene; IL.RoR2.TeamComponent.SetupIndicator += TeamComponent_SetupIndicator; Stage.onStageStartGlobal += Stage_onStageStartGlobal; Run.onServerGameOver += Run_onServerGameOver; On.RoR2.Run.OnServerBossAdded += Run_OnServerBossAdded; On.RoR2.RunReport.Generate += RunReport_Generate; On.RoR2.BarrelInteraction.OnInteractionBegin += BarrelInteraction_OnInteractionBegin; }
private static void CreateEclipseDoppelganger(CharacterMaster master, Xoroshiro128Plus rng) { var card = DoppelgangerSpawnCard.FromMaster(master); if (card is null) { return; } if (card.prefab is null) { card.prefab = MasterCatalog.GetMasterPrefab(defaultMasterIndex); } Transform spawnOnTarget; DirectorCore.MonsterSpawnDistance input; if (TeleporterInteraction.instance) { spawnOnTarget = TeleporterInteraction.instance.transform; input = DirectorCore.MonsterSpawnDistance.Close; } else { spawnOnTarget = master.GetBody().coreTransform; input = DirectorCore.MonsterSpawnDistance.Far; } DirectorPlacementRule directorPlacementRule = new DirectorPlacementRule { spawnOnTarget = spawnOnTarget, placementMode = DirectorPlacementRule.PlacementMode.NearestNode }; DirectorCore.GetMonsterSpawnDistance(input, out directorPlacementRule.minDistance, out directorPlacementRule.maxDistance); DirectorSpawnRequest directorSpawnRequest = new DirectorSpawnRequest(card, directorPlacementRule, rng); directorSpawnRequest.teamIndexOverride = new TeamIndex?(TeamIndex.Monster); directorSpawnRequest.ignoreTeamMemberLimit = true; CombatSquad squad = null; DirectorSpawnRequest directorSpawnRequest2 = directorSpawnRequest; directorSpawnRequest2.onSpawnedServer = DelegateHelper.Combine(directorSpawnRequest2.onSpawnedServer, (res) => { if (squad is null) { squad = UnityEngine.Object.Instantiate <GameObject>(Resources.Load <GameObject>("Prefabs/NetworkedObjects/Encounters/ShadowCloneEncounter")).GetComponent <CombatSquad>(); } squad.AddMember(res.spawnedInstance.GetComponent <CharacterMaster>()); }); DirectorCore.instance.TrySpawnObject(directorSpawnRequest); if (squad is not null) { NetworkServer.Spawn(squad.gameObject); } UnityEngine.Object.Destroy(card); }
private void CombatSquad_AddMember(On.RoR2.CombatSquad.orig_AddMember orig, CombatSquad self, CharacterMaster memberMaster) { orig(self, memberMaster); if (IsUmbra(memberMaster) && self.gameObject.name.StartsWith("ShadowCloneEncounter")) { Transform playerSpawnTransform = Stage.instance.GetPlayerSpawnTransform(); var body = memberMaster.GetBody(); Vector3 vector = body.footPosition; Quaternion quaternion = Quaternion.identity; if (playerSpawnTransform) { vector = playerSpawnTransform.position; quaternion = playerSpawnTransform.rotation; } TeleportHelper.TeleportBody(body, vector); Run.instance.HandlePlayerFirstEntryAnimation(body, vector, quaternion); //if (memberMaster.bodyPrefab.GetComponent<CharacterBody>()?.preferredPodPrefab != null) } }
/// <summary> /// Instantiates the squad prefab into the internally-held squad to avoid damaging the asset file. /// </summary> public void Start() { if (SquadPrefab == null) { Debug.LogError("CombatSquadBehavior does not have a squad attached to it!"); return; } squad = (CombatSquad)Instantiate(SquadPrefab); // Iterate over and instantiate each of the squad's units. for (int _i = 0; _i < squad.Units.Count; _i++) { squad.Units[_i].Unit = (CombatUnit)Instantiate(squad.Units[_i].Unit); } unitCount = squad.Units.Count; updateSquadVisuals(); }
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; }
private void Start() { var map = new FixedMap(25); foreach (var node in map.Nodes) { var hexObject = Instantiate(HexPrefab, Parent); var position = HexHelper.ConvertToWorld(node.Offset.X, node.Offset.Y); hexObject.transform.position = new Vector3(position[0] * 20, position[1] * 20, 0); hexObject.Init(node); _nodeModels.Add(hexObject); hexObject.Clicked += HexObject_Clicked; if (UnityEngine.Random.Range(0, 100) > 70) { for (var i = 0; i < UnityEngine.Random.Range(3, 7); i++) { var wallObject = Instantiate(WallPrefab, hexObject.transform); wallObject.transform.localPosition = UnityEngine.Random.insideUnitCircle * 5; } } } var nameGenerator = new IdNameGenerator(); for (var i = 0; i < 6; i++) { var node = map.Nodes.Skip(i * 3 + 1).First(); var personList = new List <ICombatPerson>(); for (var j = 0; j < 5; j++) { var person = new CombatPerson(nameGenerator); personList.Add(person); } var squad = new CombatSquad(node, personList.ToArray(), i < 2 ? Player.Human : Player.Cpu); _combatService.SquadManager.Add(squad); var squadObject = Instantiate(CombatSquadPrefab, Parent); var personModelList = new List <CombatPersonModel>(); var formationSize = Mathf.Sqrt(squad.Persons.Length) + 1; var personX = 0; var personY = 0; foreach (var combatPerson in squad.Persons) { var combatPersonModel = Instantiate(CompatPersonPrefab, squadObject.transform); personModelList.Add(combatPersonModel); personX++; if (personX >= formationSize) { personX = 0; personY++; } combatPersonModel.transform.position = new Vector3(personX * 1.5f, personY * 1.5f); combatPersonModel.Clicked += CombatPersonModelOnClicked; combatPersonModel.HoverEnter += CombatPersonModelOnHoverEnter; combatPersonModel.HoverExit += CombatPersonModelOnHoverExit; combatPersonModel.Init(combatPerson); } squadObject.Init(squad, personModelList.ToArray()); _squadModels.Add(squadObject); } _combatEventBus.EventRegistered += CombatEventBusOnEventRegistered; }
public void Awake() { ReadConfig(); On.RoR2.Run.Start += (orig, self) => { orig(self); for (int i = 0; i < NextTitanSpawn.Length; i++) { NextTitanSpawn[i] = -1f; NextTitanKill[i] = -1f; } }; On.RoR2.Run.FixedUpdate += (orig, self) => { orig(self); string scenename = SceneManager.GetActiveScene().name; if (scenename == "moon" || scenename == "moon2") { for (int i = 0; i < NextTitanSpawn.Length; i++) { if (NextTitanSpawn[i] >= 0f) { if (NextTitanSpawn[i] <= Time.time) { if (i == 2) { CreateTitanGoldCombatSquad((TeamIndex)i, BossSeedCount); } else { CreateTitanGoldCombatSquad((TeamIndex)i, GetTeamSeedCount((TeamIndex)i)); } NextTitanSpawn[i] = -1f; } } if (NextTitanKill[i] >= 0f) { if (NextTitanKill[i] <= Time.time) { KillTitanSquad(TitanTeam[i]); NextTitanKill[i] = -1f; } } } } }; On.EntityStates.Missions.BrotherEncounter.Phase1.OnEnter += (orig, self) => { orig(self); if (Config_SpawnOnPhase.Value == 1) { NextTitanSpawn[1] = Time.time + 5.0f; } }; On.EntityStates.Missions.BrotherEncounter.Phase2.OnEnter += (orig, self) => { orig(self); if (Config_SpawnOnPhase.Value == 2) { NextTitanSpawn[1] = Time.time + 3.0f; } }; On.EntityStates.Missions.BrotherEncounter.Phase3.OnEnter += (orig, self) => { orig(self); if (Config_SpawnOnPhase.Value == 3) { NextTitanSpawn[1] = Time.time + 5.0f; } }; On.EntityStates.Missions.BrotherEncounter.Phase4.OnEnter += (orig, self) => { orig(self); if (Config_KillOnSteal.Value) { NextTitanKill[1] = Time.time + 7.5f; } if (Config_SpawnOnSteal.Value) { BossSeedCount = GetTeamSeedCount(TeamIndex.Player); NextTitanSpawn[2] = Time.time + 12.0f; } }; On.EntityStates.Missions.BrotherEncounter.EncounterFinished.OnEnter += (orig, self) => { orig(self); for (int i = 0; i < NextTitanSpawn.Length; i++) { NextTitanSpawn[i] = -1f; NextTitanKill[i] = Time.time + 2.5f; } }; On.RoR2.GoldTitanManager.OnBossGroupStartServer += (orig, bossGroup) => { bool IsMithrix = false; CombatSquad combatSquad = bossGroup.combatSquad; using (IEnumerator <CharacterMaster> enumerator = combatSquad.readOnlyMembersList.GetEnumerator()) { while (enumerator.MoveNext()) { if (enumerator.Current.masterIndex == MasterCatalog.FindMasterIndex("BrotherHurtMaster")) { IsMithrix = true; break; } } } if (IsMithrix) { } else { orig(bossGroup); } }; int GetTeamSeedCount(TeamIndex team) { int SeedCount = 0; SeedCount = Util.GetItemCountForTeam(team, RoR2Content.Items.TitanGoldDuringTP.itemIndex, true, true); return(SeedCount); }; void CreateTitanGoldCombatSquad(TeamIndex team, int SeedCount) { if (SeedCount > 0) { CombatSquad combatSquad; if (team == TeamIndex.Player) { combatSquad = UnityEngine.Object.Instantiate <GameObject>(Resources.Load <GameObject>("Prefabs/NetworkedObjects/Encounters/MonstersOnShrineUseEncounter")).GetComponent <CombatSquad>(); } else { combatSquad = UnityEngine.Object.Instantiate <GameObject>(Resources.Load <GameObject>("Prefabs/NetworkedObjects/Encounters/ShadowCloneEncounter")).GetComponent <CombatSquad>(); } int SpawnCount = 1; //This is just here really. //Like, swarms doesn't double aurelionite so this shouldn't be needed /*if (RunArtifactManager.instance.IsArtifactEnabled(ArtifactCatalog.FindArtifactDef("Swarms"))) * { * if (Config_Debug.Value) * { * print("Doubled Aurelionite for Swarms"); * } * }*/ for (int i = 0; i < SpawnCount; i++) { Vector3 offsetpos = GetRandomSpawnPos(); CharacterMaster component = new MasterSummon { masterPrefab = team == TeamIndex.Player ? TitanFriendly : TitanHostile, position = spawnposition + offsetpos, summonerBodyObject = null, ignoreTeamMemberLimit = true, teamIndexOverride = team, }.Perform(); AddTitanInventory(component, SeedCount); combatSquad.AddMember(component); } if (combatSquad) { NetworkServer.Spawn(combatSquad.gameObject); RegisterTitanSquad(combatSquad, team); } } } Vector3 GetRandomSpawnPos() { Vector3 angle = new Vector3(1f, 1f, 1f); //Rotate the angle by a random degree float rotation = UnityEngine.Random.Range(0.0f, 360.0f); float x = angle[0]; float y = angle[2]; angle[1] = 0f; angle[0] = x * (float)Math.Cos(rotation) - y * (float)Math.Sin(rotation); angle[2] = x * (float)Math.Sin(rotation) + y * (float)Math.Cos(rotation); //Then normalize the angles angle = Vector3.Normalize(angle); angle *= UnityEngine.Random.Range(20f, 40f); print(angle); return(angle); } void AddTitanInventory(CharacterMaster titan, int seeds) { float num = 1f; float num2 = 1f; num += Run.instance.difficultyCoefficient / 2f; num2 += Run.instance.difficultyCoefficient / 2f; num *= Mathf.Pow((float)seeds, 1f); num2 *= Mathf.Pow((float)seeds, 0.5f); if (titan.teamIndex != TeamIndex.Player) { num = Mathf.Pow(num2, 0.5f); num2 = Mathf.Pow(num2, 0.5f); } titan.inventory.GiveItem(RoR2Content.Items.BoostHp.itemIndex, Mathf.RoundToInt((num - 1f) * 10f)); titan.inventory.GiveItem(RoR2Content.Items.BoostDamage.itemIndex, Mathf.RoundToInt((num2 - 1f) * 10f)); if (Config_Debug.Value) { print("Aurelionite spawned with " + (10 + Mathf.RoundToInt((num - 1f) * 10f)) * 10.0f + "% health."); print("Aurelionite spawned with " + (10 + Mathf.RoundToInt((num2 - 1f) * 10f)) * 10.0f + "% damage."); } } void RegisterTitanSquad(CombatSquad combatSquad, TeamIndex team) { int slot = (int)team; if (slot >= 0 && slot <= TitanTeam.GetLength(0)) { KillTitanSquad(TitanTeam[slot]); TitanTeam[slot] = combatSquad; } } void KillTitanSquad(CombatSquad combatSquad) { CharacterMaster[] HitList = new CharacterMaster[0]; if (combatSquad) { using (IEnumerator <CharacterMaster> enumerator = combatSquad.readOnlyMembersList.GetEnumerator()) { while (enumerator.MoveNext()) { if (enumerator.Current) { if (enumerator.Current.GetBody()) { if (enumerator.Current.GetBody().healthComponent.alive) { Array.Resize <CharacterMaster>(ref HitList, HitList.Length + 1); HitList[HitList.Length - 1] = enumerator.Current; } } } } } } for (int i = 0; i < HitList.Length; i++) { if (HitList[i]) { HitList[i].TrueKill(); } } } }
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; }