mirror of
https://github.com/citizenfx/cfx-server-data.git
synced 2025-01-11 00:03:18 +08:00
210 lines
4.7 KiB
Lua
210 lines
4.7 KiB
Lua
|
local checkpoints = {}
|
||
|
local raceId = 0
|
||
|
|
||
|
RegisterServerEvent('race:updateCheckpoints')
|
||
|
|
||
|
AddEventHandler('race:updateCheckpoints', function(cps)
|
||
|
if #checkpoints > 0 then
|
||
|
return
|
||
|
end
|
||
|
|
||
|
checkpoints = cps
|
||
|
|
||
|
TriggerClientEvent('race:weGotPorn', -1)
|
||
|
end)
|
||
|
|
||
|
local playerData = {}
|
||
|
|
||
|
local function ensurePlayerData(id)
|
||
|
if playerData[id] then
|
||
|
return
|
||
|
end
|
||
|
|
||
|
playerData[id] = {
|
||
|
curCheckpoint = 0
|
||
|
}
|
||
|
end
|
||
|
|
||
|
local raceStarted = false
|
||
|
local playerCount = 0
|
||
|
|
||
|
local function startRace()
|
||
|
raceStarted = true
|
||
|
|
||
|
print("really starting race")
|
||
|
|
||
|
local function raceCountdown(num)
|
||
|
local time = (4000 - (num * 1000))
|
||
|
|
||
|
print("setting countdown for " .. tostring(time))
|
||
|
|
||
|
SetTimeout(time, function()
|
||
|
print("trig'd countdown for " .. tostring(time))
|
||
|
|
||
|
if num == 0 then
|
||
|
TriggerClientEvent('race:itsGoTime', -1, 0)
|
||
|
TriggerClientEvent('race:showGoMessage', -1, 'GO')
|
||
|
else
|
||
|
TriggerClientEvent('race:showGoMessage', -1, tostring(num))
|
||
|
end
|
||
|
end)
|
||
|
end
|
||
|
|
||
|
raceCountdown(3) -- 3...
|
||
|
raceCountdown(2) -- 2...
|
||
|
raceCountdown(1) -- 1...
|
||
|
raceCountdown(0) -- GOGOGO
|
||
|
end
|
||
|
|
||
|
local function incrementPlayerCount()
|
||
|
playerCount = playerCount + 1
|
||
|
|
||
|
if playerCount > 4 then
|
||
|
startRace()
|
||
|
end
|
||
|
|
||
|
if playerCount == 1 then
|
||
|
SetTimeout(3000, function()
|
||
|
if raceStarted then
|
||
|
return
|
||
|
end
|
||
|
|
||
|
print("starting race")
|
||
|
|
||
|
startRace()
|
||
|
end)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local playersFinished
|
||
|
local raceEnded
|
||
|
|
||
|
AddEventHandler('onMapStart', function()
|
||
|
playerCount = 0
|
||
|
playersFinished = 0
|
||
|
raceId = raceId + 1
|
||
|
raceStarted = false
|
||
|
raceEnded = false
|
||
|
|
||
|
playerData = {}
|
||
|
checkpoints = {}
|
||
|
|
||
|
print("mmmmmm race")
|
||
|
end)
|
||
|
|
||
|
local function endRace()
|
||
|
raceEnded = true
|
||
|
|
||
|
TriggerClientEvent('race:results', -1, '1234')
|
||
|
|
||
|
SetTimeout(7500, function()
|
||
|
TriggerEvent('mapmanager:roundEnded')
|
||
|
end)
|
||
|
end
|
||
|
|
||
|
AddEventHandler('race:onPlayerFinished', function(player)
|
||
|
print(GetPlayerName(player) .. ' finished')
|
||
|
|
||
|
local data = playerData[player]
|
||
|
local finishSeconds = os.clock() - data.startTime
|
||
|
|
||
|
local position = playersFinished + 1
|
||
|
data.position = position
|
||
|
playersFinished = position
|
||
|
|
||
|
TriggerClientEvent('race:onPlayerFinished', -1, player, {
|
||
|
finishSeconds = finishSeconds,
|
||
|
position = position
|
||
|
})
|
||
|
|
||
|
if playersFinished == playerCount then
|
||
|
endRace()
|
||
|
elseif playersFinished == 1 then
|
||
|
local thisRaceId = raceId
|
||
|
|
||
|
TriggerClientEvent('race:hurryUp', -1, 30000)
|
||
|
|
||
|
SetTimeout(30000, function()
|
||
|
if raceId ~= thisRaceId or raceEnded then
|
||
|
return
|
||
|
end
|
||
|
|
||
|
endRace()
|
||
|
end)
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
AddEventHandler('playerActivated', function()
|
||
|
if #checkpoints > 0 then
|
||
|
TriggerClientEvent('race:weGotPorn', source)
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
RegisterServerEvent('race:requestGo')
|
||
|
|
||
|
AddEventHandler('race:requestGo', function()
|
||
|
if #checkpoints > 0 then
|
||
|
TriggerClientEvent('race:weGotPorn', source)
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
AddEventHandler('playerDropped', function(player)
|
||
|
if playerData[player] and playerData[player].curCheckpoint > 0 then
|
||
|
TriggerClientEvent('race:updateStatus', -1, player, -1)
|
||
|
|
||
|
playerCount = playerCount - 1
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
RegisterServerEvent('race:gotCP')
|
||
|
|
||
|
AddEventHandler('race:gotCP', function()
|
||
|
ensurePlayerData(source)
|
||
|
|
||
|
local data = playerData[source]
|
||
|
|
||
|
local next = data.curCheckpoint + 1
|
||
|
|
||
|
if next > #checkpoints then
|
||
|
print("omg finished")
|
||
|
|
||
|
TriggerEvent('race:onPlayerFinished', source)
|
||
|
|
||
|
return
|
||
|
end
|
||
|
|
||
|
data.curCheckpoint = next
|
||
|
|
||
|
TriggerClientEvent('race:confirmCP', source) -- for sound effects
|
||
|
TriggerClientEvent('race:setCheckpoint', source, checkpoints[next], checkpoints[next + 1], checkpoints[next + 2])
|
||
|
TriggerClientEvent('race:updateStatus', -1, source, next - 1)
|
||
|
end)
|
||
|
|
||
|
RegisterServerEvent('race:requestCheckpoint')
|
||
|
|
||
|
AddEventHandler('race:requestCheckpoint', function()
|
||
|
print('is it even in here')
|
||
|
|
||
|
ensurePlayerData(source)
|
||
|
|
||
|
print(source, 'requesting cp')
|
||
|
|
||
|
if playerData[source].curCheckpoint == 0 then
|
||
|
incrementPlayerCount()
|
||
|
|
||
|
print(source, 'requesting cp 0')
|
||
|
|
||
|
local curCP = 1
|
||
|
playerData[source].curCheckpoint = curCP
|
||
|
playerData[source].startTime = os.clock()
|
||
|
|
||
|
TriggerClientEvent('race:setCheckpoint', source, checkpoints[curCP], checkpoints[curCP + 1], checkpoints[curCP + 2])
|
||
|
TriggerClientEvent('race:updateStatus', -1, source, 0)
|
||
|
|
||
|
-- should have raceReallyStarted since 4-second countdown
|
||
|
if raceStarted then
|
||
|
TriggerClientEvent('race:itsGoTime', -1, 0)
|
||
|
end
|
||
|
end
|
||
|
end)
|