魔兽地图编辑器吧 关注:65,701贴子:3,846,101
  • 13回复贴,共1

set null会导致WAR3崩溃?

取消只看楼主收藏回复

RT
有3个单位handle
这3个单位死亡后会删除当前触发
然后结尾set 这3个单位handle=null
这个触发会崩war3
后来我把set null全去掉 就好了
后来我一个一个的加回去 发现就是这3个单位handle
set null就会崩
这是个怎么情况?


1楼2011-06-22 06:48回复
    为什么不清空


    3楼2011-06-22 06:52
    回复
      2026-02-08 22:22:17
      广告
      不感兴趣
      开通SVIP免广告
      3个局部变量...


      6楼2011-06-22 07:02
      回复
        正确
        不正确会通不过编译吧...
        我已经试了几十遍了 情况就是这样...


        8楼2011-06-22 07:06
        回复
          不行
          set null的话 会有很大几率崩 >90%
          但是不set null的话 肯定不会崩


          10楼2011-06-22 07:11
          回复
            肯定是写在最后了...
            这3个单位是存在触发id下的 删除当前触发以后 产生的问题?
            我只能想到这个了


            12楼2011-06-22 08:30
            回复
              这个没问题吧
              在测试图写的 其他什么都没有


              14楼2011-06-22 09:01
              回复
                本来就是在什么新图里写的 就这一个触发
                算了 不在乎这点内存 不set null了


                16楼2011-06-22 09:55
                回复
                  2026-02-08 22:16:17
                  广告
                  不感兴趣
                  开通SVIP免广告
                  function ST_DQ takes nothing returns nothing
                  local timer t=GetExpiredTimer()
                  local trigger tg=LoadTriggerHandle(udg_hs,GetHandleId(t),0)
                  local triggeraction ta=LoadTriggerActionHandle(udg_hs,GetHandleId(t),1)
                  call DestroyLightning(LoadLightningHandle(udg_hs,GetHandleId(tg),3))
                  call DestroyLightning(LoadLightningHandle(udg_hs,GetHandleId(tg),4))
                  call DestroyLightning(LoadLightningHandle(udg_hs,GetHandleId(tg),5))
                  call FlushChildHashtable(udg_hs,GetHandleId(tg))
                  call TriggerRemoveAction(tg,ta)
                  call DestroyTrigger(tg)
                  call PauseTimer(t)
                  call FlushChildHashtable(udg_hs,GetHandleId(t))
                  call DestroyTimer(t)
                  set t=null
                  set tg=null
                  set ta=null
                  endfunction
                  function ST_Damage takes unit u,real damage,unit tu returns real
                  local real sm=GetUnitState(tu,UNIT_STATE_LIFE)
                  if IsUnitAliveBJ(tu) then
                  call UnitDamageTarget(u,tu,damage,true,false,ATTACK_TYPE_HERO,DAMAGE_TYPE_MAGIC,WEAPON_TYPE_WHOKNOWS)
                  return damage-sm
                  endif
                  return damage
                  endfunction
                  function ST_XS takes nothing returns nothing
                  local trigger tg=GetTriggeringTrigger()
                  local unit u=GetTriggerUnit()
                  local unit lu=GetEventDamageSource()
                  local real sh=GetEventDamage()
                  local real lx=LoadReal(udg_hs,GetHandleId(tg),6)
                  local real rx=LoadReal(udg_hs,GetHandleId(tg),7)
                  local real y=LoadReal(udg_hs,GetHandleId(tg),8)
                  local timer t
                  local unit array mj
                  if GetUnitX(u)>lx and GetUnitX(u)<rx and GetUnitY(u)>y and GetUnitY(u)<y+SquareRoot(3)*(GetUnitX(u)-lx) and GetUnitY(u)<y+SquareRoot(3)*(rx-GetUnitX(u)) then
                  set mj[0]=LoadUnitHandle(udg_hs,GetHandleId(tg),0)
                  set mj[1]=LoadUnitHandle(udg_hs,GetHandleId(tg),1)
                  set mj[2]=LoadUnitHandle(udg_hs,GetHandleId(tg),2)
                  call SetUnitLifeBJ(u,GetUnitState(u,UNIT_STATE_LIFE)+sh)
                  set sh=ST_Damage(lu,sh,mj[0])
                  if sh>0 then
                  set sh=ST_Damage(lu,sh,mj[1])
                  if sh>0 then
                  set sh=ST_Damage(lu,sh,mj[2])
                  if sh>0 then
                  call DestroyLightning(LoadLightningHandle(udg_hs,GetHandleId(tg),3))
                  call DestroyLightning(LoadLightningHandle(udg_hs,GetHandleId(tg),4))
                  call DestroyLightning(LoadLightningHandle(udg_hs,GetHandleId(tg),5))
                  set t=LoadTimerHandle(udg_hs,GetHandleId(tg),9)
                  call FlushChildHashtable(udg_hs,GetHandleId(t))
                  call PauseTimer(t)
                  call DestroyTimer(t)
                  call FlushChildHashtable(udg_hs,GetHandleId(tg))
                  call TriggerClearActions(tg)
                  call DestroyTrigger(tg)
                  endif
                  endif
                  endif
                  endif
                  set tg=null
                  set u=null
                  set lu=null
                  set t=null
                  endfunction
                  function ST_A takes nothing returns boolean
                  local unit array mj
                  local unit u=GetTriggerUnit()
                  local integer i
                  local integer j
                  local trigger tg=CreateTrigger()
                  local triggeraction ta=TriggerAddAction(tg,function ST_XS)
                  local lightning array l
                  local timer t=CreateTimer()
                  if GetSpellAbilityId() == 'A000' then
                  set mj[0]=CreateUnit(GetOwningPlayer(u),'e000',GetUnitX(u),GetUnitY(u)+800/SquareRoot(3),0)
                  set mj[1]=CreateUnit(GetOwningPlayer(u),'e000',GetUnitX(u)-400,GetUnitY(u)-400/SquareRoot(3),0)
                  


                  20楼2011-06-22 11:46
                  回复
                    set mj[2]=CreateUnit(GetOwningPlayer(u),'e000',GetUnitX(u)+400,GetUnitY(u)-400/SquareRoot(3),0)
                    set i=0
                    loop
                    exitwhen i>2
                    set j=GetUnitAbilityLevel(u,'A000')
                    loop
                    exitwhen j<2
                    call UnitAddAbility(mj[i],'A001')
                    call SetUnitAbilityLevel(mj[i],'A001',2)
                    call UnitRemoveAbility(mj[i],'A001')
                    set j=j-1
                    endloop
                    call UnitApplyTimedLife(mj[i],'BHwe',GetUnitAbilityLevel(u,'A000')*2+3)
                    set i=i+1
                    endloop
                    call TriggerRegisterUnitEvent(tg,u,EVENT_UNIT_DAMAGED)
                    set l[0]=AddLightning("CLPB",false,GetUnitX(mj[0]),GetUnitY(mj[0]),GetUnitX(mj[1]),GetUnitY(mj[1]))
                    set l[1]=AddLightning("CLPB",false,GetUnitX(mj[0]),GetUnitY(mj[0]),GetUnitX(mj[2]),GetUnitY(mj[2]))
                    set l[2]=AddLightning("CLPB",false,GetUnitX(mj[1]),GetUnitY(mj[1]),GetUnitX(mj[2]),GetUnitY(mj[2]))
                    call SaveUnitHandle(udg_hs,GetHandleId(tg),0,mj[0])
                    call SaveUnitHandle(udg_hs,GetHandleId(tg),1,mj[1])
                    call SaveUnitHandle(udg_hs,GetHandleId(tg),2,mj[2])
                    call SaveLightningHandle(udg_hs,GetHandleId(tg),3,l[0])
                    call SaveLightningHandle(udg_hs,GetHandleId(tg),4,l[1])
                    call SaveLightningHandle(udg_hs,GetHandleId(tg),5,l[2])
                    call SaveReal(udg_hs,GetHandleId(tg),6,GetUnitX(mj[1]))
                    call SaveReal(udg_hs,GetHandleId(tg),7,GetUnitX(mj[2]))
                    call SaveReal(udg_hs,GetHandleId(tg),8,GetUnitY(mj[1]))
                    call SaveTimerHandle(udg_hs,GetHandleId(tg),9,t)
                    call SaveTriggerHandle(udg_hs,GetHandleId(t),0,tg)
                    call SaveTriggerActionHandle(udg_hs,GetHandleId(t),1,ta)
                    call TimerStart(t,GetUnitAbilityLevel(u,'A000')*2+3,false,function ST_DQ)
                    endif
                    set mj[0]=null
                    set mj[1]=null
                    set mj[2]=null
                    set u=null
                    set tg=null
                    set ta=null
                    set t=null
                    set l[0]=null
                    set l[1]=null
                    set l[2]=null
                    return false
                    endfunction
                    function InitTrig_ST takes nothing returns nothing
                         set gg_trg_ST = CreateTrigger(   )
                         call TriggerRegisterAnyUnitEventBJ( gg_trg_ST, EVENT_PLAYER_UNIT_SPELL_EFFECT )
                         call TriggerAddCondition( gg_trg_ST, Condition(function ST_A) )
                    endfunction
                    


                    21楼2011-06-22 11:46
                    回复
                      很长啊
                      应该是崩在ST_XS这个函数


                      22楼2011-06-22 11:47
                      回复
                        最后一次执行ST_XS
                        也就是删触发之前 崩
                        DestroyLightning没有执行到


                        24楼2011-06-22 11:57
                        回复
                          pollwait(5)之后set null
                          没问题


                          26楼2011-06-22 12:01
                          回复
                            真心看不出来


                            28楼2011-06-22 12:06
                            回复