// Включение списков файлов всех структур, функций, вызовов и тегов, которые имеются в наличии.
#include <sourcemod>
// Объявляем новый дескриптор h_mode и переменную с целым значением rsm для квара "sm_resetscore_mode".
new Handle:h_mode, rsm,
// Объявляем новый дескриптор h_annonce и переменную с целым значением ann для квара "sm_resetscore_annonce".
Handle:h_annonce, ann,
// Объявляем новую строку, хранящую 8 значений (команд) в массиве с "пустым" общим количеством занимаемого места (символов).
String:ds[8][] = {"!rd", "1rd", "!resetdeath", "!rs", "1rs", "!кы", "1кы", "!resetscore"};
// Общественная информация о плагине.
public Plugin:myinfo =
{
name = "Resetscore+", // Название плагина.
author = "AlmazON", // Автор плагина.
description = "Сбрасывает ваши смерти или счёт", // Краткое описание плагина.
version = "1.0.4", // Версия данного плагина.
url = "http://www.hlmod.ru" // Сайт поддержки плагина (автора).
}
// Встроенное глобальное событие, функция которого - единождый вызов при полной инициализации плагина.
public OnPluginStart()
{
// Создаём квар "sm_resetscore_mode" и приравниваем его значение к ранее созданному дескриптору h_mode. Устанавливаем ему минимум 0, максимум 3.
h_mode = CreateConVar("sm_resetscore_mode", "3", "0 - off, 1 - resetdeath, 2 - resetscore, 3 - all.", 0, true, 0.0, true, 3.0);
// Создаём квар "sm_resetscore_annonce и приравниваем его значение к ранее созданному дескриптору h_annonce. Устанавливаем ему минимум 0, максимум 3.
h_annonce = CreateConVar("sm_resetscore_annonce", "3", "0 - disable, 1 - chat, 2 - annonce, 3 - all.", 0, true, 0.0, true, 3.0);
// Возращаем целое значение дескриптора h_mode и приравниваем его к ранее созданной переменной rsm.
rsm = GetConVarInt(h_mode);
// Возращаем целое значение дескриптора h_annonce и приравниваем его к ранее созданной переменной ann.
ann = GetConVarInt(h_annonce);
// Отлавливаем изменение значения дескриптора h_mode и вызываем CVarChange.
HookConVarChange(h_mode, CVarChange);
// Отлавливаем изменение значения дескриптора h_annonce и вызываем CVarChange.
HookConVarChange(h_annonce, CVarChange);
// Отлавливаем встроенное глобальное событие игры "round_start" с методом: после его начала и без переменных, и вызываем RoundStart.
HookEvent("round_start", RoundStart, EventHookMode_PostNoCopy);
// Прямая внутренняя функция, добавляющая обратный вызов Say при отправке команды "say" (общий чат).
AddCommandListener(Say, "say");
// Прямая внутренняя функция, добавляющая обратный вызов Say при отправке команды "say_team" (коммандный чат).
AddCommandListener(Say, "say_team");
}
// Функция обратного вызова CVarChange.
public CVarChange(Handle:convar, const String:oldValue[], const String:newValue[])
{
// Условие: если уникальный идентификатор convar этой функции равен h_mode, то выполнить операцию, приведённую ниже.
if (convar == h_mode)
// Преобразуем строку в целое число с новым значением для переменной rsm.
rsm = StringToInt(newValue);
// Условие: если следующий уникальный идентификатор convar этой функции равен h_annonce, то выполнить операцию, приведённую ниже.
else if (convar == h_annonce)
// Преобразуем строку в целое число с новым значением для переменной rsm.
ann = StringToInt(newValue);
}
// Функция обратного вызова RoundStart.
public Action:RoundStart(Handle:event, const String:name[], bool:dontBroadcast)
{
// Условие: для выполнения операций ниже, переменная rsm должна быть истиной (true), а переменная ann больше 1.
if (rsm && ann > 1)
{
// Условие: для выполнения операции ниже, переменная rsm не должна быть равной 2.
if (rsm != 2)
// Отправка всем сообщения в чат.
PrintToChatAll("\x01\x04[Resetdeath]\x01 Сбросить \x05смерти\x01: \x03%s\x01, \x03%s\x01 или \x03%s\x01.", ds[0], ds[1], ds[2]);
// Условие: для выполнения операции ниже, переменная rsm не должна быть равной 1.
if (rsm != 1)
// Отправка всем сообщения в чат.
PrintToChatAll("\x01\x04[Resetscore]\x01 Сбросить \x05счёт\x01: \x03%s\x01, \x03%s\x01, \x03%s\x01 или \x03%s\x01.", ds[3], ds[5], ds[6], ds[7]);
}
}
// Функция обратного вызова Say.
public Action:Say(client, const String:command[], args)
{
// Условие: для выполнения всех операций ниже, переменная rsm должна быть истиной.
if (rsm)
{
// Готовим строку text, которая пока что содержит хлам, к заполнению символами, ограничив её ёмкость 200 символами кодировки UTF8.
decl String:text[200];
// Получаем всю строку текущих команд, направляемых на сервер.
GetCmdArgString(text, sizeof(text));
// Создаём новые переменные для количества убийств GetClientDeaths и фрагов GetClientFrags для игрока с индексом из client.
new deaths = GetClientDeaths(client), frags = GetClientFrags(client),
// Создаём новую переменную обнаружения нужных нам строк команд обнуления смертей rd, отсутствие которых в сумме равно 0.
rd = StrContains(text, ds[0], false) * StrContains(text, ds[1], false) + StrContains(text, ds[2], false),
// Создаём новую переменную обнаружения нужных нам строк команд обнуления фрагов rs, отсутствие которых в сумме равно 0.
rs = (StrContains(text, ds[3], false) + StrContains(text, ds[4], false)) * StrContains(text, ds[5], false) + StrContains(text, ds[6], false) +
StrContains(text, ds[7], false);
// Условие: для выполнения операции ниже, переменная rsm не должна быть равной 1, переменные смертей или фрагов - обязательно истинны, как и переменная rs.
if (rsm != 1 && (deaths || frags) && rs)
{
// Устанавливаем нулевое количество смертей для для игрока с индексом из client.
SetEntProp(client, Prop_Data, "m_iDeaths", 0);
// Устанавливаем нулевое количество фрагов для для игрока с индексом из client.
SetEntProp(client, Prop_Data, "m_iFrags", 0);
// Условие: для выполнения операции ниже, переменная ann должна быть истинной и не равна 2.
if (ann && ann != 2)
// Отправляем сообщение клиенту, успешно обнулившего свои смерти и фраги.
PrintToChat(client, "\x01\x04[Resetscore]\x01 Ваш \x05общий счёт \x03сброшен\x01!");
}
// Условие: для выполнения операции ниже, переменная rsm не должна быть равна 2, а переменные смертей deaths и обнаружения команд их сброса rd - истинны.
else if (rsm != 2 && deaths && rd)
{
// Устанавливаем нулевое количество смертей для для игрока с индексом из client.
SetEntProp(client, Prop_Data, "m_iDeaths", 0);
// Условие: для выполнения операции ниже, переменная ann должна быть истинной и не равной 2.
if (ann && ann != 2)
// Отправляем сообщение клиенту, успешно обнулившего свои смерти.
PrintToChat(client, "\x01\x04[Resetdeath]\x01 Ваш \x05счёт смертей \x03сброшен\x01!");
}
// Условие: для выполнения всех операций ниже, переменная ann должна быть истинной и не равной 2, а переменная количества смертей deaths - ложной.
else if (ann && ann != 2 && !deaths)
{
// Условие: для выполнения операции ниже, переменная rsm не должна быть равна 1, переменная количества фрагов frags должна быть 0, а rs - истинной.
if (rsm != 1 && !frags && rs)
// Отправляем сообщение клиенту, что его смерти и фраги не нуждаются в сбросе.
PrintToChat(client, "\x01\x04[Resetscore]\x01 Ваш \x05общий счёт\x01 равен \x030\x01!");
// Условие: для выполнения операции ниже, переменная rsm не должна быть равна 2, а переменная обнаружения смертей rd - необходима истинной.
else if (rsm != 2 && rd)
// Отправляем сообщение клиенту, что его смерти не нуждаются в сбросе.
PrintToChat(client, "\x01\x04[Resetdeath]\x01 У вас итак \x03нет \x05смертей\x01!");
}
}
}