A Teleporter component for game objects, triggers when another collider enters and moves the root object to a linked TargetTeleporter. It supports a cooldown, boosts exit velocity for CharacterController or Rigidbody, and triggers a camera shake via CameraJuice.
using Sandbox;
public sealed class Teleporter : Component, Component.ITriggerListener
{
[Property] public Teleporter TargetTeleporter { get; set; }
[Property] public float CooldownDuration { get; set; } = 1.5f;
[Property] public float ExitVelocityBoost { get; set; } = 1.2f;
private TimeSince _timeSinceLastUse;
public void OnTriggerEnter( Collider other )
{
if ( _timeSinceLastUse < CooldownDuration || TargetTeleporter == null || !TargetTeleporter.IsValid() )
return;
var rootObj = other.GameObject.Root;
var cc = rootObj.Components.Get<CharacterController>();
if ( cc.IsValid() )
{
rootObj.WorldPosition = TargetTeleporter.WorldPosition + Vector3.Up * 20f;
cc.Velocity *= ExitVelocityBoost;
TargetTeleporter.SetCooldown();
SetCooldown();
CameraJuice.Instance?.Shake( 10f );
return;
}
var rb = rootObj.Components.Get<Rigidbody>();
if ( rb.IsValid() )
{
rootObj.WorldPosition = TargetTeleporter.WorldPosition + Vector3.Up * 20f;
rb.Velocity *= ExitVelocityBoost;
TargetTeleporter.SetCooldown();
SetCooldown();
}
}
public void SetCooldown()
{
_timeSinceLastUse = 0;
}
}