490 lines
24 KiB
Lua
490 lines
24 KiB
Lua
local QBCore = exports['qb-core']:GetCoreObject()
|
|
local Slot
|
|
local SlotCoords
|
|
local ClosestSlot
|
|
local ClosestSlotCoord = vector3(0, 0, 0)
|
|
local ClosestSlotRotation
|
|
local NearbySlot
|
|
local EnteredSlot
|
|
local IsSpinning
|
|
local ReelLocation1
|
|
local ReelLocation2
|
|
local ReelLocation3
|
|
local ClosestSlotForwardX
|
|
local ClosestSlotForwardY
|
|
local ShouldDrawScaleForm = false
|
|
local Scaleform
|
|
local ClosestSlotModel
|
|
local AnimDict = 'anim_casino_a@amb@casino@games@slots@male'
|
|
local Sounds = {
|
|
function() local SoundId = GetSoundId() PlaySoundFromCoord(SoundId, 'no_win', ClosestSlotCoord, SlotReferences[ClosestSlotModel].sound, false, 20, false) ReleaseSoundId(SoundId) end,
|
|
function() local SoundId = GetSoundId() PlaySoundFromCoord(SoundId, 'small_win', ClosestSlotCoord, SlotReferences[ClosestSlotModel].sound, false, 20, false) ReleaseSoundId(SoundId) end,
|
|
function() local SoundId = GetSoundId() PlaySoundFromCoord(SoundId, 'big_win', ClosestSlotCoord, SlotReferences[ClosestSlotModel].sound, false, 20, false) ReleaseSoundId(SoundId) end,
|
|
function() local SoundId = GetSoundId() PlaySoundFromCoord(SoundId, 'jackpot', ClosestSlotCoord, SlotReferences[ClosestSlotModel].sound, false, 20, false) ReleaseSoundId(SoundId) end,
|
|
function() local SoundId = GetSoundId() PlaySoundFromCoord(SoundId, 'place_bet', ClosestSlotCoord, SlotReferences[ClosestSlotModel].sound, false, 20, false) ReleaseSoundId(SoundId) end,
|
|
function() local SoundId = GetSoundId() PlaySoundFromCoord(SoundId, 'place_max_bet', ClosestSlotCoord, SlotReferences[ClosestSlotModel].sound, false, 20, false) ReleaseSoundId(SoundId) end,
|
|
function() local SoundId = GetSoundId() PlaySoundFromCoord(SoundId, 'spinning', ClosestSlotCoord, SlotReferences[ClosestSlotModel].sound, false, 20, false) ReleaseSoundId(SoundId) end,
|
|
function() local SoundId = GetSoundId() PlaySoundFromCoord(SoundId, 'start_spin', ClosestSlotCoord, SlotReferences[ClosestSlotModel].sound, false, 20, false) ReleaseSoundId(SoundId) end,
|
|
function() local SoundId = GetSoundId() PlaySoundFromCoord(SoundId, 'wheel_stop_clunk', ClosestSlotCoord, SlotReferences[ClosestSlotModel].sound, false, 20, false) ReleaseSoundId(SoundId) end,
|
|
function() local SoundId = GetSoundId() PlaySoundFromCoord(SoundId, 'wheel_stop_on_prize', ClosestSlotCoord, SlotReferences[ClosestSlotModel].sound, false, 20, false) ReleaseSoundId(SoundId) end,
|
|
function() local SoundId = GetSoundId() PlaySoundFromCoord(SoundId, 'welcome_stinger', ClosestSlotCoord, SlotReferences[ClosestSlotModel].sound, false, 20, false) ReleaseSoundId(SoundId) end,
|
|
function() local SoundId = GetSoundId() PlaySoundFromCoord(SoundId, 'spin_wheel', ClosestSlotCoord, SlotReferences[ClosestSlotModel].sound, false, 20, false) ReleaseSoundId(SoundId) end,
|
|
function() local SoundId = GetSoundId() PlaySoundFromCoord(SoundId, 'spin_wheel_win', ClosestSlotCoord, SlotReferences[ClosestSlotModel].sound, false, 20, false) ReleaseSoundId(SoundId) end
|
|
}
|
|
local Slots = {
|
|
2362925439,
|
|
2775323096,
|
|
3863977906,
|
|
654385216,
|
|
161343630,
|
|
1096374064,
|
|
207578973,
|
|
3807744938
|
|
}
|
|
local RandomEnter = {
|
|
'enter_left',
|
|
'enter_right',
|
|
'enter_left_short',
|
|
'enter_right_short'
|
|
}
|
|
local RandomLeave = {
|
|
'exit_left',
|
|
'exit_right'
|
|
}
|
|
local RandomIdle = {
|
|
'base_idle_a',
|
|
'base_idle_b',
|
|
'base_idle_c',
|
|
'base_idle_d',
|
|
'base_idle_e',
|
|
'base_idle_f'
|
|
}
|
|
local RandomSpin = {
|
|
'press_spin_a',
|
|
'press_spin_b',
|
|
'pull_spin_a',
|
|
'pull_spin_b'
|
|
}
|
|
local RandomSpinningIdle = {
|
|
'spinning_a',
|
|
'spinning_b',
|
|
'spinning_c'
|
|
}
|
|
local RandomWin = {
|
|
'win_a',
|
|
'win_b',
|
|
'win_c',
|
|
'win_d',
|
|
'win_e',
|
|
'win_f',
|
|
'win_g',
|
|
'win_spinning_wheel'
|
|
}
|
|
local RandomLose = {
|
|
'lose_a',
|
|
'lose_b',
|
|
'lose_c',
|
|
'lose_d',
|
|
'lose_e',
|
|
'lose_f',
|
|
'lose_cruel_a',
|
|
'lose_cruel_b'
|
|
}
|
|
local RandomBigWin = {
|
|
'win_big_a',
|
|
'win_big_b',
|
|
'win_big_c'
|
|
}
|
|
local RandomEnterMessage = {
|
|
'Daring today?',
|
|
'Spin to win',
|
|
'You will lose money!',
|
|
'Feelin lucky punk?!',
|
|
'Test your might',
|
|
'You have coins?'
|
|
}
|
|
local ChosenBetAmount = 1
|
|
|
|
local function DrawText3D(x, y, z, text)
|
|
SetTextScale(0.35, 0.35)
|
|
SetTextFont(4)
|
|
SetTextProportional(1)
|
|
SetTextColour(255, 255, 255, 215)
|
|
SetTextEntry("STRING")
|
|
SetTextCentre(true)
|
|
AddTextComponentString(text)
|
|
SetDrawOrigin(x,y,z, 0)
|
|
DrawText(0.0, 0.0)
|
|
local factor = (string.len(text)) / 370
|
|
DrawRect(0.0, 0.0+0.0125, 0.017+ factor, 0.03, 0, 0, 0, 75)
|
|
ClearDrawOrigin()
|
|
end
|
|
|
|
local function LoadAnimDict(dict) while not HasAnimDictLoaded(dict) do RequestAnimDict(dict) Wait(0) end end
|
|
|
|
local function StartIdleScene(CurrentAnimation)
|
|
Wait(GetAnimDuration(AnimDict, CurrentAnimation) * 800)
|
|
local IdleScene = NetworkCreateSynchronisedScene(ClosestSlotCoord, ClosestSlotRotation, 2, 2, 0, 1.0, 0, 1.0)
|
|
LoadAnimDict(AnimDict)
|
|
local RandomAnimName = RandomIdle[math.random(1, #RandomIdle)]
|
|
NetworkAddPedToSynchronisedScene(PlayerPedId(), IdleScene, AnimDict, RandomAnimName, 2.0, -1.5, 13, 16, 2.0, 0)
|
|
NetworkStartSynchronisedScene(IdleScene)
|
|
end
|
|
|
|
local function CreateNamedRenderTargetForModel(name, model)
|
|
local handle = 0
|
|
if not IsNamedRendertargetRegistered(name) then
|
|
RegisterNamedRendertarget(name, 0)
|
|
end
|
|
if not IsNamedRendertargetLinked(model) then
|
|
LinkNamedRendertarget(model)
|
|
end
|
|
if IsNamedRendertargetRegistered(name) then
|
|
handle = GetNamedRendertargetRenderId(name)
|
|
end
|
|
return handle
|
|
end
|
|
|
|
local function CallScaleformMethod(method, ...)
|
|
local t
|
|
local args = { ... }
|
|
BeginScaleformMovieMethod(Scaleform, method)
|
|
for _, v in ipairs(args) do
|
|
t = type(v)
|
|
if t == 'string' then
|
|
PushScaleformMovieMethodParameterString(v)
|
|
elseif t == 'number' then
|
|
if string.match(tostring(v), "%.") then
|
|
PushScaleformMovieFunctionParameterFloat(v)
|
|
else
|
|
PushScaleformMovieFunctionParameterInt(v)
|
|
end
|
|
elseif t == 'boolean' then
|
|
PushScaleformMovieMethodParameterBool(v)
|
|
end
|
|
end
|
|
EndScaleformMovieMethod()
|
|
end
|
|
|
|
local function SetupScaleform()
|
|
CreateThread(function()
|
|
Scaleform = RequestScaleformMovie('SLOT_MACHINE')
|
|
while not HasScaleformMovieLoaded(Scaleform) do Wait(0) end
|
|
if SlotReferences[ClosestSlotModel].theme then CallScaleformMethod('SET_THEME', SlotReferences[ClosestSlotModel].theme) else CallScaleformMethod('SET_THEME') end
|
|
local model = ClosestSlotModel
|
|
local handle = CreateNamedRenderTargetForModel("machine_"..SlotReferences[ClosestSlotModel].scriptrt, model)
|
|
while ShouldDrawScaleForm do
|
|
N_0x32f34ff7f617643b(Scaleform, 1)
|
|
SetTextRenderId(handle) -- Sets the render target to the handle we grab above
|
|
SetScriptGfxDrawOrder(4)
|
|
SetScriptGfxDrawBehindPausemenu(true)
|
|
DrawScaleformMovie(Scaleform, 0.401, 0.09, 0.805, 0.195, 255, 255, 255, 255, 0)
|
|
SetTextRenderId(GetDefaultScriptRendertargetRenderId()) -- Resets the render target
|
|
Wait(0)
|
|
end
|
|
end)
|
|
end
|
|
|
|
local function SlotMachineHandler()
|
|
local LeverScene = 0
|
|
local IdleScene = NetworkCreateSynchronisedScene(ClosestSlotCoord, ClosestSlotRotation, 2, 2, 0, 1.0, 0, 1.0)
|
|
LoadAnimDict(AnimDict)
|
|
local RandomAnimName = RandomIdle[math.random(1, #RandomIdle)]
|
|
NetworkAddPedToSynchronisedScene(PlayerPedId(), IdleScene, AnimDict, RandomAnimName, 2.0, -1.5, 13, 16, 2.0, 0)
|
|
NetworkStartSynchronisedScene(IdleScene)
|
|
exports['qb-core']:DrawText('<strong>Spin:</strong> ↵<br><strong>Leave: </strong>←<br><strong>Adjust Bet:</strong> ↑')
|
|
CreateThread(function()
|
|
while true do
|
|
QBCore.Functions.TriggerCallback('doj:server:CasinoChipsAmount', function(result)
|
|
exports['casinoUi']:DrawCasinoUi('show', "The Diamond Casino & Resort Slots</p>"..SlotReferences[ClosestSlotModel].name.."</p>Availble chips: "..math.floor(result))
|
|
end)
|
|
if not IsSpinning then
|
|
if IsControlJustPressed(0, 202) then -- BACKSPACE
|
|
local LeaveScene = NetworkCreateSynchronisedScene(ClosestSlotCoord, ClosestSlotRotation, 2, 2, 0, 1.0, 0, 1.0)
|
|
LoadAnimDict(AnimDict)
|
|
RandomAnimName = RandomLeave[math.random(1, #RandomLeave)]
|
|
NetworkAddPedToSynchronisedScene(PlayerPedId(), LeaveScene, AnimDict, RandomAnimName, 2.0, -1.5, 13, 16, 2.0, 0)
|
|
NetworkStartSynchronisedScene(LeaveScene)
|
|
Wait(GetAnimDuration(AnimDict, RandomAnimName) * 700)
|
|
NetworkStopSynchronisedScene(LeaveScene)
|
|
EnteredSlot = false
|
|
ShouldDrawScaleForm = false
|
|
exports['qb-core']:HideText()
|
|
exports['casinoUi']:HideCasinoUi('hide')
|
|
CallScaleformMethod('SET_BET')
|
|
CallScaleformMethod('SET_LAST_WIN')
|
|
CallScaleformMethod('SET_MESSAGE', '')
|
|
TriggerServerEvent('dc-casino:slots:server:leave')
|
|
break
|
|
elseif IsControlJustPressed(0, 201) then -- ENTER
|
|
local SpinScene = NetworkCreateSynchronisedScene(ClosestSlotCoord, ClosestSlotRotation, 2, 2, 0, 1.0, 0, 1.0)
|
|
LoadAnimDict(AnimDict)
|
|
RandomAnimName = RandomSpin[math.random(1, #RandomSpin)]
|
|
NetworkAddPedToSynchronisedScene(PlayerPedId(), SpinScene, AnimDict, RandomAnimName, 2.0, -1.5, 13, 16, 1000.0, 0)
|
|
NetworkStartSynchronisedScene(SpinScene)
|
|
local AnimationDuration = GetAnimDuration(AnimDict, RandomAnimName)
|
|
if RandomAnimName == 'pull_spin_a' then
|
|
LeverScene = NetworkCreateSynchronisedScene(ClosestSlotCoord, ClosestSlotRotation, 2, 2, 0, 1.0, 0, 1.0)
|
|
N_0x45f35c0edc33b03b(LeverScene, GetEntityModel(ClosestSlot), ClosestSlotCoord, AnimDict, 'pull_spin_a_SLOTMACHINE', 2.0, -1.5, 13.0)
|
|
NetworkStartSynchronisedScene(LeverScene)
|
|
Wait(AnimationDuration * 320)
|
|
elseif RandomAnimName == 'pull_spin_b' then
|
|
LeverScene = NetworkCreateSynchronisedScene(ClosestSlotCoord, ClosestSlotRotation, 2, 2, 0, 1.0, 0, 1.0)
|
|
N_0x45f35c0edc33b03b(LeverScene, GetEntityModel(ClosestSlot), ClosestSlotCoord, AnimDict, 'pull_spin_b_SLOTMACHINE', 2.0, -1.5, 13.0)
|
|
NetworkStartSynchronisedScene(LeverScene)
|
|
Wait(AnimationDuration * 320)
|
|
end
|
|
Wait(AnimationDuration * 180)
|
|
Sounds[8]()
|
|
TriggerServerEvent('dc-casino:slots:server:spin', ChosenBetAmount)
|
|
Wait(AnimationDuration * 500)
|
|
local SpinningScene = NetworkCreateSynchronisedScene(ClosestSlotCoord, ClosestSlotRotation, 2, 2, 0, 1.0, 0, 1.0)
|
|
LoadAnimDict(AnimDict)
|
|
NetworkAddPedToSynchronisedScene(PlayerPedId(), SpinningScene, AnimDict, RandomSpinningIdle[math.random(1, #RandomSpinningIdle)], 2.0, -1.5, 13, 16, 2.0, 0)
|
|
NetworkStartSynchronisedScene(SpinningScene)
|
|
NetworkStopSynchronisedScene(LeverScene) --- Has to be stopped otherwise it will only work 50% of the time
|
|
FreezeEntityPosition(ClosestSlot, true) --- N_0x45f35c0edc33b03b will prevent the machine being stuck to their position for some reason?
|
|
elseif IsControlJustPressed(0, 172) then -- UP ARROW
|
|
Sounds[5]()
|
|
if not SlotReferences[ClosestSlotModel].betamounts[ChosenBetAmount + 1] then ChosenBetAmount = 1 else ChosenBetAmount = ChosenBetAmount + 1 end
|
|
local BetOneScene = NetworkCreateSynchronisedScene(ClosestSlotCoord, ClosestSlotRotation, 2, 2, 0, 1.0, 0, 1.0)
|
|
LoadAnimDict(AnimDict)
|
|
NetworkAddPedToSynchronisedScene(PlayerPedId(), BetOneScene, AnimDict, 'press_betone_a', 2.0, -1.5, 13, 16, 2.0, 0)
|
|
NetworkStartSynchronisedScene(BetOneScene)
|
|
Wait(GetAnimDuration(AnimDict, 'press_betone_a') * 200)
|
|
CallScaleformMethod('SET_BET', SlotReferences[ClosestSlotModel].betamounts[ChosenBetAmount])
|
|
StartIdleScene('press_betone_a')
|
|
elseif IsControlJustPressed(0, 45) then -- R
|
|
Sounds[6]()
|
|
ChosenBetAmount = #SlotReferences[ClosestSlotModel].betamounts
|
|
local BetMaxScene = NetworkCreateSynchronisedScene(ClosestSlotCoord, ClosestSlotRotation, 2, 2, 0, 1.0, 0, 1.0)
|
|
LoadAnimDict(AnimDict)
|
|
NetworkAddPedToSynchronisedScene(PlayerPedId(), BetMaxScene, AnimDict, 'press_betmax_a', 2.0, -1.5, 13, 16, 2.0, 0)
|
|
NetworkStartSynchronisedScene(BetMaxScene)
|
|
Wait(GetAnimDuration(AnimDict, 'press_betmax_a') * 200)
|
|
CallScaleformMethod('SET_BET', SlotReferences[ClosestSlotModel].betamounts[ChosenBetAmount])
|
|
StartIdleScene('press_betmax_a')
|
|
elseif IsEntityDead(PlayerPedId()) then
|
|
EnteredSlot = false
|
|
ShouldDrawScaleForm = false
|
|
exports['qb-core']:HideText()
|
|
CallScaleformMethod('SET_BET')
|
|
CallScaleformMethod('SET_MESSAGE', '')
|
|
TriggerServerEvent('dc-casino:slots:server:leave')
|
|
break
|
|
end
|
|
end
|
|
Wait(0)
|
|
end
|
|
end)
|
|
end
|
|
|
|
CreateThread(function()
|
|
while not RequestScriptAudioBank("dlc_vinewood/casino_slot_machines_01", 0) do Wait(0) end
|
|
while not RequestScriptAudioBank("dlc_vinewood/casino_slot_machines_02", 0) do Wait(0) end
|
|
while not RequestScriptAudioBank("dlc_vinewood/casino_slot_machines_03", 0) do Wait(0) end
|
|
while true do
|
|
local PlayerCoords = GetEntityCoords(PlayerPedId())
|
|
for i = 1, #Slots do
|
|
Slot = GetClosestObjectOfType(PlayerCoords, 1.2, Slots[i], true)
|
|
if Slot ~= 0 then
|
|
SlotCoords = GetEntityCoords(Slot)
|
|
local CurrentDistance = #(PlayerCoords - SlotCoords)
|
|
if CurrentDistance < 1.9 and CurrentDistance < #(PlayerCoords - ClosestSlotCoord) then
|
|
NearbySlot = true
|
|
ClosestSlot = Slot
|
|
ClosestSlotCoord = SlotCoords
|
|
ClosestSlotForwardX = GetEntityForwardX(ClosestSlot)
|
|
ClosestSlotForwardY = GetEntityForwardY(ClosestSlot)
|
|
ClosestSlotModel = GetEntityModel(ClosestSlot)
|
|
ClosestSlotRotation = GetEntityRotation(ClosestSlot)
|
|
ReelLocation1 = GetObjectOffsetFromCoords(ClosestSlotCoord, GetEntityHeading(ClosestSlot), -0.115, 0.047, 0.906)
|
|
ReelLocation2 = GetObjectOffsetFromCoords(ClosestSlotCoord, GetEntityHeading(ClosestSlot), 0.005, 0.047, 0.906)
|
|
ReelLocation3 = GetObjectOffsetFromCoords(ClosestSlotCoord, GetEntityHeading(ClosestSlot), 0.125, 0.047, 0.906)
|
|
end
|
|
elseif #(PlayerCoords - ClosestSlotCoord) > 1.9 then
|
|
NearbySlot = false
|
|
end
|
|
end
|
|
Wait(600)
|
|
end
|
|
end)
|
|
|
|
-- CreateThread(function()
|
|
-- while true do
|
|
-- local WaitTime = 500
|
|
-- if NearbySlot and not EnteredSlot then
|
|
-- WaitTime = 0
|
|
-- -- exports['qb-core']:DrawText('<b>Diamond Casino Slots</p></b>'..SlotReferences[ClosestSlotModel].name..'</p>Press [E] to sit</p>')
|
|
-- DrawText3D(ClosestSlotCoord.x - ClosestSlotForwardX, ClosestSlotCoord.y - ClosestSlotForwardY, ClosestSlotCoord.z + 1, "[E] - Play ~b~"..SlotReferences[ClosestSlotModel].name)
|
|
-- if IsControlJustReleased(0, 38) then
|
|
|
|
-- QBCore.Functions.TriggerCallback('doj:server:HasCasinoMembership', function(HasItem)
|
|
-- if HasItem then
|
|
-- local netID = NetworkGetEntityIsNetworked(ClosestSlot) and NetworkGetNetworkIdFromEntity(ClosestSlot)
|
|
-- if not netID then
|
|
-- NetworkRegisterEntityAsNetworked(ClosestSlot)
|
|
-- netID = NetworkGetNetworkIdFromEntity(ClosestSlot)
|
|
-- NetworkUseHighPrecisionBlending(netID, false)
|
|
-- SetNetworkIdExistsOnAllMachines(netID, true)
|
|
-- SetNetworkIdCanMigrate(netID, true)
|
|
-- end
|
|
-- NetworkRequestControlOfEntity(ClosestSlot)
|
|
-- TriggerServerEvent('dc-casino:slots:server:enter', netID, ReelLocation1, ReelLocation2, ReelLocation3)
|
|
-- else
|
|
-- QBCore.Functions.Notify('You are not a member of the casino!', 'error', 3500)
|
|
-- end
|
|
-- end)
|
|
-- end
|
|
-- -- elseif not NearbySlot then
|
|
-- -- exports["qb-core"]:HideText()
|
|
-- end
|
|
-- Wait(WaitTime)
|
|
-- end
|
|
-- end)
|
|
|
|
|
|
|
|
Citizen.CreateThread(function()
|
|
local alreadyEnteredZone = false
|
|
local text = nil
|
|
while true do
|
|
if NearbySlot and not EnteredSlot then
|
|
wait = 5
|
|
local pedCo = GetEntityCoords(PlayerPedId())
|
|
local dist = #(pedCo - ClosestSlotCoord)
|
|
local inZone = false
|
|
if dist <= 2.0 then
|
|
wait = 5
|
|
inZone = true
|
|
text = '<b>The Diamond Casino & Resort</p>Slot: '..SlotReferences[ClosestSlotModel].name..'</b></p>Press <b>E</b> to sit'
|
|
if IsControlJustPressed(0, 38) then
|
|
local netID = NetworkGetEntityIsNetworked(ClosestSlot) and NetworkGetNetworkIdFromEntity(ClosestSlot)
|
|
if not netID then
|
|
NetworkRegisterEntityAsNetworked(ClosestSlot)
|
|
netID = NetworkGetNetworkIdFromEntity(ClosestSlot)
|
|
NetworkUseHighPrecisionBlending(netID, false)
|
|
SetNetworkIdExistsOnAllMachines(netID, true)
|
|
SetNetworkIdCanMigrate(netID, true)
|
|
end
|
|
NetworkRequestControlOfEntity(ClosestSlot)
|
|
TriggerServerEvent('dc-casino:slots:server:enter', netID, ReelLocation1, ReelLocation2, ReelLocation3)
|
|
end
|
|
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
|
|
Wait(wait)
|
|
end
|
|
end)
|
|
|
|
RegisterNetEvent('dc-casino:slots:client:enter', function()
|
|
local Ped = PlayerPedId()
|
|
exports["qb-core"]:HideText()
|
|
if GetEntityModel(Ped) == `mp_f_freemode_01` then AnimDict = 'anim_casino_a@amb@casino@games@slots@female' end
|
|
local EnterScene = NetworkCreateSynchronisedScene(ClosestSlotCoord, ClosestSlotRotation, 2, 2, 0, 1.0, 0, 1.0)
|
|
LoadAnimDict(AnimDict)
|
|
local RandomAnimName = RandomEnter[math.random(1, #RandomEnter)]
|
|
NetworkAddPedToSynchronisedScene(Ped, EnterScene, AnimDict, RandomAnimName, 2.0, -1.5, 13, 16, 2.0, 0)
|
|
NetworkStartSynchronisedScene(EnterScene)
|
|
EnteredSlot = true
|
|
ShouldDrawScaleForm = true
|
|
SetupScaleform()
|
|
Wait(GetAnimDuration(AnimDict, RandomAnimName) * 1000)
|
|
CallScaleformMethod('SET_MESSAGE', RandomEnterMessage[math.random(1, #RandomEnterMessage)])
|
|
CallScaleformMethod('SET_BET', SlotReferences[ClosestSlotModel].betamounts[ChosenBetAmount])
|
|
Sounds[11]()
|
|
SlotMachineHandler()
|
|
end)
|
|
|
|
RegisterNetEvent('dc-casino:slots:client:spinreels', function(SpinTime, ReelRewards, BlurryReelID1, BlurryReelID2, BlurryReelID3, ReelID1, ReelID2, ReelID3, RewardMultiplier)
|
|
local EndTime = GetGameTimer() + SpinTime
|
|
local FirstReelStop = SpinTime * math.random(2, 4) / 10
|
|
local SecondReelStop = SpinTime * math.random(5, 7) / 10
|
|
local ReelReward1 = ReelRewards[1] * 22.5
|
|
local ReelReward2 = ReelRewards[2] * 22.5
|
|
local ReelReward3 = ReelRewards[3] * 22.5
|
|
local SlotHeading = GetEntityHeading(ClosestSlot)
|
|
local BlurryReel1 = NetworkGetEntityFromNetworkId(BlurryReelID1)
|
|
local BlurryReel2 = NetworkGetEntityFromNetworkId(BlurryReelID2)
|
|
local BlurryReel3 = NetworkGetEntityFromNetworkId(BlurryReelID3)
|
|
local Reel1 = NetworkGetEntityFromNetworkId(ReelID1)
|
|
local Reel2 = NetworkGetEntityFromNetworkId(ReelID2)
|
|
local Reel3 = NetworkGetEntityFromNetworkId(ReelID3)
|
|
while not NetworkRequestControlOfEntity(BlurryReel1) do Wait(0) end
|
|
while not NetworkRequestControlOfEntity(BlurryReel2) do Wait(0) end
|
|
while not NetworkRequestControlOfEntity(BlurryReel3) do Wait(0) end
|
|
while not NetworkRequestControlOfEntity(Reel1) do Wait(0) end
|
|
while not NetworkRequestControlOfEntity(Reel2) do Wait(0) end
|
|
while not NetworkRequestControlOfEntity(Reel3) do Wait(0) end
|
|
|
|
IsSpinning = true
|
|
SetEntityVisible(Reel1, false)
|
|
SetEntityVisible(Reel2, false)
|
|
SetEntityVisible(Reel3, false)
|
|
Sounds[7]()
|
|
while GetGameTimer() < EndTime do
|
|
SetEntityRotation(BlurryReel1, math.random(0, 15) * 22.5 + math.random(1, 60), 0.0, SlotHeading, 2, true)
|
|
if EndTime - GetGameTimer() > FirstReelStop then
|
|
SetEntityRotation(BlurryReel2, math.random(0, 15) * 22.5 + math.random(1, 60), 0.0, SlotHeading, 2, true)
|
|
if EndTime - GetGameTimer() < FirstReelStop + 15 then
|
|
if ReelRewards[2] == math.floor(ReelRewards[2]) then Sounds[9]() else Sounds[10]() end
|
|
DeleteObject(BlurryReel2)
|
|
SetEntityRotation(Reel2, ReelReward2, 0.0, SlotHeading, 2, true)
|
|
SetEntityVisible(Reel2, true)
|
|
end
|
|
if EndTime - GetGameTimer() > SecondReelStop then
|
|
SetEntityRotation(BlurryReel3, math.random(0, 15) * 22.5 + math.random(1, 60), 0.0, SlotHeading, 2, true)
|
|
if EndTime - GetGameTimer() < SecondReelStop + 15 then
|
|
if ReelRewards[3] == math.floor(ReelRewards[3]) then Sounds[9]() else Sounds[10]() end
|
|
DeleteObject(BlurryReel3)
|
|
SetEntityRotation(Reel3, ReelReward3, 0.0, SlotHeading, 2, true)
|
|
SetEntityVisible(Reel3, true)
|
|
end
|
|
end
|
|
end
|
|
Wait(0)
|
|
end
|
|
DeleteObject(BlurryReel1)
|
|
SetEntityRotation(Reel1, ReelReward1, 0.0, SlotHeading, 2, true)
|
|
SetEntityVisible(Reel1, true)
|
|
CallScaleformMethod('SET_LAST_WIN', SlotReferences[ClosestSlotModel].betamounts[ChosenBetAmount] * RewardMultiplier)
|
|
if ReelRewards[1] == math.floor(ReelRewards[1]) then Sounds[9]() else Sounds[10]() end
|
|
if RewardMultiplier == 0 then
|
|
Sounds[1]()
|
|
QBCore.Functions.Notify('You Lose', 'error', 3500)
|
|
-- exports['qb-core']:DrawText('<b>You Lose</b>)
|
|
local LoseScene = NetworkCreateSynchronisedScene(ClosestSlotCoord, ClosestSlotRotation, 2, 2, 0, 1.0, 0, 1.0)
|
|
LoadAnimDict(AnimDict)
|
|
local RandomAnim = RandomLose[math.random(1, #RandomLose)]
|
|
NetworkAddPedToSynchronisedScene(PlayerPedId(), LoseScene, AnimDict, RandomLose[math.random(1, #RandomLose)], 2.0, -1.5, 13, 16, 2.0, 0)
|
|
NetworkStartSynchronisedScene(LoseScene)
|
|
StartIdleScene(RandomAnim)
|
|
elseif RewardMultiplier > 7 then
|
|
if ReelReward1 == 5 and ReelReward2 == 5 and ReelReward3 == 5 then Sounds[4]() else Sounds[3]() end
|
|
local BigWinScene = NetworkCreateSynchronisedScene(ClosestSlotCoord, ClosestSlotRotation, 2, 2, 0, 1.0, 0, 1.0)
|
|
LoadAnimDict(AnimDict)
|
|
local RandomAnim = RandomBigWin[math.random(1, #RandomBigWin)]
|
|
NetworkAddPedToSynchronisedScene(PlayerPedId(), BigWinScene, AnimDict, RandomBigWin[math.random(1, #RandomBigWin)], 2.0, -1.5, 13, 16, 2.0, 0)
|
|
NetworkStartSynchronisedScene(BigWinScene)
|
|
StartIdleScene(RandomAnim)
|
|
else
|
|
Sounds[2]()
|
|
local WinScene = NetworkCreateSynchronisedScene(ClosestSlotCoord, ClosestSlotRotation, 2, 2, 0, 1.0, 0, 1.0)
|
|
LoadAnimDict(AnimDict)
|
|
local RandomAnim = RandomWin[math.random(1, #RandomWin)]
|
|
NetworkAddPedToSynchronisedScene(PlayerPedId(), WinScene, AnimDict, RandomAnim, 2.0, -1.5, 13, 16, 2.0, 0)
|
|
NetworkStartSynchronisedScene(WinScene)
|
|
StartIdleScene(RandomAnim)
|
|
end
|
|
IsSpinning = false
|
|
end)
|