Пример #1
0
        public void LoadEnemy()
        {
            if (enemyName.Contains("EngiTurret") || enemyName.Contains("BeetleGuardAlly") || enemyName.Contains("ShopkeeperMaster"))
            {
                return;
            }

            var gameobject = GameObject.Instantiate(MasterCatalog.FindMasterPrefab(enemyName + "Master"));
            var enemy      = gameobject.GetComponent <CharacterMaster>();
            var inventory  = enemy.inventory;

            NetworkServer.Spawn(gameobject);

            if (enemyName == "BeetleQueen")
            {
                enemyName = "BeetleQueen2";
            }

            enemy.SpawnBody(BodyCatalog.FindBodyPrefab(enemyName + "Body"), transform.position.GetVector3(), transform.rotation.GetQuaternion());

            enemy.teamIndex = (TeamIndex)teamIndex;
            for (int i = 0; i < (int)ItemIndex.Count - 1; i++)
            {
                inventory.GiveItem((ItemIndex)i, items[i]);
            }
            inventory.SetEquipmentIndex((EquipmentIndex)equipmentIndex);

            enemy.isBoss = isBoss;

            if (enemyName.Contains("TitanGold"))
            {
                var bossFight           = new GoldshoresBossfight();
                var bossGroupGameObject = Object.Instantiate(Resources.Load <GameObject>("Prefabs/NetworkedObjects/Bossgroup"));
                var bossGroup           = bossGroupGameObject.GetComponent <BossGroup>();

                NetworkServer.Spawn(bossGroupGameObject);

                bossGroup.bossDropChance = 1f;
                bossGroup.dropPosition   = GoldshoresMissionController.instance.bossSpawnPosition;

                bossGroup.combatSquad.AddMember(enemy);
                bossFight.SetFieldValue("bossGroup", bossGroup);
                bossFight.SetFieldValue("hasSpawnedBoss", true);
                bossFight.SetFieldValue("bossInstanceBody", enemy.GetBody());

                enemy.GetBody().AddBuff(BuffIndex.Immune);

                GoldshoresMissionController.instance.GetComponent <EntityStateMachine>().SetNextState(bossFight);
            }
            else if (isBoss)
            {
                BossGroup.instance.combatSquad.AddMember(enemy);
            }

            SavedGames.instance.StartCoroutine(WaitForStart(enemy));
        }
Пример #2
0
        public CharacterMaster SummonHeretic(GameObject summonerBodyObject, Vector3 spawnPosition)
        {
            if (!NetworkServer.active)
            {
                Debug.LogWarning("[Server] function 'SummonHeretic(UnityEngine.GameObject)' called on client");
                return(null);
            }
            MasterSummon masterSummon = new MasterSummon
            {
                masterPrefab          = MasterCatalog.FindMasterPrefab("HereticMonsterMaster"),
                position              = spawnPosition,
                rotation              = Quaternion.identity,
                summonerBodyObject    = summonerBodyObject,
                ignoreTeamMemberLimit = true,
                useAmbientLevel       = new bool?(true),
            };
            CharacterMaster characterMaster = masterSummon.Perform();

            if (characterMaster)
            {
                GameObject bodyObject = characterMaster.GetBodyObject();
                if (bodyObject)
                {
                    ModelLocator component = bodyObject.GetComponent <ModelLocator>();
                    if (component && component.modelTransform)
                    {
                        TemporaryOverlay temporaryOverlay = component.modelTransform.gameObject.AddComponent <TemporaryOverlay>();
                        temporaryOverlay.duration              = 0.5f;
                        temporaryOverlay.animateShaderAlpha    = true;
                        temporaryOverlay.alphaCurve            = AnimationCurve.EaseInOut(0f, 1f, 1f, 0f);
                        temporaryOverlay.destroyComponentOnEnd = true;
                        temporaryOverlay.originalMaterial      = Resources.Load <Material>("Materials/matSummonDrone");
                        temporaryOverlay.AddToCharacerModel(component.modelTransform.GetComponent <CharacterModel>());
                    }
                    var inventory = characterMaster.inventory;
                    if (inventory)
                    {
                        inventory.CopyItemsFrom(summonerBodyObject.GetComponent <CharacterBody>().inventory);
                    }
                }
            }
            if (characterMaster && characterMaster.bodyInstanceObject)
            {
                characterMaster.GetBody().AddTimedBuff(RoR2Content.Buffs.Immune, 3f);
                GameObject gameObject = Resources.Load <GameObject>("Prefabs/Effects/HippoRezEffect");
                if (gameObject)
                {
                    EffectManager.SpawnEffect(gameObject, new EffectData
                    {
                        origin   = spawnPosition,
                        rotation = characterMaster.bodyInstanceObject.transform.rotation
                    }, true);
                }
            }
            return(characterMaster);
        }
Пример #3
0
        private static void CCSpawnAI(ConCommandArgs args)
        {
            string prefabString    = ArgsHelper.GetValue(args.userArgs, 0);
            string eliteString     = ArgsHelper.GetValue(args.userArgs, 1);
            string teamString      = ArgsHelper.GetValue(args.userArgs, 2);
            string braindeadString = ArgsHelper.GetValue(args.userArgs, 3);

            var character = Character.GetCharacter(prefabString);

            if (character == null)
            {
                Debug.LogFormat("Could not spawn {0}, Try: spawn_ai GolemBody", character.body);
                return;
            }

            var prefab = MasterCatalog.FindMasterPrefab(character.master);
            var body   = BodyCatalog.FindBodyPrefab(character.body);


            var             bodyGameObject = Instantiate <GameObject>(prefab, args.sender.master.GetBody().transform.position, Quaternion.identity);
            CharacterMaster master         = bodyGameObject.GetComponent <CharacterMaster>();

            NetworkServer.Spawn(bodyGameObject);
            master.SpawnBody(body, args.sender.master.GetBody().transform.position, Quaternion.identity);

            EliteIndex eliteIndex = EliteIndex.None;

            if (Enum.TryParse <EliteIndex>(eliteString, true, out eliteIndex))
            {
                if ((int)eliteIndex > (int)EliteIndex.None && (int)eliteIndex < (int)EliteIndex.Count)
                {
                    master.inventory.SetEquipmentIndex(EliteCatalog.GetEliteDef(eliteIndex).eliteEquipmentIndex);
                }
            }

            TeamIndex teamIndex = TeamIndex.Neutral;

            if (Enum.TryParse <TeamIndex>(teamString, true, out teamIndex))
            {
                if ((int)teamIndex >= (int)TeamIndex.None && (int)teamIndex < (int)TeamIndex.Count)
                {
                    master.teamIndex = teamIndex;
                }
            }

            bool braindead;

            if (bool.TryParse(braindeadString, out braindead))
            {
                if (braindead)
                {
                    Destroy(master.GetComponent <BaseAI>());
                }
            }
            Debug.Log("Attempting to spawn " + character.body);
        }
Пример #4
0
            public void Start()
            {
                if (!itemStealController)
                {
                    itemStealController = returnStolenItems.itemStealController;
                }
                itemStealController.onStealFinishClient += ItemStealController_onStealFinishClient;

                masterPrefab = MasterCatalog.FindMasterPrefab("EquipmentDroneMaster");
            }
Пример #5
0
 private void UnlockingMage_onOpenedsss(Interactor obj)
 {
     CharacterMaster characterMaster = new MasterSummon
     {
         masterPrefab          = MasterCatalog.FindMasterPrefab("MageMonsterMaster"),
         position              = obj.gameObject.transform.position,
         rotation              = Quaternion.identity,
         summonerBodyObject    = null,
         ignoreTeamMemberLimit = false,
         teamIndexOverride     = new TeamIndex?(TeamIndex.Player)
     }.Perform();
 }
Пример #6
0
        public override void OnExit()
        {
            if (this.goodPlacement && base.characterBody.isPlayerControlled)
            {
                Util.PlaySound(CreatePounder.fireSoundString, base.gameObject);
                if (this.areaIndicatorInstance && NetworkServer.active)
                {
                    CharacterMaster characterMaster = new MasterSummon
                    {
                        masterPrefab          = MasterCatalog.FindMasterPrefab("MercMonsterMaster"),
                        position              = base.characterBody.transform.position,
                        rotation              = characterBody.transform.rotation,
                        summonerBodyObject    = base.gameObject,
                        ignoreTeamMemberLimit = true,
                        teamIndexOverride     = characterBody.teamComponent.teamIndex
                    }.Perform();

                    base.skillLocator.utility.DeductStock(1);

                    base.characterMotor.Motor.SetPosition(areaIndicatorInstance.transform.position);

                    EffectData effectData = new EffectData();
                    effectData.rotation = Util.QuaternionSafeLookRotation(areaIndicatorInstance.transform.position - base.characterMotor.transform.position);
                    effectData.origin   = base.characterMotor.transform.position;
                    EffectManager.SpawnEffect(EntityStates.Huntress.BlinkState.blinkPrefab, effectData, false);

                    EffectData effectData2 = new EffectData();
                    effectData.rotation = Util.QuaternionSafeLookRotation(areaIndicatorInstance.transform.position - base.characterMotor.transform.position);
                    effectData.origin   = areaIndicatorInstance.transform.position;
                    EffectManager.SpawnEffect(EntityStates.Huntress.BlinkState.blinkPrefab, effectData, false);


                    base.characterBody.AddTimedBuff(BuffIndex.Cloak, 5f);
                    base.characterBody.AddTimedBuff(BuffIndex.ElephantArmorBoost, 3f);
                    base.characterBody.AddTimedBuff(BuffIndex.Immune, 2f);

                    characterMaster.loadout.bodyLoadoutManager.SetSkillVariant(characterBody.bodyIndex, 0, (uint)Random.Range(0, characterBody.skillLocator.primary.skillFamily.variants.Length));
                    characterMaster.loadout.bodyLoadoutManager.SetSkillVariant(characterBody.bodyIndex, 1, (uint)Random.Range(0, characterBody.skillLocator.secondary.skillFamily.variants.Length));
                    characterMaster.loadout.bodyLoadoutManager.SetSkillVariant(characterBody.bodyIndex, 2, (uint)Random.Range(0, characterBody.skillLocator.utility.skillFamily.variants.Length));
                    characterMaster.loadout.bodyLoadoutManager.SetSkillVariant(characterBody.bodyIndex, 3, (uint)Random.Range(0, characterBody.skillLocator.special.skillFamily.variants.Length));
                    characterMaster.loadout.bodyLoadoutManager.SetSkinIndex(characterBody.bodyIndex, (uint)Random.Range(0, SkinCatalog.GetBodySkinCount(characterBody.bodyIndex)));
                    characterMaster.GetBody().baseDamage = 0f;

                    characterMaster.inventory.GiveItem(ItemIndex.HealthDecay, 10);
                    characterMaster.GetBody().inventory.SetEquipmentIndex(EquipmentIndex.AffixHaunted);
                }
            }

            EntityState.Destroy(this.areaIndicatorInstance.gameObject);
            base.characterBody.crosshairPrefab = this.cachedCrosshairPrefab;
            base.OnExit();
            this.outer.SetNextStateToMain();
        }
Пример #7
0
        ////// Hooks //////

        private void GlobalEventManager_OnHitEnemy(On.RoR2.GlobalEventManager.orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim)
        {
            orig(self, damageInfo, victim);
            if (NetworkServer.active && damageInfo != null && damageInfo.attacker)
            {
                var count      = GetCount(damageInfo.attacker.GetComponent <CharacterBody>());
                var victimBody = victim.GetComponent <CharacterBody>();
                if (count > 0 && damageInfo.attacker != victim && victimBody &&
                    !victimBody.gameObject.name.Contains("Brother") &&
                    !victimBody.gameObject.name.Contains("VoidRaidCrab") &&
                    !victimBody.gameObject.name.Contains("ScavLunar") &&
                    victimBody.master && victimBody.master.inventory && victimBody.master.inventory.GetItemCount(gupDebuff) < count)
                {
                    var sricd = damageInfo.attacker.GetComponent <ShrinkRayICDComponent>();
                    if (!sricd)
                    {
                        sricd = damageInfo.attacker.AddComponent <ShrinkRayICDComponent>();
                    }
                    if (Time.fixedTime - sricd.lastHit > icd)
                    {
                        sricd.lastHit = Time.fixedTime;

                        victimBody.master.inventory.GiveItem(gupDebuff);

                        EffectManager.SpawnEffect(EntityStates.Gup.BaseSplitDeath.deathEffectPrefab, new EffectData {
                            origin = victim.GetComponent <CharacterBody>().corePosition,
                            scale  = 10f
                        }, true);
                        var masterPrefab = MasterCatalog.GetMasterPrefab(victimBody.master.masterIndex);
                        currentSplitIsGupRay = true;
                        new BodySplitter {
                            body         = victimBody,
                            masterSummon =
                            {
                                masterPrefab = masterPrefab
                            },
                            count = splitCount,
                            splinterInitialVelocityLocal = new Vector3(0f, 20f, 10f),
                            minSpawnCircleRadius         = 3f,
                            moneyMultiplier = 1f / (float)splitCount
                        }.Perform();
                        currentSplitIsGupRay = false;
                        if (victimBody.master)
                        {
                            victimBody.master.TrueKill();
                        }
                        GameObject.Destroy(victimBody.gameObject);
                    }
                }
            }
        }
Пример #8
0
        public override void OnExit()
        {
            if (this.goodPlacement && base.characterBody.isPlayerControlled)
            {
                Util.PlaySound(CreatePounder.fireSoundString, base.gameObject);
                if (this.areaIndicatorInstance && NetworkServer.active)
                {
                    if (editedPounder == null)
                    {
                        editedPounder = CreatePounder.projectilePrefab;
                    }

                    bool crit = Util.CheckRoll(this.critStat, base.characterBody.master);

                    int cacheNumToSpawn = base.skillLocator.special.stock;

                    for (int i = 0; i < cacheNumToSpawn; i++)
                    {
                        CharacterMaster characterMaster = new MasterSummon
                        {
                            masterPrefab          = MasterCatalog.FindMasterPrefab("MercMonsterMaster"),
                            position              = areaIndicatorInstance.transform.position,
                            rotation              = characterBody.transform.rotation,
                            summonerBodyObject    = base.gameObject,
                            ignoreTeamMemberLimit = false,
                            teamIndexOverride     = characterBody.teamComponent.teamIndex
                        }.Perform();

                        base.skillLocator.special.DeductStock(1);

                        characterMaster.loadout.bodyLoadoutManager.SetSkillVariant(characterBody.bodyIndex, 0, (uint)Random.Range(0, characterBody.skillLocator.primary.skillFamily.variants.Length));
                        characterMaster.loadout.bodyLoadoutManager.SetSkillVariant(characterBody.bodyIndex, 1, (uint)Random.Range(0, characterBody.skillLocator.secondary.skillFamily.variants.Length));
                        characterMaster.loadout.bodyLoadoutManager.SetSkillVariant(characterBody.bodyIndex, 2, (uint)Random.Range(0, characterBody.skillLocator.utility.skillFamily.variants.Length));
                        characterMaster.loadout.bodyLoadoutManager.SetSkillVariant(characterBody.bodyIndex, 3, (uint)Random.Range(0, characterBody.skillLocator.special.skillFamily.variants.Length));
                        characterMaster.loadout.bodyLoadoutManager.SetSkinIndex(characterBody.bodyIndex, (uint)Random.Range(0, SkinCatalog.GetBodySkinCount(characterBody.bodyIndex)));
                        characterMaster.inventory.CopyItemsFrom(base.characterBody.inventory);

                        characterMaster.inventory.GiveItem(ItemIndex.HealthDecay, 15);
                    }
                }
            }

            EntityState.Destroy(this.areaIndicatorInstance.gameObject);
            base.characterBody.crosshairPrefab = this.cachedCrosshairPrefab;
            base.OnExit();
            this.outer.SetNextStateToMain();
        }
Пример #9
0
 private static void SetToRail()
 {
     BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent<SkillLocator>().primary.activationState.stateType = typeof(EntityStates.Toolbot.FireSpear);
     BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent<CharacterBody>().baseAttackSpeed = 0.5f;
     BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent<CharacterBody>().baseDamage = 13f;
     BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent<CharacterBody>().levelDamage = 2.12f;
     BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent<CharacterBody>().baseNameToken = "Portable Railgun";
     for (int i = 0; i < MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents<AISkillDriver>().Length; i++)
     {
         if (MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents<AISkillDriver>()[i].customName == "FireAtEnemy")
         {
             MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents<AISkillDriver>()[i].maxDistance = 1024;
             MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents<AISkillDriver>()[i].selectionRequiresTargetLoS = false;
             MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents<AISkillDriver>()[i].activationRequiresTargetLoS = true;
         }
     }
 }
Пример #10
0
        private static void CCSpawnAI(ConCommandArgs args)
        {
            if (args.Count == 0)
            {
                Log.Message(MagicVars.SPAWNAI_ARGS);
                return;
            }

            string character = Alias.Instance.GetMasterName(args[0]);

            if (character == null)
            {
                Log.Message(MagicVars.SPAWN_ERROR + character);
                return;
            }
            var masterprefab = MasterCatalog.FindMasterPrefab(character);
            var body         = masterprefab.GetComponent <CharacterMaster>().bodyPrefab;

            var             bodyGameObject = Instantiate <GameObject>(masterprefab, args.sender.master.GetBody().transform.position, Quaternion.identity);
            CharacterMaster master         = bodyGameObject.GetComponent <CharacterMaster>();

            NetworkServer.Spawn(bodyGameObject);
            master.SpawnBody(body, args.sender.master.GetBody().transform.position, Quaternion.identity);

            if (args.Count > 1)
            {
                var eliteIndex = Alias.GetEnumFromPartial <EliteIndex>(args[1]);
                master.inventory.SetEquipmentIndex(EliteCatalog.GetEliteDef(eliteIndex).eliteEquipmentIndex);
                master.inventory.GiveItem(ItemIndex.BoostHp, Mathf.RoundToInt((GetTierDef(eliteIndex).healthBoostCoefficient - 1) * 10));
                master.inventory.GiveItem(ItemIndex.BoostDamage, Mathf.RoundToInt((GetTierDef(eliteIndex).damageBoostCoefficient - 1) * 10));
            }

            if (args.Count > 2 && Enum.TryParse <TeamIndex>(Alias.GetEnumFromPartial <TeamIndex>(args[2]).ToString(), true, out TeamIndex teamIndex))
            {
                if ((int)teamIndex >= (int)TeamIndex.None && (int)teamIndex < (int)TeamIndex.Count)
                {
                    master.teamIndex = teamIndex;
                }
            }

            if (args.Count > 3 && bool.TryParse(args[3], out bool braindead) && braindead)
            {
                Destroy(master.GetComponent <BaseAI>());
            }
            Log.Message(MagicVars.SPAWN_ATTEMPT + character);
        }
Пример #11
0
 private void SetToMinigun()
 {
     BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent<SkillLocator>().primary.activationState.stateType = typeof(EntityStates.Commando.CommandoWeapon.Reload).Assembly.GetType("EntityStates.Drone.DroneWeapon.FireMegaTurret");
     BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent<CharacterBody>().baseAttackSpeed = MiniGun_speed;
     BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent<CharacterBody>().baseDamage = miniGun_damage;
     BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent<CharacterBody>().levelDamage = miniGun_leveldamage;
     BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent<CharacterBody>().baseNameToken = ".50 Cal Maxim";
     for (int i = 0; i < MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents<AISkillDriver>().Length; i++)
     {
         if (MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents<AISkillDriver>()[i].customName == "FireAtEnemy")
         {
             MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents<AISkillDriver>()[i].maxDistance = MiniGun_distance;
             MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents<AISkillDriver>()[i].selectionRequiresTargetLoS = false;
             MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents<AISkillDriver>()[i].activationRequiresTargetLoS = true;
         }
     }
 }
Пример #12
0
        public static void SpawnMasterWithBody(string masterPrefab, string bodyPrefab, Vector3 pos, TeamIndex team, Inventory inv = null)
        {
            GameObject      obj     = GameObject.Instantiate(MasterCatalog.FindMasterPrefab(masterPrefab), pos, Quaternion.identity);
            GameObject      bodyObj = BodyCatalog.FindBodyPrefab(bodyPrefab);
            CharacterMaster master  = obj.GetComponent <CharacterMaster>();

            master.teamIndex = team;

            if (inv != null)
            {
                master.inventory.CopyItemsFrom(inv);
            }

            NetworkServer.Spawn(obj);
            master.SpawnBody(bodyObj, pos, Quaternion.identity);
            spawns.Add(master);
        }
Пример #13
0
 public override void OnEnter()
 {
     base.OnEnter();
     this.duration = HEALINGPAIN.baseDuration / this.attackSpeedStat;
     if (isAuthority && NetworkServer.active)
     {
         CharacterMaster characterMaster;
         characterMaster = new MasterSummon
         {
             masterPrefab          = MasterCatalog.FindMasterPrefab("Drone2Master"),
             position              = base.characterBody.footPosition + base.transform.up,
             rotation              = base.transform.rotation,
             summonerBodyObject    = null,
             ignoreTeamMemberLimit = false,
             teamIndexOverride     = TeamIndex.Monster
         }.Perform();
     }
 }
 public void OnReceived()
 {
     if (_body && _body.master)
     {
         var dispMaster = new MasterSummon {
             masterPrefab          = MasterCatalog.GetMasterPrefab(_masterIndex),
             position              = _pos,
             rotation              = _rot,
             summonerBodyObject    = _body.gameObject,
             ignoreTeamMemberLimit = true,
             inventoryToCopy       = _body.inventory
         }.Perform();
         Deployable deployable = dispMaster.gameObject.AddComponent <Deployable>();
         deployable.onUndeploy = new UnityEvent();
         deployable.onUndeploy.AddListener(new UnityAction(dispMaster.TrueKill));
         _body.master.AddDeployable(deployable, EngiUtilitySpeedispenser.instance.deployableSlot);
     }
 }
Пример #15
0
        private void SetToDefault()
        {
            BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent<SkillLocator>().primary.activationState.stateType = typeof(EntityStates.Commando.CommandoWeapon.Reload).Assembly.GetType("EntityStates.EngiTurret.EngiTurretWeapon.FireGauss");
            BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent<CharacterBody>().baseAttackSpeed = defaultspeed;
            BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent<CharacterBody>().baseDamage = defaultdamage;
            BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent<CharacterBody>().levelDamage = defaultleveldamage;
            BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent<CharacterBody>().baseNameToken = "Weak Boi Default";

            for (int i = 0; i < MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents<AISkillDriver>().Length; i++)
            {
                if (MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents<AISkillDriver>()[i].customName == "FireAtEnemy")
                {
                    MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents<AISkillDriver>()[i].maxDistance = 60;
                    MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents<AISkillDriver>()[i].selectionRequiresTargetLoS = false;
                    MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents<AISkillDriver>()[i].activationRequiresTargetLoS = true;
                }
            }
        }
Пример #16
0
        public void LoadDeployable(CharacterMaster playerMaster)
        {
            switch (name)
            {
            case "BeetleGuardAllyBody": {
                var beetleMaster = GameObject.Instantiate(MasterCatalog.FindMasterPrefab("BeetleGuardAllyMaster")).GetComponent <CharacterMaster>();
                NetworkServer.Spawn(beetleMaster.gameObject);
                var beetleBody = beetleMaster.SpawnBody(BodyCatalog.FindBodyPrefab("BeetleGuardAllyBody"), transform.position.GetVector3(), transform.rotation.GetQuaternion());
                var inventory  = beetleMaster.inventory;

                inventory.GiveItem(ItemIndex.BoostDamage, 30);
                inventory.GiveItem(ItemIndex.BoostHp, 10);

                playerMaster.AddDeployable(beetleBody.GetComponent <Deployable>(), DeployableSlot.BeetleGuardAlly);

                beetleMaster.teamIndex = TeamIndex.Player;
                break;
            }

            case "EngiTurretMaster": {
                var turretMaster = GameObject.Instantiate(MasterCatalog.FindMasterPrefab("EngiTurretMaster")).GetComponent <CharacterMaster>();
                NetworkServer.Spawn(turretMaster.gameObject);
                var inventory = turretMaster.inventory;

                inventory.CopyItemsFrom(playerMaster.inventory);
                inventory.ResetItem(ItemIndex.WardOnLevel);
                inventory.ResetItem(ItemIndex.BeetleGland);
                inventory.ResetItem(ItemIndex.CrippleWardOnLevel);

                var deployable = turretMaster.gameObject.AddComponent <Deployable>();
                deployable.onUndeploy = new UnityEngine.Events.UnityEvent();
                deployable.onUndeploy.AddListener(new UnityEngine.Events.UnityAction(turretMaster.TrueKill));
                playerMaster.AddDeployable(deployable, DeployableSlot.EngiTurret);

                var turretBody = turretMaster.SpawnBody(BodyCatalog.FindBodyPrefab("EngiTurretBody"), transform.position.GetVector3(), transform.rotation.GetQuaternion());
                Debug.Log(transform.position.GetVector3());
                turretMaster.transform.position = transform.position.GetVector3();
                turretMaster.teamIndex          = TeamIndex.Player;
                SavedGames.instance.StartCoroutine(WaitForStart(turretBody));
                break;
            }
            }
        }
Пример #17
0
        static void HandleDropItem(NetworkMessage netMsg)
        {
            var dropItem = netMsg.ReadMessage <SummonClone>();
            var master   = dropItem.Player.GetComponent <CharacterBody>().master;


            CharacterBody component  = dropItem.Player.GetComponent <CharacterBody>();
            GameObject    gameObject = MasterCatalog.FindMasterPrefab("MercMonsterMaster");
            GameObject    bodyPrefab = BodyCatalog.FindBodyPrefab("MercBody");

            for (int i = 0; i < 2; i++)
            {
                if (master)
                {
                    GameObject      gameObject2 = Instantiate(gameObject, component.transform.position, component.transform.rotation);
                    CharacterMaster component2  = gameObject2.GetComponent <CharacterMaster>();
                    component2.gameObject.AddComponent <MasterSuicideOnTimer>().lifeTimer = 8f;

                    component2.teamIndex = TeamComponent.GetObjectTeam(component.gameObject);
                    AIOwnership component4 = gameObject2.GetComponent <AIOwnership>();
                    BaseAI      component5 = gameObject2.GetComponent <BaseAI>();
                    if (component4)
                    {
                        component4.ownerMaster = master;
                    }
                    if (component5)
                    {
                        component5.leader.gameObject = master.gameObject;
                    }

                    Inventory component6 = gameObject2.GetComponent <Inventory>();
                    component6.CopyItemsFrom(master.inventory);
                    component6.ResetItem(ItemIndex.BeetleGland);
                    component6.ResetItem(ItemIndex.WardOnLevel);
                    component6.ResetItem(ItemIndex.AutoCastEquipment);
                    component6.ResetItem(ItemIndex.ExtraLife);

                    NetworkServer.Spawn(gameObject2);
                    CharacterBody body = component2.SpawnBody(bodyPrefab, component.transform.position, component.transform.rotation);
                }
            }
        }
Пример #18
0
        private void UnlockingMage_onOpened(Interactor obj)
        {
            GameObject mageMasterPrefab = MasterCatalog.FindMasterPrefab("MageMonsterMaster");
            GameObject mageBodyPrefab   = mageMasterPrefab.GetComponent <CharacterMaster>().bodyPrefab;

            GameObject      mageMasterGameObject = UnityEngine.Object.Instantiate(mageMasterPrefab, gameObject.transform.position, Quaternion.identity);
            GameObject      mageBodyGameObject   = UnityEngine.Object.Instantiate(mageBodyPrefab, gameObject.transform.position, Quaternion.identity);
            CharacterMaster mageCharacterMaster  = mageBodyGameObject.GetComponent <CharacterMaster>();

            mageCharacterMaster.bodyPrefab = mageBodyGameObject;
            AIOwnership mageAIOwnership = mageBodyGameObject.GetComponent <AIOwnership>();

            CharacterMaster playerMaster = obj.gameObject.GetComponent <CharacterBody>().master;
            BaseAI          mageBaseAI   = gameObject.GetComponent <BaseAI>();

            if (mageCharacterMaster)
            {
                mageCharacterMaster.inventory.GiveItem(ItemIndex.BoostDamage, 10);
                mageCharacterMaster.inventory.GiveItem(ItemIndex.BoostHp, 10);
                GameObject bodyObject = playerMaster.GetBodyObject();
                if (bodyObject)
                {
                    Deployable component4 = mageBodyGameObject.GetComponent <Deployable>();
                    if (!component4)
                    {
                        component4 = mageBodyGameObject.AddComponent <Deployable>();
                    }
                    playerMaster.AddDeployable(component4, DeployableSlot.ParentAlly);
                }
            }
            if (mageAIOwnership)
            {
                mageAIOwnership.ownerMaster = obj.gameObject.GetComponent <CharacterBody>().master;
            }
            if (mageBaseAI)
            {
                mageBaseAI.leader.gameObject = base.gameObject;
            }

            NetworkServer.Spawn(mageBodyGameObject);
            mageCharacterMaster.SpawnBody(mageBodyGameObject, gameObject.transform.position, Quaternion.identity);
        }
Пример #19
0
        public override void OnEnter()
        {
            base.OnEnter();
            base.characterBody.isSprinting = true;
            this.dashVector = -base.characterDirection.forward;

            Util.PlaySound("HenryStinger", base.gameObject);
            base.PlayAnimation("Gesture, Override", "BufferEmpty");

            base.gameObject.layer = LayerIndex.fakeActor.intVal;
            base.characterMotor.Motor.RebuildCollidableLayers();

            if (NetworkServer.active)
            {
                //base.characterBody.AddBuff(BuffIndex.HiddenInvincibility);

                CharacterMaster newCloneMaster = new MasterSummon
                {
                    masterPrefab          = MasterCatalog.GetMasterPrefab(MasterCatalog.FindMasterIndex("MrGreenCloneMaster")),
                    position              = base.transform.position,
                    rotation              = base.modelLocator.modelBaseTransform.rotation,
                    summonerBodyObject    = base.gameObject,
                    ignoreTeamMemberLimit = true
                }.Perform();

                Inventory inventory = newCloneMaster.inventory;
                inventory.CopyItemsFrom(base.characterBody.master.inventory);

                /*inventory.ResetItem(ItemIndex.WardOnLevel);
                 * inventory.ResetItem(ItemIndex.BeetleGland);
                 * inventory.ResetItem(ItemIndex.CrippleWardOnLevel);
                 * inventory.ResetItem(ItemIndex.TPHealingNova);
                 * inventory.ResetItem(ItemIndex.FocusConvergence);
                 * inventory.ResetItem(ItemIndex.TitanGoldDuringTP);*/

                var delayedDamage = newCloneMaster.gameObject.AddComponent <Modules.Components.DelayedDamageOnSpawn>();
                delayedDamage.attacker = this.attacker;
                delayedDamage.damage   = this.storedDamage;
                delayedDamage.tracker  = this.tracker;
            }
        }
Пример #20
0
        private void buttonLogin_Click(object sender, EventArgs e)
        {
            try
            {
                this.Cursor = Cursors.WaitCursor;
                string emailAddress = textBoxEmail.Text;
                string password     = textBoxPassword.Text;

                var accountInfo = Account.Login(emailAddress, password);
                DisplayStatus("Log in successful.\r\nSelect sandbox...");

                SandboxSelector dialog = new SandboxSelector(accountInfo);
                if (dialog.ShowDialog(this) == DialogResult.OK)
                {
                    Scope selected = dialog.Sandbox;

                    Tenant tenant = Account.GetTenant(selected.Id);

                    Site          site          = tenant.Sites[0];
                    MasterCatalog masterCatalog = tenant.MasterCatalogs[0];

                    _apiContext = new ApiContext(tenant.Id, site.Id, masterCatalogId: masterCatalog.Id,
                                                 catalogId: site.CatalogId);

                    DisplayStatus(string.Format("Tenant: {0}\r\nName:{1}\r\nIsDevTenant:{2}\r\nSite:{3}\r\nMasterCatalog:{4}",
                                                tenant.Id,
                                                tenant.Name,
                                                tenant.IsDevTenant,
                                                tenant.Sites[0].Name,
                                                tenant.MasterCatalogs[0].Name
                                                ));
                }
            }
            catch (Exception ex)
            {
                DisplayStatus(ex);
            }

            // Reset the cursor
            this.Cursor = Cursors.Default;
        }
Пример #21
0
        //Loads minion after scene was populated
        //so that minion's AI won't throw exceptions because it can't navigate
        public void LoadMinion(CharacterMaster playerMaster)
        {
            SceneDirector.onPostPopulateSceneServer += SpawnMinion;

            void SpawnMinion(SceneDirector obj)
            {
                SceneDirector.onPostPopulateSceneServer -= SpawnMinion;

                var masterPrefab = MasterCatalog.GetMasterPrefab((MasterCatalog.MasterIndex)masterIndex);

                var             minionGameObject = Object.Instantiate(masterPrefab);
                CharacterMaster minionMaster     = minionGameObject.GetComponent <CharacterMaster>();

                minionMaster.teamIndex = TeamIndex.Player;

                //MinionOwnership
                var newOwnerMaster = playerMaster;

                if (newOwnerMaster.minionOwnership.ownerMaster != null)
                {
                    newOwnerMaster = newOwnerMaster.minionOwnership.ownerMaster;
                }
                minionMaster.minionOwnership.SetOwner(newOwnerMaster);

                //AIOwnership
                var aiOwnership = minionGameObject.GetComponent <AIOwnership>();

                aiOwnership.ownerMaster = playerMaster;

                BaseAI baseAI = minionGameObject.GetComponent <BaseAI>();

                baseAI.leader.gameObject = playerMaster.gameObject;

                NetworkServer.Spawn(minionGameObject);

                inventory.LoadInventory(minionMaster);
            }
        }
        public static bool Init()
        {
            On.RoR2.CharacterMaster.GetDeployableSameSlotLimit += (orig, self, slot) =>
            {
                if (slot == (DeployableSlot)7)
                {
                    return(self.inventory.GetItemCount(ItemIndex.EquipmentMagazine));
                }

                return(orig(self, slot));
            };

            On.RoR2.EquipmentSlot.PerformEquipmentAction += (orig, self, equipmentIndex) =>
            {
                CharacterBody characterBody   = self.characterBody;
                string        characterMaster = "";

                bool temp = orig(self, equipmentIndex);

                if (self.characterBody.inputBank.activateEquipment.justPressed)
                {
                    switch (equipmentIndex)
                    {
                    case EquipmentIndex.AffixWhite:
                    {
                        characterMaster = "BisonMaster";

                        temp = true;
                    }

                    break;

                    case EquipmentIndex.AffixGold:
                    {
                        characterMaster = "TitanGoldMaster";

                        temp = true;
                    }
                    break;

                    case EquipmentIndex.AffixHaunted:
                    {
                        characterMaster = "BellMaster";

                        temp = true;
                    }
                    break;

                    case EquipmentIndex.AffixPoison:
                    {
                        characterMaster = "ImpMaster";

                        temp = true;
                    }
                    break;

                    case EquipmentIndex.AffixRed:
                    {
                        characterMaster = "LemurianMaster";
                    }
                    break;

                    case EquipmentIndex.AffixBlue:
                    {
                        characterMaster = "WispMaster";
                    }
                    break;

                    case EquipmentIndex.AffixYellow:
                    {
                        characterMaster = "ElectricWormMaster";
                        temp            = true;
                    }
                    break;
                    }

                    if (characterMaster != "")
                    {
                        CharacterMaster newcharacterMaster = new MasterSummon
                        {
                            masterPrefab          = MasterCatalog.FindMasterPrefab(characterMaster),
                            position              = characterBody.footPosition + characterBody.transform.up,
                            rotation              = characterBody.transform.rotation,
                            summonerBodyObject    = null,
                            ignoreTeamMemberLimit = true,
                            teamIndexOverride     = characterBody.teamComponent.teamIndex
                        }.Perform();

                        newcharacterMaster.inventory.CopyItemsFrom(characterBody.inventory);
                        newcharacterMaster.inventory.ResetItem(ItemIndex.AutoCastEquipment);
                        newcharacterMaster.inventory.CopyEquipmentFrom(characterBody.inventory);
                        newcharacterMaster.GetBody().modelLocator.modelBaseTransform.localScale *= 0.25f;

                        Deployable deployable = newcharacterMaster.gameObject.GetComponent <Deployable>();
                        if (!deployable)
                        {
                            deployable = newcharacterMaster.gameObject.AddComponent <Deployable>();
                        }


                        int deployableCount = characterBody.master.GetDeployableCount((DeployableSlot)7);

                        self.characterBody.master.AddDeployable(deployable, (DeployableSlot)7);
                        deployable.onUndeploy = new UnityEngine.Events.UnityEvent();
                        deployable.onUndeploy.AddListener(() => newcharacterMaster.TrueKill());
                    }
                }
                return(temp);
            };

            return(true);
        }
Пример #23
0
        private bool PerformEquipmentActionInternal(EquipmentSlot slot)
        {
            var candidates = CharacterMaster.readOnlyInstancesList.Where(x => x.IsDeadAndOutOfLivesServer() && x.teamIndex == TeamIndex.Player);

            GameObject obj;
            GameObject podPrefab = LegacyResourcesAPI.Load <GameObject>("Prefabs/NetworkedObjects/RoboCratePod");

            var        nodeGraph = SceneInfo.instance.GetNodeGraph(MapNodeGroup.GraphType.Ground);
            var        nodeInd   = nodeGraph.FindClosestNodeWithFlagConditions(slot.transform.position, HullClassification.Human, NodeFlags.None, NodeFlags.None, false);
            Vector3    nodePos   = slot.transform.position;
            Quaternion nodeRot   = Quaternion.identity;

            if (nodeGraph.GetNodePosition(nodeInd, out nodePos))
            {
                var targPos = slot.transform.position;
                targPos.y = nodePos.y;
                nodeRot   = Util.QuaternionSafeLookRotation(nodePos - targPos);
            }

            if (candidates.Count() > 0)
            {
                var which   = rng.NextElementUniform(candidates.ToArray());
                var newBody = which.Respawn(nodePos, nodeRot);
                if (!newBody)
                {
                    return(false);
                }
                obj = newBody.gameObject;
                string rezTargetName = Language.GetString(newBody.baseNameToken);
                var    newBodyUser   = Util.LookUpBodyNetworkUser(newBody);
                if (newBodyUser)
                {
                    rezTargetName = newBodyUser.userName;
                }
                var rezzerName = slot.characterBody ? Language.GetString(slot.characterBody.baseNameToken) : "Someone";
                var rezzerUser = Util.LookUpBodyNetworkUser(slot.characterBody);
                if (rezzerUser)
                {
                    rezzerName = rezzerUser.userName;
                }
                NetUtil.ServerSendGlobalChatMsg($"{rezzerName} called down a clone of {rezTargetName}!");
            }
            else
            {
                var whichName  = rng.NextElementUniform(droneMasterPrefabNames.ToArray());
                var whichIndex = MasterCatalog.FindMasterIndex(whichName);
                var which      = MasterCatalog.GetMasterPrefab(whichIndex);
                if (!which)
                {
                    return(false);
                }
                var summon = new MasterSummon {
                    masterPrefab          = which,
                    position              = nodePos,
                    rotation              = nodeRot,
                    summonerBodyObject    = slot.characterBody ? slot.characterBody.gameObject : null,
                    ignoreTeamMemberLimit = true,
                    useAmbientLevel       = new bool?(true)
                }.Perform();
                if (!summon)
                {
                    return(false);
                }
                obj = summon.GetBodyObject();
                if (!obj)
                {
                    return(false);
                }
                if (obj.name == "EquipmentDroneBody(Clone)")
                {
                    var droneInv = obj.GetComponent <Inventory>();
                    if (droneInv)
                    {
                        var randomEqp = rng.NextElementUniform(RoR2.Artifacts.EnigmaArtifactManager.validEquipment);
                        droneInv.SetEquipment(new EquipmentState(randomEqp, Run.FixedTimeStamp.negativeInfinity, 1), 0);
                    }
                }
                else if (which == ItemDrone.instance.itemDroneMasterPrefab)
                {
                    var wardPersist = summon.GetComponent <ItemDroneWardPersist>();

                    var drops = LegacyResourcesAPI.Load <BasicPickupDropTable>("DropTables/dtSmallChest");
                    var drop  = drops.GenerateDrop(rng);
                    var pdef  = PickupCatalog.GetPickupDef(drop);
                    if (wardPersist && pdef != null && pdef.itemIndex != ItemIndex.None)
                    {
                        int remCount = 1;
                        if (pdef.itemTier == ItemTier.Tier2 || pdef.itemTier == ItemTier.VoidTier2)
                        {
                            remCount = 3;
                        }
                        if (pdef.itemTier == ItemTier.Tier1 || pdef.itemTier == ItemTier.VoidTier1)
                        {
                            remCount = 5;
                        }
                        wardPersist.index = pdef.itemIndex;
                        wardPersist.count = remCount;
                    }
                }
            }

            if (!obj)
            {
                return(false);
            }
            var objBody = obj.GetComponent <CharacterBody>();

            var podObj  = GameObject.Instantiate(podPrefab, nodePos, nodeRot);
            var podSeat = podObj.GetComponent <VehicleSeat>();

            if (podSeat)
            {
                podSeat.AssignPassenger(obj);
            }
            else
            {
                TinkersSatchelPlugin._logger.LogError($"Pod {podObj} spawned for revived prefab {obj} has no seat!");
            }
            NetworkServer.Spawn(podObj);
            objBody.SetBodyStateToPreferredInitialState();

            slot.inventory.SetEquipment(new EquipmentState(EquipmentIndex.None, Run.FixedTimeStamp.now + cooldown, 0), (uint)slot.inventory.activeEquipmentSlot);
            return(true);
        }
Пример #24
0
        private static void CCSpawnAI(ConCommandArgs args)
        {
            GameObject prefab;
            GameObject body;
            GameObject gameObject = null;

            string prefabString    = ArgsHelper.GetValue(args.userArgs, 0);
            string eliteString     = ArgsHelper.GetValue(args.userArgs, 1);
            string teamString      = ArgsHelper.GetValue(args.userArgs, 2);
            string braindeadString = ArgsHelper.GetValue(args.userArgs, 3);

            string bodyString   = GetBodyMasterLink(prefabString, 0); //prefabString.Replace("Master", "");
            string masterString = GetBodyMasterLink(prefabString, 1); //prefabString.Replace("Body", "");

            prefab = MasterCatalog.FindMasterPrefab(masterString);
            body   = BodyCatalog.FindBodyPrefab(bodyString);
            if (prefab == null)
            {
                List <string> array = new List <string>();
                foreach (var item in MasterCatalog.allMasters)
                {
                    array.Add(item.name);
                }
                string list = string.Join("\n", array);
                Debug.LogFormat("Could not spawn {0}, Try: spawn_ai GolemBody   --- \n{1}", prefabString, list);
                return;
            }

            gameObject = Instantiate <GameObject>(prefab, args.sender.master.GetBody().transform.position, Quaternion.identity);
            CharacterMaster master = gameObject.GetComponent <CharacterMaster>();

            NetworkServer.Spawn(gameObject);
            master.SpawnBody(body, args.sender.master.GetBody().transform.position, Quaternion.identity);

            EliteIndex eliteIndex = EliteIndex.None;

            if (Enum.TryParse <EliteIndex>(eliteString, true, out eliteIndex))
            {
                if ((int)eliteIndex > (int)EliteIndex.None && (int)eliteIndex < (int)EliteIndex.Count)
                {
                    master.inventory.SetEquipmentIndex(EliteCatalog.GetEliteDef(eliteIndex).eliteEquipmentIndex);
                }
            }

            TeamIndex teamIndex = TeamIndex.Neutral;

            if (Enum.TryParse <TeamIndex>(teamString, true, out teamIndex))
            {
                if ((int)teamIndex >= (int)TeamIndex.None && (int)teamIndex < (int)TeamIndex.Count)
                {
                    master.teamIndex = teamIndex;
                }
            }

            bool braindead;

            if (bool.TryParse(braindeadString, out braindead))
            {
                if (braindead)
                {
                    Destroy(master.GetComponent <BaseAI>());
                }
            }
            Debug.Log("Attempting to spawn " + prefabString);
        }
            // Token: 0x06002C6E RID: 11374 RVA: 0x0002168E File Offset: 0x0001F88E
            public override void OnExit()
            {
                if (base.isAuthority)
                {
                    base.characterBody.SendConstructTurret(base.characterBody, base.characterBody.corePosition + (3f * Vector3.up), base.characterBody.gameObject.transform.rotation, MasterCatalog.FindMasterIndex("RoboBallMiniMaster"));
                }

                base.OnExit();
            }
Пример #26
0
 // Token: 0x06003136 RID: 12598 RVA: 0x000D3F50 File Offset: 0x000D2150
 public override void FixedUpdate()
 {
     base.FixedUpdate();
     if (base.isAuthority)
     {
         this.entryCountdown -= Time.fixedDeltaTime;
         if (this.exitPending)
         {
             this.exitCountdown -= Time.fixedDeltaTime;
             if (this.exitCountdown <= 0f)
             {
                 this.outer.SetNextStateToMain();
                 return;
             }
         }
         else if (base.inputBank && this.entryCountdown <= 0f)
         {
             if ((base.inputBank.skill1.down || base.inputBank.skill4.justPressed) && this.currentPlacementInfo.ok)
             {
                 if (base.characterBody)
                 {
                     base.characterBody.SendConstructTurret(base.characterBody, this.currentPlacementInfo.position, this.currentPlacementInfo.rotation, MasterCatalog.FindMasterIndex(this.turretMasterPrefab));
                     if (base.skillLocator)
                     {
                         GenericSkill skill = base.skillLocator.GetSkill(SkillSlot.Special);
                         if (skill)
                         {
                             skill.DeductStock(1);
                         }
                     }
                 }
                 Util.PlaySound(this.placeSoundString, base.gameObject);
                 this.DestroyBlueprints();
                 this.exitPending = true;
             }
             if (base.inputBank.skill2.justPressed)
             {
                 this.DestroyBlueprints();
                 this.exitPending = true;
             }
         }
     }
 }
Пример #27
0
        public override void OnEnter()
        {
            base.OnEnter();

            base.characterBody.SendConstructTurret(base.characterBody, base.characterBody.corePosition + Vector3.up, Quaternion.identity, MasterCatalog.FindMasterIndex("RoboBallMiniMaster"));

            base.OnExit();
        }
Пример #28
0
        public override void OnEnter()
        {
            base.OnEnter();
            Ray aimRay = base.GetAimRay();

            this.duration = this.baseDuration / this.attackSpeedStat;
            if (this.effectPrefab)
            {
                EffectManager.SimpleMuzzleFlash(this.effectPrefab, base.gameObject, muzzleLeft, false);
                EffectManager.SimpleMuzzleFlash(this.effectPrefab, base.gameObject, muzzleRight, false);
            }
            base.PlayAnimation("Gesture", "FireCannons", "FireCannons.playbackRate", this.duration);
            if (base.isAuthority && base.modelLocator && base.modelLocator.modelTransform)
            {
                if (base.modelLocator.modelTransform.GetComponent <ChildLocator>())
                {
                    ChildLocator childLocator = base.modelLocator.modelTransform.GetComponent <ChildLocator>();
                    //literally compiler names but who will look at this code anyways?
                    int       muzzleLeftShildIndex  = childLocator.FindChildIndex(muzzleLeft);
                    int       muzzleRightChildIndex = childLocator.FindChildIndex(muzzleRight);
                    Transform muzzleLeftTransform   = childLocator.FindChild(muzzleLeftShildIndex);
                    Transform muzzleRightTransform  = childLocator.FindChild(muzzleRightChildIndex);
                    if (muzzleLeftTransform)
                    {
                        CharacterMaster characterMaster;
                        characterMaster = new MasterSummon
                        {
                            masterPrefab          = MasterCatalog.FindMasterPrefab("WispMaster"),
                            position              = muzzleLeftTransform.position,
                            rotation              = muzzleLeftTransform.rotation,
                            summonerBodyObject    = null,
                            ignoreTeamMemberLimit = true,
                            teamIndexOverride     = TeamIndex.Monster
                        }.Perform();


                        AIOwnership component4 = characterMaster.gameObject.GetComponent <AIOwnership>();
                        BaseAI      component5 = characterMaster.gameObject.GetComponent <BaseAI>();

                        if (component4 && characterBody.master)
                        {
                            component4.ownerMaster = base.characterBody.master;
                        }
                        if (component5 && characterBody.master.gameObject)
                        {
                            component5.leader.gameObject = base.characterBody.master.gameObject;
                            component5.isHealer          = false;
                            component5.fullVision        = true;
                        }
                    }
                    if (muzzleRightTransform)
                    {
                        CharacterMaster characterMaster;
                        characterMaster = new MasterSummon
                        {
                            masterPrefab          = MasterCatalog.FindMasterPrefab("WispMaster"),
                            position              = muzzleRightTransform.position,
                            rotation              = muzzleRightTransform.rotation,
                            summonerBodyObject    = null,
                            ignoreTeamMemberLimit = true,
                            teamIndexOverride     = TeamIndex.Monster
                        }.Perform();


                        AIOwnership component4 = characterMaster.gameObject.GetComponent <AIOwnership>();
                        BaseAI      component5 = characterMaster.gameObject.GetComponent <BaseAI>();

                        if (component4 && characterBody.master)
                        {
                            component4.ownerMaster = base.characterBody.master;
                        }
                        if (component5 && characterBody.master.gameObject)
                        {
                            component5.leader.gameObject = base.characterBody.master.gameObject;
                            component5.isHealer          = false;
                            component5.fullVision        = true;
                        }
                    }
                }
            }
        }
Пример #29
0
 internal static GameObject[] BuildMasterCatalog()
 {
     MasterCatalog.AddRange(Resources.LoadAll <GameObject>("Prefabs/CharacterMasters/"));
     return(MasterCatalog.ToArray());
 }
Пример #30
0
        public void Awake()//Code that runs when the game starts
        {
            var addRule     = typeof(RuleCatalog).GetMethod("AddRule", BindingFlags.Static | BindingFlags.NonPublic, null, new Type[] { typeof(RuleDef) }, null);
            var addCategory = typeof(RuleCatalog).GetMethod("AddCategory", BindingFlags.Static | BindingFlags.NonPublic, null, new Type[] { typeof(string), typeof(Color), typeof(string), typeof(Func <bool>) }, null);

            Color mycolor = new Color(0.3f, 0f, 0.5f);

            //Creates a header for the mod itself
            addCategory.Invoke(null, new object[] { "Ryan's Turrets", mycolor, "A Fun mod for custom turrets", new Func <bool>(() => false) });
            //Create a header for the category, such as 'Huntress edits'
            addCategory.Invoke(null, new object[] { "Turret Type Config", mycolor, "", new Func <bool>(() => false) });
            //Creates a rule and an accessible variable
            RuleDef ruleDef3 = new RuleDef("RyanTurrets.TurretMode", "TurretModes");

            //Adds Choice name, variable and "hidden", (set this to false if you want it to show up), then adds the string to appear on hover.
            ruleDef3.AddChoice("1", 1, false).tooltipBodyToken = "Makes all turrets default";
            ruleDef3.AddChoice("2", 2, false).tooltipBodyToken = "Makes all turrets shoot rebar";
            ruleDef3.AddChoice("3", 3, false).tooltipBodyToken = "Makes all turrets machine guns";
            ruleDef3.AddChoice("4", 4, false).tooltipBodyToken = "Switches between Rebar and Machine gun turrets";
            ruleDef3.MakeNewestChoiceDefault();
            //Adds the choices to the catalog
            addRule.Invoke(null, new object[] { ruleDef3 });

            //This has to run once after all the custom rules are entered, in order to reset the game into knowing what rules exist.
            List <RuleDef>       allRuleDefs    = (List <RuleDef>)Harmony.AccessTools.Field(Harmony.AccessTools.TypeByName("RuleCatalog"), "allRuleDefs").GetValue(null);
            List <RuleChoiceDef> allChoicesDefs = (List <RuleChoiceDef>)Harmony.AccessTools.Field(Harmony.AccessTools.TypeByName("RuleCatalog"), "allChoicesDefs").GetValue(null);

            for (int k = 0; k < allRuleDefs.Count; k++)
            {
                RuleDef ruleDef4 = allRuleDefs[k];
                ruleDef4.globalIndex = k;

                for (int j = 0; j < ruleDef4.choices.Count; j++)
                {
                    RuleChoiceDef ruleChoiceDef6 = ruleDef4.choices[j];
                    ruleChoiceDef6.localIndex             = j;
                    ruleChoiceDef6.globalIndex            = allChoicesDefs.Count;
                    ruleChoiceDef6.availableInMultiPlayer = true;
                    ruleChoiceDef6.excludeByDefault       = false;
                    allChoicesDefs.Add(ruleChoiceDef6);
                }
            }
            Harmony.AccessTools.Field(Harmony.AccessTools.TypeByName("RuleCatalog"), "allRuleDefs").SetValue(null, allRuleDefs);
            Harmony.AccessTools.Field(Harmony.AccessTools.TypeByName("RuleCatalog"), "allChoicesDefs").SetValue(null, allChoicesDefs);
            RuleCatalog.availability.MakeAvailable();
            bool didReflect = false;

            currentRule = (int)Run.instance.ruleBook.GetRuleChoice(RuleCatalog.FindRuleDef("RyanTurrets.TurretMode")).extraData;

            On.EntityStates.Drone.DroneWeapon.FireMegaTurret.OnEnter += (orig, self) =>
            {
                if (!didReflect)
                {
                    Harmony.AccessTools.Field(Harmony.AccessTools.TypeByName("EntityStates.Drone.DroneWeapon.FireMegaTurret"), "force").SetValue(self, 0.1f);
                    didReflect = true;
                }
                orig(self);
            };
            bool  gotDefault         = false;
            float defaultspeed       = 0f;
            float defaultleveldamage = 0f;
            float defaultdamage      = 0f;

            On.RoR2.CharacterBody.HandleConstructTurret += (orig, netMsg) =>
            {
                if (!gotDefault)
                {
                    defaultspeed       = BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent <CharacterBody>().baseAttackSpeed;
                    defaultdamage      = BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent <CharacterBody>().baseDamage;
                    defaultleveldamage = BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent <CharacterBody>().levelDamage;
                    gotDefault         = true;
                }

                if (currentRule == 1)
                {
                    BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent <SkillLocator>().primary.activationState.stateType = typeof(EntityStates.Commando.CommandoWeapon.Reload).Assembly.GetType("EntityStates.EngiTurret.EngiTurretWeapon.FireGauss");
                    BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent <CharacterBody>().baseAttackSpeed = defaultspeed;
                    BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent <CharacterBody>().baseDamage      = defaultdamage;
                    BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent <CharacterBody>().levelDamage     = defaultleveldamage;
                    BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent <CharacterBody>().baseNameToken   = "Weak Boi Default";

                    for (int i = 0; i < MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents <AISkillDriver>().Length; i++)
                    {
                        if (MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents <AISkillDriver>()[i].customName == "FireAtEnemy")
                        {
                            MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents <AISkillDriver>()[i].maxDistance = 60;
                            MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents <AISkillDriver>()[i].selectionRequiresTargetLoS  = false;
                            MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents <AISkillDriver>()[i].activationRequiresTargetLoS = true;
                        }
                    }
                }
                else if (currentRule == 2)
                {
                    BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent <SkillLocator>().primary.activationState.stateType = typeof(EntityStates.Toolbot.FireSpear);

                    BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent <CharacterBody>().baseAttackSpeed = 0.5f;

                    BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent <CharacterBody>().baseDamage = 13f;

                    BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent <CharacterBody>().levelDamage   = 2.12f;
                    BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent <CharacterBody>().baseNameToken = "Portable Railgun";
                    for (int i = 0; i < MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents <AISkillDriver>().Length; i++)
                    {
                        if (MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents <AISkillDriver>()[i].customName == "FireAtEnemy")
                        {
                            MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents <AISkillDriver>()[i].maxDistance = 1024;
                            MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents <AISkillDriver>()[i].selectionRequiresTargetLoS  = false;
                            MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents <AISkillDriver>()[i].activationRequiresTargetLoS = false;
                        }
                    }
                }
                else if (currentRule == 3)
                {
                    BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent <SkillLocator>().primary.activationState.stateType = typeof(EntityStates.Commando.CommandoWeapon.Reload).Assembly.GetType("EntityStates.Drone.DroneWeapon.FireMegaTurret");
                    BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent <CharacterBody>().baseAttackSpeed = 1f;
                    BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent <CharacterBody>().baseDamage      = 2f;
                    BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent <CharacterBody>().levelDamage     = 0.4f;
                    BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent <CharacterBody>().baseNameToken   = ".50 Cal Maxim";
                    for (int i = 0; i < MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents <AISkillDriver>().Length; i++)
                    {
                        if (MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents <AISkillDriver>()[i].customName == "FireAtEnemy")
                        {
                            MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents <AISkillDriver>()[i].maxDistance = 100;
                            MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents <AISkillDriver>()[i].selectionRequiresTargetLoS  = false;
                            MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents <AISkillDriver>()[i].activationRequiresTargetLoS = false;
                        }
                    }
                }
                else
                {
                    if (lastWasRebar == false)
                    {
                        Chat.SendBroadcastChat(new Chat.SimpleChatMessage
                        {
                            baseToken = "Next Turret will be: [Machine Gun]"
                        });
                        BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent <SkillLocator>().primary.activationState.stateType = typeof(EntityStates.Toolbot.FireSpear);
                        BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent <CharacterBody>().baseAttackSpeed = 0.5f;
                        BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent <CharacterBody>().baseDamage      = 13f;
                        BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent <CharacterBody>().levelDamage     = 2.12f;
                        BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent <CharacterBody>().baseNameToken   = "Portable Railgun";
                        for (int i = 0; i < MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents <AISkillDriver>().Length; i++)
                        {
                            if (MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents <AISkillDriver>()[i].customName == "FireAtEnemy")
                            {
                                MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents <AISkillDriver>()[i].maxDistance = 1024;
                                MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents <AISkillDriver>()[i].selectionRequiresTargetLoS  = false;
                                MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents <AISkillDriver>()[i].activationRequiresTargetLoS = false;
                            }
                        }
                        lastWasRebar = true;
                    }
                    else
                    {
                        Chat.SendBroadcastChat(new Chat.SimpleChatMessage
                        {
                            baseToken = "Next Turret will be: [Railgun]"
                        });

                        BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent <SkillLocator>().primary.activationState.stateType = typeof(EntityStates.Commando.CommandoWeapon.Reload).Assembly.GetType("EntityStates.Drone.DroneWeapon.FireMegaTurret");
                        BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent <CharacterBody>().baseAttackSpeed = 1f;
                        BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent <CharacterBody>().baseDamage      = 2f;
                        BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent <CharacterBody>().levelDamage     = 0.4f;
                        BodyCatalog.FindBodyPrefab("EngiTurretBody").GetComponent <CharacterBody>().baseNameToken   = ".50 Cal Maxim";
                        for (int i = 0; i < MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents <AISkillDriver>().Length; i++)
                        {
                            if (MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents <AISkillDriver>()[i].customName == "FireAtEnemy")
                            {
                                MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents <AISkillDriver>()[i].maxDistance = 100;
                                MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents <AISkillDriver>()[i].selectionRequiresTargetLoS  = false;
                                MasterCatalog.FindMasterPrefab("EngiTurretMaster").GetComponents <AISkillDriver>()[i].activationRequiresTargetLoS = false;
                            }
                        }
                        lastWasRebar = false;
                    }
                }

                orig(netMsg);
            };
        }