Exemplo n.º 1
0
 private void TeleportCharacter(CharacterBody characterBody)
 {
     if (!Physics.GetIgnoreLayerCollision(base.gameObject.layer, characterBody.gameObject.layer))
     {
         SpawnCard spawnCard = ScriptableObject.CreateInstance<SpawnCard>();
         spawnCard.hullSize = characterBody.hullClassification;
         spawnCard.nodeGraphType = MapNodeGroup.GraphType.Ground;
         spawnCard.prefab = Resources.Load<GameObject>("SpawnCards/HelperPrefab");
         GameObject gameObject = DirectorCore.instance.TrySpawnObject(new DirectorSpawnRequest(spawnCard, new DirectorPlacementRule
         {
             placementMode = DirectorPlacementRule.PlacementMode.NearestNode,
             position = characterBody.transform.position
         }, RoR2Application.rng));
         if (gameObject)
         {
             Debug.Log("tp back");
             TeleportHelper.TeleportBody(characterBody, gameObject.transform.position);
             GameObject teleportEffectPrefab = Run.instance.GetTeleportEffectPrefab(characterBody.gameObject);
             if (teleportEffectPrefab)
             {
                 EffectManager.instance.SimpleEffect(teleportEffectPrefab, gameObject.transform.position, Quaternion.identity, true);
             }
             UnityEngine.Object.Destroy(gameObject);
         }
         UnityEngine.Object.Destroy(spawnCard);
     }
 }
Exemplo n.º 2
0
        private void CharacterMaster_TransformBody1(On.RoR2.CharacterMaster.orig_TransformBody orig, CharacterMaster self, string bodyName)
        {
            if (bodyName == "HereticBody" && self.GetComponent <BaseAI>())
            {
                var newSummon = new MasterSummon()
                {
                    ignoreTeamMemberLimit = true,
                    inventoryToCopy       = self.inventory,
                    masterPrefab          = Resources.Load <GameObject>("prefabs/charactermasters/hereticmonstermaster"),
                    position          = self.GetBody()?.footPosition ?? Vector3.zero,
                    useAmbientLevel   = true,
                    teamIndexOverride = self.teamIndex
                };
                var newMaster = newSummon.Perform();

                return;
            }
            orig(self, bodyName);
            var body = self.GetBody();

            if (body)
            {
                TeleportHelper.TeleportBody(body, Vector3.zero);
                body.healthComponent?.Suicide();
            }
        }
Exemplo n.º 3
0
            private bool TeleportBody(Vector3 desiredPosition, GraphType nodeGraphType)
            {
                SpawnCard spawnCard = ScriptableObject.CreateInstance <SpawnCard>();

                spawnCard.hullSize      = BotBody.hullClassification;
                spawnCard.nodeGraphType = nodeGraphType;
                spawnCard.prefab        = Resources.Load <GameObject>("SpawnCards/HelperPrefab");
                GameObject gameObject = DirectorCore.instance.TrySpawnObject(new DirectorSpawnRequest(spawnCard, new DirectorPlacementRule
                {
                    placementMode = DirectorPlacementRule.PlacementMode.Approximate,
                    position      = desiredPosition,
                    minDistance   = 20,
                    maxDistance   = 45
                }, RoR2Application.rng));

                if (gameObject)
                {
                    TeleportHelper.TeleportBody(BotBody, gameObject.transform.position);
                    GameObject teleportEffectPrefab = Run.instance.GetTeleportEffectPrefab(BotBody.gameObject);
                    if (teleportEffectPrefab)
                    {
                        EffectManager.SimpleEffect(teleportEffectPrefab, gameObject.transform.position, Quaternion.identity, true);
                    }
                    Destroy(gameObject);
                    Destroy(spawnCard);
                    return(true);
                }
                else
                {
                    Destroy(spawnCard);
                    return(false);
                }
            }
Exemplo n.º 4
0
 public void Update()
 {
     if (Input.GetKeyDown(KeyCode.Z))
     {
         CharacterMaster master = GetComponent <CharacterMaster>();
         if (master && CameraRigController.readOnlyInstancesList.Count >= 1)
         {
             TeleportHelper.TeleportBody(master.GetBody(), CameraRigController.readOnlyInstancesList[0].crosshairWorldPosition);
         }
     }
 }
 public void OnReceived()
 {
     if (Util.HasEffectiveAuthority(target) || NetworkServer.active)
     {
         TeleportHelper.TeleportBody(target.GetComponent <CharacterBody>(), position);
         if (!fromServer)
         {
             NetMessageExtensions.Send(new CRTeleportNetworkMessage {
                 target = target, position = position, fromServer = true
             }, R2API.Networking.NetworkDestination.Clients);
         }
     }
 }
Exemplo n.º 6
0
 private void CombatSquad_AddMember(On.RoR2.CombatSquad.orig_AddMember orig, CombatSquad self, CharacterMaster memberMaster)
 {
     orig(self, memberMaster);
     if (IsUmbra(memberMaster) && self.gameObject.name.StartsWith("ShadowCloneEncounter"))
     {
         Transform  playerSpawnTransform = Stage.instance.GetPlayerSpawnTransform();
         var        body       = memberMaster.GetBody();
         Vector3    vector     = body.footPosition;
         Quaternion quaternion = Quaternion.identity;
         if (playerSpawnTransform)
         {
             vector     = playerSpawnTransform.position;
             quaternion = playerSpawnTransform.rotation;
         }
         TeleportHelper.TeleportBody(body, vector);
         Run.instance.HandlePlayerFirstEntryAnimation(body, vector, quaternion);
         //if (memberMaster.bodyPrefab.GetComponent<CharacterBody>()?.preferredPodPrefab != null)
     }
 }
 public void OnInteract(Interactor interactor)
 {
     if (teleportTarget && interactor.gameObject.GetComponent <CharacterBody>())
     {
         EffectManager.SpawnEffect(GenericCharacterDeath.voidDeathEffect, new EffectData
         {
             origin = interactor.gameObject.transform.position,
             scale  = 5f
         }, true);
         if (Util.HasEffectiveAuthority(interactor.gameObject))
         {
             TeleportHelper.TeleportBody(interactor.gameObject.GetComponent <CharacterBody>(), teleportTarget.transform.position);
         }
         else
         {
             if (NetworkServer.active)
             {
                 NetMessageExtensions.Send(new CRTeleportNetworkMessage {
                     target = interactor.gameObject, position = teleportTarget.transform.position, fromServer = true
                 }, R2API.Networking.NetworkDestination.Clients);
             }
             else
             {
                 NetMessageExtensions.Send(new CRTeleportNetworkMessage {
                     target = interactor.gameObject, position = teleportTarget.transform.position, fromServer = false
                 }, R2API.Networking.NetworkDestination.Server);
             }
         }
         EffectManager.SpawnEffect(DeathState.deathExplosionEffect, new EffectData
         {
             origin = teleportTarget.transform.position + new Vector3(0, 3, 0),
             scale  = 5f
         }, true);
     }
     else
     {
         this.outer.SetNextStateToMain();
         base.gameObject.GetComponent <PurchaseInteraction>().available = false;
     }
 }
Exemplo n.º 8
0
        private void RepositionGroundedDrones(CharacterBody droneBody, Vector3 desiredPosition)
        {
            bool isGrounded = false;

            foreach (string subname in GroundedDrones)
            {
                if (droneBody.name.Contains(subname))
                {
                    isGrounded = true;
                    break;
                }
            }
            if (!isGrounded)
            {
                return;
            }
            SpawnCard spawnCard = ScriptableObject.CreateInstance <SpawnCard>();

            spawnCard.hullSize      = droneBody.hullClassification;
            spawnCard.nodeGraphType = GraphType.Ground;
            spawnCard.prefab        = helperPrefab;
            GameObject gameObject = DirectorCore.instance.TrySpawnObject(new DirectorSpawnRequest(spawnCard, new DirectorPlacementRule
            {
                placementMode = DirectorPlacementRule.PlacementMode.Approximate,
                position      = desiredPosition,
                minDistance   = 0,
                maxDistance   = 50
            }, Run.instance.runRNG));

            if (gameObject)
            {
                TeleportHelper.TeleportBody(droneBody, gameObject.transform.position);
                Object.Destroy(gameObject);
            }
            else
            {
                Log.Warning($"Machines.RepositionGroundedDrones: Failed to reposition {droneBody.name}. It might be floating now.");
            }
            Object.Destroy(spawnCard);
        }
        /// <summary>
        /// Teleports a body to another GameObject using the director system.
        /// </summary>
        /// <param name="characterBody">The body to teleport.</param>
        /// <param name="target">The GameObject we should teleport to.</param>
        /// <param name="teleportEffect">The teleportation effect we should use upon arrival.</param>
        /// <param name="hullClassification">The hullclassification we should use for traversing the nodegraph.</param>
        /// <param name="rng">The random that we should use to position the body randomly around our target.</param>
        /// <param name="minDistance">How close to the target can we get?</param>
        /// <param name="maxDistance">How far out from the target can we get?</param>
        /// <param name="teleportAir">Should we use the air nodes?</param>
        /// <returns>A bool representing if the teleportation was successful or not.</returns>
        public static bool TeleportBody(CharacterBody characterBody, GameObject target, GameObject teleportEffect, HullClassification hullClassification, Xoroshiro128Plus rng, float minDistance = 20, float maxDistance = 45, bool teleportAir = false)
        {
            if (!characterBody)
            {
                return(false);
            }

            SpawnCard spawnCard = ScriptableObject.CreateInstance <SpawnCard>();

            spawnCard.hullSize      = hullClassification;
            spawnCard.nodeGraphType = teleportAir ? MapNodeGroup.GraphType.Air : MapNodeGroup.GraphType.Ground;
            spawnCard.prefab        = Resources.Load <GameObject>("SpawnCards/HelperPrefab");
            GameObject gameObject = DirectorCore.instance.TrySpawnObject(new DirectorSpawnRequest(spawnCard, new DirectorPlacementRule
            {
                placementMode = DirectorPlacementRule.PlacementMode.Approximate,
                position      = target.transform.position,
                minDistance   = minDistance,
                maxDistance   = maxDistance
            }, rng));

            if (gameObject)
            {
                TeleportHelper.TeleportBody(characterBody, gameObject.transform.position);
                GameObject teleportEffectPrefab = teleportEffect;
                if (teleportEffectPrefab)
                {
                    EffectManager.SimpleEffect(teleportEffectPrefab, gameObject.transform.position, Quaternion.identity, true);
                }
                UnityEngine.Object.Destroy(gameObject);
                UnityEngine.Object.Destroy(spawnCard);
                return(true);
            }
            else
            {
                UnityEngine.Object.Destroy(spawnCard);
                return(false);
            }
        }
Exemplo n.º 10
0
        private bool TeleportAlliesToFirstAvailablePlayer(Vector3?forcePosition = null)
        {
            if (allies.Count == 0)
            {
                return(true);
            }

            CharacterBody body = null;

            foreach (var masterController in PlayerCharacterMasterController.instances)
            {
                if (masterController.master.GetBody())
                {
                    body = masterController.master.GetBody();
                    break;
                }
            }

            if (!body)
            {
                return(false);
            }

            bool teleportedAtLeastOneAlly = false;

            foreach (var ally in allies)
            {
                CharacterBody allyBody = ally.GetBody();
                if (!allyBody)
                {
                    continue;
                }
                Vector3?position = forcePosition;
                if (!forcePosition.HasValue)
                {
                    position = FindSafeTeleportDestination(body.footPosition, allyBody, RoR2Application.rng);
                }
                if (position.HasValue)
                {
                    TeleportHelper.TeleportBody(allyBody, position.Value);

                    allyBody.AddTimedBuff(RoR2Content.Buffs.Immune, 3f);
                    foreach (EntityStateMachine entityStateMachine in allyBody.GetComponents <EntityStateMachine>())
                    {
                        entityStateMachine.initialStateType = entityStateMachine.mainStateType;
                    }

                    GameObject respawnEffect = Resources.Load <GameObject>("Prefabs/Effects/HippoRezEffect");
                    if (respawnEffect)
                    {
                        Transform bodyTransform = getTransform(allyBody);
                        EffectManager.SpawnEffect(respawnEffect, new EffectData
                        {
                            origin   = position.Value,
                            rotation = bodyTransform.rotation,
                            scale    = allyBody.bestFitRadius * 2f
                        }, true);
                    }
                    if (ally.GetBodyObject())
                    {
                        Util.PlaySound("Play_item_proc_extraLife", ally.GetBodyObject());
                    }

                    teleportedAtLeastOneAlly = true;
                }
            }

            return(teleportedAtLeastOneAlly);
        }
Exemplo n.º 11
0
        public void Awake()
        {
            //TeleporterInteraction - onTeleporterBeginChargingGlobal
            //This looks like the function to hook into to move all active turrets to teleporter
            //try gameobject/self from this class to get position of teleporter
            On.RoR2.TeleporterInteraction.OnInteractionBegin += (orig, self, activator) =>
            {
                //if (!self.isIdleToCharging)

                //Chat.AddMessage("Mod says teleporter has been activated");
                //if(self.mainStateMachine)
                //  Chat.AddMessage(self.mainStateMachine.state.ToString());
                //if(self.mainStateMachine.state != EntityStates.LunarTeleporter.Idle)
                if (!self.isIdle)
                {
                    //Chat.AddMessage("teleporter not idle");
                    orig(self, activator);
                    return;
                }

                var masters = CharacterMaster.readOnlyInstancesList;
                List <CharacterMaster> masterList = masters.Cast <CharacterMaster>().ToList();
                List <CharacterMaster> TurretList = new List <CharacterMaster>();

                foreach (CharacterMaster cm in masterList)
                {
                    //Chat.AddMessage(cm.name);
                    foreach (var turretName in TeleportableTurrets)
                    {
                        if (cm.name.StartsWith(turretName))
                        {
                            //Chat.AddMessage("Teleportable Turret is here");
                            TurretList.Add(cm);
                            //Chat.AddMessage(self.name);
                        }
                    }
                }

                int i     = 0;
                int count = TurretList.Count;
                //teleport turrets
                foreach (var turret in TurretList)
                {
                    // 7.5 is the magic number to have all turrets on the teleporter platform
                    // needs to be slightly larger for the primordial telepot
                    float   Radius    = 7f;
                    float   radianInc = Mathf.Deg2Rad * 360f / count;
                    Vector3 point1    = new Vector3(Mathf.Cos(radianInc * i) * Radius, 0.5f, Mathf.Sin(radianInc * i) * Radius);

                    //float x = self.transform.position.x + Mathf.Sin(3.14f * i / count) * Radius;
                    //float y = self.transform.position.y + 0.9f;//keep the turrets from sinking into the teleporter
                    //float z = self.transform.position.z + Mathf.Cos(3.14f * i / count) * Radius;
                    //Vector3 position = new Vector3(x, y, z);

                    i++;

                    //Chat.AddMessage("teleporting turret " + i + " at position " + point1);
                    TeleportHelper.TeleportBody(turret.GetBody(), self.transform.position + point1);
                }

                orig(self, activator);
            };
        }