Level/WheelInteract.cs
using Sandbox;
public class WheelInteract : BaseInteract
{
[Property] public float TurnSpeed { get; set; } = 50f;
[Property] public float ReturnSpeed { get; set; } = 50f;
[Property] public bool LockOnOpen { get; set; } = false;
[Property] public float TurnDistance { get; set; } = 360f;
[Property] public float MoveDistance { get; set; } = 100f;
[Property] public GameObject Door { get; set; }
public float currentDistance { get; set; } = 0f;
public float outDistance { get; set; } = 0f;
Vector3 doorstartPos { get; set; }
bool fullyOpen = false;
bool used = false;
public override void OnUse( GameObject player )
{
used = true;
if ( player.Components.Get<Opium.PlayerController>() is Opium.PlayerController controller )
{
controller.LockMovement = true;
controller.LockCameraMovement = true;
}
}
public override void OnUseStop( GameObject player )
{
used = false;
if ( player.Components.Get<Opium.PlayerController>() is Opium.PlayerController controller )
{
controller.LockMovement = false;
controller.LockCameraMovement = false;
}
}
protected override void OnUpdate()
{
if(fullyOpen && LockOnOpen )
{
return;
}
if( outDistance == MoveDistance )
{
fullyOpen = true;
}
if ( used && currentDistance < TurnDistance )
{
Transform.Rotation *= Rotation.FromRoll( Time.Delta * TurnSpeed );
currentDistance += Time.Delta * TurnSpeed;
outDistance = currentDistance.Remap( 0f, TurnDistance, 0f, MoveDistance );
}
else if ( !used && currentDistance > 0f )
{
Transform.Rotation *= Rotation.FromRoll( Time.Delta * -ReturnSpeed );
currentDistance -= Time.Delta * ReturnSpeed;
outDistance = currentDistance.Remap( 0f, TurnDistance, 0f, MoveDistance );
}
if ( Door != null )
{
var doorcomp = Door.Components.Get<SlidingDoorComponent>();
doorcomp.MoveTo( outDistance, MoveDistance );
}
}
}