Доступ к готовым решениям

Переход в группу "Пользователь"

300.00
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Система семей. Аналог Diamond RP. MySQL R7+

Slaughter

Изучающий
Регистрация
5 Авг 2014
Сообщения
358
Лучшие ответы
0
Репутация
264
Здравствуйте, уважаемые посетители портала Pawno Info. В поиске уроков/мануалов увидел тему и решил осуществить систему. Система делалась по видео. Это не копия, я осуществлял функционал, дизайн вы делаете сами, аналогично с адаптацией кода под свой мод. Если вы берётесь вставлять этот код в мод, то вы должны хоть немного соображать в MySQL и павн.

Ресурсы:
PHP:
#include                                     <a_samp>
#include                                     <a_mysql>
#include                                     <sscanf2>
#include                                     <dc_cmd>

Ко всем переменным:
PHP:
new player_name [ MAX_PLAYERS ] [ MAX_PLAYER_NAME ] ;//Переменная никнейма игрока, можете заменять своим.

new player_family [ MAX_PLAYERS ];//переменная игрока, меняете на своё.

enum _fam_enum_
{
    f_id,
    f_name [ 32 ],
    f_chat_color,
    f_creator [ MAX_PLAYER_NAME ],
    f_creating_data [ 32 ],
    f_members_amount,
    f_nationality,
    f_online,
}
new family_info [ 500 ] [ _fam_enum_ ];//Расчитано на 500 семей

new family_count = 0;//кол-во семей.


enum
{
    dFamilyCreate,
    dFamilyMenu,
    dFamilyInfo,
    dFamilyOffMembers,
    dFamilyOnline,
    dFamilyChatColor,
    dFamilyNationality,
    dFamilyInvite,
}//Диалоги

new family_chat_color[ 5 ] [ 12 ] ={//Массив цвета для чата
    "FFFFFF","FFD39B","FFFF00","54FF9F","98F5FF"
};

Далее нам необходимо загрузить семьи, мы отправляемся в public OnGameModeInit
PHP:
    mysql_function_query ( dbHandle, "SELECT * FROM `family_system`", true, "family_loading", "" ) ;

А так же создаём коллбэк
PHP:
forward family_loading ( );
public family_loading ( )
{
    new rows, fields, temp [ 32 ];
    cache_get_data ( rows, fields ) ;
    family_count = rows;
    if ( rows )
    {
           for ( new f = 0; f < rows ; f++ )
        {

            family_info [ f ][ f_id ] = cache_get_field_content_int (f, "fam_id");
            cache_get_field_content (f, "fam_name", temp ) , sscanf ( temp, "s[32]", family_info [ f ] [ f_name ] ) ;
            cache_get_field_content (f, "fam_creator", temp ) , sscanf ( temp, "s[32]", family_info [ f ] [ f_creator ] ) ;
            cache_get_field_content (f, "fam_data", temp ) , sscanf ( temp, "s[12]", family_info [ f ] [ f_creating_data ] ) ;
            family_info [ f ][ f_chat_color ] = cache_get_field_content_int (f, "fam_chat_color" );
            family_info [ f ][ f_members_amount ] = cache_get_field_content_int (f, "fam_members_amount" );
            family_info [ f ][ f_nationality ] = cache_get_field_content_int (f, "fam_nationality" );
         }
    }
    else return print ( "[Система семей] В базе данных не обнаружена ни одна семья!" ) ;
    return 1;
}

Не забываем получить никнейм и обнулить значение семьи у игрока при подключении:
PHP:
public OnPlayerConnect(playerid)
{
    GetPlayerName ( playerid, player_name [ playerid ] , MAX_PLAYER_NAME ) ;
    player_family [ playerid ] = 0;
    return 1;
}

Т.к это только площадка для вашей фантазии я создаю обычные команды для создания/меню системы. Вы можете заменить на пикапы/текстдравы и т.д:

PHP:
CMD:cfamily(playerid, params[])
{
    if(player_family [ playerid ])return SendClientMessage(playerid, -1,"Вы уже состоите в семье!");
    ShowPlayerDialog(playerid,dFamilyCreate,DIALOG_STYLE_INPUT,"{FFEFD5}Создание семьи","\n\n{6495ED}Введите название своей семьи!","Создать","Отмена");
    return 1;
}
CMD:family(playerid, params[])
{
    if(!player_family [ playerid ])return SendClientMessage(playerid, -1,"Вы не состоите в семье!");
    ShowPlayerDialog(playerid,dFamilyMenu,DIALOG_STYLE_LIST,"{FFEFD5}Меню семьи","{FFFFFF}Информация о семье\nЧлены семьи\nЧлены семьи[{00FF7F}Онлайн{FFFFFF}]\n{8B0000}Покинуть семью{FFFFFF}\nИзменить цвет рации семьи\nИзменить национальность семьи","Выбрать","Отмена");
    return 1;
}
CMD:finvite(playerid, params[])
{
    if(!player_family [ playerid ])return SendClientMessage(playerid, -1,"Вы не состоите в семье!");
    if( sscanf(params, "u", params [0]))return SendClientMessage(playerid, -1, "Ввведите: /finvite [id]" ) ;
    if(!IsPlayerConnected(params [ 0 ]))return SendClientMessage(playerid, -1, "Игрок не найден!" ) ;
    if(player_family[ params [ 0 ] ])return SendClientMessage(playerid, -1, "Уже состоит в семье!" ) ;
    new text_string [ 46 + MAX_PLAYER_NAME + 32 ];
    format(text_string,sizeof(text_string),"Вы пригласили %s присоединиться к семье %s",player_name[ params [ 0 ] ],family_info [ player_family [ playerid ] - 1 ] [ f_name ]);
    SendClientMessage(playerid,-1,text_string);

    new dialog_string [ 128 ];
    format(dialog_string,sizeof(dialog_string),"{FFFFFF}%s приглашает вас присоединиться к семье %s.\nВы согласны присоединиться?",player_name[ playerid ],family_info [ player_family [ playerid ] - 1 ] [ f_name ]);
    ShowPlayerDialog(params [ 0 ],dFamilyInvite,DIALOG_STYLE_MSGBOX,"{FFEFD5}Приглашение в семью",dialog_string,"Да","Нет");

    SetPVarInt(params [ 0 ],"family_id",player_family [ playerid ]);
    return 1;
}
CMD:k(playerid, params[])
{
     if(!player_family [ playerid ])return SendClientMessage(playerid, -1, "Вы не состоите в семье!");
    if( sscanf(params, "s[128]", params [0]))return SendClientMessage(playerid, -1, "Ввведите: /k [текст]" ) ;
    new text_string [ 144 ];
    format(text_string,sizeof(text_string),"{%s}[F][%s] %s: %s",family_chat_color [ family_info [ player_family [ playerid ] - 1 ] [ f_chat_color ] ],family_info [ player_family [ playerid ] - 1 ] [ f_name ],player_name[ playerid ],params [0]);
    family_message(player_family [ playerid ],-1, text_string);
    return 1;
}

Теперь нам нужна функция чата:
PHP:
stock family_message (family, color, text[] )
{
    for (new i = GetMaxPlayers()-1; i != -1; i--)
    {
        if ( player_family [ i ] != family )continue;
        SendClientMessage ( i, color, text ) ;
    }
    return 1;
}

Теперь возвращаемся к диалогам:
PHP:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(dialogid)
    {
        case dFamilyCreate:
        {
            if ( strlen ( inputtext ) < 2 || strlen ( inputtext ) > 28 )
            {
                SendClientMessage(playerid,-1,"Название семьи не может быть больше 28 или меньше 2 сиволов!");
                ShowPlayerDialog(playerid,dFamilyCreate,DIALOG_STYLE_INPUT,"{FFEFD5}Создание семьи","\n\n{6495ED}Введите название своей семьи!","Создать","Отмена");
            }
            else
            {
                new temp [ 32 ],query_string [ 256 ];
                mysql_real_escape_string ( inputtext, temp ) ;
                format ( query_string, sizeof query_string, "INSERT INTO `family_system` ( `fam_name`, `fam_creator`, `fam_members_amount`, `fam_data` ) VALUES ( '%s', '%s', '1', NOW( ))", temp, player_name [ playerid ] ) ;
                mysql_function_query ( dbHandle, query_string, false, "", "" ) ;

                player_family [ playerid ] = family_count + 1;

                format(family_info [ family_count ] [ f_name ], 32 , temp);
                format(family_info [ family_count ] [ f_creator ], MAX_PLAYER_NAME, player_name [ playerid ]);
                family_info [ family_count ] [ f_chat_color ] = 0;
                family_info [ family_count ] [ f_members_amount ] = 1;
                family_info [ family_count ] [ f_online ] = 1;
                new year, month,day;
                getdate(year, month, day);
                format(family_info [ family_count ] [ f_creating_data ], 32,"%02d/%02d/%d",year, month, day);
               
                format ( query_string, 92 + 32, "Поздравляем! Вы создали семью {2E8B57}%s{FFFFFF}. Чтобы открыть меню семьи введите /family.", family_info [ family_count ] [ f_name ], player_name [ playerid ] ) ;
                SendClientMessage(playerid, -1,query_string);
                                family_count ++;
            }
        }
        case dFamilyMenu:
        {
            if( !response ) return 1;
            switch(listitem)
            {
                case 0:
                {
                    new dialog_string [ 302 ], nationality_string [ 28 ];
                    new fam_id = player_family [ playerid ] - 1;
                    switch( family_info [ fam_id ] [ f_nationality ])
                    {
                        case 1:nationality_string = "американцы";
                        case 2:nationality_string = "японцы";
                        case 3:nationality_string = "итальянцы";
                        case 4:nationality_string = "мексиканцы";
                        case 5:nationality_string = "латиноамериканцы";
                        case 6:nationality_string = "испанцы";
                        case 7:nationality_string = "русские";
                        case 8:nationality_string = "португальцы";
                        case 9:nationality_string = "французы";
                        default:nationality_string = "неизвестно";
                    }
                    format(dialog_string,sizeof(dialog_string),"\tСемья %s\nНациональность: %s\nОнлайн: %d\nСостав семьи: %d\nДата создания: %s\n\nСоздатель семьи: %s",
                    family_info [ fam_id ] [ f_name ],nationality_string,family_info [ fam_id ] [ f_online ],family_info [ fam_id ] [ f_members_amount ],family_info [ family_count ] [ f_creating_data ],family_info [ family_count ] [ f_creator ]);
                    ShowPlayerDialog(playerid,dFamilyInfo,DIALOG_STYLE_MSGBOX,"Информация о семье",dialog_string,"Назад","");
                }
                case 1:
                {
                    new query_string [ 58 ];
                    format ( query_string, sizeof query_string, "SELECT * FROM `accounts` WHERE `family` = '%d'", player_family [ playerid ]);
                    mysql_function_query ( dbHandle, query_string, true, "off_family_members_callback", "i", playerid ) ;
                }
                case 2:
                {
                    new ofm_string[ 256 ];
                    for (new i = GetMaxPlayers()-1; i != -1; i--)
                    {
                        if(player_family [ i ] == player_family [ playerid ])
                        {
                            strcat(ofm_string,player_name [ i ]);
                            strcat(ofm_string,"\n");
                        }
                        ShowPlayerDialog ( playerid, dFamilyOffMembers , DIALOG_STYLE_LIST, "{FFEFD5}Члены семьи онлайн", ofm_string, "Назад","" ) ;
                    }
                }
                case 3:
                {
                    new fm_string [ 128 ];
                    format(fm_string,sizeof(fm_string),"[F][%s] %s[%i] покинул семью!",family_info [ player_family [ playerid ] - 1 ] [ f_name ], player_name [ playerid ], playerid);
                    family_message (player_family [ playerid ], -1, fm_string);
                    family_info [ player_family [ playerid ] - 1 ] [ f_online ] -= 1;
                    family_info [ player_family [ playerid ] - 1 ] [ f_members_amount ] -= 1;
                    player_family [ playerid ] = 0;
                }
                case 4:
                {
                    new color_dialog [ 128 ];
                    format(color_dialog,sizeof(color_dialog),"{%s}Цвет 1\n{%s}Цвет 2\n{%s}Цвет 3\n{%s}Цвет 4\n{%s}Цвет 5",family_chat_color [ 0 ],family_chat_color [ 1 ],family_chat_color [ 2 ],family_chat_color [ 3 ],family_chat_color [ 4 ]);
                    ShowPlayerDialog(playerid,dFamilyChatColor,DIALOG_STYLE_LIST,"{FFEFD5}Цвет чата",color_dialog,"Выбрать","Отмена");
                }
                case 5:
                {
                    ShowPlayerDialog(playerid,dFamilyNationality,DIALOG_STYLE_LIST,"{FFEFD5}Национальность семьи","{FFFFFF}Американцы\nЯпонцы\nИтальянцы\nМексиканцы\nЛатиноамериканцы\nИспанцы\nРусские\nПортугальцы\nФранцузы","Выбрать","Отмена");
                }
            }
         }
           case dFamilyInfo:
        {
            ShowPlayerDialog(playerid,dFamilyMenu,DIALOG_STYLE_LIST,"{FFEFD5}Меню семьи","{FFFFFF}Информация о семье\nЧлены семьи\nЧлены семьи[{00FF7F}Онлайн{FFFFFF}]\n{8B0000}Покинуть семью{FFFFFF}\nИзменить цвет рации семьи\nИзменить национальность семьи","Выбрать","Отмена");
        }
           case dFamilyOffMembers:
        {
            ShowPlayerDialog(playerid,dFamilyMenu,DIALOG_STYLE_LIST,"{FFEFD5}Меню семьи","{FFFFFF}Информация о семье\nЧлены семьи\nЧлены семьи[{00FF7F}Онлайн{FFFFFF}]\n{8B0000}Покинуть семью{FFFFFF}\nИзменить цвет рации семьи\nИзменить национальность семьи","Выбрать","Отмена");
        }
           case dFamilyChatColor:
        {
            if( !response )return ShowPlayerDialog(playerid,dFamilyMenu,DIALOG_STYLE_LIST,"{FFEFD5}Меню семьи","{FFFFFF}Информация о семье\nЧлены семьи\nЧлены семьи[{00FF7F}Онлайн{FFFFFF}]\n{8B0000}Покинуть семью{FFFFFF}\nИзменить цвет рации семьи\nИзменить национальность семьи","Выбрать","Отмена");
            family_info [ player_family [ playerid ] - 1 ] [ f_chat_color ] = listitem;
            ShowPlayerDialog(playerid,dFamilyMenu,DIALOG_STYLE_LIST,"{FFEFD5}Меню семьи","{FFFFFF}Информация о семье\nЧлены семьи\nЧлены семьи[{00FF7F}Онлайн{FFFFFF}]\n{8B0000}Покинуть семью{FFFFFF}\nИзменить цвет рации семьи\nИзменить национальность семьи","Выбрать","Отмена");
            SendClientMessage(playerid, -1,"Цвет чата семьи изменён!");
            new query_string [ 128 ];
            format ( query_string, sizeof query_string, "UPDATE `family_system` SET `fam_chat_color` = '%d' WHERE `fam_id` = '%d' LIMIT 1",family_info [ player_family [ playerid ] - 1 ] [ f_chat_color ], player_family [ playerid ]);
            mysql_function_query ( dbHandle, query_string, false, "", "" ) ;
        }
           case dFamilyNationality:
        {
            if( !response )return ShowPlayerDialog(playerid,dFamilyMenu,DIALOG_STYLE_LIST,"{FFEFD5}Меню семьи","{FFFFFF}Информация о семье\nЧлены семьи\nЧлены семьи[{00FF7F}Онлайн{FFFFFF}]\n{8B0000}Покинуть семью{FFFFFF}\nИзменить цвет рации семьи\nИзменить национальность семьи","Выбрать","Отмена");
            family_info [ player_family [ playerid ] - 1 ] [ f_nationality ] = listitem + 1;
            ShowPlayerDialog(playerid,dFamilyMenu,DIALOG_STYLE_LIST,"{FFEFD5}Меню семьи","{FFFFFF}Информация о семье\nЧлены семьи\nЧлены семьи[{00FF7F}Онлайн{FFFFFF}]\n{8B0000}Покинуть семью{FFFFFF}\nИзменить цвет рации семьи\nИзменить национальность семьи","Выбрать","Отмена");
            SendClientMessage(playerid, -1,"Национальность семьи изменена!");
            new query_string [ 128 ];
            format ( query_string, sizeof query_string, "UPDATE `family_system` SET `fam_nationality` = '%d' WHERE `fam_id` = '%d' LIMIT 1",family_info [ player_family [ playerid ] - 1 ] [ f_nationality ], player_family [ playerid ]);
            mysql_function_query ( dbHandle, query_string, false, "", "" ) ;

        }
        case dFamilyInvite:
        {
            if( !response )return 1;
            player_family [ playerid ] = GetPVarInt(playerid,"family_id");
            DeletePVar(playerid,"family_id");

            new text_string [ 128 ];
            format(text_string,sizeof(text_string),"{%s}[F][%s] %s присоединился к семье!",family_chat_color [ family_info [ player_family [ playerid ] - 1 ] [ f_chat_color ] ],family_info [ player_family [ playerid ] - 1 ] [ f_name ],player_name[ playerid ]);
            family_message(player_family [ playerid ],-1, text_string);
            family_info [ player_family [ playerid ] - 1 ] [ f_online ] += 1;
            family_info [ player_family [ playerid ] - 1 ] [ f_members_amount ] += 1;

            new query_string [ 128 ];
            format ( query_string, sizeof query_string, "UPDATE `family_system` SET `fam_members_amount` = '%d' WHERE `fam_id` = '%d' LIMIT 1",family_info [ player_family [ playerid ] - 1 ] [ f_members_amount ], player_family [ playerid ]);
            mysql_function_query ( dbHandle, query_string, false, "", "" ) ;
        }
    }
    return 1;
}

Ещё стоит не забыть о коллбэке для просмотра всех членов семьи:
PHP:
forward off_family_members_callback(playerid);
public off_family_members_callback(playerid)
{
    new rows, fields, temp [ MAX_PLAYER_NAME ],ofm_string[ 256 ];
    cache_get_data ( rows, fields ) ;
    if(rows != 0)
    {
        for(new i = 0; i < rows ;i++)
        {
            cache_get_field_content ( i, "Name", temp );//Name заменяете на свою колонку имени в БД.
            strcat(ofm_string,temp);
            strcat(ofm_string,"\n");
        }
    }
    ShowPlayerDialog ( playerid, dFamilyOffMembers , DIALOG_STYLE_LIST, "{FFEFD5}Члены семьи", ofm_string, "Назад","" ) ;
    return 1;
}

Уменьшаем онлайн при выходе(OnPlayerDisconnect:
PHP:
if(player_family [ playerid ])family_info [ player_family [ playerid ] - 1 ] [ f_online ]--;

В паблик авторизации, после загрузки все инфы:
PHP:
if(player_family [ playerid ])family_info [ player_family [ playerid ] - 1 ] [ f_online ]++;

Теперь от вас требуется создать загрузку и сохранение переменной player_family, этого я не могу сделать персонально для каждого, т.к у каждого своя структура кода.

Обратите внимание на запрос:
PHP:
                    format ( query_string, sizeof query_string, "SELECT * FROM `accounts` WHERE `family` = '%d'", player_family [ playerid ]);
                    mysql_function_query ( dbHandle, query_string, true, "off_family_members_callback", "i", playerid ) ;

Вы должны переписать его под себя, `accounts` заменить на свою таблицу игрока,а `family` на свой столбец со значением семьи.

dbHandle - id MySQL подключения, меняйте на своё.
Немного скриншотов:





К системе прилагается база данных:

SQL импорт:
PHP:
CREATE TABLE IF NOT EXISTS `family_system` (
`fam_id` int(11) NOT NULL,
  `fam_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `fam_creator` varchar(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `fam_data` varchar(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `fam_chat_color` int(11) NOT NULL,
  `fam_members_amount` int(11) NOT NULL,
  `fam_nationality` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

New.pwn с вшитой системой(не работает пункт "все члены семьи" из-за отсутствия системы регистрации):



Любая критика приветствуется, аналогично с поправками.
Автор: Slaughter. Копирование материалов разрешено только с указанием автора.




На правах рекламы: приму в пм идеи для уроков/маналов.
 
Последнее редактирование модератором:
Сверху Снизу