#sbox clear

s&box constraints: create as child GameObjects with ConstraintCleanup, not directly on target objects

s&box: Traverse all connected contraption objects via Rigidbody.Joints + Collider.Joints + ManualLink recursively

s&box PropSpawner: offset spawn position by -Bounds.Mins.z upward so props la...

#sbox#spawning#props#physicscsharpposted 1 month ago

s&box Stats: use Sandbox.Services.Stats.Increment() on the owning client only...

#sbox#stats#services#networkingcsharpposted 1 month ago

s&box NPC + NavMesh + PhysGun: when a physgun grabs an NPC (MotionEnabled=tru...

#sbox#npc#navmesh#physgun#physicscsharpposted 1 month ago

s&box PlayerData respawn: use MarkForRespawn() + OnUpdate() timeout (4s) as a...

#sbox#respawn#player#networkingcsharpposted 1 month ago

s&box loadout persistence: serialize inventory as List<LoadoutEntry> (PrefabP...

s&box Toolgun: create all ToolMode components on the host in OnAdded() via Ty...

#sbox#toolgun#toolmode#networkingcsharpposted 1 month ago

s&box Physgun: store grab state as a [Sync] struct (GrabState).

#sbox#physgun#sync#networkingcsharpposted 1 month ago

s&box per-player spawn limits: track by SteamId dict, lazy-prune on count, expose as replicated ConVars

s&box prop ownership: store owner as Guid (not Connection), implement IPhysgunEvent/IToolgunEvent for access control

s&box UndoSystem: per-player stacks keyed by SteamId, bounded at 128, RemovePlayer on disconnect, Rpc.FilterInclude for notices

s&box weapon architecture: AimRay context resolution, EffectiveAttacker, and host-side TraceAttack RPC

s&box NPC architecture: ScheduleBase (task sequence) + TaskBase (atomic action) with ShouldCancel() interrupt

s&box: Scene cleanup without player disconnect — capture baseline on load, diff and restore on cleanup command

s&box: Use INetworkListener.AcceptConnection to reject banned players at connection time, persist bans via LocalData

s&box: Two-tier player event system — Local.IPlayerEvents (hierarchy-scoped) vs Global.IPlayerEvents (scene-wide)

s&box: Correct damage pipeline order — pre-event, armour, health, OnDeath, then Kill()

s&box: Network.Refresh(component) does not replicate — use Network.Refresh() (full GameObject) instead

s&box: Implement IScenePhysicsEvents.OnOutOfBounds to destroy rigidbodies that fall out of the world