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

Кастомный think (ошибка в условии??)

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

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

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

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

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

Кастомный think (ошибка в условии??)

Сообщение hren_morjovui » 05 янв 2020, 15:20

В общем есть (к примеру)

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

register_think
(think_classname, "my_think");

public my_think(entity_id)
{
    pev(entity_id, pev_fuser1, time_delay);
    if(time_delay > 0.0 && time_delay < halflife_time())
    {
        set_pev(entity_id, pev_fuser1, (halflife_time() + 0.07));
        client_print(0,print_chat,"Сообщение!");
        return;
    }

    set_pev(entity_id, pev_nextthink, (halflife_time() + 0.05));
}
 


Должно выводить сообщение каждые 0.07 секунд но почему-то выводит каждые 0.05, а если
Код: Выделить всё
set_pev(entity_id, pev_fuser1, (halflife_time() + 0.1)); 
то выводит правильно, каждые 0.1 сек.

Подскажите что не так?
Последний раз редактировалось hren_morjovui 06 янв 2020, 19:42, всего редактировалось 2 раз(а).
"В этом мире неизбежны три вещи: смерть, налоги и гравитация."
Аватара пользователя
hren_morjovui
 
Сообщения: 258
Зарегистрирован: 29 май 2018, 09:15
Благодарил (а): 88 раз.
Поблагодарили: 22 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn
PHP
jQuery

Re: Кастомный think (ошибка в условии??)

Сообщение xbass13 » 05 янв 2020, 16:17

Всю голову сломал, какой результат должен быть?

Если просто спамить каждые n секунд, и нет каких-либо влияний извне на pev_fuser1, то этого достаточно:
Код: Выделить всё
public my_think(entity_id)
{
    
client_print(0,print_chat,"Сообщение!");
    
set_pev(entity_idpev_nextthink, (halflife_time() + 0.07));
}
 
Аватара пользователя
xbass13
 
Сообщения: 96
Зарегистрирован: 13 июн 2012, 21:20
Благодарил (а): 36 раз.
Поблагодарили: 35 раз.
Опыт программирования: Больше трех лет
Языки программирования: pawn, c++, js, php

Re: Кастомный think (ошибка в условии??)

Сообщение hren_morjovui » 05 янв 2020, 16:22

xbass13 писал(а):Всю голову сломал, какой результат должен быть?

Если просто спамить каждые n секунд, и нет каких-либо влияний извне на pev_fuser1, то этого достаточно:
Код: Выделить всё

public my_think
(entity_id)
{
    client_print(0,print_chat,"Сообщение!");
    set_pev(entity_id, pev_nextthink, (halflife_time() + 0.07));
}

аналогично :dntknw:
нет pev_nextthink должно быть отдельно от вывода сообщения (обновление 1 раз в 0.05 сек), а сообщение нужно выводить 1 раз в 0.07 сек. в том же pev_think`e
"В этом мире неизбежны три вещи: смерть, налоги и гравитация."
Аватара пользователя
hren_morjovui
 
Сообщения: 258
Зарегистрирован: 29 май 2018, 09:15
Благодарил (а): 88 раз.
Поблагодарили: 22 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn
PHP
jQuery

Re: Кастомный think (ошибка в условии??)

Сообщение xbass13 » 05 янв 2020, 16:41

Ок, каждые 0.5 секунд что-то происходит, а каждые 0.7 спам.
Предлагаю использовать pev_fuser1 и pev_fuser2. Первый отвечает за 0.5 цикл, второй - 0.7

Код: Выделить всё
public my_think(entity_id)
{
    
pev(entity_idpev_fuser1time_delay1);
    
pev(entity_idpev_fuser2time_delay2);
    
    if(
time_delay1 0.0 && time_delay1 <= halflife_time())
    {
//что-то происходит
        
client_print(0,print_chat,"Что-то произошло!");
        
time_delay1 halflife_time() + 0.05;
        
set_pev(entity_idpev_fuser1time_delay1);
    }
    if(
time_delay2 0.0 && time_delay2 <= halflife_time())
    {
//спам
        
client_print(0,print_chat,"Сообщение!");
        
time_delay2 halflife_time() + 0.07;
        
set_pev(entity_idpev_fuser2time_delay2);    
    }
    
    
//Вычисляем следующий think
    
if (time_delay1 time_delay2)
        
set_pev(entity_idpev_nextthinktime_delay1 halflife_time());
    else
        
set_pev(entity_idpev_nextthinktime_delay2 halflife_time());
Аватара пользователя
xbass13
 
Сообщения: 96
Зарегистрирован: 13 июн 2012, 21:20
Благодарил (а): 36 раз.
Поблагодарили: 35 раз.
Опыт программирования: Больше трех лет
Языки программирования: pawn, c++, js, php

Re: Кастомный think (ошибка в условии??)

Сообщение KOTOKU » 06 янв 2020, 16:01

Глупая невнимательность, сначала Вы ставите внутри if условия: (halflife_time() + 0.07)
А затем устанавливаете вне скоупа (halflife_time() + 0.05), что естественно перезатирает время через которое должен выполниться think вновь.

В общем, ваша логика в этой функции оставляет желать лучшего, переделывайте
Аватара пользователя
KOTOKU
 
Сообщения: 766
Зарегистрирован: 10 фев 2013, 00:53
Благодарил (а): 10 раз.
Поблагодарили: 117 раз.

Re: Кастомный think (ошибка в условии??)

Сообщение hren_morjovui » 06 янв 2020, 19:48

KOTOKU писал(а):Глупая невнимательность, сначала Вы ставите внутри if условия: (halflife_time() + 0.07)
А затем устанавливаете вне скоупа (halflife_time() + 0.05), что естественно перезатирает время через которое должен выполниться think вновь.

В общем, ваша логика в этой функции оставляет желать лучшего, переделывайте


забыл в примере указать return; в условии (поправил)

Добавлено спустя 5 минут 17 секунд:
Ну тему можно крыть, сделал по другому (мне как раз) но всё равно не понятно почему не работает так как в первом посту

Сделал в конце просто вот так:
Код: Выделить всё

    set_pev
(entity_idpev_nextthink, (halflife_time() + think_delay_temp));
    
    return 
PLUGIN_HANDLED;
}
 
"В этом мире неизбежны три вещи: смерть, налоги и гравитация."
Аватара пользователя
hren_morjovui
 
Сообщения: 258
Зарегистрирован: 29 май 2018, 09:15
Благодарил (а): 88 раз.
Поблагодарили: 22 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn
PHP
jQuery

Re: Кастомный think (ошибка в условии??)

Сообщение KOTOKU » 07 янв 2020, 00:35

Я объяснил почему это не работало, как не крути, у вас без return время всегда будет выставляться + 0.05 мсек
Аватара пользователя
KOTOKU
 
Сообщения: 766
Зарегистрирован: 10 фев 2013, 00:53
Благодарил (а): 10 раз.
Поблагодарили: 117 раз.

Re: Кастомный think (ошибка в условии??)

Сообщение hren_morjovui » 07 янв 2020, 10:04

KOTOKU писал(а):Я объяснил почему это не работало, как не крути, у вас без return время всегда будет выставляться + 0.05 мсек


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

pev
(entity_id, pev_fuser1, time_delay);
 

до условия не приходит нулевым, теперь почему не спамит сообщение каждые 0.07?

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

register_think
(think_classname, "my_think");

public my_think(entity_id)
{
    pev(entity_id, pev_fuser1, time_delay);

    if(!time_delay)
        set_pev(entity_id, pev_fuser1, (halflife_time() + 0.07));

    if(time_delay > 0.0 && time_delay < halflife_time())
    {
        set_pev(entity_id, pev_fuser1, (halflife_time() + 0.07));
        client_print(0,print_chat,"Сообщение!");
        return PLUGIN_HANDLED;
    }
    
    set_pev
(entity_id, pev_nextthink, (halflife_time() + 0.05));
    return PLUGIN_HANDLED;
}
 


спамит либо каждые 0.05 либо 0.1 и выше
"В этом мире неизбежны три вещи: смерть, налоги и гравитация."
Аватара пользователя
hren_morjovui
 
Сообщения: 258
Зарегистрирован: 29 май 2018, 09:15
Благодарил (а): 88 раз.
Поблагодарили: 22 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn
PHP
jQuery

Re: Кастомный think (ошибка в условии??)

Сообщение flymic24 » 07 янв 2020, 11:10

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

public my_think
(entity_id)
{
    if (!is_valid_ent(entity_id))
        return;
    
    
// Получаем время
    new Float:fGameTime = get_gametime();
    
    
// Получаем время последнего события
    new Float:time_delay;
    pev(entity_id, pev_fuser1, time_delay);
    
    if 
(time_delay < fGameTime)    {
        // Что то приисходит
        client_print(0, print_chat, "Сообщение!");
        
        
// Задаём время следующего выпосления - через 0.07 сек
        set_pev(entity_id, pev_fuser1, fGameTime + 0.07);
    }
    
    
//    Проверяем события каждые 0.01 сек
    set_pev(entity_id, pev_nextthink, fGameTime + 0.01);
}


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

public my_think
(entity_id)
{
    //    На тот случай если используется чисто только для спама и ничего более
    //    Каждые 0.07 сек будет сообщение
    if (!is_valid_ent(entity_id))
        return;
    
    
// Что то приисходит
    client_print(0, print_chat, "Сообщение!");
    
    
// Задаём время следующего выпосления - через 0.07 сек
    set_pev(entity_id, pev_nextthink, get_gametime() + 0.07);
}

С автора печенька ))
Аватара пользователя
flymic24
 
Сообщения: 209
Зарегистрирован: 05 окт 2012, 17:29
Откуда: Bryansk
Благодарил (а): 4 раз.
Поблагодарили: 76 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6


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

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

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