Для чего в плагине неиспользуемая функция
PbSayText2(), заточенная под КСГО (
потому что протобуф)?
Искать оффсеты и делать
SetFailState(), если они не найдены, нужно в самом начале, ещё до создания кваров и хуков событий. Лучше в
AskPluginLoad2().
Просто плагин делает много лишней работы при запуске, если он не подходит для игры.
В
Event_OnStart() ты пропустил главный параметр в выводе сообщения для КСС.
При форматировании текста всё же немного полезнее использовать
FormatEx(), а не
Format(), если целевая тестовая переменная не используется в качестве одного из параметров ввода.
К тому же при использовании
%t в
FormatEx() и
Format() нужно предварительно сделать
SetGlobalTransTarget(client). Иначе лучше использовать
%T и индекс клиента в качестве параметра для форматирования
char attackerName[32],
GetClientName(attacker, attackerName, 31);
Почему именно
32 и
31? Дефайн
MAX_NAME_LENGTH имеет значение
128 для поддержки КСГО. Раньше, в более старых версиях SM он имел значение
64.
switch(iPunishMent)
{
case 0: punishment = "warn";
case 1: punishment = "slay";
case 2: punishment = "burn";
case 3: punishment = "freeze";
case 4: punishment = "beacon";
case 5: punishment = "freezebomb";
case 6: punishment = "firebomb";
case 7: punishment = "timebomb";
case 8: punishment = "drug";
case 9: punishment = "removecash";
case 10: punishment = "slap";
case 11: punishment = "Chicken";
default: punishment = "warn";
}
Я бы просто заюзал текстовый массив с предварительной проверкой индекса, чтобы не было выхода за границы этого массива.
Да и в качестве параметра для функции PunishHandler() параметр в виде
int был бы лучше, чем в виде
char: занимает меньше места, дешевле и быстрее в обработки значений (
switch вместо strcmp).
char sWeaponName[16];
GetEntityClassname(weapon, sWeaponName, 16);
if(strncmp(sWeaponName, "weapon_", 7) == 0)
А не проще было сделать размер массива равным
8 и использовать
strcmp? Ведь тогда текст сразу обрежется до 7 символов.
RemovGrenad почему не
RemoveGrenade? Кто-то с инглишем совсем не дружит? =)
Да и отбирать было бы проще по слоту или через оффсет для патронов.
public Action Undrug(Handle timer, any client)
{
if(client > 0 && IsClientInGame(client))
{
char clientName[32];
GetClientName(client, clientName, 31);
ServerCommand("sm_undrug \"%s\"", clientName);
}
return Plugin_Handled;
}
А нафига здесь нужно имя игрока? Лучше же его
userid использовать в таких дефолтных командах SM.
Функция
DoChat()