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. Копирование материалов разрешено только с указанием автора.
На правах рекламы: приму в пм идеи для уроков/маналов.
Последнее редактирование модератором: