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

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

код
    //Определяет жив или мертв юнит. 
    //Есть точный параметр определения, что юнит мертв - 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
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
10
5 лет назад
0
Я не понял почему, но, судя по всему, повышение уровня (триггерное) мёртвому герою делает, в некотором смысле, его живым...
1
27
5 лет назад
Отредактирован MpW
1
код
    //Определяет жив или мертв юнит. 
    //Есть точный параметр определения, что юнит мертв - 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
Принятый ответ
0
10
5 лет назад
0
Steal nerves, я проверял ещё и сравнением уровня здоровья с 0.32, всё равно не помогало. Но когда добавил проверку на то, жив ли юнит в триггер где даю опыт героям, то баг исчез (вроде).
0
27
5 лет назад
Отредактирован MpW
0
ArchOracle, у тебя работает этот код (что выше)? если нет, выводи дебагом сколько у тебя хп в данный момент. Периодично раз 0.01-0.05 выводи на экран, меняется ли хп (если у тебя проверка хп. Просто интересно что происходит с хп героя).
UNIT_TYPE_DEAD - говорит что юнит мертв (лежащий трупак). Это всегда помогает.
сколько тем на форумах было на эти проверки, избитая проблема =(

не повышай тогда триггерно юниту, пока он мертв. Пробуй позже повышать.
0
10
5 лет назад
0
Steal nerves, на счёт хп проверю. Необходимую проверку на жизнь героя я сделал, там всё в порядке. Но я использовал "is alive", а не "is dead". (В гуи)
Steal nerves, кажется понял. При повышении уровня повышается в том числе и текущее здоровье. А проверка на то, жив ли юнит, видимо, именно уровень здоровья и проверяет.
0
27
5 лет назад
Отредактирован MpW
0
ArchOracle, возьми и раскрой BJ-обертки. внутри них лежат проверки хп>0 или хп<0 (is alive "юнит жив" хп>0, is dead "юнит мертв" хп<0). эти близзардские функции сравнивают хп. они не дают точно знать мертв ли сейчас (но должны, никогда не парился с этим), но по логике близзард хп равное 0 значит мертв
0
10
5 лет назад
0
Steal nerves:
ArchOracle, возьми и раскрой BJ-обертки. внутри них лежат проверки хп>0 или хп<0 (is alive "юнит жив" хп>0, is dead "юнит мертв" хп<0). эти близзардские функции сравнивают хп. они не дают точно знать мертв ли сейчас (но должны, никогда не парился с этим), но по логике близзард хп равное 0 значит мертв
В том и дело, что при повышении уровня текущий уровень хп повышается! Хп мёртвого героя после повышения становилось в районе 29, вот проверка говорила что он жив.
0
21
5 лет назад
0
стандартная функция проверки мертв или нет может косячить
давно пользуюсь IsDead от драколича
0
28
5 лет назад
Отредактирован PT153
0
Читаем комментарии.
Функции
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, нужно делать проверку на тип юнита.
0
10
5 лет назад
0
PT153, ну, всё равно уровень мёртвого юнита повышается, как и здоровье. И он становится "живым".
0
28
5 лет назад
Отредактирован PT153
0
ArchOracle:
ну, всё равно уровень мёртвого юнита повышается, как и здоровье. И он становится "живым".
UNIT_TYPE_DEAD работает нормально. Я тебе сказал, как это вызвать в гуи.
Иначе определяй нативку, и используй её.

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