Добавлен
Вот такой код (в этом случае три точки), не всегда, но может сработать, даже если один из юнитов мертв.
if not IsUnitDeadBJ(udg_CAPITAN) and not IsUnitDeadBJ(udg_CAPITAN_SC) then
...
endif
P.S. Никаких вейтов не юзал в коде, он мгновенный.
В чем может быть причина?

Принятый ответ

не юзайте бж говно функции
 GetWidgetLife( unit ) < 0.405 or IsUnitType( unit, UNIT_TYPE_DEAD )
Вот это должно помочь.
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
19
7 лет назад
0
Похожие вопросы:

ответ
Impertus:
quq_CCCP:
Без локейшенов, набери
	GetRandomReal( GetRectMinX( bj_mapInitialPlayableArea ), GetRectMaxX( bj_mapInitialPlayableArea )  )
Для Y думаю догадаешся как найти...
Размер карты-то изначально известен, можно обойтись и рандомом между статичными цифирями. Думал над этим вариантом тоже, значит будем пользовать его.
nvc123:
к слову этот вообще не рабочий ибо количество итераций циклов может превысить лимит потока и тогда триггер просто обрубится
Ставить таймеры по 0.5 сек? Такого вида?
loop
        exitwhen  IsUnitDeadBJ(BET) or BECo > 20
        if (TimerGetRemaining(t) <= 0) then
            call MoveLocation( p, GetRandomReal ( X1, X2), GetRandomReal (Y1, Y2))
            call SetUnitMoveSpeed( BET, 500.00 )
            call IssuePointOrderLocBJ( BET, "move", p )
            set BECo = BECo + 0.5
            call TimerStart(t, 0.5, false, null)
        endif     
endloop
Таймер не вейт, он запустить новый Поток когда истечет, в функции старта таймера 4 параметра, таймер, время, периодичный буль и ссылка на код .
вместо null нужно вписать function Имя функции
functiom Timer_UnitMove_Expires takes nothing returns nothing
    // эта функция будет вызыватся каждые 0.50 сек. пока не остановить таймер
endfunction


function A takes nothing returns nothing
local timer t = CreateTimer( )

call TimerStart( t, 0.50, true, function Timer_UnitMove_Expires )

set t = null
endfunction
Чтобы передавать информацию между функциями нужны так называемые Аттачи, нужно прикрепить данные к триггеру или таймеру, потому что мы можем получить ссылку на них в запущенных ими потоками.
Про хештаблицу куча данных на сайте, SaveUnitHandle( хештаблица, ключ 1, ключ 2, сам юнит )
ответ
FenikS1991, убери стоимость в 15 маны.

5
32
7 лет назад
5
не юзайте бж говно функции
 GetWidgetLife( unit ) < 0.405 or IsUnitType( unit, UNIT_TYPE_DEAD )
Вот это должно помочь.
Принятый ответ
0
8
7 лет назад
0
quq_CCCP:
не юзайте бж говно функции
 GetWidgetLife( unit ) < 0.405 or IsUnitType( unit, UNIT_TYPE_DEAD )
Вот это должно помочь.
В принципе IsUnitDeadBJ проверяет GetUnitState(whichUnit, UNIT_STATE_LIFE) <= 0
Может причина в том, что здоровье юнита не обязательно 0 или меньше, а может быть в диапазоне от 0.001 и до 0.405
Окей, буду юзать GetWidgetLife( unit ) < 0.405
Спасибо!
0
30
7 лет назад
0
GetWidgetLife( unit ) < 0.405
Неоднократно было показано, что такое количество здоровья у юнита может быть только если его специально задать триггерно.
Кроме того, число "0.4" ничем не хуже числа "0.405", и даже лучше: в нём меньше знаков.
0
32
7 лет назад
0
Clamp, ой да всем насрать, это копипаст IsUnitDead описную 10 лет назад вексом в спелл систем.
Щяс там из за 2х знаков все сломается.
0
21
7 лет назад
0
После юзания функции от драколича все подобные проблемы, что мёртвый иногда не мёртвый, испарились
0
30
7 лет назад
0
Щяс там из за 2х знаков все сломается.
Именно в результате такого подхода растущие в геометрической прогрессии мощности железа постоянно не успевают за растущими требованиями софта. Существует антипаттерн преждевременной оптимизации, но это определённо не тот случай.
0
12
7 лет назад
0
Мне вот до сих пор интерестно, что там близзы наворотили в алгоритме такого, что юнит мертвый не при хп меньше 0.5, как при стандартном округлении, а при 0.405. Как такое вообще можно ухитриться сделать, а?
0
30
7 лет назад
0
что там близзы наворотили в алгоритме такого, что юнит мертвый не при хп меньше 0.5
Это не близы, а Vexorian наворотил, а дальше "так повелось". По факту такое хп у юнита только вручную можно сделать, проблема надумана.
0
32
7 лет назад
0
Clamp, нет, именно после 0.405 юниту вручают - UNIT_TYPE_DEAD и забирают остаток хп, кстати говоря. Лич вроде недавно колупал этот участок кода, уже и не помню всех подробностей, но там много интересного. Кстати хп никогда не может быть меньше 0, после смерти все уроны игнорируют юнита, т.е нельзя никак нанести урон мертвому юниту. При смерти юнитам вручают особое сало, так они не будут авто атаковать и прочее, к слову все ауры не блокируются этим салом и распространяются пока юнит\герой не разложился. При этом произойдет баг если что то сделать с аурой, в коде аур ошибка, если пойдет пересчет допустимых целей чтобы вручить им бафф ауры, туда обязательно попадет её источник (разумеется если он есть в допустымых целях) и мы видим фатал. Никогда не меняйте уровни аур у дохлых юнитов, так же не пытайтесь сделать с ними что нить еще.
0
23
7 лет назад
0
quq_CCCP, Зато уровни можно апать у мертвых =)
0
13
10 месяцев назад
0
Это не близы, а Vexorian наворотил, а дальше "так повелось". По факту такое хп у юнита только вручную можно сделать, проблема надумана.
Вот только что столкнулся с багой, не мог понять в чём дело. Вариак не воспринимал мёртвых как мёртвых.
Триггерно я здоровье не менял.
Выяснилось, что бага иногда воспроизводится если в отряде врага есть юнит, ообладающий волной исцеления. Возможно волна исцеления с учётом задержки её применения в некоторых случаях восстанавливает здоровье уже дохлым юнитам.
0
26
10 месяцев назад
0
Cancel, скорее всего в момент проверки его ХП больше 0.
Почекай это.
0
28
10 месяцев назад
0
Тут достаточно подробно описано, сколько у юнита может быть минимальное хп. И это значение чуть меньше 0.405. Но в любом случае это не имеет значения, есть UnitAlive отсюда, а в луа эта функция изначально доступна.
0
8
10 месяцев назад
0
Триггерно мертвым юнитам точно можно выставить любое количество здоровья больше нуля, поэтому ХП<"Чего-то там" в любом случае плохая проверка.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.