TwiX! Posted September 11, 2011 Share Posted September 11, 2011 У меня не получается сделать чтобы работал 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
MX_Master Posted September 11, 2011 Share Posted September 11, 2011 И ты думаешь, что кто-то займется этим большим кодом на общественных началах и доработает его для тебя? И сразу видно, что код не твой, а "многим" это дело понадобится только в виде готового ресурса в комьюнити, а не в виде кусков кода тут на русском форуме. Если ждете помощи, соизмеряйте объемы, т.к. тут не суппорт коммерческого продукта (: Link to comment
TwiX! Posted September 11, 2011 Author Share Posted September 11, 2011 я и не прошу дорабоать его лично для меня. я и не говорил что код мой, этот большой код я и не прошу весь переделывать, а лишь прошу помощи сделать ту часть которая запишет и воспроизведёт Record Hunter'a , вот именно что многим этот ресурс понадобиться для своих серверов Link to comment
DakiLLa Posted September 11, 2011 Share Posted September 11, 2011 Ну-у, уважаемый, тут нужно хорошо знать структуру сего скрипта, где что и как в нем работает, чтобы уже оттолкнуться от этого и сделать воспроизведение хантера. К сожалению, об этом наверно догадывается только автор скрипта, а вникать и разгребать эту кучу врядли кто-то возьмется. Link to comment
TwiX! Posted September 11, 2011 Author Share Posted September 11, 2011 Ну если некому будет взяться, попрошу сделать за $ лично для себя, сейчас у меня нет времени на скриптинг, работа а люди просят улучшить сервер Link to comment
TwiX! Posted September 12, 2011 Author Share Posted September 12, 2011 сам уже сделал Link to comment
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now