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

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

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

ответ
Это давно обсуждалось. вопрос удаление события
Создание триггер события — 3 утечки. Стереть переменный триггер, и минус 1. Получается остается 2 утечки.
Вот если удалить юнита (Remove unit), то он стирается из события другого триггера?
Ответ: Да есть способ: вот шпаргалка
ответ
Ruslan24, событие - юнит атакован. Он не показывает урон. Событие на урон добавляется конкретному юниту при входе в игровой рект или инициализации.
ответ
Урон настраивается через уровень способности, или как было сказано unit - damage target
команда для использования нестандартной способности берется от той способности, на основе которой ты её сделал, и если это цепь тралла - Unit - issue order with targetign a unit - orc - chain lighting
ответ
Nifistofi, делая неуязвимым не на 0,01 а на 0,00
ответ
Steal nerves:
связь триггеров
  1. ПРИКАЗ сначало юнит Б получает атаковать цель А. Может стоять далеко от нее, поэтому бежит поближе к цели А.
  2. АНИМАЦИЯ Потом начинает замахиваться, производить анимацию атаки. Короче событие юнит атакован помогает сказать, когда начнется анимация атаки. Надо понимать, что она не сейчас производится, а будет через секунду. За это время можно успеть отменить атаку, или сменить анимацию атаки.
  3. УРОН Событие юнит получает урон показывает. что юнит получил еще урона, а получит урон. Можно сделать всякие хитрости со здоровьем и прочее. Еще нужно знать. что "юнит атакован" не равно "юнит получает урон". Потому что например, если запустить стрелу. то прилетит не сразу. да и промахнутся можно
Юнит получил приказ атаковать - реагирует на того, кто получил приказ. И того кого хотят атаковать.
Юнит атакован - реагирует на того. кого атаковали. И на того. кто является инициатором атаки.
Получает урон - реагирует на того кто получил урон. И кто нанес. Еще можно узнать сколько нанесли урона.
дубль 2
"Юнит атакован" не равно "Юнит получил приказ атаковать". По логике все верно, но должен получить приказ, затем подбежать поближе, а потом ударить или стрельнуть.
"Юнит атакован" срабатывает в тот момент, когда начинает делать анимацию атаки (замах, начинает натягивать лук и прочее. У кого что.). Короче событие срабатывает, но анимация происходит через 0.00 секунд.
Когда юнит проигрывает анимацию атаки (клинком проникает глубже в противника, из лука вылетает стрела и летит, снаряды из мортир летят к цели, и прочее). Можно отменить приказом (только вот не знаю у ренживиков выпущенные снаряды продолжают летать), проверяй до момента получения урона получал какой-нибудь другой приказ.
"Юнит получает урон" - фиксирует получение урона. А это фиксирует, что атака была успешна, только более поздняя фиксация

0
12
7 лет назад
0
Используй чистый урон и отлавливай его а размер этого чистого урона вычисля на основе своей системы.
0
7
7 лет назад
0
EvilPenguin, а чистый урон он проходит сквозь все эффекты ? подобие астрал и не будет ли он каким-то действием снижен ?
0
16
7 лет назад
0
нет прям "чистого", все имеют какие-то проблемы. hero+magic Не бьет в иммун, универсальный режется резистом, енхансе д не бьет в астрал
0
7
7 лет назад
0
DracoL1ch, вот и вся проблема
Так что я хочу сделать свою базу урона
а на ложность мне как-то все-равно
0
12
7 лет назад
0
a chaos + universal?
0
7
7 лет назад
0
EvilPenguin, он не проходит сквозь астрал
0
12
7 лет назад
0
Можно наносить 0 урона и отлавливать этот момент но как получить нанесенный урон хз...
Может попробовать через хэш-табу передовать)
0
7
7 лет назад
Отредактирован Sergey105
0
EvilPenguin, с отловом урон(единиц) нет проблем
у меня есть база
база создается на каждого юнита при использовании функции моей на нанесение урона в базу вписывается последний кто нанес урон и количество чистого урона (после всех вычислений )
мне надо узнать как отловить момент получение от моей функции урона
вот например есть в доте 2 предмет clarity (реген маны) он сбивается при получении урона . так вот мне надо узнать когда эффект должен быть снят при получении урона .
я пробывал в базу заносить урон потом с помощью публичной функции проверял если урон в переменной больше .0 то урон был нанесен . Оно как бы работало но эту переменную надо обнулять для того чтобы следующий эффект не был снят . А вот если мне сразу надо проверить на получение урона несколько раз - то один эффект проверится нормально а все следующие уже нет .
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
4 комментария удалено
Чтобы оставить комментарий, пожалуйста, войдите на сайт.