Русское сообщество по скриптингу

[ZP] Level System | native | Хэлпаните пожалуйста  [Решено]

Все вопросы по скриптингу для AMXX, помощь в редактировании плагинов.

Модераторы: Subb98, liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для AMX Mod X.

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.

[ZP] Level System | native | Хэлпаните пожалуйста

Сообщение izumi4 » 21 ноя 2019, 14:59

Пытаюсь сделать вывод уровня игрока в его сообщении в чате

В плагине Level System зареганы natives:

Код: Выделить всё

public plugin_natives
( )
{
    register_native( "ZP_GetUserData", "Native_GetUserData", 1 ); // Получает [0 - Уровень | 1 - Опыт] игрока. Использование: ZP_GetUserData( iPlayer, 0 );
    register_native( "ZP_GetUserExpForNextLevel", "Native_GetUserExpForNextLevel", 1 ); // Получает, сколько нужно опыта, для след. уровня. Использование: ZP_GetUserExpForNextLevel( iPlayer );
    register_native( "ZP_SetUserData", "Native_SetUserData", 1 ); // Устанавливает  [0 - Уровень | 1 - Опыт] игрока. Использование: ZP_SetUserData( iPlayer, 1, 10 );
    register_native( "ZP_CheckUserNextLevel", "Native_CheckUserNextLevel", 1 ); // Проверяет, достиг ли игрок нового уровня, если да, то обновляет уровень игрока. Использование: ZP_CheckUserNextLevel( iPlayer );
}
// Natives
public Native_GetUserData( iPlayer, iType )
    return g_iUserData[ iPlayer ][ iType ];

public Native_GetUserExpForNextLevel( iPlayer )
    return iExperienceMulti *( g_iUserData[ iPlayer ][ Level ] +);

public Native_SetUserData( iPlayer, iType, iValue )
    g_iUserData[ iPlayer ][ iType ] = iValue;

public Native_CheckUserNextLevel( iPlayer )
{
    if( g_iUserData[ iPlayer ][ Experience ] > Native_GetUserExpForNextLevel( iPlayer ) )
    {
        g_iUserData[ iPlayer ][ Experience ] -= Native_GetUserExpForNextLevel( iPlayer );
        g_iUserData[ iPlayer ][ Level ] += 1;
    }
}
 


Мне нужен натив:

Код: Выделить всё
register_native( "ZP_GetUserData", "Native_GetUserData", 1 ); // Получает [0 - Уровень | 1 - Опыт] игрока. Использование: ZP_GetUserData( iPlayer, 0 );     


В плагине который работает с чатом (в моем случае это Admin prefix) я делаю следующее:

Добавляю в начале:

Код: Выделить всё
native  ZP_GetUserData(iPlayer


Далее в HookSay:

Код: Выделить всё

public HookSay
(id,iPlayer)
{
    read_args(g_typed, charsmax(g_typed))
    remove_quotes(g_typed)

    trim(g_typed)

    if(equal(g_typed, "") || !is_user_connected(id))
        return PLUGIN_HANDLED_MAIN

    num_to_str
(id, str_id, charsmax(str_id))

    if((TrieGetString(client_prefix, str_id, temp_prefix, charsmax(temp_prefix)) && get_pcvar_num(g_say_characters) == 1) || (!TrieGetString(client_prefix, str_id, temp_prefix, charsmax(temp_prefix)) && get_pcvar_num(g_say_characters) == 2) || get_pcvar_num(g_say_characters) == 3)
    {
        if(check_say_characters(g_typed))
            return PLUGIN_HANDLED_MAIN
    
}

    get_user_name(id, g_name, charsmax(g_name))

    g_team = get_user_team(id)
    new g_Lvl = ZP_GetUserData(iPlayer)

    new const team_info[2][][] = {
        {"*SPEC* ", "*SPEC* ", "*SPEC* ", "*SPEC* "},
        {"", "", "", ""}
    }

    if(temp_prefix[0])
    {
        formatex(g_message, charsmax(g_message), "^1%s^3[Уровень: %d]%s^4 %s :^3 %s", team_info[is_user_alive(id)][g_team], g_Lvl, temp_prefix, g_name, g_typed)
        change_team_info(id, g_team_names[0])
    }
    else
    
{
        formatex(g_message, charsmax(g_message), "^1%s^3[Уровень: %d]%s :^1 %s", team_info[is_user_alive(id)][g_team], g_Lvl, g_name, g_typed)
    }

    get_pcvar_string(g_listen_flag, temp_cvar, charsmax(temp_cvar))

    for(new i = 1; i <= g_maxplayers; i++)
    {
        if(!is_user_connected(i))
            continue

        if
(is_user_alive(id) && is_user_alive(i) || !is_user_alive(id) && !is_user_alive(i) || get_pcvar_num(g_listen) && get_user_flags(i) & read_flags(temp_cvar))
        {
            send_message(g_message, id, i)
        }
    }

    change_team_info(id, g_team_names[g_team])

    return PLUGIN_HANDLED_MAIN
}
 


И в чате уровни всегда по 0

Вы должны зарегистрироваться, чтобы видеть ссылки.


Код: Выделить всё
#include < amxmodx >
#include < fakemeta >
#include < hamsandwich >
#include < dhudmessage >
#include < zombieplague >
#include < sqlx >

#define MAX_CLIENTS        32

enum ( += 100 )
{
    TASK_SHOWHUD = 4000,
    TASK_LOAD_DATA
};

enum _:eData
{
    Level = 0,
    Experience
};

// CBaseMonster
#define m_LastHitGroup    75

#define USERHUD_NOTICE    0, 139, 139, 0.02, 0.29 // Красный, Зелёный, Синий, X Позиция, Y Позиция

new const Float: flGetExpirenceForDamage = 2500.0; // Нужно урона, чтобы получить 1 опыт
new const iGetExpirenceForKillZombie = 1; // Игрок получит, за убийство зомби
new const iGetExpirenceForKillZombieHead = 2; // Игрок получить, за убийство зомби в голову
new const iExperienceMulti = 10; // Умножение последующего достижения опыта, для нового уровня 
new const iMaxUserLevel = 100; // Максимальный уровень игрока

#define SQL_HOST        ""
#define SQL_USER        ""
#define SQL_PASSWORD    ""
#define SQL_DATABASE    ""
#define SQL_TABLENAME    "zp_level_system"

new g_iUserData[ MAX_CLIENTS +][ eData ];

new bool: g_bUserLoaded[ MAX_CLIENTS +];

new Float: g_flUserDamage[ MAX_CLIENTS +];

new g_szUserSteamID[ MAX_CLIENTS +][ 34 ];
new g_szQuery[ 512 ]; 

new Handle
: g_hDBTuple; 
new Handle
: g_hConnect;

public plugin_init( )
{
    register_plugin( "[ZP] Level System", "Best", "t3rkecorejz" );
    
    register_event
( "HLTV", "EV_RoundStart", "a", "1=0", "2=0" );
    
    RegisterHam
( Ham_Killed, "player", "CPlayer__Killed_Post", .Post = 1 );
    RegisterHam( Ham_TakeDamage, "player", "CPlayer__TakeDamage_Post", .Post = 1 );
}

public plugin_natives( )
{
    register_native( "ZP_GetUserData", "Native_GetUserData", 1 ); // Получает [0 - Уровень | 1 - Опыт] игрока. Использование: ZP_GetUserData( iPlayer, 0 );
    register_native( "ZP_GetUserExpForNextLevel", "Native_GetUserExpForNextLevel", 1 ); // Получает, сколько нужно опыта, для след. уровня. Использование: ZP_GetUserExpForNextLevel( iPlayer );
    register_native( "ZP_SetUserData", "Native_SetUserData", 1 ); // Устанавливает  [0 - Уровень | 1 - Опыт] игрока. Использование: ZP_SetUserData( iPlayer, 1, 10 );
    register_native( "ZP_CheckUserNextLevel", "Native_CheckUserNextLevel", 1 ); // Проверяет, достиг ли игрок нового уровня, если да, то обновляет уровень игрока. Использование: ZP_CheckUserNextLevel( iPlayer );
}

public plugin_cfg( ) SQL_LoadDebug( );
public plugin_end( ) 
{
    if( g_hDBTuple ) 
        SQL_FreeHandle
( g_hDBTuple );
    
    if
( g_hConnect ) 
        SQL_FreeHandle
( g_hConnect );
    
    return
;
}

public client_putinserver( iPlayer ) 
{
    set_task( random_float( 1.0, 3.0 ), "CTask__LoadData", iPlayer +TASK_LOAD_DATA );
    set_task( 1.0, "CTask__ShowUserHud", iPlayer +TASK_SHOWHUD, _, _, .flags = "b" );
}

public client_disconnect( iPlayer )
{
    if( !g_bUserLoaded[ iPlayer ] )
        return;
    
    formatex
( g_szQuery, charsmax( g_szQuery ), "UPDATE `%s` SET `Level` = '%d', `Experience` = '%d' WHERE `%s`.`SteamID` = '%s';", SQL_TABLENAME, g_iUserData[ iPlayer ][ Level ], g_iUserData[ iPlayer ][ Experience ], SQL_TABLENAME, g_szUserSteamID[ iPlayer ] );
    SQL_ThreadQuery( g_hDBTuple, "SQL_ThreadQueryHandler", g_szQuery );
}

// Events
public EV_RoundStart( )
{
    for( new iPlayer = 1; iPlayer <= MAX_CLIENTS; iPlayer++ )
    {
        if( !is_user_connected( iPlayer ) )
            continue;
        
        if
( !g_bUserLoaded[ iPlayer ] )
            return;
        
        formatex
( g_szQuery, charsmax( g_szQuery ), "UPDATE `%s` SET `Level` = '%d', `Experience` = '%d' WHERE `%s`.`SteamID` = '%s';", SQL_TABLENAME, g_iUserData[ iPlayer ][ Level ], g_iUserData[ iPlayer ][ Experience ], SQL_TABLENAME, g_szUserSteamID[ iPlayer ] );
        SQL_ThreadQuery( g_hDBTuple, "SQL_ThreadQueryHandler", g_szQuery );
    }
}

// Ham
public CPlayer__Killed_Post( iVictim, iInflictor, iAttacker )
{
    if( !is_user_connected( iVictim ) || !is_user_connected( iAttacker ) || iVictim == iAttacker )
        return;
    
    if
( g_iUserData[ iAttacker ][ Level ] >= iMaxUserLevel )
        return;
    
    if
( zp_get_user_zombie( iVictim ) && !zp_get_user_zombie( iAttacker ) )
    {
        if( get_pdata_int( iVictim, m_LastHitGroup, 5 ) == HIT_HEAD )
        {
            g_iUserData[ iAttacker ][ Experience ] += iGetExpirenceForKillZombieHead;
            return;
        }
        
        g_iUserData
[ iAttacker ][ Experience ] += iGetExpirenceForKillZombie;
        Native_CheckUserNextLevel( iAttacker );
    }
    return;
}

public CPlayer__TakeDamage_Post( iVictim, iInflictor, iAttacker, Float: flDamage )
{
    if( !is_user_connected( iVictim ) || !is_user_connected( iAttacker ) || iVictim == iAttacker )
        return;
    
    if
( g_iUserData[ iAttacker ][ Level ] >= iMaxUserLevel )
        return;
    
    if
( zp_get_user_zombie( iVictim ) && !zp_get_user_zombie( iAttacker ) )
    {
        g_flUserDamage[ iAttacker ] += flDamage;
        
        if
( g_flUserDamage[ iAttacker ] >= flGetExpirenceForDamage )
        {
            while( g_flUserDamage[ iAttacker ] >= flGetExpirenceForDamage )
            {
                g_flUserDamage[ iAttacker ] -= flGetExpirenceForDamage;
                g_iUserData[ iAttacker ][ Experience ] += 1;
            }
        }
        Native_CheckUserNextLevel( iAttacker );
    }
    return;
}

// Task
public CTask__LoadData( iTask )
{
    new iPlayer = iTask -TASK_LOAD_DATA;
    
    if
( !is_user_connected( iPlayer ) )
        return;
    
    new iParams
[ 1 ];
    iParams [ 0 ] = iPlayer;
    
    get_user_authid
( iPlayer, g_szUserSteamID[ iPlayer ], charsmax( g_szUserSteamID[ ] ) );
    
    formatex
( g_szQuery, charsmax( g_szQuery ), "SELECT * FROM `%s` WHERE ( `%s`.`SteamID` = '%s' )", SQL_TABLENAME, SQL_TABLENAME, g_szUserSteamID[ iPlayer ] );
    SQL_ThreadQuery( g_hDBTuple, "SQL_QueryConnection", g_szQuery, iParams, sizeof iParams );
}

public CTask__ShowUserHud( iTask )
{
    new iPlayer = iTask -TASK_SHOWHUD;
    
    if
( !is_user_alive( iPlayer ) )
        return;
    
    set_dhudmessage
( USERHUD_NOTICE, 0, 0.0, 1.1, 0.0, 0.0, false );
    show_dhudmessage( iPlayer, "[Уровень: %d] ^n[Опыт: %d%%]", g_iUserData[ iPlayer ][ Level ], floatround( 99.0 / Native_GetUserExpForNextLevel( iPlayer ) * g_iUserData[ iPlayer ][ Experience ] ) );
}

// MySQL
public SQL_LoadDebug( ) 
{
    new szError[ 512 ];
    new iErrorCode;
    
    g_hDBTuple 
= SQL_MakeDbTuple( SQL_HOST, SQL_USER, SQL_PASSWORD, SQL_DATABASE );
    g_hConnect = SQL_Connect( g_hDBTuple, iErrorCode, szError, charsmax( szError ) );
    
    if
( g_hConnect == Empty_Handle )
        set_fail_state( szError );
    
    if
( !SQL_TableExists( g_hConnect, SQL_TABLENAME ) )
    {
        new Handle: hQueries; 
        new szQuery
[ 512 ];
        
        formatex
( szQuery, charsmax( szQuery ), "CREATE TABLE IF NOT EXISTS `%s` ( SteamID varchar( 32 ) CHARACTER SET cp1250 COLLATE cp1250_general_ci NOT NULL, Level INT NOT NULL, Experience INT NOT NULL, PRIMARY KEY ( SteamID ) )", SQL_TABLENAME );
        hQueries = SQL_PrepareQuery( g_hConnect, szQuery );
        
        if
( !SQL_Execute( hQueries ) )
        {
            SQL_QueryError( hQueries, szError, charsmax( szError ) );
            set_fail_state( szError );
        }
        SQL_FreeHandle( hQueries );    
    
}
    SQL_QueryAndIgnore( g_hConnect, "SET NAMES utf8" );
}

public SQL_QueryConnection( iState, Handle: hQuery, szError[ ], iErrorCode, iParams[ ], iParamsSize )
{
    switch( iState )
    {
        case TQUERY_CONNECT_FAILED: log_amx( "Load - Could not connect to SQL database. [%d] %s", iErrorCode, szError );
        case TQUERY_QUERY_FAILED: log_amx( "Load Query failed. [%d] %s", iErrorCode, szError );
    }
    
    new iPlayer 
= iParams[ 0 ];
    g_bUserLoaded[ iPlayer ] = true;
    
    if
( SQL_NumResults( hQuery ) < 1 )
    {
        if( equal( g_szUserSteamID[ iPlayer ], "ID_PENDING" ) )
            return PLUGIN_HANDLED;

        g_iUserData[ iPlayer ] = { 1, 0 }

        formatex( g_szQuery, charsmax( g_szQuery ), "INSERT INTO `%s` ( `SteamID`, `Level`, `Experience` ) VALUES ( '%s', '%d', '%d' );", SQL_TABLENAME, g_szUserSteamID[ iPlayer ], g_iUserData[ iPlayer ][ Level ], g_iUserData[ iPlayer ][ Experience ] );
        SQL_ThreadQuery( g_hDBTuple, "SQL_ThreadQueryHandler", g_szQuery );
        
        return PLUGIN_HANDLED
;
    }
    else
    
{
        g_iUserData[ iPlayer ][ Level ] = SQL_ReadResult( hQuery, 1 );
        g_iUserData[ iPlayer ][ Experience ] = SQL_ReadResult( hQuery, 2 );
    }
    
    return PLUGIN_HANDLED
;
}

public SQL_ThreadQueryHandler( iState, Handle: hQuery, szError[ ], iErrorCode, iParams[ ], iParamsSize )
{
    if( iState == 0 )
        return;
    
    log_amx
( "SQL Error: %d (%s)", iErrorCode, szError );
}

// Natives
public Native_GetUserData( iPlayer, iType )
    return g_iUserData[ iPlayer ][ iType ];

public Native_GetUserExpForNextLevel( iPlayer )
    return iExperienceMulti *( g_iUserData[ iPlayer ][ Level ] +);

public Native_SetUserData( iPlayer, iType, iValue )
    g_iUserData[ iPlayer ][ iType ] = iValue;

public Native_CheckUserNextLevel( iPlayer )
{
    if( g_iUserData[ iPlayer ][ Experience ] > Native_GetUserExpForNextLevel( iPlayer ) )
    {
        g_iUserData[ iPlayer ][ Experience ] -= Native_GetUserExpForNextLevel( iPlayer );
        g_iUserData[ iPlayer ][ Level ] += 1;
    }
}

// Stocks
stock bool: SQL_TableExists( Handle: hDataBase, const szTable[ ] )
{
    new Handle: hQuery = SQL_PrepareQuery( hDataBase, "SELECT * FROM information_schema.tables WHERE table_name = '%s' LIMIT 1;", szTable );
    new szError[ 512 ];
    
    if
( !SQL_Execute( hQuery ) )
    {
        SQL_QueryError( hQuery, szError, charsmax( szError ) );
        set_fail_state( szError );
    }
    else if( !SQL_NumResults( hQuery ) )
    {
        SQL_FreeHandle( hQuery );
        return false;
    }
    SQL_FreeHandle( hQuery );
    return true;
}
 


Подскажите пожалуйста, что я делаю неправильно?
Аватара пользователя
izumi4
 
Сообщения: 82
Зарегистрирован: 03 ноя 2019, 12:25
Благодарил (а): 9 раз.
Поблагодарили: 9 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn

Re: [ZP] Level System | native | Хэлпаните пожалуйста

Сообщение xbass13 » 21 ноя 2019, 16:55

Через два слеша написано как им пользоваться
Делаем так:
Код: Выделить всё

native  ZP_GetUserData
(iPlayerparam)
 


Получение уровня:
Код: Выделить всё
new g_Lvl ZP_GetUserData(iPlayer0
Аватара пользователя
xbass13
 
Сообщения: 96
Зарегистрирован: 13 июн 2012, 21:20
Благодарил (а): 36 раз.
Поблагодарили: 35 раз.
Опыт программирования: Больше трех лет
Языки программирования: pawn, c++, js, php

Re: [ZP] Level System | native | Хэлпаните пожалуйста

Сообщение izumi4 » 21 ноя 2019, 21:58

Не работает(

Пробовал еще вот так:

Код: Выделить всё
#include <amxmodx>
#include <amxmisc>
    
#define PLUGIN "Native test"
#define VERSION "1.0"
#define AUTHOR "Admin"

native  ZP_GetUserData(iPlayer, param)
    
public plugin_init
() 
{
    register_plugin(PLUGIN, VERSION, AUTHOR)
         
    register_clcmd
("say /native","test_native")
}
public test_native(id,iPlayer)
{
    new g_Lvl = ZP_GetUserData(iPlayer, 0) 
    client_print
(id,print_chat,"[Уровень: %d]",g_Lvl)    
}


Такая же история, уровень почему-то не возвращает и все
Аватара пользователя
izumi4
 
Сообщения: 82
Зарегистрирован: 03 ноя 2019, 12:25
Благодарил (а): 9 раз.
Поблагодарили: 9 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn

Re: [ZP] Level System | native | Хэлпаните пожалуйста

Сообщение RSO_ » 21 ноя 2019, 22:57

а всё остальное работает ?

public plugin_natives( )
{
register_native( "ZP_GetUserData", "Native_GetUserData", 1 ); // Получает [0 - Уровень | 1 - Опыт] игрока. Использование: ZP_GetUserData( iPlayer, 0 );
register_native( "ZP_GetUserExpForNextLevel", "Native_GetUserExpForNextLevel", 1 ); // Получает, сколько нужно опыта, для след. уровня. Использование: ZP_GetUserExpForNextLevel( iPlayer );
register_native( "ZP_SetUserData", "Native_SetUserData", 1 ); // Устанавливает [0 - Уровень | 1 - Опыт] игрока. Использование: ZP_SetUserData( iPlayer, 1, 10 );
register_native( "ZP_CheckUserNextLevel", "Native_CheckUserNextLevel", 1 ); // Проверяет, достиг ли игрок нового уровня, если да, то обновляет уровень игрока. Использование: ZP_CheckUserNextLevel( iPlayer );
}

я не знаю что что там выводит но попробуй для начало
вывести в чат с переменной или функции строку и число

client_print(id,print_chat,"[Уровень: %d]",g_Lvl)

client_print(id,print_chat,"[Уровень: %s]",g_Lvl)
слава великой сонтаранской империи !
Аватара пользователя
RSO_
 
Сообщения: 280
Зарегистрирован: 20 окт 2019, 21:40
Откуда: от верблюда
Благодарил (а): 45 раз.
Поблагодарили: 20 раз.
Опыт программирования: Меньше недели
Языки программирования: . . . 100 ISQ

Re: [ZP] Level System | native | Хэлпаните пожалуйста  [Решено]

Сообщение xbass13 » 22 ноя 2019, 00:27

Теперь тест неправильный :acute:
Код: Выделить всё
public test_native(id,iPlayer)
{
    new g_Lvl = ZP_GetUserData(iPlayer, 0) 
    client_print
(id,print_chat,"[Уровень: %d]",g_Lvl)    
}

=>
Код: Выделить всё

public test_native
(id)
{
    new g_Lvl = ZP_GetUserData(id, 0) 
    client_print
(id,print_chat,"[Уровень: %d]",g_Lvl)    
}


PS Если все равно вернется 0, то скорее всего в Level System уровень == 0
Аватара пользователя
xbass13
 
Сообщения: 96
Зарегистрирован: 13 июн 2012, 21:20
Благодарил (а): 36 раз.
Поблагодарили: 35 раз.
Опыт программирования: Больше трех лет
Языки программирования: pawn, c++, js, php

Re: [ZP] Level System | native | Хэлпаните пожалуйста

Сообщение RSO_ » 22 ноя 2019, 00:46

:-)
слава великой сонтаранской империи !
Аватара пользователя
RSO_
 
Сообщения: 280
Зарегистрирован: 20 окт 2019, 21:40
Откуда: от верблюда
Благодарил (а): 45 раз.
Поблагодарили: 20 раз.
Опыт программирования: Меньше недели
Языки программирования: . . . 100 ISQ

Re: [ZP] Level System | native | Хэлпаните пожалуйста

Сообщение izumi4 » 22 ноя 2019, 07:28

xbass13 писал(а):Теперь тест неправильный :acute:
Код: Выделить всё
public test_native(id,iPlayer)
{
    new g_Lvl = ZP_GetUserData(iPlayer, 0) 
    client_print
(id,print_chat,"[Уровень: %d]",g_Lvl)    
}

=>
Код: Выделить всё

public test_native
(id)
{
    new g_Lvl = ZP_GetUserData(id, 0) 
    client_print
(id,print_chat,"[Уровень: %d]",g_Lvl)    
}


PS Если все равно вернется 0, то скорее всего в Level System уровень == 0


Все работает, огромное спасибо тебе!

Глянь как красиво :D

Вы должны зарегистрироваться, чтобы видеть ссылки.
Аватара пользователя
izumi4
 
Сообщения: 82
Зарегистрирован: 03 ноя 2019, 12:25
Благодарил (а): 9 раз.
Поблагодарили: 9 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn


Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5