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

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

Ответ
 
Daemonik

offline
Опыт: 5,084
Активность:
Возрождение мобов
Вопрос у меня в первую очередь к J, тк он дал мне код возрождения.
Код:
library ResetUnit initializer Init

globals
    ///
    private constant boolean InitReset = true
    private constant real Period = 60.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 .u = null
        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())
    local unit u = 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 сказал что для того что бы отключить возрождение некоторых мобов(боссы) надо в триггере написать
ResetUnit_UnitRemove(Имя юнита)
И сюда
Код:
method Delete takes nothing returns nothing
        set Countun = Countun - 1
        set Allun[.idx] = Allun[Countun]     
        set Allun[.idx].idx = .idx
        call .destroy()
    endmethod

добавить строчку set .u = null в начало функции. Все так и сделал но все равно указанные юниты возрождались.
При внимательном изучении заметил

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
Не надо ли написать resun.Delete() вместо un.Delete() ?
Старый 18.07.2009, 20:01
J
expert
offline
Опыт: 48,447
Активность:
писал бы в прошлой теме...
Цитата:
Не надо ли написать resun.Delete() вместо un.Delete() ?
нет, не надо

щас времени нет, потом через пару часиков посмотрю почему не работает

J добавил:
а пока попробуй быстренько так сделать и сказать будет работать или нет, у меня сейчас редактора под рукой нет, потому только угадывать могу
Код:
method Delete takes nothing returns nothing
    call SetUnitUserData(.u, 0) 
    set .u = null
    set Countun = Countun - 1
    set Allun[.idx] = Allun[Countun]     
    set Allun[.idx].idx = .idx
    call .destroy()
endmethod
Старый 18.07.2009, 20:54
Daemonik

offline
Опыт: 5,084
Активность:
Ок попробую. А в прошлой не получилось. Закрыли.
Старый 18.07.2009, 21:04
Daemonik

offline
Опыт: 5,084
Активность:
Попробовал( Не работает.. Может я чего не так сделал.
Твой код
Код:
library ResetUnit initializer Init

globals
    ///
    private constant boolean InitReset = true
    private constant real Period = 60.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
        call SetUnitUserData(.u, 0) 
        set .u = null
        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

Запрет на возрождение
Код:
function Trig_Mob_Zverei_Actions takes nothing returns nothing
    call TriggerSleepAction( 3.50 )
    call ResetUnit_UnitRemove( gg_unit_n01H_0320 )
endfunction

//===========================================================================
function InitTrig_Mob_Zverei takes nothing returns nothing
    set gg_trg_Mob_Zverei = CreateTrigger(  )
    call TriggerRegisterUnitEvent( gg_trg_Mob_Zverei, gg_unit_n01H_0320, EVENT_UNIT_DEATH )
    call TriggerAddAction( gg_trg_Mob_Zverei, function Trig_Mob_Zverei_Actions )
endfunction

Надеюсь сможешь помочь.
Старый 19.07.2009, 19:32
ELDAR
НИИ 4А-ВО кафедра SPELLS
offline
Опыт: 8,394
Активность:
Код:
method Delete takes nothing returns nothing
        call SetUnitUserData(.u, 0) 
        set .u = null
        set Countun = Countun - 1
        set Allun[.idx] = Allun[Countun]     
        set Allun[.idx].idx = .idx
        call .destroy()
    endmethod

суда вставь дебаг месанж , и проверь вызывается ли метод, если нет то надо попробывать переписать под группу
Старый 20.07.2009, 07:43
J
expert
offline
Опыт: 48,447
Активность:
попробуй еще сделать так
Код:
method Delete takes nothing returns nothing
    call SetUnitUserData(.u, 0)
    set Countun = Countun - 1
    set Allun[.idx] = Allun[Countun]     
    set Allun[.idx].idx = .idx
    call .destroy()
endmethod
//[...]
private function ResetUnit_Action_Timer takes nothing returns nothing
    local resun un = R2I(TimerGetRemaining(GetExpiredTimer())+0.5)
    if (GetUnitUserData(un.u) == un) then
        call un.Create()
    endif
    call DestroyTimer(GetExpiredTimer())
endfunction

Отредактировано J, 20.07.2009 в 09:35.
Старый 20.07.2009, 09:29
Daemonik

offline
Опыт: 5,084
Активность:
Спасибо помогло. Можно закрывать тему.
Старый 20.07.2009, 18:33
Ответ

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

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

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

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



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