Changelog — v1.14.1

Changes since v1.14.0

Summary

This release adds an offline custom functions framework so staff can trigger custom server-side actions against players who are not currently connected. It also adds Discord staff commands, mugshot deduplication, improved jaksam_inventory stash compatibility, and wasabi_ambulance_v2 revive support. Several config options have been consolidated — advanced_configuration.json has been removed and its settings merged into config.json.

What's New

Features

  • Offline custom functions — new offline_button addon type lets you run custom server-side logic against offline players (by charId / uniqueId) from the offline player management dialog. New RegisterOfflineAddonCallback server helper and OfflineAddonTarget type included.
  • Discord staff commands — additional staff-oriented bot commands and event handling.
  • Mugshot deduplication — prevents duplicate mugshots from being stored per player.
  • jaksam_inventory compatibility — inventory.getStash now supports jaksam_inventory for trunks, gloveboxes, and generic stashes.
  • wasabi_ambulance_v2 support — player.revive now prefers wasabi_ambulance_v2 when present, falling back to the original wasabi_ambulance.
  • Configurable prop render distance — new props_render_distance option in config.json.
  • Disable map option — new advanced_configuration.disable_map option in config.json for servers that don't want the live map module.

Other

  • Removed standalone config/advanced_configuration.json — settings moved into config.json under loop_delays and a new advanced_configuration section. You may need to migrate any customizations manually.
  • Removed the bundled server/vendor/discord_sdk.cjs build artifact.

File Changes

⚙️ Configuration & Bridge Files

These files are not encrypted. Review the changes below — you may need to manually apply updates to your server's config files.

fxmanifest.lua

use_experimental_fxv2_oal 'yes'

 author 'luxu-gg'
 description 'Admin menu for FiveM'
-version '1.14.0'
+version '1.14.1'

 dependencies {
     'oxmysql',

bridge/server/inventory.lua

 function inventory.getStash(typeofStash, id)
             local items = result and json.decode(result) or {}
             return items
         end
+    elseif isResourceRunning("jaksam_inventory") then
+        if typeofStash == "trunk" or typeofStash == "glovebox" then
+            return exports['jaksam_inventory']:getInventoryIdFromPlate(id, typeofStash)
+        else
+            return exports['jaksam_inventory']:getInventory(id)
+        end
     elseif isResourceRunning("core_inventory") then
         return exports.core_inventory:getInventory("stash-" .. id)
     end

bridge/server/player.lua

 function player.revive(source)
     TriggerClientEvent('visn_are:resetHealthBuffer', source)

-    if GetResourceState('wasabi_ambulance') == "started" then
+    if GetResourceState('wasabi_ambulance_v2') == "started" then
+        exports['wasabi_ambulance_v2']:RevivePlayer(source)
+    elseif GetResourceState('wasabi_ambulance') == "started" then
         exports.wasabi_ambulance:RevivePlayer(source)
     elseif GetResourceState("qs-medical-creator") == "started" then
         TriggerClientEvent('ambulance:revivePlayer', source, true, true)

config/advanced_configuration.json (deleted)

This file has been removed. Its settings were merged into config.json. If you had customized these, re-apply the changes to config.json under loop_delays / new advanced_configuration section.

config/config.json

   "hierarchy_protection": true,
   "default_duty": false,
   "default_dark_mode": true,
+  "props_render_distance": 1000,
   "branding": {
     "name": "FiveM Community",
     "logo": "./server_logo.png",
     "__comment__": "'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'top-center' | 'bottom-center'"
   },
   "loop_delays": {
-    "coords_update": 10000
+    "coords_update": 10000,
+    "jail_coordinate_check": 5000
   },
   "optimization": {
     "_comment_": "Tweak these settings based on your server performance",
   "telemetry": {
     "enabled": true,
     "__comment__": "No personal data is sent. Fully anonymous data is sent. Disable this if you don't want luxu to receive errors and relevant logs."
+  },
+
+  "advanced_configuration": {
+    "disable_map": false
   }
 }

config/custom_functions/client.lua

RegisterAddons({
         end,
     },

+    -- Offline Button: appears in the offline player management dialog
+    {
+        type = "offline_button",
+        name = "example_offline_button",
+        label = "Wipe Inventory",
+        icon = "mdi:bag-personal-off",
+        color = "#ef4444",
+        -- permission = "some.permission", -- optional
+        ---@param target OfflineAddonTarget table { charId, uniqueId, name, identifiers }
+        ---@param callServer fun(...): any calls RegisterOfflineAddonCallback in server.lua
+        handler = function(target, callServer)
+            local result = callServer()
+            print("Offline action result for", target.name, "->", result)
+        end,
+    },
+
     -- Quick Action: appears in Quick Menu > Main tab, supports options
     {
         type = "quick_action",

config/custom_functions/server.lua

 RegisterAddonCallback("custom_button_1", function(source, target, argument1)
     return true
 end)

+--- Offline Addon Callback: paired with a `type = "offline_button"` addon in client.lua
+--- target is { charId, uniqueId, name, identifiers } - the player is NOT in the server.
+--- Always validate inputs and enforce permissions/duty before mutating data.
+RegisterOfflineAddonCallback("example_offline_button", function(source, target)
+    print("example_offline_button: staff source:", source)
+    print("example_offline_button: target charId:", target.charId, "uniqueId:", target.uniqueId)
+    -- e.g. MySQL.update.await('DELETE FROM inventory WHERE charId = ?', { target.charId })
+    return true
+end)
+
 --- Custom Statistic Blocks

 RegisterAddonStatisticBlocksCallback("test_block_1", function(source)

config/custom_functions/types.lua

 ---@field label string
 ---@field icon string
 ---@field color string
----@field type 'button' | 'quick_action' | 'quick_toggle'
+---@field type 'button' | 'offline_button' | 'quick_action' | 'quick_toggle'
 ---@field options? string[] -- Sub-options displayed in the quick menu (for quick_action and quick_toggle)
 ---@field handler fun(...): any
 ---@field permission? string

+---@class OfflineAddonTarget
+---@field charId string
+---@field uniqueId string
+---@field name string
+---@field identifiers string[]
+
 ---@class Zone
 ---@field id string
 ---@field points [number, number][]

Full list of files changed

Change File
Modified fxmanifest.lua
Modified bridge/server/inventory.lua
Modified bridge/server/player.lua
Deleted config/advanced_configuration.json
Modified config/config.json
Modified config/custom_functions/client.lua
Modified config/custom_functions/server.lua
Modified config/custom_functions/types.lua
Modified client/modules/nui.lua
Modified client/modules/props.lua
Modified client/utils/cl_functions.lua
Modified client/utils/cl_user_addon.lua
Modified server/modules/jail.lua
Modified server/utils/sv_user_addon.lua
Deleted server/vendor/discord_sdk.cjs
Modified server/index.js
Modified shared/init.lua
Modified web/