Lock Door System — Changelog
All notable changes to this pack are recorded here.
The format follows Keep a Changelog and the pack follows Semantic Versioning.
The version below must always match the one declared in Runtime/AssemblyInfo.cs — that
is the version the FOS Hub shows, and the one the Hub compares against the installed Core.
Nothing yet.
[2.0.1] — 2026-08-21
Section titled “[2.0.1] — 2026-08-21”- A door set to start locked appeared unlocked to everyone but its owner. The
initial state was published from
Start(), and VRChat documents that a serialisation requested there can leave before networking is ready. Lost, it reached nobody, and anyone joining afterwards received the default value — an unlocked door. The first click on the door repaired it, which is what made this hard to notice: the state was only ever wrong until somebody touched it. The initial state is now published fromOnPlayerJoined, where the network is up.
2.0.0 — 2026-08-21
Section titled “2.0.0 — 2026-08-21”Full rewrite on the FOS Essentials Core. The door does the same job as before, and none of it is the same code.
Not backward compatible with 1.0 — hence the major version. No class name survives, the fields differ, and a prefab you have modified does not carry over on its own. The upgrade path is at the end of this entry.
Requires FOS Essentials Core 1.3.0, plus FOS Access 1.0.0, FOS Localization 1.0.0, FOS Teleport 1.0.0 and FOS UI Culling 1.0.0 — all four free.
- The lock state could disagree from one player to the next, for good. The same variables were both synchronised and flipped by an event sent to everyone, so each client inverted its own copy before the owner overwrote them all. Two clicks were enough to end up out of step with the room, with no error and no way back. State now travels through synchronised variables only.
- Nothing ever took ownership.
RequestSerialization()was called by clients that did not own the object — including from a method running on every client — which does nothing at all and hid the problem above. - A single player leaving sent one network event per player in the instance, and so did every entry into the room. The cost grew with the square of the number of people present. Each player now reports only themselves, and the owner alone acts on a departure.
- The anonymous mode showed a different list to every player. Each client drew its own random characters, so three people in the room saw three different lists.
- Turning the anonymous mode on sent one network event per occupant, in a loop, which a busy room turns straight into rate limiting.
- The refusal message never went away. Once you were told you had no key, the panel stayed on screen for the rest of the session.
- A doorbell timer was synchronised and incremented every frame, sending a float over the network to drive a camera that only ever existed locally.
- A player could be added or removed under somebody else’s name. Requests carried a name and it was taken at face value; they are now checked against the caller’s real network identity.
- Missing references crashed the behaviour silently on start. Everything is checked.
- The doorbell speaks each player’s language. What travels is who rang, not a ready-made sentence, so the ringer’s language is no longer imposed on the instance.
- A refusal says which refusal it is: not on the list, or list not downloaded yet. The second used to be silent, so a VIP clicking during the first seconds simply concluded the button was broken.
- A blocked passage stops offering itself. The “Use” prompt disappears while the door is locked, instead of being shown and then doing nothing when clicked — which reads as a broken door rather than a closed one.
- The occupant list survives anything. It is rebuilt from a synchronised variable, so somebody arriving late sees the room as it is.
- Inspector diagnostics, in your language: a detection zone with no trigger collider, a passage with no destination, a door that starts locked and unlocks itself when empty — which is a reserved room quietly configured to open for good the first time it empties.
FOS Essentials > Check event wiring(from the Core) lists every control whose event matches no method. A renamed method leaves as many dead controls as it had callers, and a rewrite like this one is exactly when that happens.- Any behaviour can follow the door, the room or the bell through
FOSRegister. - Editor interface translated into English, French, Spanish and German.
Changed
Section titled “Changed”- The access check became its own free pack,
FOS Access. It answers one question — does this player hold the key? — from a list in the inspector, a list downloaded from a URL, a VRChat product, or the instance master, cumulatively. The list in the inspector answers instantly, which is what removes the start-up race the old checker had. - One component, one job: the lock decides, the zone counts, the bell rings, the display draws. The 1.0 held all four plus the access logic in a single 509-line script.
- Passages use FOS Teleport, which brings a cooldown, velocity reset, optional play
space alignment and a sound. The old teleport was a bare
TeleportTo, and the player arrived at whatever speed they left with. - Proximity display uses FOS UI Culling instead of a sphere overlap run every frame, which allocated an array each time and reacted to any collider, not to the player.
- The occupant list carries player ids, not names: four bytes instead of about thirty per occupant.
- Indicator colours are fields, not six copies of the same literal.
- The VIP padlock is an object in the “shown when locked” list rather than a third case in the code, so the prefab decides what a locked door looks like.
Removed
Section titled “Removed”HideSystemandTeleportLDS, replaced by FOS UI Culling and FOS Teleport.- The Anonym Length setting: the mask is a text you choose, identical for everyone.
Upgrading from 1.0
Section titled “Upgrading from 1.0”A prefab you have modified will not carry over. Class names, fields and the folder layout all changed.
- Import the package and let Unity compile.
- Open
FOS Essentials > Huband check that every requirement is green — there are four free packs to have installed, and the Hub names any that is missing or too old. - Drop the new prefab into your scene and set it up next to the old one.
- Carry your settings across using the table in
README.md, which maps every 1.0 option to its 2.0 equivalent. - Run Check event wiring on the result before deleting the old door.
Your VIP list moves as is: the same file, the same one-name-per-line format, into the Access List’s remote URL. Or paste it into the inspector list and drop the hosting.
Two limits are stated plainly in the README rather than implied: the anonymous mode is cosmetic, and access is decided on the player’s own client. Neither has a fix available in Udon, and the 1.0 did not claim otherwise — it simply did not say.
1.0.0 — 2025-10-22
Section titled “1.0.0 — 2025-10-22”First sold release.
- Lockable door with an occupant list, do-not-disturb, anonymous mode, a doorbell with a camera view, VIP rooms backed by a downloaded name list or a VRChat product, and teleport-based passages.
