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

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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
21
Про тот-то все ок уже, просто в др. теме
Так. Ладно, спок, спок, релаксим, все хорошо
По тесту ингейм уже видно, что сила героя ок
Это явно какая-то из этих пассивок, Я НЕ БУДУ ВСТАВЛЯТЬ ЭТОТ **** КАТ, потому что это трата усилий, и так ща *** срыв нервный будет
///////////////////
**
function Sparta takes nothing returns nothing
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: it, u5, p
local item it
local unit u5 = GetAttackedUnitBJ()
local location p = GetUnitLoc(GetAttackedUnitBJ())
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
local real Spartahash = 0
set Spartahash = LoadReal(udg_Hash,GetHandleId(u5),StringHash("Spartahash"))
if (10 + ( GetUnitAbilityLevelSwapped('A31C', u5) * 5) >= GetRandomInt(1,100)) and Spartahash == 0 then
call SaveReal(udg_Hash,GetHandleId(u5),StringHash("Spartahash"),1)
call AddSpecialEffectTargetUnitBJ( "chest", u5, "Spartan2.mdl" )
call ConditionalTriggerExecute( gg_trg_destroyspeceffect )
СБРОС ПЕРЕЗАРЯДКИ АТАКИ
call ResetAttackCooldown(u5)
СБРОС ПЕРЕЗАРЯДКИ АТАКИ - ЗАКРЫТО.
ЗАНОСИМ ПРЕДМЕТ В ПЕРЕМЕННУЮ СРАЗУ ПОСЛЕ СОЗДАНИЯ, ПОТОМ ОБЯЗ РЕМУВ
call CreateItemLoc( 'I01W', p )
set it = GetLastCreatedItem()
call UnitAddItemSwapped( it, GetAttackedUnitBJ() )
call RemoveItem (it)
ЗАНОСИМ ПРЕДМЕТ В ПЕРЕМЕННУЮ СРАЗУ ПОСЛЕ СОЗДАНИЯ, ПОТОМ ОБЯЗ РЕМУВ - ЗАКРЫТО.
call SaveReal(udg_Hash,GetHandleId(u5),StringHash("Spartahash"),0)
endif
call RemoveLocation (p)
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: it, u5, p
set it = null
set u5 = null
set p = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
function Suppression2 takes nothing returns nothing
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6
local timer t = GetExpiredTimer()
local unit u5 = LoadUnitHandle(udg_Hash,GetHandleId(t),2)
local unit u6 = LoadUnitHandle(udg_Hash,GetHandleId(t),1)
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
local real Suppressionhash = 0
set Suppressionhash = LoadReal(udg_Hash,GetHandleId(u6),StringHash("Suppressionhash"))
call SetUnitBaseDamage (u6,GetUnitBaseDamage(u6) + R2I(Suppressionhash))
call SaveReal(udg_Hash,GetHandleId(u6),StringHash("Suppressionhash"),0)
call PauseTimer (t)
call DestroyTimer (t)
call FlushChildHashtable (udg_Hash, GetHandleId(t))
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6
set t=null
set u5=null
set u6=null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
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
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))
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
////////////
так
ну и чо мы тут видим
допустим, Sparta может вызывать перезарядку атаки, когда тебя атакует враг
т. е. тебя атакует враг, у него тоже Спарта, у тебя сброс кд ты сразу его у него сброс он сразу тебя --- цикл? Но хм, ведь там ШАНС!
Однако попробую просто при переносе отключать триг в начале и вкл в конце
По Подавлению есть сомнения, но ведь там первое действие не может создать цикл, а второе имеет кд на 2 секунды...
Ладно, крч, пока идея Спарту отключить, посмотрим
call DisableTrigger (GetTriggeringTrigger())
call EnableTrigger (GetTriggeringTrigger())
лан, пофиг, игра все равно ЛУЧШАЯ, УЖЕ ЛУЧШАЯ
уф все ладно прошу не тереть
16
ну судя по логу, ты попытался записать что-то в Memory[122], так что ищи
недаром я ввел безопасные функции чтения-записи потом
судя по тому, что при умножении на 4 это дает 1E8, ты лез в Aatk, ну функции урона, если точнее
так что у тебя либо юнит без атаки, либо где-то 0 втесался, ищи
21
Ну так это понятно, что функции урона в этот момент были
там два 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 Кратоса, фатала не было.
16
говорю же, у тебя подается 0+0x1E8, ставь проверки на нуль после ConvertHandle
21
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
Загруженные файлы
16
ну по оффсету легко видно, что да, то же самое
21
Ладно, достало, уже все нервы выжжены и нет времени разбираться, абиле просто сделан частично упрощенный реворк (вместо вычитания белого урона вычитается минус бонусом через многоуровневую абилу).
Принятый ответ
32
Кстати может быть дело в функции кулдауна, она все еще может фаталить...
21
quq_CCCP, у этого героя есть только сброс кулдауна атаки
Но про то, что функция кулдауна может фаталить, плз поподробнее
16
да у тебя по адресу офсета атаки вылет, ни при чем тут остальное)
21
DracoL1ch, ну на будущее, я кулдауном активно пользуюсь, интересно, когда он еще может создавать фаталы, а с этой ситуацией уже все
А с атакой - ее, ятп, вычитать опасно, если атака задавалась или складывалась, пока проблем не было
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.