Jump to content

AutoB like (Last Player alive finish DM)


h4x7o0r

Recommended Posts

Hey guys , i've tried to modify the destructionderby.lua to work just like autob resource.

To be more explicit: on DM maps for example I wanna let last player alive to finish the map ( by default when 1 player's remaining the race's considered finished and votemanager starts vote or nextmap). And also when last player alive is taking the hunter (425 veh) race to be finished and votemap to appear.

I've tried some many ways to make it work but without any luck.

Here's the last destructionderby.lua (res:0910)

  
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 DestructionDerby:onPlayerWasted(player) 
    if isActivePlayer(player) then 
        self:handleFinishActivePlayer(player) 
        if getActivePlayerCount() <= 1 then 
            RaceMode.endMap() 
        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() <= 1 then 
            RaceMode.endMap() 
        end 
    end 
end 
  
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 
    local rank = self:getPlayerRank(player) 
    finishActivePlayer(player) 
    if rank and rank > 1 then 
        triggerEvent( "onPlayerFinishDD",player,tonumber( rank ) ) 
    end 
    -- Update ranking board if one player left 
    local activePlayers = getActivePlayers() 
    if #activePlayers == 1 then 
        self.rankingBoard:add(activePlayers[1], timePassed) 
        showMessage(getPlayerName(activePlayers[1]) .. ' is the final survivor!', 0, 255, 0) 
        triggerEvent( "onPlayerWinDD",activePlayers[1] ) 
    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() 
    return g_CurrentRaceMode.activePlayerList 
end 
  

and i've tried to change onPlayerWasted Function like this :

  
        if getActivePlayerCount() <= 1 then 
  
-- WITH this one 
  
            if getActivePlayerCount() < 1 then 
  

or to add another handler :

  
  
  
    addEventHandler("onElementModelChange",root, 
    function(old,new) 
        if (getElementType(source) == "vehicle") then 
                if #activePlayers == 1 then 
                    if (new == 425) then 
                        RaceMode.endMap() 
                    end 
                end 
        end 
    end) 
  

or maybe :

  
    -- Update ranking board if one player left 
    local activePlayers = getActivePlayers() 
    if #activePlayers == 1 then 
        self.rankingBoard:add(activePlayers[1], timePassed) 
        showMessage(getPlayerName(activePlayers[1]) .. ' is the final survivor!', 0, 255, 0) 
        triggerEvent( "onPlayerWinDD",activePlayers[1] ) 
         if (getElementModel(getPedOccupiedVehicle(activePlayers[1])) == 425) then 
        RaceMode.endMap() 
    end 
  

How can i fix it to work , i've tried to create a separate resource but didn't know how to trigger activeplayers function from there. That would have been more useful .

Thanks in advance.

Edited by Guest
Link to comment
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 DestructionDerby:onPlayerWasted(player) 
    if isActivePlayer(player) then 
        self:handleFinishActivePlayer(player) 
        if getActivePlayerCount() <= 0 then 
            RaceMode.endMap() 
        else 
            TimerManager.createTimerFor("map",player):setTimer(clientCall, 2000, 1, player, 'Spectate.start', 'auto') 
        end 
    end 
    RaceMode.setPlayerIsFinished(player) 
    showBlipsAttachedTo(player, false) 
end 
function hunterAlert(mapInfo, pickupID, pickupType, vehicleModel) 
    if pickupType == "vehiclechange" then 
        if vehicleModel == 425 then 
            if getActivePlayerCount() <= 1 then 
                RaceMode.endMap() 
            end 
        end 
    end 
end 
addEventHandler("onPlayerPickUpRacePickup",getRootElement(),hunterAlert) 
function DestructionDerby:onPlayerQuit(player) 
    if isActivePlayer(player) then 
        self:handleFinishActivePlayer(player) 
        if getActivePlayerCount() <= 1 then 
            RaceMode.endMap() 
        end 
    end 
end 
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 
    local rank = self:getPlayerRank(player) 
    finishActivePlayer(player) 
    if rank and rank > 1 then 
        triggerEvent( "onPlayerFinishDD",player,tonumber( rank ) ) 
    end 
    -- Update ranking board if one player left 
    local activePlayers = getActivePlayers() 
    if #activePlayers == 1 then 
        self.rankingBoard:add(activePlayers[1], timePassed) 
        showMessage(getPlayerName(activePlayers[1]) .. ' is the final survivor!', 0, 255, 0) 
        triggerEvent( "onPlayerWinDD",activePlayers[1] ) 
    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() 
    return g_CurrentRaceMode.activePlayerList 
end 

Link to comment

Try to check the map name when 'alivePlayers == 1':

  
local resource = exports["mapmanager"]:getRunningGamemodeMap( ) 
local mapName = getResourceInfo ( resource, "name" ) 
if string.find ( mapName, "[DD]" ) then 
-- do whatever it is supposed to do 
else 
if getElementModel (getPedOccupiedVehicle ( alivePlayers[1] )) == 425 then -- its not a DD and the alive player has a hunter 
-- do whatever it is supposed to do 
else 
-- do not end the map and show the winner message 
end 
end 
  

Link to comment

Thank you for your help.

I've seen the script that u provided but there are some things that aren't that clear for me.

I think there's a standalone script and not a modification of the destructionderby.lua

With this one i should call or trigger some functions from from he main destructionderby.lua :

  
function DestructionDerby:onPlayerQuit(player)  
function DestructionDerby:onPlayerWasted(player) 
  

And definitely i don;t know to restrict to dd or dm.

Link to comment

I haven't really looked into the default script but all you have to do is to modify the

function DestructionDerby:handleFinishActivePlayer(player) 

with what i wrote, i think thats the way to go.

Whenever a player dies or leaves the server that function will be triggered.

Link to comment

Well i've tried what you've suggested before but looks like the script still not working at all.

Here's what i've tried but i think isn't the best choice to modify this function DestructionDerby:handleFinishActivePlayer(player) :

  
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() 
    local resource = exports["mapmanager"]:getRunningGamemodeMap( )  
    local mapName = getResourceInfo ( resource, "name" ) 
    if string.find ( mapName, "[DD]" ) then  
    if #activePlayers == 1 then 
        self.rankingBoard:add(activePlayers[1], timePassed) 
        showMessage(getPlayerName(activePlayers[1]) .. ' won the map!', 255, 0, 0) 
        RaceMode.endMap() 
    end 
    elseif string.find ( mapName, "[DM]" ) then  
        if #activePlayers < 1 then 
           if getElementModel (getPedOccupiedVehicle ( alivePlayers[1] )) == 425 then 
        self.rankingBoard:add(activePlayers[1], timePassed) 
        showMessage(getPlayerName(activePlayers[1]) .. ' won the map!', 255, 0, 0) 
        RaceMode.endMap() 
         end 
      end 
    end 
end 
  

Link to comment
function DestructionDerby:onPlayerWasted(player) 
    if isActivePlayer(player) then 
        self:handleFinishActivePlayer(player) 
        if getActivePlayerCount() <= 1 then 
            RaceMode.endMap() 

Make to

function DestructionDerby:onPlayerWasted(player) 
    if isActivePlayer(player) then 
        self:handleFinishActivePlayer(player) 
        if getActivePlayerCount() <= 0 then 
            RaceMode.endMap() 

And when last player alive deaths , will start next map.

You have to test with 2 players on server to take effect.

Link to comment

Thank you for your help guys.

As i've seen there are no error in debugscript 3.

@EvoGT : Thanks for your help but this modification was already made if u review the previous scripts. The problem is with the distinction between DD / DM / FDD and when last player alive on dm maps takes hunter.

Still waiting for help guys.

Link to comment
Guest Guest4401
So yeah i've managed to fix the script , it;'s working well now even with hunter but i need to make it work only on dm maps.

How can i restrict it to work only on dm maps? i mean to let player alive .

You can check if the map name has '[DM]'

local map = exports.mapmanager:getRunningGamemodeMap() 
local name = getResourceInfo(map,'name') 
if name:find('[DM]',1,true) then 

Or you can simply make a function to check if the current map has a hunter or not

function isDM() 
    for i,v in ipairs(getElementsByType'racepickup') do 
        if getElementData(v,'vehicle') == '425' then 
            return true 
        end 
    end 
    return false 
end 

Use:

if isDM() then 

Link to comment
  • 1 year later...

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