[Setup] Product=Permanent Decals Version=100 Archive=PermanentDecals.umod SrcPath=. MasterPath=.. Requires=Unreal Tournament Demo322Requirement Group=SetupGroup Group=LongDecalsGroup Group=umodIncludeFilesGroup [Unreal Tournament Demo322Requirement] Product=Unreal Tournament Demo Version=322 [SetupGroup] Copy=(Src=System\Manifest.ini,Master=System\Manifest.ini,Size=529,Flags=3) Copy=(Src=System\Manifest.int,Master=System\Manifest.int,Size=573,Flags=3) [LongDecalsGroup] File=(Src=System\PermanentDecals.u,Size=10609) File=(Src=System\PermanentDecals.int,Size=97) [umodIncludeFilesGroup] File=(Src=Help\PermanentDecals.htm,Size=2244) [Setup] LocalProduct=Permanent Decals ReadMe=Help\PermanentDecals.htm SetupWindowTitle=Permanent Decals AutoplayWindowTitle=Permanent Decals Options ProductURL=http://www.planetunreal.com/pipeline/ VersionURL=http://www.planetunreal.com/pipeline/ Developer=Mongo (Mike Lambert) DeveloperURL=http://www.planetunreal.com/pipeline/ [Unreal Tournament Demo322Requirement] LocalProduct=Unreal Tournament Demo ProductURL=http://www.unreal.com/ VersionURL=http://unreal.epicgames.com/versions.htm Developer=Epic Games, Inc. DeveloperURL=http://www.epicgames.com/ *Dm@0&P:$ DC|/Ki0mNoneSplats LongDecalsCoreSystemEngine DrawScalePockTexTextureMultiDecalLevel AttachDecal BeginPlay bImportantTimerTickExecute LongPock BeginState MenuCaption bAttached DecalTickerLongImpactHoleLongEnergyImpactLongBloodSplat LongScorchLongBlastMarkLongUTBloodPoolPostBeginPlayLongBoltScorch MenuHelpTimeMultiplierLongUTBloodPool2UWindowUMenuOwner DeltaTime Function bLowGoreGetEntryLevel TimeSeconds Location bChecked bDropDetail TextBufferUWindowPulldownMenuItemUWindowPulldownMenuUWindowWindow GetLevelObjectStructProperty RotationLastRenderedTime UWindowList MenuItemClassPropertyObjectPropertyFloatPropertyBoolPropertypock RemoteRolePackage ScriptText BlastMark BloodSplat BoltScorchEnergyImpact UTBloodPool ImpactHolebStartedLife rocketblast BloodSplat1 BloodSplat2 BloodSplat3 BloodSplat4 BloodSplat5 BloodSplat6 BloodSplat8 BloodSplat9BloodSplat10 shockmark energymarkpock0_tpock2_tpock3_tpock4_tpock5_t BloodPool6 BloodPool8 BloodPool9 BloodSplat7 impactcrackpock1_t BloodPool7 IntProperty LevelInfo GameInfoDecalLevelActorClassUTBloodPool2BytePropertyScorchUMenuModMenuItemBotpackDecalHandlertickernewScorchClass newDecalT=>3͆_ _ _ _  $? '|mwlOL& -T= "# dT=R$W$@?9 -a t-$-'Y-a@?,(raA?,( - ,33>- >aa?'?&a@' a /,2OLt;aG%^_ vmvm;aG%^_ vmvmvm;aG;aG;aG;aG%^_ |mw|mw|mw! ]Permanent &Decals]Make decals last forever%tgT= S "$\B>(!FPT=R$W_   S "$33>)T= .8* d${.?0T= "$> $"' -_  S "$L>   R//LongImpactHole class LongImpactHole extends LongScorch; simulated function BeginPlay() { if ( !AttachDecal(100) ) destroy(); } Z//LongUTBloodPool class LongUTBloodPool extends LongScorch; var texture Splats[5]; simulated function BeginPlay() { if ( class'GameInfo'.Default.bLowGore ) { destroy(); return; } Texture = splats[Rand(5)];; if ( !AttachDecal(100) ) destroy(); } g//LongScorch class LongScorch extends Decal; var bool bAttached, bStartedLife, bImportant; var float TimeMultiplier; simulated function PostBeginPlay() { Super.PostBeginPlay(); // SetTimer(1.0, false); } simulated function Timer() { // Check for nearby players, if none then destroy self if ( !bAttached ) { Destroy(); return; } if ( !bStartedLife ) { RemoteRole = ROLE_None; bStartedLife = true; if ( Level.bDropDetail ) SetTimer(5.0 * TimeMultiplier + 2 * FRand(), false); else SetTimer(18.0 * TimeMultiplier + 5 * FRand(), false); return; } if ( Level.bDropDetail && (MultiDecalLevel < 6) ) { if ( (Level.TimeSeconds - LastRenderedTime > 0.35) || (!bImportant && (FRand() < 0.25)) ) Destroy(); else SetTimer(1.0, true); } else if ( Level.TimeSeconds - LastRenderedTime < 1 ) { SetTimer(5.0, true); return; } Destroy(); } --a +-$-' E//LongPock class LongPock extends LongScorch; var() texture PockTex[6]; simulated function BeginPlay() { Texture = PockTex[Rand(6)]; bAttached = AttachDecal(100, vect(0,0,1)); } u//DecalTicker class DecalTicker extends Actor; var LongDecals DecalHandler; function Tick (float deltaTime) { super.Tick(deltaTime); DecalHandler.Tick(deltaTime); }  ^9 -- 33>a , \ Ba g-a b-$-'P-a@@(`a@( a  < -a ,: Ba iclass LongBoltScorch expands LongEnergyImpact; simulated function Timer() { // Check for nearby players, if none then destroy self if ( !bAttached ) { Destroy(); return; } if ( !bStartedLife ) { RemoteRole = ROLE_None; bStartedLife = true; if ( Level.bDropDetail ) SetTimer(3 * TimeMultiplier, false); else SetTimer(4 * TimeMultiplier, false); return; } Destroy(); }  u1,- B#? E//LongEnergyImpact class LongEnergyImpact extends LongScorch; y!    D//LongBloodSplat class LongBloodSplat extends LongScorch; var texture Splats[10]; simulated function BeginPlay() { if ( class'GameInfo'.Default.bLowGore || (Level.bDropDetail && (FRand() < 0.35)) ) { destroy(); return; } Texture = splats[Rand(10)];; if ( !AttachDecal(100) ) destroy(); } ?//LongBlastMark class LongBlastMark extends LongScorch; s *+--p-a   *a +-_/a0 \ R   h   ~             [w*a3a   10 \class LongUTBloodPool2 expands LongUTBloodPool; simulated function Timer() { // Check for nearby players, if none then destroy self if ( !bAttached ) { Destroy(); return; } if ( !bStartedLife ) { RemoteRole = ROLE_None; bStartedLife = true; } } m//LongDecals class LongDecals extends UMenuModMenuItem; var DecalTicker ticker; function BeginState() { Super.BeginState(); Execute(); } function Execute() { // DecalConfigWindow(MenuItem.Owner.Root.CreateWindow(class'DecalAboutWindow', 100, 100, 200, 200, MenuItem, True)); MenuItem.bChecked = !MenuItem.bChecked; if (MenuItem.bChecked) { ticker = MenuItem.Owner.getEntryLevel().spawn(class'DecalTicker'); ticker.decalhandler = self; } else { ticker.decalhandler = none; ticker.destroy(); } } function Tick(float deltaTime) { local Scorch scorch; local class newScorchClass; local LongScorch newDecal; foreach MenuItem.Owner.getLevel().allactors(class'Scorch',scorch) { switch (scorch.class) { case class'BlastMark': newScorchClass = class'LongBlastMark'; break; case class'BloodSplat': newScorchClass = class'LongBloodSplat'; break; case class'EnergyImpact': newScorchClass = class'LongEnergyImpact'; break; case class'ImpactHole': newScorchClass = class'LongImpactHole'; break; case class'UTBloodPool': newScorchClass = class'LongUTBloodPool'; break; case class'Pock': newScorchClass = class'LongPock'; break; case class'BoltScorch': newScorchClass = class'LongBoltScorch'; break; case class'UTBloodPool2': newScorchClass = class'LongUTBloodPool2'; break; } if (newScorchClass != None) { scorch.destroy(); newDecal = MenuItem.Owner.getLevel().Spawn(newScorchClass,scorch.owner,,scorch.Location, scorch.Rotation); // newDecal.TimeMultiplier = 20; } } } d Ba <<<hcb< c^c0ccc,c$c+c`cg<!cfc7c_7a759*F$ e;c87c9c9)Ic.7"c-$9%83$J$/HY8'$7"1($12cA$&$c?c6cBc>c:] c@6ccdc4$cCXVUTZPOMLKW\SR[QNGEEC,kHD V,fb^o M jY  f ir _ E^"'# c$oo$}^(A[-n\/YJ2 nc3eQ5  v6 qB7 s8@9,lM9Z9g9=4]E: =4eb<=4rGA:yO=4PsP=4@CT bCWheX FMZ=4tS[ >Gb =4PEc+Ud=4O@e=4IOj!Xkwyktpm,# dq=4gpq=4xWv +O[Public] Object=(Name=PermanentDecals.LongDecals,Class=Class,MetaClass=UMenu.UMenuModMenuItem) PermanentDecals Readme



Date Created:October , 1999
Author:Mike Lambert (Mongo)
Description:Decals last forever.


PermanentDecals makes all decals last forever. This allows for deathmatch games that STILL look like battles have actually taken place, twenty minutes afteer they've occured. It also allows for some incredible pulse-cannon alt-fire graffiti, since those decals are permanent. In addition, this mod does not require any action on the part of the server. This mod can be played on ANY server, in ANY game. You can go online immediately, and play with long decals on any server you choose to. It's all done on the client, with no intervention of the server. That means you won't slow any other players down by enabling this, and only you will see your decal art. (Hey, that's what the screenshot F9 key is for...right? :-)


Go to the Mod Menu in the UT MenuBar. Turn Permanent Decals On or Off. Simple Enough? I hope so.

Unfortunately, due to the way Unreal Tournament handles MenuItems, I am unable to have PermanentDecals default to "on". This means that you'll have to turn it on everytime you start Unreal Tournament. Not to worry tho, as after talking with Epic about it, Mek has agreed to put in a hook so that this client-side mod can remember your on/off setting. Look for that after the demo patch has been released.


Copyright (c) 1999, Mike Lambert

You are NOT allowed to commercially exploit this modification, i.e. put it on a CD or any other electronic medium that is sold for money without my explicit permission!

You MAY distribute this level through any electronic network (internet, FIDO, local BBS etc.), provided you include this file and leave the archive intact.

System\Manifest.iniSystem\Manifest.int=System\PermanentDecals.uq)System\PermanentDecals.intJ.aHelp\PermanentDecals.htm.o7:8 A