Посмотрел код немного: чистить нужно много.
Как я понял ты создаёшь теслу, но не удаляешь. Привет падения сервера при частых прыжках на картах с большим количеством энтити:
lifetime_min и
lifetime_max задают время жизни разрядов, но не этой энтити.
Вместо велосипеда
GetClient() можно было задействовать родную функцию
SM FindTarget()
menu.SetTitle() поддерживает форматирование и для этого не нужно использовать
Format() перед вызовом этой функции.
Кроме того имеет смысл использовать
FormatEx(), если в качестве параметров не используется целевая строка. Будет чуть быстрее
В
menu.AddItem() не нужно указывать флаг
ITEMDRAW_DEFAULT, потому что это дефолтное значение этого параметра у функции.
Если используешь переводы с помощью
%t через
Format() или
FormatEx(), то нужно предварительно вызвать
SetGlobalTransTarget() с индексом игрока, которому адресуется перевод, в качестве параметра.
[SourcePawn] Урок 4 - Форматирование текста и мультиязычность
hlmod.ru
При объявлении переменных не нужно им присваивать значение (
bool - false, int - 0, float - 0.0, Handle - INVALID_HANDLE или null), т.к. SP - не плюсы и в SM1.8+ компилятор сам подставляет эти дефолтные значения при создании переменной.
Ещё плагин заточен сугубо под КСГО (переводы использует цвета КСГО, большая часть которых отсутствует в других играх), хотя должен работать везде, где работает
sdktools.
И вообще цвета нужно было как минимум вынести из кода в переводы (
"Prefix" поменять с "[Teleport]" на "{BLUE}[Teleport] {DEFAULT}").
Ну а вот это это вообще смехота:
g_b* = view_as<bool>(GetConVarInt(cvar));
Есть же
GetConVarBool()
Ну и для чего делать
Format(szPathEffect1, sizeof(szPathEffect1), "particle/smokestack.vmt"); при старте плагина, когда можно сделать эту строку константой?
Кроме того менюшки можно создать раз при старте плагина, а потом просто при отправке игроку поправлять перевод под адресата через
MenuAction_Display (
название меню) и
MenuAction_DisplayItem (
пункты меню).
Главное добавить их в параметры меню при его создании.