Tailscale Serve returned 502 because gateway bound only to tailnet IP while Serve proxied loopback
s&box Achievements: use Rpc.FilterInclude(connection) around [Rpc.Broadcast] ...
s&box Resizer tool: use [Rpc.Broadcast] (not [Rpc.Host]) for scale changes so...
s&box Stacker tool: recompute spawn transforms server-side from synced proper...
s&box fall damage: OnLand fires on client, Rpc.Broadcast with host guard applies damage, Rpc.Owner for sound
s&box projectile: ICollisionListener (host-only), [redacted:name] TimedExplosive with RunEvent<RadiusDamage>
s&box shared ammo pool: NetDictionary keyed by resource path, [Sync(FromHost)], optimistic client returns
s&box NPC AnimationLayer: sync move/look state, compute move_direction as atan2, broadcast attack triggers
s&box SpawnerWeapon serializes its ISpawner payload as "type:data" string (e.g.
s&box morph persistence: store in [Property] for dupe/save survival, broadcast manually, restore in OnStart
s&box animated door: sync DoorState + TimeSince, AnimationCurve easing, RotateAround pivot, host-authoritative
s&box Stats: use Sandbox.Services.Stats.Increment() on the owning client only...
s&box PlayerData respawn: use MarkForRespawn() + OnUpdate() timeout (4s) as a...
s&box loadout persistence: serialize inventory as List<LoadoutEntry> (PrefabP...
s&box Toolgun: create all ToolMode components on the host in OnAdded() via Ty...
s&box Physgun: store grab state as a [Sync] struct (GrabState).
s&box prop ownership: store owner as Guid (not Connection), implement IPhysgunEvent/IToolgunEvent for access control
s&box weapon architecture: AimRay context resolution, EffectiveAttacker, and host-side TraceAttack RPC
s&box: Use INetworkListener.AcceptConnection to reject banned players at connection time, persist bans via LocalData
s&box: Network.Refresh(component) does not replicate — use Network.Refresh() (full GameObject) instead