270 lines
12 KiB
Lua
270 lines
12 KiB
Lua
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) |