Психопомпа продолжает иногда фаталить вар после выхода из игры, скиллсет ее здесь:
Грешилось почему-то ранее на все остальное, но начинаю думать, что дело во 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
32
7 лет назад
0
Ну ты еще бы не только округлилял но и проверял реал на корректность, не ушел ли ы минус, не стал ли 100500.00
0
26
7 лет назад
0
Короче, надо при задании перезарядки число округлять до сотых?
Что мешает проверить?
. . . исчезнет ли проблема
при касте спелла считает текущую перезарядку через GetAbilityCD и задает ее через SetAbilityCD умножить на .01/.02/.03/.04/.05 соответственно.
Очень похоже что ты берёшь текущее кд (допустим 10.00 сек) и умножаешь его на 0.01
Получая при этом .1/.2/.3/.4/.5 сек итогового кд... не логично, да?
0
21
7 лет назад
Отредактирован ClotPh
0
quq_CCCP, а как положительное число от умножения на положительное отрицательным может стать? В свою ячейку-то по идее доп. цифры не залезают, именно с тем, на сколько увеличивается перезарядка, все более-менее нормально (это кушка героя и показывает, кстати).
Extremator, да ничто не мешает, ток хз, как (какая вообще функция округляет), думаю извернуться - вынуть текущую перезарядку, умножить на 1.01, или 1.02... и т. д., перевести в реалку, умножить на 100, перевести в интеджерку (если там были у исходного числа до умножения на 100 дробные значения ниже сотых, эта интеджерка же по идее их уничтожит), перевести в реалку, поделить на 100 и уже потом благополучно задать как новую перезарядку. Так и попробую. Но только это все проверять займет часы, поэтому и уточняю пока теорию.
Да-да, на 1.01 и т. д., конечно, умножалось и умножается, опечатка, ща исправлю. Да вот там сам и код внизу.
смотреть сюда
function BendingEffect takes nothing returns nothing
local real percent = 1.00
local integer i = 11
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
call SetAbilityCD (GetSpellAbilityId(), i, GetAbilityCD(GetSpellAbilityId(), GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit())) * percent)
endloop
else
endif
else
endif
endfunction
2
20
7 лет назад
Отредактирован Diaboliko
2
Имхо искривление - это про позвоночник. А искажение (distortion) - то, что вероятно подразумевалось автором.
Элсо - ощущение что мне предлагают кал под видом пирожка гуи под видом жасса. GetTriggerUnit() повторяется овердофига раз. Элсо - GetUnitAbilityLevelSwapped(). Также, просьба пользоваться форматированием кода при вставке кода(без табуляции смотреть на циклы - ересь).
Если верить алекспрею, погрешность при арифметике флоатов возникает только при операциях между числами с разным числом знаков(до и после запятой, полагаю). Я подозреваю, что
	set percent = percent * 2
Возвращает значение, равное
	percent + percent + E(погрешность)
0
21
7 лет назад
0
Diaboliko, проблема в том, что "Искажение" уже называется другая пассивка у другого героя :D
Одна из трудностей, когда их третья сотня.
Ладно, короче, понятно, скорее всего потом сделаю округление до сотых по своему способу (если нет др. функции округлить) и проверю.
Вообще хотелось бы услышать четкий ответ от драколича: если попытаться задать SetAbilityCD со значением, скажем, 1.569, "вылезет" ли девятка в другую ячейку памяти? Я пока вижу так, что ДА - вылезет. Можно было бы продокументировать, конечно, хотя понятно, что мемхак юзать уже само по себе подразумевает попытки разбираться самостоятельно...
0
32
7 лет назад
0
ClotPh, ты можешь в любой момент посмотреть что у тебя записалось в память, в чем проблема?
Берем и проверяем все данные на корректность.
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
//////////////
Ну, короче, действует-то однозначно она уже лучше, раньше цифры высчитывались с избытком, теперь явно правильнее. Насчет фаталов время покажет... Но все равно стало лучше.
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.