-
Notifications
You must be signed in to change notification settings - Fork 19
/
client.lua
206 lines (198 loc) · 8.73 KB
/
client.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
local QBCore = exports['qb-core']:GetCoreObject()
-- Functions
local function CraftItem(craftedItem, requiredItems, amountToCraft, xpEarned, xpType)
QBCore.Functions.TriggerCallback('crafting:getPlayerInventory', function(inventory)
local hasAllMaterials = true
for _, reqItem in pairs(requiredItems) do
local itemAmount = 0
for _, invItem in pairs(inventory) do
if invItem.name == reqItem.item then
itemAmount = invItem.amount
break
end
end
if itemAmount < reqItem.amount then
hasAllMaterials = false
QBCore.Functions.Notify(string.format(Lang:t('notifications.notenoughMaterials')) .. amountToCraft .. 'x ' .. QBCore.Shared.Items[craftedItem].label, 'error')
break
end
end
if hasAllMaterials then
if Config.EnableSkillCheck then
local success = exports['qb-minigames']:Skillbar('easy', '12345') -- difficulty and words to enter
if success then
QBCore.Functions.Progressbar('crafting_item', 'Crafting ' .. QBCore.Shared.Items[craftedItem].label, (math.random(2000, 5000) * amountToCraft), false, true, {
disableMovement = true,
disableCarMovement = true,
disableMouse = false,
disableCombat = true,
}, {
animDict = 'mini@repair',
anim = 'fixing_a_player',
flags = 16,
}, {}, {}, function()
TriggerServerEvent('qb-crafting:server:receiveItem', craftedItem, requiredItems, amountToCraft, xpEarned, xpType)
end)
else
-- Remove a random number of required materials from the player's inventory
local randomItem = requiredItems[math.random(#requiredItems)]
local randomAmount = math.random(1, randomItem.amount)
TriggerServerEvent('qb-crafting:server:removeMaterials', randomItem.item, randomAmount)
QBCore.Functions.Notify('Crafting failed, some materials have been lost!', 'error')
end
else
QBCore.Functions.Progressbar('crafting_item', 'Crafting ' .. QBCore.Shared.Items[craftedItem].label, (math.random(2000, 5000) * amountToCraft), false, true, {
disableMovement = true,
disableCarMovement = true,
disableMouse = false,
disableCombat = true,
}, {
animDict = 'mini@repair',
anim = 'fixing_a_player',
flags = 16,
}, {}, {}, function()
TriggerServerEvent('qb-crafting:server:receiveItem', craftedItem, requiredItems, amountToCraft, xpEarned, xpType)
end)
end
else
QBCore.Functions.Notify(string.format(Lang:t('notifications.notenoughMaterials')), 'error')
end
end)
end
local function CraftAmount(craftedItem, requiredItems, xpGain, xpType)
local dialog = exports['qb-input']:ShowInput({
header = string.format(Lang:t('menus.entercraftAmount')),
submitText = 'Confirm',
inputs = {
{
type = 'number',
name = 'amount',
label = 'Amount',
text = 'Enter Amount',
isRequired = true
},
},
})
if dialog and tonumber(dialog.amount) then
local amount = tonumber(dialog.amount)
if amount > 0 then
local multipliedItems = {}
for _, reqItem in ipairs(requiredItems) do
multipliedItems[#multipliedItems + 1] = {
item = reqItem.item,
amount = reqItem.amount * amount
}
end
CraftItem(craftedItem, multipliedItems, amount, xpGain, xpType)
else
QBCore.Functions.Notify(string.format(Lang:t('notifications.invalidAmount')), 'error')
end
else
QBCore.Functions.Notify(string.format(Lang:t('notifications.invalidInput')), 'error')
end
end
local function OpenCraftingMenu(benchType)
local PlayerData = QBCore.Functions.GetPlayerData()
local xpType = benchType == 'item_bench' and Config.item_bench.xpType or Config.attachment_bench.xpType
local recipes = benchType == 'item_bench' and Config.item_bench.recipes or Config.attachment_bench.recipes
local currentXP = PlayerData.metadata[xpType]
QBCore.Functions.TriggerCallback('crafting:getPlayerInventory', function(inventory)
local craftableItems = {}
local nonCraftableItems = {}
for _, recipe in pairs(recipes) do
if currentXP >= recipe.xpRequired then
local canCraft = true
local itemsText = ''
for _, reqItem in pairs(recipe.requiredItems) do
local hasItem = false
for _, invItem in pairs(inventory) do
if invItem.name == reqItem.item and invItem.amount >= reqItem.amount then
hasItem = true
break
end
end
local itemLabel = QBCore.Shared.Items[reqItem.item].label
itemsText = itemsText .. ' x' .. tostring(reqItem.amount) .. ' ' .. itemLabel .. '<br>'
if not hasItem then
canCraft = false
end
end
itemsText = string.sub(itemsText, 1, -5)
local menuItem = {
header = QBCore.Shared.Items[recipe.item].label,
txt = itemsText,
icon = Config.ImageBasePath .. QBCore.Shared.Items[recipe.item].image,
params = {
isAction = true,
event = function()
CraftAmount(recipe.item, recipe.requiredItems, recipe.xpGain, xpType)
end,
args = {}
},
disabled = not canCraft
}
if canCraft then
craftableItems[#craftableItems + 1] = menuItem
else
nonCraftableItems[#nonCraftableItems + 1] = menuItem
end
end
end
local menuItems = {
{
header = string.format(Lang:t('menus.header')),
icon = 'fas fa-drafting-compass',
isMenuHeader = true,
}
}
for _, item in ipairs(craftableItems) do
menuItems[#menuItems + 1] = item
end
for _, item in ipairs(nonCraftableItems) do
menuItems[#menuItems + 1] = item
end
exports['qb-menu']:openMenu(menuItems)
end)
end
local function PickupBench(benchType)
local playerPed = PlayerPedId()
local propHash = Config[benchType].object
local entity = GetClosestObjectOfType(GetEntityCoords(playerPed), 3.0, propHash, false, false, false)
if DoesEntityExist(entity) then
DeleteEntity(entity)
TriggerServerEvent('qb-crafting:server:addCraftingTable', benchType)
QBCore.Functions.Notify(string.format(Lang:t('notifications.pickupBench')), 'success')
end
end
-- Events
RegisterNetEvent('qb-crafting:client:useCraftingTable', function(benchType)
local playerPed = PlayerPedId()
local coordsP = GetOffsetFromEntityInWorldCoords(playerPed, 0.0, 1.0, 1.0)
local playerHeading = GetEntityHeading(PlayerPedId())
local itemHeading = playerHeading - 90
local workbench = CreateObject(Config[benchType].object, coordsP, true, true, true)
if itemHeading < 0 then itemHeading = 360 + itemHeading end
SetEntityHeading(workbench, itemHeading)
PlaceObjectOnGroundProperly(workbench)
TriggerServerEvent('qb-crafting:server:removeCraftingTable', benchType)
exports['qb-target']:AddTargetEntity(Config[benchType].object, {
options = {
{
icon = 'fas fa-tools',
label = string.format(Lang:t('menus.header')),
action = function()
OpenCraftingMenu(benchType)
end
},
{
event = 'crafting:pickupWorkbench',
icon = 'fas fa-hand-rock',
label = string.format(Lang:t('menus.pickupworkBench')),
action = function()
PickupBench(benchType)
end,
}
},
distance = 2.5
})
end)