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



Не найдено.

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

    • Антон Нолмадов
      By Антон Нолмадов


      Просмотр файла ATOM ROLEPLAY | 0.3.7 ОРИГИНАЛ ОТ ВЛАДЕЛЬЦА
      И снова всем здраствуйте, сегодня в продажу входит игровой мод моего бывшего сервера Atom RolePlay 0.3.7 
      Что входит в продажу:
       
      Мод -
      Сборка сервера с худом -
      Сайт -
      Форум -
      Оформление вк
       
      Вкратце про функционал мода: 
      Система домов. 
      Система бизнеса. 
      Система атм. 
      Система радаров. 
      Система транспорта. 
      Система квестов. 
      Есть водный салон где каждый игрок сможет себе покупать лодку и яхту. 
      Есть воздушный транспорт. 
      Мод сделан под бонусник (точнее переделан), многие товары (яхты, автомобили, самолеты, скины) за донат.
       
      ВНИМАТЕЛЬНО!!!!!!!      ПОСЛЕ ПОКУПКИ ИГРОВОГО МОДА ОТПИШИТЕ МНЕ В ВК vk.com/jakenolman (НЕ РЕКЛАМА)
      Добавил Антон Нолмадов Добавлено 23.06.2021 Категория Моды Автор Anton Nolmadov  
    • Антон Нолмадов
      By Антон Нолмадов


      Просмотр файла SUPREME ROLEPLAY | CRMP 0.3.e
      И снова всем здраствуйте, сегодня в продажу входит игровой мод сервера Supreme RolePlay 0.3.e
      Что входит в продажу:
       
      Мод -
      Мод-пак
      Оформление вк
       
      Вкратце про функционал мода: 
      Система домов. 
      Система бизнеса. 
      Система атм. 
      Система радаров. 
      Система транспорта. 
      Система квестов. 
      Есть водный салон где каждый игрок сможет себе покупать лодку и яхту.
      Покупка вертолёта
      Личный мапинг
      Красивая карта 
      Много систем в фракциях
      Система тюнинга
      Есть воздушный транспорт. 
      Мод сделан под бонусник, многие товары (яхты, автомобили, самолеты, скины) за донат.
      Данный мод продавался примерной ценой 1000+
       
      ВНИМАТЕЛЬНО!!!!!!!      ПОСЛЕ ПОКУПКИ ИГРОВОГО МОДА ОТПИШИТЕ МНЕ В ВК vk.com/jakenolman (НЕ РЕКЛАМА)
      Добавил Антон Нолмадов Добавлено 23.06.2021 Категория Моды Автор Anton Nolmadov  
    • Антон Нолмадов
      By Антон Нолмадов
      И снова всем здраствуйте, сегодня в продажу входит игровой мод сервера Supreme RolePlay 0.3.e
      Что входит в продажу:
       
      Мод -
      Мод-пак
      Оформление вк
       
      Вкратце про функционал мода: 
      Система домов. 
      Система бизнеса. 
      Система атм. 
      Система радаров. 
      Система транспорта. 
      Система квестов. 
      Есть водный салон где каждый игрок сможет себе покупать лодку и яхту.
      Покупка вертолёта
      Личный мапинг
      Красивая карта 
      Много систем в фракциях
      Система тюнинга
      Есть воздушный транспорт. 
      Мод сделан под бонусник, многие товары (яхты, автомобили, самолеты, скины) за донат.
      Данный мод продавался примерной ценой 1000+
       
      ВНИМАТЕЛЬНО!!!!!!!      ПОСЛЕ ПОКУПКИ ИГРОВОГО МОДА ОТПИШИТЕ МНЕ В ВК vk.com/jakenolman (НЕ РЕКЛАМА)
    • Антон Нолмадов
      By Антон Нолмадов
      И снова всем здраствуйте, сегодня в продажу входит игровой мод моего бывшего сервера Atom RolePlay 0.3.7 
      Что входит в продажу:
       
      Мод -
      Сборка сервера с худом -
      Сайт -
      Форум -
      Оформление вк
       
      Вкратце про функционал мода: 
      Система домов. 
      Система бизнеса. 
      Система атм. 
      Система радаров. 
      Система транспорта. 
      Система квестов. 
      Есть водный салон где каждый игрок сможет себе покупать лодку и яхту. 
      Есть воздушный транспорт. 
      Мод сделан под бонусник (точнее переделан), многие товары (яхты, автомобили, самолеты, скины) за донат.
       
      ВНИМАТЕЛЬНО!!!!!!!      ПОСЛЕ ПОКУПКИ ИГРОВОГО МОДА ОТПИШИТЕ МНЕ В ВК vk.com/jakenolman (НЕ РЕКЛАМА)
    • Человек-редиска
      By Редиска
      ПОМОГИТЕ!!!!!!!!
      НЕ СОХРАНЯЮТСЯ НОМЕРА НА АВТО.
      ПОЛУЧАЮ НОМЕРА, А ОНИ ПРОПАДАЮТ ПОСЛЕ ПОЛУЧЕНИЯ.
      ТО ЕСТЬ, КОГДА ПРОПИСЫВАЮ КОМАНДУ /FIXCAR И ВЫБЕРАЮ ВЫГРУЗИТЬ А ПОТОМ ЗАГРУЗИТЬ.
      ТО НОМЕРОВ УЖЕ НЕТУ, ТУПО ПРОПАЛИ!
      ЗАХОДИЛ В БД ТАМ ОНИ ПОЯВЛЯЮТСЯ, А НА АВТО ПОЧЕМУ ТО НЕ ОТОБРАЖАЮТСЯ.
      ПОТОМ Я РЕШИЛ ЗАЙТИ В ТАБЛИЦУ ПОД НАЗВАНИЕМ OWNABLE_CARS ТАМ Я УВИДЕЛ СТРОКУ C_NUMBERS
      В ЭТОМ СТРОКЕ Я ПРОПИСАЛ СВОЁ ИМЯ, ПОТОМ ЗАШЁЛ В ИГРУ, ЗАГРУЖАЮ АВТО И ЕСТЬ НОМЕРА.
      А ТО ЧТО У МЕНЯ ЕСТЬ ЕЩЁ ОДНА ТАБЛИЦА ПОД НАЗВАНИЕМ OWNABLE_NUMBERS.
      ТАМ У МЕНЯ ТОЛЬКО НОМЕРА ПОЯВЛЯЮТСЯ И ВСЁ. ТОЕСТЬ ОНИ НЕ ПРИВЯЗЫВАЮТСЯ К АВТО КОРОЧЕ ВОТ И ВСЁ!!!!!!
      ПОМОГИТЕ УЖЕ ПОЖАЛУЙСТА СРОЧНО НУЖНО.