h4x7o0r Posted February 24, 2013 Share Posted February 24, 2013 (edited) 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 February 25, 2013 by Guest Link to comment
Fury Posted February 24, 2013 Share Posted February 24, 2013 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
h4x7o0r Posted February 24, 2013 Author Share Posted February 24, 2013 Thank you for your code. I've tried it and obviously last player can finish the map but when hunter is taken nothing happens. And also with this modification, the setting is also available on DD maps which is no good at all. Link to comment
h4x7o0r Posted February 25, 2013 Author Share Posted February 25, 2013 anyone who can help ? Link to comment
pNine Posted February 25, 2013 Share Posted February 25, 2013 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
h4x7o0r Posted February 25, 2013 Author Share Posted February 25, 2013 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
pNine Posted February 25, 2013 Share Posted February 25, 2013 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
h4x7o0r Posted February 25, 2013 Author Share Posted February 25, 2013 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
pNine Posted February 26, 2013 Share Posted February 26, 2013 @ line 23 change it to 'if #alivePlayers == 1 then'. If the script continues to fail check if it says something at 'debugscript 3' Link to comment
EvoGT Posted February 26, 2013 Share Posted February 26, 2013 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
h4x7o0r Posted February 26, 2013 Author Share Posted February 26, 2013 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
h4x7o0r Posted March 1, 2013 Author Share Posted March 1, 2013 Is it anyone able to fix this ? thanks in advance Link to comment
h4x7o0r Posted March 2, 2013 Author Share Posted March 2, 2013 anyone ? i really need this. Link to comment
h4x7o0r Posted March 4, 2013 Author Share Posted March 4, 2013 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 . Link to comment
Guest Guest4401 Posted March 5, 2013 Share Posted March 5, 2013 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
Zin Posted October 5, 2014 Share Posted October 5, 2014 Im a noob at scripting so i dont know where to put this stuff can i have a bit of help 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