18

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

Да было много разных замыслов, и какой-нить воин на волке, и друид на олене, и лучница на тигре и т.п. и т.д. Проблема была только в модельках - нужно 3 штуки: сам герой, животное, и их совместная моделька. С дк было полегче - просто на хайве были их разделенные модельки из стандартной вариковской.
18

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

RvzerBro, shit happens) Озвучка в РО стоит стандартная где он на коне, а так да, немного странновато кончено когда конь ржёт на фоне.
18

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

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

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

rsfghd, Да я б с радостью добавил эффект посочнее и со звуком, просто не нашел подходящее по цвету.
18

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

rsfghd, Для Q искал модельку похожую на аркан взрыв, ничего более подходящего не нашел, модельку на скрине я видел, но думаю оно больше подходит под спел природы. Е вроде ж заюзал, там на видео мана при юзании повышалась и на юните был доп эффект на 6 сек. По поводу W - какой тайм код?

Посмотрел, ну такое хорошо зайдет если игрок управляет только 1 юнитом/героем. Спел ж по идее направлен на 1 юнита, странно будет если игрок захочет другим юнитом поуправлять, или отрядом юнитов, а у него камеру вертит из стороны в сторону. Но смотрится прикольно)
18

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

Slonick, хм, тогда наверное лучше уже не через расход хп, а ману. Да и в пример, у того же кентавра 1 скил расходует не ману а хп, при этом зависимостей от лоухп он никаких не имеет.
18

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

Slonick, пытался все уместить в небольшой текст чтоб не было простыни здоровой, мб из-за этого не совсем понятно, но на видео в принципе все показано. По поводу синергии не понял, по сути это усиление героя взамен траты его здоровья.
18

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

В той карте в качестве реакции используется команда Двигаться, не вижу такого
Да, оказалось что дерагинье именно с приказом attack было( с move более менее норм все.
18

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

Добавил к 1 способности небольшое уточнение
Удалил IsUnitDead, заменил на нативную UnitAlive
Поменял порядок методов в структурах (спасибо Vlod)
18

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

И чё?
А то что я банально не знал об этой нативке.

А по поводу IsUnitDead - мб причина в версии редактора, я его скачал году в 13, с тех пор не обновлял, мб в твоем редакторе уже есть эта функция. А то получается что ты редачишь код (удаляешь IsUnitDead) и скидываешь видео что что-то не работает.
18

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

Это же common.ai а не common.j
Всё равно спс, буду знать про эту нативку.
18

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

nazarpunk, Если код посмотреть там будет видно, что полетка и должна сбиваться приказом, спецом сделано чтоб можно было обратно не лететь.
cJass у меня тоже отключен, но даже так не думаю что он будет ругаться на дубликат если такового нет.

nazarpunk, по поводу UnitAlive - такой нативки мой редактор не видит, у тебя точно 1.26?

Щас чекнул, такая нативка есть, просто она не объялена в common.j
Не вижу проблемы тогда между UnitAlive и ее кастомным аналогом.

По поводу Haunt - я опять же не экстрасенс и по видосам не гадаю, было бы неплохо узнать как ты довел до такого результата где Reality не сработало.
18

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

nazarpunk, ну я вижу, ты юзанул полетку, а чё не так? Если обнаружил баг, распиши в чем баг и какие действия к нему привели, я ж не экстрасенс.

Так же у тебя на скрине ругается на дубликат IsUnitDead, такой ошибки у меня не возникает, мб ты добавляешь какие-то свои библиотеки где идёт повторение названий функций.
18

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

nazarpunk, какая версия Вара? Могу так же залить видос где у меня Haunt нормально работает. Что с перемещением юнита не так?
18

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

PROSHELDOTU, дак она и не должна работать в определенных условиях, там же в описании так и написано.

Во всяком случае спасибо за комментарий, интересно разные мнения узнать.
18

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

без скринов бот на 3 буквы пошлет

PROSHELDOTU, я где-то видел челы кидали именно гифками, не через сторонние сервисы видосы.
18

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

Vlod, разве в JNGP оно автоматом при сохранении карты не прочекивает че выше/ниже находится?

Добавить лучше гифки, чтобы наглядно продемонстрировать
Хз как тут гифки делать и вставлять)
18

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

Vlod, удалил наверн эти строчки когда тестил, но там то же самое происходит.

Опять туплю, сбил ты меня, делал я проверку - вот строки:
                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)
18

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

Vlod, вот, код тот же что и выше кидал. Пробни нажать Haunt и потом Reality. Когда иллюзии попытаешься отдать приказ она дергаться будет.

Только тут таймер стоит 0,25. Если ставить 0,025 там юнит вообще тупо стоит.
Загруженные файлы
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