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

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

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

offline
Опыт: 7,009
Активность:
Задачка с дамагом юнитов в областе
Необходимо нанести повреждение всем в определенной области, каждый раз когда наносится дамаг.
15% от повреждений и условие, если эти повреждение не меньше 4 допустим. То есть сплеш в сплеше получается, DamageTarget - не использовать, очень уж бажно выходит. так-же можно в любой момент получить фатал еррор.

Вопрос - будет ли это работать нормально, а именно там где строка с комментарием. Это что-то либо рекурсии или цикла в цикле.

Код:
globals
    group GR = CreateGroup()
    boolexpr bb = null
    unit u = null
    unit u2 = null
    real dmg = 0
    real Damage = 0
endglobals

function Fde takes nothing returns boolean
    local unit u11 = u2
    local unit b = GetFilterUnit()
    local real Damage2 = dmg
    set dmg = dmg*0.15
    

    call SetWidgetLife(b,GetWidgetLife(b) - dmg)

    if (dmg > 4)then
        call GroupEnumUnitsInRange(GR,GetUnitX(b),GetUnitY(b),100+dmg*1.1,bb) //////////////////
    endif

    set dmg = Damage2
    return false
endfunction



function Trig_Damage_Actions takes nothing returns nothing
    if ( Damage != 0 ) then
        set dmg = Damage
        set Damage = 0
    else
        set dmg = GetEventDamage() 
    endif
    
    if(dmg > 2)then
        set u2 = GetEventDamageSource()
        set u = GetTriggerUnit()
        call GroupEnumUnitsInRange(GR,GetUnitX(u),GetUnitY(u),100+dmg*1.1,bb)
    endif
endfunction


Есть другие варианты реализации ?
Старый 03.05.2010, 00:48
Enein
Silenced by ZlaYa1000
offline
Опыт: 43,453
Активность:
DamageTarget - не использовать, очень уж бажно выходит. так-же можно в любой момент получить фатал еррор.
o__O ??
Старый 03.05.2010, 01:46
Toadcop

offline
Опыт: 54,313
Активность:
он про безконечный цыкл вестимо...
Старый 03.05.2010, 06:01
XOR

offline
Опыт: 38,159
Активность:
Может он про поинт?=)
Старый 03.05.2010, 07:46
Rewenger
The culprit will not die
offline
Опыт: 35,873
Активность:
Необходимо нанести повреждение всем в определенной области, каждый раз когда наносится дамаг.
Может, лучше урон будет наносить некий даммик, а в триггере условие, что урон не наносится этим дамми? Где строка с комментариями - вроде всё правильно.
Старый 03.05.2010, 08:36
Doc

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

offline
Опыт: 7,009
Активность:
Если использовать DamageTarget, урон не всегда наносится в таком случае, при таком-же коде.
Ещё вопрос - это уже про скорость:
Лучше использовать каждый раз:
call SetWidgetLife(b,GetWidgetLife(b) - dmg)
Либо сейвить весь урон на каждого юнита, и потом по окончанию нанести его ?
Старый 03.05.2010, 14:51
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
надо отключить триггер "получает урон" нанести урон с помощью
call UnitDamageTarget(u1,u2,dmg,false,false,AT,DT,WT)
включить триггер
все фаталы убегут
call SetWidgetLife(b,GetWidgetLife(b) - dmg)
чуш, а если убьет?
Старый 03.05.2010, 19:41
ZeToX2007

offline
Опыт: 7,009
Активность:
bee:
чуш, а если убьет?
Значит не будет юнита.
bee:
call UnitDamageTarget(u1,u2,dmg,false,false,AT,DT,WT)
включить триггер
все фаталы убегут
А мне не надо чтобы тригер выключался. тем более UnitDamageTarget не будет нормально работать, в таком цикле.
Старый 03.05.2010, 20:34
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
А мне не надо чтобы тригер выключался
он отключается на мнгновение
воизбежание фатала
Старый 03.05.2010, 21:23
Arty3ooo
...
offline
Опыт: 3,125
Активность:
SetWidgetLife - не идет в счет как убийство. Если герой убьет крипа\героя таким образом, то никакой экспы, голда и прочей басни не будет. Тролололо
UnitDamageTarget... пиши не индусским кодом и забудь про фаталы.
Старый 04.05.2010, 10:10
ZeToX2007

offline
Опыт: 7,009
Активность:
Arty3ooo, Не шариш, попробуй на практике

ZeToX2007 добавил:
Цитата:
Сообщение от Arty3ooo
не идет в счет как убийство. Если герой убьет крипа\героя таким образом, то никакой экспы, голда и прочей басни не будет. Тролололо


А кто сказал, что нельзя сделать это триггерно ?
Старый 04.05.2010, 10:29
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
короче ZeToX2007, ты обрашяеш внимание только на оправданные грубости в твой адрес. я тебе ответил как надо. это всегда работало и будет работать
bee добавил:
когда ты наносиш урон с помощью UnitDamageTarget() срабатывает триггер который запускает
UnitDamageTarget()
вывод: бесконечный цикл
решение:
надо отключить триггер "получает урон" нанести урон с помощью
call UnitDamageTarget(u1,u2,dmg,false,false,AT,DT,WT)
включить триггер
все фаталы убегут
Старый 04.05.2010, 21:31
ZeToX2007

offline
Опыт: 7,009
Активность:
bee,ЧИТАЙ ЧТО В 1 ПОСТЕ НАПИСАННО, ЕСЛИ Я НАПИСАЛ ЭТО НЕ ПРОСТО ТАК !! А ВЫ ПРОДОЛЖАЕТЕ !. DamageTarget ОЧЕНЬ медленная функция и от неё достаточно лагов будет, что произойдёт если вызвать её около 4000 раз ? лаг на 1-2 секунды, когда с SetWidgetLife всё гладко, вот поэтому я не использую DamageTarget, а у меня может потребуется и 6000 вызовов. Тем более мне нужен чистый урон, без учётов защиты и прочих способностей, которые предотвращают урон.
Старый 04.05.2010, 22:51
Doc

offline
Опыт: 63,163
Активность:
Ты глупец зачем столько вызовов? Ваш отличный кодинг уже не доставляет. Как можно думать об оптимизации при > 1000 вызовов. Лимит операций не боитесь превысить?
[+] 1 пункт от ShadoW DaemoN: 1.1 (ненормативная лексика)

Отредактировано ShadoW DaemoN, 05.05.2010 в 14:46.
Старый 04.05.2010, 23:12
ZeToX2007

offline
Опыт: 7,009
Активность:
DoctorGester, Прошу сделать тоже самое, только в более быстром варианте, чем у меня... врядли у тебя это получится.
DoctorGester:
Лимит операций не боитесь превысить?
Не шариш
Старый 04.05.2010, 23:15
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
я предумал... наносить урон с помощью SetUnitState / SetWidgetLife если урон меньше GetWidgetLife(u) а если больше то вызывать UnitDamageTarget
Старый 04.05.2010, 23:31
ZeToX2007

offline
Опыт: 7,009
Активность:
ZeToX2007:
globals
real Life = 0
endglobals
#define MdaL = 65000
Life = GetWidgetLife(b)
if ( dmg >= b )
{
UnitDamageTarget(u11,b,MdaL ,false,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
}else{
SetWidgetLife(Life - dmg)
}
А сдесь я что писал ?
Старый 04.05.2010, 23:41
Doc

offline
Опыт: 63,163
Активность:
Тогда я не понимаю в чем суть темы если ты не принимаешь предложения и критику.
Старый 04.05.2010, 23:44
ZeToX2007

offline
Опыт: 7,009
Активность:
DoctorGester, Какое предложение ??? покажи ?? ниодного стоющего... сделай алгоритм более бытстрым вот, что...
Старый 04.05.2010, 23:49
Закрытая тема

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

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

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

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



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