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

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

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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
21
7 лет назад
0
Clamp, вот с одной точно жопа будет, потому что уже есть опыт, IsUnitAlive и IsUnitDead точно косые какие-то.
Потому что у меня есть другой герой, Гидралиск, который вселяется в крипа, хайдится и типа входит внутрь него до смерти крипа (можно эту смерть вручную сделать через добавляемую крипу абилку, типа разорвать его изнутри и вылезти).
Там стояла одна проверка.
Так вот в большинстве случаев все было ок, но бывало, что, когда крип умирал, Гидралиск не анхайдился до его разложения (а это полная жопа).
Вот ща там проверка типа такой тройной по-моему и вроде тьфу-тьфу все норм.
Проверка именно поэтому такая хардкорная стоит и здесь, и вот даже её оказалось недостаточно.
Короче, не знаю, в крайнем случае поменяю единицу на цифру чуть побольше (правда, чем больше будет цифра - тем больше уже будет фактическая погрешность в действии способности, но вплоть до 100 хп это будет не сильно страшно), тут трудности в том, что фатал действительно очень редко, так что сложно будет понять, исправлен он окончательно или нет.
/
БД на броню в 2017 и во времена мемхака... как раз с GetUnitArmor от него отказ и произошёл, спасибо, если все через бд делать, так и варкрафт не очень нужен
0
30
7 лет назад
0

Какого панциря
Сначала все возможные проверки, потом все зависящие от них действия, не наоборот. Кстати:
call UnitAddAbility(u5,'A28W')
call SetPlayerAbilityAvailableBJ( false, 'A28W', GetOwningPlayer(u5) )
call UnitMakeAbilityPermanent(u5,true,'A28W')
call UnitMakeAbilityPermanent(u5,true,'A28X')
call SetUnitAbilityLevelSwapped('A28X',u5,R2I(number))
Весь этот мусор можно вынести в отдельную функцию, намного проще будет дебажить.
И научись, пожалуйста, пользоваться таким построением при постинге:
((код
// тут код
))
0
21
7 лет назад
0
Clamp, "Сначала все возможные проверки, потом все зависящие от них действия, не наоборот" - а у меня как?
Про функцию - справедливо, ну много чего можно посжимать в функции, да, но это дофига перелопачивать, хотя себя оправдает, ну это ок, но немного другой вопрос.
0
30
7 лет назад
Отредактирован Clamp
0
БД на броню в 2017 и во времена мемхака...
"Портируемость" явно не входит в список знакомых тебе понятий. Советую проникнуться ею достаточно глубоко, чтобы не использовать тот или иной недокументированный функционал (это вообще, не только про вц), так как он имеет свойство переставать существовать после багфиксов.

Про "дополнительные" проверки:
//===========================================================================
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

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

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

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

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

Собственно, ты умеешь и абстрагируешься от своих костылей, тут вопросов нет, но учить так делать неофитов - неверный подход. Они, не обладая твоей полнотой знаний и навыков, почти гарантированно начнут стрелять себе в колени, и с хорошими шансами никогда не смогут найти, чем именно.
0
21
7 лет назад
0
DracoL1ch, ага, збс, вроде то, что надо, занесу в кастом код себе для использования и с ней проверю
0
16
7 лет назад
0
ну давай будем честными, здесь ты назвал мемхак костылем и хаком, когда он таковым не является. использовать чтение и запись в большинстве случаев крайне просто. намного сложнее, если речь заходит о том, что надо патч накладывать на исполняемый код, но такое неофиту даже на пальцах объяснить сложно.
современный варкрафт задрочен на 90% и состоит из костылей на 50%, самых разных. нет ничего постыдного время от времени забывать кого-то из этого зоопарка. Некоторые нативки я для себя открывал спустя год после того, как уже занимался доткой профессионально.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.