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自身,和双头龙两面喷帖子。
实践失败:小鱼人,白虎因为施法动作和面向方向位移,测试失败。
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
复制代码 |