Пока пытался продолжить пилить карту, заметил баг, что скорость передвижения юнита не меняется должным образом.
Сделаны несколько абилок на основе сапога 'AIms' - 1 + степени двойки
Путём подсчётов должны выдаваться кучи абилок, чтобы сравнять скорость передвижения юнита с нужной.
На скрине:
1е - мс, взятое из GetUnitMoveSpeed(u)
2е - мс, записанное в БД, что должно быть в игре - 250
129 получено путём 1 (дефолтный мс юнита) + 128 (самое высокое число в линейке до 250 [128+64+32+16+8+2])
Вывод - однотипные абилки ботинка не стакаются?
И есть ли другие абилки, что дают мс, или придётся колдовать с SetUnitMoveSpeed?

Принятый ответ

да не стакаются
тут посмотри раздел скорости про эту абилу. разбирал и тесты проводил
`
ОЖИДАНИЕ РЕКЛАМЫ...
2
19
5 лет назад
2
Похожие вопросы:

ответ
ТЬФУ! Никто, начиная с меня, 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
//////////////
Ну, короче, действует-то однозначно она уже лучше, раньше цифры высчитывались с избытком, теперь явно правильнее. Насчет фаталов время покажет... Но все равно стало лучше.

3
27
5 лет назад
3
да не стакаются
тут посмотри раздел скорости про эту абилу. разбирал и тесты проводил
Принятый ответ
0
17
5 лет назад
0
Эх, костыли наши друзья....
Чего только могло не быть, если б близы всё допилили...
0
27
5 лет назад
Отредактирован MpW
0
PyCCKuu_4eJl, возможно раньше и работало. как вот у "укрыться за щита" с отскоками стрел в 1.26 (пока не натыкаешься в константах) или едкого дыхание химеры (она не работает)
PyCCKuu_4eJl, но есть баги с этими триггерными прибавками (по ссылке описано). изменяя ты можешь изменить навсегда параметр скорости например и так далее. будьте осторожны, дебагами перепроверяйте
0
10
5 лет назад
0
А триггерное изменение скорости почему не подходит?
0
27
5 лет назад
Отредактирован MpW
0
ArchOracle, не говорил что не подходит. она со способностью AIms не очень сочетается. ну и есть ограничения у юнита в скорости, которая упирается в констант минимум и максимум скорости. при расчетах не те данные может получить просто см ниже.
Предмет: увеличение скорости перемещения 'AIms' (Ботинки скорости) - повышает скорость перемещения юнита (иконки не имеет). Единственная абилка, которая колличественно (не процентами!) поднимает скорость. Максимум можно поднять до 522.
Но, имеет некоторые свойства:
  • скорости движения от разных таких абилок не суммируется. Константа "Баланс: повышение скорости перемещения суммируется" (англ. MoveSpeed Bonuses Stack) - (да/нет)" - Как пишут в одном источнике: "Определяет, будут ли суммироваться свойства предметов, повышающих скорость перемещения героя. По умолчанию константа равна "Нет"." Ставил в константе "да", но это все равно не видно, как между собой суммируются. В варкрафте в триггерах есть нативка GetUnitMoveSpeed, которая возвращает текущую скорость юнита (с помощью нее дебагом проверял, также сравнивал кто из них быстрее бегает). Вывод: не суммируется, константа неизвестно что дает.
  • как показывает дебаг, бонус дает та абилка, что сильнее. Например, есть два разные ботинка: один дает 50 скорости, другой дает 150. У моего юнита скорость движения равна 150. При получений двух шмоток у него становится 300 скорости (а должно сложится в 350). Не получится стэки. Как видим берется самый высокий бонус из двух скилов
  • Отрицательные значения в способности не убавляют скорость - проверял. Единственное, что заметил, что при константе "Баланс: повышение скорости перемещения суммируется" - да, у юнита становится надпись красная. Хотя, дебаг показывает, что скорость не изменилась (все такая же положительная).
  • есть ограничения, установленных в константах (мин = 150, макс = 400). Если у юнита меньше минималки, например, 100 скорости. То игра автоматически подправляет до минимального значения до 150. Вышла забавная фишка: хотел дать ботинки с 100 скорости перемещения. Должно быть 150+100=250. Но дебаг показывает 200. Получается отталкивается не от минималки (150), а от текущей скорости (100).
  • Можно устанавливать скорость через триггеры "Боевая единица - Set movement speed"
Действие - "Боевая единица - Set (Triggering Unit) movement speed to ( Current movement speed of (Triggering Unit) + 50. )" //Прибавляю 50. к текущей скорости. 
Пробовал также убавлять до нуля (в ноль не получится убавить, единица остается)
НО совмещая эту абилку и действие "Боевая единица - Set movement speed" может приводить к багам: до получения ботинок убавление и добавление через триггеры работало нормально. После получения ботинок получается баг.
Примеры
  1. Например, у рабочего 100 скорости (минималку поставил ноль в константах), ботинки дают +100 скорости. В сумме получает 200 скорости. Триггерно добавляю 50 скорости.
Действие - "Боевая единица - Set (Triggering Unit) movement speed to ( Current movement speed of (Triggering Unit) + 50. )" //Прибавляю 50. к текущей скорости. 
В итоге получается 350. Откуда взялось 350? Должно быть 250. Откуда то взял лишние 100.
Пробую еще раз добавить. Добавляю триггером еще 50 скорости. Получается 500 скорости. Должно быть 400, получил 500.
Каждый раз добавляется 50+100=150 (лишние 100 берет от ботинок, пробовал бонус к ботинкам вместо +100 ставить +60 скорости, так и прибавляет +60. Это баг, случается из-за неверно предоставленных данных триггерной нативкой Current movement speed of (Unit), из-за чего прибавляет лишнее ).
Default movement speed of (Unit) - учитывает только скорость юнита + бонусы
Current movement speed of (Unit) - учитывает только скорость юнита + бонусы + триггерные добавки может давать current ms неверные значения
Только "Default movement speed of (Triggering Unit)" - "скорость по умолчанию" возвращает 200 (100 - скорость юнита, 100 - скорость ботинок).
  1. Возьмем, другой пример. Теперь триггерно буду убавлять. У рабочего 100 скорости (минималку поставил ноль в константах), ботинки дают +60 скорости. В сумме получает 160 скорости.
"Боевая единица - Set (Triggering Unit) movement speed to ( Current movement speed of (Triggering Unit) - 50. )".
Триггерно убавляю 50 скорости. В итоге получается 170=160+60-50. (здесь нам опять дают неверное значение из-за current ms, добавляют непонятный доп бонус от ботинок +60)
Второй раз убавляю 50, 180=170+60-50 Получается 180.
Короче не советую юзать Current movement speed of (Triggering Unit)
Только "Default movement speed of (Triggering Unit)" - "скорость по умолчанию" возвращает 160 (100 - скорость юнита, 60 - скорость ботинок).
  1. Кто-то писал на форуме, что триггерное изменение может привести к проблемам. "учти что меняя текущую скорость ты меняешь её вместе с бонусами и бонусы уже становяться частью базовой скорости героя." Проверял на множестве абилках (ауры, баффы) с дебагом, пока не нашел такого ничего.
Приведу пример. У рабочего 100 скорости (минималку поставил ноль в константах), ботинки дают +60 скорости. В сумме становится 160 скорости. Триггерно убавляю 50 скорости действием "Боевая единица - Set (Triggering Unit) movement speed to ( Default movement speed of (Triggering Unit) - 50. )". Убавляю с помощью Default movement speed - учитывает скорость юнита и бонусы (но не учитывает триггерные добавки). Убавляю 50, становится 110. Пробовал убавить еще на 50, но не получается (видимо там корректируется так, чтобы осталось у юнита что-то). Снимаю ботинки с +60 скоростями, становится у юнита 50 скорости.
Хотя возможно что действительно бонусы могут стать частью системы. Например, если а какой-то момент снять ботинки или одеть их. У вас значения могут упираться об ограничительные константы.
Надо проверять это. Что будет, если у раба скорость 190 (максималка 300), ботинки 200. Должно получится 390, но упрется в константу 300. Если потом снять бутсы +200, вернется ли в норму скорость раба +190, иди станет меньше?
0
10
5 лет назад
0
Steal nerves, любопытно. Чтобы всё было предсказуемо надо либо одно либо другое юзать, получается? (Ну либо учитывать все эти непонятности...)
0
27
5 лет назад
Отредактирован MpW
0
ArchOracle, похоже немного ошибся. давно работал с мемхаком, и что то по тестам не то дают. Default movement speed - дает указанное в ро скорость юнита.

баги те же остаются, неверно показывает тек скорость (если надеть ботинки и триг добавить, тек скорость будет неверной).
но можно запоминать сколько триггерно добавил (с учетом ограничении констант), сколько дают бутсы (надо будет завести бд всех итемов дающих бонус ms, и среди них выбрать наибольший бонус. проверять при подборе/дропе). Ну и это должно помочь.
Загруженные файлы
Чтобы оставить комментарий, пожалуйста, войдите на сайт.