//
++++++++++++++Спелл "Fissure". Автор - agentex++++++++++++++ // ОПИСАНИЕ
//работает в точности как у быка в доте. Все параметры настраиваются.
//Символом * отмечены те параметры, которые не рекомендуется изменять.
//Для работы спелла не нужны никакие дополнительные функции, системы, или надстройки редактора.
//Не используется ни одной глобальной переменной.
// ИНСТРУКЦИЯ ПО ПРИМЕНЕНИЮ
//Сначала, создайте в вашей карте триггер с названием "Fissure" (без кавычек), выделите его,
//нажмите "Правка -> Ковертировать в текст".
//Удалите все что было в этом триггере, и скопируйте весь текст отсюда в него.
//Для работы спелла необходимы следующие обьекты:
// 1. Геройская (или обычная, как хотите) способность с целью - точкой. (например, Волна Силы). Нам понадобится ее ID (например A000).
// 2. Прозрачный дамми - юнит с возможностью кастовать спелы и с физическим размером = 0. Нам понадобится его ID (например e000).
// 3. Способность на основе Громовой Поступи (stomp). Нам понадобится ее ID.
// 4. Разрушаемый обьект с текстурой пути не более 4х4. Нам понадобится его ID.
//Теперь пора обратиться к функции function Fissure_GetId. Впишите в ' ' ID обьектов,
//описанных выше, так чтобы было к примеру: return 'A000', return 'e000' и т.д.
//Впринципе, спел уже готов к работе, однако вы можете настроить его параметры в начале функции
//function Trig_Fissure_Actions. Символом * отмечены не рекомендуемые для изменения параметры.
//настройки абилы основанной на Громовой Поступи:
//УРОН: 0 (!)
//Область воздействия: 125 (при dist = 100)
//перезарядка, затрачиваемая мана: 0
//разрешенные цели: Враги, наземные
//длительность воздействия: по желанию.
function Fissure_GetId takes string s returns integer
if s == "ability" then
return 'A000' //ID способности
elseif s == "dummy" then
return 'e000' //ID дамми-юнита
elseif s == "stomp" then
return 'A001' //ID дамми-абилы основанной на Громовой Поступи
elseif s == "destruct" then
return 'B000' //ID камней
endif
return 0
endfunction
function Fissure_Filter takes nothing returns boolean
return (IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE)==false and IsUnitAliveBJ(GetFilterUnit()) and GetUnitTypeId(GetFilterUnit())!=Fissure_GetId("dummy"))
endfunction
function Fissure_DamageGroup takes group g, group g1, unit u, real dmg returns nothing
local unit t = null
loop
set t = FirstOfGroup(g)
if (IsUnitEnemy(t, GetOwningPlayer(u)) and t!= null and IsUnitInGroup(t, g1)==false) then
//call BJDebugMsg("attempt to damage: "+GetUnitName(t)+" dmg = "+R2S(dmg))
call UnitDamageTarget(u, t, dmg, false, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNKNOWN, WEAPON_TYPE_WHOKNOWS)
call GroupAddUnit(g1, t)
endif
call GroupRemoveUnit(g, t)
exitwhen t == null
endloop
endfunction
function Trig_Fissure_Actions takes nothing returns nothing
local unit u = GetSpellAbilityUnit()
local integer lvl = GetUnitAbilityLevel(u, Fissure_GetId("ability"))
//Настраиваемые переменные. Могут зависеть от уровня способности (lvl).|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
local integer num = lvl*3+3 //Число создаваемых камней.
local real dmg = 20*lvl+30 //Значение урона, наносимого всем врагам, попавшим под спел.
local real dist = 100 //Расстояние между камнями. *
local real removedelay = 5. //Время, через которое камни исчезнут.
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
loc al location ul = GetUnitLoc(u)
local location tl = GetSpellTargetLoc()
local real a = AngleBetweenPoints(ul, tl)
local integer i = 0
local real x = GetUnitX(u)+125.*Cos(bj_DEGTORAD*a)
local real y = GetUnitY(u)+125.*Sin(bj_DEGTORAD*a)
local destructable array destrs
local unit d = CreateUnit(GetOwningPlayer(u), Fissure_GetId("dummy"), x, y, 0)
local group g = CreateGroup()
local group g1 = CreateGroup()
local boolexpr bx = Filter(function Fissure_Filter)
local boolean b = false
call RemoveLocation(ul)
call RemoveLocation(tl)
call UnitApplyTimedLife(d, 'BTLF', 1.5)
loop
set b = not b
if b then
call SetUnitPosition(d, x, y)
call UnitRemoveAbility(d, Fissure_GetId("stomp"))
call UnitAddAbility(d, Fissure_GetId("stomp"))
call SetUnitAbilityLevel(d, Fissure_GetId("stomp"), lvl)
call IssueImmediateOrder(d, "stomp")
call GroupEnumUnitsInRange(g, x, y, dist*1.5, bx)
call Fissure_DamageGroup(g, g1, u, dmg)
endif
set destrs[i] = CreateDestructable(Fissure_GetId("destruct"), x, y, a, 0.7, 1)
set x = x+dist*Cos(bj_DEGTORAD*a)
set y = y+dist*Sin(bj_DEGTORAD*a)
set i = i + 1
exitwhen i > num-1
endloop
call DestroyGroup(g)
call DestroyGroup(g1)
call DestroyBoolExpr(bx)
set i = 0
call TriggerSleepAction(removedelay)
loop
call RemoveDestructable(destrs[i])
set destrs[i] = null
set i = i + 1
exitwhen i > num-1
endloop
set u = null
set ul = null
set tl = null
set d = null
set g = null
set g1 = null
set bx = null
endfunction
function Trig_Fissure_Conditions takes nothing returns boolean
return GetSpellAbilityId() == Fissure_GetId("ability")
endfunction
//===========================================================================
function InitTrig_Fissure takes nothing returns nothing
set gg_trg_Fissure = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_Fissure, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(gg_trg_Fissure, Condition(function Trig_Fissure_Conditions))
call TriggerAddAction(gg_trg_Fissure, function Trig_Fissure_Actions)
endfunction