faraday.
Эксперт
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Описание:
Погуглив в rambler, yahoo и mail я не нашел хорошей заготовки, подобной этой.
Данная система добавит на ваш сервер отслеживание действий игрока в базу данных.
Я создал 5 баз данных, для действий: Администраторов | Домов | Бизнесов | Денег | Фракций
Всё динамически продумано, лог из игры показывает последние 15 действий в порядке 'от последнего действия к прошлым'.
Так же при вводе имени игрока, идет проверка на Создан/Не создан
Версия mysql - R39+
Инструкция:
C++:
//Ключи для каждого лога:
ADMIN_LOG
HOUSE_LOG
BUSINESS_LOG
MONEY_LOG
FACTION_LOG
//Функция для логирования:
writeLog(playerid, type, logs_fmt[])
//Пример:
writeLog(playerid, ADMIN_LOG, "Сюда отправляем формат действия в таблицу `logs_admin`");
//
writeLog(playerid, HOUSE_LOG, "Действия с покупкой/продажей дома в таблицу `logs_house");
//
writeLog(playerid, BUSINESS_LOG, "Действия с покупкой/продажей/выводом денег бизнеса в таблицу `logs_business`");
//Тут отправляем действия когда игрок тратит/получает деньги
//(Пример:)
new str[64];
format(str, sizeof str, "передал %d$ игроку %s", player_info[playerid][player_money], target_name);
writeLog(playerid, MONEY_LOG, str);
//
writeLog(playerid, FACTION_LOG, "Передаем лог invite / uninvite / rank +/- в таблицу `logs_faction`");
Скриншоты:
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Код:
C++:
//В шапку мода
#define MYSQL_CONNECTID /*ваша переменная отвечающая за подключение*/
//Диалоги
#define D_UPLOAD_LOGS 1350
#define D_RESULT_LOGS 1351
//
const LOG_TABLE_MAX = 5;
enum e_LOG_SECTION {
ADMIN_LOG = 0,
HOUSE_LOG,
BUSINESS_LOG,
MONEY_LOG,
FACTION_LOG//4 ID
}
new
table_name_logs[LOG_TABLE_MAX][16] = {"logs_admin", "logs_house", "logs_business", "logs_money", "logs_faction"}, //Названия таблиц в БД
select_id_acc[MAX_PLAYERS]; //для записи имени игрока, на которого пускаем запрос в базу
//---------------------------------------------------------------------------------------
//Ко всем диалогам в public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
case D_UPLOAD_LOGS: //Для поиска аккаунта введеного в input
{
if(!response)
return 1;
new
query_string[128];
format(query_string, sizeof query_string, "SELECT * FROM `accounts` WHERE `name` = '%s'", inputtext);
mysql_tquery(MYSQL_CONNECTID, query_string, "findNickName", "is", playerid, inputtext);
return 1;
}
case D_RESULT_LOGS: //Для запроса в бд, относительно выбранного listitem
{
if(!response)
return 1;
new mysql_fmt[128];
format(mysql_fmt, sizeof mysql_fmt, "SELECT * FROM `%s` WHERE `id_account` LIKE '%d' ORDER BY `ID` DESC LIMIT 15", table_name_logs[listitem], select_id_acc[playerid]);
mysql_tquery(MYSQL_CONNECTID, mysql_fmt, "UploadLogsPlayer", "id", playerid, listitem);
return 1;
}
//----------------------------------------------------------//
//В любое свободное место в моде:
CMD:logs(playerid)
{
/*Проверка на администратора*/
return ShowPlayerDialog(playerid, D_UPLOAD_LOGS, DIALOG_STYLE_INPUT, "Введите имя", "{ffffff}Введите никнейм в строку ниже:", "Далее", "Выход");
}
forward findNickName(playerid, name_player[]);
public findNickName(playerid, name_player[]) {
new
rows,
str[72];
cache_get_row_count(rows);
if(rows) {
cache_get_value_name_int(0, "id", select_id_acc[playerid]); //'id' замените на имя своего столбца с ID аккаунта что у вас в таблице игрока
format(str, sizeof str, "Список действий игрока %s", name_player);
ShowPlayerDialog(playerid, D_RESULT_LOGS, DIALOG_STYLE_TABLIST_HEADERS, str, "Список действий:\nАдминистратор\nНедвижимость\nБизнес\nДеньги\nФракция", "Выбрать", "Выход");
} else {
format(str, sizeof str, "Аккаунт с именем %s не создан.", name_player);
SendClientMessage(playerid, -1, str);
}
return 1;
}
forward UploadLogsPlayer(playerid, type);
public UploadLogsPlayer(playerid, type)
{
new
rows,
total_string[2048],
name_player[MAX_PLAYER_NAME],
action[64],
date[24];
cache_get_row_count(rows);
for(new u; u < rows; u++) {
cache_get_value_name(u, "name", name_player, MAX_PLAYER_NAME);
cache_get_value_name(u, "action", action, 64);
cache_get_value_name(u, "date", date, 24);
format(total_string, sizeof total_string, "%s{d3d3d3}Дата: {ffffff}%s\t{ff9d14}Действие: {ffffff}%s\n", total_string, date, action);
}
if(!rows)//Если список пуст
total_string = "Никаких действий не совершал";
switch(type) { //Названия для шапки диалога
case 0: action = "Администратор";
case 1: action = "Дом";
case 2: action = "Бизнес";
case 3: action = "Финансы";
case 4: action = "Фракция";
}
format(action, sizeof action, "{ffffff}Логи {ff9d14}%s {ffffff}| %s", name_player, action);
ShowPlayerDialog(playerid, 0000 ,DIALOG_STYLE_MSGBOX, action, total_string, "Закрыть", "");
//Показываем и обнуляем Имя
select_id_acc[playerid] = INVALID_PLAYER_ID;
return 1;
}
stock writeLog(playerid, type, logs_fmt[]) {
new
mysql_fmt[256];
GetPlayerName(playerid, mysql_fmt, MAX_PLAYER_NAME);
format(mysql_fmt, sizeof mysql_fmt, "INSERT INTO `%s` (`name`, `id_account`, `action`) VALUES ('%s', '%d', '%s')", table_name_logs[type], mysql_fmt, /*переменная отвечающая за ID игрока при регистрации*/, logs_fmt);
return mysql_tquery(MYSQL_CONNECTID, mysql_fmt, "", "");
}
//=------------------------------------------------------------------=//
C++:
CREATE TABLE `logs_admin` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(24) NOT NULL,
`id_account` int(6) NOT NULL,
`action` text NOT NULL,
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
CREATE TABLE `logs_house` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(24) NOT NULL,
`id_account` int(6) NOT NULL,
`action` text NOT NULL,
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
CREATE TABLE `logs_business` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(24) NOT NULL,
`id_account` int(6) NOT NULL,
`action` text NOT NULL,
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
CREATE TABLE `logs_money` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(24) NOT NULL,
`id_account` int(6) NOT NULL,
`action` text NOT NULL,
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
CREATE TABLE `logs_faction` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(24) NOT NULL,
`id_account` int(6) NOT NULL,
`action` text NOT NULL,
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
Автор: unreal
Последнее редактирование: