Психопомпа продолжает иногда фаталить вар после выхода из игры, скиллсет ее здесь:
Грешилось почему-то ранее на все остальное, но начинаю думать, что дело во 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
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% - ЗАКРЫТО.
УВЕЛИЧЕНИЕ НА 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% - ЗАКРЫТО.
УВЕЛИЧЕНИЕ НА 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% - ЗАКРЫТО.
ТАЛАНТ СИЛЬНОЕ ИСКРИВЛЕНИЕ
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 )
loop
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
ОКРУГЛЕНИЕ ДО СОТЫХ - ЗАКРЫТО.
endloop
else
endif
else
endif
endfunction
//////////////
Ну, короче, действует-то однозначно она уже лучше, раньше цифры высчитывались с избытком, теперь явно правильнее. Насчет фаталов время покажет... Но все равно стало лучше.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
21
7 лет назад
0
quq_CCCP, отладкой доставать число из соседней ячейки и выводить как строку?
Крч, ладно, уже сделано округление в тест-карте первого круга, когда захочется апдейтить - протестирую (только ради этого пока все карты по несколько кругов открытия и оптимизации гонять не охота), если что, вернемся к многострадальной Психопомпе.
2
26
7 лет назад
2
что бы уменьшить число на 1/2/3/4/5 % нужно просто умножить его на 0.99 / 0.98 / 0.97 / 0.96 / 0.95 и округлить...
0
21
7 лет назад
0
Extremator, вначале меня поправляешь, потом сам путаешься. У меня-то увеличить надо...
0
26
7 лет назад
0
ClotPh:
Extremator, вначале меня поправляешь, потом сам путаешься. У меня-то увеличить надо...
врагам? увеличение кд скилла? аурой? на 5%? серьёзно? что за шлак?
0
21
7 лет назад
Отредактирован ClotPh
0
Extremator, в плане чего шлак? Действие такое: перезарядка спелла увеличивается НАВСЕГДА (потом хоть в ауре, хоть нет - обратно не вернется) за КАЖДЫЙ каст этого спелла врагом под аурой.
И вон талант в коде, если выучить, удваивает эффект ауры, кстати. Имхо как раз цифры нормальные. Уж на 10%-то увеличить перезарядку вражеской ульты даже два-три раза вполне себе приятно, а мелкие спеллы тоже нехило растягиваются в течение всей игры.
Но в любом случае такое балансить сложновато по причине того, что аналогов-то просто нет.
Уточняю. Т.е. у противника спелл с перезарядкой в 2 секунды. Он его кастанул под этой аурой 5 уровня - перезарядка НАВСЕГДА стала 2.1 секунды. Еще кастанул - уже 2.2+... Это слабо?!

Есть предмет, чтобы с этим бороться, он при касте, напротив, чуть-чуть снижает перезарядки спеллов. При этом его применять под аурой, кэп намекает, совсем не обязательно.
Но прикол Психопомпы в том, что низкие перезарядки у врагов ей могут быть выгодны с другой стороны... У нее другой талант есть, на кушку, что урон с кушки не может быть меньше сотни. То есть после его выучивания если враги будут постоянно спамить спеллами по 2-3 секунды, то каждые 2-3 секунды имеют вероятность от нее получать 100 маг. урона в дыню (при этом за копейки маны, т. к. манакост-то мизерный остается clawbfs.ucoz.ru/forum/3-1809-1 ).
0
21
7 лет назад
0
ТЬФУ! Никто, начиная с меня, 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
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% - ЗАКРЫТО.
УВЕЛИЧЕНИЕ НА 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% - ЗАКРЫТО.
УВЕЛИЧЕНИЕ НА 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% - ЗАКРЫТО.
ТАЛАНТ СИЛЬНОЕ ИСКРИВЛЕНИЕ
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 )
loop
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
ОКРУГЛЕНИЕ ДО СОТЫХ - ЗАКРЫТО.
endloop
else
endif
else
endif
endfunction
//////////////
Ну, короче, действует-то однозначно она уже лучше, раньше цифры высчитывались с избытком, теперь явно правильнее. Насчет фаталов время покажет... Но все равно стало лучше.
Принятый ответ
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.