Pawn :: Основы скриптинга
Использование PVar.
Pvar (Per-player variables) - система персональных переменных.
Изначально SA-MP был создан для максимум 100 игроков. Это значит, что создание массивов в PAWN размером MAX_PLAYERS, например, PlayerInfo[MAX_PLAYERS], в общем было вполне нормально.
Теперь же MAX_PLAYERS равняется 500, а скриптеры создают массивы из 500 элементов лишь для хранения одиночных флагов.
Это может оказаться очень затратно в плане потребления памяти. Кроме того, обычные переменные нужно вручную
сбрасывать/обнулять, когда игрок покидает сервер.
Преимущества использования PVar'ов над массивами размером в MAX_PLAYERS:
- PVar'ы доступны из всех загруженных гейммодов и скриптов, упрощая модуляризацию вашего кода.
- PVar'ы автоматически удаляются, когда игрок выходит с сервера, что означает вам не нужно вручную сбрасывать переменные для следующего подключившегося игрока.
- Больше нет нужды в сложных enum/playerInfo-структурах.
- Экономит память, не расходуя ее на элементы под playerid'ы, которые, возможно, вообще никогда не будут использованы.
- Вы можете легко перечислять и выводить/хранить список PVar'ов. Это упрощает как отладку, так и хранение информации об игроках.
- Если даже PVar не был создан, при запросе его значения возвращается 0 по умолчанию.
- PVar'ы могут хранить очень большие строки используя динамически выделяемую память.
PVar`ы могут быть также нескольких типов. Вот небольшое описание функций.
SetPVarInt(playerid, varname[], int_value); - устанавливает значение для целого PVar`а
GetPVarInt(playerid, varname[]); - возвращает значение целого PVar`а
SetPVarString(playerid, varname[], string_value[]); - устанавливает значение строкового PVar`а
GetPVarString(playerid, varname[], string_return[], len); - копирует значение строкового PVar`а в string_return
SetPVarFloat(playerid, varname[], Float:float_value); - устанавливает значение вещественного PVar`а
Float:GetPVarFloat(playerid, varname[]); - возвращает значение вещественного PVar`а
DeletePVar(playerid, varname[]); - удаляет PVar
И соответственно константы типов PVar`ов:
#define PLAYER_VARTYPE_NONE 0 //неизвестно
#define PLAYER_VARTYPE_INT 1 //целое число
#define PLAYER_VARTYPE_STRING 2 //строка
#define PLAYER_VARTYPE_FLOAT 3 //вещественное число
Эти константы нужны для проверок функции GetPVarType, которая возвращает тип указанного PVar`а. Ниже приведены функциии
native GetPVarsUpperIndex(playerid); - узнает максимальный индекс PVar`а для игрока
native GetPVarNameAtIndex(playerid, index, ret_varname[], ret_len); - узнает название PVar`а по его индексу (внутреннему номеру)
native GetPVarType(playerid, varname[]); - возвращает тип указанного PVar`а
Итак, рассмотрим пример использование PVar`а на команде. Этой команде мы сделаем ограничение на время перед ее повторным использованием. Сделаем мы этот таким способом, чтобы избежать использование таймера.
Нижеприведенная строка создает инициализированную персональную переменную rtime. Эту строку мы добавляем в тело команды.
1 SetPVarInt(playerid,"rtime",gettime()+10); //rtime - переменная которая будет проверятся позже, 10 - кол-во секунд.
Над этой строчкой в самое начало команды мы ставим следующую проверку.
if(GetPVarInt(playerid,"rtime") > gettime())
{
SendClientMessage(playerid, -1, "Вы уже использовали эту команду, ждите 10 секунд.");
return 1;
}
Таким образом мы смогли без таймера, организовать задержку перед повторным использованием команды, заодно научились использовать Pvar.
if(strcmp(cmdtext, "/command", true) == 0)
{
if(GetPVarInt(playerid"rtime") > gettime())
{
SendClientMessage(playerid, -1, "Вы уже использовали эту команду, ждите 10 секунд.");
return 1;
}
SendClientMessage(playerid, -1, "Команда использована.");
SetPVarInt(playerid, "rtime",gettime()+10);
return 1;
}
|
|
|