28

» WarCraft 3 / Как сделать способность, без обязательной цели

Мне как-то сомнительно просить помощь у кого-то за бесплатно, никогда такое обычно не делал
на сайте есть специальная тема для заклинаний на заказ, где любой желающий человек со свободным временем может за бесплатно сделать тебе способность с указанными тобой нуждами
LAMLAN:
Но, если сделаешь, я конечно буду благодарен
ну тогда потом с тебя лайк, чуть позже сделаю, сегодня скину
28

» WarCraft 3 / Триггеры

Mikel 1990, как раз таки в разовых случаях это практически не имеет смысла, основная проблема могла бы возникнуть только в периодических событиях, банально движение даммика по точке с полярным смещением 0.01 таймером

Да и обнулить точку можно только кастомскриптом
call RemoveLocation( udg_НазваниеПеременной )
28

» WarCraft 3 / Как сделать способность, без обязательной цели

Может есть у тебя какое-то видение на этот счет?
Ты похоже решил проигнорить мой вопрос:
LAMLAN, что из того гайда на Ютубе было не понятно? Как сделать муи?
Либо банально не знаешь что такое муи, раз уж решил описать эту проблему в таких подробностях
Поясняю муи - мультикаст абилок, когда её могут применить одновременно несколько юнитов
Описание комментатора выше завязано на джассе к сожалению, ибо упоминается привязка таймера. Исходя из видео, которые ты смотришь на данный момент, тебе нужен именно гуи вариант. Я сделаю чуть позже, если необходимо
28

» WarCraft 3 / Триггеры

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

» WarCraft 3 / Триггеры

Mikel 1990, ох.. ну. На первом скрине у тебя утекает отдача приказов, но т.к. у тебя в целом разовое событие, то смысла париться за это нет
28

» WarCraft 3 / Триггеры

Любой способ имеет право на существование если он не утекает и не багует, ты хочешь поддержки и одобрения своих действий или у тебя действительно что-то работает не так, как ты хотел?
28

» WarCraft 3 / Рикошет как в варлоках

вторая попытка
код
library MyLib
globals
    constant hashtable H = InitHashtable( )
    constant group TempGroup = CreateGroup( )
    constant location LFZ = Location( 0.00, 0.00 )
    item TempItem = null
endglobals

native UnitAlive takes unit id returns boolean

function GetLocZ takes real x, real y returns real
    call MoveLocation( LFZ, x, y )
    return GetLocationZ( LFZ )
endfunction

struct vector
    real x
    real y
    real z
    
    method normalize takes nothing returns nothing
        local real l = SquareRoot( x * x + y * y + z * z )
        
        if l == 0.00 then
            set l = 1.00
        endif
        
        set x = x * ( 1.00 / l )
        set y = y * ( 1.00 / l )
        set z = z * ( 1.00 / l )
    endmethod
    
    static method create takes real x, real y, real z returns thistype
        local thistype this = thistype.allocate( )
        
        set this.x = x
        set this.y = y
        set this.z = z
        
        call this.normalize( )
        
        return this
    endmethod
endstruct

struct MyStruct
    unit dummy
    real x
    real y
    real z
    real time
    group g
    vector v
endstruct

private function Move takes nothing returns nothing
    local MyStruct A = LoadInteger( H, GetHandleId( GetExpiredTimer( ) ), 0 )
    local real x
    local real y
    local real x1
    local real y1
    local real a
    local boolean array b
    local unit u
    
    set A.x = A.x + 5.00 * A.v.x
    set A.y = A.y + 5.00 * A.v.y
    set A.z = A.z + 5.00 * A.v.z
    
    call SetItemPosition( TempItem, A.x, A.y )
    call SetItemVisible( TempItem, false )
    
    set x = GetItemX( TempItem )
    set y = GetItemY( TempItem )
    
    if ( x - 1.00 > A.x or x + 1.00 < A.x ) or ( y - 1.00 > A.y or y + 1.00 < A.y ) then
        set A.x = A.x - 5.00 * A.v.x
        set A.y = A.y - 5.00 * A.v.y
        set A.z = A.z - 5.00 * A.v.z
        
        // right
        set x = A.x + 5.00
        set y = A.y
        call SetItemPosition( TempItem, x, y )
        call SetItemVisible( TempItem, false )
        
        set x1 = GetItemX( TempItem )
        set y1 = GetItemY( TempItem )
        
        set b[0] = ( x1 - 1.00 > x or x1 + 1.00 < x ) or ( y1 - 1.00 > y or y1 + 1.00 < y )
        
        // left
        set x = A.x - 5.00
        set y = A.y
        call SetItemPosition( TempItem, x, y )
        call SetItemVisible( TempItem, false )
        
        set x1 = GetItemX( TempItem )
        set y1 = GetItemY( TempItem )
        set b[1] = ( x1 - 1.00 > x or x1 + 1.00 < x ) or ( y1 - 1.00 > y or y1 + 1.00 < y )
        
        // up
        set x = A.x
        set y = A.y + 5.00
        call SetItemPosition( TempItem, x, y )
        call SetItemVisible( TempItem, false )
        
        set x1 = GetItemX( TempItem )
        set y1 = GetItemY( TempItem )
        set b[2] = ( x1 - 1.00 > x or x1 + 1.00 < x ) or ( y1 - 1.00 > y or y1 + 1.00 < y )
        
        // down
        set x = A.x
        set y = A.y - 5.00
        call SetItemPosition( TempItem, x, y )
        call SetItemVisible( TempItem, false )
        
        set x1 = GetItemX( TempItem )
        set y1 = GetItemY( TempItem )
        set b[3] = ( x1 - 1.00 > x or x1 + 1.00 < x ) or ( y1 - 1.00 > y or y1 + 1.00 < y )
        
        if b[0] or b[1] or b[2] or b[3] then
            if b[0] or b[1] then
                set A.v.x = -A.v.x
            else
                set A.v.y = -A.v.y
            endif
        else
            set A.v.x = -A.v.x
            set A.v.y = -A.v.y
        endif
    else // units
        call GroupEnumUnitsInRange( TempGroup, A.x, A.y, 64.00, null )
        call GroupRemoveUnit( TempGroup, A.dummy )
        
        loop
            set u = FirstOfGroup( TempGroup )
            exitwhen u == null
            call GroupRemoveUnit( TempGroup, u )
            
            if not IsUnitInGroup( u, A.g ) and UnitAlive( u ) and GetUnitTypeId( u ) == 'hfoo' then
                set x1 = GetUnitX( u )
                set y1 = GetUnitY( u )
                set a = Atan2( A.y - y1, A.x - x1 )
                
                set bj_lastCreatedUnit = CreateUnit( Player( 0x00 ), 'u000', x1 + 24.00 * Cos( a ), y1 + 24.00 * Sin( a ), a * bj_RADTODEG )
                call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', 2.00 )
                call SetUnitX( bj_lastCreatedUnit, x1 + 32.00 * Cos( a ) )
                call SetUnitY( bj_lastCreatedUnit, y1 + 32.00 * Sin( a ) )
                call SetUnitTimeScale( bj_lastCreatedUnit, 2.00 )
                
                set a = a + ( a - ( Atan2( A.v.y, A.v.x ) - 180.00 * bj_DEGTORAD ) )
                
                //set x = A.v.x
                set A.v.x = Cos( a )//A.v.x * Cos( a ) - A.v.y * Sin( a )
                set A.v.y = Sin( a )//A.v.y * Cos( a ) + x * Sin( a )
                call GroupClear( A.g )
                call GroupAddUnit( A.g, u )
                
                set A.time = 0.25
            endif
        endloop
    endif
    
    set A.time = A.time - 0.01
    
    if A.time == 0.00 then
        call GroupClear( A.g )
    endif
    
    call SetUnitX( A.dummy, A.x )
    call SetUnitY( A.dummy, A.y )
    call SetUnitFlyHeight( A.dummy, A.z - GetLocZ( A.x, A.y ), 0.00 )
endfunction

function Nin_Actions takes nothing returns nothing
    local timer t = CreateTimer( )
    local MyStruct A = MyStruct.create( )
    local unit u = GetTriggerUnit( )
    local real x = GetSpellTargetX( )
    local real y = GetSpellTargetY( )
    local real z = GetLocZ( x, y )
    
    set A.x = GetUnitX( u )
    set A.y = GetUnitY( u )
    set A.z = GetLocZ( A.x, A.y )
    
    set A.v = vector.create( x - A.x, y - A.y, /*z - A.z*/0.00 )
    set A.dummy = CreateUnit( GetOwningPlayer( u ), 'hfoo', A.x, A.y, Atan2( y - A.y, x - A.x ) * bj_RADTODEG )
    call UnitAddAbility( A.dummy, 'Arav' )
    
    set A.g = CreateGroup( )
    
    call SaveInteger( H, GetHandleId( t ), 0, A )
    call TimerStart( t, 0.01, true, function Move )
    
    set u = null
    set t = null
endfunction
endlibrary

//===========================================================================
function InitTrig_Nin takes nothing returns nothing
    set gg_trg_Nin = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Nin, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddAction( gg_trg_Nin, function Nin_Actions )
    
    set TempItem = CreateItem( 'spsh', 0.00, 0.00 )
    call SetItemVisible( TempItem, false )
endfunction

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

» WarCraft 3 / Конвертация модели

Можешь спросить у Атар'а, если никто не ответит. Он отлично разбирается в конверте
28

» WarCraft 3 / Как сделать способность, без обязательной цели

К сожалению в варкрафте нет одиночной способности для этого, самое близкое это стадо ящеров рексара, только они при столкновении исчезают
Придётся делать триггерный аналог, где ты должен двигать даммика периодическим таймером в сторону каста, проверяя всех вражеских живых юнитов вокруг, на которых можно будет применить в последствии даммикастом таргетную абилку "бросить нож"
Вообще, ты мог не искать, а попросить сделать способность в специальной для этого теме: Заклинания на заказ

я же правильно понимаю что "бросить нож" это таргетная способность у мэв с периодическим уроном?
28

» WarCraft 3 / Рикошет как в варлоках

Возможно, с течением времени, будет появляться информация о моих попытках, где я застрял
ну вот лично моя попытка
просто проверяю 4 стороны предметом на наличие квадратных карт путей, потом проверяю юнитов
пример ENAleksey не удалось разобрать, судя по всему там нормальный рикошет даже от всяких холмов, со всеми 3 координатами
код
library MyLib
globals
    constant hashtable H = InitHashtable( )
    constant group TempGroup = CreateGroup( )
    constant location LFZ = Location( 0.00, 0.00 )
    item TempItem = null
endglobals

native UnitAlive takes unit id returns boolean

function GetLocZ takes real x, real y returns real
    call MoveLocation( LFZ, x, y )
    return GetLocationZ( LFZ )
endfunction

struct vector
    real x
    real y
    real z
    
    method normalize takes nothing returns nothing
        local real l = SquareRoot( x * x + y * y + z * z )
        
        if l == 0.00 then
            set l = 1.00
        endif
        
        set x = x * ( 1.00 / l )
        set y = y * ( 1.00 / l )
        set z = z * ( 1.00 / l )
    endmethod
    
    static method create takes real x, real y, real z returns thistype
        local thistype this = thistype.allocate( )
        
        set this.x = x
        set this.y = y
        set this.z = z
        
        call this.normalize( )
        
        return this
    endmethod
endstruct

struct MyStruct
    unit dummy
    real x
    real y
    real z
    real time
    group g
    vector v
endstruct

private function Move takes nothing returns nothing
    local MyStruct A = LoadInteger( H, GetHandleId( GetExpiredTimer( ) ), 0 )
    local real x
    local real y
    local real x1
    local real y1
    local real a
    local boolean array b
    local unit u
    
    set A.x = A.x + 5.00 * A.v.x
    set A.y = A.y + 5.00 * A.v.y
    set A.z = A.z + 5.00 * A.v.z
    
    call SetItemPosition( TempItem, A.x, A.y )
    call SetItemVisible( TempItem, false )
    
    set x = GetItemX( TempItem )
    set y = GetItemY( TempItem )
    
    if ( x - 1.00 > A.x or x + 1.00 < A.x ) or ( y - 1.00 > A.y or y + 1.00 < A.y ) then
        set A.x = A.x - 5.00 * A.v.x
        set A.y = A.y - 5.00 * A.v.y
        set A.z = A.z - 5.00 * A.v.z
        
        // right
        set x = A.x + 5.00
        set y = A.y
        call SetItemPosition( TempItem, x, y )
        call SetItemVisible( TempItem, false )
        
        set x1 = GetItemX( TempItem )
        set y1 = GetItemY( TempItem )
        
        set b[0] = ( x1 - 1.00 > x or x1 + 1.00 < x ) or ( y1 - 1.00 > y or y1 + 1.00 < y )
        
        // left
        set x = A.x - 5.00
        set y = A.y
        call SetItemPosition( TempItem, x, y )
        call SetItemVisible( TempItem, false )
        
        set x1 = GetItemX( TempItem )
        set y1 = GetItemY( TempItem )
        set b[1] = ( x1 - 1.00 > x or x1 + 1.00 < x ) or ( y1 - 1.00 > y or y1 + 1.00 < y )
        
        // up
        set x = A.x
        set y = A.y + 5.00
        call SetItemPosition( TempItem, x, y )
        call SetItemVisible( TempItem, false )
        
        set x1 = GetItemX( TempItem )
        set y1 = GetItemY( TempItem )
        set b[2] = ( x1 - 1.00 > x or x1 + 1.00 < x ) or ( y1 - 1.00 > y or y1 + 1.00 < y )
        
        // down
        set x = A.x
        set y = A.y - 5.00
        call SetItemPosition( TempItem, x, y )
        call SetItemVisible( TempItem, false )
        
        set x1 = GetItemX( TempItem )
        set y1 = GetItemY( TempItem )
        set b[3] = ( x1 - 1.00 > x or x1 + 1.00 < x ) or ( y1 - 1.00 > y or y1 + 1.00 < y )
        
        if b[0] or b[1] or b[2] or b[3] then
            if b[0] or b[1] then
                set A.v.x = -A.v.x
            else
                set A.v.y = -A.v.y
            endif
        else
            set A.v.x = -A.v.x
            set A.v.y = -A.v.y
        endif
    else // units
        call GroupEnumUnitsInRange( TempGroup, A.x, A.y, 64.00, null )
        call GroupRemoveUnit( TempGroup, A.dummy )
        
        loop
            set u = FirstOfGroup( TempGroup )
            exitwhen u == null
            call GroupRemoveUnit( TempGroup, u )
            
            if not IsUnitInGroup( u, A.g ) and UnitAlive( u ) and GetUnitTypeId( u ) == 'hfoo' then
                set x1 = GetUnitX( u )
                set y1 = GetUnitY( u )
                set a = Atan2( y1 - A.y, x1 - A.x ) + bj_PI - Atan2( A.v.y, A.v.x )
                
                set x = A.v.x
                set A.v.x = x * Cos( a ) - A.v.y * Sin( a )
                set A.v.y = A.v.y * Cos( a ) + x * Sin( a )
                call GroupClear( A.g )
                call GroupAddUnit( A.g, u )
                
                set A.time = 0.25
            endif
        endloop
    endif
    
    set A.time = A.time - 0.01
    
    if A.time == 0.00 then
        call GroupClear( A.g )
    endif
    
    call SetUnitX( A.dummy, A.x )
    call SetUnitY( A.dummy, A.y )
    call SetUnitFlyHeight( A.dummy, A.z - GetLocZ( A.x, A.y ), 0.00 )
endfunction

function Nin_Actions takes nothing returns nothing
    local timer t = CreateTimer( )
    local MyStruct A = MyStruct.create( )
    local unit u = GetTriggerUnit( )
    local real x = GetSpellTargetX( )
    local real y = GetSpellTargetY( )
    local real z = GetLocZ( x, y )
    
    set A.x = GetUnitX( u )
    set A.y = GetUnitY( u )
    set A.z = GetLocZ( A.x, A.y )
    
    set A.v = vector.create( x - A.x, y - A.y, /*z - A.z*/0.00 )
    set A.dummy = CreateUnit( GetOwningPlayer( u ), 'hfoo', A.x, A.y, Atan2( y - A.y, x - A.x ) * bj_RADTODEG )
    call UnitAddAbility( A.dummy, 'Arav' )
    
    set A.g = CreateGroup( )
    
    call SaveInteger( H, GetHandleId( t ), 0, A )
    call TimerStart( t, 0.01, true, function Move )
    
    set u = null
    set t = null
endfunction
endlibrary

//===========================================================================
function InitTrig_Nin takes nothing returns nothing
    set gg_trg_Nin = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Nin, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddAction( gg_trg_Nin, function Nin_Actions )
    
    set TempItem = CreateItem( 'spsh', 0.00, 0.00 )
    call SetItemVisible( TempItem, false )
endfunction

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

» Blog Narberal Gamma / Дискорд канал и профиль ушел в один конец

Берги, один фиг теперь кто напишет действительный возраст если младше этого глупого правила, заставляют лишний раз соблюдать анонимность
28

» WarCraft 3 / Массовый импорт

Ну это частично поможет
можно сразу выбрать все импортируемые файлы и не стирать war3mapImported

открывать карту естественно не нужно, всё в проге делается, но лишь импорт
28

» WarCraft 3 / Order to attack почему не работает?

redfal, можешь тогда выбрать правильный ответ и закрыть вопрос, в знак благодарности можно лайкнуть кого-то
28

» WarCraft 3 / Order to attack почему не работает?

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

» WarCraft 3 / Order to attack почему не работает?

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

» WarCraft 3 / Naruto Bleach War v0.3a (Dota Mod)

поиграли с человеком, мне захотелось минато выбрать
в общем закончить до разрушения всех строений мы не смогли, самое основное что не понравилось и сразу же отпугивает это рецепты, плохо сделано, фиг его знает где какой предмет искать, и то, обшастав все магазины некоторые предметы найти не удалось, соответственно рецепт в никуда, словно ты переименовал предмет, а на описание в рецептах забил
очень много активных предметов, может это из меня такой казуальный игрок, но предметы юзать крайне не удобно ибо они через нумпад либо мышкой
ульта минато разочаровала, просто +40 ловкости, в остальном кое-какие мультипликации делать можно, а-ля кунай за спину, телепорт, расенган и кинуть жабу
либо расенган, жаба кунай и телепорт, чтобы быстрее сократить дистанцию с противником после отбрасывания, да и в целом потенциал минато давления на карту очень высокий, когда есть возможность телепортироваться по линиям и к базе
спеллы мне кажется всё-таки стоит более красочными и интересными сделать, а файты возможно слегка удлинить, путём среза базового урона у способностей, потому что мана заканчивается так же быстро как и здоровье у противника, буквально 1 прокаст и остаётся либо на базу, либо автоатачить, не особо весело
попрактикуйся в спеллпаках, посмотри референсы от других людей
можешь продолжать делать, но пока уныленько, думаю у тебя на данный момент есть все нужные знания чтобы улучшить и переделать карту