Scripts/resources/[qb]/[qb_casino]/casino-roulette/client/cl_main.lua

1363 lines
51 KiB
Lua
Raw Normal View History

2024-12-29 20:03:28 +00:00
local QBCore = exports['qb-core']:GetCoreObject()
SITTING_SCENE = nil
CURRENT_CHAIR_DATA = nil
SELECTED_CHAIR_ID = nil
selectedRulett = nil
Rulettek = {}
closetoRulett = false
currentBetAmount = 0
idleTimer = 0
aimingAtBet = -1
lastAimedBet = -1
---------------------------------------------------------
-- local rouletteTables = {
-- 'vw_prop_casino_roulette_01',
-- 'vw_prop_casino_roulette_01b'
-- }
-- Citizen.CreateThread(function()
-- while true do
-- for i=1, #rouletteTables do
-- local coords = GetEntityCoords(PlayerPedId(), false)
-- local gate = GetClosestObjectOfType(coords.x, coords.y, coords.z, 250.0, GetHashKey(rouletteTables[i]), 0, 0, 0)
-- if gate ~= 0 then
-- SetEntityAsMissionEntity(gate, 1, 1)
-- DeleteObject(gate)
-- SetEntityAsNoLongerNeeded(gate)
-- end
-- end
-- Citizen.Wait(2500)
-- end
-- end)
-- CreateThread(function()
-- local removeOldRouletteTables = CircleZone:Create(vector3(993.005, 55.232, 69.435), 12.0, {
-- name="OldRouletteTables",
-- heading=160,
-- debugPoly=true,
-- useZ=true,
-- })
-- removeOldRouletteTables:onPlayerInOut(function(isPointInside)
-- if isPointInside then
-- -- local table = `vw_prop_casino_roulette_01`
-- local table = GetHashKey('vw_prop_casino_roulette_01b')
-- RequestModel(table)
-- SetEntityAsMissionEntity(table, 1, 1)
-- DeleteObject(table)
-- SetEntityAsNoLongerNeeded(table)
-- QBCore.Functions.Notify('Remove: '..table,'success')
-- else
-- end
-- end)
-- end)
---------------------------------------------------------
createRulettAsztal = function(index, data)
local self = {}
self.index = index
self.data = data
Config.DebugMsg(string.format('Rulett table creating.. %s', self.index))
RequestModel(GetHashKey('vw_prop_casino_roulette_01'))
while not HasModelLoaded(GetHashKey('vw_prop_casino_roulette_01')) do
Wait(1)
end
self.tableObject = CreateObject(GetHashKey('vw_prop_casino_roulette_01'), data.position, false)
SetEntityHeading(self.tableObject, data.rot)
RequestModel(GetHashKey('S_F_Y_Casino_01'))
while not HasModelLoaded(GetHashKey('S_F_Y_Casino_01')) do
Wait(1)
end
local pedOffset = GetObjectOffsetFromCoords(data.position.x, data.position.y, data.position.z, data.rot, 0.0, 0.7, 1.0)
self.ped = CreatePed(2, GetHashKey('S_F_Y_Casino_01'), pedOffset, data.rot + 180.0, false, true)
SetEntityCanBeDamaged(self.ped, 0)
SetPedAsEnemy(self.ped, 0)
SetBlockingOfNonTemporaryEvents(self.ped, 1)
SetPedResetFlag(self.ped, 249, 1)
SetPedConfigFlag(self.ped, 185, true)
SetPedConfigFlag(self.ped, 108, true)
SetPedCanEvasiveDive(self.ped, 0)
SetPedCanRagdollFromPlayerImpact(self.ped, 0)
SetPedConfigFlag(self.ped, 208, true)
-- 1.0.1
SetPedVoiceGroup(self.ped, 'S_M_Y_Casino_01_WHITE_01')
addRandomClothes(self.ped)
TaskPlayAnim(self.ped, 'anim_casino_b@amb@casino@games@roulette@dealer_female', 'idle', 3.0, 3.0, -1, 2, 0, true, true, true)
self.numbersData = {}
self.betData = {}
self.hoverObjects = {}
self.betObjects = {}
self.ballObject = nil
self.rulettCam = nil
self.cameraMode = 1
self.enableCamera = function(state)
if state then
self.speakPed('MINIGAME_DEALER_GREET')
TriggerEvent('ShowPlayerHud', false)
-- SendNUIMessage(
-- {
-- action = 'showRulettNui',
-- state = true
-- }
-- )
-- SendNUIMessage(
-- {
-- action = 'setBetAmount',
-- amount = currentBetAmount
-- }
-- )
casinoNuiUpdateGame(self.index, self.ido, self.statusz)
Config.DebugMsg('creating camera..')
local rot = vector3(270.0, -90.0, self.data.rot + 270.0)
self.rulettCam =
CreateCamWithParams('DEFAULT_SCRIPTED_CAMERA', self.data.position.x, self.data.position.y, self.data.position.z + 2.0, rot.x, rot.y, rot.z, 80.0, true, 2)
SetCamActive(self.rulettCam, true)
RenderScriptCams(true, 900, 900, true, false)
Config.DebugMsg('camera setted active.')
selectedRulett = self.index
self.betRenderState(true)
playRulettIdle()
CreateThread(function()
while selectedRulett ~= nil do
Wait(1000)
if idleTimer ~= nil then
idleTimer = idleTimer - 1
if idleTimer < 1 then
Config.DebugMsg('start idle')
idleTimer = nil
playRulettIdle()
end
end
end
end)
CreateThread(function()
while selectedRulett ~= nil do
Wait(1)
if self.betObjects then
for i = 1, #self.betObjects, 1 do
local bet = self.betObjects[i]
if DoesEntityExist(bet.obj) then
local coords = GetEntityCoords(bet.obj)
if bet.playerSrc == GetPlayerServerId(PlayerId()) then
Draw3DText(coords, string.format('~w~%s', bet.betAmount), 0.10, 0)
end
end
end
end
end
end)
CreateThread(function()
while selectedRulett ~= nil do
Wait(125)
if IsDisabledControlPressed(0, 172) then
currentBetAmount = currentBetAmount + 10
changeBetAmount(currentBetAmount)
-- QBCore.Functions.Notify('+'..currentBetAmount.." bet [raised]",'success')
elseif IsDisabledControlPressed(0, 173) then
if currentBetAmount > 0 then
currentBetAmount = currentBetAmount - 10
if currentBetAmount < 0 then
currentBetAmount = 0
end
changeBetAmount(currentBetAmount)
-- QBCore.Functions.Notify('-'..currentBetAmount.." bet [lowered]",'primary')
end
end
end
end)
CreateThread(function()
while selectedRulett ~= nil do
Wait(0)
DisableAllControlActions(0)
if IsDisabledControlJustPressed(0, 202) then
self.enableCamera(false)
end
if IsDisabledControlJustPressed(0, 38) then
self.changeKameraMode()
end
if Config.allowCustomBet then
if IsDisabledControlJustPressed(0, 22) then --Custom Bet [space]
local tmpInput = getGenericTextInput('How many chips you would like to bet?')
if tonumber(tmpInput) then
tmpInput = tonumber(tmpInput)
if tmpInput > 0 then
changeBetAmount(tmpInput)
QBCore.Functions.Notify('Custom Bet: '..currentBetAmount..' chips','success')
end
end
end
else
end
end
end)
Wait(1000)
else
TriggerServerEvent('casino:rulett:notUsing', selectedRulett)
if DoesCamExist(self.rulettCam) then
DestroyCam(self.rulettCam, false)
end
RenderScriptCams(false, 900, 900, true, false)
self.betRenderState(false)
Config.DebugMsg('camera deleted.')
selectedRulett = nil
self.speakPed('MINIGAME_DEALER_LEAVE_NEUTRAL_GAME')
NetworkStopSynchronisedScene(SITTING_SCENE)
local endingDict = 'anim_casino_b@amb@casino@games@shared@player@'
RequestAnimDict(endingDict)
while not HasAnimDictLoaded(endingDict) do
Wait(1)
end
local whichAnim = nil
if SELECTED_CHAIR_ID == 1 then
whichAnim = 'sit_exit_left'
elseif SELECTED_CHAIR_ID == 2 then
whichAnim = 'sit_exit_right'
elseif SELECTED_CHAIR_ID == 3 then
whichAnim = ({'sit_exit_left', 'sit_exit_right'})[math.random(1, 2)]
elseif SELECTED_CHAIR_ID == 4 then
whichAnim = 'sit_exit_left'
end
TaskPlayAnim(PlayerPedId(), endingDict, whichAnim, 1.0, 1.0, 2500, 0)
SetPlayerControl(PlayerId(), 0, 0)
hideUi()
Wait(3600)
SetPlayerControl(PlayerId(), 1, 0)
end
end
self.changeKameraMode = function()
if DoesCamExist(self.rulettCam) then
if self.cameraMode == 1 then
DoScreenFadeOut(200)
while not IsScreenFadedOut() do
Wait(1)
end
self.cameraMode = 2
local camOffset = GetOffsetFromEntityInWorldCoords(self.tableObject, -1.45, -0.15, 1.45)
SetCamCoord(self.rulettCam, camOffset)
SetCamRot(self.rulettCam, -25.0, 0.0, self.data.rot + 270.0, 2)
SetCamFov(self.rulettCam, 40.0)
ShakeCam(self.rulettCam, 'HAND_SHAKE', 0.3)
DoScreenFadeIn(200)
elseif self.cameraMode == 2 then
DoScreenFadeOut(200)
while not IsScreenFadedOut() do
Wait(1)
end
self.cameraMode = 3
local camOffset = GetOffsetFromEntityInWorldCoords(self.tableObject, 1.45, -0.15, 2.15)
SetCamCoord(self.rulettCam, camOffset)
SetCamRot(self.rulettCam, -58.0, 0.0, self.data.rot + 90.0, 2)
ShakeCam(self.rulettCam, 'HAND_SHAKE', 0.3)
SetCamFov(self.rulettCam, 80.0)
DoScreenFadeIn(200)
elseif self.cameraMode == 3 then
DoScreenFadeOut(200)
while not IsScreenFadedOut() do
Wait(1)
end
self.cameraMode = 4
local camOffset = GetWorldPositionOfEntityBone(self.tableObject, GetEntityBoneIndexByName(self.tableObject, 'Roulette_Wheel'))
local rot = vector3(270.0, -90.0, self.data.rot + 270.0)
SetCamCoord(self.rulettCam, camOffset + vector3(0.0, 0.0, 0.5))
SetCamRot(self.rulettCam, rot, 2)
StopCamShaking(self.rulettCam, false)
SetCamFov(self.rulettCam, 80.0)
DoScreenFadeIn(200)
elseif self.cameraMode == 4 then
DoScreenFadeOut(200)
while not IsScreenFadedOut() do
Wait(1)
end
self.cameraMode = 1
local rot = vector3(270.0, -90.0, self.data.rot + 270.0)
SetCamCoord(self.rulettCam, self.data.position + vector3(0.0, 0.0, 2.0))
SetCamRot(self.rulettCam, rot, 2)
SetCamFov(self.rulettCam, 80.0)
StopCamShaking(self.rulettCam, false)
DoScreenFadeIn(200)
end
end
end
self.loadTableData = function()
Config.DebugMsg('Table data creating, loading..')
self.numbersData = {}
self.betData = {}
local e = 1
for i = 0, 11, 1 do
for j = 0, 2, 1 do
table.insert(
self.numbersData,
{
name = e + 1,
hoverPos = GetOffsetFromEntityInWorldCoords(self.tableObject, (0.081 * i) - 0.057, (0.167 * j) - 0.192, 0.9448),
hoverObject = 'vw_prop_vw_marker_02a'
}
)
local offset = nil
if j == 0 then
offset = 0.155
elseif j == 1 then
offset = 0.171
elseif j == 2 then
offset = 0.192
end
table.insert(
self.betData,
{
betId = e,
name = e + 1,
pos = GetOffsetFromEntityInWorldCoords(self.tableObject, (0.081 * i) - 0.057, (0.167 * j) - 0.192, 0.9448),
objectPos = GetOffsetFromEntityInWorldCoords(self.tableObject, 0.081 * i - 0.057, 0.167 * j - 0.192, 0.9448),
hoverNumbers = {e}
}
)
e = e + 1
end
end
table.insert(
self.numbersData,
{
name = 'Zero',
hoverPos = GetOffsetFromEntityInWorldCoords(self.tableObject, -0.137, -0.148, 0.9448),
hoverObject = 'vw_prop_vw_marker_01a'
}
)
table.insert(
self.betData,
{
betId = #self.betData,
name = 'Zero',
pos = GetOffsetFromEntityInWorldCoords(self.tableObject, -0.137, -0.148, 0.9448),
objectPos = GetOffsetFromEntityInWorldCoords(self.tableObject, -0.137, -0.148, 0.9448),
hoverNumbers = {#self.numbersData}
}
)
table.insert(
self.numbersData,
{
name = 'Double Zero',
hoverPos = GetOffsetFromEntityInWorldCoords(self.tableObject, -0.133, 0.107, 0.9448),
hoverObject = 'vw_prop_vw_marker_01a'
}
)
table.insert(
self.betData,
{
betId = #self.betData,
name = 'Double Zero',
pos = GetOffsetFromEntityInWorldCoords(self.tableObject, -0.133, 0.107, 0.9448),
objectPos = GetOffsetFromEntityInWorldCoords(self.tableObject, -0.133, 0.107, 0.9448),
hoverNumbers = {#self.numbersData}
}
)
table.insert(
self.betData,
{
betId = #self.betData,
name = 'RED',
pos = GetOffsetFromEntityInWorldCoords(self.tableObject, 0.3, -0.4, 0.9448),
objectPos = GetOffsetFromEntityInWorldCoords(self.tableObject, 0.3, -0.4, 0.9448),
hoverNumbers = {1, 3, 5, 7, 9, 12, 14, 16, 18, 19, 21, 23, 25, 27, 30, 32, 34, 36}
}
)
table.insert(
self.betData,
{
betId = #self.betData,
name = 'BLACK',
pos = GetOffsetFromEntityInWorldCoords(self.tableObject, 0.5, -0.4, 0.9448),
objectPos = GetOffsetFromEntityInWorldCoords(self.tableObject, 0.5, -0.4, 0.9448),
hoverNumbers = {0, 2, 4, 6, 8, 9, 11, 13, 15, 18, 20, 22, 24, 26, 27, 29, 31, 33, 35}
}
)
table.insert(
self.betData,
{
betId = #self.betData,
name = 'EVEN',
pos = GetOffsetFromEntityInWorldCoords(self.tableObject, 0.15, -0.4, 0.9448),
objectPos = GetOffsetFromEntityInWorldCoords(self.tableObject, 0.15, -0.4, 0.9448),
hoverNumbers = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36}
}
)
table.insert(
self.betData,
{
betId = #self.betData,
name = 'ODD',
pos = GetOffsetFromEntityInWorldCoords(self.tableObject, 0.65, -0.4, 0.9448),
objectPos = GetOffsetFromEntityInWorldCoords(self.tableObject, 0.65, -0.4, 0.9448),
hoverNumbers = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35}
}
)
table.insert(
self.betData,
{
betId = #self.betData,
name = '1to18',
pos = GetOffsetFromEntityInWorldCoords(self.tableObject, -0.02, -0.4, 0.9448),
objectPos = GetOffsetFromEntityInWorldCoords(self.tableObject, -0.02, -0.4, 0.9448),
hoverNumbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18}
}
)
table.insert(
self.betData,
{
betId = #self.betData,
name = '19to36',
pos = GetOffsetFromEntityInWorldCoords(self.tableObject, 0.78, -0.4, 0.9448),
objectPos = GetOffsetFromEntityInWorldCoords(self.tableObject, 0.78, -0.4, 0.9448),
hoverNumbers = {19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36}
}
)
table.insert(
self.betData,
{
betId = #self.betData,
name = '1st 12',
pos = GetOffsetFromEntityInWorldCoords(self.tableObject, 0.05, -0.3, 0.9448),
objectPos = GetOffsetFromEntityInWorldCoords(self.tableObject, 0.05, -0.3, 0.9448),
hoverNumbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}
}
)
table.insert(
self.betData,
{
betId = #self.betData,
name = '2nd 12',
pos = GetOffsetFromEntityInWorldCoords(self.tableObject, 0.4, -0.3, 0.9448),
objectPos = GetOffsetFromEntityInWorldCoords(self.tableObject, 0.4, -0.3, 0.9448),
hoverNumbers = {13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24}
}
)
table.insert(
self.betData,
{
betId = #self.betData,
name = '3rd 12',
pos = GetOffsetFromEntityInWorldCoords(self.tableObject, 0.75, -0.3, 0.9448),
objectPos = GetOffsetFromEntityInWorldCoords(self.tableObject, 0.75, -0.3, 0.9448),
hoverNumbers = {25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36}
}
)
table.insert(
self.betData,
{
betId = #self.betData,
name = '2to1',
pos = GetOffsetFromEntityInWorldCoords(self.tableObject, 0.91, -0.15, 0.9448),
objectPos = GetOffsetFromEntityInWorldCoords(self.tableObject, 0.91, -0.15, 0.9448),
hoverNumbers = {1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34}
}
)
table.insert(
self.betData,
{
betId = #self.betData,
name = '2to1',
pos = GetOffsetFromEntityInWorldCoords(self.tableObject, 0.91, 0.0, 0.9448),
objectPos = GetOffsetFromEntityInWorldCoords(self.tableObject, 0.91, 0.0, 0.9448),
hoverNumbers = {2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35}
}
)
table.insert(
self.betData,
{
betId = #self.betData,
name = '2to1',
pos = GetOffsetFromEntityInWorldCoords(self.tableObject, 0.91, 0.15, 0.9448),
objectPos = GetOffsetFromEntityInWorldCoords(self.tableObject, 0.91, 0.15, 0.9448),
hoverNumbers = {3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36}
}
)
Config.DebugMsg('Table data successfully created..')
end
self.speakPed = function(speakName)
PlayPedAmbientSpeechNative(self.ped, speakName, 'SPEECH_PARAMS_FORCE_NORMAL_CLEAR', 1)
end
self.createBetObjects = function(bets)
for i = 1, #self.betObjects, 1 do
if DoesEntityExist(self.betObjects[i].obj) then
DeleteObject(self.betObjects[i].obj)
end
end
self.betObjects = {}
local existBetId = {}
for i = 1, #bets, 1 do
local t = self.betData[bets[i].betId]
if existBetId[bets[i].betId] == nil then
existBetId[bets[i].betId] = 0
else
existBetId[bets[i].betId] = existBetId[bets[i].betId] + 1
end
if t ~= nil then
local betModelObject = getBetObjectType(bets[i].betAmount)
if betModelObject ~= nil then
RequestModel(betModelObject)
while not HasModelLoaded(betModelObject) do
Wait(0)
end
local obj = CreateObject(betModelObject, t.objectPos.x, t.objectPos.y, t.objectPos.z + (existBetId[bets[i].betId] * 0.0081), false)
SetEntityHeading(obj, self.data.rot)
table.insert(
self.betObjects,
{
obj = obj,
betAmount = bets[i].betAmount,
playerSrc = bets[i].playerSrc
}
)
end
end
end
end
self.hoverNumbers = function(hoveredNumbers)
for i = 1, #self.hoverObjects, 1 do
if DoesEntityExist(self.hoverObjects[i]) then
DeleteObject(self.hoverObjects[i])
end
end
self.hoverObjects = {}
for i = 1, #hoveredNumbers, 1 do
local t = self.numbersData[hoveredNumbers[i]]
if t ~= nil then
RequestModel(GetHashKey(t.hoverObject))
while not HasModelLoaded(GetHashKey(t.hoverObject)) do
Wait(1)
end
local obj = CreateObject(GetHashKey(t.hoverObject), t.hoverPos, false)
SetEntityHeading(obj, self.data.rot)
table.insert(self.hoverObjects, obj)
end
end
end
self.betRenderState = function(state)
enabledBetRender = state
Config.DebugMsg('Bet rendering turned: %s', enabledBetRender)
if state then
CreateThread(
function()
while enabledBetRender do
Wait(8)
if aimingAtBet ~= -1 and lastAimedBet ~= aimingAtBet then
Config.DebugMsg('aimed at different bet.')
lastAimedBet = aimingAtBet
local bettingData = self.betData[aimingAtBet]
if bettingData ~= nil then
self.hoverNumbers(bettingData.hoverNumbers)
else
self.hoverNumbers({})
end
end
if aimingAtBet == -1 and lastAimedBet ~= -1 then
self.hoverNumbers({})
end
end
end
)
CreateThread(
function()
while enabledBetRender do
Wait(0)
ShowCursorThisFrame()
local e = Rulettek[selectedRulett]
if e ~= nil then
local cx, cy = GetNuiCursorPosition()
local rx, ry = GetActiveScreenResolution()
local n = 30 -- this is for the cursor point, how much to tolerate in range, increasing it you will find it easier to click on the bets.
local foundBet = false
for i = 1, #self.betData, 1 do
local bettingData = self.betData[i]
local onScreen, screenX, screenY = World3dToScreen2d(bettingData.pos.x, bettingData.pos.y, bettingData.pos.z)
local l = math.sqrt(math.pow(screenX * rx - cx, 2) + math.pow(screenY * ry - cy, 2))
if l < n then
aimingAtBet = i
foundBet = true
if IsDisabledControlJustPressed(0, 24) then
if currentBetAmount > 0 then
if Config.RulettTables[selectedRulett] ~= nil then
if currentBetAmount >= Config.RulettTables[selectedRulett].minBet and currentBetAmount <= Config.RulettTables[selectedRulett].maxBet then
PlaySoundFrontend(-1, 'DLC_VW_BET_DOWN', 'dlc_vw_table_games_frontend_sounds', true)
TriggerServerEvent('casino:taskBetRulett', selectedRulett, aimingAtBet, currentBetAmount)
else
QBCore.Functions.Notify('Your bet it too low or too high for this table.','error')
end
end
else
QBCore.Functions.Notify('Bet needs to be raised','error')
end
end
end
end
if not foundBet then
aimingAtBet = -1
end
end
end
end
)
end
end
self.spinRulett = function(tickRate)
Config.DebugMsg(self.index)
if DoesEntityExist(self.tableObject) and DoesEntityExist(self.ped) then
Config.DebugMsg('spinRulett event 1')
self.speakPed('MINIGAME_DEALER_CLOSED_BETS')
TaskPlayAnim(self.ped, 'anim_casino_b@amb@casino@games@roulette@dealer_female', 'no_more_bets', 3.0, 3.0, -1, 0, 0, true, true, true)
Wait(1500)
if DoesEntityExist(self.ballObject) then
DeleteObject(self.ballObject)
end
TaskPlayAnim(self.ped, 'anim_casino_b@amb@casino@games@roulette@dealer_female', 'spin_wheel', 3.0, 3.0, -1, 0, 0, true, true, true)
RequestModel(GetHashKey('vw_prop_roulette_ball'))
while not HasModelLoaded(GetHashKey('vw_prop_roulette_ball')) do
Wait(1)
end
local ballOffset = GetWorldPositionOfEntityBone(self.tableObject, GetEntityBoneIndexByName(self.tableObject, 'Roulette_Wheel'))
Config.DebugMsg('spinRulett event 2')
local LIB = 'anim_casino_b@amb@casino@games@roulette@table'
RequestAnimDict(LIB)
while not HasAnimDictLoaded(LIB) do
Wait(1)
end
Wait(3000)
self.ballObject = CreateObject(GetHashKey('vw_prop_roulette_ball'), ballOffset, false)
SetEntityHeading(self.ballObject, self.data.rot)
SetEntityCoordsNoOffset(self.ballObject, ballOffset, false, false, false)
local h = GetEntityRotation(self.ballObject)
SetEntityRotation(self.ballObject, h.x, h.y, h.z + 90.0, 2, false)
if DoesEntityExist(self.tableObject) and DoesEntityExist(self.ped) then
Config.DebugMsg('spinRulett event 3')
PlayEntityAnim(self.ballObject, 'intro_ball', LIB, 1000.0, false, true, true, 0, 136704)
PlayEntityAnim(self.ballObject, 'loop_ball', LIB, 1000.0, false, true, false, 0, 136704)
PlayEntityAnim(self.tableObject, 'intro_wheel', LIB, 1000.0, false, true, true, 0, 136704)
PlayEntityAnim(self.tableObject, 'loop_wheel', LIB, 1000.0, false, true, false, 0, 136704)
PlayEntityAnim(self.ballObject, string.format('exit_%s_ball', tickRate), LIB, 1000.0, false, true, false, 0, 136704)
PlayEntityAnim(self.tableObject, string.format('exit_%s_wheel', tickRate), LIB, 1000.0, false, true, false, 0, 136704)
Wait(11e3)
if DoesEntityExist(self.tableObject) and DoesEntityExist(self.ped) then
TaskPlayAnim(self.ped, 'anim_casino_b@amb@casino@games@roulette@dealer_female', 'clear_chips_zone1', 3.0, 3.0, -1, 0, 0, true, true, true)
Wait(1500)
TaskPlayAnim(self.ped, 'anim_casino_b@amb@casino@games@roulette@dealer_female', 'clear_chips_zone2', 3.0, 3.0, -1, 0, 0, true, true, true)
Wait(1500)
TaskPlayAnim(self.ped, 'anim_casino_b@amb@casino@games@roulette@dealer_female', 'clear_chips_zone3', 3.0, 3.0, -1, 0, 0, true, true, true)
Wait(2000)
if DoesEntityExist(self.tableObject) and DoesEntityExist(self.ped) then
TaskPlayAnim(self.ped, 'anim_casino_b@amb@casino@games@roulette@dealer_female', 'idle', 3.0, 3.0, -1, 0, 0, true, true, true)
end
Config.DebugMsg('spinRulett event ending')
if DoesEntityExist(self.ballObject) then
DeleteObject(self.ballObject)
end
end
end
end
end
self.loadTableData()
Config.DebugMsg(string.format('Rulett table created %s id', self.index))
Rulettek[self.index] = self
end
function Draw3DText(coords, text, size, font)
coords = vector3(coords.x, coords.y, coords.z)
local camCoords = GetGameplayCamCoords()
local distance = #(coords - camCoords)
if not size then
size = 1
end
if not font then
font = 0
end
local scale = (size / distance) * 2
local fov = (1 / GetGameplayCamFov()) * 100
scale = scale * fov
SetTextScale(0.0 * scale, 0.55 * scale)
SetTextFont(font)
SetTextColour(255, 255, 255, 255)
SetTextDropshadow(0, 0, 0, 0, 255)
SetTextDropShadow()
SetTextOutline()
SetTextCentre(true)
SetDrawOrigin(coords, 0)
BeginTextCommandDisplayText('STRING')
AddTextComponentSubstringPlayerName(text)
EndTextCommandDisplayText(0.0, 0.0)
ClearDrawOrigin()
end
function hideUi()
exports["qb-core"]:HideText()
exports['casinoUi']:HideCasinoUi('hide')
end
function changeBetAmount(amount)
currentBetAmount = amount
PlaySoundFrontend(-1, 'DLC_VW_BET_HIGHLIGHT', 'dlc_vw_table_games_frontend_sounds', true)
end
function getGenericTextInput(type)
if type == nil then
type = ''
end
AddTextEntry('FMMC_MPM_NA', tostring(type))
DisplayOnscreenKeyboard(1, 'FMMC_MPM_NA', tostring(type), '', '', '', '', 30)
while (UpdateOnscreenKeyboard() == 0) do
DisableAllControlActions(0)
Wait(0)
end
if (GetOnscreenKeyboardResult()) then
local result = GetOnscreenKeyboardResult()
if result then
return result
end
end
return false
end
CreateThread(
function()
while true do
local playerCoords = GetEntityCoords(GetPlayerPed(-1))
closetoRulett = false
for k, v in pairs(Config.RulettTables) do
if #(playerCoords - Config.RulettTables[k].position) < 100.0 then
closetoRulett = true
end
end
Wait(1000)
end
end
)
CreateThread(
function()
while not closetoRulett do
Wait(0)
end
for rulettIndex, data in pairs(Config.RulettTables) do
createRulettAsztal(rulettIndex, data)
RequestAnimDict('anim_casino_b@amb@casino@games@roulette@table')
RequestAnimDict('anim_casino_b@amb@casino@games@roulette@dealer_female')
RequestAnimDict('anim_casino_b@amb@casino@games@shared@player@')
RequestAnimDict('anim_casino_b@amb@casino@games@roulette@player')
end
Config.DebugMsg('Casino rulett loaded.')
end
)
-- CreateThread(function()
-- while true do
-- local sleep = 5
-- local playerpos = GetEntityCoords(PlayerPedId())
-- if closetoRulett and selectedRulett == nil then
-- for k, v in pairs(Rulettek) do
-- if DoesEntityExist(v.tableObject) then
-- local objcoords = GetEntityCoords(v.tableObject)
-- local dist = Vdist(playerpos, objcoords)
-- if dist < 2.4 then
-- if dist < 2.3 then
-- -- exports['textUi']:DrawTextUi('show',"Diamond Casino Roulette</p>Press [E] to sit down")
-- exports["qb-core"]:DrawText("<strong>The Diamond Casino & Resort</p>Roulette</strong></p>Press <strong>E</strong> to sit")
-- local closestChairData = getClosestChairData(v.tableObject)
-- if closestChairData == nil then
-- break
-- end
-- if IsControlJustPressed(0, 38) then
-- -- QBCore.Functions.TriggerCallback('doj:server:HasCasinoMembership', function(HasItem)
-- -- if HasItem then
-- TriggerServerEvent('server_remote:rulett:taskSitDown', k, closestChairData)
-- -- else
-- -- QBCore.Functions.Notify('You are not a member of the casino', 'error', 3500)
-- -- end
-- -- end)
-- end
-- break
-- end
-- hideUi()
-- end
-- end
-- end
-- end
-- Wait(sleep)
-- end
-- end)
Citizen.CreateThread(function()
local alreadyEnteredZone = false
local text = nil
while true do
if closetoRulett and selectedRulett == nil then
wait = 5
local inZone = false
local playerpos = GetEntityCoords(PlayerPedId())
for k, v in pairs(Rulettek) do
if DoesEntityExist(v.tableObject) then
local objcoords = GetEntityCoords(v.tableObject)
local dist = Vdist(playerpos, objcoords)
if dist <= 2.0 then
wait = 5
inZone = true
text = "<strong>The Diamond Casino & Resort</p>Roulette</strong></p>Press <strong>E</strong> to sit"
local closestChairData = getClosestChairData(v.tableObject)
if closestChairData == nil then
break
end
if IsControlJustPressed(0, 38) then
TriggerServerEvent('server_remote:rulett:taskSitDown', k, closestChairData)
end
-- break
-- else
-- wait = 2000
end
if inZone and not alreadyEnteredZone then
alreadyEnteredZone = true
exports["qb-core"]:DrawText(text)
end
if not inZone and alreadyEnteredZone then
alreadyEnteredZone = false
exports["qb-core"]:HideText()
end
end
end
end
Wait(wait)
end
end)
RegisterNetEvent('client_callback:rulett:taskSitDown',function(rulettIndex, chairData)
-- exports['progressBars']:drawBar(4000, 'Sitting...')
-- QBCore.Functions.Notify("Sitting...", "primary", 3200)
exports["qb-core"]:HideText()
SELECTED_CHAIR_ID = chairData.chairId
CURRENT_CHAIR_DATA = chairData
SITTING_SCENE = NetworkCreateSynchronisedScene(chairData.position, chairData.rotation, 2, 1, 0, 1065353216, 0, 1065353216)
RequestAnimDict('anim_casino_b@amb@casino@games@shared@player@')
while not HasAnimDictLoaded('anim_casino_b@amb@casino@games@shared@player@') do
Wait(1)
end
local randomSit = ({'sit_enter_left', 'sit_enter_right'})[math.random(1, 2)]
NetworkAddPedToSynchronisedScene(PlayerPedId(), SITTING_SCENE, 'anim_casino_b@amb@casino@games@shared@player@', randomSit, 2.0, -2.0, 13, 16, 2.0, 0)
NetworkStartSynchronisedScene(SITTING_SCENE)
SetPlayerControl(PlayerId(), 0, 0)
startRulett(rulettIndex, chairData.chairId)
Wait(4000)
SetPlayerControl(PlayerId(), 1, 0)
end)
function startRulett(index, chairId)
if Rulettek[index] then
TriggerServerEvent('casino:taskStartRoulette', index, chairId)
end
end
RegisterNetEvent('client:casino:openRulett')
AddEventHandler('client:casino:openRulett',function(rulettIndex)
if Rulettek[rulettIndex] ~= nil then
Wait(4000)
Rulettek[rulettIndex].enableCamera(true)
end
end)
RegisterNetEvent('casino:rulett:startSpin')
AddEventHandler(
'casino:rulett:startSpin',
function(rulettIndex, tickRate)
if Rulettek[rulettIndex] ~= nil then
Config.DebugMsg(string.format('rulett table index: %s, tickrate: %s', rulettIndex, tickRate))
Rulettek[rulettIndex].spinRulett(tickRate)
if selectedRulett == rulettIndex then
Config.DebugMsg('impartial anim play')
playImpartial()
end
end
end
)
RegisterNetEvent('client:rulett:updateStatusz')
AddEventHandler(
'client:rulett:updateStatusz',
function(rulettIndex, ido, statusz)
if Rulettek[rulettIndex] ~= nil then
Rulettek[rulettIndex].ido = ido
Rulettek[rulettIndex].statusz = statusz
casinoNuiUpdateGame(rulettIndex, ido, statusz)
end
end
)
RegisterNetEvent('client:rulett:updateTableBets')
AddEventHandler(
'client:rulett:updateTableBets',
function(rulettIndex, bets)
if Rulettek[rulettIndex] ~= nil then
Rulettek[rulettIndex].createBetObjects(bets)
end
end
)
function casinoNuiUpdateGame(rulettIndex, ido, statusz)
QBCore.Functions.TriggerCallback('roulette:server:ChipsAmount', function(result)
retval = result
if selectedRulett == rulettIndex then
if not statusz then
exports['casinoUi']:DrawCasinoUi('show', "Diamond Casino Roulette</p>Time Left: "..ido.."</p>Current Bet: "..currentBetAmount.."</p>Availble chips: "..math.floor(retval))
if Config.allowCustomBet then
exports["qb-core"]:DrawText("<strong>Place Bet: </strong>LEFT CLICK</p><strong>Adjust Bet: </strong>↑/↓</p><strong>Exit:</strong> ←</p><strong>Custom Amount:</strong> SPACEBAR")
else
exports["qb-core"]:DrawText("<strong>Place Bet: </strong>LEFT CLICK</p><strong>Adjust Bet: </strong>↑/↓</p><strong>Exit:</strong> ←")
end
else
exports["qb-core"]:DrawText("The game is starting..")
hideUi()
end
end
end)
end
function getClosestChairData(tableObject)
local localPlayer = PlayerPedId()
local playerpos = GetEntityCoords(localPlayer)
if DoesEntityExist(tableObject) then
local chairs = {'Chair_Base_01', 'Chair_Base_02', 'Chair_Base_03', 'Chair_Base_04'}
for i = 1, #chairs, 1 do
local objcoords = GetWorldPositionOfEntityBone(tableObject, GetEntityBoneIndexByName(tableObject, chairs[i]))
local dist = Vdist(playerpos, objcoords)
if dist < 1.7 then
return {
position = objcoords,
rotation = GetWorldRotationOfEntityBone(tableObject, GetEntityBoneIndexByName(tableObject, chairs[i])),
chairId = Config.ChairIds[chairs[i]]
}
end
end
end
end
function getBetObjectType(betAmount)
if betAmount < 10 then
return GetHashKey('vw_prop_vw_coin_01a')
elseif betAmount >= 10 and betAmount < 50 then
return GetHashKey('vw_prop_chip_10dollar_x1')
elseif betAmount >= 50 and betAmount < 100 then
return GetHashKey('vw_prop_chip_50dollar_x1')
elseif betAmount >= 100 and betAmount < 500 then
return GetHashKey('vw_prop_chip_100dollar_x1')
elseif betAmount >= 500 and betAmount < 1000 then
return GetHashKey('vw_prop_chip_500dollar_x1')
elseif betAmount >= 1000 and betAmount < 5000 then
return GetHashKey('vw_prop_chip_1kdollar_x1')
elseif betAmount >= 5000 then
return GetHashKey('vw_prop_plaq_10kdollar_x1')
else -- this should never happen, but yeah.
return GetHashKey('vw_prop_plaq_10kdollar_x1')
end
-- these are deprecated, it looks cool, but it hides some data, you can put it in you like the big chip piles.
-- elseif bets[i].betAmount >= 10000 and bets[i].betAmount < 25000 then
-- return GetHashKey('vw_prop_vw_chips_pile_01a')
-- elseif bets[i].betAmount >= 25000 and bets[i].betAmount < 50000 then
-- return GetHashKey('vw_prop_vw_chips_pile_02a')
-- elseif bets[i].betAmount >= 50000 then
-- return GetHashKey('vw_prop_vw_chips_pile_03a')
-- end
end
RegisterNetEvent('client:rulett:playBetAnim')
AddEventHandler(
'client:rulett:playBetAnim',
function(chairId)
local sex = 0
if GetEntityModel(PlayerPedId()) == GetHashKey('mp_f_freemode_01') then
sex = 1
end
local rot = CURRENT_CHAIR_DATA.rotation
if chairId == 4 then
rot = rot + vector3(0.0, 0.0, 90.0)
elseif chairId == 3 then
rot = rot + vector3(0.0, 0.0, -180.0)
elseif chairId == 2 then
rot = rot + vector3(0.0, 0.0, -90.0)
elseif chairId == 1 then
chairId = 1
rot = rot + vector3(0.0, 0.0, -90.0)
end
local L = string.format('anim_casino_b@amb@casino@games@roulette@ped_male@seat_%s@regular@0%sa@play@v01', chairId, chairId)
if sex == 1 then
L = string.format('anim_casino_b@amb@casino@games@roulette@ped_female@seat_%s@regular@0%sa@play@v01', chairId, chairId)
end
RequestAnimDict(L)
while not HasAnimDictLoaded(L) do
Wait(1)
end
if CURRENT_CHAIR_DATA ~= nil then
local currentScene = NetworkCreateSynchronisedScene(CURRENT_CHAIR_DATA.position, rot, 2, 1, 0, 1065353216, 0, 1065353216)
NetworkAddPedToSynchronisedScene(
PlayerPedId(),
currentScene,
L,
({'place_bet_zone1', 'place_bet_zone2', 'place_bet_zone3'})[math.random(1, 3)],
4.0,
-2.0,
13,
16,
1148846080,
0
)
NetworkStartSynchronisedScene(currentScene)
idleTimer = 8
end
end
)
RegisterNetEvent('client:rulett:playWinAnim')
AddEventHandler(
'client:rulett:playWinAnim',
function(chairId)
local rot = CURRENT_CHAIR_DATA.rotation
if chairId == 4 then
rot = rot + vector3(0.0, 0.0, 90.0)
elseif chairId == 3 then
rot = rot + vector3(0.0, 0.0, -180.0)
elseif chairId == 2 then
rot = rot + vector3(0.0, 0.0, -90.0)
elseif chairId == 1 then
chairId = 1
rot = rot + vector3(0.0, 0.0, -90.0)
end
local sex = 0
local L = string.format('anim_casino_b@amb@casino@games@roulette@ped_male@seat_%s@regular@0%sa@reacts@v01', chairId, chairId)
if GetEntityModel(PlayerPedId()) == GetHashKey('mp_f_freemode_01') then
sex = 1
end
if sex == 1 then
local L = string.format('anim_casino_b@amb@casino@games@roulette@ped_female@seat_%s@regular@0%sa@reacts@v01', chairId, chairId)
end
RequestAnimDict(L)
while not HasAnimDictLoaded(L) do
Wait(1)
end
if CURRENT_CHAIR_DATA ~= nil then
local currentScene = NetworkCreateSynchronisedScene(CURRENT_CHAIR_DATA.position, rot, 2, 1, 0, 1065353216, 0, 1065353216)
NetworkAddPedToSynchronisedScene(PlayerPedId(), currentScene, L, 'reaction_great', 4.0, -2.0, 13, 16, 1148846080, 0)
NetworkStartSynchronisedScene(currentScene)
idleTimer = 8
end
end
)
RegisterNetEvent('client:rulett:playLossAnim',function(chairId)
local rot = CURRENT_CHAIR_DATA.rotation
if chairId == 4 then
rot = rot + vector3(0.0, 0.0, 90.0)
elseif chairId == 3 then
rot = rot + vector3(0.0, 0.0, -180.0)
elseif chairId == 2 then
rot = rot + vector3(0.0, 0.0, -90.0)
elseif chairId == 1 then
chairId = 1
rot = rot + vector3(0.0, 0.0, -90.0)
end
local sex = 0
local L = string.format('anim_casino_b@amb@casino@games@roulette@ped_male@seat_%s@regular@0%sa@reacts@v01', chairId, chairId)
if GetEntityModel(PlayerPedId()) == GetHashKey('mp_f_freemode_01') then
sex = 1
end
if sex == 1 then
local L = string.format('anim_casino_b@amb@casino@games@roulette@ped_female@seat_%s@regular@0%sa@reacts@v01', chairId, chairId)
end
RequestAnimDict(L)
while not HasAnimDictLoaded(L) do
Wait(1)
end
if CURRENT_CHAIR_DATA ~= nil then
local currentScene = NetworkCreateSynchronisedScene(CURRENT_CHAIR_DATA.position, rot, 2, 1, 0, 1065353216, 0, 1065353216)
NetworkAddPedToSynchronisedScene(
PlayerPedId(),
currentScene,
L,
({'reaction_bad_var01', 'reaction_bad_var02', 'reaction_terrible'})[math.random(1, 3)],
4.0,
-2.0,
13,
16,
1148846080,
0
)
NetworkStartSynchronisedScene(currentScene)
idleTimer = 8
end
end)
function playImpartial()
local rot = CURRENT_CHAIR_DATA.rotation
if SELECTED_CHAIR_ID == 4 then
rot = rot + vector3(0.0, 0.0, 90.0)
elseif SELECTED_CHAIR_ID == 3 then
rot = rot + vector3(0.0, 0.0, -180.0)
elseif SELECTED_CHAIR_ID == 2 then
rot = rot + vector3(0.0, 0.0, -90.0)
elseif SELECTED_CHAIR_ID == 1 then
SELECTED_CHAIR_ID = 1
rot = rot + vector3(0.0, 0.0, -90.0)
end
local sex = 0
local L = string.format('anim_casino_b@amb@casino@games@roulette@ped_male@seat_%s@regular@0%sa@reacts@v01', SELECTED_CHAIR_ID, SELECTED_CHAIR_ID)
if GetEntityModel(PlayerPedId()) == GetHashKey('mp_f_freemode_01') then
sex = 1
end
if sex == 1 then
local L = string.format('anim_casino_b@amb@casino@games@roulette@ped_female@seat_%s@regular@0%sa@reacts@v01', SELECTED_CHAIR_ID, SELECTED_CHAIR_ID)
end
RequestAnimDict(L)
while not HasAnimDictLoaded(L) do
Wait(1)
end
if CURRENT_CHAIR_DATA ~= nil then
local currentScene = NetworkCreateSynchronisedScene(CURRENT_CHAIR_DATA.position, rot, 2, 1, 0, 1065353216, 0, 1065353216)
NetworkAddPedToSynchronisedScene(
PlayerPedId(),
currentScene,
L,
({'reaction_impartial_var01', 'reaction_impartial_var02', 'reaction_impartial_var03'})[math.random(1, 3)],
4.0,
-2.0,
13,
16,
1148846080,
0
)
NetworkStartSynchronisedScene(currentScene)
idleTimer = 8
end
end
function playRulettIdle()
local rot = CURRENT_CHAIR_DATA.rotation
if SELECTED_CHAIR_ID == 4 then
rot = rot + vector3(0.0, 0.0, 90.0)
elseif SELECTED_CHAIR_ID == 3 then
rot = rot + vector3(0.0, 0.0, -180.0)
elseif SELECTED_CHAIR_ID == 2 then
rot = rot + vector3(0.0, 0.0, -90.0)
elseif SELECTED_CHAIR_ID == 1 then
SELECTED_CHAIR_ID = 1
rot = rot + vector3(0.0, 0.0, -90.0)
end
local sex = 0
local L = string.format('anim_casino_b@amb@casino@games@roulette@ped_male@seat_%s@regular@0%sa@idles', SELECTED_CHAIR_ID, SELECTED_CHAIR_ID)
if GetEntityModel(PlayerPedId()) == GetHashKey('mp_f_freemode_01') then
sex = 1
end
if sex == 1 then
local L = string.format('anim_casino_b@amb@casino@games@roulette@ped_female@seat_%s@regular@0%sa@idles', SELECTED_CHAIR_ID, SELECTED_CHAIR_ID)
end
RequestAnimDict(L)
while not HasAnimDictLoaded(L) do
Wait(1)
end
if CURRENT_CHAIR_DATA ~= nil then
local currentScene = NetworkCreateSynchronisedScene(CURRENT_CHAIR_DATA.position, rot, 2, 1, 0, 1065353216, 0, 1065353216)
NetworkAddPedToSynchronisedScene(PlayerPedId(), currentScene, L, ({'idle_a', 'idle_b', 'idle_c', 'idle_d'})[math.random(1, 4)], 1.0, -2.0, 13, 16, 1148846080, 0)
NetworkStartSynchronisedScene(currentScene)
end
end
function addRandomClothes(ped)
local r = math.random(1, 5)
if r == 1 then
SetPedComponentVariation(ped, 0, 4, 0, 0)
SetPedComponentVariation(ped, 1, 0, 0, 0)
SetPedComponentVariation(ped, 2, 4, 0, 0)
SetPedComponentVariation(ped, 3, 2, 1, 0)
SetPedComponentVariation(ped, 4, 1, 0, 0)
SetPedComponentVariation(ped, 6, 1, 0, 0)
SetPedComponentVariation(ped, 7, 1, 0, 0)
SetPedComponentVariation(ped, 8, 2, 0, 0)
SetPedComponentVariation(ped, 10, 0, 0, 0)
SetPedComponentVariation(ped, 11, 0, 0, 0)
SetPedPropIndex(ped, 1, 0, 0, false)
elseif r == 2 then
SetPedComponentVariation(ped, 0, 3, 1, 0)
SetPedComponentVariation(ped, 1, 0, 0, 0)
SetPedComponentVariation(ped, 2, 3, 1, 0)
SetPedComponentVariation(ped, 3, 1, 1, 0)
SetPedComponentVariation(ped, 4, 1, 0, 0)
SetPedComponentVariation(ped, 6, 1, 0, 0)
SetPedComponentVariation(ped, 7, 2, 0, 0)
SetPedComponentVariation(ped, 8, 1, 0, 0)
SetPedComponentVariation(ped, 10, 0, 0, 0)
SetPedComponentVariation(ped, 11, 0, 0, 0)
elseif r == 3 then
SetPedComponentVariation(ped, 0, 3, 0, 0)
SetPedComponentVariation(ped, 1, 0, 0, 0)
SetPedComponentVariation(ped, 2, 3, 0, 0)
SetPedComponentVariation(ped, 3, 0, 1, 0)
SetPedComponentVariation(ped, 4, 1, 0, 0)
SetPedComponentVariation(ped, 6, 1, 0, 0)
SetPedComponentVariation(ped, 7, 1, 0, 0)
SetPedComponentVariation(ped, 8, 0, 0, 0)
SetPedComponentVariation(ped, 10, 0, 0, 0)
SetPedComponentVariation(ped, 11, 0, 0, 0)
SetPedPropIndex(ped, 1, 0, 0, false)
elseif r == 4 then
SetPedComponentVariation(ped, 0, 2, 1, 0)
SetPedComponentVariation(ped, 1, 0, 0, 0)
SetPedComponentVariation(ped, 2, 2, 1, 0)
SetPedComponentVariation(ped, 3, 3, 3, 0)
SetPedComponentVariation(ped, 4, 1, 0, 0)
SetPedComponentVariation(ped, 6, 1, 0, 0)
SetPedComponentVariation(ped, 7, 2, 0, 0)
SetPedComponentVariation(ped, 8, 3, 0, 0)
SetPedComponentVariation(ped, 10, 0, 0, 0)
SetPedComponentVariation(ped, 11, 0, 0, 0)
end
end