[Include] Top Players
#1

TOP PLAYERS INCLUDE
Hey Guys, This is gonna be my first include.

Info :

With this include, you can sort out Players Data in Ascending/Descending Order.

Stocks :

pawn Код:
t_FeedInfo(playerid,Float:info)
t_GetRank(playerid,order)
t_GetPlayer(rank,order)
Usage

With t_FeedInfo, you shall feed the information which you want to sort out.
pawn Код:
for(new i=0;i<MAX_PLAYERS;++i)
    {
        if(!IsPlayerConnected(i)) continue;
        t_FeedInfo(i,pInfo[i][Kills];
    }
With t_GetRank, it will return the rank of that player according to order(Ascending/Descending) and your data.

Suppose, you have feeded data
Код:
Playerid   Data    Rank (Ascending)    Rank (Descending) 
    0         9              4                         2
    1         1               2                        4
    2         -5              1                        5
    3         10              5                        1
    4         2               3                        3
pawn Код:
new rank = t_GetRank(3,0);
    //0 for ascending order ,1 for descending
Now rank will have value 5
pawn Код:
new rank = t_GetRank(3,1);
And ,now rank will have value 1

pawn Код:
new id = t_GetPlayer(1,0); //id shall be 2
id = t_GetPlayer(1,1);// id shall be 3
Since, this is my first script and it took me 30 min to complete , I am sure it may have lot's of bugs. Report Bugs and Suggestions

Код:
#define ORDER_ASC 0
#define ORDER_DES 1

new Float:t_Data[MAX_PLAYERS];
new bool:t_IsDataEntered = false;
new t_id[MAX_PLAYERS];
new t_Data_Sorted_Manner = -1;

/*
native t_FeedInfo(playerid,Float:info);
native t_GetRank(playerid,order);
native t_GetPlayer(rank,order);
*/

stock t_FeedInfo(playerid,Float:info)
{
	t_Data[playerid] = info;
	t_id[playerid] = playerid;
	t_IsDataEntered = true;
	return 1;
}
stock SortData(order)
{
	if(order == ORDER_ASC)
	{
		for(new i=0;i<MAX_PLAYERS;++i)
		{
		    if(!IsPlayerConnected(i)) continue;
		    for(new j=i;j<MAX_PLAYERS;++j)
		    {
		        if(!IsPlayerConnected(j)) continue;
		        if(t_Data[j]<t_Data[i])
		        {
		            new Float:temp = t_Data[i];
					t_Data[i] = t_Data[j];
					t_Data[j] = temp;

					new temp1 = t_id[i];
					t_id[i] = t_id[j];
					t_id[j] = temp1;
  		        }
		    }
		}
		return 1;
	}
	else
	{
	    for(new i=0;i<MAX_PLAYERS;++i)
		{
		    if(!IsPlayerConnected(i)) continue;
		    for(new j=i;j<MAX_PLAYERS;++j)
		    {
		        if(!IsPlayerConnected(j)) continue;
		        if(t_Data[j]>t_Data[i])
		        {
		            new Float:temp = t_Data[i];
					t_Data[i] = t_Data[j];
					t_Data[j] = temp;

					new temp1 = t_id[i];
					t_id[i] = t_id[j];
					t_id[j] = temp1;

  		        }
		    }
		}
		return 1;
	}
}
stock t_GetRank(playerid,order)
{
    if(t_IsDataEntered == false)
	{
	    printf("TOP_PLAYER [ERROR] : Data is not entered\nAborting process.");
	    return -1;
	}
	if(playerid==INVALID_PLAYER_ID || (!IsPlayerConnected(playerid)))
	{
	    printf("TOP_PLAYER [ERROR] : Invalid ID || Player not connected\nAborting process.");
	    return -1;
	}

	if(order>1 || order < 0)
	{
	    printf("TOP_PLAYER [ERROR] : Wrong Order (only 0,1 allowed)\nAborting process.");
	    return -1;
	}
	else if(order == ORDER_ASC)//Ascending order 1,2,3,4,5
	{
	    if(t_Data_Sorted_Manner != ORDER_ASC)
	    {
	        SortData(ORDER_ASC);
	        t_Data_Sorted_Manner = ORDER_ASC;
	    }

		new r;
		for(new i=0;i<MAX_PLAYERS;++i)
		{
		    if(!IsPlayerConnected(i)) continue;
		    if(t_id[i] == playerid)
		    {
		        r = i+1;
		        break;
		    }
		}
  		return r;
	}

	else if(order == ORDER_DES)//Descending order 5,4,3,2,1
	{
 		if(t_Data_Sorted_Manner != ORDER_DES)
	    {
	        SortData(ORDER_DES);
	        t_Data_Sorted_Manner = ORDER_DES;
	    }

		new r;
		for(new i=0;i<MAX_PLAYERS;++i)
		{
		    if(!IsPlayerConnected(i)) continue;
		    if(t_id[i] == playerid)
		    {
		        r = i+1;
		        break;
		    }
		}
  		return r;
	}
    return  0;
}
stock t_GetPlayer(rank,order)
{
	if(t_IsDataEntered == false)
	{
	    printf("TOP_PLAYER [ERROR] : Data is not entered\nAborting process.");
	    return -1;
	}
	if(rank<1)
	{
	    printf("TOP_PLAYER [ERROR] : Rank can not be less than 1.\nAborting process.");
	    return -1;
	}

	if(order>1 || order < 0)
	{
	    printf("TOP_PLAYER [ERROR] : Wrong Order (only 0,1 allowed)\nAborting process.");
	    return -1;
	}
	else if(order == ORDER_ASC)//Ascending order 1,2,3,4,5
	{
		if(t_Data_Sorted_Manner != ORDER_ASC)
	    {
	        SortData(ORDER_ASC);
	        t_Data_Sorted_Manner = ORDER_ASC;
	    }
  		return t_id[rank-1];
	}

	else if(order == ORDER_DES)//Descending order 5,4,3,2,1
	{
		if(t_Data_Sorted_Manner != ORDER_DES)
	    {
	        SortData(ORDER_DES);
	        t_Data_Sorted_Manner = ORDER_DES;
	    }

		return t_id[rank-1];
	}
    return  0;
}
BUGS KNOWN :
None so far.

Code updated (29/09/2012). Flag has been set to check if data is already arranged. Decreasing the no of loops a lot. Also, now there is no more copying of data , therefore saving memory.
Reply
#2

Looking good, it can be used maybe in a Top Kill ? So it can be shown in a textdraw..
Reply
#3

Quote:
Originally Posted by Spookie98
Посмотреть сообщение
Looking good, it can be used maybe in a Top Kill ? So it can be shown in a textdraw..
yup, it can be made for anything, like Top kills, money, Race Time etc.

Just feed data of player kills and then, get the rank/id.
Reply
#4

Search for SortArray functions, they do exactly what this is supposed to do.
Reply
#5

Amazing, Will surely come in handy. Good job.
Reply
#6

Can you explain how can I make a top 3 players online with this?

What I'm trying to do is

I've made a textdraw which should show

1. [NAME] [MapKills]
2. [NAME] [MapKills]
3. [NAME] [MapKills]
You [MapKills]

Now, the you part is okay
But
BUT
BUT
The 1-2-3 all show ID 0.

Now I'm trying to use your include to do it and here's my stock

pawn Код:
stock GetSpots()
{
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
        FeedInfo(i, pStats[i][MapKills]);
    }
    return 1;
}
But I don't really understand how I can sort the top 3 players :/ any help?
Reply
#7

Sounds Nice!
Gonna try it out
Reply
#8

seems good and useful
Reply
#9

Quote:
Originally Posted by Gangs_Rocks
Посмотреть сообщение
Can you explain how can I make a top 3 players online with this?

What I'm trying to do is

I've made a textdraw which should show

1. [NAME] [MapKills]
2. [NAME] [MapKills]
3. [NAME] [MapKills]
You [MapKills]

Now, the you part is okay
But
BUT
BUT
The 1-2-3 all show ID 0.

Now I'm trying to use your include to do it and here's my stock

pawn Код:
stock GetSpots()
{
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
        FeedInfo(i, pStats[i][MapKills]);
    }
    return 1;
}
But I don't really understand how I can sort the top 3 players :/ any help?
Try this

pawn Код:
stock GetSpots()
{
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
            if(IsPlayerConnected(i)) FeedInfo(i, pStats[i][MapKills]);
    }
        new rank[3];
    for(new i=0;i<3;++i) rank[i] =   t_GetPlayer(i+1, 1)//Descending as we wish player with max kills to be first
    //Now rank[0] have player whose rank is first, rank[1] with second and so on.
//You can now get PlayerName by using
    GetPlayerName(rank[0]..
    return 1;
}
Reply
#10

Edit: Nvm, didn't see ******'s post.
Reply
#11

Quote:
Originally Posted by Y_Less
Посмотреть сообщение
I do like the concept of this - too few people use sorting instead of naive searching to get the top whatever. In fact that's what I assumed would have been done when I saw the topic simply because that's what most people do, I was pleasantly surprised!

Having said that, there are a few bugs:

Most notably, this relies too much on global state. Say you start calling "t_FeedInfo", then before calling "t_GetPlayer", you call one of my functions for some reason (to get more data on something). Then I use your include to sort some data and return the result, now when you call "t_GetPlayer" all the data is wrong and corrupted.

Not a bug, but you might want to consider sorting the data and setting a flag. When "t_FeedInfo" is called set the flag to false. When "t_GetPlayer" is called check the flag - if it's true the data is already sorted and you can use it. If it is false then sort the data, set the flag to true, and return your result.

Also, you might want to look in to Slice's sort include, which uses a very efficient implementation of QuickSort for exactly this sort of task.
It should how so ever not happen for the reason that the data is copied into temporary variables (from backup of it) before getting sorted.

I tested it out again with script : http://pastebin.com/4t4EVnaW

you may see that I commented out all the (IsPlayerConnected) as I tested it through the main with no players actually connected.

In future upgrades, if I get free to do after exams I am thinking to modify include a lot and sort it only once instead of sorting again and again and shall be using quick sort.
Reply
#12

Flag has been set to check if data is already arranged. Decreasing the no of loops a lot. Also, now there is no more copying of data , therefore saving memory.

Updated the main post.
Reply
#13

Everthing is understandable!!!

But can you make me a onplayercommandtext with strcmp
pls bro roxor!
Reply
#14

Quote:
Originally Posted by ShivRp
Посмотреть сообщение
Everthing is understandable!!!

But can you make me a onplayercommandtext with strcmp
pls bro roxor!
And here comes 2 years old topic...
Reply
#15

Cool , i would have +rep u if i had enough reps ;P
Reply
#16

Quote:
Originally Posted by fiki574
Посмотреть сообщение
And here comes 2 years old topic...
but do you know how to /top
help me on that
pls
Reply


Forum Jump:


Users browsing this thread: 5 Guest(s)