30

» WarCraft 3 / Библиотека функций

[quote=Elf_Stratigo]сейчас тоже нужно для каждого обработчика вызывать
nothing AnyUnitDamagedEvent(trigger trg)
сравнил одну строку с созданием триггера, добавлением ему эвентов и действий добавления события другому триггеру
Круто драть фразу из контекста?
[quote=16GB]а так утечка есть?

call TriggerClearActions(t)
call TriggerClearConditions(t)
call DestroyTrigger(t)
[quote=ScorpioT1000]есть всегда, говорю же ) проверьте в цикле - создайте и удалите тысячу триггеров, замерив в диспетчере задач количество памяти, занимаемой варом
30

» WarCraft 3 / Библиотека функций

[quote=Elf_Stratigo]пересоздание триггера чистит его событие
[img]http://www.kolobok.us/smiles/standart/secret.gif[/img] они будут висеть отдельно от триггера, занимая всё ту же память...
[quote=Elf_Stratigo]нужно использовать два триггера: один создаёт события, другой - уже выполняет нужные действия
ну и будешь ты прописывать каждый триггер отдельно, теряя всю универсальность и значительное преимущество в количестве кода
30

» WarCraft 3 / Библиотека функций

Elf_Stratigo:
не увидел освобождения памяти
Clamp:
    globals
        region Region
    endglobals
глобалки не нулят, искренне Ваш.
Clamp:
        local group CurrentUnits = CreateGroup()
        local unit Picked
        ......
        call DestroyGroup(CurrentUnits)
        set CurrentUnits=null
        set Picked=null
а здесь всё обнулено
А события нельзя удалять, опять таки искренне Ваш.
Elf_Stratigo:
условие "GetEnteringUnit()!=null" применяется не верно
без него будут повисать пустые события на каждое срабатывание, но ты для интереса можешь его выпилить, я не против
30

» WarCraft 3 / Библиотека функций

Doc:
ты используешь cjass и пишешь local?
мне так нравится
Doc:
советую юзать "cj_types.j"
зачем?
Clamp добавил:
то есть я знаю зачем, но не считаю это нужным
Clamp добавил:
и вообще лучше по делу отпиши, как системка тебе и как можно ложное срабатывание убрать?
30

» WarCraft 3 / Библиотека функций

На сей раз постарался не опозориться и перед выкладкой посовещался с шарящими людьми, результат - ашиппак ни найдина

Библиотека, которая позволяет добавлять общее событие "юнит получает урон":
cJass
library UnitDamaged initializer InitRect
{
    region Region
    nothing Adder()
    {
        if(GetEnteringUnit()!=null)
        {
            TriggerRegisterUnitEvent(GetTriggeringTrigger(),GetEnteringUnit(),EVENT_UNIT_DAMAGED)
        }
    }
    
    nothing AnyUnitDamagedEvent(trigger trg)
    {
        group CurrentUnits = CreateGroup()
        unit Picked
        GroupEnumUnitsInRect(CurrentUnits,bj_mapInitialPlayableArea,null)
        loop
        {
            Picked = FirstOfGroup(CurrentUnits)
            exitwhen Picked == null
            TriggerRegisterUnitEvent(trg,Picked,EVENT_UNIT_DAMAGED)
            GroupRemoveUnit(CurrentUnits,Picked)
        }
        TriggerRegisterEnterRegion(trg,Region,null)
        TriggerAddAction(trg,function Adder)
        DestroyGroup(CurrentUnits)
        CurrentUnits=null
    }
    
    nothing InitRect()
    {
        Region = CreateRegion()
        RegionAddRect(Region, bj_mapInitialPlayableArea)
    }
}
vJass
library UnitDamaged initializer InitRect
    globals
        region Region
    endglobals
    function Adder takes nothing returns nothing
        if GetEnteringUnit()!=null then
            call TriggerRegisterUnitEvent(GetTriggeringTrigger(),GetEnteringUnit(),EVENT_UNIT_DAMAGED)
        endif
    endfunction

    function AnyUnitDamagedEvent takes trigger trg returns nothing
        local group CurrentUnits = CreateGroup()
        local unit Picked
        call GroupEnumUnitsInRect(CurrentUnits,bj_mapInitialPlayableArea,null)
        loop
            set Picked = FirstOfGroup(CurrentUnits)
            exitwhen Picked == null
            call TriggerRegisterUnitEvent(trg,Picked,EVENT_UNIT_DAMAGED)
            call GroupRemoveUnit(CurrentUnits,Picked)
        endloop
        call TriggerRegisterEnterRegion(trg,Region,null)
        call TriggerAddAction(trg,function Adder)
        call DestroyGroup(CurrentUnits)
        set CurrentUnits=null
        set Picked=null
    endfunction

    function InitRect takes nothing returns nothing
        set Region = CreateRegion()
        call RegionAddRect(Region, bj_mapInitialPlayableArea)
    endfunction
endlibrary

Регистрация события идёт следующим образом:
  1. все существующие юниты на карте добавляются в группу и на каждого нужному триггеру добавляется событие получения урона.
  2. указанному триггеру регистрируется событие "юнит входит на игровую территорию".
  3. при реакции на добавленное событие для юнита сразу добавляется событие получения урона.

Есть одна проблема, которую мне решать лень и я просто не знаю, как её решить в самой системе: при создании нового юнита сработает каждый триггер с событием на урон.
Лечится введением условия.
function TrigFunc takes someone returns somemore
if GetEnteringUnit() == null then
    //действия при получении урона
endif
endfunction

Событие добавляется так:
    call AnyUnitDamagedEvent(SomeTrigger)

Никаких дополнительных переменных вводить не нужно, достаточно просто скопировать в Нестандартный Код Карты
30

» WarCraft 3 / Редактирование приказов

к сожалению, скрыть таким способом я их не сумел, экспериментируйте
благо теперь вы сможете изменять описания и расположения кнопок, а значит, использовать в качестве приказов способностей, фактически то, что надо
30

» WarCraft 3 / Мурлочья вышка

и спустя пару дней понял, что прыжки на вышке позволяют видеть намного дальше.
шикарно =)
30

» WarCraft 3 / Крестьянин Штормвинда

отдадите проект ПР? или кто-то из учасников желает продолжать?
я намекнул на то, что было бы неплохо, и проект зашевелился =)
ну офк там не я один фактором выступаю, но надеюсь, что сделаем до конца.