1.Код:
static satchel_trail, grenade_trail, snark_trail, bolt_trail
Код:
new g_satchel_trail, g_grenade_trail, g_snark_trail, g_bolt_trail
Абсолютно ничем не различаются, т.к. объявление происходит на уровне файла (не в функции). Поэтому лучше использовать обычное "new".
Q: Что такое "static"?
A: Это глобальная переменная (т.е. время её жизни равняется времени жизни плагина), но имеющая область видимости равную блоку в котором она объявлена.
Примеры:
Код:
new g_i1; // Глобальная переменная: время жизни = время жизни плагина; область видимости = весь файл.
static g_i2; // Глобальная переменная: время жизни = время жизни плагина; область видимости = весь файл.
Function()
{
new i1; // Локальная переменная:
// время жизни = время исполнения функции (создается каждый раз при входе в функцию);
// область видимости = функция Function.
static i2; // Локальная переменная:
// время жизни = время жизни плагина (создается один раз раз при старте плагина);
// область видимости = функция Function.
}
Т.е. разница, в том, что static создается один раз, а new каждый раз при входе в блок. И надо выбирать по критерию: иcпользуемая память / нагрузка на процессор от частоты создания. Если переменная часто используется (функция часто вызывается), то имеет смысл объявить её static.
Второе различие, вытекающее из разового создания: значение переменной сохраняется между вызовами функции. Т.е. по сути получается глобальная переменная с локальной областью видимости.
Имеет смысл изменить объявление
Код:
new classname[32], sprite, lifetime, skip
на
Код:
static classname[32], sprite, lifetime, skip
так как функция обработчик spawn будет использоваться часто.
2.У каждой функции есть значение возврата по умолчанию - 0. Т.е. если не написать
Код:
return <value>;
или написать просто
Код:
return;
, то функция вернет ноль.
Если посмотреть инклюдники, то увидим:
Код:
#define PLUGIN_CONTINUE 0 /* Results returned by public functions */
Т.е. возврат равнозначен возвращению 0, использованию return без значения, или просто опусканию оператора return.
Код:
/**
* Ham return types.
* -
* Return these from hooks to disable calling the target function.
* Numbers match up with fakemeta's FMRES_* for clarity. They are interchangable.
* 0 (or no return) is also interpretted as HAM_IGNORED.
*/
#define HAM_IGNORED 1 /**< Calls target function, returns normal value */
Тоже самое и в случае Ham Sandwich. В его случае и 0 и 1 равнозначны. Т.е. их можно не писать.
Код:
public plugin_init()
{
...
return PLUGIN_CONTINUE
}
Тут Корд развоевался просто.
Q: Бывают ли случаи когда надо в конце функции писать "return PLUGIN_CONTINUE"?
A: Ага:
Код:
public Function(id)
{
if (id == 1)
return PLUGIN_HANDLED;
client_print(id, print_chat, "Your Id = %i", id);
return PLUGIN_CONTINUE;
}
Если не написать в конце return со значением, то АМХХ не даст скомпилять плагин.
3.Код:
#define trails_cvar get_cvar_num("amx_HL_trails")
register_cvar("amx_HL_trails", "1")
if(trails_cvar) {trails(ent);}
В данном случае использовался доступ с получением адреса квара по названию квара (операции со списками строк в движке).
Код:
new g_cvarTrails;
g_cvarTrails = register_cvar("amx_HL_trails", "1")
if(get_pcvar_num(g_cvarTrails))
В этом случае, при регистрации квара, получается адрес значения квара в памяти, и, в последуещем, неспоредственное получение значения по адресу - в разы быстрее. Почитай про pcvars.
4.Не понял что там работает и что нет. По коду, вроде бы, нет разницы между твоей и версией Корда.
Насчет размера плагина: лучше сохранять легко читаемое форматирование, чем экономить символы. Я ведь могу этот плагин ужать в 1 кб, но читать его будет, мягко говоря, нелегко. хД
PS А, и забыл: я же не Корд, но, вобщем, удалять уж не буду...