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)