Всем привет. Всегда с этим была проблема, как можно вывести все семьи как на ДРП? Вот скриншот: http://imgur.com/5okJbte.png
Вот как можно так сделать? И если список больше 20, 40, 60, 80, и тд, выводить кнопку "Далее" (переход)
Всем привет. Всегда с этим была проблема, как можно вывести все семьи как на ДРП? Вот скриншот: http://imgur.com/5okJbte.png
Вот как можно так сделать? И если список больше 20, 40, 60, 80, и тд, выводить кнопку "Далее" (переход)
Ниже полный ответ)
Последний раз редактировалось gangzone.ini; 19.06.2016 в 00:20. Причина: ...
Постраничный вывод, тоже можно сделать. Вам уже дан код выше я его просто слегка изменю и наведу Вас на мысль.
Как-то так. На работоспособность не проверял, но суть я думаю Вы должны уловить.PHP код:
// Константы
const
MAX_FAMILY = 300,
MAX_FAMILY_LINE_LIST = 20;
const
d_family = 999;
// Объявляем глобальную переменную, которая содержит данные о текущей странице
new
current_page[ MAX_PLAYERS char ];
// Можно объявить глобальную переменную как счётчик и использовать её вместо константы MAX_FAMILY
new
COUNT_FAMILY;
// Структура
enum FAMILY_STRUCT
{
F_ID,
F_NAME,
F_PARAMS[ 4 ] // Для настроек различных.
}
new
FAMILY[ MAX_FAMILY ][ FAMILY_STRUCT ];
// Форвард кастомной функции с загрузкой семей
forward loadFamily();
// Функция, которая выводит список семей
showFamilyList( playerid, page = 1 )
{
current_page{ playerid } = page;
static const
fmt_str[] = "%d.\t\t%s";
new
line_string[ sizeof( fmt_str ) + ( -2 + 32 ) ],
string[ sizeof( fmt_str ) + ( -2 + 32 ) * MAX_FAMILY_LINE_LIST ],
count,
id = current_page{ playerid } * MAX_FAMILY_LINE_LIST;
for( new i = id; i < COUNT_FAMILY; i++ )
{
format( line_string, sizeof line_string, fmt_str, i, FAMILY[i][F_NAME] );
strcat( string, line_string );
count++;
if( i == MAX_FAMILY_LINE_LIST )
{
strcat( string, "\t\tДалее" );
break;
}
}
if( !count )
return SendClientMessage( playerid, -1, "На данный момент семей не существует." );
return ShowPlayerDialog( playerid, d_family, DIALOG_STYLE_LIST, "Список семей:", string, "Выбрать", "Закрыть" );
}
// Функция с подгрузкой семей
public loadFamily()
{
COUNT_FAMILY = 0x0; // Обнуляем счётчик
for( ... )
{
COUNT_FAMILY++;
}
}
public OnPlayerConnect( playerid )
{
current_page{ playerid } = 1;
return 1;
}
public OnDialogResponse( playerid, dialogid, response, listitem, inputtext[] )
{
switch( dialogid )
{
case d_family :
{
if( !response )
return 1;
if( listitem == MAX_FAMILY_LINE_LIST )
{
showFamilyList( playerid, current_page{ playerid } + 1 );
}
}
}
return 1;
}
Последний раз редактировалось Found; 19.06.2016 в 15:36. Причина: Исправлял ошибки и дополнял.
Ругается вот на эту строку что-то:
Если сделать так, ругаться не будет:PHP код:
new string[sizeof(fmt_str) + ( -2 + 32 ) * family_count];
Сами ошибки:PHP код:
new string[sizeof(fmt_str) + ( -2 + 32 ) * 5];
В начале мода:PHP код:
error 008: must be a constant expression; assumed zero
error 009: invalid array size (negative, zero or out of bounds)
error 036: empty statement
fatal error 107: too many error messages on one line
Когда загружаются семьи:PHP код:
new family_count;
PHP код:
family_count 0x0; // Обнуление
for(...)
{
family_count++;
}
Последний раз редактировалось StevenH; 19.06.2016 в 15:00.
Обновил свой код.
Хм... Где код загрузки, ты должен дописать уже сам.PHP код:
new string[( sizeof(fmt_str) + ( -2 + 32 ) * MAX_FAMILY_LINE_LIST ) + 10 ];
Например если же ты используешь метод загрузки из базы данных, то изначально ты должен делать выборку в OnGameModeInit, а потом уже ссылаться с результатом на паблик загрузки.
Всё, дальше сам пытайся.PHP код:
#define DB_FAMILY "название_таблицы"
public OnGameModeInit()
{
mysql_tquery( mysql_connection, "SELECT * FROM "DB_FAMILY"", "loadFamily", "" ); // mysql_connection - ваша переменная с соединением.
}
public loadFamily()
{
new
rows,
fields;
cache_get_data( rows, fields );
if( !rows )
return print( "[Family Load]: В базе данных не найдены строки." );
family_count = 0x0;
for( new i; i != rows; i++ )
{
cache_get_field_content( i, " " ... ); // Выгрузка из бд
family_count++;
}
printf( "[Family Load]: Загружено %d семей.", family_count );
return 1;
}
Последний раз редактировалось Found; 19.06.2016 в 15:52.
StevenH (19.06.2016)
Вроде ошибок нету, но крашит самп, когда вызывается эта функция/"сток" :( P.s. изменил под себя некоторые части кода
- - - Добавлено - - -PHP код:
ShowFamilyList(playerid, page = 1)
{
current_page{playerid} = page;
static const fmt_str[] = "%d.\t\t%s";
new line_string[sizeof(fmt_str)-2+32],
string[(sizeof(fmt_str) + ( -2 + 32 ) * MAX_FAMILY_LINE_LIST ) + 10],
ids = current_page{playerid} * MAX_FAMILY_LINE_LIST;
for(new i = ids; i < family_count; i++)
{
format(line_string, sizeof(line_string), fmt_str, i, FamilyInfo[i][fName]);
strcat(string, line_string);
if(i == MAX_FAMILY_LINE_LIST)
{
strcat(string, "\t\tДалее");
break;
}
}
ShowPlayerDialog(playerid, dFamilyAll, 2, "{FFEFD5}Список семей", string, "Выбрать", "Закрыть" );
return true;
}
Решил проблему, не было переноса строки "\n"
Зачем? (Почему нельзя просто 0?)
А, так код довольно таки хороший код.PHP код:
family_count = 0x0;
P.S: Дима? Просто я знал одного скриптера, который писал подобным образом (стиль очень похож. Везде где можно ставить пробел :)) - Slaughter.
Value your freedom or you will lose it, teaches history. "Don't bother us with politics," respond those who don't want to learn. (c) Richard Stallman
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)