A multiplayer-focused, inheritable, state-based first/third-person character controller for Godot 4, written in statically typed GDScript.
Based on the Quake movement code and the physics/mouse-look feel of Valve's Source SDK 2013 - the same lineage that powers bhop, surf, and every Source-engine mod you've ever loved.
This is the character controller from SurfsUp, now open-sourced for anyone to use, learn from, and build on.
- First-person and third-person cameras with mouse look and smoothed step-up/down.
- Source-engine-inspired physics: ground acceleration, air acceleration/strafing, friction, step climbing, bhop, slope surf.
- State system:
MovementStateandGameStateextension points with signals and overridable hooks. - Multiplayer-first: built around
MultiplayerSynchronizerand a stripped-downSUCCPawnfor remote peers. Transport-agnostic (ENet, WebSocket, GodotSteam, etc.). - Fully configurable via a Resource: swap
SUCCConfigfor light/heavy characters, low-gravity modes, bhop vs. surf profiles. - Editor warnings for missing InputMap actions - no mystery silent failures.
- Zero singleton coupling - drop into any Godot project.
- Copy
addons/SUCC/into your project'saddons/folder (or install via the Godot Asset Library). Scripts register automatically viaclass_name- no Plugins toggle needed. - Add these input actions to your Input Map:
forward,back,left,right,jump,duck,crouch,sprint. Missing actions produce editor warnings and are disabled at runtime. - Instance or inherit
addons/SUCC/scenes/succ_character.tscnas your player. - Extend
class_name SUCCto add your game-specific state (health, ammo, roles, etc.).
class_name MyPlayer extends SUCC
enum MyGameState { ALIVE, DEAD }
var health: int = 100
var my_state: MyGameState = MyGameState.ALIVE
func _can_move() -> bool:
return my_state == MyGameState.ALIVEFull docs: https://bearlikelion.github.io/SUCC/
addons/SUCC/
├── scripts/
│ ├── succ.gd # class_name SUCC extends CharacterBody3D
│ ├── succ_pawn.gd # class_name SUCCPawn - remote peer mirror
│ ├── succ_camera.gd # class_name SUCCCamera - SpringArm3D + mouse look
│ └── succ_config.gd # class_name SUCCConfig - physics/feel tuning Resource
├── scenes/
│ ├── succ_character.tscn
│ └── succ_pawn.tscn
├── resources/
│ └── default_config.tres
└── demo/
├── test_level.tscn # gray-box: ramp, stairs, flat ground
└── test_level.gd
SUCC is just the controller. It does not provide health, ammo, scoring, checkpoints, UI, chat, VOIP, or leaderboards. Those live in your game code, extending SUCC.
Example games and game modes will be published in the separate SUCC Demos repository.
- SurfsUp by Mark Arneman & Nerdiful - the surf/bhop game whose controller SUCC was extracted from.
Shipped or working on something built with SUCC? Open an issue with your game's name, a link, and the author(s), and it'll be added here.
SUCC stands on the shoulders of:
- Quake - id Software's original movement code defined the shape of FPS player physics.
- Source SDK 2013 - Valve's open-source engine release inspired the air acceleration, friction, and mouse-look math used here.
- GoldGdt by ratmarrow - the Godot port that SUCC began as a fork of.
- SurfsUp v1 by Mark Arneman - rewrote GoldGdt to ship the Steam release.
- SurfsUp v2 by Nerdiful - refactored the controller for SurfsUp's 2.0 update.
- SUCC by Mark Arneman - overhauled, extended with state and pawn systems, documented, and open-sourced for everyone.
SUCC is released under the MIT License - see LICENSE. Use it freely in commercial or non-commercial projects, attribution appreciated but not required.
Issues, pull requests, and questions are welcome on GitHub. See CONTRIBUTING.md for guidelines.