Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 10 из 10
  1. #1
    Аватар для StevenH
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.10.2015
    Сообщений
    516
    Репутация:
    21 ±

    Как сделать список всех семей как на Diamond RP

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

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

  2. #2
    Аватар для gangzone.ini
    Пользователь

    Статус
    Оффлайн
    Регистрация
    15.06.2014
    Сообщений
    651
    Репутация:
    106 ±
    Ниже полный ответ)
    Последний раз редактировалось gangzone.ini; 19.06.2016 в 00:20. Причина: ...

  3. #3
    Аватар для Found
    G

    Статус
    Оффлайн
    Регистрация
    18.05.2016
    Адрес
    041b0438043f04
    Сообщений
    35
    Репутация:
    9 ±
    Постраничный вывод, тоже можно сделать. Вам уже дан код выше я его просто слегка изменю и наведу Вас на мысль.
    PHP код:

    // Константы
    const
        
    MAX_FAMILY 300,
        
    MAX_FAMILY_LINE_LIST 20;

    const
        
    d_family 999;

    // Объявляем глобальную переменную, которая содержит данные о текущей странице
    new
        
    current_pageMAX_PLAYERS char ];

    // Можно объявить глобальную переменную как счётчик и использовать её вместо константы MAX_FAMILY
    new
        
    COUNT_FAMILY

    // Структура
    enum FAMILY_STRUCT
    {
        
    F_ID,
        
    F_NAME,
        
    F_PARAMS// Для настроек различных.
    }

    new
        
    FAMILYMAX_FAMILY ][ FAMILY_STRUCT ];

    // Форвард кастомной функции с загрузкой семей
    forward loadFamily();

    // Функция, которая выводит список семей
    showFamilyListplayeridpage )
    {
        
    current_pageplayerid } = page;
        
        static const 
            
    fmt_str[] = "%d.\t\t%s";

        new 
            
    line_stringsizeoffmt_str ) + ( -32 ) ],
            
    stringsizeoffmt_str ) + ( -32 ) * MAX_FAMILY_LINE_LIST ],
            
    count,
            
    id current_pageplayerid } * MAX_FAMILY_LINE_LIST;
        
        for( new 
    idCOUNT_FAMILYi++ )
        {    
            
    formatline_stringsizeof line_stringfmt_striFAMILY[i][F_NAME] );
            
            
    strcatstringline_string );
            
            
    count++;
            
            if( 
    == MAX_FAMILY_LINE_LIST )
            {
                
    strcatstring"\t\tДалее" );
                break;
            }
            
        }
        
        if( !
    count )
            return 
    SendClientMessageplayerid, -1"На данный момент семей не существует." );
            
        return 
    ShowPlayerDialogplayeridd_familyDIALOG_STYLE_LIST"Список семей:"string"Выбрать""Закрыть" );
    }


    // Функция с подгрузкой семей
    public loadFamily()
    {
        
    COUNT_FAMILY 0x0// Обнуляем счётчик

        
    for( ... )
        {
            
    COUNT_FAMILY++;
        }       
    }

    public 
    OnPlayerConnectplayerid )
    {
        
    current_pageplayerid } = 1;

        return 
    1;
    }

    public 
    OnDialogResponseplayeriddialogidresponselistiteminputtext[] )
    {
        switch( 
    dialogid )
        {
            case 
    d_family :
            {
                if( !
    response )
                    return 
    1;
                    
                if( 
    listitem == MAX_FAMILY_LINE_LIST )
                {
                    
    showFamilyListplayeridcurrent_pageplayerid } + );
                }
            }
        }
        
        return 
    1;

    Как-то так. На работоспособность не проверял, но суть я думаю Вы должны уловить.
    Последний раз редактировалось Found; 19.06.2016 в 15:36. Причина: Исправлял ошибки и дополнял.

  4. 3 пользователя(ей) сказали cпасибо:
    Battista (19.06.2016) Sp1ke (19.06.2016) StevenH (19.06.2016)
  5. #4
    Аватар для StevenH
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.10.2015
    Сообщений
    516
    Репутация:
    21 ±
    Цитата Сообщение от Found Посмотреть сообщение
    Постраничный вывод, тоже можно сделать. Вам уже дан код выше я его просто слегка изменю и наведу Вас на мысль.
    PHP код:

    // Константы
    const
        
    MAX_FAMILY 300,
        
    MAX_FAMILY_LINE_LIST 20;

    const
        
    d_family 999;

    // Объявляем глобальную переменную, которая содержит данные о текущей странице
    new
        
    current_pageMAX_PLAYERS char ];

    // Можно объявить глобальную переменную как счётчик и использовать её вместо константы MAX_FAMILY
    new
        
    COUNT_FAMILY

    // Структура
    enum FAMILY_STRUCT
    {
        
    F_ID,
        
    F_NAME,
        
    F_PARAMS// Для настроек различных.
    }

    new
        
    FAMILYMAX_FAMILY ][ FAMILY_STRUCT ];

    // Форвард кастомной функции с загрузкой семей
    forward loadFamily();

    // Функция, которая выводит список семей
    showFamilyListplayeridpage )
    {
        
    current_pageplayerid } = page;
        
        static const 
            
    fmt_str[] = "%d.\t\t%s";

        new 
            
    line_stringsizeoffmt_str ) + ( -32 ) ],
            
    stringsizeoffmt_str ) + ( -32 ) * COUNT_FAMILY],
            
    count,
            
    id current_pageplayerid } * MAX_FAMILY_LINE_LIST;
        
        for( new 
    idCOUNT_FAMILYi++ )
        {    
            
    formatline_stringsizeof line_stringfmt_striFAMILY[i][F_NAME] );
            
            
    strcatstringline_string );
            
            
    count++;
            
            if( 
    == MAX_FAMILY_LINE_LIST )
            {
                
    strcatstring"\t\tДалее" );
                break;
            }
            
        }
        
        if( !
    count )
            return 
    SendClientMessageplayerid, -1"На данный момент семей не существует." );
            
        return 
    ShowPlayerDialogplayeridd_familyDIALOG_STYLE_LIST"Список семей:"string"Выбрать""Закрыть" );
    }


    // Функция с подгрузкой семей
    public loadFamily()
    {
        
    COUNT_FAMILY 0x0// Обнуляем счётчик

        
    for( ... )
        {
            
    COUNT_FAMILY++;
        }       
    }

    public 
    OnPlayerConnectplayerid )
    {
        
    current_pageplayerid } = 1;

        return 
    1;
    }

    public 
    OnDialogResponseplayeriddialogidresponselistiteminputtext[] )
    {
        switch( 
    dialogid )
        {
            case 
    d_family :
            {
                if( !
    response )
                    return 
    1;
                    
                if( 
    listitem == MAX_FAMILY_LINE_LIST )
                {
                    
    showFamilyListplayeridcurrent_pageplayerid } + );
                }
            }
        }
        
        return 
    1;

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

  6. #5
    Аватар для StevenH
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.10.2015
    Сообщений
    516
    Репутация:
    21 ±
    Цитата Сообщение от Found Посмотреть сообщение
    Постраничный вывод, тоже можно сделать. Вам уже дан код выше я его просто слегка изменю и наведу Вас на мысль.
    PHP код:

    // Константы
    const
        
    MAX_FAMILY 300,
        
    MAX_FAMILY_LINE_LIST 20;

    const
        
    d_family 999;

    // Объявляем глобальную переменную, которая содержит данные о текущей странице
    new
        
    current_pageMAX_PLAYERS char ];

    // Можно объявить глобальную переменную как счётчик и использовать её вместо константы MAX_FAMILY
    new
        
    COUNT_FAMILY

    // Структура
    enum FAMILY_STRUCT
    {
        
    F_ID,
        
    F_NAME,
        
    F_PARAMS// Для настроек различных.
    }

    new
        
    FAMILYMAX_FAMILY ][ FAMILY_STRUCT ];

    // Форвард кастомной функции с загрузкой семей
    forward loadFamily();

    // Функция, которая выводит список семей
    showFamilyListplayeridpage )
    {
        
    current_pageplayerid } = page;
        
        static const 
            
    fmt_str[] = "%d.\t\t%s";

        new 
            
    line_stringsizeoffmt_str ) + ( -32 ) ],
            
    stringsizeoffmt_str ) + ( -32 ) * COUNT_FAMILY],
            
    count,
            
    id current_pageplayerid } * MAX_FAMILY_LINE_LIST;
        
        for( new 
    idCOUNT_FAMILYi++ )
        {    
            
    formatline_stringsizeof line_stringfmt_striFAMILY[i][F_NAME] );
            
            
    strcatstringline_string );
            
            
    count++;
            
            if( 
    == MAX_FAMILY_LINE_LIST )
            {
                
    strcatstring"\t\tДалее" );
                break;
            }
            
        }
        
        if( !
    count )
            return 
    SendClientMessageplayerid, -1"На данный момент семей не существует." );
            
        return 
    ShowPlayerDialogplayeridd_familyDIALOG_STYLE_LIST"Список семей:"string"Выбрать""Закрыть" );
    }


    // Функция с подгрузкой семей
    public loadFamily()
    {
        
    COUNT_FAMILY 0x0// Обнуляем счётчик

        
    for( ... )
        {
            
    COUNT_FAMILY++;
        }       
    }

    public 
    OnPlayerConnectplayerid )
    {
        
    current_pageplayerid } = 1;

        return 
    1;
    }

    public 
    OnDialogResponseplayeriddialogidresponselistiteminputtext[] )
    {
        switch( 
    dialogid )
        {
            case 
    d_family :
            {
                if( !
    response )
                    return 
    1;
                    
                if( 
    listitem == MAX_FAMILY_LINE_LIST )
                {
                    
    showFamilyListplayeridcurrent_pageplayerid } + );
                }
            }
        }
        
        return 
    1;

    Как-то так. На работоспособность не проверял, но суть я думаю Вы должны уловить.
    Ругается вот на эту строку что-то:
    PHP код:
    new string[sizeof(fmt_str) + ( -32 ) * family_count]; 
    Если сделать так, ругаться не будет:
    PHP код:
    new string[sizeof(fmt_str) + ( -32 ) * 5]; 
    Сами ошибки:
    PHP код:
    error 008must be a constant expressionassumed zero
    error 009
    invalid array size (negativezero 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.

  7. #6
    Аватар для Found
    G

    Статус
    Оффлайн
    Регистрация
    18.05.2016
    Адрес
    041b0438043f04
    Сообщений
    35
    Репутация:
    9 ±
    Обновил свой код.
    PHP код:
    new string[( sizeof(fmt_str) + ( -32 ) * MAX_FAMILY_LINE_LIST ) + 10 ]; 
    Хм... Где код загрузки, ты должен дописать уже сам.

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

    PHP код:

    #define DB_FAMILY          "название_таблицы"

    public OnGameModeInit()
    {
            
    mysql_tquerymysql_connection"SELECT * FROM "DB_FAMILY"""loadFamily""" ); // mysql_connection - ваша переменная с соединением.
    }

    public 
    loadFamily()
    {
            new
                    
    rows,
                    
    fields;
            
            
    cache_get_datarowsfields );        

            if( !
    rows )
                    return print( 
    "[Family Load]: В базе данных не найдены строки." );

            
    family_count 0x0;

            for( new 
    i!= rowsi++ )
            {
                    
    cache_get_field_contenti" " ... ); // Выгрузка из бд
                    
    family_count++;
            }
            
            
    printf"[Family Load]: Загружено %d семей."family_count );

            return 
    1;

    Всё, дальше сам пытайся.
    Последний раз редактировалось Found; 19.06.2016 в 15:52.

  8. Пользователь сказал cпасибо:
    StevenH (19.06.2016)
  9. #7
    Аватар для StevenH
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.10.2015
    Сообщений
    516
    Репутация:
    21 ±
    Цитата Сообщение от Found Посмотреть сообщение
    Обновил свой код.
    PHP код:
    new string[( sizeof(fmt_str) + ( -32 ) * MAX_FAMILY_LINE_LIST ) + 10 ]; 
    Хм... Где код загрузки, ты должен дописать уже сам.

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

    PHP код:

    #define DB_FAMILY          "название_таблицы"

    public OnGameModeInit()
    {
            
    mysql_tquerymysql_connection"SELECT * FROM "DB_FAMILY"""loadFamily""" ); // mysql_connection - ваша переменная с соединением.
    }

    public 
    loadFamily()
    {
            new
                    
    rows,
                    
    fields;
            
            
    cache_get_datarowsfields );        

            if( !
    rows )
                    return print( 
    "[Family Load]: В базе данных не найдены строки." );

            
    family_count 0x0;

            for( new 
    i!= rowsi++ )
            {
                    
    cache_get_field_contenti" " ... ); // Выгрузка из бд
                    
    family_count++;
            }
            
            
    printf"[Family Load]: Загружено %d семей."family_count );

            return 
    1;

    Всё, дальше сам пытайся.
    Вроде ошибок нету, но крашит самп, когда вызывается эта функция/"сток" :( P.s. изменил под себя некоторые части кода
    PHP код:
    ShowFamilyList(playeridpage 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) + ( -32 ) * MAX_FAMILY_LINE_LIST ) + 10],
            
    ids current_page{playerid} * MAX_FAMILY_LINE_LIST;
        for(new 
    idsfamily_counti++)
        {
            
    format(line_stringsizeof(line_string), fmt_striFamilyInfo[i][fName]);
            
    strcat(stringline_string);
            if(
    == MAX_FAMILY_LINE_LIST)
            {
                
    strcat(string"\t\tДалее");
                break;
            }
        }
        
    ShowPlayerDialog(playeriddFamilyAll2"{FFEFD5}Список семей"string"Выбрать""Закрыть" );
        return 
    true;

    - - - Добавлено - - -

    Решил проблему, не было переноса строки "\n"

  10. #8
    Аватар для Found
    G

    Статус
    Оффлайн
    Регистрация
    18.05.2016
    Адрес
    041b0438043f04
    Сообщений
    35
    Репутация:
    9 ±
    Цитата Сообщение от StevenH Посмотреть сообщение
    Вроде ошибок нету, но крашит самп, когда вызывается эта функция/"сток" :( P.s. изменил под себя некоторые части кода
    PHP код:
    ShowFamilyList(playeridpage 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) + ( -32 ) * MAX_FAMILY_LINE_LIST ) + 10],
            
    ids current_page{playerid} * MAX_FAMILY_LINE_LIST;
        for(new 
    idsfamily_counti++)
        {
            
    format(line_stringsizeof(line_string), fmt_striFamilyInfo[i][fName]);
            
    strcat(stringline_string);
            if(
    == MAX_FAMILY_LINE_LIST)
            {
                
    strcat(string"\t\tДалее");
                break;
            }
        }
        
    ShowPlayerDialog(playeriddFamilyAll2"{FFEFD5}Список семей"string"Выбрать""Закрыть" );
        return 
    true;

    - - - Добавлено - - -

    Решил проблему, не было переноса строки "\n"
    Точно. Забыл, писал считай на глаз.

  11. #9
    Аватар для $continue$
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    Зачем? (Почему нельзя просто 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

  12. #10
    Аватар для Found
    G

    Статус
    Оффлайн
    Регистрация
    18.05.2016
    Адрес
    041b0438043f04
    Сообщений
    35
    Репутация:
    9 ±
    Цитата Сообщение от $continue$ Посмотреть сообщение
    Зачем? (Почему нельзя просто 0?)
    PHP код:
    family_count 0x0
    А, так код довольно таки хороший код.



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

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •