Что это такое?
- Cистема что дает пользователю возможность применять мгновенные(не channeled) способности на всех юнитов либо в указанной области с некоторым АоЕ, либо на юнитов в некотором АоЕ вокруг кастера.
Для работы требует JNGP
code
library SingleTargetToAoE initializer Init
/*
ШО ЭТО ТАКОЕ?
-Это форма для создания АoE-версий применяющихся на цель скиллов.
А КАК СДЕЛАТЬ ШОБ РАБОТАЛО НЕ НА ВСЕХ ЮНИТОВ?
-Настрой допустимые цели для дамми-абилки в редакторе способностей.
*/
globals
private constant integer DUMMY_UNIT_TYPE = 'u000' //Равкод дамми-юнита.
private constant integer DUMMY_ABILITY_TYPE = 'A000' //Равкод дамми-абилки.
private constant integer SPELL_ABILITY_TYPE = 'A001' //Равкод абилки героя.
private constant string DUMMY_ABILITY_ORDER = "entanglingroots" //Приказ дамми-абилки.
private constant boolean TARGET_ON_SELF = false //Должна ли эта способность применяться на область вокруг кастера.
private constant boolean THROUGH_FOG_OF_WAR = true //Должна ли способность действовать на юнитов в тумане войны.
private constant real INITIAL_AOE = 350 //Область воздействия на первом уровне. Должно совпадать с таковым в редакторе способностей.
private constant real AOE_LEVEL_BONUS = 50 //Бонусная АоЕ за уровень способности. Смиритесь. "Система" создана для нубов и тех кто боится кода.
private constant real CASTPOINT_Z = 200 //Высота с которой кастуются способности со снарядами (хотя и остальные тоже, просто этого не видно)
//Дальше на свой страх и риск. Если карта не запускается, сохраняем перед тестом (звездочка в конце пути к карте в шапке редактора должна исчезнуть).
private trigger MASS_ENTANGLING_ROOTS
private group enumGroup = CreateGroup()
private unit enumUnit
endglobals
private function SetUnitZ takes unit u, real z returns nothing
call UnitAddAbility(u,'Arav')
call UnitRemoveAbility(u,'Arav')
call SetUnitFlyHeight(u,z,0)
endfunction
private function SpellEffect takes nothing returns nothing
local real x
local real y
if GetSpellAbilityId() == SPELL_ABILITY_TYPE then
if TARGET_ON_SELF == true then
set x = GetUnitX(GetTriggerUnit())
set y = GetUnitY(GetTriggerUnit())
else
set x = GetSpellTargetX()
set y = GetSpellTargetY()
endif
call GroupEnumUnitsInRange(enumGroup,x,y,INITIAL_AOE+AOE_LEVEL_BONUS*(GetUnitAbilityLevel(GetTriggerUnit(),SPELL_ABILITY_TYPE)-1),null)
if FirstOfGroup(enumGroup) != null then
set bj_lastCreatedUnit = CreateUnit(GetOwningPlayer(GetTriggerUnit()),DUMMY_UNIT_TYPE,x,y,0)
call SetUnitZ(bj_lastCreatedUnit,CASTPOINT_Z)
call UnitAddAbility(bj_lastCreatedUnit,DUMMY_ABILITY_TYPE)
call SetUnitAbilityLevel(bj_lastCreatedUnit,DUMMY_ABILITY_TYPE,GetUnitAbilityLevel(GetTriggerUnit(),SPELL_ABILITY_TYPE))
endif
if THROUGH_FOG_OF_WAR == true then
loop
set enumUnit = FirstOfGroup(enumGroup)
exitwhen enumUnit == null
call UnitShareVision(enumUnit,GetOwningPlayer(bj_lastCreatedUnit),true)
call IssueTargetOrder(bj_lastCreatedUnit,DUMMY_ABILITY_ORDER,enumUnit)
call GroupRemoveUnit(enumGroup,enumUnit)
call UnitShareVision(enumUnit,GetOwningPlayer(bj_lastCreatedUnit),false)
endloop
else
loop
set enumUnit = FirstOfGroup(enumGroup)
exitwhen enumUnit == null
call IssueTargetOrder(bj_lastCreatedUnit,DUMMY_ABILITY_ORDER,enumUnit)
call GroupRemoveUnit(enumGroup,enumUnit)
endloop
endif
endif
endfunction
private function Init takes nothing returns nothing
set MASS_ENTANGLING_ROOTS = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(MASS_ENTANGLING_ROOTS,EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddAction(MASS_ENTANGLING_ROOTS,function SpellEffect)
endfunction
endlibrary
Ред. Raised
ибо в моем представлении энам юнитов реализован через проверку параметров юнитов, ссылки на которых последовательно перечислены в памяти.
Ред. uranus
uranus, работает и на невидимых (о чем я не подумал). Посмотрю что можно с этим сделать.
все новое - хорошо забытое старое
Ред. Raised
Ред. prog