Įƒ*žE@B%Ÿ uŹŌhosA«q?Ł ±õBNoneMODOSUtilsV30CoreEngineSystemTexture PureFlagTimerBotpack LeadingZeroDrawNameAndPing AutoRecorderClientMessage ShowScoresAutoRecMutatorPostBeginPlayGetMediumFontGameIsPlaying PreBeginPlay GetDemoName PlayerPawnSpawnNotificationDeathMatchPlusConsoleCommandReset ChangeTeam PostRender Spectator GetBigFont DrawSplashRestartPlayer ActorClassGetSmallestFont CreateFlagCheckMutatorsSplashHUDMutatorCriticalEventMutateMODOSDMScoreBoardMODOSCTFScoreBoardMODOSASSScoreBoardPawnMODOSDOMScoreBoardMODOSLMSScoreBoard MODOSPRIMODOSSBCTFHudMODOSSBServerActorHUD SendHome TeamGamePlusUserMODOSTDMScoreBoard SplashLogoSATickSpawned SplashNotifyTeamBalanceActorPostNetBeginPlayTeamBalanceMutator ReplaceTexthomezp_SuperShockRiflebAutoActivateShowClickBoardDrop LogoDrawTime DRAW_BLANK LightType DRAW_FADE_IN DRAW_DISPLAYbHiddenDRAW_FADE_OUTbCollideWorld DRAW_DONEDemoNameFormatMODOSDemoEnhacerbAlwaysRelevantA DrawColorTeamStyleXiDemoRecSpectator ScoreBoard Location ScriptText DrawIconSetPos SmallFont ServerName WhiteColorSPingBMapNameDelta ScoringTypeMsgP PlaybackGRI MutateStringR bReadyToPlay GameClass bTeamGame PRIArray PlayerNameScorefirstHasFlag PacketLoss bIsSpectatorbWaitingPlayerPRIGamebDemoRecordingHUDTypeScoringmyHUD Filename nextPawn PasswordOwnerYearMonthDayHourMinuteSecondNetMode PawnList bGameEndedposScoreBoardType BaseMutator NextMutatorPlaybackActorTextYLGbCenternewVelFormat HUDMutatorCurrentNetSpeed PlayerIDSender PawnOwner Accuracy ReturnValueClipX DieCount KillCountDynamicLoadObjectWithReplaceNextHUDMutatorIconsDoneTeams TeamInfoSizeXOffset PlayerCount PlayerCountsYOffsetGetPropertyTextMutatorWeapon LevelInfo GameInfo Decoration ChallengeHUDPlayerReplicationInfoTeamScoreBoardCTFFlagUnrealCTFScoreboardInfo LossString TimeString FPHString CountDown bTournament InstaGibDMChallengeCTFHUD PingStringAssaultScoreboardTournamentScoreBoard GreenFlag FontInfoDominationScoreboardLMSScoreboardbRequireReady ScoreStartMyFonts CanvasFontXL2YL2XL3YL3 bCompressedDMPReplicationInfoGameReplicationInfo SpawnNotifyCanvasFontLevelActorBitmapPlayerCountVSizeCmdRoleClassPackageInput TextBufferObjectEnumShowBonusInfo FunctionZP7D FakeFlagSBClassMPRIshotsStateColorMuttaktak2mIGMpom LogoTextureVectorCaptionLineOneCaptionLineTwoCaptionLineThreeCaptionLineFour PlayerHUDtmpHUDshots2shots3smierciZPPP DemosDirStruct bDrawSplash EDrawState UnrealShare StrPropertyStructPropertyClassPropertyObjectProperty DrawState DrawTime DrawTick SplashLogoFloatProperty PreviousFontPreviousCenterPreviousColorPreviousStyle TeamPingTeamPacketLossMSAShowPacketLoss ShowNetSpeed Balancer BoolPropertyARM IntPropertyOutMsg ByteProperty HUDClassDRSXLųZi, • š:ó:$’’’’’’’’’’ KzmųYQ²Z…œŌXŽžtČ…œŌXˆ> £Y…œŌX…œŌXŽžtČ…œŌXˆ> £Y…œŌXˆ> £YūR@G¢…œŌXŽžtČ…œŌXŽžtČ…œŌXŽžtČˆ> £Yˆ> £Yˆ> £YõX©'ˆ> £YõX©'ˆ> £Yˆ> £Y…œŌXŽžtČ…œŌXŽžtȏr€‚@_€‚R€‚E€‚U€‚Y€‚Q€‚J@*€‚3€‚/€‚-€‚IVc^J h FŽ@Ž! S^@r€…DžåG›_G#’’’’’’’’’’’’’’’’’’9!—‡Ń›=$:e‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x“ėŠZ!‚x‚x“ėŠZ!‚x‚x“ėŠZ!‚x‚x“ėŠZ!‚x‚x“ėŠZ!‚x‚x‚x‚xˆ> £Y›=$:eH›“žå²wQ+'b†nˆT†0]†W&Ē|v7Ą š:ó:$’’’’’’’’’’2—Q}+ĒŒ”mó…œŌX”5Iœ“”5Iœ“›=$:e!—‡Ń…œŌX!—‡Ń!—‡Ń!—‡Ń!—‡Ń!—‡Ń!—‡Ń”5Iœ“”5Iœ“!—‡Ń”5Iœ“”5Iœ“”K†5€e€r2Eo kW@D ?@›yf’’’’’’’’’’’’’’’’’’ ?¶ui“›=$:e‡Ž”Œ©Ł«‡Ž”£-¤%n‡Ž”‡Ž”ˆ> £Y†{#Uæˆ> £Yˆ> £Yˆ> £YB€_O€K€ž”4€†YC€@I€E€j M€~€…l>H€†\€†@C€†[€dA@€†f€ˆuj`€a€†›fF:’’’’’’’’’’’’’’’’’’^`Už2N›=$:e‡Ž”Œ©Ł«‡Ž”Œ©Ł«‡Ž”˜}"›# ōŖŖ‘‡Ž”˜}"›# ōŖŖ‘‡Ž”˜}"›# ōŖŖ‘‡Ž”˜}"›# ōŖŖ‘‡Ž”˜}"›# ōŖŖ‘‡Ž”˜}"›# ōŖŖ‘‡Ž”Œ©Ł«”'n 6‡Ž”Œ©Ł«”'n 6†{#U懎”Œ©Ł«”'n 6†{#U懎”Œ©Ł«”'n 6†{#U掞tȆ{#U懎”Œ©Ł«”'n 6†{#U懎”Œ©Ł«‡Ž”Œ©Ł«ŽžtȇŽ”˜}"›# ōŖŖ‘‡Ž”˜}"›# ōŖŖ‘‡Ž”˜}"›# ōŖŖ‘‡Ž”˜}"›# ōŖŖ‘‡Ž”˜}"›# ōŖŖ‘‡Ž”˜}"›# ōŖŖ‘‡Ž”Œ©Ł«”'n 6‡Ž”Œ©Ł«”'n 6†{#U懎”Œ©Ł«”'n 6†{#U懎”Œ©Ł«”'n 6†{#U掞tȆ{#U懎”Œ©Ł«”'n 6†{#U懎”Œ©Ł«‡Ž”Œ©Ł«ŽžtȏR@cZh)€A£Gc@ o`kkmBA|AvFKy\[€@žŒtrĒV.’’’’’’’’’’’’’’’’’’1~ZĻ9™ĒŒ”m󇎍”Œ©Ł«›=$:e›=$:e›=$:e›=$:e›=$:e›=$:e›=$:e‡Ž”Œ©Ł«‡Ž”£-¤%n£-¤%n‡Ž”ŽžtČŽžtČŽžtČˆ> £YŽžtȆ{#U掞tȆ{#U掞tȇŽ”ŽžtČŽžtȆ{#U掞tČ²G©™Ą…œŌX…œŌX…œŌXŽžtČ…œŌXKzmKzmKzm‡Ž”‡Ž”Œ©Ł«‡Ž”Œ©Ł«‡Ž”Œ©Ł«‡Ž”Œ©Ł«?ÓŽqpnoP€@€‚(€£ih@#dw.€Tˆ1€C@t®Pu@aZ@Óg@*’’’’’’’’’’’’’’’’’’2AVH"ÖĪÓƒ2†{#Uæ†{#Uæ²G©™Ą‚x‚x‚x‚x‚x‡Ž”‚x‚x‚x‚x‚x‚x‚x†{#Uæ†{#UæKzm‚x‚x‚xKzmKzm‚x‚x‚xKzmKzm‚x‚x‚xKzm‚x‚x‚x‚xŗĆflU‚x‚x‚xˆ> £Y”'n 6ˆ> £Y”'n 6†{#Uæ†{#Uæ†{#Uæ†{#Uæ†{#Uæ†{#Uæ†{#Uæ‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚xi®S@Ąqn+’’’’’’’’’’’’’’’’’’2(Y5Ž ŗĄBĻ?6†{#Uæ†{#Uæ²G©™Ą‚x‚x‚x‚x‚x‚x‡Ž”‚xŗĆflU‚x‚x‚x‚xŗĆflU‚x‚x‚x†{#UæKzm‚x‚x‚x‚xKzmKzm‚x‚x‚x‚xKzm‚x‚x‚x‚x†{#Uæ@£Čc{'’’’’’’’’’’’’’’’’’’2A\m¶ÄČJEBm†{#Uæ†{#Uæ²G©™Ą‚x‚x‚x‚x‚x‡Ž”‚x‚x‚x‚x‚x‚x‚x†{#Uæ†{#UæKzm‚x‚x‚xKzmKzm‚x‚x‚xKzmKzm‚x‚x‚xKzm‚x‚x‚x‚xŗĆflU‚x‚x‚xˆ> £Y”'n 6ˆ> £Y”'n 6†{#Uæ†{#Uæ†{#Uæ†{#Uæ†{#Uæ†{#Uæ†{#Uæ‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x@@<@D …Éee(’’’’’’’’’’’’’’’’’’2Aab‹9É!³š„†{#Uæ†{#Uæ²G©™Ą‚x‚x‚x‚x‚x‡Ž”‚x‚x‚x‚x‚x‚x‚x†{#Uæ†{#UæKzm‚x‚x‚xKzmKzm‚x‚x‚xKzmKzm‚x‚x‚xKzm‚x‚x‚x‚xŗĆflU‚x‚x‚xˆ> £Y”'n 6ˆ> £Y”'n 6†{#Uæ†{#Uæ†{#Uæ†{#Uæ†{#Uæ†{#Uæ†{#Uæ‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚xOI@ep:f]®gL@®N®@s @t®{ zŲaT-’’’’’’’’’’’’’’’’’’6u_†yĒŲõ˜÷ŽžtȆ{#U掞tȆ{#Uæ²G©™Ą2Šo}&’’’’’’’’’’’’’’’’’’2(v–™7Šygt†{#Uæ†{#Uæ²G©™Ą‚x‚x‚x‚x‚x‚x‡Ž”‚xŗĆflU‚x‚x‚x‚xŗĆflU‚x‚x‚x†{#UæKzm‚x‚x‚x‚xKzmKzm‚x‚x‚x‚xKzm‚x‚x‚x‚x†{#Uæ~®ü}S’’’’’’’’B™’’’’’’’’’’xåüS}ü'·mŅHSCØBs3’’’’’’’’’’’’’’’’’’2AyŪķ“kØös­®†{#Uæ†{#Uæ²G©™Ą‚x‚x‚x‚x‚x‡Ž”‚x‚x‚x‚x‚x‚x‚x†{#Uæ†{#UæKzm‚x‚x‚xKzmKzm‚x‚x‚xKzmKzm‚x‚x‚xKzm‚x‚x‚x‚xŗĆflU‚x‚x‚xˆ> £Y”'n 6ˆ> £Y”'n 6†{#Uæ†{#Uæ†{#Uæ†{#Uæ†{#Uæ†{#Uæ†{#Uæ‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x‚x|„F @Z€@ĮX®BU@ @D @E @W®@@}H@@J@@L@@M@N@@P€@l€b€@NBDEGI…WtK’’’’’’’’’’’’’’’’’’ U²$…œŌX›T%»›T%»›T%»”'n 6žŒ©Ł«›T%»ˆ> £Y›T%»ˆ> £Y›T%»ˆ> £Y›T%»ˆ> £YåOX›T%»ˆ> £YžŒ©Ł«›T%»ˆ> £Y›T%»ˆ> £Y›T%»ˆ> £Y›T%»ˆ> £Y”5Iœ“›T%»ˆ> £Y@D _@ I€ˆx€V€@zb€^€Ly //============================================================================= // TeamBalanceActor // Class for easier work with TeamBalanceMutator // Copyright PJMODOS (pjmodos@atlas.cz) //============================================================================= class TeamBalanceActor expands Info; function PostBeginPlay() { local TeamBalanceMutator Balancer; Super.PostBeginPlay(); foreach AllActors(class 'TeamBalanceMutator', Balancer) { return; } Balancer = Level.Spawn(Class'TeamBalanceMutator'); Balancer.NextMutator = Level.Game.BaseMutator; Level.Game.BaseMutator = Balancer; } ½h PŽĒ½ QHI-EƂwQ¤*Q¤a/! —© «$ ‘ÆH?, I ¼ ¾€?Å‚± ’?›:‹»:$n ™ ™ ³ —©Ź„-E± ’?€ aŠp¢: %(+ ,‘ÆÆH(?,®I«®+?&?, $aŃpØp¢:RQ°%(±-E/Q a1 8°‚š:8& aŠNspd: (+ ,‘ÆÆH(?,®I«®+?&?, aŃØNspd:S8(¬¬š:8, aŠEff.: %(+ ,‘ÆÆH(?,®I«®+?&?, !aŃpØEff.:S8%(¬8-: aŠAcc.: %(+ ,‘ÆÆH(?,®I«®+?&?, !aŃpØAcc.:S8J%(°10 ™n `#//============================================================================= // TeamBalanceMutator // Class for balance teams // Copyright PJMODOS (pjmodos@atlas.cz) //============================================================================= class TeamBalanceMutator expands Mutator; function Mutate(string MutateString, PlayerPawn Sender) { local Pawn p; local int i; Super.Mutate(MutateString, Sender); if (Level.Game.IsA('TeamGamePlus') && Level.Game.bTeamGame && MutateString ~= "BALANCETEAMS") { if ((TeamGamePlus(level.game).Teams[0].Size-1)>TeamGamePlus(level.game).Teams[1].Size || (TeamGamePlus(level.game).Teams[0].Size>TeamGamePlus(level.game).Teams[1].Size && TeamGamePlus(level.game).Teams[0].Score>TeamGamePlus(level.game).Teams[1].Score)) { for ( i=31; i>=0; i-- ) { if ((Level.Game.GameReplicationInfo.PRIArray[i] != None) && (Level.Game.GameReplicationInfo.PRIArray[i].HasFlag == None)) { if (Level.Game.GameReplicationInfo.PRIArray[i].Team==0 && (p == None || Level.Game.GameReplicationInfo.PRIArray[i].PlayerID>p.PlayerReplicationInfo.PlayerID)) { p=Pawn(Level.Game.GameReplicationInfo.PRIArray[i].Owner); } } } level.game.ChangeTeam(p, 1); level.game.RestartPlayer(p); p.ClientMessage("You are now on Blue because teams was uneven!", 'CriticalEvent', True); } if ((TeamGamePlus(level.game).Teams[0].Size+1)=0; i-- ) { if ((Level.Game.GameReplicationInfo.PRIArray[i] != None) && (Level.Game.GameReplicationInfo.PRIArray[i].HasFlag == None)) { if (Level.Game.GameReplicationInfo.PRIArray[i].Team==1 && (p == None || Level.Game.GameReplicationInfo.PRIArray[i].PlayerID>p.PlayerReplicationInfo.PlayerID)) { p=Pawn(Level.Game.GameReplicationInfo.PRIArray[i].Owner); } } } level.game.ChangeTeam(p, 0); level.game.RestartPlayer(p); p.ClientMessage("You are now on Red because teams was uneven!", 'CriticalEvent', True); } } } z8//============================================================================= // MODOSDOMScoreBoard. // Copyright PJMODOS (pjmodos@atlas.cz) //============================================================================= class MODOSDOMScoreBoard expands DominationScoreboard; var bool ShowPacketLoss; var bool ShowNetSpeed; function ShowScores( canvas Canvas ) { local PlayerReplicationInfo PRI; local int PlayerCount, i; local float XL, YL, XL2, YL2, XOffset, YOffset; local Font CanvasFont; local int PlayerCounts[4], TeamPing[4], TeamPacketLoss[4]; Super.ShowScores(Canvas); CanvasFont = Canvas.Font; Canvas.DrawColor = WhiteColor; Canvas.Font = MyFonts.GetMediumFont( Canvas.ClipX ); Canvas.StrLen("TEXT", XL, YL); Canvas.Font = Font'SmallFont'; for ( i=0; i<32; i++ ) { if (PlayerPawn(Owner).GameReplicationInfo.PRIArray[i] != None) { PRI = PlayerPawn(Owner).GameReplicationInfo.PRIArray[i]; if ( !PRI.bIsSpectator || PRI.bWaitingPlayer ) { PlayerCount++; PlayerCounts[PRI.Team]++; TeamPing[PRI.Team] += PRI.Ping; TeamPacketLoss[PRI.Team] += PRI.PacketLoss; } } } for ( i=0; i<4; i++ ) { if ( PlayerCounts[i] > 0 ) { if ( i % 2 == 0 ) XOffset = (Canvas.ClipX / 4) - (Canvas.ClipX / 8); else XOffset = ((Canvas.ClipX / 4) * 3) - (Canvas.ClipX / 8); YOffset = ScoreStart - YL + 2; if ( i > 1 ) if (PlayerCounts[i-2] > 0) YOffset = ScoreStart + YL*10; Canvas.StrLen(PingString$": ", XL2, YL2); Canvas.SetPos(XOffset - XL2 - 6, YOffset + 2); Canvas.DrawText(PingString$":"@(TeamPing[i]/PlayerCounts[i]), false); // Draw Packetloss Canvas.StrLen(LossString$": %", XL2, YL2); Canvas.SetPos(XOffset - XL2 - 6, YOffset + YL2 +3); Canvas.DrawText(LossString$":"@(TeamPacketLoss[i]/PlayerCounts[i])$"%", false); } } Canvas.Font = CanvasFont; } function DrawNameAndPing(Canvas Canvas, PlayerReplicationInfo PRI, float XOffset, float YOffset, bool bCompressed) { local float XL, YL; local Font CanvasFont; local DeathMatchPlus DMP; local MODOSPRI MPRI; Super.DrawNameAndPing(Canvas, PRI, XOffset, YOffset, bCompressed); if ( (PRI.HasFlag != None) && PRI.HasFlag.IsA('PureFlag') ) { Canvas.DrawColor=WhiteColor; Canvas.Style=1; Canvas.SetPos(XOffset - 32,YOffset); Canvas.DrawIcon(Texture'Botpack.Icons.GreenFlag',1.00); } if ( (Canvas.ClipX > 512) && Level.NetMode != NM_Standalone) { CanvasFont = Canvas.Font; Canvas.Font = Font'SmallFont'; Canvas.DrawColor = WhiteColor; if ( !bCompressed || (Canvas.ClipX > 640) ) { // Draw Packetloss Canvas.StrLen(LossString$": %", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + (YL+1)*2); Canvas.DrawText(LossString$":"@PRI.PacketLoss$"%", false); } if ( !bCompressed ) { foreach PRI.ChildActors(Class'MODOSPRI', MPRI) { if (MPRI.ShowBonusInfo == 1) { Canvas.StrLen("Nspd: ", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + (YL+1)*3); Canvas.DrawText("Nspd:"@MPRI.Info, false); } else if (MPRI.ShowBonusInfo == 2) { Canvas.StrLen("Eff.: %", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + (YL+1)*3); Canvas.DrawText("Eff.:"@MPRI.Info$"%", false); if (MPRI.ZP) { Canvas.StrLen("Acc.: %", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + (YL+1)*4); Canvas.DrawText("Acc.:"@MPRI.Accuracy$"%", false); } } break; } } Canvas.Font = CanvasFont; } } ’p C£’ G ™ —© ™ø ’ aŠTEXTcL ™ ³%–, ƒw.ˆš¹€¦**.ˆš¹€¦ƒ„*-Õ*-ß„b„:*ŖW”:*Ŗd*Ś”:*Ŗe:*°„–%–,ƒ—W%ō“­??,?%dƬ ’?,¬ ’?,'dÆ«¬ ’?,?,¬ ’?,h®Æ¶L?,u—&u—“,W%h®¶«L?,  aŠpµ: wK !‘ÆÆdw?,®h?, )aŃØpµ:S‘dW( aŠp¢: %wK (‘ÆÆdw?,®®hK?, .aŃpØp¢:S‘eW%(„” ™G ;£~mļl 1÷ļ_a^-`æ‚w_¤*_¤a/!—©«$%‘Æ«’@>?, ^¼ ¾€?õ‚±’?›:‹»:$™ø’aŠ0000bc—©™ø ’aÖpł: 999A_aÖpń: 999ZfAõAZ/_ a1 OM•š:O&aŠNSpd: ZfA‘®®®«’@?bA?,®^«?caŃØNSpd:SO(AAš:O,aŠEff.: %ZfA‘®®®«’@?bA?,®^«?c!aŃpØEff.:SO%(-b'M10õ-baŠp¢: %ZfA‘®®®«’@?bA?,®^«?c$aŃpØp¢:R_°%( B//============================================================================= // MODOSDMScoreBoard. // Copyright PJMODOS (pjmodos@atlas.cz) //============================================================================= class MODOSDMScoreBoard expands TournamentScoreBoard; function DrawNameAndPing(Canvas Canvas, PlayerReplicationInfo PRI, float XOffset, float YOffset, bool bCompressed) { local float XL, YL, XL2, YL2, XL3, YL3; local Font CanvasFont; local bool done; local MODOSPRI MPRI; Super.DrawNameAndPing(Canvas, PRI, XOffset, YOffset, bCompressed); if ( (PRI.HasFlag != None) && PRI.HasFlag.IsA('PureFlag') ) { Canvas.DrawColor=WhiteColor; Canvas.Style=1; Canvas.SetPos(Canvas.ClipX * 0.1875 - 32,YOffset); Canvas.DrawIcon(Texture'Botpack.Icons.GreenFlag',1.00); } if ( (Canvas.ClipX > 512) && (Level.NetMode != NM_Standalone) ) { Canvas.Font = MyFonts.GetBigFont(Canvas.ClipX); Canvas.StrLen( "0000", XL, YL ); Canvas.DrawColor = WhiteColor; Canvas.Font = MyFonts.GetSmallestFont(Canvas.ClipX); Canvas.TextSize( TimeString$": 999", XL3, YL3 ); Canvas.TextSize( FPHString$": 999", XL2, YL2 ); XL3 = FMax(XL3, XL2); foreach PRI.ChildActors(Class'MODOSPRI', MPRI) { if (MPRI.ShowBonusInfo == 1) { Canvas.StrLen("NSpd: ", XL2, YL2); Canvas.SetPos( Canvas.ClipX * 0.75 + XL + XL3 + 16, YOffset + 0.5 * YL ); Canvas.DrawText("NSpd:"@MPRI.Info, false); } else if (MPRI.ShowBonusInfo == 2) { Canvas.StrLen("Eff.: %", XL2, YL2); Canvas.SetPos( Canvas.ClipX * 0.75 + XL + XL3 + 16, YOffset + 0.5 * YL ); Canvas.DrawText("Eff.:"@MPRI.Info$"%", false); } done = true; break; } if (!done) { // Draw Packetloss Canvas.StrLen(LossString$": %", XL2, YL2); Canvas.SetPos( Canvas.ClipX * 0.75 + XL + XL3 + 16, YOffset + 0.5 * YL ); Canvas.DrawText( LossString$":"@PRI.PacketLoss$"%", false ); } } } jq//============================================================================= // MODOSLMSScoreBoard. // Copyright PJMODOS (pjmodos@atlas.cz) //============================================================================= class MODOSLMSScoreBoard expands LMSScoreboard; var bool ShowPacketLoss; var bool ShowNetSpeed; function DrawNameAndPing(Canvas Canvas, PlayerReplicationInfo PRI, float XOffset, float YOffset, bool bCompressed) { local float XL, YL, XL2, YL2, XL3, YL3; local Font CanvasFont; local bool done; local MODOSPRI MPRI; Super.DrawNameAndPing(Canvas, PRI, XOffset, YOffset, bCompressed); if ( (PRI.HasFlag != None) && PRI.HasFlag.IsA('PureFlag') ) { Canvas.DrawColor=WhiteColor; Canvas.Style=1; Canvas.SetPos(Canvas.ClipX * 0.1875 - 32,YOffset); Canvas.DrawIcon(Texture'Botpack.Icons.GreenFlag',1.00); } if ( (Canvas.ClipX > 512) && (Level.NetMode != NM_Standalone) ) { Canvas.Font = MyFonts.GetBigFont(Canvas.ClipX); Canvas.StrLen( "0000", XL, YL ); Canvas.DrawColor = WhiteColor; Canvas.Font = MyFonts.GetSmallestFont(Canvas.ClipX); Canvas.TextSize( TimeString$": 999", XL3, YL3 ); Canvas.TextSize( FPHString$": 999", XL2, YL2 ); XL3 = FMax(XL3, XL2); foreach PRI.ChildActors(Class'MODOSPRI', MPRI) { if (MPRI.ShowBonusInfo == 1) { Canvas.StrLen("NSpd: ", XL2, YL2); Canvas.SetPos( Canvas.ClipX * 0.75 + XL + XL3 + 16, YOffset + 0.5 * YL ); Canvas.DrawText("NSpd:"@MPRI.Info, false); } else if (MPRI.ShowBonusInfo == 2) { Canvas.StrLen("Eff.: %", XL2, YL2); Canvas.SetPos( Canvas.ClipX * 0.75 + XL + XL3 + 16, YOffset + 0.5 * YL ); Canvas.DrawText("Eff.:"@MPRI.Info$"%", false); } done = true; break; } if (!done) { // Draw Packetloss Canvas.StrLen(LossString$": %", XL2, YL2); Canvas.SetPos( Canvas.ClipX * 0.75 + XL + XL3 + 16, YOffset + 0.5 * YL ); Canvas.DrawText( LossString$":"@PRI.PacketLoss$"%", false ); } } } ~½k Q›Ē½UCK-MƂwU¤*U¤a/!—©«$‘ÆC?, K¼ ¾€?Å‚±’?›:‹»:$W™™ ³—©Ź„-M±’?€aŠp¢: %.0,‘ÆÆC.?,®K«®0?&?,$aŃpØp¢:RU°%(±-M/U a1 ;°‚š:;&aŠNspd: .0,‘ÆÆC.?,®K«®0?&?,aŃØNspd:S;(¬¬š:;,aŠEff.: %.0,‘ÆÆC.?,®K«®0?&?,!aŃpØEff.:S;%(¬;-:aŠAcc.: %.0,‘ÆÆC.?,®K«®0?&?,!aŃpØAcc.:S;J%(°10™W 6£%ŠX$Ķb‹Ü L Č$ \‹Į u½ b Š$ v½ x Ø$ y½ Ž É$ a½ ¤ Ó$ V½ ŗ Ą$ Y½ ’’śr$*ēMODOSUtils: Failed to load MODOSScoreBoard!4‹Ü$‹Ü$Š-š'`-S!aś~Ŗ>' Ēv6<½!š:‹»:$a U  ėwMHs“¬‚‚Ma/!)Ma/! —X%sa .ŽM± M īs=X›"s-:'¬s-:(M  ÷dL8’’’’’’’’’’’’’’’’’’y¹V2­÷U[„Ś‡Ž”`Už2N‡Ž”Œ©Ł«‡Ž”Œ©Ł«b®žC M\ź²‚wE¤*E¤a/!½E45-e—©«$‘Æ4?, 5¼ ¾€?ŅžE45-e肱’?›:‹»:$Q™™ ³—©ķ„-e±’?€aŠp¢: %)',‘ÆÆ4)?,®5«®'?&?,$aŃpØp¢:RE°%(Ō-e/E a1 6Ó„š:6&aŠNspd: )',‘ÆÆ4)?,®5«®'?&?,aŃØNspd:S6(ĻĻš:6,aŠEff.: %)',‘ÆÆ4)?,®5«®'?&?,!aŃpØEff.:S6%(Ļ6-:aŠAcc.: %)',‘ÆÆ4)?,®5«®'?&?,!aŃpØAcc.:S6J%(Ó10™Q H$//============================================================================= // SplashNotify. // Copyright PJMODOS (pjmodos@atlas.cz) //============================================================================= class SplashNotify expands SpawnNotify; var string LogoTexture; var byte LogoDrawTime; var string CaptionLineOne; var string CaptionLineTwo; var string CaptionLineThree; var string CaptionLineFour; replication { reliable if(Role==ROLE_Authority) LogoTexture,LogoDrawTime,CaptionLineOne,CaptionLineTwo,CaptionLineThree,CaptionLineFour; } simulated function PreBeginPlay() { bAlwaysRelevant = true; Log("SplashNotify::PreBeginPlay()"); } simulated function PostNetBeginPlay() { local ChallengeHUD PlayerHUD; Log("SplashNotify::PostNetBeginPlay()"); foreach AllActors(Class'ChallengeHUD',PlayerHUD) { SpawnNotification(PlayerHUD); } } /*simulated function Spawned() { local ChallengeHUD PlayerHUD; foreach AllActors(Class'ChallengeHUD',PlayerHUD) { SpawnNotification(PlayerHUD); } }*/ simulated event Actor SpawnNotification(actor Actor) { local SplashHUDMutator tmpHUD; Log("SplashNotify::SpawnNotification(1)"); if (Actor != None) { Log("SplashNotify::SpawnNotification(2)"); if (Actor.IsA('HUD') && (HUD(Actor).HUDMutator == None || !HUD(Actor).HUDMutator.IsA('SplashHUDMutator'))) { Log("SplashNotify::SpawnNotification(3)"); tmpHUD = spawn(class'SplashHUDMutator', Actor); Log("SplashNotify::SpawnNotification(4)"); if (tmpHUD != None) { tmpHUD.Player = PlayerPawn(Actor.Owner); Log("SplashNotify::SpawnNotification(5)"); tmpHUD.LogoTexture = LogoTexture; tmpHUD.LogoDrawTime = LogoDrawTime; tmpHUD.CaptionLineOne = CaptionLineOne; tmpHUD.CaptionLineTwo = CaptionLineTwo; tmpHUD.CaptionLineThree = CaptionLineThree; tmpHUD.CaptionLineFour = CaptionLineFour; Log("SplashNotify::SpawnNotification(6)"); if (HUD(Actor).HUDMutator == None) HUD(Actor).HUDMutator = tmpHUD; else { tmpHUD.NextHUDMutator = HUD(Actor).HUDMutator; HUD(Actor).HUDMutator = tmpHUD; } Log("SplashNotify::SpawnNotification(7)"); } } } Log("SplashNotify::SpawnNotification(8)"); return Actor; } Ā ÷ĀR\V-[æ‚wR¤*R¤a/!—©«$%‘Æ«’@>?, V¼ ¾€?õ‚±’?›:‹»:$™ø’aŠ0000xy—©™ø ’aÖpł: 999FYaÖpń: 999\uFõF\/R a1 LM•š:L&aŠNSpd: \uA‘®®®«’@?xF?,®V«?yaŃØNSpd:SL(AAš:L,aŠEff.: %\uA‘®®®«’@?xF?,®V«?y!aŃpØEff.:SL%(-m'M10õ-maŠp¢: %\uA‘®®®«’@?xF?,®V«?y$aŃpØp¢:RR°%( s€…V //============================================================================= // SplashLogoSA. // Copyright PJMODOS (pjmodos@atlas.cz) //============================================================================= class SplashLogoSA expands Actor config; var config string LogoTexture; var config int LogoDrawTime; var config string CaptionLineOne; var config string CaptionLineTwo; var config string CaptionLineThree; var config string CaptionLineFour; function PreBeginPlay() { local SplashNotify s; s = spawn(class'SplashNotify'); s.LogoTexture = LogoTexture; s.LogoDrawTime = LogoDrawTime; s.CaptionLineOne = CaptionLineOne; s.CaptionLineTwo = CaptionLineTwo; s.CaptionLineThree = CaptionLineThree; s.CaptionLineFour = CaptionLineFour; } 8£…A4’’’’’’’’’’’’’’’’’’Bł……œŌX2—Q}+2—Q}+2—Q}+2—Q}+2—Q}+2—Q}+A"Ę £Ęk™—©™ø’aŠTEXT^@™ ³%–, ƒw.ˆš¹€¦*/.ˆš¹€¦ƒ„/-Õ/-ß„]„:/Ŗ]”:/Ŗj/Ś”:/Ŗf:/°„–%–,ƒ—]%ō“­??,?%oƬ’?,¬’?,'oÆ«¬’?,?,¬’?,m®Æ¶@?,u—&u—“,]%m®¶«@?, aŠpµ: pB!‘ÆÆop?,®m?,)aŃØpµ:S‘j](aŠp¢: %pB(‘ÆÆop?,®®mB?,.aŃpØp¢:S‘f]%(„”™k x`!Xµ[%a xw%* /a0 …`X%a x* ` īWw%*0 10 ~Ł}% ‰÷Ł}Zõ‚‚‹a/!1‹-×|}BALANCETEAMS-„—“%.˜‹¬·&&.˜‹¬·¦‚—%.˜‹¬·&.˜‹¬·Q±%.˜‹¬Ń&.˜‹¬Ń,®™%¤‚w‹­€¦*3r‹­€¦¤*¤‚š:‹­€¦Ŗ%V„r*I—‹­€¦×±×.Ž‹­€¦š¦l‹ &‹ ; You are now on Blue because teams was uneven!!$'õ„–’%.˜‹¬·&&.˜‹¬·¦‚–%.˜‹¬·&.˜‹¬·Q°%.˜‹¬Ń&.˜‹¬Ń,w™%m‚w‹­€¦*3r‹­€¦¤*m‚š:‹­€¦Ŗ&V„r*I—‹­€¦×±×.Ž‹­€¦š¦5‹ %‹ : You are now on Red because teams was uneven!!$' ŹKŸMå ® J C$@³ €?$ Ż m$j³ €?$ Ż ˜$•³ ?R$ Ż Ā$æ³ €?$ Ż Ś$a(#*Ż ’’Ź Um®ŹDjÖ¦¤‚-S w%*¤‹a/!F.£‹.‚—Fņ%F-Ņ‹é+w*‚‚‚a/!a/!.ˆ-Ėr±¤*±¤%źˆ¤‹é}w*±¤*źB”w%*%a%*a( MK9!›::$-t-āz—r™|«‘@A B $«$6Å—C«<$į 6Ć—C«<$į 6Ā—C«<$į č `$«$6Å—$į6Ć—$į6Ā—$įč å$«$6Å—CÆ<$į«?,į 6Ć—CÆ<$į«?,į 6Ā—CÆ<$į«?,į č ’’¼#€?-ā( ž$«$6Å—C«<$į 6Ć—C«<$į 6Ā—C«<$į  ł$«$6Å—$į6Ć—$į6Ā—$į ~$«$6Å—CÆ<$į«?,į 6Ć—CÆ<$į«?,į 6Ā—CÆ<$į«?,į  ’’™Ę&‘ A®® B?#Ė?, aŃP&‘ A®® B?#Ė?,aŃC&‘ A®® B?#Ė?,aŃU&‘ A®® B?#Ė?,(aŃZ&‘ A®® B?#Ė?,2-ā-t—z™r«| Ķl wĶ/a0 `l0 10l‹a `lŌ‹Ī‹Īl ķSD$ŚķDžwN*žwN±*ž›::$å-TēpLoading texture a#.“ēa “«w#*-T'$J€=aJ'ā$ēpMODOSSplashLogo: Can't load texture ažž›::$Dwį*į D Š b ŽN  ŃO0½ ĻPR@ć €ŪÉQ<)!’Žü’’’’’’’ö &c[‚‚wą*wą±¤*$ą±¤a/!Åaö J\"Ž( "‹Īw"Ō*""Ō-H(-h(q˜~V"Ģ.%(—™~ėV"ĢGIB%-H'æ™~ėV"ĢINSTA%-h'-Hp€V"Ģ~V"Ģ.zėpZPPURE7E'( F#//============================================================================= // MODOSDemoEnhacer. // This class is spawned while demoplaying // Copyright PJMODOS (pjmodos@atlas.cz) //============================================================================= class MODOSDemoEnhacer expands Actor; simulated function Tick(float Delta) { local Class GameClass; local Class SBClass; local Class HUDClass; local DemoRecSpectator DRS; local int Count; foreach AllActors(class'DemoRecSpectator', DRS) { if (DRS.PlaybackActor != None && DRS.PlaybackGRI != None) { GameClass=Class(DynamicLoadObject(DRS.PlaybackGRI.GameClass,Class'Class')); SBClass=None; switch (GameClass.Default.ScoreBoardType) { Case Class'UnrealCTFScoreBoard': SBClass = Class'MODOSCTFScoreBoard'; HUDClass = Class'MODOSSBCTFHud'; break; Case Class'TournamentScoreBoard': SBClass = Class'MODOSDMScoreBoard'; break; Case Class'TeamScoreBoard': SBClass = Class'MODOSTDMScoreBoard'; break; Case Class'AssaultScoreBoard': SBClass = Class'MODOSASSScoreBoard'; break; Case Class'DominationScoreBoard': SBClass = Class'MODOSDOMScoreBoard'; break; Case Class'LMSScoreBoard': SBClass = Class'MODOSLMSScoreBoard'; break; } if (SBClass == None) { log("MODOSUtils: Failed to load MODOSScoreBoard!"); } else if (SBClass != DRS.PlaybackActor.ScoringType) { DRS.PlaybackActor.ScoringType=SBClass; if ( DRS.PlaybackActor.Scoring != None ) DRS.PlaybackActor.Scoring.Destroy(); DRS.PlaybackActor.Scoring=None; } if ( HUDClass == None) HUDClass=Class(DynamicLoadObject(string(GameClass.Default.HUDType),Class'Class')); if ( HUDClass == None ) { log("MODOSUtils: Failed to load HUD!"); } else if(HUDClass != DRS.PlaybackActor.HUDType) { DRS.PlaybackActor.HUDType=HUDClass; if ( DRS.PlaybackActor.myHUD != None ) DRS.PlaybackActor.myHUD.Destroy(); DRS.PlaybackActor.myHUD=None; } Destroy(); } Count++; } if (Count == 0) Destroy(); } ĘH F£Ę  ™ —© ™ø ’ aŠTEXTI} ™ ³%–, ƒw.ˆš¹€¦*3.ˆš¹€¦ƒ„3-Õ3-ß„K„:3ŖX”:3ŖA3Ś”:3ŖB:3°„–%–,ƒ—X%ō“­??,?%tƬ ’?,¬ ’?,'tÆ«¬ ’?,?,¬ ’?,v®Æ¶}?,u—&u—“,X%v®¶«}?,  aŠpµ: r| !‘ÆÆtr?,®v?, )aŃØpµ:S‘AX( aŠp¢: %r| (‘ÆÆtr?,®®v|?, .aŃpØp¢:S‘BX%(„” ™ ĶX= ĶG‚‚{ź<&/{ź<&\ —}<%= 1.0) { DrawState = EDrawState.DRAW_FADE_IN; DrawTime = 0.0; } break; case EDrawState.DRAW_FADE_IN : if (DrawTime >= 1.0) { DrawState = EDrawState.DRAW_DISPLAY; DrawTime = 0.0; } break; case EDrawState.DRAW_DISPLAY : if (DrawTime >= LogoDrawTime) { DrawState = EDrawState.DRAW_FADE_OUT; DrawTime = 0.0; } break; case EDrawState.DRAW_FADE_OUT : if (DrawTime >= 1.0) { DrawState = EDrawState.DRAW_DONE; DrawTime = 0.0; } break; case EDrawState.DRAW_DONE : SetTimer(0.0, False); SplashLogo = None; break; } Super.Timer(); } ]RIæÅ^€V‹~V‹. R~ %ō—’’’’Ņ'„—%p€   %T}  ,Ķ—“T,% ź “T,Õ ų|%Lp^­*|%Dp ‹Ó­\|%Mp ‹ß­‰|%YpS‹Ģ­»|%Hp ‹Ī­ķ|%Ip ‹Ō­|%Sp ‹Õ­z|%Nww‹­*p‹­Ź­›z%%p%­p~ %Ļš’’’’ŅCń—} %p ’  T} %²–T_›~\/*?<:>"| &’’’’ØØŽ›~  &’’’’p_Øp &„&   q//============================================================================= // MODOSSBCTFHud. // Copyright PJMODOS (pjmodos@atlas.cz) //============================================================================= class MODOSSBCTFHud extends ChallengeCTFHUD; function Timer() { if ((PawnOwner != None) && PawnOwner.PlayerReplicationInfo.HasFlag != None && PawnOwner.PlayerReplicationInfo.HasFlag.IsA('PureFlag')) Super(ChallengeTeamHUD).Timer(); else Super.Timer(); } €@E://============================================================================= // MODOSCTFScoreBoard. // Copyright PJMODOS (pjmodos@atlas.cz) //============================================================================= class MODOSCTFScoreBoard expands UnrealCTFScoreboard; function ShowScores( canvas Canvas ) { local PlayerReplicationInfo PRI; local int PlayerCount, i; local float XL, YL, XL2, YL2, XOffset, YOffset; local Font CanvasFont; local int PlayerCounts[4], TeamPing[4], TeamPacketLoss[4]; Super.ShowScores(Canvas); CanvasFont = Canvas.Font; Canvas.DrawColor = WhiteColor; Canvas.Font = MyFonts.GetMediumFont( Canvas.ClipX ); Canvas.StrLen("TEXT", XL, YL); Canvas.Font = Font'SmallFont'; for ( i=0; i<32; i++ ) { if (PlayerPawn(Owner).GameReplicationInfo.PRIArray[i] != None) { PRI = PlayerPawn(Owner).GameReplicationInfo.PRIArray[i]; if ( !PRI.bIsSpectator || PRI.bWaitingPlayer ) { PlayerCount++; PlayerCounts[PRI.Team]++; TeamPing[PRI.Team] += PRI.Ping; TeamPacketLoss[PRI.Team] += PRI.PacketLoss; } } } for ( i=0; i<4; i++ ) { if ( PlayerCounts[i] > 0 ) { if ( i % 2 == 0 ) XOffset = (Canvas.ClipX / 4) - (Canvas.ClipX / 8); else XOffset = ((Canvas.ClipX / 4) * 3) - (Canvas.ClipX / 8); YOffset = ScoreStart - YL + 2; if ( i > 1 ) if (PlayerCounts[i-2] > 0) YOffset = ScoreStart + YL*10; Canvas.StrLen(PingString$": ", XL2, YL2); Canvas.SetPos(XOffset - XL2 - 6, YOffset + 2); Canvas.DrawText(PingString$":"@(TeamPing[i]/PlayerCounts[i]), false); // Draw Packetloss Canvas.StrLen(LossString$": %", XL2, YL2); Canvas.SetPos(XOffset - XL2 - 6, YOffset + YL2 +3); Canvas.DrawText(LossString$":"@(TeamPacketLoss[i]/PlayerCounts[i])$"%", false); } } Canvas.Font = CanvasFont; } function DrawNameAndPing(Canvas Canvas, PlayerReplicationInfo PRI, float XOffset, float YOffset, bool bCompressed) { local float XL, YL; local Font CanvasFont; local DeathMatchPlus DMP; local MODOSPRI MPRI; local MODOSSBServerActor MSA; if ( (PRI.HasFlag != None) && PRI.HasFlag.IsA('PureFlag') ) { Super(TeamScoreBoard).DrawNameAndPing(Canvas,PRI,XOffset,YOffset,bCompressed); Canvas.DrawColor=WhiteColor; Canvas.Style=1; Canvas.SetPos(XOffset - 32,YOffset); Canvas.DrawIcon(Texture'Botpack.Icons.GreenFlag',1.00); } else { Super.DrawNameAndPing(Canvas,PRI,XOffset,YOffset,bCompressed); } if ( (Canvas.ClipX > 512) && Level.NetMode != NM_Standalone) { CanvasFont = Canvas.Font; Canvas.Font = Font'SmallFont'; Canvas.DrawColor = WhiteColor; if ( !bCompressed || (Canvas.ClipX > 640) ) { // Draw Packetloss Canvas.StrLen(LossString$": %", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + (YL+1)*2); Canvas.DrawText(LossString$":"@PRI.PacketLoss$"%", false); } if ( !bCompressed ) { foreach PRI.ChildActors(Class'MODOSPRI', MPRI) { if (MPRI.ShowBonusInfo == 1) { Canvas.StrLen("Nspd: ", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + (YL+1)*3); Canvas.DrawText("Nspd:"@MPRI.Info, false); } else if (MPRI.ShowBonusInfo == 2) { Canvas.StrLen("Eff.: %", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + (YL+1)*3); Canvas.DrawText("Eff.:"@MPRI.Info$"%", false); if (MPRI.ZP) { Canvas.StrLen("Acc.: %", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + (YL+1)*4); Canvas.DrawText("Acc.:"@MPRI.Accuracy$"%", false); } } break; } } Canvas.Font = CanvasFont; } } [€W9//============================================================================= // MODOSASSScoreBoard. // Copyright PJMODOS (pjmodos@atlas.cz) //============================================================================= class MODOSASSScoreBoard expands AssaultScoreboard; var bool ShowPacketLoss; var bool ShowNetSpeed; function ShowScores( canvas Canvas ) { local PlayerReplicationInfo PRI; local int PlayerCount, i; local float XL, YL, XL2, YL2, XOffset, YOffset; local Font CanvasFont; local int PlayerCounts[4], TeamPing[4], TeamPacketLoss[4]; Super.ShowScores(Canvas); CanvasFont = Canvas.Font; Canvas.DrawColor = WhiteColor; Canvas.Font = MyFonts.GetMediumFont( Canvas.ClipX ); Canvas.StrLen("TEXT", XL, YL); Canvas.Font = Font'SmallFont'; for ( i=0; i<32; i++ ) { if (PlayerPawn(Owner).GameReplicationInfo.PRIArray[i] != None) { PRI = PlayerPawn(Owner).GameReplicationInfo.PRIArray[i]; if ( !PRI.bIsSpectator || PRI.bWaitingPlayer ) { PlayerCount++; PlayerCounts[PRI.Team]++; TeamPing[PRI.Team] += PRI.Ping; TeamPacketLoss[PRI.Team] += PRI.PacketLoss; } } } for ( i=0; i<4; i++ ) { if ( PlayerCounts[i] > 0 ) { if ( i % 2 == 0 ) XOffset = (Canvas.ClipX / 4) - (Canvas.ClipX / 8); else XOffset = ((Canvas.ClipX / 4) * 3) - (Canvas.ClipX / 8); YOffset = ScoreStart - YL + 2; if ( i > 1 ) if (PlayerCounts[i-2] > 0) YOffset = ScoreStart + YL*10; Canvas.StrLen(PingString$": ", XL2, YL2); Canvas.SetPos(XOffset - XL2 - 6, YOffset + 2); Canvas.DrawText(PingString$":"@(TeamPing[i]/PlayerCounts[i]), false); // Draw Packetloss Canvas.StrLen(LossString$": %", XL2, YL2); Canvas.SetPos(XOffset - XL2 - 6, YOffset + YL2 +3); Canvas.DrawText(LossString$":"@(TeamPacketLoss[i]/PlayerCounts[i])$"%", false); } } Canvas.Font = CanvasFont; } function DrawNameAndPing(Canvas Canvas, PlayerReplicationInfo PRI, float XOffset, float YOffset, bool bCompressed) { local float XL, YL; local Font CanvasFont; local DeathMatchPlus DMP; local MODOSPRI MPRI; local MODOSSBServerActor MSA; Super.DrawNameAndPing(Canvas, PRI, XOffset, YOffset, bCompressed); if ( (PRI.HasFlag != None) && PRI.HasFlag.IsA('PureFlag') ) { Canvas.DrawColor=WhiteColor; Canvas.Style=1; Canvas.SetPos(XOffset - 32,YOffset); Canvas.DrawIcon(Texture'Botpack.Icons.GreenFlag',1.00); } if ( (Canvas.ClipX > 512) && Level.NetMode != NM_Standalone) { CanvasFont = Canvas.Font; Canvas.Font = Font'SmallFont'; Canvas.DrawColor = WhiteColor; if ( !bCompressed || (Canvas.ClipX > 640) ) { // Draw Packetloss Canvas.StrLen(LossString$": %", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + (YL+1)*2); Canvas.DrawText(LossString$":"@PRI.PacketLoss$"%", false); } if ( !bCompressed ) { foreach PRI.ChildActors(Class'MODOSPRI', MPRI) { if (MPRI.ShowBonusInfo == 1) { Canvas.StrLen("Nspd: ", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + (YL+1)*3); Canvas.DrawText("Nspd:"@MPRI.Info, false); } else if (MPRI.ShowBonusInfo == 2) { Canvas.StrLen("Eff.: %", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + (YL+1)*3); Canvas.DrawText("Eff.:"@MPRI.Info$"%", false); if (MPRI.ZP) { Canvas.StrLen("Acc.: %", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + (YL+1)*4); Canvas.DrawText("Acc.:"@MPRI.Accuracy$"%", false); } } break; } } Canvas.Font = CanvasFont; } } gd.uNJ‹a/![.£‹J[-ģ(' Łiz%½dŁz[b|€z, SERVERDEMO:‚‹-Ų„zIzIz, ipci‹ppdemorec "i"ēpMODOSUtils: DemoRec requested by [±Ł[! Demorecording started ...7[  Bad password for demorecb[ Can't start demorec now TŹm,_ürš*a o‚.Žšša/! w.ˆššŻ*,.ˆššš:&÷‚.Žšša/! w.ˆššŻ*ū.ˆššŻĶ%PĆž%śśš:,ūD«¬?.ŽššŽ?’.ŽššŽ.Žššä?,d%,dś-:ś‚w,*w,Ż*św,ę*’,ęa/!= J,ęŚFiredShotsX‚š %›i,äi,äj’’j GG%¹› %G  ’ jJūD«¬?.ŽššŽ? ?,d%,dś jJūD«¬?.ŽššŽ? ?,d%,d `Q ©ˆ1SSQ)š}S&Sp0SS Ę| P£Ęo™—©™ø’aŠTEXTV™ ³%–, ƒw.ˆš¹€¦*-.ˆš¹€¦ƒ„--Õ--ß„T„:-ŖN”:-Ŗl-Ś”:-Ŗg:-°„–%–,ƒ—N%ō“­??,?%nƬ’?,¬’?,'nÆ«¬’?,?,¬’?,k®Æ¶?,u—&u—“,N%k®¶«?, aŠpµ: qA!‘ÆÆnq?,®k?,)aŃØpµ:S‘lN(aŠp¢: %qA(‘ÆÆnq?,®®kA?,.aŃpØp¢:S‘gN%(„”™o S€@Ķ a@' jG;µD˜>GGP~>C„›P’’’’GppG€>PP>>’P}CP~>C%GpG> pŠ€…d@//============================================================================= // AutoRecorder // Class for automatic demo recording // Copyright PJMODOS (pjmodos@atlas.cz) //============================================================================= class AutoRecorder expands Actor config; var() globalconfig bool bAutoActivate; var() globalconfig string DemoNameFormat; var() globalconfig string DemosDir; var() globalconfig string Password; function PostBeginPlay() { local AutoRecMutator ARM; Super.PostBeginPlay(); if ((Right(DemosDir, 1) != "/") && (Right(DemosDir, 1) != "\\") && (Len(DemosDir) > 0)) DemosDir = DemosDir$"/"; if (bAutoActivate) { SetTimer (1, true); } else { foreach AllActors(class 'AutoRecMutator', ARM) { return; } ARM = Spawn(Class'AutoRecMutator'); ARM.NextMutator = Level.Game.BaseMutator; Level.Game.BaseMutator = ARM; ARM.DemosDir = DemosDir; ARM.FileName = GetDemoName(DemoNameFormat); ARM.Password = Password; } } function Timer() { local string FileName; if ( GameIsPlaying() ) { FileName = DemosDir$GetDemoName(DemoNameFormat); Level.ConsoleCommand("demorec \""$FileName$"\""); log("MODOSUtils: Auto DemoRec started ..."); Disable('Timer'); } } function bool GameIsPlaying() { local DeathMatchPlus DMP; if (Level.Game.IsA('DeathMatchPlus')) { DMP = DeathMatchPlus(Level.Game); if (DMP.bGameEnded || (DMP.bRequireReady && (DMP.CountDown > 3))) return false; } return true; } //modified code from UsAaR33 function string GetDemoName(string format){ local string Msg, OutMsg, cmd, MapName; local int pos,i, x; MapName = Left(string(Level), InStr(string(Level), ".")); Msg=format; pos = InStr(Msg,"%"); if (pos>-1) { While (true) { if (pos>0) { OutMsg = OutMsg$Left(Msg,pos); Msg = Mid(Msg,pos); pos = 0; } x = len(Msg); cmd = mid(Msg,pos,2); if (x-2 > 0) Msg = right(msg,x-2); else Msg = ""; if (cmd~="%L") { OutMsg = OutMsg$MapName; } else if (cmd~="%D") { OutMsg = OutMsg$LeadingZero(level.Day); } else if (cmd~="%M") { OutMsg = OutMsg$LeadingZero(level.Month); } else if (cmd~="%Y") { OutMsg = OutMsg$level.Year; } else if (cmd~="%H") { OutMsg = OutMsg$LeadingZero(level.Hour); } else if (cmd~="%I") { OutMsg = OutMsg$LeadingZero(level.Minute); } else if (cmd~="%S") { OutMsg = OutMsg$LeadingZero(level.Second); } else if (cmd~="%N") { if (Level.Game.GameReplicationInfo!=none) OutMsg = OutMsg$Level.Game.GameReplicationInfo.ServerName; } else if (cmd=="%%") OutMsg = OutMsg$"%"; else { OutMsg = OutMsg$cmd; } pos = InStr(Msg,"%"); if (Pos==-1) break; } if (len(msg)>0) OutMsg = OutMsg$Msg; } else OutMsg = Msg; Msg=OutMsg; //reverse for simplicity. OutMsg=""; //illegal char parsing: X=Len(Msg); for (pos = 0; pos\"|", Mid(Msg, pos, 1)) != -1) continue; else if (InStr(" ", Mid(Msg, pos, 1)) != -1) outMsg = outMsg $ "_"; else outMsg = outMsg $ Mid(Msg, pos, 1); } Msg=outMsg; return Msg; } function string LeadingZero(int i) { local string S; S=string(i); if (len(S)==1) S="0"$S; return S; } final function ReplaceText(out string Text, string Replace, string With) { local int i; local string Input; Input = Text; Text = ""; i = InStr(Input, Replace); while(i != -1) { Text = Text $ Left(Input, i) $ With; Input = Mid(Input, i + Len(Replace)); i = InStr(Input, Replace); } Text = Text $ Input; } Öu5ųī/a0 ŻÕ‚wÆ*wś*{ŒēśČ ž*{Ü Ÿ Č \D u µ Š v Ė Ø y į É a ÷ Ó V  Ą Y ’’Mr*ēMODOSUtils: Failed to load MODOSScoreBoard!ßßwÆżÆżĘwÆć*ÆćaÆć*rD*D”ēV{Į ž@rD*ēMODOSUtils: Failed to load HUD!ŅŅwDÆōÆōD¹wÆč*ÆčaÆč*a„@10ģš@%a {€ėx7—ĮēSplashNotify::SpawnNotification(1)“w*ēSplashNotify::SpawnNotification(2)“‚a/!/=„r.”æ*".”æa/!#ēSplashNotify::SpawnNotification(3)a !ēSplashNotify::SpawnNotification(4)“w*N.ˆšēSplashNotify::SpawnNotification(5)aqR:sP{CFUEZDēSplashNotify::SpawnNotification(6)2r.”æ*.”æmį.”æ.”æēSplashNotify::SpawnNotification(7)ēSplashNotify::SpawnNotification(8)  …sn ’’’’’’’’’’’’’’’’’’wu„Ć …œŌX‡Ž”‡Ž”‡Ž”‡Ž”‡Ž”‡Ž”‡Ž”Œ©Ł«‡Ž”Œ©Ł«”'n 6‡Ž”Œ©Ł«‡Ž”£-¤%n£-¤%n£-¤%n‡Ž”?¶ui“‡Ž”Œ©Ł«‡Ž”Œ©Ł«?¶ui“?¶ui“?¶ui“>ÓJ]%L_%D-%M-%Y_%H-%IFÓĆz~9 CēSplashNotify::PostNetBeginPlay()/a0 Į~@~10 H//============================================================================= // AutoRecMutator. // Class for user requsted demo recording // Copyright PJMODOS (pjmodos@atlas.cz) //============================================================================= class AutoRecMutator expands Mutator; var() string FileName; var() string DemosDir; var() string Password; function Mutate(string MutateString, PlayerPawn Sender) { Super.Mutate(MutateString, Sender); if (Left(MutateString, 10) ~= "SERVERDEMO") { if (GameIsPlaying() && !Level.bDemoRecording) { if (Password == "" || Password == Mid(MutateString, 11)) { FileName = DemosDir$FileName; Level.ConsoleCommand("demorec \""$FileName$"\""); log("MODOSUtils: DemoRec requested by "$Sender.PlayerReplicationInfo.PlayerName); Sender.ClientMessage("Demorecording started ..."); } else { Sender.ClientMessage("Bad password for demorec"); } } else { Sender.ClientMessage("Can't start demorec now"); } } } function bool GameIsPlaying() { local DeathMatchPlus DMP; if (Level.Game.IsA('DeathMatchPlus')) { DMP = DeathMatchPlus(Level.Game); if (DMP.bGameEnded) return false; } return true; } Šqp*-š'ēSplashNotify::PreBeginPlay() q{o// ==================================================================== // Class: UTPureRC4d.PureFlag // Parent: Botpack.GreenFlag // // // ==================================================================== class PureFlag extends GreenFlag; event PreBeginPlay() { // Dont call PreBP or risk being Destroyed } event PostBeginPlay() { // No need for flag animation } function SendHome() { } function Drop(vector newVel) { } auto state Home { ignores Touch, Timer, BeginState, EndState; } 9£G://============================================================================= // MODOSSBServerActor. // Copyright PJMODOS (pjmodos@atlas.cz) //============================================================================= class MODOSSBServerActor expands SpawnNotify config; var config int ShowBonusInfo; var config bool ShowClickBoard; var bool ZP7D; var Decoration FakeFlag; function PreBeginPlay() { local Class SBClass; Switch(Level.Game.Default.ScoreBoardType) { Case Class'UnrealCTFScoreBoard': SBClass = Class'MODOSCTFScoreBoard'; Level.Game.HUDType = Class'MODOSSBCTFHud'; break; Case Class'TournamentScoreBoard': SBClass = Class'MODOSDMScoreBoard'; break; Case Class'TeamScoreBoard': SBClass = Class'MODOSTDMScoreBoard'; break; Case Class'AssaultScoreBoard': SBClass = Class'MODOSASSScoreBoard'; break; Case Class'DominationScoreBoard': SBClass = Class'MODOSDOMScoreBoard'; break; Case Class'LMSScoreBoard': SBClass = Class'MODOSLMSScoreBoard'; break; } if (SBClass == None) { log("MODOSUtils: Failed to load MODOSScoreBoard!"); } else { Level.Game.Default.ScoreBoardType = SBClass; Level.Game.ScoreBoardType = SBClass; } Super.PreBeginPlay(); bAlwaysRelevant = true; if (ShowClickBoard) { CreateFlag(); Timer(); SetTimer(0.333, True); } } simulated event Spawned() { if(Level.NetMode == NM_Client) { Spawn(Class'MODOSDemoEnhacer'); } } simulated event Actor SpawnNotification(actor A) { local MODOSPRI MPRI; local int shots; if (A.IsA('Pawn') && !A.IsA('Spectator') && ShowBonusInfo>0) { MPRI = Spawn(Class'MODOSPRI', Pawn(A).PlayerReplicationInfo,, A.Location); MPRI.ShowBonusInfo = ShowBonusInfo; if (CheckMutators()) MPRI.ZP = True; else MPRI.ZP = False; } return A; } function CreateFlag() { local Actor A; FakeFlag = Spawn(class'PureFlag'); if (FakeFlag != None) return; foreach AllActors(class'Actor', A) { FakeFlag = Spawn(class'PureFlag', None,, A.Location); if (FakeFlag != None) return; } } function Timer() { local Pawn P; local DeathMatchPlus DMP; if (ShowClickBoard && FakeFlag != None) { if (Level.Game.IsA('DeathMatchPlus')) { DMP = DeathMatchPlus(Level.Game); if ((DMP.CountDown > 0) && DMP.bTournament) { For ( P=Level.PawnList; P!=None; P=P.NextPawn ) { if (P.IsA('PlayerPawn') && !P.IsA('Spectator') && PlayerPawn(P).bReadyToPlay && P.PlayerReplicationInfo.HasFlag == None) P.PlayerReplicationInfo.HasFlag = FakeFlag; } } else { For ( P=Level.PawnList; P!=None; P=P.NextPawn ) { P.PlayerReplicationInfo.HasFlag = None; } if (FakeFlag != None) FakeFlag.Destroy(); FakeFlag = None; SetTimer(0, False); } } } } simulated function bool CheckMutators () { local Mutator Mut; local bool tak,tak2; local InstaGibDM mIGM; local string pom; //sprawdz mutki Mut = Level.Game.BaseMutator; // log("Mutek = " $Mut); while( Mut.NextMutator != none ) { Mut = Mut.NextMutator; // log("Mutek = " $Mut); tak = false; tak2 = false; if (InStr(string(Mut.Class),".") <= 0) return false; if (InStr(CAPS(string(Mut.Class)), "GIB") >= 0) tak = true; if (InStr(CAPS(string(Mut.Class)), "INSTA") >= 0) tak2 = true; if (tak) { // log ("Wykryto mutka gib = " $Mut.Class); pom = Left(string(Mut.Class),InStr(string(Mut.Class),".")); // log ("pom = " $pom); if (CAPS(pom) == "ZPPURE7E") return true; else return false; } } } ½X OqĒ½Y@B-OƂwY¤*Y¤a/!—©«$‘Æ@?, B¼ ¾€?Å‚±’?›:‹»:$w™™ ³—©Ź„-O±’?€aŠp¢: %1&,‘ÆÆ@1?,®B«®&?&?,$aŃpØp¢:RY°%(±-O/Y a1 9°‚š:9&aŠNspd: 1&,‘ÆÆ@1?,®B«®&?&?,aŃØNspd:S9(¬¬š:9,aŠEff.: %1&,‘ÆÆ@1?,®B«®&?&?,!aŃpØEff.:S9%(¬9-:aŠAcc.: %1&,‘ÆÆ@1?,®B«®&?&?,!aŃpØAcc.:S9J%(°10™w ŠO7‰7a 27qO7s=N7{M7FL7EJ7DH f9//============================================================================= // MODOSTDMScoreBoard. // Copyright PJMODOS (pjmodos@atlas.cz) //============================================================================= class MODOSTDMScoreBoard expands TeamScoreBoard; var bool ShowPacketLoss; var bool ShowNetSpeed; var bool ZP7D; function ShowScores( canvas Canvas ) { local PlayerReplicationInfo PRI; local int PlayerCount, i; local float XL, YL, XL2, YL2, XOffset, YOffset; local Font CanvasFont; local int PlayerCounts[4], TeamPing[4], TeamPacketLoss[4]; Super.ShowScores(Canvas); CanvasFont = Canvas.Font; Canvas.DrawColor = WhiteColor; Canvas.Font = MyFonts.GetMediumFont( Canvas.ClipX ); Canvas.StrLen("TEXT", XL, YL); Canvas.Font = Font'SmallFont'; for ( i=0; i<32; i++ ) { if (PlayerPawn(Owner).GameReplicationInfo.PRIArray[i] != None) { PRI = PlayerPawn(Owner).GameReplicationInfo.PRIArray[i]; if ( !PRI.bIsSpectator || PRI.bWaitingPlayer ) { PlayerCount++; PlayerCounts[PRI.Team]++; TeamPing[PRI.Team] += PRI.Ping; TeamPacketLoss[PRI.Team] += PRI.PacketLoss; } } } for ( i=0; i<4; i++ ) { if ( PlayerCounts[i] > 0 ) { if ( i % 2 == 0 ) XOffset = (Canvas.ClipX / 4) - (Canvas.ClipX / 8); else XOffset = ((Canvas.ClipX / 4) * 3) - (Canvas.ClipX / 8); YOffset = ScoreStart - YL + 2; if ( i > 1 ) if (PlayerCounts[i-2] > 0) YOffset = ScoreStart + YL*10; Canvas.StrLen(PingString$": ", XL2, YL2); Canvas.SetPos(XOffset - XL2 - 6, YOffset + 2); Canvas.DrawText(PingString$":"@(TeamPing[i]/PlayerCounts[i]), false); // Draw Packetloss Canvas.StrLen(LossString$": %", XL2, YL2); Canvas.SetPos(XOffset - XL2 - 6, YOffset + YL2 +3); Canvas.DrawText(LossString$":"@(TeamPacketLoss[i]/PlayerCounts[i])$"%", false); } } Canvas.Font = CanvasFont; } function DrawNameAndPing(Canvas Canvas, PlayerReplicationInfo PRI, float XOffset, float YOffset, bool bCompressed) { local float XL, YL; local Font CanvasFont; local DeathMatchPlus DMP; local MODOSPRI MPRI; local MODOSSBServerActor MSA; Super.DrawNameAndPing(Canvas, PRI, XOffset, YOffset, bCompressed); if ( (PRI.HasFlag != None) && PRI.HasFlag.IsA('PureFlag') ) { Canvas.DrawColor=WhiteColor; Canvas.Style=1; Canvas.SetPos(XOffset - 32,YOffset); Canvas.DrawIcon(Texture'Botpack.Icons.GreenFlag',1.00); } if ( (Canvas.ClipX > 512) && Level.NetMode != NM_Standalone) { CanvasFont = Canvas.Font; Canvas.Font = Font'SmallFont'; Canvas.DrawColor = WhiteColor; if ( !bCompressed || (Canvas.ClipX > 640) ) { // Draw Packetloss Canvas.StrLen(LossString$": %", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + (YL+1)*2); Canvas.DrawText(LossString$":"@PRI.PacketLoss$"%", false); } if ( !bCompressed ) { foreach PRI.ChildActors(Class'MODOSPRI', MPRI) { if (MPRI.ShowBonusInfo == 1) { Canvas.StrLen("Nspd: ", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + (YL+1)*3); Canvas.DrawText("Nspd:"@MPRI.Info, false); } else if (MPRI.ShowBonusInfo == 2) { Canvas.StrLen("Eff.: %", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + (YL+1)*3); Canvas.DrawText("Eff.:"@MPRI.Info$"%", false); if (MPRI.ZP) { Canvas.StrLen("Acc.: %", XL, YL); Canvas.SetPos(XOffset - XL - 6, YOffset + (YL+1)*4); Canvas.DrawText("Acc.:"@MPRI.Accuracy$"%", false); } } break; } } Canvas.Font = CanvasFont; } } YX’’’’NYYX’’’’QX’’’’nX’’’’jX’’’’Xż’’’AXü’’’|Aū’’’PX’’’’kXż’’’FX’’’’)Xż’’’\Ał’’’s_ž’’’XFž’’’WXż’’’_X’’’’LXż’’’SXż’’’~ž’’’NXü’’’1Až’’’OAū’’’{X’’’’hXż’’’QX’’’’SXż’’’XY}Xį’’’aX’’’’/~ö’’’sXü’’’Aś’’’nzń’’’fAģ’’’jXż’’’[Xü’’’oö’’’[Uś’’’OUž’’’PAč’’’`Aō’’’LX’’’’OAć’’’IUś’’’oAņ’’’nX’’’’lO’’’’YX’’’’~ö’’’zFö’’’BSą’’’bAö’’’CAų’’’LXü’’’~Uł’’’B_ž’’’W_Ų’’’ ¼’’’}Aß’’’PXü’’’@Xü’’’mUŪ’’’^UŪ’’’LYü’’’^UŪ’’’f_Ų’’’ X’’’’MXü’’’qXü’’’{_ū’’’S±’’’U@ń’’’X_ū’’’Aō’’’GX’’’’R_ū’’’Fą’’’lXü’’’pXü’’’Aå’’’HQś’’’pXż’’’USś’’’RXü’’’y_å’’’%Sś’’’]Xż’’’@@ō’’’FAų’’’SSņ’’’YQś’’’qAæ’’’TAå’’’]Qž’’’MAų’’’vSņ’’’XX’’’’TAņ’’’i_ń’’’ZAų’’’wAł’’’CAņ’’’y_¹’’’Qō’’’D_å’’’ū’’’U_Ą’’’ Qū’’’L~ö’’’uSŻ’’’vUū’’’W@ų’’’uX’’’’i_Ø’’’X’’’’rX’’’’K~ö’’’tAć’’’dX’’’’SXü’’’}@ų’’’a_ø’’’ _·’’’ Xż’’’@ō’’’u_ö’’’ _ū’’’9QŻ’’’A_æ’’’Až’’’Y_ū’’’6~ģ’’’he®’’’<~ģ’’’ZQų’’’gSł’’’|S…’’’QSł’’’_®’’’@Xü’’’x_®’’’0QŻ’’’wSł’’’~Sł’’’@Sł’’’A_ū’’’5Qō’’’iQū’’’t~ś’’’k_ń’’’gzń’’’mXż’’’eXż’’’]_®’’’Sł’’’}ų,s|B‰ NoH– T }H‰īNII‰żNWI‰ūNeI‰óNsI‰@NAJ‰åNOJ!C ]J– b jJ‰čN vJ‰N CK‰N PK‰+N ]K•R jK•+R wK•čR DL•R QL•R ^L•rjL• E yLÖ^FM‰ cUM‰4WcM‰c qM‰6s ~MÖ!BKN– V YN‰6QfNŪ4btN•t DO›#F QO‰gWX‰!E eXŪöbrX‰~a AY@K NYūK [YåX hYūX tY‰čr@ZåK NZ‰)x [Z‰+rhZóX vZ‰rB[óK P[@X ][Ē7Ai[‰rj_ūc x_ūf D`‰ūcQ`‰A\ _`‰åcl`‰@c z`œwGa‰ócVa–7y da‰R qa–.Z ~a›}Jb@c GeīG Te@f aeóc neŪ4V{e‰ūr IfżG Vf–.J cfåc pfåf }f•UJgóf Yg‰żc fg‰ųMsg•+e Ah‰īc Nh•.R [h‰årgh‰żruh–*\ Ci• Q Oi‰ór[iżf ii•če vi•e Cj‰@rPjīE ^j‰'S kjżE xj•e Ekīf Rk‰īr_k›:Xmk–!l EzīX RzīK _zčc lzœūI yzīF E{‰J R{čf _{–?x l{•d y{+f E|‰ PR|f `|+c m|c z|E G}+E T}E a}‰ųcn}c |}żF I~f V~čE c~żX p~żK }~–'e JŪ4hWF eK rĒ.J+K IˆK Vˆ+F cˆF pˆ–.\ }ˆ‰ N J‰œåI W‰‰ J c‰•u p‰œh }‰–?z JŠ!D VŠčF bŠčK oŠœóI |Š‰!SH‹œ@I V‹–!n b‹‰ūDo‹•!A }‹œ~? JŒœ!{ WŒ–!p dŒÓ*V qŒ‰óDG—•~^ U—Ą+tb—–!q Vž‰&J bžČ'V ož–x E©– _ Q©–7J ]©‰M i©É(V v©œī_ L“–?y Y“•čK f“•čL s“•L “•+L Kµœi Wµ•v dµ•K pµ‰D}µ•+K K¶œż_ X¶‰åDe¶‰+Ds¶–k A·–2lM·‰ G\·Ö2Aj·œ H z·Ų-HGøŠ&rOŗ‰@DAĮücOĮØ3T rĀĄ IFĶ–2nTĶÖ J cĶ–e pĶ‰8r}Ķ‰DKĪ•4T YĪ•K eĪ•L rĪ–!o ~Ī–2qKĻ–2pYĻ–2ohĻ‰čDwĻ–q EŠX QŠ–p ^Š•d kŠ–o wŠ–n DŃ•A QŃ–l ^Ń–.[ kŃ•*R xŃ– O EŅŻ!|RŅ•+d aŅ…KkmŅ+X XŲ–7z eŲœ7> qŲżH ~Ų‰S KŁœżI XŁżc eŁ•d rŁX ~ŁīH KŚœīI XŚīc eŚ•čd rŚčX ~Ś§łV4D KŪ“½” F Oå§`V4k#Uš§–V4E9@”“’” T EĶ‰óJ Yל”O f׉óMrל™N @Ųœ™O MŲ“ļ™ v YŲ§¶V4MO䜔N \ƒ§™V4|iƒ‰ūMe£“½¹ F s£‰ūJ y®œ~` FÆ“Š~ZRÆ“Ē~64l³“ė~]`“÷8T}¶‰īDQ¹“žœ O _¹§2V4S$nÄ“Ā¶ u Aé‰ųVvō§V4a Dõ‰åJ e•ųd r…4X~“Ęœ S V„“~!]iŽ‰åMF“Ł`%gT“Ź!J{ œ–N E¤‰żDR¤“Ź~`¤“!f_©“ĶłoEø“ķ!zt¹“Šøn½“ŽøJ¾“Ńø0g¾“Ļø@DæĄNcæÜÉø<+qæ“öµd\Ąœ–O @Ā“~"qLĀ§ÕV4Q#}Å“Ę– T Né“Ķ7Qbó§V4Ssö“Ź7}F”œV C–“7tO–œV C˜§!V4kIP˜“7\ {į§µV4|Wģ– V Sō§œV4P:_ōœ&V o®§”V4b9|®“?Q^č“Ł?%Foé• R uī“ŹjBļ“7 @l÷“Ę¹ T lų–*V @ƒ“Ķ(Mƒ“7;@uƒœm u…‰jA†œ¹` P†‰6V \†§7V4o@i†“ÖÕ5}XĒ4` UŠ“ė2H bŠ… cjŁ“Ć29VMߧ?V4Scą“Š2Cvōœ¹O yõœ¹N Fö§øV4zSö‰@J M’§~V4R:Z’“½– F l¹“Štrħ¹V4q9fĘ