PDA

Просмотр полной версии : [Function] CreateBitMask



L0ndl3m
27.07.2014, 07:01
CreateBitMask
Создаёт битовую маску, устанавливая значение флага, одного или нескольких аргументов.

Параметры:

(&bitmask, const bool: ...)

bitmask - переменная, предназначенная для хранения значений флагов
... - аргументы для установки значения флага, которые могут принимать значения: true, если истинное, либо false, если ложное.


Возвращаемые значения: Значение переменной bitmask, после обработки в цикле.

Примечание: Если переменная bitmask ранее содержала в себе истинные значения, они будут перезаписаны на те значения, которые были указаны в аргументах.

Код:


stock CreateBitMask(&bitmask, const bool: ...)
{
new
arg_len = numargs() > 33 ? 33 : numargs(),
arg_count = 1;

do
bitmask |= (getarg(arg_count) << (arg_count) - 1);
while(++arg_count < arg_len);

return bitmask;
}


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

Создадим энумератор, в котором будет содержаться информация о игроке, допустим: подключен ли игрок, заспавнился ли игрок, вошёл ли в аккаунт игрок. Сразу же сместим все значения в энумераторе побитово на 1 влево, так будет удобнее работать с битами:


new
player_flag[MAX_PLAYERS]; // массив для записи значений флагов

enum(<<= 1)
{
PLAYER_FLAG_SPAWNED = 1,
PLAYER_FLAG_LOGGED,
PLAYER_FLAG_CONNECTED
};


Допустим, зашёл игрок на сервер, мы должны его обработать. У нас есть 3 значения ( спавн, логин, подключение ). Так как игрок только подключился, следовательно мы должны сразу же присвоить ему значение подклчения, а вот остальные пока не нужны, в итоге им просто присвоим значение false:


CreateBitMask
(
player_flag[playerid], // первый аргумент должен всегда являться переменной, хранящей данные о флагах
false, // второй аргумент, это аргумент который будет принимать на себя значение - заспавнен ли игрок ( по порядку, см. энумератор )
false, // третий аргумент, это аргумент который будет принимать на себя значение - вошёл ли игрок в аккаунт ( по порядку, см. энумератор )
true, // четвёртый аргумент, это аргумент, который будет принимать на себя значение - подключен ли игрок ( по порядку, см. энумератор )
);


Код без комментариев:

CreateBitMask(player_flag[playerid], false, false, true);

Можно заметить, что второй и третий аргумент принимают значение false, так как они пока не нужны на данный момент, а вот насчёт четвёртого аргумента: он как раз таки принимает отрицательное значение от false, то есть true. Мы его сделали истинным, так как игрок подключился.

Проверить на наличие истинности или ложности одного или другого аргумента, можно так:


printf("Игрок заспавнился: %i\nИгрок вошёл в аккаунт: %i\nИгрок подключен: %i", !!(player_flag[playerid] & PLAYER_FLAG_SPAWNED), !!(player_flag[playerid] & PLAYER_FLAG_LOGGED), !!(player_flag[playerid] & PLAYER_FLAG_CONNECTED));


Если всё нормально получилось, в консоли должно вывести вот такой интересный текст:


Игрок заспавнился: 0
Игрок вошёл в аккаунт: 0
Игрок подключен: 1



Автор: Londlem (http://pro-pawn.ru/member.php?2057-Londlem)

Специально для: Pro-Pawn.Ru (http://pro-pawn.ru)

Копирование данной статьи без разрешения автора запрещено!

wAx
27.07.2014, 09:31
Лондлем хорош ^-^

Пельмень
03.08.2014, 17:59
Для чего ты используешь !! в коде? (: Это-ведь лишние два нопа в выходном asm файле (: А толку от них нет.

L0ndl3m
03.08.2014, 18:34
Для чего ты используешь !! в коде? (: Это-ведь лишние два нопа в выходном asm файле (: А толку от них нет.
Перевод простого числа в булевой тип же. :)
Можно было бы и не использовать оператор '!!', а вместо него поставить оператор '!=', который тоже вернёт истину или ложь.
Кстати, использовал этот оператор, чтобы было чуть понятнее пользователю, допустим 1 это есть флаг, 0 - нет.
Без операторов можно было бы обойтись, но кто не так давно в скриптинге скорее всего не поймёт, что за числа, 16, 32, 64, 128...

Пельмень
03.08.2014, 20:20
Перевод простого числа в булевой тип же. :)
Можно было бы и не использовать оператор '!!', а вместо него поставить оператор '!=', который тоже вернёт истину или ложь.
Кстати, использовал этот оператор, чтобы было чуть понятнее пользователю, допустим 1 это есть флаг, 0 - нет.
Без операторов можно было бы обойтись, но кто не так давно в скриптинге скорее всего не поймёт, что за числа, 16, 32, 64, 128...

В павн ведь нет булевого значения, а если так нужно, то можно сделать bool: вместо !! (:

L0ndl3m
03.08.2014, 20:54
В павн ведь нет булевого значения, а если так нужно, то можно сделать bool: вместо !! (:
Верно, нет. :mosking:
Можно было даже так сделать:

(player_flag[playerid] & PLAYER_FLAG_CONNECTED) != 0 ? ("Игрок подключен") : ("Игрока нет на сервере")
Так ещё удобнее, нежели единицы и нули. :grin: