Перейти к содержимому


Фотография

Ошибка при компиляции


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 12

#1 Logical1990

Logical1990

    Новичок

  • Пользователь
  • Pip
  • 6 сообщений

Отправлено 06 Ноябрь 2022 - 21:42

Выдает ошибку при компиляции:

error 161: brackets after variable name indicate a fixed-size array, but a dynamic size was given - did you mean to use 'new int[size]' syntax?

вот код:

stock void BfReadSBitLong(Handle bf,int numBits)
{
	int bits[numBits], ret, i; //вот здесь ошибка
	
    for (i = 0; i < numBits; i++)
    {
        bits[i] = BfReadBool(bf);
    }

    ret = bits[numBits-1] ? -1 : 0;

    for (i = numBits-1; i >= 0; i--)
    {
        ret <<= 1;
        ret |= bits[i];
    }

    return ret;
}

Помогите пожалуйста люди добрые

 


  • KelType и StevMype это нравится

#2 BloodyBlade

BloodyBlade

    Постоянный пользователь

  • Пользователь
  • PipPipPipPipPip
  • 912 сообщений

Отправлено 06 Ноябрь 2022 - 21:50

Выдает ошибку при компиляции:

error 161: brackets after variable name indicate a fixed-size array, but a dynamic size was given - did you mean to use 'new int[size]' syntax?

вот код:

stock void BfReadSBitLong(Handle bf,int numBits)
{
	int bits[numBits], ret, i; //вот здесь ошибка
	
    for (i = 0; i < numBits; i++)
    {
        bits[i] = BfReadBool(bf);
    }

    ret = bits[numBits-1] ? -1 : 0;

    for (i = numBits-1; i >= 0; i--)
    {
        ret <<= 1;
        ret |= bits[i];
    }

    return ret;
}

Помогите пожалуйста люди добрые

Вместо int bits[numBits] поставь int bits[] = new int[numBits]



#3 Logical1990

Logical1990

    Новичок

  • Пользователь
  • Pip
  • 6 сообщений

Отправлено 06 Ноябрь 2022 - 22:09

Вместо int bits[numBits] поставь int bits[] = new int[numBits]

теперь это выдает:
error 142: unexpected array expression
error 088: cannot return a value from a void function

 

stock void BfReadSBitLong(Handle bf,int numBits)
{
	int bits[] = new int[numBits], ret, i;
	
    for (i = 0; i < numBits; i++)
    {
        bits[i] = BfReadBool(bf);
    }

    ret = bits[numBits-1] ? -1 : 0;

    for (i = numBits-1; i >= 0; i--)
    {
        ret <<= 1;
        ret |= bits[i];
    }

    return ret;
}

 


Сообщение отредактировал Logical1990: 06 Ноябрь 2022 - 22:11


#4 valedar

valedar

    Новичок

  • Пользователь
  • Pip
  • 47 сообщений

Отправлено 06 Ноябрь 2022 - 22:16

 

теперь это выдает:
error 142: unexpected array expression
error 088: cannot return a value from a void function

 

stock void BfReadSBitLong(Handle bf,int numBits)
{
	int bits[] = new int[numBits], ret, i;
	
    for (i = 0; i < numBits; i++)
    {
        bits[i] = BfReadBool(bf);
    }

    ret = bits[numBits-1] ? -1 : 0;

    for (i = numBits-1; i >= 0; i--)
    {
        ret <<= 1;
        ret |= bits[i];
    }

    return ret;
}

 

Хм...

 

stock int BfReadSBitLong(Handle bf,int numBits)
{
	int[] bits = new int[numBits];
	
	int ret, i = bits[numBits];
	
    for (i = 0; i < numBits; i++)
    {
        bits[i] = BfReadBool(bf);
    }

    ret = bits[numBits-1] ? -1 : 0;

    for (i = numBits-1; i >= 0; i--)
    {
        ret <<= 1;
        ret |= bits[i];
    }

    return ret;
}

  • Logical1990 это нравится

#5 BloodyBlade

BloodyBlade

    Постоянный пользователь

  • Пользователь
  • PipPipPipPipPip
  • 912 сообщений

Отправлено 06 Ноябрь 2022 - 22:45

 

Хм...

 

stock int BfReadSBitLong(Handle bf,int numBits)
{
	int[] bits = new int[numBits];
	
	int ret, i = bits[numBits];
	
    for (i = 0; i < numBits; i++)
    {
        bits[i] = BfReadBool(bf);
    }

    ret = bits[numBits-1] ? -1 : 0;

    for (i = numBits-1; i >= 0; i--)
    {
        ret <<= 1;
        ret |= bits[i];
    }

    return ret;
}

Логично. void используется только в тех функциях, где нет возврата значения. В функциях с возвратом значения используется int или Action



#6 Logical1990

Logical1990

    Новичок

  • Пользователь
  • Pip
  • 6 сообщений

Отправлено 07 Ноябрь 2022 - 1:20

 

Хм...

 

stock int BfReadSBitLong(Handle bf,int numBits)
{
	int[] bits = new int[numBits];
	
	int ret, i = bits[numBits];
	
    for (i = 0; i < numBits; i++)
    {
        bits[i] = BfReadBool(bf);
    }

    ret = bits[numBits-1] ? -1 : 0;

    for (i = numBits-1; i >= 0; i--)
    {
        ret <<= 1;
        ret |= bits[i];
    }

    return ret;
}

спасибо, теперь компилируется



#7 valedar

valedar

    Новичок

  • Пользователь
  • Pip
  • 47 сообщений

Отправлено 07 Ноябрь 2022 - 10:28

Логично. void используется только в тех функциях, где нет возврата значения. В функциях с возвратом значения используется int или Action

В bool тоже вроде как есть возрат. А вообще по-моему он код взял со смака, точнее с инклюида smac_stocks.inc, так как я тоже когда то компилировал смак. Вообще в смаке очень дряхлый код, не нравится мне он, всё запутано там перемудренно. Говорят lias lite или как там его, античит лучше даже, чем смак.


Сообщение отредактировал valedar: 07 Ноябрь 2022 - 10:30


#8 BloodyBlade

BloodyBlade

    Постоянный пользователь

  • Пользователь
  • PipPipPipPipPip
  • 912 сообщений

Отправлено 07 Ноябрь 2022 - 15:51

В bool тоже вроде как есть возрат.

int возвращает числовое значение.

void просто return;

bool возвращает лишь true и false;

Action возвращает Plugin_Handled или Plugin_Stop или Plugin_Continue.



#9 valedar

valedar

    Новичок

  • Пользователь
  • Pip
  • 47 сообщений

Отправлено 07 Ноябрь 2022 - 17:16

int возвращает числовое значение.

void просто return;

bool возвращает лишь true и false;

Action возвращает Plugin_Handled или Plugin_Stop или Plugin_Continue.

stock bool IsAdmin(int client)
{
	return (GetUserFlagBits(client) & ADMFLAG_ROOT) != 0;
}

Вот пример проверки, является ли клиент админом.
Разве тут bool не возвращает функцию?


Сообщение отредактировал valedar: 07 Ноябрь 2022 - 17:20


#10 BloodyBlade

BloodyBlade

    Постоянный пользователь

  • Пользователь
  • PipPipPipPipPip
  • 912 сообщений

Отправлено 07 Ноябрь 2022 - 17:32

stock bool IsAdmin(int client)
{
	return (GetUserFlagBits(client) & ADMFLAG_ROOT) != 0;
}

Вот пример проверки, является ли клиент админом.
Разве тут bool не возвращает функцию?

 

Она возвращает в данном примере true, если игрок админ и имеет полный доступ, либо, false, если нет



#11 valedar

valedar

    Новичок

  • Пользователь
  • Pip
  • 47 сообщений

Отправлено 08 Ноябрь 2022 - 12:08

Она возвращает в данном примере true, если игрок админ и имеет полный доступ, либо, false, если нет

Понял. Я сам по немногу учю этот язык, изучаю другие исходники, по такими же принципами и делаю. От уроков всяких, честно толку нет, легче самому практиковаться. Я вот на AM вижу много старых плагинов, которые тупо забрасывают, а чинить ошибки ни кто особо не хочет, ну я и практикуюсь, исправляю всякие ошибки, потом по немногу и выкладываю обновлёные плагины.


Сообщение отредактировал valedar: 08 Ноябрь 2022 - 12:09

  • dr_lex и BloodyBlade это нравится

#12 PawnLomaster

PawnLomaster

    Участник

  • Пользователь
  • PipPip
  • 116 сообщений

Отправлено 23 Ноябрь 2022 - 19:55

stock bool IsAdmin(int client)
{
	return (GetUserFlagBits(client) & ADMFLAG_ROOT) != 0;
}

Вот пример проверки, является ли клиент админом.
Разве тут bool не возвращает функцию?

 

Как это работает.
Есть функция (в данном случае IsAdmin). Она должна нам вернуть bool раз уж так решили при её объявлении (возвращаемый тип пишется перед названием функции).
Это значит, мы должны в конце выполнения функции вернуть значение с тем же типом. То есть после "return" должно идти значение с типом bool.

Функции с типом bool отвечают на вопрос "Да" или "Нет"
Что есть bool. Это либо true ("Да"), либо false("Нет").
Частенько пишут сначала проверку if, а по её результатам "return true" или "return false"
Например:

stock bool IsAdmin(int client)
{
    if ((GetUserFlagBits(client) & ADMFLAG_ROOT) != 0)
        return true;
    else
        return false;
}

Но ленивые программисты не хотят писать лишние строки для такой рутины.
Зачем писать лишние if-else, если GetUserFlagBits(client) & ADMFLAG_ROOT) != 0 и так нам вернёт в качестве результата true или false (Оно или 0 или нет)
Поэтому пример выше сокращается до уже известного:

stock bool IsAdmin(int client)
{
    return (GetUserFlagBits(client) & ADMFLAG_ROOT) != 0;
}

Но что если пойти дальше?

Если досконально рассматривать выражение (GetUserFlagBits(client) & ADMFLAG_ROOT) != 0, то что можно заметить?

Что из себя в принципе представляет GetUserFlagBits(client) & ADMFLAG_ROOT?

Там имеется оператор "Побитовое И" (" & "). Он вернёт результат побитового умножения цепочки битов. Прочитали? Забудьте и просто посмотрите, как это работает.

Возьмём два числа. Например, 12 и 5. Это их десятичный вид.

В двоичном виде они выглядят так: 1100 и 101
Мы вправе дописывать нули перед числом (5 и 05 - одно и тоже). С двоичным числами это тоже работает.
Чтобы было легче в будущем понимать магию, сделаем так, чтобы количество цифр в числах было одинаковое: 1100 и 0101

И что теперь? А дальше магия.

Запишем их в столбик

1100

0101

 

А теперь каждый столбик отдельно перемножим (буквально).
 

    1        1        0        0

 x         x        x         x

    0        1        0        1

    ---------------------------

    0        1        0        0

 

Получилось число 0100. Вернём обратно в десятичный вид и получим... Число 5.

Но это лишь проекция логической операции "побитового И" на привычную нам математическую операцию умножения. Заумно? Согласен.
Давайте по-простому. Уберём всю эту математику и получим:
"Если хоть где-то 0, то и результат 0, иначе 1". Проще и лаконичнее.

И как это вообще связано с функциями и bool'ами?

Сейчас покажу.

GetUserFlagBits(client) & ADMFLAG_ROOT делает всё абсолютно то же самое. Просто ADMFLAG_ROOT - заготовленное число (константа), а GetUserFlagBits(client) - число, которое вернёт нам функция GetUserFlagBits (слово Bits в её названии намекает на "двоичное" назначение данного числа)

ADMFLAG_ROOT - число известное. Оно записано в коде SourceMod и равно 1<<14 (это побитовое смещение, но мы - люди простые, и можем это прочитать как "дописать 14 нулей перед двоичным значением числа 1"). Выглядит это примерно так 0100 0000 0000 0000 (часто запись идёт четверками).
GetUserFlagBits вернет нам "Побитовое ИЛИ" (" | ") всех флагов игрока. (замените умножение на сложение, а там если хоть где-то 1, то и результат 1, иначе 0 (1100+0101=1101).

 

Если у игрока прав нет, то GetUserFlagBits вернёт 0. А как мы теперь знаем, если где-то 0, то и результат 0.

Если у игрока права есть, например ADMFLAG_BAN и ADMFLAG_KICK, то функция нам вернёт (1<<2) | (1<<3) или 0100 | 1000. Что в итоге будет 1100.

А дальше это маленькое 1100 побитово перемножается с огромным 0100 0000 0000 0000.
И что получится?

0. Получится ноль. Но что это значит для нас? Это значит, что игрок не принадлежит к ADMFLAG_ROOT, то есть он не Root админ.
 

А если бы набор был бы, например, из ADMFLAG_BAN, ADMFLAG_KICK и ADMFLAG_ROOT?

(ADMFLAG_BAN | ADMFLAG_KICK | ADMFLAG_ROOT) & ADMFLAG_ROOT = ...

 

... = ADMFLAG_ROOT

Вот так вот неожиданно. Или ожиданно?
Хранение админских флагов в SourceMod устроено так, чтобы каждая отдельная единица в двоичной записи числа отвечала за свой флаг.

 

Ну, а что же мы по итогу, то имеем?

GetUserFlagBits(client) & ADMFLAG_ROOT вернёт нам либо 0, либо число, равное ADMFLAG_ROOT

 

Признаюсь честно, такой записи я никогда не встречал, но она будет работать, как задумано)

stock bool IsAdmin(int client)
{
    return GetUserFlagBits(client) & ADMFLAG_ROOT == ADMFLAG_ROOT;
}

Но что если, нам нужно указать принадлежность не к конкретному админу к одному из определенного списка. Далеко уходить не будем: ADMFLAG_BAN, ADMFLAG_KICK и ADMFLAG_ROOT.

Сделать так?

//Ради Бога, не используйте это (как и всё предыдущее)
stock bool IsAdmin(int client)
{
    return GetUserFlagBits(client) & (ADMFLAG_BAN|ADMFLAG_KICK|ADMFLAG_ROOT) == (ADMFLAG_BAN|ADMFLAG_KICK|ADMFLAG_ROOT);
}

И... Это работать не будет (в отличие от всего предыдущего), так как никто не гарантирует, что у игрока будут сразу 3 этих флага. Но по итогу это всё равно будет каким-то числом, отличным от 0, если хоть один из этих флагов есть.

 

Вы всё ещё здесь? Чудо. Не меньше. Тем не менее...

Вернёмся в самое начало.
Функции с типом bool отвечают на вопрос "Да" или "Нет"
Мы поняли, что если у игрока нет нужных флагов, то GetUserFlagBits(client) & (Нужный_Флаг1|Нужный_Флаг2) вернёт 0.
И поняли, что если нужный флаг есть, то вернётся не 0.
Соединяем эти 3 факта и получим:

stock bool IsAdmin(int client)
{
    return (GetUserFlagBits(client) & ADMFLAG_ROOT) != 0;
}

Вопрос о том, как вообще получилось это выражение, не поднимался, но вот на него ответ)

Но есть ещё одна хитрость. Преобразование типов.

В данном случае у нас есть целое число, но нужно булево значение.
true и false, часто интерпретируют как целые числа "1" и "0" (выше можно понять почему). 
А вот наоборот "0" - это false, а любое другое число - это true.
Но как сказать компилятору, что нужно преобразовать тип и значение?
Есть 2 способа. Обернуть нужное значение в конструкцию view_as<bool>(GetUserFlagBits(client) & ADMFLAG_ROOT), что считается явным (explicit) преобразованием
Или... Не говорить ничего.
Серьёзно. Ничего.

Это считается неявным (implicit) преобразованием.
То есть компилятор сам додумается преобразовать int в bool, когда это надо. Хочу заметить, что Sourcepawn очень редко таким промышляет, а вот тот же JavaScript этим живёт, откуда и родилась куча мемов про это

Скрытый текст

 

Так к чему во-о-о-бще всё, что тут было?
А к тому, что ту функцию можно сократить до

stock bool IsAdmin(int client)
{
	return GetUserFlagBits(client) & ADMFLAG_ROOT;
}

Если нужно проверить, что игрок принадлежит к одному из типов админов (в моем примере это были ADMFLAG_BAN, ADMFLAG_KICK и ADMFLAG_ROOT), то это будет выглядеть так:

stock bool IsAdmin(int client)
{
	return GetUserFlagBits(client) & (ADMFLAG_BAN|ADMFLAG_KICK|ADMFLAG_ROOT);
} 

А если нужно проверить, что игрок в принципе админ (что вообще и должно проверяться, судя по названию функции), то:

stock bool IsAdmin(int client)
{
	return GetUserFlagBits(client);
} 

Да. Это действительно то, к чему всё велось.
Теперь понимаете почему учебники такие толстые?

Топ 10 способов расписать статью из ничего. Рекомендую.


Сообщение отредактировал PawnLomaster: 23 Ноябрь 2022 - 20:18

  • valedar это нравится

#13 valedar

valedar

    Новичок

  • Пользователь
  • Pip
  • 47 сообщений

Отправлено 28 Ноябрь 2022 - 11:37

Как это работает.
Есть функция (в данном случае IsAdmin). Она должна нам вернуть bool раз уж так решили при её объявлении (возвращаемый тип пишется перед названием функции).
Это значит, мы должны в конце выполнения функции вернуть значение с тем же типом. То есть после "return" должно идти значение с типом bool.

Функции с типом bool отвечают на вопрос "Да" или "Нет"
Что есть bool. Это либо true ("Да"), либо false("Нет").
Частенько пишут сначала проверку if, а по её результатам "return true" или "return false"
Например:

stock bool IsAdmin(int client)
{
    if ((GetUserFlagBits(client) & ADMFLAG_ROOT) != 0)
        return true;
    else
        return false;
}

Но ленивые программисты не хотят писать лишние строки для такой рутины.
Зачем писать лишние if-else, если GetUserFlagBits(client) & ADMFLAG_ROOT) != 0 и так нам вернёт в качестве результата true или false (Оно или 0 или нет)
Поэтому пример выше сокращается до уже известного:

stock bool IsAdmin(int client)
{
    return (GetUserFlagBits(client) & ADMFLAG_ROOT) != 0;
}

Но что если пойти дальше?

Если досконально рассматривать выражение (GetUserFlagBits(client) & ADMFLAG_ROOT) != 0, то что можно заметить?

Что из себя в принципе представляет GetUserFlagBits(client) & ADMFLAG_ROOT?

Там имеется оператор "Побитовое И" (" & "). Он вернёт результат побитового умножения цепочки битов. Прочитали? Забудьте и просто посмотрите, как это работает.

Возьмём два числа. Например, 12 и 5. Это их десятичный вид.

В двоичном виде они выглядят так: 1100 и 101
Мы вправе дописывать нули перед числом (5 и 05 - одно и тоже). С двоичным числами это тоже работает.
Чтобы было легче в будущем понимать магию, сделаем так, чтобы количество цифр в числах было одинаковое: 1100 и 0101

И что теперь? А дальше магия.

Запишем их в столбик

1100

0101

 

А теперь каждый столбик отдельно перемножим (буквально).
 

    1        1        0        0

 x         x        x         x

    0        1        0        1

    ---------------------------

    0        1        0        0

 

Получилось число 0100. Вернём обратно в десятичный вид и получим... Число 5.

Но это лишь проекция логической операции "побитового И" на привычную нам математическую операцию умножения. Заумно? Согласен.
Давайте по-простому. Уберём всю эту математику и получим:
"Если хоть где-то 0, то и результат 0, иначе 1". Проще и лаконичнее.

И как это вообще связано с функциями и bool'ами?

Сейчас покажу.

GetUserFlagBits(client) & ADMFLAG_ROOT делает всё абсолютно то же самое. Просто ADMFLAG_ROOT - заготовленное число (константа), а GetUserFlagBits(client) - число, которое вернёт нам функция GetUserFlagBits (слово Bits в её названии намекает на "двоичное" назначение данного числа)

ADMFLAG_ROOT - число известное. Оно записано в коде SourceMod и равно 1<<14 (это побитовое смещение, но мы - люди простые, и можем это прочитать как "дописать 14 нулей перед двоичным значением числа 1"). Выглядит это примерно так 0100 0000 0000 0000 (часто запись идёт четверками).
GetUserFlagBits вернет нам "Побитовое ИЛИ" (" | ") всех флагов игрока. (замените умножение на сложение, а там если хоть где-то 1, то и результат 1, иначе 0 (1100+0101=1101).

 

Если у игрока прав нет, то GetUserFlagBits вернёт 0. А как мы теперь знаем, если где-то 0, то и результат 0.

Если у игрока права есть, например ADMFLAG_BAN и ADMFLAG_KICK, то функция нам вернёт (1<<2) | (1<<3) или 0100 | 1000. Что в итоге будет 1100.

А дальше это маленькое 1100 побитово перемножается с огромным 0100 0000 0000 0000.
И что получится?

0. Получится ноль. Но что это значит для нас? Это значит, что игрок не принадлежит к ADMFLAG_ROOT, то есть он не Root админ.
 

А если бы набор был бы, например, из ADMFLAG_BAN, ADMFLAG_KICK и ADMFLAG_ROOT?

(ADMFLAG_BAN | ADMFLAG_KICK | ADMFLAG_ROOT) & ADMFLAG_ROOT = ...

 

... = ADMFLAG_ROOT

Вот так вот неожиданно. Или ожиданно?
Хранение админских флагов в SourceMod устроено так, чтобы каждая отдельная единица в двоичной записи числа отвечала за свой флаг.

 

Ну, а что же мы по итогу, то имеем?

GetUserFlagBits(client) & ADMFLAG_ROOT вернёт нам либо 0, либо число, равное ADMFLAG_ROOT

 

Признаюсь честно, такой записи я никогда не встречал, но она будет работать, как задумано)

stock bool IsAdmin(int client)
{
    return GetUserFlagBits(client) & ADMFLAG_ROOT == ADMFLAG_ROOT;
}

Но что если, нам нужно указать принадлежность не к конкретному админу к одному из определенного списка. Далеко уходить не будем: ADMFLAG_BAN, ADMFLAG_KICK и ADMFLAG_ROOT.

Сделать так?

//Ради Бога, не используйте это (как и всё предыдущее)
stock bool IsAdmin(int client)
{
    return GetUserFlagBits(client) & (ADMFLAG_BAN|ADMFLAG_KICK|ADMFLAG_ROOT) == (ADMFLAG_BAN|ADMFLAG_KICK|ADMFLAG_ROOT);
}

И... Это работать не будет (в отличие от всего предыдущего), так как никто не гарантирует, что у игрока будут сразу 3 этих флага. Но по итогу это всё равно будет каким-то числом, отличным от 0, если хоть один из этих флагов есть.

 

Вы всё ещё здесь? Чудо. Не меньше. Тем не менее...

Вернёмся в самое начало.
Функции с типом bool отвечают на вопрос "Да" или "Нет"
Мы поняли, что если у игрока нет нужных флагов, то GetUserFlagBits(client) & (Нужный_Флаг1|Нужный_Флаг2) вернёт 0.
И поняли, что если нужный флаг есть, то вернётся не 0.
Соединяем эти 3 факта и получим:

stock bool IsAdmin(int client)
{
    return (GetUserFlagBits(client) & ADMFLAG_ROOT) != 0;
}

Вопрос о том, как вообще получилось это выражение, не поднимался, но вот на него ответ)

Но есть ещё одна хитрость. Преобразование типов.

В данном случае у нас есть целое число, но нужно булево значение.
true и false, часто интерпретируют как целые числа "1" и "0" (выше можно понять почему). 
А вот наоборот "0" - это false, а любое другое число - это true.
Но как сказать компилятору, что нужно преобразовать тип и значение?
Есть 2 способа. Обернуть нужное значение в конструкцию view_as<bool>(GetUserFlagBits(client) & ADMFLAG_ROOT), что считается явным (explicit) преобразованием
Или... Не говорить ничего.
Серьёзно. Ничего.

Это считается неявным (implicit) преобразованием.
То есть компилятор сам додумается преобразовать int в bool, когда это надо. Хочу заметить, что Sourcepawn очень редко таким промышляет, а вот тот же JavaScript этим живёт, откуда и родилась куча мемов про это

Скрытый текст

 

Так к чему во-о-о-бще всё, что тут было?
А к тому, что ту функцию можно сократить до

stock bool IsAdmin(int client)
{
	return GetUserFlagBits(client) & ADMFLAG_ROOT;
}

Если нужно проверить, что игрок принадлежит к одному из типов админов (в моем примере это были ADMFLAG_BAN, ADMFLAG_KICK и ADMFLAG_ROOT), то это будет выглядеть так:

stock bool IsAdmin(int client)
{
	return GetUserFlagBits(client) & (ADMFLAG_BAN|ADMFLAG_KICK|ADMFLAG_ROOT);
} 

А если нужно проверить, что игрок в принципе админ (что вообще и должно проверяться, судя по названию функции), то:

stock bool IsAdmin(int client)
{
	return GetUserFlagBits(client);
} 

Да. Это действительно то, к чему всё велось.
Теперь понимаете почему учебники такие толстые?

Топ 10 способов расписать статью из ничего. Рекомендую.

Вау, это просто шедевр. Остальные учебники рико и тому подобные, просто в сторонке курят. Всё расписано как для профи, так и для у кого в голове вата. По больше было бы таких учебников, вообще шикарно было бы) 


Сообщение отредактировал valedar: 28 Ноябрь 2022 - 11:37



Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных