Scripts/resources/[qb]/[qb_crimes]/qb-jewelery/client/main.lua
2024-12-29 21:03:28 +01:00

353 lines
15 KiB
Lua

local QBCore = exports['qb-core']:GetCoreObject()
local firstAlarm = false
local smashing = false
local safecracked = false
-- Functions
local function DrawText3Ds(x, y, z, text)
SetTextScale(0.35, 0.35)
SetTextFont(4)
SetTextProportional(1)
SetTextColour(255, 255, 255, 215)
SetTextEntry("STRING")
SetTextCentre(true)
AddTextComponentString(text)
SetDrawOrigin(x,y,z, 0)
DrawText(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
AddEventHandler('onResourceStop', function(resource) if resource ~= GetCurrentResourceName() then return end
DeleteEntity(Safe)
end)
local function loadParticle()
if not HasNamedPtfxAssetLoaded("scr_jewelheist") then RequestNamedPtfxAsset("scr_jewelheist") end
while not HasNamedPtfxAssetLoaded("scr_jewelheist") do Wait(0) end
SetPtfxAssetNextCall("scr_jewelheist")
end
local function loadAnimDict(dict)
while (not HasAnimDictLoaded(dict)) do
RequestAnimDict(dict)
Wait(3)
end
end
local function validWeapon()
local ped = PlayerPedId()
local pedWeapon = GetSelectedPedWeapon(ped)
for k, v in pairs(Config.WhitelistedWeapons) do
if pedWeapon == k then
return true
end
end
return false
end
local function IsWearingHandshoes()
local armIndex = GetPedDrawableVariation(PlayerPedId(), 3)
local model = GetEntityModel(PlayerPedId())
local retval = true
if model == `mp_m_freemode_01` then
if Config.MaleNoHandshoes[armIndex] ~= nil and Config.MaleNoHandshoes[armIndex] then
retval = false
end
else
if Config.FemaleNoHandshoes[armIndex] ~= nil and Config.FemaleNoHandshoes[armIndex] then
retval = false
end
end
return retval
end
local function smashVitrine(k)
if validWeapon() then
local animDict = "missheist_jewel"
local animName = "smash_case"
local ped = PlayerPedId()
local plyCoords = GetOffsetFromEntityInWorldCoords(ped, 0, 0.6, 0)
local pedWeapon = GetSelectedPedWeapon(ped)
if math.random(1, 100) <= 80 and not IsWearingHandshoes() then
TriggerServerEvent("evidence:server:CreateFingerDrop", plyCoords)
elseif math.random(1, 100) <= 5 and IsWearingHandshoes() then
TriggerServerEvent("evidence:server:CreateFingerDrop", plyCoords)
QBCore.Functions.Notify("Du efterlod et fingerafryk på glasset", "error")
end
smashing = true
QBCore.Functions.Progressbar("smash_vitrine", "Tømmer kasse", Config.WhitelistedWeapons[pedWeapon]["timeOut"], false, true, {
disableMovement = true,
disableCarMovement = true,
disableMouse = false,
disableCombat = true,
}, {}, {}, {}, function() -- Done
local camId = '31 | 32 | 33 | 34'
exports['ps-dispatch']:VangelicoRobbery(camId)
TriggerServerEvent('qb-jewellery:server:setVitrineState', "isOpened", true, k)
TriggerServerEvent('qb-jewellery:server:setVitrineState', "isBusy", false, k)
TriggerServerEvent('qb-jewellery:server:vitrineReward')
TriggerServerEvent('qb-jewellery:server:setTimeout')
smashing = false
TaskPlayAnim(ped, animDict, "exit", 3.0, 3.0, -1, 2, 0, 0, 0, 0)
end, function() -- Cancel
TriggerServerEvent('qb-jewellery:server:setVitrineState', "isBusy", false, k)
smashing = false
TaskPlayAnim(ped, animDict, "exit", 3.0, 3.0, -1, 2, 0, 0, 0, 0)
end)
TriggerServerEvent('qb-jewellery:server:setVitrineState', "isBusy", true, k)
CreateThread(function()
while smashing do
loadAnimDict(animDict)
TaskPlayAnim(ped, animDict, animName, 3.0, 3.0, -1, 2, 0, 0, 0, 0 )
Wait(500)
TriggerServerEvent("InteractSound_SV:PlayOnSource", "breaking_vitrine_glass", 0.25)
loadParticle()
StartParticleFxLoopedAtCoord("scr_jewel_cab_smash", plyCoords.x, plyCoords.y, plyCoords.z, 0.0, 0.0, 0.0, 1.0, false, false, false, false)
Wait(2500)
end
end)
else
QBCore.Functions.Notify('Dit våben er ikke robust nok..', 'error')
end
end
local ThermiteEffect = function()
local ped = PlayerPedId()
TriggerServerEvent('qb-jewellery:server:thermiteremove')
RequestAnimDict("anim@heists@ornate_bank@thermal_charge")
while not HasAnimDictLoaded("anim@heists@ornate_bank@thermal_charge") do Wait(50) end
Wait(1500)
TriggerServerEvent("qb-jewellery:server:ThermitePtfx")
Wait(500)
TaskPlayAnim(ped, "anim@heists@ornate_bank@thermal_charge", "cover_eyes_intro", 8.0, 8.0, 1000, 36, 1, 0, 0, 0)
TaskPlayAnim(ped, "anim@heists@ornate_bank@thermal_charge", "cover_eyes_loop", 8.0, 8.0, 3000, 49, 1, 0, 0, 0)
Wait(25000)
ClearPedTasks(ped)
Wait(2000)
TriggerServerEvent('qb-doorlock:server:updateState', Config.Door1, false, false, false, true, false, false)
QBCore.Functions.Notify("Dørene er åbne, du har 2 minutter!", "success")
Wait(20000)
TriggerServerEvent('qb-doorlock:server:updateState', Config.Door1, true, true, true, false, false, true)
end
-- DOOR EVENT 1 --
RegisterNetEvent('qb-jewellery:client:door2', function()
local item2 = QBCore.Functions.HasItem('thermite')
if item2 then
exports['ps-ui']:Thermite(function(success)
if success then
QBCore.Functions.Notify("Door Opened!", "success")
TriggerServerEvent('qb-jewellery:server:thermiteremove')
TriggerServerEvent('qb-doorlock:server:updateState', "vange2-vange2", false, false, false, true, false, false)
else
QBCore.Functions.Notify("Fejlet", "error")
end
end, 10, 5, 3) -- Time, Gridsize (5, 6, 7, 8, 9, 10), IncorrectBlocks
else
QBCore.Functions.Notify("Du kan ikke åbne dette..", "error")
end
end)
local PlantThermite = function()
RequestAnimDict("anim@heists@ornate_bank@thermal_charge")
RequestModel("hei_p_m_bag_var22_arm_s")
RequestNamedPtfxAsset("scr_ornate_heist")
while not HasAnimDictLoaded("anim@heists@ornate_bank@thermal_charge") or not HasModelLoaded("hei_p_m_bag_var22_arm_s") or not HasNamedPtfxAssetLoaded("scr_ornate_heist") do Wait(50) end
local ped = PlayerPedId()
local pos = vector4(-596.09, -283.64, 50.42, 301.38)
SetEntityHeading(ped, pos.w)
Wait(100)
local rotx, roty, rotz = table.unpack(vec3(GetEntityRotation(PlayerPedId())))
local netscene = NetworkCreateSynchronisedScene(pos.x, pos.y, pos.z, rotx, roty, rotz, 2, false, false, 1065353216, 0, 1.3)
local bag = CreateObject(`hei_p_m_bag_var22_arm_s`, pos.x, pos.y, pos.z, true, true, false)
SetEntityCollision(bag, false, true)
local x, y, z = table.unpack(GetEntityCoords(ped))
local thermite = CreateObject(`hei_prop_heist_thermite`, x, y, z + 0.2, true, true, true)
SetEntityCollision(thermite, false, true)
AttachEntityToEntity(thermite, ped, GetPedBoneIndex(ped, 28422), 0, 0, 0, 0, 0, 200.0, true, true, false, true, 1, true)
NetworkAddPedToSynchronisedScene(ped, netscene, "anim@heists@ornate_bank@thermal_charge", "thermal_charge", 1.5, -4.0, 1, 16, 1148846080, 0)
NetworkAddEntityToSynchronisedScene(bag, netscene, "anim@heists@ornate_bank@thermal_charge", "bag_thermal_charge", 4.0, -8.0, 1)
SetPedComponentVariation(ped, 5, 0, 0, 0)
NetworkStartSynchronisedScene(netscene)
Wait(5000)
DetachEntity(thermite, 1, 1)
FreezeEntityPosition(thermite, true)
DeleteObject(bag)
NetworkStopSynchronisedScene(netscene)
CreateThread(function()
Wait(15000)
DeleteEntity(thermite)
end)
end
-- Events
RegisterNetEvent('qb-jewellery:client:doorunlock', function()
local gatecrack = QBCore.Functions.HasItem('gatecrack')
if gatecrack then
Wait(1200)
exports['ps-ui']:Scrambler(function(success)
if success then
TriggerServerEvent('qb-jewellery:server:gatecrackremove')
QBCore.Functions.Notify("Dør åbnet..", "success")
TriggerServerEvent('qb-doorlock:server:updateState', Config.Door1, false, false, false, true, false, false)
else
QBCore.Functions.Notify("Fejlet..", "error")
end
end, "numeric", 30, 0) -- Type (alphabet, numeric, alphanumeric, greek, braille, runes), Time (Seconds), Mirrored (0: Normal, 1: Normal + Mirrored 2: Mirrored only )
else
QBCore.Functions.Notify("Du har ikke de korekte midler..", "error")
end
end)
RegisterNetEvent('qb-jewellery:client:Thermite', function()
local result = QBCore.Functions.HasItem('thermite')
if result then
if math.random(1, 100) <= 85 and not IsWearingHandshoes() then
TriggerServerEvent("evidence:server:CreateFingerDrop", GetEntityCoords(PlayerPedId()))
end
QBCore.Functions.TriggerCallback('qb-jewellery:server:getCops', function(cops)
if cops >= Config.RequiredCops then
PlantThermite()
exports["memorygame"]:thermiteminigame(3, 4, 4, 120,
function()
ThermiteEffect()
end,
function()
QBCore.Functions.Notify("Termit fejlet..", "error")
end)
else
QBCore.Functions.Notify("Ikke nok politibetjente online..", "error")
end
end)
else
QBCore.Functions.Notify("Du manlger noget..", "error", 2500)
end
end)
RegisterNetEvent('qb-jewellery:client:ThermitePtfx', function()
local ptfx = vector3(-596.17, -282.62, 50.32)
RequestNamedPtfxAsset("scr_ornate_heist")
while not HasNamedPtfxAssetLoaded("scr_ornate_heist") do Wait(50) end
SetPtfxAssetNextCall("scr_ornate_heist")
local effect = StartParticleFxLoopedAtCoord("scr_heist_ornate_thermal_burn", ptfx, 0.0, 0.0, 0.0, 1.0, false, false, false, false)
Wait(27500)
StopParticleFxLooped(effect, 0)
end)
RegisterNetEvent("qb-jewellery:client:ThermitePtfx", function(coords)
if not HasNamedPtfxAssetLoaded("scr_ornate_heist") then
RequestNamedPtfxAsset("scr_ornate_heist")
end
while not HasNamedPtfxAssetLoaded("scr_ornate_heist") do Wait(0) end
SetPtfxAssetNextCall("scr_ornate_heist")
local effect = StartParticleFxLoopedAtCoord("scr_heist_ornate_thermal_burn", coords, 0.0, 0.0, 0.0, 1.0, false, false, false, false)
Wait(27500)
StopParticleFxLooped(effect, 0)
end)
RegisterNetEvent('qb-jewellery:client:setVitrineState', function(stateType, state, k)
Config.Locations[k][stateType] = state
end)
-- Threads
CreateThread(function()
local Dealer = AddBlipForCoord(Config.JewelleryLocation["coords"]["x"], Config.JewelleryLocation["coords"]["y"], Config.JewelleryLocation["coords"]["z"])
SetBlipSprite (Dealer, 617)
SetBlipDisplay(Dealer, 4)
SetBlipScale (Dealer, 0.7)
SetBlipAsShortRange(Dealer, true)
SetBlipColour(Dealer, 3)
BeginTextCommandSetBlipName("STRING")
AddTextComponentSubstringPlayerName("Vangelico Juveler")
EndTextCommandSetBlipName(Dealer)
end)
CreateThread(function()
for k, v in pairs(Config.Locations) do
exports['qb-target']:AddBoxZone("JewelleryCase"..k, vector3(v.coords.x, v.coords.y, v.coords.z-1), 0.6, 1.2, {
name = "JewelleryCase"..k,
heading = v.coords.w,
debugPoly = false,
minZ = 37.65,
maxZ = 38.35,
}, {
options = {
{
action = function()
smashVitrine(k)
end,
icon = 'fas fa-gem',
label = 'Ødelæg Vitrine',
canInteract = function()
if v["isOpened"] or v["isBusy"] then
return false
end
return true
end,
}
},
distance = 1.5,
})
end
exports['qb-target']:AddBoxZone("JewelleryThermite", vector3(-595.94, -283.74, 50.32), 0.4, 0.8, {
name = "JewelleryThermite",
heading = 302.79,
debugPoly = false,
minZ = 50.25,
maxZ = 51.35,
}, {
options = {
{
type = "client",
event = "qb-jewellery:client:Thermite",
icon = 'fas fa-gem',
label = 'Brug Termit',
}
},
distance = 1.5,
})
exports['qb-target']:AddCircleZone("Vange", vector3(-629.4028, -230.4196, 38.5506), 0.5,{ name = "vangedoor2", debugPoly = false, useZ=true, }, { options = { { type = "client", event = "qb-jewellery:client:door2", icon = " fa fa-laptop", label = "Bryd kode"}, }, distance = 1 })
exports['qb-target']:AddCircleZone("Safe", vector3(-630.7402, -228.3227, 38.2705), 0.5,{ name = "Safe", debugPoly = false, useZ=true, }, { options = { { type = "client", event = "qb-jewelery:client:CrackSafe", icon = "fa fa-laptop", label = "Bryd skab"}, }, distance = 1 })
exports['qb-target']:AddCircleZone("Vange2", vector3(-631.0305, -230.6305, 38.005), 0.5,{ name = "vangedoor3", debugPoly = false, useZ=true, }, { options = { { type = "client", event = "qb-jewellery:client:doorunlock", icon = " fa fa-laptop", label = "Lås døre op"}, }, distance = 1 })
end)
-- Safe Edit --
RegisterNetEvent('qb-jewelery:client:CrackSafe', function()
local timehack = math.random(50, 60)
local amount = math.random(1, 3)
local ped = PlayerPedId()
local stetha = QBCore.Functions.HasItem('stethascope')
if stetha then
if not safecracked then
loadAnimDict("mini@safe_cracking")
TaskPlayAnim(PlayerPedId(), "mini@safe_cracking", "dial_turn_anti_fast_1", 3.0, 3.0, -1, 49, 0, 0, 0, 0)
SetEntityHeading(ped, Safe)
exports['boii-chiphack']:StartGame(function(success)
if success then
safecracked = true
TriggerServerEvent('qb-jewellery:server:Safe')
ClearPedTasksImmediately(PlayerPedId())
else
QBCore.Functions.Notify('Fejlet!', 'error', 6000)
ClearPedTasksImmediately(PlayerPedId())
end
end, amount, timehack) -- Made it random
else
QBCore.Functions.Notify('Pengeskab allerede hacked!', 'error', 6000)
end
else
QBCore.Functions.Notify('Intet stetoskop!', 'error', 500)
end
end)
CreateThread(function()
local Safe = CreateObject(GetHashKey("p_v_43_safe_s"), -631.02, -227.98, 37.06570, true, true, true)
FreezeEntityPosition(Safe, true)
SetEntityHeading(Safe, 38.19)
end)