Активно использовался мх, дело явно в использовании чего-то из него
Друг друга атаковали 2 одинаковых героя, у каждого были шансы на сброс перезарядки атаки при атаке себя противником

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

Ладно, достало, уже все нервы выжжены и нет времени разбираться, абиле просто сделан частично упрощенный реворк (вместо вычитания белого урона вычитается минус бонусом через многоуровневую абилу).
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
16
6 лет назад
0
ну судя по логу, ты попытался записать что-то в Memory[122], так что ищи
недаром я ввел безопасные функции чтения-записи потом
судя по тому, что при умножении на 4 это дает 1E8, ты лез в Aatk, ну функции урона, если точнее
так что у тебя либо юнит без атаки, либо где-то 0 втесался, ищи
0
21
6 лет назад
Отредактирован ClotPh
0
Ну так это понятно, что функции урона в этот момент были
там два clawbfs.ucoz.ru/forum/3-1839-1 с двумя прокачанными пассивками били друг друга
"Спарта!" действует с шансом, а Подавление - гарантированно
Но вопрос, что именно вызывает фатал (точно что-то из этого, там фатал был потом еще раз, ульты в этот момент прокачано не было, Qшка во второй раз тоже 90%, что не юзалась).
Вот см. по ссылке че абилы делают и выше коды
Там да, или как-то связанный с атакой бесконечный цикл создается, или пытается записаться что-то, что записаться не может
///////////////////////////
Вот так да, если посмотреть, допустим, у первого 100 атака, у второго 100 тоже
первый второму пассивкой режет, второй в обратку первому...
ммм... может, попытка записать в атаку дробную реалку вызывает фатал? Но тоже бред, дробные реалки в броню же норм пишутся
//////////
Кстати, да, енейбл-дизейбл Спарты фактически уже есть сохраняемым в хэш числом, так что дело не в этом... =/ ну блииин
///////
так, ладно, пока карта грузится, знаю, что делать
протестирую с ботом, прокачав себе только Подавление, Спарта! на одного себя гарантированно фатала не вызывает, в тест-карте Спарта! и Подавление нормально работали в окружении. Прокачаю Подавление, поставлю бота, он раскачается, прокачает Спарта! и Подавление, себе прокачаю только Подавление, пойду его бить. Если зафаталит - 95%, что проблема в способности "Подавление".
//
done
Ага. Со Спартой (пассивка на шанс дать себе вамп при атаке и рефрешнуть ее кд) все ок.
Значит, ща Подавлению пропишу дополнительно в нужных местах:
local real Suppressionhash2 = 0
set Suppressionhash2 = LoadReal(udg_Hash,GetHandleId(u5),StringHash("Suppressionhash"))
and Suppressionhash2 == 0
так по идее у двух сражающихся с Подавлением оно сразу триггериться будет не должно.
Проверим.
////////////
upd: МЛЯТЬ, вот сейчас выхожу и снова фатал.
Все-таки попробую еще помимо этого прописать, чтобы damagedebuff округлялась до целых...
Ну расклад тот, что это, крч, в любом случае 95%, что способность "Подавление"
При вэшке спок без Подавления у второго несколько секунд два Спартанца друг друга били, а когда W и E были и у того и того прокачаны - фатал вылетал почти сразу
Ща вот фатал в конце вылетел, когда они вообще в разных местах карты были и уже игра выключалась после тестирования, но у второго-то E была

там вот как-то видимо все-таки че-то ухитряется недопустимое писаться, мб атака продрачивается до тысячных долей, что ли, и вылетает фатал

да, скорее всего проблема в тысячных долях атаки
у Психопомпы как-то так вроде с кд было
ща округление крч мутить надо лучше и проще, да
///
local integer damagedebuffconvert = 0
///
И ПОСЛЕ ЭТОЙ (она уже есть) строчки:
set damagedebuff = (0.02 + (0.08 * (GetUnitAbilityLevelSwapped ('A31D', u5))) ) * (GetUnitBaseDamage(u6))
/////////////
set damagedebuffconvert = R2I(damagedebuff)
set damagedebuff = I2R(damagedebuffconvert)
///////////////
попробую так
//
а доп. ифзенэлсы хэша пока писать все-таки не буду
потому что в первом ифзенэлсе все равно только целые числа участвуют, а при втором хэш все равно на одного вешается и цикла быть не должно
/
ВРОДЕ ОК. В игре было аж 3 Кратоса, фатала не было.
0
16
6 лет назад
0
говорю же, у тебя подается 0+0x1E8, ставь проверки на нуль после ConvertHandle
0
21
6 лет назад
Отредактирован ClotPh
0
DracoL1ch, а новый мемхак безопасный именно потому, что они там уже есть?
////////////
O_O shit. Что за прикол?! Тут причина та же самая?
Это из другой карты для игры... Но вроде бы код уже исправленный туда всунут!!! Сейчас офк перепроверю.
Но в русской три Кратоса друг друга 20 минут долбали - все норм было. В англ. ща очень быстро даже с одного фатал вылетел.
upd: да, округление есть, это точно в ENG.w3x war3map.j....
function Suppression takes nothing returns nothing
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6
local timer t= CreateTimer()
local unit u5= GetAttackedUnitBJ()
local unit u6= GetAttacker()
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
local real Suppressionhash= 0
local real damagedebuff= 0
local integer damagedebuffconvert= 0
set Suppressionhash=LoadReal(udg_Hash, GetHandleId(u6), StringHash("Suppressionhash"))
if ( IsUnitEnemy(u6, GetOwningPlayer(u5)) == true ) and ( IsUnitType(( u6 ), UNIT_TYPE_ANCIENT) != true ) and ( IsUnitType(( u6 ), UNIT_TYPE_STRUCTURE) != true ) and Suppressionhash == 0 then
if GetUnitBaseDamage(u6) <= GetUnitBaseDamage(u5) then
call AddSpecialEffectTargetUnitBJ("origin", u6, "Spartan3.mdl")
call ConditionalTriggerExecute(gg_trg_destroyspeceffect)
ТОЛЬКО ЕСЛИ ХЭШ = 0 И У ВРАГА U6 МЕНЬШЕ АТАКИ, ЗАПУСК ТАЙМЕРА И СЭЙВ ХЭША
СЧИТАЕМ, СКОЛЬКО МИНУСОВАТЬ, МИНУСУЕМ И СЭЙВИМ В ХЭШ
set damagedebuff=( 0.02 + ( 0.08 * ( GetUnitAbilityLevelSwapped('A31D', u5) ) ) ) * ( GetUnitBaseDamage(u6) )
set damagedebuffconvert=R2I(damagedebuff)
set damagedebuff=I2R(damagedebuffconvert)
call SetUnitBaseDamage(u6 , GetUnitBaseDamage(u6) - R2I(damagedebuff))
call SaveReal(udg_Hash, GetHandleId(u6), StringHash("Suppressionhash"), damagedebuff)
СЧИТАЕМ, СКОЛЬКО МИНУСОВАТЬ, МИНУСУЕМ И СЭЙВИМ В ХЭШ - ЗАКРЫТО.
ТОЛЬКО ЕСЛИ ХЭШ = 0 И У ВРАГА МЕНЬШЕ АТАКИ, ЗАПУСК ТАЙМЕРА И СЭЙВ ХЭША - ЗАКРЫТО.
call SaveUnitHandle(udg_Hash, GetHandleId(t), 2, u5)
call SaveUnitHandle(udg_Hash, GetHandleId(t), 1, u6)
call TimerStart(t, 2, false, function Suppression2)
else
ПРОСТО ДОБАВЛЯЕМ АТАКУ ГЕРОЮ
call SetUnitBaseDamage(u5 , GetUnitBaseDamage(u5) + ( GetUnitAbilityLevelSwapped('A31D', u5) ))
ПРОСТО ДОБАВЛЯЕМ АТАКУ ГЕРОЮ - ЗАКРЫТО.
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash, GetHandleId(t))
endif
else
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash, GetHandleId(t))
endif
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6
set t=null
set u5=null
set u6=null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
Загруженные файлы
0
16
6 лет назад
0
ну по оффсету легко видно, что да, то же самое
2
21
6 лет назад
2
Ладно, достало, уже все нервы выжжены и нет времени разбираться, абиле просто сделан частично упрощенный реворк (вместо вычитания белого урона вычитается минус бонусом через многоуровневую абилу).
Принятый ответ
0
32
6 лет назад
0
Кстати может быть дело в функции кулдауна, она все еще может фаталить...
0
21
6 лет назад
0
quq_CCCP, у этого героя есть только сброс кулдауна атаки
Но про то, что функция кулдауна может фаталить, плз поподробнее
0
16
6 лет назад
0
да у тебя по адресу офсета атаки вылет, ни при чем тут остальное)
0
21
6 лет назад
0
DracoL1ch, ну на будущее, я кулдауном активно пользуюсь, интересно, когда он еще может создавать фаталы, а с этой ситуацией уже все
А с атакой - ее, ятп, вычитать опасно, если атака задавалась или складывалась, пока проблем не было
0
16
6 лет назад
0
да боже ж ты мой) с ней можно делать абсолютно что угодно, просто надо проверять, что у тебя юнит не потерялся, а он у тебя потерялся)
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.