1
0
Fork 0
forked from Simnation/Main
This commit is contained in:
Nordi98 2025-07-09 20:17:42 +02:00
parent 369af59fc9
commit 664fa04d1a
40 changed files with 0 additions and 7379 deletions

Binary file not shown.

View file

@ -1,7 +0,0 @@
Hi, thank you for buying okokCrafting! :)
If you need help contact me on discord: okok#3488
Discord server: https://discord.gg/okok
Docs: https://docs.okokscripts.io/
-> Installation Guide: https://docs.okokscripts.io/scripts/okokcrafting

View file

@ -1,249 +0,0 @@
QBCore = exports[Config.qbPrefix.."-core"]:GetCoreObject()
RegisterNetEvent(Config.EventPrefix..":notification")
AddEventHandler(Config.EventPrefix..":notification", function(title, text, time, type)
exports['okokNotify']:Alert(title, text, time, type)
end)
RegisterNetEvent(Config.EventPrefix..":openTextUI")
AddEventHandler(Config.EventPrefix..":openTextUI", function(text)
exports['qb-core']:DrawText(text, 'left')
end)
RegisterNetEvent(Config.EventPrefix..":closeTextUI")
AddEventHandler(Config.EventPrefix..":closeTextUI", function()
exports['qb-core']:HideText()
end)
function onOpenMenu()
-- Executed when the menu is opened
end
function onCloseMenu()
-- Executed when the menu is closed
end
function claimAll(workbench, CraftQueues)
TriggerServerEvent(Config.EventPrefix..':claimAll', workbench, CraftQueues)
end
Citizen.CreateThread(function()
if Config.UseXP then
if Config.SameLevelForAllTables then
TriggerEvent('chat:addSuggestion', '/'..Config.SetXPCommand, _L('suggestion_xp').maintext, {
{ name=_L('suggestion_xp').id, help=_L('suggestion_xp').idtext },
{ name=_L('suggestion_xp').xp, help=_L('suggestion_xp').xptext },
})
TriggerEvent('chat:addSuggestion', '/'..Config.SetLevelCommand, _L('suggestion_level').maintext, {
{ name=_L('suggestion_level').id, help=_L('suggestion_level').idtext },
{ name=_L('suggestion_level').level, help=_L('suggestion_level').leveltext },
})
else
TriggerEvent('chat:addSuggestion', '/'..Config.SetXPCommand, _L('suggestion_xp').maintext, {
{ name=_L('suggestion_xp').id, help=_L('suggestion_xp').idtext },
{ name=_L('suggestion_xp').xp, help=_L('suggestion_xp').xptext },
{ name=_L('suggestion_xp').workbench, help=_L('suggestion_xp').workbenchtext },
})
TriggerEvent('chat:addSuggestion', '/'..Config.SetLevelCommand, _L('suggestion_level').maintext, {
{ name=_L('suggestion_level').id, help=_L('suggestion_level').idtext },
{ name=_L('suggestion_level').level, help=_L('suggestion_level').leveltext },
{ name=_L('suggestion_level').workbench, help=_L('suggestion_level').workbenchtext },
})
end
end
end)
Citizen.CreateThread(function()
while PlayerData == nil do
PlayerData = QBCore.Functions.GetPlayerData()
Citizen.Wait(10)
end
while PlayerData.job == nil do
PlayerData.job = QBCore.Functions.GetPlayerData().job
Citizen.Wait(10)
end
while PlayerData.gang == nil do
PlayerData.gang = QBCore.Functions.GetPlayerData().gang
Citizen.Wait(10)
end
local inZone = false
local num = 0
local nearZone = false
local enteredRange = false
local inWideRange = false
local ped = PlayerPedId()
while true do
Citizen.Wait(0)
local playerExists = false
if not playerExists then
if DoesEntityExist(ped) then
playerExists = true
else
ped = PlayerPedId()
end
end
local playerCoords = GetEntityCoords(ped)
nearZone = false
inZone = false
for k,v in pairs(Config.Crafting) do
if v.jobs['all'] ~= nil or checkJob(v.jobs) or checkGang(v.jobs) then
local distance = #(vector3(v.coordinates[1], v.coordinates[2], v.coordinates[3]) - playerCoords)
if distance < Config.CraftRadius then
if closeWorkbench ~= v.tableID then
closeWorkbench = v.tableID
workbenchCoords = v.coordinates
end
if not gotQueue then
gotQueue = true
QBCore.Functions.TriggerCallback(Config.EventPrefix..":getQueue", function(queue, queues)
CraftQueues = queues
WorkbenchCraft = queue
end, v.tableID)
end
end
if distance < v.radius + 2 then
local zDistance = playerCoords.z - v.coordinates[3]
nearZone = true
if waitMore and not isCraftOpen then
waitMore = false
end
if not Config.NotInterectableTables then
if distance < v.radius and zDistance < 3 and zDistance > -3 then
inZone = true
if IsControlJustReleased(0, Config.Key) and not IsEntityDead(ped) then
if GetVehiclePedIsUsing(ped) == 0 then
waitMore = true
if not isCraftOpen then
TriggerEvent(Config.EventPrefix..':openWorkbench', k)
end
else
TriggerEvent(Config.EventPrefix..':notification', _L('inside_vehicle').title, _L('inside_vehicle').text, _L('inside_vehicle').time, _L('inside_vehicle').type)
end
end
end
end
elseif not waitMore and not inWideRange then
waitMore = true
end
end
end
if nearZone and not enteredRange then
enteredRange = true
inWideRange = true
elseif not nearZone and enteredRange then
enteredRange = false
inWideRange = false
end
if inZone and not hasEntered then
if Config.UseOkokTextUI then
exports['okokTextUI']:Open(_L('textUI').text, _L('textUI').color, _L('textUI').side)
else
TriggerEvent(Config.EventPrefix..':openTextUI', _L('textUI').text)
end
hasEntered = true
elseif not inZone and hasEntered then
if Config.UseOkokTextUI then
exports['okokTextUI']:Close()
else
TriggerEvent(Config.EventPrefix..':closeTextUI')
end
hasEntered = false
end
if waitMore then
Citizen.Wait(1000)
end
end
end)
Citizen.CreateThread(function()
while true do
local canCraft = false
local queue = CraftQueues[closeWorkbench]
if CraftQueues[closeWorkbench] ~= nil and closeWorkbench ~= "" and workbenchCoords ~= nil then
local playerCoords = GetEntityCoords(PlayerPedId())
local distance = #(vector3(workbenchCoords[1], workbenchCoords[2], workbenchCoords[3]) - playerCoords)
local zDistance = playerCoords.z - workbenchCoords[3]
if distance < Config.CraftRadius then
local craftingItemID = 1
for k,v in ipairs(CraftQueues[closeWorkbench]) do
if v.time >= 0 and not v.isDone then
craftingItemID = k
canCraft = true
break
end
end
if canCraft then
if not updateTable then
updateTable = true
end
local craftTime = CraftQueues[closeWorkbench][craftingItemID].time
CraftQueues[closeWorkbench][craftingItemID].isPending = false
SendNUIMessage({
action = "ShowCraftCount",
time = CraftQueues[closeWorkbench][craftingItemID].time,
name = CraftQueues[closeWorkbench][craftingItemID].itemName,
})
if CraftQueues[closeWorkbench][craftingItemID].time <= 0 then
CraftQueues[closeWorkbench][craftingItemID].time = 0
CraftQueues[closeWorkbench][craftingItemID].isDone = true
local randomNum = math.random(1, 100)
if randomNum <= tonumber(CraftQueues[closeWorkbench][craftingItemID].sucPC) then
SendNUIMessage({
action = "CompleteCraftCount",
name = CraftQueues[closeWorkbench][craftingItemID].itemName,
})
else
CraftQueues[closeWorkbench][craftingItemID].suc = false
SendNUIMessage({
action = "FailedCraftCount",
name = CraftQueues[closeWorkbench][craftingItemID].itemName,
})
end
SendNUIMessage({
action = "updateCraftingItems",
queue = CraftQueues[closeWorkbench],
})
SendNUIMessage({
action = "HideCraftCount",
})
Citizen.Wait(500)
else
SendNUIMessage({
action = "updateCraftingItems",
queue = CraftQueues[closeWorkbench],
})
CraftQueues[closeWorkbench][craftingItemID].time = craftTime - 1
Citizen.Wait(1000)
end
else
if updateTable then
updateTable = false
QBCore.Functions.TriggerCallback(Config.EventPrefix..":updateQueue", function(cb)
end, CraftQueues)
end
Citizen.Wait(2000)
end
else
Citizen.Wait(3000)
end
else
Citizen.Wait(5000)
end
end
end)

View file

@ -1,595 +0,0 @@
Config, Locales = {}, {}
Config.Debug = false
Config.DoubleXP = false
Config.EventPrefix = 'okokCrafting'
Config.xpColumnsName = 'xp'
Config.craftQueryColumnName = 'okokcrafts'
Config.qbPrefix = 'qb'
Config.QBCorePrefix = 'QBCore'
Config.Locale = 'de' -- en / pt / gr / fr / de
Config.UseOkokTextUI = true
Config.Key = 38
Config.HideMinimap = true
Config.ShowBlips = true
Config.ShowFloorBlips = true
Config.ShowAllCrafts = true
Config.UseXP = false
Config.SameLevelForAllTables = false
Config.MaxLevel = 20
Config.StartXP = 0
Config.LevelMultiplier = 1.05
Config.GiveXPOnCraftFailed = true
Config.SetXPCommand = 'setcraftxp'
Config.SetLevelCommand = 'setcraftlevel'
Config.CraftRadius = 5
Config.MaxCraftsPerWorkbench = 10
Config.UseCategories = true
Config.InventoryDirectory = 'qs-inventory/html/images'
Config.UseOx_inventory = false
Config.NotInterectableTables = false
Config.AdminGroups = {
'god',
'admin',
'mod'
}
Config.itemNames = {
metalscrap = 'Metal Scrap',
weapon_assaultrifle = 'Assault Rifle',
iron = 'Iron',
bandage = 'Bandage',
firstaid = 'First Aid',
['10kgoldchain'] = '10kgoldchain',
plastic = 'Plastic',
aluminum = 'Aluminum',
cash = 'Money',
-- Zusätzliche Waffenkomponenten
shortened_gunbarrel = 'Verkuerzter Waffenlauf',
shaft = 'Schaft',
trigger_unit = 'Abzugseinheit',
revolver_barrel = 'Revolverlauf',
drum_mechanism = 'Trommelmechanismus',
weapon_handle = 'Griff',
pistol_barrel = 'Pistolenlauf',
weapon_sled = 'Schlitten (Upper Slide)',
gun_handle = 'Griffstueck',
ceramic_barrel = 'Keramiklauf',
small_triggersystem = 'Kleines Abzugssystem',
weapon_batton = 'Waffenlauf Lang',
--- Zubehör Nahkampfwaffen
dagger_blade = 'Dolchklinge',
machete_blade = 'Macheteklinge',
handle = 'Holzgriff',
switchblade_mechanism = 'Mechanismus für Springmesser',
small_blade = 'kleine Klinge',
axe_head = 'Axtkopf',
reinforced_handle = 'verstärkter Griff',
-- Drogenherstellung
opium_poppy = 'Schlafmohn',
opium = 'Opium',
acetic = 'Essiganhydrid',
injection = 'Spritze',
codeine_syrup = 'Codein-Sirup',
campers_fuel = 'Campers Fuel',
sweets_candies = 'Süßigkeiten',
ephedrin = 'Ephedrin',
chemical_set = 'Chemikalien-Set',
meth_pipe = 'Pipe',
magic_mushroom = 'Mutterkorn',
lysergic_acid = 'Lysergsäure',
blotter_paper = 'Blotterpapier',
---- Drogen
lsd_papers = 'LSD-Papes',
ready_methpipe = 'Meth Pipe',
lean = 'Lean',
heroin_injection = 'Heroin in Spritze',
-- Ausrüstung
armor = 'Weste',
-- Waffen
weapon_ceramicpistol = 'Ceramic Pistol',
weapon_navyrevolver = 'Navy Revolver',
weapon_pistol50 = 'Tropical Eagle',
weapon_assaultrifle = 'AK 75',
weapon_dbshotgun = 'Double-barrel Shotgun',
weapon_microsmg = 'Micro SMG',
weapon_minismg = 'Mini SMG',
weapon_bullpuprifle = 'QBX-92-3',
weapon_marksmanpistol = 'Marksman Pistol',
weapon_gusenberg = 'Gusenberg Sweeper',
-- Nahkampfwaffen
weapon_dagger = 'Dagger',
weapon_machete = 'Machete',
weapon_switchblade = 'Switchblade',
weapon_hatchet = 'Hatchet',
-- Ressourcen
gunpowder = 'Schwarzpulver',
armaid_plant = 'Aramid Fasern',
steel_ingots = 'Stahlbarren',
copper = 'Kupfer',
log = 'Holzscheit',
}
Config.Crafting = {
{
coordinates = vector3(-1802.27, 3089.12, 32.84),
radius = 1,
showMapBlip = false,
marker = {type = 20, r = 255, g = 165, b = 0, a = 155, bobUpAndDown = 0, faceCamera = 0, rotate = 1, textureDict = 0, textureName = 0, drawOnEnts = 0},
showBlipRadius = 50,
blip = {blipId = 402, blipColor = 7, blipScale = 0.9, blipText = 'Waffenkomponenten'},
tableName = 'Waffenkomponenten',
tableID = 'components1',
crafts = {
'shortened_gunbarrel',
'shaft',
'trigger_unit',
'revolver_barrel',
'drum_mechanism',
'weapon_handle',
'pistol_barrel',
'weapon_sled',
'gun_handle',
'ceramic_barrel',
'small_triggersystem',
'weapon_batton',
},
jobs = {['all'] = true},
},
{
coordinates = vector4(3092.46, -4713.06, 15.26, 37.66),
radius = 2,
showMapBlip = false,
marker = {type = 20, r = 0, g = 200, b = 255, a = 150, bobUpAndDown = 0, faceCamera = 0, rotate = 1, textureDict = 0, textureName = 0, drawOnEnts = 0},
showBlipRadius = 50,
blip = {blipId = 566, blipColor = 5, blipScale = 0.8, blipText = 'Waffenherstellung'},
tableName = 'Waffenherstellung',
tableID = 'weapon_crafting_1',
crafts = {
'weapon_ceramicpistol',
'weapon_navyrevolver',
'weapon_pistol50',
'weapon_assaultrifle',
'weapon_dbshotgun',
'weapon_microsmg',
'weapon_minismg',
'weapon_bullpuprifle',
'weapon_marksmanpistol',
'weapon_gusenberg',
},
jobs = {['all'] = true},
}
}
Config.Crafts = {
['shortened_gunbarrel'] = {
item = 'shortened_gunbarrel',
amount = 1,
maxCraft = 5,
successCraftPercentage = 100,
isItem = true,
isDisassemble = false,
time = 3,
levelNeeded = 0,
xpPerCraft = 10,
recipe = {
{ 'steel_ingots', 2, true, false }
},
job = { '' },
data = {},
category = 'Waffenkomponenten',
},
['shaft'] = {
item = 'shaft',
amount = 1,
maxCraft = 5,
successCraftPercentage = 100,
isItem = true,
isDisassemble = false,
time = 3,
levelNeeded = 0,
xpPerCraft = 10,
recipe = {
{ 'steel_ingots', 2, true, false }
},
job = { '' },
data = {},
category = 'Waffenkomponenten',
},
['trigger_unit'] = {
item = 'trigger_unit',
amount = 1,
maxCraft = 5,
successCraftPercentage = 100,
isItem = true,
isDisassemble = false,
time = 3,
levelNeeded = 0,
xpPerCraft = 10,
recipe = {
{ 'steel_ingots', 2, true, false }
},
job = { '' },
data = {},
category = 'Waffenkomponenten',
},
['revolver_barrel'] = {
item = 'revolver_barrel',
amount = 1,
maxCraft = 5,
successCraftPercentage = 100,
isItem = true,
isDisassemble = false,
time = 3,
levelNeeded = 0,
xpPerCraft = 10,
recipe = {
{ 'steel_ingots', 3, true, false }
},
job = { '' },
data = {},
category = 'Waffenkomponenten',
},
['drum_mechanism'] = {
item = 'drum_mechanism',
amount = 1,
maxCraft = 5,
successCraftPercentage = 100,
isItem = true,
isDisassemble = false,
time = 3,
levelNeeded = 0,
xpPerCraft = 10,
recipe = {
{ 'steel_ingots', 3, true, false }
},
job = { '' },
data = {},
category = 'Waffenkomponenten',
},
['weapon_handle'] = {
item = 'weapon_handle',
amount = 1,
maxCraft = 5,
successCraftPercentage = 100,
isItem = true,
isDisassemble = false,
time = 3,
levelNeeded = 0,
xpPerCraft = 10,
recipe = {
{ 'steel_ingots', 2, true, false }
},
job = { '' },
data = {},
category = 'Waffenkomponenten',
},
['pistol_barrel'] = {
item = 'pistol_barrel',
amount = 1,
maxCraft = 5,
successCraftPercentage = 100,
isItem = true,
isDisassemble = false,
time = 3,
levelNeeded = 0,
xpPerCraft = 10,
recipe = {
{ 'steel_ingots', 2, true, false }
},
job = { '' },
data = {},
category = 'Waffenkomponenten',
},
['weapon_sled'] = {
item = 'weapon_sled',
amount = 1,
maxCraft = 5,
successCraftPercentage = 100,
isItem = true,
isDisassemble = false,
time = 3,
levelNeeded = 0,
xpPerCraft = 10,
recipe = {
{ 'steel_ingots', 2, true, false }
},
job = { '' },
data = {},
category = 'Waffenkomponenten',
},
['gun_handle'] = {
item = 'gun_handle',
amount = 1,
maxCraft = 5,
successCraftPercentage = 100,
isItem = true,
isDisassemble = false,
time = 3,
levelNeeded = 0,
xpPerCraft = 10,
recipe = {
{ 'steel_ingots', 1, true, false }
},
job = { '' },
data = {},
category = 'Waffenkomponenten',
},
['ceramic_barrel'] = {
item = 'ceramic_barrel',
amount = 1,
maxCraft = 5,
successCraftPercentage = 100,
isItem = true,
isDisassemble = false,
time = 3,
levelNeeded = 0,
xpPerCraft = 10,
recipe = {
{ 'steel_ingots', 2, true, false }
},
job = { '' },
data = {},
category = 'Waffenkomponenten',
},
['small_triggersystem'] = {
item = 'small_triggersystem',
amount = 1,
maxCraft = 5,
successCraftPercentage = 100,
isItem = true,
isDisassemble = false,
time = 3,
levelNeeded = 0,
xpPerCraft = 10,
recipe = {
{ 'steel_ingots', 1, true, false }
},
job = { '' },
data = {},
category = 'Waffenkomponenten',
},
['weapon_batton'] = {
item = 'weapon_batton',
amount = 1,
maxCraft = 5,
successCraftPercentage = 100,
isItem = true,
isDisassemble = false,
time = 3,
levelNeeded = 0,
xpPerCraft = 10,
recipe = {
{ 'steel_ingots', 2, true, false }
},
job = { '' },
data = {},
category = 'Waffenkomponenten',
},
-- Neue Crafting-Rezepte für Waffenherstellung
['weapon_ceramicpistol'] = {
item = 'weapon_ceramicpistol',
amount = 1,
successCraftPercentage = 100,
time = 5,
levelNeeded = 1,
xpPerCraft = 20,
recipe = {
{ 'ceramic_barrel', 1, true, false },
{ 'gun_handle', 1, true, false },
{ 'small_triggersystem', 1, true, false },
{ 'shaft', 1, true, false },
{ 'pistol_barrel', 1, true, false }
},
job = { '' },
data = {},
category = 'Waffenherstellung',
},
['weapon_navyrevolver'] = {
item = 'weapon_navyrevolver',
amount = 1,
successCraftPercentage = 100,
time = 5,
levelNeeded = 1,
xpPerCraft = 20,
recipe = {
{ 'weapon_handle', 1, true, false },
{ 'revolver_barrel', 1, true, false },
{ 'small_triggersystem', 1, true, false },
{ 'drum_mechanism', 1, true, false },
{ 'shaft', 1, true, false }
},
job = { '' },
data = {},
category = 'Waffenherstellung',
},
['weapon_pistol50'] = {
item = 'weapon_pistol50',
amount = 1,
successCraftPercentage = 100,
time = 5,
levelNeeded = 1,
xpPerCraft = 20,
recipe = {
{ 'shaft', 1, true, false },
{ 'small_triggersystem', 1, true, false },
{ 'gun_handle', 1, true, false },
{ 'pistol_barrel', 1, true, false },
{ 'weapon_sled', 1, true, false }
},
job = { '' },
data = {},
category = 'Waffenherstellung',
},
['weapon_assaultrifle'] = {
item = 'weapon_assaultrifle',
amount = 1,
successCraftPercentage = 100,
time = 5,
levelNeeded = 2,
xpPerCraft = 30,
recipe = {
{ 'gun_handle', 1, true, false },
{ 'trigger_unit', 1, true, false },
{ 'weapon_batton', 1, true, false },
{ 'shaft', 1, true, false }
},
job = { '' },
data = {},
category = 'Waffenherstellung',
},
['weapon_dbshotgun'] = {
item = 'weapon_dbshotgun',
amount = 1,
successCraftPercentage = 100,
time = 5,
levelNeeded = 2,
xpPerCraft = 30,
recipe = {
{ 'shortened_gunbarrel', 2, true, false },
{ 'shaft', 1, true, false },
{ 'trigger_unit', 1, true, false },
{ 'gun_handle', 1, true, false }
},
job = { '' },
data = {},
category = 'Waffenherstellung',
},
['weapon_microsmg'] = {
item = 'weapon_microsmg',
amount = 1,
successCraftPercentage = 100,
time = 5,
levelNeeded = 2,
xpPerCraft = 30,
recipe = {
{ 'shaft', 1, true, false },
{ 'trigger_unit', 1, true, false },
{ 'gun_handle', 1, true, false },
{ 'pistol_barrel', 1, true, false },
{ 'weapon_sled', 1, true, false }
},
job = { '' },
data = {},
category = 'Waffenherstellung',
},
['weapon_minismg'] = {
item = 'weapon_minismg',
amount = 1,
successCraftPercentage = 100,
time = 5,
levelNeeded = 2,
xpPerCraft = 30,
recipe = {
{ 'shaft', 1, true, false },
{ 'trigger_unit', 1, true, false },
{ 'gun_handle', 1, true, false },
{ 'pistol_barrel', 1, true, false },
{ 'weapon_sled', 1, true, false }
},
job = { '' },
data = {},
category = 'Waffenherstellung',
},
['weapon_bullpuprifle'] = {
item = 'weapon_bullpuprifle',
amount = 1,
successCraftPercentage = 100,
time = 5,
levelNeeded = 3,
xpPerCraft = 40,
recipe = {
{ 'gun_handle', 1, true, false },
{ 'trigger_unit', 1, true, false },
{ 'weapon_batton', 1, true, false },
{ 'shaft', 1, true, false }
},
job = { '' },
data = {},
category = 'Waffenherstellung',
},
['weapon_marksmanpistol'] = {
item = 'weapon_marksmanpistol',
amount = 1,
successCraftPercentage = 100,
time = 5,
levelNeeded = 1,
xpPerCraft = 20,
recipe = {
{ 'shaft', 1, true, false },
{ 'small_triggersystem', 1, true, false },
{ 'gun_handle', 1, true, false },
{ 'pistol_barrel', 1, true, false },
{ 'weapon_sled', 1, true, false }
},
job = { '' },
data = {},
category = 'Waffenherstellung',
},
['weapon_gusenberg'] = {
item = 'weapon_gusenberg',
amount = 1,
successCraftPercentage = 100,
time = 5,
levelNeeded = 3,
xpPerCraft = 40,
recipe = {
{ 'gun_handle', 1, true, false },
{ 'trigger_unit', 1, true, false },
{ 'weapon_batton', 1, true, false },
{ 'shaft', 1, true, false }
},
job = { '' },
data = {},
category = 'Waffenherstellung',
},
}
-------------------------- DISCORD LOGS
-- To set your Discord Webhook URL go to server.lua, line 3
Config.BotName = 'ServerName' -- Write the desired bot name
Config.ServerName = 'ServerName' -- Write your server's name
Config.IconURL = '' -- Insert your desired image link
Config.DateFormat = '%d/%m/%Y [%X]' -- To change the date format check this website - https://www.lua.org/pil/22.1.html
-- To change a webhook color you need to set the decimal value of a color, you can use this website to do that - https://www.mathsisfun.com/hexadecimal-decimal-colors.html
Config.StartCraftWebhookColor = '16127'
Config.CancelWebhookColor = '16776960'
Config.ClaimCraftWebhookColor = '65352'
Config.FailedCraftWebhookColor = '16711680'
-------------------------- LOCALES (DON'T TOUCH)
function _L(id)
if Locales[Config.Locale][id] then
return Locales[Config.Locale][id]
else
print('Locale '..id..' doesn\'t exist')
end
end
--

View file

@ -1,42 +0,0 @@
fx_version 'cerulean'
game 'gta5'
author 'okok#3488'
description 'okokCrafting'
version '1.1.0'
ui_page 'web/ui.html'
files {
'web/*.*',
}
shared_script 'config.lua'
client_scripts {
'locales/*.lua',
'cl_utils.lua',
'client.lua',
}
server_scripts {
'@oxmysql/lib/MySQL.lua',
'locales/*.lua',
'sv_utils.lua',
'server.lua'
}
lua54 'yes'
escrow_ignore {
'config.lua',
'cl_utils.lua',
'sv_utils.lua',
'locales/*.lua',
}
server_exports {
'SetLevel'
}
dependency '/assetpacks'

View file

@ -1,133 +0,0 @@
Locales['de'] = {
-- Notifications
['user_xp_set'] = {
title = 'WERKBANK',
text = 'Deine Erfahrungspunkte wurden auf ${s1} gesetzt',
time = 5000,
type = 'info'
},
['admin_xp_set'] = {
title = 'WERKBANK',
text = 'Du hast erfolgreich die Erfahrungspunkte von ${s1} zu ${s2} geändert',
time = 5000,
type = 'success'
},
['user_xp_set_workbench'] = {
title = 'WERKBANK',
text = 'Deine Erfahrungspunkte wurden in der Werkbank ${s2} auf ${s1} gesetzt',
time = 5000,
type = 'info'
},
['admin_xp_set_workbench'] = {
title = 'WERKBANK',
text = 'Du hast erfolgreich die Erfahrungspunkte von ${s1}, in der Werkbank ${s3}, auf ${s2} gesetzt',
time = 5000,
type = 'success'
},
['user_level_set'] = {
title = 'WERKBANK',
text = 'Dein Level wurde auf ${s1} geändert',
time = 5000,
type = 'info'
},
['admin_level_set'] = {
title = 'WERKBANK',
text = 'Du hast erfolgreich das Level von ${s1} auf ${s2} geändert',
time = 5000,
type = 'success'
},
['user_level_set_workbench'] = {
title = 'WERKBANK',
text = 'Dein Level wurde in der Werkbank ${s2} auf ${s1} geändert',
time = 5000,
type = 'info'
},
['admin_level_set_workbench'] = {
title = 'WERKBANK',
text = 'Du hast erfolgreich das Level von ${s1}, in der Werkbank ${s3}, auf ${s2} geändert',
time = 5000,
type = 'success'
},
['admin_level_no_exist'] = {
title = 'WERKBANK',
text = 'Dieses Level existiert nicht',
time = 5000,
type = 'error'
},
['cant_carry'] = {
title = 'WERKBANK',
text = "Du kannst diesen Gegenstand nicht bei dir tragen",
time = 5000,
type = 'error'
},
['added_to_queue'] = {
title = 'WERKBANK',
text = '${s1} wurde zur Warteschlange hinzugefügt',
time = 5000,
type = 'success'
},
['cant_craft'] = {
title = 'WERKBANK',
text = "Du kannst ${s1} nicht herstellen",
time = 5000,
type = 'error'
},
['inside_vehicle'] = {
title = 'WERKBANK',
text = "Du kannst nichts in einem Fahrzeug herstellen",
time = 5000,
type = 'error'
},
['queue_limit'] = {
title = 'WERKBANK',
text = 'Die Warteschlange ist bereits voll',
time = 5000,
type = 'error'
},
['claimed_item'] = {
title = 'WERKBANK',
text = 'Du hast ${s1} bekommen',
time = 5000,
type = 'success'
},
['claimed_all_items'] = {
title = 'WERKBANK',
text = 'Du hast alle Gegenstände bekommen',
time = 5000,
type = 'success'
},
['cancel_item'] = {
title = 'WERKBANK',
text = 'Du hast die Herstellung von ${s1} abgebrochen',
time = 5000,
type = 'error'
},
-- Chat suggestions
['suggestion_xp'] = {
maintext = 'Ändere das XP eines Spieler',
id = 'ID',
idtext = "Ziel ID",
xp = 'XP',
xptext = 'XP menge',
workbench = 'Werkbank',
workbenchtext = "ID der Werkbank",
},
['suggestion_level'] = {
maintext = 'Ändere das Level eines Spielers',
id = 'ID',
idtext = "Ziel ID",
level = 'Level',
leveltext = 'Level',
workbench = 'Werkbank',
workbenchtext = "ID der Werkbank",
},
-- okokTextUI
['textUI'] = {
text = '[E] Werkbank zu öffnen',
color = 'darkblue',
side = 'left'
},
}

View file

@ -1,133 +0,0 @@
Locales['en'] = {
-- Notifications
['user_xp_set'] = {
title = 'CRAFTING',
text = 'Your XP was set to ${s1}',
time = 5000,
type = 'info'
},
['admin_xp_set'] = {
title = 'CRAFTING',
text = 'You set the XP of ${s1} to ${s2} successfully',
time = 5000,
type = 'success'
},
['user_xp_set_workbench'] = {
title = 'CRAFTING',
text = 'Your XP was set to ${s1} in ${s2}',
time = 5000,
type = 'info'
},
['admin_xp_set_workbench'] = {
title = 'CRAFTING',
text = 'You set the XP of ${s1} to ${s2} in ${s3} successfully',
time = 5000,
type = 'success'
},
['user_level_set'] = {
title = 'CRAFTING',
text = 'Your level was set to ${s1}',
time = 5000,
type = 'info'
},
['admin_level_set'] = {
title = 'CRAFTING',
text = 'You set the level of ${s1} to ${s2} successfully',
time = 5000,
type = 'success'
},
['user_level_set_workbench'] = {
title = 'CRAFTING',
text = 'Your level was set to ${s1} in ${s2}',
time = 5000,
type = 'info'
},
['admin_level_set_workbench'] = {
title = 'CRAFTING',
text = 'You set the level of ${s1} to ${s2} in ${s3} successfully',
time = 5000,
type = 'success'
},
['admin_level_no_exist'] = {
title = 'CRAFTING',
text = 'That level does not exist',
time = 5000,
type = 'error'
},
['cant_carry'] = {
title = 'CRAFTING',
text = "You can't carry this item",
time = 5000,
type = 'error'
},
['added_to_queue'] = {
title = 'CRAFTING',
text = '${s1} added to the crafting queue',
time = 5000,
type = 'success'
},
['cant_craft'] = {
title = 'CRAFTING',
text = "You can't craft ${s1}",
time = 5000,
type = 'error'
},
['inside_vehicle'] = {
title = 'CRAFTING',
text = "You can't craft inside a vehicle",
time = 5000,
type = 'error'
},
['queue_limit'] = {
title = 'CRAFTING',
text = 'You have reached the queue limit',
time = 5000,
type = 'error'
},
['claimed_item'] = {
title = 'CRAFTING',
text = 'You have claimed ${s1}',
time = 5000,
type = 'success'
},
['claimed_all_items'] = {
title = 'CRAFTING',
text = 'You have claimed all items',
time = 5000,
type = 'success'
},
['cancel_item'] = {
title = 'CRAFTING',
text = 'You canceled a crafting of ${s1}',
time = 5000,
type = 'error'
},
-- Chat suggestions
['suggestion_xp'] = {
maintext = 'Set a players crafting XP',
id = 'id',
idtext = "Target's id",
xp = 'XP',
xptext = 'XP amount',
workbench = 'workbench',
workbenchtext = "Workbenche's id",
},
['suggestion_level'] = {
maintext = 'Set a players crafting Level',
id = 'id',
idtext = "Target's id",
level = 'Level',
leveltext = 'Level',
workbench = 'workbench',
workbenchtext = "Workbenche's id",
},
-- okokTextUI
['textUI'] = {
text = '[E] Open crafting table',
color = 'darkblue',
side = 'left'
},
}

View file

@ -1,133 +0,0 @@
Locales['fr'] = {
-- Notifications
['user_xp_set'] = {
title = 'CRAFTING',
text = 'Votre XP a été défini sur ${s1}',
time = 5000,
type = 'info'
},
['admin_xp_set'] = {
title = 'CRAFTING',
text = 'Vous avez défini XP de ${s1} sur ${s2} avec succès',
time = 5000,
type = 'success'
},
['user_xp_set_workbench'] = {
title = 'CRAFTING',
text = 'Votre XP a été défini de ${s1} en ${s2}',
time = 5000,
type = 'info'
},
['admin_xp_set_workbench'] = {
title = 'CRAFTING',
text = 'Vous avez défini XP de ${s1} sur ${s2} en ${s3} avec succès',
time = 5000,
type = 'success'
},
['user_level_set'] = {
title = 'CRAFTING',
text = 'Votre niveau a été défini sur ${s1}',
time = 5000,
type = 'info'
},
['admin_level_set'] = {
title = 'CRAFTING',
text = 'Vous avez défini le niveau de ${s1} sur ${s2} avec succès',
time = 5000,
type = 'success'
},
['user_level_set_workbench'] = {
title = 'CRAFTING',
text = 'Votre niveau a été défini sur ${s1} en ${s2}',
time = 5000,
type = 'info'
},
['admin_level_set_workbench'] = {
title = 'CRAFTING',
text = 'Vous avez défini le niveau de ${s1} sur ${s2} en ${s3} avec succès',
time = 5000,
type = 'success'
},
['admin_level_no_exist'] = {
title = 'CRAFTING',
text = 'Ce niveau n\'existe pas',
time = 5000,
type = 'error'
},
['cant_carry'] = {
title = 'CRAFTING',
text = "Cet objet est trop lourd ! Impossible de le porter",
time = 5000,
type = 'error'
},
['added_to_queue'] = {
title = 'CRAFTING',
text = '${s1} ajouté à la file de fabrication',
time = 5000,
type = 'success'
},
['cant_craft'] = {
title = 'CRAFTING',
text = "Vous ne pouvez pas fabriquer ${s1}",
time = 5000,
type = 'error'
},
['inside_vehicle'] = {
title = 'CRAFTING',
text = "Vous ne pouvez pas fabriquer à l\'intérieur d'un véhicule",
time = 5000,
type = 'error'
},
['queue_limit'] = {
title = 'CRAFTING',
text = 'Vous avez atteint la limite de la file de fabrication',
time = 5000,
type = 'error'
},
['claimed_item'] = {
title = 'CRAFTING',
text = 'Vous avez reçu ${s1}',
time = 5000,
type = 'success'
},
['claimed_all_items'] = {
title = 'CRAFTING',
text = 'Vous avez tout reçu',
time = 5000,
type = 'success'
},
['cancel_item'] = {
title = 'CRAFTING',
text = 'Vous avez annulé la fabrication de ${s1}',
time = 5000,
type = 'error'
},
-- Chat suggestions
['suggestion_xp'] = {
maintext = 'Définissez un joueur fabriquant de l\'XP',
id = 'id',
idtext = "ID de la cible",
xp = 'XP',
xptext = 'Montant d\'XP',
workbench = 'workbench',
workbenchtext = "ID des établis",
},
['suggestion_level'] = {
maintext = 'Définissez le niveau de craft des joueurs',
id = 'id',
idtext = "ID de la cible",
level = 'Level',
leveltext = 'Niveau',
workbench = 'workbench',
workbenchtext = "ID des établis",
},
-- okokTextUI
['textUI'] = {
text = '[E] Ouvrir l\'établi',
color = 'darkblue',
side = 'left'
},
}

View file

@ -1,133 +0,0 @@
Locales['gr'] = {
-- Notifications
['user_xp_set'] = {
title = 'ΚΑΤΑΣΚΕΥΗ',
text = 'Το XP σας ορίστηκε σε ${s1}',
time = 5000,
type = 'info'
},
['admin_xp_set'] = {
title = 'ΚΑΤΑΣΚΕΥΗ',
text = 'Ρυθμίζετε το XP του ${s1} σε ${s2} με επιτυχία',
time = 5000,
type = 'success'
},
['user_xp_set_workbench'] = {
title = 'ΚΑΤΑΣΚΕΥΗ',
text = 'Το XP σας ορίστηκε σε ${s1} σε ${s2}',
time = 5000,
type = 'info'
},
['admin_xp_set_workbench'] = {
title = 'ΚΑΤΑΣΚΕΥΗ',
text = 'Ρυθμίζετε το XP του ${s1} προς ${s2} σε ${s3} με επιτυχία',
time = 5000,
type = 'success'
},
['user_level_set'] = {
title = 'ΚΑΤΑΣΚΕΥΗ',
text = 'Το επίπεδό σας ορίστηκε σε ${s1}',
time = 5000,
type = 'info'
},
['admin_level_set'] = {
title = 'ΚΑΤΑΣΚΕΥΗ',
text = 'Ρυθμίσετε το επίπεδο του ${s1} προς ${s2} με επιτυχία',
time = 5000,
type = 'success'
},
['user_level_set_workbench'] = {
title = 'ΚΑΤΑΣΚΕΥΗ',
text = 'Το επίπεδό σας ορίστηκε σε ${s1} in ${s2}',
time = 5000,
type = 'info'
},
['admin_level_set_workbench'] = {
title = 'ΚΑΤΑΣΚΕΥΗ',
text = 'Ρυθμίσετε το επίπεδο του ${s1} προς ${s2} σε ${s3} με επιτυχία',
time = 5000,
type = 'success'
},
['admin_level_no_exist'] = {
title = 'ΚΑΤΑΣΚΕΥΗ',
text = 'Αυτό το επίπεδο δεν υπάρχει',
time = 5000,
type = 'error'
},
['cant_carry'] = {
title = 'ΚΑΤΑΣΚΕΥΗ',
text = "Δεν μπορείτε να μεταφέρετε αυτό το αντικείμενο",
time = 5000,
type = 'error'
},
['added_to_queue'] = {
title = 'ΚΑΤΑΣΚΕΥΗ',
text = '${s1} προστέθηκε στην ουρά χειροτεχνίας',
time = 5000,
type = 'success'
},
['cant_craft'] = {
title = 'ΚΑΤΑΣΚΕΥΗ',
text = "Δεν μπορείς να χειροτεχνήσεις ${s1}",
time = 5000,
type = 'error'
},
['inside_vehicle'] = {
title = 'ΚΑΤΑΣΚΕΥΗ',
text = "Δεν μπορείτε να κάνετε χειροτεχνία μέσα σε ένα όχημα",
time = 5000,
type = 'error'
},
['queue_limit'] = {
title = 'ΚΑΤΑΣΚΕΥΗ',
text = 'Έχετε φτάσει το όριο της ουράς',
time = 5000,
type = 'error'
},
['claimed_item'] = {
title = 'ΚΑΤΑΣΚΕΥΗ',
text = 'Έχετε διεκδικήσει ${s1}',
time = 5000,
type = 'success'
},
['claimed_all_items'] = {
title = 'ΚΑΤΑΣΚΕΥΗ',
text = 'Έχετε διεκδικήσει όλα τα στοιχεία',
time = 5000,
type = 'success'
},
['cancel_item'] = {
title = 'ΚΑΤΑΣΚΕΥΗ',
text = 'Ακυρώσατε μια δημιουργία του ${s1}',
time = 5000,
type = 'error'
},
-- Chat suggestions
['suggestion_xp'] = {
maintext = 'Ρυθμίσετε το επίπεδο του παίκτη',
id = 'ταυτότητα',
idtext = "Ταυτότητα στόχου",
xp = 'XP',
xptext = 'XP ποσό',
workbench = 'πάγκος εργασίας',
workbenchtext = "Ταυτότητα πάγκων εργασίας",
},
['suggestion_level'] = {
maintext = 'Ρυθμίσετε το επίπεδο του παίκτη',
id = 'ταυτότητα',
idtext = "Ταυτότητα στόχου",
level = 'Επίπεδο',
leveltext = 'Επίπεδο',
workbench = 'πάγκος εργασίας',
workbenchtext = "Ταυτότητα πάγκων εργασίας",
},
-- okokTextUI
['textUI'] = {
text = '[E] Να ανοίξω το τραπέζι χειροτεχνίας',
color = 'darkblue',
side = 'left'
},
}

View file

@ -1,133 +0,0 @@
Locales['pt'] = {
-- Notifications
['user_xp_set'] = {
title = 'CRAFTING',
text = 'A tua XP foi alterada para ${s1}',
time = 5000,
type = 'info'
},
['admin_xp_set'] = {
title = 'CRAFTING',
text = 'Alteraste a XP de ${s1} para ${s2} com sucesso',
time = 5000,
type = 'success'
},
['user_xp_set_workbench'] = {
title = 'CRAFTING',
text = 'A tua XP foi alterada para ${s1} em ${s2}',
time = 5000,
type = 'info'
},
['admin_xp_set_workbench'] = {
title = 'CRAFTING',
text = 'Alteraste a XP de ${s1} para ${s2} em ${s3} com sucesso',
time = 5000,
type = 'success'
},
['user_level_set'] = {
title = 'CRAFTING',
text = 'O teu nível foi alterado para ${s1}',
time = 5000,
type = 'info'
},
['admin_level_set'] = {
title = 'CRAFTING',
text = 'Alteraste o nível de ${s1} em ${s2} com sucesso',
time = 5000,
type = 'success'
},
['user_level_set_workbench'] = {
title = 'CRAFTING',
text = 'O teu nível foi alterado para ${s1} em ${s2}',
time = 5000,
type = 'info'
},
['admin_level_set_workbench'] = {
title = 'CRAFTING',
text = 'Alteraste o nível de ${s1} para ${s2} em ${s3} com sucesso',
time = 5000,
type = 'success'
},
['admin_level_no_exist'] = {
title = 'CRAFTING',
text = 'Esse nível não existe',
time = 5000,
type = 'error'
},
['cant_carry'] = {
title = 'CRAFTING',
text = "Não tens espaço suficiente para carregar o item",
time = 5000,
type = 'error'
},
['added_to_queue'] = {
title = 'CRAFTING',
text = '${s1} foi adicionado à queue',
time = 5000,
type = 'success'
},
['cant_craft'] = {
title = 'CRAFTING',
text = "Não podes craftar ${s1}",
time = 5000,
type = 'error'
},
['inside_vehicle'] = {
title = 'CRAFTING',
text = "Não podes craftar dentro de um veículo",
time = 5000,
type = 'error'
},
['queue_limit'] = {
title = 'CRAFTING',
text = 'Atingiste o limite da queue',
time = 5000,
type = 'error'
},
['claimed_item'] = {
title = 'CRAFTING',
text = 'Resgataste ${s1}',
time = 5000,
type = 'success'
},
['claimed_all_items'] = {
title = 'CRAFTING',
text = 'Regataste todos os itens',
time = 5000,
type = 'success'
},
['cancel_item'] = {
title = 'CRAFTING',
text = 'Cancelaste o craft de ${s1}',
time = 5000,
type = 'error'
},
-- Chat suggestions
['suggestion_xp'] = {
maintext = 'Define o XP de craft de um jogador',
id = 'id',
idtext = "ID do jogador",
xp = 'XP',
xptext = 'Quantidade de XP',
workbench = 'workbench',
workbenchtext = "ID da workbench",
},
['suggestion_level'] = {
maintext = 'Define o nível de craft de um jogador',
id = 'id',
idtext = "ID do jogador",
level = 'Nível',
leveltext = 'Nível',
workbench = 'workbench',
workbenchtext = "ID da workbench",
},
-- okokTextUI
['textUI'] = {
text = '[E] Abrir crafting table',
color = 'darkblue',
side = 'left'
},
}

View file

@ -1,2 +0,0 @@
ALTER TABLE players ADD COLUMN xp LONGTEXT NULL;
ALTER TABLE players ADD COLUMN okokcrafts LONGTEXT NULL;

View file

@ -1,590 +0,0 @@
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

View file

@ -1,998 +0,0 @@
function addStr(str, index, stringToAdd){
return str.substring(0, index) + stringToAdd + str.substring(index, str.length);
}
var isTimerOn = false;
var lastTime;
var categories = [];
var selectedCategory = "general_cat";
var craft2;
var job2;
var gang;
var craftData;
var sideCraftMenu;
var itemClaiming = 0;
var CraftQueue = [];
var maxCraft = 10;
var canCraftItem = true;
var showAllCrafts = false;
var canClaimAll = true;
var canClaimItem = true;
var canOpenSideCraft = true;
let Inventory = '';
window.addEventListener('message', function(event) {
switch (event.data.action) {
case 'openCraft':
selectedCategory = "general_cat";
canOpenSideCraft = true;
canClaimItem = true;
itemClaiming = 0;
showAllCrafts = event.data.showAllCrafts;
Inventory = event.data.inventory;
var queue = event.data.queue;
craftData = event.data;
categories = event.data.categories;
var craft = event.data.craft;
craft2 = craft;
var num = craft.length;
var paragraph = '';
var row = '<div class="row">';
var lastRowNum = 0;
var job = event.data.job;
job2 = event.data.job;
gang = event.data.gang;
var added = 0;
var useCategories = event.data.useCategories;
var categoriesButtonsHTML = `
<input type="radio" class="btn-check cat_tab" name="category" value="general_cat" id="general_cat" checked>
<label class="btn btn-category first-category" for="general_cat">General</label>
`;
document.querySelector('#claimall-button').disabled = false;
if(useCategories){
for(let i = 0; i < categories.length; i++){
categoriesButtonsHTML += `
<input type="radio" class="btn-check cat_tab" name="category" value="${categories[i]}" id="${categories[i]}">
<label class="btn btn-category last-category" for="${categories[i]}">${categories[i]}</label>
`;
}
$('#categories_btns').html(categoriesButtonsHTML);
$('#categories_box').show();
} else {
$('#categories_box').hide();
}
if(num >= 13){
$('.itemslist_window').css('padding', '0.3125rem 0.55rem 0.3125rem 0.625rem');
} else {
$('.itemslist_window').css('padding', '0.3125rem 1.05rem 0.3125rem 0.625rem');
}
for(var i = 0; i < num; i++) {
for(var i1 = 0; i1 < craft[i].job.length; i1++){
if(selectedCategory == "general_cat" || craft[i].category == selectedCategory){
if(craft[i].job[i1] == job || craft[i].job[i1] == gang || craft[i].job[i1] == ''){
if(!event.data.UseXP){
var itemName = event.data.itemNames;
var itemId = craft[i].item;
var index = i;
added++
row += `
<div class="col-md-3">
<div class="card item_card" id="${itemId}wb_${event.data.wb}wb_${index}">
<div class="card-body item_card-body d-flex justify-content-center align-items-center" style="background-color: rgba(220, 220, 220, 0.20)" id="selected${itemId}wb_${event.data.wb}wb_${index}">
<span class="item-title text-center">${itemName[itemId]}</span>
<img src="nui://${Inventory}/${itemId}.png" class="image">
</div>
</div>
</div>
`;
var myEle = document.getElementById(itemId+"wb_"+event.data.wb+"wb_"+index);
if(!myEle) {
$(document).on('click', "#"+itemId+"wb_"+event.data.wb+"wb_"+index, function() {
if(canOpenSideCraft) {
canOpenSideCraft = false;
allID = this.id;
id = allID.substring(0, allID.indexOf('wb_'));
index2 = allID.split("wb_");
$('.item_card-body').css('background-color', 'rgba(220, 220, 220, 0.20)');
$('#selected'+this.id).css('background-color', 'rgba(31, 94, 255, 1)');
var sound = new Audio('click.mp3');
sound.volume = 0.3;
sound.play();
$.post('https://okokCrafting/action', JSON.stringify({
action: "craft",
item: id,
crafts: craft,
itemName: itemName,
index: index2[2],
}));
}
});
}
if ((added) % 4 === 0) {
row = addStr(row, row.length, `</div><div class="row itemslist_row-h">`);
lastRowNum = row.length+6;
}
} else {
if(craft[i].levelNeeded <= event.data.level || showAllCrafts){
var itemName = event.data.itemNames;
var itemId = craft[i].item;
var index = i;
added++
row += `
<div class="col-md-3">
<div class="card item_card" id="${itemId}wb_${event.data.wb}wb_${index}">
<div class="card-body item_card-body d-flex justify-content-center align-items-center" style="background-color: rgba(220, 220, 220, 0.20)" id="selected${itemId}wb_${event.data.wb}wb_${index}">
<span class="item-title text-center">${itemName[itemId]}</span>
<img src="nui://${Inventory}/${itemId}.png" class="image">
</div>
</div>
</div>
`;
var myEle = document.getElementById(itemId+"wb_"+event.data.wb+"wb_"+index);
if(!myEle) {
$(document).on('click', "#"+itemId+"wb_"+event.data.wb+"wb_"+index, function() {
if(canOpenSideCraft) {
canOpenSideCraft = false;
allID = this.id;
id = allID.substring(0, allID.indexOf('wb_'));
index2 = allID.split("wb_");
$('.item_card-body').css('background-color', 'rgba(220, 220, 220, 0.20)');
$('#selected'+this.id).css('background-color', 'rgba(31, 94, 255, 1)');
var sound = new Audio('click.mp3');
sound.volume = 0.3;
sound.play();
$.post('https://okokCrafting/action', JSON.stringify({
action: "craft",
item: id,
crafts: craft,
itemName: itemName,
index: index2[2],
level: event.data.level,
}));
}
});
}
if ((added) % 4 === 0) {
row = addStr(row, row.length, `</div><div class="row itemslist_row-h">`);
lastRowNum = row.length+6;
}
}
}
}
}
}
}
row += `</div>`;
if(event.data.UseXP) {
$('#currentlevel').html(event.data.level);
document.documentElement.style.setProperty('--percentage-width', event.data.percentage+"%");
$('.xpbar-col').css('margin-top', '-1.8rem');
} else {
$('.xpbar').hide();
$('.xpbar-col').css('margin-top', '5.05rem');
}
var queueRow = '';
CraftQueue = queue;
if(queue.length > 0){
if(queue.length >= 6){
$('.craftingq_window').css('padding-right', '0.35rem');
} else {
$('.craftingq_window').css('padding-right', '0rem');
}
for (var i = 0; i < queue.length; i++) {
if(queue[i].isDone == true) {
if(queue[i].suc){
if(queue[i].isDis){
queueRow += `
<div class="d-flex justify-content-between w-100 queue-item-concluded mt-2">
<div class="d-flex align-items-center">
<img src="nui://${Inventory}/${queue[i].item}.png" class="image_components">
<div class="ms-2">
<div class="queue-itemname">${queue[i].itemName} x${queue[i].amount}</div>
<div class="queue-itemstate">Concluded</div>
</div>
</div>
<div class="d-flex align-items-center queue-item-mr">
<span class="queue-claimbutton"><div class="d-flex justify-content-center align-items-center queue-claimbutton-bg" data-id="${i}" onclick="cancel(this)"><i class="fas fa-check"></i></div></span>
</div>
</div>
`;
} else {
queueRow += `
<div class="d-flex justify-content-between w-100 queue-item-concluded mt-2">
<div class="d-flex align-items-center">
<img src="nui://${Inventory}/${queue[i].item}.png" class="image_components">
<div class="ms-2">
<div class="queue-itemname">${queue[i].itemName} x${queue[i].amount}</div>
<div class="queue-itemstate">Concluded</div>
</div>
</div>
<div class="d-flex align-items-center queue-item-mr">
<span class="queue-claimbutton"><div class="d-flex justify-content-center align-items-center queue-claimbutton-bg" data-id="${i}" onclick="claim(this)"><i class="fas fa-check"></i></div></span>
</div>
</div>
`;
}
} else {
queueRow += `
<div class="d-flex justify-content-between w-100 queue-item-failed mt-2">
<div class="d-flex align-items-center">
<img src="nui://${Inventory}/${queue[i].item}.png" class="image_components">
<div class="ms-2">
<div class="queue-itemname">${queue[i].itemName} x${queue[i].amount}</div>
<div class="queue-itemstate">Failed to craft</div>
</div>
</div>
<div class="d-flex align-items-center queue-item-mr">
<span class="queue-claimbutton"><div class="d-flex justify-content-center align-items-center queue-failbutton-bg" data-id="${i}" onclick="claimFail(this)"><i class="fas fa-check"></i></div></span>
</div>
</div>
`;
}
} else {
if(queue[i].isPending){
if(queue[i].isDis){
queueRow += `
<div class="d-flex justify-content-between w-100 queue-item mt-2">
<div class="d-flex align-items-center">
<img src="nui://${Inventory}/${queue[i].item}.png" class="image_components">
<div class="ms-2">
<div class="queue-itemname">${queue[i].itemName} x${queue[i].amount}</div>
<div class="queue-itemstate">Pending</div>
</div>
</div>
<div class="d-flex align-items-center queue-item-mr">
<span class="queue-cancelbutton"><div class="d-flex justify-content-center align-items-center queue-cancelbutton-bg" data-id="${i}" onclick="claim(this)"><i class="fas fa-times"></i></div></span>
</div>
</div>
`;
} else {
queueRow += `
<div class="d-flex justify-content-between w-100 queue-item mt-2">
<div class="d-flex align-items-center">
<img src="nui://${Inventory}/${queue[i].item}.png" class="image_components">
<div class="ms-2">
<div class="queue-itemname">${queue[i].itemName} x${queue[i].amount}</div>
<div class="queue-itemstate">Pending</div>
</div>
</div>
<div class="d-flex align-items-center queue-item-mr">
<span class="queue-cancelbutton"><div class="d-flex justify-content-center align-items-center queue-cancelbutton-bg" data-id="${i}" onclick="cancel(this)"><i class="fas fa-times"></i></div></span>
</div>
</div>
`;
}
} else {
if(queue[i].isDis){
queueRow += `
<div class="d-flex justify-content-between w-100 queue-item mt-2">
<div class="d-flex align-items-center">
<img src="nui://${Inventory}/${queue[i].item}.png" class="image_components">
<div class="ms-2">
<div class="queue-itemname">${queue[i].itemName} x${queue[i].amount}</div>
<div class="queue-itemstate">Time left: ${queue[i].time}s</div>
</div>
</div>
<div class="d-flex align-items-center queue-item-mr">
<span class="queue-cancelbutton"><div class="d-flex justify-content-center align-items-center queue-cancelbutton-bg" data-id="${i}" onclick="claim(this)"><i class="fas fa-times"></i></div></span>
</div>
</div>
`;
} else {
queueRow += `
<div class="d-flex justify-content-between w-100 queue-item mt-2">
<div class="d-flex align-items-center">
<img src="nui://${Inventory}/${queue[i].item}.png" class="image_components">
<div class="ms-2">
<div class="queue-itemname">${queue[i].itemName} x${queue[i].amount}</div>
<div class="queue-itemstate">Time left: ${queue[i].time}s</div>
</div>
</div>
<div class="d-flex align-items-center queue-item-mr">
<span class="queue-cancelbutton"><div class="d-flex justify-content-center align-items-center queue-cancelbutton-bg" data-id="${i}" onclick="cancel(this)"><i class="fas fa-times"></i></div></span>
</div>
</div>
`;
}
}
}
}
} else {
queueRow = `<div class="d-flex justify-content-center noitq">The crafting queue is empty</div>`
}
$('.craftingq_window').html(queueRow);
$('#craft-table').html(row);
$('.title-name').html(event.data.name);
$('.title').fadeIn();
$('.itemslist').fadeIn();
$('.crafting-body').fadeIn();
break
case 'openSideCraft':
sideCraftMenu = event.data;
canOpenSideCraft = true;
var useLevels = false;
if(sideCraftMenu.level != undefined){
var levelNeeded = sideCraftMenu.crafts[sideCraftMenu.index].levelNeeded;
var level = sideCraftMenu.level;
useLevels = true;
}
var isLevel = false;
$('#quantity').val(1);
maxCraft = sideCraftMenu.maxCraft;
if(canCraftItem == false){
canCraftItem = true;
document.querySelector('#craft-button').disabled = false;
}
var canCraft = true;
var isAvailable = false;
var num = event.data.recipe.length;
var recipe = ``;
var img = `
<img src="nui://${Inventory}/${event.data.itemNameID}.png" class="image_itemselected">
<span style="color: #fff; font-weight: 600; font-size: 20px;" class="ms-2">${event.data.itemName} x${event.data.itemAmount}</span>
`;
if(sideCraftMenu.isDis){
$('#top_text').html(`Requirements`);
$('#bot_text').html(`You will receive`);
img = `
<img src="nui://${Inventory}/${event.data.itemNameID}.png" class="image_itemselected">
<span style="color: #fff; font-weight: 600; font-size: 20px;" class="ms-2">${event.data.itemName} x${event.data.itemAmount} (${event.data.isDisItemAmt})</span>
`;
} else {
$('#top_text').html(`You will receive`);
$('#bot_text').html(`Requirements`);
}
$('#side-image').html(img);
$('#craft-time').html(event.data.time);
if(useLevels){
if(level >= levelNeeded){
canCraft = true;
isAvailable = true;
isLevel = true;
} else {
isAvailable = false;
canCraft = false;
isLevel = true;
}
}
for(var i = 0; i < num; i++){
var idName = event.data.recipe[i][0];
if(sideCraftMenu.isDis){
recipe += `
<div class="d-flex align-items-center mx-1">
<img src="nui://${Inventory}/${event.data.recipe[i][0]}.png" class="image_components">
<span style="color: #fff; font-weight: 600; font-size: 20px;" class="ms-2">${event.data.itemNames[idName]} x${event.data.recipe[i][1]}</span>
</div>
`;
if(event.data.itemAmount > event.data.isDisItemAmt){
canCraft = false
}
} else {
recipe += `
<div class="d-flex align-items-center mx-1">
<img src="nui://${Inventory}/${event.data.recipe[i][0]}.png" class="image_components">
<span style="color: #fff; font-weight: 600; font-size: 20px;" class="ms-2">${event.data.itemNames[idName]} x${event.data.recipe[i][1]} (${event.data.inventory[i].key})</span>
</div>
`;
if(event.data.recipe[i][1] > event.data.inventory[i].key){
canCraft = false
}
}
}
$('#craft-button-div').html(`
<button type="button" id="craft-button" data-item="${event.data.itemNameID}" data-recipe="${event.data.recipe}" data-amount="${event.data.itemAmount}" data-xp="${event.data.xp}" data-isDis="${event.data.isDis}" data-index="${sideCraftMenu.index}" data-level="${sideCraftMenu.level}" onclick="craft(this)" class="btn btn-blue flex-grow-1">CRAFT</button>
`);
if(canCraft) {
$('#craft-buttons-info').fadeIn();
$('#craft-button-div').fadeIn();
$('#craft-buttons-info-level').hide();
} else {
$('#craft-buttons-info').hide();
$('#craft-buttons-info-level').hide();
}
if(useLevels){
if(!isAvailable && isLevel){
$('#craft-button-div-level').html(`
<span class="btn-blue-level"><i class="fa-solid fa-lock"></i> LEVEL REQUIRED: ${levelNeeded}</span>
`);
$('#craft-buttons-info-level').fadeIn();
$('#craft-button-div-level').fadeIn();
}
}
$('#craft-percentage').html(event.data.percentage);
$('.components_window').html(recipe);
$('.itemrequirements').fadeIn();
break
case 'ShowCraftCount':
var time = event.data.time;
var itemName = event.data.name;
$('#crafting-text').html(`Crafting`);
$('#item-name').html(`${itemName}`);
$('#item-timer').html(`${time}s`);
if(time == lastTime) {
$('#cog').removeClass('fa-spin');
} else {
$('#cog').addClass('fa-spin');
}
if(!isTimerOn){
isTimerOn = true;
$('.timer').fadeIn();
}
lastTime = time
break
case 'CompleteCraftCount':
var itemName = event.data.name;
$('.timer_card-body').css('background-color', '#1fa34a');
$('#crafting-text').html(`Crafted`);
$('#item-name').html(`${itemName}`);
$('#item-timer').html(`0s`);
$('#cog').removeClass('fa-spin');
$('#cog').removeClass('fa-cog');
$('#cog').addClass('fa-check');
break
case 'FailedCraftCount':
var itemName = event.data.name;
$('.timer_card-body').css('background-color', '#990b0b');
$('#crafting-text').html(`Failed to craft`);
$('#item-name').html(`${itemName}`);
$('#item-timer').html(`0s`);
$('#cog').removeClass('fa-spin');
$('#cog').removeClass('fa-cog');
$('#cog').addClass('fa-times');
break
case 'HideCraftCount':
isTimerOn = false;
$('.timer').fadeOut();
setTimeout(function(){
$('#cog').removeClass('fa-times');
$('#cog').removeClass('fa-check');
$('#cog').addClass('fa-spin');
$('#cog').addClass('fa-cog');
$('.timer_card-body').css('background-color', 'rgba(31, 94, 255, 1)');
}, 400);
break
case 'updateCraftingItems':
canClaimItem = true;
if(selectedCategory != ""){
var queue = event.data.queue;
var queueRow = '';
CraftQueue = queue;
if(queue.length > 0){
if(queue.length >= 6){
$('.craftingq_window').css('padding-right', '0.35rem');
} else {
$('.craftingq_window').css('padding-right', '0rem');
}
for (var i = 0; i < queue.length; i++) {
if(queue[i].isDone == true) {
if(queue[i].suc){
if(queue[i].isDis){
queueRow += `
<div class="d-flex justify-content-between w-100 queue-item-concluded mt-2">
<div class="d-flex align-items-center">
<img src="nui://${Inventory}/${queue[i].item}.png" class="image_components">
<div class="ms-2">
<div class="queue-itemname">${queue[i].itemName} x${queue[i].amount}</div>
<div class="queue-itemstate">Concluded</div>
</div>
</div>
<div class="d-flex align-items-center queue-item-mr">
<span class="queue-claimbutton"><div class="d-flex justify-content-center align-items-center queue-claimbutton-bg" data-id="${i}" onclick="cancel(this)"><i class="fas fa-check"></i></div></span>
</div>
</div>
`;
} else {
queueRow += `
<div class="d-flex justify-content-between w-100 queue-item-concluded mt-2">
<div class="d-flex align-items-center">
<img src="nui://${Inventory}/${queue[i].item}.png" class="image_components">
<div class="ms-2">
<div class="queue-itemname">${queue[i].itemName} x${queue[i].amount}</div>
<div class="queue-itemstate">Concluded</div>
</div>
</div>
<div class="d-flex align-items-center queue-item-mr">
<span class="queue-claimbutton"><div class="d-flex justify-content-center align-items-center queue-claimbutton-bg" data-id="${i}" onclick="claim(this)"><i class="fas fa-check"></i></div></span>
</div>
</div>
`;
}
} else {
queueRow += `
<div class="d-flex justify-content-between w-100 queue-item-failed mt-2">
<div class="d-flex align-items-center">
<img src="nui://${Inventory}/${queue[i].item}.png" class="image_components">
<div class="ms-2">
<div class="queue-itemname">${queue[i].itemName} x${queue[i].amount}</div>
<div class="queue-itemstate">Failed to craft</div>
</div>
</div>
<div class="d-flex align-items-center queue-item-mr">
<span class="queue-claimbutton"><div class="d-flex justify-content-center align-items-center queue-failbutton-bg" data-id="${i}" onclick="claimFail(this)"><i class="fas fa-check"></i></div></span>
</div>
</div>
`;
}
} else {
if(queue[i].isPending){
if(queue[i].isDis){
queueRow += `
<div class="d-flex justify-content-between w-100 queue-item mt-2">
<div class="d-flex align-items-center">
<img src="nui://${Inventory}/${queue[i].item}.png" class="image_components">
<div class="ms-2">
<div class="queue-itemname">${queue[i].itemName} x${queue[i].amount}</div>
<div class="queue-itemstate">Pending</div>
</div>
</div>
<div class="d-flex align-items-center queue-item-mr">
<span class="queue-cancelbutton"><div class="d-flex justify-content-center align-items-center queue-cancelbutton-bg" data-id="${i}" onclick="claim(this)"><i class="fas fa-times"></i></div></span>
</div>
</div>
`;
} else {
queueRow += `
<div class="d-flex justify-content-between w-100 queue-item mt-2">
<div class="d-flex align-items-center">
<img src="nui://${Inventory}/${queue[i].item}.png" class="image_components">
<div class="ms-2">
<div class="queue-itemname">${queue[i].itemName} x${queue[i].amount}</div>
<div class="queue-itemstate">Pending</div>
</div>
</div>
<div class="d-flex align-items-center queue-item-mr">
<span class="queue-cancelbutton"><div class="d-flex justify-content-center align-items-center queue-cancelbutton-bg" data-id="${i}" onclick="cancel(this)"><i class="fas fa-times"></i></div></span>
</div>
</div>
`;
}
} else {
if(queue[i].isDis){
queueRow += `
<div class="d-flex justify-content-between w-100 queue-item mt-2">
<div class="d-flex align-items-center">
<img src="nui://${Inventory}/${queue[i].item}.png" class="image_components">
<div class="ms-2">
<div class="queue-itemname">${queue[i].itemName} x${queue[i].amount}</div>
<div class="queue-itemstate">Time left: ${queue[i].time}s</div>
</div>
</div>
<div class="d-flex align-items-center queue-item-mr">
<span class="queue-cancelbutton"><div class="d-flex justify-content-center align-items-center queue-cancelbutton-bg" data-id="${i}" onclick="claim(this)"><i class="fas fa-times"></i></div></span>
</div>
</div>
`;
} else {
queueRow += `
<div class="d-flex justify-content-between w-100 queue-item mt-2">
<div class="d-flex align-items-center">
<img src="nui://${Inventory}/${queue[i].item}.png" class="image_components">
<div class="ms-2">
<div class="queue-itemname">${queue[i].itemName} x${queue[i].amount}</div>
<div class="queue-itemstate">Time left: ${queue[i].time}s</div>
</div>
</div>
<div class="d-flex align-items-center queue-item-mr">
<span class="queue-cancelbutton"><div class="d-flex justify-content-center align-items-center queue-cancelbutton-bg" data-id="${i}" onclick="cancel(this)"><i class="fas fa-times"></i></div></span>
</div>
</div>
`;
}
}
}
}
} else {
queueRow = `<div class="d-flex justify-content-center noitq">The crafting queue is empty</div>`
}
$('.craftingq_window').html(queueRow);
}
break
case 'resetItemNumber':
itemClaiming = 0;
break
case 'resetButton':
if(canCraftItem == false){
canCraftItem = true;
document.querySelector('#craft-button').disabled = false;
}
break
case 'canClaimAll':
document.querySelector('#claimall-button').disabled = false;
break
case 'closeMenu':
closeMenu();
break
}
});
$(document).on('click', ".cat_tab", function() {
selectedCategory = $("input[name='category']:checked").val();
var num = craft2.length;
var paragraph = '';
var row = '<div class="row">';
var lastRowNum = 0;
var added = 0
for(var i = 0; i < num; i++) {
for(var i1 = 0; i1 < craft2[i].job.length; i1++){
if(selectedCategory == "general_cat" || craft2[i].category == selectedCategory){
if(craft2[i].job[i1] == job2 || craft2[i].job[i1] == gang || craft2[i].job[i1] == ''){
if(!craftData.UseXP){
var itemName = craftData.itemNames;
var itemId = craft2[i].item;
var index = i;
added++
row += `
<div class="col-md-3">
<div class="card item_card" id="${itemId}wb_${craftData.wb}wb_${index}">
<div class="card-body item_card-body d-flex justify-content-center align-items-center" style="background-color: rgba(220, 220, 220, 0.20)" id="selected${itemId}wb_${craftData.wb}wb_${index}">
<span class="item-title text-center">${itemName[itemId]}</span>
<img src="nui://${Inventory}/${itemId}.png" class="image">
</div>
</div>
</div>
`;
if ((added) % 4 === 0) {
row = addStr(row, row.length, `</div><div class="row itemslist_row-h">`);
lastRowNum = row.length+6;
}
} else {
if(craft2[i].levelNeeded <= craftData.level || showAllCrafts){
var itemName = craftData.itemNames;
var itemId = craft2[i].item;
var index = i;
added++
row += `
<div class="col-md-3">
<div class="card item_card" id="${itemId}wb_${craftData.wb}wb_${index}">
<div class="card-body item_card-body d-flex justify-content-center align-items-center" style="background-color: rgba(220, 220, 220, 0.20)" id="selected${itemId}wb_${craftData.wb}wb_${index}">
<span class="item-title text-center">${itemName[itemId]}</span>
<img src="nui://${Inventory}/${itemId}.png" class="image">
</div>
</div>
</div>
`;
if ((added) % 4 === 0) {
row = addStr(row, row.length, `</div><div class="row itemslist_row-h">`);
lastRowNum = row.length+6;
}
}
}
}
}
}
}
row += `</div>`;
if(craftData.UseXP) {
$('#currentlevel').html(craftData.level);
document.documentElement.style.setProperty('--percentage-width', craftData.percentage+"%");
$('.xpbar-col').css('margin-top', '-1.8rem');
} else {
$('.xpbar').hide();
$('.xpbar-col').css('margin-top', '5.05rem');
}
$('#craft-table').html(row);
$('.title-name').html(craftData.name);
$('.title').fadeIn();
$('.itemslist').fadeIn();
$('.crafting-body').fadeIn();
});
function restartCrafts(){
selectedCategory = 'general_cat';
var num = craft2.length;
var paragraph = '';
var row = '<div class="row">';
var lastRowNum = 0;
var added = 0
for(var i = 0; i < num; i++) {
for(var i1 = 0; i1 < craft2[i].job.length; i1++){
if(selectedCategory == "general_cat" || craft2[i].category == selectedCategory){
if(craft2[i].job[i1] == job2 || craft2[i].job[i1] == gang || craft2[i].job[i1] == ''){
if(!craftData.UseXP){
var itemName = craftData.itemNames;
var itemId = craft2[i].item;
var index = i;
added++
row += `
<div class="col-md-3">
<div class="card item_card" id="${itemId}wb_${craftData.wb}wb_${index}">
<div class="card-body item_card-body d-flex justify-content-center align-items-center" style="background-color: rgba(220, 220, 220, 0.20)" id="selected${itemId}wb_${craftData.wb}wb_${index}">
<span class="item-title text-center">${itemName[itemId]}</span>
<img src="nui://${Inventory}/${itemId}.png" class="image">
</div>
</div>
</div>
`;
if ((added) % 4 === 0) {
row = addStr(row, row.length, `</div><div class="row itemslist_row-h">`);
lastRowNum = row.length+6;
}
} else {
if(craft2[i].levelNeeded <= craftData.level || showAllCrafts){
var itemName = craftData.itemNames;
var itemId = craft2[i].item;
var index = i;
added++
row += `
<div class="col-md-3">
<div class="card item_card" id="${itemId}wb_${craftData.wb}wb_${index}">
<div class="card-body item_card-body d-flex justify-content-center align-items-center" style="background-color: rgba(220, 220, 220, 0.20)" id="selected${itemId}wb_${craftData.wb}wb_${index}">
<span class="item-title text-center">${itemName[itemId]}</span>
<img src="nui://${Inventory}/${itemId}.png" class="image">
</div>
</div>
</div>
`;
if ((added) % 4 === 0) {
row = addStr(row, row.length, `</div><div class="row itemslist_row-h">`);
lastRowNum = row.length+6;
}
}
}
}
}
}
}
row += `</div>`;
if(craftData.UseXP) {
$('#currentlevel').html(craftData.level);
document.documentElement.style.setProperty('--percentage-width', craftData.percentage+"%");
$('.xpbar-col').css('margin-top', '-1.8rem');
} else {
$('.xpbar').hide();
$('.xpbar-col').css('margin-top', '5.05rem');
}
$('#craft-table').html(row);
$('.title-name').html(craftData.name);
}
$(document).ready(function() {
document.onkeyup = function(data) {
if (data.which == 27) {
closeMenu();
}
};
});
$(document).ready(function(){
$('#plus').click(function(e) {
var quantity = parseInt($('#quantity').val());
if(quantity < maxCraft){
$('#quantity').val(quantity + 1);
updateSideMenu(quantity + 1);
}
});
$('#minus').click(function(e) {
var quantity = parseInt($('#quantity').val());
if(quantity > maxCraft){
$('#quantity').val(maxCraft);
updateSideMenu(maxCraft);
} else {
if(quantity > 1) {
$('#quantity').val(quantity - 1);
updateSideMenu(quantity - 1);
}
}
});
$('#max').click(function(e) {
var quantity = parseInt($('#quantity').val());
if(quantity != maxCraft){
$('#quantity').val(maxCraft);
updateSideMenu(maxCraft);
}
});
});
function quantity_change(t) {
var quantity = parseInt($('#quantity').val());
if(quantity > maxCraft){
$('#quantity').val(maxCraft);
updateSideMenu(maxCraft);
} else if(quantity < 1) {
$('#quantity').val(1);
updateSideMenu(1);
} else {
updateSideMenu(quantity);
}
}
function craft(t) {
if(canCraftItem){
canCraftItem = false;
document.querySelector('#craft-button').disabled = true;
var itemId = t.dataset.item;
var recipe = t.dataset.recipe;
var amount = t.dataset.amount;
var xp = t.dataset.xp;
var isDis = t.dataset.isDis;
var index = t.dataset.index;
var level = t.dataset.level;
var quantity = document.getElementById("quantity").value;
if(quantity > maxCraft){
quantity = maxCraft;
$('#quantity').val(quantity - 1);
updateSideMenu(quantity - 1);
}
$.post('https://okokCrafting/action', JSON.stringify({
action: "craft-button",
itemID: itemId,
recipe: recipe,
amount: amount,
xp: xp,
quantity: quantity,
isDis: isDis,
index: index,
level: level,
}));
}
}
function claim(t) {
var index = parseInt(t.dataset.id)+1;
var itemRndID = parseInt(CraftQueue[index-1].randomID);
if(itemClaiming != itemRndID && canClaimItem){
canClaimItem = false;
itemClaiming = itemRndID;
$.post('https://okokCrafting/action', JSON.stringify({
action: "claim-item",
index: index,
}));
}
}
function claimall(t) {
if(CraftQueue[0] != undefined && CraftQueue[0].isDone && canClaimItem){
canClaimItem = false;
document.querySelector('#claimall-button').disabled = true;
$.post('https://okokCrafting/action', JSON.stringify({
action: "claim-all",
}));
}
}
function claimFail(t) {
var index = parseInt(t.dataset.id)+1;
var itemRndID = parseInt(CraftQueue[index-1].randomID);
if(itemClaiming != itemRndID && canClaimItem){
canClaimItem = false;
itemClaiming = itemRndID;
$.post('https://okokCrafting/action', JSON.stringify({
action: "fail-item",
index: index,
}));
}
}
function cancel(t) {
var index = parseInt(t.dataset.id)+1;
var itemRndID = parseInt(CraftQueue[index-1].randomID);
if(itemClaiming != itemRndID && canClaimItem){
canClaimItem = false;
itemClaiming = itemRndID;
$.post('https://okokCrafting/action', JSON.stringify({
action: "cancel-item",
index: index,
}));
}
}
function updateSideMenu(quantity){
var canCraft = true
var num = sideCraftMenu.recipe.length;
var recipe = ``;
var img = `
<img src="nui://${Inventory}/${sideCraftMenu.itemNameID}.png" class="image_itemselected">
<span style="color: #fff; font-weight: 600; font-size: 20px;" class="ms-2">${sideCraftMenu.itemName} x${sideCraftMenu.itemAmount*quantity}</span>
`;
if(sideCraftMenu.isDis){
img = `
<img src="nui://${Inventory}/${sideCraftMenu.itemNameID}.png" class="image_itemselected">
<span style="color: #fff; font-weight: 600; font-size: 20px;" class="ms-2">${sideCraftMenu.itemName} x${sideCraftMenu.itemAmount*quantity} (${sideCraftMenu.isDisItemAmt})</span>
`;
}
$('#side-image').html(img);
$('#craft-time').html(sideCraftMenu.time*quantity);
for(var i = 0; i < num; i++){
var idName = sideCraftMenu.recipe[i][0];
if(sideCraftMenu.isDis){
recipe += `
<div class="d-flex align-items-center mx-1">
<img src="nui://${Inventory}/${sideCraftMenu.recipe[i][0]}.png" class="image_components">
<span style="color: #fff; font-weight: 600; font-size: 20px;" class="ms-2">${sideCraftMenu.itemNames[idName]} x${sideCraftMenu.recipe[i][1]*quantity}</span>
</div>
`;
if(sideCraftMenu.itemAmount > sideCraftMenu.isDisItemAmt){
canCraft = false
}
} else {
recipe += `
<div class="d-flex align-items-center mx-1">
<img src="nui://${Inventory}/${sideCraftMenu.recipe[i][0]}.png" class="image_components">
<span style="color: #fff; font-weight: 600; font-size: 20px;" class="ms-2">${sideCraftMenu.itemNames[idName]} x${sideCraftMenu.recipe[i][1]*quantity} (${sideCraftMenu.inventory[i].key})</span>
</div>
`;
if(sideCraftMenu.recipe[i][1] > sideCraftMenu.inventory[i].key){
canCraft = false
}
}
}
$('#craft-button-div').html(`
<button type="button" id="craft-button" data-item="${sideCraftMenu.itemNameID}" data-recipe="${sideCraftMenu.recipe}" data-amount="${sideCraftMenu.itemAmount}" data-xp="${sideCraftMenu.xp}" data-isDis="${sideCraftMenu.isDis}" data-index="${sideCraftMenu.index}" data-level="${sideCraftMenu.level}" onclick="craft(this)" class="btn btn-blue flex-grow-1">CRAFT</button>
`);
if(canCraft) {
$('#craft-button-div').fadeIn();
} else {
$('#craft-button-div').hide();
}
$('#craft-percentage').html(sideCraftMenu.percentage);
$('.components_window').html(recipe);
$('.itemrequirements').fadeIn();
}
function closeMenu(){
itemClaiming = 0;
selectedCategory = "";
$('.crafting-body').fadeOut();
$('.title').fadeOut();
$('.itemslist').fadeOut();
$('.itemrequirements').fadeOut();
setTimeout(function(){
restartCrafts();
}, 400);
$.post('https://okokCrafting/action', JSON.stringify({
action: "close",
}));
}

View file

@ -1,589 +0,0 @@
@import url('https://fonts.googleapis.com/css2?family=Tajawal:wght@200;300;400;500;700;800;900&display=swap');
*,*:focus,*:hover{
outline:none;
}
html, body {
height: 100%;
}
html {
font-size: calc(16 / 19.2 * 1vw);
}
@media (min-aspect-ratio: 16 / 9) {
html {
font-size: calc(16 / 10.8 * 1vh);
}
}
body {
font-family: 'Tajawal', sans-serif;
background: none;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
user-select: none;
}
.crafting-body {
display: none;
height: 48rem;
}
.title-main {
margin-top: -3.05rem;
}
.title {
color: #fff;
font-size: 3.75rem;
line-height: 1;
text-transform: uppercase;
text-align: center;
}
.title-name {
font-weight: 300;
}
.title-name2 {
font-weight: 600;
margin-left: 0.938rem;
}
.card {
border: none;
border-radius: 1.25rem;
background-color: transparent;
}
.card-body {
background-color: #ffffff;
font-size: 0.938rem;
font-weight: 500;
border-radius: 1.25rem;
}
.itemslist {
display: none;
margin-top: 2.9rem;
}
.itemrequirements {
display: none;
}
.xpbar-col {
margin-top: -1.8rem;
margin-left: -0.3rem;
width: 24.65rem;
}
.xpbar {
margin-bottom: 1.35rem;
}
.itemslist_card {
width: 50rem;
}
.itemslist_card-body {
background: transparent;
}
.itemslist_window {
overflow-x: hidden;
height: 35.2rem;
padding: 0.3125rem 1.05rem 0.3125rem 0.625rem;
}
.item_card {
width: 10.625rem;
height: 10.625rem;
}
.item_card:hover {
cursor: pointer;
}
.item_card-body {
width: 10.625rem;
height: 10.625rem;
box-shadow: 0rem 0rem 0.313rem 0rem rgba(10, 10, 10, 0.3);
transition: 0.25s;
background-color: rgba(220, 220, 220, 0.20);
}
.item_card-body:hover {
background-color: rgba(31, 94, 255, 1) !important;
transition: 0.25s;
transform: scale(1.030);
}
.item-title {
color: #fff;
font-weight: 600;
position: absolute;
top: 8%;
}
.image {
height: 7.5rem;
position: absolute;
top: 22.5%;
}
.image_itemselected {
height: 5rem;
}
.text_itemselected {
color: #fff;
font-weight: 600;
font-size: 1.25rem;
}
.image_components {
height: 3.75rem;
}
::-webkit-scrollbar {
width: 0.5rem;
}
::-webkit-scrollbar-track {
background-color: transparent;
}
::-webkit-scrollbar-thumb {
background-color: #1f5eff;
border-radius: 0.625rem;
transition: .25s;
}
::-webkit-scrollbar-thumb:hover {
cursor: pointer;
background-color: #0a4df9;
transition: .25s;
}
.timer {
position: fixed;
right: 2rem;
bottom: 4rem;
font-size: 3.125rem;
display: none;
}
.timer_card {
height: 1.875rem;
}
.timer_card-body {
background-color: rgba(31, 94, 255, 1);
font-weight: 600 !important;
color: #fff !important;
font-size: 1.25rem !important;
box-shadow: 0rem 0rem 0.313rem 0rem rgba(10, 10, 10, 0.3);
padding-right: 4.375rem;
}
#crafting-text {
margin-left: 0.625rem;
}
#item-timer {
position: absolute;
right: 0.938rem;
}
#time {
position: absolute;
top: 0.625rem;
right: 0.625rem;
color: #fff;
background-color: rgba(31, 94, 255, 1);
box-shadow: 0rem 0rem 0.313rem 0rem rgba(10, 10, 10, 0.3);
border-radius: 0.625rem;
padding: 0.313rem;
}
#percentage {
position: absolute;
top: 3.1rem;
right: 0.625rem;
color: #fff;
background-color: rgba(31, 94, 255, 1);
box-shadow: 0rem 0rem 0.313rem 0rem rgba(10, 10, 10, 0.3);
border-radius: 0.625rem;
padding: 0.313rem;
}
#level-text {
color: #fff;
font-weight: 600;
font-size: 2rem;
}
.progress {
background: rgba(220, 220, 220, 0.20);
justify-content: flex-start;
border-radius: 1.25rem;
align-items: center;
position: relative;
padding: 0 0.313rem;
display: flex;
height: 2.5rem;
width: 100%;
box-shadow: 0rem 0rem 0.313rem 0rem rgba(10, 10, 10, 0.3);
}
.progress-value {
width: var(--percentage-width);
transition: width .5s ease-in-out;
border-radius: 6.25rem;
background: #1f5eff;
height: 1.875rem;
}
:root {
--percentage-width: 0%;
}
@keyframes load {
0% { width: 0; }
100% { width: var(--percentage-width); }
}
.btn {
font-weight: 500;
font-size: 1.125rem;
padding: 0.8125rem 1.0625rem;
border: none;
transition: 0.25s;
letter-spacing: 0.0125rem;
}
.btn-blue {
background-color: #1f5eff;
color: #e6e6e6;
}
.btn-blue:hover {
background-color: #0a4df9;
color: #e6e6e6;
}
.btn-blue-level {
font-size: 1.125rem;
padding: 0.8125rem 1.0625rem;
letter-spacing: 0.0125rem;
display: inline-block;
text-align: center;
background-color: #1f5eff;
color: #e6e6e6;
border-radius: 1rem;
width: 100%;
font-weight: 600;
box-shadow: 0rem 0rem 0.313rem 0rem rgb(10 10 10 / 30%);
}
.btn:focus {
box-shadow: none;
}
.btn-category {
background-color: #1f5eff;
border: none !important;
outline: none !important;
box-shadow: none !important;
transition: .25s;
font-weight: 600;
color: #fff;
}
.btn-category:hover {
background-color: #0a4df9;
color: #fff;
transition: .25s;
}
.btn:focus {
box-shadow: none;
}
.btn-check:active+.btn-category:focus, .btn-check:checked+.btn-category:focus, .btn-category.active:focus, .btn-category:active:focus, .show>.btn-category.dropdown-toggle:focus {
box-shadow: none;
transition: .25s;
}
.btn-check:active+.btn-category, .btn-check:checked+.btn-category, .btn-category.active, .btn-category:active, .show>.btn-category.dropdown-toggle {
background-color: #fcfcfc;
border-color: none;
transition: .25s;
color: #1f5eff;
}
hr {
opacity: 1;
color: #fff;
}
.queue-item {
background-color: #1f5eff;
border-radius: 0.625rem;
padding: 0.5rem;
transition: .25s;
}
.queue-item:hover {
background-color: #0a4df9;
border-radius: 0.625rem;
padding: 0.5rem;
transition: .25s;
}
.queue-item-concluded {
background-color: #25ba59;
border-radius: 0.625rem;
padding: 0.5rem;
transition: .25s;
}
.queue-item-concluded:hover {
background-color: #20ab51;
border-radius: 0.625rem;
padding: 0.5rem;
transition: .25s;
}
.queue-item-failed {
background-color: #ff2943;
border-radius: 0.625rem;
padding: 0.5rem;
transition: .25s;
}
.queue-item-failed:hover {
background-color: #cd0032;
border-radius: 0.625rem;
padding: 0.5rem;
transition: .25s;
}
.queue-cancelbutton {
font-size: 1.75rem;
}
.queue-cancelbutton-bg {
width: 2.5rem;
height: 2.5rem;
background-color: #fff;
border-radius: 0.625rem;
color: #1f5eff;
transition: .25s;
}
.queue-cancelbutton-bg:hover {
background-color: #e1e1e3;
transition: .25s;
cursor: pointer;
}
.queue-claimbutton {
font-size: 1.75rem;
}
.queue-claimbutton-bg {
width: 2.5rem;
height: 2.5rem;
background-color: #fff;
border-radius: 0.625rem;
color: #25ba59;
transition: .25s;
}
.queue-claimbutton-bg:hover {
background-color: #e1e1e3;
transition: .25s;
cursor: pointer;
}
.queue-failbutton-bg {
width: 2.5rem;
height: 2.5rem;
background-color: #fff;
border-radius: 0.625rem;
color: #ff2943;
transition: .25s;
}
.queue-failbutton-bg:hover {
background-color: #e1e1e3;
transition: .25s;
cursor: pointer;
}
.components_window {
max-height: 18.75rem;
overflow-x: hidden;
}
.craftingq_window {
max-height: 27.3rem;
overflow-x: hidden;
padding-right: 0.35rem;
}
.btn-group {
padding: 0.5rem;
background-color: rgba(220, 220, 220, 0.20);
border-radius: 1.25rem;
box-shadow: 0rem 0rem 0.313rem 0rem rgba(10, 10, 10, 0.3);
margin-top: 2rem;
}
.first-category {
border-top-left-radius: 1rem;
border-bottom-left-radius: 1rem;
}
.last-category {
border-top-right-radius: 1rem;
border-bottom-right-radius: 1rem;
}
#craft-button, #claimall-button {
border-radius: 1rem;
width: 100%;
font-weight: 600;
box-shadow: 0rem 0rem 0.313rem 0rem rgba(10, 10, 10, 0.3);
}
.component, .noitq {
color: #fff;
font-weight: 600;
font-size: 1.25rem;
}
.row-h {
height: 43.8rem;
}
.queue-itemname {
color: #fff;
font-weight: 600;
font-size: 1.25rem;
line-height: 1;
}
.queue-itemstate {
line-height: 1;
color: #ededed;
margin-top: 0.2rem;
font-weight: 600;
}
.queue-item-mr {
margin-right: 0.65rem;
}
.itemslist_row-h {
margin-top: 1.35rem;
}
.section-title {
color: #fff;
font-weight: 600;
font-size: 2rem;
}
.craftingq_card {
width: 23.125rem;
box-shadow: 0rem 0rem 0.313rem 0rem rgba(10, 10, 10, 0.3);
margin-top: 5.05rem;
height: 34.56rem;
}
.craftingq_card-body {
background-color: rgba(220, 220, 220, 0.20);
min-height: 34.5625rem;
}
.ywr {
color: #fff;
font-weight: 600;
font-size: 2rem;
}
.itemr_card {
height: 34.56rem;
box-shadow: 0rem 0rem 0.313rem 0rem rgba(10, 10, 10, 0.3);
}
.itemr_card-body {
background-color: rgba(220, 220, 220, 0.20);
}
.craft-tp {
color: #fff;
font-weight: 600;
}
.btn-group>.btn-group:not(:first-child), .btn-group>.btn:not(:first-child) {
margin-left: 0;
}
.form-control {
border: none;
border-radius: 0;
padding: 0rem 0.75rem;
}
.form-control:focus {
box-shadow: none;
}
#minus {
border-radius: 0;
border-top-left-radius: 1rem;
border-bottom-left-radius: 1rem;
}
#plus {
border-radius: 0;
border-top-right-radius: 1rem;
border-bottom-right-radius: 1rem;
}
#quantity {
background-color: rgba(220, 220, 220, 0.20);
color: #fff;
font-size: 2rem;
font-weight: 600;
}
#max {
box-shadow: 0rem 0rem 0.313rem 0rem rgb(10 10 10 / 30%);
border-radius: 1rem;
font-weight: 600;
}
.mip {
box-shadow: 0rem 0rem 0.313rem 0rem rgb(10 10 10 / 30%);
border-radius: 1rem;
}
input::-webkit-outer-spin-button,
input::-webkit-inner-spin-button {
-webkit-appearance: none;
margin: 0;
}
.crafting {
height: 48rem;
}

View file

@ -1,125 +0,0 @@
<!DOCTYPE html>
<html>
<meta charset="UTF-8">
<head>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<link href="styles.css" rel="stylesheet">
</head>
<body>
<div class="crafting-body">
<div class="row">
<div class="col">
<div class="card craftingq_card">
<div class="card-body craftingq_card-body">
<div class="section-title text-center">Crafting Queue</div>
<hr>
<div class="craftingq_window">
<div class="d-flex justify-content-between w-100 queue-item-concluded">
<div class="d-flex align-items-center">
<img src="icons/compactrifle.png" class="image_components">
<div>
<div class="queue-itemname">Compact Rifle x1</div>
<div class="queue-itemstate">Concluded</div>
</div>
</div>
<div class="d-flex align-items-center queue-item-mr">
<span class="queue-claimbutton"><div class="d-flex justify-content-center align-items-center queue-claimbutton-bg"><i class="fas fa-check"></i></div></span>
</div>
</div>
<div class="d-flex justify-content-between w-100 queue-item mt-2">
<div class="d-flex align-items-center">
<img src="icons/compactrifle.png" class="image_components">
<div>
<div class="queue-itemname">Compact Rifle x1</div>
<div class="queue-itemstate">Time left: 55s</div>
</div>
</div>
<div class="d-flex align-items-center queue-item-mr">
<span class="queue-cancelbutton"><div class="d-flex justify-content-center align-items-center queue-cancelbutton-bg"><i class="fas fa-times"></i></div></span>
</div>
</div>
</div>
</div>
<div class="claimall-button-div mt-2">
<button type="button" id="claimall-button" class="btn btn-blue" onclick="claimall(this)">CLAIM ALL</button>
</div>
</div>
</div>
<div class="col">
<div class="title-main text-center">
<div class="title">
<span class="title-name"></span><span class="title-name2">Crafting</span>
</div>
</div>
<div class="itemslist">
<div class="card itemslist_card">
<div class="card-body itemslist_card-body justify-content-start">
<div class="itemslist_window" id="craft-table"></div>
</div>
</div>
</div>
<div class="text-center" id="categories_box">
<div class="btn-group" role="group" id="categories_btns"></div>
</div>
</div>
<div class="col xpbar-col">
<div class="xpbar">
<div id="level-text" class="text-center">Current Level: <span id="currentlevel">28</span></div>
<div class="progress">
<div class="progress-value d-flex justify-content-center align-items-center"></div>
</div>
</div>
<div class="itemrequirements">
<div class="card itemr_card mb-2">
<div class="card-body itemr_card-body">
<span id="time"><i class="fas fa-clock"></i> <span class="craft-tp"><span id="craft-time"></span>s</span></span>
<span id="percentage"><i class="fas fa-percentage"></i> <span class="craft-tp"><span id="craft-percentage"></span></span></span>
<div class="ywr text-center" id="top_text">You will receive</div>
<div class="d-flex align-items-center justify-content-center mx-1" id="side-image">
<img src="icons/compactrifle.png" class="image_itemselected">
<span class="text_itemselected ms-2"></span>
</div>
<hr>
<div class="section-title text-center mb-2" id="bot_text">Requirements</div>
<div class="components_window"></div>
</div>
</div>
<div id="craft-buttons-info">
<div class="d-flex mb-2">
<div class="d-flex mip" id="selector">
<button type="button" class="btn btn-blue" id="minus"><i class="fa-solid fa-minus"></i></button>
<input type="number" id="quantity" onchange="quantity_change(this)" class="form-control text-center" value="1" min="1" max="9999999999">
<button type="button" class="btn btn-blue" id="plus"><i class="fa-solid fa-plus"></i></button>
</div>
<button type="button" class="btn btn-blue ms-2" id="max">MAX</button>
</div>
<div id="craft-button-div"></div>
</div>
<div id="craft-buttons-info-level">
<div id="craft-button-div-level"></div>
</div>
</div>
</div>
</div>
</div>
<div class="timer">
<div class="card timer_card">
<div class="card-body timer_card-body">
<span><i id="cog" class="fas fa-cog fa-spin"></i></span><span id="crafting-text"></span> <span id="item-name"></span> <span id="item-timer"></span>
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
<script src="scripts.js" type="text/javascript"></script>
</body>
</html>