18

» WarCraft 3 / Игнор приказов игрока

Чет не понял, как игрок сможет контролить юнита в стане? Да и суть вопроса моего не в этом. Из-за чего в примере перс не дергается при отдаче ему приказа, а в коде что я скинул выше он дергается?
18

» WarCraft 3 / Игнор приказов игрока

Вот, хотел сделать на подобие ульты спектры, но когда меняешься местами с иллюзией и она продолжает двигаться к своей цели - она будет делать это очень прерывисто если периодик поставить маленький, не 0,25 как сейчас а допустим 0,03.
код
library Haunt initializer Init requires Global

    globals
        // ====================
        private constant integer SkillId                = 'A003'    // ID of skill
        private constant integer SkillRealityId         = 'A004'    // ID of Reality skill
        private constant integer DummyId                = 'h000'    // ID of dummy caster
        private constant integer DummyCastId            = 'S000'    // ID of dummy Illusion ability
        private constant integer DummyCastOrder         = 852274    // Order of dummy Illusion ability
        // ====================
        private constant integer MAXLVL = 3                         // Levels of skill
        private constant real array IllusionDuration[MAXLVL]        // Illusion duration
    endglobals
    
    // ===============================================================
    
    globals
        public key SkillKey
        // ====================
        private real    TEMP_X
        private real    TEMP_Y
        private real    TEMP_Distance
        private unit    TEMP_Illusion
        private unit    TEMP_Caster
        private trigger TEMP_Trigger
    endglobals
    
    struct Haunt_illusion
        unit Target
        unit Illusion
        private trigger Trigger
        
        private static method Function takes nothing returns boolean
            local thistype this = LoadInteger(Global_Hash, GetHandleId(GetTriggeringTrigger()), SkillKey)
            if GetTriggerEventId() == EVENT_UNIT_SUMMON then
                set .Illusion = GetSummonedUnit()
                call SetUnitPathing(.Illusion, false)
                call SetUnitMoveSpeed(.Illusion, 400)
                call SetUnitX(.Illusion, GetUnitX(.Target))
                call SetUnitY(.Illusion, GetUnitY(.Target))
                call IssueTargetOrder(.Illusion, "attack", .Target)
                call SaveInteger(Global_Hash, GetHandleId(.Illusion), SkillKey, this)
                call TriggerRegisterTimerEvent(.Trigger, 0.025, true)
                call TriggerRegisterUnitEvent(.Trigger, .Illusion, EVENT_UNIT_DEATH)
                call TriggerRegisterUnitEvent(.Trigger, .Illusion, EVENT_UNIT_ISSUED_ORDER)
                call TriggerRegisterUnitEvent(.Trigger, .Illusion, EVENT_UNIT_ISSUED_TARGET_ORDER)
                call TriggerRegisterUnitEvent(.Trigger, .Illusion, EVENT_UNIT_ISSUED_POINT_ORDER)
            elseif GetTriggerEventId() == EVENT_GAME_TIMER_EXPIRED or GetTriggerEventId() == EVENT_UNIT_ISSUED_ORDER or GetTriggerEventId() == EVENT_UNIT_ISSUED_TARGET_ORDER or GetTriggerEventId() == EVENT_UNIT_ISSUED_POINT_ORDER then
                call DisableTrigger(.Trigger)
                call IssueTargetOrder(.Illusion, "attack", .Target)
                call EnableTrigger(.Trigger)
            else
                this.destroy()
            endif
            return false
        endmethod
        
        method executeReality takes unit c returns nothing
            local real x = GetUnitX(c)
            local real y = GetUnitY(c)
            call SetUnitX(c, GetUnitX(.Illusion))
            call SetUnitY(c, GetUnitY(.Illusion))
            call SetUnitX(.Illusion, x)
            call SetUnitY(.Illusion, y)
            call IssueTargetOrder(c, "attack", .Target)
        endmethod
        
        static method create takes unit c, unit t, trigger trg returns thistype
            local thistype this = thistype.allocate()
            local unit dummy
            set .Target = t
            // ====================
            set dummy = CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE), DummyId, GetUnitX(.Target), GetUnitY(.Target), 0)
            set .Trigger = CreateTrigger()
            call SaveInteger(Global_Hash, GetHandleId(.Trigger), SkillKey, this)
            call TriggerAddCondition(.Trigger, Condition(function thistype.Function))
            call TriggerRegisterUnitEvent(.Trigger, .Target, EVENT_UNIT_DEATH)
            call TriggerRegisterUnitEvent(.Trigger, dummy, EVENT_UNIT_SUMMON)
            call TriggerRegisterUnitEvent(trg, dummy, EVENT_UNIT_SUMMON)
            call UnitAddAbility(dummy, DummyCastId)
            call SetUnitAbilityLevel(dummy, DummyCastId, GetUnitAbilityLevel(c, SkillId))
            call IssueTargetOrderById(dummy, DummyCastOrder, c)
            call UnitApplyTimedLife(dummy, 0, 1)
            set dummy = null
            return this
        endmethod
        method destroy takes nothing returns nothing
            call DisableTrigger(.Trigger)
            call FlushChildHashtable(Global_Hash, GetHandleId(.Trigger))
            call DestroyTrigger(.Trigger)
            set .Trigger = null
            // ====================
            call KillUnit(.Illusion)
            set .Target = null
            set .Illusion = null
            call this.deallocate()
        endmethod
    endstruct
    
    struct Haunt
        unit Caster
        group GroupIllusion
        private trigger Trigger
        
        private static method Function takes nothing returns boolean
            local thistype this = LoadInteger(Global_Hash, GetHandleId(GetTriggeringTrigger()), SkillKey)
            local Haunt_illusion h_i
            if GetTriggerEventId() == EVENT_UNIT_SPELL_EFFECT then
                if GetSpellAbilityId() == SkillRealityId then
                    set TEMP_X = GetSpellTargetX()
                    set TEMP_Y = GetSpellTargetY()
                    set TEMP_Distance = 99999
                    set TEMP_Illusion = null
                    call ForGroup(.GroupIllusion, function thistype.NearbyIllusionEnum)
                    if TEMP_Illusion != null then
                        set h_i = LoadInteger(Global_Hash, GetHandleId(TEMP_Illusion), SkillKey)
                        call h_i.executeReality(.Caster)
                    endif
                endif
            elseif GetTriggerEventId() == EVENT_UNIT_SUMMON then
                call SetUnitOwner(GetSummonedUnit(), GetOwningPlayer(.Caster), true)
                call GroupAddUnit(.GroupIllusion, GetSummonedUnit())
            else
                this.destroy()
            endif
            return false
        endmethod
        
        private static method NearbyIllusionEnum takes nothing returns nothing
            local real d = DistanceBetweenWidgetAndCoords(GetEnumUnit(), TEMP_X, TEMP_Y)
            if not IsUnitDead(GetEnumUnit()) and d <= TEMP_Distance then
                TEMP_Distance = d
                TEMP_Illusion = GetEnumUnit() 
            endif
        endmethod
        private static method IllusionForTargetFilter takes nothing returns boolean
            if IsUnitType(GetFilterUnit(), UNIT_TYPE_HERO) and IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(TEMP_Caster)) then
                call Haunt_illusion.create(TEMP_Caster, GetFilterUnit(), TEMP_Trigger)
            endif
            return false
        endmethod
        
        static method create takes unit c returns thistype
            local thistype this = thistype.allocate()
            set .Caster = c
            set .GroupIllusion = CreateGroup()
            // ====================
            set .Trigger = CreateTrigger()
            call SaveInteger(Global_Hash, GetHandleId(.Trigger), SkillKey, this)
            call TriggerAddCondition(.Trigger, Condition(function thistype.Function))
            call TriggerRegisterTimerEvent(.Trigger, IllusionDuration[GetUnitAbilityLevel(.Caster, SkillId)], false)
            call TriggerRegisterUnitEvent(.Trigger, .Caster, EVENT_UNIT_SPELL_EFFECT)
            set TEMP_Caster = .Caster
            set TEMP_Trigger = .Trigger
            call GroupEnumUnitsInRect(Global_TempGroup, bj_mapInitialPlayableArea, Condition(function thistype.IllusionForTargetFilter))
            return this
        endmethod
        method destroy takes nothing returns nothing
            call DisableTrigger(.Trigger)
            call FlushChildHashtable(Global_Hash, GetHandleId(.Trigger))
            call DestroyTrigger(.Trigger)
            set .Trigger = null
            // ====================
            call DestroyGroup(.GroupIllusion)
            set .Caster = null
            set .GroupIllusion = null
            call this.deallocate()
        endmethod
    endstruct
    
       
    private function SkillAction_EFFECT takes nothing returns nothing
        call Haunt.create(GetTriggerUnit())
    endfunction
    private function SkillCondition_EFFECT takes nothing returns boolean
        return GetSpellAbilityId() == SkillId
    endfunction
    
    private function SkillAction_LEARN takes nothing returns nothing
        call UnitAddAbility(GetTriggerUnit(), SkillRealityId)
        call SetUnitAbilityLevel(GetTriggerUnit(), SkillRealityId, GetLearnedSkillLevel())
        call UnitMakeAbilityPermanent(GetTriggerUnit(), true, SkillRealityId)
    endfunction
    private function SkillCondition_LEARN takes nothing returns boolean
        return GetLearnedSkill() == SkillId
    endfunction
    
    private function Init takes nothing returns nothing
        local trigger trg = CreateTrigger()
        call TriggerRegisterAnyUnitEventBJ(trg, EVENT_PLAYER_HERO_SKILL)
        call TriggerAddCondition(trg, Condition(function SkillCondition_LEARN))
        call TriggerAddAction(trg, function SkillAction_LEARN)
        set trg = CreateTrigger()
        call TriggerRegisterAnyUnitEventBJ(trg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
        call TriggerAddCondition(trg, Condition(function SkillCondition_EFFECT))
        call TriggerAddAction(trg, function SkillAction_EFFECT)
        set trg = null
        // ====================
        set IllusionDuration[1] = 4
        set IllusionDuration[2] = 5
        set IllusionDuration[3] = 6
    endfunction
    
endlibrary
18

» WarCraft 3 / Игнор приказов игрока

quq_CCCP, Окей, просто я не понимаю каким образом это мешает? Если тригерно отдавать приказ юниту под станом, он не будет его выполнять - что по идее правильно.
18

» WarCraft 3 / Игнор приказов игрока

rsfghd, хм, не замечал такого. Чисто анимка багнула или юнит стопнулся на мгновенье?
18

» WarCraft 3 / Игнор приказов игрока

quq_CCCP, В этой карте хоть обликайся на кнопку stop или hold, дерганий не вызывало. Свой код вечером смогу ток скинуть.

А что за дизейблы такие которые все ломают?
18

» WarCraft 3 / Игнор приказов игрока

rsfghd, Нет, это и есть наработка что откопал в инете. Но там вся суть только в последних 3 триггерах, вот там приказ отдается.
18

» WarCraft 3 / Архив способностей

Maxlaid, Это скорее для тех кто реально заинтересуется и скачает. Для новых героев если че буду выкладывать с доп инфой.
18

» WarCraft 3 / Пак способностей - Troll Godslayer

Extremator, Конечно. Проверка на аегис просто нужна, без нее никак (если леориком умереть с аегисом, по идее сначала прокнет предмет, а потом только ульт). В карте примере же нет аегиса, проверки на нее делать смысла нет. Точно так же с предметом по типу линкен сферы - когда скил скастовали надо проверять не в кд ли линка (щас вроде если она не в кд там баф в статусе висит), и если она в кд то запустить тригерный спел, иначе ниче не запускать - типо в линкен абилка ушла.
18

» WarCraft 3 / Пак способностей - Troll Godslayer

Daro, как и с любым перерождением (ульт леорика, аегис), событие смерти юнита срабатывать не будет, но при проверке типа юнита - тип мертвый, оно будет выдавать что юнит мертв. Хп вроде как будет 0.405 а не 0 при такой смерти. Поправьте если неправ.
18

» WarCraft 3 / Пак способностей - Troll Godslayer

Extremator, я вроде видел писали что физ урон нанесенный триггерно проходит через доспехи, поэтому просто решил с этим не парится и руну с берсерком дал герою.
18

» WarCraft 3 / Пак способностей - Troll Godslayer

Extremator, Просто хотел сделать именно через перерождение т.к. до этого с этой абилкой ни разу не работал. + Такая смерть не вызывает событие обычной смерти юнита - а значит и не пишет в чат "наш герой погиб и т.д.", ещё бонусом идёт отображение КД и то что при недостатке маны она не прокнет, ну и иконка синеет если маны не хватает.
18

» WarCraft 3 / Пак способностей - Succubus

clojurmagictime, Такая способность есть у нейтральных зданий (как пример в компании рексара была обсерватория где можно было заюзать ее спел разведки, если не ошибаюсь). Вот инфа полезная если интересно xgm.guru/p/blog-steal-nerves/ability0
18

» WarCraft 3 / Пак способностей - Faceless Mastermind

rsfghd, багуются? Если ты об одинаковых названиях, то дефайны объявлены в скоупах как приватные и конфликтов быть не должно с внешними. Или ты о другом?
18

» WarCraft 3 / Пак способностей - Faceless Mastermind

Галендор Крэйл, Спасибо за комментарий) Как-нибудь позже мб залью архивом пак героев которых я делал раньше (намного раньше, там с 15 года наверное начал), но там все способности имеют только по 1 уровню, а большая часть из героев сделана на GUI (при чем первые мои потуги очень утечные и являют собой ни что иное как говно). Но думаю кто-нибудь посмотрит наработки и возьмет оттуда пару идей.
18

» Блог им. Steal nerves / Списки способностей

4 года пользуюсь всей этой инфой, отдельная вкладка выделена под эту статью в браузере, лучший)
18

» Fantasy Pirates / Новый герой "Последователь Кваказалота"

Лично я считаю что главное для героя - синергия скилов и то как они подходят герою по его типажу. А вот эти всякие полеты дамиков по крученой на пэнисе восьмёрке с мертвой петлей и нанесением 100 урона под конец - не вызывает никакого интереса. Вообщем автор хрш, главное придумать интересный концепт, а там уже не так сильно важно, ро это или нет.
18

» WarCraft 3 / Выполнение кода и обращение к данным

Вам нечего делать, что вы пишите в 2012 году про WE ?
Сейчас этот ком так смешно читать)
18

» WarCraft 3 / Работник Мутант

Вот прям годная идея если честно, хоть и выглядит странно.
18

» WarCraft 3 / Модель дамми

8gabriel8:
Одну проблему нашёл, не было первого ключевого кадра, потому вращение казалось неравномерным.
Но вращение по origin так и не нравится.
В карте это видно отчётливо.
есть статьи где это подробно расписывается?
Не знаю, посмотри в разделе Моделлинг.
варик правильно работает с bone_head и bone_chest, остальные он в упор не видит.
bone_root работать не будет.
18

» WarCraft 3 / Модель дамми

8gabriel8:
Это просто вариант, как понадобится вращать.
OVOgenez:
ща кину другую модель дамми
Это что и зачем?
да там небольшая проблема была, ничего такого
8gabriel8, Может есть статьи где это подробно расписывается?