GetPVarFloat

Материал из Pro-Pawn Wiki
Перейти к: навигация, поиск

Описание:

Узнаёт значение привязанной к игроку переменной вещественного типа.

Параметры:

(playerid, varname[])
playerid ID игрока.
varname[] Название переменной.


Возвращаемое значение:

Вещественное значение переменной при успешном выполнении, либо 0.0, если игрок не подключен или переменной не существует.

Info rhombus.png
Примечание
PVar'ы создаются в момент установки их значения (SetPVarInt(), SetPVarFloat(), SetPVarString()) и удаляются автоматически при отключении игрока (после вызова OnPlayerDisconnect()).
Максимальная длина названия PVar'а - 40 символов (41 с учётом символа конца строки '\0').
Названия PVar'ов не чувствительны к регистру. Например, названия "admin", "ADMIN", "Admin" и "AdMiN" будут обозначать один и тот же PVar.
Всего можно создать до 800 PVar'ов на одного игрока.
В одном PVar'е может быть только одно значение - нельзя хранить 2 или 3 значения разных типов.
Данная функция не подходит для проверки на существование PVar'а: она возвращает 0.0 и для несуществующих переменных, и для переменных, в которых просто было записано нулевое значение. Чтобы однозначно проверить существование PVar'а, используйте функцию GetPVarType() - она вернёт PLAYER_VARTYPE_NONE, если переменной не существует.


Bug.png
Баг SA-MP
Содержимое массива varname не изменяется во время работы функции, однако сам массив объявлен без атрибута const:
native Float:GetPVarFloat(playerid, varname[]);
в то время, как правильный (const-корректный) заголовок функции должен выглядеть так:
native Float:GetPVarFloat(playerid, const varname[]);
Если аргумент-массив объявлен без const, компилятор считает, что функция записывает в него данные, и потому не позволяет передавать в функцию неизменяемые массивы, выдавая ошибку несоответствия типов.
static const stat_health[] = "health";
new Float:health = GetPVarFloat(playerid, stat_health); // error 035: argument type mismatch (argument 2)

Для хранения данных в структуре PVar'а есть 3 отдельных поля: одно для целых чисел, другое для вещественных, третье - для указателя на строковое значение. Эти поля занимают в сумме по 12 байт (каждое по 4 байта), но они никогда не используются одновременно и их можно было изначально объединить в union, чтобы они занимали всего 4 байта. Как результат, из-за расточительства сервером впустую тратится по 8 байт на каждый PVar, что составляет 8 * 800 = 6400 байт (6.25 килобайт) на игрока.


Пример использования:

// В коде гейммода.
SetPVarFloat(playerid, "health", 100.0);

// Где-то ещё (в одном из фильтрскриптов?)
new Float:health;
GetPlayerHealth(playerid, health);
if ((health += 50.0) > 100.0)
    health = 100.0;
SetPlayerHealth(playerid, health);
SendClientMessage(playerid, -1, "Вы использовали аптечку.");


См. также: