Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

Тайиер set_task

Статус пользователя Mr.Dmitry
сообщение 7.6.2012, 2:28
Сообщение #1


Стаж: 19 лет

Сообщений: 3992
Благодарностей: 853
Полезность: 463

В общем меня тут попросили доделать один плагин, и я столкнулся с проблемой. Плагин это меню режимов для deathrun. Нужно запустить таймер по окончанию которого меню закроется. Я уже создавал аналогичную тему. Часть исходника


Скрытый текст
Цитата
public ResetHUD(id){
if(cs_get_user_team(id) & CS_TEAM_T)
{
Createmenu(id)
}
}



public Createmenu(id){

menu = menu_create( "Выберите режим:", "run_menu");

mcbmenu = menu_makecallback("mcb_menu")


menu_additem( menu, "Кнопки", "1", 0, mcbmenu)
menu_additem( menu, "Фрии", "2", 0, mcbmenu)
menu_additem( menu, "Невидимость", "3", 0, mcbmenu)
menu_additem( menu, "Рэмбо", "4", 0, mcbmenu)
menu_additem( menu, "Зомби", "5", 0, mcbmenu)
menu_additem( menu, "Снежки", "6", 0, mcbmenu)
menu_additem( menu, "Вампир", "7", 0, mcbmenu)
menu_additem( menu, "Ночь", "8", 0, mcbmenu)
menu_setprop( menu, MPROP_EXIT, MEXIT_NEVER );
menu_display( id, menu, 0 );

timer = 10
set_task(1.0, "timer_func", 0, _, _, "a", 10

return PLUGIN_HANDLED;
}

...

public timer_func(id)
{

timer--
set_hudmessage(255, 255, 255, 0.03, 0.87, 0, 0.0, 0.0, 0.5, 0.0, -1)
show_hudmessage(id, "%L",0, "TIMER", last_timer)

if (timer == 0)
{
show_menu(id, 0, "^n", 1)
return PLUGIN_HANDLED
}

return 0
}


Я уже головой бьюсь об стену но не понимаю. Почему сообщение от таймера выходит еще до того как я выбрал команду. Время бежит быстрее и меню с выбором команд закрывается, если успеть выбрать команду T таймер появляется заново, но время все равно очень быстро проходит (явно не 1 сек как указано в set_task) Причем функция timer_func больше ни где не вызывается

хотелось бы сделать таймер как в galileo

Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя mazdan
сообщение 7.6.2012, 6:38
Сообщение #2


Иконка группы

Стаж: 15 лет

Сообщений: 7566
Благодарностей: 5437
Полезность: 1305

может так стоит попробовать?
Код
if(cs_get_user_team(id) == CS_TEAM_T)


Тут еще не понятно
Цитата
timer--
set_hudmessage(255, 255, 255, 0.03, 0.87, 0, 0.0, 0.0, 0.5, 0.0, -1)
show_hudmessage(id, "%L",0, "TIMER", last_timer)


+ если учесть что игрок не один, а переменная timer (или last_timer) одна, то будет не очень здорово, когда меню откроет 1, потом второй и т.п.


Не пишите мне в ЛС. Пишите на почту. В ЛС я пропускаю сообщения.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Fred Perry
сообщение 7.6.2012, 8:29
Сообщение #3


Иконка группы

Стаж: 16 лет

Сообщений: 6594
Благодарностей: 2370
Полезность: 813

Я не очень скриптер, но может быть после выбора надо сделать
Код
remove_task


Отредактировал: Fred Perry, - 7.6.2012, 8:29


You become responsible, forever, for what you have tamed
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Mr.Dmitry
сообщение 8.6.2012, 11:43
Сообщение #4


Стаж: 19 лет

Сообщений: 3992
Благодарностей: 853
Полезность: 463

Скрытый текст
new timer, last_timer, g_timer, g_player_t
public plugin_init() {

RegisterHam(Ham_Spawn, "player", "fw_PlayerSpawn_Post", 1)

g_timer = register_cvar("amx_timer_menu", "10")

}

public fw_PlayerSpawn_Post(id)
{
if(is_user_connected(id) && is_user_alive(id) && cs_get_user_team(id)==CS_TEAM_T)
{
g_player_t = id
Createmenu(id)
last_timer = get_pcvar_num(g_timer)
timer = get_pcvar_num(g_timer)
set_task(1.0, "timer_func", 0, _, _, "a", timer)
}
return PLUGIN_CONTINUE;
}



public Createmenu(id){

menu = menu_create( "Выберите режим:", "run_menu");

mcbmenu = menu_makecallback("mcb_menu")


menu_additem( menu, "Кнопки", "1", 0, mcbmenu)
menu_additem( menu, "Фрии", "2", 0, mcbmenu)
menu_additem( menu, "Невидимость", "3", 0, mcbmenu)
menu_additem( menu, "Рэмбо", "4", 0, mcbmenu)
menu_additem( menu, "Зомби", "5", 0, mcbmenu)
menu_additem( menu, "Снежки", "6", 0, mcbmenu)
menu_additem( menu, "Вампир", "7", 0, mcbmenu)
menu_addblank(menu, 0)
new timerstring[64]
formatex( timerstring, charsmax( timerstring ), "%L", id, "TIMER", last_timer);
menu_addtext(menu, timerstring, 0)
menu_additem( menu, "Ночь", "8", 0, mcbmenu)
menu_addblank(menu, 0)
formatex( timerstring, charsmax( timerstring ), "%L", id, "TIMER", last_timer);
menu_addtext(menu, timerstring, 0)

menu_setprop( menu, MPROP_EXIT, MEXIT_NEVER );
menu_display( id, menu, 0 );

return PLUGIN_HANDLED;
}

...

public timer_func(id)
{
last_timer--
if(cs_get_user_team(g_player_t)==CS_TEAM_T && is_user_alive(g_player_t))
{
show_menu(g_player_t, 0, "^n", 1)
Createmenu(g_player_t)
}

if (last_timer == 0)
{
if (cs_get_user_team(g_player_t)==CS_TEAM_T && is_user_alive(g_player_t))
{
show_menu(g_player_t, 0, "^n", 1)
}
}

return PLUGIN_CONTINUE
}


Сделал в общем вот такой вот таймер для меню, но он работает как то странно, как будто живет своей жизнью, в плане того что он то стоит, то начинает очень быстро идти(секунды очень быстро проходят), то работает как надо ((
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя mazdan
сообщение 8.6.2012, 12:19
Сообщение #5


Иконка группы

Стаж: 15 лет

Сообщений: 7566
Благодарностей: 5437
Полезность: 1305

Цитата(Mr.Dmitry @ 8.6.2012, 13:43) *
Скрытый текст
new timer, last_timer, g_timer, g_player_t
public plugin_init() {

RegisterHam(Ham_Spawn, "player", "fw_PlayerSpawn_Post", 1)

g_timer = register_cvar("amx_timer_menu", "10")

}

public fw_PlayerSpawn_Post(id)
{
if(is_user_connected(id) && is_user_alive(id) && cs_get_user_team(id)==CS_TEAM_T)
{
g_player_t = id
Createmenu(id)
last_timer = get_pcvar_num(g_timer)
timer = get_pcvar_num(g_timer)
set_task(1.0, "timer_func", 0, _, _, "a", timer)
}
return PLUGIN_CONTINUE;
}



public Createmenu(id){

menu = menu_create( "Выберите режим:", "run_menu");

mcbmenu = menu_makecallback("mcb_menu")


menu_additem( menu, "Кнопки", "1", 0, mcbmenu)
menu_additem( menu, "Фрии", "2", 0, mcbmenu)
menu_additem( menu, "Невидимость", "3", 0, mcbmenu)
menu_additem( menu, "Рэмбо", "4", 0, mcbmenu)
menu_additem( menu, "Зомби", "5", 0, mcbmenu)
menu_additem( menu, "Снежки", "6", 0, mcbmenu)
menu_additem( menu, "Вампир", "7", 0, mcbmenu)
menu_addblank(menu, 0)
new timerstring[64]
formatex( timerstring, charsmax( timerstring ), "%L", id, "TIMER", last_timer);
menu_addtext(menu, timerstring, 0)
menu_additem( menu, "Ночь", "8", 0, mcbmenu)
menu_addblank(menu, 0)
formatex( timerstring, charsmax( timerstring ), "%L", id, "TIMER", last_timer);
menu_addtext(menu, timerstring, 0)

menu_setprop( menu, MPROP_EXIT, MEXIT_NEVER );
menu_display( id, menu, 0 );

return PLUGIN_HANDLED;
}

...

public timer_func(id)
{
last_timer--
if(cs_get_user_team(g_player_t)==CS_TEAM_T && is_user_alive(g_player_t))
{
show_menu(g_player_t, 0, "^n", 1)
Createmenu(g_player_t)
}

if (last_timer == 0)
{
if (cs_get_user_team(g_player_t)==CS_TEAM_T && is_user_alive(g_player_t))
{
show_menu(g_player_t, 0, "^n", 1)
}
}

return PLUGIN_CONTINUE
}


Сделал в общем вот такой вот таймер для меню, но он работает как то странно, как будто живет своей жизнью, в плане того что он то стоит, то начинает очень быстро идти(секунды очень быстро проходят), то работает как надо ((

я же писал вам, что так не получится.
Цитата
+ если учесть что игрок не один, а переменная timer (или last_timer) одна, то будет не очень здорово, когда меню откроет 1, потом второй и т.п.

У вас спавн происходит не одномоментно.
У вас почему один таймер только? для одного человека плагин что ли?
если таймер общий для всех, то зачем его вешать на spawn конкретного игрока?
если таймер для всех, то это не last_timer, а last_timer[32] и в каждой ячейке свой таймер для каждого игрока.
if(is_user_connected(id) && is_user_alive(id) && cs_get_user_team(id)==CS_TEAM_T) во-первых можно
if(is_user_alive(id) && cs_get_user_team(id)==CS_TEAM_T)
во вторых, не уверен (не знаю как выполняется условие), но возможно при отсутствии игрока cs_get_user_team(id) выдаст ошибку (это в случае если if работает уже с итогом и cs_get_user_team(id) выдает ошибку при отсутствии игрока на сервере) как решение проблемы (если возникнет) сделать два разных условия


Не пишите мне в ЛС. Пишите на почту. В ЛС я пропускаю сообщения.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя AndrewZ
сообщение 8.6.2012, 12:48
Сообщение #6


Иконка группы

Стаж: 18 лет
Город: Санкт-Петербург


Сообщений: 4700
Благодарностей: 2452
Полезность: 1018

готово : )

http://clip2net.com/s/20XUy

только я не знаю как закрыть меню после конца таймера. Ну, как вариант показать пустую меню, но ведь это глупо? Кто знает может подсказать, будет хорошо.

Скрытый текст
Код
#include <amxmodx>
#include <amxmisc>

#define PLUGIN                    "Test Menu"
#define VERSION                    "0.1"
#define AUTHOR                    "AndrewZ"

#define TID_MENU                13337
#define TIMER_TIME                15


new timer[ 33 ]

public plugin_init()
{
    register_plugin( PLUGIN, VERSION, AUTHOR )

    register_clcmd( "say /test", "cmd_MenuTask" )
    register_menu( "show_testmenu", -1, "handler_testmenu" )
}

public cmd_MenuTask( id )
{
    timer[ id ] = TIMER_TIME
    cmd_Menu( id + TID_MENU )
    set_task( 1.0, "cmd_Menu", id + TID_MENU, _, _, "b" )
}

public cmd_Menu( id )
{
    id -= TID_MENU
    
    if( timer[ id ] < 0 )
    {
        remove_task( id + TID_MENU )
        timer[ id ] = TIMER_TIME
        //menu_destroy( )
        return PLUGIN_HANDLED
    }
    
    new menu[ 512 ], len, keys = MENU_KEY_1 + MENU_KEY_2 + MENU_KEY_3 + MENU_KEY_4
    
    len = formatex( menu, charsmax( menu ), "\rЗаголовок меню:" )
    
    len += formatex( menu[ len ], charsmax( menu ) - len, "^n^n\r1. \wОлоло" )
    len += formatex( menu[ len ], charsmax( menu ) - len, "^n\r2. \wТрололо" )
    len += formatex( menu[ len ], charsmax( menu ) - len, "^n\r3. \wОлолотрололо" )
    len += formatex( menu[ len ], charsmax( menu ) - len, "^n\r4. \wА я - веселая хурма!" )
    
    len += formatex( menu[ len ], charsmax( menu ) - len, "^n^n^n\wДо закрытия меню \r%d\w сек!", timer[ id ] )
    
    show_menu( id, keys, menu, _, "show_testmenu" )
    
    timer[ id ] --
    
    return PLUGIN_HANDLED
}

public handler_testmenu( id, key )
{
    key ++

    switch( key )
    {
        case 1: client_print( id, print_chat, "Выбран пункт 1" )
        case 2: client_print( id, print_chat, "Выбран пункт 2" )
        case 3: client_print( id, print_chat, "Выбран пункт 3" )
        case 4: client_print( id, print_chat, "Выбран пункт 4" )
    }
    
    remove_task( id + TID_MENU )
    timer[ id ] = TIMER_TIME
}


mazdan,
почему [ 32 ]? ведь id игроков 1-32 а не 0-31 ; )

Отредактировал: AndrewZ, - 8.6.2012, 12:45


Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя mazdan
сообщение 8.6.2012, 13:15
Сообщение #7


Иконка группы

Стаж: 15 лет

Сообщений: 7566
Благодарностей: 5437
Полезность: 1305

Цитата(AndrewZ @ 8.6.2012, 14:48) *
готово : )
только я не знаю как закрыть меню после конца таймера. Ну, как вариант показать пустую меню, но ведь это глупо? Кто знает может подсказать, будет хорошо.
mazdan,
почему [ 32 ]? ведь id игроков 1-32 а не 0-31 ; )

это вместо спасибо? интересный подход.
кроме того 0-31 содержит 32 ячейки, никто не помешает мне сделать timer[id - 1]


Не пишите мне в ЛС. Пишите на почту. В ЛС я пропускаю сообщения.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
noskill
сообщение 8.6.2012, 13:22
Сообщение #8
Стаж: 14 лет

Сообщений: 3086
Благодарностей: 1493
Полезность: 0

Цитата(mazdan @ 8.6.2012, 14:15) *
это вместо спасибо? интересный подход.
кроме того 0-31 содержит 32 ячейки, никто не помешает мне сделать timer[id - 1]

то есть математические вычисления более выгодны, чем выделить на одну ячейку больше памяти?
интересный у вас подход к "качественному" коду)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя mazdan
сообщение 8.6.2012, 13:27
Сообщение #9


Иконка группы

Стаж: 15 лет

Сообщений: 7566
Благодарностей: 5437
Полезность: 1305

Цитата(csnetua @ 8.6.2012, 15:22) *
то есть математические вычисления более выгодны, чем выделить на одну ячейку больше памяти?
интересный у вас подход к "качественному" коду)

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


Не пишите мне в ЛС. Пишите на почту. В ЛС я пропускаю сообщения.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
  Тема закрытаНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: