Wert Med System
You can access the setup information you need about this product
Last updated
You can access the setup information you need about this product
Last updated
['bandage'] = {
label = 'Bandage',
weight = 115,
rate = { id = "common", background = "#2d703b5c" }
},
['painkillers'] = {
label = 'Painkillers',
weight = 400,
},
['antibiotics'] = {
label = 'Antibiotics',
weight = 400,
},
['adrenaline'] = {
label = 'Adrenaline Shot',
weight = 400,
},
['antiseptic'] = {
label = 'Antiseptic Spray',
weight = 400,
},
['vitamins'] = {
label = 'Vitamins',
weight = 400,
},
['insulin'] = {
label = 'Insulin Injection',
weight = 400,
},
['morphine'] = {
label = 'Morphine',
weight = 400,
},
['oxygenmask'] = {
label = 'Oxygen Mask',
weight = 400,
},
['ivfluid'] = {
label = 'IV Fluid',
weight = 400,
},bandage = {
name = 'bandage',
label = 'Bandage',
weight = 115,
type = 'item',
image = 'bandage.png',
},
painkillers = {
name = 'painkillers',
label = 'Painkillers',
weight = 400,
type = 'item',
image = 'painkillers.png',
},
antibiotics = {
name = 'antibiotics',
label = 'Antibiotics',
weight = 400,
type = 'item',
image = 'antibiotics.png',
},
adrenaline = {
name = 'adrenaline',
label = 'Adrenaline Shot',
weight = 400,
type = 'item',
image = 'adrenaline.png',
},
antiseptic = {
name = 'antiseptic',
label = 'Antiseptic Spray',
weight = 400,
type = 'item',
image = 'antiseptic.png',
},
vitamins = {
name = 'vitamins',
label = 'Vitamins',
weight = 400,
type = 'item',
image = 'vitamins.png',
unique = false, useable = true, shouldClose = true, combinable = nil, description = ''
},
insulin = {
name = 'insulin',
label = 'Insulin Injection',
weight = 400,
type = 'item',
image = 'insulin.png',
unique = false, useable = true, shouldClose = true, combinable = nil, description = ''
},
morphine = {
name = 'morphine',
label = 'Morphine',
weight = 400,
type = 'item',
image = 'morphine.png',
unique = false, useable = true, shouldClose = true, combinable = nil, description = ''
},
oxygenmask = {
name = 'oxygenmask',
label = 'Oxygen Mask',
weight = 400,
type = 'item',
image = 'oxygenmask.png',
unique = false, useable = true, shouldClose = true, combinable = nil, description = ''
},
ivfluid = {
name = 'ivfluid',
label = 'IV Fluid',
weight = 400,
type = 'item',
image = 'ivfluid.png',
unique = false, useable = true, shouldClose = true, combinable = nil, description = ''
},-- # General Settings
Config = {
Framework = 'qb', -- 'qb' or 'esx' or 'qbox'
}
Config.MedsSystem = {
Jobs = { ['ambulance'] = 0 },
Keys = {
OpenMyPrescriptions = 'F9'
},
CanWriteSelf = false,
Adherence = {
OverdueToleranceMin = 1,
DamageEveryMinutes = 5,
DamageAmount = 5,
BannerIcon = 'fa-solid fa-pills',
},
WhitelistMeds = {
{ value = 'bandage', label = 'Bandage', icon = 'nui://ox_inventory/web/images/bandage.png' },
{ value = 'painkillers', label = 'Painkillers', icon = 'nui://ox_inventory/web/images/painkillers.png' },
{ value = 'antibiotics', label = 'Antibiotics', icon = 'nui://ox_inventory/web/images/antibiotics.png' },
{ value = 'adrenaline', label = 'Adrenaline Shot', icon = 'nui://ox_inventory/web/images/adrenaline.png' },
{ value = 'antiseptic', label = 'Antiseptic Spray',icon = 'nui://ox_inventory/web/images/antiseptic.png' },
{ value = 'vitamins', label = 'Vitamins', icon = 'nui://ox_inventory/web/images/vitamins.png' },
{ value = 'insulin', label = 'Insulin Injection', icon = 'nui://ox_inventory/web/images/insulin.png' },
{ value = 'morphine', label = 'Morphine', icon = 'nui://ox_inventory/web/images/morphine.png' },
{ value = 'oxygenmask', label = 'Oxygen Mask', icon = 'nui://ox_inventory/web/images/oxygenmask.png' },
{ value = 'ivfluid', label = 'IV Fluid', icon = 'nui://ox_inventory/web/images/ivfluid.png' },
},
Consume = {
Default = {
duration = 3000,
label = 'Taking medicine ...',
canCancel = false,
disable = { move = true, car = true, combat = true },
anim = { dict = 'amb@world_human_clipboard@male@base', clip = 'base', flag = 49 },
},
Overrides = {
bandage = {
duration = 4000,
label = 'Applying bandage ...',
anim = { dict = 'missheistdockssetup1clipboard@base', clip = 'base', flag = 49 },
},
painkillers = {
duration = 3500,
label = 'Taking painkillers ...',
anim = { dict = 'mp_player_intdrink', clip = 'loop_bottle', flag = 49 },
},
antibiotics = {
duration = 4000,
label = 'Taking antibiotics ...',
anim = { dict = 'mp_player_intdrink', clip = 'loop_bottle', flag = 49 },
},
adrenaline = {
duration = 4500,
label = 'Injecting adrenaline ...',
anim = { dict = 'amb@world_human_clipboard@male@idle_a', clip = 'idle_a', flag = 49 },
prop = { model = 'prop_syringe_01', bone = 57005, pos = vec3(0.14, 0.03, -0.02), rot = vec3(90.0, 0.0, 0.0) },
},
antiseptic = {
duration = 3000,
label = 'Spraying antiseptic ...',
anim = { dict = 'mp_player_intdrink', clip = 'loop_bottle', flag = 49 },
},
vitamins = {
duration = 3000,
label = 'Taking vitamins ...',
anim = { dict = 'mp_player_intdrink', clip = 'loop_bottle', flag = 49 },
},
insulin = {
duration = 4000,
label = 'Injecting insulin ...',
anim = { dict = 'amb@world_human_clipboard@male@idle_a', clip = 'idle_a', flag = 49 },
prop = { model = 'prop_syringe_01', bone = 57005, pos = vec3(0.12, 0.03, -0.03), rot = vec3(90.0, 0.0, 0.0) },
},
morphine = {
duration = 5000,
label = 'Injecting morphine ...',
anim = { dict = 'amb@world_human_clipboard@male@idle_a', clip = 'idle_a', flag = 49 },
prop = { model = 'prop_syringe_01', bone = 57005, pos = vec3(0.12, 0.03, -0.03), rot = vec3(90.0, 0.0, 0.0) },
},
oxygenmask = {
duration = 4500,
label = 'Applying oxygen mask ...',
anim = { dict = 'missheistdocksprep1hold_cellphone', clip = 'static', flag = 49 },
prop = { model = 'prop_mask_ballistic', bone = 12844, pos = vec3(0.0, 0.0, 0.0), rot = vec3(0.0, 0.0, 0.0) },
},
ivfluid = {
duration = 6000,
label = 'Setting up IV fluid ...',
anim = { dict = 'amb@world_human_clipboard@male@idle_a', clip = 'idle_a', flag = 49 },
},
},
Sound = {
enabled = true,
default = {
enabled = true,
file = 'default_medsound.ogg',
volume = 0.6,
},
overrides = {
bandage = { enabled = true, file = 'bandage.ogg', volume = 0.6 },
painkillers = { enabled = true, file = 'painkillers.ogg', volume = 0.6 },
antibiotics = { enabled = true, file = 'painkillers.ogg', volume = 0.6 },
adrenaline = { enabled = true, file = 'injection.ogg', volume = 0.7 },
antiseptic = { enabled = true, file = 'spray.ogg', volume = 0.6 },
vitamins = { enabled = true, file = 'painkillers.ogg', volume = 0.6 },
insulin = { enabled = true, file = 'injection.ogg', volume = 0.6 },
morphine = { enabled = true, file = 'painkillers.ogg', volume = 0.6 },
oxygenmask = { enabled = true, file = 'oxygen.ogg', volume = 0.6 },
ivfluid = { enabled = true, file = 'fluid.ogg', volume = 0.6 },
}
}
},
}
Config.Tablet = {
Enabled = true,
Jobs = { ['ambulance'] = 0 },
OpenKey = 'F10',
Command = 'recipetablet',
}
LANG = {
MedsSystem = {
notify_title = 'Medication',
notify_only_doctor = 'Only doctors can write prescriptions.',
notify_created = 'Prescription created for %s.',
notify_taken = 'You have taken %s.',
notify_not_due = 'This medicine is not due yet.',
notify_no_prescriptions = 'You have no active prescriptions.',
ui_doctor_title = 'Write Prescription',
ui_doctor_sub = 'Create a new prescription for a patient',
ui_patient = 'Patient',
ui_add_med = 'Add Medicine',
ui_med_name = 'Name',
ui_med_interval = 'Interval (min)',
ui_med_units = 'Units per dose',
ui_med_total = 'Total doses',
ui_notes = 'Notes (optional)',
ui_submit = 'Create',
ui_cancel = 'Cancel',
ui_patient_title = 'My Prescriptions',
ui_patient_sub = 'Your active treatments and schedule',
ui_take_now = 'Take Now',
ui_due_in = 'due in %sm',
ui_due_now = 'due now',
ui_banner_take_meds = 'You must take your medicine',
menu_open_prescriptions = 'My Prescriptions',
menu_open_presc = 'Open',
progress_take = 'Taking medicine ...',
notify_item_enough_error = 'You are not has this med! Please go pharmacy and take it!',
progress_take = 'Taking medicine ...',
ui_clear_eraser = 'Clear',
ui_signature = 'Signature',
ui_med_inf_name = 'Name',
ui_med_info_int = 'Interval (Min)',
ui_med_info_per = 'Units Per Dose',
ui_med_info_total = 'Total Doses',
ui_med_info_note = 'Note',
Prescription_title_new = 'Prescription #%s',
Doses_Description_new = '%s / %s doses',
Completed_Treatment = 'Treatment successfully completed!',
},
Tablet = {
title = 'EMS Tablet',
subtitle = 'Prescription dashboard',
search_placeholder = 'Search Patient / CID / Doctor',
filter_all = 'All',
filter_active = 'Active',
filter_completed = 'Completed',
col_patient = 'Patient',
col_doctor = 'Doctor',
col_status = 'Status',
col_created = 'Created',
col_progress = 'Progress',
status_active = 'Active',
status_completed = 'Completed',
open_details = 'Open',
empty_list = 'No prescriptions found.',
details_title = 'Prescription Details',
details_patient = 'Patient',
details_doctor = 'Doctor',
details_created = 'Created at',
details_notes = 'Notes',
details_items = 'Items',
item_interval = 'Interval',
item_units = 'Units',
item_total = 'Total',
item_taken = 'Taken',
close = 'Close',
header_opened_by = 'Opened by',
cancel = 'Cancel',
cancel_confirm = 'Are you sure you want to cancel this prescription?',
canceled_ok = 'Prescription has been canceled.',
canceled_fail = 'Failed to cancel the prescription.',
status_canceled = 'Canceled',
confirm_title = 'Cancel Prescription?',
confirm_body = 'This action will mark the prescription as canceled. The patient will no longer see it as active.',
confirm_yes = 'Cancel',
confirm_no = 'Keep',
filter_canceled = 'Canceled',
perm_error = 'You are not authorized to open EMS Tablet.',
},
}hasDonePreloading = {}
local discordWebhook = ''
function GiveStarterItems(src)
local Player = Bridge.GetPlayer(src)
if not Player then return end
for _, v in pairs(Config.StarterItems) do
local info = {}
if Config.Framework == 'qb' or Config.Framework == 'qbox' then
if v.item == "id_card" then
info.citizenid = Player.PlayerData.citizenid
info.firstname = Player.PlayerData.charinfo.firstname
info.lastname = Player.PlayerData.charinfo.lastname
info.birthdate = Player.PlayerData.charinfo.birthdate
info.gender = Player.PlayerData.charinfo.gender
info.nationality = Player.PlayerData.charinfo.nationality
elseif v.item == "driver_license" then
info.firstname = Player.PlayerData.charinfo.firstname
info.lastname = Player.PlayerData.charinfo.lastname
info.birthdate = Player.PlayerData.charinfo.birthdate
info.type = "Class C Driver License"
end
else
-- About the esx if u want manage item metadatas
end
Bridge.AddItem(src, { name = v.item, amount = v.amount, slot = false, info = info })
end
end
function loadHouseData(src)
if not Config.LoadQBHouses then return end
local HouseGarages = {}
local Houses = {}
local result = MySQL.query.await('SELECT * FROM houselocations', {})
if result[1] ~= nil then
for _, v in pairs(result) do
local owned = false
if tonumber(v.owned) == 1 then
owned = true
end
local garage = v.garage ~= nil and json.decode(v.garage) or {}
Houses[v.name] = {
coords = json.decode(v.coords),
owned = owned,
price = v.price,
locked = true,
adress = v.label,
tier = v.tier,
garage = garage,
decorations = {},
}
HouseGarages[v.name] = {
label = v.label,
takeVehicle = garage,
}
end
end
TriggerClientEvent("qb-garages:client:houseGarageConfig", src, HouseGarages)
TriggerClientEvent("qb-houses:client:setHouseConfig", src, Houses)
end
function DeleteCharacter(src, identifier)
if Config.Framework == 'qb' or Config.Framework == 'qbox' then
Bridge.framework.Player.DeleteCharacter(src, identifier)
else
-- ESX
local DB_TABLES = { users = "identifier" }
local query = "DELETE FROM `%s` WHERE %s = ?"
local queries = {}
local count = 0
for table, column in pairs(DB_TABLES) do
count = count + 1
queries[count] = { query = query:format(table, column), values = { identifier } }
end
MySQL.transaction(queries, function(result)
if result then
print(("[^2INFO^7] Player ^5%s %s^7 has deleted a character ^5(%s)^7"):format(GetPlayerName(src), src, identifier))
Wait(50)
else
error("\n^1Transaction failed while trying to delete " .. identifier .. "^0")
end
end)
end
TriggerClientEvent('ox_lib:notify', src, { title = 'Character Deleted!', type = 'success' })
end
function DiscordLog(src, new, identifier)
local title = nil
local message = nil
if new then
message = "**".. GetPlayerName(src) .. "** (<@"..(Bridge.GetIdentifier(src, 'discord') and Bridge.GetIdentifier(src, 'discord'):gsub("discord:", "") or "unknown").."> | ||" ..(Bridge.GetIdentifier(src, 'ip') or 'undefined') .. "|| | " ..(Bridge.GetIdentifier(src, 'license') or 'undefined') .." | "..src..") Created new character : .. \n " .. json.encode(new, {indent=true})
else
title = 'Player Loaded ( Joined )'
message = "**".. GetPlayerName(src) .. "** (<@"..(Bridge.GetIdentifier(src, 'discord') and Bridge.GetIdentifier(src, 'discord'):gsub("discord:", "") or "unknown").."> | ||" ..(Bridge.GetIdentifier(src, 'ip') or 'undefined') .. "|| | " ..(Bridge.GetIdentifier(src, 'license') or 'undefined') .." | " ..identifier.." | "..src..") loaded.."
end
local embedData = {
{
['title'] = title,
['color'] = '65280',
['footer'] = { ['text'] = os.date('%c') },
['description'] = message,
['author'] = { ['name'] = "Multicharacter" },
}
}
PerformHttpRequest(discordWebhook, function() end, 'POST', json.encode({ username = 'Multicharacter', embeds = embedData}), { ['Content-Type'] = 'application/json' })
end
local function extractCharNumber(str)
local num = string.match(str, "^char(%d+):")
return tonumber(num)
end
local function containsCharKeyword(str)
return string.find(str, "char") ~= nil
end
local function GetPlayerCitizenIDDatas(src)
local data = {}
local license2, license = GetPlayerIdentifierByType(src, 'license2'), GetPlayerIdentifierByType(src, 'license')
local promise = promise.new()
if Config.Framework ~= 'esx' then
local result = MySQL.query.await('SELECT citizenid, cid, UNIX_TIMESTAMP(last_logged_out) AS lastLoggedOutUnix FROM players WHERE license = ? OR license = ? ORDER BY cid', {license, license2})
for i = 1, #result do
data[#data + 1] = { citizenid = result[i].citizenid, cid = result[i].cid }
end
else
-- Esx
local PREFIX = Config.Prefix or "char"
local identifier = GetIdentifier(src)
local pattern = PREFIX .. "%:" .. identifier
local result = MySQL.query.await([[
SELECT identifier, skin
FROM users
WHERE identifier = ?
OR identifier LIKE ?
]], { identifier, pattern })
for i = 1, #result do
if extractCharNumber(result[i].identifier) then
data[#data + 1] = { citizenid = result[i].identifier, cid = extractCharNumber(result[i].identifier), skin = result[i].skin and json.decode(result[i].skin) or {} }
end
end
end
return data
end
AddEventHandler('QBCore:Server:PlayerLoaded', function(Player)
Wait(1000) -- 1 second should be enough to do the preloading in other resources
hasDonePreloading[Player.PlayerData.source] = true
end)
AddEventHandler('QBCore:Server:OnPlayerUnload', function(src)
hasDonePreloading[src] = false
end)
-- # Callbacks
lib.callback.register('wert-multicharacter:server:get-player-ui-data', function(source)
local src = source
local license2, license = GetPlayerIdentifierByType(src, 'license2'), GetPlayerIdentifierByType(src, 'license')
local plyChars = {}
if Config.Framework == 'qb' or Config.Framework == 'qbox' then
local result = MySQL.query.await('SELECT citizenid, charinfo, money, job, gang, position, cid, UNIX_TIMESTAMP(last_logged_out) AS lastLoggedOutUnix FROM players WHERE license = ? OR license = ? ORDER BY cid', {license, license2})
for i = 1, #result do
local cid = tostring(result[i].cid)
result[i].charinfo = json.decode(result[i].charinfo)
result[i].money = json.decode(result[i].money)
result[i].job = json.decode(result[i].job)
plyChars[cid] = result[i]
end
else
-- ESX
local function ESXGetJobLabel(name, grade)
local isLabel = MySQL.scalar.await('SELECT `label` FROM `job_grades` WHERE `job_name` = ? AND `grade` = ? LIMIT 1', { name, tonumber(grade) })
if not isLabel then isLabel = 'Unemployed' end
return { grade = { name = isLabel } }
end
local PREFIX = Config.Prefix or "char"
local identifier = GetIdentifier(src)
local pattern = PREFIX .. "%:" .. identifier
local result = MySQL.query.await([[
SELECT identifier, accounts, job, job_grade, firstname, lastname, dateofbirth, sex, nationality
FROM users
WHERE identifier = ?
OR identifier LIKE ?
]], { identifier, pattern })
for i = 1, #result do
if extractCharNumber(result[i].identifier) then
local cid = extractCharNumber(result[i].identifier)
cid = tostring(cid)
local accounts = result[i].accounts and json.decode(result[i].accounts) or {}
plyChars[cid] = {
citizenid = result[i].identifier,
cid = tonumber(cid),
job = ESXGetJobLabel(result[i].job, result[i].job_grade),
money = { cash = accounts.money or 0, bank = accounts.bank or 0 },
charinfo = {
gender = result[i].sex == 'f' and 1 or 0,
birthdate = result[i].dateofbirth,
firstname = result[i].firstname,
lastname = result[i].lastname,
nationality = result[i].nationality or Config.DefaultNationality
}
}
end
end
end
return plyChars
end)
lib.callback.register('wert-multicharacter:server:get-spawn-peds', function(source)
local src = source
if Config.Framework == 'esx' then
Bridge.framework.Players[GetIdentifier(src)] = true
end
local plyChars = GetPlayerCitizenIDDatas(src)
if #plyChars > 0 then
local skins = {}
local citizenTable = {}
local queryTable = {}
for i=1, #plyChars do
queryTable[#queryTable+1] = plyChars[i].citizenid
citizenTable[plyChars[i].citizenid] = plyChars[i].cid
if Config.ClothingSystem == 'skinchanger' then
local selectCid = tostring(plyChars[i].cid)
local model = `mp_m_freemode_01`
if plyChars[i].skin and plyChars[i].skin == 1 then model = `mp_f_freemode_01` end
skins[selectCid] = { model = model, skin = plyChars[i].skin }
end
end
if Config.ClothingSystem ~= 'skinchanger' then
local result = MySQL.query.await('SELECT * FROM playerskins WHERE citizenid IN (?) AND active = 1', { queryTable })
if result then
for _, row in ipairs(result) do
local selectCid = citizenTable[row.citizenid]
selectCid = tostring(selectCid)
if Config.ClothingSystem == 'illenium-appearance' then
local mySkinData = json.decode(row.skin)
skins[selectCid] = {model = mySkinData.model, skin = mySkinData}
else
skins[selectCid] = {model = row.model, skin = json.decode(row.skin)}
end
end
end
end
return skins
else
return {}
end
end)
-- # Logout command
if Config.Logout.active then
lib.addCommand(Config.Logout.name, {
help = Config.Logout.description,
restricted = 'group.' .. Config.Logout.group
}, function(source, args, raw)
local src = source
local ply = Bridge.GetPlayer(src)
if not ply then
TriggerClientEvent('ox_lib:notify', src, { title = LANG.target_not_online, type = 'error' })
return
end
if Config.Framework == 'qb' or Config.Framework == 'qbox' then
Bridge.framework.Player.Logout(src)
else
TriggerEvent("esx:playerLogout", src)
end
TriggerClientEvent('wert-multicharacter:client:chooseChar', src)
end)
end
if Config.Framework == 'esx' then
local PREFIX = Config.Prefix or "char"
local PRIMARY_IDENTIFIER = Bridge.framework.GetConfig().Identifier or GetConvar("sv_lan", "") == "true" and "ip" or "license"
local oneSyncState = GetConvar("onesync", "off")
CreateThread(function()
Wait(1000)
if next(Bridge.framework.Players) then
local players = table.clone(Bridge.framework.Players)
table.wipe(Bridge.framework.Players)
for _, v in pairs(players) do
Bridge.framework.Players[GetIdentifier(v.source)] = true
end
else
Bridge.framework.Players = {}
end
end)
AddEventHandler("playerConnecting", function(_, _, deferrals)
deferrals.defer()
local identifier = GetIdentifier(source)
if oneSyncState == "off" or oneSyncState == "legacy" then
return deferrals.done(("[ESX] ESX Requires Onesync Infinity to work. This server currently has Onesync set to: %s"):format(oneSyncState))
end
if identifier then
if not Bridge.framework.GetConfig().EnableDebug then
if Bridge.framework.Players[identifier] then
deferrals.done(("[Wert Multicharacter] A player is already connected to the server with this identifier.\nYour identifier: %s:%s"):format(PRIMARY_IDENTIFIER, identifier))
else
deferrals.done()
end
else
deferrals.done()
end
else
deferrals.done(("Unable to retrieve player identifier.\nIdentifier type: %s"):format(PRIMARY_IDENTIFIER))
end
end)
MySQL.ready(function()
Wait(1000)
while not next(Bridge.framework.Jobs) do
Wait(500)
Bridge.framework.Jobs = Bridge.framework.GetJobs()
end
end)
AddEventHandler("playerDropped", function()
hasDonePreloading[source] = false
Bridge.framework.Players[GetIdentifier(source)] = nil
end)
function GetIdentifier(source)
local fxDk = GetConvarInt("sv_fxdkMode", 0)
if fxDk == 1 then return "ESX-DEBUG-LICENCE" end
local identifier = GetPlayerIdentifierByType(source, PRIMARY_IDENTIFIER)
return identifier and identifier:gsub(PRIMARY_IDENTIFIER .. ":", "")
end
endBridge = {}
-- # Get core
if Config.Framework == 'qb' then
Bridge.framework = exports['qb-core']:GetCoreObject()
elseif Config.Framework == 'qbox' then
Bridge.framework = exports['qb-core']:GetCoreObject()
elseif Config.Framework == 'esx' then
Bridge.framework = exports["es_extended"]:getSharedObject()
endBridge = {}
-- # Get core
if Config.Framework == 'qb' then
Bridge.framework = exports['qb-core']:GetCoreObject()
elseif Config.Framework == 'qbox' then
Bridge.framework = exports['qb-core']:GetCoreObject()
elseif Config.Framework == 'esx' then
Bridge.framework = exports["es_extended"]:getSharedObject()
end
function Bridge.GetPlayer(src)
if not src then return nil end
if Config.Framework == 'qb' or Config.Framework == 'qbox' then
return Bridge.framework.Functions.GetPlayer(src)
else
return Bridge.framework.GetPlayerFromId(src)
end
end
function Bridge.GetIdentifier(src, idtype)
if GetConvarInt('sv_fxdkMode', 0) == 1 then return 'license:fxdk' end
return GetPlayerIdentifierByType(src, idtype or 'license')
end
function Bridge.AddItem(src, data)
if not src then return false end
local ply = Bridge.GetPlayer(src)
if not ply then return end
if GetResourceState('ox_inventory') == 'started' then
exports.ox_inventory:AddItem(src, data.name, data.amount, data.info, data.slot)
return
end
if Config.Framework == 'qb' or Config.Framework == 'qbox' then
ply.Functions.AddItem(data.name, data.amount, data.slot, data.info)
else
ply.addInventoryItem(data.name, data.amount)
end
end