Commit Graph

8068 Commits

Author SHA1 Message Date
Selt f98a6e2245 fix(cron): keep the scheduler alive when a job errors
Registered jobs are third party callbacks and were invoked bare. An error inside
one propagates out of OnTime into Tick, so Tick never reaches its
SetTimeout(60000, Tick) at the end and nothing ever reschedules it. From that
moment cron is dead for every resource on the server - paychecks, cleanups,
anything registered through cron:runAt - until a restart. The operator sees one
stack trace and then silence.

Wrapping the callback keeps the loop and the reschedule intact, and names the job
that failed.

Simulated the scheduler chain in standalone Lua with three jobs where the first
raises: before, the tick died before SetTimeout and the two later jobs never ran
again; after, the failure is reported and both later jobs fire.
2026-07-27 21:17:12 +02:00
Selt 19272bc3e8 fix(es_extended/locale): return a single value from TranslateCap
TranslateCap returned the result of gsub directly, and gsub returns the string
plus the number of substitutions. Whenever TranslateCap is the last argument of
a call, that count is passed along as an extra argument.

The common case is showNotification(msg, notifyType, ...), which is called with
just the message in about 49 places in the core. Those all pass notifyType = 1
instead of nil, so the notification is rendered with a numeric type rather than
the intended default. 71 call sites in total have TranslateCap in trailing
position.

Wrapping the call in parentheses truncates it to one value. The string itself is
unchanged, and nothing reads the second value.
2026-07-27 21:14:26 +02:00
Selt 6cbc408102 fix(esx_lib): correct isArray, toPascal and replace helpers
Three small logic bugs in the shared helpers, each verified with a standalone Lua
run.

isArray returned true for sparse tables like {[1]=1,[3]=3}: the in-loop
`count > maxIndex` check can never fire (with positive integer keys count is always
<= maxIndex), so it was dead code. Dropped it and return `count == maxIndex`, which
is false for gaps and still true for a dense sequence or an empty table.

toPascal lowercased the letters after an underscore: `[%w_]*` swallowed the
underscore and the next word into the part that gets lowercased, so "hello_world"
became "Helloworld". Excluding the underscore from that class leaves each word to be
capitalised, then the trailing gsub removes the underscores -> "HelloWorld".

replace escaped the pattern but not the replacement, so a "%" in the replacement
raised "invalid use of '%' in replacement string" and "%1" style sequences expanded
captures. Escape "%" in a string replacement; a function or table replacement is
left untouched.
2026-07-27 20:22:11 +02:00
Selt 0fb74a74ef fix(esx_inventory): let the quantity dialog accept a corrected amount
The quantity dialog resolved its promise with nil on an invalid amount, so the
give/remove had already aborted by the time the player typed a valid value. The
dialog stayed open and a corrected amount did nothing.

Dropping the early resolve leaves the promise pending, so the same open dialog
accepts the retry and drops/gives the item. Cancel still resolves nil.

Tested on artifact 25770: entered an over-count amount, got "invalid amount",
corrected to a valid amount. Before, nothing happened; after, the item was
dropped.
2026-07-27 20:12:50 +02:00
Selt d3aaab0692 perf(esx_multicharacter): index the columns used by character deletion
Deleting a character runs one DELETE per table that has an identifier/owner
column, all in a single transaction. Only users.identifier is indexed; the other
core tables (billing, owned_vehicles, user_licenses, society_moneywash,
addon_account_data, addon_inventory_items, datastore_data) have no usable index on
the delete column, so each DELETE is a full table scan and they all hold locks at
once.

Measured on 200k rows per table (MariaDB 12.3.2): the transaction went from about
1573 ms to about 22 ms once the seven columns are indexed, EXPLAIN going from
type=ALL scanning ~200k rows to a single-row index lookup per table. The addon and
datastore tables were the worst because their composite indexes do not lead with
the delete column, so they cannot serve WHERE owner = ?.

Adds the indexes to legacy.sql for fresh installs and a migration for existing
databases. The migration checks INFORMATION_SCHEMA for an index that leads with the
column (SEQ_IN_INDEX = 1) and only creates one where it is missing, so it is a no-op
on databases that already have it and re-running is guarded by the migration key.
2026-07-27 19:21:31 +02:00
Selt 12f92e33a4 fix(es_extended/server): skip unspawned players in the bulk save
Core.SavePlayer already refuses to save a player whose spawned flag is not set,
because an unspawned player has no server-side ped and getCoords/health return
0,0,0 / 0. Core.SavePlayers, the bulk autosave that runs every few minutes and on
restart/shutdown, had no such guard and saved every player in ESX.Players.

A player still in the load or character-selection window when the autosave fires
gets their row overwritten with position 0,0,0 and health 0. On the next load the
default-spawn fallback does not kick in, since a decoded {"x":0.0,...} is truthy,
so they spawn at the world origin, and with SaveDeathStatus on, dead.

Guard the loop with the same spawned check, and skip the query entirely when no
spawned player remains.

Tested on artifact 25770: forced a connected player to spawned=false and ran
saveall. Before, the player's row was overwritten (the save ran); after, the row
was left untouched and no save was issued.
2026-07-27 19:14:25 +02:00
zykem 5354e278de Merge pull request #1786 from rock1565/main
fix SQL parameter passing in setProps to save complex modifications
2026-07-27 16:31:59 +02:00
zykem 490a6cbfdd Merge pull request #1809 from ASTROWwwW/fix/esx-lib-resource-name
fix(esx_lib): load imports from the correct resource name
2026-07-27 16:24:05 +02:00
ASTROWwwW 477b71384f fix(esx_lib): load imports from the correct resource name
xLib.name was "xLib", which is not a resource, so the import metatable fed it to LoadResourceFile and resolved nothing. It failed silently on Legacy and hard-errored on Enhanced (Resource 'xLib' not found). Point it at the real resource name.
2026-07-27 00:25:14 +02:00
ASTROWwwW 94002da05b feat(esx_lib): add isEnhanced game edition detection
xLib.isEnhanced() returns whether the game runs GTA V Enhanced (server: gamename convar, client: IsGameEnhancedVersion native). es_extended reads it once and requires OneSync Infinity on Legacy only, since Enhanced runs OneSync natively.
2026-07-23 20:51:21 +02:00
Ihsan ca597cf6f4 Merge pull request #1805 from rwixy/main
feat(server.cfg): add esx_lib to default resources
2026-07-21 12:30:28 +05:30
Arctos. f331465bbe Merge pull request #1807 from esx-framework/chore/bump-1.14.0
chore: bump manifest version to 1.14.0
2026-07-18 17:01:23 +02:00
ASTROWwwW 511f5fc74e chore: bump manifest version to 1.14.0 2026-07-18 16:58:18 +02:00
Ihsan d80a38c485 feat(server.cfg): add esx_lib to default resources 2026-07-18 15:37:12 +05:30
Ihsan e7788b2bb4 feat: integrate Medal.tv globally 2026-07-18 14:42:02 +05:30
_Not_ 116d045b98 Merge pull request #1801 from esx-framework/1.14.0
feat(esx_lib): upgrade esx_core to 1.14.0
1.14.0
2026-07-17 08:16:34 -05:00
_Not_ e4ec1a66e7 Merge pull request #1802 from ASTROWwwW/fix/xlib-table-clobber
fix(esx_lib): stop the table module from overwriting the stdlib
2026-07-16 23:47:09 -05:00
ASTROWwwW a33913aa41 fix(esx_lib): stop the table module from overwriting the stdlib 2026-07-16 14:51:53 +02:00
_Not_ 915332b092 Fix typo in ESX.Table.SizeOf assignment in compat.lua 2026-07-16 00:58:00 -05:00
_Not_ 9a4c492b51 Add initialization for ESX.Table in compat.lua 2026-07-16 00:55:38 -05:00
_Not_ 48e19810ce Merge remote-tracking branch 'Astro/feat/xlib-waitfor' into 1.14.0 2026-07-15 23:51:13 -05:00
_Not_ 65961a4740 Merge remote-tracking branch 'Astro/feat/esx-lib-pubsub' into 1.14.0 2026-07-15 23:49:28 -05:00
_Not_ 2a303f4e41 Merge remote-tracking branch 'Astro/refactor/move-modules-to-lib' into 1.14.0 2026-07-15 23:48:51 -05:00
_Not_ 51ada6d4f5 Merge remote-tracking branch 'Snail/esx_lib' into 1.14.0 2026-07-15 23:44:49 -05:00
_Not_ 72c13cd08f Merge remote-tracking branch 'Zuntie/esx_lib' into 1.14.0 2026-07-15 23:42:23 -05:00
_Not_ 5cf6a78111 Merge remote-tracking branch 'Stane/esx_lib' 2026-07-15 23:39:44 -05:00
Astrxw 40139a1a4a Update shared.lua 2026-07-15 17:20:18 +02:00
ASTROWwwW cf61bbd0c3 feat(esx_lib): add xLib.waitFor 2026-07-15 16:23:01 +02:00
rockDEV 16e33d0d4c 提供更好的SQL处理模式 2026-06-26 00:55:58 +08:00
ASTROWwwW 2d1facf59d feat(esx_lib): add a pub/sub multicast module
Adds xLib.pubsub for server-driven topic multicast: a producer resource
subscribes players to a topic server-side and publishes data that is pushed
only to the subscribed players. Clients listen with xLib.pubsub.on and never
subscribe or publish themselves.

The subscription registry is a single shared instance in the esx_lib server VM,
reached cross-resource through exports; the client side is a per-VM listener
over one net event. Subscriptions are cleaned up on playerDropped, so a reused
serverId never inherits them, and on the owning resource stopping.

Also adds xLib.triggerClientEvent, which packs the payload once when sending to
many players; publish uses it so a broadcast to N subscribers serialises once.
2026-06-25 02:16:43 +02:00
ASTROWwwW 409c2ccc63 refactor(esx_lib): move the player-state cache into the lib
Adds a generic xLib.cache (ped, vehicle, seat, weapon, coords) modelled on
ox_lib cache and framework agnostic, and rewires es_extended to source ped and
weapon from it which removes the per-frame ped poll. The vehicle enter/exit
state machine and every esx: event are kept unchanged through a thin glue.
2026-06-24 18:39:07 +02:00
Astrxw 6acaedde1f refactor(esx_lib/game): preserve original networked guard in spawnVehicle move 2026-06-17 15:45:53 +02:00
ASTROWwwW 88a883973a chore(esx_lib/callback): gate callback ownership logs behind xLib:debug 2026-06-16 21:03:41 +02:00
ASTROWwwW c32138eedd feat(esx_lib/onesync): move onesync query helpers to xLib
Moved getPlayersInArea / getClosestPlayer / getPedsInArea / getObjectsInArea /
getVehiclesInArea / getClosestPed / getClosestObject / getClosestVehicle to
xLib; es_extended re-exposes them through server compat shims.

Flagged: getNearbyPlayers iterates ESX.Players (es_extended server state),
which is not portable across the lib boundary - the lib relies on that global
being present at call time.
2026-06-16 21:03:41 +02:00
ASTROWwwW 700b7a646b feat(esx_lib/game): move game spawn/pool/closest/area and vehicle properties to xLib
Integrated fix during the move:
- spawnVehicle uses the computed isNetworked for the network-id/migrate guard,
  fixing the original that branched on the raw networked argument

modSmokeEnabled preserved as-is in get/setVehicleProperties (flagged: the set
path toggles mod 20 without applying a smoke color, matching legacy behavior).

Non-portable substitution documented:
- ESX.PlayerData.ped -> PlayerPedId() (ESX.PlayerData is not available in the lib VM)
2026-06-16 21:03:41 +02:00
ASTROWwwW 3fd3bf7877 feat(esx_lib/interactions): move interactions to xLib 2026-06-16 21:03:41 +02:00
ASTROWwwW ca278be1da feat(esx_lib/points): move points and Point class to xLib
Integrated fixes during the move:
- monotonic handle counter (handleCount) instead of count+1; no handle
  collision after a point is removed
- unified single proximity loop: per-frame inside() plus a 500ms enter/leave
  scan, adaptive Wait(next(insidePoints) and 0 or 500), replacing the previous
  two separate loops
- emptiness detected via next() instead of # on a sparse-keyed table

Non-portable substitutions documented:
- ESX.PlayerData.ped -> PlayerPedId() (ESX.PlayerData is not available in the
  lib VM)
- GetGameTimer() used to gate the 500ms scan within the single loop
2026-06-16 21:03:41 +02:00
ASTROWwwW 6a72181992 feat(esx_lib/scaleform): move scaleform helpers to xLib 2026-06-16 21:03:41 +02:00
ASTROWwwW f4af0d90bd feat(esx_lib/streaming): move streaming request helpers to xLib 2026-06-16 21:03:41 +02:00
SNAILX 14995bb9e6 Merge branch 'esx-framework:esx_lib' into esx_lib 2026-06-15 02:09:51 +01:00
SNAILX d3868429ed Moved esx.table from the core to esx_lib 2026-06-15 02:08:30 +01:00
Qiu 2c0f85f817 使用改车插件时该语句导致状态无法更新 用更好的方式处理了 2026-06-11 12:34:58 +08:00
Fezz f9a93070c1 Merge pull request #1784 from esx-framework/change-urls
Change domains
2026-05-25 11:16:26 +01:00
Arctos. de98981ea6 Change domains 2026-05-25 12:12:51 +02:00
zykem c0260923bb Merge pull request #1781 from esx-framework/chore/bump-1.13.5
chore: bump manifest version to 1.13.5
2026-05-08 11:33:44 +02:00
zykem#0643 efedf3c303 chore: bump manifest version to 1.13.5 2026-05-08 11:30:59 +02:00
zykem 82188ac761 Merge pull request #1780 from FabianTerhorst/main
fix: mysql.ready called before functions.lua is loaded
1.13.5
2026-05-08 10:46:57 +02:00
Fabian Terhorst 55355cbf56 fix: mysql.ready called before functions.lua is loaded 2026-05-07 19:13:55 +01:00
Kremu a5cf56f672 Merge pull request #1752 from SNAILX808/esx_lib
Refactor keybind registration to use xLib.addKeybind
2026-01-14 16:24:14 +01:00
Kremu 638a60ce7b Merge branch 'esx_lib' into esx_lib 2026-01-14 16:24:01 +01:00