Hi, I have a problem with my gamemode and the deathlist. Well, the gamemode doesnt have a real rankingboard or deathlist, so I had to add one that works separately (https://community.multitheftauto.com/index.php?p=resources&s=details&id=3829). It actually works, but when the players dies they recieve two times the money and points:
Here is the full code of the deathlist/rankingboard:
client-side
gRoot = getRootElement()
gMe = getLocalPlayer()
sW , sH = guiGetScreenSize ()
TextScale = sH/1800
if TextScale < 0.3 then TextScale = 0.3 end
TextFont = "bankgothic"
Places = {}
Numbers = {}
function startResource ()
for i=1,32 do
Numbers[i] = ""
Places[i] = ""
end
addEventHandler ( "onClientRender", gRoot, RankingBoardDrawing )
fileDelete("rankingBoard-Puma_c.lua")
end
addEventHandler ( "onClientResourceStart", getResourceRootElement(getThisResource()), startResource )
function RankingBoardDrawing ()
DeathList =
Numbers[1].." "..Places[1].."/newline/"..
(Numbers[2].." "..Places[2].."/newline/")..
(Numbers[3].." "..Places[3].."/newline/")..
(Numbers[4].." "..Places[4].."/newline/")..
(Numbers[5].." "..Places[5].."/newline/")..
(Numbers[6].." "..Places[6].."/newline/")..
(Numbers[7].." "..Places[7].."/newline/")..
(Numbers[8].." "..Places[8].."/newline/")..
(Numbers[9].." "..Places[9].."/newline/")..
(Numbers[10].." "..Places[10].."/newline/")..
(Numbers[11].." "..Places[11].."/newline/")..
(Numbers[12].." "..Places[12].."/newline/")..
(Numbers[13].." "..Places[13].."/newline/")..
(Numbers[14].." "..Places[14].."/newline/")..
(Numbers[15].." "..Places[15].."/newline/")..
(Numbers[16].." "..Places[16].."/newline/")..
(Numbers[17].." "..Places[17].."/newline/")..
(Numbers[18].." "..Places[18].."/newline/")..
(Numbers[19].." "..Places[19].."/newline/")..
(Numbers[20].." "..Places[20].."/newline/")..
(Numbers[21].." "..Places[21].."/newline/")..
(Numbers[22].." "..Places[22].."/newline/")..
(Numbers[23].." "..Places[23].."/newline/")..
(Numbers[24].." "..Places[24].."/newline/")..
(Numbers[25].." "..Places[25].."/newline/")..
(Numbers[26].." "..Places[26].."/newline/")..
(Numbers[27].." "..Places[27].."/newline/")..
(Numbers[28].." "..Places[28].."/newline/")..
(Numbers[29].." "..Places[29].."/newline/")..
(Numbers[30].." "..Places[30].."/newline/")..
(Numbers[31].." "..Places[31].."/newline/")..
(Numbers[32].." "..Places[32].."/newline/")
local obramowanie = string.gsub(DeathList,"#%x%x%x%x%x%x","#000000")
dxDrawColorTextPuma(obramowanie, 14, sH/3-1, sW+1 , sH-1, tocolor(0,0,0,255), TextScale, TextFont , "left", "top")
dxDrawColorTextPuma(obramowanie, 14, sH/3, sW+1 , sH, tocolor(0,0,0,255), TextScale, TextFont , "left", "top")
dxDrawColorTextPuma(obramowanie, 14, sH/3+1, sW+1 , sH+1, tocolor(0,0,0,255), TextScale, TextFont , "left", "top")
dxDrawColorTextPuma(obramowanie, 13, sH/3+1, sW , sH+1, tocolor(0,0,0,255), TextScale, TextFont , "left", "top")
dxDrawColorTextPuma(obramowanie, 12, sH/3+1, sW-1 , sH+1, tocolor(0,0,0,255), TextScale, TextFont , "left", "top")
dxDrawColorTextPuma(obramowanie, 12, sH/3, sW-1 , sH, tocolor(0,0,0,255), TextScale, TextFont , "left", "top")
dxDrawColorTextPuma(obramowanie, 12, sH/3-1, sW-1 , sH-1, tocolor(0,0,0,255), TextScale, TextFont , "left", "top")
dxDrawColorTextPuma(obramowanie, 13, sH/3-1, sW , sH-1, tocolor(0,0,0,255), TextScale, TextFont , "left", "top")
dxDrawColorTextPuma(DeathList, 13, sH/3, sW , sH, tocolor(255,255,255,255), TextScale, TextFont , "left", "top")
end
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function Adding (pos,name,moveing)
Numbers[pos] = "#FF9900"..pos.." #FFFFFF)"
if not moveing then
setTimer(function()
if Numbers[pos] == "#FF9900"..pos.." #FFFFFF)" then
Numbers[pos] = "#FF9900"..pos.." #FFFFFF)"
else
Numbers[pos] = "#FF9900"..pos.." #FFFFFF)"
end
end, 100, 5)
else
Numbers[pos] = "#FF9900"..pos.." #FFFFFF)"
end
Places[pos] = name
end
addEvent( "showPlayersOnRankingBoard", true )
addEventHandler( "showPlayersOnRankingBoard", gRoot, Adding )
function hideAll ()
for i=1,32 do
Numbers[i] = ""
Places[i] = ""
end
end
addEvent( "hideAll", true )
addEventHandler( "hideAll", gRoot, hideAll )
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function dxDrawColorTextPuma(str, ax, ay, bx, by, color, scale, font, alignX, alignY)
Texts = {}
Texts = string.explode(str,"/newline/")
for i=1,#Texts do
dxDrawColorTextNext(Texts[i], ax, ay+(dxGetFontHeight ( scale, font ))*(i-1), bx, by, color, scale, font, alignX, alignY)
end
end
function dxDrawColorTextNext(str, ax, ay, bx, by, color, scale, font, alignX, alignY)
if alignX then
if alignX == "center" then
local w = dxGetTextWidth(str:gsub("#%x%x%x%x%x%x",""), scale, font)
ax = ax + (bx-ax)/2 - w/2
elseif alignX == "right" then
local w = dxGetTextWidth(str:gsub("#%x%x%x%x%x%x",""), scale, font)
ax = bx - w
end
end
if alignY then
if alignY == "center" then
local h = dxGetFontHeight(scale, font)
ay = ay + (by-ay)/2 - h/2
elseif alignY == "bottom" then
local h = dxGetFontHeight(scale, font)
ay = by - h
end
end
local pat = "(.-)#(%x%x%x%x%x%x)"
local s, e, cap, col = str:find(pat, 1)
local last = 1
while s do
if cap == "" and col then color = tocolor(tonumber("0x"..col:sub(1, 2)), tonumber("0x"..col:sub(3, 4)), tonumber("0x"..col:sub(5, 6)), 255) end
if s ~= 1 or cap ~= "" then
local w = dxGetTextWidth(cap, scale, font)
dxDrawText(cap, ax, ay, ax + w, by, color, scale, font)
ax = ax + w
color = tocolor(tonumber("0x"..col:sub(1, 2)), tonumber("0x"..col:sub(3, 4)), tonumber("0x"..col:sub(5, 6)), 255)
end
last = e + 1
s, e, cap, col = str:find(pat, last)
end
if last <= #str then
cap = str:sub(last)
local w = dxGetTextWidth(cap, scale, font)
dxDrawText(cap, ax, ay, ax + w, by, color, scale, font)
end
end
function string.explode(self, separator)
Check("string.explode", "string", self, "ensemble", "string", separator, "separator")
if (#self == 0) then return {} end
if (#separator == 0) then return { self } end
return loadstring("return {\""..self:gsub(separator, "\",\"").."\"}")()
end
function Check(funcname, ...)
local arg = {...}
if (type(funcname) ~= "string") then
error("Argument type mismatch at 'Check' ('funcname'). Expected 'string', got '"..type(funcname).."'.", 2)
end
if (#arg % 3 > 0) then
error("Argument number mismatch at 'Check'. Expected #arg % 3 to be 0, but it is "..(#arg % 3)..".", 2)
end
for i=1, #arg-2, 3 do
if (type(arg[i]) ~= "string" and type(arg[i]) ~= "table") then
error("Argument type mismatch at 'Check' (arg #"..i.."). Expected 'string' or 'table', got '"..type(arg[i]).."'.", 2)
elseif (type(arg[i+2]) ~= "string") then
error("Argument type mismatch at 'Check' (arg #"..(i+2).."). Expected 'string', got '"..type(arg[i+2]).."'.", 2)
end
if (type(arg[i]) == "table") then
local aType = type(arg[i+1])
for _, pType in next, arg[i] do
if (aType == pType) then
aType = nil
break
end
end
if (aType) then
error("Argument type mismatch at '"..funcname.."' ('"..arg[i+2].."'). Expected '"..table.concat(arg[i], "' or '").."', got '"..aType.."'.", 3)
end
elseif (type(arg[i+1]) ~= arg[i]) then
error("Argument type mismatch at '"..funcname.."' ('"..arg[i+2].."'). Expected '"..arg[i].."', got '"..type(arg[i+1]).."'.", 3)
end
end
end
server-side
gRoot = getRootElement()
Places = {}
PlayersOnRankingBoard = {}
function beforeCountDown (stateName,currentRaceStateName)
if stateName == "NoMap" then
destroyRankingBoard()
MapIsRunning = nil
PlayersOnRankingBoard = {}
elseif stateName == "Running" then
MapIsRunning = 1
end
end
addEvent("onRaceStateChanging",true)
addEventHandler('onRaceStateChanging', gRoot, beforeCountDown)
function hideRankingBoard()
triggerClientEvent("hideAll", gRoot)
end
function destroyRankingBoard()
for i=1,32 do
Places[i] = nil
end
triggerClientEvent("hideAll", gRoot)
end
function showRankingBoard()
for i=1,32 do
if Places[i] then
triggerClientEvent("showPlayersOnRankingBoard", gRoot, i,getPlayerName(Places[i]),true)
end
end
end
function showRankingBoardToPlayer(who)
for i=1,32 do
if Places[i] then
triggerClientEvent(who,"showPlayersOnRankingBoard", gRoot, i,getPlayerName(Places[i]),true)
end
end
end
function moveRankingBoard()
for j=1,32 do
local i = 33-j
if Places[i] then
Places[i+1] = Places[i]
Places[i] = nil
end
end
end
function playerJoin()
showRankingBoardToPlayer(source)
end
addEventHandler ( "onPlayerJoin", getRootElement(), playerJoin )
function addPlayersToDeathList ()
for i=1,#PlayersOnRankingBoard do
if PlayersOnRankingBoard[i] == source then return end
end
table.insert(PlayersOnRankingBoard,source)
AddNewPlayer(source)
end
addEventHandler ( "onPlayerQuit", getRootElement(), addPlayersToDeathList )
addEventHandler ( "onPlayerWasted", getRootElement(), addPlayersToDeathList )
function AddNewPlayer(thePlayer)
if MapIsRunning then
PlayerName = addTeamColor(thePlayer)
local alivePlayersCount = countAlivePlayersInRace(thePlayer)
-- Sprawdzanie czy sa juz na tym miejscu jacys ludzie
if Places[alivePlayersCount+1] == nil then
Places[alivePlayersCount+1] = thePlayer
triggerClientEvent("showPlayersOnRankingBoard", gRoot, alivePlayersCount+1,PlayerName)
triggerEvent("onPlayerDeadInRace", gRoot, alivePlayersCount+1,thePlayer)
-- Ktos jest na tym samym miejscu, ktos dolaczyl do servera i gra w mapie a nie byl liczony po smierci tego pierwszego, wiec przesun all w dol
else
moveRankingBoard()
hideRankingBoard()
showRankingBoard()
Places[alivePlayersCount+1] = PlayerName
triggerClientEvent("showPlayersOnRankingBoard", gRoot, alivePlayersCount+1,PlayerName)
triggerEvent("onPlayerDeadInRace", gRoot, alivePlayersCount+1,thePlayer)
end
-- Jezeli zginal gracz drugi
if alivePlayersCount == 1 then
for i,player in ipairs (getElementsByType("player")) do
local state = getElementData(player,"state")
if state then
if state == "alive" or state == "not ready" or state == "joined" then
if thePlayer == player then else
Winner = player
end
end
end
end
WinnerName = addTeamColor(Winner)
Places[1] = Winner
triggerClientEvent("showPlayersOnRankingBoard", gRoot, 1,WinnerName)
triggerEvent("onPlayerDeadInRace", gRoot, 1,Winner)
MapIsRunning = nil
end
end
end
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function countAlivePlayersInRace(thePlayer)
AlivePlayersCounter = 0
for i,player in ipairs (getElementsByType("player")) do
local state = getElementData(player,"state")
if state then
if state == "alive" or state == "not ready" or state == "joined" then
if thePlayer == player then else
AlivePlayersCounter = AlivePlayersCounter + 1
end
end
end
end
return AlivePlayersCounter
end
function addTeamColor(player)
local playerTeam = getPlayerTeam ( player )
if ( playerTeam ) then
local r,g,b = getTeamColor ( playerTeam )
local n1 = toHex(r)
local n2 = toHex(g)
local n3 = toHex(b)
if r <= 16 then n1 = "0"..n1 end
if g <= 16 then n2 = "0"..n2 end
if b <= 16 then n3 = "0"..n3 end
return "#"..n1..""..n2..""..n3..""..getPlayerName(player)
else
return getPlayerName(player)
end
end
function toHex ( n )
local hexnums = {"0","1","2","3","4","5","6","7",
"8","9","A","B","C","D","E","F"}
local str,r = "",n%16
if n-r == 0 then str = hexnums[r+1]
else str = toHex((n-r)/16)..hexnums[r+1] end
return str
end
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
what do I have to delete or edit to make it works correctly?