Verschoben von Tools nach Test okokcrafting

This commit is contained in:
Dennis 2025-06-15 02:40:20 +02:00
parent a29350c85f
commit 504fb3f859
19 changed files with 3254 additions and 3254 deletions

View 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