From opx77_* to opx_infinity
Last updated on
Where every old opx77_* resource, export, event, command and config key went when the framework became the single opx_infinity resource, and what has no replacement.
In September 2026 the separate opx77_* resources were replaced by one resource, opx_infinity; each old resource is now a module inside it. General changes first, then one folded table set per old resource.
What changed for everyone
| Before | Now |
|---|---|
Sixteen documented opx77_* resources (twenty-one in all) | One resource, opx_infinity, plus the client library opx_lib |
Each resource published exports (Open77.exports.call('opx77_core', ...)) | Modules call each other's contracts with OPX.Api.Get('<module>'), inside opx_infinity only. |
Answers { ok = true, ... } with fields at the top level | Contracts mostly answer Result: { ok = true, value = ... } / { ok = false, error, detail }. Money mutators still answer ok, code. Each module page gives the exact shape. |
A service found its caller with GetInvokingResource() | The caller passes its own owner name (menus, prompts, effects, animations). |
Events opx77:client:*, opx77:server:*, <resource>:* | opx:net:<module>:<verb>, opx:on:..., opx:in:... |
| Client events heard by other resources | Client opx:on: events stay inside opx_infinity. |
Commands opx77.*, rights command.opx77.* | Commands opx.*, rights command.opx.*; optional short aliases. |
One config global per resource (OPX_HUD_CONFIG) | config/<module>.lua setting OPX.Config.MODULES.<module>. LOCALE keys are gone from module configs; the language is SHARED.LOCALE. |
| One CEF page per resource | One WebUI page for every screen. |
OPX.* helpers in lowerCamel (OPX.Result.ok) | PascalCase (OPX.Result.Ok). See the API reference. |
Database tables opx77_* | Same names, kept. Several modules still read old tables and adopt their rows at boot. No migrations run. |
For a separate resource that used the old exports
No drop-in replacement, but a curated set: call opx_infinity instead of opx77_core, with new names and the operator's allowlist in front. See For creators.
| Old call | New call |
|---|---|
opx77_core client GetPlayerData, HasJob, HasGang | server exports GetPlayerData, HasJob, HasGang; the client export GetPlayerData for the local player (the state bag is empty since PR #93) |
opx77_core server GetIdentity | server exports GetPlayerData, GetPlayerByCitizenId |
opx77_core server GetVersion | server export GetVersion |
opx77_inventory AddItem, RemoveItem, HasItem, GetItemCount | server exports AddItem, RemoveItem, HasItem, CountItem |
opx77_menu open, update, close | client exports OpenMenu, UpdateMenu, CloseMenu (answers through your OnOpxEvent export) |
opx77_input open, close | client exports OpenForm, CloseForm |
opx77_notify show, dismiss | client exports ShowToast, DismissToast |
opx77_animations play, stop | client exports PlayAnimation, StopAnimation |
opx77_chat server chat:addMessage | server exports SendChat, BroadcastChat |
server events opx77:player:loaded, moneyChange, jobUpdate… | public server events opx:on:character:loaded, money, job… |
opx77_core OPX.SetJob, SetGang, RemovePlayerFromJob, SetJobDuty (in-VM) | server exports SetJob, SetGang, RemoveJob, RemoveGang, SetDuty |
opx77_core OPX.SetMetadata/GetMetadata | server exports SetMetadata/GetMetadata, in your resource's own ext.<resource>.* space |
client events opx77:client:onMoneyChange, onJobUpdate, opx77:status:needs… | client export Subscribe('opx:on:character:money') and the other subscribable events |
- Anything not in that set must move into a module.
- In the folded tables below, "no exports" describes the first
opx_infinityrelease; the creator exports above were added afterwards.
Old resource → new module
| Old resource | New module(s) | Notes |
|---|---|---|
opx77_core | character, vehicles, inventory storage, core runtime (API reference) | Split by concern. |
opx77_charselector | removed — character commands /opx.characters, /opx.select | No selection screen. |
opx77_charcreator | entry + appearance | Name form only; body and face from the game's creator. |
opx77_appearance | appearance (+ new clothing) | |
opx77_menu | menu | |
opx77_input | form | |
opx77_notify | core OPX.Toast, OPX.Notify | |
opx77_hud | hud | /hud and the F8 toggle are gone. |
opx77_status | needs | Same database table. |
opx77_prompts | prompts | |
opx77_chat | chat | |
opx77_weather | weather | Time commands are now /opx.time*. |
opx77_elevators | elevators | |
opx77_animations | animations | |
opx77_admin | admin | |
opx77_inventory | inventory |
Old URLs
Every page of the old site (reference/opx77_<name>/...) redirects to the module page that replaced it.
Detailed mappings
Old name → new name. "Removed" means there is no equivalent.
Contributing
How to change opx_infinity, opx_lib or this site — branches, checks before pushing, code conventions, text, and the documentation to update in the same change.
Release notes
What changed in opx_infinity and opx_lib, newest first, starting with the replacement of the opx77_* resources in September 2026.