XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
Daemonik

offline
Опыт: 5,084
Активность:
Не работает триггер
Похоже что ошибка в условии, но найти не могу(
Код:
function Trig_Debug_Actions takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local location loc = GetUnitLoc(u)
    local unit u1
    if (GetUnitState(u, UNIT_STATE_LIFE) <= 0) then
        // start
        call BJDebugMsg("TRIGSTR_001" )
        // end
        call CreateUnitAtLoc(Player(10), GetUnitTypeId(u), loc, 270)
        call RemoveLocation(loc)
    endif
    set u = null
    set loc = null
endfunction

//===========================================================================
function InitTrig_Debug takes nothing returns nothing
    set gg_trg_Debug = CreateTrigger(  )
    call TriggerRegisterPlayerUnitEvent( gg_trg_Debug, Player(10), EVENT_PLAYER_UNIT_ATTACKED, null )
    call TriggerAddAction( gg_trg_Debug, function Trig_Debug_Actions )
endfunction


Daemonik добавил:
Мне надо что бы юнит после смерти появлялся на том месте где он и стоял
Старый 06.07.2009, 13:21
alexkill

offline
Опыт: 18,872
Активность:
Код:
function Trig_Debug_Actions takes nothing returns nothing
    call CreateUnit( GetTriggerPlayer(), GetUnitTypeId(GetTriggerUnit()), GetUnitX(GetTriggerUnit()), GetUnitY(GetTriggerUnit()), 0 )
endfunction

function InitTrig_Debug takes nothing returns nothing
    set gg_trg_Debug = CreateTrigger(  )
    call TriggerRegisterPlayerUnitEvent( gg_trg_Debug, Player(10), EVENT_PLAYER_UNIT_DEATH, null )
    call TriggerAddAction( gg_trg_Debug, function Trig_Debug_Actions )
endfunction
Старый 06.07.2009, 13:29
Daemonik

offline
Опыт: 5,084
Активность:
Я конечно рад. Но он должен появляться после смерти, а не просто так.
Сорри не заметил.

Daemonik добавил:
Но таким образом он мне его восстановит на месте смерти, а надо там где он был изначально.
Старый 06.07.2009, 13:33
alexkill

offline
Опыт: 18,872
Активность:
судил по твоему коду...
тогда тебе нужно при инициализации карты каким-то способом (используя массивы и т.п.) аттачить к юниту его изначальное местоположение (X и Y), если, конечно, не хочешь использовать кучу регионов для каждого юнита
Старый 06.07.2009, 13:42
Daemonik

offline
Опыт: 5,084
Активность:
Ну что ж буду пытаться заносить юнитов в массив.

Daemonik добавил:
Хотя хотелось бы иметь универсальный триггер.
Старый 06.07.2009, 14:02
ELDAR
НИИ 4А-ВО кафедра SPELLS
offline
Опыт: 8,394
Активность:
вот тебе алгоритм
берешь при ините, создаешь глобалку типа интегер(счетчик), юнит(крип) и 2 реала(X , Y), пикаешь всех юнитов на карте и в фильтре( ну или в ForGroup)
Код:
set count = count + 1
set Unit[count] = GetFilterUnit()
set X[count] = GetUnitX(GetFilterUnit())
set Y[count] = GetUnitY(GetFilterUnit())

а при смерти ищи юнита в массиве и создавай в полученной координате

ELDAR добавил:
а чо это count подсвечен красным Oo
Старый 06.07.2009, 14:13
Daemonik

offline
Опыт: 5,084
Активность:
Код:
function Trig_InitUnits_Func001A takes nothing returns nothing
    if ((GetOwningPlayer(GetEnumUnit()) == Player(10)) or (GetOwningPlayer(GetEnumUnit()) == Player(11))) then
    set udg_count = udg_count + 1
    set udg_u[udg_count] = GetEnumUnit()
    set udg_X[udg_count] = GetUnitX(GetEnumUnit())
    set udg_Y[udg_count] = GetUnitY(GetEnumUnit())
    endif
endfunction

function Trig_InitUnits_Actions takes nothing returns nothing
    call ForGroupBJ( GetUnitsInRectAll(GetPlayableMapRect()), function Trig_InitUnits_Func001A )
endfunction

//===========================================================================
function InitTrig_InitUnits takes nothing returns nothing
    set gg_trg_InitUnits = CreateTrigger(  )
    call TriggerAddAction( gg_trg_InitUnits, function Trig_InitUnits_Actions )
endfunction

Что-то в этом роде должно быть?
Старый 06.07.2009, 14:23
ELDAR
НИИ 4А-ВО кафедра SPELLS
offline
Опыт: 8,394
Активность:
Daemonik не идеально, ибо BJ , но сойдет
Старый 06.07.2009, 14:38
Daemonik

offline
Опыт: 5,084
Активность:
Ну с этим я сейчас возиться не хочу.
Так а дальше как мне искать юнита в массиве

Так?
Код:
function Trig_Repic_3_Conditions takes nothing returns boolean
    return (GetTriggerUnit() == udg_u[udg_count])
endfunction

function Trig_Repic_3_Actions takes nothing returns nothing
    local unit u
    local real x
    local real y
    set u = udg_u[udg_count]
    set x = udg_x[udg_count]
    set y = udg_y[udg_count]
    call CreateUnit(Player(10), GetUnitTypeId(u), x, y, 270)
    set x = 0
    set y = 0
    set u = null
endfunction

//===========================================================================
function InitTrig_Repic_3 takes nothing returns nothing
    local trigger t = CreateTrigger()
    call TriggerRegisterPlayerUnitEvent(t, Player(10), EVENT_PLAYER_UNIT_DEATH, null)
    //call TriggerRegisterAnyUnitEventBJ( gg_trg_Repic_3, EVENT_PLAYER_UNIT_ATTACKED )
    call TriggerAddAction( t, function Trig_Repic_3_Actions )
    set t = null
endfunction

Проверил это. Не работает.

Отредактировано Daemonik, 06.07.2009 в 14:53.
Старый 06.07.2009, 14:39
ELDAR
НИИ 4А-ВО кафедра SPELLS
offline
Опыт: 8,394
Активность:
Код:
function Trig_Repic_3_Actions takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local integer i = 1
    local boolean b = false
    loop
        exitwnen b or i > udg_count
        if u = udg_u[i] then
            call CreateUnit(Player(10), GetUnitTypeId(udg_u[i]), udg_x[i],udg_y[i], 270)
            set b = true
        endif
        set i = i + 1
    endloop
    set u = null
endfunction

//===========================================================================
function InitTrig_Repic_3 takes nothing returns nothing
    local trigger t = CreateTrigger()
    call TriggerRegisterPlayerUnitEvent(t, Player(10), EVENT_PLAYER_UNIT_DEATH, null)
    //call TriggerRegisterAnyUnitEventBJ( gg_trg_Repic_3, EVENT_PLAYER_UNIT_ATTACKED )
    call TriggerAddAction( t, function Trig_Repic_3_Actions )
    set t = null
endfunction
Старый 06.07.2009, 15:05
J
expert
offline
Опыт: 48,447
Активность:
ELDAR не учи людей бреду
Старый 06.07.2009, 15:25
Daemonik

offline
Опыт: 5,084
Активность:
thx
Можешь тогда подсказать как заменить TriggerSleepAction на таймер?
А почему бред? Работает ведь. J Объясни

Отредактировано Daemonik, 06.07.2009 в 15:51.
Старый 06.07.2009, 15:44
J
expert
offline
Опыт: 48,447
Активность:
Daemonik, запарожци тоже работают
Старый 06.07.2009, 16:18
Daemonik

offline
Опыт: 5,084
Активность:
J ну почему бред ясно.
Но тогда получается есть способ лучше и проще? Так ведь? Скажи плиз.
Старый 06.07.2009, 16:29
J
expert
offline
Опыт: 48,447
Активность:
лучше - да, проще... м... относительно, реализация сложнее, но использовать тебе будет проще, ладно... ща напишу


требуется JNPG
чтобы использовать нужно скопировать указный ниже код в нестандартный код карты и... все... должно работать...
у юнита сохраняется позиция и поворот

чтобы отключить добавление юнитов на перерождение при инициализации карты нужно переменой InitReset поставить значение false
переменная Period отвечает за то через сколько секунд после смерти возродится юнит

можно добавять или удалять юнитов в систему когда захочешь, для этого есть функции
ResetUnit_UnitAdd(unit) // Добавить
ResetUnit_UnitRemove(unit) // Удалить
Функции безопасные, 2 раза одного и того же юнита не добавишь, второй раз одного и того же юнита не удалишь, и никаких циклов нубов как у ELDAR

вот код:
Код:
library ResetUnit initializer Init

globals
    ///
    private constant boolean InitReset = true
    private constant real Period = 1.0
    ///
    private resun array Allun
    private integer Countun = 0
    private group GG = CreateGroup()
endglobals
  
struct resun
    private integer idx
         
    unit u
    private integer t
    private player p
    
    private real sX
    private real sY
    private real sA
                                             
    method Create takes nothing returns nothing
        set .u = CreateUnit(.p, .t, .sX, .sY, .sA)
        call SetUnitUserData(.u, this)
    endmethod       
                                     
    method Delete takes nothing returns nothing
        set Countun = Countun - 1
        set Allun[.idx] = Allun[Countun]     
        set Allun[.idx].idx = .idx
        call .destroy()
    endmethod
        
    static method New takes unit u returns nothing
        local resun this = resun.create()
        set .u = u
        set .t = GetUnitTypeId(u)
        set .p = GetOwningPlayer(u)                               
        set .sX = GetUnitX(u)
        set .sY = GetUnitY(u)
        set .sA = GetUnitFacing(u)
        set Allun[Countun] = this     
        set Allun[Countun].idx = Countun
        set Countun = Countun + 1
        call SetUnitUserData(u, this) 
    endmethod
        
endstruct

public function UnitAdd takes unit u returns nothing
    local resun un = GetUnitUserData(u) 
    if (un.u != u) then
        call resun.New(u)
    endif
endfunction

public function UnitRemove takes unit u returns nothing
    local resun un = GetUnitUserData(u) 
    if (un.u == u) then
        call un.Delete()
    endif
endfunction
     
private function ResetUnit_ForAllUnit takes nothing returns boolean
    local player pf = GetOwningPlayer(GetFilterUnit())
    if (pf == Player(10) or pf == Player(11)) then
        call UnitAdd(GetFilterUnit())
    endif
    return false
endfunction
             
private function ResetUnit_Action_Timer takes nothing returns nothing
    local resun un = R2I(TimerGetRemaining(GetExpiredTimer())+0.5)
    call un.Create()
    call DestroyTimer(GetExpiredTimer())
endfunction

private function ResetUnit_Action takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local timer t
    local resun un = GetUnitUserData(u) 
    if (un.u == u) then
        set t = CreateTimer()
        call TimerStart(t, un, false, null)
        call PauseTimer(t)
        call TimerStart(t, Period, false, function ResetUnit_Action_Timer)
        set t = null
    endif
    set u = null
endfunction
    
private function Init takes nothing returns nothing
    local trigger trig = CreateTrigger()
    if (InitReset) then
        call GroupEnumUnitsInRect(GG, bj_mapInitialPlayableArea, Filter(function ResetUnit_ForAllUnit))
    endif
    call TriggerRegisterPlayerUnitEvent(trig, Player(10), EVENT_PLAYER_UNIT_DEATH, null)
    call TriggerRegisterPlayerUnitEvent(trig, Player(11), EVENT_PLAYER_UNIT_DEATH, null)
    call TriggerAddAction(trig, function ResetUnit_Action)
    set trig = null
endfunction
 
endlibrary

Отредактировано J, 06.07.2009 в 17:05.
Старый 06.07.2009, 16:41
Daemonik

offline
Опыт: 5,084
Активность:
Не слабо...
А где можно поподробней про методы, библиотеки и прочие фичи почитать?
Старый 06.07.2009, 16:56
J
expert
offline
Опыт: 48,447
Активность:
http://xgm.guru/forum/showthread.php?t=13118
в первом посту мануал прикреплен

J добавил:
я чуть подправил код, замени
Старый 06.07.2009, 17:04
ELDAR
НИИ 4А-ВО кафедра SPELLS
offline
Опыт: 8,394
Активность:
Цитата:
Функции безопасные, 2 раза одного и того же юнита не добавишь, второй раз одного и того же юнита не удалишь, и никаких циклов нубов как у ELDAR

ну вобщем я предложил код более простой для понимания новичку, а то что ты написал он будет ковырять еще неделю
+ а вдруг ему нужна дата
Старый 06.07.2009, 19:04
Daemonik

offline
Опыт: 5,084
Активность:
А можно UnitRemove инициировать не после смерти а после периода?
Иначе награду не дают.

Daemonik добавил:
Хотя возможно проблема в другом.
Старый 07.07.2009, 11:26
J
expert
offline
Опыт: 48,447
Активность:
UnitRemove не убивает юнита, а просто удаляет его из системы, чтобы он больше не воскресал, у меня в коде она нираз не используется, я так а всякий случай сделал, т.е. проблема в другом
Старый 07.07.2009, 12:13
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 15:35.