Wert Weapon Racks (Deployable, Advanced)
You can access the setup information you need about this product
INSTALLATION
1 - Upload the script folder to the location of your resources
2 - Check config file for your own settings
3 - Please add the items to your list in the items section below
4 - Add the data inside the SQL extension file to your database.
5 - Installation successful, have a good funs
ITEMS
-- Default items
["rack_1"] = {
["name"] = "rack_1",
["label"] = "Gun Rack",
["weight"] = 0,
["type"] = "item",
["image"] = "rack_1.png",
["unique"] = true,
["useable"] = true,
["shouldClose"] = true,
["combinable"] = nil,
["description"] = ""
},
["rack_2"] = {
["name"] = "rack_2",
["label"] = "Gun Rack",
["weight"] = 0,
["type"] = "item",
["image"] = "rack_2.png",
["unique"] = true,
["useable"] = true,
["shouldClose"] = true,
["combinable"] = nil,
["description"] = ""
},
OX LIB OPTION
There are many ox settings available in the files, if you want, you can configure them.
If you want to use ox_lib, please check if this link is enabled on fxmanifest.check it out from inside lua. this must be turned on before you can use ox_lib. After opening it, it will be enough to use the refresh and ensure commands.
EXPORTS
Client side exports
-- # Current rack
local currentRack = exports['wert-gunrack']:GetCurrentRack()
-- Output : rack id like (default_rack_1, default_rack_2, default_rack_3 ... or others)
-- # Armed active
local isArmed = exports['wert-gunrack']:ArmedActive()
-- You can check whether the player is at the stage of placing the weapon on the rack
-- Output : isArmed = wep object (entity) | If you want control you can use like this if isArmed then print("Player armed") else print("Player not armed") end
-- # Placement Active
local inPlacement = exports['wert-gunrack']:PlacementActive()
-- You can check whether the player is at the stage of placing a rack
-- Output : boolean
-- # IN Rack ui
local inPlacement = exports['wert-gunrack']:InRackUI()
-- You can check whether the player is in the weapon rack interface.
-- Output : boolean
OPEN FILES
Config = {}
Config.OxInventory = false -- If you use ox inventory please set true
Config.OxLib = true
Config.UseTarget = true
Config.RackTargetDistance = 1.5
Config.DebugPoly = false
Config.PutWeaponDistance = 1.8
Config.EnableOutline = true
Config.OutlineColor = {255, 255, 255, 255}
Config.InRackOutlineColor = {69, 250, 61, 255}
Config.DefaultRotation = {0.0, -90.0, 0.0}
Config.WhenRemoveRackGiveBackItem = true
Config.ChangeSlotKeys = {
left = 174,
right = 175,
}
Config.PutRackkey = 38
Config.NoTargetInteractKey = 47 -- Default [G]
Config.DefaultIcon = 'fa-regular fa-hand'
Config.RemoveRackIcon = "fa-regular fa-trash-can"
Config.RackSettings = {
[`prop_cs_gunrack`] = {
slots = {
{-0.572, 0.0, 0.06},
{-0.445, 0.0, 0.06},
{-0.317, 0.0, 0.06},
{-0.190, 0.0, 0.06},
{-0.063, 0.0, 0.06},
{0.064, 0.0, 0.06},
{0.195, 0.0, 0.06},
{0.322, 0.0, 0.06},
{0.449, 0.0, 0.06},
{0.576, 0.0, 0.06}
},
special = {
-- Through this table, you can provide visual completeness by editing the y and z offset values of weapons that do not fit perfectly on the shelf.
groups = {
-- Gun groups, You can set specific y and z offset value for each weapon group
-- Gun Groups : https://docs.fivem.net/natives/?_0xC3287EE3050FB74C
-- Example :
[`GROUP_PISTOL`] = {y = 0.0, z = -0.18},
},
models = {
-- Gun hashes, You can set spesific y and z offset value for each weapon
-- Note : Even if a pistol group is entered above, it will use it because a special value is specified for the model here.
-- [`weapon_pistol`] = {y = 0.0, z = -0.18},
[`weapon_stungun`] = {y = 0.0, z = -0.22},
}
},
},
[`xm_prop_xm_gunlocker_01a`] = {
slots = {
{-0.400, 0.0, 0.9},
{-0.290, 0.0, 0.9},
{-0.170, 0.0, 0.9},
{-0.060, 0.0, 0.9},
{0.055, 0.0, 0.9},
},
special = {
-- Through this table, you can provide visual completeness by editing the y and z offset values of weapons that do not fit perfectly on the shelf.
groups = {
-- Gun groups, You can set specific y and z offset value for each weapon group
-- Gun Groups : https://docs.fivem.net/natives/?_0xC3287EE3050FB74C
-- Example :
[`GROUP_PISTOL`] = {y = 0.0, z = 0.7},
[`GROUP_RIFLE`] = {y = 0.0, z = 0.78},
},
models = {
-- Gun hashes, You can set spesific y and z offset value for each weapon
-- Note : Even if a pistol group is entered above, it will use it because a special value is specified for the model here.
-- [`weapon_pistol`] = {y = 0.0, z = -0.18},
[`weapon_stungun`] = {y = 0.0, z = 0.65},
}
},
},
}
Config.DefaultRacks = {
-- If you want add default racks here like example template
-- Polices
{
id = "default_rack_1", -- IMPORTANT = If you want save weapons for after restart (server or script) you need set correct this (Each rack must have different id)
model = `prop_cs_gunrack`,
coord = vector4(480.43, -996.76, 30.0, 91.0),
job = "police", -- | If you want to make everyone remove this line or set nil
label = "Police Station Gun Rack",
icon = "fa-solid fa-shield"
},
{
id = "default_rack_2",
model = `xm_prop_xm_gunlocker_01a`,
coord = vector4(487.66, -1015.29, 29.69, 181.0),
job = "police", -- | If you want to make everyone remove this line or set nil
label = "Police Station Polygon Rack",
icon = "fa-solid fa-shield"
},
{
id = "default_rack_3", -- IMPORTANT = If you want save weapons for after restart (server or script) you need set correct this (Each rack must have different id)
model = `prop_cs_gunrack`,
coord = vector4(439.67, -998.09, 34.28, 90.0),
job = "police", -- | If you want to make everyone remove this line or set nil
label = "Police Station Monitor Rack",
icon = "fa-solid fa-shield"
},
{
id = "default_rack_4", -- IMPORTANT = If you want save weapons for after restart (server or script) you need set correct this (Each rack must have different id)
model = `prop_cs_gunrack`,
coord = vector4(465.39, -982.4, 43.0, 0),
job = "police", -- | If you want to make everyone remove this line or set nil
label = "Police Station Helicopter Rack",
icon = "fa-solid fa-shield"
},
-- Ambulances
{
id = "default_rack_5", -- IMPORTANT = If you want save weapons for after restart (server or script) you need set correct this (Each rack must have different id)
model = `prop_cs_gunrack`,
coord = vector4(309.94, -602.97, 42.60, 250),
job = "ambulance", -- | If you want to make everyone remove this line or set nil
label = "Hospital Rack",
icon = "fa-regular fa-hand-back-fist"
},
}
-- # Image Settings
Config.UseInventoryImages = true
Config.InventoryImageLocation = 'qb-inventory/html/images'
Config.CustomImages = {
-- Hash = png
[`weapon_pistol`] = "customurl.png",
}
-- # Items
Config.RackItems = {
-- If you want create more placable item in config
{item = "rack_1", model = `prop_cs_gunrack`},
{item = "rack_2", model = `xm_prop_xm_gunlocker_01a`},
}
-- If you want add here more weapon
Config.WhitelistedWeapons = {
-- PISTOLS
`weapon_pistol`,
`weapon_pistol_mk2`,
`weapon_combatpistol`,
`weapon_appistol`,
`weapon_stungun`,
`weapon_pistol50`,
`weapon_snspistol`,
`weapon_snspistol_mk2`,
`weapon_heavypistol`,
`weapon_vintagepistol`,
`weapon_flaregun`,
`weapon_marksmanpistol`,
`weapon_revolver`,
`weapon_revolver_mk2`,
`weapon_doubleaction`,
`weapon_raypistol`,
`weapon_ceramicpistol`,
`weapon_navyrevolver`,
`weapon_gadgetpistol`,
`weapon_stungun_mp`,
-- SMG
`weapon_microsmg`,
`weapon_smg`,
`weapon_smg_mk2`,
`weapon_assaultsmg`,
`weapon_combatpdw`,
`weapon_machinepistol`,
`weapon_minismg`,
`weapon_raycarbine`,
-- RIFLE
`weapon_assaultrifle`,
`weapon_assaultrifle_mk2`,
`weapon_carbinerifle`,
`weapon_carbinerifle_mk2`,
`weapon_advancedrifle`,
`weapon_specialcarbine`,
`weapon_specialcarbine_mk2`,
`weapon_bullpuprifle`,
`weapon_bullpuprifle_mk2`,
`weapon_compactrifle`,
`weapon_militaryrifle`,
`weapon_heavyrifle`,
-- SHOTGUN
`weapon_pumpshotgun`,
`weapon_pumpshotgun_mk2`,
`weapon_sawnoffshotgun`,
`weapon_assaultshotgun`,
`weapon_bullpupshotgun`,
`weapon_musket`,
`weapon_heavyshotgun`,
`weapon_dbshotgun`,
`weapon_autoshotgun`,
`weapon_combatshotgun`,
-- SNIPER
`weapon_sniperrifle`,
`weapon_heavysniper`,
`weapon_heavysniper_mk2`,
`weapon_marksmanrifle`,
`weapon_marksmanrifle_mk2`,
`weapon_remotesniper`,
}
local QBCore = exports['qb-core']:GetCoreObject()
function CustomNotifVariation(text, style, time)
QBCore.Functions.Notify(text, style, time)
end
function CustomTargetAddRackInteraction(data)
local options = {}
options[#options+1] = {
event = data.event,
icon = data.icon,
label = data.label,
rackid = data.id,
job = data.job
}
if data.owner then
options[#options+1] = {
event = "wert-gunrack:client:remove-rack",
icon = Config.RemoveRackIcon,
label = LANG.remove_rack,
rackid = data.id,
}
end
exports["qb-target"]:AddTargetEntity(data.obj, {options = options, distance = Config.RackTargetDistance})
end
function ShowPlaceInput()
if Config.OxLib then
local dialog = lib.inputDialog(LANG.input.title, {
{type = 'input', label = LANG.input.label, description = LANG.input.description, required = true},
})
return dialog
else
local dialog = exports['qb-input']:ShowInput({
header = LANG.input.title,
submitText = LANG.input.confirm,
inputs = {
{
text = LANG.input.label,
name = "label",
type = "text",
isRequired = true
},
},
})
return dialog
end
end
function ShowTextUI(text, icon)
if Config.OxLib then
lib.showTextUI(text, {position = 'left-center', icon = icon})
else
exports['qb-core']:DrawText(text, 'left')
end
end
function HideTextUI()
if Config.OxLib then
lib.hideTextUI()
else
exports['qb-core']:HideText()
end
end
RegisterNetEvent('wert-gunrack:client:custom-notif', function(text, style, time)
CustomNotifVariation(text, style, time)
end)
local QBCore = exports['qb-core']:GetCoreObject()
function GetWeaponComponentDescriptions(info)
local result = ""
if info and info.attachments then
for k,v in pairs(info.attachments) do
if v and v.label then
print(v.label)
if result == "" then
result = v.label
else
result = result .. ", " .. v.label
end
end
end
end
if result == "" then result = LANG.not_found_attachment end
return result
end
-- # Items
for i=1, #Config.RackItems do
local item = Config.RackItems[i]
QBCore.Functions.CreateUseableItem(item.item, function(src, item)
TriggerClientEvent("wert-gunrack:client:start-placament", src, i)
end)
end
LANG = {
error = {
rack_full = "Rack Full!",
rack_not_found = "Rack Not Found!",
slot_not_found = "Slot Not Found!",
slot_busy = "This slot busy!",
labelerror = "Please Set Correct Label!",
},
left_arrow_icon = '<i class="fa-solid fa-arrow-left"></i>',
right_arrow_icon = '<i class="fa-solid fa-arrow-right"></i>',
put_rack_key = "E",
change_place = "Change Place",
putrack = "Put Rack",
placement = {
header = "Placement Keyboard",
arrow_up = '<i class="fa-solid fa-arrow-up"></i>',
arrow_left = '<i class="fa-solid fa-arrow-left"></i>',
arrow_right = '<i class="fa-solid fa-arrow-right"></i>',
arrow_desc = "MOVE",
zkey = "Z",
z_desc = "Reduce Height",
qkey = "Q",
ekey = "E",
rotate = "Rotate",
ctrl = "CTRL",
shift = "SHIFT",
right_dip = "Right Dip",
left_dip = "Left Dip",
fixground = "Fix Ground",
finish = "Finish",
cancel = "Cancel",
space = "SPACE",
enter = "ENTER",
backspace = "BACKSPACE"
},
input = {
title = "Complete Rack Placement",
label = 'Rack Label',
description = 'Set label here',
confirm = "Confirm",
},
remove_rack = "Remove Rack",
rack_removed = "Rack Succcesfuly Removed!",
default_rack_label = "Gun Rack",
no_target_interaction_preset = "[G]",
take_weapon = "Take Weapon",
not_found_attachment = 'Weapon not have any attachment!',
}
Last updated