28

» WarCraft 3 / Ищу движение на WASD как в Blood Omen: Legacy of Kain

На 1.26 можно только стрелочками, остальное это либо костыли со способностями на нужные клавиши, либо мемхак
28

» WarCraft 3 / Пасивные воины не раздают ауру

в самой способности найди строчку "разрешенные цели" убери все галочки и поставь "уязвимые, неуязвимые"
28

» WarCraft 3 / Как сделать систему ускорений юнитов по определённому ланду?

Clamp, ресать на дефолт после плюса/минуса скорости, когда на юните какой-нибудь бафф на мс приведёт к неточности по окончанию баффа, разве не?
28

» WarCraft 3 / Как сделать систему ускорений юнитов по определённому ланду?

Clamp, ну мне дико некомфортно писать под это всё дело бд с учётом того сколько какой бафф жрёт или плюсует процентов к мс юнита и не превысит ли лимит добавляемые мной цифры, чтобы потом их отнимать опять же ориентируясь на бд, ботинок тупо дал забрал, никаких проблем
28

» WarCraft 3 / Как сделать систему ускорений юнитов по определённому ланду?

Clamp, я то в курсе, вот и говорю, с ботинком таких проблем нет, лучше не юзать изменение скорости если ты планируешь юзать что-то из ро)
28

» WarCraft 3 / Как сделать систему ускорений юнитов по определённому ланду?

Жажду подробностей.
отнимал 100 скорости передвижения у юнита, ускорял его или замедлял, а потом возвращал 100 скорости, в итоге вышла не та, которая должна была быть

через ботинок всё норм было
28

» WarCraft 3 / Как сделать систему ускорений юнитов по определённому ланду?

TechnoViking, тю, ну если хочешь без периодика то ставь области где они должны бегать ускоренно, когда входят выдаёшь абилку, когда выходят - отбираешь
28

» WarCraft 3 / Управление поворотом по вертикали

оно работает, но немного криво, лучше через анимации делать это
тут есть даммик с анимками на 180, к нему крепишь любой эффект

Кстати, а если все кости юнита развернуть - что будет?
повернуть можно только голову и туловище

может где-то есть даммик на все 360, если нужен, но мне не удалось найти
28

» WarCraft 3 / Как сделать систему ускорений юнитов по определённому ланду?

Я уже делал подобное, тоже играл в донт старв, вариковскими функциями изменять скорость передвижения попросту нельзя, оно такое кривое шо жуть, надо выдавать абилку ботинок. Периодическим таймером выбираем всех юнитов в группу при условии что они находятся на почве и не имеют абилку ускорения, выдаём им ускорение. Другим действием выбираем всех юнитов в этой группе при условии что они находятся не на почве и удаляем абилку
28

» WarCraft 3 / Красная цена

А в редакторе объектов рылся? Там же и указывается цена улучшения
28

» WarCraft 3 / Способности и алгоритмы на заказ

Заклинание готово!

Заказчик: Roy Mustang
Способность: Come over here
Выполнено: Да

Инструкция по импорту:
Копируешь библиотеку mylib (в шапке карты) куда угодно и переименовываешь если нужно. Копируешь первые 3 триггера - каст абилки, регистрация получения юнитом урона и реагирование на получение урона (2 последних для своих действий, если ты не планируешь ничего добавлять (спецэффекты к примеру), то можешь удалить эти триггеры). По коду, в самом верху mylib, нужно вписать равкоды ауры и её заклинания, выбрать свободную ячейку хэш-таблицы для юнита и указать периодичность таймера истечения ауры, так же указать равкод неиспользуемого предмета. Если у тебя уже есть хэш-таблица с названием H, можешь стереть строку с инициализацией хэш-таблицы. Если нужна будет дополнительная помощь или что-то не работает/работает не так, как хотел - пиши
Текущие настройки:
  1. Периодичность
  2. Скорость эффекта от точки каста
  3. Скорость эффекта к точке каста (притяжение)
  4. Задержка появления притягивания
  5. Дистанция прохождения эффекта от кастера
  6. Радиус
  7. Урон
  8. Дистанция начала эффекта от кастера
  9. Сила расталкивания
  10. Точка начала притягивания от кастера
  11. Дистанция прохождения эффекта к кастеру
  12. Время замедления
  13. Тип атаки
  14. Тип урона
  15. Кол-во притягиваемых юнитов
  16. Значение переменной TF для своих действий
  17. Эффекты (дамми)
  18. Кого притягивать
  19. Кого расталкивать
  20. Отдавать ли приказ "стоп"
Код:
library mylib initializer init
    globals
        private constant hashtable H = InitHashtable()
        private constant group TempG = CreateGroup()
        private constant group TempG1 = CreateGroup()
        private constant integer ItemID = 'spsh' // любой нигде не использующийся предмет (для проверки проходимости точки)
        private constant integer UnitH = 0 // свободная ячейка юнита для ауры
        private constant integer AbilityID = 'A001'// равкод ауры
        private constant integer AbilityID1 = 'BOae'// равкод заклинания ауры
        private constant real TimerPeriodic = 1.00 // периодичность таймера для ауры
        private boolean TempB
        private integer TempI
        private attacktype At
        private damagetype Dt
        private group TempG2
        private group TempG3
        private item TempIt
        private unit CUEX
        private real TempR
        private real TempR1
        private real MaxX
        private real MinX
        private real MaxY
        private real MinY
    endglobals

    private function DBC takes real x, real y, real x1, real y1 returns real
       return SquareRoot((x-x1)*(x-x1)+(y-y1)*(y-y1)) 
    endfunction 
    
    private function SetUnitPositionEx1 takes unit u, real x, real y returns nothing
        if x < MinX then
            set x = MinX
        elseif x > MaxX then
            set x = MaxX
        endif
        if y < MinY then
            set y = MinY
        elseif y > MaxY then
            set y = MaxY
        endif
        
        call SetUnitX(u,x)
        call SetUnitY(u,y)
    endfunction
    
    private function SetUnitPositionEx takes unit u, real x, real y returns nothing
        call SetItemPosition(TempIt,x,y)
        call SetItemVisible(TempIt,false)
        if DBC(x,y,GetItemX(TempIt),GetItemY(TempIt)) > 10 then
            set x = GetItemX(TempIt)
            set y = GetItemY(TempIt)
        endif
        call SetUnitX(u,x)
        call SetUnitY(u,y)
    endfunction

    private function CreateUnitEx takes player id, integer unitid, real x, real y, real face returns unit
        set CUEX = CreateUnit(id,unitid,x,y,face*bj_RADTODEG)
        call UnitAddAbility(CUEX,'Arav')
        call SetUnitPathing(CUEX,false)
        call SetUnitPositionEx1(CUEX,x,y)
        return CUEX
    endfunction
    
    function CopyGroup takes group g returns group
        set bj_groupAddGroupDest = CreateGroup()
        call ForGroup(g, function GroupAddGroupEnum)
        return bj_groupAddGroupDest
    endfunction
    
    private function GetDirection takes unit u, unit targ returns boolean
        local real alpha = GetUnitFacing(u)
        local real gamma = bj_RADTODEG * Atan2(GetUnitY(targ)-GetUnitY(u), GetUnitX(targ)-GetUnitX(u))
        if gamma < 0 then
            set gamma = 360. + gamma
        endif
        if (alpha < 180. and not(gamma > alpha and gamma < alpha + 180.)) or (alpha > 180. and gamma > alpha - 180. and gamma < alpha) then
            return false
        else
            return true
        endif
    endfunction
    
    private struct First
        unit dummy
        real a
        real x
        real y
        real speed
        real dist
    endstruct
    
    private struct ComeOverHereInfo
        unit caster
        unit dummy
        real a
        real x
        real y
        real dist
        real periodic
        boolean on
        boolean b2
        boolexpr b
        boolexpr b1
        group g
        
        real radius
        real damage
        integer AttackType
        integer DamageType
        
        integer count
        integer count1 = 0
        
        integer tf
        integer tf1
        integer tf2
        integer tf3
        
        real speed
        real speed1
        
        real time
    endstruct
    
    private function FirstMove takes nothing returns nothing
        local timer t = GetExpiredTimer()
        local First A = LoadInteger(H,GetHandleId(t),0)
        
        set A.dist = A.dist-A.speed
        set A.x = A.x+A.speed*Cos(A.a)
        set A.y = A.y+A.speed*Sin(A.a)
        call SetUnitPositionEx1(A.dummy,A.x,A.y)
        
        if A.dist <= 0 then
            call FlushChildHashtable(H,GetHandleId(t))
            call PauseTimer(t)
            call DestroyTimer(t)
            call KillUnit(A.dummy)
            set A.dummy = null
            call A.destroy()
        endif
        
        set t = null
    endfunction
    
    private function mycond takes nothing returns boolean
        return not IsUnitInGroup(GetFilterUnit(),TempG2)
    endfunction

    private function MoveSide takes nothing returns nothing
        local unit u = GetEnumUnit()
        local real x = GetUnitX(u)
        local real y = GetUnitY(u)
        local real a
        if GetDirection(CUEX,u) then
            set a = TempR+(90*bj_DEGTORAD)
        else
            set a = TempR-(90*bj_DEGTORAD)
        endif
        call SetUnitPositionEx(u,x+TempR1*Cos(a),y+TempR1*Sin(a))
        if TempB then
            call IssueImmediateOrder(u,"stop")
        endif
        call UnitDamageTarget(bj_lastCreatedUnit,u,0,false,false,null,null,null)
        set u = null
    endfunction
    
    private function Move takes nothing returns nothing
        local unit u = GetEnumUnit()
        call SetUnitPositionEx(u,GetUnitX(u)+TempR1*Cos(TempR),GetUnitY(u)+TempR1*Sin(TempR))
        if TempB then
            call IssueImmediateOrder(u,"stop")
        endif
        call UnitDamageTarget(bj_lastCreatedUnit,u,0,false,false,null,null,null)
        set u = null
    endfunction
    
    private function RemoveAura takes nothing returns nothing
        local timer t = GetExpiredTimer()
        local unit u = LoadUnitHandle(H,GetHandleId(t),0)
        local integer i = GetHandleId(u)
        local real a = LoadReal(H,i,UnitH)-TimerPeriodic
        
        if a <= 0 then
            call FlushChildHashtable(H,GetHandleId(t))
            call RemoveSavedReal(H,i,UnitH)
            call PauseTimer(t)
            call DestroyTimer(t)
            call UnitRemoveAbility(u,AbilityID)
            call UnitRemoveAbility(u,AbilityID1)
        else
            call SaveReal(H,i,UnitH,a)
        endif
        
        set u = null
        set t = null
    endfunction
    
    private function End takes nothing returns nothing
        local unit u = GetEnumUnit()
        local integer i = GetHandleId(u)
        local timer t
        call UnitDamageTarget(bj_lastCreatedUnit,u,TempR,false,false,At,Dt,null)
        if LoadReal(H,i,UnitH) <= 0 then
            set t = CreateTimer()
            call UnitAddAbility(u,AbilityID)
            call SaveUnitHandle(H,GetHandleId(t),0,u)
            call TimerStart(t,TimerPeriodic,true,function RemoveAura)
            set t = null
        endif
        call SaveReal(H,i,UnitH,TempR1)
        set u = null
    endfunction
    
    private function sp takes nothing returns nothing
        if IsUnitInGroup(GetEnumUnit(),TempG2) or IsUnitInGroup(GetEnumUnit(),TempG1) then
            call GroupRemoveUnit(TempG,GetEnumUnit())
        endif
    endfunction
    
    private function ComeOverHereMove takes nothing returns nothing
        local timer t = GetExpiredTimer()
        local unit u
        local unit u1 = null
        local ComeOverHereInfo A = LoadInteger(H,GetHandleId(t),0)
        
        set A.dist = A.dist-A.speed
        set A.x = A.x+A.speed*Cos(A.a)
        set A.y = A.y+A.speed*Sin(A.a)
        call SetUnitPositionEx1(A.dummy,A.x,A.y)
        
        if A.on then
            set A.on = false
            call ShowUnit(A.dummy,true)
            call UnitRemoveAbility(A.dummy,'Aloc')
            call UnitAddAbility(A.dummy,'Aloc')
            call TimerStart(t,A.periodic,true,function ComeOverHereMove)
        endif
        
        set TempB = A.b2
        set bj_lastCreatedUnit = A.caster
        call GroupEnumUnitsInRange(TempG1,A.x,A.y,A.radius,A.b1)
        if A.count > 0 then
            set TempG2 = A.g
            call GroupEnumUnitsInRange(TempG,A.x,A.y,A.radius,A.b)
            call ForGroup(TempG,function sp)
            loop
                exitwhen FirstOfGroup(TempG) == null or A.count < 1
                set TempG3 = CopyGroup(TempG)
                set TempR = 0.
                loop
                    set u = FirstOfGroup(TempG3)
                    if u == null then
                        if u1 != null then
                            call GroupRemoveUnit(TempG,u1)
                            call GroupAddUnit(A.g,u1)
                            set A.count = A.count-1
                            set u1 = null
                        endif
                        exitwhen true
                    endif
                    if IsUnitInGroup(u,TempG) and GetWidgetLife(u) > TempR then
                        set TempR = GetWidgetLife(u)
                        set u1 = u
                    endif
                    call GroupRemoveUnit(TempG3,u)
                endloop
                call DestroyGroup(TempG3)
            endloop
            set u = null
            set u1 = null
            call GroupClear(TempG)
        endif
        set CUEX = A.dummy
        set TempR = A.a
        set TempR1 = A.speed1
        set udg_TF = A.tf2
        call ForGroup(TempG1,function MoveSide)
        call GroupClear(TempG1)
        set TempR1 = A.speed
        set udg_TF = A.tf1
        call ForGroup(A.g,function Move)
        
        if A.dist <= 0 then
            call FlushChildHashtable(H,GetHandleId(t))
            call PauseTimer(t)
            call DestroyTimer(t)
            call KillUnit(A.dummy)
            set udg_TF = A.tf
            set TempR = A.damage
            set TempR1 = A.time
            set At = ConvertAttackType(A.AttackType)
            set Dt = ConvertDamageType(A.DamageType)
            call ForGroup(A.g,function End)
            call GroupClear(A.g)
            call DestroyGroup(A.g)
            set A.dummy = null
            set A.caster = null
            set A.g = null
            set A.b = null
            set A.b1 = null
            call A.destroy()
        endif
        set udg_TF = A.tf3
        set t = null
    endfunction
    
    function ComeOverHere takes nothing returns nothing
        local timer t = CreateTimer()
        local ComeOverHereInfo A = ComeOverHereInfo.create()
        local First A1 = First.create()
        local real x = GetSpellTargetX()
        local real y = GetSpellTargetY()
        
        set A.caster = GetTriggerUnit()
        set A.periodic = udg_Real[0]
        set A.x = GetUnitX(A.caster)
        set A.y = GetUnitY(A.caster)
        set A.a = Atan2(A.y-y,A.x-x)
        set A.g = CreateGroup()
        set A.radius = udg_Real[5]
        set A.damage = udg_Real[6]
        set A.AttackType = GetHandleId(udg_AttackType)
        set A.DamageType = GetHandleId(udg_DamageType)
        set A.speed = udg_Real[2]
        set A.speed1 = udg_Real[8]
        set A.dist = udg_Real[10]
        set A.on = true
        set A.b = udg_Bool[0]
        set A.b1 = udg_Bool[1]
        set A.b2 = udg_Boolean
        set A.count = udg_Int[0]
        set A.tf = udg_Int[1]
        set A.tf1 = udg_Int[2]
        set A.tf2 = udg_Int[3]
        set A.tf3 = udg_Int[4]
        set A.time = udg_Real[11]
        
        call SaveInteger(H,GetHandleId(t),0,A)
        call TimerStart(t,udg_Real[3],false,function ComeOverHereMove)
        
        set t = CreateTimer()
        set A1.a = Atan2(y-A.y,x-A.x)
        set A1.x = A.x+udg_Real[7]*Cos(A1.a)
        set A1.y = A.y+udg_Real[7]*Sin(A1.a)
        set A1.dummy = CreateUnitEx(GetOwningPlayer(A.caster),udg_DummyID[1],A1.x,A1.y,A1.a)
        set A1.speed = udg_Real[1]
        set A1.dist = udg_Real[4]
        call SaveInteger(H,GetHandleId(t),0,A1)
        call TimerStart(t,udg_Real[0],true,function FirstMove)
        
        set A.x = A.x+udg_Real[9]*Cos(A1.a)
        set A.y = A.y+udg_Real[9]*Sin(A1.a)
        set A.dummy = CreateUnitEx(GetOwningPlayer(A.caster),udg_DummyID[0],A.x,A.y,A.a)
        call ShowUnit(A.dummy,false)
        
        set t = null
    endfunction
    
    private function init takes nothing returns nothing
        set TempIt = CreateItem(ItemID,0,0)
        call SetItemVisible(TempIt,false)
        set MaxX = GetRectMaxX(GetWorldBounds())
        set MinX = GetRectMinX(GetWorldBounds())
        set MaxY = GetRectMaxY(GetWorldBounds())
        set MinY = GetRectMinY(GetWorldBounds())
    endfunction
endlibrary




















library HC initializer init
    globals
    private leaderboard HB
    endglobals
    private function HCU takes nothing returns nothing
        local integer i = 0
        local integer id
        local location array P
        local real result = 0
        loop
            exitwhen i >= 50
            set i = i+1
            set P[i] = Location(0,0)
            set id = GetHandleId(P[i])
            set result = result+(id-0x100000)
        endloop
        set result = result/i-i/2
        loop
            call RemoveLocation(P[i])
            set P[i] = null
            exitwhen i <= 1
            set i = i-1
        endloop
        call LeaderboardSetItemValue(HB,0,R2I(result))
    endfunction

    private function HCA takes nothing returns nothing
        set HB = CreateLeaderboard()
        call LeaderboardSetLabel(HB,"Handle Counter")
        call PlayerSetLeaderboard(GetLocalPlayer(),HB)
        call LeaderboardDisplay(HB,true)
        call LeaderboardAddItem(HB,"Handles",0,Player(0))
        call LeaderboardSetSizeByItemCount(HB,1)
        call HCU()
        call TimerStart(GetExpiredTimer(),.05,true,function HCU)
    endfunction

    private function init takes nothing returns nothing
        call TimerStart(CreateTimer(),0,false,function HCA)
    endfunction
endlibrary
Если по пути попадётся юнит у которого больше хп, оно не начнёт его притягивать, если достигнуто макс кол-во, а так же оно не заменит самого раненого юнита из притягиваемых на нового

Загруженные файлы
28

» WarCraft 3 / Вассалы и условие победы

  1. при вхождении юнита на карту принадлежащего такому-то игроку, установить массив целочисленной с индексом, равному индексу игрока, на +1
Если юнит умирает, то -1, если переменная равна 0 - объявить поражение
Про налог нужно больше информации, в варе есть такая функция если что

Закидываем массив булевых переменных и если обе стороны согласны, установить переменные на да, если обе переменные равны истинне, то включить вассала, если прописывают разрыв договора, то установить переменные на нет и убрать вассала

вот пример поражения

насчёт вассалов пример не смогу сделать, ибо пока нет возможности проверить работоспособность идеи)
28

» WarCraft 3 / Иконка знака вопроса?

h0rde, так с интернета скачай любой понравившийся знак вопроса, подгони под 64х64 формат блп и если нужны рамки, то сделай через Button Manager v1.8.2
28

» WarCraft 3 / Как сделать плавное затемнение экрана в WorldEditor

Я любимый, я ж сказал, поройся в спецэффектах)
Там, самое нижнее "ввод изображения", то бишь проявление

Загруженные файлы
28

» WarCraft 3 / Как сделать улучшение для конкретного юнита?

Ну для этого нужно сделать нового юнита, тип которого будет использоваться в единичном экземпляре у игрока. Возможно морф поможет

у самого юнита нужно конечно указать, какие улучшения он хавает
28

» WarCraft 3 / Не работает способность

На пустой карте пробовал то же самое сделать?

Может радиус применения дёрнул или обзор
28

» WarCraft 3 / Создание нелагающей карты.

Из-за большого кол-ва юнитов на карте/в пределах экрана оно как ни крути будет лагать, тут от компа скорее зависит. Декорации лагать могут в основном из-за движущиеся анимации

Основные причины лагов это утечки
28

» WarCraft 3 / Способности и алгоритмы на заказ

Заказ принят

Заказчик: Roy Mustang
Способность: Come over here
Примерный срок выполнения: завтра 28.06
28

» WarCraft 3 / Способности и алгоритмы на заказ

Roy Mustang, нужно немного больше информации. Ешка морды по линии притягивает, а тебе нужно именно в радиусе от точки? Если в точке больше трёх целей, то кому отдавать приоритет? Раненным, самым ближним, самым дальним, у кого больше хп? Урон и замедление наносятся в начале притягивания или по его завершению? По поводу способности я хз что ИИ может там юзать)
28

» WarCraft 3 / Как триггерно прервать изучение технологии?

TechnoViking, так ты сам юзаешь миллион глобалок в карте P1, TOR, TS, NS2 и т.д.
В варе есть глобальные и локальные переменные, глобальные везде юзаются, а локальные в пределах одной функции, где и были объявлены. Глобальная статична, а локальная каждый раз новая при объявлении
28

» WarCraft 3 / Как триггерно прервать изучение технологии?

Ничего не пон что ты написал)))
Разницу в скрине от предыдущего не вижу. Я ж сказал, передаешь юнита триггера в глобалку, запускаешь таймер с 0 сек, в другом триггере, где этот таймер истекает, отдаешь приказ юниту в глобалке отмена
Глобалка - глобальная переменная, основы понимания гуи сленга)

Так в том-то и дело, что у чела было по 4-6 этажей, и триггеры тупо переставали работать от такой многофакторной аутентификации, поэтому ну его к лешему, чем Бог не шутит.
Прерваться выполнение может только если превысили оп лимит. Вот такое расположение ифов, когда после выполнения одного условия продолжают обсчитываться другие, оно и может перестать работать. Хотя если твой друг поставил потом ифы по порядку, а не друг в друге, и оно заработало, то тут только тёмная магия)

Что ты там придумал про ужимку и тройное копирование я непон)