[Setup] Product=Enhanced Enf/Minigun Version=100 Archive=EEM11.umod SrcPath=. MasterPath=.. Requires=UnrealTournament400Requirement Group=SetupGroup Group=umodINIGroup Group=EEMutatorArenaGroup [UnrealTournament400Requirement] Product=UnrealTournament Version=400 [SetupGroup] Copy=(Src=System\Manifest.ini,Master=System\Manifest.ini,Size=531,Flags=3) Copy=(Src=System\Manifest.int,Master=System\Manifest.int,Size=455,Flags=3) [umodINIGroup] AddIni=UnrealTournament.ini,Engine.GameEngine.ServerPackages=EEM [EEMutatorArenaGroup] File=(Src=System\EEM.int,Size=229) File=(Src=System\EEM.u,Size=55291) File=(Src=Help\EEMReadme.txt,Size=2637) [Setup] LocalProduct=Enhanced Enf/Minigun ReadMe=Help\EEMReadme.txt SetupWindowTitle=Enhanced Enf/Minigun Setup AutoplayWindowTitle=Enhanced Enf/Minigun Options ProductURL=100 VersionURL=100 Developer=Ze Mad DeveloperURL=100 [UnrealTournament400Requirement] LocalProduct=UnrealTournament ProductURL=http://www.unrealtournament.com/ VersionURL=http://unreal.epicgames.com/ Developer=Epic Games, Inc. DeveloperURL=http://www.epicgames.com/ [Public] Object=(Name=EEM.EEMutatorA,Class=Class,MetaClass=Engine.Mutator,Description="Enhanced Enforcer/Minigun,Enforcers and Miniguns are replaced with Enh-Enforcers and Enh-Miniguns, who do more damage and allow 'Heashots!'")*E1@ { n$1k1NoneAnimEnd EndState ClientFire BeginStateAltFireBeginFireClientAltFire PlayRecoilIdleSetHand ShakeView TakeDamage PlayUnwind DownWeapon TraceFireShoot2 GiveAmmoUseAmmoEEEngineCoreGenerateBulletTimer FinishFirePlayRepeatFiringEEMTick SetTwoHandsPawn PlayIdleAnimFinishSystem NormalFire Decapitated PlayerPawn AltFiringT2EM2 RepeaterProcessTraceHitBotpackshot2 FireEffect ClientFinish ClientActiveBringUpRenderOverlays FastShootSetDisplayPropertiesCarcass enforcerTwiddleSwayshot PlaySelectPutDownClientInstantFlash LogPickup ReplaceWithPlayAltFiring ItemName RateSelfSetDefaultDisplayProperties ClientFiringShoot1ClientAltFiring PlayFiringSwitchToBestWeapon SetUpSlave DoubleEE ViewportPickup DestroyedBotDesireabilityRenderTextureReceiveLocalizedMessage EEMutatorAFindInventoryTypeHandlePickupQuery SendFireUpdateRealWeapon SendAltFire BecomeItemDefaultWeaponEjectShootActiveIdle2SetSwitchPriorityCheckReplacement SetRespawn ClientDownTournamentPlayer WeaponSetSwitchPriority AdjustAimT1 ForceFire TraceShotAdjustDesireForPickupMessageUnwindBot DropFrom minigun2 ForceAltFireMutator ReturnValue ScriptTextSDynamicLoadObjectMaxDesireabilityGWeapon LevelInfo RespawnTimeStatLogRAmmoStyle AmbientGlowTempCZBiFont AnimSequencebUnlitLodMesh AmbientSound GameInfoHealthSoundDampeningDamageScalingAltRefireRate AIRatingPlayerViewOffsetAutoSwitchPriority shaketime aimerror DesiredFOVY shakemag shakevert HandednessLevelbHighDetailModeMeshActor BytePropertyDirCarriedbForceAltFire DeltaTimeOther bForceFire bNetOwnerhandCanvas Inventory LightType StartTraceWeaponPrioritybMeshEnviroMap ERenderStyleItemPlayOwnedSoundGame Instigator Location TimeSecondsPauser bDropDetail AnimFrameFXScriptedTexture DefaultFOV NewTexture NewStyle bEnviroMap bLighting LocalLog WorldLogNewRotbSuperRelevantValue bAnimLoopTex SoundVolume NotifyActor PlayerOwner bHeldItem bTossedOutPickupViewMeshbSteadyFlash3rd FlashCountOldFlashCount PickupSoundP AlreadyHasdesire bUseAltModeCopyStartLocation AmmoType bPointing bWeaponUpbChangeWeapon bWeaponStay bHideWeapon FiringSpeed FireOffset ViewRotation FireSound AltFireSound Misc1Sound AdjustedAimbSetFlashTime bMuzzleFlashFlashYFlashO MFTexturebTemp Accuracy AmmoAmountMaxAmmobFire bAltFireSkillPlayerCountTexture HitLocationRoleClass HitNormalEnemySpriteSmokePuffPackage hitdamage TextBufferObject WeaponLightbSetUp AltAccuracyEnum FunctionStateOwnerColor ShotAccuracy bOutOfAmmo bFiredShotrndDambHiddenRotatorMuzzleFlashVariationsVectorStruct UnrealShareTournamentWeapon StrPropertyStructPropertyCollisionHeightClassProperty NamePropertyObjectPropertyNetModedist EndTraceTournamentPickupFloatPropertyDoubleSwitchPriority UT_WallHitMTracerPickupMessagePlus DoubleName FireAdjustMiniShellCase UT_ShellCasebNovice AffectorbCanClientFireAutoMLAutoMRSlaveEnforcer bIsSlave bFirstFire bBringingUp bBringUp RealOffset realhand Minigun2m Ammocount miniammoled LEDFont2LastShellSpawnAimDir BoolProperty IntPropertyCalcDrawOffset  3iI_; "0@[lDACY.hA;- ::$2D .t@t@t@t@t@ѸB9 }9 }9 }RRt@t@t@t@t@ѸB9 }9 }9 }ѸB9 }ѸB9 }t@ѸB9 }9 }t@t@ѸB9 }9 }t@t@t@R=R@G9 }ظ9 }ظظѸB9 }9 }Xu69 }9 }ѸB9 }9 }=I+\t@t@j@j@t@9 }t@9 } .j@j@RùRùqrRùRùqrj@======9 }9 }9 }===9 }9 }t@t@t@ѸBt@ѸBt@t@ѸBt@ѸBt@ѸBt@ѸB9 }9 }tt@t@t@=ѸB9 }Rt@*!f]10You just picked up another Enhancer Enforcer...>]Enhanced Enforcer-R%oF/r*.&q!"-'-'F~w*. @-.  L> <?)+,:fK_ -'-'>6r*.%xw*. @@-. ?Kq!% L@678H@( '1H>#* b aZ_&UW#-( V# -( R9v"0$- @?q!,-'' 'W% /X\& /TX#Ha-q!-'-'/-::$ w*a/!^w.*".a/!H:.%.Q/:.%.S//-.R  8lk}' meAa,Y.&#!w*q! O//============================================================================= // DoubleEE. //============================================================================= class DoubleEE expands EE; q)1&w*  a?( b)6r.*%q!X- -q!-:.%-(:.%8q! VP r r*&.%a&%T;.%>Fr.2--&M %**a[w*;.w*;.\' e ,#!w*q! hQ:w*,sw.*.:L#CaCB. $@.a!+333?>L= 'DD!P$@.a!W?R> ף< g=Ka!bff?L=-' &x!-1&w*  a?( j-r.*q!J%a!&fff?L=q!l- -q!-:.%-(:.%8a!&fff?L=q! M1J0#!w*q! K!Z5jhw.!*!%h,^.!P!G> " E"GA33>Nw*-@@@?@@a/!h.-ff>A dBFNF-';.$=-B/Dq!Y Q(-8Q( nv`K- 4a/!$?Ew*%wr.}w*?>< ^=0!w*  sCU1 a40s@52:%-,H.w*p 3D::$ 3,-' -r ?- w*r*?%g!+ @33?!+> @h-w*- r*$4ew*Q--(8 04s4w*?3  F//============================================================================= // EM2. //============================================================================= class EM2 expands minigun2; var float ShotAccuracy, LastShellSpawn; var int Count; var bool bOutOfAmmo, bFiredShot; var() texture MuzzleFlashVariations[10]; // set which hand is holding weapon function setHand(float Hand) { if ( Hand == 2 ) { FireOffset.Y = 0; bHideWeapon = true; return; } else bHideWeapon = false; PlayerViewOffset = Default.PlayerViewOffset * 100; FireOffset.Y = Hand * Default.FireOffset.Y; PlayerViewOffset.Y *= Hand; if ( Hand == 1 ) Mesh = mesh(DynamicLoadObject("Botpack.Minigun2L", class'Mesh')); else { Mesh = mesh'Minigun2m'; if ( Hand == 0 ) { PlayerViewOffset.X = Default.PlayerViewOffset.X * 95; PlayerViewOffset.Z = Default.PlayerViewOffset.Z * 105; } } } simulated event RenderTexture(ScriptedTexture Tex) { local Color C; local string Temp; Temp = String(AmmoType.AmmoAmount); while(Len(Temp) < 3) Temp = "0"$Temp; C.R = 255; C.G = 0; C.B = 0; Tex.DrawColoredText( 2, 10, Temp, Font'LEDFont2', C ); } function float RateSelf( out int bUseAltMode ) { local float dist; if ( AmmoType.AmmoAmount <=0 ) return -2; if ( Pawn(Owner).Enemy == None ) { bUseAltMode = 0; return AIRating; } dist = VSize(Pawn(Owner).Enemy.Location - Owner.Location); bUseAltMode = 1; if ( dist > 1200 ) { if ( dist > 1700 ) bUseAltMode = 0; return (AIRating * FMin(Pawn(Owner).DamageScaling, 2.0) + FMin(0.0001 * dist, 0.3)); } AIRating *= FMin(Pawn(Owner).DamageScaling, 2.0); return AIRating; } simulated event RenderOverlays( canvas Canvas ) { local UT_Shellcase s; local vector X,Y,Z; local float dir; if ( bSteadyFlash3rd ) { bMuzzleFlash = 1; bSetFlashTime = false; if ( !Level.bDropDetail ) MFTexture = MuzzleFlashVariations[Rand(10)]; else MFTexture = MuzzleFlashVariations[Rand(5)]; } else bMuzzleFlash = 0; FlashY = Default.FlashY * (1.08 - 0.16 * FRand()); if ( !Owner.IsA('PlayerPawn') || (PlayerPawn(Owner).Handedness == 0) ) FlashO = Default.FlashO * (4 + 0.15 * FRand()); else FlashO = Default.FlashO * (1 + 0.15 * FRand()); Texture'MiniAmmoled'.NotifyActor = Self; Super.RenderOverlays(Canvas); Texture'MiniAmmoled'.NotifyActor = None; if ( bSteadyFlash3rd && Level.bHighDetailMode && (Level.TimeSeconds - LastShellSpawn > 0.125) && (Level.Pauser=="") ) { LastShellSpawn = Level.TimeSeconds; GetAxes(Pawn(Owner).ViewRotation,X,Y,Z); if ( PlayerViewOffset.Y >= 0 ) dir = 1; else dir = -1; if ( Level.bHighDetailMode ) { s = Spawn(class'MiniShellCase',Owner, '', Owner.Location + CalcDrawOffset() + 30 * X + (0.4 * PlayerViewOffset.Y+5.0) * Y - Z * 5); if ( s != None ) s.Eject(((FRand()*0.3+0.4)*X + (FRand()*0.3+0.2)*dir*Y + (FRand()*0.3+1.0) * Z)*160); } } } function GenerateBullet() { LightType = LT_Steady; bFiredShot = true; if ( PlayerPawn(Owner) != None ) PlayerPawn(Owner).ClientInstantFlash( -0.2, vect(325, 225, 95)); if ( AmmoType.UseAmmo(1) ) TraceFire(ShotAccuracy); else GotoState('FinishFire'); } function TraceFire( float Accuracy ) { local vector HitLocation, HitNormal, StartTrace, EndTrace, X,Y,Z, AimDir; local actor Other; Owner.MakeNoise(Pawn(Owner).SoundDampening); GetAxes(Pawn(owner).ViewRotation,X,Y,Z); StartTrace = Owner.Location + CalcDrawOffset() + FireOffset.Y * Y + FireOffset.Z * Z; AdjustedAim = pawn(owner).AdjustAim(1000000, StartTrace, 2.75*AimError, False, False); EndTrace = StartTrace + Accuracy * (FRand() - 0.5 )* Y * 1000 + Accuracy * (FRand() - 0.5 ) * Z * 1000; AimDir = vector(AdjustedAim); EndTrace += (10000 * AimDir); Other = Pawn(Owner).TraceShot(HitLocation,HitNormal,EndTrace,StartTrace); Count++; if ( Count == 4 ) { Count = 0; if ( VSize(HitLocation - StartTrace) > 250 ) Spawn(class'MTracer',,, StartTrace + 96 * AimDir,rotator(EndTrace - StartTrace)); } ProcessTraceHit(Other, HitLocation, HitNormal, vector(AdjustedAim),Y,Z); } function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector X, Vector Y, Vector Z) { local int rndDam; if ( PlayerPawn(Owner) != None ) PlayerPawn(Owner).ShakeView(ShakeTime, ShakeMag, ShakeVert); spawn(class'WeaponLight',self,,Owner.Location+CalcDrawOffset()+X*25+Z*15,rot(0,0,0)); if (Other == Level) Spawn(class'UT_WallHit',,, HitLocation+HitNormal*9, Rotator(HitNormal)); else if (Other!=self && Other!=Owner ) { if ( !Other.IsA('Pawn') && !Other.IsA('Carcass') ) spawn(class'SpriteSmokePuff',,,HitLocation+HitNormal*9); // if ( Other.IsA('ScriptedPawn') && (FRand() < 0.2) ) // Pawn(Other).WarnTarget(Pawn(Owner), 500, X); rndDam = 12 + Rand(7); if ( FRand() < 0.2 ) X *= 2; if (( Other.IsA('Pawn') && (HitLocation.Z - Other.Location.Z > 0.62 * Other.CollisionHeight) && (instigator.IsA('PlayerPawn') || (instigator.skill > 1)) )) {if(Pawn(Other).Health<(2*rndDam)) Other.TakeDamage(2*rndDam, Pawn(Owner), HitLocation, 35000 * X, 'decapitated'); else Other.TakeDamage(2*rndDam, Pawn(Owner), HitLocation, 500 * X, 'decapitated'); }else Other.TakeDamage(rndDam, Pawn(Owner), HitLocation, rndDam*500.0*X, 'shot'); } } function Fire( float Value ) { Enable('Tick'); if ( AmmoType == None ) { // ammocheck GiveAmmo(Pawn(Owner)); } if ( AmmoType.UseAmmo(1) ) { SoundVolume = 255*Pawn(Owner).SoundDampening; Pawn(Owner).PlayRecoil(FiringSpeed); bCanClientFire = true; bPointing=True; ShotAccuracy = 0.2; ClientFire(value); GotoState('NormalFire'); } else GoToState('Idle'); } function AltFire( float Value ) { Enable('Tick'); if ( AmmoType == None ) { // ammocheck GiveAmmo(Pawn(Owner)); } if ( AmmoType.UseAmmo(1) ) { bPointing=True; bCanClientFire = true; ShotAccuracy = 0.95; Pawn(Owner).PlayRecoil(FiringSpeed); SoundVolume = 255*Pawn(Owner).SoundDampening; ClientAltFire(value); GoToState('AltFiring'); } else GoToState('Idle'); } simulated function PlayFiring() { if ( PlayerPawn(Owner) != None ) PlayerPawn(Owner).ShakeView(ShakeTime, ShakeMag, ShakeVert); PlayAnim('Shoot1',1 + 0.6 * FireAdjust, 0.05); AmbientGlow = 250; AmbientSound = FireSound; bSteadyFlash3rd = true; } simulated function PlayAltFiring() { if ( PlayerPawn(Owner) != None ) PlayerPawn(Owner).ShakeView(ShakeTime, ShakeMag, ShakeVert); PlayAnim('Shoot1',1 + 0.3 * FireAdjust, 0.05); AmbientGlow = 250; AmbientSound = FireSound; bSteadyFlash3rd = true; } simulated function PlayUnwind() { if ( Owner != None ) { PlayOwnedSound(Misc1Sound, SLOT_Misc, 3.0*Pawn(Owner).SoundDampening); //Finish firing, power down PlayAnim('UnWind',1.5, 0.05); } } //////////////////////////////////////////////////////// state FinishFire { function Fire(float F) {} function AltFire(float F) {} function ForceFire() { bForceFire = true; } function ForceAltFire() { bForceAltFire = true; } function BeginState() { PlayUnwind(); } Begin: FinishAnim(); Finish(); } /////////////////////////////////////////////////////// state NormalFire { function Tick( float DeltaTime ) { if (Owner==None) AmbientSound = None; } function AnimEnd() { if (Pawn(Owner).Weapon != self) GotoState(''); else if (Pawn(Owner).bFire!=0 && AmmoType.AmmoAmount>0) Global.Fire(0); else if ( Pawn(Owner).bAltFire!=0 && AmmoType.AmmoAmount>0) Global.AltFire(0); else GotoState('FinishFire'); } function BeginState() { AmbientGlow = 250; AmbientSound = FireSound; bSteadyFlash3rd = true; Super.BeginState(); } function EndState() { bSteadyFlash3rd = false; AmbientGlow = 0; LightType = LT_None; AmbientSound = None; Super.EndState(); } Begin: Sleep(0.13); GenerateBullet(); Goto('Begin'); } state ClientFiring { simulated function AnimEnd() { if ( (Pawn(Owner) == None) || (AmmoType.AmmoAmount <= 0) ) { PlayUnwind(); GotoState(''); } else if ( !bCanClientFire ) GotoState(''); else if ( Pawn(Owner).bFire != 0 ) Global.ClientFire(0); else if ( Pawn(Owner).bAltFire != 0 ) Global.ClientAltFire(0); else { PlayUnwind(); GotoState('ClientFinish'); } } simulated function BeginState() { AmbientSound = FireSound; bSteadyFlash3rd = true; } simulated function EndState() { bSteadyFlash3rd = false; Super.EndState(); } } //////////////////////////////////////////////////////// state ClientFinish { simulated function bool ClientFire(float Value) { bForceFire = bForceFire || ( bCanClientFire && (Pawn(Owner) != None) && (AmmoType.AmmoAmount > 0) ); return bForceFire; } simulated function bool ClientAltFire(float Value) { bForceAltFire = bForceAltFire || ( bCanClientFire && (Pawn(Owner) != None) && (AmmoType.AmmoAmount > 0) ); return bForceAltFire; } simulated function AnimEnd() { if ( bCanClientFire && (PlayerPawn(Owner) != None) && (AmmoType.AmmoAmount > 0) ) { if ( bForceFire || (Pawn(Owner).bFire != 0) ) { Global.ClientFire(0); return; } else if ( bForceAltFire || (Pawn(Owner).bAltFire != 0) ) { Global.ClientAltFire(0); return; } } GotoState(''); Global.AnimEnd(); } simulated function EndState() { bSteadyFlash3rd = false; bForceFire = false; bForceAltFire = false; AmbientSound = None; } simulated function BeginState() { bSteadyFlash3rd = false; bForceFire = false; bForceAltFire = false; } } state ClientAltFiring { simulated function AnimEnd() { if ( (Pawn(Owner) == None) || (AmmoType.AmmoAmount <= 0) ) { PlayUnwind(); GotoState(''); } else if ( !bCanClientFire ) GotoState(''); else if ( Pawn(Owner).bAltFire != 0 ) { if ( (AnimSequence != 'Shoot2') || !bAnimLoop ) { AmbientSound = AltFireSound; SoundVolume = 255*Pawn(Owner).SoundDampening; LoopAnim('Shoot2',1.9); } else if ( AmbientSound == None ) AmbientSound = FireSound; if ( Affector != None ) Affector.FireEffect(); if ( PlayerPawn(Owner) != None ) PlayerPawn(Owner).ShakeView(ShakeTime, ShakeMag, ShakeVert); } else if ( Pawn(Owner).bFire != 0 ) Global.ClientFire(0); else { PlayUnwind(); bSteadyFlash3rd = false; GotoState('ClientFinish'); } } simulated function BeginState() { bSteadyFlash3rd = true; AmbientSound = FireSound; } simulated function EndState() { bSteadyFlash3rd = false; Super.EndState(); } } state AltFiring { function Tick( float DeltaTime ) { if (Owner==None) { AmbientSound = None; GotoState('Pickup'); } if ( bFiredShot && ((pawn(Owner).bAltFire==0) || bOutOfAmmo) ) GoToState('FinishFire'); } function AnimEnd() { if ( (AnimSequence != 'Shoot2') || !bAnimLoop ) { AmbientSound = AltFireSound; SoundVolume = 255*Pawn(Owner).SoundDampening; LoopAnim('Shoot2',1.9); } else if ( AmbientSound == None ) AmbientSound = FireSound; if ( Affector != None ) Affector.FireEffect(); } function BeginState() { Super.BeginState(); AmbientSound = FireSound; AmbientGlow = 250; bFiredShot = false; bSteadyFlash3rd = true; } function EndState() { bSteadyFlash3rd = false; AmbientGlow = 0; LightType = LT_None; AmbientSound = None; Super.EndState(); } Begin: Sleep(0.13); GenerateBullet(); if ( AnimSequence == 'Shoot2' ) Goto('FastShoot'); Goto('Begin'); FastShoot: Sleep(0.08); GenerateBullet(); Goto('FastShoot'); } /////////////////////////////////////////////////////////// state Idle { Begin: if (Pawn(Owner).bFire!=0 && AmmoType.AmmoAmount>0) Fire(0.0); if (Pawn(Owner).bAltFire!=0 && AmmoType.AmmoAmount>0) AltFire(0.0); LoopAnim('Idle',0.2,0.9); bPointing=False; if ( (AmmoType != None) && (AmmoType.AmmoAmount<=0) ) Pawn(Owner).SwitchToBestWeapon(); //Goto Weapon that has Ammo Disable('AnimEnd'); } D,-8D( uA;Wr Cu? !5a!5?>Ua!6L>> y| <-(=w*%.Ea!6L>=t:.%8:.%8 < {}9Q< q!' z@.?=r-(p-pw* a!.ba! a!4q!pqa F?+-()w*q!. ~C]@@- BV@w*q! N]/~0 w*/-' EW92iN iK- - 'Cw*298-7-6- (98-7-6 2 *?,6-' 2-(?,d666?&.Botpack.Minigun2L  ?%66?,_66?,i NO_*-(O JML+S6},p06=,6$6$Ma@ A   k(/(w*aL>(&a?( O3LD::$- w-(8J dJw*a L$?:%@r.*$%.  $&??$%.@8>.@ X]NQ8M>l====!U  `G2S6 .*!PJ0U>S-$-(@-, ?P,?[$q=? #>a/!$.?%?,>?&> J *--@>z@. -,+6?%)?)-#a ! ?,-ծ>6@,+?,w#*#[Vծ>>-ի>L>),ծ>?+?,  Z)X3w.*. a   ?,N?,"ra  0?, P0w wa/!a/!3a  0?,  , ,4L>?,Ia/!766 R?)a/!$?& ., 0 , .?!#F0 , .?!#3 .ի? C!7 r5i^Ea 5 &w*a*5 y//============================================================================= // Enhanced Enforcer/Minigun Mutator. //============================================================================= class EEMutatorA expands Mutator; function bool CheckReplacement(Actor Other, out byte bSuperRelevant) { if ( Other.IsA('Enforcer') && !Other.IsA('EE')) { ReplaceWith(Other, "EEM.EE"); return false; } if ( Other.IsA('Minigun2') && !Other.IsA('EM2')) { ReplaceWith(Other, "EEM.EM2"); return false; } return true; } ^K e. Ow*n---w*?, R-r*1 r*>%>?>??r*>@ T~ p$-*'Fw.*.:L#CaCBg&2nq! [= b.. C 66. a$tID0@((ի=??ի=??.9?'.:.d(<11,1%(?,a  ?,`.P):(<9 _ $" ?,-'  _w*D ?%   -(  ?&   G@u =5- - '-w*@- ( pq r* Gw.*.?, @ dr  ?o  w\'2R`lnan9 }ѸB9 }ѸBѸB9 }9 }Xu69 }ѸB9 }9 }Xu69 }ѸB9 }9 }ѸBѸBѸB9 }9 }9 }9 }ѸB9 }ѸB9 }ѸB9 }9 }ѸB9 }9 }======9 }9 }9 }====9 }9 }=9 }9 }ѸBR=RRRR9 }R=}MѸB9 }9 }9 }=9 }9 }ѸB*!>]Enhanced Minigunft%G1w*aL>(a&_w*. @@-. ?a?,?-:.%% !(q -q!qq:.%%kr.*.=A !(a!&fff?L=a  (ck+(w*aL>(&a?( ^mC50\)%3w.*. a   ?,P?,"ra  "?, P"w wa/!a/!3a  "?,  , ,4L>?,Ia/!766 R?)a/!$?& ., 0 , .?!#F0 , .?!#3 .ի? C!7 @//============================================================================= // EE. //============================================================================= class EE expands enforcer; var() int hitdamage; var float AltAccuracy; var Enforcer SlaveEnforcer; // The left (second) Enforcer is a slave to the right. var bool bIsSlave; var bool bSetup; // used for setting display properties var bool bFirstFire, bBringingUp; var() localized string DoubleName; var() texture MuzzleFlashVariations[5]; var int DoubleSwitchPriority; replication { reliable if ( bNetOwner && (Role == ROLE_Authority) ) SlaveEnforcer, bIsSlave, bBringingUp; } function Destroyed() { Super.Destroyed(); if ( SlaveEnforcer != None ) SlaveEnforcer.Destroy(); } simulated function AnimEnd() { if ( (Level.NetMode == NM_Client) && bBringingUp && (Mesh != PickupViewMesh) ) { bBringingUp = false; PlaySelect(); } else Super.AnimEnd(); } function bool WeaponSet(Pawn Other) { if ( bIsSlave ) return false; else Super.WeaponSet(Other); } function SetSwitchPriority(pawn Other) { local int i; local name temp, carried; if ( PlayerPawn(Other) != None ) { Super.SetSwitchPriority(Other); // also set double switch priority for ( i=0; i<20; i++) if ( PlayerPawn(Other).WeaponPriority[i] == 'doubleEE' ) { DoubleSwitchPriority = i; return; } } } // Return the switch priority of the weapon (normally AutoSwitchPriority, but may be // modified by environment (or by other factors for bots) function float SwitchPriority() { local float temp; local int bTemp; if ( bIsSlave ) return -10; if ( !Owner.IsA('PlayerPawn') ) return RateSelf(bTemp); else if ( (AmmoType != None) && (AmmoType.AmmoAmount<=0) ) { if ( Pawn(Owner).Weapon == self ) return -0.5; else return -1; } else if ( SlaveEnforcer != None ) return DoubleSwitchPriority; else return AutoSwitchPriority; } function DropFrom(vector StartLocation) { if ( !SetLocation(StartLocation) ) return; if ( SlaveEnforcer != None ) SlaveEnforcer.Destroy(); AIRating = Default.AIRating; SlaveEnforcer = None; Super.DropFrom(StartLocation); } function SetDisplayProperties(ERenderStyle NewStyle, texture NewTexture, bool bLighting, bool bEnviroMap ) { if ( !bSetup ) { bSetup = true; if ( SlaveEnforcer != None ) SlaveEnforcer.SetDisplayProperties(NewStyle, NewTexture, bLighting, bEnviromap); bSetup = false; } Super.SetDisplayProperties(NewStyle, NewTexture, bLighting, bEnviromap); } function SetDefaultDisplayProperties() { if ( !bSetup ) { bSetup = true; if ( SlaveEnforcer != None ) SlaveEnforcer.SetDefaultDisplayProperties(); bSetup = false; } Super.SetDefaultDisplayProperties(); } event float BotDesireability(Pawn Bot) { local Enforcer AlreadyHas; local float desire; desire = MaxDesireability + Bot.AdjustDesireFor(self); AlreadyHas = Enforcer(Bot.FindInventoryType(class)); if ( AlreadyHas != None ) { if ( (!bHeldItem || bTossedOut) && bWeaponStay ) return 0; if ( AlreadyHas.SlaveEnforcer != None ) { if ( (RespawnTime < 10) && ( bHidden || (AlreadyHas.AmmoType == None) || (AlreadyHas.AmmoType.AmmoAmount < AlreadyHas.AmmoType.MaxAmmo)) ) return 0; if ( AlreadyHas.AmmoType == None ) return 0.25 * desire; if ( AlreadyHas.AmmoType.AmmoAmount > 0 ) return FMax( 0.25 * desire, AlreadyHas.AmmoType.MaxDesireability * FMin(1, 0.15 * AlreadyHas.AmmoType.MaxAmmo/AlreadyHas.AmmoType.AmmoAmount) ); } } if ( (Bot.Weapon == None) || (Bot.Weapon.AIRating <= 0.4) ) return 2*desire; return desire; } function ProcessTraceHit(Actor Other, Vector HitLocation, Vector HitNormal, Vector X, Vector Y, Vector Z) { local int rndDam; if ( PlayerPawn(Owner) != None ) PlayerPawn(Owner).ShakeView(ShakeTime, ShakeMag, ShakeVert); spawn(class'WeaponLight',self,,Owner.Location+CalcDrawOffset()+X*25+Z*15,rot(0,0,0)); if (Other == Level) Spawn(class'UT_WallHit',,, HitLocation+HitNormal*9, Rotator(HitNormal)); else if (Other!=self && Other!=Owner ) { if ( !Other.IsA('Pawn') && !Other.IsA('Carcass') ) spawn(class'SpriteSmokePuff',,,HitLocation+HitNormal*9); // if ( Other.IsA('ScriptedPawn') && (FRand() < 0.2) ) // Pawn(Other).WarnTarget(Pawn(Owner), 500, X); rndDam = 12 + Rand(7); if ( FRand() < 0.2 ) X *= 2; if (( Other.IsA('Pawn') && (HitLocation.Z - Other.Location.Z > 0.62 * Other.CollisionHeight) && (instigator.IsA('PlayerPawn') || (instigator.skill > 1)) )) {if(Pawn(Other).Health<(2*rndDam)) Other.TakeDamage(2*rndDam, Pawn(Owner), HitLocation, 35000 * X, 'decapitated'); else Other.TakeDamage(2*rndDam, Pawn(Owner), HitLocation, 500 * X, 'decapitated'); }else Other.TakeDamage(rndDam, Pawn(Owner), HitLocation, rndDam*500.0*X, 'shot'); } } function bool HandlePickupQuery( inventory Item ) { local Pawn P; local Inventory Copy; if ( (Item.class == class) && (SlaveEnforcer == None) ) { P = Pawn(Owner); // spawn a double Copy = Spawn(class, P); Copy.BecomeItem(); ItemName = DoubleName; SlaveEnforcer = Enforcer(Copy); SetTwoHands(); AIRating = 0.4; SlaveEnforcer.SetUpSlave( Pawn(Owner).Weapon == self ); SlaveEnforcer.SetDisplayProperties(Style, Texture, bUnlit, bMeshEnviromap); SetTwoHands(); P.ReceiveLocalizedMessage( class'PickupMessagePlus', 0, None, None, Self.Class ); Item.PlaySound(Item.PickupSound); if (Level.Game.LocalLog != None) Level.Game.LocalLog.LogPickup(Item, Pawn(Owner)); if (Level.Game.WorldLog != None) Level.Game.WorldLog.LogPickup(Item, Pawn(Owner)); Item.SetRespawn(); return true; } return Super.HandlePickupQuery(Item); } function SetUpSlave(bool bBringUp) { bIsSlave = true; ItemName = DoubleName; GiveAmmo(Pawn(Owner)); AmbientGlow = 0; if ( bBringUp ) BringUp(); else GotoState('Idle2'); } function SetTwoHands() { if ( SlaveEnforcer == None ) return; if ( (PlayerPawn(Owner) != None) && (PlayerPawn(Owner).Handedness == 2) ) { SetHand(2); return; } if ( Mesh == mesh'AutoML' ) SetHand(1); else SetHand(-1); } function setHand(float Hand) { local rotator newRot; if ( Hand == 2 ) { bHideWeapon = true; Super.SetHand(Hand); return; } if ( SlaveEnforcer != None ) { if ( Hand == 0 ) Hand = -1; SlaveEnforcer.SetHand(-1 * Hand); } bHideWeapon = false; Super.SetHand(Hand); if ( Hand == 1 ) Mesh = mesh'AutoML'; else Mesh = mesh'AutoMR'; } function BringUp() { if (SlaveEnforcer != none ) { SetTwoHands(); SlaveEnforcer.BringUp(); } bBringingUp = true; Super.BringUp(); } function TraceFire( float Accuracy ) { local vector RealOffset; RealOffset = FireOffset; FireOffset *= 0.35; if ( (SlaveEnforcer != None) || bIsSlave ) Accuracy = FClamp(3*Accuracy,0.75,3); else if ( Owner.IsA('Bot') && !Bot(Owner).bNovice ) Accuracy = FMax(Accuracy, 0.45); Super.TraceFire(Accuracy); FireOffset = RealOffset; } function Fire(float Value) { if ( AmmoType == None ) { // ammocheck GiveAmmo(Pawn(Owner)); } if ( AmmoType.UseAmmo(1) ) { GotoState('NormalFire'); bCanClientFire = true; bPointing=True; ClientFire(value); if ( SlaveEnforcer != None ) Pawn(Owner).PlayRecoil(2 * FiringSpeed); else if ( !bIsSlave ) Pawn(Owner).PlayRecoil(FiringSpeed); TraceFire(0.2); } } simulated function PlayFiring() { PlayOwnedSound(FireSound, SLOT_None,2.0*Pawn(Owner).SoundDampening); bMuzzleFlash++; PlayAnim('Shoot',0.5 + 0.31 * FireAdjust, 0.02); } simulated function PlayAltFiring() { PlayAnim('T1', 1.3, 0.05); bFirstFire = true; } simulated function PlayRepeatFiring() { if ( Affector != None ) Affector.FireEffect(); if ( PlayerPawn(Owner) != None ) { PlayerPawn(Owner).ClientInstantFlash( -0.2, vect(325, 225, 95)); PlayerPawn(Owner).ShakeView(ShakeTime, ShakeMag, ShakeVert); } bMuzzleFlash++; PlayOwnedSound(FireSound, SLOT_None,2.0*Pawn(Owner).SoundDampening); PlayAnim('Shot2', 0.7 + 0.3 * FireAdjust, 0.05); } function AltFire( float Value ) { bPointing=True; bCanClientFire = true; AltAccuracy = 0.4; if ( AmmoType == None ) { // ammocheck GiveAmmo(Pawn(Owner)); } if (AmmoType.AmmoAmount>0) { if ( SlaveEnforcer != None ) Pawn(Owner).PlayRecoil(3 * FiringSpeed); else if ( !bIsSlave ) Pawn(Owner).PlayRecoil(1.5 * FiringSpeed); ClientAltFire(value); GotoState('AltFiring'); } } state Active { function bool PutDown() { if ( bWeaponUp || (AnimFrame < 0.75) ) GotoState('DownWeapon'); else bChangeWeapon = true; return True; } function BeginState() { bChangeWeapon = false; } function EndState() { Super.EndState(); bBringingUp = false; } Begin: FinishAnim(); if ( bChangeWeapon ) GotoState('DownWeapon'); bWeaponUp = True; bCanClientFire = true; if ( !bIsSlave && (Level.Netmode != NM_Standalone) && (Owner != None) && Owner.IsA('TournamentPlayer') && (PlayerPawn(Owner).Player != None) && !PlayerPawn(Owner).Player.IsA('ViewPort') ) { if ( Pawn(Owner).bFire != 0 ) TournamentPlayer(Owner).SendFire(self); else if ( Pawn(Owner).bAltFire != 0 ) TournamentPlayer(Owner).SendAltFire(self); else if ( !bChangeWeapon ) TournamentPlayer(Owner).UpdateRealWeapon(self); } Finish(); } State DownWeapon { ignores Fire, AltFire, Animend; function BeginState() { Super.BeginState(); if ( Slaveenforcer != none ) Slaveenforcer.GoToState('DownWeapon'); } } //////////////////////////////////////////////////////// state NormalFire { ignores Fire, AltFire, AnimEnd; function Timer() { if ( SlaveEnforcer != none ) SlaveEnforcer.Fire(0); } function EndState() { Super.EndState(); OldFlashCount = FlashCount; } Begin: FlashCount++; if ( SlaveEnforcer != none ) SetTimer(0.20, false); FinishAnim(); if ( bIsSlave ) GotoState('Idle'); else Finish(); } state ClientFiring { simulated function bool ClientAltFire(float Value) { if ( bIsSlave ) Global.ClientAltFire(Value); return false; } simulated function Timer() { if ( (SlaveEnforcer != none) && SlaveEnforcer.ClientFire(0) ) return; SetTimer(0.5, false); } simulated function AnimEnd() { if ( (Pawn(Owner) == None) || (Ammotype.AmmoAmount <= 0) ) { PlayIdleAnim(); GotoState(''); } else if ( !bIsSlave && !bCanClientFire ) GotoState(''); else if ( bFirstFire || (Pawn(Owner).bAltFire != 0) ) { PlayRepeatFiring(); bFirstFire = false; } else if ( Pawn(Owner).bFire != 0 ) Global.ClientFire(0); else { PlayIdleAnim(); GotoState(''); } } simulated function BeginState() { Super.BeginState(); if ( SlaveEnforcer != None ) SetTimer(0.2, false); else SetTimer(0.5, false); } simulated function EndState() { Super.EndState(); if ( SlaveEnforcer != None ) SlaveEnforcer.GotoState(''); } } state ClientAltFiring { simulated function bool ClientFire(float Value) { if ( bIsSlave ) Global.ClientFire(Value); return false; } simulated function Timer() { if ( (SlaveEnforcer != none) && SlaveEnforcer.ClientAltFire(0) ) return; SetTimer(0.5, false); } simulated function AnimEnd() { if ( Pawn(Owner) == None ) GotoState(''); else if ( Ammotype.AmmoAmount <= 0 ) { PlayAnim('T2', 0.9, 0.05); GotoState(''); } else if ( !bIsSlave && !bCanClientFire ) GotoState(''); else if ( bFirstFire || (Pawn(Owner).bAltFire != 0) ) { PlayRepeatFiring(); bFirstFire = false; } else if ( Pawn(Owner).bFire != 0 ) Global.ClientFire(0); else { PlayAnim('T2', 0.9, 0.05); GotoState(''); } } simulated function BeginState() { Super.BeginState(); if ( SlaveEnforcer != None ) SetTimer(0.2, false); else SetTimer(0.5, false); } simulated function EndState() { Super.EndState(); if ( SlaveEnforcer != None ) SlaveEnforcer.GotoState(''); } } state AltFiring { ignores Fire, AltFire, AnimEnd; function Timer() { if ( Slaveenforcer != none ) Slaveenforcer.AltFire(0); } function EndState() { Super.EndState(); OldFlashCount = FlashCount; } Begin: if ( SlaveEnforcer != none ) SetTimer(0.20, false); FinishAnim(); Repeater: if (AmmoType.UseAmmo(1)) { FlashCount++; if ( SlaveEnforcer != None ) Pawn(Owner).PlayRecoil(3 * FiringSpeed); else if ( !bIsSlave ) Pawn(Owner).PlayRecoil(1.5 * FiringSpeed); TraceFire(AltAccuracy); PlayRepeatFiring(); FinishAnim(); } if ( AltAccuracy < 3 ) AltAccuracy += 0.5; if ( bIsSlave ) { if ( (Pawn(Owner).bAltFire!=0) && AmmoType.AmmoAmount>0 ) Goto('Repeater'); } else if ( bChangeWeapon ) GotoState('DownWeapon'); else if ( (Pawn(Owner).bAltFire!=0) && AmmoType.AmmoAmount>0 ) { if ( PlayerPawn(Owner) == None ) Pawn(Owner).bAltFire = int( FRand() < AltReFireRate ); Goto('Repeater'); } PlayAnim('T2', 0.9, 0.05); FinishAnim(); Finish(); } simulated event RenderOverlays(canvas Canvas) { local PlayerPawn PlayerOwner; local int realhand; if ( (bMuzzleFlash > 0) && !Level.bDropDetail ) MFTexture = MuzzleFlashVariations[Rand(5)]; PlayerOwner = PlayerPawn(Owner); if ( PlayerOwner != None ) { if ( PlayerOwner.DesiredFOV != PlayerOwner.DefaultFOV ) return; realhand = PlayerOwner.Handedness; if ( (Level.NetMode == NM_Client) && (realHand == 2) ) { bHideWeapon = true; return; } if ( !bHideWeapon ) { if ( Mesh == mesh'AutoML' ) PlayerOwner.Handedness = 1; else if ( bIsSlave || (SlaveEnforcer != None) ) PlayerOwner.Handedness = -1; } } if ( (PlayerOwner == None) || (PlayerOwner.Handedness == 0) ) { if ( AnimSequence == 'Shot2' ) { FlashO = -2 * Default.FlashO; FlashY = Default.FlashY * 2.5; } else { FlashO = 1.9 * Default.FlashO; FlashY = Default.FlashY; } } else if ( AnimSequence == 'Shot2' ) { FlashO = Default.FlashO * 0.3; FlashY = Default.FlashY * 2.5; } else { FlashO = Default.FlashO; FlashY = Default.FlashY; } if ( !bHideWeapon && ( (SlaveEnforcer != None) || bIsSlave ) ) { if ( PlayerOwner == None ) bMuzzleFlash = 0; Super.RenderOverlays(Canvas); if ( SlaveEnforcer != None ) { if ( SlaveEnforcer.bBringingUp ) { SlaveEnforcer.bBringingUp = false; SlaveEnforcer.PlaySelect(); } SlaveEnforcer.RenderOverlays(Canvas); } } else Super.RenderOverlays(Canvas); if ( PlayerOwner != None ) PlayerOwner.Handedness = realhand; } simulated function PlayIdleAnim() { if ( Mesh == PickupViewMesh ) return; if ( (FRand()>0.96) && (AnimSequence != 'Twiddle') ) PlayAnim('Twiddle',0.6,0.3); else LoopAnim('Sway',0.2, 0.3); } state Idle { function AnimEnd() { PlayIdleAnim(); } function bool PutDown() { GotoState('DownWeapon'); return True; } Begin: bPointing=False; if ( (AmmoType != None) && (AmmoType.AmmoAmount<=0) ) Pawn(Owner).SwitchToBestWeapon(); //Goto Weapon that has Ammo LoopAnim('Sway',0.2, 0.1); if ( Pawn(Owner).bFire!=0 ) Global.Fire(0.0); if ( Pawn(Owner).bAltFire!=0 ) Global.AltFire(0.0); } State ClientActive { simulated function AnimEnd() { bBringingUp = false; if ( !bIsSlave ) { Super.AnimEnd(); if ( (SlaveEnforcer != None) && !IsInState('ClientActive') ) { if ( (GetStateName() == 'None') || (GetStateName() == 'Enforcer') ) SlaveEnforcer.GotoState(''); else SlaveEnforcer.GotoState(GetStateName()); } } } simulated function BeginState() { Super.BeginState(); bBringingUp = false; if ( SlaveEnforcer != None ) SlaveEnforcer.GotoState('ClientActive'); } } State ClientDown { simulated function AnimEnd() { if ( !bIsSlave ) Super.AnimEnd(); } simulated function EndState() { if ( SlaveEnforcer != None ) SlaveEnforcer.GotoState(''); } } // End Class //============================================================================= /nj& i"'!w*  PS]"'Lw*aL>(a1-q! 7  <'p& gIu!"r*.&C?,..  -'-'2L>Iq!"q!  oG.u!"r*.&-'-'233s?.  C?,.Gq!%q!  'c90 qDp3w.*. a!B??L=$-' s=p3w.*. a!B?>L=$-' tFDw*$@@.a!g?L= u}a   x  wz  yc6 -' {kp -' | vC"G(a> ! @'`r** -#w.q!a:.%%8:.%%8q! A8#$-' B@R'-($$* ~GAnq"QH 6r.*%q!K-q!s:.%8:.%8q!- Ee!-' Fk>"-( DQ-&Jv#I--/-w.*%- KIM|#I--/-w.*%- NLn$-w.*%f-:.%8 -:.%8 q!8 O%!-(-(-(* P&-(-(-( HUC*'`6r.*%q!^K-q!^!:.%! -C?,.a!33?r*w*,w.*. ^I:.%8^-(q!- SU*-' T*-( R[%^.Xa>#! !1 !a ף= !1 1)@X,+Rr**q!IP-*#:.%-Lq! W,V! -C?,.a!33?llr*w*, YH-+$-*(-' Z-'-($$* V i/;:.%%v:.%%a! L>fff?-(w*%.Ev!  [ :A a/!4 a/!< EEM.EE( a/!j a/!'< EEM.EM2(' /rU90 `rrnWr*nnsn4N|nzn$nxnunjnbFENPnHnSntnJodnNnnNDn{NTnFXgn^S`NYS_noJKXf{ASJnESGJWNVJlSV{CS}nUn^{"SPSSXzn[{%{n^SR{-SQSMMAX^nQN]ns{.NsLn{A{CnS{X{]ntXG{"rGF}NjSYNknnzp{%X@C_z0rinRnlXO{{ z J\nkNaXcnhzinvShNpnRoenanUI>NiSHSqSmoFNENynoNznXJXXHSrn~nMNZSKNAnVnInvnqzzzz/zz@zz_zzzJzn[z0zzzZnUzndzzPzzzsjzizzzzz2nBz zzLMezKz)nCz)nWStNIz`nZSpnDnTzC`z?zzn]SNXLz=zNk@kn\SIXynVn_zzzzzChzznfzInzzFzSOzz9nBygSuXmNazzzDz=zX~zzzczkzXrzzzzDXwzzz9zpzzzzzFCzzz[nizzzN[{ aVI beIuB sI] @J] MJK ZJdhgJd uJ` BKA OKA [K w gK]sK dALl OLl \L c iL` uL{ AMn MMrZMrhML vMoc BN x ONQ[NP iNhvNP DO} PO|]OMkOn] xdo EeoReM `edN medJ ze JGfl QhY ^h@ jh} vhP Cir Pim ]i Rjio |kj Il~ Vlug cluaolO }lw Jmx Vmubmvpm] ~m X Kno Xnc en T qnD}nl Koof Wope dor pox} }orb Jp'} Vp} bp Dnp} |paHq/} Vq bqnq} |q]Ir} Wrq} drVm qr ,}rZ&isZ#OtZ9BrtX} tu'S@v/S\v XRyvn{ K{Y} X{(d{ A,L|S3x|n4Zk}qm E^CQ^aT PBu^3w ^j DVH =2^dm PC\~_nZ ]3i Z_\ R{ FHM^+U `T@3T(G 0Zorm In4KV+a aL bmzOz9$n|m R .,^~oJ~8y ]-q(^/FPu /:Cr{ } 2XJxm b{n w| _1sLwd>[ RY J3k?M^NCkm n GYz0PS} c )No iJ}n4D Gm K KxWhO@w Bw @Fy l'E k %Opm } K s W^>c C,a)NM n4L[/g} D3PPC "cQ'tBP} RB^'`Dd|=c`OC=ROq lxq Vc#bk#E h"FH)N\ wQC0T5DA-yNf't&[-+ALl} xm EMQ} ^m kOw0F,vC-bO'N&u%d[T\ Sv_5U5J F[E/D|am oEnhanced Enforcer/Minigun Mutator v1.1 by Ze Mad, (released the 01/24/2000) IT IS MY FIST MOD, SO PLEASE BE INDULGENT !!! :))) Ze Mad (cyric@free.fr) Version : 1.1 ADDED since version 1.0 : Displays a specified message when you pickup an Enhanced weapon... Requirement : Unreal Tournament v4.05b (I haven't tested this mutator on other versions, but I think it can work) Inst/Uninstallation : - ZIP version : install the 2 files (EEM.u and EEM.int) in your UT\System directory and the EEMReadme.txt in your UT\Help directory... - UMOD version : just double click on the UMOD file (EEM.UMOD) and enter your UT directory when asked, the prog will install everything by itself... - To remove it, juste open the "setup.exe" in your UT\System and select EEM, click Next... Features : When selected in the list, this mutator replaces Enforcers/Double Enforcers and Miniguns by their Enhanced version. The Enhanced version of a weapon do more damage and allow those lovely "Headshot!" when a bullet hit a head. Bugs known : None ! ;) Toubleshooting : If you see no changes or if there's no Enforcers/Miniguns in the game after selecting the mutator, try to select this mutator ONLY to see if it works, if not feel free to e-mail me... Online gaming : I haven't tested it in online gaming and I know nothing about it, just try to add the line ServerPackages=EEM in your UT.ini and feel free to e-mail me if it works... Cedits : {KiX}ProfessorGib, my mentor (even if I feel that I bother him too much sometimes...) Epic and GT, if you don't know whyn just sell your Unreal/UT CDs and go buy Q3A... Everybody on the UT forums (http://www.planetunreal.com/modcentral/forums/) Everybody who has written, writes or will write a FAQ or a tutorial... I surely forget someone, so feel "free" to include yourself here : (but ask permission first !) ********, because ***** and ******... Useful and miscellaneous links : www.planetunreal.com (for everything) www.planetunreal.com/thelaboratory/ (Home of {KiX}ProfessorGib) www.unrealed.net (for FAQs, tutorials, ...) I surely forget something... www.*****.*** (***, ***) Contact me for everything you want at __--==" cyric@free.fr "==--__ it costs nothing but 2 mn of your life... ---Legal things--- This mod is in no way affiliated with Epic Megagames or GT Interactive. You MAY NOT distibute it, neither for profit or for free, by any physical medium (ie CD-ROM) without my explicit written permission. You may use the code in your mods and distribute this mod via any electronic medium (ie Internet, FTP, etc.) without my permission.System\Manifest.iniSystem\Manifest.intSystem\EEM.intf System\EEM.uKHelp\EEMReadme.txtFM 㟓@Z@