forked from Simnation/Main
Verschoben von Tools nach Test okokcrafting
This commit is contained in:
parent
a29350c85f
commit
504fb3f859
19 changed files with 3254 additions and 3254 deletions
590
resources/[test]/okokCrafting/sv_utils.lua
Normal file
590
resources/[test]/okokCrafting/sv_utils.lua
Normal file
|
@ -0,0 +1,590 @@
|
|||
QBCore = exports[Config.qbPrefix.."-core"]:GetCoreObject()
|
||||
|
||||
Webhook = ''
|
||||
|
||||
function getMoney(type, xPlayer)
|
||||
local moneyCount = 0
|
||||
if type == "cash" then
|
||||
moneyCount = xPlayer.PlayerData.money.cash
|
||||
else
|
||||
moneyCount = xPlayer.PlayerData.money.bank
|
||||
end
|
||||
|
||||
return moneyCount
|
||||
end
|
||||
|
||||
function addMoney(type, value, xPlayer)
|
||||
xPlayer.Functions.AddMoney(type, value)
|
||||
end
|
||||
|
||||
function removeMoney(type, value, xPlayer)
|
||||
xPlayer.Functions.RemoveMoney(type, value)
|
||||
end
|
||||
|
||||
function addItem(xPlayer, item, amount, data)
|
||||
xPlayer.Functions.AddItem(item, tonumber(amount))
|
||||
end
|
||||
|
||||
function removeItem(xPlayer, item, amount)
|
||||
xPlayer.Functions.RemoveItem(item, tonumber(amount))
|
||||
end
|
||||
|
||||
function canCarryIt(item, amount, xPlayer)
|
||||
if Config.UseOx_inventory then
|
||||
return exports.ox_inventory:CanCarryItem(xPlayer.PlayerData.source, item, amount)
|
||||
end
|
||||
|
||||
local totalWeight = QBCore.Player.GetTotalWeight(xPlayer.PlayerData.items)
|
||||
local itemInfo = QBCore.Shared.Items[item:lower()]
|
||||
if not itemInfo then
|
||||
TriggerClientEvent('QBCore:Notify', xPlayer.PlayerData.source, 'This item doesn\'t exits', 'error')
|
||||
return
|
||||
end
|
||||
amount = tonumber(amount)
|
||||
if (totalWeight + (itemInfo['weight'] * amount)) <= 120000 then
|
||||
return true
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
function hasPermission(source)
|
||||
local staff = false
|
||||
for k,v in ipairs(Config.AdminGroups) do
|
||||
if QBCore.Functions.HasPermission(source, v) then
|
||||
staff = true
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
return staff
|
||||
end
|
||||
|
||||
function MySQLexecute(query, values, func)
|
||||
return MySQL.query(query, values, func)
|
||||
end
|
||||
|
||||
function MySQLfetchAll(query, values, func)
|
||||
return MySQL.query(query, values, func)
|
||||
end
|
||||
|
||||
function giveXP(xPlayer, xp, workbench)
|
||||
if Config.SameLevelForAllTables then
|
||||
MySQLexecute('UPDATE players SET '..Config.xpColumnsName..' = xp+@xp WHERE citizenid = @identifier', {
|
||||
['@identifier'] = xPlayer.PlayerData.citizenid,
|
||||
['@xp'] = Config.DoubleXP and xp*2 or xp,
|
||||
}, function (result)
|
||||
TriggerClientEvent(Config.EventPrefix..':updateXP', xPlayer.PlayerData.source)
|
||||
end)
|
||||
else
|
||||
MySQLexecute('UPDATE players SET '..Config.xpColumnsName..' = JSON_SET(xp, @table, JSON_EXTRACT(xp, @table) + @xp) WHERE citizenid = @identifier', {
|
||||
['@identifier'] = xPlayer.PlayerData.citizenid,
|
||||
['@xp'] = Config.DoubleXP and xp*2 or xp,
|
||||
['@table'] = "$."..workbench,
|
||||
}, function (result)
|
||||
TriggerClientEvent(Config.EventPrefix..':updateXP', xPlayer.PlayerData.source)
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
||||
QBCore.Functions.CreateCallback(Config.EventPrefix..":inv2", function(source, cb, item, isMoney)
|
||||
local xPlayer = QBCore.Functions.GetPlayer(source)
|
||||
local itemS = {}
|
||||
if isMoney == "false" then
|
||||
isMoney = false
|
||||
elseif isMoney == "true" then
|
||||
isMoney = true
|
||||
end
|
||||
|
||||
if isMoney then
|
||||
local playerMoney = getMoney(item, xPlayer)
|
||||
itemS.name = item
|
||||
itemS.amount = playerMoney
|
||||
else
|
||||
itemS = xPlayer.Functions.GetItemByName(item)
|
||||
if itemS == nil then
|
||||
itemS = {
|
||||
name = item,
|
||||
amount = 0
|
||||
}
|
||||
end
|
||||
if itemS.count ~= nil then
|
||||
itemS.amount = itemS.count
|
||||
end
|
||||
end
|
||||
|
||||
cb(itemS)
|
||||
end)
|
||||
|
||||
QBCore.Functions.CreateCallback(Config.EventPrefix..":maxCraft", function(source, cb, recipe, maxCraftAmount, isDisassemble, itemC, itmNeeded)
|
||||
local _source = source
|
||||
local xPlayer = QBCore.Functions.GetPlayer(_source)
|
||||
local maxCraft = maxCraftAmount
|
||||
local itemAmt = 0
|
||||
|
||||
if not isDisassemble then
|
||||
for k,v in ipairs(recipe) do
|
||||
local item = {}
|
||||
local itemCount = 0
|
||||
|
||||
if v[4] then
|
||||
itemCount = getMoney(v[1], xPlayer)
|
||||
else
|
||||
item = xPlayer.Functions.GetItemByName(v[1])
|
||||
if item == nil then
|
||||
item = {
|
||||
name = v[1],
|
||||
amount = 0
|
||||
}
|
||||
end
|
||||
if item.count ~= nil then
|
||||
item.amount = item.count
|
||||
end
|
||||
itemCount = item.amount
|
||||
end
|
||||
|
||||
if itemCount > 0 then
|
||||
local possibleToCraft = itemCount/tonumber(v[2])
|
||||
if possibleToCraft > 0 then
|
||||
if maxCraft > possibleToCraft then
|
||||
maxCraft = possibleToCraft
|
||||
end
|
||||
else
|
||||
maxCraft = 0
|
||||
break
|
||||
end
|
||||
else
|
||||
maxCraft = 0
|
||||
break
|
||||
end
|
||||
end
|
||||
else
|
||||
local item = xPlayer.Functions.GetItemByName(itemC)
|
||||
if item == nil then
|
||||
item = {
|
||||
name = itemC,
|
||||
amount = 0
|
||||
}
|
||||
end
|
||||
if item.count ~= nil then
|
||||
item.amount = item.count
|
||||
end
|
||||
itemAmt = item.amount
|
||||
|
||||
if itemAmt > 0 then
|
||||
local possibleToCraft = itemAmt/tonumber(itmNeeded)
|
||||
if possibleToCraft > 0 then
|
||||
if maxCraft > possibleToCraft then
|
||||
maxCraft = possibleToCraft
|
||||
end
|
||||
else
|
||||
maxCraft = 0
|
||||
end
|
||||
else
|
||||
maxCraft = 0
|
||||
end
|
||||
end
|
||||
|
||||
cb(math.floor(maxCraft), itemAmt)
|
||||
end)
|
||||
|
||||
local function normalizeRecipe(recipe)
|
||||
local normalized = {}
|
||||
for _, item in ipairs(recipe) do
|
||||
local normalizedItem = { item[1], tonumber(item[2]), item[3] == "true" or item[3] == true, item[4] == "true" or item[4] == true }
|
||||
table.insert(normalized, normalizedItem)
|
||||
end
|
||||
return normalized
|
||||
end
|
||||
|
||||
local function compareRecipes(recipe1, recipe2)
|
||||
if #recipe1 ~= #recipe2 then
|
||||
return false
|
||||
end
|
||||
for i, item1 in ipairs(recipe1) do
|
||||
local item2 = recipe2[i]
|
||||
if item1[1] ~= item2[1] and item1[2] <= item2[2] then
|
||||
return false
|
||||
end
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
function craftExistsInWorkbench(workbenchID, itemID, recipe)
|
||||
for _, workbench in pairs(Config.Crafting) do
|
||||
if workbench.tableID == workbenchID then
|
||||
for _, craft in pairs(workbench.crafts) do
|
||||
if Config.Crafts[craft] == nil then
|
||||
print("Craft "..craft.." does not exist in Config.Crafts")
|
||||
return false
|
||||
end
|
||||
if Config.Crafts[craft].item == itemID then
|
||||
local normalizedCraftRecipe = normalizeRecipe(Config.Crafts[craft].recipe)
|
||||
local normalizedInputRecipe = normalizeRecipe(recipe)
|
||||
if compareRecipes(normalizedCraftRecipe, normalizedInputRecipe) then
|
||||
return true
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
QBCore.Functions.CreateCallback(Config.EventPrefix..":CanCraftItem", function(source, cb, itemID, recipe, itemName, amount, isItem, workbench, timeCraft, CraftQueues, xp, pc, isDis, itemData)
|
||||
local xPlayer = QBCore.Functions.GetPlayer(source)
|
||||
local canCraft = true
|
||||
if not craftExistsInWorkbench(workbench, itemID, recipe) then
|
||||
canCraft = false
|
||||
end
|
||||
|
||||
if not isDis then
|
||||
for k,v in pairs(recipe) do
|
||||
if v[4] == "false" then
|
||||
local item = xPlayer.Functions.GetItemByName(v[1])
|
||||
if item == nil then
|
||||
item = {
|
||||
name = v[1],
|
||||
amount = 0
|
||||
}
|
||||
end
|
||||
if item.count ~= nil then
|
||||
item.amount = item.count
|
||||
end
|
||||
if item.amount < v[2] then
|
||||
canCraft = false
|
||||
end
|
||||
else
|
||||
local playerMoney = getMoney(v[1], xPlayer)
|
||||
if playerMoney < v[2] then
|
||||
canCraft = false
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
local item = xPlayer.Functions.GetItemByName(itemID)
|
||||
if item == nil then
|
||||
item = {
|
||||
name = itemID,
|
||||
amount = 0
|
||||
}
|
||||
end
|
||||
if item.count ~= nil then
|
||||
item.amount = item.count
|
||||
end
|
||||
if tonumber(item.amount) < tonumber(amount) then
|
||||
canCraft = false
|
||||
end
|
||||
end
|
||||
|
||||
if canCraft then
|
||||
if not isDis then
|
||||
for k,v in pairs(recipe) do
|
||||
if v[3] == "true" then
|
||||
if v[4] == "true" then
|
||||
removeMoney(v[1], v[2], xPlayer)
|
||||
else
|
||||
removeItem(xPlayer, v[1], v[2])
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
removeItem(xPlayer, itemID, tonumber(amount))
|
||||
end
|
||||
|
||||
local queue = CraftQueues
|
||||
if queue ~= nil and queue[workbench] ~= nil then
|
||||
queue[workbench][#queue[workbench]+1] = {
|
||||
item = itemID,
|
||||
recipe = recipe,
|
||||
amount = amount,
|
||||
isItem = isItem,
|
||||
time = timeCraft,
|
||||
itemName = itemName[itemID],
|
||||
isDone = false,
|
||||
isPending = true,
|
||||
randomID = math.random(100000000, 999999999),
|
||||
xp = xp,
|
||||
sucPC = pc,
|
||||
suc = true,
|
||||
isDis = isDis,
|
||||
data = itemData
|
||||
}
|
||||
|
||||
MySQLexecute('UPDATE players SET '..Config.craftQueryColumnName..' = @okokcrafts WHERE citizenid = @identifier', {
|
||||
['@identifier'] = xPlayer.PlayerData.citizenid,
|
||||
['@okokcrafts'] = json.encode(queue),
|
||||
}, function (result)
|
||||
TriggerClientEvent(Config.EventPrefix..':notification', xPlayer.PlayerData.source, _L('added_to_queue').title, interp(_L('added_to_queue').text, {s1 = itemName[itemID]}), _L('added_to_queue').time, _L('added_to_queue').type)
|
||||
|
||||
if Webhook ~= "" then
|
||||
data = {
|
||||
playerid = xPlayer.PlayerData.source,
|
||||
type = "start-craft",
|
||||
item = itemName[itemID],
|
||||
amount = amount,
|
||||
}
|
||||
|
||||
discordWebhook(data)
|
||||
end
|
||||
|
||||
cb(queue)
|
||||
end)
|
||||
else
|
||||
if queue == nil then
|
||||
queue = {}
|
||||
end
|
||||
queue[workbench] = {}
|
||||
queue[workbench] = {
|
||||
[1] = {
|
||||
item = itemID,
|
||||
recipe = recipe,
|
||||
amount = amount,
|
||||
isItem = isItem,
|
||||
time = timeCraft,
|
||||
itemName = itemName[itemID],
|
||||
isDone = false,
|
||||
isPending = true,
|
||||
randomID = math.random(100000000, 999999999),
|
||||
xp = xp,
|
||||
sucPC = pc,
|
||||
suc = true,
|
||||
isDis = isDis,
|
||||
data = itemData
|
||||
}
|
||||
}
|
||||
|
||||
MySQLexecute('UPDATE players SET '..Config.craftQueryColumnName..' = @okokcrafts WHERE citizenid = @identifier', {
|
||||
['@identifier'] = xPlayer.PlayerData.citizenid,
|
||||
['@okokcrafts'] = json.encode(queue),
|
||||
}, function (result)
|
||||
TriggerClientEvent(Config.EventPrefix..':notification', xPlayer.PlayerData.source, _L('added_to_queue').title, interp(_L('added_to_queue').text, {s1 = itemName[itemID]}), _L('added_to_queue').time, _L('added_to_queue').type)
|
||||
|
||||
if Webhook ~= "" then
|
||||
data = {
|
||||
playerid = xPlayer.PlayerData.source,
|
||||
type = "start-craft",
|
||||
item = itemName[itemID],
|
||||
amount = amount,
|
||||
}
|
||||
discordWebhook(data)
|
||||
end
|
||||
|
||||
cb(queue)
|
||||
end)
|
||||
end
|
||||
else
|
||||
TriggerClientEvent(Config.EventPrefix..':notification', xPlayer.PlayerData.source, _L('cant_craft').title, interp(_L('cant_craft').text, {s1 = itemName[itemID]}), _L('cant_craft').time, _L('cant_craft').type)
|
||||
cb(false)
|
||||
end
|
||||
end)
|
||||
|
||||
RegisterServerEvent(Config.EventPrefix..':claimAll')
|
||||
AddEventHandler(Config.EventPrefix..':claimAll', function(workbench, AllQueues)
|
||||
local xPlayer = QBCore.Functions.GetPlayer(source)
|
||||
local gotQueue = false
|
||||
local CraftsQueue = {}
|
||||
|
||||
MySQLfetchAll('SELECT okokcrafts FROM players WHERE citizenid = @identifier', {
|
||||
['@identifier'] = xPlayer.PlayerData.citizenid,
|
||||
}, function (result)
|
||||
if result[1] ~= nil then
|
||||
local data = json.decode(result[1].okokcrafts)
|
||||
if data ~= nil then
|
||||
CraftsQueue = data
|
||||
gotQueue = true
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
while not gotQueue do
|
||||
Citizen.Wait(100)
|
||||
end
|
||||
|
||||
local queue = CraftsQueue[workbench]
|
||||
local v = queue[1]
|
||||
|
||||
if v ~= nil then
|
||||
if v.isDone then
|
||||
if v.suc then
|
||||
if not v.isDis then
|
||||
local canCarry = false
|
||||
if v.isItem then
|
||||
if canCarryIt(v.item, v.amount, xPlayer) then
|
||||
addItem(xPlayer, v.item, v.amount, v.data)
|
||||
canCarry = true
|
||||
end
|
||||
else
|
||||
if canCarryIt(v.item, v.amount, xPlayer) then
|
||||
addItem(xPlayer, v.item, v.amount)
|
||||
canCarry = true
|
||||
end
|
||||
end
|
||||
|
||||
if canCarry then
|
||||
if Webhook ~= "" then
|
||||
data = {
|
||||
playerid = xPlayer.PlayerData.source,
|
||||
type = "claim-craft",
|
||||
item = v.itemName,
|
||||
amount = v.amount,
|
||||
}
|
||||
|
||||
discordWebhook(data)
|
||||
end
|
||||
|
||||
if Config.UseXP then
|
||||
giveXP(xPlayer, v.xp, workbench)
|
||||
end
|
||||
TriggerClientEvent(Config.EventPrefix..':removeItemsFromQueue', xPlayer.PlayerData.source, 1, workbench)
|
||||
else
|
||||
TriggerClientEvent(Config.EventPrefix..':notification', xPlayer.PlayerData.source, _L('cant_carry').title, _L('cant_carry').text, _L('cant_carry').time, _L('cant_carry').type)
|
||||
TriggerClientEvent(Config.EventPrefix..':notification', xPlayer.PlayerData.source, _L('claimed_all_items').title, _L('claimed_all_items').text, _L('claimed_all_items').time, _L('claimed_all_items').type)
|
||||
TriggerClientEvent(Config.EventPrefix..':resetClaimAllButton', xPlayer.PlayerData.source)
|
||||
end
|
||||
else
|
||||
local canCarry = true
|
||||
for k2,v2 in ipairs(v.recipe) do
|
||||
if v2[4] == "false" or v2[4] == false then
|
||||
if not canCarryIt(v2[1], v2[2], xPlayer) then
|
||||
canCarry = false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if canCarry then
|
||||
for k2,v2 in ipairs(v.recipe) do
|
||||
if v2[4] == "true" or v2[4] == true then
|
||||
addMoney(v2[1], v2[2], xPlayer)
|
||||
else
|
||||
addItem(xPlayer, v2[1], v2[2])
|
||||
end
|
||||
end
|
||||
|
||||
if Webhook ~= "" then
|
||||
data = {
|
||||
playerid = xPlayer.PlayerData.source,
|
||||
type = "claim-craft",
|
||||
item = v.itemName,
|
||||
amount = v.amount,
|
||||
}
|
||||
|
||||
discordWebhook(data)
|
||||
end
|
||||
|
||||
|
||||
if Config.UseXP then
|
||||
giveXP(xPlayer, v.xp, workbench)
|
||||
end
|
||||
TriggerClientEvent(Config.EventPrefix..':removeItemsFromQueue', xPlayer.PlayerData.source, 1, workbench)
|
||||
else
|
||||
TriggerClientEvent(Config.EventPrefix..':notification', xPlayer.PlayerData.source, _L('cant_carry').title, _L('cant_carry').text, _L('cant_carry').time, _L('cant_carry').type)
|
||||
TriggerClientEvent(Config.EventPrefix..':notification', xPlayer.PlayerData.source, _L('claimed_all_items').title, _L('claimed_all_items').text, _L('claimed_all_items').time, _L('claimed_all_items').type)
|
||||
TriggerClientEvent(Config.EventPrefix..':resetClaimAllButton', xPlayer.PlayerData.source)
|
||||
end
|
||||
end
|
||||
else
|
||||
if Webhook ~= "" then
|
||||
data = {
|
||||
playerid = xPlayer.PlayerData.source,
|
||||
type = "failed-craft",
|
||||
item = v.itemName,
|
||||
amount = v.amount,
|
||||
}
|
||||
|
||||
discordWebhook(data)
|
||||
end
|
||||
if Config.GiveXPOnCraftFailed and Config.UseXP then
|
||||
if Config.UseXP then
|
||||
giveXP(xPlayer, v.xp, workbench)
|
||||
end
|
||||
end
|
||||
TriggerClientEvent(Config.EventPrefix..':removeItemsFromQueue', xPlayer.PlayerData.source, 1, workbench)
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
-------------------------- IDENTIFIERS
|
||||
|
||||
function ExtractIdentifiers(id)
|
||||
local identifiers = {
|
||||
steam = "",
|
||||
ip = "",
|
||||
discord = "",
|
||||
license = "",
|
||||
xbl = "",
|
||||
live = ""
|
||||
}
|
||||
|
||||
for i = 0, GetNumPlayerIdentifiers(id) - 1 do
|
||||
local playerID = GetPlayerIdentifier(id, i)
|
||||
|
||||
if string.find(playerID, "steam") then
|
||||
identifiers.steam = playerID
|
||||
elseif string.find(playerID, "ip") then
|
||||
identifiers.ip = playerID
|
||||
elseif string.find(playerID, "discord") then
|
||||
identifiers.discord = playerID
|
||||
elseif string.find(playerID, "license") then
|
||||
identifiers.license = playerID
|
||||
elseif string.find(playerID, "xbl") then
|
||||
identifiers.xbl = playerID
|
||||
elseif string.find(playerID, "live") then
|
||||
identifiers.live = playerID
|
||||
end
|
||||
end
|
||||
|
||||
return identifiers
|
||||
end
|
||||
|
||||
-------------------------- WEBHOOK
|
||||
|
||||
function discordWebhook(data)
|
||||
local color = '65352'
|
||||
local category = 'default'
|
||||
local item = ''
|
||||
local amount = ''
|
||||
local identifierlist = ExtractIdentifiers(data.playerid)
|
||||
local identifier = identifierlist.license:gsub("license2:", "")
|
||||
local discord = "<@"..identifierlist.discord:gsub("discord:", "")..">"
|
||||
|
||||
if data.type == 'start-craft' then
|
||||
color = Config.StartCraftWebhookColor
|
||||
category = 'Started a craft'
|
||||
item = data.item
|
||||
amount = data.amount
|
||||
elseif data.type == 'cancel-craft' then
|
||||
color = Config.CancelWebhookColor
|
||||
category = 'Canceled a craft'
|
||||
item = data.item
|
||||
amount = data.amount
|
||||
elseif data.type == 'claim-craft' then
|
||||
color = Config.ClaimCraftWebhookColor
|
||||
category = 'Claimed'
|
||||
item = data.item
|
||||
amount = data.amount
|
||||
elseif data.type == 'failed-craft' then
|
||||
color = Config.FailedCraftWebhookColor
|
||||
category = 'Failed a craft'
|
||||
item = data.item
|
||||
amount = data.amount
|
||||
end
|
||||
|
||||
local information = {
|
||||
{
|
||||
["color"] = color,
|
||||
["author"] = {
|
||||
["icon_url"] = Config.IconURL,
|
||||
["name"] = Config.ServerName..' - Logs',
|
||||
},
|
||||
["title"] = 'CRAFTING',
|
||||
["description"] = '**Action:** '..category..'\n**Item:** '..item..'\n**Amount:** '..amount..'\n\n**ID:** '..data.playerid..'\n**Identifier:** '..identifier..'\n**Discord:** '..discord,
|
||||
["footer"] = {
|
||||
["text"] = os.date(Config.DateFormat),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PerformHttpRequest(Webhook, function(err, text, headers) end, 'POST', json.encode({username = Config.BotName, embeds = information}), {['Content-Type'] = 'application/json'})
|
||||
end
|
Loading…
Add table
Add a link
Reference in a new issue