Добавлен ssbbssc
Искал наработку заклинания, смысл которого в следующем
При каста герой выпускает непрерывный луч, который наносит урон первой враждебной цели, которую поразит
По сути - способность Феникса из доты
года три назад лежала у меня на старом харде, но сейчас к нему нет доступа
Кто-нибудь видел\знает где есть такой спелл\наработка\пак способностей Феникса из доты?
При каста герой выпускает непрерывный луч, который наносит урон первой враждебной цели, которую поразит
По сути - способность Феникса из доты
года три назад лежала у меня на старом харде, но сейчас к нему нет доступа
Кто-нибудь видел\знает где есть такой спелл\наработка\пак способностей Феникса из доты?
Принятый ответ
quq_CCCP:
Как это реализовано, ведь идет пик юнитов вдоль этого луча, но не думаю что сделано через цикл создающий группы и перебор юнитов, накладно для железа.
В общем вот тебе скрипт, достал из доты, разбирайся
Там вроде даже несколько молний создаются, с этим разобрались, вопрос будет в следующем :)Там луч основан на кастом молнии (точнее на эффекте молннии под названием "mana drain"), созданную кодом молнию можно красить в любой цвет и масштабировать, ну остальное думаю и так понятно.
Как это реализовано, ведь идет пик юнитов вдоль этого луча, но не думаю что сделано через цикл создающий группы и перебор юнитов, накладно для железа.
В общем вот тебе скрипт, достал из доты, разбирайся
Script
function NKA takes nothing returns boolean
local trigger t=GetTriggeringTrigger()
local integer h=GetHandleId(t)
local integer c=(LoadInteger(HY,(h),(34)))
local unit IGO=(LoadUnitHandle(HY,(h),(2)))
local real LLR=GetUnitFacing(IGO)
local real NLA=LLR*bj_DEGTORAD
local location NMA=GetUnitLoc(IGO)
local real T4E=GetLocationZ(NMA)
local location NPA=Location(GetUnitX(IGO)+DME*Cos(NLA),GetUnitY(IGO)+DME*Sin(NLA))
local real NQA=GetLocationZ(NPA)
local lightning l1=(LoadLightningHandle(HY,(h),(676)))
local lightning l2=(LoadLightningHandle(HY,(h),(677)))
local lightning l3=(LoadLightningHandle(HY,(h),(678)))
local lightning l4=(LoadLightningHandle(HY,(h),(679)))
local lightning l5=(LoadLightningHandle(HY,(h),(680)))
local real NSA=1
local real x
local real y
local real r1
local real NTA
local real NUA
local real NWA
local real NYA
local real NZA
local real N_A
local real N0A
local real N1A
local real N2A
local real N3A
local real N4A
local real N5A
local real N6A
local real N7A
local real N8A
local real N9A
local real BVA
local real BEA
local real BXA
local real BOA
local real BRA
local real BIA
local real BAA
local real BNA
local real BBA
local real BCA
local real BDA
local real BFA
local real BGA
local real BHA
local group g
local real BJA
local real BKA
local integer L0E
local real BLA
local real BMA
local real BPA
local boolean MIE=false
local boolean MAE=false
local unit Q9E=(LoadUnitHandle(HY,(h),(17)))
local unit UIE=null
local unit R3X=null
local real BQA
local real BSA
local real BTA
local real BUA=(LoadReal(HY,(h),(688)))
local boolean QMX=(LoadBoolean(HY,(h),(689)))
local boolean QTX=(LoadBoolean(HY,(h),(672)))
local real BWA
local ubersplat YEE
local real loc_real49=(LoadReal(HY,(h),(23)))
local real loc_real50=(LoadReal(HY,(h),(24)))
local real loc_real51
local real loc_real52
local real BYA
local real BZA=5
if GetUnitCurrentOrder(IGO)==$D0021 then
call DisableTrigger(t)
call SBE(IGO)
call EnableTrigger(t)
endif
call RemoveLocation(NMA)
call RemoveLocation(NPA)
if IsUnitPaused(IGO)==false and(GetTriggerEventId()==EVENT_UNIT_ISSUED_POINT_ORDER or GetTriggerEventId()==EVENT_UNIT_ISSUED_TARGET_ORDER)then
set x=GetUnitX(IGO)
set y=GetUnitY(IGO)
if GetIssuedOrderId()!=$D020A and GetIssuedOrderId()!=$D00D9 and GetIssuedOrderId()!=$D0278 then
call DisableTrigger(t)
call SBE(IGO)
call EnableTrigger(t)
endif
if GetIssuedOrderId()==$D0003 then
if GetTriggerEventId()==EVENT_UNIT_ISSUED_TARGET_ORDER then
set BJA=GetUnitX(GetOrderTargetUnit())
set BKA=GetUnitY(GetOrderTargetUnit())
else
set BJA=GetOrderPointX()
set BKA=GetOrderPointY()
endif
set BLA=TSE(BJA,BKA,x,y)
if BLA<0 then
set BLA=BLA+360
endif
set BPA=LLR-BLA
if BPA<0 then
set BPA=BPA+360
endif
if BPA<$B4 then
set MIE=true
set BMA=LLR+6
else
set MAE=true
set BMA=LLR-6
endif
set BUA=TSE(BJA,BKA,x,y)+$B4
call SaveReal(HY,(h),(688),((BUA)*1.))
endif
elseif GetTriggerEventId()==EVENT_UNIT_SPELL_EFFECT or GetTriggerEventId()==EVENT_WIDGET_DEATH or(LoadInteger(HY,(GetHandleId(IGO)),(704)))==-1 or c>=6./.02 or YSE(IGO)or P2E(IGO)then
if GetTriggerEventId()!=EVENT_UNIT_SPELL_EFFECT or(GetTriggerEventId()==EVENT_UNIT_SPELL_EFFECT and(GetSpellAbilityId()=='A1Z3' or GetSpellAbilityId()=='A1RK' or GetSpellAbilityId()=='A315' or GetSpellAbilityId()=='A27H'))then
call SaveInteger(HY,(GetHandleId((IGO))),((4312)),(2))
call Y5E(IGO)
call SetUnitPathing(IGO,true)
call RemoveUnit(LoadUnitHandle(HY,h,0))
call FlushChildHashtable(HY,(h))
call MWE(t)
call UnitRemoveAbility(IGO,'A205')
call SetPlayerAbilityAvailable(GetOwningPlayer(IGO),'A1Z3',false)
call SetPlayerAbilityAvailable(GetOwningPlayer(IGO),'A205',false)
if(LoadInteger(HY,(GetHandleId(IGO)),(704)))==0 or(LoadInteger(HY,(GetHandleId(IGO)),(704)))=='A1YY' then
call SetPlayerAbilityAvailable(GetOwningPlayer(IGO),'A1YY',true)
endif
call DestroyLightning(l1)
call DestroyLightning(l2)
call DestroyLightning(l3)
call DestroyLightning(l4)
call DestroyLightning(l5)
call StopSound(RQ,false,true)
endif
elseif GetTriggerEventId()==EVENT_UNIT_ISSUED_ORDER then
if GetIssuedOrderId()==852177then
set QMX=true
endif
if GetIssuedOrderId()==852178then
set QMX=false
endif
call SaveBoolean(HY,(h),(689),(QMX))
else
set BLA=LLR-BUA
if BLA<-$B4 then
set BLA=BLA+360
elseif BLA>$B4 then
set BLA=BLA-360
endif
set BWA=1
if c<35 and QTX then
set BWA=7
endif
if BLA<(-1*BWA)then
set LLR=LLR+BWA
elseif BLA>BWA then
set LLR=LLR-BWA
else
set QTX=false
call SaveBoolean(HY,(h),(672),(QTX))
set LLR=BUA
endif
if((LoadInteger(HY,(GetHandleId((IGO))),((4301))))==1)==false then
call SetUnitFacing(IGO,LLR)
endif
set NLA=LLR*bj_DEGTORAD
set c=c+1
call SaveInteger(HY,(h),(34),(c))
set r1=DME
set x=GetUnitX(IGO)+50*Cos(NLA)
set y=GetUnitY(IGO)+50*Sin(NLA)
if QMX and YPE(IGO)==false and YSE(IGO)==false then
if((LoadInteger(HY,(GetHandleId((IGO))),((4331))))==1) then
set BZA=BZA*2
endif
set BTA=NLA
set BQA=SFE(GetUnitX(IGO)+BZA*Cos(BTA))
set BSA=SJE(GetUnitY(IGO)+BZA*Sin(BTA))
call UEE(BQA,BSA,$C8)
call SetUnitX(IGO,BQA)
call SetUnitY(IGO,BSA)
endif
call SetUnitState(IGO,UNIT_STATE_LIFE,GetUnitState(IGO,UNIT_STATE_LIFE)-GetUnitState(IGO,UNIT_STATE_LIFE)*.06*.02)
call UEE(x,y,$C8)
if ModuloInteger(c,$A)==0 then
set DWE=MSE()
set J1=IGO
set L0E=0
loop
exitwhen L0E*50>DME
set BJA=x+L0E*50*Cos(NLA)
set BKA=y+L0E*50*Sin(NLA)
set g=MSE()
call GroupEnumUnitsInRange(g,BJA,BKA,$9B,Condition(function ZBE))
call GroupAddGroup(g,DWE)
call GroupEnumUnitsInRange(g,BJA,BKA,$9B,Condition(function Z_E))
call GroupAddGroup(g,DWE)
call MQE(g)
if ModuloInteger(L0E,3)==0 then
call UDE(GetOwningPlayer(IGO),2,BJA,BKA,$E1)
endif
set L0E=L0E+1
endloop
set DUE=IGO
set DTE=GetUnitAbilityLevel(IGO,'A1YY')
set BYA=(I2R(c)/50.)/6
set DYE=(5*DTE+$A)+(5*DTE+$A)*BYA
set DZE=(DTE+BYA*(DTE))/'d'
call GroupRemoveUnit(DWE,IGO)
call ForGroup(DWE,function NJA)
call MQE(DWE)
set g=null
set DWE=null
endif
if ULE(IGO)==false then
if Q9E!=null then
set r1=S6E(IGO,Q9E)
endif
set NTA=x
set NUA=y
set NWA=T4E+$C8
set NYA=NTA+r1*Cos(NLA)
set NZA=NUA+r1*Sin(NLA)
set N_A=NQA
set N0A=x+DPE*Cos((LLR-90)*bj_DEGTORAD)
set N1A=y+DQE*Cos((LLR-90)*bj_DEGTORAD)
set N2A=T4E+$C8
set N3A=N0A+r1*Cos(NLA)
set N4A=N1A+r1*Sin(NLA)
set N5A=NQA
set N6A=x+DPE*Cos((LLR+90)*bj_DEGTORAD)
set N7A=y+DQE*Cos((LLR+90)*bj_DEGTORAD)
set N8A=T4E+$C8
set N9A=N6A+r1*Cos(NLA)
set BVA=N7A+r1*Sin(NLA)
set BEA=NQA
set BXA=x
set BOA=y
set BRA=T4E+$C8+DSE
set BIA=BXA+r1*Cos(NLA)
set BAA=BOA+r1*Sin(NLA)
set BNA=NQA
set BBA=x
set BCA=y
set BDA=T4E+$C8-DSE
set BFA=BBA+r1*Cos(NLA)
set BGA=BCA+r1*Sin(NLA)
set BHA=NQA
if ModuloInteger(c,$A)==0 and r1==DME then
set BJA=GetUnitX(IGO)+(DME)*Cos(NLA)
set BKA=GetUnitY(IGO)+(DME)*Sin(NLA)
call DestroyEffect(AddSpecialEffect("war3mapImported\\FireRayTarget.mdx",BJA,BKA))
endif
if ModuloInteger(c,$A)==0 then
call SetSoundPosition(RQ,GetUnitX(IGO),GetUnitY(IGO),'d')
set BJA=GetUnitX(IGO)+(r1)*Cos(NLA)
set BKA=GetUnitY(IGO)+(r1)*Sin(NLA)
set YEE=CreateUbersplat(BJA,BKA,"SRAY",$FF,$FF,$FF,$FF,false,false)
call SetUbersplatRenderAlways(YEE,true)
call YXE(YEE,$A)
set YEE=null
endif
call MoveLightningEx(l1,false,NTA,NUA,NWA,NYA,NZA,N_A)
call MoveLightningEx(l2,false,N0A,N1A,N2A,N3A,N4A,N5A)
call MoveLightningEx(l3,false,N6A,N7A,N8A,N9A,BVA,BEA)
call MoveLightningEx(l4,false,BXA,BOA,BRA,BIA,BAA,BNA)
call MoveLightningEx(l5,false,BBA,BCA,BDA,BFA,BGA,BHA)
call SetLightningColor(l1,1.,1.,1.,NSA)
call SetLightningColor(l2,1.,1.,1.,NSA)
call SetLightningColor(l3,1.,1.,1.,NSA)
call SetLightningColor(l4,1.,1.,1.,NSA)
call SetLightningColor(l5,1.,1.,1.,NSA)
endif
endif
set t=null
set IGO=null
set l1=null
set l2=null
set l3=null
set l4=null
set l5=null
set NMA=null
set NPA=null
return false
endfunction
local trigger t=GetTriggeringTrigger()
local integer h=GetHandleId(t)
local integer c=(LoadInteger(HY,(h),(34)))
local unit IGO=(LoadUnitHandle(HY,(h),(2)))
local real LLR=GetUnitFacing(IGO)
local real NLA=LLR*bj_DEGTORAD
local location NMA=GetUnitLoc(IGO)
local real T4E=GetLocationZ(NMA)
local location NPA=Location(GetUnitX(IGO)+DME*Cos(NLA),GetUnitY(IGO)+DME*Sin(NLA))
local real NQA=GetLocationZ(NPA)
local lightning l1=(LoadLightningHandle(HY,(h),(676)))
local lightning l2=(LoadLightningHandle(HY,(h),(677)))
local lightning l3=(LoadLightningHandle(HY,(h),(678)))
local lightning l4=(LoadLightningHandle(HY,(h),(679)))
local lightning l5=(LoadLightningHandle(HY,(h),(680)))
local real NSA=1
local real x
local real y
local real r1
local real NTA
local real NUA
local real NWA
local real NYA
local real NZA
local real N_A
local real N0A
local real N1A
local real N2A
local real N3A
local real N4A
local real N5A
local real N6A
local real N7A
local real N8A
local real N9A
local real BVA
local real BEA
local real BXA
local real BOA
local real BRA
local real BIA
local real BAA
local real BNA
local real BBA
local real BCA
local real BDA
local real BFA
local real BGA
local real BHA
local group g
local real BJA
local real BKA
local integer L0E
local real BLA
local real BMA
local real BPA
local boolean MIE=false
local boolean MAE=false
local unit Q9E=(LoadUnitHandle(HY,(h),(17)))
local unit UIE=null
local unit R3X=null
local real BQA
local real BSA
local real BTA
local real BUA=(LoadReal(HY,(h),(688)))
local boolean QMX=(LoadBoolean(HY,(h),(689)))
local boolean QTX=(LoadBoolean(HY,(h),(672)))
local real BWA
local ubersplat YEE
local real loc_real49=(LoadReal(HY,(h),(23)))
local real loc_real50=(LoadReal(HY,(h),(24)))
local real loc_real51
local real loc_real52
local real BYA
local real BZA=5
if GetUnitCurrentOrder(IGO)==$D0021 then
call DisableTrigger(t)
call SBE(IGO)
call EnableTrigger(t)
endif
call RemoveLocation(NMA)
call RemoveLocation(NPA)
if IsUnitPaused(IGO)==false and(GetTriggerEventId()==EVENT_UNIT_ISSUED_POINT_ORDER or GetTriggerEventId()==EVENT_UNIT_ISSUED_TARGET_ORDER)then
set x=GetUnitX(IGO)
set y=GetUnitY(IGO)
if GetIssuedOrderId()!=$D020A and GetIssuedOrderId()!=$D00D9 and GetIssuedOrderId()!=$D0278 then
call DisableTrigger(t)
call SBE(IGO)
call EnableTrigger(t)
endif
if GetIssuedOrderId()==$D0003 then
if GetTriggerEventId()==EVENT_UNIT_ISSUED_TARGET_ORDER then
set BJA=GetUnitX(GetOrderTargetUnit())
set BKA=GetUnitY(GetOrderTargetUnit())
else
set BJA=GetOrderPointX()
set BKA=GetOrderPointY()
endif
set BLA=TSE(BJA,BKA,x,y)
if BLA<0 then
set BLA=BLA+360
endif
set BPA=LLR-BLA
if BPA<0 then
set BPA=BPA+360
endif
if BPA<$B4 then
set MIE=true
set BMA=LLR+6
else
set MAE=true
set BMA=LLR-6
endif
set BUA=TSE(BJA,BKA,x,y)+$B4
call SaveReal(HY,(h),(688),((BUA)*1.))
endif
elseif GetTriggerEventId()==EVENT_UNIT_SPELL_EFFECT or GetTriggerEventId()==EVENT_WIDGET_DEATH or(LoadInteger(HY,(GetHandleId(IGO)),(704)))==-1 or c>=6./.02 or YSE(IGO)or P2E(IGO)then
if GetTriggerEventId()!=EVENT_UNIT_SPELL_EFFECT or(GetTriggerEventId()==EVENT_UNIT_SPELL_EFFECT and(GetSpellAbilityId()=='A1Z3' or GetSpellAbilityId()=='A1RK' or GetSpellAbilityId()=='A315' or GetSpellAbilityId()=='A27H'))then
call SaveInteger(HY,(GetHandleId((IGO))),((4312)),(2))
call Y5E(IGO)
call SetUnitPathing(IGO,true)
call RemoveUnit(LoadUnitHandle(HY,h,0))
call FlushChildHashtable(HY,(h))
call MWE(t)
call UnitRemoveAbility(IGO,'A205')
call SetPlayerAbilityAvailable(GetOwningPlayer(IGO),'A1Z3',false)
call SetPlayerAbilityAvailable(GetOwningPlayer(IGO),'A205',false)
if(LoadInteger(HY,(GetHandleId(IGO)),(704)))==0 or(LoadInteger(HY,(GetHandleId(IGO)),(704)))=='A1YY' then
call SetPlayerAbilityAvailable(GetOwningPlayer(IGO),'A1YY',true)
endif
call DestroyLightning(l1)
call DestroyLightning(l2)
call DestroyLightning(l3)
call DestroyLightning(l4)
call DestroyLightning(l5)
call StopSound(RQ,false,true)
endif
elseif GetTriggerEventId()==EVENT_UNIT_ISSUED_ORDER then
if GetIssuedOrderId()==852177then
set QMX=true
endif
if GetIssuedOrderId()==852178then
set QMX=false
endif
call SaveBoolean(HY,(h),(689),(QMX))
else
set BLA=LLR-BUA
if BLA<-$B4 then
set BLA=BLA+360
elseif BLA>$B4 then
set BLA=BLA-360
endif
set BWA=1
if c<35 and QTX then
set BWA=7
endif
if BLA<(-1*BWA)then
set LLR=LLR+BWA
elseif BLA>BWA then
set LLR=LLR-BWA
else
set QTX=false
call SaveBoolean(HY,(h),(672),(QTX))
set LLR=BUA
endif
if((LoadInteger(HY,(GetHandleId((IGO))),((4301))))==1)==false then
call SetUnitFacing(IGO,LLR)
endif
set NLA=LLR*bj_DEGTORAD
set c=c+1
call SaveInteger(HY,(h),(34),(c))
set r1=DME
set x=GetUnitX(IGO)+50*Cos(NLA)
set y=GetUnitY(IGO)+50*Sin(NLA)
if QMX and YPE(IGO)==false and YSE(IGO)==false then
if((LoadInteger(HY,(GetHandleId((IGO))),((4331))))==1) then
set BZA=BZA*2
endif
set BTA=NLA
set BQA=SFE(GetUnitX(IGO)+BZA*Cos(BTA))
set BSA=SJE(GetUnitY(IGO)+BZA*Sin(BTA))
call UEE(BQA,BSA,$C8)
call SetUnitX(IGO,BQA)
call SetUnitY(IGO,BSA)
endif
call SetUnitState(IGO,UNIT_STATE_LIFE,GetUnitState(IGO,UNIT_STATE_LIFE)-GetUnitState(IGO,UNIT_STATE_LIFE)*.06*.02)
call UEE(x,y,$C8)
if ModuloInteger(c,$A)==0 then
set DWE=MSE()
set J1=IGO
set L0E=0
loop
exitwhen L0E*50>DME
set BJA=x+L0E*50*Cos(NLA)
set BKA=y+L0E*50*Sin(NLA)
set g=MSE()
call GroupEnumUnitsInRange(g,BJA,BKA,$9B,Condition(function ZBE))
call GroupAddGroup(g,DWE)
call GroupEnumUnitsInRange(g,BJA,BKA,$9B,Condition(function Z_E))
call GroupAddGroup(g,DWE)
call MQE(g)
if ModuloInteger(L0E,3)==0 then
call UDE(GetOwningPlayer(IGO),2,BJA,BKA,$E1)
endif
set L0E=L0E+1
endloop
set DUE=IGO
set DTE=GetUnitAbilityLevel(IGO,'A1YY')
set BYA=(I2R(c)/50.)/6
set DYE=(5*DTE+$A)+(5*DTE+$A)*BYA
set DZE=(DTE+BYA*(DTE))/'d'
call GroupRemoveUnit(DWE,IGO)
call ForGroup(DWE,function NJA)
call MQE(DWE)
set g=null
set DWE=null
endif
if ULE(IGO)==false then
if Q9E!=null then
set r1=S6E(IGO,Q9E)
endif
set NTA=x
set NUA=y
set NWA=T4E+$C8
set NYA=NTA+r1*Cos(NLA)
set NZA=NUA+r1*Sin(NLA)
set N_A=NQA
set N0A=x+DPE*Cos((LLR-90)*bj_DEGTORAD)
set N1A=y+DQE*Cos((LLR-90)*bj_DEGTORAD)
set N2A=T4E+$C8
set N3A=N0A+r1*Cos(NLA)
set N4A=N1A+r1*Sin(NLA)
set N5A=NQA
set N6A=x+DPE*Cos((LLR+90)*bj_DEGTORAD)
set N7A=y+DQE*Cos((LLR+90)*bj_DEGTORAD)
set N8A=T4E+$C8
set N9A=N6A+r1*Cos(NLA)
set BVA=N7A+r1*Sin(NLA)
set BEA=NQA
set BXA=x
set BOA=y
set BRA=T4E+$C8+DSE
set BIA=BXA+r1*Cos(NLA)
set BAA=BOA+r1*Sin(NLA)
set BNA=NQA
set BBA=x
set BCA=y
set BDA=T4E+$C8-DSE
set BFA=BBA+r1*Cos(NLA)
set BGA=BCA+r1*Sin(NLA)
set BHA=NQA
if ModuloInteger(c,$A)==0 and r1==DME then
set BJA=GetUnitX(IGO)+(DME)*Cos(NLA)
set BKA=GetUnitY(IGO)+(DME)*Sin(NLA)
call DestroyEffect(AddSpecialEffect("war3mapImported\\FireRayTarget.mdx",BJA,BKA))
endif
if ModuloInteger(c,$A)==0 then
call SetSoundPosition(RQ,GetUnitX(IGO),GetUnitY(IGO),'d')
set BJA=GetUnitX(IGO)+(r1)*Cos(NLA)
set BKA=GetUnitY(IGO)+(r1)*Sin(NLA)
set YEE=CreateUbersplat(BJA,BKA,"SRAY",$FF,$FF,$FF,$FF,false,false)
call SetUbersplatRenderAlways(YEE,true)
call YXE(YEE,$A)
set YEE=null
endif
call MoveLightningEx(l1,false,NTA,NUA,NWA,NYA,NZA,N_A)
call MoveLightningEx(l2,false,N0A,N1A,N2A,N3A,N4A,N5A)
call MoveLightningEx(l3,false,N6A,N7A,N8A,N9A,BVA,BEA)
call MoveLightningEx(l4,false,BXA,BOA,BRA,BIA,BAA,BNA)
call MoveLightningEx(l5,false,BBA,BCA,BDA,BFA,BGA,BHA)
call SetLightningColor(l1,1.,1.,1.,NSA)
call SetLightningColor(l2,1.,1.,1.,NSA)
call SetLightningColor(l3,1.,1.,1.,NSA)
call SetLightningColor(l4,1.,1.,1.,NSA)
call SetLightningColor(l5,1.,1.,1.,NSA)
endif
endif
set t=null
set IGO=null
set l1=null
set l2=null
set l3=null
set l4=null
set l5=null
set NMA=null
set NPA=null
return false
endfunction
function B_A takes nothing returns nothing
local trigger t=CreateTrigger()
local integer h=GetHandleId(t)
local unit IGO=GetTriggerUnit()
local real x=GetUnitX(IGO)
local real y=GetUnitY(IGO)
local real OLX=TSE(x,y,GetSpellTargetX(),GetSpellTargetY())*bj_DEGTORAD
local real dx=SFE(x+DME*Cos(OLX))
local real dy=SJE(y+DME*Sin(OLX))
local lightning l1=AddLightning("SRAY",false,x,y,dx,dy)
local lightning l2=AddLightning("SRAY",false,x,y,dx,dy)
local lightning l3=AddLightning("SRAY",false,x,y,dx,dy)
local lightning l4=AddLightning("SRAY",false,x,y,dx,dy)
local lightning l5=AddLightning("SRAY",false,x,y,dx,dy)
local unit V0X
if GetUnitAbilityLevel(IGO,'A14K')>0 then
set V0X=CreateUnit(GetOwningPlayer(IGO),'e00E',x,y,0)
call KZE(V0X,'A14K')
call SaveUnitHandle(HY,h,0,V0X)
set V0X=null
endif
call SetUnitFacing(IGO,OLX*bj_RADTODEG)
call StartSound(RQ)
call SetSoundPosition(RQ,x,y,'d')
call TriggerRegisterTimerEvent(t,.02,true)
call TriggerRegisterDeathEvent(t,IGO)
call TriggerRegisterUnitEvent(t,IGO,EVENT_UNIT_ISSUED_TARGET_ORDER)
call TriggerRegisterUnitEvent(t,IGO,EVENT_UNIT_ISSUED_POINT_ORDER)
call TriggerRegisterUnitEvent(t,IGO,EVENT_UNIT_ISSUED_ORDER)
call TriggerRegisterUnitEvent(t,IGO,EVENT_UNIT_SPELL_EFFECT)
call TriggerAddCondition(t,Condition(function NKA))
call SaveUnitHandle(HY,(h),(2),(IGO))
call SaveReal(HY,(h),($D),((OLX)*1.))
call SaveReal(HY,(h),(688),((OLX*bj_RADTODEG)*1.))
call SaveLightningHandle(HY,(h),(676),(l1))
call SaveLightningHandle(HY,(h),(677),(l2))
call SaveLightningHandle(HY,(h),(678),(l3))
call SaveLightningHandle(HY,(h),(679),(l4))
call SaveLightningHandle(HY,(h),(680),(l5))
call SaveBoolean(HY,(h),(689),(false))
call SaveBoolean(HY,(h),(672),(true))
call SaveReal(HY,(h),(688),((OLX*bj_RADTODEG)*1.))
call SaveReal(HY,(h),(23),((x)*1.))
call SaveReal(HY,(h),(24),((y)*1.))
call Y4E(IGO)
call SaveInteger(HY,(GetHandleId((IGO))),((4312)),(1))
call SetUnitPathing(IGO,false)
call SetPlayerAbilityAvailable(GetOwningPlayer(IGO),'A1Z3',true)
call SetPlayerAbilityAvailable(GetOwningPlayer(IGO),'A205',true)
call SetPlayerAbilityAvailable(GetOwningPlayer(IGO),'A1YY',false)
call KZE(IGO,'A1Z3')
call KZE(IGO,'A205')
call TriggerEvaluate(t)
set t=null
set IGO=null
set IGO=null
set l1=null
set l2=null
set l3=null
set l4=null
set l5=null
endfunction
local trigger t=CreateTrigger()
local integer h=GetHandleId(t)
local unit IGO=GetTriggerUnit()
local real x=GetUnitX(IGO)
local real y=GetUnitY(IGO)
local real OLX=TSE(x,y,GetSpellTargetX(),GetSpellTargetY())*bj_DEGTORAD
local real dx=SFE(x+DME*Cos(OLX))
local real dy=SJE(y+DME*Sin(OLX))
local lightning l1=AddLightning("SRAY",false,x,y,dx,dy)
local lightning l2=AddLightning("SRAY",false,x,y,dx,dy)
local lightning l3=AddLightning("SRAY",false,x,y,dx,dy)
local lightning l4=AddLightning("SRAY",false,x,y,dx,dy)
local lightning l5=AddLightning("SRAY",false,x,y,dx,dy)
local unit V0X
if GetUnitAbilityLevel(IGO,'A14K')>0 then
set V0X=CreateUnit(GetOwningPlayer(IGO),'e00E',x,y,0)
call KZE(V0X,'A14K')
call SaveUnitHandle(HY,h,0,V0X)
set V0X=null
endif
call SetUnitFacing(IGO,OLX*bj_RADTODEG)
call StartSound(RQ)
call SetSoundPosition(RQ,x,y,'d')
call TriggerRegisterTimerEvent(t,.02,true)
call TriggerRegisterDeathEvent(t,IGO)
call TriggerRegisterUnitEvent(t,IGO,EVENT_UNIT_ISSUED_TARGET_ORDER)
call TriggerRegisterUnitEvent(t,IGO,EVENT_UNIT_ISSUED_POINT_ORDER)
call TriggerRegisterUnitEvent(t,IGO,EVENT_UNIT_ISSUED_ORDER)
call TriggerRegisterUnitEvent(t,IGO,EVENT_UNIT_SPELL_EFFECT)
call TriggerAddCondition(t,Condition(function NKA))
call SaveUnitHandle(HY,(h),(2),(IGO))
call SaveReal(HY,(h),($D),((OLX)*1.))
call SaveReal(HY,(h),(688),((OLX*bj_RADTODEG)*1.))
call SaveLightningHandle(HY,(h),(676),(l1))
call SaveLightningHandle(HY,(h),(677),(l2))
call SaveLightningHandle(HY,(h),(678),(l3))
call SaveLightningHandle(HY,(h),(679),(l4))
call SaveLightningHandle(HY,(h),(680),(l5))
call SaveBoolean(HY,(h),(689),(false))
call SaveBoolean(HY,(h),(672),(true))
call SaveReal(HY,(h),(688),((OLX*bj_RADTODEG)*1.))
call SaveReal(HY,(h),(23),((x)*1.))
call SaveReal(HY,(h),(24),((y)*1.))
call Y4E(IGO)
call SaveInteger(HY,(GetHandleId((IGO))),((4312)),(1))
call SetUnitPathing(IGO,false)
call SetPlayerAbilityAvailable(GetOwningPlayer(IGO),'A1Z3',true)
call SetPlayerAbilityAvailable(GetOwningPlayer(IGO),'A205',true)
call SetPlayerAbilityAvailable(GetOwningPlayer(IGO),'A1YY',false)
call KZE(IGO,'A1Z3')
call KZE(IGO,'A205')
call TriggerEvaluate(t)
set t=null
set IGO=null
set IGO=null
set l1=null
set l2=null
set l3=null
set l4=null
set l5=null
endfunction
для удобства копирни в редактор триггеров, так проще читается
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
открываем и смотрим
Как это реализовано, ведь идет пик юнитов вдоль этого луча, но не думаю что сделано через цикл создающий группы и перебор юнитов, накладно для железа.
В общем вот тебе скрипт, достал из доты, разбирайся
local trigger t=GetTriggeringTrigger()
local integer h=GetHandleId(t)
local integer c=(LoadInteger(HY,(h),(34)))
local unit IGO=(LoadUnitHandle(HY,(h),(2)))
local real LLR=GetUnitFacing(IGO)
local real NLA=LLR*bj_DEGTORAD
local location NMA=GetUnitLoc(IGO)
local real T4E=GetLocationZ(NMA)
local location NPA=Location(GetUnitX(IGO)+DME*Cos(NLA),GetUnitY(IGO)+DME*Sin(NLA))
local real NQA=GetLocationZ(NPA)
local lightning l1=(LoadLightningHandle(HY,(h),(676)))
local lightning l2=(LoadLightningHandle(HY,(h),(677)))
local lightning l3=(LoadLightningHandle(HY,(h),(678)))
local lightning l4=(LoadLightningHandle(HY,(h),(679)))
local lightning l5=(LoadLightningHandle(HY,(h),(680)))
local real NSA=1
local real x
local real y
local real r1
local real NTA
local real NUA
local real NWA
local real NYA
local real NZA
local real N_A
local real N0A
local real N1A
local real N2A
local real N3A
local real N4A
local real N5A
local real N6A
local real N7A
local real N8A
local real N9A
local real BVA
local real BEA
local real BXA
local real BOA
local real BRA
local real BIA
local real BAA
local real BNA
local real BBA
local real BCA
local real BDA
local real BFA
local real BGA
local real BHA
local group g
local real BJA
local real BKA
local integer L0E
local real BLA
local real BMA
local real BPA
local boolean MIE=false
local boolean MAE=false
local unit Q9E=(LoadUnitHandle(HY,(h),(17)))
local unit UIE=null
local unit R3X=null
local real BQA
local real BSA
local real BTA
local real BUA=(LoadReal(HY,(h),(688)))
local boolean QMX=(LoadBoolean(HY,(h),(689)))
local boolean QTX=(LoadBoolean(HY,(h),(672)))
local real BWA
local ubersplat YEE
local real loc_real49=(LoadReal(HY,(h),(23)))
local real loc_real50=(LoadReal(HY,(h),(24)))
local real loc_real51
local real loc_real52
local real BYA
local real BZA=5
if GetUnitCurrentOrder(IGO)==$D0021 then
call DisableTrigger(t)
call SBE(IGO)
call EnableTrigger(t)
endif
call RemoveLocation(NMA)
call RemoveLocation(NPA)
if IsUnitPaused(IGO)==false and(GetTriggerEventId()==EVENT_UNIT_ISSUED_POINT_ORDER or GetTriggerEventId()==EVENT_UNIT_ISSUED_TARGET_ORDER)then
set x=GetUnitX(IGO)
set y=GetUnitY(IGO)
if GetIssuedOrderId()!=$D020A and GetIssuedOrderId()!=$D00D9 and GetIssuedOrderId()!=$D0278 then
call DisableTrigger(t)
call SBE(IGO)
call EnableTrigger(t)
endif
if GetIssuedOrderId()==$D0003 then
if GetTriggerEventId()==EVENT_UNIT_ISSUED_TARGET_ORDER then
set BJA=GetUnitX(GetOrderTargetUnit())
set BKA=GetUnitY(GetOrderTargetUnit())
else
set BJA=GetOrderPointX()
set BKA=GetOrderPointY()
endif
set BLA=TSE(BJA,BKA,x,y)
if BLA<0 then
set BLA=BLA+360
endif
set BPA=LLR-BLA
if BPA<0 then
set BPA=BPA+360
endif
if BPA<$B4 then
set MIE=true
set BMA=LLR+6
else
set MAE=true
set BMA=LLR-6
endif
set BUA=TSE(BJA,BKA,x,y)+$B4
call SaveReal(HY,(h),(688),((BUA)*1.))
endif
elseif GetTriggerEventId()==EVENT_UNIT_SPELL_EFFECT or GetTriggerEventId()==EVENT_WIDGET_DEATH or(LoadInteger(HY,(GetHandleId(IGO)),(704)))==-1 or c>=6./.02 or YSE(IGO)or P2E(IGO)then
if GetTriggerEventId()!=EVENT_UNIT_SPELL_EFFECT or(GetTriggerEventId()==EVENT_UNIT_SPELL_EFFECT and(GetSpellAbilityId()=='A1Z3' or GetSpellAbilityId()=='A1RK' or GetSpellAbilityId()=='A315' or GetSpellAbilityId()=='A27H'))then
call SaveInteger(HY,(GetHandleId((IGO))),((4312)),(2))
call Y5E(IGO)
call SetUnitPathing(IGO,true)
call RemoveUnit(LoadUnitHandle(HY,h,0))
call FlushChildHashtable(HY,(h))
call MWE(t)
call UnitRemoveAbility(IGO,'A205')
call SetPlayerAbilityAvailable(GetOwningPlayer(IGO),'A1Z3',false)
call SetPlayerAbilityAvailable(GetOwningPlayer(IGO),'A205',false)
if(LoadInteger(HY,(GetHandleId(IGO)),(704)))==0 or(LoadInteger(HY,(GetHandleId(IGO)),(704)))=='A1YY' then
call SetPlayerAbilityAvailable(GetOwningPlayer(IGO),'A1YY',true)
endif
call DestroyLightning(l1)
call DestroyLightning(l2)
call DestroyLightning(l3)
call DestroyLightning(l4)
call DestroyLightning(l5)
call StopSound(RQ,false,true)
endif
elseif GetTriggerEventId()==EVENT_UNIT_ISSUED_ORDER then
if GetIssuedOrderId()==852177then
set QMX=true
endif
if GetIssuedOrderId()==852178then
set QMX=false
endif
call SaveBoolean(HY,(h),(689),(QMX))
else
set BLA=LLR-BUA
if BLA<-$B4 then
set BLA=BLA+360
elseif BLA>$B4 then
set BLA=BLA-360
endif
set BWA=1
if c<35 and QTX then
set BWA=7
endif
if BLA<(-1*BWA)then
set LLR=LLR+BWA
elseif BLA>BWA then
set LLR=LLR-BWA
else
set QTX=false
call SaveBoolean(HY,(h),(672),(QTX))
set LLR=BUA
endif
if((LoadInteger(HY,(GetHandleId((IGO))),((4301))))==1)==false then
call SetUnitFacing(IGO,LLR)
endif
set NLA=LLR*bj_DEGTORAD
set c=c+1
call SaveInteger(HY,(h),(34),(c))
set r1=DME
set x=GetUnitX(IGO)+50*Cos(NLA)
set y=GetUnitY(IGO)+50*Sin(NLA)
if QMX and YPE(IGO)==false and YSE(IGO)==false then
if((LoadInteger(HY,(GetHandleId((IGO))),((4331))))==1) then
set BZA=BZA*2
endif
set BTA=NLA
set BQA=SFE(GetUnitX(IGO)+BZA*Cos(BTA))
set BSA=SJE(GetUnitY(IGO)+BZA*Sin(BTA))
call UEE(BQA,BSA,$C8)
call SetUnitX(IGO,BQA)
call SetUnitY(IGO,BSA)
endif
call SetUnitState(IGO,UNIT_STATE_LIFE,GetUnitState(IGO,UNIT_STATE_LIFE)-GetUnitState(IGO,UNIT_STATE_LIFE)*.06*.02)
call UEE(x,y,$C8)
if ModuloInteger(c,$A)==0 then
set DWE=MSE()
set J1=IGO
set L0E=0
loop
exitwhen L0E*50>DME
set BJA=x+L0E*50*Cos(NLA)
set BKA=y+L0E*50*Sin(NLA)
set g=MSE()
call GroupEnumUnitsInRange(g,BJA,BKA,$9B,Condition(function ZBE))
call GroupAddGroup(g,DWE)
call GroupEnumUnitsInRange(g,BJA,BKA,$9B,Condition(function Z_E))
call GroupAddGroup(g,DWE)
call MQE(g)
if ModuloInteger(L0E,3)==0 then
call UDE(GetOwningPlayer(IGO),2,BJA,BKA,$E1)
endif
set L0E=L0E+1
endloop
set DUE=IGO
set DTE=GetUnitAbilityLevel(IGO,'A1YY')
set BYA=(I2R(c)/50.)/6
set DYE=(5*DTE+$A)+(5*DTE+$A)*BYA
set DZE=(DTE+BYA*(DTE))/'d'
call GroupRemoveUnit(DWE,IGO)
call ForGroup(DWE,function NJA)
call MQE(DWE)
set g=null
set DWE=null
endif
if ULE(IGO)==false then
if Q9E!=null then
set r1=S6E(IGO,Q9E)
endif
set NTA=x
set NUA=y
set NWA=T4E+$C8
set NYA=NTA+r1*Cos(NLA)
set NZA=NUA+r1*Sin(NLA)
set N_A=NQA
set N0A=x+DPE*Cos((LLR-90)*bj_DEGTORAD)
set N1A=y+DQE*Cos((LLR-90)*bj_DEGTORAD)
set N2A=T4E+$C8
set N3A=N0A+r1*Cos(NLA)
set N4A=N1A+r1*Sin(NLA)
set N5A=NQA
set N6A=x+DPE*Cos((LLR+90)*bj_DEGTORAD)
set N7A=y+DQE*Cos((LLR+90)*bj_DEGTORAD)
set N8A=T4E+$C8
set N9A=N6A+r1*Cos(NLA)
set BVA=N7A+r1*Sin(NLA)
set BEA=NQA
set BXA=x
set BOA=y
set BRA=T4E+$C8+DSE
set BIA=BXA+r1*Cos(NLA)
set BAA=BOA+r1*Sin(NLA)
set BNA=NQA
set BBA=x
set BCA=y
set BDA=T4E+$C8-DSE
set BFA=BBA+r1*Cos(NLA)
set BGA=BCA+r1*Sin(NLA)
set BHA=NQA
if ModuloInteger(c,$A)==0 and r1==DME then
set BJA=GetUnitX(IGO)+(DME)*Cos(NLA)
set BKA=GetUnitY(IGO)+(DME)*Sin(NLA)
call DestroyEffect(AddSpecialEffect("war3mapImported\\FireRayTarget.mdx",BJA,BKA))
endif
if ModuloInteger(c,$A)==0 then
call SetSoundPosition(RQ,GetUnitX(IGO),GetUnitY(IGO),'d')
set BJA=GetUnitX(IGO)+(r1)*Cos(NLA)
set BKA=GetUnitY(IGO)+(r1)*Sin(NLA)
set YEE=CreateUbersplat(BJA,BKA,"SRAY",$FF,$FF,$FF,$FF,false,false)
call SetUbersplatRenderAlways(YEE,true)
call YXE(YEE,$A)
set YEE=null
endif
call MoveLightningEx(l1,false,NTA,NUA,NWA,NYA,NZA,N_A)
call MoveLightningEx(l2,false,N0A,N1A,N2A,N3A,N4A,N5A)
call MoveLightningEx(l3,false,N6A,N7A,N8A,N9A,BVA,BEA)
call MoveLightningEx(l4,false,BXA,BOA,BRA,BIA,BAA,BNA)
call MoveLightningEx(l5,false,BBA,BCA,BDA,BFA,BGA,BHA)
call SetLightningColor(l1,1.,1.,1.,NSA)
call SetLightningColor(l2,1.,1.,1.,NSA)
call SetLightningColor(l3,1.,1.,1.,NSA)
call SetLightningColor(l4,1.,1.,1.,NSA)
call SetLightningColor(l5,1.,1.,1.,NSA)
endif
endif
set t=null
set IGO=null
set l1=null
set l2=null
set l3=null
set l4=null
set l5=null
set NMA=null
set NPA=null
return false
endfunction
local trigger t=CreateTrigger()
local integer h=GetHandleId(t)
local unit IGO=GetTriggerUnit()
local real x=GetUnitX(IGO)
local real y=GetUnitY(IGO)
local real OLX=TSE(x,y,GetSpellTargetX(),GetSpellTargetY())*bj_DEGTORAD
local real dx=SFE(x+DME*Cos(OLX))
local real dy=SJE(y+DME*Sin(OLX))
local lightning l1=AddLightning("SRAY",false,x,y,dx,dy)
local lightning l2=AddLightning("SRAY",false,x,y,dx,dy)
local lightning l3=AddLightning("SRAY",false,x,y,dx,dy)
local lightning l4=AddLightning("SRAY",false,x,y,dx,dy)
local lightning l5=AddLightning("SRAY",false,x,y,dx,dy)
local unit V0X
if GetUnitAbilityLevel(IGO,'A14K')>0 then
set V0X=CreateUnit(GetOwningPlayer(IGO),'e00E',x,y,0)
call KZE(V0X,'A14K')
call SaveUnitHandle(HY,h,0,V0X)
set V0X=null
endif
call SetUnitFacing(IGO,OLX*bj_RADTODEG)
call StartSound(RQ)
call SetSoundPosition(RQ,x,y,'d')
call TriggerRegisterTimerEvent(t,.02,true)
call TriggerRegisterDeathEvent(t,IGO)
call TriggerRegisterUnitEvent(t,IGO,EVENT_UNIT_ISSUED_TARGET_ORDER)
call TriggerRegisterUnitEvent(t,IGO,EVENT_UNIT_ISSUED_POINT_ORDER)
call TriggerRegisterUnitEvent(t,IGO,EVENT_UNIT_ISSUED_ORDER)
call TriggerRegisterUnitEvent(t,IGO,EVENT_UNIT_SPELL_EFFECT)
call TriggerAddCondition(t,Condition(function NKA))
call SaveUnitHandle(HY,(h),(2),(IGO))
call SaveReal(HY,(h),($D),((OLX)*1.))
call SaveReal(HY,(h),(688),((OLX*bj_RADTODEG)*1.))
call SaveLightningHandle(HY,(h),(676),(l1))
call SaveLightningHandle(HY,(h),(677),(l2))
call SaveLightningHandle(HY,(h),(678),(l3))
call SaveLightningHandle(HY,(h),(679),(l4))
call SaveLightningHandle(HY,(h),(680),(l5))
call SaveBoolean(HY,(h),(689),(false))
call SaveBoolean(HY,(h),(672),(true))
call SaveReal(HY,(h),(688),((OLX*bj_RADTODEG)*1.))
call SaveReal(HY,(h),(23),((x)*1.))
call SaveReal(HY,(h),(24),((y)*1.))
call Y4E(IGO)
call SaveInteger(HY,(GetHandleId((IGO))),((4312)),(1))
call SetUnitPathing(IGO,false)
call SetPlayerAbilityAvailable(GetOwningPlayer(IGO),'A1Z3',true)
call SetPlayerAbilityAvailable(GetOwningPlayer(IGO),'A205',true)
call SetPlayerAbilityAvailable(GetOwningPlayer(IGO),'A1YY',false)
call KZE(IGO,'A1Z3')
call KZE(IGO,'A205')
call TriggerEvaluate(t)
set t=null
set IGO=null
set IGO=null
set l1=null
set l2=null
set l3=null
set l4=null
set l5=null
endfunction
большое спасибо, я уже сам искал доту открытую, но в версиях, которые нашел я, феникса еще не было
плюс я все же нашел копию этой наработки на ноуте (моя запасливость все же вывезла)
вроде год назад выкладывали
l_Avenger_l, это сделано через пик всех юнитов радиусе действия луча от феникса и поиском подходящего
и с помощью таймера так делается каждые 0,04 секунды
для компа это не особо накладно если фениксов 2-3
вот если одновременно работает 20 таймеров то будут проблемы
но если делать нормально а не как в доте (код доты ужасен, это подтверждённый факт) то можно сделать лишь 1 таймер который будет пробегать циклом по стеку и последовательно обрабатывать все лучи которые есть в стеке
пример этого есть в статьях (минимум 2)