* @  l )NF  NoneMaxMinRangeColor OLTeamGamesCoreEngineSystem RelativeTime RangeVectorZYXSkins XEffectsAddPrecacheMaterialTintsMessageForce Lighting LightColorKarmaDrawSpriteWidget UnrealGameLifetimeRange Collision MovementStartSizeRange WinWidth MaxParticlesPosYWinTopWinLeftTexturePostBeginPlayXGamePrecacheCustomSound XWeaponsVectorCoordinateSystem WinHeight DrawPivot RelativeSizeOffsetYOffsetXPosX RenderStyle TextureScaleInitialParticlesPerSecondFadeInEndTimeFadeInUseColorScale ColorScaleTextureCoordsX1FadeOut SpriteWidgetX2Y2IntBoxRespawnDeadParticlesWidgetTextureY1FadeOutStartTime ScaleModeScaleAutomaticInitialSpawning UniformSizeManageComponentStartSpinRangeSpinParticlesUserUseRegularSizeScale TabOrder SetLinkColorInitialDelayRange ParseOptionStartLocationRange mColorRangeGfx EmittersTeamCaptionRemoveComponentAddItemStartVelocityRange UseSizeScaleResetAfterChange Position AutoResetBroadcastLocalizedMessage SizeScaleHudOLTeamDeathmatchWarmupTicksPerSecondRelativeWarmupTime GetOrders OnslaughtTimerFireModeClassInternalPreDrawAttack SendMessage__OnPreDraw__DelegateRelativeVelocity GameEventDropPlayerControllerDrawNumericWidgetAdd__OnCreateComponent__DelegateUseDirectionAsGetHumanReadableNameInternalOnCreateComponent XInterfaceDefendFindSilentSetIndexOther SendHomeAddLinkObjectHint ListChangeTGPropsDisplayTextUseRotationFrom ScoreEventTGPropDescTextReceiveLocalizedMessageGetMessageIndex StaticMeshGetSmallerFontFor LightHue OpenMenuBotNearObjectiveGetItemStartLocationOffsetUpdateForTeamOriginalWeaponSpinsPerSecondRange AIWeightsClearScaleSizeByVelocityMultiplier mSizeRange TeamAITypebVisibleWhenEmptyGetLocalPlayerControllerGUI2K4OLTeamGamesTeamSymbolConfigReplacementWeaponbAlwaysReplace"OLTeamsGUITab_PlayerLoginControls GetTeamNumOLTeamGamesTab_BotConfigBaseTeamScoreEventGetGRIFindPathToObjective OLTeamGamePlayStatusAnnouncement DrawScaleGetPriorityAttackObjectiveForPostNetBeginPlayHudOLCaptureTheFlagUseParticleColor ImageColor SetPosition ImageStylebBoundToParentGetFlagByTeamIndexVelocityScale bNoDelete HaveHalfFontTouchbScaleToParentGetSmallestTeamEndGame SetObjectiveGetAllCharactersSetCharactersReachedDestinationGetExtraAtIndexForceLoadTexture GoPickupFlag SetHolderTryToInterceptCheckAndResolveConflictsGetLocationNameIsValidCanCaptureFlag CheckScoreTick OLTeamPawn GetStringGetDefaultCharacter SetLinkToLoadingScreens OLPreviews AdjustAim RemoveTab DrawTeamFindNewObjectivesflag BeginState CheckPainUseDefaultModelSetComponentValueEnableLinkedObjectsDisableLinkedObjects GetNameAt ProjTexturehomeGetItemIntAtIndexSetGRI RightPaddingTeamNumConsoleCommand LeftPadding bFillClient OLTeamNamesAssignNewDesignationTargetScoreGameObjectOLTransEffects__OnClick__DelegateInternalOnClickCTFPropsDisplayText SetIndexCTFPropDescTextDistributionCornerY OLDeResMat0 OLDeResMat1__OnChange__DelegateOLDeResColorScale0InternalOnKeyEventOLTeamSymbols PathWhisps DestroyedOLDeResColorScale1CheckForElimination StyleName AutoDestroyOLTeamGamesAnnouncersInitComponentOLBeamEffectClassSameTeamTouchShockExplosionClassUpdateLinkColorOLTeamsCustomHUDMenuTeamColorsTwoOLFlashEmitterClass OLTeamShaderOLTransMaterials DetailModemNumTileColumnsMuzFlash3ClassSpawnImpactEffectsMuzFlashClassShockExplosionCoreClassNumericWidget ChangeTeam IsSnipingShockBallEffectClassMinDigitCountbPadWithZeroes mNumTileRowsRenderOverlaysbanner TeamName OLTeamColors EndState tmpScaleYFindBestPathTowardObjectiveNameDefenseScriptTagsOLTeamBoxMaterialSetAttractionState FlagTypeSpawnProjectile tmpScaleXMeshClientReceive CloseMenuChangeGameType CheckEndGame OLTexturesOLEffectColorReadyToPickupEffectIsRelevantAnnouncerName SoundPackage OLScoreTeamOLTeamScoreBackGroundbNetTemporary TeamColorsOLTeamScoreBackGroundDiscGetRandomTeamSymbol__OnKeyEvent__Delegate SetGoldImageOLHudColorTeambSortedSphereRadiusRange TakeLeadNameScaleSizeByVelocityMax ItemHeightComboDecalClassSetGreenImageCriticalPlayer OLRedFlagGetComponentValueIncreaseLeadNameInternalOnBeginDragInternalOnDragDropInternalOnEndDragDistributionCornerX GetCallSign DrawColorStyletmpPosYFlagDownWidgets OLGreenFlag RemoteRoleFlagHeldWidgetsTakenSoundNamesNewFlagWidgets OLGoldFlagtmpPosXDroppedSoundNamesSelectedStyleName ConsumeAmmoOLTeamSymbolNamesShockComboClass FindImage ImageScaleOLEndGameSoundNameCaptureSoundNameReturnSoundNames NearGoalVisibleToEnemiesOf OLBlueFlagValidatePlayer AddPlayerTeamBeaconTeamColorsOLTransOutEffectScoreRenderTwoSided SetBlueImageAttachmentClass SetRedImageAwardAdrenalineOLBlueFlagBase DescriptionErrorDrawHUDAnimWidgetClientPlaySoundTestVoicePackLocalizedMessageOLGoldFlagBase TeamLinkPrecacheGameTexturesOLGreenFlagBasePrecacheGameStaticMeshesAddServerDetailPrecacheFallbackPackageOLRedFlagBase PlaySongUpdateTeamHudShowTeamScorePassABotDesireability!OLTeamGamesMultiColumnRulesPanelAddBot FreeScript FightEnemyAddSquadWithLeaderFindNewEnemyForFollowOverrideInitialBotsDrawDistributionArraySetRouteToGoalAllBotsSpawned LogTaken ScoreFlag StackMode SameTeamProjectileClassOLTeamsShockBeamFireRiffs MergeWithLightSaturationGetTeam ViewPlayer ClearHolderUnhookOLTeamsVehicleFactory CanCarryFlagOLTeamsZoomSuperShockRifleHoldGameObjectAddTabCheckedGetAttackSquadGold_Team_ScoresGetMediumFontForValidObjective Gameplaygreen_team_is_the_winnerAdjustDistributionArrayCheckNumInitialBots StoreSettingGreen_Flag_ReturnedRed_Team_increases_their_leadPrecacheCustomAnnouncementsSetTeamEffects LifetimeBlue_Team_ScoresBlue_Flag_ReturnedAllowMultiHit GameName TracePart TeamAdjust LinkAdjustDoTranslocateOutDefenderTeamIndexSetupDeniedAcronym ApplyOrder ParseOrderParseRecipients TakeDamageInitializePlayerListsNumScoresPerTargetUseMeshBlendModebUseSpecialScoringOptionsParseKillMessage DeathMessageFindPlayerByID SetFocus SetGrammar DamageType LoadingHintsSetEndGameFocusbMustHaveMultiplePlayersFindTeamDesignationUniformMeshScalebCanAdjustNumTeamsMeshScaleRange TriggerEventVolumeFindHidePathForGetShortOrderStringForBallCarrierMessage ShowPathTo GetStatus CheckVehicleParseRecipient GetPortrait InitAddon AttackTarget KDriverLeaveGetDescriptionText HeldFriendlyClosed GoalScoreHUDTypeSetLinkStatus EliminatedLoadResourcesSetOLCustomStatusAnnouncerPackGetOLCustomStatusAnnouncerPacktipFindCharIndexClientSetViewTargetGold_Flag_TakenSetZoomBlendColorSetSparkColorSpawnBeamEffectDoTraceClientOpenMenuRenderComplexMessageAssembleString IsLinkableTransTrailClass SaveSettingsGetSmallFontFor BoundErrorTransFlareClassBeamEffectClassDefaultEnemyRosterClassSetDefPointVisibilitySetOverlayMaterialOLEnemyFlagTakenByBlue_Flag_Taken HurtRadiusBlue_Team_increases_their_leadblue_team_is_the_winner HatTrickBlue_Team_takes_the_leadRed_Team_takes_the_leadBlue_Flag_Dropped OLParseOrderOLSetBaseDistanceTeamColorAdjustred_team_is_the_winnerRed_Flag_DroppedRed_Flag_ReturnedApplySpecificOrder CullDistanceRed_Flag_TakenRed_Team_ScoresCanCarryFriendlyFlagGreen_Flag_TakenGold_Flag_DroppedHookGreen_Flag_DroppedGold_Flag_Returnedgold_team_is_the_winnerGold_Team_takes_the_leadReplaceGreen_Team_takes_the_leadGold_Team_increases_their_lead Green_Team_increases_their_leadRadius ChargeBarGreen_Team_ScoresGetEnemyFlagByTeam CaptionWidthGiveSpecificOrders IsCheckedjoined_darkpulsebAcceptsInput GetExtra DrawTypeReAssessStrategyBetterObjectiveThan SetTeamFlagsAnnounceScoreFindVictimsTargetIncrementGoalsScoredbScoreTeamKills CheckFit GOTOURFLAG SpawnBotGetMinPlayers FlagNearBase NearHomeBaseNearEnemyBaseOrdersForFlagCarrier CalcSetHome Disrupted ReadOnlyTrigger LogDroppedHeld IsPlayerPawnNotifyEnteredPutBotOnSquadLedByFindNewObjectiveForCheckMaxLives PutOnOffenseIsHumanControlledDestroyableObjective MeshSpawningDrawOLTeamBeaconsPickTag IsRelevantHOLDPlayWinMessageGetPriorityFreelanceObjectiveCloseGetLeastDefendedObjective GetBotTeam SetLeader Activate TryComboDrawOLTeamBeaconRestartPlayerUpdatePrecacheMaterialsPlayStartupMessage StopFiring WanderOrCamp LostContact LoseEnemy GetIndexParseChatPercVar FreelancePlayTeleportEffect TeamBeacon FillPlayInfo DrawOLBeacon GetRecordDraw2DLocationDotUpdateRankAndSpread GetDecoTextTimeTillResetRange NotifyLeft ScoreKill joined_e3j3bEndZoomjoined_overload SetupBotInfoDrawWeaponBarSetBaseVisibility InitializeTeamSayGetAllLoadHintsGetServerDetails NotifyKilled HealDamagePrecacheGameAnnouncements PickupClass IsSpectatingGetDefaultWeaponBeyondViewDistancePrecacheSound ResetClickScaleSizeXByVelocity__OnDragDrop__Delegate DrawTimerIsPawnInFrontOfPlayerExplodeShowMidGameMenuLoadSRGrammarUpdateAnnouncementsParseVoiceCommandNeedNetNotifyInitDrawAdrenalineShowReloadingPulseDrawChargeBarClientUpdateFlagHolder DropShadowOLTeamsProjectorGetFontSizeIndex InsertTabMutate bDropTargetPlayDrawHUDAnimDigitbNetInitialRotationCheckReplacementDrawVehicleChargeBarSoundOrder GameHasEnded UpdateLinks SpawnVehicleSpawnBuildEffectClipScreenCoordsdroppedlb_Bluelb_RedRemoveClientGameEndedBotVoiceMessageDrawPlayerItem SetupGroups DragDroppedDelaySymbolConfigClosedsb_RedOLTeamsMonitorClientSetBehindViewEndSymbolDrag PickTeamsb_BluebBeepUpdatePlayerListsRedDrawOpacity MapListType MapPrefix BeaconNameScreenShotName DecoTextNamebReplicateInstigatorPriorityObjectiveIsFirstPersonSetPlayAllAnnouncementsPitchUseVelocityScaleGetVelocityDirectionFromVelocityLossRangeStartVelocityRadialRangeGetPlayAllAnnouncementsOLTeamsGameReplicationInfoStaticPrecacheTestVoicePackClickSpawningSoundProbabilitySpawningSoundSoundsVoicePackChangeLoadVoicePacks DropShadowYRevolutionsPerSecondRangeUseRevolutionOnDrawGoldPlayerFlashMuzzleFlashMeshSpawningStaticMeshStartLocationPolarRangeGetConsoleColorStartLocationShapeOnDrawGreenPlayerlb_Gold lb_Greensb_Gold sb_GreenWeight ProbabilityOLTeamGamesTab_PlayerSettings SpecialEventOLTeamGamesMutatorOLTeamGoldConfigured i_JoinGreen bNetNotifyOLTeamGamesLoginMenu i_JoinGoldOLTeamGamesGUIHookOLTeamGreenConfigured bIsSpecial DroppedGreen GreenTeamOLTeamDeathmatchOLTeamsRosterConfigured GoldTeam CaptureGoldOLTeamPlayerControllerOLTeamRedConfigured CaptureGreenRemoveFromTeamOLTeamBlueConfiguredOLTeams2K4SettingsPage DoFireEffectOLONSPowerCoreOLTeamsAnnouncerOLTeamsAnnouncerBennettOLTeamsAnnouncerSportyGrrlOLTeamsAnnouncerUnrealGrrl co_VoicePackb_TestVoicePackch_PlayAllAnnouncements InitEffectsOLTeamsBlueShockBeamEffectOLTeamsBlueWhispOLNavigationPointAttachmentUpdateScoreBoardMutatorIsAllowedOLTeamsComboSpeedParseMessageStringOLTeamsDeathMessageFOVAddTextMessageOLTeamsFakeGametype RespawnTimeOLTeamsGoldBeaconOLTeamsGoldShockBeamEffectOLTeamsGoldWhispOLTeamsGreenBeaconOLTeamsGreenShockBeamEffectClientWeaponThrownOLTeamsGreenWhisp ReturnedGoldOLFakeCTFFlaginjured OLTeamAI OLCTFTeamAI OLCTFSquadAIOLCTFMessageNotUnique OLCTFMessageOLCTFHUDMessageIncrementFlashCount OLCTFGame OLCTFAddoni_GreenPreviewOLRealCTFBase BestMode DroppedGoldOLTeamsKillerMessagePlus OLCTFFlagOLTeamsLastSecondMessageOLBennettAnnouncer OLBanner_RedOLBanner_GreenOLBanner_Gold OLTeamBannerOLBanner_Blue MapListOLCTFi_GoldPreviewOLTeamsLinkAltFire BlueStringOLTeamsLinkAttachmentOLTeamsLinkBeamEffectTeamSymbolPage b_AddBlueOtherMesgGroup b_AddRed lb_Symbolssb_Bk3sb_Bk2 i_JoinRedOLTeamsLinkFireOLTeamsLinkGunOLTeamsLinkProjectileScoreBoardType i_JoinBlueOLTeamsLinkProjSparksBlueOLTeamsLinkProjSparksGoldbIsPartiallyUnique bTeamGame ChildMessage HasUDamageOLTeamsLinkProjSparksRedGetSizingCaption InitListsOLTeamsLinkSparksOLTeamsMonitorAOLTeamsMonitorBOLTeamsMonitorCShouldDisplayRuleOLTeamsNewLinkTrailOLTeamsNewTransDeresGold SetGamePIInitializeGameClassRestoreDefaults HasGreenHasGoldOLTeamsNewTransDeresGreen AddPanels AmmoPerFire AmmoClassOLTeamsNewTransEffectGold WindowNameUT2K4GamePageBaseUT2K4Tab_MainSPOLTeamsNewTransEffectGreenOLTeamsONSGrenadeBeaconGoldSetButtonPositionsOnDrawRedPlayerOnDrawBluePlayerSetVis SetRuleInfo LoadSettings Momentumb_ResetUpdateSettingDumpListElements InitMaps LoadRules b_Cancel ClearRules UpdateRulesNotifyLevelChangeb_OKOLTeamsONSGrenadeBeaconGreenGetGYRColorRampValidateSpawnLocationPreSpawnEffectTimeOLTeamsONSGrenadeFireChangeTeamTintRedBuildEffectClassBlueBuildEffectClassMaterialBlendingOp DeactivateOLTeamsONSGrenadeLauncher CellStyleDiscardInventoryOLTeamsONSGrenadeProjectileInitForOLTeamsONSHeadlightCornoaNoVisibleColsNoVisibleRowsGetServerBrowserPage GetQuitPage GetTeamColorLastSecondGreenGetImageAtIndexOLTeamsONSMineLayerOLTeamsONSMineProjectileGOLD GetViewAxesOLTeamsONSMineProjectileGREEN GreenStringOLTeamsONSMineThrowFireLastSecondGoldOLTeamsONSPRVBuildEffectGoldOLTeamsONSPRVBuildEffectGreenCheckOutOfAmmoOLTeamsONSRVBuildEffectGoldWeaponCenteredChatOLTeamsONSRVBuildEffectGreenOLTeamsPlayerReplicationInfoOLTeamsRedShockBeamEffectGreenTeamColorOLTeamsRedWhisp GoldStringFindSpecGoalForOLTeamsSayMessagePlusGoldTeamColorOLTeamsShieldAttachmentYouHaveFlagStringPrefixYouHaveFlagStringSuffixDisplayVoiceGainOLTeamsShieldEffect3rdGOLDInventoryType GetChannelAtGetVehiclePositionString SetTeamNumOLTeamsShieldEffect3rdGREENInitVoiceReplicationInfoGetPublicChannelCount UpdateHUDOLTeamsShieldGunOLTeamsShockBallBlueOLTeamsShockBallGold bSnipingInitializeVoiceChatDeactivateSpawnProtectionPrecacheAnnouncementsBecomeSpectatorOLTeamsShockBallGreenDisableVoiceChat SetVoice ZoomFadeOutInitGRINewDrawWeaponInfoVoiceReplicationInfoClass NetDamage OrderToIndexLineOfSightToBecomeActivePlayerGoldMineClass DrawUDamageOLTeamsShockBallRed sb_BlueBackGetPendingElementsSetOutlineAlpha FireSoundYouHaveMultiFlagsRatePlayerStartTeamSymbolNotifyMyDefaultWeaponYouHaveFriendlyFlag ReduceDamageSetHint sb_GreenBack sb_GoldBack CanSpectate TeamChangeOLTeamsShockBeamMuzFlashBlue GetTitle EyePositionOLTeamsShockBeamMuzFlashGoldIsConsoleMessageCheckMaxEffectDistanceWeakObjectivesOLTeamsShockBeamMuzFlashGreenPlayRewardAnnouncementOLTeamsShockBeamMuzFlashRedAllowTextToSpeechOLTeamsShockComboBlue DropFlagOLTeamsShockComboCoreBlue TextToSpeech TeamSayQuietRegisterVehicleEnemyHasFlagPrefixOLTeamsShockComboCoreGold GetAmmoClassKickVoteEnabledOLTeamsShockComboCoreGreenCalcDrawOffsetEnemyHasFlagSuffix PanelClassGetConsoleFontOLTeamsShockComboCoreRedOLTeamsShockComboExpRingBlueOLTeamsShockComboExpRingGoldDesignationPrefix GetFireModeBringUpDesignationSuffix GetFireStartGetLoadingHintIsInCinematicMatchSetupEnabled ModifyThreatCalculateHealthMapVoteEnabledCalculateShieldCalculateEnergyOLTeamsShockComboExpRingGreenCalculateAmmoCalculateScoreOLTeamsShockComboExpRingRed showLinksButtonClickedCurrentServerIsInFavoritesOLTeamsShockComboFlareBlue__OnDraw__DelegateUpdateSpinnyDude FFlagWidget DrawTitle bEnglishOnlyOLTeamsShockComboFlareGold DrawMatchID SameTeamAs StartFire DrawNetInfoOLTeamsShockComboFlareGreenPgDown DrawHudPassAGreenMineClass DrawHudPassCDisplayLocalMessagesShowTeamScorePassCHUDSettingsMenuSayLogout bReadOnlyInternalOnPreDrawbAddToServerPackagesOLTeamsShockComboFlareRedOLTeamsShockComboFlashBlueSetupBotListsOLTeamsShockComboFlashGoldFallbackSoundPackageCriticalEventIsPawnVisibleOLTeamsShockComboFlashGreenOLTeamsShockComboFlashRed AddImage PreBeginPlayPostNetReceiveOLTeamsShockComboGoldOLTeamsShockComboGreenDoJumpOLTeamsShockComboRed IncomingbAlwaysRelevantOLTeamsShockComboWigglesBlueOLTeamsShockComboWigglesGoldOLTeamsShockComboWigglesGreenOLTeamsShockComboWigglesRedPgUp EnemyVisible BaseChangeOLTeamsShockExplosionBlueOLTeamsShockExplosionCoreBlueSetHandOLTeamsShockExplosionCoreGoldStopForceFeedbackOLTeamsShockExplosionCoreGreenFormationCenterOLTeamsShockExplosionCoreRedOLTeamsShockExplosionGoldFindInventoryGoalContinueSinglePlayerGameMustKeepEnemyInvalidFlagWeightOLTeamsShockExplosionGreen AssignComboOLTeamsShockExplosionRedTellBotHowToDisableOLTeamsShockImpactFlareBlueStartMoveTowardOLTeamsShockImpactFlareGoldDistributionNeedWeightOLTeamsShockImpactFlareGreenOLTeamsShockImpactFlareRedSetObjectiveListsDeadOLTeamsShockImpactRingBluePutDownACKOLTeamsShockImpactRingGoldOLTeamsShockImpactRingGreenOLTeamsShockImpactRingRedCheckSquadObjectivesOLTeamsShockImpactScorchBlue SetPauseSuicideMessage NeedWeaponGetViewRotation DoStakeOutSetAlternatePathShouldDeferTo GameEndedOLTeamsShockImpactScorchGoldIsLocallyControlledAddRandomPlayerOLTeamsShockImpactScorchGreenAllowTranslocationBy ValidHolderEliminatedColorCaptureSuccessesWeight IsOnSquadOLTeamsShockImpactScorchRed PutOnDefense SquadType AllowTauntAddTransientCostsSubtractionScoreWeight FRIENDLYFIREFindInventoryTypePhysicsVolumeChangeOLTeamsShockMuzFlash3rdBlue FindTeamForPlayEndOfMatchMessage MatchOver PreLoadBotInitTeamSymbols DisplayDebugNonSubtractionScoreWeight SpawnWaitOLTeamsShockMuzFlash3rdGoldFindHumanSquadOLTeamsShockMuzFlash3rdGreen GOTYOURBACKPutOnFreelanceOLTeamsShockMuzFlash3rdRed SetValueReturnedGreen LogReturnedOLTeamsShockMuzFlashBlueIsHomeDoWaitForLandingLanded PlayAlarm AutoTauntOLTeamsShockMuzFlashGoldOLTeamsShockMuzFlashGreenOLTeamsShockMuzFlashRedYellAtRandomnessWeightTeamBeaconMaxDistTeamBeaconPlayerInfoMaxDistOLTeamsShockProjectileMPStart NumRoundsEndMessageWait ADR_KillOLTeamsShockProjFire ToggleZoomKeepSameTargetWeight StopZoomOLTeamsShockRifleOLTeamsShockRiflePickupCanShowPathToOLTeamsSpecialKillMessageOLTeamsSpeedTrail NEEDBACKUPOLTeamsSuperShockBeamFire ReturnGoldDistributionIndicatorAlertFindPreviousPath IsInPainPrecacheRosterFor DoComboName SetOrdersResetInternalOnChange ReturnGreenBlueTeamColor RedTeamColor YellowColorHasRedHasBlue DroppedRed DroppedBlue CaptureRed CaptureBlue ReturnedRed ReturnedBlue ReturnRed ReturnBlue ADR_Control ADR_Return ADR_Goal NearStringbScoreVictimsTargetbSpawnInTeamAreabPlayersBalanceTeamsbBalanceTeams AddNamedBotDistributionIndicatorENEMYFLAGCARRIERHERE NEEDOURFLAGSinglePlayerWaitDistributionIndicatorWidth bAllowTransGetOrderStringForDistributionSpacingYOLTeamsSuperShockRifleDistributionSpacingXAcceptPlayInfoPropertyInternalOnLoadINIGettingFrustratedWeightOLTeamsTeamSayMessagePlusjoined_miresseCreateInventoryComponentJustificationOLTeamsTransAttachmentOLTeamsTransEffectGoldCTFFlag AIRatingCTFGamejoined_uncommon GOTENEMYFLAG bCanThrow ItemNameRangedAttackTime AmmoStatus GetAIRatingOLTeamsTransEffectGreen SkinsAllowedOLTeamsTransFireOLTeamsTransFlareGoldUseDefaultSkinsOLTeamsTransFlareGreenUseDefaultHeadsOLTeamsTranslauncherOLTeamsTransRecallSetTextOLTeamsTransTrailGoldMenuStateChange GetItemNameHandleParameters GetStyleCheckLinkedObjectsAdjustLinkDamage GetPlayerAim myHasAmmoCustomPackagesOLTeamsTransTrailGreenSetBeamLocationSetBeamRotationOLTeamsVictimMessageLoadPlayerSkinsOLTeamsZoomSuperShockBeamFire RedColor GreenColorOLTeamXBanner BlueColorScoreBoardOLTeamDeathMatch NumTeamsDistributionArrayStructSuccessfulScoresStructCTFGameplayOptionsGroupbMultiFlagCarryDrawCrosshairLargerFontThanbAllowMultiHitMaxTraceDistanceGreenBuildEffectClassFrameBufferBlendingOpAllowDetourToAttemptTranslocation TranslocateGoldBuildEffectClassSuperExplosion SongOLCTF FireRate ReduceAmmo bone flashASetComboTargettestXtestY TargetColorNoTargetColorOLTeamsFallBackSoundPackage RechargeSizeRechargeOriginPlayerSettingsHint ChargeColor GetColor FocusColor ArrowColor innerArrowsY innerArrowsXfocusYfocusXborderYborderXOLMidGameMenuClass FontSizeDestroyTrailsPlayerSettingsCaptionLoadingOverlaysbUseLoadingOverlays DamageMax DamageMinOLTeamBeaconMaxDist bFadeMessage sudden_death AddCharacterbIsConsoleMessageRemoveCharacter bIsUniqueDefendRedFlagDefendBlueFlagbUseCustomLoadingScreensxPlayer KilledStringRequiredEquipmentSomeoneStringOLTeamBeaconPlayerInfoMaxDist Idle_RestOLCustomAnnouncerPackbPlayAllAnnouncementsAnnouncerPackStruct FakeStateResetPhysicsBasedAnimrfootlfoot StartDeResTickFXClientStartFireClientStopFireFillCameraListComboNameListbCanChangeSkinFellOutOfWorld StartEffectLinkGunDefendGreenFlag PRIClassAimAtWeaponReplacementStructRefreshONSOnslaughtGame BareHandedNeverAllowTranslocLastSecondRedLastSecondBlue CTFHintsTGHintsTeamBeaconLinkColor DisableFlag InitGameLast_Second_SaveDeathMessageClass ReplaceArrayGetGameObjectServerDropFlag MutatorClassPreLoadNamedBot KilledByDefendGoldFlagSuperPickupAvailableFindSuperPickupPlayInfoGroup AddToTeamForceGiveWeaponBelongsOnTeamPlayerControllerClassNameForceCelebrateLoginMenuClassLoginbDefaultTranslocator ModeTickDelayedConsoleCommandTeammateBoostVehicleDestroyed CallForBallGameReplicationInfoClassbUseColoredWeaponsThirdPersonEffects TooManyBotsSpecialScoringOptionsGroup TeamMessageClientDelayedAnnouncementNamed SoakStopMaps MessageClassOverrideFollowPlayer PostLoginOLTeamsWillowWhisp bInstantAck currInvDistbAllowNonTeamChatWWclass TGPROPNUM RecipientID BotOrders BestInvDistVehicleDamageTypeBestInvHashbTeamChatOnly TargetDirLevelMinPlayers SuperPickupsTeamVoiceReplicationInfoShockProjectilexDeathMessage bCustomBotsSuperShockRifleInterfaceContent ScoreBoxAbTaken WayPointsNewGRIAssists FirstTouch BotRatio TakenTimeCustomStatusAnnouncerPackCustomRewardAnnouncerPack HolderPRIHolderbHeldbLastSecondSave RecipientIDsbPlayersVsBotsEnergyPctHints HidePath MyTeamNumEpicParticles AnnouncementFlaresAW-2004ParticlesBestDNewD HoldVehicleDoneFormerVehicle VoiceClassGenericIcons PlayerCountEclipseCircleGameObjectNameOrderIDNumRecipients NewObjective GatherTime XGameShadersXGameTextures PlayerTransPlayerShadersZoomFBZoomFXRedBannerShaderBlueBannerShaderPlayerTransRed ModuNoiseRedFlagShader_FBlueFlagShader_FShaders FlagBaseTexR RedScreenS FlagBaseTexB BlueScreenSFlickerFlare2LastRespawnTime GoalScript ButtonBob BorderBoxA1 ScoreBoxC ScoreBoxB PlasmaShaft BandFlashWeapons AirBlastShockComboVortex ComboDecalLinkMuzFlashBeam3rdLinkMuzFlashProj3rdLinkProjSparksLinkProtSphere LinkScorch LinkSparksShockBeamMuzFlash ShockComboShockComboCoreShockComboExpRingShockComboFlareShockComboFlashShockComboSphereDarkShockComboWigglesShockExplosionShockExplosionCoreShockImpactFlareShockImpactRingShockImpactScorchShockMuzFlashShockMuzFlash3rd SpeedTrailTransFlareBlue TransTrailNextSquadMember GoalString DesiredRegen EmitSmoke_t RedMarker_t BlueMarker_t WeaponSoundsPWeaponSpawn1P1WeaponSpawn1 LightningGunMiscLinks bLinkinglslink_muz_greenlink_spark_greenlink_spark_yellowLinkMuzProjGreenFB link_muz_red XEffectMatFlareSpriteEmitter0SpriteEmitter1ParticleMeshesSimpleSpriteEmitter2SpriteEmitter3SpriteEmitter4SpriteEmitter5 MeshEmitter2 MeshEmitter0NewTransEffectBlueNewTransDeresRedNewTransDeresBlue ShockBallNewTransEffect NewLinkTrailSpriteEmitter21SpriteEmitter18ParticleCylinderLinkProjYellowFBlink_muz_yellowlink_muz_blueLinkBeamGreenFBLinkBeamYellowFBLinkBeamRedFBLinkBeamBlueFBLinkProjGreenFBLinkMuzProjYellowFBLightningZoomOutLightningZoomIn BSeekLost1 BaseGunTechbPursuingFlag BioRifle BioRifleGoo2bFinalStretchinstagib_rifleshotLinkProjectileShockRiflePickup WeaponSkinsNEWTranslocatorTEXNEWTranslocatorBLUE SpeciesTypexUtil PlayerRecordbReachedGatherPointbInitLifeMessage LastKillTimeMultiKillLevel bNoReturnxWeaponAttachment xMonitorxPawn NextPath xWeaponBase xTeamBannermyFlag xRealCTFBaseAlternatePaths DefenseSquadDefenseScriptsNextObjective bDisabled BaseOffsetgameObjMinAdrenalineCost GameObjRot DeResMat1 DeResMat0 ShieldHitMatAdrenalineCostGameObjOffset LastGotFlagFindPlayerRecordSpeciesxVictimMessage xTeamGamexPlayerReplicationInfo MinusDiffxKillerMessagePlus xCTFBaseSpecialKillMessageMultiKillMessage PlusDiffZoomSuperShockRifleFreelanceSquad AttackSquad ComboSpeed xTeamRoster xDeathMatch uTeamBanner XGame_rc SC_Volcano_TBanners FlagMeshSC_BannerBlue_FSC_BannerRed_Fxp DefaultName MeshName BodySkinName FaceSkinName PortraitSex charName CharactersbNoConsoleDeathMessages LeftTrail RightTrailDeRezDeRezFinalHeadDeRezFinalBodyDeResFX PrevLocation bLoadNowxbase ComboListXGame_StaticMeshes GameObjects MonitorA MonitorB MonitorC WeaponTypeRagdollRagdollOverrideAllPlayerListbWaitingForPRIbWaitingForVRIUT2004Weapons TeamFaceBotUse bSpawnInSquads Objectives OrderStringUT2K3Fanfare04Players EffectLocRace CTFShaders LoadedSkinMyScoreXGameShaders2004GUIPage HUDContent bAutoDemoRecbCustomPreloadUT2K3Fanfare01 ShockControl LinkColor HUDPulseUT2K3Fanfare06 Fanfares LinkFire GameSoundsFlagLoc numtouchppp TransFire TraceRange LinkScale BeamSoundsoppDisttheFlag EndTimeDelay BestFlag ScoreSound ScoringTeamDisabledObjectiveOutMsgGOlocNamewherenearClosest currDistminDistInstigatorTeam InjuredTeamProjectileFire SmallTeam NewSymbolBlueSymbolNameRedSymbolName TempSymbolsFriendlyFireScale bNoneLeftShockBeamFireLiving TransRecallBotTeam RosterClass bLastMan bAutoNumBotsStandalonePlayerTransFailedSound ComboSound ComboDamage ComboRadiusComboMomentumTransferTransFireSoundRecallFireSoundTransAttachmentSuperShockRiflePickupSuperShockAmmo SniperZoomShockProjFireShockBeamEffectShieldEffect3rdRedShieldEffect3rdBLUEShieldEffect3rdShieldAttachment RedBeaconbInitAimErrorLinkFlexibilityLinkBeamEffectLinkBeamChildLinkAttachment LinkAltFireDamTypeSuperShockBeamSuperShockBeamEffect TransBeacon BlueBeacon InstantFireDamTypeShockComboLinkBreakDelay XWeapons_rc SniperFocus SniperArrowsMyTeam MuzFlashbUpdate ScaleFactorLinking StartTraceLastFOVzoomed EndEffectclr tileScaleX tileScaleYbXbYfXfYbarOrgXbarOrgY barSizeX barSizeY bLockedOnbWaitForCombochargeEmittertXtY tempStartLoc ReflectNumUpTime LockedPawnLinkBreakTimebDoHit bStartFireDesiredAimErrorCurrentAimError EndTrace bShouldStopAdjustedDamageLBbGibMebFailedTransloc EffectNum OldLinks OldLinkColor LinkedPawnbHitSomethingPrevLocPrevRot scorchtime ProtSphere NumChildrenRotDiff WiggleMeBeamDirHitRot EndGameFocusnewdest InitialBots StartupStageZoomSuperShockBeamDamageZoomSuperShockBeamFirebOverTimeBroadcastbForceDefaultCharacterEndTime MinPlayers EffectColorLinkedVehicleHealObjective FlagCarrierFlagCarrierTarget bSeeFlagReturnPathTag ReturnPathBeacon LinkVolume OldMuzFlashDiffZ ELinkColorShockBallEffectbIsHealingObjectiveSentLinkVolume FriendlyFlagLastSeeFlagCarrierValPickedObjective bForceUpdateObThreatVisibleGUIMultiComponent GUIComponentGUI GUIButtonGUISectionBackground GUIImageGUIMenuOption GUIComboBoxGUINumericEdit GUIEditBox GUITabPanelGUITabControlGUIVertImageList GUIVertList GUIListBaseGUIListGUICharacterListGUIMultiOptionList GUIListBoxHudBase NewThreatbFreelanceDefendbFreelanceAttackEnemies SquadMembersSquadObjective NextSquad SquadLeader bHoldingNewBot TeamBots RosterNamesRosterUnrealMPGameInfoImage CTFTeamAI GameObjectTeamAI ControlsSquadAI HoldSpotStringMessagePlusTeamPlayerReplicationInfo WillowWhisp bFreelanceSquadCurrentOrders ShieldGunbHome ItemCount MaxDropTimeSpawnProtectionTimeADR_MajorKill bLastPath BaseExitTime GameObjBoneWeaponDamageTypeScoreBoardDeathMatchWidgetsCTFBase UnrealPlayer DMMutator MaxSquadSize bRepeatClickUnrealTeamInfo DeathMatch AssaultPathUnrealScriptedSequence RosterEntryGameObjective SoundName NextScriptCriticalEventPlusSparks ONSPowerCore NewSoundBaseNumRewardAnnouncerbNoFriendlyFire SpinnyWeapbAllowVehicles PortraitPRIbNoTeamChangesVoteReplicationInfoGameClassName bDrawCoronaInType BeaconTexDemoMenuClass bCancelledbSaveNewTeamActiveChannel TeamUseTimeRecANamediff__OnClose__DelegatebMustJoinBeforeStartbThisClassOnlyStatusAnnouncer DebugStringbRewardSoundsAlternateFallbackSoundPackage HasWeaponVotingReplicationInfoBase GameGroup BotsGroup RulesGroupTeamBoxMaterial HandNames TeamNamesShow3DViewCaptionSpinnyDudeOffsetGUIHorzScrollButton DrawOpImage moCheckBox moComboBox moEditBoxmoNumericEditScoreBoardTeamDeathMatchOutTextbShowPortraitVC FlagIcon DigitsBig AmmoIconAdrenalineCountAdrenalineIcon totalLinksPortraitWidthPortraitHeightAbbrevPortraitString PortraitX CurScore MaxEnergy CurEnergy CurShield Operations LastHealth CurHealthbPlayRandomAnims ActivePageFocusedControltileYtileX ScreenPos SymbolVSize SymbolUSize OrdersTextScoreYL IconScaleNameY MenuOwner ScoreYPos MainFontBluePRIRedPRIMaxPlayerCountScoreBackScale IconSize ChatGroupbHaveHalfFont MaxScaling BoxWidth MyControllerMyOwnerBoxXPos ScoreXPos OwnerOffsetBoxTextOffsetY NameXPos BoxSpaceYPlayerBoxSizeY MessageFoot HeadFootNetXPos MyButton OwnerPosFontReduction OwnerPRIHeaderOffsetYb1b2b3bIsTeam__OnChangeGameType__Delegate SpinnyDude PlayerMesh BodySkin HeadSkinCamRot MyEditBoxMyNumericEdit ActiveTabGetTeamSymbolList CancelButtonUnused SavedPitch PlayerRotTextToSpeechVoiceVolumeTranslauncher__OnDrawItem__Delegate ElementsbConvertSpaces MaxWidth OkButton NowViewing MaxNamePosbNameFontReductionSmallH bTeamLockedVoiceReplicationInfo NameWidth ResetButton LongestNameLongestNameLength ReducedFontLastHealthPickupTime TransEffectbSkinsPreloadedLastVoiceGainTimebDesireSkinPreloadVoicePackNameChildprojBarBorderAmmoIndicator BarBorderBarWeaponIconBarBorderScaledPosition__OnEndDrag__DelegateRecognizedString__OnBeginDrag__DelegateLastArmorPickupTimeVCRLastDetourWeightLastPlayerIDTalkingTime bRefresh HudColorTeamVoiceTypeNamebVoiceChatEnabledTimerDigitSpacer UnrealPawn CallSignsbShouldPreloadbDelayedDamageBarWeaponIconAnimbSmallWeapons"DelayedDamageInstigatorControllerInstigatorController bSpectatedHudBorderAmmo DigitsShieldRemapComponents OldHolderAdrenalineBackground DigitsHealth bAutoSize bDemoOwner RechargeBarTimerBackgroundGUIListSpacerHudBorderShieldIcon DigitsAmmoTimerBackgroundDiscHudBorderHealthIcon PanelCaptionAdrenalineAlertHudBorderHealthbNotifyAdrenalineBackgroundDisc TimerHoursHudColorNormalHudColorHighLight MutateStringHudColorBlackGetPlayerIDHashNetUpdateTime TimerMinutesbInitHudBorderShieldc_Tabs TimerIcon PanelHint TimerSeconds bDropSource bAccepted IconOffset 2K4Menus LastLineAnnouncerVolume eFontScaleHudScaleOffsetPanelsoXL bPendingoYL__CheckLinkedObjects__Delegate bDrawTimer Accepting HudMinScale bExpertModeHudCDeathmatchHudCTeamDeathMatchGUIVertImageListBoxbShowPortraitPaddingPercentbotname GUITabItem bWonMatch PlayerTeamPortalOwner bDeleteMebDynamicLight SmallFontSizeYMatchSetupMenubPlayCrouchesbShowMissingWeaponInfo HudAmmoALERTHudVehicleHealthALERTImageListElemDisableComponentSizeXDigitsVehicleHealthCurYEnableComponent WeaponStateHudBorderVehicleHealthIconDigitsBigPulseHudBorderVehicleHealthHudHealthALERTCurXClipY LinkIcon HorzPerc VertPercAutoSizePaddingKickVotingMenuMapVotingMenuClipX WhiteTexture bNetDirty HeaderBaseZone PickupTimerSizingCaptionRegionLastAdrenalineTime ExtraWeapon__GetItemHeight__DelegateCurVehicleHealthLastVehicleHealth LastEnergyLastDamagedHealthLastDamagedVehicleHealthScalingRealPawnOwner NewControlsBarWeaponStates PageOwner Display95ONSHeadlightCorona InstigatorONSMineProjectilesum bAnimLoopONSGrenadeProjectile ONSMineLayerONSOnslaughtMessageONSMineThrowFireONSGrenadeLauncherONSGrenadeFire MaxMines RedMineClassBlueMineClassVMParticleTextures CoreGroupPlayerWeaponsGroup VMStructures CoreShieldSMMines CurrentMines VMWeaponsSM VMGrenadeYawRotSimAnim bNetInitial bNetOwner bSelected eKillZTypeONSGrenadeBeaconRedONSGrenadeBeaconBlueONSVehicleBuildEffectbReverseBlueTeamDirection bPreSpawn LastSpawnedTargetCycle01 HumanShipAssaultSounds BuildEffectPC_buildBorderNewPC_buildStreaks buildEffects EFlagStatebNeverActivatebSidesAreSwitchedTempSeconds AnnouncerCamLoc GYRColor WinningTeam IndicatorPosi_BG2DeltaSong DeltaTimeUT2K4Tab_PlayerLoginControlsEventInstigator HitNormal NewVolume KillType i_PortraitDamage HitLocationStartDir SkinNamei_BG3ed_Nameb_Leftb_Rightb_Quit b_Settings co_VoiceEnd RelatedPRI_1 RelatedPRI_2nu_FOVco_Handco_Teamch_SmallWeaps lb_Scroll b_3DView b_DoConfig b_ConfigOptionalObjectdistli_Bots ch_AdvancedUT2K4Tab_PlayerSettingsUT2K4SettingsPageUT2K4ServerLoadingUT2K4PlayerLoginMenuUT2k4MainPageUT2k4MainMenuUT2K4LoadingPageBaseUT2K4BotInfoPageUT2K4BotConfigPageSettings_TabsIAMultiColumnRulesPanelUT2K4PlayInfoPanelGamePI InfoRules li_Rules p_Anchorli_Redli_Blue MaxCount bIsCustom AnnouncerVolsNamesCharsNameDsCharDsVoicesVoiceDiTeamiHandiFOViTeamDiHandDiFOVDbWeapsbWeapsD RedSymbol BlueSymbolmcRulesJoinRedButtonJoinBlueButtonRedTeamListBoxBlueTeamListBoxUT2K4Tab_BotConfigBaseGRIYLUT2K4Tab_MainBaseYPosXLTeamSymbolConfigUT2K4Tab_GameTypeBaseLockedFloatingWindowbOutbSoundsb_MainmatPbResult myMarkerUT2K4CustomHUDMenu PropertyName Distance InfoClasses DisplayName SettingNameGUIController Material2p_Main Material1Viewer instigatedByKeyValue ResetStringSequenceItems bOverTimeSelfIlluminationb_Spec b_KickVote b_MapVoteb_Leaveb_Favs b_BrowserRedTeamAltSectionBackground BlueTeamDiffuse NumPlayers i_RedPreviewi_BluePreviewNumBots CurrentID MaxLives TimeLimit BaseMutator RedStringsb_FFAsb_PBKGameRulesModifiersPlayerStyleName b_Symbols b_MatchSetupb_Teamlb_FFAUT2K4GameTabBaseco_SkinPreview MenuSong p_BotConfigp_GameSBRedSBBlueBotConfigRedBackgroundBotConfigBlueBackgroundBotConfigRedListBotConfigBlueList PlayerStyle SymConfigPendingInternalFrameImageGotBlueback3 SymbListGotRed InitialBlue InitialRedli_SymFSSymRedSymBlueSymli_FFA PlayerRec bMainValid bBlueValid bRedValidTIClassCurrentGameProfilemyLevel PlayerID ServerStateMPRIbPauseIndexInOpt StartSpot NewPlayeraPlayerPC PawnClassExitingInvKiller KilledPawn KillerName VictimNamebOnlySpectator ViewTarget NumPoints OtherIndex bNewTeamCurrentSenderWinnerReasonScorer botToRemoveWho NextMutator DisabledInventoryClassNamebSuperRelevant TeamIndex HomeBase GameClassbMatchHasBegunbTeamSymbolsUpdatedRemainingTimeFlags ElapsedTimeRemainingMinute SecondCountTeams TeamSymbols PRIArray FlagStateHasFlagCharacterNameTeamID bIsSpectatorbWaitingPlayer bReadyToPlay bOutOfLivesbBot GoalsScoredBest bDistanceFog VehicleCountMaxVehicleCount VehicleClass mWaveLockEnd mWaveShiftmWaveAmplitude TimeSecondsSinglePlayerTeamSize mSpawnVecAPauser bDropDetailNetModeGameNavigationPointListControllerListMaskMessageStringmyHUDbDisplayMessagesMinutesHoursSpread FlashEmitterFlashEmitterClass Recipient bIsFiring NextFireTime ThisModeNumNDamageNewVel spinRate ImpactSoundMomentumTransferTargetLocationMsgTypebWantsToCrouch LineCount ResScaleY ResScaleXbCanPickupInventory PawnOwnerPRI PawnOwner PlayerOwner FlashCountAnchorBot SpawnTimePendingWeaponShadowCurAmmoPrimaryMaxAmmoPrimarybShowChargingBar FireModebAmountNeededIsMaxF NewTarget IconCoords IconMaterialThirdPersonActor OrderGiver NewOrdersComboClassNameSkillLink HitActorMenunewdist FiringModeDriverdtParentFactoryfogLocDiffhandLinkBeaconTextureTeamBeaconTexturenextNavigationPoint bBehindView bBlockedVel2D markedItem TeamNumbernewRot BestDist RouteDist RouteGoal RouteCache LastSeenTimeEnemyFocus FocalPoint MoveTarget MoveTimernextController bSoaking Priority bWaterVolumeIgnoredAim LightType Handedness bIsPlayerCombobAdrenalineEnabledPlayerReplicationInfoClassInLatentExecution MakeColor SetDrawColor DesiredFOV DefaultFOVLocalMessageClassSetViewTarget DrawIconListSetPosDrawTileStretchedGetCameraLocationbOnlyDrawIfAttached PointRegionInventoryGroup aimerror AccelerationDamageScalingloadHealth HealthMax EyeHeightBaseEyeHeight AirControlJumpZ AirSpeed WaterSpeed GroundSpeed WhiteColor CyanColor GoldColorOLTeamsbShowWeaponInfobShowPersonalInfo OLFlagState OLFlagHolderDesignationTarget OLFlagPosTeamEliminatedbDistribution bDesignationbSimonbCanSeeFlagLocationbCarryFlagBackbFlagElimination bShowPoints ScoresNeededDistributionArraybShowWeaponBarSuccessfulScoresSuccessfulScoresArray HasFlags LastKilledImportantPlayerUseSkinPackageCustomPackage FaceSkin EnemyFlagsbWantNewObjectivebDoNotChangeObjectiveAttackStartTime bGoodPoint bInEnemyBasebRegionsConflict TargetFlag HudScaleURLSpeedFlagTeamIndex FlagPointer MaxSpeed DamageAtten IsDemoBuildAnnouncerPacksIdealPlayerCountMaxIdealPlayerCountMin TimeDilationAnimRepDistanceFogEndDistanceFogColor PlayerList bOLWeapon bIsOverlayOLGRI LocationNamePlayerControllerLocalbStopCountDown iServerInfoOLTEAMSVERSIONOLTeamGamesLoadScreens LoadScreen FriendlyName OtherTeam HudClassMessagingSpectatorDesignationScoreCacheLastSecondSaveCredit bSubtraction LocalMessage GameRulesMapListGameMessageClass PlayerName SetDrawScale SetDrawTypebAnnouncedOverloadbAnnouncedJebbAnnouncedPulsebAnnouncedUncommonbAnnouncedPumabAnnouncedMiresseLastAnnouceTime VoicePackOLV bValidSkinbCheckedForValidity TempBots PlayInfoData smallestteamGreenSymbolNameGoldSymbolNameSetRelativeRotationBestsbAnnouncementAllowed bPlaySound bWinnerTied bForceSmallRealGoalScorebEveryoneEliminatedbScoreIsAllowed KillerTeamSetRelativeLocation AdjustNumPossibleTeams BaseRadius bEliminated ScoreLeft DamageRadiusLeastCapturesClosestHomeBaseHighScoreTeam ColorHintiLoadingScreenMaterialLoadingScreenMaterialOverlayFinalLoadScreenNameLoadingScreen StopAllMusicbTranslocateWithFlagsAddons TheFlags CTFPROPNUM PlayMusicrest GetUrlOption UpdateURL TargetTeamSetBoneRotation AttachToBoneOLPRI LinkMesh FlagBase NumFlagsMapName ServerInfoWorldToScreenType mSpeedRange mRegenRange mLifeRange MyDamageType LightRadiusLightBrightnessbActive LifeSpan bEnabled WeaponPickup KeyValuePair ScoreBoardKilledParticleColorScaleTrailMaterialSequenceItem RotationRatebWorldGeometrybCollideWorldPhysics OLMAXPLAYERS GreenPRIGoldPRIThisTeamIndex EnemyTeamsNumOver NumUnderBeamSize PrevWeaponAIServerResponseLinebHiddenCollisionHeightCollisionRadiusLODSetObjectiveWeightsTheseGameObjectives PickedNum randomness JoinWithNMsgModekSmallestAttackSquadOLBaseVisible OLBaseDistHStepBaseWidthNumDest RightPartposTarget ReplaceTextEbUseSkinPackage bLoadedSkinbUseDefaultSkin NewTeamSkin PropNamebUseDefaultModel OldTeamIndex SecretSkinMoreGameObjRot ScriptText LeftPartABThisDefenseScriptOLTeamGamesTex ScoreBoxGoldScoreBoxGreen CTFTexturesGreenFlagShader_FGoldFlagShader_F FlagBaseTexO FlagBaseTexGOLTeamsHUDAlertNEWTranslocatorGOLDNEWTranslocatorGREENPlayerTransGreenTransRingGreenPlayerTransGold CTF_BannerSC_BannerGreen_FSC_BannerGold_FGoldProjectorGreenProjector RedProjectorBlueProjectorRedShockBeamTexBlueShockBeamTexGoldShockBeamTexGreenShockBeamTexshock_sparkle_redshock_sparkle_blueshock_sparkle_goldshock_sparkle_greenShockFlashRedFBShockFlashBlueFBShockFlashGreenFBShockFlashGoldFBshock_core_redshock_flare_a_blueshock_flare_a_goldshock_flare_a_greenshock_flare_a_redshock_ring_b_blueshock_ring_b_goldshock_ring_b_greenshock_ring_b_redshock_core_blueshock_core_goldshock_core_greenshock_core_low_redshock_core_low_blueshock_core_low_goldshock_core_low_greenGreenTeamScreenSGoldTeamScreenSShock_ring_a_redShock_ring_a_blueShock_ring_a_goldShock_ring_a_greenShockComboFlash_RedShockComboFlash_BlueShockComboFlash_GoldShockComboFlash_GreenShockHeatDecal_RedShockHeatDecal_BlueShockHeatDecal_GoldShockHeatDecal_GreenLinkProjRedFBLinkProjBlueFBLinkMuzProjBlueFBLinkMuzProjRedFBlink_spark_redlink_spark_blueSpiderMineGoldSpiderMineGreen OLTeamsHUDTransPlayerCellGoldTransPlayerCellGreenTransRingEnergyGreenshock_flash_redshock_flash_blueshock_flash_goldshock_flash_greenlink_muzmesh_redlink_muzmesh_bluelink_ring_redlink_ring_bluelink_connect_greenlink_connect_yellowDeRezFinalBodyRedDeRezFinalHeadRed DeRezSkinRedDeRezSkinGoldDeRezSkinBlueDeRezFinalBodyBlueDeRezFinalBodyGoldDeRezFinalHeadBlueDeRezFinalHeadGoldMarkers GoldMarker_tGreenMarker_tGreenBannerShaderGoldBannerShader GreenShell GoldShellCjitSWClockwiseFrom_IntInt OLVoiceClassGR Location bOLTeamSet Rotation Velocity ReturnValueVStaticSaveConfigDynamicLoadObject xEmitterWeapon WeaponFire AmbientSound LevelInfo GameInfo Decoration OLTeamIndex ProjectilerealjtmpXtmpY ZoneInfo PlayerStartInventorySpot NameStringHUDPlayerReplicationInfoGameReplicationInfoPickup Inventory Ammunition bHasOwnFlagATeam AIController ControllerSVehicleFactory AIScriptPhysicsVolume TeamInfoWeaponAttachmentbPendingGoHomebPendingEliminationReplicatedHolder FakeFlagMutator GameProfileNavigationPointAnnouncerVoice SoundVolume MyRotation ProjectorsCanvasFontLevel bIsHookedShader SongPrev RulesTab OldRulesTabBotsTab OldBotsTabPlayerSettingsTab CombineraUT2K4GamePageBaseConstantColor TexScaler FinalBlend TimeFadeOut TimeFadeIn TheSongPrev TimeDeltaiSequenceItemGUIImagePreviewMaterialSequencePreviewMaterialSequence Modifier MeshEmitterEmitterPlayer PlayInfo Projector GreenSymGoldSymSpriteEmitterPawnVehicle MaterialBitmapMaterialParticleEmitter VertMesh li_Greenli_GoldVoiceChatReplicationInfoVoiceChatRoomInfoActorb4 bGreenValid bGoldValidCharsCountHeightVoicePackPrev ClassName iVoicePackGUIComponentSenderVSizeUSizeYaw TheSoundRoll SettingsOptions SoundGroup b_AddGreen b_AddGold InitialGold InitialGreenProceduralSoundConsoleCmdRoleTagEventClassPackageSymbols GotGreenGotGold GreenSymbol GoldSymbol SymbolsSplitConstSwitch TextBufferObjectEnum FunctionStateRotatorStructName StrPropertyStructPropertyArrayPropertyClassPropertyDelegateProperty NamePropertyObjectPropertyFloatProperty BoolProperty IntProperty ByteProperty ShockRifleSBGreenSBGoldGreenTeamListBoxGoldTeamListBoxJoinGreenButtonJoinGoldButtonBotConfigGreenBackgroundBotConfigGoldBackgroundBotConfigGreenListBotConfigGoldListTestVoicePackButtonPlayAllAnnouncements BlueBack GreenBack GoldBack GreenPreview GoldPreviewP%e!i &-9:9:$-9:9:$-d-9:9:$-p-9:9:$-n-9:9:$-P -9:9:$G6Zشo ӥ3}3}3}3}3}ROROLJYY8RO_u'3},eIJ,eF$_!v s<-9:9:$--9:9:$G2 ROB,ҽJJҽҽ3}>Zشoҽҽ3}>ZشoJJҽҽҽ/$ !AOIAOIJ3}3}?4$}i TKS ~ UoR @\!f%T Z 6M_ .oq]OLTeamGamesAnnouncert@B @d!P7uFI^fu&[ z 2t!>\fFB_B_ROǐ|B_B_|B_|B_%xB_|ROǔ$q$,eROdž,eYY8J'$''$||$qV V V V V V V V V ||||$|||3}'wE"$'$'$'|ROǎ3}>Zشo'$|$$$nYY8J''$||$|||3}3}|||||$$nYY8J$||$3}$$q||$$$nYY8J$||3}||||$$$nYY8J$|D$$|$|$$$|$q3}||||$$$q3}'wE"|$$$$'',e$n||B_,e||,e$,e$||$|||||,e,e,e,e,e,e,e,e,e||,e|||||||||,e||,e|B_,eB_,eB_|B_,eB_,e$,e$||||||$|$|||||$nYY8J|$$nYY8J$,e|$nYY8J$$nYY8J$$$q$q3}$$q$ʁ)$q$q$q$ʁ)$q$q|B_$q|B_$q$|B_$ʁ)$q$q$q|B_$q|B_$q$|B_$ʁ)$qB_$B_|||B_||$$$|$'|||$||B_3}>Zشo'|B_|||3}3}|||$3}>Zشo'YY8J$|$|B_$|B_|3}|||||||$$|$|B_$|$||$$q|B_'y|B_|B_|B_|||||B_|||$||$|$$$|$||||||B_$$q$|$|B_$ʁ)|YY8|B_$q'3}ɢ3}>Zشoɢ.ɢ.ɢ.{#{#|{#{#{#|{#{#|ɢ|ʁ)|B_|B_q'$$nYY8J',e$,e'3}'='bp3}||||ROǎ3}'wE"||B_ʁ)||||}L3}|}L||B_||B_|ROǔ$|q|||||B_ʁ)|}L|B_ʁ)|||||||||B_|||V |||||||||||||ROǐ|$$ɢ|RiXz&`F ?-.-n wa *9:9:$GBk_u$Zشo3}=Z?'3}>Zشonnnnnnnn3}=Z?'3}=Z?',e,e3}'wE"3}'wE"3}=Z?3}>Zشonnqnq3}=Z?n3}=Z?nqq3}=Z?'3}>Zشonn3}=Z?'3}qqq3}qq3}>Zشoqqq3}q3}=Z?',e3}=Z?',e,eROdž,eROdž,eROǎ3}=Z?_uq,e|\fFZشon3}> ӥ ӥROǫ ӥROǫ ӥROǫ ӥROǫ ӥROǫ ӥRO?4 ӥROǫ ӥYY83}nROnROnROnROnROnRO?4nROnYY83}3}!&nYY8Jn3}!&nYY8J3}!&nYY8Jn3}=Z?'nB_B_B_B_B_|B_|}L3}B_|}LB_3}'wE",eYY8bQ nqq|,eYY8'y!>',eROU z脆,eROǎ3}'wE",en[^4+[^4+ut[^4+[^4+,e,enn,eROdž,eROZشo,e,eYY83},eYY8J,en,eYY8J',e,e,e,e3}3}>ZشoZشoq|Hx" ZشoJY| p` qS&j\6w !&u'yqq Eqډq|xq|xq|xIJ KJ KJIJYY8IJYY8JIJ&D''''''3},e,eIJ,en82вввввввввв'yZشoZشoJʁ)ZشoJʁ)ʁ)ZشoJʁ)ZشoJ,e,eB_,eB_,eB_%x,e,e}L,e3}ɢ{{,eB_q,eB_ɢ{{#,e,eYY8q,e3}>IJ''3},e,eIJ,e3},e,eYY8,eYY8J',eYY8J,eYY8JB_pB_B_,eB_B_,eB_|,eB_B_,eB_,e,e}Lo>+B_B_B_B_RONJB_,eB_,eZشoZشoZشoZشoZشoZشo'ZشoZشoZشo'ZشoZشoZشoJ'yROLJYY8JZشoROZشoYY8J,eYY8,eYY8J,eYY8,eYY8J,e,e,e,e,eYY8,eYY8,eYY8,eYY8,eROdž,e,eROdž,eROǝX5,eYY8,eYY8,eYY83},eB_B_YY8,eYY8B_,eYY8,eYY83},e,eROo>+,e,e,eYY8,eYY8,eYY8,eYY83},e,e,e,eYY8J,eYY8J,e,eYY8,eYY8Zشo,eYY8J,eYY8Zشo,eYY8J,eYY8JZشo,eYY8JZشo,eYY8J,eYY8,eYY8J,eYY8J,eZشo,eYY8J,eYY8J,eYY8J,eYY8JZشoZشo,eYY8J,eYY8J,eYY8J,eYY83},eYY8,eYY8J,eYY8J,e,eYY8J,e,e,eB_,eB_,eB_,eB_,eB_,eo>+,e,eROo>+YY8YY8JYY8JZشo q}oB ӥ,e,eYY8,eYY8,eYY8,e,eYY8,eYY8J',e,e3}''''3}3},e,e,eYY8,eYY8,e'''',eB_3}'''',e,eYY8,e,eYY8,eYY8IJYY8B_B_YY8IJYY8YY8,eʁ)3},eIJYY8IJYY8 ӥIJIJIJIJʒIJYY8 ӥ,e,e3},e,e,eYY8,eo>+ ӥYY8'''' ӥ3},e,e,eYY8 ӥ,eYY8YY8,e,e3}YY8YY8YY8YY8IPæ'y3}IJ,eROdž,eROǎ3},e,eIJ,e3}3}3},eYY8JJ,eIJYY8J'yqqIJYY8JqIJIJB_IJYY8J'yqqIJYY8JqIJIJB_3}3}3}3}Zشo''''IJYY8IJYY8J'''''YY83},e,e,e,eYY8,eYY8,e,e,eYY8YY8,e7'3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}3}/$3}3}3}7'AOIAOIAOI3}3}3}3}_ .MMMMMMMMMMMMMMMMMMMZشoZشoZشoZشoZشo'''yZشo'E)''yZشo|||YY83}|IJIJIJ|||\fF|ROǐ|B_||||B_|B_ROǐ||v|B_|\fFq|\fF|\fFB_|B_|\fF|\fF|\fFB_|B_|B_|\fF||v|B_|\fFq|B_||\fF|\fF,e||\fF,e|3}3},e|,e,eYY8IJYY8,eYY8|B_|,eYY8,e3},e|,e,eYY8IJYY8,eYY8|,eYY8,e3}3},e|,e,eYY8IJYY8,eYY8|,eYY8,e3}3},e|,e,eYY8IJYY8,eYY8|B_|B_,eYY8,e3},e|,e,eYY8IJYY8,eYY8|IJ,eYY8,e3},e,e,eYY8IJYY8|,e,eYY8,e||,eZYX"QyWM$>OEOEOEOEi]OLTeamGames.OLTeamsRedWhispiOLTeamGames.OLTeamsBlueWhispiOLTeamGames.OLTeamsGreenWhispiOLTeamGames.OLTeamsGoldWhispV] Near then] Bare HandedLyLZLHLMknkmkCkAsVsjsEsDKsKkKQK@G]%$TeamSymbols_UT2003.Teams.ApocalypseG&%TeamSymbols_UT2003.Teams.BlackLegionG%$TeamSymbols_UT2003.Teams.BloodFistsG'&TeamSymbols_UT2003.Teams.BoneCrushers{]Bots Balance Teams{Players Balance Teams{Friendly Fire Scale{Cross-Team Priv. Chat{Number of teams{Colored Weapons{ Distribution{  Subtraction{  Designation{ Elimination~]<;Bots will join or change teams to make sure they are even.~>=Players are forced to join the smaller team when they enter.~MKSpecifies how much damage players from the same team can do to each other.~_]Determines whether members of opposing teams are allowed to join the same private chat room.~"!The number of teams in the game.~NLSome of the weapons will be colored depending on the team the player is on.~`^When this is true, the Goal Score represents how many times you must score against EACH team.~rpScoring gives your team one point, and the team scored against loses one point. Rewards teams for good defense.~hfEach team is assigned a team to attack. You may only score against a team you are assigned to attack.~ݿ }If a team is scored against too many times, that team is eliminated. They remain in the game, but can no longer score or be scored against. Only works with subtraction and/or distribution.T]Special Scoring OptionssiwIf you miss a player's chat message, you can use %INGAMECHAT% to display a box of all chat messages you have received.fUse the link gun alt fire beam to can link up with link gun carrying teammates. While linked, the teammate will receive a significant power boost to their link gun.KYou can toss your current weapon for a teammate by pressing %THROWWEAPON%.yTeammates who have a link gun equipped will have a white team beacon above their heads instead of a team colored beacon.0Press %VOICETALK% to voice chat with your team.TPress %TEAMTALK% and type your message to send text messages to other team members.sThe text-to-speech feature that makes the game read text messages aloud can be enabled in the audio settings menu.U$AT$@S$@vn"o"_"H]"!OLTeamGames.OLTeamGamesLoginMenudSd _ ]('OLTeamGames.ScoreBoardOLTeamDeathMatch\ ]TeamK"<xK|] OLTeamGames.OLTeamGamesMutatorF]$#OLTeamGames.OLTeamPlayerControllerPY1GOp]!y&n 6'wE"!&вввв_u_u_u_uZشo_uʁ)YY83},e,e,eYY8ݝҳݝҳ,e,e,e$ݝҳ$ݝҳ$B_B_RONJB_RO_u_u,eYY8$,e$ʁ)$q$''ʁ)'ʁ)$',e,e$,eYY8,e,eYY8,e,eYY8,e$$,e$,eYY8$,eYY83},eYY83},eYY8,e,e$$$$$,e$,eYY8,eYY8J,e,eYY8J$',e$'$'Zشo,eYY8J$Zشo$,eYY8JZشo,eYY8J$,e$,eYY8J,eROdž,e,eROdž,e$',eYY8J,eYY8'y$X53},e,e,eYY8,eo>+ ӥYY8'''' ӥ ӥ'bp$ʁ)3}3},e,eIJIJIJIJYY8IJYY8 ӥIJʒIJYY8 ӥ,e$q$,eROdž,eRO_u'=$'=$$$'$$'bp$'bp'bp _YY83}|!>$,eYY8JD$YY8JD$n,eROdž,eB_YY8Jʁ)Zشo$$$$DDDDIJYY8JZشoZشoZشoJZشoZشoZشoZشoʁ)IJZشoIJʁ)Zشoʁ)ʁ)ʁ)Zشoʁ)IJIJB__ .MMMMMMMMMMMM,eROROljJ,eROZشoROljJZشoROljJJZشoZشoROljJZشoZشoZشo3}3},e|,e,eYY8IJYY8,eYY8,eYY8'bp,eIJ,eYY8,e}L7' YrikYou can use %BASEPATH 0% to see the path to your base and %BASEPATH 1% to see the path to the enemy bases.Firing the translocator sends out your translocator beacon. Pressing %FIRE% again returns the beacon, while pressing %ALTFIRE% teleports you instantly to the beacon's location (if you fit).\Using the translocator to teleport while carrying the flag will cause you to drop the flag.gPressing %SWITCHWEAPON 10% after tossing the Translocator allows you to view from its internal camera.NPressing %FIRE% while your %ALTFIRE% is still held down after teleporting with the translocator will switch you back to your previous weapon.LCTF4 fully supports voice recognition. While playing Instant Action, try commanding your bots to attack certain teams with your microphone.LYou can preview the green and gold skins by going to instant action, selecting a 4-way gametype, and clicking on the "Player Settings" tab.\_]Carry Multiple Flags_Carry Flag Back_  Omniscience_Translocate with Flagsa]54Allows players to carry more than one flag at once.a>=You must carry your flag back to base in order to return it.a݈FAllows every player to see the current location of every flag. The indicator on the HUD will point to the flags instead of the bases.aݾ|Allows players to use the translocator while carrying flags. When a player picks up a flag, his translocator beacon will be recalled so he cannot immediately translocate back to his base.[]CTF4 Gameplay OptionsySmk"WSXWObObObObPDBi~ *OLTeamGamesLoadScreens.AnubisResurrectionOLTeamGamesLoadScreens.Chrome$OLTeamGamesLoadScreens.DuelingKeepsOLTeamGamesLoadScreens.JoustOLTeamGamesLoadScreens.RomraOLTeamGamesLoadScreens.Skyline'OLTeamGamesLoadScreens.TutorialClassicOLTeamGamesLoadScreens.Clash#OLTeamGamesLoadScreens.FaceClassic"OLTeamGamesLoadScreens.Geothermal$OLTeamGamesLoadScreens.Crossroads][Ci*OLTeamGamesLoadScreens.LoadscreenOverlay1*OLTeamGamesLoadScreens.LoadscreenOverlay2*OLTeamGamesLoadScreens.LoadscreenOverlay3*OLTeamGamesLoadScreens.LoadscreenOverlay4*OLTeamGamesLoadScreens.LoadscreenOverlay5*OLTeamGamesLoadScreens.LoadscreenOverlay6aJvSd]xGame.xTeamRosterp$@L]! OLTeamGames.HudOLCaptureTheFlagZ ]OLTeamGames.MapListOLCTF[ ]CTF4\ ]CTF4K"V q]]CTF4\mOMYour team must score flag captures by taking the enemy flags from the enemy bases and returning it to their own flag. If the flag carrier is killed, the flag drops to the ground for anyone to pick up. If your team's flag is taken, it must be returned (by touching it after it is dropped) before your team can score a flag capture.] ])(OLTeamGamesTex.ScreenShots.CTF4Sequence^ ]OLTeamGames.OLCTFGamee]CTF4m _ >^ P;e&Ld 2.׿e]jO U a@)!i ln%zR  6;59:ݝҳ3}FݓFu*Fu*F h:Fݓ/$YY8 !AOIAOIYY8J3}3}3}u*F h:YY8 zה zהZشoRORO_u3}3}3}u)u*FYY8 ӥYY8JYY8JYY8JYY8JYY8u*F h: $3}_ ._ .$H]"!OLTeamGames.OLTeamGamesLoginMenuG$EU$DW]%$OLTeamGames.OLTeamsAnnouncerBennettXc]OLTeamGames.OLTeamsComboSpeedj$k$nU!o _ k@ZA p%f~-9:9:$GBY6FAOI'> YY8YY8JYY8JYY8JYY8J3}3}u3}uYY8YY8JYY8YY8JYY8YY8JX5X5X5X5X5X5X5X5RORO_uW=W=W=u/$/$YY8JYY8J !/$ !YY8JYY8JROROLJYY8Jډq|q|ډ$HTTTnTw\\\g\jccccddddf*fffk*kkkziR LDemoPlayerSkins.Jakob_BodyDemoPlayerSkins.MercFem1_BodyDemoPlayerSkins.MercFem2_BodyDemoPlayerSkins.Othello_BodyPlayerSkins.AlienFemaleABodyAPlayerSkins.AlienFemaleBBodyA#PlayerSkins.AlienFemaleBBodyFinalAPlayerSkins.AlienMaleABodyAPlayerSkins.AlienMaleBBodyAPlayerSkins.BotABodyAPlayerSkins.BotBBodyAPlayerSkins.BotCBodyAPlayerSkins.BotDBodyAPlayerSkins.EgyptFemaleABodyAPlayerSkins.EgyptFemaleBBodyAPlayerSkins.EgyptMaleABodyAPlayerSkins.EgyptMaleBBodyAPlayerSkins.JuggFemaleABodyAPlayerSkins.JuggFemaleBBodyAPlayerSkins.JuggMaleABodyAPlayerSkins.JuggMaleBBodyAPlayerSkins.MercFemaleABodyAPlayerSkins.MercFemaleBBodyAPlayerSkins.MercFemaleCBodyAPlayerSkins.MercMaleABodyAPlayerSkins.MercMaleABodyCPlayerSkins.MercMaleABodyD!PlayerSkins.NightMaleBBodyFinalAPlayerSkins.MercMaleCBodyAPlayerSkins.MercMaleDBodyAPlayerSkins.NightFemaleABodyAPlayerSkins.NightFemaleBBodyAPlayerSkins.NightMaleABodyAPlayerSkins.NightMaleBBodyA%UT2004PlayerSkins.Hellion_Baird_Body'UT2004PlayerSkins.Hellion_Garrett_Body%UT2004PlayerSkins.Hellion_Gitty_Body$UT2004PlayerSkins.Hellion_Kane_Body&UT2004PlayerSkins.Hellion_Outlaw_Body#UT2004PlayerSkins.Hellion_Rae_Body$UT2004PlayerSkins.Hellion_Rae_Body2!UT2004PlayerSkins.HellionF1_BodyUT2004PlayerSkins.Oph_Body!UT2004PlayerSkins.MercFem1_BodyB!UT2004PlayerSkins.MercFem2_BodyB!UT2004PlayerSkins.MercMale_LoganUT2004PlayerSkins.Enigma_BodyUT2004PlayerSkins.XanF1v2_BodyUT2004PlayerSkins.XanF2v2_BodyUT2004PlayerSkins.XanM2_BodyUT2004PlayerSkins.XanM2v2_BodyUT2004PlayerSkins.XanM3_Body UT2004PlayerSkins.Xanmk3v2_Body UT2004PlayerSkins.NightMareBodyUT2004PlayerSkins.Skaarj2_body$UT2004PlayerSkins.Skaarj2_body_rageUT2004PlayerSkins.Skaarj3_bodyUT2004PlayerSkins.Skaarj4_body&UT2004PlayerSkins.Skaarj_body_default#UT2004PlayerSkins.Skaarj_body_tats"UT2004PlayerSkins.Skaarjtech_bodyUT2004PlayerSkins.Skakruk_body!UT2004ECEPlayerSkins.MetalG_Body#UT2004ECEPlayerSkins.MetalGv2_Body"UT2004ECEPlayerSkins.MSkaarj_Body$UT2004ECEPlayerSkins.MSkaarjV2_Body"UT2004ECEPlayerSkins.Necris2_Body!UT2004ECEPlayerSkins.Necris_BodyCBP2_Aurora.Shader.BodyAFBCBP2_Bale.Shader.BodyAAFBCBP2_Enki.CharB.BodyBAFBCBP2_Enki.CharB.BodyBBFB#CBP2_GothGirlTextures.GothGirlBodyCBP2_Karaash.Shader.BodyAFBglumpftextures.bodyalphaUT2004PlayerSkins.XanF2_Body}iDemoPlayerSkins.Jakob_Body_2 DemoPlayerSkins.MercFem2_Body_2DemoPlayerSkins.Othello_Body_2PlayerSkins.BotABodyA_2PlayerSkins.BotBBodyA_3PlayerSkins.JuggFemaleABodyA_2PlayerSkins.JuggFemaleBBodyA_3PlayerSkins.MercFemaleABodyA_3PlayerSkins.MercMaleABodyC_2PlayerSkins.MercMaleABodyD_2PlayerSkins.MercMaleBBodyA_2PlayerSkins.MercMaleDBodyA_2 PlayerSkins.NightFemaleBBodyA_3(UT2004PlayerSkins.Hellion_Outlaw_Body_3&UT2004PlayerSkins.Hellion_Rae_Body2_2#UT2004PlayerSkins.MercFem2_BodyB_2#UT2004PlayerSkins.MercMale_Logan_2 UT2004PlayerSkins.Enigma_Body_3 UT2004PlayerSkins.Enigma_Body_3!UT2004PlayerSkins.XanF1v2_Body_3!UT2004PlayerSkins.XanM2v2_Body_3UT2004PlayerSkins.XanM3_Body_2"UT2004PlayerSkins.Xanmk3v2_Body_3i UT2004PlayerSkins.Enigma_Head_3!UT2004PlayerSkins.XanF1v2_Head_3UT2004PlayerSkins.XanF2_Head_2UT2004PlayerSkins.XanF2_Head_3UT2004PlayerSkins.XanM2_Head_2UT2004PlayerSkins.XanM2_Head_3!UT2004PlayerSkins.XanM2v2_Head_2!UT2004PlayerSkins.XanM2v2_Head_3UT2004PlayerSkins.XanM3_Head_2"UT2004PlayerSkins.XanMk3v2_Head_2"UT2004PlayerSkins.XanMk3v2_Head_3%UT2004PlayerSkins.Hellion_Rae_Head_2%UT2004PlayerSkins.Hellion_Rae_Head_3$UT2004PlayerSkins.SkaarjTech_Head_2$UT2004PlayerSkins.SkaarjTech_Head_3!UT2004PlayerSkins.Skakruk_Head_2!UT2004PlayerSkins.Skakruk_Head_3(UT2004PlayerSkins.Hellion_Outlaw_Head_2(UT2004PlayerSkins.Hellion_Outlaw_Head_3LiL OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkins OLTeamSkinsOLTeamCBPSkinsOLTeamCBPSkinsOLTeamCBPSkinsOLTeamCBPSkinsOLTeamCBPSkinsOLTeamCBPSkinsOLTeamCBPSkins OLTeamSkinsSOLTeamGames.OLTeamsShieldGunN@&3 Ynw|@jL{ @H @UwKHCq@s 0h^@YQ@ Xp]\ XlEt&Cy 2QbpE)'\fF\fF\fF\fF\fF\fF\fF\fF3}>3}'wE"Zشo'Jq3}'wE"Zشo'qZشoZشoq$'$||8f|\fF!>!>||8f|8f|IJʁ)IJ|A_t$IJIJʁ)|v|\fF\fF!>3}>Zشo'\fF\fF\fF!>3}\fF\fF\fF\fF\fF\fF\fF3}>Zشo'\fF\fF\fFq\fF\fFq\fFq\fF\fF!>!>3}\fF\fF\fF\fF\fF\fF!>\fF3}>qD''D3}'wE"Zشo'DZشo'DZشo'DZشo'D3}'wE"D$'D$'D$'D$'!>\fF\fF3}!>3}!>q!>$!>!>^$@f$=B$)\=I$>T$=i$=s$>h$[:FX }|HF@d K@Z%o{{sV@T%|GR tcL@R cLKR@s mMZ&lx 2E)'y3}>3}u\fF\fF''''\fF\fF\fF\fFQ@T*M& @SDIL @Shh z@I~ @bWT0 w@\ EdK @@x!G@kR@\[ L$m@@n@@nt R ]yh@cgNMy^oJ| BC&q&S6 >BYt5+rٺ+rپ +rپ +rپ  +rپ  +rپ +rپ  +rپ +rپ  +rپ  +rپ +rپ +rٺ+rٺ+rٺ+rٺ+rٺ+rZ,Cƺ+rٺ+r,C  hhhhhhhhhhhhhhhho2  RrHA C(O D(Q ] Blue Teaml = Green Teamz ] Gold Teama@(lA(mB(Z Y aX DW U $\w?G@jSdE[ @Bse _s@FLL PRG o h nIcW @mpA^}kZ I D =Bi@SM@Q@ AIr!SbKt{@k#XD#h!O 6laE/ p p$zG I r@H"N \@Et[1qi,e,eB_,e,eB_,eB_,eB_,e,e,e,e,eʁ),eB_,eB_C@ @U d Jb&OB @36L$&s6ɢɢɢ.3}ɢɢɢɢ.ɢɢɢɢɢ.ɢ.3}ɢɢɢɢ.ɢɢɢɢ.ɢ3}ɢɢɢɢ.ɢɢ3}3}3}>vvvvZشoq|Hx" Zشo$YcR  S@ W#\ 7w*SY.-q 9?, GW Y&G L BTs16.8Zشoq|Hx" Zشo$H UJ#,9:9:$a!HL?]w*S9:9:$q9:V 9:JwJ*wJ*e9:JJJ G_ _@R"I@6[^4+ۉխB_IJB_B_YY8B_YY8JB_YY8JB_YY8JB_YY8J&HcwcgXATfl| cC p t sj@|Uq xdVc |p\ @Kj@C ay^} 8v$O^ -9:9:$G"K)p=ɍ3}3}B_5?B_5?3}3}3}3}B_o ]&n gU%]~ Z~GL]Y  @Vf $wOB!Zb W @Vo% @ufL@QmY@L\Tq$E Q Brp3?3tZشoHxZشo$xxxxA@k w@f&A~@AxCNE~Q @Tow` wpFeIrA [@n[ T M,[`@lc\ig c^kTsU+f! x X@ _Kk m K ~G!x&}} 2@tKhF݉JJ ] You have the@]flag, return to base!e]! You have flags, return to base!i]%$You have your flag, return to base!A]TheG]! team has your flag, recover it!M]Your target is theP]teamI]redIblueIgreenIgoldS*H*T*V*c KSHY"y*{${.>@"v[ c b y$j S -9:9:$GB]  A@aXB e _pDid CO  JF `"h"{N  k8QF UpB_ʁ)ʁ)B_B_B_&csF"E"F $PGdi$̌?y x "v@~}WQ%Eu-Mr-TO6WsppO_9S^$.s 'zw$*T $-M'pppWARNING! Unable to find teamskin: s for mesh 6W!o-M -6WO6WhppO_9S^$.h '=w$*s$opWARNING! Unable to find teamface: h!u^& ^,O6WO._sppppm.O_9S^-Y(R%-R7v#|Rvpp6W_9S^-Y'-RF-Ys6W$.s 'w$*T $-M'pppWARNING! Unable to find teamskin: s for mesh 6W!-M -6WO6WO._hppppm.O_9S^-Y(R%R7t|Rtpp6W_9S^-Y'R=-Yh6W$.h 'w$*s$pWARNING! Unable to find teamface: huu^, ^,s6WaBsp_9S^$.s 'w$*T $-M'pppWARNING! Unable to find teamskin: s for mesh 6W!u-M -6Wh6WaBhp_9S^$.h 'Cw$*s$upWARNING! Unable to find teamface: h!-M$.6W 'w$*T $WARNING! Tried to fall back to default skin, but failed.!rs*$.6W '@w$*s$WARNING! Tried to fall back to default face, but failed.!w.$*.$$w.$*w..$*..$$ G @zR sW%I&u6 "U 71[*59:ē59:59:ē59:zmMMIJIJzmZ59:zmZ59:zmzmZMzmMMRrH^ q_ y` HL JG ZP ^{ ]OLTeamGames Client Options $>!$L>$?)$>g\ e"Du6X sX)U&H[*[[[cF c_^ XZ @Y @Z  \ ` Ia UCtj !t eVo E M }k@JLmwi~xNz^T@ \@NC @D @~ VU a@L Wqj:6 @ 6 9D9?9D9?@ 9?6 ?9?@ 9?6 ծL>qի9?- ?a  dq!E  GQ  @XP[ @Va@O f_ @XP x}z^ K  @VQ@tyqDv@VB] @ a M H lE nj @jyo ugd@v p ^z @v~ @n @I @D@}E @ r#]"~F UpD3T3}B_B_YY8B_YY8J%xB_B_YY8%x%xB_YY8J88&qAqlqiq[w{wCwTwOH I O ^ [Zb W iyOg@dV M@tiQ O ] @^ @_ @P@R@DU a @Y f AOt @u@@H@ZIbts em ghkmD&Y#A 6 ]{  [!AOI/$ ˆ=ˆ=AOI>>>>>3}IJIJIJIJIJIJIJIJIJIJIJIJIJIJIJIJddIJIJYY8IJIJYY8JzmIJIJYY8IJIJYY8IJZIJzmIJ IJzmzmzmzmzmzmzmzmzmzmzmIJ>>>>> dd 0dd 0 0珛ˆ=ˆ=ˆ=ˆ=ˆ=hhhhhhhRrHC]View Normal SkinCView Red SkinCView Blue SkinCView Green SkinCView Gold SkinY]RedYBlueYGreenYGoldYNoneuA RvrD!D @[&I MP J @iJ_hc V Sj vm f r&C v BU z脔$,enRORO?4PBxi @paX @kRHKO@ a N E"r"Rd ɓN  k8Q&_si @r$Z j @g @_[ [j @m @Me@i$ao @o ]5?W=W=W=W=c*cccv*vvvQYA'zX _"Qd6q ' X sX&HcN cN p$?tS^ u]Super Shock RifleF SqXS] Blue TeamW$ #)$L>g't dnv {  i"El-9:9:$G#z $3}3}3}3}Ǚ&ChCuCsCtdS`_slsQsqsrHqHLHpHonnnnZ Z Z Z [x^@RWM@KG@C@jE@Dpxs } uu zSv [NUaB @d Ozlz(!-iP&,P-i-s 'L%LeLzz6QL.@V%-s (LD-F%z 9?P-s '-s (z.j$-iL%L Lz(z6QL.@V%Lz6QL.@VL 9?LYL9?LEnemy_Team_Eliminatedz6QL.@V%.9?&Lv-CL%vLlL.OzZLL&z G*' GF#U@_O~YE#W@`B~YuvD#Y@dT~YXfVpkngf']]>JvV\4IJIJIJIJIJZشoIJZشoYY8JIJZشoJIJJҽҽҽҽB_B_B_B_ҽҽҽB_B_B_B_B_B_B_B_%xIJҽIJҽIJYY8J59:ďҽډҽډډډډ59:ĊB_YY8B_YY8B_YY8B_B_YY8B_ҽҽҽҽډҽB_YY8B_B_YY8B_YY8B_YY8JB_YY8Jҽҽҽҽҽҽҽҽҽҽҽ}LҽҽҽҽҽҽҽҽB_%xB_B_B_B_@q%x%x%x%x@q%x%x%x3}%x%x%x3}3}3}3}3}3}IJZشoZشoZشoJZشoZشoIJZشoZشoZشoZشoZشoҽҽҽҽҽҽҽҽZشoZشoZشoYY8JҽҽIJZشoIJZشoIJZشoIJZشoIJ ӥ ӥ ӥIJ3}3}ҽҽҽҽҽҽҽҽYY8ҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽYY8ҽYY8Jҽ3}YY8IJIJ zהYY8_ҽҽҽҽB_B_%xҽIJB_ҽҽҽB_YY8ҽҽҽҽҽҽҽҽҽҽҽҽҽB_YY8B_B_%xB_B_%x \" \" \"B_}L}L}LB_3}B_3}3}YY8YY8YY8JYY8YY8YY8rH`Z@B/D"0$q= ?*.$?$-"," *E"`@B/D"0$q= ?*.$?$-"P," *E"`@B/D"0$q= ?*.$?$-","W*E"`@B/D"0$q= ?*.$?$-"P,"W*E"aZ9`>/6Z<7"?":"N;"0$?*.$?$-"," AB$?*a9`>/6Z<7"?":"N;"0$?*.$?$-"," AB$?*a9`>/6Z<7"?":"N;"0$?*.$?$-","AAB$?*a9`>/6Z<7"?":"N;"0$?*.$?$-","AAB$?*dZ9`>/6Z<7"w?":";"90$?*.$?$-","AB$?*d9`>/6Z<7"w?":";"90$?*.$?$-","AB$?*d9`>/6Z<7"w?":";"90$?*.$?$-","<AB$?*d9`>/6Z<7"w?":";"90$?*.$?$-","<AB$?*hZ9_>/6Z<7"?":";"0$=*.$?$-","-AB$*dd h9_>/6Z<7"?":";"0$=*.$?$-"),"-AB$* h9_>/6Z<7"?":";"0$=*.$?$-","QAB$* h9_>/6Z<7"?":";"0$=*.$?$-"),"QAB$* h*h@2hhS*SPPSPPSPt*w$Q8=wQ8=wQ8=wQ8=b$ #_ *-r %w.*.-pr .O%wr .0 @,r  GPVW~GGa`EHaJaEaaVlAam]@P|Y@RJ$L>Pin'Xqy]43These are the bots that will play on the blue team $x=!$}"?$Ѱ>)$@?J"eWz\yTy]@U@J$L>Pin'`qy]32These are the bots that will play on the red team $x=!$ci<$Ѱ>)$@?J"eWzo@S] Blue Team $T)$7>g'bdS] Red Team $T)$7>g'cdE]BrowserListSelectionPn'dqm]ServerBrowserGrid $>!$p?$ff>)$L>J" yoH , n}oo/bbBalanceTeamsRN$$Checko9bbPlayersBalanceTeamsRN$$Check 'o@b FriendlyFireScaleRN$$Text8;0.0:1.0 'o:bbAllowNonTeamChatRN$<$Check Xv''e-Xo0b NumTeamsRN$<$Text1;2:4lRo8b bUseColoredWeaponsRN$$Check ('-Wo3b[ bDistributionRN$$Check 'o2b[ bSubtractionRN$$Check 'o2b[ bDesignationRN$<$Check 'o6b[ bFlagEliminationRN$=$Check 'R, G E]BrowserListSelectionPn'fqm]ServerBrowserGrid $>!$L=$ff>)$L>J" u  eiH 35i !bBalanceTeams%H BbPlayersBalanceTeams&H aFriendlyFireScale,H bAllowNonTeamChat,H NumTeams,H bUseColoredWeapons,H bDistribution,H bSubtraction,H bDesignation,H #bFlagElimination, H  i G(v@wjt@T @g a"y@o c2@~|uy rp@~}wt@~~l yn L F }@ o{Y Jg%-{ 7Z %G  C %^C 7Z 7G G C Z C ,G  G KB#   G@]f uNPD"CJV @} Po~hHQU@]w KYKM |L ~K_K`Kc@@aKdKj fhn  ml ] MkI^n .l  l -jG-j wn *Wn [l b !l G WYQ r* f%T %f ,c.,f %vT ,f ,- (- (e%*e7WeW9?T i  eW9?f heZi7W- 'Yvh7W- 'Y_YtwY*wY oY' GsY@MiP U#;S4-W-i(-C(-F(-G(eE-C-i(e-F -i-G(.-d-i.-p-C.-P -G.)B-i%BX%8XX6Q.@VX%% B&&T% B%-C%Z%?  aq  .E h %X%X Xh .E WX h X i .)=========================================!pp OLTeamGames v1.0.0.2 Loaded! !=========================================! Gua  w@`Cj|M }@w R EW  \(v>D1w.(*m ..({{w.(*m ..(Wwm *m g(r.(*E a U E v(.(E .'-S V.[.( K [wV*wV*VaV*VCy(.(a .(P .7.(.(9:.0((9?&(9:q!Iq!e( b@r*(o %Vo 7Lro ( o %77&7&(((*f*!v( @!Y A!R(*f*!v( @!s A!R GNTnK{ {Z @Vp J M}URUGUjAv!ka  a+ `-](q!Q GytIN @V~kk_W:k&r.k* @%7@.k)lr@.kE*-%6@O@%&6@O@%6@{9D@.kE-w@.k3*6@O@.k3@- GYgFHjAeiC@kmknop@BlT @g r v'@|z}@|@N@GGFJ@BHOO]J_ RMPZG#S@SRK~Y\ j]k\W\g]^r c]Zm@[RaLh@O Q G A u@n@o@p@q@r@s@vwxt@{@@|@B /~@q#p@CoXlYB@F@G@H@@yw @MNn#s@ONKxlYK@bZ k|P@m#w@TElYVWXDS@H ]]@@^@b `YD b@c U@\]s#`@hHSǙQYK'L'M'Y]i \]%k b @l,8&~o|}YV]oDm]re u#S@sǙQYH'I'J'v#M@tfǙQYE'F'G'y#L@uRǙQYB'C'D'x@a Eurl?-m%m.)9:m.j&%6m{D %6mOD %6mOm%rmVrmL%6mV6%6mV$;w6mO*rmOx.-dlrm{m.-dvr Gj#y@{lY}@~@@@@A@B@C@D@\ b "a "n'Dq $&>!$ &?$͏>)$%\>I|HJBS%si 2.KqFݓ +_IJIJYY8IJIJB_IJu)IJu)IJIPÒIJIPÇYY8YY8YY8IJ3}IPIPÒIJݝҳIPIPÒIJ3}IPÒIJIJYY8>pYY8>pu)R]was killed byT] someoneK Se ~y*i#w {Lͅ9n,63}h#}@MшvPYâYO%n ;NKmvut&^ebqC z#K6O9a @w&HXr{#GPg>3&$YR\r\?zWBTBe Xp M%n o @[d8&~k|vYB"z?gr"1" ZRZ 1Y U Z 1 d%9d9:1d //}9?%.Z d  }}Z d  diflag_returnedp9S1"[ | &"*1U 9?U }"9?,}"@@flag_ret_friendly"9?,}"@flag_ret_enemy}9?"9?,}"@flag_denial Nw1*}1@flag_cap_1st_touch19?,19?&"9?&"9?,V"" ZQ^ d%d71wd1*^ ^ ?dX A^ ?@d%d71wd1*}d1X flag_cap_assistd19?9DX dD"?}"@flag_cap_finalY"?flag_capiflag_capturedp9S1" -F1?Y1enemy_flag_cap-i9:16Q".@V-F"6Q9:1.@V9:16r".@s[ H%"*1T"7."&|"-!7."&n"timelimit-Gl1'-CZ"."G1 G[g#B@_v.PYâYf#E@`+ZPYâY^V |#Bc|>3&$Y\kI%q ;fYvut&^bbjCd#J@g;(FPYâYjH%q r @i@&8&~f|tYc#K@jb߉+Y m@| @zr\wj TDM Gb#L@oFV+Y f@}#D~ r~{䶚B_B_YY8B_YY8J@qB_YY8J@qB_YY8J@qB_YY8J@q@q>3@q&$I  @Xv@t@@@~#T| 2wNHl ׇYY8YY8JYY8JYY8JYY8YY8ҽҽYY8ҽҽҽҽҽG*@@F*@x *} *@V Y"y*a#Z@xLc{+Y `#]@yǤ+Y B s @X`Sl 4) rS* M }hQJ M :J % PgM p %p J fSp QPp R GQ@ C%E 2~~9^  kW$${.>O@|@B$t w @Aa08&~`|sYB%gG 2BLG*x@JJJJIJIJPp]Last second save by Red!q]Last second save by Blue!f ]Last second save by Green!n ]Last second save by Gold!{${.>EC N!^#a@HWXdB騏Y `&_&zqBJB_uU^$fff?YNEX!Z!@\#g@QS^騏Y [#l@RL7c騏Y X#y@SsB9騏Y W@W#z@VY [@k&y}BX'_uUCWU^$fff?Y TYZ@QT}'>-]q!Q-](0-c q!N-c (T G A%F"P ]k {%xB_YY8JBBBBV%xK)p=VK)p=%xB_YY8JK)p=K)p=&}KX@^ Jp&xBBa$N5_uUC'U^$fff?YV#|@bLY hrZz$ER eltM3}SS逓*`SS逊B_YY8JS逊B_B_VSSSS&$U#@@fY T@EQYZns&@T#A@l+Y rHW3DH %!yH %!ZH %!HH %!MH %!VH %!jH %!EH %!DH %!nH %!mH %!CH %!AH %!sH %!kH %!QH %!@H %!S H %!MH %!Q  G S#x Eon,63}Q#y Fp/n,63}P#z HqOn,63}@g!kk YJ GsdkL0   f            o          -t                -t                                                                                - 9:9:$9:9:$-E-- -  b2h:t.UT2004PlayerSkins.XanMk3V2_abdomen >t.UT2004PlayerSkins.Skaarj_Skeleton_Body K%EK7h;{6KhDUP9:6Kh%; -%|6Kh, PlayerSkins.+|6Kh,UT2004PlayerSkins..|6Kh,UT2004ECEPlayerSkins.)|6Kh,DemoPlayerSkins.7iiKhKK%- K7i-n (-} (j,# j, -} j%j7 AO |6Kij AO -n '{ j Apj-} '-n M6KiM._Mpppp{ .M_9SjT.M 'wT* tT M6KiMppM_9SjT.M ' wT* tT -6Ki -n M6KiM._Mpppp{ .M_9SjT.M ' wT* tT M6KiMppM_9SjT.M ' wT* tTjtKL G S$N"m uz[=%xB_%xB_%xB_%xB_%xȵRqbRqbRqbRqbRqbRqbȵRqbRqbRqbRqba&oy^zu @i!@e U$k 2yYs 5faU"Y V$i 2z 5faU"Y Y$X$h 6}neRqbaHcuZKW@\ DXPN#K@F9BY x$z!\ xG *`%xB_YY8JBBBBVVVVB_VVB_%xk k k k B_VB_|\fF|\fF,e|\fF,e|\fF,eB_|\fF,eB_%xKi|\fF,eB_%x|\fF,eB_|\fF,e||\fF,e||\fF,e||ʁ)|ʁ)||\fF,e||\fF,eB_B_B_B_B_B_B_B_B_B_,eB_,eB_,eʁ)B_%xk B_VVB_YY8ʁ)B_YY8JB_YY8B_YY8JVtMVtMVVtMVtMk B_ʁ)3}>B_B_YY8B_YY8ʁ) EB_ EB_Vʁ)k VB_B_}LB_VV|%xGf%xB_YY8JGf%xB_YY8JVtMVtMVtMVtMVB_YY8ʁ)B_YY8Jk B_YY8Jk k VB_k B_k k k &cG| v&{ 2HW[| jPMS@m!M#L@J}BY 9{@S @L#M@O0eBY N2@]$R^ *R,Y!vˎ3}aq C"FH6OSzLMq ' B_,eB_IJB_B_IJKiB_,eB_IJKiB_,eB_IJB_IJB_IJB_IJB_IJB_IJKi3}Ki3}KiҽҽҽҽҽҽҽҽҽҽҽҽҽҽډډҽҽҽҽҽډډҽҽҽҽҽҽҽҽҽҽډډB_ZeB_ZeҽB_,eB_IJB&Hm$Bn$B~$pB}$pB|$C{$Bz$(By$(Bx*o*p*w*~ZGu*s:'DCr:' A4cd cN ^$[ 6T lGZaHco~XIPJ"z I"P2Z+- `$${.>P`WP[\P_P M"M@b N \.O* O faP O"C@e& \.O* O Q"P"u"AUgEXAۉխut3}=Z?B_ututB_B_%xututut3}3}'wE"B_RONJB_RO?4B_B_3},e,e,e,eB_,eB_B_,eB_B_,eB_3},eB_3}u,eB_,eB_,eB_%x,eۉխ'> B_B_B_B_B_YY8B_YY8JB_B_B_bQ B_B_B_B_B_B_B_YY8B_YY8'yB_B_IJutۉխۉխ&yyyyJ#N@hdaBY dP S"~@jr O*2O2WiPVlP `$U oxu ea&}Ru~ T"|@q O*OnPTrP~tPU"|!{#w ,ۉխB_B_YY8%xB_YY8J%xB_YY8J%xB_YY8J%xB_YY8J%xۉխ%xۉխۉխutB_B_IJۉխutۉխ%x&N[ymz@D  ["@mAe' B_B_YY8B_YY8JB_YY8JB_YY8J&$N \"Mi2C}Hl ׇYY8YY8YY8ҽҽYY8ҽҽҽYY8ҽҽҽҽҽҽҽҽV Y"y*@EF|w$@] 6 Gj_:VB_YY8JtMtMtMtMtM&Hc]cGXenx@H+J%t b% wb*b4Rd9=t 9=dbbb P(wd*w bd(*`t ` a`  n%nnnn[*b% wb*b:Rn[9=n9=n[bbb wn[*wbn[(*`n` a`  n2 Gba$Q @KQYc'd'e'N Z $@$@Zw$@EiSbOPE BXS] Red TeamW$ #)$L>g'Rdf'wPBS_uUCU^$fff?Ymc$ @USVQY`'a'b'N Z $@$@Zw$@EiS c"x2V E b:$${.>Qd"v2Xhw@l&CX b"g"\( Gu$a @ZV҂0.Y pCY'z- %'-L'~w~*w~*~--L(~~9-L'-L|aLastManw*YCa(-LC C%C+C  C-L (C  -L 'C#-L - $~- '( rC*~w~*w~*(r~5rC*(~CC~~~*  uC' GK Wt$b @^0.Y f"G"q_7Y z B_YY8J&}z j"g@`J|~6aY ]s$g @cۈ0.Y Wdk"f@f,6aY d$Z~ @g'0܊B_B_B_IJW=W=W=W=3}3}3}IJIJʁ)IJZeW=3}QY^'_'niSb_ ~lSf$\z @jHo܊B_B_B_IJW=W=W=W=3}3}3}IJIJʁ)IJZeW=3}QY\']'niSb_ ~l"e@k6aY rgg$^v @n *܎3}3}IJQY['niSb{ ~"m"_@o-6aY NvJ$33>S= Voice Packn'qqy]PNThe status announcer to use in 4 Team Games. May not work in all 4-team mods. $>!$u>$(>J"En"[@sd~$HY o"X@t6$HY p"V@v@v$HY h$`p @w>=܎3}3}IJQYZ'niSb{ ~"uS]Testy]CAClick to play a random test sample from the selected voice pack. $q=>!${.?$ ף=J"]'U k f'ygbatq"M@}L$HY k@t"D`AP+Pv"~`C թPiw"{`F2POlJ$=S]Play all announcementsn'Hqy]NLIf unchecked, only status messages relevant to your team will be announced. $?!$u>$?J"S]Cancely]/.Click to close this menu, discarding changes. $?!$?$=J"]'U ^f'Jg_~Mpu V Cg MubV g(ju V 6jHu 6Hub$HV (' Gux"r`N!1Pry"p@PBYI#R@QwbCA!IG z"o@S0BY {"n@T}BY RG U@\|"k@XvBY }"h@YgN:Y S] Defaultsy].-Restore all settings to their default value. $?!$u>$=J"]'U ^f'Zg~"g@[TN:Y XS-OKy]+*Click to close this menu, saving changes. $?!$ #?$=J"]'U ^f'^gR"e@`lDRN:Y XS] Team SymbolsW$T$ $3N=!$ӟ<$$&>)$2?g'adV B@#c@d\>N:Y {ZHjwmA#a@lJ5bCnheB#_@qLbCQA!C#Z@rq9bC*A!VSN( GcFRx Fy{ Y{|}| ZP@Q w.*w.* w.*.&& .%& .,& &  G t#639:9:$ j  G A}?     j  GBW`' - a/!m/a0 WVW rv * Viv WiV10wv *yv  Gh_ hr*r*%,a hr%a hr&a hrV,a Phra cha*h GFeRul9:9:$ 9:%l9:%dr*a !Rtlw*%%,  9?&&% %K$3 &K$3 ,K$3 0,K$3 c*6e!ke%? G tCw*w*. tw* s$%  $%  $%  $ %  GWl# 0aW^9:9:$la   "%l  GCqy<QN-x-x ^9:q^9:q-x '-{ 'b GWm# 3aW^9:9:$ma   "%m  GHZ G -x ( GJhNL&h-{ 'atc( GWr# 2aW^9:9:$ra   "%r  GKTB W/aA T?k-z'jw.T*.T  , 10-za?(2-vw.*\^& .- +^%.- fa a<"Lfa wf*f F9=^f f{ f GWs# 1aW^9:9:$sa   "%s  GQSeQ w(ru *u aa .S..u L$wtww*rw*w aa .]9:S..wL%vb$w կ9?,X9?,w#?u  կ9?,X9?,w#?S..wL$wwa GM_S w /aA \_0(10' GSRV :lSr*aa .R..L$uPwu*yru*u aa .99:R..uL%mb$u կ9?,X9?,u#?կ9?,X9?,u#?R..uL$uuF G\W]q-XwX*GrX*X aa .]..Xn X XX GPtC !t6t%6t%K^%| az ts^&| a{ t^,| a| t| a} t GH w. * 9:,w9:. 3*....%9:. 3 G Tbc`-x - Z-{ -{ (C ac(`B  GVXc GY[L`w*a  a*w.* .-%?6%@6%@&-'9:9:$9:9:$LQwL*wL*KL K6L  #<K9?@&-'a $ G#M 9:9:$.D9:9:$> G]J`w*a  a*w.* .-%?6%@6%@&-'9:9:$9:9:$JQwJ*wJ*JJ J6J  #<J9?@&-'a $ G#M 9:9:$.D9:9:$> G#c'9:9:$>ZZQa  #<  GVq #MNV%V,{V V  V frV *  V V b K9:9:$q  }I a}q q  aq Q G #c'9:9:$>ZZQa  #<  G@n r &Tw&*6&&n @6,&n ~w%*6%%n @6&%n ~ Gd`-:7w*S G_PU:'(9:9:$ r* KzPh ~Feh !h !X w*PptFh $w*w*wP*wP*-#P%tppp,,&&_P&tppp,,},,P,tppp,,,,P,tppp,,,&FppP: Ft ptF@P GeIS'Ji IH Gi Hlj % T +& T >, T Q, T wi * j ,wj .i 3*.j .i 3 GgD_;D-w*U% & , ,   G oGk:XJ|GXWeapons.TransLauncherGOLTeamGames.OLTeamsTranslauncher G GciQ\ I G @h@Pa I@ G jmi h _r*s':9:9:$VQ- Z\ZV GlF{~z r* C7.F%wFC.%.j?F. GpF 6-4 . -'f. (w*w*aF #@?a&F #@?-avw*w*aF  #@?a&F  #@?b? Grf ah5{Yw*w*a} f 9Pf xa&} f 9Pf  Gnxr CA9:9:$ r* u.0x GBs[Ir2ZI![o$[a [a*[#6E 6E[I[$ a!' F.[Rw.[*F- ([pk!F]Imr]*O](pL]wp*p o[.p-P ''pr[].p-P ' GZ]B="k .]Rw.]*k - (]pDW!rk - 'hv]].va w..v*.]..vA9:.v9:$ ]o$ aW!sE]~W!ek]W!t]phv]W!E Z]  Gl^h Q/[&w[*2[`!eL.[-P 9:.j&w[*[o*' h _[wh [.[M [ oh '[[ l G]P]P_^Lzkfw*O`!er^ * G`Siww.S* j9:.j&So*' S- utS`!eu_Snru*uvnwu*wu *(S`!eS@u  nGuu_Snru*S@G  ru*+S- S`!su_S.S-P (.SM ZS`!ef Lu=wf *S @f WSou-HtSou-H GdUG6j~gw~*Pr~U.~-G 'i~'~~  GFl\_2C.F-wF*Kr.F*v9:.FR7~ R~ FAppppCalc weight for team 9S against team 9R.F:RY?HOFRYeaBAp [InvalidFlag]9UejaBAp [InvalidFlag]9U>.'-iRY9?9:.F6QC@VdaBAp [DistributionNeed]9U9?9:.F6QC@VdRY9?9:.F6rC@saaBAp [CaptureSuccesses]9U9?9:.F6rC@sa.'-FRY.F`aBAp [SubtractionScore]9U.F`#RY.F_aBAp [NonSubtractionScore]9U.F_w.\*.\-G r\FRYZaBAp [KeepSameTarget]9UZaBAp [KeepSameTarget]9Uw.\*r\FRY.\M Y9?aBAp [GettingFrustrated]9U.\M Y9?aBAp [GettingFrustrated]9Uc ~RYc aBAp [Randomness]9Uc aBAp [TOTAL]9URYFF - *R%R7~ r *RYKY R~ KRR;w.\*.\-G (  GDv#!  D Gegs &[$-] - 9?& Gfj+ wR*Ra Ghs 3DPGw*a/!k.R  GiDV?@6I9=,6I9=,6I9=,6I9=,)6 -d 6 X$X9=9:X9:6d X9=9:X9:6d X9=9:X9:6d )9:X,X9=,6IX6IX6IXDI Gi ]Br+r\ *\ 7]&]i. B\ wi*iW k%k7]ki k]kli GjGi8} .a $ (mm} .a $ (} ...-] (%w?Rw?%%p9?  DI9? Carp^nI[lpMipVvpTtpz6Ip|6II}6Np@6NIV9=,<a 9? 9? DD]69=,$B9? ?[9? ?MJa [@M@9? 9? [dpMaI_B9? ?[9? ?MJa [@M@9? 9? W69=,w9?&69C9?,w 6$6$2w9?&69=,H6$$z|Ja }@w9? 9? w-] ' G qMFo"S.c9Dף>}9D??9?cc9D?9?,}}9D9?}9?M9?,?M,S),}9D9?}>N9D9?}L=9?cT9D9?} ?9?cH9D9?}\B?9?c-a j}$9?}9?p-Mh9?c9?D]^o9?{9?wMS3*O MS3c MS3O c a9D9?p9?c o9?^b&@?9?}9?a^' 9?c9?p^a$Mj39?}c,9?O , o9?awMS3*MS3o]  ^] aTESTGM ka%a9D9?pM a9D9?a?9?c o?M ,9?}c,9?, o9?a$a9S9DMSE] o9?\D% Mj&DQ D&Q D &0 Q 99?N9?p]^ ?9?^$ fff?9?c{9?, _33s?9?TN % D J a JGnGA_\  JAG o&D&J&a&JGnGA_\  JAGtA9?%-b 'B}&a\ Gn`G_B},a\ Gn`G_B},t % D J a JGn G_ J J9D_G9?} J { &D&J&a&JGn G_&J&J9D_G9?}&J 9?J9D?n  -a J9D>n$&?9?p,I9D9?p?9?]?n9 & %6 D, &-9?N9?]^9? 9?Ia J'    % D &D9?N9?]^9? 9?I?n9?Ja J' @  -b B} % D &-9?T9?]^9? 9?I  - a ' a9S9D '  j&%-&D\]^DI$)9?}9?p]^DM9?c9?]$*w&*.9?N9?,0o9?\9?,o4a BoBoCCM\]^&I+9?N9?\?n9?J-b ta&J'-b B}9?T9?\E&- a 'ja9S9D&'o%oS)9:oS_9:$9:oS_9:$ % Dr oS0G9?N9?,0o9?]^9? 9?I9?,o4a BoBoCC o&%9?I9D9?p?9?]9?JA},-a (9?`9D},`9D}&aTestGn % DK % -w. *w. *K &-9?N9?]^9? 9?I9? |ppp( x) . ~. |. b. |ppp( x) |a|v`v9?TN|ppp( x) . ~.  a|'-a  -=9?N9?]^9? 9?I9?K na y' &D-9?N9?]^9? 9?Ia&y'9:9:$ ] aTestGnI9D9?p?9?]?nk}p]^I&DH Gre " d.%X.)| %7FwF*&F-F- xFxg,x $%xgVF B&xgUF a,xgRF ,xgMF rFdx|xgxg_r%g&.)rrg NaTestA#G@#B9?>9D>#jI*9D@#*9D?#K9D9?,#GA ?9?K^9?r?9?K9?,9?*>>9D>#^9?r?9?K9?,9?*>^9?r?9?K9?,9?*>IBIaTestA#>9D>#XjI*9D@#l*9D?#K9D9?,#G^9?r?9?K9?,9?*>IBIaTestA#>9D>#FjI*9D@#Z*9D?#K9D9?,#G^9?X79?r9?K9?,9?*>IBIaTestA#>9D>#IjI*9D@#]*9D?#K9D9?,#G^9?r9?K9?,9?*>IBIaTestA#>9D>#0jI*9D@#D*9D?#K9D9?,#Grr9D9?&9?K9?,9?*>I,} @@} @*9D?+?A 9?,9?r9?>9?*} #-9?rA 9?,9?*>&.)ggr|g|&^w9D?#G$e9?w9?r&9?*>9?* .)&{% ,V_ F%%g%|I>*wJ .),{% ,U F&&g&|I>*w .),{% ,R F,,g,|I>*9D9?w?9?w, .),{%g ,M: F,,g,|I>*9D9?w?9?w, 9:9:$hI G h 14u4VBK-M -Ml&K-M4l|yN r|4\4-w.4*$r.4|4al|yN2-M4al|yN9:49:$.4%4 .4w|y wy*5ry*w|yd4.4 9?, l&.44 .4y.4%.4 4.4%Hry44 Z%|-M4l|yNHH-M4l|yN G ^@ xZrq *,rb*cy@cb~Z& )n^cq tbrp *^y^p  .n^cq op b G vywx o  G y@@{{ H~Aw~ 3%|.{D} _&@.{DA j,~ u, z, , , ,B~,DC  G om `m_m &m -'\a/!k.rjm  G~k aPm_k &k -(\a/!k.tjk  G@COD;w.*} . GBEl^Q:a/!k.R Lq!'( GDA~ z A& A GA|Cv$_C ,GB #,HB 1,GB ?,FB VC&G\F G EzG SzPw.P-Ew*w*-E'%& P&& P,& PP,&  G j @rK RL\-{rr*j ryMzj r:Hxppppr (j ): H G i Ng TG[< rg * G$9=,$Gapg  (G)G G Ti g y{i G$$9=,Gapp (i ):(Ga: (G)G G TG $$$G a( G Xix *'ri*ri*Mi%Usi&Vi,WX G @d V _W\!Erd *&zd pd : f G Y {#. a?' G[l'Y K!trl* mppl: mD w !X `rl* mppppl(ly): mD C !~D aD%***m !oD  D k mDl G]\UF[ r]* F$9=,$Fap]: (F)F F \F $$$F a]( G @\JFk^4w*w*%rw*w*:V[XY\666 9D 6  6 6 Ganb xVw*-w*[-q  jw*RC%jwR*wR *( > %6 :%&6 :%6 A6R 6Rl -w*U -#w.*w.*.-} ` .^6??9?>%6 :%&6 :% 6 66z 6L?%6l6,66>666666{w` *` p9?>%6 :%&6 :% 6 6 6  z 6 L?%6l<6,66>{666666o L _-f %6 :%&6 :%%6:%&6:%%6:%&6:%%6 :%&6 :%-  %  l ^ 6 ?? ~>AqoL le %l 6   GYcdb p%-(-@ w *O> U?O  LO<O? U<U &a OUCC 0O? U u ~w*f afq]=qO u  afq]=qO[9?}fOqff9D[ afq]  $$$ LO<O? U<U &a OUDD  0O? U # ff?Off?U h  9?Ok ? Uu=U %h ?Oqk w*Fw* % af'@w*R DwR *f(R q) afq]d9?% 39?%9Dh ?Oqk ] ,h ?Oqk ] af- w*w* X (\? w w*w* N  9=,9=,$9=, $agr gg> n 9? I  aWqr  =B 9?,Pg {.? a( N  DB 9?,Pg {.?r  a(] r  G her.Y*5.Y%EW.Y&Fz.Y,G.Y,H G ET V^T dLMNDd&T x!d$'[T ]!w$' G!@ l@^ r.*@ %,r/*^.%/B.&/D.,/~.,/| V&r/*'.%z I.&w l.,~ ., .%/SS.&/ZS#.,/PSS.,/K 3,ir/*.%/t0.&/{0.,/s00.,/r ,Z.%z |.&w .,~ .,  ,r/*.%/p9.&/ql.,/o.,/n .,.%z +.&w + .,~ ++.,  ,Ar/*s.%/p.&/q.,/o.,/n  G ZCV5;tCmA }@1r.@* m X%C_,uq \& a, ,.5C-E6.@CC"].@v$'q ,.5C-Et.@C:A CC"].@w$'q , n,k.5C-Et.@C:A CC"].@x$'q  G!@ho_H`_ #bMultiFlagCarry%X >bCarryFlagBack&X _bCanSeeFlagLocation,X bTranslocateWithFlags,X h_ G(epqH ]eqq5bZ bMultiFlagCarryx W $$Check 'q4bZ bCarryFlagBackx W $<$Check 'q9bZ bCanSeeFlagLocationx W $=$Check 'q;bZ bTranslocateWithFlagsx W $=$Check ' G tQb[ r%S*/a9 eGea/!q%Sekea/!P&Seea/!},Seea/!B,Se10Q%QwQS*Q.0R QSY Q Gsqfho rV4?- hhyh %6 &6 h lh    ^ 6  ??%66%6$&66&6$ Gyq{ HXfs.q&rs**AwA*wA*wA*5rs*wsAAAA:/a0 m 9:m zm 10Ys %z s &z &za%z* GsCf R8I ?I %JI  SJI %66%6$&66&6$CCC66,P66,P6%6%6&6&CJM JJM lC 6 M M , 6666166,(66,(6%6%, 6&6&, C%C&d J,<Jd ,<6d ,<6J,<lClC Gv]wzW G}xPWG@@S @{BFY >Vg%-F 7Y %R BS %^S 7Y 7R R S Y S ,R  G yDvZE#R.j% jR)[ %T%TR)rTREjRE [ q% qT6QjR@V9?j9?,9?&L ?jVY9?qdL ?jVY9?q\DD9?@ajjg9?[ D$D>L DaDDT%H\D9?@qT6QjR@V&9:TR_9:$.TR0jD&abHHCB@@D&acHHCB@@qTFj  GAW ] JTwW *D7.W \ %\ D.%.W j#\ >W  G^]l2S/*^S-c '',( G Ds[>< sT 9T a/!ozs.T  Gk [EhY4- %'-E'ewe*we*e--E(ee9-E'-E|iLastManw*Yhi(-Eh xw%wx+w x xw-S (w x -S 'w#-S - $~- '(x k .b.W k -(  ewe*e@ G.ewG*GR 'G TG  KG-sGrGGI w*-rGeek -(k -'' G GN u2f7.N O %}O f.%.N j#O * N  GG H`z1G%tGj.G  a/`.G  G ` GJQS:/8%/a0 QQ9:Q QQ.bQW Q10/a0 Q4L%3LrL Q)7.bL ].bL ]QL10 GMZUs`-!Z-yD9:9:$L,..Z- ,?@9?, G\eU }[_ W ?w.* Hw *L \Lw fww*z.wTT,dfrz*rz *O9:z%U,9:z, U9:z&O>wUz*U~$OUzzww pwL*9:L%,zL9:L, 9:L&zL%\ , zzF?W W 666F66P9?6666?69DP%6:%&6:%6%66Qrz*-6 (N-"3%6666666%6&6 %eeR -6 6-6 '666%6z 6z6zw%6 &6 ! %6?R6>669?&ff?669DPP6669?&ff?6?69DPP6?! &66rzL%6&6666 9:~&rzL%6: &6: 6%66,Pe66,'6%6&6 666,0e66,]6%eee GOG [h,&G ,, G %, G  G z sPy N]*z y .z -dr.z y !7.y &Ey  z  9? GsQk W|* GIRT@j.-n/a9 SKSa/!q%PSoSa/!P&PSSa/!},PSSa/!B,PS10/a9 uXua/!i%@uWua/![&@uW5ua/!e,@uWWua/!b,@u10CTT%gT.)~% CT]~& CT]6~&.-p*C.OT]~&.-d(T6QC.@V%]~&9:T.j&].-nNT@ OwT**rT.0TNT@ wTP*9:T._9:$wTP*NTP NT.0R NTP ]wTbN*IT` aIT T T GkSD] 4kD-E1-ED b !d1 G mUQWKQ %!uQ %![Q %!UQ %!Q %!tQ %!oQ %!~Q %!|Q %!xQ %!hQ %!{Q %!U G ] WZz ] .Z@.Cr] * r@*(g-M7] %(-V ] Y'( G_Y_GYZ_._Z.Cr_* rZ*(g-M7_%(-i5^ 6Q_Z@V&(-C7_ZO^ (-G9:^ Zj&(U-G,9:_Zj&(' GKUq t@G q= >UU$U:%U\UG -:U?=UU-a G Zd>G B&CTB6G=69?%Up 6 Gr\#fdrSS.-n-M.-q-V .) GJXW} 3*w*o q= >WW$W:%W\Wo -:W?=WW-a o Zd>o B&CTBW6.Gp 6 G]g v{ ppJ9:9:$ E 'JwJ*w.J*w.J*wJ*1rJg 0E E J.b.JK.J!Fg iJ'fg !m9=,@!RE JJJ^'( G|`x l ^ rx * k vhu p k :p % o pk j y%yp j fx yu o vx yu o j yW G[hoJysr* /a9 ZorZ*rZ*Z-Z%1orZ1oM ZM 1ohM %h$hL [nLhZ^L [{hZL ^10 Gba` p4w`  bcc ;REDw%z NBLUEw&z cGREENw,z wGOLDw,z ` b` ATTACKTARGET g`  Gnbr-Cj CTF4 Gc\@%\\-( Gdf y  f G tfAd dA G ^S{t~wMQ [ [ ?O O ?A Bff> kBff>{A ?[ n k?O 9?,D S6M6M{n 6Z6M6Z6Mn O k?I SQ6ZA ?6Zk?A kMZ GY  4S@M@Buv %Kmu% jwu*Sua/!m.u&uu  G@@C @l`@pxR[ @Y@-U`%`7AE`w|Al }&^.` (`r^*^.pl .LoadingScreen 'r^*`7^.` (w.^*.^$-W`7rp.`r (wp*X .X^.Xp.Xp/x f ?wX*.%f  X>.%f  ^10xl H G  qi[B <q inwi*iTeamChangep9Sii G sH; ;C @w *w. *. --d GevI  J b  wb*ba/!gdvmdvpJ .5Uv=k>9?d 9?,jv`ad>9?d>9?d9?d9?d J .5R1b-I ppppb[bx](9Sb)jI ppb(9Sb)vvvaTestiSvKk>9?d 9?,j?Sv aI ( GubT" 8FT%T{bT<F+T F FTTb F 9?&wbE#b F 9?,wbI#wbx\w\*r\a/!k.\]w$'\\7 G hlf |73$~lbColoredDMSkins( l G(@xd{\G,FK %CK K   G\K  GZ@}eh g)ZU~W%UdU%ZpZWUWWUU%H }W_WU,H ,%WWH ,WZpZD ed_U~W%{WZpZWZ G O@Amw.&7Op% p.m)Zrp.mE*wOOpU p.mE U O.mE OpppO.mEp  G rHR #6v9=,lH{>6v9C9<$9?,@@H?6v$6v$H+?6v9=,6v9C9?,@@H>?6v$6v9C9?,@@?H?6v9=,6v$v G F@vB|D Krt*|M||%Hp9St Health||%Wwt*tpw.t*.tEvz|%%%||%LFK@ DZtIwZ*f.Zwf*wf*a f t a @ @ a g f2e .Z2we *b e  t 2b FFb Xe ZZ0F9? @ F wg *Xg [ g pwt*wt*i pp(ty)wX*4w.X*] .Xpi X tw.tXzX ] [ i ] X [ i |t| G DeO2fV%tVjf+V f fVVewe*ea/!k.e]fJ$'ee G FJ S@9:9:$-,9D9? wJ *wJ *J m( J  GIx|`rx* ry*(xy Gw H Kg jAw@*n@rn*PU-nCrn* g C@]d Uw CWv nWwnCw , v ,ow v wU*wU*d rvw.C*wn*.Chnw.C*CdC)fn!J9=,@!R`D'w.C*.C-^w*%Zg %C@]d U`%g DClwC*wC*!7.C%C3f*!vC @!w pA!R g C@]d U G^vZmK%v=K,6rv.@sKK6rv.@s%9/v,6rv.@sK9:.j&7r r k7r r  ve %v.Ok GLQg p}  b6pM}  6M} }  b99u9?%(TQ M6T9?%6TQ(6T9?%6TQ(' G PPw RcB9:.w BU%UUw 9:U.j&7A A UU&Z7A A Z9:.w BZ6Qw .@V~ G sP ^ Rw*w*U9=w*w*S9=:-w*- 8-i  w*-  %| Yr* r1wFw*1w7.% ZNt %t 7..t .- Nt 9:SH (p9?,9?&}?critical_frag$-oRU$wR*wR*1rRpR9?&9?&}?team_protect_frag.BS }}w*P -i l- w*- w1r9?&9?&}team_frag %|  -2r* r9?&Yteam_fragR : w-Cr.O-m'-m(-m'X-m-iX6Q.@V%-m(-G9:.j&:9:.j&-m(7 -m9?&9?&Y?tdm_frag}?tdm_frag6r.@sJ -F9?&Ytdm_enemy_frag -i9:S6Q9:U.@V -F9:U6Q9:S.@V7 -Ce 7 e kZ  D9?%9?&9?&9?&Yteam_fragR1 -Gl[ w*-i | GMQoLc D Đa \ a \ 4` Y ` Y na c \ a c \ ` c Y ` c Y  G X]UdBr]*r]*r]**] vnkmo] ] F]hQx?f]bhnnozE.f GY@pf&w* p@'aw@*!7.@%'( G[@|aj@ 6w* |@ W-i| &b| |- % w@*w@*!@9?| n@teamscorelimit w@*-n@timelimit-~ 'x%xvx@9:x.j%-~ (x-~ n@LastMan Gy ^wfO=gy . w!ry *N-n9:u9:y @T wuf GP {Ke !9:K% G aFA$H--(kFa/!kF-F*'P 9:T 9=F rFP (F*wF*F U FP CF[,F*P -Ww.F*iTeamChangep9SF' GScFT 9]-9:9:$7w.E*$c_&_c+_ c c__I9=cSm9:FA9:F 3wA*-s SA)9:9:$r.E*-C 'BwB*wB*B-rBA-C (BBewA*"AS&-C (3-C ASIrA*AS9=A GDizNeD%[DQD EzD Dw GBedf EgjhwA-9:9:$rE&Er+E r rEE6r E%7E-E xS%-SSE##S xS SEm Gmq Z q gq BalanceTeams9T-z gq PlayersBalanceTeams9T-s gq FriendlyFireScalep9S9DD9?,d% GydKl-%.)KVKL%6V6%6V$KZ .-dlK{%.){9:.j&%6Z D %6{D %6Z %sr%c*.-n/a9 rrra/!q%crq*ra/!P&crqOra/!},crqqra/!B,cr10!r%a*/a9 s sa/!i%assa/![&assa/!e,assa/!b,as10%.).-nPa w**r.0Pa wc*9:._9:$awc*Pc P.0R Pc K%79?9?,9?&K KP?BGHJK KP?BGHJ(.-dvKr* %.)9:._9:$%6N.0%KN9:._9:$Kp GnQn0L rg*(c-maw.g*w.g* .g-'w.g*w.g* .g-6r.gQw.g*.gf6r.gQ G[Wus-wW*.WIw*-'RwR*I.RfwI*I-sIrIIR 'w*I TI  II fw*-rIR@ RR] G~qF VhF &eF ,w.F *.F  V!l$ GsN[ LPE %ME E  [ NOPE  G{lXb{Ur*>_ *-r X%B%B.) rB.0XB-~'B.EBc;X&  @,jX&-~  @,X& @% w*F9:._9:$i.0K @& .0 G Ii|>y .iwy *-k'Ie9?,-k(Ay ,zA49a5bbc5e7517d301049.i[ $-pj!S -z'-p'-k'4:zA092d09f3d26ce0191dfc.i[ $7-oj!Q -z'-o'4zAa57967847dc13941bd59-nj!M-z'-n'4zAca1cbf8f6c1208b39bb2-gj!j-z'-g'44zA00b2cb874af8867a0b0ezA42f5a70e0cec8746b1884-kj!r-z'-k'-z-kQwQ*Qa/!k.Q]j$'QQ\e-9:9:$-z w.i*$- 9:9:$sirmrs&ia  i Gtu\rkB \ Gzvw|U' Gp{y[ltr*p,,n9?p9?,9?%p9D9?9?p9?p, G|fSX-9:9:$f[i--ff,f,ff%f& G }qRHXq%qbrqN*{qBqN.qB q.3qNq  GC[v2M[NumTeamsC{2C-X9J2,,[Q2M[RedTeamAI{2aE2 wa*%qa2M[BlueTeamAI {2aE2  wa*&qa2M[GreenTeamAIh{2aE2 hwa*,qa2M[GoldTeamAI{2aE2 wa*,qa%UM[RedTeam&UM[BlueTeam,UM[GreenTeam,UM[GoldTeamg{%U {&U {,U {,U- 'z%U%UOLTeamGames.OLTeamRedConfiguredz&U&UOLTeamGames.OLTeamBlueConfigured-z,U,UOLTeamGames.OLTeamGreenConfiguredgz,U,UOLTeamGames.OLTeamGoldConfigured\ M[OLRedTeamSymbol] M[OLBlueTeamSymbol^ M[OLGreenTeamSymbol_ M[OLGoldTeamSymbol2{\ P.\ 2wP*%NPq{] P.] qwP*&NP{^ P.^ wP*,NP{_ P._ wP*,NP2M[FF&{2D?9L2<w*D2M[FriendlyFireScale{2D?9L2w*D2M[BalanceTeams{2-z 9K2-s -z  GU `#199a>( GA}$\Y9:9:$ r *`N a`| a* G@Ch //9:9:$iCa$](a`z - 9:9:$a`y aa GFEB|6{PUU PU QU  V aU V W EV  GBVgDSi a`[9:9:$ ](Va]|#B(wV*a`P ]9P#a$? HDAa GGIQ&}pI%mIc9?7I ?9?9?9?&I }I GI@}|#WmW [@ GYMHmsy8Y_ iw *w *_  t_ q%)qYYqq Y <q Y  Y_ Yqq{Y  Gv_[v,0w*.o  rvv S%% $ o&% $ ,%  ,% $(  GJ`-)& %9?^  GKD `8d;EW9:9:$9:9:$a o w* w*|9:9:$ N =D  D 9?,dN =D 9?9:9:$`_09:9:$ p- 9:9:$-($@ Qr@ * r*w@ -($ GPlucwls%l%Slsl usl lis%s GtLm h b ](v 3%a c m 9Pp  P&a Z m 9Pp  n,a  m 9Pp  ,a ^ m 9Pp  a a Gtl j5r %7wl *l -cl -C 'tLwt*5wt*t-t-t-rc*ct55wtc(wtc-C (LttS-C wwc*ncLastMannl LastMan'( G@`9:9:$89: %a W9: &a w9: ,a K9: ,a Uw*a* G@K  YgZ;9K  g0wK *K  AK  G ]Hw.* 9:,w9:.3*....%9:.3 GVcSEcH G`[^o8`Z^6r`*Failed to spawn bot.([&``9:9:$|`` q!j!m' G[ ]UI7k[ UW[bw[*[ A[[[ G_\6,  GD|OALQ,jD`\r*YD!s &%`7.%,2, ,`r*D!s, D!e- , `PYw**7.%D!s}w*<  9?' EM%^M,TwM **M %e Me ,,<,,,D!twOM%8M,.wM **M %e Me &,<D!e D!E , ,`,2, ``D!sw*}w*<  9?' E,D!r'r, +D!trO$w*-#b,=D!s,dD!ea-, ,,  Gb h_&% & , @ %-~ (R\ B C  D CB D \C -~ \ B C @  D @ -~ 'R@ ,-~  GWdF C$zF W8zF TEAMWWo%o,y|F oWooJW GiJf%N,mNh9:9:$hw*Qw.*w.*w*1rJ0BB.~.QBhH'Nw*}w.*w.*w*1rJ0BB.G}B'N9:9:$ B'w*w.*w.*w*1rJ0BB.DB'rN,9:9:$ B'mw*Vw.*w.*w*1rJ0BB.-(.G(VBm@'Nw*w.*w.*w*1rJ0BB.:fJ!v9=AJ.!RB'(  w* w.*w*1rJ.- 'BJ ! 9=NJBJ ! 9=NJ.- ( .- (' GH _| 50r_*w_(' Gec@Mm -(V.cjrV*V%V-Vf( w.V* w.V *6.V  .V  l .c@|l rl (.'Gl 9: Gnpgap DEFEND #TAKE ALPHA% .ATTACK @TAKE BRAVO, MCOVER, XHOLD& iFREELANCE, yGIMME JUMP STATUS TAUNT SUICIDE  Gl g@hu  Gmor7 G nbb>V "@6V 6a+V  b G@N\p^' GsdJ^- Aw.!H *[ B&*.!H .!H *[,*- (.6iflag_droppedp9S GtJ  GuweI[,**w GviDJ9:.0*a *1r* r*i%i7\%\7.ir\.iA.i\&7.i%&w.i*.ia.i*i9?&\\ii9\%9\7./r\.A.\&7.% w.*.a.*9?&\\* * G@z  10xIQuv,G w0# GW|U0# GH }j0# G~gr8$%7.g% ^7.gv %v ^t .%.g.[gt t U{ gv Ow.g*.gx' G "1.0.0.2"C_j ._Q+9:9:$ G Fu Z s^v 76 u @6 u v &6v 6 u AddOn6v 6 u p G@@`yK*'o[,`*.4iflag_takenp9S` GWDBd  G EbQ( 9?, .2iflag_returned_timeoutp9S*[,**p9V Home.Timer: had to sendhome!]w GGI\)v!k-'a  a+ u!k9:._$-'-(b9?&a?' GHKl+r-( -(-'c9?&a( G {Pe 1GGLvy, G Kwy, GMb},r*p9V Held.Timer: had to sendhome!].2iflag_returned_timeoutp9S*[,**w GNI<.9:._$- '- '-(a(((a   I a A' GOK0Q- (D- (-'a'((a**# " GJYI9GGSvS1 G Rw]1 GTb1r*p9V Held.Timer: had to sendhome!].2iflag_returned_timeoutp9S*[,**w G\UJ}2-]q!Q-](  .[o$-(a.[v!ka  a+ `q!QJ GfO Wi  GVI869:._$- '- '-(a(((a   I a A' GXK8Q- (D- (-'a'((a**# " GQ_N9GH \jH9 G [wR9 GW]UY9 G^I9 -' GZvE SDGH bj9 Gay r :Z.'-V W.'zy 9:vy . [y w Gcfy ;p.5iflag_pickupp9Sf[,f* GhdGN9  Ge| X<N | Iya+9P9?| Ka  ի9?,| #?a  aL?L?Ka  .2iflag_returned_timeoutp9S*[,**w  Gi`B9:9:$E G sgE/jgQNw*l.gl.g GgJ(?b Gkmi.@ J Gnopq lzL3#A zJ G"|jf w.'* GrI9Ao9:._$o$-'a?a'((XJa ( GtKG;Co$-(a G ubOCf[,**.2iflag_returned_timeoutp9S*  GQ# (#Qa!HL?-6' GQ# *#Qa!HL?-6' GQ# +#Qa!HL?-6' GQ# '#Qa!HL?-6' G j eB .E %bE 7B %B  jE   GlaM }` z 7w*a` 7ra*ahc%c7|ra6Z c| !-t-6X c|a6Q c|c>a G {H Gj G @ Av>.A GVA Z"zGB jH '9:,,9:j7,%jw. * 9:,w9:. 3*..,9:. 3 GH9:%% :9:&% X9:,% v9:,% %%w * 9:,w9:. 3*...%9:. 3 GHw *  ,w . 3*....% . 3 G#a!H-6' G#a!H-6' G#a!H-6' G#a!H-6' GJ V v"9:J %9=, $sB9:J &$ $sc9:J ,$P $s$% $ GP f| F2-b d -D --b'mw.f*r.f*.fRw.f*V%V7| r.f 6Z V| !-t-6X V|.f 6Q V|Vw.f*V%V7|r.f6Z V| !-t-6X V|.f6Q V|V/' GD#jRy.,ry* a y H y 6H 6H %y y#?9?,99H caa[%y (.wc*%a wwDy@*yb&y@Q &DQ DQ , rDy@*  Dy@ y#? D9?%y  G|Q P q,|-K (^ %X^ 7|NaP 6Q ^ |-K 'X^ w* -K -|qP i-|'-|-|| P i-| GQew tR+|eUT2VoteEscapehi ' Ow*w eh GQja`%##5j.pp.9W` 'Yrj* {b jhb `rj* {jh`rj* { jh `,rj*pppppppCould not find 9W` in  nor in fallback package nor in Alternate j G@aW M%%g?9?&&&g?9?&%%g333?9?&&&g333?9?&%%g9?&&% % g9?& GX gV iW_i %% \ /&% \ D,% \ Y,% \  G^ ~Ur2 w.*!7.%-ec   9?Awc *"c -~9?,~? l~? ~ Ge Q}N 89:9:$r*r*a NIOw*a r*a w*aXr* ](s Qrs us a g w*.g  W9:e -w*    9?,H9:,  S9:9:9:9: w%%H?9?&H?9?& 9:&,8%8,8 - 9:9:$r8*8a %8@@9? 8w8*8a8F{w*%%H?9?&&% 4C9?,(H @9?,Hw*M9:9:%H29:% w*2r*a 29:,% - 9:9:$-($-$w* #?IA --  9:%_-  9:%9?,@QPa(#??@M9999JP ף<M@??QAJ8%?8 5w8*o 8&8a 8a+8   8?89?o @A9?o @A8-9:%%8%8w*a I A- a+ a+9PI%  &  -'9:% w*w*a a+-(ma %A% B&%w*-' - 9:9:$)\=r awv9?,dI9?,dI' wr *r - a  w9Pv G` U` chK7.U%H EU9=,$bw*$$ G b Ny\4%7.N%' N Gd wGW"?9:` w& Gzf xg{xp%p7 p Bpp:w.x*v*R !B `L>.x-' .x-(~B w~*~-~-~-{{~{{,~~&{%p%p{Dp{ pIDDp%p{Dp{ yIDvp{R p{p pv%{R %{p.x-'r.* wxxxzwz*xrzB %rzB z z L=>zz Gxh Y{XyHx.'x"GYX GYl ugw~'uY%{Y7 qY uY Y. Ga] Xe E$% :w*% $ $% xw*% $ $% w*% $d $% w*% $(  G u }da d eu a X eu a N e9Pa S e9?,u  G o qUBg/7.%_w9:.j& H?--abYw*:&&-aVr*Su'w*wsw*b-S 9?,S *f*!v @!] A!RAttack enemy flag carrierkB(-'wg`!eK--a  ]J  ^-'Go after enemy holding flag rather than attacking8w*wgHHu'- 9?, r.*B7!s-a-\-'Go find my flag~w*wgu'-(w.*w..P%P7 P -rP *"bP Y{P pGet enemy flag on ground: P p[P YPww* E%9?,*f*!v @!IpA!RIntercept incoming enemy!(P%P7 P -rP *$P  E{P  .'-V pWaiting by enemy base for flag to return: P p[P YPXww*ww*wa/!k`!s rw,w w, C,x,' w*'\,Fight enemy threatening flag carrier q''7 r,!r&,@w*bFight enemy while waiting for flag carrier to score  A @B 7 w* q(' w.,*w,*,, r%,@,w&,@*\&,@ \, \,[\r\r, w*Fight enemy while waiting for flag carrier  A @B  w* q('N - - '7f,!v @!Y A!R r,d , 9?,', #( r\', #r,!r&,@@ 'Back up the flag carrier!'pFind the flag carrier - move to 9Vw*XkbwYw*wwsw*bppAttack the guy (on wp) holding the flag that I wantB(wwgwXX`!sa/!kppGo find the guy (on wp) holding the flag that I wantwwgw  Gb w }da ` gw a T gw a F g9Pa _ g9?,w  Gr v ZL@b%b7 4b -{v b $b  Ev b  bv 'b( Gf x }da [ hx a S hx a C h9Pa ` h9?,x  Gu p \=C<  'r6Y 6 f%f7 r6 6f  -q'f-q'Y   G_ z }da Y mz a P mz a A m9Pa d m9?,z  G{ j]:r6j 6 _%_7 w6j 6_  -l'_D-l'-<r6j 6Y _%v_7 lr6 6_  -m'_-m' Ej Gx#`]9:9:$a ja Ha Ma a a Fa V G #`]9:9:$a oa Qa _a a a Ja b G #`]9:9:$a xa Ra `a a a Oa f G #`]9:9:$a ya Sa ga a a ha l G } n^[8Gx%x7 r6n 6x  ;w6n 6 P-<w6n 6Y 'xx%Bx7 8x  En'x( G q]7XSwq*wq*rqq%'( G{A! _< =B  Go to vehicle Q' ,( zxGame.ComboDefensive zxGame.ComboSpeed-Kw*w r*!&W u [ Q'r*{u '(!@w *w *Nw.0 s w * b rS 9?,S  Attack enemy flag carrier B( -'w .0r* bY1   D u 'wB*  rBr *% 9?, 333? I reached my hiding spot, and am now wandering around.B*r * @ ' w' wB I am on my way to my hiding spot.'B*{%5{7 +{ -r{ *" b{ Y7  {  D{ { +[ {  pPickup downed enemy flag on my way to scoring: { p'{  9?,r. *-<   9? @ w *0 r  AHD Get super pickup on the way to scoring with flag. Q'w * ,< *f*!v @!zA!R Return to Base with flag![  No path to home base for flag carrier(7 r  Near my Base with flag! -Kw*w r* *f*!v @!^A!R NEED OUR FLAG BACK!   9?&B}  wB* wB'(7    k ' Gk C!|B k%k7 rk *C| k Y 9?@{|k (kw|*<|  9?@( | GaE!^} awa*w.a*-~ (R%*R.) R (9:R..aL%U ..an E333?R..an -~ '*RR8-~ rl*Oa^l.al \@@vlm^dl \@@a.a \@@ ?Oa^l.avlm^.a \@@@ .am^@ vOa^l.av@ aa(l GH!zOVpkwB *Qb$z B  B #?'( Gdlj}0m -|  / j;:wj*;10Irj* -| 'Jjc,aJ n j G K!F!X\6w*!9:d%d7 wd *@d `!sa/!kd d= GG!Cn N9 ECEDXE Dug GS!@ uqq[@ w.*3.9?,.bx@ *f*!v@ @!YA!R@ Pickup friendly flag'( GJ!E^ FO aEDXE D GL!FXo E X-F GM!P!u|" E GO!jJ -| ( GQ!dgtju@;ztt xE x*u.Yv ,, OLTeamGames.OLTeamGamesMultiColumnRulesPanel ,uzE z*y.SJ, OLTeamGames.OLTeamGamesTab_BotConfigBase ,yL.{ <JlOLTeamGames.OLTeamGamesTab_PlayerSettings mdc, K9?6d6d%6d%c,a+d GW!GizF7.G%.'-S  GR!E O 1jt?@uE u*x.Kv ,, GUI2K4.IAMultiColumnRulesPanel ,xyE y*z.:J, , ,zE LE c, 6E 9DKc,a+E  GT!J jQc,L QIzJ  |J L L QJ Q KQJ NL  GY![&pw.* w.7*w.7*3 7 9?b7 .. 9?,.G(pr.* 9:9:$a6 '7.%w77- rv*&r7 E w7*b7w.*;6 67 9? w.7*w.7*.G( r77k(7%@*palmost at 9V77-'Q' rvpppFind path to 9V7 now near 9Vvvvv ~R zrv*-' M7'' Mv''pppFind path to 9V7 through 9Vv Mv''ppFind path to 9V7 no path to ReturnPath-9:9:$2WpCOULDN'T FIND PATH TO RETURNPATH 9Vv M7'' d7 G[!F cN%7.F %'^wF -'MF 9?, GL @ P``!e P GV!^!}  #/ AwA*Aa/!| wA*Aa/!} E.ArE*1K%K7E  w.6KE *.6KE $K10 GK`!HSDw*H~appppppppp PlayerName  Team p(9S) # flags 9S7 FakeFlag: 9VO%O7NU H@NH-appp Flag 9SO: 9VOO.-pNU H@NH_ap Designation Target: 9S.OH(app PlayerName  NO Team-NU H@U Happppp bIsSpec:9T-OnlySpec:9T-Waiting:9T- Ready:9T-OutOfLives:9T- Ga!z}+z    Yw6*6O, AK|z A2Q 9:z&|} }  Gc!C<w*a*7%B9= GN Kv-- ' +.+%稨warning:9Vlinkgun had9S+links+%K+, ]K+(9:9:$N +j MgfhQMgf9?+,9:9:$r*/ a9 xx- wx*rxx10w* w*?F9:9:$J- +F 9? 9.Fw9* w.9*$w9* ]9qw9*@9N$-:9 h6<aj X9 h'r6999xw9A99#a+9P9 hM9 hr99-_ 'FFr99-_ 'w*H #?9:9:$oHhoM%- Hh?A*r*w.*g- Dh- (a666 ^ `EN & 6669D^ # 6666Dh69D^  6666Dh666 aDh666 :r*n9P hin9P h6n6666 nJhM99nHhM6aj XHh'8 w6* w6w j C w Hb w* w  9:9:$ w+* +- \w6*w*06&ch r*$%.+K$ .+K$  +%.+K$ .+K$ m w6* w6C ]6* w6A.6@ w* m s w*g  A*s  N m -  w*- (b?o9DI+69?m 6- e -w.6*w.6*6r.6o%K.6 rK*K.6" wK*KcWA*-O' K\ o +F 9? Q 6&ioj M m w*- '` .6w` *- o9D9??9?+9?& f o9?,6` \ o +F 9? .- w*-Oy-_ 9Z1r*- a.Ge 9=.GX&9: 9:  9=9: &1  Zw* %.+K$ &.+K$ ,.+K$ ,.+K$ +- \w6*w*06&c9=&$9=+9:, - w6* w c-(- ( G CG B9= Gdeb@9:9:$ e %   % % -  -g9:9:$%~%0&~&0,~,0,~,0%0*&0*,0*,0*e%!e7w.e*}%}7.e w}.e*we*.}.e0e}`e3e%e)we~e0GwG*w.G*.Gr e0eGGfe( Gn @j!rpPrd G dk!wSGEd%<d7d2|ddwdd G l!r L:Xr %r 7d 6Y %Y 7dAdr Y 7dr  G n!TJ3$5UST2U7ddT G @o!Iq,dI G  q!o#% Ao%8o7doodo  G{ u!p!x`B{ %={ 73{ -({ ' Gr!s!w!t!u  7 G dv!W s: %7 7 @  G@ b!u AV2w* S%%  p&%  ,%  ,%    Gy!{!tQ.5 G{S r.*r*r*r*ua  {%ua  {&ua  {d,ua f {,ua N {.ua$ (.Ca.a^w*w.*. _ .a.*a$ (u Gt//----------------------------------------------------------- // //----------------------------------------------------------- class ScoreBoardOLTeamDeathMatch extends ScoreBoardTeamDeathMatch; var Material OLTeamBoxMaterial[4]; var Color OLTeamColors[4]; const OLMAXPLAYERS = 14; simulated event UpdateScoreBoard(Canvas Canvas) { local PlayerReplicationInfo PRI, OwnerPRI; local int i, FontReduction,HeaderOffsetY,HeadFoot,PlayerBoxSizeY, BoxSpaceY; local float XL,YL, IconSize, MaxScaling, MessageFoot; local int MaxPlayerCount; local PlayerReplicationInfo RedPRI[OLMAXPLAYERS], BluePRI[OLMAXPLAYERS], GreenPRI[OLMAXPLAYERS], GoldPRI[OLMAXPLAYERS]; local font MainFont; local int ThisTeamIndex; local int PlayerCount[4], OwnerOffset[4]; OwnerPRI = PlayerController(Owner).PlayerReplicationInfo; for(i=0;i ((Canvas.ClipY - 1.5 * HeadFoot)/2)/(PlayerBoxSizeY + BoxSpaceY) ) { BoxSpaceY = 0.125 * YL; if ( MaxPlayerCount > ((Canvas.ClipY - 1.5 * HeadFoot)/2)/(PlayerBoxSizeY + BoxSpaceY) ) { if ( MaxPlayerCount > ((Canvas.ClipY - 1.5 * HeadFoot)/2)/(PlayerBoxSizeY + BoxSpaceY) ) { FontReduction++; Canvas.Font = GetSmallerFontFor(Canvas,FontReduction); Canvas.StrLen("Test", XL, YL); BoxSpaceY = 0.125 * YL; if ( HaveHalfFont(Canvas, FontReduction) ) PlayerBoxSizeY = 2.125 * YL; else PlayerBoxSizeY = 1.75 * YL; HeadFoot = 4*YL + IconSize; if ( MaxPlayerCount > ((Canvas.ClipY - 1.5 * HeadFoot)/2)/(PlayerBoxSizeY + BoxSpaceY) ) { FontReduction++; Canvas.Font = GetSmallerFontFor(Canvas,FontReduction); Canvas.StrLen("Test", XL, YL); BoxSpaceY = 0.125 * YL; if ( HaveHalfFont(Canvas, FontReduction) ) PlayerBoxSizeY = 2.125 * YL; else PlayerBoxSizeY = 1.75 * YL; HeadFoot = 4*YL + IconSize; if ( (Canvas.ClipY >= 600) && (MaxPlayerCount > ((Canvas.ClipY - HeadFoot)/2)/(PlayerBoxSizeY + BoxSpaceY)) ) { FontReduction++; Canvas.Font = GetSmallerFontFor(Canvas,FontReduction); Canvas.StrLen("Test", XL, YL); BoxSpaceY = 0.125 * YL; if ( HaveHalfFont(Canvas, FontReduction) ) PlayerBoxSizeY = 2.125 * YL; else PlayerBoxSizeY = 1.75 * YL; HeadFoot = 4*YL + IconSize; if ( MaxPlayerCount > ((Canvas.ClipY - HeadFoot)/2)/(PlayerBoxSizeY + BoxSpaceY) ) { FontReduction++; Canvas.Font = GetSmallerFontFor(Canvas,FontReduction); Canvas.StrLen("Test", XL, YL); BoxSpaceY = 0.125 * YL; if ( HaveHalfFont(Canvas, FontReduction) ) PlayerBoxSizeY = 2.125 * YL; else PlayerBoxSizeY = 1.75 * YL; HeadFoot = 4*YL + IconSize; } } } } } } MaxPlayerCount = Min(MaxPlayerCount, 1+((Canvas.ClipY - HeadFoot)/2)/(PlayerBoxSizeY + BoxSpaceY) ); if ( FontReduction > 2 ) MaxScaling = 3; else MaxScaling = 2.125; PlayerBoxSizeY = FClamp((1+((Canvas.ClipY - 0.67 * MessageFoot)/2))/MaxPlayerCount - BoxSpaceY, PlayerBoxSizeY, MaxScaling * YL); bDisplayMessages = (MaxPlayerCount < ((Canvas.ClipY - MessageFoot)/2)/(PlayerBoxSizeY + BoxSpaceY)); for(i=1;i= PlayerCount[i]) OwnerOffset[i] -=1; } HeaderOffsetY = 1.5*YL + IconSize; /* // draw center U if ( Canvas.ClipX >= 512 ) { Canvas.DrawColor = 0.75 * HUDClass.default.WhiteColor; ScoreBackScale = Canvas.ClipX/1024; Canvas.SetPos(0.5 * Canvas.ClipX - 128 * ScoreBackScale, HeaderOffsetY - 128 * ScoreBackScale); Canvas.DrawTile( ScoreboardU, 256*ScoreBackScale, 128*ScoreBackScale, 0, 0, 256, 128); } */ // draw title Canvas.Style = ERenderStyle.STY_Normal; DrawTitle(Canvas, HeaderOffsetY, (MaxPlayerCount+1)*(PlayerBoxSizeY + BoxSpaceY), PlayerBoxSizeY); // draw red team if(OLTeamsGameReplicationInfo(GRI).NumTeams >= 1) { MainFont = Canvas.Font; for (i=0; i= 2) { Canvas.Font = MainFont; for (i=0; i= 3) { Canvas.Font = MainFont; for (i=0; i= 4) { Canvas.Font = MainFont; for (i=0; i= PlayerCount ) LastLine = PlayerCount+1; else LastLine = PlayerCount; for ( i=1; i FMax(LongestNameLength,MaxNamePos) ) { LongestName = PlayerName[i]; LongestNameLength = XL; } } if ( OwnerOffset >= PlayerCount ) { playername[OwnerOffset] = GRI.PRIArray[OwnerOffset].PlayerName; Canvas.StrLen(playername[OwnerOffset], XL, YL); if ( XL > FMax(LongestNameLength,MaxNamePos) ) { LongestName = PlayerName[i]; LongestNameLength = XL; } } if ( LongestNameLength > 0 ) { bNameFontReduction = true; Canvas.Font = GetSmallerFontFor(Canvas,FontReduction+1); Canvas.StrLen(LongestName, XL, YL); if ( XL > MaxNamePos ) { Canvas.Font = GetSmallerFontFor(Canvas,FontReduction+2); Canvas.StrLen(LongestName, XL, YL); if ( XL > MaxNamePos ) Canvas.Font = GetSmallerFontFor(Canvas,FontReduction+3); } ReducedFont = Canvas.Font; } for ( i=0; i MaxNamePos ) playername[i] = left(playername[i], MaxNamePos/XL * len(PlayerName[i])); } if ( OwnerOffset >= PlayerCount ) { playername[OwnerOffset] = PRIArray[OwnerOffset].PlayerName; Canvas.StrLen(playername[OwnerOffset], XL, YL); if ( XL > MaxNamePos ) playername[OwnerOffset] = left(playername[OwnerOffset], MaxNamePos/XL * len(PlayerName[OwnerOffset])); } if ( Canvas.ClipX < 512 ) NameY = 0.5 * YL; else if ( !bHaveHalfFont ) NameY = 0.125 * YL; Canvas.Style = ERenderStyle.STY_Normal; Canvas.DrawColor = HUDClass.default.WhiteColor; Canvas.SetPos(0.5 * Canvas.ClipX, HeaderOffsetY + 4); BoxTextOffsetY = HeaderOffsetY + 0.5 * PlayerBoxSizeY - 0.5 * YL; Canvas.DrawColor = HUDClass.default.WhiteColor; if ( OwnerOffset == -1 ) { for ( i=0; i= 0 ) { if ( OwnerOffset >= PlayerCount ) { OwnerPos = (PlayerBoxSizeY + BoxSpaceY)*PlayerCount + BoxTextOffsetY; // draw extra box Canvas.Style = ERenderStyle.STY_Alpha; Canvas.SetPos(BoxXPos, HeaderOffsetY + (PlayerBoxSizeY + BoxSpaceY)*PlayerCount); Canvas.DrawTileStretched( TeamBoxMaterial[TeamNum], BoxWidth, PlayerBoxSizeY); Canvas.Style = ERenderStyle.STY_Normal; if ( PRIArray[OwnerOffset].HasFlag != None ) { Canvas.DrawColor = HUDClass.default.WhiteColor; Canvas.SetPos(NameXPos - 48*IconScale, OwnerPos - 16*IconScale); Canvas.DrawTile( FlagIcon, 64*IconScale, 32*IconScale, 0, 0, 256, 128); } } else OwnerPos = (PlayerBoxSizeY + BoxSpaceY)*OwnerOffset + BoxTextOffsetY; Canvas.DrawColor = HUDClass.default.GoldColor; Canvas.SetPos(NameXPos, OwnerPos-0.5*YL+NameY); if ( bNameFontReduction ) Canvas.Font = ReducedFont; Canvas.DrawText(playername[OwnerOffset],true); if ( bNameFontReduction ) Canvas.Font = GetSmallerFontFor(Canvas,FontReduction); Canvas.SetPos(ScoreXPos, OwnerPos); if ( PRIArray[OwnerOffset].bOutOfLives ) Canvas.DrawText(OutText,true); else Canvas.DrawText(int(PRIArray[OwnerOffset].Score),true); } // draw flag icons Canvas.DrawColor = HUDClass.default.WhiteColor; for(j=0;j= 0) && (Canvas.ClipX >= 512) ) { BoxTextOffsetY = HeaderOffsetY + 0.5*PlayerBoxSizeY + NameY; Canvas.DrawColor = HUDClass.default.CyanColor; if ( FontReduction > 3 ) bHaveHalfFont = false; if ( Canvas.ClipX >= 1280 ) Canvas.Font = GetSmallFontFor(Canvas.ClipX, FontReduction+2); else Canvas.Font = GetSmallFontFor(Canvas.ClipX, FontReduction+1); Canvas.StrLen("Test", XL, YL); for ( i=0; i= ScoreXPos - NameXPos ) OrdersText = "("$PRIArray[i].GetCallSign()$") "$TeamPlayerReplicationInfo(PRIArray[i]).Squad.GetShortOrderStringFor(TeamPlayerReplicationInfo(PRIArray[i])); } Canvas.DrawText(OrdersText,true); } if ( bHaveHalfFont || !PRIArray[i].bBot ) { Canvas.SetPos(NameXPos, (PlayerBoxSizeY + BoxSpaceY)*i + BoxTextOffsetY + LineCount*YL); Canvas.DrawText(PRIArray[i].GetLocationName(),true); } } if ( OwnerOffset >= PlayerCount ) { Canvas.SetPos(NameXPos, (PlayerBoxSizeY + BoxSpaceY)*i + BoxTextOffsetY); Canvas.DrawText(PRIArray[OwnerOffset].GetLocationName(),true); } } if ( Level.NetMode == NM_Standalone ) return; Canvas.Font = MainFont; Canvas.StrLen("Test",XL,YL); BoxTextOffsetY = HeaderOffsetY + 0.5 * PlayerBoxSizeY - 0.5 * YL; DrawNetInfo(Canvas,FontReduction,HeaderOffsetY,PlayerBoxSizeY,BoxSpaceY,BoxTextOffsetY,OwnerOffset,PlayerCount,NetXPos); } }!pW2K~!@{ ͏ҽҽҽҽZشoҽҽҽu)ҽҽҽҽZشoZشoډZشoډҽu)ҽҽҽҽҽZشoҽZشoҽҽu)ҽҽҽZشoJҽҽu)ҽҽҽҽҽu) ӥYY8ҽ ӥYY8ҽҽҽҽҽҽҽYY8ҽYY8ҽҽҽҽu)ҽҽҽu)ҽҽҽҽҽҽu)ҽYY8ҽҽYY8ҽҽҽҽYY8ҽu)ҽҽҽu)ҽҽҽҽҽYY8ҽҽYY8ҽu)ZشoZشoZشoZشoҽҽҽҽu)ҽҽҽҽҽҽYY88fҽҽYY88f\fF8f\fFYY8ҽYY88f\fFҽYY8ҽҽYY8ҽҽYY83}ҽҽIJZشo ӥ ӥYY8YY8YY8YY8JZشoҽu)ҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽҽZشoҽZشoҽZشoҽZشoҽҽZشoҽҽ3}rPPPPJ*JJJuM//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamXBanner extends xTeamBanner; simulated function UpdateForTeam() { if (Team == 0) Skins[0] = Shader'XGameShaders.RedBannerShader'; else if ( Team == 1 ) Skins[0] = Shader'XGameShaders.BlueBannerShader'; else if ( Team == 2 ) Skins[0] = Shader'OLTeamGamesTex.xTeamBanner.GreenBannerShader'; else if ( Team == 3 ) Skins[0] = Shader'OLTeamGamesTex.xTeamBanner.GoldBannerShader'; else Skins[0] = Default.Skins[0]; //Shader'XGameShaders.TeamBannerShader'; if ( (GRI != None) && (Team < 4) && (OLTeamsGameReplicationInfo(GRI).OLTeamSymbols[Team] != None) ) TexScaler(Combiner(Shader(Skins[0]).Diffuse).Material2).Material = OLTeamsGameReplicationInfo(GRI).OLTeamSymbols[Team]; } LS 'L99J A9?.}.Ka LJw}*} .}v}`}_} G@"F UBB"hSLoUKZشoHx" Zشo$Ig//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsZoomSuperShockRifle extends OLTeamsSuperShockRifle HideDropDown CacheExempt; var(Gfx) float testX; var(Gfx) float testY; var(Gfx) float borderX; var(Gfx) float borderY; var(Gfx) float focusX; var(Gfx) float focusY; var(Gfx) float innerArrowsX; var(Gfx) float innerArrowsY; var(Gfx) Color ArrowColor; var(Gfx) Color TargetColor; var(Gfx) Color NoTargetColor; var(Gfx) Color FocusColor; var(Gfx) Color ChargeColor; var(Gfx) vector RechargeOrigin; var(Gfx) vector RechargeSize; var transient float LastFOV; var() bool zoomed; var() xEmitter chargeEmitter; simulated function PostBeginPlay() { Super.PostBeginPlay(); } simulated function bool WeaponCentered() { return ( zoomed || bSpectated || (Hand > 1) ); } simulated function Destroyed() { if (chargeEmitter != None) chargeEmitter.Destroy(); Super.Destroyed(); } simulated function ClientWeaponThrown() { if( Instigator != None && Instigator.Controller.IsA( 'PlayerController' ) ) PlayerController(Instigator.Controller).EndZoom(); Super.ClientWeaponThrown(); } // compensate for bright fog simulated function SetZoomBlendColor(Canvas c) { local Byte val; local Color clr; local Color fog; clr.R = 255; clr.G = 255; clr.B = 255; clr.A = 255; if( Instigator.Region.Zone.bDistanceFog ) { fog = Instigator.Region.Zone.DistanceFogColor; val = 0; val = Max( val, fog.R); val = Max( val, fog.G); val = Max( val, fog.B); if( val > 128 ) { val -= 128; clr.R -= val; clr.G -= val; clr.B -= val; } } c.DrawColor = clr; } simulated event RenderOverlays( Canvas Canvas ) { local float tileScaleX; local float tileScaleY; local float bX; local float bY; local float fX; local float fY; local float ChargeBar; local float tX; local float tY; local float barOrgX; local float barOrgY; local float barSizeX; local float barSizeY; if ( LastFOV > PlayerController(Instigator.Controller).DesiredFOV ) { PlaySound(Sound'WeaponSounds.LightningGun.LightningZoomIn', SLOT_Misc,,,,,false); } else if ( LastFOV < PlayerController(Instigator.Controller).DesiredFOV ) { PlaySound(Sound'WeaponSounds.LightningGun.LightningZoomOut', SLOT_Misc,,,,,false); } LastFOV = PlayerController(Instigator.Controller).DesiredFOV; if ( PlayerController(Instigator.Controller).DesiredFOV == PlayerController(Instigator.Controller).DefaultFOV ) { Super.RenderOverlays(Canvas); zoomed=false; } else { if ( FireMode[0].NextFireTime <= Level.TimeSeconds ) { ChargeBar = 1.0; } else { ChargeBar = 1.0 - ((FireMode[0].NextFireTime-Level.TimeSeconds) / FireMode[0].FireRate); } tileScaleX = Canvas.SizeX / 640.0f; tileScaleY = Canvas.SizeY / 480.0f; bX = borderX * tileScaleX; bY = borderY * tileScaleY; fX = focusX * tileScaleX; fY = focusY * tileScaleX; tX = testX * tileScaleX; tY = testY * tileScaleX; barOrgX = RechargeOrigin.X * tileScaleX; barOrgY = RechargeOrigin.Y * tileScaleY; barSizeX = RechargeSize.X * tileScaleX; barSizeY = RechargeSize.Y * tileScaleY; SetZoomBlendColor(Canvas); Canvas.Style = 255; Canvas.SetPos(0,0); Canvas.DrawTile( Material'ZoomFB', Canvas.SizeX, Canvas.SizeY, 0.0, 0.0, 512, 512 ); // !! hardcoded size Canvas.DrawColor = FocusColor; Canvas.DrawColor.A = 255; // 255 was the original -asp. WTF??!?!?! Canvas.Style = ERenderStyle.STY_Alpha; Canvas.SetPos((Canvas.SizeX*0.5)-fX,(Canvas.SizeY*0.5)-fY); Canvas.DrawTile( Texture'SniperFocus', fX*2.0, fY*2.0, 0.0, 0.0, Texture'SniperFocus'.USize, Texture'SniperFocus'.VSize ); fX = innerArrowsX * tileScaleX; fY = innerArrowsY * tileScaleY; Canvas.DrawColor = ArrowColor; Canvas.SetPos((Canvas.SizeX*0.5)-fX,(Canvas.SizeY*0.5)-fY); Canvas.DrawTile( Texture'SniperArrows', fX*2.0, fY*2.0, 0.0, 0.0, Texture'SniperArrows'.USize, Texture'SniperArrows'.VSize ); // Draw the Charging meter -AsP Canvas.DrawColor = ChargeColor; Canvas.DrawColor.A = 255; if(ChargeBar <1) Canvas.DrawColor.R = 255*ChargeBar; else { Canvas.DrawColor.R = 0; Canvas.DrawColor.B = 0; } if(ChargeBar == 1) Canvas.DrawColor.G = 255; else Canvas.DrawColor.G = 0; Canvas.Style = ERenderStyle.STY_Alpha; Canvas.SetPos( barOrgX, barOrgY ); Canvas.DrawTile(Texture'Engine.WhiteTexture',barSizeX,barSizeY*ChargeBar, 0.0, 0.0,Texture'Engine.WhiteTexture'.USize,Texture'Engine.WhiteTexture'.VSize*ChargeBar); zoomed = true; } } simulated function ClientStartFire(int mode) { if (mode == 1) { FireMode[mode].bIsFiring = true; if( Instigator.Controller.IsA( 'PlayerController' ) ) PlayerController(Instigator.Controller).ToggleZoom(); } else { Super.ClientStartFire(mode); } } simulated function ClientStopFire(int mode) { if (mode == 1) { FireMode[mode].bIsFiring = false; if( Instigator.Controller.IsA( 'PlayerController' ) ) PlayerController(Instigator.Controller).StopZoom(); } else { Super.ClientStopFire(mode); } } simulated function BringUp(optional Weapon PrevWeapon) { if ( PlayerController(Instigator.Controller) != None ) LastFOV = PlayerController(Instigator.Controller).DesiredFOV; Super.BringUp(); } simulated function bool PutDown() { if( Instigator.Controller.IsA( 'PlayerController' ) ) PlayerController(Instigator.Controller).EndZoom(); if ( Super.PutDown() ) { GotoState(''); return true; } return false; } simulated function IncrementFlashCount(int Mode) { if ( Mode == 1 ) return; Super.IncrementFlashCount(Mode); } }l//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsZoomSuperShockBeamFire extends OLTeamsSuperShockBeamFire; var bool bAllowMultiHit; function bool AllowMultiHit() { return bAllowMultiHit; } A"u w* S%%  p&%  ,%  ,%    GVS PVXQw.* wP*.l.P.z P`P Gx//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsWillowWhisp extends WillowWhisp; function PostBeginPlay() { local int i,start; local Controller C; local Actor HitActor; local Vector HitLocation,HitNormal; local Rotator MyRotation; Super.PostBeginPlay(); C = Controller(Owner); if ( C.Pawn == None ) return; SetLocation(C.Pawn.Location); MyRotation = C.Rotation; MyRotation.Pitch += rand(4096) - 2048; MyRotation.Yaw += rand(4096) - 2048; WayPoints[0] = C.Pawn.Location + C.Pawn.CollisionHeight * Vect(0,0,1) + 200 * vector(MyRotation); HitActor = Trace(HitLocation, HitNormal,WayPoints[0], C.Pawn.Location,false); if ( HitActor != None ) WayPoints[0] = HitLocation; NumPoints++; if ( (C.RouteCache[i] != None) && C.ActorReachable(C.RouteCache[1]) ) start = 1; for ( i=start; i RedBuildEffectClass, BlueBuildEffectClass, GreenBuildEffectClass, GoldBuildEffectClass; var Emitter BuildEffect; var int TeamNum; var Vehicle LastSpawned; simulated event PostBeginPlay() { Super.PostBeginPlay(); if ( Level.NetMode != NM_DedicatedServer ) VehicleClass.static.StaticPrecache(Level); } simulated function UpdatePrecacheMaterials() { Level.AddPrecacheMaterial(Material'VMParticleTextures.buildEffects.PC_buildBorderNew'); Level.AddPrecacheMaterial(Material'VMParticleTextures.buildEffects.PC_buildStreaks'); VehicleClass.static.StaticPrecache(Level); } function PostNetBeginPlay() { local GameObjective O, Best; local float BestDist, NewDist; Super.PostNetBeginPlay(); if ( !bDeleteMe && !Level.Game.IsA('ONSOnslaughtGame') ) { ForEach AllActors(class'GameObjective',O) { NewDist = VSize(Location - O.Location); if ( (Best == None) || (NewDist < BestDist) ) { Best = O; BestDist = NewDist; } } if ( Best != None ) Activate(Best.DefenderTeamIndex); } } function Activate(byte T) { if (!bNeverActivate && (!bActive || TeamNum != T)) { TeamNum = T; bActive = True; bPreSpawn = True; Timer(); } } function Deactivate() { bActive = False; } event VehicleDestroyed(Vehicle V) { Super.VehicleDestroyed(V); bPreSpawn = True; SetTimer(RespawnTime - PreSpawnEffectTime, False); } function SpawnVehicle() { local Pawn P; local bool bBlocked; foreach CollidingActors(class'Pawn', P, VehicleClass.default.CollisionRadius * 1.25) { bBlocked = true; if (PlayerController(P.Controller) != None) PlayerController(P.Controller).ReceiveLocalizedMessage(class'ONSOnslaughtMessage', 11); } if (bBlocked) SetTimer(1, false); //try again later else { if (bReverseBlueTeamDirection && ONSOnslaughtGame(Level.Game) != None && ((TeamNum == 1 && !ONSOnslaughtGame(Level.Game).bSidesAreSwitched) || (TeamNum == 0 && ONSOnslaughtGame(Level.Game).bSidesAreSwitched))) LastSpawned = spawn(VehicleClass,,, Location, Rotation + rot(0,32768,0)); else LastSpawned = spawn(VehicleClass,,, Location, Rotation); if (LastSpawned != None ) { VehicleCount++; LastSpawned.SetTeamNum(TeamNum); LastSpawned.Event = Tag; LastSpawned.ParentFactory = Self; TriggerEvent(Event, Self, LastSpawned); } } } // General purpose check to make sure there aren't any pawns in the way function bool ValidateSpawnLocation(float Radius) { local Pawn P; foreach CollidingActors(class'Pawn', P, Radius) return False; return True; } function SpawnBuildEffect() { local rotator YawRot; YawRot = Rotation; YawRot.Roll = 0; YawRot.Pitch = 0; if (TeamNum == 0) BuildEffect = spawn(RedBuildEffectClass,,, Location, YawRot); else if (TeamNum == 1) BuildEffect = spawn(BlueBuildEffectClass,,, Location, YawRot); else if (TeamNum == 2) BuildEffect = spawn(GreenBuildEffectClass,,, Location, YawRot); else BuildEffect = spawn(GoldBuildEffectClass,,, Location, YawRot); } function Timer() { if (bActive && Level.Game.bAllowVehicles && VehicleCount < MaxVehicleCount) { if (bPreSpawn) { bPreSpawn = False; SpawnBuildEffect(); SetTimer(PreSpawnEffectTime, False); } else SpawnVehicle(); } } // Onslaught doesn't use the trigger system event Trigger( Actor Other, Pawn EventInstigator ) { } K"WF@L"Kg(T3}>}LB_B_IJ3}3}c#3}c#}L}L}L3}>qq3}3}}L3}}Lm $pAT $@W X afPw//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsTransTrailGreen extends TransTrail; \cS0)W%RW&|W,\W,`w*Xa cfrX**X'w.*. .\%\7.r\.*A.\&\\.aA.\&\<7..X. X Gv//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsTransTrailGold extends TransTrail; ]K//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsTransRecall extends TransRecall; var Material OLTransMaterials[4]; function Translocate() { local TransBeacon TransBeacon; local Actor HitActor; local Vector HitNormal,HitLocation,dest,Vel2D; local Vector PrevLocation,Diff, NewDest; local xPawn XP; local controller C; local bool bFailedTransloc; local int EffectNum; local float DiffZ; local int i; local int NumFlags; if ( (Instigator == None) || (Translauncher(Weapon) == None) ) return; TransBeacon = TransLauncher(Weapon).TransBeacon; // gib if the translocator is disrupted if ( TransBeacon.Disrupted() ) { UnrealMPGameInfo(Level.Game).SpecialEvent(Instigator.PlayerReplicationInfo,"translocate_gib"); bGibMe = true; // delay gib to avoid destroying player and weapons right away in the middle of all this return; } dest = TransBeacon.Location; if ( TransBeacon.Physics == PHYS_None ) dest += vect(0,0,1) * Instigator.CollisionHeight; else dest += vect(0,0,0.5) * Instigator.CollisionHeight; HitActor = Weapon.Trace(HitLocation,HitNormal,dest,TransBeacon.Location,true); if ( HitActor != None ) dest = TransBeacon.Location; TransBeacon.SetCollision(false, false, false); if( OLCTFGame(Level.Game) == none || !OLCTFGame(Level.Game).bTranslocateWithFlags ) { NumFlags = OLTeamsPlayerReplicationInfo(Instigator.PlayerReplicationInfo).HasFlags.Length; for(i=0;i 1.5 * C.Pawn.CollisionHeight ) { NewDest = Dest; NewDest.Z += 0.7 * C.Pawn.CollisionHeight; } else NewDest = Dest + 0.5 * C.Pawn.CollisionRadius * Normal(Diff); if ( Weapon.FastTrace(NewDest ,dest) ) Dest = NewDest; } } } if ( !bFailedTransloc && AttemptTranslocation(dest,TransBeacon) ) { TransLauncher(Weapon).ReduceAmmo(); // spawn out XP = xPawn(Instigator); if( XP != None ) XP.DoTranslocateOut(PrevLocation); // bound XY velocity to prevent cheats Vel2D = Instigator.Velocity; Vel2D.Z = 0; Vel2D = Normal(Vel2D) * FMin(Instigator.GroundSpeed,VSize(Vel2D)); Vel2D.Z = Instigator.Velocity.Z; Instigator.Velocity = Vel2D; if ( Instigator.PlayerReplicationInfo.Team != None ) EffectNum = Instigator.PlayerReplicationInfo.Team.TeamIndex; Instigator.SetOverlayMaterial( OLTransMaterials[EffectNum], 1.0, false ); Instigator.PlayTeleportEffect( false, false); if ( !Instigator.PhysicsVolume.bWaterVolume ) { if ( Bot(Instigator.Controller) != None ) { Instigator.Velocity.X = 0; Instigator.Velocity.Y = 0; Instigator.Velocity.Z = -150; Instigator.Acceleration = vect(0,0,0); } Instigator.SetPhysics(PHYS_Falling); } if ( UnrealTeamInfo(Instigator.PlayerReplicationInfo.Team)!= None ) UnrealTeamInfo(Instigator.PlayerReplicationInfo.Team).AI.CallForBall(Instigator); // for bombing run } else if( PlayerController(Instigator.Controller) != None ) PlayerController(Instigator.Controller).ClientPlaySound(TransFailedSound); TransBeacon.Destroy(); TransLauncher(Weapon).TransBeacon = None; TransLauncher(Weapon).ViewPlayer(); } Xc//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsTranslauncher extends Translauncher CacheExempt; var bool bOLTeamSet; simulated event RenderOverlays( Canvas Canvas ) { Super.RenderOverlays(Canvas); if ( PlayerController(Instigator.Controller).ViewTarget != TransBeacon ) { if ( !bOLTeamSet && (Instigator.PlayerReplicationInfo != None) && (Instigator.PlayerReplicationInfo.Team != None) ) { bOLTeamSet = true; if ( Instigator.PlayerReplicationInfo.Team.TeamIndex == 0 ) Skins[1] = Material'WeaponSkins.NEWTranslocatorTEX'; else if ( Instigator.PlayerReplicationInfo.Team.TeamIndex == 1 ) Skins[1] = Material'WeaponSkins.NEWTranslocatorBlue'; else if ( Instigator.PlayerReplicationInfo.Team.TeamIndex == 2 ) Skins[1] = Material'OLTeamGamesTex.NEWTranslocatorGreen'; else if ( Instigator.PlayerReplicationInfo.Team.TeamIndex == 3 ) Skins[1] = Material'OLTeamGamesTex.NEWTranslocatorGold'; } } } {//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsTransFlareGreen extends TransFlareBlue; z//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsTransFlareGold extends TransFlareBlue; U//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsTransFire extends TransFire; function projectile SpawnProjectile(Vector Start, Rotator Dir) { local TransBeacon TransBeacon; if (TransLauncher(Weapon).TransBeacon == None) { if ( (Instigator == None) || (Instigator.PlayerReplicationInfo == None) || (Instigator.PlayerReplicationInfo.Team == None) ) TransBeacon = Weapon.Spawn(class'XWeapons.TransBeacon',,, Start, Dir); else if ( Instigator.PlayerReplicationInfo.Team.TeamIndex == 0 ) TransBeacon = Weapon.Spawn(class'XWeapons.RedBeacon',,, Start, Dir); else if ( Instigator.PlayerReplicationInfo.Team.TeamIndex == 1 ) TransBeacon = Weapon.Spawn(class'XWeapons.BlueBeacon',,, Start, Dir); else if ( Instigator.PlayerReplicationInfo.Team.TeamIndex == 2 ) TransBeacon = Weapon.Spawn(class'OLTeamGames.OLTeamsGreenBeacon',,, Start, Dir); else if ( Instigator.PlayerReplicationInfo.Team.TeamIndex == 3 ) TransBeacon = Weapon.Spawn(class'OLTeamGames.OLTeamsGoldBeacon',,, Start, Dir); TransLauncher(Weapon).TransBeacon = TransBeacon; Weapon.PlaySound(TransFireSound,SLOT_Interact,,,,,false); } else { TransLauncher(Weapon).ViewPlayer(); if ( TransLauncher(Weapon).TransBeacon.Disrupted() ) { if( (Instigator != None) && (PlayerController(Instigator.Controller) != None) ) PlayerController(Instigator.Controller).ClientPlaySound(Sound'WeaponSounds.BSeekLost1'); } else { TransLauncher(Weapon).TransBeacon.Destroy(); TransLauncher(Weapon).TransBeacon = None; Weapon.PlaySound(RecallFireSound,SLOT_Interact,,,,,false); } } return TransBeacon; } pEX w*qr*r*r*D a E@D 5ap E@@%D *D j} Gy//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsTransEffectGreen extends TransEffect; W"y@X" r(xYx//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsTransEffectGold extends TransEffect; Y"n@Z"h r(xYm //----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsTransAttachment extends TransAttachment; simulated event BaseChange() { if ( (Pawn(Base) != None) && (Pawn(Base).PlayerReplicationInfo != None) && (Pawn(Base).PlayerReplicationInfo.Team != None) ) { if ( Pawn(Base).PlayerReplicationInfo.Team.TeamIndex == 1 ) Skins[1] = Material'WeaponSkins.NEWTranslocatorBlue'; else if ( Pawn(Base).PlayerReplicationInfo.Team.TeamIndex == 0 ) Skins[1] = Material'WeaponSkins.NEWTranslocatorTEX'; else if ( Pawn(Base).PlayerReplicationInfo.Team.TeamIndex == 2 ) Skins[1] = Material'OLTeamGamesTex.NEWTranslocatorGreen'; else Skins[1] = Material'OLTeamGamesTex.NEWTranslocatorGold'; } } Nclass OLTeamsTeamSayMessagePlus extends StringMessagePlus; static function RenderComplexMessage( Canvas Canvas, out float XL, out float YL, optional string MessageString, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { local string LocationName; if (RelatedPRI_1 == None) return; Canvas.SetDrawColor(0,255,0); Canvas.DrawText( RelatedPRI_1.PlayerName$" ", False ); Canvas.SetPos( Canvas.CurX, Canvas.CurY - YL ); LocationName = RelatedPRI_1.GetLocationName(); if (LocationName != "") { Canvas.SetDrawColor(0,128,255); Canvas.DrawText( " ("$LocationName$"):", False ); } else Canvas.DrawText( ": ", False ); Canvas.SetPos( Canvas.CurX, Canvas.CurY - YL ); Canvas.SetDrawColor(0,128,0); Canvas.DrawText( MessageString, False ); } static function string AssembleString( HUD myHUD, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional String MessageString ) { local string LocationName; if (RelatedPRI_1 == None) return ""; LocationName = RelatedPRI_1.GetLocationName(); if ( LocationName == "" ) return RelatedPRI_1.PlayerName@":"@MessageString; else return RelatedPRI_1.PlayerName$" ("$LocationName$"): "$MessageString; } V"a #9:9:$*w*w*w*uw*!R Gp X }b?p   ryDp z9P99yYp z GG //----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsSuperShockRifle extends OLTeamsShockRifle CacheExempt; simulated function bool ConsumeAmmo(int Mode, float load, optional bool bAmountNeededIsMax) { return true; } simulated function CheckOutOfAmmo() { } function float GetAIRating() { return AIRating; } simulated function bool StartFire(int mode) { bWaitForCombo = false; return Super.StartFire(mode); } function float RangedAttackTime() { return 0; } /* BestMode() choose between regular or alt-fire */ function byte BestMode() { return 0; } j//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsSuperShockBeamFire extends OLTeamsShockBeamFire; function DoFireEffect() { local Vector StartTrace; local Rotator R, Aim; Instigator.MakeNoise(1.0); // the to-hit trace always starts right in front of the eye StartTrace = Instigator.Location + Instigator.EyePosition(); Aim = AdjustAim(StartTrace, AimError); R = rotator(vector(Aim) + VRand()*FRand()*Spread); DoTrace(StartTrace, R); } function DoTrace(Vector Start, Rotator Dir) { local Vector X; X = vector(Dir); TracePart(Start,Start+X*TraceRange,X,Dir,Instigator); } function bool AllowMultiHit() { return false; } function TracePart(Vector Start, Vector End, Vector X, Rotator Dir, Pawn Ignored) { local Vector HitLocation, HitNormal; local Actor Other; Other = Ignored.Trace(HitLocation, HitNormal, End, Start, true); if ( (Other != None) && (Other != Ignored) ) { if ( !Other.bWorldGeometry ) { Other.TakeDamage(DamageMax, Instigator, HitLocation, Momentum*X, DamageType); HitNormal = Vect(0,0,0); if ( (Pawn(Other) != None) && (HitLocation != Start) && AllowMultiHit() ) TracePart(HitLocation,End,X,Dir,Pawn(Other)); } } else { HitLocation = End; HitNormal = Vect(0,0,0); } SpawnBeamEffect(Start, Dir, HitLocation, HitNormal, 0); } r//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsSpeedTrail extends SpeedTrail; ^"nY=u 99g^nnu u g GB//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsSpecialKillMessage extends SpecialKillMessage; ~//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockRiflePickup extends ShockRiflePickup; u//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockRifle extends ShockRifle CacheExempt; var color OLEffectColor[4]; simulated function PostBeginPlay() { Super.PostBeginPlay(); ConstantColor'UT2004Weapons.ShockControl'.Color = EffectColor; // OLEffectColor[Pawn(Owner).PlayerReplicationInfo.Team.TeamIndex] } ` //----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockProjFire extends ShockProjFire; //Hack fix for Shock Rifle so bots will recognize that they can do combos with a modified shock rifle function projectile SpawnProjectile(Vector Start, Rotator Dir) { local Projectile p; p = Super(ProjectileFire).SpawnProjectile(Start,Dir); if ( (ShockRifle(Weapon) != None) && (p != None) ) ShockRifle(Weapon).SetComboTarget(ShockProjectile(P)); OLTeamsShockProjectile(p).TeamIndex = Instigator.PlayerReplicationInfo.Team.TeamIndex; return p; } Yx ^&(IPaab { x 'wI* wIPI- I&ia[b #w.I* ax \^a{ [T.I a{ b #Xx Tab % Gv%//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockProjectile extends ShockProjectile; var int TeamIndex; var class ShockBallEffectClass[4]; var class ShockExplosionCoreClass[4]; var class ShockExplosionClass[4]; var class ShockComboClass[4]; var class ComboDecalClass[4]; var Material OLTextures[4]; //var class OLExplosionDecal[4]; replication { unreliable if (bNetInitial && Role == ROLE_AUTHORITY) TeamIndex; } simulated function PostBeginPlay() { Super(Projectile).PostBeginPlay(); // ExplosionDecal = OLExplosionDecal[TeamIndex]; Velocity = Speed * Vector(Rotation); // starts off slower so combo can be done closer SetTimer(0.4, false); tempStartLoc = Location; } simulated function Tick(float DeltaTime) { if ( Level.NetMode != NM_DedicatedServer && ShockBallEffect == none) { Texture = OLTextures[TeamIndex]; ShockBallEffect = Spawn(ShockBallEffectClass[TeamIndex], self); ShockBallEffect.SetBase(self); } } simulated function Explode(vector HitLocation,vector HitNormal) { if ( Role == ROLE_Authority ) { HurtRadius(Damage, DamageRadius, MyDamageType, MomentumTransfer, HitLocation ); } PlaySound(ImpactSound, SLOT_Misc); if ( EffectIsRelevant(Location,false) ) { Spawn(ShockExplosionCoreClass[TeamIndex],,, Location); if ( !Level.bDropDetail && (Level.DetailMode != DM_Low) ) Spawn(ShockExplosionClass[TeamIndex],,, Location); } SetCollisionSize(0.0, 0.0); Destroy(); } function SuperExplosion() { local actor HitActor; local vector HitLocation, HitNormal; HurtRadius(ComboDamage, ComboRadius, class'DamTypeShockCombo', ComboMomentumTransfer, Location ); Spawn(ShockComboClass[TeamIndex]); if ( (Level.NetMode != NM_DedicatedServer) && EffectIsRelevant(Location,false) ) { HitActor = Trace(HitLocation, HitNormal,Location - Vect(0,0,120), Location,false); if ( HitActor != None ) Spawn(ComboDecalClass[TeamIndex],self,,HitLocation, rotator(vect(0,0,-1))); } PlaySound(ComboSound, SLOT_None,1.0,,800); DestroyTrails(); Destroy(); } {//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockMuzFlashRed extends ShockMuzFlash; }//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockMuzFlashGreen extends ShockMuzFlash; |//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockMuzFlashGold extends ShockMuzFlash; |//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockMuzFlashBlue extends ShockMuzFlash; A//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockMuzFlash3rdRed extends ShockMuzFlash3rd; C//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockMuzFlash3rdGreen extends ShockMuzFlash3rd; B//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockMuzFlash3rdGold extends ShockMuzFlash3rd; B//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockMuzFlash3rdBlue extends ShockMuzFlash3rd; YDs"\  -D GC//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockImpactScorchRed extends ShockImpactScorch; ~oeHMr*r.* o.oa.%B translocate_gib-' ro 9:o9:$r#?r#?A!aOGro 'WwA*ro oa(((#r.'* .'-S a7.[%#[a%.j? [| xwx*lwx*wxPrx X6P6PlXx9?,7Px9?,xiFx . -t'lX?xQr6Q333?xHQrի?xPl b$QrrQxxK-tdro.jO.wO*O a|y 6yyyy6y6  yw*gfg~?(F ((- sw.*6 6 6  #o$w.*. Ow.*. _oa.*.C GE//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockImpactScorchGreen extends ShockImpactScorch; D//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockImpactScorchGold extends ShockImpactScorch; D//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockImpactScorchBlue extends ShockImpactScorch; //----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockImpactRingRed extends ShockImpactRing; A//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockImpactRingGreen extends ShockImpactRing; @//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockImpactRingGold extends ShockImpactRing; @//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockImpactRingBlue extends ShockImpactRing; A//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockImpactFlareRed extends ShockImpactFlare; C//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockImpactFlareGreen extends ShockImpactFlare; B//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockImpactFlareGold extends ShockImpactFlare; B//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockImpactFlareBlue extends ShockImpactFlare; }//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockExplosionRed extends ShockExplosion; //----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockExplosionGreen extends ShockExplosion; ~//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockExplosionGold extends ShockExplosion; E//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockExplosionCoreRed extends ShockExplosionCore; G//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockExplosionCoreGreen extends ShockExplosionCore; F//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockExplosionCoreGold extends ShockExplosionCore; F//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockExplosionCoreBlue extends ShockExplosionCore; Vcp hcB U% U&U,U,b' U%\ U&\U,\U,\U,\b'r*c,a -(-($ fff?%-',, U%V U&VU,VU,VU,V E E  E E E E E G~//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockExplosionBlue extends ShockExplosion; C//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockComboWigglesRed extends ShockComboWiggles; H#Zg@{c,w.Z*.Z j{  Name  B !r{*r{*9J{  Team{  ,, ` |r{*z{{  Voice{   -{-- - K- /9D{9?&  ` o9D{  \ p9WUnknown component calling LoadINI:.Z.Z LL'  rZ{ Character  GE//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockComboWigglesGreen extends ShockComboWiggles; D//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockComboWigglesGold extends ShockComboWiggles; D//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockComboWigglesBlue extends ShockComboWiggles; K#g_cc,b{ c" cVSetNamev,,  c Team9S'c A,,- -- -c---g'c  c9?&cT&-g(  c j 9?-g(f{  cVChangeCharacterca/!Q-g(c Character'N|6Femalec SexF'fc SexM'{  c U-gcb GE //----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockComboRed extends ShockCombo; simulated event PostBeginPlay() { Super(Actor).PostBeginPlay(); if (Level.NetMode != NM_DedicatedServer) { Spawn(class'OLTeamsShockComboExpRingRed'); Flare = Spawn(class'OLTeamsShockComboFlareRed'); //Spawn(class'ShockComboSphere'); Spawn(class'OLTeamsShockComboCoreRed'); Spawn(class'ShockComboSphereDark'); Spawn(class'ShockComboVortex'); Spawn(class'OLTeamsShockComboWigglesRed'); Spawn(class'OLTeamsShockComboFlashRed'); } } Q //----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockComboGreen extends ShockCombo; simulated event PostBeginPlay() { Super(Actor).PostBeginPlay(); if (Level.NetMode != NM_DedicatedServer) { Spawn(class'OLTeamsShockComboExpRingGreen'); Flare = Spawn(class'OLTeamsShockComboFlareGreen'); //Spawn(class'ShockComboSphere'); Spawn(class'OLTeamsShockComboCoreGreen'); Spawn(class'ShockComboSphereDark'); Spawn(class'ShockComboVortex'); Spawn(class'OLTeamsShockComboWigglesGreen'); Spawn(class'OLTeamsShockComboFlashGreen'); } } O#S c$w|6Juggernaut|6Axon|6Cyclops|6Virus6@6 AKuw @6S . 6 KrS *pppCould not load mesh: 6 For player: 6 C9JʗC %9SC &255 A)Q C9:w&ums S %m&s&a!V?  GK //----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockComboGold extends ShockCombo; simulated event PostBeginPlay() { Super(Actor).PostBeginPlay(); if (Level.NetMode != NM_DedicatedServer) { Spawn(class'OLTeamsShockComboExpRingGold'); Flare = Spawn(class'OLTeamsShockComboFlareGold'); //Spawn(class'ShockComboSphere'); Spawn(class'OLTeamsShockComboCoreGold'); Spawn(class'ShockComboSphereDark'); Spawn(class'ShockComboVortex'); Spawn(class'OLTeamsShockComboWigglesGold'); Spawn(class'OLTeamsShockComboFlashGold'); } } //----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockComboFlashRed extends ShockComboFlash; A//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockComboFlashGreen extends ShockComboFlash; @//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockComboFlashGold extends ShockComboFlash; @//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockComboFlashBlue extends ShockComboFlash; //----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockComboFlareRed extends ShockComboFlare; R#Z#@ Jakob G@A//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockComboFlareGreen extends ShockComboFlare; @//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockComboFlareGold extends ShockComboFlare; lal &llmm-'-'q [7%A%7a%a7n a7aabM K  G@//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockComboFlareBlue extends ShockComboFlare; ]#tH )dtrt* }t 9}% ^{6}t Xb6}{6}t X t!% @|6}, bDesignationyt,tNx Fyta|6}, bDistributionyt,tNx Fytyt, tNx Fytaa|6}, bSubtractionyt, tNx Fyt GC//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockComboExpRingRed extends ShockComboExpRing; E//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockComboExpRingGreen extends ShockComboExpRing; D//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockComboExpRingGold extends ShockComboExpRing; D//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockComboExpRingBlue extends ShockComboExpRing; }//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockComboCoreRed extends ShockComboCore; _#Nx\& _N lt6_K_7  |6_, bDesignation%{t,_N| F%{rTrueN LFalseTlFalseNN|6_, bDistribution%{t,_N| F%{rTrueN LFalseTlFalseNN|6_,bFlagElimination%{t,_N&{t,_N| F%{rTrue)| F&{rTrueNN LFalseTlFalseN G//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockComboCoreGreen extends ShockComboCore; ~//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockComboCoreGold extends ShockComboCore; ~//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockComboCoreBlue extends ShockComboCore; K //----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockComboBlue extends ShockCombo; simulated event PostBeginPlay() { Super(Actor).PostBeginPlay(); if (Level.NetMode != NM_DedicatedServer) { Spawn(class'OLTeamsShockComboExpRingBlue'); Flare = Spawn(class'OLTeamsShockComboFlareBlue'); //Spawn(class'ShockComboSphere'); Spawn(class'OLTeamsShockComboCoreBlue'); Spawn(class'ShockComboSphereDark'); Spawn(class'ShockComboVortex'); Spawn(class'OLTeamsShockComboWigglesBlue'); Spawn(class'OLTeamsShockComboFlashBlue'); } } C//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockBeamMuzFlashRed extends ShockBeamMuzFlash; e#HN #H%H7Bw.H*@H {6@HI H@ z6@HHk6@F@7HL6@'HHxH!% H-(-( GE//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockBeamMuzFlashGreen extends ShockBeamMuzFlash; D//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockBeamMuzFlashGold extends ShockBeamMuzFlash; l#p#O g.BVwg *=g ]=*w=*-Z|9V=9V={-Z'wg *=g =*,w=*-Z-Z|9V=9V=HH{-Z'wgO*=gO=*w=*-Z-Z|9V=ll9V={ll-Z'"wgL*=gL)=*fw=*-Z-Z|9V=mm9V={mm-Z'-Zb GgD//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockBeamMuzFlashBlue extends ShockBeamMuzFlash; @//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockBeamFire extends ShockBeamFire; var() class OLBeamEffectClass[4]; var() class OLFlashEmitterClass[4]; function SpawnBeamEffect(Vector Start, Rotator Dir, Vector HitLocation, Vector HitNormal, int ReflectNum) { local ShockBeamEffect Beam; if (Weapon != None) { if (Instigator == none || Instigator.PlayerReplicationInfo == none || Instigator.PlayerReplicationInfo.Team == none) Beam = Weapon.Spawn(BeamEffectClass,,, Start, Dir); else Beam = Weapon.Spawn(OLBeamEffectClass[Instigator.PlayerReplicationInfo.Team.TeamIndex],,, Start, Dir); if (ReflectNum != 0) Beam.Instigator = None; // prevents client side repositioning of beam start Beam.AimAt(HitLocation, HitNormal); } } function InitEffects() { if ( Level.DetailMode == DM_Low ) FlashEmitterClass = None; else if ( Instigator != none && Instigator.PlayerReplicationInfo != none && Instigator.PlayerReplicationInfo.Team != none ) { FlashEmitterClass = OLFlashEmitterClass[Instigator.PlayerReplicationInfo.Team.TeamIndex]; } Super.InitEffects(); if ( FlashEmitter != None ) Weapon.AttachToBone(FlashEmitter, 'tip'); } s//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockBallRed extends ShockBall; o#f D5frf -LbD J  rf l% z9Vle%z9Vle,zll9Vle, #zmm9Vle,4Dpppppp||l|mE DO  f  Gu//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockBallGreen extends ShockBall; t//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockBallGold extends ShockBall; t#x#y ,"/{aBmp?OLRedTeamSymbol=_{aBmp?OLBlueTeamSymbol={laBmp?OLGreenTeamSymbol=l{maBmp?OLGoldTeamSymbol=mm Gm@t//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShockBallBlue extends ShockBall; A//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShieldGun extends ShieldGun CacheExempt; A//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShieldEffect3rdGREEN extends ShieldEffect3rd; @//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShieldEffect3rdGOLD extends ShieldEffect3rd; K//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsShieldAttachment extends ShieldAttachment; function InitFor(Inventory I) { super(xWeaponAttachment).InitFor(I); if ( (Instigator.PlayerReplicationInfo == None) || (Instigator.PlayerReplicationInfo.Team == None) || (Instigator.PlayerReplicationInfo.Team.TeamIndex > 3) ) ShieldEffect3rd = Spawn(class'ShieldEffect3rd', I.Instigator); else if ( Instigator.PlayerReplicationInfo.Team.TeamIndex == 0 ) ShieldEffect3rd = Spawn(class'ShieldEffect3rdRED', I.Instigator); else if ( Instigator.PlayerReplicationInfo.Team.TeamIndex == 1 ) ShieldEffect3rd = Spawn(class'ShieldEffect3rdBLUE', I.Instigator); else if ( Instigator.PlayerReplicationInfo.Team.TeamIndex == 2 ) ShieldEffect3rd = Spawn(class'OLTeamsShieldEffect3rdGREEN', I.Instigator); else ShieldEffect3rd = Spawn(class'OLTeamsShieldEffect3rdGOLD', I.Instigator); ShieldEffect3rd.SetBase(I.Instigator); } cclass OLTeamsSayMessagePlus extends StringMessagePlus; var color RedTeamColor,BlueTeamColor,GreenTeamColor,GoldTeamColor; static function RenderComplexMessage( Canvas Canvas, out float XL, out float YL, optional string MessageString, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { if (RelatedPRI_1 == None) return; Canvas.SetDrawColor(0,255,0); Canvas.DrawText( RelatedPRI_1.PlayerName$": ", False ); Canvas.SetPos( Canvas.CurX, Canvas.CurY - YL ); Canvas.SetDrawColor(0,128,0); Canvas.DrawText( MessageString, False ); } static function string AssembleString( HUD myHUD, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional String MessageString ) { if ( RelatedPRI_1 == None ) return ""; if ( RelatedPRI_1.PlayerName == "" ) return ""; return RelatedPRI_1.PlayerName$": "@MessageString; } static function color GetConsoleColor( PlayerReplicationInfo RelatedPRI_1 ) { if ( (RelatedPRI_1 == None) || (RelatedPRI_1.Team == None) ) return Default.DrawColor; if ( RelatedPRI_1.Team.TeamIndex == 0 ) return Default.RedTeamColor; else if ( RelatedPRI_1.Team.TeamIndex == 1 ) return Default.BlueTeamColor; else if ( RelatedPRI_1.Team.TeamIndex == 2 ) return Default.GreenTeamColor; else return Default.GoldTeamColor; } M//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsRosterConfigured extends xTeamRoster; /* this class used for configured instant action or multiplayer games with bots */ var config array Characters; function Initialize(int TeamBots) { local int i; for ( i=0; i Chars) { default.Characters = Chars; } static function AddCharacter(string CharName) { local int i; i = FindCharIndex(CharName); if ( i == -1 ) default.Characters[default.Characters.Length] = CharName; } static function RemoveCharacter(int Index, int Count) { if ( Index < 0 || Index >= default.Characters.Length ) return; if ( Count < 0 ) Count = default.Characters.Length; default.Characters.Remove(Index, Min(Count, default.Characters.Length - Index)); } static function int FindCharIndex(string CharName) { local int i; for ( i = 0; i < default.Characters.Length; i++ ) if ( default.Characters[i] ~= CharName ) return i; return -1; } static function GetAllCharacters(out array Chars) { Chars = default.Characters; } ^class OLTeamsRedWhisp extends OLTeamsWillowWhisp; #exec OBJ LOAD File=XMiscEffects.utx E@$y @A${TEt[N$ANAO*((O(({"F"Y z{//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsRedShockBeamEffect extends ShockBeamEffect; simulated function SpawnImpactEffects(rotator HitRot, vector EffectLoc) { Spawn(class'OLTeamsShockImpactFlareRed',,, EffectLoc, HitRot); Spawn(class'OLTeamsShockImpactRingRed',,, EffectLoc, HitRot); Spawn(class'OLTeamsShockImpactScorchRed',,, EffectLoc, Rotator(-HitNormal)); Spawn(class'OLTeamsShockExplosionCoreRed',,, EffectLoc+HitNormal*8, HitRot); } S//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsProjector extends Projector; var GameReplicationInfo GRI; var() int Team; replication { unreliable if ( (Role==ROLE_Authority) && bNetInitial ) Team; } simulated function UpdateForTeam() { switch(Team) { case 0: ProjTexture=Combiner'OLTeamGamesTex.Projectors.RedProjector'; break; case 1: ProjTexture=Combiner'OLTeamGamesTex.Projectors.BlueProjector'; break; case 2: ProjTexture=Combiner'OLTeamGamesTex.Projectors.GreenProjector'; break; case 3: ProjTexture=Combiner'OLTeamGamesTex.Projectors.GoldProjector'; break; } if ( (GRI != None) && (Team < 4) && (OLTeamsGameReplicationInfo(GRI).OLTeamSymbols[Team] != None) ) Combiner(ProjTexture).Material1 = OLTeamsGameReplicationInfo(GRI).OLTeamSymbols[Team]; } simulated function SetGRI(GameReplicationInfo NewGRI) { GRI = NewGRI; UpdateForTeam(); } simulated function PostNetBeginPlay() { Super.PostNetBeginPlay(); if ( Level.Game != None ) SetGRI(Level.Game.GameReplicationInfo); } bypNyjZ[YN  nh Y%QY7Gw.Y*wY.Y-'.Yn6.Y  #=6.Y ?YyGn E Eb E[W EN E  GC$bt 9:9:$-G`E$_ѓצ93}3}>ZشoxZشoY bP`"^$@?|*//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsPlayerReplicationInfo extends xPlayerReplicationInfo; var array HasFlags; var byte LastKilled; // The team number of the last guy killed. Only used server-side. var byte ImportantPlayer; replication { reliable if ( bNetDirty && (Role == ROLE_Authority) && bNetOwner ) HasFlags; reliable if ( bNetDirty && (Role == ROLE_Authority) ) ImportantPlayer; } event PreBeginPlay() { super.PreBeginPlay(); LastKilled = -1; } function Reset() { if(HasFlag != none) HasFlag.Destroy(); HasFlag = none; HasFlags.Length = 0; LastKilled = -1; Super.Reset(); } simulated function UpdatePrecacheMaterials() { local byte UseSkinPackage; local string CustomPackage; local Material BodySkin, FaceSkin; if ( CharacterName == "" ) return; rec = class'xUtil'.static.FindPlayerRecord(CharacterName); if ( rec.Species != None ) { rec.Species.static.LoadResources(rec, Level,self,255); } if (!class'OLTeamPawn'.static.UseDefaultModel(rec,CustomPackage,UseSkinPackage)) { class'OLTeamPawn'.static.LoadPlayerSkins(rec,Team.TeamIndex,(UseSkinPackage == 1),CustomPackage,BodySkin,FaceSkin); Level.AddPrecacheMaterial(BodySkin); Level.AddPrecacheMaterial(FaceSkin); } } /* DisplayDebug() list important controller attributes on canvas */ simulated function DisplayDebug(Canvas Canvas, out float YL, out float YPos) { local int i; if ( Team != None ) { Canvas.DrawText(" PlayerName "$PlayerName$" Team "$Team.GetHumanReadableName() $"("$Team.TeamIndex$") # flags "$HasFlags.Length$" FakeFlag: "$HasFlag); for(i=0;irk Drk W`-`]`R' GI$r @K$[K2VaQYT'U'V'`I//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsONSPRVBuildEffectGreen extends ONSVehicleBuildEffect; J$ GreenMineClass; var class GoldMineClass; function projectile SpawnProjectile(Vector Start, Rotator Dir) { local Projectile p; local int x; if (Weapon.Instigator.GetTeamNum() == 0) ProjectileClass = RedMineClass; if (Weapon.Instigator.GetTeamNum() == 1) ProjectileClass = BlueMineClass; if (Weapon.Instigator.GetTeamNum() == 2) ProjectileClass = GreenMineClass; if (Weapon.Instigator.GetTeamNum() == 3) ProjectileClass = GoldMineClass; if( ProjectileClass != None ) p = Weapon.Spawn(ProjectileClass, Weapon,, Start, Dir); if( p == None ) return None; p.Damage *= DamageAtten; if (ONSMineLayer(Weapon) != None) { if (ONSMineLayer(Weapon).CurrentMines >= ONSMineLayer(Weapon).MaxMines) { for (x = 0; x < ONSMineLayer(Weapon).Mines.length; x++) { if (ONSMineLayer(Weapon).Mines[x] == None) { ONSMineLayer(Weapon).Mines.Remove(x, 1); x--; } else { ONSMineLayer(Weapon).Mines[x].Destroy(); ONSMineLayer(Weapon).Mines.Remove(x, 1); break; } } } ONSMineLayer(Weapon).Mines[ONSMineLayer(Weapon).Mines.length] = p; ONSMineLayer(Weapon).CurrentMines++; } return p; } Q$t L kc,q-T 'T'gwk*k-T' *t %t 7Tt 't x9:k9:$T T` <9:k9:$T 'T 'T 'wk*ykWT 'kDT kTT T T T  GE//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsONSMineProjectileGREEN extends ONSMineProjectile; D//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsONSMineProjectileGOLD extends ONSMineProjectile; T${w UZwU*&-Wm.U-w%mE*9S9D%mEw&mE*9S9D&mEw,mE*b9S9D,mEgw,mE*WO9S9D,mEwc,*c,% bWc,& bW9c,,b Wc,,bW @ {W trc,*c,SU-c,a!z/U%c,-  ( GG//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsONSMineLayer extends ONSMineLayer CacheExempt; UK //----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsONSHeadlightCornoa extends ONSHeadlightCorona; simulated function ChangeTeamTint(byte T) { if(T == 0) { LightHue = 255; LightSaturation=240; } else if(T == 1) { LightHue = 128; LightSaturation=175; } else if(T == 2) { LightHue = 80; LightSaturation=200; } else { LightHue = 37; LightSaturation=240; } } Z$L ` [$O!j kaW$W U)?fZrf* <-%oQ s)%Q sv% ZQZ sZ%VYQY sY%<7f#rf*!rf*f-Df-!f- 2gf%Rf2f&Rf2f,RfZ22f,RfY] G] //----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsONSGrenadeProjectile extends ONSGrenadeProjectile; simulated function PostNetBeginPlay() { if ( Level.NetMode != NM_DedicatedServer ) { if (Team == 0) Beacon = spawn(class'ONSGrenadeBeaconRed', self); else if (Team == 1) Beacon = spawn(class'ONSGrenadeBeaconBlue', self); else if (Team == 2) Beacon = spawn(class'OLTeamsONSGrenadeBeaconGreen', self); else if (Team == 3) Beacon = spawn(class'OLTeamsONSGrenadeBeaconGold', self); if (Beacon != None) Beacon.SetBase(self); } super(Projectile).PostNetBeginPlay(); } S//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsONSGrenadeLauncher extends ONSGrenadeLauncher CacheExempt; \$Yz@0z.Yrz* @wz ucwz  uwz w* uwzZ wZ*Z uwzY wY*Y u Gz//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsONSGrenadeFire extends ONSGrenadeFire; 8class OLTeamsONSGrenadeBeaconGreen extends Emitter; _$LJL2xL-b u uZ uY u u G7class OLTeamsONSGrenadeBeaconGold extends Emitter; ^//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsNewTransEffectGreen extends Emitter; function PostBeginPlay() { If ( Role == ROLE_Authority ) Instigator = Pawn(Owner); if ( Level.NetMode == NM_DedicatedServer ) LifeSpan = 0.15; Super.PostBeginPlay(); } simulated function PostNetBeginPlay() { local PlayerController PC; local float Dist; if ( Instigator != None ) { SetLocation(Instigator.Location); SetBase(Instigator); if ( (PlayerController(Instigator.Controller) != None) && !PlayerController(Instigator.Controller).bBehindView ) { Emitters[0].InitialParticlesPerSecond *= 0.5; Emitters[0].SphereRadiusRange.Min *= 2.4; Emitters[0].SphereRadiusRange.Max *= 2.4; Emitters[1].Disabled = true; } else if ( (Level.NetMode == NM_Standalone) || (Level.NetMode == NM_Client) ) { PC = Level.GetLocalPlayerController(); if ( (PC != None) && (PC.ViewTarget != None) ) { Dist = VSize(PC.ViewTarget.Location - Location); if ( Dist > PC.Region.Zone.DistanceFogEnd ) LifeSpan = 0.01; else if ( Dist > 8000 ) Emitters[1].Disabled = true; } } } PlaySound(Sound'WeaponSounds.P1WeaponSpawn1',SLOT_None); Super.PostNetBeginPlay(); } b$hz 3NZrN* YNp9JZ slwY*K YhrEij-w-y G]//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsNewTransEffectGold extends Emitter; function PostBeginPlay() { If ( Role == ROLE_Authority ) Instigator = Pawn(Owner); if ( Level.NetMode == NM_DedicatedServer ) LifeSpan = 0.15; Super.PostBeginPlay(); } simulated function PostNetBeginPlay() { local PlayerController PC; local float Dist; if ( Instigator != None ) { SetLocation(Instigator.Location); SetBase(Instigator); if ( (PlayerController(Instigator.Controller) != None) && !PlayerController(Instigator.Controller).bBehindView ) { Emitters[0].InitialParticlesPerSecond *= 0.5; Emitters[0].SphereRadiusRange.Min *= 2.4; Emitters[0].SphereRadiusRange.Max *= 2.4; Emitters[1].Disabled = true; } else if ( (Level.NetMode == NM_Standalone) || (Level.NetMode == NM_Client) ) { PC = Level.GetLocalPlayerController(); if ( (PC != None) && (PC.ViewTarget != None) ) { Dist = VSize(PC.ViewTarget.Location - Location); if ( Dist > PC.Region.Zone.DistanceFogEnd ) LifeSpan = 0.01; else if ( Dist > 8000 ) Emitters[1].Disabled = true; } } } PlaySound(Sound'WeaponSounds.P1WeaponSpawn1',SLOT_None); Super.PostNetBeginPlay(); } I//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsNewTransDeresGreen extends Emitter; function PostBeginPlay() { if ( Level.NetMode == NM_DedicatedServer ) LifeSpan = 0.15; else if ( Level.GetLocalPlayerController().BeyondViewDistance(Location,0) ) { LifeSpan = 0.01; return; } Super.PostBeginPlay(); } H//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsNewTransDeresGold extends Emitter; function PostBeginPlay() { if ( Level.NetMode == NM_DedicatedServer ) LifeSpan = 0.15; else if ( Level.GetLocalPlayerController().BeyondViewDistance(Location,0) ) { LifeSpan = 0.01; return; } Super.PostBeginPlay(); } R //----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsNewLinkTrail extends NewLinkTrail; var color TeamColors[4]; var color TeamColorsTwo[4]; function TeamColorAdjust(int TeamIndex) { if ( Emitters[1] != None ) { Emitters[1].ColorScale[1].Color = TeamColors[TeamIndex]; Emitters[1].ColorScale[2].Color = TeamColorsTwo[TeamIndex]; } if ( Emitters[0] != None ) { Emitters[0].ColorScale[0].Color = TeamColors[TeamIndex]; Emitters[0].ColorScale[1].Color = TeamColorsTwo[TeamIndex]; } } t//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsMonitorC extends OLTeamsMonitor; rj$m Bk$E?rp3$A^$?t//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsMonitorB extends OLTeamsMonitor; rl$l Bm$uxrp3$A^$?t//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsMonitorA extends OLTeamsMonitor; rn$k Bo$%grp3$Ae$ot ~5b Zrb * N b p9JY sewN *K N o{a]W-Q-B Gc //----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsMonitor extends xMonitor; var() Material OLTeamShader[4]; simulated function UpdateForTeam() { if(Team < 4) Skins[2] = OLTeamShader[Team]; else Skins[2] = OLTeamShader[0]; if ( (OLTeamsGameReplicationInfo(GRI) != None) && (Team < 4) && (OLTeamsGameReplicationInfo(GRI).OLTeamSymbols[Team] != None) ) Combiner(Shader(Skins[2]).SelfIllumination).Material2 = OLTeamsGameReplicationInfo(GRI).OLTeamSymbols[Team]; } L//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsLinkSparks extends LinkSparks; simulated function SetLinkStatus(int Links, bool bLinking, float ls) { mSizeRange[0] = default.mSizeRange[0] * (ls*1.0 + 1); mSizeRange[1] = default.mSizeRange[1] * (ls*1.0 + 1); mSpeedRange[0] = default.mSpeedRange[0] * (ls*0.7 + 1); mSpeedRange[1] = default.mSpeedRange[1] * (ls*0.7 + 1); mLifeRange[0] = default.mLifeRange[0] * (ls + 1); mLifeRange[1] = mLifeRange[0]; DesiredRegen = default.mRegenRange[0] * (ls + 1); } simulated function SetSparkColor(int TeamIndex) { switch(TeamIndex) { case 0: Skins[0] = Texture'OLTeamGamesTex.LinkGun.link_spark_red'; break; case 1: Skins[0] = Texture'OLTeamGamesTex.LinkGun.link_spark_blue'; break; case 2: Skins[0] = Texture'XEffectMat.Link.link_spark_green'; break; case 3: Skins[0] = Texture'XEffectMat.Link.link_spark_yellow'; break; } } }//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsLinkProjSparksRed extends LinkProjSparks; ~//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsLinkProjSparksGold extends LinkProjSparks; ~//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsLinkProjSparksBlue extends LinkProjSparks; }2//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsLinkProjectile extends LinkProjectile; var int TeamIndex; replication { unreliable if (bNetInitial && Role == ROLE_Authority) TeamIndex; } simulated function TeamAdjust() { if (TeamIndex < 4) { if ( Trail != None ) OLTeamsNewLinkTrail(Trail).TeamColorAdjust(TeamIndex); switch(TeamIndex) { // TODO Light hues on other teams case 0: Skins[0] = FinalBlend'OLTeamGamesTex.LinkGun.LinkProjRedFB'; LightHue = 0; break; case 1: Skins[0] = FinalBlend'OLTeamGamesTex.LinkGun.LinkProjBlueFB'; LightHue = 169; break; case 2: Skins[0] = FinalBlend'XEffectMat.LinkProjGreenFB'; break; case 3: Skins[0] = FinalBlend'XEffectMat.LinkProjYellowFB'; LightHue = 40; break; } } } simulated function LinkAdjust() { if (Links > 0) { MaxSpeed = default.MaxSpeed + 350*Links; } } simulated function PostNetBeginPlay() { local float dist; local PlayerController PC; Acceleration = Normal(Velocity) * 3000.0; if ( (Level.NetMode != NM_DedicatedServer) && (Level.DetailMode != DM_Low) ) Trail = Spawn(class'OLTeamsnewLinkTrail',self); if ( (Trail != None) && (Instigator != None) && Instigator.IsLocallyControlled() ) { if ( Role == ROLE_Authority ) Trail.Delay(0.1); else { dist = VSize(Location - Instigator.Location); if ( dist < 100 ) Trail.Delay(0.1 - dist/1000); } } if (Role < ROLE_Authority) { LinkAdjust(); TeamAdjust(); } if ( Level.NetMode == NM_DedicatedServer ) return; if ( Level.bDropDetail || (Level.DetailMode == DM_Low) ) { bDynamicLight = false; LightType = LT_None; } else { PC = Level.GetLocalPlayerController(); if ( (PC == None) || (Instigator == None) || (PC != Instigator.Controller) ) { bDynamicLight = false; LightType = LT_None; } } } simulated function Explode(vector HitLocation, vector HitNormal) { if ( EffectIsRelevant(Location,false) ) { switch(TeamIndex) { case 0: Spawn(class'OLTeamsLinkProjSparksRed',,, HitLocation, rotator(HitNormal)); break; case 1: Spawn(class'OLTeamsLinkProjSparksBlue',,, HitLocation, rotator(HitNormal)); break; case 2: Spawn(class'LinkProjSparks',,, HitLocation, rotator(HitNormal)); break; case 3: Spawn(class'OLTeamsLinkProjSparksGold',,, HitLocation, rotator(HitNormal)); break; } } PlaySound(Sound'WeaponSounds.BioRifle.BioRifleGoo2'); Destroy(); } //----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsLinkGun extends LinkGun CacheExempt; simulated event RenderOverlays( Canvas Canvas ) { /* if ( (FireMode[1] != None) && !FireMode[1].bIsFiring && (ThirdPersonActor != None) ) { if ( Links > 0 ) LinkAttachment(ThirdPersonActor).SetLinkColor( LC_Gold ); else LinkAttachment(ThirdPersonActor).SetLinkColor( LC_Green ); } */ switch(Instigator.PlayerReplicationInfo.Team.TeamIndex) { case 0: LinkAttachment(ThirdPersonActor).SetLinkColor( LC_Red ); break; case 1: LinkAttachment(ThirdPersonActor).SetLinkColor( LC_Blue ); break; case 2: LinkAttachment(ThirdPersonActor).SetLinkColor( LC_Green ); break; case 3: LinkAttachment(ThirdPersonActor).SetLinkColor( LC_Gold ); break; default: LinkAttachment(ThirdPersonActor).SetLinkColor( LC_Green ); break; } super(Weapon).RenderOverlays( Canvas ); } t//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsLinkFire extends LinkFire; simulated function ModeTick(float dt) { local Vector StartTrace, EndTrace, V, X, Y, Z; local Vector HitLocation, HitNormal, EndEffect; local Actor Other; local Rotator Aim; local LinkGun LinkGun; local float Step, ls; local bot B; local bool bShouldStop, bIsHealingObjective; local int AdjustedDamage; local LinkBeamEffect LB; local DestroyableObjective HealObjective; local Vehicle LinkedVehicle; if ( !bIsFiring ) { bInitAimError = true; return; } LinkGun = LinkGun(Weapon); if ( LinkGun.Links < 0 ) { log("warning:"@Instigator@"linkgun had"@LinkGun.Links@"links"); LinkGun.Links = 0; } ls = LinkScale[Min(LinkGun.Links,5)]; if ( myHasAmmo(LinkGun) && ((UpTime > 0.0) || (Instigator.Role < ROLE_Authority)) ) { UpTime -= dt; // the to-hit trace always starts right in front of the eye LinkGun.GetViewAxes(X, Y, Z); StartTrace = GetFireStart( X, Y, Z); TraceRange = default.TraceRange + LinkGun.Links*250; if ( Instigator.Role < ROLE_Authority ) { if ( Beam == None ) ForEach Weapon.DynamicActors(class'LinkBeamEffect', LB ) if ( !LB.bDeleteMe && (LB.Instigator != None) && (LB.Instigator == Instigator) ) { Beam = LB; break; } if ( Beam != None ) LockedPawn = Beam.LinkedPawn; } if ( LockedPawn != None ) TraceRange *= 1.5; if ( Instigator.Role == ROLE_Authority ) { if ( bDoHit ) LinkGun.ConsumeAmmo(ThisModeNum, AmmoPerFire); B = Bot(Instigator.Controller); if ( (B != None) && (PlayerController(B.Squad.SquadLeader) != None) && (B.Squad.SquadLeader.Pawn != None) ) { if ( IsLinkable(B.Squad.SquadLeader.Pawn) && (B.Squad.SquadLeader.Pawn.Weapon != None && B.Squad.SquadLeader.Pawn.Weapon.GetFireMode(1).bIsFiring) && (VSize(B.Squad.SquadLeader.Pawn.Location - StartTrace) < TraceRange) ) { Other = Weapon.Trace(HitLocation, HitNormal, B.Squad.SquadLeader.Pawn.Location, StartTrace, true); if ( Other == B.Squad.SquadLeader.Pawn ) { B.Focus = B.Squad.SquadLeader.Pawn; if ( B.Focus != LockedPawn ) SetLinkTo(B.Squad.SquadLeader.Pawn); B.SetRotation(Rotator(B.Focus.Location - StartTrace)); X = Normal(B.Focus.Location - StartTrace); } else if ( B.Focus == B.Squad.SquadLeader.Pawn ) bShouldStop = true; } else if ( B.Focus == B.Squad.SquadLeader.Pawn ) bShouldStop = true; } } if ( LockedPawn != None ) { EndTrace = LockedPawn.Location + LockedPawn.BaseEyeHeight*Vect(0,0,0.5); // beam ends at approx gun height if ( Instigator.Role == ROLE_Authority ) { V = Normal(EndTrace - StartTrace); if ( (V dot X < LinkFlexibility) || LockedPawn.Health <= 0 || LockedPawn.bDeleteMe || (VSize(EndTrace - StartTrace) > 1.5 * TraceRange) ) { SetLinkTo( None ); } } } if ( LockedPawn == None ) { if ( Bot(Instigator.Controller) != None ) { if ( bInitAimError ) { CurrentAimError = AdjustAim(StartTrace, AimError); bInitAimError = false; } else { BoundError(); CurrentAimError.Yaw = CurrentAimError.Yaw + Instigator.Rotation.Yaw; } // smooth aim error changes Step = 7500.0 * dt; if ( DesiredAimError.Yaw ClockWiseFrom CurrentAimError.Yaw ) { CurrentAimError.Yaw += Step; if ( !(DesiredAimError.Yaw ClockWiseFrom CurrentAimError.Yaw) ) { CurrentAimError.Yaw = DesiredAimError.Yaw; DesiredAimError = AdjustAim(StartTrace, AimError); } } else { CurrentAimError.Yaw -= Step; if ( DesiredAimError.Yaw ClockWiseFrom CurrentAimError.Yaw ) { CurrentAimError.Yaw = DesiredAimError.Yaw; DesiredAimError = AdjustAim(StartTrace, AimError); } } CurrentAimError.Yaw = CurrentAimError.Yaw - Instigator.Rotation.Yaw; if ( BoundError() ) DesiredAimError = AdjustAim(StartTrace, AimError); CurrentAimError.Yaw = CurrentAimError.Yaw + Instigator.Rotation.Yaw; if ( Instigator.Controller.Target == None ) Aim = Rotator(Instigator.Controller.FocalPoint - StartTrace); else Aim = Rotator(Instigator.Controller.Target.Location - StartTrace); Aim.Yaw = CurrentAimError.Yaw; // save difference CurrentAimError.Yaw = CurrentAimError.Yaw - Instigator.Rotation.Yaw; } else Aim = GetPlayerAim(StartTrace, AimError); X = Vector(Aim); EndTrace = StartTrace + TraceRange * X; } Other = Weapon.Trace(HitLocation, HitNormal, EndTrace, StartTrace, true); if ( Other != None && Other != Instigator ) EndEffect = HitLocation; else EndEffect = EndTrace; if ( Beam != None ) Beam.EndEffect = EndEffect; if ( Instigator.Role < ROLE_Authority ) { if ( LinkGun.ThirdPersonActor != None ) { if ( LinkGun.Linking || ((Other != None) && (Instigator.PlayerReplicationInfo.Team != None) && Other.TeamLink(Instigator.PlayerReplicationInfo.Team.TeamIndex)) ) { if (Instigator.PlayerReplicationInfo.Team == None || Instigator.PlayerReplicationInfo.Team.TeamIndex == 0) LinkAttachment(LinkGun.ThirdPersonActor).SetLinkColor( LC_Red ); else LinkAttachment(LinkGun.ThirdPersonActor).SetLinkColor( LC_Blue ); } else { if ( LinkGun.Links > 0 ) LinkAttachment(LinkGun.ThirdPersonActor).SetLinkColor( LC_Gold ); else LinkAttachment(LinkGun.ThirdPersonActor).SetLinkColor( LC_Green ); } } return; } if ( Other != None && Other != Instigator ) { // target can be linked to if ( IsLinkable(Other) ) { if ( Other != lockedpawn ) SetLinkTo( Pawn(Other) ); if ( lockedpawn != None ) LinkBreakTime = LinkBreakDelay; } else { // stop linking if ( lockedpawn != None ) { if ( LinkBreakTime <= 0.0 ) SetLinkTo( None ); else LinkBreakTime -= dt; } // beam is updated every frame, but damage is only done based on the firing rate if ( bDoHit ) { if ( Beam != None ) Beam.bLockedOn = false; Instigator.MakeNoise(1.0); AdjustedDamage = AdjustLinkDamage( LinkGun, Other, Damage ); if ( !Other.bWorldGeometry ) { if ( Level.Game.bTeamGame && Pawn(Other) != None && Pawn(Other).PlayerReplicationInfo != None && Pawn(Other).PlayerReplicationInfo.Team == Instigator.PlayerReplicationInfo.Team) // so even if friendly fire is on you can't hurt teammates AdjustedDamage = 0; HealObjective = DestroyableObjective(Other); if ( HealObjective == None ) HealObjective = DestroyableObjective(Other.Owner); if ( HealObjective != None && HealObjective.TeamLink(Instigator.GetTeamNum()) ) { SetLinkTo(None); bIsHealingObjective = true; if (!HealObjective.HealDamage(AdjustedDamage, Instigator.Controller, DamageType)) LinkGun.ConsumeAmmo(ThisModeNum, -AmmoPerFire); } else Other.TakeDamage(AdjustedDamage, Instigator, HitLocation, MomentumTransfer*X, DamageType); if ( Beam != None ) Beam.bLockedOn = true; } } } } // vehicle healing LinkedVehicle = Vehicle(LockedPawn); if ( LinkedVehicle != None && bDoHit ) { AdjustedDamage = Damage * (1.5*Linkgun.Links+1) * Instigator.DamageScaling; if (Instigator.HasUDamage()) AdjustedDamage *= 2; if (!LinkedVehicle.HealDamage(AdjustedDamage, Instigator.Controller, DamageType)) LinkGun.ConsumeAmmo(ThisModeNum, -AmmoPerFire); } LinkGun(Weapon).Linking = (LockedPawn != None) || bIsHealingObjective; if ( bShouldStop ) B.StopFiring(); else { // beam effect is created and destroyed when firing starts and stops if ( (Beam == None) && bIsFiring ) { Beam = Weapon.Spawn( BeamEffectClass, Instigator ); OLTeamsLinkBeamEffect(Beam).TeamIndex = Weapon.Instigator.PlayerReplicationInfo.Team.TeamIndex; OLTeamsLinkBeamEffect(Beam).SetTeamEffects(); // vary link volume to make sure it gets replicated (in case owning player changed it client side) if ( SentLinkVolume == Default.LinkVolume ) SentLinkVolume = Default.LinkVolume + 1; else SentLinkVolume = Default.LinkVolume; } if ( Beam != None ) { switch(Weapon.Instigator.PlayerReplicationInfo.Team.TeamIndex) { case 0: LinkAttachment(LinkGun.ThirdPersonActor).SetLinkColor( LC_Red ); break; case 1: LinkAttachment(LinkGun.ThirdPersonActor).SetLinkColor( LC_Blue ); break; case 2: LinkAttachment(LinkGun.ThirdPersonActor).SetLinkColor( LC_Green ); break; case 3: LinkAttachment(LinkGun.ThirdPersonActor).SetLinkColor( LC_Gold ); break; } if ( LinkGun.Linking || ((Other != None) && (Instigator.PlayerReplicationInfo.Team != None) && Other.TeamLink(Instigator.PlayerReplicationInfo.Team.TeamIndex)) ) Beam.LinkColor = Instigator.PlayerReplicationInfo.Team.TeamIndex + 1; else Beam.LinkColor = 0; Beam.Links = LinkGun.Links; Instigator.AmbientSound = BeamSounds[Min(Beam.Links,3)]; Instigator.SoundVolume = SentLinkVolume; Beam.LinkedPawn = LockedPawn; Beam.bHitSomething = (Other != None); Beam.EndEffect = EndEffect; } } } else StopFiring(); bStartFire = false; bDoHit = false; } simulated function FlashMuzzleFlash() { if (FlashEmitter != None) { switch(Weapon.Instigator.PlayerReplicationInfo.Team.TeamIndex) { case 0 : FlashEmitter.Skins[0] = Texture'XEffectMat.link_muz_red'; break; case 1 : FlashEmitter.Skins[0] = Texture'XEffectMat.link_muz_blue'; break; case 2 : FlashEmitter.Skins[0] = Texture'XEffectMat.link_muz_green'; break; case 3 : FlashEmitter.Skins[0] = Texture'XEffectMat.link_muz_yellow'; break; } } Super(WeaponFire).FlashMuzzleFlash(); } simulated function UpdateLinkColor( LinkAttachment.ELinkColor color ) { // Don't do anything - the beam should always be team colored, no matter what the link status is. } Rr//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsLinkBeamEffect extends LinkBeamEffect; var byte TeamIndex; replication { unreliable if (bNetInitial && Role == ROLE_Authority) TeamIndex; } // Copy of Super.Tick but with all the coloring taken out. simulated function Tick(float dt) { local float LocDiff, RotDiff, WiggleMe,ls; local int c, n; local Vector BeamDir, HitLocation, HitNormal; local actor HitActor; local PlayerController P; if ( Role == ROLE_Authority && (Instigator == None || Instigator.Controller == None) ) { Destroy(); return; } // set beam start location SetBeamLocation(); BeamDir = SetBeamRotation(); if ( (Instigator != None) && !Instigator.IsFirstPerson() ) { if ( MuzFlash == None ) MuzFlash = Spawn(class'LinkMuzFlashBeam3rd', self); } else if ( MuzFlash != None ) MuzFlash.Destroy(); SetTeamEffects(); if ( Sparks == None && EffectIsRelevant(EndEffect, false) ) { P = Level.GetLocalPlayerController(); if ( (P == Instigator.Controller) || CheckMaxEffectDistance(P, Location) ) Sparks = Spawn(class'OLTeamsLinkSparks', self); if(Sparks != none) { OLTeamsLinkSparks(Sparks).SetSparkColor(TeamIndex); Sparks.bHidden = (LinkedPawn != none); Sparks.LightHue = LightHue; Sparks.LightBrightness = LightBrightness; Sparks.LightRadius = LightRadius - 3; } } ls = class'LinkFire'.default.LinkScale[Min(Links,5)]; if ( Links != OldLinks || LinkColor != OldLinkColor || MuzFlash != OldMuzFlash ) { // beam size mSizeRange[0] = default.mSizeRange[0] * (ls*0.6 + 1); mWaveShift = default.mWaveShift * (ls*0.6 + 1); // create/destroy children NumChildren = Min(Links+1, MAX_CHILDREN); for (c=0; c 0), ls); } if ( LinkColor > 0 && LinkedPawn != None ) { if (ProtSphere == None) { ProtSphere = Spawn(class'LinkProtSphere'); if (LinkColor == 2) ProtSphere.Skins[0] = Texture'XEffectMat.link_muz_blue'; } } OldLinks = Links; OldLinkColor = LinkColor; OldMuzFlash = MuzFlash; } if ( Level.bDropDetail || Level.DetailMode == DM_Low ) { bDynamicLight = false; LightType = LT_None; } else if ( bDynamicLight ) LightType = LT_Steady; if ( LinkedPawn != None ) { EndEffect = LinkedPawn.Location + LinkedPawn.EyeHeight*Vect(0,0,0.5) - BeamDir*30.0; } mSpawnVecA = EndEffect; mWaveLockEnd = bLockedOn || (LinkColor > 0); // magic wiggle code if ( bLockedOn || (LinkColor > 0) ) { mWaveAmplitude = FMax(0.0, mWaveAmplitude - (mWaveAmplitude+5)*4.0*dt); } else { LocDiff = VSize((Location - PrevLoc) * Vect(1,1,5)); RotDiff = VSize(Vector(Rotation) - Vector(PrevRot)); WiggleMe = FMax(LocDiff*0.02, RotDiff*4.0); mWaveAmplitude = FMax(1.0, mWaveAmplitude - mWaveAmplitude*1.0*dt); mWaveAmplitude = FMin(16.0, mWaveAmplitude + WiggleMe); } PrevLoc = Location; PrevRot = Rotation; for (c=0; c 0); //mWaveLockEnd; Child[c].Skins[0] = Skins[0]; } } if ( Sparks != None ) { Sparks.SetLocation( EndEffect - BeamDir*10.0 ); if ( bHitSomething ) Sparks.SetRotation( Rotation); else Sparks.SetRotation( Rotator(-BeamDir) ); Sparks.mRegenRange[0] = Sparks.DesiredRegen; Sparks.mRegenRange[1] = Sparks.DesiredRegen; Sparks.bDynamicLight = true; } if ( LinkColor > 0 && LinkedPawn != None ) { if ( ProtSphere != None ) { ProtSphere.SetLocation( EndEffect ); ProtSphere.SetRotation( Rotation ); ProtSphere.bHidden = false; if ( LinkedPawn.IsFirstPerson() ) ProtSphere.mSizeRange[0] = 20.0; else ProtSphere.mSizeRange[0] = 35.0; ProtSphere.mSizeRange[1] = ProtSphere.mSizeRange[0]; } } else { if ( ProtSphere != None ) ProtSphere.bHidden = true; } if ( bHitSomething && (Level.NetMode != NM_DedicatedServer) && (Level.TimeSeconds - ScorchTime > 0.07) ) { ScorchTime = Level.TimeSeconds; HitActor = Trace(HitLocation, HitNormal, EndEffect + 100*BeamDir, EndEffect - 100*BeamDir, true); if ( (HitActor != None) && HitActor.bWorldGeometry ) spawn(class'LinkScorch',,,HitLocation,rotator(-HitNormal)); } } simulated function SetTeamEffects() { switch(TeamIndex) { case 0: Skins[0] = FinalBlend'XEffectMat.LinkBeamRedFB'; if ( MuzFlash != None ) MuzFlash.Skins[0] = Texture'XEffectMat.link_muz_red'; LightHue = 0; break; case 1: Skins[0] = FinalBlend'XEffectMat.LinkBeamBlueFB'; if ( MuzFlash != None ) MuzFlash.Skins[0] = Texture'XEffectMat.link_muz_blue'; LightHue = 160; break; case 2: Skins[0] = FinalBlend'XEffectMat.LinkBeamGreenFB'; if ( MuzFlash != None ) MuzFlash.Skins[0] = Texture'XEffectMat.link_muz_green'; LightHue = 100; break; case 3: Skins[0] = FinalBlend'XEffectMat.LinkBeamYellowFB'; if ( MuzFlash != None ) MuzFlash.Skins[0] = Texture'XEffectMat.link_muz_yellow'; LightHue = 40; break; } } `"//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsLinkAttachment extends LinkAttachment; simulated function UpdateLinkColor() { if ( Instigator != None && Instigator.Weapon != None ) LinkGun(Instigator.Weapon).UpdateLinkColor( LinkColor ); if ( MuzFlash != None ) { switch ( LinkColor ) { case LC_Red : MuzFlash.Skins[0] = FinalBlend'OLTeamGamesTex.LinkGun.LinkMuzProjRedFB'; break; case LC_Blue : MuzFlash.Skins[0] = FinalBlend'OLTeamGamesTex.LinkGun.LinkMuzProjBlueFB'; break; case LC_Gold : MuzFlash.Skins[0] = FinalBlend'XEffectMat.LinkMuzProjYellowFB'; break; case LC_Green : default : MuzFlash.Skins[0] = FinalBlend'XEffectMat.LinkMuzProjGreenFB'; break; } } } simulated event ThirdPersonEffects() { local Rotator R; if ( Level.NetMode != NM_DedicatedServer && FlashCount > 0 ) { if (FiringMode == 0) { if (MuzFlash == None) { MuzFlash = Spawn(class'LinkMuzFlashProj3rd'); AttachToBone(MuzFlash, 'tip'); UpdateLinkColor(); } if (MuzFlash != None) { MuzFlash.mSizeRange[0] = MuzFlash.default.mSizeRange[0] * (class'LinkFire'.default.LinkScale[Min(Links,5)]+1); // (1.0 + 0.3*float(Links)); MuzFlash.mSizeRange[1] = MuzFlash.mSizeRange[0]; switch (Instigator.PlayerReplicationInfo.Team.TeamIndex) { case 0 : SetLinkColor( LC_Red ); break; case 1 : SetLinkColor( LC_Blue ); break; case 2 : SetLinkColor( LC_Green ); break; case 3 : SetLinkColor( LC_Gold ); break; } MuzFlash.Trigger(self, None); R.Roll = Rand(65536); SetBoneRotation('bone flashA', R, 0, 1.0); } } } super(xWeaponAttachment).ThirdPersonEffects(); } p$|$X {6y    Y Y K K ( G}${$$o8_ Zr_ *(P c,B._ P B)&R P &R %c,Vpchangeteam 9SR j' G@%_ \//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsLinkAltFire extends LinkAltFire; function Projectile SpawnProjectile(Vector Start, Rotator Dir) { local OLTeamsLinkProjectile Proj; Start += Vector(Dir) * 10.0 * LinkGun(Weapon).Links; Proj = OLTeamsLinkProjectile(Weapon.Spawn(ProjectileClass,,, Start, Dir)); if ( Proj != None ) { Proj.Links = LinkGun(Weapon).Links; Proj.TeamIndex = Weapon.Instigator.PlayerReplicationInfo.Team.TeamIndex; Proj.LinkAdjust(); Proj.TeamAdjust(); } return Proj; } function FlashMuzzleFlash() { if (FlashEmitter != None) { switch(Weapon.Instigator.PlayerReplicationInfo.Team.TeamIndex) { case 0: FlashEmitter.Skins[0] = FinalBlend'OLTeamGamesTex.LinkGun.LinkMuzProjRedFB'; break; case 1: FlashEmitter.Skins[0] = FinalBlend'OLTeamGamesTex.LinkGun.LinkMuzProjBlueFB'; break; case 2: FlashEmitter.Skins[0] = FinalBlend'XEffectMat.LinkMuzProjGreenFB'; break; case 3: FlashEmitter.Skins[0] = FinalBlend'XEffectMat.LinkMuzProjYellowFB'; break; } } Super(ProjectileFire).FlashMuzzleFlash(); } b//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsLastSecondMessage extends CriticalEventPlus; var(Message) localized string LastSecondRed, LastSecondBlue, LastSecondGreen, LastSecondGold; static simulated function ClientReceive( PlayerController P, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { Super.ClientReceive(P, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject); if ( Switch == 1 ) P.PlayRewardAnnouncement('Denied',1, true); else P.PlayStatusAnnouncement('Last_Second_Save',1, true); } static function string GetString( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { if ( TeamInfo(OptionalObject) == None ) return ""; if ( TeamInfo(OptionalObject).TeamIndex == 0 ) return Default.LastSecondRed; else if ( TeamInfo(OptionalObject).TeamIndex == 1 ) return Default.LastSecondBlue; else if ( TeamInfo(OptionalObject).TeamIndex == 2 ) return Default.LastSecondGreen; else if ( TeamInfo(OptionalObject).TeamIndex == 3 ) return Default.LastSecondGold; return ""; } A//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsKillerMessagePlus extends xKillerMessagePlus; [//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsGUITab_PlayerLoginControls extends UT2K4Tab_PlayerLoginControls; var automated GUISectionBackground sb_Green,sb_Gold; var automated GUIImage i_JoinGreen, i_JoinGold; var automated GUIListBox lb_Green, lb_Gold; var GUIList li_Green, li_Gold; var localized string GreenTeam,GoldTeam; function InitComponent(GUIController MyController, GUIComponent MyOwner) { local string s; local int i; local eFontScale FS; Super.InitComponent(MyController, MyOwner); li_Red = lb_Red.List; li_Blue = lb_Blue.List; li_Green = lb_Green.List; li_Gold = lb_Gold.List; li_FFA = lb_FFA.List; s = GetSizingCaption(); for ( i = 0; i < Controls.Length; i++ ) { if ( GUIButton(Controls[i]) != None && Controls[i]!=b_Team) { GUIButton(Controls[i]).bAutoSize = True; GUIButton(Controls[i]).SizingCaption = s; GUIButton(Controls[i]).AutoSizePadding.HorzPerc = 0.04; GUIButton(Controls[i]).AutoSizePadding.VertPerc = 0.5; } } PlayerStyle = MyController.GetStyle(PlayerStyleName,fs); sb_Red.Managecomponent(lb_Red); sb_Blue.ManageComponent(lb_Blue); sb_Green.ManageComponent(lb_Green); sb_Gold.ManageComponent(lb_Gold); sb_FFA.ManageComponent(lb_FFA); } function bool ButtonClicked(GUIComponent Sender) { local PlayerController PC; PC = PlayerOwner(); if (Sender == i_JoinRed) { //Join Red team if ( PC.PlayerReplicationInfo == None || PC.PlayerReplicationInfo.Team == None || PC.PlayerReplicationInfo.Team.TeamIndex != 0) PC.ChangeTeam(0); Controller.CloseMenu(false); } else if (Sender == i_JoinBlue) { //Join Blue team if ( PC.PlayerReplicationInfo == None || PC.PlayerReplicationInfo.Team == None || PC.PlayerReplicationInfo.Team.TeamIndex != 1) PC.ChangeTeam(1); Controller.CloseMenu(false); } else if (Sender == b_Settings) { //Settings Controller.OpenMenu("OLTeamGames.OLTeams2K4SettingsPage"); } else if (Sender == b_Browser) { //Server browser Controller.OpenMenu(Controller.GetServerBrowserPage()); } else if (Sender == b_Leave) { //Forfeit/Disconnect Controller.CloseMenu(); if ( PC.Level.Game.CurrentGameProfile != None ) PC.Level.Game.CurrentGameProfile.ContinueSinglePlayerGame(PC.Level, true); else PC.ConsoleCommand( "DISCONNECT" ); } else if (Sender == b_Favs) { //Add this server to favorites PC.ConsoleCommand( "ADDCURRENTTOFAVORITES" ); b_Favs.MenuStateChange(MSAT_Disabled); } else if (Sender == b_Quit) { //Quit game Controller.OpenMenu(Controller.GetQuitPage()); } else if (Sender == b_MapVote) { //Map voting Controller.OpenMenu(Controller.MapVotingMenu); } else if (Sender == b_KickVote) { //Kick voting Controller.OpenMenu(Controller.KickVotingMenu); } else if (Sender == b_MatchSetup) { //Match setup Controller.OpenMenu(Controller.MatchSetupMenu); } else if (Sender == b_Spec) { Controller.CloseMenu(); //Spectate/rejoin if (PC.PlayerReplicationInfo.bOnlySpectator) PC.BecomeActivePlayer(); else PC.BecomeSpectator(); } return true; } function InitializePlayerLists() { local int i; local GameReplicationInfo GRI; GRI = GetGRI(); if ( GRI == None ) return; if ( bTeamGame ) { li_Red.bNotify = False; li_Blue.bNotify = False; li_Green.bNotify = False; li_Gold.bNotify = False; li_Red.Clear(); li_Blue.Clear(); li_Green.Clear(); li_Gold.Clear(); li_Red.bNotify = True; li_Blue.bNotify = True; li_Green.bNotify = True; li_Gold.bNotify = True; for ( i = 0; i < GRI.PRIArray.Length; i++ ) { if ( GRI.PRIArray[i] == None || GRI.PRIArray[i].Team == None || GRI.PRIArray[i].bOnlySpectator || (GRI.PRIArray[i].bIsSpectator && !GRI.PRIArray[i].bWaitingPlayer) ) continue; if ( GRI.PRIArray[i].Team.TeamIndex == 0 ) li_Red.Add(GRI.PRIArray[i].PlayerName,none,""$GRI.PRIArray[i].PlayerID); else if ( GRI.PRIArray[i].Team.TeamIndex == 1 ) li_Blue.Add(GRI.PRIArray[i].PlayerName,none,""$GRI.PRIArray[i].PlayerID); else if ( GRI.PRIArray[i].Team.TeamIndex == 2 ) li_Green.Add(GRI.PRIArray[i].PlayerName,none,""$GRI.PRIArray[i].PlayerID); else if ( GRI.PRIArray[i].Team.TeamIndex == 3 ) li_Gold.Add(GRI.PRIArray[i].PlayerName,none,""$GRI.PRIArray[i].PlayerID); } } } function InitLists() { local GameReplicationInfo GRI; local OLTeamsGameReplicationInfo OLGRI; GRI = GetGRI(); if ( GRI == None ) return; OLGRI = OLTeamsGameReplicationInfo(GRI); if (bTeamGame) { i_JoinRed.Image = OLGRI.OLTeamSymbols[0]; i_JoinBlue.Image = OLGRI.OLTeamSymbols[1]; i_JoinGreen.Image = OLGRI.OLTeamSymbols[2]; i_JoinGold.Image = OLGRI.OLTeamSymbols[3]; li_Red.OnDrawItem = OnDrawRedPlayer; li_Red.OnChange = ListChange; li_Red.GetItemHeight = ItemHeight; li_Blue.OnDrawItem = OnDrawBluePlayer; li_Blue.OnChange = ListChange; li_Blue.GetItemHeight = ItemHeight; li_Green.OnDrawItem = OnDrawGreenPlayer; li_Green.OnChange = ListChange; li_Green.GetItemHeight = ItemHeight; li_Gold.OnDrawItem = OnDrawGoldPlayer; li_Gold.OnChange = ListChange; li_Gold.GetItemHeight = ItemHeight; } SetupGroups(); InitializePlayerLists(); } function SetupGroups() { local int i; local PlayerController PC; PC = PlayerOwner(); if ( bTeamGame ) { RemoveComponent(lb_FFA, True); RemoveComponent(sb_FFA, true); if ( (PC.GameReplicationInfo != None) && PC.GameReplicationInfo.bNoTeamChanges ) RemoveComponent(b_Team,true); lb_FFA = None; } else { for ( i = 0; i < Controls.Length; i++ ) RemoveComponent(Controls[i], True); } if ( PC.Level.NetMode != NM_Client ) { RemoveComponent(b_Favs); RemoveComponent(b_Browser); } else if ( CurrentServerIsInFavorites() ) DisableComponent(b_Favs); if ( PC.Level.NetMode == NM_StandAlone ) { RemoveComponent(b_MapVote,True); RemoveComponent(b_MatchSetup,True); RemoveComponent(b_KickVote,True); } else if ( PC.VoteReplicationInfo != None ) { if ( !PC.VoteReplicationInfo.MapVoteEnabled() ) RemoveComponent(b_MapVote,True); if ( !PC.VoteReplicationInfo.KickVoteEnabled() ) RemoveComponent(b_KickVote); if ( !PC.VoteReplicationInfo.MatchSetupEnabled() ) RemoveComponent(b_MatchSetup); } else { RemoveComponent(b_MapVote); RemoveComponent(b_KickVote); RemoveComponent(b_MatchSetup); } RemapComponents(); } function bool InternalOnPreDraw(Canvas C) { local GameReplicationInfo GRI; local OLTeamsGameReplicationInfo OLGRI; GRI = GetGRI(); if (GRI != None) { if (bInit) InitGRI(); OLGRI = OLTeamsGameReplicationInfo(GRI); if ( bTeamGame ) { if ( OLGRI.OLTeams[0] != None ) sb_Red.Caption = RedTeam@string(int(OLGRI.OLTeams[0].Score)); if ( OLGRI.OLTeams[1] != None ) sb_Blue.Caption = BlueTeam@string(int(OLGRI.OLTeams[1].Score)); if ( OLGRI.OLTeams[2] != None ) sb_Green.Caption = GreenTeam@string(int(OLGRI.OLTeams[2].Score)); if ( OLGRI.OLTeams[3] != None ) sb_Gold.Caption = GoldTeam@string(int(OLGRI.OLTeams[3].Score)); if (PlayerOwner().PlayerReplicationInfo.Team != None) { if (PlayerOwner().PlayerReplicationInfo.Team.TeamIndex == 0) { sb_Red.HeaderBase = texture'Display95'; sb_Blue.HeaderBase = sb_blue.default.headerbase; sb_Green.HeaderBase = sb_blue.default.headerbase; sb_Gold.HeaderBase = sb_blue.default.headerbase; } else if (PlayerOwner().PlayerReplicationInfo.Team.TeamIndex == 1) { sb_Red.HeaderBase = sb_blue.default.headerbase; sb_Blue.HeaderBase = texture'Display95'; sb_Green.HeaderBase = sb_blue.default.headerbase; sb_Gold.HeaderBase = sb_blue.default.headerbase; } else if (PlayerOwner().PlayerReplicationInfo.Team.TeamIndex == 2) { sb_Red.HeaderBase = sb_blue.default.headerbase; sb_Blue.HeaderBase = sb_blue.default.headerbase; sb_Green.HeaderBase = texture'Display95'; sb_Gold.HeaderBase = sb_blue.default.headerbase; } else if (PlayerOwner().PlayerReplicationInfo.Team.TeamIndex == 3) { sb_Red.HeaderBase = sb_blue.default.headerbase; sb_Blue.HeaderBase = sb_blue.default.headerbase; sb_Green.HeaderBase = sb_blue.default.headerbase; sb_Gold.HeaderBase = texture'Display95'; } } } SetButtonPositions(C); UpdatePlayerLists(); if ( ((PlayerOwner().myHUD == None) || !PlayerOwner().myHUD.IsInCinematic()) && GRI.bMatchHasBegun && !PlayerOwner().IsInState('GameEnded') && (GRI.MaxLives <= 0 || !PlayerOwner().PlayerReplicationInfo.bOnlySpectator) ) EnableComponent(b_Spec); else DisableComponent(b_Spec); } return false; } protected function UpdatePlayerLists() { local int i; local GameReplicationInfo GRI; GRI = GetGRI(); if ( GRI == None ) return; if ( bTeamGame ) { i=0; while (iIJ3}>ʒIJIJIJ ZZZZZZZZZIJYY8IJIJ&&&&&    ZhhhhhRrH~ h'} i'E p'H q'| l'{ m'M ] Green Team:P = Gold Team:P RU t [ n'` o'G fF dz//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsGreenWhisp extends OLTeamsWillowWhisp; EF%t @G%C)Et[N$ANAO*((O(({"F"Y zE //----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsGreenShockBeamEffect extends ShockBeamEffect; simulated function SpawnImpactEffects(rotator HitRot, vector EffectLoc) { Spawn(class'OLTeamsShockImpactFlareGreen',,, EffectLoc, HitRot); Spawn(class'OLTeamsShockImpactRingGreen',,, EffectLoc, HitRot); Spawn(class'OLTeamsShockImpactScorchGreen',,, EffectLoc, Rotator(-HitNormal)); Spawn(class'OLTeamsShockExplosionCoreGreen',,, EffectLoc+HitNormal*8, HitRot); } t//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsGreenBeacon extends TransBeacon; y//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsGoldWhisp extends OLTeamsWillowWhisp; {dp +d\ -'- 'E DuE DtEDv x x -'- 'E DuE DtEDv x x_I _-'_- 'E_ DuE_ DtE_Dv_ x_ x\Q \-'\- 'E\ DuE\ DtE\Dv\ x\ x x xE DA `% E  E { EI s EQ  E GEJ%p @L%WWEt[N$ANAO*(O({"F"Y z@ //----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsGoldShockBeamEffect extends ShockBeamEffect; simulated function SpawnImpactEffects(rotator HitRot, vector EffectLoc) { Spawn(class'OLTeamsShockImpactFlareGold',,, EffectLoc, HitRot); Spawn(class'OLTeamsShockImpactRingGold',,, EffectLoc, HitRot); Spawn(class'OLTeamsShockImpactScorchGold',,, EffectLoc, Rotator(-HitNormal)); Spawn(class'OLTeamsShockExplosionCoreGold',,, EffectLoc+HitNormal*8, HitRot); } K%S{H4--SLL_L\L5-qOLTeamGames.OLTeamRedConfigured Iwq*q ps?%I?7s %? 75|6 ?s$m6   ?qOLTeamGames.OLTeamBlueConfigured Awq*q ps?%A?7s %7 7-|6 ?s$m6   ?qOLTeamGames.OLTeamGreenConfigured :wq*q ps?%:?7s %0 7&|6 ?s_$m6   ?qOLTeamGames.OLTeamGoldConfigured 2wq*q ps?%2?7s %( 7|6 ?s\$m6   ?%qXGame.DMRosterConfigured %wq*q ps?%%?7s % 7|6 ?s$m6   ?C - Gs//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsGoldBeacon extends TransBeacon; {6//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsGameReplicationInfo extends GameReplicationInfo; var TeamInfo OLTeams[4]; var() texture OLTeamSymbols[4]; var int NumTeams; var EFlagState OLFlagState[4]; var PlayerReplicationInfo OLFlagHolder[4]; var TeamInfo DesignationTarget[4]; var vector OLFlagPos[4]; // replicated 2d location of the flags var byte TeamEliminated[4]; var bool bDistribution; var bool bDesignation; var bool bSimon; var bool bCanSeeFlagLocation; var bool bCarryFlagBack; var bool bFlagElimination; struct DistributionArrayStruct { var int ScoresNeeded[4]; }; var DistributionArrayStruct DistributionArray[4]; struct SuccessfulScoresStruct { var int SuccessfulScores[4]; }; var SuccessfulScoresStruct SuccessfulScoresArray[4]; // How many of each team's flag each team has captured. Used for AI. replication { reliable if ( bNetDirty && (Role == ROLE_Authority) ) OLTeams, OLFlagHolder, OLFlagState; reliable if ( bNetInitial && (Role == ROLE_Authority) ) OLTeamSymbols, bDistribution, NumTeams, bDesignation, bSimon, bCanSeeFlagLocation, bFlagElimination; reliable if ( bDistribution && bNetDirty && (Role == ROLE_Authority) ) DistributionArray; reliable if ( bDesignation && bNetDirty && (Role == ROLE_Authority) ) DesignationTarget; reliable if ( bCanSeeFlagLocation && bNetDirty && (Role == ROLE_Authority) ) OLFlagPos; reliable if ( bFlagElimination && bNetDirty && (Role == ROLE_Authority) ) TeamEliminated; } simulated function Timer() { local int i, j; local PlayerReplicationInfo OldHolder[4]; local Controller C; if ( Level.NetMode == NM_Client ) { if (Level.TimeSeconds - SecondCount >= Level.TimeDilation) { ElapsedTime++; if ( RemainingMinute != 0 ) { RemainingTime = RemainingMinute; RemainingMinute = 0; } if ( (RemainingTime > 0) && !bStopCountDown ) RemainingTime--; SecondCount += Level.TimeDilation; } if ( !bTeamSymbolsUpdated ) TeamSymbolNotify(); } else if ( Level.NetMode != NM_Standalone ) { OldHolder[0] = OLFlagHolder[0]; OldHolder[1] = OLFlagHolder[1]; OldHolder[2] = OLFlagHolder[2]; OldHolder[3] = OLFlagHolder[3]; OLFlagHolder[0] = None; OLFlagHolder[1] = None; OLFlagHolder[2] = None; OLFlagHolder[3] = None; for ( i=0; i// // A TDM4 Death Message. // // Switch 0: Kill // RelatedPRI_1 is the Killer. // RelatedPRI_2 is the Victim. // OptionalObject is the DamageType Class. // class OLTeamsDeathMessage extends LocalMessage; var(Message) localized string KilledString, SomeoneString; static function color GetConsoleColor( PlayerReplicationInfo RelatedPRI_1 ) { return class'HUD'.Default.GreenColor; } static function string GetString( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { local string KillerName, VictimName; if (Class(OptionalObject) == None) return ""; if (RelatedPRI_2 == None) VictimName = Default.SomeoneString; else VictimName = RelatedPRI_2.PlayerName; if ( Switch == 1 ) { // suicide return class'GameInfo'.Static.ParseKillMessage( KillerName, VictimName, Class(OptionalObject).Static.SuicideMessage(RelatedPRI_2) ); } if (RelatedPRI_1 == None) KillerName = Default.SomeoneString; else KillerName = RelatedPRI_1.PlayerName; return class'GameInfo'.Static.ParseKillMessage( KillerName, VictimName, Class(OptionalObject).Static.DeathMessage(RelatedPRI_1, RelatedPRI_2) ); } static function ClientReceive( PlayerController P, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { local bool bNoConsoleDeathMessages; bNoConsoleDeathMessages = class'XGame.xDeathMessage'.default.bNoConsoleDeathMessages; if ( Switch == 1 ) { if ( !bNoConsoleDeathMessages ) Super.ClientReceive(P, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject); return; } if ( (RelatedPRI_1 == P.PlayerReplicationInfo) || (P.PlayerReplicationInfo.bOnlySpectator && (Pawn(P.ViewTarget) != None) && (Pawn(P.ViewTarget).PlayerReplicationInfo == RelatedPRI_1)) ) { // Interdict and send the child message instead. P.myHUD.LocalizedMessage( Default.ChildMessage, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); if ( !bNoConsoleDeathMessages ) P.myHUD.LocalizedMessage( Default.Class, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); // check multikills if ( P.Role == ROLE_Authority ) { // multikills checked already in LogMultiKills() if ( UnrealPlayer(P).MultiKillLevel > 0 ) P.ReceiveLocalizedMessage( class'MultiKillMessage', UnrealPlayer(P).MultiKillLevel ); } else { if ( ( RelatedPRI_1 != RelatedPRI_2 ) && ( RelatedPRI_2 != None) && ((RelatedPRI_2.Team == None) || (RelatedPRI_1.Team != RelatedPRI_2.Team)) ) { if ( (P.Level.TimeSeconds - UnrealPlayer(P).LastKillTime < 4) && (Switch != 1) ) { UnrealPlayer(P).MultiKillLevel++; P.ReceiveLocalizedMessage( class'MultiKillMessage', xPlayer(P).MultiKillLevel ); } else UnrealPlayer(P).MultiKillLevel = 0; UnrealPlayer(P).LastKillTime = P.Level.TimeSeconds; } else UnrealPlayer(P).MultiKillLevel = 0; } } else if (RelatedPRI_2 == P.PlayerReplicationInfo) { P.ReceiveLocalizedMessage( class'OLTeamsVictimMessage', 0, RelatedPRI_1 ); if ( !bNoConsoleDeathMessages ) Super.ClientReceive(P, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject); } else if ( !bNoConsoleDeathMessages ) Super.ClientReceive(P, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject); } @N%V%y -;OLTeamGames.OLTeamRedConfigured w;*7k-%--kO R--g; qk;`-K';OLTeamGames.OLTeamBlueConfigured w;*7k-%--kO R--W; qk;`-O';OLTeamGames.OLTeamGreenConfigured w;*7k_-%-_-kO_ R--H; qk;`_-R';OLTeamGames.OLTeamGoldConfigured w;*7k\-%-\-kO\ R--8; qk;`\-Z'-KaB^?RedTeam=OLTeamGames.OLTeamRedConfiguredC-OaB^?BlueTeam=OLTeamGames.OLTeamBlueConfigured-RaB^?GreenTeam=OLTeamGames.OLTeamGreenConfigured-ZaB^?GoldTeam=OLTeamGames.OLTeamGoldConfigured;XGame.DMRosterConfigured w;*7k-%l--kO R--; qk;``%aB^?DMTeam=xgame.DMRosterConfigured^ G-@_j//----------------------------------------------------------- // OLTeamCustomHUDMenu // // Mostly based on Jailbreak's JBGUICustomHUDMenu //----------------------------------------------------------- class OLTeamsCustomHUDMenu extends UT2K4CustomHUDMenu; // ============================================================================ // Variables // ============================================================================ var automated moCombobox co_VoicePack; var automated GUIButton b_TestVoicePack; var automated moCheckbox ch_PlayAllAnnouncements; var private string VoicePackPrev; // ============================================================================ // InitializeGameClass // // Loads the voice pack list and returns true so the LoadSettings function is // called. // ============================================================================ function bool InitializeGameClass(string GameClassName) { LoadVoicePacks(); return True; } // ============================================================================ // LoadVoicePacks // // Fills the co_VoicePack list. // ============================================================================ function LoadVoicePacks() { local int iVoicePack; for (iVoicePack=0; iVoicePack Announcer; local sound TheSound; local float AnnouncerVol; Announcer = class(DynamicLoadObject(co_VoicePack.GetExtra(),class'class')); if(Announcer == none) return; switch (Rand(8)) { case 0: SoundName = 'blue_team_scores'; break; case 1: SoundName = 'Gold_Team_Scores'; break; case 2: SoundName = 'Green_Flag_Returned'; break; case 3: SoundName = 'blue_flag_returned'; break; case 4: SoundName = 'denied'; break; case 5: SoundName = 'sudden_death'; break; case 6: SoundName = 'green_team_is_the_winner'; break; case 7: SoundName = 'red_team_increases_their_lead'; break; } TheSound = sound(DynamicLoadObject(Announcer.default.SoundPackage$"."$SoundName,class'Sound')); if(TheSound == none) TheSound = sound(DynamicLoadObject(Announcer.default.OLTeamsFallBackSoundPackage$"."$SoundName,class'Sound')); AnnouncerVol = 2.0 * FClamp(0.1 + PlayerOwner().AnnouncerVolume*0.225,0.2,1.0); PlayerOwner().PlaySound(TheSound,SLOT_Talk,AnnouncerVol); } // ============================================================================ // GetPlayAllAnnouncements // // Returns whether the Play All Announcements options is currently enabled. // ============================================================================ function bool GetPlayAllAnnouncements() { return Class'OLTeamPlayerController'.Default.bPlayAllAnnouncements; } // ============================================================================ // SetPlayAllAnnouncements // // Sets the config setting which makes only relevant announcements play. // ============================================================================ function SetPlayAllAnnouncements(bool bPlayAllAnnouncements) { Class'OLTeamPlayerController'.Default.bPlayAllAnnouncements = bPlayAllAnnouncements; Class'OLTeamPlayerController'.Static.StaticSaveConfig(); if (OLTeamPlayerController(PlayerOwner()) != none) OLTeamPlayerController(PlayerOwner()).bPlayAllAnnouncements = bPlayAllAnnouncements; } // ============================================================================ // Defaults // ============================================================================ a//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsComboSpeed extends ComboSpeed; function StartEffect(xPawn P) { LeftTrail = Spawn(class'OLTeamsSpeedTrail', P,, P.Location, P.Rotation); P.AttachToBone(LeftTrail, 'lfoot'); RightTrail = Spawn(class'OLTeamsSpeedTrail', P,, P.Location, P.Rotation); P.AttachToBone(RightTrail, 'rfoot'); if(P.PlayerReplicationInfo.team.TeamIndex == 0) { LeftTrail.mColorRange[0].G = 0; LeftTrail.mColorRange[0].B = 0; LeftTrail.mColorRange[1] = LeftTrail.mColorRange[0]; RightTrail.mColorRange[0].G = 0; RightTrail.mColorRange[0].B = 0; RightTrail.mColorRange[1] = LeftTrail.mColorRange[0]; } else if(P.PlayerReplicationInfo.team.TeamIndex == 1) { LeftTrail.mColorRange[0].G = 0; LeftTrail.mColorRange[0].R = 0; LeftTrail.mColorRange[1] = LeftTrail.mColorRange[0]; RightTrail.mColorRange[0].G = 0; RightTrail.mColorRange[0].R = 0; RightTrail.mColorRange[1] = LeftTrail.mColorRange[0]; } else if(P.PlayerReplicationInfo.team.TeamIndex == 2) { LeftTrail.mColorRange[0].R = 0; LeftTrail.mColorRange[0].B = 0; LeftTrail.mColorRange[1] = LeftTrail.mColorRange[0]; RightTrail.mColorRange[0].R = 0; RightTrail.mColorRange[0].B = 0; RightTrail.mColorRange[1] = LeftTrail.mColorRange[0]; } else if(P.PlayerReplicationInfo.team.TeamIndex == 3) { LeftTrail.mColorRange[0].B = 0; LeftTrail.mColorRange[1] = LeftTrail.mColorRange[0]; RightTrail.mColorRange[0].B = 0; RightTrail.mColorRange[1] = LeftTrail.mColorRange[0]; } P.AirControl *= 1.4; P.GroundSpeed *= 1.4; P.WaterSpeed *= 1.4; P.AirSpeed *= 1.4; P.JumpZ *= 1.5; } X%Ag 27Y%?7= .'> '> '> '> '> '> '> YY8JBBBBBBBB'> YY8JBBBBBBBB'> YY8JBBBBBBBB'> YY8JBBBBBB'> '> '> '> '> $@_class OLTeamsBlueWhisp extends OLTeamsWillowWhisp; #exec OBJ LOAD File=XMiscEffects.utx E[%c @\%6Et[N$ANAO*((O(({"F"Y z@ //----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsBlueShockBeamEffect extends ShockBeamEffect; simulated function SpawnImpactEffects(rotator HitRot, vector EffectLoc) { Spawn(class'OLTeamsShockImpactFlareBlue',,, EffectLoc, HitRot); Spawn(class'OLTeamsShockImpactRingBlue',,, EffectLoc, HitRot); Spawn(class'OLTeamsShockImpactScorchBlue',,, EffectLoc, Rotator(-HitNormal)); Spawn(class'OLTeamsShockExplosionCoreBlue',,, EffectLoc+HitNormal*8, HitRot); } R//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsAnnouncerUnrealGrrl extends OLTeamsAnnouncer cacheexempt; ^%] 6_%W~Mo_]OLTeamGamesUnrealGrrl^]FemaleR//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsAnnouncerSportyGrrl extends OLTeamsAnnouncer cacheexempt; U%b%A !-G z-H z-I _z-O \z-W z-G N-H N-I _N-O \N-W N-G M -H M8-I _MP-O \Mh-W M|-k,k,  Gk`%\ 6c%fw#Mo_]OLTeamGamesSportyGrrl^]SportyO//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamsAnnouncerBennett extends OLTeamsAnnouncer cacheexempt; d%[ 6e%DMo_]OLTeamGamesAnnouncer^]Male_ //----------------------------------------------------------- // The parent of any OLTeamGames compatable announcer. // Any subclasses of this should be cacheexempt so that they // do not show up in the normal announcer selections. // // Never change the "FallBackSoundPackage" because it will // simply be overwritten at runtime by the PlayerController. // FallBackSoundPackage is set to the package that the player // has selected for his normal announcer. //----------------------------------------------------------- class OLTeamsAnnouncer extends AnnouncerVoice cacheexempt config(OLTeamGamesAnnouncers); var string OLTeamsFallBackSoundPackage; // You should usually not change this in subclasses. struct AnnouncerPackStruct { var string VoicePackName; var string Description; }; var globalconfig array AnnouncerPacks; // A list of all the Announcer Packs installed. // A modified version of PrecacheSound that checks for the sound in // OLTeamsFallBackSoundPackage if it can't find it in its own package. // This function should only be called (from the gameclass) for sounds // that are not in the standard announcer packs. (Like "Green team scores") function sound PrecacheCustomSound(name AName) { local sound NewSound; NewSound = Sound(DynamicLoadObject(SoundPackage$"."$AName, class'Sound', true)); if ( (NewSound == None) && (OLTeamsFallBackSoundPackage != "" ) ) NewSound = PrecacheFallbackPackage( OLTeamsFallBackSoundPackage, AName ); if ( (NewSound == None) && (FallBackSoundPackage != "" ) ) NewSound = PrecacheFallbackPackage( FallBackSoundPackage, AName ); if ( (NewSound == None) && (AlternateFallbackSoundPackage != "" ) ) NewSound = PrecacheFallbackPackage( AlternateFallbackSoundPackage, AName ); if ( NewSound == None ) warn("Could not find "$AName$" in "$SoundPackage$" nor in fallback package "$FallBackSoundPackage $ "nor in Alternate" $ AlternateFallbackSoundPackage ); return NewSound; } ~//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeams2K4SettingsPage extends UT2K4SettingsPage; g%W 6 h%A||ᏽRrHHYGUI2K4.UT2K4Tab_DetailSettingsGUI2K4.UT2K4Tab_AudioSettings*OLTeamGames.OLTeamGamesTab_PlayerSettingsGUI2K4.UT2K4Tab_GameSettingsGUI2K4.UT2K4Tab_IForceSettingsGUI2K4.UT2K4Tab_WeaponPrefGUI2K4.UT2K4Tab_HudSettingsa%N ^1&s0rN q*O'`rN q*m'rN DGUI2K4.UT2K4BotInfoPage.3T DM J 'nrN l!DGUI2K4.UT2K4BotConfigPage.3T DM J '( GA//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamRedConfigured extends OLTeamsRosterConfigured; i%hzQ)rh  rh  rhI  rhQ .hz#`.hF Gj%S 6m%{l$`o//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamPlayerController extends xPlayer config(User); var string OLMidGameMenuClass; var(TeamBeacon) float OLTeamBeaconMaxDist; var(TeamBeacon) float OLTeamBeaconPlayerInfoMaxDist; var globalconfig string OLCustomAnnouncerPack; var globalconfig bool bPlayAllAnnouncements; simulated event PostBeginPlay() { local class VoiceClass; local class OLVoiceClass; local int c; super(PlayerController).PostBeginPlay(); // This stuff is from xPlayer. It needs to be here, because I skip it with the above call. for (c = 0; c < ArrayCount(ComboList); c++) { if ( ComboNameList[c] != "" ) { ComboList[c] = class(DynamicLoadObject(ComboNameList[c],class'Class')); if ( ComboList[c] == None ) break; MinAdrenalineCost = FMin(MinAdrenalineCost,ComboList[c].Default.AdrenalineCost); } } FillCameraList(); LastKillTime = -5.0; if ( Level.NetMode != NM_DedicatedServer ) { VoiceClass = class(DynamicLoadObject(CustomStatusAnnouncerPack,class'Class')); OLVoiceClass = class(DynamicLoadObject(OLCustomAnnouncerPack,class'Class')); StatusAnnouncer = Spawn(OLVoiceClass); StatusAnnouncer.FallbackSoundPackage = VoiceClass.default.SoundPackage; VoiceClass = class(DynamicLoadObject(CustomRewardAnnouncerPack,class'Class')); RewardAnnouncer = Spawn(VoiceClass); PrecacheAnnouncements(); } } event TeamMessage( PlayerReplicationInfo PRI, coerce string S, name Type ) { local string c; // 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( AllowTextToSpeech(PRI, Type) ) TextToSpeech( S, TextToSpeechVoiceVolume ); if ( Type == 'TeamSayQuiet' ) Type = 'TeamSay'; if ( myHUD != None ) myHUD.Message( PRI, c$S, Type ); if ( (Player != None) && (Player.Console != None) ) { if ( PRI!=None ) { if ( PRI.Team!=None && GameReplicationInfo.bTeamGame) { if (PRI.Team.TeamIndex==0) c = chr(27)$chr(200)$chr(1)$chr(1); else if (PRI.Team.TeamIndex==1) c = chr(27)$chr(125)$chr(200)$chr(253); else if (PRI.Team.TeamIndex==2) c = chr(27)$chr(130)$chr(254)$chr(130); else if (PRI.Team.TeamIndex==3) c = chr(27)$chr(213)$chr(213)$chr(1); } S = PRI.PlayerName$": "$S; } Player.Console.Chat( c$s, 6.0, PRI ); } } static function string GetOLCustomStatusAnnouncerPack() { return default.OLCustomAnnouncerPack; } static function SetOLCustomStatusAnnouncerPack(string Announcer) { default.OLCustomAnnouncerPack = Announcer; } 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(LoginMenuClass); else ClientOpenMenu(OLMidGameMenuClass); } function ServerDropFlag() { local int i; local int NumFlags; if (PlayerReplicationInfo==None) return; NumFlags = OLTeamsPlayerReplicationInfo(PlayerReplicationInfo).HasFlags.Length; for(i=0;i Message, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { // 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; // HACK HACK HACK! Replace certain local messages with custom OLTeams versions, usually to prevent overlapping with HUD. // This should be a last resort hack - it's mainly for messages you can't change any other way, like the ones that are called from DamTypes (SpecialKillMessage) if(Message == class'SpecialKillMessage') Message = class'OLTeamsSpecialKillMessage'; Message.Static.ClientReceive( Self, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); if ( Message.static.IsConsoleMessage(Switch) && (Player != None) && (Player.Console != None) ) Player.Console.Message(Message.Static.GetString(Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject),0 ); } h  @uW//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamPawn extends xPawn; #EXEC OBJ LOAD FILE=OLTeamSkins.utx #EXEC OBJ LOAD FILE=OLTeamCBPSkins.utx var class OLTransOutEffect[4]; var class OLTransEffects[4]; var material OLDeResMat0[4]; var material OLDeResMat1[4]; var color OLDeResColorScale0[4]; var color OLDeResColorScale1[4]; var int TeamIndex; var() array SkinsAllowed; // A list of all the skins that have green and gold versions var() array UseDefaultSkins; // A list of all the skins that should fall back to the default versions. var() array UseDefaultHeads; // A list of all the heads that should fall back to the default versions. var() array CustomPackages; replication { reliable if ( bNetInitial && (Role == ROLE_Authority) ) TeamIndex; } static final function LoadPlayerSkins(xUtil.PlayerRecord rec, int TeamNum, bool bUseSkinPackage, string CustomPackage, out Material BodySkin, out Material FaceSkin) { local bool bLoadedSkin; local bool bUseDefaultSkin; local Material NewTeamSkin; local string temp; local string BodySkinName, FaceSkinName; local int i; if (!bLoadedSkin) { if (bUseSkinPackage) { temp = rec.BodySkinName; BodySkinName = temp$"_"$TeamNum; NewTeamSkin = Material(DynamicLoadObject(BodySkinName, class'Material',true)); if(NewTeamSkin != none) { BodySkin = NewTeamSkin; bLoadedSkin = true; } else { Log("WARNING! Unable to find teamskin: "$BodySkinName$" for mesh "$rec.MeshName,'OLTeamGames'); } if(bLoadedSkin && rec.TeamFace) { temp = rec.FaceSkinName; FaceSkinName = temp$"_"$TeamNum; NewTeamSkin = Material(DynamicLoadObject(FaceSkinName, class'Material',true)); if(NewTeamSkin != none) { FaceSkin = NewTeamSkin; } else { Log("WARNING! Unable to find teamface: "$FaceSkinName,'OLTeamGames'); } } } else if(TeamNum > 1 && TeamNum != 255) { // Load a green or gold skin temp = rec.BodySkinName; ReplaceText(temp,".","_"); BodySkinName = CustomPackage$"."$temp$"_"$TeamNum; // Check to see if this skin should fall back to the default skin bUseDefaultSkin = false; for(i=0;iL>?c,as$b G{n//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamGamesTeamSymbolConfig extends TeamSymbolConfig; var automated GUIImage i_GreenPreview, i_GoldPreview; var automated GUIHorzScrollButton b_AddGreen, b_AddGold; var Material InitialGold, InitialGreen; var localized string BlueString, GreenString, GoldString; var automated GUISectionBackground sb_BlueBack, sb_GreenBack, sb_GoldBack; function InitComponent(GUIController MyController, GUIComponent MyOwner) { local array TeamSymbols; local Material m; local int i; Super(LockedFloatingWindow).InitComponent(MyController, MyOwner); Controller.GetTeamSymbolList( TeamSymbols, false ); li_Sym = lb_Symbols.List; li_Sym.bDropSource=True; li_Sym.OnEndDrag=EndSymbolDrag; for ( i = 0; i < TeamSymbols.Length; i++ ) { m = Material(DynamicLoadObject( TeamSymbols[i], Class'Material' )); if ( m != None ) { lb_Symbols.AddImage(m); } } b_Ok.SetPosition(0.704829,0.880000,0.159649,0.050000); b_Cancel.SetPosition(0.425261,0.880000,0.159649,0.050000); sb_Main.SetPosition(0.388578,0.050317,0.264769,0.313203); sb_BlueBack.SetPosition(0.687329,0.050317,0.264769,0.313203); sb_GreenBack.SetPosition(0.388578,0.470317,0.264769,0.313203); sb_GoldBack.SetPosition(0.687329,0.470317,0.264769,0.313203); sb_Main.ManageComponent(i_RedPreview); sb_Main.Caption = RedString; sb_Main.bFillClient=true; sb_BlueBack.ManageComponent(i_BluePreview); sb_BlueBack.Caption = BlueString; sb_BlueBack.bFillClient=true; sb_GreenBack.ManageComponent(i_GreenPreview); sb_GreenBack.Caption = GreenString; sb_GreenBack.bFillClient=true; sb_GoldBack.ManageComponent(i_GoldPreview); sb_GoldBack.Caption = GoldString; sb_GoldBack.bFillClient=true; sb_Bk3.ManageComponent(lb_Symbols); b_Cancel.Caption = ResetString; b_Cancel.OnClick=ResetClick; } function bool ResetClick(GUIComponent Sender) { if ( Sender == b_Cancel ) { SetRedImage(InitialRed); SetBlueImage(InitialBlue); SetGreenImage(InitialGreen); SetGoldImage(InitialGold); } return true; } function EndSymbolDrag(GUIComponent Accepting, bool bAccepted) { local int i; local array Pending; if (bAccepted && Accepting != None) { Pending = li_sym.GetPendingElements(); for (i = 0; i < Pending.Length; i++) { if ( Accepting == i_RedPreview ) SetRedImage(Pending[i].Image); else if ( Accepting == i_BluePreview ) SetBlueImage( Pending[i].Image ); else if ( Accepting == i_GreenPreview ) SetGreenImage( Pending[i].Image ); else if ( Accepting == i_GoldPreview ) SetGoldImage( Pending[i].Image ); } li_Sym.bRepeatClick = False; } if (Accepting == None) li_Sym.bRepeatClick = True; li_Sym.SetOutlineAlpha(255); if ( li_Sym.bNotify ) li_Sym.CheckLinkedObjects(li_Sym); } // Returns true if successfully removed image from main list function bool SetGreenImage(Material Mat) { local int i; local bool bResult; if ( Mat == None ) { if ( i_GreenPreview.Image != None ) { i = li_Sym.FindImage(i_GreenPreview.Image); if ( i == -1 ) li_Sym.Add( i_GreenPreview.Image ); } i_GreenPreview.Image = None; return false; } // The image must exist in our list for us to add it // Otherwise, we could end up with both teams having the same image, which causes problems // when you try to change one of those images, as you then end up with two copies of the same image in the list i = li_Sym.FindImage( Mat ); if ( i != -1 ) { if ( i_GreenPreview.Image != None && i_GreenPreview.Image != Mat ) li_Sym.Replace( i, i_GreenPreview.Image ); else { li_Sym.Remove(i); bResult = true; } i_GreenPreview.Image = Mat; } return bResult; } // Returns true if successfully removed image from main list function bool SetGoldImage(Material Mat) { local int i; local bool bResult; if ( Mat == None ) { if ( i_GoldPreview.Image != None ) { i = li_Sym.FindImage(i_GoldPreview.Image); if ( i == -1 ) li_Sym.Add( i_GoldPreview.Image ); } i_GoldPreview.Image = None; return false; } // The image must exist in our list for us to add it // Otherwise, we could end up with both teams having the same image, which causes problems // when you try to change one of those images, as you then end up with two copies of the same image in the list i = li_Sym.FindImage( Mat ); if ( i != -1 ) { if ( i_GoldPreview.Image != None && i_GoldPreview.Image != Mat ) li_Sym.Replace( i, i_GoldPreview.Image ); else { li_Sym.Remove(i); bResult = true; } i_GoldPreview.Image = Mat; } return bResult; } function HandleParameters( string Symbols, string Unused ) { local int i; local Material M; local bool GotRed, GotBlue, GotGreen, GotGold; local string RedSymbol, BlueSymbol, GreenSymbol, GoldSymbol; local array SymbolsSplit; Split(Symbols,"|",SymbolsSplit); RedSymbol = SymbolsSplit[0]; BlueSymbol = SymbolsSplit[1]; GreenSymbol = SymbolsSplit[2]; GoldSymbol = SymbolsSplit[3]; if ( RedSymbol == "" ) GotRed = true; if ( BlueSymbol == "" ) GotBlue = true; if ( GreenSymbol == "" ) GotGreen = true; if ( GoldSymbol == "" ) GotGold = true; while ( i < li_Sym.ItemCount && !(GotRed && GotBlue && GotGreen && GotGold) ) { M = li_Sym.GetImageAtIndex(i); if ( !GotRed && string(M) ~= RedSymbol ) { InitialRed = M; GotRed = true; if ( SetRedImage(M) ) continue; } if ( !GotBlue && string(M) ~= BlueSymbol ) { InitialBlue = M; GotBlue = true; if ( SetBlueImage(M) ) continue; } if ( !GotGreen && string(M) ~= GreenSymbol ) { InitialGreen = M; GotGreen = true; if ( SetGreenImage(M) ) continue; } if ( !GotGold && string(M) ~= GoldSymbol ) { InitialGold = M; GotGold = true; if ( SetGoldImage(M) ) continue; } i++; } } fg//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamGamesTab_PlayerSettings extends UT2K4Tab_PlayerSettings; var localized string OLPreviews[5]; var localized string OLTeamNames[5]; function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super(Settings_Tabs).Initcomponent(MyController, MyOwner); co_Hand.AddItem(HandNames[0]); co_Hand.AddItem(HandNames[1]); co_Hand.AddItem(HandNames[2]); co_Hand.AddItem(HandNames[3]); co_Hand.ReadOnly(true); co_Team.AddItem(OLTeamNames[0]); co_Team.AddItem(OLTeamNames[1]); co_Team.AddItem(OLTeamNames[2]); co_Team.AddItem(OLTeamNames[3]); co_Team.AddItem(OLTeamNames[4]); co_Team.ReadOnly(true); // Spawn spinning character actor if ( SpinnyDude == None ) SpinnyDude = PlayerOwner().spawn(class'XInterface.SpinnyWeap'); SpinnyDude.bPlayCrouches = false; SpinnyDude.bPlayRandomAnims = false; SpinnyDude.SetDrawType(DT_Mesh); SpinnyDude.SetDrawScale(0.9); SpinnyDude.SpinRate = 0; b_3DView.Caption = Show3DViewCaption; ed_Name.MyEditBox.bConvertSpaces = true; ed_Name.MyEditBox.MaxWidth=16; // as per polge, check UT2K4Tab_PlayerSettings if you change this nu_FOV.MyNumericEdit.Step = 5; co_SkinPreview.AddItem(OLPreviews[0]); co_SkinPreview.AddItem(OLPreviews[1]); co_SkinPreview.AddItem(OLPreviews[2]); co_SkinPreview.AddItem(OLPreviews[3]); co_SkinPreview.AddItem(OLPreviews[4]); i_BG2.Managecomponent(ed_Name); i_BG2.Managecomponent(ch_SmallWeaps); i_BG2.Managecomponent(co_Team); i_BG2.Managecomponent(co_Hand); i_BG2.Managecomponent(co_Voice); i_BG2.Managecomponent(nu_FOV); i_BG3.Managecomponent(lb_Scroll); } function InternalOnLoadINI(GUIComponent Sender, string s) { local PlayerController PC; PC = PlayerOwner(); if (GUIMenuOption(Sender) != None) { switch (GUIMenuOption(Sender)) { case ed_Name: sName = PC.GetUrlOption("Name"); sNameD = sName; ed_Name.SetText(sName); break; case co_Team: if (PC.PlayerReplicationInfo == None || PC.PlayerReplicationInfo.Team == None) iTeam = int(PC.GetUrlOption("Team")); else iTeam = PC.PlayerReplicationInfo.Team.TeamIndex; iTeamD = iTeam; if (iTeam > 3) iTeam = 4; co_Team.SetIndex(iTeam); break; case co_Voice: if ( PC.PlayerReplicationInfo == None || PC.PlayerReplicationInfo.VoiceTypeName == "" ) sVoice = PC.GetUrlOption("Voice"); else sVoice = PC.PlayerReplicationInfo.VoiceTypeName; sVoiceD = sVoice; break; case ch_SmallWeaps: bWeaps = PC.bSmallWeapons; bWeapsD = bWeaps; ch_SmallWeaps.Checked(bWeaps); break; case co_Hand: iHand = PC.Handedness + 1; iHandD = iHand; co_Hand.SetIndex(iHand); break; case nu_FOV: iFOV = PC.DefaultFOV; iFOVD = iFOV; nu_FOV.SetValue(iFOV); break; default: log(Name@"Unknown component calling LoadINI:"$ GUIMenuOption(Sender).Caption); GUIMenuOption(Sender).SetComponentValue(s,true); } } else if ( Sender == i_Portrait ) { sChar = PC.GetUrlOption("Character"); sCharD = sChar; } } function SaveSettings() { local bool bSave; local PlayerController PC; Super.SaveSettings(); PC = PlayerOwner(); if (sNameD != sName) { PC.ReplaceText(sName, "\"", ""); sNameD = sName; PC.ConsoleCommand("SetName"@sName); } if (iTeam == 4) iTeam = 255; if (iTeamD != iTeam) { iTeamD = iTeam; PC.UpdateUrl("Team", string(iTeam), True); PC.ChangeTeam(iTeam); } if (iTeam == 255) iTeam = 4; if (bWeapsD != bWeaps) { bWeapsD = bWeaps; PC.bSmallWeapons = bWeaps; bSave = True; } if (iHandD != iHand) { iHandD = iHand; PC.Handedness = iHand - 1; PC.SetHand(iHand - 1); bSave = False; } if (iFOVD != iFOV) { iFOVD = iFOV; PC.FOV( float(iFOV) ); bSave = False; } if (sChar != sCharD) { sCharD = sChar; PC.ConsoleCommand("ChangeCharacter"@sChar); if ( PC.IsA('xPlayer') ) bSave = False; else PC.UpdateURL("Character", sChar, True); if ( PlayerRec.Sex ~= "Female" ) PC.UpdateURL("Sex", "F", True); else PC.UpdateURL("Sex", "M", True); } if (sVoice != sVoiceD) { sVoiceD = sVoice; PC.SetVoice(sVoice); } if (bSave) PC.SaveConfig(); } function UpdateSpinnyDude() { local Mesh PlayerMesh; local Material BodySkin, HeadSkin; local string CustomPackage; local byte UseSkinPackage; local int TeamNum; if (PlayerRec.Race ~= "Juggernaut" || PlayerRec.DefaultName~="Axon" || PlayerRec.DefaultName~="Cyclops" || PlayerRec.DefaultName ~="Virus" ) SpinnyDudeOffset.Z=7; else SpinnyDudeOffset.Z=0; // TODO Have some sort of indicator if this skin is not valid. if (class'OLTeamPawn'.static.UseDefaultModel(PlayerRec,CustomPackage,UseSkinPackage)) { PlayerRec = class'xUtil'.static.FindPlayerRecord(GetDefaultCharacter()); } i_Portrait.Image = PlayerRec.Portrait; PlayerMesh = Mesh(DynamicLoadObject(PlayerRec.MeshName, class'Mesh')); if(PlayerMesh == None) { Log("Could not load mesh: "$PlayerRec.MeshName$" For player: "$PlayerRec.DefaultName); return; } TeamNum = int(eval(co_SkinPreview.GetIndex() > 0, co_SkinPreview.GetIndex()-1, "255")); class'OLTeamPawn'.static.LoadPlayerSkins(PlayerRec,TeamNum,(UseSkinPackage == 1),CustomPackage,BodySkin,HeadSkin); SpinnyDude.LinkMesh(PlayerMesh); SpinnyDude.Skins[0] = BodySkin; SpinnyDude.Skins[1] = HeadSkin; SpinnyDude.LoopAnim( 'Idle_Rest', 1.0/SpinnyDude.Level.TimeDilation ); } function string GetDefaultCharacter() { return "Jakob"; } r//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamGamesTab_BotConfigBase extends UT2K4Tab_BotConfigBase; var automated GUISectionBackground sb_Green, sb_Gold; var automated GUIVertImageListBox lb_Green, lb_Gold; var() noexport editconst GUIVertImageList li_Green, li_Gold; function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super(UT2K4GameTabBase).Initcomponent(MyController, MyOwner); li_Red = lb_Red.List; li_Red.bDropSource = True; li_Red.bDropTarget = True; li_Red.OnDragDrop = InternalOnDragDrop; li_Red.OnBeginDrag = InternalOnBeginDrag; li_Red.OnEndDrag = InternalOnEndDrag; li_Red.AddLinkObject(b_Config); li_Red.AddLinkObject(b_DoConfig); li_Blue = lb_Blue.List; li_Blue.bDropSource = True; li_Blue.bDropTarget = True; li_Blue.OnDragDrop = InternalOnDragDrop; li_Blue.OnBeginDrag = InternalOnBeginDrag; li_Blue.OnEndDrag = InternalOnEndDrag; li_Blue.AddLinkObject(b_Config); li_Blue.AddLinkObject(b_DoConfig); li_Green = lb_Green.List; li_Green.bDropSource = True; li_Green.bDropTarget = True; li_Green.OnDragDrop = InternalOnDragDrop; li_Green.OnBeginDrag = InternalOnBeginDrag; li_Green.OnEndDrag = InternalOnEndDrag; li_Green.AddLinkObject(b_Config); li_Green.AddLinkObject(b_DoConfig); li_Gold = lb_Gold.List; li_Gold.bDropSource = True; li_Gold.bDropTarget = True; li_Gold.OnDragDrop = InternalOnDragDrop; li_Gold.OnBeginDrag = InternalOnBeginDrag; li_Gold.OnEndDrag = InternalOnEndDrag; li_Gold.AddLinkObject(b_Config); li_Gold.AddLinkObject(b_DoConfig); li_Bots.AddLinkObject(b_Config); li_Bots.AddLinkObject(b_DoConfig); li_Bots.CheckLinkedObjects = UpdateLinks; li_Bots.SetIndex(0); sb_Red.ManageComponent(lb_Red); sb_Blue.ManageComponent(lb_Blue); sb_Green.ManageComponent(lb_Green); sb_Gold.ManageComponent(lb_Gold); sb_PBK.ManageComponent(i_Portrait); } function SetupBotLists(bool bIsTeam) { local int i, j; local class TIClass; local array Chars; bTeamGame = bIsTeam; li_Red.Clear(); li_Blue.Clear(); li_Green.Clear(); li_Gold.Clear(); if (bTeamGame) { TIClass = class(DynamicLoadObject("OLTeamGames.OLTeamRedConfigured",class'Class')); if ( TIClass != None ) { TIClass.static.GetAllCharacters(Chars); for ( i = 0; i < Chars.Length; i++ ) { for ( j = 0; j < li_Bots.PlayerList.Length; j++ ) if ( li_Bots.PlayerList[j].DefaultName ~= Chars[i] ) li_Red.Add(li_Bots.PlayerList[j].Portrait, j); } } TIClass = class(DynamicLoadObject("OLTeamGames.OLTeamBlueConfigured",class'Class')); if ( TIClass != None ) { TIClass.static.GetAllCharacters(Chars); for ( i = 0; i < Chars.Length; i++ ) { for ( j = 0; j < li_Bots.PlayerList.Length; j++ ) if ( li_Bots.PlayerList[j].DefaultName ~= Chars[i] ) li_Blue.Add(li_Bots.PlayerList[j].Portrait, j); } } TIClass = class(DynamicLoadObject("OLTeamGames.OLTeamGreenConfigured",class'Class')); if ( TIClass != None ) { TIClass.static.GetAllCharacters(Chars); for ( i = 0; i < Chars.Length; i++ ) { for ( j = 0; j < li_Bots.PlayerList.Length; j++ ) if ( li_Bots.PlayerList[j].DefaultName ~= Chars[i] ) li_Green.Add(li_Bots.PlayerList[j].Portrait, j); } } TIClass = class(DynamicLoadObject("OLTeamGames.OLTeamGoldConfigured",class'Class')); if ( TIClass != None ) { TIClass.static.GetAllCharacters(Chars); for ( i = 0; i < Chars.Length; i++ ) { for ( j = 0; j < li_Bots.PlayerList.Length; j++ ) if ( li_Bots.PlayerList[j].DefaultName ~= Chars[i] ) li_Gold.Add(li_Bots.PlayerList[j].Portrait, j); } } } else { TIClass = class(DynamicLoadObject("XGame.DMRosterConfigured",class'Class')); if ( TIClass != None ) { TIClass.static.GetAllCharacters(Chars); for ( i = 0; i < Chars.Length; i++ ) { for ( j = 0; j < li_Bots.PlayerList.Length; j++ ) if ( li_Bots.PlayerList[j].DefaultName ~= Chars[i] ) li_Red.Add(li_Bots.PlayerList[j].Portrait, j); } } } SetVis(bTeamGame); } // Play is called when the play button is pressed. It saves any releavent data and then // returns any additions to the URL function string Play() { local int i; local class TIClass; local array Characters; local bool b1,b2,b3,b4; local string url; local int MinPlayers; if (bTeamGame) { TIClass = class(DynamicLoadObject("OLTeamGames.OLTeamRedConfigured", class'Class')); if ( TIClass != None ) { Characters.Length = li_Red.ItemCount; for ( i = 0; i < li_Red.ItemCount; i++ ) Characters[i] = li_Bots.GetNameAt(li_Red.GetItemIntAtIndex(i)); TIClass.static.SetCharacters(Characters); TIClass.static.StaticSaveConfig(); MinPlayers += li_Red.ItemCount; b1 = true; } TIClass = class(DynamicLoadObject("OLTeamGames.OLTeamBlueConfigured", class'Class')); if ( TIClass != None ) { Characters.Length = li_Blue.ItemCount; for ( i = 0; i < li_Blue.ItemCount; i++ ) Characters[i] = li_Bots.GetNameAt(li_Blue.GetItemIntAtIndex(i)); TIClass.static.SetCharacters(Characters); TIClass.static.StaticSaveConfig(); MinPlayers += li_Blue.ItemCount; b2 = True; } TIClass = class(DynamicLoadObject("OLTeamGames.OLTeamGreenConfigured", class'Class')); if ( TIClass != None ) { Characters.Length = li_Green.ItemCount; for ( i = 0; i < li_Green.ItemCount; i++ ) Characters[i] = li_Bots.GetNameAt(li_Green.GetItemIntAtIndex(i)); TIClass.static.SetCharacters(Characters); TIClass.static.StaticSaveConfig(); MinPlayers += li_Green.ItemCount; b3 = True; } TIClass = class(DynamicLoadObject("OLTeamGames.OLTeamGoldConfigured", class'Class')); if ( TIClass != None ) { Characters.Length = li_Gold.ItemCount; for ( i = 0; i < li_Gold.ItemCount; i++ ) Characters[i] = li_Bots.GetNameAt(li_Gold.GetItemIntAtIndex(i)); TIClass.static.SetCharacters(Characters); TIClass.static.StaticSaveConfig(); MinPlayers += li_Gold.ItemCount; b4 = True; } if (b1) url $= "?RedTeam=OLTeamGames.OLTeamRedConfigured"; if (b2) url $= "?BlueTeam=OLTeamGames.OLTeamBlueConfigured"; if (b3) url $= "?GreenTeam=OLTeamGames.OLTeamGreenConfigured"; if (b4) url $= "?GoldTeam=OLTeamGames.OLTeamGoldConfigured"; } else { TIClass = class(DynamicLoadObject("XGame.DMRosterConfigured", class'Class')); if ( TIClass != None ) { Characters.Length = li_Red.ItemCount; for ( i = 0; i < li_Red.ItemCount; i++ ) Characters[i] = li_Bots.GetNameAt(li_Red.GetItemIntAtIndex(i)); TIClass.static.SetCharacters(Characters); TIClass.static.StaticSaveConfig(); MinPlayers += li_Red.ItemCount; } if (MinPlayers > 0) url $= "?DMTeam=xgame.DMRosterConfigured"; } return url; } function UpdateLinks(GUIListBase List) { local int MaxCount; local bool bRedValid, bBlueValid, bGreenValid, bGoldValid, bMainValid; bRedValid = li_Red.IsValid(); bBlueValid = li_Blue.IsValid(); bGreenValid = li_Green.IsValid(); bGoldValid = li_Gold.IsValid(); bMainValid = li_Bots.IsValid(); // each list's linked objects overlap, so first disable the ones that are invalid if ( !bRedValid ) li_Red.DisableLinkedObjects(); if ( !bBlueValid ) li_Blue.DisableLinkedObjects(); if ( !bGreenValid ) li_Green.DisableLinkedObjects(); if ( !bGoldValid ) li_Gold.DisableLinkedObjects(); if ( !bMainValid ) li_Bots.DisableLinkedObjects(); // then enable the ones that are valid if ( bRedValid ) li_Red.EnableLinkedObjects(); if ( bBlueValid ) li_Blue.EnableLinkedObjects(); if ( bGreenValid ) li_Green.EnableLinkedObjects(); if ( bGoldValid ) li_Gold.EnableLinkedObjects(); if ( bMainValid ) li_Bots.EnableLinkedObjects(); if (bTeamGame) MaxCount = 16; else MaxCount = 32; // if ( li_Red.ItemCount >= MaxCount ) // DisableComponent(b_AddR); // else EnableComponent(b_AddR); // if ( li_Blue.ItemCount >= MaxCount ) // DisableComponent(b_AddB); // else EnableComponent(b_AddB); } function bool InternalOnClick(GUIComponent Sender) { if (Sender==b_Left) { li_Bots.SetFocus(none); li_Bots.PgUp(); return true; } if (Sender==b_Right) { li_Bots.SetFocus(none); li_Bots.PgDown(); return true; } if (Sender == b_Config) { if (Controller.OpenMenu("GUI2K4.UT2K4BotInfoPage")) UT2K4BotInfoPage(Controller.ActivePage).SetupBotInfo(li_bots.GetPortrait(), li_Bots.GetDecoText(), li_Bots.GetRecord()); return true; } if (Sender == b_DoConfig) { if (Controller.OpenMenu("GUI2K4.UT2K4BotConfigPage")) UT2K4BotConfigPage(Controller.ActivePage).SetupBotInfo(li_Bots.GetPortrait(), li_Bots.GetDecoText(), li_Bots.GetRecord()); return true; } return false; } function ListChange(GUIComponent Sender) { if (Sender == lb_Blue || Sender == lb_Red || Sender == lb_Green || Sender == lb_Gold) { if ( GUIVertImageListBox(Sender).List.IsValid() ) li_Bots.SetIndex(GUIVertImageListBox(Sender).List.GetItem()); } } E&l%X6 ^F& #,Cƺ+r[d@,Cƺ+r[d@[d@[d@[d@ZZz[d@[d@[d@ZZqՐ[d@[d@[d@+rٺ+rٺ+rٺ+r[d@+rٺ+rٺ+rٺ+r[d@+rٺ+rٺ+rٺ+r[d@+rٺ+r[d@+rٓJJ+rٺ+rٺ+r[d@+rٓJJ+rٺ+rٺ+r[d@+rٓJJ+rٺ+rٺ+r[d@+rٓJJ+rٺ+rٺ+r[d@+rٓJJ+rٺ+rٺ+rٺ+rٺ+rٓJ[d@[d@+r[d@J[d@[d@+r[d@J[d@[d@+r[d@J[d@[d@+r[d@J[d@[d@+r[d@,Cƺ+rٺ+rٺ+rٺ+rٺ+rٺ+rٺ+r,Cƺ+rٺ+rٺ+rٺ+rٺ+rٺ+rٺ+r,Cƺ+rٺ+rٺ+rٺ+rٺ+rٺ+rٺ+r,Cƺ+rٺ+rٺ+rٺ+rٺ+rٺ+rٺ+r[d@[d@[d@[d@hhhho2RrH~ t'} u'| x'{ y'P cU bG `F XB&H&h % 5-E GG&^b O 5-E-^ 5Lw.5c,*.5c,-E-^ G[://----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamGamesMutator extends DMMutator HideDropDown CacheExempt; var bool bInit; var class PRIClass; struct WeaponReplacementStruct { var class OriginalWeapon; var class ReplacementWeapon; var bool bAlwaysReplace; }; var array ReplaceArray; function Mutate(string MutateString, PlayerController Sender) { // A hack to stop a hack! Prevents UT2Vote from hijacking the ESC menu. if(MutateString ~= "UT2VoteEscape") { Sender.ShowMidGameMenu(True); return; } if ( NextMutator != None ) NextMutator.Mutate(MutateString, Sender); } // Modified version of IsRelevant that calls NextMutator FIRST, // that way all the weapons will get replaced with the team versions // even if an arena mutator is turned on. function bool IsRelevant(Actor Other, out byte bSuperRelevant) { local bool bResult; local bool bOLWeapon; local int i; bOLWeapon = false; for(i=0;i GetDefaultWeapon() { local Class W; local int i; if ( NextMutator != None ) { W = NextMutator.GetDefaultWeapon(); if ( W == None ) W = MyDefaultWeapon(); } for(i=0;i 0) InfoRules.Remove(0, InfoRules.Length); for ( i = 0; i < GamePI.Settings.Length; i++ ) if ( ShouldDisplayRule(i) ) InfoRules[InfoRules.Length] = GamePI.Settings[i]; ClearRules(); LoadRules(); } function UpdateSetting(GUIMenuOption Sender) { local int i; local int Index; local int OtherIndex; local class GameClass; Super.UpdateSetting(Sender); if (Sender == None) return; i = Sender.Tag; if (i < 0) return; if (InfoRules[i].DisplayName != Sender.Caption) { return; } Index = GamePI.FindIndex(InfoRules[i].SettingName); if (InfoRules[i].DisplayName != Sender.Caption || Index == -1) { return; } GameClass = class(GamePI.InfoClasses[0]); if(right(InfoRules[i].SettingName,12) ~= "bDesignation") { // Designation affects Distrubution OtherIndex = li_rules.Find(GameClass.default.TGPropsDisplayText[6]); // Distribution CheckAndResolveConflicts(li_rules.GetItem(OtherIndex), GameClass); } else if(right(InfoRules[i].SettingName,13) ~= "bDistribution") { // Designation affects Distrubution and Flag Elimination OtherIndex = li_rules.Find(GameClass.default.TGPropsDisplayText[8]); // Designation CheckAndResolveConflicts(li_rules.GetItem(OtherIndex), GameClass); OtherIndex = li_rules.Find(GameClass.default.TGPropsDisplayText[9]); // Flag Elimination CheckAndResolveConflicts(li_rules.GetItem(OtherIndex), GameClass); } else if(right(InfoRules[i].SettingName,12) ~= "bSubtraction") { // Designation affects Distrubution OtherIndex = li_rules.Find(GameClass.default.TGPropsDisplayText[9]); // Flag Elimination CheckAndResolveConflicts(li_rules.GetItem(OtherIndex), GameClass); } } // BIGGEST HACK IN THE WORLD! // Allows me to control the different special scoring options so that you can't activate // conflicting options (Like designation and distribution) function CheckAndResolveConflicts(GUIMenuOption Sender, class GameClass) { local int i; local int Index; local array OtherIndex; i = Sender.Tag; Index = li_rules.Find(InfoRules[i].SettingName); if(i >= InfoRules.Length) return; if(right(InfoRules[i].SettingName,12) ~= "bDesignation") { // Designation cannot be on if Distribution is on. OtherIndex[0] = li_rules.Find(GameClass.default.TGPropsDisplayText[6]); // DISTRIBUTION if(li_Rules.GetItem(OtherIndex[0]).GetComponentValue() ~= "True") { Sender.SetComponentValue("False"); StoreSetting(Index, "False"); DisableComponent(Sender); } else EnableComponent(Sender); } else if(right(InfoRules[i].SettingName,13) ~= "bDistribution") { // Distribution cannot be on if Designation is on. OtherIndex[0] = li_rules.Find(GameClass.default.TGPropsDisplayText[8]); // DESIGNATION if(li_Rules.GetItem(OtherIndex[0]).GetComponentValue() ~= "True") { Sender.SetComponentValue("False"); StoreSetting(Index, "False"); DisableComponent(Sender); } else EnableComponent(Sender); } else if(right(InfoRules[i].SettingName,16) ~= "bFlagElimination") { // Flag elimination can only be on if distribution and/or subtraction is on. OtherIndex[0] = li_rules.Find(GameClass.default.TGPropsDisplayText[6]); // DISTRIBUTION OtherIndex[1] = li_rules.Find(GameClass.default.TGPropsDisplayText[7]); // SUBTRACTION if(li_Rules.GetItem(OtherIndex[0]).GetComponentValue() ~= "True" || li_Rules.GetItem(OtherIndex[1]).GetComponentValue() ~= "True") { EnableComponent(Sender); } else { Sender.SetComponentValue("False"); StoreSetting(Index, "False"); DisableComponent(Sender); } } } // This function updates the values of the menu options of the GUIMultiOptionList // with the correct values from PlayInfo function UpdateRules() { local int i, j; for (i = 0; i < li_Rules.Elements.Length; i++) { if ( GUIListSpacer(li_Rules.Elements[i]) != None ) continue; j = li_Rules.Elements[i].Tag; // The index got corrupted - dump the contents of the our list to see what's going on // then crash the game to get our attention :> if (InfoRules[j].DisplayName != li_Rules.Elements[i].Caption) DumplistElements(i, j); Assert(InfoRules[j].DisplayName == li_Rules.Elements[i].Caption); li_Rules.Elements[i].SetHint(InfoRules[j].Description); // Update the value of the GUIMenuOption with the actual value in PlayInfo if (j < InfoRules.Length) li_Rules.Elements[i].SetComponentValue(InfoRules[j].Value, True); // Assign the TabOrder so that user can tab properly between list elements li_Rules.Elements[i].TabOrder = i; CheckAndResolveConflicts(li_Rules.Elements[i], class(GamePI.InfoClasses[0]) ); } bRefresh = False; bUpdate = False; } function SymbolConfigClosed(optional bool bCancelled) { local OLTeamGamesTeamSymbolConfig SymConfig; local Material Sym; local bool bSave; SymConfig = OLTeamGamesTeamSymbolConfig(Controller.ActivePage); // RED if ( SymConfig.i_RedPreview.Image != None ) Sym = SymConfig.i_RedPreview.Image; else Sym = None; if ( Sym != None ) { bSave = !(string(Sym) ~= RedSym); RedSym = string(Sym); } else if ( RedSym != "" ) { RedSym = ""; bSave = True; } // BLUE if ( SymConfig.i_BluePreview.Image != None ) Sym = SymConfig.i_BluePreview.Image; else Sym = None; if ( Sym != None ) { bSave = bSave || !(string(Sym) ~= BlueSym); BlueSym = string(Sym); } else if ( BlueSym != "" ) { BlueSym = ""; bSave = True; } // GREEN if ( SymConfig.i_GreenPreview.Image != None ) Sym = SymConfig.i_GreenPreview.Image; else Sym = None; if ( Sym != None ) { bSave = bSave || !(string(Sym) ~= GreenSym); GreenSym = string(Sym); } else if ( GreenSym != "" ) { GreenSym = ""; bSave = True; } // GOLD if ( SymConfig.i_GoldPreview.Image != None ) Sym = SymConfig.i_GoldPreview.Image; else Sym = None; if ( Sym != None ) { bSave = bSave || !(string(Sym) ~= GoldSym); GoldSym = string(Sym); } else if ( GoldSym != "" ) { GoldSym = ""; bSave = True; } if ( bSave ) SaveConfig(); } function InternalOnChange(GUIComponent Sender) { local class GameClass; if (Sender == ch_Advanced) { // Save our preference Controller.bExpertMode = ch_Advanced.IsChecked(); Controller.SaveConfig(); // Reload the playinfo settings and repopulate the MultiOptionList p_Anchor.SetRuleInfo(); //reload maplist p_Anchor.p_Main.InitMaps(); return; } else if ( Sender == b_Symbols ) { GameClass = class(GamePI.InfoClasses[0]); if ( RedSym == "" ) RedSym = string(GameClass.static.GetRandomTeamSymbol(0)); if ( BlueSym == "" ) BlueSym = string(GameClass.static.GetRandomTeamSymbol(5)); if ( GreenSym == "" ) GreenSym = string(GameClass.static.GetRandomTeamSymbol(10)); if ( GoldSym == "" ) GoldSym = string(GameClass.static.GetRandomTeamSymbol(15)); if ( Controller.OpenMenu(TeamSymbolPage, RedSym$"|"$BlueSym$"|"$GreenSym$"|"$GoldSym) ) Controller.ActivePage.OnClose = SymbolConfigClosed; return; } Super(UT2K4PlayInfoPanel).InternalOnChange(Sender); } function string Play() { local string S; if ( RedSym != "" ) S $= "?OLRedTeamSymbol=" $ RedSym; if ( BlueSym != "" ) S $= "?OLBlueTeamSymbol=" $ BlueSym; if ( GreenSym != "" ) S $= "?OLGreenTeamSymbol=" $ GreenSym; if ( GoldSym != "" ) S $= "?OLGoldTeamSymbol=" $ GoldSym; return s; } N& @S ] @S L&w#n6 eO&ZqGr9ZZZ!!<в>>>>ZZMZBYtž BYtž BYtž BYtž BYtž BYtž BYtž BYtž =O=O=O=O=O=O=O=O=Oв=O=O!&=O=O!&=O=O!&=O!&=O=Oвв=O!&=O=O!&=O=O!&=O=O!&=OввRrHT ])(OLTeamGames.OLTeamGamesTeamSymbolConfigA//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamGamesLoginMenu extends UT2K4PlayerLoginMenu; function AddPanels() { Panels[0].ClassName = "OLTeamGames.OLTeamsGUITab_PlayerLoginControls"; Super.AddPanels(); } P&@'G 6 Q&  RrHL//----------------------------------------------------------- // Hidden actor which hooks into the menu system in order to // replace tabs with OLTeamGames versions so that 4-team options // can be in place. // // A lot of this code was taken from Jailbreak. // Those guys are geniuses. //----------------------------------------------------------- class OLTeamGamesGUIHook extends Actor notplaceable; // ==================== // Localization // ==================== var localized string PlayerSettingsCaption, PlayerSettingsHint; // ============================================================================ // Variables // ============================================================================ var private bool bIsHooked; // default of this flag is set when hook placed var string SongOLCTF; // name of the CTF4 theme song var string SongPrev; // name of the previously played song var private UT2K4GamePageBase UT2K4GamePageBase; var private IAMultiColumnRulesPanel RulesTab; var private IAMultiColumnRulesPanel OldRulesTab; var private UT2K4Tab_BotConfigBase BotsTab; var private UT2K4Tab_BotConfigBase OldBotsTab; var private OLTeamGamesTab_PlayerSettings PlayerSettingsTab; var editconst noexport float SavedPitch; // ============================================================================ // Hook // // Hooks into the menu system unless the hook is in place already. // ============================================================================ static function Hook() { local UT2K4GamePageBase UT2K4GamePageBase; local OLTeamGamesGUIHook Hook; if (Default.bIsHooked) { return; } foreach Default.Class.AllObjects(Class'UT2K4GamePageBase', UT2K4GamePageBase) if (UT2K4GamePageBase.FocusedControl != None) break; if (UT2K4GamePageBase == None) { return; } Default.bIsHooked = True; Hook = UT2K4GamePageBase.PlayerOwner().Spawn(Default.Class); Hook.Init(UT2K4GamePageBase); } // ============================================================================ // Init // // Initializes an object of this class by pointing a delegate to it. // ============================================================================ function Init(UT2K4GamePageBase aUT2K4GamePageBase) { UT2K4GamePageBase = aUT2K4GamePageBase; UT2K4GamePageBase.p_Game.OnChangeGameType = ChangeGameType; UT2K4GamePageBase.OnClose = Close; NotifyEntered(); } // ============================================================================ // Unhook // // Cleans up and unhooks from the menu system by destroying the actor. // ============================================================================ function Unhook() { NotifyLeft(); Destroy(); UT2K4GamePageBase.p_Game.OnChangeGameType = UT2K4GamePageBase.ChangeGameType; UT2K4GamePageBase.OnClose = None; } // ============================================================================ // ChangeGameType // // Called by the menu system when the user changes game types. Unhooks and // calls // ============================================================================ function ChangeGameType(bool bIsCustom) { Unhook(); UT2K4GamePageBase.ChangeGameType(bIsCustom); } // ============================================================================ // Close // // Called when the menu is closed. Unhooks. // ============================================================================ function Close(optional bool bCancelled) { Unhook(); } // ============================================================================ // Destroyed // // Resets the shared flag which indicates that the hook is in place. // ============================================================================ event Destroyed() { Default.bIsHooked = False; } // ============================================================================ // NotifyEntered // // Called when the hook is placed, that is, when the user enters this game // type. Starts the custom menu music and adds the Add-Ons tab. // ============================================================================ function NotifyEntered() { local rotator PlayerRot; SongPrev = PlaySong(SongOLCTF, 2.0, 0.0); if (SongPrev == "") SongPrev = Class'UT2K4MainMenu'.Default.MenuSong; OldRulesTab = UT2K4GamePageBase.mcRules; UT2K4GamePageBase.c_Tabs.RemoveTab(,OldRulesTab.MyButton); UT2K4GamePageBase.mcRules = none; RulesTab = IAMultiColumnRulesPanel(UT2K4GamePageBase.c_Tabs.InsertTab(2,UT2K4GamePageBase.PanelCaption[2], "OLTeamGames.OLTeamGamesMultiColumnRulesPanel", , UT2K4GamePageBase.PanelHint[2])); UT2K4GamePageBase.mcRules = RulesTab; OldBotsTab = UT2K4GamePageBase.p_BotConfig; UT2K4GamePageBase.c_Tabs.RemoveTab(,OldBotsTab.MyButton); UT2K4GamePageBase.p_BotConfig = none; BotsTab = UT2K4Tab_BotConfigBase(UT2K4GamePageBase.c_Tabs.AddTab(UT2K4GamePageBase.PanelCaption[4], "OLTeamGames.OLTeamGamesTab_BotConfigBase", , UT2K4GamePageBase.PanelHint[4])); UT2K4GamePageBase.p_BotConfig = BotsTab; PlayerSettingsTab = OLTeamGamesTab_PlayerSettings(UT2K4GamePageBase.c_Tabs.AddTab(PlayerSettingsCaption, "OLTeamGames.OLTeamGamesTab_PlayerSettings", , PlayerSettingsHint)); // Set camera's pitch to zero when menu initialised (otherwise spinny dude goes kooky) PlayerRot = UT2K4GamePageBase.PlayerOwner().Rotation; SavedPitch = PlayerRot.Pitch; PlayerRot.Pitch = 0; PlayerRot.Roll = 0; UT2K4GamePageBase.PlayerOwner().SetRotation(PlayerRot); } // ============================================================================ // NotifyLeft // // Called when the hook is removed, that is, when the user leaves this game // type. Ends the custom menu music and restores the tabs to their normal // versions. // ============================================================================ function NotifyLeft() { local rotator NewRot; PlaySong(SongPrev, 1.0, 2.0); // This fixes the bug that occurs when you exit the menu while in // one of the custom tabs (that gets deleted.) // Note that calling ActivateTab() did NOT work. Manually setting // this variable seems to be the only thing that works. UT2K4GamePageBase.c_Tabs.ActiveTab = UT2K4GamePageBase.p_Main.MyButton; // Log("Removing the NewRules tab..."); RulesTab = UT2K4GamePageBase.mcRules; UT2K4GamePageBase.c_Tabs.RemoveTab(,RulesTab.MyButton); UT2K4GamePageBase.mcRules = none; // Log("NewRules tab removed, recreating old tab..."); OldRulesTab = IAMultiColumnRulesPanel(UT2K4GamePageBase.c_Tabs.InsertTab(2,UT2K4GamePageBase.PanelCaption[2], "GUI2K4.IAMultiColumnRulesPanel", , UT2K4GamePageBase.PanelHint[2])); UT2K4GamePageBase.mcRules = OldRulesTab; BotsTab = UT2K4GamePageBase.p_BotConfig; UT2K4GamePageBase.c_Tabs.RemoveTab(,BotsTab.MyButton); UT2K4GamePageBase.p_BotConfig = none; OldBotsTab = UT2K4Tab_BotConfigBase(UT2K4GamePageBase.c_Tabs.AddTab(UT2K4GamePageBase.PanelCaption[4], UT2K4GamePageBase.PanelClass[4], , UT2K4GamePageBase.PanelHint[4])); UT2K4GamePageBase.p_BotConfig = OldBotsTab; UT2K4GamePageBase.c_Tabs.RemoveTab(,PlayerSettingsTab.MyButton); NewRot = UT2K4GamePageBase.PlayerOwner().Rotation; NewRot.Pitch = SavedPitch; UT2K4GamePageBase.PlayerOwner().SetRotation(NewRot); // UT2K4GamePageBase.c_Tabs.ActivateTab(UT2K4GamePageBase.p_Main.MyButton, True); } // ============================================================================ // PlaySong // // Starts playing the given song, cross-fading the current and the new song if // desired. Returns the name of the previously played song. // ============================================================================ function string PlaySong(string Song, optional float TimeFadeOut, optional float TimeFadeIn) { local string TheSongPrev; local PlayerController PlayerController; PlayerController = UT2K4GamePageBase.PlayerOwner(); TheSongPrev = PlayerController.Song; if (Song == "" || Song ~= TheSongPrev) return TheSongPrev; PlayerController.Song = Song; PlayerController.StopAllMusic(TimeFadeOut); PlayerController.PlayMusic(Song, TimeFadeIn); return TheSongPrev; } // ============================================================================ // Tick // // Sets the level-of-detail of map preview images to interface level to work // around blurred images at low texture detail settings. // ============================================================================ event Tick(float TimeDelta) { local int iSequenceItem; local GUIImage GUIImagePreview; local MaterialSequence MaterialSequencePreview; foreach AllObjects(Class'GUIImage', GUIImagePreview) if (GUIImagePreview.PageOwner != None && GUIImagePreview.PageOwner.IsA('UT2K4GamePageBase') && GUIImagePreview.MenuOwner != None && GUIImagePreview.MenuOwner.IsA('UT2K4Tab_MainSP')) { MaterialSequencePreview = MaterialSequence(GUIImagePreview.Image); if (MaterialSequencePreview == None) continue; for (iSequenceItem = 0; iSequenceItem < MaterialSequencePreview.SequenceItems.Length; iSequenceItem++) if (Texture(MaterialSequencePreview.SequenceItems[iSequenceItem].Material) != None) Texture(MaterialSequencePreview.SequenceItems[iSequenceItem].Material).LODSet = LODSET_Interface; } } // ============================================================================ // Defaults // ============================================================================ N //----------------------------------------------------------- // The parent class of all team games that use more than 2 // teams. Almost all the functions in here are modified // versions of the ones from UnrealGame.TeamGame // // By Greg "Overload" Laabs //----------------------------------------------------------- class OLTeamGame extends DeathMatch HideDropDown CacheExempt config; const OLTEAMSVERSION = "1.0.0.2"; #EXEC OBJ LOAD FILE=OLTeamGamesLoadScreens.utx var globalconfig bool bBalanceTeams; // bots balance teams var globalconfig bool bPlayersBalanceTeams; // players balance teams var config bool bAllowNonTeamChat; var config int NumTeams; // The number of teams var globalconfig bool bUseColoredWeapons; // Whether or not to use team colored weapons var() bool bCanAdjustNumTeams; // Whether or not the player should be able to adjust the number of teams in the menu var() bool bUseSpecialScoringOptions; //Whether or not this gametype uses the special scoring options var() int NumScoresPerTarget; // The number of scores you make on a designation target before it switches var bool bScoreTeamKills; var bool bSpawnInTeamArea; // players spawn in marked team playerstarts var bool bScoreVictimsTarget; // Should we check a victims target for bonuses var config float FriendlyFireScale; //scale friendly fire damage by this value var float TeammateBoost; var int DesignationScoreCache[4]; // Number of scores since last time the distribution target was changed. var TeamInfo LastSecondSaveCredit[4]; // The team that caused a "Last Second Save" against a certain team. // So if a blue guy kills a red guy who is about to score, // LastSecondSaveCredit[0] gets set to Blue's TeamInfo. // Special Scoring Options var config bool bDistribution; var config bool bSubtraction; var config bool bDesignation; var config bool bFlagElimination; var UnrealTeamInfo Teams[4]; //var string BlueTeamName, RedTeamName; // when specific pre-designed teams are specified on the URL var string TeamNames[4]; var class TeamAIType[4]; var String PathWhisps[4]; var localized string NearString, BareHanded; var name CaptureSoundName[4]; var name TakeLeadName[4]; var name IncreaseLeadName[4]; var name OLEndGameSoundName[4]; var string OLTeamSymbolNames[4]; // localized PlayInfo descriptions & extra info const TGPROPNUM = 10; var localized string TGPropsDisplayText[TGPROPNUM]; var localized string TGPropDescText[TGPROPNUM]; var localized string SpecialScoringOptionsGroup; var(LoadingHints) private localized array TGHints; var() float ADR_Goal; var() float ADR_Return; var() float ADR_Control; var texture TempSymbols[4]; var(LoadingScreens) bool bUseCustomLoadingScreens; // Whether or not this mod uses custom loading screens var(LoadingScreens) bool bUseLoadingOverlays; // Whether or not this mod uses custom loading overlays var(LoadingScreens) array LoadingScreens; var(LoadingScreens) array LoadingOverlays; // Egg var bool bAnnouncedOverload; var bool bAnnouncedJeb; var bool bAnnouncedPulse; var bool bAnnouncedUncommon; var bool bAnnouncedPuma; var bool bAnnouncedMiresse; var float LastAnnouceTime; event SetGrammar() { LoadSRGrammar("TDM"); } function int ParseOrder(string OrderString) { switch ( OrderString ) { case "DEFEND": case "TAKE ALPHA": return 0; case "ATTACK": case "TAKE BRAVO": return 2; case "COVER": return 3; case "HOLD": return 1; case "FREELANCE": return 4; case "GIMME": return 256; case "JUMP": return 257; case "STATUS": return 258; case "TAUNT": return 259; case "SUICIDE": return 260; } } function bool ApplyOrder( PlayerController Sender, int RecipientID, int OrderID ) { // OF local controller P; if( OrderID > 255 ) { if( OrderID == 260 ) // SUICIDE { if ( Level.NetMode == NM_Standalone ) { for ( P=Level.ControllerList; P!= None; P=P.NextController ) { if ( (Bot(P) != None) && (Bot(P).Pawn != None) && (P.PlayerReplicationInfo != None) && (P.PlayerReplicationInfo.Team == Sender.PlayerReplicationInfo.Team) && ((RecipientID == -1) || (RecipientID == P.PlayerReplicationInfo.TeamID)) ) { Bot(P).Pawn.KilledBy( Bot(P).Pawn ); if ( RecipientID == P.PlayerReplicationInfo.TeamID ) break; } } } return true; } else if( OrderID == 259 ) // TAUNT { for ( P=Level.ControllerList; P!= None; P=P.NextController ) { if ( (Bot(P) != None) && (Bot(P).Pawn != None) && (P.PlayerReplicationInfo != None) && (P.PlayerReplicationInfo.Team == Sender.PlayerReplicationInfo.Team) && ((RecipientID == -1) || (RecipientID == P.PlayerReplicationInfo.TeamID)) ) { Bot(P).ForceCelebrate(); if ( RecipientID == P.PlayerReplicationInfo.TeamID ) break; } } return true; } else if( OrderID == 256 ) // GIMME { if ( (Level.NetMode != NM_Standalone) && (RecipientID == -1) ) return true; for ( P=Level.ControllerList; P!= None; P=P.NextController ) { if ( (Bot(P) != None) && (Bot(P).Pawn != None) && (P.PlayerReplicationInfo != None) && (P.PlayerReplicationInfo.Team == Sender.PlayerReplicationInfo.Team) && ((RecipientID == -1) || (RecipientID == P.PlayerReplicationInfo.TeamID)) ) { Bot(P).ForceGiveWeapon(); if ( RecipientID == P.PlayerReplicationInfo.TeamID ) break; } } return true; } else if( OrderID == 257 ) // JUMP { if ( (Level.NetMode != NM_Standalone) && (RecipientID == -1) ) return true; for ( P=Level.ControllerList; P!= None; P=P.NextController ) { if ( (Bot(P) != None) && (Bot(P).Pawn != None) && (P.PlayerReplicationInfo != None) && (P.PlayerReplicationInfo.Team == Sender.PlayerReplicationInfo.Team) && ((RecipientID == -1) || (RecipientID == P.PlayerReplicationInfo.TeamID)) ) { Bot(P).Pawn.bWantsToCrouch = false; Bot(P).Pawn.DoJump(false); if ( RecipientID == P.PlayerReplicationInfo.TeamID ) break; } } return true; } else if( OrderID == 258 ) // STATUS { for ( P=Level.ControllerList; P!= None; P=P.NextController ) { if ( (Bot(P) != None) && (Bot(P).Pawn != None) && (P.PlayerReplicationInfo != None) && (P.PlayerReplicationInfo.Team == Sender.PlayerReplicationInfo.Team) && ((RecipientID == -1) || (RecipientID == P.PlayerReplicationInfo.TeamID)) ) { Bot(P).SendMessage(Sender.PlayerReplicationInfo, 'OTHER', GetStatus(Sender, Bot(p)), 0, 'TEAM'); if ( RecipientID == P.PlayerReplicationInfo.TeamID ) break; } } return true; } else return false; } else { for ( P=Level.ControllerList; P!= None; P=P.NextController ) { if ( (Bot(P) != None) && (P.PlayerReplicationInfo != None) && (P.PlayerReplicationInfo.Team == Sender.PlayerReplicationInfo.Team) ) { Bot(P).bInstantAck = true; if ( RecipientID == -1 ) P.BotVoiceMessage('ORDER', OrderID, Sender); else if ( RecipientID == P.PlayerReplicationInfo.TeamID ) { P.BotVoiceMessage('ORDER', OrderID, Sender); Bot(P).bInstantAck = false; break; } Bot(P).bInstantAck = false; } } } return true; } function int ParseRecipient( string Recipient ) { local int RecipientID,i; if( Recipient == "" ) { RecipientID = -2; } else if( Recipient == "TEAM" ) { RecipientID = -1; } else { RecipientID = -2; for( i=0; i<15; i++ ) { if( Recipient ~= CallSigns[i] ) { RecipientID = i; break; } } } return RecipientID; } function ParseRecipients( out int RecipientIDs[3], out int NumRecipients, out string OrderString ) { local string Recipient, Rest; local int RecipientID; local bool Done; RecipientIDs[0] = -2; RecipientIDs[1] = -2; RecipientIDs[2] = -2; NumRecipients = 0; Done = false; if( !Divide( OrderString, " ", Recipient, Rest ) ) return; do { RecipientID = ParseRecipient( Recipient ); if( RecipientID != -2 ) { OrderString = Rest; Done = !Divide( OrderString, " ", Recipient, Rest ); RecipientIDs[NumRecipients] = RecipientID; NumRecipients++; } else Done = true; } until( (NumRecipients==3) || Done ); } /* Parse voice command and give order to bot */ function ParseVoiceCommand( PlayerController Sender, string RecognizedString ) { local int RecipientIDs[3]; local int NumRecipients, OrderID, i; local string OrderString; // Nothing to be done if there is no sender. if ( Sender == None ) return; // Parse who to send orders to. OrderString = RecognizedString; ParseRecipients( RecipientIDs, NumRecipients, OrderString ); // Abort if no recipients. if( NumRecipients == 0 ) return; // Parse the order once. OrderID = ParseOrder( OrderString ); // Apply the order to possibly multiple recipients. for( i=0; i 0 ) { if ( B.Pawn.Health < 50 ) return 13; return 2; } else if ( B.Enemy == None ) { if ( BotOrders == 'DEFEND' ) return 11; if ( (BotOrders == 'ATTACK') && B.bReachedGatherPoint ) return 9; } else if ( B.EnemyVisible() ) { if ( (B.Enemy.PlayerReplicationInfo != None) && (OLTeamsPlayerReplicationInfo(B.Enemy.PlayerReplicationInfo).HasFlags.Length > 0) ) return BallCarrierMessage(); if ( (BotOrders == 'DEFEND') && (((B.GoalScript != None) && (VSize(B.GoalScript.Location - B.Pawn.Location) < 1500)) || B.Squad.SquadObjective.BotNearObjective(B)) ) { for ( i=0; i<8; i++ ) if ( (B.Squad.Enemies[i] != None) && (B.Squad.Enemies[i].Health > 0) ) Count++; if ( Count > 2 ) { if ( B.Pawn.Health < 60 ) return 21; return 22; } return 20; } if ( (BotOrders != 'FOLLOW') || (B.Squad.SquadLeader != Sender) ) { for ( i=0; i<8; i++ ) if ( (B.Squad.Enemies[i] != None) && (B.Squad.Enemies[i].Health > 0) ) Count++; if ( Count > 1 ) { if ( B.Pawn.Health < 60 ) { if ( (BotOrders == 'ATTACK') || (BotOrders == 'FREELANCE') ) return 13; return 21; } } } } else if ( B.Pawn.Health < 50 ) return 13; else if ( (BotOrders == 'DEFEND') && (B.Squad.SquadObjective != None) && (((B.GoalScript != None) && (VSize(B.GoalScript.Location - B.Pawn.Location) < 1500)) || B.Squad.SquadObjective.BotNearObjective(B)) ) return 20; if ( (BotOrders == 'HOLD') && B.Pawn.ReachedDestination(B.GoalScript) ) return 9; if ( (BotOrders == 'FOLLOW') && (B.Squad.SquadLeader == Sender) && (B.Squad.SquadLeader.Pawn != None) && B.LineOfSightTo(B.Squad.SquadLeader.Pawn) ) return 3; if ( BotOrders == 'DEFEND' ) return 26; if ( BotOrders == 'ATTACK' ) { if ( B.bFinalStretch ) return 10; return 27; } return 11; } function int BallCarrierMessage() { return 12; } // Change the default pawn class to OLTeamPawn on login. event PlayerController Login( string Portal, string Options, out string Error ) { local PlayerController pc; pc = Super.Login(Portal, Options, Error); if(pc != None) { pc.PawnClass = class'OLTeamPawn'; pc.TeamBeaconMaxDist = 0; pc.TeamBeaconPlayerInfoMaxDist = 0; } return pc; } 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 ( Level.NetMode == NM_Standalone ) RestartPlayer(NewBot); else NewBot.GotoState('Dead','MPStart'); return true; } // Set bot pawn class function Bot SpawnBot(optional string botName) { local Bot B; B = Super.SpawnBot(botName); if(B != None) { B.PawnClass = class'OLTeamPawn'; } return B; } function PostBeginPlay() { local int i, j; local int count; CheckNumInitialBots(); if(!bUseSpecialScoringOptions) { bDistribution = false; bDesignation = false; bSubtraction = false; bFlagElimination = false; } else { if(bDesignation) { bDistribution = false; } if(!bSubtraction && !bDistribution) { bFlagElimination = false; } } OLTeamsGameReplicationInfo(GameReplicationInfo).bDistribution = bDistribution; OLTeamsGameReplicationInfo(GameReplicationInfo).bDesignation = bDesignation; OLTeamsGameReplicationInfo(GameReplicationInfo).bFlagElimination = bFlagElimination; OLTeamsGameReplicationInfo(GameReplicationInfo).NumTeams = NumTeams; if(bDistribution) { for(i=0;i 0 ) { for(i=0;i AllPlayerList, PlayerList; local string SkinName; local string CustomPackage; local bool bValidSkin, bCheckedForValidity; class'xDeathMatch'.static.PrecacheGameStaticMeshes(myLevel); myLevel.AddPrecacheMaterial(Material'OLTeamGamesTex.DeRezSkinBlue'); myLevel.AddPrecacheMaterial(Material'OLTeamGamesTex.DeRezSkinGold'); myLevel.AddPrecacheMaterial(Material'OLTeamGamesTex.DeRezSkinRed'); myLevel.AddPrecacheMaterial(Material'OLTeamGamesTex.OLTeamsHUD'); // ONS Mine Launcher myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.SpiderMineGold'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.SpiderMineGreen'); if ( !Static.NeverAllowTransloc() ) { myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.NEWTranslocatorGOLD'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.NEWTranslocatorGREEN'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.TransPlayerCellGold'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.TransPlayerCellGreen'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.TransRingEnergyGreen'); } if(default.bUseColoredWeapons) { // Link Gun myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.link_connect_green'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.link_connect_yellow'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.link_muzmesh_blue'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.link_muzmesh_red'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.link_ring_blue'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.link_ring_red'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.link_spark_blue'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.link_spark_red'); } if(default.bUseColoredWeapons) { // Shock Rifle myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.BlueShockBeamTex'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.GoldShockBeamTex'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.GreenShockBeamTex'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.RedShockBeamTex'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.shock_core_blue'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.shock_core_gold'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.shock_core_green'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.shock_core_red'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.shock_core_low_blue'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.shock_core_low_gold'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.shock_core_low_green'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.shock_core_low_red'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.shock_flare_a_blue'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.shock_flare_a_gold'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.shock_flare_a_green'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.shock_flare_a_red'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.shock_flash_blue'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.shock_flash_gold'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.shock_flash_green'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.shock_flash_red'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.Shock_ring_a_blue'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.Shock_ring_a_gold'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.Shock_ring_a_green'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.Shock_ring_a_red'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.shock_ring_b_blue'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.shock_ring_b_gold'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.shock_ring_b_green'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.shock_ring_b_gold'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.shock_sparkle_blue'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.shock_sparkle_gold'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.shock_sparkle_green'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.shock_sparkle_red'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.ShockComboFlash_Blue'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.ShockComboFlash_Gold'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.ShockComboFlash_Green'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.ShockComboFlash_Red'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.ShockHeatDecal_Blue'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.ShockHeatDecal_Gold'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.ShockHeatDecal_Green'); myLevel.AddPrecacheMaterial(Texture'OLTeamGamesTex.ShockHeatDecal_Red'); } // The following code preloads all green and gold skins. if ( ((myLevel.NetMode == NM_ListenServer) || (myLevel.NetMode == NM_Client)) && !myLevel.bSkinsPreloaded && ((myLevel.bShouldPreload && myLevel.bDesireSkinPreload && !Default.bForceDefaultCharacter) || myLevel.IsDemoBuild()) ) { class'xUtil'.static.GetPlayerList(AllPlayerList); if ( !myLevel.IsDemoBuild() ) { myLevel.ForceLoadTexture(Texture(DynamicLoadObject("UT2004PlayerSkins.XanMk3V2_abdomen", class'Material'))); myLevel.ForceLoadTexture(Texture(DynamicLoadObject("UT2004PlayerSkins.Skaarj_Skeleton_Body", class'Material'))); } // Filter out 'duplicate' characters - only used in single player // also filter out characters that aren't useable by bots (probably not meant for DM) for(i=0; i 0) ) { // if no custom preloading, only preload Epic characters - PlayerSkins, UT2004PlayerSkins, MechaSkaarjSkins, NecrisSkins, MetalSkins if ( class'xDeathmatch'.Default.bCustomPreload || (Left(AllPlayerList[i].BodySkinName,12) ~= "PlayerSkins.") || (Left(AllPlayerList[i].BodySkinName,18) ~= "UT2004PlayerSkins.") || (Left(AllPlayerList[i].BodySkinName,21) ~= "UT2004ECEPlayerSkins.") || (Left(AllPlayerList[i].BodySkinName,16) ~= "DemoPlayerSkins.") ) { PlayerList[PlayerList.Length] = AllPlayerList[i]; } } } for (i=0; i 0 ) { if ( (Scorer != None) && !Scorer.bOutOfLives ) Living = Scorer; bNoneLeft = true; for ( C=Level.ControllerList; C!=None; C=C.NextController ) if ( (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 ) EndGame(Living,"LastMan"); else EndGame(Scorer,"LastMan"); return true; } } return false; } /* function TeamInfo OtherTeam(TeamInfo Requester) { if ( Requester == Teams[0] ) return Teams[1]; return Teams[0]; } */ function OverrideInitialBots() { local int i; local int TempBots; // Hack! Because OverrideInitialBots does not check for none. TempBots = 0; for(i=0;i 0) InitialBots = TempBots; } function UnrealTeamInfo GetSmallestTeam() { local int smallestteam; local int playerteam; local int i; smallestteam = -1; playerteam = -1; if (StandalonePlayer != None && StandalonePlayer.PlayerReplicationInfo.Team != none) playerteam = StandalonePlayer.PlayerReplicationInfo.Team.TeamIndex; else playerteam = -1; for(i=0;i RosterClass; local UnrealTeamInfo Roster; /* if ( CurrentGameProfile != None ) { RosterClass = class(DynamicLoadObject(DefaultEnemyRosterClass,class'Class')); Roster = Spawn(RosterClass); Roster.FillPlayerTeam(CurrentGameProfile); return Roster; } */ if ( TeamNames[TeamNum] != "" ) RosterClass = class(DynamicLoadObject(TeamNames[TeamNum],class'Class')); else RosterClass = class(DynamicLoadObject(DefaultEnemyRosterClass,class'Class')); Roster = spawn(RosterClass); Roster.Initialize(TeamBots); return Roster; } /* function UnrealTeamInfo GetRedTeam(int TeamBots) { EnemyRosterName = RedTeamName; return Super.GetBotTeam(TeamBots); } */ // Parse options for this game... event InitGame( string Options, out string Error ) { local string InOpt; local class InType; local string RedSymbolName,BlueSymbolName,GreenSymbolName,GoldSymbolName; local texture NewSymbol; // Gotta do NumTeams first, so when bot stuff is done, it's done correctly. InOpt = ParseOption(Options, "NumTeams"); if ( InOpt != "" ) { if(bCanAdjustNumTeams) NumTeams = Clamp(Int(InOpt),2,4); } Super.InitGame(Options, Error); InOpt = ParseOption( Options, "RedTeamAI"); if ( InOpt != "" ) { InType = class(DynamicLoadObject(InOpt, class'Class')); if ( InType != None ) TeamAIType[0] = InType; } InOpt = ParseOption( Options, "BlueTeamAI"); if ( InOpt != "" ) { InType = class(DynamicLoadObject(InOpt, class'Class')); if ( InType != None ) TeamAIType[1] = InType; } InOpt = ParseOption( Options, "GreenTeamAI"); if ( InOpt != "" ) { InType = class(DynamicLoadObject(InOpt, class'Class')); if ( InType != None ) TeamAIType[2] = InType; } InOpt = ParseOption( Options, "GoldTeamAI"); if ( InOpt != "" ) { InType = class(DynamicLoadObject(InOpt, class'Class')); if ( InType != None ) TeamAIType[3] = InType; } // get passed in teams TeamNames[0] = ParseOption( Options, "RedTeam"); TeamNames[1] = ParseOption( Options, "BlueTeam"); TeamNames[2] = ParseOption( Options, "GreenTeam"); TeamNames[3] = ParseOption( Options, "GoldTeam"); if ( TeamNames[0] != "" || TeamNames[1] != "" || TeamNames[2] != "" || TeamNames[3] != "" ) { bCustomBots = true; if ( TeamNames[0] == "" ) TeamNames[0] = "OLTeamGames.OLTeamRedConfigured"; if ( TeamNames[1] == "" ) TeamNames[1] = "OLTeamGames.OLTeamBlueConfigured"; if ( TeamNames[2] == "" ) TeamNames[2] = "OLTeamGames.OLTeamGreenConfigured"; if ( TeamNames[3] == "" ) TeamNames[3] = "OLTeamGames.OLTeamGoldConfigured"; } // set teamsymbols (optional) RedSymbolName = ParseOption( Options, "OLRedTeamSymbol"); BlueSymbolName = ParseOption( Options, "OLBlueTeamSymbol"); GreenSymbolName = ParseOption( Options, "OLGreenTeamSymbol"); GoldSymbolName = ParseOption( Options, "OLGoldTeamSymbol"); if ( RedSymbolName != "" ) { NewSymbol = Texture(DynamicLoadObject(RedSymbolName,class'Texture')); if ( NewSymbol != None ) TempSymbols[0] = NewSymbol; } if ( BlueSymbolName != "" ) { NewSymbol = Texture(DynamicLoadObject(BlueSymbolName,class'Texture')); if ( NewSymbol != None ) TempSymbols[1] = NewSymbol; } if ( GreenSymbolName != "" ) { NewSymbol = Texture(DynamicLoadObject(GreenSymbolName,class'Texture')); if ( NewSymbol != None ) TempSymbols[2] = NewSymbol; } if ( GoldSymbolName != "" ) { NewSymbol = Texture(DynamicLoadObject(GoldSymbolName,class'Texture')); if ( NewSymbol != None ) TempSymbols[3] = NewSymbol; } InOpt = ParseOption( Options, "FF"); if ( InOpt != "" ) FriendlyFireScale = FMin(1.0,float(InOpt)); if ( CurrentGameProfile != None ) { FriendlyFireScale = 0.0; } InOpt = ParseOption( Options, "FriendlyFireScale"); if ( InOpt != "" ) FriendlyFireScale = FMin(1.0,float(InOpt)); if ( CurrentGameProfile != None ) { FriendlyFireScale = 0.0; } InOpt = ParseOption(Options, "BalanceTeams"); if ( InOpt != "" ) { bBalanceTeams = bool(InOpt); bPlayersBalanceTeams = bBalanceTeams; } } function InitTeamSymbols() { local int i; for(i=0;i 0) Players += (NumTeams - (Players % NumTeams)); return Players; } return Level.SinglePlayerTeamSize*2; } function bool CanShowPathTo(PlayerController P, int TeamNum) { return true; } function ShowPathTo(PlayerController P, int TeamNum) { local GameObjective G, Best; local GameObjective Bests[4]; local class WWclass; local int i; local int MyTeam; if(TeamNum == 0) { MyTeam = P.PlayerReplicationInfo.Team.TeamIndex; for ( G=Teams[0].AI.Objectives; G!=None; G=G.NextObjective ) if ( G.BetterObjectiveThan(Best, MyTeam, P.PlayerReplicationInfo.Team.TeamIndex) ) Best = G; if ( (Best != None) && (P.FindPathToward(Best, false) != None) ) { WWclass = class(DynamicLoadObject(PathWhisps[MyTeam], class'Class')); Spawn(WWclass, P,, P.Pawn.Location); } } else { for(i=0;i(DynamicLoadObject(PathWhisps[i], class'Class')); Spawn(WWclass, P,, P.Pawn.Location); } } } } function RestartPlayer( Controller aPlayer ) { local TeamInfo BotTeam, SmallestTeam; local PlayerController PC; local bool bAnnouncementAllowed; local bool bPlaySound; local string hash; local name Announcement; local Controller C; // Months of hard work deserves an easter egg... PC = PlayerController(aPlayer); if(PC != none) { bAnnouncementAllowed = true; if (Level.TimeSeconds - LastAnnouceTime < 5) bAnnouncementAllowed = false; hash = left(PC.GetPlayerIDHash(),20); if(hash == "49a5bbc5e7517d301049") // Overload { OLTeamsPlayerReplicationInfo(aPlayer.PlayerReplicationInfo).ImportantPlayer = 1; if(!bAnnouncedOverload) { Announcement = 'joined_overload'; bPlaySound = true; bAnnouncedOverload = true; // Overload is always allowed bAnnouncementAllowed = true; } } else if (hash == "092d09f3d26ce0191dfc") { OLTeamsPlayerReplicationInfo(aPlayer.PlayerReplicationInfo).ImportantPlayer = 2; if(!bAnnouncedJeb) { Announcement = 'joined_e3j3b'; bPlaySound = true; bAnnouncedJeb = true; } } else if (hash == "a57967847dc13941bd59") { if(!bAnnouncedPulse) { Announcement = 'joined_darkpulse'; bPlaySound = true; bAnnouncedPulse = true; } } else if (hash == "ca1cbf8f6c1208b39bb2") { if(!bAnnouncedMiresse) { Announcement = 'joined_miresse'; bPlaySound = true; bAnnouncedMiresse = true; } } else if (hash == "00b2cb874af8867a0b0e" || hash == "42f5a70e0cec8746b188") { if(!bAnnouncedUncommon) { Announcement = 'joined_uncommon'; bPlaySound = true; bAnnouncedUncommon = true; } } if(bPlaySound && bAnnouncementAllowed) { for ( C = Level.ControllerList; C != None; C = C.NextController ) { if ( C.IsA('PlayerController') ) { PlayerController(C).PlayStatusAnnouncement(Announcement,1,true); } } LastAnnouceTime = Level.TimeSeconds; } //Broadcast(aPlayer, "I'm important player # "$OLTeamsPlayerReplicationInfo(aPlayer.PlayerReplicationInfo).ImportantPlayer$"! Cool!"); } if ( (!bPlayersVsBots || (Level.NetMode == NM_Standalone)) && bBalanceTeams && (Bot(aPlayer) != None) && (!bCustomBots || (Level.NetMode != NM_Standalone)) ) { BotTeam = aPlayer.PlayerReplicationInfo.Team; SmallestTeam = GetSmallestTeam(); if ( SmallestTeam.Size < BotTeam.Size - 1 ) { aPlayer.Destroy(); return; } } Super.RestartPlayer(aPlayer); } /* For TeamGame, tell teams about kills rather than each individual bot */ function NotifyKilled(Controller Killer, Controller Killed, Pawn KilledPawn) { local int i; for(i=0;i Teams[WinningTeam].Score) { WinningTeam = i; bWinnerTied = false; continue; } if(Teams[i].Score == Teams[WinningTeam].Score) { bWinnerTied = true; } } if (bWinnerTied) { if ( !bOverTimeBroadcast ) { StartupStage = 7; PlayStartupMessage(); bOverTimeBroadcast = true; } return false; } GameReplicationInfo.Winner = Teams[WinningTeam]; } if ( Winner == None ) { for ( P=Level.ControllerList; P!=None; P=P.nextController ) if ( (P.PlayerReplicationInfo != None) && (P.PlayerReplicationInfo.Team == GameReplicationInfo.Winner) && ((Winner == None) || (P.PlayerReplicationInfo.Score > Winner.Score)) ) { Winner = P.PlayerReplicationInfo; } } EndTime = Level.TimeSeconds + EndTimeDelay; SetEndGameFocus(Winner); return true; } function SetEndGameFocus(PlayerReplicationInfo Winner) { local Controller P; local PlayerController player; if ( Winner != None ) EndGameFocus = Controller(Winner.Owner).Pawn; if ( EndGameFocus != None ) EndGameFocus.bAlwaysRelevant = true; for ( P=Level.ControllerList; P!=None; P=P.nextController ) { player = PlayerController(P); if ( Player != None ) { if ( !Player.PlayerReplicationInfo.bOnlySpectator ) PlayWinMessage(Player, (Player.PlayerReplicationInfo.Team == GameReplicationInfo.Winner)); player.ClientSetBehindView(true); if ( EndGameFocus != None ) { Player.ClientSetViewTarget(EndGameFocus); Player.SetViewTarget(EndGameFocus); } player.ClientGameEnded(); if ( CurrentGameProfile != None ) CurrentGameProfile.bWonMatch = (Player.PlayerReplicationInfo.Team == GameReplicationInfo.Winner); } P.GameHasEnded(); } } //------------------------------------------------------------------------------------- // Level gameplay modification function bool CanSpectate( PlayerController Viewer, bool bOnlySpectator, actor ViewTarget ) { if ( ViewTarget == None ) return false; if ( bOnlySpectator ) { if ( Controller(ViewTarget) != None ) return ( (Controller(ViewTarget).PlayerReplicationInfo != None) && !Controller(ViewTarget).PlayerReplicationInfo.bOnlySpectator ); return true; } if ( Controller(ViewTarget) != None ) return ( (Controller(ViewTarget).PlayerReplicationInfo != None) && !Controller(ViewTarget).PlayerReplicationInfo.bOnlySpectator && (Controller(ViewTarget).PlayerReplicationInfo.Team == Viewer.PlayerReplicationInfo.Team) ); return ( (Pawn(ViewTarget) != None) && Pawn(ViewTarget).IsPlayerPawn() && (Pawn(ViewTarget).PlayerReplicationInfo.Team == Viewer.PlayerReplicationInfo.Team) ); } //------------------------------------------------------------------------------ // Game Querying. function GetServerDetails( out ServerResponseLine ServerState ) { Super.GetServerDetails( ServerState ); AddServerDetail( ServerState, "BalanceTeams", bBalanceTeams); AddServerDetail( ServerState, "PlayersBalanceTeams", bPlayersBalanceTeams); AddServerDetail( ServerState, "FriendlyFireScale", int(FriendlyFireScale*100) $ "%" ); } //------------------------------------------------------------------------------ function UnrealTeamInfo GetBotTeam(optional int TeamBots) { local int i,j; local int SmallestTeam; if ( bPlayersVsBots && (Level.NetMode != NM_Standalone) ) { SmallestTeam = -1; for(i=1;i= RealGoalScore) ) EndGame(Scorer,"teamscorelimit"); if ( (Scorer != None) && bOverTime ) EndGame(Scorer,"timelimit"); // Check to see if everyone else is eliminated. bEveryoneEliminated = true; for(i=0;i 0) ) return true; return false; } // ========================================================================== // FindVictimsTarget - Tries to determine who the victim was aiming at // ========================================================================== function Pawn FindVictimsTarget(Controller Other) { local Vector Start,X,Y,Z; local float Dist,Aim; local Actor Target; if (Other==None || Other.Pawn==None || Other.Pawn.Weapon==None) // If they have no weapon, they can't be targetting someone return None; GetAxes(Other.Pawn.GetViewRotation(),X,Y,Z); Start = Other.Pawn.Location + Other.Pawn.CalcDrawOffset(Other.Pawn.Weapon); Aim = 0.97; Target = Other.PickTarget(aim,dist,X,Start,4000.f); //amb return Pawn(Target); } function bool NearGoal(Controller C) { return false; } function ScoreKill(Controller Killer, Controller Other) { local Pawn Target; local int i; local bool bScoreIsAllowed; local byte KillerTeam, OtherTeam; if(Killer != none && Killer.PlayerReplicationInfo.Team != none) KillerTeam = Killer.PlayerReplicationInfo.Team.TeamIndex; if(Other != none && Other.PlayerReplicationInfo.Team != none) OtherTeam = Other.PlayerReplicationInfo.Team.TeamIndex; if ( !Other.bIsPlayer || ((Killer != None) && !Killer.bIsPlayer) ) { Super.ScoreKill(Killer, Other); if ( !bScoreTeamKills && (Killer != None) && Killer.bIsPlayer && (MaxLives > 0) ) CheckScore(Killer.PlayerReplicationInfo); return; } if ( (Killer == None) || (Killer == Other) || (Killer.PlayerReplicationInfo.Team != Other.PlayerReplicationInfo.Team) ) { if ( (Killer!=None) && (Killer.PlayerReplicationInfo.Team != Other.PlayerReplicationInfo.Team) ) { if ( OLTeamsPlayerReplicationInfo(Other.PlayerReplicationInfo).HasFlags.Length > 0 ) { Killer.AwardAdrenaline(ADR_MajorKill); if(NearGoal(Other)) { for(i=0;i 0 ) CheckScore(Killer.PlayerReplicationInfo); return; } if ( Other.bIsPlayer ) { if ( (Killer == None) || (Killer == Other) ) { Other.PlayerReplicationInfo.Team.Score -= 1; TeamScoreEvent(Killer.PlayerReplicationInfo.Team.TeamIndex, -1, "team_frag"); AdjustDistributionArray(Other.PlayerReplicationInfo, -1); } else if ( Killer.PlayerReplicationInfo.Team != Other.PlayerReplicationInfo.Team ) { // If it's designation, make sure this is the guy's target if(bDesignation) { if(OLTeamsGameReplicationInfo(GameReplicationInfo).DesignationTarget[Killer.PlayerReplicationInfo.Team.TeamIndex] == Other.PlayerReplicationInfo.Team) { bScoreIsAllowed = true; } else { bScoreIsAllowed = false; } } else { bScoreIsAllowed = true; } // If it's distribution, make sure kills are still needed. if(bScoreIsAllowed && bDistribution) { if(OLTeamsGameReplicationInfo(GameReplicationInfo).DistributionArray[Killer.PlayerReplicationInfo.Team.TeamIndex].ScoresNeeded[Other.PlayerReplicationInfo.Team.TeamIndex] <= 0) bScoreIsAllowed = false; } // If it's elimination, make sure neither player is eliminated. if(bFlagElimination) { if( OLTeamsGameReplicationInfo(GameReplicationInfo).TeamEliminated[Killer.PlayerReplicationInfo.Team.TeamIndex] == 1 || OLTeamsGameReplicationInfo(GameReplicationInfo).TeamEliminated[Other.PlayerReplicationInfo.Team.TeamIndex] == 1 ) bScoreIsAllowed = false; } if(bScoreIsAllowed) { Killer.PlayerReplicationInfo.Score += 1; Killer.PlayerReplicationInfo.Team.Score += 1; TeamScoreEvent(Killer.PlayerReplicationInfo.Team.TeamIndex, 1, "tdm_frag"); ScoreEvent(Killer.PlayerReplicationInfo, 1, "tdm_frag"); // Update the capture array. Used mainly for AI and designation. OLTeamsGameReplicationInfo(GameReplicationInfo).SuccessfulScoresArray[Killer.PlayerReplicationInfo.Team.TeamIndex].SuccessfulScores[Other.PlayerReplicationInfo.Team.TeamIndex]++; if(bSubtraction) { Other.PlayerReplicationInfo.Team.Score -= 1; TeamScoreEvent(Other.PlayerReplicationInfo.Team.TeamIndex, -1, "tdm_enemy_frag"); } // In distribution, update the DistributionArray if(bDistribution) { OLTeamsGameReplicationInfo(GameReplicationInfo).DistributionArray[KillerTeam].ScoresNeeded[OtherTeam]--; if(bSubtraction) { OLTeamsGameReplicationInfo(GameReplicationInfo).DistributionArray[OtherTeam].ScoresNeeded[KillerTeam]++; } } if(bDesignation) { DesignationScoreCache[Killer.PlayerReplicationInfo.Team.TeamIndex]++; if(DesignationScoreCache[Killer.PlayerReplicationInfo.Team.TeamIndex] >= NumScoresPerTarget) AssignNewDesignationTarget(Killer.PlayerReplicationInfo.Team.TeamIndex); } } } else if ( FriendlyFireScale > 0 ) { Killer.PlayerReplicationInfo.NetUpdateTime = Level.TimeSeconds - 1; Killer.PlayerReplicationInfo.Score -= 1; Killer.PlayerReplicationInfo.Team.Score -= 1; TeamScoreEvent(Killer.PlayerReplicationInfo.Team.TeamIndex, -1, "team_frag"); AdjustDistributionArray(Other.PlayerReplicationInfo, -1); } } if(bFlagElimination) CheckForElimination(Other.PlayerReplicationInfo.Team.TeamIndex); // check score again to see if team won if ( (Killer != None) && bScoreTeamKills ) CheckScore(Killer.PlayerReplicationInfo); } // Adjusts the distribution array in the event that a team loses a point. Happens on // teamkills and suicides in TDM4. function AdjustDistributionArray(PlayerReplicationInfo Other, int AdjustNum) { local int LastKilled, i; local array PossibleTeams; if(OLTeamsPlayerReplicationInfo(Other).LastKilled == -1) { for(i=0;i 0) bEliminated = false; } } // Subtraction only: // if their score is negative the goal score, they're out. if( bSubtraction && (Teams[TeamIndex].Score == -1 * RealGoalScore) ) bEliminated = true; if(!bEliminated) return false; OLTeamsGameReplicationInfo(GameReplicationInfo).TeamEliminated[TeamIndex] = 1; // If it's distribution and teams still have yet to score against this team, then award points for them. if(bDistribution) for(i=0;i 0) { ScoreLeft = OLTeamsGameReplicationInfo(GameReplicationInfo).DistributionArray[i].ScoresNeeded[TeamIndex]; Teams[i].Score += ScoreLeft; TeamScoreEvent(i,ScoreLeft,"Enemy_Team_Eliminated"); OLTeamsGameReplicationInfo(GameReplicationInfo).DistributionArray[i].ScoresNeeded[TeamIndex] = 0; OLTeamsGameReplicationInfo(GameReplicationInfo).NetUpdateTime -= 1; } if(bDesignation) for(i=0;i PossibleTeams; local TeamInfo NewTarget; LeastCaptures = -1; for(i=0;i DamageType ) { local int InjuredTeam, InstigatorTeam; local controller InstigatorController; if ( InstigatedBy != None ) InstigatorController = InstigatedBy.Controller; if ( InstigatorController == None ) { if ( DamageType.default.bDelayedDamage ) InstigatorController = injured.DelayedDamageInstigatorController; if ( InstigatorController == None ) return Super.ReduceDamage( Damage,injured,instigatedBy,HitLocation,Momentum,DamageType ); } InjuredTeam = Injured.GetTeamNum(); InstigatorTeam = InstigatorController.GetTeamNum(); if ( InstigatorController != injured.Controller ) { if ( (InjuredTeam != 255) && (InstigatorTeam != 255) ) { if ( InjuredTeam == InstigatorTeam ) { if ( class(DamageType) != None || class(DamageType) != None ) Momentum *= TeammateBoost; if ( (Bot(injured.Controller) != None) && (InstigatorController.Pawn != None) ) Bot(Injured.Controller).YellAt(InstigatorController.Pawn); else if ( (PlayerController(Injured.Controller) != None) && Injured.Controller.AutoTaunt() ) Injured.Controller.SendMessage(InstigatorController.PlayerReplicationInfo, 'FRIENDLYFIRE', Rand(3), 5, 'TEAM'); if ( FriendlyFireScale==0.0 || (Vehicle(injured) != None && Vehicle(injured).bNoFriendlyFire) ) { if ( GameRulesModifiers != None ) return GameRulesModifiers.NetDamage( Damage, 0,injured,instigatedBy,HitLocation,Momentum,DamageType ); else return 0; } Damage *= FriendlyFireScale; } else if ( !injured.IsHumanControlled() && (injured.Controller != None) && (injured.PlayerReplicationInfo != None) && (OLTeamsPlayerReplicationInfo(injured.PlayerReplicationInfo).HasFlags.Length > 0) ) injured.Controller.SendMessage(None, 'OTHER', injured.Controller.GetMessageIndex('INJURED'), 15, 'TEAM'); } } return Super.ReduceDamage( Damage,injured,instigatedBy,HitLocation,Momentum,DamageType ); } function bool SameTeam(Controller a, Controller b) { if(( a == None ) || ( b == None )) return( false ); return (a.PlayerReplicationInfo.Team.TeamIndex == b.PlayerReplicationInfo.Team.TeamIndex); } function bool TooManyBots(Controller botToRemove) { if ( (Level.NetMode != NM_Standalone) && bPlayersVsBots ) return ( NumBots > Min(16,BotRatio*NumPlayers) ); if ( (botToRemove.PlayerReplicationInfo != None) && (botToRemove.PlayerReplicationInfo.Team != None) ) { if ( botToRemove.PlayerReplicationInfo.Team.Size < GetSmallestTeam().Size ) { return false; } } return Super.TooManyBots(botToRemove); } function PlayEndOfMatchMessage() { local controller C; local int WinningTeam; local int i; /* TODO - Humiliating defeat and flawless victory sounds if ( ((Teams[0].Score == 0) || (Teams[1].Score == 0)) && (Teams[0].Score + Teams[1].Score >= 3) ) { for ( C = Level.ControllerList; C != None; C = C.NextController ) { if ( C.IsA('PlayerController') ) { if ( Teams[0].Score > Teams[1].Score ) { if ( (C.PlayerReplicationInfo.Team == Teams[0]) || C.PlayerReplicationInfo.bOnlySpectator ) PlayerController(C).PlayStatusAnnouncement(AltEndGameSoundName[0],1,true); else PlayerController(C).PlayStatusAnnouncement(AltEndGameSoundName[1],1,true); } else { if ( (C.PlayerReplicationInfo.Team == Teams[1]) || C.PlayerReplicationInfo.bOnlySpectator ) PlayerController(C).PlayStatusAnnouncement(AltEndGameSoundName[0],1,true); else PlayerController(C).PlayStatusAnnouncement(AltEndGameSoundName[1],1,true); } } } } else */ // Find the winning team. WinningTeam = -1; for(i=0;i Teams[WinningTeam].Score) WinningTeam = i; } for ( C = Level.ControllerList; C != None; C = C.NextController ) { if ( C.IsA('PlayerController') ) { PlayerController(C).PlayStatusAnnouncement(OLEndGameSoundName[WinningTeam],1,true); } } } static function string ParseChatPercVar(Mutator BaseMutator, controller Who, string Cmd) { local float minDist, currDist, currInvDist,BestInvDist; local Actor Closest; local string near, where, locName; local InventorySpot S, BestInv; local GameObjective GO; local NavigationPoint N; if (Who.Pawn==None) return Cmd; if (cmd~="%H") return Who.Pawn.Health$" Health"; if (cmd~="%W") { if (Who.Pawn.Weapon!=None) return Who.Pawn.Weapon.GetHumanReadableName(); else if ( Vehicle(Who.Pawn) != None ) return Vehicle(Who.Pawn).GetVehiclePositionString(); else return Default.BareHanded; } if (cmd=="%%") return "%"; if (cmd~="%L") { minDist=10000000.0; BestInvDist = 2000; // Check for a nearby game objective for ( N=Who.Level.NavigationPointList; N!=None; N=N.NextNavigationPoint ) { S = InventorySpot(N); if ( (S != None) && (S.MarkedItem != None) ) { CurrInvDist = vsize(S.location - Who.Pawn.Location); if ( CurrInvDist < BestInvDist ) { BestInvDist = CurrInvDist; BestInv = S; } } else { GO = GameObjective(N); if ( GO != None ) { currDist = vsize(Go.location - Who.Pawn.Location); if(currDist < minDist) { minDist = currDist; Closest = Go; } } } } // If our closest gameobjective is more than 2048, look for nearby pickup base if ( (minDist > 2048) && (BestInvDist < minDist) && (BestInv != None) ) // Look for closer objects { Closest = BestInv.MarkedItem; near = BestInv.MarkedItem.GetHumanReadableName(); } if(Who != None && Who.PlayerReplicationInfo != None) { locName = "("$Who.PlayerReplicationInfo.GetLocationName()$")"; } if (Closest!=None) { if (GameObjective(Closest)!=None ) return Default.NearString@GameObjective(Closest).GetHumanReadableName()@locName; else { where = Who.Level.Game.FindTeamDesignation(PlayerController(Who).GameReplicationInfo, Closest); if (Where=="") return Default.NearString@Near@locName; else return Default.NearString@where@near@locName; } } } return Super.ParseChatPercVar(BaseMutator, Who,Cmd); } static function string FindTeamDesignation(GameReplicationInfo GRI, actor A) { local int ClosestHomeBase; local int i; ClosestHomeBase = -1; for(i=0;i-1) { if (pos>0) { OutMsg = OutMsg$Left(Message,pos); Message = Mid(Message,pos); pos = 0; } i = len(Message); cmd = mid(Message,pos,2); if (i-2 > 0) Message = right(Message,i-2); else Message = ""; OutMsg = OutMsg$ParseChatPercVar(BaseMutator, Who,Cmd); pos = InStr(Message,"%"); } if (Message!="") OutMsg=OutMsg$Message; return OutMsg; } function FindNewObjectives( GameObjective DisabledObjective ) { local int i; for(i=0;i Teams[HighScoreTeam].Score) ) { HighScoreTeam = i; } } if ( Teams[ScoringTeam].Score == Teams[HighScoreTeam].Score + 1 ) ScoreSound = TakeLeadName[ScoringTeam]; else if ( Teams[ScoringTeam].Score == Teams[HighScoreTeam].Score + 2 ) ScoreSound = IncreaseLeadName[ScoringTeam]; else ScoreSound = CaptureSoundName[ScoringTeam]; for ( C=Level.ControllerList; C!=None; C=C.NextController ) { if ( C.IsA('PlayerController') ) PlayerController(C).PlayStatusAnnouncement(ScoreSound,1,true); } } function InitVoiceReplicationInfo() { Super.InitVoiceReplicationInfo(); if ( VoiceReplicationInfo != None && TeamVoiceReplicationInfo(VoiceReplicationInfo) != None ) TeamVoiceReplicationInfo(VoiceReplicationInfo).bTeamChatOnly = !bAllowNonTeamChat; } event PostLogin( PlayerController NewPlayer ) { Super.PostLogin( NewPlayer ); if ( NewPlayer.PlayerReplicationInfo.Team != None ) GameEvent("TeamChange",""$NewPlayer.PlayerReplicationInfo.Team.TeamIndex,NewPlayer.PlayerReplicationInfo); } // ============================================================================ // GetLoadingHint // // This was taken from Jailbreak with permission. // // Used to hook into the loading screen. Replaces the image there by one of // our own loading images. Tries to use the image matching the loaded map. If // the loaded map contains a MyLevel texture named LoadingScreen, uses that. // ============================================================================ static function string GetLoadingHint(PlayerController PlayerController, string MapName, color ColorHint) { local int iLoadingScreen; local Material MaterialLoadingScreen; local Material MaterialOverlay; local FinalBlend FinalLoadScreen; local UT2K4ServerLoading UT2K4ServerLoading; local string NameLoadingScreen; if(default.bUseCustomLoadingScreens) { // look for full map name match for (iLoadingScreen = 0; iLoadingScreen < Default.LoadingScreens.Length; iLoadingScreen++) { NameLoadingScreen = GetItemName(Default.LoadingScreens[iLoadingScreen]); if (NameLoadingScreen ~= Mid(MapName, Len(default.MapPrefix)+1)) { MaterialLoadingScreen = Material(DynamicLoadObject(Default.LoadingScreens[iLoadingScreen], Class'Material', False)); break; } } // otherwise look for embedded loading screen if (MaterialLoadingScreen == None) { MaterialLoadingScreen = Material(DynamicLoadObject(MapName $ ".LoadingScreen", Class'Material', True)); } // otherwise load random loading screen if (MaterialLoadingScreen == None) { iLoadingScreen = Rand(Default.LoadingScreens.Length); MaterialLoadingScreen = Material(DynamicLoadObject(Default.LoadingScreens[iLoadingScreen], Class'Material', False)); } if (Texture(MaterialLoadingScreen) != None) Texture(MaterialLoadingScreen).LODSet = LODSET_Interface; if(default.bUseLoadingOverlays) { iLoadingScreen = Rand(Default.LoadingOverlays.Length); MaterialOverlay = Material(DynamicLoadObject(Default.LoadingOverlays[iLoadingScreen], Class'Material', False)); if(MaterialOverlay != none) { FinalLoadScreen = FinalBlend'OLTeamGamesLoadScreens.LoadScreen'; Combiner(FinalLoadScreen.Material).Material1 = MaterialLoadingScreen; Combiner(FinalLoadScreen.Material).Material2 = MaterialOverlay; Combiner(FinalLoadScreen.Material).Mask = MaterialOverlay; } } foreach PlayerController.AllObjects(Class'UT2K4ServerLoading', UT2K4ServerLoading) { if(FinalLoadScreen != none) DrawOpImage(UT2K4ServerLoading.Operations[0]).Image = FinalLoadScreen; else DrawOpImage(UT2K4ServerLoading.Operations[0]).Image = MaterialLoadingScreen; } } return Super.GetLoadingHint(PlayerController, MapName, ColorHint); } static function array GetAllLoadHints(optional bool bThisClassOnly) { local int i; local array Hints; if ( !bThisClassOnly || default.TGHints.Length == 0 ) Hints = Super.GetAllLoadHints(); for ( i = 0; i < default.TGHints.Length; i++ ) Hints[Hints.Length] = default.TGHints[i]; return Hints; } function WeakObjectives() { local GameObjective GO; for ( GO=Teams[0].AI.Objectives; GO!=None; GO=GO.NextObjective ) if ( GO.IsA('DestroyableObjective') ) DestroyableObjective(GO).Health = 1; } q//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamDeathmatch extends OLTeamGame; !T&N 6U&t!&mk"d]xGame.xTeamRosterL]! OLTeamGames.HUDOLTeamDeathMatchZ ]"!XInterface.MapListTeamDeathMatch]]TDM4\]omUp to four teams duke it out in a quest for battlefield supremacy. The team with the most total frags wins.] ])(OLTeamGamesTex.screenshots.TDM4Sequence^ ]OLTeamGames.OLTeamGamee]TDM4B//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamBlueConfigured extends OLTeamsRosterConfigured; ODpDE C ( -'EDS I %I 7C D .I C wD * BD I edo4?Ga?{#>L= dϻ>Ga?{#>L=d>3N=͏>%\>|d/?3N=͏>%\>}d>d>͏>%\>B d/?d>͏>%\> E - '| E |t|- '} EO}v}- 'B ELB @B - ' E  E Dc  GV&V 6X&~Vxl$Y//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamBanner extends uTeamBanner; simulated function UpdateForTeam() { if ( (GRI != None) && (Team < 4) && (OLTeamsGameReplicationInfo(GRI).OLTeamSymbols[Team] != None) ) TexScaler(Combiner(Shader(FinalBlend(Skins[0]).Material).Diffuse).Material2).Material = OLTeamsGameReplicationInfo(GRI).OLTeamSymbols[Team]; } o//----------------------------------------------------------- // //----------------------------------------------------------- class OLTeamAI extends TeamAI; var array EnemyTeams; /* ReAssessStrategy() Look at current strategic situation, and decide whether to update squad objectives */ function ReAssessStrategy() { local GameObjective O; local int PlusDiff, MinusDiff; local int i; local int NumOver, NumUnder; if ( FreelanceSquad == None ) return; // decide whether to play defensively or aggressively if ( Level.Game.TimeLimit > 0 ) { PlusDiff = 0; MinusDiff = 2; if ( DeathMatch(Level.Game).RemainingTime < 180 ) MinusDiff = 0; } else { PlusDiff = 2; MinusDiff = 2; } FreelanceSquad.bFreelanceAttack = false; FreelanceSquad.bFreelanceDefend = false; for(i=0;i EnemyTeams[i].Score + PlusDiff ) NumOver++; else if (Team.Score < EnemyTeams[i].Score - MinusDiff) NumUnder++; } if ( NumOver >= EnemyTeams.Length ) { FreelanceSquad.bFreelanceDefend = true; O = GetLeastDefendedObjective(); } else if ( NumUnder >= EnemyTeams.Length ) { FreelanceSquad.bFreelanceAttack = true; O = GetPriorityAttackObjectiveFor(FreelanceSquad); } else O = GetPriorityFreelanceObjective(); if ( (O != None) && (O != FreelanceSquad.SquadObjective) ) FreelanceSquad.SetObjective(O,true); } @a//----------------------------------------------------------- // //----------------------------------------------------------- class OLRedFlagBase extends OLRealCTFBase placeable; #exec OBJ LOAD FILE=XGameTextures.utx simulated function PostBeginPlay() { local xCTFBase xbase; Super.PostBeginPlay(); if ( Level.NetMode != NM_DedicatedServer ) { xbase = Spawn(class'XGame.xCTFBase',self,,Location-BaseOffset,rot(0,0,0)); xbase.Skins[0] = Texture'XGameTextures.FlagBaseTexR'; } } L\&Gi@2]&IL$&3}փC$RJONN] Red FlagYW&Ic Gu@;rI YWoYg]' GA//----------------------------------------------------------- // //----------------------------------------------------------- class OLRedFlag extends OLCTFFlag; #exec OBJ LOAD FILE=XGameShaders.utx #exec OBJ LOAD FILE=TeamSymbols_UT2003.utx simulated function PostBeginPlay() { Super.PostBeginPlay(); LoopAnim('flag',0.8); SimAnim.bAnimLoop = true; } ^&nS W T-L wn*ybE%E7yjrn Y6Eyrn W6EyrnOo6EyrnLg6EyE2-(rn*-'c,Q-C H GB6//----------------------------------------------------------- // //----------------------------------------------------------- class OLRealCTFBase extends xRealCTFBase abstract; simulated function UpdateForTeam() { if ( (OLTeamsGameReplicationInfo(GRI) != None) && (DefenderTeamIndex < 4) && (OLTeamsGameReplicationInfo(GRI).OLTeamSymbols[DefenderTeamIndex] != None) ) TexScaler(Combiner(Shader(FinalBlend(Skins[0]).Material).Diffuse).Material2).Material = OLTeamsGameReplicationInfo(GRI).OLTeamSymbols[DefenderTeamIndex]; } simulated function PostBeginPlay() { local UnrealScriptedSequence W; // local NavigationPoint N; super(GameObjective).PostBeginPlay(); // From xRealCTFBase::PostBeginPlay because I skip it with the above call. if ( Level.NetMode != NM_DedicatedServer ) LoopAnim('flag',0.8); if ( Level.Game != None ) SetGRI(Level.Game.GameReplicationInfo); if(Role == ROLE_Authority) { //calculate distance from this base to all nodes - store in BaseDist[DefenderTeamIndex] for each node OLSetBaseDistance(DefenderTeamIndex); // calculate visibility to base and defensepoints, for all paths SetBaseVisibility(DefenderTeamIndex); for ( W=DefenseScripts; W!=None; W=W.NextScript ) if ( W.myMarker != None ) SetDefPointVisibility(DefenderTeamIndex,W.myMarker); } } function OLSetBaseDistance(int BaseNum) { local NavigationPoint N; for ( N=Level.NavigationPointList; N!=None; N=N.NextNavigationPoint ) { if(N.Owner == none) N.SetOwner(spawn(class'OLNavigationPointAttachment')); OLNavigationPointAttachment(N.Owner).OLBaseDist[BaseNum] = vsize(Location - N.Location); } } function SetBaseVisibility(int BaseNum) { local NavigationPoint N; if(Owner == none) SetOwner(spawn(class'OLNavigationPointAttachment')); OLNavigationPointAttachment(Owner).OLBaseVisible[BaseNum] = 1; for ( N=Level.NavigationPointList; N!=None; N=N.NextNavigationPoint ) { if(N.Owner == none) N.SetOwner(spawn(class'OLNavigationPointAttachment')); if ( (OLNavigationPointAttachment(N.Owner).OLBaseVisible[BaseNum] == 0) && FastTrace(N.Location + (88 - 2*N.CollisionHeight)*Vect(0,0,1), Location + (88 - 2*N.CollisionHeight)*Vect(0,0,1)) ) { OLNavigationPointAttachment(N.Owner).OLBaseVisible[BaseNum] = 1; } } } function SetDefPointVisibility(int BaseNum, NavigationPoint ThisDefenseScript) { local NavigationPoint N; if(ThisDefenseScript.Owner == none) ThisDefenseScript.SetOwner(spawn(class'OLNavigationPointAttachment')); OLNavigationPointAttachment(ThisDefenseScript.Owner).OLBaseVisible[BaseNum] = 1; for ( N=Level.NavigationPointList; N!=None; N=N.NextNavigationPoint ) { if(N.Owner == none) N.SetOwner(spawn(class'OLNavigationPointAttachment')); if ( (OLNavigationPointAttachment(N.Owner).OLBaseVisible[BaseNum] == 0) && FastTrace(N.Location + (88 - 2*N.CollisionHeight)*Vect(0,0,1), ThisDefenseScript.Location + (88 - 2*N.CollisionHeight)*Vect(0,0,1)) ) { OLNavigationPointAttachment(N.Owner).OLBaseVisible[BaseNum] = 1; } } } q//----------------------------------------------------------- // //----------------------------------------------------------- class OLONSPowerCore extends ONSPowerCore; c&Y B6d&co 6fgamO//----------------------------------------------------------- // //----------------------------------------------------------- class OLNavigationPointAttachment extends Info; var byte OLBaseVisible[4]; // whether this point is visible from base or defense points var float OLBaseDist[4]; // distance to base a&T ox 6rT *nwO*}IOn}mOO*(} IT ,}wO*wOT B}O H }-A'OT -A Ge//----------------------------------------------------------- // //----------------------------------------------------------- class OLGreenFlagBase extends OLRealCTFBase placeable; #exec OBJ LOAD FILE=OLTeamGamesTex.utx simulated function PostBeginPlay() { local xCTFBase xbase; Super.PostBeginPlay(); if ( Level.NetMode != NM_DedicatedServer ) { xbase = Spawn(class'XGame.xCTFBase',self,,Location-BaseOffset,rot(0,0,0)); xbase.Skins[0] = Texture'OLTeamGamesTex.FlagBaseTexG'; } } }Lh&Ie@2j&[L$&3}փC$RXbOhN= Green FlagY E//----------------------------------------------------------- // //----------------------------------------------------------- class OLGreenFlag extends OLCTFFlag; #exec OBJ LOAD FILE=OLTeamGamesTex.utx #exec OBJ LOAD FILE=TeamSymbols_UT2003.utx simulated function PostBeginPlay() { Super.PostBeginPlay(); LoopAnim('flag',0.8); SimAnim.bAnimLoop = true; } g&Y g6rY *nwL*~ILn~mLL*(~ IY ,~wL*wLY B~L H ~-x'LY -x Gd//----------------------------------------------------------- // //----------------------------------------------------------- class OLGoldFlagBase extends OLRealCTFBase placeable; #exec OBJ LOAD FILE=OLTeamGamesTex.utx simulated function PostBeginPlay() { local xCTFBase xbase; Super.PostBeginPlay(); if ( Level.NetMode != NM_DedicatedServer ) { xbase = Spawn(class'XGame.xCTFBase',self,,Location-BaseOffset,rot(0,0,0)); xbase.Skins[0] = Texture'OLTeamGamesTex.FlagBaseTexO'; } } ~Lm&Lb@2o&̀OL$&3}փC$RabON] Gold FlagYD//----------------------------------------------------------- // //----------------------------------------------------------- class OLGoldFlag extends OLCTFFlag; #exec OBJ LOAD FILE=OLTeamGamesTex.utx #exec OBJ LOAD FILE=TeamSymbols_UT2003.utx simulated function PostBeginPlay() { Super.PostBeginPlay(); LoopAnim('flag',0.8); SimAnim.bAnimLoop = true; } l&kFv k|ee %ei &ej ,em ,eYze -s 'mzi -y 'zj -A 'zm -B 'V *-s -y -A -B B g V 7-s |9VBe B-s '7YBy-y |9VBi B-y 'yWB-A |9VBj YB-A 'oB-B |9VBm ]B-B 'gBV  G@ //----------------------------------------------------------- // //----------------------------------------------------------- class OLFakeCTFFlag extends CTFFlag; function Drop(vector newVel) { local OLTeamsPlayerReplicationInfo OLPRI; local int i; OLPRI = OLTeamsPlayerReplicationInfo(Holder.PlayerReplicationInfo); for(i=0; i EnemyFlags; var CTFFlag FriendlyFlag; var float LastGotFlag; var(AIWeights) float InvalidFlagWeight; var(AIWeights) float DistributionNeedWeight; var(AIWeights) float CaptureSuccessesWeight; var(AIWeights) float SubtractionScoreWeight; var(AIWeights) float NonSubtractionScoreWeight; var(AIWeights) float RandomnessWeight; var(AIWeights) float KeepSameTargetWeight; var(AIWeights) float GettingFrustratedWeight; function SquadAI AddSquadWithLeader(Controller C, GameObjective O) { local OLCTFSquadAI S; local int i; if ( O == None ) O = EnemyFlags[rand(EnemyFlags.Length)-1].HomeBase; S = OLCTFSquadAI(Super.AddSquadWithLeader(C,O)); if ( S != None ) { S.FriendlyFlag = FriendlyFlag; for(i=0;i ObjectiveWeights; local array TheseGameObjectives; local string DebugString; local int i; local int PickedNum; local OLTeamsGameReplicationInfo OLGRI; local float randomness; OLGRI = OLTeamsGameReplicationInfo(Level.Game.GameReplicationInfo); for ( O=Objectives; O!=None; O=O.NextObjective ) { if(CTFBase(O) == none) continue; if(CTFBase(O).DefenderTeamIndex == Team.TeamIndex) continue; i = TheseGameObjectives.Length; TheseGameObjectives[i] = O; DebugString = "Calc weight for team "$Team.TeamIndex$" against team "$CTFBase(O).DefenderTeamIndex$":"; ObjectiveWeights[i] = 1.f; if(!ValidObjective(O)) { ObjectiveWeights[i] += InvalidFlagWeight; DebugString $= " [InvalidFlag]"$InvalidFlagWeight; } else { DebugString $= " [InvalidFlag]"$0.00f; } if(OLCTFGame(Level.Game).bDistribution) { ObjectiveWeights[i] += (OLGRI.DistributionArray[Team.TeamIndex].ScoresNeeded[CTFBase(O).DefenderTeamIndex] * DistributionNeedWeight); DebugString $= " [DistributionNeed]"$(OLGRI.DistributionArray[Team.TeamIndex].ScoresNeeded[CTFBase(O).DefenderTeamIndex] * DistributionNeedWeight); } else { ObjectiveWeights[i] += (OLGRI.SuccessfulScoresArray[Team.TeamIndex].SuccessfulScores[CTFBase(O).DefenderTeamIndex] * CaptureSuccessesWeight); DebugString $= " [CaptureSuccesses]"$(OLGRI.SuccessfulScoresArray[Team.TeamIndex].SuccessfulScores[CTFBase(O).DefenderTeamIndex] * CaptureSuccessesWeight); } if(OLCTFGame(Level.Game).bSubtraction) { ObjectiveWeights[i] += (CTFBase(O).myFlag.Team.Score * SubtractionScoreWeight); DebugString $= " [SubtractionScore]"$(CTFBase(O).myFlag.Team.Score * SubtractionScoreWeight); } else { ObjectiveWeights[i] += (CTFBase(O).myFlag.Team.Score * NonSubtractionScoreWeight); DebugString $= " [NonSubtractionScore]"$(CTFBase(O).myFlag.Team.Score * NonSubtractionScoreWeight); } if(OLCTFSquadAI(AttackSquad) != none && !OLCTFSquadAI(AttackSquad).bWantNewObjective && AttackSquad.SquadObjective == O) { ObjectiveWeights[i] += KeepSameTargetWeight; DebugString $= " [KeepSameTarget]"$KeepSameTargetWeight; } else { DebugString $= " [KeepSameTarget]"$0.00f; } if(OLCTFSquadAI(AttackSquad) != none && AttackSquad.SquadObjective == O) { ObjectiveWeights[i] += (Level.TimeSeconds - OLCTFSquadAI(AttackSquad).AttackStartTime) * GettingFrustratedWeight * -1; DebugString $= " [GettingFrustrated]"$(Level.TimeSeconds - OLCTFSquadAI(AttackSquad).AttackStartTime) * GettingFrustratedWeight * -1; } else { DebugString $= " [GettingFrustrated]"$0.00f; } randomness = (frand() * RandomnessWeight); ObjectiveWeights[i] += randomness; DebugString $= " [Randomness]"$randomness; DebugString $= " [TOTAL]"$ObjectiveWeights[i]; //Log(DebugString,'OLTeamsDebug'); } PickedObjective = None; for(i=0;i ObjectiveWeights[PickedNum]) { PickedObjective = TheseGameObjectives[i]; PickedNum = i; } } if(OLCTFSquadAI(AttackSquad) != none) OLCTFSquadAI(AttackSquad).bWantNewObjective = false; // Log("Setting team "$Team.TeamIndex$" objective to "$PickedObjective); return PickedObjective; } function FindNewObjectives(GameObjective DisabledObjective) { local SquadAI S; for ( S=Squads; S!=None; S=S.NextSquad ) if ( S.SquadObjective == DisabledObjective ) { OLCTFSquadAI(S).bWantNewObjective = true; FindNewObjectiveFor(S,true); } } /* FindNewObjectiveFor() pick a new objective for a squad that has completed its current objective */ function FindNewObjectiveFor(SquadAI S, bool bForceUpdate) { local GameObjective O, Temp; local SquadAI JoinWith; if ( PlayerController(S.SquadLeader) != None ) return; // If my team has been elimiated, then I have no objective. if ( OLTeamsGameReplicationInfo(Level.Game.GameReplicationInfo).TeamEliminated[Team.TeamIndex] == 1 ) { S.SetObjective(none,true); return; } if ( S.bFreelance ) O = GetPriorityFreelanceObjective(); else if ( S.GetOrders() == 'Attack' ) O = GetPriorityAttackObjectiveFor(S); if ( O == None ) { O = GetLeastDefendedObjective(); if ( (O != None) && (O.DefenseSquad != None) ) { if ( S.GetOrders() == 'Attack' ) { S.MergeWith(O.DefenseSquad); return; } else { Temp = O; O = GetPriorityAttackObjectiveFor(S); if ( O == None ) { S.MergeWith(Temp.DefenseSquad); return; } } } } if ( (O == None) && (S.bFreelance || (S.GetOrders() == 'Defend')) ) O = GetPriorityAttackObjectiveFor(S); OLCTFSquadAI(S).bDoNotChangeObjective = false; OLCTFSquadAI(S).AttackStartTime = Level.TimeSeconds; if (S.GetOrders() == 'Attack') { JoinWith = GetAttackSquad(O); if(JoinWith != none) S.MergeWith(JoinWith); else S.SetObjective(O,bForceUpdate); } else { S.SetObjective(O,bForceUpdate); } } function SquadAI GetAttackSquad(GameObjective O) { local SquadAI S; for( S=Squads; S!=None; S=S.NextSquad ) { if(S.GetOrders() == 'Attack' && S.SquadObjective == O) return S; } return none; } // Called every 5 seconds. function ReAssessStrategy() { local GameObjective NewObjective; local SquadAI S; // Log("Reassess strategy called."); for( S=Squads; S!=None; S=S.NextSquad ) { // Log("Reassess strategy for squad "$S); if(S.GetOrders() != 'Attack') continue; if(OLCTFSquadAI(S).bDoNotChangeObjective) continue; // if my team has been elimiated, then I have no objective. if ( OLTeamsGameReplicationInfo(Level.Game.GameReplicationInfo).TeamEliminated[Team.TeamIndex] == 1 ) { if(S.SquadObjective != none) S.SetObjective(none,true); return; } NewObjective = GetPriorityAttackObjectiveFor(S); if( NewObjective != S.SquadObjective ) { OLCTFSquadAI(S).AttackStartTime = Level.TimeSeconds; // Level.Game.Broadcast(self,"ReAssessStrategy() has decided to assign a new objective to team "$team.TeamIndex$": new target is team "$NewObjective.DefenderTeamIndex); S.SetObjective(NewObjective,true); } } Super.ReAssessStrategy(); } function SetOrders(Bot B, name NewOrders, Controller OrderGiver) { local TeamPlayerReplicationInfo PRI; PRI = TeamPlayerReplicationInfo(B.PlayerReplicationInfo); if ( HoldSpot(B.GoalScript) != None ) { PRI.bHolding = false; B.FreeScript(); } if ( NewOrders == 'Hold' ) { PRI.bHolding = true; PutBotOnSquadLedBy(OrderGiver,B); B.GoalScript = PlayerController(OrderGiver).ViewTarget.Spawn(class'HoldSpot'); if ( Vehicle(PlayerController(OrderGiver).ViewTarget) != None ) HoldSpot(B.GoalScript).HoldVehicle = Vehicle(PlayerController(OrderGiver).ViewTarget); if ( PlayerController(OrderGiver).ViewTarget.Physics == PHYS_Ladder ) B.GoalScript.SetPhysics(PHYS_Ladder); } else if ( NewOrders == 'Defend' ) PutOnDefense(B); else if ( NewOrders == 'Attack' ) PutOnOffense(B); else if ( NewOrders == 'Follow' ) { B.FreeScript(); PutBotOnSquadLedBy(OrderGiver,B); } else if ( NewOrders == 'Freelance' ) { PutOnFreelance(B); return; } } function bool GiveSpecificOrders(Bot B, name NewOrders, Controller OrderGiver, int TargetTeam) { local TeamPlayerReplicationInfo PRI; local GameObjective TargetFlag; local SquadAI JoinWith; PRI = TeamPlayerReplicationInfo(B.PlayerReplicationInfo); if ( HoldSpot(B.GoalScript) != None ) { PRI.bHolding = false; B.FreeScript(); } if ( NewOrders == 'AttackTarget' ) { TargetFlag = GetEnemyFlagByTeam(TargetTeam); if(TargetFlag == none || !ValidObjective(TargetFlag)) return false; JoinWith = GetAttackSquad(TargetFlag); if(JoinWith != none) { JoinWith.AddBot(B); OLCTFSquadAI(JoinWith).bDoNotChangeObjective = true; return true; } else { JoinWith = AddSquadWithLeader(B, TargetFlag); OLCTFSquadAI(JoinWith).bDoNotChangeObjective = true; } } } function GameObjective GetEnemyFlagByTeam(int TeamNum) { local int i; for(i=0;i= SmallestAttackSquad.MaxSquadSize)) { S = AddSquadWithLeader(B, GetPriorityAttackObjectiveFor(None)); } else SmallestAttackSquad.AddBot(B); } B//----------------------------------------------------------- // //----------------------------------------------------------- class OLCTFSquadAI extends SquadAI; var array EnemyFlags; var CTFFlag FriendlyFlag; var float LastSeeFlagCarrier; var AssaultPath ReturnPath; // alternate path to use by flag carrier returning to base var name ReturnPathTag; var NavigationPoint HidePath; var bool bWantNewObjective; var bool bDoNotChangeObjective; // A human ordered this squad to attack its objective, so do not change automatically. var float AttackStartTime; // The time at which we started to attack this objective, or the time since we last captured it. function AssignCombo(Bot B) { if ( GetOrders() != 'Attack' ) Super.AssignCombo(B); } function bool AllowDetourTo(Bot B,NavigationPoint N) { if ( OLTeamsPlayerReplicationInfo(B.PlayerReplicationInfo).HasFlags.Length ==0 ) return true; if ( (B.RouteGoal != FriendlyFlag.HomeBase) || !FriendlyFlag.bHome ) return true; return ( N.LastDetourWeight * B.RouteDist > 2 ); } /* FindPathToObjective() Returns path a bot should use moving toward a base */ function bool FindPathToObjective(Bot B, Actor O) { if ( (Vehicle(B.Pawn) != None) && ((CTFFlag(O) != None) || (CTFBase(O) != None)) && (VSize(B.Pawn.Location - O.Location) < 1000) && B.LineOfSightTo(O) ) { B.FormerVehicle = Vehicle(B.Pawn); Vehicle(B.Pawn).TeamUseTime = Level.TimeSeconds + 6; Vehicle(B.Pawn).KDriverLeave(false); if ( (Vehicle(B.Pawn) == None) && (B.Pawn.Physics == PHYS_Falling) && B.DoWaitForLanding() ) { B.Pawn.Velocity.Z = 0; return true; } } if ( (OLTeamsPlayerReplicationInfo(B.PlayerReplicationInfo).HasFlags.Length == 0) || (O != FriendlyFlag.HomeBase) ) return Super.FindPathToObjective(B, O); if ( B.bFinalStretch || (ReturnPath == None) || ((O == SquadObjective) && SquadObjective.BotNearObjective(B)) ) return B.SetRouteToGoal(O); B.MoveTarget = None; if ( B.ActorReachable(O) ) { if ( (Vehicle(B.Pawn) != None) && (B.Pawn.Location.Z - O.Location.Z < 500) && ((CTFFlag(O) != None) || (CTFBase(O) != None)) ) Vehicle(B.Pawn).KDriverLeave(false); if ( B.Pawn.ReachedDestination(O) ) { O.Touch(B.Pawn); return false; } B.RouteGoal = O; B.RouteCache[0] = None; B.GoalString = B.GoalString@"almost at "$O; B.MoveTarget = O; B.bFinalStretch = true; B.SetAttractionState(); return true; } if ( B.Pawn.ReachedDestination(ReturnPath) ) { B.GoalString = B.GoalString@"Find path to "$O$" now near "$ReturnPath; B.MoveTarget = ReturnPath; ReturnPath = ReturnPath.FindPreviousPath(ReturnPathTag); if ( ReturnPath == None ) { B.bFinalStretch = true; B.FindBestPathToward(O,true,true); } else B.FindBestPathToward(ReturnPath,true,true); } else { B.GoalString = B.GoalString@"Find path to "$O$" through "$ReturnPath; if ( !B.FindBestPathToward(ReturnPath,true,true) ) { B.GoalString = B.GoalString@"Find path to "$O$" no path to ReturnPath"; if ( B.bSoaking && (Physics != PHYS_Falling) ) B.SoakStop("COULDN'T FIND PATH TO RETURNPATH "$ReturnPath); B.FindBestPathToward(O,true,true); } } return B.StartMoveToward(O); } function bool AllowTranslocationBy(Bot B) { return ( OLTeamsPlayerReplicationInfo(B.PlayerReplicationInfo).HasFlags.Length == 0 || OLCTFGame(Level.Game).bTranslocateWithFlags ); } /* GoPickupFlag() have bot go pickup dropped friendly flag */ function bool GoPickupFlag(Bot B) { if ( FindPathToObjective(B,FriendlyFlag) ) { if ( CTFTeamAI(Team.AI) != none && Level.TimeSeconds - CTFTeamAI(Team.AI).LastGotFlag > 6 ) { OLCTFTeamAI(Team.AI).LastGotFlag = Level.TimeSeconds; B.SendMessage(None, 'OTHER', B.GetMessageIndex('GOTOURFLAG'), 20, 'TEAM'); } B.GoalString = "Pickup friendly flag"; return true; } return false; } function actor FormationCenter() { local int i; if ( (SquadObjective != None) && (SquadObjective.DefenderTeamIndex == Team.TeamIndex) ) return SquadObjective; for(i=0;i BestD) && !VisibleToEnemiesOf(N,B) ) { Best = InventorySpot(N); BestD = NewD; } } } return Best; } function bool CheckVehicle(Bot B) { local int i; for(i=0;i 6 ) LastSeeFlagCarrier = Level.TimeSeconds; B.GoalString = "Attack enemy flag carrier"; if ( B.IsSniping() ) return false; B.bPursuingFlag = true; // Try to intercept at the base of the guy who has my flag. return ( TryToIntercept(B,FriendlyFlag.Holder, OLTeamsGameReplicationInfo(Level.Game.GameReplicationInfo).OLFlagHolder[Team.TeamIndex].Team.HomeBase ) ); } } // Only get my flag if convenient (we already know I'm not holding it) if ( (FriendlyFlag.Holder == None) && B.LineOfSightTo(FriendlyFlag.Position()) && (VSize(B.Pawn.Location - FriendlyFlag.Location) < 1500.f) && GoPickupFlag(B) ) { return true; } // otherwise, go hide if ( HidePath != None ) { if ( B.Pawn.ReachedDestination(HidePath) ) { if ( ((B.Enemy == None) || (Level.TimeSeconds - B.LastSeenTime > 7)) && (FRand() < 0.7) ) { B.GoalString = "I reached my hiding spot, and am now wandering around."; HidePath = None; if ( B.Enemy == None ) B.WanderOrCamp(true); else B.DoStakeOut(); return true; } } else if ( B.SetRouteToGoal(HidePath) ) { B.GoalString = "I am on my way to my hiding spot."; return true; } else } } HidePath = None; for(i=0;i 2) && (Vehicle(B.Pawn) == None) ) { // I'm smart enough to hunt for pickups, and not in a vehicle if ( (!FriendlyFlag.bHome || (VSize(FriendlyFlag.HomeBase.Location - B.Pawn.Location) > 2000)) && Team.AI.SuperPickupAvailable(B) && (B.Pawn.Anchor != None) && B.Pawn.ReachedDestination(B.Pawn.Anchor) && B.FindSuperPickup(800) ) { // I should get super pickups. // Conditions: // My flag is not at home OR I am more than 2000 units away from home. // AND There is a SuperPickup available // AND I have an anchor (?) // AND I reached my anchor (?) // AND B.FindSuperPickup(800) returned true B.GoalString = "Get super pickup on the way to scoring with flag."; B.SetAttractionState(); return true; } } if ( (B.Enemy != None) && (B.Pawn.Health < 60 )) // I'm fighting someone and low on health! B.SendMessage(None, 'OTHER', B.GetMessageIndex('NEEDBACKUP'), 25, 'TEAM'); B.GoalString = "Return to Base with flag!"; if ( !FindPathToObjective(B,FriendlyFlag.HomeBase) ) { // I can't find a path to the base! BAD! B.GoalString = "No path to home base for flag carrier"; // FIXME - suicide after a while return false; } if ( B.MoveTarget == FriendlyFlag.HomeBase ) { // My MoveTarget is my home base, meaning I'm very close. B.GoalString = "Near my Base with flag!"; if ( !FriendlyFlag.bHome && ((FriendlyFlag.Holder != none && FriendlyFlag.Holder != B.Pawn) || FriendlyFlag.Holder == none) ) { // My flag is not at home, and I'm not holding it. B.SendMessage(None, 'OTHER', B.GetMessageIndex('NEEDOURFLAG'), 25, 'TEAM'); B.GoalString = "NEED OUR FLAG BACK!"; if ( B.Skill > 1 ) // I'm smart enough to hide. HidePath = FindHidePathFor(B); if ( (HidePath != None) && B.SetRouteToGoal(HidePath) ) // I found a hiding place. return true; return false; } if ( VSize(B.Pawn.Location - FriendlyFlag.Location) < FriendlyFlag.HomeBase.CollisionRadius ) FriendlyFlag.Touch(B.Pawn); } return true; } function bool MustKeepEnemy(Pawn E) { if ( (E != None) && (E.PlayerReplicationInfo != None) && (FriendlyFlag.Holder == E) && (E.Health > 0) ) return true; return false; } function bool NearEnemyBase(Bot B) { local int i; for(i=0;i 0 ) return OrdersForFlagCarrier(B); // If my team has been eliminated, I should not go after flags. if ( OLTeamsGameReplicationInfo(Level.Game.GameReplicationInfo).TeamEliminated[Team.TeamIndex] == 1 ) return Super.CheckSquadObjectives(B); AddTransientCosts(B,1); if ( !FriendlyFlag.bHome ) { // My flag is not at home. bSeeFlag = B.LineOfSightTo(FriendlyFlag.Position()); if(FriendlyFlag.Holder != none && FriendlyFlag.Holder.PlayerReplicationInfo.Team.TeamIndex == Team.TeamIndex) { // My flag is being held by a teammate. // The code for covering the carrier of my flag is // covered later - it's the same code that is used // when covering any flag carrier. } else { // My flag is not being held by a teammate, and is not at home if ( Team.Size == 1 ) { // I am the only member of my team. // I removed this because I don't think you need any special AI in CTF4 for when it's 1 on 1 on 1 on 1 /* if ( B.NeedWeapon() && B.FindInventoryGoal(0) ) { B.SetAttractionState(); return true; } // keep attacking if 1-0n-1 // TODO - If the enemy flag is closer than my flag, go get it if ( (FriendlyFlag.Holder != None) || (VSize(B.Pawn.Location - FriendlyFlag.Position().Location) > VSize(B.Pawn.Location - EnemyFlag.Position().Location)) ) return FindPathToObjective(B,EnemyFlag.Position()); */ } if ( bSeeFlag ) { // I can see my flag. if ( FriendlyFlag.Holder == None ) { // No one is holding my flag. if ( GoPickupFlag(B) ) return true; } else { // Someone is holding my flag, and I can see them. if ( (B.Enemy != None) && (B.Enemy != FriendlyFlag.Holder) ) // My current enemy is not the flag carrier. FindNewEnemyFor(B,(B.Enemy != None) && B.LineOfSightTo(B.Enemy)); if ( Level.TimeSeconds - LastSeeFlagCarrier > 6 ) { // I haven't said "Enemy flag carrier is here" in a while. LastSeeFlagCarrier = Level.TimeSeconds; B.SendMessage(None, 'OTHER', B.GetMessageIndex('ENEMYFLAGCARRIERHERE'), 10, 'TEAM'); } B.GoalString = "Attack enemy flag carrier"; if ( B.IsSniping() ) // I am sniping, and should continue to do so. return false; B.bPursuingFlag = true; return TryToIntercept(B,FriendlyFlag.Holder, GetFlagByTeamIndex(FriendlyFlag.Holder.PlayerReplicationInfo.Team.TeamIndex).Homebase ); } } if ( GetOrders() == 'Attack' ) { // My current orders are to attack if ( B.bPursuingFlag || bSeeFlag || (B.LastRespawnTime > FriendlyFlag.TakenTime) || NearHomeBase(B) || ((Level.TimeSeconds - FriendlyFlag.TakenTime > FriendlyFlag.HomeBase.BaseExitTime) && !NearEnemyBase(B)) ) { // I should only go after the flag carrier if it makes sense. // Conditions: // I am already pursuing the flag // OR I can see the flag // OR I respawned after the flag was taken // OR I am near my base // OR It has been gone long enough to leave the base AND I'm not near an enemy base. B.bPursuingFlag = true; B.GoalString = "Go after enemy holding flag rather than attacking"; if ( FriendlyFlag.Holder != None ) return TryToIntercept(B,FriendlyFlag.Holder,GetFlagByTeamIndex(FriendlyFlag.Holder.PlayerReplicationInfo.Team.TeamIndex).Homebase); else if ( GoPickupFlag(B) ) return true; } else if ( B.bReachedGatherPoint ) B.GatherTime = Level.TimeSeconds - 10; } else if ( (PlayerController(SquadLeader) == None) && !B.IsSniping() && ((CurrentOrders != 'Defend') || bSeeFlag || (B.bPursuingFlag && FlagNearBase())) ) { // I should go after the flag if it makes sense. // Conditions: // I am not attacking // AND My squad leader is not human // AND I am not sniping // AND My current orders are to defend // OR I can see my flag // OR I am already pursuing my flag AND it's near my base // EPIC FIXME - try to leave one defender at base B.bPursuingFlag = true; B.GoalString = "Go find my flag"; if ( FriendlyFlag.Holder != None ) return TryToIntercept(B,FriendlyFlag.Holder,GetFlagByTeamIndex(FriendlyFlag.Holder.PlayerReplicationInfo.Team.TeamIndex).Homebase); else if ( GoPickupFlag(B) ) return true; } } } // End if my flag is away from home // However I might still be considering the below options // if I decided not to go after the flag carrier. B.bPursuingFlag = false; // This is my current target flag according to my Squad. if(CTFBase(SquadObjective) != none) TargetFlag = OLCTFFlag(CTFBase(SquadObjective).myFlag); for(i=0;i 15 ) break; } } if ( num > 0 ) { for ( i=0; i 0 ) return true; return Super.ShouldDeferTo(C); } function byte PriorityObjective(Bot B) { if ( OLTeamsPlayerReplicationInfo(B.PlayerReplicationInfo).HasFlags.Length > 0 ) { if ( FriendlyFlag.HomeBase.BotNearObjective(B) ) return 255; return 2; } if ( FriendlyFlag.Holder != None ) return 1; return 0; } function float ModifyThreat(float current, Pawn NewThreat, bool bThreatVisible, Bot B) { if ( (OLTeamsPlayerReplicationInfo(NewThreat.PlayerReplicationInfo) != None) && (OLTeamsPlayerReplicationInfo(NewThreat.PlayerReplicationInfo).HasFlags.Length > 0) && bThreatVisible ) { if ( (VSize(B.Pawn.Location - NewThreat.Location) < 1500) || (B.Pawn.Weapon != None && B.Pawn.Weapon.bSniping) ) /* || (VSize(NewThreat.Location - EnemyFlag.HomeBase.Location) < 2000) ) */ // TODO - add this back in return current + 6; else return current + 1.5; } else if ( NewThreat.IsHumanControlled() ) return current + 0.5; else return current; } x//----------------------------------------------------------- // //----------------------------------------------------------- class OLCTFMessageNotUnique extends OLCTFMessage; v// // CTF Messages // // Switch 0: Capture Message // RelatedPRI_1 is the scorer. // OptionalObject is the flag. // // Switch 1: Return Message // RelatedPRI_1 is the scorer. // OptionalObject is the flag. // // Switch 2: Dropped Message // RelatedPRI_1 is the holder. // OptionalObject is the flag's team teaminfo. // // Switch 3: Was Returned Message // OptionalObject is the flag's team teaminfo. // // Switch 4: Has the flag. // RelatedPRI_1 is the holder. // OptionalObject is the flag's team teaminfo. // // Switch 5: Auto Send Home. // OptionalObject is the flag's team teaminfo. // // Switch 6: Pickup stray. // RelatedPRI_1 is the holder. // OptionalObject is the flag's team teaminfo. class OLCTFMessage extends CriticalEventPlus; #exec OBJ LOAD FILE=GameSounds.uax var(Message) localized string ReturnBlue, ReturnRed, ReturnGreen, ReturnGold; var(Message) localized string ReturnedBlue, ReturnedRed, ReturnedGreen, ReturnedGold; var(Message) localized string CaptureBlue, CaptureRed, CaptureGreen, CaptureGold; var(Message) localized string DroppedBlue, DroppedRed, DroppedGreen, DroppedGold; var(Message) localized string HasBlue, HasRed, HasGreen, HasGold; var sound Riffs[3]; var name ReturnSoundNames[4]; var name DroppedSoundNames[4]; var name TakenSoundNames[4]; static simulated function ClientReceive( PlayerController P, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { Super.ClientReceive(P, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject); if ( TeamInfo(OptionalObject) == None ) return; switch (Switch) { case 0: P.ClientPlaySound(Default.Riffs[Rand(3)]); break; // Returned the flag. case 1: case 3: case 5: if(OLTeamPlayerController(P).bPlayAllAnnouncements || TeamInfo(OptionalObject).TeamIndex == P.PlayerReplicationInfo.Team.TeamIndex) P.PlayStatusAnnouncement(default.ReturnSoundNames[TeamInfo(OptionalObject).TeamIndex],2, true); break; // Dropped the flag. case 2: if(OLTeamPlayerController(P).bPlayAllAnnouncements || (TeamInfo(OptionalObject).TeamIndex == P.PlayerReplicationInfo.Team.TeamIndex || RelatedPRI_1.Team.TeamIndex == P.PlayerReplicationInfo.Team.TeamIndex)) P.PlayStatusAnnouncement(default.DroppedSoundNames[TeamInfo(OptionalObject).TeamIndex],2, true); break; case 4: case 6: if(OLTeamPlayerController(P).bPlayAllAnnouncements || (TeamInfo(OptionalObject).TeamIndex == P.PlayerReplicationInfo.Team.TeamIndex || RelatedPRI_1.Team.TeamIndex == P.PlayerReplicationInfo.Team.TeamIndex)) P.PlayStatusAnnouncement(default.TakenSoundNames[TeamInfo(OptionalObject).TeamIndex],2, true); break; } } static function string GetString( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { if ( TeamInfo(OptionalObject) == None ) return ""; switch (Switch) { // Captured the flag. case 0: if (RelatedPRI_1 == None) return ""; if ( TeamInfo(OptionalObject).TeamIndex == 0 ) return RelatedPRI_1.PlayerName@Default.CaptureRed; else if ( TeamInfo(OptionalObject).TeamIndex == 1 ) return RelatedPRI_1.PlayerName@Default.CaptureBlue; else if ( TeamInfo(OptionalObject).TeamIndex == 2 ) return RelatedPRI_1.PlayerName@Default.CaptureGreen; else if ( TeamInfo(OptionalObject).TeamIndex == 3 ) return RelatedPRI_1.PlayerName@Default.CaptureGold; break; // Returned the flag. case 1: if (RelatedPRI_1 == None) { if ( TeamInfo(OptionalObject).TeamIndex == 0 ) return Default.ReturnedRed; else if ( TeamInfo(OptionalObject).TeamIndex == 1 ) return Default.ReturnedBlue; else if ( TeamInfo(OptionalObject).TeamIndex == 2 ) return Default.ReturnedGreen; else if ( TeamInfo(OptionalObject).TeamIndex == 3 ) return Default.ReturnedGold; } if ( TeamInfo(OptionalObject).TeamIndex == 0 ) return RelatedPRI_1.PlayerName@Default.ReturnRed; else if ( TeamInfo(OptionalObject).TeamIndex == 1 ) return RelatedPRI_1.playername@Default.ReturnBlue; else if ( TeamInfo(OptionalObject).TeamIndex == 2 ) return RelatedPRI_1.playername@Default.ReturnGreen; else if ( TeamInfo(OptionalObject).TeamIndex == 3 ) return RelatedPRI_1.playername@Default.ReturnGold; break; // Dropped the flag. case 2: if (RelatedPRI_1 == None) return ""; if ( TeamInfo(OptionalObject).TeamIndex == 0 ) return RelatedPRI_1.playername@Default.DroppedRed; else if ( TeamInfo(OptionalObject).TeamIndex == 1 ) return RelatedPRI_1.playername@Default.DroppedBlue; else if ( TeamInfo(OptionalObject).TeamIndex == 2 ) return RelatedPRI_1.playername@Default.DroppedGreen; else if ( TeamInfo(OptionalObject).TeamIndex == 3 ) return RelatedPRI_1.playername@Default.DroppedGold; break; // Was returned. case 3: if ( TeamInfo(OptionalObject).TeamIndex == 0 ) return Default.ReturnedRed; else if ( TeamInfo(OptionalObject).TeamIndex == 1 ) return Default.ReturnedBlue; else if ( TeamInfo(OptionalObject).TeamIndex == 2 ) return Default.ReturnedGreen; else if ( TeamInfo(OptionalObject).TeamIndex == 3 ) return Default.ReturnedGold; break; // Has the flag. case 4: if (RelatedPRI_1 == None) return ""; if ( TeamInfo(OptionalObject).TeamIndex == 0 ) return RelatedPRI_1.playername@Default.HasRed; else if ( TeamInfo(OptionalObject).TeamIndex == 1 ) return RelatedPRI_1.playername@Default.HasBlue; else if ( TeamInfo(OptionalObject).TeamIndex == 2 ) return RelatedPRI_1.playername@Default.HasGreen; else if ( TeamInfo(OptionalObject).TeamIndex == 3 ) return RelatedPRI_1.playername@Default.HasGold; break; // Auto send home. case 5: if ( TeamInfo(OptionalObject).TeamIndex == 0 ) return Default.ReturnedRed; else if ( TeamInfo(OptionalObject).TeamIndex == 1 ) return Default.ReturnedBlue; else if ( TeamInfo(OptionalObject).TeamIndex == 2 ) return Default.ReturnedGreen; else if ( TeamInfo(OptionalObject).TeamIndex == 3 ) return Default.ReturnedGold; break; // Pickup case 6: if (RelatedPRI_1 == None) return ""; if ( TeamInfo(OptionalObject).TeamIndex == 0 ) return RelatedPRI_1.playername@Default.HasRed; else if ( TeamInfo(OptionalObject).TeamIndex == 1 ) return RelatedPRI_1.playername@Default.HasBlue; else if ( TeamInfo(OptionalObject).TeamIndex == 2 ) return RelatedPRI_1.playername@Default.HasGreen; else if ( TeamInfo(OptionalObject).TeamIndex == 3 ) return RelatedPRI_1.playername@Default.HasGold; break; } return ""; } q'//----------------------------------------------------------- // //----------------------------------------------------------- class OLCTFHUDMessage extends LocalMessage; // CTF Messages // // Switch 0: You have the XXX flag message. // Switch 1: Enemy has the flag message. // Switch 2: You have multiple flags // Switch 3: You have your flag // Switch 4: (Designation) Your target is Red // Switch 5: (Designation) Your target is Blue // Switch 6: (Designation) Your target is Green // Switch 7: (Designation) Your target is Gold var(Message) localized string YouHaveFlagStringPrefix; var(Message) localized string YouHaveFlagStringSuffix; var(Message) localized string YouHaveMultiFlags; var(Message) localized string YouHaveFriendlyFlag; var(Message) localized string EnemyHasFlagPrefix; var(Message) localized string EnemyHasFlagSuffix; var(Message) localized string DesignationPrefix; var(Message) localized string DesignationSuffix; var(Message) localized string TeamName[4]; var(Message) color RedColor, YellowColor, GreenColor, BlueColor; static function color GetColor( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2 ) { switch(Switch) { case 4: return default.RedColor; break; case 5: return default.BlueColor; break; case 6: return default.GreenColor; break; case 7: return default.YellowColor; break; } if (Switch == 1) return Default.RedColor; else return Default.YellowColor; } static function string GetString( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { switch(Switch) { case 0: return Default.YouHaveFlagStringPrefix@Default.TeamName[TeamInfo(OptionalObject).TeamIndex]@Default.YouHaveFlagStringSuffix; case 1: return Default.EnemyHasFlagPrefix@Default.TeamName[TeamInfo(OptionalObject).TeamIndex]@Default.EnemyHasFlagSuffix; case 2: return Default.YouHaveMultiFlags; case 3: return Default.YouHaveFriendlyFlag; case 4: case 5: case 6: case 7: return Default.DesignationPrefix@Default.TeamName[Switch-4]@Default.DesignationSuffix; } } d//----------------------------------------------------------- // //----------------------------------------------------------- class OLCTFGame extends OLTeamGame config; #exec OBJ LOAD FILE=GameSounds.uax #exec OBJ LOAD File=XGameShadersB.utx var(LoadingHints) private localized array CTFHints; var config bool bMultiFlagCarry; var config bool bCarryFlagBack; var config bool bCanSeeFlagLocation; var config bool bTranslocateWithFlags; var string Addons; var OLCTFFlag TheFlags[4]; const CTFPROPNUM = 4; var localized string CTFPropsDisplayText[CTFPROPNUM]; var localized string CTFPropDescText[CTFPROPNUM]; var localized string CTFGameplayOptionsGroup; static function PrecacheGameTextures(LevelInfo myLevel) { class'xTeamGame'.static.PrecacheGameTextures(myLevel); } static function PrecacheGameStaticMeshes(LevelInfo myLevel) { class'xDeathMatch'.static.PrecacheGameStaticMeshes(myLevel); } function RegisterVehicle(Vehicle V) { Super.RegisterVehicle(V); V.bTeamLocked = false; } event SetGrammar() { LoadSRGrammar("CTF4"); } function int OLParseOrder(string OrderString, out int TargetTeam) { local string LeftPart, RightPart; TargetTeam = -1; if ( Divide(OrderString," ",LeftPart,RightPart) ) { switch(RightPart) { case "RED": TargetTeam = 0; break; case "BLUE": TargetTeam = 1; break; case "GREEN": TargetTeam = 2; break; case "GOLD": TargetTeam = 3; break; } OrderString = LeftPart; } switch ( OrderString ) { case "ATTACKTARGET": return 261; // 261 and above are free. } return ParseOrder(OrderString); } /* Parse voice command and give order to bot */ function ParseVoiceCommand( PlayerController Sender, string RecognizedString ) { local int RecipientIDs[3]; local int NumRecipients, OrderID, i; local string OrderString; local int TargetTeam; // Nothing to be done if there is no sender. if ( Sender == None ) return; // Parse who to send orders to. OrderString = RecognizedString; ParseRecipients( RecipientIDs, NumRecipients, OrderString ); // Abort if no recipients. if( NumRecipients == 0 ) return; // Parse the order once. OrderID = OLParseOrder( OrderString, TargetTeam ); // Apply the order to possibly multiple recipients. for( i=0; i 260 ) { if( OrderID == 261 ) // ATTACKTARGET { if ( (Level.NetMode != NM_Standalone) && (RecipientID == -1) ) return true; for ( P=Level.ControllerList; P!= None; P=P.NextController ) { if ( (Bot(P) != None) && (Bot(P).Pawn != None) && (P.PlayerReplicationInfo != None) && (P.PlayerReplicationInfo.Team == Sender.PlayerReplicationInfo.Team) && ((RecipientID == -1) || (RecipientID == P.PlayerReplicationInfo.TeamID)) ) { if (OLCTFTeamAI(UnrealTeamInfo(P.PlayerReplicationInfo.Team).AI).GiveSpecificOrders(Bot(P),'AttackTarget',Sender, TargetTeam)) { P.SendMessage(Sender.PlayerReplicationInfo, 'ACK', 255, 5, 'TEAM'); } else { } if ( RecipientID == P.PlayerReplicationInfo.TeamID ) break; } } return true; } } return false; } function PostBeginPlay() { Super.PostBeginPlay(); SetTeamFlags(); CheckNumInitialBots(); OLTeamsGameReplicationInfo(GameReplicationInfo).bCanSeeFlagLocation = bCanSeeFlagLocation; OLTeamsGameReplicationInfo(GameReplicationInfo).bCarryFlagBack = bCarryFlagBack; OLTeamsGameReplicationInfo(GameReplicationInfo).NumTeams = NumTeams; } function bool CanCarryFlag(Controller Holder, int TeamNum) { local OLTeamsPlayerReplicationInfo OLPRI; local OLTeamsGameReplicationInfo OLGRI; OLPRI = OLTeamsPlayerReplicationInfo(Holder.PlayerReplicationInfo); OLGRI = OLTeamsGameReplicationInfo(GameReplicationInfo); if(OLPRI == none || OLGRI == none) return false; // First check to see if player can carry multiple flags if(!bMultiFlagCarry && OLPRI.HasFlags.Length > 0) return false; // If it's distribution, check to see if any more captures are needed. if(bDistribution && OLGRI.DistributionArray[OLPRI.Team.TeamIndex].ScoresNeeded[TeamNum] < 1) return false; // The target team is not the player's current designated target. if(bDesignation && OLGRI.DesignationTarget[OLPRI.Team.TeamIndex].TeamIndex != TeamNum) return false; // The target team has been eliminated. if(bFlagElimination && OLGRI.TeamEliminated[TeamNum] == 1) return false; // This player's team has been eliminated if(bFlagElimination && OLGRI.TeamEliminated[OLPRI.Team.TeamIndex] == 1) return false; return true; } function bool CanCarryFriendlyFlag(Controller Holder, int TeamNum) { local OLTeamsPlayerReplicationInfo OLPRI; local OLTeamsGameReplicationInfo OLGRI; OLPRI = OLTeamsPlayerReplicationInfo(Holder.PlayerReplicationInfo); OLGRI = OLTeamsGameReplicationInfo(GameReplicationInfo); if(OLPRI == none || OLGRI == none) return false; // First check to see if player can carry multiple flags if(!bMultiFlagCarry && OLPRI.HasFlags.Length > 0) return false; if(bCarryFlagBack && OLPRI.Team.TeamIndex == TeamNum) return true; return false; } // Precache all your custom OLTeamGames announcements here. static function PrecacheCustomAnnouncements(OLTeamsAnnouncer V) { V.PrecacheCustomSound('Red_Flag_Returned'); V.PrecacheCustomSound('Blue_Flag_Returned'); V.PrecacheCustomSound('Green_Flag_Returned'); V.PrecacheCustomSound('Gold_Flag_Returned'); V.PrecacheCustomSound('Red_Flag_Dropped'); V.PrecacheCustomSound('Blue_Flag_Dropped'); V.PrecacheCustomSound('Green_Flag_Dropped'); V.PrecacheCustomSound('Gold_Flag_Dropped'); V.PrecacheCustomSound('Red_Flag_Taken'); V.PrecacheCustomSound('Blue_Flag_Taken'); V.PrecacheCustomSound('Green_Flag_Taken'); V.PrecacheCustomSound('Gold_Flag_Taken'); } static function PrecacheGameAnnouncements(AnnouncerVoice V, bool bRewardSounds) { Super.PrecacheGameAnnouncements(V,bRewardSounds); if ( bRewardSounds ) { V.PrecacheSound('Denied'); } else { // Status sounds } } //************************ // ShowPathTo // // Modified version of ShowPathTo from OLTeamGame that has the whisps go to the // flags instead of the bases if the Omniescence option is turned on. //************************ function ShowPathTo(PlayerController P, int TeamNum) { local class WWclass; local int i; local int MyTeam; local CTFBase B; local CTFFlag F; local Actor Flag[4]; local Actor FlagBase[4]; local vector Pos; // TODO - thisis called serverside? IF so this then can be simplified. if(OLTeamsGameReplicationInfo(GameReplicationInfo).bCanSeeFlagLocation) { ForEach DynamicActors(Class'CTFFlag', F) { if ( F.IsA('OLRedFlag') ) Flag[0] = F; else if ( F.IsA('OLBlueFlag') ) Flag[1] = F; else if ( F.IsA('OLGreenFlag') ) Flag[2] = F; else if ( F.IsA('OLGoldFlag') ) Flag[3] = F; } } ForEach DynamicActors(Class'CTFBase', B) { if ( B.IsA('OLRedFlagBase') ) FlagBase[0] = B; else if ( B.IsA('OLBlueFlagBase') ) FlagBase[1] = B; else if ( B.IsA('OLGreenFlagBase') ) FlagBase[2] = B; else if ( B.IsA('OLGoldFlagBase') ) FlagBase[3] = B; } MyTeam = P.PlayerReplicationInfo.Team.TeamIndex; for(i=0;i(DynamicLoadObject(PathWhisps[i], class'Class')); Spawn(WWclass, P,, P.Pawn.Location); } } } /* OBSOLETE UpdateAnnouncements() - preload all announcer phrases used by this actor */ simulated function UpdateAnnouncements() {} function bool NearGoal(Controller C) { local PlayerReplicationInfo P; P = C.PlayerReplicationInfo; // Player is only near his goal if either his is flag is there, or he is carrying his flag // as well as other flags. return ( (CTFBase(P.Team.HomeBase).myFlag.bHome || (CTFBase(P.Team.HomeBase).myFlag.Holder.Controller == C) && OLTeamsPlayerReplicationInfo(C.PlayerReplicationInfo).HasFlags.Length > 1) && (VSize(C.Pawn.Location - P.Team.HomeBase.Location) < 1000) ); } static function int OrderToIndex(int Order) { if(Order == 2) return 10; if(Order == 0) return 11; return Order; } function float SpawnWait(AIController B) { if ( B.PlayerReplicationInfo.bOutOfLives ) return 999; if ( Level.NetMode == NM_Standalone ) { if ( NumBots < 4 ) return 0; if ( !OLCTFSquadAI(Bot(B).Squad).FriendlyFlag.bHome && (Numbots <= 16) ) return FRand(); return ( 0.5 * FMax(2,NumBots-4) * FRand() ); } return FRand(); } function SetTeamFlags() { local CTFFlag F; local int i; // associate flags with teams NumTeams = 0; ForEach AllActors(Class'CTFFlag',F) { F.Team = Teams[F.TeamNum]; F.Team.HomeBase = F.HomeBase; OLCTFTeamAI(F.Team.AI).FriendlyFlag = F; NumTeams++; } foreach AllActors(Class'CTFFlag',F) { for(i=0;i Teams[WinningTeam].Score) { WinningTeam = i; bWinnerTied = false; continue; } if(Teams[i].Score == Teams[WinningTeam].Score) { bWinnerTied = true; } } if (bWinnerTied) { if ( !bOverTimeBroadcast ) { StartupStage = 7; PlayStartupMessage(); bOverTimeBroadcast = true; } return false; } GameReplicationInfo.Winner = Teams[WinningTeam]; } BestFlag = OLCTFTeamAI(UnrealTeamInfo(GameReplicationInfo.Winner).AI).FriendlyFlag; EndGameFocus = BestFlag.HomeBase; EndGameFocus.bHidden = false; EndTime = Level.TimeSeconds + EndTimeDelay; for ( P=Level.ControllerList; P!=None; P=P.nextController ) { P.GameHasEnded(); Player = PlayerController(P); if ( Player != None ) { Player.ClientSetBehindView(true); Player.ClientSetViewTarget(EndGameFocus); Player.SetViewTarget(EndGameFocus); if ( !Player.PlayerReplicationInfo.bOnlySpectator ) PlayWinMessage(Player, (Player.PlayerReplicationInfo.Team == GameReplicationInfo.Winner)); Player.ClientGameEnded(); if ( CurrentGameProfile != None ) CurrentGameProfile.bWonMatch = (Player.PlayerReplicationInfo.Team == GameReplicationInfo.Winner); } } BestFlag.HomeBase.bHidden = false; BestFlag.bHidden = true; return true; } function ScoreGameObject( Controller C, GameObject GO ) { Super.ScoreGameObject(C,GO); if ( GO.IsA('CTFFlag') ) ScoreFlag(C, CTFFlag(GO)); } function ScoreFlag(Controller Scorer, CTFFlag theFlag) { local float Dist,oppDist; local int i; local float ppp,numtouch; local vector FlagLoc; if ( Scorer.PlayerReplicationInfo.Team == theFlag.Team ) { Scorer.AwardAdrenaline(ADR_Return); FlagLoc = TheFlag.Position().Location; Dist = vsize(FlagLoc - TheFlag.HomeBase.Location); for(i=0;i1024) { // figure out who's closer if (Dist<=oppDist) // In your team's zone { Scorer.PlayerReplicationInfo.Score += 3; ScoreEvent(Scorer.PlayerReplicationInfo,3,"flag_ret_friendly"); } else { Scorer.PlayerReplicationInfo.Score += 5; ScoreEvent(Scorer.PlayerReplicationInfo,5,"flag_ret_enemy"); if (oppDist<=1024) // Denial { Scorer.PlayerReplicationInfo.Score += 7; ScoreEvent(Scorer.PlayerReplicationInfo,7,"flag_denial"); } } } return; } // Figure out Team based scoring. if (TheFlag.FirstTouch!=None) // Original Player to Touch it gets 5 { ScoreEvent(TheFlag.FirstTouch.PlayerReplicationInfo,5,"flag_cap_1st_touch"); TheFlag.FirstTouch.PlayerReplicationInfo.Score += 5; TheFlag.FirstTouch.PlayerReplicationInfo.NetUpdateTime = Level.TimeSeconds - 1; } // Guy who caps gets 5 Scorer.PlayerReplicationInfo.NetUpdateTime = Level.TimeSeconds - 1; Scorer.PlayerReplicationInfo.Score += 5; IncrementGoalsScored(Scorer.PlayerReplicationInfo); Scorer.AwardAdrenaline(ADR_Goal); // Each player gets 20/x but it's guarenteed to be at least 1 point but no more than 5 points numtouch=0; for (i=0;i GetAllLoadHints(optional bool bThisClassOnly) { local int i; local array Hints; if ( !bThisClassOnly || default.CTFHints.Length == 0 ) Hints = Super.GetAllLoadHints(); for ( i = 0; i < default.CTFHints.Length; i++ ) Hints[Hints.Length] = default.CTFHints[i]; return Hints; } State MatchOver { function ScoreFlag(Controller Scorer, CTFFlag theFlag) { } } // TODO - what does this do? function actor FindSpecGoalFor(PlayerReplicationInfo PRI, int TeamIndex) { local XPlayer PC; local Controller C; local CTFFlag Flags[2],F; PC = XPlayer(PRI.Owner); if (PC==None) return none; // Look for a Player holding the flag for (C=Level.ControllerList;C!=None;C=C.NextController) { if ( (C.PlayerReplicationInfo != None) && (C.PlayerReplicationInfo.HasFlag!=None) && (PC.ViewTarget == None || PC.ViewTarget != C.Pawn) ) return C.Pawn; } foreach AllActors(class'CTFFlag',f) Flags[f.TeamNum]=f; if ( vsize(PC.Location - Flags[0].Location) < vsize(PC.Location - Flags[1].Location) ) return Flags[1]; else return Flags[0]; return none; } function Timer() { local int i; local OLCTFFlag F; Super.Timer(); if ( TheFlags[0] == None ) ForEach DynamicActors(class'OLCTFFlag',F) { if ( F.IsA('OLRedFlag') ) TheFlags[0] = F; else if ( F.IsA('OLBlueFlag') ) TheFlags[1] = F; else if ( F.IsA('OLGreenFlag') ) TheFlags[2] = F; else if ( F.IsA('OLGoldFlag') ) TheFlags[3] = F; } for(i=0;i 10 ) { UnrealMPGameInfo(Level.Game).GameEvent("flag_returned_timeout",""$Team.TeamIndex,None); BroadcastLocalizedMessage( MessageClass, 3, None, None, Team ); log(self$" Home.Timer: had to sendhome", 'Error'); SendHome(); } } function BeginState() { Disable('Touch'); bHome = true; SetLocation(HomeBase.Location); SetRotation(HomeBase.Rotation); Enable('Touch'); OLTeamsGameReplicationInfo(Level.Game.GameReplicationInfo).OLFlagState[TeamNum] = EFlagState.FLAG_Home; bHidden = true; HomeBase.bHidden = false; HomeBase.Timer(); HomeBase.NetUpdateTime = Level.TimeSeconds - 1; SetTimer(1.0, true); } function EndState() { bHome = false; TakenTime = Level.TimeSeconds; bHidden = false; HomeBase.bHidden = true; HomeBase.PlayAlarm(); HomeBase.NetUpdateTime = Level.TimeSeconds - 1; SetTimer(0.0, false); } } state Held { ignores SetHolder, SendHome; function Timer() { if (Holder == None) { log(self$" Held.Timer: had to sendhome", 'Error'); UnrealMPGameInfo(Level.Game).GameEvent("flag_returned_timeout",""$Team.TeamIndex,None); BroadcastLocalizedMessage( MessageClass, 3, None, None, Team ); SendHome(); } } function BeginState() { OLTeamsGameReplicationInfo(Level.Game.GameReplicationInfo).OLFlagState[TeamNum] = EFlagState.FLAG_HeldEnemy; bOnlyDrawIfAttached = true; bHeld = true; bCollideWorld = false; SetCollision(false, false, false); SetLocation(Holder.Location); Holder.HoldGameObject(self,GameObjBone); SetTimer(10.0, true); } function EndState() { //log(self$" held.endstate", 'GameObject'); bOnlyDrawIfAttached = false; ClearHolder(); bHeld = false; bCollideWorld = true; SetCollision(true, false, false); SetBase(None); SetRelativeLocation(vect(0,0,0)); SetRelativeRotation(rot(0,0,0)); } } state HeldFriendly { ignores SetHolder, SendHome; function Timer() { if (Holder == None) { log(self$" Held.Timer: had to sendhome", 'Error'); UnrealMPGameInfo(Level.Game).GameEvent("flag_returned_timeout",""$Team.TeamIndex,None); BroadcastLocalizedMessage( MessageClass, 3, None, None, Team ); SendHome(); } } function Tick(float Delta) { if(bPendingGoHome) { GotoState('Home'); bPendingGoHome = false; }else if( vsize(HomeBase.Location - Holder.Location) <= HomeBase.CollisionRadius ) { // returned flag UnrealMPGameInfo(Level.Game).ScoreGameObject(Holder.Controller, self); SetPhysics(PHYS_None); bCollideWorld = false; SetCollisionSize(default.CollisionRadius, default.CollisionHeight); UnrealMPGameInfo(Level.Game).ScoreGameObject(Holder.Controller, self); Disable('Touch'); SetLocation(HomeBase.Location); SetRotation(HomeBase.Rotation); CalcSetHome(); GotoState('Home'); } Super.Tick(Delta); } function BeginState() { OLTeamsGameReplicationInfo(Level.Game.GameReplicationInfo).OLFlagState[TeamNum] = EFlagState.FLAG_HeldEnemy; bOnlyDrawIfAttached = true; bHeld = true; bCollideWorld = false; SetCollision(false, false, false); SetLocation(Holder.Location); Holder.HoldGameObject(self,GameObjBone); SetTimer(10.0, true); } function EndState() { //log(self$" held.endstate", 'GameObject'); bOnlyDrawIfAttached = false; ClearHolder(); bHeld = false; bCollideWorld = true; SetCollision(true, false, false); SetBase(None); SetRelativeLocation(vect(0,0,0)); SetRelativeRotation(rot(0,0,0)); } } state Eliminated { ignores Drop, SendHome, Score, Touch; function BeginState() { bHidden = true; } } state Dropped { ignores Drop; function SameTeamTouch(Controller c) { if(OLCTFGame(Level.Game).bCarryFlagBack) { if( OLCTFGame(Level.Game).CanCarryFriendlyFlag(c,TeamNum) ) { SetHolder(C); } } else { // returned flag UnrealMPGameInfo(Level.Game).ScoreGameObject(C, self); SendHome(); } } function LogTaken(Controller c) { UnrealMPGameInfo(Level.Game).GameEvent("flag_pickup",""$Team.TeamIndex,C.PlayerReplicationInfo); BroadcastLocalizedMessage( MessageClass, 4, C.PlayerReplicationInfo, None, Team ); } function CheckFit() { local vector X,Y,Z; GetAxes(OldHolder.Rotation, X,Y,Z); SetRotation(rotator(-1 * X)); if ( !SetLocation(OldHolder.Location - 2 * OldHolder.CollisionRadius * X + OldHolder.CollisionHeight * vect(0,0,0.5)) && !SetLocation(OldHolder.Location) ) { SetCollisionSize(0.8 * OldHolder.CollisionRadius, FMin(CollisionHeight, 0.8 * OldHolder.CollisionHeight)); if ( !SetLocation(OldHolder.Location) ) { //log(self$" Drop sent flag home", 'Error'); UnrealMPGameInfo(Level.Game).GameEvent("flag_returned_timeout",""$Team.TeamIndex,None); BroadcastLocalizedMessage( MessageClass, 3, None, None, Team ); SendHome(); return; } } } function CheckPain() { if (IsInPain()) timer(); } function TakeDamage( int NDamage, Pawn instigatedBy, Vector hitlocation, Vector momentum, class damageType) { CheckPain(); } singular function PhysicsVolumeChange( PhysicsVolume NewVolume ) { Super.PhysicsVolumeChange(NewVolume); CheckPain(); } function BeginState() { OLTeamsGameReplicationInfo(Level.Game.GameReplicationInfo).OLFlagState[TeamNum] = EFlagState.FLAG_Down; SetPhysics(PHYS_Falling); bCollideWorld = true; SetCollisionSize(0.5 * default.CollisionRadius, CollisionHeight); SetCollision(true, false, false); CheckFit(); CheckPain(); SetTimer(MaxDropTime, false); } function EndState() { SetPhysics(PHYS_None); bCollideWorld = false; SetCollisionSize(default.CollisionRadius, default.CollisionHeight); } function Timer() { BroadcastLocalizedMessage( MessageClass, 3, None, None, Team ); UnrealMPGameInfo(Level.Game).GameEvent("flag_returned_timeout",""$Team.TeamIndex,None); Super.Timer(); } } ~J//----------------------------------------------------------- // //----------------------------------------------------------- class OLCTFAddon extends Mutator abstract; // ============================================================================ // Properties // ============================================================================ var const bool bIsOverlay; // set to have RenderOverlays called client-side // ============================================================================ // Variables // ============================================================================ var OLTeamsGameReplicationInfo OLGRI; // ============================================================================ // MutatorIsAllowed // // Disallows this add-on unless it is run for a Jailbreak game. // ============================================================================ function bool MutatorIsAllowed() { return (OLCTFGame(Level.Game) != None); } // ============================================================================ // InitAddon // // Called server- and client-side when the game type has finished its own // initialization. Sets the OLGRI reference and registers the // addon as an overlay actor if bIsOverlay is set. // ============================================================================ simulated function InitAddon() { local PlayerController PlayerControllerLocal; PlayerControllerLocal = Level.GetLocalPlayerController(); // if (bIsOverlay && PlayerControllerLocal != None) // JBInterfaceHud(PlayerControllerLocal.myHud).RegisterOverlay(Self); if (Level.Game != None) OLGRI = OLTeamsGameReplicationInfo(Level.Game.GameReplicationInfo); else OLGRI = OLTeamsGameReplicationInfo(PlayerControllerLocal.GameReplicationInfo); } // ============================================================================ // PostNetBeginPlay // // Calls the InitAddon function client-side. Server-side, InitAddon is called // by the game type PostBeginPlay event itself. // ============================================================================ simulated event PostNetBeginPlay() { if (Role < ROLE_Authority) InitAddon(); } // ============================================================================ // RenderOverlays // // If bIsOverlay is set to True, called client-side once per frame to allow // the add-on to draw on the screen. // ============================================================================ simulated function RenderOverlays(Canvas Canvas); // ============================================================================ // NotifyLevelChange // // Called client-side and on listen servers when the level changes. // ============================================================================ simulated function NotifyLevelChange(); // ============================================================================ // PlayInfoGroup // // Returns the name to be used for this add-on in FillPlayInfo. // ============================================================================ static function string PlayInfoGroup() { // TODO - ? // return Class'Jailbreak'.Default.TextWebAdminPrefixAddon @ Default.FriendlyName; return Default.FriendlyName; } // ============================================================================ // GetServerDetails // // Puts CTF4 add-ons into a separate list so that CTF4 servers show // up in the server browser even if Standard Servers Only is checked. // ============================================================================ function GetServerDetails(out GameInfo.ServerResponseLine ServerState) { local int iServerInfo; iServerInfo = ServerState.ServerInfo.Length; ServerState.ServerInfo.Insert(iServerInfo, 1); ServerState.ServerInfo[iServerInfo].Key = "AddOn"; ServerState.ServerInfo[iServerInfo].Value = GetHumanReadableName(); } // ============================================================================ // Destroyed // // Automatically unregisters this actor if bIsOverlay is set to True. // ============================================================================ simulated event Destroyed() { local PlayerController PlayerControllerLocal; PlayerControllerLocal = Level.GetLocalPlayerController(); // if (bIsOverlay && PlayerControllerLocal != None) // JBInterfaceHud(PlayerControllerLocal.myHud).UnregisterOverlay(Self); if (Role == ROLE_Authority) Super.Destroyed(); } // ============================================================================ // Defaults // ============================================================================ {&B@ 3 |&3jާjW3}3}3}3}>IJ3}xb//----------------------------------------------------------- // //----------------------------------------------------------- class OLBlueFlagBase extends OLRealCTFBase placeable; #exec OBJ LOAD FILE=XGameTextures.utx simulated function PostBeginPlay() { local xCTFBase xbase; Super.PostBeginPlay(); if ( Level.NetMode != NM_DedicatedServer ) { xbase = Spawn(class'XGame.xCTFBase',self,,Location-BaseOffset,rot(0,0,0)); xbase.Skins[0] = Texture'XGameTextures.FlagBaseTexB'; } } L}&N[@2~&柉L$&3}փC$RSbOON] Blue FlagY@w E6%OLTeamGames.OLTeamsGUITab_PlayerLoginControls Go4CS5Y $* $?*("G:'AZ 4 Z $$ Z $A$A Z $B$B1$@E"Z $ #<$ #<VZ 4 Z $ $ Z $$ Z $$^$?_$?83XZGD@$ ף>2$L=("FZ 4 Z $+>$fff? Z $$ Z $$Z 4 Z $4B$4B Z $B$B Z $B$B" Z $33>$33>^$A_$?83XZGD@$L>2$>("JZ 4 Z $=$> Z $$ Z $$FZ 4 Z $->$^i? Z $$ Z $$Z 4 Z $pB$pB Z $B$B Z $B$B1$@" Z $>$>^$A_$?83XZD@$>2$=("zZ 4 Z $@$@ Z $B$B Z $B$B"Z $33>$33>VZ 4 Z $$B Z $$B Z $$BhY $?h:'^$HB_$?83XZGD@$ ף>2$L=("FZ 4 Z $+>$fff? Z $$ Z $$Z 4 Z $4B$4B Z $B$B Z $B$B" Z $33>$33>^$A_$?83XZGD@$L>2$>("JZ 4 Z $=$> Z $$ Z $$FZ 4 Z $->$^i? Z $$ Z $$Z 4 Z $pB$pB Z $B$B Z $B$B1$@" Z $>$>^$A_$?83XZD@$>2$=("zZ 4 Z $@$@ Z $B$B Z $B$B"Z $33>$33>VZ 4 Z $$B Z $$B Z $$BhY $?h:'^$HB_$?83XZGD@$ ף>2$L=("FZ 4 Z $+>$fff? Z $$ Z $$Z 4 Z $4B$4B Z $B$B Z $B$B" Z $33>$33>^$A_$?83XZGD@$L>2$>("JZ 4 Z $=$> Z $$ Z $$FZ 4 Z $->$^i? Z $$ Z $$Z 4 Z $pB$pB Z $B$B Z $B$B1$@" Z $>$>^$A_$?83XZD@$>2$=("zZ 4 Z $@$@ Z $B$B Z $B$B"Z $33>$33>VZ 4 Z $$B Z $$B Z $$BhY $?h:'^$HB_$?83XZGD@$ ף>2$L=("FZ 4 Z $+>$fff? Z $$ Z $$Z 4 Z $4B$4B Z $B$B Z $B$B" Z $33>$33>^$A_$?83XZGD@$L>2$>("JZ 4 Z $=$> Z $$ Z $$FZ 4 Z $->$^i? Z $$ Z $$Z 4 Z $pB$pB Z $B$B Z $B$B1$@" Z $>$>^$A_$?83XZD@$>2$=("zZ 4 Z $@$@ Z $B$B Z $B$B"Z $33>$33>VZ 4 Z $$B Z $$B Z $$BhY $?h:'^$HB_$?o483X=SISCS5Y $* $?*@$=2$L=" NZ 4 Z $$B Z $$C Z $$Z 4 Z $C$HC Z $C$HC Z $B$BM:'= ף;?l$@E1$pB"Z $>$>LZ $@$@VZ 4 Z $$ Z $$ Z $D$@Eo483=SWISCS5Y $* $?*@$>2$=("#G:'HNZ 4 Z $ $ Z $$ Z $H$H|\Y $?+$@?Z 4 Z $C$C Z $fC$fC Z $B$B1$pA"Z $>$>VZ 4 Z $$ Z $$ Z $D$DA Vb483=SGCS5Y $* $?*@$?2$=("G:' NZ 4 Z $$ Z $$ Z $$|FZ 4 Z $ȶ>$rH? Z $$ Z $$Z 4 Z $?$? Z $?$? Z $?$?1$pBZ $?$?LZ $@$@o483X=SISCS5Y $* $?*@$=2$L=" NZ 4 Z $$B Z $$C Z $$Z 4 Z $C$HC Z $C$HC Z $B$BM:'= ף;?l$@E1$pB"Z $>$>LZ $@$@VZ 4 Z $$ Z $$ Z $D$@Eo483=SWISCS5Y $* $?*@$>2$=("#G:'HNZ 4 Z $ $ Z $$ Z $H$H|\Y $?+$@?Z 4 Z $C$C Z $fC$fC Z $B$B1$pA"Z $>$>VZ 4 Z $$ Z $$ Z $D$DA Vb483=SGCS5Y $* $?*@$?2$=("G:' NZ 4 Z $$ Z $$ Z $$|FZ 4 Z $ȶ>$rH? Z $$ Z $$Z 4 Z $?$? Z $?$? Z $?$?1$pBZ $?$?LZ $@$@o483=SISCS5Y $* $?*@$=2$L=" NZ 4 Z $H$HB Z $$B Z $$Z 4 Z $C$HC Z $C$HC Z $B$BM:'= ף;?l$@E1$pB"Z $>$>LZ $@$@VZ 4 Z $$ Z $$ Z $D$@Eo483=SWISCS5Y $* $?*@$>2$=("#G:'HNZ 4 Z $ $ Z $$ Z $H$H|\Y $?+$@?Z 4 Z $HC$HC Z $4C$4C Z $B$B1$pA"Z $>$>VZ 4 Z $$ Z $$ Z $C$CA Vb483=SGCS5Y $* $?*@$?2$=("G:' NZ 4 Z $$ Z $$ Z $$|FZ 4 Z $ȶ>$rH? Z $$ Z $$Z 4 Z $?$? Z $?$? Z $?$?1$pBZ $?$?LZ $@$@o483=SISCS5Y $* $?*@$=2$L=" NZ 4 Z $H$HB Z $$B Z $$Z 4 Z $C$HC Z $C$HC Z $B$BM:'= ף;?l$@E1$pB"Z $>$>LZ $@$@VZ 4 Z $$ Z $$ Z $D$@Eo483=SWISCS5Y $* $?*@$>2$=("#G:'HNZ 4 Z $ $ Z $$ Z $H$H|\Y $?+$@?Z 4 Z $HC$HC Z $4C$4C Z $B$B1$pA"Z $>$>VZ 4 Z $$ Z $$ Z $C$CA Vb483=SGCS5Y $* $?*@$?2$=("G:' NZ 4 Z $$ Z $$ Z $$|FZ 4 Z $ȶ>$rH? Z $$ Z $$Z 4 Z $?$? Z $?$? Z $?$?1$pBZ $?$?LZ $@$@o4=SWISDd CSd 5Y9 $* $=* $@?* $?*"NZ 4 Z $$ Z $$ Z $$By jZ $B$B|\Y( $+$A $>+$A $?+$?Z 4 Z $A$@A Z $B$B Z $B$BM:' ף;??1$zD"Z $?$?VZ 4 Z $@$A Z $$ Z $$hY] $h:'??? $L>h:'@@@ $>h:'AAA $?h:'HCHCHCo4=SWISDd CSd 5Y9 $* $=* $@?* $?*"NZ 4 Z $$ Z $$ Z $$By jZ $B$B|\Y( $+$A $>+$A $?+$?Z 4 Z $A$@A Z $B$B Z $B$BM:' ף;??1$zD"Z $?$?VZ 4 Z $@$A Z $$ Z $$hY] $h:'??? $L>h:'@@@ $>h:'AAA $?h:'HCHCHC4=SxSs GWISDCS5Y9 $* $L>*@ $L?* $?*"djZ $A$Aw Z 4 Z $$G Z $F$F Z $@B$Bv  nzZ 4 Z $?$? Z $?$? Z $@?$@?r Z 4 Z $$ Z $$ Z $$?JZ 4 Z $$ Z $$ Z $?$?FZ 4 Z $$? Z $$ Z $$\Y $+$? $?+$@Z 4 Z $ A$A Z $B$B Z $B$BM:' ף< ף<?1$C"Z $>$>g Z $$f Z 4 Z $$ Z $$ Z $$HBe 4=SGD5Y9 $* $L>* $L?*@ $?*(NZ 4 Z $$ Z $$ Z $@$@BJZ 4 Z $$? Z $$ Z $$FZ 4 Z $$? Z $$ Z $$"Z $?$?LZ $>$>4=SxSs GWISDCS5Y9 $* $L>*@@ $L?* $?*"djZ $A$Aw Z 4 Z $$G Z $F$F Z $@B$Bv  nzZ 4 Z $?$? Z $?$? Z $@?$@?r Z 4 Z $$ Z $$ Z $$?JZ 4 Z $$ Z $$ Z $?$?FZ 4 Z $$? Z $$ Z $$\Y $+$? $?+$@Z 4 Z $ A$A Z $B$B Z $B$BM:' ף< ף<?1$C"Z $>$>g Z $$f Z 4 Z $$ Z $$ Z $$HBe 4=SGD5Y9 $* $L>* $L?*@@ $?*(NZ 4 Z $$ Z $$ Z $@$@BJZ 4 Z $$? Z $$ Z $$FZ 4 Z $$? Z $$ Z $$"Z $?$?LZ $>$>43=SGWISDCS5Y $* $?*2$>("FZ 4 Z $$? Z $$ Z $$\Y $+$? $?+$@@Z 4 Z $@$@ Z $B$B Z $B$B1$@" Z $?$?LZ $>$>4=SGWISDCS5Y+ $* $@?* $?*Y $>("FZ 4 Z $$? Z $$ Z $$\Y $+$? $?+$@Z 4 Z $A$A Z $B$B Z $B$B1$@" Z $?$?LZ $?$?A lSb4=SWISCS5Y+ $* $?* $?*("\Y( $+$? $?+$? $?+$?Z 4 Z $=$= Z $=$= Z $=$=n YV~  FZ $A$Ac Z $ff>$ff? "|Z $?$?@ Z $?$?m l Z $?$?1$@EZ $?$?LZ $?$?43=SGWISDCS5Y $* $?*2$>("FZ 4 Z $$? Z $$ Z $$\Y $+$? $?+$@@Z 4 Z $@$@ Z $B$B Z $B$B1$@" Z $?$?LZ $>$>4=SGWISDCS5Y+ $* $@?* $?*Y $>("FZ 4 Z $$? Z $$ Z $$\Y $+$? $?+$@Z 4 Z $A$A Z $B$B Z $B$B1$@" Z $?$?LZ $?$?A lSb4=SWISCS5Y+ $* $?* $?*("\Y( $+$? $?+$? $?+$?Z 4 Z $=$= Z $=$= Z $=$=n YV~  FZ $A$Ac Z $ff>$ff? "|Z $?$?@ Z $?$?m l Z $?$?1$@EZ $?$?LZ $?$?B//----------------------------------------------------------- // //----------------------------------------------------------- class OLBlueFlag extends OLCTFFlag; #exec OBJ LOAD FILE=XGameShaders.utx #exec OBJ LOAD FILE=TeamSymbols_UT2003.utx simulated function PostBeginPlay() { Super.PostBeginPlay(); LoopAnim('flag',0.8); SimAnim.bAnimLoop = true; } n//----------------------------------------------------------- // Michael Bennett Announcer // // This is simply the OLTeamGames male announcer that can be used // in all gametypes. //----------------------------------------------------------- class OLBennettAnnouncer extends AnnouncerVoice; XS= Green TeamW$ #!$<$ >)$L>g't dXS] Gold TeamW$ #!$0?$ >)$L>g't dg'H 2j'F_ ._]OLTeamGamesAnnouncer}]AnnouncerMale2K4^] 4 Team Malefq//----------------------------------------------------------- // //----------------------------------------------------------- class OLBanner_Red extends OLTeamBanner; simulated function PostBeginPlay() { Super.PostBeginPlay(); LoopAnim('banner'); SimAnim.bAnimLoop = true; } E]BrowserListSelectionPn'fqm]ServerBrowserGrid $&q?!$L=$ff>)$L>J" E]BrowserListSelectionPn'dqm]ServerBrowserGrid $&q?!$p?$ff>)$L>J" c*ddZe $>!$>$`>)$m>J" flbWX c*Ze $7>!$;$?$`>)$m>J" flc*Ze $>!$>$`>)$m>J" flc*Ze $>!$;$?$`>)$m>J" flTk'K I Br'fTs16$Ys//----------------------------------------------------------- // //----------------------------------------------------------- class OLBanner_Green extends OLTeamBanner; simulated function PostBeginPlay() { Super.PostBeginPlay(); LoopAnim('banner'); SimAnim.bAnimLoop = true; } S= Green Team $m>!$@<$>)$7>g'cdS] Gold Team $m>!$6!?$>)$7>g'bdTs'J J Bv'íNTs16$R"Yr//----------------------------------------------------------- // //----------------------------------------------------------- class OLBanner_Gold extends OLTeamBanner; simulated function PostBeginPlay() { Super.PostBeginPlay(); LoopAnim('banner'); SimAnim.bAnimLoop = true; } J$L>Pin'`qy]54These are the bots that will play on the green team $x=!$ci<$Ѱ>)$@?J"eWzJ$L>Pin'Xqy]43These are the bots that will play on the gold team $x=!$}"?$Ѱ>)$@?J"eWzTw'I K Bz'>K7Ts16$R"Yr//----------------------------------------------------------- // //----------------------------------------------------------- class OLBanner_Blue extends OLTeamBanner; simulated function PostBeginPlay() { Super.PostBeginPlay(); LoopAnim('banner'); SimAnim.bAnimLoop = true; } T{'H M B|'5йTs16$R"Yv//----------------------------------------------------------- // //----------------------------------------------------------- class MapListOLCTF extends MapList config; }'N 6~' cHXY CTF4-FaceClassic CTF4-ClashCTF4-Crossroads][CTF4-DuelingKeepsCTF4-GeothermalCTF4-DuelingKeeps CTF4-JoustCTF4-DuelingKeepsCTF4-AnubisResurrection CTF4-Romra CTF4-SkylineCTF4-TutorialClassicV//----------------------------------------------------------- // //----------------------------------------------------------- class HudOLTeamDeathmatch extends HudCTeamDeathMatch; var() NumericWidget OLScoreTeam[4]; var() SpriteWidget OLTeamScoreBackGround[4]; var() SpriteWidget OLTeamScoreBackGroundDisc[4]; var() SpriteWidget OLTeamSymbols[4]; var() color OLHudColorTeam[4]; var() color TeamBeaconTeamColors[4]; var() color TeamBeaconLinkColor; var() float DistributionCornerX[4], DistributionCornerY[4]; var() float DistributionSpacingX, DistributionSpacingY; var() float DistributionIndicatorWidth; var Material DistributionIndicator; var Material DistributionIndicatorAlert; var color EliminatedColor; var int OLTeamIndex; simulated function PostBeginPlay() { Super.PostBeginPlay(); SetTimer(1.0, True); } simulated function Message( PlayerReplicationInfo PRI, coerce string Msg, name MsgType ) { local Class LocalMessageClass; switch( MsgType ) { case 'Say': if ( PRI == None ) return; Msg = PRI.PlayerName$": "$Msg; LocalMessageClass = class'OLTeamsSayMessagePlus'; break; case 'TeamSay': if ( PRI == None ) return; Msg = PRI.PlayerName$"("$PRI.GetLocationName()$"): "$Msg; LocalMessageClass = class'OLTeamsTeamSayMessagePlus'; break; case 'CriticalEvent': LocalMessageClass = class'CriticalEventPlus'; LocalizedMessage( LocalMessageClass, 0, None, None, None, Msg ); return; case 'DeathMessage': LocalMessageClass = class'xDeathMessage'; break; default: LocalMessageClass = class'StringMessagePlus'; break; } AddTextMessage(Msg,LocalMessageClass,PRI); } simulated function UpdateHud() { UpdateTeamHUD(); showLinks(); if ((PawnOwnerPRI != none) && (PawnOwnerPRI.Team != None)) TeamIndex = 0; // Make it always choose Tints[0] if ((PawnOwnerPRI != none) && (PawnOwnerPRI.Team != None)) OLTeamIndex = PawnOwnerPRI.Team.TeamIndex; CalculateHealth(); CalculateAmmo(); CalculateShield(); CalculateEnergy(); CalculateScore(); DigitsHealth.Value = CurHealth; DigitsVehicleHealth.Value = CurVehicleHealth; DigitsAmmo.Value = CurAmmoPrimary; DigitsShield.Value = CurShield; AdrenalineCount.Value = CurEnergy; MyScore.Value = CurScore; } simulated function DrawHudPassA (Canvas C) { local Pawn RealPawnOwner; local class AmmoClass; ZoomFadeOut(C); if ( PawnOwner != None ) { if( bShowWeaponInfo && (PawnOwner.Weapon != None) ) { if ( PawnOwner.Weapon.bShowChargingBar ) DrawChargeBar(C); DrawSpriteWidget( C, HudBorderAmmo ); if( PawnOwner.Weapon != None ) { AmmoClass = PawnOwner.Weapon.GetAmmoClass(0); if ( (AmmoClass != None) && (AmmoClass.Default.IconMaterial != None) ) { if( (CurAmmoPrimary/MaxAmmoPrimary) < 0.15) { DrawSpriteWidget(C, HudAmmoALERT); HudAmmoALERT.Tints[0] = OLHudColorTeam[OLTeamIndex]; HudAmmoALERT.Tints[1] = OLHudColorTeam[OLTeamIndex]; AmmoIcon.WidgetTexture = Material'HudContent.Generic.HUDPulse'; } else { AmmoIcon.WidgetTexture = AmmoClass.default.IconMaterial; } AmmoIcon.TextureCoords = AmmoClass.Default.IconCoords; DrawSpriteWidget (C, AmmoIcon); } } DrawNumericWidget( C, DigitsAmmo, DigitsBig); } if ( bShowWeaponBar && (PawnOwner.Weapon != None) ) DrawWeaponBar(C); if( bShowPersonalInfo ) { if ( Vehicle(PawnOwner) != None && Vehicle(PawnOwner).Driver != None ) { if (Vehicle(PawnOwner).bShowChargingBar) DrawVehicleChargeBar(C); RealPawnOwner = PawnOwner; PawnOwner = Vehicle(PawnOwner).Driver; } DrawHUDAnimWidget( HudBorderHealthIcon, default.HudBorderHealthIcon.TextureScale, LastHealthPickupTime, 0.6, 0.6); DrawSpriteWidget( C, HudBorderHealth ); if(CurHealth/PawnOwner.HealthMax < 0.26) { HudHealthALERT.Tints[0] = OLHudColorTeam[OLTeamIndex]; HudHealthALERT.Tints[1] = OLHudColorTeam[OLTeamIndex]; DrawSpriteWidget( C, HudHealthALERT); HudBorderHealthIcon.WidgetTexture = Material'HudContent.Generic.HUDPulse'; } else HudBorderHealthIcon.WidgetTexture = default.HudBorderHealth.WidgetTexture; DrawSpriteWidget( C, HudBorderHealthIcon); if( CurHealth < LastHealth ) LastDamagedHealth = Level.TimeSeconds; DrawHUDAnimDigit( DigitsHealth, default.DigitsHealth.TextureScale, LastDamagedHealth, 0.8, default.DigitsHealth.Tints[0], HudColorHighLight); DrawNumericWidget( C, DigitsHealth, DigitsBig); if(CurHealth > 999) { DigitsHealth.OffsetX=220; DigitsHealth.OffsetY=-35; DigitsHealth.TextureScale=0.39; } else { DigitsHealth.OffsetX = default.DigitsHealth.OffsetX; DigitsHealth.OffsetY = default.DigitsHealth.OffsetY; DigitsHealth.TextureScale = default.DigitsHealth.TextureScale; } if (RealPawnOwner != None) { PawnOwner = RealPawnOwner; DrawSpriteWidget( C, HudBorderVehicleHealth ); if (CurVehicleHealth/PawnOwner.HealthMax < 0.26) { HudVehicleHealthALERT.Tints[0] = OLHudColorTeam[OLTeamIndex]; HudVehicleHealthALERT.Tints[1] = OLHudColorTeam[OLTeamIndex]; DrawSpriteWidget(C, HudVehicleHealthALERT); HudBorderVehicleHealthIcon.WidgetTexture = Material'HudContent.Generic.HUDPulse'; } else HudBorderVehicleHealthIcon.WidgetTexture = default.HudBorderVehicleHealth.WidgetTexture; DrawSpriteWidget(C, HudBorderVehicleHealthIcon); if (CurVehicleHealth < LastVehicleHealth ) LastDamagedVehicleHealth = Level.TimeSeconds; DrawHUDAnimDigit(DigitsVehicleHealth, default.DigitsVehicleHealth.TextureScale, LastDamagedVehicleHealth, 0.8, default.DigitsVehicleHealth.Tints[0], HudColorHighLight); DrawNumericWidget(C, DigitsVehicleHealth, DigitsBig); if (CurVehicleHealth > 999) { DigitsVehicleHealth.OffsetX = 220; DigitsVehicleHealth.OffsetY = -35; DigitsVehicleHealth.TextureScale = 0.39; } else { DigitsVehicleHealth.OffsetX = default.DigitsVehicleHealth.OffsetX; DigitsVehicleHealth.OffsetY = default.DigitsVehicleHealth.OffsetY; DigitsVehicleHealth.TextureScale = default.DigitsVehicleHealth.TextureScale; } } DrawAdrenaline(C); } } UpdateRankAndSpread(C); DrawUDamage(C); if(bDrawTimer) DrawTimer(C); // Temp Drawwwith Hud Colors HudBorderShield.Tints[0] = OLHudColorTeam[OLTeamIndex]; HudBorderShield.Tints[1] = OLHudColorTeam[OLTeamIndex]; HudBorderHealth.Tints[0] = OLHudColorTeam[OLTeamIndex]; HudBorderHealth.Tints[1] = OLHudColorTeam[OLTeamIndex]; HudBorderVehicleHealth.Tints[0] = OLHudColorTeam[OLTeamIndex]; HudBorderVehicleHealth.Tints[1] = OLHudColorTeam[OLTeamIndex]; HudBorderAmmo.Tints[0] = OLHudColorTeam[OLTeamIndex]; HudBorderAmmo.Tints[1] = OLHudColorTeam[OLTeamIndex]; if( bShowPersonalInfo && (CurShield > 0) ) { DrawSpriteWidget( C, HudBorderShield ); DrawSpriteWidget( C, HudBorderShieldIcon); DrawNumericWidget( C, DigitsShield, DigitsBig); DrawHUDAnimWidget( HudBorderShieldIcon, default.HudBorderShieldIcon.TextureScale, LastArmorPickupTime, 0.6, 0.6); } if( Level.TimeSeconds - LastVoiceGainTime < 0.333 ) DisplayVoiceGain(C); DisplayLocalMessages (C); DrawOLTeamBeacons(C); UpdateRankAndSpread(C); ShowTeamScorePassA(C); if ( Links >0 ) { DrawSpriteWidget (C, LinkIcon); DrawNumericWidget (C, totalLinks, DigitsBigPulse); } totalLinks.value = Links; } simulated function DrawHudPassC (Canvas C) { local VoiceChatRoom VCR; local float PortraitWidth,PortraitHeight, X, Y, XL, YL, Abbrev, SmallH, NameWidth; local string PortraitString; // portrait if ( (bShowPortrait || (bShowPortraitVC && Level.TimeSeconds - LastPlayerIDTalkingTime < 2.0)) && (Portrait != None) ) { PortraitWidth = 0.125 * C.ClipY; PortraitHeight = 1.5 * PortraitWidth; C.DrawColor = WhiteColor; C.SetPos(-PortraitWidth*PortraitX + 0.025*PortraitWidth,0.5*(C.ClipY-PortraitHeight) + 0.025*PortraitHeight); C.DrawTile( Portrait, PortraitWidth, PortraitHeight, 0, 0, 256, 384); C.SetPos(-PortraitWidth*PortraitX,0.5*(C.ClipY-PortraitHeight)); C.Font = GetFontSizeIndex(C,-2); if(PortraitPRI != none) PortraitString = PortraitPRI.PlayerName; C.StrLen(PortraitString,XL,YL); if ( XL > PortraitWidth ) { C.Font = GetFontSizeIndex(C,-4); C.StrLen(PortraitString,XL,YL); if ( XL > PortraitWidth ) { Abbrev = float(len(PortraitString)) * PortraitWidth/XL; PortraitString = left(PortraitString,Abbrev); C.StrLen(PortraitString,XL,YL); } } C.DrawColor = C.static.MakeColor(160,160,160); C.SetPos(-PortraitWidth*PortraitX + 0.025*PortraitWidth,0.5*(C.ClipY-PortraitHeight) + 0.025*PortraitHeight); C.DrawTile( Material'XGameShaders.ModuNoise', PortraitWidth, PortraitHeight, 0.0, 0.0, 512, 512 ); C.DrawColor = WhiteColor; C.SetPos(-PortraitWidth*PortraitX,0.5*(C.ClipY-PortraitHeight)); C.DrawTileStretched(texture 'InterfaceContent.Menu.BorderBoxA1', 1.05 * PortraitWidth, 1.05*PortraitHeight); C.DrawColor = WhiteColor; X = C.ClipY/256-PortraitWidth*PortraitX; Y = 0.5*(C.ClipY+PortraitHeight) + 0.06*PortraitHeight; C.SetPos( X + 0.5 * (PortraitWidth - XL), Y ); if ( PortraitPRI != None ) { if ( PortraitPRI.Team != None ) { C.DrawColor = OLHudColorTeam[PortraitPRI.Team.TeamIndex]; } C.DrawText(PortraitString,true); if ( Level.TimeSeconds - LastPlayerIDTalkingTime < 2.0 && PortraitPRI.ActiveChannel != -1 && PlayerOwner.VoiceReplicationInfo != None ) { VCR = PlayerOwner.VoiceReplicationInfo.GetChannelAt(PortraitPRI.ActiveChannel); if ( VCR != None ) { PortraitString = "(" @ VCR.GetTitle() @ ")"; C.StrLen( PortraitString, XL, YL ); if ( PortraitX == 0 ) C.SetPos( Max(0, X + 0.5 * (PortraitWidth - XL)), Y + YL ); else C.SetPos( X + 0.5 * (PortraitWidth - XL), Y + YL ); C.DrawText( PortraitString ); } } } } if( bShowWeaponInfo && (PawnOwner != None) && (PawnOwner.Weapon != None) ) PawnOwner.Weapon.NewDrawWeaponInfo(C, 0.86 * C.ClipY); if ( (PawnOwner != PlayerOwner.Pawn) && (PawnOwner != None) && (PawnOwner.PlayerReplicationInfo != None) ) { // draw viewed player name C.Font = GetMediumFontFor(C); C.SetDrawColor(255,255,0,255); C.StrLen(PawnOwner.PlayerReplicationInfo.PlayerName,NameWidth,SmallH); NameWidth = FMax(NameWidth, 0.15 * C.ClipX); if ( C.ClipX >= 640 ) { C.Font = GetConsoleFont(C); C.StrLen("W",XL,SmallH); C.SetPos(79*C.ClipX/80 - NameWidth,C.ClipY * 0.68); C.DrawText(NowViewing,false); } C.Font = GetMediumFontFor(C); C.SetPos(79*C.ClipX/80 - NameWidth,C.ClipY * 0.68 + SmallH); C.DrawText(PawnOwner.PlayerReplicationInfo.PlayerName,false); } DrawCrosshair(C); ShowTeamScorePassC(C); } simulated function DrawAdrenaline( Canvas C ) { if ( !PlayerOwner.bAdrenalineEnabled ) return; DrawSpriteWidget( C, AdrenalineBackground ); DrawSpriteWidget( C, AdrenalineBackgroundDisc ); if( CurEnergy == MaxEnergy ) { DrawSpriteWidget( C, AdrenalineAlert ); AdrenalineAlert.Tints[0] = HudColorHighLight; AdrenalineAlert.Tints[1] = HudColorHighLight; } DrawSpriteWidget( C, AdrenalineIcon ); DrawNumericWidget( C, AdrenalineCount, DigitsBig); if(CurEnergy > LastEnergy) LastAdrenalineTime = Level.TimeSeconds; LastEnergy = CurEnergy; DrawHUDAnimWidget( AdrenalineIcon, default.AdrenalineIcon.TextureScale, LastAdrenalineTime, 0.6, 0.6); AdrenalineBackground.Tints[0] = HudColorBlack; AdrenalineBackground.Tints[0].A = 150; AdrenalineBackground.Tints[1] = HudColorBlack; AdrenalineBackground.Tints[1].A = 150; } 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[0] = HudColorBlack; TimerBackground.Tints[0].A = 150; TimerBackground.Tints[1] = HudColorBlack; TimerBackground.Tints[1].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 ShowTeamScorePassA(Canvas C) { local int i; if ( bShowPoints ) { for(i=0;i 100 ) break; if( (W == None) || (W.IconMaterial == None) ) continue; if ( W.InventoryGroup == 0 ) Pos = 8; else if ( W.InventoryGroup < 10 ) Pos = W.InventoryGroup-1; else continue; if ( Weapons[Pos] != None ) ExtraWeapon[Pos] = 1; else Weapons[Pos] = W; } if ( PendingWeapon != None ) { if ( PendingWeapon.InventoryGroup == 0 ) Weapons[8] = PendingWeapon; else if ( PendingWeapon.InventoryGroup < 10 ) Weapons[PendingWeapon.InventoryGroup-1] = PendingWeapon; } // Draw: for( i=0; i Level.TimeSeconds - 0.6 ) { if ( BarWeaponStates[i].PickupTimer > Level.TimeSeconds - 0.3 ) { BarWeaponIcon[i].TextureScale = default.BarWeaponIcon[i].TextureScale * (1 + 1.3 * (Level.TimeSeconds - BarWeaponStates[i].PickupTimer)); BarWeaponIcon[i].OffsetX = IconOffset - IconOffset * ( Level.TimeSeconds - BarWeaponStates[i].PickupTimer ); } else { BarWeaponIcon[i].TextureScale = default.BarWeaponIcon[i].TextureScale * (1 + 1.3 * (BarWeaponStates[i].PickupTimer + 0.6 - Level.TimeSeconds)); BarWeaponIcon[i].OffsetX = IconOffset - IconOffset * (BarWeaponStates[i].PickupTimer + 0.6 - Level.TimeSeconds); } } else { BarWeaponIconAnim[i] = 1; BarWeaponIcon[i].TextureScale = default.BarWeaponIcon[i].TextureScale; } } if (W == PendingWeapon) { // Change color to highlight and possibly changeTexture or animate it BarBorder[i].Tints[0] = HudColorHighLight; BarBorder[i].Tints[1] = HudColorHighLight; BarBorder[i].OffsetY = -10; BarBorderAmmoIndicator[i].OffsetY = -10; BarWeaponIcon[i].OffsetY += -10; } if ( ExtraWeapon[i] == 1 ) { if ( W == PendingWeapon ) { BarBorder[i].Tints[0] = HudColorTeam[OLTeamIndex]; BarBorder[i].Tints[1] = HudColorTeam[OLTeamIndex]; BarBorder[i].OffsetY = 0; BarBorder[i].TextureCoords.Y1 = 80; DrawSpriteWidget( C, BarBorder[i] ); BarBorder[i].TextureCoords.Y1 = 39; BarBorder[i].OffsetY = -10; BarBorder[i].Tints[0] = HudColorHighLight; BarBorder[i].Tints[1] = HudColorHighLight; } else { BarBorder[i].OffsetY = -52; BarBorder[i].TextureCoords.Y2 = 48; DrawSpriteWidget( C, BarBorder[i] ); BarBorder[i].TextureCoords.Y2 = 93; BarBorder[i].OffsetY = 0; } } DrawSpriteWidget( C, BarBorder[i] ); DrawSpriteWidget( C, BarBorderAmmoIndicator[i] ); DrawSpriteWidget( C, BarWeaponIcon[i] ); } } } simulated function DrawChargeBar( Canvas C) { local float ScaleFactor; ScaleFactor = HUDScale * 0.135 * C.ClipX; C.Style = ERenderStyle.STY_Alpha; C.DrawColor = OLHudColorTeam[OLTeamIndex]; C.SetPos(C.ClipX - ScaleFactor - 0.0011*HUDScale*C.ClipX, (1 - 0.0975*HUDScale)*C.ClipY); C.DrawTile( Material'HudContent.HUD', ScaleFactor, 0.223*ScaleFactor, 0, 110, 166, 53 ); RechargeBar.Scale = PawnOwner.Weapon.ChargeBar(); if ( RechargeBar.Scale > 0 ) { DrawSpriteWidget( C, RechargeBar ); ShowReloadingPulse(RechargeBar.Scale); } } simulated function DrawVehicleChargeBar(Canvas C) { local float ScaleFactor; ScaleFactor = HUDScale * 0.135 * C.ClipX; C.Style = ERenderStyle.STY_Alpha; C.DrawColor = OLHudColorTeam[OLTeamIndex]; C.SetPos(C.ClipX - ScaleFactor - 0.0011*HUDScale*C.ClipX, (1 - 0.0975*HUDScale)*C.ClipY); C.DrawTile( Material'HudContent.HUD', ScaleFactor, 0.223*ScaleFactor, 0, 110, 166, 53 ); DrawSpriteWidget(C, RechargeBar); RechargeBar.Scale = Vehicle(PawnOwner).ChargeBar(); ShowReloadingPulse(RechargeBar.Scale); } simulated function DrawOLTeamBeacons(Canvas C) { local vector ScreenPos; local vector CamLoc; local rotator CamRot; // local float ProgressPct; local int MyTeam; local Pawn P; if (PawnOwnerPRI.Team == none) return; ForEach DynamicActors(class'Pawn',P) { if(P.PlayerReplicationInfo == none || P.PlayerReplicationInfo.Team == none || P.PlayerReplicationInfo.bOnlySpectator || P.Health <= 0) continue; if(PawnOwner == P) continue; MyTeam = PawnOwnerPRI.Team.TeamIndex; if(P.PlayerReplicationInfo.Team.TeamIndex != MyTeam) continue; C.DrawColor = OLHudColorTeam[MyTeam]; C.Style = ERenderStyle.STY_Alpha; C.GetCameraLocation( CamLoc, CamRot ); // ProgressPct = float(P.Health) / 100; if ( IsPawnVisible( C, P, ScreenPos, CamLoc, CamRot ) ) { DrawOLTeamBeacon( C, P, CamLoc, ScreenPos); } /* else if ( IsTargetInFrontOfPlayer( C, SlavePRI.TaggedPlayerLocation[i], ScreenPos, CamLoc, CamRot ) ) { DrawLocationTracking_Obstructed( C, SlavePRI.TaggedPlayerLocation[i], false, CamLoc, ScreenPos ); } else { } */ } } simulated function DrawOLTeamBeacon( Canvas C, Pawn P, vector CamLoc, out vector ScreenPos ) { local float XL, YL, tileX, tileY, width, height; local vector IndicatorPos, A; A = P.location; XL = XL*0.5; YL = YL*0.5; tileX = 64.f * 0.45 * ResScaleX * HUDScale; tileY = 64.f * 0.45 * ResScaleY * HUDScale; width = FMax(tileX*0.5, XL); height = tileY*0.5 + YL*2; ClipScreenCoords( C, ScreenPos.X, ScreenPos.Y, width, height ); // Objective Icon IndicatorPos.X = ScreenPos.X; IndicatorPos.Y = ScreenPos.Y - height + YL + tileY*0.5; DrawOLBeacon( C, P, IndicatorPos.X - tileX*0.5, IndicatorPos.Y - tileY*0.5, tileX, tileY ); ScreenPos = IndicatorPos; } simulated function DrawOLBeacon( Canvas C, Pawn P, float posX, float posY, float tileX, float tileY ) { local texture BeaconTex; local string NameString; local float Distance; local float XL, YL; Distance = VSize(P.Location - PawnOwner.Location); if(P.Weapon != none && P.Weapon.IsA('LinkGun')) { BeaconTex = PlayerOwner.LinkBeaconTexture; C.DrawColor = TeamBeaconLinkColor; } else { BeaconTex = PlayerOwner.TeamBeaconTexture; C.DrawColor = TeamBeaconTeamColors[PlayerOwner.PlayerReplicationInfo.Team.TeamIndex]; } if(Distance < OLTeamPlayerController(PlayerOwner).OLTeamBeaconMaxDist) { C.SetPos(posX + (0.25 * BeaconTex.USize * ResScaleX * HUDScale)/2, posY); C.DrawTile(BeaconTex, 0.25 * BeaconTex.USize, 0.25 * BeaconTex.VSize, 0.0, 0.0, BeaconTex.USize, BeaconTex.VSize); } if(Distance < OLTeamPlayerController(PlayerOwner).OLTeamBeaconPlayerInfoMaxDist) { if(P.PlayerReplicationInfo.bBot) NameString = P.PlayerReplicationInfo.PlayerName@"["$P.PlayerReplicationInfo.GetCallSign()$"]"@"("$P.Health$")"; else NameString = P.PlayerReplicationInfo.PlayerName@"("$P.Health$")"; C.Font = C.SmallFont; C.StrLen("Test",XL, YL); C.SetPos(PosX + (0.25 * BeaconTex.USize * ResScaleX * HUDScale)/2, PosY - (1.2 * YL)); C.DrawTextClipped(NameString, false); } } static function Color GetGYRColorRamp( float Pct ) { local Color GYRColor; GYRColor.A = 255; if ( Pct < 0.34 ) { GYRColor.R = 128 + 127 * FClamp(3.f*Pct, 0.f, 1.f); GYRColor.G = 0; GYRColor.B = 0; } else if ( Pct < 0.67 ) { GYRColor.R = 255; GYRColor.G = 255 * FClamp(3.f*(Pct-0.33), 0.f, 1.f); GYRColor.B = 0; } else { GYRColor.R = 255 * FClamp(3.f*(1.f-Pct), 0.f, 1.f); GYRColor.G = 255; GYRColor.B = 0; } return GYRColor; } simulated final function bool IsPawnVisible( Canvas C, Pawn Target, out vector ScreenPos, Vector CamLoc, Rotator CamRot ) { local vector TargetLocation, TargetDir; local float Dist; Dist = VSize(Target.Location - CamLoc); // Target is located behind camera if ( !IsPawnInFrontOfPlayer( C, Target, ScreenPos, CamLoc, CamRot ) ) return false; // Simple Line check to see if we hit geometry TargetDir = Target.Location - CamLoc; TargetDir.Z = 0; TargetLocation = Target.Location;// - 2.f * Target.CollisionRadius * vector(rotator(TargetDir)); TargetLocation.Z += Target.CollisionHeight; if ( !FastTrace( TargetLocation, CamLoc ) ) return false; return true; } /* returns true if target is projected on visible canvas area */ static function bool IsPawnInFrontOfPlayer( Canvas C, Pawn Target, out Vector ScreenPos, Vector CamLoc, Rotator CamRot ) { local vector TargetLocation, TargetDir; TargetDir = Target.Location - CamLoc; TargetDir.Z = 0; TargetLocation = Target.Location;// - 2.f * Target.CollisionRadius * vector(rotator(TargetDir)); TargetLocation.Z += Target.CollisionHeight; // Is Target located behind camera ? if ( (Target.Location - CamLoc) Dot vector(CamRot) < 0) return false; // Is Target on visible canvas area ? ScreenPos = C.WorldToScreen( TargetLocation ); if ( ScreenPos.X <= 0 || ScreenPos.X >= C.ClipX ) return false; if ( ScreenPos.Y <= 0 || ScreenPos.Y >= C.ClipY ) return false; return true; } static function ClipScreenCoords( Canvas C, out float X, out float Y, optional float XL, optional float YL ) { if ( X < XL ) X = XL; if ( Y < YL ) Y = YL; if ( X > C.ClipX - XL ) X = C.ClipX - XL; if ( Y > C.ClipY - YL ) Y = C.ClipY - YL; } function Timer() { local TeamInfo TargetTeam; Super.Timer(); if ( (PawnOwnerPRI == None) || (PlayerOwner.IsSpectating() && (PlayerOwner.bBehindView || (PlayerOwner.ViewTarget == PlayerOwner))) ) return; if( OLTeamsGameReplicationInfo(PlayerOwner.GameReplicationInfo) != none && OLTeamsGameReplicationInfo(PlayerOwner.GameReplicationInfo).bDesignation ) { TargetTeam = OLTeamsGameReplicationInfo(PlayerOwner.GameReplicationInfo).DesignationTarget[PawnOwnerPRI.Team.TeamIndex]; if ( OLTeamsGameReplicationInfo(PlayerOwner.GameReplicationInfo).OLFlagHolder[TargetTeam.TeamIndex] != PawnOwnerPRI ) PlayerOwner.ReceiveLocalizedMessage( class'OLCTFHUDMessage', 4+TargetTeam.TeamIndex); } } static function color GetTeamColor( byte TeamNum ) { return default.OLHudColorTeam[TeamNum]; } $=!$ #=$-?)$ ?g' d $=!$ #=$-?)$ ?g' d $=!$ #=$-?)$ ?g' ds  c*eq " $>!$o=$u>)$r>flNx e 'M s  c*eq " $>!$4'?$u>)$\>flNx e 'M `m//----------------------------------------------------------- // //----------------------------------------------------------- class HudOLCaptureTheFlag extends HudOLTeamDeathmatch; var() float tmpPosX[4], tmpPosY[4], tmpScaleX[4], tmpScaleY[4]; struct FFlagWidget { var EFlagState FlagState; var SpriteWidget Widgets[4]; }; var Actor FlagBase[4]; var Actor Flag[4]; var() SpriteWidget NewFlagWidgets[4]; var SpriteWidget FlagDownWidgets[4]; var SpriteWidget FlagHeldWidgets[4]; simulated function ShowTeamScorePassA(Canvas C) { local CTFBase B; local CTFFlag F; local int i; local vector Pos; if ( bShowPoints ) { for(i=0;i 1 ) PlayerOwner.ReceiveLocalizedMessage( class'OLCTFHUDMessage', 2 ); else if ( NumFlags == 1 && bHasOwnFlag ) PlayerOwner.ReceiveLocalizedMessage( class'OLCTFHUDMessage', 3 ); else if ( NumFlags == 1 ) PlayerOwner.ReceiveLocalizedMessage( class'OLCTFHUDMessage', 0, , , ATeam ); if ( (PlayerOwner.GameReplicationInfo != None) && (OLTeamsGameReplicationInfo(PlayerOwner.GameReplicationInfo).OLFlagState[PlayerOwner.PlayerReplicationInfo.Team.TeamIndex] == EFlagState.FLAG_HeldEnemy) && (OLTeamsGameReplicationInfo(PlayerOwner.GameReplicationInfo).OLFlagHolder[PlayerOwner.PlayerReplicationInfo.Team.TeamIndex].Team.TeamIndex != PawnOwnerPRI.Team.TeamIndex) ) PlayerOwner.ReceiveLocalizedMessage( class'OLCTFHUDMessage', 1, , , OLTeamsGameReplicationInfo(PlayerOwner.GameReplicationInfo).OLFlagHolder[PawnOwnerPRI.Team.TeamIndex].Team ); } simulated function UpdateTeamHud() { Super.UpdateTeamHUD(); } vE(wa>UF( vVՒIJIJIJIJZشoIJZشoYY8JIJZشoIJIJIJIJIJZشoIJYY8JIJZشoIJYY8JYY8JYY8JIJIJZشoYY8JYY8IJZشoIJZشoIJZشoIJZشoIJZشo$$$$DDDDIJZشoIJZشoʁ)IJZشoʁ)IJZشoʁ)ʁ)ʁ)IJZشoʁ)ҽIJZشoIJIJZشoIJZشoIJZشoYY8JIJZشorHC$L7 =Cw/6Z<7"P?":";"0$ff>*.$?$-","AB$?*A9`>/6Z<7"?":"S;"0$ff>*.$?$-","AB$?*A9`>/6Z<7"P?":";"0$ff>*.$?$-","KAB$?*A9`>/6Z<7"?":"S;"0$ff>*.$?$-","KAB$?*|Z9`>/6Z<7"?"<:"$;"_0$ff>*.$?$-","(AB$?*|9`>/6Z<7"?"<:"$;"_0$ff>*.$?$-","(AB$?*|9`>/6Z<7"?"<:"$;"_0$ff>*.$?$-","kAB$?*|9`>/6Z<7"?"<:"$;"_0$ff>*.$?$-","kAB$?*Z9`>/6Z<7"?":";"70$>*.$?$-","AB$?*9`>/6Z<7"?":";"70$>*.$?$-"0,"AB$?*9`>/6Z<7"?":";"70$>*.$?$-","}AB$?*9`>/6Z<7"?":";"70$>*.$?$-"0,"}AB$?*m/m/m/m/rl/O/l/R.l/J.m/Rl/V.l/D/l/w/m/&l/D0l/}-l/c.l/V'l/y/l/kl/l/l/om/$l/G0l/O!D0J.D0RG0P&m/D0e.l/El/{-l/~-l/v/l/I.l/~/l/F0m/B,l/Hl/al/tl/E0l//l/e#l/K./q-l/|D0J.D0D/l/D#|/9l/O$l/fl/y-|/'l/el/~m/I0l/bl/mD0M"m/al/Pl/fl/z-l/F/|/D0K.D0M"l/bD0}l/| |/Q|/{/D0u&D0Q&y/x-l/p#@0D0S'l/S D0R.D0z-l/FE0o&l/^.l/ql/E/l/pH0t&l/"l/gl/\/l/U$|/@@0\&l/~~/x)l/Bl/YD0RD0K.l/.l/H/y/[(l/}.l/o#l/e$E0UD0c#l/A0l/|l/jl/o/yl/M.l/rl/R"l/@0E0v!~/Ql/G.l/cD0R'G0\/l/]l/C/D0Cl/gH0i//Ol/Zl/H0D0A(/D E0o!l/t)l/dD0d./E D0y!D0Nl/KD0}\&l/n.D0s#l/D+D0R.l/QE0Z+D0|l/Q!D0W+l/tD0Y!l/_./s-E0S)|/_(D0bz!D0a%D0u#l/\.m/[h'/}!m/cD0T+y/#@0r#l/VD0PD0z-l/A.D0F(G0RD0w&l/i#l/}D0jl/cl/C0m/GQD0KE0N@0Qm/uD0zH0UD0U m/gD0P$G0U+G0-l/I0/kH0bD0v#l/Ll/l/BD0Q'D0D(D0v#~/Il/s/t-E0 D0RD0fE0U@0b)G0e(D0^&D0u#F0Ql/g."KI.l/r.D0A&G0@$/a D0Kl/JD0c'|/G*l/ml/pl/G//f!D0A H0@,m/tD0zl/W$H0zD0Rl/S.l/Q"F0@&G0`&A0no)D0QD0>H0Cl/\l/{.@0vD0F%E0v /n(H0o-D0\z/E D0 F/l/ll/uD0&/g%l/k"l/P!D0nP$H0p-F0Y+H0zE00G0-G0l$l/^~/e%G0,E0[+~/d%l/Xl/aD0Pz D0BG0[H0+D0k+l/x$m/Z"l/z./I"/R D0@E0n&l/Dm/u"/]D0y'y/`l/}l/L.D0mD0G&D0'l/{l/~./6l/xl/~ |/i!l/yD0Q&l/rm/Rl/E0 ~/GF0n l/dD0l%A0YD0_ l/rl/xD0[#m/I.l/Gl/F/t l/sm/JE0 /R@0GD0u@0ll/~l/A|/_)D0e.F0d&/w l/L~/ d$l/Cl/@r.J,/r l/H/jF0x!/} l/N/l/-l/J/d"y/xVl/_$l/E.D0zE0@+G0[/m/Bl/ml/K~/SD0Z#/gF#l/El/q.l/BF0P"~/JE00l/I@05D0M%~/z#@0_"F0El/zF0K+G0c l/Um/V~/HG0A$D0]l/YG0~$A0}F0Hl/~l/mE0{!F0N(l/@/H0 Rl/JH0[/w|/F+D0iZ(l/[l/hD0rl/z//d l/`E0.D0~.|/<D0B(~/{#D0_#D0`#E0fD0pf$E0BE0a(D0O%D0"G+D0TRE0D~/~#@0Am/A!l/|.m/Z|/X+D0RH0zD0P D0@#z/QD0q#l/km/E,y/T(D0z&m/R"y/nl/T/F0e"D0J$l/u)m/GA0ol/wD0"D0wm/IRy/w-D0^L&D0wH0`(D0Kl/IG0,G0B$F0F$G0KG0UG0Z/G0n%~/SD0ul/bD04Z(l/h#F0d l/tD0g/y/p*D0P#/j /C D0u'l/lF0B'l/B+m/b.D0]'G0BE0U(l/T"y/d!l/|/y/r+l/Dl/WD0v&l/CD0|PA0l/B0G F0~ l/tA0k&l/Q.F0d m/qH0RF0o$"t"l/U./;tl/wB0e"s"l/}l/].l/iy/\(F0[!/` m/Pm/j'y/}F0e&|/c!/e D0)z$@0P| H0L(y/:#/jF0M&H0L+m/[B0@"m/G/l!H0\+/m |/"n,"m,/^l/t/E0m&"l,E0y*E0{*~/ c$D0:dD0tm/pl/DI/C/b(G0^/D0Y#~/Om/^H"D0oG0iE0)y/U*D0rNE0/D0xF0f"s"kl/vG0mm/wG0A""c,~/e}D0{D0j~/e_D0iD0Cl/g#D0Z$F0v'F0a&F0Ay/h!D0bB0I y/xl/l/F.@0Pk m/Pl/V$F0^G0{"\,D0L l/OD0]/dD0f%l/nl/N.D0}$D0|$F0x m/@F0XG0U&r.K{B0e "],m/sG0U+l/Nm/]""K"D0[ D0Oy/m*D0` A^"l/OF0hl/jl/|D0I%D0r$D0s$F0Fy/l*m/[""d,"e,D0UB0kH0R@0[v*D0u$D0b'/I+F0s&D0K%y/wE0yF0^(m/IG0]!"^,G0e!"SH0Al/N""f,F0~F0b&H0Yl/nm/Ly/g}"[,"g,D0gF0r}l/U"A0ol/Uy/bG0;B&l/O(A0lYD0P$D0 P$D0P$"o,"r,l/L"D0P$G0Rm/ZD0`E0^)l/vG0j/y/j"q,E0T"L,"CF-B0Bl/E"CE-/a!/b!F0ld/m!/l E0Ty/P l/eC0k/E0E(m/b[y/K*y/q"K,m/"w!/`l/X@0n$/y /\ /g /j!~/K"PH-F0IG0W y/u F0J+"PG-z/e"p,y/m-/q&E0z*l/j#@0b$l/JE0O'D0\#F0G$G0D'l/PG0E$G0D$G0C$F0]~/#E0ORG0x ~/}#G0"[~/eH~/|#E0~G0{$F0Nl/sE0EG0X&l/L/D0uF0vD0q$F0zF0G0@%Rx$Z%E0gD0F l/d.D0G D0X m/G}"i,l/g/"DH"DIE0}*E0n!E0g!l/oE0~*"]z~/_&H0SD0WA0sF0Z!m/g"TD0M."j,/O y/[y/Y y/zF0c y/] D0Ky/Hy/fy/Hy/BF0oE0Iy/by/#G0[G0jE0Z'y/#l/Mm/^Gx/v""h,"u,y/HF0G"Uy/L/_B0J!/p /aC0Xy/S/h m/Wf/X/] l/^D0\"]`"]b"]^r.]am/Ym/hG0C"r.SF,E0E"AwE0~!"x,y/R/q D0|"w,E0Sm/A"Y'm/Ry/jF0I(E0Wm/a"m/q""v,l/ky/bD0Zy/[y/ul/V"~/}ZF0wF0vG0`"y/z\y/X(y/kE0W'y/yy/ID0NCF0x"l/q"uy/Z"z,y/rA0u_l/Sy/ #l/Wm/\"Ab"m/p"E0Hy/C~ o"y/|"{,y/`E0g'/ws!|/wS!y/Al/pl/tF0Ml/wE0lfy/vy/^D0X'E0MH(F0RF0S"|,"y,~/lcF0`H0Cy/_y/H l/f#y/#y/fD0J"l/m#y/;#y/Z E0m(y/vD0U'"~,",l/k#F0h"X,F0lcE0f(D0a"Y,A0y%m/\]m/f"Z,F0d m/k"M"Ny/["W,D0m'D0U."@-E0@(r.er.d"},D0~'D0q+~/wSm/`-D0zm/BE0M(r.e-l/M//RD0ph$y/_D0KF/|/H+r.f-E01y/?GA0@'m/j'y/Nn.&V,G0i&D0t#D0I#l/l#r.SG,E0E0E0`)y/Z)y/Gl/KD0^$G0m;r.CC-G0m?g.N,F0l&r.CD-m/\@0_/E0M F0LD0U#@0pkF0N F0r(F0s(F0(m/XG0}F0V!D0d#y/jy/IG0J#y/~ y/s y/Oy/ly/`y/aE0C'y/H y/pE0TJ#E0TX)A0w)y/x[y/xx l/R$G0f&E0V(y/^jm/P,~/B#D0g$E0Y&D0Ey/Jy/bF0S&y/2w y/] D0J%l/v)l/iD0P%E0ey/D y/@l/T.y/R|/C+l/W./a'A0Cy/?jH0sH0t/w/xE0yD0D%l/p.r.]@D0v$D0F G0W&F0X ~/P "]ym/\_y/CD0TD0G B0[H0zD0_%D0`%E0D"y/Jy/pa y/?#y/"`y/#y/"`E0{y/u y/pX E0I'l/Cl/DF0W_y/?s /?JA0cE0FD0nx/VD0mD0iE0jD0Fy/ty/Gy/ty/QE0ll/@/cy/h l/yl/pr.]|r.]{r.]}r.]~p.ym/Fa/Ga/Ba/Ar.^l/q~ JCr.]xl/u~ GIg.hbg.h\r.]l/vy/Rl/rA0pcF0iy/"h D04hE0ky/gA0sl/AF04pG0[E0F E0Dy/pXl/Ey/Sy/Sy/_ y/Sy/?vy/?C y/?xF0?_G0Ey/4ey/Sy/Yy/Ky/}l/Xl/py/Fl/y"gm/KfB0]r.SDr.SEy/e AK\G0P&AK]AK^g.\ag.\`"ig.djg.dhr.gSr.gTF0wy/_ D0cF0lv~/oH0gG0n~/`D0Db~/ay/ H|/U!~/mW/y/Hy/Rx/D!y/H~/j'y/}D0hD0iy/aG0Jy/F y/HD0jF0x F0xOD0py/^ ~/LE0q!E0r!E0lk~/w|!F0wb y/#y/cy/lDy/F0my/ W y/l#D0Ny/fm/em/D"rG0j+m/ZG0G'F0ny/d"]_C/0vl/ql/pl/ol/s"Tl/|y/OMl/f F0N!"ry/U ~ |~ l~ xy/|y/lF0v/l/gE0xy/k~/z~/{y/q D0>My/} y/_y/Zl/ey/i y/f y/ry/DF0fF0)hy/@y/ey/}F0K!y/{y/Ky/Iy/iy/JF0`!y/7Iy/nG0hy/o y/7b~/py/VKy/VIy/Vby/dG0gE0['y/^y/Ky/wy/[@0@y/x/g/l/rF0_!y/ry/Jy/Sy/Ql/Yy/uy/uG0_y/UG0lG0B"E0ly/y/Xy/Gy/p/p!/k!/{ /i /o E0F y/ky/e ~/u!~/t!~/^!y/NE0mF0cy/Jr.c"o"n"p"qF0MVy/Uy/Gz/eE0X*y/|y/Vyy/yF0Nsy/Xy/@y/cl/S"y/]G0e(F0MVy/"Sy/` ~/dE0YA0"X"A0"Y"G0W"y/DE0UD0al/i"l/j"y/eV y/`y/ny/#D0hF0MA+y/oy/ry/Vry/Gy/Qz/PD0_y/Il/n#y/Uy/|D0MZy/wy/jy/BC0OG0U&y/iy/Oy/YD0Py/pD0yD0)p$D0px&/@0PHE0Y)y/gy/N E0~&G0j&y/cy/jy/_y/bH0z'y/qy/p~/ \~/ l$E0~E0J E0{F0[F0R!/p(/o(/TF0n{&y/ly/DE0N'y/pF0B)F0\'F0Ny/Fy/q y/cE0py/GE0r'H0T'H0l'E0iF0\'D0]#D0^#~/QF0oy/Dy/pD0o'y/wD0TH'y/T#E0TI'l/L%A0T|*E0T[*A0xe /xyy/W y/xv~/^m)y/^f y/^w y/^` y/jy/^qy/^| y/_y/{D0P y/^Z E0L y/V G0A%y/y F0sF0T&F0h)@02F!y/bG0A%y/O y/jpy/E D0W%y/L y/dy/^y/fG0@%l/p)F0CG0$y/FF0ty/[ y/Ay/T ~/[ y/zy/S y/wy/h ~/2N%D0H%y/zy/py/[y/{ y/l y/i F0q~/l$~/k$y/vD0T#D0\!y/s y/y y/r D0P y/w*y/](y/A D0t$y/Y(y/S~/T D0I#D0E%D0U D0s'D0t'E0ky/#E0jy/r ~/T D0S#~/w$~/y$~/G%y/y/c ~/C%~/m$D0Y D0O#y/pD0R#D0Q#y/X y/oE0im/k)r.l)y/UD0n"I-H0C!F0d ~/yy/S(F0c&F0Q "[-"Y-"J-y/u "N-"O-"P-"M-"K-"L-F0U "CU-G0p&"CV-"CR-"CQ-G0\)"Z-G0])F0F0}/a)"SI,"SH,n.&U,F0h&n.&T,n.&S,g.1c-g.1d-~/L"FD,"FC,r.Q,r.R,~/B~/ME0}'r.`,r.b,r.a,r._,"k,g.O,g.M,g.'t,g.'s,r.CB-r.CA-r._-F0G(y/R(r.^-r.X-r.]-r.\-r.W-F0P("Ua-"Ub-D0u%/C(A0Q(E0TU)E0c(E0i(E0k(F0P'"CS-F0v"CT-F0[ E0l(D0r&E0h(E0g(E0j(F0L'D0Y F0V F0F F0Jy/y)y/z)y/r*y/o*y/j*y/e*y/jx/h"y/Gy/}y/k y/SH0`.C0j/D0|-F0f"C0}/G0m:G0m7y/Km/ti GDv kKc.v,@,D i- Rtm%_Zm\$ {?@,H!Z&Vi- dg-qK)P|% MZ @Z!X ZE)gli- xW@, E| Rc.ai- o@,| i- Jz VQWPvma#{2i- IF J$Vc.`g-nN h- |\@II& I Q$ V w+c hr J B ! [ZN Gg-i Xw N F bgR ,Ma U i- o d e{ W#` u(n H~ }t% L hY \$j R H x bv@ W_N g- \ b@,i @. w U k%C  i- R c%_ M n N i- {  P$ G ~MZT b a Iw n S | q(H _W T$ e mv- r T  x) L ti- Y i- f tN# s !{ @ b M ,i- Z h@) g i- s k-@ i- N !P [ A)h y \$H E K/V E J/e }`/ t K/A N O M \ J/i x% x Cb+E Ey zT x% N i- [ ei- h  P$ u S B bOO !y( ] x(j U Nz x{+I i- W Q$ c x p $i- } N k%J  Y N S/f AK&t _B QP ,R) _ g-l g-z l-H x% V  yc H q \$~ Ki- L \i- Y F e p%r \$A c O x e\ ^vA c.O i- ] K j \$ w P D O P U _ L l A y }ZH v- V i- c e) o tq| c K i- X ; d \q ]+ { N k- Z h- g @,s U A t(N x^ }wm o-} E K NX \$f e t mA&@ J N i- [ i- h F&u A/D B/ R i- _ .l V { T$ G n+T I b g-o Qb+} >}"K Ob+Y P+ g X#t P& B ?i- O W#[ T i  g v \$C YI&Q a|_ Sj m !z( W g-d ii- r q% ~.M !~ [ n~. h F&u lg-C X' Q i- ^ F&k y" z cq%G _'U e)c _'q B.  g-L \$ Z g-g 2h- u  i- B \$ O re\ {j bK)x /a*G q V /`* c { p 2\$}  HK 2xY _' h vu X%C tbQ tb)` lo  x% } Cg&J  e) Y IZ  f Bs T B |i- O l_' [ l@,h R&w @,E 2g-T V b ;i- o C& { $p%H C&V J d i- p $+} O |L a# H g-U Ec g-r !^ @ \UM !s) b !~( o _c.{ SI z" X k-d B ^ r u+ P V ] v(j Hz #bH i- j 'h*v L [D ;p+ _ _g- l  #Mx Sb+E H* S ;N ` @Km   x VvD U R 5i- _ zP&l  s*{ /i- I aU y(c g- r n" g-M Di-[ sw%i th- w \P$D u/ R PS* _ |(l bn { =i- H i- T dC) ` D)l Tc"z |BH KU V G c $g-p x'~  Z(L $Z(Z v i B v k- D k- Q h- ^ sg j a@,w G&E W(S i- b c.o A } ] J v V f+ c ^ ep .g+U b c !]q h@ lp+ N sg- [ Ci- h {y+ u \$B IsP a` E } o /c*~ v+ M e) Y x% f 3g-s xU A C@,N q*\ ~ j K#w E ~ E ^ T Hi- d Bg-p {j ~ ] J l F&V td sH s Ai- @ q%L c+ Z L!g h- v a+ C e+ P Q ^] x%{ cg- J *O V d'c i- q ~" }  Y%J sN* X $m+ e Ah/ r i-  i- L ~" Y s*f ]x.t ri- B i- O i- [ 5X h 3^* t eg- A blN ~\ l-j bLx i- G Y S p+ ` =]* m @! z i- G n\$T ih- b 3i- o Oi- { GjH Q+V ASd ,_r Ab+@ X N ,N [ Q$ h U T) u i- B U I O l-[ 3L j i- w ji- C ,i- O Ak-\ { k g-x k-F te+ T i- a i- m =P$z bK(H oi- V z(b .q iH* @ F* L !Q X  e) e KP&r n* @ boM i- [ V&h |L#v ]$ D eh- Q e_ ^ |M#l } z{ y u F)B e)P ci- ^ ]y.j AU x S g E >C l i- y y E ]w. R e _ %sl _S$ z _i- G \$S Vk a y n aY} I K  P$X Bi- f e' r \$ a#N F&\ @,k S y R)F i- T ai- ` @ m i- z e) F aH* S Rh_  s/m B~" { v H g- U W#b G| p %q  R&L k- Z I zf i- ` zm l !Ox g-H J)V F&e q+t zB {%R Yi- a {i- n tz `H A@,X G f U s !B@ Ij$P T$ ^ $W) j J v $O" C e P ck- ] i- j F" v U B \x%O K\* ] Zx%j O x a#D u X/ R A^ Al Pq+z Pn) H LsU p+ c ;C p b } rt* J (i- W %"c L*q ;Y  X. K ~% X R&e `t ,O D X#Q % _ g&k +n y 2i- F .n S 1n ` 0v% m 5@,z sM* H s% U 4n b ;@,o  {"} /b*L =s+[ W#i ]/w h. F i.R CK a 3K n j.{ k.J l.X |f au lD E& S u` K@,n %r | mI i- W Ad qi- r pq% ~ DK a.Y i- g VB# s 9i- @ Vu. L N) Y i F&e %Q$ t M) A TN P ] [ j [$w _Q$ F '}( S '_ ` 'a m [$z '[ I G)U x d |q i- @ W! L k Y C f r s t @ p'M AO[ ,s i Afv   E AP R bK#_   m I&z K#H tD* V M c F# o jo%| ks% J ^% W  i- d o%q i) @ bR L i- Y [% e !Z r qi-  | }K P H ^+U wi- d Ad p o/ } p/ J aP* W T+d b r A\ M N !r)Z P$h DJ&v @, D AP&Q }& ` F {Nm Az{ ^| K AQ|X DT i- b ^o uc~ |"a vo u_} UQ$ \ @ h !T u UT$ B q*O A ] x^j U  y U  F F#S Ug-a IF o T/ } pV I IJ# V cx* c  P$p  R~ JM g-[ Gk-i aP& w Gi- C <i- P _P] KW*m Y* | Pi- I OA,V Cg&e Ovs * A g-N \$ \ m" i r"v Lq+E N S @ _ W l OW*y A' G k* T b a G[.n A' }   J jNW | e <W u E H B C. Q <k ^ z%j i- x > x% E { R > U b O* o O | b# I {'V M! d B q E E ~ !sM h- ] i- j !V w U D > P$Q !i _ Z.l 0 P$ | Y. I |& V !q) c F&p F& 2T/ M !W Y n* f k r +v- _' N +C* [ V h W u  P$B s P !Y ] Hj @ x i- E |P R F&_ g- m |O z tI) G  T tE* b |] n |u  { x% H W#U q*c _ q b# } i- J ~sV a j% I a i% V a Q/ c  j- p c) } |"J J X 0 q%e a R/ s v@ L# N K [ 'f* j \$w dE A T a h% a U m 'ry II %T$ X }\ e }[ r }I*  }J* L G"Y [)g q u @,B W#P P&^ /g#m W#| ` J f) Z f) f d+ r /u* ~ d+ K %U/ W b+ d W#q a# i'M \$ [ J h +t /@,C .Q 1` sx%o 4} A `L f. l D y CO) F CF R CL _ O l E@,y  [&G p%V T{'e Y@,s L) A ;i- N 2H. Z 2a$ g M' t O* A w N bn' [ u h ~(u B! D w(Q ]a ,x p v R} i- O bZ\ AQ j kT/ w  AC AR R __ Qm bj+ { bm H bKU A^ c AT p `+ } N RjI H$ s a+ @ j aM Xn I$ | q/ I q%V _d r/ r .h+  o XK Oc X dXq n* I zu/ V E R%Ac   d IV q IW ~ L#K [\$Y lng V#U YQ* c {p YR*  xJ)K XvZ xt+ h uf' u si- A I N r|+[ ni- i gN& v J'B 5W P \b# ] Zb# i Z* u LJ'A % P$ O F\ Q* k Lg-x Qm F Om S M\$` PT*n Ck' | C_H U V % q%c OF) q i- ~ k K IK#X !lAf Ufg WfMt* sL|"T  MYfZEp-@Vq+ Nr [VK( hC|' u iBK`' PGX]IXkV yVL#GLi UHj- bLXoNX}q K[RX]TAf[b+zF+IF@,WMw' e bxqVi_n-wovF^m+ Tocai'p C~nt* Ld_ Xag-dam+r {@ TNrX \ List* wtH)CxH)Q  _xz+ lJ(ymi$GxI) U2Q$ bM#n=+}tI) KnG&X V%uft^[{t+ j wtJ)E{H)S{I) a;h/ n U%t{H& o T%/| S%.kE N$\Y!H w uE M$\lM#H !H|Wx+ S2 `2. m5`$ zI) GL#T y`bALBzW#QsH*_scmA{zX#KA}Yza# i/kvK(Dp-R%l+ aAknAT}rO. LrP. YM#f/d* u !Y nA@,o#4}L#qq%y"N^ \siM#x_+ GL#T'\ brobX ~U K%\$X`f%g-tlM Bli- Oi'[H* ibF#vbh DbsQ`_"v-nK#|sJbTXbIfbBt ~+ B o+ Obf[b^ib wb E,S+ S,R+ _+G l !] dyQD]^a k- pbv-}V K}( X!#^ e_CzRI) aG! nH){ ]$ I FU`H)d@ r`I) `^L ![`J)ie) w ]$ D> e)PU ^v-jG y E! E vi RQ {`HG}Xg fm.rO+AE { OF& _<V l<@ yN+F<F&T T/ b}o~}UPKs% [e/h @,wE | FkxVd/N X ]g-iU wD. D y# Qv]U k!A* xt* E!@* QG&^H& l~Jy!~) G5P) T5Q) a!}) m!|) z!{) G2Q) T!C`g-pV/ ~(P& JF#WK#e&  s T @Z La#Y[ g\ tu/ AP& N] [d+ g!G su/ @t* Mr- YHeSty& C$p- P} ]U W jdw| F g-SU X aq' nn' {U Y HSfUQ$ {@,HwV!md!yre@U P/ Nd [`hW#vt* Dx+ Pg- ]K#j x  xi'Eu/ Ss  `g- mg) zF& GO&Trxba w# q e) ~u/ K|u  X|t  e|I r|J |D  L|L  Y|K f|s|M B|D O|@ \  hG#u|L C|Q  PX#]|T  kF'xu/ Fg- R|M _pfl|N RBp _Bq lBf  yBn  F RA# `|| lW#yX#Ga# Usfb|E H kU in|Q }wfJ7Gp7F7x N7} ]K' k|R xF#EQ$ Sy& `\ mg) y@  FYS}l\{!_ J` Vy& ccp`k~P& ibu!kCb qQtB!X R!W _Slq%|!M JSkWMkBLkm!n X"@,e!L slH@c. HyfU  {@ He Ui bA oG |M IP V]%2c!k UD bToV~!s L!K Yi nf{jT}f~n od KfSGiy!Ub!TpN Z ~b J!PWa e!Dr&H@&K&Nu/ \o qiK GZ'zlhW TBfaEfGV mF#zBiHK Fqx Y/@q oOJf~~Pdr qsKfdx z JB Vt c!r,pLf\k BF' O~ o\ } KQ  Zh gl  t| sAZft]fZE+@ ~ N!l B]<H  _ E llE M  Xz  ew qrG dcJo.G FU GdMx# sS@,afM F&sqqBVs. s   @Yb+MVt. \E P  i[@, ugfBlfhyfN\A# tX! @zfM`/ s}y@U y}F] T}Oa P WpT! G}TI! bByo|fhu NZ[R Nt@fBT! hYun* N G[ n/ jAfw!WZ] b%wEjEFjoHjYhS/C!k #Q!dctm vWH  MjM Zbm g k pt i pd g-TF# bh gobiV#m% dT! q$m% ~g-KK#Yg-g uKfB\ ph| { kXnS/CLfQb] wk- C'|( PzZ]MfkznQ}] a^ umq Hob [ gQMxL#FuTM#d F&s PlBzHnuo~wN_^xlu^|yK MqYL#JzX CqfM#WAt fNfZ{@ ~qNe' |Ln* Z}g U guq\ |qm~^U lnywGmV{Rdd+ vzsCzSD czCpK#@c. NF#[d i mNv0 H! Di\QAcmAd|AfK] Z/_*Y!@yhU aQ Kn" F&y%+ Hq|%UqE+cq}%q0 g" E Q%@LPyLt+ E KR xl]0 i+ IveV\%{a f`!Y^ F9Md0 l- rb f qUegfz0  `" z mg fy;K&_;B%mff|~ eb% c.G2T$ Uz ebefG% i- mm@& zv ZG_fa |GB*OU%  d[fqXfWqi- }VfIp Zoqq%IT0yWcg-P0  ^AB%kMfzy`oX$ nj{" {DeGGl~ezfC# _%  k{exF#]U0Zkdu EegR]Uy`G g-greuK#ZpfhRhN5UvofDnfj5GP5 ^^D& kkfxhf^whDgflP\$ RSm _o^lPF JefW\%D} sAFOcf^0 i- D[~.Q `_Kv-n% l- |% i+ IV VaddV HVb# V0 c.c b# q_h}Zhe!N%Mm rL`@l"O% g" ]w" j% H! wW DX TadftOV* Dy& QQ^^#G|}HC`fK2_ DqeRCuetFxW #j~y_hW #jGZ (qN=YW #jVB b@W #jb eCLS 8O V hGPu- o qP|C cL HSo blBc$nWvRWE# ``|m#Yi`|B#Y~#lW5#HC#lKor^w `JU5US_ S/r HmaA_CN AkqQ5Q'Bhu- i5P*uoY$ _5i hklr% S5{w_AF _VAaxu5r TmAI[AA|u\5DHQ AAhY A^QAxW RAc|_{u- [5LhAKjtL ^ j} vz BGuNY fW C[ZbkJhqF%rd+ Wd( d^' qu- ~qq #Jqx(mu- Uqj2au- Su- `qv*lu- VqC 'bu- IbOuVu-KbIiYu- Bd'ObK`]bBp}lbQ~mu-koypIbLqYbiqJbGn{~^+ i]+ vu-Bb_bPD#&rs ?Xu- Wj:cs _]VH|u-D br]RK) oQ+ |G^I~Fg>g~e u!N~M+ C Vj Lu- v ECu-HW#V x .d R Ru- _X#kW#y dG`sku-^aslX#_OQmV+ ~l^Ku- i~ 6uW#kvpyGXiu- Au/ Nz&[ \Dia#mX#{u/ IT$ V[Zcu-}7x [Ku- fu/ rz& 7\ZMa# gX#t #/Bjqu/ [T$ h7[`uu- UJHanGiX#pW#~u/ LpRY BTkBVeu- dX# p |Z}|V^Wu- uh'HgAe'H Lh'bytu-mP& {o wH'{ kf KjH uI&B]z#P'P2sD eu- qu-}B'Y nLv| z'] Rvu- H^'lFT '[JZu- d['Y{ q 'uClu-o 'z}'S}| u- y'UqEU Zv u- P'[A\u- ]s'NWjs'k #AI'@` dk'] GDm'W@Ku- K'zRXu- j'Gcwq RZr'#`lu- L} @Y'vY|'l iXokA u- l'pyyn'r-r'@8_'f2Wt'd2I{p{'i*k'g* s%|"@r N!vsZGD M-u- Yu-e/u- t!RTA ![tU !HSII q \!TM5u- L !fNXu- f2r r2q !GSL;u- _!h jl=u- V!wBcR OeAu- t>u-A!D o P!OGDu- F !SmRFu- !|fKIu- q u- ~ !jH KW* S!Zp_g aOu- pW* }!RZI !P O c3u- rLu- ~3g-KVu-YD [g!UWBXu- Y!pne!|bS[u- u!fpB^u- re -!A~l]u-jau-x!T eFcu-k!Nhy dad]&zd[ Iiu-Vi d!wLq!Z T}mu- Qy lj]!nIG!u@Pu- P!Vp]![ YM{ bUf !|q {xu- lxU xx\$E\ k'S!w&zzu- `![Jm!SPw !RLG!vmSu-@z#CNz}hQC# yzh hE!BrmF# _zgBl!Qun!}:cu-]!mCkK_bnK`APK`KQ!ul\u- HKh ]U!jTrb)F`qTbEu-S !ZJa HTkS/u- n!om{u-h !Ipvu- f!&ru- X!Aqe!hEVu- [!CPhu- x!f\D|J`u- ju- v@mB!g_ou- N!) [rC hu"tr$Vg- z bOGB V!Sb^#pdTSJ#ge6JH#@Du Ns C!a OQ2X w"JWU#lH j$OF' srd@!j)d jDs Z awu- Xyrd B'Vbp}InmKv[ e2QGv#Cg- f w#sbaVIAwKexI1]Gv#Ng- q w#~baa\}^B O "`IABKeCN1hH j#YF' | w#IWU#lI)OE 2xH j#jF' Mr~Zc. Xyse G$XXj| `5f Ei[u- DJ.Pi(~E' fj$sK#AF Os] L/l f 3[IuNK7C bpzQ#9jQa#9cQX#9\QJ#9U UjgN d) uu-B ` jQ UH#{Uj#^ Uv4A u- uUZ0B O&rrHl@HplHK\ #4g #4[ #4O #4C V @w | jw#`au- A qtN w cB|yeu-s%XB![)ZgMFh[ n\ {u- HgWmTUpAu- q}s~` pq u- a yFm"u- sG?$V) ~g| K&u- G{QT(u-egws,u- jXjw }ja q\4K/u- g }jtZ^^2u- | )}jI\Hs5u- { A}jH]Pr;u- B #gOo#gvp#g]q#gD^Mk=u- x]gD?u- k_bxAu- Z BhgCu-O}n ^Eu- LOzXHu-R}J`XajKu- Kn NWuTeEOyX5HSu- }u'IOz pj)|gZeRO vQWu- GjJS[Y]Yu- vcFBVu- H `6U K) K}zX]v. RSY _}{xCOsKk2B C1mE)^bXl{(DrS/ Sp+_ju- JSUWLblJGNS/ Uq+a #OLqu- [xUhuu- }uj-Iub+ Wu)dw MW MZN g u ost$bzFSTT~}+4@hWzh |u-b!}+4Xq!]SCI!UQL!}+4Tg]!u-q"d}+4w@"]u ow"SBf"}+4Ch"}+4Dk"u-o"}+4WF~"FxU"}+4BM"uSO"}+4AN"}+4hKO#u-w#}+4nF#}+4Ft#}+4Ez#}+4`#XK_$}+4Dj$ yfn$}+4CT$ nfW$}+4x }$}+4Yu$a hN$X yv$q}+4R o$}+4uA$}+4}v$YIs$}+4M|$}+4II$}+4@R$}+4k R$u- }$^uI$z}+4A&~$}+4F%}+4HE%}+4GM%}+4GT%}+4L[%}+4Ng%}+4Mu%}+4MB%Yd\)O%u- x%}+4ND%eeR%}+4Pw%}+4OG%}+4OV%}+4Je%}+4Lo%}+4K{%}+4KF%}+4LQ%}+4N]% }+4Mk%$}+4Mx%,}+4HE%1}+4JM%2}+4IW&}+4P`&}+4Rp&}+4QB&}+4QS&;pwd&}+4I[&}+4Nd&;gp r&}+4Pb&}+4Or&}+4OA&;_kP&q}+4P {&p}+4\ K&;cEg&o}+4V l&l}+4JB&f}+4LL&b}+4KX&V}+4Kc&S}+4Jn&;@+x&u- c&R}+4Lo&Q}+4K{& llF&H}+4Kr& H l}'9}+4Ni'8}+4Pw'/}+4OG'*}+4OV''}+4He' x_ m' }+4JL'}+4IV' }+4I_' }+4V h'}+4N~'C& L' N [X'}+4Ps'}+4OC' O FR'z X'}+4Oe'}+4Kt'}+4~' DR}'}+4@O'}+4O' y PN'u- ^'}+4k'}+4Lj'}+4Lv(#}+4KB(2}+4VM(7}+4nc(}+4XQ( }+4ii(Ey XR(A}+4F j( }+4^p(E pnN(t G|(}+4G+C( }+4SJ)u l]) }+4RI)E _h [)r lC) u- o) }+4T|)E j^ P)p ln) }+4SZ)E i Qm)o l~)u}+4zj)E L Ud)y}+4Py)z}+4OI)E wMX)}}+4Re* u- w* }+4V D* ` bZ*E W Z |*}+4h V*}+4^~*E za\*}+4E}*}+4BB*E JD*}+4AC*}+4iD*E z |m*}+4hi*}+4TQ*}+4Se*o}+4] x*+ }+4U+rm lT+- }+4@+rl l+/ }+4k+rk ej+E t |O+r}+4n K+g}+4Wy+}+4HP+}+4IX+}+4Ia+K}+4H3j+}+4Jr+}+4@|,}+4]r|-e}+4k"Y.E X zD.; g-~.; u- L.E owX.> F&O.> u- ^.]}+4gk.B}+4mR/>}+4L/E }+4gK/Vf*r1G }+4EX1Et X]1)}+4P u1&}+4E1L }+4DD1 pb H1Ep Xj1}+4K B1 {SM1}+4~`1}+4F7^1R }+4Pd2!l it2 }+4>]2sS/ \2 y Uh2U u- }3}+4jjI3Y }+4ls3g S _4kN r4\ }+4j~4Ec Xh4}+4K @4_ }+4]K4] Kh4c }+4]s4 A HP4a Z(X4\ Kg4e }+4Zr4[ HL4}+4j T4h }+4I~4W IG4 ^DP4m }+4LT4i u- `4 zNl4S gz45}+4koa4_ L5A}+4c\5v }+4N7r *M7r u w7r u- D7p nP7J g~7E _e7J/D7z }+4Ms7D g@7_Gg7s bn7o 'P7} Y/w7k )E7 Y/n7 u- }7`XI7}+4Foa7;}+4qgg8 }+4~X9XzV:h .P; u- ~;b YJ; }+4f:c; C eI; }+4[n;b/I<c/Y<nPi< }+4Ly<G dE<}+4Xi<!}+4Z A> }+4|[H!N aWH }+4MxHpsEHV gxH}+4d_H}+4zCHC[& }H }+4lIHLiWuIc MLIJ}+4LYI u- eIS YqI }+4M6JI }+4|WI Y hSI.}+4Z{IyY%UIoJcI }+4pmI u- ]ILe\jIX}+4PFIgJVI }+4o`I u- OILb\\Ia}+4OxIFoGJU}+4K vJ f AJb}+4gNJ}+4NuK}+4CCO|}+4AFO}+4|'GP'}+4pCQ}+4CsT }+4IKvV@ iW }+4mhWL[\UWs/ qW w ^}Wou_[WeAzWf@{Wi]{WeAXWf@YWi]YWeAvWf@wWi]wWeATWf@UWi]UW j~rW k~pW nnW j~mW k~kW niW jzhW k~bW n`W jz_W k~YW nWXkaVXkawXen XXf`FXen fXf`TXkJtXlV~XmTTXkJhXlVrXmTHX}+4M\X }+4yiXE J0AbXE K0AcXH jdX }+4|NXE L0\JXE M0\fXE K$;BXE L$4}XE N04qXE O04eXTI gYX }+4~@X P0/~X Q0/mXTJ n\X }+4}JX R0vGX S0u}XTK nrX }+4}`XTM n]Y }+4AKYN zLY}+4bFYV0 h]W0 H]X0 h]Y0HH]Z0HP] }+4kmX]vaT"C^