找回密码
 点一下
查看: 1958|回复: 1

[求助](技能)绝命三连击,制作完毕,但是存在BUG,求解决。

[复制链接]
发表于 2009-6-7 02:56:41 | 显示全部楼层 |阅读模式
技能名称:绝命三连击
技能效果:对下一个攻击目标造成三次致命伤害,分别为2,4,8倍伤害,无视防御和闪避
         (攻击中期间如果转移目标或者攻击间隔超过一秒则被打断,效果可以被净化)


目前技能BUG

少放几次没有什么明显的错误,但是如果放多了就会出现错误。
经过测试,以下代码存在问题,它可能会造成缓存储存的混乱,大家给看看,到底哪里存在问题。
代码奉上:
  1. function H2I takes handle h returns integer
  2.     return h
  3.     return 0
  4. endfunction
  5. function SH takes handle h,string s,handle v returns nothing
  6.     if v==null then
  7.         call FlushStoredInteger(udg_GC,I2S(H2I(h)),s)
  8.     else
  9.         call StoreInteger(udg_GC,I2S(H2I(h)),s,H2I(v))
  10.     endif
  11. endfunction
  12. function SI takes handle h,string s,integer v returns nothing
  13.     if v==0 then
  14.         call FlushStoredInteger(udg_GC,I2S(H2I(h)),s)
  15.     else
  16.         call StoreInteger(udg_GC,I2S(H2I(h)),s,v)
  17.     endif
  18. endfunction
  19. function SB takes handle h,string s,boolean v returns nothing
  20.     if v==false then
  21.         call FlushStoredBoolean(udg_GC,I2S(H2I(h)),s)
  22.     else
  23.         call StoreBoolean(udg_GC,I2S(H2I(h)),s,v)
  24.     endif
  25. endfunction
  26. function GI takes handle h,string s returns integer
  27.     return GetStoredInteger(udg_GC,I2S(H2I(h)),s)
  28. endfunction
  29. function GBO takes handle h,string s returns boolean
  30.     return GetStoredBoolean(udg_GC,I2S(H2I(h)),s)
  31. endfunction
  32. function GU takes handle h,string s returns unit
  33.     return GetStoredInteger(udg_GC,I2S(H2I(h)),s)
  34.     return null
  35. endfunction
  36. function GTR takes handle h,string s returns trigger
  37.     return GetStoredInteger(udg_GC,I2S(H2I(h)),s)
  38.     return null
  39. endfunction
  40. function GTA takes handle h,string s returns triggeraction
  41.     return GetStoredInteger(udg_GC,I2S(H2I(h)),s)
  42.     return null
  43. endfunction
  44. function DeleteTrigger takes trigger trgr returns nothing
  45.     call TriggerRemoveAction(trgr,GTA(trgr,"action"))
  46.     call FlushStoredMission(udg_GC,I2S(H2I(trgr)))
  47.     call DestroyTrigger(trgr)
  48. endfunction
  49. function UnitRemoveSanlian takes unit u returns nothing
  50.     call SB(u,"sanlian",false)
  51.     call UnitRemoveAbility(u,'A001')
  52.     call UnitRemoveAbility(u,'A002')
  53.     call UnitRemoveAbility(u,'Bfzy')
  54. endfunction
  55. function UnitDamaged takes nothing returns nothing
  56.     local trigger trgr2=GetTriggeringTrigger()
  57.     local trigger trgr=GTR(trgr2,"trigger")
  58.     local unit u=GU(trgr,"unit")
  59.     local unit u2=GetTriggerUnit()
  60.     if GetTriggerEventId()==EVENT_UNIT_DAMAGED and GetEventDamageSource()==u and GBO(trgr2,"damaged")==false then
  61.         call SB(trgr2,"damaged",true)
  62.         if GI(trgr,"times")<2 then
  63.             call SI(trgr,"times",GI(trgr,"times")+1)
  64.             call SetUnitAbilityLevel(u,'A001',GI(trgr,"times")+1)
  65.         else
  66.             if GBO(u,"sanlian") then
  67.                 call UnitRemoveSanlian(u)
  68.                 call DeleteTrigger(trgr)
  69.             endif
  70.         endif
  71.     else
  72.         if GI(trgr2,"times")>=GI(trgr,"attacked") then
  73.             if GBO(u,"sanlian") then
  74.                 call UnitRemoveSanlian(u)
  75.                 call DeleteTrigger(trgr)
  76.             endif
  77.         endif
  78.         call DeleteTrigger(trgr2)
  79.     endif
  80.     set trgr=null
  81.     set trgr2=null
  82.     set u=null
  83.     set u2=null
  84. endfunction
  85. function sanlian takes nothing returns nothing
  86.     local trigger trgr=GetTriggeringTrigger()
  87.     local trigger trgr2
  88.     local unit u=GU(trgr,"unit")
  89.     local unit u2=GetTriggerUnit()
  90.     local integer i=GI(trgr,"times")
  91.     if u==GetAttacker() then
  92. call DisplayTextToPlayer(GetLocalPlayer(),0,0,"单位被攻击")
  93.         if i==0 then
  94.             if GU(trgr,"target")==null and GetUnitAbilityLevel(u,'Bfzy')>0 then
  95.                 call SH(trgr,"target",u2)
  96.                 call SI(trgr,"attacked",1)
  97.                 set trgr2=CreateTrigger()
  98.                 call TriggerRegisterUnitEvent(trgr2,u2,EVENT_UNIT_DAMAGED)
  99.                 call TriggerRegisterTimerEvent(trgr2,1,false)
  100.                 call SH(trgr2,"action",TriggerAddAction(trgr2,function UnitDamaged))
  101.                 call SH(trgr2,"trigger",trgr)
  102.                 call SI(trgr2,"times",1)
  103.             else
  104.                 call UnitRemoveSanlian(u)
  105.                 call DeleteTrigger(trgr)
  106.             endif
  107.         elseif i==1 then
  108.             if GU(trgr,"target")==u2 and GetUnitAbilityLevel(u,'Bfzy')>0 then
  109.                 call SI(trgr,"attacked",2)
  110.                 set trgr2=CreateTrigger()
  111.                 call TriggerRegisterUnitEvent(trgr2,u2,EVENT_UNIT_DAMAGED)
  112.                 call TriggerRegisterTimerEvent(trgr2,1,false)
  113.                 call SH(trgr2,"action",TriggerAddAction(trgr2,function UnitDamaged))
  114.                 call SH(trgr2,"trigger",trgr)
  115.                 call SI(trgr2,"times",2)
  116.             else
  117.                 call UnitRemoveSanlian(u)
  118.                 call DeleteTrigger(trgr)
  119.             endif
  120.         elseif i==2 then
  121.             if GU(trgr,"target")==u2 and GetUnitAbilityLevel(u,'Bfzy')>0 then
  122.                 call SI(trgr,"attacked",3)
  123.                 set trgr2=CreateTrigger()
  124.                 call TriggerRegisterUnitEvent(trgr2,u2,EVENT_UNIT_DAMAGED)
  125.                 call TriggerRegisterTimerEvent(trgr2,1,false)
  126.                 call SH(trgr2,"action",TriggerAddAction(trgr2,function UnitDamaged))
  127.                 call SH(trgr2,"trigger",trgr)
  128.                 call SI(trgr2,"times",3)
  129.             else
  130.                 call UnitRemoveSanlian(u)
  131.                 call DeleteTrigger(trgr)
  132.             endif
  133.         endif
  134.         set trgr2=null
  135.     endif
  136.     set trgr=null
  137.     set u=null
  138.     set u2=null
  139. endfunction
  140. function Trig_duomingsandao_Conditions takes nothing returns boolean
  141.     local trigger trgr
  142.     local integer plyr=0
  143.     if GetSpellAbilityId() == 'A000' and GBO(GetTriggerUnit(),"sanlian")==false then
  144.         set trgr=CreateTrigger()
  145.         call SB(GetTriggerUnit(),"sanlian",true)
  146.         call UnitAddAbility(GetTriggerUnit(),'A001')
  147.         call UnitAddAbility(GetTriggerUnit(),'A002')
  148.         loop
  149.             if IsPlayerEnemy(GetOwningPlayer(GetTriggerUnit()),Player(plyr)) then
  150.                 call TriggerRegisterPlayerUnitEvent(trgr,Player(plyr),EVENT_PLAYER_UNIT_ATTACKED,null)
  151.             endif
  152.             set plyr=plyr+1
  153.             exitwhen plyr==16
  154.         endloop
  155.         call SH(trgr,"action",TriggerAddAction(trgr,function sanlian))
  156.         call SH(trgr,"unit",GetTriggerUnit())
  157.         set trgr=null
  158.     endif
  159.     return false
  160. endfunction
  161. //===========================================================================
  162. function InitTrig_duomingsandao takes nothing returns nothing
  163.     set gg_trg_duomingsandao = CreateTrigger(  )
  164.     call TriggerRegisterAnyUnitEventBJ( gg_trg_duomingsandao, EVENT_PLAYER_UNIT_SPELL_EFFECT )
  165.     call TriggerAddCondition( gg_trg_duomingsandao, Condition( function Trig_duomingsandao_Conditions ) )
  166. endfunction
复制代码

绝命三连.w3x

17 KB, 下载次数: 28

发表于 2009-6-7 13:07:39 | 显示全部楼层
用缓存肯定会出问题的啦。

flush是有问题的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-11-23 21:06 , Processed in 0.269802 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表