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

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

Ответ
 
Klop
Папа римский
offline
Опыт: 13,006
Активность:
Отталкивать в зависимости от полученного урона
Вообщем как делать отталкивание и прочее ,я сам всё сделаю,интересует меня такая вещь,мне нужно как то запускать нужные мне дейсвия при получении урона,т.е событие Юнит получает урон,там нужно использовать юнита с переменной
но как мне определять юнита,вот например когда мы делаем связываем
юнит-атакован юнит получает урон
мне нужно сделать при любом получении урона
подскажите как лучше реализовать писать свои функции и при нужном событии их вызывать или можно как то использовать сразу несколько событий,но как определить какое событие будет запущенно
Пользуюсь cJass'oм
Klop добавил:
у меня появилась такая задумка вообщем если я при инициализации или в начале карты пикну всех юнитов на карте и задам такую функцию на пике
void TossEvent(unit u){
 trigger t = CreateTrigger()
 int H2I = GetHandleId(u)
 TriggerRegisterUnitEvent(t,u,EVENT_UNIT_DAMAGED)
 triggeraction ta = TriggerAddAction(t,fun TossCreated)
 SaveTriggerHandle(h,H2I,1,t)
 SaveTriggerActionHandle(h,H2I,2,ta)
 t = null
}
при смерти юнита естественно удалять триггер,при создании добавлять будет ли это нормальным решениям этой задачи думаю нет
Старый 23.12.2010, 20:02
JimALIEN
вдупляет sc2 editor
offline
Опыт: 7,176
Активность:
Не совсем вдупляю такого типа код, но насколько я понял мыслиш правильно. Отловить получение дамага можно лиш для конкретного юнита, поэтому на каждого надо иметь отдельный тригер. Такие системы вроде давно уже выкладывали, вполне оптимальные, пошарь в барахолке
Старый 26.12.2010, 07:54
DioD

offline
Опыт: 45,134
Активность:
не умеешь писать на jass, не лезь в надстройки.
Старый 26.12.2010, 08:52
Doc

offline
Опыт: 63,163
Активность:
Омг, зачем отдельный триггер, нужен один триггер на всех, периодически очищаемый от лишних ивентов, либо вообще не очищаемый, ибо не сильно засоряет память.
Старый 26.12.2010, 11:21
DioD

offline
Опыт: 45,134
Активность:
если юниты не умирают на карте, можно вообще ничего не чистить, это кстати реально, правда придётся отказаться от трупов.
Старый 26.12.2010, 18:03
Klop
Папа римский
offline
Опыт: 13,006
Активность:
вообщем сделал так
//ТОЛЧОК ПРИ УРОНЕ=========================================================
library AToss initializer Init{

private void Move(){
 timer t = get
 int H2I = GetHandleId(t),\
     i = LoadInteger(h,H2I,1),\
     Toss = LoadInteger(h,H2I,3)
 unit u = LoadUnitHandle(h,H2I,2),\
      c = LoadUnitHandle(h,H2I,4)
 real Angle = LoadReal(h,H2I,5)
 if i < Toss then
    real x = gux(u)+5*Cos(Angle),\
         y = guy(u)+5*Sin(Angle)
    if IsTerrainPathable(x,y,PATHING_TYPE_WALKABILITY) == false then
       SetUnitX(u,x)
       SetUnitY(u,y)
    endif
    i++
    SaveInteger(h,H2I,1,i)
 else
 FlushChildHashtable(h,H2I)
 DestroyTimer(t)
 endif
 t = null
 u = null
 c = null}
 
private void Created(){
 int Damage = R2I(GetEventDamage())
 if Damage > 0{
    timer t = CreateTimer()
    unit u  = GetEventDamageSource()
    int H2I = GetHandleId(t)
    real Angle = Atan2(guy(ut)-guy(u),gux(ut)-gux(u))
    int Toss = R2I(Damage/5)
    SaveInteger(h,H2I,1,0)
    SaveUnitHandle(h,H2I,2,ut)
    SaveInteger(h,H2I,3,Toss)
    SaveUnitHandle(h,H2I,4,u)
    SaveReal(h,H2I,5,Angle)
    TimerStart(t,0.01,true,fun Move)
    t = null}}

void DamageEvent(unit u){
 trigger t = CreateTrigger()
 int H2I = GetHandleId(u)
 TriggerRegisterUnitEvent(t,u,EVENT_UNIT_DAMAGED)
 triggeraction ta = TriggerAddAction(t,fun Created)
 SaveTriggerHandle(h,H2I,1,t)
 SaveTriggerActionHandle(h,H2I,2,ta)
 t = null}
 
private void Group(){
 DamageEvent(ue)}
 
private void Init(){
 group g = CreateGroup()
 GroupEnumUnitsInRange(g,gslx,gsly,999999,null)
 ForGroup(g,fun Group)
 DestroyGroup(g)
 g = null}}
//=====================================================================
library CKillUnitClear initializer Init{

private void RemoveTossTrigger(int H2I){
 if HaveSavedHandle(h, H2I, 1){
    trigger t = LoadTriggerHandle(h, H2I, 1)
    TriggerRemoveAction(t,LoadTriggerActionHandle(h,H2I,2))
    DestroyTrigger(t)
    RemoveSavedHandle(h, H2I, 1)
    RemoveSavedHandle(h, H2I, 2)
    t = null}}

private void Remove(){
 timer t = get
 unit u = LoadUnitHandle(h,ghi,1)
 FlushChildHashtable(h,ghi)
 RemoveUnit(u)
 DestroyTimer(t)
 t = null
 u = null}

private void Clear(){
 if IsUnitType(ut,UNIT_TYPE_HERO) != true {
 int H2I = GetHandleId(ut)
 timer t = CreateTimer()
 SaveUnitHandle(h,GetHandleId(t),1,ut)
 RemoveTossTrigger(H2I)
 TimerStart(t,3.,false,fun Remove)
 t = null
 }}

private void Init(){
 trigger t = CreateTrigger()
 int i = 0
 whilenot i>15{
 TriggerRegisterPlayerUnitEvent(t,Player(i),EVENT_PLAYER_UNIT_DEATH,null)
 i++}
 TriggerAddAction(t,fun Clear)
 t = null}}
Создал группу и триггер на каждого юнита на карте,так как толчок проходит любым получением урона и если ещё есть нейтралы которые умирают,сделал очистку хеша и дейсвий при смерти этого юнита,естественно по истечению 3 секундного таймера что бы осталась анимация смерти,а то мгновенное исчезновение смотрится плохо,теперь при появлении мобов на карте или юнитов нужно делать ещё и добавление этих событий
Старый 26.12.2010, 21:59
Toadcop

offline
Опыт: 54,313
Активность:
Klop, где бы ты не прятался, я найду тебя, и съем.
Старый 26.12.2010, 23:57
Klop
Папа римский
offline
Опыт: 13,006
Активность:
...

CONSUMED BY TOADCOP

Старый 27.12.2010, 00:32
Ответ

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

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

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

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



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