Делаю один проект , в нем я полностью отказался от стандартной функции нанесения урона и получается отказался от события получение урона. Я сделал собственную базу урона которая организована на потери жизни от всех мне нужных вычислений (брони, сопротивления и тд) но возникла проблема - допустим я создал какую не будь способность которая должна отловить урон , использовать событие на отлов урона я не могу уже - то есть надо делать что-то новое , подобие какой-то функции которая бы проверяла наличие нанесенного урона , но при этом функция могла работать при многократном использовании ( подобной событию отлова урона) . Помогите разобраться с проблемой

Принятый ответ

Как вариант, можно найти в системе действия, в которых триггерно наносится урон юниту (потеря жизней), и отлавливать уже оттуда.

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
18
7 лет назад
Отредактирован Maniac_91
0
Действие: добавить событие в триггер: Юнит - здоровье становится меньше Х.ХХ.
Попробуй это. А когда жизнь убавится, обнови информацию. (Это и есть обновление информации).
Я ошибся! Не учёл того, что события будут копиться, и каждое из них будет запускать триггер, из-за чего он сработает несколько раз подряд. Не знаю, есть ли способ удалить событие из триггера, но если нет - то мой ответ неправильный. Извиняюсь.
Загруженные файлы
0
7
7 лет назад
0
Maniac_91, это легко исправить
Чтобы событие не вешать на одного и того же юнита его надо заносить куда-то и проверять есть ли он там если да то не регистрировать если нету то заносим его и регистрируем
0
18
7 лет назад
Отредактирован Maniac_91
0
Sergey105, каждый раз, когда здоровье юнита уменьшается, нужно обновить информацию. Иначе триггер сработает только тогда, когда здоровье юнита, к примеру, упадёт меньше 100. А если здоровье уже меньше 100, то событие не сработает же. Придётся создать событие "здоровье меньше 95 (или сколько там осталось после нанесения урона)".
У триггера уже 2 события.
Допустим, юнит восстановил здоровье до 100. Ему нанесли урон 10. В итоге срабатывает событие "здоровье меньше 100" И "здоровье меньше 95", то есть два раза. Вот что я имел в виду.
А при каждом обновлении события будут прибавляться, заставляя триггер срабатывать несколько раз.
Поэтому такой способ не подходит.
0
20
7 лет назад
0
Я не уверен что верно понял сабж, но что мешает при нанесении урона проверять наличие какого-нибудь баффа или абилки? Если таких баффов и абилок много - в помощь игра с их айдишниками (диапазоны вроде buffID > 'AQ00')
2
18
7 лет назад
2
Как вариант, можно найти в системе действия, в которых триггерно наносится урон юниту (потеря жизней), и отлавливать уже оттуда.
Принятый ответ
0
26
7 лет назад
0
заноси свой урон в глобалку, и запускай триггер с названием допустим DamageResultEvent, где ты уже можешь узнать свой урон и запустить нужные тебе действия. На джассе было бы гораздо проще сделать свою систему урона и отлавливать ее
0
7
7 лет назад
0
Hate, я вообще то только jass-vjass и пользуюсь
0
26
7 лет назад
0
Sergey105:
Hate, я вообще то только jass-vjass и пользуюсь
папка Mechanics, триггер Events
в той же папке MainEngine, строка 548, функция PhysicalDamage
Загруженные файлы
0
7
7 лет назад
0
Hate, неплохие наработки плохо что все на cjass не очень люблю сильно путает меня он
0
30
7 лет назад
Отредактирован Clamp
0
Что-то типа такого
код
library DamageController {

    private struct damage {

        float common, fire, magic, world

        //constructor
        static damage new(float common, float fire, float magic, float world) {
            damage this = damage.create()
            this.common = common
            this.fire   = fire
            this.magic  = magic
            this.world  = world
            return this
        }
    }

    struct damageController {

        private damage instance
        private agent source, target  //here can be units instead of agents

        //constructor
        static void dealDamage(agent source, agent target, float common, float fire, float magic, float world) {
            damageController this = damageController.create()
            this.source = source
            this.target = target
            this.instance = damage.new(common, fire, magic, world)
            this.dealDamageEx()
        }

        private void dealDamageEx() {

            resist resistance  = target.getResist()

            float commonResist = resistance.common
            float fireResist   = resistance.fire
            float magicResist  = resistance.magic

            float commonDamage = instance.common
            float fireDamage   = instance.fire
            float magicDamage  = instance.magic
            float worldDamage  = instance.world         //world damage can't be resisted
            	//all checks, reductions and onDamage calls goes here, including any damage detection
            	//you can call here any related method or function from anywhere
                //you can send values from this.instance, this.source or this.target, but not themselves
            	//don't forget to deal damage here
            this.instance.destroy()
            this.destroy()
        }
    }
}

У меня так и сделано, собственно. Build-in нанесения урона вообще нет, за дамаг отвечает этот контроллер.
хотя у меня и юнитов в понимании варкрафта нету по сути...

Hate, ты же в курсе, что эта тема не работает?
    SetMaxHp(u,n) = SetUnitState(u, ConvertUnitState(1), n)
    SetMaxMp(u,n) = SetUnitState(u, ConvertUnitState(3), n)
Среди дефайнов в Main.
2
26
7 лет назад
2
Hate, ты же в курсе, что эта тема не работает?
незнаю под каким веществом и зачем я это дефайнил, на это есть отдельная наработка UnitsMaxState
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.