diff --git a/client/main.lua b/client/main.lua index c8ea394..324f130 100644 --- a/client/main.lua +++ b/client/main.lua @@ -13,15 +13,19 @@ local TANK_MODEL = `p_s_scuba_tank_s` local MASK_BONE = 12844 local TANK_BONE = 24818 -local function enableScuba() - SetEnableScuba(cache.ped, true) - SetPedMaxTimeUnderwater(cache.ped, 2000.00) +--- @param ped number? default cache.ped - beim Model-Wechsel muss der neue Ped explizit rein +local function enableScuba(ped) + ped = ped or cache.ped + SetEnableScuba(ped, true) + SetPedMaxTimeUnderwater(ped, 2000.00) end --- @param outOfAir boolean? true wenn die Flasche leer ist statt die Ausrüstung abgelegt wurde -local function disableScuba(outOfAir) - SetEnableScuba(cache.ped, false) - SetPedMaxTimeUnderwater(cache.ped, outOfAir and config.maxTimeUnderwaterOutOfAir or config.maxTimeUnderwater) +--- @param ped number? default cache.ped +local function disableScuba(outOfAir, ped) + ped = ped or cache.ped + SetEnableScuba(ped, false) + SetPedMaxTimeUnderwater(ped, outOfAir and config.maxTimeUnderwaterOutOfAir or config.maxTimeUnderwater) end local function deleteGear() @@ -41,12 +45,12 @@ end --- Hängt ein Prop hart an einen Ped-Bone. --- useSoftPinning bleibt bewusst false: mit true darf die Physik-Engine die --- Attachment bei Ragdoll und harten Anim-Übergängen lösen, dann fliegt das Prop weg. -local function attachProp(model, bone, offset, rotation) +local function attachProp(ped, model, bone, offset, rotation) lib.requestModel(model) local prop = CreateObject(model, 1.0, 1.0, 1.0, true, true, false) SetEntityCollision(prop, false, false) --- Disable collision so it doesn't block bullets - AttachEntityToEntity(prop, cache.ped, GetPedBoneIndex(cache.ped, bone), + AttachEntityToEntity(prop, ped, GetPedBoneIndex(ped, bone), offset.x, offset.y, offset.z, rotation.x, rotation.y, rotation.z, false, -- p9 @@ -61,9 +65,11 @@ local function attachProp(model, bone, offset, rotation) return prop end -local function attachGear() - currentGear.tank = attachProp(TANK_MODEL, TANK_BONE, vec3(-0.25, -0.25, 0.0), vec3(180.0, 90.0, 0.0)) - currentGear.mask = attachProp(MASK_MODEL, MASK_BONE, vec3(0.0, 0.0, 0.0), vec3(180.0, 90.0, 0.0)) +--- @param ped number? default cache.ped +local function attachGear(ped) + ped = ped or cache.ped + currentGear.tank = attachProp(ped, TANK_MODEL, TANK_BONE, vec3(-0.25, -0.25, 0.0), vec3(180.0, 90.0, 0.0)) + currentGear.mask = attachProp(ped, MASK_MODEL, MASK_BONE, vec3(0.0, 0.0, 0.0), vec3(180.0, 90.0, 0.0)) end local function isPropIntact(prop) @@ -228,14 +234,19 @@ end) --- Beim Model-Wechsel (Kleiderladen, Skin-Change) ist der Ped ein anderer - --- alle attached Props sind weg und die Scuba-Flags gelten für den alten Ped. -lib.onCache('ped', function() +--- +--- Der neue Ped kommt zwingend aus dem Callback-Parameter: ox_lib feuert die +--- onCache-Callbacks über Citizen.CreateThreadNow, *bevor* der neue Wert in den +--- Cache geschrieben wird (ox_lib/init.lua). cache.ped zeigt hier also noch auf +--- den alten, bereits verschwundenen Ped. +lib.onCache('ped', function(ped) if not currentGear.enabled then return end deleteGear() - attachGear() + attachGear(ped) if oxygenLevel > 0 then - enableScuba() + enableScuba(ped) end end)