Баг гранат

rxki

Пользователь
Регистрация
5 Янв 2019
Сообщения
148
Симпатии
2
Пол
Мужской
#1
Доброго времени суток, ребята. Наткнулся на один баг, но как его правильно ковырнуть - не знаю. В общем, на сервере есть фриз граната и стоп граната. Фриз замедляет движение монстров (TD мод), а стоп - стопит их, соответственно. И вот что я заметил. Когда бросаешь стоп гранату (монстра останавливает на 5 сек) и за это время кинуть фриз гранату - она продливает эффект стоп гранаты. Тобишь, если кинуть 1 раз стоп гранату и остановить монстра, после можно бросать фризы и монстр будет продолжать стоять (главное успеть до окончания действия предыдущей гранаты). В паблике, где описан эффект этой стоп гранаты я нашел пару тасков фриз гранаты, заменил их - монстры просто стали бежать под фризом все время после действия гранаты... В общем, беда какая то, прошу помощи) Ниже креплю паблики стоп гранаты и фриза

PHP:
public FreezeMonsterByStopGrenade(iEnt)
{
    iEnt -= TASK_GRENADE_STOP
    if (!IsMonster(iEnt) || entity_get_float(iEnt, EV_FL_health) <= 0.0)
        return;

    fm_set_rendering(iEnt, kRenderFxNone, 0, 0, 0, kRenderTransAdd, 255)
    if(task_exists(iEnt + TASK_GRENADE_FROZEN))
        remove_task(iEnt + TASK_GRENADE_FROZEN);

    _set_monster_speed(iEnt,0, 0, 1)

    set_task(float(g_ConfigValues[CFG_FROZEN_NADE_DURATION]), "ResetMonsterSpeedByStopGrenade", iEnt + TASK_GRENADE_STOP)
}

public ResetMonsterSpeedByStopGrenade(iEnt)
{
    iEnt -= TASK_GRENADE_FROZEN;
    if(is_valid_ent(iEnt))
    {
        new iType = entity_get_int(iEnt, EV_INT_monster_type);

        if(iType == ROUND_BOSS)
            fm_set_rendering(iEnt, kRenderFxGlowShell, 255, 0, 0, kRenderNormal, 16)
        else if(iType == ROUND_BONUS)
            fm_set_rendering(iEnt, kRenderFxGlowShell, 255, 255, 0, kRenderNormal, 16)
        else
        {
            //fm_set_rendering(iEnt, kRenderFxNone, 0, 0, 0, kRenderTransAdd, 255)
            fm_set_rendering(iEnt, kRenderFxNone, 0, 0, 0, kRenderNormal, 0);
        }

        //if(!task_exists(iEnt + TASK_GRENADE_FROZEN))
        _set_monster_speed(iEnt, 0, 1, 1);
    }
}
public FreezeMonsterByGrenade(iEnt)
{
    iEnt -= TASK_GRENADE_FROZEN

    if (!IsMonster(iEnt) || entity_get_float(iEnt, EV_FL_health) <= 0.0)
        return;

    new szData[2];
    szData[0] = _td_get_monster_speed(iEnt);

    fm_set_rendering(iEnt, kRenderFxGlowShell, 0, 100, 255, kRenderNormal, 17)

    if(task_exists(iEnt + TASK_GRENADE_FROZEN))
    {
        _set_monster_speed(iEnt, szData[0], 0, 1)
        szData[0] += 120;
        remove_task(iEnt + TASK_GRENADE_FROZEN);
    }
    else
        _set_monster_speed(iEnt, floatround(szData[0] - (szData[0] * g_ConfigValuesFloat[CFG_FLOAT_FROZEN_NADE_PERCENT])), 0, 1)

    set_task(float(g_ConfigValues[CFG_FROZEN_NADE_DURATION]), "EndFreezeMonsterEffect", iEnt + TASK_GRENADE_FROZEN, szData, sizeof szData)
}

public EndFreezeMonsterEffect(szData[], iEnt)
{
    iEnt -= TASK_GRENADE_FROZEN;
    if(is_valid_ent(iEnt))
    {
        new iType = entity_get_int(iEnt, EV_INT_monster_type);

        if(iType == ROUND_BOSS)
            fm_set_rendering(iEnt, kRenderFxGlowShell, 255, 0, 0, kRenderNormal, 16)
        else if(iType == ROUND_BONUS)
            fm_set_rendering(iEnt, kRenderFxGlowShell, 255, 255, 0, kRenderNormal, 16)
        else
        {
            //fm_set_rendering(iEnt, kRenderFxNone, 0, 0, 0, kRenderTransAdd, 255)
            fm_set_rendering(iEnt, kRenderFxNone, 0, 0, 0, kRenderNormal, 0);
        }
        //if(task_exists(iEnt + TASK_GRENADE_STOP))
        //    return;
        if(szData[0] > 0)
            _set_monster_speed(iEnt, szData[0], 0, 1)
        else
            _set_monster_speed(iEnt, 0, 1, 1);
    }
}
 
Последнее редактирование: rxki

kapangaIII

Команда форума
Разработчик
Регистрация
31 Окт 2017
Сообщения
781
Симпатии
230
#2
Обе гранаты полностью дай.
 

rxki

Пользователь
Регистрация
5 Янв 2019
Сообщения
148
Симпатии
2
Пол
Мужской
#3
kapangaIII, в остальном вроде нигде не упоминается, вот плагин, где они описаны
 

Вложения

rxki

Пользователь
Регистрация
5 Янв 2019
Сообщения
148
Симпатии
2
Пол
Мужской
#4
kapangaIII, еще заметил, что если зафризить монстра наверх активного действия стоп-гранаты - после окончания действия фриза монстр продолжает движение в слоумо (не возвращает исходное значение скорости)....если же просто бросаешь фриз в бегущего монстра - по окончанию действия исходная скорость возвращается... Пробовал в паблике FreezeMonsterByGrenade прописать изначальное условие if(td_get_monster_speed(0)) return; - не помогло...
20 Фев 2019
Решил вопрос игнором действия фриза при условии, что актуальная скорость монстра =0
 

rxki

Пользователь
Регистрация
5 Янв 2019
Сообщения
148
Симпатии
2
Пол
Мужской
#6
kapangaIII, решил вот так

if(_td_get_monster_speed(iEnt) <= 0)
return;

но в твоем варианте выглядит лаконичнее. сейчас проверю
23 Фев 2019
kapangaIII, если делать, как у тебя - при заморозке монстр начинает мерцать и через 2 сек пропадает моделька на время заморозки...