76.7.0 (2026-10-09)
- Default empty selection slots to option 1 (db95244)
- isolate and validate siren files so one bad addon doesn't kill EMV init (#259) (0aed750)
- Let the server accept a turn signal cancel again (e7d30f4)
- Migrate siren sound sync to Photon.SNet to fix duplicate/stuck sirens (d1e27d7)
- Move vehicle blackout to Photon.SNet so it applies immediately (f8a84ad)
- Prioritize explicit PI ref over PHOTON_INHERIT (#256) (4c9ac79), closes #164
- Publish brake, reverse and signal state over SimpleNet (091e976)
- Return an empty table when an illumination stage has no Lights defined (#255) (b0a5202), closes #220
- Stop CAR_TurnLeft(false) turning the signal on (3f7b57f)
- Stop pdebug from bypassing the headlight state nil-guard (4016380)
- upgrade wenmode (6f9f7f5)
- Pool the light render queues (#263) (5b325f3)
- Reuse per-vehicle frame tables and light index keys (#265) (f99b038)
- Stop padding the car light render table with placeholders (#267) (a6745e2)
- Sweep light submaterials in one hook instead of a timer each (#264) (9d95328)
- Trim per-light allocations in the render path (#262) (cb462e6)
- Use xpcall instead of ProtectedCall for quarantined dispatch (#253) (9701c35)
- add an event-driven vehicle registry (868585e)
- Delete the never-loaded regular lighting server meta and net (ca3e27e)
- Drop the unused WheelIndex SimpleNet mapping (f08d9ab)
- move the Photon vehicle flag onto SimpleNet (b8973fa)
76.6.0 (2026-08-15)
- guard against nil bone position in GetPositionFromRE (#250) (3a6e2a8)
- guard GetVehicleClass and hoist class variable in vehicle name recovery (#251) (bbabc29)
- Skip lossy matrix round-trip for pure-yaw auto anchors (#246) (fec7910)
76.5.0 (2026-08-14)
- Wrap photon scans in protected calls, so we don't kill the entire timer for once broken car. (#245) (1d0252e)
76.4.0 (2026-08-14)
- Add a hook call when a SimpleNet value changes. (694e3aa)
- Add serverside setters for he values. (6930f9c)
- Add shared meta for the string tables. (98f87b9)
- Add the 4 strings to our map. (673edcb)
- Add entity to hook call. (c78de01)
- Add resyncing for Photon variables. (75f4c13)
- capture error properly for SendChange (95f58b4)
- Corrected NEQ in Photon signalling handler. (e134c7e)
- Default to . if there's no selections. (96425ac)
- Guard against missing or invalid preset data (2810618)
- If EMVProps are already set, recreate instead of duplicating. (279945b)
- IsEMV is only valid on vehicles because EMVName() is not valid otherwise (bc2fb60)
- Livery ID and Unit Number were swapped, whoops. (0b26054)
- No reason why these shouldn't be on entity. (eeefbec)
- Off-by-one in SimpleNet mapping index bit width (c6236f8)
- Only put vehicles in the EMV vehicle table (2855f89)
- Only put vehicles in the vehicle table. (f661b0b)
- Preset data may not always exist. (5f95dc5)
- Presets may be invalid. (8c4adb2)
- Preventitive fix for off-by-one errors in the index count for mappings. (69da146)
- Recreate EMVProps instead of duplicating them (89557cd)
- Remove extra argument from SimpleNet Get wrappers (85dc60c)
- Remove extra argument. (7336b3e)
- Several functions weren't returning properly. (317cf61)
- Spawn vehicles properly if multiple cars share the same title / name. (9ebd4b7)
- stop multiplying siren SoundLevel beyond Source SNDLVL (3638e01)
- Stop multiplying siren SoundLevel beyond Source SNDLVL (217fbcd)
- Suppress errors when spawning vehicles without tables (3314b48)
- suppress errors when spawning vehicles without tables. (2e246ab)
- switch hot path to use GetForEdit. (1624f3f)
- Use EMVName as vehicle name recovery fallback (dffaea8)
- Use EMVName for fallback if we have it. (731a7d9)
- use vehiclename if it's set. (3ea7d4b)
- Use VehicleName in DrawCarLights when set (f743e02)
- Wrong cache name for cvars.AddChangeCallback so siren stayon wasn't being set. (e5c4d4d)