Scripts/resources/[qb]/[qb_casino]/casino-slots/server.lua
2024-12-29 21:03:28 +01:00

171 lines
8.6 KiB
Lua

local QBCore = exports['qb-core']:GetCoreObject()
local UsedSlots = {}
local Slots = {}
local function table_matches(t1, t2)
local type1, type2 = type(t1), type(t2)
if type1 ~= type2 then return false end
if type1 ~= 'table' and type2 ~= 'table' then return t1 == t2 end
for k1,v1 in pairs(t1) do
local v2 = t2[k1]
if v2 == nil or not table_matches(v1,v2) then return false end
end
for k2,v2 in pairs(t2) do
local v1 = t1[k2]
if v1 == nil or not table_matches(v1,v2) then return false end
end
return true
end
local function LeaveSlot(source)
if not Slots[source] then return end
if DoesEntityExist(Slots[source].Reel1) then DeleteEntity(Slots[source].Reel1) end
if DoesEntityExist(Slots[source].Reel2) then DeleteEntity(Slots[source].Reel2) end
if DoesEntityExist(Slots[source].Reel3) then DeleteEntity(Slots[source].Reel3) end
UsedSlots[Slots[source].SlotNetID] = false
Slots[source] = {}
end
RegisterNetEvent('dc-casino:slots:server:enter', function(netID, ReelLocation1, ReelLocation2, ReelLocation3)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
local PlayerCoords = GetEntityCoords(GetPlayerPed(src))
local SlotEntity = NetworkGetEntityFromNetworkId(netID)
local SlotModel = GetEntityModel(SlotEntity)
local SlotCoords = GetEntityCoords(SlotEntity)
if not SlotReferences[SlotModel] then return end
if #(PlayerCoords - SlotCoords) > 4 then return end
if #(SlotCoords - ReelLocation1) > 2 or #(SlotCoords - ReelLocation2) > 2 or #(SlotCoords - ReelLocation2) > 2 then return end
if UsedSlots[netID] then return end
UsedSlots[netID] = true
TriggerClientEvent('dc-casino:slots:client:enter', src)
SetTimeout(1000, function()
local ReelEntity1 = CreateObject(SlotReferences[SlotModel].reela, ReelLocation1, true, false, false)
local ReelEntity2 = CreateObject(SlotReferences[SlotModel].reela, ReelLocation2, true, false, false)
local ReelEntity3 = CreateObject(SlotReferences[SlotModel].reela, ReelLocation3, true, false, false)
while not DoesEntityExist(ReelEntity1) do Wait(0) end
while not DoesEntityExist(ReelEntity2) do Wait(0) end
while not DoesEntityExist(ReelEntity3) do Wait(0) end
Slots[src] = {
Slot = NetworkGetEntityFromNetworkId(netID),
SlotNetID = netID,
Reel1 = ReelEntity1,
Reel2 = ReelEntity2,
Reel3 = ReelEntity3,
ReelLoc1 = ReelLocation1,
ReelLoc2 = ReelLocation2,
ReelLoc3 = ReelLocation3,
}
FreezeEntityPosition(Slots[src].Reel1, true)
FreezeEntityPosition(Slots[src].Reel2, true)
FreezeEntityPosition(Slots[src].Reel3, true)
local SlotHeading = GetEntityHeading(SlotEntity)
SetEntityRotation(Slots[src].Reel1, 0.0, 0.0, SlotHeading, 2, 1)
SetEntityRotation(Slots[src].Reel2, 0.0, 0.0, SlotHeading, 2, 1)
SetEntityRotation(Slots[src].Reel3, 0.0, 0.0, SlotHeading, 2, 1)
-- TriggerEvent('qb-log:server:CreateLog', 'casino', 'Casino Slots', 'green', string.format("**%s** (CitizenID: %s | ID: %s) - Entered a slot | Slot NetID %s | Slot Locations %s | Reel Locations %s %s %s | Player Location %s | Slot Model %s",
-- GetPlayerName(src), Player.PlayerData.citizenid, src, netID, SlotCoords, ReelLocation1, ReelLocation2, ReelLocation3, PlayerCoords, SlotModel))
end)
end)
RegisterNetEvent('dc-casino:slots:server:spin', function(ChosenBetAmount)
local src = source
local SpinTime = math.random(4000, 6000)
local ReelRewards = {math.random(0, 15), math.random(0, 15), math.random(0, 15)}
local SlotHeading = GetEntityHeading(Slots[src].Slot)
local SlotModel = GetEntityModel(Slots[src].Slot)
local Player = QBCore.Functions.GetPlayer(src)
if not Slots[src] then return end
if not SlotReferences[SlotModel].betamounts[ChosenBetAmount] then return end
if UseCash and Player.Functions.RemoveMoney('cash', SlotReferences[SlotModel].betamounts[ChosenBetAmount], 'Casino Slot Spin')
or UseBank and Player.Functions.RemoveMoney('bank', SlotReferences[SlotModel].betamounts[ChosenBetAmount], 'Casino Slot Spin')
-- luacheck: ignore
or UseItem and Player.Functions.RemoveItem(ItemName, SlotReferences[SlotModel].betamounts[ChosenBetAmount]) then TriggerClientEvent('inventory:client:ItemBox', src, QBCore.Shared.Items['casino_redchip'], "remove", ChosenBetAmount)
else TriggerClientEvent('QBCore:Notify', src, 'Nothing left to bet with', 'error') return end
for i = 1, #ReelRewards do
if SlotReferences[SlotModel].misschance > math.random(1, 100) then ReelRewards[i] = ReelRewards[i] + math.random(4, 6) / 10 end
end
local BlurryReel1 = CreateObject(SlotReferences[SlotModel].reelb, Slots[src].ReelLoc1, true, false, false)
local BlurryReel2 = CreateObject(SlotReferences[SlotModel].reelb, Slots[src].ReelLoc2, true, false, false)
local BlurryReel3 = CreateObject(SlotReferences[SlotModel].reelb, Slots[src].ReelLoc3, true, false, false)
while not DoesEntityExist(BlurryReel1) do Wait(0) end
while not DoesEntityExist(BlurryReel2) do Wait(0) end
while not DoesEntityExist(BlurryReel3) do Wait(0) end
FreezeEntityPosition(BlurryReel1, true)
FreezeEntityPosition(BlurryReel2, true)
FreezeEntityPosition(BlurryReel3, true)
SetEntityRotation(BlurryReel1, 0.0, 0.0, SlotHeading, 2, 1)
SetEntityRotation(BlurryReel2, 0.0, 0.0, SlotHeading, 2, 1)
SetEntityRotation(BlurryReel3, 0.0, 0.0, SlotHeading, 2, 1)
local RewardMultiplier = 0
for k, v in pairs(Rewards) do
if table_matches(k, ReelRewards) then
RewardMultiplier = v
break
end
end
if RewardMultiplier == 0 then
for i = 1, #ReelRewards do
if ReelRewards[i] == 4 or ReelRewards[i] == 11 or ReelRewards[i] == 15 then
RewardMultiplier = RewardMultiplier + 1
end
end
RewardMultiplier = SpecialReward[RewardMultiplier] or 0
end
TriggerClientEvent('dc-casino:slots:client:spinreels', src, SpinTime, ReelRewards, NetworkGetNetworkIdFromEntity(BlurryReel1), NetworkGetNetworkIdFromEntity(BlurryReel2), NetworkGetNetworkIdFromEntity(BlurryReel3), NetworkGetNetworkIdFromEntity(Slots[src].Reel1), NetworkGetNetworkIdFromEntity(Slots[src].Reel2), NetworkGetNetworkIdFromEntity(Slots[src].Reel3), RewardMultiplier)
SetTimeout(SpinTime, function()
local RewardAmount = SlotReferences[SlotModel].betamounts[ChosenBetAmount] * RewardMultiplier
-- TriggerEvent('qb-log:server:CreateLog', 'casino', 'Casino Slots', 'green', string.format("**%s** (CitizenID: %s | ID: %s) - Spinned a casino slot for %s and won %s",
-- GetPlayerName(src), Player.PlayerData.citizenid, src, SlotReferences[SlotModel].betamounts[ChosenBetAmount], RewardAmount))
if RewardMultiplier == 0 then return end
if UseCash and Player.Functions.AddMoney('cash', RewardAmount, 'Casino Slot Spin')
or UseBank and Player.Functions.AddMoney('bank', RewardAmount, 'Casino Slot Spin')
-- luacheck: ignore
or UseItem and Player.Functions.AddItem(ItemName, RewardAmount) then
TriggerClientEvent('inventory:client:ItemBox', src, QBCore.Shared.Items['casino_redchip'], "add", RewardAmount)
-- TriggerClientEvent('QBCore:Notify', src, 'You won '..tonumber(RewardAmount)..' chips!', 'success')
end
end)
end)
RegisterNetEvent('dc-casino:slots:server:leave', function()
LeaveSlot(source)
end)
AddEventHandler("playerDropped", function()
LeaveSlot(source)
end)
-- PerformHttpRequest('https://api.github.com/repos/Disabled-Coding/dc-casino/releases/latest', function(_, resultData, _)
-- if not resultData then print('Failed to check for updates') return end
-- local result = json.decode(resultData)
-- if GetResourceMetadata(GetCurrentResourceName(), 'version') ~= result.tag_name then
-- print('New version of '..GetCurrentResourceName()..' is available!')
-- end
-- end)
local ItemList = {
["casino_redchip"] = 1
}
QBCore.Functions.CreateCallback('doj:server:CasinoChipsAmount', function(source, cb)
local retval = 0
local Player = QBCore.Functions.GetPlayer(source)
if Player.PlayerData.items ~= nil and next(Player.PlayerData.items) ~= nil then
for k, v in pairs(Player.PlayerData.items) do
if Player.PlayerData.items[k] ~= nil then
if ItemList[Player.PlayerData.items[k].name] ~= nil then
retval = retval + (ItemList[Player.PlayerData.items[k].name] * Player.PlayerData.items[k].amount)
end
end
end
end
cb(retval)
end)