171 lines
8.6 KiB
Lua
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)
|