166 lines
		
	
	
		
			No EOL
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			166 lines
		
	
	
		
			No EOL
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
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) |