Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
vJass
Тип:
Наработка
Версия Warcraft:
1.26+

Что это такое?

  • 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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
21
6 лет назад
Отредактирован Raised
0
Спеллы выпускаются из одной точки, а некоторые имеют снаряд. Решил добавить возможность задать высоту этой точки.
0
21
6 лет назад
0
Сделайте функцию, которая берёт определённые аргументы и применяет нужную способность по области. А здесь у Вас получилась способность, а не система.
0
21
6 лет назад
0
Это для гуишников. Дня них такого понятия как "функция" не существует. Иначе сделал бы.
0
21
6 лет назад
0
Raised, в GUI же есть Custom Script. Туда можно легко вписать одну функцию, а вот целую библиотеку уже не вписать.
0
21
6 лет назад
0
Гуишники не умеют их вызывать.
0
20
6 лет назад
0
Я могу ошибаться, но имхо из одной и той же группы будет выбираться один и тот же юнит
ибо в моем представлении энам юнитов реализован через проверку параметров юнитов, ссылки на которых последовательно перечислены в памяти.
0
8
6 лет назад
Отредактирован uranus
0
Как работает эта система, если юнит невидим игроком и/или в инвизе?
0
21
6 лет назад
0
Diaboliko, ты определенно ошибаешься.
uranus, работает и на невидимых (о чем я не подумал). Посмотрю что можно с этим сделать.
0
8
6 лет назад
0
Raised, хм, странно, я думал, что дамми не сможет в инвиз кастовать, если цель вражеская. На крайняк можно через GetLocalPlayer неиспользуемому игроку, типа дополнительно нейтрального, дать обзор всей карты, и проверять, видит ли он цель. Если не видит - инвиз.
0
21
6 лет назад
0
uranus, были такие мысли, но у этого есть и обратная сторона.
В невидимых кастует из-за этого:
    call UnitShareVision(enumUnit,GetOwningPlayer(bj_lastCreatedUnit),true)
    call IssueTargetOrder(bj_lastCreatedUnit,DUMMY_ABILITY_ORDER,enumUnit)
    call UnitShareVision(enumUnit,GetOwningPlayer(bj_lastCreatedUnit),false)

Хотя блин, суто интуитивно все же правильно. Могу добавить раскрытие позиций захваченных юнитов.
0
8
6 лет назад
0
Raised, я всегда создавал дамми с небольшим обзором.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.