GKS Watch
The smartwatch on the wrist — items, wrist props, faces, apps and the health mechanics.
The watch is split across two files, and it matters which one you open:
| File | Holds |
|---|---|
gksphone/config/config.lua → Config.Watch | Items, wrist props, the key, health mechanics |
gksphone/config/config.json → Watch | Which faces and apps exist |
Anything the game world touches is Lua. Anything only the screen touches is JSON.
Turning it on
Config.Watch = {
Enable = true, -- master switch for the whole watch
ItemRequire = false, -- does the player need a watch item?
}With Enable = false there is no key, no command and no prop — nothing is registered at all.
Items and models
Five cases ship. Each is a plain inventory item with no metadata, so every inventory can carry it.
ItemRequire = true, -- require an item
DefaultModel = "midnight", -- used when ItemRequire is false
ItemName = {
["watch_silver"] = "silver",
["watch_black"] = "midnight",
["watch_gold"] = "gold",
["watch_sport"] = "sport",
["watch_ultra"] = "ultra",
},Left side is the item name in your inventory, right side is the model. Rename the items freely; keep the model names.
The items have to exist in your inventory too. Definitions per inventory are in Installation.
With ItemRequire = false nobody needs an item and everyone wears DefaultModel.
Wrist props
The watch is worn as a real prop, visible to other players.
PropActive = true,
PropWear = true, -- worn while carried, not only while open
PropWearDistance = 30.0, -- metres; past this other players' watches are not drawn
PropBone = 18905, -- SKEL_L_Hand
PropOffset = { pos = vector3(-0.020, -0.004, 0.000), rot = vector3(205.0, 0.0, 85.0) },Models ship in stream/. PropOffset is already tuned — only touch it if you replace the models.
PropWear = true with ItemRequire = false means every player wears DefaultModel all the time. Turn one of the two off if that is not what you want.
Opening it
OpenKey = "F3", -- key
CommandName = "watch", -- /watch
CloseWithPhone = true, -- opening one closes the otherCloseWithPhone exists because only one of the two can hold NUI focus. Set it to false only if you know what that means.
Faces and apps
Screen-only, so they live in JSON.
"Watch": {
"defaultFace": "modular",
"faces": ["bloom", "contour", "numerals", "modular"],
"apps": {
"messages": true, "phone": true, "wallet": true,
"health": true, "nowplaying": true, "timers": true,
"calculator": true, "notes": true, "weather": true
}
}faces— remove a name and players can no longer pick it.apps— set one tofalseand it is gone from the grid.
A missing app key counts as on, not off. Deleting a line to hide an app does the opposite — set it to false instead.
Health
Health = {
Enable = true,
Rings = { move = 500, exercise = 30, stand = 12 }, -- kcal / active minutes / hours
EMSJob = "ambulance", -- must match a key in Config.JOBServices
}Tracking runs whether or not the watch is on screen — the rings record the day.
Mechanics
These change how the character behaves, and each switches off on its own.
| Setting | What it does | Off by |
|---|---|---|
Steps | Counts steps from distance walked | Enable = false |
HeartRate | Idle range, and a notification above HighAlert | Enable = false |
HeartRate.Overexertion | Drains stamina and can ragdoll after Duration seconds above Threshold | Enable = false |
ManualSOS | SOS raised by hand from the Control Center | Enable = false |
CrashDetection | Losing SpeedDelta km/h at once starts an EMS countdown | Enable = false |
FallDetection | Falling past HeightThreshold metres starts the same countdown | Enable = false |
CrashDetection = {
Enable = true,
SpeedDelta = 80.0, -- km/h lost in one instant
Countdown = 10, -- seconds to cancel before EMS is called
AutoCallEMS = true,
},Setting Health.Enable = false turns all of it off in one go.
Weather
Weather = { Enable = true },Read out of the game world, so it agrees with the sky the player is under. Temperatures come from Config.Weather; config.json's Watch.weather.celsius picks the unit.
A custom inventory
Supported inventories tell the watch when an item moves. If yours does not, call this after any change:
exports["gksphone"]:RefreshWatchItem()Without it the prop still catches up on its own, on the PropWearPoll interval.
Restart the phone
Both files are read at resource start, so restart gksphone after editing either one.

