24

» WarCraft 3 / Система отлова нанесённого урона

я всё равно буду стараться использовать это адекватно.
Те кто не в состоянии написать подобное, как правило и занимаются забиванием гвоздей микроскопом. Ибо те кто не подходят под это описание, пишут сами свои системы.
24

» WarCraft 3 / Система отлова нанесённого урона

1 триггер на реализацию постоянных (пассивных) способностей, реагирующие на получение урона
Быдлокодер будет использовать на каждую способность своему эвенту, очевидно же.
Систем так же может быть более десятка. Новые юниты так же могут пачками создаваться.
Особо одаренные могут подписываться на регистрацию эвента при каждом использовании.
Clamp:
Система разрабатывалась с расчётом на адекватное использование, а оно не подразумевает создание нового триггера на каждый случай инициализации заклинания.
Цель публикации системы не в том, чтобы показать "ололо, я могу", а чтобы её могли использовать те, кто не в состоянии написать.
24

» WarCraft 3 / Система отлова нанесённого урона

Если использующий не способен адекватно использовать данную систему, простота которой стремится к максимальной отметке, то он в любом случае не сможет создавать программированием контент, достойный внимания. А использование моей системы для создание плохого контента не кажется мне интересной идеей.
Речь не о адекватности использующего или еще о чем то ином вязанном о использовании. Как минимум если существует метод Add, то должен быть метод Remove,который будет реализовывать удаление уже не нужного триггера из Trigger[].
Clamp:
Неверные исправления - Ваш конёк.
:hmm:
24

» WarCraft 3 / Система отлова нанесённого урона

Под "умудрились создать" имеется в виду "создать триггеров для реализации каких-либо полезных действий", разумеется.
Поинтересуйтесь у быдлокодеров, они обязательно найдут способ использовать вместо 1 эвента на 100500 действий, по эвенту на каждое действие.
24

» WarCraft 3 / Система отлова нанесённого урона

что я не могу даже представить ситуацию, при которой понадобится одновременно создавать 50 триггеров, использующих одно и тоже событие.
А Вы не представляйте, вы реализуйте так, что б система работала независимо от кривости рук использующего.
24

» WarCraft 3 / Система отлова нанесённого урона

Кроме того, vJass эмулирует увеличенный размер массива
Что то я не вижу тут эмуляции :|
больше 64 миллионов триггеров.
409550 триггеров. fxd*
Если Вы умудрились создать over9000 триггеров с событием на получение урона...
for(int i = 0; i < 9000; ;i++)
{
  trigger t = CreateTrigger()
  AnyUnitDamagedEvent(t)
  DestroyTrigger(t)
  t = null;
}
то проблемы с переполнением массива будут интересовать Вас в последнюю очередь.
Только в случае использование Вашей наработки.
24

» WarCraft 3 / Система отлова нанесённого урона

Легко.
Пусть TrigsNum = 100500 (или как минимум > JASS_MAX). Дальше ясно, или нужна помощь кэпа?
for(int i = 0; i < 50; i++)
{
   AnyUnitDamagedEvent(CreateTrigger())
}
При условии что на карте овер 1к юнитов.
Дальше ясно, или нужна помощь кэпа?
24

» WarCraft 3 / Система отлова нанесённого урона

private void Adder()
    {
        int i = 0
        loop
        {
            TriggerRegisterUnitEvent(Trigger[i],GetEnteringUnit(),EVENT_UNIT_DAMAGED)
            exitwhen i==TrigsNum
            i++
        }
        GroupAddUnit(Group,GetEnteringUnit())
    }
Это фейл! и не оффтоп. лол.
24

» WarCraft 3 / Система отлова нанесённого урона

А зачем вообще TriggerResgister ? сделайте класс, наследуйтесь от него и передавайте системе
Затем что у нас тут СОП, а не ООП.
Clamp:
Хотя в целом не лучше и не хуже.
Лол. Объясняю для особо одаренных, почему твой код - уг.
Берем из твоей либы:
AnyUnitDamagedEvent(trigger trg)
И регистрируем 100, опустим тот факт, что нефига не зарегистрируется, если на карте много юнитов, ну а далее, мы уничтожаем 99 триггеров(ты же не думал что они будут все статичными, лол).
И смотрим сюда:
private void Adder()
    {
        int i = 0
        loop
        {
            TriggerRegisterUnitEvent(Trigger[i],GetEnteringUnit(),EVENT_UNIT_DAMAGED)
            exitwhen i==TrigsNum
            i++
        }
        GroupAddUnit(Group,GetEnteringUnit())
    }
Лол. Конечно же моя система ничем не лучше :D
Для самых одаренных из одаренных поясняю, в твоей системе еще нужно писать метод для удаления твоей костыльной регистрации ._.
24

» Naruto - Nindogatari / Naruto - Nindogatari

Что бы были все стихии, нужно будет отыграть десятки, или даже сотни часов. А уж всякие ВМШ будут у единиц избранных. Некоторые техники из оригинального аниме конечно же будут встречаться, но не слишком часто, и сложность их получения будет зависить от их ранга и прочих параметров. Проще говоря с разенганами и райкири все поголовно бегать не будут.
24

» WarCraft 3 / Система отлова нанесённого урона

quq_CCCP, лолшто? Банально систему отслеживания нанесения урона как ты будешь писать?
24

» WarCraft 3 / Система отлова нанесённого урона

Изображай, что всё, что не твоё - лажа дальше.
Зачем мне что то "изображать" ? Разница между твоей системой и моей более чем очевидна. Пока что что то изображать пытаешься только ты.
24

» WarCraft 3 / Система отлова нанесённого урона

Да ладно? "Твоя система говно, эта лучше" - плохой способ подтвердить.
По моему мой код сам за себя говорит. Думаю тут даже не о чем рассуждать и где лучше совершенно очевидно. Фильтрации есть, лишних действий нету. Тут максимум к чему можно придраться, так это выгрузке параметров в глобалки, и невозможность использование самих нативок. Что в принципе дело привычки, а в плане производительности совершенно не существенно. В твоей же системе совершенно неуклюжая инициализация. Ну и фильтацию твоя система не поддерживает.
Ты её как хм... ну в общем очень неаккуратно написал.
Лень было форматирование делать и комменты проставлять, писал на коленке, больше 15 минут тратить на такую лажу было лень.
24

» WarCraft 3 / Система отлова нанесённого урона

Пф, я - не ты, чтобы срач ради факта разводить.
По барабану. Раз говоришь что у меня "слабая" архитектура, то изволь как то подтвердить свои слова. Я уже свою точку зрения подтвердил своей альтернативной системой, которая полностью реализует то о чем я говорил.
хотя и несколько перегруженная
Чем ж она перегружена?) Анонимными функциями?) Или 2-мя проверками для фильтрации?) :)
Хотя можно просто дефайном заменить define GetEventDamageSource() = Source
Не стоит. Это сделано намеренно, ради совместимости с другими системами.
Может быть, её добавить в первый пост?)
Да как хочешь.
24

» WarCraft 3 / Система отлова нанесённого урона

ScorpioT1000, нет :)
Это не попсовая функция, я ж выше писал, о ней мало кто знает, и еще меньше людей знают как ее применять, и по факту до сих пор она нигде не применялась, ну или по крайней мере я не видел что б ее применяли.
Как и обещал:
тык
library UnitDamageEvent
{
    // источник урона
    public unit Source = null;
    // цель урона
    public unit Target = null;
    // урон
    // для регистрации эвента нанесения урона установите значение как -1.0
    // если вы хотите, что бы нулевой урон не вызывал эвент, то установите как 0.0
    #define private EventDamage = -1.0;
    public float Damage = EventDamage;
    
    private trigger EventTrigger = null;
    private trigger SystemTrigger = null;

    // отвечает за включение\отключение фильтрации юнитов
    #define private UnitFilterEnable = true;
    
    #if (UnitFilterEnable)
        public hashtable sysHashtable = InitHashtable();
    #endif
    
    // добавление\удаление типа юнита для фильтрации
    #define AddFilterUnitByTypeId(typeId) = SaveBoolean(UnitDamageEvent_sysHashtable, 0,typeId, true)
    #define RemoveFilterUnitByTypeId(typeId) = RemoveSavedBoolean(UnitDamageEvent_sysHashtable, 0,typeId)
    #define TriggerRegisterAnyUnitTakesDamage(t) = TriggerRegisterVariableEvent(t, "UnitDamageEvent_Damage", GREATER_THAN, EventDamage);

    callback onInit()
    {
        EventTrigger = CreateTrigger(); SystemTrigger = CreateTrigger();
        group g = CreateGroup();region r = null;unit u = null;
        GroupEnumUnitsInRect(g,bj_mapInitialPlayableArea,null);
        ForGroup(g, lambda void(){
            #if(UnitFilterEnable)
                if(LoadBoolean(UnitDamageEvent_sysHashtable, 0,GetUnitTypeId(GetEnumUnit()))){return;}
            #endif
            TriggerRegisterUnitEvent(EventTrigger,GetEnumUnit(),EVENT_UNIT_DAMAGED)
        });
        GroupClear(g);DestroyGroup(g);g = null;
        RegionAddRect(r, bj_mapInitialPlayableArea);
        TriggerRegisterEnterRegion(SystemTrigger,r,null); r = null;
        TriggerAddAction(SystemTrigger, lambda void(){
            #if(UnitFilterEnable)
                if(LoadBoolean(UnitDamageEvent_sysHashtable, 0,GetUnitTypeId(GetEnumUnit()))){return;}
            #endif
            TriggerRegisterUnitEvent(EventTrigger,GetEnteringUnit(),EVENT_UNIT_DAMAGED)
        });
        TriggerAddAction(EventTrigger, lambda void()
        {
            Source = GetEventDamageSource();Target = GetTriggerUnit();Damage = GetEventDamage();
            Source = null;Target = null;Damage = EventDamage
        });
    }
}


library UnitDamageEventTest uses UnitDamageEvent
{
    callback onInit()
    {
        trigger t = CreateTrigger();
        TriggerRegisterAnyUnitTakesDamage(t);
        TriggerAddAction(t, lambda void(){
            /* Ваш код */
        });
        t = null;
    }
}
24

» WarCraft 3 / Система отлова нанесённого урона

Как же она называется? Ну-же!
Напишу систему, увидишь собственными глазами не только как она называется, но и как ей пользоваться :)
24

» WarCraft 3 / Система отлова нанесённого урона

Кет:
Faion, если работает, в чём проблема? Ты тестил, или споришь о сферическом коне в вакууме?
Работает или не работает в данном случае не обсуждается, ибо к работоспособности нет никаких претензий. Но есть серьезная претензия к логике, мой перфекционизм не позволяет игнорировать данный случай, ибо сейчас не 2002, когда можно было делать "лишь бы работало", сейчас критично важно писать высокопроизводительные библиотеки(к коим данная не относится из за логики).
Так или иначе, тебе придётся пройтись по каждому юниту, чтобы каждый получил этот ивент.
Совершенно верно, ОДНАКО, проход будет 1, который будет происходить во время инита, вместе со всеми системами, причем для любого количества триггеров(в т.ч. подписанных на данный эвент уже после инита и перебора).
Ты не можешь создать свою переменную типа "event", нету нативных функций для этого.
Переменную типа эвент, действительно не могу, она будет другого типа, но будет работать как эвент, нативная функция для этого есть, просто ты ее не знаешь.
Итого, независимо от количества триггеров, будет 1 проход, для всех n триггеров.
но Файону здесь не повезло, и он пытается хоть в чём-нибудь выпендриться.
Файон ничего не пытается, Файон придет с работы, напишет то о чем он написал и опубликует. А вот чего добивается Кламп своими пмсными выходками мне не ясно если честно.
24

» WarCraft 3 / Система отлова нанесённого урона

Clamp, я в курсе что один раз, для каждого триггера ._. Только ты реально думаешь, что перебор и обвес эвентами пачек юнитов при каждом ините это ок?
24

» WarCraft 3 / Система отлова нанесённого урона

Я тебе сказал "А", ты мне ответил "это не А, это Б", я ткнул, что "я сказал А", ты ответил "кэп?"
Хватит строить из себя идиота. Ты прекрасно понял что я о:
ForGroup(Group,function Registrator)
24

» WarCraft 3 / Система отлова нанесённого урона

Это триггер в базу пишется, и для каждого триггера это место ровно один раз вызывается -__-
Кэп?
в целом я запарился, изображай из себя гения дальше, чо :3
:facepalm:
Зачем мне изображать? Я просто опишу напишу аналог твоей системы, который будет лучше, и все.
24

» WarCraft 3 / Система отлова нанесённого урона

ScorpioT1000, ну мой вброс будет концептуально отличаться от того что имеется на данный момент :)