[Setup] Product=SpawnGuard Version=100 Archive=SpawnGuard.umod SrcPath=. MasterPath=.. Requires=UnrealTournamentRequirement Group=SetupGroup Group=umodINIGroup Group=SpawnGuardGroup Group=umodIncludeFilesGroup [UnrealTournamentRequirement] Product=UnrealTournament Version= [SetupGroup] Copy=(Src=System\Manifest.ini,Master=System\Manifest.ini,Size=660,Flags=3) Copy=(Src=System\Manifest.int,Master=System\Manifest.int,Size=499,Flags=3) [umodINIGroup] AddIni=UnrealTournament.ini,Engine.GameEngine.ServerPackages=SpawnGuard [SpawnGuardGroup] File=(Src=System\SpawnGuard.upkg,Size=75) File=(Src=System\SpawnGuard.int,Size=109) File=(Src=System\SpawnGuard.u,Size=12119) File=(Src=System\spawnguard.ini,Size=68) [umodIncludeFilesGroup] File=(Src=Help\SpawnGuard.txt,Size=2989) [Setup] LocalProduct=SpawnGuard ReadMe=Help\SpawnGuard.txt SetupWindowTitle=SpawnGuard AutoplayWindowTitle=SpawnGuard Options ProductURL=http://www.remixradio.com/ut/ VersionURL=http://www.remixradio.com/ut/ Developer={MP3}ether DeveloperURL=http://www.remixradio.com/ut/ [UnrealTournamentRequirement] LocalProduct=UnrealTournament ProductURL=http://www.unrealtournament.com/ VersionURL=http://unreal.epicgames.com/ Developer=Epic Games, Inc. DeveloperURL=http://www.epicgames.com/ [Flags] AllowDownload=True ClientOptional=False ServerSideOnly=False [Public] Object=(Name=SpawnGuard.SpawnGuard,Class=Class,MetaClass=Engine.Mutator,Description="SpawnGuard") *Ef@-,;+ CPPy-fNone SpawnGuardFaderSetDefaultDisplayPropertiesTeamFireTexturesTeamFireTextureStringsSetFadeWeaponSetOwnerDisplaySetDisplayPropertiesFindInventoryTypeEngineCoreMutatorTakeDamageTournamentWeaponBotPickupFunctionChangedWeapon PlayerPawnTimerRegisterDamageMutatorSystem DecapitatedBotpackPostBeginPlay SpectatorGiveToModifyPlayer InventoryPlayerReplicationInfo GameInfoPickup LevelInfoWeaponMutatorPawnLevelActorClassFirePackageStructCounter DamageType UnrealShare StrPropertyDynamicLoadObjectStructProperty FireTexture TextBufferNameProperty ScriptTextGObjectProperty ScaleGlow LocationVectorOtherPactualDamageTexture HitLocation bTeamGame PlayerNameGameOwner VictimNameNextDamageMutatorVictimTeamNuminstigatedBy bHeldItemObjectSelectedItemTeamTexturesFloatProperty ShieldBeltBelt_fx N_Shield RedShield Greenshield BlueShield Initialized Momentum FunctionBoolPropertyTournamentPickup AffectorGlow IntPropertyByteProperty GuardTime StartFactorMaxGlowActiveTextureDamageFactorTimerIntervalFlashActiveWeaponTeam VictimInvInstigatorInvInstigatorName($2"/Xu6j@tt9 }ttj@9 }t9 }9 }tt9 }9 }9 }ttj@Rù9 }9 }.;9 }.;9 }9 }9 }t ]*)UnrealShare.Belt_fx.ShieldBelt.RedShield+*UnrealShare.Belt_fx.ShieldBelt.BlueShield,+UnrealShare.Belt_fx.ShieldBelt.Greenshield)(UnrealShare.Belt_fx.ShieldBelt.N_Shield * ! @ @@@@@@:O-w* :r * . ! ?&??&??? $''pp: GuardTime = U %?&?, a' & 2 a/!w  * a  w*-'       )"w* ^+//============================================================================= // SpawnGuard //============================================================================= class SpawnGuard extends Mutator config(spawnguard); var() config float GuardTime; //The time the SpawnGuard should last var() config float StartFactor; //The time the SpawnGuard should last var() config float MaxGlow; //What percentage to start the Fade at var bool Initialized; function PostBeginPlay() { if (Initialized) return; Initialized = True; Level.Game.RegisterDamageMutator( Self ); } function ModifyPlayer(Pawn Other) { local Fader g; if ( Other.IsA('Spectator') || Other.FindInventoryType(class'Fader') != None ) return; g = Spawn(class'Fader',,, Location); if (g != None) { //log("adding fader to inventory and activating it"); g.bHeldItem = true; g.GuardTime = GuardTime; g.StartFactor = StartFactor; g.MaxGlow = MaxGlow; g.GiveTo( Other ); g.PickupFunction( Other ); Other.SelectedItem = g; } //log("done initializing the SpawnGuard"); Super.ModifyPlayer(Other); } function MutatorTakeDamage( out int ActualDamage, Pawn Victim, Pawn InstigatedBy, out Vector HitLocation, out Vector Momentum, name DamageType) { local Inventory VictimInv; local Inventory InstigatorInv; local string VictimName; local string InstigatorName; VictimName = Victim.PlayerReplicationInfo.PlayerName; InstigatorName = InstigatedBy.PlayerReplicationInfo.PlayerName; //log( VictimName $ " takes initial damage of " $ ActualDamage ); if (Victim.IsA('Bot') || Victim.IsA('PlayerPawn')) { VictimInv = Victim.FindInventoryType(class'Fader'); if( VictimInv != None ) { if( ActualDamage > 100 && DamageType == 'decapitated' ) { //log( VictimName $" suffers a headshot!" ); ActualDamage = 100; } ActualDamage = ActualDamage * Fader(VictimInv).DamageFactor; //log( "Damage reduced to " $ ActualDamage $ " by " $ VictimName $ "'s Fader State " $ Fader(VictimInv).DamageFactor ); } } if (InstigatedBy.IsA('Bot') || InstigatedBy.IsA('PlayerPawn')) { InstigatorInv = InstigatedBy.FindInventoryType(class'Fader'); if( InstigatorInv != None ) { ActualDamage = ActualDamage * Fader(InstigatorInv).DamageFactor; //log( "Damage reduced to " $ ActualDamage $ " by " $ InstigatorName $ "'s Fader State " $ Fader(InstigatorInv).DamageFactor ); } } if ( NextDamageMutator != None ) NextDamageMutator.MutatorTakeDamage( ActualDamage, Victim, InstigatedBy, HitLocation, Momentum, DamageType ); }  . - -' +rQ "w* _=//============================================================================= // Fader //============================================================================= class Fader extends TournamentPickup; var() float GuardTime; //The time the Fader should last var() float StartFactor;//What percentage to start the Fade at var() float MaxGlow; //What percentage to start the Fade at var() firetexture TeamFireTextures[4]; var() string TeamFireTextureStrings[4]; var firetexture ActiveTexture; var float DamageFactor; //Current factor of fader var float TimerInterval;//Current factor of fader var int Counter; //Current factor of fader var string PlayerName; var bool Flash; var int TeamNum; var texture TeamTextures[4]; var Weapon ActiveWeapon; function PickupFunction(Pawn Other) { if ( Level.Game.bTeamGame && (Other.PlayerReplicationInfo != None) ) { TeamNum = Other.PlayerReplicationInfo.Team; } if ( TeamFireTextures[TeamNum] == None ) TeamFireTextures[TeamNum] = FireTexture(DynamicLoadObject(TeamFireTextureStrings[TeamNum], class'Texture')); if( StartFactor > 1 ) StartFactor = 1; if( MaxGlow < 1 ) MaxGlow = 1; if( GuardTime < 1.5 ) GuardTime = 1.5; DamageFactor = StartFactor; PlayerName = Other.PlayerReplicationInfo.PlayerName; ActiveTexture = TeamFireTextures[TeamNum]; Other.SetDisplayProperties( ERenderStyle.STY_Translucent, ActiveTexture, true, true ); SetOwnerDisplay(); Other.ScaleGlow = 0; Other.Weapon.ScaleGlow = 0; log( PlayerName $ ": GuardTime = " $ GuardTime ); Counter = 0; TimerInterval = ( GuardTime - 1 ) / 10; //log( PlayerName $ ": TimerInterval = " $ TimerInterval ); SetTimer( TimerInterval, True ); } function Timer() { local pawn P; local float Glow; //log( PlayerName $ ": Counter = " $ Counter $ ", preDamageFactor = " $ DamageFactor ); P = Pawn(Owner); if( Counter <= 9 ) { DamageFactor = ( ( ( Counter * 0.1 ) + StartFactor ) / ( 0.9 + StartFactor ) ) * 0.9; Glow = MaxGlow * DamageFactor; P.ScaleGlow = Glow; ActiveWeapon.ScaleGlow = Glow; } else { if( Counter >= 15 ) { P.ScaleGlow = 1; P.SetDefaultDisplayProperties(); ActiveWeapon.ScaleGlow = 1; ActiveWeapon.SetDefaultDisplayProperties(); //log( PlayerName $ ": done with protection" ); DamageFactor = 1; Destroy(); } else { //for the last second, we blink DamageFactor = 0.9; if( Flash ) { //translucent Flash = false; P.SetDisplayProperties( ERenderStyle.STY_Translucent, ActiveTexture, true, true ); SetFadeWeapon(); } else { //solid Flash = true; P.SetDefaultDisplayProperties(); P.ScaleGlow = 1; ActiveWeapon.SetDefaultDisplayProperties(); ActiveWeapon.ScaleGlow = 1; } SetTimer(0.2,false); } if( Inventory != None ) Inventory.SetOwnerDisplay(); } Counter++; } function ChangedWeapon() { if( Inventory != None ) Inventory.ChangedWeapon(); SetFadeWeapon(); } function SetFadeWeapon() { // Make old weapon normal again. if ( ActiveWeapon != None ) { ActiveWeapon.SetDefaultDisplayProperties(); if ( ActiveWeapon.IsA('TournamentWeapon') ) TournamentWeapon(ActiveWeapon).Affector = None; } ActiveWeapon = Pawn(Owner).Weapon; // Make new weapon cool. if ( ActiveWeapon != None ) { if ( ActiveWeapon.IsA('TournamentWeapon') ) TournamentWeapon(ActiveWeapon).Affector = self; ActiveWeapon.SetDisplayProperties(ERenderStyle.STY_Translucent, ActiveTexture, true, true ); } } function SetOwnerDisplay() { if( Inventory != None ) Inventory.SetOwnerDisplay(); SetFadeWeapon(); } 'z Cw*Ca/!.*.w*a/!.$'' "D. , ? =fff?fff? ,???afff?(--($''v-'??aL>(w*  %-,vl9 }.;9 }.;9 }9 }9 }/9 }9 }9 }/l9 }9 }//////9 }Rù # 6{  a/! a/!  w*,d!,dD?.Aa/!a/!  Aw*D?.yw*$     ' ' %" %$ %4 % %J % %! ' %S % J5 % 4 %G 4 'K %, '+ % 'L % %X '& %/ ,> %. 4# (7 %T 4? %% %0 %; 4@ 4 %U 4V 4B S .6 S S S S Yb T= TF S S-&/P&/M&/O&/N % %1 S 4H~VaT##3a#-: n#+9z#^ G$[ S$"8_$#8l$D y$-CE%) R%Z ^%-Ej%\ w%]C&P&` ]&+W i&-du&-cB'> O'_ ['-* g',Q s'-e ',Z K(,[ W(,\ c(-A o(-R{(-<H) U)ga),dH./l0,24i+[1,8D]/|]24j=k^DUIYnfmT, AA[SpawnGuard.SpawnGuard] GuardTime=4 StartFactor=0.1 MaxGlow=4 ------------------------------------------------------------------------------- | SpawnGuard Mutator for UT | (c) 2000 Arne F. Claassen ------------------------------------------------------------------------------- Version: 1.00 Created: 22/01/00 Author: Arne "{MP3}ether" Claassen Contact: ether@claassen.net Homepage: http://www.remixradio.com/ut Disclaimer ---------------- This software is unsupported. By using it, you assume all risk and responsibility for running it. Legal Info ---------- You may install SpawnGuard on any non-commercial UT server, or personal UT Clients. Any other use requires the written consent of the Author. Other uses include, but are not limited to, distributing SpawnGuard alone or bundled with other software, or including SpawnGuard in any form of commercial Media. You may make SpawnGuard available for Download, as long as the full UMOD package, including this Notice is provided in the downloadable package. Overview -------- SpawnGuard gives each player a window of reduced vulnerability and visibility upon spawning. It is meant to give the Player the chance to move from the Spawn point without suffering immediate death from an ongoing battle or a respawn Camper. During the GuardTime, the player will start translucent and fade to solid with the last second flashing from translucent to solid and back. As the player grows more solid, a higher percentage of any suffered damage is actually taken. The flipside of this is, that while guarded, the Player's ability to inflict damage is also limited by the same percentage of solidity, i.e. a shot fired while mostly translucent will only do a fraction of the ordinary damage. Installation ------------ Double-click on the UMOD file and follow the instructions. After a successful installation you should have the following new files on your system: into C:\UnrealTournament\system SpawnGuard.u (the binary code) SpawnGuard.int (the mutator description) SpawnGuard.ini (the configuration file) into C:\Unrealtournament\help SpawnGuard.txt Configuration --------------- There are three parameters that can be set in the config file: GuardTime - The total time in secondsthat SpawnGuard protection should last. Has to be greater than 1.5. Because of Network Lag, you may have to add an extra second or two to get the desired GuardTime length StartFactor - The initial damage factor. This affects initial visibility and amount of damage taken/dealt. A number between 0 and 0.9 MaxGlow - Currently set to 4, which is about the visibility of the normal non-translucent model. Notes ----- SpawnGuard has been tested under Botmatch and Network DeathMatch and CTF running on a Windows 98 UT Server. It has not been tested with Mac or Linux Clients and Servers. System\Manifest.ini,System\Manifest.int,System\SpawnGuard.upkgKSystem\SpawnGuard.intjmSystem\SpawnGuard.uW/System\spawnguard.ini.5DHelp\SpawnGuard.txtr5 A"B2'