Jump to content

TwiX!

Members
  • Posts

    905
  • Joined

  • Last visited

Everything posted by TwiX!

  1. У меня не получается сделать чтобы работал GhostDriver нормально, у меня свой [DM]Server я хочу сделать так, чтобы после того как игрок сделал топ 1 (получил hunter время игрока записывается в топ ) запись была сделана. Когда в следующий раз игроки будут играть на той карте, там будет Ghost (того игрока кто сделал лучший топ (top1)) В данном случае записывает только после окончании Race конец гонки, НО не работает когда на Hunter'e он делает топ Стандарт Client GhostRecord = {} GhostRecord.__index = GhostRecord addEvent"onClientMapStarting" addEvent"onClientPlayerOutOfTime" addEvent( "onClientPlayerPickUpRacePickup", true ) addEvent( "onClientPlayerRaceWasted", true ) addEvent( "onClientPlayerFinished", true ) function GhostRecord:create( resourceName ) local result = { positionTimer = nil, recording = {}, isRecording = false, currentMapName = nil, keyStates = {}, lastPressed = {}, vehicleType = nil, last = {}, resourceName = resourceName, } return setmetatable( result, self ) end function GhostRecord:init() self.checkForCountdownEnd_HANDLER = function() self:checkForCountdownEnd() end addEventHandler( "onClientRender", g_Root, self.checkForCountdownEnd_HANDLER ) outputDebug( "Waiting for start..." ) end function GhostRecord:destroy() self:stopRecording() if self.checkForCountdownEnd_HANDLER then removeEventHandler( "onClientRender", g_Root, self.checkForCountdownEnd_HANDLER ) self.checkForCountdownEnd_HANDLER = nil end if self.waitForNewVehicle_HANDLER then removeEventHandler( "onClientRender", g_Root, self.waitForNewVehicle_HANDLER ) self.waitForNewVehicle_HANDLER = nil end if self.checkStateChanges_HANDLER then removeEventHandler( "onClientRender", g_Root, self.checkStateChanges_HANDLER ) self.checkStateChanges_HANDLER = nil end if self.playerRaceWasted_HANDLER then removeEventHandler( "onClientPlayerRaceWasted", getLocalPlayer(), self.playerRaceWasted_HANDLER ) self.playerRaceWasted_HANDLER = nil end if self.playerFinished_HANDLER then removeEventHandler( "onClientPlayerFinished", getLocalPlayer(), self.playerFinished_HANDLER ) self.playerFinished_HANDLER = nil end if self.playerPickUpRacePickup_HANDLER then removeEventHandler( "onClientPlayerPickUpRacePickup", getLocalPlayer(), self.playerPickUpRacePickup_HANDLER ) self.playerPickUpRacePickup_HANDLER = nil end if self.playerOutOfTime_HANDLER then removeEventHandler( "onClientPlayerOutOfTime", getLocalPlayer(), self.playerOutOfTime_HANDLER ) self.playerOutOfTime_HANDLER = nil end if isTimer( self.positionTimer ) then killTimer( self.positionTimer ) self.positionTimer = nil self.updateExactPosition_HANDLER = nil end self = nil end function GhostRecord:checkForCountdownEnd() local vehicle = getPedOccupiedVehicle( getLocalPlayer() ) if vehicle then local frozen = isVehicleFrozen( vehicle ) if not frozen then self.currentVehicleType = getElementModel( vehicle ) local pedModel = getElementModel( getLocalPlayer() ) local x, y, z = getElementPosition( vehicle ) local rX, rY, rZ = getElementRotation( vehicle ) table.insert( self.recording, { ty = "st", m = self.currentVehicleType, p = pedModel, x = x, y = y, z = z, rX = rX, rY = rY, rZ = rZ, t = 0 } ) if self.checkForCountdownEnd_HANDLER then removeEventHandler( "onClientRender", g_Root, self.checkForCountdownEnd_HANDLER ) self.checkForCountdownEnd_HANDLER = nil end self:startRecording() end end end function GhostRecord:waitForNewVehicle() local vehicle = getPedOccupiedVehicle( getLocalPlayer() ) if vehicle then local vHealth = getElementHealth( vehicle ) local pHealth = getElementHealth( getLocalPlayer() ) local frozen = isVehicleFrozen( vehicle ) if vHealth > 99 and pHealth > 99 and not frozen then local ticks = getTickCount() - self.startTick table.insert( self.recording, { ty = "sp", t = ticks } ) if self.waitForNewVehicle_HANDLER then removeEventHandler( "onClientRender", g_Root, self.waitForNewVehicle_HANDLER ) self.waitForNewVehicle_HANDLER = nil end self:resumeRecording() end end end function GhostRecord:startRecording() if not self.isRecording then outputDebug( "Recording started." ) self.startTick = getTickCount() self:resetKeyStates() self.isRecording = true self.checkStateChanges_HANDLER = function() self:checkStateChanges() end addEventHandler( "onClientRender", g_Root, self.checkStateChanges_HANDLER ) self.playerRaceWasted_HANDLER = function( ... ) self:playerRaceWasted( ... ) end addEventHandler( "onClientPlayerRaceWasted", getLocalPlayer(), self.playerRaceWasted_HANDLER ) self.playerFinished_HANDLER = function( ... ) self:playerFinished( ... ) end addEventHandler( "onClientPlayerFinished", getLocalPlayer(), self.playerFinished_HANDLER ) self.playerPickUpRacePickup_HANDLER = function( ... ) self:playerPickUpRacePickup( ... ) end addEventHandler( "onClientPlayerPickUpRacePickup", getLocalPlayer(), self.playerPickUpRacePickup_HANDLER ) self.playerOutOfTime_HANDLER = function() self:playerOutOfTime() end addEventHandler( "onClientPlayerOutOfTime", getLocalPlayer(), self.playerOutOfTime_HANDLER ) self.updateExactPosition_HANDLER = function() self:updateExactPosition() end self.positionTimer = setTimer( self.updateExactPosition_HANDLER, POSITION_PULSE, 0 ) end end function GhostRecord:pauseRecording() if self.isRecording then outputDebug( "Recording paused." ) self.isRecording = false if self.checkStateChanges_HANDLER then removeEventHandler( "onClientRender", g_Root, self.checkStateChanges_HANDLER ) self.checkStateChanges_HANDLER = nil end if isTimer( self.positionTimer ) then killTimer( self.positionTimer ) self.positionTimer = nil self.updateExactPosition_HANDLER = nil end self.waitForNewVehicle_HANDLER = function() self:waitForNewVehicle() end addEventHandler( "onClientRender", g_Root, self.waitForNewVehicle_HANDLER ) end end function GhostRecord:resumeRecording() if not self.isRecording then outputDebug( "Recording resumed." ) self.isRecording = true self:resetKeyStates() self.checkStateChanges_HANDLER = function() self:checkStateChanges() end addEventHandler( "onClientRender", g_Root, self.checkStateChanges_HANDLER ) self.updateExactPosition_HANDLER = function() self:updateExactPosition() end self.positionTimer = setTimer( self.updateExactPosition_HANDLER, POSITION_PULSE, 0 ) end end function GhostRecord:stopRecording() if self.isRecording then outputDebug( "Recording finished." ) self.isRecording = false if self.checkForCountdownEnd_HANDLER then removeEventHandler( "onClientRender", g_Root, self.checkForCountdownEnd_HANDLER ) self.checkForCountdownEnd_HANDLER = nil end if self.waitForNewVehicle_HANDLER then removeEventHandler( "onClientRender", g_Root, self.waitForNewVehicle_HANDLER ) self.waitForNewVehicle_HANDLER = nil end if self.checkStateChanges_HANDLER then removeEventHandler( "onClientRender", g_Root, self.checkStateChanges_HANDLER ) self.checkStateChanges_HANDLER = nil end if self.playerRaceWasted_HANDLER then removeEventHandler( "onClientPlayerRaceWasted", getLocalPlayer(), self.playerRaceWasted_HANDLER ) self.playerRaceWasted_HANDLER = nil end if self.playerFinished_HANDLER then removeEventHandler( "onClientPlayerFinished", getLocalPlayer(), self.playerFinished_HANDLER ) self.playerFinished_HANDLER = nil end if self.playerPickUpRacePickup_HANDLER then removeEventHandler( "onClientPlayerPickUpRacePickup", getLocalPlayer(), self.playerPickUpRacePickup_HANDLER ) self.playerPickUpRacePickup_HANDLER = nil end if self.playerOutOfTime_HANDLER then removeEventHandler( "onClientPlayerOutOfTime", getLocalPlayer(), self.playerOutOfTime_HANDLER ) self.playerOutOfTime_HANDLER = nil end if isTimer( self.positionTimer ) then killTimer( self.positionTimer ) self.positionTimer = nil self.updateExactPosition_HANDLER = nil end end end function GhostRecord:saveGhost( rank, time ) if time < globalInfo.bestTime and rank == 1 then outputDebug( "Improved ghost time." ) triggerServerEvent( "onGhostDataReceive", getLocalPlayer(), self.recording, time, getPlayerName( getLocalPlayer() ), self.resourceName ) end end function GhostRecord:checkStateChanges() -- Keys for _, v in ipairs( keyNames ) do local state = getControlState( v ) if not state and analogNames[v] then -- Not a really good implementation, but didn't think if anything else state = getAnalogControlState( v ) >= 0.5 end if state ~= self.keyStates[v] then local ticks = getTickCount() - self.startTick if (state and ticks - (self.lastPressed[v] or 0) >= KEYSPAM_LIMIT) or not state then -- Don't record shooting for hydra/hunter/seasparrow/rhino local vehicle = getPedOccupiedVehicle( getLocalPlayer() ) local donotrecord = false if isElement( vehicle ) then local model = getElementModel( vehicle ) if (model == 520 or model == 425 or model == 447 or model == 432) and (v == "vehicle_fire" or v == "vehicle_secondary_fire") and state then donotrecord = true end end if not donotrecord then table.insert( self.recording, { ty = "k", k = v, s = state, t = ticks } ) self.keyStates[v] = state outputDebug( "Key state change: " .. v .. " = " .. tostring( state ) ) if state then self.lastPressed[v] = ticks end end end end end -- Vehicle change local vehicle = getPedOccupiedVehicle( getLocalPlayer() ) if vehicle then local vehicleType = getElementModel( vehicle ) if self.currentVehicleType ~= vehicleType then local ticks = getTickCount() - self.startTick table.insert( self.recording, { ty = "v", m = vehicleType, t = ticks } ) outputDebug( "Vehicle change: " .. self.currentVehicleType .. " -> " .. vehicleType ) self.currentVehicleType = vehicleType end end end function GhostRecord:updateExactPosition() local vehicle = getPedOccupiedVehicle( getLocalPlayer() ) if isElement( vehicle ) then local x, y, z = getElementPosition( vehicle ) if self.last.x then if math.abs( self.last.x - x ) < 0.1 and math.abs( self.last.y - y ) < 0.1 and math.abs( self.last.z - z ) < 0.1 then return end end local rX, rY, rZ = getElementRotation( vehicle ) local vX, vY, vZ = getElementVelocity( vehicle ) local lg = getVehicleLandingGearDown( vehicle ) local health = getElementHealth( vehicle ) local ticks = getTickCount() - self.startTick table.insert( self.recording, { ty = "po", x = x, y = y, z = z, rX = rX, rY = rY, rZ = rZ, vX = vX, vY = vY, vZ = vZ, lg = lg, h = health, t = ticks } ) self.last = { x = x, y = y, z = z } outputDebug( "Pos update." ) end end function GhostRecord:playerFinished( rank, time ) self:saveGhost( rank, time ) self:stopRecording() end function GhostRecord:playerOutOfTime() self:stopRecording() end function GhostRecord:playerRaceWasted( vehicle ) self:pauseRecording() end function GhostRecord:playerPickUpRacePickup( _, pickupType, model ) if self.isRecording then if pickupType == "nitro" then local ticks = getTickCount() - self.startTick table.insert( self.recording, { ty = "pi", i = "n", t = ticks } ) outputDebug( "Picked up 'nitro' pickup." ) elseif pickupType == "repair" then local ticks = getTickCount() - self.startTick table.insert( self.recording, { ty = "pi", i = "r", t = ticks } ) outputDebug( "Picked up 'repair' pickup." ) end end end function GhostRecord:resetKeyStates() for _, v in ipairs( keyNames ) do self.keyStates[v] = false end end
×
×
  • Create New...