XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Барахолка
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
Отлов физического урона (CHS)

Система отлова физического урона

Всем известно что есть такая проблема при создании триггерных башей, критов, и прочих пассивных способностей как проверка получил ли юнит урон или нет.
Сheck Hits system или система отлова физического урона полностью решает эту проблему...
((код jass
function CheckHit takes unit attacker, unit target, string animation, string func returns nothing
))
данная функция проверит получил ли удар юнит target от юнита attacker и если да то выполнит код функции func...
(аргумент animation заставит атаковавшего юнита проиграть нужную анимацию при ударе)
Для того чтобы получить ссылки на атаковавшего и атакованного юнитов из функции func используются функции:
((код jass
function GetDamager takes nothing returns unit
и
function GetTarget takes nothing returns unit
))
Чтобы узнать количество нанесённого урона, используется функция:
((код jass
function GetEventDamageBJ takes nothing returns real
))
Если вам понадобится хешnаблица инициализированная в библиотеке, то используйте функцию:
((код jass
function Get_CHS_Hash takes nothing returns hashtable
))
ВАЖНО в качестве аргумента func используется имя функции, которая не должна иметь не входных не выходных аргументов, хотя положение функции func в скрипте не играет ни какой роли.
» код системы
((код jass
library CHS initializer InitHash
============================================================================================
Автор: quq_CCCP, Сделано для сайте XGM.RU
Даёт функции: CheckHis, GetDamager, GetTarget
Суть проста как грабли, функция CheckHis проверяет получил ли юнит А урон от физ. атаки
от юнита B, и если получил то запускается указанная вами функция.
GetDamager, GetTarget нужны для того чтобы в вашей функции получи ссылки на атаковашего и
атакованного юнита соответсвенно.
============================================================================================
globals
укажите равкоды сплбука и баффов по которым будит проводится проверка
private integer bj_DAMAGE_CHECK_ABILITY = 'A000'
private integer bj_DAMAGE_CHECK_BUFF_A = 'B000'
private integer bj_DAMAGE_CHECK_BUFF_B = 'B001'
private real bj_UNIT_ATTACK_RATE = 1.50 промежуток времини через который будет удалён триггер, если был промах.
далее находятся переменныен системы, их лучше не трогать!
=======================================================================
private timer bj_TRIGGER_LIFE_TIMER
private trigger bj_CHECK_HIT_TRIGGER
private hashtable bj_HASHTABLE
private integer bj_TIMER_ID
private integer bj_TRIGGER_ID
private unit bj_Damager
private unit bj_Target
private real bj_EventDamage
endglobals
private function InitHash takes nothing returns nothing
local integer nIndex = 0
loop
exitwhen nIndex > 15
call SetPlayerAbilityAvailable( Player( nIndex ), bj_DAMAGE_CHECK_ABILITY, false )
set nIndex = nIndex + 1
endloop
set bj_HASHTABLE = InitHashtable( )
endfunction

private function RemoveTrigger takes nothing returns nothing
set bj_TRIGGER_LIFE_TIMER = GetExpiredTimer( )
set bj_TIMER_ID = GetHandleId( bj_TRIGGER_LIFE_TIMER )
set bj_CHECK_HIT_TRIGGER = LoadTriggerHandle( bj_HASHTABLE, bj_TIMER_ID, 0 )
set bj_TRIGGER_ID = GetHandleId(bj_CHECK_HIT_TRIGGER)

call DestroyTimer( bj_TRIGGER_LIFE_TIMER )

if bj_CHECK_HIT_TRIGGER != null then
call TriggerClearActions( bj_CHECK_HIT_TRIGGER )
call TriggerClearConditions( bj_CHECK_HIT_TRIGGER )
call DestroyTrigger( bj_CHECK_HIT_TRIGGER )
call UnitRemoveAbility( LoadUnitHandle( bj_HASHTABLE, bj_TRIGGER_ID, 0 ), bj_DAMAGE_CHECK_ABILITY )
call FlushChildHashtable( bj_HASHTABLE, bj_TRIGGER_ID )
endif

call FlushChildHashtable( bj_HASHTABLE, bj_TIMER_ID )
endfunction

function GetDamager takes nothing returns unit
return bj_Damager
endfunction
function GetTarget takes nothing returns unit
return bj_Target
endfunction

function GetEventDamageBJ takes nothing returns real
return bj_EventDamage
endfunction

function Get_CHS_Hash takes nothing returns hashtable
return bj_HASHTABLE
endfunction

private function Trig_IsEnemyDamaged_Conditions takes nothing returns boolean
return GetEventDamageSource( ) == LoadUnitHandle( bj_HASHTABLE, GetHandleId( GetTriggeringTrigger( ) ), 0 ) and (GetUnitAbilityLevel( GetTriggerUnit( ), bj_DAMAGE_CHECK_BUFF_B ) > 0 or GetUnitAbilityLevel( GetTriggerUnit( ), bj_DAMAGE_CHECK_BUFF_B ) > 0)
endfunction
private function Trig_DamageEvented_Actions takes nothing returns nothing
задаём значение переменных
set bj_Damager = GetEventDamageSource( )
set bj_Target = GetTriggerUnit( )
set bj_CHECK_HIT_TRIGGER = GetTriggeringTrigger( )
set bj_TRIGGER_ID = GetHandleId( bj_CHECK_HIT_TRIGGER )
set bj_EventDamage = GetEventDamage( )
вызываем функцию которую мы установили
call ExecuteFunc( LoadStr( bj_HASHTABLE, bj_TRIGGER_ID, 1 ) )
отключам триггер
call DisableTrigger( bj_CHECK_HIT_TRIGGER )
удаляем всё ненужное
call UnitRemoveAbility( bj_Target, bj_DAMAGE_CHECK_BUFF_A ) удаляем бафф N 1 с цели
call UnitRemoveAbility( bj_Target, bj_DAMAGE_CHECK_BUFF_B ) удаляем бафф № 2 с цели
call UnitRemoveAbility( bj_Damager, bj_DAMAGE_CHECK_ABILITY ) удаляем спеллбук у атаковавшего, там + скорости атаки и яд
сектор удаляение триггра и очистка памяти хешьтаблицы
call FlushChildHashtable( bj_HASHTABLE , bj_TRIGGER_ID ) чистим хеш, там сохрянён атакер
call TriggerClearActions( bj_CHECK_HIT_TRIGGER ) удялем деиствия
call TriggerClearConditions( bj_CHECK_HIT_TRIGGER ) удяляем условия
call DestroyTrigger( bj_CHECK_HIT_TRIGGER ) удаляем триггер
endfunction
function CheckHit takes unit attacker, unit target, string animation, string func returns nothing
set bj_CHECK_HIT_TRIGGER = CreateTrigger( )
set bj_TRIGGER_LIFE_TIMER = CreateTimer( )
set bj_Damager = null
set bj_Target = null
даём атаковавшему впомогательные скилы и устанавливаем анимацию
call UnitAddAbility( attacker, bj_DAMAGE_CHECK_ABILITY )
call SetUnitAnimation( attacker, animation )
задаём триггеру собыите, условие и деиствие...
call TriggerRegisterUnitEvent( bj_CHECK_HIT_TRIGGER, target, EVENT_UNIT_DAMAGED )
call TriggerAddCondition( bj_CHECK_HIT_TRIGGER, Condition( function Trig_IsEnemyDamaged_Conditions ) )
call TriggerAddAction( bj_CHECK_HIT_TRIGGER, function Trig_DamageEvented_Actions )
сохраняем необходимые данные в Хеш
call SaveTriggerHandle( bj_HASHTABLE, GetHandleId( bj_TRIGGER_LIFE_TIMER ), 0, bj_CHECK_HIT_TRIGGER )
call SaveUnitHandle( bj_HASHTABLE, GetHandleId( bj_CHECK_HIT_TRIGGER ), 0, attacker )
call SaveStr( bj_HASHTABLE, GetHandleId( bj_CHECK_HIT_TRIGGER ), 1, func )
запускаем таймер да случай если юнит не нанесёт урона, чтобы удалить триггер.
call TimerStart( bj_TRIGGER_LIFE_TIMER, bj_UNIT_ATTACK_RATE, false, function RemoveTrigger )
set bj_CHECK_HIT_TRIGGER = null
endfunction
endlibrary
))

Для работы системы необходимо

  1. JNGP Jass New Gen Pack 5 D
  2. 2 способности, первая из которых Спеллбук а вторая Отравленное оружие, а так же 2 баффа для Отравленное оружие
  3. Правильно указать Равкоды способностей и баффов при настройке библиотеки
  4. Умение внимательно читать инструкцию
Теперь есть версия без баффов, проверка нанесён ли урон производится, с помощью дамми юнита, но его необходимо настраивать под конкретного героя (героев), тк анимация атаки должна совпадать, ное сть и плюсы, не коем образом не затрагивает орб-эффекты.
в качестве способности 'A000' можно использовать любые пассивные способности дающие баффы
Использование баша не рекомендуется
параметры способностей а так же работу системы можно просмотреть в карте примере
Прикрепленные файлы
Тип файла: w3x damage check system.w3x (21.5 Кбайт, 36 просмотров )
Тип файла: w3x CHS no Buff.w3x (21.5 Кбайт, 24 просмотров )

Отредактировано quq_CCCP, 12.06.2012 в 13:22.
Старый 11.06.2012, 14:03
Doc

offline
Опыт: 63,163
Активность:
То, что используется орб эффект/бафф плейсер нормально?
Намного проще сделать все абилки триггерным и не будет никаких проблем.
Старый 11.06.2012, 14:06
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
Doc, ну кому как, бафф плейсер не влияет на большинство орбов, и не взвывает головной боли...
Главное удобно, для создании я кучи триггерных пассивок на подобии критов. башей, сплешей и тд.
Старый 11.06.2012, 14:10
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
я тоже подобное использую, но только, у меня всё в одном триггере
лучше бы кста те запилил бы полностью систему на получение урона, со своими критами, блоками урона, и т.п, пользы больше, учитывая что то что у тебя здесь можно было бы в неё вставить
Старый 11.06.2012, 14:32
Doc

offline
Опыт: 63,163
Активность:
quq_CCCP, "buff placers do not stack"?
Старый 11.06.2012, 14:43
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
16GB, у меня есть карта с 4 разными пассивками основанными на этой системе
quq_CCCP добавил:
Doc, ну это не то, они просто 1 заменяет другой, а не то что не будет робить... тут насрать на то что у героя есть другие орбы типа вампиризма или поизон атаки...
Старый 11.06.2012, 14:45
просто Юрок
...
offline
Опыт: 11,271
Активность:
У тебя в описании не JNGP, а JGNP
Старый 11.06.2012, 15:09
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
просто Юрок, ну поправлю, ожидал отзыв о самой систем о ни описании...
Старый 11.06.2012, 15:13
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
Мда а редактировать то уже нельзя, а нужно еще добавить 2 функции которые возвращают полученный и нанесённый урон...
Старый 11.06.2012, 18:35
Doc

offline
Опыт: 63,163
Активность:
С чего бы это нельзя?
Старый 11.06.2012, 19:00
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
Вроде запретили же, или тока на сайте нельзя редактировать сообщения?
Старый 11.06.2012, 19:04
Raised
Rid-Aid-Ios
offline
Опыт: 20,792
Активность:
JNGP, 2 способности, первая из которых Спеллбук а вторая Отравленное оружие, а так же 2 баффа, нужно указывать Равкоды способностей и баффов - столько мороки, даже с использованием JNGP, а я почему то думал, что на Jass'e можно отловить не только полученный урон, но и его тип и даже тип защиты, ниужели это и на самом деле столь сложно? . . Пришлось самому пробовать сделать подобную систему на GUI, но тоже не без извращений. . .
Старый 06.08.2012, 20:26
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
D_Konst, ну это всё не так просто, по одной простой причине - Эта систмема не твоя гуишка на 1 юнита а на множество разных юнитов, причём одновременно...
Для особо одарённых, тут проверяется сам факт физической атаки, попал или не попал а не тупое сравнение от кого был получен урон...
Поэтому тут 2 варианта, сравнивать наличие баффа и урон юнита, или урон от стороннего юнита который имеет ту же скорость снаряда и параметры анимации атаки, и атакует синхронно с твоим юнитом...
Старый 07.08.2012, 05:22
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 00:09.