Доброго времени суток, уважаемые посетители
Сегодня я Вам покажу как реализовать трудовую книжку A*****e Role Play!
А теперь приступим к добавлению данной системы!
Для начало нам нужна таблица, которую я заранее подготовил к работе с данной системой.
Дамп таблицы, так же в конце статьи я приложу чистую таблицу.
CREATE TABLE IF NOT EXISTS `employment_history` (
`id` int(11) NOT NULL,
`name_player` varchar(24) NOT NULL DEFAULT 'no_name_player',
`data_invite` date DEFAULT NULL,
`data_un_invite` date DEFAULT NULL,
`rang` int(11) DEFAULT NULL,
`organization` varchar(50) NOT NULL DEFAULT 'no_organization',
`organization_position` varchar(50) NOT NULL DEFAULT 'no_organization_position'
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
Далее мы перейдем в свой мод, и вставим ко всем переменным, данные переменные:
new bool: wbook_proposal[MAX_PLAYERS] = {false, ...};
Дальше мы перейдем к callback OnPlayerKeyStateChange и вставим данный код, хочу заметить если у Вас использованы кнопки Yи N то нужно будет перестроить свой код под данные кнопки:
if(newkeys == KEY_YES)
{
if(id_player_wbook == INVALID_PLAYER_ID || playerid_wbook == INVALID_PLAYER_ID || playerid_wbook == playerid) return SendClientMessage(playerid, -1, "У вас нет активных предложений!");
if(wbook_proposal[id_player_wbook] != true) return SendClientMessage(playerid, 0xFF6600AA, "У вас нет активных предложений!");
new player_name[MAX_PLAYER_NAME + 1],
string_show_labor_book[26 + MAX_PLAYER_NAME],
string_query_employment_history[265 + MAX_PLAYER_NAME];
GetPlayerName(playerid_wbook, player_name, MAX_PLAYER_NAME);
format(string_show_labor_book, sizeof(string_show_labor_book), "%s показал свою трудовую книгу", player_name);
send_client_message_from_radius(playerid, string_show_labor_book);
mysql_format(dbHandle, string_query_employment_history, sizeof(string_query_employment_history), "SELECT * FROM `employment_history` WHERE `data_invite` < (NOW() - interval 15 day) AND `name_player` = '%e' AND `data_un_invite` IS NOT NULL AND `rang` IS NOT NULL AND `organization` <> 'no_organization' AND `organization_position` <> 'no_organization_position'", player_name);
mysql_function_query(dbHandle, string_query_employment_history, true, "callback_employment_history", "ds", id_player_wbook, player_name);
wbook_proposal[id_player_wbook] = false,
wbook_proposal[playerid_wbook] = false,
id_player_wbook = INVALID_PLAYER_ID,
playerid_wbook = INVALID_PLAYER_ID;
string_query_employment_history[0] = EOS;
string_show_labor_book[0] = EOS;
player_name[0] = EOS;
return 1;
}
Дальше добавим саму команду (/wbook):
CMD:wbook(playerid, params[])
{
extract params -> new id_player; else
return SendClientMessage(playerid, 0xccccccAA, "Используйте /wbook [id игрока]");
if(!IsPlayerConnected(id_player)) return SendClientMessage(playerid, 0x999999AA, "Такого игрока нет");
if(GetPlayerDistanceToPlayer(playerid, id_player) > 3.0 || GetPlayerVirtualWorld(playerid) != GetPlayerVirtualWorld(id_player)) return SendClientMessage(playerid, 0x999999AA, "Игрок слишком далеко");
if(wbook_proposal[playerid] == true) return SendClientMessage(playerid, 0xffffffAA, "Используйте {ff9900}/cancel{ffffff} чтобы отозвать предыдущее предложение");
new string_show_employment_history[(134) + (MAX_PLAYER_NAME * 4)],
name_id_player[MAX_PLAYER_NAME],
name_playerid[MAX_PLAYER_NAME];
GetPlayerName(playerid, name_playerid, MAX_PLAYER_NAME);
GetPlayerName(id_player, name_id_player, MAX_PLAYER_NAME);
if(playerid == id_player)
{
new string_query_employment_history[265 + MAX_PLAYER_NAME];
format(string_show_employment_history, sizeof(string_show_employment_history), "%s просматривает свою трудовую книгу", name_playerid);
send_client_message_from_radius(playerid, string_show_employment_history);
mysql_format(dbHandle, string_query_employment_history, sizeof(string_query_employment_history), "SELECT * FROM `employment_history` WHERE `data_invite` < (NOW() - interval 15 day) AND `name_player` = '%e' AND `data_un_invite` IS NOT NULL AND `rang` IS NOT NULL AND `organization` <> 'no_organization' AND `organization_position` <> 'no_organization_position'", name_playerid);
mysql_function_query(dbHandle, string_query_employment_history, true, "callback_employment_history", "ds", playerid, name_playerid);
string_query_employment_history[0] = EOS;
string_show_employment_history[0] = EOS;
name_id_player[0] = EOS;
name_playerid[0] = EOS;
return 0;
}
format(string_show_employment_history, sizeof(string_show_employment_history), "Вы предложили %s посмотреть Вашу трудовую книгу", name_id_player);
SendClientMessage(playerid, 0x3399ffAA, string_show_employment_history);
string_show_employment_history[0] = EOS;
format(string_show_employment_history, sizeof(string_show_employment_history), "%s хочет показать Вам свою трудовую книгу", name_playerid);
SendClientMessage(id_player, 0x3399ffAA, string_show_employment_history);
SendClientMessage(id_player, 0xffffffAA, "Нажмите {00cc00}Y{ffffff} для просмотра или {ff6600}N{ffffff} для отказа");
playerid_wbook = playerid;
id_player_wbook = id_player;
wbook_proposal[playerid] = true;
wbook_proposal[id_player] = true;
string_show_employment_history[0] = EOS;
name_id_player[0] = EOS;
name_playerid[0] = EOS;
return 1;
}
Дальше мы добавим callback загрузки данных из БД:
forward callback_employment_history(const id_player, const name_wbook[]);
public callback_employment_history(const id_player, const name_wbook[])
{
new
rows,
fields,
data_invite_in_organization[15],
data_unvite_from_organization[15],
rang_in_organization,
organization[50],
organization_position[50];
cache_get_data(rows, fields);
static const caption_employment_history[] = "{FFCC00}Трудовая книга %s";
new str_callback_employment_history[sizeof(caption_employment_history) + MAX_PLAYER_NAME + 1];
format(str_callback_employment_history, sizeof(str_callback_employment_history), caption_employment_history, name_wbook);
if(!rows)
{
static text_dialog_employment_history[] =
{
"{ffffff}В трудовой книге отсутствуют записи. Первая запись появится после ухода из организации: \n\n\
1. Если у Вас был 3 ранг и выше;\n\
2. Если Вы провели в организации 15 дней и более."
};
return ShowPlayerDialog(id_player, \* пустой id диалога */, DIALOG_STYLE_MSGBOX, str_callback_employment_history, text_dialog_employment_history, "Закрыть",""), 0;
}
static title_dialog_employment_history[] = "Принятие\tУвольнение\tРанг\tОрганизация и должность";
new string_text_to_dialog[sizeof(str_callback_employment_history) + sizeof(title_dialog_employment_history) + sizeof(data_invite_in_organization) + sizeof(data_unvite_from_organization) + 20 + sizeof(organization) + sizeof(organization_position)];
new string_original[1200];
strcat(string_original, title_dialog_employment_history);
strcat(string_original, "\n\n");
for(new r; r < rows; r++)
{
data_invite_in_organization[0] = EOS;
data_unvite_from_organization[0] = EOS;
organization[0] = EOS;
organization_position[0] = EOS;
cache_get_field_content(r, "data_invite", data_invite_in_organization);
cache_get_field_content(r, "data_un_invite", data_unvite_from_organization);
rang_in_organization = cache_get_field_content_int(r, "rang");
cache_get_field_content(r, "organization", organization);
cache_get_field_content(r, "organization_position", organization_position);
format(string_text_to_dialog, sizeof(string_text_to_dialog), "{ffffff}%s\t%s\t%d\t%s, %s", data_invite_in_organization, data_unvite_from_organization, rang_in_organization, organization, organization_position);
strcat(string_original, string_text_to_dialog);
strcat(string_original, "\n");
string_text_to_dialog[0] = EOS;
}
ShowPlayerDialog(id_player, 4141, DIALOG_STYLE_MSGBOX, str_callback_employment_history, string_original, "Закрыть","");
return (rows == 0) ? (rows) : (1);
}
Нужно так же добавить запрос при действий в котором игрок попадает в фракцию:
if(PlayerInfo[playerid][player_fraction_rang] >= 3)
{
new query_un_invite_from_fraction[285 + MAX_PLAYER_NAME],
name_player_un_invite_from_frac[MAX_PLAYER_NAME + 1];
GetPlayerName(playerid, name_player_un_invite_from_frac, MAX_PLAYER_NAME);
mysql_format(dbHandle, query_un_invite_from_fraction, sizeof(query_un_invite_from_fraction), "UPDATE `employment_history` SET `data_un_invite` = NOW(), `rang` = '%d', `organization` = '%e', `organization_position` = '%e' WHERE `name_player` = '%e'", PlayerInfo[playerid][player_fraction_rang], get_player_fraction_name(PlayerInfo[playerid][player_fraction], get_player_fraction_name_rang(PlayerInfo[playerid][player_fraction], PlayerInfo[playerid][player_fraction_rang], name_player_un_invite_from_frac);
И так же при котором игрок покидает фаркцию
new query_un_invite_from_fraction[285 + MAX_PLAYER_NAME],
name_player_un_invite_from_frac[MAX_PLAYER_NAME + 1];
GetPlayerName(playerid, name_player_un_invite_from_frac, MAX_PLAYER_NAME);
mysql_format(dbHandle, query_un_invite_from_fraction, sizeof(query_un_invite_from_fraction), "UPDATE `employment_history` SET `data_un_invite` = NOW(), `rang` = '%d', `organization` = '%e', `organization_position` = '%e' WHERE `name_player` = '%e'", PlayerInfo[playerid][player_fraction_rang], get_player_fraction_name(PlayerInfo[playerid][player_fraction], get_player_fraction_name_rang(PlayerInfo[playerid][player_fraction], PlayerInfo[playerid][player_fraction_rang], name_player_un_invite_from_frac);
mysql_function_query(dbHandle, query_un_invite_from_fraction, false, "", "");
name_player_un_invite_from_frac[0] = EOS;
Стоки узнавание рангов/название фракции/радиусный чат
stock get_player_fraction_name(const fraction_id)
{
new name_fraction[31]; // Увиличивайте если фракция будет > 31 символа, в моем случий FBI (31 символ)
switch(fraction_id)
{
case 1: name_fraction = "Grove Street";
case 2: name_fraction = "Varios Los Aztecas";
case 3: name_fraction = "Los Santos Police Department";
case 4: name_fraction = "Federal Bureau of Investigation";
// дальше анологично
default: return - 1;
}
return name_fraction;
}
Скачать чистую таблицу
Сегодня я Вам покажу как реализовать трудовую книжку A*****e Role Play!
- dbHandle - переменная отвечающая за состояния коннекта к Базе Данных!
- https://rghost.ru/78vYXQz7Jsscanf2
А теперь приступим к добавлению данной системы!
Для начало нам нужна таблица, которую я заранее подготовил к работе с данной системой.
Дамп таблицы, так же в конце статьи я приложу чистую таблицу.
CREATE TABLE IF NOT EXISTS `employment_history` (
`id` int(11) NOT NULL,
`name_player` varchar(24) NOT NULL DEFAULT 'no_name_player',
`data_invite` date DEFAULT NULL,
`data_un_invite` date DEFAULT NULL,
`rang` int(11) DEFAULT NULL,
`organization` varchar(50) NOT NULL DEFAULT 'no_organization',
`organization_position` varchar(50) NOT NULL DEFAULT 'no_organization_position'
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
Далее мы перейдем в свой мод, и вставим ко всем переменным, данные переменные:
new bool: wbook_proposal[MAX_PLAYERS] = {false, ...};
Код:
new playerid_wbook = INVALID_PLAYER_ID;
Код:
new id_player_wbook = INVALID_PLAYER_ID;
if(newkeys == KEY_YES)
{
if(id_player_wbook == INVALID_PLAYER_ID || playerid_wbook == INVALID_PLAYER_ID || playerid_wbook == playerid) return SendClientMessage(playerid, -1, "У вас нет активных предложений!");
if(wbook_proposal[id_player_wbook] != true) return SendClientMessage(playerid, 0xFF6600AA, "У вас нет активных предложений!");
new player_name[MAX_PLAYER_NAME + 1],
string_show_labor_book[26 + MAX_PLAYER_NAME],
string_query_employment_history[265 + MAX_PLAYER_NAME];
GetPlayerName(playerid_wbook, player_name, MAX_PLAYER_NAME);
format(string_show_labor_book, sizeof(string_show_labor_book), "%s показал свою трудовую книгу", player_name);
send_client_message_from_radius(playerid, string_show_labor_book);
mysql_format(dbHandle, string_query_employment_history, sizeof(string_query_employment_history), "SELECT * FROM `employment_history` WHERE `data_invite` < (NOW() - interval 15 day) AND `name_player` = '%e' AND `data_un_invite` IS NOT NULL AND `rang` IS NOT NULL AND `organization` <> 'no_organization' AND `organization_position` <> 'no_organization_position'", player_name);
mysql_function_query(dbHandle, string_query_employment_history, true, "callback_employment_history", "ds", id_player_wbook, player_name);
wbook_proposal[id_player_wbook] = false,
wbook_proposal[playerid_wbook] = false,
id_player_wbook = INVALID_PLAYER_ID,
playerid_wbook = INVALID_PLAYER_ID;
string_query_employment_history[0] = EOS;
string_show_labor_book[0] = EOS;
player_name[0] = EOS;
return 1;
}
Код:
else if(newkeys == KEY_NO)
{
if(playerid_wbook != INVALID_PLAYER_ID && wbook_proposal[playerid_wbook] == true && id_player_wbook != INVALID_PLAYER_ID && wbook_proposal[id_player_wbook] == true)
{
new
name_player[MAX_PLAYER_NAME],
name_player_id[MAX_PLAYER_NAME],
string_employment_history_no[33 + MAX_PLAYER_NAME];
GetPlayerName(playerid_wbook, name_player, MAX_PLAYER_NAME);
GetPlayerName(id_player_wbook, name_player_id, MAX_PLAYER_NAME);
format(string_employment_history_no, sizeof(string_employment_history_no), "Вы отказались от предложения игрока %s", name_player);
SendClientMessage(id_player_wbook, 0xFF6600FF, string_employment_history_no);
format(string_employment_history_no, sizeof(string_employment_history_no), "%s отказался от Вашего предложения", name_player_id);
SendClientMessage(playerid_wbook, 0xFF6600FF, string_employment_history_no);
wbook_proposal[id_player_wbook] = false,
wbook_proposal[playerid_wbook] = false,
id_player_wbook = INVALID_PLAYER_ID,
playerid_wbook = INVALID_PLAYER_ID;
name_player[0] = EOS;
name_player_id[0] = EOS;
string_employment_history_no[0] = EOS;
}
else return SendClientMessage(playerid_wbook, 0x999999AA, "В данный момент Вам ничего не предлагают");
}
CMD:wbook(playerid, params[])
{
extract params -> new id_player; else
return SendClientMessage(playerid, 0xccccccAA, "Используйте /wbook [id игрока]");
if(!IsPlayerConnected(id_player)) return SendClientMessage(playerid, 0x999999AA, "Такого игрока нет");
if(GetPlayerDistanceToPlayer(playerid, id_player) > 3.0 || GetPlayerVirtualWorld(playerid) != GetPlayerVirtualWorld(id_player)) return SendClientMessage(playerid, 0x999999AA, "Игрок слишком далеко");
if(wbook_proposal[playerid] == true) return SendClientMessage(playerid, 0xffffffAA, "Используйте {ff9900}/cancel{ffffff} чтобы отозвать предыдущее предложение");
new string_show_employment_history[(134) + (MAX_PLAYER_NAME * 4)],
name_id_player[MAX_PLAYER_NAME],
name_playerid[MAX_PLAYER_NAME];
GetPlayerName(playerid, name_playerid, MAX_PLAYER_NAME);
GetPlayerName(id_player, name_id_player, MAX_PLAYER_NAME);
if(playerid == id_player)
{
new string_query_employment_history[265 + MAX_PLAYER_NAME];
format(string_show_employment_history, sizeof(string_show_employment_history), "%s просматривает свою трудовую книгу", name_playerid);
send_client_message_from_radius(playerid, string_show_employment_history);
mysql_format(dbHandle, string_query_employment_history, sizeof(string_query_employment_history), "SELECT * FROM `employment_history` WHERE `data_invite` < (NOW() - interval 15 day) AND `name_player` = '%e' AND `data_un_invite` IS NOT NULL AND `rang` IS NOT NULL AND `organization` <> 'no_organization' AND `organization_position` <> 'no_organization_position'", name_playerid);
mysql_function_query(dbHandle, string_query_employment_history, true, "callback_employment_history", "ds", playerid, name_playerid);
string_query_employment_history[0] = EOS;
string_show_employment_history[0] = EOS;
name_id_player[0] = EOS;
name_playerid[0] = EOS;
return 0;
}
format(string_show_employment_history, sizeof(string_show_employment_history), "Вы предложили %s посмотреть Вашу трудовую книгу", name_id_player);
SendClientMessage(playerid, 0x3399ffAA, string_show_employment_history);
string_show_employment_history[0] = EOS;
format(string_show_employment_history, sizeof(string_show_employment_history), "%s хочет показать Вам свою трудовую книгу", name_playerid);
SendClientMessage(id_player, 0x3399ffAA, string_show_employment_history);
SendClientMessage(id_player, 0xffffffAA, "Нажмите {00cc00}Y{ffffff} для просмотра или {ff6600}N{ffffff} для отказа");
playerid_wbook = playerid;
id_player_wbook = id_player;
wbook_proposal[playerid] = true;
wbook_proposal[id_player] = true;
string_show_employment_history[0] = EOS;
name_id_player[0] = EOS;
name_playerid[0] = EOS;
return 1;
}
Дальше мы добавим callback загрузки данных из БД:
forward callback_employment_history(const id_player, const name_wbook[]);
public callback_employment_history(const id_player, const name_wbook[])
{
new
rows,
fields,
data_invite_in_organization[15],
data_unvite_from_organization[15],
rang_in_organization,
organization[50],
organization_position[50];
cache_get_data(rows, fields);
static const caption_employment_history[] = "{FFCC00}Трудовая книга %s";
new str_callback_employment_history[sizeof(caption_employment_history) + MAX_PLAYER_NAME + 1];
format(str_callback_employment_history, sizeof(str_callback_employment_history), caption_employment_history, name_wbook);
if(!rows)
{
static text_dialog_employment_history[] =
{
"{ffffff}В трудовой книге отсутствуют записи. Первая запись появится после ухода из организации: \n\n\
1. Если у Вас был 3 ранг и выше;\n\
2. Если Вы провели в организации 15 дней и более."
};
return ShowPlayerDialog(id_player, \* пустой id диалога */, DIALOG_STYLE_MSGBOX, str_callback_employment_history, text_dialog_employment_history, "Закрыть",""), 0;
}
static title_dialog_employment_history[] = "Принятие\tУвольнение\tРанг\tОрганизация и должность";
new string_text_to_dialog[sizeof(str_callback_employment_history) + sizeof(title_dialog_employment_history) + sizeof(data_invite_in_organization) + sizeof(data_unvite_from_organization) + 20 + sizeof(organization) + sizeof(organization_position)];
new string_original[1200];
strcat(string_original, title_dialog_employment_history);
strcat(string_original, "\n\n");
for(new r; r < rows; r++)
{
data_invite_in_organization[0] = EOS;
data_unvite_from_organization[0] = EOS;
organization[0] = EOS;
organization_position[0] = EOS;
cache_get_field_content(r, "data_invite", data_invite_in_organization);
cache_get_field_content(r, "data_un_invite", data_unvite_from_organization);
rang_in_organization = cache_get_field_content_int(r, "rang");
cache_get_field_content(r, "organization", organization);
cache_get_field_content(r, "organization_position", organization_position);
format(string_text_to_dialog, sizeof(string_text_to_dialog), "{ffffff}%s\t%s\t%d\t%s, %s", data_invite_in_organization, data_unvite_from_organization, rang_in_organization, organization, organization_position);
strcat(string_original, string_text_to_dialog);
strcat(string_original, "\n");
string_text_to_dialog[0] = EOS;
}
ShowPlayerDialog(id_player, 4141, DIALOG_STYLE_MSGBOX, str_callback_employment_history, string_original, "Закрыть","");
return (rows == 0) ? (rows) : (1);
}
Нужно так же добавить запрос при действий в котором игрок попадает в фракцию:
if(PlayerInfo[playerid][player_fraction_rang] >= 3)
{
new query_un_invite_from_fraction[285 + MAX_PLAYER_NAME],
name_player_un_invite_from_frac[MAX_PLAYER_NAME + 1];
GetPlayerName(playerid, name_player_un_invite_from_frac, MAX_PLAYER_NAME);
mysql_format(dbHandle, query_un_invite_from_fraction, sizeof(query_un_invite_from_fraction), "UPDATE `employment_history` SET `data_un_invite` = NOW(), `rang` = '%d', `organization` = '%e', `organization_position` = '%e' WHERE `name_player` = '%e'", PlayerInfo[playerid][player_fraction_rang], get_player_fraction_name(PlayerInfo[playerid][player_fraction], get_player_fraction_name_rang(PlayerInfo[playerid][player_fraction], PlayerInfo[playerid][player_fraction_rang], name_player_un_invite_from_frac);
И так же при котором игрок покидает фаркцию
new query_un_invite_from_fraction[285 + MAX_PLAYER_NAME],
name_player_un_invite_from_frac[MAX_PLAYER_NAME + 1];
GetPlayerName(playerid, name_player_un_invite_from_frac, MAX_PLAYER_NAME);
mysql_format(dbHandle, query_un_invite_from_fraction, sizeof(query_un_invite_from_fraction), "UPDATE `employment_history` SET `data_un_invite` = NOW(), `rang` = '%d', `organization` = '%e', `organization_position` = '%e' WHERE `name_player` = '%e'", PlayerInfo[playerid][player_fraction_rang], get_player_fraction_name(PlayerInfo[playerid][player_fraction], get_player_fraction_name_rang(PlayerInfo[playerid][player_fraction], PlayerInfo[playerid][player_fraction_rang], name_player_un_invite_from_frac);
mysql_function_query(dbHandle, query_un_invite_from_fraction, false, "", "");
name_player_un_invite_from_frac[0] = EOS;
Стоки узнавание рангов/название фракции/радиусный чат
stock get_player_fraction_name(const fraction_id)
{
new name_fraction[31]; // Увиличивайте если фракция будет > 31 символа, в моем случий FBI (31 символ)
switch(fraction_id)
{
case 1: name_fraction = "Grove Street";
case 2: name_fraction = "Varios Los Aztecas";
case 3: name_fraction = "Los Santos Police Department";
case 4: name_fraction = "Federal Bureau of Investigation";
// дальше анологично
default: return - 1;
}
return name_fraction;
}
Код:
stock get_player_fraction_name_rang(const fraction_id, const rang_fraction)
{
new name_rang[10];
switch(fraction_id)
{
case 1:
{
switch(rang_fraction)
{
case 1: name_rang = "Newman";
case 2: name_rang = "Hustla";
case 3: name_rang = "Killa";
case 4: name_rang = "Cracker";
case 5: name_rang = "Gangsta";
case 6: name_rang = "O.G";
case 7: name_rang = "Mobsta";
case 8: name_rang = "Big Bro";
case 9: name_rang = "Legend";
case 10: name_rang = "Daddy";
}
}
// Дальше анологично
default: return - 1;
}
return name_rang;
}
Код:
stock send_client_message_from_radius(const playerid, const str[])
{
new Float: player_pos_x, Float: player_pos_y, Float: player_pos_z;
GetPlayerPos(playerid, player_pos_x, player_pos_y, player_pos_z);
foreach(new i: Player)
{
if(!IsPlayerInRangeOfPoint(i, 15.0, player_pos_x, player_pos_y, player_pos_z) ||
GetPlayerInterior(playerid) != GetPlayerInterior(i) || GetPlayerVirtualWorld(playerid) != GetPlayerVirtualWorld(i)) continue;
SendClientMessage(i, 0xdd90ffAA, str);
}
return 1;
}