REC_ObjectHunt
Stracture
Installation, configuration, and usage for REC_ObjectHunt.
- Added
- Updated
The following configuration files and manifest are taken from the current source.
config/sh_config.lua
---@type REC_Library.Shared.API
local shApi = require "@REC_Library.shared.sh_api"
local apiShCfg = shApi.Config
---@type REC_ObjectHunt.Locales
local locales = require ("@REC_ObjectHunt.locales.".. apiShCfg.language)
---@class REC_ObjectHunt.Shared.Config
local config = {}
---[[
--- Debug Mode
---]]
---@type boolean
config.debugMode = true
---[[
--- Draw the zone bounds
---]]
---@type boolean
config.showZoneDebug = true
---[[
--- How the control hints are shown
---]]
---@type
---| "gta5"
---| "ox"
config.helpTextType = "gta5"
---[[
--- Key mapping (prop side)
--- https://docs.fivem.net/docs/game-references/input-mapper-parameter-ids/
---]]
---@type REC_ObjectHunt.Shared.Config.KeyMaps
config.keyMaps = {
lock = { mapper = "MOUSE_BUTTON", key = "MOUSE_LEFT", },
camera = { mapper = "keyboard", key = "E", },
turn = { mapper = "MOUSE_BUTTON", key = "MOUSE_RIGHT", },
switchProp = { mapper = "keyboard", key = "2", },
decoy = { mapper = "keyboard", key = "Q", },
}
---[[
--- Uses allowed per round
---]]
---@type { switchProp: integer, decoy: integer, }
config.limits = {
switchProp = 3,
decoy = 3,
}
---[[
--- Timers
---]]
---@type REC_ObjectHunt.Shared.Config.Timers
config.timers = {
huntersWaiting = 60, -- sec: hiding time before the hunters are released
outsideLobby = 20, -- sec: time outside the lobby while waiting before being kicked
sessionExpiry = 60 * 3, -- sec: room lifetime
outsideArea = 5, -- sec: time outside the area while playing before a forced down
}
---[[
--- Skip the cutscene on a peyote start (a lobby start never had one)
---]]
---@type boolean
config.skipCutscene = false
---[[
--- Marker drawn above the peyote
--- https://docs.fivem.net/docs/game-references/markers/
---]]
---@type REC_ObjectHunt.Shared.Config.Marker
config.marker = {
type = 32,
scale = vector3(1.0, 1.0, 1.0),
rgba = { r = 197, g = 106, b = 207, a = 155 },
drawDistance = 10.0,
}
---[[
--- Z offset when wearing a prop (used for models missing from the table below)
---]]
---@type number
config.defaultPropOffset = -0.90
---[[
--- Per model Z offset table
--- Prop Height in the debug menu (/ohdebug) generates these values
---]]
---@type table<integer, number>
config.propOffsets = {
-- NZ_OJH_SCRAPYARD
[joaat("prop_vend_coffe_01")] = -1.0,
[joaat("prop_paints_bench01")] = -1.0,
[joaat("prop_pallet_pile_02")] = -0.88,
[joaat("prop_pallet_pile_03")] = -1.0,
[joaat("prop_byard_trailer01")] = -1.0,
[joaat("prop_plywoodpile_01b")] = -1.0,
[joaat("prop_tunnel_liner02")] = -1.0,
[joaat("prop_boxpile_07d")] = -1.0,
[joaat("prop_rub_carwreck_14")] = -1.0,
[joaat("prop_bin_03a")] = -0.98,
[joaat("prop_aircon_m_05")] = -1.0,
[joaat("prop_toolchest_05")] = -1.02,
[joaat("prop_rub_trukwreck_1")] = -0.3,
-- NZ_OJH_SENORA
[joaat("prop_rub_carwreck_9")] = -1.0,
[joaat("prop_palm_fan_02_a")] = -1.04,
[joaat("prop_speaker_07")] = -0.58,
[joaat("prop_table_04")] = -0.1,
[joaat("prop_conc_blocks01b")] = -1.0,
[joaat("prop_picnictable_01")] = -0.98,
[joaat("prop_pallet_pile_04")] = -0.1,
[joaat("prop_rub_couch02")] = -1.0,
[joaat("prop_table_03b_chr")] = -1.02,
[joaat("prop_bbq_4")] = -1.0,
[joaat("prop_bin_07b")] = -1.0,
-- NZ_OJH_CUSTOM
[joaat("prop_box_wood01a")] = -1.0,
[joaat("prop_watercrate_01")] = -1.0,
[joaat("prop_barier_conc_02a")] = -1.0,
[joaat("prop_barier_conc_01a")] = -0.96,
[joaat("prop_pallettruck_01")] = -1.0,
[joaat("prop_rock_1_d")] = -1.0,
[joaat("prop_palm_fan_02_b")] = -1.02,
[joaat("prop_dumpster_02a")] = -1.0,
}
---[[
--- Hunter weapon (each map can override it)
--- WEAPON_PHNZSH needs the ObjectHunt-Gun addon, remove it when that is missing
---]]
---@type REC_ObjectHunt.Shared.Config.Weapon[]
config.defaultWeapons = {
{
weapon = "WEAPON_PHNZSH",
ammo = 200,
components = {
"COMPONENT_AT_AR_FLSH",
},
},
{
weapon = "WEAPON_PISTOL",
ammo = 200,
components = {
"COMPONENT_AT_PI_FLSH",
"COMPONENT_AT_PI_SUPP_02",
},
},
}
---[[
--- Map definitions
---
--- zone.points is a REC_Library polyzone (vector3), thickness is its height
--- startType "peyote" uses peyotes, "lobby" uses lobbies
---]]
---@type table<string, REC_ObjectHunt.Shared.Config.Map>
config.maps = {
---[[
--- SCRAPYARD
---]]
["NZ_OJH_SCRAPYARD"] = {
enable = true,
zone = {
points = {
vector3(2435.0305175782, 3109.8073730468, 41.7),
vector3(2434.9738769532, 3104.4035644532, 41.7),
vector3(2435.318359375, 3026.2810058594, 41.7),
vector3(2328.74609375, 3025.8020019532, 41.7),
vector3(2328.9519042968, 3068.970703125, 41.7),
vector3(2329.3583984375, 3079.7614746094, 41.7),
vector3(2322.9934082032, 3100.1635742188, 41.7),
vector3(2318.0004882812, 3121.412109375, 41.7),
vector3(2324.7844238282, 3156.0588378906, 41.7),
vector3(2332.5954589844, 3158.8662109375, 41.7),
vector3(2335.9411621094, 3161.1044921875, 41.7),
vector3(2348.6796875, 3167.53515625, 41.7),
vector3(2359.5466308594, 3171.0871582032, 41.7),
vector3(2372.2233886718, 3172.9943847656, 41.7),
vector3(2372.8686523438, 3170.9123535156, 41.7),
vector3(2381.017578125, 3170.5703125, 41.7),
vector3(2389.7116699218, 3167.1337890625, 41.7),
vector3(2401.4438476562, 3168.4216308594, 41.7),
vector3(2402.8830566406, 3160.6123046875, 41.7),
vector3(2435.2292480468, 3160.61328125, 41.7),
},
thickness = 27.0,
},
startType = "peyote",
showBlip = true,
lobbies = {
["NZ_OJH_SCRAPYARD_LOBBY_1"] = {
blip = {
label = locales.blip_join_point,
coords = vector3(2370.83, 3121.59, 48.22),
sprite = 788,
scale = 0.7,
color = 2,
},
zone = {
points = {
vector3(2368.2084960938, 3128.7341308594, 47.16),
vector3(2385.1164550781, 3128.1787109375, 47.16),
vector3(2375.2126464844, 3100.8071289062, 47.16),
vector3(2359.1145019531, 3102.1535644531, 47.16),
},
thickness = 13.0,
},
},
},
peyotes = {
["NZ_OJH_SCRAPYARD_PEYOTE_1"] = {
model = "prop_peyote_lowland_01",
coords = vector3(2370.83, 3121.59, 48.22),
cutsceneCoords = vector3(2380.49, 3078.03, 48.2) + vector3(0.0, 0.0, 66.1),
radius = 2.0,
joiningRadius = 12.0,
blip = {
label = locales.blip_join_point,
sprite = 788,
scale = 0.7,
color = 2,
},
},
},
forceFirstPerson = false,
players = {
minJoin = config.debugMode == false and 2 or 0, -- 2 or more
maxJoin = 12, -- 6 to 12 recommended
},
speed = {
enable = true,
rate = 1.3, -- 1.0 is normal, 1.2 to 1.4 recommended
},
jump = {
enable = false,
power = 10.0,
},
weapons = nil, -- nil falls back to config.defaultWeapons
spawns = {
hunters = {
vector4(2366.1, 3162.71, 48.12, 41.17),
vector4(2368.83, 3165.52, 47.97, 312.52),
vector4(2363.62, 3167.86, 47.76, 96.64),
vector4(2366.41, 3156.69, 48.21, 190.32),
vector4(2370.0, 3159.33, 48.21, 323.23),
vector4(2375.06, 3162.83, 48.21, 20.88),
},
props = {
vector4(2361.54, 3113.28, 48.23, 57.33),
vector4(2356.42, 3132.2, 48.21, 82.84),
vector4(2389.73, 3094.36, 48.15, 154.82),
vector4(2350.07, 3062.44, 48.15, 162.58),
vector4(2409.88, 3060.69, 48.15, 358.12),
vector4(2413.7, 3106.68, 48.17, 346.03),
},
},
-- dummy props spawned on the server (heavier, so false by default)
fakeObjects = {
enable = false,
min = 4,
max = 6,
list = {
-- { model = "prop_bin_03a", coords = vector3(0.0, 0.0, 0.0), heading = 105.0, },
},
},
firstProps = {
"prop_vend_coffe_01",
"prop_boxpile_07d",
"prop_paints_bench01",
"prop_pallet_pile_02",
"prop_pallet_pile_03",
"prop_byard_trailer01",
"prop_plywoodpile_01b",
"prop_tunnel_liner02",
"prop_rub_carwreck_14",
"prop_bin_03a",
"prop_aircon_m_05",
"prop_toolchest_05",
"prop_rub_trukwreck_1",
},
switchProps = {
"prop_vend_coffe_01",
"prop_boxpile_07d",
"prop_paints_bench01",
"prop_pallet_pile_02",
"prop_pallet_pile_03",
"prop_byard_trailer01",
"prop_plywoodpile_01b",
"prop_tunnel_liner02",
"prop_rub_carwreck_14",
"prop_bin_03a",
"prop_aircon_m_05",
"prop_toolchest_05",
"prop_rub_trukwreck_1",
},
},
---[[
--- SENORA
---]]
["NZ_OJH_SENORA"] = {
enable = true,
zone = {
points = {
vector3(2387.72265625, 2526.2722167969, 46.49),
vector3(2387.1870117188, 2520.3986816406, 46.49),
vector3(2365.3955078125, 2494.2873535156, 46.49),
vector3(2353.0178222656, 2491.7141113281, 46.49),
vector3(2307.9626464844, 2500.2436523438, 46.49),
vector3(2298.6037597656, 2505.7790527344, 46.49),
vector3(2293.34375, 2523.0, 46.49),
vector3(2295.4584960938, 2531.4318847656, 46.49),
vector3(2315.4436035156, 2594.6833496094, 46.49),
vector3(2319.3669433594, 2620.3540039062, 46.49),
vector3(2326.736328125, 2636.2951660156, 46.49),
vector3(2338.0520019531, 2643.4660644531, 46.49),
vector3(2366.4299316406, 2647.7978515625, 46.49),
vector3(2381.3713378906, 2639.8557128906, 46.49),
vector3(2384.830078125, 2630.4328613281, 46.49),
vector3(2381.6176757812, 2608.85546875, 46.49),
vector3(2386.9626464844, 2583.2175292969, 46.49),
vector3(2390.9997558594, 2570.4772949219, 46.49),
vector3(2391.4143066406, 2560.9738769531, 46.49),
vector3(2385.4973144531, 2543.6181640625, 46.49),
vector3(2384.7180175781, 2536.8317871094, 46.49),
},
thickness = 28.0,
},
startType = "peyote",
showBlip = true,
lobbies = {
["NZ_OJH_SENORA_LOBBY_1"] = {
blip = {
label = locales.blip_join_point,
coords = vector3(2374.62, 2527.55, 46.62),
sprite = 788,
scale = 0.7,
color = 2,
},
zone = {
points = {
vector3(2378.8852539062, 2517.9936523438, 46.67),
vector3(2364.9899902344, 2520.2961425781, 46.67),
vector3(2367.3459472656, 2535.9006347656, 46.67),
vector3(2379.8784179688, 2534.8229980469, 46.67),
},
thickness = 13.0,
},
},
},
peyotes = {
["NZ_OJH_SENORA_PEYOTE_1"] = {
model = "prop_peyote_lowland_01",
coords = vector3(2374.62, 2527.55, 46.62),
cutsceneCoords = vector3(2367.5, 2642.8, 46.64) + vector3(0.0, 0.0, 66.0),
radius = 2.0,
joiningRadius = 12.0,
blip = {
label = locales.blip_join_point,
sprite = 788,
scale = 0.7,
color = 2,
},
},
},
forceFirstPerson = false,
players = {
minJoin = config.debugMode == false and 2 or 0,
maxJoin = 12,
},
speed = {
enable = true,
rate = 1.3,
},
jump = {
enable = false,
power = 10.0,
},
weapons = nil,
spawns = {
hunters = {
vector4(2358.35, 2512.04, 46.67, 41.0),
vector4(2356.28, 2510.3, 46.67, 56.6),
vector4(2356.61, 2507.36, 46.67, 211.53),
vector4(2361.26, 2506.41, 46.62, 256.84),
vector4(2364.7, 2508.22, 46.75, 297.63),
vector4(2356.92, 2502.96, 46.7, 56.86),
},
props = {
vector4(2355.92, 2576.15, 46.67, 336.0),
vector4(2354.9, 2572.79, 46.67, 184.03),
vector4(2351.26, 2570.75, 46.59, 113.96),
vector4(2344.92, 2574.37, 46.55, 45.71),
vector4(2343.89, 2569.9, 46.6, 186.46),
vector4(2344.28, 2565.36, 46.67, 184.32),
},
},
fakeObjects = {
enable = false,
min = 4,
max = 6,
list = {},
},
firstProps = {
"prop_rub_carwreck_9",
"prop_palm_fan_02_a",
"prop_speaker_07",
"prop_conc_blocks01b",
"prop_picnictable_01",
"prop_pallet_pile_04",
"prop_rub_couch02",
"prop_table_03b_chr",
"prop_bbq_4",
"prop_bin_07b",
},
switchProps = {
"prop_rub_carwreck_9",
"prop_palm_fan_02_a",
"prop_speaker_07",
"prop_conc_blocks01b",
"prop_picnictable_01",
"prop_pallet_pile_04",
"prop_rub_couch02",
"prop_table_03b_chr",
"prop_bbq_4",
"prop_bin_07b",
},
},
---[[
--- CUSTOM
---]]
["NZ_OJH_CUSTOM"] = {
enable = true,
zone = {
points = {
vector3(1053.7788085938, -2388.2646484375, 31.39),
vector3(1093.6125488282, -2389.3937988282, 31.39),
vector3(1094.5611572266, -2376.8845214844, 31.39),
vector3(1101.7708740234, -2373.9089355468, 31.39),
vector3(1105.1505126954, -2371.9421386718, 31.39),
vector3(1113.3205566406, -2365.5268554688, 31.39),
vector3(1118.7580566406, -2360.5322265625, 31.39),
vector3(1122.1788330078, -2355.11328125, 31.39),
vector3(1124.1837158204, -2350.8334960938, 31.39),
vector3(1125.5462646484, -2347.2404785156, 31.39),
vector3(1126.4614257812, -2344.0244140625, 31.39),
vector3(1126.9764404296, -2342.4187011718, 31.39),
vector3(1136.8967285156, -2343.36328125, 31.39),
vector3(1137.4481201172, -2327.0346679688, 31.39),
vector3(1140.0997314454, -2296.3657226562, 31.39),
vector3(1141.5151367188, -2279.2419433594, 31.39),
vector3(1135.8862304688, -2255.9995117188, 31.39),
vector3(1134.418334961, -2243.0747070312, 31.39),
vector3(1128.419555664, -2228.6318359375, 31.39),
vector3(1115.0001220704, -2215.048828125, 31.39),
vector3(1097.5075683594, -2205.3654785156, 31.39),
vector3(1067.0725097656, -2200.1508789062, 31.39),
},
thickness = 13.0,
},
startType = "peyote",
showBlip = true,
lobbies = {
["NZ_OJH_CUSTOM_LOBBY_1"] = {
blip = {
label = locales.blip_join_point,
coords = vector3(1114.17, -2351.43, 30.53),
sprite = 788,
scale = 0.7,
color = 2,
},
zone = {
points = {
vector3(1111.1624755859, -2352.7517089844, 31.39),
vector3(1111.8334960938, -2340.5834960938, 31.39),
vector3(1126.3990478516, -2342.6760253906, 31.39),
vector3(1119.1898193359, -2358.4582519531, 31.39),
},
thickness = 13.0,
},
},
},
peyotes = {
["NZ_OJH_CUSTOM_PEYOTE_1"] = {
model = "prop_peyote_lowland_01",
coords = vector3(1114.17, -2351.43, 30.53),
cutsceneCoords = vector3(1099.88, -2273.71, 30.15) + vector3(0.0, 0.0, 66.0),
radius = 2.0,
joiningRadius = 12.0,
blip = {
label = locales.blip_join_point,
sprite = 788,
scale = 0.7,
color = 2,
},
},
},
forceFirstPerson = false,
players = {
minJoin = config.debugMode == false and 2 or 0,
maxJoin = 12,
},
speed = {
enable = true,
rate = 1.3,
},
jump = {
enable = false,
power = 10.0,
},
weapons = nil,
spawns = {
hunters = {
vector4(1059.32, -2376.15, 30.63, 268.77),
vector4(1058.87, -2378.33, 30.64, 258.00),
vector4(1059.38, -2380.65, 30.63, 266.19),
vector4(1058.86, -2383.41, 30.52, 263.69),
vector4(1063.45, -2381.90, 30.64, 268.86),
vector4(1064.85, -2377.81, 30.74, 271.99),
},
props = {
vector4(1127.86, -2239.99, 30.72, 143.85),
vector4(1124.47, -2236.18, 30.45, 136.13),
vector4(1104.74, -2238.62, 30.17, 112.26),
vector4(1091.63, -2280.15, 30.15, 123.45),
vector4(1112.53, -2302.85, 30.50, 210.15),
vector4(1113.46, -2325.61, 30.52, 164.79),
},
},
fakeObjects = {
enable = false,
min = 2,
max = 5,
list = {},
},
firstProps = {
"prop_box_wood01a",
"prop_watercrate_01",
"prop_barier_conc_02a",
"prop_barier_conc_01a",
"prop_pallettruck_01",
"prop_rock_1_d",
"prop_palm_fan_02_b",
"prop_dumpster_02a",
},
switchProps = {
"prop_box_wood01a",
"prop_watercrate_01",
"prop_barier_conc_02a",
"prop_barier_conc_01a",
"prop_pallettruck_01",
"prop_rock_1_d",
"prop_palm_fan_02_b",
"prop_dumpster_02a",
},
},
}
return config
---@class REC_ObjectHunt.Shared.Config.KeyMaps
---@field lock { mapper: string, key: string, }
---@field camera { mapper: string, key: string, }
---@field turn { mapper: string, key: string, }
---@field switchProp { mapper: string, key: string, }
---@field decoy { mapper: string, key: string, }
---@class REC_ObjectHunt.Shared.Config.Timers
---@field huntersWaiting integer
---@field outsideLobby integer
---@field sessionExpiry integer
---@field outsideArea integer
---@class REC_ObjectHunt.Shared.Config.Marker
---@field type integer
---@field scale vector3
---@field rgba REC_Library.Shared.RGBA
---@field drawDistance number
---@class REC_ObjectHunt.Shared.Config.Weapon
---@field weapon string
---@field ammo integer
---@field components string[]
---@class REC_ObjectHunt.Shared.Config.Zone
---@field points vector3[]
---@field thickness number
---@class REC_ObjectHunt.Shared.Config.Blip
---@field label string
---@field coords? vector3
---@field sprite integer
---@field scale number
---@field color integer
---@class REC_ObjectHunt.Shared.Config.Lobby
---@field blip REC_ObjectHunt.Shared.Config.Blip
---@field zone REC_ObjectHunt.Shared.Config.Zone
---@class REC_ObjectHunt.Shared.Config.Peyote
---@field model string
---@field coords vector3
---@field cutsceneCoords vector3
---@field radius number
---@field joiningRadius number
---@field blip REC_ObjectHunt.Shared.Config.Blip
---@class REC_ObjectHunt.Shared.Config.FakeObject
---@field model string
---@field coords vector3
---@field heading number
---@class REC_ObjectHunt.Shared.Config.Map
---@field enable boolean
---@field zone REC_ObjectHunt.Shared.Config.Zone
---@field startType REC_ObjectHunt.Shared.Enum.StartType
---@field showBlip boolean
---@field lobbies table<string, REC_ObjectHunt.Shared.Config.Lobby>
---@field peyotes table<string, REC_ObjectHunt.Shared.Config.Peyote>
---@field forceFirstPerson boolean
---@field players { minJoin: integer, maxJoin: integer, }
---@field speed { enable: boolean, rate: number, }
---@field jump { enable: boolean, power: number, }
---@field weapons REC_ObjectHunt.Shared.Config.Weapon[]|nil
---@field spawns { hunters: vector4[], props: vector4[], }
---@field fakeObjects { enable: boolean, min: integer, max: integer, list: REC_ObjectHunt.Shared.Config.FakeObject[], }
---@field firstProps string[]
---@field switchProps string[]
