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

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

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

offline
Опыт: 921
Активность:
Возрождение деревьев
Как заставить деревья вырасти спустя некоторое время после уничтожения?

Отредактировано alexkill, 22.06.2009 в 16:22.
Старый 22.06.2009, 15:21
SomeFire
Всего 20 символов...
offline
Опыт: 26,884
Активность:
Может как-нить триггером, событие - декорация уничтожена, условие декорация = дерево, действие - ждать столько-то и посадить(или возродить, не знаю) новое.
Старый 22.06.2009, 15:36
Rewenger
The culprit will not die
offline
Опыт: 35,273
Активность:
Гораздо лучше каждые секунд 20-30 пикать все убитые деревья и воскрешать их с анимацией (там есть такой пункт).
Старый 22.06.2009, 15:39
eml

offline
Опыт: 921
Активность:
а можно сделать чтонибудь чтоб выросшие деревья в "плен" никого не брали?
Старый 22.06.2009, 16:15
HTC
Мечта - та же реальность
offline
Опыт: 23,685
Активность:
eml ну надо тогда еще проверять, что в этой области нет юнита и тогда уже вырастить деревья.
Старый 22.06.2009, 16:49
dave_wwid

offline
Опыт: 12,954
Активность:
Число разрушаемых обьектов на регион ограничено для обработки триггерами. Поэтому леса разумнее разбить на небольшие регионы и обрабатывать их отдельно. Возможно существует и другой вариант- например запись всех разрушаемых обьектов в массив пременных и запись их позицмй в другой массив.
Старый 23.06.2009, 14:44
LordSerga

offline
Опыт: 3,809
Активность:
Лови файл образец =)
Время переоживления декорации я поставил 5 сек. У себя поставь 30 сек. Всё настраевомо.
Прикрепленные файлы
Тип файла: w3x Destructable.w3x (13.3 Кбайт, 85 просмотров )
Старый 23.06.2009, 15:28
agentex

offline
Опыт: 34,534
Активность:
1. создаешь массив разр. обьектов destr (через "переменные"!) 2.создаеш триггер RT переводишь в код удаляешь весь текст оттуда, вставляешь это:
» код

Код:
function RT_H2I takes handle h returns integer  
      return h  
      return 0  
endfunction  

function GetHandleIndex takes handle h returns integer  
    return (RT_H2I(h)-0x100000) 
endfunction  

function RT_Timer takes nothing returns nothing  
    local integer h = GetHandleIndex(GetExpiredTimer())  
    local destructable d = udg_destr[h] 
    call DestructableRestoreLife(d, GetDestructableMaxLife(d), true)  
    call SetDestructableAnimation(d, "birth")  
    call DestroyTimer(GetExpiredTimer())  
    set udg_destr[h] = null  
    set d = null  
endfunction  

function Trig_RT_Actions takes nothing returns nothing  
    local destructable d = GetTriggerWidget()
    local timer t = CreateTimer()
    local integer h = GetHandleIndex(t)
    set udg_destr[h] = d
    call TimerStart(t, 30, false, function RT_Timer) 
    set d = null 
    set t = null 
endfunction 

//===========================================================================  
function RT_RegisterDeath takes nothing returns nothing  
    call TriggerRegisterDeathEvent(gg_trg_RT, GetEnumDestructable())  
endfunction  

function InitTrig_RT takes nothing returns nothing  
    set gg_trg_RT = CreateTrigger()  
    call TriggerAddAction(gg_trg_RT, function Trig_RT_Actions)  
    call EnumDestructablesInRect(bj_mapInitialPlayableArea, null, function RT_RegisterDeath)  
endfunction


и радуешься
Старый 23.06.2009, 16:12
Zahanc

offline
Опыт: 22,977
Активность:
agentex,

Очень прошу, объясните поподробнее, на понятном для простых смертных языке - что нужно сделать чтобы этот код работал? Я создал переменную, назвал её "destr", затем создал триггер, назвал его "RT", конвертировал триг в текст, вставил код. Ничего не вышло - выдало ошибку. Что не правильно?
Старый 27.11.2009, 22:17
Nekit1234007

offline
Опыт: 11,916
Активность:
bladget, переменная destr должна быть массивом. Если тестишь на 1.24, вместо:
Код:
function RT_H2I takes handle h returns integer
    return h
    return 0
endfunction
вставь:
Код:
function RT_H2I takes handle h returns integer
    return GetHandleId(h)
endfunction
Старый 27.11.2009, 22:23
agentex

offline
Опыт: 34,534
Активность:
не нужно использовать этот метод он устарел, да к тому же еще небезопасен
Старый 27.11.2009, 22:27
Zahanc

offline
Опыт: 22,977
Активность:
Цитата:
Сообщение от agentex
этот метод устарел


А нельзя ли новый показать?
Старый 27.11.2009, 22:43
Nekit1234007

offline
Опыт: 11,916
Активность:
Нужно: 1) Триггер с названием "Trees". 2) Глобалка типа Хэш-таблица (не массив) с названием "HT", инициализировать необязательно.
» Код
Код:
function ResT takes nothing returns nothing
    local timer t=GetExpiredTimer()
    local integer i=GetHandleId(t)-0x100000
    local destructable d=LoadDestructableHandle(udg_HT,i,0)
    call DestructableRestoreLife(d,GetDestructableMaxLife(d),true)
    call SetDestructableAnimation(d,"birth")
    call DestroyTimer(t)
    call FlushChildHashtable(udg_HT,i)
    set d=null
    set t=null
endfunction

function Trig_Trees_Actions takes nothing returns nothing
    local destructable d=GetTriggerDestructable()
    local timer t=CreateTimer()
    local integer i=GetHandleId(t)-0x100000
    call SaveDestructableHandle(udg_HT,i,0,d)
    call TimerStart(t,30.,false,function ResT)
    set d=null
    set t=null
endfunction

function RegD takes nothing returns nothing
    call TriggerRegisterDeathEvent(gg_trg_Trees,GetEnumDestructable())
endfunction

function InitTrig_Trees takes nothing returns nothing
    if udg_HT==null then
        set udg_HT=InitHashtable()
    endif
    set gg_trg_Trees = CreateTrigger()
    call TriggerAddAction(gg_trg_Trees,function Trig_Trees_Actions)
    call EnumDestructablesInRect(GetWorldBounds(),null,function RegD)
endfunction
Старый 27.11.2009, 22:51
Zahanc

offline
Опыт: 22,977
Активность:
Nekit1234007,

Попробовал - работает. Благодарю, занесу твой ник в титры. :D Осталось самому разораться что в этом коде за что отвечает. ;)
Старый 27.11.2009, 23:07
XOR

offline
Опыт: 38,284
Активность:
Отслеживать смерть деструба, пикать юнитов в позиции дерева, если хоть кто то есть то опять ждать иначе возрождать.

Отредактировано XiMiKs, 27.11.2009 в 23:46.
Старый 27.11.2009, 23:28
Nekit1234007

offline
Опыт: 11,916
Активность:
Не легче. Это скорее дополнение к написанному.
Старый 27.11.2009, 23:35
XOR

offline
Опыт: 38,284
Активность:
Твой вариант может запереть юнита в лесу.
нужно возрождать не сразу
Пропустил. Можно было догадаться.
то опять ждать
Старый 28.11.2009, 00:04
Nekit1234007

offline
Опыт: 11,916
Активность:
Цитата:
Сообщение от XiMiKs
Твой вариант может запереть юнита в лесу.

Я знаю =)) Но кому надо, тот может и пару ифоф добавить...
Старый 28.11.2009, 00:06
RunixMing47
А жаль...
offline
Опыт: 1,919
Активность:
Ну вы тут извращенцы... минутный тригер. Просто берем все метрвые деревья, делаем If если есть в радиусе 300 от дерева какой то юнит то не возрождать, если нет возрождаем... тут можноо вообще без джаза. Вообщем то что XiMiKs, сказал то и делать тоже самое почти будет...
Старый 28.11.2009, 10:17
Nekit1234007

offline
Опыт: 11,916
Активность:
RunixMing47, нужно деревья не ВСЕ разом, а одно спилили и оно возрождается через тридцать секунд.
Старый 28.11.2009, 12:05
Закрытая тема

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

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

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

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



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