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