Добавлен
В общем пробовал я поиграться с хешем, почитал обе статьи(.. и побежал что-то делать...
Предупреждаю сразу: тригг ломает игру, все виснет. Вопрос: как это исправить и в чем мои ошибки?

неговнокод
function onDeathOrDeactivation takes nothing returns nothing
      local unit resetTarget = GetTriggerUnit()
      local integer IndeX2 = GetHandleId(resetTarget)
      local trigger resetTrig0 = LoadTriggerHandle(udg_Hash,IndeX2,0)
      local trigger resetTrig1 = LoadTriggerHandle(udg_Hash,IndeX2,1)
      local trigger resetTrig2 = LoadTriggerHandle(udg_Hash,IndeX2,2)
      local unit resetCaster = LoadUnitHandle(udg_Hash,IndeX2,3)
      local player resetTargetOwner = LoadPlayerHandle(udg_Hash,IndeX2,5)

      call IssueImmediateOrder(resetTarget, "creepthunderclap" )
      call UnitRemoveType(resetTarget, UNIT_TYPE_PEON)
      call SetUnitOwner(resetTarget,resetTargetOwner,false)
      call UnitRemoveAbility(resetTarget,'A001')
      call UnitRemoveAbility(resetTarget, 'B001')
      set udg_contrUnit = udg_nObody    
     
     // call DestroyTrigger(resetTrig0)
    //  call DestroyTrigger(resetTrig1)
     // call DestroyTrigger(resetTrig2)
  //    call FlushChildHashtable(udg_Hash,IndeX2)
      
  //    set resetCaster = null
   //   set resetTarget = null
    //  set resetTargetOwner = null
  ///    set resetTrig0 = null
    //  set resetTrig1 = null
    //  set resetTrig2 = null
endfunction

function checkBuffs takes nothing returns nothing
local timer resetTimer = GetExpiredTimer()
local integer resetIndeX1 = GetHandleId(resetTimer)
local unit resetTarget = LoadUnitHandle(udg_Hash,resetIndeX1,4)
local trigger resetTrig0
local trigger resetTrig1
local trigger resetTrig2
local unit resetCaster
local player resetTargetOwner

   if GetUnitAbilityLevel(resetTarget, 'B001') <= 0 then
   
   call IssueImmediateOrder(resetTarget, "creepthunderclap" )
   call UnitRemoveType(resetTarget, UNIT_TYPE_PEON)
   call SetUnitOwner(resetTarget,resetTargetOwner,false)
   call UnitRemoveAbility(resetTarget,'A001')
   call UnitRemoveAbility(resetTarget, 'B001')
   set udg_contrUnit = udg_nObody
   
     set resetTrig0 = LoadTriggerHandle(udg_Hash,resetIndeX1,0)
     set resetTrig1 = LoadTriggerHandle(udg_Hash,resetIndeX1,1)
     set resetTrig2 = LoadTriggerHandle(udg_Hash,resetIndeX1,2)
     set resetCaster = LoadUnitHandle(udg_Hash,resetIndeX1,3)
     set resetTargetOwner = LoadPlayerHandle(udg_Hash,resetIndeX1,5)

    // call DestroyTimer(resetTimer)
     //call DestroyTrigger(resetTrig0)
    // call DestroyTrigger(resetTrig1)
    // call DestroyTrigger(resetTrig2)
    // call FlushChildHashtable(udg_Hash,resetIndeX1)
     
   elseif GetUnitState(resetCaster,UNIT_STATE_LIFE) - GetUnitState(resetCaster,UNIT_STATE_LIFE) - ( 4.00 * I2R(GetUnitLevel(resetTarget)))/20 < GetUnitState(resetCaster,UNIT_STATE_LIFE)*0.11 then
   
     call IssueImmediateOrder(resetTarget, "creepthunderclap" )
     call UnitRemoveType(resetTarget, UNIT_TYPE_PEON)
     call SetUnitOwner(resetTarget,resetTargetOwner,false)
     call UnitRemoveAbility(resetTarget,'A001')
     call UnitRemoveAbility(resetTarget, 'B001')
     set udg_contrUnit = udg_nObody
   
     set resetTrig0 = LoadTriggerHandle(udg_Hash,resetIndeX1,6)
     set resetTrig1 = LoadTriggerHandle(udg_Hash,resetIndeX1,7)
     set resetTrig2 = LoadTriggerHandle(udg_Hash,resetIndeX1,8)
     set resetCaster = LoadUnitHandle(udg_Hash,resetIndeX1,9)
     set resetTargetOwner = LoadPlayerHandle(udg_Hash,resetIndeX1,11)
     
   //  call DestroyTimer(resetTimer)
   //  call DestroyTrigger(resetTrig0)
   //  call DestroyTrigger(resetTrig1)
   //  call DestroyTrigger(resetTrig2)
   //  call FlushChildHashtable(udg_Hash,resetIndeX1)
   else
     set resetCaster = LoadUnitHandle(udg_Hash,resetIndeX1,3)
     call SetUnitState(resetCaster,UNIT_STATE_LIFE,GetUnitState(resetCaster,UNIT_STATE_LIFE) - ( 4.00 * I2R(GetUnitLevel(resetTarget)))/20)       
   endif
    // set resetTimer = null
    /// set resetCaster = null
    // set resetTarget = null
    // set resetTargetOwner = null
   //  set resetTargetOwner = null
   //  set resetTrig0 = null
   //  set resetTrig1 = null
    // set resetTrig2 = null
endfunction

function checkSpellApplied takes nothing returns nothing
local unit Target = GetTriggerUnit()
local unit Caster = GetEventDamageSource()
local player TargetOwner
local player CasterOwner
local trigger Trig0
local trigger Trig1
local trigger Trig2
local timer Timer 
local integer IndeX0 = GetHandleId(Target)
local integer IndeX1
local integer IndeX2 = GetHandleId(Target)

  if GetUnitAbilityLevel(Target, 'B001') <= 0 then
     
     set CasterOwner = GetOwningPlayer(Caster)
     set TargetOwner = GetOwningPlayer(Target)
     call UnitAddType(Target, UNIT_TYPE_PEON)
     call SetUnitOwner(Target,CasterOwner,false)
     call UnitAddAbility(Target,'A001')
     
     //Removes control while an approprivate buff expired
     set Timer = CreateTimer()
     set IndeX1 = GetHandleId(Timer)
     set Trig0 = LoadTriggerHandle(udg_Hash,IndeX0,0)
     
     set Trig1 = CreateTrigger()
     call TriggerRegisterTimerExpireEvent(Trig1,Timer)
     call TimerStart(Timer,0.05,true,function checkBuffs)
     
     call SaveTriggerHandle(udg_Hash,IndeX1,0,Trig0)
     call SaveTriggerHandle(udg_Hash,IndeX1,1,Trig1)
     call SaveTriggerHandle(udg_Hash,IndeX1,2,Trig2)
     call SaveUnitHandle(udg_Hash,IndeX1,3,Caster)
     call SaveUnitHandle(udg_Hash,IndeX1,4,Target)
     call SavePlayerHandle(udg_Hash,IndeX1,5,TargetOwner)
     
     //Removes control while player activates an approprivate spell or while controlled unit dies
     set Trig2 = CreateTrigger() 
     call TriggerRegisterUnitEvent(Trig2, Target, EVENT_UNIT_DEATH)
     call TriggerRegisterUnitEvent(Trig2,Target, EVENT_UNIT_SPELL_EFFECT)
     call TriggerAddAction(Trig2, function onDeathOrDeactivation)
     
     call SaveTriggerHandle(udg_Hash,IndeX2,6,Trig0)
     call SaveTriggerHandle(udg_Hash,IndeX2,7,Trig1)
     call SaveTriggerHandle(udg_Hash,IndeX2,8,Trig2)
     call SaveUnitHandle(udg_Hash,IndeX2,9,Caster)
     call SaveUnitHandle(udg_Hash,IndeX2,10,Target)
     call SavePlayerHandle(udg_Hash,IndeX2,11,TargetOwner)
     
    // call FlushChildHashtable(udg_Hash,IndeX0)

  else
     
     //Removes trigger I mentioned earlier. We can use any trid variable to determine this trig, foex. "Trig1"
     set Trig0 = LoadTriggerHandle(udg_Hash,IndeX0,0)
     call DestroyTrigger(Trig0)
   //  call FlushChildHashtable(udg_Hash,IndeX0)

  endif
  
   // set Target = null
   // set Caster = null
   // set TargetOwner = null
   // set CasterOwner = null
   // set Trig0 = null
    //set Trig1 = null
   // set Trig2 = null
    //set Timer = null
endfunction

function checkSpell takes nothing returns nothing
local unit Target
local integer IndeX0
local trigger Trig0

  if GetSpellAbilityId() == 'A002' then
     
     set Target = GetSpellTargetUnit()
     set IndeX0 = GetHandleId(Target)
     
     //Adds trigger for a spell target
     set Trig0 = CreateTrigger()
     call TriggerRegisterUnitEvent(Trig0, Target, EVENT_UNIT_DAMAGED )
     call TriggerAddAction(Trig0, function checkSpellApplied )
     
     //We need to delete? this trig while conditions returns false
     call SaveTriggerHandle(udg_Hash,IndeX0,0,Trig0)
     
  endif
//set Target = null
//set Trig0 = null
endfunction

//====================================================================================
function InitTrig_spellOwn takes nothing returns nothing
    set gg_trg_spellOwn = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ( gg_trg_spellOwn, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddAction( gg_trg_spellOwn, function checkSpell)
endfunction
Оказалось что все дело в способности с очень маленьким периодом урона: 0.(0). Но вот что интересно - так это почему баффы не появляются на юните вовремя.

Принятый ответ

function PainRayCon takes nothing returns boolean
return GetSpellAbilityId() == 'A06W'
endfunction

function PainRayEffect takes nothing returns nothing
local timer t= GetExpiredTimer()
local integer id = GetHandleId(t)
local unit c = LoadUnitHandle(udg_AssassinHash,id,0)
local unit g = LoadUnitHandle(udg_AssassinHash,id,1)
local unit d = LoadUnitHandle(udg_AssassinHash,id,3)
local lightning l = LoadLightningHandle(udg_AssassinHash,id,2)
local real r = ABU(g,d)
local integer i = LoadInteger(udg_AssassinHash,id,4)
local real x = GetUnitX(d)
local real y = GetUnitY(d)
local unit u
if FDFD(g,d) > 40. then
call SetUnitFacing(d,r*bj_RADTODEG)
call SetUnitX(d,SafeX(x+35.*Cos(r)))
call SetUnitY(d,SafeY(y+35.*Sin(r)))
call SetLightningColor(l,0.,1.,0.,1)
call RPX(l,g,c)
call MoveLightningEx(l,false,GetUnitX(c),GetUnitY(c),GetUnitZ(c)+60+GetUnitFlyHeight(c),x,y,GetUnitZ(d)+GetUnitFlyHeight(d))
call SaveInteger(udg_AssassinHash,id,4,i+1)
if i == 2 then
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Undead\\Possession\\PossessionMissile.mdl",d,"origin"))
call SaveInteger(udg_AssassinHash,id,4,2)
endif
else
call DestroyEffect(LoadEffectHandle(udg_AssassinHash,id,StringHash("E")))
call DestroyEffect(LoadEffectHandle(udg_AssassinHash,id,StringHash("E2")))
call UnitApplyTimedLife(d,'BTLF',.6)
set r = 75.*GetUnitAbilityLevel(c,'A06W')
call GroupEnumUnitsInRange(udg_G,x,y,350.,null)
loop
set u = FirstOfGroup(udg_G)
if IsTarget(u,c) then
set d = CreateUnit(GetOwningPlayer(u),'h02G',GetUnitX(u),GetUnitY(u),0)
call SetUnitAbilityLevel(d,'A0H7',8)
call UnitApplyTimedLife(d,'BTLF',.5)
call IssueTargetOrder(d,"soulburn",u)
call UnitDamageTarget(c,u,r,true,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_MAGIC,null)
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Undead\\Possession\\PossessionMissile.mdl",u,"chest"))
endif
call GroupRemoveUnit(udg_G,u)
exitwhen u == null
endloop
call DestroyTimer(t)
call FlushChildHashtable(udg_AssassinHash,id)
call DestroyLightning(l)
endif
set t = null
set g = null
set c = null
set l = null
set d = null
endfunction

function PainRay takes nothing returns nothing
local timer t = CreateTimer()
local unit c = GetTriggerUnit()
local unit g = GetSpellTargetUnit()
local integer id = GetHandleId(t)
local unit d = CreateUnit(GetOwningPlayer(c),'e00K',GetUnitX(c),GetUnitY(c),ABU(g,c)*bj_RADTODEG)
local lightning l = AddLightningEx("CHIM",false,GetUnitX(c),GetUnitY(c),GetUnitZ(c)+50,GetUnitX(d),GetUnitY(d),GetUnitZ(d)+50)
call RPX(l,g,c)
call SetLightningColor(l,0.,1.,0.,1)
call SetUnitScale(d,1.5,1.5,1.5)
call UnitAddAbility(d,'Arav')
call UnitRemoveAbility(d,'Arav')
call SetUnitFlyHeight(d,75.,0)
call SaveEffectHandle(udg_AssassinHash,id,11,AddSpecialEffectTarget("Abilities\\Weapons\\GreenDragonMissile\\GreenDragonMissile.mdl",d,"origin"))
call SaveEffectHandle(udg_AssassinHash,id,12,AddSpecialEffectTarget("Abilities\\Weapons\\snapMissile\\snapMissile.mdl",d,"origin"))
call SaveUnitHandle(udg_AssassinHash,id,0,c)
call SaveUnitHandle(udg_AssassinHash,id,1,g)
call SaveLightningHandle(udg_AssassinHash,id,2,l)
call SaveUnitHandle(udg_AssassinHash,id,3,d)
call TimerStart(t,.03,true,function PainRayEffect)
set t = null
set c = null
set g = null
set l = null
set d = null
endfunction
Вот тебе простой спелл из моей карты, тут используются нестандартные функции, поэтому просто так скопировать не выйдет, ну я так для примера.
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
21
9 лет назад
0
Насчет таймера. Если уменьшить период - лагов меньше, но тут дело не только в нем, а возможно и не в нем.
2
29
9 лет назад
Отредактирован 16GB
2
function PainRayCon takes nothing returns boolean
return GetSpellAbilityId() == 'A06W'
endfunction

function PainRayEffect takes nothing returns nothing
local timer t= GetExpiredTimer()
local integer id = GetHandleId(t)
local unit c = LoadUnitHandle(udg_AssassinHash,id,0)
local unit g = LoadUnitHandle(udg_AssassinHash,id,1)
local unit d = LoadUnitHandle(udg_AssassinHash,id,3)
local lightning l = LoadLightningHandle(udg_AssassinHash,id,2)
local real r = ABU(g,d)
local integer i = LoadInteger(udg_AssassinHash,id,4)
local real x = GetUnitX(d)
local real y = GetUnitY(d)
local unit u
if FDFD(g,d) > 40. then
call SetUnitFacing(d,r*bj_RADTODEG)
call SetUnitX(d,SafeX(x+35.*Cos(r)))
call SetUnitY(d,SafeY(y+35.*Sin(r)))
call SetLightningColor(l,0.,1.,0.,1)
call RPX(l,g,c)
call MoveLightningEx(l,false,GetUnitX(c),GetUnitY(c),GetUnitZ(c)+60+GetUnitFlyHeight(c),x,y,GetUnitZ(d)+GetUnitFlyHeight(d))
call SaveInteger(udg_AssassinHash,id,4,i+1)
if i == 2 then
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Undead\\Possession\\PossessionMissile.mdl",d,"origin"))
call SaveInteger(udg_AssassinHash,id,4,2)
endif
else
call DestroyEffect(LoadEffectHandle(udg_AssassinHash,id,StringHash("E")))
call DestroyEffect(LoadEffectHandle(udg_AssassinHash,id,StringHash("E2")))
call UnitApplyTimedLife(d,'BTLF',.6)
set r = 75.*GetUnitAbilityLevel(c,'A06W')
call GroupEnumUnitsInRange(udg_G,x,y,350.,null)
loop
set u = FirstOfGroup(udg_G)
if IsTarget(u,c) then
set d = CreateUnit(GetOwningPlayer(u),'h02G',GetUnitX(u),GetUnitY(u),0)
call SetUnitAbilityLevel(d,'A0H7',8)
call UnitApplyTimedLife(d,'BTLF',.5)
call IssueTargetOrder(d,"soulburn",u)
call UnitDamageTarget(c,u,r,true,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_MAGIC,null)
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Undead\\Possession\\PossessionMissile.mdl",u,"chest"))
endif
call GroupRemoveUnit(udg_G,u)
exitwhen u == null
endloop
call DestroyTimer(t)
call FlushChildHashtable(udg_AssassinHash,id)
call DestroyLightning(l)
endif
set t = null
set g = null
set c = null
set l = null
set d = null
endfunction

function PainRay takes nothing returns nothing
local timer t = CreateTimer()
local unit c = GetTriggerUnit()
local unit g = GetSpellTargetUnit()
local integer id = GetHandleId(t)
local unit d = CreateUnit(GetOwningPlayer(c),'e00K',GetUnitX(c),GetUnitY(c),ABU(g,c)*bj_RADTODEG)
local lightning l = AddLightningEx("CHIM",false,GetUnitX(c),GetUnitY(c),GetUnitZ(c)+50,GetUnitX(d),GetUnitY(d),GetUnitZ(d)+50)
call RPX(l,g,c)
call SetLightningColor(l,0.,1.,0.,1)
call SetUnitScale(d,1.5,1.5,1.5)
call UnitAddAbility(d,'Arav')
call UnitRemoveAbility(d,'Arav')
call SetUnitFlyHeight(d,75.,0)
call SaveEffectHandle(udg_AssassinHash,id,11,AddSpecialEffectTarget("Abilities\\Weapons\\GreenDragonMissile\\GreenDragonMissile.mdl",d,"origin"))
call SaveEffectHandle(udg_AssassinHash,id,12,AddSpecialEffectTarget("Abilities\\Weapons\\snapMissile\\snapMissile.mdl",d,"origin"))
call SaveUnitHandle(udg_AssassinHash,id,0,c)
call SaveUnitHandle(udg_AssassinHash,id,1,g)
call SaveLightningHandle(udg_AssassinHash,id,2,l)
call SaveUnitHandle(udg_AssassinHash,id,3,d)
call TimerStart(t,.03,true,function PainRayEffect)
set t = null
set c = null
set g = null
set l = null
set d = null
endfunction
Вот тебе простой спелл из моей карты, тут используются нестандартные функции, поэтому просто так скопировать не выйдет, ну я так для примера.
Принятый ответ
0
21
9 лет назад
Отредактирован Raised
0
Лол. Блин xD. Скилл я сделал на основе "Кислотной бомбы" с интервалом урона 0 сек.
Ясное дело что игру убьет сразу.

Тогда другой вопрос. Когда баффы применяются к юниту?
0
25
9 лет назад
0
Когда баффы применяются к юниту?
Когда снаряд попадает. Когда же ещё? Это тебе не "юнит атакован".
0
21
9 лет назад
0
Когда снаряд попадет юнит получит урон и бафф. По-идее. Но за исключением яда, если я не ошибаюсь, бафф появляется после получения урона.
Похоже нужно еще один таймер вместо или в придачу к событию получения урона.
0
32
9 лет назад
0
RiseD:
Лол. Блин xD. Скилл я сделал на основе "Кислотной бомбы" с интервалом урона 0 сек.
Ясное дело что игру убьет сразу.

Тогда другой вопрос. Когда баффы применяются к юниту?
Когда когда, у аксид бомбы сначала 0.00 ед урона, потом упоявится бафф и через период урона который ты указал в настройках будет наносится урон.
У станов вроде молота бурь сначала урон указаный в способности, потом 0.00 ед. урона, после тока бафф.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.