Ну что наконец то представляю вашему вниманию обновленную функцию определения стороны атаки.
Немного отличается от превоначальной, функция корректно работает для юнитов с дальней атакой, позволяет создавать уникальные диапазоны значений для каждой стороны атаки, по сути эта функциия имеет более расширенное применение нежели преведущая. Схема практически таже, но вместо угла поворота атакующего используется угол между атакуемым и атакующим, то есть атака воспринимается как вектор от атакующего к атакуемому, в результате возможно для применения спелов с Аое или других схожих с атакой не по углу поворота атакующего.
Пример настроен на углы атаки для каждой стороны в 90 градусов. Для изменения углов необходим небольшой несложный пререрасчет=)
Code
function BackStab takes unit caster , unit target returns integer
local real a = GetUnitFacing( target )
local real b = Atan2( GetUnitY( caster ) - GetUnitY( target ), GetUnitX( caster ) - GetUnitX( target ) ) * bj_RADTODEG
local real angle = a - b
// следующие условия определяют удар в лицо
if( angle >= -45 and angle <= 0) then
return 1
elseif ( angle > 0 and angle <= 45 ) then
return 1
elseif ( angle >= 315 and angle <= 405 ) then
return 1
// следующие условия определяют удар справа
elseif ( angle > 45 and angle < 135 ) then
return 2
elseif ( angle >= 405 and angle < 495 ) then
return 2
// следующие условия определяют удар слева
elseif ( angle > -135 and angle < -45 ) then
return 4
elseif ( angle > 225 and angle < 315 ) then
return 4
// следующие условия определяют удар в спину
elseif ( angle >= 135 and angle <= 225 ) then
return 3
elseif ( angle >= 495 and angle <= 540 ) then
return 3
elseif ( angle >= -180 and angle <= -135 ) then
return 3
endif
endfunction
ну и пример. BackStab 0.3b
пожалуйста тестируйте, по моим тестам все отлично=)