[Setup] Product=Whirlwind Version=100 Archive=Whirlwind.umod SrcPath=. MasterPath=.. Requires=UnrealTournamentRequirement Group=SetupGroup Group=umodINIGroup Group=WhirlwindGroup [UnrealTournamentRequirement] Product=UnrealTournament Version= [SetupGroup] Copy=(Src=System\Manifest.ini,Master=System\Manifest.ini,Size=600,Flags=3) Copy=(Src=System\Manifest.int,Master=System\Manifest.int,Size=565,Flags=3) [umodINIGroup] AddIni=UnrealTournament.ini,Engine.GameEngine.ServerPackages=Whirlwind [WhirlwindGroup] File=(Src=System\Whirlwind.u,Size=33560) File=(Src=System\Whirlwind.int,Size=149) File=(Src=System\Whirlwind.ini,Size=297) File=(Src=Textures\WhirlwindTex.utx,Size=8951) File=(Src=System\Whirlwind.txt,Size=2351) [Setup] LocalProduct=Whirlwind ReadMe=System\Whirlwind.txt SetupWindowTitle=Whirlwind AutoplayWindowTitle=Whirlwind Options ProductURL=http://people.ce.mediaone.net/serpwidgets/UT.html VersionURL=http://people.ce.mediaone.net/serpwidgets/UT.html Developer=Serpentine Widgets DeveloperURL=http://people.ce.mediaone.net/serpwidgets/UT.html [UnrealTournamentRequirement] LocalProduct=UnrealTournament ProductURL=http://www.unrealtournament.com/ VersionURL=http://unreal.epicgames.com/ Developer=Epic Games, Inc. DeveloperURL=http://www.epicgames.com/ *E@h}Fz7 P,5hNone WhirlwindTornadoSpawnSettingsPawnPostBeginPlaySetPukedObjectTimerWhirlwindControlCoreEngine GravRadiusAffectedClasses AvgSpeed PinataEffectAffectsProjectilesToo GravStrength BecomePickupAllTick GetNavLocRndSpawnLocation NumTornadoes ProjectileSystemFindNewDestinationPinataThePlayerWanderTowardPlayersRotatorMeshTextureFellPickupStyleAmmo RotationRate DrawScalebFixedRotationDir LifeSpan WhirlwindMutWeaponbCollideWorld WarnTarget SoundVolumeUDamage ScaleGlowCollisionHeightBot ProcessTouch PinataSoundbNetTemporary Spectator TakeDamage AmbientSoundCollisionRadiusdropped AnimSequence FearThisSpotActorFireWAtYawiZ ScriptText ReturnValueLevel RespawnTimeN FireTexture Triggers LevelInfo LocationLodMesh PointRegionMutator bCanThrowInventoryGroup ZoneInfo InventoryOther HitLocation VelocityEnemyRegionZone TimerCounter TimerRateNavigationPointListdistweapTCnextNavigationPoint DestinationInv bTossedOutChargeNavigationPointPickupAmmoCount AmmoType bWeaponStay bMeleeWeapon AmmoAmountMomentumTransferMiscBestBotpack ZoneGravityAC RemoteRoleClassPackage TextBufferObject FunctionVectorStructStructPropertyClassProperty NamePropertyObjectPropertyFloatProperty BoolProperty IntProperty BytePropertySound DamageAmt DeltaTimeAmbSndAlreadySpawnedControllerNumNavs TheTornado AlreadyInitPickedLocationtcountnadoSomethingWasDropped LastDistance WanderCountDestETA LastDesttRotuDoriginvtVel ClosestDist FoundOnerSpdPicks NumPicksRndPicktV IAffectThis WhirlwindTexMyTex1LoopingOneShot AmbOutsidewind33call8eY GPRw4w4w40:t0:t0:t0:t0:t0:t0:tRw4w4  $zC$D $C  "g fU#L0:t_========== Rw4w4w4w4w49 }9 }9 }9 }9 }9 }9 }========j@j@9 }j@j@j@tttѸBt9 }tѸBttttttj@8 8 8 8 8 9 }8 8 8 j@j@9 }j@j@j@j@=====  $zC$D $C  01S%$74 ^#$@,$?*5$B-$A(S$":0uZ_A+['5-"!.; 6/?( ,E@17=9:%>42F@D@H@<G@M@I@3@C@\J@N@L@P]"R w */  /?,db$  * ,  &a@'(P%--*  ?#  a(' cd>"zE/a7 ;E " "-+'10-+ ?#??a'xa/!.8xw*)6D?6 @'66( `/<a/! 1-,.u?%/3D.A?!> ?,6 6  );i -9 -9'%%Ww*%.u!a@@' V qw *-' $ o$ -'!@?   a   ?,(  6  ?,0a/!!0a R0(%&:r.;*N-<'%&Y' a  '{r * ;  #) !6 7 5= -,-> 4 -1-2 O$P(J/a7 GFa/5*-1a/! wa/! ?&$Y?Fa/!2o$(6(?, .( !$ . 6  ?,$10 Q _J -( tw*a/!':&.--  %a   w*%.w* -'-( q!!6 ]a/!+.?, ,2 D, a   w*.  ]]r.* a   ]w*.  -a?$C B&PN-3-3'&Nw&*a  & ]r* )B6F4G7M=N-2-L->-J@CED-<-H:I bW&XlRw4222222222222Rw4 G G G G G G G G G G G G  $zC$D $C  "TKV; `[w*8D8K  08 CCC:xBICְC0@ddLjd`d>,X7d dПwB2XQdz?2޿dO|2{2d@Ko>d0d>hD2ԇ?wEKO~KBǹdd.d`dr(dd CKV'}K7FK>W{K`|K="H?zK_DAKK?x2#yDK4FK=fCKC270>>gK}2?zKazKW?_7? T*?=>& A2x@2|2_D2t}2oB2HC2{2odPduwdd@xcdad A2F`dڿ~2#wd@2p}2?d DK"Hڷd`E2~CKqBKӯd'ddEd@dd(FKo{KEKSxzK @K~0h"8|KnK(hC21>FKFKD0goAKoC2|K}2bzK}K0 P.@3h(i dRW D2@2;x}2D2A2oE2;F2~2Hd,d$dQd7p:d&dB2(؈d@2dE2B2ݘd}HK,dgdLXʯG2@{BK2P GKиd WdTd'd6d؆d1IKJ|KDKX }KEKrM@Ko~KhH2HKWGKL`G@KwD2s 7}KP@2~KYCK xGGw&8GQFxdE) X`I2A2A2'F2xG2"pI2H28D2Ⱥd'dd2Ad'o lǻd(d7D27 dC27ȹdFJ2eG2'dKK߷d? SgH2qBK 8KKd(gd'dGddndJK`@KSGDK? BKJKx  G ӰFKWK7 WL2h pHKZwSFKw_@Ks?E2w :K4D2PDKHKWg'ɿ[  7 hޯo 'L2ѿC2VF2YF2K2WK2bJ2_PI2ܐd_dnd8dR d.dTC2 ^dE20dL2ҿI2d;'KKlցdJ fF2>[@K~ GLKdZOd*d6ddd OIKdCKBK۶ zEKˇLKj = NHJK6@K3 L2ξGKܶDKxO@KD2R 3AKoF2r(HKKKU- KwϮ , xR K2D2H2D2R_L2ӶI2H2'K2ۈddf5d^`ddd>1/A2޶dxC2hdfI2UGH2dGK GdA2\~KIKddid&dd)/dVEK,xDKoKu"FK*JK&oJK~O@KNH2vBK^@KOK@2V(BKGE2HKvKKG~6vVGnvF2\/B2tF2A2I2mD2zNC2''I2dd>d ؉dZd8׈d>}~2Ǿ?ndA2`d.E2VE2lhdBKH&gd>}2$?|KnEKd׸dHd޼dd膆d^@K/CKY{Kf? EKFK>HK@>~K6B2v>>~Kv=|K9}KO'}2޶4 AKB2GGK@GKK?g?*= =>#=6?nF o _F>A2o2D2|2FD226~2!wE2d޼d<dd?e_>d*Od=|2pG=&d,(@29dWB2C2X@dgK?/d?{2§>%zKBo= AK`d[0dd,d7d~d}KrBKyKR<ADK.CK|w_?<FK=X~KH?@2l;LG{K;/zK_8|K{2^G@KA2EKhgEK>><<='?;~<?w>k>?g=_~2-~2B2{22A24|2[{2C2(d!dOx?Cdd3dd_x~2H?dA2dC2XD2,dW~Kad%{2TP{K?Ng@Kxdddqd^dfd}{KCKO zKO>ihEKbBK8?0?EKՀK2=zKY>yKC8}K }2AK0C2FKDKw]?r>Z?E9=, ?!! ?W~20@2QD2Z(|2A2|2|2C2dzd8d[dM:hd6dxA2[)׺dD2hd'D2/(F2d_}KhMd2x}2q}K&fK(dȻdYddod޽d{KEK`{KBxTFKiAK)-x}PEKAK@2c@zKGzKf0K2CKE2FK'DKhX_pm0Ep=Ig2(C2eHF2~2ˏB2H~2B}2hE2!Јd鏷d;dOd Wdd. `D2Pd G2ЇdwD2/G2VdO|KC pdݿ2 ( Ko/~KdQdݨdTطdd.d'{KXFK}K2 GKZw@K'7DK}CK7A2S-zK v{K!xAKɰB2EK]G2oFKbBKc 0 88  qP-xO 0@2E2'G2 A2B2%X2[X2E2dZdddjd0d F2Od)XH2dGC2F2 'd_{KO PdjA2 AK|KN׆d ddddd {KOGK`K/FKaW~KuOWSBK  EKÏ@2j{K8xH}KDKD2HGK_H2wEKK@Ko  $p4g tg .xWgW2[G2·G2HC2A2*2[@2D2Gdȹdl!dVd_/xdgdJXG2x^dG2odlA2Q7D2릀d@{K['ѿd+wbC2)xDK_{Kdddd3oddc|KFK8BK7`DK_|KF7;'w'<_@K,@GKsg2}K'KHGq8FKG@F2XO_GKG2?BKW'~Kx8\{wM@? n2G2cE2_D22-0@2QxA2UB2ddbw(d77d(ov؈dd>gF2'd^gE2@d_~2;@2dc8|K._IdC=C2&Q`FK({Kfdp dOdd?ddd~KE7DKDKҧ,AK{KGwUr/Qo}KYGK??~2ַ8@KBK)W(GK/F2d?xEK?D20K{K>G/y7P#ͷ}g2O32GF23gB2 (E2}29p@2FB2XW2d!doi(dd>ˇ?'djdzD2ȟѼdGA2ndo|2rg}2"C2o?FK?s(|Kμd׈d;Gdqdpddp@K'@K8(FK5O~K3zK=>WzKdbDK>4}2BKwDKd>?FKD2=7BKAO@2^O|KozKWqg|?tO?ܗ>?|>>Nh2awC2Q~2D2 |2SA2DB2|2dd?Ljd`d>(7dd_gB2Qdu/2޿dJ|2{2d@K?>d0d>HD2G?wEKLX~KBǹdd.d`dr(ddCKR/}K/FK;W{K@|Kh=?ozK/BAKG>H2!`yDK5EKӟ=fCKC22=;wK}2?zK\zK/??7>XP?'?O=>#@2t@2w|2GD2o}2mxB2FC2{20A0CCC:xBICְC0CCCCCCuwCCCxGCCC#CCC0[CCCf[CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC?@IC/ݫC@A@ICCBAICCABICDCBIC\CBICC2BICC@ICC@?ICΫC@@@ICޫC@AICAsC`@AICC?@ICC@ICC@ICC?@IC/ݫCP==L> ߬>P         (   ) (+31-$/'@2??>@>,<=<4AFF(G)77E.DDH%0C0B*LL2 ,JJ99KK(PPMM. IINNOOB133 6655-884&::+;;// %""1$$ -##&+ ''!@8(W90G9HGFGH FH3F E3 C2DCDCI;I;IN;ON.NO.O>./>5>/M5/L5M LM L P + P+P7+K7J7K0JKWJ9JT9GT9=TGF=G=F3FR2CR2RCC@;@S@;NS;SN.NX.>X.X>5>U5LU56UL 6LQ6 +Q VQ+7V+WV7JW79J08W:8T:*:T=*T*==<R<4<R4R?4@?)?@S)@,)S,SA,XA1AX1XB1UB-BU6-U!-6Q!6!QVQ(VW(V(8(%8:%8%:*:**#<# #<4 <$ 4?$4$?)?),)",A","A1A1B1&B-&B &-! -' !'!'(Y     3 !/  0 / 2;95+7.YP/   ?pPo@P@@@`/ !@"?@#@$%P@&@'O(`)*p@++,@-p./0@1Ͽ2@3/4@56_7/@809_@:@;<<=>߿?@ABCDoE?F?GHIJ?KLMNO`P'&?? >P*#a,Ba!==u!u!a@@'@?&? //============================================================================= // WhirlwindMut. //============================================================================= class WhirlwindMut expands Mutator config(Whirlwind); // spawns a WhirlwindController and sets the vars to the values found in the ini var config float AvgSpeed; // Average speeed of travel around the level var config float GravStrength; // How hard it pulls var config float DamageAmt; // how much damage to do when touching player var config float GravRadius; var config Name AffectedClasses; // only affects certain classes, inventory is not advised var config bool AffectsProjectilesToo; // can add projectiles to the list var config bool PinataEffect; // if true, hit players drop all items. var config sound PinataSound; // sound to play when Dumping player's stuff var config Sound AmbSnd; // ambient sound for the whirlwind var config bool RndSpawnLocation; var config int NumTornadoes; var bool AlreadySpawnedController; function PostBeginPlay() { local NavigationPoint N; local WhirlwindControl W; // spawn a WhirlwindController if ( !AlreadySpawnedController ) { AlreadySpawnedController = True; N=Level.NavigationPointList; if ( N != None ) { W = Spawn(class 'WhirlwindControl',,,N.Location); If ( W == None ) return; W.AvgSpeed = AvgSpeed; W.GravStrength = GravStrength; W.DamageAmt = DamageAmt; W.GravRadius = GravRadius; W.AffectedClasses = AffectedClasses; W.AffectsProjectilesToo = AffectsProjectilesToo; W.PinataEffect = PinataEffect; W.PinataSound = PinataSound; W.AmbSnd = AmbSnd; W.RndSpawnLocation = RndSpawnLocation; W.NumTornadoes = NumTornadoes; W.PostBeginPlay(); } } } S'%%%,a  Y+// ============================================================ // Whirlwind.WhirlwindControl: put your comment here // ============================================================ class WhirlwindControl expands Triggers; /////////////// Stuff to be passed to the spawned tornadoes var(TornadoSpawnSettings) float AvgSpeed; // Average speeed of travel around the level var(TornadoSpawnSettings) float GravStrength; // How hard it pulls var(TornadoSpawnSettings) float GravRadius; var(TornadoSpawnSettings) Name AffectedClasses; // only affects certain classes var(TornadoSpawnSettings) bool PinataEffect; var(TornadoSpawnSettings) float DamageAmt; var(TornadoSpawnSettings) sound PinataSound; var(TornadoSpawnSettings) bool AffectsProjectilesToo; var(TornadoSpawnSettings) Sound AmbSnd; ////////////// var() bool RndSpawnLocation; var int NumNavs; //Number of navigation points in the level, used for randomizing. var Actor TheTornado[8]; var() int NumTornadoes; // max of 8 var bool AlreadyInit; Function PostBeginPlay() { local NavigationPoint N; if ( AlreadyInit ) return; AlreadyInit = True; NumNavs = 0; for ( N=Level.NavigationPointList; N!=None; N=N.NextNavigationPoint ) { // log("Navpoint found at " $N.Location); NumNavs++; } // count how many navpoints in the level Enable ('Timer'); SetTimer(3.0, True); // check in every 3 seconds... // log("WhirlwindControl Initialized!"); } function Timer() { local int i; local vector PickedLocation; local Whirlwind T; for (i=0; i " $WanderCount); if ( WanderCount > 3 ) Destroy(); // if nothing is visible, just go away and die // it will be respawned at its home location later. } } } // will look for visible players and move toward the closest visible one // ignores players already within its radius. function bool WanderTowardPlayers() { local float Dist, ClosestDist; // for finding the closest local Pawn A, aC; //must be pawn, not actor in "foreach" iterator... local bool FoundOne; local float rSpd; // time and distance calculations // locate any visible players //VisibleActors(class BaseClass, out actor Actor, optional float Radius, optional vector Loc); ClosestDist = 4000; foreach VisibleActors(class'Pawn', A, 3000, Location) { Dist = vSize(a.location - location); if ( (Dist < ClosestDist) && (Dist > GravRadius) ) { ClosestDist = Dist; aC = A; // hold on to the reference for this actor FoundOne = True; } } if ( FoundOne ) { Destination = aC.location; LastDistance = vSize(Destination - Location); rSpd = (fRand() + 0.5) * AvgSpeed; // determine a random speed DestETA = LastDistance/rSpd; // ETA to destination if ( DestETA > 0.5 ) DestETA = 0.5; // have it update more frequently when a player is captured SetTimer(DestETA, True); //sets the timer to go off when destination is reached Velocity = Normal (Destination - Location) * rSpd; // warn bots of incoming "projectile" if ( aC.isa('Bot') ) { aC.FearThisSpot(self); if ( aC.enemy != None ) {aC.Warntarget(aC.enemy, rSpd, velocity);} } RotationRate.Yaw = default.RotationRate.Yaw * 2.5; // spin faster when chasing return true; } RotationRate.Yaw = default.RotationRate.Yaw; return false; } // Looks for a path node within sight, and picks one of them at random as a new destination function bool FindNewDestination() { local NavigationPoint N, Best, Picks[31]; local float Dist, rSpd; local int NumPicks; local int RndPick; // look for pathnode that's visible from here, and not this current one for ( N=Level.NavigationPointList; N!=None; N=N.NextNavigationPoint ) { Dist = vsize(Location - N.Location); if ( dist >= 100 ) // don't pick too close... { if ( FastTrace(N.Location, Location ) ) { Picks[NumPicks] = N; NumPicks++; if ( NumPicks >= 31 ) break; } } } //ok we have fleshed out the array with pathnodes, hopefully... // if no paths are found: // set random velocity, // set bounce flag to true // set timer to go off in 3 seconds // log("Found this many navpoints --->" $Numpicks); if ( Numpicks < 1 ) // nowhere has been found. { WanderCount++; SetTimer(5.0, True); return false; } else // otherwise, we've found somewhere to go, so go there! { WanderCount = 0; // reset lost counter RndPick = Rand(NumPicks); Destination = Picks[RndPick].Location; LastDistance = vSize(Destination - Location); // set last distance so we don't think we're moving away next tick // set velocity rSpd = (Frand() + 0.5) * AvgSpeed; Velocity = Normal (Destination - Location) * rSpd; // set new rnd velocity toward pathnode. DestETA = LastDistance/rSpd; // ETA to destination SetTimer(DestETA, False); //sets the timer to go off when destination is reached return true; } } // each tick, tug on players // can I use processtouch for navigation? function Tick(float DeltaTime) { local vector tV, tC; local Actor Other; local float Dist; local bool IAffectThis; // check for collision with affected classes and then grav them foreach VisibleActors(class 'Actor', Other, GravRadius, Location ) { // filter out unaffected items if ( Other.isa(AffectedClasses) || (AffectsProjectilesToo && other.isa('Projectile') && Other != self ) ) { if ( other.isa('Projectile') ) other.velocity *= 1 - (DeltaTime * 0.85); // slow down projectiles if ( !other.isa('Spectator') ) { Other.SetPhysics(PHYS_Falling); //make it easier to drag players around tC = location; tC.z += 32; // make center of pull higher than the normal center tV = Normal(tC - Other.Location) * GravStrength * DeltaTime; //determine pull vector Other.Velocity += tV; //affect other with pull vector // divide zone's gravity by 3 for better lift effect Other.velocity -= (other.region.zone.ZoneGravity/3) * DeltaTime; } } } } hp po9oyoPozvIorobo'oo{vSoso+utpko|oHovo~o!uoyCv"|>z@yYoxwoszDoqooy]|aoGzXzWyPoOoLsyTp^|gyd{`{e{MyV}NvluKs{(vU{fs/|h}noJpZ:F[|cp]p\ ~_ ~`$ya&V_ Z*V[ g*W; t*UQA+V6 O+$\ \+VO x8T= E9S_R9Va `9OEl9VQ z9QQG:Pm U:L b:^ o:T? |:  H;YE T;OV a;RE m;PZ z;PT F<J R<Vi ^<P< k<SQ x< D=K P=I \=OT h= t=PR @>  L>U@ X>C d>WE p>TF }>U\ J?  W?OU c?PS p?  |?OW H@UX T@OZ a@SP m@ z@ FAXB SA _A  lA xA  DBYG PBE \B hBD tB AC  MC  YC0 eC0 rCQR CX  LDX0YDXAgDA uDX BEX OEX \EX iEX  uEY? BFX OFX  \FX  iFovFdeJ/RIO^[QryRGkUrrXJ d\Xmne&x[iXSoSQ kpM xpYB EqOB RqHA}^qOj _Ml`N yXA4JF8PPB HA4d+TA4ZxUZ RUY _[Public] Object=(Name=Whirlwind.WhirlwindMut,Class=Class,MetaClass=Engine.Mutator,Description="Whirlwind, Spawns Tornadoes that wander around.") [Whirlwind.WhirlwindMut] AvgSpeed=250.000000 GravStrength=1750.000000 DamageAmt=0.000000 GravRadius=256.000000 AffectedClasses=Pawn AffectsProjectilesToo=False PinataEffect=True PinataSound=AmbOutside.OneShot.call8 AmbSnd=AmbOutside.Looping.wind33 RndSpawnLocation=True NumTornadoes=1 *E!@""HP,5!None InternalTimeUBitsColorbRising FX_VertSpeedFX_HorizSpeedUSizeVSizePalette bParametricMipZeroVClampVBitsUClamp NumSparks FX_Phase SparksLimitFX_Size bRealtime FX_FrequencyFX_Heat SparkType RenderHeatFX_AreaEngine FireTextureCoreClassPackageFire MyTexturesMyTex1@RRRSSSTTTUUUVVVWWWYYY[[[\\\___bbbcccfffjjjmmmnnnqqqtttuuuwwwxxxzzz{{{~~~WVVZYY\[[`__cbbgffjiinmmuttxww{zz~~SRRTSSUTTWWVZZY\\[ccbjjinnmqqpuutxxw{{z~SSRTTSUUTVWVYZY_`_bcbfgfijimnmpqptutwxwz{z~~RSRSTSTUTVWWYZZ[\\bccijjmnnpqqtuuwxxz{{~RSSSTTTUUVVWYYZ[[\__`bbcffgiijmmnppqttuwwxzz{~~RRSSSTTTUWVWZYZ\[\cbcjijnmnqpqutuxwx{z{~SRSTSTUTU `""  """ " *jii"&AqH 0`  ` `  ,` I` d`! n` }` &$` .2` 7@`. |;N`  p<\` f;j`2 f0x` n'` `, `+ `- `$ $` 0` B` M`  Y` \` \ `  hQ.`' Z><`0 \0J` r)X` (f`  2t`  B`  R` h` z` `) `) `* v`, P`1 :`1 4`1 :e`1 TV`2 dT*`" b8`" vF`$ ˎT`2 ̞b`2 IJp`2 ~`5 ь`u vԚ`5 ]˨`e L`5 H`e \`5 x`l `; Ρ`d `\ `e &`b 4`0 B`e P`g ^`n l`l ez`5 Zш`r VĖ`5 V`r d`0 `u `5 `e `5 q`e R`5 ?`l :`5 &"`r 0`2 >`r L`1 Z`b ,h`1 Fv`} b`d w`a `0 `p ̼`\ `\ t`2 R`x D`\ 6`2 2`t &`8 $h`x ,T,`0 DB:`2 e:H`\ 6V`9 ;d`t Jr`6 b`x Ѐ`0 Ę`4 `\ z`6 T~`t @\`4 02`x *`0 4`5 J `\ r`3 (`p 6`n )D`\ ;R`7 L``1 fn`l z|`\ `f `\ v`  ``a M`f J`s P`c a`/ `= `= $`= 2`= @`= N`= \`= j`= x`= Ԫ`= ܻ`= Ԣ`= `= `= `= `= `= o`= [`= V`  nx `r i.`l c<`\ hJ`f wX`\ f`  t`a z`f W`s Hj`c HL`/ T8`h f(`w u$`M ~$`  ,`a yH`p fZ`n Hg`\ %f*`7 V8`7 6F`l T`\ )b`f 2 p`\ @ ~`  V`= ^,`= ZG`= 7f`= n`= i`= ^`= J`= A`= /D `= >V`= Jl&`= H4`= 2B`= P`= ^`= l`= z`= `= @}`  Z`a n`p p`n a`\ >`7 *`7 &`l 6`\ L`f q"`\ 0`  >`s L`l Z`\ Jv`f E܄`\ ^`  `i `i Ϊ`u `p `n `\ `7 `2 `p ĉ`s t,`a d`f r`s ΀`c d`  J`a @`  N`a V`f L`s :`c # `c `i (`l 6`\ &D`f :R`\ C``  ;n`i &|`i `; `p `\ `i (`3 <`1 ~:`f ^$`  X`r o`l `\ $`f 02`\ t<@`  L9N`a =(\`/ <j`/ Y x`t p`  w,`b nR`a VV`d >H`  2(`  D`w d`  j`n k@`e WV`\ ` **` :2` FO` B|` (` ` ` j` *d*` A}8` HF` Զ` 2` ` ` .` F` N ` N` :&` 4` #B` ^P` z^` l`f z`t `a b`f a`s `c `  `S `d `p `n "`\ 0`7 L`1 Z`  h`r v`  `e ޜ`o `r Ԯ`l ݼ`o `  `  m`e b`\ j`  ܈`a `f |,`s `:`c LH`\ PV`i ]d`3 wr`1 t`f [`a 9`l &`\ "`f .`\ V`  ^`l zH`\ o*`f `\ `  (`f F6`p iZD`n FUR`\ 4B``7 An`7 b|`p r `n r&`\ Z@`7 H>`2 8*`o 8`p J`n X`\ Z`7 J;`7 2:`r $`t 2`g +@`  ,N`a ,\`f 0j`s -x`c `/ `o `a `i `u )`  +`a `p `n `\ .`7 0; `7 N.`l M<`\ BJ`f 'X`\ @#f`  M8t`\ N^`i .`3 `1 `f )~`\ M`i Y`3 L`1 "`f `o `g :`a a*`f h8`s RF`c ,T`  b`a 5p`f a~`s z`c ܚ`f q`t M`a H`f l`s `c `  `a f&`m ~4`\ ̼B`i P`3 ^`1 l`f z`/ `w `c د`a Ȳ`e `  _`w E`  fz`c t`g ~`a v`  Q"`a H0`p f]>`n TL`\ \Z`7 th`7 ~v`\ ft`  eX`a 5`f 0`s >`c X`\ Y`i K`3 '`1 `f `a `l 4,`\ >:`f /H`\ V`  d`l r`\ *`f F`\ L`  <`f "`p `n `\ .`7 ^`7 }b`p QF `n M6`\ x"(`7 "6`2 @D`o `R`p Xj``n ;Xn`\ (;|`7 =&`7 x&`r >`a br`s 5`\ `  r`a `1 $"`f &0`p <>`n hL`\ nZ`7 p`h`2 pAv`r `a `f `s @`c fD`  00`a `f (`s M`c Y`c N"`i /4`l 0,`\  :`f H`\ V`  *d`l ,r`\ )`f '`\ `  (`l Y`a .`f >`s vB`c Z,`  _`e `P `e *(`l L6`o PD`\ >R`i $``3 n`1 |`f %`/ H`n ``d ^`o H`t ;`s H`  z`  `t ¬`p `\ }$`i r2`3 @`1 N`f Ҭ\`p j`n x`\ {`7 `2 ڞ`r ̼`a Ⱦ`f `s `c ˛`  `a `f `s `c .`c <`i J`l X`\ f`f t`\ ~`  r`l `\ ޺`f `\ `  h`l 4`a '`f <`s ^`c Z*`  ;8`a F`f F`t T`p b`n *p`\ Hv~`7 Rr`1 Tx`  @`t `, v`t V`a 6F`s GE`o G[`l 6x `t '~`. 'p&`p MJ4`\ wDB`i TP`3 n^`1 ~l`f Dz`p ,l`n TN`\ >`7 @`2 X`r `a `f p`s K`c 6`  v"`a 0`f >`s nL`c ]Z`c ~h`i v`l Ĺ`\ ڒ`f `\ {`  b`u v`P `t `u `  `a n`f T`s h,`c :`/ H`o V`  d`p r`  ܀`n `m w`g M`a b`' }`t n`  @`a "`p  `n (`\ 6`7 D`7 R`l ``\ n`f |`\ 0`  2`\ !`i `3 `1 "`f <`\ >`i 4`3 "`1 `f .$`o T2`g Ƅ@`a N`f \`s ۀj`c x`  `n `m `d `p `n `\ `7 `1 `  `i `  `n .`o <`h J`h jX`w If`  Kt`a v΂`p ֐`n {`\ I`7 (`7 `\ (`  J`a P`f B`s `c `\ *`i 8`3 .F`1 b`a 2p`l ~`\ `f B`\ i}`  i`l L`\ 4`f -`\ -`  5``f VL `p \T`n Kw&`\ $z4`7 hB`7 RP`p N<^`n 5l`\ Dz`7 vf`2 It`o Ch`l hE`\ ;`f >`\ X`  ^`d \T`w U@`c `o "`  0`r &0`l L>`\ pL`f vZ`\ ih`  Lv`a B`f \`s `c ʵ`v `p `n `\ `7 `7 `p `n ,`\ :`7 H`2 V`n d`\ r`i v`3 m`1 `f `\ `i y`3 v`1 `f `n `l `(`\ 46`f 2D`\ LR`  |``m ~n`n `|`e 6`  %`a 9ܦ`p xȴ`n Ƽ`\ Ҽ`7 `7 `\ `  `a ׎`f @`s N`c \`\ jj`i Dx`3 3`1 3`f B`a L`l fA`\ _2`f r`\ `  `l %`\ zT`f L^ `\ 8T.`  3@<`l <5J`a  CB xrEWhirlwind is a mutator and level mod by Serpentine Widgets. -------------------------------------------------------------------------------- This package contains a Whirlwind object that will roam around the level using the level's navigation points. When sighting any players or bots, it will move toward the closest one. When any players are within range, it will start affecting them by swirling them around and, if the option is turned on, "Pinata" them by tossing all of their possessions out. The Whirlwind can be added to existing levels via a mutator, or it can be built into a level so that it will be there whether or not the mutator is chosen. To use it as a mutator, first you must ensure that all clients have this mod because it contains a custom mesh and texture for the tornado model. Then just add it aas a mutator. If you don't like the way it behaves, you can play with the settings in the Whirlwind.ini file. To add a whirlwind to a level at design time, just place a Triggers->WhirlwindControl into the level and choose the settings you want in the properties. The defaults are fine, but if you want to change them to fit your level, you are welcome to do so. Note that the settings on the controller will be passed to the whirlwind(s) when it spawns them. Also note that adding a Projectile->Whirlwind instead of the controller will not work as well, as these are projectiles and may end up disappearing forever during the game. Note: if you change the defaults, do NOT use "AffectsProjectilesToo" unless you are 100% sure it will always be used in single player games only. Projectiles are all handled client-side, and no players will be able to see these effects, which will create incredibly confusing and stupid gameplay. Other level tools, levels, and mods by Serpentine Widgets are available at http://people.ce.mediaone.net/serpwidgets/UT.html Credits: Programming - Snakeeyes Model/Animation - Desiato Note: The pinata effect was inspired by, and uses modified code from the pinata mutator, so thanks go out to shiftre for his mut that gave me a starting point in figuring out how/where to intercept this stuff. Legal: Use of this package to obtain profit, either directly or indirectly, will result in contact from an unpleasant lifeform known as an attorney.System\Manifest.iniSystem\Manifest.int5System\Whirlwind.u(System\Whirlwind.int@System\Whirlwind.iniՈ)Textures\WhirlwindTex.utx"System\Whirlwind.txt/ $(2