PDA

Просмотр полной версии : [Вопрос] Не создается файл .ini (mxINI)



Desulaid
25.09.2015, 15:35
Здравствуйте, у меня почему-то не создается файл. Странно, что при использовании как пути к файлу "scriptfiles/accounts", то файл создается, а если "../src/accounts/", то ничего.

Вот весь код:


// Подключение всех стандартных инклюдов
#include "a_samp"
// Подключение всех нестандартных инклюдов
#include "src"

#if defined MAX_PLAYERS
#undef MAX_PLAYERS
#define MAX_PLAYERS (50)
#else
#define MAX_PLAYERS (50)
#endif

new player_name[MAX_PLAYERS][MAX_PLAYER_NAME],
player_password[MAX_PLAYERS][MAX_PLAYER_PASSWORD];

main()
{
//print("\n\t- - -\n\tAuthor: Darge\n\tEmail: [email protected]\n\t- - -\n");
}

public OnGameModeInit()
{
SetGameModeText("Blank Script");
AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
return 1;
}

public OnPlayerConnect(playerid)
{
GetPlayerName(playerid, player_name[playerid], MAX_PLAYER_NAME);

new account[21+MAX_PLAYER_NAME];
format(account, sizeof(account), "../src/accounts/%s.ini", player_name[playerid]);
if(!fexist(account))
{
ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Регистрация", "Для регистрации введите пароль:", "Далее", "Выход");
}
else if(fexist(account))
{
ShowPlayerDialog(playerid, 2, DIALOG_STYLE_INPUT, "Авторизация", "Для авторизации введите пароль:", "Далее", "Выход");
}
return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
SavePlayer(playerid);
return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch(dialogid)
{
case 1:
{
if(!response)
{
return Kick(playerid);
}
else if(response)
{
if(!strlen(inputtext))
{
return ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Ошибка", "Введите ваш пароль:", "Далее", "Выход");
}
new account[21+MAX_PLAYER_NAME];
format(account, sizeof(account), "../src/accounts/%s.ini", player_name[playerid]);
if(fexist(account))
{
return ShowPlayerDialog(playerid, 2, DIALOG_STYLE_INPUT, "Авторизация", "Для авторизации введите пароль:", "Далее", "Выход");
}
else
{
return CreateAccount(playerid, inputtext);
}
}
}
case 2:
{
if(!response)
{
return Kick(playerid);
}
else if(response)
{
new account[21+MAX_PLAYER_NAME];
if(!strlen(inputtext))
{
return ShowPlayerDialog(playerid, 2, DIALOG_STYLE_INPUT, "Ошибка", "Введите ваш пароль:", "Далее", "Выход");
}
format(account, sizeof(account), "../src/accounts/%s.ini", player_name[playerid]);
if(!fexist(account))
{
return ShowPlayerDialog(playerid, 1 , DIALOG_STYLE_INPUT, "Регистрация", "Для регистрации введите пароль:", "Далее", "Выход");
}
else
{
new iniFile = ini_openFile(account);
ini_getString(iniFile, "Пароль", player_password[playerid]);
ini_closeFile(iniFile);
if(!strcmp(inputtext, player_password[playerid], true))
{
return OnPlayerLogin(playerid);
}
else
{
return ShowPlayerDialog(playerid, 2, DIALOG_STYLE_INPUT, "Ошибка", "Вы ввели неверный пароль!", "Далее", "Выход");
}
}
}
}
}
return 1;
}

stock CreateAccount(playerid, password[])
{
new account[21+MAX_PLAYER_NAME];
format(account, sizeof(account), "../src/accounts/%s.ini", player_name[playerid]);
if(fexist(account))
{
return ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Авторизация", "Введите пароль:", "Далее", "Выход");
}
new iniFile = ini_createFile(account);
if(iniFile < 0) ini_openFile (account);
{
ini_setString(iniFile, "Пароль", password);
ini_setInteger(iniFile, "Деньги", 10000);
ini_closeFile(iniFile);
OnPlayerLogin(playerid);
}
return 1;
}

stock OnPlayerLogin(playerid)
{
new account[21+MAX_PLAYER_NAME];
format(account, sizeof(account), "../src/accounts/%s.ini", player_name[playerid]);
new iniFile = ini_openFile(account);
ini_getString(iniFile, "Пароль", player_password[playerid], MAX_PLAYER_PASSWORD);
ini_closeFile(iniFile);
ResetPlayerMoney(playerid);
SpawnPlayer(playerid);
return 1;
}

stock SavePlayer(playerid)
{
new account[21+MAX_PLAYER_NAME];
format(account, sizeof(account), "../src/accounts/%s.ini", player_name[playerid]);
new iniFile = ini_openFile(account);
ini_setString(iniFile, "Пароль", player_password[playerid]);
ini_closeFile(iniFile);
return 1;
}

Или это значит, что mxINI создает файлы только в папке scriptfiles?

Daniel_Cortez
25.09.2015, 17:28
Файловые функции в Pawn не поддерживают символические ссылки. По крайней мере, в той версии интерпретатора, которая используется в SA:MP. Логично, что и в mxINI такие ссылки тоже не будут поддерживаться.
Так что либо оперируйте файлами в папке scriptfiles. Либо можно форкнуть mxINI и заменить в нём обращения к стандартным файловым функциям на функции из какого-нибудь плагина, который специально создан для обхода лимита на хранение файлов только в scriptfiles. Наверняка на forum.sa-mp.com есть что-то подобное.

Desulaid
25.09.2015, 17:58
Файловые функции в Pawn не поддерживают символические ссылки. По крайней мере, в той версии интерпретатора, которая используется в SA:MP. Логично, что и в mxINI такие ссылки тоже не будут поддерживаться.
Так что либо оперируйте файлами в папке scriptfiles. Либо можно форкнуть mxINI и заменить в нём обращения к стандартным файловым функциям на функции из какого-нибудь плагина, который специально создан для обхода лимита на хранение файлов только в scriptfiles. Наверняка на forum.sa-mp.com есть что-то подобное.

Лень рыться, лучше буду по старому доброму методу scriptfiles/accounts/игрок.ini. Тему можно закрывать :)

Gressie
09.10.2015, 14:52
Проверьте созданы ли у вас папки: .., src, accounts. А вообще попробуйте использовать без папки .. а путь указать: src/accounts/%s.ini При этом, создайте папки в scriptfiles с названиями: src, accounts.

Desulaid
09.10.2015, 15:11
Проверьте созданы ли у вас папки: .., src, accounts. А вообще попробуйте использовать без папки .. а путь указать: src/accounts/%s.ini При этом, создайте папки в scriptfiles с названиями: src, accounts.

Забыл написать, что проблема решена. Решение - не пытаться создавать файл вне scriptfiles :) Тему можно закрыть.

Daniel_Cortez
09.10.2015, 15:18
Проверьте созданы ли у вас папки: .., src, accounts.
Нельзя сделать папку с именем "..", эта комбинация зарезервирована для обозначения родительских папок в символических ссылках.
И да, если обратите внимание на предыдущие посты, то сможете увидеть, что на вопрос уже был дан развёрнутый ответ и проблема решена (вернее, найден обход, "в лоб" её не решить).

Тема закрыта и перемешена в архив вопросов.

UPD: Ninja'd by the topic starter.