[Setup] Product=Bloodtrails Version=200 Archive=Bloodtrails.umod SrcPath=. MasterPath=.. Group=SetupGroup Group=BloodtrailsGroup [SetupGroup] Copy=(Src=System\Manifest.ini,Master=System\Manifest.ini,Size=321,Flags=3) Copy=(Src=System\Manifest.int,Master=System\Manifest.int,Size=291,Flags=3) [BloodtrailsGroup] File=(Src=System\Bloodtrails.u,Size=148518) File=(Src=System\Bloodtrails.int,Size=154) File=(Src=Help\bloodtrails.html,Size=7967) [Setup] LocalProduct=Bloodtrails ReadMe=Help\bloodtrails.html SetupWindowTitle=Bloodtrails AutoplayWindowTitle=Bloodtrails Options ProductURL=http://www.planetunreal.com/mutation VersionURL=http://www.planetunreal.com/mutation Developer=JbP DeveloperURL=mailto:jbp@planetunreal.com *Dh@2A0?jDEST2hNoneColor InternalTimeSplatsMipZeroLODSetUClampUBitsUSizeVSizebMasked MaxColorPaletteVClampVBits BloodtrailsEngineSystemCoreBotpackPostBeginPlayMutatorTakeDamage MakeSplatTimer RemoteRoleRotatorTexture bHighDetailBloodGeneratorBT_RightSplat ScoreKill DrawScale DrawType BT_Splat bImportantRegisterDamageMutatorMultiDecalLevelAttachToSurface AttachDecal interval ModifyPlayer splatRotVectorClass FunctionRoleObject TextBuffer LevelInfoStructPropertyPackageStructi ScriptText LocationPawnMutator DamageTypeOther GameInfoDecal Momentum HitLocationGameOwner NamePropertyActorNetMode Palette3 Palette1NextDamageMutatorVictimLastRenderedTime Rotation instigatedByObjectProperty Palette9OldLoc Palette11 Palette7 Palette5SplatFloatProperty BoolPropertyLevel bAttachedScorch bStartedLife IntProperty actualDamageKiller TimeSecondsLeft1Left2Left3Right1Right2Right3 bInitialisedJobsCountsRemaining bStationary bDropDetail ByteProperty)(!rr^vmRRRR +!"S$"S$33>  "1 ::$ d rr^rr^rr^rr^rr^rr^R '$33>):@    ," "" "*vv *"/@H@X@@@@\@ ]@(^@G^Z^j^&ܮprr^$ *' JGL 1pddddd1pRk@~~~~~~yy||}}~~~kkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~}~~~~}~~~[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrsststttuuuvvwwxxxyyyzyzz{{|||}}|}}}~~~~~~WWXXYYZZ[[\\]]^^__``aabbccddeeffgghhihiijjkkkllllmmmnnooppqqrrrsssstttuuuvvvwwwxxxyxyyzzz{{y{{||}}XXYYZZ[[\\]]^^__``aabbccddeefeffgghhiijjkkllmmnnooppqqrrssttutuuuvvvwwwzxxywyyzzz{{z{{||VVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghfhhiiijjjkkllmmnnooppqqrrsrssttutuuvvwwxx^^__aabbeefgggiijjmmooppqqrrttxxaaffoo % Y$"&B9 a @oq##{{{s))|||||t//v77v7$###########################################################################################kzzuvq:;###########################################################################################=]M|zzxxxtssؾh::###########################################################################################:QOPOM}|xxwwusrssqnpԸf==##########################################################################################:]SRQRQNMxvuuqnpq===##########################################################################################=fVTRSSSSQPONwxxsurnqq=:###########################################################################################=cWU(()SRQPNNM}}zxuussqqpq8==##########################################################################################=8aW-+,+*SSQOOMM}zzwvvtsrq8##########################################################################################:h]/Y---+TSRRQPQ}xzvttuq8#########################################################################################=810/.--+*SSQRQQ||zwvuvsr=###########################################################################################=8610//.-,+*))QQ|z|xvts=############################################################################################:844110/..--+*TTRO}}xtvv=##############################################################################################:644100/[[--VVURPz||xwut=:=#############################################################################################:864410]//YVWVUSS|}}k##############################################################################################88664a11//WV:###############################################################################################=:88664640]]Y[W=#################################################################################################86644a]]]YUTTk==###################################################################################################:::8666641[YXVTTfk#####################################################################################################=:::::8613]/[Wfhh#####################################################################################################===:88864a]\YchhD#####################################################################################################::::884ca^_afhh########################################################################################################=:865ccaaaƙhh########################################################################################################::86cc44cfhh########################################################################################################::886cbbffhjlD########################################################################################################9886ccffffik!"#########################################################################################################87fcfhkk#######################################################################################################8644a`afh:k:###################################################################################################866441]ah:k#################################################################################################66421\\]hk:#################################################################################################88641[[[Zh:=################################################################################################:8866411[YWVÜ:################################################################################################::88886644100YV=################################################################################################:8888886664410/WVf=##############################################################################################:86666888888886641110/-WUSf=A##############################################################################################=:6444466666666444100/.WUS=?##############################################################################################=8411414166444111100/WVVTR=##############################################################################################===840001114141441100/.VUUTP=%#############################################################################################==:4]Y...///00100//0..-VTS=D#############################################################################################=:8]WV+,----./Y./.---VUURQP}==#############################################################################################=:faWU*UUV-WYW.YYWWVUUUUQNM|==############################################################################################==:f]VUTTTTTUUUUVUUVURRRRPKz}=A%###########################################################################################==:VQQPQPPPRRSSRRRSQQMLOO}xv==############################################################################################==:VPNNMMMNOQQQPPRPPPOMKIzxw==###########################################################################################==:fLNLLLNPPOOPQQQQNLxv|z|=ED###########################################################################################=::xzKJIJJLLKLMLLLNzxvuh;?#############################################################################################::cwvvvGwxIHJz|GHzxxtr׷:=##############################################################################################:hĹگxwuvxxv||||}zxvwuj=###############################################################################################:8ٮwxuuz|wv|}wsuvx:>################################################################################################=8aˣstutwssvtsrrrھg=;#################################################################################################=cΥsussursqpprs׸::>#################################################################################################=:f֮stwtpq<#"#################################################################################################==8aҨqk=D##################################################################################################::6ˣݾf==####################################################################################################=:fխЩݹh=#&#######################################################################################################=:95h===A"######################################################################################################=:::6a߸6:=:########################################################################################################=:::88db]ef:===###########################################################################################################::========AB>################################################################################################################CC:=":=:#C& ####################################################################################################################A#A=###########################################################################################################################?########################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################j@@################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################=ih=###########################################################:60/a8########################################################:4/--,.6######################################################=c[.-,,+.6#####################################################8[WV-+**)U4###################################################=cVU-,*)QQTa:#################################################8SSSSRQOL:#################################################fRRQPNMK|=BB############################################Bf}|wv׾m=B##############################################|}L|zwtsܚ:##############################################Bc|x{}|wutr:##############################################=zxwtsqkA#############################################=}zpט:##############################################]}μ=##############################################f|zu:#############################################cQ}|ztroh=#############################################hURSRPN}vtrpך=#############################################:]-,+SPO|wusך#############################################B60.-*SRzxur؝##############################################:610/Y,UR|vuڝ=###############################################861]/WVh################################################:864a[Yh=##################################################:8861ZVh=##################################################=:86a]f<####################################################:8ccah####################################################86ccgl"####################################################86ah:#################################################862]h:################################################864]Y:################################################:8886410W>###############################################8446666410/VS>###############################################=601144410/VUA##############################################B:]W-..//..VTQA##############################################=hYTTUVVWVTSRM|=##############################################=fPONPRQQQOM}w=##############################################=hKKKNMNNNzw>##############################################hxvwxz|zxvh################################################:Цuuwuxtt;################################################BcҨstqԸ:#################################################:΢fA##################################################:aۼh#####################################################::6:=######################################################<<===D###########################################################B############################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################@@z@########################################################################################################################################################################################6c############################c.,.##########################:WV+)U:#########################]RQO}:B#######################}zu=######################Bzws=#######################c#######################|#######################aTRNws#######################:0-Uw########################61Y#########################:8aA##########################8ch"#########################8ah########################:84[h########################44440Vc#######################:WVWWUQ#######################kMOOO|#######################:vxw=########################֥c#########################=a۷f###########################"AB##################################################################################################################################################################### @############################################:##############6,.#############|B###########:###########a###########8/c#############8j############8:###########6[Y8###########|}:###########:Y#################################################@#############1######[#####6######:c#####8V######V:#############8##Y###8 #1#8:2 4%r, hw*r D? (?w*$    " "" "*~~ *"$@T@2040001-000000000+,,00000000000+000000aa_a,00+00+^[\)+++0)]a+++]Z)0+0)\WSQ]c+00)ZUQNLJGGGxw+0)]WSQNNJGHGywwa+0^YVSPONKJKHvxxy0+0^XUPOMKJJHGEwusttٱa0+ZSOOKIIHFCBBtrpp+0^XRPOMMKJHID@Bwvtrc 0^XTPNMMKJHGEE>turooc )XQMLJIIIGECDBtqp:ji^ 0^PLKHIIIHEDBsro>onnmllܻ++0004000|{xwwBA;mlknlmorqtstvwy|}}c0ronpnlokklmnlstuvvEEEEF|] 1/ropqnloplnnuw{}H|ECGIa,)wsqtsqorsrn{}|}HGJLc++ܣpqponmonpoowxyy||KJIJPZ+00գ=onmmmlknmuxx|IIIHJL]++00@??nnmnmnpprwxvywyyILMKMQ(0c0r>=p 0 ) { if ( Level.NetMode != NM_DedicatedServer && !bStationary ) MakeSplat(); bStationary = ( OldLoc == Owner.Location ); CountsRemaining--; OldLoc = Owner.Location; } } simulated function MakeSplat() { local BT_Splat Splat; if ( ( CountsRemaining % 2) == 0 ) Splat = Spawn( class'BT_Splat', Owner, , Owner.Location, splatRot ); else Splat = Spawn( class'BT_RightSplat', Owner, , Owner.Location, splatRot ); if ( Splat != None ) { if ( CountsRemaining < 10 ) Splat.Texture=Splat.Splats[2]; else if ( CountsRemaining < 20 ) Splat.Texture=Splat.Splats[1]; else Splat.Texture=Splat.Splats[0]; } } Ar v%d, Zw*r%   " "" "*vv *"/ r@̯@ܿ@@@@@ @L@k~@{{{{{{{{}~''~..66==FFMMUU\\eeelllslttt{{t{{{{''//66=6>>FFNNNUUNUU]]]eeelemmtmtt_class BT_RightSplat expands BT_Splat; #exec TEXTURE IMPORT NAME=Right1 FILE=TEXTURES\BloodyFoot2.PCX LODSET=2 FLAGS=2 #exec TEXTURE IMPORT NAME=Right2 FILE=TEXTURES\BloodyFoot4.PCX LODSET=2 FLAGS=2 #exec TEXTURE IMPORT NAME=Right3 FILE=TEXTURES\BloodyFoot6.PCX LODSET=2 FLAGS=2 # (M  %[, Qw*r  %, r*a  b -a f-$-'R-a@?,(daA?, ( - ,33>- L>aa?' ?&a@' a aclass BT_Splat expands Scorch; var Texture Splats[3]; #exec TEXTURE IMPORT NAME=Left1 FILE=TEXTURES\BloodyFoot1.PCX LODSET=2 FLAGS=2 #exec TEXTURE IMPORT NAME=Left2 FILE=TEXTURES\BloodyFoot3.PCX LODSET=2 FLAGS=2 #exec TEXTURE IMPORT NAME=Left3 FILE=TEXTURES\BloodyFoot5.PCX LODSET=2 FLAGS=2 simulated function AttachToSurface() { if( !AttachDecal(100, vector(Owner.Rotation) ) ) Destroy(); } simulated function Timer() { if ( !bAttached ) { Destroy(); return; } if ( !bStartedLife ) { RemoteRole = ROLE_None; bStartedLife = true; if ( Level.bDropDetail ) SetTimer(5.0 + 2 * FRand(), false); else SetTimer(18.0 + 10 * 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(); } d.//------------------------------------------------------------------------ // Bloodtrails. // // Notes regarding network replication issues: // - there are three main classes to bloodtrails: // 1) the mutator (this class) // 2) the bloodgenerator (expanding actor) // 3) the custom decal, BT_Splat (expanding Scorch) // // The mutator is server-side, and the decals are client-side. // Therefore, in order to get the decals to show up on clients, // it's necessary to use an intermediary class which is both // server and client side. That's the function of the blood- // generator class. It is sent updates by the (server-side) // mutator; these changes to CountsRemaining are replicated to // the client. The client's version of the generator (a simulated // proxy) then spawns the decals on the client. // // If you are having difficulty with network replication (as I // did with this mutator), pay attention to the RemoteRole of the // three classes, and the heavy (but careful) use of the 'simulated' // function specifier. There may be other ways to do this; this // way was the only one that was apparent to me. //------------------------------------------------------------------------ class Bloodtrails expands Mutator; var bool bInitialised; var BloodGenerator Jobs[32]; // This is an example of registering a mutator that makes use of the // MutatorTakeDamage() event. If a mutator which uses this function is // not correctly registered, it will never be sent the event. // PBP() is called twice on mutators. If you accidentally register // a damage mutator twice, be prepared for infinite recursion errors // at runtime... simulated function PostBeginPlay() { if (bInitialised) return; Level.Game.RegisterDamageMutator( Self ); bInitialised = True; } function MutatorTakeDamage( out int ActualDamage, Pawn Victim, Pawn InstigatedBy, out Vector HitLocation, out Vector Momentum, name DamageType) { local int i; for ( i = 0; i < 32; i++ ) if ( Jobs[i] != None && Jobs[i].Owner == Victim ) Jobs[i].CountsRemaining += ActualDamage * 0.66; if ( NextDamageMutator != None ) NextDamageMutator.MutatorTakeDamage( ActualDamage, Victim, InstigatedBy, HitLocation, Momentum, DamageType ); } // end any bleeding on the carcass. function ScoreKill( pawn Killer, pawn Other ) { local int i; for ( i = 0; i < 32; i++ ) if ( Jobs[i] != None && Jobs[i].Owner == Other ) Jobs[i].CountsRemaining = 0; Super.ScoreKill( Killer, Other ); } // spawn a bloodgenerator for a *new* player (not for respawning players). function ModifyPlayer( pawn Other ) { local int i; Super.ModifyPlayer( Other ); for ( i = 0; i < 32; i++ ) if ( Jobs[i] != None && Jobs[i].Owner == Other ) return; for ( i = 0; i < 32; i++ ) { if ( Jobs[i] == None ) { Jobs[i] = spawn( class'BloodGenerator', Other ); break; } } }  %" "" "*yy *"٪\@X@߀h,@@@@x0@ 1@1@1 22@jk m''n--p55pr""{{{s((|||||u//v66v;6x==xB=yBByBGyGB{II{IOppup}PP}PUvvv{{v~VV~V[~[V||||]]]bcccikkpkqqvqxx@z**{11{{{|99|||||}@@~HH~OOVV!^^##fffmmfmmmssm++22ttt{{t99?9||||AAIIIPPIPPPWWWW]^^gggmnnuu@}}~~~~~~~}}~~~}ppqqrrssttuuvvwwxxyyzzz{{z{{{|||}|}}~}~~~~~~eeffgghhiijjkkllmmnnooppqqrrssttuuvvvwwwwxxxxyyyyzy{zyzz{z{{{||{|||}}}}~~}~~}]]^^__``aabbccddeeffggghhhihiijjkjkkllmmnnooppqqqrrrssttuuuvvuvvvwwwwxxxxzyyyzzyzz{z{{{|||}{}|}}[[\\]]^^__``aabbccddeeffggghhhihiijjkkllmmnnooppqqrrssttuuvuvvvwwwwxxxyyy{zyzz{z{{||]]^^__``aabbccddeeefffgegghhiijjkkllmmnnnooopoppqqrrrssrssttuuuvvvvwwwxxyyz{dddeffggiiikkklmmmmoooppqqqruuwwrr a' /T~r*a |%E::$ --   0.<??,?%a    ca    w*, ,  ,&  %   '. - #-' 22+B+0K@+8+,+K+.2+V++ KT+X+7+1+/+<++16K3*+SSWR[,(SfRHKF,,1I+RgC,,X$g3g-,%+A+;K?SU,S"'4 a!cmc P1Q ]dj[x#4 S 4 _': k x) E Y R G ^ #: k e x M D!b Q!\W]! > t J AaN 9 o' { = G#Z T]aPC~%4AOCu`WxaWOCf^Wi54_@ b_ _WA DCX54j[(DEiI54lr54o.^]WMECdLCgNCj!mmNq{8l[Public] Object=(Name=BloodTrails.BloodTrails,Class=Class,MetaClass=Engine.Mutator,Description="BloodTrails, Injured players leave a trail of blood..") Bloodtrails

Bloodtrails
Released: 12/12/1999

Textures: CyberA
Code: JbP

Note: Bloodtrails requires UT version 402 minimum.

Details:

Bloodtrails is a mutator for the full version of Unreal Tournament. When active in a game, players who are wounded will 'bleed' for a time, leaving a trail of bloody footprints behind them.

The trails of blood can be used by predatory players to track their prey, and monitor how much damage their prey has taken. It introduces the tactic of 'marking players'; rather than trying to cause as much damage as possible at risk to yourself, you can inflict just enough damage to cause that player to leave footprints, and you can follow the trail at a safe distance.

The mutator was primarily developed with one-on-one play in mind, and it is not recommended for large-scale bunfights. The point is kinda lost with more than four players, anyway.

Interesting Bloodtrails facts

  • When a player is wounded, they leave footprint decals behind them at a rate of three per second, unless they remain stationary.
  • For every three points of damage that a player takes, two footprints will eventually be left.
  • You can gauge how much damage you have done to a player. If their footprints are very dark, you've done more than thirty points of damage. If their footprints are sorta dark, you've done more than fifteen points of damage. If they are faint, less than fifteen.
  • Wounded player's footprints gradually get lighter; you can assume that if they have left a lot of dark footprints, you've wounded them a lot.
  • Footprints last for 25 seconds, on average.

It should be clear from the above that in the course of a normal game, a *lot* of decals are spawned. You should be aware that decals incur a fairly significant rendering overhead; this is why more than three or four players in a Bloodtrails game is not really recommended. If your frame-rate starts to get a bit choppy, drop the number of players. Or, alternatively, use the Redeemer more often :) Incidentally, there is no point playing a Instagib/Bloodtrails combo, duh.

Other misc:

  • Play on levels that aren't too dark. Otherwise, a whole heap of decals are causing a rendering overhead whilst being basically invisible.
  • Try combining Bloodtrails with the Stealth mutator (included with UT retail) for a freaky DM experience.

Bloodtrails Network notes

Bloodtrails has been developed for online play, as well as botmatch. The machine on which the network play was tested can only be described as 'hopelessly inadequate', so if you encounter problems with Bloodtrails online, please email jbp@planetunreal.com. There are two things worth noting about Bloodtrails if you are using it online:

Bloodtrails uses custom textures, and therefore the entire package *must* be downloaded by anyone who connects to your server (unless it is already on their system). If they don't download it, they will not be able to play on the server. Fortunately, the Bloodtrails package has been configured for automatic downloading. All that needs to be done is to add the following line to your UnrealTournament.ini, in the [Engine.GameEngine] section:

ServerPackages=Bloodtrails

Bloodtrails will not create decals on dedicated servers, so the CPU overhead of Bloodtrails is negligible. It is not possible for a player to use Bloodtrails online unless the server requires that they do; Bloodtrails can't be used as a cheat.

Finally, if you are an UnrealScript coder and you are having difficulties with network replication, I have included some comments in the source code which attempt to explain what I have done to acheive network replication in Bloodtrails. The network replication took a few days of work, largely because of the server-sidedness of mutators and the client-sidedness of decals; you might find the technique useful.

Legal:

The textures included with Bloodtrails are Copyright Ben Golus 1999. They should not be used by a third-party without his express permission. As usual with my mutators, you are free to distribute this mod as long as you make clear that the respective authors of the work were JbP and CyberA, and you do not make any money out of the distribution of the modification. Copyright 1999 Joseph Pearson.

Links:

http://www.cyberartist.org

http://www.planetunreal.com/mutation

 

 

System\Manifest.iniSystem\Manifest.int#System\Bloodtrails.u&DSystem\Bloodtrails.intGHelp\bloodtrails.htmlGfg