找回密码
 点一下
查看: 1433|回复: 10

請看4樓幫忙找一下問題啦!

[复制链接]
发表于 2008-9-6 13:05:54 | 显示全部楼层 |阅读模式
[jass]function EluneArrowCheck takes nothing returns boolean
    return GetSpellAbilityId()=='A0L8'
endfunction

function EluneArrowFilter takes nothing returns boolean
    return IsUnitEnemy(GetFilterUnit(),GetOwningPlayer(udg_u_DTAX_temp))and GetUnitAbilityLevel(GetFilterUnit(),'A04R')==0 and GetUnitState(GetFilterUnit(),UNIT_STATE_LIFE)>1 and IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE)==false
endfunction

function EluneArrowStunCalc takes real pX1,real pY1,real pX2,real pY2 returns integer
    local real lDistance=SquareRoot((pX2-pX1)*(pX2-pX1)+(pY2-pY1)*(pY2-pY1))
    return ReturnMin(R2I(lDistance/150),10)
endfunction

function EluneArrowTimer takes nothing returns nothing
    local timer lMove=GetExpiredTimer()
    local string lTable=H2Tx(lMove)
    local unit lCaster=GetUnit(lTable,"Hero")
    local unit lBolt=GetUnit(lTable,"Projectile")
    local real lXL=GetReal(lTable,"TargetX")
    local real lYL=GetReal(lTable,"TargetY")
    local real lAngle=GetReal(lTable,"Angle")
    local real lXX=GetUnitX(lBolt)
    local real lYY=GetUnitY(lBolt)
    local real lXN=SafeX(GetUnitX(lBolt)+30*Cos(lAngle))
    local real lYN=SafeY(GetUnitY(lBolt)+30*Sin(lAngle))
    local boolexpr lCheck=Condition(function EluneArrowFilter)
    local group lEnumGroup=CreateGroup()
    local unit lTemp
    local unit lFirst
    local real lXF
    local real lYF
    call SetUnitX(lBolt,lXN)
    call SetUnitY(lBolt,lYN)
    set udg_u_DTAX_temp=lCaster
    call GroupEnumUnitsInRange(lEnumGroup,lXN,lYN,150,lCheck)
    set lFirst=FirstOfGroup(lEnumGroup)
    call DestroyGroup(lEnumGroup)
    call DestroyBoolExpr(lCheck)
    if lFirst!=null then
        set lXF=GetReal(lTable,"OriginalX")
        set lYF=GetReal(lTable,"OriginalY")
        set lTemp=CreateUnit(GetOwningPlayer(lCaster),'e00E',lXX,lYY,0)
        call UnitAddAbility(lTemp,'A0L7')
        call SetUnitAbilityLevel(lTemp,'A0L7',EluneArrowStunCalc(lXF,lYF,lXX,lYY))
        call IssueTargetOrderById(lTemp,OrderId("thunderbolt"),lFirst)
        call UnitDamageTarget(lCaster,lFirst,90*GetUnitAbilityLevel(lCaster,'A0L8'),true,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_MAGIC,WEAPON_TYPE_WHOKNOWS)
        call KillUnit(lBolt)
        call KillTimer(lMove)
    elseif(lXN-lXL)*(lXN-lXL)+(lYN-lYL)*(lYN-lYL)<1600 then
        call KillUnit(lBolt)
        call KillTimer(lMove)
    endif
endfunction

function EluneArrowAction takes nothing returns nothing
    local unit lCaster=GetTriggerUnit()
    local real lXX=SafeX(GetUnitX(lCaster))
    local real lYY=SafeY(GetUnitY(lCaster))
    local location lCastLoc=GetSpellTargetLoc()
    local real lXL=GetLocationX(lCastLoc)
    local real lYL=GetLocationY(lCastLoc)
    local real lAngle=Atan2(lYL-lYY,lXL-lXX)
    local timer lMove=CreateTimer()
    local string lTable=H2Tx(lMove)
    local unit lBolt=CreateUnit(GetOwningPlayer(lCaster),'h005',lXX,lYY,lAngle*bj_RADTODEG)
    call RemoveLocation(lCastLoc)
    call SetUnitFacing(lBolt,lAngle*bj_RADTODEG)
    call SetUnitPathing(lBolt,false)
    set lXL=SafeX(lXX+3000*Cos(lAngle))
    set lYL=SafeY(lYY+3000*Sin(lAngle))
    call SetReal(lTable,"OriginalX",lXX)
    call SetReal(lTable,"OriginalY",lYY)
    call SetReal(lTable,"TargetX",lXL)
    call SetReal(lTable,"TargetY",lYL)
    call SetReal(lTable,"Angle",lAngle)
    call SetHandle(lTable,"Hero",lCaster)
    call SetHandle(lTable,"Projectile",lBolt)
    call TimerStart(lMove,.035,true,function EluneArrowTimer)
endfunction

function HJ takes nothing returns nothing
    local trigger ltt=CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(ltt,EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(ltt,Condition(function EluneArrowCheck))
    call TriggerAddAction(ltt,function EluneArrowAction)
    call SpellPreload('A0L7')
endfunction


function InitTrig_Elune_Arrow takes nothing returns nothing
endfunction[/jass]

不知道这个是不是真的代码。。。
在执行EluneArrowFilter这个的时候,要用到全局函数,set udg_u_DTAX_temp=lCaster,也就是选取的单位是施法者的敌人。
那么,如果在白虎A施放这个技能之后的整数倍0.35秒的那个时刻,如果这个技能还没有完成,白虎B也施放了这个技能,2个白虎不是盟友,那么就会同时间设置u_DTAX_temp,是不是就会出现一些问题啊?
发表于 2008-9-6 13:17:46 | 显示全部楼层
没有任何出问题的可能性,赋值只是为了能够在filter里获取这个值而已,是即时的,而且不作任何其他操作,不会出问题
回复

使用道具 举报

 楼主| 发表于 2008-9-6 13:29:24 | 显示全部楼层
那么如果2个白虎同时施放的时候2个都要同时赋值啊?
回复

使用道具 举报

发表于 2008-9-6 13:31:11 | 显示全部楼层
函数不可能同时执行的,总有先后,只要这个先后分出来就不会有任何问题
回复

使用道具 举报

 楼主| 发表于 2008-9-6 13:47:02 | 显示全部楼层
那么请帮我看下这个函数吧,
造成伤害的地方有点问题呢
代码如下:
[jass]function Trig_BSXX2_Conditions takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == 'A03R' ) ) then
        return false
    endif
    return true
endfunction

function JHFilter takes nothing returns boolean
    return IsUnitInGroup(GetFilterUnit(), udg_G) == false and IsUnitEnemy(GetFilterUnit(),GetOwningPlayer(udg_U_temp))and  GetUnitState(GetFilterUnit(),UNIT_STATE_LIFE)>1 and IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE)==false
endfunction
function IceDoAnyThing takes nothing returns nothing
      local unit u = udg_U_temp
      local location p
      local real DM =  (GetUnitAbilityLevel(u, 'A03R')*15+ 0.7*(GetUnitUserData(u)))
      local string s = udg_D      //D里面存储的是触发器名字,为了读取绑定在触发器上的缓存
   local boolexpr lCheck
      local unit dmg
      local real angle = GetUnitFacing(GetEnumUnit())
      local real tempX = GetUnitX( GetEnumUnit() ) + 15 * Cos( (3.14159/180) * angle   )
      local real tempY = GetUnitY( GetEnumUnit() ) + 15 * Sin( (3.14159/180) * angle   )
      local group lGroup2 = GetGroup(s,"damaged")
   local group lGroup = CreateGroup()
      set udg_G = lGroup2//同月女箭的那个一样,临时设置了 施放技能的单位 u在U_temp里面,还设置了 不满足条件所以不能被选取的单位组lGroup2在G里面
      set lCheck=Condition(function JHFilter)//开始选取
      call GroupEnumUnitsInRange(lGroup,tempX,tempY,20,lCheck)
      loop
      set dmg = FirstOfGroup(lGroup)
      exitwhen dmg == null
      set p = Location(GetUnitX(dmg),GetUnitY(dmg))
      call CreateNUnitsAtLocFacingLocBJ( 1, 'e005', GetOwningPlayer(u), p,p)
      call UnitAddAbility( GetLastCreatedUnit(), 'A03Q' )
      call IssueTargetOrder( GetLastCreatedUnit(), "ensnare", dmg )
      call UnitApplyTimedLifeBJ( 4.00, 'BTLF', GetLastCreatedUnit() )     
      call RemoveLocation(p)
      set p = null
      call CDamage(u,dmg,DM)//伤害函数,这里也有问题,当前面选取条件的范围大一些的时候,比如50(上面是20),会很容易一个单位多次受到伤害。本来受到伤害之后的单位会添加到lGroup2里面的,然后就不会被选取了,结果不知道哪里出了问题,还是要被选取。当施法者离敌人很近施放这个技能的时候,如果判断范围是50就很容易连续出现2次伤害。
      call GroupAddUnit(lGroup2,dmg)
      call GroupRemoveUnit(lGroup,dmg)
      endloop
      call SetHandle(s,"damaged",lGroup2)
      call SetUnitX( GetEnumUnit(), tempX )
      call SetUnitY( GetEnumUnit(), tempY )
endfunction
function IceTimer takes nothing returns boolean
      local trigger t = GetTriggeringTrigger()
      local string s = H2S(t)
      local group g = GetGroup(s, "CasterGroup")
     local unit u = GetUnit(s,"source")
set udg_U_temp = u
      set udg_D = s
      if GetTriggerEvalCount(t) > 25 then
            call DestroyGroup(g)
            call DestroyTrigger(t)
      else
            call ForGroup(g, function IceDoAnyThing)
      endif
      set t=null
      return false
endfunction
function IceSpell takes nothing returns nothing
      local unit source = GetTriggerUnit()
      local group g = CreateGroup()
      local group g2 = CreateGroup()
      local unit u
      local real x = GetUnitX(source)
      local real y = GetUnitY(source)
      local integer i = 0
      local integer num = 48
      local trigger t = CreateTrigger()
      local string s = H2S(t)
      loop
            exitwhen i > num
            set u = CreateUnit(GetOwningPlayer(source),'e00C', x, y, 360*i/num)
            call UnitApplyTimedLife( u, 'BTLF', 0.60 )
            call GroupAddUnit(g, u)
            set i = i + 1
      endloop
      call SetHandle(s, "CasterGroup",g)
      call SetHandle(s, "Source", source)
      call SetHandle(s,"damaged",g2)
      call TriggerRegisterTimerEvent(t, 0.03, true)
      call TriggerAddCondition(t, Condition(function IceTimer))
      set t = null
      set u = null
      set source = null
      set g = null
endfunction

//===========================================================================
function InitTrig_BSXX2 takes nothing returns nothing
    set gg_trg_BSXX2 = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_BSXX2, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_BSXX2, Condition( function Trig_BSXX2_Conditions ) )
    call TriggerAddAction( gg_trg_BSXX2, function IceSpell )
endfunction

[/jass]
不知道为什么可能多次造成伤害

谢谢了
回复

使用道具 举报

发表于 2008-9-6 14:03:03 | 显示全部楼层
只要是用全局变量就有冲突的可能吧,至于会不会出现冲突的就概率问题了,如果全局变量使用的范围比较小,这段代码很快运行过去,冲突的概率就比较小,如果代码很长,冲突的概率就会变大。
回复

使用道具 举报

发表于 2008-9-6 14:07:29 | 显示全部楼层
IceDoAnyThing 里一样可以用GetUnit(s,"source"),不然这和T有什么区别


LZ连IceDoAnyThing 这个名字都没改
回复

使用道具 举报

 楼主| 发表于 2008-9-6 14:22:58 | 显示全部楼层
不是啊。。。没有听明白欸~
IceDoAnyThing里面,s哪来啊?不是只能用全局变量保存,然后取来的吗。。

哈哈,被你发现了。

那个,为什么要造成多次伤害啊
回复

使用道具 举报

发表于 2008-9-6 15:30:42 | 显示全部楼层
http://www.islga.org/bbs/read.php?tid=18913


看回你自己的贴,该说的都说了
回复

使用道具 举报

 楼主| 发表于 2008-9-6 17:43:49 | 显示全部楼层
被挖坟了。。

看不明白。。。
回复

使用道具 举报

 楼主| 发表于 2008-9-6 20:48:49 | 显示全部楼层
不是啊。。。没有听明白欸~
IceDoAnyThing里面,s哪来啊?不是只能用全局变量保存,然后取来的吗。。

哈哈,被你发现了。

那个,为什么要造成多次伤害啊
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-7-21 06:29 , Processed in 0.030952 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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