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

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

Ответ
 
Rinegan

offline
Опыт: 895
Активность:
Creep Respawn With Replace

Creep Respawn With Replace


Сколько я не искал respawn крипов, который не создаёт новых мобов на месте старых, а "воскрешает" мёртвых, я такого не нашёл. т.к. именно воскресить моба нельзя, я решил просто не дать ему умереть) я случайно обнаружил, что при эвэнте <юнит> - Получает урон(EVENT_UNIT_DAMAGED) экшен происходит до самого нанесения урона.
Кароче в атаче всё можно посмотреть, правда мне почемуто захотелось писать комменты на английском, так что если что не понятно спрашивайте.
Прикрепленные файлы
Тип файла: w3x RSwithReplace.w3x (22.2 Кбайт, 49 просмотров )

Отредактировано Rinegan, 27.08.2009 в 10:42.
Старый 26.08.2009, 14:39
Daemonik

offline
Опыт: 5,084
Активность:
Все конечно замечательно. Но зачем? Какая разница ресается юнит или создается новый?
Все равно после того как разлагается труп происходит авторемув.
Старый 26.08.2009, 15:43
Rinegan

offline
Опыт: 895
Активность:
Разница в том что некоторые наработки работают на определённых юнитах, и если юнит респаунится, то эта система уже не будет работать, а моя система решает эту проблемму. и не надо заморачиваться на доп. функциях. например система флоат дэмэйджа, её можно сделать двумя способами:
1) Одним триггером и кучей эвентов
2) Кучей триггеров с одним эвентом
Ито ито не есть гуд без этой системы респауна, в первом случае память забивается эвэнтами, т.к. удалять их из триггера нельзя. А во-втором просто куча триггеров) а это очень даже бэд. Вот и думай после этого зачем. Да и начинающим картоделам помочь может.
Старый 26.08.2009, 18:20
V_1_R_U_S
Небезопасный!
offline
Опыт: 3,596
Активность:
Система делается за 5 мин...
К тому же есть скилы для которых нужны трупы...
Старый 26.08.2009, 18:47
Rinegan

offline
Опыт: 895
Активность:
А я разве говорю, что она сложная? А вот насчёт трупов согласен, и как решить эту проблемму я пока не придумал.. Вот например стандартная абилка Чёрная стрела работать не будет... А воскрешение и гальванизация будет)
Старый 26.08.2009, 19:12
MF
Что-то вокруг не так
offline
Опыт: 26,594
Активность:
Rinegan, вообще, ходят непроверенные слухи, что эвент зацепленный на юнита удаляется вместе с юнитом.
Старый 26.08.2009, 19:14
Rinegan

offline
Опыт: 895
Активность:
Это конешно хорошо, но вместо того что каждый раз добавлять эвэнт, непроще ли использовать это?
Старый 26.08.2009, 19:31
MF
Что-то вокруг не так
offline
Опыт: 26,594
Активность:
Rinegan, если он удаляется (хотя я в этом и не особо уверен, но компетентные источники заявили именно это) то какая разница? Так ты нагружаешь действиями по воскрешению отслеживанию и так далее. А так действием по добавлению эвента.
Старый 26.08.2009, 19:42
ScorpioT1000
Работаем
offline
Опыт: отключен
я решил просто не дать ему умереть)
и не дать опыт за убийство?
Старый 26.08.2009, 19:58
Rinegan

offline
Опыт: 895
Активность:
Вместо оригинального юнита умирает "подставной" и опыт нормально даётся.

Rinegan добавил:
Имея такой респаун, становится гораздо легче и быстрее делать другие системы, ИМХО. Да и накрутки по производительности получаются не очень большие.
Старый 26.08.2009, 20:46
Daemonik

offline
Опыт: 5,084
Активность:
Ну не знаю мне J давал код респауна мобов, работает все на 5+
Все появляются на своих местах, а те кто должен жить 1 раз удаляются функцией.
Старый 26.08.2009, 21:21
Rinegan

offline
Опыт: 895
Активность:
Поподробнее пожалуйста, и если можно с картой^^

Rinegan добавил:
Я немножко изменил, по возможности убрал кэш.
Старый 27.08.2009, 10:43
Daemonik

offline
Опыт: 5,084
Активность:
Эхх... ща найду ее.
Daemonik добавил:
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 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)
    if (GetUnitUserData(un.u) == un) then
        call un.Create()
    endif
    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
// глобалки
InitReset - включает/выключает библиотеку.
Period - устанавливает время респавна
// функции
ResetUnit_UnitAdd(unit) - добавляет юнита в список воскрешаемых
ResetUnit_UnitRemove(unit) - убирает юнита из списка воскрешаемых.
Старый 27.08.2009, 13:49
Rinegan

offline
Опыт: 895
Активность:
Ну дак это с функцией UnitCreate()! А моя идея как раз в том чтобы её не использовать. + Нельзя задавать для каждого юнита время респавна.
Старый 27.08.2009, 14:01
Daemonik

offline
Опыт: 5,084
Активность:
Rinegan:
Ну дак это с функцией UnitCreate()! А моя идея как раз в том чтобы её не использовать.
Какой смысл?
Rinegan:
Нельзя задавать для каждого юнита время респавна.
Можно, если захотеть и поковыряться в этой библиотеке.
Старый 27.08.2009, 14:05
Rinegan

offline
Опыт: 895
Активность:
Смысл в том чтобы всё упростить. Я же не заставляю вас всех использовать эту систему, я выставляю её на общее рассмотрение, как вариант решения некоторых проблем. Да и любому нубу очень интересно ковырятся в такой замудрённой библиотеке...

P.S. хватит задавать одинаковые вопросы, смотри выше.
Старый 27.08.2009, 14:12
aibekbest

offline
Опыт: 259
Активность:
Сори за напский вопрос: а спелл при помощи которого возрождаются крипы тоже ставит на место умершего моба нового или действительно "возрождает"??
Старый 28.08.2009, 14:33
Rinegan

offline
Опыт: 895
Активность:
Возрождает.
Старый 28.08.2009, 15:49
Ответ

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

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

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

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



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