This commit is contained in:
Nordi98 2025-07-09 19:41:05 +02:00
parent 30bf7c8604
commit 8dbe79a29d
135 changed files with 0 additions and 0 deletions

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,21 @@
--- @return boolean @true if player is boss, false if not
tgiCore.isBoss = function(job)
if job and job ~= PlayerData.job.name then return end
return PlayerData.job.boss or PlayerData.job.isboss or (PlayerData.job.grade_name and PlayerData.job.grade_name == "boss")
end

--- Open boss menu for player job
tgiCore.OpenBossMenu = function()
if not tgiCore.isBoss() then return end
if config.tgiannServer then
TriggerEvent('esx_society:openBossMenu', PlayerData.job.name, function(_, menu)
menu.close()
end, { wash = false })
else
if config.framework == "esx" then
TriggerEvent('esx_society:openBossMenu', PlayerData.job.name, function() end, { wash = false })
elseif config.framework == "qb" then
TriggerEvent("qb-bossmenu:client:OpenMenu")
end
end
end

View file

@ -0,0 +1,18 @@
local tgiann_clothing = GetResourceState("tgiann-clothing") ~= "missing"
local rcore_clothing = GetResourceState("rcore_clothing") ~= "missing"

tgiCore.OpenClothingShop = function()
--local invokingResource = GetInvokingResource()
if tgiann_clothing then
exports["tgiann-clothing"]:openMenu({
allowedMenus = { [0] = false, [1] = true, [2] = false, [3] = false },
isBerberMenu = false,
})
elseif rcore_clothing then
TriggerEvent('rcore_clothing:openShop', "binco")
elseif config.framework == "qb" then
TriggerEvent("qb-clothing:client:openOutfitMenu")
elseif confg.framework == "esx" then
-- TODO: Implement ESX clothing shop
end
end

View file

@ -0,0 +1,55 @@
local lang = langs[config.lang]
local esxDuty = nil

--- @return boolean @true if on duty, false if off duty
function tgiCore.IsOnDuty()
if config.framework == "esx" then
if config.esx_service then
if esxDuty == nil then
local p = promise.new()
tgiCore.core.TriggerServerCallback('esx_service:isInService', function(isInService)
p:resolve(isInService)
end, PlayerData.job.name)
esxDuty = Citizen.Await(p)
end
return esxDuty
else
return true -- If there is no service script, return true for default
end
elseif config.framework == "qb" then
return PlayerData.job.onduty
end
return nil
end

--- Toogle on/off duty
--- @return string @ dutyFull | onDuty | offDuty
function tgiCore.ToggleDuty()
local onDuty = tgiCore.IsOnDuty()
if onDuty == nil then return end
if config.framework == "esx" then
if config.esx_service then
if onDuty then
TriggerServerEvent('esx_service:disableService', PlayerData.job.name)
esxDuty = false
else
local p = promise.new()
tgiCore.core.TriggerServerCallback('esx_service:enableService', function(canTakeService, maxInService, inServiceCount)
esxDuty = canTakeService
if not canTakeService then
tgiCore.notif(lang.dutyFull, "error")
return p:resolve("dutyFull")
end
p:resolve("onDuty")
end, PlayerData.job.name)
return Citizen.Await(p)
end
else
tgiCore.DebugWarningLog("Not found any service/duty script for ESX! You can edit from 'client/functions/duty.lua'")
return "offDuty"
end
elseif config.framework == "qb" then
TriggerServerEvent('QBCore:ToggleDuty')
end
return onDuty and "offDuty" or "onDuty"
end

View file

@ -0,0 +1,169 @@
if config.framework == "esx" then
tgiCore.GetVehicleProperties = myFramework.Game.GetVehicleProperties
elseif config.framework == "qb" then
tgiCore.GetVehicleProperties = myFramework.Functions.GetVehicleProperties
else
local gameBuild = GetGameBuildNumber()
function tgiCore.GetVehicleProperties(vehicle)
if DoesEntityExist(vehicle) then
---@type number | number[], number | number[]
local colorPrimary, colorSecondary = GetVehicleColours(vehicle)
local pearlescentColor, wheelColor = GetVehicleExtraColours(vehicle)
local paintType1 = GetVehicleModColor_1(vehicle)
local paintType2 = GetVehicleModColor_2(vehicle)

if GetIsVehiclePrimaryColourCustom(vehicle) then
colorPrimary = { GetVehicleCustomPrimaryColour(vehicle) }
end

if GetIsVehicleSecondaryColourCustom(vehicle) then
colorSecondary = { GetVehicleCustomSecondaryColour(vehicle) }
end

local extras = {}

for i = 1, 15 do
if DoesExtraExist(vehicle, i) then
extras[i] = IsVehicleExtraTurnedOn(vehicle, i) and 0 or 1
end
end

local modLiveryCount = GetVehicleLiveryCount(vehicle)
local modLivery = GetVehicleLivery(vehicle)

if modLiveryCount == -1 or modLivery == -1 then
modLivery = GetVehicleMod(vehicle, 48)
end

local damage = {
windows = {},
doors = {},
tyres = {},
}

local windows = 0

for i = 0, 7 do
RollUpWindow(vehicle, i)

if not IsVehicleWindowIntact(vehicle, i) then
windows += 1
damage.windows[windows] = i
end
end

local doors = 0

for i = 0, 5 do
if IsVehicleDoorDamaged(vehicle, i) then
doors += 1
damage.doors[doors] = i
end
end

for i = 0, 7 do
if IsVehicleTyreBurst(vehicle, i, false) then
damage.tyres[i] = IsVehicleTyreBurst(vehicle, i, true) and 2 or 1
end
end

local neons = {}

for i = 0, 3 do
neons[i + 1] = IsVehicleNeonLightEnabled(vehicle, i)
end

return {
model = GetEntityModel(vehicle),
plate = GetVehicleNumberPlateText(vehicle),
plateIndex = GetVehicleNumberPlateTextIndex(vehicle),
bodyHealth = math.floor(GetVehicleBodyHealth(vehicle) + 0.5),
engineHealth = math.floor(GetVehicleEngineHealth(vehicle) + 0.5),
tankHealth = math.floor(GetVehiclePetrolTankHealth(vehicle) + 0.5),
fuelLevel = math.floor(GetVehicleFuelLevel(vehicle) + 0.5),
oilLevel = math.floor(GetVehicleOilLevel(vehicle) + 0.5),
dirtLevel = math.floor(GetVehicleDirtLevel(vehicle) + 0.5),
paintType1 = paintType1,
paintType2 = paintType2,
color1 = colorPrimary,
color2 = colorSecondary,
pearlescentColor = pearlescentColor,
interiorColor = GetVehicleInteriorColor(vehicle),
dashboardColor = GetVehicleDashboardColour(vehicle),
wheelColor = wheelColor,
wheelWidth = GetVehicleWheelWidth(vehicle),
wheelSize = GetVehicleWheelSize(vehicle),
wheels = GetVehicleWheelType(vehicle),
windowTint = GetVehicleWindowTint(vehicle),
xenonColor = GetVehicleXenonLightsColor(vehicle),
neonEnabled = neons,
neonColor = { GetVehicleNeonLightsColour(vehicle) },
extras = extras,
tyreSmokeColor = { GetVehicleTyreSmokeColor(vehicle) },
modSpoilers = GetVehicleMod(vehicle, 0),
modFrontBumper = GetVehicleMod(vehicle, 1),
modRearBumper = GetVehicleMod(vehicle, 2),
modSideSkirt = GetVehicleMod(vehicle, 3),
modExhaust = GetVehicleMod(vehicle, 4),
modFrame = GetVehicleMod(vehicle, 5),
modGrille = GetVehicleMod(vehicle, 6),
modHood = GetVehicleMod(vehicle, 7),
modFender = GetVehicleMod(vehicle, 8),
modRightFender = GetVehicleMod(vehicle, 9),
modRoof = GetVehicleMod(vehicle, 10),
modEngine = GetVehicleMod(vehicle, 11),
modBrakes = GetVehicleMod(vehicle, 12),
modTransmission = GetVehicleMod(vehicle, 13),
modHorns = GetVehicleMod(vehicle, 14),
modSuspension = GetVehicleMod(vehicle, 15),
modArmor = GetVehicleMod(vehicle, 16),
modNitrous = GetVehicleMod(vehicle, 17),
modTurbo = IsToggleModOn(vehicle, 18),
modSubwoofer = GetVehicleMod(vehicle, 19),
modSmokeEnabled = IsToggleModOn(vehicle, 20),
modHydraulics = IsToggleModOn(vehicle, 21),
modXenon = IsToggleModOn(vehicle, 22),
modFrontWheels = GetVehicleMod(vehicle, 23),
modBackWheels = GetVehicleMod(vehicle, 24),
modCustomTiresF = GetVehicleModVariation(vehicle, 23),
modCustomTiresR = GetVehicleModVariation(vehicle, 24),
modPlateHolder = GetVehicleMod(vehicle, 25),
modVanityPlate = GetVehicleMod(vehicle, 26),
modTrimA = GetVehicleMod(vehicle, 27),
modOrnaments = GetVehicleMod(vehicle, 28),
modDashboard = GetVehicleMod(vehicle, 29),
modDial = GetVehicleMod(vehicle, 30),
modDoorSpeaker = GetVehicleMod(vehicle, 31),
modSeats = GetVehicleMod(vehicle, 32),
modSteeringWheel = GetVehicleMod(vehicle, 33),
modShifterLeavers = GetVehicleMod(vehicle, 34),
modAPlate = GetVehicleMod(vehicle, 35),
modSpeakers = GetVehicleMod(vehicle, 36),
modTrunk = GetVehicleMod(vehicle, 37),
modHydrolic = GetVehicleMod(vehicle, 38),
modEngineBlock = GetVehicleMod(vehicle, 39),
modAirFilter = GetVehicleMod(vehicle, 40),
modStruts = GetVehicleMod(vehicle, 41),
modArchCover = GetVehicleMod(vehicle, 42),
modAerials = GetVehicleMod(vehicle, 43),
modTrimB = GetVehicleMod(vehicle, 44),
modTank = GetVehicleMod(vehicle, 45),
modWindows = GetVehicleMod(vehicle, 46),
modDoorR = GetVehicleMod(vehicle, 47),
modLivery = modLivery,
modRoofLivery = GetVehicleRoofLivery(vehicle),
modLightbar = GetVehicleMod(vehicle, 49),
windows = damage.windows,
doors = damage.doors,
tyres = damage.tyres,
bulletProofTyres = GetVehicleTyresCanBurst(vehicle),
driftTyres = gameBuild >= 2372 and GetDriftTyresEnabled(vehicle),
-- no setters?
-- leftHeadlight = GetIsLeftVehicleHeadlightDamaged(vehicle),
-- rightHeadlight = GetIsRightVehicleHeadlightDamaged(vehicle),
-- frontBumper = IsVehicleBumperBrokenOff(vehicle, true),
-- rearBumper = IsVehicleBumperBrokenOff(vehicle, false),
}
end
end
end

View file

@ -0,0 +1,76 @@
-- client

-- Support for inventory scripts:
-- qb-inventory
-- tgiann-inventory
-- ox_inventory
-- qs-inventory
-- codem-inventory
-- origen_inventory
-- core_inventory

--- @param data table {stashName: string, slots: number, maxWeight: number, label: string, blacklist: table, whitelist: table, isPlayer: boolean}
--- @diagnostic disable-next-line dublicate-function
tgiCore.OpenStash = function(data)
if next(data) then data.maxWeight = data.maxweight or data.maxWeight end
if config["qs-inventory"] then
local stashName = ("Stash_%s"):format(data.stashName)
--exports["qs-inventory"]:RegisterStash(stashName, data.slots, data.maxWeight) -- Probably not needed
TriggerServerEvent("inventory:server:OpenInventory", "stash", stashName, {
maxweight = data.maxWeight,
slots = data.slots,
})
TriggerEvent("inventory:client:SetCurrentStash", stashName)
elseif config["codem-inventory"] then
TriggerServerEvent('inventory:server:OpenInventory', 'stash', data.stashName, { maxweight = data.maxWeight, slots = data.slots })
else
assert(false, "There is no open stash event in the client for the inventory you are using!")
end
end

RegisterNetEvent("tgiann-core:client:openInventory")
AddEventHandler("tgiann-core:client:openInventory", tgiCore.OpenStash)

-- SHOP

--- @param data table { shopName: string, items: table }
--- @diagnostic disable-next-line dublicate-function
tgiCore.OpenShop = function(data)
if config.ox_inventory then
exports.ox_inventory:openInventory("shop", data.shopName)
elseif config["qs-inventory"] then
local Items = {
label = data.shopName,
items = data.items
}
TriggerServerEvent("inventory:server:OpenInventory", "shop", "Itemshop_" .. data.shopName, Items)
elseif config["codem-inventory"] then
TriggerEvent('codem-inventory:openshop', data.shopName)
else
assert(false, "There is no open shop event in the client for the inventory you are using!")
end
end

RegisterNetEvent("tgiann-core:client:openShop")
AddEventHandler("tgiann-core:client:openShop", tgiCore.OpenShop)

-- TARGET PLAYER

--- @param targetSrc number
--- @diagnostic disable-next-line dublicate-function
tgiCore.OpenTargetPlayerInventory = function(targetSrc)
if config.core_inventory then
TriggerServerEvent('core_inventory:server:openInventory', targetSrc, 'otherplayer', nil, nil, true)
elseif config.ox_inventory then
exports.ox_inventory:openInventory("player", targetSrc)
elseif config["qs-inventory"] then
TriggerServerEvent("inventory:server:OpenInventory", "otherplayer", targetSrc)
elseif config["codem-inventory"] then
TriggerEvent('codem-inventory:client:robplayer', targetSrc)
else
assert(false, "There is no open target player inventory event in the client for the inventory you are using!")
end
end

RegisterNetEvent("tgiann-core:client:OpenTargetPlayerInventory")
AddEventHandler("tgiann-core:client:OpenTargetPlayerInventory", tgiCore.OpenTargetPlayerInventory)

View file

@ -0,0 +1,5 @@
tgiCore.OpenMechanicMenu = function()
if config.framework == "qb" then
elseif confg.framework == "esx" then
end
end

View file

@ -0,0 +1,122 @@
local bussy = false
local lang = langs[config.lang]

local lumihud = GetResourceState("tgiann-lumihud") ~= "missing"
local tgiannProgressbar = GetResourceState("tgiann-progressbar") ~= "missing"

tgiCore.Progressbar = function(name, label, duration, useWhileDead, canCancel, disableControls, animation, prop, propTwo, onFinish, onCancel)
if bussy then
tgiCore.notif(lang.alreadyError, "error")
if onCancel then onCancel() end
return false
end

bussy = true

if lumihud then
local success = exports['tgiann-lumihud']:Progress({
name = name:lower(),
duration = duration,
label = label,
useWhileDead = useWhileDead,
canCancel = canCancel,
controlDisables = disableControls,
animation = animation and animation or {},
prop = prop and prop or {},
propTwo = propTwo and propTwo or {},
})
bussy = false
if success then
if onFinish then onFinish() end
else
if onCancel then onCancel() end
end
return success
elseif tgiannProgressbar then
local p = promise.new()
exports['tgiann-progressbar']:Progress({
name = name:lower(),
duration = duration,
label = label,
useWhileDead = useWhileDead,
canCancel = canCancel,
controlDisables = disableControls,
animation = animation and animation or {},
prop = prop and prop or {},
propTwo = propTwo and propTwo or {},
}, function(cancelled)
if not cancelled then
p:resolve(true)
else
p:resolve(false)
end
end)
local success = Citizen.Await(p)
bussy = false
if success then
if onFinish then onFinish() end
else
if onCancel then onCancel() end
end
return success
elseif config.framework == "qb" and not config.qbx then -- QB Framework
local p = promise.new()
tgiCore.core.Functions.Progressbar(
name:lower(),
label,
duration,
useWhileDead,
canCancel,
disableControls,
animation or {},
prop or {},
propTwo or {},
function()
p:resolve(true)
end,
function()
p:resolve(false)
end)

local success = Citizen.Await(p)

bussy = false
if success then
if onFinish then onFinish() end
else
if onCancel then onCancel() end
end
return success
else
local success = lib.progressBar({
duration = duration,
label = label,
useWhileDead = useWhileDead,
canCancel = canCancel,
disable = {
car = disableControls.disableCarMovement,
move = disableControls.disableMovement,
combat = disableControls.disableCombat,
mouse = disableControls.disableMouse,
},
anim = animation and {
dict = animation.animDict,
clip = animation.anim,
flag = animation.flags
},
prop = prop and {
model = prop.model,
pos = prop.coords,
rot = prop.rotation,
bone = prop.bone
},
})
bussy = false
if success then
if onFinish then onFinish() end
else
if onCancel then onCancel() end
end
return success
end
end

View file

@ -0,0 +1,360 @@
if config.framework == "esx" then
tgiCore.SetVehicleProperties = myFramework.Game.SetVehicleProperties
elseif config.framework == "qb" then
tgiCore.SetVehicleProperties = myFramework.Functions.SetVehicleProperties
else
local gameBuild = GetGameBuildNumber()

function tgiCore.SetVehicleProperties(vehicle, props, fixVehicle)
if not DoesEntityExist(vehicle) then
error(("Unable to set vehicle properties for '%s' (entity does not exist)"):format(vehicle))
end

local colorPrimary, colorSecondary = GetVehicleColours(vehicle)
local pearlescentColor, wheelColor = GetVehicleExtraColours(vehicle)

SetVehicleModKit(vehicle, 0)
-- SetVehicleAutoRepairDisabled(vehicle, true)

if props.extras then
for id, disable in pairs(props.extras) do
SetVehicleExtra(vehicle, tonumber(id) --[[@as number]], disable == 1)
end
end

if props.plate then
SetVehicleNumberPlateText(vehicle, props.plate)
end

if props.plateIndex then
SetVehicleNumberPlateTextIndex(vehicle, props.plateIndex)
end

if props.bodyHealth then
SetVehicleBodyHealth(vehicle, props.bodyHealth + 0.0)
end

if props.engineHealth then
SetVehicleEngineHealth(vehicle, props.engineHealth + 0.0)
end

if props.tankHealth then
SetVehiclePetrolTankHealth(vehicle, props.tankHealth + 0.0)
end

if props.fuelLevel then
SetVehicleFuelLevel(vehicle, props.fuelLevel + 0.0)
end

if props.oilLevel then
SetVehicleOilLevel(vehicle, props.oilLevel + 0.0)
end

if props.dirtLevel then
SetVehicleDirtLevel(vehicle, props.dirtLevel + 0.0)
end

if props.color1 then
if type(props.color1) == 'number' then
ClearVehicleCustomPrimaryColour(vehicle)
SetVehicleColours(vehicle, props.color1 --[[@as number]], colorSecondary --[[@as number]])
else
if props.paintType1 then SetVehicleModColor_1(vehicle, props.paintType1, colorPrimary, pearlescentColor) end

SetVehicleCustomPrimaryColour(vehicle, props.color1[1], props.color1[2], props.color1[3])
end
end

if props.color2 then
if type(props.color2) == 'number' then
ClearVehicleCustomSecondaryColour(vehicle)
SetVehicleColours(vehicle, props.color1 or colorPrimary --[[@as number]], props.color2 --[[@as number]])
else
if props.paintType2 then SetVehicleModColor_2(vehicle, props.paintType2, colorSecondary) end

SetVehicleCustomSecondaryColour(vehicle, props.color2[1], props.color2[2], props.color2[3])
end
end

if props.pearlescentColor or props.wheelColor then
SetVehicleExtraColours(vehicle, props.pearlescentColor or pearlescentColor, props.wheelColor or wheelColor)
end

if props.interiorColor then
SetVehicleInteriorColor(vehicle, props.interiorColor)
end

if props.dashboardColor then
SetVehicleDashboardColor(vehicle, props.dashboardColor)
end

if props.wheels then
SetVehicleWheelType(vehicle, props.wheels)
end

if props.wheelSize then
SetVehicleWheelSize(vehicle, props.wheelSize)
end

if props.wheelWidth then
SetVehicleWheelWidth(vehicle, props.wheelWidth)
end

if props.windowTint then
SetVehicleWindowTint(vehicle, props.windowTint)
end

if props.neonEnabled then
for i = 1, #props.neonEnabled do
SetVehicleNeonLightEnabled(vehicle, i - 1, props.neonEnabled[i])
end
end

if props.windows then
for i = 1, #props.windows do
RemoveVehicleWindow(vehicle, props.windows[i])
end
end

if props.doors then
for i = 1, #props.doors do
SetVehicleDoorBroken(vehicle, props.doors[i], true)
end
end

if props.tyres then
for tyre, state in pairs(props.tyres) do
SetVehicleTyreBurst(vehicle, tonumber(tyre) --[[@as number]], state == 2, 1000.0)
end
end

if props.neonColor then
SetVehicleNeonLightsColour(vehicle, props.neonColor[1], props.neonColor[2], props.neonColor[3])
end

if props.modSmokeEnabled ~= nil then
ToggleVehicleMod(vehicle, 20, props.modSmokeEnabled)
end

if props.tyreSmokeColor then
SetVehicleTyreSmokeColor(vehicle, props.tyreSmokeColor[1], props.tyreSmokeColor[2], props.tyreSmokeColor[3])
end

if props.modSpoilers then
SetVehicleMod(vehicle, 0, props.modSpoilers, false)
end

if props.modFrontBumper then
SetVehicleMod(vehicle, 1, props.modFrontBumper, false)
end

if props.modRearBumper then
SetVehicleMod(vehicle, 2, props.modRearBumper, false)
end

if props.modSideSkirt then
SetVehicleMod(vehicle, 3, props.modSideSkirt, false)
end

if props.modExhaust then
SetVehicleMod(vehicle, 4, props.modExhaust, false)
end

if props.modFrame then
SetVehicleMod(vehicle, 5, props.modFrame, false)
end

if props.modGrille then
SetVehicleMod(vehicle, 6, props.modGrille, false)
end

if props.modHood then
SetVehicleMod(vehicle, 7, props.modHood, false)
end

if props.modFender then
SetVehicleMod(vehicle, 8, props.modFender, false)
end

if props.modRightFender then
SetVehicleMod(vehicle, 9, props.modRightFender, false)
end

if props.modRoof then
SetVehicleMod(vehicle, 10, props.modRoof, false)
end

if props.modEngine then
SetVehicleMod(vehicle, 11, props.modEngine, false)
end

if props.modBrakes then
SetVehicleMod(vehicle, 12, props.modBrakes, false)
end

if props.modTransmission then
SetVehicleMod(vehicle, 13, props.modTransmission, false)
end

if props.modHorns then
SetVehicleMod(vehicle, 14, props.modHorns, false)
end

if props.modSuspension then
SetVehicleMod(vehicle, 15, props.modSuspension, false)
end

if props.modArmor then
SetVehicleMod(vehicle, 16, props.modArmor, false)
end

if props.modNitrous then
SetVehicleMod(vehicle, 17, props.modNitrous, false)
end

if props.modTurbo ~= nil then
ToggleVehicleMod(vehicle, 18, props.modTurbo)
end

if props.modSubwoofer ~= nil then
ToggleVehicleMod(vehicle, 19, props.modSubwoofer)
end

if props.modHydraulics ~= nil then
ToggleVehicleMod(vehicle, 21, props.modHydraulics)
end

if props.modXenon ~= nil then
ToggleVehicleMod(vehicle, 22, props.modXenon)
end

if props.xenonColor then
SetVehicleXenonLightsColor(vehicle, props.xenonColor)
end

if props.modFrontWheels then
SetVehicleMod(vehicle, 23, props.modFrontWheels, props.modCustomTiresF)
end

if props.modBackWheels then
SetVehicleMod(vehicle, 24, props.modBackWheels, props.modCustomTiresR)
end

if props.modPlateHolder then
SetVehicleMod(vehicle, 25, props.modPlateHolder, false)
end

if props.modVanityPlate then
SetVehicleMod(vehicle, 26, props.modVanityPlate, false)
end

if props.modTrimA then
SetVehicleMod(vehicle, 27, props.modTrimA, false)
end

if props.modOrnaments then
SetVehicleMod(vehicle, 28, props.modOrnaments, false)
end

if props.modDashboard then
SetVehicleMod(vehicle, 29, props.modDashboard, false)
end

if props.modDial then
SetVehicleMod(vehicle, 30, props.modDial, false)
end

if props.modDoorSpeaker then
SetVehicleMod(vehicle, 31, props.modDoorSpeaker, false)
end

if props.modSeats then
SetVehicleMod(vehicle, 32, props.modSeats, false)
end

if props.modSteeringWheel then
SetVehicleMod(vehicle, 33, props.modSteeringWheel, false)
end

if props.modShifterLeavers then
SetVehicleMod(vehicle, 34, props.modShifterLeavers, false)
end

if props.modAPlate then
SetVehicleMod(vehicle, 35, props.modAPlate, false)
end

if props.modSpeakers then
SetVehicleMod(vehicle, 36, props.modSpeakers, false)
end

if props.modTrunk then
SetVehicleMod(vehicle, 37, props.modTrunk, false)
end

if props.modHydrolic then
SetVehicleMod(vehicle, 38, props.modHydrolic, false)
end

if props.modEngineBlock then
SetVehicleMod(vehicle, 39, props.modEngineBlock, false)
end

if props.modAirFilter then
SetVehicleMod(vehicle, 40, props.modAirFilter, false)
end

if props.modStruts then
SetVehicleMod(vehicle, 41, props.modStruts, false)
end

if props.modArchCover then
SetVehicleMod(vehicle, 42, props.modArchCover, false)
end

if props.modAerials then
SetVehicleMod(vehicle, 43, props.modAerials, false)
end

if props.modTrimB then
SetVehicleMod(vehicle, 44, props.modTrimB, false)
end

if props.modTank then
SetVehicleMod(vehicle, 45, props.modTank, false)
end

if props.modWindows then
SetVehicleMod(vehicle, 46, props.modWindows, false)
end

if props.modDoorR then
SetVehicleMod(vehicle, 47, props.modDoorR, false)
end

if props.modLivery then
SetVehicleMod(vehicle, 48, props.modLivery, false)
SetVehicleLivery(vehicle, props.modLivery)
end

if props.modRoofLivery then
SetVehicleRoofLivery(vehicle, props.modRoofLivery)
end

if props.modLightbar then
SetVehicleMod(vehicle, 49, props.modLightbar, false)
end

if props.bulletProofTyres ~= nil then
SetVehicleTyresCanBurst(vehicle, props.bulletProofTyres)
end

if gameBuild >= 2372 and props.driftTyres then
SetDriftTyresEnabled(vehicle, true)
end

if fixVehicle then
SetVehicleFixed(vehicle)
end
end
end

View file

@ -0,0 +1,15 @@
local tgiann_skillbar = GetResourceState("tgiann-skillbar") == "started"

tgiCore.skillCheck = function(time)
if tgiann_skillbar then
return exports["tgiann-skillbar"]:taskBar(6500, true)
end

local dif = "easy"
if time < 2000 then
dif = "hard"
elseif time < 5000 then
dif = "medium"
end
return lib.skillCheck({ dif })
end

View file

@ -0,0 +1,35 @@
local tgiann_hotwire = GetResourceState("tgiann-hotwire") ~= "missing"
local qs_vehiclekeys = GetResourceState("qs-vehiclekeys") ~= "missing"
local qb_vehiclekeys = GetResourceState("qb-vehiclekeys") ~= "missing"

---@param vehicle number
---@param keyType? "giveKey" | "nonRemoveable" | "garage"
---@diagnostic disable-next-line: duplicate-set-field
tgiCore.GiveVehicleKey = function(vehicle, keyType)
if tgiann_hotwire then
if keyType == "giveKey" then
exports["tgiann-hotwire"]:GiveKeyVehicle(vehicle, true)
elseif keyType == "nonRemoveable" then
exports["tgiann-hotwire"]:SetNonRemoveableIgnition(vehicle, true)
elseif keyType == "garage" then
exports["tgiann-hotwire"]:CheckKeyInIgnitionWhenSpawn(vehicle)
end
elseif qs_vehiclekeys then
local plate = GetVehicleNumberPlateText(vehicle)
local model = GetDisplayNameFromVehicleModel(GetEntityModel(vehicle))
exports['qs-vehiclekeys']:GiveKeys(plate, model, true)
elseif qb_vehiclekeys then
TriggerServerEvent("tgiann-core:server:giveVehicleKey", NetworkGetNetworkIdFromEntity(vehicle))
else
local plate = GetVehicleNumberPlateText(vehicle)
TriggerEvent("vehiclekeys:client:SetOwner", plate)
TriggerEvent("x-hotwire:give-keys", vehicle)
TriggerEvent('tgiann-hotwire:give-keys-with-carid', vehicle)
end
end

RegisterNetEvent("tgiann-core:client:giveVehicleKey")
AddEventHandler("tgiann-core:client:giveVehicleKey", function(netId, keyType)
local vehicle = NetworkGetEntityFromNetworkId(netId)
tgiCore.GiveVehicleKey(vehicle, keyType)
end)

View file

@ -0,0 +1,97 @@
function sendNuiMessage(method, data)
SendNUIMessage({
app = "app-name",
method = method,
data = data,
})
end

function cbNuiMessage(method, data)
SendNUIMessage({
app = "app-name",
method = method .. "Success",
data = data,
})
return ""
end

local hasCustomNuiFocus = false
RegisterNetEvent('tgiann-core:nui-focus')
AddEventHandler('tgiann-core:nui-focus', function(hasFocus, hasKeyboard, hasMouse, allControl)
hasCustomNuiFocus = hasFocus
TriggerEvent("tgiann-main:focus", hasCustomNuiFocus)
if not hasCustomNuiFocus then return end
CreateThread(function()
while hasCustomNuiFocus do
if hasKeyboard and not allControl then
DisableAllControlActions(0)
EnableControlAction(0, 249, true)
elseif hasKeyboard and allControl then
DisableControlAction(0, 24, true) -- disable attack
DisableControlAction(0, 25, true) -- disable aim
DisableControlAction(0, 1, true) -- LookLeftRight
DisableControlAction(0, 2, true) -- LookUpDown
end

if not hasKeyboard and hasMouse then
DisableControlAction(0, 1, true)
DisableControlAction(0, 2, true)
elseif hasKeyboard and not hasMouse then
EnableControlAction(0, 1, true)
EnableControlAction(0, 2, true)
end
HudWeaponWheelIgnoreSelection()
DisableFrontendThisFrame()
Wait(0)
end
end)
end)

local function updateUiClientData()
sendNuiMessage("updateClientData", {
lang = langs[config.lang],
config = {
textUiLocation = config.textUiLocation,
locale = config.locale
},
defaultColor = config.defaultColor
})
end

local playerLoadedEvent = custom.playerLoadedEvent.active and custom.playerLoadedEvent.event or 'tgiCore:Client:OnPlayerLoaded'
AddEventHandler(playerLoadedEvent, updateUiClientData)
AddEventHandler('onResourceStart', function(resourceName)
if GetCurrentResourceName() ~= resourceName then return end
Wait(2000)
updateUiClientData()
end)

AddEventHandler('onResourceStop', function(resourceName)
if not PlayerData then return end
if GetCurrentResourceName() == resourceName then return end
if not string.find(resourceName, "tgiann") then return end
while GetResourceState(resourceName) ~= "started" do Wait(100) end
SetTimeout(1000, function() TriggerEvent("tgiCore:Client:OnPlayerLoaded", PlayerData) end)
end)

if custom.deadReviveEvent.active then
RegisterNetEvent(custom.deadReviveEvent.deadEvent)
AddEventHandler(custom.deadReviveEvent.deadEvent, function(data)
TriggerEvent("tgiCore:playerdead", data ~= nil and data or true)
end)
RegisterNetEvent(custom.deadReviveEvent.reviveEvent)
AddEventHandler(custom.deadReviveEvent.reviveEvent, function(data)
TriggerEvent("tgiCore:playerdead", data ~= nil and data or false)
end)
elseif config.wasabi_ambulance then
AddStateBagChangeHandler("dead", ('player:%s'):format(GetPlayerServerId(PlayerId())), function(bagName, _, value)
local entity = GetEntityFromStateBagName(bagName)
if entity == 0 then return end
TriggerEvent("tgiCore:playerdead", value)
end)
end

RegisterNetEvent("tgiann-lumihud:setLumiHudColor")
AddEventHandler("tgiann-lumihud:setLumiHudColor", function(color)
sendNuiMessage("setLumiHudColor", color)
end)

View file

@ -0,0 +1,121 @@
--[[
Start tgiann-core script after es_extented/qb-core/oxmysql script and before tgiann-* scripts
Adjust the tgiann-core config file according to the framework you are using

- If you are having any problems, please check the channels on my discord. If your problem is not resolved, open a ticket.
- Discord: http://discord.gg/9SEg2WNf7Y
- Docs: https://tgiann.gitbook.io/tgiann
- Core Exports: https://docs.tgiann.com/scripts/tgiann-core
]]

config = {}
config.lang = "en" -- "en" - "tr"

config.locale = {
timeLocale = "en-EN",
moneyLocale = "en-EN",
moneyCurrency = "USD",
}

-- number of online police needed to control
config.policeJobs = {
"police",
}

config.defaultColor = { background = "#36ff9f", color = "#252525" } -- Changes the main hud color of tgiann scripts.
config.textUiLocation = "right" -- "left" | "right"
config.tgiannDrawText3D = true -- Use tgiann's drawtext3d function instead of QB and ESX
config.checkArtifactVersion = true -- Check the artifact version of the server
config.playerMaxOwnableLocations = 1 -- The maximum number of places the player can buy in scripts like garage, clothing

frameworkConfig = {
esxScriptName = "es_extended", -- https://github.com/esx-framework/esx_core/tree/main/%5Bcore%5D/es_extended
qbScriptName = "qb-core", -- https://github.com/qbcore-framework/qb-core
qbxScriptName = "qbx_core", -- https://github.com/Qbox-project/qbx_core
tgiannInventoryScriptName = "tgiann-inventory", -- https://store.tgiann.com/package/6251398
oxInventoryScriptName = "ox_inventory", -- https://github.com/overextended/ox_inventory
qsInventoryScriptName = "qs-inventory",
codemInventoryScriptName = "codem-inventory",
origenInventoryScriptName = "origen_inventory",
coreInventoryScriptName = "core_inventory",
oxMysqlScriptName = "oxmysql", -- https://github.com/overextended/oxmysql
esxService = "esx_service", -- https://github.com/esx-framework/esx_service
wasabiAmbulance = "wasabi_ambulance",
oxTarget = "ox_target",
qbTarget = "qb-target",
}

showClosestMenuKey = "LMENU"

custom = {
drawText = {
active = false,
---@param uniqName string Unique name for the text
---@param button string Button text to display
---@param text string Text to display
---@diagnostic disable-next-line: unused-local
openFunc = function(uniqName, button, text)
lib.showTextUI(text)
end,
---@param uniqName string Unique name for the text
---@diagnostic disable-next-line: unused-local
closeFunc = function(uniqName)
lib.hideTextUI()
end
},
notif = {
active = false, -- If you are using a different notify system, set active to true and edit the notify function
---@param msg string
---@param msgType? "primary" | "success" | "error"
---@param time? number
---@diagnostic disable-next-line: unused-local
func = function(msg, msgType, time)
lib.notify({
title = 'Notification',
description = msg,
type = msgType or "primary",
duration = time or 5000,
})
end
},
uiDrawText3D = {
active = false, -- If you want to use something other than tgiann 3d draw text, you can activate this. (When true, some problems may arise!!!)
triggerEveryTick = false, -- When true, the openFunc function is triggered every tick.
---@param uniqName string Unique name for the text
---@param data [string, string][] -- Data to display, where each item is a table with two strings: [1] = key, [2] = text
---@param coord vector3
---@param screenPos { x: number, y: number }
---@diagnostic disable-next-line: unused-local
openFunc = function(uniqName, data, coord, screenPos)
local text = ""
local length = #data
for i = 1, length do
text = ("[%s] %s%s"):format(data[i][1], data[i][2], i < length and " " or "")
end
lib.showTextUI(text)
end,
---@param uniqName string Unique name for the text
---@diagnostic disable-next-line: unused-local
closeFunc = function(uniqName)
lib.hideTextUI()
end
},
playerLoadedEvent = {
active = false, -- for core, the player loaded event needs to be triggered to load the ui data. if you are using a different loaded event than qb or esx, make it true and edit the event (-- also u can change event from client/main.lua)
event = "playerSpawned" --https://docs.fivem.net/docs/resources/spawnmanager/events/playerSpawned/
},
deadReviveEvent = {
active = false, -- if you are using a different ambulance script, make it true and edit the events (-- also u can change event from client/main.lua)
deadEvent = "baseevents:onPlayerDied", -- https://docs.fivem.net/docs/resources/baseevents/events/onPlayerDied/
reviveEvent = "playerSpawned", -- https://docs.fivem.net/docs/resources/spawnmanager/events/playerSpawned/
}
}

config.test = false -- Dont touch this
config.tgiannServer = false -- Dont touch this

langs = {}

exports("getConfig", function()
return config
end)

View file

@ -0,0 +1,12 @@
-- Don't share the bot token with anyone
discordConfig = {
guildId = '', -- Set to the ID of your guild
botToken = '', -- Search google "How to get discord bot token"
cacheDiscordRoles = true, -- true to cache player roles, false to make a new Discord Request every time
cacheDiscordRolesTime = 60, -- if CacheDiscordRoles is true, how long to cache roles before clearing (in seconds)
}

config.discordLog = {
name = "TGIANN",
avatar = "",
}

View file

@ -0,0 +1,7 @@
screenshot = {
fivemanage = { -- https://fivemanage.com
active = false, -- Set to true to enable fivemanage
api = '', -- Fivemmanage API Key
},
discordWebhook = "" -- if favemanage is active this will be ignored
}

View file

@ -0,0 +1,10 @@
webhooks = {
playerOwnable = {
buy = "",
payRent = "",
withdraw = "",
hireEmployee = "",
fireEmployee = "",
expired = "",
}
}

View file

@ -0,0 +1,56 @@
fx_version "cerulean"
game "gta5"
version "4.25.2"
lua54 "yes"

dependencies { "ox_lib" }

ui_page "ui/build/index.html"

files {
"ui/build/**.*",
}

escrow_ignore {
"configs/*.lua",
"client/functions/progressbar.lua",
"client/functions/skillCheck.lua",
"client/functions/setVehicleProperties.lua",
"client/functions/getVehicleProperties.lua",
"client/functions/duty.lua",
"client/functions/boss.lua",
"client/functions/mechanic.lua",
"client/functions/clothing.lua",
"client/functions/vehicleKey.lua",
"client/functions/inventory.lua",
"server/functions/inventory.lua",
"client/main.lua",
"server/functions/vehicleKey.lua",
"languages/*.lua"
}

shared_scripts {
'@ox_lib/init.lua',
"import.lua",
"configs/config.lua",
"languages/*.lua",
"shared/functions/*.lua",
"shared/other/*.lua",
}

client_scripts {
"client/**.lua",
}

server_scripts {
"@oxmysql/lib/MySQL.lua",
"configs/discordConfig.lua",
"configs/screenshotConfig.lua",
"configs/webhookConfig.lua",
"server/functions/*.lua",
"server/framework/**.lua",
"server/inventory/**.lua",
"server/playerOwnable/**.lua",
}

dependency '/assetpacks'

Binary file not shown.

View file

@ -0,0 +1,52 @@
langs.en = {
alreadyError = "You're already doing something",
openMenu = "Open Menu",
showMenu = "Show Closest DrawText Menus",
gizmoWalkMode = "Walk Mode",
gizmoNormalMode = "Gizmo Mode",
gizmoRotate = "Rotate Mode",
gizmoTranslate = "Translate Mode",
gizmoSnapToGround = "Snap to Ground",
gizmoDone = "Finish Editing",
gizmoCancel = "Cancel Editing",
gizmoCamera = "Move Camera",
returnText = "Return",
accept = "Accept",
cancel = "Cancel",
inputDefaultDesc = "Enter a value greater than zero",
dutyFull = "You can't go on duty, duty is full!",
company = {
alreadyBuyed = "This Company belongs to someone else",
buyCompany = "Rent Company",
companyMenu = "Company",
buyedCompany = "Company rented!",
rentDay = "Rent start day:",
lastRentDay = "Last Pay Day:",
rentCompany = "Pay Rent",
compnayMoney = "Total Money: ",
companyWithdraw = "Withdraw Money",
uCantRentPay = "Too early to pay Rent",
payedRent = "Rent payed successfully",
noMoneyCompany = "Not enough Money!",
rentForDay = "Rent day:",
employeeAction = "Employee Actions",
noEmployee = "No Employees",
hireEmployee = "Hire Employee",
firePlayer = "Fire Employee",
hireEmployeeSuccess = "Employee hired successfully",
fireEmployeeSuccess = "Employee fired successfully",
loading = "loading...",
noPlayer = "No players nearby",
maxOwnableLocations = "You have reached the maximum number of ownable locations",
},
log = {
company = {
buy = "Business Purchased | %s",
payRent = "Business Rent Paid | %s | $%s",
withdraw = "Business Cash Withdrawn | %s | $%s",
hireEmployee = "Business Hire Employed | %s | Employee: %s",
fireEmployee = "Business Fire Employee | %s | Employee: %s",
expired = "Business Expired | %s | Owner: %s",
}
}
}

View file

@ -0,0 +1,52 @@
langs.tr = {
alreadyError = "Zaten Birşey yapıyorsun",
openMenu = "Menüyü Aç",
showMenu = "Yakındaki Menüleri Göster",
gizmoWalkMode = "Yürüme Modu",
gizmoNormalMode = "Gizmo Modu",
gizmoRotate = "Döndürme Modu",
gizmoTranslate = "Hareket Modu",
gizmoSnapToGround = "Yere Yerleştir",
gizmoDone = "Düzenlemeyi Tamamla",
gizmoCancel = "Düzenlemeyi İptal Et",
gizmoCamera = "Kamerayı Hareket Ettir",
returnText = "Geri",
accept = "Onayla",
cancel = "İptal",
inputDefaultDesc = "Sıfırdan Büyük Bir Değer Girin",
dutyFull = "Mesaiye Giremezsin Mesai Dolu!",
company = {
alreadyBuyed = "İşletme Başkasına Ait",
buyCompany = "İşletmeyi Satın Al",
companyMenu = "İşletme",
buyedCompany = "İşletme Satın Alındı!",
rentDay = "En Erken Ödeme Tarihi:",
lastRentDay = "Son Ödeme Tarihi:",
rentCompany = "Kirayı Öde",
compnayMoney = "Kasadaki Miktar: ",
companyWithdraw = "Parayı Çek",
uCantRentPay = "Kira Ücretini Ödemek İçin Daha Çok Erken",
payedRent = "Kira Ücreti Ödendi",
noMoneyCompany = "Kasanda Para Yok!",
rentForDay = "Kiralanacak Gün Sayısı:",
employeeAction = "Çalışan İşlemleri",
noEmployee = "Çalışan Yok",
hireEmployee = "Çalışan Al",
firePlayer = "Kov",
hireEmployeeSuccess = "Oyuncu İşe Alındı",
fireEmployeeSuccess = "Oyuncu İşten Çıkarıldı",
loading = "Yükleniyor",
noPlayer = "Yakınında Oyuncu Yok",
maxOwnableLocations = "Sahip olunabilecek maksimum mekan sayısına ulaştınız"
},
log = {
company = {
buy = "İşletme Satın Alındı | %s",
payRent = "İşletme Kirası Ödendi | %s | $%s",
withdraw = "İşletme Kasasından Para Çekildi | %s | $%s",
hireEmployee = "İşletmeye Çalışan Alındı | %s | Çalışan: %s",
fireEmployee = "İşletmeden Çalışan Çıkarıldı | %s | Çalışan: %s",
expired = "İşletme Süresi Doldu | %s | Owner: %s",
}
}
}

View file

@ -0,0 +1,143 @@
-- server

-- Support for inventory scripts:
-- qb-inventory
-- tgiann-inventory
-- ox_inventory
-- qs-inventory
-- codem-inventory
-- origen_inventory
-- core_inventory

tgiCore.RegisterStash = function(src, data)
if next(data) then data.maxWeight = data.maxweight or data.maxWeight end
if config.ox_inventory then
--- id, label, slots, maxWeight, owner, groups, coords
exports.ox_inventory:RegisterStash(data.stashName, data.label or data.stashName, data.slots or 100, data.maxWeight or 10000000)
elseif config["tgiann-inventory"] then
exports["tgiann-inventory"]:RegisterStash(data)
elseif config.origen_inventory then
exports.origen_inventory:RegisterStash(data.stashName, {
label = data.label or data.stashName,
slots = data.slots,
weight = data.maxWeight,
})
end
return true
end

--- @param src number
--- @param data {stashName: string, slots: number, maxWeight: number, label: string, blacklist: table, whitelist: table, isPlayer: boolean}
--- @diagnostic disable-next-line dublicate-function
tgiCore.OpenStash = function(src, data)
assert(type(src) == "number", "Open Stash: src must be a number")
if next(data) then data.maxWeight = data.maxweight or data.maxWeight end
if config["qs-inventory"] or config["codem-inventory"] then
TriggerClientEvent("tgiann-core:client:openInventory", src, data)
elseif config.ox_inventory then
tgiCore.RegisterStash(src, data)
exports.ox_inventory:forceOpenInventory(src, "stash", data.stashName)
elseif config["tgiann-inventory"] then
tgiCore.RegisterStash(src, data)
exports["tgiann-inventory"]:OpenInventory(src, "stash", data.stashName, {
maxweight = data.maxWeight,
slots = data.slots,
}, {
isPlayer = data.isPlayer,
password = data.password
})
elseif config.origen_inventory then
tgiCore.RegisterStash(src, data)
exports.origen_inventory:OpenInventory(src, 'stash', data.stashName)
elseif config.core_inventory then
--- source, inventory, inventoryType, x, y, open, content, discoverItem)
exports.core_inventory:openInventory(src, data.stashName, "stash", nil, nil, true, nil, false)
elseif config.framework == "qb" then
exports["qb-inventory"]:OpenInventory(src, data.stashName, {
maxweight = data.maxWeight,
slots = data.slots,
label = data.label
})
elseif config.framework == "esx" then
return assert(false, "Not Found ESX inventory script for open stash!")
else
return assert(false, "Not Found inventory script for open stash!")
end
end

-- SHOP

--- @param shopName string
--- @param items table
--- @param location vector3
tgiCore.RegisterShop = function(shopName, items, location)
if config["tgiann-inventory"] then
exports["tgiann-inventory"]:RegisterShop(shopName, items)
elseif config.ox_inventory then
exports.ox_inventory:RegisterShop(shopName, {
name = shopName,
inventory = items,
locations = {
location.xyz
},
groups = {
police = 0
},
})
elseif config.framework == "qb" then
exports['qb-inventory']:CreateShop({
name = shopName,
label = shopName,
slots = #items,
coords = location.xyz,
items = items,
})
end
end

--- @param src number
--- @param data table {shopName: string, items: table}
--- @diagnostic disable-next-line dublicate-function
tgiCore.OpenShop = function(src, data)
assert(type(src) == "number", "Open Shop: src must be a number")
if config.ox_inventory or config["qs-inventory"] or config["codem-inventory"] then
TriggerClientEvent("tgiann-core:client:OpenShop", src, data)
elseif config["tgiann-inventory"] then
exports["tgiann-inventory"]:OpenShop(src, data.shopName)
elseif config.origen_inventory then
-- stash items need add to config file
exports.origen_inventory:OpenInventory(src, 'shop', data.stashName)
elseif config.core_inventory then
-- there is no shop in core_inventory
elseif config.framework == "qb" then
exports['qb-inventory']:OpenShop(src, data.shopName)
elseif config.framework == "esx" then
return assert(false, "Not Found ESX inventory script for open shop!")
else
return assert(false, "Not Found inventory script for open shop!")
end
end

-- Open Target Player

--- @param src number
--- @param targetSrc table {shopName: string, items: table}
--- @diagnostic disable-next-line dublicate-function
tgiCore.OpenTargetPlayerInventory = function(src, targetSrc)
assert(type(src) == "number", "Open Target Inventory: src must be a number")
assert(type(targetSrc) == "number", "Open Target Inventory: targetSrc must be a number")

if config.ox_inventory or config["qs-inventory"] or config["codem-inventory"] or config.core_inventory then
TriggerClientEvent("tgiann-core:client:OpenTargetPlayerInventory", src, targetSrc)
elseif config["tgiann-inventory"] then
exports["tgiann-inventory"]:OpenInventoryById(src, targetSrc)
elseif config.origen_inventory then
exports.origen_inventory:OpenInventoryById(playerId, otherPlayerId)
elseif config.framework == "qb" then
exports["qb-inventory"]:OpenInventoryById(src, targetSrc)
elseif config.framework == "esx" then
return assert(false, "Not Found ESX inventory script for open stash!")
else
return assert(false, "Not Found inventory script for open stash")
end
end

View file

@ -0,0 +1,20 @@
local qb_vehiclekeys = GetResourceState("qb-vehiclekeys") ~= "missing"

---@param src number
---@param netId number
---@param keyType? "giveKey" | "nonRemoveable" | "garage"
---@diagnostic disable-next-line: duplicate-set-field
tgiCore.GiveVehicleKey = function(src, netId, keyType)
local vehicle = NetworkGetEntityFromNetworkId(netId)
local plate = GetVehicleNumberPlateText(vehicle)
if qb_vehiclekeys then
exports["qb-vehiclekeys"]:GiveKeys(src, plate)
else
TriggerClientEvent("tgiann-core:client:giveVehicleKey", src, netId, keyType)
end
end

RegisterNetEvent("tgiann-core:server:giveVehicleKey")
AddEventHandler("tgiann-core:server:giveVehicleKey", function(netId, keyType)
tgiCore.GiveVehicleKey(source, netId, keyType)
end)

Some files were not shown because too many files have changed in this diff Show more