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

На сей раз задался целью понять как триггерно (безо всяких абилок) блокировать процент от получаемого юнитом урона. Пришлось поискать на форуме, но к счастью нужная тема нашлась довольно быстро. Нашёл сразу несколько интересных тем. Потом обьединил полученные сведения, обдумал их и...
Итого имеем:
  • возможность блокировать любой процент получаемого урона
  • возможность распределять любой процент полученного урона
  • возможность распределять урон по всем в области, зависимо от их расстояния к герою
Что изменилось в последней версии:
  • система лучше оптимизирована
  • некоторые значения вынесены в переменные для лучшей настраиваемости
  • некоторые функции вынесены в библиотеку в отдельных триггерах
  • минимизировано количество переменных
Библиотека
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
`
ОЖИДАНИЕ РЕКЛАМЫ...
21
К слову, буду благодарен если кто подскажет как избавится от утечек когда юнита атакует множество других юнитов. Ясное дело, кроме как "перестать модить вар")
21
Обновил. Некоторые функции вынес отдельную библиотеку. Может, кому-то будет интересно.
30
Ты определённо не то запостил в блоке кода
21
Сам скилл разбил на куски. В коде многовато комментариев, будет уродливо отображатся.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.