Jump to content

[Help] Sort two tables


Shuubaru

Recommended Posts

Posted (edited)

Hi, I need to find a way of sorting two tables with the same order: "kills" and "player names" tables, I manage to sort kills table by value but I don't know how to sort the player names table with the same order than kills table.

Here is my code:

--client side

 

local screenW, screenH = guiGetScreenSize()

--I use the colshapes to "simulate" players datas.

col1 = createColSphere(0,0,0, 1)
col2 = createColSphere(0,0,0, 1)
col3 = createColSphere(0,0,0, 1)
col4 = createColSphere(0,0,0, 1)
col5 = createColSphere(0,0,0, 1)
col6 = createColSphere(0,0,0, 1)
col7 = createColSphere(0,0,0, 1)
col8 = createColSphere(0,0,0, 1)
col9 = createColSphere(0,0,0, 1)
col10 = createColSphere(0,0,0, 1)
col11 = createColSphere(0,0,0, 1)

setElementData(col1, "kills.actual", 5)
setElementData(col2, "kills.actual", 10)
setElementData(col3, "kills.actual", 16)
setElementData(col4, "kills.actual", 2)
setElementData(col5, "kills.actual", 1)
setElementData(col6, "kills.actual", 50)
setElementData(col7, "kills.actual", 21)
setElementData(col8, "kills.actual", 21)
setElementData(col9, "kills.actual", 12)
setElementData(col10, "kills.actual", 9)
setElementData(col11, "kills.actual", 106)

setElementData(col1, "kills.names", "test1")
setElementData(col2, "kills.names", "test2")
setElementData(col3, "kills.names", "test3")
setElementData(col4, "kills.names", "test4")
setElementData(col5, "kills.names", "test9")
setElementData(col6, "kills.names", "test5")
setElementData(col7, "kills.names", "test6")
setElementData(col8, "kills.names", "#ff0000Akai")
setElementData(col9, "kills.names", "#00ff00Green")
setElementData(col10, "kills.names", "#0000ffBlue")
setElementData(col11, "kills.names", "#ff00ff:O knows")


function renderTabla()
	dxDrawImage(screenW - 318 - 10, (screenH - 198) / 2, 318, 198, "bgr.png", 0, 0, 0, tocolor(255, 255, 255, 255), false)
	dxDrawText("Kills on this round", screenW - 318 - 10, (screenH - 188) / 2, (screenW - 318 - 10) + 318, ( (screenH - 188) / 2) + 188, tocolor(255, 255, 255, 255), 0.66, "bankgothic", "center", "top", true, true, true, true, false)
	--sort the kills by hight value
	table.sort(tableKills,
		function (a,b) 
			return tonumber(a) > tonumber (b)
		end
	)
	if tableKills then
		for i=1,10 do
			posY = ((screenH-394)*0.81+(i*screenH*0.02))
			dxDrawText(i.."- "..tableNames[i], (screenW - 308 - 10), posY, (screenW - 308 - 10) + 308, ( (screenH - 164) / 2) + 164, tocolor(255, 255, 255, 255), 1.00, "default", "left", "top", true, true, true, true, false)
			dxDrawText("Kills: "..tableKills[i], (screenW - 150 - 10), posY, (screenW - 308 - 10) + 150, ( (screenH - 164) / 2) + 164, tocolor(255, 255, 255, 255), 1.00, "default", "left", "top", true, true, true, true, false)
		end
	end
end

function testCols ()
	tableKills = {}
	tableNames = {}
  	--just pretending loop through players
	tablaCol = getElementsByType("colshape")

	for i=1,#getElementsByType("colshape") do
	
		colEle = getElementData(tablaCol[i], "kills.actual")	
		colNom = getElementData(tablaCol[i], "kills.names")
		
		table.insert(tableKills, i, colEle)
		table.insert(tableNames, i, colNom)
		
	end
	setTimer(function()
		addEventHandler("onClientRender", getRootElement(), renderTabla)
	end, 3000, 1)
end
--for testing
bindKey("5", "down", testCols)

 

Please help!

Edited by Shuuichi

560x95_FFFFFF_FF9900_000000_000000.png

Incognito Gaming - Multi gamemode [Shooter/Race/DM/OS/DD/Hunter]:
- PVP System.
- Kill detection system.
- Youtube music system.
- Garage
- Map cache.
-And more...

Posted (edited)
-- https://regex101.com/

-- You need format your nicks
name = "#ff0Ffffasd"
matches = pregMatch(name, "^(.+)(#[0-9a-f]{6})(.+)$/i")
-- name = #ff0Ffffasd
-- matches[1] = #ff0Ffffasd
-- matches[2] = #ff0Ffffasd
-- matches[3] = #ff0Ffff
if matches then
  name = matches[4] and matches[1] .. matches[4] or matches[3] -- why this construction? cause if we have asd#ffffffasd
  -- we need set nick "asdasd"
end

-- You take nick "asd", sort by this nick

 

Edited by cacao

tags: [mta-project, role-play, ru]

Scripting: [=---------] 5%

Posted
12 hours ago, cacao said:

-- https://regex101.com/

-- You need format your nicks
name = "#ff0Ffffasd"
matches = pregMatch(name, "^(.+)(#[0-9a-f]{6})(.+)$/i")
-- name = #ff0Ffffasd
-- matches[1] = #ff0Ffffasd
-- matches[2] = #ff0Ffffasd
-- matches[3] = #ff0Ffff
if matches then
  name = matches[4] and matches[1] .. matches[4] or matches[3] -- why this construction? cause if we have asd#ffffffasd
  -- we need set nick "asdasd"
end

-- You take nick "asd", sort by this nick

 

I think you misundertood. Or I explain it bad because my english is not enough good. What I wanted to do is order the nicks by them kills, I mean, if someone have the first place and 20 kills his nick will be first.

Btw, I manage to do it just using another way (tables inside a table):

 

function testCols ()
	RankingData = {}
	tablaCol = getElementsByType("colshape")

	for i=1,#getElementsByType("colshape") do
	
		colEle = getElementData(tablaCol[i], "kills.actual")	
		colNom = getElementData(tablaCol[i], "kills.names")
		
		table.insert(RankingData,{name=colNom,data=colEle})

	end
	setTimer(function()
		table.sort(RankingData,function(a,b) return(tonumber(a.data) or 0 ) > ( tonumber(b.data) or 0 ) end )
		refreshTopKills(RankingData) --after this I will retrieve all the datas by kills order
	end, 50, 1)
	setTimer(function()
		addEventHandler("onClientRender", getRootElement(), renderTabla)
	end, 100, 1)
end
bindKey("5", "down", testCols)

function refreshTopKills( info )
    showRanking = {}
	for i=1,#info do
		table.insert(showRanking, info[i])
	end
end

I hope it will be useful for someone else.

560x95_FFFFFF_FF9900_000000_000000.png

Incognito Gaming - Multi gamemode [Shooter/Race/DM/OS/DD/Hunter]:
- PVP System.
- Kill detection system.
- Youtube music system.
- Garage
- Map cache.
-And more...

Posted

If it's possible then assing an ID to each table value. Instead of inserting in the table the value, insert (in the table) a new table containing value and ID

When sorting a table notice that you must use the value that is now in a sub-table. However i'm not experienced with sorting functions, so i can't help you with that.

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