Психопомпа продолжает иногда фаталить вар после выхода из игры, скиллсет ее здесь:
Грешилось почему-то ранее на все остальное, но начинаю думать, что дело во 2 абилке.
Она действует весьма незатейливо: при касте спелла считает текущую перезарядку через GetAbilityCD и задает ее через SetAbilityCD умножить на 1.01/1.02/1.03/1.04/1.05 соответственно.
Начинаю предполагать, что дело в следующем. Минимальные доли в РО ведь для перезарядки - сотые, а тут могут получаться реалки с тысячными, десятитысячными и так далее.
И че-то мне кажется, что при попытке запихнуть это в память функция забивает ячейку перезарядки цифрами до сотых долей, а остальное суёт куда-то дальше и начинается че попало.
То, что эти предположения не упоротые, а близкие к истине, подтверждает следующее: только что в игре меня бот станил абилкой явно дольше, чем эта абилка должна действовать (смене кулдауна абила, естественно, подвергалась).
Короче, надо при задании перезарядки число округлять до сотых?
Принятый ответ
ТЬФУ! Никто, начиная с меня, JASS читать не умеет!
call SetAbilityCD (GetSpellAbilityId(), i, GetAbilityCD(GetSpellAbilityId(), GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit())) * percent)
на русский переводится как:
- Задать перезарядку способности (Кастуемая способность, уровень i, получить перезарядку способности юнита на ТЕКУЩЕМ УРОВНЕ СПОСОБНОСТИ ЮНИТА и умножить на нашу переменную)
Какого хрена тут ТЕКУЩИЙ УРОВЕНЬ, когда должен тоже быть уровень i?! Оно в цикле везде берет текущий уровень абилки вмеcто i. Т. е. если перезарядка на разных уровнях разная, это уже ппц ошибка.
Сейчас как раз фикшу эту абилу, она один хрен не до конца правильно действует, и уже тут самые разные извращения с ней получались, после выхода из вара фаталило, крч, 90% вероятности, что другие абилы Психопомпы в поряде, а фатал здесь.
Короче, вот, вроде теперь действует нормально.
Извините уж, что не под катом, мозги уже не имеют сил кат вставлять.
Короче, вот, вроде теперь действует нормально.
Извините уж, что не под катом, мозги уже не имеют сил кат вставлять.
function BendingEffect takes nothing returns nothing
local real percent = 1.00
local real percent2 = 0.00
local integer i = 11
local integer percentchange = 0
local real percent2 = 0.00
local integer i = 11
local integer percentchange = 0
if ( GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit()) >= 1 ) and (GetAbilityCD(GetSpellAbilityId(), GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit())) >= 1) then
УВЕЛИЧЕНИЕ НА 1%
if UnitHasBuffBJ(GetTriggerUnit(),'B0H8') == true then
set percent = 1.01
endif
НА 1% - ЗАКРЫТО.
if UnitHasBuffBJ(GetTriggerUnit(),'B0H8') == true then
set percent = 1.01
endif
НА 1% - ЗАКРЫТО.
УВЕЛИЧЕНИЕ НА 2%
if UnitHasBuffBJ(GetTriggerUnit(),'B0H9') == true then
set percent = 1.02
endif
НА 2% - ЗАКРЫТО.
if UnitHasBuffBJ(GetTriggerUnit(),'B0H9') == true then
set percent = 1.02
endif
НА 2% - ЗАКРЫТО.
УВЕЛИЧЕНИЕ НА 3%
if UnitHasBuffBJ(GetTriggerUnit(),'B0HA') == true then
set percent = 1.03
endif
НА 3% - ЗАКРЫТО.
if UnitHasBuffBJ(GetTriggerUnit(),'B0HA') == true then
set percent = 1.03
endif
НА 3% - ЗАКРЫТО.
УВЕЛИЧЕНИЕ НА 4%
if UnitHasBuffBJ(GetTriggerUnit(),'B0HB') == true then
set percent = 1.04
endif
НА 4% - ЗАКРЫТО.
if UnitHasBuffBJ(GetTriggerUnit(),'B0HB') == true then
set percent = 1.04
endif
НА 4% - ЗАКРЫТО.
УВЕЛИЧЕНИЕ НА 5%
if UnitHasBuffBJ(GetTriggerUnit(),'B0HC') == true then
set percent = 1.05
endif
НА 5% - ЗАКРЫТО.
if UnitHasBuffBJ(GetTriggerUnit(),'B0HC') == true then
set percent = 1.05
endif
НА 5% - ЗАКРЫТО.
ТАЛАНТ СИЛЬНОЕ ИСКРИВЛЕНИЕ
set i = 0
set percent = percent - 1
loop
set i = i + 1
exitwhen i > 12
if ( GetUnitAbilityLevelSwapped('A281', udg_Circle[i]) == 2 ) then
set percent = percent * 2
set i = 12
endif
endloop
set percent = percent + 1
ТАЛАНТ СИЛЬНОЕ ИСКРИВЛЕНИЕ - ЗАКРЫТО.
set i = 0
set percent = percent - 1
loop
set i = i + 1
exitwhen i > 12
if ( GetUnitAbilityLevelSwapped('A281', udg_Circle[i]) == 2 ) then
set percent = percent * 2
set i = 12
endif
endloop
set percent = percent + 1
ТАЛАНТ СИЛЬНОЕ ИСКРИВЛЕНИЕ - ЗАКРЫТО.
if (percent > 1.00) then
call AddSpecialEffectTargetUnitBJ( "chest", GetTriggerUnit(), "Psychopomp2.mdl" )
call ConditionalTriggerExecute( gg_trg_destroyspeceffect )
call ConditionalTriggerExecute( gg_trg_destroyspeceffect )
loop
exitwhen i < 1
set i = i-1
exitwhen i < 1
set i = i-1
ОКРУГЛЕНИЕ ДО СОТЫХ (ИНАЧЕ МОГУТ ЗАПИСАТЬСЯ ДОП. ЦИФРЫ НЕ В ТЕ ЯЧЕЙКИ)
loop
exitwhen i < 1
set i=i - 1
set percent2 = GetAbilityCD(GetSpellAbilityId(), i) * percent
set percent2 = percent2 * 100
set percentchange = R2I(percent2)
set percent2 = I2R(percentchange)
set percent2 = percent2 * 0.01
call SetAbilityCD(GetSpellAbilityId() , i , percent2)
endloop
exitwhen i < 1
set i=i - 1
set percent2 = GetAbilityCD(GetSpellAbilityId(), i) * percent
set percent2 = percent2 * 100
set percentchange = R2I(percent2)
set percent2 = I2R(percentchange)
set percent2 = percent2 * 0.01
call SetAbilityCD(GetSpellAbilityId() , i , percent2)
endloop
ОКРУГЛЕНИЕ ДО СОТЫХ - ЗАКРЫТО.
endloop
else
endif
endif
else
endif
endif
endfunction
//////////////
//////////////
Ну, короче, действует-то однозначно она уже лучше, раньше цифры высчитывались с избытком, теперь явно правильнее. Насчет фаталов время покажет... Но все равно стало лучше.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
. . . исчезнет ли проблема
Получая при этом .1/.2/.3/.4/.5 сек итогового кд... не логично, да?
Отредактирован ClotPh
Extremator, да ничто не мешает, ток хз, как (какая вообще функция округляет), думаю извернуться - вынуть текущую перезарядку, умножить на 1.01, или 1.02... и т. д., перевести в реалку, умножить на 100, перевести в интеджерку (если там были у исходного числа до умножения на 100 дробные значения ниже сотых, эта интеджерка же по идее их уничтожит), перевести в реалку, поделить на 100 и уже потом благополучно задать как новую перезарядку. Так и попробую. Но только это все проверять займет часы, поэтому и уточняю пока теорию.
Да-да, на 1.01 и т. д., конечно, умножалось и умножается, опечатка, ща исправлю. Да вот там сам и код внизу.
local integer i = 11
if UnitHasBuffBJ(GetTriggerUnit(),'B0H8') == true then
set percent = 1.01
endif
НА 1% - ЗАКРЫТО.
if UnitHasBuffBJ(GetTriggerUnit(),'B0H9') == true then
set percent = 1.02
endif
НА 2% - ЗАКРЫТО.
if UnitHasBuffBJ(GetTriggerUnit(),'B0HA') == true then
set percent = 1.03
endif
НА 3% - ЗАКРЫТО.
if UnitHasBuffBJ(GetTriggerUnit(),'B0HB') == true then
set percent = 1.04
endif
НА 4% - ЗАКРЫТО.
if UnitHasBuffBJ(GetTriggerUnit(),'B0HC') == true then
set percent = 1.05
endif
НА 5% - ЗАКРЫТО.
set i = 0
set percent = percent - 1
loop
set i = i + 1
exitwhen i > 12
if ( GetUnitAbilityLevelSwapped('A281', udg_Circle[i]) == 2 ) then
set percent = percent * 2
set i = 12
endif
endloop
set percent = percent + 1
ТАЛАНТ СИЛЬНОЕ ИСКРИВЛЕНИЕ - ЗАКРЫТО.
call ConditionalTriggerExecute( gg_trg_destroyspeceffect )
exitwhen i < 1
set i = i-1
call SetAbilityCD (GetSpellAbilityId(), i, GetAbilityCD(GetSpellAbilityId(), GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit())) * percent)
endloop
endif
endif
Отредактирован Diaboliko
Элсо - ощущение что мне предлагают
кал под видом пирожкагуи под видом жасса. GetTriggerUnit() повторяется овердофига раз. Элсо - GetUnitAbilityLevelSwapped(). Также, просьба пользоваться форматированием кода при вставке кода(без табуляции смотреть на циклы - ересь).Если верить алекспрею, погрешность при арифметике флоатов возникает только при операциях между числами с разным числом знаков(до и после запятой, полагаю). Я подозреваю, что
Одна из трудностей, когда их третья сотня.
Берем и проверяем все данные на корректность.
Отредактирован ClotPh
Есть предмет, чтобы с этим бороться, он при касте, напротив, чуть-чуть снижает перезарядки спеллов. При этом его применять под аурой, кэп намекает, совсем не обязательно.
Короче, вот, вроде теперь действует нормально.
Извините уж, что не под катом, мозги уже не имеют сил кат вставлять.
local real percent2 = 0.00
local integer i = 11
local integer percentchange = 0
if UnitHasBuffBJ(GetTriggerUnit(),'B0H8') == true then
set percent = 1.01
endif
НА 1% - ЗАКРЫТО.
if UnitHasBuffBJ(GetTriggerUnit(),'B0H9') == true then
set percent = 1.02
endif
НА 2% - ЗАКРЫТО.
if UnitHasBuffBJ(GetTriggerUnit(),'B0HA') == true then
set percent = 1.03
endif
НА 3% - ЗАКРЫТО.
if UnitHasBuffBJ(GetTriggerUnit(),'B0HB') == true then
set percent = 1.04
endif
НА 4% - ЗАКРЫТО.
if UnitHasBuffBJ(GetTriggerUnit(),'B0HC') == true then
set percent = 1.05
endif
НА 5% - ЗАКРЫТО.
set i = 0
set percent = percent - 1
loop
set i = i + 1
exitwhen i > 12
if ( GetUnitAbilityLevelSwapped('A281', udg_Circle[i]) == 2 ) then
set percent = percent * 2
set i = 12
endif
endloop
set percent = percent + 1
ТАЛАНТ СИЛЬНОЕ ИСКРИВЛЕНИЕ - ЗАКРЫТО.
call ConditionalTriggerExecute( gg_trg_destroyspeceffect )
exitwhen i < 1
set i = i-1
exitwhen i < 1
set i=i - 1
set percent2 = GetAbilityCD(GetSpellAbilityId(), i) * percent
set percent2 = percent2 * 100
set percentchange = R2I(percent2)
set percent2 = I2R(percentchange)
set percent2 = percent2 * 0.01
call SetAbilityCD(GetSpellAbilityId() , i , percent2)
endloop
endif
endif
//////////////