485 lines
19 KiB
Lua
485 lines
19 KiB
Lua
|
QBCore = exports['qb-core']:GetCoreObject()
|
||
|
|
||
|
|
||
|
function getPlayerChips(source)
|
||
|
local Player = QBCore.Functions.GetPlayer(source)
|
||
|
if Player then
|
||
|
if Player.Functions.GetItemByName('casino_redchip') ~= nil then
|
||
|
return Player.Functions.GetItemByName('casino_redchip').amount
|
||
|
else
|
||
|
return 0
|
||
|
end
|
||
|
else
|
||
|
return 0
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function giveChips(source, amount)
|
||
|
local Player = QBCore.Functions.GetPlayer(source)
|
||
|
if Player then
|
||
|
Player.Functions.AddItem("casino_redchip", amount, nil, nil, false, GetCurrentResourceName(), "", "", "")
|
||
|
TriggerClientEvent('inventory:client:ItemBox', source, QBCore.Shared.Items['casino_redchip'], "add", amount)
|
||
|
updatePlayerChips(source)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function removeChips(source, amount)
|
||
|
local Player = QBCore.Functions.GetPlayer(source)
|
||
|
if Player then
|
||
|
Player.Functions.RemoveItem("casino_redchip", amount)
|
||
|
TriggerClientEvent('inventory:client:ItemBox', source, QBCore.Shared.Items['casino_redchip'], "remove", amount)
|
||
|
updatePlayerChips(source)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
--//////////////////////////--//////////////////////////--//////////////////////////
|
||
|
|
||
|
ServerPokers = {}
|
||
|
|
||
|
RegisterNetEvent('aquiverPoker:standUp')
|
||
|
RegisterNetEvent('aquiverPoker:betPlayer')
|
||
|
RegisterNetEvent('aquiverPoker:playCards')
|
||
|
RegisterNetEvent('aquiverPoker:foldCards')
|
||
|
RegisterNetEvent('aquiverPoker:betPairPlusPlayer')
|
||
|
|
||
|
AddEventHandler(
|
||
|
'aquiverPoker:foldCards',
|
||
|
function(tableId)
|
||
|
local source = source
|
||
|
if ServerPokers[tableId] ~= nil then
|
||
|
ServerPokers[tableId].PlayersFolded[source] = true
|
||
|
TriggerClientEvent('aquiverPoker:playerFoldCards', -1, source, tableId)
|
||
|
end
|
||
|
end
|
||
|
)
|
||
|
AddEventHandler(
|
||
|
'aquiverPoker:playCards',
|
||
|
function(tableId, bettedAmount)
|
||
|
local source = source
|
||
|
local Player = QBCore.Functions.GetPlayer(source)
|
||
|
if Player then
|
||
|
if ServerPokers[tableId] ~= nil then
|
||
|
if getPlayerChips(source) >= bettedAmount then
|
||
|
TriggerClientEvent('aquiverPoker:playerPlayCards', -1, source, tableId)
|
||
|
removeChips(source, bettedAmount)
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', source, _U('not_enough_chips_toplay'), 'error')
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
)
|
||
|
|
||
|
AddEventHandler(
|
||
|
'aquiverPoker:standUp',
|
||
|
function(tableId, chairId)
|
||
|
local source = source
|
||
|
if ServerPokers[tableId] ~= nil and ServerPokers[tableId].ChairsUsed[chairId] ~= nil then
|
||
|
ServerPokers[tableId].ChairsUsed[chairId] = nil
|
||
|
Config.DebugMsg('player standup')
|
||
|
end
|
||
|
end
|
||
|
)
|
||
|
|
||
|
AddEventHandler(
|
||
|
'aquiverPoker:betPairPlusPlayer',
|
||
|
function(tableId, betAmount)
|
||
|
local source = source
|
||
|
local Player = QBCore.Functions.GetPlayer(source)
|
||
|
if Player then
|
||
|
if ServerPokers[tableId] ~= nil then
|
||
|
if ServerPokers[tableId].PairPlusBets[source] == nil then
|
||
|
if getPlayerChips(source) < betAmount then
|
||
|
TriggerClientEvent('QBCore:Notify', source, _U('not_enough_chips'), 'error')
|
||
|
return
|
||
|
end
|
||
|
|
||
|
-- checking if he is able to bet the pair plus without lowering the bets < 0
|
||
|
local currentAnteBetAmount = getPlayerBetAmount(source, tableId)
|
||
|
if getPlayerChips(source) < (currentAnteBetAmount + betAmount) then
|
||
|
TriggerClientEvent('QBCore:Notify', source, _U('not_enough_chips_next'), 'error')
|
||
|
return
|
||
|
end
|
||
|
|
||
|
----------------
|
||
|
|
||
|
if ServerPokers[tableId].TimeLeft ~= nil and ServerPokers[tableId].TimeLeft > 0 then
|
||
|
ServerPokers[tableId].PairPlusBets[source] = betAmount
|
||
|
TriggerClientEvent('aquiverPoker:playerPairPlusAnim', Player.PlayerData.source, betAmount)
|
||
|
removeChips(source, betAmount)
|
||
|
end
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', source, _U('already_betted'), 'error')
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
)
|
||
|
|
||
|
AddEventHandler(
|
||
|
'aquiverPoker:betPlayer',
|
||
|
function(tableId, chairData, betAmount)
|
||
|
local source = source
|
||
|
local Player = QBCore.Functions.GetPlayer(source)
|
||
|
if Player then
|
||
|
if ServerPokers[tableId] ~= nil then
|
||
|
if ServerPokers[tableId].PlayerBets[source] == nil then
|
||
|
if getPlayerChips(source) < betAmount then
|
||
|
TriggerClientEvent('QBCore:Notify', source, _U('not_enough_chips'), 'error')
|
||
|
|
||
|
return
|
||
|
end
|
||
|
|
||
|
-- check the doubled value of the bet for the play deny
|
||
|
if getPlayerChips(source) < betAmount * 2 then
|
||
|
TriggerClientEvent('QBCore:Notify', source, _U('not_enough_chips_third'), 'error')
|
||
|
return
|
||
|
end
|
||
|
|
||
|
---------------------
|
||
|
if ServerPokers[tableId].Active == false then -- really important here
|
||
|
-- important to have it after
|
||
|
ServerPokers[tableId].TimeLeft = Config.TimeLeftAfter
|
||
|
ServerPokers[tableId].Active = true
|
||
|
TriggerClientEvent('aquiverPoker:updateState', -1, tableId, ServerPokers[tableId].Active, ServerPokers[tableId].TimeLeft)
|
||
|
end
|
||
|
|
||
|
------------------------------------------
|
||
|
|
||
|
if ServerPokers[tableId].TimeLeft ~= nil and ServerPokers[tableId].TimeLeft > 0 then
|
||
|
ServerPokers[tableId].PlayerBets[source] = betAmount
|
||
|
TriggerClientEvent('aquiverPoker:playerBetAnim', Player.PlayerData.source, betAmount)
|
||
|
removeChips(source, betAmount)
|
||
|
|
||
|
if ServerPokers[tableId].Cards['dealer'] == nil then -- generating dealer hands if not exist
|
||
|
ServerPokers[tableId].Cards['dealer'] = {
|
||
|
Hand = generateHand(tableId)
|
||
|
}
|
||
|
end
|
||
|
|
||
|
if ServerPokers[tableId].Cards[source] == nil then -- generating player hands if not exist
|
||
|
ServerPokers[tableId].Cards[source] = {
|
||
|
Hand = generateHand(tableId),
|
||
|
chairData = chairData
|
||
|
}
|
||
|
end
|
||
|
|
||
|
TriggerClientEvent('aquiverPoker:updateCards', -1, tableId, ServerPokers[tableId].Cards)
|
||
|
end
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', source, _U('already_betted'), 'error')
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
)
|
||
|
|
||
|
-- generating hand function
|
||
|
function generateHand(tableId)
|
||
|
local handTable = {}
|
||
|
|
||
|
if ServerPokers[tableId] ~= nil then
|
||
|
for i = 1, 3, 1 do
|
||
|
local randomCard = math.random(1, #Config.Cards)
|
||
|
|
||
|
while ServerPokers[tableId].UsedCards[randomCard] ~= nil do
|
||
|
randomCard = math.random(1, #Config.Cards)
|
||
|
end
|
||
|
|
||
|
ServerPokers[tableId].UsedCards[randomCard] = true
|
||
|
handTable[i] = randomCard
|
||
|
end
|
||
|
|
||
|
return handTable
|
||
|
end
|
||
|
end
|
||
|
|
||
|
Citizen.CreateThread(
|
||
|
function()
|
||
|
while true do
|
||
|
Citizen.Wait(1000)
|
||
|
|
||
|
for tableId, _ in pairs(ServerPokers) do
|
||
|
if ServerPokers[tableId].Active then
|
||
|
if ServerPokers[tableId].TimeLeft > 0 then
|
||
|
ServerPokers[tableId].TimeLeft = ServerPokers[tableId].TimeLeft - 1
|
||
|
TriggerClientEvent('aquiverPoker:updateState', -1, tableId, ServerPokers[tableId].Active, ServerPokers[tableId].TimeLeft)
|
||
|
|
||
|
if ServerPokers[tableId].TimeLeft < 1 then
|
||
|
if ServerPokers[tableId].Stage == 0 then
|
||
|
Citizen.CreateThread(
|
||
|
function()
|
||
|
TriggerClientEvent('aquiverPoker:Stage:1', -1, tableId) -- first ACTION
|
||
|
|
||
|
Citizen.Wait(9000)
|
||
|
|
||
|
TriggerClientEvent('aquiverPoker:Stage:2', -1, tableId) -- dealing PLAYER cards
|
||
|
|
||
|
local activePlayers = getTablePlayersCount(tableId)
|
||
|
Config.DebugMsg(string.format('Active poker players: %s', activePlayers))
|
||
|
|
||
|
Citizen.Wait(4000 * activePlayers)
|
||
|
|
||
|
TriggerClientEvent('aquiverPoker:Stage:3', -1, tableId) -- dealing DEALER cards
|
||
|
|
||
|
Citizen.Wait(8000)
|
||
|
|
||
|
TriggerClientEvent('aquiverPoker:Stage:4', -1, tableId) -- PLAYERS watching cards
|
||
|
|
||
|
Citizen.Wait((Config.PlayerDecideTime * 1000) + 5000)
|
||
|
|
||
|
TriggerClientEvent('aquiverPoker:Stage:5', -1, tableId) -- reveal PLAYER cards
|
||
|
|
||
|
local activePlayers = getTablePlayersCount(tableId)
|
||
|
Citizen.Wait(2000 + (5000 * activePlayers))
|
||
|
|
||
|
TriggerClientEvent('aquiverPoker:Stage:6', -1, tableId) -- reveal DEALER cards
|
||
|
Citizen.Wait(10000)
|
||
|
CheckWinners(tableId) -- checking winners on server side
|
||
|
Citizen.Wait(1500)
|
||
|
|
||
|
TriggerClientEvent('aquiverPoker:Stage:7', -1, tableId) -- clearing table
|
||
|
|
||
|
Citizen.Wait(8000 + (4000 * activePlayers))
|
||
|
|
||
|
TriggerClientEvent('aquiverPoker:resetTable', -1, tableId)
|
||
|
ServerPokers[tableId].PlayerBets = {}
|
||
|
ServerPokers[tableId].Active = false
|
||
|
ServerPokers[tableId].Cards = {}
|
||
|
ServerPokers[tableId].UsedCards = {}
|
||
|
ServerPokers[tableId].Stage = 0
|
||
|
ServerPokers[tableId].TimeLeft = nil
|
||
|
ServerPokers[tableId].PlayersFolded = {}
|
||
|
ServerPokers[tableId].PairPlusBets = {}
|
||
|
end
|
||
|
)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
)
|
||
|
|
||
|
function CheckWinners(tableId)
|
||
|
if ServerPokers[tableId] ~= nil then
|
||
|
local dealerHand = 0
|
||
|
local dealerHand_second = 0
|
||
|
local dealerHand_third = 0
|
||
|
|
||
|
-- dh means dealerhand
|
||
|
local dH = ServerPokers[tableId].Cards['dealer']
|
||
|
if dH then
|
||
|
dealerHand = Config.getHandAllValues(dH.Hand)
|
||
|
dealerHand_second = Config.getHandAllValues(dH.Hand, true, false)
|
||
|
dealerHand_third = Config.getHandAllValues(dH.Hand, false, true)
|
||
|
end
|
||
|
|
||
|
Config.DebugMsg(string.format('Dealer hand value: %s', dealerHand))
|
||
|
|
||
|
for targetSrc, data in pairs(ServerPokers[tableId].Cards) do
|
||
|
if targetSrc ~= 'dealer' and playerStillExist(targetSrc) then
|
||
|
-- check that the player folded their hand or not
|
||
|
if ServerPokers[tableId].PlayersFolded[targetSrc] == nil then
|
||
|
local playerHand = Config.getHandAllValues(data.Hand)
|
||
|
local playerHand_second = Config.getHandAllValues(data.Hand, true, false)
|
||
|
local playerHand_third = Config.getHandAllValues(data.Hand, false, true)
|
||
|
|
||
|
if Config.canDealerPlay(dealerHand) then
|
||
|
if playerHand > dealerHand then -- win
|
||
|
playerWon(targetSrc, tableId, playerHand)
|
||
|
elseif playerHand < dealerHand then -- lose
|
||
|
playerLost(targetSrc, tableId, playerHand)
|
||
|
elseif playerHand == dealerHand then
|
||
|
if playerHand_second == dealerHand_second then -- if equals going more
|
||
|
if playerHand_third > dealerHand_third then
|
||
|
playerWon(targetSrc, tableId, playerHand)
|
||
|
elseif playerHand_third == dealerHand_third then
|
||
|
playerDraw(targetSrc, tableId, playerHand)
|
||
|
else
|
||
|
playerLost(targetSrc, tableId, playerHand)
|
||
|
end
|
||
|
elseif playerHand_second > dealerHand_second then -- if bigger then win
|
||
|
playerWon(targetSrc, tableId, playerHand)
|
||
|
else
|
||
|
playerLost(targetSrc, tableId, playerHand)
|
||
|
end
|
||
|
end
|
||
|
else
|
||
|
playerDraw(targetSrc, tableId, playerHand)
|
||
|
Config.DebugMsg('Díler kártyái nem játszottak.')
|
||
|
end
|
||
|
|
||
|
local pairMultiplier = Config.GetPairMultiplier(playerHand)
|
||
|
if pairMultiplier > 0 then
|
||
|
playerPairPlusWon(targetSrc, tableId, pairMultiplier)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function playerPairPlusWon(targetSrc, tableId, pairMultiplier)
|
||
|
local betAmount = getPlayerPairPlusBetAmount(targetSrc, tableId)
|
||
|
if betAmount > 0 then
|
||
|
local Player = QBCore.Functions.GetPlayer(targetSrc)
|
||
|
if Player then
|
||
|
local plusChips = math.floor(betAmount * pairMultiplier)
|
||
|
if plusChips > 0 then
|
||
|
TriggerClientEvent('QBCore:Notify', targetSrc, _('pair_won', plusChips, pairMultiplier), 'error')
|
||
|
giveChips(targetSrc, plusChips)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
function playerWon(targetSrc, tableId, handValue)
|
||
|
local betAmount = getPlayerBetAmount(targetSrc, tableId)
|
||
|
if betAmount > 0 then
|
||
|
local Player = QBCore.Functions.GetPlayer(targetSrc)
|
||
|
if Player then
|
||
|
local plusChips = math.floor((betAmount * 2) * 2)
|
||
|
|
||
|
local AnteMultiplier = Config.GetAnteMultiplier(handValue)
|
||
|
if AnteMultiplier > 0 then
|
||
|
plusChips = math.floor(plusChips + (AnteMultiplier * betAmount))
|
||
|
TriggerClientEvent('QBCore:Notify', targetSrc, _('player_won_ante', plusChips, AnteMultiplier), 'error')
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', targetSrc, _('player_won', plusChips), 'error')
|
||
|
end
|
||
|
|
||
|
giveChips(targetSrc, plusChips)
|
||
|
|
||
|
TriggerClientEvent('aquiverPoker:playerWin', targetSrc, tableId)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function playerDraw(targetSrc, tableId, handValue)
|
||
|
local betAmount = getPlayerBetAmount(targetSrc, tableId)
|
||
|
if betAmount > 0 then
|
||
|
local plusChips = math.floor(betAmount * 2)
|
||
|
|
||
|
local Player = QBCore.Functions.GetPlayer(targetSrc)
|
||
|
if Player then
|
||
|
-- you will get your ante bet bonus even if you loss or draw
|
||
|
local AnteMultiplier = Config.GetAnteMultiplier(handValue)
|
||
|
if AnteMultiplier > 0 then
|
||
|
plusChips = math.floor(plusChips + ((betAmount / 2) * AnteMultiplier))
|
||
|
TriggerClientEvent('QBCore:Notify', targetSrc, _('dealer_not_qual_ante', plusChips, AnteMultiplier), 'error')
|
||
|
else
|
||
|
TriggerClientEvent('QBCore:Notify', targetSrc, _('dealer_not_qual', plusChips), 'error')
|
||
|
end
|
||
|
end
|
||
|
|
||
|
giveChips(targetSrc, plusChips)
|
||
|
TriggerClientEvent('aquiverPoker:playerDraw', targetSrc, tableId)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function playerLost(targetSrc, tableId, handValue)
|
||
|
local betAmount = getPlayerBetAmount(targetSrc, tableId)
|
||
|
if betAmount > 0 then
|
||
|
local Player = QBCore.Functions.GetPlayer(targetSrc)
|
||
|
if Player then
|
||
|
TriggerClientEvent('QBCore:Notify', targetSrc, _U('lose'), 'error')
|
||
|
end
|
||
|
TriggerClientEvent('aquiverPoker:playerLost', targetSrc, tableId)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function updatePlayerChips(targetSrc)
|
||
|
TriggerClientEvent('aquiverPoker:updatePlayerChips', targetSrc, getPlayerChips(targetSrc))
|
||
|
end
|
||
|
|
||
|
function getPlayerPairPlusBetAmount(targetSrc, tableId)
|
||
|
if ServerPokers[tableId] ~= nil then
|
||
|
if ServerPokers[tableId].PairPlusBets ~= nil and ServerPokers[tableId].PairPlusBets[targetSrc] ~= nil then
|
||
|
return ServerPokers[tableId].PairPlusBets[targetSrc]
|
||
|
end
|
||
|
end
|
||
|
|
||
|
return 0
|
||
|
end
|
||
|
|
||
|
function getPlayerBetAmount(targetSrc, tableId)
|
||
|
if ServerPokers[tableId] ~= nil then
|
||
|
if ServerPokers[tableId].PlayerBets ~= nil and ServerPokers[tableId].PlayerBets[targetSrc] ~= nil then
|
||
|
return ServerPokers[tableId].PlayerBets[targetSrc]
|
||
|
end
|
||
|
end
|
||
|
|
||
|
return 0
|
||
|
end
|
||
|
|
||
|
function playerStillExist(source)
|
||
|
if GetPlayerName(source) == nil then
|
||
|
return false
|
||
|
else
|
||
|
return true
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function getTablePlayersCount(tableId)
|
||
|
local playersCount = 0
|
||
|
if ServerPokers[tableId] ~= nil then
|
||
|
for targetSrc, _ in pairs(ServerPokers[tableId].Cards) do
|
||
|
if playerStillExist(targetSrc) then
|
||
|
playersCount = playersCount + 1
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
return playersCount
|
||
|
end
|
||
|
|
||
|
QBCore.Functions.CreateCallback(
|
||
|
'aquiverPoker:sitDown',
|
||
|
function(source, cb, tableId, chairId)
|
||
|
if ServerPokers[tableId] == nil then
|
||
|
ServerPokers[tableId] = {
|
||
|
ChairsUsed = {}, -- chairs used, for disable sitting
|
||
|
PlayerBets = {}, -- player bets ofc.
|
||
|
Active = false,
|
||
|
Cards = {}, -- player / dealer cards, etc.
|
||
|
UsedCards = {}, -- which card was used, so we can not pick the same
|
||
|
PlayersFolded = {}, -- following who folded their cards
|
||
|
PairPlusBets = {},
|
||
|
Stage = 0, -- following the stages
|
||
|
TimeLeft = nil
|
||
|
}
|
||
|
end
|
||
|
|
||
|
if ServerPokers[tableId].ChairsUsed[chairId] == nil then
|
||
|
ServerPokers[tableId].ChairsUsed[chairId] = source
|
||
|
Config.DebugMsg('player sit down')
|
||
|
updatePlayerChips(source)
|
||
|
cb(true)
|
||
|
else
|
||
|
cb(false)
|
||
|
end
|
||
|
end
|
||
|
)
|
||
|
|
||
|
AddEventHandler(
|
||
|
'playerDropped',
|
||
|
function(reason)
|
||
|
local source = source
|
||
|
|
||
|
for k, v in pairs(ServerPokers) do
|
||
|
if v.ChairsUsed ~= nil then
|
||
|
for chairId, chairOwner in pairs(v.ChairsUsed) do
|
||
|
if chairOwner == source then
|
||
|
ServerPokers[k].ChairsUsed[chairId] = nil
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
)
|