Сейчас 17:43:06 Четверг, 28 ноября, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
Триггер внутри триггера
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
 

  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz