Триггерно создаю лучников и зомби в области "1" каждые 10 секунд, каждую секунду отдаю приказ перемещаться в область "2" атакуя все на пути.
После появления лучники постоянно перебирают цели не сдвигаясь с места (иногда перебегают маленькими шажками).
Пробовал ставить и другие интервалы, итог один.
Как вы отправляете юнитов?

Принятый ответ

avuremybe:
IssuePointOrder( unit whichUnit, string order, real x, real y )
А как же:
RemoveGuardPosition(unit whichUnit) 
Чтобы единицы назад не убегали.
Chosen2, а вообще лучше систему, могу пример на vJass:e скинуть.. Есть одна заготовка.
0
23
6 лет назад
0
бжшные функции ордеров утекают и при большом кол-ве этих ордеров одновременно - они срабатывают с задержкой либо вовсе не срабатывают.
0
16
6 лет назад
Отредактирован avuremybe
0
IssuePointOrder( unit whichUnit, string order, real x, real y )
0
29
6 лет назад
0
avuremybe:
IssuePointOrder( unit whichUnit, string order, real x, real y )
А как же:
RemoveGuardPosition(unit whichUnit) 
Чтобы единицы назад не убегали.
Chosen2, а вообще лучше систему, могу пример на vJass:e скинуть.. Есть одна заготовка.
Принятый ответ
0
10
6 лет назад
0
KingMaximax:
avuremybe:
IssuePointOrder( unit whichUnit, string order, real x, real y )
А как же:
RemoveGuardPosition(unit whichUnit) 
Чтобы единицы назад не убегали.
Chosen2, а вообще лучше систему, могу пример на vJass:e скинуть.. Есть одна заготовка.
Да, скиньте пожалуйста, как раз начал изучать джасс.
Думал начать после того как разберусь во всех триггерах, но гуи оказался слишком кривым.
0
29
6 лет назад
0
Chosen2, это просто пример, правда был другой вариант, но случайно удалил карту с ним, когда перестанавливал вар.
Base
globals
    
    //
    constant integer MAX_BOTTLES = 12
    //
    unit Duos = null
    unit newUnit = null
    player NPC = Player(3)
    player DPC = Player(0)
    boolean waveoff = true
    boolean array check
    boolean array check2[100][100]
    boolean array offps
    real array SPAWN_X
    real array SPAWN_Y
    integer RAND = 0
    hashtable H = InitHashtable()
    group G = CreateGroup()
    timer T = null
    
    integer DELICACY_EASY = 1
    integer DELICACY_NORMAL = 2
    integer DELICACY_HARD = 3
    integer DELICACY_PEDANAR = 4
    integer DELICACY_VOLKOEB = 5
    
    integer DELICACY_SELECTED = 1
    
    string EF_DUOS_Q = "Abilities\\Weapons\\BrewmasterMissile\\BrewmasterMissile.mdl"
    
    real MXX = 5301.6
    real MIX = -5527.5
    real MXY = 5066.
    real MIY = -5516.9
   
endglobals

library Functional
    
    function IsAlive takes unit u returns boolean
    
        return IsUnitType( u, UNIT_TYPE_DEAD ) == false and GetWidgetLife(u) > 0. and u != null
            
    endfunction
    
    function PS takes string soundName returns nothing
        local sound snh = CreateSound(soundName, false, false, true, 12700, 12700, "")
        call StartSound(snh)
        call KillSoundWhenDone(snh)
        set snh = null
    endfunction

    function IsNT takes unit good, unit bad returns boolean
        return IsUnitType(bad,UNIT_TYPE_STRUCTURE)==false and IsUnitEnemy(bad, GetOwningPlayer(good)) == true and IsAlive(bad) and GetUnitAbilityLevel(bad,1097625443) == 0 and GetUnitAbilityLevel(bad,1097691750) == 0
    endfunction 
    
    function FAU takes unit u, string effname returns nothing
        call DestroyEffect(AddSpecialEffectTarget( effname, u, "origin" ))
    endfunction 
    
    function FAR takes real x, real y, string effname returns nothing
        call DestroyEffect(AddSpecialEffect( effname, x, y ))
    endfunction 
    
    function X takes real x returns real
    
        if x > MXX then
            return MXX
        endif
        
        if x < MIX then
            return MIX
        endif
        
            return x
            
    endfunction

    function Y takes real y returns real
        
        if y > MXY then
            return MXY
        endif
        
        if y < MIY then
            return MIY
        endif

        return y

    endfunction
    
    function PZ takes real h, real d, real x returns real
        return ( 4 * h / d ) * ( d - x ) * ( x / d )
    endfunction

    function dc takes real x, real y, real xx, real yy returns real
        return SquareRoot( (x - xx) * (x - xx) + (y - yy) * (y - yy) )
    endfunction

    function Ang takes real x, real y, real cx, real cy returns real
        return Atan2( y - cy, x - cx )
    endfunction

    function SetTriggerCustomValue takes integer ttype, trigger t returns nothing
        call SaveInteger( H, GetHandleId(t), StringHash("TRIGG"), ttype )
    endfunction

    function GetTriggerCustomValue takes trigger t returns integer
        return LoadInteger( H, GetHandleId(t), StringHash("TRIGG") )
    endfunction

    function ClearTriggerCutomValues takes trigger t returns nothing
        call FlushChildHashtable( H, GetHandleId(t) )
    endfunction

    function SetTimerCustomValue takes integer ttype, timer t returns nothing
        call SaveInteger( H, GetHandleId(t), StringHash("TIMER"), ttype )
    endfunction

    function GetTimerCustomValue takes timer t returns integer
        return LoadInteger( H, GetHandleId(t), StringHash("TIMER") )
    endfunction

    function ClearTimerCutomValues takes timer t returns nothing
        call FlushChildHashtable( H, GetHandleId(t) )
    endfunction

    function NewTimer takes real tm, code callback returns timer
        set T = CreateTimer()
        call TimerStart( T, tm, true, callback )
        return T
        
    endfunction


    function InitResources takes nothing returns nothing

        set SPAWN_X[0] = -4035.4
        set SPAWN_Y[0] = 3906.5
        set SPAWN_X[1] = -4802.8
        set SPAWN_Y[1] = 1891.3
        set SPAWN_X[2] = -1478.
        set SPAWN_Y[2] = 2050.4
        set SPAWN_X[3] = -524.5
        set SPAWN_Y[3] = -3289.3
        set SPAWN_X[4] = 4734.6
        set SPAWN_Y[4] = -5115.2
        set SPAWN_X[5] = 4295.7 
        set SPAWN_Y[5] = 1532.1
        set SPAWN_X[6] = -382.3
        set SPAWN_Y[6] = 4611.5
        set SPAWN_X[7] = -159.5
        set SPAWN_Y[7] = -5215.
        set SPAWN_X[8] = -397.4
        set SPAWN_Y[8] = -2952.6
        set SPAWN_X[9] = -4575.9
        set SPAWN_Y[9] = -4164.5
        
    endfunction

    function NewUnit takes player wp, integer ui, real cx, real cy, real uf returns unit

        set newUnit = CreateUnit(wp,ui,cx,cy,uf)

        return newUnit
        
    endfunction

    function GetNewUnit takes nothing returns unit

        return newUnit
        
    endfunction

    function RandSpawnXY takes nothing returns nothing
    set RAND = GetRandomInt(0,9)
    endfunction

    function GetRandSpawnX takes nothing returns real

        return SPAWN_X[RAND]
        
    endfunction

    function GetRandSpawnY takes nothing returns real

        return SPAWN_Y[RAND]
        
    endfunction

    function GetRandSpawnFace takes nothing returns real

        return GetRandomReal(0.,359.)
        
    endfunction

endlibrary
WaveSet
struct Wave
    
    integer wavecount = 0
    integer waveclose = 0
    integer wunittype = 0
    group unitstack = null
    integer stack = 0
    real time = 0.
    boolean isRun = false
    timer waveTimer = null
    
    method destroy takes nothing returns nothing
                    call ClearTimerCutomValues(.waveTimer)
                    call DestroyTimer(.waveTimer)
                    call DestroyGroup(.unitstack)
                    set .unitstack = null
                    call .deallocate()
                    set waveoff = true
                    call BJDebugMsg("|cffFF9900SYSTEM MESSAGE|r: Wave End")
    endmethod
    
    method ReleaseUnit takes unit u returns nothing
    
        call GroupRemoveUnit(.unitstack,u)
    
    endmethod
    
    static method wavemove takes nothing returns nothing
    
    local unit e = GetEnumUnit()
    
    if GetUnitCurrentOrder(e) != 851983 then
        call IssuePointOrderById( e, 851983, GetWidgetX(Duos), GetWidgetY(Duos) )
        call RemoveGuardPosition(e)
    endif
    
    set e = null
    
    endmethod
    
    static method callback takes nothing returns nothing
    
    local thistype this = GetTimerCustomValue(GetExpiredTimer())
    local integer st = 0
    local real tt = 0.
    
    if .wavecount == .waveclose and FirstOfGroup(.unitstack) == null then
        call .destroy()
    else
        if FirstOfGroup(.unitstack) == null then
        
            if .wavecount < .waveclose then
            
                set .wavecount = .wavecount  + 1
                
            endif
            
            loop 
            exitwhen tt == .time 
                loop
                exitwhen st == .stack 
                    call RandSpawnXY()
                    call GroupAddUnit( .unitstack, NewUnit( NPC, .wunittype, GetRandSpawnX(), GetRandSpawnY(), GetRandSpawnFace()) )
                    call SetUnitUserData( GetNewUnit(), 30 ) // код моба волны
                    set st = st + 1
                endloop
                set tt = tt + .5
            endloop
                
            set st = 0
            set tt = 0.
            
        else
        
            call ForGroup( .unitstack, function thistype.wavemove )
            
        endif
        
    endif
   
    endmethod
    
    method wavelaunch takes nothing returns nothing

        if .isRun == false then
            
            set .isRun = true
            set .waveTimer = NewTimer( 1., function thistype.callback )
            call SetTimerCustomValue( this ,.waveTimer )
        endif
                
    
    endmethod
    
    static method create takes integer maxwave, integer typewave, integer delicacy returns thistype 
        
        local thistype this = thistype.allocate()
        
        set .wavecount = 0
        set .waveclose = maxwave
        set .wunittype = typewave
        set .unitstack = CreateGroup()
        set .stack = 25 + (5 * delicacy )
        if delicacy < 4 then
            set .time = .5 // (0.5 times = 1 wave 1 times = double wave ) 
        else
            set .time = 1.
        endif
        set .isRun = false
        set waveoff = false
        call .wavelaunch()
        
        return this

        
    endmethod
    
endstruct 

globals
    Wave Twave
endglobals

function Trig_WaveI_Actions takes nothing returns nothing
endfunction

//===========================================================================
function InitTrig_WaveSet takes nothing returns nothing
    set gg_trg_WaveSet = CreateTrigger(  )
    call TriggerAddAction( gg_trg_WaveSet, function Trig_WaveI_Actions )
endfunction
WavesDeathUnreg
function Trig_WavesDeathUnreg_Actions takes nothing returns nothing

    local unit d = GetDyingUnit()
    
    if GetUnitUserData(d) == 30 then
        call SetUnitUserData(d,0)
        call Twave.ReleaseUnit(d)
    set d = null
    
endfunction

//===========================================================================
function InitTrig_WavesDeathUnreg takes nothing returns nothing
    set gg_trg_WavesDeathUnreg = CreateTrigger(  )
    call TriggerAddAction( gg_trg_WavesDeathUnreg, function Trig_WavesDeathUnreg_Actions )
    call TriggerRegisterPlayerUnitEvent( gg_trg_WavesDeathUnreg, NPC, EVENT_PLAYER_UNIT_DEATH, null )
endfunction
0
21
6 лет назад
Отредактирован scopterectus
0
такой баг может появиться еще при большом количестве юнитов на карте. уменьшение физического размера и удаление текстуры путей решит данную проблему, но не надолго.
0
18
6 лет назад
0
Ещё можно при создании заносить юнита в группу, отдать приказ и удалить из группы. Таким образом, не будет использовано периодическое событие, а приказ будет отдан один раз, чтоб юниты не тупили с выбором цели.
0
28
6 лет назад
0
А зачем отдавать приказ каждую секунду? Отдал один раз, и они побежали. Если, конечно, они принадлежат игрокам 0 - 11.
0
23
6 лет назад
0
А разве события приказ что юнит отдал стоп или остановился то заставить вернуть прошлый приказ и вернуть разве его убрали?
0
29
6 лет назад
0
Хотя можно сделать двумя способами:
  1. это каждые 10 сек, отдавать приказы единице, при этом проверять расстояние между целью и нападающим. Если R[m] > R[t] || 500. aoe, то нападаем, иначе ничего не делаем.
  2. это приказывать опр. отрядам двигаться, нападать или стоять, в зависимости от положения дела на поле брани, если слишком много передвигаются, то часть будет просто стоять и ждать, другая нападать, третья просто передвигаться. Можно конечно так же спроверкой расстояния, только если меньше расстояние то сразу ринуться атаковать в чистую, при этом не приказывается вообще если orderid != 0 или имеет stop, attack, smart.
Чуть не забыл, ты же ещё четкий список целей для каждого отряда не делал. Можно ещё Targets запилить для каждой волны, чтобы строго шли к цели, пока та не сдохнет. Можно даже конечно по опр. кол-во мобов из отряда дать по цели например на отряд из 30 лучников .5 или 10 целей.
0
10
6 лет назад
Отредактирован Chosen2
0
PT153:
А зачем отдавать приказ каждую секунду? Отдал один раз, и они побежали. Если, конечно, они принадлежат игрокам 0 - 11.
Я просто думал все волны монстров спаунить в одной области, по этому для простоты сделал триггер каждые 10с отдавать приказ в области идти и атаковать, но оказалось далеко не лучший способ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.