Zaloguj się by uzyskać pełen dostęp. Nie masz jeszcze konta? Założ je już teraz w kilka sekund.

Wysłany: 2019-01-09, 18:48


Drediks

Developer LUA






Wiek: 30
Na forum: 3493 dni
Posty: 44
Nick w MP: Trojka

Piwa: 66

Respekt: 50

By?by kto? mi?y i pom?g? naprawi? system duty dla OwlGaming 4.3? chyba nie musz? nikomu przedstawia?


#Oraz jak naprawi? to ?e po wpisaniu /setfactionleader imie 1 wyskakuje brak frakcji mimo ze PD jest podpisane pod 1


function openDutyWindow()
    local availablePackages, allowList = fetchAvailablePackages(localPlayer)
        
    if #availablePackages > 0 then
        local dutyLevel = getElementData(localPlayer, "duty")
        if not dutyLevel or dutyLevel == 0 then
            selectPackageGUI_open(availablePackages, allowList)
        else
            triggerServerEvent("duty:offduty", localPlayer)
        end
    else
        outputChatBox("There is no duty available for you at this spot!")
    end
end
addCommandHandler("duty", openDutyWindow)

function itemIsAllowed(allowList, id)
    for k,v in pairs(allowList) do
        if tonumber(id) == tonumber(v[1]) then
            return true
        end
    end
    return false
end

-- --- --
-- GUI --
-- --- --
local gAvailablePackages = nil
local gChks = { }
local gButtons = { }
local gui = { }

function selectPackageGUI_open(availablePackages, allowList)
    gAvailablePackages = availablePackages
    local screenWidth, screenHeight = guiGetScreenSize()
    local windowWidth, windowHeight = 680, 516
    local left = screenWidth/2 - windowWidth/2
    local top = screenHeight/2 - windowHeight/2
    gui["_root"] = guiCreateWindow(left, top, windowWidth, windowHeight, "Duty Selection", false)
    guiWindowSetSizable(gui["_root"], false)
    
    gui["tabSelection"] = guiCreateTabPanel(10, 25, 651, 471, false, gui["_root"])
    for pIndex, packageDetails in ipairs(availablePackages) do
        local guiTabName = "package"..tostring(packageDetails[1])
        gui[guiTabName] = guiCreateTab(packageDetails[2], gui["tabSelection"])

        local xAxis = 10 -- Start at 10
        local yAxis = 20 -- Start at 10
        
        -- Regular items
        for index, itemDetails in pairs(packageDetails[5]) do
            local guiPrefix = guiTabName.."-package"..tostring(index).."-"
            
            gui[guiPrefix.."chk1"] = guiCreateCheckBox(xAxis + 30, yAxis+50, 16, 17, "chk", false, false, gui[guiTabName])
            setElementData(gui[guiPrefix.."chk1"], "button:action", "Push")
            setElementData(gui[guiPrefix.."chk1"], "button:itemDetails", itemDetails)
            setElementData(gui[guiPrefix.."chk1"], "button:itemID", index)
            setElementData(gui[guiPrefix.."chk1"], "button:grantID", packageDetails[1])
            setElementData(gui[guiPrefix.."chk1"], "button:chk", gui[guiPrefix.."chk1"])
            addEventHandler("onClientGUIClick", gui[guiPrefix.."chk1"], selectPackageGUI_process)
            addEventHandler("onClientGUIDoubleClick", gui[guiPrefix.."chk1"], selectPackageGUI_process)
            table.insert(gChks, gui[guiPrefix.."chk1"])
            
            gui[guiPrefix.."pushButton1"] = guiCreateButton(xAxis, yAxis, 71, 51, exports['item-system']:getItemName(itemDetails[2]), false, gui[guiTabName])
            setElementData(gui[guiPrefix.."pushButton1"], "button:action", "Push")
            setElementData(gui[guiPrefix.."pushButton1"], "button:chk", gui[guiPrefix.."chk1"])
            addEventHandler("onClientGUIClick", gui[guiPrefix.."pushButton1"], selectPackageGUI_process)
            gButtons[ gui[guiPrefix.."chk1"] ] = gui[guiPrefix.."pushButton1"]
            
            gui[guiPrefix.."label_3"] = guiCreateLabel(xAxis, yAxis+6, 71, 13, itemDetails[3], false, gui[guiTabName])
            guiLabelSetHorizontalAlign(gui[guiPrefix.."label_3"], "left", false)
            guiLabelSetVerticalAlign(gui[guiPrefix.."label_3"], "center")
            guiSetProperty(gui[guiPrefix.."label_3"], "AlwaysOnTop", "True")

            if not itemIsAllowed(allowList, itemDetails[1]) then
                guiLabelSetColor(gui[guiPrefix.."label_3"], 255, 0, 0)
                guiSetEnabled(gui[guiPrefix.."pushButton1"], false)
                guiSetEnabled(gui[guiPrefix.."chk1"], false)
            end

            xAxis = xAxis + 80 -- prepare next row
            
            if xAxis >= 650 then
                xAxis = 10
                yAxis = yAxis + 70
            end
        end
        
        -- Skins
        local skinTable = { }
        
        -- show current skin?
        --[[if not packageDetails["forceSkinChange"] then
            local currentSkin = getElementModel( localPlayer )
            local clothing = getElementData( localPlayer, 'clothing:id' )
            if clothing then
                table.insert(skinTable, currentSkin .. ':' .. clothing)
            else
                table.insert(skinTable, tostring(currentSkin))
            end
        end]]
        
        -- add package skins
        if packageDetails[3] then
            for i, a in pairs(packageDetails[3]) do
                if a[2] == "N/A" then a[2] = nil end
                local a = table.concat(a, ":")
                table.insert(skinTable, tostring(a))
            end
        end
        
        local xAxis = 0 -- Start at 10
        local yAxis = 200 -- Start at 10
        
        local count = 0
        for skinIndex, skinID in pairs(skinTable) do
            count = count + 1
            --local skinID = table.concat(skinID, ":")
            local skinImg = ("%03d"):format(skinID:gsub(":(.*)$", ""), 10)

            gui[guiTabName.."-radio-"..skinID] = guiCreateRadioButton (xAxis + 30, yAxis+80, 15, 15, "", false, gui[guiTabName] )
            setElementData(gui[guiTabName.."-radio-"..skinID], "button:skinID", skinID)
            setElementData(gui[guiTabName.."-radio-"..skinID], "button:grantID", packageDetails[1])
            table.insert(gChks, gui[guiTabName.."-radio-"..skinID])
            if skinIndex == 1 then
                guiRadioButtonSetSelected(gui[guiTabName.."-radio-"..skinID], true)
            end
            
            gui[guiTabName.."-skin-"..skinID] = guiCreateStaticImage (xAxis, yAxis, 75, 75, ":account/img/" .. skinImg..".png", false, gui[guiTabName] )
            setElementData(gui[guiTabName.."-skin-"..skinID], "button:action", "Radio")
            setElementData(gui[guiTabName.."-skin-"..skinID], "button:element", gui[guiTabName.."-radio-"..skinID])
            addEventHandler("onClientGUIClick", gui[guiTabName.."-skin-"..skinID], selectPackageGUI_process)
            xAxis = xAxis + 80 -- prepare next row
            if count == 8 then
                count = 0
                xAxis = 10
                yAxis = yAxis + 100
            end
        end

        gui[guiTabName.."-cancel"] = guiCreateButton(10, 400, 200, 35, "Cancel", false, gui[guiTabName])
        setElementData(gui[guiTabName.."-cancel"], "button:action", "Cancel")
        addEventHandler("onClientGUIClick", gui[guiTabName.."-cancel"], selectPackageGUI_process)
        
        gui[guiTabName.."-spawn"] = guiCreateButton(440, 400, 200, 35, "Spawn", false, gui[guiTabName])
        setElementData(gui[guiTabName.."-spawn"], "button:action", "Go")
        setElementData(gui[guiTabName.."-spawn"], "button:grantID", packageDetails[1])
        addEventHandler("onClientGUIClick", gui[guiTabName.."-spawn"], selectPackageGUI_process)
    end
end

function selectPackageGUI_process(mouseButton, mouseState, absoluteX, absoluteY)
    if source and isElement(source) and mouseButton == "left" and mouseState == "up" then
        local theGUIelement = source
        local btnAction = getElementData(theGUIelement, "button:action")
        if btnAction then
            if btnAction == "Cancel" then
                destroyElement(gui["_root"])
                gui = { }
                gChks = { }
                gAvailablePackages = { }
            elseif btnAction == "Radio" then 
                local victimElement = getElementData(theGUIelement, "button:element")
                if victimElement then
                    guiRadioButtonSetSelected(victimElement, true)
                end
            elseif btnAction == "Go" then
                local grantID = getElementData(theGUIelement, "button:grantID")
                if grantID then
                    local spawnRequest = { }
                    local spawnSkin = -1
                    -- Make spawn request for server
                    for tableIndex, chkBox in ipairs(gChks) do
                        local rowGrantID = getElementData(chkBox, "button:grantID")
                        if rowGrantID == grantID then
                            local rowItemDetails = getElementData(chkBox, "button:itemDetails")
                            if rowItemDetails then
                                if guiCheckBoxGetSelected(chkBox) then
                                    table.insert(spawnRequest, rowItemDetails)
                                end
                            end
                            local rowSkinDetails = getElementData(chkBox, "button:skinID")
                            if rowSkinDetails then
                                if guiRadioButtonGetSelected(chkBox) then
                                    spawnSkin = rowSkinDetails
                                end
                            end
                        end
                    end
                    destroyElement(gui["_root"])
                    gui = { }
                    gChks = { }
                    gAvailablePackages = { }
                    
                    --outputChatBox("Spawnrequest for package "..grantID)
                    --for i, a in ipairs(spawnRequest) do
                    --    outputChatBox("i: "..a[1].." (".. exports['item-system']:getItemName(a[1]) ..") v:"..a[2])
                    --end
                    --outputChatBox("Spawnskin: "..spawnSkin)
                    --outputChatBox("---")
                    
                    if spawnSkin == -1 then
                        return
                    end
                    triggerServerEvent("duty:request", localPlayer, grantID, spawnRequest, spawnSkin)
                end
                
            elseif btnAction == "Push" then
                local guiChk = getElementData(theGUIelement, "button:chk")
                if guiChk then
                    local newstate =  not guiCheckBoxGetSelected ( guiChk )
                    chkItemDetails = getElementData(guiChk, "button:itemDetails")
                    if chkItemDetails and chkItemDetails[1] then
                        for tableIndex, chkBox in ipairs(gChks) do
                            cchkItemDetails = getElementData(chkBox, "button:itemDetails")
                            if cchkItemDetails and cchkItemDetails[1] then
                                if (cchkItemDetails[1] == chkItemDetails[1]) then
                                    guiCheckBoxSetSelected ( chkBox, false )
                                    guiSetEnabled( gButtons[chkBox], not newstate )
                                end
                            end
                        end    
                    end
                    
                    
                    guiCheckBoxSetSelected ( guiChk, newstate )
                    guiSetEnabled( gButtons[guiChk], true )
                end
            elseif btnAction == "Block" then
                guiCheckBoxSetSelected ( theGUIelement, not guiCheckBoxGetSelected ( theGUIelement ) )
            end
        end
    end
end


DutyColShapes = { }
function createDutyColShape(posX, posY, posZ, size, interior, dimension, factionID, locationID)
    tempShape = createColSphere(tonumber(posX), tonumber(posY), tonumber(posZ), tonumber(size))
    setElementDimension(tempShape, tonumber(dimension) or 0)
    setElementInterior(tempShape, tonumber(interior) or 0)
    if tempShape then
        if type(DutyColShapes[tonumber(factionID)]) ~= "table" then
            DutyColShapes[tonumber(factionID)] = { }
        end
        DutyColShapes[tonumber(factionID)][tonumber(locationID)] = tempShape
        setElementData(resourceRoot, "DutyColShapes", DutyColShapes)
        return true
    end
end

function destroyDutyColShape(factionID, locationID)
    if DutyColShapes[tonumber(factionID)][tonumber(locationID)] then
        destroyElement(DutyColShapes[tonumber(factionID)][tonumber(locationID)])
        DutyColShapes[tonumber(factionID)][tonumber(locationID)] = nil
        setElementData(resourceRoot, "DutyColShapes", DutyColShapes)
        return true
    end
end

-- -------------------------- --
-- General checking functions -- Revised by Chaos for OwlGaming < Old way was shitty less loops now
-- -------------------------- --

function fetchAvailablePackages( targetPlayer )
    local availablePackages = { }
    local factionID = tonumber(getElementData(targetPlayer, "faction"))
    local factionDuty = getElementData(resourceRoot, "factionDuty")
    local factionLocations = getElementData(resourceRoot, "factionLocations")
    local DutyColShapes = getElementData(resourceRoot, "DutyColShapes")

        if factionDuty[factionID] then
            for i, factionPackage in pairs ( factionDuty[factionID] ) do -- Loop all the faction packages
                local found = false
                for index, v in pairs ( factionPackage[4] ) do -- Loop all the colshapes of the factionpackage
                    if isElement(DutyColShapes[factionID][tonumber(index)]) then
                        if isElementWithinColShape( targetPlayer, DutyColShapes[factionID][tonumber(index)] ) then
                            found = true
                            break  -- We found this package already, no need to search the other colshapes
                            end
                       end
                end

                local veh = getPedOccupiedVehicle(targetPlayer) -- Still can't find it? Lets see if they are in a duty vehicle
                if not found and veh then
                    local vehid = getElementData(veh, "dbid")
                    for k,v in pairs(factionLocations[factionID]) do
                        if tonumber(vehid) == tonumber(v[9]) then -- Yep vehicle ID matches!
                            found = true
                        end
                    end
                end

                if found and canPlayerUseDutyPackage(targetPlayer, i) then
                    table.insert(availablePackages, factionPackage)
                end
            end
        end
    local resource = getResourceRootElement(getResourceFromName("faction-system"))
    if resource then
        allowList = getElementData(resource, "dutyAllowTable")
        for k,v in pairs(allowList) do
            if tonumber(v[1]) == factionID then
                key = k
                break
            end
        end
        allowList = allowList[key][3]
    end
    return availablePackages, allowList
end

function getGrant(thePlayer, grantID, factionID)
    local factionID = tonumber(factionID)
    local factionDuty = getElementData(resourceRoot, "factionDuty")
    return factionDuty[factionID][tonumber(grantID)]
end

function canPlayerUseDutyPackage(targetPlayer, packageID)
    local package = tonumber(packageID)
    local playerPackagePermission = getElementData(targetPlayer, "factionPackages")
    if playerPackagePermission then
        for index, permissionID in ipairs(playerPackagePermission) do
            if (tonumber(permissionID) == tonumber(package)) then
                return true
            end
        end
    end
    return false
end

function getFactionPackages( factionID )
    if not factionID or not tonumber( factionID ) then
        return false
    end
    local factionDuty = getElementData(resourceRoot, "factionDuty")

    return factionDuty[tonumber(factionID)]
end
addEvent("onPlayerDuty", true)

addEvent("duty:request", true)
function dutyRequest(grantID, itemTable, skinID)
    local thePlayer = client

    -- Fetch the factionPackage
    local foundPackage = getGrant(thePlayer, grantID, getElementData(thePlayer, "faction"))
    
    if foundPackage and canPlayerUseDutyPackage(thePlayer, foundPackage[1]) then
        -- We've got an auth for the package
        
        -- Now we check the contents
        for itemIndexID, itemTableContent in ipairs(itemTable) do
            local found = false
            
            for aItemIndexID, aItemTableContent in pairs(foundPackage[5]) do
                if aItemTableContent[1] == itemTableContent[1] then
                    found = true
                    break
                end
            end
            
            if not found then
                outputChatBox("Error.", thePlayer)
                return false
            end
        end
        
        for itemIndexID, itemTableContent in ipairs(itemTable) do
            if itemTableContent[2] > 0 then -- its a real item
                exports.global:giveItem(thePlayer, itemTableContent[2], itemTableContent[3]) 
            else -- Its a weapon :O!
                if itemTableContent[2] == -100 then
                    setPedArmor(thePlayer, itemTableContent[3])
                else
                    local hasAmmo = true
                    local characterDatabaseID = getElementData(thePlayer, "account:character:id")
                    local gtaWeaponID = tonumber(itemTableContent[2]) - tonumber(itemTableContent[2]) - tonumber(itemTableContent[2])
                    local weaponSerial = exports.global:createWeaponSerial(2, characterDatabaseID)
                    exports.global:giveItem(thePlayer, 115, gtaWeaponID ..":".. weaponSerial ..":" .. getWeaponNameFromID ( gtaWeaponID ) .. " (D)"  ) 
                    
                    local gtaweaponcap = exports.weaponcap:getGTACap(gtaWeaponID)
                    local packsToGive = math.ceil( tonumber(itemTableContent[3]) / gtaweaponcap)
                    
                    if (getSlotFromWeapon ( gtaWeaponID ) < 2) then
                        hasAmmo = false
                    elseif ( getSlotFromWeapon ( gtaWeaponID ) == 9) then -- Spraycan, Fire Extinguisher, Camera
                        hasAmmo = false
                    end

                    if packsToGive > 0 and hasAmmo then
                        for i=1,packsToGive do 
                            exports.global:giveItem(thePlayer, 116, gtaWeaponID ..":".. gtaweaponcap ..":Ammopack for " .. getWeaponNameFromID ( gtaWeaponID ) .. " (D)"  ) 
                        end
                    end
                    
                    
                end
            end
        end
        
        savedSkin = 0
        savedClothing = 0
        if skinID and type(skinID) == 'string' then
            local skinData = split(skinID, ':')
            savedSkin = tonumber(skinData[1])
            setElementModel(thePlayer, savedSkin)
            if #skinData > 1 then
                savedClothing = tonumber(skinData[2])
                setElementData(thePlayer, 'clothing:id', savedClothing)
            else
                setElementData(thePlayer, 'clothing:id', nil)
            end
        end
        
        triggerClientEvent(thePlayer, "onPlayerDuty", thePlayer, true)
        triggerEvent("onPlayerDuty", thePlayer, true)
        exports.anticheat:changeProtectedElementDataEx(thePlayer, "duty", grantID, true)
        exports.mysql:query_free( "UPDATE characters SET skin = '" .. exports.mysql:escape_string(savedSkin) .. "', clothingid = '" .. exports.mysql:escape_string(savedClothing) .. "', duty = '" .. exports.mysql:escape_string(getElementData( thePlayer, "duty" ) or 0 ) .. "' WHERE id = '" .. exports.mysql:escape_string(getElementData( thePlayer, "dbid" )).."'" )    


    end
    return false
end
addEventHandler("duty:request", getRootElement(), dutyRequest)

addEvent("duty:offduty", true)
function dutyOffduty()

    local thePlayer = client or source
    local grantID = getElementData(thePlayer, "duty") or 0
    if tonumber(grantID) > 0 then
        local savedSkin, savedClothing = nil, nil

        setPedArmor(thePlayer, 0)
        local correction = 0
        local items = exports['item-system']:getItems( thePlayer ) -- [] [1] = itemID [2] = itemValue
        for itemSlot, itemCheck in ipairs(items) do
            if (itemCheck[1] == 115) then -- Weapon
                local itemCheckExplode = exports.global:explode(":", itemCheck[2])
                local serialNumberCheck = exports.global:retrieveWeaponDetails(itemCheckExplode[2])
                if (tonumber(serialNumberCheck[2]) == 2) then -- /duty spawned
                    exports['item-system']:takeItemFromSlot(thePlayer, itemSlot - correction, false)
                    correction = correction + 1
                end
            elseif (itemCheck[1] == 116) then
                local checkString = string.sub(itemCheck[2], -4)
                if checkString == " (D)" then -- duty given weapon
                    exports['item-system']:takeItemFromSlot(thePlayer, itemSlot - correction, false)
                    correction = correction + 1
                end
            elseif itemCheck[1] == 16 then
                -- use the first skin as skin to wear
                if not savedSkin then
                    local skinData = split(tostring(itemCheck[2]), ':')
                    savedSkin = tonumber(skinData[1])
                    savedClothing = tonumber(skinData[2])
                end
            end
        end
        
        -- remove duty items
        local foundPackage = getGrant(thePlayer, grantID, getElementData(thePlayer, "faction"))
        if foundPackage then
            for itemIndexID, itemTableContent in ipairs(foundPackage[5]) do
                if itemTableContent[2] > 0 then -- its a real item
                    exports.global:takeItem(thePlayer, itemTableContent[1], itemTableContent[2]) 
                end
            end
        end

        -- reset the skin to the first found in the inventory
        if savedSkin then
            setElementModel(thePlayer, savedSkin)
            setElementData(thePlayer, 'clothing:id', savedClothing)

            exports.mysql:query_free( "UPDATE characters SET skin = '" .. exports.mysql:escape_string(savedSkin) .. "', clothingid = '" .. exports.mysql:escape_string(savedClothing or 0) .. "', duty = '0' WHERE id = '" .. exports.mysql:escape_string(getElementData( thePlayer, "dbid" )).."'" )    
        else
            -- no actual clothes in inventory
            exports['item-system']:doItemGiveawayChecks(thePlayer, 16)

            exports.mysql:query_free( "UPDATE characters SET duty = '0' WHERE id = '" .. exports.mysql:escape_string(getElementData( thePlayer, "dbid" )).."'" )    
        end
        
        exports.anticheat:changeProtectedElementDataEx(thePlayer, "duty", 0, true)
    
        triggerClientEvent(thePlayer, "onPlayerDuty", thePlayer, false)
        triggerEvent("onPlayerDuty", thePlayer, false)
    end
end
addEventHandler("duty:offduty", getRootElement(), dutyOffduty)


Ostatnio zmieniony przez Drediks 2019-01-09, 19:15, w całości zmieniany 1 raz  
Postaw piwo autorowi tego posta
 

 
Wysłany: 2019-01-09, 18:57


Nexisten

Moderator






Wiek: 22
Na forum: 4249 dni
Posty: 552
Nick w MP: Nexisten

Piwa: 1486

Respekt: 287,3
Respekt: 287,3Respekt: 287,3Respekt: 287,3

Bez kodu nikt nic nie zrobi.

Postaw piwo autorowi tego posta
 

 
Wysłany: 2019-01-09, 19:43


Drediks

Developer LUA






Wiek: 30
Na forum: 3493 dni
Posty: 44
Nick w MP: Trojka

Piwa: 66

Respekt: 50

dodany :P

Podpis
[lua]function()[/lua]
nie ważne jak wygląda ważne że działa
Postaw piwo autorowi tego posta
 

 
Wysłany: 2019-01-09, 20:09


Kalizman







Wiek: 24
Na forum: 3793 dni
Posty: 1394

Piwa: 4624

Respekt: 358,8
Respekt: 358,8Respekt: 358,8Respekt: 358,8Respekt: 358,8

nie kazdy moze wie o co chodzi, nie korzystam z gm

Postaw piwo autorowi tego posta
 

 
Tagi: system :: sluzby
Anonymous





Na forum: 245 dni
Posty: 1



Anonymous Koniecznie zajrzyj na:






Skocz do:  
Wyświetl posty z ostatnich:   
GTAONLINE.PL » JĘZYKI PROGRAMOWANIA » LUA Ten temat jest zablokowany bez możliwości zmiany postów lub pisania odpowiedzi

Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Dodaj temat do Ulubionych
Wersja do druku