EquippedItem = nil ItemData = nil local AttachedProp local PerformingAction local ProcessingEffect function DisableControls(denied) for i=1, #denied do DisableControlAction(0, denied[i], true) end end function RemoveAttachedProp() if AttachedProp and DoesEntityExist(AttachedProp) then DeleteEntity(AttachedProp) end AttachedProp = nil end function AttachProp(name) RemoveAttachedProp() local ped = PlayerPedId() local coords = GetEntityCoords(ped) local cfg = Config.Items[name] local prop = cfg.prop AttachedProp = CreateProp(prop.model, coords.x, coords.y, coords.z, true, true, false) SetEntityCollision(AttachedProp, false, true) AttachEntityToEntity(AttachedProp, ped, GetPedBoneIndex(ped, prop.boneId), prop.offset.x, prop.offset.y, prop.offset.z, prop.rotation.x, prop.rotation.y, prop.rotation.z, false, false, false, true, 2, true) end function ConsumeItem(name) if PerformingAction then return end PerformingAction = "consume" local cfg = Config.Items[name] local anim = cfg.animation local ped = PlayerPedId() CreateThread(function() local timeLeft = anim.time SendNUIMessage({ type = "holdInteract", bool = true }) while PerformingAction == "consume" and timeLeft > 0 do if anim.time - timeLeft > 100 and not IsEntityPlayingAnim(ped, anim.dict, anim.anim, 13) then timeLeft = timeLeft - 100 PlayAnim(ped, anim.dict, anim.anim, anim.params[1] or 1.0, anim.params[2] or -1.0, anim.params[3] or -1, anim.params[4] or 1, anim.params[5] or 1, anim.params[6], anim.params[7], anim.params[8]) Wait(100) else timeLeft = timeLeft - 10 Wait(10) end end SendNUIMessage({ type = "holdInteract", bool = false }) ClearPedTasks(ped) if timeLeft > 0 and anim.time - timeLeft <= 100 then OptionsMenu() PerformingAction = nil elseif timeLeft <= 0 then lib.callback("pickle_consumables:useItem", "", function(result, uses) if result and Config.Effects[cfg.effect?.name or ""] then CreateThread(function() if ProcessingEffect and not Config.Effects[cfg.effect.name].canOverlap then return end ProcessingEffect = true Config.Effects[cfg.effect.name].process(cfg.effect) ProcessingEffect = false end) end ItemData.uses = uses if uses < 1 then return RemoveItem() end local cfg = Config.Items[name] SendNUIMessage({ type = "displayApp", data = { quantity = uses, time = cfg.animation.time } }) PerformingAction = nil end) else PerformingAction = nil end end) end function RemoveItem() local ped = PlayerPedId() SendNUIMessage({ type = "hideApp", }) RemoveAttachedProp() ClearPedTasks(ped) EquippedItem = nil ItemData = nil PerformingAction = nil end function ItemThread(name, metadata) if EquippedItem then return end EquippedItem = name ItemData = metadata AttachProp(name) local cfg = Config.Items[name] SendNUIMessage({ type = "displayApp", data = { quantity = ItemData.uses, time = cfg.animation.time } }) CreateThread(function() local pressTime = 0 local holding = false while EquippedItem == name do local ped = PlayerPedId() if IsControlJustPressed(1, 45) then TriggerServerEvent("pickle_consumables:returnItem") RemoveItem() elseif IsControlPressed(1, 191) or IsControlPressed(1, 51) then if not PerformingAction then ConsumeItem(name) end elseif PerformingAction then PerformingAction = nil end if cfg.idle and not PerformingAction then local anim = cfg.idle if not IsEntityPlayingAnim(ped, anim.dict, anim.anim, 13) then PlayAnim(ped, anim.dict, anim.anim, anim.params[1] or 1.0, anim.params[2] or -1.0, anim.params[3] or -1, anim.params[4] or 1, anim.params[5] or 1, anim.params[6], anim.params[7], anim.params[8]) Wait(100) end end if GetEntityHealth(ped) < 1 then local coords = GetEntityCoords(AttachedProp) local _, zCoords = GetGroundZFor_3dCoord(coords.x, coords.y, coords.z) RemoveItem() TriggerServerEvent("pickle_consumables:drop:createDrop", vector3(coords.x, coords.y, zCoords + 1.0)) end if insideMenu then DisableControls({1, 2, 24, 69, 70, 92, 114, 140, 141, 142, 257, 263, 264}) else DisableControls({24, 69, 70, 92, 114, 140, 141, 142, 257, 263, 264}) end Wait(0) end local ped = PlayerPedId() ClearPedTasks(ped) end) end RegisterNetEvent("pickle_consumables:equipItem", function(name, metadata) if not Config.Items[name] then return print("^1ERROR: This item is not configured.^0") end if EquippedItem then return ShowNotification(_L("item_active")) end ItemThread(name, metadata) end) RegisterNetEvent("pickle_consumables:removeItem", function() RemoveItem() end) AddEventHandler("onResourceStop", function(name) if name ~= GetCurrentResourceName() then return end TransitionFromBlurred(0) RemoveAttachedProp() end)