Добавлен , опубликован
Очередная триггерная способность

На сей раз задался целью понять как триггерно (безо всяких абилок) блокировать процент от получаемого юнитом урона. Пришлось поискать на форуме, но к счастью нужная тема нашлась довольно быстро. Нашёл сразу несколько интересных тем. Потом обьединил полученные сведения, обдумал их и...
Итого имеем:
  • возможность блокировать любой процент получаемого урона
  • возможность распределять любой процент полученного урона
  • возможность распределять урон по всем в области, зависимо от их расстояния к герою
Что изменилось в последней версии:
  • система лучше оптимизирована
  • некоторые значения вынесены в переменные для лучшей настраиваемости
  • некоторые функции вынесены в библиотеку в отдельных триггерах
  • минимизировано количество переменных
Библиотека
library GetFastDistances
   
   //Считает вертикальный угол из точки А с координатами (fromDimension1,fromDimension2,fromMain) на точку В 
   //с координатами (toDimension1,toDimension2,toMain). Возвращает значение в градусах.
   function GetAngleDEG takes real fromDimension1, real fromDimension2, real fromMain, real toDimension1, real toDimension2, real toMain returns real 
   return Atan((fromMain-toMain)/SquareRoot(Pow((fromDimension1-toDimension1),2)+Pow((fromDimension2-toDimension2),2)))*bj_RADTODEG
   endfunction
   
   //Считает вертикальный угол из точки А с координатами (fromDimension1,fromDimension2,fromMain) на точку В 
   //с координатами (toDimension1,toDimension2,toMain). Возвращает значение в радианах.   
   function GetAngleRAD takes real fromDimension1, real fromDimension2, real fromMain, real toDimension1, real toDimension2, real toMain returns real 
   return Atan((fromMain-toMain)/SquareRoot(Pow((fromDimension1-toDimension1),2)+Pow((fromDimension2-toDimension2),2)))
   endfunction
   
   //Считает расстояние в осях между точками, заданными двумя координатами (X,Y)
   function GetDistanceXY takes real xA, real yA, real xB, real yB returns real
   return SquareRoot(Pow((xA-xB),2)+Pow((yA-yB),2))
   endfunction 
   
   //Считает расстояние в осях между точками, заданными тремя координатами (X,Y,Z)  
   function GetDistanceXYZ takes real xA, real yA, real zA, real xB, real yB, real zB returns real 
   return SquareRoot(Pow((xA-xB),2)+Pow((yA-yB),2)+Pow((zA-zB),2))
   endfunction 
   
   //Установить высоту юнита
   function SetUnitZ takes unit u, real Z returns nothing
      call UnitAddAbility(u,'Amrf')
      call UnitRemoveAbility(u,'Amrf')
      call SetUnitFlyHeight(u,Z,0)
   endfunction
   
   //Узнать высоту юнита
   function GetUnitZ takes unit WhichUnit returns real

      local real UnitZ
      
         call MoveLocation(mathLocation,GetUnitX(WhichUnit),GetUnitY(WhichUnit))
         set UnitZ = GetLocationZ(mathLocation)+GetUnitFlyHeight(WhichUnit)
         set WhichUnit = null
         
   return UnitZ
   endfunction
   
   //Узнать высоту ландшафта в заданной точке
   function GetPointZ takes real X, real Y returns real 

      local real PointZ
      
         call MoveLocation(mathLocation,X,Y)
         set PointZ = GetLocationZ(mathLocation)
         
   return PointZ 
   endfunction
   
   //Возвращает дельту в указанных координатах
   function getOffsetD takes real coord1, real coord2 returns real
   return SquareRoot(Pow(coord1-coord2,2))
   endfunction
   
endlibrary

Благодарности: Hate, Doc, Clamp, nvc123
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
21
8 лет назад
0
К слову, буду благодарен если кто подскажет как избавится от утечек когда юнита атакует множество других юнитов. Ясное дело, кроме как "перестать модить вар")
0
21
8 лет назад
0
Обновил. Некоторые функции вынес отдельную библиотеку. Может, кому-то будет интересно.
0
30
8 лет назад
0
Ты определённо не то запостил в блоке кода
0
21
8 лет назад
0
Сам скилл разбил на куски. В коде многовато комментариев, будет уродливо отображатся.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.