|
|
|
|
Триггер внутри триггера
|
|
FatalBlade | Дата: Воскресенье, 24 Июля 2011, 15:28:34 | Сообщение # 1 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Вот код который должен проверять, что если героя убил другой герой за 4 секунды или меньше, то владелец убийцы получает награду.
Code function Trig_x_Actions takes nothing returns nothing local integer prize if (( GetDyingUnit() == udg_QuickTaker ) and ( GetKillingUnitBJ() == udg_QuickCaster )) then set prize = ( 200 + ( ( GetHeroLevel(udg_QuickTaker) - GetHeroLevel(udg_QuickCaster) ) * 5 )) call AdjustPlayerStateBJ( prize, GetOwningPlayer(udg_QuickCaster), PLAYER_STATE_RESOURCE_GOLD ) call QuestMessageBJ( GetPlayersAll(), bj_QUESTMESSAGE_COMPLETED, ( ( "|c00D42D14" + ( GetPlayerName(GetOwningPlayer(udg_QuickCaster)) + "|r |c000C972Ehas succeeded in killing an enemy hero within 4 seconds!!! He recieves|r |c00D42D14" ) ) + ( I2S(prize) + ( "|r |c000C972Egold.|r " + "|r" ) ) ) ) endif endfunction
function InitTrig_x takes nothing returns nothing local trigger x = CreateTrigger( ) call DisableTrigger(x) call TriggerRegisterAnyUnitEventBJ(x, EVENT_PLAYER_UNIT_DEATH ) call TriggerAddAction(x, function Trig_x_Actions ) endfunction
function Trig_Quick_Kill_Actions takes nothing returns nothing local timer t local real tr if (( GetUnitLifePercent(GetAttackedUnitBJ()) >= 33.00 ) and ( IsUnitType(GetAttackedUnitBJ(), UNIT_TYPE_HERO) == true ) and ( IsUnitType(GetAttacker(), UNIT_TYPE_HERO) == true )) then set udg_QuickCaster = GetAttacker() set udg_QuickTaker = GetAttackedUnitBJ() set t = CreateTimer() call TimerStart(t,4, false, null) loop set tr = TimerGetRemaining(t) exitwhen tr <= 0 if (tr > bj_POLLED_WAIT_SKIP_THRESHOLD) then call TriggerSleepAction(0.1 * tr) else call TriggerSleepAction(bj_POLLED_WAIT_INTERVAL) endif endloop call DestroyTimer(t) set udg_QuickCaster = null set udg_QuickTaker = null call RemoveUnit(udg_QuickCaster) call RemoveUnit(udg_QuickTaker) endif endfunction
//=========================================================================== function InitTrig_Quick_Kill takes nothing returns nothing set gg_trg_Quick_Kill = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_Quick_Kill, EVENT_PLAYER_UNIT_ATTACKED ) call TriggerAddAction( gg_trg_Quick_Kill, function Trig_Quick_Kill_Actions ) endfunction
Я создал локальный триггер внутри триггера. Вопрос - как к этому триггеру обратиться? Есть функция call EnableTrigger(gg_trg_trigger), но это только к глобальным триггерам. Если я создаю локальный триггер например в переменную Х, а потом пишу call EnableTrigger(Х), то почему то он выдаёт ошибку. Как сначала разрешить локальный триггер, а потом после истечения таймера t запретить локальный триггер?
|
|
|
|
lawson | Дата: Воскресенье, 24 Июля 2011, 15:32:07 | Сообщение # 2 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| FatalBlade, Мда ну и код вообще ни чего не понятно столько TriggerSleepAction, что тутт вобще происходит. Сейчас я тебе сделаю нормальный триггер на таймер и убийство. Quote (FatalBlade) local trigger x = CreateTrigger( ) call DisableTrigger(x) сначала ты его создаешь а потом диактивируешь что за чушь? кто тебя так учил писать?
Добавлено (24-07-2011, 15:32) --------------------------------------------- Тоесть если герой убил героя а потом убил его еще раз за промежуток меньший 4 секунды то он получает бонус?
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Воскресенье, 24 Июля 2011, 15:33:30 |
|
|
|
FatalBlade | Дата: Воскресенье, 24 Июля 2011, 15:47:25 | Сообщение # 3 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Quote (lawson) Тоесть если герой убил героя а потом убил его еще раз за промежуток меньший 4 секунды то он получает бонус? Нет Если герой атаковал героя, и у атакованного героя ХП больше чем 33%, то активируется триггер 2 и включается таймер на 4 секунды. Триггер 2 проверяет, если герой которого атаковали в первом триггере, убит тем героем который его атаковал в первом триггере (то есть если герои те же самые), то убивающий получает награду. Через 4 секунды, когда истекает время таймера, триггер 2 деактивируется.
То есть если герой 1 атаковал героя 2 у которого ХП больше 33%, и затем в ближайшие 4 секунды именно герой 1 убил именно героя 2, то герой 1 получает награду.Добавлено (24-07-2011, 15:47) ---------------------------------------------
Quote (lawson) сначала ты его создаешь а потом диактивируешь что за чушь? кто тебя так учил писать? Ну типа триггер который изначально выключен
|
|
|
|
lawson | Дата: Воскресенье, 24 Июля 2011, 15:53:20 | Сообщение # 4 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Вот код но здесь тебе будет нужен хеш(создай хеш таблицу с название Hash) Code function GetNewTarget takes nothing returns nothing \\функция по удалению триггера если герой не успел убить за 4 секунды if (LoadTriggerHandle(Hash, GetHandleId(GetExpiredTimer()), 0) != null) then call DestroyTrigger(LoadTriggerHandle(Hash, GetHandleId(GetExpiredTimer()), 0)) endif call DestroyTimer(GetExpiredTimer()) endfunction
function NewDeath takes nothing returns nothing \\функция которая дает бонус если герой убил героя менее чем за 4 секунды после предыдущего убийства local unit QuickCaster = GetAttacker() call QuestMessageBJ( GetPlayersAll(), bj_QUESTMESSAGE_COMPLETED, ( ( "|c00D42D14" + ( GetPlayerName(GetOwningPlayer(QuickCaster)) + "|r |c000C972Ehas succeeded in killing an enemy hero within 4 seconds!!! He recieves|r |c00D42D14" ) ) + ( I2S(200) + ( "|r |c000C972Egold.|r " + "|r" ) ) ) ) set QuickCaster = null call DestroyTrigger(GetTriggeringTrigger()) endfunction
function Trig_g_Conditions takes nothing returns boolean return IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) == true endfunction
function Trig_g_Actions takes nothing returns nothing local timer t = CreateTimer() local trigger tg = CreateTrigger() call TimerStart(t, 4, false, function GetNewTarget) call TriggerRegisterUnitEvent(tg, GetAttacker(), EVENT_UNIT_DEATH) call TriggerAddCondition(tg, Condition(function Trig_g_Conditions)) call TriggerAddAction(tg, function NewDeath) call SaveTriggerHandle(Hash, GetHandleId(t), 0, tg) set t = null set tg = null endfunction
//=========================================================================== function InitTrig_g takes nothing returns nothing set gg_trg_g = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_g, EVENT_PLAYER_UNIT_DEATH ) call TriggerAddCondition( gg_trg_g, Condition( function Trig_g_Conditions ) ) call TriggerAddAction( gg_trg_g, function Trig_g_Actions ) endfunction Извиняюсь за QuestMessageBJ нету времени его раскрывать. Ну а дальше какой ты хочешь бонус дать герою сделаешь сам.
Добавлено (24-07-2011, 15:53) --------------------------------------------- Quote (FatalBlade) То есть если герой 1 атаковал героя 2 у которого ХП больше 33%, и затем в ближайшие 4 секунды именно герой 1 убил именно героя 2, то герой 1 получает награду. Пиндец ты мог раньше написать я уже триггер успел сделать. Пфф сейчас сделаю заново.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Воскресенье, 24 Июля 2011, 15:55:56 |
|
|
|
FatalBlade | Дата: Воскресенье, 24 Июля 2011, 15:56:36 | Сообщение # 5 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Quote (lawson) Пиндец ты мог раньше написать я уже триггер успел сделать. Пфф сейчас сделаю заново. Хоть бы спасибо сказал. Спасибо) Но ты так сразу начал его делать что я даже не успел написать)
|
|
|
|
lawson | Дата: Воскресенье, 24 Июля 2011, 16:14:08 | Сообщение # 6 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Вот код в общем то он не изминился но тебе нужна будет переменная хеш таблица с название Hash без udg Code function GetNewTarget takes nothing returns nothing if (LoadTriggerHandle(Hash, GetHandleId(GetExpiredTimer()), 0) != null) then call DestroyTrigger(LoadTriggerHandle(Hash, GetHandleId(GetExpiredTimer()), 0)) endif call FlushChildHashtable(Hash, GetHandleId(GetExpiredTimer())) call DestroyTimer(GetExpiredTimer()) endfunction
function NewDeath takes nothing returns nothing local unit QuickCaster = GetAttacker()
if (QuickCaster == LoadUnitHandle(Hash, GetHandleId(GetTriggeringTrigger()), 0)) then call QuestMessageBJ( GetPlayersAll(), bj_QUESTMESSAGE_COMPLETED, ( ( "|c00D42D14" + ( GetPlayerName(GetOwningPlayer(QuickCaster)) + "|r |c000C972Ehas succeeded in killing an enemy hero within 4 seconds!!! He recieves|r |c00D42D14" ) ) + ( I2S(200) + ( "|r |c000C972Egold.|r " + "|r" ) ) ) ) endif
set QuickCaster = null call FlushChildHashtable(Hash, GetHandleId(GetTriggeringTrigger())) call DestroyTrigger(GetTriggeringTrigger()) endfunction
function Trig_g_Conditions takes nothing returns boolean return IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) == true endfunction
function Trig_g_Actions takes nothing returns nothing local timer t = CreateTimer() local trigger tg = CreateTrigger() if (GetUnitStatePercent(GetTriggerUnit(), UNIT_STATE_LIFE, UNIT_STATE_MAX_LIFE) <= 33) then call TimerStart(t, 4, false, function GetNewTarget) call TriggerRegisterUnitEvent(tg, GetTriggerUnit(), EVENT_UNIT_DEATH) call TriggerAddAction(tg, function NewDeath) call SaveTriggerHandle(Hash, GetHandleId(t), 0, tg) call SaveUnitHandle(Hash, GetHandleId(tg), 0, GetAttacker()) endif set t = null set tg = null endfunction
//=========================================================================== function InitTrig_g takes nothing returns nothing set gg_trg_g = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_g, EVENT_PLAYER_UNIT_ATTACKED ) call TriggerAddCondition( gg_trg_g, Condition( function Trig_g_Conditions ) ) call TriggerAddAction( gg_trg_g, function Trig_g_Actions ) endfunction Здесь две утечки но я не уделял время для их раскрытия. Так что потом если код будет работать так как надо я его доделаю.
Добавлено (24-07-2011, 16:14) --------------------------------------------- В функции NewDeath там укажешь твой бонус который дается герою. здесь ни надо ни каких глобалок только хеш таблица все остально делат код.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Воскресенье, 24 Июля 2011, 16:14:37 |
|
|
|
FatalBlade | Дата: Воскресенье, 24 Июля 2011, 16:17:44 | Сообщение # 7 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Quote (lawson) переменная хеш таблица с название Hash без udg ??? Это как? Где её создать?
|
|
|
|
lawson | Дата: Воскресенье, 24 Июля 2011, 16:20:26 | Сообщение # 8 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Quote (FatalBlade) Это как? Где её создать? В триггер где написано Вставьте нестандартный код триггера там внизу пишеь hashtable Hash = InitHashtable() и все.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
|
|
|
|
FatalBlade | Дата: Воскресенье, 24 Июля 2011, 16:22:15 | Сообщение # 9 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Custom Script Code? Но там ведь глобальные переменные.
|
|
|
|
lawson | Дата: Воскресенье, 24 Июля 2011, 16:30:25 | Сообщение # 10 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| FatalBlade, Мда ладно сечас скрин скину.
Добавлено (24-07-2011, 16:30) ---------------------------------------------
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Воскресенье, 24 Июля 2011, 16:30:36 |
|
|
|
FatalBlade | Дата: Воскресенье, 24 Июля 2011, 16:30:37 | Сообщение # 11 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Ок спс)
Quote (lawson) call SaveTriggerHandle(Hash, GetHandleId(t), 0, tg) call SaveUnitHandle(Hash, GetHandleId(tg), 0, GetAttacker()) А ты уверен что код работает? Разве можно сохранять в 1 ячейку 2 переменные?
|
|
|
|
lawson | Дата: Воскресенье, 24 Июля 2011, 16:31:55 | Сообщение # 12 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Quote (FatalBlade) call SaveTriggerHandle(Hash, GetHandleId(t), 0, tg) для перменной t Quote (FatalBlade) call SaveUnitHandle(Hash, GetHandleId(tg), 0, GetAttacker()) для переменной tg
Добавлено (24-07-2011, 16:31) ---------------------------------------------
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Воскресенье, 24 Июля 2011, 16:32:09 |
|
|
|
FatalBlade | Дата: Воскресенье, 24 Июля 2011, 16:33:41 | Сообщение # 13 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Quote (lawson) Здесь две утечки но я не уделял время для их раскрытия.
Таймер и триггер (t и tg) ?
|
|
|
|
lawson | Дата: Воскресенье, 24 Июля 2011, 16:34:31 | Сообщение # 14 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| нет потом объясню где.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Воскресенье, 24 Июля 2011, 16:34:58 |
|
|
|
FatalBlade | Дата: Воскресенье, 24 Июля 2011, 16:36:11 | Сообщение # 15 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| globals hashtable Hash = InitHashtable() endglobals
Пишет ошибку Expected End of Line
|
|
|
|
lawson | Дата: Воскресенье, 24 Июля 2011, 16:37:44 | Сообщение # 16 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Сейчас ухожу буду вечером, скажешь сработал код или нет.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Воскресенье, 24 Июля 2011, 16:37:55 |
|
|
|
FatalBlade | Дата: Воскресенье, 24 Июля 2011, 17:59:46 | Сообщение # 17 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Я написал так как у тебя на скрине, а он выдаёт аж 3 ошибки Expected end of lineДобавлено (24-07-2011, 17:59) --------------------------------------------- Блин а есть другие варианты, без Хэштейблов?
|
|
|
|
lawson | Дата: Воскресенье, 24 Июля 2011, 20:25:40 | Сообщение # 18 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| FatalBlade, у тебя жнпг стоит? Добавлено (24-07-2011, 20:25) ---------------------------------------------
Quote (FatalBlade) Блин а есть другие варианты, без Хэштейблов? Есть вариант с глобалками но этот вариант подходит только для одного героя. Еще есть варинт со структурами но это еще сложней чем использовать хеш.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
|
|
|
|
FatalBlade | Дата: Воскресенье, 24 Июля 2011, 20:26:20 | Сообщение # 19 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Ну вот недавно поставил, но я в самих Хэшах не разобрался. Пока пробую другой вариант - с массивами.
|
|
|
|
Faion | Дата: Воскресенье, 24 Июля 2011, 22:12:06 | Сообщение # 20 |
10 уровень
Группа: Проверенные
Сообщений: 1894
Награды: 0
Репутация: 430
Блокировки:
| lawson, у тебя ж стоит cjass вроде. а если стоит, то не над писать глобалс, и можно объявлять совершенно в любом месте.
О нас думают плохо лишь те, кто хуже нас, а те кто лучше нас... Им просто не до нас. My Project: Nindogatari MAL
|
|
|
|
lawson | Дата: Воскресенье, 24 Июля 2011, 22:31:23 | Сообщение # 21 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Quote (Faion) у тебя ж стоит cjass вроде Не у меня нету cjass
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Воскресенье, 24 Июля 2011, 22:31:39 |
|
|
|
|
|
|
|
|
|
|