找回密码
 点一下
查看: 3881|回复: 7

DOTA月神之箭代码

[复制链接]
发表于 2007-12-18 19:28:12 | 显示全部楼层 |阅读模式
DOTA里面月神之箭,在游戏里面是飞行到一定距离箭才消失,但是代码里面是箭和施法点距离小于40箭就消失?想了很久都不明白,求解释
月神之箭的施法距离为3000,G字头和hb()都是读写缓存的函数


function uI takes nothing returns boolean
    return GetSpellAbilityId()=='A0L8'
endfunction
function uj takes nothing returns boolean
    return IsUnitEnemy(GetFilterUnit(),GetOwningPlayer(Ae))and GetUnitAbilityLevel(GetFilterUnit(),'A04R')==0 and GetUnitState(GetFilterUnit(),UNIT_STATE_LIFE)>1 and IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE)==false
endfunction
function uJ takes real uk,real uK,real iN,real io returns integer
    local real in=SquareRoot((iN-uk)*(iN-uk)+(io-uK)*(io-uK))
    return iF(R2I(in/150),10)
endfunction
function ul takes nothing returns nothing
    local timer t=GetExpiredTimer()
    local string Hj=Gt(t)
    local unit Hl=G2(Hj,"Hero")
    local unit IJ=G2(Hj,"Projectile")
    local real hN=hb(Hj,"TargetX")
    local real ho=hb(Hj,"TargetY")
    local real RK=hb(Hj,"Angle")
    local real iN=GetUnitX(IJ)
    local real io=GetUnitY(IJ)
    local real Il=H6(GetUnitX(IJ)+30*Cos(RK))
    local real IL=H8(GetUnitY(IJ)+30*Sin(RK))
    local boolexpr hP=Condition(function uj)
    local group hO=CreateGroup()
    local unit oA
    local unit iM
    local real uk
    local real uK
    call SetUnitX(IJ,Il)
    call SetUnitY(IJ,IL)
    set Ae=Hl
    call GroupEnumUnitsInRange(hO,Il,IL,140,hP)
    set iM=FirstOfGroup(hO)
    call DestroyGroup(hO)
    call DestroyBoolExpr(hP)
    if iM!=null then
        set uk=hb(Hj,"OriginalX")
        set uK=hb(Hj,"OriginalY")
        set oA=CreateUnit(GetOwningPlayer(Hl),'e00E',iN,io,0)
        call UnitAddAbility(oA,'A0L7')
        call SetUnitAbilityLevel(oA,'A0L7',uJ(uk,uK,iN,io))
        call IssueTargetOrderById(oA,852095,iM)
        call UnitDamageTarget(Hl,iM,90*GetUnitAbilityLevel(Hl,'A0L8'),true,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_MAGIC,WEAPON_TYPE_WHOKNOWS)
        call KillUnit(IJ)
        call i0(t)
    elseif(Il-hN)*(Il-hN)+(IL-ho)*(IL-ho)<1600 then
        call KillUnit(IJ)
        call i0(t) //i0(t)作用为停止并销毁timer t
    endif
endfunction
function uL takes nothing returns nothing
    local unit Hl=GetTriggerUnit()
    local real iN=H6(GetUnitX(Hl))
    local real io=H8(GetUnitY(Hl))
    local location sy=GetSpellTargetLoc()
    local real hN=GetLocationX(sy)
    local real ho=GetLocationY(sy)
    local real RK=Atan2(ho-io,hN-iN)
    local timer t=CreateTimer()
    local string Hj=Gt(t)
    local unit IJ=CreateUnit(GetOwningPlayer(Hl),'h005',iN,io,RK*bj_RADTODEG)
    call RemoveLocation(sy)
    call SetUnitFacing(IJ,RK*bj_RADTODEG)
    call SetUnitPathing(IJ,false)
    set hN=H6(iN+3000*Cos(RK))
    set ho=H8(io+3000*Sin(RK))
    call GY(Hj,"OriginalX",iN)
    call GY(Hj,"OriginalY",io)
    call GY(Hj,"TargetX",hN)
    call GY(Hj,"TargetY",ho)
    call GY(Hj,"Angle",RK)
    call Gw(Hj,"Hero",Hl)
    call Gw(Hj,"Projectile",IJ)
    call TimerStart(t,.035,true,function ul)
endfunction
function lp takes nothing returns nothing
    local trigger t=CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(t,EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(t,Condition(function uI))
    call TriggerAddAction(t,function uL)
    call H9('A0L7')
endfunction
发表于 2007-12-18 19:40:06 | 显示全部楼层
楼上再仔细看一次最好了.
   你说的40,指的是那根箭,和箭应该到达的目标位置处,为40而己
回复

使用道具 举报

 楼主| 发表于 2007-12-18 19:47:53 | 显示全部楼层
不过在游戏里面,月神之箭是一直飞出去的,施法目标点只是指示一个方向,如果释放点在3000范围以内,即使箭飞过了施法目标点,箭还是继续飞直到飞到一定距离才消失。可能我比较笨,还是看不明白,可不可以详细说一下?
回复

使用道具 举报

发表于 2007-12-18 20:30:10 | 显示全部楼层
所以,我说是箭应该到的目标,而不是用鼠标点出来的东西.

是把MOP和放技能的点,连成一线,在这个方向上,走3000距离到的点. 如下面的两个函数
    set hN=H6(iN+3000*Cos(RK))
    set ho=H8(io+3000*Sin(RK))

早期的dota版本,有的技能就没有那个H6和H8函数,这两个函数是取边界值的.
比如左边界-4096,下边界-4096, 那么如果上面求出这个点为: (-5000,0),而5000比-4096小,于是,目标点将变为:
(-4096,0)
你可以用月渣箭,在地图边界处,对着地图边界入一下试试,这个月渣箭会沿着地图边界横着走的.
回复

使用道具 举报

 楼主| 发表于 2007-12-18 20:39:28 | 显示全部楼层
哦,原来是我看漏了两句- -!!!!谢谢了
回复

使用道具 举报

发表于 2007-12-21 17:50:42 | 显示全部楼层
先把角度算出来不就完了吗
local real Face=(180/3.14159)*Atan2(技能施放点y-英雄位置y,技能施放点x-英雄位置x)
回复

使用道具 举报

发表于 2008-1-18 22:22:01 | 显示全部楼层
引用第5楼林小可于2007-12-21 17:50发表的  :
先把角度算出来不就完了吗
local real Face=(180/3.14159)*Atan2(技能施放点y-英雄位置y,技能施放点x-英雄位置x)
先算角度a,之后前进r,
每一次设置r=r+rcosa,r=r+rsina
是不可以的.  这个东西叫累积误差.
先求出角度的那个地方就是有误差的,之后每一次都做cos运算,还是会有误差.  这样的话,前进2000距离,可能会出现高达100的误差.

还有一点,war3对浮点数可能做了处理.可以试一试
1.001和1.0011,这两个是相等的,这么说,误差最后会弄出很大来.
所以,最好不要使用三角函数进行数列求和.
回复

使用道具 举报

发表于 2008-1-18 23:16:50 | 显示全部楼层
感情月神箭用的是IssueOrder.....
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 04:03 , Processed in 0.108909 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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