Есть некий юнит (герой). Он есть на карте, он хранится в переменной. В определённый момент он умирает. Проверка на то, жив ли он показывает смерть. Но спустя некоторое время (около минуты, плюс/минус) проверка на то, жив ли этот юнит показывает то, что он жив. Хотя он никак не воскрешался и, собственно, мёртв.

код
    //Определяет жив или мертв юнит. 
    //Есть точный параметр определения, что юнит мертв - UNIT_TYPE_DEAD
    //Если юнит удален или его труп разложился и исчез, то тип объекта IsUnitType обнуляется. Но переменные unit u все равно могут содержать инфу, варкрафт не обнуляет значения переменных.
    function IsUnitDead takes unit u returns boolean
        return IsUnitType( u, UNIT_TYPE_DEAD ) or GetUnitTypeId( u ) < 1
    endfunction
проверять хп не всегда хорошо. пользователи пишут что у них регенится хп, даже если юнит мертв (не сталкивался, не исключено). герои могут умереть, и трупы валяются на местах их смерти до сих пор пока не воскресят. еще есть случаи с крестом перерождения (но это отдельный случай)
function IsDead takes unit u returns boolean
	return GetWidgetLife(u) < 0.405 or IsUnitType(u,UNIT_TYPE_DEAD)
endfunction
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
10
Steal nerves:
ArchOracle, возьми и раскрой BJ-обертки. внутри них лежат проверки хп>0 или хп<0 (is alive "юнит жив" хп>0, is dead "юнит мертв" хп<0). эти близзардские функции сравнивают хп. они не дают точно знать мертв ли сейчас (но должны, никогда не парился с этим), но по логике близзард хп равное 0 значит мертв
В том и дело, что при повышении уровня текущий уровень хп повышается! Хп мёртвого героя после повышения становилось в районе 29, вот проверка говорила что он жив.
21
стандартная функция проверки мертв или нет может косячить
давно пользуюсь IsDead от драколича
28
Читаем комментарии.
Функции
native UnitAlive takes unit id returns boolean

function UnitDead takes unit u returns boolean
    return not UnitAlive(u) // returns true, if unit does not exist.
endfunction

function UnitExists takes unit u returns boolean
    return GetUnitTypeId(u) != 0
endfunction

function UnitDoesNotExist takes unit u returns boolean
    return GetUnitTypeId(u) == 0
endfunction

function UnitIsAlive takes unit u returns boolean
    return not IsUnitType(u, UNIT_TYPE_DEAD)
endfunction

function UnitIsDead takes unit u returns boolean
    return IsUnitType(u, UNIT_TYPE_DEAD) // returns false, if unit does not exist.
endfunction
Но я использовал "is alive", а не "is dead". (В гуи)
Они вот так выглядят.
function IsUnitDeadBJ takes unit whichUnit returns boolean
    return GetUnitState(whichUnit, UNIT_STATE_LIFE) <= 0
endfunction

function IsUnitAliveBJ takes unit whichUnit returns boolean
    return not IsUnitDeadBJ(whichUnit)
endfunction
То есть лучше использовать IsUnitDeadBJ.

Чтобы сделать проверку, что предлагает Steal nerves, нужно делать проверку на тип юнита.
10
PT153, ну, всё равно уровень мёртвого юнита повышается, как и здоровье. И он становится "живым".
28
ArchOracle:
ну, всё равно уровень мёртвого юнита повышается, как и здоровье. И он становится "живым".
UNIT_TYPE_DEAD работает нормально. Я тебе сказал, как это вызвать в гуи.
Иначе определяй нативку, и используй её.

Вот так сделай.
Загруженные файлы
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.