lation scripts
scriptsmembershipdocs
see the scripts
Skip to Content
lation ui
lation interact
lation banking
lation shops
lation jobs
lation weed
lation chop shop

classics

money laundering
drug sales
coke processing
meth crafting
metal detecting
scuba diving
PlayersConfigurationDevelopersChangelog
scuba diving

Configuration

Every scuba diving option in the four files under config/, with its key, default value and what it changes, plus the text prompt setting and languages.

scuba diving is set in four Lua files under config/, which ship open. Each one returns a table, read when the script starts, so a change applies after stop lation_diving and ensure lation_diving.

FileHolds
config/shared.luaSetup, start, experience, gear, shops, boat rental, zones and crates
config/client.luaStats and blips and animations
config/server.luaLogging
config/icons.luaIcons

The key is the option's path inside its file, for example setup.notify in config/shared.lua.

Setup

In config/shared.lua.

KeyDefaultNotes
setup.debugfalseShows the zone spheres and adds the debugzones command (below). Leave it off on a live server.
setup.interact'ox_target'Also 'qb-target', 'interact' (the resource named interact) or 'custom'. It isn't detected, so set it to what you run. lation interact works with 'ox_target' or 'qb-target'.
setup.notify'ox_lib'Also 'lation_ui', 'esx', 'qb', 'okok', 'sd-notify', 'wasabi_notify' or 'custom'.
setup.progress'ox_lib'Also 'lation_ui', 'qbcore' or 'custom'. A custom bar must support animations.
setup.menu'ox_lib'Also 'lation_ui' or 'custom'. The clerk's menu and its submenus.
setup.dialogs'ox_lib'Also 'lation_ui' or 'custom'. The quantity and player ID prompts, the refill slider, Continue Diving? and the on-screen hotspot messages.
setup.hideNamesfalsetrue lists group members as Player 12 instead of their character names.
setup.versiontrueChecks for a newer release on start and prints a notice in the server console.
setup.jobfalseA job name, such as 'diver', to keep diving to that job: only it sees the clerk, his blip and the shops.
setup.metricfalsetrue shows depth and distance in meters instead of feet.
setup.max1800.0How long, in seconds, the game lets a diver in scuba gear stay under. The tank runs out long before; the config asks you to leave it.

The custom options do nothing until you add your code in client/functions.lua. See developers.

With setup.debug on, debugzones (client) puts a crate on every spot of a zone as you enter it, each with a target that prints its coordinates to F8, and removes them as you leave.

Start

In config/shared.lua. The clerk, and how groups and dives start.

KeyDefaultNotes
start.coordsvec4(-289.3029, -2770.0029, 2.1953, 48.9145)Where the clerk stands and his heading. false removes the clerk and his blip; open the menu with openMenu instead.
start.model's_m_y_shop_mask'The clerk's ped model.
start.scenario'WORLD_HUMAN_CLIPBOARD'What he stands doing, or false for nothing.
start.hours{ min = 0, max = 24 }In-game hours he's there, from min up to, not including, max. With min later than max, the window runs overnight. Checked as a player comes within 100 meters.
start.cooldown{ min = 15, max = 30 }Seconds between Start Diving and the hotspot.
start.continuetrueAsks the leader Continue Diving? after the last crate. false ends the dive instead.
start.addMemberDistCheckfalsetrue requires the leader and the player being added to both be within 15 meters of the clerk.
start.groupLimitnilMost players in a group, the leader included. nil for no limit.

The shops, the boat deposit and its refund only go through within 15 meters of start.coords, unless it's false.

Experience

In config/shared.lua. The total XP for each level.

KeyDefault
experience[1]0
experience[2]2500
experience[3]10000
experience[4]20000
experience[5]50000

Add or remove levels as you like; the highest is the top level. Always keep [1] = 0. Players earn XP only from crates, at each zone's xp (1 to 5 per crate by default), so the default ladder is slow.

Gear

In config/shared.lua.

Tanks

gear.tanks lists the scuba gear items. The number in brackets is the level needed to buy and wear that one.

KeyItemdegradeAir underwater
gear.tanks[1]ls_scuba_gear_13.34About 5 minutes
gear.tanks[2]ls_scuba_gear_21.67About 10 minutes
gear.tanks[3]ls_scuba_gear_31.11About 15 minutes
gear.tanks[4]ls_scuba_gear_40.84About 20 minutes
gear.tanks[5]ls_scuba_gear_50.66About 25 minutes

degrade is how much air, out of 100, the gear loses for every 10 seconds underwater. For a tank that lasts a given time: degrade = 100 ÷ (seconds ÷ 10).

Refill and props

KeyDefaultNotes
gear.refill'ls_oxygen_tank'The oxygen tank item that refills gear.
gear.mask'p_d_scuba_mask_s'The mask prop worn while geared.
gear.tank'p_s_scuba_tank_s'The tank prop worn on the back.

Clothes

gear.clothes sets what the diver wears while geared. Each part has a componentId (leave it as it is) and a male and female { drawableId, textureId }. The freemode male ped gets the male set and any other ped the female one.

PartcomponentIdMale drawableFemale drawable
mask100
upperBody383
lowerBody49497
bags500
shoes66770
shirt81515
bodyArmor900
decals1000
jackets11243251

Every textureId is 0. Each part is applied as set, a drawable of 0 included.

Shops

In config/shared.lua. Both shops are rows in the clerk's menu, and both open a quantity prompt for the item picked.

Dive shop

KeyDefaultNotes
shop.gear.enabletrueShows The Dive Shop.
shop.gear.account'cash'Or 'bank'.
shop.gear.itemsEight items, belowEach { item, price, icon, level?, metadata? }.

level is the diving level needed to buy it. metadata is the durability the item is handed out with, so keep it at 100 on scuba gear and oxygen tanks, and leave it off items that don't use durability.

#itempricelevelmetadata
1ls_oxygen_tank100100
2ls_scuba_gear_12501100
3ls_scuba_gear_25002100
4ls_scuba_gear_310003100
5ls_scuba_gear_420004100
6ls_scuba_gear_550005100
7burger5
8water5

burger and water come from your inventory and don't ship with scuba diving; rename or remove them if your inventory calls them something else.

Pawn shop

KeyDefaultNotes
shop.pawn.enabletrueShows The Pawn Shop.
shop.pawn.account'cash'Or 'bank'. Where the money goes.
shop.pawn.items16 items, belowEach { item, price, icon }, price paid for one.
itemprice
ls_old_boot, ls_wood_plank, ls_rusted_padlock, ls_rusted_key, ls_rusted_gear5
ls_seashell, ls_seaweed, ls_rusted_muffler, ls_broken_cd, ls_diving_goggles15
ls_fishing_net, ls_old_camera, ls_military_helmet25
ls_old_compass, ls_old_watch, ls_conch_shell50

The level 2 to 5 finds aren't bought by default. Add them here to give them a price.

Boat rental

In config/shared.lua.

KeyDefaultNotes
rental.enabletrueShows Rent a Boat and Return Boat.
rental.account'cash'Or 'bank'. The deposit comes from it and the refund goes back to it.
rental.deposit500Paid to rent. 0 for free.
rental.returnDeposit250Paid back on return. 0 for nothing.
rental.models{ 'dinghy' }One is picked at random for each rental.
rental.teleportfalsetrue puts the player in the driver's seat.
rental.coordsvec4(-291.7570, -2766.1208, 0.6787, 267.4251)Where the boat spawns, and its heading.
rental.anchortrueAdds Toggle anchor to the boat.

Zones

In config/shared.lua. zones lists the dive spots. Each dive goes to one picked at random, never the one the server handed out last, so keep at least two.

FieldDefault (every zone)Notes
locationBelowThe middle of the zone: its circle on the map, and the sphere that spawns the crates.
models{ 'xm3_prop_xm3_crate_supp_01a' }Crate props, one picked at random for each crate.
radius150.0Meters, for the map circle and the sphere.
highlight{ enable = true, distance = 30, color = { r = 106, g = 226, b = 119 } }Outlines crates within distance meters in color.
crates{ min = 2, max = 6 }Crates per dive, never more than the zone has spots.
xp{ min = 1, max = 5 }XP for each crate picked up.
coordsBelowThe spots crates can be on. Each dive picks different ones at random.

The ten zones, with 127 spots between them:

ZonelocationSpots
11086.9691, -3575.9382, -50.121415
23085.2043, -1853.3246, -14.366813
31818.7792, -2984.2068, -41.281113
43150.8074, -973.6499, -26.957212
52383.6611, -2451.3289, -32.925510
6280.3442, -3492.5969, -29.222710
7-2080.0508, -876.7839, -38.183816
8-2837.9504, -494.8672, -45.788315
9-3550.5359, 646.9001, -66.328112
10-3416.8613, 1701.7200, -61.662611

To add a zone, copy one, set its location and list its spots in coords as vec3. The debugzones command under setup shows every spot of a zone in game.

Keep at least two zones. The next dive never goes to the zone handed out last, so with only one, the second Start Diving on the server never finds a zone and hangs the server.

Crates

In config/shared.lua.

KeyDefaultNotes
crates.item'ls_diving_crate'The item a crate becomes when picked up, used to open it.
crates.quantity{ min = 1, max = 1 }How many crate items one pickup gives.
crates.lootFive tiers, belowWhat opening a crate can give.

crates.loot is keyed by level. A player rolls every tier at or below their level, and every item in those tiers rolls on its own, so one crate can give several items, or only the sure ones. Each entry is { item, quantity = { min, max }, chance, metadata? }, chance from 1 to 100, and metadata an optional table put on the item.

TierEntries (chance)
crates.loot[1]ls_old_boot 100, ls_wood_plank 80, ls_rusted_padlock 60, ls_rusted_key 40, ls_rusted_gear 30, ls_seashell 30, ls_seaweed 25, ls_rusted_muffler 25, ls_broken_cd 20, ls_diving_goggles 20, ls_fishing_net 15, ls_old_camera 15, ls_military_helmet 10, ls_old_compass 10, ls_old_watch 5, ls_conch_shell 5
crates.loot[2]ls_bottle_of_rum 50
crates.loot[3]ls_treasure_map 50
crates.loot[4]ls_silver_bracelet 50
crates.loot[5]ls_ancient_artifact 50

Every default entry gives one. The table is a starting point: put your own server's items in it. Keep at least one entry at 100 in tier 1, or a crate can roll nothing, and then it isn't used up and the console prints an error.

Stats and blips

In config/client.lua.

KeyDefaultNotes
stats.cratestrueCrates under Statistics.
stats.depthtrueDepth, the deepest dive.
stats.swamtrueSwam, the distance swum underwater. With all three false, Statistics is hidden.
leaderboardtrueThe Leaderboards, the top 10 by XP. It reads saved stats, written as players leave and when the resource stops.
blips.start.enabletrueThe clerk's blip.
blips.start.sprite729The blip's icon id.
blips.start.color3The blip's color id.
blips.start.scale0.9
blips.start.label'Scuba Diving'The name on the map.
blips.zone.color1The hotspot circle's color id (red).
blips.zone.alpha100The circle's opacity, 0 to 255.

Animations

In config/client.lua. Each entry under anims is one progress bar: label, icon, duration in milliseconds, position, useWhileDead, allowSwimming, canCancel, disable (move, car, combat), anim (dict, clip, flag) and prop (model, bone, pos, rot).

KeyLabelDurationNotes
anims.anchorBoatToggling anchor..1000Icon fas fa-anchor, anim random@domestic pickup_low.
anims.openCrateOpening crate..2000The player can walk. Anim anim@heists@box_carry@ idle holding v_serv_abox_04.
anims.toggleGearChanging clothes..5000Icon fas fa-shirt, works while swimming. Anim clothingshirt try_shirt_positive_d.
anims.pickupCratePicking up..3000Icon fas fa-hand, works while swimming, can't be cancelled.
anims.createGroupCreating group..1000Icon fas fa-users.

Logging

In config/server.lua.

KeyDefaultNotes
logs.service'none''fivemanage' (needs fmsdk running), 'fivemerr' (needs fm-logs running), 'discord' or 'none'.
logs.screenshotsfalseAdds the player's screen to each log on Fivemanage and Fivemerr.
logs.events.crateFoundfalseA player picks up a crate, with where.
logs.events.crateOpenedfalseA player opens a crate, with what they got.
logs.events.itemPurchasedfalseA purchase from the dive shop.
logs.events.itemPawnedfalseA sale to the pawn shop. See the note below.
logs.events.boatRentedfalseA boat rented, with the deposit.
logs.events.boatReturnedfalseA boat returned, with the refund.
logs.discord.name'Scuba Diving'The webhook's name.
logs.discord.link''The webhook URL.
logs.discord.imageAn image linkThe webhook's picture.
logs.discord.footerAn image linkThe footer icon.

In 2.2.1 the pawn shop's log line expects one more value than the script gives it, so with itemPawned on, each sale prints an error in the server console instead of a log. The sale itself goes through.

Icons

config/icons.lua holds the Font Awesome icons on the targets, menus and prompts, each with an optional color in the key ending _color (empty for the default). The keys: talk (the clerk), anchor, pickup_crate, underwater (the readout), quantity and player_id (the prompts), player_level, view_stats, stats_crates, stats_depth, stats_swam, diving_leaderboard, shop, pawn, rental, create_group, manage_group, start_diving (green, #82E58B), stop_diving (red, #FF5C5C), add_group_member, remove_group_member, leave_group and leaderboard (the top three's trophy).

Text prompts

The underwater readout is a text prompt, set in client/functions.lua rather than config/, on line 13:

client/functions.lua
local textui = 'ox_lib'

Also 'lation_ui', 'jg-textui', 'okokTextUI' or 'qbcore', or add your own in ShowTextUI and HideTextUI in the same file.

Language

Every string is in locales/, which ships English (en.json), German (de.json) and Dutch (nl.json). scuba diving uses ox_lib's language, so set it with ox_lib's own setting:

server.cfg
setr ox:locale de

To translate, copy locales/en.json to a new file named for the language, such as locales/fr.json, and translate the values. The refill slider's title and label are written in client/functions.lua and stay in English.

Still stuck? Ask in our Discord: the people who write the scripts answer.

Last updated November 11, 2026

Players

How players use scuba diving with the default settings, from the clerk's menu and the dive shop to scuba gear and air, groups, a dive, opening crates, the pawn shop, the rental boat and levels.

Developers

The scuba diving client and server exports, the functions left open for your own code, and the files that ship open, with signatures, return shapes and Lua examples.

On this page

SetupStartExperienceGearTanksRefill and propsClothesShopsDive shopPawn shopBoat rentalZonesCratesStats and blipsAnimationsLoggingIconsText promptsLanguage
lation scripts

FiveM scripts for Qbox, QBCore and ESX servers, made to look and work like one product.

store

  • all scripts
  • membership
  • classics

help

  • docs
  • discord
  • email support

legal

  • terms
  • refunds
  • privacy
© 2026 Lation Labslationscripts.com
  • home
  • scripts
  • membership
  • docs