first commit
This commit is contained in:
@@ -0,0 +1,155 @@
|
||||
local wheelBusy = false
|
||||
local casinoPeds = {}
|
||||
local uiOpen = false
|
||||
|
||||
local function notify(message) exports.devx_core:Notify(message) end
|
||||
local function help(text)
|
||||
BeginTextCommandDisplayHelp('STRING'); AddTextComponentSubstringPlayerName(text); EndTextCommandDisplayHelp(0, false, true, -1)
|
||||
end
|
||||
local function loadModel(name)
|
||||
local hash = GetHashKey(name); RequestModel(hash)
|
||||
local deadline = GetGameTimer() + 6000
|
||||
while not HasModelLoaded(hash) and GetGameTimer() < deadline do Wait(0) end
|
||||
return HasModelLoaded(hash) and hash or nil
|
||||
end
|
||||
local function ensureCasinoInterior()
|
||||
for _, ipl in ipairs(DevXCasinoConfig.Ipls or {}) do RequestIpl(ipl) end
|
||||
local p = DevXCasinoConfig.InteriorEntry
|
||||
SetFocusPosAndVel(p.x, p.y, p.z, 0.0, 0.0, 0.0)
|
||||
RequestCollisionAtCoord(p.x, p.y, p.z)
|
||||
NewLoadSceneStartSphere(p.x, p.y, p.z, 150.0, 0)
|
||||
local deadline = GetGameTimer() + 9000
|
||||
while not IsNewLoadSceneLoaded() and GetGameTimer() < deadline do Wait(0) end
|
||||
NewLoadSceneStop(); ClearFocus()
|
||||
end
|
||||
local function teleport(position)
|
||||
DoScreenFadeOut(250); while not IsScreenFadedOut() do Wait(0) end
|
||||
local ped = PlayerPedId(); FreezeEntityPosition(ped, true)
|
||||
RequestCollisionAtCoord(position.x, position.y, position.z)
|
||||
SetEntityCoordsNoOffset(ped, position.x, position.y, position.z, false, false, false)
|
||||
SetEntityHeading(ped, position.w or position.heading or 0.0)
|
||||
local deadline = GetGameTimer() + 5000
|
||||
while not HasCollisionLoadedAroundEntity(ped) and GetGameTimer() < deadline do RequestCollisionAtCoord(position.x, position.y, position.z); Wait(0) end
|
||||
FreezeEntityPosition(ped, false); Wait(150); DoScreenFadeIn(350)
|
||||
end
|
||||
local function spawnCasinoPeds()
|
||||
for _, ped in ipairs(casinoPeds) do if DoesEntityExist(ped) then DeleteEntity(ped) end end
|
||||
casinoPeds = {}
|
||||
for _, definition in ipairs(DevXCasinoConfig.Npcs or {}) do
|
||||
local model = loadModel(definition.model)
|
||||
if model then
|
||||
local c = definition.coords
|
||||
local ped = CreatePed(4, model, c.x, c.y, c.z, c.w, false, false)
|
||||
SetEntityInvincible(ped, true); SetBlockingOfNonTemporaryEvents(ped, true); FreezeEntityPosition(ped, true)
|
||||
TaskStartScenarioInPlace(ped, definition.scenario or 'WORLD_HUMAN_STAND_MOBILE', 0, true)
|
||||
casinoPeds[#casinoPeds + 1] = ped; SetModelAsNoLongerNeeded(model)
|
||||
end
|
||||
end
|
||||
end
|
||||
local function getWheelObject()
|
||||
for _, modelName in ipairs(DevXCasinoConfig.WheelModels or {}) do
|
||||
local object = GetClosestObjectOfType(DevXCasinoConfig.Wheel.x, DevXCasinoConfig.Wheel.y, DevXCasinoConfig.Wheel.z, 3.0, GetHashKey(modelName), false, false, false)
|
||||
if object and object ~= 0 and DoesEntityExist(object) then return object end
|
||||
end
|
||||
return nil
|
||||
end
|
||||
local function animateWheel(result)
|
||||
local wheel = getWheelObject()
|
||||
if not wheel then notify('Das originale Casino-Glücksrad ist noch nicht geladen. Betritt das Casino erneut.'); return false end
|
||||
local duration, start = 6200, GetGameTimer()
|
||||
local base = GetEntityRotation(wheel, 2).y
|
||||
local segment = 360.0 / tonumber(result.totalSegments or 8)
|
||||
local target = 1440.0 + (360.0 - ((tonumber(result.segment or 0) * segment) + segment * .5))
|
||||
FreezeEntityPosition(wheel, true)
|
||||
while GetGameTimer() - start < duration do
|
||||
local progress = (GetGameTimer() - start) / duration
|
||||
local eased = 1.0 - ((1.0 - progress) ^ 4)
|
||||
SetEntityRotation(wheel, 0.0, (base + target * eased) % 360.0, 0.0, 2, true)
|
||||
help('Das Glücksrad dreht sich …'); Wait(0)
|
||||
end
|
||||
notify(('Glücksrad: %s gewonnen!'):format(result.reward and result.reward.label or 'Gewinn'))
|
||||
return true
|
||||
end
|
||||
local function spinWheel()
|
||||
if #(GetEntityCoords(PlayerPedId()) - DevXCasinoConfig.Wheel) > 3.0 then
|
||||
notify('Du musst direkt am Glücksrad stehen.')
|
||||
return
|
||||
end
|
||||
if wheelBusy then return end
|
||||
wheelBusy = true
|
||||
DevXTriggerCallback('casino:spin', {}, function(result)
|
||||
if not result.ok then notify(result.error or 'Das Glücksrad konnte nicht gedreht werden.'); wheelBusy = false; return end
|
||||
CreateThread(function() animateWheel(result); wheelBusy = false end)
|
||||
end)
|
||||
end
|
||||
local function openUi(mode)
|
||||
uiOpen = true; SetNuiFocus(true, true)
|
||||
DevXTriggerCallback('casino:status', {}, function(status)
|
||||
SendNUIMessage({ action = 'open', mode = mode, status = status })
|
||||
end)
|
||||
end
|
||||
local function closeUi()
|
||||
uiOpen = false; SetNuiFocus(false, false); SendNUIMessage({ action = 'close' })
|
||||
end
|
||||
|
||||
RegisterNetEvent('devx_casino:client:notify', notify)
|
||||
RegisterCommand('dailywheel', spinWheel, false)
|
||||
RegisterNUICallback('close', function(_, cb) closeUi(); cb({ ok = true }) end)
|
||||
RegisterNUICallback('refresh', function(_, cb) DevXTriggerCallback('casino:status', {}, cb) end)
|
||||
RegisterNUICallback('exchange', function(data, cb) DevXTriggerCallback('casino:exchange', data, cb) end)
|
||||
RegisterNUICallback('slots', function(data, cb) DevXTriggerCallback('casino:slots', data, cb) end)
|
||||
RegisterNUICallback('roulette', function(data, cb) DevXTriggerCallback('casino:roulette', data, cb) end)
|
||||
RegisterNUICallback('blackjackStart', function(data, cb) DevXTriggerCallback('casino:blackjackStart', data, cb) end)
|
||||
RegisterNUICallback('blackjackAction', function(data, cb) DevXTriggerCallback('casino:blackjackAction', data, cb) end)
|
||||
|
||||
CreateThread(function()
|
||||
ensureCasinoInterior(); Wait(1000); spawnCasinoPeds()
|
||||
local blip = AddBlipForCoord(DevXCasinoConfig.ExteriorEntry.x, DevXCasinoConfig.ExteriorEntry.y, DevXCasinoConfig.ExteriorEntry.z)
|
||||
SetBlipSprite(blip, 679); SetBlipScale(blip, .8); SetBlipColour(blip, 27); SetBlipAsShortRange(blip, true)
|
||||
BeginTextCommandSetBlipName('STRING'); AddTextComponentString('Diamond Casino'); EndTextCommandSetBlipName(blip)
|
||||
end)
|
||||
|
||||
local points = {
|
||||
{ key = 'cashier', position = DevXCasinoConfig.Cashier, label = '~INPUT_CONTEXT~ Casino-Kasse und Chips', mode = 'cashier' },
|
||||
{ key = 'slots', position = DevXCasinoConfig.Slots, label = '~INPUT_CONTEXT~ Spielautomaten', mode = 'slots' },
|
||||
{ key = 'roulette', position = DevXCasinoConfig.Roulette, label = '~INPUT_CONTEXT~ Roulette', mode = 'roulette' },
|
||||
{ key = 'blackjack', position = DevXCasinoConfig.Blackjack, label = '~INPUT_CONTEXT~ Blackjack', mode = 'blackjack' }
|
||||
}
|
||||
|
||||
CreateThread(function()
|
||||
while true do
|
||||
local sleep = 700
|
||||
if exports.devx_core:IsPlayerLoaded() and not uiOpen then
|
||||
local coords = GetEntityCoords(PlayerPedId())
|
||||
local exterior = vector3(DevXCasinoConfig.ExteriorEntry.x, DevXCasinoConfig.ExteriorEntry.y, DevXCasinoConfig.ExteriorEntry.z)
|
||||
local interiorExit = vector3(DevXCasinoConfig.InteriorExit.x, DevXCasinoConfig.InteriorExit.y, DevXCasinoConfig.InteriorExit.z)
|
||||
if #(coords - exterior) < 12.0 then
|
||||
sleep = 0; DrawMarker(1, exterior.x, exterior.y, exterior.z - 1.0,0,0,0,0,0,0,1.1,1.1,.3,190,110,255,130,false,false,2,false,nil,nil,false)
|
||||
if #(coords - exterior) < 1.5 then help('~INPUT_CONTEXT~ Casino betreten'); if IsControlJustReleased(0,38) then ensureCasinoInterior(); teleport(DevXCasinoConfig.InteriorEntry); spawnCasinoPeds() end end
|
||||
elseif #(coords - interiorExit) < 8.0 then
|
||||
sleep = 0; DrawMarker(1, interiorExit.x, interiorExit.y, interiorExit.z - 1.0,0,0,0,0,0,0,1.0,1.0,.25,190,110,255,130,false,false,2,false,nil,nil,false)
|
||||
if #(coords - interiorExit) < 1.5 then help('~INPUT_CONTEXT~ Casino verlassen'); if IsControlJustReleased(0,38) then teleport(DevXCasinoConfig.ExteriorEntry) end end
|
||||
else
|
||||
local wheelDistance = #(coords - DevXCasinoConfig.Wheel)
|
||||
if wheelDistance < 10.0 then
|
||||
sleep = 0; DrawMarker(2, DevXCasinoConfig.Wheel.x,DevXCasinoConfig.Wheel.y,DevXCasinoConfig.Wheel.z+.15,0,0,0,0,180,0,.25,.25,.25,255,190,70,150,false,false,2,false,nil,nil,false)
|
||||
if wheelDistance < 1.8 then help(wheelBusy and 'Das Glücksrad dreht sich …' or '~INPUT_CONTEXT~ täglichen Glücksrad-Dreh starten'); if not wheelBusy and IsControlJustReleased(0,38) then spinWheel() end end
|
||||
end
|
||||
for _, point in ipairs(points) do
|
||||
local distance = #(coords - point.position)
|
||||
if distance < 8.0 then
|
||||
sleep = 0; DrawMarker(2,point.position.x,point.position.y,point.position.z+.15,0,0,0,0,180,0,.22,.22,.22,210,160,70,145,false,false,2,false,nil,nil,false)
|
||||
if distance < 1.6 then help(point.label); if IsControlJustReleased(0,38) then openUi(point.mode) end end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Wait(sleep)
|
||||
end
|
||||
end)
|
||||
|
||||
AddEventHandler('onResourceStop', function(resource)
|
||||
if resource ~= GetCurrentResourceName() then return end
|
||||
closeUi()
|
||||
for _, ped in ipairs(casinoPeds) do if DoesEntityExist(ped) then DeleteEntity(ped) end end
|
||||
end)
|
||||
Reference in New Issue
Block a user