Русское сообщество по скриптингу

get_players vs loop

Все вопросы по скриптингу для AMXX, помощь в редактировании плагинов.

Модераторы: Subb98, liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для AMX Mod X.

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.

Re: get_players vs loop

Сообщение KOTOKU » 20 фев 2018, 01:49

RevCrew писал(а):
KOTOKU писал(а):
Subb98 писал(а):loop для специфических задач. Для всего остального есть MasterCard (get_players), ИМХО :-)

Но это не повод обсирать цикл и говорить другим что он хуже, как некоторые делают

Дак ты сам же начал говорить про циклы в плане перебора игроков, в которых преимущество у get_players.


Какое преимущество? Я не хочу щас разводить холивар на эту тему с тобой, почитай от и до что мы тут с Subb'ом обсуждали. Все от ситуации зависит, не всегда get_players лучший вариант даже не смотря на то, что он быстрее.

Добавлено спустя 1 минуту 2 секунды:
Subb98 писал(а):С большим трудом, но я нашёл: Вы должны зарегистрироваться, чтобы видеть ссылки.. Рекомендую тему к прочтению целиком.

Почитал от и до, но кроме срача на тему что лучше charsmax или sizeof не нашел.
Бредовый срач какой-то, sizeof или charsmax от ситуации зависит, а strlen вообще для другого нужен
Аватара пользователя
KOTOKU
 
Сообщения: 766
Зарегистрирован: 10 фев 2013, 00:53
Благодарил (а): 10 раз.
Поблагодарили: 117 раз.

Re: get_players vs loop

Сообщение Garey » 20 фев 2018, 08:32

Код: Выделить всё
#include <amxmodx>
#include <amxmodx>
#include <hamsandwich>

/*
new hTimer = TimerStart();
// ...
TimerStop(hTimer);
server_print("Timer: %d days, %d hours, %d minutes, %d seconds and %d milliseconds.", TimerDays(hTimer), TimerHours(hTimer), TimerMinutes(hTimer), TimerSeconds(hTimer), TimerMilliseconds(hTimer));
*/
#define TimerStart()            tickcount()
#define TimerMid(%0)            ( tickcount() - %0 )
#define TimerStop(%0)         ( %0 = tickcount() - %0 )
#define TimerDays(%0)         ( %0 / 86400000 )
#define TimerHours(%0)      ( %0 % 86400000 / 3600000 )
#define TimerMinutes(%0)        ( %0 % 3600000 / 60000 )
#define TimerSeconds(%0)        ( %0 % 60000 / 1000 )
#define TimerMilliseconds(%0)   ( %0 % 1000 )

new gCount;

public plugin_init() {
    register_plugin("Test Plugin 1", "1.0", "[ --{-@ ]");

    set_task(10.0, "task1");
}

public task1() {
    server_cmd("pb removebots");
    server_cmd("sv_gravity -1000");
    set_task(1.0, "task2");
}

public task2() {

    for ( new id = 0 ; id < 33 ; id++ )
        if ( is_user_connected(id) && ! is_user_alive(id) )
            ExecuteHamB(Ham_Spawn, id);



    new NumLoops = 1000000;

    new hTimer1 = TimerStart();
    for ( new l ; l < NumLoops ; l++ ) {

        // Method 1
        new iPlayers[32] , iNum , Player;
        get_players( iPlayers , iNum , "ah" );
        for ( new i = 0 ; i < iNum ; i++ )
            Player = iPlayers[i];

    }
    TimerStop(hTimer1);



    new hTimer2 = TimerStart();
    for ( new l ; l < NumLoops ; l++ ) {

        // Method 2
        for ( new id = 0 ; id < 33 ; id++ )
            if ( is_user_alive(id) && ! is_user_hltv(id) ) {}
   
    }
    TimerStop(hTimer2);

    new szTimer1[32], szTimer2[32], iCount, iCountAlive;
    get_players(szTimer1, iCount);
    get_players(szTimer1, iCountAlive, "a");
    TimerFormat(hTimer1, szTimer1, charsmax(szTimer1), 2);
    TimerFormat(hTimer2, szTimer2, charsmax(szTimer2), 2);
    server_print("^nNumber of players: %d (Control: %d/%d)", gCount, iCountAlive, iCount);
    server_print("Method 1: %s", szTimer1);
    server_print("Method 2: %s", szTimer2);

    if ( gCount++ < 32 ) {
        server_cmd("pb add 0");
        set_task(20.0, "task2");
    }
}

/* TimerFormat(hTimer, output[], maxlen, mode = 1, bool:full = 0)
* Formats the result of a timer handle into a string.
*
* Parameters:
*
* hTimer
*    Timer Handle
*
* output[]
*    The output string
*
* maxlen
*    Maximum size of the output string
*
* mode
*    1: 00:00:00:00.000
*    2: 0d 0h 0m 0s 0ms
*
* bool:full
*    If full is set to true it will print all fields, even those which contains no value.
*    If full is set to false and mode is set to 1, it will print the first field that contains a value and everything after that point. For example: 03:00:00.295
*    If full is set to false and mode is set to 2, it will print only the fields that contains a value. For example: 3h 295ms
*/
stock TimerFormat(hTimer, output[], maxlen, mode = 1, bool:full = false) {
    new len;
   
    if ( full || TimerDays(hTimer) )
        len = formatex(output, maxlen, mode == 1 ? "%02d:" : "%dd ", TimerDays(hTimer));

    if ( full || ( len && mode == 1 ) || TimerHours(hTimer) )
        len += formatex(output[len], maxlen - len, mode == 1 ? "%02d:" : "%dh ", TimerHours(hTimer));

    if ( full || ( len && mode == 1 ) || TimerMinutes(hTimer) )
        len += formatex(output[len], maxlen - len, mode == 1 ? "%02d:" : "%dm ", TimerMinutes(hTimer));
       
    if ( full || ( len && mode == 1 ) || TimerSeconds(hTimer) )
        len += formatex(output[len], maxlen - len, mode == 1 ? "%02d." : "%ds ", TimerSeconds(hTimer));

    //if ( full || ( len && mode == 1 ) || TimerMilliseconds(hTimer) )
    len += formatex(output[len], maxlen - len, mode == 1 ? "%03d" : "%dms", TimerMilliseconds(hTimer));
}

Код: Выделить всё
Number of players: 0 (Control: 0/0)
Method 1: 191ms
Method 2: 1s 842ms

Number of players: 1 (Control: 1/1)
Method 1: 229ms
Method 2: 1s 945ms

Number of players: 2 (Control: 2/2)
Method 1: 277ms
Method 2: 2s 49ms

Number of players: 3 (Control: 3/3)
Method 1: 335ms
Method 2: 2s 167ms

Number of players: 4 (Control: 4/4)
Method 1: 391ms
Method 2: 2s 297ms

Number of players: 5 (Control: 5/5)
Method 1: 435ms
Method 2: 2s 394ms

Number of players: 6 (Control: 6/6)
Method 1: 470ms
Method 2: 2s 505ms

Number of players: 7 (Control: 7/7)
Method 1: 546ms
Method 2: 2s 633ms

Number of players: 8 (Control: 8/8)
Method 1: 589ms
Method 2: 2s 751ms

Number of players: 9 (Control: 9/9)
Method 1: 643ms
Method 2: 2s 855ms

Number of players: 10 (Control: 10/10)
Method 1: 689ms
Method 2: 2s 969ms

Number of players: 11 (Control: 11/11)
Method 1: 729ms
Method 2: 3s 106ms

Number of players: 12 (Control: 12/12)
Method 1: 767ms
Method 2: 3s 208ms

Number of players: 13 (Control: 13/13)
Method 1: 816ms
Method 2: 3s 331ms

Number of players: 14 (Control: 14/14)
Method 1: 862ms
Method 2: 3s 456ms

Number of players: 15 (Control: 15/15)
Method 1: 908ms
Method 2: 3s 583ms

Number of players: 16 (Control: 16/16)
Method 1: 958ms
Method 2: 3s 677ms

Number of players: 17 (Control: 17/17)
Method 1: 1s 6ms
Method 2: 3s 800ms

Number of players: 18 (Control: 18/18)
Method 1: 1s 52ms
Method 2: 3s 921ms

Number of players: 19 (Control: 19/19)
Method 1: 1s 100ms
Method 2: 4s 69ms

Number of players: 20 (Control: 20/20)
Method 1: 1s 148ms
Method 2: 4s 161ms

Number of players: 21 (Control: 21/21)
Method 1: 1s 197ms
Method 2: 4s 281ms

Number of players: 22 (Control: 22/22)
Method 1: 1s 246ms
Method 2: 4s 400ms

Number of players: 23 (Control: 23/23)
Method 1: 1s 290ms
Method 2: 4s 534ms

Number of players: 24 (Control: 24/24)
Method 1: 1s 339ms
Method 2: 4s 637ms

Number of players: 25 (Control: 25/25)
Method 1: 1s 388ms
Method 2: 4s 755ms

Number of players: 26 (Control: 26/26)
Method 1: 1s 433ms
Method 2: 4s 865ms

Number of players: 27 (Control: 27/27)
Method 1: 1s 478ms
Method 2: 4s 969ms

Number of players: 28 (Control: 28/28)
Method 1: 1s 541ms
Method 2: 5s 177ms

Number of players: 29 (Control: 29/29)
Method 1: 1s 602ms
Method 2: 5s 274ms

Number of players: 30 (Control: 30/30)
Method 1: 1s 626ms
Method 2: 5s 327ms

Number of players: 31 (Control: 31/31)
Method 1: 1s 676ms
Method 2: 5s 433ms

Number of players: 32 (Control: 32/32)
Method 1: 1s 725ms
Method 2: 5s 536ms

Method 1 (get_players()) is represented by red.
Method 2 (looping to 32) is represented by blue.
68747470733a2f2f666f72756d732e616c6c6965646d6f64732e6e65742f6174746163686d656e742e7068703f6174746163686d656e7469643d313537353730.png


// BlackRose

А вообще мне больше нравится вариант с лупом, т.к. обычно я использую свои внутренние функции-проверки на игроков... И вообще стараюсь избегать моментов когда нужно сравнивать что-либо одновременно со всеми игроками

Добавлено спустя 25 минут 42 секунды:
Еще если дело в том что лень всегда 4 строчки писать лишних то можно типа таких макросов сделать (непроверял) :
Код: Выделить всё
#define GETPLAYERS(%1,%2,%3,%4) \
new %1[32], %2; \
get_players(%1, %2, %3, %4)

#define FORPLAYERS(%1,%2,%3,%4,%5) \
GETPLAYERS(%2,%3,%4,%5); \
for(
new %1; %< %3; %1++)


public plugin_init() {
    FORPLAYERS(i, cts, ctnum, "e", "CT")
    {
        cs_set_user_team(cts[i], CS_TEAM_T);
    }
}
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Garey
 
Сообщения: 85
Зарегистрирован: 24 дек 2010, 03:12
Благодарил (а): 4 раз.
Поблагодарили: 37 раз.

Re: get_players vs loop

Сообщение Subb98 » 20 фев 2018, 09:58

KOTOKU писал(а):Почитал от и до, но кроме срача на тему что лучше charsmax или sizeof не нашел.
Бредовый срач какой-то, sizeof или charsmax от ситуации зависит, а strlen вообще для другого нужен

Это очень странно, ведь я скинул ссылку на конкретный пост:

Shadows In Rain писал(а):А вот и моё ИМХО. Ранимым людям читать не советую.
———————

АМХХ — это инструментарий. И для некоторых задач там есть готовые инструменты, и они идеально подходят для своих задач. Во мире программирования считается хорошим тоном использовать готовые решения — до тех пор, пока они полностью соответствуют пставленной задаче.

Если твоя задача — вычислить, сколько символов можно записать в массив, то используй charsmax.

А теперь не сочтите за троллинг мои откровенные заявления:
1. Неспособность прочитать короткий пост, написанный на базовом английском — это признак юниора, ака начинающиего программиста, ака программиста, недостаточно компетентного, чтобы вообще слушать его мнение в подобных вопросах.
2. Неумение использовать готовые инструменты (по любой причине) в такой маленькой сфере, как АМХХ — это так же признак юниора.
3. Если юниор настаивает на верности своих неграмотных подходов, то можно смело считать его быдлокодером.
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5485
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1329 раз.
Поблагодарили: 2343 раз.
Опыт программирования: Больше трех лет
Языки программирования: PHP

Re: get_players vs loop

Сообщение KOTOKU » 20 фев 2018, 17:23

Subb98, может я идиот? Покажи мне, что такого скрывается за этим постом?
Или ты мне на 2 пункт намекаешь? А не до п**ды ли мне его мнение ведь у меня свое есть?
Они там несколько страниц срались о sizeof и charsmax и не могли толком сказать разницу, ссылаясь на ссылки о которых толком ничего и нет полезного.

Человек, который считает магические числа за быдлокод - тупой баран, а не иначе.
Хоть я и пользуюсь charsmax, но даже мне понятно, что если длина ника игрока не может быть больше 31 символа, то почему бы и не написать просто магическое число?
И только попробуйте крякнуть что-то типа "Код не читабелен, я так не делаю", да мне вообще п**уй, я же не спрашиваю в какой позе ты е*ат**я любишь и не говорю о том, что я так не делаю и это не смотрибельно, поэтому, они и бараны. Не читабелен код - иди лесом, делай свой, читабельный.
Вот мое мнение по этому поводу, это что касается конкретно магических чисел.
Да, местами они неуместны, но если ты делаешь плагин под себя или в том участке кода не требуется вносить изменения, ты хоть усрись, но хочется человеку ставить магические числа, пусть ставит.
Ты писал этот плагин чтобы втирать за магические числа? Не нравится? - Перепиши его плагин по своему , а потом выеживайся. Щас многие начнут камни в мою сторону кидать, а я болт большой клал на эти камни, если они не по делу. Например, в прошлый раз доепались до моего плагина AntiChildren, мол, выносите плять в макрос биты менюшки, так читабельней :-| ну тебе надо ты и выноси, я свой труд вижу по своему, а если вы любите прие**ться к мелочам, то это не в мой адрес, я таких на дух не переношу. Одно дело, когда просто посоветуют в хорошем тоне, а другое "я бы так не делал, а я бы так не делал", ну не делай епана, я так делаю и на то есть причины, мне может комфортней в носу правой рукой ковыряться. Кхм, кхм... что касается sizeof и charsmax, собралось стадо умников, которые пытаются пернуть громче другого, один tavot там рассуждал адекватно ну и еще парочку было, которые ссылались на то, чтобы выпросить аргументы у tavot'a, у человека, который форум открыл по Pawn и вы нибудь туда заглядывали и не раз. Так вот, вместо того чтобы в один пост написать о том, что sizeof и charsmax используются в зависимости от ситуации, например в циклах, чтобы лишний раз не прибегать к <=; >=, а просто написать < sizeof/charsmax, ну или в случаях без магический чисел, а что касается strlen - это вообще не относится к sizeof и charsmax теме, strlen высчитывает кол-во заполненных ячеек в массиве (чтобы понятней было), так что, тут вообще не в тему загнали.
Короче, не усложняйте мелочи чтобы показаться умнее, не нравится вам юзать sizeof, пожалуйста, обходитесь без нее, не думаю, что это будет просто сделать, а то кукарекать на функцию все горазды, а нормально показать и рассказать - хрен плавал.


Знаете как я вижу AMX-X.RU в 2018?
"Все друг друга обсирают и выпытывают аргументы"
Ну как обычно, ничего не меняется.
Все, не заё меня этой темой.
Аватара пользователя
KOTOKU
 
Сообщения: 766
Зарегистрирован: 10 фев 2013, 00:53
Благодарил (а): 10 раз.
Поблагодарили: 117 раз.

Re: get_players vs loop

Сообщение Subb98 » 20 фев 2018, 17:25

KOTOKU, сколько написал, ужас. А заметить надо вот этот абзац:

АМХХ — это инструментарий. И для некоторых задач там есть готовые инструменты, и они идеально подходят для своих задач. Во мире программирования считается хорошим тоном использовать готовые решения — до тех пор, пока они полностью соответствуют пставленной задаче.
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5485
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1329 раз.
Поблагодарили: 2343 раз.
Опыт программирования: Больше трех лет
Языки программирования: PHP

Re: get_players vs loop

Сообщение KOTOKU » 20 фев 2018, 17:30

В этой теме один Garey пока адекватно среагировал, а не подключился к срачу.

Добавлено спустя 1 минуту 17 секунд:
Subb98 писал(а):KOTOKU, сколько написал, ужас. А заметить надо вот этот абзац:

АМХХ — это инструментарий. И для некоторых задач там есть готовые инструменты, и они идеально подходят для своих задач. Во мире программирования считается хорошим тоном использовать готовые решения — до тех пор, пока они полностью соответствуют пставленной задаче.


Почитай сколько я написал, не поленись, а что касается инструментов, то я промолчу, мы уже обсуждали этот вопрос, на страницах 4-6 вроде бы, когда речь шла об удобствах.

Почему же ты тогда не юзаешь стандартный strip с багом с оффсетом, а юзаешь стоки? Это же готовый инструментарий.
Только не говори, что это разные вещи и типа там баг поэтому не юзаю.
Это же готовый инструментарий, ты че не доверяешь готовому инструментарию?

Добавлено спустя 3 минуты 3 секунды:
При всем уважении к вашему фанатизму... я участвовать в этой теме более не желаю, ответ на свой вопрос я получил, а где-то и мнение по поводу отдельных личностей у меня уже вполне сформировалось.
Кто-то может адекватно реагировать на заданные вопросы, кто-то кукарекает и ссылается на посты более компетентных, но при этом своих аргументов нуль... ну вы поняли.
Аватара пользователя
KOTOKU
 
Сообщения: 766
Зарегистрирован: 10 фев 2013, 00:53
Благодарил (а): 10 раз.
Поблагодарили: 117 раз.

Re: get_players vs loop

Сообщение Subb98 » 20 фев 2018, 18:08

KOTOKU, кукарекаешь сейчас именно ты, не желая принимать все те многочисленные аргументы, которые тебе были представлены. Вспомни, зачем я искал тебе этот пост? Правильно, потому что моё мнение, как оппонента, ты не воспринимал объективно. Читать твои выкрики я не буду, равно как и отвечать более на любые твои вопросы (не важно, насколько они будут адекватны и уместно поставлены), поскольку у тебя совершенно не хватает терпения, когда дело доходит до чёткой аргументации. Если она не совпадает с твоим мнением, ты сразу скатываешь обсуждение в срач. За сим тему закрываю.
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5485
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1329 раз.
Поблагодарили: 2343 раз.
Опыт программирования: Больше трех лет
Языки программирования: PHP

Пред.

Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 6