forked from Simnation/Main
151 lines
6.4 KiB
Lua
151 lines
6.4 KiB
Lua
![]() |
local players = {}
|
||
|
local totalSumChance = 0
|
||
|
|
||
|
local QBCore = exports['qb-core']:GetCoreObject()
|
||
|
|
||
|
CreateThread(function()
|
||
|
for _,priceInfo in pairs(Config.Prices) do
|
||
|
totalSumChance = totalSumChance + priceInfo['chance']
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
QBCore.Functions.CreateUseableItem('scratch_ticket', function(source)
|
||
|
local _source = source
|
||
|
DebugPrint(('%s just used a scratching ticket.'):format(GetPlayerName(_source)))
|
||
|
TriggerClientEvent("dr-scratching:isActiveCooldown", source)
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent("dr-scratching:handler", function(returncooldown, cooldown)
|
||
|
local _source <const> = source
|
||
|
local tempsrc <const> = tonumber(_source)
|
||
|
local playerName, playerIdentifier = GetPlayerName(_source), GetPlayerIdentifier(_source, 0)
|
||
|
local xPlayer <const> = QBCore.Functions.GetPlayer(_source)
|
||
|
local count <const> = xPlayer.Functions.GetItemByName('scratch_ticket').amount
|
||
|
local randomNumber <const> = math.random(1, totalSumChance)
|
||
|
local add = 0
|
||
|
if returncooldown then
|
||
|
if Config.ShowCooldownNotifications then
|
||
|
TriggerClientEvent('QBCore:Notify', _source, 'You scratched a scratching ticket too recently, active cooldown of ' .. cooldown .. ' more seconds', 'error', cooldown > 30 and 5000 or cooldown * 1000)
|
||
|
end
|
||
|
DebugPrint(("Active cooldown for %s (%s). Stopped. Cooldown: %s"):format(playerName, playerIdentifier, cooldown))
|
||
|
return
|
||
|
end
|
||
|
|
||
|
if count >= 1 then
|
||
|
xPlayer.Functions.RemoveItem('scratch_ticket', 1)
|
||
|
DebugPrint(('Succesfully removed scratching ticket of %s (%s).'):format(playerName, playerIdentifier))
|
||
|
TriggerClientEvent("dr-scratching:setCooldown", _source)
|
||
|
if Config.ShowUsedTicketNotification then
|
||
|
TriggerClientEvent('QBCore:Notify', _source, 'Succesfully used a scratching ticket', 'success')
|
||
|
end
|
||
|
else
|
||
|
sendWebhook(playerName, playerIdentifier, "important", "Player triggered event without having said scratching ticket")
|
||
|
Print(("%s (%s) somehow used a scratching ticket without having one. Possible cheating attempt."):format(playerName, playerIdentifier))
|
||
|
return
|
||
|
end
|
||
|
|
||
|
TriggerClientEvent("dr-scratching:startScratchingEmote", _source)
|
||
|
|
||
|
for key,priceInfo in pairs(Config.Prices) do
|
||
|
local chance = priceInfo['chance']
|
||
|
if randomNumber > add and randomNumber <= add + chance then
|
||
|
local price_is_item = priceInfo['price']['item']['price_is_item']
|
||
|
local amount = priceInfo['price']['item']['item_amount']
|
||
|
local price_type, price = nil
|
||
|
|
||
|
if not price_is_item then
|
||
|
price = priceInfo['price']['price_money']
|
||
|
price_type = 'money'
|
||
|
else
|
||
|
price = priceInfo['price']['item']['item_name']
|
||
|
price_type = 'item'
|
||
|
price_label = priceInfo['price']['item']['item_label']
|
||
|
end
|
||
|
players[tempsrc] = tostring(price)
|
||
|
TriggerClientEvent("dr-scratching:nuiOpenCard", _source, key, price, amount, price_type, price_label)
|
||
|
return price
|
||
|
end
|
||
|
add = add + chance
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent("dr-scratching:deposit", function(key, price, amount, type)
|
||
|
local _source = source
|
||
|
local playerName, playerIdentifier = GetPlayerName(_source), GetPlayerIdentifier(_source, 0)
|
||
|
local xPlayer = QBCore.Functions.GetPlayer(_source)
|
||
|
local tempsrc = tonumber(_source)
|
||
|
local giveItem = false
|
||
|
local giveMoney = false
|
||
|
local priceAmount = nil
|
||
|
|
||
|
if players[tempsrc] ~= tostring(price) then
|
||
|
sendWebhook(playerName, playerIdentifier, "important", "Player triggered event with a non matching price assigned to name. Assigned price: " .. players[tempsrc] .. " Requested price: " .. tostring(price) .. ". Possible unauthorized event trigger")
|
||
|
Print(("%s (%s) somehow managed to trigger the deposit event with a non-matching price matching to his/her name. Assigned price: %s - Requested price: %s Possible cheating attempt."):format(resourceName, playerName, playerIdentifier, players[tempsrc], tostring(price)))
|
||
|
players[tempsrc] = nil
|
||
|
return
|
||
|
end
|
||
|
|
||
|
if type == 'money' then
|
||
|
local winningAmount = tonumber(price)
|
||
|
|
||
|
if winningAmount == nil or winningAmount < 0 then
|
||
|
sendWebhook(playerName, playerIdentifier, "important", "Invalid price provided, provided money price: " .. winningAmount)
|
||
|
Print(("%s (%s) Invalid price provided. Possible cheating attempt. Provided price: %s"):format(playerName, playerIdentifier, winningAmount))
|
||
|
players[tempsrc] = nil
|
||
|
return
|
||
|
end
|
||
|
|
||
|
giveMoney = true
|
||
|
else
|
||
|
giveItem = true
|
||
|
end
|
||
|
|
||
|
for priceKey,priceInfo in pairs(Config.Prices) do
|
||
|
if priceKey == key then
|
||
|
priceAmount = priceInfo["price"]["item"]["item_amount"]
|
||
|
|
||
|
if Config.ShowResultTicketNotification then
|
||
|
TriggerClientEvent('QBCore:Notify', _source, priceInfo['message'])
|
||
|
end
|
||
|
|
||
|
if type == 'item' and giveItem then
|
||
|
if tonumber(amount) == tonumber(priceAmount) then
|
||
|
local priceCheck = priceInfo["price"]["item"]["item_name"]
|
||
|
if priceCheck == price then
|
||
|
DebugPrint(("Succesfully added price (item: %sx %s) to %s (%s)"):format(priceAmount, price, playerName, playerIdentifier))
|
||
|
xPlayer.Functions.AddItem(price, priceAmount)
|
||
|
else
|
||
|
Print("??? Cheat")
|
||
|
end
|
||
|
end
|
||
|
elseif type == 'money' and giveMoney then
|
||
|
if tonumber(amount) == priceAmount then
|
||
|
if tonumber(price) > 0 then
|
||
|
DebugPrint(("Succesfully added price (money: %s) to %s (%s)"):format(price, playerName, playerIdentifier))
|
||
|
xPlayer.Functions.AddMoney("cash", tonumber(price))
|
||
|
else
|
||
|
DebugPrint(("Succesfully added no price to %s (%s)"):format(playerName, playerIdentifier))
|
||
|
end
|
||
|
end
|
||
|
else
|
||
|
sendWebhook(playerName, playerIdentifier, "important", "Player managed to trigger deposit event with a non-matching money amount. Possible unauthorized event trigger")
|
||
|
Print(("%s (%s) somehow managed to trigger the deposit event with a non-matching amount. Possible cheating attempt."):format(playerName, playerIdentifier))
|
||
|
players[tempsrc] = nil
|
||
|
return
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
sendWebhook(playerName, playerIdentifier, type, price, priceAmount)
|
||
|
players[tempsrc] = nil
|
||
|
return
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent("dr-scratching:stopScratching", function(price, amount, type)
|
||
|
local _source = source
|
||
|
local playerName, playerIdentifier = GetPlayerName(_source), GetPlayerIdentifier(_source, 0)
|
||
|
local tempsrc = tonumber(_source)
|
||
|
|
||
|
sendWebhook(playerName, playerIdentifier, type, price, amount, "early")
|
||
|
players[tempsrc] = nil
|
||
|
return
|
||
|
end)
|