偶久网

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索

网站魔兽热门地图

查看: 2677|回复: 4

6.67B猛犸BUG原理,Shift键机制,这不是IF的错

  [复制链接]
邪恶叔 title=
发表于 2010-4-2 15:44:36
6.67C出来了 ,这个BUG只能作为茶余饭后的调侃一下。

war3的shift机制是没有等待触发动作。
比如说猛犸从A点跳刀到B然后施放獠牙冲刺对自身,这些都是顺序执行的,

然而shift机制是没有等待时间的,它可以让玩家跳过操作动作,完成0等待动作,甚至跳过施法和面向单位等等待时间。(你可以认为是电脑在神级操作一般。)

原理:在跳刀施放前,shift打断了这种顺序执行。


猛犸从(shift键)A点跳刀到B然后(shift键)施放獠牙冲刺对自身如下执行顺序:

*假设M为猛犸獠牙冲刺的位置

从A点跳到B

shift自身

表面上已经跳到B点后,实际上跳刀还处于执行状态。

shift机制发动,触发撩牙冲击技能触发,并且优先与跳刀物品的触发。跳刀还处于执行状态

设置M=A点位置,跳刀效果接近完成执行状态

撩牙技能位移触发发动,造成BUG产生。

可见shift自身机制优先与跳刀和部分技能的执行,这与猛犸的獠牙冲刺能D自身也是BUG产生一个重要因素。
参见刺客是色狼的白虎R自身,和双头龙两面喷帖子。
实践失败:小鱼人,白虎因为施法动作和面向方向位移,测试失败。
1.gif

  1. function DL3 takes nothing returns boolean
    local trigger t=GetTriggeringTrigger()
    local integer DMI=GetHandleId(t)
    local unit GCI=(LoadUnitHandle(TY,(DMI),(2)))
    local unit DM3=(LoadUnitHandle(TY,(DMI),(393)))
    local unit DN3=(LoadUnitHandle(TY,(DMI),(394)))
    local integer FVI=(LoadInteger(TY,(DMI),(5)))
    local real HKI=(LoadReal(TY,(DMI),(47)))
    local real HLI=(LoadReal(TY,(DMI),(48)))
    local real LTO=(LoadReal(TY,(DMI),(13)))
    local real QNO=(LoadReal(TY,(DMI),(6)))
    local real QSO=(LoadReal(TY,(DMI),(7)))
    local real VEI=QNO+19*Cos(LTO)
    local real VFI=QSO+19*Sin(LTO)
    local group g
    local integer DS3=(LoadInteger(TY,(DMI),(12)))
    local location l
    call SetUnitPosition(GCI,VEI,VFI)
    call SetUnitFacing(GCI,LTO*bj_RADTODEG)
    call SaveReal(TY,(DMI),(6),((VEI)*1.0))
    call SaveReal(TY,(DMI),(7),((VFI)*1.0))
    if ModuloInteger(GetTriggerEvalCount(t),4)==0 then
    call DestroyEffect(AddSpecialEffect("Abilities\\Weapons\\AncientProtectorMissile\\AncientProtectorMissile.mdl",VEI,VFI))
    endif
    if GetTriggerEvalCount(t)==2 then
    call SetUnitAnimationByIndex(GCI,3)
    endif
    if DM3==null or DN3==null then
    set FK=GCI
    set g=DFI()
    call GroupEnumUnitsInRange(g,VEI,VFI,120,Condition(function XMI))
    if FirstOfGroup(g)!=null then
    if DM3!=null then
    call GroupRemoveUnit(g,DM3)
    endif
    if FirstOfGroup(g)!=null then
    if DM3==null then
    set DM3=FirstOfGroup(g)
    call SetUnitPathing(DM3,false)
    elseif DN3==null then
    set DN3=FirstOfGroup(g)
    call SetUnitPathing(DN3,false)
    endif
    endif
    endif
    call DEI(g)
    set g=null
    endif
    call SaveUnitHandle(TY,(DMI),(393),(DM3))
    call SaveUnitHandle(TY,(DMI),(394),(DN3))
    if DM3!=null then
    call SetUnitPosition(DM3,VEI,VFI)
    endif
    if DN3!=null then
    call SetUnitPosition(DN3,VEI,VFI)
    endif
    if ModuloInteger(GetTriggerEvalCount(t),3)==0 then
    call ZPI(VEI,VFI,200)
    endif
    if GetTriggerEventId()==EVENT_UNIT_DEATH or GetTriggerEvalCount(t)>DS3 then
    call DestroyEffect((LoadEffectHandle(TY,(DMI),(175))))
    call SetUnitAnimationByIndex(GCI,0)
    call SetUnitTimeScale(GCI,1.0)
    call SetUnitPathing(GCI,true)
    call FlushChildHashtable(TY,(DMI))
    call DWI(t)
    if DM3!=null then
    if IsPointInRegion(KN,GetUnitX(DM3),GetUnitY(DM3))==true then
    set l=JDI(GetUnitX(DM3),GetUnitY(DM3))
    call SetUnitX(DM3,GetLocationX(l))
    call SetUnitY(DM3,GetLocationY(l))
    call RemoveLocation(l)
    set l=null
    endif
    call DK3(GCI,DM3,FVI)
    call ZPI(GetUnitX(DM3),GetUnitY(DM3),300)
    endif
    if DN3!=null then
    if IsPointInRegion(KN,GetUnitX(DN3),GetUnitY(DN3))==true then
    set l=JDI(GetUnitX(DN3),GetUnitY(DN3))
    call SetUnitX(DN3,GetLocationX(l))
    call SetUnitY(DN3,GetLocationY(l))
    call RemoveLocation(l)
    set l=null
    endif
    call DK3(GCI,DN3,FVI)
    call ZPI(GetUnitX(DN3),GetUnitY(DN3),300)
    endif
    if DM3!=null and V7I(DM3)==false then
    call IssueTargetOrder(GCI,"attack",DM3)
    elseif DN3!=null and V7I(DN3)==false then
    call IssueTargetOrder(GCI,"attack",DN3)
    endif
    call ZPI(VEI,VFI,375)
    if IsPointInRegion(KN,GetUnitX(GCI),GetUnitY(GCI))==true then
    set l=JDI(GetUnitX(GCI),GetUnitY(GCI))
    call SetUnitX(GCI,GetLocationX(l))
    call SetUnitY(GCI,GetLocationY(l))
    call RemoveLocation(l)
    set l=null
    endif
    endif
    set t=null
    set GCI=null
    return false
    endfunction

    function DT3 takes nothing returns nothing
    local trigger t=CreateTrigger()
    local integer DMI=GetHandleId(t)
    local real HKI=H0I(GetSpellTargetX())
    local real HLI=H1I(GetSpellTargetY())
    local unit GCI=GetTriggerUnit()
    local real HYI=GetUnitX(GCI)
    local real HJI=GetUnitY(GCI)
    local integer FVI=GetUnitAbilityLevel(GCI,1093751364)
    call SetUnitPathing(GCI,false)
    call SetUnitAnimationByIndex(GCI,3)
    call SetUnitTimeScale(GCI,1.5)
    call TriggerRegisterTimerEvent(t,0.02,true)
    call TriggerRegisterUnitEvent(t,GCI,EVENT_UNIT_DEATH)
    call TriggerAddCondition(t,Condition(function DL3))
    call SaveUnitHandle(TY,(DMI),(2),(GCI))
    call SaveInteger(TY,(DMI),(5),(FVI))
    call SaveUnitHandle(TY,(DMI),(393),(null))
    call SaveUnitHandle(TY,(DMI),(394),(null))
    call SaveReal(TY,(DMI),(47),((HKI)*1.0))
    call SaveReal(TY,(DMI),(48),((HLI)*1.0))
    call SaveReal(TY,(DMI),(6),((HYI)*1.0))
    call SaveReal(TY,(DMI),(7),((HJI)*1.0))
    call SaveReal(TY,(DMI),(13),((Atan2(HLI-HJI,HKI-HYI))*1.0))
    call SaveInteger(TY,(DMI),(12),(R2I(HSI(HYI,HJI,HKI,HLI)/19.0)))
    call SaveEffectHandle(TY,(DMI),(175),(AddSpecialEffectTarget("war3mapImported\\SkewerTuskGlow_1.mdx",GCI,"head")))
    set t=null
    set GCI=null
    endfunction


    function DR3 takes nothing returns boolean
    if GetSpellAbilityId()==1093751364 then
    call DT3()
    endif
    return false
    endfunction
复制代码
bird_gao
发表于 2010-4-14 11:34:20
恩,现在猛犸大虎啊
ck5524209
发表于 2010-6-2 21:31:26
我什么都不知道。。。
发表于 2010-6-18 13:23:43
了解,闪人了!不喜欢4条腿的飘过!
wb2ttwb
发表于 2010-6-18 15:56:37
现在猛犸大虎
快速回复 返回顶部 返回列表