Question

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

Делал свой мод на 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;
}

 

Share this post


Link to post

5 answers to this question

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

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

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

 

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

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

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

Share this post


Link to post
  • 0

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

Edited by John_Silver

Share this post


Link to post
  • 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. Дело в том, что если сервер по какой-либо причине ляжет, эта функция не будет вызвана для игроков, находящихся на сервере. С точки зрения надежности и оптимизации более успешным является подход, при котором вы сохраняете все изменения по мере наступления событий, требующих эти сохранения. У игрока изменилось количество денег – сохраните сейчас; у игрока изменился уровень – сохраните сейчас. Не нужно ждать, пока он будет выходить с сервера, чтобы сохранить эти изменения, иначе можете все потерять.

Share this post


Link to post
  • 0

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

Share this post


Link to post
  • 0

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

Edited by NO2037

Share this post


Link to post
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.