S&box Wiki

Revision Difference

Pawn_Input#549688

<cat>Code.Player</cat>⤶ To help operate your [Pawn](https://wiki.facepunch.com/sbox/Pawn) you might want to provide some special input data from the clientside.⤶ ⤶ ## Client Input Properties⤶ ⤶ You can mark properties on a [Pawn](https://wiki.facepunch.com/sbox/Pawn) or [Entity Component](https://wiki.facepunch.com/sbox/Entity_Components) with the `[ClientInput]` attribute. ⤶ ⤶ Properties with this attribute are automatically serialized and sent to the server.⤶ ⤶ ## Building Input⤶ ⤶ Every frame `BuildInput()` gets called clientside. The static `Input` class can be used to grab raw input data and then use that data to set any properties with the `[ClientInput]` attribute.⤶ ⤶ ```csharp⤶ // An example BuildInput method within a player's Pawn class.⤶ [ClientInput] public Vector3 InputDirection { get; protected set; }⤶ [ClientInput] public Angles ViewAngles { get; set; }⤶ ⤶ public override void BuildInput()⤶ {⤶ InputDirection = Input.AnalogMove;⤶ ⤶ var look = Input.AnalogLook;⤶ ⤶ var viewAngles = ViewAngles;⤶ viewAngles += look;⤶ ViewAngles = viewAngles.Normal;⤶ }⤶ ```⤶ ⤶ ## Simulate⤶ ⤶ Every tick clients send a **Command** that contains the values constructed from BuildInput. This command then gets simulated in `Game.Simulate( Client )` for each client.⤶ ⤶ Within Simulate( Client ) the static [Input](https://asset.party/api/Sandbox.Input) class contains inputs specific to the currently simulated client, this allows you to run the same code on both the server and client for [Prediction](Prediction).⤶ ⤶ ```csharp⤶ // An example Simulate method within a player's Pawn class.⤶ ⤶ public override void Simulate( Client cl )⤶ {⤶ if ( Input.Pressed( InputButton.Jump ) )⤶ {⤶ Velocity += Vector3.Up * 100f;⤶ }⤶ ⤶ Velocity += InputDirection * 400f;⤶ Rotation = ViewAngles.ToRotation();⤶ }⤶ ```⤶ ⤶ ### Button State⤶ ⤶ A `[ClientInput]` property can also be a `ButtonState`. This struct lets you treat an input as if it were a button, so that in Simulate you can get whether it was "pressed" or "released" or whether it is "down". This can make stuff like couch co-op easier.⤶ ⤶ ```csharp⤶ [ClientInput] public ButtonState Jump { get; set; }⤶ ⤶ public override void BuildInputs()⤶ {⤶ if ( IsPlayerOne )⤶ Jump = Input.Down( InputButton.Jump );⤶ else if ( IsPlayerTwo )⤶ Jump = Input.Down( InputButton.Drop );⤶ }⤶ ⤶ public override void Simulate( Client client )⤶ {⤶ if ( Jump.Pressed )⤶ {⤶ Velocity += Vector3.Up * 100f;⤶ }⤶ }⤶ ```⤶ ⤶