270 lines
12 KiB
Lua
Raw Normal View History

2025-04-07 01:41:12 +00:00
local config = require 'config.client'
local inTrunk = false
local isKidnapped = false
local isKidnapping = false
local cam = 0
local disabledTrunk = {
[`penetrator`] = "penetrator",
[`vacca`] = "vacca",
[`monroe`] = "monroe",
[`turismor`] = "turismor",
[`osiris`] = "osiris",
[`comet`] = "comet",
[`ardent`] = "ardent",
[`jester`] = "jester",
[`nero`] = "nero",
[`nero2`] = "nero2",
[`vagner`] = "vagner",
[`infernus`] = "infernus",
[`zentorno`] = "zentorno",
[`comet2`] = "comet2",
[`comet3`] = "comet3",
[`comet4`] = "comet4",
[`bullet`] = "bullet",
}
-- Functions
local function DrawText3Ds(x, y, z, text)
SetTextScale(0.35, 0.35)
SetTextFont(4)
SetTextProportional(true)
SetTextColour(255, 255, 255, 215)
BeginTextCommandDisplayText("STRING")
SetTextCentre(true)
AddTextComponentSubstringPlayerName(text)
SetDrawOrigin(x,y,z, 0)
EndTextCommandDisplayText(0.0, 0.0)
local factor = string.len(text) / 370
DrawRect(0.0, 0.0 + 0.0125, 0.017 + factor, 0.03, 0, 0, 0, 75)
ClearDrawOrigin()
end
local function TrunkCam(bool)
local vehicle = GetEntityAttachedTo(cache.ped)
local drawPos = GetOffsetFromEntityInWorldCoords(vehicle, 0, -5.5, 0)
local vehHeading = GetEntityHeading(vehicle)
if bool then
RenderScriptCams(false, false, 0, true, false)
if DoesCamExist(cam) then
DestroyCam(cam, false)
cam = 0
end
cam = CreateCam('DEFAULT_SCRIPTED_CAMERA', true)
SetCamActive(cam, true)
SetCamCoord(cam, drawPos.x, drawPos.y, drawPos.z + 2)
SetCamRot(cam, -2.5, 0.0, vehHeading, 0.0)
RenderScriptCams(true, false, 0, true, true)
else
RenderScriptCams(false, false, 0, true, false)
if DoesCamExist(cam) then
DestroyCam(cam, false)
cam = 0
end
end
end
local function getClosestPlayer(distance)
local coords = GetEntityCoords(cache.ped)
local player, playerPed = lib.getClosestPlayer(coords, (distance or 2.5))
if not player then
exports.qbx_core:Notify(locale('error.no_people_nearby'), 'error')
return
end
return player, playerPed
end
-- Events
RegisterNetEvent('qb-kidnapping:client:SetKidnapping', function(bool)
isKidnapping = bool
end)
RegisterNetEvent('qb-trunk:client:KidnapTrunk', function()
local closestPlayer = getClosestPlayer()
if not closestPlayer then return end
local closestVehicle = lib.getClosestVehicle(GetEntityCoords(cache.ped))
if not isKidnapping or not closestVehicle then return exports.qbx_core:Notify(locale("error.not_kidnapped"), 'error') end
TriggerEvent('police:client:KidnapPlayer')
TriggerServerEvent("police:server:CuffPlayer", GetPlayerServerId(closestPlayer), false)
Wait(50)
TriggerServerEvent("qb-trunk:server:KidnapTrunk", GetPlayerServerId(closestPlayer), closestVehicle)
end)
RegisterNetEvent('qb-trunk:client:KidnapGetIn', function(veh)
local closestVehicle = veh
local vehClass = GetVehicleClass(closestVehicle)
local plate = qbx.getVehiclePlate(closestVehicle)
if config.trunkClasses[vehClass].allowed then
local isBusy = lib.callback.await('qb-trunk:server:getTrunkBusy', false, plate)
if not disabledTrunk[GetEntityModel(closestVehicle)] then
if not inTrunk then
if not isBusy then
if not isKidnapped then
if GetVehicleDoorAngleRatio(closestVehicle, 5) > 0 then
local offset = {
x = config.trunkClasses[vehClass].x,
y = config.trunkClasses[vehClass].y,
z = config.trunkClasses[vehClass].z,
}
lib.playAnim(cache.ped, "fin_ext_p1-7", "cs_devin_dual-7", 8.0, 8.0, -1, 1, 999.0, false, false, false)
AttachEntityToEntity(cache.ped, closestVehicle, 0, offset.x, offset.y, offset.z, 0, 0, 40.0, true, true, true, true, 1, true)
TriggerServerEvent('qb-trunk:server:setTrunkBusy', plate, true)
inTrunk = true
Wait(500)
SetVehicleDoorShut(closestVehicle, 5, false)
exports.qbx_core:Notify(locale("success.entered_trunk"), 'success', 4000)
TrunkCam(true)
isKidnapped = true
else
exports.qbx_core:Notify(locale("error.trunk_closed"), 'error', 2500)
end
else
local vehicle = GetEntityAttachedTo(cache.ped)
plate = qbx.getVehiclePlate(vehicle)
if GetVehicleDoorAngleRatio(vehicle, 5) > 0 then
local vehCoords = GetOffsetFromEntityInWorldCoords(vehicle, 0, -5.0, 0)
DetachEntity(cache.ped, true, true)
ClearPedTasks(cache.ped)
inTrunk = false
TriggerServerEvent('qb-smallresources:trunk:server:setTrunkBusy', plate, nil)
SetEntityCoords(cache.ped, vehCoords.x, vehCoords.y, vehCoords.z, false, false, false, false)
SetEntityCollision(cache.ped, true, true)
TrunkCam(false)
else
exports.qbx_core:Notify(locale("error.trunk_closed"), 'error', 2500)
end
end
else
exports.qbx_core:Notify(locale("error.someone_in_trunk"), 'error', 2500)
end
else
exports.qbx_core:Notify(locale("error.already_in_trunk"), 'error', 2500)
end
else
exports.qbx_core:Notify(locale("error.cant_enter_trunk"), 'error', 2500)
end
else
exports.qbx_core:Notify(locale("error.cant_enter_trunk"), 'error', 2500)
end
end)
RegisterNetEvent('qb-trunk:client:GetIn', function()
local coords = GetEntityCoords(cache.ped)
local closestVehicle = lib.getClosestVehicle(coords, 5.0, false)
if closestVehicle ~= 0 then
local vehClass = GetVehicleClass(closestVehicle)
local plate = qbx.getVehiclePlate(closestVehicle)
if config.trunkClasses[vehClass].allowed then
local isBusy = lib.callback.await('qb-trunk:server:getTrunkBusy', false, plate)
if not disabledTrunk[GetEntityModel(closestVehicle)] then
if not inTrunk then
if not isBusy then
if GetVehicleDoorAngleRatio(closestVehicle, 5) > 0 then
local offset = {
x = config.trunkClasses[vehClass].x,
y = config.trunkClasses[vehClass].y,
z = config.trunkClasses[vehClass].z,
}
lib.playAnim(cache.ped, "fin_ext_p1-7", "cs_devin_dual-7", 8.0, 8.0, -1, 1, 999.0, false, false, false)
AttachEntityToEntity(cache.ped, closestVehicle, 0, offset.x, offset.y, offset.z, 0, 0, 40.0, true, true, true, true, 1, true)
TriggerServerEvent('qb-trunk:server:setTrunkBusy', plate, true)
inTrunk = true
Wait(500)
SetVehicleDoorShut(closestVehicle, 5, false)
exports.qbx_core:Notify(locale("success.entered_trunk"), 'success', 4000)
TrunkCam(true)
else
exports.qbx_core:Notify(locale("error.trunk_closed"), 'error', 2500)
end
else
exports.qbx_core:Notify(locale("error.someone_in_trunk"), 'error', 2500)
end
else
exports.qbx_core:Notify(locale("error.already_in_trunk"), 'error', 2500)
end
else
exports.qbx_core:Notify(locale("error.cant_enter_trunk"), 'error', 2500)
end
else
exports.qbx_core:Notify(locale("error.cant_enter_trunk"), 'error', 2500)
end
else
exports.qbx_core:Notify(locale("error.no_vehicle_found"), 'error', 2500)
end
end)
-- Threads
CreateThread(function()
while true do
local sleep = 1000
local vehicle = GetEntityAttachedTo(cache.ped)
local drawPos = GetOffsetFromEntityInWorldCoords(vehicle, 0, -5.5, 0)
local vehHeading = GetEntityHeading(vehicle)
if DoesCamExist(cam) then
sleep = 0
SetCamRot(cam, -2.5, 0.0, vehHeading, 0.0)
SetCamCoord(cam, drawPos.x, drawPos.y, drawPos.z + 2)
end
Wait(sleep)
end
end)
CreateThread(function()
while true do
local sleep = 1000
if inTrunk then
if not isKidnapped then
local vehicle = GetEntityAttachedTo(cache.ped)
local drawPos = GetOffsetFromEntityInWorldCoords(vehicle, 0, -2.5, 0)
local plate = qbx.getVehiclePlate(vehicle)
if DoesEntityExist(vehicle) then
sleep = 0
DrawText3Ds(drawPos.x, drawPos.y, drawPos.z + 0.75, locale("general.get_out_trunk_button"))
if IsControlJustPressed(0, 38) then
if GetVehicleDoorAngleRatio(vehicle, 5) > 0 then
local vehCoords = GetOffsetFromEntityInWorldCoords(vehicle, 0, -5.0, 0)
DetachEntity(cache.ped, true, true)
ClearPedTasks(cache.ped)
inTrunk = false
TriggerServerEvent('qb-trunk:server:setTrunkBusy', plate, false)
SetEntityCoords(cache.ped, vehCoords.x, vehCoords.y, vehCoords.z, false, false, false, false)
SetEntityCollision(cache.ped, true, true)
TrunkCam(false)
else
exports.qbx_core:Notify(locale("error.trunk_closed"), 'error', 2500)
end
Wait(100)
end
if GetVehicleDoorAngleRatio(vehicle, 5) > 0 then
DrawText3Ds(drawPos.x, drawPos.y, drawPos.z + 0.5, locale("general.close_trunk_button"))
if IsControlJustPressed(0, 47) then
if not IsVehicleSeatFree(vehicle, -1) then
TriggerServerEvent('qb-radialmenu:trunk:server:Door', false, plate, 5)
else
SetVehicleDoorShut(vehicle, 5, false)
end
Wait(100)
end
else
DrawText3Ds(drawPos.x, drawPos.y, drawPos.z + 0.5, locale("general.open_trunk_button"))
if IsControlJustPressed(0, 47) then
if not IsVehicleSeatFree(vehicle, -1) then
TriggerServerEvent('qb-radialmenu:trunk:server:Door', true, plate, 5)
else
SetVehicleDoorOpen(vehicle, 5, false, false)
end
Wait(100)
end
end
end
end
end
Wait(sleep)
end
end)