1
0
mirror of https://github.com/citizenfx/cfx-server-data.git synced 2025-01-11 00:03:18 +08:00
cfx-server-data/resources/[gamemodes]/race/race_server.lua
2016-12-15 13:40:07 +01:00

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)