Сообщение раз в 3 раунда

Тема в разделе "Программирование / Скриптинг", создана пользователем pokypka20, 17 окт 2014.

  1. pokypka20

    pokypka20

    Сообщения:
    250
    Симпатии:
    30
    Появился один вопрос, уже всем надоело что каждый round_start спамит одна комманда, но а ждать пока пройдёт вся реклама в файле тоже не вариант. Как можно сделать чтобы это сообщение появлялось всего 1 раз в 3 раунда?

    PHP:
    public OnPluginStart()
    {
        
    HookEvent("round_start"Event_RoundStartEventHookMode_PostNoCopy);
    }

    public 
    Event_RoundStart(Handle:event, const String:name[], bool:dontBroadcast)
    {
        for (new 
    1<= MaxClientsi++)
        {
            if (
    IsClientInGame(i) && !IsFakeClient(i))
            {
                
    PrintToChat(i"Напишите !stopmusic чтобы отключить звуки босса.");
            }
        }
    }
     
  2. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    PrintToChatAll не?

    Сделай глобальную переменную, которая считает раунды, и проверочку.
     
  3. gibs

    gibs Фитиль народного волненья

    Сообщения:
    542
    Симпатии:
    139
    PHP:
    #pragma semicolon 1

    #include <sourcemod>
    #include <sdktools>
    #include <cstrike>

    new g_iRoundCounter 1;

    public 
    OnPluginStart()
    {
        
    HookEvent("round_start"Event_RoundStartEventHookMode_PostNoCopy);
    }

    public 
    Event_RoundStart(Handle:event, const String:name[], bool:dontBroadcast)
    {
        if(
    GetTeamScore(CS_TEAM_T) == && GetTeamScore(CS_TEAM_CT) == 0)
            
    g_iRoundCounter 1;
        else
            
    g_iRoundCounter++;
        
        if(
    g_iRoundCounter == 0)
            
    PrintToChatAll("Напишите !stopmusic чтобы отключить звуки босса.");
    }
    ТС дно
     
    pokypka20 нравится это.
  4. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.586
    Симпатии:
    1.994
    Вот оно:
    PHP:
    stock PrintCenterTextAll(const String:format[], any:...)
    {
        
    decl String:buffer[192];

        for (new 
    1<= MaxClientsi++)
        {
            if (
    IsClientInGame(i))
            {
                
    SetGlobalTransTarget(i);
                
    VFormat(buffersizeof(buffer), format2);
                
    PrintCenterText(i"%s"buffer);
            }
        }
    }
    А теперь сравниваем. Куда "напряжней" будет, не так ли?!
    PHP:
    public OnPluginStart() HookEvent("round_start"Event_RoundStartEventHookMode_PostNoCopy);

    public 
    Event_RoundStart(Handle:event, const String:name[], bool:dontBroadcast

        static 
    rounds;
        if (++
    rounds == 3)
        {
            
    rounds 0;
            for (new 
    1<= MaxClientsi++)
            {
                if (
    IsClientInGame(i) && !IsFakeClient(i)) PrintToChat(i"Напишите !stopmusic чтобы отключить звуки босса.");
            }
        }
    }
    Оффтоп
     
    Серый™ нравится это.
  5. gibs

    gibs Фитиль народного волненья

    Сообщения:
    542
    Симпатии:
    139
    Ты сам то знаешь как отправляются сообщения ботам? И отправляются ли они вообще))
    В случае с фейк клиентом нету спама по UDP, если ты не в курсе.
    Вообще по сути это может быть даже лишней проверкой, так как уйма серверов вообще не использует ботов. А вообще суть именно в компактности кода, а не в параноидальной идее "не делать лишнего".
    Тут этого "лишнего" так мало, что любой сервер это заглотнёт и не заметит. Ты хоть раз слышал о проблеме, когда сервер лагал из-за сообщений в чат? Хотя по-сути это возможно, если спамить этими сообщениями, так как вырастет трафик на клиенты. Но вообще это настолько глупая тема для обсуждения, что слов нету)
    Оффтоп
     
  6. Александр Смирнов 8452246

    Александр Смирнов 8452246

    Сообщения:
    150
    Симпатии:
    28
    Вопрос не в экономии электричества. И не в лишней проверке на бота. Вопрос в культуре написания кода.
    В данном случае, так будет оптимальнее:
    public Event_RoundStart(Handle:event, const String:name[], bool:dontBroadcast)
    {
    decl i;
    for (i = 1; i <= MaxClients; i++)
    if (IsClientInGame(i) && !IsFakeClient(i)) PrintToChat(i, "Напишите !stopmusic чтобы отключить звуки босса.");
    }

    P.S. Просто, не люблю лишние скобки. И переменную "i" нет смысла обьявлять через "new", так как идет явное указание значения переменной - "i = 1".
    "PrintToChatAll" и.т.д. - просты в использовании, но с точки зрения нагрузки и оптимизации кода - есть зло.
     
  7. Александр Смирнов 8452246

    Александр Смирнов 8452246

    Сообщения:
    150
    Симпатии:
    28
    Проблемы с компиляцией? У меня это применяется во всех моих плагинах - проблем нету.
     
  8. Александр Смирнов 8452246

    Александр Смирнов 8452246

    Сообщения:
    150
    Симпатии:
    28
    В данном случае, значение "i" имеет явное значение - "i = 1". Назначение Decl, New - обьявление переменных. Как Decl может быть хуже New? Прочти и осмысли то, что ты мне привел как рекомендацию:
    1. "Вы абсолютно уверены, что есть по крайней мере одно хранилище/операция, которая отдает переменной действительные данные" - это про явное значение переменной, в данном случае "i = 1", это явное значение.
    2. "Кроме того, нет необходимости использовать decl на не-массивы, поскольку нет никаких дополнительных затрат на инициализацию однго однострочного значения." - ты не делаешь лишних затрат - тебе НУЖНО начать со значения 1 и до значения MaxClients.
    3. Надеюсь, ты не будешь утверждать, что decl используется ТОЛЬКО для массивов.

    Как видишь - туман гугловского перевода рассеялся. Decl использует меньше ресурсов, чем New - это аксиома. Главное - помнить, что используя Decl, нужно не забывать о начальном назначении данной переменной.

    P.S. "i - не массив, ты делаешь только хуже" - на сколько хуже я делаю? И к чему приведет это "хуже"? Неужели ты раскрыл древний заговор разработчиков кода? На счет компила - попробуй так:

    #include <sourcemod>

    public Plugin:myinfo =
    {
    name = "Test",
    author = "Test",
    description = "Test",
    version = "1.0"
    };

    public OnPluginStart()
    {
    HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
    }

    public Event_RoundStart(Handle:event, const String:name[], bool:dontBroadcast)
    {
    decl i;
    for (i = 1; i <= MaxClients; i++)
    if (IsClientInGame(i) && !IsFakeClient(i)) PrintToChat(i, "Напишите !stopmusic чтобы отключить звуки босса.");
    }


    Для отступов в начале строки я использую "Tab", тут это, почему то, не отображаются, сделай отступы так, как привык делать ты (пробелы или Tab). Все прекрасно компилится и работает.
     
  9. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.586
    Симпатии:
    1.994
    PHP:
    stock PrintToChatAll(const String:format[], any:...)
    {
        
    decl String:buffer[192];
        
        for (new 
    1<= MaxClientsi++)
        {
            if (
    IsClientInGame(i))
            {
                
    SetGlobalTransTarget(i);
                
    VFormat(buffersizeof(buffer), format2);
                
    PrintToChat(i"%s"buffer);
            }
        }
    }
    Ты типа умнее скриптеров самого SM? Чего ж они не сделали, как ты? Может им отрапортуешь, пусть поправят?)
    Вот про !IsFakeClient действительно прояснили: я считал по несколько иным причинам, почему её нет сразу в коде - здесь логично это сказано.
     
  10. Александр Смирнов 8452246

    Александр Смирнов 8452246

    Сообщения:
    150
    Симпатии:
    28
    "Ты типа умнее скриптеров самого SM?" - у тебя явно занижена самооценка. "Скриптеры SM" - это не уровень Бога. У них - своя мотивация, почему они так делают. "PrintToChatAll" - просто и легко для масс, а значит - полезно для SM. И "Basic" и "Assembler" есть и используются. НО - удел масс - "Basic". Потому что просто и легко.
    P.S. Кстати, тебе для размышлений, на счет !IsFakeClient. Если скомпилировать тот код, что я привел выше и декампилировать его, получается так:

    public Event_RoundStart(Handle:event, String:name[], bool:dontBroadcast)
    {
    new i = 1;
    while (i <= MaxClients)
    {
    if (IsClientInGame(i))
    {
    PrintToChat(i, "�������� !stopmusic ����� ��������� ����� �����.");
    i++;
    }
    i++;
    }
    return 0;
    }

    Интересно получается, верно?
     
  11. Александр Смирнов 8452246

    Александр Смирнов 8452246

    Сообщения:
    150
    Симпатии:
    28
    Зачем мне примеры других? Я пишу по своему, изначально закладывая максимальную оптимизацию для ядра CSS. Или, без "примеров у других" мой код не будет работать? sourcepawn - не уникальный язык с "0". И по поводу экономного использования ресурсов - к sourcepawn много вопросов.
    И еще 1 момент. Старайся меньше использовать "удобностей" от sourcepaw. Я про "IsClientInGame" и "IsPlayerAlive", "IsFakeClient" и.т.д. Это все прекрасно заменяется. И работает на порядок быстрее и лучше.
    P.S. Ну, извини за пару ошибок. И за спойлеры. И за тэги. И за регистрацию. Спасибо, что сказал - есть о чем задуматься и попытаться начать с нуля. Ясное дело, что по уровню - тебя мне не догнать. Кстати, подскажи как спойлеры и тэги в коде павна используются. И еще - на что влияет дата регистрации? Может, ну уровень кода?
     
  12. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.586
    Симпатии:
    1.994
    Ну-ка, тогда поподробнее) IsClientInGame - уж не ловить ли мне предлагаешь подключение/отключение игрока, тем самым меняя значение его переменной?)
    Как может что-то "лучше" работать, если оно итак безотказно, а про скорость уже заранее сказано? :)
    Оффтоп
     
  13. Александр Смирнов 8452246

    Александр Смирнов 8452246

    Сообщения:
    150
    Симпатии:
    28
    Стоп. Все. Говорить не с кем. Или ты думаешь, что ты говоришь аксиомами, а я - теоремами и мне нужно доказывать тебе каждое слово? Думай так. Если у тебя мозг есть - я тебе уже доказал, что ты был не прав. Если хочешь о чем то спросить - то не в таком тоне. По теме - все обсудили, сейчас ты начинаешь флудить.
    P.S. Забавно выглядит то, что уровень web'а - у тебя на высоте. И все.
     
  14. Александр Смирнов 8452246

    Александр Смирнов 8452246

    Сообщения:
    150
    Симпатии:
    28
    Пиши - как все, пиши - как привык, плоди копипаст. Все у тебя получится, если будешь помнить, что граница для тебя - не быть "умнее скриптеров самого SM"...
    P.S. Все. Стоп. Чувствую, что начинаю опускаться до твоего уровня, где ты - гораздо опытнее меня. Вопросы скриптинга - обсудили. Другие темы обсуждения, которые ты пытаешься навязать мне - меня не интересуют.
    P.S. Сделай доброе дело. Не рекомендуй меня никому. Особенно - твоим друганам. Беспокоюсь за свою репутацию. Подумают, что мы еще знакомы ... На счет исправлений - конечно можно что то исправлять. Авторство плагина, например. Только - в код не лезь. Сломать - легко, а вот сделать ...
     
    Последнее редактирование: 18 окт 2014
  15. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.586
    Симпатии:
    1.994
    Оффтоп
    Вот, кому надо было VIP заказать! Надо другу тебя порекомендовать)
    Оффтоп
    Молодец, опустился на уровень ниже) На почти прямые оскорбления перёшёл. Так держать! :victory:
     
    Последнее редактирование: 18 окт 2014
  16. gibs

    gibs Фитиль народного волненья

    Сообщения:
    542
    Симпатии:
    139
    AlmazON, вообще-то большинство программистов делают ударение на понятности и компактности кода. Я С++ программист, часто приходится писать ту же перезагрузку операторов едва ли не к каждому классу, чтобы делать код более читабельным. Советую и тебе делать на этом ударение, иначе потом могут возникнуть глупые проблемы.
     
  17. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.586
    Симпатии:
    1.994
    А понятности кому? Пользователю ни к чему знать, что я делаю своим "большим кодом". К тому же, можно делать сокращение для такого часто применяемого кода:
    PHP:
    PTA(const String:text[])
    {
        for (new 
    1<= MaxClientsi++)
        {
            if (
    IsClientInGame(i)) PrintToChat(itext);
        }
    }
    Далее везде просто пишем: PTA("Текст."); и всё! Почти та же высокая оптимизация и довольно компактный код.
    Оффтоп
    Так насчёт ботов - ты уверен, не нужна проверка для чата и звуков?
    А про decl i; в циклах есть что, программист?)
     
  18. gibs

    gibs Фитиль народного волненья

    Сообщения:
    542
    Симпатии:
    139
    Ну а ты подумай почему авторы сорсмода не сделали проверку на ботов в своих сток функциях. Наверное, они глупее тебя.
    А про объявление под decl описано в вики. Оптимизация идет за счёт использования уже выделенного для сервера участка памяти, а не выделения под переменную нового. В нём обычно всякий мусор попадается, так как это память была выделена при более раннем вызове функции или же других функций. Просто объяви строку через decl и выведи её без каких-либо манипуляций и увидишь мусор.
     
  19. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.586
    Симпатии:
    1.994
    Почему тогда decl i; не сделали в цикле? Они глупее "новообъявившегося профи" выше? Или смысла всё же нет: оптимизация та же, а выглядит больше (на пару символов больше и в написании)?
    Знаю про мусор. А делать так не стоит - сервер может упасть, если вывести подобное) Надо ещё хотя бы нулевой символ подставить до этого.
     
  20. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.005
    Симпатии:
    2.994
    По поводу принта в чат:
    PHP:
    native PrintToChat(client, const String:format[], any:...);

    stock PrintToChatAll(const String:format[], any:...)
    {
        
    decl String:buffer[192];
        
        for (new 
    1<= MaxClientsi++)
        {
            if (
    IsClientInGame(i))
            {
                
    SetGlobalTransTarget(i);
                
    VFormat(buffersizeof(buffer), format2);
                
    PrintToChat(i"%s"buffer);
            }
        }
    }
    PHP:
    static cell_t PrintToChat(IPluginContext *pContext, const cell_t *params)
    {
        
    int client params[1];
        
    CPlayer *pPlayer g_Players.GetPlayerByIndex(client);

        if (!
    pPlayer)
        {
            return 
    pContext->ThrowNativeError("Client index %d is invalid"client);
        }

        if (!
    pPlayer->IsInGame())
        {
            return 
    pContext->ThrowNativeError("Client %d is not in game"client);
        }

        
    g_SourceMod.SetGlobalTarget(client);

        
    char buffer[192];
        
    g_SourceMod.FormatString(buffersizeof(buffer), pContextparams2);

        
    /* Check for an error before printing to the client */
        
    if (pContext->GetLastNativeError() != SP_ERROR_NONE)
        {
            return 
    0;
        }

        if (!
    g_HL2.TextMsg(clientHUD_PRINTTALKbuffer))
        {
            return 
    pContext->ThrowNativeError("Could not send a usermessage");
        }

        return 
    1;
    }
    Поэтому в данном случае быстрее
    PHP:
    for (new 1<= MaxClients; ++i)
     if (
    IsClientInGame(i) && !IsFakeClient(i)) PrintToChat(i"Напишите !stopmusic чтобы отключить звуки босса.");
    Если хотите !IsFakeClient(i) можно убрать

    Насчет new и decl мне кажется для одной переменной это одинаково, но для массивов decl быстрее. decl Не инициализирует переменную, а new делает это.
     
    Последнее редактирование: 18 окт 2014