[CS: Source] Bot Ping Lite

Тема в разделе "Новые плагины", создана пользователем Danyas, 29 май 2015.

  1. Danyas

    Danyas Спасибо, браток © yand3xmail Модератор

    Сообщения:
    1.715
    Симпатии:
    452
    Облегчил плагин Bot Ping.
    1) Убрал функцию OnGameFrame, которая давала определенную нагрузку.
    2) Убрал лишние переменные. Все "старые" переменные теперь меняются посредством рекомпила.
    3) Оставил поддержку только CSS. (возможно будет работать на CSGO)

    PHP:
    #include <sdktools>

    #define INTERVAL 3.0
    #define MINPING 20
    #define MAXPING 40

    new g_iMaxClients 0String:g_szPlayerManager[20] = ""g_iPlayerManager = -1g_iPing = -1;

    public 
    Plugin:myinfo ={name "Bot Ping [L]",    author "Danyas"};
    public 
    OnPluginStart()
    {
        
    g_iPing    FindSendPropOffs("CPlayerResource""m_iPing");
        
    strcopy(g_szPlayerManagersizeof(g_szPlayerManager), "cs_player_manager");
        
    CreateTimer(INTERVAL,SetPing,_,TIMER_REPEAT);
    }

    public 
    OnMapStart()
    {
        
    g_iMaxClients        GetMaxClients();
        
    g_iPlayerManager    FindEntityByClassname(g_iMaxClients 1g_szPlayerManager);
    }

    public 
    Action:SetPing(Handle:timer)
    {
        for(new 
    1<= g_iMaxClientsi++)
        {
        if(!
    IsValidEdict(i) || !IsClientInGame(i) || !IsFakeClient(i)) continue;
        
    SetEntData(g_iPlayerManagerg_iPing + (4), GetRandomInt(MINPING,MAXPING));}
    }
    P.S. На v34 работает стабильно
     

    Вложения:

    Последнее редактирование: 7 июл 2015
    ĦĄŇĢǾVξŘ и ALЬTAIR нравится это.
  2. R1KO

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

    Сообщения:
    5.972
    Симпатии:
    2.978
    Это еще зачем?

    PHP:
    #include <sdktools>

    #define INTERVAL 3.0
    #define MINPING 20
    #define MAXPING 40

    new g_iPlayerManager = -1g_iPing = -1;

    public 
    Plugin:myinfo ={name "Bot Ping [L]",    author "Danyas"};
    public 
    OnPluginStart()
    {
        
    g_iPing    FindSendPropOffs("CPlayerResource""m_iPing");
        
    CreateTimer(INTERVAL,SetPing,_,TIMER_REPEAT);
    }

    public 
    OnMapStart()
    {
        
    g_iPlayerManager    FindEntityByClassname(MaxClients 1"cs_player_manager");
    }

    public 
    Action:SetPing(Handle:timer)
    {
        for(new 
    1<= g_iMaxClientsi++)
        {
            if(!
    IsValidEdict(i) || !IsClientInGame(i) || !IsFakeClient(i)) continue;
                
    SetEntData(g_iPlayerManagerg_iPing + (4), GetRandomInt(MINPING,MAXPING));
        }
        return 
    Plugin_Continue;
    }
     
    Danyas нравится это.
  3. AlmazON

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

    Сообщения:
    4.512
    Симпатии:
    1.963
    Зачем это? Сразу нельзя было всунуть в FindEntityByClassname?
    Дожили. MaxClients отменили?)
    У кого списал этот хлам?)
    Можно было сразу перемножить, чем делать это каждые 3 секунды.
     
    Danyas нравится это.
  4. Danyas

    Danyas Спасибо, браток © yand3xmail Модератор

    Сообщения:
    1.715
    Симпатии:
    452
    У меня когда я ставил просто
    PHP:
        g_iPlayerManager    FindEntityByClassname(g_iMaxClients 1cs_player_manager);
    ничего не компилилось, я это сознательно писал.

    спустя полторы минуты размышлений

    Проблема та же что и с картой, забыл кавычки.....


    спустя еще полторы минуты размышлений

    Я правил СТАРЫЙ код (еще со времен SM 1.3), а не писал новый.
    По этому не совсем корректно выполняю задачи
     
  5. Александр Смирнов 8452246

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

    Сообщения:
    150
    Симпатии:
    28
    Эм, (i * 4) каждые 3 секунды - это плохо, а GetMaxClients() каждые 3 секунды - хорошо? Где логика?
     
  6. Danyas

    Danyas Спасибо, браток © yand3xmail Модератор

    Сообщения:
    1.715
    Симпатии:
    452
    Оффтоп
    Можно было, но для меня цель была убрать OnGameFrame, а не впадать в крайности и показывать хорошие манеры скриптинга :agree:

    после просмотра поста выше

    А как его лучше заменить тогда?
     
  7. AlmazON

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

    Сообщения:
    4.512
    Симпатии:
    1.963
    Зато есть на то MaxClients - константа. Применяй, хоть каждую долю секунды.
    И, кстати говоря, количество слотов можно менять и при работе сервера, так что, как не крути - вариант был плох.
    Ну, вообще-то так тогда ещё меньше писать надо было. Реальная оптимизация, даже в "количестве" кода)
     
  8. Александр Смирнов 8452246

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

    Сообщения:
    150
    Симпатии:
    28
    Лично я стараюсь не использовать часто все что имеет префикс "Get". Не из воздуха же оно берет данные, а производит вычисления всякий раз при обращении к этой функции. Лично я делаю так же, как сделал Danyas: g_iMaxClients = GetMaxClients();
     
  9. Danyas

    Danyas Спасибо, браток © yand3xmail Модератор

    Сообщения:
    1.715
    Симпатии:
    452
    AlmazON нравится это.
  10. AlmazON

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

    Сообщения:
    4.512
    Симпатии:
    1.963
    Берём, меняем и... в пролёте. Больше - просто не захватит ботов с индексами сверх g_iMaxClients, а меньше - таймер завершится с ошибкой, типа: Native IsClientInGame reported: index 16 is not valid.
    Danyas, Оффтоп
     
  11. FrozDark

    FrozDark Команда сайта HLMod Модератор

    Сообщения:
    1.761
    Симпатии:
    1.915
    Зря убрали, это нужно делать как максимум раз в секунду, так что интервал в 3 секунды слишком много!
     
  12. Александр Смирнов 8452246

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

    Сообщения:
    150
    Симпатии:
    28
    Думаю, с GetMaxClients() все понятно - g_iMaxClients = GetMaxClients() лучше, чем каждый раз GetMaxClients(). На счет "Берём, меняем и... в пролёте" ... о Боже .. Где вероятность того, что этим будут постоянно пользоваться? Даже если пара ботов перестанет иметь пинг - флаг им в руки, после смены мапы все наладится! На счет ошибок - проверки чуть по другому переписать (заменить IsValidEdict на IsClientInGame(client) или IsClientConnected(client)) - и ошибок не будет. Нет смысла усложнять код до полной защиты от дураков.
     
    Danyas нравится это.
  13. AlmazON

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

    Сообщения:
    4.512
    Симпатии:
    1.963
    Может, как минимум?)
    Такое возможно, лишь когда индекс игрока за пределами 1 и MaxClients, так что, ничего ты тут не сделаешь. Обновления раз за карту явно будет недостаточно.
    Читай ссылку, найденную Danyas, там тоже упоминается момент изменения количества слотов на сервере, следом за чем должна меняться g_iMaxClients. Оффтоп
     
  14. FrozDark

    FrozDark Команда сайта HLMod Модератор

    Сообщения:
    1.761
    Симпатии:
    1.915
    Как МАКСИМУМ, как минимум OnGameFrame или PostThink
     
  15. Danyas

    Danyas Спасибо, браток © yand3xmail Модератор

    Сообщения:
    1.715
    Симпатии:
    452
    Сменить в исходнике можно.
    Это ведь интервал обновления пинга, верно?
     
  16. AlmazON

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

    Сообщения:
    4.512
    Симпатии:
    1.963
    Оффтоп
     
    Danyas нравится это.
  17. Danyas

    Danyas Спасибо, браток © yand3xmail Модератор

    Сообщения:
    1.715
    Симпатии:
    452
    Раньше было
    PHP:
    GetRandomFloat(1.0,5.0)
    но захотелось дать возможность выбора.
     
  18. AlmazON

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

    Сообщения:
    4.512
    Симпатии:
    1.963
    Danyas, не смотрел, что раньше, но речь ещё о том, что если обновления будут слишком редки, то вместо пинга игроки всё же увидят надпись BOT.
     
  19. The End Is Near...

    The End Is Near... Russian Roulette

    Сообщения:
    893
    Симпатии:
    659
    AlmazON
    Имеется ввиду время, а не частота
     
  20. The End Is Near...

    The End Is Near... Russian Roulette

    Сообщения:
    893
    Симпатии:
    659
    AlmazON
    Чего не было сказано? "Зря убрали, это нужно делать как максимум раз в секунду, так что интервал в 3 секунды слишком много!", значит имеется ввиду именно время, но это лишь мое мнение, фрози придет, может сам напишет. Ну и по плагину: а если ботов нет? Таймер так и будет работать. И еще: задать каждому боту свои min-max значения, можно использовать SetEntProp