21.07.2012, 14:26
(
Последний раз редактировалось [MM]RoXoR[FS]; 29.09.2012 в 13:26.
)
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)
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];
}
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
pawn Код:
new rank = t_GetRank(3,1);
pawn Код:
new id = t_GetPlayer(1,0); //id shall be 2
id = t_GetPlayer(1,1);// id shall be 3
Код:
#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; }
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.