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

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

Ответ
 
Clamp
Lost in space
offline
Опыт: 71,158
Активность:
Респаун
Есть триггер вида:
Событие: юнит игрока нейтрально-враждебный помер.
Действие:
ждать (уровень юнита)*2+10
создать юнит типа (умирающий юнит) в позиции (умирающий юнит) для нейтрал.-вражд.
ну и парочка спецэффектов, так, память засорить)
Всё работает прекрасно, но тут загвоздка: юнит воскрешается не там, где надо, а там, где испустил дух.
Вопрос: как сделать так, чтобы юнит воскресал в исходной позиции, не особо усложняя структуру триггера?
З.Ы. после этого поста мой опыт стал равным новому году))
Старый 11.01.2010, 13:29
Enein
Silenced by ZlaYa1000
offline
Опыт: 43,453
Активность:
дак заноси юнита в глобалку, а лучше в локалку
зачем?
BK.Jugg, нешаришь же...
все что нужно, это при создании юнита занести его корды в переменную, и привязать их к нему через структуры, кастом валью, хеш
Старый 11.01.2010, 14:09
Clamp
Lost in space
offline
Опыт: 71,158
Активность:
Enein:
все что нужно, это при создании юнита занести его корды в переменную, и привязать их к нему через структуры, кастом валью, хеш
-_-
Пожалуйста, скажи как это сделать)

Отредактировано Clamp, 11.01.2010 в 14:31.
Старый 11.01.2010, 14:20
Enein
Silenced by ZlaYa1000
offline
Опыт: 43,453
Активность:
Как же это сделано в Эвиксе?
красиво, качественно, и намного круче, чем сейчас будет описано ниже
и так, оптимальный вариант - юзердата (если она конечно не заюзана)
function OLOLO takes nothing returns nothing
    local integer count = 1
    local group temp = CreateGroup()
    local unit ololo
    call GroupEnumUnitsOfPlayer(temp,Player(12),null)
    loop
        set ololo = FirstOfGroup(temp)
        exitwhen ololo == null
        call GroupRemoveUnit(ololo,sUn)
        if /* фильтруем здания/героев и т.п. */ then
            call GroupAddUnit(creeps,ololo)
            call SetUnitUserData(ololo,count)
            set ux[count] = GetUnitX(ololo)
            set uy[count] = GetUnitY(ololo)
            set ua[count] = GetUnitFacing(ololo)
            set count = count + 1
        endif
    endloop
    call DestroyGroup(temp)
    set temp = null
endfunction
ux, uy, ua, count и creeps - глобалки
при респе проверяешь юнита на принадлежность группе creeps и "ресаешь" в коордах ux, uy с поворотом в ua
при чем индекс массива - это юзердата самого юнита, т.е. типа ux[getunituserdata(ololo)], uy[getunituserdata(ololo)], ua[getunituserdata(ololo)]
лучше конечно юзердату занести в локалку
Старый 11.01.2010, 14:39
avatarDr
Neophyte
offline
Опыт: 6,474
Активность:
В топку глобалки
//в MapInit для каждого юнита записываешь локацию (Если создаёшь юнитов триггерно, это проще)
function MapInit takes nothing returns nothing
    local unit u
    local location l=Location(GetUnitX(u),GetUnitY(u))
    call SaveLocationHandle(Ht,GetHandleId(u),0,l)
    set u=null
    set l=null
endfunction
function Revive takes nothing returns nothing
    local timer t=GetExpiredTimer()
    local unit u=LoadUnitHandle(Ht,GetHandleId(t),0)
    local location l=LoadLocationHandle(Ht,GetHandleId(u),0)
    call FlushChildHashtable(Ht,GetHandleId(t))
    call FlushChildHashtable(Ht,GetHandleId(u))
    call RemoveUnit(u)
    set u=CreateUnitAtLoc(Player(12),GetUnitTypeId(u),l,GetRandomReal(0,360))
    call SaveLocationHandle(Ht,GetHandleId(u),0,l)
    call DestroyTimer(t)
    set t=null
    set u=null
    set l=null
endfunction
//Death инициируется смертью юнита
function Death takes nothing returns nothing
    local timer t=CreateTimer()
    call TimerStart(t,formula4resptime,false,function Revive)
    call SaveUnitHandle(Ht,GetHandleId(t),0,GetTriggerUnit())
    set t=null
endfunction
Старый 11.01.2010, 14:57
Enein
Silenced by ZlaYa1000
offline
Опыт: 43,453
Активность:
боже как криво... хеш... не удаляются локи... на каждого юнита свой таймер... бррр как противно
Старый 11.01.2010, 15:01
Clamp
Lost in space
offline
Опыт: 71,158
Активность:
avatarDr, Enein, Т_Т
Пожаалуйста, скажите как это сделать на триггерах, если нельзя, то воткните в код пояснение к каждому слову, ибо я нихрена ничего не понял!
Старый 11.01.2010, 15:06
avatarDr
Neophyte
offline
Опыт: 6,474
Активность:
Enein, локации и не надо удалять, они для каждого юнита существуют. И как же ты собираешься обойтись без таймеров на каждого юнита?
У меня-то просто ректы, их небольшое кол-во.
Старый 11.01.2010, 15:11
XOR

offline
Опыт: 38,159
Активность:
На что координаты/векторы, зачем лок
лично мне через структуру удобнее вешать + мульти работоспособность
Старый 11.01.2010, 15:15
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
Вот это мего примитивно но работает
Прикрепленные файлы
Тип файла: w3x Respawn.w3x (10.5 Кбайт, 16 просмотров )
Старый 11.01.2010, 15:16
Enein
Silenced by ZlaYa1000
offline
Опыт: 43,453
Активность:
И как же ты собираешься обойтись без таймеров на каждого юнита?
один на всех заюзать и всё
Старый 11.01.2010, 15:16
avatarDr
Neophyte
offline
Опыт: 6,474
Активность:
Enein, один таймер может одновременно работать n раз?
Старый 11.01.2010, 15:19
Enein
Silenced by ZlaYa1000
offline
Опыт: 43,453
Активность:
на один таймер можно вешать n юнитов
Старый 11.01.2010, 15:21
avatarDr
Neophyte
offline
Опыт: 6,474
Активность:
И всё-таки, объясни, как?
Условия:
Юнит1 привязан к таймеру0 и воскреснет через 5 секунд.
Юнит2 умер.
Старый 11.01.2010, 15:24
BLooD WoLf
Доделываю RPA 2.4
offline
Опыт: 4,171
Активность:
Enein, кинь пример.
Старый 11.01.2010, 15:30
XOR

offline
Опыт: 38,159
Активность:
function lol2 takes nothing returns nothing
...//проверка есть ли рядом декорации и т.д. и воскрешение юнита
endfunction
function lol takes nothing returns nothing
local timer t
if GetOwningPlayer(GetKilledUnit()) == Player(13) then
set t = CreateTimer()
call TimerStart(t,5,false, function lol2)
t = null
endif
endfunction
Примитивно, я не стал все расписывать, доделаешь сам...

Отредактировано XiMiKs, 11.01.2010 в 15:50.
Старый 11.01.2010, 15:44
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
как знаешь но создать сто областей не проблема
а все действия моно через условия в одном триггере разместить...
Старый 11.01.2010, 15:45
BK.Jugg
террорист из КиП
offline
Опыт: 27,066
Активность:
Старый 11.01.2010, 15:46
Clamp
Lost in space
offline
Опыт: 71,158
Активность:
Какой ужас...
На триггерах это никак не сделать? Там даже хеш фуекции есть!
Clamp добавил:
BK.Jugg, я в курсе, но там нельзя пихать время респа в зависимость от уровня
Старый 11.01.2010, 15:48
XOR

offline
Опыт: 38,159
Активность:
Хэш только для 1.24 а очень многие еще не перешли, поверь..
Старый 11.01.2010, 15:49
Ответ

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

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

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

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



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