Пример #1
0
        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);
        }
Пример #2
0
 private void Awake()
 {
     demonHealth          = 180;
     beenHit              = false;
     combatDirectorScript = GameObject.Find("Combat Director").GetComponent <CombatDirector>();
     demonAudioSource     = GameObject.Find("DemonHTP").GetComponent <AudioSource>();
 }
Пример #3
0
        //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);
                    }
                }
            }
        }
Пример #4
0
    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();
        }
    }
Пример #5
0
    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();
        }
    }
Пример #6
0
 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);
     }
 }
Пример #7
0
        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);
        }
Пример #8
0
 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;
     }
 }
Пример #9
0
    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!");
            }
        }
Пример #11
0
        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);
        }
Пример #12
0
        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);
        }
Пример #13
0
        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;
        }
Пример #15
0
        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>();
 }
Пример #18
0
 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);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
Пример #20
0
 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;
        }
Пример #22
0
        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));
        }
Пример #24
0
        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;
        }
Пример #25
0
        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;
        }
Пример #26
0
            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;
            }
Пример #27
0
 private static void RunOnSpawn(CombatDirector self, CharacterMaster master)
 {
     ChosenAffix.TryGetValue(self, out var affix);
     affix?.onSpawned?.Invoke(master);
 }
Пример #28
0
 public DummyEnemyStates SetDirector(CombatDirector _director)
 {
     combatDirector = _director; return(this);
 }
Пример #29
0
        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;
            }
        }
Пример #30
0
 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;
 }