Epselot
offline
Опыт:
3,592Активность: |
Триггер игнорирования урона
Как сделать чтоб при атаке/получении урона, атакованный юнит не получил урон? (предусмотрено что есть вероятность этого) Возился с "Изменить урон единицы" наверное что то неправильно делаю, но то что хочу не получилось... Подскажите кто делал=) |
07.12.2012, 08:01 | #1
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Ancient
Щпаовапа
offline
Опыт:
38,370Активность: |
Тебе надо что-то типа уклонение из вара? Если да, то это просто. Проверяешь наличие способности на уклонение/какой нибудь болеан, если да, то генерируешь число от 0 до 100. Потом если число больше меньше твоей вероятности, хилишь юнита на полученый урон. Вот и все. |
07.12.2012, 14:36 | #2
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Epselot
offline
Опыт:
3,592Активность: |
Ancient, у меня много оружия и единиц с разной бронёй + бонусы у броне, щит, прописывать для каждого вариант триггер... это фактически не реально... (да и юнит может просто умиреть если жизней мало от выстрела даже с уворотом). Нужно именно когда юнит собрался стрелять или уже выстрелил, но до того как урон был нанесён, урон был ликвидирован каким либо способом, только именно на мгновение этой атаки...
Epselot добавил:
События Единица - Любая боевая единица начинает атаку Локальные переменные Условия Действия Единица - (Атакующая боевая единица) Взять Нет урона Общее - Ожидание 0.07 Игровое время сек. Единица - (Атакующая боевая единица) Взять Полностью урона Работает, только с 1, но при 0.07 секунд юнит не получает урон только из Винтовки Гаусса, с другим оружием приходится увеличивать время ожидания, Головорез вообще даже поставив 3 секунды с 4-5 раза наносит урон... Если честно понятие не имею как логика у этой штуки работает... Не логично... Может у кого нить всёж есть мысли по альтернативным вариантам? |
07.12.2012, 16:17 | #3
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
H
hello world
offline
Опыт:
130,376Активность: |
Во первых не используй wait. Твой триггер перестанет работать в потоках.
Во вторых
очень даже реально. Что там у тебя особенного? Например есть 5 видов брони и 5 видов атак. Сделай из них тип данных и в нем 5 констант. При запуске просто вычисляй нужное значение простой математической функцией. Насчет лечения плохой вариант. Ты либо вылечишь его раньше чем он будет получен (т.е при фулл хп здоровье все равно потратится), либо наоборот юнит сначала умрет а потом будет вылечен что уже ничего не изменит.
Тебе нужен бехавиор который полностью игнорирует урон определенного типа, и на время атаки дай этот бехавеор цели, а при окончании атаки сними его. Если например там укажешь блокирование более 100%, то юнит будет даже лечится =) |
07.12.2012, 18:06 | #4
+1/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Epselot
offline
Опыт:
3,592Активность: |
Hellcore, спасибо, сам не додумался бехавиор дать=) Только надо придумать ещё как удалить его сразу после атаки, Надеюсь даваться будет через Единица - Любая боевая единица начинает атаку нормально.
Вот только можешь уточнить:
Я использовал wait много раз и всё работало, объясни что именно может не работать, про что ты говоришь=) А про делать в ручную каждый вариант триггера, просто прописывать каждое новое оружие ещё и в триггерах, это слишком напряжно и у меня сейчас уже почти 20 пушек х) |
07.12.2012, 21:38 | #5
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
H
hello world
offline
Опыт:
130,376Активность: |
нет ты не понял. Запомни самое главное правило написания любого кода (даже gui'шноко) don't repeat yourself Никогда не делай кучи одинаковых триггеров для разных событий. Как я уже и сказал сделай список констант и оружий.
Все это легко делается одним триггером. Для удобства можно сделать парочку своих функций который будут запускать новый поток.
Например действие "Сделать юнита не восприимчивым на следующую атаку." А в код действия уже будет давать и снимать бехавиор. Т.е я бы сделал примерно так:
События
Юнит начинает атаковать Условия
Тут условия, например атакованный юнит такой то герой. Либо можно сделать скрытую системную абилку-бехавиор и в редакторе объектов дать её тем юнитам, которые должны уклонятся. А тут соответственно проверять имеет ли атакованный юнит такую абилку. Действия
тип_атаки = атакующий_юнит_тип_атаки. Если у тебя особенные типы сделай им доп. данные. тип_брони = атакованный юнит_тип_брони. Также можно сделать доп. данные. Отклонить атаку атакованный-юнит используя тип брони тип_брони. И сама функция void Отклонить атаку(unit, armor_type) :
if unit_has_behavior(unit,'Системный бехавиор которые должен быть у всех юнитов умеющих отклонять') { либо другие условия. Дать юниту unit бехавиор 100% защита. ждать 0.1 секунду Отнять у юнита unit бехавиор 100% защита } Само сабой unit должен быть локальной переменной.
Если частично или полностью не понятно что я написал, то почитай статьи про типы данных. Я сам писал пару штук:
вот эти статьи будут очень полезны. Еще можешь посмотреть мои карты сделанные еще на бете sc2, и недавнюю xgm.ru/p/sc2/xgm_awake - тут тоже используются типы данных и функции. |
07.12.2012, 22:07 | #6
+1/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Epselot
offline
Опыт:
3,592Активность: |
С завершением просто сделал:
События Единица - Любая боевая единица под атакой Локальные переменные Условия Действия Единица - Удалить 1 * Другое Игнорирование урона из (Запускающая единица) игрока 0 Работает вроде норм, а вот:
События
Единица - Любая боевая единица начинает атаку Локальные переменные Условия Действия Единица - Добавить 1 * Другое Игнорирование урона к (Атакующая боевая единица) игрока 0 Сильно косячит, на чрезвычайно быстрые атаки оно не успевает среагировать, и на атаки с большой задержкой, тоже не реагирует. Какие есть ещё способы среагировать точно до начала урона а не атаки?
Epselot добавил:
Hellcore, да я понял про что ты говоришь. Я сделал и так бы всё работает, но: "События Единица - Любая боевая единица начинает атаку" очень сильно косячит... Некоторое оружие пробивает сразу несмотря что вероятность 100% игнора урона, некоторое пробивает с допустим 5-7 выстрела, не понимаю логики... Конечно это лучше чем нечего, и можно вписать в игру даже нормально, но это всего лишь триггер, хочется логичности... А случаем нет нечего что может зафиксировать момент до факта воздействия эффекта урона? Или сделать эффект урона как то так чтоб его можно было отследить? |
07.12.2012, 22:40 | #7
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Epselot
offline
Опыт:
3,592Активность: |
Проделал много тестов, сделал вывод, триггер не способен уловить момент перед нанесением урона... Это печально, придётся извращаться... |
08.12.2012, 10:30 | #8
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
yellyex
offline
Опыт:
4,667Активность: |
Прочитав тему я не понял, что нужно автору. Где конкретное действие того, чего он хочет получить?
Каким образом надо, чтобы атакованная единица не получила урон?
Есть события Единица атакует или атакована и Единица получает урон.
Если надо, чтобы урон не наносился просто от атаки, то можно после того, как единица атакована или получает урон (смотря, что нужно) вешать алгоритм с поглощением урона на 100% и сразу после атаки снимать его.
Если надо, чтобы урон самой атаки был 0, то это с другой стороны юнит атакует вешать на атакующего юнита алгоритм с уменьшением урона на 100%. |
08.12.2012, 21:55 | #9
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Харгард
Epic
offline
Опыт:
7,829Активность: |
Это легко делается при помощи валидаторов в эффектах, наносящих урон.
Да, это может сделать способности сложнее, но это повод пересмотреть подход к их проектированию. |
08.12.2012, 23:39 | #10
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Epselot
offline
Опыт:
3,592Активность: |
Харгард, да я знаю что через эффекты делается всё идеально, вот только, хотелось сделать вероятность попадания в зависимости от расстояния, алгоритмов на атакующем и атакуемом юнита, от оружия, очень много факторов, а эффект как триггер не пропишешь... + У меня и так на оружии эффектов прилично... Правда я совсем не знаю о возможностях прописи в XML, не хочу трогать оружие, хочу попробовать на атакуемом юните сделать защиту, потому что 20 эффектов на 1 оружии это не гуд... |
09.12.2012, 08:28 | #11
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|