onClientResourceStop doesn't fire reliably for a resource's own
client scripts when it stops itself, so props never got cleaned up.
The server now broadcasts safe:despawn (the same path already used
for pickup) for every known safe on onResourceStop, right before the
resource actually goes down.
Bump to 1.1.6.
Deleting a frozen object left a stale rendered mesh on screen until
the area re-streamed. Unfreezing right before DeleteObject clears it
immediately, matching how safe:despawn already looked to behave.
The cleanup loop ran on onClientResourceStart, but spawnedSafes is
already a fresh empty table by then, so it never actually deleted
anything. Props from before a restart stayed orphaned in the world
and got duplicated by the requestSync on start. Moved the cleanup to
onClientResourceStop, which runs while the entities are still known.
ExecuteCommand('restart ...') was restarting the whole FXServer
process in this environment instead of just the resource, so
/oixbupgrade now only downloads files and tells the admin to
restart manually.
A wrong PIN now only locks that specific safe, so the player can
still try opening other safes. Also surfaces remaining attempts and
lock duration in the notify messages.
Distance rejection now says exactly why, the PIN rate-limit shows
remaining seconds, and the client no longer announces pickup success
before the server validates it.
Adds distance validation on placement, PIN attempt rate limiting,
proximity checks on open/pickup, and prevents item loss on pickup
when the safe still has contents.