Вопросы

Помогите пожалуйста кто сможет. 

Делал свой мод на mxINI, и решил добавить выбор пола, но он не работает. Диалоговое окно есть, но смысла нету, закрыть его нельзя. Помогите плиз.

Забыл сказать, делал я диологи пополам с плагином mDialog, поэтому где-то SPD, а где-то Dialog_Open, не судите строго.

Спойлер

public OnPlayerRequestClass(playerid, classid)
{
    //SetPlayerPos(playerid, 1463.8624,-2371.3694,40.3388);
    SetPlayerCameraPos(playerid, 1463.8624,-2371.3694,40.3388);
    SetPlayerCameraLookAt(playerid, 1589.9457,-2216.7305,35.3422);
    if(PAccount[playerid] == 1)// Если аккаунт есть
    {
        SPD(playerid, 1, DSP, "{FF0000}• {FF4500}Авторизация {FF0000}•",
        "\t{FFFFFF}Добро пожаловать на {FFD700}Visonfa Role-Play!{FFFFFF}\n\
        Данный аккаунт уже зарегестрирован на нашем сервере\n\
        Для входа в игру введите ваш пароль в поле ниже.",
        "{FFFFFF}Далее","{FFFFFF}Выход");// Показываем диалог входа в игру. Стиль диалога выставляем на ввод текста.
    }
    else// Если аккаунта нет
    {
        SPD(playerid, 2, DSI,"{FF0000}• {FF4500}Регистрация {FFFFFF}|{FFFF00} Пароль {FF0000}•",
        "{FFFFFF}Добро пожаловать на {FFD700}Visonfa Role-Play!{FFFFFF}\n\
        Данный аккаунт не зарегестрирован на нашем сервере\n\
        Для входа в игру придумайте пароль\n\
        {FF0000}\tПримечание:{FFFF00}\n\
        \t• Длинна пароля должна быть до 24 символов\n\
        \t• Чем надёжнее пароль тем труднее его взломать\n\
        \t• Админестрация сервера не несёт ответственности если вы потеряете свой пароль",
        "{FFFFFF}Далее","{FFFFFF}Выход");// Показываем диалог регистрации. Стиль диалога выставляем на ввод текста.
    }
    return 1;
}

public OnPlayerConnect(playerid)
{
    GetPlayerName(playerid, Player[playerid][pName], MAX_PLAYER_NAME);
    PlayerInfo[playerid][pAdmin] = 0;
    //End
    new playername[MAX_PLAYER_NAME];// Массив для имени игрока
    new string[128];// Путь до папки с именем игрока
    GetPlayerName(playerid,playername,sizeof(playername));// Узнаём имя игрока
    format(string,sizeof(string),"players/%s.ini", playername);// Путь к файлу с аккаунтом
    if(fexist(string))// Проверка на файл, если он есть то выполняется следующее действие.
     {
        PAccount[playerid] = 1;// Аккаунт есть
    }
    else// Если файла с именем нет, то выполняется это действие.
    {
        PAccount[playerid] = 0;// Аккаунта нет
    }
    LoadPlayer(playerid);
    PlayerPlaySound(playerid, 1097, 0.0, 0.0, 0.0);
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
    SavePlayer(playerid);// Сохраняем игрока
    return 1;
}

public OnPlayerSpawn(playerid)
{
    GivePlayerMoney(playerid, Player[playerid][pMoney]);
    SetPlayerScore(playerid, Player[playerid][pScore]);
    SetPlayerSkin(playerid, Player[playerid][pSkin]);
    SetPlayerColor(playerid, 0xFFFFFFFF);    new rand1 = random(3);
    switch(rand1)
    {
        case 0:
        {
            SetPlayerPos(playerid, 1642.4773,-2241.4187,13.4937);
            SetPlayerFacingAngle(playerid, 178.0465);
            SetCameraBehindPlayer(playerid);
        }
        case 1:
        {
            SetPlayerPos(playerid, 1640.1191,-2241.5908,13.4964);
            SetPlayerFacingAngle(playerid, 178.3401);
            SetCameraBehindPlayer(playerid);
        }
        case 2:
        {
            SetPlayerPos(playerid, 1645.5403,-2241.2451,13.4971);
            SetPlayerFacingAngle(playerid, 179.5099);
            SetCameraBehindPlayer(playerid);
        }
    }
    PlayerPlaySound(playerid, 0, 0.0, 0.0, 0.0);
    return 1;
}

 

DialogResponse:NoPassLogin(playerid, response, listitem, inputtext[])
{
    if(response)
    {
        SPD(playerid, 1, DSP, "{FF0000}• {FF4500}Авторизация {FF0000}•",
        "\t{FFFFFF}Добро пожаловать на {FFD700}Visonfa Role-Play!{FFFFFF}\n\
        Данный аккаунт уже зарегестрирован на нашем сервере\n\
        Для входа в игру введите ваш пароль в поле ниже.",
        "{FFFFFF}Далее","{FFFFFF}Выход");
    }
    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{

    if(dialogid == 1)// Ид диалога Для Логина
    {
        if(response)// Если игрок нажал первую кнопку входа
        {
            if(!strlen(inputtext))// Если окно ввода пустое, выводим диалог снова
            {
                Dialog_Open(playerid, "NoPassLogin", DSM, "{FF0000}• {FF4500}Авторизация {FF0000}•",
                "{B22222}Вы ввели неверный пароль",
                "{FFFFFF}Назад", "");
                return 1;
            }
            new pass[24];// Массив с паролем
            strmid(pass,inputtext,0,strlen(inputtext),24);// Считываем текст с диалога
            OnPlayerLogin(playerid,pass);// Запускаем паблик входа
        }
        else// Если игрок нажал Esc, вернём ему диалог
        {
            return Kick(playerid);
        }
    }
    if(dialogid == 2)// Ид диалога для регистрации
    {
        if(response)// Если игрок нажал первую кнопку
        {
            if(!strlen(inputtext))// Если окно ввода пустое, выводим диалог снова
            {
                SPD(playerid, 2, DSI,"{FF0000}• {FF4500}Регистрация {FFFFFF}|{FFFF00} Пароль {FF0000}•",
                "{FFFFFF}Добро пожаловать на {FFD700}Visonfa Role-Play!{FFFFFF}\n\
                Данный аккаунт не зарегестрирован на нашем сервере\n\
                Для входа в игру придумайте пароль\n\
                {FF0000}\tПримечание:{FFFF00}\n\
                \t• Длинна пароля должна быть до 24 символов\n\
                \t• Чем надёжнее пароль тем труднее его взломать\n\
                \t• Админестрация сервера не несёт ответственности если вы потеряете свой пароль",
                "{FFFFFF}Далее","{FFFFFF}Выход");
                return 1;
            }
            new len = strlen(inputtext);
            if(len < 6)
            {
                SPD(playerid, 2, DSI,"{FF0000}• {FF4500}Регистрация {FFFFFF}|{FFFF00} Пароль {FF0000}•",
                "{FFFFFF}Добро пожаловать на {FFD700}Visonfa Role-Play!{FFFFFF}\n\
                Данный аккаунт не зарегестрирован на нашем сервере\n\
                Для входа в игру придумайте пароль\n\
                {FF0000}\tПримечание:{FFFF00}\n\
                \t• Длинна пароля должна быть до 24 символов\n\
                \t• Чем надёжнее пароль тем труднее его взломать\n\
                \t• Админестрация сервера не несёт ответственности если вы потеряете свой пароль",
                "{FFFFFF}Далее","{FFFFFF}Выход");
                return SCM(playerid, -1, "Длинна пароля должна быть от 6 до 24 символов!");
            }
            if(len > 24)
            {
                SPD(playerid, 2, DSI,"{FF0000}• {FF4500}Регистрация {FFFFFF}|{FFFF00} Пароль {FF0000}•",
                "{FFFFFF}Добро пожаловать на {FFD700}Visonfa Role-Play!{FFFFFF}\n\
                Данный аккаунт не зарегестрирован на нашем сервере\n\
                Для входа в игру придумайте пароль\n\
                {FF0000}\tПримечание:{FFFF00}\n\
                \t• Длинна пароля должна быть до 24 символов\n\
                \t• Чем надёжнее пароль тем труднее его взломать\n\
                \t• Админестрация сервера не несёт ответственности если вы потеряете свой пароль",
                "{FFFFFF}Далее","{FFFFFF}Выход");
                return SCM(playerid, -1, "Длинна пароля должна быть от 6 до 24 символов!");
            }
            new pass[24];// Массив с паролем
            strmid(pass,inputtext,0,strlen(inputtext),24);// Считываем текст с диалога
            OnPlayerLogin(playerid,pass);// Запускаем паблик регистрации
            
        }
        else// Если игрок нажал Esc, вернём ему диалог
        {
            return Kick(playerid);
        }
    }
    SPD(playerid, 3, DSL, "Регистрация выбор пола",
    "Мужской\n\
    Женский",
    "Выбор", "Выход");
    if(dialogid == 3)
    {
        if(!response) return Kick(playerid);
        switch(listitem)
        {
            case 0:
            {
                Player[playerid][pGender] = 1;
            }
            case 1:
            {
                Player[playerid][pGender] = 2;
            }
        }
    }
    return 1;
}

stock SavePlayer(playerid)
{
    new string[64];// Массив с путём для файла
    new playername[MAX_PLAYER_NAME];// Массив для получения имени игрока
    GetPlayerName(playerid, playername, sizeof(playername));// Получаем Имя игрока
    format(string, sizeof(string), "players/%s.ini", playername);// Добавляем имя игрока, в путь для сохранения
    new iniFile = ini_openFile(string);// Открываем файл по тому пути который указали.
    ini_setString(iniFile,"Pass",Player[playerid][pPass]);// Записываем пароль игрока в файл
    ini_setInteger(iniFile,"Admin",Player[playerid][pAdmin]);// Записываем уровень админа
    ini_setInteger(iniFile,"Gender",Player[playerid][pGender]);
    ini_setInteger(iniFile,"Money",Player[playerid][pMoney]);
    ini_setInteger(iniFile,"Score",Player[playerid][pScore]);
    ini_setInteger(iniFile,"EXP",Player[playerid][pEXP]);
    ini_setInteger(iniFile,"Mail",Player[playerid][pMail]);
    ini_setInteger(iniFile,"Ismail",Player[playerid][pIsmail]);
    ini_setInteger(iniFile,"Skin",Player[playerid][pSkin]);
    ini_setInteger(iniFile,"VCDonate",Player[playerid][pVCD]);
    ini_setInteger(iniFile,"Zacon",Player[playerid][pZacon]);
    ini_setInteger(iniFile,"UsePromo",Player[playerid][pUsePromo]);
    ini_setInteger(iniFile,"OtGame",Player[playerid][pOtGame]);
    ini_closeFile(iniFile);// Закрываем файл
}

stock LoadPlayer(playerid)
{
    new string[64];// Массив с путём для файла
    new playername[MAX_PLAYER_NAME];// Массив для получения имени игрока
    GetPlayerName(playerid, playername, sizeof(playername));// Получаем Имя игрока
    format(string, sizeof(string), "players/%s.ini", playername);// Добавляем имя игрока, в путь для сохранения
    new iniFile = ini_openFile(string);// Открываем файл по тому пути который указали.
    ini_getString(iniFile,"Pass",Player[playerid][pPass]);// Записываем пароль игрока в файл
    ini_getInteger(iniFile,"Admin",Player[playerid][pAdmin]);// Записываем уровень админа
    ini_getInteger(iniFile,"Gender",Player[playerid][pGender]);
    ini_getInteger(iniFile,"Money",Player[playerid][pMoney]);
    ini_getInteger(iniFile,"Score",Player[playerid][pScore]);
    ini_getInteger(iniFile,"EXP",Player[playerid][pEXP]);
    ini_getInteger(iniFile,"Mail",Player[playerid][pMail]);
    ini_getInteger(iniFile,"Ismail",Player[playerid][pIsmail]);
    ini_getInteger(iniFile,"Skin",Player[playerid][pSkin]);
    ini_getInteger(iniFile,"VCDonate",Player[playerid][pVCD]);
    ini_getInteger(iniFile,"Zacon",Player[playerid][pZacon]);
    ini_getInteger(iniFile,"UsePromo",Player[playerid][pUsePromo]);
    ini_getInteger(iniFile,"OtGame",Player[playerid][pOtGame]);
    ini_closeFile(iniFile);// Закрываем файл
}

forward OnPlayerRegister(playerid, password[]);
public OnPlayerRegister(playerid, password[])// Паблик регистрации
{
    if(IsPlayerConnected(playerid))// Проверка на подключение игрока
    {
        new string[64];// Массив с путём для файла
        new playername[MAX_PLAYER_NAME];// Массив для получения имени игрока
        GetPlayerName(playerid, playername, sizeof(playername));// Получаем Имя игрока
        format(string,sizeof(string), "players/%s.ini", playername);// Добавляем имя игрока, в путь для сохранения
        new iniFile = ini_createFile(string);// Создаём файл с именем игрока в папке players
        if(iniFile < 0)// Если Файла нет
        {
            iniFile = ini_openFile(string);// Открываем
        }
        if(iniFile >= 0)// Если файл есть
        {
            strmid(Player[playerid][pPass],password,0,strlen(password),255);// Присваиваем массиву pPass, значение password[]
            ini_setString(iniFile,"Pass",Player[playerid][pPass]);// Записываем пароль игрока в файл
            ini_closeFile(iniFile);// Закрываем файл
            SPD(playerid, 1, DSP, "{FF0000}• {FF4500}Авторизация {FF0000}•",
            "\t{FFFFFF}Добро пожаловать на {FFD700}Visonfa Role-Play!{FFFFFF}\n\
            Данный аккаунт уже зарегестрирован на нашем сервере\n\
            Для входа в игру введите ваш пароль в поле ниже.",
            "{FFFFFF}Далее","{FFFFFF}Выход");
           }
        Player[playerid][pMoney] = 150;
        Player[playerid][pScore] = 1;
        Player[playerid][pEXP] = 1;
        Player[playerid][pSkin] = 78;
        Player[playerid][pVCD] = 0;
        Player[playerid][pZacon] = 20;
        Player[playerid][pIsmail] = 0;
    }
    return 1;
}

forward OnPlayerLogin(playerid,password[]);
public OnPlayerLogin(playerid,password[])
{
    if(IsPlayerConnected(playerid))// Проверка на подключение игрока
    {
        new string[64];// Массив с путём для файла
        new pass[24];// Массив с паролем
        new playername[MAX_PLAYER_NAME];// Массив для получения имени игрока
        GetPlayerName(playerid, playername, sizeof(playername));// Получаем Имя игрока
        format(string,sizeof(string), "players/%s.ini", playername);// Добавляем имя игрока, в путь для загрузки
        new iniFile = ini_openFile(string);// Открываем файл
        ini_getString(iniFile,"Pass",pass,24);// Загружаем пароль
        if(strcmp(pass,password,true) == 0)// Если введёный пароль, соответсвует паролю при регистрации, то загружаем акк
        {
             ini_getString(iniFile,"Pass",Player[playerid][pPass],24);// Загружаем пароль
             ini_getInteger(iniFile,"Admin",Player[playerid][pAdmin]);// Загружаем уровень админа
             ini_closeFile(iniFile);// Закрываем файл
        }
        else// Если пароль не верен..
        {
            ini_closeFile(iniFile);// Закрываем файл
            Dialog_Open(playerid, "NoPassLogin", DSM, "{FF0000}• {FF4500}Авторизация {FF0000}•",
            "{B22222}Вы ввели неверный пароль",
            "{FFFFFF}Назад", "");
            return 1;
        }
        SendClientMessage(playerid,0xFF00000,"Добро пожаловать на наш сервер");// Выводим игрок сообщение
        SpawnPlayer(playerid);// Спавним игрока
    }
    return 1;
}

 

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


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

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

  • 0
2 часа назад, John_Silver сказал:

Диалоговое окно есть, но смысла нету, закрыть его нельзя

А как вы его хотите закрыть, если две единственно возможные кнопки вы заняли под выбор пола? 

 

2 часа назад, John_Silver сказал:

но он не работает

То, что диалоговое окно нельзя закрыть, называется не работает? Или есть еще проблемы?

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


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

@Cawfee Сделал выбор пола в виде списка, окно можно закрыть, но тебя кикнит, а должно быть чтобы типо когда тьы выбрал пол окно закрылось и аккаунт сохранился

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

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


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

@John_Silver, а, ну, так вызовите функцию регистрации аккаунта после выбора какого-либо пункта меню да и все. Только предварительно придется где-то сохранить пароль (в предложенном далее варианте используется новый элемент перечисления, строка pPassword, который [элемент] вам придется добавить).

 

Спойлер

if(dialogid == 2)// Ид диалога для регистрации
{
    if(response)// Если игрок нажал первую кнопку
    {
        if(!strlen(inputtext))// Если окно ввода пустое, выводим диалог снова
        {
            SPD(playerid, 2, DSI,"{FF0000}• {FF4500}Регистрация {FFFFFF}|{FFFF00} Пароль {FF0000}•",
            "{FFFFFF}Добро пожаловать на {FFD700}Visonfa Role-Play!{FFFFFF}\n\
            Данный аккаунт не зарегестрирован на нашем сервере\n\
            Для входа в игру придумайте пароль\n\
            {FF0000}\tПримечание:{FFFF00}\n\
            \t• Длинна пароля должна быть до 24 символов\n\
            \t• Чем надёжнее пароль тем труднее его взломать\n\
            \t• Админестрация сервера не несёт ответственности если вы потеряете свой пароль",
            "{FFFFFF}Далее","{FFFFFF}Выход");
            return 1;
        }
        new len = strlen(inputtext);
        if(len < 6)
        {
            SPD(playerid, 2, DSI,"{FF0000}• {FF4500}Регистрация {FFFFFF}|{FFFF00} Пароль {FF0000}•",
            "{FFFFFF}Добро пожаловать на {FFD700}Visonfa Role-Play!{FFFFFF}\n\
            Данный аккаунт не зарегестрирован на нашем сервере\n\
            Для входа в игру придумайте пароль\n\
            {FF0000}\tПримечание:{FFFF00}\n\
            \t• Длинна пароля должна быть до 24 символов\n\
            \t• Чем надёжнее пароль тем труднее его взломать\n\
            \t• Админестрация сервера не несёт ответственности если вы потеряете свой пароль",
            "{FFFFFF}Далее","{FFFFFF}Выход");
            return SCM(playerid, -1"Длинна пароля должна быть от 6 до 24 символов!");
        }
        if(len > 24)
        {
            SPD(playerid, 2, DSI,"{FF0000}• {FF4500}Регистрация {FFFFFF}|{FFFF00} Пароль {FF0000}•",
            "{FFFFFF}Добро пожаловать на {FFD700}Visonfa Role-Play!{FFFFFF}\n\
            Данный аккаунт не зарегестрирован на нашем сервере\n\
            Для входа в игру придумайте пароль\n\
            {FF0000}\tПримечание:{FFFF00}\n\
            \t• Длинна пароля должна быть до 24 символов\n\
            \t• Чем надёжнее пароль тем труднее его взломать\n\
            \t• Админестрация сервера не несёт ответственности если вы потеряете свой пароль",
            "{FFFFFF}Далее","{FFFFFF}Выход");
            return SCM(playerid, -1"Длинна пароля должна быть от 6 до 24 символов!");
        }
        new pass[24];// Массив с паролем
        strmid(Player[playerid][pPassword],inputtext,0,strlen(inputtext),24);// Считываем текст с диалога
        // здесь отобразите диалог выбора пола
        
        SPD(playerid, 3, DSL, "Регистрация выбор пола",
            "Мужской\n\
            Женский",
            "Выбор""Выход");
        
    }
    else// Если игрок нажал Esc, вернём ему диалог
    {
        return Kick(playerid);
    }
}

if(dialogid == 3)
{
    if(!response) return Kick(playerid);
    switch(listitem)
    {
        case 0:
        {
            Player[playerid][pGender] = 1;
        }
        case 1:
        {
            Player[playerid][pGender] = 2;
        }
    }
    
    OnPlayerLogin(playerid, Player[playerid][pPassword]);
}

 

 

И да, я бы на вашем месте убрал функцию сохранения аккаунта из OnPlayerDisconnect. Дело в том, что если сервер по какой-либо причине ляжет, эта функция не будет вызвана для игроков, находящихся на сервере. С точки зрения надежности и оптимизации более успешным является подход, при котором вы сохраняете все изменения по мере наступления событий, требующих эти сохранения. У игрока изменилось количество денег – сохраните сейчас; у игрока изменился уровень – сохраните сейчас. Не нужно ждать, пока он будет выходить с сервера, чтобы сохранить эти изменения, иначе можете все потерять.

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


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

@Cawfee  Спасибо большое, всё работает!

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


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

@John_Silver Переходите с mxINI на MySQL. mxINI банально устарел так то.

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

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


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

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