Teleporter.cs

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.

Native Interop
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;
	}
}