Вопросы

Взял мод rp (MySQL R39) под основу для дальнейшей разработки. 
Мод имеет:
• Командный процессор ZCMD
• 456 строк

• Система регистрации

• Система авторизации

Но при регистрации и авторизации снизу появляется авторизация обычного DM сервера. В чем проблема? cr-mp-021.png.971c66f17f212808a49e286e2f276974.png

 

Код:

Спойлер

// ================================ [ Инклуды ] ================================

#include <a_samp> // Не удалять,не будет работать мод(Главный инклуд).
#include <a_mysql> // Система базы данных .Версия R39.
#include <streamer> // Не удалять,не запустится мод без этого плагина(Главный инклуд).
#include <sscanf2> // Для вывода информации в консоле (и в самом сервере).А так же,для перевода команд.
#include <regex> // Это плагин(инклуд), который позволяет работать с регулярными выражениями.
#include <zcmd> // Самый Быстрый Командный Процессор,с помощью его пишутся команды(Пример, CMD:menu).

// ================================ [ Дефайны ] ================================



// ======================== [ Дефайны Осн. Настройки ] =========================

#define SERVER_NAME 					"Heavenly RolePlay" // Название сервера (Обычно показывается при входе).
#define SERVER_VERSION 					"HRP(0.1)" // Название мода (Обычно показывается при поиске сервера).
#define SERVER_MAP                      "HRUS" // Название карты (Обычно показывается при поиске сервера).
#define SERVER_WEBSITE 					"" // Тут будет находиться "ссылка" будущего сайта.
#define PAGE_WEBSITE_DONATE             "" // Тут будет находиться "ссылка" будущей страницы доната.
#define SERVER_FORUM                    "" // Тут будет находиться "ссылка" будущего форума.
#define SERVER_GROUP                    "" // Тут указывается ссылка на группу в "Вконтакте".
#define SERVER_FREE_GROUP               "" // Тут указывается ссылка на "свободную" группу в "Вконтакте".

// ============================= [ Дефайны MYSQL ] =============================

#define MYSQL_HOST                "127.0.0.1" // Этот макрос хранит в себе адрес хостинга, где хранится база данных(Заменить на своё).
#define MYSQL_USER                "root" // Этот макрос хранит в себе имя пользователя, у которого имеется доступ к базе данных(Заменить на своё).
#define MYSQL_DATABASE            "hrp" // Этот макрос содержит в себе имя базы данных(Заменить на своё).
#define MYSQL_PASSWORD            "" // Этот макрос хранит в себе пароль, который требуется для подключения к базе данных(Заменить на своё).





// ============================= [ Дефайны диалоги ] ===========================

enum e_DIALOG_IDs // Сам Enum,это оператор для перечисления.А e_PLAYER_INFO это название самого перечисления.
{
    D_NULL,//Автоматически займёт ID 0
    D_REGISTER,//ID 1
    D_LOGIN//ID 2
};

// ============================= [ Дефайны ЦВЕТА ] =============================

#define COLOR_GREY       			   (0xAFAFAFAA)// Цвет сервый
#define COLOR_WHITE 				   (0xFFFFFF00) // Цвет белый

// ===============================[ Переменные ] ===============================

new mysql_connect_ID; // Это целочисленная переменная, в которой мы будем хранить ID подключения для работы большинства функций.
new player_is_authorized[MAX_PLAYERS char]; // Проверка на авторизацию игрока.
new totalstring[1024]; // Не удалять,не будет работать регистрация/авторизация.

// ===============================[ Интерьеры ] ================================

// ===============================[ Пикапы ] ===================================

enum e_PLAYER_INFO // Сам Enum,это оператор для перечисления.А e_PLAYER_INFO это название самого перечисления.
{
    pID, // Первый член перечисления, а по совместительству и ячейка, в которой будет хранится ID аккаунта игрока.
    pName[MAX_PLAYER_NAME], // Второй член перечисления, а по совместительству и ячейка, в которой будет хранится имя аккаунта.
    pPassword[31] // Третий член массива, а по совместительству и ячейка, в которой будет хранится пароль от аккаунта
};
new pInfo[MAX_PLAYERS][e_PLAYER_INFO]; // Массив, через который мы будем обращаться у нужному нам члену перечисления за данными.


public OnGameModeInit()
{
    AddPlayerClass(0,2721.1331,-2447.2654,21.8844,267.9922,0,0,0,0,0,0); // Спавн.
	
	mysql_connect_ID = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_DATABASE, MYSQL_PASSWORD); // Наша переменная запускает подключение в mysql.
	switch(mysql_errno()) // Если при подключении mysql будет ошибка,то это отобразится в логах.
 	{
 	    case 1: print("Подключение к базе данных MYSQL успешно"); // Будет выводить в логах(или в консоле) что подключение прошло успешно.
 	    case -1: print("Подключение к базе данных MYSQL НЕ успешно"); // Будет выводить в логах(или в консоле) что подключение прошло не успешно.
 	}
	mysql_function_query(mysql_connect_ID, !"SET CHARACTER SET 'utf8'", false, "", ""); // Сохраняет базу данных на русском языке.
	mysql_function_query(mysql_connect_ID, !"SET NAMES 'utf8'", false, "", ""); // Сохраняет базу данных на русском языке.
	mysql_function_query(mysql_connect_ID, !"SET character_set_client = 'cp1251'", false, "", ""); // Сохраняет базу данных на русском языке.
	mysql_function_query(mysql_connect_ID, !"SET character_set_connection = 'cp1251'", false, "", ""); // Сохраняет базу данных на русском языке.
	mysql_function_query(mysql_connect_ID, !"SET character_set_results = 'cp1251'", false, "", ""); // Сохраняет базу данных на русском языке.
	mysql_function_query(mysql_connect_ID, !"SET SESSION collation_connection = 'utf8_general_ci'", false, "", ""); // Сохраняет базу данных на русском языке.
	
	SendRconCommand("hostname "SERVER_NAME""); // Показывается при поиске сервера.Само название в #define(Изменять там).
	SetGameModeText(SERVER_VERSION); // Показывается при поиске сервера.Само название в #define(Изменять там).
	SendRconCommand("mapname "SERVER_MAP""); // Показывается при поиске сервера.Само название в #define(Изменять там).
	SendRconCommand("weburl "SERVER_WEBSITE""); // Показывается при поиске сервера.Само название в #define(Изменять там).
  	LoadObject();
	return 1;
}

public OnGameModeExit()
{
    mysql_close(mysql_connect_ID); // Добавляет запрос к плагину MySQL на отключение от нашей базы данных.
	return 1;
}

public OnPlayerRequestClass(playerid, classid)
{
	SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
	SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
	SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
	return 1;
}

public OnPlayerConnect(playerid)
{
    GetPlayerName(playerid, pInfo[playerid][pName], MAX_PLAYER_NAME); //  Мы записали имя игрока в наш массив, дабы в будущем получить возможность брать имя игрока из этого массива.
    new query_string[49+MAX_PLAYER_NAME-4]; // Создаём переменную, для использования в будущем.
    format(query_string, sizeof(query_string), "SELECT * FROM `accounts` WHERE `player_name` = '%s'", pInfo[playerid][pName]); // Мы вставили имя в наш запрос, который заставит плагин просмотреть таблицу на предмет строк.
    mysql_function_query(mysql_connect_ID, query_string, true, "FindPlayerInTable","i", playerid); // Заставит плагин просмотреть таблицу на предмет строк.
	return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
    SaveAccount(playerid); // При отключении игрока с сервера, будет сохранятся аккаунт в базу данных.
    RemovePlayerInfo(playerid); // Это действие требуется для того, чтоб данные одного игрока не перемешались с данными другого в случае, если один игрок вышел и второй зашёл на тот же слот.
	return 1;
}

public OnPlayerSpawn(playerid)
{
    return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
	return 1;
}

public OnVehicleSpawn(vehicleid)
{
	return 1;
}

public OnVehicleDeath(vehicleid, killerid)
{
	return 1;
}

public OnPlayerText(playerid, text[])
{
    if(player_is_authorized{playerid} == 0)
    {
    SendClientMessage(playerid, -1, "Вы не авторизировались и не можете писать в чат!");
    return 0;
    }
	return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    return 0;
}

public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
{
	return 1;
}

public OnPlayerExitVehicle(playerid, vehicleid)
{
	return 1;
}

public OnPlayerStateChange(playerid, newstate, oldstate)
{
	return 1;
}

public OnPlayerEnterCheckpoint(playerid)
{
	return 1;
}

public OnPlayerLeaveCheckpoint(playerid)
{
	return 1;
}

public OnPlayerEnterRaceCheckpoint(playerid)
{
	return 1;
}

public OnPlayerLeaveRaceCheckpoint(playerid)
{
	return 1;
}

public OnRconCommand(cmd[])
{
	return 1;
}

public OnPlayerRequestSpawn(playerid)
{
	return 1;
}

public OnObjectMoved(objectid)
{
	return 1;
}

public OnPlayerObjectMoved(playerid, objectid)
{
	return 1;
}

public OnPlayerPickUpPickup(playerid, pickupid)
{
	return 1;
}

public OnVehicleMod(playerid, vehicleid, componentid)
{
	return 1;
}

public OnVehiclePaintjob(playerid, vehicleid, paintjobid)
{
	return 1;
}

public OnVehicleRespray(playerid, vehicleid, color1, color2)
{
	return 1;
}

public OnPlayerSelectedMenuRow(playerid, row)
{
	return 1;
}

public OnPlayerExitedMenu(playerid)
{
	return 1;
}

public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
{
	return 1;
}

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
	return 1;
}

public OnRconLoginAttempt(ip[], password[], success)
{
	return 1;
}

public OnPlayerUpdate(playerid)
{
	return 1;
}

public OnPlayerStreamIn(playerid, forplayerid)
{
	return 1;
}

public OnPlayerStreamOut(playerid, forplayerid)
{
	return 1;
}

public OnVehicleStreamIn(vehicleid, forplayerid)
{
	return 1;
}

public OnVehicleStreamOut(vehicleid, forplayerid)
{
	return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
  switch(dialogid) // Тут мы указываем оператору switch переменную, значение которой мы будем сравнивать с заданными нами значениями в последующем коде.
  {
    case D_REGISTER: // В данном случае мы указали не число, а член перечисления, который подразумевает под собой ID "1".
    {
        if(!response) // Тут мы проверяем значение параметра "response".
        {
            // Если оно равно нулю, значит игрок нажал на вторую (правую) кнопку или Esc (то бишь, попытался закрыть диалоговое окно) и поэтому мы его отсоединяем от сервера, показывая диалог-оповещение.
            ShowPlayerDialog(playerid, D_NULL, DIALOG_STYLE_MSGBOX, "Оповещение", "{FFFFF0}Вы были кикнуты с сервера.\n{FF0000}Причина: Отказ от регистрации.\n{FFFFF0}Для выхода с сервера введите \"/q\" в чат", "Выход", "");
            return Kick(playerid);
        }
        // Это серия различных проверок того, что ввёл игрок в поле для ввода (в данном случае - это пароль). Вот разбор первых трёх условий.
        // При срабатывании каждого из условий игроку будет показан диалог, в котором будет указано то, какая из проверок не сработала и что игрок сделал не так.
        if(!strlen(inputtext)) return ShowPlayerDialog(playerid, D_REGISTER, DIALOG_STYLE_INPUT, "Регистрация нового пользователя", "{FF0000}Ошибка: {FFFFF0}Вы не можете продолжить регистрацию не введя пароль!\nВведите пароль для регистрации нового аккаунта:\n{C0C0C0}Примечание:\n{666666}- Пароль чувствителен к регистру.\n- Пароль должен содержать от 4 до 30 символов.\n- Пароль может содержать латинские/кириллические символы и цифры (aA-zZ, аА-яЯ, 0-9).", "Регистрация", "Выход");
        else if(strlen(inputtext) < 4) return ShowPlayerDialog(playerid, D_REGISTER, DIALOG_STYLE_INPUT, "Регистрация нового пользователя", "{FF0000}Ошибка: {FFFFF0}Пароль слишком короткий!\nВведите пароль для регистрации нового аккаунта:\n{C0C0C0}Примечание:\n{666666}- Пароль чувствителен к регистру.\n- Пароль должен содержать от 4 до 30 символов.\n- Пароль может содержать латинские/кириллические символы и цифры (aA-zZ, аА-яЯ, 0-9).", "Регистрация", "Выход");
        else if(strlen(inputtext) > 30) return ShowPlayerDialog(playerid, D_REGISTER, DIALOG_STYLE_INPUT, "Регистрация нового пользователя", "{FF0000}Ошибка: {FFFFF0}Пароль слишком длинный!\nВведите пароль для регистрации нового аккаунта:\n{C0C0C0}Примечание:\n{666666}- Пароль чувствителен к регистру.\n- Пароль должен содержать от 4 до 30 символов.\n- Пароль может содержать латинские/кириллические символы и цифры (aA-zZ, аА-яЯ, 0-9).", "Регистрация", "Выход");
        for(new i = strlen(inputtext)-1; i != -1; i--)
        {
            switch(inputtext[i])
            {
                case '0'..'9', 'а'..'я', 'a'..'z', 'А'..'Я', 'A'..'Z': continue; // В case нельзя указать ни переменную, ни слово в привычном для всех виде.
                default: return ShowPlayerDialog(playerid, D_REGISTER, DIALOG_STYLE_INPUT, "Регистрация нового пользователя", "{FF0000}Ошибка: {FFFFF0}Пароль содержит запрещённые символы!\nВведите пароль для регистрации нового аккаунта:\n{C0C0C0}Примечание:\n{666666}- Пароль чувствителен к регистру.\n- Пароль должен содержать от 4 до 30 символов.\n- Пароль может содержать латинские/кириллические символы и цифры (aA-zZ, аА-яЯ, 0-9).", "Регистрация", "Выход");
            }
        }
        // Если ни одно из условий выше не сработало, значит игрок удовлетворил все наши правила по поводу введённого пароля и можно приступить к дальнейшей регистрации.
        pInfo[playerid][pPassword][0] = EOS;
        // Обнулит значение массива, хранящего пароль, дабы в нём по какой-либо причине не остался пароль предыдущего пользователя при регистрации нового.
        strins(pInfo[playerid][pPassword], inputtext, 0);
        // запишет введённый игроком пароль в массив pInfo, в ячейку с номером, хранящимся в playerid, которая сама разделяется на то число ячеек, сколько членов перечисления указано в enum.
        CreateNewAccount(playerid, pInfo[playerid][pPassword]);
        // Мы вызываем самописанную функцию, в которой будет хранится код создания аккаунта (запросы и прочее).
        return 1;
    }
    case D_LOGIN: // В данном случае мы указали не число, а член перечисления, который подразумевает под собой ID "2".
    {
        if(!response) // Тут мы проверяем значение параметра "response".
        {
		    // Если оно равно нулю, значит игрок нажал на вторую (правую) кнопку или Esc (то бишь, попытался закрыть диалоговое окно) и поэтому мы его отсоединяем от сервера, показывая диалог-оповещение.
            ShowPlayerDialog(playerid, D_NULL, DIALOG_STYLE_MSGBOX, "Оповещение", "{FFFFF0}Вы были кикнуты с сервера.\n{FF0000}Причина: Отказ от авторизации.\n{FFFFF0}Для выхода с сервера введите \"/q\" в чат", "Выход", "");
            return Kick(playerid);
        }
        // Если нам прислали запрос что аккаунт есть в базе данных,то мы выдаём ему авторизацию.
        if(!strlen(inputtext)) return ShowPlayerDialog(playerid, D_LOGIN, DIALOG_STYLE_INPUT, "Авторизация", "{FF0000}Ошибка: {FFFFF0}Вы не можете продолжить авторизацию не введя пароль!\nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход");
        for(new i = strlen(inputtext)-1; i != -1; i--)
        {
            switch(inputtext[i])
            {
                case '0'..'9', 'а'..'я', 'a'..'z', 'А'..'Я', 'A'..'Z': continue; // В case нельзя указать ни переменную, ни слово в привычном для всех виде.
                default: return ShowPlayerDialog(playerid, D_LOGIN, DIALOG_STYLE_INPUT, "Авторизация", "{FF0000}Ошибка: {FFFFF0}Введённый пароль содержит запрещённые символы!\nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход");
            }
        }
        if(!strcmp(pInfo[playerid][pPassword], inputtext))
        {
            new query_string[49+MAX_PLAYER_NAME];
            format(query_string, sizeof(query_string), "SELECT * FROM `accounts` WHERE `player_name` = '%s'", pInfo[playerid][pName]);
            mysql_function_query(mysql_connect_ID, query_string, true, "UploadPlayerAccount","i", playerid);
        }
        else
        {
            switch(GetPVarInt(playerid, "WrongPassword")) // Выскакивает в том случаем,если он ввёл не правильный пароль.
            {
                case 0: ShowPlayerDialog(playerid, D_LOGIN, DIALOG_STYLE_INPUT, "Авторизация", "{FF0000}Ошибка: {FFFFF0}Вы ввели неверный пароль! У Вас осталось 3 попытки.\nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход");
                case 1: ShowPlayerDialog(playerid, D_LOGIN, DIALOG_STYLE_INPUT, "Авторизация", "{FF0000}Ошибка: {FFFFF0}Вы ввели неверный пароль! У Вас осталось 2 попытки.\nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход");
                case 2: ShowPlayerDialog(playerid, D_LOGIN, DIALOG_STYLE_INPUT, "Авторизация", "{FF0000}Ошибка: {FFFFF0}Вы ввели неверный пароль! У Вас осталось 1 попытка.\nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход");
                case 3: ShowPlayerDialog(playerid, D_LOGIN, DIALOG_STYLE_INPUT, "Авторизация", "{FF0000}Ошибка: {FFFFF0}Вы ввели неверный пароль! У Вас осталась последняя попытка, после чего Вас кикнет.\nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход");
                default:
                {
					// Если он 3 раза не правильно ввёл пароль,то его кикает с сервера.
                    ShowPlayerDialog(playerid, D_NULL, DIALOG_STYLE_MSGBOX, "Оповещение", "{FFFFF0}Вы были кикнуты с сервера.\n{FF0000}Причина: Превышен лимит попыток на ввод пароля.\n{FFFFF0}Для выхода с сервера введите \"/q\" в чат", "Выход", "");
                    return Kick(playerid);
                }
            }
            SetPVarInt(playerid, "WrongPassword", GetPVarInt(playerid, "WrongPassword")+1);
        }
    }
  }
  return 1;
}

public OnPlayerClickPlayer(playerid, clickedplayerid, source)
{
	return 1;
}

forward UploadPlayerAccountNumber(playerid); // Без данного forward'a не будет работать паблик.
public UploadPlayerAccountNumber(playerid) pInfo[playerid][pID] = cache_insert_id(mysql_connect_ID); // А вот и сам коллбэк, который вернёт ID аккаунта.


forward FindPlayerInTable(playerid); // Без данного forward'a не будет работать паблик.
public FindPlayerInTable(playerid) // Так мы объявляем новый колбэк, указывая его имя и параметры, которые должны передаваться при вызове этого колбэка.
{
    new rows, fields; // Так мы объявляем новый колбэк, указывая его имя и параметры, которые должны передаваться при вызове этого колбэка.
    cache_get_data(rows, fields); // Две переменные в которые запишем число строк и столбцов, которые будут возвращены в результате обработки нашего запроса.
    if(!rows) // если MySQL вернуло 0 строк после обработки запроса, значит аккаунт игрока не создан и нам можно предложить создать этот самый аккаунт игроку.
    {
        format(totalstring, 640, "{FFFFF0}Здравствуй, дорогой друг.\n\n{FFFFF0}Приветсвуем тебя на сервере {00edff} {FFFFF0}\n\nТак как вы {00edff}впервые {FFFFF0}на нашем сервере,\nмы рекомендуем вам пройти {00edff}регистрацию{FFFFF0}.\n\n Для начала вам нужно ввести желаемый пароль.\n\n{696c6c}Справка : Пароль должен быть запоминающимся для вас и тяжелый\nдля мошенников, пытающихся взломать его.\nПример : 18541231\n\n{FFFFF0}Введите желаемый пароль {00edff}ниже:", "Регистрация", "Выход");
        ShowPlayerDialog(playerid, D_REGISTER, DIALOG_STYLE_INPUT, "{66CC00}Регистрация Аккаунта | 1 Шаг", totalstring, "Далее","Отмена");
	}
    else // если MySQL вернуло 1 строк после обработки запроса, значит аккаунт игрока создан и нам можно предложить авторизовать этот самый аккаунт игроку.
    {
        format(totalstring, 528, "{FFFFF0}Здраствуйте, дорогой друг.\n\n{FFFFF0}Приветсвуем вас на сервере {00edff} {FFFFF0}\nВаш аккаунт {00edff}имеется {FFFFF0}в базе данных.\n\n{696c6c}Справка : Если вы введете ваш пароль неверно\nболее трех раз, вы будeте кикнуты сервером.\nДля этого соблюдайте правильность \nвводимых символов, во избежания ошибок ввода\n\n{FFFFF0}Для продолжения введите ваш пароль :", "Регистрация", "Выход");
		ShowPlayerDialog(playerid, D_LOGIN, 3, "{66CC00}Авторизация", totalstring, "Принять","Отмена");
        cache_get_field_content(0, "password", pInfo[playerid][pPassword], mysql_connect_ID, 31); // Если проверка "if(!rows)" не сработала, значит MySQL нашёл в таблице аккаунт с нужным именем.
    }
    return 1;
}

stock CreateNewAccount(playerid, password[]) // Собственно, сама функция с двумя параметрами: числовой, который хранит ID игрока и в виде массива, который хранит пароль.
{
    new query_string[66+MAX_PLAYER_NAME-4+30]; // Создаём переменную, для использования в будущем.
    // Данным запросом мы обновляем данные в таблице на те, что игрок ввёл при регистрации.
    format(query_string, sizeof(query_string), "INSERT INTO `accounts` (`player_name`, `password`) VALUES ('%s', '%s')", pInfo[playerid][pName], password);
    // MySQL вернуло данные о запросе, поэтому я и дописал тут коллбэк.
    mysql_function_query(mysql_connect_ID, query_string, true, "UploadPlayerAccountNumber", "i", playerid);
    // Если аккаунт авторизовался,то ему выводится сообщение!
    format(query_string, sizeof(query_string), "Аккаунт %s успешно зарегистрирован. Администрация желает Вам приятной игры!", pInfo[playerid][pName]);
    SendClientMessage(playerid, 0xFFFFF000, query_string);
    player_is_authorized{playerid} = 1; // Проверка на авторизацию.
    // Ну а этой функцией мы отправляем игрока на спавн.
    SpawnPlayer(playerid);
    return 1;
}

stock SaveAccount(playerid)
{
    new query_string[(21)+(16+11)+(20+MAX_PLAYER_NAME)+(16+30)] = "UPDATE `accounts` SET";

    format(query_string, sizeof(query_string), "%s `player_name` = '%s',", query_string, pInfo[playerid][pName]);
    format(query_string, sizeof(query_string), "%s `password` = '%s'", query_string, pInfo[playerid][pPassword]);

    format(query_string, sizeof(query_string), "%s WHERE `id` = '%d'", query_string, pInfo[playerid][pID]);
    mysql_function_query(mysql_connect_ID, query_string, false, "", "");
    return 1;
}

stock RemovePlayerInfo(playerid) // Это действие требуется для того, чтоб данные одного игрока не перемешались с данными другого в случае, если один игрок вышел и второй зашёл на тот же слот.
{
	// "EOS", по-сути, в Pawn равнозначна нулю.
	// Для нового игрока обнуляем все данные,которые изпольсовал старый.(Если ид одинаковый)
    pInfo[playerid][pID] = 0;
    pInfo[playerid][pName][0] = EOS;
    pInfo[playerid][pPassword][0] = EOS;
    return 1;
}

forward UploadPlayerAccount(playerid);
public UploadPlayerAccount(playerid)
{
    pInfo[playerid][pID] = cache_get_field_content_int(0, "id", mysql_connect_ID);
    SendClientMessage(playerid, 0xFFFFF00, "Вы успешно авторизировались!");
    SpawnPlayer(playerid);
    return 1;
}

stock LoadObject()
{
	return 1;
}

 

 

Заметка от DEST , создано

Большое количество кода добавляйте еще и под спойлер (подробнее см. тут).

Поделиться сообщением


Ссылка на сообщение

3 ответа на этот вопрос

  • 0

Есть куча уроков как отключить кнопки эти, по гугли

Поделиться сообщением


Ссылка на сообщение
  • 0

Засунь игрока в спектатор через функцию TogglePlayerSpectating

Поделиться сообщением


Ссылка на сообщение
  • 0
12 часов назад, Gromov000 сказал:

Засунь игрока в спектатор через функцию TogglePlayerSpectating

И куда он это всё должен сделать?
Если стал уже отвечать, ты уточнить что делать с этим.

 

P.S Авто темы, если соберешься использовать 

 

TogglePlayerSpectating

Для начала объяви его в OnPlayerConnect

TogglePlayerSpectating(playerid,1);

Далее убирай его в диалоге авторизации/регистрации

TogglePlayerSpectating(playerid,0);

 

Должно помочь.

Отредактировано пользователем Lionely

Поделиться сообщением


Ссылка на сообщение
Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Похожий контент

    • Артём Профиков
      От Артём Профиков
      У меня есть система подсказок вот так она выглядет
      ShowNotification(playerid, тип, "текст", время, "команда через /", "текст кнопки");
      Только есть вопрос как сделать так чтоб она активировалась в определенном радиусе? Заранее спасибо