Просмотр полной версии : [Вопрос] Настройки мода.
AlexDizaro
01.01.2016, 11:05
Как реализовать настройки в моде? Хотел на defin'ах :
#define MySQL_ConfigFile
#if !defined MySQL_ConfigFile
#define MYSQL_HOST "localhost"
#define MYSQL_USER "root"
#define MYSQL_DATABASE "palladium"
#define MYSQL_PASSWORD ""
#endif
Но комментировать (//#define MySQL_ConfigFile) что бы отключить не очень
Делать на переменных или все же можно как то сделать?
Хотелось бы что бы было примерно так :
#define MySQL_ConfigFile true
#if !MySQL_ConfigFile == true
#define ...
Может глупо, но все же хочу реализовать настройку мода, где надо будет поменять лишь значение бинда
Desulaid
01.01.2016, 12:34
Как-то так, карочи, если следовать вашей идее. Но варианта с таким вот использованием - его нет.
#if !defined MYSQL_CONNECT_SETTINGS
#define MYSQL_HOST "localhost"
#define MYSQL_USER "root"
#define MYSQL_DATABASE "palladium"
#define MYSQL_PASSWORD ""
#define MYSQL_CONNECT_ALL MYSQL_HOST, MYSQL_USER, MYSQL_DATABASE, MYSQL_PASSWORD
#define MYSQL_CONNECT_SETTINGS
#endif
Я давно делал себе инклуд, который и подключался к бд, и отключался при рестарте и выключении мода. Не люблю я этот момент, когда надо ползти в низ и что-то искать, да и информация для разового использования мне сверху не очень, напрягает только.
/*
* Настройка подключения игрового мода с MySQL базой данных
*
*/
#if !defined mysql_included
#error File a_mysql.inc is not included
#endif
// Настройки подключения
#define MYSQL_HOST "localhost"
#define MYSQL_USER "root"
#define MYSQL_PASSWORD ""
#define MYSQL_DATABASE "base"
// id подключения
new cHandle;
// Подключение соединения с базой данных
// при старте сервера
public OnGameModeInit()
{
cHandle = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_DATABASE, MYSQL_PASSWORD);
if(mysql_errno())
print("[MySQL] Связь с базой данных не установлена\n* Проверьте введенные вами данные\n\n");
else
print("[MySQL] Связь с базой данных установлена\n\n");
#if defined MySQL__OnGameModeInit
MySQL__OnGameModeInit();
return 1;
#endif
}
#if defined _ALS_OnGameModeInit
#undef OnGameModeInit
#else
#define _ALS_OnGameModeInit
#endif
#define OnGameModeInit MySQL__OnGameModeInit
#if defined MySQL__OnGameModeInit
forward MySQL__OnGameModeInit();
#endif
// Отключение соединения с базой данных
// при рестарте сервера
public OnGameModeExit()
{
mysql_close(cHandle);
print("[MySQL] Связь с базой данных была отключена\nИдет подключение ...\n\n");
#if defined MySQL__OnGameModeExit
MySQL__OnGameModeExit();
return 1;
#endif
}
#if defined _ALS_OnGameModeExit
#undef OnGameModeExit
#else
#define _ALS_OnGameModeExit
#endif
#define OnGameModeExit MySQL__OnGameModeExit
#if defined MySQL__OnGameModeExit
forward MySQL__OnGameModeExit();
#endif
$continue$
01.01.2016, 12:50
Не есть хорошим метод. Почему информацию о базе данных нельзя хранить в. * .cfg?
Как-то так, карочи, если следовать вашей идее. Но варианта с таким вот использованием - его нет.
#if !defined MYSQL_CONNECT_SETTINGS
#define MYSQL_HOST "localhost"
#define MYSQL_USER "root"
#define MYSQL_DATABASE "palladium"
#define MYSQL_PASSWORD ""
#define MYSQL_CONNECT_ALL MYSQL_HOST, MYSQL_USER, MYSQL_DATABASE, MYSQL_PASSWORD
#define MYSQL_CONNECT_SETTINGS
#endif
Я давно делал себе инклуд, который и подключался к бд, и отключался при рестарте и выключении мода. Не люблю я этот момент, когда надо ползти в низ и что-то искать, да и информация для разового использования мне сверху не очень, напрягает только.
/*
* Настройка подключения игрового мода с MySQL базой данных
*
*/
#if !defined mysql_included
#error File a_mysql.inc is not included
#endif
// Настройки подключения
#define MYSQL_HOST "localhost"
#define MYSQL_USER "root"
#define MYSQL_PASSWORD ""
#define MYSQL_DATABASE "base"
// id подключения
new cHandle;
// Подключение соединения с базой данных
// при старте сервера
public OnGameModeInit()
{
cHandle = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_DATABASE, MYSQL_PASSWORD);
if(mysql_errno())
print("[MySQL] Связь с базой данных не установлена\n* Проверьте введенные вами данные\n\n");
else
print("[MySQL] Связь с базой данных установлена\n\n");
#if defined MySQL__OnGameModeInit
MySQL__OnGameModeInit();
return 1;
#endif
}
#if defined _ALS_OnGameModeInit
#undef OnGameModeInit
#else
#define _ALS_OnGameModeInit
#endif
#define OnGameModeInit MySQL__OnGameModeInit
#if defined MySQL__OnGameModeInit
forward MySQL__OnGameModeInit();
#endif
// Отключение соединения с базой данных
// при рестарте сервера
public OnGameModeExit()
{
mysql_close(cHandle);
print("[MySQL] Связь с базой данных была отключена\nИдет подключение ...\n\n");
#if defined MySQL__OnGameModeExit
MySQL__OnGameModeExit();
return 1;
#endif
}
#if defined _ALS_OnGameModeExit
#undef OnGameModeExit
#else
#define _ALS_OnGameModeExit
#endif
#define OnGameModeExit MySQL__OnGameModeExit
#if defined MySQL__OnGameModeExit
forward MySQL__OnGameModeExit();
#endif
Desulaid
01.01.2016, 13:52
Не есть хорошим метод. Почему информацию о базе данных нельзя хранить в. * .cfg?
Действительно, почему?
AlexDizaro
01.01.2016, 16:50
Не есть хорошим метод. Почему информацию о базе данных нельзя хранить в. * .cfg?
Я и хотел это реализовать.
Что бы можно было переключаться между конфигом в файле и макросу.
Т.е можно в моде поставить
#define MySQL_ConfigFile true - и тогда данные будут в файле храниться иначе #define MySQL_Host...
Desulaid
01.01.2016, 17:10
Я и хотел это реализовать.
Что бы можно было переключаться между конфигом в файле и макросу.
Т.е можно в моде поставить
#define MySQL_ConfigFile true - и тогда данные будут в файле храниться иначе #define MySQL_Host...
Как я уже говорил, такого варианта использования кода с вашей целью - его нет! Но можете взять mxINI или же стандартный file.INC и загружать инфу от туда, если данные не указывать, то ставится значение по умолчанию. Я делал команду (клицкай) (http://pro-pawn.ru/showthread.php?12814-Restart)с похожим алгоритмом. Можете как за основу посмотреть. Если найду время, то выложу в эту тему свой рабочий вариант, его только написать надо :3
Desulaid
01.01.2016, 18:03
Как я уже говорил, такого варианта использования кода с вашей целью - его нет! Но можете взять mxINI или же стандартный file.INC и загружать инфу от туда, если данные не указывать, то ставится значение по умолчанию. Я делал команду (клицкай) (http://pro-pawn.ru/showthread.php?12814-Restart)с похожим алгоритмом. Можете как за основу посмотреть. Если найду время, то выложу в эту тему свой рабочий вариант, его только написать надо :3
ADD: не совсем кфг файл, но ФАЙЛ.
/*
Загрузка данных из '../scriptfiles/mysql_settings.txt' для подключения с базой данных
(C) Copyright 2015, Untonyst =3
Пример содержимого файла mysql_settings.txt:
localhost,tensa,123qwe,base
хост, имя пользователя, пароль, имя базы данных
Аля большой костыль!
*/
// если нет инклуда a_mysql.inc, то исключим НАШ инклуд на стадии компиляции
#if !defined mysql_included
//#error File a_mysql.inc is not included
#endinput
#endif
// если нет инклуда sscanf2.inc, то исключим НАШ инклуд на стадии компиляции
#if !defined sscanf
//#error File sscanf2.inc is not included
#endinput
#endif
// настройки подключения по умолчанию, если файла настроек не обнаружено
#define DEFAUL_MYSQL_HOST "127.0.0.1"
#define DEFAUL_MYSQL_USER "root"
#define DEFAUL_MYSQL_PASSWORD ""
#define DEFAUL_MYSQL_DATABASE "base"
// id подключения
new cHandle;
public OnGameModeInit()
// подключение соединения с базой данных при старте сервера
{
new File:file_handle = fopen("mysql_settings.txt", io_read), buf[20*4+1], mysql_host[20], mysql_user[20], mysql_password[20], mysql_database[20];
if (!fexist("mysql_settings.txt"))
// если файла настроек нет, то используем данные по умолчанию
{
mysql_host = DEFAUL_MYSQL_HOST;
mysql_user = DEFAUL_MYSQL_USER;
mysql_password = DEFAUL_MYSQL_PASSWORD;
mysql_database = DEFAUL_MYSQL_DATABASE;
}
else
{
fread(file_handle, buf);
sscanf(buf, "p<,>s[20]s[20]s[20]s[20]", mysql_host, mysql_user, mysql_password, mysql_database);
fclose(file_handle);
// это так, для сведения
printf("===============\nХост: %s\nПользователь: %s\nПароль: %s\nБД: %s\n===============\n\n",mysql_host, mysql_user, mysql_password, mysql_database);
}
cHandle = mysql_connect(mysql_host, mysql_user, mysql_database, mysql_password);
if(mysql_errno())
print("[MySQL] Связь с базой данных не установлена\n* Проверьте введенные вами данные\n\n");
else
print("[MySQL] Связь с базой данных установлена\n\n");
#if defined MySQL__OnGameModeInit
MySQL__OnGameModeInit();
return 1;
#endif
}
#if defined _ALS_OnGameModeInit
#undef OnGameModeInit
#else
#define _ALS_OnGameModeInit
#endif
#define OnGameModeInit MySQL__OnGameModeInit
#if defined MySQL__OnGameModeInit
forward MySQL__OnGameModeInit();
#endif
public OnGameModeExit()
// отключение соединения с базой данных при рестарте сервера
{
mysql_close(cHandle);
print("[MySQL] Связь с базой данных была отключена\nИдет подключение ...\n\n");
#if defined MySQL__OnGameModeExit
MySQL__OnGameModeExit();
return 1;
#endif
}
#if defined _ALS_OnGameModeExit
#undef OnGameModeExit
#else
#define _ALS_OnGameModeExit
#endif
#define OnGameModeExit MySQL__OnGameModeExit
#if defined MySQL__OnGameModeExit
forward MySQL__OnGameModeExit();
#endif
Все удовлетворены?
Daniel_Cortez
01.01.2016, 18:06
Я и хотел это реализовать.
Что бы можно было переключаться между конфигом в файле и макросу.
Т.е можно в моде поставить
#define MySQL_ConfigFile true - и тогда данные будут в файле храниться иначе #define MySQL_Host...
В таком случае, работайте с файловыми функциями: fopen, fclose, fread, fexist.
Впрочем, не могу сказать, что понимаю вашу логику. Зачем делать настройки в отдельном файле, когда возможности Pawn позволяют с лёгкостью сделать их в моде?
В английском языке ситуацию, в которой убивают два зайца одним выстрелом, называют "win-win". Так вот, здесь, наоборот, получается ситуация "lose-lose". Вы не только усложняете разработку для себя, но ещё и упрощаете жизнь хакерам, ведь скопипастить текст из файла куда легче, чем извлекать его из бинарника, да ещё и в 4-байтовой кодировке.
Для сравнения, в моде можно не просто сохранить настройки, но и зашифровать их и расшифровывать только при запуске сервера. Если кто-то украдёт ваш мод, то этому "кому-то" придётся изрядно попотеть, чтобы получить настройки: как минимум, нужно будет извлечь зашифрованные данные и вручную восстановить из опкодов AMX функцию для расшифровки, т.к. нормальных декомпиляторов для Pawn нет.
AlexDizaro
01.01.2016, 18:25
В таком случае, работайте с файловыми функциями: fopen, fclose, fread, fexist.
Впрочем, не могу сказать, что понимаю вашу логику. Зачем делать настройки в отдельном файле, когда возможности Pawn позволяют с лёгкостью сделать их в моде?
В английском языке ситуацию, в которой убивают два зайца одним выстрелом, называют "win-win". Так вот, здесь, наоборот, получается ситуация "lose-lose". Вы не только усложняете разработку для себя, но ещё и упрощаете жизнь хакерам, ведь скопипастить текст из файла куда легче, чем извлекать его из бинарника, да ещё и в 4-байтовой кодировке.
Для сравнения, в моде можно не просто сохранить настройки, но и зашифровать их и расшифровывать только при запуске сервера. Если кто-то украдёт ваш мод, то этому "кому-то" придётся изрядно попотеть, чтобы получить настройки: как минимум, нужно будет извлечь зашифрованные данные и вручную восстановить из опкодов AMX функцию для расшифровки, т.к. нормальных декомпиляторов для Pawn нет.
Я хочу сделать мод-платформу для себя
У которого будет гибкая настройка под мои нужды.
$continue$
02.01.2016, 17:46
В таком случае, работайте с файловыми функциями: fopen, fclose, fread, fexist.
Впрочем, не могу сказать, что понимаю вашу логику. Зачем делать настройки в отдельном файле, когда возможности Pawn позволяют с лёгкостью сделать их в моде?
В английском языке ситуацию, в которой убивают два зайца одним выстрелом, называют "win-win". Так вот, здесь, наоборот, получается ситуация "lose-lose". Вы не только усложняете разработку для себя, но ещё и упрощаете жизнь хакерам, ведь скопипастить текст из файла куда легче, чем извлекать его из бинарника, да ещё и в 4-байтовой кодировке.
Для сравнения, в моде можно не просто сохранить настройки, но и зашифровать их и расшифровывать только при запуске сервера. Если кто-то украдёт ваш мод, то этому "кому-то" придётся изрядно попотеть, чтобы получить настройки: как минимум, нужно будет извлечь зашифрованные данные и вручную восстановить из опкодов AMX функцию для расшифровки, т.к. нормальных декомпиляторов для Pawn нет.
В чем проблема, хранить зашифрованный пароль и прочии настройки в файле? (Ну или .cfg)
Linux же никто не мешает хранить Пароди от пользователей в файле.
vovandolg
02.01.2016, 21:28
Немного оффтопа
В чём то идея хорошая такого подключения, моды можно толкать при этом зная что его не раскодируют и не украдут, а в чём то и плохо, до паролей добраться легче, но опять же кто полезет из разрабов хостинга смотреть пароли если у них и так всё на ладошке в бд) всё таки это хорошая идея:smoke:
AlexDizaro
03.01.2016, 11:45
Немного оффтопа
В чём то идея хорошая такого подключения, моды можно толкать при этом зная что его не раскодируют и не украдут, а в чём то и плохо, до паролей добраться легче, но опять же кто полезет из разрабов хостинга смотреть пароли если у них и так всё на ладошке в бд) всё таки это хорошая идея:smoke:
Кажется меня так и никто не понял :sorry:
Под гибкой настройкой я имел ввиду возможность переключения в настройках возможность сохранения в файл или же в самом моде
Daniel_Cortez
03.01.2016, 13:21
В чем проблема, хранить зашифрованный пароль и прочии настройки в файле? (Ну или .cfg)
В том, что злоумышленнику достаточно будет только восстановить функцию для расшифровки. В Pawn это достаточно просто, на самом деле, т.к. используется совсем небольшой набор инструкций. В то же время, если хранить пароль внутри мода, будет больше возможностей спрятать его среди прочих данных. Или можно вообще составить пароль из других данных в моде (например, взять какие-нибудь случайные символы из строк, используемых под правила игры на сервере, сообщения об ошибках и т.п.) и этот пароль использовать для доступа к БД. Чтобы расшифровать такой пароль, злоумышленнику придётся не только восстановить функцию, но ещё и найти все те строки, которые используются для составления пароля.
Кажется меня так и никто не понял :sorry:
Под гибкой настройкой я имел ввиду возможность переключения в настройках возможность сохранения в файл или же в самом моде
Так опишите ситуацию более подробно. Что именно Вы хотите сделать, в каких ситуациях собираетесь использовать и для чего это вообще нужно. Прямо разжуйте на пальцах и тогда Вам сразу помогут. А угадывать желания по тексту тут никто не умеет
$continue$
03.01.2016, 17:15
В том, что злоумышленнику достаточно будет только восстановить функцию для расшифровки. В Pawn это достаточно просто, на самом деле, т.к. используется совсем небольшой набор инструкций. В то же время, если хранить пароль внутри мода, будет больше возможностей спрятать его среди прочих данных. Или можно вообще составить пароль из других данных в моде (например, взять какие-нибудь случайные символы из строк, используемых под правила игры на сервере, сообщения об ошибках и т.п.) и этот пароль использовать для доступа к БД. Чтобы расшифровать такой пароль, злоумышленнику придётся не только восстановить функцию, но ещё и найти все те строки, которые используются для составления пароля.
Прибавляетем к паролю пару символов слева, по середине и в конец.
Используем Base64 (https://ru.m.wikipedia.org/wiki/Base64) (вот, кстати плагин (http://forum.sa-mp.com/showthread.php?t=271230))
И тогда мне будет очень, жаль "Тру хаскеров" которые будут это переводить. Алгоритм подстановки символов можно сделать через рандом.
А ещё можно одну часть пароля закодировать в Base64, а вторую часть например в sha512.
Потом скрепить строку и готово.
А кто чёрт возьми будет знать, что так сделано?
Daniel_Cortez
03.01.2016, 18:14
А ещё можно одну часть пароля закодировать в Base64, а вторую часть например в sha512.
Потом скрепить строку и готово.
А кто чёрт возьми будет знать, что так сделано?
Тот, кто может дизассемблировать мод и восстановить шифрующую функцию. Есть такие люди.
Кстати говоря, с плагином даже проще, чем с кастомной функцией: восстанавливать нужно только код на Pawn и чем меньше такого кода, тем проще расшифровать пароль.
Кажется меня так и никто не понял :sorry:
Под гибкой настройкой я имел ввиду возможность переключения в настройках возможность сохранения в файл или же в самом моде
new const DATABASE_CONFIG_FILE_NAME = "dbconf.txt";
#define DATABASE__USE_CONFIG_FILE
#define DATABASE__DEFAULT_HOST "localhost"
#define DATABASE__DEFAULT_USER "root"
#define DATABASE__DEFAULT_NAME "palladium"
#define DATABASE__DEFAULT_PASSWORD ""
#if !defined USE_MYSQL_CONFIG_FILE
new const database_host[] = DATABASE__DEFAULT_HOST;
new const database_user[] = DATABASE__DEFAULT_USER;
new const database_name[] = DATABASE__DEFAULT_NAME;
new const database_pass[] = DATABASE__DEFAULT_PASSWORD;
#else // !defined USE_MYSQL_CONFIG_FILE
new database_host[64] = DATABASE__DEFAULT_HOST;
new database_user[16] = DATABASE__DEFAULT_USER;
new database_name[32] = DATABASE__DEFAULT_NAME;
new database_pass[32] = DATABASE__DEFAULT_PASSWORD;
public OnGameModeInit()
{
new File:config_file_handle = fopen(DATABASE_CONFIG_FILE_NAME);
if (_:config_file_handle == 0)
{
printf(
"Warning: Couldn't open file %s! Applying default settings...",
DATABASE_CONFIG_FILE_NAME
);
database_host = DATABASE__DEFAULT_HOST;
database_user = DATABASE__DEFAULT_USER;
database_name = DATABASE__DEFAULT_NAME;
database_pass = DATABASE__DEFAULT_PASSWORD;
return;
}
static const read_warning_str[] =
"Warning: Length of the %s string exceeds the limit of %d characters.";
if (fread(config_file_handle, database_host) > sizeof(database_host) - 1)
printf(read_warning_str, "host", sizeof(database_host) - 1);
if (fread(config_file_handle, database_user) > sizeof(database_user) - 1)
printf(read_warning_str, "user", sizeof(database_user) - 1);
if (fread(config_file_handle, database_name) > sizeof(database_name) - 1)
printf(read_warning_str, "user", sizeof(database_name) - 1);
if (fread(config_file_handle, database_pass) > sizeof(database_pass) - 1)
printf(read_warning_str, "user", sizeof(database_pass) - 1);
fclose(config_file_handle);
#if defined mysql_config__OnGameModeInit
mysql_config__OnGameModeInit();
#endif
}
#if defined _ALS_OnGameModeInit
#undef OnGameModeInit
#else
#define _ALS_OnGameModeInit
#endif
forward mysql_config__OnGameModeInit();
#define OnGameModeInit mysql_config__OnGameModeInit
#endif // !defined USE_MYSQL_CONFIG_FILE
P.S.: Код не тестировался, используйте на свой страх и риск.
vovandolg
26.02.2016, 23:45
P.S.: Код не тестировался, используйте на свой страх и риск.
D:\Program\ÀðáàéòåíÑÀÌÏ\pawnoÓËÜÒ\mod.pwn(44746) : warning 203: symbol is never used: "DATABASE_CONFIG_FILE_NAME"
D:\Program\ÀðáàéòåíÑÀÌÏ\pawnoÓËÜÒ\mod.pwn(44746) : warning 203: symbol is never used: "database_host"
D:\Program\ÀðáàéòåíÑÀÌÏ\pawnoÓËÜÒ\mod.pwn(44746) : warning 203: symbol is never used: "database_name"
D:\Program\ÀðáàéòåíÑÀÌÏ\pawnoÓËÜÒ\mod.pwn(44746) : warning 203: symbol is never used: "database_pass"
D:\Program\ÀðáàéòåíÑÀÌÏ\pawnoÓËÜÒ\mod.pwn(44746) : warning 203: symbol is never used: "database_user"
Что тут не так могло пойти?
D:\Program\ÀðáàéòåíÑÀÌÏ\pawnoÓËÜÒ\mod.pwn(44746) : warning 203: symbol is never used: "DATABASE_CONFIG_FILE_NAME"
D:\Program\ÀðáàéòåíÑÀÌÏ\pawnoÓËÜÒ\mod.pwn(44746) : warning 203: symbol is never used: "database_host"
D:\Program\ÀðáàéòåíÑÀÌÏ\pawnoÓËÜÒ\mod.pwn(44746) : warning 203: symbol is never used: "database_name"
D:\Program\ÀðáàéòåíÑÀÌÏ\pawnoÓËÜÒ\mod.pwn(44746) : warning 203: symbol is never used: "database_pass"
D:\Program\ÀðáàéòåíÑÀÌÏ\pawnoÓËÜÒ\mod.pwn(44746) : warning 203: symbol is never used: "database_user"
Что тут не так могло пойти?
А ты "mysql_connect" не забыл изменить, вставив эти переменные?
vovandolg
27.02.2016, 00:10
//и куда его вписывать если он в инклуде как бы уже вписан
D:\Program\12\pawno12\mod.pwn(44747) : warning 203: symbol is never used: "DATABASE_CONFIG_FILE_NAME"
//Поменял в самом моде
ConnectMySQL(database_host, database_user, database_name, database_pass);
//и выбило
error 035: argument type mismatch (argument 1)
//Вот как построен коннект
stock ConnectMySQL(host[], user[], db[], pass[])
{
connects = mysql_connect(host, user, db, pass);
if(mysql_errno() == 0) printf("Подключение к базе успешно");
else return printf("Подключиться к базе не удалось");
mysql_function_query(connects,"SET NAMES cp1251",false,"","");
mysql_function_query(connects,"set character_set_client=\'cp1251\'",false,"","");
mysql_function_query(connects,"set character_set_results=\'cp1251\'",false,"","");
mysql_function_query(connects,"set collation_connection=\'cp1251_general_ci\'",false,"","");
mysql_function_query(connects,"SELECT * FROM `bizz`",true,"LoadBizz","");
mysql_function_query(connects,"SELECT * FROM `House`",true,"LoadProperty","");
mysql_function_query(connects,"SELECT * FROM `meria`",true,"OnLoadKaznaCallback","");
mysql_function_query(connects,"SELECT * FROM `other`",true,"OnLoadMaterialsCallback","");
return 1;
}
В общем, вот как у меня вышло без перехвата
#define USE_MYSQL_CONFIG_FILE
#define DATABASE__DEFAULT_HOST "localhost"
#define DATABASE__DEFAULT_USER "root"
#define DATABASE__DEFAULT_NAME "sa-mp"
#define DATABASE__DEFAULT_PASSWORD ""
#if !defined USE_MYSQL_CONFIG_FILE
new const database_host[] = DATABASE__DEFAULT_HOST;
new const database_user[] = DATABASE__DEFAULT_USER;
new const database_name[] = DATABASE__DEFAULT_NAME;
new const database_pass[] = DATABASE__DEFAULT_PASSWORD;
#else
new const DATABASE_CONFIG_FILE_NAME[] = "dbconf.txt";
new database_host[64] = DATABASE__DEFAULT_HOST;
new database_user[16] = DATABASE__DEFAULT_USER;
new database_name[32] = DATABASE__DEFAULT_NAME;
new database_pass[32] = DATABASE__DEFAULT_PASSWORD;
#endif
public OnGameModeInit()
{
#if defined USE_MYSQL_CONFIG_FILE
new File:config_file_handle = fopen(DATABASE_CONFIG_FILE_NAME);
if (_:config_file_handle == 0)
{
printf(
"Warning: Couldn't open file %s! Applying default settings...",
DATABASE_CONFIG_FILE_NAME
);
strcat(database_host, DATABASE__DEFAULT_HOST, 64);
strcat(database_user, DATABASE__DEFAULT_USER, 16);
strcat(database_name, DATABASE__DEFAULT_NAME, 32);
strcat(database_pass, DATABASE__DEFAULT_PASSWORD, 32);
}
static const read_warning_str[] =
"Warning: Length of the %s string exceeds the limit of %d characters.";
if (fread(config_file_handle, database_host) > sizeof(database_host) - 1)
printf(read_warning_str, "host", sizeof(database_host) - 1);
if (fread(config_file_handle, database_user) > sizeof(database_user) - 1)
printf(read_warning_str, "user", sizeof(database_user) - 1);
if (fread(config_file_handle, database_name) > sizeof(database_name) - 1)
printf(read_warning_str, "bd_name", sizeof(database_name) - 1);
if (fread(config_file_handle, database_pass) > sizeof(database_pass) - 1)
printf(read_warning_str, "bd_password", sizeof(database_pass) - 1);
fclose(config_file_handle);
strdel(database_host, strlen(database_host)-2, strlen(database_host));
strdel(database_user, strlen(database_user)-2, strlen(database_user));
strdel(database_name, strlen(database_name)-2, strlen(database_name));
strdel(database_pass, strlen(database_pass)-2, strlen(database_pass));
#endif
mysql_connect_ID = mysql_connect(database_host, database_user, database_name, database_pass);
return 1;
}
В коде DC достаточно недочётов. Сейчас попробую и версию с перехватом реализовать.
P.S. Только учти, что формат записей в конфиг-файле будет такой:
localhost
root
sa-mp
Для удобства работы можно перевести весь код под mxINI, дабы можно было к конфигурациям приписывать ключи, намекающие на предназначение этих конфигураций
- - - Добавлено - - -
Собственно, вот, вроде, рабочая версия перехвата
#define USE_MYSQL_CONFIG_FILE
#define DATABASE__DEFAULT_HOST "localhost"
#define DATABASE__DEFAULT_USER "root"
#define DATABASE__DEFAULT_NAME "palladium"
#define DATABASE__DEFAULT_PASSWORD ""
#if !defined USE_MYSQL_CONFIG_FILE
new const database_host[] = DATABASE__DEFAULT_HOST;
new const database_user[] = DATABASE__DEFAULT_USER;
new const database_name[] = DATABASE__DEFAULT_NAME;
new const database_pass[] = DATABASE__DEFAULT_PASSWORD;
#else // !defined USE_MYSQL_CONFIG_FILE
new const DATABASE_CONFIG_FILE_NAME[] = "dbconf.txt";
new database_host[64] = DATABASE__DEFAULT_HOST;
new database_user[16] = DATABASE__DEFAULT_USER;
new database_name[32] = DATABASE__DEFAULT_NAME;
new database_pass[32] = DATABASE__DEFAULT_PASSWORD;
public OnGameModeInit()
{
new File:config_file_handle = fopen(DATABASE_CONFIG_FILE_NAME);
if (_:config_file_handle == 0)
{
printf(
"Warning: Couldn't open file %s! Applying default settings...",
DATABASE_CONFIG_FILE_NAME
);
strcat(database_host, DATABASE__DEFAULT_HOST, 64);
strcat(database_user, DATABASE__DEFAULT_USER, 16);
strcat(database_name, DATABASE__DEFAULT_NAME, 32);
strcat(database_pass, DATABASE__DEFAULT_PASSWORD, 32);
return;
}
static const read_warning_str[] =
"Warning: Length of the %s string exceeds the limit of %d characters.";
if (fread(config_file_handle, database_host) > sizeof(database_host) - 1)
printf(read_warning_str, "host", sizeof(database_host) - 1);
if (fread(config_file_handle, database_user) > sizeof(database_user) - 1)
printf(read_warning_str, "user", sizeof(database_user) - 1);
if (fread(config_file_handle, database_name) > sizeof(database_name) - 1)
printf(read_warning_str, "name", sizeof(database_name) - 1);
if (fread(config_file_handle, database_pass) > sizeof(database_pass) - 1)
printf(read_warning_str, "pass", sizeof(database_pass) - 1);
fclose(config_file_handle);
strdel(database_host, strlen(database_host)-2, strlen(database_host));
strdel(database_user, strlen(database_user)-2, strlen(database_user));
strdel(database_name, strlen(database_name)-2, strlen(database_name));
strdel(database_pass, strlen(database_pass)-2, strlen(database_pass));
#if defined mysql_config__OnGameModeInit
mysql_config__OnGameModeInit();
#endif
}
#if defined _ALS_OnGameModeInit
#undef OnGameModeInit
#else
#define _ALS_OnGameModeInit
#endif
forward mysql_config__OnGameModeInit();
#define OnGameModeInit mysql_config__OnGameModeInit
#endif // !defined USE_MYSQL_CONFIG_FILE
И вот скрин того, как должен выглядеть файл:
http://i.imgur.com/v8dAA60.png
Если данные не указаны, под них обязательно должна быть пустая строка (даже если это последняя строка, как у меня, в случае с паролем)
vovandolg
27.02.2016, 00:53
Вопрос ещё, вот к примеру
#define DATABASE__DEFAULT_HOST "localhost"
хост можно же указать без файла вот тут или обязательно ковырять всё переделывать чтобы с инклуда читалось?
#define USE_MYSQL_CONFIG_FILE//Включение работы с файлом (если закомментировать, данные будут сразу браться из макросов)
//Значения по умолчанию
#define DATABASE__DEFAULT_HOST "localhost"
#define DATABASE__DEFAULT_USER "root"
#define DATABASE__DEFAULT_NAME "sa-mp"
#define DATABASE__DEFAULT_PASSWORD ""
#if !defined USE_MYSQL_CONFIG_FILE
new const database_host[] = DATABASE__DEFAULT_HOST;
new const database_user[] = DATABASE__DEFAULT_USER;
new const database_name[] = DATABASE__DEFAULT_NAME;
new const database_pass[] = DATABASE__DEFAULT_PASSWORD;
#else // !defined USE_MYSQL_CONFIG_FILE
#define DATABASE_CONFIG_FILE_NAME "dbconf.txt"//Имя файла, в котором будут хранится данные
#define DB_CONFIG_FIELD_HOST_NAME "Host"//Имя строки, в которой будет хранится адрес хостинга
#define DB_CONFIG_FIELD_USER_NAME "User"//Имя строки, в которой будет имя пользователя
#define DB_CONFIG_FIELD_DB_NAME "Database"//Имя строки, в которой будет хранится имя БД
#define DB_CONFIG_FIELD_PASS_NAME "Password"//Имя строки, в которой будет хранится пароль от БД
new database_host[64] = DATABASE__DEFAULT_HOST;
new database_user[16] = DATABASE__DEFAULT_USER;
new database_name[32] = DATABASE__DEFAULT_NAME;
new database_pass[32] = DATABASE__DEFAULT_PASSWORD;
public OnGameModeInit()
{
new config_file_handle = ini_openFile(DATABASE_CONFIG_FILE_NAME);
if (config_file_handle == -1)
{
printf("Warning: Не удалось открыть файл \"%s\"! Применение параметров по умолчанию ...", DATABASE_CONFIG_FILE_NAME);
config_file_handle = ini_createFile (DATABASE_CONFIG_FILE_NAME);
if (config_file_handle >= 0)
{
ini_setString (config_file_handle, DB_CONFIG_FIELD_HOST_NAME, database_host);
ini_setString (config_file_handle, DB_CONFIG_FIELD_USER_NAME, database_user);
ini_setString (config_file_handle, DB_CONFIG_FIELD_DB_NAME, database_name);
ini_setString (config_file_handle, DB_CONFIG_FIELD_PASS_NAME, database_pass);
printf("Файл \"%s\" успешно создан.", DATABASE_CONFIG_FILE_NAME);
}
else printf("Не удалось создать файл \"%s\". Код ошибки: %d", DATABASE_CONFIG_FILE_NAME, config_file_handle);
}
else
{
static const read_warning_str[] =
"Warning: Длина строки %s превышает лимит в %d символов.";
new read_error;
if (ini_getString(config_file_handle, "host", database_host) > sizeof(database_host) - 1)
printf(read_warning_str, DB_CONFIG_FIELD_HOST_NAME, sizeof(database_host) - 1), read_error = 1;
if (ini_getString(config_file_handle, "user", database_user) > sizeof(database_user) - 1)
printf(read_warning_str, DB_CONFIG_FIELD_USER_NAME, sizeof(database_user) - 1), read_error = 1;
if (ini_getString(config_file_handle, "user", database_name) > sizeof(database_name) - 1)
printf(read_warning_str, DB_CONFIG_FIELD_DB_NAME, sizeof(database_name) - 1), read_error = 1;
if (ini_getString(config_file_handle, "user", database_pass) > sizeof(database_pass) - 1)
printf(read_warning_str, DB_CONFIG_FIELD_PASS_NAME, sizeof(database_pass) - 1), read_error = 1;
if(!read_error) printf("Данные из \"%s\" успешно загружены", DATABASE_CONFIG_FILE_NAME);
}
ini_closeFile(config_file_handle);
#if defined mysql_config__OnGameModeInit
return mysql_config__OnGameModeInit();
#endif
}
#if defined _ALS_OnGameModeInit
#undef OnGameModeInit
#else
#define _ALS_OnGameModeInit
#endif
forward mysql_config__OnGameModeInit();
#define OnGameModeInit mysql_config__OnGameModeInit
#endif // !defined USE_MYSQL_CONFIG_FILE
Вот вариант для mxINI. Файл будет выглядеть так:
http://i.imgur.com/LjOxYU6.png
Если файла нет, сервер сам его создаст и запишет в него значения из макросов, в которых указаны значения по умолчанию.
$continue$
27.02.2016, 01:02
Кстати, говоря - велосипеды изобритаете.
Можно воспользоваться, готовой, накатыной лыжней.
тыч (https://github.com/pBlueG/SA-MP-MySQL/blob/master/src/CHandle.cpp#L157-L274), тыч (https://github.com/pBlueG/SA-MP-MySQL/blob/master/src/main.cpp#L89), тыч (https://github.com/pBlueG/SA-MP-MySQL/blob/master/src/natives.cpp#L202-L226), тыщ по ссылке (https://github.com/pBlueG/SA-MP-MySQL/blob/master/tests/test_data/mysql.ini)
Вопрос ещё, вот к примеру
#define DATABASE__DEFAULT_HOST "localhost"
хост можно же указать без файла вот тут или обязательно ковырять всё переделывать чтобы с инклуда читалось?
Сейчас хост читается из файла. Ты как хочешь сделать?
vovandolg
27.02.2016, 01:06
Он читается из текстового файла, а если допустим в этом же инклуде замутить?
Он читается из текстового файла, а если допустим в этом же инклуде замутить?
Ну убери всё, что касается чтения данных о хосте из файла и будет тебе счастье
$continue$
27.02.2016, 01:12
Меня - так понимаю, никто не хочет услышать:
Кстати, говоря - велосипеды изобритаете.
Можно воспользоваться, готовой, накатыной лыжней.
тыч (https://github.com/pBlueG/SA-MP-MySQL/blob/master/src/CHandle.cpp#L157-L274), тыч (https://github.com/pBlueG/SA-MP-MySQL/blob/master/src/main.cpp#L89), тыч (https://github.com/pBlueG/SA-MP-MySQL/blob/master/src/natives.cpp#L202-L226), тыщ по ссылке (https://github.com/pBlueG/SA-MP-MySQL/blob/master/tests/test_data/mysql.ini)
Меня - так понимаю, никто не хочет услышать:
Как ты видишь, твоя лыжа не подойдёт vovandolg. Все тебя услышали
vovandolg
27.02.2016, 01:24
Почитаю потом о других лыжах, может и пригодится куда)
- - - Добавлено - - -
Попытал вариант с mxINI:
[00:20:42] [ERROR] CMySQLConnection::Connect - (error #1045) Access denied for user 'тут_название_бд'@'localhost' (using password: YES)
[00:20:42] [ERROR] CMySQLConnection::Connect - (error #1045) Access denied for user 'тут_название_бд'@'localhost' (using password: YES)
[00:21:38] [ERROR] CMySQLQuery::Execute[OnPlayerRegCheck(d)] - (error #2006) MySQL server has gone away
[00:21:38] [WARNING] CMySQLQuery::Execute[OnPlayerRegCheck(d)] - lost connection, reconnecting..
[00:21:38] [ERROR] CMySQLConnection::Connect - (error #1045) Access denied for user 'тут_название_бд'@'localhost' (using password: YES)
[00:21:45] [ERROR] CMySQLQuery::Execute[()] - (error #2006) MySQL server has gone away
[00:21:45] [WARNING] CMySQLQuery::Execute[()] - lost connection, reconnecting..
[00:21:45] [ERROR] CMySQLConnection::Connect - (error #1045) Access denied for user 'тут_название_бд'@'localhost' (using password: YES)
[00:20:42] Данные из "dbconf.txt" успешно загружены
[00:20:42] Подключиться к базе не удалось
Забыл сказать если это важно юзаю mysql R34
____________________________________________
Решил проблему, в не обратил внимание что в файле наименование значений от предыдущего варианта..
$continue$
27.02.2016, 03:29
Только, что начал писать систему, попробовал использовать mysql_connect_file, оказывается в сурсах на GitHub она есть (https://github.com/pBlueG/SA-MP-MySQL/blob/master/src/main.cpp#L89), ещё (https://github.com/pBlueG/SA-MP-MySQL/blob/master/src/CHandle.cpp#L157-L274), ещё (https://github.com/pBlueG/SA-MP-MySQL/blob/master/tests/test_data/mysql.ini), ещё (https://github.com/pBlueG/SA-MP-MySQL/blob/master/src/natives.cpp#L202-L226) ещё (https://github.com/pBlueG/SA-MP-MySQL/blob/master/a_mysql.inc.in#L160) и ещё (https://github.com/pBlueG/SA-MP-MySQL/blob/master/src/CHandle.cpp#L157-L274), а вот в скомпилированом плагине (release (https://github.com/pBlueG/SA-MP-MySQL/releases/tag/R39-4)) - ее нет. Даже если прописать:
native MySQL:mysql_connect_file(const file_name[] = "mysql.ini");
Сервер все равно будет возвращать ошибку о не задекларированной функции:
http://i.imgur.com/znhpUOB.png
Интересно в чем профит было в сурсах оставить функцию но из release ее удалить? (Я отпишусь на GitHub - maddinat0r/BlueG)
В итоге у меня вышло, что то такое: (не дописанный код, может быть все таки они скомпилируют плагин с данной функцией и тогда можно будет дописать систему. Ну или на крайний случаи можно собрать плагин самому)
Глобально:
const SETTING_MYSQl_NOT_FILE = 0;
const SETTING_MYSQL_FILE = 1;
static const NAME_MYSQl_CONFIG[] = !"mysql.ini";
static const MYSQL_HOST[] = !"127.0.0.1";
static const MYSQL_USER[] = !"root";
static const MYSQL_DATABASE[] = !"database";
static const MYSQL_PASSW0RD[] = !"pass";
Собственно, сама функция:
/*
Если верить логам, то mysql_connect адекватно работает с запакованными строками:
[02:06:00] [ERROR] CMySQLConnection::Connect - (error #2003) Can't connect to MySQL server on '127.0.0.1' (10061)
*/
ConfigMySQL(status_setting = SETTING_MYSQl_NOT_FILE)
{
if(status_setting == SETTING_MYSQl_NOT_FILE)
{
static host[(sizeof(MYSQL_HOST)) * (cellbits / charbits) + 1];
static user[(sizeof(MYSQL_USER)) * (cellbits / charbits) + 1];
static database[(sizeof(MYSQL_DATABASE)) * (cellbits / charbits) + 1];
static password[(sizeof(MYSQL_PASSW0RD)) * (cellbits / charbits) + 1];
strunpack(host, MYSQL_HOST, sizeof(host)); // дабы избежать багов в printf/format
strunpack(user, MYSQL_USER, sizeof(user)); // дабы избежать багов в printf/format
strunpack(database, MYSQL_DATABASE, sizeof(database)); // дабы избежать багов в printf/format
strunpack(password, MYSQL_PASSW0RD, sizeof(password)); // дабы избежать багов в printf/format
print(#Подключения к базе данных из стандартных настроек...);
mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_DATABASE, MYSQL_PASSW0RD);
printf("Host: %s | User: %s | Database: %s | Password: %s", host, user, database, password);
}
else
{
// тут блок должен был заполнен работой с mysql_connect_file
}
}
Кому интересно - вопрос на GitHub'e (https://github.com/pBlueG/SA-MP-MySQL/issues/82)
vovandolg
27.02.2016, 03:33
Бл.. разобрался кое как с вариантом от DeimoS, всё робит вроде.
$continue$, У ваших вариантов с DeimoS есть плюсы и минусы какие нибудь ну в разнице кодов?
$continue$
27.02.2016, 03:50
У Дуймоса, используется mxini (include) (http://pastebin.com/KTNpnRbE), а я хотел воспользоваться нативной функции из плагина BlueG (mysql_connect_file) - там используется fstream (https://ru.wikipedia.org/wiki/Fstream) из STL C++ (https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D0%B0%D1%8F_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B0_%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%BE%D0%B2). Вызов native не во всех случаях быстрей, чем код написанный на Pawn (http://pro-pawn.ru/showthread.php?13493-%D0%9C%D0%B8%D1%84%D1%8B-%D0%BE-Pawn-%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3%D0%B5-7). Возможно у Дуймоса - есть выигрыш в скорости, возможно нет. (не хочется тестировать. Это во первых - компиляция плагина [т.к, у нас же нет в release - mysql_file_connect], во вторых составления профайлера)
+ У меня идет экономия памяти, благодаря упаковки строки.
Приведу пример (когда mxini подтягивать ради config.ini, не менее чем глупо):
Я почти не работал с файлами. Умею. Но не работаю. Мне они кажутся не удобными. Мне нужно сделать подключение из файла к базе данных. У меня есть выбор либо использовать file.inc, либо подтянуть mxini. (я бы конечно, выбрал file.inc. А то это как купить оптически прицел за 10000$ и начать стрелять по воробьям. Так же и с mxini) И это ради одного файла конфигурации?
Я бы лучше вызвал функцию из плагина BlueG - чем стал использовать file.inc/mxini
P.S: Хотя, о чем это я в mxini тоже же вызываются native function.
Бл.. разобрался кое как с вариантом от DeimoS, всё робит вроде.
$continue$, У ваших вариантов с DeimoS есть плюсы и минусы какие нибудь ну в разнице кодов?
+ У меня идет экономия памяти, благодаря упаковки строки.
Приведу пример (когда mxini подтягивать ради config.ini, не менее чем глупо):
Я почти не работал с файлами. Умею. Но не работаю. Мне они кажутся не удобными. Мне нужно сделать подключение из файла к базе данных. У меня есть выбор либо использовать file.inc, либо подтянуть mxini. (я бы конечно, выбрал file.inc. А то это как купить оптически прицел за 10000$ и начать стрелять по воробьям. Так же и с mxini) И это ради одного файла конфигурации?
Я бы лучше вызвал функцию из плагина BlueG - чем стал использовать file.inc/mxini
P.S: Хотя, о чем это я в mxini тоже же вызываются native function.
Если ты прочтёшь вопрос из шапки темы, то поймёшь, что данные для MySQL - это лишь часть тех задач, которые наложены на файл с конфигами (точнее, это просто пример того, как реализовывается запись/вывод данных). В идеале в эти конфиги можно будет записывать кучу разной информации: от настройки MAX_PLAYERS (придётся преобразовать макрос в переменную, но не суть) и до какой-то внутреигровой настройки, типа цен на авто или же какое-то редактируемое прямо из игры сообщение-реклама для всего сервера, которое будет показываться по таймеру. В общем, тут всё ограничивается только твоим желанием и mxINI тебе поможет в реализации всего этого.
И да, ты, видимо, не в курсе, что тебе, по-сути, пришлось бы написать свой mxINI, если бы ты захотел нормально работать с file.inc. Ибо, например, та же функция fread возвращает строку полностью, в том числе и с "\n", пробелами и прочим, что придётся убирать вручную, дабы тот же mySQL смог нормально прочесть эти данные
#define USE_MYSQL_CONFIG_FILE//Включение работы с файлом (если закомментировать, данные будут сразу браться из макросов)
//Значения по умолчанию
#define DATABASE__DEFAULT_HOST "localhost"
#define DATABASE__DEFAULT_USER "root"
#define DATABASE__DEFAULT_NAME "sa-mp"
#define DATABASE__DEFAULT_PASSWORD ""
#if !defined USE_MYSQL_CONFIG_FILE
new const database_host[] = DATABASE__DEFAULT_HOST;
new const database_user[] = DATABASE__DEFAULT_USER;
new const database_name[] = DATABASE__DEFAULT_NAME;
new const database_pass[] = DATABASE__DEFAULT_PASSWORD;
#else // !defined USE_MYSQL_CONFIG_FILE
#define DATABASE_CONFIG_FILE_NAME "dbconf.txt"//Имя файла, в котором будут хранится данные
#define DB_CONFIG_FIELD_HOST_NAME "Host"//Имя строки, в которой будет хранится адрес хостинга
#define DB_CONFIG_FIELD_USER_NAME "User"//Имя строки, в которой будет имя пользователя
#define DB_CONFIG_FIELD_DB_NAME "Database"//Имя строки, в которой будет хранится имя БД
#define DB_CONFIG_FIELD_PASS_NAME "Password"//Имя строки, в которой будет хранится пароль от БД
new database_host[64] = DATABASE__DEFAULT_HOST;
new database_user[16] = DATABASE__DEFAULT_USER;
new database_name[32] = DATABASE__DEFAULT_NAME;
new database_pass[32] = DATABASE__DEFAULT_PASSWORD;
public OnGameModeInit()
{
new config_file_handle = ini_openFile(DATABASE_CONFIG_FILE_NAME);
if (config_file_handle == -1)
{
printf("Warning: Не удалось открыть файл \"%s\"! Применение параметров по умолчанию ...", DATABASE_CONFIG_FILE_NAME);
config_file_handle = ini_createFile (DATABASE_CONFIG_FILE_NAME);
if (config_file_handle >= 0)
{
ini_setString (config_file_handle, DB_CONFIG_FIELD_HOST_NAME, database_host);
ini_setString (config_file_handle, DB_CONFIG_FIELD_USER_NAME, database_user);
ini_setString (config_file_handle, DB_CONFIG_FIELD_DB_NAME, database_name);
ini_setString (config_file_handle, DB_CONFIG_FIELD_PASS_NAME, database_pass);
printf("Файл \"%s\" успешно создан.", DATABASE_CONFIG_FILE_NAME);
}
else printf("Не удалось создать файл \"%s\". Код ошибки: %d", DATABASE_CONFIG_FILE_NAME, config_file_handle);
}
else
{
static const read_warning_str[] =
"Warning: Длина строки %s превышает лимит в %d символов.";
new read_error;
if (ini_getString(config_file_handle, "host", database_host) > sizeof(database_host) - 1)
printf(read_warning_str, DB_CONFIG_FIELD_HOST_NAME, sizeof(database_host) - 1), read_error = 1;
if (ini_getString(config_file_handle, "user", database_user) > sizeof(database_user) - 1)
printf(read_warning_str, DB_CONFIG_FIELD_USER_NAME, sizeof(database_user) - 1), read_error = 1;
if (ini_getString(config_file_handle, "user", database_name) > sizeof(database_name) - 1)
printf(read_warning_str, DB_CONFIG_FIELD_DB_NAME, sizeof(database_name) - 1), read_error = 1;
if (ini_getString(config_file_handle, "user", database_pass) > sizeof(database_pass) - 1)
printf(read_warning_str, DB_CONFIG_FIELD_PASS_NAME, sizeof(database_pass) - 1), read_error = 1;
if(!read_error) printf("Данные из \"%s\" успешно загружены", DATABASE_CONFIG_FILE_NAME);
}
ini_closeFile(config_file_handle);
#if defined mysql_config__OnGameModeInit
mysql_config__OnGameModeInit();
#endif
}
#if defined _ALS_OnGameModeInit
#undef OnGameModeInit
#else
#define _ALS_OnGameModeInit
#endif
forward mysql_config__OnGameModeInit();
#define OnGameModeInit mysql_config__OnGameModeInit
#endif // !defined USE_MYSQL_CONFIG_FILE
Вот вариант для mxINI. Файл будет выглядеть так:
http://i.imgur.com/LjOxYU6.png
Если файла нет, сервер сам его создаст и запишет в него значения из макросов, в которых указаны значения по умолчанию.
В этом коде вот тут
#if defined mysql_config__OnGameModeInit
mysql_config__OnGameModeInit();
#endif
Ошибочка. Должно быть так
#if defined mysql_config__OnGameModeInit
return mysql_config__OnGameModeInit();
#endif
Исправил тот пост
vovandolg
02.03.2016, 20:00
В этом коде вот тут
#if defined mysql_config__OnGameModeInit
mysql_config__OnGameModeInit();
#endif
Ошибочка. Должно быть так
#if defined mysql_config__OnGameModeInit
return mysql_config__OnGameModeInit();
#endif
Исправил тот пост
Какая ошибка может вылезти если не поставить возврат?
Какая ошибка может вылезти если не поставить возврат?
Если более одного перехвата OnGameModeInit, компилятор начнёт ругаться на то, что OnGameModeInit должна возвращать какое-либо значение
Можно было и так сделать:
#if defined mysql_config__OnGameModeInit
mysql_config__OnGameModeInit();
#endif
return 1;
}
не принципиально
$continue$
02.03.2016, 22:27
Если все таки нужно в приципе могу скомпилировать плагины под Windows и Linux в субботу.
vovandolg
03.03.2016, 02:32
И в разработки закинь или куда там положено :3
Попробуем что там за вариант..
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot