PDA

Просмотр полной версии : [Вопрос] Как сделать список всех семей как на Diamond RP



StevenH
18.06.2016, 21:43
Всем привет. Всегда с этим была проблема, как можно вывести все семьи как на ДРП? Вот скриншот: http://imgur.com/5okJbte.png

Вот как можно так сделать? И если список больше 20, 40, 60, 80, и тд, выводить кнопку "Далее" (переход)

gangzone.ini
18.06.2016, 23:55
Ниже полный ответ)

Found
19.06.2016, 00:17
Постраничный вывод, тоже можно сделать. Вам уже дан код выше я его просто слегка изменю и наведу Вас на мысль.



// Константы
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;
}



Как-то так. На работоспособность не проверял, но суть я думаю Вы должны уловить.

StevenH
19.06.2016, 01:29
Постраничный вывод, тоже можно сделать. Вам уже дан код выше я его просто слегка изменю и наведу Вас на мысль.



// Константы
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 ) * COUNT_FAMILY],
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;
}



Как-то так. На работоспособность не проверял, но суть я думаю Вы должны уловить.

Спасибо, завтра буду за компьютером, проверю)

StevenH
19.06.2016, 14:57
Постраничный вывод, тоже можно сделать. Вам уже дан код выше я его просто слегка изменю и наведу Вас на мысль.



// Константы
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 ) * COUNT_FAMILY],
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;
}



Как-то так. На работоспособность не проверял, но суть я думаю Вы должны уловить.

Ругается вот на эту строку что-то:

new string[sizeof(fmt_str) + ( -2 + 32 ) * family_count];

Если сделать так, ругаться не будет:

new string[sizeof(fmt_str) + ( -2 + 32 ) * 5];

Сами ошибки:


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


В начале мода:

new family_count;

Когда загружаются семьи:


family_count 0x0; // Обнуление
for(...)
{
family_count++;
}

Found
19.06.2016, 15:46
Обновил свой код.

new string[( sizeof(fmt_str) + ( -2 + 32 ) * MAX_FAMILY_LINE_LIST ) + 10 ];
Хм... Где код загрузки, ты должен дописать уже сам.

Например если же ты используешь метод загрузки из базы данных, то изначально ты должен делать выборку в OnGameModeInit, а потом уже ссылаться с результатом на паблик загрузки.




#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;
}


Всё, дальше сам пытайся.

StevenH
19.06.2016, 17:42
Обновил свой код.

new string[( sizeof(fmt_str) + ( -2 + 32 ) * MAX_FAMILY_LINE_LIST ) + 10 ];
Хм... Где код загрузки, ты должен дописать уже сам.

Например если же ты используешь метод загрузки из базы данных, то изначально ты должен делать выборку в OnGameModeInit, а потом уже ссылаться с результатом на паблик загрузки.




#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;
}


Всё, дальше сам пытайся.

Вроде ошибок нету, но крашит самп, когда вызывается эта функция/"сток" :( P.s. изменил под себя некоторые части кода


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"

Found
19.06.2016, 19:08
Вроде ошибок нету, но крашит самп, когда вызывается эта функция/"сток" :( P.s. изменил под себя некоторые части кода


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"

Точно. Забыл, писал считай на глаз.

$continue$
19.06.2016, 19:29
Зачем? (Почему нельзя просто 0?)


family_count = 0x0;


А, так код довольно таки хороший код.


P.S: Дима? Просто я знал одного скриптера, который писал подобным образом (стиль очень похож. Везде где можно ставить пробел :)) - Slaughter.

Found
19.06.2016, 20:33
Зачем? (Почему нельзя просто 0?)


family_count = 0x0;


А, так код довольно таки хороший код.


P.S: Дима? Просто я знал одного скриптера, который писал подобным образом (стиль очень похож. Везде где можно ставить пробел :)) - Slaughter.

К сожалению, нет.