QBESXStandalone
Agency-Watch Configuration
Now with AgencyOS27: a free update for everyone who already owns the watch.
v27.0.1Free7 Pages

01Configuration
Quick Installation · config.lua · Agency-Watch
-- ╔══════════════════════════════════════════════════════════════╗
-- ║ A G E N C Y W A T C H ║
-- ║ AgencyOS27 ║
-- ║ Free from Agency Scripts · discord.gg/RTax3aBMUs ║
-- ║ shop.agencyg.de ║
-- ╠══════════════════════════════════════════════════════════════╣
-- ║ Everything here can be changed without writing code. ║
-- ║ Sections: GENERAL · CONTROLS · ITEM · DISPLAY · ║
-- ║ THEME · LOCK · WATCH FACES · APPS · ║
-- ║ PHONE · PRO · TEXTS ║
-- ╚══════════════════════════════════════════════════════════════╝
Config = {}
-- ═══════════════════════════════════════════════════════════════
-- 1 GENERAL
-- ═══════════════════════════════════════════════════════════════
Config.Framework = 'auto' -- 'auto' | 'qb' | 'esx' | 'standalone'
Config.Locale = 'en' -- Default language. All codes: see SprachListe in shared/sprachen.lua
Config.Debug = false -- Extra messages in the console
-- ═══════════════════════════════════════════════════════════════
-- 2 CONTROLS
-- The watch only appears on a key press, exactly like the Agency Phone.
-- ═══════════════════════════════════════════════════════════════
Config.OpenKey = 'Z' -- Default key (rebindable in game)
Config.OpenCommand = 'watch' -- /watch opens and closes the watch
Config.ToggleMiniCmd = 'watchmini' -- /watchmini toggles the small always-on display
Config.CloseOnEscape = true -- ESC closes the watch
Config.OpenSound = true -- Sound when opening and closing
-- Controls on the case:
-- Crown (top right) = quick menu, scroll wheel on it = page through
-- Side button (below it) = control centre
-- Action button (orange, left) = freely assignable, see below
--
-- The action button ALWAYS does something. A button that does nothing is
-- worse than no button at all: the player cannot tell whether it is broken
-- or whether they are using it wrong. If an unknown name is set here, the
-- watch falls back to the flashlight.
--
-- The labels below are in English on purpose, because that is what makes
-- them translatable: as long as the English default stands here, the watch
-- takes the text from shared/sprachen.lua in the selected language. Put
-- anything else here and you keep exactly your text, in every language. The
-- same rule applies to Config.Apps, Config.Themes and Config.Komplikationen.
Config.ActionButton = 'lampe'
Config.ActionPresets = {
lampe = { label = 'Flashlight', icon = 'lampe', kind = 'builtin', value = 'lampe' },
wegpunkt = { label = 'Clear waypoint', icon = 'pin', kind = 'builtin', value = 'wegpunkt' },
mini = { label = 'Mini display', icon = 'raster', kind = 'builtin', value = 'mini' },
kz = { label = 'Control Centre', icon = 'regler', kind = 'builtin', value = 'kz' },
pay = { label = 'Agency Pay', icon = 'karte', kind = 'builtin', value = 'pay' },
-- Examples for server owners (commented out): your own commands and events
-- motor = { label = 'Engine on/off', icon = 'blitz', kind = 'command', value = 'engine' },
-- hupe = { label = 'Horn', icon = 'hupe', kind = 'command', value = 'hupe' },
-- eigen = { label = 'Custom event', icon = 'blitz', kind = 'event', value = 'my-script:client:action' },
}
-- Flashlight. It lights twice over: the watch face turns into a white
-- surface, which is what a watch on your wrist actually does, and on top of
-- that a cone falls into the world, because otherwise you still would not
-- see anything in the dark.
Config.Lampe = {
-- Range and brightness of the cone
reichweite = 28.0,
staerke = 3.4,
-- ── Shape of the light ───────────────────────────────────────
-- The light is made of two cones: a narrow bright core and a wide weak
-- hem around it. Only both together give the soft edge of a real torch.
-- A single cone throws a patch with a hard border.
kernBreite = 12.0, -- Degrees. Smaller = tighter cone
kernAbfall = 1.6, -- how fast the core fades towards its edge
saumBreite = 30.0, -- degrees of the soft hem around the core
saumStaerke = 0.30, -- share of the core brightness, 0 turns it off
saumWeite = 0.62, -- share of the range the hem lights up
-- Downward tilt, 0 = straight ahead. Without a tilt the cone hits the
-- ground flat and turns into a long ellipse.
neigung = 0.20,
-- Soft near light right at the wearer, so your own feet are not left in
-- the dark. 0 turns it off.
nahlicht = 1.1,
nahweite = 2.6,
-- Does the light follow your view? true feels like a torch you aim.
-- false makes it point rigidly forward.
folgtBlick = true,
-- Off without the watch in hand: does the torch keep running while the
-- watch is put away? true = yes, it stays on until the next press.
weiterAusserhalb = true,
-- Available light modes. You cycle through them on the watch.
arten = { 'weiss', 'blinken', 'rot' },
}
-- ═══════════════════════════════════════════════════════════════
-- 3 ITEM
-- Out of the box a watch has to be in the inventory, any watch. That way
-- the script runs on every server right away, without anyone having to
-- create a new item first. If you want your own item, switch to 'exact'.
-- ═══════════════════════════════════════════════════════════════
Config.RequireItem = true -- false = the watch always opens
-- 'any' = any watch from Config.WatchItems will do (default)
-- 'exact' = only Config.WatchItem is accepted
Config.ItemMode = 'any'
-- Known watch items. The first one the player carries opens the watch.
-- Simply add your own names.
Config.WatchItems = {
'rolex', -- QBCore default, called "Golden Watch" in game
'watch',
'smartwatch',
'agency_watch',
'armbanduhr',
'goldwatch',
'silverwatch',
'diamond_watch',
}
Config.WatchItem = 'smartwatch' -- only applies with Config.ItemMode = 'exact'
Config.Inventory = 'auto' -- 'auto' | 'ox' | 'qb' | 'none'
Config.RemoveOnDeath = false -- watch locked after death until revived
-- ═══════════════════════════════════════════════════════════════
-- 4 DISPLAY
-- Position and size can also be changed on the watch itself.
-- ═══════════════════════════════════════════════════════════════
Config.AlwaysOn = false -- false = only on a key press
-- The small always-on display grows with the watch. If you want it larger
-- or smaller independently, turn this dial: 1.0 = same size as the watch,
-- 0.7 = clearly smaller, 1.3 = larger.
Config.MiniScale = 1.0
-- Where exactly the small display sits. It uses the same screen edge as
-- chosen in Config.Position, but with its own margin: on most servers the
-- HUD lives there, and two displays on top of each other hide one another.
-- hoch = distance to the top or bottom edge, in percent of screen height
-- seite = distance to the left or right edge, in percent of screen width
-- High enough out of the box to stay above a speedometer at the bottom.
Config.MiniAbstand = { hoch = 19.0, seite = 2.4 }
-- ═══════════════════════════════════════════════════════════════
-- WATCH FACES OF THE SMALL DISPLAY
-- They are not small versions of the large ones: on eighty by a hundred
-- pixels everything that works on the big glass is either unreadable or
-- empty. Four designs of their own, picked in the watch face app through
-- the switch at the top.
--
-- voll Time, date, health, steps, network. The layout you know.
-- zeit Just the time, as large as it gets.
-- werte Small time, below it health, armour and steps.
-- ring Time inside the arc of the day.
--
-- Order and selection live here. What is missing does not show up.
-- ═══════════════════════════════════════════════════════════════
Config.MiniFaces = { 'voll', 'zeit', 'werte', 'ring' }
Config.MiniFace = 'voll' -- which one applies out of the box
Config.Position = 'bottom-right' -- bottom-left | bottom-right | top-left | top-right
Config.Size = 1.5 -- Size, allowed range 0.6 to 2.0
Config.Appearance = 'dark' -- 'dark' | 'light'
Config.Use24h = true
Config.DefaultFace = 'raster' -- see section 7
Config.UpdateInterval = 1000 -- milliseconds between refreshes
Config.CountSteps = true -- own step counter
Config.ShowSpeed = true -- speedometer while in a vehicle
Config.HideInPauseMenu = true
-- ═══════════════════════════════════════════════════════════════
-- PRO EDITION AND PROMOTION
-- Without an Agency Phone: the complete free watch with a discreet note.
-- With a detected Agency Phone: the Pro edition, no promotion left.
-- ═══════════════════════════════════════════════════════════════
Config.ShowFreeBranding = true -- note only appears in the free edition
-- ═══════════════════════════════════════════════════════════════
-- 5 THEME — metal presets
-- ═══════════════════════════════════════════════════════════════
Config.Theme = 'titan'
Config.SplitFaceColor = '#00d4ff' -- accent surface on the "Pulse" watch face
-- Base colours of the Agency look. They are passed through to the interface
-- and used by the watch's own notifications.
Config.AccentPrimary = '#00d4ff'
Config.AccentOrange = '#ff6b35'
Config.AccentGreen = '#00ff88'
-- case = the case, the whole metal ramp is derived from it
-- band = the strap, its own ramp
-- accent = system colour of the interface
-- mesh = true for metal links, false for solid coloured straps
--
-- The tones are matched to the product shots and to the Agency palette:
-- cyan #00d4ff and orange #ff6b35 are the house colours and stay the point
-- of reference everywhere.
-- Labels in English again so that they get translated. See the note at
-- Config.ActionPresets.
Config.Themes = {
-- Warm grey titanium, like brushed metal
titan = { label = 'Titanium', case = '#b9b4a9', band = '#a9a49a', accent = '#00d4ff', orange = '#ff6b35', mesh = true },
-- Cool bright silver
silber = { label = 'Silver', case = '#dde0e4', band = '#c7cbd1', accent = '#00d4ff', orange = '#ff6b35', mesh = true },
-- Neutral dark grey
graphit = { label = 'Graphite', case = '#44474e', band = '#383b42', accent = '#00d4ff', orange = '#ff7a30', mesh = true },
-- Almost black with the blue cast of Agency navy
mitternacht = { label = 'Midnight', case = '#1f2129', band = '#171922', accent = '#00d4ff', orange = '#ff6b35', mesh = true },
-- Steel blue case with a deep blue strap
ozean = { label = 'Ocean', case = '#5b6b7d', band = '#1d6fd8', accent = '#00d4ff', orange = '#ff9d5c', mesh = false },
-- Bronze with the house orange
abendrot = { label = 'Sunset', case = '#8f5c3a', band = '#ff6b35', accent = '#ffc24a', orange = '#ff8a4a', mesh = false },
-- The house colours themselves
agency = { label = 'Agency', case = '#2a2f3a', band = '#0f1620', accent = '#00d4ff', orange = '#ff6b35', mesh = true },
}
-- ═══════════════════════════════════════════════════════════════
-- 6b STUDIO
-- Case, strap and colours. Whatever stands here shows up in the Studio
-- app on the watch. The themes above remain one-tap presets: they set
-- several of these values at once.
--
-- Take something out and you take it away from the watch. Add something
-- and you only have to make sure every strap has a matching rule in
-- html/css/style.css (section ARMBAENDER).
-- ═══════════════════════════════════════════════════════════════
Config.Studio = {
-- May the player mix their own colours, or only pick from the swatches
-- below? false allows the presets only.
freieFarben = true,
-- ── Case shapes ─────────────────────────────────────────────
-- rundung is the corner radius of the glass. 50% gives a round watch.
formen = {
{ id = 'eckig', label = 'Squared', rundung = '58px' },
{ id = 'kissen', label = 'Cushion', rundung = '34px' },
{ id = 'rund', label = 'Round', rundung = '50%' },
},
-- ── Straps ──────────────────────────────────────────────────
-- metall = true uses the metal ramp (light through shadow) and looks
-- like polished metal. metall = false carries the colour flat, which is
-- the way to go for rubber, leather and woven fabric.
baender = {
{ id = 'glieder', label = 'Link Bracelet', metall = true },
{ id = 'geflecht', label = 'Milanese', metall = true },
{ id = 'panzer', label = 'Heavy Link', metall = true },
{ id = 'kette', label = 'Fine Link', metall = true },
{ id = 'sport', label = 'Sport Band', metall = false },
{ id = 'zug', label = 'Solo Loop', metall = false },
{ id = 'leder', label = 'Leather', metall = false },
{ id = 'nylon', label = 'Woven Nylon', metall = false },
{ id = 'ranger', label = 'Field Strap', metall = false },
{ id = 'karo', label = 'Checked Weave', metall = false },
{ id = 'alpin', label = 'Alpine Loop', metall = false },
},
-- ── Colour swatches ─────────────────────────────────────────
-- Three separate rows, because a case needs different tones than a
-- strap, and an accent needs different ones again. Anyone mixing their
-- own colour ends up outside these swatches anyway.
gehaeuseFarben = {
'#dde0e4', '#b9b4a9', '#8d8f95', '#44474e', '#2a2f3a', '#1f2129',
'#c9a227', '#8f5c3a', '#5b6b7d', '#3c5148', '#5a3a4e', '#0f1620',
},
bandFarben = {
'#dde0e4', '#a9a49a', '#8d8f95', '#383b42', '#171922', '#0f1620',
'#1d6fd8', '#00b0a0', '#35d6a6', '#c9a227', '#ff6b35', '#ff375f',
'#a855f7', '#ff9f0a', '#8f5c3a', '#f2e9dc',
},
akzentFarben = {
'#00d4ff', '#0a84ff', '#5e5ce6', '#a855f7', '#ff375f', '#ff453a',
'#ff6b35', '#ff9f0a', '#ffd60a', '#30d158', '#00b0a0', '#f2e9dc',
},
}
-- ═══════════════════════════════════════════════════════════════
-- 6c AGENCY ZERO
-- The Zero app on the watch has two faces.
--
-- If **no** Agency Zero runs on the server, it advertises: it shows what
-- the car is, when it arrives and where to get it. It deliberately shows
-- **no price** there. No car stands on this server, so there is nothing to
-- buy, and a number in that spot reads like one that applies.
--
-- If the Agency Zero does run, the promotion disappears and the price comes
-- from the car itself (Agency-Zero, Config.Kauf). That is where you pay, and
-- a second number would simply be a lie.
-- ═══════════════════════════════════════════════════════════════
Config.Zero = {
-- Where the button on the promotion page leads.
shopUrl = 'https://shop.agencyg.de/en/zero',
}
-- ═══════════════════════════════════════════════════════════════
-- 6 LOCK — numeric code on opening
-- A roleplay element, not protection against players with tools.
-- ═══════════════════════════════════════════════════════════════
-- The watch is locked the first time it is opened. If an Agency Phone is
-- detected it unlocks by itself and never asks for the code.
Config.LockScreen = true -- ask for the code when opening
Config.LockCode = '0000' -- four digits
Config.LockRemember = true -- ask for the code only once per session
Config.UnlockWithPhone = true -- open without a code when an Agency Phone is detected
-- ═══════════════════════════════════════════════════════════════
-- 7 WATCH FACES — the order here is also the paging order
-- puls = default: date, rings, large time, pulse curve, quick dials
-- raster = dense overview with values all around
-- digital = large digital readout with an accent surface
-- klar = reduced, time and date only
-- zeiger = classic hands
-- ringe = activity rings
-- ═══════════════════════════════════════════════════════════════
-- Order on the watch. The first one is also what comes up first when
-- swiping, which is why the default face stands at the front.
Config.Faces = { 'raster', 'puls', 'digital', 'modul', 'bogen',
'klar', 'stapel', 'welle', 'zeiger', 'ringe' }
-- Which watch faces are usable without an Agency Phone. Deliberately very
-- different ones: the default face with all values, a reduced one and a
-- classic one. That way the free watch has a real choice too and does not
-- feel cut down.
-- Anyone who wants all of them and wants to assign their fields freely
-- needs the Phone.
--
-- The face set in Config.DefaultFace MUST appear here, otherwise the free
-- watch starts on a locked face.
Config.FreeFaces = { 'raster', 'klar', 'zeiger', 'stapel', 'bogen' }
-- Your own names for the watch faces.
--
-- Empty means the watch uses its own translation, in all ten languages. What
-- you write here wins, and it wins in every language, so use it for a name
-- that should read the same everywhere and not as a place to translate.
--
-- Config.FaceNames = { raster = 'Cockpit', zeiger = 'Classic' }
--
-- Faces you leave out keep their translated name. The keys are the ids from
-- Config.Faces above.
Config.FaceNames = {}
-- ═══════════════════════════════════════════════════════════════
-- 7b ASSIGNING WATCH FACE FIELDS (Agency Phone only)
-- The two small values to the left of the time and the reading below them
-- can be filled with any value from this list. If you add something here,
-- the interface has to know the key as well (html/js/app.js, function
-- komplikation).
-- ═══════════════════════════════════════════════════════════════
-- Labels in English again so that they get translated. See the note at
-- Config.ActionPresets.
Config.Komplikationen = {
{ id = 'leben', label = 'Health', icon = 'herz', farbe = '#ff453a' },
{ id = 'panzerung', label = 'Armour', icon = 'schild', farbe = '#00d4ff' },
{ id = 'schritte', label = 'Steps', icon = 'schritte', farbe = '#ff9f0a' },
{ id = 'strecke', label = 'Distance', icon = 'karte-pin', farbe = '#5e5ce6' },
{ id = 'kalorien', label = 'Calories', icon = 'blitz', farbe = '#ffd60a' },
{ id = 'puls', label = 'Heart rate', icon = 'herz', farbe = '#ff453a' },
{ id = 'tempo', label = 'Speed', icon = 'tempo', farbe = '#30d158' },
{ id = 'wetter', label = 'Weather', icon = 'sonne', farbe = '#64d2ff' },
{ id = 'kompass', label = 'Compass', icon = 'kompass', farbe = '#a855f7' },
{ id = 'geld', label = 'Agency Pay', icon = 'karte', farbe = '#ff6b35', pro = true },
{ id = 'keine', label = 'None', icon = 'verboten', farbe = '#8e8e93' },
}
-- Defaults for the three fields on the standard face
Config.FaceSlots = {
oben = 'leben', -- upper small value on the left
unten = 'schritte', -- lower small value on the left
zeile = 'puls', -- the reading with its history curve
}
-- ═══════════════════════════════════════════════════════════════
-- 8 APPS — order, visibility and Pro dependency
-- ═══════════════════════════════════════════════════════════════
-- THE LINE BETWEEN FREE AND PRO
--
-- The rule behind it is deliberately simple and obvious to every player
-- at first glance:
--
-- Everything a watch can do on its own is free.
-- Everything that comes from the phone needs the phone.
--
-- That is why not a single core feature is locked. Watch faces, themes,
-- activity, workouts, stopwatch, timer, alarm, weather, compass,
-- speedometer, notifications, the control centre and all settings run
-- fully without a phone. Anyone using the watch for free has a finished
-- device, not a promotional shell.
--
-- Locked is only what could not technically exist without a phone: calls,
-- messages, mail, contacts, paying and pairing with the Companion app.
-- Without an Agency Phone those apps would not be locked apps, they would
-- simply be empty ones.
--
-- pro = true -> needs the Agency Phone
-- pro = false -> always runs
-- ═══════════════════════════════════════════════════════════════
Config.Apps = {
-- ── Needs the Agency Phone ──────────────────────────────────
{ id = 'telefon', label = 'Phone', icon = 'telefon', color = '#34c759', enabled = true, pro = true, kat = 'verbunden' },
{ id = 'nachrichten', label = 'Messages', icon = 'sprechen', color = '#30d158', enabled = true, pro = true, kat = 'verbunden' },
{ id = 'mail', label = 'Mail', icon = 'brief', color = '#0a84ff', enabled = true, pro = true, kat = 'verbunden' },
{ id = 'kontakte', label = 'Contacts', icon = 'personen', color = '#34c759', enabled = true, pro = true, kat = 'verbunden' },
{ id = 'geld', label = 'Agency Pay', icon = 'karte', color = '#ff6b35', enabled = true, pro = true, kat = 'verbunden' },
-- Free: the watch has its own wire to the Companion app and no longer
-- needs the Agency Phone for it (see Config.Companion).
{ id = 'companion', label = 'Companion', icon = 'qr', color = '#00d4ff', enabled = true, pro = false, kat = 'verbunden' },
-- ── Always runs, even entirely without a phone ──────────────
-- Notifications are free on purpose: the watch reports alarms, timers
-- and reached goals by itself. With a phone its messages come on top,
-- so the app is never empty.
{ id = 'meldungen', label = 'Notifications', icon = 'glocke', color = '#ff9f0a', enabled = true, pro = false, kat = 'werkzeug' },
{ id = 'aktivitaet', label = 'Activity', icon = 'herz', color = '#ff2d55', enabled = true, pro = false, kat = 'werkzeug' },
{ id = 'training', label = 'Workout', icon = 'laufen', color = '#a3ff12', enabled = true, pro = false, kat = 'werkzeug' },
{ id = 'stoppuhr', label = 'Stopwatch', icon = 'stoppuhr', color = '#ff9f0a', enabled = true, pro = false, kat = 'werkzeug' },
{ id = 'timer', label = 'Timer', icon = 'sanduhr', color = '#ff9f0a', enabled = true, pro = false, kat = 'werkzeug' },
{ id = 'wecker', label = 'Alarm', icon = 'glocke', color = '#ff9f0a', enabled = true, pro = false, kat = 'werkzeug' },
{ id = 'wetter', label = 'Weather', icon = 'sonne', color = '#64d2ff', enabled = true, pro = false, kat = 'werkzeug' },
{ id = 'kompass', label = 'Compass', icon = 'kompass', color = '#ff453a', enabled = true, pro = false, kat = 'werkzeug' },
{ id = 'karte', label = 'Speedometer', icon = 'karte-pin', color = '#5e5ce6', enabled = true, pro = false, kat = 'werkzeug' },
-- The garage pulls its data from the framework, not from the phone.
-- That is why it runs for free as well. Without a framework it hides
-- itself instead of standing there empty.
{ id = 'garage', label = 'Garage', icon = 'auto', color = '#0a84ff', enabled = true, pro = false, kat = 'fahren' },
{ id = 'zifferblatt', label = 'Watch Face', icon = 'uhr', color = '#ff9f0a', enabled = true, pro = false, kat = 'stil' },
-- Studio: case, strap and colours. It sits next to the watch face app
-- because both answer the same question, namely how the watch looks.
-- Free, this has nothing to do with the Agency Phone.
{ id = 'studio', label = 'Studio', icon = 'farben', color = '#ff375f', enabled = true, pro = false, kat = 'stil' },
-- Agency Zero: your own self-driving car. If no Agency Zero runs on the
-- server the app advertises it, which is why it is there out of the box.
{ id = 'zero', label = 'Zero', icon = 'auto', color = '#e2b649', enabled = true, pro = false, kat = 'fahren' },
-- ── Games ───────────────────────────────────────────────────
-- Not on the watch out of the box: whoever wants them picks them up in
-- the store. The category was already there, it was just empty. All four
-- run without a phone and without a framework - a game that needs a
-- connection is not one.
{ id = 'steigflug', label = 'Ascent', icon = 'sp-flug', color = '#5ac8fa', enabled = true, pro = false, kat = 'spiele' },
{ id = 'turm', label = 'Tower', icon = 'sp-turm', color = '#ffd60a', enabled = true, pro = false, kat = 'spiele' },
{ id = 'reflex', label = 'Reflex', icon = 'sp-ring', color = '#bf5af2', enabled = true, pro = false, kat = 'spiele' },
{ id = 'ausweichen', label = 'Dodge', icon = 'sp-fall', color = '#ff453a', enabled = true, pro = false, kat = 'spiele' },
-- Angy, the built-in assistant (fixed rules, no AI). Runs the watch on request. Can be switched off during setup;
-- then the app does not exist and the crown does nothing new.
{ id = 'agencyai', label = 'Angy', icon = 'agency-a', color = '#e2b649', enabled = true, pro = false, kat = 'system' },
{ id = 'store', label = 'App Store', icon = 'einkauf', color = '#0a84ff', enabled = true, pro = false, kat = 'system' },
{ id = 'einstellung', label = 'Settings', icon = 'zahnrad', color = '#8e8e93', enabled = true, pro = false, kat = 'system' },
}
-- ═══════════════════════════════════════════════════════════════
-- 8c WEATHER
-- Los Santos comes from the game. Everything else are real cities, and
-- the watch fetches those values from open-meteo.com: free, no key and no
-- sign-up, exactly the way the Agency Phone does it.
--
-- If you do not want real cities, empty the list. The app then shows Los
-- Santos only and the location switch disappears.
-- ═══════════════════════════════════════════════════════════════
Config.Wetter = {
staedte = {
'Berlin', 'Hamburg', 'München', 'Wien', 'Zürich',
'London', 'Paris', 'Madrid', 'Rom', 'Amsterdam',
'New York', 'Los Angeles', 'Miami', 'Tokio', 'Dubai',
'Sydney', 'Reykjavik', 'Kapstadt',
},
-- How long fetched values stay valid before asking again (minutes).
frischeMinuten = 15,
}
-- ═══════════════════════════════════════════════════════════════
-- 8a APP STORE
-- Not everything is on the watch out of the box. What is missing the
-- player picks up in the store, and what they do not need they delete
-- again. Both are remembered per character, just like the watch face and
-- the code.
--
-- Pressing and holding an app makes the list wobble: then you can reorder
-- and delete.
-- ═══════════════════════════════════════════════════════════════
Config.AppStore = {
enabled = true,
-- What is installed out of the box. The rest waits in the store.
-- Leaving this list empty means everything is there from the start.
vorinstalliert = {
'telefon', 'nachrichten', 'geld', 'companion', 'meldungen', 'aktivitaet',
'wetter', 'stoppuhr', 'zifferblatt', 'studio', 'zero', 'agencyai',
'store', 'einstellung',
},
-- These can never be deleted. Without settings and the store you could
-- not reach anything any more, without the watch face app no other face,
-- and without Studio no other colour: the theme list moved there from
-- the settings.
-- agencyai belongs here too: it hangs on the crown, and a press that
-- leads nowhere would be worse than one app too many. Whoever does not
-- want it switches it off during setup, and then it is gone entirely.
fest = { 'einstellung', 'store', 'zifferblatt', 'studio', 'agencyai' },
-- How long a download takes in the store (seconds). 0 = instant.
ladedauer = 2.0,
}
-- ═══════════════════════════════════════════════════════════════
-- 8b GARAGE
-- View, locate and call vehicles. The list comes from the framework's
-- database (QBCore: player_vehicles, ESX: owned_vehicles). Without a
-- framework there are no vehicle owners, and then the app disappears.
-- ═══════════════════════════════════════════════════════════════
Config.Garage = {
enabled = true,
-- May the watch call vehicles to you?
-- false = the app only shows and locates.
rufen = true,
-- Calling a vehicle is remote control of that vehicle and therefore the
-- Pro feature of this app. Viewing, locating and locking always stay
-- free, so the app is never empty without a phone.
-- Set to false, everyone may call.
rufenNurPro = true,
-- Seconds between two calls, per player.
abklingzeit = 45,
-- Cost per call. 0 = free.
-- konto: 'bank' | 'cash'
kosten = 0,
konto = 'bank',
-- Only show vehicles that are actually stored. A vehicle already
-- standing on the street cannot be called again.
nurEingelagerte = true,
-- May a vehicle that is already out be located remotely?
orten = true,
-- Lock and unlock doors from nearby (metres).
schliessweite = 15.0,
-- Which vehicle table is read. 'auto' picks by framework.
tabelle = 'auto', -- 'auto' | 'player_vehicles' | 'owned_vehicles'
}
-- Daily step goal. Drives the rings and the notification when it is
-- reached. Entirely free, needs no phone.
Config.Schrittziel = 8000
-- At which hour does the new day begin? That is when steps, distance,
-- active time and calories are set to zero and the old day moves into the
-- history. Game time counts here, not real time.
--
-- 0 = midnight. If you do not want to lose the counter in the middle of the
-- night, put 4 here for example: then 0 to 3 still belong to the day before.
--
-- Restarting the script resets NOTHING. Only the change of day does that.
Config.SchritteReset = 0
-- ═══════════════════════════════════════════════════════════════
-- CONTROL CENTRE
-- Every tile really does something and is remembered. There used to be a
-- battery indicator here; it is gone, because there is nothing to charge
-- in game and the number was therefore pure decoration.
--
-- Order and selection live in 'kacheln'. What is not listed here does not
-- show up; change the order and you change it on the watch.
--
-- Available:
-- mobilfunk Link to the phone. Off = no calls, no notifications
-- flugmodus switches cellular and Wi-Fi off together
-- wlan Network. Off = no pairing, no weather
-- lautlos Watch sounds off
-- licht Light or dark appearance
-- mini The small always-on display at the screen edge, on or off
-- lampe Flashlight (see Config.Lampe)
-- sturz Fall detection on or off (only if the server offers it)
-- sperren Locks the watch immediately (only with a code set)
-- wecker Opens the alarm
-- pay Opens Agency Pay (Agency Phone only)
-- garage Opens the garage
--
-- Gone: 'kino', 'wegpunkt' and 'hierher'. Cinema mode silenced the watch
-- completely and therefore stood next to 'lautlos', which does the same
-- thing more understandably. The two waypoint tiles stood side by side as
-- a pair, one setting a waypoint and the other clearing one; out of two,
-- one is always the wrong one, and the in-game map can do both anyway. If
-- they still appear in an old config, they are silently ignored.
--
-- No longer in the default: wecker, pay and garage. They only open an app,
-- and the quick menu on the crown exists for that: it knows more apps and
-- picks the right ones. Whoever wants them here simply lists them.
-- ═══════════════════════════════════════════════════════════════
Config.ControlCenter = {
kacheln = {
'mobilfunk', 'flugmodus',
'lautlos', 'licht',
'lampe', 'mini',
'sturz', 'sperren',
},
-- Brightness slider below the tiles
hell = true,
}
-- ═══════════════════════════════════════════════════════════════
-- 9 AGENCY PHONE
-- ═══════════════════════════════════════════════════════════════
Config.EnablePhone = true
Config.PhoneResource = 'agency-phone'
-- Where the button in a locked app leads. Straight to the Agency Phone, not
-- to the front page: whoever ends up there is looking for that one product.
Config.ShopUrl = 'https://shop.agencyg.de/en/product/phone'
-- ═══════════════════════════════════════════════════════════════
-- 9b AGENCY COMPANION (phone app)
-- The watch can pair with the Companion app all by itself, entirely
-- without an Agency Phone. It signs in to the relay for that and keeps the
-- connection open from its side, so the server only dials outwards and no
-- port has to be opened.
--
-- kanal:
-- 'auto' if an Agency Phone runs, pairing goes through its connection
-- (one way out instead of two). Without a phone the watch does
-- it itself.
-- 'immer' the watch always has its own channel
-- 'nie' through the phone only; without a phone there is no pairing
-- ═══════════════════════════════════════════════════════════════
Config.Companion = {
enabled = true,
-- 'immer' out of the box: the watch is a device of its own and should
-- appear as one in the app, not as an accessory of the phone. If you
-- want only one way out, switch to 'auto'.
kanal = 'immer',
relay = 'https://api.agencyg.de',
-- How long a pairing code stays valid (seconds).
codeDauer = 600,
-- How many devices a player may have paired at the same time.
maxGeraete = 5,
-- "Find watch" from the app: the watch rings for at most this many
-- seconds if nobody stops it in game.
findenDauer = 60,
}
-- ═══════════════════════════════════════════════════════════════
-- FALL DETECTION AND EMERGENCY CALL
-- The watch notices by itself when something has happened, comes out on
-- its own and offers the emergency call. This runs entirely without an
-- Agency Phone as well: a watch that can do nothing in an emergency would
-- be useless at exactly the moment it is needed.
-- ═══════════════════════════════════════════════════════════════
Config.Sturz = {
enabled = true,
-- How much damage in one hit counts as an emergency.
-- The value is high on purpose: a punch or a fall off a kerb should not
-- wake the watch.
schaden = 35,
-- Impact in a vehicle: speed lost in km/h within one tick.
-- Damage has to occur as well, otherwise every hard brake would be a
-- crash.
tempoverlust = 45,
-- Fall from height: damage taken while falling.
sturzschaden = 20,
-- Seconds the screen stays up on its own.
dauer = 45,
-- Seconds of quiet between two alerts. Without this the watch would
-- speak up once a second during a brawl.
abstand = 30,
-- Where the emergency call goes when NO Agency Phone is present.
-- Leave empty if the server has no way of its own: the watch then says
-- honestly that it could not reach anyone.
-- Both receive: { quelle, art, coords, street }
notrufEvent = '', -- e.g. 'my-dispatch:server:emergency'
notfallEvent = '', -- emergency contact instead of the ambulance
}
-- ═══════════════════════════════════════════════════════════════
-- Agency Pay terminals
-- The watch adopts the terminals of the Agency Phone automatically. Ones
-- entered here are added, and are in turn registered with the phone as
-- well, so both devices know the same set.
-- These terminals work without a phone too.
-- ═══════════════════════════════════════════════════════════════
-- Empty out of the box. The Agency Phone terminals are adopted anyway, and
-- a terminal shipped with the script would be a point on every foreign
-- server that nobody there asked for. Add your own following this pattern:
--
-- { id = 'my_terminal', coords = vector3(25.7, -1347.3, 29.5),
-- merchant = '24/7 Strawberry', label = 'Agency Pay', radius = 3.0 },
--
Config.PayPunkte = {}
-- Should your own terminals also show up on the map?
-- Off as long as nothing stands above. Whoever adds their own terminals and
-- wants them to be findable sets this to true.
Config.PayPunkteBlip = false
-- Which app on the phone continues an app of the watch.
-- On the watch you can read but not write. Start typing a message there and
-- the watch brings out the phone, unlocks it and jumps into the matching
-- app. If an app on the phone is named differently, enter it here.
Config.PhoneApps = {
nachrichten = 'buzz',
mail = 'postbox',
kontakte = 'contacts',
telefon = 'dialer',
geld = 'wallet',
}
-- The watch's own icon on the phone's home screen.
-- Set to false if the phone's full Watch app is used, so that there are not
-- two entries next to each other.
Config.RegisterPhoneApp = false
-- ═══════════════════════════════════════════════════════════════
-- 9b PRO VERIFICATION
-- There is NO secret here. The shared secret lives exclusively in the
-- encrypted server/security.lua. The Pro edition is always decided on the
-- server and only communicated to the client.
-- ═══════════════════════════════════════════════════════════════
Config.Security = {
-- Seconds between the regular re-checks
RecheckSeconds = 300,
-- Allowed clock drift in seconds during the handshake
HandshakeSkew = 30,
-- EMERGENCY ROUTE, OFF out of the box.
-- The intended and secure route is the handshake with the genuine
-- Agency Phone. It is built in from Phone version 26.5.4 onwards and
-- needs no setup whatsoever.
--
-- Only switch this on if the Agency Phone is older and cannot be updated
-- right away. Then this applies: Pro goes to whoever owns the item named
-- below AND whose phone looks genuine. That is weaker than the
-- handshake.
--
-- Careful when choosing the item: 'phone' is a standard item in QBCore
-- that almost every player has from the start. Put it here and you give
-- the Pro edition away to everyone.
AllowItemFallback = false,
PhoneItem = 'agency_phone',
}
-- ═══════════════════════════════════════════════════════════════
-- 10 YOUR OWN TEXTS
-- All translations live in shared/sprachen.lua, ten languages, the same
-- ones as in the Agency Phone. Only your own changes belong here. What
-- stands here wins over the shipped translation and survives every update
-- of the script.
--
-- Example:
-- Config.Text = {
-- de = { apps = 'Programme', p_senden = 'Abschicken' },
-- en = { apps = 'Programs' },
-- }
-- ═══════════════════════════════════════════════════════════════
Config.Text = {}
-- Look up a label. Order: your own text, the selected language, English as
-- the fallback. The raw key never appears.
function T(schluessel)
local code = Config.Locale or 'en'
local eigen = Config.Text[code]
if eigen and eigen[schluessel] then return eigen[schluessel] end
local sprache = Sprachen[code]
if sprache and sprache[schluessel] then return sprache[schluessel] end
return Sprachen.en[schluessel] or ''
end