[Setup] Product=Decal Stay Version=200 Archive=DecalStay.umod SrcPath=. MasterPath=.. Requires=UnrealTournament400Requirement Group=SetupGroup Group=DecalStayGroup Group=umodIncludeFilesGroup [UnrealTournament400Requirement] Product=UnrealTournament Version=400 [SetupGroup] Copy=(Src=System\Manifest.ini,Master=System\Manifest.ini,Size=479,Flags=3) Copy=(Src=System\Manifest.int,Master=System\Manifest.int,Size=478,Flags=3) [DecalStayGroup] File=(Src=System\DecalStay.u,Size=32040) File=(Src=System\DecalStay.int,Size=89) [umodIncludeFilesGroup] File=(Src=Help\DecalStay.htm,Size=2498) [Setup] LocalProduct=Decal Stay ReadMe=Help\DecalStay.htm SetupWindowTitle=Decal Stay AutoplayWindowTitle=Decal Stay Options ProductURL=http://www.planetunreal.com/pipeline/miscmods/decalstay.htm VersionURL=http://www.planetunreal.com/pipeline/miscmods/decalstay.htm Developer=Mongo (Mike Lambert) DeveloperURL=http://www.planetunreal.com/pipeline/ [UnrealTournament400Requirement] LocalProduct=UnrealTournament ProductURL= VersionURL= Developer= DeveloperURL= *DHytn T*Ƥ0KiNoneCore DecalStaySystemSplatsEngineTexture DrawScale SetValueMultiDecalLevelSetTextTimer AttachDecal BeginPlay bImportantUWindow SetupText RestartDecalTickSetFontPockTex SaveValuesNotifyCreatedCreateControlUMenuCDPock GetValue CaptureMouseTimeMultiplier MutatorsCDDirectionalBlast CDRipperMarkCDNuclearMarkDecalLengthSlider CDBiomarkCDBigEnergyImpactDecalConfigClientWindow CDBlastMark CDDecals DecalTickerCDUTBloodPoolCDUTBloodPool2 CDImpactHoleClose CDBoltScorch CDBloodSplatDecalConfigWindow CDScorch MenuHelpExecute MenuCaption MaxValue MinValue ClientClass CDWallCrack CheckValue HelpText WindowTitleSetup MouseMove bAttachedDirectionalAttach LMouseDownTextGetLookAndFeelTexturePaint LMouseUpCDEnergyImpact BeforePaintKeyDownDecalCanvasUWindowLookAndFeel bChecked StrPropertyLastRenderedTime RotationStructPropertyHKeyValueLevelActorOwner bDropDetail NewValueRegion bLowGoreUWindowHSliderControlUWindowPulldownMenuItemUWindowSmallCloseButtonUWindowSmallButtonDir DeltaTimeGetEntryLevelUWindowRootWindowUWindowCheckboxUWindowDialogControlClassPropertyUWindowWindow TimeSeconds UWindowBaseGetPlayerOwner GetLevelSetSizeHLine CreateWindowDrawStretchedTextureSegment ClipText DrawUpBevel PlayerPawnPTextXTextY bDisabledAlign ParentWindow TextColor bMouseDown BytePropertyCaption Location TextSizeVectorRootObject SliderDrawX SliderDrawYPackage TrackWidth bSlidingbNoSlidingNotify CancelButtonUWindowDialogClientWindowStruct LookAndFeel CloseButton TextBuffer UWindowListUWindowFramedWindowUWindowButtonUMenuLabelControlUMenuFramedWindowUMenuModMenuItem MenuItemBotpackObjectPropertyFloatProperty RemoteRoleUWindowPulldownMenupock UTBloodPool UTBloodPool2 DrawColor BlastMark WallCrackbiomarkScorchBigEnergyImpact RipperMark NuclearMark ImpactHole EnergyImpact BoltScorch BloodSplatDirectionalBlast bStartedLife bigshockmark biosplat biosplat2 rocketblast BloodSplat1 BloodSplat2 BloodSplat4 BloodSplat5 BloodSplat6 BloodSplat7 BloodSplat8 BloodSplat9 BloodSplat10 shockmark energymarkNorm impactcrack bigblastpock0_tpock2_tpock4_t ripperblast BloodPool6 BloodPool7 BloodPool8 BloodPool9 WallCrack1 WallCrack2 BloodSplat3 BoolPropertyClassColorTestXWinTopCEYW ScriptTexttBRG ReturnValue Function LevelInfo GameInfo WinWidth NotifyWindow WinHeight DecalHandlerDecalMultiplierTextDecalMultiplierHelpDisabledColorMultiplier IntPropertyStepUp StepDown SliderWidthbExtendedDecalsbPermanentDecalsEnabledCheckboxPermanentCheckbox DecalLengthMultiplierLabel TrackStartticker newScorchnewScorchClass newDecalNewTimeMultiplierbNewPermanentDecalsWinLeftNoneRestartDecals bTimerLoopbNewExtendedDecals TimerRate{,0~@U4RRRR=$?qqqqVqfe"2))|[$\î\î\î\ôo xxxxԌxxxxxx᱘5$?4$B@]Decal-Stay Multiplier9]dWhat should the default decal-stay time be multiplied by? 0 is permanent-decals, 1 is the normal decal-stay length. 2 causes them to stay twice as long, and so on.qky%6 h~|.Xڌ|.X))|.X))᱘|.X))᱘)))).'l|.Xڌ|.Xڌ|.Xڌ|.Xڌ|.Xڌ|.Xڌ|.Xڌ|.Xڌ|.X))))᱘᱘))))7Xñ7XóВqqqqqq(qqAqqqqBqqqq@qqqqqqqq'qqqqqqm@qqKqq3qq qqqqqqqqqq@qqqqqrc( jc( .uqq*qCD"N4 ~@U "qqqq#qso)%@{8~@UkR$@?qqqqqqqq2qqqq -a t- $- 'Y-a@?,(raA?,( - ,33>-B L>aa?'   ?&a@' a qqH'26.uͷ~@U~@U~@U~@U~@U~@U~@U;aGV撋R~@U~@U~@U~@U~@U~@U~@Uhhhhh;aGV撋Rvm;aGV撋Rvmvmvmvm~@U~@U;aGV撴o ;aG;aGV撋R jc(hh3]Configure &Decal Stay1]0/Make decals last a configurable length of timeqqqq;qqq qqq qqqqq.qQqqNqqqqqq9qq@qqGqwS#=-5~@UR "$ff&?q"Bx->H"N4 RS "$L>qDz.?["5~@UkRR S "$33>qqqq!qqq\!CJ^~@U$@qh$D"Nh~@U "$?qI_E r~@URS "$\B>qqgqqqdG7H'~@US "$>q|p+IX-~@U "$>qq qT Kvu~@UqX`LPi~@U$ff?q%tY*M|w%@{8${.?qqOqq$ql&P(m~@UqqqFi/2R>0o o 6:]Decal-Stay Configurationqq V5-- ?  q9//CDRipperMark class CDRipperMark expands CDScorch; q^7E=/7NO7$##?& j$ $$ $?,$?, ?,?,#?, qZqq}/ "/ $ / qD//CDDirectionalBlast class CDDirectionalBlast extends CDScorch; simulated function DirectionalAttach(vector Dir, vector Norm) { SetRotation(rotator(Norm)); if( !AttachDecal(100, Dir) ) // trace 100 units ahead in direction of current rotation { //Log("Couldn't set decal to surface"); Destroy(); } } q, --a +- $- ' q&qqj0F  - .?, '&6',N?, ,U&0 :$%? :$'?' :$$ :$# 0;@ q;//CDNuclearMark class CDNuclearMark extends CDScorch; qU ?[  -  AY  -'p?, !&x!,?, *,*&  ?*   ?! qbB"I&A{6=,6=,6=,V-6=:=:6,(,6=:=:6,(,6=:=:6,(,?6?6?6?6?6&?, A& q- oS"-%-2,-- B#? q:>#a+P9! B:a q@qqWI r* 1 ppDecals stay SDX normal length q58w!85 8 qz//CDWallCrack class CDWallCrack extends CDScorch; simulated function BeginPlay() { if ( FRand() < 0.5 ) Texture = texture'Botpack.WallCrack1'; else Texture = texture'Botpack.WallCrack2'; if ( !AttachDecal(100) ) destroy(); } qEF8 EF?D?=?,@ ql8//DecalLengthSlider class DecalLengthSlider extends UWindowHSliderControl; var localized string DecalMultiplierText; var localized string DecalMultiplierHelp; var UMenuLabelControl Caption; var bool bDisabled; var int DisabledColorMultiplier; function Notify(byte E) { switch(E) { case DE_Change: SetupText(); } Super.Notify( E ); } function SetupText() { if (Caption==None) return; Caption.SetText("Decals stay "$int(GetValue())$"X normal length"); } function Paint(Canvas C, float X, float Y) { local Texture T; local Region R; T = GetLookAndFeelTexture(); if(Text != "") { C.DrawColor = TextColor; ClipText(C, TextX, TextY, Text); C.DrawColor.R = 255; C.DrawColor.G = 255; C.DrawColor.B = 255; } R = LookAndFeel.HLine; if (bDisabled) { C.DrawColor.R = (C.DrawColor.R - 128) * DisabledColorMultiplier - 128; C.DrawColor.G = (C.DrawColor.G - 128) * DisabledColorMultiplier - 128; C.DrawColor.B = (C.DrawColor.B - 128) * DisabledColorMultiplier - 128; } DrawStretchedTextureSegment( C, SliderDrawX, SliderDrawY, SliderWidth, R.H, R.X, R.Y, R.W, R.H, T); DrawUpBevel(C, TrackStart, SliderDrawY-4, TrackWidth, 10, T); } function BeforePaint(Canvas C, float X, float Y) { local float W, H; Super.BeforePaint(C, X, Y); TextSize(C, Text, W, H); WinHeight = H+1; switch(Align) { case TA_Left: SliderDrawX = WinWidth - SliderWidth; TextX = 0; break; case TA_Right: SliderDrawX = 0; TextX = WinWidth - W; break; case TA_Center: SliderDrawX = (WinWidth - SliderWidth) / 2; TextX = (WinWidth - W) / 2; break; } SliderDrawY = (WinHeight - 2) / 2; TextY = (WinHeight - H) / 2; TrackStart = SliderDrawX + (SliderWidth - TrackWidth) * (loge(Value - MinValue)/loge(MaxValue - MinValue)); } function LMouseDown(float X, float Y) { local int StepUp, StepDown; if (bDisabled) return; Super.LMouseDown(X, Y); if((X >= TrackStart) && (X <= TrackStart + TrackWidth)) { bSliding = True; Root.CaptureMouse(); } if (Value < 10) StepUp = 1; else StepUp = 5; if (Value > 10) StepDown = 5; else StepDown = 1; if(X < TrackStart && X > SliderDrawX) { SetValue(Value - StepDown); } if(X > TrackStart + TrackWidth && X < SliderDrawX + SliderWidth) { SetValue(Value + StepUp); } } function MouseMove(float X, float Y) { if (bDisabled) return; Super.MouseMove(X, Y); if(bSliding && bMouseDown) { SetValue( 2.71828**( (X-SliderDrawX)/(SliderWidth-TrackWidth) * loge(MaxValue - MinValue) ) + MinValue, bNoSlidingNotify); } else bSliding = False; } function KeyDown(int Key, float X, float Y) { local PlayerPawn P; local int StepUp, StepDown; if (bDisabled) return; P = GetPlayerOwner(); if (Value < 10) StepUp = 1; else StepUp = 5; if (Value > 10) StepDown = 5; else StepDown = 1; switch (Key) { case P.EInputKey.IK_Left: SetValue(Value - StepDown); break; case P.EInputKey.IK_Right: SetValue(Value + StepUp); break; case P.EInputKey.IK_Home: SetValue(MinValue); break; case P.EInputKey.IK_End: SetValue(MaxValue); break; default: Super.KeyDown(Key, X, Y); break; } } function LMouseUp(float X, float Y) { if (bDisabled) return; Super.LMouseUp(X, Y); if(bNoSlidingNotify) Notify(DE_Change); } function float CheckValue(float Test) { local float newValue; newValue = Super.CheckValue(Test); newValue = int(newValue+0.5); if (newValue < 2) newValue = 2; return newValue; } qqqC//CDBigEnergyImpact class CDBigEnergyImpact extends CDScorch; qPX\CC?,?, q]6 newScorchClass; local CDScorch newDecal; bNewExtendedDecals = class'DecalConfigClientWindow'.Default.bExtendedDecals; if (bNewExtendedDecals != bExtendedDecals) { bExtendedDecals=bNewExtendedDecals; if (!bExtendedDecals) { bPermanentDecals = false; TimeMultiplier = 1; RestartDecals(); } else { bPermanentDecals = class'DecalConfigClientWindow'.Default.bPermanentDecals; TimeMultiplier = class'DecalConfigClientWindow'.Default.TimeMultiplier; RestartDecals(); } } if (!bExtendedDecals) return; bNewPermanentDecals = class'DecalConfigClientWindow'.Default.bPermanentDecals; NewTimeMultiplier = class'DecalConfigClientWindow'.Default.TimeMultiplier; if (bNewPermanentDecals != bPermanentDecals) { bPermanentDecals=bNewPermanentDecals; RestartDecals(); } else if (NewTimeMultiplier != TimeMultiplier) { TimeMultiplier=newTimeMultiplier; restartDecals(); } foreach MenuItem.Owner.getLevel().allactors(class'Scorch',scorch) { switch (scorch.class) { case class'BigEnergyImpact': newScorchClass = class'CDBigEnergyImpact'; break; case class'Biomark': newScorchClass = class'CDBiomark'; break; case class'BlastMark': newScorchClass = class'CDBlastMark'; break; case class'BloodSplat': newScorchClass = class'CDBloodSplat'; break; case class'BoltScorch': newScorchClass = class'CDBoltScorch'; break; case class'DirectionalBlast': newScorchClass = class'CDDirectionalBlast'; break; case class'EnergyImpact': newScorchClass = class'CDEnergyImpact'; break; case class'ImpactHole': newScorchClass = class'CDImpactHole'; break; case class'NuclearMark': newScorchClass = class'CDNuclearMark'; break; case class'Pock': newScorchClass = class'CDPock'; break; case class'RipperMark': newScorchClass = class'CDRipperMark'; break; case class'UTBloodPool': newScorchClass = class'CDUTBloodPool'; break; case class'UTBloodPool2': newScorchClass = class'CDUTBloodPool2'; break; case class'WallCrack': newScorchClass = class'CDWallCrack'; break; } if (newScorchClass != None) { newDecal = MenuItem.Owner.getLevel().Spawn(newScorchClass,scorch.owner,,scorch.Location, scorch.Rotation); scorch.destroy(); if (newDecal != None) { if (bPermanentDecals) { newDecal.disable('timer'); newDecal.RemoteRole = ROLE_None; } else { restartDecal(newDecal); } } } } } function RestartDecals() { local CDScorch newDecal; foreach MenuItem.Owner.getLevel().allactors(class'CDScorch',newDecal) { if (bPermanentDecals) { newDecal.disable('timer'); } else { newDecal.enable('timer'); if (newDecal.TimerRate > 0) { newDecal.TimerRate *= NewTimeMultiplier/TimeMultiplier; } else { newDecal.TimerRate = 0.0001; newDecal.bTimerLoop = false; } newDecal.TimeMultiplier = TimeMultiplier; } } } function RestartDecal(CDScorch newDecal) { if (bPermanentDecals) { newDecal.disable('timer'); } else { newDecal.enable('timer'); if (newDecal.bStartedLife) { newDecal.TimerRate *= NewTimeMultiplier/TimeMultiplier; } else { newDecal.TimerRate = 0.0001; newDecal.bTimerLoop = false; } newDecal.TimeMultiplier = TimeMultiplier; } } qs//DecalTicker class DecalTicker extends Actor; var CDDecals DecalHandler; function Tick (float deltaTime) { super.Tick(deltaTime); DecalHandler.Tick(deltaTime); } qW//CDUTBloodPool class CDUTBloodPool extends CDScorch; var texture Splats[5]; simulated function BeginPlay() { if ( class'GameInfo'.Default.bLowGore ) { destroy(); return; } if ( Level.bDropDetail ) Texture = splats[2 + Rand(3)]; else Texture = splats[Rand(5)];; if ( !AttachDecal(100) ) destroy(); } qXclass CDUTBloodPool2 expands CDUTBloodPool; simulated function Timer() { // Check for nearby players, if none then destroy self if ( !bAttached ) { Destroy(); return; } if ( !bStartedLife ) { RemoteRole = ROLE_None; bStartedLife = true; } } q  .  A AHC?  Enable Extended Decals: % --  .  AAHC? Make Decals Permanent:%--1- -'.  AHBHC?, ?- --'.  ABHC?,$&. BB@BA Update3. CB@BA3 Cancel qu)?4 ~)22 G$) + 3 DG y$) vb,y  qH//CDBiomark class CDBiomark extends CDScorch; simulated function BeginPlay() { if ( !Level.bDropDetail && (FRand() < 0.5) ) Texture = texture'Botpack.biosplat2'; Super.BeginPlay(); } q, g-a b- $- 'P-a@@(`a@( a qvZ -  ---D- -'-'' Decals stay their normal length-(--' Decals stay forever-( qJ y9 -- 33>a ^-,Jn, J Ba qW //CDScorch class CDScorch extends Decal; var bool bAttached, bStartedLife, bImportant; var float TimeMultiplier; 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.2)) ) Destroy(); else { SetTimer(1.0, true); return; } } else if ( Level.TimeSeconds - LastRenderedTime < 1 ) { SetTimer(5.0, true); return; } Destroy(); } qL//CDImpactHole class CDImpactHole extends CDScorch; simulated function BeginPlay() { if ( !AttachDecal(100) ) destroy(); } qa@qq1;wKr1*1a 15- -   q~2WK. RBBHCHC' qA"]+-L - -L---LW--(&r- - r- -M -K -M---MrKKr/ a0 (  W  Dx m  =x   Px   ?x   >x   Lx   "x   Ix   Cx   Ex 3  Kx I  %x _  Mx u  Hx 'w*3a       a'w*-v! $'10 q qqeclass CDBoltScorch expands CDEnergyImpact; 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(); } q?//CDEnergyImpact class CDEnergyImpact extends CDScorch; q~//CDBloodSplat class CDBloodSplat extends CDScorch; var texture Splats[10]; simulated function BeginPlay() { if ( class'GameInfo'.Default.bLowGore || (Level.bDropDetail && (FRand() < 0.35)) ) { destroy(); return; } if ( Level.bDropDetail ) Texture = splats[Rand(5)]; else Texture = splats[Rand(10)]; if ( !AttachDecal(100) ) destroy(); } q[l@^KOA"B_A%faHgGNfVNseN]IsNeBOgQO^`OcoO^R}OhLPeV[P[piPmxPGQUQ.dQIsQ=BRkPRm_R.cnR.d|RdJSyXS[agSq(auS]`VUDbdUUOFWUNTW)TbW^PvY[`EZ^SZvKaZ]apZq y~ZEw^'z E_WLh[PNi.j\ivLkiEzi%Ij [XjjIgjUKvjc^Fk`wTk`]dk[ItkICl#qRl"-tCn.~wo[Mur]MCsQs!b_s$hAuiveHhxMwx7lEy+iqz?Z| \i|cE~%*qhUIYUMh&\vjMR/N`= AnKO4DoE^s^IQ3`LO4PS,M ;c^M^FIlCO4Fu?F{B@AE UAL>4V]JXX .pHO4F^8LdO4x8peThDO4OvRYE<r^O4}4PPO4DM\Q]`% enI ,S.O4jA O4i%O4chMO4dKrora=O4TS,> igbP? @rO4c rIO4XU\m.;g|.2Sc.wv^m>O4q{"O4Jl?O4JvC<@RO4b|H G^.AeEO4Gfmm.n|.tK.oY.rnh[Public] Object=(Name=DecalStay.CDDecals,Class=Class,MetaClass=UMenu.UMenuModMenuItem) DecalStay Readme

DecalStay

Information

Title:DecalStay
Date Created:November 25, 1999
Author:Mike Lambert (Mongo)
Homepage:Pipeline Productions
Description:Configure how long your dcals remain!.

Overview

DecalStay makes all decals last anywhere from 2 times there normal length to ninety-nine times their normal length to forever. This allows for deathmatch games that STILL look like battles have actually taken place, thirty minutes after they've occured. It also allows for some incredible pulse-cannon alt-fire graffiti, since those decals now stay much longer. 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 DecalStay on any server you choose to. It's all done on the client, with no intervention of the server.

Playing

Go to the Mod Menu in the UT MenuBar. Select "Configure Decals." On that screen, you may turn on the special decals, or go back to regular decals. If you decide to configure your decals, you have the option of making them all permanent (which can get pretty slow towards the end of a 30-minute game unless you have a massive computer), or select some multiplier setting that makes decals last X times longer than they normally would.

This window also allows you to set the characteristics of decals that already exist in the level. If you've chosen "Permanent Decals", and are now noticing a slowdown in your system, you can select a multiplier, or just turn decals off altogether, and the game will slowly get better as more decals "expire." Have fun experimenting!

Copyright

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.inijSystem\Manifest.intjSystem\DecalStay.uH(}System\DecalStay.intpYHelp\DecalStay.htmɁ 㟋DAt