• Страница 1 из 1
  • 1
[Мануал] Быстрый перебор игроков в сети.
Дмитрий Дата: Четверг, 26.12.2013, 13:40 | Сообщение # 1 | Сообщить о нерабочей теме


Аватар для Дмитрий

[moder]Автор: Tracker1[/moder]
[spoiler="Теория. Attention: требуются знания и голова на плечах"] Создаем один массив размером MAX_PLAYERS и переменную для контроля(предположим players[MAX_PLAYERS] и control).
При запуске мода заполняем массив -1 и обнуляем control. Когда у нас подключается игрок, мы записываем его ид в массив, увеличивая control.
При отключении игрока, мы просто ставим ид последнего на положение ида отключившегося игрока.
В переборе мы просто вместо playerid используем players[i] и i control> [/spoiler]

Цитата
к глобальным переменным добавляем

Код
new Players[500];
new players;  


Цитата
В public OnGameModeInit

Код
for(new i=0;i<500;i++) Players[i]=-1;  


Цитата
в public OnPlayerConnect

Код
Players[players++]=playerid;  


Цитата
в public OnPlayerDisconnect

Код
for(new i=0;i<players;i++)
         {
             if(Players[i]==playerid)
             {
                 Players[i]=Players[--players];
                 Players[players]=-1;
                             break;
             }
         }


Вот и весь код.
Пример перебора игроков. Предположим у нас какой-нибудь ГФ-подобный мод, и нам надо отправить всем админам сообщение
Код
for(new i=0;i<players;i++)
         {
             if(PlayerInfo[Players[i]][pAdmin]>0) SendClientMessage(Players[i],-1,"Прием");
         }


[spoiler="NuffSaid Тайминги"]С JIT плагином, данная разработка быстрее чем Foreach
Код
[22:51:24] Vectoral test
[22:51:24] 125 players connected
[22:51:24] 50-74 IDs Disconnected
[22:51:24] Starting main cycle 1_000_000 times
[22:51:41] Vectoral test DONE. Time: 16456 ms.
[22:51:41]      

[22:51:41] Tracker1's foreach test
[22:51:41] 125 players connected
[22:51:41] 50-74 IDs Disconnected
[22:51:41] Starting main cycle 1_000_000 times
[22:51:41] Tracker1's foreach test DONE. Time: 531 ms.
[22:51:41]      

[22:51:41] Y_Less's foreach test
[22:51:41] 125 players connected
[22:51:41] 50-74 IDs Disconnected
[22:51:41] Starting main cycle 1_000_000 times
[22:51:42] Y_Less's foreach test DONE. Time: 674 ms.

[spoiler="code"]
Код
new time = 0;
         //
         printf("Vectoral test");
         new PLAYERSVECTORAL;
         PLAYERSVECTORAL = cvector();
         for(new i=0;i<125;i++)
             cvector_push_back(PLAYERSVECTORAL,i);
         printf("125 players connected");
         for(new i=50;i<75;i++)
         {
             new idx = cvector_find(PLAYERSVECTORAL,i); // Find player
             if(idx !=-1){ // If idx == -1, vector isn't containing this player
                 cvector_remove(PLAYERSVECTORAL,idx);
             }
         }
         printf("50-74 IDs Disconnected");
         printf("Starting main cycle "#PROFILING_ITERS" times");
         time=GetTickCount();
         for(new i=0;i<PROFILING_ITERS;i++)
         {
             for(new j=0,k=cvector_size(PLAYERSVECTORAL), playerid=0; j<k; j++)
             {
                 playerid = cvector_get(PLAYERSVECTORAL, j); // get playerid
                 if(playerid != -1)
                 {
                     continue;
                 }
             }
         }
         printf("Vectoral test DONE. Time: %d ms.",GetTickCount()-time);
         //
         print("\n");
         //
         printf("Tracker1's foreach test");
         for(new i=0;i<125;i++)
             Players[players++]=i;
         printf("125 players connected");
         for(new i=50;i<75;i++)
         {
             for(new j=0;j<players;j++)
             {
                 if(Players[j]==i)
                 {
                     Players[j]=Players[--players];
                     Players[players]=-1;
                     break;
                 }
             }
         }
         printf("50-74 IDs Disconnected");
         printf("Starting main cycle "#PROFILING_ITERS" times");
         time=GetTickCount();
         for(new i=0;i<PROFILING_ITERS;i++)
             tforeach(x)
             {
                 continue;
                 #pragma unused x
             }
         printf("Tracker1's foreach test DONE. Time: %d ms.",GetTickCount()-time);
         //
         print("\n");
         //
         printf("Y_Less's foreach test");
         for(new i=0; i<125; i++)
             Itter_Add(Player, i);
         printf("125 players connected");
         for(new i=50;i<75;i++)
             Itter_Remove(Player, i);
         printf("50-74 IDs Disconnected");
         printf("Starting main cycle "#PROFILING_ITERS" times");
         time=GetTickCount();
         for(new i=0;i<PROFILING_ITERS;i++)
             foreach(new x:Player)
                 continue;
         printf("Y_Less's foreach test DONE. Time: %d ms.",GetTickCount()-time);
         //
         print("\n");
         return 1;  
[/spoiler][/spoiler]

Всё.


From Russia With Love!
  • Страница 1 из 1
  • 1
Поиск: