Оч редко, но вот таки снова вылетел
Заметки себе - это с крокодилом и та и другая катка, предположительно все-таки из-за повышения уровня абилы у мёртвого, наверное, там проверка недостаточно правильная

.Q..I.VW.bi...|$ == изменение абилки у мертвого юнита
в логе четко видно ид X82A
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
21
Clamp, ага, всё понятно, то есть Alive и Dead проверки действительно лишние.
Пока получается так - может существовать фактически мёртвый юнит с количеством жизней, которое игра считает большим 0, и даже большим 1. Иначе не могу объяснить фатал.
Может, у меня там какой-то триггерный хил действует без проверки на мертвяков, хилит мертвяка и... gg.
Хотя вообще большинство функций у меня исключает мертвяков при проверке групп из обрабатываемых единиц, но... могло быть где-то пренебрежение для хила - типа он же мёртвый, какая разница, отхилится или нет, пока не реснется, не важно, а после реса все равно фулл хп будет. Ну вот разница и вылезла. Придётся эти пренебрежения искать.

И поставлю таки наверное вместо 1 конкретно в этой функции хотя бы 25, что ли, это будет не заметно в 99.5% случаев, а фаталы если и не устранит вообще, то сделает их еще меньше (их и ща мало, крокодилом было много норм игр сыграно, ему больше месяца уже и была вот дрочка с 6 ботами-крокодилами, но вот 2 раза таки вылезли).
30
Если совсем по-тупому, то могу предложить создать глобальную группу "все юниты на карте", добавлять туда всех новых юнитов (кроме системных) и по событию смерти удалять из группы, тогда твоя проверка "живости" юнита будет заключаться в проверке нахождения в этой группе, и подобная бага не сможет появиться.

Но это очевидный костыль, хотя и красивый.
21
Clamp, неплохо, подумаю
хотя если для конкретно этого спелла, проще что-то с одним крокодилом замутить, в других случаях пока проблем не замечалось, но все равно стоит иметь в виду такое глобальное решение (как минимум для героев)
ладно, пока, думаю, достаточно, как обновлю код, если еще понадобится - отпишу
16
function IsDead takes unit u returns boolean
	return GetWidgetLife(u) < 0.405 or IsUnitType(u,UNIT_TYPE_DEAD)
endfunction
никогда не подводила
ну а портируемость в 99.9% не нужна, если ты специально не пишешь систему для людей. В моей карте системы используются только мной, и мемхак всецело мой же, варкрафт обновляться выше 26 не будет, поэтому плевать на то, что костыли местами.
30
для людей
используются только мной

Себя я считаю человеком, и пишу тоже для себя ;-)

Собственно, ты умеешь и абстрагируешься от своих костылей, тут вопросов нет, но учить так делать неофитов - неверный подход. Они, не обладая твоей полнотой знаний и навыков, почти гарантированно начнут стрелять себе в колени, и с хорошими шансами никогда не смогут найти, чем именно.
21
DracoL1ch, ага, збс, вроде то, что надо, занесу в кастом код себе для использования и с ней проверю
16
ну давай будем честными, здесь ты назвал мемхак костылем и хаком, когда он таковым не является. использовать чтение и запись в большинстве случаев крайне просто. намного сложнее, если речь заходит о том, что надо патч накладывать на исполняемый код, но такое неофиту даже на пальцах объяснить сложно.
современный варкрафт задрочен на 90% и состоит из костылей на 50%, самых разных. нет ничего постыдного время от времени забывать кого-то из этого зоопарка. Некоторые нативки я для себя открывал спустя год после того, как уже занимался доткой профессионально.
32
кароче юзай проверку
function IsUnitDead takes unit u returns boolean
    return IsUnitType( u, UNIT_TYPE_DEAD ) or GetUnitTypeId( u ) < 1
endfunction
Очень древняя функция которая, как считается 100% способна отличить мертвого от живого юнита, а так же не дать ничего сделать с удаленным или разложившимся юнитом.
Обычно юнит умирает с 0.405 хп, с 1 хп юнит еще жив. Поэтому нельзя проверять жив ли юнит функцией
function IsUnitDeadBJ takes unit whichUnit returns boolean
    return GetUnitState(whichUnit, UNIT_STATE_LIFE) <= 0
endfunction
16
function IsUnitDead takes unit u returns boolean
    return IsUnitType( u, UNIT_TYPE_DEAD ) or GetUnitTypeId( u ) < 1
endfunction
единственный вариант, когда GetUnitTypeId() вернет 0, это если u==null. Но, внезапно, если юнит "протек", то он может еще висеть в памяти после уничтожения, и тип у него будет что ни на есть обычный, легитимный, хотя юнит уже технически мертв. Поэтому такая проверка просто бессмысленна.
30
когда он таковым не является
На мой взгляд, использование в качестве опорного элемента подсистемы (в данном случае карты) любого поведения, которое авторами исполняющей системы (в данном случае варкрафта) явно воспринимается как "неопределённое" или "нежелательное" есть костылирование; свою точку зрения не навязываю, но проясняю.

использовать чтение и запись в большинстве случаев крайне просто
Безусловно, да, когда это поведение описано и гарантировано стандартом языка. В варкрафте же оно является побочным, а сама его реализация в сравнении со стандартным подходом того же Си - контринтуитивной. Ну серьёзно, это же по сути инъекция байткода

Обычно юнит умирает с 0.405 хп
Юнит никогда не будет иметь 0.405 хп, если ты их не выдашь ему кодом непосредственно перед проверкой.
16
ну нееет, здесь как раз определенное - возвращается всегда значение армора и никакая погода на марсе на значение не влияет. Поведение полностью предпопределено, как и во всем мемхаке. Ошибки возникают, когда лезешь не туда или используется функция из игры, которая не готова к индивидуальному вызову (например, стек не чистит за собой и т.п.). Используя только чтение, можно быть уверенным в стабильности на 100%
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.