예제 #1
0
 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!");
     }
 }
예제 #2
0
        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;
        }
예제 #3
0
        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);
        }
예제 #4
0
 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)
     }
 }
예제 #5
0
    /// <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;
        }
예제 #7
0
    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;
    }
예제 #8
0
        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;
        }