Partial component for PlayerControllerPlus that defines configurable movement modes and settings. It declares properties for Walk, Ladder, Swim, Sit, and Noclip modes, creates instances of mode classes, enumerates modes, checks whether a mode is enabled, and updates per-tick fixed updates for selected modes.
using Sandbox.MovementPlus;
namespace Sandbox;
public sealed partial class PlayerControllerPlus : Component
{
[FeatureEnabled( "Move Modes", Icon = "directions_run" )]
public bool UseMoveModes { get; set; } = true;
// --- Walk ---
[Property, Feature( "Move Modes" ), Group( "Walk" ), Order( 0 )] public float WalkGroundAngle { get; set; } = 45.0f;
[Property, Feature( "Move Modes" ), Group( "Walk" ), Order( 1 )] public float WalkStepUpHeight { get; set; } = 18.0f;
[Property, Feature( "Move Modes" ), Group( "Walk" ), Order( 2 )] public float WalkStepDownHeight { get; set; } = 18.0f;
// --- Ladder ---
[Property, Feature( "Move Modes" ), ToggleGroup( "EnableLadderMode", Label = "Enable Ladder" ), Group( "Ladder" ), Order( 100 )] public bool EnableLadderMode { get; set; } = true;
[Property, Feature( "Move Modes" ), Group( "Ladder" ), Order( 101 )] public int LadderPriority { get; set; } = 5;
[Property, Feature( "Move Modes" ), Group( "Ladder" ), Order( 102 ), Range( 0, 2 )] public float LadderSpeed { get; set; } = 1;
[Property, Feature( "Move Modes" ), Group( "Ladder" ), Order( 103 )] public TagSet LadderClimbableTags { get; set; } = new TagSet() { "ladder" };
// --- Swim ---
[Property, Feature( "Move Modes" ), ToggleGroup( "EnableSwimMode", Label = "Enable Swim" ), Group( "Swim" ), Order( 200 )] public bool EnableSwimMode { get; set; } = true;
[Property, Feature( "Move Modes" ), Group( "Swim" ), Order( 201 )] public int SwimPriority { get; set; } = 10;
[Property, Feature( "Move Modes" ), Group( "Swim" ), Order( 202 ), Range( 0, 1 )] public float SwimLevel { get; set; } = 0.7f;
// --- Sit ---
[Property, Feature( "Move Modes" ), ToggleGroup( "EnableSitMode", Label = "Enable Sit" ), Group( "Sit" ), Order( 300 )] public bool EnableSitMode { get; set; } = true;
// --- Noclip ---
[Property, Feature( "Move Modes" ), ToggleGroup( "EnableNoclipMode", Label = "Enable Noclip" ), Group( "Noclip" ), Order( 400 )] public bool EnableNoclipMode { get; set; }
[Property, Feature( "Move Modes" ), Group( "Noclip" ), Order( 401 )] public bool NoclipActive { get; set; }
[Property, Feature( "Move Modes" ), Group( "Noclip" ), Order( 402 )] public bool NoclipToggleWithAirJump { get; set; }
[Property, Feature( "Move Modes" ), Group( "Noclip" ), Order( 403 )] public bool NoclipEnableCollision { get; set; }
[Property, Feature( "Move Modes" ), Group( "Noclip" ), Order( 404 )] public float NoclipRunSpeed { get; set; } = 1200;
[Property, Feature( "Move Modes" ), Group( "Noclip" ), Order( 405 )] public float NoclipWalkSpeed { get; set; } = 200;
// --- Mode Instances ---
internal MoveModeWalkPlus _walkMode;
internal MoveModeSwimPlus _swimMode;
internal MoveModeLadderPlus _ladderMode;
internal SitMoveModePlus _sitMode;
internal NoclipMoveModePlus _noclipMode;
void CreateModeInstances()
{
_walkMode = new MoveModeWalkPlus { Controller = this };
_swimMode = new MoveModeSwimPlus { Controller = this };
_ladderMode = new MoveModeLadderPlus { Controller = this };
_sitMode = new SitMoveModePlus { Controller = this };
_noclipMode = new NoclipMoveModePlus { Controller = this };
}
MoveModePlus[] GetAllModes()
{
return new MoveModePlus[] { _walkMode, _swimMode, _ladderMode, _sitMode, _noclipMode };
}
bool IsModeEnabled( MoveModePlus mode )
{
if ( mode == _walkMode ) return true;
if ( mode == _swimMode ) return EnableSwimMode;
if ( mode == _ladderMode ) return EnableLadderMode;
if ( mode == _sitMode ) return EnableSitMode;
if ( mode == _noclipMode ) return EnableNoclipMode;
if ( mode is ExternalMoveModeAdapter ) return true;
return false;
}
void UpdateModeFixedUpdates()
{
if ( EnableSwimMode ) _swimMode.FixedUpdate();
if ( EnableLadderMode ) _ladderMode.FixedUpdate();
if ( EnableNoclipMode ) _noclipMode.FixedUpdate();
}
void OnFailPressingSit()
{
if ( EnableSitMode && Mode == _sitMode )
{
_sitMode.OnFailPressing();
}
}
}