Задачу можно решить многими способами, но нужно уметь:
Код
- Укорачивать и оптимизировать код
- Не использовать лишнее (например, зачем создавать переменную, если она может не понадобиться)
- Не использовать часто одинаковый код (создавайте функции)
- Не злоупотреблять такими циклами, как OnGameFrame, OnPlayerRunCmd (даже избегать их)
- Не создавать "утечку памяти" (закрывать все ненужные Handle и т.д.)
- Понимать порядок выполнения команд и событий
- Делать нужные проверки (например, перед выдачей оружия игроку: он точно на сервере? жив? и т.д.)
- Не делать ненужные/лишние/повторные проверки в условиях
- Указывать массивам правильный размер (не создавать много лишних ячеек)
- И др.. (скажите, если я что-то упустил)
Если вы не уверены в коде или сомневаетесь, как что-то лучше сделать, можете писать в этой теме.
Некоторые Советы:
Код
// Так делать глупо:
if (GetClientTeam(client) == 2) ...
else if (GetClientTeam(client) == 3) ...
// Зачем повторно получать команду игрока, если мы уже сделали это?
// Сохраните её в переменной и уже с ней работайте:
new team = GetClientTeam(client);
if (team == 2) ...
else if (team == 3) ...
// Если вам нужно сделать только одно сравнение, то создавать переменную нет смысла:
if (GetClientTeam(client) == 2) ...
На счет массивов:
Если вы создаёте массив внутри функции и пока не знаете, что в нём будет, то используйте приставку decl, а не new, тем более если это делается в циклах. Приставка decl лишь готовит переменную, которая пока что содержит хлам, т.к. в ней нет никакого значения. Если вы попробуете вывести значение такой переменной, например, в PrintToServer, то сервер может рухнуть - нужно быть уверенным, что в ней есть значение.
На счет строк:
Код
// Готовим переменную для хранения строки
decl String:name[45];
// Вот так можно обезопасить строку.
// Это полезно, если хотим работать с переменной, но не уверены, есть ли в ней значение.
name[0] = '\0';
// Команда для примера:
GetEntPropString(index, Prop_Data, "m_iName", name, 45);
// И ниже уже можно работать с этой переменной, не беспокоясь
if (name[0] == '\0') .. // строка пустая
На счет if и else if:
Код
new x = 5;
// так плохо:
if (x == 2)
{
// код
}
if (x == 5)
{
// код
}
// так хорошо:
if (x == 2)
{
// код
}
else if (x == 5)
{
// код
}
else if (x == 7)
{
// код
}
else
{
// код
}
Если вы используете цикл for, while и тд, то:
- если ипользуете переменные внутри цикла, то объявляйте их перед циклом, а не внутри
- обрывайте цикл с помощью команд break, return, если он уже не нужен
Код
public OnGameFrame()
{
static x = 0;
PrintToServer("%d", ++x);
}
Событие вызывается 66 раз в сек или 33/100 - зависит от tickrate.