Не могу создать систему отлова урона при атаке, событии-Атакован
Помогите пожалуйста, мне очень нужна ваша помощь. Всё перерыл, ни где нету достоверной информации, а если юзать jass то эта морокка, не совсем его понимаю

Лучший ответ:
Кирилл4, на jass есть, вот пример
Для начала тебе хватит, есть более продвинутые системы.



Просмотров: 431

Naadir #1 - 6 месяцев назад (отредактировано ) 0
Первый триггер:
Событие: Юнит вошёл на карту.
Действие: Добавить событие "юнит атакован" во второй триггер.

Второй триггер:
Действие: Если DamageTaken>0
То Написать DamageTaken в чат.



Ну как-то так в двух словах.
quq_CCCP #2 - 6 месяцев назад (отредактировано ) 0
Кирилл4, так то они уже созданы, но пока не выучил что к чему - забудь, кода много он сложный и ресусоёмкий.
Fakov #3 - 6 месяцев назад 1
Вопроса понял нихрена.
Уточнитесь.
PyCCKuu_4eJl #4 - 6 месяцев назад (отредактировано ) 0
Naadir:
Первый триггер:
Событие: Юнит вошёл на карту.
Действие: Добавить событие "юнит атакован" во второй триггер.

Второй триггер:
Действие: Если DamageTaken>0
То Написать DamageTaken в чат.



Ну как-то так в двух словах.
Событие - Конкретный юнит получает урон.( НЕ атакован! - ибо отлавливается в момент отдачи приказа атаковать, и может быть забагано простым застопыванием )
Дальше конвертируешь это в текст, и заменяешь Конкретного юнита на глобалку, или на юнита, стоящего на карте (если это даммик, и нужна инфа по всему урону)
Вот мой отлавлятор:
function t2a takes nothing returns nothing
    local unit u = GetEventDamageSource() // Кто нанёс урон (имя)
    local real r = GetEventDamage() // Сколько урона
    call BJDebugMsg(GetUnitName(u)+" = Attacker") // Отображение игроку
    call BJDebugMsg(R2S(r)+" = Damage") // Отображение игроку
endfunction

//===========================================================================
function InitTrig_t2 takes nothing returns nothing
    local unit u = gg_unit_H000_0000 // Вот наш юнит, можешь заменить на глобалку
    set gg_trg_t2 = CreateTrigger()
    call TriggerRegisterUnitEvent(gg_trg_t2,u,EVENT_UNIT_DAMAGED) //Юнит продамажен
    call TriggerAddAction( gg_trg_t2, function t2a )
endfunction
Можешь добавить по типу атакованного юнита (Отображать только боссов/хероев/крипов), или по имеющейся у Атакующего конкретной абилки
...
Пропала кнопочка "Редактировать"
Случайно удалил кусок оптимизации:
function t2a takes nothing returns nothing
    local unit u = GetEventDamageSource() // Кто нанёс урон (имя)
    local real r = GetEventDamage() // Сколько урона
    call BJDebugMsg(GetUnitName(u)+" = Attacker") // Отображение игроку
    call BJDebugMsg(R2S(r)+" = Damage") // Отображение игроку
	set u = null  // Это вот должно быть тут
endfunction

//===========================================================================
function InitTrig_t2 takes nothing returns nothing
    local unit u = gg_unit_H000_0000 // Вот наш юнит, можешь заменить на глобалку
    set gg_trg_t2 = CreateTrigger()
    call TriggerRegisterUnitEvent(gg_trg_t2,u,EVENT_UNIT_DAMAGED) //Юнит продамажен
    call TriggerAddAction( gg_trg_t2, function t2a )
endfunction
Naadir #5 - 6 месяцев назад 0
PyCCKuu_4eJl, там чувак написал, что не может в jass. Я описал на GUI алгоритм. Застапывание -- как бы фиг с ним. На достойном уровне на GUI его не обойти.
Raised #6 - 6 месяцев назад 0
Событие: инициализация карты
Действие:
Цикл: выбрать всех юнитов в пределах игровой карты и для каждого совершите действие:
Действие в цикле: добавить в триггер [твой триггер] событие "выбранный юнит получил урон"
Ну а дальше в [твоем триггере] пишешь условия и действия. Но это не будет работать на саммонов и триггерно созданных юнитов, потому нужен еще один триггер:
Событие: юнит вошел в область игровой карты
Действие: добавить в триггер [твой триггер] событие "входящий юнит юнит получил урон"
ClotPh #7 - 6 месяцев назад 0
PyCCKuu_4eJl, set u = null и внизу тогда лучше поставить
хотя, учитывая, что инициализация один раз, не так важно
Кирилл4 #8 - 6 месяцев назад 0
PyCCKuu_4eJl, Спасибо за код, но вот казус. Когда я заменяю сет в локалке (local unit u = gg_unit_H000_0000) на (local unit u = GetAttackedUnitBJ() ) ничего не работает...
Hanabishi #9 - 6 месяцев назад 0
Кирилл4, пользуйтесь поиском, наработки есть. Например xgm.guru/p/wc3/catch-dmg
ClotPh #10 - 6 месяцев назад 0
Кирилл4, а как бы оно, интересно, должно было работать
откуда триггер до регистрации события атакованного возьмет?
Кирилл4 #11 - 6 месяцев назад 0
ClotPh:
Кирилл4, а как бы оно, интересно, должно было работать
откуда триггер до регистрации события атакованного возьмет?
Ну помоги плиз, если не в лом. Мне кажется, что я близок к истине.
quq_CCCP #12 - 6 месяцев назад 0
Кирилл4, есть готовые системы на эту тему, гугл в помощь.
Кирилл4 #13 - 6 месяцев назад 0
quq_CCCP:
Кирилл4, есть готовые системы на эту тему, гугл в помощь.
Имхо их много, но толкового ничего нету, гуи не хочется использовать..
quq_CCCP:
Мне просто срочно нужно это, так я хоть буду иметь большое и дальнейшей представление о том как он отлавливается, разжуйте мне пожалуйста
quq_CCCP #14 - 6 месяцев назад 1

Кирилл4, на jass есть, вот пример
Для начала тебе хватит, есть более продвинутые системы.
Raised #15 - 6 месяцев назад 0
Вот тебе простейший пример на GUI.
прикреплены файлы
quq_CCCP #16 - 6 месяцев назад 2
~~
Мне просто срочно нужно это, так я хоть буду иметь большое и дальнейшей представление о том как он отлавливается, разжуйте мне пожалуйста
Что значит как? Это помойму разжевано везде, но блин в сотый раз...
Нельзя просто так узнать кто кого ударил, вот нету такой функции, о том что один юнит ударил руками другого мы можем узнать лишь косвенно (в коде), т.к у нас есть событие - юнит атакован, которое срабатывает когда юнит начал атаку, еще даже не махнул ручками а просто сагрился на цель - уже сработало событие, при этом неважно ударит он или промажет, или цель вовсе к тому моменту умрет...
Ну у нас еще есть событие - юнит получает урон, оно не так удобно - т.к требует конкретно указанного юнита в отличии от события "юнит атакован", которе можно повешать на всех юнитов игрока ( EVENT_PLAYER_UNIT_ATTACKED), что удобнее т.к такое событие будет работат на всех юнитов указанного игрока и существующих и созданных в процессе игры.... Ну вернемся к событию - "юнит получает урон", оно срабатывает на фрейм ранее от того момента как юнит потеряет хп от урона, срабатывает на любой урон полученный указанным юнитом, проверить приэтом мы можем лишь кол-во урона (функция GetEventDamage()), источник урона (GetEventDamageSource()) ну и тот кто получил урон (GetTriggerUnit()), понять прост так нельзя урон это от атаки, от спелла или от баффа (вредные баффы наносят 0 урона при появлении и потере).
Далее уже люди реализуют проверки на тип урона с помощью костылей, тот пример что я тебе дал использует оба событие, когда юнит атакован - включается событие юнит получает урон, если после события атаки сработает событие урона - считай был удар, но это слишком багано, т.к сущетсуют промахи и другие источники урона.
Еще есть способ отличить физический урон от магического - сделать его отрицательным, вручая тому у кого будем отлавливать физ атаки, суть - рунные браслеты с фактором сниженного урона 2, весь магический урон полученный юнитом будет отрецательным, а положительным будет только чистый и физический (чистый в стандартных способностях практически не втречается, как и физический) ну а далее все просто, лечение от маг урона уберается так же триггерно, сначала ждем таймером 0.00 сек, потом возвращаем юниту хп которое было до отрец урона и тут же наносим ему еще урон маг типа, забирая пассивку резиста и отключая триггер, таким образом мы вернем все наместо и юнит получит маг урон в полном размере, как и должен без лечения (т.е мы блокируем лечение от отрец урона), ну а далее снова вручаем пассивку и врубаем триггер, дейтсвуем поновой....