*~P@( 'ҟ6gS"=J5'$(PNone WinWidthWinTopWinLeft PlayerOwner WinHeightbBoundToParentbScaleToParent ParseOption StyleNameCaption__OnClick__Delegate BladeIN_V12ButtonClickedCoreSystemEngine ItemCountConsoleCommand BroadcastHandleKeyEventLoginAdvancedEngine GetPawnListClientOpenMenualog TextFont OpenMenu TabOrder GetExtra CloseMenubFocusOnWatchPostBeginPlay Collision LightingKarmaForce LightColor GetMapList RemoveItemGUI MovementDropShadowText MultiTimer DOTZGameTimerTopPage ServerTravel MapMatches AtCapacity LoadClickedEndGameAddItem DOTZMenu SecurityPlayerController__OnKeyEvent__Delegate SendMapListSayUpdateSpinnyDudeGetLocalPlayerController SelectedTextInitComponent DOTZEngine drawToHUD RenderWeightGetTextPlayerCharacterSelectParseKillMessageBINCharSelect PickTeam SpectatingOpenedPostNetReceive SetFocusUser FullTimeDate LoadPawns ChangeNameGlobalAnnouncementServerSetPawnClassFindPlayerStartKickBanCancelClickedHandleCharacterSelection PageCaption SetPawnClassKick RefreshPRINotifyLevelChange PlayWaitingOverridePlayerControllerClassServerReStartPlayerGiveDefaultInventory SetPause ErrorMessage ChangeTeamMessage bMultiLineDEBUGBasePawnClass GetStringAltFire InitGameServerViewNextPlayer ClickSoundKilled GetIntOption__OnChange__DelegateClosed ScoreKillAddclogPlayAnnouncementFire HasOption TeamSayGUI BINPauseMenu BINMPFailed CloseAllAdminbDelayedStart PressFireTxt GameNameMouseEmulationbAcceptsInput StartWave BINAdminMenuPlayerControllerClassNameWaitingForWaveTxtHUDType GetIndex ModifyLoginTeamSay ClientReadyDeathMessageClassbRestartLevelNewWave WaveCompleteMOTDMsgBox InternalTime RestartMapGetActionablePriority BladeINHUD PlayerList TeamScoreMatNGAccessControlNuke_All_Pawns TriggerEventAllowRessurection KillsMatLogoutSetProgressMessagePostNetBeginPlaySwitch ZDOTZMPSayRankMat PostLogin TeamMessage BeginStateCanRestartPlayer ClientTravel InternalDraw TakeDamageContinueButtonperiodPossessSetName SendPawnListDeadSetPageCaptionSendMapListEntryPlayerWaitingZombiePawnBaseContinueClickedSetCustomTextures SpreadFlamesRestartPlayerDisplayProgressMessageDecodeStringURL CheckScore OpenSoundCaptionMessage QuitButtonbVisibleWhenEmptySendPawnListEntryHandleParameters ScoreEventBegin NoButton YesButton MaxWidth MapPrefixHandleHeadSelectionHandleBodySelection EyePosition bTeamGameServerSetTexturesChangeVoiceChatter PreventDeath NotifyKilled PreventSeverBringUpScoreObjective AddCheatsClientSetRotation ModifyPlayer ReduceDamagePlayTeleportEffect KillEventInitPlayerReplicationInfoPlayerChangedClassInitGameReplicationInfo UnPossessbAlphaTexture NextWeaponClearProgressMessagesCheckIPPolicy PrevWeaponUpdateSensitivityTempCloseToNotifyTakeHitSwitchToBestWeaponClientGotoStateGetHumanReadableNameClientReceive LastWarningDisconnectEvent DrawTypeClientLeaveVoiceChat EndStateTickZPlayerControllerParseChatPercVarStopZombieKillMessagesLODSet CanSpectateAddDefaultInventoryStartStandalonePlayerUnknownKillerMessageProcessServerTravelLoadProgressFontFormatUBits MutJumpModDeathMessagesBladeIN BladeDMHUDBladeDMVBitsUClampGetActionableMessage BladeCTFHUD BladeCTFMapList BINSpinnerBINPRI BINPawnFireVClampCharSelectMenuName PlayersOnly EndMatchAddBotsAddMap BINAdmin RemoveMapBINAccessControlTSay DOTZItemsSpectatingTxt LastWaveTxtZombiesDefeatedTxtBagMat ScoreMat NEW_WAVEWaveCompleted LagAlertTxt SetTeamFlags DisplayMsg bStarting DeathMessage HUDTextColor StrShiftProgressFadeTimeProgressFontNameClientSetViewTarget TooManyBots StrReplace bNetNotify StrSubstClientCloseMenuDOTZScoreboardIG DOTZMPSaySpinnyDudeOffsetBodyTypeValueHeadTypeValueCharacterTypeValue AdminLogin SwitchTeamBodyTypeLabelHeadTypeLabelCharacterTypeLabelBoredIsUpperSetSensitivityTemp ResetFOVExec FlagHomeMat FlagDropMat TeamKillsMat TeamRankMatSetProgressTimeReceiveLocalizedMessageWaveMat LoadButton SaveButton FlagHeldMatPlayerReplicationInfoClass SaveMenuSuicideMessageShrinkWorldToScreenBroadcastLocalizedMessageDOTZLoadingMenuOptionsButton OptionsMenu PostRenderClientMessageClientHearSoundIsLower Click_Next LoadMenuPlayerCalcViewAddNextButtonLTrimRTrim QuitMenuTrim Periodic InStrFromDivideAddBackButton CapitalizeDormantExclaimJoinSplit2 ClientPause ReadyToSay PauseMenuMPHandlePlayerInput debughudCharacterSelect SwitchMenuChildFireTypeDrawGameStats NotifyAddBotNotifyRemoveBotSomeoneStringRunF CrouchIdlePreLoadMenu UpdateTarget CloseButtonEndGameAnnouncement LevelStartDisableWeatherEffectCheckForActionableActorFallServerSetPitch StandIdleCloseButtonCapWalkFCheckExtinguishRestartButtonIgnitionTimeElapsedCleanUpIgnitionData FallDownEndSway DestroyedGetWeatherEffectClassRestartButtonCapEndMatchButton TeamAnnounce CreateFire drawQuantityGetSmallFontRef EndMatchCapDoMountdrawDebugToHUDPlayersOnlyButtonLowerbPlayRandomAnimsPlayersOnlyCap__OnDraw__Delegategesture_beckongesture_point gesture_halt KickButtonKickButtonCap BanButton AnimNamesAnimChangeInterval BanButtonCapSwitchToButton PlayNextAnimSwitchToButtonCapRemoveMapButtonRemoveMapButtonCap AddMapButtonfind GetObjectActionVectorAddMapButtonCapColor SetIndex spinRate InputBox AdminButtonDeadSPCaptionDeadMPCaptionContinueButtonCapVSizeUSizeLoadButtonCapSaveButtonCapSettingsButtonCap RegisterQuitButtonCapSetText AdminCap AdminMenu bAlwaysTickDefaultPlayerClassName AdminCommandGetDefaultPlayerClass bGameEndedbFoundPCRankingKills Gamertag bHasFlag bWelcomed bOutOfLivesbOnlySpectator bIsSpectatorbAdminDeathsprisPRIMatchID PRIArrayWinner MOTDLine4 MOTDLine3 MOTDLine2 MOTDLine1 AdminEmail AdminNameTeams MaxLives TimeLimit GoalScoreRemainingTimebMatchHasBegunbWaitingToStartMatch PawnClassDefaultPlayerClass HomeBase TeamIndex instigatedBy CurrentTimeParam2Param1IPScorePing PlayerName PlayerIDPGRIWithReplacedistOptionalObject RelatedPRI_2 RelatedPRI_1Entry Attenuate Momentum HitLocationDamage KillTypeEventInstigatorsenderOther BoneNameDeltaslotID ETravelTypeSkins Instigator MapListTypeOwnerGUIControllerViewportOwner bVisible ConsoleBKLastURLPortalIndexTextKeyGameSpecificLevelInfoClipXSizeXSizeYWaveMultiPlayerLevelInfoWaveSizeIncrementInitialWaveSizePerPlayerInPlayLimitModifierMinInPlayLimitMaxInPlayLimitInitialInPlayLimitNumSpectators PreloadMeshPreloadAnimationPreloadMaterialsrc NumPlayers CurrentID PlayerInput BaseMutator SelectedGameRulesModifiers TextBufferPlayerControllerClassHeadLinebWelcomePendingIpAddrObjectEnum FunctionStateHandleVoiceChattersMbPause GUIComponent GUIListBaseGUIList GUIComboBox GUIButton GUIListBoxGUIScrollBarBase GUILabelGUIFontGUIPageResultInOptbItems bSpectatorRotator StartSpotStruct NewPlayer TestPawn SpinnyWeapName StrProperty InAdminNameMsgType InPassword InChecksumStructPropertyArrayProperty TimeLeftFontDYClassPropertyFontDXDelegateProperty LineCountInClass MyScrollBar InCharacterInTeamMySecurityClassaPlayerTeamNumExiting bMessage bCancelled MyControllerMyOwnerKiller NewAnimName NextAnimTime KilledPawnVictim cYesButton cNoButton NameProperty HudQuantity MountPoint KillerName VictimName AdvancedPawn ViewTargetinjuredbBadConnectionAlertbHideCenterMessages bNameChangeCurrentReasonScorer botToRemove TimeSeconds GameOverAdvancedWeaponYearMonthDayHourMinuteSecondPauser bPlayersOnlyNetModeAdvancedGameInfoAdvancedPlayerControllerGameControllerList CommandLinetmpMsg2Msg1 bDisconnect bRealSpec TargetInfo MessageInfoSubtitleGuiFont InfoGuiFont BigGuiFontStandardGuiFont SmallGuiFont TinyGuiFont ActionRadiusAdvancedCheatClassFireBurnRadius bSourceFadesbChildrenFadeFireDamageTypePlayerPawnBase EffectClassbCenterAdvancedDeathMessage AdvancedHudAdvancedMPGameBaseCTFFlagiEnemyDiffLevelmyHUDClipYMapNumiHeadiBody CurrentMapPreloadObjectsAnnouncements AnnouncementscaleYscaleXBBGui HudCaption objMount HeadTextures BodyTextures iBodyTexture iHeadTextureBodyapapc TeamType bClearScreen MyLifeBar MPMessageadvCheatManagerbDisablePawnHudtheWeatherEffectobjActionableActorTempActionActorBestActionActor aPriorityweapTargetActorInfo revealTimecurrentInfoMsg NetBaseActorStr FlameEmitter FireActor NearActor bHasFireBBGuiController BBEditBox BBComboBox AimedPitchretbCanDoubleJump TravelTypeMyPRIPlayerSecurityDEBAITDOTZPlayerControllerBaseDOTZPlayerControllerDOTZInfectionDamageDOTZAIControllerAnchorProgressColorProgressMessage OwnerName bBehindViewCreationPolicyOpponentFactory bNameCheatbWaitingToFall myPRIIndexDOTZXAnnouncerDOTZXInterfaceDOTZTInterfaceBestActionMessagepClass WaveSize screenPosTheCreationPolicy JackSladeHudIconBlueKillsHudIconBluePlayerRankHudIconBluePlayerScoreHudIconCTFTeamBlueFlagAtBaseHudIconCTFTeamBlueFlagDroppedHudIconCTFTeamBlueFlagStolenHudIconCTFTeamRedFlagAtBaseHudIconCTFTeamRedFlagDroppedHudIconCTFTeamRedFlagStolenHudIconINRedWavesHudIconRedKillsHudIconRedPlayerRankHudIconRedPlayerScoreHudIconTDMTeamBlueHudIconTDMTeamRedHudIconCTFPlayerHasBagHudIconNoTeamKillsHudIconNoTeamPlayerRank InvasionInvasionWaveComplete03InvasionNewWave01InvasionNewWave02InvasionNewWave03InvasionNewWave04InvasionWaveComplete01InvasionWaveComplete02InvasionNewWave05InvasionNewWave06InvasionWarning1InvasionWarning2InvasionWarning3 MenuNameObjectPropertyLastStartSpotLastStartTimebInitializeAnimationCameraLocationCameraRotation ParametersSoundLocationIdpickBackButtonLabelPreviousPawnClass actualDamageTargetnextController DamagePerSecBot TeamNumberbHeldbHomeInGameBackground bIsPlayer ViewActoriActionableRadiusURLHealth AirControlJumpZ AirSpeedProgressTimeOutGetPlayerNetworkAddressSetViewTargetMapsMaxedOutMessageFailedSpawnMessageFailedPlaceMessageFailedTeamMessage AdminClass NeedPasswordWrongPassword IPPolicies PasswordBox DOTZPage DOTZPageBaseDOTZInGamePage DOTZMPFailed CloseLogOpenLog bDemoOwner accept_inputbPasswordRequired tempFlag RedFlagMat BlueFlagMat EnemyTeamNumTeamLeftMarginLeftMarginPlus LeftMargin StatSpace StatLocation SmallFont SpinnyDude PlayerMeshCamPosCamRot HeadIndex BodyIndex bInitializedCharacterTypeLabel_lblCharacterTypeValue_lblHeadTypeLabel_lblHeadTypeValue_lblBodyTypeLabel_lblBodyTypeValue_lblQuitButton_btnErrorMessage_lblContinueButton_btnOptionsButton_btnGetMsgLoadButton_btnSaveButton_btnFloatProperty MOTDColorHudCanvasScale MakeColor SetDrawColorDOTZMPHudBaseDOTZMPGameBaseDOTZCaptureTheFlagSetPosDrawTextJustifiedDrawTileScaledSecurityClassVoiceChatterInfoGameMessageClassDOTZDeathMatchXDOTZCharacterstempOP NumWavesWaveRemaining WaveInPlay bFirstWave WAVE_TIMER WAVEDELAYANNOUNCE_DELAY bAllDeadBagPosXBagPosY LocalStat PlayerOtisDefaultPlayerNameMedMolotovFireSmallMolotovFire SmallFire PawnFire MediumFire LargeFire BoolPropertybAdminCanPauseGetCameraLocationTeambAllowedToSwitchTeamsAccessControlDamTypeTelefragged LocalMessage GameMessage GameRules ObjectPoolListGetNextIntDescPlayOwnedSound SetTimerUnClockClock LinkMeshMapNameType bHardAttach PawnList PawnName HeadType BodyTypeSelectedCharacter bChangeBody DrawColorSelectfgcDescLogf IntPropertybHiddenmap2ML StartMapZPC KilledNameConnectionLogbAllowTelefragsRoundTimeLimitInitialInPlayOverridePerPlayerOverride MaxWaveEnd MinWaveSize MaxInPlaybModerateWaveSizesbScaleDifficulty MaxRespawns RespawnDelaybDontEndLevel bGameDebug FinalWaveRESPAWN_TIMERCollisionHeightConstmsgL playerhudInNameLastAliveControllerdmsg AliveCounter bPreventhInput AdminManager AdminLogSwitchMapTargetLastProgressIndexLastProgressStringbSelectedPawn JoinedTimetemp WAITFORPAWNADMINSWITCHMAP bClientReady ByteProperty ScriptTextA botclassblahOptBCXtopmenuYZshot currPriority tempdist ProfileTimerWj ChatFontChatFont_PageAiS Location Rotation debughudd DisplaySign ReturnValue ChatMsgswibbleREMOVE_CHAT_TIMERSET_BSTARTINGAlphaDynamicLoadObjectoldmsgRankregfontitmpDPlayerCXCY FindObject RandRangedelim quotechar delimpos quoteposPackage bOnlyFirstClassr0r1r2r3r4r5r6r7r8r9 IndexCharOuterEvent EngineExFileLog GameStatsWeaponStrTextStrPart OffsetStart OffsetPart LevelInfodivider leftpart rightpart GameInfoparts PlayerStartHUD ignoreEmptyPlayerReplicationInfo thisPawnworldPositionGameReplicationInfo LevelSummary AIController ControllerMutator DamageType TeamInfoNavigationPointCarriedObjectCanvasFont InteractionBaseGUIControllerInteractionMasterLevelEmitterPawnMeshAnimation StaticMesh MaterialMeshActorPlayerNetConnectionStyleAuthorPitchOptionsSoundTextureErrorTitlePawnsConsole charnameFromRoleTagMapCloseButton_btnRestartMapButton_btnEndMatchButton_btnPlayersOnlyButton_btnCaptionMessage_lblPlayerList_box MapList_boxKickButton_btnBanButton_btnSwitchToButton_btnRemoveMapButton_btnAddMapButton_btn BBInputBoxAdminButton_btnt @u *I Gi 9:9:$ Ђ6UFT}rhhhhhhJqJqJqJqJq??Jq6L9L9L9ebL9ebebL9L9ebL9ebL9ebL9ebebL9L9ebL9ebebJqJqJqK8 䶇JqK8 䶇JqK8 䶇JqK8 䶊?/C/C/C/C/CѨAPAP`*:L9L9a"AP?eb䶔䶦b[2}rhhhhhhhbb}rh[2;&0[2;&0bbJq\;JqK8 E_R33AP*3IsL93Jq IcY3333333333  )K??JqsߊsߊJqK8 sߊsߊsߊsߊsߊ?APL9JqJqK8 JqK8 JqK8 yJKOyJKOyJKOyJKO?JqK8 JqK8 yJKOyJKOyJKOJqJqK3?JqK8 JqK8 yJKOyJKOyJKOyJKO?JqK8 ?JqK8 ?JqK8 JqJqK8 䶇JqK8 䶇JqK8 䶆 Ic? Ic? Ic?JqK8 ? IcJqK8 䶇JqK8 䶇JqK8 䶆 Ic? Ic IcJqK8 䶊? Ic?JqK8 ?JqK8 䶇JqK8 䶇JqK8 䶆 IcJqJqJq?JqK8 ??JqK8 ?JqK8 mmmJqJqJqJqJqJqL9AP ?KE]BladeIN_V12.BINCharSelect_]BladeIN_V12.BINPauseMenu@S B9:9:$9:9:$2&?JqJqJqK3JqJq~JqJqV-JqJq Ic}r}rh}rf_JqJqK8 JqK8 yJKOJqJqZZZZZL9ZZ )!"%#$tbQ=#@G @@_\UdD@M@E :o 0@L@@F`ENYjw@gN @ _ CJw@~ tcY{v64-wpp9Wq:t!ctq  @H q@g@aqU@d ;@u@N@^PFQ(x@4@Zz 2 I<bJIإ}r Ic}r}r}r}r}rͫ@Jj}rͫ@Jj}rͫ@Jj}rͫ@Jjͫ@Jjͫ@Jj}rÚͫ@JjÚÚ}r Ic}r}r Icͫ@Jj}r Ic}r Ic6ͫ@Jj6?ͫ@Jjͫ@Jjͫ@Jj(Եͫ@Jj"C};&0"C}"C}"C}"C}"C}"C}"C}"C}"C} 5(nKv]Close Admin MenuyL@] Restart MapAMF] End MatchINL] Players OnlywOQP@QQRR]KickSSV]BanWTY] Switch ToZU[= Remove Map\Va] Add MapeWif$=v$L?8<jZv @W ]@A @HJBG@Du| \\$DA?%7?)z] z\%{\qA \]u zq-v 7?7?&7?&?q7?7?&7?&?q)7?  ^ g G x6[K3_JqJq̇Jq̇Jq̇Jq̇Jq̇Jq̇Jq̇Jq̇Jq̇Jqsߊsߊ?> IcsߊJqsߊsߊ IcsߊL9L9sߊL9JqO`sߊ?CѣCѣY'Cѣ6L9Jq Ic? Ic?JqJq IcJqJqsߊ,2sߊsߊsߊ?sߊsߊsߊsߊsߊ?sߊ?sߊyc1dsߊ6sߊsߊ?sߊsߊsߊ?sߊsߊ?K8 sߊsߊsߊ?JqsߊsߊsߊsߊsߊL9sߊ IcJqsߊsߊsߊsߊL9sߊ?sߊ?sߊ?sߊJqK8 JqK8 yJKOyJKOJq6Jqsߊsߊsߊ?sߊ666JqsߊsߊsߊsߊL9sߊ?sߊ6>E_RL9L9 IcL9L9L9L9sߊL9L9L91HYJeJe1HY Ic Ic Ic Ic Ic?1HY?Jq Ic? Ic? Ic? Ic? Ic?1HY Ic Ic? Ic IcY Ic Ic? Ic? Ic? Ic Ic IcJqJqJqJqJqJqJqmmmJqJqsߊsߊ?sߊ?>sߊsߊsߊE_RsߊsߊJeJesߊsߊsߊsߊL9sߊL9sߊL9JqsߊsߊL9sߊsߊsߊsߊL9sߊL9sߊsߊL9sߊJesߊsߊZ Icsߊsߊsߊ66Jqc䍤Jqc䍤Jq?ě4b?Ҕr ,)!"%#$IY UYcYli)%o is done, like dinner... zombie dinnerZombies are eating %o's brain#%o has become one with the zombies%o bites the dust%o becomes fettucine al dead-o%o takes a nap at Zombie Inn"%o is in a really grave situation%o assumes room temperature%o now shops at Corpses-R-Us%o's liver has been donatedZombies eviscerated %o%o stops at the No Brain Hotel"Please kill %o .. oops, too late.&What does %o want on their tombstone?d]XDOTZCharacters.HumanPawnBase[HSEyu]XDOTZCharacters.JackSladeB]BladeIN_V12.BladeINHUD{]Invasion(Blade)@]BladeIN_V12.ZPlayerControllerp@@f nA7Kbu2 0SAS+Iإ}r Ic Ic? IcJq}r}r Ic}r IcJq}r IcJq}r}r}r}r Ic"C} Ic IcJq"C}"C};&0"C} IcJq"C}"C}"C}"C} Ic? IcJq"C}"C}"C}"C}"C} 5(eX|Y}ZF[x\f]w^M]DOTZMenu.DOTZLoadMenuIG@]DOTZMenu.DOTZSaveMenuG]DOTZMenu.DOTZSettingsMenuIGR]DOTZMenu.DOTZQuitGameConfirmU]They're coming for you...g] You have failed.h]OMGONOS! You're dead!i] Continuel] Load Gamem] Save Gamen] Settingsp]Quitr= Admin Menus]BladeIN_V12.BINAdminMenuif$=v$>$>$?$?8WSEdn@QiW@u_@Boh @NoE2 Ef_<姈}r Ic Ic IcW2ȩ\Rȩȩ\RȩAP\RȩAP3\R\R3 Icȩ Icȩ Icȩȩȩȩ\R}rȩȩȩȩȩȩȩAPAPȩAP8APAPȩAP8\R}rȩ IcJq IcJq IcJqK3 IcJq IcJq~ IcJq IcJqV-ȩȩȩȩȩȩȩȩȩȩȩȩȩȩȩL9L9L9ȩL9APAPȩAPAPȩȩ"C} 5(U]Customize Characteriocndmejfighhg:`*CHM'fc8Wfrk@Y@I@Wh@@JU!,uZDq Cz/bL9L9L9L9L9 Hj Hj Hj Hj HjJqщeb N?dzMzH r Rz6B~hsߊsߊ?sߊsߊ?sߊE_RL9L9 IcL9L9L9L9sߊL9L9L91HYJeJe1HY Ic Ic Ic Ic Ic?1HY?Jq Ic? Ic? Ic? Ic? Ic?1HY Ic Ic? IcJqK8 JqK8 yJKOyJKOJqJq ,)!"%#$d]XDOTZCharacters.HumanPawnBase[EyB]BladeIN_V12.BladeDMHUDA-DM{]DeathMatch (Blade)GS@]BladeIN_V12.ZPlayerControllero@k v@Gx@6@R @bV @@T nHB|U@J |B 6IV-Y E_RL9L9 IcL9L9L9L9sߊL9L9L91HYJeJe1HY Ic Ic Ic Ic Ic?1HY?Jq Ic? Ic? Ic? Ic? Ic?1HY Ic Ic? Ic?? Ic Ic? Ic Ic?<6<<><JqK8 JqK8 yJKOyJKOJqJq ,)!"%#$d]XDOTZCharacters.HumanPawnBase[HSyB]BladeIN_V12.BladeCTFHUDA]CTF{]Capture-the-Flag (Blade)GS@]BladeIN_V12.ZPlayerController~e P @>@A@5[@f @V@x jllLvG@A^@J @bP@v @]@E@A@hir @@q u @@~K @-BC\YD@~@GE @SMORgL v2 S$[2;&0䶔}6"C}}r 5(eDxE_F8WS}n AW2\RJq (d"KU$@TYpjuwiPONe/@b M @y w@} NZ@sz @l@vd@L@o@htYg@sn@Z`@i@J @Oc @Ng@KB@f r P>gxJ#]pjpjpj333333pjpj33333333pjpj3333333 Ic?>3 Ic IcL9L9? Ic?L9? Ic?L9 IcL9L9L9 Ic Ic Ic33 IcL9L9?3333 IcJq Ic IcJq Ic Ic Ic Ic?66663333333 Ic Ic3 Ic33 Ic33 Ic Ic?33636336636336636336636336333333 Ic666666JqJq33pj3pjpjpj3333333333333pjpj Ic?3333333 Ic?>3 Ic Ic? Ic Ic633 Ic?33 Ic?33333 Ic63333 Ic633333333JqJq333333333? Ic? Ic Ic Jq Ic? ,?KA]ECWaiting for New Wave
Press Fire or Alt-Fire to change viewpointz]Press fire to startO= SPECTATINGP= Final WaveQ]('The zombie invasion has been defeated!V]L A G{W]Y[*b^]UWindowFonts.Tahoma20]$?h@}{@@@ k@v&@Dty@k+@g@sI @w@r{@K @A @P@S@U @@kg1@@[Xq P rt2 ciPuԺI؆ IcL9 IcÚ}r IcL9}rÚ 5(U] Say To Team_~`_aLb$>$L=$fff?$L>8WcaJ E \2 eT͖ Ic IcL9 IcÚ}r 5(U= Say To AllG~H_ILJ8Wevn@QO@Y@EC@Feg@3@O {@_`@A@zy@B ` @H@s@s Yg \KG@LMR@@T@UWY@@XK@]@?@s `y @^{ @N aD @d@Ko} v K U?8T~K hJ 0T%ThT  |@o @l @k eJ;b%b}e~yeb&Axeb&Zeppebeb&, eb&be  Ih Q @Tq@X@ @x@ R@A lD@y{}|^@@@AEx@MmI@Jf@WfkNj@@] ` K w2Sk:+;Ud?K8 ߷@K8 ?K8 ߷@ )!"%#$q]diedh] something`VO^@O@j @\\{ @` 6s*$$$$Y.wY*YX,o , 9?, 7Y% Y9S6YY$$$$9?4awC*BCB+9?,9?9?,9?,saY$$$$6$9?4azC*BCB+9?,9?9?,9?,s'a9S6YYw*$$$$6$9?4a{C*BCB+9?,9?9?,9?,s'a9S9D$$$$Iw*-'Iw*-'-'*C--*CIC 
O%*7OaO8-( -k'*CI
O%7OaO8*>CIX
O%87OaO-(-'*HCaS-(8-'$A$A$A$A**TDT-(-'-'**HDP-( 7%aAiON*ikCC7$ Y  %46] h6]thp,p9D9?9D9?,hh= $6@ Say$($$(9=p  TeamSay$$$9=p # Login M Logout$$$9=p w Killed$$$9=p $$$9=p Ni?ka6 kO@?s mL @W@S @@DFeG @mE @sD @[@ @@z@N @~@y@x@zK @s@wzox C @| @{@E@a@HK`t~@c@bSa@U@VWo@ZA`h@O@@@@V@r Q@l@hk^m@fO@do@@p@s@v[yz{{}@w@x@CI@d@_H@\P@J[Or\F!r^( 9- r* O NQf] Q RU@F@r@X@Z@[@\@]@^@abcp_@f@q@h@i@j@k@t@@@t |pm@tuM@u@s@|}@c@p@o@e@A @T@B @l@@j@F @h@H m@Q@X Xl@q@O c@V@i@_@PR RY Z @Y [ @W \ @C)vb[P@y @x @ipn k l m e r pUp J@t w Z @u T X K@P @F b[HCHE%@E7bYppYEb{ EY  u@H @L 9\u[1~{Az9}AAhi9Ah&&hh}A}9$z9h}A}xxhyi9xhy~9xyr99(r9y99y}xv{Azr}AArr}A}r}A,r  C @D F e@}L A ma5i%i7Ykmmz~kiYzmppmkziM kkz}iY-O z~kiYBmpmkim  h@J @P O @w x @t @S }Q >2*z}& }}}}&}  m {Pb=2*z{& {{}{&{  ` @V @W @X @Y @Z @[ @\ @] @^ @_ @f @e CO-7C% s7CCTwT*qTa/!7.Tqs$(TT6 @@n VT׀d/a0 VI<wV*VVVa10B X@@c b@jg  | mlqs<zll  I U c)97X, U%:U7XUX%sU7/, %/V &/W ,/X ,/Y ,/Z ,/[ ,/\ ,/] ,/^ , /_ I U X/'  j kK<zkmk  ~ T rpT -`  i rghrQ rTimeLimitP{9Jf% @z@@R N S>S R N   @@@C n]E8r.n**** GiveDefaultInventory pawn=None n a G B7}% y7}}lwl*w.l*(lG .lqy$(ll6 p A0y|~A?2|AA%|z~A?dzvA%zu|Av'( TM H IH L P  iLV@^F~LE 6FeLd(eLFdLF'  |y@Q cWW f/a9 cccccc10 F| w +j jw`z 9z`xK` w|Kwz`7|&%| &| 9:9:$a& ?(  @ X *BwI@  SU%fU7SUSpUS&mUS&U| S   { k1w.*%7.9V. pPreloading: 9V. %S7.9V. pPreloading: 9V.%7.9V. pPreloading: 9V.Z%'7 %79V pPreloading: 9V.%79V pPreloading: 9V%/79V pPreloading: 9V S@MOHh[wM*M-'Mz?M̬?M33?M @ } e rs*,r_*dFdt_} & )Dcds A_ru*c Dd  ctu .DcdsZu_  U W*bL/W~}W $$$Wa{W~9?,}9?&W$$$$Wa{ R B RpB C D F  @c@E@V G+C,G & m&Eb#xmm0xE /x(  G _ _N~5_`_`-y  V ~ htO~ ,7)%l%)A)%&M7 %z% A %& ]eKI,oepppppppo
o
o
o
epppppe**** Game Admin: o (o)Ie
}Q7}@%QW%WQ6 QWW}6@QWMOTD6]QW9?,L>9?WW b iiL )9:9:$A %7 ew.K* .Kw.~* .~w.V* .V  @L@"2342qY 16Ia:Fz&z \ sGH0r* r*r* OnOP,P9D9?9D9?,Oj%=%=,z=j=w*-(0{jL{jh{j{j s $ aA:4^?9? ?@9? 5?9? ?@9? 549?j@=%k=,z=a =6 9=P !a=:4 ^:@5 a=54=|w*-( 6 9=PK{ a:4 ^:@5 a54{ a:4 ^:@5 a54W{ a:4 ^:@5 a54{ a:4 ^:@5 a54 [ b^bq p UVwb*ba/!n - wU . |V-'a, @(s d cP}\'ppReduceDamage(9Sc9Va9V^)ca^s t w  E T+B T & `&Xb#^``0^X /^(  T ^ g L,ppppppppppp9S-9S-9S 9S:9S:9S c fzP9 K.K<9:9:$D%vD7 lrfD  DE7  fwK*G.KwG.*G.a/!E.fG.M i 9Di)9:9:$A)%7)g)&  m n 3||{q/a0 JM<wJ*JkJq!Y10-(n r  @@] RHS@R$$$$/a9 7fr*r*r71~r7*1,7-r*1w71,7  9?1I7 6I79?,G' CI  Q6GR6GQ9?%QR R9?%RRb7\7az\z\Player\7RRa\goR*Qg9?,Ro9?,Ra\103-sRR  j _l;ec9:9:$O%QO7)G|_O) O 7))_ s Z2J-%9:9:$9i a Z0V{rN*Na mwN*N adminNpL:ZNyZj  ` ]k 稨9VLOGIN]1u-bs1SpectatorOnlyD]1Z1Name,r9=k1Team,P 1AdminNameq1PasswordN 1ChecksumLogin:Z/a9 >w>*w.>* r.>*>%|>Z>a+> >-(>Z-'-(0.>10rFr*[Q*r]4r[*u*Zr* a [ [ r*pCouldn't spawn player controller of class 9Vu*[q!Gv wv*avr*pCould not spawn security for player 9V!6ppUnknown security class [] -- System is no secure.!6d.d qRd- 1-bu*d-1(-b'zZZ9:9:$zNZ(f-b--'-'-'`9:r(u*[l1ClasszllY1Character-':-q!Cd.o1Headi9Joo1Bodym9Jodidmd @i Jwzi k l m  bk G?w"*ended the match!x<pp****  has ended this match.3adminforce o ^HKm 稨9VAddBots9S^w"*mNG.NGBotHuman '稨9Vbotclass=9Vmwm*W%W^`am稨9Vadded bot9V`Ww p nFZ* w"*--K-nonVnoffset PlayersOnlynJ**** Player movement only turnednby h eZ, 9?, 07.% e 9S6..$$$$9?4awCDBYCB+9?,9?9?,Y9?,$$$$1a9S6..7aRanking goes here 0123456789 0123456789 0123456789$$$$6$9?4azCDBYCB+9?,9?9?,Y9?,$$$$1a9S6..$$$$6$9?4a{CDBYCB+9?,9?9?,Y9?,$$$$'a9S9D _ TIOG9:9:$稨9VPNR: SelectedCharacter=6v#9S6]#9S6Z#T.T6]#T6]#-E'T6Z#-E'T6Z#/{9VT6v#TV6v#6v#G-ETp  'pbw1'LevelStart()/w<* z a^Hyaa***ahas entered!aha q [Rh fdw"*aya/!S R[d/a9 Kcb|K[w.K*nKV Znnn~n:bannedKIP:n9ppp****  has banned [I%I,2zII8I,2IpDENY,nbKa10 b @z @ faP 7%@%&,zF6 % b6 %G M!: !E@%&6 %fG!E6 %p6 % teams: 6@%TeamSay6 %p6 % says: 6@%Say6 %p6 %F &! !X@%&6 %FnG!6@%Login6@%Logout !ZF  !j@%&6 %p**** F6@%Killed !t FF U!c$z%F@%&6 %F6@%9WG @%&6 %F6@%9WGz&6 %ppppp6 % (type: 9WG, sender: f)B7&{6 %{6 &z6 %6 &A&&X7,7, {6 %bw*a6 %@6]%9?,  u ~L[G~` ~***~ scores! D HX'o'ppLogout(9VH)Tw.H*T.H--u'Ow.H*.H-"9:9:$X%"X7r6XHG.H6X6X(XO9:9:$.Hf-u29:9:$9:9:$D,Hw*dH C a +>+a !Q7,!7%9?F9?,9?%A7&&d7%F%F-' X-k(  | r稨9VLOGINr3-vs3SpectatorOnlyDr3H3Name,m9=k3Team,V 3AdminName_3PasswordL 3ChecksumLogin:H/a9 BwB*w.B* r.B*B%|BHBa+B B-(BZ-'-(0.B10mFm*OQ*mr4rO**Zr* a O O r*pCouldn't spawn player controller of class 9V*Oq!GK wK*aKr*pCould not spawn security for player 9V!6ppUnknown security class [] -- System is no secure.!6U.U _RU- 1-v*U-1(-v'zHH9:9:$zNH(f-v--'-'-'`9:m(*OQ3ClasszQQK 3Character-':-q!CU.d3HeadL9Jdd3BodyW9JdULUWU E -8-a(Ka!A'aXA( L 2n k'ppScoreKill(9V29VN)r2* r2NwN*wN*N9?&|Nself_fragSSw2* wN*w2*SNa/!7Sw2*29?&2|2?fragww*n2Nw2* %u2 X 2 a=( ]d @1D vz4CDHD.X,Cw*9?:ad CBCB9?9?,1a9S6..-zD4ab CBCB/a9 /%-'|%[,-|%w,|%xQ-R&[s-R&wR&x10r|*|%[rR*R&[9?v4a|BCBCz9S9D%$9?v9?,A9?,@9?v9?,A9?, 9?,F9?v4aRBCBC9S9D&$9?,F9?v9?,A9?,F9?,@9?v9?,A9?, $$$$V-'<-'9:9:$-'C-(CI
J!%!7Ja!J!+>CIX
J!%+!7Ja!J!-(-'-'HCaS-(E-'$A$A$A$A*TDT-(-'-'*HDP-( 7%aAoFMofCC!7$  !%A6]! g9D6]!9?gt,t9D9?,g9?g= $6@! Say$($$(9=t ( TeamSay$$$9=t 2 Login \ Logout$$$9=t Killed$$$9=t $$$9=t Mo?fa6 !fF@? @Uclass ZPlayerController extends DOTZPlayerController; var Admin AdminManager; var FileLog AdminLog; var string SwitchMapTarget; var int LastProgressIndex; var string LastProgressString; var bool bSelectedPawn; var float JoinedTime; var string CharSelectMenuName; const WAITFORPAWN=2342; const ADMINSWITCHMAP=16; // Trin 3/3/2008 var bool bClientReady; // Trin 3/3/2008 // Added ClientReady to client->server replicated functions. replication { reliable if(Role < ROLE_Authority) ServerSetPawnClass, Admin, RestartMap, Switch, Kick, KickBan, EndMatch, PlayersOnly, ServerSetTextures, AddMap, AddBots, NewWave, ClientReady; } // fixed some BS Accessed None, no idea where this crap is suddenly coming from function NotifyTakeHit( Pawn instigatedBy, vector HitLocation, int actualDamage, class DamageType, vector Momentum ) { super(Controller).NotifyTakeHit(InstigatedBy, HitLocation, actualDamage, damageType, Momentum); if(InstigatedBy != None) { if(InstigatedBy.IsA('ZombiePawnBase') && !bWaitingToFall && damageType != class'DOTZInfectionDamage') { AdvancedPawn(Pawn).FallDown(Momentum); bWaitingToFall = True; SetMultiTimer(REFALL_TIMER, 2.5, False); Fall(); } } } // TODO: Move all this new admin junk to UZG function String FullTimeDate() // Date/Time in MYSQL format { return ""$Level.Year$"-"$Level.Month$"-"$Level.Day$" "$Level.Hour$":"$Level.Minute$":"$Level.Second; } function alog(string x, optional name tag) { if(AdminLog == None) { AdminLog = spawn(class'FileLog'); } //if(Tag == None) Tag = ''; //Tag = FullTimeDate() @ Tag; if(AdminLog != None) { AdminLog.OpenLog("admin"); AdminLog.Logf(FullTimeDate()$":"@x); AdminLog.CloseLog(); } else { log(x, tag); } } exec function EndMatch() { if(AdminManager != None) { alog(PlayerReplicationInfo.GamerTag@"ended the match", 'Admin'); Level.Game.Broadcast(PlayerReplicationInfo, "**** " $ playerreplicationinfo.gamertag $ " has ended this match."); Level.Game.EndGame(PlayerReplicationInfo, "adminforce"); } } exec function AddBots(int i) { local class botclass; local AIController bot; local int x; log(self@"AddBots"@i); if(AdminManager != None) { botclass = class(DynamicLoadObject("NG.NGBotHuman", class'class', true)); log(self@"botclass="@botclass); if(botclass != None) { for(x = 0; x < i; x++) { bot = Spawn(botclass); log(self@"added bot"@bot); } } } } exec function PlayersOnly() { local string blah; if(AdminManager != None) { Level.bPlayersOnly = !Level.bPlayersOnly; if(Level.bPlayersOnly) blah="on"; else blah="off"; alog(PlayerReplicationInfo.GamerTag@"set PlayersOnly"@blah); Level.Game.Broadcast(PlayerReplicationInfo, "**** Player movement only turned"@blah@"by"@PlayerReplicationInfo.Gamertag); } } exec function KickBan( string S ) { local PlayerController P; local string IP; local int j; if(AdminManager != None) { Level.Game.AccessControl.SetOwner(self); if(Level.Game.AccessControl.IsA('NGAccessControl')) { Level.Game.AccessControl.KickBan(S); } else { ForEach DynamicActors(class'PlayerController', P) { if ( P.PlayerReplicationInfo.GamerTag ~=S && (NetConnection(P.Player)!=None) ) { IP = P.GetPlayerNetworkAddress(); if( Level.Game.AccessControl.CheckIPPolicy(IP) ) { IP = Left(IP, InStr(IP, ":")); alog(PlayerReplicationInfo.GamerTag@"banned"@P.PlayerReplicationInfo.GamerTag@"IP:"@IP); //Log("Adding IP Ban for: "$IP$" ("@P.PlayerReplicationInfo.GamerTag@")"); Level.Game.Broadcast(playerreplicationinfo, "**** " $ playerreplicationinfo.gamertag $ " has banned " $ S); for(j=0;j<50;j++) if( Level.Game.AccessControl.IPPolicies[j] == "" ) break; if(j < 50) Level.Game.AccessControl.IPPolicies[j] = "DENY,"$IP; Level.Game.AccessControl.SaveConfig(); } P.Destroy(); } } } } } exec function Kick( string Opt ) { local PlayerController P; if(AdminManager != None) { Level.Game.AccessControl.SetOwner(self); if(Level.Game.AccessControl.IsA('NGAccessControl')) { Level.Game.AccessControl.Kick(Opt); } else { foreach DynamicActors(class'PlayerController', P) { if(p.PlayerReplicationInfo.GamerTag~=Opt && (NetConnection(P.Player) != None)) { alog(PlayerReplicationInfo.GamerTag@"kicked"@P.PlayerReplicationInfo.GamerTag); Level.Game.Broadcast(playerreplicationinfo, "**** " $playerreplicationinfo.gamertag $ " has kicked "$opt); p.Destroy(); } } } } } exec function RestartMap() { if(AdminManager != None) { alog(PlayerReplicationInfo.GamerTag@"restarted map"); Level.Game.EndGame(None, "Force Restart"); Level.ServerTravel( "?restart", false); } } exec function Switch( string URL ) { local MapList ML; local int i; if(AdminManager != None) { ML = Level.Game.GetMapList(Level.Game.MapListType); for(i = 0; i < ML.Maps.Length; i++) { if(URL ~= ML.Maps[i]) break; } ML.MapNum = i; ML.SaveConfig(); alog(PlayerReplicationInfo.GamerTag@"moved to map"@URL); Level.Game.Broadcast(playerreplicationinfo, "**** " $playerreplicationinfo.gamertag $" switches to map " $ url); Level.Game.EndGame(none, "Force Map Change"); //Level.ServerTravel( URL, false ); SwitchMapTarget = URL; SetMultiTimer(ADMINSWITCHMAP, 5, false); } } exec function NewWave() { if(AdminManager != None) { if(BladeIN(Level.Game) != None) { BladeIN(Level.Game).StartWave(); alog(PlayerReplicationInfo.GamerTag@"started a new wave"); } } } exec function AddMap(string URL) { local MapList ML; if(URL == "") return; if(AdminManager != None) { alog(PlayerReplicationInfo.GamerTag@"added map"@URL); ML = Level.Game.GetMapList(Level.Game.MapListType); ML.Maps[ML.Maps.Length] = URL; ML.SaveConfig(); BINPRI(PlayerReplicationInfo).SendMapList(); } } exec function RemoveMap(string URL) { local MapList ML; local int i; local bool bFound; if(URL == "") return; log("*** REMOVEMAP"@URL); if(AdminManager != None) { ML = Level.Game.GetMapList(Level.Game.MapListType); for(i = 0; i < ML.Maps.Length && bFound == false; i++) { if(ML.Maps[i] ~= URL) { bFound = true; } } if(bFound) { ML.Maps.Remove(i-1, 1); ML.SaveConfig(); BINPRI(PlayerReplicationInfo).SendMapList(); return; } } } state Spectating { function HandlePlayerInput() { ServerRestartPlayer(); } } state Dead { function BeginState() { log(self@"BEGINSTATE DEAD"); super.BeginState(); } exec function Fire(optional float F) { bBehindView = true; ServerViewNextPlayer(); ServerRestartPlayer(); if(Level.NetMode == NM_Standalone) level.Game.RestartPlayer(self); } exec function AltFire(optional float F) { if(bBehindView == true) bBehindView = false; else bBehindView = true; ServerRestartPlayer(); } Begin: ServerViewNextPlayer(); } function ServerSetPitch(int Pitch){ // a big accessed none fix if(Pawn == none) return; AdvancedPawn(Pawn).AimedPitch = Pitch; Pawn.PostNetReceive(); } function ServerViewNextPlayer() { local Controller C; local Pawn Pick; local bool bFound, bRealSpec; bRealSpec = PlayerReplicationInfo.bOnlySpectator; PlayerReplicationInfo.bOnlySpectator = true; // view next player for ( C=Level.ControllerList; C!=None; C=C.NextController ) { if ( (C.Pawn != None) && Level.Game.CanSpectate(self,true,C.Pawn) ) { if ( Pick == None ) Pick = C.Pawn; if ( bFound ) { Pick = C.Pawn; break; } else bFound = ( ViewTarget == C.Pawn ); } } SetViewTarget(Pick); ClientSetViewTarget(Pick); if ( ViewTarget == self ) bBehindView = false; else bBehindView = true; //bChaseCam; PlayerReplicationInfo.bOnlySpectator = bRealSpec; } simulated event ReceiveLocalizedMessage( class Message, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { //super.ReceiveLocalizedMessage(Message, switch,RelatedPRI_1, RelatedPRI_2,OptionalObject); super(PlayerController).ReceiveLocalizedMessage(Message, switch, RelatedPRI_1, RelatedPRI_2, OptionalObject); //log("ZPC: RLM("$Message$", "$switch$", "$RelatedPRI_1$", "$RelatedPRI_2$", "$OptionalObject$")"); MPMessage = Message.Static.GetString(Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject); Message.Static.ClientReceive( Self, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); SetMultiTimer(DEATH_MSG, 4, false); } simulated event TeamMessage( PlayerReplicationInfo PRI, coerce string S, name Type ) { if(player != none && player.console != none && player.interactionmaster != none && player.console != player.InteractionMaster.Console) { player.console = player.interactionmaster.console; } if ( myHUD != None ) myHUD.Message( PRI, S, Type ); } function DrawToHud(Canvas c, float scaleX, float scaleY) { local AdvancedPawn ap; if (bClearScreen==true){ c.SetPos(0,0); c.DrawTileScaled(Material'Engine.ConsoleBK', 100, 100); return; } // delegate to the pawn... if ( Pawn != None && !bDisablePawnHud ) { ap = AdvancedPawn( pawn ); if ( ap != None ) ap.drawToHud( c, scaleX, scaleY ); myLifeBar.drawQuantity( pawn.health, c, scaleX, scaleY ); } C.Font = AdvancedHud(Level.GetLocalPlayerController().myHUD). GetSmallFontRef(); //AdvancedHud(Level.GetLocalPlayerController().myHUD).UseMediumFont(C); C.bCenter = true; c.SetPos( scaleX, 375 * scaleY ); C.DrawText(BestActionMessage); //C.DrawText(C.Font); C.bCenter = false; C.Font = Font'Engine.SmallFont'; if (MPMessage != ""){ C.bCenter = true; C.SetDrawColor(240,32,32,200); C.SetPos(scaleX, 910 * scaleY); C.DrawText(MPMessage); C.bCenter = false; //MyHUD.Message(self.PlayerReplicationInfo, MPMessage,'Killed'); //MPMessage = ""; } } exec function ReadyToSay(){ //if (Level.NetMode != NM_StandAlone){ ClientOpenMenu("BladeIN_V12.ZDOTZMPSay"); //} } exec function say(string x) { x = Level.Game.BaseMutator.ParseChatPercVar(self, x); if(x != "") super.say(x); } exec function TSay() { ClientOpenMenu("BladeIN_V12.TeamSayGUI"); } exec function Action(){ // to fix an Accessed None in AdvancedPlayerController if(AdvCheatManager == none) advCheatManager = new(Self) AdvancedCheatClass; super.Action(); } simulated function Destroyed() { AdvCheatManager = None; super.Destroyed(); } // Trin 3/3/2008 // Removed. // @eblade - Please take a look at this. I took this out because it was opening the // character select menu. But my guess is that it was doing more than that and maybe // the only part that should be removed is the OpenCharSelectMenu part. // // fixes some Accessed None errors //simulated event PostNetReceive(){ // if (bCloseMenuPending == true && Player !=None && Player.GUIController != None){ // Player.GUIController.CloseAll(true); // bCloseMenuPending = false; // PlayerReplicationInfo.bIsSpectator = True; // if(Level.NetMode != NM_DedicatedServer) { // OpenCharSelectMenu(); // } // } //} // Trin 3/3/2008 // Removed. //simulated function OpenCharSelectMenu() { // ClientOpenMenu(CharSelectMenuName); //} exec function SetSensitivityTemp(float F) { // fix an Accessed None in PlayerController if(PlayerInput != None) PlayerInput.UpdateSensitivityTemp(F); } simulated function EndSway() { // fix an Accessed None in AdvPlayerController if(Pawn != none) super.EndSway(); } /*function HandleWalking() { if ( Pawn != None ) //parent specified bRun !=0 to mostly run, we want mostly walk Pawn.SetWalking( (bRun == 0) && !Region.Zone.IsA('WarpZoneInfo') ); }*/ // walking sucks, run button doesn't work in MP simulated event PostNetBeginPlay() { //if(!Level.IsEntry() && !Level.Game.IsA('DOTZMenuGameType')) // SetMultiTimer(WAITFORPAWN, 0.2, false); PauseMenuMP="BladeIN_V12.BINPauseMenu"; DynamicLoadObject(PauseMenuMP,class'class'); //AdvancedPawn(Pawn).HudCaption = PlayerReplicationInfo.Gamertag; //AdvancedPawn(Pawn).bDisplayKills = true; super.PostNetBeginPlay(); } function MultiTimer(int slotID) { switch(slotID) { // case WAITFORPAWN: // if(AdvancedPawn(Pawn) != none) { // AdvancedPawn(Pawn).HudCaption = PlayerReplicationInfo.Gamertag; // //AdvancedPawn(Pawn).bDisplayKills = true; // } // if(Level.NetMode != NM_DedicatedServer) { // ClientOpenMenu("BladeIN_V12.BINCharSelect"); // } // //bSelectedPawn = true; // break; case ADMINSWITCHMAP: Level.ServerTravel(SwitchMapTarget, false); break; } super.MultiTimer(slotID); } exec event SetProgressMessage( int Index, string S, color C ) { local GUIPage topmenu; if(S == "") return; if(s ~= class'AccessControl'.default.NeedPassword || s ~= class'AccessControl'.default.WrongPassword) { Player.GUIController.OpenMenu("DOTZMenu.DOTZGetPassword", class'DOTZMenu.DOTZMPFailed'.default.LastURL); return; } //log(self@"S="@S); if(left(S, 10) == "Connecting") return; // No "Connecting To..." box if(S == "Lost Connection") { ConsoleCommand("cancel"); } if(Index == 0) { LastProgressString = S; } topmenu = GUIController(Player.GUIController).TopPage(); if(TopMenu != None && !TopMenu.IsA('DOTZScoreboardIG') && !TopMenu.IsA('BINMPFailed') && !TopMenu.IsA('BINCharSelect') && !TopMenu.IsA('BINPauseMenu') && !TopMenu.IsA('DOTZMPSay') && !TopMenu.IsA('TeamSayGUI') && !TopMenu.IsA('BINAdminMenu')) { Player.GUIController.OpenMenu("BladeIN_V12.BINMPFailed", S); Player.GUIController.CloseTo('BINMPFailed'); //Player.GUIController.OpenMenu("DOTZMenu.DOTZMPFailed", S); //Player.GUIController.CloseTo('DOTZMPFailed'); } if(S == "") return; topmenu = GUIController(Player.GUIController).TopPage(); if(TopMenu != None) { switch(TopMenu.Class) { case class'BINMPFailed': case class'DOTZMPFailed': if(Index == 0) { DOTZMPFailed(TopMenu).ErrorMessage.Caption = S; LastProgressIndex = 1; } if(Index == 1) { DOTZMPFailed(TopMenu).ErrorMessage.Caption = LastProgressString @ " " @ S; } break; case class'BINAdminMenu': case class'BINCharSelect': case class'BINPauseMenu': break; default: Player.GUIController.CloseAll(true); //Player.GUIController.OpenMenu("DOTZMenu.DOTZMPFailed", S); Player.GUIController.OpenMenu("BladeIN_V12.BINMPFailed", S); break; } } LastProgressIndex = Index; if ( Index < ArrayCount(ProgressMessage) ) { ProgressMessage[Index] = S; ProgressColor[Index] = C; } } event PlayerCalcView(out actor ViewActor, out vector CameraLocation, out rotator CameraRotation ){ super.PlayerCalcView(ViewActor, CameraLocation, CameraRotation); if(Pawn != ViewTarget && bBehindView == false) { // spectating... CameraRotation = ViewTarget.Rotation; } } // Trin 3/3/2008 // Rewrote ServerSetPawnClass to not destroy/recreate a Pawn. // By the time this is called it should have progressed past the character selection. function ServerSetPawnClass(string inClass, string inCharacter) { bSelectedPawn = true; SetPawnClass(inClass, inCharacter); } // Trin 3/3/2008 // Replaced this function with the one above. //function ServerSetPawnClass(string inClass, string inCharacter) { // local Pawn MyPawn; // local vector loc; // local rotator rot; // local int Health; // // //log(self@"ServerSetPawnClass"@inClass@inCharacter); // if(inCharacter=="") return; // bSelectedPawn = true; // SetPawnClass(inClass, inCharacter); // if(role == role_authority) { // if(pawn != None) { // MyPawn = Pawn; // loc = MyPawn.location; // rot = MyPawn.rotation; // Health = MyPawn.Health; // UnPossess(); // MyPawn.TakeDamage(1000, MyPawn, MyPawn.location, MyPawn.velocity, none); // MyPawn.Destroy(); // MyPawn = spawn(PawnClass,self,,loc,rot); // Possess(MyPawn); // if(Level.Game.IsA('BladeIN')) // BladeIN(Level.Game).GiveDefaultInventory(MyPawn); // else if(Level.Game.IsA('BladeDM')) // BladeDM(Level.Game).GiveDefaultInventory(MyPawn); // else if(Level.Game.IsA('BladeCTF')) // BladeCTF(Level.Game).GiveDefaultInventory(MyPawn); // MyPawn.Health = Health; // } // } //} // Fix an accessed none function Possess(Pawn P) { //log(self@"Possess"@P); //self.Pawn = P; //super.Possess(P); local class effectClass; local Emitter theWeatherEffect; Log(self @ "Possess"@P); //ClientSwitchToBestWeapon(); DisableWeatherEffect(); super(PlayerController).Possess( p ); effectClass = getWeatherEffectClass(); if ( effectClass != None ) { theWeatherEffect = Spawn( effectClass, pawn ); if ( theWeatherEffect != None ) { theWeatherEffect.setBase( pawn ); } } //NOTE a little hack to make sure the weapon gets properly // initialized, in case the pawn already had it when possessed. if (advancedPawn(p).objMount !=None){ //GotoState('PlayerMounted'); advancedPawn(p).objMount.DoMount(p); } else { if(p.Weapon != None) p.weapon.bringUp(); } ResetFOV(); // fix for FOV when killed in sniper mode ( // TODO: move this to when we die .. ?) if(AdvancedPawn(Pawn) != none) { AdvancedPawn(Pawn).HudCaption = PlayerReplicationInfo.Gamertag; } ClientCloseMenu(true, true); //if(Pawn == None) Pawn = P; } function ServerSetTextures(int Head, int Body) { iHeadTexture = Head; iBodyTexture = Body; } function drawDebugToHUD(Canvas c, float scaleX, float scaleY){ if(Pawn != None) return; super.DrawDebugtoHUD(c, scaleX, scaleY); } exec function ClientPause(){ //if (Level.NetMode == NM_StandAlone){ // Pause(); // } else { ClientOpenMenu(PauseMenuMP); // } } simulated event ClientTravel(string URL, ETravelType TravelType, bool bItems) { local int x; local string Map, MapName; local Texture shot; // We should use a Material, here, but that requires a custom Loading Menu. - fixed for DA local LevelSummary L; //local LevelInfo LI; x = InStr(URL, "?"); // Get the map name, no options if(x > -1) { Map = Mid(URL, 0, x); } else { Map = URL; } x = InStr(Map, ".dz"); if(x > -1) { Map = Mid(Map, 0, x); } L = LevelSummary(DynamicLoadObject(Map $ ".LevelSummary", class'LevelSummary')); if(L != None && L.Title != "" && L.Title != "Untitled") MapName = L.Title; else MapName = Map; if(L != None && L.Author != "") MapName = MapName $ " By: " $ L.Author; // TODO: Is it possible somehow to get the LevelInfo? probably not. /*LI = LevelInfo(DynamicLoadObject(Map $ ".LevelInfo", class'LevelInfo')); if(LI == None) LI = LevelInfo(DynamicLoadObject(Map, class'LevelInfo')); if(LI != None) { shot = Texture(DynamicLoadObject(string(LI.Screenshot), class'Texture', true)); }*/ if(shot == None) { shot = Texture(DynamicLoadObject(Map $ ".Screenshot", class'Texture', true)); } //log(self@"DYNAMICLOADOBJECT FOR SCREENSHOT RETURNS:"@shot); if(Shot == None) { shot = Texture(DynamicLoadObject("LevelScreenshots."$Map, class'Texture', true)); } if(shot != None) shot = Texture(FindObject(string(shot), class'Texture')); //log(self@"FINDOBJECT FOR SCREENSHOT RETURNS:"@shot); //log(self@"CLIENTTRAVEL"@URL@TravelType@bItems); ClientOpenMenu("DOTZMenu.DOTZLoadingMenu", false, "Loading"@MapName, string(shot)); super.ClientTravel(URL, TravelType, bItems); } exec function Menu(string str) { ClientOpenMenu(str); } simulated exec function string Admin( string CommandLine ) { local string Result; //log("AdminManager="@AdminManager); if(AdminManager == None && Left(CommandLine, 6) != "login ") return ""; Result = ConsoleCommand( CommandLine ); //ClientMessage( Result ); TeamMessage(PlayerReplicationInfo, Result, 'AdminCommand'); return result; } // TODO: move this code back to UZGPlayerController, as it gets the admin stuff working right again simulated exec function login(string x) { local bool b; if(level.netmode != NM_Client && AdminManager == None) { b = Level.Game.AccessControl.AdminLogin(self, x); if(b == true) { if(Level.Game.AccessControl.AdminClass == None) Level.Game.AccessControl.AdminClass = class'Engine.Admin'; AdminManager = new(self) Level.Game.AccessControl.AdminClass; //class'UZG.DAAdmin';//Level.Game.AccessControl.AdminClass; PlayerReplicationInfo.bAdmin = true; //log("AdminManager="@AdminManager); } } } // Fixes some Accessed Nones in AdvancedPlayerController exec function Fire( optional float F ) { if ( Level.Pauser == PlayerReplicationInfo ){ SetPause(false); return; } if ( bDemoOwner || (Pawn == None) ) return; super(PlayerController).Fire(F); } exec function AltFire(optional float F) { super(PlayerController).AltFire(F); } // Let's try and make this more efficient function CheckForActionableActor() { local Actor TempActionActor; local Actor BestActionActor; local AdvancedWeapon weap; local int aPriority, currPriority, dist, tempdist; local float ProfileTimer; // Trin 3/3/2008 // Removed Message to clean up compile message for unreferenced local variable. //local string Message; if ((Pawn != None && Pawn.Health > 0)) { // first we check the weapon to see if we are centered on something weap = AdvancedWeapon(Pawn.Weapon); if(weap != None) { weap.UpdateTarget(); // TODO: Figure out why the commented out part below makes bunches of shit fail if(weap.TargetActorInfo.target != None ) { //&& weap.TargetActorInfo.target.GetActionableMessage(self) != "") { BestActionActor = weap.TargetActorInfo.target; } else { Clock(ProfileTimer); foreach Pawn.RadiusActors(class'Actor', TempActionActor, ActionRadius) { aPriority = TempActionActor.GetActionablePriority(self); if(aPriority < 1) continue; if(aPriority >= currPriority) { tempdist = vsize(pawn.Location - TempActionActor.Location); if(tempdist > TempActionActor.iActionableRadius) continue; if(!FastTrace(Pawn.Location + Pawn.EyePosition(), TempActionActor.Location) && !FastTrace(Pawn.Location, TempActionActor.Location)) continue; if(aPriority == currPriority) { if(tempdist < dist) { BestActionActor = TempActionActor; dist = tempdist; currPriority = aPriority; } } else { BestActionActor = TempActionActor; dist = tempdist; currPriority = aPriority; } } } Unclock(ProfileTimer); //log(self@"RadiusActors ProfileTimer="@ProfileTimer); } } else { foreach Pawn.RadiusActors(class'Actor', TempActionActor, ActionRadius) { aPriority = TempActionActor.GetActionablePriority(self); if(aPriority < 1) continue; if(aPriority >= currPriority) { tempdist = vsize(pawn.Location - TempActionActor.Location); if(tempdist > TempActionActor.iActionableRadius) continue; if(!FastTrace(Pawn.Location + Pawn.EyePosition(), TempActionActor.Location) && ! FastTrace(Pawn.Location, TempActionActor.Location)) continue; if(aPriority == currPriority) { if(tempdist < dist) { BestActionActor = TempActionActor; dist = tempdist; currPriority = aPriority; } } else { BestActionActor = TempActionActor; dist = tempdist; currPriority = aPriority; } } } } if(BestActionActor != None) { BestActionMessage = BestActionActor.GetActionableMessage(self); } else { BestActionMessage = ""; } objActionableActor = BestActionActor; } else { BestActionMessage = ""; objActionableActor = None; } } exec function SwitchTeam() { if(!GameReplicationInfo.bAllowedToSwitchTeams) return; super.SwitchTeam(); } // Trin 3/3/2008 // Rewrote CanRestartPlayer to not interact with the selection menu. // By the time this is called the selection should already be complete. function bool CanRestartPlayer() { if(PlayerReplicationInfo.bOutOfLives && Level.NetMode != NM_Standalone) { log(self@"No, out of lives"); return false; } return super.CanRestartPlayer(); } // Trin 3/3/2008 // Replaced this function with the one above. //function bool CanRestartPlayer() { // local bool bTest; // log(self@"CANRESTARTPLAYER" @ JoinedTime@Level.TimeSeconds); // if(PlayerReplicationInfo.bOutOfLives && Level.NetMode != NM_Standalone) { // log(self@"No, out of lives"); // return false; // } // if( (level.TimeSeconds - JoinedTime) < 1) { // log(self@"No, too soon"); // return False; // } // //if(!bSelectedPawn && Level.NetMode == NM_DedicatedServer) { // TODO: for some reason the menu doesn't always work on Listen/Standalone // if(!bSelectedPawn) { // log(self@"No, need to select pawn"); // OpenCharSelectMenu(); // return false; // } // bTest = super.CanRestartPlayer(); // log(self@"bTest="@bTest); // return bTest; //} function InitPlayerReplicationInfo() { super.InitPlayerReplicationInfo(); PlayerReplicationInfo.bOnlySpectator = false; } simulated event ClientHearSound(actor Actor, int ID, sound S, vector SoundLocation, vector Parameters, bool Attenuate) { Parameters.Z = Parameters.Z + RandRange(-20,20); // pitch shifter? //log(self@"ClientHearSound Z="@Parameters.Z); super.ClientHearSound(Actor, ID, S, SoundLocation, Parameters, Attenuate); } // Trin 3/3/2008 // Added. This is the replicated function that lets the server know that the client // is ready for a menu to be open. simulated function ClientReady() { bClientReady=True; } // Trin 3/3/2008 // Added. This state handles the character selection. It is called prior to and instead of // the PlayerWaiting state. Once the character is selected it will then goto the PlayerWaiting // state and the character creation will continue as normal. // Note: The variable bClientReady is used both for network clients and for a local host where the // server and the client are the same session. In the case where the server is the client // bClientReady is assumed to be always True. auto state PlayerCharacterSelect { ignores SeePlayer, HearNoise, NotifyBump, TakeDamage, PhysicsVolumeChange, NextWeapon, PrevWeapon, SwitchToBestWeapon; exec function Fire(optional float F) { } exec function AltFire(optional float F) { } simulated function PostNetReceive() { global.PostNetReceive(); if(Level.Netmode == NM_Client && !bClientReady) { // For a Network client this alerts the server that the client is ready for a menu to be opened. ClientReady(); bClientReady=True; } } function BeginState() { if (Level.NetMode != NM_Client) { SetTimer(0.2, true); } } function Timer() { // If we have selected a pawn and the client is ready then we progress to the // PlayerWaiting state. if (bSelectedPawn && bClientReady) { GotoState('PlayerWaiting'); ClientGotoState('PlayerWaiting', 'Begin'); return; } // If this player controller is local then the player is playing on the server. // Set bClientReady = True and assume the session is ready for a menu to be displayed. if (Level.GetLocalPlayerController() != None) { if (Level.GetLocalPlayerController() == self) { bClientReady=True; } } // Attempt to open the menu. // // If the player is on the server then this will iteratively attempt to open the menu. // // if the player is a network client it will iteratively call the client's ClientOpenMenu // replicated function. // // Both situations can and will result in the attempt to open the menu happening repeatedly, // even after the menu is already open. This is handled in the ClientOpenMenu override. if (bClientReady) { ClientOpenMenu("BladeIN_V12.BINCharSelect"); return; } } function EndState() { if (Level.NetMode != NM_Client) { SetTimer(0.0, false); } } // This function will handle multiple attempts (both on client and/or server as client) to // open the Character Select screen. If the BINCharSelect is requested when it is already // open it will simply ignore it. simulated function ClientOpenMenu (string Menu, optional bool bDisconnect,optional string Msg1, optional string Msg2) { local GUIPage topmenu; if (Menu != "BladeIN_V12.BINCharSelect") { global.ClientOpenMenu (Menu, bDisconnect, Msg1, Msg2); return; } // No sense bringing up the character selection window after a pawn has already been selected. if (bSelectedPawn) { return; } // Determine the menu item that is already opened. topmenu = GUIController(Player.GUIController).TopPage(); // If the character select menu is already open, or any other valid menu is open, don't // open the character select menu. if(TopMenu != None && (TopMenu.IsA('BINCharSelect') || TopMenu.IsA('BINPauseMenu') || TopMenu.IsA('ZDOTZMPSay') || TopMenu.IsA('TeamSayGUI') || TopMenu.IsA('BINAdminMenu') || TopMenu.IsA('DOTZLoadingMenu'))) { return; } global.ClientOpenMenu("BladeIN_V12.BINCharSelect"); } } B class ZDOTZMPSay extends DOTZMPSay; function bool LoadClicked(GUIComponent Sender){ if(PlayerOwner() != none && PlayerOwner().Pawn != none) { PlayerOwner().Pawn.PlayOwnedSound(ClickSound,SLOT_Interface,1.0); //PlayerOwner().TeamSay(MsgBox.GetText()); } PlayerOwner().Say(MsgBox.GetText()); Controller.CloseMenu(false); return true; } function bool HandleKeyEvent(out byte Key,out byte State,float delta) { if(State != 1) return false; if (Key == 13 || Key == 212){ //Enter LoadClicked(None); return true; } else if (Key == 27 || Key == 213){ //Esc return true; } return false; } M Djb- #rJ* QwJ*J-'DJ^ CwD*uDwD*@DJ-AJBwD*w.D*7^ D@A^5e9ArDJDJC{^D^!jtJ-'-y'EwE*~E-~wE*Ea/!nE%kw.E*|BE-y(EE|&.Bq7OO$(-y -A3*Everyone is dead N CV_CwC*Ca/!7>- rC*C%C9?tC-'C-(CC O f+[LV- f, Calling MultiTimer while game is ended!!!! Slot=9Sf f & h&Qb#jhh0jQ /j( ? 4V? ,E~? <,9-'Ol? f Q gYsB%A% B%JkE% AE BE -`(a,EA( n//----------------------------------------------------------- // $DATETIME: 16/06/2006 2:04:22 AM$ //----------------------------------------------------------- class TeamSayGUI extends DOTZInGamePage; var localized string PageCaption; var automated GUIButton YesButton; var automated GUIButton NoButton; var Automated GUILabel ErrorMessage; // The error message to be displayed var Automated BBEditBox MsgBox; /***************************************************************** * InitComponent ***************************************************************** */ function InitComponent(GUIController MyController, GUIComponent MyOwner){ Super.InitComponent(Mycontroller, MyOwner); SetPageCaption(PageCaption); SetTimer(0.5,false); } function Timer(){ super.Timer(); SetFocus(MsgBox); MsgBox.SetFocus(self); } /***************************************************************** * CancelClicked ***************************************************************** */ function bool CancelClicked(GUIComponent Sender){ PlayerOwner().Pawn.PlayOwnedSound(ClickSound,SLOT_Interface,1.0); Controller.CloseMenu(false); return true; } /***************************************************************** * LoadClicked ***************************************************************** */ function bool LoadClicked(GUIComponent Sender){ PlayerOwner().Pawn.PlayOwnedSound(ClickSound,SLOT_Interface,1.0); PlayerOwner().TeamSay(MsgBox.GetText()); Controller.CloseMenu(false); return true; } /***************************************************************** * HandleKeyEven * Intercepts A and B presses ***************************************************************** */ function bool HandleKeyEvent(out byte Key,out byte State,float delta) { if (Key == 13){ //Enter LoadClicked(None); } else if (Key == 27){ //Esc CancelClicked(None); } return true; } a f.YA&B \class MutJumpMod extends Mutator; function ModifyPlayer(Pawn x) { if (x != None) { x.bCanDoubleJump = True; // no, ai can not do that either // more power x.JumpZ *= 1.41; x.AirControl *= 1.35; x.AirSpeed *= 1.15; //x.SetPhysics(PHYS_Spider); //x.bUseCompressedPosition = false; } Super.ModifyPlayer(x); } @w HWWUw"*aya/!S WHU/a9 gTS|gHw.g*kickedg9ppp****  has kicked Hga10 OI ,5X XIsc 9zsxPs IoPIzs7o&%o &o 9:9:$a& ?( Z 481516M 8475U Ntrw"*restarted map3*Force Restart/?restart( F]] @)V  g[w.*.X,p.X&\w*9?:a[ CB CB9?9?, 1a9S6.."9?4aY CB CB9?9?, 1a9S6..w*9?:a\ CB CB9?9?, 1a9S6..9?4aZ CB CB9?9?, 1a9S6..w*9?g:aRBC BC~9S9D$9?g9?,A 9?,@9?g9?,A 9?, 9?,F9?g:aRBC BC9S9D$9?,F9?g9?,A 9?,F9?,@9?g9?,A 9?, $$$$-'-'9:9:$-'C -(C I] 
@% 7@a@~>C IX
@%~7@a@M-(-'-'HC aS-(-'$A$A$A$A*TD T-(-'-'*HD P-(T 7%aA_[\_\CC 7$ T % 6]Q j9D6] 9?js, s9D9?,j 9?j=Q $6@ P Say$($$(9=s { TeamSay$$$9=s Login Logout$$$9=s Killed$$$9=s $$$9=s \_?\a6 \[@?a  S I v2_ uE_RL9L9L9L9 )!"%#$//----------------------------------------------------------- // //----------------------------------------------------------- class DeathMessages extends AdvancedDeathMessage; var localized string UnknownKillerMessage; 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 = DecodeStringURL(RelatedPRI_2.GamerTag); if ( Switch == 1 ) { // suicide return class'GameInfo'.Static.ParseKillMessage( KillerName, VictimName, Class(OptionalObject).Static.SuicideMessage(RelatedPRI_2) ); } if (RelatedPRI_1 == None) { KillerName = Default.SomeoneString; return class'GameInfo'.static.ParseKillMessage("", VictimName, Default.UnknownKillerMessage); } else { KillerName = DecodeStringURL(RelatedPRI_1.GamerTag); return class'GameInfo'.Static.ParseKillMessage( KillerName, VictimName, Class(OptionalObject).Static.DeathMessage(RelatedPRI_1, RelatedPRI_2) ); } } c X `WFBA%)y% By'6w%(X ' \ d W omU'ppEndGameAnnouncement(9VW )PwP*wPa/!7P-(PP>a,E(a,(Om-(T h J_WTK'WaveComplete()3-`a,E@A(a,@( b `// Eric Blade's Invasion Mod HUD // Adds function MOTD for LotD (DisplaySign array) // Adds "Final Wave" declaration at bottom if on last wave of BladeIN mod // ...and "Zombies defeated" message if last wave is complete. // Blood-red-ish clock + status indicators gives more sinister look :D // #exec new TRUETYPEFONTFACTORY name=ChatFont FONTNAME="Myriad Web Pro-Condensed" Height=12 ANTIALIAS=1 CHARACTERSPERPAGE=32 CHARS="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_ -=~[]\{}|;':,./<>?+" class BladeINHUD extends DOTZMPHudBase config(user); var localized string WaitingForWaveTxt; var localized string PressFireTxt; var localized string SpectatingTxt; var localized string LastWaveTxt; var localized string ZombiesDefeatedTxt; var localized string LagAlertTxt; var Material WaveMat; var Material KillsMat; var Material RankMat; var int debughudd; var localized Array DisplaySign; struct DisplayMsg { var string Msg; var string Type; var float TimeLeft; }; var Array ChatMsgs; var protected GUIFont SubtitleGuiFont; var protected GUIFont InfoGuiFont; var protected GUIFont BigGuiFont; var protected GUIFont StandardGuiFont; var protected GUIFont SmallGuiFont; var protected GUIFont TinyGuiFont; var int wibble; const REMOVE_CHAT_TIMER=8475; const SET_BSTARTING=481516; var bool bStarting; var() Color HUDTextColor; // Start by setting up our MOTD sign to display, and a timer to get rid of it function PostBeginPlay() { super.PostBeginPlay(); //MOTD(); SetTimer(0.1, false); } // Clear the MOTD timer function Timer() { SetTimer(0.0, false); MOTD(); SetMultiTimer(REMOVE_CHAT_TIMER, 8.0, True); SetMultiTimer(SET_BSTARTING, 30, False); } function MultiTimer(int id) { switch(id) { case REMOVE_CHAT_TIMER: if( ChatMsgs.Length > 2 || (ChatMsgs.Length > 0 && (wibble % 2) > 0)) { ChatMsgs.Remove(ChatMsgs.Length-1, 1); } if(ChatMsgs.Length == 0) wibble = 0; wibble++; Player.PlayerReplicationInfo.bWelcomed = true; break; case SET_BSTARTING: bStarting=false; break; } } simulated function Message( PlayerReplicationInfo pri, coerce String msg, Name msgType ) { local string oldmsg; // used to figure out if there's a new message at the end of the func if(ChatMsgs.Length == 0) ChatMsgs.Insert(0,1); if(msg == ChatMsgs[0].Msg) return; // throw out dupes oldmsg = ChatMsgs[0].Msg; switch(msgtype) { case 'Say': case 'TeamSay': ChatMsgs.Insert(0,1); ChatMsgs[0].Msg = pri.GamerTag; // could probably move team messages to right hand side.. not that this game type has teams.. yet :D if(msgtype == 'TeamSay') { ChatMsgs[0].Msg = ChatMsgs[0].Msg $ " teams: "; ChatMsgs[0].Type = "TeamSay"; } else { ChatMsgs[0].Msg = ChatMsgs[0].Msg $ " says: "; ChatMsgs[0].Type = "Say"; } ChatMsgs[0].Msg = ChatMsgs[0].Msg $ msg; break; case 'Login': case 'Logout': ChatMsgs.Insert(0,1); ChatMsgs[0].Msg = msg; if(msgtype == 'Login') ChatMsgs[0].Type = "Login"; else ChatMsgs[0].Type = "Logout"; break; case 'Exclaim': msg = ""; return; break; case 'Killed': ChatMsgs.Insert(0,1); ChatMsgs[0].Msg = "**** " $ msg; ChatMsgs[0].Type = "Killed"; break; case 'exec': // TODO: see if this works player.ConsoleCommand(msg); msg = ""; break; case 'Debug': if(debughudd == 0) { msg = ""; break; } ChatMsgs.Insert(0,1); ChatMsgs[0].Msg = msg; ChatMsgs[0].Type = string(msgType); break; default: ChatMsgs.Insert(0,1); ChatMsgs[0].Msg = msg; ChatMsgs[0].Type = string(msgType); break; } if(debughudd == 1) ChatMsgs[0].Msg = ChatMsgs[0].Msg $ " (type: " $ msgType $ ", sender: "$ pri.GamerTag $")"; if(ChatMsgs.Length > 1 && ChatMsgs[0].Msg != "" && ChatMsgs[1].Msg != "" && ChatMsgs[0].Msg == ChatMsgs[1].Msg) { ChatMsgs.Remove(1,1); } if(ChatMsgs.Length > 14) ChatMsgs.Length = 9; if(ChatMsgs[0].Msg != oldmsg) { if(PlayerOwner.Player.Console != None) //if(Len(ChatMsgs[0].Msg) < 80) PlayerOwner.Player.Console.Message(ChatMsgs[0].Msg, 6); //player.Player.Console.Message(ChatMsgs[0].Msg, 6); //player.Player.InteractionMaster.Console.Message(ChatMsgs[0].Msg, 6); ChatMsgs[0].TimeLeft = Level.TimeSeconds + 10; } } function drawToHUD( Canvas c, float scaleX, float scaleY ) { local string Rank; local array Tmp; local int x; local font regfont; local int alpha; local float itmp; local DOTZPlayerControllerBase DPlayer; local float FontDX, FontDY; local float CX, CY; //log("*** A"); currentInfoMsg.revealTime = Level.timeseconds; // draw the real stuff last... //C.SetDrawColor(200, 0, 0, 255); C.DrawColor = HUDTextColor; super.drawToHUD( c, scaleX, scaleY ); C.SetDrawColor(200, 0, 0, 255); DPlayer = DOTZPlayerControllerBase(Player); if(DPlayer !=None) DPlayer.RefreshPRI(4); regfont = C.Font; StatLocation -= 13; // trying to adjust upwards for low res... LeftMarginPlus -= 10; // same but leftwards... if(DPlayer.pris.Length == 0) return; //log("*** B"); Rank = string(DPlayer.pris[Dplayer.myPRIIndex].Ranking); C.SetDrawColor(255, 0, 0, 200); C.SetPos(LeftMargin,StatLocation); C.DrawTile(RankMat,128*scaleX,64*scaleY,0,0,128,64); C.SetPos(LeftMarginPlus + 25, StatLocation+ (5*scaleY) + 3); C.DrawColor = HUDTextColor; //C.SetDrawColor(255,255,255,255); C.DrawText(Rank); StatLocation += StatSpace; //log("*** C"); C.SetDrawColor(255, 0, 0, 200); C.DrawColor.A = 200; C.SetPos(LeftMargin,StatLocation); C.DrawTile(KillsMat,128*scaleX,64*scaleY,0,0,128,64); C.SetPos(LeftMarginPlus + 25,StatLocation+ (5*scaleY)+ 3); C.DrawColor=HUDTextColor; //C.SetDrawColor(255,255,255,255); C.DrawText(DPlayer.pris[DPlayer.myPRIIndex].Kills); StatLocation += StatSpace; //log("*** D"); if(Player.PlayerReplicationInfo.Team != None) { C.SetDrawColor(255, 0, 0, 200); C.DrawColor.A = 200; C.SetPos(LeftMargin,StatLocation); C.DrawTile(WaveMat,128*scaleX,64*scaleY,0,0,128,64); C.SetPos(LeftMarginPlus + 25,StatLocation + (5*scaleY)+ 3); //C.SetDrawColor(255,255,255,255); C.DrawColor=HUDTextColor; C.DrawText(string(int(Player.PlayerReplicationInfo.Team.Score))); StatLocation += StatSpace; } //log("*** E"); C.SetDrawColor(200, 0, 0, 200); if(Player.PlayerReplicationInfo != None && Player.PlayerReplicationInfo.bIsSpectator == True) { if(Player.GameReplicationInfo != None && Player.GameReplicationInfo.bMatchHasBegun == True) { C.bCenter = true; c.SetPos( scaleX, 375 * scaleY ); if(Player.PlayerReplicationInfo.bOutOfLives) { c.SetPos(scaleX, 375 * scaleY); Split2(SpectatingTxt, "
", Tmp); for(x = 0; x < Tmp.Length; x++) { C.DrawText(Tmp[x]); } } else if (Player.PlayerReplicationInfo.bOnlySpectator == false || bStarting == true){ c.SetPos( scaleX, 375 * scaleY ); Split2(PressFireTxt, "
", Tmp); for(x = 0; x < Tmp.length; x++) { C.DrawText(Tmp[x]); } } else { c.SetPos( scaleX, 190 * scaleY ); Split2(WaitingForWaveTxt, "
", Tmp); for(x = 0; x < Tmp.length; x++) { C.DrawText(Tmp[x]); } } C.bCenter = false; } } //log("*** F"); if(Player.GameReplicationInfo.MatchID == 666) { C.bCenter = true; C.SetPos( scaleX, 200 * scaleY ); C.DrawText(ZombiesDefeatedTxt); C.bCenter = false; } //log("*** G"); if(Player.GameReplicationInfo.MatchID == 664) { C.bCenter = true; //C.SetPos(scaleX, 400 * scaleY); C.SetDrawColor(65,65,65,65); DropShadowText(C, scaleX, 850 * scaleY, LastWaveTxt); C.bCenter = false; } //log("*** H"); if(bBadConnectionAlert == true) { C.bCenter = true; DropShadowText(C, scaleX, 800 * scaleY, LagAlertTxt); C.bCenter = false; } //log("*** I Hud ChatMsgs.Length > 0"); if(ChatMsgs.length > 0) { C.TextSize ("A", FontDX, FontDY); //X = (0.5 * HudCanvasScale * C.SizeX) + (((1.0 - HudCanvasScale) / 2.0) * C.SizeX); //Y = (0.5 * HudCanvasScale * C.SizeY) + (((1.0 - HudCanvasScale) / 2.0) * C.SizeY); CX = scaleX + FontDX; CY = 195 * scaleY; //Y -= FontDY * (ChatMsgs.Length / 2.0); x = ChatMsgs.length; C.Style = ERenderStyle.STY_Alpha; C.Font = Font'ChatFont'; //C.Font=Font'Engine.SmallFont'; //C.SetPos(scaleX, 195 * scaleY); while(x-- > 0) { if(Level.TimeSeconds > ChatMsgs[x].TimeLeft) continue; itmp = ChatMsgs[x].TimeLeft - Level.TimeSeconds; if(itmp >= ProgressFadeTime) Alpha = 255; else Alpha = (255 * itmp) / ProgressFadeTime; if(itmp < 0.10) continue; //alpha = 0; //log("msg"@ChatMsgs[x].Msg@"itmp="$itmp$" alpha="$alpha); //if(itmp < 0) Alpha = 0; C.Style = ERenderStyle.STY_Alpha; switch(ChatMsgs[x].Type) { case "Say": C.SetDrawColor(40,200,40,Alpha); break; case "TeamSay": C.SetDrawColor(0,0,255,Alpha); break; case "Login": case "Logout": C.SetDrawColor(0,255,0,Alpha); break; case "Killed": C.SetDrawColor(180,0,0,Alpha); break; default: C.SetDrawColor(160,160,160,Alpha); break; } //C.DrawColor.A = Alpha; C.SetPos (CX - (FontDX * 0.5), CY); C.DrawText(ChatMsgs[x].Msg); CY += (FontDY * 0.75); } } C.DrawColor=HUDTextColor; } exec function MOTD() { local string m; local GameReplicationInfo GRI; local int x, i; GRI = Player.GameReplicationInfo; //if(GRI == None) { // Player.PlayerReplicationInfo.bWelcomed = false; //} m = GRI.MOTDLine1 $ "
" $ GRI.MOTDLine2 $ "
" $ GRI.MOTDLine3 $ "
" $ GRI.MOTDLine4 $ "
"; m = m $ "**** Game Admin: "$GRI.AdminName$" ("$GRI.AdminEmail$")"; Split2(m, "
", DisplaySign); i = DisplaySign.Length; ChatMsgs.Insert(0,i); for(x = 0; x < i; x++) { ChatMsgs[i-x].Msg = DisplaySign[x]; ChatMsgs[i-x].Type = "MOTD"; ChatMsgs[i-x].TimeLeft = Level.TimeSeconds + 30 + (0.2*x); } //bDisplaySign=True; //if(bDisplaySign == true) bDisplaySign = false; //else bDisplaySign = true; } function DropShadowText(Canvas C, float X, float Y, string text){ //draw black C.SetPos(X, Y); C.SetDrawColor(0,0,0); C.DrawText(Text); //draw colour text C.SetPos(X-2, Y-1); C.SetDrawColor(255,0,0,255); C.DrawText(Text); //C.SetDrawColor(R,G,B); } // Shifts an element off a string // example (delim = ' '): 'this is a string' -> 'is a string' // if quotechar = " : '"this is" a string' -> 'a string' static final function string StrShift(out string line, string delim, optional string quotechar) { local int delimpos, quotepos; local string result; if ( quotechar != "" && Left(line, Len(quotechar)) == quotechar ) { do { quotepos = InstrFrom(line, quotechar, quotepos + 1); } until (quotepos == -1 || quotepos + Len(quotechar) == Len(line) || Mid(line, quotepos + len(quotechar), len(delim)) == delim); } if ( quotepos != -1 ) { delimpos = InstrFrom(line, delim, quotepos); } else { delimpos = Instr(line, delim); } if (delimpos == -1) { result = line; line = ""; } else { result = Left(line,delimpos); line = Mid(line,delimpos+len(delim)); } if ( quotechar != "" && Left(result, Len(quotechar)) == quotechar ) { result = Mid(result, Len(quotechar), Len(result)-(Len(quotechar)*2)); } return result; } // StrReplace using an array with replacements // will return the changed string, will replace all occurences unless bOnlyFirst static final function string StrReplace(coerce string target, array replace, array with, optional bool bOnlyFirst) { local int i,j; local string Input; // cycle trough replacement list for (j = 0; j < replace.length; j++) { Input = target; target = ""; i = InStr(input, Replace[j]); while(i != -1) { target = target $ Left(Input, i) $ With[j]; Input = Mid(Input, i + Len(Replace[j])); if (bOnlyFirst) break; // only replace first occurance i = InStr(Input, Replace[j]); } target = target $ Input; } return target; } // StrSubst will replace %s in target with r# where # is the place of %s in the string static final function string StrSubst(coerce string target, optional string r0, optional string r1, optional string r2, optional string r3, optional string r4, optional string r5, optional string r6, optional string r7, optional string r8, optional string r9) { local array replace, with; local int i; replace.length=10; for (i = 0; i < replace.length; i++) replace[i] = "%s"; with.length=10; with[0]=r0; with[1]=r1; with[2]=r2; with[3]=r3; with[4]=r4; with[5]=r5; with[6]=r6; with[7]=r7; with[8]=r8; with[9]=r9; return StrReplace(target, replace, with, true); } // Turn a string to lower case // example: 'This Is A String' -> 'this is a string' static final function string Lower(coerce string Text) { local int IndexChar; for (IndexChar = 0; IndexChar < Len(Text); IndexChar++) if (Mid(Text, IndexChar, 1) >= "A" && Mid(Text, IndexChar, 1) <= "Z") Text = Left(Text, IndexChar) $ Chr(Asc(Mid(Text, IndexChar, 1)) + 32) $ Mid(Text, IndexChar + 1); return Text; } // Checks if a string is all uppercase static final function bool IsUpper(coerce string S) { return S == Caps(S); } // Checks if a string is all lowercase static final function bool IsLower(coerce string S) { return S == Lower(S); } // Trim leading spaces static final function string LTrim(coerce string S) { while (Left(S, 1) == " ") S = Right(S, Len(S) - 1); return S; } // Trim trailing spaces static final function string RTrim(coerce string S) { while (Right(S, 1) == " ") S = Left(S, Len(S) - 1); return S; } // Trim leading and trailing spaces static final function string Trim(coerce string S) { return LTrim(RTrim(S)); } // InStr starting from an offset static final function int InStrFrom(coerce string StrText, coerce string StrPart, optional int OffsetStart) { local int OffsetPart; OffsetPart = InStr(Mid(StrText, OffsetStart), StrPart); if (OffsetPart >= 0) OffsetPart += OffsetStart; return OffsetPart; } static final function bool Divide(coerce string src, string divider, out string leftpart, out string rightpart) { local int x; x = InStr(src, divider); if(x == -1) { leftpart = src; rightpart = ""; return false; } leftpart = Left(src, x); rightpart = Right(src, x); return true; } // Capitalize a string // example: 'this is a STRING' -> 'This Is A String' static final function string Capitalize(coerce string S) { local array parts; local int i; Split2(s, " ", parts); for (i = 0; i < parts.length; i++) { parts[i] = Caps(Left(parts[i], 1))$Lower(Mid(parts[i], 1)); } return join(parts, " "); } static final function string Join(coerce array x, string y) { local int i; local string ret; for(i = 0; i < x.length; i++) { ret = ret $ x[i] $ y; } return ret; } // Fixed split method // no problems when it starts with a delim // no problems with ending spaces // delim can be a string static final function int Split2(coerce string src, string delim, out array parts, optional bool ignoreEmpty, optional string quotechar) { local string temp; Parts.Remove(0, Parts.Length); if (delim == "" || Src == "" ) return 0; while (src != "") { temp = StrShift(src, delim, quotechar); if (temp == "") { if (!ignoreEmpty) { parts.length = parts.length+1; parts[parts.length-1] = temp; } } else { parts.length = parts.length+1; parts[parts.length-1] = temp; } } return parts.length; } exec function debughud() { debughudd = 1 - debughudd; } simulated function DisplayProgressMessage(Canvas C) { local int i, LineCount; local GameReplicationInfo GRI; local float FontDX, FontDY; local float X, Y; local int Alpha; local float TimeLeft; //log("bWelcomed="@Player.PlayerReplicationInfo.bWelcomed); //log("BINHUD: DisplayProgressMessage()"); if(PlayerOwner == None || Player == None || Player.PlayerReplicationInfo == None) return; TimeLeft = PlayerOwner.ProgressTimeOut - Level.TimeSeconds; if( TimeLeft >= ProgressFadeTime ) Alpha = 255; else Alpha = (255 * TimeLeft) / ProgressFadeTime; GRI = PlayerOwner.GameReplicationInfo; LineCount = 0; for (i = 0; i < ArrayCount (PlayerOwner.ProgressMessage); i++) { if (PlayerOwner.ProgressMessage[i] == "") continue; LineCount++; } if (GRI != None && Player.PlayerReplicationInfo.bWelcomed == false) { if( GRI.MOTDLine1 != "" ) LineCount++; if( GRI.MOTDLine2 != "" ) LineCount++; if( GRI.MOTDLine3 != "" ) LineCount++; if( GRI.MOTDLine4 != "" ) LineCount++; } C.Font = LoadProgressFont(); C.Style = ERenderStyle.STY_Alpha; C.TextSize ("A", FontDX, FontDY); X = (0.5 * HudCanvasScale * C.SizeX) + (((1.0 - HudCanvasScale) / 2.0) * C.SizeX); Y = (0.5 * HudCanvasScale * C.SizeY) + (((1.0 - HudCanvasScale) / 2.0) * C.SizeY); Y -= FontDY * (float (LineCount) / 2.0); for (i = 0; i < ArrayCount (PlayerOwner.ProgressMessage); i++) { if (PlayerOwner.ProgressMessage[i] == "") continue; C.DrawColor = PlayerOwner.ProgressColor[i]; C.DrawColor.A = Alpha; C.TextSize (PlayerOwner.ProgressMessage[i], FontDX, FontDY); C.SetPos (X - (FontDX / 2.0), Y); C.DrawText (PlayerOwner.ProgressMessage[i]); Y += FontDY; } if( (GRI != None) && Player.PlayerReplicationInfo.bWelcomed == false )//(Level.NetMode != NM_StandAlone)) { C.DrawColor = MOTDColor; C.DrawColor.A = Alpha; if( GRI.MOTDLine1 != "" ) { C.TextSize (GRI.MOTDLine1, FontDX, FontDY); C.SetPos (X - (FontDX / 2.0), Y); C.DrawText (GRI.MOTDLine1); Y += FontDY; } if( GRI.MOTDLine2 != "" ) { C.TextSize (GRI.MOTDLine2, FontDX, FontDY); C.SetPos (X - (FontDX / 2.0), Y); C.DrawText (GRI.MOTDLine2); Y += FontDY; } if( GRI.MOTDLine3 != "" ) { C.TextSize (GRI.MOTDLine3, FontDX, FontDY); C.SetPos (X - (FontDX / 2.0), Y); C.DrawText (GRI.MOTDLine3); Y += FontDY; } if( GRI.MOTDLine4 != "" ) { C.TextSize (GRI.MOTDLine4, FontDX, FontDY); C.SetPos (X - (FontDX / 2.0), Y); C.DrawText (GRI.MOTDLine4); Y += FontDY; } } } simulated event PostRender(Canvas C) { local Pawn thisPawn; local float X, Y; local float W, H; local vector worldPosition; local vector ScreenPos; local string PlayerName; C.SetDrawColor(255,255,255,255); foreach DynamicActors(class'Pawn', thisPawn) { if(PlayerOwner == None || PlayerOwner.Pawn == None || thisPawn == PlayerOwner.Pawn) continue; if(thisPawn.PlayerReplicationInfo == None) continue; if(!thisPawn.PlayerReplicationInfo.bAdmin) { if(PlayerOwner.PlayerReplicationInfo.Team == None) continue; if(thisPawn.PlayerReplicationInfo.Team != PlayerOwner.PlayerReplicationInfo.Team) continue; if(vsize(thisPawn.Location - PlayerOwner.Pawn.Location) > 4096) continue; } worldPosition = thisPawn.Location; worldPosition.Z += thisPawn.CollisionHeight+3; ScreenPos = PlayerOwner.Player.Console.WorldToScreen(worldPosition, PlayerOwner.Location, PlayerOwner.Rotation); X = ScreenPos.X; Y = ScreenPos.Y; if(X > 0 && X < C.ClipX && Y > 0 && Y < C.ClipY && (PlayerOwner.CanSee(thisPawn))) { //PlayerName = ThisPawn.PlayerReplicationInfo.GamerTag; PlayerName = ThisPawn.GetHumanReadableName(); if(PlayerName == "" || PlayerName == "Player") PlayerName = ThisPawn.PlayerReplicationInfo.GamerTag; C.SetPos(0, 0); C.TextSize(PlayerName, W, H); C.SetPos(X - W/2, Y - H/2); C.DrawText(PlayerName); } } if ( !bHideCenterMessages && (PlayerOwner.ProgressTimeOut > Level.TimeSeconds) ) DisplayProgressMessage(C); super.PostRender(C); } function DrawGameStats(Canvas C, float scaleX, float scaleY) { //local int LeftMarginPlus, LeftMargin; local string rank; //local font regfont; //regfont = C.Font; //log("DrawGameStats sl="@statlocation@"lmp="@leftmarginplus); StatLocation -= 13; // trying to adjust upwards for low res... LeftMarginPlus -= 10; // same but leftwards... if(DOTZPlayerControllerBase(Player).pris.Length == 0) return; Rank = String(DOTZPlayerControllerBase(Player).pris[DOTZPlayerControllerBase(Player).myPRIIndex].Ranking); C.SetDrawColor(255, 0, 0, 200); C.SetPos(LeftMargin,StatLocation); C.DrawTile(RankMat,128*scaleX,64*scaleY,0,0,128,64); C.SetPos(LeftMarginPlus + 25, StatLocation+ (5*scaleY) + 3); C.SetDrawColor(255,255,255,255); C.DrawText(String(DOTZPlayerControllerBase(Player).pris[DOTZPlayerControllerBase(Player).myPRIIndex].Ranking)); C.DrawText("Ranking goes here 0123456789 0123456789 0123456789"); StatLocation += StatSpace; C.SetDrawColor(255, 0, 0, 200); C.DrawColor.A = 200; C.SetPos(LeftMargin,StatLocation); C.DrawTile(KillsMat,128*scaleX,64*scaleY,0,0,128,64); C.SetPos(LeftMarginPlus + 25,StatLocation+ (5*scaleY)+ 3); C.SetDrawColor(255,255,255,255); C.DrawText(string(DOTZPlayerControllerBase(Player).pris[DOTZPlayerControllerBase(Player).myPRIIndex].Kills)); StatLocation += StatSpace; C.SetDrawColor(255, 0, 0, 200); C.DrawColor.A = 200; C.SetPos(LeftMargin,StatLocation); C.DrawTile(WaveMat,128*scaleX,64*scaleY,0,0,128,64); C.SetPos(LeftMarginPlus + 25,StatLocation + (5*scaleY)+ 3); C.SetDrawColor(255,255,255,255); C.DrawText(string(int(Player.PlayerReplicationInfo.Team.Score))); StatLocation += StatSpace; } //=========================================================================== // Default Properties //=========================================================================== Z// 03Feb06 - Implemented fairly decent Spectating for the Dead // TODO: have Login() check names of all people in game currently, and not // allow same names to re-log... // TODO: Figure out the AdvancedDeathMessage thingee and use that instead of // doing it in here // TODO: Stick MOTD in a new Menu? allow to draw textures in it, somehow or other for server logos // TODO: Open menu on map vote, pause game, etc //TODO: Refactor Login() to allow admin login when full class BladeIN extends DOTZMPGameBase config; var FileLog ConnectionLog; var config bool bAllowTelefrags; var config int RoundTimeLimit; // to make it configurable in the INI .. duh var config int InitialWaveSize; // Can be set to override all map entries var config int InitialInPlayOverride; // Initial In Play Override var config int PerPlayerOverride; // Override PerPlayer increase var config int WaveSizeIncrement; // Can be set to override all map entries var config int MaxWaveEnd; // When a wave gets this big, that's the last wave var config int MinWaveSize; // set a minimum wave size var config int MaxInPlay; // Maximum In Play var config bool bModerateWaveSizes; // This will increase low counts and decrease high counts var config bool bScaleDifficulty; // Scale Moderation by Enemy Strength var config int MaxRespawns; // -1 = Unlimited IN Respawns var config int RespawnDelay; // How many secs to run the respawn limiter var config bool bDontEndLevel; // 1 = Don't end level when everyone dies var bool bGameDebug; // Set this if you want an assload of game debugging info dumped via Broadcast var int NumWaves; // This just counts the current wave # var int WaveRemaining; // This tells us how many Zombies are left in the wave var int WaveInPlay; // How many are currently on the level? var int Wave