Крип умирает первый раз - все впорядке, спавнится там, где надо. Умирает второй раз - тоже на верном месте. А третий раз уже на 0, 0. В чем проблема?
function Trig_rCrips_Actions takes nothing returns nothing
    local unit u = GetEnumUnit()
    set udg_count = udg_count + 1
    call SetUnitUserData(u, udg_count )
    set udg_Creep_X[udg_count ] = GetUnitX(u) 
    set udg_Creep_Y[udg_count ] = GetUnitY(u)
endfunction

function css_Respawn takes nothing returns nothing
    local unit u = GetDyingUnit()
    local integer cv = R2I(GetUnitUserData(u))
    local real x = udg_Creep_X[cv]
    local real y = udg_Creep_Y[cv]
    call CreateUnit(Player(11), GetUnitTypeId(u), x, y, 270.)
    call SetUnitUserData(u, cv)
    set u = null
endfunction

//===========================================================================

function InitTrig_rCrips takes nothing returns nothing
    local group g = CreateGroup()
    call GroupEnumUnitsOfPlayer(g, Player(11), null)
    call ForGroup(g, function Trig_rCrips_Actions)
    set gg_trg_rCrips = CreateTrigger()
    call TriggerRegisterTimerEvent(gg_trg_rCrips, 0.20, false)
    call TriggerAddAction(gg_trg_rCrips, function Trig_rCrips_Actions)
    call TriggerRegisterAnyUnitEventBJ(gg_trg_rCrips, EVENT_PLAYER_UNIT_DEATH)
    call TriggerAddAction(gg_trg_rCrips, function css_Respawn)
endfunction

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

Это я сделал в первую очередь, интереса ради. Разницы ноль, увы.
Разве, что запускает две функции одновременно, делая всего лишнюю операцию.
И так:
  1. Нужен массив для хранение TypeId
  2. Лучше глобальную группу использовать, а то локальная у тебя только на инициализации выполнилась.
  3. Используем loop endloop для большей эффективности
  4. Проверять лучше всё таки стеком,
Насчет дестроя группы. Она же создается один раз, если я ее уничтожу - триггер вообще выполнятся не станет, разве не так?
Это не так, она уже использовалась и стала локальной, и да. Лучше глобальную используй.
Лучше внутри таймера проверять ограниченным кол-во крипов через стек. т.е. о 0 до N ограничения, которые не повлияет на производительность. при этом проверяя на наличие их безжизненности, потом просто воссоздавая их по данным сохранённым внутри данных по юниту.
  1. Если мобы были ранее на карте, то и ранее должны были быть зарегестрированы в массив данных, где храниться их TypeId, PosX\Y и п.р.
0
29
8 лет назад
Отредактирован Волчачка
0
Попробуйте использовать:
call GroupClear( g ) // не обязятельно
call DestroyGroup( g )
//
set g = null
	//1
	call TriggerRegisterTimerEvent(gg_trg_rCrips, 0.20, false)
    call TriggerAddAction(gg_trg_rCrips, function Trig_rCrips_Actions)
	// 2
    call TriggerRegisterAnyUnitEventBJ(gg_trg_rCrips, EVENT_PLAYER_UNIT_DEATH)
    call TriggerAddAction(gg_trg_rCrips, function css_Respawn)
Лучше использовать разные триггеры для них..
А ещё поясните, что вы хотите именно с крипами делать, а то просто без отдельного стека вам не обойтись...
0
13
8 лет назад
0
Не надо на Вы, пожалуйста.
Лучше использовать разные триггеры для них..
Это я сделал в первую очередь, интереса ради. Разницы ноль, увы.
А ещё поясните, что вы хотите именно с крипами делать, а то просто без отдельного стека вам не обойтись...
Просто респаун. Всякие системы юзать не хочу, это простейший способ, вроде как. Но и тут у меня возникли проблемы. :(
0
20
8 лет назад
0
каким образом ты получаешь координаты места респа?
0
13
8 лет назад
Отредактирован NekoriDes
0
Насчет дестроя группы. Она же создается один раз, если я ее уничтожу - триггер вообще выполнятся не станет, разве не так?

ssbbssc, пикаются же все юниты 11 игрока изначально и в глобалки заносятся координаты каждого.
set udg_Creep_X[udg_count ] = GetUnitX(u)
set udg_Creep_Y[udg_count ] = GetUnitY(u) где u - пикнутый юнит.
1
29
8 лет назад
1
Это я сделал в первую очередь, интереса ради. Разницы ноль, увы.
Разве, что запускает две функции одновременно, делая всего лишнюю операцию.
И так:
  1. Нужен массив для хранение TypeId
  2. Лучше глобальную группу использовать, а то локальная у тебя только на инициализации выполнилась.
  3. Используем loop endloop для большей эффективности
  4. Проверять лучше всё таки стеком,
Насчет дестроя группы. Она же создается один раз, если я ее уничтожу - триггер вообще выполнятся не станет, разве не так?
Это не так, она уже использовалась и стала локальной, и да. Лучше глобальную используй.
Лучше внутри таймера проверять ограниченным кол-во крипов через стек. т.е. о 0 до N ограничения, которые не повлияет на производительность. при этом проверяя на наличие их безжизненности, потом просто воссоздавая их по данным сохранённым внутри данных по юниту.
  1. Если мобы были ранее на карте, то и ранее должны были быть зарегестрированы в массив данных, где храниться их TypeId, PosX\Y и п.р.
Принятый ответ
0
13
8 лет назад
0
Если мобы были ранее на карте, то и ранее должны были быть зарегестрированы в массив данных, где храниться их TypeId, PosX\Y и п.р.
Это в принципе ясно, только я не совсем понимаю, как использовать эти данные для воскрешения на той же точке.
>1, 2, 3, 4
Сейчас покумекаю, топик пока не закрываю. Спасибо тебе!
0
29
8 лет назад
0
Примерно так, но я немного изобразил по наркомански, т.к. на скорую руку.
Просмотреть
Загруженные файлы
0
20
8 лет назад
0
заведи себе индексер юнитов
0
13
8 лет назад
Отредактирован NekoriDes
0
Извините за мою тупость, но вы имеете в виду закинуть каждого юнита в массив при инициализации, а при смерти лупом перебирать эти массивы? Если я правильно понимаю значение "стека", то видимо так и есть. Но что-то я сомневаюсь.
0
32
8 лет назад
0
0
13
8 лет назад
0
quq_CCCP, не интересует, извини.
Хотя, может я и поторопился с ответом. В коде может быть решение. Спасибо, в любом случае.
1
29
8 лет назад
Отредактирован Волчачка
1
NekoriDes,
Примерно так должно быть:
scope Creeps initializer IniCreeps
    
    globals
            constant    player          CreepsPlayer    = Player(11)
                        integer         CreepsMax       = 0
                        integer array   CreepStack
                        integer         iCreep          = 0
                        integer array   crTypeId
                        real array      crX
                        real array      crY
                        boolean array   crIsDeead
                        timer           crTimer         = null        
    endglobals
    
    function CreepsDeadAction takes nothing returns nothing
        local unit      d       = GetTriggerUnit()
        local integer   data    = GetUnitUserData(d)
        set crIsDeead[iCreep] = true
        set d = null
        set data = 0
    endfunction

    function CreepsRespawn takes nothing returns nothing
        set iCreep = 0
        loop
            if crIsDeead[iCreep] then
                set crIsDeead[iCreep] = false
                call SetUnitUserData(CreateUnit( CreepsPlayer, crTypeId[iCreep], crX[iCreep], crY[iCreep], 0. ), iCreep )
            endif
            set iCreep = iCreep + 1
        exitwhen iCreep == CreepsMax
        endloop
    endfunction
    
    function IniCreeps takes nothing returns nothing
        local group g = CreateGroup()
        local unit p = null
        set gg_trg_Creeps = CreateTrigger(  )
        call TriggerAddAction( gg_trg_Creeps, function CreepsDeadAction )
        call TriggerRegisterPlayerUnitEvent( gg_trg_Creeps, CreepsPlayer, EVENT_PLAYER_UNIT_DEATH, null ) 
        set iCreep = -1
        call GroupEnumUnitsOfPlayer( g, CreepsPlayer, null )
		loop
            set p = FirstOfGroup(g)
        exitwhen p == null
            set iCreep = iCreep + 1
            set crX[iCreep] = GetWidgetX(p)
            set crY[iCreep] = GetWidgetY(p)
            set crTypeId[iCreep] = GetUnitTypeId(p)
            set crIsDeead[iCreep] = false
            call SetUnitUserData( p, iCreep )
            call GroupRemoveUnit( g, p )
        endloop
        set CreepsMax = iCreep + 1
        set iCreep = 0
        call DestroyGroup(g)
        set crTimer = CreateTimer()
        call TimerStart( crTimer, .20, true, function CreepsRespawn )
        set g = null
        set p = null
    endfunction
endscope
0
13
8 лет назад
Отредактирован NekoriDes
0
KingMaximax, а вот такого я не ждал. x)
Пользуясь случаем спрошу, почему у меня JNGP ошибок не выдает, если юзаю v/cJass, но при этом картку в варике запустить не могу? Даже если просто указал глобалки в кастом коде - выкидывает в главное меню.
Юзать длинные названия стандартных глобалок и вообще сам этот юи интерфейс не очень-то удобно, хочется облегчить процесс, но вот такие вот казусы происходят печальные.

Все, со всем разобрался. KingMaximax, спасибо большое тебе, разжевал и в рот положил.
0
28
8 лет назад
0
Пользуясь случаем спрошу, почему у меня JNGP ошибок не выдает, если юзаю v/cJass, но при этом картку в варике запустить не могу? Даже если просто указал глобалки в кастом коде - выкидывает в главное меню.
перед тем как жать проверка карты - сохрани её
Чтобы оставить комментарий, пожалуйста, войдите на сайт.