Добавлен ClotPh
Активно использовался мх, дело явно в использовании чего-то из него
Друг друга атаковали 2 одинаковых героя, у каждого были шансы на сброс перезарядки атаки при атаке себя противником
Друг друга атаковали 2 одинаковых героя, у каждого были шансы на сброс перезарядки атаки при атаке себя противником
Принятый ответ
Ладно, достало, уже все нервы выжжены и нет времени разбираться, абиле просто сделан частично упрощенный реворк (вместо вычитания белого урона вычитается минус бонусом через многоуровневую абилу).
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Так. Ладно, спок, спок, релаксим, все хорошо
По тесту ингейм уже видно, что сила героя ок
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: 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"))
call ConditionalTriggerExecute( gg_trg_destroyspeceffect )
call ResetAttackCooldown(u5)
СБРОС ПЕРЕЗАРЯДКИ АТАКИ - ЗАКРЫТО.
call CreateItemLoc( 'I01W', p )
set it = GetLastCreatedItem()
call UnitAddItemSwapped( it, GetAttackedUnitBJ() )
call RemoveItem (it)
ЗАНОСИМ ПРЕДМЕТ В ПЕРЕМЕННУЮ СРАЗУ ПОСЛЕ СОЗДАНИЯ, ПОТОМ ОБЯЗ РЕМУВ - ЗАКРЫТО.
set it = null
set u5 = null
set p = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: 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 DestroyTimer (t)
call FlushChildHashtable (udg_Hash, GetHandleId(t))
set t=null
set u5=null
set u6=null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: 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"))
call ConditionalTriggerExecute( gg_trg_destroyspeceffect )
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)
СЧИТАЕМ, СКОЛЬКО МИНУСОВАТЬ, МИНУСУЕМ И СЭЙВИМ В ХЭШ - ЗАКРЫТО.
call SaveUnitHandle(udg_Hash,GetHandleId(t),1,u6)
call TimerStart(t,2,false,function Suppression2)
call SetUnitBaseDamage (u5,GetUnitBaseDamage(u5) + (GetUnitAbilityLevelSwapped ('A31D', u5)))
ПРОСТО ДОБАВЛЯЕМ АТАКУ ГЕРОЮ - ЗАКРЫТО.
call DestroyTimer (t)
call FlushChildHashtable (udg_Hash, GetHandleId(t))
call DestroyTimer (t)
call FlushChildHashtable (udg_Hash, GetHandleId(t))
set t = null
set u5 = null
set u6 = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
////////////
т. е. тебя атакует враг, у него тоже Спарта, у тебя сброс кд ты сразу его у него сброс он сразу тебя --- цикл? Но хм, ведь там ШАНС!
Однако попробую просто при переносе отключать триг в начале и вкл в конце
По Подавлению есть сомнения, но ведь там первое действие не может создать цикл, а второе имеет кд на 2 секунды...
Ладно, крч, пока идея Спарту отключить, посмотрим
недаром я ввел безопасные функции чтения-записи потом
судя по тому, что при умножении на 4 это дает 1E8, ты лез в Aatk, ну функции урона, если точнее
так что у тебя либо юнит без атаки, либо где-то 0 втесался, ищи
Отредактирован ClotPh
там два clawbfs.ucoz.ru/forum/3-1839-1 с двумя прокачанными пассивками били друг друга
"Спарта!" действует с шансом, а Подавление - гарантированно
Но вопрос, что именно вызывает фатал (точно что-то из этого, там фатал был потом еще раз, ульты в этот момент прокачано не было, Qшка во второй раз тоже 90%, что не юзалась).
Вот см. по ссылке че абилы делают и выше коды
Там да, или как-то связанный с атакой бесконечный цикл создается, или пытается записаться что-то, что записаться не может
///////////////////////////
первый второму пассивкой режет, второй в обратку первому...
ммм... может, попытка записать в атаку дробную реалку вызывает фатал? Но тоже бред, дробные реалки в броню же норм пишутся
//////////
Кстати, да, енейбл-дизейбл Спарты фактически уже есть сохраняемым в хэш числом, так что дело не в этом... =/ ну блииин
///////
так, ладно, пока карта грузится, знаю, что делать
протестирую с ботом, прокачав себе только Подавление, Спарта! на одного себя гарантированно фатала не вызывает, в тест-карте Спарта! и Подавление нормально работали в окружении. Прокачаю Подавление, поставлю бота, он раскачается, прокачает Спарта! и Подавление, себе прокачаю только Подавление, пойду его бить. Если зафаталит - 95%, что проблема в способности "Подавление".
//
Ага. Со Спартой (пассивка на шанс дать себе вамп при атаке и рефрешнуть ее кд) все ок.
Значит, ща Подавлению пропишу дополнительно в нужных местах:
Проверим.
////////////
upd: МЛЯТЬ, вот сейчас выхожу и снова фатал.
Все-таки попробую еще помимо этого прописать, чтобы damagedebuff округлялась до целых...
Ну расклад тот, что это, крч, в любом случае 95%, что способность "Подавление"
При вэшке спок без Подавления у второго несколько секунд два Спартанца друг друга били, а когда W и E были и у того и того прокачаны - фатал вылетал почти сразу
Ща вот фатал в конце вылетел, когда они вообще в разных местах карты были и уже игра выключалась после тестирования, но у второго-то E была
там вот как-то видимо все-таки че-то ухитряется недопустимое писаться, мб атака продрачивается до тысячных долей, что ли, и вылетает фатал
да, скорее всего проблема в тысячных долях атаки
у Психопомпы как-то так вроде с кд было
ща округление крч мутить надо лучше и проще, да
set damagedebuff = (0.02 + (0.08 * (GetUnitAbilityLevelSwapped ('A31D', u5))) ) * (GetUnitBaseDamage(u6))
set damagedebuff = I2R(damagedebuffconvert)
//
а доп. ифзенэлсы хэша пока писать все-таки не буду
потому что в первом ифзенэлсе все равно только целые числа участвуют, а при втором хэш все равно на одного вешается и цикла быть не должно
/
ВРОДЕ ОК. В игре было аж 3 Кратоса, фатала не было.
Отредактирован ClotPh
////////////
O_O shit. Что за прикол?! Тут причина та же самая?
Это из другой карты для игры... Но вроде бы код уже исправленный туда всунут!!! Сейчас офк перепроверю.
Но в русской три Кратоса друг друга 20 минут долбали - все норм было. В англ. ща очень быстро даже с одного фатал вылетел.
upd: да, округление есть, это точно в ENG.w3x war3map.j....
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: 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"))
call ConditionalTriggerExecute(gg_trg_destroyspeceffect)
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)
СЧИТАЕМ, СКОЛЬКО МИНУСОВАТЬ, МИНУСУЕМ И СЭЙВИМ В ХЭШ - ЗАКРЫТО.
call SaveUnitHandle(udg_Hash, GetHandleId(t), 1, u6)
call TimerStart(t, 2, false, function Suppression2)
call SetUnitBaseDamage(u5 , GetUnitBaseDamage(u5) + ( GetUnitAbilityLevelSwapped('A31D', u5) ))
ПРОСТО ДОБАВЛЯЕМ АТАКУ ГЕРОЮ - ЗАКРЫТО.
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash, GetHandleId(t))
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash, GetHandleId(t))
set t=null
set u5=null
set u6=null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
Но про то, что функция кулдауна может фаталить, плз поподробнее