shape1
shape2
shape3
shape4
shape7
shape8

Система трудовой книжки (Advance Role Play)[CMD:wbook]


Redux

Новичок
Пользователь
26.11.2015
1
0
0
Доброго времени суток, уважаемые посетители

Сегодня я Вам покажу как реализовать трудовую книжку 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, ...};
Код:
new playerid_wbook = INVALID_PLAYER_ID;  
Код:
new id_player_wbook = INVALID_PLAYER_ID;  
Дальше мы перейдем к 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;
    }  
Код:
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, "В данный момент Вам ничего не предлагают");
    } 
Дальше добавим саму команду (/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;
}  
Код:
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;
}
Скачать чистую таблицу

 

JoKeR2020

Гуру
Пользователь
26.11.2014
1 800
4
321
0
Зачем AI при создании таблицы ставить на 7?
data_unvite_from_organization
Я конечно понимаю, что английский язык красивый, но зачем такие названия то? Чтобы потом сложнее писать их было? Правда если использовать Notepad++, но никаких проблем.
Объясните, зачем к каждой переменной в хейдере функции добавлять const, это как то сделает код лучше?

 
Последнее редактирование модератором: