*@6  iF@'Wڱ6NoneWinTopWinLeft WinWidthCaptionHintInternalOnCreateComponent__OnCreateComponent__Delegate ParseOptionCore 3SPNv252 WinHeight OnChangeTDM_Game_3SPNEngine__OnChange__DelegateLMS_Game_3SPNSetTextSystemCheckedColorGame_Player_3SPN CaptionWidth IsChecked GiveWeaponUser XWeaponsGetTextLockUnLock Lighting CollisionKarma MovementForce LightColorReceiveLocalizedMessagePlayerController XInterfacePosYAddServerDetailTintsClientMessageGetFontSizeIndexInternalOnKeyEventGetPercentage__OnKeyEvent__Delegate__OnClick__Delegate ConsumeAmmo ShakeView PlayFiringPutDownIsLocallyControlled AllowFireWeaponFireAgainIncrementFlashCount DoFireEffectFlashMuzzleFlashStartMuzzleSmokeServerPlayFiring ModeDoFire ChangeMap ImageStyle UnrealGameTimerImage StackMode EnableMe DisableMe3SPN GetStringDrawSpriteWidgetInternalOnClickClientReceive ControlsInitComponent bIsUnique bFadeMessageResetPlayStatusAnnouncement GetStatsForOnClick bNeverFocus ImageColor StyleNameClientOpenMenuPosXUnlockWeapons DrawColor TextureScaleOffsetYRestartPlayerOffsetX LockWeapons RenderStyle DrawPivot ReadyToFire bCanThrowAddTab TextColorWeaponPlayStartupMessageAddShieldStrength SpriteWidgetX1Y1MakeColorCodeX2CheckMaxLivesStaticPrecacheY2 ScaleModeIntBoxTextureCoords TakeDamageScaleXGameWidgetTextureGame_PRI_3SPNConsoleCommand__OnMouseRelease__Delegate__OnMousePressed__Delegate bIntSlider GetTeamNumInternalOnMouseReleaseInternalOnMousePressedTDM_ScoreBoard_3SPN LifetimeUnlockWeaponsForClientDelayedAnnouncementNamed CopyArrayA CloseMenu SpectatingInternalCapturedMouseMoveLockWeaponsFor GiveAmmo AnnounceBestAddBotRestartPlayers EndRound __OnCapturedMouseMove__DelegateAwardAdrenaline StartMatchFadeWeapon_SniperRifle_3SPNWeapon_ShockRifle_3SPNWeapon_ShieldGun_3SPNWeapon_RocketLauncher_3SPNWeapon_Minigun_3SPNDrawNumericWidgetWeapon_LinkGun_3SPNWeapon_FlakCannon_3SPNWeapon_BioRifle_3SPNWeapon_AssaultRifle_3SPN CopyArrayBrfade RenderWeight GameEnded ClassNameBroadcastTextYadrenalinePerKillovertimeDamageTimeWovertimeDamage roundsToWinbAllowedAsLastTranslauncher GiveHealth BeginState CallTimeoutEndTimeoutNowbPlayersMustBeReady bRenderWorld RoundEnded DrawTitleBot SetupPlayer NeedPlayersSendPlayerIsOutTextstartingArmorSetStandardSkin ResetLevel InternalDrawPostBeginPlayXstartingHealth GiveWeaponslightningAmmoCountIncrementKillsPlane grenadeCountrocketAmmoCountassaultAmmoCountbChallengeMode MaxHealth bioAmmoCountshockAmmoCountlinkAmmoCountminiAmmoCountPickupClientStopFirekeys AssaultRifleSendCamperWarning RoundTime ClientResetZSendRoundTextStartNewRoundLinkGun FlakCannonMinigun BioRifleRocketLauncherbSpecsCanTalk SniperRifleClientPlaySoundPlayRoundMessage ShockRifleflakAmmoCountBroadcastLocalizedMessage ListBest NetDamage bIsSectionGame_Pawn_3SPNAllowBecomeActivePlayer bReverseFF numTimeoutsImageRenderStyleAllowsBroadcast KeyLabelAliasUpdateSpinnyDudes IsPlayerPawn SettingsRatePlayerStartGetMediumFontForSetupSendWinLostText KillBases SetupCombos SwitchCombos PreBeginPlayGetLocalPlayerControllerGetLocationName ResetClockSuicide CanSpectateCalculateHitStatsWAVSetBrightskinsLogoutMapName NotifyKilledxPawnGetDefaultCharacterGetServerDetailsGetConsoleFontbSkipPlaySoundLoginMenuClassLoadFontStatic bWeaponStay FillPlayInfoHUDTypeFindPlayerStart GameName GoalScoreCheckValidMaleDefault MutatorClassCheckValidFemaleDefaultPlayerControllerClassNameAcronymForceDefaultCharacterSuperExplosionPlayCustomRewardAnnouncement MaleSuicide ShowEnemiesPreCheckForDarkhorseAddGameSpecificInventoryUpdateRankAndSpreadOnline LineOfSight bGiveAdrenSendTimeoutCountText FRIENDLYFIRE ProjectileFemaleSuicideLogoClientSendLightningStatsClientSendRocketStatsFireClientSendFlakStatsClientSendMiniStats ModifyPlayer DeathStringScoreBoardType MapListTypeLocalStatsScreenClassbForceRespawnDead Description IsRelevant MaxLivesSpawnProtectionTimeInOrderAdrenalinePickupBecomeSpectatorMatchInProgressCheckCountdownGUI2K4GetSkin StatsTextDrawTeamScores MutUTCompMPStartKilledClientSendLinkStatsVector GetSpreebBoundToParentSetBrightSkinhealthPerKillClientSendShockStatsInternalOnChangebAdrenClientSendBioStatsbScaleToParentbImprovedShieldGunNumericWidgetMinDigitCountbPadWithZeroesInternalOnClosebRequire640x480UpdateRankAndSpreadtransAmmoCountversionbUseAlternateScoring__OnDraw__Delegate CampDamage ScoreTeamServerViewSelf moCheckBox moEditBoxbUseNewBooster TeamSymbolsroundCountdownbWeaponsLocked FlackMonkeyClientSendComboStatsClientSendAssaultStatsGetTimeoutState StopFire PendingMatch AddGameRules WeaponPickupEndGame SpawnBot PostLoginTeamScoreBackGroundDiscTeamScoreBackGroundDrawChargeBarClientSendMiscStats MaxOutAmmo ADR_KillShowVersusIconMoverLogin overtime InitGameDECO_ExplodingBarrelGetDescriptionText xPickUpBase UnrealPlayerCheckReplacementUpdateScoreBoard bFullAmmobAllowPickupsbAllowAdrenalineFullOn GrayedOutCampThresholdReCamperWarnInterval bCamperAlarmServerViewNextPlayerYouAreCamperMessageSomeoneIsCamperMessageSomeoneIsCamperMessageTrailerPlayersRemainStringLivesRemainingString LMSDataEntry HitSoundSetButtonPositionsGetGRIUpdatePlayerLists SpecListPanels VersusSymbolCombo_Booster_3SPNDamType_Camping_3SPNGetRestartStringDamType_FlakChunk_3SPN DrawTimerDamType_FlakShell_3SPNInternalOnActivateDamType_Headshot_3SPNDamType_Overtime_3SPNProjectileClassKeyDataDamType_ShockCombo_3SPNGame_Bot_3SPNGame_GRI_3SPNGame_Keybinds_3SPNGame_Rules_3SPNGame_StatsScreen_3SPN__OnActivate__DelegateToggleHitSoundsLMS_BroadcastHandler_3SPN LMS_Hud_3SPNLMS_MapList_3SPNLMS_Message_3SPN LMS_Mut_3SPN bDockPanelsLMS_ScoreBoard_3SPN__OnClose__Delegate LMS_Tab_3SPN ClearStatsMenu_AdminLoginPopup_3SPNMenu_AdminMenu_3SPNDisplayLocalMessagesMenu_AdminTab_3SPNInternalOnPreDrawMenu_BrightskinsTab_3SPN TabHeightMenu_GeneralTab_3SPNMenu_HUDTab_3SPNMenu_LMSTab_3SPNMenu_MenuPopup_3SPNMenu_MidGameTab_3SPNMenu_MidGame_3SPNMenu_PlayerMenu_3SPN bCausesBloodMenu_PlayerTab_3SPNMenu_TDMTab_3SPNMenu_WeaponsTab_3SPN PawnClassDisableCombosMessage_Darkhorse_3SPNbAcceptsInputMessage_GameLost_3SPNMessage_GameWon_3SPNMessage_Overkill_3SPNMessage_PlayerIsOut_3SPNMessage_RoundLost_3SPNMessage_RoundStart_3SPN Menu3SPNMessage_RoundTime_3SPN ToggleBar BehindViewMessage_RoundWon_3SPNToggleTeamBarMessage_TimeOut_3SPNMessage_YouAreOut_3SPN EndState TDM_HUD_3SPNTDM_MapList_3SPN TDM_Mut_3SPNWeaponFire_AssaultAlt_3SPNWeaponFire_Assault_3SPNWeaponFire_BioAlt_3SPNWeaponFire_Bio_3SPNWeaponFire_FlakAlt_3SPNWeaponFire_Flak_3SPNWeaponFire_Lightning_3SPNWeaponFire_LinkAlt_3SPN GameplayWeaponFire_Link_3SPNTickSetCharacterNameWeaponFire_MiniAlt_3SPNWeaponFire_Mini_3SPNWeaponFire_RocketAlt_3SPNWeaponFire_Rocket_3SPNDamageTypeHeadShotComboAmmoCostWeaponFire_ShockAlt_3SPN LinkAdjustDestroyTrailsWeaponFire_ShockCombo_3SPNBroadcastHandlerClassWeaponFire_Shock_3SPN HurtRadiusComboAnnouncementNameEffectShieldHitMatTimeResetPhysicsBasedAnimSpawnProjectileDiscardInventory ExecMessage PickTeamSetInvisibilityDrawScoreboard StopEffectRedSpinnyDudeOffset StartEffect UpdateGRIDrawSpectatingHud RestartLevelClientSetBehindViewIsDead SetPawnClassInitGRIPrecacheGameTextures ThrowWeapon PlayTakeHitPlayerWaitingBroadcastTeam SwitchWeaponEffectIsRelevant UnPossessSuperShockRifleFixFOVStopForceFeedback NextStats ShowStatsBlueSpinnyDudeOffsetClientReStartServerUpdateStatsServerUpdateStatArraysFriendlyFireScale ChangeTeamAltFireFlawless_victoryHumiliating_defeat SetPauseGetViewRotationbExtraMomentumZShowMidGameMenuDeactivateSpawnProtection BlueOrAllyADR_KillTeamMateToggleBehindView ADR_GoalBecomeActivePlayerAnnounceScoreIncrementGoalsScoredbScoreTeamKills RedOrEnemybEnableBrightskinsbShowEnemyBoxbShowMyLocationbShowTeamLocation timedOutAMClientBecameActivePlayerTAM Combowhore bFirstSpawnBooster Headhunter ServerTravelbShowTeamHUDScorebar PlayDyingbShowHUDScorebarClientSetViewTargetbEnableHitsoundsClientDelayedAnnouncement BroadcastbAnnounceOverkillDarkhorseSoundOverkillSoundFriendlyHitSound LongEnough bFirstPlayPlayerReplicationInfoClassRewardAnnouncerSkin bEndOfRound AmmoCharge DemoCommandDemoMenuClass DeathMatchSelfSpreeNotecntUnrealTeamInfo TeamGame ComboNamesMinNetPlayersbAllowPlayerLights DMMutatorRecbMustJoinBeforeStart GameGroupSuperHealthMax RulesGroup BlackColorproj bNoTeamSkinsbForceTeamSkinsbForceNoPlayerLightsFirstBloodString UnrealPawnMidGameMenuClass RealTeam CountDownbWaitForNetPlayersNetWait ShieldGunTeamPlayerReplicationInfoKillingSpreeMessageUnrealMPGameInfoNewBotEnemiesbDelayedDamage HatTrick"DelayedDamageInstigatorControllerbForceDefaultCharacter bTournament bWasSpecbAllowBehindView bFirstBloodbStartedCountDownbFinalStartup bKillBots StartupStageRemainingBots InitialBotsLastPlayerStartSpotStandalonePlayer bAutoNumBotsbReady NextDist OtherPlayerLiving bNoneLeft bDemoOwnerSpree bLatecomerbDisplayLoserbDisplayWinner Accuracy KillStringRealViewTargetbShowLocalStats SuicidesNextStatsString WeaponStatsDMStatsScreen FlakMonkeydeathsholdingbAllowWeaponThrowing headcount ScoreBoxA CombosNum AwardsNumWeaponStatsArray MultiKillsCombos combocountNetUpdateTimeInterfaceContent flakcountbPlayOwnFootsteps bBrightSkins OldModulate bCustomBotsAnnouncerVolumeShockProjectilePassv1bReviewingJumpSpotsbPlayerBecameActiveGeneric PlayerCountbotnamePortal CO_Final SquareBoxAgorge ComboDecal RegenCrosses ShockComboLinksLinkGunPickupRocketLauncherPickupOwnerClipYClipX bNetDirty TimerRate Instigator ESoundSlot bNetInitial FlakChunk FlakShellLinkProjectileFlakCannonPickupMinigunPickupShockRiflePickupSniperRiflePickupBioRiflePickupHit bCanceled SpeciesTypexUtilTemp PlayerRecordSecondsSlotOther DeltaTimeComboNameListEventInstigator HitNormalDamage HitLocationxBot MomentumMinAdrenalineCostPlacedCharacterNameStartAdrenalineCostFindPlayerRecordSpecies xTeamGamexPlayerReplicationInfoxPlayerDamTypeFlakChunk ComboSpeed xDeathMatchxp DefaultName MeshName BodySkinName FaceSkinNameDir CurrentCombobInvismaxDim bLoadNow MenuSounds ComboListPawnSetupRecordv2RagdollRagdollOverrideHitLoc RelatedPRI_1PlacedFemaleCharacterNameLastManStanding LMSLogoSmallMyScoreMyKillsGUIPagebLocked HUDContent RelatedPRI_2OptionalObjectGRICamper texturesdenied1 MinigunFireAssaultGrenade SniperFire LinkFireBioChargedFireYLXLRocketMultiFireShockBeamFirePSelfForceScaleSelfDamageScaleKillerMessage ComboSound ComboDamage ComboRadiusComboMomentumTransferData LooseSpread TightSpreadGUIControllerShockProjFire ShieldFire RocketFireMinigunAltFire LinkAltFire FlakFire FlakAltFireDamTypeSniperShotDamTypeSniperHeadShotDamTypeShockBeamDamTypeShockBallDamTypeShieldImpactDamTypeRocketHomingDamTypeMinigunBulletDamTypeMinigunAltDamTypeLinkShaftDamTypeLinkPlasmaDamTypeBioGlobDamTypeAssaultGrenadeDamTypeAssaultBulletBioFire AssaultFireDamTypeFlakShellDamTypeShockComboDamTypeRocketAmmoChargeMaxAmmoChargeRatexPRIMyTeam bTightSpreadfull LastFireTimeComboDamageType AmmoChargeFMinSelfDamage DurationViewer instigatedByValueGUIMultiComponent GUIComponentGUI GUIButtonGUISectionBackground GUIImage GUISlider GUIPanelGUITabControl GUITitleBar GUILabelHudBasePingScore bTeamGame bGameEndedbWaitingToStartMatch StartTimeDefaultPlayerClassNameDiffuseNumSpectators NumPlayersNumBots CurrentID TimeLimit BaseMutatorGameRulesModifiers SpecularmyLevel PlayerID ServerStateMPRIbPauseInOpt StartSpot NewPlayerinClass InCharacterInTeambAdminPCExitingInvKiller KilledPawnScoreBoardDeathMatchbOnlySpectator ViewTargetinjuredOriginalDamageSenderSoundsWinner incomingName BestStart SpinnyWeapTel BestRating NewRatingTeamScorer NextMutatorbSuperRelevant TeamIndexbMatchHasBegunRemainingTime ElapsedTimeRemainingMinuteMapListDeathMatchMapListTeamDeathMatchTeams AdminNameTab_IADeathMatch PlayerText AdminText ReadyText NotReadyText PRIArraypris DigitsBig mySpreadmyRankYouveWonTheMatchYouveLostTheMatch InfoStringOldRemainingTimebPlayRandomAnimsMyPRINameY MenuOwnerBluePRIRedPRIBlueOwnerOffsetRedOwnerOffsetRedPlayerCountBluePlayerCountDeaths NumLivesnetXLCharacterNamescoreXL deathsXL MaxScaling BoxWidth TitleYPos MyControllerMyOwnerBoxXPos DeathsXPos ScoreXPos OwnerOffsetBoxTextOffsetY NameXPos BoxSpaceYPlayerBoxSizeY MessageFootNetXPos OwnerPosFontReduction OwnerPRI ScoreInfoXLTitleXLscoreinfostring titlestring PlayerAreaYHeaderOffsetY bStarted BodySkin HeadSkinCamPosCamRot bIsFemaleDefaultButtonTabC bIsSpectator NowViewing MaxNamePosbNameFontReductionRestartStringGUIUserKeyBindingbWaitingPlayer bReadyToPlayInitialViewingStringTextTopSmallHMedHStatsTabs bOutOfLives GoalsScoredKillsbFoundDam TimeSeconds HudColorTeamMonthTimerDigitSpacerDayHourMinute HudColorBlueTimerBackgroundPauserTimerBackgroundDisc TimerHoursHudColorBlack HudColorRed TimerMinutesbInit TimerIcon TimerSeconds 2K4MenusNetModenewdataHudCDeathmatchHudCTeamDeathMatchCountDownNameLongCountName myEmitterGameNavigationPointList UT2K3GUIPageEnableComponentUT2K3TabPanel UT2K4GUIPage HeaderBase NewControlsControllerList Display1 Display95 BlueScore RedScoretmp Password SentTextbMuteSpectators broadcastermyHUDNextGameRulesbDisplayMessagesLMSGameLocationHistoryNextLocHistSlot bWarmedUp ReWarnTimeLMSData OtherPawn HistoryBox bSentWarning SwitchNum SpreadStyleMinutesHoursP1OldColorModulateP2Spread AmmoPerFire bIsFiringbFireOnRelease NextFireTime CurrentRound OwnerTeam HoldTime MaxHoldTime ThisModeNum spinRateCallerUT2K4Tab_PlayerLoginControls TimeLeftUT2K4PlayerLoginMenuBg bDefaultHS PawnOwnerPRIsb_Redsb_Blue PawnOwnerb_SpecRedTeam BlueTeam PlayerOwner SpawnTimePendingWeapon SelectedItemLastStartSpotbShowChargingBarFireModeClassShieldStrengthFpick WeaponClassAmount HitActor HealAmountHealMaxMenu bRealSpecdtAtteninAttenbVolumeControlbForceAnnouncementLevelASoundNewPawnLastUpdateTimeLastPlaySpeechLastPlaySoundnextNavigationPointbFrozen bBehindViewpClass AdrenalinenextController bWaterVolumedepth bIsPlayerCombobAdrenalineEnabled SetDrawColor DrawRectAnnouncerLevel CameraDistSetViewTargetKillSetPosDrawTileStretchedGetCameraLocationColorModulateloadHealth EyeHeightSkins WhiteColor RedColor GreenColor CyanColor BlueColor GoldColor TurqColorSpeed FireRateBotRefireRate FontSizebStopCountDown HudClassBroadcastHandlerMessagingSpectator LocalMessage GameRulesGameMessageClassMaxSpectatorsbDelayedStartbRestartLevel MaxPlayers PlayerName SetDrawScale SetDrawType GetUrlOption LinkMesh SGDamage AssaultStats BioStats ShockStats LinkStats MiniStats FlakStats RocketStatsLightningStats ComboStatsAssaultPercent BioPercent ShockPercent LinkPercent MiniPercent FlakPercentRocketPercentLightningPercent ComboPercent Headshots WeaponDamagePercent RoundsWon FlawlessNum OverkillNum DarkhorseNum DeathTimeHPAPstartHPstartAPControllerClass percentageType MyDamageType ScoreBoardArmorbCollideWorldbUnlitServerResponseLinebHiddenCollisionHeightCollisionRadiusNMsgLModeTopWidthE PropName ScriptTextABCDjibDisableHitsoundsbDisableSpeedbDisableBoosterbDisableInvisbDisableBerserkbDisableBrightskinsSbAutoRecDemos bForceRUP bTimeouts bTimedoutG teamTimeoutsRbUTComp Location RotationxplTDMGametheGRI ReturnValueBox currentCount endCountotCountMax bIsOvertime bRespawningMin timeoutCount weaponCountlastOneLenTimetoStateDynamicLoadObject xEmitter bEndOfGameacc WeaponFire LevelInfo GameInfo differenceblah TeleporterInventorySpotHUDAdrenPlayerReplicationInfo bMoveAliveGameReplicationInfo Inventoryemptyapk AIControlleralive Controller DamageType bFlawless CampCount winnerindexPhysicsVolume Darkhorse TeamInfo OverkillMutatormyGRINavigationPointHighf1f2Canvaskillswdeathswweaponyawardyyjumpwwidthawidthapos WeaponNumwnamefiredeff weaponBar awardBarnameBarFont BoxXPosOdd LineXPos LineYPosWonXPosLevel RedAliveRedPing BlueAlive BluePingShaderLoS bOverkill injuredPRIprevDamsHPsAPtarget1target2ConstantColor savedBody origBody skinColorpOwner defaultSkin FinalBlendEmitterPlayer TempSkins PlayInfobAutoScreenshotPawn bTakenSSbSmallerInfoBoxesbDisableAnnouncement MaterialMeshReplicationInfoInfoActorbMatchHUDToSkinsbUseOldStatsScreen bFirstOpenCountbEnemyAllyColorsHeightStylePitchOptionsSoundTextureWhiteErrorRoleTagClassPackageOut TextBufferObject Flawless OverkillsDHSGEnum FunctionbSpecsStateRotatorberserkinvisStructName UT2k4Assault XEffects StrPropertyStructPropertyArrayPropertyClassPropertydrawytextxlocyshieldxLC startstats fontMedium fontSmallAlliesFoes friendliesRoEBoA secondhigh playersAlive myroundswon mydeathtime NamePropertyRedSpinnyDudeBlueSpinnyDudeObjectPropertyFloatProperty BoolPropertyRedSBlueSRedCCBlueCCLMSTabTDMTabWeapTab AdminTab GeneralTabbLogin PlayerTabHudTabBSTab IntProperty ByteProperty 3SPNTexv240TabBackground AdminCheckNameBox PasswordBoxBrightskinsCheckEnemyAllyCheck RedLabel BlueLabel RedRSlider RedGSlider RedBSlider BlueRSlider BlueGSlider BlueBSlider RedRLabel RedGLabel RedBLabel BlueRLabel BlueGLabel BlueBLabel RedColorViewBlueColorView SpeedCheck BoosterCheck BerserkCheck InvisCheckHitsoundsCheck SkinsCheck DemoRecCheckForceRUPCheck CamperCheckCampRadiusBoxCampIntervalBoxCampDamageBox EnterButtonAnnounceCheck TeamBoxCheckTeamLocationCheckMyLocationCheckEnemyBoxCheck ScaleCheck MatchCheck HealthBox ArmorBox AdrenCheck AdrenBox PickupCheckWeaponStayCheckSurvivorCheckOvertimeDamageBoxOvertimeDamageTimeBox HPPerKillBox MaxHealthBox AmmoCheckFullAdrenCheckSpecsTalkCheck ReadyCheck RoundBox TimeLimitBoxMapBoxFootstepsCheckScreenShotCheckOldStatsCheckFFBox TimeoutBox roundTimeBox ReverseCheck ShieldCheck GrenadeBox AssaultBoxBioBox ShockBoxLinkBoxMiniBoxFlakBox RocketBox LightningBox TransBoxTestBackground TestHeaderLoginBackground PlayerButton AdminButtonTimeOutButton eCv. - 9:9:$G2LB, t? !# "kfe&=(9:9:$9:9:$9:9:$G 6vt0!\- =1$R<1\4- =1- =1- =1- =1- =1UUUUt0!t0!UzVGBUUA0^UA0^zVGBUA0^zVGBJUzVGBJt0!t0!t0!U- =1U- =1LLULJLLJLҽt0!ҽҽҽҽt0!t0!t0!ҽҽҽҽҽҽҽt0!ҽҽҽҽUzVGBҽҽҽҽt0!ҽҽҽҽҽҽLҽҽҽҽt0!ҽLҽҽҽҽҽLLLLҽҽҽҽҽҽҽҽҽҽҽҽҽҽt0!ҽҽҽt0!t0!ҽҽҽҽҽҽҽҽҽҽLҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽt0!t0!A0^qYt0! & O[l7AI`IH uugqa @sCRFc@.pn|V -g f@c N\q2 a6-sonL:#ڌUZ+j6,e,ezVGB,ezVGBJ3}ɢɢ3},e,eLLLLLLLL,eLLLLLLLLL3},e,et0!,eҽ>ҽZt0!ZZnLnLt0!ZZߢ(aߢ(aߢ(aߢ(at0!: 8 t0!: 8 t0!: 8 t0!: 8 t0!: 8 t0!: 8 t0!/$)Ut0!HH>>>)Ut0!HH>>>UZt0!Zt0!: 8 t0!: 8 t0!: 8 t0!: 8 t0!: 8 t0!: 8 t0!U>>>>U>>>> & v:}CB,AL:}CBJY)AQDEV~[WKILMNOPQRSvQ'Fw0y>b^GLPX?aL a@ D` G@ZBE{2 2_pG-sonL:#$? $L=/'IHy'I}x'I|WF .WI,L'IEz$ף0?$>$? $L=/'KHy'K}x'K|WF .WK,L'KEZ a TQLM U z$ ף>$>$? $L=/'VHy'V}x'V|WF .WV,L'VEz$R?$>$? $L=/'WHy'W}x'W|WF .WW,L'WET~ z$>$>$? $L=/'[Hy'[}x'[|WF .W[,L'[EJ hX@ baRD G HJ w@ e}@ l@O  T PijFc@\  E C A  W ]@Gk T  xdz$>$>$? $L=/'~Hy'~}x'~|WF .W~,L'~EOBMMk @1EPG]zQH\A  a LLXxRt {@E@@ |dr Yxc2^aF݆zVGBzVGB  !# "@]You Are Camping!A] B] Is Camping!LM"X*B'$=]  q Sd@@@a! dZ\2f0Ao>+A0^A0^A0^A0^++  !# "z Fb @h_ n w  I @ibpR @ DL @ qf @ v@ uxKzt2 %z@_ $=$L?Wz K |IhVA^R`c N^IqYԠ)A0^)qYԟqYLA0^A0^A0^ _A0^A0^qYԐ3}3}A0^A0^qY  X[i Fg g v k !l @CU  v@^ Ft Y Zniu bD3TqYԠ̟qYԟqYLA0^A0^A0^ _A0^A0^qYԐ3}3}A0^A0^qY  hu _j_y qYԠ̟qYԟqYLA0^A0^A0^ _A0^A0^qYԐ3}3}A0^A0^qY  \t `h^} W,.qYԠ̟qYԟqYLA0^A0^A0^ _A0^A0^qYԐ3}3}A0^A0^qY   @A @@S[pZT2F \&086"U,e,eB,B,IP ? ptaX[ I GR*{qYԠVqYLɍVɍ  Avk  R Q P   bPYR t*`qYԠ̟qYԟqYLA0^A0^A0^ _A0^A0^qYԐ3}3}A0^A0^qY  L  GdlXU DB qYԠ̟qYԟqYLA0^A0^A0^ _A0^A0^qYԐ3}3}A0^A0^qY  bF H w C@ep$=$u=$u<$Qx? $?F^'Y S[ @ _@ qedW^ 0gqYԠ̟qYԟqYLA0^A0^A0^ _A0^A0^qYԐ3}3}A0^A0^qY  j~Vb E k t@ hfVg [@qYԠ̟qYԟqYLLA0^A0^A0^ _A0^A0^qYԐ3}3}A0^A0^qY  gibUi c3ػ$0qYԠ̟qYԟqYLA0^A0^A0^ _A0^A0^qYԐ3}3}A0^A0^qY  m@o @ mYX2l 3 eQ',eB,B,IP ? j @nu @ m @p @lhYBr Q/,[/$zVGB t?Z =Mx @ J$L?]Lightning ammo count: Ww ]32Lightning Gun ammo count. 0 = no Lightning Rifle.$(?$=$L? $u=v@ fkxK@jVT| $`x6$PqYԠ̟qYԟqYLA0^A0^A0^ _A0^A0^qYԐ3}3}A0^A0^qY  U  q @W @e ccJ]2D Cgչ%t0!t0!IP÷8fIPIPÇA0^t0!3}3}IPÕu)u)u)LLJu)ҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽIPÒu)ҽҽҽҽ8fҽҽҽ8fҽҽҽ8fҽҽ8f8f8f8f8fҽҽҽҽLҽҽҽLҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽIPÒu)ҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽIPÒu)LҽҽҽҽҽҽIPÒu)8f8f8f8f8f8f8f8fLLLҽҽҽҽҽҽҽҽҽҽҽҽu)ҽҽu)ҽҽҽҽҽҽҽҽҽҽ8fҽҽ8fҽk 6nu)8fҽҽ8fҽu)8fҽҽ8fҽҽ8fҽҽ8fҽҽ8fҽu)8fҽ8fҽҽLҽu)LҽLҽu)LҽLҽu)L8fҽҽҽҽҽҽҽҽҽҽҽҽu)ҽҽu)ҽҽҽҽҽҽҽҽҽҽ8fҽu)8fҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽLLLLLLLLLLLLLLLLҽu)ҽҽu)ҽҽҽҽҽҽҽҽLҽҽҽLҽҽҽҽҽҽҽҽҽLҽҽҽLҽҽҽLҽҽҽLLҽҽҽLҽҽҽҽҽҽҽҽҽLҽҽҽLҽҽҽLҽҽҽLLҽҽҽLҽҽҽLҽҽҽLҽҽҽLҽҽҽLLҽҽҽLҽҽҽҽҽҽҽҽҽLҽҽҽLҽҽҽLҽҽҽLLҽҽҽLҽҽҽҽҽҽҽҽҽLҽҽҽLҽҽҽLҽҽҽLLҽҽҽLҽҽҽLҽҽҽLҽҽҽLҽҽҽLLҽҽҽLҽҽҽ8fҽҽҽLҽҽҽLҽҽҽLҽҽҽLLҽҽҽLҽҽҽҽҽҽҽҽҽLҽҽҽLҽҽҽLҽҽҽLLҽҽҽLҽҽҽLҽҽҽLҽҽҽLҽҽҽLLҽҽҽLҽҽҽҽҽҽҽҽҽLҽҽҽLҽҽҽLҽҽҽLLҽҽҽLҽҽҽLҽҽҽLҽҽҽLҽҽҽLLҽҽҽLҽҽҽҽҽҽҽҽҽLҽҽҽLҽҽҽLҽҽҽLLҽҽҽLҽҽҽLҽҽҽLҽҽҽLҽҽҽLLҽҽҽLҽҽҽҽҽҽҽҽҽLҽҽҽLҽҽҽLҽҽҽLLҽҽҽLҽҽҽҽҽҽҽҽҽLҽҽҽLҽҽҽLҽҽҽ8fҽҽҽ8f8f8f8f ? !# "O[lpSD3wqYԠ̐3}3}qYԟqYLA0^A0^A0^ _A0^A0^qYԐ3}3}A0^A0^qY  g@mTRF#IǓqYԠ̟qYԟqYLA0^A0^A0^ _A0^A0^qYԐ3}3}A0^A0^qY  Tac ]Spectators can talk.WJ]DBAllows alive players to see dead and spectating players Say text.$ff&?$L=$>* l @`@NetN3Pt_5~p  f]%o's tent collapsed.^]%o's tent collapsed.T]%o's tent collapsed.\^dQ٘qYԠ̟qYԟqYLA0^A0^A0^ _A0^A0^qYԐ3}3}A0^A0^qY  VAn~oes x VEXYvbM2[{F  !# "LMX*B'$?`Kx]`a`)$x ŸqYԠ̟qYԟqYLA0^A0^A0^ _A0^A0^qYԐ3}3}A0^A0^qY  G @@yzG2c^YiF݌UU7r  !# "LM"B'$`?@z@E2e8F  !# "LMX*B'$`?|QC2f>C{F݆zVGBzVGBJzVGB  !# "LMB'$`?{HD2g;F݆zVGB  !# "LM"X*B'$= W>$Q8?]Minutes per round:Wh]Minutes before overtime.$Q8?$ ?$> $u=$Q8?]Number of rounds:Wi]*)Number of rounds required to win a game.$Q8?$L=$> $u=$L>]Map: Wj]Map to switch to.$33S?$>$@? $u=}XB2k"LF݌Ut0!t0!  !# "y_LMX*B'$=O]Players must be ready.Wn]/.Players must click in before the game starts.$ff&?$ ?$>; ]Load map with these settings.T]SquareMenuButton$fff?$L>$? $)\=/W;Q.Wo,]Spectators can talk.Wp]DBAllows alive players to see dead and spectating players Say text.$ff&?$L=$>; xsJ2q(F  !# "LM"X*B'$= W>mv~`A2tqǿF  !# "LM"X*B'$= W>pIMDisable Speed.Wx]10Disables the Speed adrenaline combo if checked.$)\=$=$L?Wm zD]Full adrenaline.W{]"!Give full adrenaline to players.$z?$ ?$>; wmL2|YF  !# "LMB'$`?}~~AC@h@2DO쾿F݆zVGB  !# "LM"X*B'$= W>= Full ammo.WF]Give full ammo to players.$z?$L=$>; ]Disable Booster.WG]32Disables the Booster adrenaline combo if checked.$)\>$=$L?Wm c P] Force Ready.WJ],+Forces the game to start after 60 seconds.$q= ?$=$L?Wa ]Disable Berserk.WK]32Disables the Berserk adrenaline combo if checked.$= W>$=$L?Wm ,]Disable Invisibility.WM]87Disables the Invisibility adrenaline combo if checked.$)\>$=$L?Wm ]Disable Hitsounds.WN]USDisables damage-dependant hitsounds (the lower the pitch, the greater the damage).$33>$=$L?Wm Z`]Disable Footsteps.WQ]omDisables the playing of one's own footsteps. You can only change this value if you've spawned and are alive.$= >$=$L?Wm ] Call TimeOutT]SquareMenuButton$ ?$>$L>/'zH.WS,Eew2 T l *IF"F\F"F\>F"F\F"F\F"F\>F"F\ & mLSfg'TKJYFJY $E=$=$L? $ffF?]Grab end-game screenshot.WU];:Automatically takes a screen shot at the end of the game.$H>$=$L?Wm ]Use old stats screen.WV]B@If checked, the F3 screen will be the standard DM stats screen.$)\?$=$L?Wm $Q8?]Starting health:WW]&%Set the starting health for players.$ ף<$L=$> $u=$Q8?]Starting armor:WX]%$Set the starting armor for players.$ ף<$ ?$> $u=$Q8?]Maximum health:WY]JSet the maximum health achievable by killing. Percentage. Also changes the maximum health/armor achievable by the modified booster combo.$\?$ ?$> $u=@$Q8?]Health per kill:W[]'&Set the health gained with each kill.$\?$L=$> $u=; $Q8?]Overtime interval:W\]>=Set the interval, in seconds, between players taking damage.$G>$ ?$> $u=] Adrenaline.W]]! Turns adrenaline on if checked.$Q=$L=$>* $Q8?]Overtime damage:W^]76Set the damage all live players take during overtime.$G>$L=$> $u=; ]Challenge Mode.W_]43Round winners start with reduced health and armor.$p>$L=$>; O$Q8?]Adrenaline per point:Wa]0/Set the adrenaline awarded per point recieved.$Q=$ ?$> $u=$Q8?MFriendly Fire:Wc]NLThe percentage of damage a team-mate takes from a hit by another team-mate.$ #>$L=$> $u=* J]Weapons stay.We]Turns on weapon stay.$>$ ?$>; bfl}gr W@m@$L?= Timeouts: Wo]('The number of timeouts each team gets.$k>$L=$> $u=rn@kq~MAllow pickups.Wt]Turns on pickups.$>$L=$>; $Q8?]Adrenaline per point:Wu]0/Set the adrenaline awarded per point recieved.$Q=$ ?$> $u=Z@] Adrenaline.Ww]! Turns adrenaline on if checked.$Q=$L=$>; wBmMAllow pickups.W{]Turns on pickups.$>$L=$>* ]Weapons stay.W|]Turns on weapon stay.$>$ ?$>* ]Automatically record demos.W}]87Automatically records a demo as soon as the map loads.$ף>$=$L?Wa @qU[Ig# A|$A0^LLLA0^A0^qYԐ3}  c"Oz_MXO]Challenge Mode.WI]43Round winners start with reduced health and armor.$p>$L=$>* $Q8?]Overtime damage:WJ]76Set the damage all live players take during overtime.$G>$L=$> $u=* DRlj2 L0p_ddddUUZdddd & mfJY oweJNZ$Q8?]Overtime interval:WO]>=Set the interval, in seconds, between players taking damage.$G>$ ?$> $u=$Q8?]Health per kill:WP]'&Set the health gained with each kill.$\?$L=$> $u=* $Q8?]Maximum health:WQ]JSet the maximum health achievable by killing. Percentage. Also changes the maximum health/armor achievable by the modified booster combo.$\?$ ?$> $u== Full ammo.WS]Give full ammo to players.$z?$L=$>* ]Full adrenaline.WT]"!Give full adrenaline to players.$z?$ ?$>* ]Players must be ready.WV]/.Players must click in before the game starts.$ff&?$ ?$>* KYW$Q8?]Number of rounds:W[]*)Number of rounds required to win a game.$Q8?$L=$> $u=$Q8?]Minutes per round:W\]Minutes before overtime.$Q8?$ ?$> $u=$L>]Map: W]]Map to switch to.$33S?$>$@? $u=Z]Load map with these settings.T]SquareMenuButton$fff?$L>$? $)\=/W*Q.W_,]Use Modified Shield Gun.W`]FIf checked, a modified shield gun is given to players which is capable of higher shield jumps and reduced damage from shield jumping.$<$=$L?PU$Q8?]Starting armor:Wc]%$Set the starting armor for players.$ ף<$ ?$> $u=` $L?]Grenade count: We]Grenade ammo count.$=$=$L? $u=$L?]Assault ammo count: Wf]10Assault Rifle ammo count. 0 = no Assault Rifle.${.>$=$L? $u=q@x$L?]Bio ammo count: Wi])(Bio Rifle ammo count. 0 = no Bio Rifle.$u>$=$L? $u=@$Q8?]Starting health:Wk]&%Set the starting health for players.$ ף<$L=$> $u=j@u$L?]Shock ammo count: Wn]-,Shock Rifle ammo count. 0 = no Shock Rifle.$R>$=$L? $u=$L?]Link ammo count: Wp]'&Link Gun ammo count. 0 = no Link Gun.$\>$=$L? $u=$L?]Mini ammo count: Wq]'&Mini Gun ammo count. 0 = no Mini Gun.$ff>$=$L? $u=$L?]Flak ammo count: Wr]*)Flak Gun ammo count. 0 = no Flak Cannon.$?$=$L? $u=[ l@e V ]Disable Brightskins.Ww]Disables brightskins.$>$=$L?Wa ru]! Match HUD color to Brightskins.Wz]=Wa @]32Force brightskin colors to Teammates and Enemies.W]zxWhen checked, Team and Enemy skin colors will always be the same regardless of whether you are on the red or blue team.$>$=$L?WF Z$L?]Rocket ammo count: WA]54Rocket Launcher ammo count. 0 = no Rocket Launcher.$= ?$=$L? $u=[\a]! Reload map with these settings.T]SquareMenuButton$fff?$>$333? $Q=/'_Q.WE,A>e$=$=$L? $L?\$SI6GHl ]3SPN ConfigurationT]Header $=FIKB]Reduce info box size.WQ]vtReduces the size of the Team and Enemy info boxes by 40%. Note that this may not look great in certain resolutions.$?$=$L?Wz RTUV@}Y\]Disable the enemy info box.W]]=$333? $Q=/'aQ.Wq,yrht]LoginT]SquareMenuButton$ff?$>$L>/'LH.Ww,x@|| ~D ~Bu${.?MCamper damage:WC]VTSet the damage campers take, multiplied by the number of times they've been caught.${.?$ ?$> $u=pDGHKLMNIlT { |$Q8?]Camper interval:WV]JHSet the time, in seconds, between checking the same person for camping.${.?$L=$> $u=RWY][^$Q8?MCamper radius:W`]>=Set the area a person must stay in to be considered camping.$(?$ ?$> $u=n_] $>] Login Name: We]JHAdmin login name, put nothing if only a password is necessary to login.$>$>$> $u=f@gdpkm]Disable Hitsounds.Wo]Disables hitsounds..$>$=$L?Wa z@wh @nsE@LOK]Disable Invisibility.W~]87Disables the Invisibility adrenaline combo if checked.$>$=$L?Wa A@yG@] Automatically log in as admin.WB]76Automatically login as admin when the menu is opened.$>$=$L?We $?]Admin account name:WC]<;Admin login name. Leave blank if only a password is needed$?$=$L? $u=We []Disable Berserk.WF]32Disables the Berserk adrenaline combo if checked.$\B>$=$L?Wa x@$?]Admin account password:WH]Admin account password.$?$=$L? $u=We }$>] Password: WJ]Admin login password.${>$>$> $u=@sw7rw*w GpPy]Disable Brightskins.WQ$L=$=$L?WF NTvb^ VYe Uy] Player MenuT]SquareMenuButton$\>$>$L>/'zH.W],T= Admin MenuT]SquareMenuButton${>$>$L>/'zH.W_,[cdefg`akl]Disable Booster.Wm]32Disables the Booster adrenaline combo if checked.$=$=$L?Wa MDisable Speed.Wn]10Disables the Speed adrenaline combo if checked.$L=$=$L?Wa pqrstMLoad Defaults.T]SquareMenuButton$Y?$>$333? $Q=/'FQ.Wv,xyz{|um @ABCD}kHIEKtc%t2G&t2H,t2I,t2E,t2},t2u G Lnd%n3&n3@,n3A,n3B,n3C,n3D G Nl|%l4w&l4x,l4y,l4z,l4{,l4| G JL aqF%L  wh&L  w`,L  w[ G OkB%k0o&k0p,k0q,k0r,k0s,k0t G PO E4F%O  Hj&O  Hk,O  Hl G Qj]P%j6b&j6c,j6d,j6e,j6f,j6g G SR OgR !R R a/!vU.R B.U6]U%.&.,.,.,.,.Z\U HEU%\&\,\B.U0BU%.&.,.,.,.,.B.U4|U%.&.,.,.,.,.B.U3dU%.&.,.,.,.,.B.U2cU%.&.,.,.,.,.Z\U waU%\&\,\Z\U @`U%\&\,\Z\U S\U%\&\,\iUUhUYUDUcUdUiUY GMT `F%T  @R&T  @N,T  @p G Tf SR(9:9:$ r* J9:X9: r * v-Y9?&  e @=9< fff>L>?wf *Yf 'e $ GUSZGi7v%4v,vSvTv GMOB>7y%4y,yOyPy Gj }yf .j vwf *f vf ,w.j *.j A![$ G Rm \F%m  Sj&m  Sg,m  Sf G l }y\ .l vw\ *\ v\ ,w.l *.l A![$ G o }yZ .o vwZ *Z vZ ,w.o *.o A!k$ G `}r.`* .`$%`**W .`wW *W W ,w.`*.` A!n$ G ^@z$-~ ' GWQiQhbQY_QD^Qc[QdYQiWQYR G r _]vHTw{ *{ $9V%Pz$,Final$$}$,%z$,FinalA$$}$,$p$A%z$,FinalB$$}$,$p$B%/z$,FinalB_0z$,FinalB_1$$}$,$p$B%z$,FinalA_0z$,FinalA_1$$}$,$p$A%z$,_0z$,_1$$}$,%%z$,_0Bz$,_1B$$}$,$$}$,r .$ { r r  G`S@l@w*w*-  K-  X% pr}*}%rb*b* r_*_* S,w*w*SS,I-d_,I-w.I* w.I*)w.I*_.I  wI*_IcwI_, S_bI]S_rIbIf+S%bI]+S&bIf++S,bI]_v_b%_-' Gau#w}*%}-' Gb\q!u-(\] G cZsu-(Z GnX\XX=rI*I.t=rI* O-| @Uu GS \^9:9:$ 2b -(HT-(N]&&-3Q9:r9=9J Team*(--(-N[.--w.t*.t-f;w.C*.C-U-'%q!Dq!Bi G egXEr*U':9:9:$IQ- U{ U3SPNv252.Menu_MidGame_3SPNU Gfj]ru*/ u10Zzul3SPN-TDM.tj GhO% * Y Gis* 4-m wset input home menu3spn-m (b6]9=,d9:6]6]9=,d9:6]6]9=,d9:6]6]$6f9=,d9:6f6f9=,d9:6f6f9=,d9:6f6f$ GjQ{@"-l -Q G dk~ ^E.#S -f  "{~ *~ 9{ * P{A *A  G oPYo/a/!/.-} t ?{ fff?t ?9?,9?T-~ aPS{ t (-~ (aL=( GrJrfJKLMNcw.*.y.k9D G@ mEIR#ZP--9:9:$-EW( GvFf`-@ FVw.*.y.k9D-@  Gq\Z$TJ--9:9:$Q( GsC Je%*- Spectators -S%S7S--C '*SS-C *There are no spectators. GB xAhe-B AB[w.*.y.k9D-B  Gt\z'-R --N - w w-'Q \^w\*-R w\*\Gx-R \ rT*T\#-M T\^G-M r\ r\\\|Q  TsTr-N -(-({---R  GBy}A)rD x  }~D  G{knY]t3r]*k-J  -| .]-l .]-Y -| k-J  -v QBz]z]k-v A@kzAViruszAEnigma zAXanzACyclopszAAxonzAMatrixAGorge9zViruszEnigmazXanzCyclopszAxonzMatrix9r*k  Gorgenr6k*-v k  A6k 6 k nkk  @ nk n GZ }zQ4T - (ZtwZ*wZ*Z-ZNTamika(ZLJakob(' G O|L'|Jakob|Gorge|Malcolm |Xan|Brock|Gaargod|Axon GwLD0G@D0, Gz>, GACMM, GMBwV, GD@i, GEGb,<3-1 ?-(  GFpR-xg--9:9:$-bpu-(T GH@/ -( GJiM/8"w*a  F-' GKN10-(-( G~_0-}-}b GMo}A1:-h -o-E-b-n -a-o -`b G~ INP|Tamika|Sapphire|Enigma|Cathode|Rylisa|Ophelia|Zarina G RPuwD *D a GT@9:.9:$.h,9D...9?,.f,.0f9D.. GN@ F1G@ V6 @ %a+@ U3SPNv252.Menu_MenuPopup_3SPN G D |wi[I9:|9:$D a | | |  afff?'@ GSX=26ru*/ u10u =X GG UH3-c -c b GWK|3-f-fb GX{p3O/a0 {K{-'Jw{*{a10 G ^c Y!{G c  6G c F b  6F b ra[\G F (* GYl]4 r* lwl*la/!d.l_%.l_&.l-'ll! G N [AW&5p r* AmwA*VAa/!d.A-(AA! G `s _Z rZ*/ Z10zZl3SPN-LMS.C-~ .C-]%g6qZhe6sZhJ 6hZh@@zZl3SPN-TDM:.t-e .t-X%g6qZhe6sZhJ 6hZh@@r9*q- 9l r9*w*)_s =l9P O q=Z-u-N Yl9a-N wl*9a/!aw9*wl*1rl9 =% wl9^Z-u9a/!%.-9Y~'? =-N 9a/!a =% w9lZ-u9a/!%.-9Y@'? =-6x Zhw9*wl*1r9l =% wl99r=9P O q=%R Z-uO9?=9?ll9?,209?=9?ll9?,-M 'N w9* w9lw9*w9*.9h Y-M *9?=9?llY=EY9D9?lllrq Y=N rq &6&,6=N rq ,6&,6=N $rq & H&, H=N arq &0&,0=N rq ,0&,0=N rq l & S&, S=N rq &4&,4=N Wrq ,4&,4=N rq &3&,3=N rq ,3&,3=N  rq V &2&,2=N M rq X ,2&,2=N  rq & w&, w=N  rq & w&, w=N  rq & @&, @=N N rq F & @&, @=hR Z-u.9s.lR w* ws* wsR r*Gw*1sD9?h ge, 9?Yge,DD9?Yge,DD w.9*r.9*9MDJ R -M B 9a/!%.9 $ kd w*)_s =l9P O q= G]Sq96ru*/ u10S%S,|SxGame.ComboDefensive-Eu-tSxGame.Combo SxGame.ComboDefensiveSxGame.ComboDefensive S|S3SPNv252.Combo_Booster_3SPN-Eu-tSxGame.Combo S3SPNv252.Combo_Booster_3SPNS3SPNv252.Combo_Booster_3SPN S|SxGame.ComboSpeed-h u-WSxGame.Combo SxGame.ComboSpeedSxGame.ComboSpeed S|SxGame.ComboInvis[-o u-A SxGame.Combo SxGame.ComboInvisSxGame.ComboInvis S|SxGame.ComboBerserk8-n u-lSxGame.Combo SxGame.ComboBerserkSxGame.ComboBerserk SS& G ~s  G_ur@u%u,|uxGame.ComboDefensiveu3SPNv252.Combo_Booster_3SPNu3SPNv252.Combo_Booster_3SPN uu G z?VRIFF/WAVEfmt DXdata/ S mf\K T'183'& S. +Ew IONn@U0 %y1 WId0iӛTGTOͮΞmؠQ4<b( # .KajYL?pphqaAј(<]6*<%jَеQf{]NO5b 8.'ʗ ;"]XJ\nZ6FPuw_ Ww6{'ߋȢǖ[{YtZjxkOKݽtʐٛދ[+4q{ihosTD L0 F?L>0 5KRu&R"VH݂Taޗ, DV{{eK&]\:ӹ؂RԬ,+oh> OЌ^ "cMwVtbyo_F3sׂ]$Ϲtп۵'/56PDk}|~)v]T6} J ~ҮMW|" }QDrDCtp4L$P /~Ns^=U(##P{to N\Eň}YڄjОe΁x/m|m=S>8*,,#"& '89r y4,ABg=mAVv}Vi'RB@DD;$BwO.1"u t[AXdktvkYU@m!K tĮY|%Ԑ>2'DT,V$QQ?Zug'tzyvr2l=f\L9*'(N}2"rچką7Rռ72cDMpS ZSfu{teY|Us]%jl9d]X*L@4#w @wg߼բ飨b6ރ( k.;H[aA]Y|_m{W~3raVwQ3NYFb54!(VTRzq* H;Ew]3"j$*%6JMblp*qble[Q Fh8X-),H,! "l/7x}gϥɑɚƥ50&- #29@GF~?9):IBOWsWM:$!jkE_čsK 1v%- O1&@`E=/&(1-994g12561b&yvĖ«=ORƼ|t]1c#-0 -)(,e49;6-Q),c1343z0|,% ]Vuٖёĭf׎>- +֟ߤNAA#>LJE;2_/$1]2/ -/}45q0(!!!\RFZdġȮ4gDҸΔ+Ҍp% f&O/3;4<3<2183k3H0H/3:=:.|iY fVR֐ҳѱ>cFk-z1"*4G;@EJCONF6:)#^'-/M&]5e?tȨlǸ[(!qF7L Z#],j5=>?=>CsLBTTWQC2!\ 8O,~OҦ/1?츧gu  AQ#)B+'%*6F RPUPIWECB>7/&J +l Z#أǖ[HJIu g!&0=I`MPGt>9;B IJI'IIGHVbgbWtJo ֳHAu!mQ#q*(,+-N4:>HNNuJEAAuDDB@8,r ڟzI>ƐƽiN§UjJ/tw$06/q(- gnwpߒ<ۮׄd"aZ3 xݖ MT#*168d;.>@CB=4*zft|u1}eʦ6h0,Eܴu  "+38-9f767L:'=]=,:5T0+'&#G?ߗ9ƄV ǧǸZ/"\\<7(0% HP6T n7*ژB+ys#.w684.)>*d/:6:h ]]l4Cƨvϲ՜j(lRB1&@iGGDA @?<701+Y&!+ })8ڂlξ KHı´>@}ԂW=K"!"%&)0]9`@BVA=o9p4.W'  M[RVGغ˗4!ey1E)Ap t"%+ 02-6':=?a՟U/ -Ce:#)X17:195O20x/9.+(&#K `<ĠDͻ͘˿P!hԘpAe% -c7:b:877e7z4 0,)%"f- 1b_we]+ͽ]Yyu| X8%,3P8&975C2z.)"O.JR 7TWp')Ȋ Ğ=| *^\N . m h P0 %),0$576N3-((|! -i)yqn@uȫʵw{g}Ar h="$$8&N)R-00/ .,L+_)$m![nRިG܁Hp/Y˘!&ґ*q)z9p ("&+/22/,))*+*'$ 3 PaIŨȣ1>ήчԇ<^muj"),,-083y54F1,($|!-  ݣֹ.2WƔm2֤ !wsc k *3v9:a84^0\,>(0#tG] [ux>ʏծ[ / !%$'(#)_*, 01+00-(="o&Y` +إӨ516Tѽգjr#) >\`!b @W#(,-].-m+f($%H TJfNyeҤz`ԶTy|Dކ6^a ]E%a,01B0-+D+u*(&V$Q"0gx=&{цzϗK?`cH)01t1000/,x)&]$!Xi|  s _`/alI_өck߶i [sZ0" )H.1$1/-+o'"z~ m G]ۥX Marڅ{XUS$ ="U%([,e/:0.*X&8!> ?/`3~ۻ}wΟEw}u+7j Pc3o t"%|( **+)C( '% #Vi< "Waߟq ,oС{UY@ݝ'PG "&*+^+(?&%0%&@&$!sm}`7V+AqUѲq֦رڰ2$0o %.'')b+-.a-*&|"4;/^ w(yj4^[g;O^߀M:lT knW'L/P3|30-)& "Z j\iiy [Ԓ8 P2^o P!7$)%%&)8+++*;'"ew OPJ޷ѣLgoJKy6 |CL;!%f()o)%(%"*n ]7<އڟؐ՟Ӳ%_`5^Q< =#(+r,*)'&%#! %E@FҨ}Ծձԭ`Է=z,&&/VE>'+,,,,+.*'$~"p D w~rH-۔dC3"cr  !&*,N,+8)<&"  bBL?45()],%]Gv@ 1"%(V++)%!F/; IrSj٦QW0kY <~";%J& &C%G$+#!*< 1nRYoI2#ԠKN{طݣ$8  UN#<&z'q&$%"!!"" 1I iu2+08ѬaHՐ٤}ݕH!##U%') *S($!$m (%j۳auӺФϗ(Օ"';;/ C\%++.-+/($! X1rae&$ٴ՞^ҢҘE+Ta7W = (!!#%'`'|%i" 0p.#pۏ=ҝ$n#< Iizd#%%_%$!] VP1ߓ;?׈چlha) ')!k%p'Z'&$##!U f LSQ<P<ׄ5پJ׶֮/'.Z `#'''a''''|%# (e) y d .ݴصiJՅ=i<M W#&'+'&&)$!DA 2 nsR2NFrpԤLՍf+eG~Du &1{oE"8%&4&$w rTHw~po=ۻּ׺q\qp '/Cj/!!R! B U# `0"S|)َ#fܠX8$F3 I]!! %ima H=L՚mXێQj!#%$"$ P(x .AhJ߀JvP؅ڡ k= "P'((%[# M{ =lSjٟשm@ !]T[ \yS "##X!SY|$[`W  9DZ4 !I"!^ H<6C iO i5}ۡ 'ݝݔ ߲=Y8[ D7"9$ $"! - }HXaّڋzE4ےWJlVO '"$$$$$6$" q? D{!'2q9y`6Ikؑ۵ޱzP {N:!$w%$#!8k8 xAmل֤׃7ݫUZ5+~0 Lv!#$X$! M8BR? $ڢا WTl1 D w ' vD  wcZKڵ{ۉ$G  $!"C  .dai_e<׌֔q؍ ܯA $qR "##!RD TIߺjշG}ۯ(-E(J1 Y"t&'|&D$!-kG txBWIV.@fc(7  R)x!:!"!b 1_pw=d ݠS>MHq$Jx   5! B|b Y y1[~! Rߪ!`A`B b5!""\!2 MH (~N޸XeA!D  !"7#6#C#M#" w /# q$ՏzBL.[$2d  #l#"!9/)  %.D& ;٠xMތB%>9Dff>^9D9?BL=9?>r9D9?B?9?>s9D9?B?9?>~9D9?B333?9?>Z9D9?Bfff?9?>p9DL=J9D333>OJ"g9D;T9?g$xQB%E% %P 8& Ab(333?6$Z6$cb(>M9? 9?,9?%6$c6$@ 8 8,b(?6$dO9D9?> 8 8,P )9?B9?O" x9?>9?)9?E9?O" x9?>, ?-9?E9?O" ,x9?>, ?49?E9?O" ,x9?>, ?09?E9?O" x9?>, ? A6$6 .9?E9?O" 9?&x9?>, ?79?E9?O" 9?9?&x9?>, ?;9?E9?O" 9?9?g A6$x9?>,?@9?E9?O" 9?9?g9?&x9?>,? OJ"xTB9D ?EB,  %8 7& Bb(333?6$o b( ?Y 9? 9?,9?%6$o 6$@ 7 7,b(?6$dO9D9?>  7 7,8)9?B9?O" x9?>9?)9?E9?O" x9?>, ?-9?E9?O" ,x9?>, ?49?E9?O" ,x9?>, ?09?E9?O" x9?>, ? B,.9?E9?O" 9?&x9?>, ?79?E9?O" 9?9?&x9?>, ??9?E, 9?O" 9?9?g| Bx9?>,?D9?E,9?O" 9?9?g9?&x9?>,?  OJ"B%.+$@b(@?6$5Qw?sh= Y?@6$a6$6$69=,5pG=+=69=,@%QHz??'@sh=%QHz??@@%QHz??@%QHz??'@@sh=%QHz??'@sh=%QHz??Fo=sh=9?,b(@?6$ETo=sh=F ף<sh=9?,%THz??F ף<sh=9?,%THz??/ ף<9?,%THz??/ ף<9?,%THz??F ף<sh=9?,%THz??/ ף<9?,%THz??$o9?O9?u&9?"9?.+aSCOREa @au c @p9D ?$9?p,9?J,6$T9?>,9?9?p,9?J,T9?>,?#9?p,9?J,T9?>,?p%$9?p9?J,6$Q9?>,9?9?p9?J,Q9?>,?9?p9?J,Q9?>,?$9?^9?J a'"9?r?a 9?J aSCORE'"9?~?c 9?J au '$+9?^ ?9?J a'99?r?a  ?9?J aSCORE'99?~?c  ?9?J au 'mfff?9?r^ % 8 K sa K@m-a' [C-a A8AKAsaAK@Cm-a' % 8 K sa K@m K K9Dm9?} K J A8AKAsaAK@ mAKAK9Dm9?}AK$&?9?O,Z9D9?O?9?@ %" 8!A8! s-t!e-9?^9?"9? 9?Za K' )! %)# 8#A8t" s-t"e%a9S9D s@;9?r?9?"9? 9?Za9S9D s' %" %% 8 %A8H$ s-taDEAD@:9?~9?,9?"9? 9?Z aDEAD' %eaALIVE@:9?~9?,9?"9? 9?Z aALIVE' M#emfff?9?r^ %% 7 K za K@%m-a'% J%2&-a B7BKBzaBK@2&m-a' %& 7 K za K@&m K K9Dm9?} K 9&q'B7BKBzaBK@q'mBKBK9Dm9?}BK$&?9?O,Z9D9?O?9?@ %) 7(B7( z-t(eD9?^ ?9?"9? 9?Za K' ( %F* 7<*B7z) z-t)e%a9S9D z@R9?r? ?9?"9? 9?Za9S9D z' +) %_, 7U,B7|+ z-taDEAD@Q9?~9?, ?9?"9? 9?Z aDEAD'U,eaALIVE@Q9?~9?, ?9?"9? 9?Z aALIVE' j*e9?^9?N.8,Z9D9?>-9?^9?"9?89?ZaRed Team'a9S[ @;9?r?9?"9?89?Z a9S[ '(appp9SX  / 9S8@:9?~9?,9?"9?89?Zappp9SX  / 9S8'.9:9:$a9Sl@:9?Z9?,9?"9?89?Z a9Sl'Z9D9?>T17,Z9D9?>D9?^ ?9?"9?79?ZaBlue Team'a9ST @R9?r? ?9?"9?79?Z a9ST '(appp9SS  / 9S7@Q9?~9?, ?9?"9?79?Zappp9SS  / 9S7'=19:9:$a9Si@Q9?Z9?, ?9?"9?79?Z a9Si'Z9D9?>o19:9:$ aPING_ @"9?Z?_ 9?J aPING'99?Z?_  ?9?J aPING'B4- %I3 82 s-u2u9S,9: sau@:9?Z9?,9?"9? 9?Z au' q2 %?4 73 z-u3u9S,9: zau@Q9?Z9?, ?9?"9? 9?Z au' P3s6 %O5 8~4 s-u4uau@49?Z9?,9?>uNRau@:9?Z9?,9?"9? 9?Z au' I4 %s6 75 z-u5uau@59?Z9?,9?>uNRau@Q9?Z9?, ?9?"9? 9?Z au' V5 G Ekm  -m ' G m7 -m ( G n` -m ( GlvVoDC mV9? k www.3SPN.comqwr*Ep9S6rrh rounds wins the match!VaEi 6V$6V$B6V$p6V9=,.-E ??.-E O9D9?,Vsh=9?,V6?Vi 9?O9?,V aE'O9D9?9DV9?,Vsh=9?,Vak OV6?VO9?O9?,V ak 'V.+V6V$@6V$16V$!6V9=,VarYi V0V #=Vw?VarY' Gp  -p ' G s? -p ( G ty` -p (y Gxvx}W..<WGv%q.<WGv&q.<WGv%R.<WGv&R.<W6%q6.<W6%q$.<W6&q6.<W6&q$w6%n*.<WGv%nw6&n*.<WGv&nlvF%F,7rF*F6FnF.<W6Ft 9DFwF*6FnFF.<W.Uv%t .<W.<W.Uv&t .<W Gu xl+/.<.Gxs Gq  -q ' G y= -q ( G zj` -q (j GB}pr=I.}-)f-'+(BBf-'r.}^.f^'DD.}^.f^}f'DB}f}-f-'?&}-(?=f-'?'D(( Gv  -v ' G E -v ( G @C` -v (C GHvZ ?rp*/ p10`^.y%7d d -z[d rd ^yzz^-9?z9?L9?,iQ9D9?,^{9Dz?L9D9?%9?{{9D33s?Y9D9?L=9?{G 9D9?L\"?9?{w 9D9?L?9?{F 9D9?LE?9?{c 9D9?Le?9?{d9DL=M9D=L9D;9?Li9D;,9D< 9?X,9D=QMi,$.+% zb(? 9?9?,9?&ONLdHL, b(33>#OKL%H%Wyb(?6$)9?L9?Q,iO9?{9?,)9?H9?Q,iO9?{, ?-9?H9?Q,i,O9?{, ?49?H9?Q,i,,O9?{, ?09?H9?Q,i,O9?{, ?{y.9?H9?Q,i9?&O9?{, ?79?H9?Q,i9?,9?&O9?{, ?<9?Y,9?Q,i9?9?,a9S&';9?H9?Q,i9?,9?Lq9?9?,9?&?9?H, 9?Q,i9?,9?LyO9?{,?@9?H9?Q,i9?,9?L9?& 9?9?,9?&D9?H,9?Q,i9?,9?L9?&O9?{,?tL%.+$@b(@?6$5Kw?sh= Y?@6$6$}69=,69=,5uG=t=69=,@%KHz??'@sh=%KHz??@@%KHz??@%KHz??'@@sh=%KHz??'@sh=%KHz??Fo=sh=9?,b(@?6$ENo=sh=F ף<sh=9?,%NHz??F ף<sh=9?,%NHz??/ ף<9?,%NHz??/ ף<9?,%NHz??F ף<sh=9?,%NHz??/ ף<9?,%NHz??$o9?Q9?z&9?,i9?,.+aSCOREY^abZ^$9?d,9?M,6$N9?{,9?,9?d,9?M,N9?{,?#9?d,9?M,,N9?{,?$9?Y,9?M aRANK'Y,-9?Y9?M a'"9?G ?Y9?M aSCORE'aWINSg^"9?w ?g9?M aWINS'"9?F ?Z9?M ab'Efff?9?G Y%Sz`[a`g^IgE-y 'S-y  yzy`y[ay`g^gE-y '%oz`[a`g^egE``9DEg9?}`yzy`y[ay`g^gEy`y`9DEg9?}y`$&?9?Q,9D9?Q?9?,^%hz^yz[-q @-9?Y9?,i9?9?a`'%zyz[-q @%a9S9D[g^;9?G ?g9?,i9?9?a9S9D['%zyz(a9S.[^g^:9?w g9?,9?,i9?9?w[-q @a9S.[^%zyz[-q aDEADg^:9?F g9?,9?,i9?9? aDEAD'@aALIVEg^:9?F g9?,9?,i9?9? aALIVE'@9?Y9?H9:9:$ aPINGX^"9?c ?X9?M aPING'{-%xz[-kk9S,9:[akg^:9?c g9?,9?,i9?9? ak'<%<z[-kkakg^:9?c g9?,9?,i9?9? ak' G wE  -E ' G E7 -E ( G Fw` -E (w Gb5oB59?  www.3SPN.comqwp*wp9S6rph rounds wins the match!5awB N65$A65$#65$}659=,.-w B.-w .|@ O 5yz @N5a@ t N5>?5t 5 @N5 a@ ' @ j 9D9?,5sh=9?,56?5B 9?j N9?,5 aw'j 9D9?9D59?,5sh=9?,5a t N56?5t 9?j N9?,5 a '5.+565$@65$165$!659=,5apYB N505 #=5w?5apY' GNtC2R3r*.3r* W.-_  r*.-\ .-w.*..Jr* .-\ (c9?, N'F6F$L b(?6L $ .r * &CL ;Cb(@?6C$&9D #<9D<H9D33s?g9Dff&?!9D>I9D9?! 9D=9D>$9D<9? F'f?9?9? '%f??9? &'%f??"?9? F'e?9?"?9? '%e??,?9? &'%e??+%)\=9? &'apKills: 9S%Ga>9? &!apDeaths: 9S9D%p>9? &!apSuicides: 9S %?9? &v9?9?%0%p9S9D9?9?B%apEff.: %+?9? &$appAcc.: 9S9D D%%Q?9? &$apDam.: 9S' Y 9D>9D<g9D(|?9?9?gCf9?H9?H9Du?9?g'f9?H@9?g,'f9?H@H9D33s?'+ a$9?H9?, 9?g& a'g9Du<9?gCf9?H9?H9Du?9?g'f9?H@9?g,'f9?H@H9D33s?'+ a$9?H9?, 9?g& a'H9D?9D<+U -q% , 9:%q\ % , 9:%q  ,q ,q),qE,q`%q{ c%q d%q i%q9?I9?Fe9?!9?$9?I9?!u<9?''e9?!9?!u<?.9?I9?!u<9?&'e9?!9?!u<?''9?I9?!<9?& aAwards)q%&Cq9?9?,9?%b( ?6$b(33>6$)9?I9?&e9?!9?'99?I9?!u<9?&'e9?!9?!u<?C9?I9?!u<9?&&'e9?!9?!u<?F&''9?I9?!<9?&-a &'9?I9?!<9?&%,9:%Japp  jx9R&'9?I9?!<9?&'9?I9?!<9?&%,9:%Aapp jx9R&'9?I9?!<9?&'9?I9?!<9?&L,a &'9?I9?!<9?&,a &'9?I9?!<9?&*,a &'9?I9?!<9?&%=appFinal Kill!jx9S&'9?I9?!<9?&<,a &'9?I9?!<9?& c%CappFlawless Victory!jx9S c&'9?I9?!<9?& d%;appOverkill!jx9S d&'9?I9?!<9?&) i%=appDark Horse!jx9S i&%i,_9:%M 0&9?I9?Fe9?!9?$9?I9?!u<9?''e9?!9?!u<?.9?I9?!u<9?&'e9?!9?!u<?''9?I9?!<9?& aCombos=M %&M y9?9?,9?%b( ?6$b(33>6$)9?I9?&e9?!9?'99?I9?!u<9?&'e9?!9?!u<?C9?I9?!u<9?&&'e9?!9?!u<?&''9?I9?!<9?&%=,39:%Aapp jx9R&'9?I9?!<9?&x9? Ff9?g9?9? 'H9D9?gG?f9?H?9? &'f9?H?'K9?HL=aFiredb9?H>aHitU9?H= >aAcc.a9?Hq= ?aDam.O9?H(?aKillsG9?HG?aEff.h9?Hfff?K9? & aWeapon'9?H>9? & aFired'9?H= >9? & aHit'9?Hq= ?9? & aAcc.'9?H(?9? & aDam.'9?HG?9? & aKills'9?Hfff?9? & aEff.'D%P P"% Y%D"% 6%D", 6%D"%  H%D#% 0%D&#, 0%DC#%  S%D`#% 4%D~#, 4%D#% 3%D#, 3%D#% 2%D#, 2%D$%  w%D.$%  @%DI$ h%D&&D$9?9?,9?%b( ?6$$b(33>6$'9? &f9?g9?''9? &f9?gG??19? &&f9?gG??P$(% Y% &'K9? &aShield Gun:'9S YaO9? & a'P P9SaG9? & a''P%0%'p9S9D9?9?P9?,d%ah9? & a'e+% 6% &'K9? &aAssault Pri.:'9S% 6ab9? & a'9S& 6aU9? & a'9U-9?% 69?& 6aa9? & a'9S, 6aO9? & a'P P9SaG9? & a'*P%0%+p9S9D9?9?P9?,d%ah9? & a'-, 6% &'K9? &aAssault Alt.:'9S, 6ab9? & a'9S, 6aU9? & a'9U-9?, 69?, 6aa9? & a'9S, 6aO9? & a'0%  H% &'K9? &aBio-Rifle:'9S%  Hab9? & a'9S&  HaU9? & a'9U-9?%  H9?&  Haa9? & a'9S,  HaO9? & a'P P9SaG9? & a'z0P%0%0p9S9D9?9?P9?,d%ah9? & a'G4% 0% &'K9? &aShock Pri.:'9S% 0ab9? & a'9S& 0aU9? & a'9U-9?% 09?& 0aa9? & a'9S, 0aO9? & a'P P9SaG9? & a'3P%0%3p9S9D9?9?P9?,d%ah9? & a'6, 0% &'K9? &aShock Alt.:'9S, 0ab9? & a'9S, 0aU9? & a'9U-9?, 09?, 0aa9? & a'9S, 0aO9? & a'19%  S% &'K9? &aShock Combo:'9S%  Sab9? & a'9S&  SaU9? & a'9U-9?%  S9?&  Saa9? & a'9S,  SaO9? & a'9SaG9? & a'<% 4% &'K9? &aLink Pri.:'9S% 4ab9? & a'9S& 4aU9? & a'9U-9?% 49?& 4aa9? & a'9S, 4aO9? & a'P P9SaG9? & a'<P%0%-<p9S9D9?9?P9?,d%ah9? & a'>, 4% &'K9? &aLink Alt.:'9S, 4ab9? & a'9S, 4aU9? & a'9U-9?, 49?, 4aa9? & a'9S, 4aO9? & a'B% 3% &'K9? &aMini Pri.:'9S% 3ab9? & a'9S& 3aU9? & a'9U-9?% 39?& 3aa9? & a'9S, 3aO9? & a'P P9SaG9? & a'AP%0%Ap9S9D9?9?P9?,d%ah9? & a'QD, 3% &'K9? &aMini Alt.:'9S, 3ab9? & a'9S, 3aU9? & a'9U-9?, 39?, 3aa9? & a'9S, 3aO9? & a'G% 2% &'K9? &aFlak Pri.:'9S% 2ab9? & a'9S& 2aU9? & a'9U-9?% 29?& 2aa9? & a'9S, 2aO9? & a'P P9SaG9? & a'!GP%0%MGp9S9D9?9?P9?,d%ah9? & a'I, 2% &'K9? &aFlak Alt.:'9S, 2ab9? & a'9S, 2aU9? & a'9U-9?, 29?, 2aa9? & a'9S, 2aO9? & a'-M%  w% &'K9? &aRockets:'9S%  wab9? & a'9S&  waU9? & a'9U-9?%  w9?&  waa9? & a'9S,  waO9? & a'P P9SaG9? & a'LP%0%Lp9S9D9?9?P9?,d%ah9? & a'{P%  @% &'K9? &aLightning:'9S%  @ab9? & a'9S&  @aU9? & a'9U-9?%  @9?&  @aa9? & a'9S,  @aO9? & a'P P9SaG9? & a'OP%0%)Pp9S9D9?9?P9?,d%ah9? & a'/R h% &'K9? &aHeadshots:'9S haU9? & a'9S h,aO9? & a'9SaG9? & a' G O  -O ' G K; -O ( G LH` -O (H GTFP\M%N%e%e7r6 eFM6 eN6 ee GP  -P ' G Q= -P ( G Rb` -P (b GfH-1H9?%BaHB G ZUCKfU}Q  7U-U-c4wc*d.cwd*1rdU6d-d-_UdQ Bccecwc*d.cwd*1rdU_UdQ BccK GV  -V ' G W9 -V ( G XB` -V (B G `UvF/ ~ 10-fU}U  Yw.U*N.Uw.U*N.U-6G~ h(jN-N-igwi*Y.iPwY*6Y-Y-_NYU W iiiwi*Y.iwY*_NYU W ii~CiCwi*Y.i,wY*_NYU W ii GX   -X ' G ]A -X ( G ^D` -X (D G T f- w.T * .T -@.T -.T -(Cw*  GlLI"LKIHG G!@ S K{---.-\ - GdOh-a/!g O Gc ePMD6.-f.-z XP GfgX?KRb(.]9?,Pb(.f9?,6R66P6wr* 8-3w.* w.*)w.*a.5 ^aa%6%86&,6%6&,Z6&46%6%,6&~.-x.-da%PR%6%P&6%P%6&R&6&RPR%6%R&6%R%6&P&6&PRP%6%%&6%%%6&&&6&&.-v }?}?X%X7[.XXr[*r[*[-r[[a[-Gp[[a[-HE [XG% H% _ 9DP<}c9D9??}9?,G 9D9??}9?,_.-f G%|9D)\=p9D9?,}j9Dp=>}V9D<}H9D9?,}L 9DR>}b.-xPb(P?Rb(R?'.-da%?R6?$#Ab(R33#@6A$$?P6?$#Ab(P33#@6A$_?P6?$#Ab(P33#@6A$Da%6?$x6?$6?$6?$6A9=,6A$F6A$ 6A$D6?$6?$6?$d6?$#6A$d6A$6A9=,6A$.-{ ?9?|[9?j9?V6$9?|[9?j@} .-{ 9?|V[9?j?+cTp}?9?jpRuaRL^O LTT c?9?jpRpR9DTL9?}R...aRL^9?p9?|H aR'||V .-z V9D=}?9?| [9?j9?VGX%XG+cRXpT33s?9?L paRL^5 LTTY?9?L pRpR9DTL9?}R...aRL^)9?p9?|XVH aR' .-z +G Tp}?9?jpRXpuaRL^r LTTY?9?jpRpR9DTL9?}R...aRL^49?p,9?|XVH_  aR'`XpyXpkaXpO XpP `a69=,9D9?9?a`9?a9:6,69=,9D9?9?`9?a+c)9?L 9?|XVHap9S`'A#9?|X&VX&G[9?j?XL 6$ 9?|XV[9?j@}H%.-z |9D)\=p9D9?,}j9D)\>}V9D<}H9D9?,}.-x.-da%?P6?$#Ab(P33#@6A$?R6?$#Ab(R33#@6A$?R6?$#Ab(R33#@6A$va%6?$6?$6?$d6?$#6A$d6A$6A9=,6A$6?$x6?$6?$6?$6A9=,6A$F6A$ 6A$6$$9?j9?|S 9?j@}?$9?j9?| S 9?j9?VH+cX%XHRXE Tp}?9?jpaRL^LTTL?9?jpRpR9DTL9?}R...aRL^@L9?p9?|XVH aR'A59?j9?|X&VX&HS 9?j?X6$29?j9?|XVS 9?j@} GhjkF YOU ARE OUT! G rWID"WVUTR G!@nop\ F D"\ %TimeOut is ending...pTimeout ends in... 9S\  G ylI"lkjig G!@tuvwxF YOU'VE WON THE ROUND! G \ IY\ .OK &.\ ($'\ K vtr G!@{|}F %pWeapons Unlocked in...9S G GOI&"OIHGD G!@ABCDiFt-*@SrF*F%FwF* Fx, F&,<O,$',O,$'=,O,$'==, %O&$' GEF Weapons Unlocked! G OtI"tnmkd G!@IJq {h -a/!g { GzLCt@SrC*C%CwC* Cx, C&,<O,$',O,$'=,O,$'==, %O&$' GMF %pz WON THE ROUND! G  NmQ/j?j%hjShj6 66$GmGm Gm 66,P66,P6%6%6&6&%hhhhhUm6hh, 666666,(66,(6%6%, 6&6&, Gm%Gm&_ h,<h_ ,<6_ ,<6h,<UmUm GWWIDr^ *69=,69=,69=,^ %69=,6$K6$K6$K6$69=,WV^ I} G!@RS^Pyn *- lv maWJdT dBaWJ@T @zT o9?,zBz9?,9?,6C6HC66 Co9=,9=,9=,9=, z6C}o9?,Ro9?,$4a CBCBCC$w.* w.*$ 9=,$ 9=,9?@CB@?} a (aq JB&9?,J}aq 9=,9=,$9=,m%CB@?}@)a.(vp9S..^avJB-9?,J}@ av(9=,9=,9=,9=,maJBF9?,J9?,oz9?,B9?, a(BaRJB,9?,J9?, A9=,9=,9=,9=,6CaRG %M% M7RwMR*!MR-!MR-!MR-G MWvp9SG vavJB99?,J9?,o9?,Bavv  GUF p^ IS OUT! G ^\IXj\dxxLg\a/!.\-s.\ So$ G!@YZ[\o]F\Overkill! G z? X RIFF(WAVEfmt "VDfactdata (&02.xjfft:x8DNZl\tJ|Z&FHX2*ZfB$Rv < 6 ` 6 R $  P t P D r ,  D { N B w / " > m 8  k O ! odnvj#l -oV/47SpRswkX\2pO1g^WTC$$9 VI{~=[D;1x`y3B'sP75 c xllCycS H'  _ ~ Y - ]uhw~dyi(3f'*cl@u\%ml-LNZpprkQ_u)Rp%O Wq%V WiOwad!TC)G'+$[rW&C8A?F2kcnGJx_B* m$(95lH%/j W_Wor uajt^m|/1+a6*ED810d,dR(,W%Yo1fK$*XA  < n kL#D[Hj p^>%' ''%*{"E6NGIK,AAKMYg]XUHmDI9NS[D`|VkNJIlG">.'C-)*4D1,[?:~Ƈ썑mX"!6@/G=D5T<`JiXHS 9tD߻κɥƤ򡊲ٻ % 8ʿOe 1 "!"/,:xCBY<51}/,+B 2~OBX9C͉Ɇ i+z(W[p"*;L9 zQr)Uk#Gh50K5- \u\ ͚ɮЭ䴍SDppXA2MK8T@V{e??fYtmf>;0cb7lШ: /;,q$WCfdxluP>+|ۻ ʟVHT~M]i}TM*u&1̮W߉!C##.-G].s#|7rov!zgG4!E˚aEњzPqtxjVL7"ysj?ڶܪ砼E8/B2Vtrn5L0,*p6Ӱ0qf j! 5%13?HEN[ huU}tmf]GSES4-'_ !o" k n *"[(Q!,!y غMl]гŵFՂmڣѮ{qGĭ1V |!]'+,..a-('W(a%$!/۔P˨׷]RIBYުjWcb 8%v(I--.,*'Q E + " 5AH #1&,>JWhkkf^an~yjk\)V]l,xwizTDIAYem9jR\MD@ DGz>/ `f N}4Ѳƭ , !S0@L Wbik9i@_R>D1}%G"ND2A7譁Vw櫕ľȑEo~/+;~?= 6-@/;JZ_&\[YQENbloo-g^Sfyip^]m^~_B38ELF2("+' z~bE4 Lu>K߫(d{{!pc1 !! %O&̄ثcɉT1sԝ "k7GU/e7qp~[rb!`zky}w&pmIyx`r2x}hykR:5 >Bΐ͕J'ޓڛ[|#~Q3[EDd.6>?>}?B3BHSY_eii(vs~TurJo7lf\TIm:-3(vmߡU ɭ۩RԲ-/'eL!S!X'28<`?,?3@tAODKSZae2hnstxu|{K~}_x|w}C}weWJC.=%63+!+zQ Jð뤴ݍG?yϘcԏMfy+7o8j/*/<^PJafd^]X^m`qy^V;\ui}Zs\OCO1T_jYkYgaF[W9UPI@964551(& RgΔ[_%ܮib P$+9""N%3JctodlJaTLOZOfqukbIe[js}ym(],V5\;j{}l!bZS[dChh(li=`(Q>#- s&´˖|5ȋШSߴ h_d4X!,x5:@=t; CHPx`ijcfAYR]~l\s.klt|tg]ZW[^VnI7=H0/&t'r-0/@~|pNׅlw윪=QͺU`"w8$; 0!~3CM1Zqgpz!| }.v{~yiZOKKI^E2>4,!5C>ňSB[ԕ^4]ϛNܙ bE'v1J8b=*AELVelu{}Ewqwxuy~tjUe`)]4YSJ>e2,(k! yY}ȼ35=q3܊GeoAy5>p D&D4;=@EpJ&JGIP Xv`l2|g|pkoxwigefljc,YKnDC@:/ 9 ~Ǚԭ<% ܧFɠ]  !8(,i/39f?:KH[d(hl1quzxy}wSkM_RB2 PӒ鮽4(d3,/ݻ%95GNW]e_dmv|og0feb_ZSI;-6"'qڅ+g䜒n+&p*0;pJYbf2mit{x|C|wuLp+k gec^,VF4u& N? ,"3 4)?8^FLNGQ!TXj_hup}z}zGq^kIh$ggg_Px<~)gvtQn ӄꁡ~|2ъ* g+'EOA]hkdiKlrt{}uql9fccUcaVxD?3'|B^r@͑е4l↔ izܽ_ݙ=rC6 W$/@4f59 @ELU^gk?klsN}|yslhg8e[I9-$D'/,м׿5LX/ ^rbb9& p&7+0<9BJlNMN Wah8os}y},{wy3~Y}Oy xup(npql `QJ2Eb6+ K8y鷒N<ԋÆOv$Ą̆h4 A}ϳkֆ8 k]xF;o ;$/57=DJSPDUXk^qdi)qvuwz|||0~|x tpmBlj e^5Y"PCE9 0*^# u޾󹼱9פ8䉋%g&9qcH5ӑپO߳ 9l2x-wqi")068:>@DWKjMPU Z&]B\ZZVUUcWEYW TOMrLHD@c9D4t-#$ &cWǕDѳ\. b ޷V$EVAY!I;\1"P +C (!K&{*,<-+.2=5:<t9=hh?Tx"!S A! V"*,-/.M+), 0.0z7L4t0/)%j"' Kg܁[FՄҎl qcSXRՖ۴,|a7@" Mv Q`:J H9Cp"^M%o Nz$,1L1.38L8 7t35u:u763-j-%B2. &f)H~9q_WB/g  ZXJ"8~_K`d.!px` z /'x'$,/#'!*" 3KD 3 a w  rn .bz,%b%"3&K%ݖj[̹ÚDRͳҐ|,lܡ5\/Qr[ ! @%G;$(e"P%#F"m3}?$"%H(. #+#(*3+w+'D&y 3qU~ <o24vm۪ڣ*֙g,ϲ&&ѓǪ˗ɗCʚ&tfWιՈԝЙ̶>*5C{ z !V%/,0S6~6@KK QJZZY.YZ6`b`[{Z]\;R{KMOOLGd556&  C7fނ hŬš˳e<5ϴ[ڷA&iEܵ,ι(ŗEƆM̃ԟu9, uV$c1-.E89=:AABBGSRXNJPPTPLuTTtKCZDEK.HC=8?5I(536*+a)#'- >|` )ȱÖ м@mͩMПjW+=(-סtIõȻ%{Sq(~5C56AECfIIN^acfi^d`UT]OZOS?U8TNMQ_DVBMDi;<2*0gt TjRܿ҄"ԞӮd֥mͩӔ{XxR"ǔMW¦RȑǼiʷǸ ƈ>O'Ų Ơ1ӕ:6ګ۸֎Yl #f}#G!kIQKPOTU [:hmghcl9ngqbvnXxbw~holkmsgluhgf0bdXjQ2TPLBC8:X6j,.+ #a }sW_Ѱu¶5zoۯf/r˨w--aH0nBǰ%W6RĆ ؤ\'%),#T,.285P;gGC@)ECC^Fr?=@C=FGO@;B@I<<>8?::8/[0#6J/'b+16 1("'  {~$e+X 3 z!g^{:ܓ Qw fҰ(ң.ӭvb6v˧ҍ|UTٱN۫ѣ޻_U]/߉&n'u֥ xLG\ A )-+/;CYD0HRWVU3UZZJZceXj3|{pKr#sqolnmcba^%`ZXYOhM8Iw<6/+,%_ h6 & 8:81C'Zc>΍%܈];@k ļfпhZl a%+16>kBIQTYYbkos{yDvvofbQ]KSG>840%bʄxWҡL='B$ߧ8xuŒ C2l C"j)by$+0137r:y>G@AEINNNKVk[Z0Y>Y[U[WWxYYXV]RMD: 63/,'>#U 4 ODߪNiȳBԺѺҷ)f ՛׻}ԲaIU!Eh..b3_sщ]Ůͷ}N7xqѳL֣xOަdwע֪hH}4҃֝ܬ?NZ&X F ( M Ru $X.6@9GFKPnQY_Wcjj1kmkjse2^\V>OLJSD>943q. 'l"~? T x v]҈Sٸ,lPY)N䩞FWʦ sj9֬߱ 49C4廊W]TƬѯT- *!ڃgK (}'&#<$#1)l/907CKPQShYrXQYN?JD-?50. *5"; R=}Ez2>Y?wZ[kҧu̴n=ONũȶ;ͯ>xxŊbʟRڲ۔.geF}S ߔn*o˥)Xɱ+т i֬ϟ/UVƧ[Ḓ.JH&܍2M( ~ $*/3:?pAZAn?BDA>lB(FHGH}NhNKMM{OOIC>n=>-GLNQSQJB3Ar="632_-K)''8#.[ )MHF+F7 xVƢ="JͥWAH6{rgݛ-- n .l$(,6H<8t7=x@<8D8>$CCKZdghkr|}Qla^UeJ\DAGML]H>IKJE5AA?<)2o% x _ g p H-!:fYd @?{bz V~  $ K 89pk())C%"(K ?* 5mּێF(Vى^p܅qow'E6 BMWo\_NhotL}|Du>omm&mmswszn9kf`\N[XS@NGPDEFC<+7x1&ke ,e5fWI ʋ{cO7ŧ &֝9L܍g󄂅ėZ2|Эm#!"'1:@oGXPXaHjznor{soBk~heh_XWXUSFTVXZ]`5gjjjZjjiegdec_X&ROKsI!IIJIJHIJoGA: 3s+!i HJdKc-׹Œ!¥@Ⱦr^63c<d&'K  )+.2V56754h616u1+'&1  N K-e` 0 =gրnk6ʥ+ǸĄ{-MpXŖP h"'y%X&~.68i U"Yބhoe5aSgڗר;JGȯɕ$NI݇iC㜧)P٬^J+szdn*~ߎ5\m E!!3$&(S+/L37?UGL#PRTU SNIA921*%B" l#,25GOHEDECS@k?@)=60=+#&f!\!I!(006u=G>NKG$Gm@3)%$ k  Odz{G;̍Mؤ"yDy kry;U򖍚ʚ4LGxiW~$aѳGRIeK&*wEKMQVUUWUTQO)QRkTWXP[%_V_ __Z^[WcOB6)UX.<  8!}" 0:] m!%*+B& 4 7ݣI-ʸœPdԭ 'ܲ , 4^ѻԻT(, f w*5:78 24138@IfTwa(o{/xcH,rщzȾ?Y (TDDƨXH  m " ?١”C LP)yqu/-wR>~ե@ ;Pc`kpmezZMA0[| Z y$)y,.w,W)" \*-e\֤ejB>r a!!!$D#aG??5s v.gԨʠk.8/I.*q$kD *u 2 ~%0/;CGH G=!,& ߇мģKGk˱bCu'ݔ)Zh1uZ B,)5?.F(JIIIE&?94+"m / j܏Qj+nce7o|󲰳5&C/F5JF8#(› =]*!ڱD`Q/&[#2DU?afe8_UD.1͇)od SLUAFD|G몌q -4YAxr_J6%Q~b5O&-0:@BA=87.q^ЬyJ5$7hZD@ǯVծl< rD| 7_o-s2}6 8%2d>EL)QTZXBYA]d&i-mrqqnnoiGg5ji3gfhkckln/ldS[P@/[ *~ګB 'C vGyѵ͹Ml`|(01/(7ڐlًٛSpw^P߾{yE誵ݩO> nq #%-6;BQLOQS7RNJZ=z2(iS =u ? {'*X-0-#V >gޞq]+7:LT_oo}{Bvk_=YTxN/G?l;2%&| z8UnIncàgnaЂJܺeWP @?EXҫҦ =߀~ޠīͭ@ʲ\׭#)3DNR[ee_d\?WmLQ>`2b*o ^d3  лd9׃Kr|yq_Y,&EC]mhv|yePl6FPǙZޣ;#1=C9 '<2XDN⒧_Yu6GR5_egKe!X=G;.""^$0!*4_A1Q[ _]hq#oFgd_M<1r& ["vՓOQƘ%,xɱ3*'JDᄒous/  K!$P WlwȼݸVT"3IMՇ2SqStˎ qN`CRȜsֿƟ͊j&8FHMQRNzGS<>/$}&w4?HRX]h\QUVOqFp;O5-"zju#r$= QsxGM|A(8k/zhH/ȂPɸP5ڿ1T)t8ɈJ!*302:6I8@42.41G4;J>DM^T[cj~suuw6tni`,V0MjD=:74/0z335:ACEEB'@ 92,  ${ܱY$ G@ׯĄ&ňËߛ^6/H#tEˣͬוq!C4AHLLVG>_2$#Q.Y 5h#+4=AEE<2'a  e'z09+@?@H@ ?80+& Qf?N ^8R zoN~3 F`6m29D>&S.n7  ^v=DB^Y GƤ y`Һ"T%e|(ӍԈK]{-c H!c"#s#" | v 9 3  ! J"n !-.nHE3Oa , reOكظճRh3Jם˩‚ʶxlaӾ+l #?"( &__ 3!+7GXl|wojd_#_)_o\u\m`Zaa$b+`]\TKC7h+SZ <v qg*|yX "}&+)()s(%}(("  7m}@ 7{W/ܥ@# ~p b,M Tti2߄] = RN-NXqolB 1M m%'$A" $vzx$+.-2K35<<74.}--/433-598:X;84+)#kWD3zy!{*5;=>x9830*c9slU{%*'E%%9xb%΄k6  {E}%l_-9?AJ/RWZ|YVSQcL*LHFDf>f;p< =>@A^B'A??Q><>r<50)aw q X@iiO˾y-죆B[Zڻۼ<W|aCaҬuG   8!L&"="'2q<C KBO PQKA9e+ :dn%/5 > xE* $'O))$! 1 eNo hXMTѢGׇ,qkGۇ6\6٘5c(?j$k rBFy "&)U'6*;-+*(##$"#J!!#+/g369?A>;+5?.*'Y#"T ^ Az'"(%)#$'NZDݾޓd BBִηZŝÕ/[vSSXܤaާ|0_Ddݩ9ӓܥq:f l ?tR' =L&-]25.8753.(\#siAH V |e!*$B')('@& M aUEY$ z7 H $ E }f0Z Q 6"& Q{Hm w0'"'&"0jm5.۵ڂJؠ 1O{ ݶKߝw:pV#(+++c'!/ k8 $r%#{ ۜӇ͠o̿Կ.u| $$#b!9< Mpg $%" V.t&9 8E8H AJTf7W e h3iV *  Wk-RGyd>ڻ.7I  6 J!%f)w,-I,i)=%#1 2)8Tpw߽ *VO,  yP \nm}u(wor1XkOeg/ #"|(,02{1/*%~" d8Gmaw Q > 6*,! $&(({)A)L'& %g#%"! _D_V l"8ZS;ǜT+S]R/Jp0Q S + Gh$ B#M%g%S$ \MaM 2;,NrE? e$C0\;CDIWL+KFA ;-3h+"j W k h MC=/KW8ūݸlKW55ۏ؃{pQ,&O 7m cϭVR|Cݤr>VK_g A ? v $>),046n:; ;:g864331.+I&!k`, fAMIpla,w۝@ןֻ֢؅ lpv N$>ޛX޲^*LC'܄}ڇG9Z*?c S UE vI-_ J$}+1 55\53]/' _ we.  *O M&w 4 EɈʹ/`|vI5-Q?* o m= l,n1&^3 Z6 #'6)s+.26: = ? @@AK@><84>/)#$ l giT%@T#:N(c sU\ # 1@DY0[̀F VGMu[J "\*1O629}9/85T1+$Ls S  j*UO1D 忴HVkisj[x0ٝ@QYR ?%2&${ ?oݽݰ'm d JvI^ۂL*&, 120*$!Mw7Uu !#%(,-r*M%Viry]U\s8#\lA>=&* '" P %i&+Z=*QHNp"*~Qs?.’(_ >k|yXp,Kk7OAc&">3\aEL|s(6z:!\3A;,S[bQR%-.99&]0v"h 4^~Z97vtQG* =ϨO*] 91TbdžRϱe1B L^R-pE?`;409kyli<J @ 3|}g:Ln ċ`ܷط᫄VdžNvg>d;ˆ򝹅= 5Tȹ5m^R*C.5Zv:B7l5(8%295!EX>>MMLJ6%`wB1,/ƿ!E=U$g1XXw_&|51*n'K|VMFVsը0Oom"TQvdxLA\n(Y TC:dG|Lp-!&=m/#|dEƌէ@1ںנKJ TB;J7v!j#צÚU̼kjG#'"?W n8ж,DbPܫŽ, Á!b|=cœ +(G6p4F&^Ŝ}:D&+ɝ[fpvܺ$K eocLJi_!LiW%γ2ހXcM= $]K7(I.t2.+SL%@{E/t4AٝFS0S|H2-0p\}8&91*n|,Dԑe^ˆ`_1oM kLcs"D ' H2;A<QG_R@;֔c-սlw|9 o"ű+.jn̿Nm%! Uې~1 pu^v+}Qٍ0TD0=ڔl˺< ^NמڗVќi .i5  N[r."F s11" ;mϿ LHLC Aʿ 4:  |~6$_G}֔`}]3FII"rEZ-w%Pc25a 5@ πaا-i$ B]~=މ}x`[޼ء@x_Dp[a ^scCQ;) ,1-P^OLVChdm~W8J s1Xj]>f6-[x5V+2Iz/#c]7^t3t9_rz|_$Bv3"2@)PdtW" MnqXWzv7e0Z6%\m~:/zS4iny{NL;} M~DZ!\5?BJSN=z,G[Ou>|cV oi6 9q 2KGi+7*& .I-/&*T -%8/@b@%;"z3cc,1;AR;('j#(U68v01e S)}BI-$h-n<th  "$)50'qm"58f, |56!9.;3"%W&J#  f$+Z \ոωDG;͞r;/uX\dV<N3*-ЯRWR$θ ğͩϹR̙0z0ʥx^q֛ -9>~=B9494P7?A<099OAcPZ*ZPAX7^0%!^)6>[?HWZO@8f4) &>OF95..6BT$a[XORA865804`)1_>n:78:8C昩ɗBƋ=؟T֏k!8ءfwAwT &#& ;fQrQ 3'5k>DZC>4" Ym&.M024,##$!J" {9!8AFOcPI,A8,&&2+=8FCNQTXUOJdI M=X~hrtto>T-8JlgJ?3L;QC16P/o5EI9#p[!N.-752 /!PU){?R#ZDR5>3(&  -=Fq!,"xݧM̱ޑ<ѯ%YH]A?JF D  ZT= y(<-D9&VӺ2V n8X=`PO4s̰Ϊ±'G[YJ2):TiMll]OE:Z+  -(Jezto[Ci2-'S%%V*5* Yҹ!xS̎*&+`ŒYԴKxgaȕ!߻NC)nz-ӂgY&ߩ%a}gucBr*tc $;X@a1!5ϡ٥:ATO>'! +˯N8XgdLc%!K-\?@AX:1+*L8CMSDO(D6'] u5_Yd^TYBZ$WGw:&^Ig^-bZLb7U nXDK+*45<63$N\đͶM>ʵm5=@̤y†ƱNӷϊD jS'Ӌ526E O.~ 37naozwXN4°Dԕ\)~!!F ]-5 4,+P4*83y-/,6IZqe[nvttog]&TK"C@GRiVAM< 489$CO_ji+Y;kQ ,1:Ooo3B80Ntc @$# Y (4;KTYWJ3 )đ]q3iϛ;95uۓI1[8 U5X$g Q032o$nipW&e , ^ W3DF M?NԬd   } /+HSSNC156&$1APXW-OIIIJKJD;{4-*!-( ~$1KDmI:z9ҶԭgkE0BGOE4P18a&i7HWRPD6W*D"$  T+7v91  &Ơ{ʔ&1_O(@̈]:k2](PtQ*\4YAKHK>;.OP\ m4p=98"Jݖ⿁εӏ̒f]}Κv%Od6)9j+Q7>@$@S<2'I ~ 9jVbW=#Kiׂ5Y{گG1է8 FNUnX vMn`LM-:DOkX_]PDD}BG@GCQ@>y<5//-+h/e9FI{l+):Pg{}tMLE#6+DZp'0Np rOL"N D2F|SS#F8,JB g˵I؇ߜDiۥex 8?c߫k ),'2+b,6}⾟#֯zY׻t|: 55ß6 x&*+(wܒވ?6 VpYHq. S W{'  R.5GEQ|L;% ֑£&u 2Rhb`M+a46'AK?$a)=SlD Ū? OywrL"Nc 4iT 5 ɷڝ/7 V"χ"l̲XI*I̥j{j.§C#  @ ާڦ Pc`P=g  `4++ZL=8X4a]UBL:e"  [)597]3)W>,|58G3% V*<1MuPB,Jn&X'(-.,% !A-'=RhqVeI'njqC"XitP*0 P .TEPNQ?w/"%+6>V@";+0WݎC\< t6 DDM0 %NIx1 C {+]ҢFӸ [B',!* ) `&i6//8E%ORRwX_fb^^R=&*J( 5n3' TDvi< !'ԍ?cK U32l0帼!'WbK ۱?nxO;(Z/Q/+@$n$"%%!"n,2.!q  `&$(n}vh/D(O42" O-HIY,l+ɨӲ|P]f :2th[~.;=o4*!o<X (M7h?@08(\!=&,>U`caM0,%[۴oG2KZc^XH1;RXO;#$,G] o[&~=~V0hokZ<>ۺ`4'L$_I%ӻGJW#tTpߋ)w&kҁ4>LΠҾv xLݲiעH(ПM@]w ,Qr;LJG5!t+d$5ES\]R4:n>iJP3T*c O B_JmsdO&9@7$ :6,g$~`Ѿ !"q޿>h-y"1f6*6^0'$'u.I8UCJ KE>6-!mn5 n=0Knmu^g9bb| ،f ƖV˽:s񟓛I# հԱ2fɸU/pkr^Y@| Z&,<?u1K*ܸb ykaYV.BOQdNHA;6a6655 5R2t)) vW7"$H?0ӹΤNƧS"{B2   ,:GLNHMH?O0%N&)& 4,ugҀԅ|ۜכs ʾXXeתk %[2950) * Ee ,.&"betDڴl[@:ɍ˿0 _?r *6??B94#/'%')`$$ ؽz )Ñ)۠@jϪ*ɰZWUxPk'A.j-$8(1g:@;A=5'!;¤L",ҟOތ`Ô&k_%?3S$1=IUf\^]j[LXBRIDF*KgODRNA._c2 h7\+I !u4$BHIGCF%FFEA=7O3/115r71t( GVxݪ)ܣt{+UѲ9Ā2l;@+ P->;G2JIB3n$x(33%-*)&M")E12-W#B^n2pL Lk  m m 1Pz;d(76 w@1ZGwקyccSƥ&ÛN z2[&5%cߺY.6< j,=P *| "1'zDCm|{T,$5U|Wm!{ ;==&AsT(5;,9.0  b~. M my$+)"q$> Eq"w+/:`KW-[UKU@[6/b1R>MTQHb;Q* ^+`!;# H=:i  3aGI+v,cB Ք$Mjځ`TUQ~ɳp q ݊6-m7 / t  K-:s + IV(6$}E:?LII)=LHa >#!,1,1-.0+M!j",1:KEJI)E;.!s"N*q.)^ J SIBf޽$20#`O1CAD:)tqa$`//(D.7"# v tnRVn Hxp9  "{Av ?XIt5@ c۹׎vn>؍֬e)ܘeBxS]:dE"@i!,5p82%90!#'P.}b;oO}.V/Q S ; q  #\,q+#iAXh Xo%o \iڭձؿiZAJS!B,/|,)'P()+&2g779CPWCXSLD(=;87;#BED?8/9$I|A  F  ~"P!&#cyOw !!g0Y@%Xag2fsܟ,}ՂLeʜD,*ӝ,̀-ٙo9 F`޺ٜݒE($b /ȹg!t+V>] &y%&#{1Z(167Z2)  S(27R0*'+*-,(&% %t 2+] ' bLH!!#%LYg fx>;Za  $l.։δȜB+VcF!}"ζ編͠ké0NN D\ %*,,( #f ,q gLpM(U- i 3 ?t%-5]<=81,*+/I3>3-='E&(I(" S c z o o5 =jQKI*  " 1 xvrf!*{3.8^6c0r)"FN _*5,=5>68-!d*,Z=(KRIRJ;)1K [ c Z"Rwh,|L_-)c%%м,9w%ɢP ھݝwފp4lՈ@ǵ4>c˿ȅǎq͆җ;ך2nt90Vݩi*fd""B[ TDMe<+ Ky :',+%R ra tdeKRuR C< e#y) !#%P'&M$Q! _+(! ;'R|!%HϚѼ2MЛكrp G %?-5\:eH:1L>|c_׍ڞQqqu3 Q ( '!eV/B 5  ճҵЮtÿ4=[đŬ#V\08_FA| y;R22ۢڱ rt<ќ:vѿLB^ "4i"&( *`+G-06 | Z&*;*<'#""#6$$S',36.?v@8*g Au=q̈́`LưOuHfHZDŽcwwۻ,ʾ:YOܪWNыӝnt׶|ؒ+uQ̫dɣJб4L}B$ NX& c DZ}!"G"^"y" jx rssvf fe  `c n1  ~#*141)c!w 8;#' {W"#L  1v<{?e=;;<;852)2v47)83,'z&+1$679g;:863*! )9 Y' <Gy2/Mmu su#! AF  [ (  4"!AArQNI z+zk_u v .po "+V+2WAo2 "$%}%7#3 mY!'y,-3./F/,L){$l =-B3/ Y 4|z' H/I)*nAQ )i ,t!$ (C,/12A321 /Z./P0!25R9M=E>C<85m0)!$ ('v#F R  8g hq 1* 6~ v&-/00I/q./+~$tF #%0&V$E [G\_&c%]]0Rh8Q&.w vxWu5  d F^M0ęg\ȶ̄DؠŅ=׺y).pFHQ"/G!{0=ӄ'9[FyәԬB[A1 ^ Ib ay$Ysg &,A-)#) z ~/(4 hs*25t0&f;:%!." J, 5V!W J_KT k P!('*+\+*(''(*1;AtDB <[3,+.s2467w6R29*0cm|Mu  5  ?w' &Rk=@pvʎ.Ƃ@6nfƜIYWɁlrq]ݘߌKt9CR8CuJߺ.?کhFx$c'jJKȍ͚tЙs5C-cSdM*YORDx.BqadG/U N !0" F"(.n-W'!p!G%Q*U,*)/)A**P(^"P A*l6O h0 $(-288=U>a:U4/_,*4)'(-2V423/y+(%#i!4 .EW-1t)y wd9Z6YA n3 jerBVg~E 6 O)uߴ)ݘ? ~as={%} P  J un&[)ѣRҮ8 iXhп>$̐ /wz }C )*f&^QT;39%dA@1H>4e@1hF s   8 wC! ""!j!C#g&))'3%" s R>.co>`'ޡؙٔOe~3 70hb"%#!^a _  tItaL65C F) 8 1 V Bn vj[b!3t ~=v_J<(aDI? 9V \ Z l C0   F 2 87V7N\1lqNo wA)ڿo`ڪz%Qջ1Ә6ӂՄؿ ߮al5ITJ27!H6Jb`,|ܴߧ(NEH۔ބyf~8p c#['('&y$#8#"6!Y !"#$%"p hB !9"S 9 Z cO ~d\B >q zM\% )R> e I@` ,32Lp&1`gJ&|wFigu _6in/:n !"!; b,5r-/ tGgbU7_$,/?-(F#u5^+Q%k.21,'~%%('&g%#!7%U+.+o$# GSxO$ QFrlR.ݼ'ږ>օ. }:*>P7MT#p_qsJ.BاEUștYaUeʦՔx|H(/|s:r d|3b@9"93 v\_*9z/MCd s ~ j_{!$!')-.-)&['*059s9;73/,'=CG0I Y W #( ~ Ao\npkYHX/O e ) O w4#=.Kgx "D%2''<& "$+10*U"mz !XV } @ N6 $< 72 HlNIH\rڣNk+bi:kj͐$B̎IeM3išaǷ]+OM](՜վIhuum{LGD^N}I޺x>S$"3NԂqk }2$xQ'  # 0 C ltY #%%!XE% ( `D`N\Iy~c 1= . P l   |#%g&&C''f(( )S***X(3%"Pi8E ] 8d D DL F K , ZG$}<CQ:UcaF _D jgwz}JֺџЛmң~WϪն\)ϊec~׶؃ڣ܆dݟ.0f9}Gkww&G׀ՊѰ$O͏Α͢8k{mz = S# q  !E9A)-rP)?5Fge n8$ |-   j r k7mz3,Ee V R m +) : D Cq}M9G`Baj9,HXL~s$]'C 3: ;~Zx [>pQX4w3W {( ZkDI t F>u Z+?`H Q g < 5 K  ` ; B\M [ ! ) T08$ <;[ !@$  {A ? _   = '  Z  m !   ` O8i 7lwIePvAae|va"V5jRg.FV m;e?d{A9=A_. z  9 7  F   X7L  ^ ^ [5  B ] "tPA z (<8jV# A"$:$#4$$#%#!!!#]&(('&C&m%"s( $] F[5F 1+!$&*p`Oz'7# $D s W\ =hzL;c13Wv'o"dd^_k ^ 1 x l l!0!x s("###/$&C)*)&#"&$6%%$ b& k & , I |~|<VRC * "$#/$9#  ! L2W] y h 11ANew&UW^ dsp1?De`x+8pmi&-x`jBO!jWta`lLyxVJ|kK}T߲@-!6 -Xpl8uW@g.Sw Ep7,['wROad6 TD _I \ S 9Dkh>0U(D=?6-b:541(A/3;@*).UbI[:t^]'eC D3*$  m h yAx0PI/Ea%Y(? | G  L S G REt"qE9m p lhaI.A0fn:?RfJ#k.*yG+[2E6 o!0 R-SW %/- . "r z # {r # gG_}#5>LIdG = q W[2kK}&Y+LeV_ L 9 Cj"(ui  5 | 9    Y 6 M`D N`Y^\k/xD$il^(  mZ * r V^t@Xp vaQc\sfr '*L.YP &2.o2(l eTB#-tZq .fO@e(]>tx1Q"XF? W8`y A VT] fC  *TFB9K}129!9)GFUx8j !6 o [ys<4OV s L1nsK. mKωɂȘв51 ccWZ,Q ~MZ1j  |oo q w l%%+-)0!I{/  ([ D FD"!% '*$""%h'j(s*.4:;ADsEoEEMGHL?U_~dc_YT0TUTRL-GB=~5._*(b&2%'.^551x.t-6.K29A+FGHHHkJL,NKJHJPRQPMUGA ?H? B=E.D=3X*1$,!H + JJK"%G8ݮ~VݝLosJ؋lܶ:8 ߁BX3 +,$NL2!x#I-zLOXj*gUOI6MؙE?׮< ٙی۝!Wb=([[Ws5sw'R.Rc3or=:86557986435$9>CCA AA? ;-63442.+)(+-../48-743446.9:7/Y'y= r j e.n C2\|(  E Z ) +$ Y P Fd^/;Ty*Bk'9 `SwM 6h WXIvLY   mQG%J   $ A  =% R 1 y g +L q/z*Ue20sIk0M}GG}T*&k zg C%ٳ֐ց]R]wނs[,ڜcy[ej"߿~FǑ9(ТYReњ4-DGѓn3֧!ݗ٤ڐJ& ; ogծ|'$$F[@crM&\Hd2![,-1mz kwz7S93{]pm*'R~?-Hc {W  >pzo jua $ (f  r \  8 #KC [ <e & p = < # >d*pg=ocPbOYZ   c 0' O h $]_K<+z{ bqhl x>Uy E eqUs4g_V8f F S \ Y msv c< no ! + @r & q e  g&b as&ccio 4 ps &g0O}Fju 6Ra `H27M(:2kmYb'Q0Cu+"$Z BlzH  ? N a Ns"' a  D  y/h  V <'\)/\ir8Y "R$3%&)1,:-.0(124h79;>>@C{E*FcFFHtJLK LLLMPQQQQRTsUWWWWXSZ[]\/\8]^^^]1_S`_g^_z___^]t]]]ZoXWWMXpXdVSRROCNLJJKZJIF_D_CBBB@{?%>C==<;:N8B6n55<65)3/,X, -E-a+#($R"!!r =H1oIUVL,".4m6c9ET@  a ( F XJqPXc/tHq!#5-kۖN a`)cF9,Xx񫫨UD\Z@kj6Ig4T-v҈HЇ[˅„>FaWHuԋ;쏧cHjQmɜ}ΠYܣ!(Vi^x߽4åŇǃȹ/қՇLݪQ!_}mD iJ}|~aG [  y X92OI"$Q%D&'()+U-./0124B79t:==?|A)C5EGIIK9LLMMMoMDMM0OiOeOPaRSUTSRRSIUWY4[Z\YXeYY;Z[\i_jij_lVmlWllllmllimmmn.pppoliggshhhhfecccddpdegfffe.ffe?r??j@AxDIN;<@BCC@CCWCCD"DDEF GF#FE.E8EEFF.FEEE EC*B@???(@?>=<G[`b6oV%q;zthS7f/Bh@8;-`ILf(JGAYD+><8L,W}Y#5O={B~/Xuc7P]Cm $ P B6 l W 2   5 m < W  U1l9R|p 1j.f=}}>Qp 8>1- K'.CMV"mZ 6/T7&iv(JDX?rv R b  P e  L ] .w'QF'irZOizfXE!E`\R-RP y X }!)hB8} =MI[w{" ,r-GB-@"F7r.~nXEsiy}`3I>R:)@^Zf17fKc!]o,],,\'9=oL7 {h(?UxFU$%,!rDp6W_DZ~-T>.bHRym%  aGY mDO_XfJ./o&X=l),. 5|KTV"b DHU{.BhTKs6tU-A"%3,2+3eR)2}zm0aF2 !U7uGnshzSGbjfbP{ wt3T0 |# ' g 0 U O 8e  " AN"LVu[[kgLm#@Db!7C L o GhtD + q0szZ'ZhEW 16j8y},iL"oXK1w/][cz!7Q@UznI l3CI;r'E(s[Lwx* A E -n/RPna(&ba5~;^;AW|TyT[wG@Sn* K*+5f-rVd?:wdm$0 KzjG{B`n}3PUIt}lJ)C}r<{*F+rY-hO 0 R r  M c mzoweo8zYM 0 m + i ? d O `f % e :  ) o Z n < 2 P 8 7 h  ` r L s . Z  "1RbGnoYYftP  mU: 7  ] p# L  %  e Y 2  ] = Q @   9 e x Y ` Z R c . K s,@@z 0oOD <r J4 +`{`~zR*vavh Z- AAC|o>j+ >^XIsSnC| $Hy?xmE(qID J O ! U $t _ |I4@oa9@C4%:jED3Q 8 } ^ H  j  e ;db{k7FE %:?@_ Bb<'9X25U#3sg5r7S3_jA8-g7Y~6}{4sDs1^$1uf3*62G(#GMRuehjܦܑeۅO:SrgHDے'۷ۀNۏk؆ ،b׷K1ْڏ Ky۾ ܕGݝ1kOOyi*?jGiWfS4alr:Ae:O[o[T`A[ Yh&#g' 3  7 A p<i3pRzJ@S(}'V5&"Pg0b] '>mdH, !!"#X## $$$H%%+&&'E'1')'D''''-(((4)+)))<)f)))))*)))),** *K**++**J*:*l**$+2++++****;++++=+***C*))y)-)((}(E( ((#(?(=(('''']' '&x&2&%% %x$$#$$#"!! s m  ~1*p^gh.Nv'(4"s t=<e  H u   ] z fEi+^sT_Z.XxOpfYH7mOt~$Q3T\sQ I+\)nݚܻVؾ؁^כօ $*Ժԗj4 ӑP^Ѫюъћѵѭ~hmёѥd63Jwѕ|(\ќ'҆q0o(hյj֋֚,׏ص_Rwڀڰgۇ۪fܻܸl%=.e}&n6}OH oR~V?#4s"1 R%J'Tfp.Q/[N6 qdTrR9 S DUS7jSV%hY_N O[@L',g  Q & S d'BdU~/+ S.wN8En{Nr;ux~6D@aE g30QeR<;D-RT.8@ F7ax,~ZL5 d z  ;  O -   4 ZE`c(*] Z z o G  B> T`40dI,"X()o9yM+/hQW]G;qiZew&;~v,uXL5>J& PTU A.-VYFzK6nT 2T #esT(h~`h|0$NdQ"&bqR?p&mv8 VuJ-?`dUUm5Vk}kQJg?u A4[ixq>Sy\'!ux   71g4uWG~yC"mq^b72LYuX* sf;t8pHMzN ?EM*ail+4^~3+:Jd|}lT@M0OV\hnlxW<X~:a R 1 ~lB3`3nESVk {g'T}  h)l1LNroM X-H# aoxk-8/ iXM<$ ,NpzCAE<0 (N,CnV6}L)(af.8,&B DHz~}ir>1\W MnpJX/qZ<9=:<Vy{BE dXrZ{XB.nD#|Q2'+!q.C=U57|0A_{HXI;VC _DDZl|Dq8:?e :!3- ! cDvK +DMKVinW- vREGef?@j#q<%/ZcKATVZ!PU`o>>8Vi8{t\]"3Dm6*YnX.)R |iB  /GTa|/C_ U`95cxkI) /="Ix9-bs\5 '850G)l/Xqg'{C~2 G fvKLg;caHEjxVCHlkWZeu}YB9?OQ@7=DSfpo`B*-E[W(JR+I ZG7FXFPosmbRT]hfB'N]/{*6*-Nzl>1HK2AoBP Qqte]duzzR! )XHF1;q)KT;5D?%>UWE0@G. 2\s< Szbbd7YPyglv|,EcgZD +_KXt_J1 4Uv 2]QU/,X`4z}t`BI .5~wts/>DtyU<d 4/!%H~Bd6 l2p4i>C@B*2x &P{`5)6CDK]nlQ%J .QuOe; SW" :b|ycG+$ tlt~zd;K{oeVq(Jgu2LLD9.,:KE'!C`aSQv#amU?Mw 1IVbq}L $_d)d!?_ 'B    = P ? Q3#O v`\R5~:Q) }k28c4..+Zy~ofbDq_N801rqw}yeJ%#8PgkS)]*RoV>$oG-/bT`t? iJ2e(zwqdgzkH.kA!7g.JaI Jz 7Trk&r6~])\+_-_8fK2)_ Z*Q_VJT{/f*5P)Qy/j/W{ 78:W0 a   0 4 / ) , < \ { ( B g  7 O e  > ] u 8])A6?exyn`_txfcn}pWUS=svoY<   u M ) a +  V  i  h + Mw^B+}^K@.{gYG2s<"& veN7$c0uKS|bA$M(j5LT ]Y"YHf0,_%a7%T1*.&^Vk}|eE-"  #Jo;`4Ru Fv7JS^sBq.r 6RdyFk$>TmmI28NXC &+# AZP/1KWSLMZktphmzj`YO?36=;*.W#Ty5PpRx);/"tpudaor^OKTZJ*$ 5?7-*.344;LivQBFLD51Nvbe} >ez+Mjyxoddx{aL?:;DXq 4>5! $%'1$pefi`H*  pT-xaST^hnmq6IVZ_jz0<J]wp`j  &?UdrJrG!&982:N\]O?9:>HQVXRKC9(_NB,lD#y`:,BE>7:GSTIBSsrkv{}|{teUF5*34-%!!&.471) :^{(>Qf|yuzvtnjoutgRA=AGHA64=LP>"  xXHJSTH0+73! -443, 9B8'(4Ge|zlddgnx(37:ENL=-+9GF.w]G@HV[M2#:LSOKPXSA& 5GD7+$   *3:EVo,GfFew+:GOSZetr\NF=,,;KZempjZD1! z_B!  "lVPVZQ: $?U`]UNG6hXZgy6Ni%55-.;O[XD1*0<JPK>67;=DTepqeRB?CA5&")*")>GC714<@3xjaP/dH1''&  .3*+;=2"hJ1! #,9GQWWQC3' !$ 0>CEIVajmjgivp[Xfy&))(+4@MWaefinoeWRYl 1=CB>:<AGJMPQQW_fdYMJQWWRRUSJA=<@IU_cfs   "5CNTTTZfr|wbTI=0$ }j\M5'00/3AQYWOJLUbt~~|z{zvrmihks} &@IF;-  iSHIQ]ilcWPT[]SC51361% zgYRUbntoaUPU^flr} 1L`ffcejpv (9Rp.9H]w  "(' eC11891# {nZE54>KL:   whYD)  /86, zqox{qg^YWZ^_^]YSH7%~qh_TC( bG, n`P; v[LJPWYRIB<:9984441& &7Nahhhs(0.*-:M_q.>N`u%A)$E)9?,A) )?A)$n )9?,A`, )E,)$$$$) )>@A)$E)9?,B) )?@A)$n )9?,B`,)9=,9=,9=,9=,)")>9?`)apRank: 9S6')9=,9=,9=,9=,)")>9?`)apSpread: 9S6')9=,9=,9=,9=,)")?9?`)apWins: 9S6')9=,9=,9=,9=,)") ?9?`)apAlive: 9S\'.-zU) GeF YOU'VE WON THE MATCH! G mBI"BA~} G!@ijFlF %pF WON THE MATCH! G urI]"rkgfb G!@fNUc$D b(.]9?,E b(.f9?,6D 66E 6.-xE E .-v x?x?C%C7k.Cwk*k-wkk-be kCb% z 9D9??x9?,_9D)\=NQ9D9?,xV9D)\>Nx|9D<Nxa 9D9?,x.-xXD 6X$#Vb(D 33#@6V$6X$6X$d6X$6X$6V$6V9=,6V$<6V$N6N9=,N$N9?V9?_NE9?V@xNXN$N9?V9?_N E9?V9?|bN+Nz C%CbICe NTp}?9?VQNaIxGxTTL?9?VQIpI9DTx9?}I...NaIxGN@Nx9?Q9?_C|a N aI'NVN5N9?V9?_C&|C&bNE9?V?C$N6N9=,N2N9?V9?_C|NE9?V@x GoqrsCtF_Dark Horse! G z?t RIFFlhWAVEfmt "VDfactdatagzj[J7 bBk"l .34&$&h:#FtHT^l,`NhXHda\(  m  0q.t h!#$$&p(9*p+\,j-.q012,45678,::;-=`>N?@@JAABBCDQDDD@DNDDDLED*DCBBBiBAN@?8?!>=<$;:b97z6]53X2-1x/*-+)4(&\$" ~pd I (CWcEa^]&[vXWTRBP^MKXHEB?@<8X63E0,I)\&#>FL,6 XdX$4ی؊ς'޼@Ժ4⾰ # 2ظ`\P &H6D JMJ<49efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefE[efefefef`:P[~`JdQefefHxRefefef[ Defef=<<$efHO=K)29 "\!D"\jXA a|2),(42=7B.^.L3(&:5%$'*,)"Dz'  kP`|bT׮Pį皚螚 рb@ן,P~hXȰoUT8?6A%*$)//|+5++% +7"7$ e9*460h x"/p1u-6&J#*^27:=dCpI UefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefaUUGV@;4 ;hB;:6+ * !)-/\*:(H!$f,^B`h^*DķX$fʨ#$p0Ŝ7;n( G}|*42>&>@~X#z)  (0>a"2/<(M[`XpF1u#~&14:0T "kr)~-.'n" "(:0(9>v??T32)6::41b hl;ˮ LG?6(Rj ޙ^6t䭫cǢQ8+4 '6FM D(^W4vZ.FMTUHJ:-&@+4>xGIvE=648DPVVZM;' 0DZdӂėoltCWH !l P $TSp# ~dۻVЄ_BLC b` H'6?>i14I d$jf P*l!Z*) `YH#)$)H 68P^auYH95N9|BmM]VHX(P@/"Te#/9Z=<9l4-)&y$"a""$)i/3,79<D NYefefefefefefefefefef$eb]TlMG=A992*H y hFXzst> |"4 iDD !\ d#!A_V\N̖߬2D>BV( @@E6 i*Y/-|(!=dY>8h m U d08nΗ$4sxɚ/ԪԼv*$ D"$-/* }DlRP6 9X^$&T29 :60)I'a+d4@>JNBOM MOSHWhX4U4N El5I&LE0ODk qx<%`((8'"$u  uY |v(FԱ/VDŽ̃Z\h"ހݻRF7ea hq/ǯ[*X8nZӠ(ͼpߜhh<v /7:9}28$ _8ܦ (KS Y"&(*x0L0Md `$@)-F/-)&%&*i/^2Q0) ^l@ yjt|z,ct:c7t4Bv`Z"SѰͶʘ/4ʸմ_f+NY  :|v٤hV`~Լ0, 4$ψˀ'ۛ $, l T nYP\|:( 6 Ue!#$J$!4"(->01358D>D HGiE5B@>:5-D$V le A>a'1Y9=>|>=e;6&1h+(*--M'i>    ,|R֤;ӈְ^`f[Hx$ `.7<<6.*%,17972) zVM  q$*.12-3,4T552e,A(& (Z)Z'  ?`=  "$M&B'&!9Aa  s"n>,jkzTo>H߃3Ѹh[R<=  | B ExʈR ;T?t@ňp4m6#)i.1466!4,.$ Zd6@RңР8(Tt #΄/kg:Cd ^`D6@15 D߸cҚͶˇ; `/XpXL{4 $ 8%0p R #0"qI*6Ԡllޓ8 &T1t;E5NHR@QK)A4<*\#T (,R۔ڪ܄(ٸX@+0(LfN ROFp+$@Ϳɬ6 pSB˧ȫ@ҪZn$qi$})*%-j .[z0|>>=U;d722.,)*x.811/%-'< q^nf !%'i)9*],05:@FK}OnPMD9.#  6·L28t$X < a Rm Dj.' zrTμ.ȯܣЮ粘J,^ h!])0a575.& Dv,o_*6, ~x"/=LZdefefefefc[TBQ-PLhD7.'&lT.JP" A5*3H76559?HPX`defefefefefefefL`|WOtG=3)FX$ $nl| (|&-5=ELPSTRQXPuK}C;3E+$!RNDDEh>T5,% v$~ .jr vn LI 4 p0 4N ",`@> $$),l../2540*" d;F+" RXЊИݴT0BhS(i$j ׼b.ZDJ.|XjTҿ͋ؔ"5'4,|, + )%p"D kٮ.0>󱖴?{"lb sH#;pP^J J9 nHTd!"$%(V+|-b,B'(ظ?Rs3\#G0wհj6D %)B+*0'##n%=#!h;*r 1 t,:9@BzFDFB >L:76431337:95.(#a"$+4;>=6%-P#Q\8V TfT%x/a7=CJOTSSOG=T4=-(&$h"л̖̇x\μB$+Xc*H)  "f! +xϒ€lX 8~@¬hҟk`d#)*'$!"`#H$"lkH&dJ\FdTP je!#0',2-8=PCEIOW_(eefmee`AYRM8ID?5E)^ ^\?\?m 9+4;?}@?a???4*)"@\j x4\\HD^ذҧwտzD%3@8h5/+"+-03 4 1*#@X ݐrd&gɊpЮl`xJ\ 4gkz ؜W˿Ѭhάˌ+ d Y}aF$1.:E LLVIDH>83-%. XHPzd:jxV " ]q x !`"#%f(**a($`. }(N$K$Ț(Co3 ע( @:ݬ؄ ߾w|TOSK@0x > )!,q548f5/**'$e"9ݾ8<0ijǐCbB , f%(a*)&t#M! !"-" p {\CϠͪ0dd٘۫P81((P "(bs2` ~!',1L6 9:y:y:98B8630.d-H+ (t#( {n6cڿPT0K' l̿ɜX,ט {h DDb  |S~, ƤLȋƬ$nb:ՂfT+P <& "T|P\ P Vh,YLF.!5%,021 0-I+6+e,,H-./8.)#1`#(+,,,+)) -2Y:HBLHJHDA>I@%FNW\\YpTMHC?<=t<->!@@u?-;R4-'" xgH|4]` 8 l|8 1_{:T,y |F-" cp ƫvÊRڴ8]  )u|( d`_ ?|n֖LD8Tז&t),(0L368740,'A"\ X8 dB  (NY Dpb( q, `"dLpݤ\/`k(,RlK׼ٲ4P`J&Y"$ 64$k݊غӃ 4Ҁ`p" 87PDL !##}) XG\oۿ׬Oh#Pt,lza]t I|IQF 8 T~(Ӥи΃ʹ˃ɟP@f 1*8@ !t!A t( &!!#h&'% H4, hrf>2 '.37:0>0AICjDCTA>=y<;84.)". a V '$.z;8A I94 0XT@#80Pۺsbht,g_,0߷lj# 3r</: s@+ΰώ4פ ' V&8tJ6d/8TR(Z^TPZh6Zo0  l n 2]f^M D yq.s2 2 $ *x,,`,h,,-V.-D*#  "=(z; !5A%5 2d! $#(,/10%/z,|)'$!T xfWwsr_8@e A").13)56x9 <<:l4 , !@t h\xVoːG[d !$%'('&t%&(.&!xB ^@_T;rdϴΤk2 C jA 2&Ex, y `4v(/$z` ^&u!$$"T z \Xtv`ݖ؞Փ^ӫӫ NP& <L 2  dTo߶pR`[T~lq. 1d" 1&+1y5651T+"EI )O$ H" +`16:<,=PW\ ) 3=:? CDEDB<@(=93-L$+?Ot2\A Y V2  N$(U-X00,p%<KpdҪ0O ̳PtMA< H2ǼW˿Ζ0Јы@JӐъʂX˭j4ď.ҸGK#|Bi rpϴξ\ֲպӧTϬДԺ8d$ދ_3VԪݓ\L X?p?0>9<"94/- +p(%# "5 ]T,6}XRH  v . a x7޸2wnpL,KrD W[S_㼰@NȸXwɄx+lǬŒؼHtXC X Ѡ ׫cDޔ;ׄ,˃7҈ڼܴ݌/`6W@T&|tx4 " dnd&$BUt  a t rE %+(27 T=R:50R+Y&t!q Y v Q<N! >D&9 m i $ TyA \0x.pe5 !#.&\*08AMKTZ9^qaceeLedDc|`][MZMX|SMIF*E DCCCPEIHIJJPKmLrMM(MLLLrNPR TVVZ[6\d^Xacdefefca-^MZDW"V)U4Q9JB:2$,\(%!$p^ ^xjD:tux ` x;RwN[;߫ݠݺ (@ޣګ'\М|S/2ʪر2ķ/ F„88ʻʀʧtʹ<ɧB$RZшѴ;wӣ#[#4O,<8 >` $',l14 77788752@0-E+)2)t)(-%!F\!&+059<==@6CFIIALMML,L}KDIEHBM@D@A@DvEDC>8e1b+ & E|m +~B}L4T"{8d\,o(ƪJj X/Z&,} I m H C"$YHV'C)" 4Z*7BJNKE@=<8;*951.u---.17D@tJT^@fefefefefefefefefdbcdeefefefefefefefefefefefefefefefefefefef`q\WISNGpA.=L<>BeE9EC^BAAqB,B@U>m:6433J2.*%!}]4` 0 wo(Ө`ĤõBҒ(4X0flWK;„xÆŤ<2,8$.Ү~ڴXZ38|r{R; *C(MAbx$|h w[O?@E%&PV$2HwS't##t0F@`R| -v  i)j<PxR P @ 8i* *#X%%%>&'&& () +~++*($ Pm 9 "###!}jjt ($%U$$"&$((). 6PWiP b Y >B: 4:,;<ؘ3sWǠƠ#4$4ϸ6:64;Y M F \ 6svDdo((@s H|vR D>H5 u!Fp Xi  A u * \><J  8"`%P+1241n.+$ j >O8T@(T#<4 dPpF%P 0tdc<8@{ L&h~8PQD~ qdu YhTl 8 !%%m$@!jT  u ^="-7) | vblZGSRڔ>լlhJzŴɴX6 .hrSPROtf޲PHО(־ ,0?pol]( z y )Tk\hݔzo8+C D h H  &@2| f #$" Hv^(`x % I h 6 - D A- `x4l U ,Z  m\.D H @p@B@f T*^u@%|,vr,x D7ra d@ DEd#'+. .+))@,.E285l4/P)"( v E\U")')*+/L3E8;P<;865z42/)#|R d td  $ @ l V 2VF$ NZLjvݦ0*;b8@<FLtK\NT((ld˰Ŭ\ǜ@fcp~+7kߤ܇sԿZܴk ܻ2NO[j ]  z < T t /Qd`/HB2 h ~A ArThKh`& )  P&- dra#z'**)')#2 e 0sW x5  5 y 4A^$ XR#% '%$!TrMij D % ^Dz%,398=6?@?><8^3/,6+)'%#T!(-4@-x0 ,E P%))0,.1453&1.&*5% j6 t e 9 x |!"`i"%(D+.:1R22r34H667`889<8L6 41p0.$+'y#!l! azE |4< L!!(""$'@))j(&$!Y (psOcɴǘƔ B >H_$|B8\W4\xdPz0CoZ#Dɼ˺˴<+ӷGݮގڦۨ`ݤc~F4Pb@pCD&pt 0LYx "XD& Y .B X#',914j7:87531/L-d*& $" @ 8# &&%Y$p"TL 1 b iy|>L@Mh@8#'j)U(% ! `Qn (!<"$%,)-$37:=@D|IJ}HBV;39-\)&$#4"T !Y$##%(+J.&/=.+*( &B">M !*29j@2E]J>NM IA}7U,!F A "ltb "P<:'?`(rOT\Xljd Ր8$D;ڔ˘X`,¤NŸǿgt*PskբG\ ($߀cg,0ޖdK?,L|F#& :~pZC|[ސX?l#X X} H  h <ܼٻ4ֆ٠`"|Dy|Ap\Jދ3կTҷգGhdo&J-36P40>*.!LL(!$)*0*e,.n.--*8%8 l FT  -"9zC~LRVSLTD:0)(#*"#Y&M&r%#),Ppל`l:c>4F#c`CޗT&#dxT\ޒ@TbЋՀ#(v<ه6f\BofԗhL҄b$3Ә؎t_dt $~ Q@hJ Z`%`]q! l Y 9p& h@ }0 %+d27`;@A?<:x9<89<=Y>f>=6=<;:6x41e.*&"0t d !($ '|)2*)J)))(8(8'8''<(((&%$  $zpcg ,8HDt$g\XGdKL V ,WG +t@$x  hL>8. R1exxe@084  tpN a 43pDCx(0X4(,`\8~>l8^D$^TFl;*2.Er f myT . 8 gr(BfK>(p4xFbDEM"6jjD#XVtM4p4N0bu`~ (  6 4 <= T0M`Ebp 0qW( LR  y" M |jl T$),+2(%#D `$ Xt0n8J:w#TdHN@PLׄpΣΫ`ҒD>׌ܲ,|lx` nzC\';,}zFu8;<z-a$pD<|('j Ot# y &Uv 8 !  P 1   4 f t B p 28N`dbJm !X" #-$%*'(('&T$N"6 >xurP b Zy*fTtAp&% j0XV~FFz!e A a1|n- Mr<.LvLplprl(63b{\Kf|ھH7WDH[߈ܛ`nFp4`k^2\lhLvzDZ  "#!$ L < 8 i 8  O8b pP< 5iD~jTi ` H L  t< Pl F  J b6 %))(h''( &#4p%AF#)'(E)'#ZOg*blD $Rd L%20I  ^hZXoڟ ؋@,,W?Ÿ8 c𱸳 w۷x'FJL̶SՇ؄ںܫ7݄b٣؄פշՠdX4+Zw#8tD BO\f0q =8tD = vXD7xMff7&i.xUXl m ,2@ EL1  " xtLP&qp4$(0,--q+ *)(p%t!) L""$&)e++D++,,++*)+l*'%9""jB 4 dp@@V8*qe \$- (iPt$sd~Tbps` 1V J v,/H24+ jBF?%TV $" tSDh`  < ID m^.}9i<@`:@Xb `Hx~\-e-"jR 0]*X76&Kbe| 8  h jD Htp"~J`R  N5l l ޔ#(ؼ<ۺt4x~l0K(X,@LF6{nVD/@8?d0poL\4PDJj#צ7ԆdףbPt[ܜ<؃Bբւ݊Z+d P$d @) 4t4N&B !\"!(|)X$+91R69f<=>=:756464M4D56(765L5>5|31Q-)p(]'$#l!4!!!X""$$t#!x Zd8!TX= X 4]L. \ "[_@wpxK(xH4`Zל՜t|p"t(rް0?Gx߰Xh8zQv|P|$< RH."0&.))%  ^ | R#(+,+X'"0:5 F Y XP|%*+,*']$` $h,(" N]P8o&%"J , $,}" zo( D^(X8 p0 B`fgrw'F޷{J,WT*,,+L*($ ]>]*!&+.6012431P-)0'z'((y'%`%P')*1*('a'&&'''&$#!  5 6 p > v HHL|d (1\ i .AN~ \ h \PT@;JD8W(P 1 1PPl@p)<tT \zt8GgHD/L'47,Xd_DK6dR < \"8LVcOpj h$<` <% |(݌sR",[pZخ8oέ;2ͯόtŤFK׻ N͛/ٿBwDgп'^ͮpڿނ@,Ԑrf@k͜t ^H\d[o(ldE y~P Dm #<&&%($q! #$$#$&q*.0J0.-z---,E+)(%Z$" &1 b H P P X }]l-` |!#D$" ]:$Q)r-80`2a44|0+$| t  %l.#l')*x)%t"Y4PLl#(`-124541,:'l!p<l1 \#$I$M"U H + `7<97433330-257889:n83%2100X.*v&#$$($--@/25f664y2-)%D D ( &&}n$   zLaz !U#`#(T ( RH ] V Ptn$l $dXb  : tx`  $,+Y /gd~0V lgH0x38ԈݻSl0np@LTěY  N\ TEy$H% HN tH,OH  y?pbHl` 6] Rxb{sc<<ݐΔxĘ'#G/*,¾`˼Tk$WGLx6H7OKɚȃȆɺ ΚЧ |\?.pd2(`H+*$ X!D"Y#|$y$I%%%(+.03470:<,?>=h<::9752136653/0,X+ +Q)$<ET`,,@ 7ZI n tD >h Pn2d,) !X"!]9La0 >,r A a n9( T!0&)<+,++,P,,0*&`$! Vu 5* `t/T@GDr\N}xu t ujF )!#%&&# @@ $(N*(% v "NXoO$8 ^UvX t e$ "p$%'0(|('P%)$$\#!! @! #%V'(L)('E(V&%#< ^dt<:hEm,nb\\ee H1<}1: i qhF52 \V*p"dبlѺ ?2PČP—"Zxì/ϻWJDgCCⷎpܾoˆJg̴ΊGИBՃhߧNhr|hJ Y 9DH u 1DX0t (4(L&9" 8V "  7D4ck0wGhTjHwjyBlpx+$xr V\ L<B1rLr* P(-:|87D8E xr. LPHN@(DZP~ Z  fn 8NqTj>9I V=|R@ x n &DP \ Z  4 UB4fqL<i>X(j1N$zH~xMN|rnZ,Wl: F-X67$ Ld~$c+2:t-P $v8ph<G(;XL6b4otzBlgbLt7~\pg (LpP0c,` < a`.8q 0rppAE(pzNcD8>Li5  iB J l XBhyT| x <  l*Y}0t9VZ>h: t t  (ip0 Y 9L:8A^:l(4  T a p I i "4 xc8@x,3'(|*4Dpt|,h$X(:+NR'XDJLTf+#T\q:TQrV L!z:4 ` I V4i  \~,lXT8-H\E8HR0 BEZtPt>zT X8%JPz P . R  h  0!$oB;:H, Ll@LP8D\3: S#"ߟnߤߨ B P#f\kO(#*#,G\a`DL2300 4M0(>|?*V>H.O G@#00hQ ! 0d;C_"W"x< ?j1Z>1Ry Hpd 8M   | * 4V$;4  i R Br| f fHr' l (!%%4$% <&  !L ##a+y1m+,1)13+d7-A#D+-& /d(m#6)-0,71*`# +414%2+,v,7:p34,, 82+-*!` \#N! %,6&#  YVs3d H88V0ޤ/HT\ t֐_θ2SZkX&чL̀ɤ<ȳVǮƈcd,W/hDtǬǯ 4bد؇<̼xϜvd֪O\8ޤ~ ӯb4vʸSш(jpr;{ dl7@@DŽ/<@$\/@\fRH2X  s.Wi v ztP F 6, !!x0>Xb @ ,"DjZ ~  !$ ($!b+$ !Z#*("$#!1*/,$9-H)D%2(! x$.&q!('$4(P(' 2U6816,5n.=3,)+J4x41.l->1:3T.94E*+u' P%)&.-%e,38r<85x.L(+./2-=(<),l00>+].u118M:9::@=q952*'d(A'!qJ!%/1.0$3X48:0:&a&'n$@%H&h"(m2v,.6964623/8,!P."`P#<) '3-8D9P<; ;9^88/!Xa!MT$D`%. /B'N!#%" X0! ")p,A(&*+)&D(#`i-x% E dl $# *l4::6-D'b+\/(""D!"%#~j}N"N)++12A'B$e$H} )p64%$'"$l$~0R)R13y2+*L5;x6/L19M?nBA53p;5/+ )&e+$) (:',F86+#M%+&""!D!p |#!/X.)-7L<81&P ,&8$`h  < pe|  p(bVH__n&xxJL~$? 0D/bzڂs\\ًgچ߾׌/3Rx_<S{\,&lZpjR "xM t&a  xQ f pZ^$Y qJ%"P*( r4ڀ߫(@#lx( 8ܢ_|j0g+`€*F(DL`R̬XDبNԧٔX'"T68 % :VX gڿk̛ķhzTP^tD .md 2Lk݄۬o Oh0PȬ"JçBՄŨH c `P^O4HܘbL&(@X8 ϻL&{(ζ@T~;?bd>#ޜl40kh|,[sx:>|$d N +L( ^` 720#GT٤[`ԄۏHX(ޯ#$DX*+<& nmx 4kP [ ADZH Y  </GsTo, =L ~` $.!`#'#TudnNP) @l HN 45=6:1p+'&% '&T&Q)*n--(  < 5A .! 0 $'.<1GC=3%h$ !rsXp;abmQ $P r8"m*")<9;C:8<>C"CJ OQJP`efefbefdQJIvJC15`-Y. % txubbx!v.d-)(F,( &.z+J D \s8HT,x?7 ڌ،$h<pO Zi|pL$Q26:,#'(L*8 >X)"8T ( `(`_6 ZXxN;( {o -Dڼ ٜ<̶@@0Ϡ6w$;lZ7*ØɰҨМxt#V*H>6ƼxXLҋϜՀ 'N 4^,HZw[ؠf| 7x4D"Z|;` 0tpLSմ܋ Pݠh3`4oXg>_3w{ۗfܿܿN kr۠^X4T 4'" p  h6^6Hd2`X, LHl"{ * d+5$aHajr 47Zr޴$ |FH -]A  J d -N  p4x4b&"@!F\ $ 90:$0/# '6!9223h:h9( e1m8-5$h- -R  D} '2-$* )+`8GIG6FG GL<2.7BC~2$,)220+8#A*'$p^'%H62 44f L a PJ00xM Bڟ^Ҍ0 (~ҨӠw:L <ڢPKP&TlK& t_T  T@=?nLX. xpٟr $M(-(%p&#P t6 j 0JJ HR4}D,&D ,D `U%!f6B:*D #'(/8X6(J%-77/ D.`)1)v^ LH 6 `v&  ,DI<y  Hr 4 , $ T(fn_ϣH *ZtmI ` 0L7k :ߌ4dd7JvXttcD,> C, #H'!M p(-@00/) ',0,t%!:ex @3N&_dF;7Tk!  9 $7*44\ޠcB0̀G+RÐDԿpdՠ;ߚ@P^!#P#I%\&#p!#`%!eMFXUtiX b  ttE h a:l4x΃{T#<_Ü7 жj&ً֚33[ 9 \,Db ,Z`![5B  < v n X-P l VYdz RLp[ 4_ v`|GHvgp$8Tjشz"X08ֹrtգ`tS'V0%D \*2*:?BCEKMPQPNUHxBv>x:1' }ݨDψxTWCRB L"d)q3=AA@@AC G(G@80(@$a"f ,^R,oLچ G^Rl)@cj ($@Wh%q&9 "!#&*-.J./-J("l| XP`x PB&1;VABCIGlNTVTQMMIUbefefefefefefefefefefef>d@\RpJxC~;1 ( ()H * @ ,i: X  HI H ݐpĻ۵*\P0',ptt$LPdy- f vMdX:T~ߒX#/辀G_(XվѴλ0FϺ˻ų_4P؜\\\ "/q9= @@?=95/(!0 ~;hT\ʂԇK8\ 6!*@.f16T=CI\N$P|MNLPW^eefefefefefefefefefefefefefefefefefXdl\XVUROE8.!P! LL`Ch[t  KϸV΀HPr_t `Uf@  &,/#fӷwԜ0LT`4FPSrɴB Jy%@LA U3KۖĬ@/t&"؜>l" 45!n % $')&n J0H #uri A"*2rn„𽧹lkɨ ڂ4An E\$T',) +'J L(b<&$b¬hhњ>޸Y$+A6B,LU_b_],acbap_tXYNPF@B<]3d*"y q3N|  I!$((T' +P12d/r-t-8--Z15667:=C8KPSUWZ$_defefefefeba` ]UEK0A80*,%xjN,GVZpT:chdû\0ܶjo#pTt^κ̖b ԰CXޮC0;t$PpHpRTݎ\7$NLvo4X48ՓՌ6ĊX[\XD `e| #8*$35/"+1-..&13D0(J#"! hqyU }5!a%'H'5'T&#jb ^- )$%<R " +-..1:\FQW$VFRRW^efefef*dZ]VUVU(P E7.+|*'z!6^T ̠ɓn j?Ƴҿ˒OҴr'.v'@p;(Jϧ̈́|̲,4\`;T&ɋҒ"0xmu 9 d BL$A` gZc\@XF $|s+`$6&x.3<8AMSTU7$2&/,(&V T^Wd|( ^ 4ZT\$&,%LAz n  VTrXsgHB ttb$ 'Y&P#( \ H  0z G$߳XdPԓԿ؇ޛ<2q 5~R "* 0|149821368:80t(p&>( ))L(H#HT8 A &,dDg(5  a-r#'(($!V#)//+r&5! x(, 5&vVܷG0Ȯ+LžpzP\Ƨǡ6nPå'w 3$,j&D , kL0cxӦR̠@s(Ħ8ƠH@Ƹ+ȂȀ8(͠ЪҮԘcԐٖ~(<8  8 .!$ x xB?VzЧ|RȆԷl(4{.°0tt̠Ђݔ .(gx.܄;gTÿdK\H8vоP tb"#%|)-.v,I*('%!t\ <#tL<  LT9!#',/16:;.;;=;P=?@ DEIJIKO!Q,QFTZWPVTSRPP2P-RQMIGB<82$,&u"Mxl X L<hv\ @LeDX m f P <D2 J\QQ4 " L(xlWz$ H L \ uHayl>< h M | $4Q.,$B0 @/nZpTSSLL>@H@,pjl+@S(#܋ذԜ7ɿn" >‹nŬ˴4ڌ݈"p>>@VA|A@Z@y?\?@,CDDD=FGHIKEM&LITHG|GIIEA@%Av>:973d/-*((]+)z%X%6())),*)*,(-+*%-.+>'|$l!p Rb8,t 8)!'+-1d7.<@CC B?<8z41U.'p jHX h0Ôh˜D8[лC0ȸxfr|Tp($ \0@ (,Dޣ6v϶c̫4j,Fц:8r؆ |ײlܤ߸g>N5WNO$tʈx7ä`"/pjѫطD$#(LX(Hng$H:<@@p`$l_(3 lPoߘH~F۞ݬvJ@^$ 9" $$)*J('z*,,)$!A#d$^ Tze&6x mXdEUYP4"'J)B+\-].^../6/@..+($#`!H$h Po{l"60߈۰֌&PT[~xn@pvUfpds7:7l3.*'=&F%$ lAXhi> $ | `  udL| "]&5'L'&$0%&j''%b"|mn  ;6p< &$^|t F LTC~&~@^#ZDV[".d.+p00_lZ.Vsg$`/;PL,OWh Z  JU)^4lpp p | QRtF,6?n@r'z4@#TNhl( Z9`PD95 4 b h(?Tt8Jh|,$>0ntl  D Rd zKv++0H`% L nBv4xUT!x#|!E E! uR v 0(< 4sX<' jNJ "ސv$ȳX@ H\2õߵOxFT#FhxLJ kjLҒԗطڄtܸ{ߨjFۇ8֞p̈[4Ӽ{ڗlj/rXbdߐ,W"Ԟ&p͈:t\St:TRwLxZj"@LX@d|8KT8Z":>g;^Nx `LW!N6  "%)+.11466 6~5P44H43210.$--1.|.d-,U,+,I./00$/J-+,P.-,*( ((**))l**&+B-/ 0J00b1248;!;l;e=>@BdCDDDTDEFxHHG=GDFhCBB@y<:T:x8$645952//.-,2-8-9*}*v,t++l.0015 77:====<@><<89845!6311I0/(.-,*|(&%## "mY* n , y I t H d Y  <%t%],($*@ @ EeyP@?H4&M5 >@5 u 2`y`!0""=$%h&&$4#\!4XT<I x"يs" d(~4J4X T,TH6ڣ#d(";0 ?L($H . 3TL[XK~ M HD2L r!&%#`('m*/,}-.)I+,(''#"$"#$&!" $$e" %$]'q+p*+-9++0+(%4!u! }j B m%x~  f   \<Fz*C2L$4cZ֤|΃ɆcR4$v;ùDǻXs~HںvS>Jد|Z$ު$K¦jȟ~ 6ʈHR[ļ4ֹk>ϲ,d~72شCRBojk "PR̃҇ ۛވPV?R&T|,&|GhD l_,StwP7D 8$NH [ nhHh M V)ih @e(Tv ~fd 0\LpXN2n@j H0 $VXmpXA|g*/k84c^$~N& 0<dye %  !$$'4()>+,+*Z(0&#! mpu8j 5 - ~DW| =`- T P$')*<,a,+,../0(---+--**a*t&& &"%:&$# 4x&}4h8]L4pYZx!$u&) *)+,.1d46\678m9<9*986v532f2/=0=0,,*'j&$$# )(lfx- AL< e,X@  0V B  >^d l |4PP$",  tPvdDtl N,P0 h ~ T !  = .YxeX5a! x` 9fE40I 66FH 8*ۣ|PS٠۰<lx$>sXz2zHhr 8G>dRNֈTrK.c 8Wx6rG 3dGC ,<G$P8D&h(Zgj2L2/g&>bddb$^,(Xu"px HLNT \ h = ):0p+xLr\hCD~pN|ȠˌdxlP\˃ɏ<[ z{LҐ Բt4ז4dw: R[6*PÛPŖȮRBxPpQT e"x$z#f#x# $$P$$ tV$`P | :X?.m?=;>70:<"89}66(62X2,+&!P8t B l 8ultX!X0rTlt E!$"%`#!"a=d]%zZkN8Gy ` 4otilvP: t p i '`7^p[&zBKGh,P7\V[/X,&[PBf۪VڀPޯP|,.P|Xw_&&_twl$v`-yB!eYb6 Hl0m] (xYjhx\(jr0P(X_x |p ,CR(WXwN\O^X|wz8ld3D3Jtp q 2lKw< n. 4T  @ RS,pxj (k M  P|N"%#z+f(*0,# (#} D"`9 (t >h.8Q6n  x  D  d c0kp( '^'FW~M $ T t lI&qB@N@LeYN p `D$t)mP= 4 xJ$0݇dXlݜڷpwSߎ(w}`U\Rՠ0`/VF Fo@T /<:/"&!q<88D,|$x1 * 2X5RCeLW`aqa]\SD8.N'pm$Z2V=AQU[cefdPd[9O)A].\! $ =$H()( .[`Xǻt&̤h~󺄾4`Bț ߷ϸF*(#h#TFpx[Zk\ dNB\q(  ~ / [p>L lDPtn3 =  8$x um: F<4(#t! 0ESE!2(. T\Y u UX!` L :F)|"%@!(.. +:1-p&x 0NQxX2r\w;\ZDޠ bdJ 5 XQ8\ HR 8,=t #L M/^/v pNa<0-< ݦgLˇFݚ`ߐDDT"\t x g_ '2ȒsznT4@TT"(^UXڼs7ܳ~~ҼPtX(K ¨,d[<lP @z'X} %=Z4xbT#p`LV t d.3J*~9$$Ap!,2I0."N'\>9%((1]6%!16T148/*VH  #&U ?Lx#G۸@h يrՌL2^ްsטݨ_kDH(H @Fso(t Tþ6STDxs\ P*wܻ % /7)@j'#4d)D0 t1D@9${ZXL-T-=U<* $&%H4,\3h=*5],@\|$/X,:%Lf\ h;@BY&xb'*v).)!"3e5,=AP'F--L!$l""=v%v8 - 28"t25&$  '/# h ->,h ((T `ӴE'IhP |W"! :8"hNn8- Tƒ:dn0 ?v֞'/(<2\ܛao>n $_\D֢ը%P\ǴH&Sۤ^+Z6rXʚhS֘xsxpCx^z+$$P-+Y U2[x4dL .*AD3>('r!~28JJ: kٴóض-DĤ? Bݒ H0rMH 8;x>˧XHGRGt@0Ftje!–Xn8H($I 0|</OG')`~<^<#+ Fp}1 (<BUp&y "L Z0:X(# 7ėQ1`J!n a!$gÂ:A4_ϛFNJL=(BI%T+*F^'` ?Yy!̫(XK*!T;,6Lί:%xԌ֜ d4!VI5>P 4 ݔ17|ۇP ̠?4"&Cf $߿`)r\ .~1!~| K> Ӫ)~G GjPV!2Aќ|$ L<! F?a6vP Hq!p'@J*_~t 2}94~@") Fh).W`/tnl`ꢌ&㠹ʤd,-͚%\4N2l2шVڴ#)š4xdJ#h~;׼&lx- ̴f{ذ` YJx˽u ڭ,5V ¨^l l+Kw ,Q8v49z0( VNJ8٠3p(b LDt@ #\ngyZ B!!)ʰ'  5 >l42M,$ExײD5* ߀4*X l Y`fŞ7hgA-HSf *Zس:tlܾf (˄T0 ,2 , /00ΕH_/p)2@E׀,KtTVO[7H*%0g A)DX4  0"=- T0~y<$> \;/ 0^%%y 4]1.A#K׼d%rL6?0 #M +Ts.J4Oc<b: * C5 .F/*."b!y;,)S*3}DMStUFL-FM@-WT_t:5:ö+R0,XX+Zݪ4j Vݏ ^"ED4|/ 4)D&hn'2n@@ D=86efUجvZ;\,8S߾"!ey0x-e:3R"Vp+r%d"Rl`9\7 B> +!`U.OPAG&D41,%#"!5)zt)%C4:ZHO6Wi$0PR|5*\A9!".P)7: :.R  ^4m$v $):;)(kfefefغET4WPHq d 2A 0}@3$Kt!,Pڷ  H4D TQ .xx 6> d3! 7v}H/+M_C9p g޷ڈ7 ɨ>,&;NՄL5D6_X6N&ړKJ#7 | _`K$t6 <~Hd ȷD4 ߈px  l`t9lkZ(ĎEj'UW^?X7|μq ,Z I%8iV((Z!X'?Dy$ݾhk @x t bѤ h+3Ҫ>ڃ6ݨfXj|@+e$8pB~h%'A)# Zh# 7 .i k -P" `ڥ@*$%d h"(sV' #698Ix f@ R'-e!U"* f% j F 5 (3! \;쯺A%Va"J"l# 7-`44ؘL'jU2 .!x. 4e0>E*X "+!!th$>**;@,$xT 8$@"*17Zݸ32 1cw/e.P4 /"(L.<[蹳%)&$d- T)$ PMhwe `L}2\%-#)+3T {<9 {N$۴ɼTRtħ69[0pX@2커llش̨;d(@d@h3@xg&`$rf 9]47) j",B3y#/`?޸P#9# tp<&#$C;u~̸ 1ܮdLda *~>nFenh 0s .c rL `-6.(>vrdt S\+IiL:5m&td :LH%_.E,^Xe8 R ~X!4::oT"*. qd5*C&hT)Lbu!gMm4nn0 D- 3 ~Yj4QF(3ҦW$'  #.C'7 r 54| 4H~B-IU Q+Ѥ-LR\0p,#*@ \-H6 1`1~b h&<B60&!@, <$# p'*-@/&q$ b<I P+3]4> 4j & !F81  H,TS `N < HO &Ҭ/lW2$ Dش%ahP4Ͼ $rN(&+]+ν8 tҬɶ# h?`# @0TP\968:[@(Tܜ 0cp@ :xD<>L֔$\^)&l \(<> P ch) ^<-$s"l@^ - ݓp8?@k2D7I%DJ+tp)y H &۫T/FZ@ۓe**؆݌le t& ( l+-vd'=܊F dx7 (P4 6 x1L <>\b(% E8x2ߒ"+Gh) X@û#!3I ""p DAcp!0>( Yi "+}dT ,A]>>CA5 BJ>efZ@4?D~E=(eK> ?|E.g<.m2t HT<-d$P) 9p. %&+ I* THl:y&- 2 D$(QpAQ #X 'X P)L8KQ)@w'&Z f& ^0(8(B^H  ,& H8p| Ԋd^Bh̊,~H; 2|%xxOo1qhP ?t!g̵!}(ht T'`lR L+wi?mL`< xִ  t ٘7 =-H%\ et )!.=FHFef0,V@15*& 0FܬCa(hM b:<_(HΫ#Y."`-à;A ~B4d D0!  ("!4%H2C̀`lZCk4dң,j(+b;Ն؝t Y d'*>,JNY # Z3 (4#@(7IMH!0<he;`$8o&|Ax. t0(l< d(:\?|9 @ P N):T,,!Jԑ(/͇+~Jգm# +#ƾuhb+T{0%(  r4[   8(E@¯ T(63 wP ڌ XV)& +گN |BlޜW4|6&Yrd <P*lReF `U p"  ^L*^v `@4 > !)B $ l~ rB"@ q`\ Xdm o ,<.\ӯ(tl.k2uHE #Gc>lvvX"t Ѐ 72Hkor u x چX`D82z,@]D&5*cjl~kN% "\dH q 1. w2G,"6! -$D[ i0L #ذ$. t0,1. $D*L°1&r84 ߘM@,ӰTӿ` qb'wGT T WcH:  Vwx(*; |ܸ. hO+a4-tt dy2f ;߄U- pne r y"8%  %H"H'B. P& (.n+R&"g ߡ3V'0,[ 3= GB\z&d h)LDR7P< pE P#V,C6@Xx,p`2}(,Q{  &Rp ,-2- D  P J0{ht ?;*q 0 p#$(& p|m,S/&iӞπ?gX(4: WL:lhPSBj3\dJ$H`,$p P:  z&G߀ jp] #"}#@ R n  y { 0XAp(.O4BZ t$Y C$ PxtM 7T L7 -r H \#1A 5 * . PZ {i,qR,41իݼlPBՔt | \ [B$DB)2d3_Q v~Yx* Ԑ ho  v< > uhE En?˥)8  St<,- (0 lx n 9{ % p2u TdPz\QZ ;o, }d ldm c,+M zB(08l$#0/'\G"0 f2z \ _#]FT Hd #L4 :lJH.J< z%*_ <p s'h VL'F0>)?j  ld$ۤ$dPxu J4|`>sZr:#th 0>#@_x,ry !  <8R ,0qTP +d78]Ll Khه >ܦp-Z*0 4Ч+w&4,H0y!+>  J BHP8   INz y y p O^L$K886+$ K`vr\0!ha  LL -t(!а| 9|FT 2: lAH p +e&* hPrPF/* :s4 Hz#>,xVP-4Xެ#&4؝r98tl+$"@@ |L,'Q ` 07kxNmbG1f <Ԇ# @XcoHR dzXk&̆P G0\!Xܫ& 46Դ$.|dg{04 '0ӷflG^DT ј %n ^ wz D "4'O"tNH3 ng *D7}`y Hq5 $NL y<8QG@, /`P'~6> Bi/'Z} {v\/! p !DD %U \m b xH< $ hhM 1 m#I 0`J  zB l"x`` RT- 3 2 &Hh$TMjX lG U \(D P :I H\ P@@ &i(%lxPS!i^ " $+4 t`U p IE  td/|z| ߇ # 0߬Q!3,z| GH | =o4 4 8 8}  N 1H 4o$&(o<  gd: 4 d,04 |  SpDp^Oߠ V B| jHާ\/L23 lWy\$:2hCT0 k`.t#34 ~6b lHz[,4*Dx& `%X n&Ep hvD֩T4#DpV $<>F ( n+{c~l ^B$  Vߐ o``zchTh3&lhfZ ZxC-  % !`X ~L(^-.TLHAZ$i</Xx <M' *Q A (. C h  P* t&p9 $4 ,w4d8 X mB`v6 h=< , V / H  qQL"l8 Rp h H LT4!L @)N'$a J@T&a8V2 )  t6 D] \(> <>H  XqxfR R4lz$-i K T PXr @'>|ݷtB`$J>DZ?|b 3j /(fCkp`ZB~C.vB8RlV90& p`T 8ުTH46= V!p-lqH,0*24(#Th e  UT  *y<  h,1 T X nX% $ 2I",@N$#%dmH a! l$pl | ^.!8B 0 h`@L 1x{0n  z ?$T A~Xtg,[zT.LL j`eE`6 /HTPH= bR)Z'm TrD`p:$v @ ]lx%(q8 ` -#*) \<N`R\I98j>h?*^Lj[T $ N< H h [+ 8BC Hod8Hd!l4 x [x| s߼8#pGs8<$޼dL\St$d,[Od[ h q L h # ~ n  a  uH=  B) ae 2"|_Z "pshcLE~ 0 < - ,0A  Mq%L :6dZ ,>6DrڲhH z͐"ܜɠɚ6ݓ `t.ŏXt$zz~xb+qn?x8,c?j;Wt[8_S{C^ F/x($|h[`c(pG0fLdt  `1 azP  ^i  ] 1. } 9 1 XH& B  a>j  " l|  <,/d-;?z``^X^_Cr\@D`*h4(([8^ 5 ~ AN I  dT VZ @YmZ 2. U) $EAU l  4> , 0 lm0 6 5 9 :$2 0 l    * aE (  A= 8@ U @ 9h` , !  m~r h6 | e h\2B 1 od ] 4 [588vD) pRel0dPkV*O`$/ [v{`$`tv"$4hgx$7$|<`t ,f(Dd*T6Xt{K(<&h[>,[38j[xc .$|Z84\`#&HZV(|$7KOvNd[t#$KLs~O46C vfH+r4&@Z| WFPx@c,F#YQ0 5  <2$ .P$ hN  T p ,D] t )  h $  t    ,M P l* v   B|  XE(  |] FdC`/Dsj?Ll0zN8c;0&XD`d<w{$74V0"aDXRcN41G8/ZmT8|L mpN| -P-FH z M4 eh X  h ^-ETxT1I& l h JB  M]\ d 5& j EZUh Q  bdx FVFs8B0H067Xhj{N8L8sl|lJ sbn\'(r@XfH#;Z\Dx|Xf||-da5\PdmR A4"t@TDNt2  > Tp8`c$p5Vp:7rp4to(r&s2k`4G H(Xf"[$B@ bh eu:X0* DT  <}m 5 aDDz  i x U V T ETx :4E\lG PHDLO0{x6_8'4 "XXL@hjlf\rPP8CZsbonM7P~X%EHB9fV 46 m v b ~ .  d`` 2   ) \ VA | $ l y L@ 8@ \yT$C_>Kc#\<*Nrz,DX.n{^,P/4~,ctf~l(nS#"Kj >vlJO\(V"h,=4((-)tU` @@8 ] $ `  8M = Pq    H AttF<fB 4.$T| B`$0d{dBdlPn\#XVl*" Ttd[\Gdb>`l/xDpL)Xjuj*FY ( B \I l ~ t b m * T r  - rjx@\t4uE(< X&\{Pt<2bGgG{|mP . 0 l R@J(Pt\Vd2/D zD(>O70 P"jhpKd6T(NW $?lj$hxht$L0oHbjbt*PR|;K(h$ xnP/`L / *4 %L,lhqlHZ]Y-Xj'8 $/? X gXN6HpT\8| 8[PO;hhV0P;nboG4O`p p8N("8vt6Dhp jF\$ kckn\| ((><JtQiy8`QFmE4F DTmx@8Ld`\ZVMui4R}QL8 8iL.4 -   LISTRINFOINAMUTvoiceISFT5GoldWave (C) Chris S. Craig, http://www.goldwave.comN class Combo_Booster_3SPN extends Combo; var xEmitter Effect; function StartEffect(xPawn P) { if (P.Role == ROLE_Authority) Effect = Spawn(class'RegenCrosses', P,, P.Location, P.Rotation); SetTimer(0.9, true); Timer(); } function Timer() { if (Pawn(Owner).Role == ROLE_Authority) { if (!Pawn(Owner).GiveHealth(5, Pawn(Owner).SuperHealthMax)) { if(Pawn(Owner).SuperHealthMax - Pawn(Owner).ShieldStrength >= 5) Pawn(Owner).AddShieldStrength(5); else Pawn(Owner).AddShieldStrength(Pawn(Owner).SuperHealthMax - Pawn(Owner).ShieldStrength); } } } function StopEffect(xPawn P) { if ( Effect != None ) Effect.Destroy(); } |^I#"^ZWKD G!@yztdFad %t [&#r` *ppl` j(` u)  G ~joefEhBwh*+ha/!%V.hwV*wV.61j6QjPV$ D%61jV$ g%61j++rV.61j6QjPV $ t+V $ qhh G@{K,6Qo%57&-( -] @-@  -@ 'j%j7w61j*!r61j{vj6Qj6QjPojN61ja/!v.61j^6Qj-S61j9?,dojjO6QoPEnding Game...!EV 61owV *H'oocV LastMan[, Gk BSlk%k7n 61knn wn*n-n-wi*(inkri*KSKi' G CZx r}*(;-Y;-U[&-@ (w.}*fr.}*(w.}* w}Z .}-w.}*.}j .}- GDB sTwT*Ta/!%S.TwS*wS.B S$ f%B rS.B S $ [TT GFc~n0c ^"r * s  GW Rj l a 9:9:$ E(W aw h#B(wW *a  w 9P#a$? HDfa GG\{K] Iw]*]-']%c% -S\-w\* w]\\$hc9D\#w.\* w.\*\]he]  GNz LtQ %Q 7\.61Q w\*q9?\9?, r\z \ $ ^%\$ ^&z Q  GKv i~Y/a9 v !v %10%b,<-($e$ GEJr+O.QryQR~wO*%O S&%O0&,O0&wQ*Q0%9?'Q GQ#@~ 8@--'ArI %.-C a +9?a Y 9?%#%+#7r61#*r61#*!!61#-61#rZ *Y Y x #nEb% v% [%-(9?9?,<9?%%-C '^w^*w.^*.^ O!o$^^EE%&l*#vv%-U'v&J(]/v&-U(/a0 k.-w.k*-.k%2r.k*r.k*.ka10vE -@ (/a0 kka/!m.kNka/!.k%2r.k*r.k*.ka ka/!].kavka/!H_ka/!b.kNs.kNka/!q.kN10-] v%Pvv%-]Z-'-~(-U(Wd vWvqq[%-'Y[,-C (H[q[%Q-'-d  #% #7 -t r61#*A#&  61#-'61#-(w61#*6I#6t#61# 6I#6I#, 6I#%-6]#' -6]#66e6%6t#66e6%6t#66e6%6t#66e6%6t#66e6%6t#66e6%6t#D&X D, 66e66e6D6t#66e66e6D6t#66e66e6D6t#66e66e6D6t#66e66e6D6t#66e66e6D6t#Ds 66e66e66e66e66e66e s n 6K#% w.61#*L.61# w61#*61#3r9D9?6R#b *Y Y P6K#j -t '  6K#%6K## # GMyOHsGQP@;ݝ -] Pa/!%m-SmP-.PWQPwQ*Qa/!d.Q-(QQ QPwQ*Qa/!R.IQqGQa/!Y.MQqrQa/!X.JQqQa/!Q.LQqQa/!V.XQqQa/!T.`QqQa/!W.HQqIQa/!S.]QqqQa/!P.[QQQ G b <fDb ..?5 `09:9:$0wb *,b 4&8r*r* !w.*. 6'Y]4129:c; 7--9?Aww*-(3 GSaW)l -] aiwa*Rwa*@aaa G a <oa ..}.-%w.* ff&?$$.-(5 9:9:$0*wa *%a  w9D8Sr*r* w.*. 6'P4129:; 70---W9?ww*-(3 GUQn-(b,<9?&vE vJ'] G^ <o9^ ..45 U%9:9:$0w^ *,^ 69D8r*r* w.*. 6'PR4129:X; 7--9?6ww*-(3 GWEJ[w[*Cr[*r[*p[a/!.[ vb r[*[a/!%[-[-([&.[N[[[a/!p-Ew[*w.[* w.[*[.[a[a[-([&[[[[ G[ <k2[ ..45 U9:9:$0w[ *%[  H&8r*r*  w.*. 6'PK4129:Q; 7--9?/ww*-(3 GYcvcwc*rc*c-] 9Dcdwc*w.c* w.c*c] %.caLw.c*Lw.c*.cic~caw.c*.ci%w.c*.cNcNw.c*.cq!Dc M9?] cc Gi oP ..i 99g  A9?.Da  i g wP *%P 4&wD*D.DeD GZLZ7hLewL*Z .LNwZ *Z $ eLL G\UPb~wb*gba/!%W .bgwW *W $ cUbb GD]ZWzԋ| rZ* #rZ* BrZ* Zn-]{ZGZqZ G_\{>F r\* #r\* Br\* \a/!pp\\*\ *\&3SPNv252.Weapon_ShieldGun_3SPNl%-\)3SPNv252.Weapon_AssaultRifle_3SPNE~%-\%3SPNv252.Weapon_BioRifle_3SPNN%-\'3SPNv252.Weapon_FlakCannon_3SPNB%-\$3SPNv252.Weapon_LinkGun_3SPNM%-\$3SPNv252.Weapon_Minigun_3SPN[O%-\+3SPNv252.Weapon_RocketLauncher_3SPN%-\'3SPNv252.Weapon_ShockRifle_3SPNP%-\(3SPNv252.Weapon_SniperRifle_3SPN4l% j%-\XWeapons.AssaultRiflel~%-\XWeapons.BioRifleN%-\XWeapons.FlakCannonB%-\XWeapons.LinkGunM%-\XWeapons.MinigunRO%-\XWeapons.RocketLauncher%-\XWeapons.ShockRifleP%-\XWeapons.SniperRifles%\XWeapons.Translauncher GK <l9K ..45 U%9:9:$0wK *,K 09D8r*r* w.*. 6'PR4129:X; 7--9?6ww*-(3 Gavq~g-wvv f^vqv9?qdva/!v|.v^<K%<K72w61K*w61K*!r61Kv|6QKKp ?9?Pvv+f%9D9?^9?^p 9?|v,(9D9?q9?qp 9?|v9?9D9?q9?qp 9?|d5-Y-G'v MBx-@xva/!.vrva/!.vq.v.vi-~Fv@v GH <g8H ..45 U$9:9:$0wH *%H  w9D8r*r* w.*. 6'PQ4129:W; 7--9?5ww*-(3 Gcx Gyyu-rwx *Mx rwM*[Ma/!d.MjMM(wx *Mx wM*Ma/!K%.Ml&.MjuMa/!U%.M~uPMa/![%.MuMa/!R%.MBuMa/!T%.MMuMa/!S%.MNuMa/!V%.MOuJMa/!X%.MPuuMa/!g.M G%*(MM GE <a8E ..45 U$9:9:$0wE *%E  H9D8r*r* w.*. 6'PQ4129:W; 7--9?5ww*-(3 Ge{Fs -] {a/!%m-Sm{-.{]J{wJ*Ja/!d.J-'.JI%.JI&JJ J{wJ*FJa/!R.IJqJa/!Y.MJJa/!X.JJJa/!Q.LJJa/!V.XJJa/!T.`JHJa/!W.HJsJa/!S.]JJa/!P.[JJJ G C <c3C ..45 U9:9:$0wC *%C 2, 8r*r*  w.*. 6'PL4129:R; 7--9?0ww*-(3 Ggi]q -] -~'iwi*lri*ri*ri*i-wi*Fiii' G B <iMB ..45 U99:9:$0wB *,B 29D%B 2,8r*r* %w.*. 6'Pf4129:l; 7--9?Jww*-(3 GkNodo5vE -'% GF <l9F ..45 U%9:9:$0wF *,F 39D8r*r* w.*. 6'PR4129:X; 7--9?6ww*-(3 GxI <f8I ..45 U$9:9:$0wI *%I 39D8r*r* w.*. 6'PQ4129:W; 7--9?5ww*-(3 GoiH*jL -S Most Accurate: tMost Damage: ~Most Headshots: xwx*|rx*qj.xrj*j-qjyrJ*JDjDJj8rR*RYjYRjqrP*PhjhPjxxcrJ* rR* rP*  JDpJppp: 9UJD%jRY%tptRtppt: 9SRYrtPh%~p~P~pp~: 9SPh~xIwx*2wx*xa/!.x^t~xx GJ <j8J ..45 U$9:9:$0wJ *%J  @9D8r*r* w.*. 6'PQ4129:W; 7--9?5ww*-(3 Gw M <i8M ..45 U$9:9:$0wM *%M 09D8r*r* w.*. 6'PQ4129:W; 7--9?5ww*-(3 Gsu b *g-w 'wru * u a!]u a!nu $, -w (-w 9:9:$ -'-w  GN <iN ..T?m ף<=5 ~9:9:$0wN *%N 69D8.r*r* jw.*. 6'P4129:; 7 --29?ww*-(3 Gs iKia.&#.:-X.,".:{.,".:y & Gt~rd-s 'wr~* ~a!]~a!n~ $, -s (-s ~-'-rI-s  G vde?cpm9:,dmwd*Vw.d*.d edd" GrS _rS &.&',C,C.:-X'.:{.,.:y.,\,D,D.:-X(.:{.:yrS ,.:{.,rS ,.:y.,.:= Gwb |b\A%GA7=r61Ab AA&Ab l* Gyne^nn--GMw.n*.n{-gi %i 7r61i np3SPN_LMS: Already have LMSData for this PC: n i T61h nH7&7HH&h z-61H&-'61H&%nq!D-]w.n*.np GJ{nn[JAGN--.J-'9:9:$J--)--9?9?,9?&JJ GI~qIQVIdq6rI*Failed to spawn bot.(]&II-U d %I-'I%9:9:$[II q!k!z [II--G^ %^ 7r.61^ ILast Man Standing: Already have LMSData for a PC(^ (61r Ie 7&7e e &r ' GriK %ki@hc,a/!.&.c,-Y .,.c,-d.,9<6.c,].,9<6.c,].,9<6.c,].,9<6.c,f., 9<6.c,f., 9<6.c,frc,a r$r-'r >r.c,a $-' >. & , GC@N8@%-'-9:9:$V]% -(-m-9:9:$#-- e -R'$----9:9:$CwC*Ca/!%wC*C-C-C--R(CCV1-R-m- ,<-R'}-R --'j%N}9=9:$e G@}`G VG|oi6OK * y * I * } * o  GorgeO .6o rO *pppCould not load mesh: 6o For player: 6o N .6o ?rN *pppCould not load body material: 6o For player: 6o M .6o rM *pppCould not load head material: 6o For player: 6o -n y .c,]K N K y r O %rK &rM } .c,fI N I }  O %I &M  GAxM-j 9:9:$zppppppppppAM-6f h-9S-9S-9S-9S-ServerDemo GB(p,,f(z(CamperAlarmH{-d 9K(AllowPickups{-]9K(AllowAdrenaline{-G9K(GiveAdren{-Y9K-Y'-G'(StartingHealthA{q9J(StartingArmorz{^9J(roundsToWin{P9J(FullAmmo{-9K(SpecsCanTalk{-E9K(SurvivorModeX{-w9K(ChallengeMode{-w9K(CampThreshold{n 9?9J(ReCamperWarnInterval {j 9J(CampDamageC{b 9L(overtimeDamage}{Z 9J(overtimeDamageTime{Y 9L(adrenalinePerKill{p9L(healthPerKill1{c9J(maxHealthf{d9L(ImprovedShieldGun{-I 9K(grenadeCount{j9J(assaultAmmoCount{l9J(bioAmmoCountP{~9J(shockAmmoCount{9J(linkAmmoCount{B9J(miniAmmoCount{M9J(flakAmmoCount5{N9J(rocketAmmoCountp{O9J(lightningAmmoCount{P9J(transAmmoCount{s9J(DisableSpeed!{- 9K(DisableBooster\{-q 9K(DisableBerserk{-m 9K(DisableInvis{-p 9K(DisableHitsounds {-W 9K(DisableBrightskinsL{-g9K(roundTime{b9J(AutoRecDemos{-j 9K(ForceRUP{-m9K r * a  l3SPN-LMS6f h9V~9V.-6X  h-Y-6]  h-G-6_  h--6`  h-]-6g  h--6G h-E-6k  h--6|  h-w6q hq6s h^6r hP6~  hb6r  hZ 6l  hY 6h hp6P  hc6A  hd-6y h-I 6x hj6u hl6q h~6p h6b hB6S hM6L hN6H hO6G hP6P hsR&1 j%RC l%RU ~%Rg %Ry B%R M%R N%R O%R P%R s%R -A -d  D n  G j  Q b  -w -g -u-W  -W-  -t-q  -l-m  -A -p  -S -g -k -m -Sp p9?,B-I  ? = s% -]  9?s 9?s -(%-'-]-(& AXJwX*3Xa/!yUTComp found.!E-S'JXX-SUsing UTComp Classes.!ExInterface.HUDCDeathmatchxInterface.ScoreBoardDeathMatch >Using 3SPN Classes.!E  r   V   X 3SPNv252.Game_Pawn_3SPN -u-Sb b GDs*M- (- (- '- ' G@EX ruX 8startingHealthBase health at round-start. gstartingArmorBase armor at round-start. bAllowAdrenalineTurn on or off adrenaline. bGiveAdrenGive full adrenaline at round-start. bFullAmmoGive full ammo at round-start. 0bAllowPickupsPlayers must pick up weapons. bChallengeModeRound winners take a health/armor penalty. (Formerly known as Survivor Mode) roundsToWinThe rounds a team must win to win the game. roundTimeThe minutes a round goes before it goes into overtime. `overtimeDamageThe damage players take every so often in overtime. overtimeDamageTimeHow often players take damage in overtime. adrenalinePerKillThe adrenaline received per kill. healthPerKillThe health received per kill. VmaxHealthThe maximum health a player can achieve (percentage). bForceRUPForces players to ready up after 30 seconds. bImprovedShieldGunGives players a modified shield gun, with higher shield jumps and reduced self-damage. &grenadeCountGrenades given. QassaultAmmoCountAssault ammo given. tbioAmmoCountBio ammo given. shockAmmoCountShock ammo given. linkAmmoCountLink ammo given. miniAmmoCountMini ammo given. flakAmmoCountFlak ammo given. 3rocketAmmoCountRocket ammo given. blightningAmmoCountLightning ammo given. transAmmoCountTranlocator charges given (these do not recharge). bCamperAlarmChecks for players remaining in the same spot for too long (camping). PCampThresholdThe area a player must stay in to be considered camping. ReCamperWarnIntervalThe amount of time between warning the same player. CampDamageThe damage a player takes each time they're caught (multiplied by the number of times they've been caught). TbDisableSpeedDisable the Speed adrenaline combo. bDisableInvisDisable the Invisibility adrenaline combo. bDisableBoosterDisable the Booster adrenaline combo. bDisableBerserkDisable the Berserk adrenaline combo. X  G(F/Gu//>bstartingHealthStarting Health$$kText3;0:999 '/<bstartingArmorStarting Armor$$lText3;0:999 '/1bbAllowAdrenalineAdrenaline$$oCheck/EbadrenalinePerKillAdrenaline per Kill$$pText3;0:100 '/0bbGiveAdrenFull adrenaline$$qCheck/6bbFullAmmoGive Players Full Ammo$$xCheck/2bbAllowPickupsAllow Pickups.$$yCheck/3bbChallengeModeChallenge Mode$$Check/9broundsToWinRounds to Win$$Text3;0:999 '/;broundTimeMinutes Per Round$$Text3;0:999 '/>bovertimeDamageOvertime Damage$$Text3;0:999 '/DbovertimeDamageTimeOvertime Interval$$Text3;0:999 '/=bhealthPerKillHealth Per Kill$$Text3;0:999 '/6bmaxHealthMax Health$$Text8;0.0:2.0 '/+bbForceRUPForce Ready$$Check/@bbImprovedShieldGunUse Modified Shield Gun$$Check/5bgrenadeCountGrenades$$Text3;0:999 '/=bassaultAmmoCountAssault Ammo$$Text3;0:999 '/5bbioAmmoCountBio Ammo$$Text3;0:999 '/9bshockAmmoCountShock Ammo$$Text3;0:999 '/7blinkAmmoCountLink Ammo$$Text3;0:999 '/7bminiAmmoCountMini Ammo$$Text3;0:999 '/7bflakAmmoCountFlak Ammo$$Text3;0:999 '/;brocketAmmoCountRocket Ammo$$Text3;0:999 '/AblightningAmmoCountLightning Ammo$$Text3;0:999 '/@btransAmmoCountTranslocator Ammo$$Text3;0:999 '/4bbCamperAlarmCheck for Campers$$Check/<bCampThresholdCamp Threshold$$Text5;0:999 '/DbReCamperWarnIntervalCamper Interval$$Text3;0:999 '/8bCampDamageCamper Damage$$Text3;0:999 '/1bbDisableSpeedDisable Speed$$Check/8bbDisableInvisDisable Invisibility$$Check/5bbDisableBerserkDisable Berserk$$Check/5bbDisableBoosterDisable Booster$$Check G GPAea eP(PNum Rounds9SP(PStarting Health9Sq(PStarting Armor9S^(PAdrenaline9T-G(PAdrenaline Per Kill9Up(PChallenge Mode9T-w(PAllow Pickups9T-](PHitsounds9T-W (PBrightskins9T-g(P3SPN Version Y G _W _  m_  m_  m_  m_  m_  m_  m_ G b j 5-n .&b &.c,-Y .b.&c,c7cDczc,c7cCc ,.c,-d.bv.b.,Enemies:.,Teammates:.,Red Team:.,Blue Team: ,6.c,]9C.b 2,6.c,]9C.b l,6.c,]9C.b ,6.c,f9C.b , 6.c,f9C.b , 6.c,f9C.b i.c,b GFN_K%-q-a -X -q'EwE*crE*~~rE_EEArE* wg*wg*rg_.ga/!%.g $  .gu  C$ga/!vg-.gi  _9?R,-F 'EwE*wE*wE*:E_E--F (EE -F E wE*wE*vE-YwE*:E_}Ea/!t.E A!S$Ea/!vE-.Ec  Ea/!t.E A!T$EE`__9?&___9?REnding Game...!EH _wH *H'cH LastManZ, GHR w -n (R  S d d U Y Z rAa S 6d U 6d Y 6d Z R ar('BAa S 6i U 6i Y 6i Z R a('B( GAS  PRl],wR*R-CR-J 'ANwA*7wA*wA*A-A-A-rC*CA77wAC(wAC-J (NAAH}-J pwC*KC{KR'( G QUx-g rr*(-xw.r*Ar.r*(w.r* wrU .r-w.r*.rj .r-d-fZ&-q(w.r*)r.r*(-qw.r* wrU .r-.rUw.r* wrU .r-w.r*.rj .r- GR[sG r[* |w|*w|*|a/!%|.|w|*w|.[|$ f%[r|.[| $ [||! GW\[ywy*twy*ya/!%` .ytw` *` $ |\yy GKTQ6.c,]$P6.c,]$6.c,]$6.c,f$6.c,f$6.c,f$Z.c,-d(.,.c,-d.,9<6.c,].,9<6.c,].,9<6.c,].,9<6.c,f., 9<6.c,f., 9<6.c,f ,i' GUZK/ |10ZUc,a/!.&|-W.,|-t.,|-l.,|-A .,|-u.,|-w .,|-A ., |-L ., |-k ., 9U|D ., 9S|G ., 9U|Q  GXKVlKwK*6rK*K-KiKi&KnKKn*KK3%i& &i& `%i& &i,g%n&i& %i,g&n GYc~i0c] |"r] * s]  G``{| Iwj*j-'j%brjgg*, rg*Vw% -@`-w`* wj``$hw9D`bw.`* w.`*`j{|| w`* wj*C`jl* GV[ M GZ]Q#}#.:=' G^fKKfNHc,a/!.&.c,-f .,.c,-f.,.c,-z .,.c,-z.,.c,-x.,.c,-{ .,.c,-v  GdT LGwG*ErG*Ga/!%V.GwV*9?V9?, rVT V $ ^%V$ ^&T GG Gc` iY/a9 ` !` %10%@,<-($e$ G_n Jrn&.c,-f .n.c,brn,.c,-f.n.c,brn,.c,-z .n.c,b1rn,.c,-z.n.c,b|rn,.c,-x.n.c,brn,.c,-{ .n.c,brn,.c,-v .n.c,b GY@s .-rn[n,n%k 8@G--'orI %V-\ AS9?A9?9DK 9?%WSwW*rW*rW*rW*<<W-WrH *V V x WW`G@% }% Z%-(9?9?,<9?%D%-\ 'WDwW*-w.W*.W O!o$WW``&l*>}}%-f'}&J(]J}&-f(/a0 nIHw.n*H.n%2r.n*r.n*.na10}U -q(/a0 nna/!m.nNna/!.n%2r.n*r.n*.na;na/!].nana/!Hzna/!b.nN.nNna/!q.nN10-X }%P}}%-XZ-a'-e(-f(W} 4}W}Z%-'tZ,-\ (HZZ&n%-r'-U 'E E,EZ&EN& Z%Q-'-e -@ W wW*brW*rW*  W-W-(wW*Y.-WYC YxyY YC @YC , YC %Y-V ' Y-V 66d6%Yxy66d6%Yxy66d6%Yxy66d6%Yxy66d6%Yxy66d6%YxyB& B, 66d66d6BYxy66d66d6BYxy66d66d6BYxy66d66d6BYxy66d66d6BYxy66d66d6BYxyB7t 66d66d66d66d66d66d t ] YH % w.W*L.WY1r9D9?Ynf *V V PYH ^ -M'  YH %YH WW3 Gfas GyK / ~10yu%9S6q~h&9S6s~h,9T-6] ~h,9U6h~h9?,,9T-6` ~h,9T-6g ~h,9T-6| ~h,9S6r ~h,9U6l ~h, 9S6P ~h, 9U6A ~h, 9T-6_ ~h, 9T-6X ~h, 9T-6G~h,9T-6k ~h,9S6r~h,9S6~ ~h,6f~h.& %., &.,9K,.,,.,9K,.,9K,.,9K,.,,., ,., , ., , ., 9K, ., 9K, .,9K, .,9K,.,,.,,.,,e %e 7 e e  GgN@3Q -X Na/!%m-@mN-.NWTNwT*Ta/!d.T-(TT TNwT*Ta/!R.ITqGTa/!Y.MTqrTa/!X.JTqTa/!Q.LTqTa/!V.XTqTa/!T.`TqTa/!W.HTqITa/!S.]TqqTa/!P.[TTT GhSW!y -X SvwS*_wS*wS*@SSS GiQM}-a(@,<9?&}U -_'g*vJ'] GkEJ_w_*Cr_*r_*p_a/!._ v@ r_*_a/!%_-_-(_&._N[__a/!p-Ew_*w._* w._*_._a_a_-(_&[___ Gel AAl b,H.,.,D_.,C> ,.,.,D.,C> ;,!z.,9J.,%., D8., C>  Gobvbwb*rb*b-N bfwb*w.b* w.b*bN .baNw.b*Nw.b*.bib~baw.b*.bi%w.b*.bNbNw.b*.bq!Db MN bb GjmQ^ t%t,\t&a/!Vt.t&t&a/!Ut9T.t&t,9U9L,9?,b.:=' GntqBZihBewB*K .BNwK *K $ eBB GsKsvc,a/!.&.c,-h .,.c,-E.,.c,-n .,.c,-o .,.c,-}.,.c,-h .,.c,-_ wc,*.,#.c,-.,( GrrPém~wm*gma/!%I .mgwI *I $ crmm Gt\Wp| r\* #r\* Br\* \n-X{\G\q\ GpN 5JrN&.c,-h .N.c,brN,.c,-E.N.c,brN,.c,-n .N.c,b+rN,.c,-o .N.c,bxrN,.c,-}.N.c,brN,r.c,* -.N.c,-.N.c,bbrN,.c,-h .N.c,brN,.c,-_ .N.c,b Gum{4B! rm* #rm* Brm* hma/!pm&3SPNv252.Weapon_ShieldGun_3SPN}%m)3SPNv252.Weapon_AssaultRifle_3SPNz%m%3SPNv252.Weapon_BioRifle_3SPN?s%m'3SPNv252.Weapon_FlakCannon_3SPNww%m$3SPNv252.Weapon_LinkGun_3SPNu%m$3SPNv252.Weapon_Minigun_3SPNp%m+3SPNv252.Weapon_RocketLauncher_3SPN)x%m'3SPNv252.Weapon_ShockRifle_3SPNem%m(3SPNv252.Weapon_SniperRifle_3SPN}% h%mXWeapons.AssaultRiflez%mXWeapons.BioRifles%mXWeapons.FlakCannon.w%mXWeapons.LinkGunZu%mXWeapons.Minigunp%mXWeapons.RocketLauncherx%mXWeapons.ShockRiflem%mXWeapons.SniperRifleD%mXWeapons.Translauncher GwLqHVL%s%9D%&s%9D&%C 9DL-^LL f{LgL9?gvx>9?RD 9D9?g9?gx9?s9?gx9?C _9D9?{9?{x9?s9?{x9?C LLf%_L,(D L9?D vLa/!v.L^s.LyL.Lk9DL.LO L.LP 9DL%-B -a'L MBh-f hLa/!.LrLa/!.Lq.L.Li-eFL@L G@K c/ o10@~%9S6qoh&9S6soh,9T-6] oh,9U6hoh9?,,9U6Voh,9T-6` oh,9T-6g oh,9T-6| oh,9S6r oh, 9U6l oh, 9S6P oh, 9U6A oh, 9T-6_ oh, 9T-6X oh,9T-6Goh,9T-6k oh,9S6roh,9S6~ oh,6foh,9T-6x oh.& %., &.,9K,.,,.,,.,9K,.,9K,.,9K,., ,., , ., , ., , ., 9K, .,9K, .,9K,.,9K,.,,.,,.,,.,9K,.,9S6Wohm %`m 7 m m 5 Gxy G”u-z rwy *Cy rwC*[Ca/!d.CjCC(wy *Cy wC*Ca/!K%.C}&.ChCa/!U%.CzhCa/![Ca/!G%.CxCa/!R%.CwCa/!T%.CuCa/!S%.Cs0Ca/!V%.CpbCa/!X%.CmCa/!g.C G%*(CC GyFȎ -X a/!%m-@m-.]BwB*Ba/!d.B-'.BI%.BI&BB BwB*FBa/!R.IBqBa/!Y.MBBa/!X.JBBa/!Q.LBBa/!V.XBBa/!T.`BHBa/!W.HBsBa/!S.]BBa/!P.[BBB Gzs]m -X -e'sws*lrs*rs*rs*s-Fsss' GBN[=}U -_'-'% GvE H E b,H.,.,D_.,C ,z.,!9L.,.,D.,C ?,%.,.,D<.,C , z., 9J., %., D., C  G@ {~Ql F%F,\F&a/!VF.F&F&a/!UF9T.F&F,9U9L,9?,b.:=' GFcIK(/ `10IP&z`l3SPN-LMS., -6y`h.&9S6x`h.,9S6u`h.,9S6q`h.,9S6p`h.,9S6b`h.,9S6S`h.,9S6L`h.,9S6H`h., 9S6G`h., 9S6P`h%%z`l3SPN-TDM., -6y`h.&9S6x`h.,9S6u`h.,9S6q`h.,9S6p`h.,9S6b`h.,9S6S`h.,9S6L`h.,9S6H`h., 9S6G`h., 9S6P`h G DEl*w'@ EFr@ *@  -  rc*~-_J@6E 9?,@$tIrE rE@$tI@6E 9?, GwG*wG*G-wG*FG E FG G @$tI2F9?!G{c{ wGc@F9?, 22G{c{@F9?, b$E G G{c{ wGc@G E 9?,@G E 9?,GG@@ Gw KdIz15wd*wd*dwd*wd*9:9:$:-/wd*d-dw*wId| } ww*w={} /a0 ~ <;|9W~  } 0~ 10wd*wd*wd*b 9=db | b | w 5ww*Tlwb dTYYTZwww  rZ*Warning - PATHS NOT DEFINED or NO PLAYERSTART with positive ratingY /a0 w Tlw$dw. w*T9?,2T9?,TYYTZw10Z(--_(Z GAFQ+y#.:=' GG dnKHwK*&- ~e- xw%K* 9S9D%Kw&K* 9S9D&Kewc,*4c,% e GdI  ( G~KLIHtL -@ WMost Accurate: oMost Damage: rMost Headshots: ~w~*|r~*qe.~re*e-qeyrw*wDeDwe8r@*@YeY@eqrA*AhehAe~~crw* r@* rA*  wDWpWwWpppW: 9UwD%Wj@Y%opo@oppo: 9S@YroAh%rprArppr: 9SAhr~Iw~*2w~*~a/!.~^Wor~~ GMkyrB-r(n%E-U (W GOXjBiI^X"I yrX*:rX*X- I,X,*Timeouts are disabled on this server  I&-rX:*You can not cancel a Timeout once it takes effect.kDwD*wD*Da/!%X%.D%*Red Team canceled the Timeout.D&*Blue Team canceled the TimeoutDD3 II,X$*A Timeout is already pending I,X+*Your team has no Timeouts remaining X-An%kD>wD*'wD*Da/!%.D"*Admin canceled the TimeoutDDn,E,WEDwD*wD*Da/!%.D*Admin called a TimeoutDDyn,EXWEDwD*wD*Da/!%E%.D!*Red Team called a Timeout.D"*Blue Team called a TimeoutDDA GQq^e"-6rq*rq*Sq-%vrq*q--],Eq&-r E,qZ%,% GoSmrc-o'wrm* ma!]ma!nm $, -o(-om-'-rI-o G`TVba-`'wrV* Va!]Va!nV $, -`(-`9:9:$ -'-` GVh|D`hl* GJiK/ r 10ilJ.,-X}{{c,&wpppadminlogin { yc,wpadminlogin ys.;JdbAM3SPNv252.Menu_LMSTab_3SPN Configure the ArenaMaster Gametypezr l3SPN-LMSh.*JjbTAM3SPNv252.Menu_TDMTab_3SPN Configure the Team ArenaMaster Gametypezr l3SPN-TDMo.aJ_bGeneral3SPNv252.Menu_GeneralTab_3SPN Options that effect all players and gametypes({._JLbWeapons3SPNv252.Menu_WeaponsTab_3SPN Configure weapons and ammo(T.eJKbAdmin3SPNv252.Menu_AdminTab_3SPN Miscellaneous and admin stuff(rs*Failed to create AM tab.rh*Failed to create TAM tab.Br{*Failed to create Weapons tab.lrT*Failed to create admin tab.ro*Failed to create general tab. GX{e]{{--aMw.{*.{{-t-a{-'{%{q!D-Xw.{*.{p Gv[qn[vqnmN--.v-'9:9:$v--)--9?9?,9?&vv GU{=;u/ w10w.;{* ,sXz  DM-Rankin p ?Game=3SPNv252.LMS_Game_3SPN pp ?startingHealth=%s pp ?startingArmor=&s pp ?AllowAdrenaline=,s pp ?adrenalinePerKill=,s pp ?AllowPickups=,s pp ?WeaponStay=,s pp ?SurvivorMode=,s pp ?overtimeDamage=,s pp ?overtimeDamageTime=,s pp ?healthPerKill=, s pp ?maxHealth=, s pp ?FullAmmo=, s pp ?GiveAdren=, s pp ?SpecsCanTalk=, s pp ?PlayersMustBeReady=,s pp ?roundsToWin=,s pp ?roundTime=,sJc,-9:c,9:$pChanging map and settings: !E.c, = Cc,-c,*U3SPNv252.Menu_AdminLoginPopup_3SPN w.*{* ,hz  DM-Rankin p ?Game=3SPNv252.TDM_Game_3SPN pp ?startingHealth=%h pp ?startingArmor=&h pp ?AllowAdrenaline=,h pp ?adrenalinePerKill=,h pp ?friendlyfirescale=,h pp ?AllowPickups=,h pp ?WeaponStay=,h pp ?SurvivorMode=,h pp ?overtimeDamage=,h pp ?overtimeDamageTime=, h pp ?healthPerKill=, h pp ?maxHealth=, h pp ?FullAmmo=, h pp ?GiveAdren=, h pp ?SpecsCanTalk=,h pp ?PlayersMustBeReady=,h pp ?roundsToWin=,h pp ?roundTime=,h pp ?ReverseFF=,h pp ?numTimeouts=.,ho c,-9:c,9:$pChanging map and settings: !E.c, = C  c,-c,*U3SPNv252.Menu_AdminLoginPopup_3SPNw._{* zwl3SPN-LMS 6fwh= = zwl3SPN-TDM 6fwhZ z  DM-Rankin pp ?ImprovedShieldGun=9T., { pp ?grenadeCount=.&{ pp ?assaultAmmoCount=.,{ pp ?bioAmmoCount=.,{ pp ?shockAmmoCount=.,{ pp ?linkAmmoCount=.,{ pp ?miniAmmoCount=.,{ pp ?flakAmmoCount=.,{ pp ?rocketAmmoCount=.,{ pp ?lightningAmmoCount=., { pp ?transAmmoCount=., { c,-9:c,9:$pChanging map and settings: !E.c, = Cc,-c,*U3SPNv252.Menu_AdminLoginPopup_3SPNw.e{*bw.a{*fzwl3SPN-LMS 6fwhzwl3SPN-TDM 6fwhz  DM-Rankin pp ?DisableSpeed=9T.&o pp ?DisableBooster=9T.,o pp ?DisableBerserk=9T.,o pp ?DisableInvis=9T.,o pp ?DisableHitsounds=9T.,o pp ?DisableBrightskins=9T.,o pp ?CamperAlarm=9T.,o pp ?CampThreshold=., o pp ?ReCamperWarnInterval=., o pp ?CampDamage=., o pp ?AutoRecDemos=9T., o pp ?ForceRUP=9T., o]c,-9:c,9:$pChanging map and settings: !E.c, = Cc,-c,*U3SPNv252.Menu_AdminLoginPopup_3SPN G]]vI]7X&]dv6r]*Failed to spawn bot.(]&]]-f } %]-']%9:9:$[]] q!k!z []]--a' Gy@VP8@%-'-9:9:$V]% -(-r-9:9:$#-- e -A'$----9:9:$ywy*ya/!%wy*y-y-y--A(yyV1-A-r- ,<-A'}-A --'j%N}9=9:$e G^\`UWG_x N-Q 9:9:$ -@zppppppppppTAM-6fh-9S-9S-9S-9S-ServerDemo Gb%p"+%~ %CamperAlarmH{ -e 9K  %CampThreshold{ ] 9?9J  %ReCamperWarnInterval{ ^ 9J  %CampDamage{ f 9L  %AllowPickups2{ -X9K  %AllowAdrenalinen{ -a9K  %GiveAdren{ -B 9K -B '-a' %StartingHealth{ g9J  %StartingArmor+{ {9J  %roundsToWinb{ R9J  %FullAmmo{ -z 9K  %SpecsCanTalk{ -Z 9K  %SurvivorMode { -^9K  %ChallengeModeC{ -^9K  %overtimeDamage}{ H 9J  %overtimeDamageTime{ K 9L  %adrenalinePerKill{ f9L  %healthPerKill1{ w9J  %maxHealthf{ v9L  %ImprovedShieldGun{ -R 9K  %grenadeCount{ h9J  %assaultAmmoCount{ }9J  %bioAmmoCountP{ z9J  %shockAmmoCount{ x9J  %linkAmmoCount{ w9J  %miniAmmoCount{ u9J  %flakAmmoCount5{ s9J  %rocketAmmoCountp{ p9J  %lightningAmmoCount{ m9J  %transAmmoCount{ D9J  %DisableSpeed!{ -k 9K  %DisableBooster\{ -o 9K  %DisableBerserk{ -x 9K  %DisableInvis{ -u 9K  %DisableHitsounds { -L 9K  %DisableBrightskinsL{ -t9K  %ReverseFF{ -[ 9K  %numTimeouts{ v9J  %roundTime{ @9J  %AutoRecDemos' { -Q 9K  %ForceRUP\ { -r9K u r*a l3SPN-TDM6fh9V~9V.-6X h-B -6] h-a-6_ h-z -6` h-X-6g h--6Gh-Z -6k h--6| h-^-6x h-[ 6qhg6sh{6rhR6~ h@6r hH 6l hK 6hhf6P hw6A hv6Vh 6Whv-6yh-R 6xhh6uh}6qhz6phx6bhw6Shu6Lhs6Hhp6Ghm6PhDU& h%U }%U z%U! x%U3 w%UE u%UW s%Ui p%U{ m%U D%U-A -e D ] G ^ Q f -w -t-u-L -W-k -t-o -l-x -A -u -S -_-L -Q -k -r-@ff@@-R  ? = |D% -X  9?D 9?D -(-]v%-]%Zv&Zv-p -]-U (W%Nv&Nv%-'7-X-(& ADwD*Da/!yUTComp found.!E-@'DD]9-@Using UTComp Classes.!ExInterface.HUDCTeamDeathmatchxInterface.ScoreBoardTeamDeathMatch Using 3SPN Classes.!E  r   V   X 3SPNv252.Game_Pawn_3SPN-u-@bb G@JGK !L/ Y10GXJ.,z.mJEbGeneral3SPNv252.Menu_PlayerTab_3SPN Misc. player options'B.zJDbHUD3SPNv252.Menu_HUDTab_3SPN HUD-related player options(O.FJMbBrightskins3SPNv252.Menu_BrightskinsTab_3SPN Brightskins options( GcLrL 8startingHealthBase health at round-start. gstartingArmorBase armor at round-start. bAllowAdrenalineTurn on or off adrenaline. bGiveAdrenGive full adrenaline at round-start. bFullAmmoGive full ammo at round-start. 0bAllowPickupsPlayers must pick up weapons. bChallengeModeRound winners take a health/armor penalty. (Previously known as Survivor Mode) roundsToWinThe rounds a team must win to win the game. roundTimeThe minutes a round goes before it goes into overtime. bovertimeDamageThe damage players take every so often in overtime. overtimeDamageTimeHow often players take damage in overtime. adrenalinePerKillThe adrenaline received per kill. healthPerKillThe health received per kill. XmaxHealthThe maximum health a player can achieve (percentage). bForceRUPForces players to ready up after 30 seconds. numTimeoutsThe number of timeouts a team has. bReverseFFReverses friendly fire damage to damage the shooter. bImprovedShieldGunGives players a modified shield gun, with higher shield jumps and reduced self-damage. grenadeCountGrenades given. assaultAmmoCountAssault ammo given. bioAmmoCountBio ammo given. shockAmmoCountShock ammo given. =linkAmmoCountLink ammo given. bminiAmmoCountMini ammo given. flakAmmoCountFlak ammo given. rocketAmmoCountRocket ammo given. lightningAmmoCountLightning ammo given. 'transAmmoCountTranlocator charges given (these do not recharge). bCamperAlarmChecks for players remaining in the same spot for too long (camping). CampThresholdThe area a player must stay in to be considered camping. ReCamperWarnIntervalThe amount of time between warning the same player. CampDamageThe damage a player takes each time they're caught (multiplied by the number of times they've been caught). bDisableSpeedDisable the Speed adrenaline combo. bDisableInvisDisable the Invisibility adrenaline combo. LbDisableBoosterDisable the Booster adrenaline combo. bDisableBerserkDisable the Berserk adrenaline combo. L G(d+Gl@ ++>bstartingHealthStarting Health$$kText3;0:999 '+<bstartingArmorStarting Armor$$lText3;0:999 '+1bbAllowAdrenalineAdrenaline$$oCheck+EbadrenalinePerKillAdrenaline per Kill$$pText3;0:100 '+0bbGiveAdrenFull adrenaline$$qCheck+6bbFullAmmoGive Players Full Ammo$$xCheck+2bbAllowPickupsAllow Pickups.$$yCheck+3bbChallengeModeChallenge Mode$$Check+9broundsToWinRounds to Win$$Text3;0:999 '+;broundTimeMinutes Per Round$$Text3;0:999 '+>bovertimeDamageOvertime Damage$$Text3;0:999 '+DbovertimeDamageTimeOvertime Interval$$Text3;0:999 '+=bhealthPerKillHealth Per Kill$$Text3;0:999 '+6bmaxHealthMax Health$$Text8;0.0:2.0 '++bbForceRUPForce Ready$$Check+4bnumTimeoutsTimeouts$$Text3;0:999 '++bbReverseFFReverse FF$$Check+@bbImprovedShieldGunUse Modified Shield Gun$$Check+5bgrenadeCountGrenades$$Text3;0:999 '+=bassaultAmmoCountAssault Ammo$$Text3;0:999 '+5bbioAmmoCountBio Ammo$$Text3;0:999 '+9bshockAmmoCountShock Ammo$$Text3;0:999 '+7blinkAmmoCountLink Ammo$$Text3;0:999 '+7bminiAmmoCountMini Ammo$$Text3;0:999 '+7bflakAmmoCountFlak Ammo$$Text3;0:999 '+;brocketAmmoCountRocket Ammo$$Text3;0:999 '+AblightningAmmoCountLightning Ammo$$Text3;0:999 '+@btransAmmoCountTranslocator Ammo$$Text3;0:999 '+4bbCamperAlarmCheck for Campers$$Check+<bCampThresholdCamp Threshold$$Text5;0:999 '+DbReCamperWarnIntervalCamper Interval$$Text3;0:999 '+8bCampDamageCamper Damage$$Text3;0:999 '+1bbDisableSpeedDisable Speed$$Check+8bbDisableInvisDisable Invisibility$$Check+5bbDisableBerserkDisable Berserk$$Check+5bbDisableBoosterDisable Booster$$Check G WA\ hW(WRounds to Win9SR(WStarting Health9Sg(WStarting Armor9S{(WAdrenaline9T-a(WAdrenaline Per Kill9Uf(WChallenge Mode9T-^(WAllow Pickups9T-X(WHitsounds9T-L (WBrightskins9T-t(W3SPN Version Y GafKfu9wOr*OraOr*rwO*OaO* GsKEsy.,., G\mFuI`u$w.F*\%\,|\.FxGame.ComboDefensive\.F3SPNv252.Combo_Booster_3SPN\.t-@Fa/!K%.F D&.F F_Fa/!U%.F i &.F | Fa/![%.F u &.F QFa/!R%.F I &.F R FFa/!T%.F y &.F } Fa/!S%.F ^ &.F g Fa/!V%.F `&.F c Fa/!X%.F U J .tPrJ *Error fetching TDMGame.'J -XFa/!qJ -a('Fa/!H(Fa/!sF-'' GgkC 7 GjaHa &q .,p .,|zq c,wpadminlogin p c,&wpppadminlogin q  p C ' Gox e*cH .tu .x 6ru * U.u \rU* rH -f  L%qL,g|LUxGame.ComboDefensiveLU3SPNv252.Combo_Booster_3SPNLU@3SPNv252.Combo_Booster_3SPN UULU@qLyx  Gq qs x9:9:$s a fjr*s  as  G[ mq].t-@]w.[ *r.[ *.[  [ l GlrKrw GMxGuI\u$w.G*M%M,|M.GxGame.ComboDefensiveM.G3SPNv252.Combo_Booster_3SPNMa .Cra *Error fetching LMSGame.'P.C-SSGa/!K%.G D&.G FPGa/!U%.G i &.G | PGa/![%.G u &.G QP:Ga/!R%.G I &.G R PGa/!T%.G y &.G } PGa/!S%.G ^ &.G g P!Ga/!V%.G `&.G c PPGa/!X%.G U a -]Ga/!qa -G('Ga/!H(Ga/!sG-'' GrvC  Gu@H7@ @&c,%U3SPNv252.Menu_PlayerMenu_3SPN y,c,$U3SPNv252.Menu_AdminMenu_3SPN ,.c,jC ' G~j e*_o .Cg .j 6rg * O.g \rO* ro -@ T%qT,g|TOxGame.ComboDefensiveTO3SPNv252.Combo_Booster_3SPNTO@3SPNv252.Combo_Booster_3SPN OOTO@qTyj  Gw{w%zrl*/ l10Crl*.,D({ll3SPN-TDM/l-p c,-IlW/lWc,c,-.,DulWJlWc,c,-.,C.,Cancel Timeoutu.,Cc,-.,Call Timeout (*)u.,ppCall Timeout (9Sc,lN)( G|AS*> $?R@` x9:9:$` a fjr*`  a`  G} mq].C-S]w.} *r.} *.}  } D GAS*> $?RlK=cE b oK( GFpy=pM%Z%6%%X9?&69?%6Bp%XMg%X,6%&X9?,69?,6Bp&XM&X%H%A 9?&H9?%HBpA MA V%0%%W9?&09?%0Bp%WMc%W,0%&W9?,09?,0Bp&WM&W%4%%Q9?&49?%4Bp%QM%Q[,4%&Q9?,49?,4Bp&QMh&Q%3%%]9?&39?%3Bp%]M%],3%&]9?,39?,3Bp&]M&]]%2%%o9?&29?%2Bp%oMj%o,2%&o9?,29?,2Bp&oM&o%w%o 9?&w9?%wBpo Mo U%@%z 9?&@9?%@Bpz M`z %S%{ 9?&S9?%SBp{ M{ M%pp9?MpppBDp G] Red Color: c*$>$= $A] Blue Color: c*$ ?$= $AYi6 Gy Rclass Weapon_SniperRifle_3SPN extends SniperRifle HideDropDown CacheExempt; var bool bLocked; replication { reliable if(Role == Role_Authority) bLocked; reliable if(Role == Role_Authority) Lock, Unlock; } simulated function Lock() { bLocked = true; } simulated function Unlock() { bLocked = false; } simulated function bool ReadyToFire(int Mode) { if(bLocked) return false; return Super.ReadyToFire(Mode); } Pclass Weapon_ShockRifle_3SPN extends ShockRifle HideDropDown CacheExempt; var bool bLocked; replication { reliable if(Role == Role_Authority) bLocked; reliable if(Role == Role_Authority) Lock, Unlock; } simulated function Lock() { bLocked = true; } simulated function Unlock() { bLocked = false; } simulated function bool ReadyToFire(int Mode) { if(bLocked) return false; return Super.ReadyToFire(Mode); } Nclass Weapon_ShieldGun_3SPN extends ShieldGun HideDropDown CacheExempt; var bool bLocked; replication { reliable if(Role == Role_Authority) bLocked; reliable if(Role == Role_Authority) Lock, Unlock; } simulated function Lock() { bLocked = true; } simulated function Unlock() { bLocked = false; } simulated function bool ReadyToFire(int Mode) { if(bLocked) return false; return Super.ReadyToFire(Mode); } Xclass Weapon_RocketLauncher_3SPN extends RocketLauncher HideDropDown CacheExempt; var bool bLocked; replication { reliable if(Role == Role_Authority) bLocked; reliable if(Role == Role_Authority) Lock, Unlock; } simulated function Lock() { bLocked = true; } simulated function Unlock() { bLocked = false; } simulated function bool ReadyToFire(int Mode) { if(bLocked) return false; return Super.ReadyToFire(Mode); } ]Red:c*$ ף>$> $A]Green:c*$>$> $A]Blue:c*$>$> $A]Red:c*$R?$> $A]Green:c*$ף0?$> $A]Blue:c*$\B?$> $AAS*d>$u>$=$Y? $̌>\$?RAS*d>$q= ?$=$Y? $̌>\$?RJclass Weapon_Minigun_3SPN extends Minigun HideDropDown CacheExempt; var bool bLocked; replication { reliable if(Role == Role_Authority) bLocked; reliable if(Role == Role_Authority) Lock, Unlock; } simulated function Lock() { bLocked = true; } simulated function Unlock() { bLocked = false; } simulated function bool ReadyToFire(int Mode) { if(bLocked) return false; return Super.ReadyToFire(Mode); } AS*> $?RJclass Weapon_LinkGun_3SPN extends LinkGun HideDropDown CacheExempt; var bool bLocked; replication { reliable if(Role == Role_Authority) bLocked; reliable if(Role == Role_Authority) Lock, Unlock; } simulated function Lock() { bLocked = true; } simulated function Unlock() { bLocked = false; } simulated function bool ReadyToFire(int Mode) { if(bLocked) return false; return Super.ReadyToFire(Mode); } Pclass Weapon_FlakCannon_3SPN extends FlakCannon HideDropDown CacheExempt; var bool bLocked; replication { reliable if(Role == Role_Authority) bLocked; reliable if(Role == Role_Authority) Lock, Unlock; } simulated function Lock() { bLocked = true; } simulated function Unlock() { bLocked = false; } simulated function bool ReadyToFire(int Mode) { if(bLocked) return false; return Super.ReadyToFire(Mode); } Lclass Weapon_BioRifle_3SPN extends BioRifle HideDropDown CacheExempt; var bool bLocked; replication { reliable if(Role == Role_Authority) bLocked; reliable if(Role == Role_Authority) Lock, Unlock; } simulated function Lock() { bLocked = true; } simulated function Unlock() { bLocked = false; } simulated function bool ReadyToFire(int Mode) { if(bLocked) return false; return Super.ReadyToFire(Mode); } Tclass Weapon_AssaultRifle_3SPN extends AssaultRifle HideDropDown CacheExempt; var bool bLocked; replication { reliable if(Role == Role_Authority) bLocked; reliable if(Role == Role_Authority) Lock, Unlock; } simulated function Lock() { bLocked = true; } simulated function Unlock() { bLocked = false; } simulated function bool ReadyToFire(int Mode) { if(bLocked) return false; return Super.ReadyToFire(Mode); } Xclass WeaponFire_Shock_3SPN extends ShockBeamFire; event ModeDoFire() { local Game_PRI_3SPN PRI; PRI = Game_PRI_3SPN(xPawn(Weapon.Owner).PlayerReplicationInfo); if (!AllowFire()) return; if (MaxHoldTime > 0.0) HoldTime = FMin(HoldTime, MaxHoldTime); // server if (Weapon.Role == ROLE_Authority) { Weapon.ConsumeAmmo(ThisModeNum, Load); if(PRI != None) { PRI.ShockStats[0] += load; } DoFireEffect(); if ( (Instigator == None) || (Instigator.Controller == None) ) return; if ( AIController(Instigator.Controller) != None ) AIController(Instigator.Controller).WeaponFireAgain(BotRefireRate, true); Instigator.SpawnTime = -100000; } // client if (Instigator.IsLocallyControlled()) { ShakeView(); PlayFiring(); FlashMuzzleFlash(); StartMuzzleSmoke(); } else // server { ServerPlayFiring(); } Weapon.IncrementFlashCount(ThisModeNum); // set the next firing time. must be careful here so client and server do not get out of sync if (bFireOnRelease) { if (bIsFiring) NextFireTime += MaxHoldTime + FireRate; else NextFireTime = Level.TimeSeconds + FireRate; } else { NextFireTime += FireRate; NextFireTime = FMax(NextFireTime, Level.TimeSeconds); } Load = AmmoPerFire; HoldTime = 0; if (Instigator.PendingWeapon != Weapon && Instigator.PendingWeapon != None) { bIsFiring = false; Weapon.PutDown(); } } lclass WeaponFire_ShockCombo_3SPN extends ShockProjectile; function SuperExplosion() { local actor HitActor; local vector HitLocation, HitNormal; HurtRadius(ComboDamage, ComboRadius, class'DamType_ShockCombo_3SPN', ComboMomentumTransfer, Location ); Spawn(class'ShockCombo'); if ( (Level.NetMode != NM_DedicatedServer) && EffectIsRelevant(Location,false) ) { HitActor = Trace(HitLocation, HitNormal,Location - Vect(0,0,120), Location,false); if ( HitActor != None ) Spawn(class'ComboDecal',self,,HitLocation, rotator(vect(0,0,-1))); } PlaySound(ComboSound, SLOT_None,1.0,,800); DestroyTrails(); Destroy(); } event TakeDamage( int Damage, Pawn EventInstigator, vector HitLocation, vector Momentum, class DamageType) { local Game_PRI_3SPN PRI; PRI = Game_PRI_3SPN(EventInstigator.PlayerReplicationInfo); if (DamageType == ComboDamageType) { Instigator = EventInstigator; SuperExplosion(); if(PRI != None) { PRI.ComboStats[0] += 1; PRI.ShockStats[0] -= 1; PRI.ShockStats[2] -= 1; } if( EventInstigator.Weapon != None ) { EventInstigator.Weapon.ConsumeAmmo(0, ComboAmmoCost, true); Instigator = EventInstigator; } } } qclass WeaponFire_ShockAlt_3SPN extends ShockProjFire; event ModeDoFire() { local Game_PRI_3SPN PRI; PRI = Game_PRI_3SPN(xPawn(Weapon.Owner).PlayerReplicationInfo); if (!AllowFire()) return; if (MaxHoldTime > 0.0) HoldTime = FMin(HoldTime, MaxHoldTime); // server if (Weapon.Role == ROLE_Authority) { Weapon.ConsumeAmmo(ThisModeNum, Load); if(PRI != None) { PRI.ShockStats[2] += Load; } DoFireEffect(); if ( (Instigator == None) || (Instigator.Controller == None) ) return; if ( AIController(Instigator.Controller) != None ) AIController(Instigator.Controller).WeaponFireAgain(BotRefireRate, true); Instigator.SpawnTime = -100000; } // client if (Instigator.IsLocallyControlled()) { ShakeView(); PlayFiring(); FlashMuzzleFlash(); StartMuzzleSmoke(); } else // server { ServerPlayFiring(); } Weapon.IncrementFlashCount(ThisModeNum); // set the next firing time. must be careful here so client and server do not get out of sync if (bFireOnRelease) { if (bIsFiring) NextFireTime += MaxHoldTime + FireRate; else NextFireTime = Level.TimeSeconds + FireRate; } else { NextFireTime += FireRate; NextFireTime = FMax(NextFireTime, Level.TimeSeconds); } Load = AmmoPerFire; HoldTime = 0; if (Instigator.PendingWeapon != Weapon && Instigator.PendingWeapon != None) { bIsFiring = false; Weapon.PutDown(); } } Wclass WeaponFire_Rocket_3SPN extends RocketFire; event ModeDoFire() { local Game_PRI_3SPN PRI; PRI = Game_PRI_3SPN(xPawn(Weapon.Owner).PlayerReplicationInfo); if (!AllowFire()) return; if (MaxHoldTime > 0.0) HoldTime = FMin(HoldTime, MaxHoldTime); // server if (Weapon.Role == ROLE_Authority) { Weapon.ConsumeAmmo(ThisModeNum, Load); if(PRI != None) { PRI.RocketStats[0] += load; } DoFireEffect(); if ( (Instigator == None) || (Instigator.Controller == None) ) return; if ( AIController(Instigator.Controller) != None ) AIController(Instigator.Controller).WeaponFireAgain(BotRefireRate, true); Instigator.SpawnTime = -100000; } // client if (Instigator.IsLocallyControlled()) { ShakeView(); PlayFiring(); FlashMuzzleFlash(); StartMuzzleSmoke(); } else // server { ServerPlayFiring(); } Weapon.IncrementFlashCount(ThisModeNum); // set the next firing time. must be careful here so client and server do not get out of sync if (bFireOnRelease) { if (bIsFiring) NextFireTime += MaxHoldTime + FireRate; else NextFireTime = Level.TimeSeconds + FireRate; } else { NextFireTime += FireRate; NextFireTime = FMax(NextFireTime, Level.TimeSeconds); } Load = AmmoPerFire; HoldTime = 0; if (Instigator.PendingWeapon != Weapon && Instigator.PendingWeapon != None) { bIsFiring = false; Weapon.PutDown(); } } | class WeaponFire_RocketAlt_3SPN extends RocketMultiFire; event ModeDoFire() { local Game_PRI_3SPN PRI; PRI = Game_PRI_3SPN(xPawn(Weapon.Owner).PlayerReplicationInfo); if ( RocketLauncher(Weapon).bTightSpread || ((Bot(Instigator.Controller) != None) && (FRand() < 0.65)) ) { Spread = TightSpread; SpreadStyle = SS_Ring; } else { SpreadStyle = SS_Line; Spread = LooseSpread; } RocketLauncher(Weapon).bTightSpread = false; if (!AllowFire()) return; if (MaxHoldTime > 0.0) HoldTime = FMin(HoldTime, MaxHoldTime); // server if (Weapon.Role == ROLE_Authority) { Weapon.ConsumeAmmo(ThisModeNum, Load); if(PRI != None) { PRI.RocketStats[0] += Load; } DoFireEffect(); if ( (Instigator == None) || (Instigator.Controller == None) ) return; if ( AIController(Instigator.Controller) != None ) AIController(Instigator.Controller).WeaponFireAgain(BotRefireRate, true); Instigator.SpawnTime = -100000; } // client if (Instigator.IsLocallyControlled()) { ShakeView(); PlayFiring(); FlashMuzzleFlash(); StartMuzzleSmoke(); } else // server { ServerPlayFiring(); } Weapon.IncrementFlashCount(ThisModeNum); // set the next firing time. must be careful here so client and server do not get out of sync if (bFireOnRelease) { if (bIsFiring) NextFireTime += MaxHoldTime + FireRate; else NextFireTime = Level.TimeSeconds + FireRate; } else { NextFireTime += FireRate; NextFireTime = FMax(NextFireTime, Level.TimeSeconds); } Load = AmmoPerFire; HoldTime = 0; if (Instigator.PendingWeapon != Weapon && Instigator.PendingWeapon != None) { bIsFiring = false; Weapon.PutDown(); } } Tclass WeaponFire_Mini_3SPN extends MinigunFire; event ModeDoFire() { local Game_PRI_3SPN PRI; PRI = Game_PRI_3SPN(xPawn(Weapon.Owner).PlayerReplicationInfo); if (!AllowFire()) return; if (MaxHoldTime > 0.0) HoldTime = FMin(HoldTime, MaxHoldTime); // server if (Weapon.Role == ROLE_Authority) { Weapon.ConsumeAmmo(ThisModeNum, Load); if(PRI != None) { PRI.MiniStats[0] += load; } DoFireEffect(); if ( (Instigator == None) || (Instigator.Controller == None) ) return; if ( AIController(Instigator.Controller) != None ) AIController(Instigator.Controller).WeaponFireAgain(BotRefireRate, true); Instigator.SpawnTime = -100000; } // client if (Instigator.IsLocallyControlled()) { ShakeView(); PlayFiring(); FlashMuzzleFlash(); StartMuzzleSmoke(); } else // server { ServerPlayFiring(); } Weapon.IncrementFlashCount(ThisModeNum); // set the next firing time. must be careful here so client and server do not get out of sync if (bFireOnRelease) { if (bIsFiring) NextFireTime += MaxHoldTime + FireRate; else NextFireTime = Level.TimeSeconds + FireRate; } else { NextFireTime += FireRate; NextFireTime = FMax(NextFireTime, Level.TimeSeconds); } Load = AmmoPerFire; HoldTime = 0; if (Instigator.PendingWeapon != Weapon && Instigator.PendingWeapon != None) { bIsFiring = false; Weapon.PutDown(); } } pclass WeaponFire_MiniAlt_3SPN extends MinigunAltFire; event ModeDoFire() { local Game_PRI_3SPN PRI; PRI = Game_PRI_3SPN(xPawn(Weapon.Owner).PlayerReplicationInfo); if (!AllowFire()) return; if (MaxHoldTime > 0.0) HoldTime = FMin(HoldTime, MaxHoldTime); // server if (Weapon.Role == ROLE_Authority) { Weapon.ConsumeAmmo(ThisModeNum, Load); if(PRI != None) { PRI.MiniStats[2] += Load; } DoFireEffect(); if ( (Instigator == None) || (Instigator.Controller == None) ) return; if ( AIController(Instigator.Controller) != None ) AIController(Instigator.Controller).WeaponFireAgain(BotRefireRate, true); Instigator.SpawnTime = -100000; } // client if (Instigator.IsLocallyControlled()) { ShakeView(); PlayFiring(); FlashMuzzleFlash(); StartMuzzleSmoke(); } else // server { ServerPlayFiring(); } Weapon.IncrementFlashCount(ThisModeNum); // set the next firing time. must be careful here so client and server do not get out of sync if (bFireOnRelease) { if (bIsFiring) NextFireTime += MaxHoldTime + FireRate; else NextFireTime = Level.TimeSeconds + FireRate; } else { NextFireTime += FireRate; NextFireTime = FMax(NextFireTime, Level.TimeSeconds); } Load = AmmoPerFire; HoldTime = 0; if (Instigator.PendingWeapon != Weapon && Instigator.PendingWeapon != None) { bIsFiring = false; Weapon.PutDown(); } } yclass WeaponFire_Link_3SPN extends LinkAltFire; function Projectile SpawnProjectile(Vector Start, Rotator Dir) { local LinkProjectile Proj; local Game_PRI_3SPN PRI; PRI = Game_PRI_3SPN(xPawn(Weapon.Owner).PlayerReplicationInfo); Start += Vector(Dir) * 10.0 * LinkGun(Weapon).Links; Proj = Weapon.Spawn(class'XWeapons.LinkProjectile',,, Start, Dir); if(PRI != None) { PRI.LinkStats[0] += 1; } if ( Proj != None ) { Proj.Links = LinkGun(Weapon).Links; Proj.LinkAdjust(); } return Proj; } Yclass WeaponFire_LinkAlt_3SPN extends LinkFire; event ModeDoFire() { local Game_PRI_3SPN PRI; PRI = Game_PRI_3SPN(xPawn(Weapon.Owner).PlayerReplicationInfo); Load = 0; //don't use ammo here - it will be consumed in ModeTick() where it's sync'ed with damage dealing if (!AllowFire()) return; if (MaxHoldTime > 0.0) HoldTime = FMin(HoldTime, MaxHoldTime); // server if (Weapon.Role == ROLE_Authority) { Weapon.ConsumeAmmo(ThisModeNum, Load); if(PRI != None) { PRI.LinkStats[2] += 1; } DoFireEffect(); HoldTime = 0; // if bot decides to stop firing, HoldTime must be reset first if ( (Instigator == None) || (Instigator.Controller == None) ) return; if ( AIController(Instigator.Controller) != None ) AIController(Instigator.Controller).WeaponFireAgain(BotRefireRate, true); Instigator.DeactivateSpawnProtection(); } // client if (Instigator.IsLocallyControlled()) { ShakeView(); PlayFiring(); FlashMuzzleFlash(); StartMuzzleSmoke(); } else // server { ServerPlayFiring(); } Weapon.IncrementFlashCount(ThisModeNum); // set the next firing time. must be careful here so client and server do not get out of sync if (bFireOnRelease) { if (bIsFiring) NextFireTime += MaxHoldTime + FireRate; else NextFireTime = Level.TimeSeconds + FireRate; } else { NextFireTime += FireRate; NextFireTime = FMax(NextFireTime, Level.TimeSeconds); } Load = AmmoPerFire; HoldTime = 0; if (Instigator.PendingWeapon != Weapon && Instigator.PendingWeapon != None) { bIsFiring = false; Weapon.PutDown(); } } AS*> $?R]class WeaponFire_Lightning_3SPN extends SniperFire; event ModeDoFire() { local Game_PRI_3SPN PRI; PRI = Game_PRI_3SPN(xPawn(Weapon.Owner).PlayerReplicationInfo); if (!AllowFire()) return; if (MaxHoldTime > 0.0) HoldTime = FMin(HoldTime, MaxHoldTime); // server if (Weapon.Role == ROLE_Authority) { Weapon.ConsumeAmmo(ThisModeNum, Load); if(PRI != None) { PRI.LightningStats[0] += load; } DoFireEffect(); if ( (Instigator == None) || (Instigator.Controller == None) ) return; if ( AIController(Instigator.Controller) != None ) AIController(Instigator.Controller).WeaponFireAgain(BotRefireRate, true); Instigator.SpawnTime = -100000; } // client if (Instigator.IsLocallyControlled()) { ShakeView(); PlayFiring(); FlashMuzzleFlash(); StartMuzzleSmoke(); } else // server { ServerPlayFiring(); } Weapon.IncrementFlashCount(ThisModeNum); // set the next firing time. must be careful here so client and server do not get out of sync if (bFireOnRelease) { if (bIsFiring) NextFireTime += MaxHoldTime + FireRate; else NextFireTime = Level.TimeSeconds + FireRate; } else { NextFireTime += FireRate; NextFireTime = FMax(NextFireTime, Level.TimeSeconds); } Load = AmmoPerFire; HoldTime = 0; if (Instigator.PendingWeapon != Weapon && Instigator.PendingWeapon != None) { bIsFiring = false; Weapon.PutDown(); } } Nclass WeaponFire_Flak_3SPN extends FlakFire; event ModeDoFire() { local Game_PRI_3SPN PRI; PRI = Game_PRI_3SPN(xPawn(Weapon.Owner).PlayerReplicationInfo); if (!AllowFire()) return; if (MaxHoldTime > 0.0) HoldTime = FMin(HoldTime, MaxHoldTime); // server if (Weapon.Role == ROLE_Authority) { Weapon.ConsumeAmmo(ThisModeNum, Load); if(PRI != None) { PRI.FlakStats[0] += 9; } DoFireEffect(); if ( (Instigator == None) || (Instigator.Controller == None) ) return; if ( AIController(Instigator.Controller) != None ) AIController(Instigator.Controller).WeaponFireAgain(BotRefireRate, true); Instigator.SpawnTime = -100000; } // client if (Instigator.IsLocallyControlled()) { ShakeView(); PlayFiring(); FlashMuzzleFlash(); StartMuzzleSmoke(); } else // server { ServerPlayFiring(); } Weapon.IncrementFlashCount(ThisModeNum); // set the next firing time. must be careful here so client and server do not get out of sync if (bFireOnRelease) { if (bIsFiring) NextFireTime += MaxHoldTime + FireRate; else NextFireTime = Level.TimeSeconds + FireRate; } else { NextFireTime += FireRate; NextFireTime = FMax(NextFireTime, Level.TimeSeconds); } Load = AmmoPerFire; HoldTime = 0; if (Instigator.PendingWeapon != Weapon && Instigator.PendingWeapon != None) { bIsFiring = false; Weapon.PutDown(); } } ]Disable team location.W[ ]JHDisables showing team location in the team box. Making the box smaller.$>$=$L?Wz ]Disable my location.W[ ]NLDisables showing your own location in the team box. Making the box smaller.$>$=$L?Wz Hclass WeaponFire_FlakAlt_3SPN extends FlakAltFire; event ModeDoFire() { local Game_PRI_3SPN PRI; PRI = Game_PRI_3SPN(xPawn(Weapon.Owner).PlayerReplicationInfo); if (!AllowFire()) return; if (MaxHoldTime > 0.0) HoldTime = FMin(HoldTime, MaxHoldTime); // server if (Weapon.Role == ROLE_Authority) { Weapon.ConsumeAmmo(ThisModeNum, Load); if(PRI != None) { PRI.FlakStats[2] += Load; PRI.FlakStats[0] += 6; } DoFireEffect(); if ( (Instigator == None) || (Instigator.Controller == None) ) return; if ( AIController(Instigator.Controller) != None ) AIController(Instigator.Controller).WeaponFireAgain(BotRefireRate, true); Instigator.SpawnTime = -100000; } // client if (Instigator.IsLocallyControlled()) { ShakeView(); PlayFiring(); FlashMuzzleFlash(); StartMuzzleSmoke(); } else // server { ServerPlayFiring(); } Weapon.IncrementFlashCount(ThisModeNum); // set the next firing time. must be careful here so client and server do not get out of sync if (bFireOnRelease) { if (bIsFiring) NextFireTime += MaxHoldTime + FireRate; else NextFireTime = Level.TimeSeconds + FireRate; } else { NextFireTime += FireRate; NextFireTime = FMax(NextFireTime, Level.TimeSeconds); } Load = AmmoPerFire; HoldTime = 0; if (Instigator.PendingWeapon != Weapon && Instigator.PendingWeapon != None) { bIsFiring = false; Weapon.PutDown(); } } Nclass WeaponFire_Bio_3SPN extends BioFire; event ModeDoFire() { local Game_PRI_3SPN PRI; PRI = Game_PRI_3SPN(xPawn(Weapon.Owner).PlayerReplicationInfo); if (!AllowFire()) return; if (MaxHoldTime > 0.0) HoldTime = FMin(HoldTime, MaxHoldTime); // server if (Weapon.Role == ROLE_Authority) { Weapon.ConsumeAmmo(ThisModeNum, Load); if(PRI != None) { PRI.BioStats[0] += load; } DoFireEffect(); if ( (Instigator == None) || (Instigator.Controller == None) ) return; if ( AIController(Instigator.Controller) != None ) AIController(Instigator.Controller).WeaponFireAgain(BotRefireRate, true); Instigator.SpawnTime = -100000; } // client if (Instigator.IsLocallyControlled()) { ShakeView(); PlayFiring(); FlashMuzzleFlash(); StartMuzzleSmoke(); } else // server { ServerPlayFiring(); } Weapon.IncrementFlashCount(ThisModeNum); // set the next firing time. must be careful here so client and server do not get out of sync if (bFireOnRelease) { if (bIsFiring) NextFireTime += MaxHoldTime + FireRate; else NextFireTime = Level.TimeSeconds + FireRate; } else { NextFireTime += FireRate; NextFireTime = FMax(NextFireTime, Level.TimeSeconds); } Load = AmmoPerFire; HoldTime = 0; if (Instigator.PendingWeapon != Weapon && Instigator.PendingWeapon != None) { bIsFiring = false; Weapon.PutDown(); } } kclass WeaponFire_BioAlt_3SPN extends BioChargedFire; event ModeDoFire() { local Game_PRI_3SPN PRI; PRI = Game_PRI_3SPN(xPawn(Weapon.Owner).PlayerReplicationInfo); if (!AllowFire()) return; if (MaxHoldTime > 0.0) HoldTime = FMin(HoldTime, MaxHoldTime); // server if (Weapon.Role == ROLE_Authority) { Weapon.ConsumeAmmo(ThisModeNum, Load); if(PRI != None) { PRI.BioStats[0] += 1; } DoFireEffect(); if ( (Instigator == None) || (Instigator.Controller == None) ) return; if ( AIController(Instigator.Controller) != None ) AIController(Instigator.Controller).WeaponFireAgain(BotRefireRate, true); Instigator.SpawnTime = -100000; } // client if (Instigator.IsLocallyControlled()) { ShakeView(); PlayFiring(); FlashMuzzleFlash(); StartMuzzleSmoke(); } else // server { ServerPlayFiring(); } Weapon.IncrementFlashCount(ThisModeNum); // set the next firing time. must be careful here so client and server do not get out of sync if (bFireOnRelease) { if (bIsFiring) NextFireTime += MaxHoldTime + FireRate; else NextFireTime = Level.TimeSeconds + FireRate; } else { NextFireTime += FireRate; NextFireTime = FMax(NextFireTime, Level.TimeSeconds); } Load = AmmoPerFire; HoldTime = 0; if (Instigator.PendingWeapon != Weapon && Instigator.PendingWeapon != None) { bIsFiring = false; Weapon.PutDown(); } } AS*> $?Rwclass WeaponFire_Assault_3SPN extends AssaultFire; event ModeDoFire() { local Game_PRI_3SPN PRI; PRI = Game_PRI_3SPN(xPawn(Weapon.Owner).PlayerReplicationInfo); if ( Level.TimeSeconds - LastFireTime > 0.5 ) Spread = Default.Spread; else Spread = FMin(Spread+0.02,0.12); LastFireTime = Level.TimeSeconds; if (!AllowFire()) return; if (MaxHoldTime > 0.0) HoldTime = FMin(HoldTime, MaxHoldTime); // server if (Weapon.Role == ROLE_Authority) { Weapon.ConsumeAmmo(ThisModeNum, Load); if(PRI != None) { PRI.AssaultStats[0] += load; } DoFireEffect(); if ( (Instigator == None) || (Instigator.Controller == None) ) return; if ( AIController(Instigator.Controller) != None ) AIController(Instigator.Controller).WeaponFireAgain(BotRefireRate, true); Instigator.SpawnTime = -100000; } // client if (Instigator.IsLocallyControlled()) { ShakeView(); PlayFiring(); FlashMuzzleFlash(); StartMuzzleSmoke(); } else // server { ServerPlayFiring(); } Weapon.IncrementFlashCount(ThisModeNum); // set the next firing time. must be careful here so client and server do not get out of sync if (bFireOnRelease) { if (bIsFiring) NextFireTime += MaxHoldTime + FireRate; else NextFireTime = Level.TimeSeconds + FireRate; } else { NextFireTime += FireRate; NextFireTime = FMax(NextFireTime, Level.TimeSeconds); } Load = AmmoPerFire; HoldTime = 0; if (Instigator.PendingWeapon != Weapon && Instigator.PendingWeapon != None) { bIsFiring = false; Weapon.PutDown(); } } qclass WeaponFire_AssaultAlt_3SPN extends AssaultGrenade; event ModeDoFire() { local Game_PRI_3SPN PRI; PRI = Game_PRI_3SPN(xPawn(Weapon.Owner).PlayerReplicationInfo); if (!AllowFire()) return; if (MaxHoldTime > 0.0) HoldTime = FMin(HoldTime, MaxHoldTime); // server if (Weapon.Role == ROLE_Authority) { Weapon.ConsumeAmmo(ThisModeNum, Load); if(PRI != None) { PRI.AssaultStats[2] += Load; } DoFireEffect(); if ( (Instigator == None) || (Instigator.Controller == None) ) return; if ( AIController(Instigator.Controller) != None ) AIController(Instigator.Controller).WeaponFireAgain(BotRefireRate, true); Instigator.SpawnTime = -100000; } // client if (Instigator.IsLocallyControlled()) { ShakeView(); PlayFiring(); FlashMuzzleFlash(); StartMuzzleSmoke(); } else // server { ServerPlayFiring(); } Weapon.IncrementFlashCount(ThisModeNum); // set the next firing time. must be careful here so client and server do not get out of sync if (bFireOnRelease) { if (bIsFiring) NextFireTime += MaxHoldTime + FireRate; else NextFireTime = Level.TimeSeconds + FireRate; } else { NextFireTime += FireRate; NextFireTime = FMax(NextFireTime, Level.TimeSeconds); } Load = AmmoPerFire; HoldTime = 0; if (Instigator.PendingWeapon != Weapon && Instigator.PendingWeapon != None) { bIsFiring = false; Weapon.PutDown(); } } Pclass TDM_ScoreBoard_3SPN extends ScoreBoardDeathMatch; var localized string StatsText; var plane FullOn, GrayedOut; var Texture fade; var Texture rfade; var Texture logo; var Game_GRI_3SPN myGRI; var() HudCTeamDeathMatch.NumericWidget ScoreTeam[2]; var() HudCTeamDeathMatch.SpriteWidget VersusSymbol; var() HudCTeamDeathMatch.SpriteWidget TeamScoreBackGround[2]; var() HudCTeamDeathMatch.SpriteWidget TeamScoreBackGroundDisc[2]; var() HudCTeamDeathMatch.SpriteWidget TeamSymbols[2]; simulated function ShowVersusIcon(Canvas C) { TDM_HUD_3SPN(PlayerController(Owner).myHUD).DrawSpriteWidget (C, VersusSymbol ); } function DrawTeamScores(Canvas C) { local int i; local PlayerController pc; pc = PlayerController(Owner); TDM_HUD_3SPN(pc.myHUD).DrawSpriteWidget (C, TeamScoreBackground[0]); TDM_HUD_3SPN(pc.myHUD).DrawSpriteWidget (C, TeamScoreBackground[1]); TDM_HUD_3SPN(pc.myHUD).DrawSpriteWidget (C, TeamScoreBackgroundDisc[0]); TDM_HUD_3SPN(pc.myHUD).DrawSpriteWidget (C, TeamScoreBackgroundDisc[1]); TeamScoreBackground[0].Tints[TDM_HUD_3SPN(pc.myHUD).TeamIndex] = HUDClass.default.BlackColor; TeamScoreBackground[0].Tints[TDM_HUD_3SPN(pc.myHUD).TeamIndex].A = 150; TeamScoreBackground[1].Tints[TDM_HUD_3SPN(pc.myHUD).TeamIndex] = HUDClass.default.BlackColor; TeamScoreBackground[1].Tints[TDM_HUD_3SPN(pc.myHUD).TeamIndex].A = 150; if (TeamSymbols[0].WidgetTexture != None) TDM_HUD_3SPN(pc.myHUD).DrawSpriteWidget (C, TeamSymbols[0]); if (TeamSymbols[1].WidgetTexture != None) TDM_HUD_3SPN(pc.myHUD).DrawSpriteWidget (C, TeamSymbols[1]); ShowVersusIcon(C); for (i=0; i < 2; i++) { if(GRI.Teams[i] == None) continue; TeamSymbols[i].Tints[i] = TDM_HUD_3SPN(pc.myHUD).HudColorTeam[i]; ScoreTeam[i].Value = Min(GRI.Teams[i].Score, 999); if (GRI.TeamSymbols[i] != None) TeamSymbols[i].WidgetTexture = GRI.TeamSymbols[i]; } TDM_HUD_3SPN(pc.myHUD).DrawNumericWidget (C, ScoreTeam[0], TDM_HUD_3SPN(pc.myHUD).DigitsBig); TDM_HUD_3SPN(pc.myHUD).DrawNumericWidget (C, ScoreTeam[1], TDM_HUD_3SPN(pc.myHUD).DigitsBig); } function DrawTitle(Canvas Canvas, float HeaderOffsetY, float PlayerAreaY, float PlayerBoxSizeY) { local string titlestring,scoreinfostring; local float TitleXL,ScoreInfoXL,YL; local int y; if ( Canvas.ClipX < 512 ) return; ScoreInfoString = "www.3SPN.com"; if(myGRI != None) TitleString = myGRI.TAM.roundsToWin$" rounds wins the match!"; Canvas.StrLen(TitleString, TitleXL, YL); Canvas.DrawColor.R = 24; Canvas.DrawColor.G = 66; Canvas.DrawColor.B = 112; Canvas.DrawColor.a = 255; if ( UnrealPlayer(Owner).bDisplayLoser ) TitleString = class'HUDBase'.default.YouveLostTheMatch; else if ( UnrealPlayer(Owner).bDisplayWinner ) TitleString = class'HUDBase'.default.YouveWonTheMatch; y = (6 + (Canvas.ClipY * 0.0355 / 2)); Canvas.SetPos(0.5 * (Canvas.ClipX - TitleXL), y - (YL / 2)); Canvas.DrawText(TitleString, true); y = (Canvas.ClipY - 2) - (Canvas.ClipY * 0.0355 / 2); Canvas.StrLen(ScoreInfoString,ScoreInfoXL,YL); Canvas.SetPos(0.5 * (Canvas.ClipX - ScoreInfoXL), y - (YL / 2)); Canvas.DrawText(ScoreInfoString, true); Canvas.Font = PlayerController(Owner).myHUD.GetFontSizeIndex(Canvas, -5); Canvas.DrawColor.b = 64; Canvas.DrawColor.g = 49; Canvas.DrawColor.r = 33; Canvas.DrawColor.a = 255; Canvas.StrLen(myGRI.version, TitleXL, YL); Canvas.SetPos(Canvas.ClipX * 0.040, Canvas.ClipY * 0.968); Canvas.DrawText(myGRI.version, true); } simulated event UpdateScoreBoard(Canvas Canvas) { local PlayerReplicationInfo PRI, OwnerPRI; local int i, FontReduction, OwnerPos, NetXPos, RedPlayerCount,HeaderOffsetY, MessageFoot, PlayerBoxSizeY, BoxSpaceY, NameXPos, BoxTextOffsetY, OwnerOffset, ScoreXPos, DeathsXPos, BoxXPos, TitleYPos, BoxWidth, BluePlayerCount, PlayerCount; local float XL,YL, MaxScaling; local float deathsXL, scoreXL, netXL, MaxNamePos; local string playername[MAXPLAYERS]; local bool bNameFontReduction; local plane OldColorModulate; local Texture box; local int BoxXPosOdd; local int LineXPos; local int LineYPos; local int fontsize; local string tmp; local PlayerReplicationInfo RedPRI[MAXPLAYERS], BluePRI[MAXPLAYERS]; local int RedOwnerOffset; local int BlueOwnerOffset; local int WonXPos; local int RedScore; local int RedAlive; local int RedPing; local int BlueScore; local int BlueAlive; local int BluePing; if(myGRI == None) foreach AllObjects(class'Game_GRI_3SPN', myGRI) break; DrawTeamScores(Canvas); OldColorModulate = Canvas.ColorModulate; BlueOwnerOffset = -1; RedOwnerOffset = -1; OwnerPRI = PlayerController(Owner).PlayerReplicationInfo; for (i=0; i < GRI.PRIArray.Length; i++) { PRI = GRI.PRIArray[i]; if (PRI.Team != None && !PRI.bOnlySpectator) { if(PRI.Team.TeamIndex == 0) { if(RedPlayerCount < MAXPLAYERS) { RedPRI[RedPlayerCount] = PRI; if(PRI == OwnerPRI) { OwnerOffset = RedPlayerCount; RedOwnerOffset = RedPlayerCount; } RedPlayerCount++; RedScore += PRI.Score; RedPing += (PRI.Ping * 4); if(!PRI.bOutOfLives) RedAlive++; } } else if(BluePlayerCount < MAXPLAYERS) { BluePRI[BluePlayerCount] = PRI; if(PRI == OwnerPRI) { OwnerOffset = BluePlayerCount; BlueOwnerOffset = BluePlayerCount; } BluePlayerCount++; BlueScore += PRI.Score; BluePing += (PRI.Ping * 4); if(!PRI.bOutOfLives) BlueAlive++; } } } PlayerCount = Max(RedPlayerCount, BluePlayerCount); if(RedPlayerCount >= 2) { RedPing = RedPing / RedPlayerCount; } if(BluePlayerCount >= 2) { BluePing = BluePing / BluePlayerCount; } // Select best font size and box size to fit as many players as possible on screen fontsize = 6; //fontreduction = fontsize - 2; if ( Canvas.ClipX < 512 ) PlayerCount = Min(PlayerCount, 1+(Canvas.ClipY - 120)/(PlayerBoxSizeY + BoxSpaceY) ); else PlayerCount = Min(PlayerCount, (Canvas.ClipY - 120)/(PlayerBoxSizeY + BoxSpaceY) ); if ( OwnerOffset >= PlayerCount ) PlayerCount -= 1; if ( FontReduction > 2 ) MaxScaling = 2.125; else MaxScaling = 1.85; BoxSpaceY = Canvas.ClipY * 0.006; PlayerBoxSizeY = Canvas.ClipY * 0.03; if(Canvas.ClipY <= 600) PlayerBoxSizeY = Canvas.ClipY * 0.0325; //PlayerBoxSizeY = FClamp((1+(Canvas.ClipY - 0.67 * MessageFoot))/PlayerCount - BoxSpaceY, PlayerBoxSizeY, MaxScaling * YL); bDisplayMessages = (PlayerCount <= (Canvas.ClipY - MessageFoot)/(PlayerBoxSizeY + BoxSpaceY)); HeaderOffsetY = 0.15 * Canvas.ClipX; BoxXPos = 0; BoxWidth = 0.45 * Canvas.ClipX; NameXPos = BoxXPos + 0.050 * BoxWidth; ScoreXPos = BoxXPos + 0.500 * BoxWidth; WonXPos = BoxXPos + 0.500 * BoxWidth; DeathsXPos = BoxXPos + 0.700 * BoxWidth; NetXPos = BoxXPos + 0.9 * BoxWidth; BoxXPosOdd = Canvas.ClipX * 0.05; TitleYPos = Canvas.ClipY * 0.175; HeaderOffsetY = TitleYPos + BoxSpaceY + PlayerBoxSizeY; LineYPos = Canvas.ClipY * 0.006; if(Canvas.ClipY <= 768) LineYPos++; // draw background boxes Canvas.Style = ERenderstyle.STY_Alpha; box = fade; BoxXPos = 0; LineXPos = 0; // first the red side for (i=0; i < RedPlayerCount + 1; i++) { if(i == RedOwnerOffset) { Canvas.DrawColor = HUDClass.default.RedColor * 0.7; Canvas.DrawColor.g = 90; Canvas.DrawColor.a = 127; } else { Canvas.DrawColor = HUDClass.default.RedColor * 0.4; if(i % 2 == 0) Canvas.DrawColor.a = 127; else Canvas.DrawColor.a = 64; } if(i == RedPlayerCount && RedPlayerCount >= 2) { Canvas.DrawColor = HUDClass.default.WhiteColor * 0.6; Canvas.DrawColor.a = 100; HeaderOffsetY += (PlayerBoxSizeY * 0.3); } else if(i == RedPlayerCount && RedPlayerCount < 2) break; Canvas.SetPos(BoxXPos, (HeaderOffsetY + (PlayerBoxSizeY + BoxSpaceY) * i)); Canvas.DrawRect(box, BoxWidth, PlayerBoxSizeY); Canvas.DrawColor = HUDClass.default.BlackColor; Canvas.SetPos(LineXPos, (HeaderOffsetY + (PlayerBoxSizeY + BoxSpaceY) * i)); Canvas.DrawRect(box, BoxWidth + 10, 1); Canvas.SetPos(LineXPos, (HeaderOffsetY + (PlayerBoxSizeY + BoxSpaceY) * i + 2)); Canvas.DrawRect(box, BoxWidth + 10, 1); Canvas.SetPos(LineXPos, (HeaderOffsetY + (PlayerBoxSizeY + BoxSpaceY) * i + PlayerBoxSizeY - 2)); Canvas.DrawRect(box, BoxWidth + 10, 1); Canvas.SetPos(LineXPos, (HeaderOffsetY + (PlayerBoxSizeY + BoxSpaceY) * i + PlayerBoxSizeY)); Canvas.DrawRect(box, BoxWidth + 10, 1); if(i == RedOwnerOffset) { Canvas.DrawColor = HUDClass.default.RedColor; Canvas.DrawColor.g = 128; } else Canvas.DrawColor = HUDClass.default.WhiteColor; Canvas.SetPos(LineXPos, (HeaderOffsetY + (PlayerBoxSizeY + BoxSpaceY) * i) + 1); Canvas.DrawRect(box, BoxWidth + 10, 1); Canvas.SetPos(LineXPos, (HeaderOffsetY + (PlayerBoxSizeY + BoxSpaceY) * i) + PlayerBoxSizeY - 1); Canvas.DrawRect(box, BoxWidth + 10, 1); Canvas.DrawColor = HUDClass.default.WhiteColor; Canvas.SetPos(LineXPos, (HeaderOffsetY + (PlayerBoxSizeY + BoxSpaceY) * i) + PlayerBoxSizeY - LineYPos); if(i != RedOwnerOffset) { Canvas.DrawColor = HUDClass.default.RedColor; Canvas.DrawColor.g = 127; } Canvas.DrawRect(box, BoxWidth + 20, 1); Canvas.DrawColor = HUDClass.default.BlackColor; Canvas.SetPos(LineXPos, (HeaderOffsetY + (PlayerBoxSizeY + BoxSpaceY) * i) + PlayerBoxSizeY - LineYPos + 1); Canvas.DrawRect(box, BoxWidth + 15, 1); } HeaderOffsetY = TitleYPos + BoxSpaceY + PlayerBoxSizeY; box = rfade; BoxXPos = Canvas.ClipX * 0.55; LineXPos = BoxXPos - 10; // now the blue side for (i=0; i < BluePlayerCount + 1; i++) { if(i == BlueOwnerOffset) { Canvas.DrawColor = HUDClass.default.TurqColor * 0.7; Canvas.DrawColor.a = 127; } else { Canvas.DrawColor = HUDClass.default.BlueColor * 0.5; if(i % 2 == 0) Canvas.DrawColor.a = 127; else Canvas.DrawColor.a = 64; } if(i == BluePlayerCount && BluePlayerCount >= 2) { Canvas.DrawColor = HUDClass.default.WhiteColor * 0.6; Canvas.DrawColor.a = 100; HeaderOffsetY += (PlayerBoxSizeY * 0.3); } else if(i == BluePlayerCount && BluePlayerCount < 2) break; Canvas.SetPos(BoxXPos, (HeaderOffsetY + (PlayerBoxSizeY + BoxSpaceY) * i)); Canvas.DrawRect(box, BoxWidth, PlayerBoxSizeY); Canvas.DrawColor = HUDClass.default.BlackColor; Canvas.SetPos(LineXPos, (HeaderOffsetY + (PlayerBoxSizeY + BoxSpaceY) * i)); Canvas.DrawRect(box, BoxWidth + 10, 1); Canvas.SetPos(LineXPos, (HeaderOffsetY + (PlayerBoxSizeY + BoxSpaceY) * i + 2)); Canvas.DrawRect(box, BoxWidth + 10, 1); Canvas.SetPos(LineXPos, (HeaderOffsetY + (PlayerBoxSizeY + BoxSpaceY) * i + PlayerBoxSizeY - 2)); Canvas.DrawRect(box, BoxWidth + 10, 1); Canvas.SetPos(LineXPos, (HeaderOffsetY + (PlayerBoxSizeY + BoxSpaceY) * i + PlayerBoxSizeY)); Canvas.DrawRect(box, BoxWidth + 10, 1); if(i == BlueOwnerOffset) Canvas.DrawColor = HUDClass.default.TurqColor; else Canvas.DrawColor = HUDClass.default.WhiteColor; Canvas.SetPos(LineXPos, (HeaderOffsetY + (PlayerBoxSizeY + BoxSpaceY) * i) + 1); Canvas.DrawRect(box, BoxWidth + 10, 1); Canvas.SetPos(LineXPos, (HeaderOffsetY + (PlayerBoxSizeY + BoxSpaceY) * i) + PlayerBoxSizeY - 1); Canvas.DrawRect(box, BoxWidth + 10, 1); Canvas.DrawColor = HUDClass.default.WhiteColor; Canvas.SetPos(LineXPos - 10, (HeaderOffsetY + (PlayerBoxSizeY + BoxSpaceY) * i) + PlayerBoxSizeY - LineYPos); if(i != BlueOwnerOffset) Canvas.DrawColor = HUDClass.default.TurqColor; Canvas.DrawRect(box, BoxWidth + 20, 1); Canvas.DrawColor = HUDClass.default.BlackColor; Canvas.SetPos(LineXPos - 5, (HeaderOffsetY + (PlayerBoxSizeY + BoxSpaceY) * i) + PlayerBoxSizeY - LineYPos + 1); Canvas.DrawRect(box, BoxWidth + 15, 1); } HeaderOffsetY = TitleYPos + BoxSpaceY + PlayerBoxSizeY; BoxXPos = 0; Canvas.Font = PlayerController(Owner).myHUD.GetFontSizeIndex(Canvas, -2); ///////////////////////////////////////////////// // draw title Canvas.Style = ERenderStyle.STY_Alpha; Canvas.SetPos(0, 4); Canvas.DrawColor = HUDClass.default.WhiteColor * 0.75; Canvas.DrawColor.a = 228; Canvas.DrawRect(fade, Canvas.ClipX * 0.968, Canvas.ClipY * 0.0355); Canvas.SetPos(Canvas.ClipX * 0.85, 4); Canvas.DrawColor.R = 97; Canvas.DrawColor.G = 150; Canvas.DrawColor.B = 220; Canvas.DrawColor.A = 255; Canvas.DrawRect(logo, Canvas.ClipX * 0.11, Canvas.ClipY * 0.03675); Canvas.DrawColor = HUDClass.default.WhiteColor; Canvas.DrawColor.a = 255; Canvas.SetPos(0, 4); Canvas.DrawRect(fade, Canvas.ClipX * 0.98, 1); Canvas.SetPos(0, 4 + Canvas.ClipY * 0.0355); Canvas.DrawRect(fade, Canvas.ClipX * 0.98, 1); Canvas.DrawColor = HUDClass.default.BlackColor; Canvas.SetPos(0, 3); Canvas.DrawRect(fade, Canvas.ClipX * 0.98, 1); Canvas.SetPos(0, 5); Canvas.DrawRect(fade, Canvas.ClipX * 0.98, 1); Canvas.SetPos(0, 3 + Canvas.ClipY * 0.0355); Canvas.DrawRect(fade, Canvas.ClipX * 0.98, 1); Canvas.SetPos(0, 5 + Canvas.ClipY * 0.0355); Canvas.DrawRect(fade, Canvas.ClipX * 0.98, 1); Canvas.SetPos(Canvas.ClipX * 0.032, Canvas.ClipY - (Canvas.ClipY * 0.0355 + 4)); Canvas.DrawColor = HUDClass.default.WhiteColor * 0.75; Canvas.DrawColor.a = 228; Canvas.DrawRect(rfade, Canvas.ClipX - (Canvas.ClipX * 0.032), Canvas.ClipY * 0.0355); Canvas.DrawColor = HUDClass.default.BlackColor; Canvas.SetPos(Canvas.ClipX * 0.02, Canvas.ClipY - (Canvas.ClipY * 0.0355 + 5)); Canvas.DrawRect(rfade, Canvas.ClipX * 0.98, 1); Canvas.SetPos(Canvas.ClipX * 0.02, Canvas.ClipY - (Canvas.CLipY * 0.0355 + 3)); Canvas.DrawRect(rfade, Canvas.ClipX * 0.98, 1); Canvas.SetPos(Canvas.ClipX * 0.02, Canvas.ClipY - 3); Canvas.DrawRect(rfade, Canvas.ClipX * 0.98, 1); Canvas.SetPos(Canvas.ClipX * 0.02, Canvas.ClipY - 5); Canvas.DrawRect(rfade, Canvas.ClipX * 0.98, 1); Canvas.DrawColor = HUDClass.default.WhiteColor; Canvas.SetPos(Canvas.ClipX * 0.02, Canvas.ClipY - (Canvas.ClipY * 0.0355 + 4)); Canvas.DrawRect(rfade, Canvas.ClipX * 0.98, 1); Canvas.SetPos(Canvas.ClipX * 0.02, Canvas.ClipY - 4); Canvas.DrawRect(rfade, Canvas.ClipX * 0.98, 1); Canvas.Style = ERenderStyle.STY_Normal; DrawTitle(Canvas, HeaderOffsetY, (PlayerCount+1)*(PlayerBoxSizeY + BoxSpaceY), PlayerBoxSizeY); ////////////////////////////////////////////////// Canvas.Font = PlayerController(Owner).myHUD.GetFontSizeIndex(Canvas, -2); ////////////////////////////////////////////////// // Draw headers Canvas.StrLen("SCORE", ScoreXL, YL); Canvas.StrLen(StatsText, DeathsXL, YL); ////////////////////////////////////////////////// // draw blue side header background BoxXPosOdd = Canvas.ClipX * 0.55; Canvas.Style = ERenderStyle.STY_Alpha; Canvas.SetPos(BoxXPosOdd - 20, TitleYPos - 4); Canvas.DrawColor = HUDClass.default.BlackColor; Canvas.DrawColor.a = 200; Canvas.DrawRect(rfade, BoxWidth + 20, PlayerBoxSizeY); Canvas.DrawColor = HUDClass.default.WhiteColor; Canvas.SetPos(BoxXPosOdd - 30, TitleYPos - 4); Canvas.DrawRect(rfade, BoxWidth + 30, 1); Canvas.SetPos(BoxXPosOdd - 30, TitleYPos + PlayerBoxSizeY - 4); Canvas.DrawRect(rfade, BoxWidth + 30, 1); ////////////////////////////////////////////////// // draw red side header background BoxXPosOdd = 0; Canvas.Style = ERenderStyle.STY_Alpha; Canvas.SetPos(BoxXPosOdd, TitleYPos - 4); Canvas.DrawColor = HUDClass.default.BlackColor; Canvas.DrawColor.a = 200; Canvas.DrawRect(fade, BoxWidth + 20, PlayerBoxSizeY); Canvas.DrawColor = HUDClass.default.WhiteColor; Canvas.SetPos(BoxXPosOdd, TitleYPos - 4); Canvas.DrawRect(fade, BoxWidth + 30, 1); Canvas.SetPos(BoxXPosOdd, TitleYPos + PlayerBoxSizeY - 4); Canvas.DrawRect(fade, BoxWidth + 30, 1); ///////////////////////////////////////////////////// // draw red side header text Canvas.Style = ERenderStyle.STY_Normal; Canvas.DrawColor = HUDClass.default.WhiteColor; Canvas.SetPos(NameXPos, TitleYPos); Canvas.DrawText(PlayerText,true); Canvas.SetPos(ScoreXPos - 0.5 * ScoreXL, TitleYPos); Canvas.DrawText("SCORE",true); Canvas.SetPos(DeathsXPos - 0.5*DeathsXL, TitleYPos); Canvas.DrawText(StatsText,true); ///////////////////////////////////////////////////// ///////////////////////////////////////////////////// // draw blue side header text Canvas.Style = ERenderStyle.STY_Normal; Canvas.DrawColor = HUDClass.default.WhiteColor; Canvas.SetPos(NameXPos + Canvas.ClipX * 0.55, TitleYPos); Canvas.DrawText(PlayerText,true); Canvas.SetPos(ScoreXPos - 0.5 * ScoreXL + Canvas.ClipX * 0.55, TitleYPos); Canvas.DrawText("SCORE",true); Canvas.SetPos(DeathsXPos - 0.5*DeathsXL + Canvas.ClipX * 0.55, TitleYPos); Canvas.DrawText(StatsText,true); ///////////////////////////////////////////////////// // draw red side player names MaxNamePos = 0.9 * (ScoreXPos - NameXPos); for ( i=0; i < RedPlayerCount; i++ ) { playername[i] = RedPRI[i].PlayerName; Canvas.StrLen(playername[i], XL, YL); if ( XL > MaxNamePos ) { bNameFontReduction = true; break; } } if ( !bNameFontReduction && (RedOwnerOffset >= RedPlayerCount) ) { playername[RedOwnerOffset] = RedPRI[RedOwnerOffset].PlayerName; Canvas.StrLen(playername[RedOwnerOffset], XL, YL); if ( XL > MaxNamePos ) bNameFontReduction = true; } /*if ( bNameFontReduction ) Canvas.Font = HUDClass.static.LoadFontStatic(fontsize + 1);*/ for ( i=0; i MaxNamePos ) playername[i] = left(playername[i], MaxNamePos/XL * len(PlayerName[i])); } if ( RedOwnerOffset >= RedPlayerCount ) { playername[RedOwnerOffset] = RedPRI[RedOwnerOffset].PlayerName; Canvas.StrLen(playername[RedOwnerOffset], XL, YL); if ( XL > MaxNamePos ) playername[RedOwnerOffset] = left(playername[RedOwnerOffset], MaxNamePos/XL * len(PlayerName[RedOwnerOffset])); } Canvas.Style = ERenderStyle.STY_Normal; Canvas.DrawColor = HUDClass.default.WhiteColor; Canvas.SetPos(0.5 * Canvas.ClipX, HeaderOffsetY + 4); BoxTextOffsetY = HeaderOffsetY + 0.5 * (PlayerBoxSizeY - YL); Canvas.DrawColor = HUDClass.default.WhiteColor; for ( i=0; i= RedPlayerCount)) { Canvas.DrawColor = HUDClass.default.WhiteColor; if (RedPRI[i].bOutOfLives) Canvas.ColorModulate = GrayedOut; else Canvas.ColorModulate = FullOn; Canvas.SetPos(NameXPos, (PlayerBoxSizeY + BoxSpaceY)*i + BoxTextOffsetY); Canvas.DrawText(playername[i],true); } /*if ( bNameFontReduction ) Canvas.Font = HUDClass.static.LoadFontStatic(fontsize + 1);*/ // draw scores Canvas.DrawColor = HUDClass.default.WhiteColor; for ( i=0; i= RedPlayerCount)) { if (RedPRI[i].bOutOfLives) Canvas.ColorModulate = GrayedOut; else Canvas.ColorModulate = FullOn; Canvas.StrLen(string(int(RedPRI[i].Score)), xl, yl); Canvas.SetPos(ScoreXPos - 0.5 * xl, (PlayerBoxSizeY + BoxSpaceY)*i + BoxTextOffsetY); Canvas.DrawText(int(RedPRI[i].Score),true); } // draw deaths Canvas.DrawColor = HUDClass.default.WhiteColor; for ( i=0; i= RedPlayerCount)) { if (RedPRI[i].bOutOfLives) { Canvas.DrawColor = HUDClass.default.RedColor; Canvas.ColorModulate = GrayedOut; Canvas.StrLen("DEAD",Xl,Yl); Canvas.SetPos(DeathsXPos - (XL / 2), (PlayerBoxSizeY + BoxSpaceY)*i + BoxTextOffsetY); Canvas.DrawText("DEAD",true); Canvas.DrawColor = HUDClass.default.WhiteColor; } else { Canvas.DrawColor = HUDClass.default.GreenColor; Canvas.ColorModulate = FullOn; Canvas.StrLen("ALIVE",Xl,Yl); Canvas.SetPos(DeathsXPos - (XL / 2), (PlayerBoxSizeY + BoxSpaceY)*i + BoxTextOffsetY); Canvas.DrawText("ALIVE", true); Canvas.DrawColor = HUDClass.default.WhiteColor; } } Canvas.ColorModulate = FullOn; // draw blue side player names MaxNamePos = 0.9 * (ScoreXPos - NameXPos); for ( i=0; i < BluePlayerCount; i++ ) { playername[i] = BluePRI[i].PlayerName; Canvas.StrLen(playername[i], XL, YL); if ( XL > MaxNamePos ) { bNameFontReduction = true; break; } } if ( !bNameFontReduction && (BlueOwnerOffset >= BluePlayerCount) ) { playername[BlueOwnerOffset] = BluePRI[BlueOwnerOffset].PlayerName; Canvas.StrLen(playername[BlueOwnerOffset], XL, YL); if ( XL > MaxNamePos ) bNameFontReduction = true; } /*if ( bNameFontReduction ) Canvas.Font = HUDClass.static.LoadFontStatic(fontsize + 1);*/ for ( i=0; i MaxNamePos ) playername[i] = left(playername[i], MaxNamePos/XL * len(PlayerName[i])); } if ( BlueOwnerOffset >= BluePlayerCount ) { playername[BlueOwnerOffset] = BluePRI[BlueOwnerOffset].PlayerName; Canvas.StrLen(playername[BlueOwnerOffset], XL, YL); if ( XL > MaxNamePos ) playername[BlueOwnerOffset] = left(playername[BlueOwnerOffset], MaxNamePos/XL * len(PlayerName[BlueOwnerOffset])); } Canvas.Style = ERenderStyle.STY_Normal; Canvas.DrawColor = HUDClass.default.WhiteColor; Canvas.SetPos(0.5 * Canvas.ClipX, HeaderOffsetY + 4); BoxTextOffsetY = HeaderOffsetY + 0.5 * (PlayerBoxSizeY - YL); Canvas.DrawColor = HUDClass.default.WhiteColor; for ( i=0; i= BluePlayerCount)) { Canvas.DrawColor = HUDClass.default.WhiteColor; if (BluePRI[i].bOutOfLives) Canvas.ColorModulate = GrayedOut; else Canvas.ColorModulate = FullOn; Canvas.SetPos(NameXPos + Canvas.ClipX * 0.55, (PlayerBoxSizeY + BoxSpaceY)*i + BoxTextOffsetY); Canvas.DrawText(playername[i],true); } /*if ( bNameFontReduction ) Canvas.Font = GetSmallerFontFor(Canvas,FontReduction);*/ // draw scores Canvas.DrawColor = HUDClass.default.WhiteColor; for ( i=0; i= BluePlayerCount)) { if (BluePRI[i].bOutOfLives) Canvas.ColorModulate = GrayedOut; else Canvas.ColorModulate = FullOn; Canvas.StrLen(string(int(BluePRI[i].Score)), xl, yl); Canvas.SetPos(ScoreXPos - 0.5 * xl + Canvas.ClipX * 0.55, (PlayerBoxSizeY + BoxSpaceY)*i + BoxTextOffsetY); Canvas.DrawText(int(BluePRI[i].Score),true); } // draw deaths Canvas.DrawColor = HUDClass.default.WhiteColor; for ( i=0; i= BluePlayerCount)) { if (BluePRI[i].bOutOfLives) { Canvas.DrawColor = HUDClass.default.RedColor; Canvas.ColorModulate = GrayedOut; Canvas.StrLen("DEAD",Xl,Yl); Canvas.SetPos(DeathsXPos - (XL / 2) + Canvas.ClipX * 0.55, (PlayerBoxSizeY + BoxSpaceY)*i + BoxTextOffsetY); Canvas.DrawText("DEAD",true); Canvas.DrawColor = HUDClass.default.WhiteColor; } else { Canvas.DrawColor = HUDClass.default.GreenColor; Canvas.ColorModulate = FullOn; Canvas.StrLen("ALIVE",Xl,Yl); Canvas.SetPos(DeathsXPos - (XL / 2) + Canvas.ClipX * 0.55, (PlayerBoxSizeY + BoxSpaceY)*i + BoxTextOffsetY); Canvas.DrawText("ALIVE", true); Canvas.DrawColor = HUDClass.default.WhiteColor; } } Canvas.ColorModulate = FullOn; Canvas.SetPos(NameXPos, OwnerPos); // draw team's average/totals/stuff Canvas.DrawColor = HUDClass.default.WhiteColor; if(RedPlayerCount >= 2) { BoxTextOffsetY += (PlayerBoxSizeY * 0.3); Canvas.SetPos(NameXPos, (PlayerBoxSizeY + BoxSpaceY) * RedPlayerCount + BoxTextOffsetY); Canvas.DrawText("Red Team", true); Canvas.StrLen(string(RedScore), xl, yl); Canvas.SetPos(ScoreXPos - 0.5 * xl, (PlayerBoxSizeY + BoxSpaceY) * RedPlayerCount + BoxTextOffsetY); Canvas.DrawText(string(RedScore), true); Canvas.StrLen(""$RedAlive$" / "$RedPlayerCount, xl, yl); Canvas.SetPos(DeathsXPos - (xl / 2), (PlayerBoxSizeY + BoxSpaceY) * RedPlayerCount + BoxTextOffsetY); Canvas.DrawText(""$RedAlive$" / "$RedPlayerCount, true); if(Level.NetMode != NM_Standalone) { Canvas.StrLen(string(RedPing), xl, yl); Canvas.SetPos(NetXPos - (xl / 2), (PlayerBoxSizeY + BoxSpaceY) * RedPlayerCount + BoxTextOffsetY); Canvas.DrawText(string(RedPing), true); } BoxTextOffsetY -= (PlayerBoxSizeY * 0.3); } if(BluePlayerCount >= 2) { BoxTextOffsetY += (PlayerBoxSizeY * 0.3); Canvas.SetPos(NameXPos + Canvas.ClipX * 0.55, (PlayerBoxSizeY + BoxSpaceY) * BluePlayerCount + BoxTextOffsetY); Canvas.DrawText("Blue Team", true); Canvas.StrLen(string(BlueScore), xl, yl); Canvas.SetPos(ScoreXPos - 0.5 * xl + Canvas.ClipX * 0.55, (PlayerBoxSizeY + BoxSpaceY) * BluePlayerCount + BoxTextOffsetY); Canvas.DrawText(string(BlueScore), true); Canvas.StrLen(""$BlueAlive$" / "$BluePlayerCount, xl, yl); Canvas.SetPos(DeathsXPos - (xl / 2) + Canvas.ClipX * 0.55, (PlayerBoxSizeY + BoxSpaceY) * BluePlayerCount + BoxTextOffsetY); Canvas.DrawText(""$BlueAlive$" / "$BluePlayerCount, true); if(Level.NetMode != NM_Standalone) { Canvas.StrLen(string(BluePing), xl, yl); Canvas.SetPos(NetXPos - (xl / 2) + Canvas.ClipX * 0.55, (PlayerBoxSizeY + BoxSpaceY) * BluePlayerCount + BoxTextOffsetY); Canvas.DrawText(string(BluePing), true); } BoxTextOffsetY -= (PlayerBoxSizeY * 0.3); } if ( Level.NetMode == NM_Standalone ) return; Canvas.StrLen("PING", NetXL, YL); Canvas.DrawColor = HUDClass.default.WhiteColor; Canvas.SetPos(NetXPos - 0.5 * NetXL, TitleYPos); Canvas.DrawText("PING", true); Canvas.SetPos(NetXPos - 0.5 * NetXL + Canvas.ClipX * 0.55, TitleYPos); Canvas.DrawText("PING", true); Canvas.DrawColor = HUDClass.default.CyanColor; if(GRI.bMatchHasBegun) { for(i = 0; i < RedPlayerCount; i++) { if(RedPRI[i].bAdmin) tmp = AdminText; else tmp = string(Min(999, 4 * RedPRI[i].Ping)); Canvas.StrLen(tmp, xl, yl); Canvas.SetPos(NetXPos - (xl / 2), (PlayerBoxSizeY + BoxSpaceY) * i + BoxTextOffsetY); Canvas.DrawText(tmp, true); } for(i = 0; i < BluePlayerCount; i++) { if(BluePRI[i].bAdmin) tmp = AdminText; else tmp = string(Min(999, 4 * BluePRI[i].Ping)); Canvas.StrLen(tmp, xl, yl); Canvas.SetPos(NetXPos - (xl / 2) + Canvas.ClipX * 0.55, (PlayerBoxSizeY + BoxSpaceY) * i + BoxTextOffsetY); Canvas.DrawText(tmp, true); } } else { for(i = 0; i < RedPlayerCount; i++) { if(RedPRI[i].bReadyToPlay) tmp = ReadyText; else { tmp = NotReadyText; Canvas.StrLen(tmp, xl, yl); if((NetXPos - (xl / 2) + xl) > BoxWidth) tmp = "NR"; } Canvas.StrLen(tmp, xl, yl); Canvas.SetPos(NetXPos - (xl / 2), (PlayerBoxSizeY + BoxSpaceY) * i + BoxTextOffsetY); Canvas.DrawText(tmp, true); } for(i = 0; i < BluePlayerCount; i++) { if(BluePRI[i].bReadyToPlay) tmp = ReadyText; else { tmp = NotReadyText; Canvas.StrLen(tmp, xl, yl); if((NetXPos - (xl / 2) + xl) > BoxWidth) tmp = "NR"; } Canvas.StrLen(tmp, xl, yl); Canvas.SetPos(NetXPos - (xl / 2) + Canvas.ClipX * 0.55, (PlayerBoxSizeY + BoxSpaceY) * i + BoxTextOffsetY); Canvas.DrawText(tmp, true); } } } simulated function bool InOrder( PlayerReplicationInfo P1, PlayerReplicationInfo P2 ) { if(P2 == None) return true; if( P1.bOnlySpectator ) { if( P2.bOnlySpectator ) return true; else return false; } else if ( P2.bOnlySpectator ) return true; if (Game_PRI_3SPN(P1).RoundsWon > Game_PRI_3SPN(P2).RoundsWon) return true; else if (Game_PRI_3SPN(P1).RoundsWon == Game_PRI_3SPN(P2).RoundsWon) { if(P1.Score > P2.Score) return true; else if(P1.Score == P2.Score) { if(P1.bOutOfLives && P2.bOutOfLives) return true; else if(P1.bOutOfLives) return false; else if(P2.bOutOfLives) return true; else return true; } else return false; } return false; } ni~2B odX^TʆzVGBzVGBzVGBLLLLzVGBzVGBzVGBzVGBzVGBzVGBzVGBzVGBҽU- =1- =1zVGBzVGBzVGBJzVGBzVGBzVGBzVGBzVGBzVGBҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽu)ҽҽҽu)ҽҽҽu)ҽҽҽҽu)ҽҽҽҽҽҽҽҽҽu)ҽҽu)ҽҽҽҽҽu)ҽҽu)ҽҽҽu)ҽҽҽҽu)ҽҽu)ҽҽҽu)ҽҽҽҽu)ҽҽҽҽҽҽҽҽҽu)ҽu)ҽҽҽҽҽu)ҽҽu)ҽҽu)ҽҽҽUu)ҽҽҽu)ҽҽҽҽҽҽҽҽҽҽҽҽҽҽu)ҽҽҽҽҽҽҽҽҽu)ҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽu)ҽҽҽҽҽҽu)ҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽu)ҽҽҽҽҽҽҽҽҽҽҽҽҽUu)ҽҽҽҽҽҽu)ҽҽҽu)ҽҽҽҽҽҽҽu)ҽҽҽu)ҽҽҽҽҽҽu)ҽҽҽҽҽҽҽҽu)ҽҽҽҽҽҽҽҽҽzVGBҽzVGBҽzVGBҽzVGBҽҽҽu)ҽҽҽu)ҽu)zVGBҽҽҽҽҽu)zVGBҽҽҽzVGBҽҽzVGBҽu)zVGBҽu)ҽҽҽҽҽu)ҽu)ҽҽҽҽҽu)ҽzVGBҽzVGBҽzVGBҽzVGBҽҽҽu)ҽҽҽu)ҽu)zVGBҽҽҽҽҽҽu)zVGBҽҽҽzVGBҽҽҽzVGBҽu)zVGBҽu)ҽҽҽҽҽҽu)ҽu)ҽҽҽҽҽҽu)ҽҽҽu)ҽҽҽҽҽҽҽҽ3}ҽҽҽҽҽҽҽҽҽҽҽҽҽҽ3}ҽҽҽҽ3}ҽҽu)ҽҽҽҽҽҽu)- =1zVGBzVGBҽҽҽzVGBzVGBҽҽҽҽzVGBҽҽҽҽzVGBҽҽҽҽҽҽ_V$?'$=\"Z"os$?)*)gZgmu^qZph"i"k"Nn"Y$?_V$?'$=\"Z" os$?)*)ggmu^qZph"i"k"Nn"Y$?_V$?'$=\"2Z" os$?)*)fZgmu^qZph"wi"k"n"9Y$?_V$?'$=\"Z"os$?)*)fgmu^qZph"wi"k"n"9Y$?_V$?'$=\"#Z"os$?)*)XZglu^qZph"i"k"n"Y$=_V$?'$=\"8Z"-os$)*dd) Xglu^qZph"i"k"n"Y$=_V$?'$=\"Z"-os$)*) e=class TDM_Mut_3SPN extends DMMutator HideDropDown CacheExempt; function bool IsRelevant(Actor Other, out byte bSuperRelevant) { if(!TDM_Game_3SPN(Level.Game).bUTComp) { if(Controller(Other) != None && MessagingSpectator(Other) == None) { Controller(Other).PlayerReplicationInfoClass = class'Game_PRI_3SPN'; } } return Super.IsRelevant(Other, bSuperRelevant); } function PostBeginPlay() { local Game_Rules_3SPN G; Super.PostBeginPlay(); if(Level.NetMode != NM_Client) { G = spawn(class'Game_Rules_3SPN'); if(Level.Game.GameRulesModifiers == None) Level.Game.GameRulesModifiers = G; else Level.Game.GameRulesModifiers.AddGameRules(G); } } function ModifyPlayer( Pawn Other ) { local xPawn xp; local xPlayer xpl; local int c; local TDM_Game_3SPN TDMGame; TDMGame = TDM_Game_3SPN(Level.Game); xp = xPawn( Other ); if( xp == None ) return; xpl = xPlayer( xp.Controller ); if( xpl == none ) return; if(!TDMGame.bUseNewBooster) return; for( c = 0; c < ArrayCount( xpl.ComboList ); c++ ) { if( xpl.ComboNameList[c] ~= "xGame.ComboDefensive" ) { xpl.ComboNameList[c] = "3SPNv252.Combo_Booster_3SPN"; xpl.ComboList[c] = class( DynamicLoadObject( "3SPNv252.Combo_Booster_3SPN", class'Class' ) ); xpl.MinAdrenalineCost = FMin( xpl.MinAdrenalineCost, xpl.ComboList[c].Default.AdrenalineCost ); break; } } Super.ModifyPlayer( Other ); } function bool CheckReplacement(Actor Other, out byte bSuperRelevant) { local int c; local TDM_Game_3SPN TDMGame; bSuperRelevant = 0; if(Bot( Other ) != None) { for( c = 0; c < ArrayCount( Bot( Other ).ComboNames ); c++ ) { if( Bot( Other ).ComboNames[c] ~= "xGame.ComboDefensive" ) { Bot( Other ).ComboNames[c] = "3SPNv252.Combo_Booster_3SPN"; break; } } } if(!TDM_Game_3SPN(Level.Game).bUTComp) { if(Other.IsA('AssaultRifle')) { AssaultRifle(Other).FireModeClass[0] = Class'WeaponFire_Assault_3SPN'; AssaultRifle(Other).FireModeClass[1] = Class'WeaponFire_AssaultAlt_3SPN'; } else if(Other.IsA('BioRifle')) { BioRifle(Other).FireModeClass[0] = Class'WeaponFire_Bio_3SPN'; BioRifle(Other).FireModeClass[1] = Class'WeaponFire_BioAlt_3SPN'; } else if(Other.IsA('ShockRifle')) { ShockRifle(Other).FireModeClass[0] = Class'WeaponFire_Shock_3SPN'; ShockRifle(Other).FireModeClass[1] = Class'WeaponFire_ShockAlt_3SPN'; } else if(Other.IsA('LinkGun')) { LinkGun(Other).FireModeClass[0] = Class'WeaponFire_Link_3SPN'; LinkGun(Other).FireModeClass[1] = Class'WeaponFire_LinkAlt_3SPN'; } else if(Other.IsA('Minigun')) { MiniGun(Other).FireModeClass[0] = Class'WeaponFire_Mini_3SPN'; MiniGun(Other).FireModeClass[1] = Class'WeaponFire_MiniAlt_3SPN'; } else if(Other.IsA('FlakCannon')) { FlakCannon(Other).FireModeClass[0] = Class'WeaponFire_Flak_3SPN'; FlakCannon(Other).FireModeClass[1] = Class'WeaponFire_FlakAlt_3SPN'; } else if(Other.IsA('RocketLauncher')) { RocketLauncher(Other).FireModeClass[0] = Class'WeaponFire_Rocket_3SPN'; RocketLauncher(Other).FireModeClass[1] = Class'WeaponFire_RocketAlt_3SPN'; } else if(Other.IsA('SniperRifle')) { SniperRifle(Other).FireModeClass[0] = Class'WeaponFire_Lightning_3SPN'; } } TDMGame = TDM_Game_3SPN(Level.Game); if(TDMGame == None) { Log("Error fetching TDMGame."); return true; } if(TDMGame.bAllowPickups) { if (Other.IsA('AdrenalinePickup') && !TDMGame.bAllowAdrenaline) return false; return true; } if(Other.IsA('Pickup')) return false; if(Other.IsA('xPickupBase')) Other.bHidden = true; return true; } piQ6+3}tp,e ? !# "Fclass TDM_MapList_3SPN extends MapListTeamDeathMatch config; rP6scd & !# "gclass TDM_HUD_3SPN extends HudCTeamDeathMatch; var Texture fade; var Texture rfade; exec function ShowStats() { bShowLocalStats = !bShowLocalStats; Game_Player_3SPN(PlayerOwner).bFirstOpen = bShowLocalStats; } simulated function DrawChargeBar(Canvas C) { if(PawnOwner.Weapon.IsA('Translauncher')) return; Super.DrawChargeBar(C); } simulated function UpdateRankAndSpread(Canvas C) { if(!Game_Player_3SPN(PlayerOwner).bShowTeamHUDScorebar && !Game_Player_3SPN(PlayerOwner).bShowEnemyBox) return; UpdateRankAndSpreadOnline(C); } simulated function UpdateRankAndSpreadOnline(Canvas C) { local int i; local int drawy; local int textx; local int namey; local int locy; local int boxwidth; local int yjump; local int shieldx; local float xl; local float yl; local float MaxNamePos; local Color BG; local Color LC; local int stats; local int startstats; local string name; local int fontMedium; local int fontSmall; local Game_PRI_3SPN Allies[16]; local Game_PRI_3SPN Foes[16]; local Game_PRI_3SPN PRI; local int myteam; local int enemies; local int friendlies; local float scale; local Color RoE; local Color BoA; RoE = Game_Player_3SPN(PlayerOwner).RedOrEnemy * 2; BoA = Game_Player_3SPN(PlayerOwner).BlueOrAlly * 2; RoE.A = HudColorRed.A; BoA.A = HudColorBlue.A; if(PlayerOwner == None) return; if(PlayerOwner.PlayerReplicationInfo.bOnlySpectator) { if(Pawn(PlayerOwner.ViewTarget) != None && Pawn(PlayerOwner.ViewTarget).PlayerReplicationInfo != None && Pawn(PlayerOwner.ViewTarget).PlayerReplicationInfo.Team != None) myteam = Pawn(PlayerOwner.ViewTarget).PlayerReplicationInfo.Team.TeamIndex; else return; } else myteam = PlayerOwner.PlayerReplicationInfo.Team.TeamIndex; // always force the team icon of the player's team to the left if(myteam == 0) { TeamSymbols[0].OffsetX = -200; TeamSymbols[1].OffsetX = 200; ScoreTeam[0].OffsetX = -90; ScoreTeam[1].OffsetX = 90; } else { TeamSymbols[1].OffsetX = -460; TeamSymbols[0].OffsetX = 460; ScoreTeam[0].OffsetX = 130; ScoreTeam[1].OffsetX = -130; } // matching hud to brightskins section if(Game_Player_3SPN(PlayerOwner).bMatchHUDToSkins) { if(Game_Player_3SPN(PlayerOwner).bEnemyAllyColors) { if(myteam == 0) { HudColorRed = BoA; HudColorBlue = RoE; TeamSymbols[0].Tints[0] = BoA; TeamSymbols[0].Tints[1] = BoA; TeamSymbols[1].Tints[0] = RoE; TeamSymbols[1].Tints[1] = RoE; } else { HudColorBlue = BoA; HudColorRed = RoE; TeamSymbols[0].Tints[0] = RoE; TeamSymbols[0].Tints[1] = RoE; TeamSymbols[1].Tints[0] = BoA; TeamSymbols[1].Tints[1] = BoA; } } else { HudColorRed = RoE; HudColorBlue = BoA; } } else { HudColorRed = Default.HudColorRed; HudColorBlue = Default.HudColorBlue; TeamSymbols[0].Tints[0] = Default.HudColorTeam[0]; TeamSymbols[0].Tints[1] = Default.HudColorTeam[0]; TeamSymbols[1].Tints[0] = Default.HudColorTeam[1]; TeamSymbols[1].Tints[1] = Default.HudColorTeam[1]; } // end of matching hud to brightskins section if(Game_Player_3SPN(PlayerOwner).bSmallerInfoBoxes) Scale = 0.60; else Scale = 1.0; for(i = 0; i < PlayerOwner.GameReplicationInfo.PRIArray.Length; i++) { PRI = Game_PRI_3SPN(PlayerOwner.GameReplicationInfo.PRIArray[i]); if(PRI == None || PRI.Team == None || PRI.bOnlySpectator || PRI == PlayerOwner.PlayerReplicationInfo) continue; if(PRI.Team.TeamIndex == myteam && !PRI.bOutOfLives) Allies[friendlies++] = PRI; else if(PRI.Team.TeamIndex != myteam && !PRI.bOutOfLives) Foes[enemies++] = PRI; } if(friendlies == 0 && enemies == 0) return; locy = 0.0185 * C.ClipY * scale; fontMedium = -3 - ((1.0 - scale) * 3); fontSmall = -4 - ((1.0 - scale) * 3); if(Game_Player_3SPN(PlayerOwner).bShowTeamHUDScorebar && friendlies > 0) { drawy = 0.070 * C.ClipY; textx = 4 * scale; boxwidth = 0.185 * C.ClipX * scale; yjump = 0.0250 * C.ClipY * scale; namey = 3 * scale; shieldx = 0.1550 * C.ClipX * scale; if(Game_Player_3SPN(PlayerOwner).bMatchHUDToSkins) { BoA = BoA * 0.5; RoE = RoE * 0.5; if(!Game_Player_3SPN(PlayerOwner).bEnemyAllyColors) { if(myteam == 0) { BG = RoE; BG.A = 35; LC = RoE * 2.55; LC.A = 200; } else { BG = BoA; BG.A = 35; LC = BoA * 2.55; LC.A = 200; } } else { BG = BoA; BG.A = 35; LC = BoA * 2.55; LC.A = 200; } } else { if(myteam == 0) { BG.r = 120; BG.g = 0; BG.b = 0; BG.a = 30; LC.r = 255; LC.g = 70; LC.b = 10; LC.a = 200; } else { BG.r = 0; BG.g = 30; BG.b = 100; BG.a = 35; LC.r = 100; LC.g = 175; LC.b = 255; LC.a = 200; } } if(Game_Player_3SPN(PlayerOwner).bShowMyLocation) { C.DrawColor = BG; C.SetPos(0, drawy); C.DrawRect(rfade, boxwidth, yjump); } C.DrawColor = WhiteColor; C.DrawColor.a = 200; C.SetPos(0, drawy); C.DrawRect(rfade, boxwidth, 2 * scale); if(Game_Player_3SPN(PlayerOwner).bShowMyLocation) { C.SetPos(0, drawy + yjump); C.DrawRect(rfade, boxwidth, 1); // location C.DrawColor = GreenColor; C.Font = GetFontSizeIndex(C, fontMedium); MaxNamePos = 0.99 * (boxwidth - textx); name = PlayerOwner.PlayerReplicationInfo.GetLocationName(); C.StrLen(name, XL, YL); if(XL > MaxNamePos) { MaxNamePos = 0.89 * (boxwidth - textx); name = left(name, MaxNamePos / XL * len(name))$"..."; } C.StrLen(name, XL, YL); C.SetPos(textx, drawy + namey); C.DrawText(name, true); drawy = (drawy + yjump); } if(Game_Player_3SPN(PlayerOwner).bShowTeamLocation) yjump = 0.0375 * C.ClipY * scale; C.DrawColor = BG; C.SetPos(0, drawy); C.DrawRect(rfade, boxwidth, yjump * friendlies); for(i = 0; i < friendlies; i++) { C.DrawColor = WhiteColor; C.Font = GetFontSizeIndex(C, fontMedium); // player name name = Allies[i].PlayerName; MaxNamePos = 0.95 * (shieldx - textx); C.StrLen(name, XL, YL); if(XL > MaxNamePos) { MaxNamePos = 0.85 * (shieldx - textx); name = left(name, MaxNamePos / XL * len(name))$"..."; } C.StrLen(name, XL, YL); C.SetPos(textx, drawy + (i * yjump) + namey); C.DrawText(name, true); // player location if(Game_Player_3SPN(PlayerOwner).bShowTeamLocation) { C.Font = GetFontSizeIndex(C, fontSmall); MaxNamePos = 0.99 * (boxwidth - textx); name = Allies[i].GetLocationName(); C.StrLen(name, XL, YL); if(XL > MaxNamePos) { MaxNamePos = 0.85 * (boxwidth - textx); name = left(name, MaxNamePos / XL * len(name))$"..."; } C.StrLen(name, XL, YL); C.DrawColor = GoldColor; C.SetPos(textx + 4, drawy + (i * yjump) + namey + locy); C.DrawText(name, true); } // player health stats = Allies[i].HP + Allies[i].AP; startstats = Allies[i].startHP + Allies[i].startAP; C.DrawColor = GreenColor; // check that booster hasn't raised health above starting levels if(stats < startStats) { C.DrawColor.r = Min(255, (511 * (float(StartStats - Stats) / float(startStats)))); if(C.DrawColor.r == 255) C.DrawColor.g = Min(255, (511 * (float(Stats) / float(startStats)))); } C.Font = GetFontSizeIndex(C, fontMedium); C.SetPos(shieldx, drawy + (i * yjump) + namey); C.DrawText(""$stats, true); // draw line C.DrawColor = LC; C.SetPos(0, drawy + ((i + 1) * yjump)); if((i + 1) != friendlies) C.DrawRect(rfade, boxwidth, 1); } C.DrawColor = WhiteColor; C.DrawColor.a = 200; C.SetPos(0, drawy + (i * yjump)); C.DrawRect(rfade, boxwidth, 2 * scale); } if(enemies == 0 || !Game_Player_3SPN(PlayerOwner).bShowEnemyBox) return; drawy = 0.070 * C.ClipY; textx = 2 * scale; boxwidth = 0.140 * C.ClipX * scale; yjump = 0.0250 * C.ClipY * scale; namey = 2 * scale; if(Game_Player_3SPN(PlayerOwner).bMatchHUDToSkins) { if(!Game_Player_3SPN(PlayerOwner).bEnemyAllyColors) { if(myteam == 0) { BG = BoA; BG.A = 35; LC = BoA * 2.55; LC.A = 200; } else { BG = RoE; BG.A = 35; LC = RoE * 2.55; LC.A = 200; } } else { BG = RoE; BG.A = 35; LC = RoE * 2.55; LC.A = 200; } } else { if(myteam == 0) { BG.r = 0; BG.g = 30; BG.b = 100; BG.a = 35; LC.r = 100; LC.g = 175; LC.b = 255; LC.a = 200; } else { BG.r = 120; BG.g = 0; BG.b = 0; BG.a = 30; LC.r = 255; LC.g = 70; LC.b = 10; LC.a = 200; } } C.DrawColor = WhiteColor; C.DrawColor.a = 200; C.SetPos(C.ClipX - boxwidth, drawy); C.DrawRect(fade, boxwidth, 2 * scale); C.DrawColor = BG; C.SetPos(C.ClipX - boxwidth, drawy); C.DrawRect(fade, boxwidth, yjump * enemies); C.Font = GetFontSizeIndex(C, fontMedium); for(i = 0; i < enemies; i++) { name = Foes[i].Playername; C.DrawColor = WhiteColor; // name MaxNamePos = 0.99 * (boxwidth - textx); C.StrLen(name, XL, YL); if(XL > MaxNamePos) { MaxNamePos = 0.80 * (boxwidth - textx); name = left(name, MaxNamePos / XL * len(name))$"..."; } C.StrLen(name, XL, YL); C.SetPos(C.ClipX - XL - textx, drawy + (i * yjump) + namey); C.DrawText(name, true); // draw line C.DrawColor = LC; C.SetPos(C.ClipX - boxwidth, drawy + ((i + 1) * yjump)); if((i + 1) != enemies) C.DrawRect(fade, boxwidth, 1); } C.DrawColor = WhiteColor; C.DrawColor.a = 200; C.SetPos(C.ClipX - boxwidth, drawy + (i * yjump)); C.DrawRect(fade, boxwidth, 2 * scale); } function CheckCountdown(GameReplicationInfo GRI) { if ( (GRI == None) || (GRI.RemainingTime == 0) || (GRI.RemainingTime == OldRemainingTime) || (GRI.Winner != None) ) return; OldRemainingTime = GRI.RemainingTime; if ( OldRemainingTime > 300 ) return; if(GRI.TimeLimit > 1) { if ( OldRemainingTime == 60 ) PlayerOwner.PlayStatusAnnouncement(LongCountName[3],1,true); } if ( OldRemainingTime == 30 ) PlayerOwner.PlayStatusAnnouncement(LongCountName[4],1,true); else if ( OldRemainingTime == 20 ) PlayerOwner.PlayStatusAnnouncement(LongCountName[5],1,true); else if ( (OldRemainingTime <= 5) && (OldRemainingTime > 0) ) PlayerOwner.PlayStatusAnnouncement(CountDownName[OldRemainingTime - 1],1,true); } tclass TDM_Game_3SPN extends xTeamGame config; var Game_GRI_3SPN theGRI; // general settings var() config bool bChallengeMode; var() config bool bAllowPickups; var() config bool bAllowAdrenaline; var() config bool bFullAmmo; var() config bool bGiveAdren; // gives full adrenaline at the start of a round var() config bool bSpecsCanTalk; var() config bool bReverseFF; var() config bool bUseAlternateScoring; // give points based on damage var() config int startingHealth; var() config int startingArmor; var() config int roundsToWin; var() config int overtimeDamage; var() config float overtimeDamageTime; var() config float adrenalinePerKill; var() config int healthPerKill; // health gained per kill var() config float maxHealth; // maximum health, is percentage of starting health based on rounds won var() config bool bUseNewBooster; var() config bool bDisableBrightskins; var() config bool bDisableHitSounds; var() config bool bDisableSpeed; var() config bool bDisableBooster; var() config bool bDisableInvis; var() config bool bDisableBerserk; var() config int numTimeouts; var() config int roundTime; var() config bool bAutoRecDemos; var() config bool bForceRUP; // force players to ready after some amount of time // weapons var() config bool bImprovedShieldGun; // use the shieldgun that has reduced damage and increased kick var() config int grenadeCount; var() config int assaultAmmoCount; var() config int bioAmmoCount; var() config int shockAmmoCount; var() config int linkAmmoCount; var() config int miniAmmoCount; var() config int flakAmmoCount; var() config int rocketAmmoCount; var() config int lightningAmmoCount; var() config int transAmmoCount; // misc countdown shizzle var() int currentRound; var() int roundCountdown; // countdown in seconds before players can shoot after the start of a round var() int currentCount; var() int endCount; var() int otCount; var() bool bWeaponsLocked; var() bool bStarted; var() bool bEndOfRound; var() bool bIsOvertime; var() bool bRespawning; var() bool bFirstSpawn; // camping var() config float CampThreshold; var() config int ReCamperWarnInterval; var() config bool bCamperAlarm; var() config float CampDamage; // timeout shizzle var() bool bTimeouts; var() bool bTimedout; // is it timeout? var() int timedOut; // who called timeout var() int timeoutCount; var() int teamTimeouts[2]; var() bool bUTComp; var() int weaponCount; // blackhorse var() Controller lastOne; // last remaining player on a team replication { reliable if(Role == ROLE_Authority) theGRI, bWeaponsLocked, bUTComp; /*reliable if(Role == ROLE_Authority) ResetClock;*/ } ////////////////////////////////////////////////////////////// // Pre-Game and misc functions /////////////////////////////// function GetServerDetails( out ServerResponseLine ServerState ) { Super.GetServerDetails(ServerState); AddServerDetail( ServerState, "Rounds to Win", roundsToWin); AddServerDetail( ServerState, "Starting Health", StartingHealth); AddServerDetail( ServerState, "Starting Armor", StartingArmor); AddServerDetail( ServerState, "Adrenaline", bAllowAdrenaline); AddServerDetail( ServerState, "Adrenaline Per Kill", adrenalinePerKill); AddServerDetail( ServerState, "Challenge Mode", bChallengeMode); AddServerDetail( ServerState, "Allow Pickups", bAllowPickups); AddServerDetail( ServerState, "Hitsounds", !bDisableHitsounds); AddServerDetail( ServerState, "Brightskins", !bDisableBrightskins); AddServerDetail( ServerState, "3SPN Version", class'Game_GRI_3SPN'.default.Version); } // GetServerDetails() static function FillPlayInfo(PlayInfo PlayInfo) { Super.FillPlayInfo(PlayInfo); PlayInfo.AddSetting(default.GameGroup, "startingHealth", "Starting Health", 0, 107, "Text", "3;0:999",,True); PlayInfo.AddSetting(default.GameGroup, "startingArmor", "Starting Armor", 0, 108, "Text", "3;0:999",,True); PlayInfo.AddSetting(default.GameGroup, "bAllowAdrenaline", "Adrenaline", 0, 111, "Check"); PlayInfo.AddSetting(default.GameGroup, "adrenalinePerKill", "Adrenaline per Kill", 0, 112, "Text", "3;0:100",, True); PlayInfo.AddSetting(default.GameGroup, "bGiveAdren", "Full adrenaline", 0, 113, "Check"); PlayInfo.AddSetting(default.GameGroup, "bFullAmmo", "Give Players Full Ammo", 0, 120, "Check"); PlayInfo.AddSetting(default.GameGroup, "bAllowPickups", "Allow Pickups.", 0, 121, "Check"); PlayInfo.AddSetting(default.GameGroup, "bChallengeMode", "Challenge Mode", 0, 130, "Check"); PlayInfo.AddSetting(default.GameGroup, "roundsToWin", "Rounds to Win", 0, 140, "Text", "3;0:999",,True); PlayInfo.AddSetting(default.GameGroup, "roundTime", "Minutes Per Round", 0, 141, "Text", "3;0:999",,True); PlayInfo.AddSetting(default.GameGroup, "overtimeDamage", "Overtime Damage", 0, 142, "Text", "3;0:999",,True); PlayInfo.AddSetting(default.GameGroup, "overtimeDamageTime", "Overtime Interval", 0, 143, "Text", "3;0:999",,True); PlayInfo.AddSetting(default.GameGroup, "healthPerKill", "Health Per Kill", 0, 150, "Text", "3;0:999",, True); PlayInfo.AddSetting(default.GameGroup, "maxHealth", "Max Health", 0, 151, "Text", "8;0.0:2.0",, True); PlayInfo.AddSetting(default.GameGroup, "bForceRUP", "Force Ready", 0, 152, "Check"); PlayInfo.AddSetting(default.GameGroup, "numTimeouts", "Timeouts", 0, 160, "Text", "3;0:999",, True); PlayInfo.AddSetting(default.GameGroup, "bReverseFF", "Reverse FF", 0, 161, "Check"); PlayInfo.AddSetting(default.RulesGroup, "bImprovedShieldGun", "Use Modified Shield Gun", 0, 170, "Check"); PlayInfo.AddSetting(default.RulesGroup, "grenadeCount", "Grenades", 0, 171, "Text", "3;0:999",, True); PlayInfo.AddSetting(default.RulesGroup, "assaultAmmoCount", "Assault Ammo", 0, 172, "Text", "3;0:999",, True); PlayInfo.AddSetting(default.RulesGroup, "bioAmmoCount", "Bio Ammo", 0, 173, "Text", "3;0:999",, True); PlayInfo.AddSetting(default.RulesGroup, "shockAmmoCount", "Shock Ammo", 0, 174, "Text", "3;0:999",, True); PlayInfo.AddSetting(default.RulesGroup, "linkAmmoCount", "Link Ammo", 0, 175, "Text", "3;0:999",, True); PlayInfo.AddSetting(default.RulesGroup, "miniAmmoCount", "Mini Ammo", 0, 176, "Text", "3;0:999",, True); PlayInfo.AddSetting(default.RulesGroup, "flakAmmoCount", "Flak Ammo", 0, 177, "Text", "3;0:999",, True); PlayInfo.AddSetting(default.RulesGroup, "rocketAmmoCount", "Rocket Ammo", 0, 178, "Text", "3;0:999",, True); PlayInfo.AddSetting(default.RulesGroup, "lightningAmmoCount", "Lightning Ammo", 0, 179, "Text", "3;0:999",, True); PlayInfo.AddSetting(default.RulesGroup, "transAmmoCount", "Translocator Ammo", 0, 180, "Text", "3;0:999",, True); PlayInfo.AddSetting(default.GameGroup, "bCamperAlarm", "Check for Campers", 0, 190, "Check"); PlayInfo.AddSetting(default.GameGroup, "CampThreshold", "Camp Threshold", 0, 191, "Text", "5;0:999",, True); PlayInfo.AddSetting(default.GameGroup, "ReCamperWarnInterval", "Camper Interval", 0, 192, "Text", "3;0:999",, True); PlayInfo.AddSetting(default.GameGroup, "CampDamage", "Camper Damage", 0, 193, "Text", "3;0:999",, True); PlayInfo.AddSetting(default.RulesGroup, "bDisableSpeed", "Disable Speed", 0, 200, "Check"); PlayInfo.AddSetting(default.RulesGroup, "bDisableInvis", "Disable Invisibility", 0, 201, "Check"); PlayInfo.AddSetting(default.RulesGroup, "bDisableBerserk", "Disable Berserk", 0, 202, "Check"); PlayInfo.AddSetting(default.RulesGroup, "bDisableBooster", "Disable Booster", 0, 203, "Check"); } // fillplayinfo() static event string GetDescriptionText(string PropName) { switch (PropName) { case "startingHealth": return "Base health at round-start."; case "startingArmor": return "Base armor at round-start."; case "bAllowAdrenaline": return "Turn on or off adrenaline."; case "bGiveAdren": return "Give full adrenaline at round-start."; case "bFullAmmo": return "Give full ammo at round-start."; case "bAllowPickups": return "Players must pick up weapons."; case "bChallengeMode": return "Round winners take a health/armor penalty. (Previously known as Survivor Mode)"; case "roundsToWin": return "The rounds a team must win to win the game."; case "roundTime": return "The minutes a round goes before it goes into overtime."; case "overtimeDamage": return "The damage players take every so often in overtime."; case "overtimeDamageTime": return "How often players take damage in overtime."; case "adrenalinePerKill": return "The adrenaline received per kill."; case "healthPerKill": return "The health received per kill."; case "maxHealth": return "The maximum health a player can achieve (percentage)."; case "bForceRUP": return "Forces players to ready up after 30 seconds."; case "numTimeouts": return "The number of timeouts a team has."; case "bReverseFF": return "Reverses friendly fire damage to damage the shooter."; case "bImprovedShieldGun": return "Gives players a modified shield gun, with higher shield jumps and reduced self-damage."; case "grenadeCount": return "Grenades given."; case "assaultAmmoCount": return "Assault ammo given."; case "bioAmmoCount": return "Bio ammo given."; case "shockAmmoCount": return "Shock ammo given."; case "linkAmmoCount": return "Link ammo given."; case "miniAmmoCount": return "Mini ammo given."; case "flakAmmoCount": return "Flak ammo given."; case "rocketAmmoCount": return "Rocket ammo given."; case "lightningAmmoCount": return "Lightning ammo given."; case "transAmmoCount": return "Tranlocator charges given (these do not recharge)."; case "bCamperAlarm": return "Checks for players remaining in the same spot for too long (camping)."; case "CampThreshold": return "The area a player must stay in to be considered camping."; case "ReCamperWarnInterval": return "The amount of time between warning the same player."; case "CampDamage": return "The damage a player takes each time they're caught (multiplied by the number of times they've been caught)."; case "bDisableSpeed": return "Disable the Speed adrenaline combo."; case "bDisableInvis": return "Disable the Invisibility adrenaline combo."; case "bDisableBooster": return "Disable the Booster adrenaline combo."; case "bDisableBerserk": return "Disable the Berserk adrenaline combo."; } return Super.GetDescriptionText(PropName); } // getdescriptiontext() // Parse options for this game... event InitGame( string Options, out string Error ) { local string InOpt; local Mutator m; Super.InitGame(Options, Error); // Use camper alarm InOpt = ParseOption( Options, "CamperAlarm"); if(InOpt != "") bCamperAlarm = bool(InOpt); InOpt = ParseOption(Options, "CampThreshold"); if(InOpt != "") CampThreshold = int(InOpt); InOpt = ParseOption(Options, "ReCamperWarnInterval"); if(InOpt != "") ReCamperWarnInterval = int(InOpt); InOpt = ParseOption(Options, "CampDamage"); if(InOpt != "") CampDamage = float(InOpt); InOpt = ParseOption(Options, "AllowPickups"); if (InOpt !="") bAllowPickups = bool(InOpt); InOpt = ParseOption(Options, "AllowAdrenaline"); if (InOpt != "") bAllowAdrenaline = bool(InOpt); InOpt = ParseOption(Options, "GiveAdren"); if(InOpt != "") { bGiveAdren = bool(InOpt); if(bGiveAdren == true) bAllowAdrenaline = true; } InOpt = ParseOption(Options, "StartingHealth"); if(InOpt != "") startingHealth = int(InOpt); InOpt = ParseOption(Options, "StartingArmor"); if(InOpt != "") startingArmor = int(InOpt); InOpt = ParseOption(Options, "roundsToWin"); if(InOpt != "") roundsToWin = int(InOpt); InOpt = ParseOption(Options, "FullAmmo"); if(InOpt != "") bFullAmmo = bool(InOpt); InOpt = ParseOption(Options, "SpecsCanTalk"); if(InOpt != "") bSpecsCanTalk = bool(InOpt); InOpt = ParseOption(Options, "SurvivorMode"); if(InOpt != "") bChallengeMode = bool(InOpt); InOpt = ParseOption(Options, "ChallengeMode"); if(InOpt != "") bChallengeMode = bool(InOpt); InOpt = ParseOption(Options, "overtimeDamage"); if(InOpt != "") overtimeDamage = int(InOpt); InOpt = ParseOption(Options, "overtimeDamageTime"); if(InOpt != "") overtimeDamageTime = float(InOpt); InOpt = Parseoption(Options, "adrenalinePerKill"); if(InOpt != "") adrenalinePerKill = float(InOpt); InOpt = ParseOption(Options, "healthPerKill"); if(InOpt != "") healthPerKill = int(InOpt); InOpt = ParseOption(Options, "maxHealth"); if(InOpt != "") maxHealth = float(InOpt); InOpt = ParseOption(Options, "ImprovedShieldGun"); if(InOpt != "") bImprovedShieldGun = bool(InOpt); InOpt = ParseOption(Options, "grenadeCount"); if(InOpt != "") grenadeCount = int(InOpt); InOpt = ParseOption(Options, "assaultAmmoCount"); if(InOpt != "") assaultAmmoCount = int(InOpt); InOpt = ParseOption(Options, "bioAmmoCount"); if(InOpt != "") bioAmmoCount = int(InOpt); InOpt = ParseOption(Options, "shockAmmoCount"); if(InOpt != "") shockAmmoCount = int(InOpt); InOpt = ParseOption(Options, "linkAmmoCount"); if(InOpt != "") linkAmmoCount = int(InOpt); InOpt = ParseOption(Options, "miniAmmoCount"); if(InOpt != "") miniAmmoCount = int(InOpt); InOpt = ParseOption(Options, "flakAmmoCount"); if(InOpt != "") flakAmmoCount = int(InOpt); InOpt = ParseOption(Options, "rocketAmmoCount"); if(InOpt != "") rocketAmmoCount = int(InOpt); InOpt = ParseOption(Options, "lightningAmmoCount"); if(InOpt != "") lightningAmmoCount = int(InOpt); InOpt = ParseOption(Options, "transAmmoCount"); if(InOpt != "") transAmmoCount = int(InOpt); InOpt = ParseOption(Options, "DisableSpeed"); if(InOpt != "") bDisableSpeed = bool(InOpt); InOpt = ParseOption(Options, "DisableBooster"); if(InOpt != "") bDisableBooster = bool(InOpt); InOpt = ParseOption(Options, "DisableBerserk"); if(InOpt != "") bDisableBerserk = bool(InOpt); InOpt = ParseOption(Options, "DisableInvis"); if(InOpt != "") bDisableInvis = bool(InOpt); InOpt = ParseOption(Options, "DisableHitsounds"); if(InOpt != "") bDisableHitsounds = bool(InOpt); InOpt = ParseOption(Options, "DisableBrightskins"); if(InOpt != "") bDisableBrightskins = bool(InOpt); InOpt = ParseOption(Options, "ReverseFF"); if(InOpt != "") bReverseFF = bool(InOpt); InOpt = ParseOption(Options, "numTimeouts"); if(InOpt != "") numTimeouts = int(InOpt); InOpt = ParseOption(Options, "roundTime"); if(InOpt != "") roundTime = int(InOpt); InOpt = ParseOption(Options, "AutoRecDemos"); if(InOpt != "") bAutoRecDemos = bool(InOpt); InOpt = ParseOption(Options, "ForceRUP"); if(InOpt != "") bForceRUP = bool(InOpt); if(theGRI == None) theGRI = Spawn(class'Game_GRI_3SPN'); theGRI.gamename = "3SPN-TDM"; theGRI.TAM.mapname = Left(string(Level), InStr(string(Level), ".")); theGRI.TAM.bGiveAdren = bGiveAdren; theGRI.TAM.bAdren = bAllowAdrenaline; theGRI.TAM.bFullAmmo = bFullAmmo; theGRI.TAM.bAllowPickups = bAllowPickups; theGRI.TAM.bWeaponStay = bWeaponStay; theGRI.TAM.bSpecsCanTalk = bSpecsCanTalk; theGRI.TAM.bPlayersMustBeReady = bPlayersMustBeReady; theGRI.TAM.bChallengeMode = bChallengeMode; theGRI.TAM.bReverseFF = bReverseFF; theGRI.TAM.startingHealth = startingHealth; theGRI.TAM.startingArmor = startingArmor; theGRI.TAM.roundsToWin = roundsToWin; theGRI.TAM.roundTime = roundTime; theGRI.TAM.overtimeDamage = overtimeDamage; theGRI.TAM.overtimeDamageTime = overtimeDamageTime; theGRI.TAM.adrenalinePerKill = adrenalinePerKill; theGRI.TAM.healthPerKill = healthPerKill; theGRI.TAM.maxHealth = maxHealth; theGRI.TAM.friendlyFire = friendlyFireScale; theGRI.TAM.numTimeouts = numTimeouts; theGRI.TAM.bImprovedShieldGun = bImprovedShieldGun; theGRI.TAM.grenadeCount = grenadeCount; theGRI.TAM.assaultAmmoCount = assaultAmmoCount; theGRI.TAM.bioAmmoCount = bioAmmoCount; theGRI.TAM.shockAmmoCount = shockAmmoCount; theGRI.TAM.linkAmmoCount = linkAmmoCount; theGRI.TAM.miniAmmoCount = miniAmmoCount; theGRI.TAM.flakAmmoCount = flakAmmoCount; theGRI.TAM.rocketAmmoCount = rocketAmmoCount; theGRI.TAM.lightningAmmoCount = lightningAmmoCount; theGRI.TAM.transAmmoCount = transAmmoCount; weaponCount = 1; if(grenadeCount > 0) weaponCount++; if(assaultAmmoCount > 0) weaponCount++; if(bioAmmoCount > 0) weaponCount++; if(shockAmmoCount > 0) weaponCount++; if(linkAmmoCount > 0) weaponCount++; if(miniAmmoCount > 0) weaponCount++; if(flakAmmoCount > 0) weaponCount++; if(rocketAmmoCount > 0) weaponCount++; if(lightningAmmoCount > 0) weaponCount++; if(transAmmoCount > 0) weaponCount++; theGRI.bCamperAlarm = bCamperAlarm; theGRI.CampThreshold = CampThreshold; theGRI.ReCamperWarnInterval = ReCamperWarnInterval; theGRI.CampDamage = CampDamage; theGRI.bDisableBrightskins = bDisableBrightskins; theGRI.bDisableHitsounds = bDisableHitsounds; theGRI.bDisableSpeed = bDisableSpeed; theGRI.bDisableBooster = bDisableBooster; theGRI.bDisableBerserk = bDisableBerserk; theGRI.bDisableInvis = bDisableInvis; theGRI.bUseAlternateScoring = bUseAlternateScoring; theGRI.bAutoRecDemos = bAutoRecDemos; theGRI.bForceRUP = bForceRUP; if(bUTComp) ADR_Kill = adrenalinePerKill; else ADR_Kill = adrenalinePerKill / 3.0; if(bImprovedShieldGun) { Class'XWeapons.ShieldFire'.Default.SelfForceScale = 1.500000; Class'XWeapons.ShieldFire'.Default.SelfDamageScale = 0.100000; Class'XWeapons.ShieldFire'.Default.MinSelfDamage = 0.000000; } if(transAmmoCount > 0 && !bAllowPickups) { Class'XWeapons.Translauncher'.Default.AmmoChargeRate = 0.000000; Class'XWeapons.Translauncher'.Default.AmmoChargeMax = transAmmoCount; Class'XWeapons.Translauncher'.Default.AmmoChargeF = transAmmoCount; Class'XWeapons.Translauncher'.Default.bShowChargingBar = false; } bTimeouts = (numTimeouts > 0); if(bTimeouts) { teamTimeouts[0] = numTimeouts; teamTimeouts[1] = numTimeouts; } theGRI.bTimeouts = bTimeouts; theGRI.bTimedOut = false; theGRI.timedOut = -1; theGRI.teamTimeouts[0] = numTimeouts; theGRI.teamTimeouts[1] = numTimeouts; GoalScore = 0; // Force no Frag Limit bForceRespawn = true; if(!bAllowPickups) bAllowWeaponThrowing = false; MaxLives = 1; Class'XGame.ComboSpeed'.Default.Duration = 30; for(m = BaseMutator; m != None; m = m.NextMutator) { if(m.IsA('MutUTComp')) { log("UTComp found.", '3SPN'); bUTComp = true; break; } } if(bUTComp) { log("Using UTComp Classes.", '3SPN'); HUDType = "xInterface.HUDCTeamDeathmatch"; ScoreBoardType = "xInterface.ScoreBoardTeamDeathMatch"; LocalStatsScreenClass = class'DMStatsScreen'; } else { log("Using 3SPN Classes.", '3SPN'); Class'xPawn'.Default.ControllerClass = class'Game_Bot_3SPN'; Class'FlakChunk'.Default.MyDamageType = class'DamType_FlakChunk_3SPN'; Class'FlakShell'.Default.MyDamageType = class'DamType_FlakShell_3SPN'; DefaultPlayerClassName="3SPNv252.Game_Pawn_3SPN"; } theGRI.bUTComp = bUTComp; saveconfig(); theGRI.saveconfig(); } // InitGame() function PostBeginPlay() { if(bAutoRecDemos && Level.NetMode == NM_DedicatedServer && !bUTComp) { if(DemoCommand == "") DemoCommand = "TAM-"$theGRI.TAM.mapname$"-"$Level.Month$"-"$Level.Day$"-"$Level.Hour$"-"$Level.Minute$"-ServerDemo"; } Super.PostBeginPlay(); } auto state PendingMatch { function Timer() { local Controller P; local bool bReady; Global.Timer(); // first check if there are enough net players, and enough time has elapsed to give people // a chance to join if ( NumPlayers == 0 ) bWaitForNetPlayers = true; if ( bWaitForNetPlayers && (Level.NetMode != NM_Standalone) ) { if ( NumPlayers >= MinNetPlayers ) ElapsedTime++; else ElapsedTime = 0; if ( (NumPlayers == MaxPlayers) || (ElapsedTime > NetWait) ) { bWaitForNetPlayers = false; CountDown = Default.CountDown; } } else if(bForceRUP && bPlayersMustBeReady) ElapsedTime++; if ( (Level.NetMode != NM_Standalone) && (bWaitForNetPlayers || (bTournament && (NumPlayers < MaxPlayers))) ) { PlayStartupMessage(); return; } // check if players are ready bReady = true; StartupStage = 1; if ( !bStartedCountDown && (bTournament || bPlayersMustBeReady || (Level.NetMode == NM_Standalone)) ) { for (P=Level.ControllerList; P!=None; P=P.NextController ) if ( P.IsA('PlayerController') && (P.PlayerReplicationInfo != None) && P.bIsPlayer && P.PlayerReplicationInfo.bWaitingPlayer && !P.PlayerReplicationInfo.bReadyToPlay ) bReady = false; } // force ready after 90-ish seconds if(!bReady && bForceRUP && bPlayersMustBeReady && (ElapsedTime > 60)) bReady = true; if ( bReady && !bReviewingJumpspots ) { bStartedCountDown = true; CountDown--; if ( CountDown <= 0 ) StartMatch(); else StartupStage = 5 - CountDown; } PlayStartupMessage(); } } // add bot to the game function bool AddBot(optional string botName) { local Bot NewBot; NewBot = SpawnBot(botName); if ( NewBot == None ) { warn("Failed to spawn bot."); return false; } // broadcast a welcome message. BroadcastLocalizedMessage(GameMessageClass, 1, NewBot.PlayerReplicationInfo); NewBot.PlayerReplicationInfo.PlayerID = CurrentID++; NumBots++; if(!bRespawning && currentRound > 0) { NewBot.PlayerReplicationInfo.bOutOfLives = true; NewBot.PlayerReplicationInfo.numLives = 0; if ( Level.NetMode == NM_Standalone ) RestartPlayer(NewBot); else NewBot.GotoState('Dead','MPStart'); } else RestartPlayer(NewBot); NewBot.bAdrenalineEnabled = bAllowAdrenaline; return true; } // AddBot() event PlayerController Login(string Portal, string Options, out string Error) { local PlayerController NewPlayer; NewPlayer = Super(UnrealMPGameInfo).Login(Portal, Options, Error); if ( bMustJoinBeforeStart && GameReplicationInfo.bMatchHasBegun ) UnrealPlayer(NewPlayer).bLatecomer = true; if ( Level.NetMode == NM_Standalone ) { if( NewPlayer.PlayerReplicationInfo.bOnlySpectator ) { // Compensate for the space left for the player if ( !bCustomBots && (bAutoNumBots || (bTeamGame && (InitialBots%2 == 1))) ) InitialBots++; } else StandalonePlayer = NewPlayer; } return NewPlayer; } // modify player logging in event PostLogin( PlayerController NewPlayer ) { Super.PostLogin(NewPlayer); NewPlayer.bAdrenalineEnabled = bAllowAdrenaline; if(Game_Player_3SPN(NewPlayer) != None) Game_Player_3SPN(NewPlayer).SetBrightskins(!bDisableBrightskins); if(bStarted) { NewPlayer.PlayerReplicationInfo.bOutofLives = true; NewPlayer.PlayerReplicationInfo.NumLives = 0; NewPlayer.GotoState('Spectating'); } if(!bAllowPickups) if(Game_Player_3SPN(NewPlayer) != None) Game_Player_3SPN(NewPlayer).KillBases(); } // PostLogin() // check for win when a player quits function Logout(Controller Exiting) { super.Logout(Exiting); CheckMaxLives(none); } // Logout() // stop spectating by joining as player function bool AllowBecomeActivePlayer(PlayerController P) { local bool b; b = true; if ( (P.PlayerReplicationInfo == None) || (NumPlayers >= MaxPlayers) || P.IsInState('GameEnded') || P.IsInState('RoundEnded') ) { P.ReceiveLocalizedMessage(GameMessageClass, 13); b = false; } if (b) { if ( (Level.NetMode == NM_Standalone) && (NumBots > InitialBots) ) { RemainingBots--; bPlayerBecameActive = true; } } return b; } // AllowBecomeActivePlayer() // leave game and join as spectator function bool BecomeSpectator(PlayerController P) { local bool b; b = true; if ( (P.PlayerReplicationInfo == None) || (NumSpectators >= MaxSpectators) || P.IsInState('GameEnded') || P.IsInState('RoundEnded') ) { P.ReceiveLocalizedMessage(GameMessageClass, 12); b = false; } if(b) { P.PlayerReplicationInfo.bOnlySpectator = true; NumSpectators++; NumPlayers--; if ( !bKillBots ) RemainingBots++; if ( !NeedPlayers() || AddBot() ) RemainingBots--; } return b; } // BecomeSpectator() // get the state of timeouts (-1 = N/A, 0 = none pending, 1 = one pending on same team, 2 = one pending on other team, 3 = timeouts disabled, 4 = out of timeouts) function int GetTimeoutState(PlayerController caller) { if(bWaitingToStartMatch) return -1; if(caller == None || caller.PlayerReplicationInfo == None) return -1; if(caller.PlayerReplicationInfo.bAdmin) // admins can always call timeouts return 0; if(caller.PlayerReplicationInfo.Team == None) return -1; if(caller.PlayerReplicationInfo.bOnlySpectator) return -1; // check if timeouts are even enabled if(!bTimeouts) return 3; if(timedOut == caller.PlayerReplicationInfo.Team.TeamIndex) return 1; if(bTimedOut || timedOut != -1) return 2; if(teamTimeouts[caller.PlayerReplicationInfo.Team.TeamIndex] <= 0) return 4; return 0; } // check if a team has timeouts left, and if so, pause the game at the end of the current round function CallTimeout(PlayerController caller) { local Controller C; local int toState; toState = GetTimeoutState(caller); if(toState == -1) return; if(caller.PlayerReplicationInfo == None || (caller.PlayerReplicationInfo.Team == None && !caller.PlayerReplicationInfo.bAdmin)) return; else if(toState == 3) { caller.ClientMessage("Timeouts are disabled on this server"); return; } else if(toState == 1) { if(bTimedOut) { caller.ClientMessage("You can not cancel a Timeout once it takes effect."); } else { EndTimeoutNow(); for(C = Level.ControllerList; C != None; C = C.NextController) { if(C != None && C.IsA('PlayerController')) { if(caller.PlayerReplicationInfo.Team.TeamIndex == 0) PlayerController(C).ClientMessage("Red Team canceled the Timeout"); else PlayerController(C).ClientMessage("Blue Team canceled the Timeout"); } } } return; } else if(toState == 2) { caller.ClientMessage("A Timeout is already pending"); return; } else if(toState == 4) { caller.ClientMessage("Your team has no Timeouts remaining"); return; } if(caller.PlayerReplicationInfo.bAdmin) { if(timeoutCount > 0) { EndTimeoutNow(); for(C = Level.ControllerList; C != None; C = C.NextController) { if(C != None && C.IsA('PlayerController')) { PlayerController(C).ClientMessage("Admin canceled the Timeout"); } } } else { timeoutCount = 30; timedOut = 3; theGRI.timedOut = timedOut; for(C = Level.ControllerList; C != None; C = C.NextController) { if(C != None && C.IsA('PlayerController')) { PlayerController(C).ClientMessage("Admin called a Timeout"); } } } } else { timeoutCount = 30; timedOut = caller.PlayerReplicationInfo.Team.TeamIndex; theGRI.timedOut = timedOut; for(C = Level.ControllerList; C != None; C = C.NextController) { if(C != None && C.IsA('PlayerController')) { if(timedOut == 0) PlayerController(C).ClientMessage("Red Team called a Timeout"); else PlayerController(C).ClientMessage("Blue Team called a Timeout"); } } } } // CallTimeout() // immediately end the timeout function EndTimeoutNow() { bTimedOut = false; timeoutCount = 0; timedOut = -1; theGRI.bTimedOut = false; theGRI.timedOut = -1; } // EndTimeoutNow() // announce the players with the most headshots, accuracy and damage function AnnounceBest(optional bool bEndOfGame) { local Controller C; local string acc; local string dam; local string hs; local Game_PRI_3SPN PRI; local Game_PRI_3SPN accuracy; local Game_PRI_3SPN damage; local Game_PRI_3SPN headshots; if(bUTComp) return; acc = "Most Accurate: "; dam = "Most Damage: "; hs = "Most Headshots: "; for(C = Level.ControllerList; C != None; C = C.NextController) { if(c == None) continue; PRI = Game_PRI_3SPN(C.PlayerReplicationInfo); if(PRI == None || PRI.bOnlySpectator) continue; PRI.CalculateHitStats(); if(accuracy == None || (accuracy.Percent < PRI.Percent)) accuracy = PRI; if(damage == None || (damage.WeaponDamage < PRI.WeaponDamage)) damage = PRI; if(headshots == None || (headshots.Headshots < PRI.Headshots)) headshots = PRI; } if(accuracy == None || damage == None || headshots == None) return; if(accuracy.Percent > 0.0) { acc = acc$accuracy.PlayerName; acc = acc$": "$accuracy.Percent$"%"; } else acc = ""; if(damage.WeaponDamage > 0) { dam = dam$damage.PlayerName; dam = dam$": "$damage.WeaponDamage; } else dam = ""; if(headshots.Headshots > 0) { hs = hs$headshots.PlayerName; hs = hs$": "$headshots.Headshots; } else hs = ""; for(C = Level.ControllerList; C != None; C = C.NextController) { if(c != None && c.IsA('Game_Player_3SPN')) { Game_Player_3SPN(c).ListBest(acc, dam, hs); } } } // AnnounceBest() /* Return the 'best' player start for this player to start from. */ function NavigationPoint FindPlayerStart( Controller Player, optional byte InTeam, optional string incomingName ) { local NavigationPoint N, BestStart; local Teleporter Tel; local float BestRating, NewRating; local byte Team; if((Player != None) && (Player.StartSpot != None)) LastPlayerStartSpot = Player.StartSpot; /*if(bUseZoneSpawning) return FindPlayerZoneStart(Player, InTeam, incomingName);*/ // always pick StartSpot at start of match if ( (Player != None) && (Player.StartSpot != None) && (Level.NetMode == NM_Standalone) && (bWaitingToStartMatch || ((Player.PlayerReplicationInfo != None) && Player.PlayerReplicationInfo.bWaitingPlayer)) ) { return Player.StartSpot; } if ( GameRulesModifiers != None ) { N = GameRulesModifiers.FindPlayerStart(Player,InTeam,incomingName); if ( N != None ) return N; } // if incoming start is specified, then just use it if( incomingName!="" ) foreach AllActors( class 'Teleporter', Tel ) if( string(Tel.Tag)~=incomingName ) return Tel; // use InTeam if player doesn't have a team yet if ( (Player != None) && (Player.PlayerReplicationInfo != None) ) { if ( Player.PlayerReplicationInfo.Team != None ) Team = Player.PlayerReplicationInfo.Team.TeamIndex; else Team = InTeam; } else Team = InTeam; for ( N=Level.NavigationPointList; N!=None; N=N.NextNavigationPoint ) { NewRating = RatePlayerStart(N,Team,Player); if ( NewRating > BestRating ) { BestRating = NewRating; BestStart = N; } } if (BestStart == None) { log("Warning - PATHS NOT DEFINED or NO PLAYERSTART with positive rating"); BestRating = -100000000; ForEach AllActors( class 'NavigationPoint', N ) { NewRating = RatePlayerStart(N,0,Player); if ( InventorySpot(N) != None ) NewRating -= 50; NewRating += 20 * FRand(); if ( NewRating > BestRating ) { BestRating = NewRating; BestStart = N; } } } LastStartSpot = BestStart; if(!bWaitingToStartMatch) bFirstSpawn = false; return BestStart; } // FindPlayerStart() // rate whether player should spawn at the chosen navigationPoint or not function float RatePlayerStart(NavigationPoint N, byte Team, Controller Player) { local NavigationPoint P; local float Score, NextDist; local Controller OtherPlayer; P = N; if ((P == None) || P.PhysicsVolume.bWaterVolume || Player == None) return -10000000; if(bFirstSpawn) return (FMax(5000000.0 * FRand(), 5) + (N.Location.Z * 5)); else Score = 1000000.0; if ((N == LastStartSpot) || (N == LastPlayerStartSpot)) Score -= 1000000.0; // the higher the navigation point, the better it is to spawn at (generally) Score += (N.Location.Z * 10); for (OtherPlayer = Level.ControllerList; OtherPlayer != None; OtherPlayer = OtherPlayer.NextController) if (OtherPlayer != None && OtherPlayer.bIsPlayer && (OtherPlayer.Pawn != None) ) { NextDist = VSize(OtherPlayer.Pawn.Location - N.Location); if ( NextDist < OtherPlayer.Pawn.CollisionRadius + OtherPlayer.Pawn.CollisionHeight ) { Score -= 1000000.0; } else { if(NextDist > 512 && OtherPlayer.GetTeamNum() == Player.GetTeamNum() && OtherPlayer != Player) Score -= (NextDist * 10); else if(OtherPlayer.GetTeamNum() != Player.GetTeamNum()) Score += (NextDist * 10); } if(FastTrace(N.Location, OtherPlayer.Pawn.Location)) { if(OtherPlayer.GetTeamNum() == Player.GetTeamNum() && OtherPlayer != Player) Score -= (VSize(OtherPlayer.Pawn.Location - N.Location) * 2); else Score += (VSize(OtherPlayer.Pawn.Location - N.Location) * 2); } } return FMax(Score, 5); } // RatePlayerStart() // start the first round function StartMatch() { Super.StartMatch(); currentCount = roundCountdown; bFirstSpawn = true; GameReplicationInfo.bMatchHasBegun = true; GameReplicationInfo.MaxLives = 0; // have to fake the GRI into thinking there is no life limit } // StartMatch() // Pre-Game functions //////////////////////////////////////// ////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// // new round functions ////////////////////////////////////// // locks all weapons, used at the start of a new round function LockWeapons() { local Controller c; if(bAllowPickups) return; bWeaponsLocked = true; for(c = Level.ControllerList; c != None; c = c.nextController) { if(c == None || c.PlayerReplicationInfo == None || c.Pawn == None) continue; if(!c.PlayerReplicationInfo.bOnlySpectator) { LockWeaponsFor(c.Pawn); } } } // LockWeapons() // locks all weapons on a specific pawn function LockWeaponsFor(Pawn p) { local Inventory inv; if(bAllowPickups) return; if(p.Controller.IsA('PlayerController')) { if(!bUTComp) { if(!p.PlayerReplicationInfo.bOnlySpectator) Game_Player_3SPN(p.Controller).LockWeapons(); } for(inv = p.Inventory; inv != None; inv = inv.Inventory) { if(inv.IsA('Weapon')) { Weapon(inv).bEndOfRound = true; Weapon(inv).ClientStopFire(0); Weapon(inv).ClientStopFire(1); } } return; } else { inv = p.Inventory; while(inv != None) { if(inv.IsA('Weapon_ShieldGun_3SPN')) Weapon_ShieldGun_3SPN(inv).Lock(); else if(inv.IsA('Weapon_AssaultRifle_3SPN')) Weapon_AssaultRifle_3SPN(inv).Lock(); else if(inv.IsA('Weapon_BioRifle_3SPN')) Weapon_BioRifle_3SPN(inv).Lock(); else if(inv.IsA('Weapon_ShockRifle_3SPN')) Weapon_ShockRifle_3SPN(inv).Lock(); else if(inv.IsA('Weapon_LinkGun_3SPN')) Weapon_LinkGun_3SPN(inv).Lock(); else if(inv.IsA('Weapon_Minigun_3SPN')) Weapon_Minigun_3SPN(inv).Lock(); else if(inv.IsA('Weapon_FlakCannon_3SPN')) Weapon_FlakCannon_3SPN(inv).Lock(); else if(inv.IsA('Weapon_RocketLauncher_3SPN')) Weapon_RocketLauncher_3SPN(inv).Lock(); else if(inv.IsA('Weapon_SniperRifle_3SPN')) Weapon_SniperRifle_3SPN(inv).Lock(); inv = inv.Inventory; } } } // LockWeaponsFor() // give ammo function GiveAmmo(Pawn p) { local Inventory inv; if(bFullAmmo) { if(p != None) { inv = p.Inventory; while(inv != None) { if(inv.IsA('Weapon')) Weapon(inv).MaxOutAmmo(); inv = inv.Inventory; } } } else { if(p != None) { inv = p.Inventory; while(inv != None) { if(inv.IsA('AssaultRifle')) { AssaultRifle(inv).AmmoCharge[0] = assaultAmmoCount; AssaultRifle(inv).AmmoCharge[1] = grenadeCount; } else if(inv.IsA('BioRifle')) BioRifle(inv).AmmoCharge[0] = bioAmmoCount; else if(inv.IsA('ShockRifle') && !inv.IsA('SuperShockRifle')) ShockRifle(inv).AmmoCharge[0] = shockAmmoCount; else if(inv.IsA('LinkGun')) LinkGun(inv).AmmoCharge[0] = linkAmmoCount; else if(inv.IsA('Minigun')) Minigun(inv).AmmoCharge[0] = miniAmmoCount; else if(inv.IsA('FlakCannon')) FlakCannon(inv).AmmoCharge[0] = flakAmmoCount; else if(inv.IsA('RocketLauncher')) RocketLauncher(inv).AmmoCharge[0] = rocketAmmoCount; else if(inv.IsA('SniperRifle')) SniperRifle(inv).AmmoCharge[0] = lightningAmmoCount; else if(inv.IsA('Translauncher')) Translauncher(inv).GiveAmmo(0, None, false); inv = inv.Inventory; } } } } // GiveAmmo() function SetupPlayer(Pawn p) { local int difference; local int roundsWon; local int health; local int armor; local float blah; if(p.PlayerReplicationInfo.Team.TeamIndex == 0) difference = Max(0, Teams[0].Score - Teams[1].Score); else difference = Max(0, Teams[1].Score - Teams[0].Score); roundsWon = p.PlayerReplicationInfo.Team.Score; if(!bChallengeMode) { p.ShieldStrength = 0; p.AddShieldStrength(startingArmor); p.Health = startingHealth; p.SuperHealthMax = startingHealth * maxHealth; } else { blah = (0.25 / roundsToWin); health = startingHealth - ((((startingHealth * blah) * difference)) + ((startingHealth * blah) * roundsWon)); armor = startingArmor - ((((startingArmor * blah) * difference)) + ((startingArmor * blah) * roundsWon)); p.ShieldStrength = 0; p.AddShieldStrength(Max(0, armor)); p.Health = Max(40, health); p.SuperHealthMax = health * maxHealth; } if(p.PlayerReplicationInfo.IsA('Game_PRI_3SPN')) { Game_PRI_3SPN(p.PlayerReplicationInfo).RoundsWon = difference; Game_PRI_3SPN(p.PlayerReplicationInfo).HP = p.Health; Game_PRI_3SPN(p.PlayerReplicationInfo).AP = p.ShieldStrength; Game_PRI_3SPN(p.PlayerReplicationInfo).startHP = p.Health; Game_PRI_3SPN(p.PlayerReplicationInfo).startAP = p.ShieldStrength; } if(bGiveAdren) { bAllowAdrenaline = true; p.Controller.AwardAdrenaline(100); } if(bUseNewBooster) { if(p.Controller.IsA('Game_Player_3SPN')) Game_Player_3SPN(p.Controller).SwitchCombos(); } if(p.Controller.IsA('Game_Player_3SPN')) { Game_Player_3SPN(p.Controller).SetupCombos(); xPawn(p).Spree = Game_Player_3SPN(p.Controller).spree; } if(bWeaponsLocked) LockWeaponsFor(p); else UnlockWeaponsFor(p); } function GiveWeapons(Pawn p) { if(p == None) return; if(p.Controller == None) return; if(p.Controller.PlayerReplicationInfo == None) return; if(p.Controller.IsA('Bot')) { /*DiscardInventory(p); p.Weapon = none; p.SelectedItem = none;*/ p.GiveWeapon("3SPNv252.Weapon_ShieldGun_3SPN"); if(assaultAmmoCount != 0) p.GiveWeapon("3SPNv252.Weapon_AssaultRifle_3SPN"); if(bioAmmoCount > 0) p.GiveWeapon("3SPNv252.Weapon_BioRifle_3SPN"); if(flakAmmoCount > 0) p.GiveWeapon("3SPNv252.Weapon_FlakCannon_3SPN"); if(linkAmmoCount > 0) p.GiveWeapon("3SPNv252.Weapon_LinkGun_3SPN"); if(miniAmmoCount > 0) p.GiveWeapon("3SPNv252.Weapon_Minigun_3SPN"); if(rocketAmmoCount > 0) p.GiveWeapon("3SPNv252.Weapon_RocketLauncher_3SPN"); if(shockAmmoCount > 0) p.GiveWeapon("3SPNv252.Weapon_ShockRifle_3SPN"); if(lightningAmmoCount > 0) p.GiveWeapon("3SPNv252.Weapon_SniperRifle_3SPN"); } else { if(assaultAmmoCount > 0 || grenadeCount > 0) p.GiveWeapon("XWeapons.AssaultRifle"); if(bioAmmoCount != 0) p.GiveWeapon("XWeapons.BioRifle"); if(flakAmmoCount != 0) p.GiveWeapon("XWeapons.FlakCannon"); if(linkAmmoCount != 0) p.GiveWeapon("XWeapons.LinkGun"); if(miniAmmoCount != 0) p.GiveWeapon("XWeapons.Minigun"); if(rocketAmmoCount != 0) p.GiveWeapon("XWeapons.RocketLauncher"); if(shockAmmoCount != 0) p.GiveWeapon("XWeapons.ShockRifle"); if(lightningAmmoCount != 0) p.GiveWeapon("XWeapons.SniperRifle"); if(transAmmoCount > 0) p.GiveWeapon("XWeapons.Translauncher"); } } // GiveWeapons() // When player spawns - give them all the shizzle function AddGameSpecificInventory(Pawn p) { if(p == None) return; if(p.Controller == None) return; if(p.Controller.PlayerReplicationInfo == None) return; Super.AddGameSpecificInventory(p); if(!bAllowPickups) { GiveWeapons(p); GiveAmmo(p); } SetupPlayer(p); } // AddGameSpecificInventory() // show the new-round countdown message function SendRoundText(int timeleft) { local Controller P; local PlayerController Player; for(P = Level.ControllerList; P != None; P = P.nextController) { if(P.IsA('PlayerController')) { Player = PlayerController(P); if(Player != None) { Player.ReceiveLocalizedMessage(class'Message_RoundTime_3SPN', timeleft); } } } } // SendRoundText() // show the 'weapons unlocked' message function PlayRoundMessage() { local Controller P; local PlayerController Player; for(P = Level.ControllerList; P != None; P = P.nextController) { Player = PlayerController(P); if(Player != None) { Player.ReceiveLocalizedMessage(class'Message_RoundStart_3SPN'); } } } // PlayRoundMessage() // reset level function ResetLevel() { local Controller c; local float Adren; for(c = Level.ControllerList; c != None; c = c.NextController) { if(c.PlayerReplicationInfo == None || !c.PlayerReplicationInfo.bOnlySpectator) { Adren = c.Adrenaline; if(c.Pawn != None) { if(xPawn(c.Pawn) != None && xPawn(c.Pawn).CurrentCombo != None) { c.Adrenaline = 0; Adren = 0; xPawn(c.Pawn).CurrentCombo.Destroy(); } if(xPawn(c.Pawn) != None) { if(Game_Player_3SPN(c) != None) { Game_Player_3SPN(c).spree = c.Pawn.GetSpree(); } } c.Pawn.Destroy(); } else if(Game_Player_3SPN(c) != None) Game_Player_3SPN(c).spree = 0; if(PlayerController(c) != None) PlayerController(C).ClientReset(); C.Reset(); if(PlayerController(c) != None) PlayerController(C).GotoState('Spectating'); // may be necessary for proper spawnage c.AwardAdrenaline(adren); } } } // ResetLevel() function RestartPlayers(bool bMoveAlive) { local Controller C; for(c = Level.ControllerList; c != None; c = c.NextController) { if(c == None || c.PlayerReplicationInfo == None) continue; /*if(c.PlayerReplicationInfo.IsA('Game_PRI_3SPN')) Game_PRI_3SPN(c.PlayerReplicationInfo).ClearStats();*/ if(c.IsA('Game_Player_3SPN')) Game_Player_3SPN(c).ResetClock(roundTime); if((c.Pawn == None) && c.IsA('PlayerController') && !c.PlayerReplicationInfo.bOnlySpectator) { c.PlayerReplicationInfo.bOutOfLives = false; c.PlayerReplicationInfo.NumLives = 1; PlayerController(c).ClientReset(); RestartPlayer(c); } if(c.IsA('Bot') && bMoveAlive) { if(c.Pawn != None) { if(xPawn(c.Pawn) != None && xPawn(c.Pawn).CurrentCombo != None) { c.Adrenaline = 0; xPawn(c.Pawn).CurrentCombo.Destroy(); } c.Pawn.Destroy(); } c.PlayerReplicationInfo.bOutOfLives = false; c.PlayerReplicationInfo.NumLives = 1; RestartPlayer(c); } } } // RestartPlayers() function StartNewRound() { bStarted = False; RemainingTime = roundTime * 60; GameReplicationInfo.RemainingTime = RemainingTime; GameReplicationInfo.NetUpdateTime = Level.TimeSeconds - 1; currentCount = roundCountdown; bFirstSpawn = true; lastOne = None; ResetLevel(); RestartPlayers(true); LockWeapons(); } // StartNewRound() // end of new-round functions /////////////////////////////// ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// // mid-round functions ////////////////////////////////////// // unlock weapons after new round countdown simulated function UnlockWeapons() { local Controller c; if(bAllowPickups) return; for(c = Level.ControllerList; c != None; c = c.nextController) { if(c != None && c.Pawn != None) { UnlockWeaponsFor(c.Pawn); } } } // UnlockWeapons() // unlock weapons for a specific pawn simulated function UnlockWeaponsFor(Pawn p) { local Inventory inv; if(bAllowPickups) return; if(p.Controller.IsA('PlayerController')) { if(!bUTComp) { if(!p.PlayerReplicationInfo.bOnlySpectator) Game_Player_3SPN(p.Controller).UnlockWeapons(); } for(inv = p.Inventory; inv != None; inv = inv.Inventory) { if(inv.IsA('Weapon')) Weapon(inv).bEndOfRound = false; } return; } else { inv = p.Inventory; while(inv != None) { if(inv.IsA('Weapon_ShieldGun_3SPN')) Weapon_ShieldGun_3SPN(inv).Unlock(); else if(inv.IsA('Weapon_AssaultRifle_3SPN')) Weapon_AssaultRifle_3SPN(inv).Unlock(); else if(inv.IsA('Weapon_BioRifle_3SPN')) Weapon_BioRifle_3SPN(inv).Unlock(); else if(inv.IsA('Weapon_ShockRifle_3SPN')) Weapon_ShockRifle_3SPN(inv).Unlock(); else if(inv.IsA('Weapon_LinkGun_3SPN')) Weapon_LinkGun_3SPN(inv).Unlock(); else if(inv.IsA('Weapon_Minigun_3SPN')) Weapon_Minigun_3SPN(inv).Unlock(); else if(inv.IsA('Weapon_FlakCannon_3SPN')) Weapon_FlakCannon_3SPN(inv).Unlock(); else if(inv.IsA('Weapon_RocketLauncher_3SPN')) Weapon_RocketLauncher_3SPN(inv).Unlock(); else if(inv.IsA('Weapon_SniperRifle_3SPN')) Weapon_SniperRifle_3SPN(inv).Unlock(); inv = inv.Inventory; } } } // UnlockWeaponsFor() // main game state State MatchInProgress { // GameInfo's already have a 1 second timer... function Timer() { local Game_Pawn_3SPN p; local vector empty; local Controller c; local Actor Reset; local Box HistoryBox; local float MaxDim; local bool bSentWarning; local int j; if(bTimedOut) { timeoutCount--; SendTimeoutCountText(timeoutCount); if(timeoutCount <= 0) EndTimeoutNow(); return; } Global.Timer(); if(!bFinalStartup) { bFinalStartup = true; } if ( NeedPlayers() && AddBot() && (RemainingBots > 0) ) RemainingBots--; if ( bIsOverTime ) { otCount++; if(otCount % int(overtimeDamageTime) == 0) { for(c = Level.ControllerList; c != None; c = c.NextController) { if(c == None || c.Pawn == None || c.PlayerReplicationInfo == None) continue; if(!c.PlayerReplicationInfo.bOnlySpectator) { c.Pawn.TakeDamage(overtimeDamage, none, empty, empty, class'DamType_Overtime_3SPN'); } } } } else if (roundTime > 0 && currentCount <= 0 && endCount <= 0) { GameReplicationInfo.bStopCountDown = false; RemainingTime--; GameReplicationInfo.RemainingTime = RemainingTime; if ( RemainingTime % 60 == 0 ) GameReplicationInfo.RemainingMinute = RemainingTime; if ( RemainingTime == 0 ) { bIsOvertime = true; for(c = Level.ControllerList; c != None; c = c.NextController) { if(PlayerController(c) != None) { PlayerController(c).PlayStatusAnnouncement('overtime', 1); } } } } else if (NumPlayers + NumBots > 1) CheckMaxLives(none); ElapsedTime++; GameReplicationInfo.ElapsedTime = ElapsedTime; if(currentCount >= -1) { if(currentCount >= 0) bRespawning = true; if(currentCount > 1) { RestartPlayers(false); LockWeapons(); } if(currentCount == 1) { bRespawning = false; foreach AllActors(class'Actor', Reset) { if(xPawn(Reset) != None) { // if the pawn has no owner (is a ghost); destroy it if(xPawn(Reset).Health > 0 && (xPawn(Reset).Controller == None || xPawn(Reset).PlayerReplicationInfo == None)) xPawn(Reset).Destroy(); } } } if(currentCount == roundCountdown) { bEndOfRound = false; // go through all the actors, destroying/resetting unnecessary things as necessary (heh) foreach AllActors(class'Actor', Reset) { if(Reset.IsA('Mover')) { // it's a mover (lift, door, etc...); reset it Mover(Reset).Reset(); } else if(Reset.IsA('xPawn')) { // if the pawn has no owner (is a ghost); destroy it if(xPawn(Reset).Health > 0 && (xPawn(Reset).Controller == None || xPawn(Reset).PlayerReplicationInfo == None)) xPawn(Reset).Destroy(); } else if(Reset.IsA('Projectile')) { // it's a loose rocket, link primary, whatever; destroy it Projectile(Reset).Destroy(); } else if(Reset.IsA('Pickup')) { if(Reset.IsA('WeaponPickup')) { // it's a weapon pickup; reset it WeaponPickup(Reset).Reset(); } else { // it's a pickup (ammo, health, etc..); reset it Pickup(Reset).Reset(); } } else if(Reset.IsA('DECO_ExplodingBarrel')) { // it's an exploding barrel; reset it DECO_ExplodingBarrel(Reset).Reset(); } } } if(!bAllowPickups && currentCount > 0) SendRoundText(currentCount); if(currentCount == 0) { if(!bAllowPickups) PlayRoundMessage(); bStarted = True; bWeaponsLocked = false; bRespawning = false; UnlockWeapons(); currentRound++; } if(currentCount == -1) { UnlockWeapons(); } currentCount--; } else if(endCount >= 0) { GameReplicationInfo.bStopCountDown = true; if(endCount == 5) { bIsOvertime = false; AnnounceBest(); } endCount--; if(endCount == 1) { if(timeoutCount > 0) { bTimedOut = true; theGRI.bTimedOut = true; if(timedOut != -1 && timedOut != 3) { teamTimeouts[timedOut] -= 1; theGRI.teamTimeouts[timedOut] -= 1; } } return; } if(endCount == 0) { StartNewRound(); } } bAllowBehindview = true; ///////////////////////////////////////////// // Do nothing else if camper alarm is off. if(!bCamperAlarm || bUTComp) return; for(c = Level.ControllerList; c != None; c = c.NextController) { if(c == None || c.PlayerReplicationInfo == None) continue; if( !c.PlayerReplicationinfo.bIsSpectator && c.PlayerReplicationInfo.bOutOfLives == false && c.Pawn != None) { p = Game_Pawn_3SPN(c.Pawn); // Always update p.LocationHistory[p.NextLocHistSlot] = p.Location; p.NextLocHistSlot++; if(p.NextLocHistSlot == 10) { p.NextLocHistSlot = 0; p.bWarmedUp = true; } // If our history is full, work out how much player is moving about (find max AABB dimension). if(p.bWarmedUp) { HistoryBox.Min.X = p.LocationHistory[0].X; HistoryBox.Min.Y = p.LocationHistory[0].Y; HistoryBox.Min.Z = p.LocationHistory[0].Z; HistoryBox.Max.X = p.LocationHistory[0].X; HistoryBox.Max.Y = p.LocationHistory[0].Y; HistoryBox.Max.Z = p.LocationHistory[0].Z; for(j = 1; j < 10; j++) { HistoryBox.Min.X = FMin( HistoryBox.Min.X , p.LocationHistory[j].X ); HistoryBox.Min.Y = FMin( HistoryBox.Min.Y , p.LocationHistory[j].Y ); HistoryBox.Min.Z = FMin( HistoryBox.Min.Z , p.LocationHistory[j].Z ); HistoryBox.Max.X = FMax( HistoryBox.Max.X , p.LocationHistory[j].X ); HistoryBox.Max.Y = FMax( HistoryBox.Max.Y , p.LocationHistory[j].Y ); HistoryBox.Max.Z = FMax( HistoryBox.Max.Z , p.LocationHistory[j].Z ); } // Find maximum dimension of box MaxDim = FMax(FMax(HistoryBox.Max.X - HistoryBox.Min.X, HistoryBox.Max.Y - HistoryBox.Min.Y), HistoryBox.Max.Z - HistoryBox.Min.Z); // Dont warn the same person every second! if(MaxDim < CampThreshold && p.ReWarnTime == 0) { if(PlayerController(c) != None) { SendCamperWarning(PlayerController(c)); p.TakeDamage(p.CampCount++ * CampDamage, none, empty, empty, class'DamType_Camping_3SPN'); } p.ReWarnTime = ReCamperWarnInterval; bSentWarning=true; } else if(p.ReWarnTime > 0) p.ReWarnTime--; } } } } // Timer() function beginstate() { local PlayerReplicationInfo PRI; ForEach DynamicActors(class'PlayerReplicationInfo',PRI) PRI.StartTime = 0; ElapsedTime = 0; RemainingTime = roundTime * 60; bWaitingToStartMatch = false; StartupStage = 5; PlayStartupMessage(); StartupStage = 6; } // beginstate() } // State MatchInProgress // Send camper message function SendCamperWarning(PlayerController Camper) { local Controller c; local PlayerController Player; for(c = Level.ControllerList; c != None; c = c.NextController) { if(c == None || !c.IsA('PlayerController')) continue; Player = PlayerController(c); // No one camps in the first 25 seconds if (Player != None) { if (Level.TimeSeconds - Player.PlayerReplicationInfo.StartTime < 25) return; if(Player == Camper) Player.ReceiveLocalizedMessage(class'LMS_Message_3SPN', 0); else Player.ReceiveLocalizedMessage(class'LMS_Message_3SPN', 1, Camper.PlayerReplicationInfo); } } } // SendCamperWarning() function Killed(Controller Killer, Controller Killed, Pawn KilledPawn, class dT) { local float apk; apk = ADR_Kill; if(Killed != None) { Killed.PlayerReplicationInfo.bOutOfLives = true; Killed.PlayerReplicationInfo.numLives = 0; } // darkhorse if(Killed == lastOne) lastOne = None; else if((NumPlayers + NumBots) >= 5 && lastOne == None) { PreCheckForDarkhorse(); } if(healthPerKill > 0 && !bUTComp) if(!Killer.PlayerReplicationInfo.bOutOfLives && Killer.Pawn != None && Killed != Killer) Killer.Pawn.GiveHealth(healthPerKill, Killer.Pawn.SuperHealthMax); if(xPawn(Killer.Pawn) != None && xPawn(Killer.Pawn).CurrentCombo != None) ADR_Kill = 0; Super.Killed(Killer, Killed, KilledPawn, dT); ADR_Kill = apk; if(Killer != None && Killed != None && Killer.PlayerReplicationInfo.Team.TeamIndex == Killed.PlayerReplicationInfo.Team.TeamIndex) CheckMaxLives(None); } // used to show 'player is out' message function NotifyKilled(Controller Killer, Controller Other, Pawn OtherPawn) { Super.NotifyKilled(Killer, Other, OtherPawn); if(Other == None) return; SendPlayerIsOutText(Other); } // NotifyKilled() function PreCheckForDarkhorse() { local Controller c; local Controller tmp[2]; local int alive[2]; for(c = Level.ControllerList; c != None; c = c.NextController) { if(c.PlayerReplicationInfo == None) continue; if(!c.PlayerReplicationInfo.bOutOfLives) { alive[c.PlayerReplicationInfo.Team.TeamIndex]++; if(alive[c.PlayerReplicationInfo.Team.TeamIndex] == 1) tmp[c.PlayerReplicationInfo.Team.TeamIndex] = c; else tmp[c.PlayerReplicationInfo.Team.TeamIndex] = None; } } if(alive[0] > 1 && alive[1] > 1) return; if(alive[0] == 1 && alive[1] >= 3) lastOne = tmp[0]; else if(alive[1] == 1 && alive[0] >= 3) lastOne = tmp[1]; } function SendTimeoutCountText(int count) { local Controller P; local PlayerController PC; for(P = Level.ControllerList; P != None; P = P.nextController) { if(P != None && P.IsA('PlayerController')) { PC = PlayerController(P); if(PC != None) { PC.ReceiveLocalizedMessage(class'Message_Timeout_3SPN', count); } } } } // SendTimeoutCountText() // shows 'player is out' message function SendPlayerIsOutText(Controller Out) { local Controller P; local PlayerController Player; if(Out == None) return; for(P = Level.ControllerList; P != None; P = P.nextController) { if(P != None && P.IsA('PlayerController')) { Player = PlayerController(P); if(Player != None && Player != PlayerController(Out)) { Player.ReceiveLocalizedMessage(class'Message_PlayerIsOut_3SPN', 0, Out.PlayerReplicationInfo); } else if(Player == PlayerController(Out)) { Player.ReceiveLocalizedMessage(class'Message_YouAreOut_3SPN'); } } } } // SendPlayerIsOutText() // check if player can spectate object function bool CanSpectate( PlayerController Viewer, bool bOnlySpectator, actor ViewTarget ) { if ((ViewTarget == None)) return false; if(bOnlySpectator) { if ( Controller(ViewTarget) != None ) { if ( Controller(ViewTarget).Pawn == None ) return false; return ((Controller(ViewTarget).PlayerReplicationInfo != None) && (ViewTarget != Viewer) && (!Controller(ViewTarget).PlayerReplicationInfo.bOutOfLives)); } return ( (Pawn(ViewTarget) != None) && Pawn(ViewTarget).IsPlayerPawn() && (!Pawn(ViewTarget).PlayerReplicationInfo.bOutOfLives) ); } else { if(bRespawning || (endCount <= 1 && bEndOfRound)) return false; if ( Controller(ViewTarget) != None ) { if ( Controller(ViewTarget).Pawn == None ) return false; if(bEndOfRound) return ((Controller(ViewTarget).PlayerReplicationInfo != None) && (ViewTarget != Viewer) && (!Controller(ViewTarget).PlayerReplicationInfo.bOutOfLives)); else return ((Controller(ViewTarget).PlayerReplicationInfo.Team.TeamIndex == Viewer.PlayerReplicationInfo.Team.TeamIndex) && (Controller(ViewTarget).PlayerReplicationInfo != None) && (ViewTarget != Viewer) && (!Controller(ViewTarget).PlayerReplicationInfo.bOutOfLives)); } return ( (Pawn(ViewTarget) != None) && Pawn(ViewTarget).IsPlayerPawn() && (!Pawn(ViewTarget).PlayerReplicationInfo.bOutOfLives) ); } } // CanSpectate() // check if all other players are out function bool CheckMaxLives(PlayerReplicationInfo Scorer) { local Controller C; local PlayerReplicationInfo Living; local bool bNoneLeft; if ((Scorer != None) && !Scorer.bOutOfLives) Living = Scorer; bNoneLeft = true; for (C = Level.ControllerList; C != None; C = C.NextController) { if (C != None && C.PlayerReplicationInfo != None && C.bIsPlayer && !C.PlayerReplicationInfo.bOutOfLives && !C.PlayerReplicationInfo.bOnlySpectator ) { if ( Living == None ) Living = C.PlayerReplicationInfo; else if ( (C.PlayerReplicationInfo != Living) && (C.PlayerReplicationInfo.Team != Living.Team) ) { bNoneLeft = false; break; } } } if ( bNoneLeft ) { if ( Living != None ) EndRound(Living); else EndRound(Scorer); return true; } return false; } // CheckMaxLives() // end of mid-round functions /////////////////////////////// ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// // end-round functions ////////////////////////////////////// // award the winner of the round function EndRound(PlayerReplicationInfo Scorer) { local Controller c; local PlayerReplicationInfo winner; local bool bFlawless; if(bEndOfRound || (!bStarted && !bAllowPickups)) return; bEndOfRound = true; for(c = Level.ControllerList; c != None; c = c.NextController) { if(c.PlayerReplicationInfo == None) continue; if(c.PlayerReplicationInfo == Scorer) break; } if(c == None) return; if(lastOne != None && lastOne.PlayerReplicationInfo != None && lastOne.PlayerReplicationInfo == Scorer) { if(lastOne.IsA('PlayerController')) { PlayerController(lastOne).ReceiveLocalizedMessage(class'Message_Darkhorse_3SPN'); UnrealPlayer(lastOne).ClientDelayedAnnouncement(class'Message_Darkhorse_3SPN'.default.DarkhorseSound, 18); } if(lastOne.PlayerReplicationInfo.IsA('Game_PRI_3SPN') && !lastOne.PlayerReplicationInfo.bOnlySpectator) Game_PRI_3SPN(lastOne.PlayerReplicationInfo).DarkhorseNum++; } else if(Scorer.Team.Score < roundsToWin && (NumPlayers + NumBots) >= 4) { bFlawless = true; for(c = Level.ControllerList; c != None; c = c.NextController) { if(c.PlayerReplicationInfo != None && c.PlayerReplicationInfo.Team != None && c.PlayerReplicationInfo.Team.TeamIndex == Scorer.Team.TeamIndex) { if(c.PlayerReplicationInfo.bOutOfLives) { bFlawless = false; break; } } } if(bFlawless) { for(c = Level.ControllerList; c != None; c = c.NextController) { if(c.PlayerReplicationInfo != None && (c.PlayerReplicationInfo.bOnlySpectator || (c.PlayerReplicationInfo.Team != None && c.PlayerReplicationInfo.Team.TeamIndex == Scorer.Team.TeamIndex))) { if(C.IsA('UnrealPlayer')) UnrealPlayer(C).ClientDelayedAnnouncementNamed('Flawless_victory', 18); if(C.PlayerReplicationInfo.IsA('Game_PRI_3SPN') && !c.PlayerReplicationInfo.bOnlySpectator) Game_PRI_3SPN(C.PlayerReplicationInfo).FlawlessNum++; } else { if(C.IsA('UnrealPlayer')) UnrealPlayer(C).ClientDelayedAnnouncementNamed('Humiliating_defeat', 18); } } } } IncrementGoalsScored(Scorer); Teams[Scorer.Team.TeamIndex].Score += 1; AnnounceScore(Scorer.Team.TeamIndex); if(Scorer.Team.Score == roundsToWin) { log("Ending Game...", '3SPN'); winner = scorer; if(winner != None) { AnnounceBest(true); EndGame(winner, "LastMan"); } } else { endCount = 5; } } // EndRound() // end of end-round functions /////////////////////////////// ///////////////////////////////////////////////////////////// Q class Message_YouAreOut_3SPN extends LocalMessage; static function string GetString( optional int SwitchNum, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { return "YOU ARE OUT!"; } static simulated function ClientReceive( PlayerController P, optional int SwitchNum, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { Super.ClientReceive(P, SwitchNum, RelatedPRI_1, RelatedPRI_2, OptionalObject); } Z class Message_TimeOut_3SPN extends LocalMessage; static function string GetString( optional int SwitchNum, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { if(SwitchNum == 0) return "TimeOut is ending..."; return "Timeout ends in... "$SwitchNum; } static simulated function ClientReceive( PlayerController P, optional int SwitchNum, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { Super.ClientReceive(P, SwitchNum, RelatedPRI_1, RelatedPRI_2, OptionalObject); } Y class Message_RoundWon_3SPN extends LocalMessage; static function string GetString( optional int SwitchNum, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { return "YOU'VE WON THE ROUND!"; } static simulated function ClientReceive( PlayerController P, optional int SwitchNum, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { Super.ClientReceive(P, SwitchNum, RelatedPRI_1, RelatedPRI_2, OptionalObject); } D class Message_RoundTime_3SPN extends LocalMessage; static function string GetString( optional int SwitchNum, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { return "Weapons Unlocked in..."$SwitchNum; } static simulated function ClientReceive( PlayerController P, optional int SwitchNum, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { P.PlayStatusAnnouncement(HudCDeathMatch(P.myHUD).CountDownName[SwitchNum - 1], 1, true); Super.ClientReceive(P, SwitchNum, RelatedPRI_1, RelatedPRI_2, OptionalObject); } | class Message_RoundStart_3SPN extends LocalMessage; static function string GetString( optional int SwitchNum, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { return "Weapons Unlocked!"; } static simulated function ClientReceive( PlayerController P, optional int SwitchNum, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { //P.QueueAnnouncement('play', 1); Super.ClientReceive(P, SwitchNum, RelatedPRI_1, RelatedPRI_2, OptionalObject); } l class Message_RoundLost_3SPN extends LocalMessage; static function string GetString( optional int SwitchNum, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { return RelatedPRI_1.PlayerName$" WON THE ROUND!"; } static simulated function ClientReceive( PlayerController P, optional int SwitchNum, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { Super.ClientReceive(P, SwitchNum, RelatedPRI_1, RelatedPRI_2, OptionalObject); } _class Message_PlayerIsOut_3SPN extends LocalMessage; static function string GetString( optional int SwitchNum, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { return RelatedPRI_1.PlayerName$" IS OUT!"; } static simulated function ClientReceive( PlayerController P, optional int SwitchNum, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { if(RelatedPRI_1.Team == None) { default.DrawColor.R = 255; default.DrawColor.G = 255; default.DrawColor.B = 255; } else if(RelatedPRI_1.Team.TeamIndex == 0) { default.DrawColor.R = 255; default.DrawColor.G = 75; default.DrawColor.B = 75; } else { default.DrawColor.R = 75; default.DrawColor.G = 128; default.DrawColor.B = 255; } Super.ClientReceive(P, SwitchNum, RelatedPRI_1, RelatedPRI_2, OptionalObject); } U class Message_Overkill_3SPN extends LocalMessage; #exec AUDIO IMPORT FILE=Sounds\Overkill.wav GROUP=Sounds var Sound OverkillSound; static function string GetString( optional int SwitchNum, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { return "Overkill!"; } static simulated function ClientReceive( PlayerController P, optional int SwitchNum, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { Super.ClientReceive(P, SwitchNum, RelatedPRI_1, RelatedPRI_2, OptionalObject); if(P.IsA('Game_Player_3SPN') && Game_Player_3SPN(P).bAnnounceOverkill) Game_Player_3SPN(P).PlayCustomRewardAnnouncement(default.OverkillSound, 1); } X class Message_GameWon_3SPN extends LocalMessage; static function string GetString( optional int SwitchNum, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { return "YOU'VE WON THE MATCH!"; } static simulated function ClientReceive( PlayerController P, optional int SwitchNum, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { Super.ClientReceive(P, SwitchNum, RelatedPRI_1, RelatedPRI_2, OptionalObject); } AS*> $?Rk class Message_GameLost_3SPN extends LocalMessage; static function string GetString( optional int SwitchNum, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { return RelatedPRI_1.PlayerName$" WON THE MATCH!"; } static simulated function ClientReceive( PlayerController P, optional int SwitchNum, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { Super.ClientReceive(P, SwitchNum, RelatedPRI_1, RelatedPRI_2, OptionalObject); } s class Message_Darkhorse_3SPN extends LocalMessage; #exec AUDIO IMPORT FILE=Sounds\Darkhorse.wav GROUP=Sounds var Sound DarkhorseSound; static function string GetString( optional int SwitchNum, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { return "Dark Horse!"; } static simulated function ClientReceive( PlayerController P, optional int SwitchNum, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { Super.ClientReceive(P, SwitchNum, RelatedPRI_1, RelatedPRI_2, OptionalObject); } Iclass Menu_WeaponsTab_3SPN extends UT2k3TabPanel; function InitComponent(GUIController MyController, GUIComponent MyOwner) { local Game_GRI_3SPN myGRI; foreach AllObjects(class'Game_GRI_3SPN', myGRI) break; Super.InitComponent(MyController, MyOwner); if(myGRI.gamename == "3SPN-LMS") { moCheckBox(Controls[12]).Checked(myGRI.AM.bImprovedShieldGun); moEditBox(Controls[1]).SetText(string(myGRI.AM.grenadeCount)); moEditBox(Controls[2]).SetText(string(myGRI.AM.assaultAmmoCount)); moEditBox(Controls[3]).SetText(string(myGRI.AM.bioAmmoCount)); moEditBox(Controls[4]).SetText(string(myGRI.AM.shockAmmoCount)); moEditBox(Controls[5]).SetText(string(myGRI.AM.linkAmmoCount)); moEditBox(Controls[6]).SetText(string(myGRI.AM.miniAmmoCount)); moEditBox(Controls[7]).SetText(string(myGRI.AM.flakAmmoCount)); moEditBox(Controls[8]).SetText(string(myGRI.AM.rocketAmmoCOunt)); moEditBox(Controls[9]).SetText(string(myGRI.AM.lightningAmmoCount)); moEditBox(Controls[11]).SetText(string(myGRI.AM.transAmmoCount)); } else if(myGRI.gamename == "3SPN-TDM") { moCheckBox(Controls[12]).Checked(myGRI.TAM.bImprovedShieldGun); moEditBox(Controls[1]).SetText(string(myGRI.TAM.grenadeCount)); moEditBox(Controls[2]).SetText(string(myGRI.TAM.assaultAmmoCount)); moEditBox(Controls[3]).SetText(string(myGRI.TAM.bioAmmoCount)); moEditBox(Controls[4]).SetText(string(myGRI.TAM.shockAmmoCount)); moEditBox(Controls[5]).SetText(string(myGRI.TAM.linkAmmoCount)); moEditBox(Controls[6]).SetText(string(myGRI.TAM.miniAmmoCount)); moEditBox(Controls[7]).SetText(string(myGRI.TAM.flakAmmoCount)); moEditBox(Controls[8]).SetText(string(myGRI.TAM.rocketAmmoCOunt)); moEditBox(Controls[9]).SetText(string(myGRI.TAM.lightningAmmoCount)); moEditBox(Controls[11]).SetText(string(myGRI.TAM.transAmmoCount)); } } function bool OnClick(GUIComponent c) { Menu_AdminMenu_3SPN(MenuOwner.MenuOwner).ChangeMap(self); return true; } ~7class Menu_TDMTab_3SPN extends UT2k3TabPanel; var string data[20]; function InitComponent(GUIController MyController, GUIComponent MyOwner) { local int i; local Game_GRI_3SPN myGRI; foreach AllObjects(class'Game_GRI_3SPN', myGRI) break; Super.InitComponent(MyController, MyOwner); data[0] = string(myGRI.TAM.startingHealth); data[1] = string(myGRI.TAM.startingArmor); data[2] = string(myGRI.TAM.bAdren); data[3] = string(myGRI.TAM.adrenalinePerKill / 3); data[4] = string(myGRI.TAM.friendlyFire); data[5] = string(myGRI.TAM.bAllowPickups); data[6] = string(myGRI.TAM.bWeaponStay); data[7] = string(myGRI.TAM.bChallengeMode); data[8] = string(myGRI.TAM.overtimeDamage); data[9] = string(myGRI.TAM.overtimeDamageTime); data[10] = string(myGRI.TAM.healthPerKill); data[11] = string(myGRI.TAM.maxHealth); data[12] = string(myGRI.TAM.bFullAmmo); data[13] = string(myGRI.TAM.bGiveAdren); data[14] = string(myGRI.TAM.bSpecsCanTalk); data[15] = string(myGRI.TAM.bPlayersMustBeReady); data[16] = string(myGRI.TAM.roundsToWin); data[17] = string(myGRI.TAM.roundTime); data[18] = myGRI.TAM.mapname; data[19] = string(myGRI.TAM.bReverseFF); moEditBox(controls[1]).SetText(data[0]); moEditBox(controls[2]).SetText(data[1]); moCheckBox(controls[3]).Checked(bool(data[2])); moEditBox(controls[4]).SetText(data[3]); moEditBox(controls[5]).SetText(data[4]); moCheckBox(controls[6]).Checked(bool(data[5])); moCheckBox(Controls[7]).Checked(bool(data[6])); moCheckBox(Controls[8]).Checked(bool(data[7])); moEditBox(Controls[9]).SetText(data[8]); moEditBox(Controls[10]).SetText(data[9]); moEditBox(Controls[11]).SetText(data[10]); moEditBox(Controls[12]).SetText(data[11]); moCheckBox(Controls[13]).Checked(bool(data[12])); moCheckBox(Controls[14]).Checked(bool(data[13])); moCheckBox(Controls[15]).Checked(bool(data[14])); moCheckBox(Controls[16]).Checked(bool(data[15])); moEditBox(Controls[17]).SetText(data[16]); moEditBox(Controls[18]).SetText(data[17]); moEditBox(controls[19]).SetText(data[18]); moCheckBox(Controls[20]).Checked(bool(data[19])); moEditBox(Controls[22]).SetText(string(myGRI.TAM.numTimeouts)); for(i = 0; i < Controls.Length; i++) OnChange(Controls[i]); } function OnChange(GUIComponent C) { switch(c) { case Controls[3]: if(!moCheckBox(Controls[3]).IsChecked()) moEditBox(Controls[4]).DisableMe(); else moEditBox(Controls[4]).EnableMe(); break; case Controls[5]: if(moEditBox(Controls[5]).GetText() == "" || float(moEditBox(Controls[5]).GetText()) <= 0.00) moCheckBox(Controls[20]).DisableMe(); else moCheckBox(Controls[20]).EnableMe(); break; case Controls[6]: if(!moCheckBox(Controls[6]).IsChecked()) moCheckBox(Controls[7]).DisableMe(); else moCheckBox(Controls[7]).EnableMe(); break; case Controls[9]: if(moEditBox(Controls[9]).GetText() == "" || int(moEditBox(Controls[9]).GetText()) <= 0) moEditBox(Controls[10]).DisableMe(); else moEditBox(Controls[10]).EnableMe(); break; } } function bool OnClick(GUIComponent c) { local int i; for(i = 0; i < 20; i++) { if(Controls[i + 1].IsA('moEditBox')) data[i] = moEditBox(Controls[i + 1]).GetText(); else if(Controls[i + 1].IsA('moCheckBox')) data[i] = string(moCheckBox(Controls[i + 1]).IsChecked()); } data[3] = string(float(data[3]) * 3); saveconfig(); Menu_AdminMenu_3SPN(MenuOwner.MenuOwner).ChangeMap(self); return true; } Y(class Menu_PlayerTab_3SPN extends UT2k3TabPanel; function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.InitComponent(MyController, MyOwner); if(PlayerOwner().IsA('Game_Player_3SPN')) { moCheckBox(Controls[1]).Checked(Game_Player_3SPN(PlayerOwner()).bDisableSpeed); moCheckBox(Controls[2]).Checked(Game_Player_3SPN(PlayerOwner()).bDisableBooster); moCheckBox(Controls[3]).Checked(Game_Player_3SPN(PlayerOwner()).bDisableBerserk); moCheckBox(Controls[4]).Checked(Game_Player_3SPN(PlayerOwner()).bDisableInvis); moCheckBox(Controls[5]).Checked(!Game_Player_3SPN(PlayerOwner()).bEnableHitSounds); moCheckBox(Controls[7]).Checked(Game_Player_3SPN(PlayerOwner()).bAutoScreenShot); moCheckBox(Controls[8]).Checked(Game_Player_3SPN(PlayerOwner()).bUseOldStatsScreen); if(PlayerOwner().Pawn != None) { moCheckBox(Controls[6]).Checked(!UnrealPawn(PlayerOwner().Pawn).bPlayOwnFootsteps); } else { moCheckBox(Controls[6]).Checked(False); } } } function OnChange(GUIComponent c) { if(c == Controls[1]) { Game_Player_3SPN(PlayerOwner()).bDisableSpeed = moCheckBox(c).IsChecked(); Game_Player_3SPN(PlayerOwner()).saveconfig(); } else if(c == Controls[2]) { Game_Player_3SPN(PlayerOwner()).bDisableBooster = moCheckBox(c).IsChecked(); Game_Player_3SPN(PlayerOwner()).saveconfig(); } else if(c == Controls[3]) { Game_Player_3SPN(PlayerOwner()).bDisableBerserk = moCheckBox(c).IsChecked(); Game_Player_3SPN(PlayerOwner()).saveconfig(); } else if(c == Controls[4]) { Game_Player_3SPN(PlayerOwner()).bDisableInvis = moCheckBox(c).IsChecked(); Game_Player_3SPN(PlayerOwner()).saveconfig(); } else if(c == Controls[5]) { Game_Player_3SPN(PlayerOwner()).bEnableHitsounds = !moCheckBox(c).IsChecked(); Game_Player_3SPN(PlayerOwner()).saveconfig(); } else if(c == Controls[6]) { if(UnrealPawn(PlayerOwner().Pawn) == None) class'UnrealPawn'.default.bPlayOwnFootsteps = !moCheckBox(c).IsChecked(); else { UnrealPawn(PlayerOwner().Pawn).bPlayOwnFootsteps = !moCheckBox(c).IsChecked(); UnrealPawn(PlayerOwner().Pawn).saveconfig(); } } else if(c == Controls[7]) { Game_Player_3SPN(PlayerOwner()).bAutoScreenShot = moCheckBox(c).IsChecked(); Game_Player_3SPN(PlayerOwner()).saveconfig(); } else if(c == Controls[8]) { Game_Player_3SPN(PlayerOwner()).bUseOldStatsScreen = moCheckBox(c).IsChecked(); Game_Player_3SPN(PlayerOwner()).saveconfig(); } } Fclass Menu_PlayerMenu_3SPN extends UT2k3GUIPage; var GUITabControl TabC; var Menu_PlayerTab_3SPN PlayerTab; var Menu_HUDTab_3SPN HudTab; var Menu_BrightskinsTab_3SPN BSTab; function InitComponent(GUIController MyController, GUIComponent MyOwner) { local Game_GRI_3SPN myGRI; foreach AllObjects(class'Game_GRI_3SPN', myGRI) break; Super.InitComponent(MyController, MyOwner); TabC = GUITabControl(Controls[2]); PlayerTab = Menu_PlayerTab_3SPN(TabC.AddTab("General", "3SPNv252.Menu_PlayerTab_3SPN", , "Misc. player options", true)); HudTab = Menu_HUDTab_3SPN(TabC.AddTab("HUD", "3SPNv252.Menu_HUDTab_3SPN", , "HUD-related player options", false)); BSTab = Menu_BrightskinsTab_3SPN(TabC.AddTab("Brightskins", "3SPNv252.Menu_BrightskinsTab_3SPN", , "Brightskins options", false)); } function InternalOnClose(optional Bool bCanceled) { if(BSTab.RedSpinnyDude != None) { BSTab.RedSpinnyDude.Destroy(); BSTab.RedSpinnyDude = None; } if(BSTab.BlueSpinnyDude != None) { BSTab.BlueSpinnyDude.Destroy(); BSTab.BlueSpinnyDude = None; } } :class Menu_MidGame_3SPN extends UT2K4PlayerLoginMenu; Fv6 GǺ  u& Ki^]3SPNv252.Menu_MidGameTab_3SPN]Game]Game Controls^]GUI2K4.UT2K4Tab_ServerMOTD]MOTD]Message of the Day^]#"GUI2K4.UT2K4Tab_MidGameRulesCombo] Server Info]('Current map rotation and game settings^]"!GUI2K4.UT2K4Tab_MidGameVoiceChat]Communication])(Manage communication with other players^]GUI2K4.UT2K4Tab_MidGameHelp]Help]Helpful hintsAS*> $?R@class Menu_MidGameTab_3SPN extends UT2K4Tab_PlayerLoginControls; function bool InternalOnPreDraw(Canvas C) { local GameReplicationInfo GRI; GRI = GetGRI(); if (GRI != None) { if (bInit) InitGRI(); if ( bTeamGame ) { if ( GRI.Teams[0] != None ) sb_Red.Caption = RedTeam@string(int(GRI.Teams[0].Score)); if ( GRI.Teams[1] != None ) sb_Blue.Caption = BlueTeam@string(int(GRI.Teams[1].Score)); if (PlayerOwner().PlayerReplicationInfo.Team != None) { if (PlayerOwner().PlayerReplicationInfo.Team.TeamIndex == 0) { sb_Red.HeaderBase = texture'Display95'; sb_Blue.HeaderBase = sb_blue.default.headerbase; } else { sb_Blue.HeaderBase = texture'Display95'; sb_Red.HeaderBase = sb_blue.default.headerbase; } } } SetButtonPositions(C); UpdatePlayerLists(); //if (!PlayerOwner().IsInState('GameEnded')) EnableComponent(b_Spec); //else // DisableComponent(b_Spec); } return false; } IHu2 JVR&- =1h- =1J- =1h- =1JUzVGBUzVGBJhhhhhh u& uclass Menu_MenuPopup_3SPN extends UT2k4GUIPage; var Game_GRI_3SPN myGRI; function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.InitComponent(MyController, MyOwner); } function InternalOnChange(GUIComponent C) { } function bool InternalOnClick(GUIComponent C) { switch(C) { case controls[1]: PlayerOwner().ClientOpenMenu("3SPNv252.Menu_PlayerMenu_3SPN"); break; case controls[2]: PlayerOwner().ClientOpenMenu("3SPNv252.Menu_AdminMenu_3SPN"); break; case controls[3]: Game_Player_3SPN(PlayerOwner()).CallTimeOut(); Controller.CloseMenu(); break; } return true; } function bool InternalDraw(Canvas C) { if(myGRI == None) foreach AllObjects(class'Game_GRI_3SPN', myGRI) break; if(myGRI == None) { GUIButton(Controls[3]).DisableMe(); return false; } // check for a condition to disable the timeout button if(myGRI.gamename != "3SPN-TDM" || (!myGRI.bTimeouts && !PlayerOwner().PlayerReplicationInfo.bAdmin) || (myGRI.timedOut != -1 && myGRI.timedOut != PlayerOwner().PlayerReplicationInfo.Team.TeamIndex) || PlayerOwner().PlayerReplicationInfo.bOnlySpectator) { GUIButton(Controls[3]).DisableMe(); } // check for a condition to change the text else if(myGRI.timedOut != -1 && (myGRI.timedOut == PlayerOwner().PlayerReplicationInfo.Team.TeamIndex || PlayerOwner().PlayerReplicationInfo.bAdmin)) { GUIButton(Controls[3]).EnableMe(); GUIButton(Controls[3]).Caption = "Cancel Timeout"; } else { GUIButton(Controls[3]).EnableMe(); if(PlayerOwner().PlayerReplicationInfo.bAdmin) GUIButton(Controls[3]).Caption = "Call Timeout (*)"; else GUIButton(Controls[3]).Caption = "Call Timeout ("$myGRI.teamTimeouts[PlayerOwner().PlayerReplicationInfo.Team.TeamIndex]$")"; } return false; } Q0class Menu_LMSTab_3SPN extends UT2k3TabPanel config; var string data[18]; function InitComponent(GUIController MyController, GUIComponent MyOwner) { local int i; local Game_GRI_3SPN myGRI; foreach AllObjects(class'Game_GRI_3SPN', myGRI) break; Super.InitComponent(MyController, MyOwner); data[0] = string(myGRI.AM.startingHealth); data[1] = string(myGRI.AM.startingArmor); data[2] = string(myGRI.AM.bAdren); data[3] = string(myGRI.AM.adrenalinePerKill / 3); data[4] = string(myGRI.AM.bAllowPickups); data[5] = string(myGRI.AM.bWeaponStay); data[6] = string(myGRI.AM.bChallengeMode); data[7] = string(myGRI.AM.overtimeDamage); data[8] = string(myGRI.AM.overtimeDamageTime); data[9] = string(myGRI.AM.healthPerKill); data[10] = string(myGRI.AM.maxHealth); data[11] = string(myGRI.AM.bFullAmmo); data[12] = string(myGRI.AM.bGiveAdren); data[13] = string(myGRI.AM.bSpecsCanTalk); data[14] = string(myGRI.AM.bPlayersMustBeReady); data[15] = string(myGRI.AM.roundsToWin); data[16] = string(myGRI.AM.roundTime); data[17] = myGRI.AM.mapname; moEditBox(controls[1]).SetText(data[0]); moEditBox(controls[2]).SetText(data[1]); moCheckBox(controls[3]).Checked(bool(data[2])); moEditBox(controls[4]).SetText(data[3]); moCheckBox(controls[5]).Checked(bool(data[4])); moCheckBox(Controls[6]).Checked(bool(data[5])); moCheckBox(Controls[7]).Checked(bool(data[6])); moEditBox(Controls[8]).SetText(data[7]); moEditBox(Controls[9]).SetText(data[8]); moEditBox(Controls[10]).SetText(data[9]); moEditBox(Controls[11]).SetText(data[10]); moCheckBox(Controls[12]).Checked(bool(data[11])); moCheckBox(Controls[13]).Checked(bool(data[12])); moCheckBox(Controls[14]).Checked(bool(data[13])); moCheckBox(Controls[15]).Checked(bool(data[14])); moEditBox(Controls[16]).SetText(data[15]); moEditBox(Controls[17]).SetText(data[16]); moEditBox(controls[18]).SetText(data[17]); for(i = 0; i < Controls.Length; i++) OnChange(Controls[i]); } function OnChange(GUIComponent C) { switch(c) { case Controls[3]: if(!moCheckBox(Controls[3]).IsChecked()) moEditBox(Controls[4]).DisableMe(); else moEditBox(Controls[4]).EnableMe(); break; case Controls[5]: if(!moCheckBox(Controls[5]).IsChecked()) moCheckBox(Controls[6]).DisableMe(); else moCheckBox(Controls[6]).EnableMe(); break; case Controls[8]: if(moEditBox(Controls[8]).GetText() == "" || int(moEditBox(Controls[8]).GetText()) <= 0) moEditBox(Controls[9]).DisableMe(); else moEditBox(Controls[9]).EnableMe(); break; } } function bool OnClick(GUIComponent c) { local int i; for(i = 0; i < 18; i++) { if(Controls[i + 1].IsA('moEditBox')) data[i] = moEditBox(Controls[i + 1]).GetText(); else if(Controls[i + 1].IsA('moCheckBox')) data[i] = string(moCheckBox(Controls[i + 1]).IsChecked()); } data[3] = string(float(data[3]) * 3); saveconfig(); Menu_AdminMenu_3SPN(MenuOwner.MenuOwner).ChangeMap(self); return true; } t"class Menu_HUDTab_3SPN extends UT2k3TabPanel; function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.InitComponent(MyController, MyOwner); if(PlayerOwner().IsA('Game_Player_3SPN')) { moCheckBox(Controls[1]).Checked(Game_Player_3SPN(PlayerOwner()).bDisableAnnouncement); moCheckBox(Controls[2]).Checked(!Game_Player_3SPN(PlayerOwner()).bShowTeamHUDScorebar); moCheckBox(Controls[3]).Checked(!Game_Player_3SPN(PlayerOwner()).bShowTeamLocation); moCheckBox(Controls[4]).Checked(!Game_Player_3SPN(PlayerOwner()).bShowEnemyBox); moCheckBox(Controls[5]).Checked(Game_Player_3SPN(PlayerOwner()).bMatchHUDToSkins); moCheckBox(Controls[6]).Checked(!Game_Player_3SPN(PlayerOwner()).bShowMyLocation); moCheckBox(Controls[7]).Checked(Game_Player_3SPN(PlayerOwner()).bSmallerInfoBoxes); } } function OnChange(GUIComponent c) { if(c == Controls[1]) { Game_Player_3SPN(PlayerOwner()).bDisableAnnouncement = moCheckBox(c).IsChecked(); Game_Player_3SPN(PlayerOwner()).saveconfig(); } else if(c == Controls[2]) { Game_Player_3SPN(PlayerOwner()).bShowTeamHUDScorebar = !moCheckBox(c).IsChecked(); Game_Player_3SPN(PlayerOwner()).saveconfig(); } else if(c == Controls[3]) { Game_Player_3SPN(PlayerOwner()).bShowTeamLocation = !moCheckBox(c).IsChecked(); Game_Player_3SPN(PlayerOwner()).saveconfig(); } else if(c == Controls[4]) { Game_Player_3SPN(PlayerOwner()).bShowEnemyBox = !moCheckBox(c).IsChecked(); Game_Player_3SPN(PlayerOwner()).saveconfig(); } else if(c == Controls[5]) { Game_Player_3SPN(PlayerOwner()).bMatchHUDToSkins = moCheckBox(c).IsChecked(); Game_Player_3SPN(PlayerOwner()).saveconfig(); } else if(c == Controls[6]) { Game_Player_3SPN(PlayerOwner()).bShowMyLocation = !moCheckBox(c).IsChecked(); Game_Player_3SPN(PlayerOwner()).saveconfig(); } else if(c == Controls[7]) { Game_Player_3SPN(PlayerOwner()).bSmallerInfoBoxes = moCheckBox(c).IsChecked(); Game_Player_3SPN(PlayerOwner()).saveconfig(); } } Mclass Menu_GeneralTab_3SPN extends UT2k3TabPanel; function InitComponent(GUIController MyController, GUIComponent MyOwner) { local Game_GRI_3SPN myGRI; foreach AllObjects(class'Game_GRI_3SPN', myGRI) break; Super.InitComponent(MyController, MyOwner); if(PlayerOwner().IsA('Game_Player_3SPN')) { moCheckBox(Controls[1]).Checked(myGRI.bDisableSpeed); moCheckBox(Controls[2]).Checked(myGRI.bDisableBooster); moCheckBox(Controls[3]).Checked(myGRI.bDisableBerserk); moCheckBox(Controls[4]).Checked(myGRI.bDisableInvis); moCheckBox(Controls[5]).Checked(myGRI.bDisableHitSounds); moCheckBox(Controls[7]).Checked(myGRI.bDisableBrightskins); moCheckBox(Controls[8]).Checked(myGRI.bCamperAlarm); moCheckBox(Controls[12]).Checked(myGRI.bAutoRecDemos); moCheckBox(Controls[13]).Checked(myGRI.bForceRUP); moEditBox(Controls[9]).SetText(string(myGRI.CampThreshold)); moEditBox(Controls[10]).SetText(string(myGRI.ReCamperWarnInterval)); moEditBox(Controls[11]).SetText(string(myGRI.CampDamage)); } } function OnChange(GUIComponent c) { } function bool OnClick(GuiComponent c) { Menu_AdminMenu_3SPN(MenuOwner.MenuOwner).ChangeMap(self); return true; } Ccclass Menu_BrightskinsTab_3SPN extends UT2k3TabPanel; var SpinnyWeap RedSpinnyDude; var SpinnyWeap BlueSpinnyDude; var vector RedSpinnyDudeOffset; var vector BlueSpinnyDudeOffset; var bool bBrightskins; function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.InitComponent(MyController, MyOwner); if(PlayerOwner().IsA('Game_Player_3SPN')) { moCheckBox(Controls[1]).Checked(!Game_Player_3SPN(PlayerOwner()).bEnableBrightskins); moCheckBox(Controls[2]).Checked(Game_Player_3SPN(PlayerOwner()).bEnemyAllyColors); GUISlider(Controls[5]).Value = Game_Player_3SPN(PlayerOwner()).RedOrEnemy.R; GUISlider(Controls[6]).Value = Game_Player_3SPN(PlayerOwner()).RedOrEnemy.G; GUISlider(Controls[7]).Value = Game_Player_3SPN(PlayerOwner()).RedOrEnemy.B; GUISlider(Controls[8]).Value = Game_Player_3SPN(PlayerOwner()).BlueOrAlly.R; GUISlider(Controls[9]).Value = Game_Player_3SPN(PlayerOwner()).BlueOrAlly.G; GUISlider(Controls[10]).Value = Game_Player_3SPN(PlayerOwner()).BlueOrAlly.B; RedSpinnyDude = PlayerOwner().spawn(Class'XInterface.SpinnyWeap'); //RedSpinnyDude.SetRotation(PlayerOwner().Rotation); RedSpinnyDude.SetDrawType(DT_Mesh); RedSpinnyDude.bPlayRandomAnims = true; RedSpinnyDude.SetDrawScale(0.25); RedSpinnyDude.SpinRate = 12000; BlueSpinnyDude = PlayerOwner().spawn(Class'XInterface.SpinnyWeap'); //BlueSpinnyDude.SetRotation(PlayerOwner().Rotation); BlueSpinnyDude.SetDrawType(DT_Mesh); BlueSpinnyDude.bPlayRandomAnims = true; BlueSpinnyDude.SetDrawScale(0.25); BlueSpinnyDude.SpinRate = 12000; OnChange(Controls[1]); OnChange(Controls[2]); } } function UpdateSpinnyDudes() { local xUtil.PlayerRecord Rec; local Mesh Gorge; local Material BodySkin, HeadSkin; local Shader RedS, BlueS; local ConstantColor RedCC, BlueCC; RedS = New(None)class'Shader'; RedCC = New(None)class'ConstantColor'; BlueS = New(None)class'Shader'; BlueCC = New(None)class'ConstantColor'; Rec = Class'xUtil'.static.FindPlayerRecord("Gorge"); Gorge = Mesh(DynamicLoadObject(Rec.MeshName, class'Mesh')); if(Gorge == None) { Log("Could not load mesh: "$Rec.MeshName$" For player: "$Rec.DefaultName); return; } BodySkin = Material(DynamicLoadObject(Rec.BodySkinName, class'Material')); if(BodySkin == None) { Log("Could not load body material: "$Rec.BodySkinName$" For player: "$Rec.DefaultName); return; } HeadSkin = Material(DynamicLoadObject(Rec.FaceSkinName, class'Material')); if(HeadSkin == None) { Log("Could not load head material: "$Rec.FaceSkinName$" For player: "$Rec.DefaultName); return; } if(bBrightskins) { RedCC.Color = Game_Player_3SPN(PlayerOwner()).RedOrEnemy; RedS.Diffuse = BodySkin; RedS.Specular = RedCC; RedSpinnyDude.LinkMesh(Gorge); RedSpinnyDude.Skins[0] = RedS; RedSpinnyDude.Skins[1] = HeadSkin; BlueCC.Color = Game_Player_3SPN(PlayerOwner()).BlueOrAlly; BlueS.Diffuse = BodySkin; BlueS.Specular = BlueCC; BlueSpinnyDude.LinkMesh(Gorge); BlueSpinnyDude.Skins[0] = BlueS; BlueSpinnyDude.Skins[1] = HeadSkin; } } function OnChange(GUIComponent c) { local int i; bBrightskins = !moCheckBox(Controls[1]).IsChecked(); switch(c) { case Controls[1]: Game_Player_3SPN(PlayerOwner()).bEnableBrightskins = !moCheckBox(c).IsChecked(); if(moCheckBox(Controls[1]).IsChecked()) { for(i = 2; i < Controls.Length; i++) Controls[i].DisableMe(); } else { for(i = 2; i < Controls.Length; i++) Controls[i].EnableMe(); } break; case Controls[2]: Game_Player_3SPN(PlayerOwner()).bEnemyAllyColors = moCheckBox(c).IsChecked(); if(moCheckBox(c).IsChecked()) { GUILabel(Controls[3]).Caption = "Enemies:"; GUILabel(Controls[4]).Caption = "Teammates:"; } else { GUILabel(Controls[3]).Caption = "Red Team:"; GUILabel(Controls[4]).Caption = "Blue Team:"; } break; case Controls[5]: Game_Player_3SPN(PlayerOwner()).RedOrEnemy.R = GUISlider(c).Value; break; case Controls[6]: Game_Player_3SPN(PlayerOwner()).RedOrEnemy.G = GUISlider(c).Value; break; case Controls[7]: Game_Player_3SPN(PlayerOwner()).RedOrEnemy.B = GUISlider(c).Value; break; case Controls[8]: Game_Player_3SPN(PlayerOwner()).BlueOrAlly.R = GUISlider(c).Value; break; case Controls[9]: Game_Player_3SPN(PlayerOwner()).BlueOrAlly.G = GUISlider(c).Value; break; case Controls[10]: Game_Player_3SPN(PlayerOwner()).BlueOrAlly.B = GUISlider(c).Value; break; } UpdateSpinnyDudes(); Game_Player_3SPN(PlayerOwner()).saveconfig(); } function bool InternalDraw(Canvas C) { local vector CamPos, X, Y, Z; local rotator CamRot; if(!bBrightskins) return false; C.GetCameraLocation(CamPos, CamRot); GetAxes(CamRot, X, Y, Z); RedSpinnyDude.SetLocation(CamPos + (RedSpinnyDudeOffset.X * X) + (RedSpinnyDudeOffset.Y * Y) + (RedSpinnyDudeOffset.Z * Z)); C.DrawActor(RedSpinnyDude, false, true, 90.0); BlueSpinnyDude.SetLocation(CamPos + (BlueSpinnyDudeOffset.X * X) + (BlueSpinnyDudeOffset.Y * Y) + (BlueSpinnyDudeOffset.Z * Z)); C.DrawActor(BlueSpinnyDude, false, true, 90.0); return false; } function bool OnClick(GUIComponent C) { Game_Player_3SPN(PlayerOwner()).RedOrEnemy.R = 80; Game_Player_3SPN(PlayerOwner()).RedOrEnemy.G = 0; Game_Player_3SPN(PlayerOwner()).RedOrEnemy.B = 0; Game_Player_3SPN(PlayerOwner()).BlueOrAlly.R = 0; Game_Player_3SPN(PlayerOwner()).BlueOrAlly.G = 25; Game_Player_3SPN(PlayerOwner()).BlueOrAlly.B = 90; Game_Player_3SPN(PlayerOwner()).bEnemyAllyColors = false; moCheckBox(Controls[2]).Checked(Game_Player_3SPN(PlayerOwner()).bEnemyAllyColors); GUISlider(Controls[5]).Value = Game_Player_3SPN(PlayerOwner()).RedOrEnemy.R; GUISlider(Controls[6]).Value = Game_Player_3SPN(PlayerOwner()).RedOrEnemy.G; GUISlider(Controls[7]).Value = Game_Player_3SPN(PlayerOwner()).RedOrEnemy.B; GUISlider(Controls[8]).Value = Game_Player_3SPN(PlayerOwner()).BlueOrAlly.R; GUISlider(Controls[9]).Value = Game_Player_3SPN(PlayerOwner()).BlueOrAlly.G; GUISlider(Controls[10]).Value = Game_Player_3SPN(PlayerOwner()).BlueOrAlly.B; OnChange(Controls[2]); UpdateSpinnyDudes(); return true; } Fclass Menu_AdminTab_3SPN extends UT2k3TabPanel; function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.InitComponent(MyController, MyOwner); moCheckBox(Controls[1]).Checked(Menu_AdminMenu_3SPN(MenuOwner.MenuOwner).bLogin); moEditBox(Controls[2]).SetText(Menu_AdminMenu_3SPN(MenuOwner.MenuOwner).adminName); moEditBox(Controls[3]).SetText(Menu_AdminMenu_3SPN(MenuOwner.MenuOwner).password); OnChange(Controls[1]); } function OnChange(GUIComponent c) { if(c == Controls[1]) { if(moCheckBox(Controls[1]).IsChecked() == true) { Controls[2].EnableMe(); Controls[3].EnableMe(); Menu_AdminMenu_3SPN(MenuOwner.MenuOwner).bLogin = true; Menu_AdminMenu_3SPN(MenuOwner.MenuOwner).adminName = moEditBox(Controls[2]).GetText(); Menu_AdminMenu_3SPN(MenuOwner.MenuOwner).password = moEditBox(Controls[3]).GetText(); } else { Controls[2].DisableMe(); Controls[3].DisableMe(); Menu_AdminMenu_3SPN(MenuOwner.MenuOwner).bLogin = false; Menu_AdminMenu_3SPN(MenuOwner.MenuOwner).adminName = ""; Menu_AdminMenu_3SPN(MenuOwner.MenuOwner).password = ""; } } else if(c == Controls[2]) { Menu_AdminMenu_3SPN(MenuOwner.MenuOwner).adminName = moEditBox(Controls[2]).GetText(); } else if(c == Controls[3]) { Menu_AdminMenu_3SPN(MenuOwner.MenuOwner).password = moEditBox(Controls[3]).GetText(); } Menu_AdminMenu_3SPN(MenuOwner.MenuOwner).ChangeMap(self); } Kwclass Menu_AdminMenu_3SPN extends UT2k3GUIPage config(User); var GUITabControl TabC; var Menu_LMSTab_3SPN LMSTab; var Menu_TDMTab_3SPN TDMTab; var Menu_WeaponsTab_3SPN WeapTab; var Menu_AdminTab_3SPN AdminTab; var Menu_GeneralTab_3SPN GeneralTab; var config bool bLogin; var config string adminName; var config string password; function InitComponent(GUIController MyController, GUIComponent MyOwner) { local Game_GRI_3SPN myGRI; foreach AllObjects(class'Game_GRI_3SPN', myGRI) break; Super.InitComponent(MyController, MyOwner); TabC = GUITabControl(Controls[2]); if(bLogin) { if(adminName != "") PlayerOwner().ConsoleCommand("adminlogin "$adminName$" "$password); else PlayerOwner().ConsoleCommand("adminlogin "$password); } LMSTab = Menu_LMSTab_3SPN(TabC.AddTab("AM", "3SPNv252.Menu_LMSTab_3SPN", , "Configure the ArenaMaster Gametype", myGRI.gamename == "3SPN-LMS")); TDMTab = Menu_TDMTab_3SPN(TabC.AddTab("TAM", "3SPNv252.Menu_TDMTab_3SPN", , "Configure the Team ArenaMaster Gametype", myGRI.gamename == "3SPN-TDM")); GeneralTab = Menu_GeneralTab_3SPN(TabC.AddTab("General", "3SPNv252.Menu_GeneralTab_3SPN", , "Options that effect all players and gametypes", false)); WeapTab = Menu_WeaponsTab_3SPN(TabC.AddTab("Weapons", "3SPNv252.Menu_WeaponsTab_3SPN", , "Configure weapons and ammo", false)); AdminTab = Menu_AdminTab_3SPN(TabC.AddTab("Admin", "3SPNv252.Menu_AdminTab_3SPN", , "Miscellaneous and admin stuff", false)); if(LMSTab == None) log("Failed to create AM tab."); if(TDMTab == None) log("Failed to create TAM tab."); if(WeapTab == None) log("Failed to create Weapons tab."); if(AdminTab == None) log("Failed to create admin tab."); if(GeneralTab == None) log("Failed to create general tab."); } function ChangeMap(GUIComponent sender) { local string s; local Game_GRI_3SPN myGRI; foreach AllObjects(class'Game_GRI_3SPN', myGRI) break; if(Menu_LMSTab_3SPN(sender) != None) { s = LMSTab.data[17]; if(s == "") s = "DM-Rankin"; s = s$"?Game=3SPNv252.LMS_Game_3SPN"; s = s$"?startingHealth="$LMSTab.data[0]; s = s$"?startingArmor="$LMSTab.data[1]; s = s$"?AllowAdrenaline="$LMSTab.data[2]; s = s$"?adrenalinePerKill="$LMSTab.data[3]; s = s$"?AllowPickups="$LMSTab.data[4]; s = s$"?WeaponStay="$LMSTab.data[5]; s = s$"?SurvivorMode="$LMSTab.data[6]; s = s$"?overtimeDamage="$LMSTab.data[7]; s = s$"?overtimeDamageTime="$LMSTab.data[8]; s = s$"?healthPerKill="$LMSTab.data[9]; s = s$"?maxHealth="$LMSTab.data[10]; s = s$"?FullAmmo="$LMSTab.data[11]; s = s$"?GiveAdren="$LMSTab.data[12]; s = s$"?SpecsCanTalk="$LMSTab.data[13]; s = s$"?PlayersMustBeReady="$LMSTab.data[14]; s = s$"?roundsToWin="$LMSTab.data[15]; s = s$"?roundTime="$LMSTab.data[16]; if(PlayerOwner().PlayerReplicationInfo.bAdmin || PlayerOwner().Level.NetMode == NM_Standalone) { log("Changing map and settings: "$s, '3SPN'); Game_Player_3SPN(PlayerOwner()).ChangeMap(s); Controller.CloseMenu(); } else if(!PlayerOwner().PlayerReplicationInfo.bAdmin) { PlayerOwner().ClientOpenMenu("3SPNv252.Menu_AdminLoginPopup_3SPN"); } } else if(Menu_TDMTab_3SPN(sender) != None) { s = TDMTab.data[18]; if(s == "") s = "DM-Rankin"; s = s$"?Game=3SPNv252.TDM_Game_3SPN"; s = s$"?startingHealth="$TDMTab.data[0]; s = s$"?startingArmor="$TDMTab.data[1]; s = s$"?AllowAdrenaline="$TDMTab.data[2]; s = s$"?adrenalinePerKill="$TDMTab.data[3]; s = s$"?friendlyfirescale="$TDMTab.data[4]; s = s$"?AllowPickups="$TDMTab.data[5]; s = s$"?WeaponStay="$TDMTab.data[6]; s = s$"?SurvivorMode="$TDMTab.data[7]; s = s$"?overtimeDamage="$TDMTab.data[8]; s = s$"?overtimeDamageTime="$TDMTab.data[9]; s = s$"?healthPerKill="$TDMTab.data[10]; s = s$"?maxHealth="$TDMTab.data[11]; s = s$"?FullAmmo="$TDMTab.data[12]; s = s$"?GiveAdren="$TDMTab.data[13]; s = s$"?SpecsCanTalk="$TDMTab.data[14]; s = s$"?PlayersMustBeReady="$TDMTab.data[15]; s = s$"?roundsToWin="$TDMTab.data[16]; s = s$"?roundTime="$TDMTab.data[17]; s = s$"?ReverseFF="$TDMTab.data[19]; s = s$"?numTimeouts="$moEditBox(TDMTab.Controls[22]).GetText(); if(PlayerOwner().PlayerReplicationInfo.bAdmin || PlayerOwner().Level.NetMode == NM_Standalone) { log("Changing map and settings: "$s, '3SPN'); Game_Player_3SPN(PlayerOwner()).ChangeMap(s); Controller.CloseMenu(); } else if(!PlayerOwner().PlayerReplicationInfo.bAdmin) { PlayerOwner().ClientOpenMenu("3SPNv252.Menu_AdminLoginPopup_3SPN"); } } else if(Menu_WeaponsTab_3SPN(sender) != None) { if(myGRI.gamename == "3SPN-LMS") s = myGRI.AM.mapname; else if(myGRI.gamename == "3SPN-TDM") s = myGRI.TAM.mapname; if(s == "") s = "DM-Rankin"; s = s$"?ImprovedShieldGun="$moCheckBox(WeapTab.Controls[12]).IsChecked(); s = s$"?grenadeCount="$moEditBox(WeapTab.Controls[1]).GetText(); s = s$"?assaultAmmoCount="$moEditBox(WeapTab.Controls[2]).GetText(); s = s$"?bioAmmoCount="$moEditBox(WeapTab.Controls[3]).GetText(); s = s$"?shockAmmoCount="$moEditBox(WeapTab.Controls[4]).GetText(); s = s$"?linkAmmoCount="$moEditBox(WeapTab.Controls[5]).GetText(); s = s$"?miniAmmoCount="$moEditBox(WeapTab.Controls[6]).GetText(); s = s$"?flakAmmoCount="$moEditBox(WeapTab.Controls[7]).GetText(); s = s$"?rocketAmmoCount="$moEditBox(WeapTab.Controls[8]).GetText(); s = s$"?lightningAmmoCount="$moEditBox(WeapTab.Controls[9]).GetText(); s = s$"?transAmmoCount="$moEditBox(WeapTab.Controls[11]).GetText(); if(PlayerOwner().PlayerReplicationInfo.bAdmin || PlayerOwner().Level.NetMode == NM_Standalone) { log("Changing map and settings: "$s, '3SPN'); Game_Player_3SPN(PlayerOwner()).ChangeMap(s); Controller.CloseMenu(); } else if(!PlayerOwner().PlayerReplicationInfo.bAdmin) { PlayerOwner().ClientOpenMenu("3SPNv252.Menu_AdminLoginPopup_3SPN"); } } else if(Menu_AdminTab_3SPN(sender) != None) { saveconfig(); } else if(Menu_GeneralTab_3SPN(sender) != None) { if(myGRI.gamename == "3SPN-LMS") s = myGRI.AM.mapname; else if(myGRI.gamename == "3SPN-TDM") s = myGRI.TAM.mapname; if(s == "") s = "DM-Rankin"; s = s$"?DisableSpeed="$moCheckBox(GeneralTab.Controls[1]).IsChecked(); s = s$"?DisableBooster="$moCheckBox(GeneralTab.Controls[2]).IsChecked(); s = s$"?DisableBerserk="$moCheckBox(GeneralTab.Controls[3]).IsChecked(); s = s$"?DisableInvis="$moCheckBox(GeneralTab.Controls[4]).IsChecked(); s = s$"?DisableHitsounds="$moCheckBox(GeneralTab.Controls[5]).IsChecked(); s = s$"?DisableBrightskins="$moCheckBox(GeneralTab.Controls[7]).IsChecked(); s = s$"?CamperAlarm="$moCheckBox(GeneralTab.Controls[8]).IsChecked(); s = s$"?CampThreshold="$moEditBox(GeneralTab.Controls[9]).GetText(); s = s$"?ReCamperWarnInterval="$moEditBox(GeneralTab.Controls[10]).GetText(); s = s$"?CampDamage="$moEditBox(GeneralTab.Controls[11]).GetText(); s = s$"?AutoRecDemos="$moCheckBox(GeneralTab.Controls[12]).IsChecked(); s = s$"?ForceRUP="$moCheckBox(GeneralTab.Controls[13]).IsChecked(); if(PlayerOwner().PlayerReplicationInfo.bAdmin || PlayerOwner().Level.NetMode == NM_Standalone) { log("Changing map and settings: "$s, '3SPN'); Game_Player_3SPN(PlayerOwner()).ChangeMap(s); Controller.CloseMenu(); } else if(!PlayerOwner().PlayerReplicationInfo.bAdmin) { PlayerOwner().ClientOpenMenu("3SPNv252.Menu_AdminLoginPopup_3SPN"); } } } w class Menu_AdminLoginPopup_3SPN extends UT2k4GUIPage; function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.InitComponent(MyController, MyOwner); moEditBox(controls[2]).SetText(""); moEditBox(controls[3]).SetText(""); } function InternalOnChange(GUIComponent C) { } function bool InternalOnClick(GUIComponent C) { local string name; local string pass; switch(C) { case controls[1]: name = moEditBox(controls[2]).GetText(); pass = moEditBox(controls[3]).GetText(); if(name == "") PlayerOwner().ConsoleCommand("adminlogin "$pass); else PlayerOwner().ConsoleCommand("adminlogin "$name$" "$pass); Controller.CloseMenu(); break; } return true; } 1class LMS_Tab_3SPN extends Tab_IADeathMatch; Sh6 TU#vo & Jclass LMS_ScoreBoard_3SPN extends ScoreBoardDeathMatch; var localized string StatsText; var plane FullOn, GrayedOut; var Texture fade; var Texture rfade; var Texture logo; var Game_GRI_3SPN myGRI; function DrawTitle(Canvas Canvas, float HeaderOffsetY, float PlayerAreaY, float PlayerBoxSizeY) { local string titlestring,scoreinfostring,RestartString; local float TitleXL,ScoreInfoXL,YL; local int y; if ( Canvas.ClipX < 512 ) return; ScoreInfoString = "www.3SPN.com"; if(myGRI != None) TitleString = myGRI.AM.roundsToWin$" rounds wins the match!"; Canvas.StrLen(TitleString, TitleXL, YL); Canvas.DrawColor.r = 65; Canvas.DrawColor.g = 35; Canvas.DrawColor.b = 125; Canvas.DrawColor.a = 255; if ( UnrealPlayer(Owner).bDisplayLoser ) TitleString = class'HUDBase'.default.YouveLostTheMatch; else if ( UnrealPlayer(Owner).bDisplayWinner ) TitleString = class'HUDBase'.default.YouveWonTheMatch; else if ( PlayerController(Owner).IsDead() ) { RestartString = GetRestartString(); if ( Canvas.ClipY - HeaderOffsetY - PlayerAreaY >= 2.5 * YL ) { Canvas.StrLen(RestartString,ScoreInfoXL,YL); Canvas.SetPos(0.5*(Canvas.ClipX-ScoreInfoXL), Canvas.ClipY - 2.5 * YL); Canvas.DrawText(RestartString,true); } else ScoreInfoString = RestartString; } y = (6 + (Canvas.ClipY * 0.0355 / 2)); Canvas.SetPos(0.5 * (Canvas.ClipX - TitleXL), y - (YL / 2)); Canvas.DrawText(TitleString, true); y = (Canvas.ClipY - 2) - (Canvas.ClipY * 0.0355 / 2); Canvas.StrLen(ScoreInfoString,ScoreInfoXL,YL); Canvas.SetPos(0.5 * (Canvas.ClipX - ScoreInfoXL), y - (YL / 2)); Canvas.DrawText(ScoreInfoString, true); Canvas.Font = PlayerController(Owner).myHUD.GetFontSizeIndex(Canvas, -5); Canvas.DrawColor.b = 64; Canvas.DrawColor.g = 49; Canvas.DrawColor.r = 33; Canvas.DrawColor.a = 255; Canvas.StrLen(myGRI.version, TitleXL, YL); Canvas.SetPos(Canvas.ClipX * 0.040, Canvas.ClipY * 0.968); Canvas.DrawText(myGRI.version, true); } simulated event UpdateScoreBoard(Canvas Canvas) { local PlayerReplicationInfo PRI, OwnerPRI; local int i, OwnerPos, NetXPos, PlayerCount,HeaderOffsetY, MessageFoot, PlayerBoxSizeY, BoxSpaceY, NameXPos, BoxTextOffsetY, OwnerOffset, ScoreXPos, DeathsXPos, BoxXPos, TitleYPos, BoxWidth; local float XL,YL; local float deathsXL, scoreXL, netXL, MaxNamePos; local PlayerReplicationInfo PRIs[MAXPLAYERS]; local string playername[MAXPLAYERS]; local bool bNameFontReduction; local plane OldColorModulate; local Texture box; local int BoxXPosOdd; local int LineXPos; local int LineYPos; local string tmp; local int WonXPos; if(myGRI == None) foreach AllObjects(class'Game_GRI_3SPN', myGRI) break; OldColorModulate = Canvas.ColorModulate; OwnerPRI = PlayerController(Owner).PlayerReplicationInfo; OwnerOffset = -1; for (i=0; i < GRI.PRIArray.Length; i++) { PRI = GRI.PRIArray[i]; if (!PRI.bOnlySpectator) { PRIs[PlayerCount] = PRI; if ( PRI == OwnerPRI ) OwnerOffset = PlayerCount; PlayerCount++; } } //PlayerBoxSizeY = FClamp((1+(Canvas.ClipY - 0.67 * MessageFoot))/PlayerCount - BoxSpaceY, PlayerBoxSizeY, MaxScaling * YL); bDisplayMessages = (PlayerCount <= (Canvas.ClipY - MessageFoot)/(PlayerBoxSizeY + BoxSpaceY)); HeaderOffsetY = 4 * YL; BoxWidth = 0.5800 * Canvas.ClipX; BoxXPos = 0.0 * (Canvas.ClipX - BoxWidth); //BoxWidth = Canvas.ClipX - 2*BoxXPos; BoxWidth = 0.95 * Canvas.ClipX; NameXPos = BoxXPos + 0.0750 * BoxWidth; ScoreXPos = BoxXPos + 0.635 * BoxWidth; WonXPos = BoxXPos + 0.500 * BoxWidth; DeathsXPos = BoxXPos + 0.770 * BoxWidth; NetXPos = BoxXPos + 0.895 * BoxWidth; BoxXPosOdd = Canvas.ClipX * 0.05; TitleYPos = Canvas.ClipY * 0.1; LineYPos = Canvas.ClipY * 0.006; if(Canvas.ClipY <= 768) LineYPos++; BoxSpaceY = Canvas.ClipY * 0.0065; PlayerBoxSizeY = Canvas.ClipY * 0.03; if(Canvas.ClipY <= 600) PlayerBoxSizeY = Canvas.ClipY * 0.0325; HeaderOffsetY = TitleYPos + BoxSpaceY + PlayerBoxSizeY; // draw background boxes Canvas.Style = ERenderstyle.STY_Alpha; Canvas.Font = PlayerController(Owner).myHUD.GetFontSizeIndex(Canvas, -2); for ( i=0; i < PlayerCount; i++ ) { Canvas.DrawColor = HUDClass.default.WhiteColor * 0.5; if(i % 2 == 1) { Box = rfade; BoxXPos = BoxXPosOdd; LineXPos = BoxXPos - 10; Canvas.DrawColor = HUDClass.default.WhiteColor * 0.35; } else { box = fade; BoxXPos = 0; LineXPos = 0; } if(i == OwnerOffset) Canvas.DrawColor = HUDClass.default.TurqColor * 0.5; Canvas.DrawColor.a = 127; Canvas.SetPos(BoxXPos, (HeaderOffsetY + (PlayerBoxSizeY + BoxSpaceY) * i)); Canvas.DrawRect(box, BoxWidth, PlayerBoxSizeY); Canvas.DrawColor = HUDClass.default.BlackColor; Canvas.SetPos(LineXPos, (HeaderOffsetY + (PlayerBoxSizeY + BoxSpaceY) * i)); Canvas.DrawRect(box, BoxWidth + 10, 1); Canvas.SetPos(LineXPos, (HeaderOffsetY + (PlayerBoxSizeY + BoxSpaceY) * i + 2)); Canvas.DrawRect(box, BoxWidth + 10, 1); Canvas.SetPos(LineXPos, (HeaderOffsetY + (PlayerBoxSizeY + BoxSpaceY) * i + PlayerBoxSizeY - 2)); Canvas.DrawRect(box, BoxWidth + 10, 1); Canvas.SetPos(LineXPos, (HeaderOffsetY + (PlayerBoxSizeY + BoxSpaceY) * i + PlayerBoxSizeY)); Canvas.DrawRect(box, BoxWidth + 10, 1); if(i == OwnerOffset) Canvas.DrawColor = HUDClass.default.TurqColor; else Canvas.DrawColor = HUDClass.default.WhiteColor; Canvas.SetPos(LineXPos, (HeaderOffsetY + (PlayerBoxSizeY + BoxSpaceY) * i) + 1); Canvas.DrawRect(box, BoxWidth + 10, 1); Canvas.SetPos(LineXPos, (HeaderOffsetY + (PlayerBoxSizeY + BoxSpaceY) * i) + PlayerBoxSizeY - 1); Canvas.DrawRect(box, BoxWidth + 10, 1); Canvas.DrawColor = HUDClass.default.WhiteColor; Canvas.SetPos(NameXPos - 6, (HeaderOffsetY + (PlayerBoxSizeY + BoxSpaceY) * i) + BoxTextOffsetY + 2); Canvas.DrawText((i + 1), true); Canvas.SetPos(LineXPos, (HeaderOffsetY + (PlayerBoxSizeY + BoxSpaceY) * i) + PlayerBoxSizeY - LineYPos); if(i % 2 == 1) Canvas.SetPos(LineXPos - 10, (HeaderOffsetY + (PlayerBoxSizeY + BoxSpaceY) * i) + PlayerBoxSizeY - LineYPos); if(i != OwnerOffset) Canvas.DrawColor = HUDClass.default.TurqColor; Canvas.DrawRect(box, BoxWidth + 20, 1); Canvas.DrawColor = HUDClass.default.BlackColor; Canvas.SetPos(LineXPos, (HeaderOffsetY + (PlayerBoxSizeY + BoxSpaceY) * i) + PlayerBoxSizeY - LineYPos + 1); if(i % 2 == 1) Canvas.SetPos(LineXPos - 5, (HeaderOffsetY + (PlayerBoxSizeY + BoxSpaceY) * i) + PlayerBoxSizeY - LineYPos + 1); Canvas.DrawRect(box, BoxWidth + 15, 1); } BoxXPos = 0; Canvas.Font = PlayerController(Owner).myHUD.GetFontSizeIndex(Canvas, -2); ///////////////////////////////////////////////// // draw title Canvas.Style = ERenderStyle.STY_Alpha; Canvas.SetPos(0, 4); Canvas.DrawColor = HUDClass.default.WhiteColor * 0.75; Canvas.DrawColor.a = 228; Canvas.DrawRect(fade, Canvas.ClipX * 0.968, Canvas.ClipY * 0.0355); Canvas.SetPos(Canvas.ClipX * 0.85, 4); Canvas.DrawColor.R = 150; Canvas.DrawColor.G = 125; Canvas.DrawColor.B = 255; Canvas.DrawColor.A = 255; Canvas.DrawRect(logo, Canvas.ClipX * 0.11, Canvas.ClipY * 0.036); Canvas.DrawColor = HUDClass.default.WhiteColor; Canvas.DrawColor.a = 255; Canvas.SetPos(0, 4); Canvas.DrawRect(fade, Canvas.ClipX * 0.98, 1); Canvas.SetPos(0, 4 + Canvas.ClipY * 0.0355); Canvas.DrawRect(fade, Canvas.ClipX * 0.98, 1); Canvas.DrawColor = HUDClass.default.BlackColor; Canvas.SetPos(0, 3); Canvas.DrawRect(fade, Canvas.ClipX * 0.98, 1); Canvas.SetPos(0, 5); Canvas.DrawRect(fade, Canvas.ClipX * 0.98, 1); Canvas.SetPos(0, 3 + Canvas.ClipY * 0.0355); Canvas.DrawRect(fade, Canvas.ClipX * 0.98, 1); Canvas.SetPos(0, 5 + Canvas.ClipY * 0.0355); Canvas.DrawRect(fade, Canvas.ClipX * 0.98, 1); Canvas.SetPos(Canvas.ClipX * 0.032, Canvas.ClipY - (Canvas.ClipY * 0.0355 + 4)); Canvas.DrawColor = HUDClass.default.WhiteColor * 0.75; Canvas.DrawColor.a = 228; Canvas.DrawRect(rfade, Canvas.ClipX - (Canvas.ClipX * 0.032), Canvas.ClipY * 0.0355); Canvas.DrawColor = HUDClass.default.BlackColor; Canvas.SetPos(Canvas.ClipX * 0.02, Canvas.ClipY - (Canvas.ClipY * 0.0355 + 5)); Canvas.DrawRect(rfade, Canvas.ClipX * 0.98, 1); Canvas.SetPos(Canvas.ClipX * 0.02, Canvas.ClipY - (Canvas.CLipY * 0.0355 + 3)); Canvas.DrawRect(rfade, Canvas.ClipX * 0.98, 1); Canvas.SetPos(Canvas.ClipX * 0.02, Canvas.ClipY - 3); Canvas.DrawRect(rfade, Canvas.ClipX * 0.98, 1); Canvas.SetPos(Canvas.ClipX * 0.02, Canvas.ClipY - 5); Canvas.DrawRect(rfade, Canvas.ClipX * 0.98, 1); Canvas.DrawColor = HUDClass.default.WhiteColor; Canvas.SetPos(Canvas.ClipX * 0.02, Canvas.ClipY - (Canvas.ClipY * 0.0355 + 4)); Canvas.DrawRect(rfade, Canvas.ClipX * 0.98, 1); Canvas.SetPos(Canvas.ClipX * 0.02, Canvas.ClipY - 4); Canvas.DrawRect(rfade, Canvas.ClipX * 0.98, 1); Canvas.Style = ERenderStyle.STY_Normal; DrawTitle(Canvas, HeaderOffsetY, (PlayerCount+1)*(PlayerBoxSizeY + BoxSpaceY), PlayerBoxSizeY); ////////////////////////////////////////////////// Canvas.Font = PlayerController(Owner).myHUD.GetFontSizeIndex(Canvas, -2); ////////////////////////////////////////////////// // Draw headers Canvas.StrLen("SCORE", ScoreXL, YL); Canvas.StrLen(StatsText, DeathsXL, YL); ////////////////////////////////////////////////// // draw header background Canvas.Style = ERenderStyle.STY_Alpha; Canvas.SetPos(BoxXPosOdd - 20, TitleYPos - 4); Canvas.DrawColor = HUDClass.default.BlackColor; Canvas.DrawColor.a = 200; Canvas.DrawRect(rfade, BoxWidth + 20, PlayerBoxSizeY); Canvas.DrawColor = HUDClass.default.WhiteColor; Canvas.SetPos(BoxXPosOdd - 30, TitleYPos - 4); Canvas.DrawRect(rfade, BoxWidth + 30, 1); Canvas.SetPos(BoxXPosOdd - 30, TitleYPos + PlayerBoxSizeY - 4); Canvas.DrawRect(rfade, BoxWidth + 30, 1); ///////////////////////////////////////////////////// // draw header text Canvas.Style = ERenderStyle.STY_Normal; Canvas.DrawColor = HUDClass.default.WhiteColor; Canvas.SetPos(NameXPos - 26, TitleYPos); Canvas.DrawText("RANK", true); NameXPos += 45; Canvas.SetPos(NameXPos, TitleYPos); Canvas.DrawText(PlayerText,true); Canvas.SetPos(ScoreXPos - 0.5 * ScoreXL, TitleYPos); Canvas.DrawText("SCORE",true); Canvas.StrLen("WINS", xl, yl); Canvas.SetPos(WonXPos - 0.5 * xl, TitleYPos); Canvas.DrawText("WINS", true); Canvas.SetPos(DeathsXPos - 0.5*DeathsXL, TitleYPos); Canvas.DrawText(StatsText,true); ///////////////////////////////////////////////////// // draw player names MaxNamePos = 0.9 * (ScoreXPos - NameXPos); for ( i=0; i MaxNamePos ) { bNameFontReduction = true; break; } } if ( !bNameFontReduction && (OwnerOffset >= PlayerCount) ) { playername[OwnerOffset] = PRIs[OwnerOffset].PlayerName; Canvas.StrLen(playername[OwnerOffset], XL, YL); if ( XL > MaxNamePos ) bNameFontReduction = true; } /*if ( bNameFontReduction ) Canvas.Font = GetSmallerFontFor(Canvas,FontReduction+1);*/ for (i=0; i < PlayerCount; i++) { playername[i] = PRIs[i].PlayerName; Canvas.StrLen(playername[i], XL, YL); if ( XL > MaxNamePos ) playername[i] = left(playername[i], MaxNamePos/XL * len(PlayerName[i])); } if ( OwnerOffset >= PlayerCount ) { playername[OwnerOffset] = PRIs[OwnerOffset].PlayerName; Canvas.StrLen(playername[OwnerOffset], XL, YL); if ( XL > MaxNamePos ) playername[OwnerOffset] = left(playername[OwnerOffset], MaxNamePos/XL * len(PlayerName[OwnerOffset])); } Canvas.Style = ERenderStyle.STY_Normal; Canvas.DrawColor = HUDClass.default.WhiteColor; Canvas.SetPos(0.5 * Canvas.ClipX, HeaderOffsetY + 4); BoxTextOffsetY = HeaderOffsetY + 0.5 * (PlayerBoxSizeY - YL); Canvas.DrawColor = HUDClass.default.WhiteColor; for ( i=0; i= PlayerCount)) { if (PRIs[i].bOutOfLives) Canvas.ColorModulate = GrayedOut; else Canvas.ColorModulate = FullOn; Canvas.SetPos(NameXPos, (PlayerBoxSizeY + BoxSpaceY)*i + BoxTextOffsetY); Canvas.DrawText(playername[i],true); } /*if ( bNameFontReduction ) Canvas.Font = GetSmallerFontFor(Canvas,FontReduction);*/ // draw scores Canvas.DrawColor = HUDClass.default.WhiteColor; for ( i=0; i= PlayerCount)) { if (PRIs[i].bOutOfLives) Canvas.ColorModulate = GrayedOut; else Canvas.ColorModulate = FullOn; Canvas.StrLen(string(int(PRIs[i].Score)), xl, yl); Canvas.SetPos(ScoreXPos - 0.5 * xl, (PlayerBoxSizeY + BoxSpaceY)*i + BoxTextOffsetY); Canvas.DrawText(int(PRIs[i].Score),true); } // draw rounds won Canvas.DrawColor = HUDClass.default.WhiteColor; for(i = 0; i < PlayerCount; i++) { if(!(OwnerOffset >= PlayerCount)) { Canvas.StrLen(Game_PRI_3SPN(PRIs[i]).RoundsWon, Xl, Yl); Canvas.SetPos(WonXPos - (xl / 2), (PlayerBoxSizeY + BoxSpaceY) * i + BoxTextOffsetY); if(PRIs[i].bOutOfLives) Canvas.ColorModulate = GrayedOut; else Canvas.ColorModulate = FullOn; Canvas.DrawText(Game_PRI_3SPN(PRIs[i]).RoundsWon); } } // draw deaths Canvas.DrawColor = HUDClass.default.WhiteColor; for ( i=0; i= PlayerCount)) { if (PRIs[i].bOutOfLives) { Canvas.DrawColor = HUDClass.default.RedColor; Canvas.ColorModulate = GrayedOut; Canvas.StrLen("DEAD",Xl,Yl); Canvas.SetPos(DeathsXPos - (XL / 2), (PlayerBoxSizeY + BoxSpaceY)*i + BoxTextOffsetY); Canvas.DrawText("DEAD",true); Canvas.DrawColor = HUDClass.default.WhiteColor; } else { Canvas.DrawColor = HUDClass.default.GreenColor; Canvas.ColorModulate = FullOn; Canvas.StrLen("ALIVE",Xl,Yl); Canvas.SetPos(DeathsXPos - (XL / 2), (PlayerBoxSizeY + BoxSpaceY)*i + BoxTextOffsetY); Canvas.DrawText("ALIVE", true); Canvas.DrawColor = HUDClass.default.WhiteColor; } } Canvas.ColorModulate = FullOn; Canvas.SetPos(NameXPos, OwnerPos); if ( Level.NetMode == NM_Standalone ) return; Canvas.StrLen("PING", NetXL, YL); Canvas.DrawColor = HUDClass.default.WhiteColor; Canvas.SetPos(NetXPos - 0.5 * NetXL, TitleYPos); Canvas.DrawText("PING", true); Canvas.DrawColor = HUDClass.default.CyanColor; if(GRI.bMatchHasBegun) { for(i = 0; i < PlayerCount; i++) { if(PRIs[i].bAdmin) tmp = AdminText; else tmp = string(Min(999, 4 * PRIs[i].Ping)); Canvas.StrLen(tmp, xl, yl); Canvas.SetPos(NetXPos - (xl / 2), (PlayerBoxSizeY + BoxSpaceY) * i + BoxTextOffsetY); Canvas.DrawText(tmp, true); } } else { for(i = 0; i < PlayerCount; i++) { if(PRIs[i].bReadyToPlay) tmp = ReadyText; else tmp = NotReadyText; Canvas.StrLen(tmp, xl, yl); Canvas.SetPos(NetXPos - (xl / 2), (PlayerBoxSizeY + BoxSpaceY) * i + BoxTextOffsetY); Canvas.DrawText(tmp, true); } } } simulated function bool InOrder( PlayerReplicationInfo P1, PlayerReplicationInfo P2 ) { if( P1.bOnlySpectator ) { if( P2.bOnlySpectator ) return true; else return false; } else if ( P2.bOnlySpectator ) return true; if (Game_PRI_3SPN(P1).RoundsWon > Game_PRI_3SPN(P2).RoundsWon) return true; else if (Game_PRI_3SPN(P1).RoundsWon == Game_PRI_3SPN(P2).RoundsWon) { if(P1.Score > P2.Score) return true; else if(P1.Score == P2.Score) { if(P1.bOutOfLives && P2.bOutOfLives) { return true; } else if(P1.bOutOfLives) return false; else if(P2.bOutOfLives) return true; else { return true; } } else return false; } return false; } U~f2eVY^TʆzVGBzVGBzVGBLLLLzVGBzVGBzVGBzVGBzVGBzVGBzVGBzVGBҽU- =1- =1zVGBҽҽҽҽҽҽҽҽҽҽҽҽҽҽUu)ҽu)ҽu)ҽu)ҽҽҽҽu)ҽҽҽҽҽҽҽҽҽu)ҽu)ҽҽҽҽҽu)ҽҽҽҽҽu)ҽҽu)ҽҽҽҽUu)ҽҽҽu)ҽҽҽҽҽҽҽҽҽҽҽҽҽҽu)ҽҽҽҽҽҽҽҽҽu)ҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽu)ҽҽҽҽҽҽu)ҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽu)ҽҽҽҽҽҽҽҽҽҽҽҽҽUu)ҽҽҽҽҽu)ҽҽҽu)ҽҽҽҽҽҽu)ҽҽҽҽҽҽҽҽҽҽҽzVGBҽzVGBҽzVGBҽzVGBҽҽҽu)ҽҽҽu)zVGBҽҽҽҽҽu)zVGBҽҽҽzVGBҽҽzVGBҽu)ҽLҽzVGBҽҽҽLҽu)zVGBҽu)ҽҽҽҽҽu)ҽu)ҽҽҽҽҽu)ҽҽ3}ҽҽu)ҽҽҽu)- =1zVGBzVGBҽҽҽzVGBҽҽҽҽ( DynamicLoadObject( "3SPNv252.Combo_Booster_3SPN", class'Class' ) ); xpl.MinAdrenalineCost = FMin( xpl.MinAdrenalineCost, xpl.ComboList[c].Default.AdrenalineCost ); break; } } Super.ModifyPlayer( Other ); } function bool CheckReplacement(Actor Other, out byte bSuperRelevant) { local int c; local LMS_Game_3SPN LMSGame; bSuperRelevant = 0; if( Bot( Other ) != None ) { for( c = 0; c < ArrayCount( Bot( Other ).ComboNames ); c++ ) { if( Bot( Other ).ComboNames[c] ~= "xGame.ComboDefensive" ) { Bot( Other ).ComboNames[c] = "3SPNv252.Combo_Booster_3SPN"; break; } } } LMSGame = LMS_Game_3SPN(Level.Game); if(LMSGame == None) { Log("Error fetching LMSGame."); return true; } if(!LMS_Game_3SPN(Level.Game).bUTComp) { if(Other.IsA('AssaultRifle')) { AssaultRifle(Other).FireModeClass[0] = Class'WeaponFire_Assault_3SPN'; AssaultRifle(Other).FireModeClass[1] = Class'WeaponFire_AssaultAlt_3SPN'; } else if(Other.IsA('BioRifle')) { BioRifle(Other).FireModeClass[0] = Class'WeaponFire_Bio_3SPN'; BioRifle(Other).FireModeClass[1] = Class'WeaponFire_BioAlt_3SPN'; } else if(Other.IsA('ShockRifle')) { ShockRifle(Other).FireModeClass[0] = Class'WeaponFire_Shock_3SPN'; ShockRifle(Other).FireModeClass[1] = Class'WeaponFire_ShockAlt_3SPN'; } else if(Other.IsA('LinkGun')) { LinkGun(Other).FireModeClass[0] = Class'WeaponFire_Link_3SPN'; LinkGun(Other).FireModeClass[1] = Class'WeaponFire_LinkAlt_3SPN'; } else if(Other.IsA('Minigun')) { MiniGun(Other).FireModeClass[0] = Class'WeaponFire_Mini_3SPN'; MiniGun(Other).FireModeClass[1] = Class'WeaponFire_MiniAlt_3SPN'; } else if(Other.IsA('FlakCannon')) { FlakCannon(Other).FireModeClass[0] = Class'WeaponFire_Flak_3SPN'; FlakCannon(Other).FireModeClass[1] = Class'WeaponFire_FlakAlt_3SPN'; } else if(Other.IsA('RocketLauncher')) { RocketLauncher(Other).FireModeClass[0] = Class'WeaponFire_Rocket_3SPN'; RocketLauncher(Other).FireModeClass[1] = Class'WeaponFire_RocketAlt_3SPN'; } else if(Other.IsA('SniperRifle')) { SniperRifle(Other).FireModeClass[0] = Class'WeaponFire_Lightning_3SPN'; } } if(LMSGame.bAllowPickups) { if (Other.IsA('AdrenalinePickup') && !LMSGame.bAllowAdrenaline) return false; return true; } if(Other.IsA('Pickup')) return false; if(Other.IsA('xPickupBase')) Other.bHidden = true; return true; } Wtd6+3}CJ˅,e ? !# "Hclass LMS_Message_3SPN extends LocalMessage; var localized string YouAreCamperMessage; var localized string SomeoneIsCamperMessage; var localized string SomeoneIsCamperMessageTrailer; static function string GetString( optional int SwitchNum, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { switch(SwitchNum) { case 0: // You are a camper return Default.YouAreCamperMessage; case 1: // Someone is a camper if (RelatedPRI_1 == None) return ""; return Default.SomeoneIsCamperMessage@RelatedPRI_1.PlayerName@Default.SomeoneIsCamperMessageTrailer@"("$RelatedPRI_1.GetLocationName()$")"; } } static simulated function ClientReceive( PlayerController P, optional int SwitchNum, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { Super.ClientReceive(P, SwitchNum, RelatedPRI_1, RelatedPRI_2, OptionalObject); } Bclass LMS_MapList_3SPN extends MapListDeathMatch config; Zb6[,TyW% & !# "{class LMS_Hud_3SPN extends HudCDeathMatch; var localized string LivesRemainingString; var localized string PlayersRemainString; var Texture fade; var Texture rfade; #EXEC OBJ LOAD FILE=LastManStanding.utx simulated function DrawChargeBar(Canvas C) { if(PawnOwner.Weapon.IsA('Translauncher')) return; Super.DrawChargeBar(C); } function CheckCountdown(GameReplicationInfo GRI) { if ( (GRI == None) || (GRI.RemainingTime == 0) || (GRI.RemainingTime == OldRemainingTime) || (GRI.Winner != None) ) return; OldRemainingTime = GRI.RemainingTime; if ( OldRemainingTime > 300 ) return; if(GRI.TimeLimit > 1) { if ( OldRemainingTime == 60 ) PlayerOwner.PlayStatusAnnouncement(LongCountName[3],1,true); } if ( OldRemainingTime == 30 ) PlayerOwner.PlayStatusAnnouncement(LongCountName[4],1,true); else if ( OldRemainingTime == 20 ) PlayerOwner.PlayStatusAnnouncement(LongCountName[5],1,true); else if ( (OldRemainingTime <= 5) && (OldRemainingTime > 0) ) PlayerOwner.PlayStatusAnnouncement(CountDownName[OldRemainingTime - 1],1,true); } simulated function DrawTimer(Canvas C) { local GameReplicationInfo GRI; local int Minutes, Hours, Seconds; GRI = PlayerOwner.GameReplicationInfo; if ( GRI.TimeLimit != 0 ) Seconds = GRI.RemainingTime; else Seconds = GRI.ElapsedTime; TimerBackground.Tints[TeamIndex] = HudColorBlack; TimerBackground.Tints[TeamIndex].A = 150; DrawSpriteWidget( C, TimerBackground); DrawSpriteWidget( C, TimerBackgroundDisc); DrawSpriteWidget( C, TimerIcon); TimerMinutes.OffsetX = default.TimerMinutes.OffsetX - 80; TimerSeconds.OffsetX = default.TimerSeconds.OffsetX - 80; TimerDigitSpacer[0].OffsetX = Default.TimerDigitSpacer[0].OffsetX; TimerDigitSpacer[1].OffsetX = Default.TimerDigitSpacer[1].OffsetX; if( Seconds > 3600 ) { Hours = Seconds / 3600; Seconds -= Hours * 3600; DrawNumericWidget( C, TimerHours, DigitsBig); TimerHours.Value = Hours; if(Hours>9) { TimerMinutes.OffsetX = default.TimerMinutes.OffsetX; TimerSeconds.OffsetX = default.TimerSeconds.OffsetX; } else { TimerMinutes.OffsetX = default.TimerMinutes.OffsetX -40; TimerSeconds.OffsetX = default.TimerSeconds.OffsetX -40; TimerDigitSpacer[0].OffsetX = Default.TimerDigitSpacer[0].OffsetX - 32; TimerDigitSpacer[1].OffsetX = Default.TimerDigitSpacer[1].OffsetX - 32; } DrawSpriteWidget( C, TimerDigitSpacer[0]); } DrawSpriteWidget( C, TimerDigitSpacer[1]); Minutes = Seconds / 60; Seconds -= Minutes * 60; TimerMinutes.Value = Min(Minutes, 60); TimerSeconds.Value = Min(Seconds, 60); DrawNumericWidget( C, TimerMinutes, DigitsBig); DrawNumericWidget( C, TimerSeconds, DigitsBig); } simulated function DrawSpectatingHud (Canvas C) { local string InfoString; local plane OldModulate; local float xl,yl,Full, Height, Top, TextTop, MedH, SmallH,Scale; local int i,cnt; local GameReplicationInfo GRI; if (!PlayerOwner.PlayerReplicationInfo.bOutOfLives) { Super.DrawSpectatingHud(C); return; } DisplayLocalMessages (C); OldModulate = C.ColorModulate; C.Font = GetMediumFontFor(C); C.StrLen("W",xl,MedH); Height = MedH; C.Font = GetConsoleFont(C); C.StrLen("W",xl,SmallH); Height += SmallH; Full = Height; Top = C.ClipY-8-Full; Scale = (Full+16)/128; // I like Yellow C.ColorModulate.X=255; C.ColorModulate.Y=200; C.ColorModulate.Z=0; C.ColorModulate.W=255; // Draw Border C.SetPos(0,Top); C.SetDrawColor(255,255,255,255); C.DrawTileStretched(material'InterfaceContent.SquareBoxA',C.ClipX,Full); C.ColorModulate.Z=255; TextTop = Top + 4; GRI = PlayerOwner.GameReplicationInfo; C.SetPos(0,Top-8); C.Style=5; C.DrawTile(material'LMSLogoSmall',256*Scale,128*Scale,0,0,256,128); C.Style=1; if ( Pawn(PlayerOwner.ViewTarget) != None && Pawn(PlayerOwner.ViewTarget).PlayerReplicationInfo != None ) { // Draw View Target info C.SetDrawColor(32,255,32,255); if ( C.ClipX < 640 ) SmallH = 0; else { C.SetPos((256*Scale*0.75),TextTop); C.DrawText(NowViewing,false); C.StrLen(LivesRemainingString,Xl,Yl); C.SetPos(C.ClipX-5-XL,TextTop); C.DrawText(LivesRemainingString); } C.SetDrawColor(255,255,0,255); C.Font = GetMediumFontFor(C); C.SetPos((256*Scale*0.75),TextTop+SmallH); C.DrawText(Pawn(PlayerOwner.ViewTarget).PlayerReplicationInfo.PlayerName,false); InfoString = ""$Game_PRI_3SPN(Pawn(PlayerOwner.ViewTarget).PlayerReplicationInfo).RoundsWon; C.StrLen(InfoString,xl,yl); C.SetPos(C.ClipX-5-XL,TextTop+SmallH); C.DrawText(InfoString,false); } else { C.SetDrawColor(255,255,255,255); C.Font = GetMediumFontFor(C); C.StrLen(InitialViewingString,XL,YL); C.SetPos( (C.ClipX/2) - (XL/2), Top + (Full/2) - (YL/2)); C.DrawText(InitialViewingString,false); } C.Font = GetConsoleFont(C); C.StrLen(GRI.GameName,XL,YL); C.SetPos( (C.ClipX/2) - (XL/2), 10); C.SetDrawColor(255,255,255,255); C.ColorModulate.Z = 255; C.DrawText(GRI.GameName); Cnt=0; for (i=0;i high) { secondhigh = high; high = Game_PRI_3SPN(PlayerOwner.GameReplicationInfo.PRIArray[i]).RoundsWon; } else if(Game_PRI_3SPN(PlayerOwner.GameReplicationInfo.PRIArray[i]).RoundsWon > secondhigh) { secondhigh = Game_PRI_3SPN(PlayerOwner.GameReplicationInfo.PRIArray[i]).RoundsWon; } if(Game_PRI_3SPN(PlayerOwner.GameReplicationInfo.PRIArray[i]).RoundsWon > Game_PRI_3SPN(PawnOwnerPRI).RoundsWon) { MyRank.Value++; } else if(Game_PRI_3SPN(PlayerOwner.GameReplicationInfo.PRIArray[i]).RoundsWon == myroundswon) { if(PlayerOwner.GameReplicationInfo.PRIArray[i].Score > mykills) MyRank.Value++; else if(PlayerOwner.GameReplicationInfo.PRIArray[i].Score == mykills) { if(Game_PRI_3SPN(PlayerOwner.GameReplicationInfo.PRIArray[i]).DeathTime > mydeathtime) MyRank.Value++; } } if(!PlayerOwner.GameReplicationInfo.PRIArray[i].bOutOfLives) { playersAlive++; } } if(Game_PRI_3SPN(PawnOwnerPRI).RoundsWon == high) MySpread.Value = Game_PRI_3SPN(PawnOwnerPRI).RoundsWon - secondhigh; else MySpread.Value = Game_PRI_3SPN(PawnOwnerPRI).RoundsWon - high; if(!Game_Player_3SPN(PlayerOwner).bShowHUDScorebar) return; if(C.ClipX <= 800) { C.Font = static.LoadFontStatic(8); C.SetDrawColor(0, 0, 20, 160); C.SetPos(C.ClipX * 0.25, 8); C.DrawRect(fade, C.ClipX / 4, 16); C.SetPos(C.ClipX * 0.50, 8); C.DrawRect(rfade, C.ClipX / 4, 16); drawy = 12; } else { C.Font = static.LoadFontStatic(6); C.SetDrawColor(0, 0, 20, 160); C.SetPos(C.ClipX * 0.25, 12); C.DrawRect(fade, C.ClipX / 4, 32); C.SetPos(C.ClipX * 0.50, 12); C.DrawRect(rfade, C.ClipX / 4, 32); drawy = 18; } C.SetDrawColor(255, 255, 255, 255); C.SetPos(C.ClipX * 0.30, drawy); C.DrawText("Rank: "$MyRank.Value, true); C.SetDrawColor(255, 255, 255, 255); C.SetPos(C.ClipX * 0.40, drawy); C.DrawText("Spread: "$MySpread.Value, true); C.SetDrawColor(255, 255, 255, 255); C.SetPos(C.ClipX * 0.52, drawy); C.DrawText("Wins: "$MyScore.Value, true); C.SetDrawColor(255, 255, 255, 255); C.SetPos(C.ClipX * 0.625, drawy); C.DrawText("Alive: "$playersAlive, true); if(Game_Player_3SPN(PlayerOwner).bShowEnemyBox) ShowEnemies(C); } simulated function ShowEnemies(Canvas C) { local int i; local int drawy; local int textx; local int namey; local int boxwidth; local int yjump; local float xl; local float yl; local float MaxNamePos; local Color BG; local Color LC; local string name; local int fontMedium; local float scale; local Game_PRI_3SPN Foes[32]; local Game_PRI_3SPN PRI; local int enemies; local Color RoE; local Color BoA; RoE = Game_Player_3SPN(PlayerOwner).RedOrEnemy * 2; BoA = Game_Player_3SPN(PlayerOwner).BlueOrAlly * 2; RoE.A = HudColorRed.A; BoA.A = HudColorBlue.A; // matching hud to brightskins section if(Game_Player_3SPN(PlayerOwner).bMatchHUDToSkins) { HudColorRed = BoA; HudColorBlue = BoA; } else { HudColorRed = Default.HudColorRed; HudColorBlue = Default.HudColorBlue; } // end of matching hud to brightskins section if(Game_Player_3SPN(PlayerOwner).bSmallerInfoBoxes) Scale = 0.60; else Scale = 1.0; for(i = 0; i < PlayerOwner.GameReplicationInfo.PRIArray.Length; i++) { PRI = Game_PRI_3SPN(PlayerOwner.GameReplicationInfo.PRIArray[i]); if(PRI != None && !PRI.bOnlySpectator && PRI != PlayerOwner.PlayerReplicationInfo) if(!PRI.bOutOfLives) Foes[enemies++] = PRI; } if(enemies == 0) return; fontMedium = -3 - ((1.0 - scale) * 3); drawy = 0.070 * C.ClipY; textx = 2 * scale; boxwidth = 0.140 * C.ClipX * scale; yjump = 0.0250 * C.ClipY * scale; namey = 2 * scale; if(Game_Player_3SPN(PlayerOwner).bMatchHUDToSkins) { BG = RoE; BG.A = 35; LC = RoE * 2.55; LC.A = 200; } else { BG.r = 0; BG.g = 100; BG.b = 30; BG.a = 30; LC.r = 0; LC.g = 255; LC.b = 60; LC.a = 200; } C.DrawColor = WhiteColor; C.DrawColor.a = 255; C.SetPos(C.ClipX - boxwidth, drawy); C.DrawRect(fade, boxwidth, 2 * scale); C.DrawColor = BG; C.SetPos(C.ClipX - boxwidth, drawy); C.DrawRect(fade, boxwidth, yjump * enemies); C.Font = GetFontSizeIndex(C, fontMedium); for(i = 0; i < enemies; i++) { name = Foes[i].Playername; C.DrawColor = WhiteColor; // name MaxNamePos = 0.99 * (boxwidth - textx); C.StrLen(name, XL, YL); if(XL > MaxNamePos) { MaxNamePos = 0.80 * (boxwidth - textx); name = left(name, MaxNamePos / XL * len(name))$"..."; } C.StrLen(name, XL, YL); C.SetPos(C.ClipX - XL - textx, drawy + (i * yjump) + namey); C.DrawText(name, true); // draw line C.DrawColor = LC; C.SetPos(C.ClipX - boxwidth, drawy + ((i + 1) * yjump)); if((i + 1) != enemies) C.DrawRect(fade, boxwidth, 1); } C.DrawColor = WhiteColor; C.DrawColor.a = 255; C.SetPos(C.ClipX - boxwidth, drawy + (i * yjump)); C.DrawRect(fade, boxwidth, 2 * scale); } ]Reverse friendly fire.WJ]RPIf checked, when a player shoots a teammate, they take the friendly fire damage$ #>$ ?$>* \pa>Y^Md7rt0!t0!t0!t0!U- =1U- =1LULҽҽҽt0!ҽҽҽҽҽҽҽҽҽҽLҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽY!LzVGBLU- =1U- =1U- =1zVGBU- =1LU- =1LU- =1LU- =1LU- =1LLU- =1LU- =1zVGBU- =1zVGBU- =1LU- =1zVGBLLLt0!ҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽt0!UzVGBҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽUҽҽҽҽUUA0^ҽҽҽҽҽҽҽҽҽҽҽҽUA0^zVGBUA0^Lҽҽҽҽҽҽҽҽҽҽҽҽ- =1ҽҽҽҽҽ- =1- =1- =1- =1zVGB- =1zVGB- =1zVGBҽҽҽҽҽU- =1- =1- =1- =1- =1- =1- =1- =1UUUUA0^qY & D= Rounds WonC]Players Remain -- O[AS*> $?Raclass LMS_Game_3SPN extends xDeathMatch config; struct LMSDataEntry { var Controller PC; var vector LocationHistory[10]; var int NextLocHistSlot; var bool bWarmedUp; var int ReWarnTime; var int RoundsWon; var int CampCount; }; var Game_GRI_3SPN theGRI; var array LMSData; var() config float CampThreshold; var() config int ReCamperWarnInterval; var() config bool bCamperAlarm; var() config float CampDamage; var() config bool bChallengeMode; var() config bool bAllowPickups; var() config bool bAllowAdrenaline; var() config bool bFullAmmo; var() config bool bGiveAdren; // gives full adrenaline at the start of a round var() config bool bSpecsCanTalk; var() config bool bUseAlternateScoring; var() config int startingHealth; var() config int startingArmor; var() config int roundsToWin; var() config int roundTime; var() config int overtimeDamage; var() config float overtimeDamageTime; var() config float adrenalinePerKill; var() config int healthPerKill; // health gained per kill var() config float maxHealth; // maximum health, is percentage of starting health based on rounds won var() config bool bUseNewBooster; var() config bool bDisableHitSounds; var() config bool bDisableBrightskins; var() config bool bDisableSpeed; var() config bool bDisableBooster; var() config bool bDisableInvis; var() config bool bDisableBerserk; var() config bool bAutoRecDemos; var() config bool bForceRUP; var() config bool bImprovedShieldGun; // use the shieldgun that has reduced damage and increased kick var() config int grenadeCount; var() config int assaultAmmoCount; var() config int bioAmmoCount; var() config int shockAmmoCount; var() config int linkAmmoCount; var() config int miniAmmoCount; var() config int flakAmmoCount; var() config int rocketAmmoCount; var() config int lightningAmmoCount; var() config int transAmmoCount; var() int currentRound; var() int roundCountdown; // countdown in seconds before players can shoot after the start of a round var() int currentCount; var() int endCount; var() int otCount; var() bool bWeaponsLocked; var() bool bStarted; var() bool bEndOfRound; var() bool bIsOvertime; var() bool bRespawning; var() bool bUTComp; var() int weaponCount; replication { reliable if(Role == ROLE_Authority) theGRI; reliable if(Role == ROLE_Authority) LockWeaponsFor, LockWeapons, UnlockWeapons, UnlockWeaponsFor; } ///////////////////////////////////////////////////////////// // Pre-Game and misc functions ////////////////////////////// // Make sure all weapons are loaded. static function PrecacheGameTextures(LevelInfo myLevel) { Super.PrecacheGameTextures(myLevel); class'XWeapons.BioRiflePickup'.static.StaticPrecache(myLevel); class'XWeapons.FlakCannonPickup'.static.StaticPrecache(myLevel); class'XWeapons.LinkGunPickup'.static.StaticPrecache(myLevel); class'XWeapons.MinigunPickup'.static.StaticPrecache(myLevel); class'XWeapons.RocketLauncherPickup'.static.StaticPrecache(myLevel); class'XWeapons.ShockRiflePickup'.static.StaticPrecache(myLevel); class'XWeapons.SniperRiflePickup'.static.StaticPrecache(myLevel); } // PrecacheGameTextures() function GetServerDetails( out ServerResponseLine ServerState ) { Super.GetServerDetails(ServerState); AddServerDetail( ServerState, "Num Rounds", roundsToWin); AddServerDetail( ServerState, "Starting Health", StartingHealth); AddServerDetail( ServerState, "Starting Armor", StartingArmor); AddServerDetail( ServerState, "Adrenaline", bAllowAdrenaline); AddServerDetail( ServerState, "Adrenaline Per Kill", adrenalinePerKill); AddServerDetail( ServerState, "Challenge Mode", bChallengeMode); AddServerDetail( ServerState, "Allow Pickups", bAllowPickups); AddServerDetail( ServerState, "Hitsounds", !bDisableHitsounds); AddServerDetail( ServerState, "Brightskins", !bDisableBrightskins); AddServerDetail( ServerState, "3SPN Version", class'Game_GRI_3SPN'.default.Version); } // GetServerDetails() static function FillPlayInfo(PlayInfo PlayInfo) { Super.FillPlayInfo(PlayInfo); PlayInfo.AddSetting(default.GameGroup, "startingHealth", "Starting Health", 0, 107, "Text", "3;0:999",,True); PlayInfo.AddSetting(default.GameGroup, "startingArmor", "Starting Armor", 0, 108, "Text", "3;0:999",,True); PlayInfo.AddSetting(default.GameGroup, "bAllowAdrenaline", "Adrenaline", 0, 111, "Check"); PlayInfo.AddSetting(default.GameGroup, "adrenalinePerKill", "Adrenaline per Kill", 0, 112, "Text", "3;0:100",, True); PlayInfo.AddSetting(default.GameGroup, "bGiveAdren", "Full adrenaline", 0, 113, "Check"); PlayInfo.AddSetting(default.GameGroup, "bFullAmmo", "Give Players Full Ammo", 0, 120, "Check"); PlayInfo.AddSetting(default.GameGroup, "bAllowPickups", "Allow Pickups.", 0, 121, "Check"); PlayInfo.AddSetting(default.GameGroup, "bChallengeMode", "Challenge Mode", 0, 130, "Check"); PlayInfo.AddSetting(default.GameGroup, "roundsToWin", "Rounds to Win", 0, 140, "Text", "3;0:999",,True); PlayInfo.AddSetting(default.GameGroup, "roundTime", "Minutes Per Round", 0, 141, "Text", "3;0:999",,True); PlayInfo.AddSetting(default.GameGroup, "overtimeDamage", "Overtime Damage", 0, 142, "Text", "3;0:999",,True); PlayInfo.AddSetting(default.GameGroup, "overtimeDamageTime", "Overtime Interval", 0, 143, "Text", "3;0:999",,True); PlayInfo.AddSetting(default.GameGroup, "healthPerKill", "Health Per Kill", 0, 150, "Text", "3;0:999",, True); PlayInfo.AddSetting(default.GameGroup, "maxHealth", "Max Health", 0, 151, "Text", "8;0.0:2.0",, True); PlayInfo.AddSetting(default.GameGroup, "bForceRUP", "Force Ready", 0, 152, "Check"); PlayInfo.AddSetting(default.RulesGroup, "bImprovedShieldGun", "Use Modified Shield Gun", 0, 170, "Check"); PlayInfo.AddSetting(default.RulesGroup, "grenadeCount", "Grenades", 0, 171, "Text", "3;0:999",, True); PlayInfo.AddSetting(default.RulesGroup, "assaultAmmoCount", "Assault Ammo", 0, 172, "Text", "3;0:999",, True); PlayInfo.AddSetting(default.RulesGroup, "bioAmmoCount", "Bio Ammo", 0, 173, "Text", "3;0:999",, True); PlayInfo.AddSetting(default.RulesGroup, "shockAmmoCount", "Shock Ammo", 0, 174, "Text", "3;0:999",, True); PlayInfo.AddSetting(default.RulesGroup, "linkAmmoCount", "Link Ammo", 0, 175, "Text", "3;0:999",, True); PlayInfo.AddSetting(default.RulesGroup, "miniAmmoCount", "Mini Ammo", 0, 176, "Text", "3;0:999",, True); PlayInfo.AddSetting(default.RulesGroup, "flakAmmoCount", "Flak Ammo", 0, 177, "Text", "3;0:999",, True); PlayInfo.AddSetting(default.RulesGroup, "rocketAmmoCount", "Rocket Ammo", 0, 178, "Text", "3;0:999",, True); PlayInfo.AddSetting(default.RulesGroup, "lightningAmmoCount", "Lightning Ammo", 0, 179, "Text", "3;0:999",, True); PlayInfo.AddSetting(default.RulesGroup, "transAmmoCount", "Translocator Ammo", 0, 180, "Text", "3;0:999",, True); PlayInfo.AddSetting(default.GameGroup, "bCamperAlarm", "Check for Campers", 0, 190, "Check"); PlayInfo.AddSetting(default.GameGroup, "CampThreshold", "Camp Threshold", 0, 191, "Text", "5;0:999",, True); PlayInfo.AddSetting(default.GameGroup, "ReCamperWarnInterval", "Camper Interval", 0, 192, "Text", "3;0:999",, True); PlayInfo.AddSetting(default.GameGroup, "CampDamage", "Camper Damage", 0, 193, "Text", "3;0:999",, True); PlayInfo.AddSetting(default.RulesGroup, "bDisableSpeed", "Disable Speed", 0, 200, "Check"); PlayInfo.AddSetting(default.RulesGroup, "bDisableInvis", "Disable Invisibility", 0, 201, "Check"); PlayInfo.AddSetting(default.RulesGroup, "bDisableBerserk", "Disable Berserk", 0, 202, "Check"); PlayInfo.AddSetting(default.RulesGroup, "bDisableBooster", "Disable Booster", 0, 203, "Check"); } // fillplayinfo() static event string GetDescriptionText(string PropName) { switch (PropName) { case "startingHealth": return "Base health at round-start."; case "startingArmor": return "Base armor at round-start."; case "bAllowAdrenaline": return "Turn on or off adrenaline."; case "bGiveAdren": return "Give full adrenaline at round-start."; case "bFullAmmo": return "Give full ammo at round-start."; case "bAllowPickups": return "Players must pick up weapons."; case "bChallengeMode": return "Round winners take a health/armor penalty. (Formerly known as Survivor Mode)"; case "roundsToWin": return "The rounds a team must win to win the game."; case "roundTime": return "The minutes a round goes before it goes into overtime."; case "overtimeDamage": return "The damage players take every so often in overtime."; case "overtimeDamageTime": return "How often players take damage in overtime."; case "adrenalinePerKill": return "The adrenaline received per kill."; case "healthPerKill": return "The health received per kill."; case "maxHealth": return "The maximum health a player can achieve (percentage)."; case "bForceRUP": return "Forces players to ready up after 30 seconds."; case "bImprovedShieldGun": return "Gives players a modified shield gun, with higher shield jumps and reduced self-damage."; case "grenadeCount": return "Grenades given."; case "assaultAmmoCount": return "Assault ammo given."; case "bioAmmoCount": return "Bio ammo given."; case "shockAmmoCount": return "Shock ammo given."; case "linkAmmoCount": return "Link ammo given."; case "miniAmmoCount": return "Mini ammo given."; case "flakAmmoCount": return "Flak ammo given."; case "rocketAmmoCount": return "Rocket ammo given."; case "lightningAmmoCount": return "Lightning ammo given."; case "transAmmoCount": return "Tranlocator charges given (these do not recharge)."; case "bCamperAlarm": return "Checks for players remaining in the same spot for too long (camping)."; case "CampThreshold": return "The area a player must stay in to be considered camping."; case "ReCamperWarnInterval": return "The amount of time between warning the same player."; case "CampDamage": return "The damage a player takes each time they're caught (multiplied by the number of times they've been caught)."; case "bDisableSpeed": return "Disable the Speed adrenaline combo."; case "bDisableInvis": return "Disable the Invisibility adrenaline combo."; case "bDisableBooster": return "Disable the Booster adrenaline combo."; case "bDisableBerserk": return "Disable the Berserk adrenaline combo."; } return Super.GetDescriptionText(PropName); } // getdescriptiontext() event PreBeginPlay() { Super.PreBeginPlay(); GameReplicationInfo.bNoTeamSkins = false; GameReplicationInfo.bForceNoPlayerLights = false; GameReplicationInfo.bForceTeamSkins = true; GameReplicationInfo.bAllowPlayerLights = true; } // PreBeginPlay() // Parse options for this game... event InitGame( string Options, out string Error ) { local string InOpt; local Mutator m; Super.InitGame(Options, Error); // Use camper alarm InOpt = ParseOption( Options, "CamperAlarm"); if(InOpt != "") bCamperAlarm = bool(InOpt); InOpt = ParseOption(Options, "AllowPickups"); if (InOpt !="") bAllowPickups = bool(InOpt); InOpt = ParseOption(Options, "AllowAdrenaline"); if (InOpt != "") bAllowAdrenaline = bool(InOpt); InOpt = ParseOption(Options, "GiveAdren"); if(InOpt != "") { bGiveAdren = bool(InOpt); if(bGiveAdren == true) bAllowAdrenaline = true; } InOpt = ParseOption(Options, "StartingHealth"); if(InOpt != "") startingHealth = int(InOpt); InOpt = ParseOption(Options, "StartingArmor"); if(InOpt != "") startingArmor = int(InOpt); InOpt = ParseOption(Options, "roundsToWin"); if(InOpt != "") roundsToWin = int(InOpt); InOpt = ParseOption(Options, "FullAmmo"); if(InOpt != "") bFullAmmo = bool(InOpt); InOpt = ParseOption(Options, "SpecsCanTalk"); if(InOpt != "") bSpecsCanTalk = bool(InOpt); InOpt = ParseOption(Options, "SurvivorMode"); if(InOpt != "") bChallengeMode = bool(InOpt); InOpt = ParseOption(Options, "ChallengeMode"); if(InOpt != "") bChallengeMode = bool(InOpt); InOpt = ParseOption(Options, "CampThreshold"); if(InOpt != "") CampThreshold = int(InOpt); InOpt = ParseOption(Options, "ReCamperWarnInterval"); if(InOpt != "") ReCamperWarnInterval = int(InOpt); InOpt = ParseOption(Options, "CampDamage"); if(InOpt != "") CampDamage = float(InOpt); InOpt = ParseOption(Options, "overtimeDamage"); if(InOpt != "") overtimeDamage = int(InOpt); InOpt = ParseOption(Options, "overtimeDamageTime"); if(InOpt != "") overtimeDamageTime = float(InOpt); InOpt = Parseoption(Options, "adrenalinePerKill"); if(InOpt != "") adrenalinePerKill = float(InOpt); InOpt = ParseOption(Options, "healthPerKill"); if(InOpt != "") healthPerKill = int(InOpt); InOpt = ParseOption(Options, "maxHealth"); if(InOpt != "") maxHealth = float(InOpt); InOpt = ParseOption(Options, "ImprovedShieldGun"); if(InOpt != "") bImprovedShieldGun = bool(InOpt); InOpt = ParseOption(Options, "grenadeCount"); if(InOpt != "") grenadeCount = int(InOpt); InOpt = ParseOption(Options, "assaultAmmoCount"); if(InOpt != "") assaultAmmoCount = int(InOpt); InOpt = ParseOption(Options, "bioAmmoCount"); if(InOpt != "") bioAmmoCount = int(InOpt); InOpt = ParseOption(Options, "shockAmmoCount"); if(InOpt != "") shockAmmoCount = int(InOpt); InOpt = ParseOption(Options, "linkAmmoCount"); if(InOpt != "") linkAmmoCount = int(InOpt); InOpt = ParseOption(Options, "miniAmmoCount"); if(InOpt != "") miniAmmoCount = int(InOpt); InOpt = ParseOption(Options, "flakAmmoCount"); if(InOpt != "") flakAmmoCount = int(InOpt); InOpt = ParseOption(Options, "rocketAmmoCount"); if(InOpt != "") rocketAmmoCount = int(InOpt); InOpt = ParseOption(Options, "lightningAmmoCount"); if(InOpt != "") lightningAmmoCount = int(InOpt); InOpt = ParseOption(Options, "transAmmoCount"); if(InOpt != "") transAmmoCount = int(InOpt); InOpt = ParseOption(Options, "DisableSpeed"); if(InOpt != "") bDisableSpeed = bool(InOpt); InOpt = ParseOption(Options, "DisableBooster"); if(InOpt != "") bDisableBooster = bool(InOpt); InOpt = ParseOption(Options, "DisableBerserk"); if(InOpt != "") bDisableBerserk = bool(InOpt); InOpt = ParseOption(Options, "DisableInvis"); if(InOpt != "") bDisableInvis = bool(InOpt); InOpt = ParseOption(Options, "DisableHitsounds"); if(InOpt != "") bDisableHitsounds = bool(InOpt); InOpt = ParseOption(Options, "DisableBrightskins"); if(InOpt != "") bDisableBrightskins = bool(InOpt); InOpt = ParseOption(Options, "roundTime"); if(InOpt != "") roundTime = int(InOpt); InOpt = ParseOption(Options, "AutoRecDemos"); if(InOpt != "") bAutoRecDemos = bool(InOpt); InOpt = ParseOption(Options, "ForceRUP"); if(InOpt != "") bForceRUP = bool(InOpt); if(theGRI == None) theGRI = Spawn(class'Game_GRI_3SPN'); theGRI.gamename = "3SPN-LMS"; theGRI.AM.mapname = Left(string(Level), InStr(string(Level), ".")); theGRI.AM.bGiveAdren = bGiveAdren; theGRI.AM.bAdren = bAllowAdrenaline; theGRI.AM.bFullAmmo = bFullAmmo; theGRI.AM.bAllowPickups = bAllowPickups; theGRI.AM.bWeaponStay = bWeaponStay; theGRI.AM.bSpecsCanTalk = bSpecsCanTalk; theGRI.AM.bPlayersMustBeReady = bPlayersMustBeReady; theGRI.AM.bChallengeMode = bChallengeMode; theGRI.AM.startingHealth = startingHealth; theGRI.AM.startingArmor = startingArmor; theGRI.AM.roundsToWin = roundsToWin; theGRI.AM.roundTime = roundTime; theGRI.AM.overtimeDamage = overtimeDamage; theGRI.AM.overtimeDamageTime = overtimeDamageTime; theGRI.AM.adrenalinePerKill = adrenalinePerKill; theGRI.AM.healthPerKill = healthPerKill; theGRI.AM.maxHealth = maxHealth; theGRI.AM.bImprovedShieldGun = bImprovedShieldGun; theGRI.AM.grenadeCount = grenadeCount; theGRI.AM.assaultAmmoCount = assaultAmmoCount; theGRI.AM.bioAmmoCount = bioAmmoCount; theGRI.AM.shockAmmoCount = shockAmmoCount; theGRI.AM.linkAmmoCount = linkAmmoCount; theGRI.AM.miniAmmoCount = miniAmmoCount; theGRI.AM.flakAmmoCount = flakAmmoCount; theGRI.AM.rocketAmmoCount = rocketAmmoCount; theGRI.AM.lightningAmmoCount = lightningAmmoCount; theGRI.AM.transAmmoCount = transAmmoCount; weaponCount = 1; if(grenadeCount > 0) weaponCount++; if(assaultAmmoCount > 0) weaponCount++; if(bioAmmoCount > 0) weaponCount++; if(shockAmmoCount > 0) weaponCount++; if(linkAmmoCount > 0) weaponCount++; if(miniAmmoCount > 0) weaponCount++; if(flakAmmoCount > 0) weaponCount++; if(rocketAmmoCount > 0) weaponCount++; if(lightningAmmoCount > 0) weaponCount++; if(transAmmoCount > 0) weaponCount++; theGRI.bCamperAlarm = bCamperAlarm; theGRI.CampThreshold = CampThreshold; theGRI.ReCamperWarnInterval = ReCamperWarnInterval; theGRI.CampDamage = CampDamage; theGRI.bDisableBrightskins = bDisableBrightskins; theGRI.bDisableHitsounds = bDisableHitsounds; theGRI.bDisableSpeed = bDisableSpeed; theGRI.bDisableBooster = bDisableBooster; theGRI.bDisableBerserk = bDisableBerserk; theGRI.bDisableInvis = bDisableInvis; theGRI.bUseAlternateScoring = bUseAlternateScoring; theGRI.bForceRUP = bForceRUP; if(bUTComp) ADR_Kill = adrenalinePerKill; else ADR_Kill = adrenalinePerKill / 3; if(bImprovedShieldGun) { Class'XWeapons.ShieldFire'.Default.SelfForceScale = 1.500000; Class'XWeapons.ShieldFire'.Default.SelfDamageScale = 0.100000; Class'XWeapons.ShieldFire'.Default.MinSelfDamage = 0.000000; } if(transAmmoCount > 0 && !bAllowPickups) { Class'XWeapons.Translauncher'.Default.AmmoChargeRate = 0.000000; Class'XWeapons.Translauncher'.Default.AmmoChargeMax = transAmmoCount; Class'XWeapons.Translauncher'.Default.AmmoChargeF = transAmmoCount; Class'XWeapons.Translauncher'.Default.bShowChargingBar = false; } GoalScore = 0; // Force no Frag Limit bForceRespawn = true; if(!bAllowPickups) bAllowWeaponThrowing = false; MaxLives = 1; Class'XGame.ComboSpeed'.Default.Duration = 30; for(m = BaseMutator; m != None; m = m.NextMutator) { if(m.IsA('MutUTComp')) { log("UTComp found.", '3SPN'); bUTComp = true; break; } } if(bUTComp) { log("Using UTComp Classes.", '3SPN'); HUDType = "xInterface.HUDCDeathmatch"; ScoreBoardType = "xInterface.ScoreBoardDeathMatch"; LocalStatsScreenClass = class'DMStatsScreen'; } else { log("Using 3SPN Classes.", '3SPN'); Class'xPawn'.Default.ControllerClass = class'Game_Bot_3SPN'; Class'FlakChunk'.Default.MyDamageType = class'DamType_FlakChunk_3SPN'; Class'FlakShell'.Default.MyDamageType = class'DamType_FlakShell_3SPN'; DefaultPlayerClassName="3SPNv252.Game_Pawn_3SPN"; } theGRI.bUTComp = bUTComp; saveconfig(); theGRI.saveconfig(); } // InitGame() function PostBeginPlay() { if(bAutoRecDemos && Level.NetMode == NM_DedicatedServer) { if(DemoCommand == "") DemoCommand = "AM-"$theGRI.AM.mapname$"-"$Level.Month$"-"$Level.Day$"-"$Level.Hour$"-"$Level.Minute$"-ServerDemo"; } Super.PostBeginPlay(); } auto state PendingMatch { function Timer() { local Controller P; local bool bReady; Global.Timer(); // first check if there are enough net players, and enough time has elapsed to give people // a chance to join if ( NumPlayers == 0 ) bWaitForNetPlayers = true; if ( bWaitForNetPlayers && (Level.NetMode != NM_Standalone) ) { if ( NumPlayers >= MinNetPlayers ) ElapsedTime++; else ElapsedTime = 0; if ( (NumPlayers == MaxPlayers) || (ElapsedTime > NetWait) ) { bWaitForNetPlayers = false; CountDown = Default.CountDown; } } else if(bForceRUP && bPlayersMustBeReady) ElapsedTime++; if ( (Level.NetMode != NM_Standalone) && (bWaitForNetPlayers || (bTournament && (NumPlayers < MaxPlayers))) ) { PlayStartupMessage(); return; } // check if players are ready bReady = true; StartupStage = 1; if ( !bStartedCountDown && (bTournament || bPlayersMustBeReady || (Level.NetMode == NM_Standalone)) ) { for (P=Level.ControllerList; P!=None; P=P.NextController ) if ( P.IsA('PlayerController') && (P.PlayerReplicationInfo != None) && P.bIsPlayer && P.PlayerReplicationInfo.bWaitingPlayer && !P.PlayerReplicationInfo.bReadyToPlay ) bReady = false; } // force ready after 30 seconds if(!bReady && bForceRUP && bPlayersMustBeReady && (ElapsedTime > 60)) bReady = true; if ( bReady && !bReviewingJumpspots ) { bStartedCountDown = true; CountDown--; if ( CountDown <= 0 ) StartMatch(); else StartupStage = 5 - CountDown; } PlayStartupMessage(); } } // add bot to the game function bool AddBot(optional string botName) { local Bot NewBot; local LMSDataEntry NewData; local int i, l; NewBot = SpawnBot(botName); if ( NewBot == None ) { warn("Failed to spawn bot."); return false; } // broadcast a welcome message. BroadcastLocalizedMessage(GameMessageClass, 1, NewBot.PlayerReplicationInfo); NewBot.PlayerReplicationInfo.PlayerID = CurrentID++; NumBots++; if(!bRespawning && currentRound > 0) { NewBot.PlayerReplicationInfo.bOutOfLives = true; NewBot.PlayerReplicationInfo.numLives = 0; if ( Level.NetMode == NM_Standalone ) RestartPlayer(NewBot); else NewBot.GotoState('Dead','MPStart'); } else RestartPlayer(NewBot); NewBot.bAdrenalineEnabled = bAllowAdrenaline; // Check we dont already have data for this player controller. for(i=0; i= MaxSpectators) || P.IsInState('GameEnded') || P.IsInState('RoundEnded') ) { P.ReceiveLocalizedMessage(GameMessageClass, 12); b = false; } if(b) { P.PlayerReplicationInfo.bOnlySpectator = true; NumSpectators++; NumPlayers--; if ( !bKillBots ) RemainingBots++; if ( !NeedPlayers() || AddBot() ) RemainingBots--; } return b; } // BecomeSpectator() // stop spectating by joining as player function bool AllowBecomeActivePlayer(PlayerController P) { local bool b; b = true; if ( (P.PlayerReplicationInfo == None) || (NumPlayers >= MaxPlayers) || P.IsInState('GameEnded') || P.IsInState('RoundEnded') ) { P.ReceiveLocalizedMessage(GameMessageClass, 13); b = false; } if (b) { if ( (Level.NetMode == NM_Standalone) && (NumBots > InitialBots) ) { RemainingBots--; bPlayerBecameActive = true; } } return b; } // AllowBecomeActivePlayer() // announce the players with the most headshots, accuracy and damage function AnnounceBest(optional bool bEndOfGame) { local Controller C; local string acc; local string dam; local string hs; local Game_PRI_3SPN PRI; local Game_PRI_3SPN accuracy; local Game_PRI_3SPN damage; local Game_PRI_3SPN headshots; if(bUTComp) return; acc = "Most Accurate: "; dam = "Most Damage: "; hs = "Most Headshots: "; for(C = Level.ControllerList; C != None; C = C.NextController) { if(c == None) continue; PRI = Game_PRI_3SPN(C.PlayerReplicationInfo); if(PRI == None || PRI.bOnlySpectator) continue; PRI.CalculateHitStats(); if(accuracy == None || (accuracy.Percent < PRI.Percent)) accuracy = PRI; if(damage == None || (damage.WeaponDamage < PRI.WeaponDamage)) damage = PRI; if(headshots == None || (headshots.Headshots < PRI.Headshots)) headshots = PRI; } if(accuracy == None || damage == None || headshots == None) return; if(accuracy.Percent > 0.0) { acc = acc$accuracy.PlayerName; acc = acc$": "$accuracy.Percent$"%"; } else acc = ""; if(damage.WeaponDamage > 0) { dam = dam$damage.PlayerName; dam = dam$": "$damage.WeaponDamage; } else dam = ""; if(headshots.Headshots > 0) { hs = hs$headshots.PlayerName; hs = hs$": "$headshots.Headshots; } else hs = ""; for(C = Level.ControllerList; C != None; C = C.NextController) { if(c != None && c.IsA('Game_Player_3SPN')) { Game_Player_3SPN(c).ListBest(acc, dam, hs); } } } // AnnounceBest() // start the first round function StartMatch() { Super.StartMatch(); currentCount = roundCountdown; GameReplicationInfo.bMatchHasBegun = true; GameReplicationInfo.MaxLives = 0; // have to fake the GRI into thinking there is no life limit } // StartMatch() // Pre-Game functions /////////////////////////////////////// ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// // new round functions ////////////////////////////////////// // locks all weapons, used at the start of a new round simulated function LockWeapons() { local Controller c; if(bAllowPickups) return; bWeaponsLocked = true; for(c = Level.ControllerList; c != None; c = c.nextController) { if(c == None || c.PlayerReplicationInfo == None || c.Pawn == None) continue; if(!c.PlayerReplicationInfo.bOnlySpectator && c.Pawn != None) { LockWeaponsFor(c.Pawn); } } } // LockWeapons() // locks all weapons on a specific pawn simulated function LockWeaponsFor(Pawn p) { local Inventory inv; if(bAllowPickups) return; if(p.Controller.IsA('PlayerController')) { if(!bUTComp) { if(!p.PlayerReplicationInfo.bOnlySpectator) Game_Player_3SPN(p.Controller).LockWeapons(); } for(inv = p.Inventory; inv != None; inv = inv.Inventory) { if(inv.IsA('Weapon')) { Weapon(inv).bEndOfRound = true; Weapon(inv).ClientStopFire(0); Weapon(inv).ClientStopFire(1); } } return; } else { inv = p.Inventory; while(inv != None) { if(inv.IsA('Weapon_ShieldGun_3SPN')) Weapon_ShieldGun_3SPN(inv).Lock(); else if(inv.IsA('Weapon_AssaultRifle_3SPN')) Weapon_AssaultRifle_3SPN(inv).Lock(); else if(inv.IsA('Weapon_BioRifle_3SPN')) Weapon_BioRifle_3SPN(inv).Lock(); else if(inv.IsA('Weapon_ShockRifle_3SPN')) Weapon_ShockRifle_3SPN(inv).Lock(); else if(inv.IsA('Weapon_LinkGun_3SPN')) Weapon_LinkGun_3SPN(inv).Lock(); else if(inv.IsA('Weapon_Minigun_3SPN')) Weapon_Minigun_3SPN(inv).Lock(); else if(inv.IsA('Weapon_FlakCannon_3SPN')) Weapon_FlakCannon_3SPN(inv).Lock(); else if(inv.IsA('Weapon_RocketLauncher_3SPN')) Weapon_RocketLauncher_3SPN(inv).Lock(); else if(inv.IsA('Weapon_SniperRifle_3SPN')) Weapon_SniperRifle_3SPN(inv).Lock(); inv = inv.Inventory; } } } // LockWeaponsFor() // give ammo function GiveAmmo(Pawn p) { local Inventory inv; if(bFullAmmo) { if(p != None) { inv = p.Inventory; while(inv != None) { if(inv.IsA('Weapon')) Weapon(inv).MaxOutAmmo(); inv = inv.Inventory; } } } else { if(p != None) { inv = p.Inventory; while(inv != None) { if(inv.IsA('AssaultRifle')) { AssaultRifle(inv).AmmoCharge[0] = assaultAmmoCount; AssaultRifle(inv).AmmoCharge[1] = grenadeCount; } else if(inv.IsA('BioRifle')) BioRifle(inv).AmmoCharge[0] = bioAmmoCount; else if(inv.IsA('ShockRifle')) ShockRifle(inv).AmmoCharge[0] = shockAmmoCount; else if(inv.IsA('LinkGun')) LinkGun(inv).AmmoCharge[0] = linkAmmoCount; else if(inv.IsA('Minigun')) Minigun(inv).AmmoCharge[0] = miniAmmoCount; else if(inv.IsA('FlakCannon')) FlakCannon(inv).AmmoCharge[0] = flakAmmoCount; else if(inv.IsA('RocketLauncher')) RocketLauncher(inv).AmmoCharge[0] = rocketAmmoCount; else if(inv.IsA('SniperRifle')) SniperRifle(inv).AmmoCharge[0] = lightningAmmoCount; else if(inv.IsA('Translauncher')) Translauncher(inv).GiveAmmo(0, None, false); inv = inv.Inventory; } } } } // GiveAmmo() function SetupPlayer(Pawn p) { local int roundsWon; local int i; local float blah; if(!bChallengeMode) { p.ShieldStrength = 0; p.AddShieldStrength(startingArmor); p.Health = startingHealth; p.SuperHealthMax = startingHealth * maxHealth; } else { if(p.PlayerReplicationInfo.IsA('Game_PRI_3SPN')) roundsWon = Game_PRI_3SPN(p.PlayerReplicationInfo).roundsWon; else { for(i = 0; i < LMSData.Length; i++) { if(LMSData[i].PC != None && LMSData[i].PC.Pawn != None && LMSData[i].PC.Pawn == p) roundsWon = LMSData[i].roundsWon; } } blah = (0.5 / roundsToWin); p.ShieldStrength = 0; p.AddShieldStrength(Max(0, startingArmor - ((startingArmor * blah) * roundsWon))); p.Health = Max(40, startingHealth - ((startingHealth * blah) * roundsWon)); p.SuperHealthMax = int(startingHealth - ((startingHealth * blah) * roundsWon)) * maxHealth; } if(bGiveAdren) { bAllowAdrenaline = true; p.Controller.AwardAdrenaline(100); } if(bUseNewBooster) { if(p.Controller.IsA('Game_Player_3SPN')) Game_Player_3SPN(p.Controller).SwitchCombos(); } if(p.Controller.IsA('Game_Player_3SPN')) { Game_Player_3SPN(p.Controller).SetupCombos(); xPawn(p).Spree = Game_Player_3SPN(p.Controller).spree; } if(bWeaponsLocked) LockWeaponsFor(p); else UnlockWeaponsFor(p); } function GiveWeapons(Pawn p) { if(p == None) return; if(p.Controller == None) return; if(p.Controller.PlayerReplicationInfo == None) return; if(p.Controller.IsA('Bot')) { DiscardInventory(p); p.Weapon = none; p.SelectedItem = none; p.GiveWeapon("3SPNv252.Weapon_ShieldGun_3SPN"); if(assaultAmmoCount != 0 || bFullAmmo) p.GiveWeapon("3SPNv252.Weapon_AssaultRifle_3SPN"); if(bioAmmoCount > 0 || bFullAmmo) p.GiveWeapon("3SPNv252.Weapon_BioRifle_3SPN"); if(flakAmmoCount > 0 || bFullAmmo) p.GiveWeapon("3SPNv252.Weapon_FlakCannon_3SPN"); if(linkAmmoCount > 0 || bFullAmmo) p.GiveWeapon("3SPNv252.Weapon_LinkGun_3SPN"); if(miniAmmoCount > 0 || bFullAmmo) p.GiveWeapon("3SPNv252.Weapon_Minigun_3SPN"); if(rocketAmmoCount > 0 || bFullAmmo) p.GiveWeapon("3SPNv252.Weapon_RocketLauncher_3SPN"); if(shockAmmoCount > 0 || bFullAmmo) p.GiveWeapon("3SPNv252.Weapon_ShockRifle_3SPN"); if(lightningAmmoCount > 0 || bFullAmmo) p.GiveWeapon("3SPNv252.Weapon_SniperRifle_3SPN"); } else { if(assaultAmmoCount > 0 || grenadeCount > 0 || bFullAmmo) p.GiveWeapon("XWeapons.AssaultRifle"); if(bioAmmoCount != 0 || bFullAmmo) p.GiveWeapon("XWeapons.BioRifle"); if(flakAmmoCount != 0 || bFullAmmo) p.GiveWeapon("XWeapons.FlakCannon"); if(linkAmmoCount != 0 || bFullAmmo) p.GiveWeapon("XWeapons.LinkGun"); if(miniAmmoCount != 0 || bFullAmmo) p.GiveWeapon("XWeapons.Minigun"); if(rocketAmmoCount != 0 || bFullAmmo) p.GiveWeapon("XWeapons.RocketLauncher"); if(shockAmmoCount != 0 || bFullAmmo) p.GiveWeapon("XWeapons.ShockRifle"); if(lightningAmmoCount != 0 || bFullAmmo) p.GiveWeapon("XWeapons.SniperRifle"); if(transAmmoCount > 0) p.GiveWeapon("XWeapons.Translauncher"); } } // GiveWeapons() // When player spawns - give them all the shizzle function AddGameSpecificInventory(Pawn p) { if(p == None) return; if(p.Controller == None) return; if(p.Controller.PlayerReplicationInfo == None) return; Super.AddGameSpecificInventory(p); if(!bAllowPickups) { GiveWeapons(p); GiveAmmo(p); } SetupPlayer(p); } // AddGameSpecificInventory() // show the new-round countdown message function SendRoundText(int timeleft) { local Controller P; local PlayerController Player; for(P = Level.ControllerList; P != None; P = P.nextController) { if(P.IsA('PlayerController')) { Player = PlayerController(P); if(Player != None) { Player.ReceiveLocalizedMessage(class'Message_RoundTime_3SPN', timeleft); } } } } // SendRoundText() // show the 'weapons unlocked' message function PlayRoundMessage() { local Controller P; local PlayerController Player; for(P = Level.ControllerList; P != None; P = P.nextController) { Player = PlayerController(P); if(Player != None) { Player.ReceiveLocalizedMessage(class'Message_RoundStart_3SPN'); } } } // PlayRoundMessage() // reset level function ResetLevel() { local Controller c; local int Adren; for(c = Level.ControllerList; c != None; c = c.NextController) { if(c.PlayerReplicationInfo == None || !c.PlayerReplicationInfo.bOnlySpectator) { Adren = c.Adrenaline; if(c.Pawn != None) { if(xPawn(c.Pawn) != None && xPawn(c.Pawn).CurrentCombo != None) { c.Adrenaline = 0; Adren = 0; xPawn(c.Pawn).CurrentCombo.Destroy(); } if(xPawn(c.Pawn) != None) { if(Game_Player_3SPN(c) != None) { Game_Player_3SPN(c).spree = c.Pawn.GetSpree(); } } c.Pawn.Destroy(); } else if(Game_Player_3SPN(c) != None) Game_Player_3SPN(c).spree = 0; if(PlayerController(c) != None) PlayerController(C).ClientReset(); C.Reset(); if(PlayerController(c) != None) PlayerController(C).GotoState('Spectating'); // may be necessary for proper spawnage c.AwardAdrenaline(adren); } } } // ResetLevel() function RestartPlayers(bool bMoveAlive) { local Controller C; for(c = Level.ControllerList; c != None; c = c.NextController) { if(c == None || c.PlayerReplicationInfo == None) continue; /*if(c.PlayerReplicationInfo.IsA('Game_PRI_3SPN')) Game_PRI_3SPN(c.PlayerReplicationInfo).ClearStats();*/ if(c.IsA('Game_Player_3SPN')) Game_Player_3SPN(c).ResetClock(roundTime); if((c.Pawn == None) && c.IsA('PlayerController') && !c.PlayerReplicationInfo.bOnlySpectator) { c.PlayerReplicationInfo.bOutOfLives = false; c.PlayerReplicationInfo.NumLives = 1; PlayerController(c).ClientReset(); RestartPlayer(c); } if(c.IsA('Bot') && bMoveAlive) { if(c.Pawn != None) { if(xPawn(c.Pawn) != None && xPawn(c.Pawn).CurrentCombo != None) { c.Adrenaline = 0; xPawn(c.Pawn).CurrentCombo.Destroy(); } c.Pawn.Destroy(); } c.PlayerReplicationInfo.bOutOfLives = false; c.PlayerReplicationInfo.NumLives = 1; RestartPlayer(c); } } } // RestartPlayers() function StartNewRound() { bStarted = False; RemainingTime = roundTime * 60; GameReplicationInfo.RemainingTime = RemainingTime; GameReplicationInfo.NetUpdateTime = Level.TimeSeconds - 1; currentCount = roundCountdown; ResetLevel(); RestartPlayers(true); LockWeapons(); } // StartNewRound() // end of new-round functions /////////////////////////////// ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// // mid-round functions ////////////////////////////////////// // unlock weapons after new round countdown simulated function UnlockWeapons() { local Controller c; if(bAllowPickups) return; for(c = Level.ControllerList; c != None; c = c.nextController) { if(c.Pawn != None) { UnlockWeaponsFor(c.Pawn); } } } // UnlockWeapons() // unlock weapons for a specific pawn simulated function UnlockWeaponsFor(Pawn p) { local Inventory inv; if(bAllowPickups) return; if(p.Controller.IsA('PlayerController')) { if(!bUTComp) { if(!p.PlayerReplicationInfo.bOnlySpectator) Game_Player_3SPN(p.Controller).UnlockWeapons(); } for(inv = p.Inventory; inv != None; inv = inv.Inventory) { if(inv.IsA('Weapon')) Weapon(inv).bEndOfRound = false; } return; } else { inv = p.Inventory; while(inv != None) { if(inv.IsA('Weapon_ShieldGun_3SPN')) Weapon_ShieldGun_3SPN(inv).Unlock(); else if(inv.IsA('Weapon_AssaultRifle_3SPN')) Weapon_AssaultRifle_3SPN(inv).Unlock(); else if(inv.IsA('Weapon_BioRifle_3SPN')) Weapon_BioRifle_3SPN(inv).Unlock(); else if(inv.IsA('Weapon_ShockRifle_3SPN')) Weapon_ShockRifle_3SPN(inv).Unlock(); else if(inv.IsA('Weapon_LinkGun_3SPN')) Weapon_LinkGun_3SPN(inv).Unlock(); else if(inv.IsA('Weapon_Minigun_3SPN')) Weapon_Minigun_3SPN(inv).Unlock(); else if(inv.IsA('Weapon_FlakCannon_3SPN')) Weapon_FlakCannon_3SPN(inv).Unlock(); else if(inv.IsA('Weapon_RocketLauncher_3SPN')) Weapon_RocketLauncher_3SPN(inv).Unlock(); else if(inv.IsA('Weapon_SniperRifle_3SPN')) Weapon_SniperRifle_3SPN(inv).Unlock(); inv = inv.Inventory; } } } // UnlockWeaponsFor() // main game state State MatchInProgress { // GameInfo's already have a 1 second timer... function Timer() { local int i,j; local Box HistoryBox; local float MaxDim; local bool bSentWarning; local vector empty; local Actor Reset; local Controller c; ///////////////////////////////////////////// //Super.Timer(); //local Controller P; Global.Timer(); if ( !bFinalStartup ) { bFinalStartup = true; } if ( NeedPlayers() && AddBot() && (RemainingBots > 0) ) RemainingBots--; if ( bIsOverTime ) { otCount++; if(otCount % overtimeDamageTime == 0) { for(i = 0; i < LMSData.Length; i++) { if(LMSData[i].PC.Pawn == None || LMSData[i].PC.PlayerReplicationInfo == None) continue; if(!LMSData[i].PC.PlayerReplicationInfo.bOnlySpectator) { LMSData[i].PC.Pawn.TakeDamage(overtimeDamage, none, empty, empty, class'DamType_Overtime_3SPN'); } } } } else if (roundTime > 0 && currentCount <= 0 && endCount <= 0) { GameReplicationInfo.bStopCountDown = false; if ( RemainingTime % 60 == 0 ) GameReplicationInfo.RemainingMinute = RemainingTime; RemainingTime--; GameReplicationInfo.RemainingTime = RemainingTime; if ( RemainingTime == 0 ) { bIsOvertime = true; for(c = Level.ControllerList; c != None; c = c.NextController) { if(PlayerController(c) != None) { PlayerController(c).PlayStatusAnnouncement('overtime', 1); } } } } else if ( (MaxLives > 0) && (NumPlayers + NumBots != 1) ) CheckMaxLives(none); ElapsedTime++; GameReplicationInfo.ElapsedTime = ElapsedTime; if(currentCount >= -1) { if(currentCount >= 0) bRespawning = true; if(currentCount > 1) { RestartPlayers(false); LockWeapons(); } if(currentCount == 1) { bRespawning = false; foreach AllActors(class'Actor', Reset) { if(xPawn(Reset) != None) { // if the pawn has no owner (is a ghost); destroy it if(xPawn(Reset).Health > 0 && (xPawn(Reset).Controller == None || xPawn(Reset).PlayerReplicationInfo == None)) xPawn(Reset).Destroy(); } } } if(currentCount == roundCountdown) { bEndOfRound = false; // go through all the actors, destroying/resetting unnecessary things as necessary (heh) foreach AllActors(class'Actor', Reset) { if(Reset.IsA('Mover')) { // it's a mover (lift, door, etc...); reset it Mover(Reset).Reset(); } else if(Reset.IsA('xPawn')) { // if the pawn has no owner (is a ghost); destroy it if(xPawn(Reset).Health > 0 && (xPawn(Reset).Controller == None || xPawn(Reset).PlayerReplicationInfo == None)) xPawn(Reset).Destroy(); } else if(Reset.IsA('Projectile')) { // it's a loose rocket, link primary, whatever; destroy it Projectile(Reset).Destroy(); } else if(Reset.IsA('Pickup')) { if(Reset.IsA('WeaponPickup')) { // it's a weapon pickup; reset it WeaponPickup(Reset).Reset(); } else { // it's a pickup (ammo, health, etc..); reset it Pickup(Reset).Reset(); } } else if(Reset.IsA('DECO_ExplodingBarrel')) { // it's an exploding barrel; reset it DECO_ExplodingBarrel(Reset).Reset(); } } } if(!bAllowPickups && currentCount > 0) SendRoundText(currentCount); if(currentCount == 0) { if(!bAllowPickups) PlayRoundMessage(); bStarted = True; bWeaponsLocked = false; bRespawning = false; UnlockWeapons(); currentRound++; } if(currentCount == -1) { UnlockWeapons(); } currentCount--; } else if(endCount >= 0) { GameReplicationInfo.bStopCountDown = true; if(endCount == 5) { bIsOvertime = false; AnnounceBest(); } endCount--; if(endCount == 0) { StartNewRound(); } } bAllowBehindView = true; ///////////////////////////////////////////// // Do nothing else if camper alarm is off. if(!bCamperAlarm) return; i=0; while(i < LMSData.Length && !bSentWarning) { //Log( "Checking: "$LMSData[i].PC.PlayerReplicationInfo.PlayerName ); // If controller has expired (eg. left the game), remove the guard. if( LMSData[i].PC == None ) { //Log("Expiring Camper Guard."); LMSData.Remove(i, 1); } else if( !LMSData[i].PC.PlayerReplicationinfo.bIsSpectator && LMSData[i].PC.PlayerReplicationInfo.bOutOfLives == false && LMSData[i].PC.Pawn != None) { // Always update LMSData[i].LocationHistory[LMSData[i].NextLocHistSlot] = LMSData[i].PC.Pawn.Location; LMSData[i].NextLocHistSlot++; if(LMSData[i].NextLocHistSlot == 10) { LMSData[i].NextLocHistSlot = 0; LMSData[i].bWarmedUp = true; } // If our history is full, work out how much player is moving about (find max AABB dimension). if(LMSData[i].bWarmedUp) { HistoryBox.Min.X = LMSData[i].LocationHistory[0].X; HistoryBox.Min.Y = LMSData[i].LocationHistory[0].Y; HistoryBox.Min.Z = LMSData[i].LocationHistory[0].Z; HistoryBox.Max.X = LMSData[i].LocationHistory[0].X; HistoryBox.Max.Y = LMSData[i].LocationHistory[0].Y; HistoryBox.Max.Z = LMSData[i].LocationHistory[0].Z; for(j=1; j<10; j++) { HistoryBox.Min.X = FMin( HistoryBox.Min.X , LMSData[i].LocationHistory[j].X ); HistoryBox.Min.Y = FMin( HistoryBox.Min.Y , LMSData[i].LocationHistory[j].Y ); HistoryBox.Min.Z = FMin( HistoryBox.Min.Z , LMSData[i].LocationHistory[j].Z ); HistoryBox.Max.X = FMax( HistoryBox.Max.X , LMSData[i].LocationHistory[j].X ); HistoryBox.Max.Y = FMax( HistoryBox.Max.Y , LMSData[i].LocationHistory[j].Y ); HistoryBox.Max.Z = FMax( HistoryBox.Max.Z , LMSData[i].LocationHistory[j].Z ); } // Find maximum dimension of box MaxDim = FMax(FMax(HistoryBox.Max.X - HistoryBox.Min.X, HistoryBox.Max.Y - HistoryBox.Min.Y), HistoryBox.Max.Z - HistoryBox.Min.Z); //Log("Box: "$HistoryBox.Max.X@HistoryBox.Max.Y@HistoryBox.Max.Z@HistoryBox.Min.X@HistoryBox.Min.Y@HistoryBox.Min.Z); //Log("Player: "$LMSData[i].PC.PlayerReplicationInfo.PlayerName$" MaxDim:"$MaxDim); // Dont warn the same person every second! if(MaxDim < CampThreshold && LMSData[i].ReWarnTime == 0) { //Log(LMSData[i].PC.PlayerReplicationInfo.PlayerName$" IS CAMPING! "$MaxDim); if(PlayerController(LMSData[i].PC) != None) { SendCamperWarning(PlayerController(LMSData[i].PC)); if(LMSData[i].PC.Pawn != None) LMSData[i].PC.Pawn.TakeDamage(LMSData[i].CampCount++ * CampDamage, none, empty, empty, class'DamType_Camping_3SPN'); } LMSData[i].ReWarnTime = ReCamperWarnInterval; bSentWarning=true; } else if(LMSData[i].ReWarnTime > 0) LMSData[i].ReWarnTime--; } i++; } else i++; } } // Timer() function beginstate() { local PlayerReplicationInfo PRI; ForEach DynamicActors(class'PlayerReplicationInfo',PRI) PRI.StartTime = 0; ElapsedTime = 0; RemainingTime = roundTime * 60; bWaitingToStartMatch = false; StartupStage = 5; PlayStartupMessage(); StartupStage = 6; } // beginstate() } // State MatchInProgress // Send camper message function SendCamperWarning(PlayerController Camper) { //local Controller P; local PlayerController Player; local int i; for(i = 0; i < LMSData.Length; i++) { Player = PlayerController(LMSData[i].PC); // No one camps in the first 25 seconds if (Player != None) { if (Level.TimeSeconds - Player.PlayerReplicationInfo.StartTime < 25) return; if(Player == Camper) Player.ReceiveLocalizedMessage(class'LMS_Message_3SPN', 0); else Player.ReceiveLocalizedMessage(class'LMS_Message_3SPN', 1, Camper.PlayerReplicationInfo); } } } // SendCamperWarning() function Killed(Controller Killer, Controller Killed, Pawn KilledPawn, class dT) { local float apk; apk = ADR_Kill; if(Killed != None) { Killed.PlayerReplicationInfo.bOutOfLives = true; Killed.PlayerReplicationInfo.numLives = 0; } if(healthPerKill > 0 && !bUTComp) if(!Killer.PlayerReplicationInfo.bOutOfLives && Killer.Pawn != None && Killed != Killer) Killer.Pawn.GiveHealth(healthPerKill, Killer.Pawn.SuperHealthMax); if(xPawn(Killer.Pawn) != None && xPawn(Killer.Pawn).CurrentCombo != None) ADR_Kill = 0; Super.Killed(Killer, Killed, KilledPawn, dT); ADR_Kill = apk; } // used to show 'player is out' message function NotifyKilled(Controller Killer, Controller Other, Pawn OtherPawn) { Super.NotifyKilled(Killer, Other, OtherPawn); if(Other == None) return; SendPlayerIsOutText(Other); } // NotifyKilled() // shows 'player is out' message function SendPlayerIsOutText(Controller Out) { local Controller P; local PlayerController Player; for(P = Level.ControllerList; P != None; P = P.nextController) { if(P.IsA('PlayerController')) { Player = PlayerController(P); if(Player != None && Player != PlayerController(Out)) { Player.ReceiveLocalizedMessage(class'Message_PlayerIsOut_3SPN', 0, Out.PlayerReplicationInfo); } else if(Player == PlayerController(Out)) { Player.ReceiveLocalizedMessage(class'Message_YouAreOut_3SPN'); } } } } // SendPlayerIsOutText() // check if player can spectate object function bool CanSpectate( PlayerController Viewer, bool bOnlySpectator, actor ViewTarget ) { if ( (ViewTarget == None) ) return false; if(!bOnlySpectator) { if(bRespawning || (endCount <= 1 && bEndOfRound)) return false; } if ( Controller(ViewTarget) != None ) { if ( Controller(ViewTarget).Pawn == None ) return false; return ((Controller(ViewTarget).PlayerReplicationInfo != None) && (ViewTarget != Viewer) && (!Controller(ViewTarget).PlayerReplicationInfo.bOutOfLives)); } return ( (Pawn(ViewTarget) != None) && Pawn(ViewTarget).IsPlayerPawn() && (!Pawn(ViewTarget).PlayerReplicationInfo.bOutOfLives) ); } // CanSpectate() // check for round ending condition function bool CheckMaxLives(PlayerReplicationInfo Scorer) { local int i; local Controller C; local PlayerReplicationInfo PRI,Winner; for (i = 0; i < LMSData.Length; i++) { C = LMSData[i].PC; PRI = C.PlayerReplicationInfo; if ( (PRI!=None) && !PRI.bOnlySpectator && !PRI.bOutOfLives ) { if ( Winner!=None ) { return false; } else { Winner = PRI; } } } if (Winner==None) { EndRound(Scorer); } else { EndRound(Winner); } return true; } // CheckMaxLives() // end of mid-round functions /////////////////////////////// ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// // end-round functions ////////////////////////////////////// // award the winner of the round function EndRound(PlayerReplicationInfo Scorer) { local LMSDataEntry temp; local int i; local int winnerindex; local PlayerReplicationInfo winner; temp.RoundsWon = 0; if(LMSData.Length <= 1 || (bStarted == false && !bAllowPickups)) return; if(bEndOfRound) return; bEndOfRound = true; // increment the rounds won of the winner for(i = 0; i < LMSData.Length; i++) { if(LMSData[i].PC.PlayerReplicationInfo != None && LMSData[i].PC.PlayerReplicationInfo == Scorer) { winnerindex = i; LMSData[i].RoundsWon++; if(LMSData[i].RoundsWon != roundsToWin) { SendWinLostText(LMSData[i]); } if(LMSData[i].PC.PlayerReplicationInfo.IsA('Game_PRI_3SPN')) Game_PRI_3SPN(LMSData[i].PC.PlayerReplicationInfo).RoundsWon = LMSData[i].RoundsWon; else if(bUTComp) LMSData[i].PC.PlayerReplicationInfo.Score += 100; temp = LMSData[i]; } } if(temp.RoundsWon >= roundsToWin) { log("Ending Game...", '3SPN'); winner = temp.PC.PlayerReplicationInfo; if(winner != None) { AnnounceBest(true); SendWinLostText(temp); EndGame(winner, "LastMan"); } } else { endCount = 5; } } // EndRound() // show who won the round function SendWinLostText(LMSDataEntry winner) { local Controller P; local PlayerController Player; for(P = Level.ControllerList; P != None; P = P.nextController) { if(P.IsA('PlayerController')) { Player = PlayerController(P); if(Player != None && Player != PlayerController(Winner.PC)) { if(winner.RoundsWon == roundsToWin) Player.ReceiveLocalizedMessage(class'Message_GameLost_3SPN', 0, Winner.PC.PlayerReplicationInfo); else Player.ReceiveLocalizedMessage(class'Message_RoundLost_3SPN', 0, Winner.PC.PlayerReplicationInfo); } else if(Player == PlayerController(Winner.PC)) { if(winner.RoundsWon == roundsToWin) Player.ReceiveLocalizedMessage(class'Message_GameWon_3SPN'); else Player.ReceiveLocalizedMessage(class'Message_RoundWon_3SPN'); } } } } // SendWinLostText() // end of end-round functions /////////////////////////////// ///////////////////////////////////////////////////////////// x+class LMS_BroadcastHandler_3SPN extends BroadcastHandler; /* Whether actor is allowed to broadcast messages now. */ function bool AllowsBroadcast( actor broadcaster, int Len ) { if ( bMuteSpectators && (PlayerController(Broadcaster) != None) && !PlayerController(Broadcaster).PlayerReplicationInfo.bAdmin && (PlayerController(Broadcaster).PlayerReplicationInfo.bOnlySpectator || PlayerController(Broadcaster).PlayerReplicationInfo.bOutOfLives) ) return false; SentText += Len; return ( (Level.Pauser != None) || (SentText < 400) ); } function Broadcast( Actor Sender, coerce string Msg, optional name Type ) { local Controller C; local PlayerController P; local PlayerReplicationInfo PRI; local Game_GRI_3SPN myGRI; foreach AllObjects(class'Game_GRI_3SPN', myGRI) break; // see if allowed (limit to prevent spamming) if ( !AllowsBroadcast(Sender, Len(Msg)) ) return; if ( Pawn(Sender) != None ) PRI = Pawn(Sender).PlayerReplicationInfo; else if ( Controller(Sender) != None ) PRI = Controller(Sender).PlayerReplicationInfo; if(myGRI.AM.bSpecsCanTalk == false) { if ( PRI.bOnlySpectator || PRI.bOutOfLives ) { For ( C=Level.ControllerList; C!=None; C=C.NextController ) { P = PlayerController(C); if ( (P != None) && (P.PlayerReplicationInfo.bOnlySpectator || P.PlayerReplicationInfo.bOutOfLives) ) BroadcastText(PRI, P, Msg, Type); } } else { For ( C=Level.ControllerList; C!=None; C=C.NextController ) { P = PlayerController(C); if ( P != None ) BroadcastText(PRI, P, Msg, Type); } } } else { for ( C=Level.ControllerList; C!=None; C=C.NextController ) { P = PlayerController(C); if ( P != None ) BroadcastText(PRI, P, Msg, Type); } } } function BroadcastTeam( Controller Sender, coerce string Msg, optional name Type ) { local Controller C; local PlayerController P; // see if allowed (limit to prevent spamming) if ( !AllowsBroadcast(Sender, Len(Msg)) ) return; if ( Sender.PlayerReplicationInfo.bOnlySpectator || Sender.PlayerReplicationInfo.bOutOfLives ) { For ( C=Level.ControllerList; C!=None; C=C.NextController ) { P = PlayerController(C); if ( (P != None) && (P.PlayerReplicationInfo.Team == Sender.PlayerReplicationInfo.Team) && (P.PlayerReplicationInfo.bOnlySpectator || P.PlayerReplicationInfo.bOutOfLives) ) BroadcastText(Sender.PlayerReplicationInfo, P, Msg, Type); } } else { For ( C=Level.ControllerList; C!=None; C=C.NextController ) { P = PlayerController(C); if ( (P != None) && (P.PlayerReplicationInfo.Team == Sender.PlayerReplicationInfo.Team) ) BroadcastText(Sender.PlayerReplicationInfo, P, Msg, Type); } } } aV`63b7E,ezVGB,ezVGB3},eUzVGB,ezVGBUzVGBUzVGB,e,e3},eUzVGB,ezVGB,e,eA0^,e weaponClass, out int killsw, out int deathsw) { local int i; killsw = 0; deathsw = 0; for(i = 0; i < PRI.WeaponStatsArray.Length; i++) { if(PRI.WeaponStatsArray[i].WeaponClass == weaponClass) { killsw = PRI.WeaponStatsArray[i].Kills; deathsw = PRI.WeaponStatsArray[i].DeathsHolding; } } } simulated event DrawScoreboard(Canvas C) { local Game_PRI_3SPN myPRI; local int namey; local int weapony; local int awardy; local int yjump; local int depth; local int width; local int wwidth; local int awidth; local int apos; local int AwardsNum; local int CombosNum; local int WeaponNum; local float xl; local float yl; local int i; local float wname; local float fired; local float hit; local float acc; local float dam; local float kill; local float eff; local string name; // all purpose string local int killsw; local int deathsw; local Color weaponBar; local Color awardBar; local Color nameBar; local Color white; if ( PlayerOwner == None ) { PlayerOwner = UnrealPlayer(Owner); if( PlayerOwner == None ) { Super.DrawScoreboard(C); return; } } if(Game_Player_3SPN(PlayerOwner).bUseOldStatsScreen) { Super.DrawScoreboard(C); return; } if(PRI == None || Game_Player_3SPN(PlayerOwner).bFirstOpen) { PRI = TeamPlayerReplicationInfo(PlayerOwner.PlayerReplicationInfo); if(PRI.bOnlySpectator) { if(Pawn(PlayerOwner.ViewTarget) != None) PRI = TeamPlayerReplicationInfo(Pawn(PlayerOwner.ViewTarget).PlayerReplicationInfo); else NextStats(); } if(PRI == None) { Super.DrawScoreboard(C); return; } Game_Player_3SPN(PlayerOwner).bFirstOpen = false; } if ( Level.TimeSeconds - LastUpdateTime > 2 ) { LastUpdateTime = Level.TimeSeconds; PlayerOwner.ServerUpdateStats(PRI); } white = HUDClass.default.WhiteColor; weaponBar = HUDClass.default.BlackColor; weaponBar.A = 150; awardBar = HUDClass.default.TurqColor * 0.6; awardBar.A = 150; myPRI = Game_PRI_3SPN(PRI); if(myPRI.Team == None || myPRI.Team.TeamIndex == 1) { nameBar = awardBar; } else { nameBar = HUDClass.default.RedColor * 0.75; nameBar.A = 150; } yjump = C.ClipY * 0.010; depth = C.ClipY * 0.030; width = C.ClipX * 0.95; wwidth = C.ClipX * 0.65; awidth = C.ClipX * 0.30; apos = C.ClipX - awidth; weapony = C.ClipY * 0.10; awardy = C.ClipY * 0.15; C.Style = ERenderstyle.STY_Alpha; // overview bar: depth = C.ClipY * 0.025; C.SetPos(0, weapony); C.DrawColor = weaponBar; C.DrawRect(fade, C.ClipX * 0.5, depth); C.SetPos(0, weapony); C.DrawColor = white; C.DrawRect(fade, C.ClipX * 0.5, 1); C.SetPos(0, weapony + depth - 1); C.DrawColor = white; C.DrawRect(fade, C.ClipX * 0.5, 1); C.SetPos(C.ClipX * 0.5, weapony); C.DrawColor = weaponBar; C.DrawRect(rfade, C.ClipX * 0.5, depth); C.SetPos(C.ClipX * 0.5, weapony); C.DrawColor = white; C.DrawRect(rfade, C.ClipX * 0.5, 1); C.SetPos(C.ClipX * 0.5, weapony + depth - 1); C.DrawColor = white; C.DrawRect(rfade, C.ClipX * 0.5, 1); // overview bar text: C.Font = PlayerOwner.myHUD.GetFontSizeIndex(C, -2); C.SetPos(C.ClipX * 0.07, weapony + 1); C.DrawColor = white; C.DrawText("Kills: "$PRI.Kills); C.SetPos(C.ClipX * 0.22, weapony + 1); C.DrawText("Deaths: "$int(PRI.Deaths)); C.SetPos(C.ClipX * 0.37, weapony + 1); C.DrawText("Suicides: "$PRI.Suicides); C.SetPos(C.ClipX * 0.52, weapony + 1); if((PRI.Deaths + PRI.Kills) <= 0) name = "0%"; else name = string(int((PRI.Kills / (PRI.Deaths + PRI.Kills) * 100.0)))$"%"; C.DrawText("Eff.: "$name); C.SetPos(C.ClipX * 0.67, weapony + 1); C.DrawText("Acc.: "$int(myPRI.Percent)$"%"); C.SetPos(C.ClipX * 0.82, weapony + 1); C.DrawText("Dam.: "$Min(9999, myPRI.WeaponDamage)); weapony = C.ClipY * 0.15; // bottom bar: depth = C.ClipY * 0.030; namey = C.ClipY * 0.985 - depth; C.SetPos(0, namey); C.DrawColor = nameBar; C.DrawRect(fade, width, depth); width = C.ClipX * 0.96; C.SetPos(0, namey); C.DrawColor = white; C.DrawRect(fade, width, 2); C.SetPos(0, namey + depth - 2); C.DrawColor = white; C.DrawRect(fade, width, 2); // bottom text: width = C.ClipX * 0.95; C.DrawColor = white; C.Font = PlayerOwner.myHUD.GetFontSizeIndex(C, -1); name = NextStatsString; C.StrLen(name, xl, yl); C.SetPos(width - xl - 10, namey + 1); C.DrawText(name, true); // name bar: namey = C.ClipY * 0.015; C.SetPos(0, namey); C.DrawColor = nameBar; C.DrawRect(fade, width, depth); width = C.ClipX * 0.96; C.SetPos(0, namey); C.DrawColor = white; C.DrawRect(fade, width, 2); C.SetPos(0, namey + depth - 2); C.DrawColor = white; C.DrawRect(fade, width, 2); // name text: width = C.ClipX * 0.95; C.DrawColor = white; C.Font = PlayerOwner.myHUD.GetFontSizeIndex(C, -1); name = myPRI.PlayerName; C.StrLen(name, xl, yl); C.SetPos(width - xl - 10, namey + 1); C.DrawText(name, true); width = C.ClipX * 0.60; depth = C.ClipY * 0.025; C.Font = PlayerOwner.myHUD.GetFontSizeIndex(C, -2); /////////////////////////////////////////// // awards if ( PRI.bFirstBlood ) AwardsNum++; for ( i=0; i<6; i++ ) if ( PRI.Spree[i] > 0 ) AwardsNum++; for ( i=0; i<7; i++ ) if ( PRI.MultiKills[i] > 0 ) AwardsNum++; if(PRI.flakcount >= 8) AwardsNum++; if(PRI.combocount >= 8) AwardsNum++; if(PRI.headcount >= 4) AwardsNum++; if(PRI.GoalsScored >= 3) AwardsNum++; if(PRI.GoalsScored > 0) AwardsNum++; if(myPRI.FlawlessNum > 0) AwardsNum++; if(myPRI.OverkillNum > 0) AwardsNum++; if(myPRI.DarkhorseNum > 0) AwardsNum++; // initial award bar: C.SetPos(apos, awardy); C.DrawColor = weaponBar; C.DrawRect(rfade, awidth, depth); C.SetPos(apos - (awidth * 0.015), awardy); C.DrawColor = white; C.DrawRect(rfade, awidth + (awidth * 0.015), 1); C.SetPos(apos - (awidth * 0.015), awardy + depth - 1); C.DrawRect(rfade, awidth + (awidth * 0.015), 1); C.DrawColor = white; C.SetPos(apos + (awidth * 0.03), awardy + 1); C.DrawText("Awards"); if(AwardsNum > 0) { for(i = 1; i <= AwardsNum; i++) { if(i % 2 == 0) { C.DrawColor = HUDClass.default.WhiteColor * 0.55; C.DrawColor.A = 150; } else { C.DrawColor = HUDClass.default.WhiteColor * 0.35; C.DrawColor.A = 128; } C.SetPos(apos, awardy + ((yjump + depth) * i)); C.DrawRect(rfade, awidth, depth); C.DrawColor = white; C.SetPos(apos - (awidth * 0.015), awardy + ((yjump + depth) * i)); C.DrawRect(rfade, awidth + (awidth * 0.015), 1); C.SetPos(apos - (awidth * 0.015), awardy + ((yjump + depth) * i) + depth - 1); C.DrawRect(rfade, awidth + (awidth * 0.015), 1); } awardy = awardy + yjump + depth; C.DrawColor = white; C.SetPos(apos + (awidth * 0.03), awardy + 1); if(PRI.bFirstBlood) { C.DrawText(FirstBloodString); awardy = awardy + yjump + depth; } C.SetPos(apos + (awidth * 0.03), awardy + 1); for(i = 0; i < 6; i++) { if(PRI.Spree[i] > 0) { C.DrawText(class'KillingSpreeMessage'.default.SelfSpreeNote[i]@MakeColorCode(HUDClass.default.GoldColor)$"x"$PRI.Spree[i]); awardy = awardy + yjump + depth; C.SetPos(apos + (awidth * 0.03), awardy + 1); } } C.SetPos(apos + (awidth * 0.03), awardy + 1); for(i = 0; i < 7; i++) { if(PRI.MultiKills[i] > 0) { C.DrawText(KillString[i]@MakeColorCode(HUDClass.default.GoldColor)$"x"$PRI.MultiKills[i]); awardy = awardy + yjump + depth; C.SetPos(apos + (awidth * 0.03), awardy + 1); } } C.SetPos(apos + (awidth * 0.03), awardy + 1); if(PRI.FlakCount >= 8) { C.DrawText(FlakMonkey); awardy = awardy + yjump + depth; } C.SetPos(apos + (awidth * 0.03), awardy + 1); if(PRI.ComboCount >= 8) { C.DrawText(ComboWhore); awardy = awardy + yjump + depth; } C.SetPos(apos + (awidth * 0.03), awardy + 1); if(PRI.headCount >= 4) { C.DrawText(HeadHunter); awardy = awardy + yjump + depth; } C.SetPos(apos + (awidth * 0.03), awardy + 1); if(PRI.GoalsScored > 0) { C.DrawText("Final Kill!"@MakeColorCode(HUDClass.default.GoldColor)$"x"$PRI.GoalsScored); awardy = awardy + yjump + depth; } C.SetPos(apos + (awidth * 0.03), awardy + 1); if(PRI.GoalsScored >= 3) { C.DrawText(HatTrick); awardy = awardy + yjump + depth; } C.SetPos(apos + (awidth * 0.03), awardy + 1); if(myPRI.FlawlessNum > 0) { C.DrawText("Flawless Victory!"@MakeColorCode(HUDClass.default.GoldColor)$"x"$myPRI.FlawlessNum); awardy = awardy + yjump + depth; } C.SetPos(apos + (awidth * 0.03), awardy + 1); if(myPRI.OverkillNum > 0) { C.DrawText("Overkill!"@MakeColorCode(HUDClass.default.GoldColor)$"x"$myPRI.OverkillNum); awardy = awardy + yjump + depth; } C.SetPos(apos + (awidth * 0.03), awardy + 1); if(myPRI.DarkhorseNum > 0) { C.DrawText("Dark Horse!"@MakeColorCode(HUDClass.default.GoldColor)$"x"$myPRI.DarkhorseNum); awardy = awardy + yjump + depth; } } // end of awards section /////////////////////////////////////////// /////////////////////////////////////////// // combos for (i = 0; i < 5; i++) if ( PRI.Combos[i] > 0 ) CombosNum++; awardy = awardy + yjump + depth; // initial combo bar: C.SetPos(apos, awardy); C.DrawColor = weaponBar; C.DrawRect(rfade, awidth, depth); C.SetPos(apos - (awidth * 0.015), awardy); C.DrawColor = white; C.DrawRect(rfade, awidth + (awidth * 0.015), 1); C.SetPos(apos - (awidth * 0.015), awardy + depth - 1); C.DrawRect(rfade, awidth + (awidth * 0.015), 1); C.DrawColor = white; C.SetPos(apos + (awidth * 0.03), awardy + 1); C.DrawText("Combos"); if(CombosNum > 0) { for(i = 1; i <= CombosNum; i++) { if(i % 2 == 0) { C.DrawColor = HUDClass.default.WhiteColor * 0.55; C.DrawColor.A = 150; } else { C.DrawColor = HUDClass.default.WhiteColor * 0.35; C.DrawColor.A = 128; } C.SetPos(apos, awardy + ((yjump + depth) * i)); C.DrawRect(rfade, awidth, depth); C.DrawColor = white; C.SetPos(apos - (awidth * 0.015), awardy + ((yjump + depth) * i)); C.DrawRect(rfade, awidth + (awidth * 0.015), 1); C.SetPos(apos - (awidth * 0.015), awardy + ((yjump + depth) * i) + depth - 1); C.DrawRect(rfade, awidth + (awidth * 0.015), 1); } awardy = awardy + yjump + depth; C.DrawColor = white; C.SetPos(apos + (awidth * 0.03), awardy + 1); for(i = 0; i < 5; i++) { if(PRI.Combos[i] > 0) { C.DrawText(ComboNames[i]@MakeColorCode(HUDClass.default.GoldColor)$"x"$PRI.Combos[i]); awardy = awardy + yjump + depth; C.SetPos(apos + (awidth * 0.03), awardy + 1); } } } // end of combos section /////////////////////////////////////////// /////////////////////////////////////////// // weapon stats // initial weapon bar: C.SetPos(0, weapony); C.DrawColor = weaponBar; C.DrawRect(fade, wwidth, depth); C.SetPos(0, weapony); C.DrawColor = white; width = wwidth * 1.01; C.DrawRect(fade, width, 1); C.SetPos(0, weapony + depth - 1); C.DrawColor = white; C.DrawRect(fade, width, 1); C.DrawColor = white; wname = width * 0.05; C.StrLen("Fired", xl, yl); fired = width * 0.30 + xl; C.StrLen("Hit", xl, yl); hit = width * 0.42 + xl; C.StrLen("Acc.", xl, yl); acc = width * 0.54 + xl; C.StrLen("Dam.", xl, yl); dam = width * 0.66 + xl; C.StrLen("Kills", xl, yl); kill = width * 0.78 + xl; C.StrLen("Eff.", xl, yl); eff = width * 0.90 + xl; // initial weapon bar text: // "Weapon" text C.SetPos(wname, weapony + 1); C.DrawText("Weapon", true); // "Fired" C.SetPos(width * 0.30, weapony + 1); C.DrawText("Fired", true); // "Hit" C.SetPos(width * 0.42, weapony + 1); C.DrawText("Hit", true); // "Acc." C.SetPos(width * 0.54, weapony + 1); C.DrawText("Acc.", true); // "Damage" C.SetPos(width * 0.66, weapony + 1); C.DrawText("Dam.", true); // "Kills" C.SetPos(width * 0.78, weapony + 1); C.DrawText("Kills", true); // "Eff." C.SetPos(width * 0.90, weapony + 1); C.DrawText("Eff.", true); WeaponNum = 0; GetStatsFor(class'ShieldGun', killsw, deathsw); if(killsw > 0 || myPRI.SGDamage > 0) WeaponNum++; if(myPRI.AssaultStats[0] > 0) WeaponNum++; if(myPRI.AssaultStats[2] > 0) WeaponNum++; if(myPRI.BioStats[0] > 0) WeaponNum++; if(myPRI.ShockStats[0] > 0) WeaponNum++; if(myPRI.ShockStats[2] > 0) WeaponNum++; if(myPRI.ComboStats[0] > 0) WeaponNum++; if(myPRI.LinkStats[0] > 0) WeaponNum++; if(myPRI.LinkStats[2] > 0) WeaponNum++; if(myPRI.MiniStats[0] > 0) WeaponNum++; if(myPRI.MiniStats[2] > 0) WeaponNum++; if(myPRI.FlakStats[0] > 0) WeaponNum++; if(myPRI.FlakStats[2] > 0) WeaponNum++; if(myPRI.RocketStats[0] > 0) WeaponNum++; if(myPRI.LightningStats[0] > 0) WeaponNum++; if(myPRI.Headshots > 0) WeaponNum++; for(i = 1; i <= WeaponNum; i++) { if(i % 2 == 0) { C.DrawColor = HUDClass.default.WhiteColor * 0.55; C.DrawColor.A = 150; } else { C.DrawColor = HUDClass.default.WhiteColor * 0.35; C.DrawColor.A = 128; } C.SetPos(0, weapony + ((yjump + depth) * i)); C.DrawRect(fade, wwidth, depth); C.DrawColor = white; C.SetPos(0, weapony + ((yjump + depth) * i)); C.DrawRect(fade, wwidth * 1.01, 1); C.SetPos(0, weapony + ((yjump + depth) * i) + depth - 1); C.DrawRect(fade, wwidth * 1.01, 1); } // shield gun: // bar: if(killsw > 0 || myPRI.SGDamage > 0) { weapony = weapony + yjump + depth; // text: C.DrawColor = white; C.SetPos(wname, weapony + 1); C.DrawText("Shield Gun:", true); // "Damage" name = string(myPRI.SGDamage); C.StrLen(name, xl, yl); C.SetPos(dam - xl, weapony + 1); C.DrawText(name, true); // "Kills" GetStatsFor(class'ShieldGun', killsw, deathsw); name = string(killsw); C.StrLen(name, xl, yl); C.SetPos(kill - xl, weapony + 1); C.DrawText(name, true); // "Eff." if(deathsw + killsw == 0) name = "0%"; else name = string(int((float(killsw) / float(deathsw + killsw)) * 100))$"%"; C.StrLen(name, xl, yl); C.SetPos(eff - xl, weapony + 1); C.DrawText(name, true); } // assault primary: // bar: if(myPRI.AssaultStats[0] > 0) { weapony = weapony + yjump + depth; // text: C.DrawColor = white; C.SetPos(wname, weapony + 1); C.DrawText("Assault Pri.:", true); // "Fired" name = string(myPRI.AssaultStats[0]); C.StrLen(name, xl, yl); C.SetPos(fired - xl, weapony + 1); C.DrawText(name, true); // "Hit" name = string(myPRI.AssaultStats[1]); C.StrLen(name, xl, yl); C.SetPos(hit - xl, weapony + 1); C.DrawText(name, true); // "Acc." name = string(GetPercentage(myPRI.AssaultStats[0], myPRI.AssaultStats[1])); C.StrLen(name, xl, yl); C.SetPos(acc - xl, weapony + 1); C.DrawText(name, true); // "Damage" name = string(myPRI.AssaultStats[4]); C.StrLen(name, xl, yl); C.SetPos(dam - xl, weapony + 1); C.DrawText(name, true); // "Kills" GetStatsFor(class'AssaultRifle', killsw, deathsw); name = string(killsw); C.StrLen(name, xl, yl); C.SetPos(kill - xl, weapony + 1); C.DrawText(name, true); // "Eff." if(deathsw + killsw == 0) name = "0%"; else name = string(int((float(killsw) / float(deathsw + killsw)) * 100))$"%"; C.StrLen(name, xl, yl); C.SetPos(eff - xl, weapony + 1); C.DrawText(name, true); } // assault alt: // bar: if(myPRI.AssaultStats[2] > 0) { weapony = weapony + yjump + depth; // text: C.DrawColor = white; C.SetPos(wname, weapony + 1); C.DrawText("Assault Alt.:", true); // "Fired" name = string(myPRI.AssaultStats[2]); C.StrLen(name, xl, yl); C.SetPos(fired - xl, weapony + 1); C.DrawText(name, true); // "Hit" name = string(myPRI.AssaultStats[3]); C.StrLen(name, xl, yl); C.SetPos(hit - xl, weapony + 1); C.DrawText(name, true); // "Acc." name = string(GetPercentage(myPRI.AssaultStats[2], myPRI.AssaultStats[3])); C.StrLen(name, xl, yl); C.SetPos(acc - xl, weapony + 1); C.DrawText(name, true); // "Damage" name = string(myPRI.AssaultStats[5]); C.StrLen(name, xl, yl); C.SetPos(dam - xl, weapony + 1); C.DrawText(name, true); } // bio: // bar: if(myPRI.BioStats[0] > 0) { weapony = weapony + yjump + depth; // text: C.DrawColor = white; C.SetPos(wname, weapony + 1); C.DrawText("Bio-Rifle:", true); // "Fired" name = string(myPRI.BioStats[0]); C.StrLen(name, xl, yl); C.SetPos(fired - xl, weapony + 1); C.DrawText(name, true); // "Hit" name = string(myPRI.BioStats[1]); C.StrLen(name, xl, yl); C.SetPos(hit - xl, weapony + 1); C.DrawText(name, true); // "Acc." name = string(GetPercentage(myPRI.BioStats[0], myPRI.BioStats[1])); C.StrLen(name, xl, yl); C.SetPos(acc - xl, weapony + 1); C.DrawText(name, true); // "Damage" name = string(myPRI.BioStats[2]); C.StrLen(name, xl, yl); C.SetPos(dam - xl, weapony + 1); C.DrawText(name, true); // "Kills" GetStatsFor(class'BioRifle', killsw, deathsw); name = string(killsw); C.StrLen(name, xl, yl); C.SetPos(kill - xl, weapony + 1); C.DrawText(name, true); // "Eff." if(deathsw + killsw == 0) name = "0%"; else name = string(int((float(killsw) / float(deathsw + killsw)) * 100))$"%"; C.StrLen(name, xl, yl); C.SetPos(eff - xl, weapony + 1); C.DrawText(name, true); } // shock primary: // bar: if(myPRI.ShockStats[0] > 0) { weapony = weapony + yjump + depth; // text: C.DrawColor = white; C.SetPos(wname, weapony + 1); C.DrawText("Shock Pri.:", true); // "Fired" name = string(myPRI.ShockStats[0]); C.StrLen(name, xl, yl); C.SetPos(fired - xl, weapony + 1); C.DrawText(name, true); // "Hit" name = string(myPRI.ShockStats[1]); C.StrLen(name, xl, yl); C.SetPos(hit - xl, weapony + 1); C.DrawText(name, true); // "Acc." name = string(GetPercentage(myPRI.ShockStats[0], myPRI.ShockStats[1])); C.StrLen(name, xl, yl); C.SetPos(acc - xl, weapony + 1); C.DrawText(name, true); // "Damage" name = string(myPRI.ShockStats[4]); C.StrLen(name, xl, yl); C.SetPos(dam - xl, weapony + 1); C.DrawText(name, true); // "Kills" GetStatsFor(class'ShockRifle', killsw, deathsw); name = string(killsw); C.StrLen(name, xl, yl); C.SetPos(kill - xl, weapony + 1); C.DrawText(name, true); // "Eff." if(deathsw + killsw == 0) name = "0%"; else name = string(int((float(killsw) / float(deathsw + killsw)) * 100))$"%"; C.StrLen(name, xl, yl); C.SetPos(eff - xl, weapony + 1); C.DrawText(name, true); } // shock alt: // bar: if(myPRI.ShockStats[2] > 0) { weapony = weapony + yjump + depth; // text: C.DrawColor = white; C.SetPos(wname, weapony + 1); C.DrawText("Shock Alt.:", true); // "Fired" name = string(myPRI.ShockStats[2]); C.StrLen(name, xl, yl); C.SetPos(fired - xl, weapony + 1); C.DrawText(name, true); // "Hit" name = string(myPRI.ShockStats[3]); C.StrLen(name, xl, yl); C.SetPos(hit - xl, weapony + 1); C.DrawText(name, true); // "Acc." name = string(GetPercentage(myPRI.ShockStats[2], myPRI.ShockStats[3])); C.StrLen(name, xl, yl); C.SetPos(acc - xl, weapony + 1); C.DrawText(name, true); // "Damage" name = string(myPRI.ShockStats[5]); C.StrLen(name, xl, yl); C.SetPos(dam - xl, weapony + 1); C.DrawText(name, true); } // shock combo: // bar: if(myPRI.ComboStats[0] > 0) { weapony = weapony + yjump + depth; // text: C.DrawColor = white; C.SetPos(wname, weapony + 1); C.DrawText("Shock Combo:", true); // "Fired" name = string(myPRI.ComboStats[0]); C.StrLen(name, xl, yl); C.SetPos(fired - xl, weapony + 1); C.DrawText(name, true); // "Hit" name = string(myPRI.ComboStats[1]); C.StrLen(name, xl, yl); C.SetPos(hit - xl, weapony + 1); C.DrawText(name, true); // "Acc." name = string(GetPercentage(myPRI.ComboStats[0], myPRI.ComboStats[1])); C.StrLen(name, xl, yl); C.SetPos(acc - xl, weapony + 1); C.DrawText(name, true); // "Dam." name = string(myPRI.ComboStats[2]); C.StrLen(name, xl, yl); C.SetPos(dam - xl, weapony + 1); C.DrawText(name, true); // "Kills" name = string(PRI.comboCount); C.StrLen(name, xl, yl); C.SetPos(kill - xl, weapony + 1); C.DrawText(name, true); } // link primary: // bar: if(myPRI.LinkStats[0] > 0) { weapony = weapony + yjump + depth; // text: C.DrawColor = white; C.SetPos(wname, weapony + 1); C.DrawText("Link Pri.:", true); // "Fired" name = string(myPRI.LinkStats[0]); C.StrLen(name, xl, yl); C.SetPos(fired - xl, weapony + 1); C.DrawText(name, true); // "Hit" name = string(myPRI.LinkStats[1]); C.StrLen(name, xl, yl); C.SetPos(hit - xl, weapony + 1); C.DrawText(name, true); // "Acc." name = string(GetPercentage(myPRI.LinkStats[0], myPRI.LinkStats[1])); C.StrLen(name, xl, yl); C.SetPos(acc - xl, weapony + 1); C.DrawText(name, true); // "Damage" name = string(myPRI.LinkStats[4]); C.StrLen(name, xl, yl); C.SetPos(dam - xl, weapony + 1); C.DrawText(name, true); // "Kills" GetStatsFor(class'LinkGun', killsw, deathsw); name = string(killsw); C.StrLen(name, xl, yl); C.SetPos(kill - xl, weapony + 1); C.DrawText(name, true); // "Eff." if(deathsw + killsw == 0) name = "0%"; else name = string(int((float(killsw) / float(deathsw + killsw)) * 100))$"%"; C.StrLen(name, xl, yl); C.SetPos(eff - xl, weapony + 1); C.DrawText(name, true); } // link alt: // bar: if(myPRI.LinkStats[2] > 0) { weapony = weapony + yjump + depth; // text: C.DrawColor = white; C.SetPos(wname, weapony + 1); C.DrawText("Link Alt.:", true); // "Fired" name = string(myPRI.LinkStats[2]); C.StrLen(name, xl, yl); C.SetPos(fired - xl, weapony + 1); C.DrawText(name, true); // "Hit" name = string(myPRI.LinkStats[3]); C.StrLen(name, xl, yl); C.SetPos(hit - xl, weapony + 1); C.DrawText(name, true); // "Acc." name = string(GetPercentage(myPRI.LinkStats[2], myPRI.LinkStats[3])); C.StrLen(name, xl, yl); C.SetPos(acc - xl, weapony + 1); C.DrawText(name, true); // "Damage" name = string(myPRI.LinkStats[5]); C.StrLen(name, xl, yl); C.SetPos(dam - xl, weapony + 1); C.DrawText(name, true); } // mini primary: // bar: if(myPRI.MiniStats[0] > 0) { weapony = weapony + yjump + depth; // text: C.DrawColor = white; C.SetPos(wname, weapony + 1); C.DrawText("Mini Pri.:", true); // "Fired" name = string(myPRI.MiniStats[0]); C.StrLen(name, xl, yl); C.SetPos(fired - xl, weapony + 1); C.DrawText(name, true); // "Hit" name = string(myPRI.MiniStats[1]); C.StrLen(name, xl, yl); C.SetPos(hit - xl, weapony + 1); C.DrawText(name, true); // "Acc." name = string(GetPercentage(myPRI.MiniStats[0], myPRI.MiniStats[1])); C.StrLen(name, xl, yl); C.SetPos(acc - xl, weapony + 1); C.DrawText(name, true); // "Damage" name = string(myPRI.MiniStats[4]); C.StrLen(name, xl, yl); C.SetPos(dam - xl, weapony + 1); C.DrawText(name, true); // "Kills" GetStatsFor(class'MiniGun', killsw, deathsw); name = string(killsw); C.StrLen(name, xl, yl); C.SetPos(kill - xl, weapony + 1); C.DrawText(name, true); // "Eff." if(deathsw + killsw == 0) name = "0%"; else name = string(int((float(killsw) / float(deathsw + killsw)) * 100))$"%"; C.StrLen(name, xl, yl); C.SetPos(eff - xl, weapony + 1); C.DrawText(name, true); } // mini alt: // bar: if(myPRI.MiniStats[2] > 0) { weapony = weapony + yjump + depth; // text: C.DrawColor = white; C.SetPos(wname, weapony + 1); C.DrawText("Mini Alt.:", true); // "Fired" name = string(myPRI.MiniStats[2]); C.StrLen(name, xl, yl); C.SetPos(fired - xl, weapony + 1); C.DrawText(name, true); // "Hit" name = string(myPRI.MiniStats[3]); C.StrLen(name, xl, yl); C.SetPos(hit - xl, weapony + 1); C.DrawText(name, true); // "Acc." name = string(GetPercentage(myPRI.MiniStats[2], myPRI.MiniStats[3])); C.StrLen(name, xl, yl); C.SetPos(acc - xl, weapony + 1); C.DrawText(name, true); // "Damage" name = string(myPRI.MiniStats[5]); C.StrLen(name, xl, yl); C.SetPos(dam - xl, weapony + 1); C.DrawText(name, true); } // flak primary: // bar: if(myPRI.FlakStats[0] > 0) { weapony = weapony + yjump + depth; // text: C.DrawColor = white; C.SetPos(wname, weapony + 1); C.DrawText("Flak Pri.:", true); // "Fired" name = string(myPRI.FlakStats[0]); C.StrLen(name, xl, yl); C.SetPos(fired - xl, weapony + 1); C.DrawText(name, true); // "Hit" name = string(myPRI.FlakStats[1]); C.StrLen(name, xl, yl); C.SetPos(hit - xl, weapony + 1); C.DrawText(name, true); // "Acc." name = string(GetPercentage(myPRI.FlakStats[0], myPRI.FlakStats[1])); C.StrLen(name, xl, yl); C.SetPos(acc - xl, weapony + 1); C.DrawText(name, true); // "Damage" name = string(myPRI.FlakStats[4]); C.StrLen(name, xl, yl); C.SetPos(dam - xl, weapony + 1); C.DrawText(name, true); // "Kills" GetStatsFor(class'FlakCannon', killsw, deathsw); name = string(killsw); C.StrLen(name, xl, yl); C.SetPos(kill - xl, weapony + 1); C.DrawText(name, true); // "Eff." if(deathsw + killsw == 0) name = "0%"; else name = string(int((float(killsw) / float(deathsw + killsw)) * 100))$"%"; C.StrLen(name, xl, yl); C.SetPos(eff - xl, weapony + 1); C.DrawText(name, true); } // flak alt: // bar: if(myPRI.FlakStats[2] > 0) { weapony = weapony + yjump + depth; // text: C.DrawColor = white; C.SetPos(wname, weapony + 1); C.DrawText("Flak Alt.:", true); // "Fired" name = string(myPRI.FlakStats[2]); C.StrLen(name, xl, yl); C.SetPos(fired - xl, weapony + 1); C.DrawText(name, true); // "Hit" name = string(myPRI.FlakStats[3]); C.StrLen(name, xl, yl); C.SetPos(hit - xl, weapony + 1); C.DrawText(name, true); // "Acc." name = string(GetPercentage(myPRI.FlakStats[2], myPRI.FlakStats[3])); C.StrLen(name, xl, yl); C.SetPos(acc - xl, weapony + 1); C.DrawText(name, true); // "Damage" name = string(myPRI.FlakStats[5]); C.StrLen(name, xl, yl); C.SetPos(dam - xl, weapony + 1); C.DrawText(name, true); } // rockets: // bar: if(myPRI.RocketStats[0] > 0) { weapony = weapony + yjump + depth; // text: C.DrawColor = white; C.SetPos(wname, weapony + 1); C.DrawText("Rockets:", true); // "Fired" name = string(myPRI.RocketStats[0]); C.StrLen(name, xl, yl); C.SetPos(fired - xl, weapony + 1); C.DrawText(name, true); // "Hit" name = string(myPRI.RocketStats[1]); C.StrLen(name, xl, yl); C.SetPos(hit - xl, weapony + 1); C.DrawText(name, true); // "Acc." name = string(GetPercentage(myPRI.RocketStats[0], myPRI.RocketStats[1])); C.StrLen(name, xl, yl); C.SetPos(acc - xl, weapony + 1); C.DrawText(name, true); // "Damage" name = string(myPRI.RocketStats[2]); C.StrLen(name, xl, yl); C.SetPos(dam - xl, weapony + 1); C.DrawText(name, true); // "Kills" GetStatsFor(class'RocketLauncher', killsw, deathsw); name = string(killsw); C.StrLen(name, xl, yl); C.SetPos(kill - xl, weapony + 1); C.DrawText(name, true); // "Eff." if(deathsw + killsw == 0) name = "0%"; else name = string(int((float(killsw) / float(deathsw + killsw)) * 100))$"%"; C.StrLen(name, xl, yl); C.SetPos(eff - xl, weapony + 1); C.DrawText(name, true); } // lightning: // bar: if(myPRI.LightningStats[0] > 0) { weapony = weapony + yjump + depth; // text: C.DrawColor = white; C.SetPos(wname, weapony + 1); C.DrawText("Lightning:", true); // "Fired" name = string(myPRI.LightningStats[0]); C.StrLen(name, xl, yl); C.SetPos(fired - xl, weapony + 1); C.DrawText(name, true); // "Hit" name = string(myPRI.LightningStats[1]); C.StrLen(name, xl, yl); C.SetPos(hit - xl, weapony + 1); C.DrawText(name, true); // "Acc." name = string(GetPercentage(myPRI.LightningStats[0], myPRI.LightningStats[1])); C.StrLen(name, xl, yl); C.SetPos(acc - xl, weapony + 1); C.DrawText(name, true); // "Damage" name = string(myPRI.LightningStats[2]); C.StrLen(name, xl, yl); C.SetPos(dam - xl, weapony + 1); C.DrawText(name, true); // "Kills" GetStatsFor(class'SniperRifle', killsw, deathsw); name = string(killsw); C.StrLen(name, xl, yl); C.SetPos(kill - xl, weapony + 1); C.DrawText(name, true); // "Eff." if(deathsw + killsw == 0) name = "0%"; else name = string(int((float(killsw) / float(deathsw + killsw)) * 100))$"%"; C.StrLen(name, xl, yl); C.SetPos(eff - xl, weapony + 1); C.DrawText(name, true); } // headshots: // bar: if(myPRI.Headshots > 0) { weapony = weapony + yjump + depth; // text: C.DrawColor = white; C.SetPos(wname, weapony + 1); C.DrawText("Headshots:", true); // "Hit" name = string(myPRI.Headshots); C.StrLen(name, xl, yl); C.SetPos(hit - xl, weapony + 1); C.DrawText(name, true); // "Damage" name = string(myPRI.Headshots * 140); C.StrLen(name, xl, yl); C.SetPos(dam - xl, weapony + 1); C.DrawText(name, true); // "Kills" name = string(PRI.headcount); C.StrLen(name, xl, yl); C.SetPos(kill - xl, weapony + 1); C.DrawText(name, true); } } }class Game_Rules_3SPN extends GameRules; #exec AUDIO IMPORT FILE=Sounds\HitSound.wav GROUP=Sounds var sound FriendlyHitSound, HitSound; var Game_GRI_3SPN myGRI; event PreBeginPlay() { } function int NetDamage(int OriginalDamage, int Damage, pawn injured, pawn instigatedBy, vector HitLocation, out vector Momentum, class DamageType) { local bool LoS; local bool bOverkill; local Game_PRI_3SPN PRI; local Game_PRI_3SPN injuredPRI; local float Score; local int prevDam; local int sHP; local int sAP; local float apk; if(myGRI == None) foreach AllObjects(class'Game_GRI_3SPN', myGRI) break; if(myGRI.gamename == "3SPN-LMS") { if(LMS_Game_3SPN(Level.Game).bWeaponsLocked && !LMS_Game_3SPN(Level.Game).bAllowPickups) return 0; sHP = myGRI.AM.startingHealth; sAP = myGRI.AM.startingArmor; apk = myGRI.AM.adrenalinePerKill / 3.0; } else if(myGRI.gamename == "3SPN-TDM") { if(TDM_Game_3SPN(Level.Game).bWeaponsLocked && !TDM_Game_3SPN(Level.Game).bAllowPickups) return 0; sHP = myGRI.TAM.startingHealth; sAP = myGRI.TAM.startingArmor; apk = myGRI.TAM.adrenalinePerKill / 3.0; } if(instigatedBy == None) { if(DamageType.default.bDelayedDamage) instigatedBy = injured.DelayedDamageInstigatorController.Pawn; if(instigatedBy == None) { if(NextGameRules != None) return NextGameRules.NetDamage( OriginalDamage,Damage,injured,instigatedBy,HitLocation,Momentum,DamageType ); return Damage; } } // hitsounds section if(!myGRI.bUTComp) { LoS = LineOfSight(Injured, InstigatedBy); if (LoS && (injured.Controller != None) && (instigatedby.IsA('Game_Pawn_3SPN')) && (instigatedby.playerreplicationinfo.team != None) && (injured.playerreplicationinfo.team != None) && (injured.playerreplicationinfo.team == instigatedby.playerreplicationinfo.team) && (damage>0) && (Injured != InstigatedBy)) { if(!myGRI.bDisableHitsounds && InstigatedBy.Controller.IsA('PlayerController')) Game_Pawn_3SPN(instigatedby).clientplaysound(FriendlyHitSound, true, 1.2,, Damage); } else if (LoS && (instigatedby.IsA('Game_Pawn_3SPN')) && (Damage >0) && (instigatedby != Injured)) { if(!myGRI.bDisableHitsounds && InstigatedBy.Controller.IsA('PlayerController')) Game_Pawn_3SPN(instigatedby).clientplaysound(HitSound, true, 1.2,, Damage); } } // end of hitsounds section // reverse FF section // if a teammate was hit for greater than 0 damage, give the damage to the instigator if(myGRI.TAM.bReverseFF && instigatedBy.PlayerReplicationInfo.Team != None && injured.PlayerReplicationInfo.Team != None && instigatedBy.PlayerReplicationInfo.Team == injured.PlayerReplicationInfo.Team && damage > 0 && injured != instigatedBy) { instigatedBy.TakeDamage(damage, instigatedBy, HitLocation, Momentum, DamageType); damage = 0; } // end of reverse FF section // weapon stats section if(!myGRI.bUTComp) { // overkillitude if(damage > ((injured.Health + injured.ShieldStrength) + 50) && damage / (injured.Health + injured.ShieldStrength) > 2) bOverkill = true; if((instigatedBy != None) && (instigatedby != injured) && (instigatedby.Controller != None) && (instigatedBy.PlayerReplicationInfo != None)) { PRI = Game_PRI_3SPN(instigatedBy.PlayerReplicationInfo); prevDam = PRI.WeaponDamage; if(bOverkill || damage < (injured.Health + injured.ShieldStrength)) PRI.WeaponDamage += Damage; else PRI.WeaponDamage += (injured.Health + injured.ShieldStrength); if(DamageType == Class'DamTypeShieldImpact') { PRI.SGDamage += Damage; } else if (DamageType == Class'DamTypeAssaultBullet') { PRI.AssaultStats[1] += 1; PRI.AssaultStats[4] += Damage; } else if(DamageType == Class'DamTypeAssaultGrenade') { PRI.AssaultStats[3] += 1; PRI.assaultStats[5] += Damage; } else if(DamageType == Class'DamTypeBioGlob') { PRI.BioStats[1] += 1; PRI.BioStats[2] += Damage; } else if(DamageType == Class'DamTypeShockBeam') { PRI.ShockStats[1] += 1; PRI.ShockStats[4] += Damage; } else if(DamageType == Class'DamTypeShockBall') { PRI.ShockStats[3] += 1; PRI.ShockStats[5] += Damage; } else if(DamageType == Class'DamType_ShockCombo_3SPN') { PRI.ComboStats[1] += 1; PRI.ComboStats[2] += Damage; } else if(DamageType == Class'DamTypeLinkPlasma') { PRI.LinkStats[1] += 1; PRI.LinkStats[4] += Damage; } else if(DamageType == Class'DamTypeLinkShaft') { PRI.linkStats[3] += 1; PRI.linkStats[5] += Damage; } else if(DamageType == Class'DamTypeMinigunBullet') { PRI.miniStats[1] += 1; PRI.miniStats[4] += Damage; } else if(DamageType == Class'DamTypeMinigunAlt') { PRI.miniStats[3] += 1; PRI.miniStats[5] += Damage; } else if(DamageType == Class'DamType_FlakChunk_3SPN') { PRI.flakStats[1] += 1; PRI.flakStats[4] += Damage; } else if(DamageType == Class'DamType_FlakShell_3SPN') { PRI.flakStats[3] += 1; PRI.flakStats[5] += Damage; } else if(DamageType == Class'DamTypeRocket') { PRI.rocketStats[1] += 1; PRI.rocketStats[2] += Damage; } else if(DamageType == Class'DamTypeRocketHoming') { PRI.rocketStats[1] += 1; PRI.rocketStats[2] += Damage; } else if(DamageType == Class'DamTypeSniperShot') { PRI.LightningStats[1] += 1; PRI.LightningStats[2] += Damage; } else if(DamageType == Class'DamType_Headshot_3SPN') { PRI.LightningStats[1] += 1; PRI.LightningStats[2] += Damage; PRI.Headshots++; } } // end of weapon stats section // alternate scoring shizzle if(!myGRI.bUTComp) { PRI = Game_PRI_3SPN(instigatedBy.PlayerReplicationInfo); injuredPRI = Game_PRI_3SPN(injured.PlayerReplicationInfo); if(PRI != None && injuredPRI != None && PRI != injuredPRI) { if(PRI.Team == None || (PRI.Team != None && (PRI.Team.TeamIndex != injuredPRI.Team.TeamIndex))) { Score = (prevDam / ((sHP + sAP) / 2)); if((PRI.WeaponDamage / ((sHP + sAP) / 2)) > Score) { Score = (PRI.WeaponDamage / ((sHP + sAP) / 2)) - Score; PRI.Score += Score; if(xPawn(instigatedBy) != None && xPawn(instigatedBy).CurrentCombo == None) instigatedBy.Controller.AwardAdrenaline(Score * apk); } if(bOverkill) { if(instigatedBy.Controller.IsA('PlayerController')) PlayerController(instigatedBy.Controller).ReceiveLocalizedMessage(class'Message_Overkill_3SPN'); PRI.OverkillNum++; } } } } // buh } if ( NextGameRules != None ) return NextGameRules.NetDamage(OriginalDamage, Damage, injured, instigatedBy, HitLocation, Momentum, DamageType); return Damage; } function bool LineOfSight(Pawn target1, Pawn target2) { local Vector v1, v2; local Vector hitloc, hitnormal; v1 = target1.location; v1.z += target1.eyeheight; v2 = target2.location; v2.z += target2.eyeheight; return (Trace(hitloc, hitnormal, v1, v2, false) == None); } n?class Game_PRI_3SPN extends xPlayerReplicationInfo; // weapon shot statistics // 0 = primary shots fired, 1 = primary shots hit, 2 = alt shots fired, 3 = alt shots hit // 4 = damage done with primary fire, 5 = damage done with alt fire var int SGDamage; var int AssaultStats[6]; var int BioStats[3]; var int ShockStats[6]; var int LinkStats[6]; var int MiniStats[6]; var int FlakStats[6]; var int RocketStats[3]; var int LightningStats[3]; var int ComboStats[3]; // hit percentages: var float AssaultPercent[2]; var float BioPercent; var float ShockPercent[2]; var float LinkPercent[2]; var float MiniPercent[2]; var float FlakPercent[2]; var float RocketPercent; var float LightningPercent; var float ComboPercent; var int Headshots; var int WeaponDamage; var float Percent; // fdaslk var int RoundsWon; var int FlawlessNum; var int OverkillNum; var int DarkhorseNum; var int DeathTime; var bool bBrightskins; var int HP; var int AP; var int startHP; var int startAP; replication { reliable if(bNetDirty && (Role == ROLE_Authority)) RoundsWon, DeathTime, HP, AP, bBrightskins, startHP, startAP; } function ClearStats() { } function CalculateHitStats() { local float percentage; local int count; percentage = 0.0; count = 0; // calculate percentages if(AssaultStats[0] != 0) { AssaultPercent[0] = (float(AssaultStats[1]) / float(AssaultStats[0])) * 100.0f; percentage += AssaultPercent[0]; ++count; } else AssaultPercent[0] = 0; if(AssaultStats[2] != 0) { AssaultPercent[1] = (float(AssaultStats[3]) / float(AssaultStats[2])) * 100.0f; percentage += AssaultPercent[1]; ++count; } else AssaultPercent[1] = 0; if(BioStats[0] != 0) { BioPercent = (float(BioStats[1]) / float(BioStats[0])) * 100.0f; percentage += BioPercent; ++count; } else BioPercent = 0; if(ShockStats[0] != 0) { ShockPercent[0] = (float(ShockStats[1]) / float(ShockStats[0])) * 100.0f; percentage += ShockPercent[0]; ++count; } else ShockPercent[0] = 0; if(ShockStats[2] != 0) { ShockPercent[1] = (float(ShockStats[3]) / float(ShockStats[2])) * 100.0f; percentage += ShockPercent[1]; ++count; } else ShockPercent[1] = 0; if(LinkStats[0] != 0) { LinkPercent[0] = (float(LinkStats[1]) / float(LinkStats[0])) * 100.0f; percentage += LinkPercent[0]; ++count; } else LinkPercent[0] = 0; if(LinkStats[2] != 0) { LinkPercent[1] = (float(LinkStats[3]) / float(LinkStats[2])) * 100.0f; percentage += LinkPercent[1]; ++count; } else LinkPercent[1] = 0; if(MiniStats[0] != 0) { MiniPercent[0] = (float(MiniStats[1]) / float(MiniStats[0])) * 100.0f; percentage += MiniPercent[0]; ++count; } else MiniPercent[0] = 0; if(MiniStats[2] != 0) { MiniPercent[1] = (float(MiniStats[3]) / float(MiniStats[2])) * 100.0f; percentage += MiniPercent[1]; ++count; } else MiniPercent[1] = 0; if(FlakStats[0] != 0) { FlakPercent[0] = (float(FlakStats[1]) / float(FlakStats[0])) * 100.0f; percentage += FlakPercent[0]; ++count; } else FlakPercent[0] = 0; if(FlakStats[2] != 0) { FlakPercent[1] = (float(FlakStats[3]) / float(FlakStats[2])) * 100.0f; percentage += FlakPercent[1]; ++count; } else FlakPercent[1] = 0; if(RocketStats[0] != 0) { RocketPercent = (float(RocketStats[1]) / float(RocketStats[0])) * 100.0f; percentage += RocketPercent; ++count; } else RocketPercent = 0; if(LightningStats[0] != 0) { LightningPercent = (float(LightningStats[1]) / float(LightningStats[0])) * 100.0f; percentage += LightningPercent; ++count; } else LightningPercent = 0; if(ComboStats[0] != 0) { ComboPercent = (float(ComboStats[1]) / float(ComboStats[0])) * 100.0f; percentage += ComboPercent; ++count; } else ComboPercent = 0; if(count > 0) percentage = percentage / count; else percentage = 0; percentage = FMin(percentage, 100.0); Percent = percentage; } `class Game_Player_3SPN extends xPlayer; // general and misc: var() config bool bAnnounceOverkill; var() config bool bAutoScreenshot; var() config bool bDisableSpeed; var() config bool bDisableBooster; var() config bool bDisableBerserk; var() config bool bDisableInvis; var() config bool bEnableHitsounds; var() config bool bFirstPlay; var() bool bBrightskins; var() bool bTakenSS; // hud settings: var() config bool bSmallerInfoBoxes; var() config bool bDisableAnnouncement; var() config bool bShowHUDScorebar; var() config bool bShowTeamHUDScorebar; var() config bool bShowTeamLocation; var() config bool bShowMyLocation; var() config bool bShowEnemyBox; var() config bool bMatchHUDToSkins; // matches the hud color to the brightskins var() config bool bUseOldStatsScreen; var() bool bFirstOpen; // used for the stats screen // brightskins settings: var() config bool bEnableBrightskins; var() config bool bEnemyAllyColors; var() config Color RedOrEnemy; var() config Color BlueOrAlly; var int spree; var() Game_GRI_3SPN myGRI; replication { reliable if(Role < Role_Authority) ChangeMap, CallTimeout; reliable if(Role == ROLE_Authority) KillBases, SetBrightskins, ResetClock, SwitchCombos, SetupCombos, LockWeapons, UnlockWeapons, ListBest, ClientSendAssaultStats, ClientSendBioStats, ClientSendShockStats, ClientSendLinkStats, ClientSendMiniStats, ClientSendFlakStats, ClientSendRocketStats, ClientSendLightningStats, ClientSendComboStats, ClientSendMiscStats; reliable if(Role == ROLE_Authority) bBrightskins; } exec function Suicide() { if(Pawn != None) Pawn.Suicide(); } function CopyArrayA(out int a[6], int b[6]) { local int i; for(i = 0; i < 6; i++) { a[i] = b[i]; } } function CopyArrayB(out int a[3], int b[3]) { local int i; for(i = 0; i < 3; i++) { a[i] = b[i]; } } simulated function PlayCustomRewardAnnouncement(sound ASound, byte AnnouncementLevel, optional bool bForce) { local float Atten; // Wait for player to be up to date with replication when joining a server, before stacking up messages if ( Level.NetMode == NM_DedicatedServer || GameReplicationInfo == None ) return; if ( (AnnouncementLevel > AnnouncerLevel) || (RewardAnnouncer == None) ) return; if ( !bForce && (Level.TimeSeconds - LastPlaySound < 1) ) return; LastPlaySound = Level.TimeSeconds; // so voice messages won't overlap LastPlaySpeech = Level.TimeSeconds; // don't want chatter to overlap announcements Atten = 2.0 * FClamp(0.1 + float(AnnouncerVolume)*0.225,0.2,1.0); if ( ASound != None ) ClientPlaySound(ASound,true,Atten,SLOT_Talk); } function ServerUpdateStatArrays(TeamPlayerReplicationInfo PRI) { local Game_PRI_3SPN p; local int a[6]; local int b[3]; Super.ServerUpdateStatArrays(PRI); if(PRI.IsA('Game_PRI_3SPN')) { p = Game_PRI_3SPN(PRI); CopyArrayA(a, p.AssaultStats); ClientSendAssaultStats(p, a[0], a[1], a[2], a[3], a[4], a[5]); CopyArrayB(b, p.BioStats); ClientSendBioStats(p, b[0], b[1], b[2]); CopyArrayA(a, p.ShockStats); ClientSendShockStats(p, a[0], a[1], a[2], a[3], a[4], a[5]); CopyArrayA(a, p.LinkStats); ClientSendLinkStats(p, a[0], a[1], a[2], a[3], a[4], a[5]); CopyArrayA(a, p.MiniStats); ClientSendMiniStats(p, a[0], a[1], a[2], a[3], a[4], a[5]); CopyArrayA(a, p.FlakStats); ClientSendFlakStats(p, a[0], a[1], a[2], a[3], a[4], a[5]); CopyArrayB(b, p.RocketStats); ClientSendRocketStats(p, b[0], b[1], b[2]); CopyArrayB(b, p.LightningStats); ClientSendLightningStats(p, b[0], b[1], b[2]); CopyArrayB(b, p.ComboStats); ClientSendComboStats(p, b[0], b[1], b[2]); ClientSendMiscStats(p, p.Headshots, p.WeaponDamage, p.Percent, p.FlawlessNum, p.OverkillNum, p.DarkhorseNum, p.SGDamage); } } function ClientSendAssaultStats(Game_PRI_3SPN p, int a, int b, int c, int d, int e, int f) { p.AssaultStats[0] = a; p.AssaultStats[1] = b; p.AssaultStats[2] = c; p.AssaultStats[3] = d; p.AssaultStats[4] = e; p.AssaultStats[5] = f; } function ClientSendBioStats(Game_PRI_3SPN p, int a, int b, int c) { p.BioStats[0] = a; p.BioStats[1] = b; p.BioStats[2] = c; } function ClientSendShockStats(Game_PRI_3SPN p, int a, int b, int c, int d, int e, int f) { p.ShockStats[0] = a; p.ShockStats[1] = b; p.ShockStats[2] = c; p.ShockStats[3] = d; p.ShockStats[4] = e; p.ShockStats[5] = f; } function ClientSendLinkStats(Game_PRI_3SPN p, int a, int b, int c, int d, int e, int f) { p.LinkStats[0] = a; p.LinkStats[1] = b; p.LinkStats[2] = c; p.LinkStats[3] = d; p.LinkStats[4] = e; p.LinkStats[5] = f; } function ClientSendMiniStats(Game_PRI_3SPN p, int a, int b, int c, int d, int e, int f) { p.MiniStats[0] = a; p.MiniStats[1] = b; p.MiniStats[2] = c; p.MiniStats[3] = d; p.MiniStats[4] = e; p.MiniStats[5] = f; } function ClientSendFlakStats(Game_PRI_3SPN p, int a, int b, int c, int d, int e, int f) { p.FlakStats[0] = a; p.FlakStats[1] = b; p.FlakStats[2] = c; p.FlakStats[3] = d; p.FlakStats[4] = e; p.FlakStats[5] = f; } function ClientSendRocketStats(Game_PRI_3SPN p, int a, int b, int c) { p.RocketStats[0] = a; p.RocketStats[1] = b; p.RocketStats[2] = c; } function ClientSendLightningStats(Game_PRI_3SPN p, int a, int b, int c) { p.LightningStats[0] = a; p.LightningStats[1] = b; p.LightningStats[2] = c; } function ClientSendComboStats(Game_PRI_3SPN p, int a, int b, int c) { p.ComboStats[0] = a; p.ComboStats[1] = b; p.ComboStats[2] = c; } function ClientSendMiscStats(Game_PRI_3SPN p, int Headshots, int WeaponDamage, float Percent, int Flawless, int Overkills, int DH, int SG) { p.Headshots = Headshots; p.WeaponDamage = WeaponDamage; p.Percent = Percent; p.FlawlessNum = Flawless; p.OverkillNum = Overkills; p.DarkhorseNum = DH; p.SGDamage = SG; } //spectating player wants to become active and join the game function BecomeActivePlayer() { if (Role < ROLE_Authority) return; if ( !Level.Game.AllowBecomeActivePlayer(self) ) return; bBehindView = false; FixFOV(); ServerViewSelf(); PlayerReplicationInfo.bOnlySpectator = false; Level.Game.NumSpectators--; Level.Game.NumPlayers++; PlayerReplicationInfo.Reset(); Adrenaline = 0; BroadcastLocalizedMessage(Level.Game.GameMessageClass, 1, PlayerReplicationInfo); if (Level.Game.bTeamGame) Level.Game.ChangeTeam(self, Level.Game.PickTeam(int(GetURLOption("Team")), None), false); if (!Level.Game.bDelayedStart) { // start match, or let player enter, immediately Level.Game.bRestartLevel = false; // let player spawn once in levels that must be restarted after every death if (Level.Game.bWaitingToStartMatch) Level.Game.StartMatch(); else Level.Game.RestartPlayer(PlayerController(Owner)); Level.Game.bRestartLevel = Level.Game.Default.bRestartLevel; } else { if(!(TDM_Game_3SPN(Level.Game) != None && TDM_Game_3SPN(Level.Game).bRespawning) || !(LMS_Game_3SPN(Level.Game) != None && LMS_Game_3SPN(Level.Game).bRespawning)) { PlayerReplicationInfo.bOutofLives = true; PlayerReplicationInfo.NumLives = 0; GotoState('Spectating'); } else GotoState('PlayerWaiting'); } ClientBecameActivePlayer(); } function ShowMidGameMenu(bool bPause) { // Pause if not already if(Level.Pauser == None) SetPause(true); if ( Level.NetMode != NM_DedicatedServer ) StopForceFeedback(); // jdf - no way to pause feedback // Open menu if (bDemoOwner) ClientopenMenu(DemoMenuClass); else if ( LoginMenuClass != "" ) ClientOpenMenu("3SPNv252.Menu_MidGame_3SPN"); else ClientOpenMenu(MidGameMenuClass); } exec function CallTimeout() { if(myGRI == None) foreach AllObjects(class'Game_GRI_3SPN', myGRI) break; if(myGRI.gamename == "3SPN-TDM") TDM_Game_3SPN(Level.Game).CallTimeout(self); } exec function Version() { ClientMessage(class'Game_GRI_3SPN'.default.Version); } simulated function PreBeginPlay() { if(bFirstPlay) { ConsoleCommand("set input home menu3spn"); bFirstPlay = false; saveconfig(); } RedOrEnemy.R = Min(100, RedOrEnemy.R); RedOrEnemy.G = Min(100, RedOrEnemy.G); RedOrEnemy.B = Min(100, RedOrEnemy.B); RedOrEnemy.A = 128; BlueOrAlly.R = Min(100, BlueOrAlly.R); BlueOrAlly.G = Min(100, BlueOrAlly.G); BlueOrAlly.B = Min(100, BlueOrAlly.B); BlueOrAlly.A = 128; Super.PreBeginPlay(); } function SetBrightskins(bool b) { bBrightskins = b; } function ListBest(string acc, string dam, string hs) { if(bDisableAnnouncement) return; if(acc != "") ClientMessage(acc); if(dam != "") ClientMessage(dam); if(hs != "") ClientMessage(hs); } exec function BehindView(Bool b) { if(PlayerReplicationInfo.bOutOfLives || PlayerReplicationInfo.bAdmin || Level.NetMode == NM_Standalone) Super.BehindView(b); else Super.BehindView(false); } exec function ToggleBehindView() { if(PlayerReplicationInfo.bOutOfLives || PlayerReplicationInfo.bAdmin || Level.NetMode == NM_Standalone) Super.ToggleBehindView(); else Super.BehindView(false); } exec function SpecList() { local bool bSpecs; local int i; ClientMessage("- Spectators -"); for(i = 0; i < GameReplicationInfo.PRIArray.Length; i++) { if(GameReplicationInfo.PRIArray[i].bOnlySpectator) { bSpecs = true; ClientMessage(GameReplicationInfo.PRIArray[i].PlayerName); } } if(!bSpecs) ClientMessage("There are no spectators."); } function ServerViewNextPlayer() { local Controller C, Pick; local bool bFound, bRealSpec, bWasSpec; local TeamInfo RealTeam; bRealSpec = PlayerReplicationInfo.bOnlySpectator; bWasSpec = !bBehindView && (ViewTarget != Pawn) && (ViewTarget != self); PlayerReplicationInfo.bOnlySpectator = true; RealTeam = PlayerReplicationInfo.Team; // view next player for ( C=Level.ControllerList; C!=None; C=C.NextController ) { if ( bRealSpec && (C.PlayerReplicationInfo != None) ) // hack fix for invasion spectating PlayerReplicationInfo.Team = C.PlayerReplicationInfo.Team; if ( Level.Game.CanSpectate(self,bRealSpec,C) ) { if ( Pick == None ) Pick = C; if ( bFound ) { Pick = C; break; } else bFound = ( (RealViewTarget == C) || (ViewTarget == C) ); } } PlayerReplicationInfo.Team = RealTeam; SetViewTarget(Pick); ClientSetViewTarget(Pick); if ( (ViewTarget == self) || bWasSpec ) bBehindView = false; else bBehindView = false; //bChaseCam; ClientSetBehindView(bBehindView); PlayerReplicationInfo.bOnlySpectator = bRealSpec; } state Spectating { ignores SwitchWeapon, RestartLevel, ClientRestart, Suicide, ThrowWeapon, NotifyPhysicsVolumeChange, NotifyHeadVolumeChange; exec function Fire( optional float F ) { if ( bFrozen ) { if ( (TimerRate <= 0.0) || (TimerRate > 1.0) ) bFrozen = false; return; } ServerViewNextPlayer(); } // Return to spectator's own camera. exec function AltFire( optional float F ) { if(!PlayerReplicationInfo.bOnlySpectator && !PlayerReplicationInfo.bAdmin && Level.NetMode != NM_Standalone && GameReplicationInfo.bTeamGame) Fire(F); else { bBehindView = false; ServerViewSelf(); } } function Timer() { bFrozen = false; } function BeginState() { if ( Pawn != None ) { SetLocation(Pawn.Location); UnPossess(); } bCollideWorld = true; CameraDist = Default.CameraDist; } function EndState() { PlayerReplicationInfo.bIsSpectator = false; bCollideWorld = false; } } exec function ToggleHitSounds() { bEnableHitSounds = !bEnableHitSounds; saveconfig(); } exec function DisableCombos(bool speed, bool booster, bool berserk, bool invis) { bDisableSpeed = speed; bDisableBooster = booster; bDisableBerserk = berserk; bDisableInvis = invis; saveconfig(); } exec function Menu3SPN() { local Rotator r; r = GetViewRotation(); r.Pitch = 0; SetRotation(r); ClientOpenMenu("3SPNv252.Menu_MenuPopup_3SPN"); } function ChangeMap(string s) { if(myGRI == None) foreach AllObjects(class'Game_GRI_3SPN', myGRI) break; myGRI.ChangeMap(s); } exec function ToggleBar() { bShowHUDScorebar = !bShowHUDScorebar; saveconfig(); } exec function ToggleTeamBar() { bShowTeamHUDScorebar = !bShowTeamHUDScorebar; saveconfig(); } function KillBases() { local xPickupBase p; foreach AllActors(class'xPickupBase', p) { p.bHidden = true; if(p.myEmitter != None) p.myEmitter.Destroy(); } } function LockWeapons() { local Inventory inv; if(Pawn == None) return; inv = Pawn.Inventory; while(inv != None) { if(inv.IsA('Weapon')) { Weapon(inv).StopFire(0); Weapon(inv).StopFire(1); Weapon(inv).bEndOfRound = true; } inv = inv.Inventory; } } function UnlockWeapons() { local Inventory inv; if(Pawn == None) return; inv = Pawn.Inventory; while(inv != None) { if(inv.IsA('Weapon')) { Weapon(inv).bEndOfRound = false; } inv = inv.Inventory; } } function SetupCombos() { local int c; if(myGRI == None) foreach AllObjects(class'Game_GRI_3SPN', myGRI) break; for(c = 0; c < ArrayCount(ComboList); c++) { if(ComboNameList[c] ~= "xGame.ComboDefensive") { if(bDisableBooster || myGRI.bDisableBooster) { ComboList[c] = class( DynamicLoadObject("xGame.Combo", class'Class')); } else { ComboNameList[c] = "xGame.ComboDefensive"; ComboList[c] = class( DynamicLoadObject("xGame.ComboDefensive", class'Class')); MinAdrenalineCost = FMin(MinAdrenalineCost, ComboList[c].Default.AdrenalineCost); } continue; } if(ComboNameList[c] ~= "3SPNv252.Combo_Booster_3SPN") { if(bDisableBooster || myGRI.bDisableBooster) { ComboList[c] = class( DynamicLoadObject("xGame.Combo", class'Class')); } else { ComboNameList[c] = "3SPNv252.Combo_Booster_3SPN"; ComboList[c] = class( DynamicLoadObject("3SPNv252.Combo_Booster_3SPN", class'Class')); MinAdrenalineCost = FMin(MinAdrenalineCost, ComboList[c].Default.AdrenalineCost); } continue; } if(ComboNameList[c] ~= "xGame.ComboSpeed") { if(bDisableSpeed || myGRI.bDisableSpeed) { ComboList[c] = class( DynamicLoadObject("xGame.Combo", class'Class')); } else { ComboNameList[c] = "xGame.ComboSpeed"; ComboList[c] = class( DynamicLoadObject("xGame.ComboSpeed", class'Class')); MinAdrenalineCost = FMin(MinAdrenalineCost, ComboList[c].Default.AdrenalineCost); } continue; } if(ComboNameList[c] ~= "xGame.ComboInvis") { if(bDisableInvis || myGRI.bDisableInvis) { ComboList[c] = class( DynamicLoadObject("xGame.Combo", class'Class')); } else { ComboNameList[c] = "xGame.ComboInvis"; ComboList[c] = class( DynamicLoadObject("xGame.ComboInvis", class'Class')); MinAdrenalineCost = FMin(MinAdrenalineCost, ComboList[c].Default.AdrenalineCost); } continue; } if(ComboNameList[c] ~= "xGame.ComboBerserk") { if(bDisableBerserk || myGRI.bDisableBerserk) { ComboList[c] = class( DynamicLoadObject("xGame.Combo", class'Class')); } else { ComboNameList[c] = "xGame.ComboBerserk"; ComboList[c] = class( DynamicLoadObject("xGame.ComboBerserk", class'Class')); MinAdrenalineCost = FMin(MinAdrenalineCost, ComboList[c].Default.AdrenalineCost); } continue; } } } function SwitchCombos() { local int c; for(c = 0; c < ArrayCount(ComboList); c++) { if(ComboNameList[c] ~= "xGame.ComboDefensive") { ComboNameList[c] = "3SPNv252.Combo_Booster_3SPN"; ComboList[c] = class( DynamicLoadObject("3SPNv252.Combo_Booster_3SPN", class'Class')); MinAdrenalineCost = FMin(MinAdrenalineCost, ComboList[c].Default.AdrenalineCost); break; } } } function ResetClock(int time) { GameReplicationInfo.RemainingTime = time * 60; } state GameEnded { function BeginState() { Super.BeginState(); ConsoleCommand("ShowScores"); SetTimer(1, false); } function Timer() { if(!bTakenSS && bAutoScreenShot) { ConsoleCommand("shot"); bTakenSS = true; Super.Timer(); } else { Super.Timer(); } } } Lclass Game_Pawn_3SPN extends xPawn; var bool LongEnough; var bool bBrightskins; var Material savedBody; var Material origBody; var Shader S; var ConstantColor skinColor; var Game_Player_3SPN pOwner; // camping shizzle: var vector LocationHistory[10]; var int NextLocHistSlot; var bool bWarmedUp; var int ReWarnTime; var int CampCount; replication { reliable if(Role == ROLE_Authority) ClientPlaySound; } /* copied from a recent xpawn patch version. needed to stop GPFs in older versions. */ simulated function bool CheckValidFemaleDefault() { return ( (PlacedFemaleCharacterName ~= "Tamika") || (PlacedFemaleCharacterName ~= "Sapphire") || (PlacedFemaleCharacterName ~= "Enigma") || (PlacedFemaleCharacterName ~= "Cathode") || (PlacedFemaleCharacterName ~= "Rylisa") || (PlacedFemaleCharacterName ~= "Ophelia") || (PlacedFemaleCharacterName ~= "Zarina") ); } simulated function bool CheckValidMaleDefault() { return ( (PlacedCharacterName ~= "Jakob") || (PlacedCharacterName ~= "Gorge") || (PlacedCharacterName ~= "Malcolm") || (PlacedCharacterName ~= "Xan") || (PlacedCharacterName ~= "Brock") || (PlacedCharacterName ~= "Gaargod") || (PlacedCharacterName ~= "Axon") ); } simulated function bool ForceDefaultCharacter() { local PlayerController P; if ( !class'DeathMatch'.default.bForceDefaultCharacter ) return false; // validate and use player's model for enemies of same sex P = Level.GetLocalPlayerController(); if ( (P != None) && (P.PlayerReplicationInfo != None) ) { if ( P.PlayerReplicationInfo.bIsFemale ) { PlacedFemaleCharacterName = P.PlayerReplicationInfo.CharacterName; if ( !CheckValidFemaleDefault() ) { PlacedFemaleCharacterName = "Tamika"; return false; } } else { PlacedCharacterName = P.PlayerReplicationInfo.CharacterName; if ( !CheckValidMaleDefault() ) { PlacedCharacterName = "Jakob"; return false; } } } return true; } /* */ simulated function Setup(xUtil.PlayerRecord rec, optional bool bLoadNow) { local string defaultSkin; local bool bDefault; local PlayerController p; p = Level.GetLocalPlayerController(); if(p == None) { Super.Setup(rec, bLoadNow); return; } bBrightskins = (Game_Player_3SPN(p).bBrightskins && Game_Player_3SPN(p).bEnableBrightskins); if(!bBrightskins) { Super.Setup(rec, bLoadNow); return; } bDefault = (ForceDefaultCharacter() && (p.PlayerReplicationInfo.CharacterName == PlacedCharacterName || p.PlayerReplicationInfo.CharacterName == PlacedFemaleCharacterName)); if(bDefault) { defaultSkin = GetDefaultCharacter(); if(defaultSkin == "Virus" || defaultSkin == "Enigma" || defaultSkin == "Xan" || defaultSkin == "Cyclops" || defaultSkin == "Axon" || defaultSkin == "Matrix") defaultSkin = "Gorge"; } if(PlayerReplicationInfo.CharacterName == "Virus" || PlayerReplicationInfo.CharacterName == "Enigma" || PlayerReplicationInfo.CharacterName == "Xan" || PlayerReplicationInfo.CharacterName == "Cyclops" || PlayerReplicationInfo.CharacterName == "Axon" || PlayerReplicationInfo.CharacterName == "Matrix") if(Controller == None) rec = class'xUtil'.static.FindPlayerRecord("Gorge"); if ((rec.Species == None) || bDefault) rec = class'xUtil'.static.FindPlayerRecord(defaultSkin); Species = rec.Species; RagdollOverride = rec.Ragdoll; if(!Species.static.Setup(self, rec)) { rec = class'xUtil'.static.FindPlayerRecord(GetDefaultCharacter()); if ( !Species.static.Setup(self,rec) ) return; } ResetPhysicsBasedAnim(); } function PlayTakeHit(vector HitLoc, int Damage, class damageType) { if(damageType == class'DamType_Overtime_3SPN') return; Super.PlayTakeHit(HitLoc, Damage, damageType); } function bool GiveHealth(int HealAmount, int HealMax) { local bool b; b = Super.GiveHealth(HealAmount, HealMax); if(Game_PRI_3SPN(PlayerReplicationInfo) != None) { Game_PRI_3SPN(PlayerReplicationInfo).HP = Health; Game_PRI_3SPN(PlayerReplicationInfo).AP = ShieldStrength; } return b; } function bool AddShieldStrength(int Amount) { local bool b; b = Super.AddShieldStrength(Amount); if(Game_PRI_3SPN(PlayerReplicationInfo) != None) { Game_PRI_3SPN(PlayerReplicationInfo).HP = Health; Game_PRI_3SPN(PlayerReplicationInfo).AP = ShieldStrength; } return b; } function TakeDamage(int Damage, Pawn instigatedBy, Vector hitlocation, Vector momentum, class damageType) { Super.TakeDamage(Damage, instigatedBy, hitlocation, momentum, damageType); if(Game_PRI_3SPN(PlayerReplicationInfo) != None) { Game_PRI_3SPN(PlayerReplicationInfo).HP = Health; Game_PRI_3SPN(PlayerReplicationInfo).AP = ShieldStrength; } } simulated function ClientPlaySound(Sound aSound, optional bool bVolumeControl, optional float inAtten, optional ESoundSlot slot, optional int Damage) { local float atten; local float pitch; if(Controller.IsA('Game_Player_3SPN')) if(!Game_Player_3SPN(Controller).bEnableHitSounds) return; pitch = 1.0; atten = 0.9; pitch = (1.6 * 30 / Damage); if(longEnough) PlaySound(ASound, slot, atten,,,Pitch,false); longenough=false; SetTimer(0.05, false); } simulated function Tick(float deltaTime) { Super.Tick(deltaTime); if(pOwner == None) { pOwner = Game_Player_3SPN(Level.GetLocalPlayerController()); if(pOwner == None) return; } if(bBrightskins) SetBrightSkin(); else SetStandardSkin(); } function SetInvisibility(float time) { SetStandardSkin(); bUnlit = false; Super.SetInvisibility(time); } simulated event PlayDying(class DamageType, vector HitLoc) { SetStandardSkin(); bUnlit = false; Super.PlayDying(DamageType, HitLoc); } simulated function SetStandardSkin() { if(origBody != None) Skins[0] = origBody; bUnlit = true; } simulated function SetBrightSkin() { local int teamIndex; local int ownerTeam; if(Level != None && Level.Game != None && Level.Game.bGameEnded) return; if(bInvis) return; if(Health <= 0) return; if(origBody == None) origBody = Skins[0]; if(skinColor == None) skinColor = New(none)class'ConstantColor'; if(s == None) s = New(none)class'Shader'; teamIndex = 255; if(PlayerReplicationInfo != None) { if(PlayerReplicationInfo.Team != None) teamIndex = PlayerReplicationInfo.Team.TeamIndex; else teamIndex = 128; } if(pOwner.bEnemyAllyColors) { // should be 128 if owner has no team (as in AM), or is a spectator ownerTeam = 128; if(pOwner.PlayerReplicationInfo.bOnlySpectator) { if(Pawn(pOwner.ViewTarget) != None && Pawn(pOwner.ViewTarget).PlayerReplicationInfo != None && Pawn(pOwner.ViewTarget).PlayerReplicationInfo.Team != None) ownerTeam = Pawn(pOwner.ViewTarget).PlayerReplicationInfo.Team.TeamIndex; } else if(pOwner.PlayerReplicationInfo.Team != None) { ownerTeam = pOwner.PlayerReplicationInfo.Team.TeamIndex; } if(pOwner.PlayerReplicationInfo != PlayerReplicationInfo && (ownerTeam == 128 || teamIndex != ownerTeam)) { skinColor.Color = pOwner.RedOrEnemy; } else if(teamIndex == ownerTeam || pOwner.PlayerReplicationInfo == PlayerReplicationInfo) { skinColor.Color = pOwner.BlueOrAlly; } } else { if(teamIndex == 0) { skinColor.Color = pOwner.RedOrEnemy; } else if(teamIndex == 1) { skinColor.Color = pOwner.BlueOrAlly; } else if(teamIndex == 128) { skinColor.Color = pOwner.RedOrEnemy; } } S.Diffuse = GetSkin(); S.Specular = skinColor; Skins[0] = S; bUnlit = true; } simulated function Material GetSkin() { local Material TempSkins; local string Skin; if(savedBody != None) return savedBody; Skin = String(Skins[0]); // stop final blends from loading as they don't make shaders if (Right(Skin, 5) == "Final") { Skin=Left(Skin, Len(Skin)-5); } else if (right(Skin, 6) == "FinalA") { Skin=Left(Skin, len(Skin)-6); skin=Skin$"A"; } else if (right(Skin, 6) == "FinalB") { Skin=Left(Skin, len(Skin)-6); skin=Skin$"B"; } else if (right(Skin, 8) == "FinalB_0" || right(Skin, 8) == "FinalB_1") { Skin=Left(Skin, len(Skin)-8); skin=Skin$"B"; } else if (right(Skin, 8) == "FinalA_0" || right(Skin, 8) == "FinalA_1") { Skin=Left(Skin, len(Skin)-8); skin=Skin$"A"; } else if (Right(Skin, 2) == "_0" || Right(Skin, 2) == "_1") { Skin = Left(Skin, Len(Skin)-2); } else if (Right(Skin, 3) == "_0B" || Right(Skin, 3) == "_1B") { Skin = Right(Skin, Len(Skin)-6); Skin = Left(Skin, Len(Skin)-3); } TempSkins = Material(DynamicLoadObject(Skin, class'Material')); savedBody = TempSkins; return TempSkins; } simulated function timer() { longenough=true; Super.Timer(); } 8class Game_Keybinds_3SPN extends GUIUserKeyBinding; h[ if & WY^h g= 3SPN Binds`h] Menu3SPNg]Menu`Sh] CallTimeoutg] Call Timeout`S$L?]Translocator ammo count: Ww ]CTranslocator ammo count. 0 = no Translocator. Note that the translocator does not recharge ammo, and that bots do not recieve one.$H:?$=$L? $u=|%class Game_GRI_3SPN extends ReplicationInfo; struct Settings { // general: var string mapname; var bool bGiveAdren; var bool bAdren; var bool bFullAmmo; var bool bAllowPickups; var bool bWeaponStay; var bool bSpecsCanTalk; var bool bPlayersMustBeReady; var bool bChallengeMode; var int startingHealth; var int startingArmor; var int roundsToWin; var int roundTime; var int overtimeDamage; var float overtimeDamageTime; var float adrenalinePerKill; var int healthPerKill; var float maxHealth; // TAM specific: var int numTimeouts; var float friendlyFire; var bool bReverseFF; // weapon related: var bool bImprovedShieldGun; var int grenadeCount; var int assaultAmmoCount; var int bioAmmoCount; var int shockAmmoCount; var int linkAmmoCount; var int miniAmmoCount; var int flakAmmoCount; var int rocketAmmoCount; var int lightningAmmoCount; var int transAmmoCount; }; // if the gametype has been run yet // more on that later... //var config bool firstRun; // 3SPN-LMS = AM, 3SPN-TDM = TAM var string gamename; var string version; var bool bDisableHitsounds; var bool bDisableSpeed; var bool bDisableBooster; var bool bDisableInvis; var bool bDisableBerserk; var bool bDisableBrightskins; var bool bUseAlternateScoring; var bool bAutoRecDemos; var bool bForceRUP; // timeout: var bool bTimeouts; var bool bTimedout; // is it timeout? var int timedOut; // who called timeout var int teamTimeouts[2]; // campitude: var bool bCamperAlarm; var float CampThreshold; var int ReCamperWarnInterval; var float CampDamage; var bool bUTComp; // I have to make two sets of settings // in order for the menu to show the settings // of the other gametype. Messy, but necessary (I think). var config Settings AM; var config Settings TAM; replication { reliable if(Role == ROLE_Authority && bNetInitial) AM, TAM, gamename, bDisableHitsounds, bDisableSpeed, bDisableBooster, bDisableInvis, bDisableBerserk, bDisableBrightskins, version, bCamperAlarm, CampThreshold, ReCamperWarnInterval, CampDamage, bUseAlternateScoring, bAutoRecDemos, bUTComp, bForceRUP; reliable if(Role == ROLE_Authority) bTimeOuts, bTimedOut, timedOut, teamTimeouts; } simulated function ChangeMap(string s) { saveconfig(); Level.ServerTravel(s, false); } hclass Game_Bot_3SPN extends xBot; function SetPawnClass(string inClass, string inCharacter) { local class pClass; if(inClass != "") { pClass = class(DynamicLoadObject(inClass, class'Class')); if(pClass != None) PawnClass = pClass; } PawnSetupRecord = class'xUtil'.static.FindPlayerRecord(inCharacter); PlayerReplicationInfo.SetCharacterName(inCharacter); } `class DamType_ShockCombo_3SPN extends DamTypeShockCombo; static function IncrementKills(Controller Killer) { local xPlayerReplicationInfo xPRI; xPRI = xPlayerReplicationInfo(Killer.PlayerReplicationInfo); if ( xPRI != None ) { xPRI.combocount++; if ( (xPRI.combocount == 8) && (UnrealPlayer(Killer) != None) ) UnrealPlayer(Killer).ClientDelayedAnnouncementNamed('ComboWhore',15); } } ?class DamType_Overtime_3SPN extends DamageType abstract; A>e$>$>$? $L>\$7S class DamType_HeadShot_3SPN extends DamTypeSniperHeadShot; static function IncrementKills(Controller Killer) { local xPlayerReplicationInfo xPRI; if ( PlayerController(Killer) == None ) return; PlayerController(Killer).ReceiveLocalizedMessage( Default.KillerMessage, 0, Killer.PlayerReplicationInfo, None, None ); xPRI = xPlayerReplicationInfo(Killer.PlayerReplicationInfo); if ( xPRI != None ) { xPRI.headcount++; if ( (xPRI.headcount == 4) && (UnrealPlayer(Killer) != None) ) UnrealPlayer(Killer).ClientDelayedAnnouncementNamed('HeadHunter',15); } } \class DamType_FlakShell_3SPN extends DamTypeFlakShell; static function IncrementKills(Controller Killer) { local xPlayerReplicationInfo xPRI; xPRI = xPlayerReplicationInfo(Killer.PlayerReplicationInfo); if ( xPRI != None ) { xPRI.flakcount++; if ( (xPRI.flakcount == 8) && (UnrealPlayer(Killer) != None) ) UnrealPlayer(Killer).ClientDelayedAnnouncementNamed('FlackMonkey',15); } } Zclass DamType_FlakChunk_3SPN extends DamTypeFlakChunk; static function IncrementKills(Controller Killer) { local xPlayerReplicationInfo xPRI; xPRI = xPlayerReplicationInfo(Killer.PlayerReplicationInfo); if ( xPRI != None ) { xPRI.flakcount++; if ((xPRI.flakcount == 8) && (UnrealPlayer(Killer) != None)) UnrealPlayer(Killer).ClientDelayedAnnouncementNamed('FlackMonkey',15); } } A>e$33>$>$> $>\$7>class DamType_Camping_3SPN extends DamageType abstract; wQM2u<Σn$BA0^A0^A0^A0^A0^A0^A0^A0^A0^̠̠ t !# "q] Booster!kmJ"JJJ @ @ x @& i a g X C @? k % o { @t Y IT _ I @  UJ u U ka TX V m O D d  c Z kM ln d IO Z kq O} l v Vh @ kd p d ki kg lm ka B S _ |k F kq U e n lR k kg T T\ { mJ t md OF |} kq kH kU lU kl lV ld g SO lX ki L lO Og {u || TW OH lO |~ p kO |b |l kM Vm SQ Sr UC  k{ mP kd {W ki l` ly g x m kc TM kc II TJ kH H e V Vd m] R lB [ T@ c r  K T) {A ke M {K T O lt |v IT I` R {Y {J @u SF {\ {t lM {w t y TX IcK {x | m TR ln U S T [ nZ {O le OA mQ z X kg z } lh j @} @Jv l IF @Ow @S k {\ {w {W k_ I< X IN lB lk Z {[ {p T\ SY TV SN ku zNK Sk |o TR | ] lP y TX V {K T] i p m\ Ta ml T] O~ T` U[ kO I*K lP s k` Vm Tb I T lG mv Ks K {q KD lN hg kgo k i k| m@ {u w {T {q mE K] mE {J {Q IQ TG @p {K @_ IQ kd v T^ @a |A {I k[b @r zK[z_zKO TE @ TP G k| c mC Ih b TS m] L SI m V2Y IN I| TF Ix Ie mm ml Im IW It mh UN mg kM| SB k OL mK X K` W S~ K {F kX mM II {L ^ t V n m| @Q q a V H u I{ kqP R I@ kqH mp lV mD | mB mC mB {x S In m_zr VR {n k[a ` SXZ ku I@ l @R e S@ ] mUU SA SB S OE hf |P |{ |O SD TW Tn {M Ii I~ m| m} kc {] mj kr kk ml Iu SH SI Ie {J m~ m} Ie TZ It m\ kX IO ks mn T_ kj Sg kq lR Iy kN mk {y {K mF l@ A { z U mL {X {U{ Vi In In mX n mt Ir Ir ~ m^ m] Ib IG Is {n Ip n\ II Io SJ ~ j Iv ks It mN {n {L SG I Sg m SH Is I~ I@ Iq VXR zs I@ O^ lp S SX\ {+x O Ir Ih lZ h I\ |H Is SX] SX[ VV lq If Iv IA kX mI IG Is V} {Q {S {T lB {U {R kh kZ lQ Ix {i mj I\ y Ix y Ii IA { z Ip z IA w zK_ } lvp k lo j d lvC mk A lvD T S Q Ip b x { lm N Ir lh lg P I} f [ Ii I?R I} l?H Y IN W Io I@ lL lK I?r I} {?c U l?I l?G k?F X IR Z \ ] ^ Ib IM _ ` a VE I< I< V?n I< Iz {i mo I Iw ID I@ kA SC SY mC |Pzm zNd ~ IN my IL IQ lA V| SXg Sh kj |Y k~ I} IR Te mD mcI kf mPd IU IV mz Iu m` Iw @c @l f g Il Iu h m^ IX SD SW SG Sk Sn Se Hr SI SD S@ {C {H Is kn khC h~ kj l` la Vq T[ TA {L IQ mT mo ms mU IM l%c S} mV mg mK SE Il {w IK T_ TY T` IM_ II Ix IMaNc ^ Ix b Ie I+C m[C I[n lP k[d I+v S[e S[f I+f m+yyx Il @ Il U I^m xv}EjxB_PZoP nxz  H{ Tw `jp mW  zMGAW  U~  bmnp | CIjXjh ihuJ E*J  RtD^mn| |j  H;J  Up a^U ny |DI Xjg e p r x K} X{ dAx qm~zA Le Mh ZaT gk {Ee Hz U^ a} o| |{ HxTx bjU ojT |^s IkRWs` iO{I^I  Dj] Q]]j~  k[xx`  Fw`  Sm`JmnD |D Jg X@ e#`  rjr uB L!`  Zmgjs uz B`  OP \_m if`  uB  BrxOcm]p kcB xje Fm SB  `bmM{im Js WqtdkmXmfcEt ECZR  `:smg {] H NU^f  ctB  pcN}vs KW X^jePe u:rC oyQjv @B M~ [jFhd w`  D] QW ^s kes xw E RjS _jR lmVyA fjJ ro{w  zy G-_Sj^ aB m  zs Gsm SN `c ms zbG@ U~ b|  n} {v^  Htx UK b&s oD|l Jx V~  c{opr _W lC yp FcS[aOotP ~J KmXp fjU sJAj~ Pbm ]:vjX yM  FiSjQbps ~G KbX+mg-ujPC:tQVs `tG mmzjHtWNmfja tp AL Ntg [vp hS uJ B;b O  ^Wmka y^ F[SFbFS qOO N [[htO w] DS QY_B mjj {U G7mUb cjf qJr ~Ya Lj  ZHmgmuB  CU Py} ^N kD w%m C+U P9M ^:s my}z7Y w?M EjI Tz ajc nym {lp Hj`  Tvm`s ns {B HryVY  OiM\e jjb xe EB  R9` _co l=B x o FbS}p by nW|{RxwX|oOkQ|zY|v~  rBe MM Zu  gu  tp  ABNc \giV|xf ttH AP|Na JS|X~  TGQ  aT|nty j-^wHp Ft Rz_~Mntz |B  IWh UY{av o[`  |mItN WN d_qY_ MN Z+N gam ttd @ Mp [RB hiKvtt DQB Q~K_+_ m+W zI GJ U~  bNx otN }~ JEW`meN sP @+ Mp [m hp uU BzP+J ^B k+I ygm Gm Th a[oW }]JOXB  gH trB  AE Nt [W hW uj BM ON \O imqvtL gjK tB AP Oj \U kA yt| FXSf bt@ og|sLt\ Z{gtG vJ CtF PtE ]:w jtD v:}  CQc PtA ]D jE wtM D]`  QF ^u  k^B  xOEu  Ta ac  nS {:{Gu  VK cG p\ }@ J| WD dte qc ~B KL Y`c fC sA @w M;B  Y<[fct9B  B m OT \a hm vB CcQ4B  _p lp x~ Eya Q{  ^B kB y B GqB U B cF qs ~yz Kye Xyt e B r@p Nq Zu\ gp sd #B LM Zt g3B txB BzP6p _oB kG yS Fs Uv  byW o7d |KDH9Y  LJDYB ]m kfB x U  FB S G a=u  o4p {7pGh UFDcIDgAT ko  yl FHDUm Y{ftB t-wAH P\ ]c  j] wI D^X Qta ^^W kt xjQ E QS^jO mB zU H@ Va et@  rt{ u[ LsYqhY  wB D  QR^l  mh  z} GE TGDar~  eF ru  s Ku XT erq sE@y| Wy@ d@ q{~B My\ Zd g}tr` CyN OX [Nr hyG v~ CPr PB ^rl:w {Z Ht} UQAbB ptz ~cEKtl Pl ]tt iyF vA CC PtZ]\]lv IJ Vj  cu pp ~uKy ZWvgl uyE AyD Nty [^Uhtv vyA CtC PtA ]y jyG wtDYB CTB  Q-]^Z mt z@  GyC TtZ a-@ nb{c Ib Vc c-B p?o}CL?nZZ i?vv?uE?e TyA cp p7w |<OIzXc fcesi AyZ O e\i jD xi FyD T;p ayw nyx {~Hq  Vj cU pep ~i KyF Yr f7p s` @yl Lyb Yvp fu st @\ M{Yyd h3l un A/B Ni \/l i!B uwB Cf Qe ^yB kD xyM Fp S@ `tm&U  |$U  I|V"U  e(U  r} U  N*U  [,U  hU  u B B.U  P0U  ]B jU  xREU T5m bB o{}PILc URIbc kc xU  Er R` _U  kq x|EU  SU  `r mvz;d Hj TY af oL|a JyXa gB uV  Ca O[  ]P idv|D.w RY ^9^ lvyU\H?pdtw s-\@-V  O?q\-{ jD wS~EB SA`K n5l{Y IZf VZ\ dtd rG ^f Ltb Xtq e^T r^S ~^L K^J Ytx gtG tjP Ajt NtY [j  hq ujN Bb Od \ju itK vt| Ct} PjX ]j jjZ xR Ej[ R~ _t~ ltR yjd Fjm Sro `} mrp zhFGq U| cG pq } q Ks Yo  fSsw Cq PL ^yc j wH DI Q\ ^k  ln y~CHB K~Zo iuM vuY C q PJk ^F  jJj wqc ENy  Roc ^FkL  yk` F q Rq `c nKm{KwIu WKyd q rX @ q MK`[KOibzwB qXD j MI [R^  hN u6_ B`XPKxhy v~B^ Q7c`O oD }h KV X| g[tCBzPD _;cl a  { F Hi{UU  PJ ]D k_{yv t.y BYf O^{[-W V-N c2l p-_ |6l H4J T8ja`pT[~^ YCf[mt9b  aG nx{7M J7i  WTdUs7Z  AY{NPI`v XX@f-A fssDi A:I7NtW Etc RG _f lW{xY saU  @I MZZZZYhS v`CtW QVD^^V bU{ox jtr wXIDu MmZts ht us BYAO^g  Pca  \tt iW vJvEtu {kH] `hZ  mT{ztS us Br OW \tI iX v]KeCSMN W [ R{h ~  c v p j\ } *u}J h[  G i T y a z n rn { NmH d@u fu g E :uQ f ` y\ m yd z X G Z T [ a M~n e l A y m F u[ S a{` Q[ w j GXw G O E~\ CZZ DNt ;xYB ;wh[ ;yFC B^I jm g B t ;vjB ;`]l ;u}I JEF q[ K p_X AEg _l p` { e H TeU s z r G ;tWT Lvk t  a s n j | v_J G Y B f e t @NA {m O ;sJ\ Ujf k P _] a[_l VjK i u WtA XNu G C `P zh^ l F :QFR wDX {{\ |~W *hcU *iax ;rHY j a ;qho ;p}W *jQT ;oxe ;nh] LE *krT t  F *}LS m_ ;mIm s v j D _  R __ {e n G { `H | V x c *~^p _N b  ] B j Lx ;lEH ;krM a   ;jQL xm ] ue j xw *lEF *mIK aZzT | N oe Z s g gpu ye xt t  B ib O q\ _k e z *nhG *oxo s g juu jl j jk w *p}D *qhA *rHi ji q *sJ} *tWG t  ^ *vjk j U `c s q G ~ *whK *Ys *yFL B R *`]` AA} w ~ e K ;iaX G y BQF CrW P I jLV Dfe B K ;hcW A z jf G ElT y@ FeN Ges HhX jL @ @ M e`Z m h aYRu Pd  G e_T gCc r f a\kt cR _ &zk CRz &FL Iu[ e P Q ] e j `_w :L,V t  B s O j ] :M7k G b B o cF } _` J m W m d frq t  c r p s ~ j L G Z B g Uw u d  A r N Zi \ ZH  j ew D v tP C NN P NM \ Nm i a v G D xQ __a t  p b } s K j Y G g B t avB -l x Nc D Ho Q a`_] t  | _I s X t f j t  `?B j A ` O A| \ Yb h Yxv 8i F 8I  T G a <` n 6t { 6u H a_PU t  e 1l r 2r ~ s K j Y G g /I  t /s A /J O /L ] /jk B z .~H +l W G c .C o .I  ~ V`K a^GY F ` #E  m E y "R F D R !j_ !i  o L | K I a]xV mN J \ Xa i t  w @CD m G l S H  ` <_m k | s I t W j e G s aXO@ m O ;a  [ _h w w B D t R C ` ` m s z  jH j X m f XD s t  @ aWtM 9b  A mN 9x \ e|i e@Be t g b u aVjB 9| l eAcy s \ APj w z t  F w7S l J k W l d B8q k i k v l C [ P G ] B j }x | F V_S m b Rs n :OE{ j @ :PCN l Q 2` ^ k k l x m E n R h _ o l k x 2_E k T l a m n aUjz aTed k I l V m c n p h } o J o V zMb k o l | m I n V h c o p h | v`I k W l d m q n ~ h K o X n d j q k  l L m Y cCf dCi |Cl aVo BCE EVH ]C^ Oma `VN S]d ZIA BIJ }zS \VM }zc l}z] F}bW -@-y iGf Em -vY| -@f U -u:{ -q8u -s5m -\ab .z C ^PP XU` &V  u jjA O.k scY {.| .{ j ^^w -YVU -rak 2E L IhY -f_A \a` JsA 6E t -hbA rc -A>U -na S ;E t -QKA =E L -LXX D2p >D#b ?o E >z#R >M&u B [ M>w#h >@#K >bSn Fo A >R~M OE K >@)W >iH@ >N5H _0} }Jm -Nbw QB  Y 5u7f 5@z] F[W 5whr =IZ ZE c H0p K0` paP &Ywq ]Qh ^E y WuF &_H${ qhC &s#k rKN 6FdY v7}iE t]2@ei@re@Qr r}mCpmpvf]rh Crr P)])F`5ors doE qon })k)T`5}xM ruE l?K )J )s `5\~E Q{E ]pbi)K)t`5]vSWRE eh q )~ )g `5Poh EE mtcy )\ )E `5nPPcE sE )K)t`5]-JRE \ "Cxh )` )I `5r "v{gE bE n )z )c `5L "fgAE hI7tE k <K@w<hDwt { <MSIs \<X~>jj hG vF2CI7uE lt xs Fj TF`bI7BE yt Es Sj aG oF;|I_wE Vt bs pj ~FCLI7OE Ft Rs `j nG |<taIF7jI7aE Xt ds rhD@G DtaQFAr QysI}lE it us CG Qyn^F:LIjFE pt |s Jj XG fF0s6qf cI7IE @t Ls Zj hG v MwCF;zI7uE lt xs FG TFAaI7bE YUGet ls zj HG VF2c6oB U5j4Y W(I7p(E g(t s(s A(FpO(o|(KX{(E S( ls`(E S( x^_(sn}(~Ck(R}n({Rk(Lm}(icj(rmM( I  z(@IG( J P) L ^)s2l)@F^)R<md)WqQ)#<AB)QnC)<dq)JoU)|<`D)v[d)Ioy)Zix)P{a)E\)W|k){\g)<dC)qN g)<du)GPY)i<di*FbM*^<`o*]}O*g<sL*NG*=<dF*+V j*9<cw*Hj Z*U<dD*/E h*5<cu*bwX*<iO*3E x*eKWE*rM\* eti*e M]*|_j*eUI*9E^*nGl*;E s*IH@*K_H*>@Vg*`2}+iK o+x{z+pr.u+s[g+DE B+rx N+G@!F+AyF,L, v K,CA,tKLO,w_[,NE z,KE G, tlDT,PE X, tx]d,tsDA,t[FE,QNK,SmY,SE g,aKys,tVLl,t~Cx,t{O{,a #J,Zm m,aQ:z,\mt,\E B,K@N,tLVN,dicd, aG,d@_ h,ts2G-;Kr y-t@Dk-tWzo-tQyi-tJob-; BQ-tv[S-;QLn-lmz-lE H-tZiU-K~-tP{}-tW|x- Pt-t{mD-tq@ q-*K_q-tGdP-tF`t-t]jT-tNM~-* _K.E j.*QLw.}mC.}E Q.q ^.KU l. tlT A.EU. tIS d.Q:w.mq.E . nFK.V Q.E ^.tHj k.tkQU.tjYf.E .t^EK.E P.trM].E j.tbww.t|0n.:K` ^.ter~.Ep.tnG~.:=T:E.E Y/tI@f/@Vf/t`2|/txGn/tpp2u/E e/KCq/tru"t/tGg"i0tA{P0K}K0}  H0 KMT0E a0uQ n0 C#0m b0 Hyo0eKh0E s0xN@0E N0moZ0:K.I0E w0uQ D0:C#U0m x0:HxE0eK}0E H0:wXT0ml0E z0e~F0xNa0E o0mo{0~j0=3E0yHx0D+@1E,k1i"W1V y1j4]H1 j4[e1 j4Y@1j4cY1L$|1M&`1N%F1O$k1P&O1Q%u1R4Z1S4N1 j4UB1a~W1j4Ur1j4[G1 j4Wb1 j4_y15j4cX1j4w{1j4|r2j4bn2#j4G!P29j4_W2=j4{v2Ij4D q3Rj4du3~Y3Uj4ht3^j4Y\3cGu3dI|3gj4SE3ij4YX4|j4vq4;~g4j4BB4j4|D4j4\@5~Nc\8j4p=j9QJ Z9j4Qd:Pfu:<j4s[:tj4@N;j4\ NCj4e jCj4d OCj4O sCj4G BCj4w ICj4j@Dj4` jDj4c JD~mDj4v HDj4~ ~Dj4T|D*j4I8PDj4d(YEj4Q}Ej4DNEvlRE*~~E j4KYEuUdE:j4@yE;j4\0yFj4"UFaj4XTFj4NclFej4QzG:j4VwKG j4B aHj4;cHh_^Hj4V}HfF5SJj4n=YKdJ GKj4SQKj4MdLbfqLj4GWL*@M^Ma` kM~KMj4mfM"j4C,ST`_VTj4huU&j4I]Yj4y?fZj4l_Z-j4XK])j4Bc^[Ae^KKf^j4G&q^rj4sx^lj4kk^j4IV^ N,_^Fj4^ K^j4gi^j4eP^:N,u^j4Ha^MPi^ i y^