PDA

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



denis01
27.05.2014, 16:10
Ув. пользователи как написать функцию:

new PlayerLogged[MAX_PLAYERS char];
что бы в дальнейшом использовать эту функцию, для проверки подлключён ли игрок либо нет

L0ndl3m
27.05.2014, 16:13
Что Вам мешает использовать стандартную функцию IsPlayerConnected? А если использовать массив то в OnPlayerConnect:

PlayerConnected{playerid} = 1; // у Вас PlayerLogged (Logged же проверка на логин)
а в OnPlayerDisconnect:

PlayerConnected{playerid} = 0;

denis01
27.05.2014, 16:44
Что Вам мешает использовать стандартную функцию IsPlayerConnected? А если использовать массив то в OnPlayerConnect:

PlayerConnected{playerid} = 1; // у Вас PlayerLogged (Logged же проверка на логин)
а в OnPlayerDisconnect:

PlayerConnected{playerid} = 0;
А что по вашему мнению лючше использовать?

L0ndl3m
27.05.2014, 16:50
IsPlayerConnected быстрее чем массив, а если с массивом, то память используется.

DeimoS
27.05.2014, 16:54
А что по вашему мнению лючше использовать?

Зависит от нужды. Если вам нужно проверять именно ПОДКЛЮЧЕНИЕ к серверу - лучше воспользоваться функцией. Если же вам нужно проверять авторизацию игрока, лучше сделать так:

new authorized_account[MAX_PLAYERS char];
В функцию, отвечающую за загрузку аккаунта при авторизации

authorized_account{playerid} = 1;
В OnPlayerDisconect

authorized_account{playerid} = 0;
И для удобства можно создать функцию, типа

stock IsPlayerLogged(playerid) return authorized_account{playerid};
//Это если с английским плохо. Я бы использовал код "authorized_account{playerid}" напрямую

denis01
27.05.2014, 16:57
Я использую для проверки авторизован ли игрок, если нет то он не может водить команды

Amfy
27.05.2014, 19:22
Зачем char? Можно ведь использовать переменную типа bool



new bool:login[MAX_PLAYERS];

login[playerid] = true;// Игрок авторизован
login[playerid] = false;// Игрок не авторизован

if(login[playerid])// Игрок авторизован
if(!login[playerid])// Игрок не авторизован

denis01
27.05.2014, 19:49
Можешь по подробней.

login[playerid] = true;// это в OnPlayerConnect
login[playerid] = false;// это вOnPlayerDisconnect
И далее использовать в командах

if(login[playerid])// Игрок авторизован
if(!login[playerid])// Игрок не авторизован

Amfy
27.05.2014, 20:01
Это ставь когда игрок успешно авторизовался.

login[playerid] = true;
Это ставь когда игрок вышел с сервера.

login[playerid] = false;

А, если используешь public OnPlayerCommandText, то просто в начало паблика вставь

if(!login[playerid])) return SendClientMessage(playerid,-1,"Авторизуйтесь на сервере!");

L0ndl3m
27.05.2014, 20:07
Зачем char? Можно ведь использовать переменную типа bool



new bool:login[MAX_PLAYERS];

login[playerid] = true;// Игрок авторизован
login[playerid] = false;// Игрок не авторизован

if(login[playerid])// Игрок авторизован
if(!login[playerid])// Игрок не авторизован


Может наоборот? Типа bool в pawn нет (то есть он есть, но он берёт столько же памяти сколько и обычная переменная с типом integer). А char сокращает размер массива в (cellbits / charbits) раз (на данный момент 4). И установить значение ячейкам этого массива можно только от 0 до 255.

DeimoS
28.05.2014, 12:49
Я использую для проверки авторизован ли игрок, если нет то он не может водить команды

Тогда мой код подойдёт вам чуть больше, чем полностью. Просто в командах используйте проверку, типа

if(!IsPlayerLogged(playerid)) return SendClientMessage(playerid, 0xFF0000FF, "Ошибка: {FFFFFF}Вы не авторизированы");
и всё



Зачем char? Можно ведь использовать переменную типа bool



new bool:login[MAX_PLAYERS];

login[playerid] = true;// Игрок авторизован
login[playerid] = false;// Игрок не авторизован

if(login[playerid])// Игрок авторизован
if(!login[playerid])// Игрок не авторизован


bool в Pawn занимает столько же, сколько и обычная переменная (4 байта). Под char же выделяется всего 1 байт, а 1 байт может принимать одно из 256 значений (28, то бишь от 0 до 255). О байте можно почитать тут (http://ru.wikipedia.org/wiki/%D0%91%D0%B0%D0%B9%D1%82). И прописывая

new authorized_account[MAX_PLAYERS char];
мы выделяем не 2000 байт, а 500 (MAX_PLAYERS по стандарту имеет значение "500" и если работать с массивом как с ячейками - каждая ячейка будет равна 4 байта => 500*4 = 2000. С char же выделяется 1 байт, о чём я сказал выше).

P.S. И сразу поясню для тех, кто побежит сейчас "оптимизировать" массивы. С char нужно работать с умом. Не везде можно использовать данный тип переменной. Например в таком случае%

enum ololo {}
new ololo_ololo[MAX_PLAYERS char][ololo];
толку от char не будет, ибо MAX_PLAYERS тут работает совсем по иному принципу. В общем, изучите сначала по подробнее вопрос, иначе размер вашего amx может вырасти раза в 2