Drediks
Developer LUA
Wiek: 30 Na forum: 3352 dni Posty: 44
Nick w MP: Trojka
Piwa : 66
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