quq_CCCP
Я белый и пушистый!
offline
Опыт:
94,185Активность: |
Отлов физического урона (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 )) Для работы системы необходимо
в качестве способности 'A000' можно использовать любые пассивные способности дающие баффы Использование баша не рекомендуется параметры способностей а так же работу системы можно просмотреть в карте примере Отредактировано quq_CCCP, 12.06.2012 в 13:22. |
11.06.2012, 14:03 | #1
+1/−1
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Doc
offline
Опыт:
63,163Активность: |
То, что используется орб эффект/бафф плейсер нормально? Намного проще сделать все абилки триггерным и не будет никаких проблем. |
11.06.2012, 14:06 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
quq_CCCP
Я белый и пушистый!
offline
Опыт:
94,185Активность: |
Doc, ну кому как, бафф плейсер не влияет на большинство орбов, и не взвывает головной боли... Главное удобно, для создании я кучи триггерных пассивок на подобии критов. башей, сплешей и тд. |
11.06.2012, 14:10 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
16GB
GhostOne User
offline
Опыт:
60,317Активность: |
я тоже подобное использую, но только, у меня всё в одном триггере лучше бы кста те запилил бы полностью систему на получение урона, со своими критами, блоками урона, и т.п, пользы больше, учитывая что то что у тебя здесь можно было бы в неё вставить |
11.06.2012, 14:32 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Doc
offline
Опыт:
63,163Активность: |
quq_CCCP, "buff placers do not stack"? |
11.06.2012, 14:43 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
quq_CCCP
Я белый и пушистый!
offline
Опыт:
94,185Активность: |
|
11.06.2012, 14:45 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
просто Юрок
...
offline
Опыт:
11,271Активность: |
У тебя в описании не JNGP, а JGNP |
11.06.2012, 15:09 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
quq_CCCP
Я белый и пушистый!
offline
Опыт:
94,185Активность: |
просто Юрок, ну поправлю, ожидал отзыв о самой систем о ни описании... |
11.06.2012, 15:13 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
quq_CCCP
Я белый и пушистый!
offline
Опыт:
94,185Активность: |
Мда а редактировать то уже нельзя, а нужно еще добавить 2 функции которые возвращают полученный и нанесённый урон... |
11.06.2012, 18:35 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Doc
offline
Опыт:
63,163Активность: |
С чего бы это нельзя? |
11.06.2012, 19:00 | #10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
quq_CCCP
Я белый и пушистый!
offline
Опыт:
94,185Активность: |
Вроде запретили же, или тока на сайте нельзя редактировать сообщения? |
11.06.2012, 19:04 | #11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Raised
Rid-Aid-Ios
offline
Опыт:
20,792Активность: |
JNGP, 2 способности, первая из которых Спеллбук а вторая Отравленное оружие, а так же 2 баффа, нужно указывать Равкоды способностей и баффов - столько мороки, даже с использованием JNGP, а я почему то думал, что на Jass'e можно отловить не только полученный урон, но и его тип и даже тип защиты, ниужели это и на самом деле столь сложно? . . Пришлось самому пробовать сделать подобную систему на GUI, но тоже не без извращений. . . |
06.08.2012, 20:26 | #12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
quq_CCCP
Я белый и пушистый!
offline
Опыт:
94,185Активность: |
D_Konst, ну это всё не так просто, по одной простой причине - Эта систмема не твоя гуишка на 1 юнита а на множество разных юнитов, причём одновременно... Для особо одарённых, тут проверяется сам факт физической атаки, попал или не попал а не тупое сравнение от кого был получен урон... Поэтому тут 2 варианта, сравнивать наличие баффа и урон юнита, или урон от стороннего юнита который имеет ту же скорость снаряда и параметры анимации атаки, и атакует синхронно с твоим юнитом... |
07.08.2012, 05:22 | #13
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|