Jump to content

destructionderby.lua


SuleymanM

Recommended Posts

Bro, I have race gamemode by arc_ implementator, But i try to solve this problem but not effect.

-----> Rankingboard not function.

Problem:

[gamemodes]\[race]\race\modes\destructionderby.lua:152: attempt to index global 'g_CurrentRaceMode' (a nil value)

-- destructionderby.lua

DestructionDerby = setmetatable({}, RaceMode) 
DestructionDerby.__index = DestructionDerby 
  
DestructionDerby:register('Destruction derby') 
  
function DestructionDerby:isApplicable() 
    return not RaceMode.checkpointsExist() and RaceMode.getMapOption('respawn') == 'none' 
end 
  
function DestructionDerby:getPlayerRank(player) 
    return #getActivePlayers() 
end 
  
-- Copy of old updateRank 
function DestructionDerby:updateRanks() 
    for i,player in ipairs(g_Players) do 
        if not isPlayerFinished(player) then 
            local rank = self:getPlayerRank(player) 
            if not rank or rank > 0 then 
                setElementData(player, 'race rank', rank) 
            end 
        end 
    end 
    -- Make text look good at the start 
    if not self.running then 
        for i,player in ipairs(g_Players) do 
            setElementData(player, 'race rank', '' ) 
            setElementData(player, 'checkpoint', '' ) 
        end 
    end 
end 
  
function endTheMap() 
    RaceMode.endMap() 
end 
  
function DestructionDerby:onPlayerWasted(player) 
    if isActivePlayer(player) then 
        self:handleFinishActivePlayer(player) 
        if getActivePlayerCount() <= 0 then 
            endTheMap() 
        else 
            TimerManager.createTimerFor("map",player):setTimer(clientCall, 2000, 1, player, 'Spectate.start', 'auto') 
        end 
    end 
    RaceMode.setPlayerIsFinished(player) 
    showBlipsAttachedTo(player, false) 
end 
  
function DestructionDerby:onPlayerQuit(player) 
    if isActivePlayer(player) then 
        self:handleFinishActivePlayer(player) 
        if getActivePlayerCount() <= 0 then 
            endTheMap() 
        end 
    end 
end 
  
function checkForHunter(number,sort,model) 
    if #getElementsByType("player") <= 0 then return end 
    local activePlayers = getActivePlayers() 
    if #activePlayers == 1 then 
        local vehicle = getPedOccupiedVehicle(activePlayers[1]) 
        if getElementModel(vehicle) == 425 then             setElementHealth(activePlayers[1],0)         
end 
    end 
end 
  
addEvent('onPlayerPickUpRacePickup',true) 
addEventHandler("onPlayerPickUpRacePickup",getRootElement(),checkForHunter) 
  
function DestructionDerby:handleFinishActivePlayer(player) 
    -- Update ranking board for player being removed 
    if not self.rankingBoard then 
        self.rankingBoard = RankingBoard:create() 
        self.rankingBoard:setDirection( 'up', getActivePlayerCount() ) 
    end 
    local timePassed = self:getTimePassed() 
    self.rankingBoard:add(player, timePassed) 
    -- Do remove 
    finishActivePlayer(player) 
    -- Update ranking board if one player left 
    local activePlayers = getActivePlayers() 
    if #activePlayers == 2 then 
        triggerClientEvent ( "savetag3",getRootElement(),_getPlayerName(player)) 
    end 
    if #activePlayers == 1 then 
        triggerClientEvent ( "savetag2",getRootElement(),_getPlayerName(player)) 
    end 
    if #activePlayers == 0 then 
        self.rankingBoard:add(activePlayers[1], timePassed) 
        triggerClientEvent ( "savetag",getRootElement(),_getPlayerName(player)) 
        triggerEvent("peds",getRootElement()) 
        --triggerEvent("onPlayerDestructionDerbyWin", getRootElement(), player) 
        --saveDeathPlayer(activePlayers[1]) 
        --addPodiumPlayer(activePlayers[1]) 
        local timeravviato = false 
        if timeravviato == false then 
            setTimer (checkForHunter , 100, 0, player ) 
            timeravviato = true 
        end 
    end 
     
    if #activePlayers == 1 then 
        --showMessage(getPlayerName(activePlayers[1]) .. ' pwned you all!', 171, 7, 7) 
triggerClientEvent ( "Winnertext", getRootElement(), activePlayers[1]  ) 
triggerEvent("onPlayerDestructionDerbyWin", getRootElement(), activePlayers[1]) 
  
        local car = getPedOccupiedVehicle(activePlayers[1]) 
        if car then 
            local model = getElementModel(car) 
            if model == 425 then 
                setElementHealth(activePlayers[1],0) 
            end 
        end 
    end 
end 
  
  
  
------------------------------------------------------------ 
-- activePlayerList stuff 
-- 
  
function isActivePlayer( player ) 
    return table.find( g_CurrentRaceMode.activePlayerList, player ) 
end 
  
function addActivePlayer( player ) 
    table.insertUnique( g_CurrentRaceMode.activePlayerList, player ) 
end 
  
function removeActivePlayer( player ) 
    table.removevalue( g_CurrentRaceMode.activePlayerList, player ) 
end 
  
function finishActivePlayer( player ) 
    table.removevalue( g_CurrentRaceMode.activePlayerList, player ) 
    table.insertUnique( g_CurrentRaceMode.finishedPlayerList, _getPlayerName(player) ) 
end 
  
function getFinishedPlayerCount() 
    return #g_CurrentRaceMode.finishedPlayerList 
end 
  
function getActivePlayerCount() 
    return #g_CurrentRaceMode.activePlayerList 
end 
  
function getActivePlayers() 
    if #getElementsByType("player") > 0 then 
    return g_CurrentRaceMode.activePlayerList 
    else 
        return false 
    end 
end 
  
  

Link to comment
  • Moderators

Ok try this (copy-paste everything):

DestructionDerby = setmetatable({}, RaceMode) 
DestructionDerby.__index = DestructionDerby 
  
DestructionDerby:register('Destruction derby') 
  
function DestructionDerby:isApplicable() 
    return not RaceMode.checkpointsExist() and RaceMode.getMapOption('respawn') == 'none' 
end 
  
function DestructionDerby:getPlayerRank(player) 
    return #getActivePlayers() 
end 
  
-- Copy of old updateRank 
function DestructionDerby:updateRanks() 
    for i,player in ipairs(g_Players) do 
        if not isPlayerFinished(player) then 
            local rank = self:getPlayerRank(player) 
            if not rank or rank > 0 then 
                setElementData(player, 'race rank', rank) 
            end 
        end 
    end 
    -- Make text look good at the start 
    if not self.running then 
        for i,player in ipairs(g_Players) do 
            setElementData(player, 'race rank', '' ) 
            setElementData(player, 'checkpoint', '' ) 
        end 
    end 
end 
  
function endTheMap() 
    RaceMode.endMap() 
end 
  
function DestructionDerby:onPlayerWasted(player) 
    if isActivePlayer(player) then 
        self:handleFinishActivePlayer(player) 
        if getActivePlayerCount() <= 0 then 
            endTheMap() 
        else 
            TimerManager.createTimerFor("map",player):setTimer(clientCall, 2000, 1, player, 'Spectate.start', 'auto') 
        end 
    end 
    RaceMode.setPlayerIsFinished(player) 
    showBlipsAttachedTo(player, false) 
end 
  
function DestructionDerby:onPlayerQuit(player) 
    if isActivePlayer(player) then 
        self:handleFinishActivePlayer(player) 
        if getActivePlayerCount() <= 0 then 
            endTheMap() 
        end 
    end 
end 
  
function checkForHunter(number,pickType,model) 
    if #getElementsByType("player") <= 0 then return end 
    local activePlayers = getActivePlayers() 
    if #activePlayers == 1 then 
        local vehicle = getPedOccupiedVehicle(activePlayers[1]) 
        if getElementModel(vehicle) == 425 then 
            setElementHealth(activePlayers[1],0)        
        end 
    end 
end 
addEvent('onPlayerPickUpRacePickup',true) 
addEventHandler("onPlayerPickUpRacePickup", getRootElement(), checkForHunter) 
  
function DestructionDerby:handleFinishActivePlayer(player) 
    -- Update ranking board for player being removed 
    if not self.rankingBoard then 
        self.rankingBoard = RankingBoard:create() 
        self.rankingBoard:setDirection( 'up', getActivePlayerCount() ) 
    end 
    local timePassed = self:getTimePassed() 
    self.rankingBoard:add(player, timePassed) 
    -- Do remove 
    finishActivePlayer(player) 
    -- Update ranking board if one player left 
    local activePlayers = getActivePlayers() 
    if #activePlayers == 2 then 
        triggerClientEvent ( "savetag3",getRootElement(),_getPlayerName(player)) 
    end 
    if #activePlayers == 1 then 
        triggerClientEvent ( "savetag2",getRootElement(),_getPlayerName(player)) 
    end 
    if #activePlayers == 0 then 
        self.rankingBoard:add(activePlayers[1], timePassed) 
        triggerClientEvent ( "savetag",getRootElement(),_getPlayerName(player)) 
        triggerEvent("peds",getRootElement()) 
        --triggerEvent("onPlayerDestructionDerbyWin", getRootElement(), player) 
        --saveDeathPlayer(activePlayers[1]) 
        --addPodiumPlayer(activePlayers[1]) 
        local timeravviato = false 
        if timeravviato == false then 
            setTimer (checkForHunter , 100, 0, player ) 
            timeravviato = true 
        end 
    end 
    
    if #activePlayers == 1 then 
        --showMessage(getPlayerName(activePlayers[1]) .. ' pwned you all!', 171, 7, 7) 
        triggerClientEvent ( "Winnertext", getRootElement(), activePlayers[1]  ) 
        triggerEvent("onPlayerDestructionDerbyWin", getRootElement(), activePlayers[1]) 
  
        local car = getPedOccupiedVehicle(activePlayers[1]) 
        if car then 
            local model = getElementModel(car) 
            if model == 425 then 
                setElementHealth(activePlayers[1],0) 
            end 
        end 
    end 
end 
  
  
  
------------------------------------------------------------ 
-- activePlayerList stuff 
-- 
function initializeCurrentRaceMode() 
    g_CurrentRaceMode = {} 
    g_CurrentRaceMode.activePlayerList = getElementsByType("player") 
    g_CurrentRaceMode.finishedPlayerList = {} 
end 
addEventHandler("onResourceStart", resourceRoot, initializeCurrentRaceMode) 
addEvent("onMapStarting", true) -- not sure if needed 
addEventHandler("onMapStarting", root, initializeCurrentRaceMode) 
  
  
function isActivePlayer( player ) 
    return table.find( g_CurrentRaceMode.activePlayerList, player ) 
end 
  
function addActivePlayer( player ) 
    table.insertUnique( g_CurrentRaceMode.activePlayerList, player ) 
end 
  
function removeActivePlayer( player ) 
    table.removevalue( g_CurrentRaceMode.activePlayerList, player ) 
end 
  
function finishActivePlayer( player ) 
    table.removevalue( g_CurrentRaceMode.activePlayerList, player ) 
    table.insertUnique( g_CurrentRaceMode.finishedPlayerList, _getPlayerName(player) ) 
end 
  
function getFinishedPlayerCount() 
    return #g_CurrentRaceMode.finishedPlayerList 
end 
  
function getActivePlayerCount() 
    return #g_CurrentRaceMode.activePlayerList 
end 
  
function getActivePlayers() 
    return g_CurrentRaceMode.activePlayerList 
end 
  
  
---- !!! DELETE THIS PART ONLY IF THE SERVER ASK YOU TO DELETE table.find !!! ---- 
if type(table.find) == nil then 
    _G.table.find = function(t, d) 
        if t == nil or d == nil or type(t) ~= "table" then return nil end 
        for k, i in ipairs(t) do 
            if i == d then return true end 
        end 
        return false 
    end 
else 
    outputDebugString( "table.find function is already defined, you can delete it !", 2) 
end 
  
---- !!! DELETE THIS PART ONLY IF THE SERVER ASK YOU TO DELETE table.insertUnique !!! ---- 
if type(table.insertUnique) == nil then 
    _G.table.insertUnique = function(t, d) 
        if t == nil or d == nil or type(t) ~= "table" then return nil end 
        for k, i in ipairs(t) do 
            if i == d then return false end 
        end 
        return table.insert(t, d) 
    end 
else 
    outputDebugString( "table.insertUnique function is already defined, you can delete it !", 2) 
end 
  
---- !!! DELETE THIS PART ONLY IF THE SERVER ASK YOU TO DELETE table.removevalue !!! ---- 
if type(table.removevalue) == nil then 
    _G.table.removevalue = function(t, d) 
        if t == nil or d == nil or type(t) ~= "table" then return nil end 
        for k, i in ipairs(t) do 
            if i == d then return table.remove(t, k) end 
        end 
        return false 
    end 
else 
    outputDebugString( "table.removevalue function is already defined, you can delete it !", 2) 
end 

And I don't understand this function:

function checkForHunter(number,pickType,model) 

It will just kill the last guy that still alive and just got the hunter.

But if he is the last guy, the game il already over and he can't get the hunter (imo)

So I'm pretty sure that you can delete it since you are doing right at the end of the handleFinishActivePlayer method.

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...