Иконка ресурса

Bot Ping Lite 29-05-2015

Danyas

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

PHP:
#include <sdktools>

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

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

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

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

public Action:SetPing(Handle:timer)
{
    for(new i = 1; i <= g_iMaxClients; i++)
    {
    if(!IsValidEdict(i) || !IsClientInGame(i) || !IsFakeClient(i)) continue;
    SetEntData(g_iPlayerManager, g_iPing + (i * 4), GetRandomInt(MINPING,MAXPING));}
}

P.S. На v34 работает стабильно
 
Последнее редактирование модератором:

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #2
new g_iMaxClients = 0, String:g_szPlayerManager[20] = ""

strcopy(g_szPlayerManager, sizeof(g_szPlayerManager), "cs_player_manager");
Это еще зачем?

PHP:
#include <sdktools>

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

new g_iPlayerManager = -1, g_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 i = 1; i <= g_iMaxClients; i++)
	{
		if(!IsValidEdict(i) || !IsClientInGame(i) || !IsFakeClient(i)) continue;
			SetEntData(g_iPlayerManager, g_iPing + (i * 4), GetRandomInt(MINPING,MAXPING));
	}
	return Plugin_Continue;
}
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
strcopy(g_szPlayerManager, sizeof(g_szPlayerManager), "cs_player_manager");
Зачем это? Сразу нельзя было всунуть в FindEntityByClassname?
g_iMaxClients        = GetMaxClients();
Дожили. MaxClients отменили?)
У кого списал этот хлам?)
Можно было сразу перемножить, чем делать это каждые 3 секунды.
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
  • Автор ресурса
  • #4
Это еще зачем?

PHP:
#include <sdktools>

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

new g_iPlayerManager = -1, g_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 i = 1; i <= g_iMaxClients; i++)
	{
		if(!IsValidEdict(i) || !IsClientInGame(i) || !IsFakeClient(i)) continue;
			SetEntData(g_iPlayerManager, g_iPing + (i * 4), GetRandomInt(MINPING,MAXPING));
	}
	return Plugin_Continue;
}

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

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

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


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

Зачем это? Сразу нельзя было всунуть в FindEntityByClassname?
Дожили. MaxClients отменили?)У кого списал этот хлам?)

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

Danyas

Участник
Сообщения
2,173
Реакции
1,072
  • Автор ресурса
  • #6
Danyas, Оффтоп

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

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

Эм, (i * 4) каждые 3 секунды - это плохо, а GetMaxClients() каждые 3 секунды - хорошо? Где логика?

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

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
а GetMaxClients() каждые 3 секунды - хорошо? Где логика?
Зато есть на то MaxClients - константа. Применяй, хоть каждую долю секунды.
И, кстати говоря, количество слотов можно менять и при работе сервера, так что, как не крути - вариант был плох.
а не впадать в крайности и показывать хорошие манеры скриптинга
Ну, вообще-то так тогда ещё меньше писать надо было. Реальная оптимизация, даже в "количестве" кода)
 
Сообщения
149
Реакции
29
Лично я стараюсь не использовать часто все что имеет префикс "Get". Не из воздуха же оно берет данные, а производит вычисления всякий раз при обращении к этой функции. Лично я делаю так же, как сделал Danyas: g_iMaxClients = GetMaxClients();
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Лично я делаю так же, как сделал Danyas: g_iMaxClients = GetMaxClients();
Берём, меняем и... в пролёте. Больше - просто не захватит ботов с индексами сверх g_iMaxClients, а меньше - таймер завершится с ошибкой, типа: Native IsClientInGame reported: index 16 is not valid.
Danyas, Оффтоп
 

FrozDark

Участник
Сообщения
1,769
Реакции
2,050
Зря убрали, это нужно делать как максимум раз в секунду, так что интервал в 3 секунды слишком много!
 
Сообщения
149
Реакции
29
Думаю, с GetMaxClients() все понятно - g_iMaxClients = GetMaxClients() лучше, чем каждый раз GetMaxClients(). На счет "Берём, меняем и... в пролёте" ... о Боже .. Где вероятность того, что этим будут постоянно пользоваться? Даже если пара ботов перестанет иметь пинг - флаг им в руки, после смены мапы все наладится! На счет ошибок - проверки чуть по другому переписать (заменить IsValidEdict на IsClientInGame(client) или IsClientConnected(client)) - и ошибок не будет. Нет смысла усложнять код до полной защиты от дураков.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
как максимум раз в секунду
Может, как минимум?)
На счет ошибок - проверки чуть по другому переписать (заменить IsValidEdict на IsClientInGame(client) или IsClientConnected(client)) - и ошибок не будет.
меньше - таймер завершится с ошибкой, типа: Native IsClientInGame reported: index 16 is not valid.
Такое возможно, лишь когда индекс игрока за пределами 1 и MaxClients, так что, ничего ты тут не сделаешь. Обновления раз за карту явно будет недостаточно.
Нет смысла усложнять код до полной защиты от дураков
Читай ссылку, найденную Danyas, там тоже упоминается момент изменения количества слотов на сервере, следом за чем должна меняться g_iMaxClients. Оффтоп
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Как МАКСИМУМ, как минимум OnGameFrame или PostThink
Оффтоп
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
  • Автор ресурса
  • #17
Оффтоп

Раньше было
PHP:
GetRandomFloat(1.0,5.0)
но захотелось дать возможность выбора.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Danyas, не смотрел, что раньше, но речь ещё о том, что если обновления будут слишком редки, то вместо пинга игроки всё же увидят надпись BOT.
 

The End Is Near...

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