Resource Structure
Each resource is a self-contained folder owned by one Lua runtime on each active side.
Minimal layout
my_resource/
manifest.lua
client.lua
server.lua
resource.cfg
data/
settings.json
assets/
content.bundleOnly manifest.lua is required. Scripts and files are loaded in declaration order.
Manifest directives
manifest_version '1.0.0'
name 'my_resource'
author 'Server Team'
version '1.0.0'
description 'An example gameplay resource'
client_scripts {
'client/main.lua',
'client/ui.lua'
}
server_scripts {
'server/main.lua',
'server/storage.lua'
}
files {
'data/settings.json',
'assets/item_icon.png'
}
asset_bundle 'assets/content.bundle'Asset bundles are automatically included in synchronized files. Server scripts are excluded from client synchronization.
Declarative custom content
Resources can register content while their manifest is loaded:
derived_items {{
base = 'SwordBlackmetal',
prefab = 'ExampleSword',
persistent = true,
name = 'Example Sword',
damage = { slash = 90 },
recipe = {
amount = 1,
enabled = true,
craftingStation = 'forge',
minStationLevel = 2,
resources = {
{ item = 'Iron', amount = 10 }
}
}
}}See the gold_mining example for AssetBundle prefabs, bundle items, a derived item, recipe, and derived mob in one resource.
Resource configuration
Global convars live in server.cfg. Resource-local values live in resource.cfg:
set reward_amount "5"
setr display_name "Public event"Read them in Lua:
local rewardAmount = GetResourceConvarInt('reward_amount', 1)
local displayName = GetResourceConvar('display_name', 'Event')Use sets only for engine-owned secrets such as the MySQL connection string. Secret values are not exposed to Lua getters.
Lifecycle
Stopping a resource removes its event handlers, commands, exports, scheduled tasks, pending MySQL operations, and loaded AssetBundles. Do not keep runtime IDs in persistent storage; values beginning with instance: or object: are valid only for the current game process.