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

Хотя блин, суто интуитивно все же правильно. Могу добавить раскрытие позиций захваченных юнитов.
8
Raised, я всегда создавал дамми с небольшим обзором.
29
Cистема что дает пользователю возможность применять мгновенные(не channeled) способности на всех юнитов либо в указанной области с некоторым АоЕ, либо на юнитов в некотором АоЕ вокруг кастера.
То есть, это тот же xeCast, но спустя 10 лет?
Добавь фич с супер настройками и фильтрами, чтоб было полноценной системой.
все новое - хорошо забытое старое
21
Msey, нет, не оно. И даже не попытка создать альтернативу. Это просто мелкая наработка для гуишников или тех кого по какой-то приниче не стремает код.
"Система" создана для нубов и тех кто боится кода.
Иначе было бы долго объяснять что и как импортировать. Мне лень.

uranus, не лучшая идея.
12
Что значит для гуишников? Гуи это то, где создаются тригером с определенными упрощениями. Но ведь этот триггерными в коде, значит всё равно придется его писатт, а значит конвертировать. Или я что-то не понимаю?
21
Стас Орлов, ты все понимаешь. "Для гуишников" - для тех кто привык пользоваться графическими триггерами и только недавно начал осваивать скриптовый язык. В примере не используются ни хеш-таблицы, ни структуры, ни кастомные системы хранения данных. Только самые простые построения.
Чтоб создать несколько скиллов на основе этой системы необходимо всего лишь скопипастить этот код в любой триггер, переименовать библиотеку и прописать равкоды в блоке globals. Можно обойтись и без копипастинга, но для этого пришлось бы объяснить ряд моментов, что уже бы потянуло на маленькую статью.
24
Эх... XGM уже не торт... помню как мою чуть более сложную и универсальную систему похожего назначения засрали в момент публикации со словами "да любой себе такую запилит" и "кому и зачем это вобще надо", а потом еще и к коду придираться начали...
21
Думаю разбор чего-нибудь простенького позволит гуишникам быстрее во всем этом разобраться.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.