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

pokypka20

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

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

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

TolikCorp

Участник
Сообщения
874
Реакции
334
for (new i = 1; i <= MaxClients; i++)
{
if (IsClientInGame(i) && !IsFakeClient(i))
{
PrintToChat(i, "Напишите !stopmusic чтобы отключить звуки босса.");
}
}
PrintToChatAll не?

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

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
PHP:
#pragma semicolon 1

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

new g_iRoundCounter = 1;

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

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

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Вот оно:
PHP:
stock PrintCenterTextAll(const String:format[], any:...)
{
	decl String:buffer[192];

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

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

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
Вот оно:
PHP:
stock PrintCenterTextAll(const String:format[], any:...)
{
	decl String:buffer[192];

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

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

Ты сам то знаешь как отправляются сообщения ботам? И отправляются ли они вообще))
В случае с фейк клиентом нету спама по UDP, если ты не в курсе.
Вообще по сути это может быть даже лишней проверкой, так как уйма серверов вообще не использует ботов. А вообще суть именно в компактности кода, а не в параноидальной идее "не делать лишнего".
Тут этого "лишнего" так мало, что любой сервер это заглотнёт и не заметит. Ты хоть раз слышал о проблеме, когда сервер лагал из-за сообщений в чат? Хотя по-сути это возможно, если спамить этими сообщениями, так как вырастет трафик на клиенты. Но вообще это настолько глупая тема для обсуждения, что слов нету)
Оффтоп
 
Сообщения
149
Реакции
29
Вопрос не в экономии электричества. И не в лишней проверке на бота. Вопрос в культуре написания кода.
В данном случае, так будет оптимальнее:
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" и.т.д. - просты в использовании, но с точки зрения нагрузки и оптимизации кода - есть зло.
 
Сообщения
149
Реакции
29
В данном случае, значение "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). Все прекрасно компилится и работает.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Неужели ты раскрыл древний заговор разработчиков кода?
PHP:
stock PrintToChatAll(const String:format[], any:...)
{
	decl String:buffer[192];
	
	for (new i = 1; i <= MaxClients; i++)
	{
		if (IsClientInGame(i))
		{
			SetGlobalTransTarget(i);
			VFormat(buffer, sizeof(buffer), format, 2);
			PrintToChat(i, "%s", buffer);
		}
	}
}
Ты типа умнее скриптеров самого SM? Чего ж они не сделали, как ты? Может им отрапортуешь, пусть поправят?)
Вот про !IsFakeClient действительно прояснили: я считал по несколько иным причинам, почему её нет сразу в коде - здесь логично это сказано.
 
Сообщения
149
Реакции
29
"Ты типа умнее скриптеров самого 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;
}

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

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
"IsClientInGame" и "IsPlayerAlive", "IsFakeClient"
Ну-ка, тогда поподробнее) IsClientInGame - уж не ловить ли мне предлагаешь подключение/отключение игрока, тем самым меняя значение его переменной?)
работает на порядок быстрее и лучше
Как может что-то "лучше" работать, если оно итак безотказно, а про скорость уже заранее сказано? :)
Оффтоп
 
Сообщения
149
Реакции
29
Стоп. Все. Говорить не с кем. Или ты думаешь, что ты говоришь аксиомами, а я - теоремами и мне нужно доказывать тебе каждое слово? Думай так. Если у тебя мозг есть - я тебе уже доказал, что ты был не прав. Если хочешь о чем то спросить - то не в таком тоне. По теме - все обсудили, сейчас ты начинаешь флудить.
P.S. Забавно выглядит то, что уровень web'а - у тебя на высоте. И все.
 
Сообщения
149
Реакции
29
Пиши - как все, пиши - как привык, плоди копипаст. Все у тебя получится, если будешь помнить, что граница для тебя - не быть "умнее скриптеров самого SM"...
P.S. Все. Стоп. Чувствую, что начинаю опускаться до твоего уровня, где ты - гораздо опытнее меня. Вопросы скриптинга - обсудили. Другие темы обсуждения, которые ты пытаешься навязать мне - меня не интересуют.
P.S. Сделай доброе дело. Не рекомендуй меня никому. Особенно - твоим друганам. Беспокоюсь за свою репутацию. Подумают, что мы еще знакомы ... На счет исправлений - конечно можно что то исправлять. Авторство плагина, например. Только - в код не лезь. Сломать - легко, а вот сделать ...
 
Последнее редактирование:

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Оффтоп
Вот, кому надо было VIP заказать! Надо другу тебя порекомендовать)
Оффтоп
Не рекомендуй меня никому. Особенно - твоим друганам. Беспокоюсь за свою репутацию. Подумают, что мы еще знакомы ...
Молодец, опустился на уровень ниже) На почти прямые оскорбления перёшёл. Так держать! :victory:
 
Последнее редактирование:

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
AlmazON, вообще-то большинство программистов делают ударение на понятности и компактности кода. Я С++ программист, часто приходится писать ту же перезагрузку операторов едва ли не к каждому классу, чтобы делать код более читабельным. Советую и тебе делать на этом ударение, иначе потом могут возникнуть глупые проблемы.
 

AlmazON

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

gibs

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

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

AlmazON

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

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #20
По поводу принта в чат:
PHP:
native PrintToChat(client, const String:format[], any:...);

stock PrintToChatAll(const String:format[], any:...)
{
	decl String:buffer[192];
	
	for (new i = 1; i <= MaxClients; i++)
	{
		if (IsClientInGame(i))
		{
			SetGlobalTransTarget(i);
			VFormat(buffer, sizeof(buffer), format, 2);
			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(buffer, sizeof(buffer), pContext, params, 2);

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

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

	return 1;
}

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

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