From 8965df1dfc86a07bc4898342c3481917a0e9c145 Mon Sep 17 00:00:00 2001 From: Manason Date: Thu, 9 Nov 2023 08:06:24 -0800 Subject: [PATCH] fix(client): can now run out of oxygen & don't need to take off suit to re-fill --- client/main.lua | 106 ++++++++++++++++++++++++++++-------------------- 1 file changed, 63 insertions(+), 43 deletions(-) diff --git a/client/main.lua b/client/main.lua index 9881103..b5ddae7 100644 --- a/client/main.lua +++ b/client/main.lua @@ -1,12 +1,21 @@ local currentGear = { mask = 0, tank = 0, - oxygen = 0, enabled = false } local oxygenLevel = 0 +local function enableScuba() + SetEnableScuba(cache.ped, true) + SetPedMaxTimeUnderwater(cache.ped, 2000.00) +end + +local function disableScuba() + SetEnableScuba(cache.ped, false) + SetPedMaxTimeUnderwater(cache.ped, 1.00) +end + lib.callback.register('qbx_divegear:client:fillTank', function() if oxygenLevel ~= 0 then exports.qbx_core:Notify(Lang:t("error.oxygenlevel", {oxygenlevel = oxygenLevel}), 'error') @@ -15,6 +24,9 @@ lib.callback.register('qbx_divegear:client:fillTank', function() oxygenLevel = Config.OxygenLevel exports.qbx_core:Notify(Lang:t("success.tube_filled"), 'success') + if currentGear.enabled then + enableScuba() + end return true end) @@ -32,6 +44,21 @@ local function deleteGear() end end +local function attachGear() + local maskModel = `p_d_scuba_mask_s` + local tankModel = `p_s_scuba_tank_s` + lib.requestModel(maskModel) + lib.requestModel(tankModel) + + currentGear.tank = CreateObject(tankModel, 1.0, 1.0, 1.0, true, true, false) + local bone1 = GetPedBoneIndex(cache.ped, 24818) + AttachEntityToEntity(currentGear.tank, cache.ped, bone1, -0.25, -0.25, 0.0, 180.0, 90.0, 0.0, true, true, false, false, 2, true) + + currentGear.mask = CreateObject(maskModel, 1.0, 1.0, 1.0, true, true, false) + local bone2 = GetPedBoneIndex(cache.ped, 12844) + AttachEntityToEntity(currentGear.mask, cache.ped, bone2, 0.0, 0.0, 0.0, 180.0, 90.0, 0.0, true, true, false, false, 2, true) +end + local function takeOffSuit() if lib.progressBar({ duration = 5000, @@ -51,12 +78,9 @@ local function takeOffSuit() exports.qbx_core:Notify(Lang:t("success.took_out")) TriggerServerEvent("InteractSound_SV:PlayOnSource", nil, 0.25) end - - ClearPedTasks(cache.ped) end -local function DrawText(text) - ClearPedTasks(cache.ped) +local function drawText(text) SetTextFont(4) SetTextProportional(true) SetTextScale(0.0, 0.45) @@ -69,6 +93,36 @@ local function DrawText(text) EndTextCommandDisplayText(0.45, 0.90) end +local function startOxygenLevelDrawTextThread() + CreateThread(function() + while currentGear.enabled do + if IsPedSwimmingUnderWater(cache.ped) then + drawText(oxygenLevel..'⏱') + end + Wait(0) + end + end) +end + +local function startOxygenLevelDecrementerThread() + CreateThread(function() + while currentGear.enabled do + if IsPedSwimmingUnderWater(cache.ped) and oxygenLevel > 0 then + oxygenLevel -= 1 + if oxygenLevel % 10 == 0 and oxygenLevel ~= Config.OxygenLevel then + TriggerServerEvent("InteractSound_SV:PlayOnSource", "breathdivingsuit", 0.25) + end + if oxygenLevel == 0 then + disableScuba() + TriggerServerEvent("InteractSound_SV:PlayOnSource", nil, 0.25) + break + end + end + Wait(1000) + end + end) +end + local function putOnSuit() if oxygenLevel <= 0 then exports.qbx_core:Notify(Lang:t("error.need_otube"), 'error') @@ -92,47 +146,13 @@ local function putOnSuit() } }) then deleteGear() - local maskModel = `p_d_scuba_mask_s` - local tankModel = `p_s_scuba_tank_s` - lib.requestModel(maskModel) - lib.requestModel(tankModel) - currentGear.tank = CreateObject(tankModel, 1.0, 1.0, 1.0, true, true, false) - local bone1 = GetPedBoneIndex(cache.ped, 24818) - AttachEntityToEntity(currentGear.tank, cache.ped, bone1, -0.25, -0.25, 0.0, 180.0, 90.0, 0.0, true, true, false, false, 2, true) - currentGear.mask = CreateObject(maskModel, 1.0, 1.0, 1.0, true, true, false) - local bone2 = GetPedBoneIndex(cache.ped, 12844) - AttachEntityToEntity(currentGear.mask, cache.ped, bone2, 0.0, 0.0, 0.0, 180.0, 90.0, 0.0, true, true, false, false, 2, true) - SetEnableScuba(cache.ped, true) - SetPedMaxTimeUnderwater(cache.ped, 2000.00) + attachGear() + enableScuba() currentGear.enabled = true TriggerServerEvent("InteractSound_SV:PlayOnSource", "breathdivingsuit", 0.25) - CreateThread(function() - while currentGear.enabled do - if IsPedSwimmingUnderWater(cache.ped) and oxygenLevel > 0 then - oxygenLevel -= 1 - if oxygenLevel % 10 == 0 and oxygenLevel ~= Config.OxygenLevel then - TriggerServerEvent("InteractSound_SV:PlayOnSource", "breathdivingsuit", 0.25) - elseif oxygenLevel == 0 then - SetEnableScuba(cache.ped, false) - SetPedMaxTimeUnderwater(cache.ped, 1.00) - TriggerServerEvent("InteractSound_SV:PlayOnSource", nil, 0.25) - break - end - end - Wait(1000) - end - end) - CreateThread(function() - while currentGear.enabled do - if IsPedSwimmingUnderWater(cache.ped) then - DrawText(oxygenLevel..'⏱') - end - Wait(0) - end - end) + startOxygenLevelDecrementerThread() + startOxygenLevelDrawTextThread() end - - ClearPedTasks(cache.ped) end RegisterNetEvent('qbx_divegear:client:useGear', function()