Version 1.25.0
Highlights
- Built-in default notification & help-prompt UI — sky_base now ships its own on-screen notification and "Press E" help-prompt UI, replacing the bare native GTA notifications. Notifications support a type/colour (
info,success,error,warn) and a custom duration, for a consistent look across every Sky resource out of the box. - New phone integrations: RoadPhone, okokPhone, and qs-smartphone V3 — all three are now supported phone backends, auto-detected and selectable via
Config.phone. okokPhone and RoadPhone also support custom phone apps and app notifications through the existing phone bridge. - Inventory layer rebuilt, clean adapter style — one focused file per inventory under
config/inventory/, a shared normalization layer, and a single set of fallbacks. Adapters are smaller and consistent, and the framework files shrank substantially. - New inventory support:
core_inventory,origen_inventory,jpr-inventory— auto-detected and selectable viaConfig.inventory = "core","origen", or"jpr". - Framework-native inventory is the default — when no standalone inventory is detected, the framework's own inventory (ESX/QBCore/Qbox/VRP) is used and fully driven by the framework. Pin it explicitly with
Config.inventory = "esx" | "qb" | "qbox" | "vrp". - Richer inventory API — stashes, shops, trunk and vehicle-plate helpers are now exposed through the bridge for inventories that support them, and report cleanly as unsupported otherwise.
Notable Changes
okokPhoneadapter — phone-number lookups, custom app registration, and notifications now route through okokPhone. Auto-detected whenConfig.phone = "auto", or pin it with"okok".qs-smartphone V3adapter — Quasar's smartphone V3 is now a supported phone backend, auto-detected or selectable withConfig.phone = "qs".roadphoneadapter — RoadPhone is detected and prioritised whenConfig.phone = "auto"; custom RoadPhone apps are supported (RoadPhone registers custom apps statically, so a custom app returns aconfig.jsonentry).codembanking now uses framework-native banking — the dedicated codem banking adapter has been removed.Config.banking = "codem"now resolves to your framework's own banking backend (qbon QBCore,renewedon Qbox,esxotherwise) and logs an informational note. No action needed forConfig.banking = "auto".- New vehicle-key providers — added AK47 vehicle keys (
Config.vehiclekeys = "ak47") and jc_vehiclekeys (aliasConfig.vehiclekeys = "jota"), both auto-detected. - DS-ServerCreator garage detection — DS-ServerCreator is now auto-detected as a garage backend and added to the garage value list (
ds-servercreator). - ESX legacy shared-object loading — sky_base now resolves the ESX shared object through both the modern export and the legacy
esx:getSharedObjectpath, so it no longer aborts when the export is briefly unavailable during a server restart. This prevents dependent resources (e.g. sky_mechanicjob) from losing usable-item handling after a full restart. - Configurable interaction marker draw buffer — new
Config.interactionDrawBuffercontrols the extra range beyondinteractionDistancewhere markers are rendered and tracked, for finer control over marker visibility. - Czech locale — added Czech (
cz) translations. - All inventory logic now lives under
config/inventory/. Framework-native inventory moved intoconfig/inventory/native/<framework>.lua; theconfig/framework/<framework>.luafiles now contain framework logic only and are much smaller. The active inventory is selected once and routed to a single adapter — no more per-function resource branching. - New
Sky.FWinventory functions:RegisterStash,OpenStash,ClearStash,AddStashItems,OpenPlayerInventory,RegisterShop,OpenShop,AddTrunkItems,UpdatePlate, plus helpersGetResourceName,GetPlayerInventory,GetItemBySlot,GetItemInfo,StripPNG,StripWebp. When the active inventory does not support a feature, the call logs an English debug line and returnsfalse. - ⚠️
AddItem/RemoveItemsignature changed — both are now(source, item, amount, slot, metadata). The legacyforceargument is removed and an optionalslotis added at position 4 (RemoveItemcan target a specific slot, then metadata-match, then any). All Sky resources (police / ambulance / mechanic / jobs_base) are already migrated. External resources that calledSky.FW.AddItem(src, item, amount, force, metadata)with aforceboolean, orSky.FW.RemoveItem(src, item, amount, metadata)with metadata at position 4, must update to the new argument positions. All other inventory/weapon functions keep their names, signatures, and return shapes (RemoveItemstill returns the number removed). - EmmyLua annotations — every
Sky.FWinventory function now carries---@param/---@returndocumentation. - Inventory read caching for every inventory —
HasItem(short TTL), the item catalog, and item labels are now cached uniformly across all inventories (previously framework-native only), cutting repeated export calls.Sky.FW.InvalidateItemCountCache(source, itemName?)clears theHasItemcache. - Consistent metadata matching & slot normalization across every adapter, resolving subtle differences between inventories in metadata-filtered lookups.
Other Changes
- Removed the automatic
+1.0Z offset on type-1 interaction markers — markers now draw at their configured coordinates, while explicit per-marker offsets still apply. - Removed
config/banking/codem.lua— codem banking now maps to the framework-native banking backend. - Removed
config/inventory/{esx,qb,qbox,vrp}.lua— framework-native inventory now lives underconfig/inventory/native/. - Auto-detection registers
core_inventory,origen_inventory, andjpr-inventory;origenis preferred overoxwhen both are present.
- Download sky_base from the CFX Portal.
- Create a backup.
- Replace the
/sourcefolder (includes the new built-in notification UI files). - Replace
/fxmanifest.lua(version1.25.0; loads the notification UI page and the rebuilt inventory layer). - Replace the
/config/frameworkfolder (inventory logic removed from each framework file; ESX legacy shared-object fix). - Replace the
/config/functions.luafile (new default notification & help-prompt UI). - Replace the
/config/phonefolder (newroadphone.lua;okok.lua,qs.luaupdated for okokPhone and qs-smartphone V3). - Replace the
/config/vehiclekeysfolder (newak47.lua,jota.lua). - Replace the
/config/bankingfolder and delete the oldconfig/banking/codem.luaif you keep customized files (codem now uses framework-native banking). - Replace the
/config/localesfolder (newcz.lua). - Replace the
/config/inventoryfolder — it now holds the per-inventory adapters plus a newnative/subfolder. Delete the oldconfig/inventory/esx.lua,qb.lua,qbox.lua, andvrp.luaif you keep customized files (their logic moved toconfig/inventory/native/). - In
config/config.lua, update the value-list comments:
-phone = "auto", -- auto, esx, qb, d, gks, lb, lb-unique, yseries, codem, roadphone
+phone = "auto", -- auto, esx, qb, qs, d, gks, lb, lb-unique, yseries, codem, okok, roadphone
-garage = "auto", -- auto, esx, qb, qbox, quasar, okok, jg, cd, bp, my, vms, op - can be customized in config/garage
+garage = "auto", -- auto, esx, qb, qbox, quasar, okok, jg, cd, bp, my, vms, op, ds-servercreator - can be customized in config/garage
-vehiclekeys = "auto", -- auto, qb, vehicles_keys, mrnewb, mk, quasar, wasabi, msk, brutal, kiminaze - can be customized in config/vehiclekeys
+vehiclekeys = "auto", -- auto, qb, vehicles_keys, mrnewb, mk, quasar, wasabi, msk, brutal, kiminaze, ak47, jota - can be customized in config/vehiclekeys
-inventory = "auto", -- auto, esx, qb, qbox, vrp, ox, qs, ps, codem, tgiann, jaksam, ak47, one, hex - can be customized in config/inventory
+inventory = "auto", -- auto, esx, qb, qbox, vrp, ox, qs, ps, codem, tgiann, jaksam, ak47, one, core, origen, jpr, hex - can be customized in config/inventory
Config.phone, Config.garage, Config.vehiclekeys, and Config.inventory all default to "auto" and pick up the new adapters automatically — set a specific value only to pin one manually. To tune marker draw range, add interactionDrawBuffer (optional):
+interactionDrawBuffer = 20.0, -- extra range beyond interactionDistance where markers are drawn and tracked
- If you call
Sky.FW.AddItem/Sky.FW.RemoveItemfrom your own resources: update the 4th argument — it is nowslot(notforce). Replace aforceboolean withnil, and forRemoveItemmove metadata to the 5th position (RemoveItem(src, item, amount, nil, metadata)). Sky's bundled job resources are already updated. - No SQL migration required.
Version 1.24.0
Highlights
- New
one_inventorysupport — auto-detected and selectable viaConfig.inventory = "one". Item, metadata, slot, and weapon handling all route through one_inventory. - New
codembanking backend — auto-detected and selectable viaConfig.banking = "codem". Job/society balances are read and updated through codem banking, with an automatic fallback to your framework's banking when needed. - Custom phone apps — sky_base can now register custom phone apps and push app notifications through the active phone adapter (currently
lb,codem, androadphone), so dependent resources can surface their own phone UI and alerts. - Streamed interaction NPCs — interaction-point peds now spawn and despawn based on player proximity, lowering the client entity count and improving performance on maps with many NPCs. Controlled by
Config.streamNpcEnabled(setfalsefor the previous "always spawned" behaviour).
Notable Changes
one_inventoryadapter — addsconfig/inventory/one.luaand registers one_inventory in auto-detection.Config.inventory = "auto"picks it up automatically; set"one"to pin it.codembanking adapter — addsconfig/banking/codem.lua. Auto-detection recognises codem banking and prefers it when present, resolving the correct backend and ensuring job accounts exist on first use.- Custom phone app exports —
exports["sky_base"]:RegisterCustomPhoneApp(app),exports["sky_base"]:SendCustomPhoneAppMessage(identifier, data), andexports["sky_base"]:SendPhoneAppNotification(data)are available for supported phone adapters. RoadPhone custom apps return aconfig.jsonentry because RoadPhone registers custom apps statically. - Interaction NPC streaming options — new
Config.streamNpcDistance(range a player must be within for an NPC to exist) andConfig.streamNpcRefreshMs(how often the streaming pass re-evaluates distances) tune the new behaviour. - Database index management —
Sky.DB.Migratenow ensures declared indexes are present on already-existing tables, creating plain indexes asynchronously in the background so startup is not blocked. A newSky.DB.EnsureIndexutility adds an index or unique key to an existing table; it is idempotent and safe to call on tables sky_base does not own. Unique keys are applied only when a table is first created, to avoid failures on pre-existing data. - Standardized job-member lists —
Sky.FW.GetJobUsersnow includes each member'snameon ESX, QBCore, and QBox, removing a separate name lookup per member (faster boss menus). - ESX weapon name normalization — weapon names passed to ESX are now consistently upper-cased, preventing case-sensitivity failures on weapon add, remove, and possession checks.
- Ordered resource auto-detection — when several running resources could map to the same config option, detection now follows a defined priority order instead of an arbitrary one.
Other Changes
- Removed the dedicated
hexinventory bridge — withConfig.inventory = "hex", sky_base now uses the configured framework's own inventory functions instead of a separate adapter file. - Interaction NPCs are now cleaned up on resource restart, preventing orphaned peds.
- Optimized marker interaction handling for interaction points.
- Download sky_base from the CFX Portal.
- Create a backup.
- Replace the
/sourcefolder. - Replace
/fxmanifest.lua(version1.24.0). - Replace the
/config/phonefolder (all phone adapters updated for custom phone app support). - Replace the
/config/frameworkfolder (esx.lua,qb.luaupdated). - Replace the
/config/inventoryfolder — adds the newone.luaand deletes the removedhex.lua(delete the oldconfig/inventory/hex.luaif you keep customized files). - Replace the
/config/bankingfolder (newcodem.lua). - In
config/config.lua, update the phone/inventory/banking value-list comments and add the new NPC-streaming options:
-phone = "auto", -- auto, esx, qb, d, gks, lb, lb-unique, yserie, codem
+phone = "auto", -- auto, esx, qb, d, gks, lb, lb-unique, yseries, codem, roadphone
-inventory = "auto", -- auto, esx, qb, qbox, vrp, ox, qs, ps, codem, tgiann, jaksam, ak47, hex - can be customized in config/inventory
+inventory = "auto", -- auto, esx, qb, qbox, vrp, ox, qs, ps, codem, tgiann, jaksam, ak47, one, hex - can be customized in config/inventory
-banking = "auto", -- auto, sky, crm, qs, okok, bablo, fd, rx, tgg, kartik, esx, qb, renewed, wasabi, groot, ak47, jaksam - can be customized in config/banking
+banking = "auto", -- auto, sky, crm, codem, qs, okok, bablo, fd, rx, tgg, kartik, esx, qb, renewed, wasabi, groot, ak47, jaksam - can be customized in config/banking
+streamNpcEnabled = true, -- only spawn interaction-point NPC peds while the player is within streamNpcDistance (set false for legacy: peds exist everywhere at once)
+streamNpcDistance = 100.0, -- range a player must be within for an interaction NPC ped to exist; despawns past streamNpcDistance + 20%
+streamNpcRefreshMs = 1000, -- how often (ms) the streaming pass re-evaluates ped distances when no point is in interaction range
Config.phone = "auto", Config.inventory = "auto", and Config.banking = "auto" pick up the new adapters automatically — set "roadphone", "one", or "codem" only to pin them manually.
10. No SQL migration required.