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


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » Вопросы по картостроению » Ошибка в триггере, бесконечно наносится урон
Ошибка в триггере, бесконечно наносится урон
SmartarosДата: Пятница, 03 Августа 2012, 20:52:24 | Сообщение # 1
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
У меня есть джас триггер, который при атаке героя создает другой триггер на получение урона атакованным. В создаваемом триггер есть действие на нанесение урона атакованному, тут воззревает ошибка, так как урон наносится бесконечно. Сделал в первом триггере, что при атаке, кастом вэлью атакующего становится равным нулю, в создаваемом триггере условие, что кастом вэлью атакующего должен быть равным нулю, и перед действием на нанесение урона кастом вэлью устанавливаю равным единице, но почему то все равно ошибка. Как иначе решить эту проблему?
 

GameprOДата: Пятница, 03 Августа 2012, 21:00:49 | Сообщение # 2
7 уровень
Группа: Проверенные
Сообщений: 422
Награды: 0
Репутация: 76
Блокировки:
Smartaros,
Перед нанесением урона сделай "Выключить "этот триггер""
После урона сделай "Включить "этот триггер""



Всё гениальное - просто, но не всё простое - гениально...
 

SmartarosДата: Пятница, 03 Августа 2012, 21:07:38 | Сообщение # 3
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
не работает, это джасс
 

kapa6acvlkДата: Пятница, 03 Августа 2012, 21:28:17 | Сообщение # 4
Группа: Проверенные
Сообщений: 612
Награды: 0
Репутация: 361
Блокировки:
Smartaros, Выложи код


Как говориться, не обязательно есть всю кучу говна, чтобы понять, что она однородна.
© Александр Зорич
 

SmartarosДата: Пятница, 03 Августа 2012, 21:44:45 | Сообщение # 5
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
Code
function Trig_ProlomDo_Conditions takes nothing returns boolean
     if ( not ( GetUnitAbilityLevelSwapped('A0F6', GetAttacker()) > 0 ) ) then
         return false
     endif
     return true
endfunction

function Trig_ProlomDo_Func01 takes nothing returns boolean
     return ( GetUnitUserData(GetEventDamageSource()) == 0 )
endfunction

function Trig_ProlomDo_Func02 takes nothing returns nothing
     set udg_Bezlikij_point[2] = GetUnitLoc(GetEventDamageSource())
     call CreateNUnitsAtLoc( 1, 'n02K', GetOwningPlayer(GetEventDamageSource()), udg_Bezlikij_point[2], bj_UNIT_FACING )
     call RemoveLocation (udg_Bezlikij_point[2])
     call UnitAddAbilityBJ( 'A0F7', GetLastCreatedUnit() )
     call SetUnitAbilityLevelSwapped( 'A0F7', GetLastCreatedUnit(), GetUnitAbilityLevelSwapped('A0F6', GetEventDamageSource()) )
     call IssueTargetOrder( GetLastCreatedUnit(), "innerfire", udg_Bezlikij[1] )
     call RemoveUnit( GetLastCreatedUnit() )
     call SetUnitUserData( GetEventDamageSource(), 1 )
     call DisableTrigger( udg_Prolom_trigger )
     call UnitDamageTargetBJ( GetEventDamageSource(), udg_Bezlikij[1], ( 20.00 * I2R(GetUnitAbilityLevelSwapped('A0F6', GetEventDamageSource())) ), ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL )
     call EnableTrigger( udg_Prolom_trigger )
endfunction

function Trig_ProlomDo_Actions takes nothing returns nothing
     call SetUnitUserData( GetAttacker(), 0 )
     set udg_Bezlikij[1] = GetAttackedUnitBJ()
     call TriggerRemoveCondition( udg_Prolom_trigger, udg_Prolom_cond[0] )
     call TriggerClearConditions( udg_Prolom_trigger )
     call TriggerRemoveAction( udg_Prolom_trigger, udg_Prolom_act[0] )
     call TriggerClearActions( udg_Prolom_trigger )
     call DestroyTrigger(udg_Prolom_trigger)
     set udg_Prolom_trigger = CreateTrigger()
     call TriggerRegisterUnitEvent( udg_Prolom_trigger, udg_Bezlikij[1], EVENT_UNIT_DAMAGED )
     set udg_Prolom_cond[0] = TriggerAddCondition( udg_Prolom_trigger, Condition(function Trig_ProlomDo_Func01) )
     set udg_Prolom_act[0] = TriggerAddAction( udg_Prolom_trigger, function Trig_ProlomDo_Func02 )
endfunction

//===========================================================================
function InitTrig_ProlomDo takes nothing returns nothing
     set gg_trg_ProlomDo = CreateTrigger(  )
     call TriggerRegisterAnyUnitEventBJ( gg_trg_ProlomDo, EVENT_PLAYER_UNIT_ATTACKED )
     call TriggerAddCondition( gg_trg_ProlomDo, Condition( function Trig_ProlomDo_Conditions ) )
     call TriggerAddAction( gg_trg_ProlomDo, function Trig_ProlomDo_Actions )
endfunction
 

lawsonДата: Суббота, 04 Августа 2012, 01:24:49 | Сообщение # 6
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Smartaros, О боже, зачем столько мути не понятно чего, какие-то проверки какие то БЖ, создай просто лок. триггер на нанесение урона или если юнит один то просто глоб. триггер и передавай в него все что нужно.

Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!
 

SmartarosДата: Суббота, 04 Августа 2012, 02:16:07 | Сообщение # 7
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
ну я в джассе 0 я не знаю как иначе делать манипуляции при нанесении урона с руки
 

kapa6acvlkДата: Суббота, 04 Августа 2012, 02:17:54 | Сообщение # 8
Группа: Проверенные
Сообщений: 612
Награды: 0
Репутация: 361
Блокировки:
я думаю, должно быть что-то вроде этого, но я даже не проверял, так на глаз
Code

function Trig_ProlomDo_Conditions takes nothing returns boolean
     return GetUnitAbilityLevel(GetAttacker(), 'A0F6') > 0
endfunction

function Trig_ProlomDo_Func01 takes nothing returns boolean
     return GetUnitUserData(GetEventDamageSource()) == 0
endfunction

function Trig_ProlomDo_Func02 takes nothing returns nothing
     local unit d = GetEventDamageSource()
     local real x = GetUnitX(d)
     local real y = GetUnitX(d)
     local unit u = CreateUnit(GetOwningPlayer(d),'n02K',x,y,0.)
     call UnitAddAbility(u, 'A0F7')
     call SetUnitAbilityLevel(u, 'A0F7', GetUnitAbilityLevel(d, 'A0F6'))
     call IssueTargetOrder( u, "innerfire", udg_Bezlikij[1] )
     call UnitApplyTimedLife(u, 'BTLF', 2.0)
     call SetUnitUserData( d, 1 )
     call DisableTrigger( udg_Prolom_trigger )
     call UnitDamageTarget(d, udg_Bezlikij[1], 20.*GetUnitAbilityLevel(d, 'A0F6'), true, false, ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
     call EnableTrigger( udg_Prolom_trigger )
     call TriggerRemoveCondition( udg_Prolom_trigger, udg_Prolom_cond[0] )
     call TriggerRemoveAction( udg_Prolom_trigger, udg_Prolom_act[0] )
     call DestroyTrigger(udg_Prolom_trigger)
     set d = null
     set u = null
endfunction

function Trig_ProlomDo_Actions takes nothing returns nothing
     call SetUnitUserData( GetAttacker(), 0 )
     set udg_Bezlikij[1] = GetTriggerUnit()
     set udg_Prolom_trigger = CreateTrigger()
     call TriggerRegisterUnitEvent( udg_Prolom_trigger, udg_Bezlikij[1], EVENT_UNIT_DAMAGED )
     set udg_Prolom_cond[0] = TriggerAddCondition( udg_Prolom_trigger, Condition(function Trig_ProlomDo_Func01) )
     set udg_Prolom_act[0] = TriggerAddAction( udg_Prolom_trigger, function Trig_ProlomDo_Func02 )
endfunction

//===========================================================================
function InitTrig_ProlomDo takes nothing returns nothing
     set gg_trg_ProlomDo = CreateTrigger(  )
     call TriggerRegisterAnyUnitEventBJ( gg_trg_ProlomDo, EVENT_PLAYER_UNIT_ATTACKED )
     call TriggerAddCondition( gg_trg_ProlomDo, Condition( function Trig_ProlomDo_Conditions ) )
     call TriggerAddAction( gg_trg_ProlomDo, function Trig_ProlomDo_Actions )
endfunction



Как говориться, не обязательно есть всю кучу говна, чтобы понять, что она однородна.
© Александр Зорич
 

SmartarosДата: Суббота, 04 Августа 2012, 15:49:10 | Сообщение # 9
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
в строчке damage target хелпер нашел ошибку, не знаю как исправить, стер ее, триггер не работает
 

kapa6acvlkДата: Воскресенье, 05 Августа 2012, 15:16:35 | Сообщение # 10
Группа: Проверенные
Сообщений: 612
Награды: 0
Репутация: 361
Блокировки:
Smartaros, выложи карту, и скинь ссылку в мне ЛС, я посмотрю, что там не так.

Добавлено (05 Августа 2012, 15:14:05)
---------------------------------------------
Набросал системку, тестил на протяжении долгого времени утечек нет.

Code
function ta takes nothing returns nothing
      local trigger t = GetTriggeringTrigger()
      local unit u = GetEventDamageSource()
      local unit c = GetTriggerUnit()
      local triggeraction tra = LoadTriggerActionHandle(udg_Hash,GetHandleId(t),1)
      if(u == LoadUnitHandle(udg_Hash,GetHandleId(t),0))then
          //call BJDebugMsg(GetUnitName(u)+" - "+R2S(GetEventDamage()))
          //тут твои действия
          call FlushChildHashtable(udg_Hash, GetHandleId(t))
          call FlushChildHashtable(udg_Hash, GetHandleId(u))
          call TriggerRemoveAction(t,tra)
          call DestroyTrigger(t)
      endif
      set t = null
      set u = null
      set c = null
      set tra = null
endfunction

function Trig_DMG_Actions takes nothing returns nothing
      local unit u = GetAttacker()
      local unit c = GetTriggerUnit()
      local trigger t = LoadTriggerHandle(udg_Hash,GetHandleId(u),0)
      local triggeraction tra = LoadTriggerActionHandle(udg_Hash,GetHandleId(u),1)
      call TriggerRemoveAction(t,tra)
      call DestroyTrigger(t)
      call FlushChildHashtable(udg_Hash, GetHandleId(t))
      call FlushChildHashtable(udg_Hash, GetHandleId(u))
      set t = CreateTrigger()
      call TriggerRegisterUnitEvent( t, c, EVENT_UNIT_DAMAGED )
      set tra = TriggerAddAction(t, function ta)
      call SaveUnitHandle(udg_Hash,GetHandleId(t),0,u)
      call SaveTriggerActionHandle(udg_Hash,GetHandleId(t),1,tra)
      call SaveTriggerHandle(udg_Hash,GetHandleId(u),0,t)
      call SaveTriggerActionHandle(udg_Hash,GetHandleId(u),1,tra)
      set udg_i = udg_i + 1
      set u = null
      set c = null
      set t = null
      set tra = null
endfunction

//===========================================================================
function InitTrig_DMG takes nothing returns nothing
      set gg_trg_DMG = CreateTrigger(  )
      call TriggerRegisterAnyUnitEventBJ( gg_trg_DMG, EVENT_PLAYER_UNIT_ATTACKED )
      call TriggerAddAction( gg_trg_DMG, function Trig_DMG_Actions )
endfunction


http://rghost.ru/39585301

Добавлено (05 Августа 2012, 15:16:35)
---------------------------------------------
set udg_i = udg_i + 1 - только для подсчета срабатываний, так для интереса :D



Как говориться, не обязательно есть всю кучу говна, чтобы понять, что она однородна.
© Александр Зорич


Сообщение отредактировал kapa6acvlk - Воскресенье, 05 Августа 2012, 15:14:27
 

SmartarosДата: Воскресенье, 05 Августа 2012, 17:26:12 | Сообщение # 11
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
мм а куда вставить условие что нанес урон тот, у которого есть такая то способность?
 

kapa6acvlkДата: Воскресенье, 05 Августа 2012, 18:30:36 | Сообщение # 12
Группа: Проверенные
Сообщений: 612
Награды: 0
Репутация: 361
Блокировки:
Code
function ta takes nothing returns nothing
       local trigger t = GetTriggeringTrigger()
       local unit u = GetEventDamageSource()
       local unit c = GetTriggerUnit()
       local triggeraction tra = LoadTriggerActionHandle(udg_Hash,GetHandleId(t),1)
       if(u == LoadUnitHandle(udg_Hash,GetHandleId(t),0))then
           //call BJDebugMsg(GetUnitName(u)+" - "+R2S(GetEventDamage()))
           //тут твои действия
           call FlushChildHashtable(udg_Hash, GetHandleId(t))
           call FlushChildHashtable(udg_Hash, GetHandleId(u))
           call TriggerRemoveAction(t,tra)
           call DestroyTrigger(t)
       endif
       set t = null
       set u = null
       set c = null
       set tra = null
endfunction

function Trig_DMG_Conditions takes nothing returns boolean
     return (GetUnitAbilityLevel(GetAttacker(), 'A000') > 0  
endfunction

function Trig_DMG_Actions takes nothing returns nothing
       local unit u = GetAttacker()
       local unit c = GetTriggerUnit()
       local trigger t = LoadTriggerHandle(udg_Hash,GetHandleId(u),0)
       local triggeraction tra = LoadTriggerActionHandle(udg_Hash,GetHandleId(u),1)
       call TriggerRemoveAction(t,tra)
       call DestroyTrigger(t)
       call FlushChildHashtable(udg_Hash, GetHandleId(t))
       call FlushChildHashtable(udg_Hash, GetHandleId(u))
       set t = CreateTrigger()
       call TriggerRegisterUnitEvent( t, c, EVENT_UNIT_DAMAGED )
       set tra = TriggerAddAction(t, function ta)
       call SaveUnitHandle(udg_Hash,GetHandleId(t),0,u)
       call SaveTriggerActionHandle(udg_Hash,GetHandleId(t),1,tra)
       call SaveTriggerHandle(udg_Hash,GetHandleId(u),0,t)
       call SaveTriggerActionHandle(udg_Hash,GetHandleId(u),1,tra)
       set udg_i = udg_i + 1
       set u = null
       set c = null
       set t = null
       set tra = null
endfunction

//===========================================================================
function InitTrig_DMG takes nothing returns nothing
       set gg_trg_DMG = CreateTrigger(  )
       call TriggerRegisterAnyUnitEventBJ( gg_trg_DMG, EVENT_PLAYER_UNIT_ATTACKED )
       call TriggerAddCondition( gg_trg_DMG, Condition( function Trig_DMG_Conditions ) )
       call TriggerAddAction( gg_trg_DMG, function Trig_DMG_Actions )
endfunction


Вместо A000 равкод твоей абилы



Как говориться, не обязательно есть всю кучу говна, чтобы понять, что она однородна.
© Александр Зорич
 

SmartarosДата: Воскресенье, 05 Августа 2012, 19:22:25 | Сообщение # 13
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
в функции ta я добавил лок.целочисленную, она равна рандом от 1 до 100, как вписать условие, если она меньше или равна 12 + 3*лвл моей абилы, то дальше мои действия, иначе говоря шанс. Прям так в той функции в действиях и писать: if(not i <= блаблабла?
 

BorodachДата: Воскресенье, 05 Августа 2012, 20:01:56 | Сообщение # 14
9 уровень
Группа: Проверенные
Сообщений: 930
Награды: 0
Репутация: 422
Блокировки:
i=лок.целочисленную, она равна рандом от 1 до 100,
Code
if i<=12+3*GetUnitAbilitylLevel(unit,rawcode) then
действия
endif


Karamba


Сообщение отредактировал Borodach - Воскресенье, 05 Августа 2012, 20:03:31
 

SmartarosДата: Воскресенье, 05 Августа 2012, 20:24:50 | Сообщение # 15
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
then же после надо, а не с новой строчки
 

BorodachДата: Воскресенье, 05 Августа 2012, 20:45:37 | Сообщение # 16
9 уровень
Группа: Проверенные
Сообщений: 930
Награды: 0
Репутация: 422
Блокировки:
у меня вроде не с новой строчки dunno

Karamba
 

kapa6acvlkДата: Воскресенье, 05 Августа 2012, 20:57:02 | Сообщение # 17
Группа: Проверенные
Сообщений: 612
Награды: 0
Репутация: 361
Блокировки:
Smartaros, Измени эту проверку:
Code
if(u == LoadUnitHandle(udg_Hash,GetHandleId(t),0))then

на это:
Code
if(u == LoadUnitHandle(udg_Hash,GetHandleId(t),0) and i<=12+3*GetUnitAbilitylLevel(unit,rawcode))then

соответственно i, unit и rawcode сам пропишешь как тебе надо



Как говориться, не обязательно есть всю кучу говна, чтобы понять, что она однородна.
© Александр Зорич
 

SmartarosДата: Воскресенье, 05 Августа 2012, 21:57:19 | Сообщение # 18
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
черт, я оказывается все правильно написал, у меня в моих действиях дамми почему то не хочет юзать способность, щас код скину, если в нем нет ошибки значит в ро муть

Добавлено (05 Августа 2012, 21:57:19)
---------------------------------------------

Code
function ta takes nothing returns nothing
     local trigger t = GetTriggeringTrigger()
     local unit u = GetEventDamageSource()
     local real x = GetUnitX(u)
     local real y = GetUnitY(u)
     local unit u2
     local unit c = GetTriggerUnit()
     local triggeraction tra = LoadTriggerActionHandle(udg_Hash,GetHandleId(t),1)
     local integer i = GetRandomInt(1, 100)
     if(u == LoadUnitHandle(udg_Hash,GetHandleId(t),0)) and i <= 12 + 3 * GetUnitAbilityLevel(u,'A0F6')then
         //call BJDebugMsg(GetUnitName(u)+" - "+R2S(GetEventDamage()))
         //call KillUnit(u)
         set u2 = CreateUnit(GetOwningPlayer(u),'n02k',x,y,0.)
         call UnitAddAbility(u2, 'A0F7')
         call IssueTargetOrder( u2, "innerfire", c )
         call UnitApplyTimedLife(u2, 'BTLF',2.0)
         call FlushChildHashtable(udg_Hash, GetHandleId(t))
         call FlushChildHashtable(udg_Hash, GetHandleId(u))
         call TriggerRemoveAction(t,tra)
         call DestroyTrigger(t)
     endif
     set t = null
     set u = null
     set u2 = null
     set c = null
     set tra = null
endfunction
 

BorodachДата: Воскресенье, 05 Августа 2012, 22:07:27 | Сообщение # 19
9 уровень
Группа: Проверенные
Сообщений: 930
Награды: 0
Репутация: 422
Блокировки:
Smartaros, для начала ты проверил, есть ли мана, разблокирована способность и время для каста хватает?

Karamba
 

SmartarosДата: Воскресенье, 05 Августа 2012, 22:13:39 | Сообщение # 20
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
скилл не требует ману, способность просто скопированна с другой, которую другой дамми юзает без проблем, оба дамми отличаются только названиями, у них анимация каста 0, единственное отличие, что та способность на союзников, эта на врагов, допустимые цели скопировал у молота бурь
 

kapa6acvlkДата: Воскресенье, 05 Августа 2012, 23:35:55 | Сообщение # 21
Группа: Проверенные
Сообщений: 612
Награды: 0
Репутация: 361
Блокировки:
Smartaros, попробуй своему дамику дать в РО классификацию Является зданием.


Как говориться, не обязательно есть всю кучу говна, чтобы понять, что она однородна.
© Александр Зорич
 

SmartarosДата: Понедельник, 06 Августа 2012, 13:14:13 | Сообщение # 22
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
уже все что можно перепробовал и перепроверил, дамми просто нихрена не юзает

Добавлено (06 Августа 2012, 13:14:13)
---------------------------------------------
щас проверил и обнаружил что дамми вообще не создается....

 

kapa6acvlkДата: Понедельник, 06 Августа 2012, 13:17:50 | Сообщение # 23
Группа: Проверенные
Сообщений: 612
Награды: 0
Репутация: 361
Блокировки:
Smartaros, для теста (всегда!) не убирай у даммика модель и не ставь москитов. Когда настроишь код, настраивай дамика, я для простоты всегда так делаю. вдруг чего забудешь создать или дать :)


Как говориться, не обязательно есть всю кучу говна, чтобы понять, что она однородна.
© Александр Зорич
 

SmartarosДата: Понедельник, 06 Августа 2012, 13:34:16 | Сообщение # 24
9 уровень
Группа: Проверенные
Сообщений: 810
Награды: 0
Репутация: 135
Блокировки:
я вот как раз модель поставил, почему он не создается? код же вроде правильный
 

kapa6acvlkДата: Понедельник, 06 Августа 2012, 13:38:33 | Сообщение # 25
Группа: Проверенные
Сообщений: 612
Награды: 0
Репутация: 361
Блокировки:
не ошибся ли ты тут: n02k


Как говориться, не обязательно есть всю кучу говна, чтобы понять, что она однородна.
© Александр Зорич
 

Форум о Warcraft 3 » Раздел для картостроителей » Вопросы по картостроению » Ошибка в триггере, бесконечно наносится урон
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Поиск:

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