Пример #1
0
        private void CharacterMaster_TransformBody(On.RoR2.CharacterMaster.orig_TransformBody orig, RoR2.CharacterMaster self, string bodyName)
        {
            var baseAI = self.GetComponent <BaseAI>();

            if (baseAI)
            {
                //Chat.AddMessage($"baseAI found");
                var masterPrefab = MasterCatalog.FindMasterPrefab(bodyName);
                if (masterPrefab)
                {
                    //Chat.AddMessage($"1");
                    ReplaceSkillDrivers(self, baseAI, masterPrefab);
                }
                if (!masterPrefab)
                {
                    var bodyPrefab = BodyCatalog.FindBodyPrefab(bodyName);
                    if (bodyPrefab)
                    {
                        var masterIndex = MasterCatalog.FindAiMasterIndexForBody(bodyPrefab.GetComponent <CharacterBody>().bodyIndex);
                        masterPrefab = MasterCatalog.GetMasterPrefab(masterIndex);
                        if (masterPrefab)
                        {
                            //Chat.AddMessage($"2");
                            ReplaceSkillDrivers(self, baseAI, masterPrefab);
                        }
                    }
                }
            }
            orig(self, bodyName);
        }
Пример #2
0
        public void LoadMinion(CharacterMaster playerMaster)
        {
            var masterPrefab = MasterCatalog.GetMasterPrefab((MasterCatalog.MasterIndex)masterIndex);

            var             minionGameObject = UnityEngine.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);
        }
Пример #3
0
        private static void CreateEclipseDoppelganger(CharacterMaster master, Xoroshiro128Plus rng)
        {
            var card = DoppelgangerSpawnCard.FromMaster(master);

            if (card is null)
            {
                return;
            }
            if (card.prefab is null)
            {
                card.prefab = MasterCatalog.GetMasterPrefab(defaultMasterIndex);
            }

            Transform spawnOnTarget;

            DirectorCore.MonsterSpawnDistance input;
            if (TeleporterInteraction.instance)
            {
                spawnOnTarget = TeleporterInteraction.instance.transform;
                input         = DirectorCore.MonsterSpawnDistance.Close;
            }
            else
            {
                spawnOnTarget = master.GetBody().coreTransform;
                input         = DirectorCore.MonsterSpawnDistance.Far;
            }
            DirectorPlacementRule directorPlacementRule = new DirectorPlacementRule
            {
                spawnOnTarget = spawnOnTarget,
                placementMode = DirectorPlacementRule.PlacementMode.NearestNode
            };

            DirectorCore.GetMonsterSpawnDistance(input, out directorPlacementRule.minDistance, out directorPlacementRule.maxDistance);
            DirectorSpawnRequest directorSpawnRequest = new DirectorSpawnRequest(card, directorPlacementRule, rng);

            directorSpawnRequest.teamIndexOverride     = new TeamIndex?(TeamIndex.Monster);
            directorSpawnRequest.ignoreTeamMemberLimit = true;

            CombatSquad squad = null;

            DirectorSpawnRequest directorSpawnRequest2 = directorSpawnRequest;

            directorSpawnRequest2.onSpawnedServer = DelegateHelper.Combine(directorSpawnRequest2.onSpawnedServer, (res) =>
            {
                if (squad is null)
                {
                    squad = UnityEngine.Object.Instantiate <GameObject>(Resources.Load <GameObject>("Prefabs/NetworkedObjects/Encounters/ShadowCloneEncounter")).GetComponent <CombatSquad>();
                }
                squad.AddMember(res.spawnedInstance.GetComponent <CharacterMaster>());
            });

            DirectorCore.instance.TrySpawnObject(directorSpawnRequest);

            if (squad is not null)
            {
                NetworkServer.Spawn(squad.gameObject);
            }
            UnityEngine.Object.Destroy(card);
        }
Пример #4
0
        ////// 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);
                    }
                }
            }
        }
 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);
     }
 }
Пример #6
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;
            }
        }
Пример #7
0
        //Loads minion after scene was populated
        //so that minion's AI won't throw exceptions because it can't navigate
        internal 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.inventory);
            }
        }
Пример #8
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);
        }