- PacketReader for all network data: lengths are checked against the real data
(Mono allocated the claimed size first - a fake 2 GB length crashed the game)
- FsmSync: remote players can no longer switch arbitrary FSMs - never PLAYER /
Systems / MSCO objects, CLICK only on FSMs that wait for a click, bolt/assembly
events only along a transition the FSM really has for that event
- Time/weather (msco.world) and '* ' system-style chat only from the host in P2P
(the dedicated server filters them itself); other msco.* ids are reserved
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- VEHICLE: INSTALL for parts that are not installed - runs the game's own
assembly (trigger "Assembly" like on load), so the part sits exactly on its
pivot; synced to other players via FsmSync (MSCO_INSTALL)
- WORLD: time buttons (2-hour steps via the sun FSM's load path) and
CLEAR / RAIN / THUNDERSTORM (weather front moved above the admin);
sent to everyone as mod message "msco.world" (no server update needed)
- JOIN from the server browser/website connects right away in the main menu;
server mods still ask before downloading
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Passenger: auto ride-along only when the vehicle moves (speed from its motion, also for
kinematic remote cars) - no more getting stuck while working in the engine bay or re-captured
- Bolts with a function (drain plug: stage 0-5 = oil leak on) are synced as stage and applied
through the bolt's own stage logic; world authority sends its state once after joining.
Fixes endless oil leaking when players had the drain plug in different states
- Admin menu VEHICLE tab: fluids with FILL/EMPTY, all Database parts with wear/damage,
REPAIR/BREAK per part, REPAIR ALL, filter
- Server profile: info and players as two equal cards, no wrapping
- fsmdump also lists FSM variables
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Car doors (FSM with bool "Open" and "Open door"/"Close door") are synced as open/closed:
the receiver removes the hold joint and frees the hinge, closing runs the game's own logic
- Fix: every synced close of an already closed Satsuma door added another FixedJoint, so the
door could not be opened anymore; extra joints are removed automatically
- Hinge sync also covers world doors/gates with hinges (garage door), interaction by bounds
- Scene name read once per frame (Application.loadedLevelName allocates a string per call)
- Console "perf" (FPS, ms per MSCO part incl. OnGUI, GC, hook calls), -msco-perf start option
- Console "fsmdump <text>" / -msco-dump: PlayMaker FSMs and hinges to MSCO\fsmdump.txt
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- MscoMod API (ModApi.cs) and ModLoader: own mods from MSCO\Mods, hooks for menu/game/update/GUI,
session and player events, Send/OnMessage between players (MsgType.ModMessage)
- Server mods: ModList before Welcome, consent prompt (INSTALL & JOIN), download with SHA-256 check
into MSCO\Mods\Servers, active only on that server; game start waits for the download
- Mods page in the MSCO menu, console command "mods"
- Server browser: MODS pill, VANILLA/MODDED filters, mod list in the server profile
- PlayMaker ApplicationQuit is ignored in the main menu (ESC used to close the game)
- MODDING.md and examples/HelloMod
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Own JSON reader (MiniJson) instead of Newtonsoft.Json - the server browser failed with
"Could not load System.Runtime.Serialization" once MSCLoader was gone
- Mouse cursor visible in admin menu/chat/console (PlayerInMenu)
- Intro "Press any key" screen replaced by an MSCO loading screen; hook PlayMakerFSM.Awake too
- Join links while the game runs: picked up from MSCO\join.txt (written by the launcher)
- Admin menu: TELEPORT tab (home, shop, repair shop, inspection, villages, events, Satsuma)
- Window title/icon "MSCO - My Summer Car Online", MSCO logo in the main menu
- In-game UI restyled like the keymaster website (rounded cards, pills, glow, slim scrollbars)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Bootstrap: Doorstop entry point, loads Harmony/Newtonsoft from the MSCO folder, hooks
PlayMakerArrayListProxy.Awake and starts MSCO in the main menu; skips the news screen
- No MSCLoader reference anymore; key bindings in PlayerPrefs, bind console command
- Harmony 1.2 and Newtonsoft.Json in lib/ (MIT notices); build copies to <game>\MSCO
- README/CHANGELOG updated
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ModVersion (2.8.1, shown in MSCLoader/MSC Launcher) and ProtocolVersion
(2.8) are separate; only the first two digits are compared (P2P host, Steam
lobby, server info, server browser) and only the protocol version is sent,
so minor updates stay compatible with 2.8 servers, hosts and players.
README: how to publish minor and major updates.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- DoorSync matched every FSM with door/hood/lid/trunk in its name, including
the door parts' removal/assembly/bolt/paint FSMs and trigger_ objects, and
forced their states at the other players: doors hung crooked, snapped back
or came off. Those are excluded now (assembly runs via FsmSync).
- HingeSync: on a parked vehicle everyone nearby sent the angle, so doors
ping-ponged. Now only the player who clicked near the door (4 s) sends;
on a driven vehicle the driver sends; received angles are held 3 s.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
StartGame carries a second flag (new game); the client then starts MSC's new
game instead of loading the (empty) received save.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A '-' button collapses the fullscreen launcher into a small MSCO bar at the
top; the game's start menu is visible and clickable again and its music is
unmuted. Clicking the bar opens the launcher; prompts (disconnected,
reconnecting, join confirmation, version warning) open it automatically.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- VehicleStateSync also tracks the CARPARTS and Database roots (wear, damaged
parts, tire wear, oilpan oil, battery charge, carb/ignition settings,
suspension, odometer); the Satsuma's driver is authoritative for them
- Paint colors (FsmColor) as four float channels (compatible with old servers)
and applied to the part's material
- FSMs are re-examined when a part is installed/removed (path changes);
before, anything not on the car at the first scan was never synced
- ControlSync: handbrake, sun visors, seat recline, seat belt, CD player,
interior light; pending states for controls not found yet
- Late joiners: job/shop values and switch states from the server snapshot;
P2P host resends all switch states every 15 s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
GameCharacter clones a MSC human (bodymesh + skeleton, no scripts, physics or
animation), puts it into its bind pose, aligns and scales it, and drives the
bones every frame from the joint points of the existing MSCO figure (hip,
knee, ankle, shoulder, elbow, hand, head pitch, torso lean) by rotating each
limb from its rest direction. Limb bones are picked geometrically, so bone
naming conventions do not matter. Variant per player id; console 'model
classic|game' switches, the MSCO figure is the automatic fallback.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- A driven vehicle is no longer released after 3 s without data (a short hitch
of the driver, e.g. saving, stopped the car instantly on the passenger's side
and ripped the parts off, which then synced to everyone): 30 s timeout, on
release it keeps the driver's velocity and part joints stay unbreakable for
3 more seconds
- Cargo in a moving vehicle belongs to its driver (passengers no longer claim
items in the car, which then followed late and kinematic at the driver's end
and knocked seats and parts off)
- Passenger: sit down automatically by stepping into the open passenger door,
also without a driver (seat from the game's DriverHeadPivot); Space or P to
get out
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>