В общем пробовал я поиграться с хешем, почитал обе статьи(.. и побежал что-то делать...
Предупреждаю сразу: тригг ломает игру, все виснет. Вопрос: как это исправить и в чем мои ошибки?
Предупреждаю сразу: тригг ломает игру, все виснет. Вопрос: как это исправить и в чем мои ошибки?
неговнокод
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
Вот тебе простой спелл из моей карты, тут используются нестандартные функции, поэтому просто так скопировать не выйдет, ну я так для примера.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован 16GB
Отредактирован Raised
Ясное дело что игру убьет сразу.
Похоже нужно еще один таймер вместо или в придачу к событию получения урона.
У станов вроде молота бурь сначала урон указаный в способности, потом 0.00 ед. урона, после тока бафф.