Ледяная ловушка Герой создает 8 опорных точек, через которые пропускает воздух и воду, превращая их в лед. Он соединяет точки потоками холодного воздуха, сковывая противников, попавших в ловушку. После нескольких мекунд обездвиживания целям наносится урон, а ловушка уничтожается.
[1] Sir Nikolas Название: Сфера молний Описание: Окружает указанного воина щитом молний на 20/25/30 сек. Враги, атакующие защищенную цель в ближнем бою (<= 200), получают 25/50/75 ед. урона за атаку.
И он еще вертится.
Знаю, особой красотой не отличается, но я делал упор на исполнение, т. е. на геометрию. Рекомендуется скачать и запустить, т. к. на скринах получилось не очень хорошо.
Добавлено (26 Сентябрь 2011, 12:36:26) --------------------------------------------- Количество дуг, молний в дуге и многое другое настраивается максимально просто.
SirNikolas, но в конечном итоге у тебя получается вот такая бяка с кучей всякого лишнего
Code
globals endglobals function InitGlobals takes nothing returns nothing endfunction function CreateUnitsForPlayer0 takes nothing returns nothing local player p=Player(0) local unit u local integer unitID local trigger t local real life set u=CreateUnit(p,0x48303030,942.5,-1193.9,119.450) call SetHeroLevel(u,10,false) set u=CreateUnit(p,0x68666F6F,891.2,-1298.3,116.250) set u=CreateUnit(p,0x68666F6F,1047.6,-1220.8,122.057) set u=CreateUnit(p,0x686B6E69,1043.7,-1366.8,119.552) endfunction function CreateNeutralHostile takes nothing returns nothing local player p=Player(PLAYER_NEUTRAL_AGGRESSIVE) local unit u local integer unitID local trigger t local real life set u=CreateUnit(p,0x6F677275,-1030.6,753.1,315.613) set u=CreateUnit(p,0x6F677275,-848.4,843.8,312.026) set u=CreateUnit(p,0x6F646F63,-1045.9,890.6,314.065) call SetUnitState(u,UNIT_STATE_MANA,0) set u=CreateUnit(p,0x6F68756E,-1183.3,827.7,315.383) endfunction function CreatePlayerBuildings takes nothing returns nothing endfunction function CreatePlayerUnits takes nothing returns nothing call CreateUnitsForPlayer0() endfunction function CreateAllUnits takes nothing returns nothing call CreatePlayerBuildings() call CreateNeutralHostile() call CreatePlayerUnits() endfunction scope LightningSphere globals
endglobals private struct Spell static constant hashtable Hash=InitHashtable() static constant location L=Location(.0,.0) static constant trigger T=CreateTrigger() static constant group G=CreateGroup() static boolean Guard=true unit u timer t=CreateTimer() lightning array l[28] integer time=0 integer switcher=0 integer level integer id real radius=.0 real rotate=.0 static method Conditions takes nothing returns boolean return GetSpellAbilityId()==0x41303030 endmethod static method Timer takes nothing returns nothing local thistype this=LoadInteger(Hash,GetHandleId(GetExpiredTimer()),0) local real x=GetWidgetX(this.u) local real y=GetWidgetY(this.u) local real k1=6.283/4 local real k2=3.142/7 local real z local integer i=0 local real alpha local real cosA local real sinA local integer j local real beta local real beta2 local real w1 local real w2 local integer id local integer s call MoveLocation(L,x,y) set z=GetLocationZ(L)+GetUnitFlyHeight(this.u)+85. if this.switcher==0 then set this.radius=this.radius+(85.)*.05 if this.time>=(1.)/.05 then set this.switcher=1 endif elseif this.switcher==1 then if this.time>=(15.+this.level*5.-(1.))/.05 then set this.switcher=2 endif else set this.radius=this.radius-(85.)*.05 endif loop
set alpha=i*k1+this.rotate set cosA=Cos(alpha) set sinA=Sin(alpha) set j=0 loop
set beta=1.571-j*k2 set beta2=1.571-(j+1.)*k2 set w1=Cos(beta)*this.radius set w2=Cos(beta2)*this.radius call MoveLightningEx(this.l[i*7+j],false,x+cosA*w1,y+sinA*w1,z+Sin(beta)*this.radius,x+cosA*w2,y+sinA*w2,z+Sin(beta2)*this.radius)
set j=j+1 exitwhen j>=7
endloop
set i=i+1 exitwhen i>=4
endloop set rotate=rotate+.2 set this.time=this.time+1 if this.time>=(15.+this.level*5.)/.05 then call RemoveSavedInteger(Hash,GetHandleId(this.t),0) set id=GetHandleId(this.u) loop
set s=LoadInteger(Hash,id,this.id+1) exitwhen s==0 call SaveInteger(Hash,id,this.id,s) set this.id=this.id+1 endloop call RemoveSavedInteger(Hash,id,this.id) call PauseTimer(this.t) call DestroyTimer(this.t) set i=0 loop
call DestroyLightning(this.l[i]) set this.l[i]=null
set i=i+1 exitwhen i>=28
endloop set this.u=null set this.t=null call destroy(this) endif endmethod static method Actions takes nothing returns nothing local thistype this=create() local integer i=0 local integer id set this.u=GetSpellTargetUnit() set this.level=GetUnitAbilityLevel(GetTriggerUnit(),0x41303030) loop
set this.l[i]=AddLightning("CLPB",false,.0,.0,.0,.0)
set i=i+1 exitwhen i>=28
endloop if not IsUnitInGroup(this.u,G) then call TriggerRegisterUnitEvent(T,this.u,EVENT_UNIT_DAMAGED) call GroupAddUnit(G,this.u) endif call SaveInteger(Hash,GetHandleId(this.t),0,this) set id=GetHandleId(this.u) set i=0 loop exitwhen not HaveSavedInteger(Hash,id,i) set i=i+1 endloop set this.id=i call SaveInteger(Hash,id,i,this) call TimerStart(this.t,.05,true,function thistype.Timer) endmethod static method Death takes nothing returns nothing local integer id=GetHandleId(GetTriggerUnit()) local integer i=0 local thistype this loop
set this=LoadInteger(Hash,id,i) exitwhen this==0 if this.time<(1.)/.05 then set this.time=R2I((15.+this.level*5.)/.05-this.time) elseif this.time<(15.+this.level*5.-(1.))/.05 then set this.time=R2I((15.+this.level*5.-(1.))/.05) endif set i=i+1 endloop endmethod static method Damage takes nothing returns nothing local widget w=GetEventDamageSource() local widget u=GetTriggerUnit() local integer id=GetHandleId(u) local real dx=GetWidgetX(u)-GetWidgetX(w) local real dy=GetWidgetY(u)-GetWidgetY(w) local integer i=0 local thistype this if Guard and dx*dx+dy*dy<=40000. then set Guard=false loop
set this=LoadInteger(Hash,id,i) exitwhen this==0 call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Orc\\LightningBolt\\LightningBoltMissile.mdl",w,"origin")) call UnitDamageTarget(this.u,w,25.*this.level,true,false,ATTACK_TYPE_MAGIC,DAMAGE_TYPE_MAGIC,WEAPON_TYPE_WHOKNOWS) set i=i+1 endloop set Guard=true endif set w=null set u=null endmethod static method onInit takes nothing returns nothing local trigger cast=CreateTrigger() local trigger death=CreateTrigger() local integer i=0 loop