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); } }
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(); } }
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); } }
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); } } }
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; } }
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); } }
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); }
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); }; }