Рекомендованные сообщения



Не найдено.

4 posts in this topic

Взял мод 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 , создано

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
12 часов назад, Gromov000 сказал:

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

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

 

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

 

TogglePlayerSpectating

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

TogglePlayerSpectating(playerid,1);

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

TogglePlayerSpectating(playerid,0);

 

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

Edited by Lionely

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this  
Followers 0

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • Zerno303
      By Zerno303
      -------------------------------------------------------------------------------------------------------------------
      ВАЖНО!
      Перед покупкой лучше спросите лишний раз, чем потом кидать претензии в мою сторону!
      -------------------------------------------------------------------------------------------------------------------
      Доброго времени суток! Этот мод подойдёт по основу и даже под открытие.
      9 уровней админки.
      Лидерки: Мэрия, ГУВД, УГИБДД, ФСБ, Больница, Автошкола, Южная ОПГ, Арзамасская ОПГ, Армия, Лыткаринская ОПГ, Батыревская ОПГ,, RECORD FM и Спецназ.
      Работы: Городской склад, Шахта, Лесопилка и Автомеханик.
      crmp 0.3e
      Мод без сборки(Сборка не нужна). 
      Мод-пак есть. Если понадобится пишите в лс.
    • Zerno303
      By Zerno303


      Просмотр файла Продажа мода Race RP.
      -------------------------------------------------------------------------------------------------------------------
      ВАЖНО!
      Перед покупкой лучше спросите лишний раз, чем потом кидать претензии в мою сторону!
      -------------------------------------------------------------------------------------------------------------------
      Доброго времени суток! Этот мод подойдёт по основу и даже под открытие.
      9 уровней админки.
      Лидерки: Мэрия, ГУВД, УГИБДД, ФСБ, Больница, Автошкола, Южная ОПГ, Арзамасская ОПГ, Армия, Лыткаринская ОПГ, Батыревская ОПГ,, RECORD FM и Спецназ.
      Работы: Городской склад, Шахта, Лесопилка и Автомеханик.
      crmp 0.3e
      Мод без сборки(Сборка не нужна). 
      Мод-пак есть. Если понадобится пишите в лс.
      Добавил Zerno303 Добавлено 16.10.2021 Категория Моды Автор Zerno303  
    • panda1999
      By panda1999
      Публикация В Google Play
      Публикация приложения в Google Play Market на мой аккаунт разработчика.

      Имею большой опыт в публикации различных приложений и сервисов. Помогу пройти модерацию приложения.

      По статистике приложения проходят модерацию в течение 2-х (двух) дней после публикации.

      Это важно! Я, как владелец аккаунта Google Play Developer, вправе удалить приложение со своего аккаунта без ведома уведомления заказчика, если приложение или связанные с ним любые ресурсы будут нарушать правила Google Play, а также, если на приложение будет оставлено более трёх отрицательных отзывов, которые указывают на не правомерную деятельность приложения или любых связанных с ним ресурсами.

      ЕСЛИ У ВАС возникнут ЛЮБЫЕ вопросы пишите!

      С радостью проконсультирую!))

      Нужно для заказа:
      1. Файл приложения в формате . aab.

      С августа 2021 года все приложения в Google Play будут публиковаться в формате Android App Bundle (AAB) вместо старого APK.

      2. Название приложения (макс. длина текста 50 символов).

      3. Краткое описание (макс. длина текста 80 символов).

      4. Полное описание приложения (макс. длина текста 4000 символов).

      5. Значок приложения.

      PNG или JPEG

      512х512 пкс

      До 1 Мб

      6. Картинка для описания.

      PNG или JPEG

      1024x500 пкс

      До 1 Мб

      7. Скриншоты 2-8 шт.
      Принимаем QIWI
      Принимаем Карта банка.
      Если вас заинтересовало, обращайтесь ко мне в л\с. Вконтакте
    • panda1999
      By panda1999
      Ищу команду для открытие Торговой площадки Котороя готова вложиться на разработку писать в лс на сайте или вк https://vk.com/panda131999
      Скрин шот главной страницы


    • bdbsnnsd
      By bdbsnnsd
      Не могу найти куда в бд написать пароль от админки.