Jump to content

[HELPMe]Ghost Driver


TwiX!

Recommended Posts

У меня не получается сделать чтобы работал 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
 
Link to comment

И ты думаешь, что кто-то займется этим большим кодом на общественных началах и доработает его для тебя? И сразу видно, что код не твой, а "многим" это дело понадобится только в виде готового ресурса в комьюнити, а не в виде кусков кода тут на русском форуме. Если ждете помощи, соизмеряйте объемы, т.к. тут не суппорт коммерческого продукта (:

Link to comment

я и не прошу дорабоать его лично для меня. я и не говорил что код мой, этот большой код я и не прошу весь переделывать, а лишь прошу помощи сделать ту часть которая запишет и воспроизведёт Record Hunter'a , вот именно что многим этот ресурс понадобиться для своих серверов :)

Link to comment

Ну-у, уважаемый, тут нужно хорошо знать структуру сего скрипта, где что и как в нем работает, чтобы уже оттолкнуться от этого и сделать воспроизведение хантера. К сожалению, об этом наверно догадывается только автор скрипта, а вникать и разгребать эту кучу врядли кто-то возьмется.

Link to comment

Ну если некому будет взяться, попрошу сделать за $ лично для себя,

сейчас у меня нет времени на скриптинг, работа :) а люди просят улучшить сервер

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...