Scripts/resources/[qb]/[qb_shops]/qb-pawnshop/client/main.lua
2024-12-29 21:06:22 +01:00

335 lines
11 KiB
Lua

local QBCore = exports['qb-core']:GetCoreObject()
local isMelting = false
local canTake = false
local meltTime
local meltedItem = {}
CreateThread(function()
for _, value in pairs(Config.PawnLocation) do
local blip = AddBlipForCoord(value.coords.x, value.coords.y, value.coords.z)
SetBlipSprite(blip, 431)
SetBlipDisplay(blip, 4)
SetBlipScale(blip, 0.7)
SetBlipAsShortRange(blip, true)
SetBlipColour(blip, 5)
BeginTextCommandSetBlipName('STRING')
AddTextComponentSubstringPlayerName(Lang:t('info.title'))
EndTextCommandSetBlipName(blip)
end
end)
CreateThread(function()
if Config.UseTarget then
for key, value in pairs(Config.PawnLocation) do
exports['qb-target']:AddBoxZone('PawnShop'..key, value.coords, value.length, value.width, {
name = 'PawnShop'..key,
heading = value.heading,
minZ = value.minZ,
maxZ = value.maxZ,
debugPoly = value.debugPoly,
}, {
options = {
{
type = 'client',
event = 'qb-pawnshop:client:openMenu',
icon = 'fas fa-ring',
label = 'Pawn Shop',
},
},
distance = value.distance
})
end
else
local zone = {}
for key, value in pairs(Config.PawnLocation) do
zone[#zone+1] = BoxZone:Create(value.coords, value.length, value.width, {
name = 'PawnShop'..key,
heading = value.heading,
minZ = value.minZ,
maxZ = value.maxZ,
})
end
local pawnShopCombo = ComboZone:Create( zone, { name = 'NewPawnShopCombo', debugPoly = false })
pawnShopCombo:onPlayerInOut(function(isPointInside)
if isPointInside then
exports['qb-menu']:showHeader({
{
header = Lang:t('info.title'),
txt = Lang:t('info.open_pawn'),
params = {
event = 'qb-pawnshop:client:openMenu'
}
}
})
else
exports['qb-menu']:closeMenu()
end
end)
end
end)
RegisterNetEvent('qb-pawnshop:client:openMenu', function()
if Config.UseTimes then
if GetClockHours() >= Config.TimeOpen and GetClockHours() <= Config.TimeClosed then
local pawnShop = {
{
header = Lang:t('info.title'),
isMenuHeader = true,
},
{
header = Lang:t('info.sell'),
txt = Lang:t('info.sell_pawn'),
params = {
event = 'qb-pawnshop:client:openPawn',
args = {
items = Config.PawnItems
}
}
}
}
if not isMelting then
pawnShop[#pawnShop + 1] = {
header = Lang:t('info.melt'),
txt = Lang:t('info.melt_pawn'),
params = {
event = 'qb-pawnshop:client:openMelt',
args = {
items = Config.MeltingItems
}
}
}
end
if canTake then
pawnShop[#pawnShop + 1] = {
header = Lang:t('info.melt_pickup'),
txt = '',
params = {
isServer = true,
event = 'qb-pawnshop:server:pickupMelted',
args = {
items = meltedItem
}
}
}
end
exports['qb-menu']:openMenu(pawnShop)
else
QBCore.Functions.Notify(Lang:t('info.pawn_closed', { value = Config.TimeOpen, value2 = Config.TimeClosed }))
end
else
local pawnShop = {
{
header = Lang:t('info.title'),
isMenuHeader = true,
},
{
header = Lang:t('info.sell'),
txt = Lang:t('info.sell_pawn'),
params = {
event = 'qb-pawnshop:client:openPawn',
args = {
items = Config.PawnItems
}
}
}
}
if not isMelting then
pawnShop[#pawnShop + 1] = {
header = Lang:t('info.melt'),
txt = Lang:t('info.melt_pawn'),
params = {
event = 'qb-pawnshop:client:openMelt',
args = {
items = Config.MeltingItems
}
}
}
end
if canTake then
pawnShop[#pawnShop + 1] = {
header = Lang:t('info.melt_pickup'),
txt = '',
params = {
isServer = true,
event = 'qb-pawnshop:server:pickupMelted',
args = {
items = meltedItem
}
}
}
end
exports['qb-menu']:openMenu(pawnShop)
end
end)
RegisterNetEvent('qb-pawnshop:client:openPawn', function(data)
QBCore.Functions.TriggerCallback('qb-pawnshop:server:getInv', function(inventory)
local PlyInv = inventory
local pawnMenu = {
{
header = Lang:t('info.title'),
isMenuHeader = true,
}
}
for _, v in pairs(PlyInv) do
for i = 1, #data.items do
if v.name == data.items[i].item then
pawnMenu[#pawnMenu + 1] = {
header = QBCore.Shared.Items[v.name].label,
txt = Lang:t('info.sell_items', { value = data.items[i].price }),
params = {
event = 'qb-pawnshop:client:pawnitems',
args = {
label = QBCore.Shared.Items[v.name].label,
price = data.items[i].price,
name = v.name,
amount = v.amount
}
}
}
end
end
end
pawnMenu[#pawnMenu + 1] = {
header = Lang:t('info.back'),
params = {
event = 'qb-pawnshop:client:openMenu'
}
}
exports['qb-menu']:openMenu(pawnMenu)
end)
end)
RegisterNetEvent('qb-pawnshop:client:openMelt', function(data)
QBCore.Functions.TriggerCallback('qb-pawnshop:server:getInv', function(inventory)
local PlyInv = inventory
local meltMenu = {
{
header = Lang:t('info.melt'),
isMenuHeader = true,
}
}
for _, v in pairs(PlyInv) do
for i = 1, #data.items do
if v.name == data.items[i].item then
meltMenu[#meltMenu + 1] = {
header = QBCore.Shared.Items[v.name].label,
txt = Lang:t('info.melt_item', { value = QBCore.Shared.Items[v.name].label }),
params = {
event = 'qb-pawnshop:client:meltItems',
args = {
label = QBCore.Shared.Items[v.name].label,
reward = data.items[i].rewards,
name = v.name,
amount = v.amount,
time = data.items[i].meltTime
}
}
}
end
end
end
meltMenu[#meltMenu + 1] = {
header = Lang:t('info.back'),
params = {
event = 'qb-pawnshop:client:openMenu'
}
}
exports['qb-menu']:openMenu(meltMenu)
end)
end)
RegisterNetEvent('qb-pawnshop:client:pawnitems', function(item)
local sellingItem = exports['qb-input']:ShowInput({
header = Lang:t('info.title'),
submitText = Lang:t('info.sell'),
inputs = {
{
type = 'number',
isRequired = false,
name = 'amount',
text = Lang:t('info.max', { value = item.amount })
}
}
})
if sellingItem then
if not sellingItem.amount then
return
end
if tonumber(sellingItem.amount) > 0 then
TriggerServerEvent('qb-pawnshop:server:sellPawnItems', item.name, sellingItem.amount, item.price)
else
QBCore.Functions.Notify(Lang:t('error.negative'), 'error')
end
end
end)
RegisterNetEvent('qb-pawnshop:client:meltItems', function(item)
local meltingItem = exports['qb-input']:ShowInput({
header = Lang:t('info.melt'),
submitText = Lang:t('info.submit'),
inputs = {
{
type = 'number',
isRequired = false,
name = 'amount',
text = Lang:t('info.max', { value = item.amount })
}
}
})
if meltingItem then
if not meltingItem.amount then
return
end
if meltingItem.amount ~= nil then
if tonumber(meltingItem.amount) > 0 then
TriggerServerEvent('qb-pawnshop:server:meltItemRemove', item.name, meltingItem.amount, item)
else
QBCore.Functions.Notify(Lang:t('error.no_melt'), 'error')
end
else
QBCore.Functions.Notify(Lang:t('error.no_melt'), 'error')
end
end
end)
RegisterNetEvent('qb-pawnshop:client:startMelting', function(item, meltingAmount, meltTimees)
if not isMelting then
isMelting = true
meltTime = meltTimees
meltedItem = {}
CreateThread(function()
while isMelting do
if LocalPlayer.state.isLoggedIn then
meltTime = meltTime - 1
if meltTime <= 0 then
canTake = true
isMelting = false
table.insert(meltedItem, { item = item, amount = meltingAmount })
if Config.SendMeltingEmail then
TriggerServerEvent('qb-phone:server:sendNewMail', {
sender = Lang:t('info.title'),
subject = Lang:t('info.subject'),
message = Lang:t('info.message'),
button = {}
})
else
QBCore.Functions.Notify(Lang:t('info.message'), 'success')
end
end
else
break
end
Wait(1000)
end
end)
end
end)
RegisterNetEvent('qb-pawnshop:client:resetPickup', function()
canTake = false
end)