PDA

Просмотр полной версии : [Вопрос] Несколько вопросов (AFK, авторизация)



PawnoNoob
18.04.2016, 23:43
Здравствуйте. :victory: Не так давно я создавал тему с интересующими меня вопросами по программированию, за развёрнутые ответы я очень благодарен Вашему модератору с ником Deimos (http://pro-pawn.ru/member.php?2548-DeimoS). В той теме я задавал вопросы о проблемах или по функциям, с которыми мне пришлось столкнуться по мере написания кода. Так вот, сейчас у меня появилось ещё два вопроса, которые касаются системы AFK и системы авторизации.
1. Система AFK.
Будет ли нормальной следующая система AFK (вроде как работает на сервере):
- В enum с информацией об игроке добавил следующее:

pAFK,
- В OnPlayerUpdate вставил следующее:

pinfo[playerid][pAFK] = 0;
- В таймер обновления аккаунта (он же сток, который вызывается таймером (вроде так сказал :blush2:)) добавил следующий код:

if(pinfo[i][pAFK] >= 3)
{
format(string, sizeof(string), "AFK: %s", TimeConvert(pinfo[i][pAFK));
SetPlayerChatBubble(i, string, здесь цвет, 10.0, 3000);
pinfo[i][pAFK] ++;
И сам TimeConvert, который я нашёл в интернете:

stock TimeConvert(time)
{
new hour = 0, minute = 0, second = 0, string[30];
hour = floatround(time/3600);
minute = floatround((time/60) - (hour*60));
second = floatround(time - ((hour*3600) + (minute*60)));
if(hour > 0)
{
format(string, sizeof(string), "%d:%02d:%02d", hour, minute, second);
}
else
{
format(string, sizeof(string), "%d:%02d", minute, second);
}
return string;
}
На сервере всё это "дело" работает, но вдруг я где-то допустил ошибку или где-то не вставил что-то.
P.S. В сток обнуления информации об игроке после выхода из игры также добавил это.
2. Система авторизации и регистрации.
Когда вы заходите на сервер, вводите свои данные, то Вам предлагает выбрать внешность своему персонажу. Если вы выходите из игры во время выбора внешности, то при следующем входе у вас будет скин с 0 id, то есть CJ. Как можно исправить данную проблему?
Я пробовал сделать следующее:
В OnPlayerSpawn вставлял

if(!pinfo[playerid][skin]
{
//здесь сток выбора скина
}
но... но... это не совсем помогало (из-за SetSpawnInfo при авторизации, чтобы убрать кнопочки Spawn, >> и <<), потому что когда вылазило окошко регистрации и авторизации, меня сразу перекидывало в интерьер выбора внешности.
!Будет ли правильным решением вставить в базу данных id скина по умолчанию, вместо 0, чтобы избежать данной проблемы? Или как-то изменить SetSpawnInfo? Потому что скин в SetSpawnInfo выбирается из базы данных :)

TheMallard
19.04.2016, 04:29
при регистрации запиши переменную статуса регистрации (0 не выбрал, 1 выбрал) например в pReg. Она будет в значении 0. После выбора скина ставь 1. При логине сверяешь, если 0 - отправляется в раздевалку, если 1 - отправляется в игру.

DeimoS
19.04.2016, 07:52
Ну если код выглядит так:

if(pinfo[i][pAFK] >= 3)
{
format(string, sizeof(string), "AFK: %s", TimeConvert(pinfo[i][pAFK));
SetPlayerChatBubble(i, string, здесь цвет, 10.0, 3000);
pinfo[i][pAFK] ++;
То он не будет работать, ибо прибавление единицы к pAFK должно находится за условием if(pinfo[i][pAFK] >= 3). То бишь

if(pinfo[i][pAFK] >= 3)
{
format(string, sizeof(string), "AFK: %s", TimeConvert(pinfo[i][pAFK));
SetPlayerChatBubble(i, string, здесь цвет, 10.0, 3000);
}
pinfo[i][pAFK] ++;
Хотя, думаю, это просто опечатка, но лучше перестрахуюсь :)
В остальном система нормальная.

Ну а по поводу второго вопроса - попробуй использовать ForceClassSelection вместо вызова стока с выбором скина. Тебе надо прогонять все действия, которые ты делаешь при регистрации, только без самой регистрации.

PawnoNoob
19.04.2016, 10:46
Ну если код выглядит так:

if(pinfo[i][pAFK] >= 3)
{
format(string, sizeof(string), "AFK: %s", TimeConvert(pinfo[i][pAFK));
SetPlayerChatBubble(i, string, здесь цвет, 10.0, 3000);
pinfo[i][pAFK] ++;
То он не будет работать, ибо прибавление единицы к pAFK должно находится за условием if(pinfo[i][pAFK] >= 3). То бишь

if(pinfo[i][pAFK] >= 3)
{
format(string, sizeof(string), "AFK: %s", TimeConvert(pinfo[i][pAFK));
SetPlayerChatBubble(i, string, здесь цвет, 10.0, 3000);
}
pinfo[i][pAFK] ++;
Хотя, думаю, это просто опечатка, но лучше перестрахуюсь :)
В остальном система нормальная.

Ну а по поводу второго вопроса - попробуй использовать ForceClassSelection вместо вызова стока с выбором скина. Тебе надо прогонять все действия, которые ты делаешь при регистрации, только без самой регистрации.

Сама система вроде работает, и сеунды идут, потом пишет минуты (1:20 например), но я опечатался немного, забыл посавить скобку, а Вы сделали это за меня :). (я не копирую из своего кода, потому что иногда лень открывать, так как он находится далеко :rofl:, только конверт этот достал из кода)
Вот насчёт самой системы регистрации, вариант с установлением id любого скина не "прокатит"? А вот вариант пользователя TheMallard?:victory:

DeimoS
19.04.2016, 11:50
Сама система вроде работает, и сеунды идут, потом пишет минуты (1:20 например), но я опечатался немного, забыл посавить скобку, а Вы сделали это за меня :). (я не копирую из своего кода, потому что иногда лень открывать, так как он находится далеко :rofl:, только конверт этот достал из кода)
Вот насчёт самой системы регистрации, вариант с установлением id любого скина не "прокатит"? А вот вариант пользователя TheMallard?:victory:

Вариант TheMallard будет работать, но всё равно работоспособность зависит именно от кода регистрации. Да и зачем создавать дополнительную переменную, которая будет показывать, выбрал ли игрок скин или нет, если это и так можно понять по тому, какой скин у игрока сохранён? Ведь при выходе в момент выбора скина сохраняется нулевой ID, как я понимаю. А его у игрока быть не может. Вот от этого и можно отталкиваться, что я и предлагал

PawnoNoob
19.04.2016, 15:03
А вот если я, например, в структуре базы данных (в строке, поле (не знаю, как правильно) :D) установлю по умолчанию, например, 230 id скина (бомж в капюшоне), то нормально ли будет такая система и не будет ли устанавливаться 0 id после выхода при выборе внешности?
Если нет, то как вообще используется ForceClassSelection?:smile:

И сразу задам ещё два вопроса, которые только-только пришли мне в голову. Как я уже говорил, у меня при авторизации и регистрации стоит SetSpawnInfo:

SetSpawnInfo(playerid, 255, пинфо[плеерид][скин], 0, 0, 0, 1.0, -1, -1, -1, -1, -1, -1);
SpawnPlayer(playerid);
И получается так, что он при авторизации/регистрации становится прямо на спавне, координаты которого указаны в OnPlayerSpawn. Нужно ли менять значения позиции X, Y и Z? Или нежелательно?

И ещё один вопрос, который снова же касается format. Одну ячейку для нуль-символа нужно выделять только для string

format(string, sizeof(string)..........
или для всех переменных, которые используются в нём?
Например: в команде /allplayers (!для примера) будет показываться следующая информация: авторизован ли игрок, АФК ли игрок.

new afk[13], auth[22], string[47+MAX_PLAYER_NAME];
foreach(new i: Player)
{
if(p.log[i] == true) auth = "{цвет}Авторизован"; // 8+11 = 19
else auth = "{цвет}Не авторизован"; // 8+14 = 22
if(pinfo[i][afk] >= 3) afk = "{цвет}[afk]"; // 8 + 5 = 13
format(string, sizeof(string), "%s[%i] | %s | %s", pinfo[i][imya], i, auth, afk); // 46 + макс. значение ника + 1 нуль-символ.
sendclientmessage(playerid, string)
}
Команда чисто для примера, никакого смысла она не несёт. Так вот, сами вопросы:
- Для new afk, auth нужно ли добавлять одну ячейку для нуль-символа?
- В string нужно указывать длину afk и auth?

Ещё один вопрос относительно кнопочек Spawn, << и >>. Недавно, просматривая Wiki SA:MP, нашёл такой интересный паблик под названием "OnPlayerRequestSpawn". Можно ли использовать данный паблик, чтобы отключить функционал этих кнопок или чтобы вообще кикнуло при нажатии на эту кнопочку. Или же всё-таки лучше использовать SetSpawnInfo?
SetSpawnInfo у меня вызывает некоторые трудности с написанием одной системы.

И ещё один вопрос, который касается командного процессора. Любой игрок, который зашёл на сервер, мог использовать команды и спокойно делать что-либо, решил я как-то это всё дело поправить. Очень давно сталкивался с такой фишкой, как проверка на авторизацию в каждой команде, но я решил копнуть глубже и наткнулся на сообщение от официального разработчика (Daniel Cortez), а именно паблика OnPlayerReceived. Вставил я туда некоторые значения и теперь команды не работают до того, как игрок не авторизовался, всё ли так я сделал?

if(проверка на авторизацию == false || проверка на АФК >= 3) return 0;

И ещё один вопрос, который касается диалоговых окон. Вот у меня есть система регистрации, авторизации и тому подобные диалоги. Например, если игрок нажимает на клавишу Esc во время авторизации, то его кикает. Нужно ли прописывать return 1; после кика или же нет?

if(!response)
{
k(playerid, "вы были кикнуты"); // для примера.
}
И вот сам "k"

stock k(playerid, text[])
{
SendClientMessage(playerid, red, text);
SetTimerEx("timer", 1000, false, "i", playerid);
return 1;
}

По поводу кодировки в базе данных также появился вопрос. Я не понимаю, в чем отличие между кодировкой, например, cp1251_general_cs, cp1251_general_ci и cp1251_bin. Какую лучше выбрать для базы данных? Раньше я выбирал cp1251_bin, а вот сейчас, если честно, не знаю...