*~@O3YLmF ONone WinWidthWinLeftWinTop WinHeight PlayerOwnerbScaleToParentbBoundToParent ParseOption StyleNameCaption__OnClick__Delegate BladeIN_V20CoreButtonClickedSystemEngine ItemCount TextFontConsoleCommandLogin BroadcastHandleKeyEventAdvancedEnginealogClientOpenMenu GetPawnList TabOrder GetExtrabFocusOnWatch CloseMenu OpenMenuPostBeginPlay CollisionForce LightColorGUI MovementDropShadowTextKarma GetMapList Lighting RemoveItemAddItem ServerTravel MapMatches DOTZGameGetLocalPlayerControllerEndGame AtCapacity DOTZMenu MultiTimer__OnKeyEvent__DelegateTopPage LoadClickedTimerPlayerController Security StartRush SendMapListInitComponentUpdateSpinnyDude RenderWeight SelectedText drawToHUDGlobalAnnouncement DOTZEngineSayParseKillMessageGetText SpectatingCancelClicked LoadPawnsHandleCharacterSelectionKick SetFocusPlayerCharacterSelectKickBan ChangeNameServerSetPawnClass RefreshPRIOpened PickTeamUser FullTimeDatePostNetReceiveBINCharSelect SetPawnClassFindPlayerStart GetString GetIndexMouseEmulationclog ChangeTeam__OnChange__Delegate ClickSoundServerReStartPlayer PlayWaitingDEBUGAddServerViewNextPlayerKilledGiveDefaultInventory SetPausebAcceptsInput CreateZombie InitGameAltFire ScoreKillOverridePlayerControllerClassMessageClosed HasOptionBasePawnClassNotifyLevelChange PressFireTxt ModifyLoginFire bMultiLine StartWave TeamSayGUI GameName CloseAllHUDTypePlayerControllerClassNameWaitingForWaveTxt BINPauseMenu PageCaptionbDelayedStart BINMPFailed ErrorMessageSetMOTD GetIntOptionPossess BINAdminMenuPlayAnnouncementAdminTeamSayMsgBox RestartMap InternalDrawContinueButtonperiodSetPageCaptionNewWaveDeathMessageClass InternalTimeRankMatbRestartLevel BladeINHUDContinueClicked KillsMat ZDOTZMPSay WaveComplete TriggerEvent ClientReadyServerSetTextures TeamScoreMatSendMapListEntry bTeamGameGetActionablePrioritySendPawnListEntry SendPawnListSetProgressMessagePostNetBeginPlayZombiePawnBase PostLoginLogout TeamMessage ClientTravel NotifyAddBot TakeDamageNotifyRemoveBotSetCustomTexturesCanRestartPlayer SpawnZombieDead SpreadFlamesSetNameDecodeStringURL OpenSoundCaptionMessageBeginPlayerWaitingRestartPlayer QuitButtonbVisibleWhenEmpty CheckScore BeginStateDisplayProgressMessage SelectZombieTickSwitchHandleParameters ScoreEvent NoButton MapPrefix YesButton MaxWidthAllowRessurectionHandleHeadSelectionHandleBodySelection EyePosition PlayerListNuke_All_PawnsNGAccessControlChangeVoiceChatter NotifyKilled PreventSever PreventDeathScoreObjective AddCheatsBringUp ModifyPlayer ReduceDamageClientSetRotationPlayTeleportEffectInitPlayerReplicationInfoPlayerChangedClassInitGameReplicationInfo KillEventbAlphaTexture UnPossessClearProgressMessagesCheckIPPolicyStartStandalonePlayerUpdateSensitivityTempCloseTo FreeObjectAllocateObjectSetMovementPhysicsNotifyTakeHit NextWeaponClientGotoState PrevWeaponClientReceiveSwitchToBestWeaponDisconnectEventGetHumanReadableNameClientLeaveVoiceChatUnknownKillerMessageCharSelectMenuNameZombiePrefixesParseChatPercVar ZombieTypesZombieKillMessages EndMatch CanSpectateAddDefaultInventory DrawTypeGetDefaultPlayerClassProcessServerTravelLoadProgressFontAddBots LastWarningRushAnnouncements AddZombiesAddMap RemoveMapUSizeLODSetTSayZPlayerControllerVSizeMapListFormat MutJumpModDeathMessagesBladeIN BladeDMHUD PlayersOnlyUBitsBladeDMVBits BladeCTFHUDUClamp BladeCTFVClamp BINSpinnerSpectatingTxtBINPRI LastWaveTxt BINPawnFireZombiesDefeatedTxt LagAlertTxt DisplayMsg bStarting BINAdminBINAccessControl HUDTextColor DeathMessage StrShiftProgressFadeTimeProgressFontNameDOTZScoreboardIG TooManyBots DOTZMPSay bNetNotify StrReplace StrSubstSpinnyDudeOffsetBodyTypeValueHeadTypeValueCharacterTypeValueBodyTypeLabelHeadTypeLabel AdminLogin SwitchTeamCharacterTypeLabel LoadButton SaveButton SaveMenuOptionsButtonPauseSetSensitivityTemp ResetFOVIsUpper OptionsMenuIsLowerLTrimRTrim Click_Next LoadMenuAddNextButtonTrim InStrFrom QuitMenuPlayerReplicationInfoClassDivideSuicideMessageShrinkWorldToScreen CapitalizeDOTZLoadingMenu PeriodicJoinSplit2AddBackButtonWaveMat debughud TeamRankMat TeamKillsMat FlagDropMat FlagHeldMat FlagHomeMatBagMat ScoreMat NEW_WAVEWaveCompletedDrawGameStatsClientSetViewTarget SetTeamFlags CloseButtonClientCloseMenuCloseButtonCapRestartButtonSetProgressTimeBored DOTZItemsCharacterSelect SwitchMenu configureDormantExclaimReceiveLocalizedMessageBroadcastLocalizedMessage ClientPause ReadyToSay PauseMenuMPHandlePlayerInputChildFireTypeRestartButtonCapMenu PostRenderClientMessageSomeoneStringRunF CrouchIdlePreLoad UpdateTargetClientHearSoundEndGameAnnouncement LevelStartDisableWeatherEffectCheckForActionableActorFallServerSetPitch StandIdleEndMatchButtonWalkFCheckExtinguishPlayerCalcViewIgnitionTimeElapsedCleanUpIgnitionData FallDownEndSwayGetWeatherEffectClass EndMatchCapPlayersOnlyButton TeamAnnounce CreateFire drawQuantityGetSmallFontRefVectorDoMountdrawDebugToHUDColorPlayersOnlyCapbPlayRandomAnims KickButton__OnDraw__Delegategesture_beckongesture_point gesture_haltKickButtonCap BanButton BanButtonCap AnimNamesAnimChangeInterval PlayNextAnimSwitchToButtonSwitchToButtonCapRemoveMapButtonAction DestroyedRemoveMapButtonCap EndStatefind spinRate GetObject AddMapButtonAddMapButtonCap InputBoxStop AdminButtonDeadSPCaption SetIndexDeadMPCaptionContinueButtonCapLoadButtonCapExecLowerSaveButtonCapSettingsButtonCapDefaultPlayerClassNameQuitButtonCap AdminCap AdminMenu RegisterSetText AdminCommand bAlwaysTickGetActionableMessage MOTDLine1 MOTDLine2 MOTDLine3 MOTDLine4 bIsSpectatorbAdminDeathsprisPRIMatchID PRIArrayWinnerbOnlySpectator bOutOfLives bWelcomed bHasFlagTeams MaxLives TimeLimit GoalScoreRemainingTimebMatchHasBegun Gamertag PawnClassDefaultPlayerClass HomeBase TeamIndex instigatedBy CurrentTimeParam2Param1IPScorePing PlayerName PlayerIDPGRIWithReplacedistOptionalObject RelatedPRI_2 RelatedPRI_1LocEntry Attenuate Momentum HitLocationDamage KillTypeEventInstigatorsenderOther BoneNameDeltaslotID ETravelTypeSkins InstigatorKillsOwnerGUIControllerViewportOwner bVisible ConsoleBKLastURLPortalIndexTextKeyGameSpecificLevelInfoClipXSizeXSizeYWaveMultiPlayerLevelInfoWaveSizeIncrementInitialWaveSizePerPlayerInPlayLimitModifierMinInPlayLimitMaxInPlayLimitInitialInPlayLimitRanking PreloadMeshPreloadAnimationPreloadMaterialsrcPCMapFrombFound Selected bGameEndedEventbWaitingToStartMatchHeadLine Background MapListTypeNumSpectators NumPlayersOuterClassPackage CurrentID BaseMutatorCounterInputGameRulesModifiers GUIComponent GUIListBaseGUIList GUIComboBox GUIButton GUIListBoxGUIScrollBarBase GUILabelGUIFontGUIPageConstPlayerControllerClassbWelcomePendingIpAddrHandleVoiceChattersbPauseResultInOpt SpinnyWeapbItems bSpectator StartSpot NewPlayer TestPawn InAdminName PlayerInput TextBufferMsgTypeObjectEnum FunctionState InPassword InChecksum MyScrollBar TimeLeftFontDYFontDX LineCountInClass InCharacterInTeam bCancelled MyControllerMyOwnerMySecurityClass NewAnimName NextAnimTimeaPlayerTeamNum cYesButton cNoButtonExiting HudQuantity MountPointRotator bMessage AdvancedPawnKiller KilledPawnVictim KillerName VictimName ViewTargetinjuredbBadConnectionAlertbHideCenterMessages bNameChange GameOverAdvancedWeaponCurrentReasonScorer botToRemoveTag TimeSecondsYearMonthDayAdvancedGameInfoAdvancedPlayerControllerHourMinuteSecondPauser bPlayersOnlyNetModeGameControllerList TargetInfo MessageInfoSubtitleGuiFont InfoGuiFont BigGuiFontStandardGuiFont SmallGuiFont TinyGuiFont ActionRadiusAdvancedCheatClassFireBurnRadius bSourceFadesbChildrenFadeFireDamageTypePlayerPawnBase CommandLinetmpAdvancedDeathMessage AdvancedHudAdvancedMPGameBaseCTFFlagiEnemyDiffLevelMsg2Msg1 bDisconnectiHeadiBody bRealSpecPreloadObjectsAnnouncements AnnouncementscaleYscaleX HudCaption objMount HeadTextures BodyTextures iBodyTexture iHeadTextureBodyapapc TeamType bClearScreen MyLifeBar MPMessageadvCheatManagerbDisablePawnHudtheWeatherEffectobjActionableActorTempActionActorBestActionActor aPriorityweapTargetActorInfo revealTimecurrentInfoMsg NetBaseActor EffectClass FlameEmitter FireActor NearActor bHasFire DOTZMPFailedLastProgressStringtopmenu currPriority tempdistStructDOTZPlayerControllermpliMyPRIbCenterDEBAITDOTZPlayerControllerBaseDOTZInfectionDamageDOTZAIControllermyHUDClipYMapNum CurrentMapStrDOTZXCharactersCreationPolicyOpponentFactoryVGSPAIController bNameCheatbWaitingToFall myPRIIndexDOTZXAnnouncerDOTZXInterfaceDOTZTInterface AimedPitchbCanDoubleJump TravelType WaveSize screenPosTheCreationPolicy JackSlade OtisSounds C08Otis5HudIconBlueKillsHudIconBluePlayerRankHudIconBluePlayerScoreHudIconCTFTeamBlueFlagAtBaseHudIconCTFTeamBlueFlagDroppedHudIconCTFTeamBlueFlagStolenHudIconCTFTeamRedFlagAtBaseHudIconCTFTeamRedFlagDroppedHudIconCTFTeamRedFlagStolenHudIconINRedWavesHudIconRedKillsHudIconRedPlayerRankHudIconRedPlayerScoreHudIconTDMTeamBlueHudIconTDMTeamRedHudIconCTFPlayerHasBagHudIconNoTeamKillsHudIconNoTeamPlayerRank InvasionInvasionWaveComplete03InvasionNewWave01InvasionNewWave02InvasionNewWave03InvasionNewWave04InvasionWaveComplete01InvasionWaveComplete02InvasionNewWave05InvasionNewWave06InvasionWarning1InvasionWarning2InvasionWarning3BBGUIBBGuiController BBEditBox BBComboBoxPlayerSecurityretAnchorProgressColorSmallMolotovFire SmallFire PawnFireMedMolotovFire MediumFire LargeFireZombieDOTZAIBursterZombieAIControllerNoChargeZombieControllerVomiterZombieAIControllerXDOTZCharactersxVomiterTeenagerMalexVomiterYoungAdultFemalexVomiterYoungAdultMalexYoungAdultFemalexVomiterTeenagerFemalexVomiterSwatMalexYoungAdultMalexVomiterSeniorMalexVomiterSeniorFemalexVomiterPunkMalexVomiterPunkFemalexVomiterNurseFemalexVomiterMilitaryMalexVomiterMiddleAgedMalexVomiterMiddleAgedFemalexVomiterHospitalPatientMalexVomiterHoboMalexVomiterHoboFemalexVomiterGoreMalexVomiterGoreFemalexVomiterDoctorMalexTeenagerMalexTeenagerFemale xSwatMale xSeniorMalexSeniorFemalexScuttlerYoungAdultMalexScuttlerYoungAdultFemalexScuttlerTeenagerMalexScuttlerTeenagerFemalexScuttlerSwatMalexScuttlerSeniorMalexScuttlerSeniorFemalexScuttlerPunkMalexScuttlerPunkFemalexScuttlerNurseFemalexScuttlerMilitaryMalexScuttlerMiddleAgedMalexScuttlerMiddleAgedFemalexScuttlerHospitalPatientMalexScuttlerHoboMalexScuttlerGoreMalexScuttlerGoreFemalexScuttlerDoctorMale xPunkMale xPunkFemale xNurseFemalexMilitaryMalexMiddleAgedMalexMiddleAgedFemalexMeleeHeavyYoungAdultMalexMeleeHeavyYoungAdultFemalexMeleeHeavyTeenagerMalexMeleeHeavyTeenagerFemalexMeleeHeavySwatMalexMeleeHeavySeniorMalexMeleeHeavySeniorFemalexMeleeHeavyPunkMalexMeleeHeavyPunkFemalexMeleeHeavyNurseFemalexMeleeHeavyMilitaryMalexMeleeHeavyMiddleAgedMalexMeleeHeavyMiddleAgedFemalexMeleeHeavyHospitalPatientMalexMeleeHeavyHoboMalexMeleeHeavyHoboFemalexMeleeHeavyGoreMalexMeleeHeavyGoreFemalexMeleeHeavyDoctorMalexHospitalPatientMale xHoboMale xHoboFemale xGoreMale xGoreFemale xDoctorMalexBursterYoungAdultMalexBursterYoungAdultFemalexBursterTeenagerMalexBursterTeenagerFemalexBursterSwatMalexBursterSeniorMalexBursterSeniorFemalexBursterPunkMalexBursterPunkFemalexBursterNurseFemalexBursterMilitaryMalexBursterMiddleAgedMalexBursterMiddleAgedFemalexBursterHospitalPatientMalexBursterHoboMalexBursterHoboFemalexBursterGoreMalexBursterDoctorMaleVomiterMaleBaseVomiterFemaleBase VomiterBaseScuttlerMaleBaseScuttlerFemaleBase ScuttlerBase PlayerOtisHeavyMeleeMaleBaseHeavyMeleeFemaleBaseHeavyMeleeBaseBursterMaleBaseBursterFemaleBase BursterBaseProgressMessageName StrProperty OwnerName bBehindViewBestActionMessagepClass MenuNameLastStartSpotLastStartTimeDOTZMPHudBaseDOTZMPGameBaseDOTZCaptureTheFlagbInitializeAnimationCameraLocationCameraRotation ParametersSoundLocationIdpickPreviousPawnClass actualDamageTargetnextController DamagePerSecDOTZDeathMatch UPreviewtempOP NumWavesWaveRemaining WaveInPlay bFirstWave WAVE_TIMER WAVEDELAYANNOUNCE_DELAY bAllDead StatLocation StatSpace LeftMarginLeftMarginPlusTeamLeftMargin EnemyTeamNum BlueFlagMat RedFlagMatBagPosXBagPosY tempFlag LocalStat iMapListBkStructPropertyArrayPropertyBot TeamNumberbHeldbHome bIsPlayer ViewActoriActionableRadiusURLHealthBackButtonLabelClassProperty AirControlJumpZ AirSpeedDelegatePropertyProgressTimeOutGetPlayerNetworkAddressSetViewTargetMapsInGameBackgroundMaxedOutMessageFailedSpawnMessageFailedPlaceMessageFailedTeamMessage AdminClass NeedPasswordWrongPassword IPPolicies CloseLogOpenLog PasswordBox DOTZPage DOTZPageBaseDOTZInGamePage bDemoOwner SmallFontHudCanvasScale accept_inputbPasswordRequired SpinnyDude PlayerMeshCamPosCamRot HeadIndex BodyIndex bInitializedCharacterTypeLabel_lblCharacterTypeValue_lblHeadTypeLabel_lblHeadTypeValue_lblBodyTypeLabel_lblBodyTypeValue_lblQuitButton_btnErrorMessage_lblContinueButton_btnOptionsButton_btnGetMsgLoadButton_btnSaveButton_btn NameProperty MakeColor SetDrawColorSetPosDrawTextJustifiedDrawTileScaledSecurityClassVoiceChatterInfoGameMessageClassDefaultPlayerNamebAdminCanPauseGetCameraLocationTeambAllowedToSwitchTeamsAccessControlDamTypeTelefragged LocalMessage GameMessage GameRules ObjectPoolControllerClass PawnList PawnName HeadType BodyTypeSelectedCharacter bChangeBodyListObjectPropertyGetNextIntDescgcPlayOwnedSound SetTimerFloatProperty BoolPropertymap2ML StartMapZPC KilledNameConnectionLogbAllowTelefragsRoundTimeLimitInitialInPlayOverridePerPlayerOverride MaxWaveEnd MinWaveSize MaxInPlaybModerateWaveSizesbScaleDifficulty MaxRespawns RespawnDelaybDontEndLevel bGameDebug FinalWave LinkMeshbRushAnnouncedRESPAWN_TIMERMapNameRoleType bHardAttach DrawColorSelect playerhud IntPropertyConsoleLastAliveControllerdmsg AliveCounter bPreventTitlef bWasHiddenErrorDescLogf AdminManager AdminLogSwitchMapTargetLastProgressIndexbSelectedPawn JoinedTimebHidden WAITFORPAWNADMINSWITCHMAP bClientReady BytePropertyCollisionHeightTexture botclassSoundblahOptOptionsPitchmsgLNshotInNameh ChatFontChatFont_PageAtemp ScriptTextAB debughudd DisplaySignC ChatMsgswibbleREMOVE_CHAT_TIMERSET_BSTARTINGXYoldmsgRankregfontitmpDPlayerCXCYZdelim quotechar delimpos quoteposW bOnlyFirstRr0r1r2r3r4r5r6r7r8r9 IndexCharjiSPoints Location RotationStrTextStrPart OffsetStart OffsetPart ReturnValuedivider leftpart rightpartAlphapartsDynamicLoadObject FindObject ignoreEmpty RandRange thisPawnworldPositionAuthorStyleNetConnectionPlayerActorMesh Material EngineExFileLog GameStatsWeapon LevelInfo GameInfo PathNode PlayerStartHUDPlayerReplicationInfoGameReplicationInfo LevelSummary AIController Controller StaticMeshMutator DamageType TeamInfoNavigationPointCarriedObjectCanvasFont InteractionBaseGUIControllerInteractionMaster MyBackgroundPawnsLevelColorModifier charname ModifierEmitterPawnMeshAnimationCloseButton_btnRestartMapButton_btnEndMatchButton_btnPlayersOnlyButton_btnCaptionMessage_lblPlayerList_box MapList_boxKickButton_btnBanButton_btnSwitchToButton_btnRemoveMapButton_btnAddMapButton_btn BBInputBoxAdminButton_btnMOTDLine1LabelMOTDLine2LabelMOTDLine3LabelMOTDLine4LabelP @S 6ut F 9:9:$ Ђ6Z[[bm}rhhhhhhJqJqJqJqJq??Jq6L9L96?n6?n6?nňL9ebL9ebebL9L9ebL9ebL9ebL9ebebL9L9ebL9ebebJqJqJqK8 䶇JqK8 䶇JqK8 䶇JqK8 䶌?/C/C/C/C/CJqѫppCL9L9a"p?eb䶏䶧b:}rhhhhhhhbb}rh:;&0:;&0bbJq\;JqK8 E_R33p,kL93Jq Ics3333333333  )K??JqsߊsߊJqK8 sߊsߊsߊsߊsߊ?pL9JqJqK8 JqK8 JqK8 yJKOyJKOyJKOyJKO?JqK8 JqK8 yJKOyJKOyJKOJqJq V^܌?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 ?Jq V^܇Jq V^܌?JqK8 ?JqK8 mmmJqJqJqJqJqJqL9p B Sq]BladeIN_V20.BINCharSelectp]BladeIN_V20.BINPauseMenuGPgX9:9:$9:9:$2&?JqJqJq V^܇JqJqYJqJqL-JqJq Ic}r}rh}rY.JqJqK8 JqK8 yJKOJqJqۖۖۖۖۖL9ۖۖ  %!)#'"CiK$@qlI@]`d@[Nx @@fP c@@b3@[h@|wTBGE L6~ V^-ЇJqeEeEeEeEeEeEsߊ]"JqJq̇Jq̇Jq̇Jq̇Jq̇Jq̇Jq̇Jq̇Jq̇Jqsߊsߊ?> IcsߊJqsߊsߊ IcsߊL9L9sߊL9JqO`sߊ?LLY'L6L9Jq 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 yJKOyJKOJq V^ܡ6Jqsߊ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 Ics 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ߊۖ Icsߊsߊsߊ66 < |b1P!Jf7*FMY%ÏmxG3_΍1 &OC,{wv. k1dJ%M|ΏTXqƏj('я"nAO :$4я4b|t⠏S坏<kŏT[܏7$ۏSFϐ|eVvUӏ`ބ3ڥJD~=T\$Ϗc^ÏbϏ6M`Xj E?owƏ(0۵Pq\rӏI컿8%R kE6vWN_܏[ӏB 22 K,lKH̲jݏ^ߏ{G|^JWH4g^e>zH؏%C|%cﰳ0hqt 3.P0||r\Jqc䍤c䍤Jq?ě4ߏ?ҏr . %!)#'"Y PY  \Y ~Y ui)%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?q]XDOTZCharacters.HumanPawnBasetiCopMale DoctorMale GoreFemale GoreMale HoboFemale HoboMaleHospitalPatientMaleMiddleAgedFemaleMiddleAgedMale MilitaryMale NurseFemale PunkMale SeniorFemale SeniorMale SkeletonMale SwatMaleTeenagerFemale TeenagerMaleYoungAdultFemaleYoungAdultMalerYBursterVomitermTS_@|]XDOTZCharacters.JackSlade{]BladeIN_V20.BladeINHUDy]Invasion(Blade)|]BladeIN_V20.ZPlayerControllerw]K@ @ K w@}NA@ @tb@Gr@@ lq Sbv64-Upp9WR:S!bSR I@`@Z=>@Q5AH @s UVa@N_@^VF2 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} 2$ `nb]Close Admin Menucos] Restart MapDpM] End MatchNqW] Players OnlyurKsHtYu^]Kick_v`]Bandwe] Switch Tofxi= Remove Mapnyo] Add Mappz_N$=t$L?4?Hy @_^@NVTu@LCe S@i@eS@{ z@D @\RV2 ^Y.<姈}r Ic Ic Icm2ȩ\Rȩȩ\Rȩp\Rȩp3\R\R3 Icȩ Icȩ Icȩȩȩȩ\R}rȩȩȩȩȩȩȩppȩp8ppȩp8\R}r}r IcJqO`ȩ IcJq IcJq IcJq V^܆ IcJq IcJqY IcJq IcJqL-ȩȩȩȩȩȩȩȩȩȩȩȩȩȩȩL9L9L9ȩL9ppȩppȩȩ}r IcJq Ic;&06;&06;&06;&06}r IcJqO`?~?~"C} 2$ _tJqKpLEFFGGHHIoMnNmOl:S*CBZ'YL4WYMlY~~2 0\-K?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} 2$ M{u|v}x~yr@uAB]DOTZMenu.DOTZLoadMenuIGw]DOTZMenu.DOTZSaveMenu}]DOTZMenu.DOTZSettingsMenuIGF]DOTZMenu.DOTZQuitGameConfirm]They're coming for you...s] You have failed.u]OMGONOS! You're dead!v] Continuew] Load Gamez] Save Game{] Settings}]Quit~= Admin Menu]BladeIN_V20.BINAdminMenu_N$=t$>$>$?$?4W\U\YzJaW@Q aPAA9%79)zz za%{as] azG zs-H 7979&79&9s7979&79&9s)79  i@Qn@"OTM Zo/߈L9L9L9L9L9Jqъeb fB ros\@J[!/y@J@W@k@f|@@f @8_[@@p NoT6IL-1E_RL9L9 IcL9L9L9L9sߊL9L9L91HYJeJe1HY Ic Ic Ic Ic Ic?1HY?Jq Ic? Ic? Ic? Ic? Ic?1HY Ic Ic? Ic?? Ic Ic? Ic Ic?T6TT>TJqK8 JqK8 yJKOyJKOJqJq . %!)#'"q]XDOTZCharacters.HumanPawnBasemTS@{]BladeIN_V20.BladeCTFHUDD]CTFy]Capture-the-Flag (Blade)Qv|]BladeIN_V20.ZPlayerControllerBHq@G P:J@b @e@Z;JXP6BYʖsߊ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 . %!)#'"q]XDOTZCharacters.HumanPawnBasem_@{]BladeIN_V20.BladeDMHUDD-DMy]DeathMatch (Blade)Qv|]BladeIN_V20.ZPlayerControllerfpX|e@a @A@n@@ihN @e@@1R&f@s|_ wn@Dt@k@dQ @@SE@DxbY@UV eyM@F]@]@q@tt @`@b@`@Y uYSH@k@I@X @}ajY@EjHEN U>}c1bVRID ɚD ɚD Ƀ333333D ɚD Ƀ33333333D ɚD Ƀ3333333 Ic?>3 Ic IcL9L9? Ic?L9? Ic?L9 IcL9L9L9 Ic Ic Ic33 IcL9L9?3333 IcJq Ic IcJq Ic Ic Ic3333333 Ic Ic3 Ic33 Ic33 Ic333333Jq33D Ƀ3D ɚD ɚD Ƀ3333333333333D ɚD Ɇ Ic?3333333 Ic?>3 Ic Ic? Ic Ic633 Ic?33 Ic?33333 Ic63333 Ic633333333JqJq333333333? Ic? Ic Ic Jq Ic? .B S}]ECWaiting for New Wave
Press Fire or Alt-Fire to change viewpoints]Press fire to startW= SPECTATINGY= Final Wave[]('The zombie invasion has been defeated!\]L A GR WS^a*Ve]UWindowFonts.Tahoma20d$?Ju@M}@q@@OJ Vm2\RJq $ l"Xb$@aYeyCEx]\[yi @x E@,@~ Z[ A2 qo:;&0䶏}6"C}}r 2$ MgyhBi$>$333?4Wq@E@rbL | tAQF@\@t^FO@n@VOcQS0@TWp@MP@KEN~@{@](@J @V@i@[@oS I@mwa X2 pT͖ Ic IcL9 IcÚ}r 2$ = Say To AllEjCkBlJm4Wp%@k@r@d@b@yNx2 xiPuI؆ IcL9 IcÚ}r IcL9}rÚ 2$ ] Say To TeamEBCCBDJE$>$L=$fff?$L>4Wxb@uC Y @|[*@@lD@`Jmf@@P|iq@o Op @Qg@F E@Q @@T ] @z@@z@\ @c jgh_ @l^ @i@nomFe{t~D K2vk:?K8 ߷@K8 ?K8 ߷@  %!)#'"p]diedw] somethingT@W@} @ 6B6$$$$b.wb*bP,P , 9?, 7b% w9S6bb$$$$9?4aQC6BCB+9?,9?9?,9?,Baw$$$$6$9?4aZC6BCB+9?,9?9?,9?,B'a9S6bbw*$$$$6$9?4a[C6BCB+9?,9?9?,9?,B'a9S9D$$$$Iw*-'Iw*-'-'6C--6Cgd 
T%*7TaT8-( -F'6Cgb
T%7TaT86>Cgy
T%87TaT-(-'6HCar-(8-'$A$A$A$A&6TDs-(-'-'&6HDk-( 7%aAzut6z{CC7$ X  %46u O6utOn,n9D9?9D9?,OO= $6I Say$($$(9=n  TeamSay$$$9=n # Login M Logout$$$9=n w Killed$$$9=n $$$9=n tz?{a6 {u@?B sC @@\D~z@fXyQ7V%V}X~yXV&AxXV&ZXppXVXV&, XV&VX  o @@xBz @H @K @]@r ^c@R l E;8X~l ea 0X%XeX  CR@F Oc @EXQZ_@a\@^CSd @` @v@Y g@hu@[ @Z @\ @W @op@m` @@|@tM @O @j PL @K @9@@y }@|LK@zy@^@ @GGJXc@EOR@d{GT@W@_@G]e@a@[ W@] @c_@g@`d@_hd @n@U@qv@]st@k@x@b@d{@w@e@@@y@fQU @T @B@C@D@F@Y@V@Py@lHTMRKQ@@d@LU@Xj@[\Y@#@^@aRm@w@j@K@fio@s B@D@u@u  quZF!r g( 9- r*  q psk[  s vx_{a@x`G~@~@b@@B C D ZI v @G ^@h@T@l @zb vO?H{%@{7vbppb{vO {b  sR d @g @y u@n@@@~@l@] ^ @c@B i@e@j@c@s@`@k @@q @a @p@y ]LS@n T @K@w {@V:2*z{& {{}{&{  m @I h92*zh& hh}h&h  y { K@} ~ @l ]D C@I G u@H @)}gd O @| @@nS T U N @W Y Z @j@z ׽UU]ɓ4AUu'w$ (uUFDEqDABI=m>UUQ AUU{EmoUUhTI$)$UUUm6UU%Ui ۱mMkUUTUv`6aÞEEeUmІcUUeUy%H$׽UYTU y$AmAUUɓ$]UU ɓ$]UU $ӜuEQUɲvaÖWQEU&lؚQQYUY&$׽AY]UY%X)YYXI0³8c3׽%UۄMXVVm$UUUɐ($%eVYvn$Uɒ7p$e}\UK8$׽VtqUK$AU> $AY%U $׽DDeUa  YEb$sAfftUq4 ÚDDfUYUQ\Kə$UئmQQYU $]AEEeU ]ATTVUy $UEU0 ӰkUeUsضmێsUTUU6l6lǒUUUEaa8QUUUmӜUUUAI$i0AUU]aI$IsUUU#m6lTUUUmm6lMkUUUE$I$I!UUUXmۆUUUPI$IUUUÀRӒUU5dI$YUU I$ɓAUUUI$I$AUUUYA$I$AYUUUUUUUH$I$@UUUUA$I$@UUUU $I$@UUUUI$I$@UUUUUUUUUUUUUUUUɗ$I$AUUUA$I$A]UUUUUUUUUUU $I$@UUUUH$I$@UUUU $I$@UUUUA$I$@UUUUUUUU c6즒UUFl؆mQEUUU ĶiAQQQa v`v@EEEJuгgvWQ}#@]wUt`]Aftu$_ELdcAVu=+I0ӜgMedAQ I$UUUY$I$YTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU cXmۂUU $I$@UUUUOI$AUUUH$I$@UUUUUUUUH$I$@UUUUA$I$@UUUU $yĚU]g`UUUϓ$yYAUU7m]mUUhO$IAUUN$I%WUUQZ>]U]Ɂ$I{ATUomUU]tI>{yU]@I|QAWUxIRMkAUH6`3mIJU%UUώlUUr0lMkmdUUwI$UUsI$sKUU61?I$1-uUvI$?UUJ$I$TWUUTRضmۊRUUU6؀mUQUUwI$I${QUUZ* mۊRSUUYDJQ [`fkp z               ' 3 @ M Y d q }         '  ' ' "'2' >' H' R'W'\'a'i' s' }' '' ' '' '''''' '' ' :  ::::':/: ;:C:K:S:Y:]:c: W X \ kz$B{kBladeIN_V20.BINCharSelect8k-\ ] ^  M-u c.5wc*ca/!Vca/!~ca/!Xca/!xca/!Fca/!M 8BladeIN_V20.BINCharSelect PZH<^f~ZX 6fnZp(nZfpZf'  ] jx$"9:9:$a( ^ 7^t--u-}q!wi!w!v _w/*_r/-}'-}BladeIN_V20.BINCharSelect  _ |T s$"9:9:$aL>' c UGq<8U:9:9:$ -}[-}' f[ T Lw>wgT  D%f7DDpD&BD&Q D   rg a kCq D@@ph e u?_q i l;%q  k j;q @ r h;q {@m n o p q k;p @u Z LH~@w [-rn -}' sz A |##mN6Z6ZAA B C D Z-F  B gSBC&C x 2})hD0r* r*r* |n|,9D9?9D9?,||N%=%=,z=N=2|2$2aAG`E?9?2?@9?2^?9?2?@9?2^`9?N@=%=, z=2=629=2!a=G`2EG@^2a=^`= | YIl-( } { nk8/-9:9:$( ~ s gj-  r@7]~w*%l.wl*l{w6l *[6l /a6 9?1`1&11ZB9D  !B1b$  J "b$  11ZBM[MBZ1[MBZ110D/a6 9?C1`-1&1CB1ZB9D  B1Cb$  J "b$  1C!1ZBM[MBZ1B[MBZ110hw[*[Dp[* A n]X9:9:$ r*-D rn-D'r*  -' B@C FHVT&r*{F,login BFhB!BB c`6B oG  %!)#'"E TtEV T y OubnJ@O$$$$/a9 @fr*r*r@1~r@*1,@-r*1w@1,@  9?1d@ 6d@9?,]' Kd  H6]F6]H9?%HO  F9?%FO b@E@nzEzEPlayerE@OOaEMOO*HM9?,FO9?,OaE103- }OO  F NijP3R~N?5RPN%R@PNR~P.dztRPP%Ra.pP.LevelSummary wa*{a{aUntitlediaiPIwa*{aippi By: are*e.pP.Screenshot 're*e.pLevelScreenshots.P 'we*e.9Ve DOTZMenu.DOTZLoadingMenu(Loadingi9VeN`-a G n\7O/"9:9:$y- H ZUWN$ w* Z[\ I W\RNNWX J ]E6}J ]XLWwX*gaXWwg*ga*w.]*.] T]w]*]T{w.*.a'' K PO D-u'WPQ L LGBHLMRFw -(R  M vc9z/ |/ |/ .DOTZMenu.DOTZGetPassword  z/, Connecting z/Lost Connectioncancelv%h/.5w*a/!fa/!Aa/!Va/!~a/!ha/!xa/!F$BladeIN_V20.BINMPFailed/ c!Az/ .5Lw* [ q  v%./g&v&.h /L  ?  Y  \L z'$BladeIN_V20.BINMPFailed/Lgvv,v/vI O Z374Z $, ,f(' Z D ]Q, 9?, 07.% 9S6..$$$$9?4aQC[BKCB+9?,9?9?,K9?,$$$$1a9S6..7aRanking goes here 0123456789 0123456789 0123456789$$$$6$9?4aZC[BKCB+9?,9?9?,K9?,$$$$1a9S6..$$$$6$9?4a[C[BKCB+9?,9?9?,K9?,$$$$'a9S9D P d58BladeIN_V20.BINPauseMenu   Q K*4w*  R Az3!w* bA S h}/* W gw,/"r*  B}@V X Es. BladeIN_V20.TeamSayGUI Z PCn1.FP sPD{PP B\ oi- BladeIN_V20.ZDOTZMPSay ^ @Ff)E-' BB w* -Y.wY*Y@TS%Q9?TS./R-'TCSa-( {-'$$ $ $TcDSa-( _ rh;'w*w*w*(ww*nrst ` Pl37&| PQSTWPYQSTWPkQSTWa @(  a Rd7"H-h--'RwR*wR*)w'Rre*eR-ieR-irRRR; e^e(r-(0-'--h Bh mBX!7 r* . mU By~@1D tf4CdHD.P,Cw*9?:a~CBCB9?9?,1a9S6..- fd4a}CBCB/a9 N/N%N-'Z%Q,N-Z%`,Z%aQN-W&QsN-W&`W&a10rZ*Z%QrW*W&Q9?t4aZBCBCz9S9D%$9?t9?,A9?,@9?t9?,A9?, 9?,F9?t4aWBCBC9S9D&$9?,F9?t9?,A9?,F9?,@9?t9?,A9?, $$$$V-'<-'9:9:$-'C-(Cgb
J!%!7Ja!J!+>Cgy
J!%+!7Ja!J!-(-'-'HCar-(E-'$A$A$A$A&TDs-(-'-'&HDk-( 7%aAH^]HGCC!7$  !%A6u! w9D6u!9?wr,r9D9?,w9?w= $6I! Say$($$(9=r ( TeamSay$$$9=r 2 Login \ Logout$$$9=r Killed$$$9=r $$$9=r ]H?Ga6 !G^@? f c kh '-'-(-'` g e uxH-'d`F9:9:$x |# j d p d vq` k i Fl XBzX w*(x%x7 -D(|xX-D'xU-DAx&&b.;  m cAzc w*added mapcz(7zzczb.; n Pmkw*kw. *. wstarted a new wave o k@ligw*q(s%s7q|ksqsGqsqbmoved to mapk>ppp****  switches to map k0*Force Map Changefka,@( q KKtrw*restarted map0*Force Restart,?restart( @r LJvWUw*aya/!M JLU/a9 nTS|nLw.n*kickedn9ppp****  has kicked Lna10 t ZMt fdw*aya/!M MZd/a9 Pcb|PZw.P*qPV `qqq~q:bannedPIP:q9ppp****  has banned Z\%\,2z\\8\,2\pDENY,qbPa10 v GNf w*--K-GonVGoffset PlayersOnlyGJ**** Player movement only turnedGby w :_^ *(w*. : x w@W JHw*_%H_w. i_ { }Km ljw*bNG.NGBotHuman 'jwb*`%j`{ab`C yd@)V  m[w.*.P,p.P&\w*9?:aoCB CB9?9?, 1a9S6.."9?4axCB CB9?9?, 1a9S6..w*9?:ajCB CB9?9?, 1a9S6..9?4auCB CB9?9?, 1a9S6..w*9?m:a{BC BC~9S9D$9?m9?,A 9?,@9?m9?,A 9?, 9?,F9?m:a{BC BC9S9D$9?,F9?m9?,A 9?,F9?,@9?m9?,A 9?, $$$$-'-'9:9:$-'C -(C gd
Q"% "7Qa"Q"~>C gy
Q"%~"7Qa"Q"M-(-'-'HC ar-(-'$A$A$A$A&TD s-(-'-'&HD k-(T 7%aAlomloCC "7$ T "% 6u"Q ]9D6u" 9?]j, j9D9?,] 9?]=Q $6I" P Say$($$(9=j { TeamSay$$$9=j Login Logout$$$9=j Killed$$$9=j $$$9=j ml?oa6 "oo@?a  | v?w*ended the match!H<pp****  has ended this match.0adminforce ~ x0V{rB*Ba mwB*B adminBpT:xByxL  @ } T,ppppppppppp9S-9S-9S 9S:9S:9S @ mg mS R stwm*ma/!e - ws . Jt-'a, @(A A 162342}@V@h f Y r}*,r[*kFks[f & )DVk} I[r@*V Dkh  Vs@ .DVk}b@[  I i eEi C-t E%CI% NIi F@Tc ^Ur* 7% T7aT?> N UogF~DF '稨9VSpawnZombieF9VD9XUaD U H b-9:9:$a7, j 3j &F q9:9:$w*w*-'a  a* @K pq"`H/a6 s9??-[(b%s/k##/s a2 p-['10>-[(Hs's%pa s p--p--p-'pa*spP10I O L ~ fff?, (%CopMale A&DoctorMale Y,PunkMale q,GoreMale ,HoboMale pNG.NGZxh7gphgh7ephepXDOTZCharacters. P +ix97y&/ a0 G87yyG10p ,  -SG7yyvrG* /Ga6 TBwT*10wT* -OG-G-(Gb-S' -OG-'9C-S+oG Cw+*jrr+*9V: Unable to spawn zombiew+*r+*+a+w+*+ E+.+i**+f S zi1w.*%7.9V. pPreloading: 9V. %S7.9V. pPreloading: 9V.%7.9V. pPreloading: 9V.Z%'7 %79V pPreloading: 9V.%79V pPreloading: 9V%/79V pPreloading: 9V  D@ < N@ D  \  OW7]% E7]]xwx*w.x*(x .xGE$(xx6 R V Vz'' W  U Y Qp1KDDK*-(=( X 7 m+#-(-' ')N  Z `A+_`z` z` Show prompt for password.%hDOTZMenu.DOTZGetPassword b _AG(7_% 7__~w~*q~a/!8.~G$(~~6 @ _ 6Y{Hw*w*$?C E(' `  ^ |]9:L &(99:|,  9:|,6*'YY9:|, 9:|,'( c vL:ҩd/a0 vI<wv*v^va10J f J {4kJ -H  e g V O0V U T  h [ \,k[ Z Y W  j kN'5klkl-^  k zV"\.ppReduceDamage(9Sz9Vs9Ve)zsec b `   m F 0wq/a0 uM<wu*uquq!j10-(F G  o x Pȣx y { }  rp RQ.PreventDeath()8-_8rL -r'd-r-rRo Lr -rw.R*R a,(-r .~1.LevelStart()/w/* r FgϘ.ppLogout(9VF)Tw.F*T.F--V'Ow.F*.F-"9:9:$O%"O7r6 OFN.F6 O6 O(OO9:9:$.Fo-V29:9:$9:9:$m,Fw*mF  s 4l.ppScoreKill(9V49VQ)r4* r4QwQ*wQ*Q9?&BQself_fragSSw4* wQ*w4*SQa/!8Sw4*49?&4 B4?fragww*l4Qw4*  %{4 t Jen - #rL* QwL*L-' JLe `wJ*{JwJ*\JL-^LBwJ*w.J*Y7_ D\^Y_ 5Y9ArJLJL`{_J_!ejL-'-E'CwC*~C-~wC*Ca/!eC%kw.C*X_C-E(CCX&._G7bb$(-E -V0*Everyone is deada,EB(l u HGZHwH*Ha/!8>- rH*H%H 9?jH-'H-(HH v L33jV- L, Calling MultiTimer while game is ended!!!! Slot=9SL L & t(db#vtt-vd ,v( ] 4G] 2,E)& a,EpA(/w] Z,W-'Ay] L w lN稨9VNotifyRemoveBot:9SE9SS9SN}-t S,9?EN9?S33>:E% N%-t(Yn% En Nn -{(a,EA( x :EEEN,9VRUSH!!!!!!AH-t' z jmE&N { V g}S'OE%-t(6I% NI'CK%(V ' | P }M{.ppEndGameAnnouncement(9VP )zwz*wza/!8z-(zz>a,E(a,(Aw-(L } Y zK.WaveComplete()3-{a,E@A(a,@( @_wu.StartWave()-J'8-{'0*Victory!S#%LeS, S, w% Sw-{'-{(ESL-A|_rw_*[_a/!8- [r_*_%_-(__Z![*%9?&-S(: dg<1pBBSquareButtonfBBSquareButtonpBBSquareButtonfBBSquareButtongf-'v m d\ j_ Co {C Wc c` uM lW i[   BR^稨9VLOGINR0`-Dp0SpectatorOnlytR0A0Name,~9=D0Team,k0AdminNameB0Passwordy0ChecksumLogin:A/a9 8w8*w.8* r.8*8%|8A8a+8 8-(8a-'-(0.810~R~*GX*~R4rG*`*Zr*  a G G r *pCouldn't spawn player controller of class 9V`* G  q!Fe we* ae r *pCould not spawn security for player 9V !9ppUnknown security class [] -- System is no secure.!9]. ] BR]- 1-D`*]-1(-D'zAA9:9:$z N A(f-D - -' -' -' ] 9:~(`* G a0Classzaa~0Character-':- q!L]. U0HeadH9JUU0BodyG9JU]H]G] ~ SQJJO.?(d%d7Jp#cdJddS-( D'fW稨9VPOSTLOGIN9V'N.'_rN*9VPostLogin: No Controller given O.'wO*O@稨9VGAMEINFO POSTLOGIN9V' 'w'*'-('-'c'{c' rc'***chas joined!\clogged in from'\No name logged in from'N_  @ECTVppppppppppp9S-9S-9S 9S:9S:9S GN\5UrH*Ha rwH*HconnectionHpT:NH~NR Al7_: @.l%l7@)fcl@)l2 HPfT rP* P JaMkA- 9:9:$9:9:$ r*r*C,CKX9=CrK* Player start not found!!! 3w*w Zr*QzaQ K K r*pppCouldn't spawn player of type 9V at 9VKq!p  K .K EX''W xZKKf.m FNoi( ]T.T;N-K[( OMxo K.ppRestartPlayer(9VM)r.M*.Mn.M-uMWMrM*MWM KIUq <9:G&(89:U, 9:U,d' LSNRkJ$ QMW|  w.W*.W-r*(J $? id' jadmin restartmap {admin endmatch Cadmin playersonly $W,admin kickp? ec/admin kickbanp? i.admin switchf? l1admin removemapf?f*f?' u%admin addmaphEfchEhA' ( U[eI*-(, X~ gTrinZombieAIV2.TrinV2NoChargeZombieController (                                                                                                                                                                                               c c~tEztYt ~_Y~zt 7_&%_ &_ .PostBeginPlay()r 7%%%o is done, like dinner... zombie dinner&Zombies 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 donated, Zombies eviscerated %o, %o stops at the No Brain Hotel, Please kill %o .. oops, too late., What does %o want on their tombstone?bx. wx* #%#x %%%x> -]' #, #, ,  %,%,&* #,#,> %,%, -Y' x %##,%%,  & ,##,%%, .ppInitialWaveSize=9S#).ppWaveSizeIncrement=9S%)S#-S'-{(a,E A9?,(N w,  w%w,| j%l i%i,a49?i' 9:9:$a&  A(  o  o  o  o  o  o Rr' B[I-|yB~I?2BII%BA~I?dA[I%Au|I['( @Y\ZwQ_ ^UjF D- 'Uz-'UInitialInPlayOverridea{K9JUMaxInPlayLimit{9JUMinInPlayLimit{9JUInitialWaveSize{#9JUWaveSizeIncrementM{%9JUPerPlayerOverride{q9D9LK%Kq%9?qUTimeLimitz^9J%0B,<& gog?  -oq @@@h 13487i 2j 10H 69oh<(Ehi-(r*br*UvUpo-(-'uUoxr*E-(F-("E{F@-w*eDe-'e-(\B_C  qA稨9VLOGINA*b-Rp*SpectatorOnlytA*V*Name,m9=D*Team,e*AdminNameK*Passwordc*ChecksumLogin:V/a9 ;w;*w.;* r.;*;%|;V;a+; ;-(;a-'-(0.;10mRm*XX*mA4rX*b*Zr*  a X X r *pCouldn't spawn player controller of class 9Vb* X  q!Fu wu* au r *pCould not spawn security for player 9V !9ppUnknown security class [] -- System is no secure.!9`. ` KR`- 1-Rb*`-1(-R'zVV9:9:$z N V(f-R - -' -' -' ] 9:m(b* X w*Classzwwb*Character-':- q!L`. Y*HeadI9JYY*BodyJ9JY`I`J` mmQSp 1mV$?-( sCR[GClC***C scores! ptoZE #t-v[( tffHyff***fhas entered!frf vCfE8r.C**** GiveDefaultInventory pawn=None C rA_ <9:z&(89:A, 9:A,o'  wj_W f/a9 jcjjj j10 {3C, & L(@b#KLL-K@ ,K(   yu}k C w.}*W.}-rW*(V$?W e-w* F? og('? sE[r*.9OXDOTZCharacters.JackSladeHSDawnCharacters.Peterp k? Fr*.9OXDOTZCharacters.JackSladeHSDawnCharacters.Roger d ? \ l? <_ n? ( O ,5r rOi}9zix~i O|~Ozi7|&%| &| 9:9:$a& ?( WVzr' FC-yV~C?2VCC%VQ~C?dQ|C%Qu|C|'( A@B@Y@@ E <)E I O@ ?( @COEk| D7!#KYYK GIG#:9$?(' JHL6-X$?IYE(' MKw:+19:w, 6*--9:w,G*' ryj GpyK -'^yTimeLimitX{^9J^n% QRUV@W@U @Zglc gMDwg*PgTPA zombiewM*qMg***Pkilledq [fk 稨9VLOGINf(A-bp(SpectatorOnlytf(U(Name,@9=D(Team,b (AdminNamej(PasswordZ (ChecksumLogin:U/a9 :w:*w.:* r.:*:%|:U:a+: :-(:a-'-(0.:10@R@*SX*@f4rS*A*Zr* a S S r*pCouldn't spawn player controller of class 9VA*Sq!FH wH*aHr*pCould not spawn security for player 9V!9ppUnknown security class [] -- System is no secure.!9d.d jRd- 1-bA*d-1(-b'zUU9:9:$zNU(f-b--'-'-']9:@(A*S~(Classz~~Y (Character-':-q!Ld.J(Head]9JJJ(Bodya9JJd]dad \M3B M & ^(Nb#c^^-cN ,c(  M ^X +A AXMt 9zMxKM XzKXzM7z&%z &z 9:9:$a& ?( M`T-yM~T?2MTT%MV~T?dVJT%Vu|TJ'( o@cGjhGz KGTimeLimitP{K9JKf% @aAb z FUHh[wF*F- 'F z?F ̬?F 33?F iA tOA ,7)%^%)A)%&M7 %a% A %& N E <*hCE I o. e o 6o$oON Q -(CH-@'= jbiL )9:9:$A %7 ew. * . w.Y* .Yw.L* .L  l}aP9 \.\/9:9:$j%vj7 lr}j  jE7  }w\*a.\wa5*a5a/!V.Ya5H hdC@d/U d g d k d q d  n;Di)9:9:$A)%7)g)(  k7HO?M..,r* E7%A%7nw*w. * . w.Y* .Ynw.L* .L%*%3%3*%3 >%>*%>C7 %+Loading Pawns...kLoading Pawns...%*&7%M77 z9W7 NoneC77 w7 *"{7 |7 |9V7 | JackSlade|Jack Slade PlayerOtis|Otis McRedneck >+|7 9V7 75%57%w5%*3!+Skin9S5 p9S55T5%457%*w5%*>$+Clothes9S5 p9S55t%I ox^;ec9:9:$W%QW7)G|xW) W 7))x pd2J-%9:9:$;b K ^UOG9:9:$稨9VPNR: SelectedCharacter=6}$9S6E$9S6y$^.^6E$^6E$-\'^6y$-\'^6y$/{9V^6}$^W6}$6}$G-\^m  m7(=C7,H;3&I rM A| M -~ 9KO  @Nclass 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; if(AdminManager != None) { botclass = class(DynamicLoadObject("NG.NGBotHuman", class'class', true)); if(botclass != None) { for(x = 0; x < i; x++) { bot = Spawn(botclass); } } } } exec function AddZombies(int i) { local int x; if(AdminManager != None) { for(x = 0; x < i; x++) { BladeIN(Level.Game).CreateZombie(); } } } exec function StartRush() { if(AdminManager != None) { BladeIN(Level.Game).StartRush(); } } 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; 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() { 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(PlayerController).ReceiveLocalizedMessage(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_V20.ZDOTZMPSay"); //} } exec function say(string x) { x = Level.Game.BaseMutator.ParseChatPercVar(self, x); if(x != "") super.say(x); } exec function TSay() { ClientOpenMenu("BladeIN_V20.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_V20.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; } 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_V20.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_V20.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) { local class effectClass; local Emitter theWeatherEffect; 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); } 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)); } if(Shot == None) { shot = Texture(DynamicLoadObject("LevelScreenshots."$Map, class'Texture', true)); } if(shot != None) shot = Texture(FindObject(string(shot), class'Texture')); 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; 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; } } } // 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; // 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 { 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; } } } } } 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) { return false; } return super.CanRestartPlayer(); } 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? 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_V20.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_V20.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_V20.BINCharSelect"); } } sQ Q Q  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; } vR oyyR -S ED&a&*[( do 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; } \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); } x|Iz -@ =lZ\3%3*%3>%>*%>7% -%2-7l(w-l*3;+p9W-l p9S---%-7lw-l*>;+p9W-l p9S--9 -zeJ2}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) ); } } {@Hl= BI=  AAE6}.$6E.$9J36y.$9J>.0OXDOTZCharacters.JackSlade.(\9J39J>.-u'&az( CrL w&*r qggmih&Aa q6}m6}i6}h&-'r a&('( }// 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; function PostBeginPlay() { super.PostBeginPlay(); SetTimer(0.1, false); } // Clear the MOTD timer function Timer() { SetTimer(0.0, false); 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; } 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++; } 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; } } 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 //=========================================================================== qH// 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 WaveSize; // Current wave size var bool bFirstWave; // Is this the first wave? var bool FinalWave; // Is this the last wave? var bool bNameCheat; // either implements something or at least fixes some Access Nones var array RushAnnouncements; var array points; var bool bRushAnnounced; const WAVE_TIMER = 69; // generic ID # const WAVEDELAY = 10; // seconds between end and start of wave const ANNOUNCE_DELAY = 2; // 2 seconds between event and announcing const RESPAWN_TIMER = 13487; var array NewWave; var array WaveCompleted; var array GameOver; var array LastWarning; var config array ZombieKillMessages; // Messages to announce when someone is killed by a zombie var string BasePawnClass; var array > PawnList; var array ZombieTypes; var array ZombiePrefixes; function bool SetPause( bool bPause, PlayerController pc ) { return super(GameInfo).SetPause(bPause, pc); } // TODO: Find a correct way to transmit info to the HUD besides using "MatchID" ... That would be GameReplicationInfo event InitGame(String options, out String error){ local string InOpt; bAdminCanPause = true; super.InitGame(options, error); bTeamGame=True; InOpt = ParseOption( Options, "InitialInPlayOverride"); if ( InOpt != "" ) InitialInPlayOverride = int( InOpt); InOpt = ParseOption( Options, "MaxInPlayLimit"); if ( InOpt != "" ) MaxInPlayLimit = int( InOpt); InOpt = ParseOption( Options, "MinInPlayLimit"); if ( InOpt != "" ) MinInPlayLimit = int( InOpt); InOpt = ParseOption( Options, "InitialWaveSize"); if ( InOpt != "" ) InitialWaveSize = int( InOpt); InOpt = ParseOption( Options, "WaveSizeIncrement"); if ( InOpt != "" ) WaveSizeIncrement = int( InOpt); InOpt = ParseOption( Options, "PerPlayerOverride"); if ( InOpt != "" ) PerPlayerOverride = float( InOpt); if(InitialInPlayOverride > 0) { InitialInPlayLimit = InitialInPlayOverride; } if(PerPlayerOverride > 0) { PerPlayerInPlayLimitModifier = PerPlayerOverride; } InOpt = ParseOption(Options, "TimeLimit"); if(InOpt == "") { TimeLimit = RoundTimeLimit; } else { TimeLimit = int(InOpt); } if(TimeLimit == 0) TimeLimit = -1; if(TimeLimit == -1) { RemainingTime = -1; } else { RemainingTime = TimeLimit * 60 + 1; } } function array > GetPawnList() { return PawnList; } function bool MapMatches(string map, string map2) { local int x, y; x = InStr(map, "?"); if(x > -1) { map = mid(map, 0, x); } y = InStr(map, "?"); if(y > -1) { map2 = mid(map, 0, y); } //log(self@map@map2); if(map ~= map2) return true; return false; } event PostBeginPlay() { local int x; local string entry, desc; local class pclass; local class y; local WaveMultiPlayerLevelInfo mpli; y = class(DynamicLoadObject("TrinZombieAIV2.TrinV2NoChargeZombieController", class'class', false)); class'xDoctorMale'.default.ControllerClass = y; class'xGoreFemale'.default.ControllerClass = y; class'xGoreMale'.default.ControllerClass = y; class'xHoboFemale'.default.ControllerClass = y; class'xHoboMale'.default.ControllerClass = y; class'xHospitalPatientMale'.default.ControllerClass = y; class'xMiddleAgedFemale'.default.ControllerClass = y; class'xMiddleAgedMale'.default.ControllerClass = y; class'xMilitaryMale'.default.ControllerClass = y; class'xNurseFemale'.default.ControllerClass = y; class'xPunkFemale'.default.ControllerClass = y; class'xPunkMale'.default.ControllerClass = y; class'xSeniorFemale'.default.ControllerClass = y; class'xSeniorMale'.default.ControllerClass = y; class'xSwatMale'.default.ControllerClass = y; class'xTeenagerFemale'.default.ControllerClass = y; class'xTeenagerMale'.default.ControllerClass = y; class'xYoungAdultFemale'.default.ControllerClass = y; class'xYoungAdultMale'.default.ControllerClass = y; class'VomiterBase'.default.ControllerClass = class'VomiterZombieAIController'; class'VomiterMaleBase'.default.ControllerClass = class'VomiterZombieAIController'; class'VomiterFemaleBase'.default.ControllerClass = class'VomiterZombieAIController'; class'xVomiterDoctorMale'.default.ControllerClass = class'VomiterZombieAIController'; class'xVomiterGoreFemale'.default.ControllerClass = class'VomiterZombieAIController'; class'xVomiterGoreMale'.default.ControllerClass = class'VomiterZombieAIController'; class'xVomiterHoboFemale'.default.ControllerClass = class'VomiterZombieAIController'; class'xVomiterHoboMale'.default.ControllerClass = class'VomiterZombieAIController'; class'xVomiterHospitalPatientMale'.default.ControllerClass = class'VomiterZombieAIController'; class'xVomiterMiddleAgedFemale'.default.ControllerClass = class'VomiterZombieAIController'; class'xVomiterMiddleAgedMale'.default.ControllerClass = class'VomiterZombieAIController'; class'xVomiterMilitaryMale'.default.ControllerClass = class'VomiterZombieAIController'; class'xVomiterNurseFemale'.default.ControllerClass = class'VomiterZombieAIController'; class'xVomiterPunkFemale'.default.ControllerClass = class'VomiterZombieAIController'; class'xVomiterPunkMale'.default.ControllerClass = class'VomiterZombieAIController'; class'xVomiterSeniorFemale'.default.ControllerClass = class'VomiterZombieAIController'; class'xVomiterSeniorMale'.default.ControllerClass = class'VomiterZombieAIController'; class'xVomiterSwatMale'.default.ControllerClass = class'VomiterZombieAIController'; class'xVomiterTeenagerFemale'.default.ControllerClass = class'VomiterZombieAIController'; class'xVomiterTeenagerMale'.default.ControllerClass = class'VomiterZombieAIController'; class'xVomiterYoungAdultFemale'.default.ControllerClass = class'VomiterZombieAIController'; class'xVomiterYoungAdultMale'.default.ControllerClass = class'VomiterZombieAIController'; class'BursterBase'.default.ControllerClass = class'BursterZombieAIController'; class'BursterMaleBase'.default.ControllerClass = class'BursterZombieAIController'; class'BursterFemaleBase'.default.ControllerClass = class'BursterZombieAIController'; class'xBursterDoctorMale'.default.ControllerClass = class'BursterZombieAIController'; // class'xBursterGoreFemale'.default.ControllerClass = class'BursterZombieAIController'; // we didn't get one of these? class'xBursterGoreMale'.default.ControllerClass = class'BursterZombieAIController'; class'xBursterHoboFemale'.default.ControllerClass = class'BursterZombieAIController'; class'xBursterHoboMale'.default.ControllerClass = class'BursterZombieAIController'; class'xBursterHospitalPatientMale'.default.ControllerClass = class'BursterZombieAIController'; class'xBursterMiddleAgedFemale'.default.ControllerClass = class'BursterZombieAIController'; class'xBursterMiddleAgedMale'.default.ControllerClass = class'BursterZombieAIController'; class'xBursterMilitaryMale'.default.ControllerClass = class'BursterZombieAIController'; class'xBursterNurseFemale'.default.ControllerClass = class'BursterZombieAIController'; class'xBursterPunkFemale'.default.ControllerClass = class'BursterZombieAIController'; class'xBursterPunkMale'.default.ControllerClass = class'BursterZombieAIController'; class'xBursterSeniorFemale'.default.ControllerClass = class'BursterZombieAIController'; class'xBursterSeniorMale'.default.ControllerClass = class'BursterZombieAIController'; class'xBursterSwatMale'.default.ControllerClass = class'BursterZombieAIController'; class'xBursterTeenagerFemale'.default.ControllerClass = class'BursterZombieAIController'; class'xBursterTeenagerMale'.default.ControllerClass = class'BursterZombieAIController'; class'xBursterYoungAdultFemale'.default.ControllerClass = class'BursterZombieAIController'; class'xBursterYoungAdultMale'.default.ControllerClass = class'BursterZombieAIController'; class'ScuttlerBase'.default.ControllerClass = class'NoChargeZombieController'; class'ScuttlerMaleBase'.default.ControllerClass = class'NoChargeZombieController'; class'ScuttlerFemaleBase'.default.ControllerClass = class'NoChargeZombieController'; class'xScuttlerDoctorMale'.default.ControllerClass = class'NoChargeZombieController'; class'xScuttlerGoreFemale'.default.ControllerClass = class'NoChargeZombieController'; class'xScuttlerGoreMale'.default.ControllerClass = class'NoChargeZombieController'; //class'xScuttlerHoboFemale'.default.ControllerClass = class'NoChargeZombieController'; class'xScuttlerHoboMale'.default.ControllerClass = class'NoChargeZombieController'; class'xScuttlerHospitalPatientMale'.default.ControllerClass = class'NoChargeZombieController'; class'xScuttlerMiddleAgedFemale'.default.ControllerClass = class'NoChargeZombieController'; class'xScuttlerMiddleAgedMale'.default.ControllerClass = class'NoChargeZombieController'; class'xScuttlerMilitaryMale'.default.ControllerClass = class'NoChargeZombieController'; class'xScuttlerNurseFemale'.default.ControllerClass = class'NoChargeZombieController'; class'xScuttlerPunkFemale'.default.ControllerClass = class'NoChargeZombieController'; class'xScuttlerPunkMale'.default.ControllerClass = class'NoChargeZombieController'; class'xScuttlerSeniorFemale'.default.ControllerClass = class'NoChargeZombieController'; class'xScuttlerSeniorMale'.default.ControllerClass = class'NoChargeZombieController'; class'xScuttlerSwatMale'.default.ControllerClass = class'NoChargeZombieController'; class'xScuttlerTeenagerFemale'.default.ControllerClass = class'NoChargeZombieController'; class'xScuttlerTeenagerMale'.default.ControllerClass = class'NoChargeZombieController'; class'xScuttlerYoungAdultFemale'.default.ControllerClass = class'NoChargeZombieController'; class'xScuttlerYoungAdultMale'.default.ControllerClass = class'NoChargeZombieController'; class'HeavyMeleeBase'.default.ControllerClass = class'NoChargeZombieController'; class'HeavyMeleeMaleBase'.default.ControllerClass = class'NoChargeZombieController'; class'HeavyMeleeFemaleBase'.default.ControllerClass = class'NoChargeZombieController'; class'xMeleeHeavyDoctorMale'.default.ControllerClass = class'NoChargeZombieController'; class'xMeleeHeavyGoreFemale'.default.ControllerClass = class'NoChargeZombieController'; class'xMeleeHeavyGoreMale'.default.ControllerClass = class'NoChargeZombieController'; class'xMeleeHeavyHoboFemale'.default.ControllerClass = class'NoChargeZombieController'; class'xMeleeHeavyHoboMale'.default.ControllerClass = class'NoChargeZombieController'; class'xMeleeHeavyHospitalPatientMale'.default.ControllerClass = class'NoChargeZombieController'; class'xMeleeHeavyMiddleAgedFemale'.default.ControllerClass = class'NoChargeZombieController'; class'xMeleeHeavyMiddleAgedMale'.default.ControllerClass = class'NoChargeZombieController'; class'xMeleeHeavyMilitaryMale'.default.ControllerClass = class'NoChargeZombieController'; class'xMeleeHeavyNurseFemale'.default.ControllerClass = class'NoChargeZombieController'; class'xMeleeHeavyPunkFemale'.default.ControllerClass = class'NoChargeZombieController'; class'xMeleeHeavyPunkMale'.default.ControllerClass = class'NoChargeZombieController'; class'xMeleeHeavySeniorFemale'.default.ControllerClass = class'NoChargeZombieController'; class'xMeleeHeavySeniorMale'.default.ControllerClass = class'NoChargeZombieController'; class'xMeleeHeavySwatMale'.default.ControllerClass = class'NoChargeZombieController'; class'xMeleeHeavyTeenagerFemale'.default.ControllerClass = class'NoChargeZombieController'; class'xMeleeHeavyTeenagerMale'.default.ControllerClass = class'NoChargeZombieController'; class'xMeleeHeavyYoungAdultFemale'.default.ControllerClass = class'NoChargeZombieController'; class'xMeleeHeavyYoungAdultMale'.default.ControllerClass = class'NoChargeZombieController'; DynamicLoadObject(BasePawnClass, class'class'); do { GetNextIntDesc(BasePawnClass, x, entry, desc); //log(self@"GetNextIntDesc"@BasePawnClass@"="@entry@"desc="@desc); if(entry == "") break; pclass = class(DynamicLoadObject(entry, class'Class')); PawnList[x] = pclass; ++x; } until(entry == ""); if(PawnList.Length < 1) { PawnList[0] = class'XDOTZCharacters.JackSlade'; PawnList[1] = class'XDOTZCharacters.PlayerOtis'; } Debug("PostBeginPlay()"); if(ZombieKillMessages.Length == 0) { ZombieKillMessages[0]="%o is done, like dinner... zombie dinner"; ZombieKillMessages[1]="Zombies are eating %o's brain"; ZombieKillMessages[2]="%o has become one with the zombies"; ZombieKillMessages[3]="%o bites the dust"; ZombieKillMessages[4]="%o becomes fettucine al dead-o"; ZombieKillMessages[5]="%o takes a nap at Zombie Inn"; ZombieKillMessages[6]="%o is in a really grave situation"; ZombieKillMessages[7]="%o assumes room temperature"; ZombieKillMessages[8]="%o now shops at Corpses-R-Us"; ZombieKillMessages[9]="%o's liver has been donated"; ZombieKillMessages[10]="Zombies eviscerated %o"; ZombieKillMessages[11]="%o stops at the No Brain Hotel"; ZombieKillMessages[12]="Please kill %o .. oops, too late."; ZombieKillMessages[13]="What does %o want on their tombstone?"; } SaveConfig(); // If the INI says to use level defaults, get them from the level. // If the INI specifies limits, use them // You can NOT use limits and bModerateWaveSizes together. // bScaleDifficulty will affect any settings no matter where they come from //get global bot management from the LD configed level info mpli = WaveMultiPlayerLevelInfo(Level.GameSpecificLevelInfo); if(mpli != None) { if(InitialWaveSize == 0) InitialWaveSize = mpli.InitialWaveSize; if(WaveSizeIncrement == 0) WaveSizeIncrement = mpli.WaveSizeIncrement; } if(bModerateWaveSizes == True) { if(InitialWaveSize < 10) InitialWaveSize = 10 + Rand(10); if(WaveSizeIncrement < 3) WaveSizeIncrement = Rand(5) + 1; if(InitialWaveSize > 20) InitialWaveSize = 20; if(WaveSizeIncrement > 5) WaveSizeIncrement = 5; } if(bScaleDifficulty == True) { switch(iEnemyDiffLevel) { case 0: // Easy Difficulty = 50% more enemies! InitialWaveSize += (InitialWaveSize / 2); WaveSizeIncrement += (WaveSizeIncrement / 2); break; case 1: // Normal break; case 2: // Difficult = 50% fewer enemies! InitialWaveSize = InitialWaveSize / 2; WaveSizeIncrement = WaveSizeIncrement / 2; break; } } Debug("InitialWaveSize="$InitialWaveSize$")"); Debug("WaveSizeIncrement="$WaveSizeIncrement$")"); // we can specify level specific limits in code, but who wants to do THAT? //if( string(Outer) ~= "INZombieTownOne") // InitialWaveSize=1000; WaveSize = InitialWaveSize; // There will always be at least 2 waves, since FirstWave can't be FinalWave. bFirstWave = true; FinalWave = false; SetMultiTimer(WAVE_TIMER, WAVEDELAY * 3, false); //super.InitGame(options, error); GoalScore = -1; // Apply a sanity filter to MaxWaveEnd. Who wants a 1 zombie wave? if(MaxWaveEnd < 10 && MaxWaveEnd > 0) MaxWaveEnd = 20; // if MaxRespawns is specified, and Delay is not set, give it a 5 second delay. if(MaxRespawns != 0) { if(RespawnDelay == 0) RespawnDelay = 5; SetMultiTimer(RESPAWN_TIMER, RespawnDelay, true); } if(Level.NetMode == NM_DedicatedServer) SetMultiTimer(2342, 10, false); class'LargeFire'.default.ChildFireType=class'BINPawnFire'; class'MediumFire'.default.ChildFireType=class'BINPawnFire'; class'MedMolotovFire'.default.ChildFireType=class'BINPawnFire'; class'PawnFire'.default.ChildFireType=class'BINPawnFire'; class'SmallFire'.default.ChildFireType=class'BINPawnFire'; class'SmallMolotovFire'.default.ChildFireType=class'BINPawnFire'; } function InitGameReplicationInfo(){ super.InitGameReplicationInfo(); GameReplicationInfo.bAllowedToSwitchTeams =false; // so Switch Teams doesn't come up in menu GameReplicationInfo.MatchID = ID_INV; } function byte PickTeam(byte Current, Controller C){ return 0; } function RestartPlayer( Controller c ) { Debug("RestartPlayer("$c$")"); /*if(Level.NetMode == NM_StandAlone) { StartStandalonePlayer(c); return; }*/ if(PlayerController(c) == None || PlayerController(C).CanRestartPlayer()) { if(!ZPlayerController(c).bSelectedPawn) c.SetPawnClass(DefaultPlayerClassName, DefaultPlayerClassName); super.RestartPlayer(c); if(c.Pawn == None) { c.SetPawnClass(DefaultPlayerClassName, DefaultPlayerClassName); super.RestartPlayer(c); } } } function StartStandalonePlayer(Controller aPlayer) { local NavigationPoint startSpot; local int TeamNum; local class DefaultPlayerClass; if( bRestartLevel && Level.NetMode!=NM_DedicatedServer && Level.NetMode!=NM_ListenServer ) return; if ( (aPlayer.PlayerReplicationInfo == None) || (aPlayer.PlayerReplicationInfo.Team == None) ) TeamNum = 255; else TeamNum = aPlayer.PlayerReplicationInfo.Team.TeamIndex; startSpot = FindPlayerStart(aPlayer, TeamNum); if( startSpot == None ) { log(" Player start not found!!!"); return; } if (aPlayer.PreviousPawnClass!=None && aPlayer.PawnClass != aPlayer.PreviousPawnClass) BaseMutator.PlayerChangedClass(aPlayer); //if ( aPlayer.PawnClass != None ) // aPlayer.Pawn = Spawn(aPlayer.PawnClass,,,StartSpot.Location,StartSpot.Rotation); if( aPlayer.Pawn==None ) { DefaultPlayerClass = GetDefaultPlayerClass(aPlayer); aPlayer.Pawn = Spawn(DefaultPlayerClass,,,StartSpot.Location,StartSpot.Rotation); } if ( aPlayer.Pawn == None ) { log("Couldn't spawn player of type "$aPlayer.PawnClass$" at "$StartSpot); aPlayer.GotoState('Dead'); return; } aPlayer.Pawn.Anchor = startSpot; aPlayer.Pawn.LastStartSpot = PlayerStart(startSpot); aPlayer.Pawn.LastStartTime = Level.TimeSeconds; aPlayer.PreviousPawnClass = aPlayer.Pawn.Class; aPlayer.Possess(aPlayer.Pawn); aPlayer.PawnClass = aPlayer.Pawn.Class; aPlayer.Pawn.PlayTeleportEffect(true, true); aPlayer.ClientSetRotation(aPlayer.Pawn.Rotation); AddDefaultInventory(aPlayer.Pawn); TriggerEvent( StartSpot.Event, StartSpot, aPlayer.Pawn); GiveDefaultInventory(aPlayer.Pawn); AdvancedPlayerController(aPlayer).SetCustomTextures(); } function GiveDefaultInventory(Pawn P) { if(P == None) return; super.GiveDefaultInventory(P); } function clog(string x, optional name tag) { if(ConnectionLog == None) { ConnectionLog = spawn(class'FileLog'); } //if(Tag == None) Tag = ''; //Tag = FullTimeDate() @ Tag; if(ConnectionLog != None) { ConnectionLog.OpenLog("connection"); ConnectionLog.Logf(FullTimeDate()$":"@x); ConnectionLog.CloseLog(); } else { log(x, tag); } } function String FullTimeDate() // Date/Time in MYSQL format { return ""$Level.Year$"-"$Level.Month$"-"$Level.Day$" "$Level.Hour$":"$Level.Minute$":"$Level.Second; } event PostLogin(PlayerController NewPlayer) { local ZPlayerController zpc; local AdvancedHud playerhud; local string PlayerName; log(self@"POSTLOGIN"@NewPlayer); zpc = ZPlayerController(NewPlayer); if(zpc == None) { Warn(self@"PostLogin: No Controller given"); return; } playerhud = AdvancedHUD(NewPlayer.myHud); if(playerhud != None) { // TODO: This isn't even possible in a multiplayer game, is it? playerhud.register(Self); } log(self@"GAMEINFO POSTLOGIN"@NewPlayer); super(GameInfo).PostLogin(NewPlayer); if(NewPlayer.PlayerReplicationInfo != None) { NewPlayer.PlayerReplicationInfo.bOnlySpectator = False; NewPlayer.PlayerReplicationInfo.bIsSpectator = True; PlayerName = NewPlayer.PlayerReplicationInfo.GamerTag; if(PlayerName != "") { NewPlayer.SetName(PlayerName); Broadcast(NewPlayer, "***"@PlayerName@"has joined", 'Login'); clog(PlayerName@"logged in from"@NewPlayer.GetPlayerNetworkAddress()); } else { clog("No name logged in from"@NewPlayer.GetPlayerNetworkAddress()); } } zpc.JoinedTime= Level.TimeSeconds; } event PlayerController Login(string Portal, string Options, out string Error) { local PlayerController NewPlayer; local ZPlayerController ZPC; local string InOpt; local int iHead, iBody; //NewPlayer = super(GameInfo).Login(Portal, Options, Error); local NavigationPoint StartSpot; local Pawn TestPawn; local string InName, InAdminName, InPassword, InChecksum, InClass, InCharacter; local byte InTeam; // Trin 3/3/2008 // Removed bAdmin to clean up compile message for unreferenced local variable. //local bool bSpectator, bAdmin; local bool bSpectator; local class MySecurityClass; log(self@"LOGIN"@Portal@Options@Error); bSpectator = HasOption(Options, "SpectatorOnly"); BaseMutator.ModifyLogin(Portal, Options); // Get URL options. InName = Left(ParseOption ( Options, "Name"), 20); InTeam = GetIntOption( Options, "Team", 255 ); // default to "no team" InAdminName= ParseOption ( Options, "AdminName"); InPassword = ParseOption ( Options, "Password" ); InChecksum = ParseOption ( Options, "Checksum" ); log( "Login:" @ InName ); //== patched by JL foreach DynamicActors(class'Pawn', TestPawn ){ if ( (TestPawn!=None) && (PlayerController(TestPawn.Controller)!=None) && (PlayerController(TestPawn.Controller).Player==None) && (TestPawn.Health > 0) && (TestPawn.OwnerName~=InName) ){ TestPawn.SetRotation(TestPawn.Controller.Rotation); TestPawn.bInitializeAnimation = false; // FIXME - temporary workaround forlack of meshinstance serialization TestPawn.PlayWaiting(); bWaitingToStartMatch = true; //CTL - save/load game fix: added bDelayedStart=false; //CTL - save/load game fix: added return PlayerController(TestPawn.Controller); } } //== end patched by JL // Pick a team (if need teams) InTeam = PickTeam(InTeam,None); // Find a start spot. StartSpot = FindPlayerStart( None, InTeam, Portal ); if( StartSpot == None ) { Error = GameMessageClass.Default.FailedPlaceMessage; return None; } if ( PlayerControllerClass == None ) PlayerControllerClass = class(DynamicLoadObject(PlayerControllerClassName, class'Class')); NewPlayer = spawn(PlayerControllerClass,,,StartSpot.Location,StartSpot.Rotation); // Handle spawn failure. if( NewPlayer == None ) { log("Couldn't spawn player controller of class "$PlayerControllerClass); Error = GameMessageClass.Default.FailedSpawnMessage; return None; } NewPlayer.StartSpot = StartSpot; // Init player's replication info NewPlayer.GameReplicationInfo = GameReplicationInfo; NewPlayer.GotoState('Spectating'); // Apply security to this controller MySecurityClass=class(DynamicLoadObject(SecurityClass,class'class')); if (MySecurityClass!=None) { NewPlayer.PlayerSecurity = spawn(MySecurityClass,NewPlayer); if (NewPlayer.PlayerSecurity==None) log("Could not spawn security for player "$NewPlayer,'Security'); } else log("Unknown security class ["$SecurityClass$"] -- System is no secure.",'Security'); zpc = ZPlayerController(NewPlayer); zpc.login(InPassword); if(!zpc.PlayerReplicationInfo.bAdmin && AtCapacity(bSpectator)) { Error=GameMessageClass.Default.MaxedOutMessage; return none; } // If admin, force spectate mode if the server already full of reg. players if ( zpc.PlayerReplicationInfo.bAdmin && AtCapacity(false)) bSpectator = true; // Init player's name if( InName=="" ) InName=DefaultPlayerName; if( Level.NetMode!=NM_Standalone || NewPlayer.PlayerReplicationInfo.PlayerName==DefaultPlayerName ) ChangeName( NewPlayer, InName, false ); if ( bSpectator || NewPlayer.PlayerReplicationInfo.bOnlySpectator ) { NewPlayer.PlayerReplicationInfo.bOnlySpectator = true; NewPlayer.PlayerReplicationInfo.bIsSpectator = true; NewPlayer.PlayerReplicationInfo.bOutOfLives = true; NumSpectators++; return NewPlayer; } // Change player's team. if ( !ChangeTeam(newPlayer, InTeam, false) ) { Error = GameMessageClass.Default.FailedTeamMessage; return None; } newPlayer.StartSpot = StartSpot; // Set the player's ID. NewPlayer.PlayerReplicationInfo.PlayerID = CurrentID++; InClass = ParseOption( Options, "Class" ); if (InClass == "") InClass = DefaultPlayerClassName; InCharacter = ParseOption(Options, "Character"); //NewPlayer.SetPawnClass(InClass, InCharacter); NumPlayers++; bWelcomePending = true; // if delayed start, don't give a pawn to the player yet // Normal for multiplayer games if ( bDelayedStart ) { // Trin 3/3/2008 // Force the initial state to be PlayerCharacterSelect. NewPlayer.GotoState('PlayerCharacterSelect'); //NewPlayer.GotoState('PlayerWaiting'); } ZPC = ZPlayerController(NewPlayer); InOpt = ParseOption(Options, "Head"); iHead = int(InOpt); InOpt = ParseOption(Options, "Body"); iBody = int(InOpt); zpc.iHeadTexture = iHead; zpc.iBodyTexture = iBody; return ZPC; } /*event PlayerController Login(string Portal, string Options, out string Error) { local int iHead, iBody; local string InOpt; local PlayerController NewPlayer; local ZPLayerController zpc; NewPlayer = super(GameInfo).Login(Portal, Options, Error); zpc = ZPlayerController(NewPlayer); InOpt = ParseOption(Options, "Password"); if(InOpt != "" && zpc != None) zpc.login(InOpt); if (NumPlayers + 1 > MaxPlayers && zpc.AdminManager == None){ return none; } //Customization (HEAD) InOpt = ParseOption( Options, "Head"); if( InOpt != "" ){ iHead = int(InOpt); } //Customization (BODY) InOpt = ParseOption( Options, "Body"); if( InOpt != "" ){ iBody = int(InOpt); } AdvancedPlayerController(NewPlayer).iHeadTexture= iHead; AdvancedPlayerController(NewPlayer).iBodyTexture= iBody; return NewPlayer; }*/ function StartWave(){ local Controller P; Debug("StartWave()"); bNameCheat = true; if(FinalWave == true) { EndGame(none, "Victory!"); } WaveSize = InitialWaveSize + (WaveSizeIncrement * NumWaves); if(WaveSize < 10) WaveSize = 10; if(MaxWaveEnd > 0 && WaveSize > MaxWaveEnd) { FinalWave = true; GameReplicationInfo.MatchID = 664; } else { FinalWave = false; } WaveRemaining = WaveSize; NumWaves++; if (!bGameEnded){ GlobalAnnouncement(NewWave); } //reset players for ( P = Level.ControllerList; P!=None; P=P.nextController ) { if ( P.IsA('PlayerController') ) { if ( bGameEnded ) return; //dead players now get respawned if (P.Pawn == none || P.Pawn.Health <= 0){ P.PlayerReplicationInfo.bOnlySpectator = false; //RestartPlayer(P); } } } TriggerEvent('NEW_WAVE',self,none); GameReplicationInfo.Teams[0].Score +=1; bFirstWave = false; StartRush(); } function WaveComplete(){ Debug("WaveComplete()"); //Level.ConsoleCommand("OBJ GARBAGE"); if(FinalWave) { GameReplicationInfo.MatchID = 666; } SetMultiTimer(WAVE_TIMER, 12, false); SetMultiTimer(ANNOUNCE_DELAY, 2, false); } function EndGameAnnouncement(PlayerReplicationInfo Winner){ local Controller P; Debug("EndGameAnnouncement("$Winner$")"); for ( P = Level.ControllerList; P!=None; P=P.nextController ) { if ( P.IsA('PlayerController') ){ P.PlayerReplicationInfo.bOnlySpectator = false; } } //use this opportunity to shut off other announcements SetMultiTimer(WAVE_TIMER, 0, false); SetMultiTimer(ANNOUNCE_DELAY, 0, false); GlobalAnnouncement(GameOver); GameReplicationInfo.bMatchHasBegun = false; Nuke_All_Pawns(); } function bool TooManyBots(Controller botToRemove){ //if(++AntiLagCounter % 3 != 0) return true; //return true; return True; if(WaveRemaining > 0) { if(bRushAnnounced) return false; // allow them to come as fast as is possible for the last 10% .. :D if(MaxInPlay > 0 && WaveInPlay >= MaxInPlay) return true; if(InitialInPlayOverride < 0) return false; //if(WaveInPlay >= WaveSize) return true; return super.TooManyBots(botToRemove); } return true; } function NotifyAddBot(){ WaveRemaining -=1; WaveInPlay++; super.NotifyaddBot(); } function StartRush() { WaveRemaining = WaveRemaining + WaveInPlay + (NumPlayers * 2); log(self@"RUSH!!!!!!"); GlobalAnnouncement(RushAnnouncements); bRushAnnounced = True; } function NotifyRemoveBot(){ WaveInPlay--; log(self@"NotifyRemoveBot:"@WaveRemaining@WaveSize@WaveInPlay); if(!bRushAnnounced && WaveSize > 5 && (WaveRemaining+WaveInPlay) < (WaveSize * 0.35)) { StartRush(); } //log("NotifyRemoveBot: MinWaveSize="$MinWaveSize$", WaveInPlay="$WaveInPlay$", WaveRemaining="$WaveRemaining); if (WaveRemaining <= 0 && WaveInPlay <=0){ bRushAnnounced = False; WaveComplete(); } if(MinWaveSize > 0 && WaveRemaining <= MinWaveSize && WaveInPlay <= MinWaveSize && finalwave == false) { SetMultiTimer(WAVE_TIMER, 8, false); } super.NotifyRemoveBot(); } function MultiTimer(int SlotID){ local MapList ML; local string CurrentMap; local string StartMap; //Debug("MultiTimer("$slotID$")"); if(bGameEnded && slotID != RESTART_TIMER) { log("Calling MultiTimer while game is ended!!!! Slot="@SlotID); return; } switch(SlotID){ case 2342: //log("*** MAP CHECK"); ML = Level.Game.GetMapList(Level.Game.MapListType); CurrentMap = GetURLMap(); StartMap = ML.Maps[ML.MapNum]; //log("*** CurrentMap="@CurrentMap); //log("*** StartMap="@StartMap); if(!MapMatches(StartMap,CurrentMap)) { Level.ServerTravel(StartMap, false); return; } break; case RESPAWN_TIMER: AllowRessurection(); break; case WAVE_TIMER: if(NumPlayers < 1) self.SetMultiTimer(WAVE_TIMER, 15, False); else StartWave(); break; case ANNOUNCE_DELAY: if (GameReplicationInfo.bMatchHasBegun == true){ GlobalAnnouncement(WaveCompleted); } break; } super.MultiTimer(SlotID); } function AllowRessurection() { local Controller P; for ( P = Level.ControllerList; P!=None; P=P.nextController ) { if ( P.IsA('PlayerController') ) { if ( bGameEnded ) return; //dead players now get respawned if (P.Pawn == none || P.Pawn.Health <= 0){ if(P.PlayerReplicationInfo.Deaths > MaxRespawns) P.PlayerReplicationInfo.bOnlySpectator = true; else P.PlayerReplicationInfo.bOnlySpectator = false; } } } } function Killed(Controller Killer, Controller Killed, Pawn KilledPawn, class damageType) { local Controller P, LastAliveController; local string KilledName, KillerName, dmsg; local int x, AliveCounter; local bool bAllDead; if(!GameReplicationInfo.bMatchHasBegun) return; if(Killed == None) // if no controller, assume it's a monster pawn, so we don't need to do anything with it here return; if(Killed.PlayerReplicationInfo != None) // force respawnable controllers (players) into spectate mode Killed.PlayerReplicationInfo.bIsSpectator = true; // log score, do some other misc. bs super(GameInfo).Killed(Killer, Killed, KilledPawn, damageType); if(Killer != None) { // if someone gets credit for this kill, see if this credit ends the game.. should this really be called in Invasion?? CheckScore(Killer.PlayerReplicationInfo); if(Killer.PlayerReplicationInfo != None) KillerName = Killer.PlayerReplicationInfo.Gamertag; } if(Killed.bIsPlayer) { KilledName = Killed.PlayerReplicationInfo.GamerTag; if(Killer != None && DOTZAIController(Killer) != None) { x = Rand(ZombieKillMessages.Length); dmsg = class'GameInfo'.static.ParseKillMessage(KillerName, KilledName, ZombieKillMessages[x]); } else { dmsg = DeathMessageClass.static.GetString(int(Killer == Killed), Killer.PlayerReplicationInfo, Killed.PlayerReplicationInfo, damageType); } if(dmsg != "") Broadcast(Killer, dmsg, 'Killed'); if(MaxRespawns > -1) { Killed.PlayerReplicationInfo.bOnlySpectator = true; } bAllDead = True; for(P = Level.ControllerList; P != None; P = P.NextController) { if(P.bIsPlayer) { if(P.Pawn != None && !P.IsA('ZombiePawnBase') && P.Pawn.Health > 0) { if(PlayerController(P) != None) AliveCounter++; // only announce to non-bot players LastAliveController = P; bAllDead = false; } } } if(AliveCounter == 1) { PlayerController(LastAliveController).PlayAnnouncement(LastWarning[Rand(LastWarning.Length)], 0, False); } if(bAllDead && !bDontEndLevel) { EndGame(None, "Everyone is dead"); } } else { SetMultiTimer(WAVE_TIMER, 120, false); // 2 minutes after last kill, start a new wave, just in case we didn't count right? NotifyRemoveBot(); } } function ScoreKill(Controller Killer, Controller Other) { Debug("ScoreKill("$Killer@Other$")"); if( killer == none || killer == other) { // suicide is the only solution if(other != none) { if(other.playerreplicationinfo != none) { other.playerreplicationinfo.score -= 1; } ScoreEvent(Other.PlayerReplicationInfo, -1, "self_frag"); } } else if(killer != none && Other != none && killer.PlayerReplicationInfo != none) { if(!Other.IsA('PlayerController')) { if(Killer.PlayerReplicationInfo != none) { Killer.PlayerReplicationInfo.Score += 1; Killer.PlayerReplicationInfo.Kills++; ScoreEvent(Killer.PlayerReplicationInfo, 1, "frag"); } } } if(GameRulesModifiers != none) { GameRulesModifiers.ScoreKill(Killer, Other); } if( (killer != none) || (maxlives > 0) ) { CheckScore(Killer.PlayerReplicationInfo); } } function Logout( Controller Exiting ){ local bool bMessage; local int Index; Debug("Logout("$Exiting$")"); if ( PlayerController(Exiting) != None ){ //Broadcast(Exiting.Pawn, "***"@Exiting.PlayerReplicationInfo.GamerTag@"has left", 'Logout'); if ( PlayerController(Exiting).PlayerReplicationInfo.bOnlySpectator ){ NumPlayers--; } } bMessage = true; if ( PlayerController(Exiting) != None ) { //FIXME_MERGE if ( AccessControl.AdminLogout( PlayerController(Exiting) ) ) // AccessControl.AdminExited( PlayerController(Exiting) ); if ( PlayerController(Exiting).PlayerReplicationInfo.bOnlySpectator ) { //bMessage = false; NumSpectators--; } else { NumPlayers--; } if( Level.NetMode != NM_Standalone ) { for( Index=0; Index damageType, vector HitLocation) { local bool bPrevent; Debug("PreventDeath()"); if(!bAllowTelefrags) { if(damageType == class'DamTypeTelefragged') { bPrevent = True; } } if(!bPrevent) bPrevent = super.PreventDeath(Killed, Killer, damageType, HitLocation); if(bPrevent && PlayerPawnBase(Killed) != None) Killed.SetMultiTimer(26, 0, false); // remove destroy timer set previously in PPB.Died() return bPrevent; } function bool PreventSever(Pawn Killed, Name boneName, int Damage, class damageType) { return super.PreventSever(Killed, boneName, Damage, damageType); } function EndGame(PlayerReplicationInfo Winner, string Reason) { local OpponentFactory tempOP; foreach AllActors(class'OpponentFactory', tempOP){ if(TempOP.TheCreationPolicy != None) tempOP.theCreationPolicy.stop(); tempOP.GotoState('Dormant'); } GameReplicationInfo.bMatchHasBegun = false; super(AdvancedMPGameBase).EndGame(Winner,Reason); } // adding this function caused the headless zombie problem to go away. WTF? function int ReduceDamage(int Damage, pawn Injured, pawn InstigatedBy, vector HitLocation, out vector Momentum, class DamageType) { Debug("ReduceDamage("$Damage@Injured@InstigatedBy$")"); return super.ReduceDamage(Damage, Injured, InstigatedBy, HitLocation, Momentum, DamageType); } function ChangeName(Controller Other, coerce string S, bool bNameChange) { Other.PlayerReplicationInfo.Gamertag = s; super.ChangeName(Other, S, bNameChange); } function KillEvent(string Killtype, PlayerReplicationInfo Killer, PlayerReplicationInfo Victim, class Damage) { super.KillEvent(Killtype, Killer, Victim, Damage); } function NotifyKilled(Controller Killer, Controller Killed, Pawn KilledPawn) { super.NotifyKilled(Killer, Killed, KilledPawn); } function ProcessServerTravel(string URL, bool bItems) { super.ProcessServerTravel(URL, bItems); } function Nuke_All_Pawns() { local Pawn Temp; foreach AllActors(class'Pawn', Temp) { if(Temp.Controller != None) Temp.Controller.UnPossess(); Temp.Destroy(); } Level.ObjectPool.Shrink(); //ConsoleCommand("obj garbage"); } function GlobalAnnouncement(array Announcements){ local sound Announcement; local Controller P; if (Announcements.length == 0){ return; } Announcement = Announcements[Rand(Announcements.Length)]; for ( P = Level.ControllerList; P!=None; P=P.nextController ) { if ( P.IsA('PlayerController')){ PlayerController(P).PlayAnnouncement(Announcement,0,false); } } } function TeamAnnounce(int TeamNumber, array Announcements){ local sound Announcement; local Controller P; if(Announcements.Length == 0) return; // TODO: This assumes that we actually do have a Team to have a TeamIndex... Announcement = Announcements[Rand(Announcements.Length)]; for(P = Level.ControllerList; P != None; P = P.NextController) { if(PlayerController(P) != None && P.PlayerReplicationInfo.Team.TeamIndex == TeamNumber) { PlayerController(P).PlayAnnouncement(Announcement, 0, False); } } } // just fix some accessed nones in some bullshit that level designers never use since // we really don't know why to use it function PreLoad(){ local int i; // local class temp; //Preload stuff that the dumb and unattractive LD's have specified if(GameSpecificLevelInfo(Level.GameSpecificLevelInfo) != None) { for(i=0;i zombie; z = SelectZombie(); zombie = class(DynamicLoadObject(z, class'class', True)); log(self@"SpawnZombie"@z@zombie@loc); return Spawn(zombie, , , loc); } function Tick(float delta) { super.Tick(delta); if(bRushAnnounced && WaveRemaining > 0) { if(MaxInPlay != 0 && WaveInPlay < MaxInPlay) CreateZombie(); } } kx// Copyright (C) 2005 Brainbox Games. All Rights Reserved. // September 27, 2005 //----------------------------------------------------------- // //----------------------------------------------------------- class BladeDMHUD extends BladeINHUD; var localized string PressFireTxt; //personal stats var array TeamKillsMat; var array TeamRankMat; var Material KillsMat; var Material RankMat; //team crap var array TeamScoreMat; //=========================================================================== // Editable properties //=========================================================================== // HUD mockup //=========================================================================== // Internal data //=========================================================================== //=========================================================================== // Hud Hooks //=========================================================================== function drawToHUD( Canvas c, float scaleX, float scaleY ) { local float FontDX, FontDY, CX, CY; local int LocalStat, x, itmp, Alpha; local array Tmp; //this sets all stats used below super(DOTZMPHudBase).DrawToHUD(c,ScaleX,ScaleY); LocalStat = StatLocation; if (DOTZPlayerControllerBase(Player).PlayerReplicationInfo.Team != none) DOTZPlayerControllerBase(Player).RefreshPRI(2); else DOTZPlayerControllerBase(Player).RefreshPRI(1); //Draw Rank if (Player.PlayerReplicationInfo.Team != none){ C.SetPos(LeftMargin,StatLocation); C.DrawTile(TeamRankMat[TeamNum],128*scaleX,64*scaleY,0,0,128,64); C.SetPos(LeftMarginPlus,StatLocation + (5*scaleY)); C.DrawText(string(DOTZPlayerControllerBase(Player).pris[DOTZPlayerControllerBase(Player).myPRIIndex].Ranking)); StatLocation += StatSpace; } else { C.SetPos(LeftMargin,StatLocation); C.DrawTile(RankMat,128*scaleX,64*scaleY,0,0,128,64); C.SetPos(LeftMarginPlus,StatLocation + (5*scaleY)); C.DrawText(string(DOTZPlayerControllerBase(Player).pris[DOTZPlayerControllerBase(Player).myPRIIndex].Ranking)); StatLocation += StatSpace; } //Draw Kills if (Player.PlayerReplicationInfo.Team != none){ C.SetPos(LeftMargin,StatLocation); C.DrawTile(TeamKillsMat[TeamNum],128*scaleX,64*scaleY,0,0,128,64); C.SetPos(LeftMarginPlus,StatLocation + (5*scaleY)); C.DrawText(string(DOTZPlayerControllerBase(Player).pris[DOTZPlayerControllerBase(Player).myPRIIndex].Score)); StatLocation += StatSpace; } else { C.SetPos(LeftMargin,StatLocation); C.DrawTile(KillsMat,128*scaleX,64*scaleY,0,0,128,64); C.SetPos(LeftMarginPlus, StatLocation + (5*scaleY)); C.DrawText(string(DOTZPlayerControllerBase(Player).pris[DOTZPlayerControllerBase(Player).myPRIIndex].Score)); StatLocation += StatSpace; } //Team statistics if (Player.PlayerReplicationInfo.Team != none){ //your team C.SetPos(TeamLeftMargin,LocalStat); C.DrawTile(TeamScoreMat[TeamNum],64*scaleX,128*scaleY,0,0,64,128); //C.SetPos(TeamLeftMargin+ (15 * scaleX),LocalStat+(65*scaleY)); //C.DrawText(string(int(Player.GameReplicationInfo.Teams[TeamNum].Score))); C.DrawTextJustified( string(int(Player.GameReplicationInfo.Teams[TeamNum].Score)), 1, TeamLeftMargin, LocalStat + (65*scaleY), TeamLeftMargin + 64*scaleX, LocalStat + (65*scaleY) + 32*scaleY ); //enemy team C.SetPos(TeamLeftMargin + (70 * scaleX),LocalStat); C.DrawTile(TeamScoreMat[EnemyTeamNum],64*scaleX,128*scaleY,0,0,64,128); //C.SetPos(TeamLeftMargin + (85 * scaleX), LocalStat+ (65 * scaleY)); //C.DrawText(string(int(Player.GameReplicationInfo.Teams[EnemyTeamNum].Score))); C.DrawTextJustified( string(int(Player.GameReplicationInfo.Teams[EnemyTeamNum].Score)), 1, TeamLeftMargin + (70 * scaleX), LocalStat + (65*scaleY), TeamLeftMargin + (70 * scaleX) + 64*scaleX, LocalStat + (65*scaleY) + 32*scaleY ); } C.SetDrawColor(200, 0, 0, 200); if (Player.PlayerReplicationInfo.bIsSpectator == true){ if (Player.GameReplicationInfo.bMatchHasBegun == true || Level.NetMode == NM_ListenServer ){ C.bCenter = true; c.SetPos( scaleX, 375 * scaleY ); if (Player.PlayerReplicationInfo.bOnlySpectator == false){ 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; } Player.PlayerReplicationInfo.bWelcomed = true; } if(Player.GameReplicationInfo.MatchID == 666) { C.bCenter = true; C.SetPos( scaleX, 200 * scaleY ); C.DrawText(ZombiesDefeatedTxt); C.bCenter = false; } 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; } if(bBadConnectionAlert == true) { C.bCenter = true; DropShadowText(C, scaleX, 800 * scaleY, LagAlertTxt); C.bCenter = false; } /*if(bDisplaySign) { C.SetPos(scaleX, 250 * scaleY); C.SetDrawColor(255,255,255,255); //C.Font = Font'ChatFont'; C.Font = Font'Engine.SmallFont'; MOTD = Player.GameReplicationInfo.MOTDLine1 $ "
" $ Player.GameReplicationInfo.MOTDLine2 $ "
" $ Player.GameReplicationInfo.MOTDLine3 $ "
" $ Player.GameReplicationInfo.MOTDLine4 $ "
"; MOTD = MOTD $ "**** Game Admin: "$Player.GameReplicationInfo.AdminName$" ("$Player.GameReplicationInfo.AdminEmail$")
"; Split2(MOTD, "
", DisplaySign); for(x = 0; x < DisplaySign.length; x++) { C.DrawText(DisplaySign[x]); } C.Font = regfont; }*/ 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'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); } } } //=========================================================================== // default Properties //=========================================================================== cHz M>[IOyc1bVD Ɍ?D ɚD Ɇ Ic?3333D ɚD Ƀ3333D ɚD Ɇ Ic?3333D ɚD Ƀ3333D ɚD Ɇ Ic?333 Ic6>333 Ic6>3 Ic? Ic6Jq33 Ic?33333 Ic? Ic63333 Ic633333333JqJq33333333 .B Ss]Press Fire to SpawnUYTY W S ]Y }]Press Fire to SpawnZ//----------------------------------------------------------- // //----------------------------------------------------------- class BladeDM extends DOTZDeathMatch; var string BasePawnClass; var array > PawnList; function array > GetPawnList() { return PawnList; } event InitGame(String Options, out String Error) { local string InOpt; super.InitGame(Options, Error); TimeLimit = default.TimeLimit; InOpt = ParseOption( Options, "TimeLimit"); if( InOpt != "" ){ TimeLimit = int(InOpt); } if (TimeLimit == 0) { TimeLimit = -1; } } function bool MapMatches(string map, string map2) { local int x, y; x = InStr(map, "?"); if(x > -1) { map = mid(map, 0, x); } y = InStr(map, "?"); if(y > -1) { map2 = mid(map, 0, y); } //log(self@map@map2); if(map ~= map2) return true; return false; } event PostBeginPlay() { local int x; local string entry, desc; local class pclass; DynamicLoadObject(BasePawnClass, class'class'); do { GetNextIntDesc(BasePawnClass, x, entry, desc); //log(self@"GetNextIntDesc"@BasePawnClass@"="@entry@"desc="@desc); if(entry == "") break; pclass = class(DynamicLoadObject(entry, class'Class')); PawnList[x] = pclass; ++x; } until(entry == ""); if(PawnList.Length < 1) { PawnList[0] = class'XDOTZCharacters.JackSlade'; PawnList[1] = class'XDOTZCharacters.PlayerOtis'; } super.PostBeginPlay(); if(Level.NetMode == NM_DedicatedServer) SetMultiTimer(2342, 0.5, false); } function MultiTimer(int SlotID){ local MapList ML; local string CurrentMap; local string StartMap; switch(SlotID){ case 2342: //log("*** MAP CHECK"); ML = Level.Game.GetMapList(Level.Game.MapListType); CurrentMap = GetURLMap(); StartMap = ML.Maps[ML.MapNum]; //log("*** CurrentMap="@CurrentMap); //log("*** StartMap="@StartMap); if(!MapMatches(StartMap,CurrentMap)) { Level.ServerTravel(StartMap, false); return; } break; } super.MultiTimer(SlotID); } /*event PostLogin( PlayerController NewPlayer ) { super.PostLogin(NewPlayer); Broadcast(NewPlayer.Pawn, "***"@NewPlayer.PlayerReplicationInfo.GamerTag@"has entered", 'Login'); NewPlayer.SetName(NewPlayer.PlayerReplicationInfo.Gamertag); }*/ event PlayerController Login(string Portal, string Options, out string Error) { local PlayerController NewPlayer; local ZPlayerController ZPC; local string InOpt; local int iHead, iBody; //NewPlayer = super(GameInfo).Login(Portal, Options, Error); local NavigationPoint StartSpot; local Pawn TestPawn; local string InName, InAdminName, InPassword, InChecksum, InClass, InCharacter; local byte InTeam; // Trin 3/3/2008 // Removed bAdmin to clean up compile message for unreferenced local variable. //local bool bSpectator, bAdmin; local bool bSpectator; local class MySecurityClass; log(self@"LOGIN"@Portal@Options@Error); bSpectator = HasOption(Options, "SpectatorOnly"); BaseMutator.ModifyLogin(Portal, Options); // Get URL options. InName = Left(ParseOption ( Options, "Name"), 20); InTeam = GetIntOption( Options, "Team", 255 ); // default to "no team" InAdminName= ParseOption ( Options, "AdminName"); InPassword = ParseOption ( Options, "Password" ); InChecksum = ParseOption ( Options, "Checksum" ); log( "Login:" @ InName ); //== patched by JL foreach DynamicActors(class'Pawn', TestPawn ){ if ( (TestPawn!=None) && (PlayerController(TestPawn.Controller)!=None) && (PlayerController(TestPawn.Controller).Player==None) && (TestPawn.Health > 0) && (TestPawn.OwnerName~=InName) ){ TestPawn.SetRotation(TestPawn.Controller.Rotation); TestPawn.bInitializeAnimation = false; // FIXME - temporary workaround forlack of meshinstance serialization TestPawn.PlayWaiting(); bWaitingToStartMatch = true; //CTL - save/load game fix: added bDelayedStart=false; //CTL - save/load game fix: added return PlayerController(TestPawn.Controller); } } //== end patched by JL // Pick a team (if need teams) InTeam = PickTeam(InTeam,None); // Find a start spot. StartSpot = FindPlayerStart( None, InTeam, Portal ); if( StartSpot == None ) { Error = GameMessageClass.Default.FailedPlaceMessage; return None; } if ( PlayerControllerClass == None ) PlayerControllerClass = class(DynamicLoadObject(PlayerControllerClassName, class'Class')); NewPlayer = spawn(PlayerControllerClass,,,StartSpot.Location,StartSpot.Rotation); // Handle spawn failure. if( NewPlayer == None ) { log("Couldn't spawn player controller of class "$PlayerControllerClass); Error = GameMessageClass.Default.FailedSpawnMessage; return None; } NewPlayer.StartSpot = StartSpot; // Init player's replication info NewPlayer.GameReplicationInfo = GameReplicationInfo; NewPlayer.GotoState('Spectating'); // Apply security to this controller MySecurityClass=class(DynamicLoadObject(SecurityClass,class'class')); if (MySecurityClass!=None) { NewPlayer.PlayerSecurity = spawn(MySecurityClass,NewPlayer); if (NewPlayer.PlayerSecurity==None) log("Could not spawn security for player "$NewPlayer,'Security'); } else log("Unknown security class ["$SecurityClass$"] -- System is no secure.",'Security'); zpc = ZPlayerController(NewPlayer); zpc.login(InPassword); if(!zpc.PlayerReplicationInfo.bAdmin && AtCapacity(bSpectator)) { Error=GameMessageClass.Default.MaxedOutMessage; return none; } // If admin, force spectate mode if the server already full of reg. players if ( zpc.PlayerReplicationInfo.bAdmin && AtCapacity(false)) bSpectator = true; // Init player's name if( InName=="" ) InName=DefaultPlayerName; if( Level.NetMode!=NM_Standalone || NewPlayer.PlayerReplicationInfo.PlayerName==DefaultPlayerName ) ChangeName( NewPlayer, InName, false ); if ( bSpectator || NewPlayer.PlayerReplicationInfo.bOnlySpectator ) { NewPlayer.PlayerReplicationInfo.bOnlySpectator = true; NewPlayer.PlayerReplicationInfo.bIsSpectator = true; NewPlayer.PlayerReplicationInfo.bOutOfLives = true; NumSpectators++; return NewPlayer; } // Change player's team. if ( !ChangeTeam(newPlayer, InTeam, false) ) { Error = GameMessageClass.Default.FailedTeamMessage; return None; } newPlayer.StartSpot = StartSpot; // Set the player's ID. NewPlayer.PlayerReplicationInfo.PlayerID = CurrentID++; InClass = ParseOption( Options, "Class" ); if (InClass == "") InClass = DefaultPlayerClassName; InCharacter = ParseOption(Options, "Character"); //NewPlayer.SetPawnClass(InClass, InCharacter); NumPlayers++; bWelcomePending = true; // if delayed start, don't give a pawn to the player yet // Normal for multiplayer games if ( bDelayedStart ) { // Trin 3/3/2008 // Force the initial state to be PlayerCharacterSelect. NewPlayer.GotoState('PlayerCharacterSelect'); //NewPlayer.GotoState('PlayerWaiting'); } ZPC = ZPlayerController(NewPlayer); InOpt = ParseOption(Options, "Head"); iHead = int(InOpt); InOpt = ParseOption(Options, "Body"); iBody = int(InOpt); zpc.iHeadTexture = iHead; zpc.iBodyTexture = iBody; return ZPC; } function ScoreKill(Controller Killer, Controller Other) { local string KillerName, KilledName; super.ScoreKill(Killer, Other); if(Killer.PlayerReplicationInfo != None) KillerName = Killer.PlayerReplicationInfo.Gamertag; else KillerName = "A zombie"; if(Other.PlayerReplicationInfo != None) { KilledName = Other.PlayerReplicationInfo.Gamertag; Broadcast(Killer.Pawn, "***"@KillerName@"killed"@KilledName); } } K// Copyright (C) 2005 Brainbox Games. All Rights Reserved. // September 27, 2005 //----------------------------------------------------------- // //----------------------------------------------------------- class BladeCTFHUD extends BladeINHUD; var array TeamScoreMat; var array ScoreMat; var Material BagMat; var array FlagHomeMat; var array FlagHeldMat; var array FlagDropMat; var Material BlueFlagMat; var Material RedFlagMat; var float BagPosX, BagPosY; //=========================================================================== // Editable properties //=========================================================================== // HUD mockup //=========================================================================== // Internal data //=========================================================================== //=========================================================================== // Hud Hooks //=========================================================================== /** */ function drawToHUD( Canvas c, float scaleX, float scaleY ) { local CTFFlag tempFlag; local float FontDX, FontDY, CX, CY; local int LocalStat, x, itmp, Alpha; local array Tmp; //this sets all stats used below super(DOTZMPHudBase).DrawToHUD(c,ScaleX,ScaleY); LocalStat = StatLocation; //XBOX /*if (Player.IsA('XDotzPlayerController') == true){ BagPosX = 210*scaleX; BagPosY = 750* scaleY; }else{*/ BagPosX = 180*scaleX; BagPosY = 800* scaleY; //} DOTZPlayerControllerBase(Player).RefreshPRI(3); /* Rank=1; //calculate the player's rank for ( i=0; i Player.PlayerReplicationInfo.Score && Player.GameReplicationInfo.PRIArray[i] != Player.PlayerReplicationInfo){ Rank++; } else if (Player.GameReplicationInfo.PRIArray[i].Kills == Player.PlayerReplicationInfo.Score && Player.GameReplicationInfo.PRIArray[i].Deaths < Player.PlayerReplicationInfo.Deaths && Player.GameReplicationInfo.PRIArray[i] != Player.PlayerReplicationInfo) { Rank++; } } */ //player score if (Player.PlayerReplicationInfo.Team != none){ C.SetPos(LeftMargin,StatLocation); C.DrawTile(TeamScoreMat[TeamNum],128*scaleX,64*scaleY,0,0,128,64); C.SetPos(LeftMarginPlus,StatLocation+ (5*scaleY)); C.DrawText(string(DOTZPlayerControllerBase(Player).pris[DOTZPlayerControllerBase(Player).myPRIIndex].Score)); StatLocation += StatSpace; } //show the bag if (Player.PlayerReplicationInfo.bHasFlag){ C.SetPos(BagPosX,BagPosY); C.DrawTile(BagMat,128*scaleX,64*scaleY,0,0,128,64); } foreach DynamicActors(class'CTFFlag', tempFlag){ if (tempFlag.TeamType == 0){ //red flag status if (tempFlag.bHome == true){ RedFlagMat = FlagHomeMat[0]; } else if (tempFlag.bHeld){ RedFlagMat = FlagHeldMat[0]; } else { RedFlagMat = FlagDropMat[0]; } } else { //blue flag status if (tempFlag.bHome){ BlueFlagMat = FlagHomeMat[1]; } else if (tempFlag.bHeld){ BlueFlagMat = FlagHeldMat[1]; } else { BlueFlagMat = FlagDropMat[1]; } } } if(RedFlagMat == None) RedFlagMat = FlagHomeMat[0]; if(BlueFlagMat == None) BlueFlagMat = FlagHomeMat[1]; //Draw the red flags status C.SetPos(TeamLeftMargin,LocalStat); C.DrawTile(RedFlagMat,64*scaleX,128*scaleY,0,0,64,128); //C.SetPos(TeamLeftMargin + (15 * scaleX),LocalStat + (60*scaleY)); //C.DrawText(string(int(Player.GameReplicationInfo.Teams[0].Score))); C.DrawTextJustified( string(int(Player.GameReplicationInfo.Teams[0].Score)), 1, TeamLeftMargin, LocalStat + (65*scaleY), TeamLeftMargin + 64*scaleX, localStat + (65*scaleY) + 32*scaleY ); //Draw the blue flags status C.SetPos(TeamLeftMargin + (70 * scaleX),LocalStat); C.DrawTile(BlueFlagMat,64*scaleX,128*scaleY,0,0,64,128); //C.SetPos(TeamLeftMargin + (85 * scaleX), LocalStat+ (60 * scaleY)); //C.DrawText(string(int(Player.GameReplicationInfo.Teams[1].Score))); C.DrawTextJustified( string(int(Player.GameReplicationInfo.Teams[1].Score)), 1, TeamLeftMargin + (70 * scaleX), LocalStat + (65*scaleY), TeamLeftMargin + (70 * scaleX) + 64*scaleX, LocalStat + (65*scaleY) + 32*scaleY ); C.SetDrawColor(200, 0, 0, 200); if (Player.PlayerReplicationInfo.bIsSpectator == true){ if (Player.GameReplicationInfo.bMatchHasBegun == true || Level.NetMode == NM_ListenServer ){ C.bCenter = true; c.SetPos( scaleX, 375 * scaleY ); if (Player.PlayerReplicationInfo.bOnlySpectator == false){ 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; } Player.PlayerReplicationInfo.bWelcomed = true; } if(Player.GameReplicationInfo.MatchID == 666) { C.bCenter = true; C.SetPos( scaleX, 200 * scaleY ); C.DrawText(ZombiesDefeatedTxt); C.bCenter = false; } 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; } if(bBadConnectionAlert == true) { C.bCenter = true; DropShadowText(C, scaleX, 800 * scaleY, LagAlertTxt); C.bCenter = false; } /*if(bDisplaySign) { C.SetPos(scaleX, 250 * scaleY); C.SetDrawColor(255,255,255,255); //C.Font = Font'ChatFont'; C.Font = Font'Engine.SmallFont'; MOTD = Player.GameReplicationInfo.MOTDLine1 $ "
" $ Player.GameReplicationInfo.MOTDLine2 $ "
" $ Player.GameReplicationInfo.MOTDLine3 $ "
" $ Player.GameReplicationInfo.MOTDLine4 $ "
"; MOTD = MOTD $ "**** Game Admin: "$Player.GameReplicationInfo.AdminName$" ("$Player.GameReplicationInfo.AdminEmail$")
"; Split2(MOTD, "
", DisplaySign); for(x = 0; x < DisplaySign.length; x++) { C.DrawText(DisplaySign[x]); } C.Font = regfont; }*/ 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'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); } } } //=========================================================================== // default Properties //=========================================================================== DI="@4r&*&a m  / a9 mIjiwI&Ia10J.mrJ* & Jf9J3j9J>&&fZ%&jZ cKb R>KMc1bVD Ɇ Ic?3333D ɚD Ɇ Ic?33TTTTT333 Ic6>333 Ic6>3 Ic? Ic6Jq33 Ic?33333 Ic? Ic63333 Ic633333333JqJq33333333 .B S]Y ZYY XY WY VY }]Press Fire to Spawns]Press Fire to Spawna//----------------------------------------------------------- // //----------------------------------------------------------- class BladeCTF extends DOTZCaptureTheFlag; var string BasePawnClass; var array > PawnList; function InitGame(String options, out String error) { local string InOpt; super.InitGame(options, error); bTeamGame = True; TimeLimit = default.TimeLimit; InOpt = ParseOption( Options, "TimeLimit"); if( InOpt != "" ){ TimeLimit = int(InOpt); } if (TimeLimit == 0) { TimeLimit = -1; } } function array > GetPawnList() { return PawnList; } function bool MapMatches(string map, string map2) { local int x, y; x = InStr(map, "?"); if(x > -1) { map = mid(map, 0, x); } y = InStr(map, "?"); if(y > -1) { map2 = mid(map, 0, y); } //log(self@map@map2); if(map ~= map2) return true; return false; } event PostBeginPlay() { local int x; local string entry, desc; local class pclass; DynamicLoadObject(BasePawnClass, class'class'); do { GetNextIntDesc(BasePawnClass, x, entry, desc); //log(self@"GetNextIntDesc"@BasePawnClass@"="@entry@"desc="@desc); if(entry == "") break; pclass = class(DynamicLoadObject(entry, class'Class')); PawnList[x] = pclass; ++x; } until(entry == ""); if(PawnList.Length < 1) { PawnList[0] = class'XDOTZCharacters.JackSlade'; PawnList[1] = class'XDOTZCharacters.PlayerOtis'; } super.PostBeginPlay(); if(Level.NetMode == NM_DedicatedServer) SetMultiTimer(2342, 0.5, false); } function MultiTimer(int SlotID){ local MapList ML; local string CurrentMap; local string StartMap; switch(SlotID){ case 2342: //log("*** MAP CHECK"); ML = Level.Game.GetMapList(Level.Game.MapListType); CurrentMap = GetURLMap(); StartMap = ML.Maps[ML.MapNum]; //log("*** CurrentMap="@CurrentMap); //log("*** StartMap="@StartMap); if(!MapMatches(StartMap,CurrentMap)) { Level.ServerTravel(StartMap, false); return; } break; } super.MultiTimer(SlotID); } function SetTeamFlags(){ local CTFFlag F; // associate flags with teams foreach DynamicActors(Class'CTFFlag',F) { F.Team = GameReplicationInfo.Teams[F.TeamType]; F.Team.HomeBase = F.HomeBase; } } /*function RestartPlayer(Controller C) { local NavigationPoint startSpot; local int TeamNum; local class DefaultPlayerClass; local Controller aPlayer; aPlayer = C; log(self@"RestartPlayer Controllre="@C); if( bRestartLevel && Level.NetMode!=NM_DedicatedServer && Level.NetMode!=NM_ListenServer ) { log("bRestartLevel == true and we are not a server"); return; } if ( (aPlayer.PlayerReplicationInfo == None) || (aPlayer.PlayerReplicationInfo.Team == None) ) { TeamNum = 255; log("We don't have a team number, setting to 255 (this shouldnt happen in CTF...)"); } else { TeamNum = aPlayer.PlayerReplicationInfo.Team.TeamIndex; log("Setting TeamNum ="@TeamNum); } startSpot = FindPlayerStart(aPlayer, TeamNum); if( startSpot == None ) { log(" Player start not found!!!"); return; } log("FindPlayerStart returns"@startSpot); if (aPlayer.PreviousPawnClass!=None && aPlayer.PawnClass != aPlayer.PreviousPawnClass) { log("Player changed classes"); BaseMutator.PlayerChangedClass(aPlayer); } if ( aPlayer.PawnClass != None ) { log("player.pawnclass == "@aPlayer.PawnClass); aPlayer.Pawn = Spawn(aPlayer.PawnClass,,,StartSpot.Location,StartSpot.Rotation); } log("spawned pawn="@aPlayer.Pawn); if( aPlayer.Pawn==None ) { DefaultPlayerClass = GetDefaultPlayerClass(aPlayer); log("Unable to spawn that, so spawning "@DefaultPlayerClass); aPlayer.Pawn = Spawn(DefaultPlayerClass,,,StartSpot.Location,StartSpot.Rotation); } log("Pawn = "@aPlayer.Pawn); if ( aPlayer.Pawn == None ) { log("Couldn't spawn player of type "$aPlayer.PawnClass$" at "$StartSpot); aPlayer.GotoState('Dead'); return; } aPlayer.Pawn.Anchor = startSpot; aPlayer.Pawn.LastStartSpot = PlayerStart(startSpot); aPlayer.Pawn.LastStartTime = Level.TimeSeconds; aPlayer.PreviousPawnClass = aPlayer.Pawn.Class; log("Before Possess pawn="@aplayer.pawn); aPlayer.Possess(aPlayer.Pawn); log("After Possess pawn="@aplayer.pawn); aPlayer.PawnClass = aPlayer.Pawn.Class; log("Player.PawnClass="@aPlayer.Pawn.Class); aPlayer.Pawn.PlayTeleportEffect(true, true); aPlayer.ClientSetRotation(aPlayer.Pawn.Rotation); log("Calling AddDefaultInventory("@aPlayer.Pawn@")"); AddDefaultInventory(aPlayer.Pawn); TriggerEvent( StartSpot.Event, StartSpot, aPlayer.Pawn); log("Calling GiveDefaultInventory("@aPlayer.Pawn@")"); GiveDefaultInventory(aPlayer.Pawn); aPlayer.PlayerReplicationInfo.bIsSpectator = false; AdvancedPlayerController(aPlayer).SetCustomTextures(); //super.RestartPlayer(C); }*/ function GiveDefaultInventory(Pawn P) { if(AdvancedPawn(P) == None) { log("*** GiveDefaultInventory pawn=None"); return; } super.GiveDefaultInventory(P); } event PostLogin( PlayerController NewPlayer ) { super.PostLogin(NewPlayer); Broadcast(NewPlayer.Pawn, "***"@NewPlayer.PlayerReplicationInfo.GamerTag@"has entered", 'Login'); NewPlayer.SetName(NewPlayer.PlayerReplicationInfo.Gamertag); } function ScoreObjective(PlayerReplicationInfo Scorer, Int Score) { super.ScoreObjective(Scorer, Score); Broadcast(Scorer.Owner, "***"@Scorer.Gamertag@" scores!"); } event PlayerController Login(string Portal, string Options, out string Error) { local PlayerController NewPlayer; local ZPlayerController ZPC; local string InOpt; local int iHead, iBody; //NewPlayer = super(GameInfo).Login(Portal, Options, Error); local NavigationPoint StartSpot; local Pawn TestPawn; local string InName, InAdminName, InPassword, InChecksum, InClass, InCharacter; local byte InTeam; // Trin 3/3/2008 // Removed bAdmin to clean up compile message for unreferenced local variable. //local bool bSpectator, bAdmin; local bool bSpectator; local class MySecurityClass; log(self@"LOGIN"@Portal@Options@Error); bSpectator = HasOption(Options, "SpectatorOnly"); BaseMutator.ModifyLogin(Portal, Options); // Get URL options. InName = Left(ParseOption ( Options, "Name"), 20); InTeam = GetIntOption( Options, "Team", 255 ); // default to "no team" InAdminName= ParseOption ( Options, "AdminName"); InPassword = ParseOption ( Options, "Password" ); InChecksum = ParseOption ( Options, "Checksum" ); log( "Login:" @ InName ); //== patched by JL foreach DynamicActors(class'Pawn', TestPawn ){ if ( (TestPawn!=None) && (PlayerController(TestPawn.Controller)!=None) && (PlayerController(TestPawn.Controller).Player==None) && (TestPawn.Health > 0) && (TestPawn.OwnerName~=InName) ){ TestPawn.SetRotation(TestPawn.Controller.Rotation); TestPawn.bInitializeAnimation = false; // FIXME - temporary workaround forlack of meshinstance serialization TestPawn.PlayWaiting(); bWaitingToStartMatch = true; //CTL - save/load game fix: added bDelayedStart=false; //CTL - save/load game fix: added return PlayerController(TestPawn.Controller); } } //== end patched by JL // Pick a team (if need teams) InTeam = PickTeam(InTeam,None); // Find a start spot. StartSpot = FindPlayerStart( None, InTeam, Portal ); if( StartSpot == None ) { Error = GameMessageClass.Default.FailedPlaceMessage; return None; } if ( PlayerControllerClass == None ) PlayerControllerClass = class(DynamicLoadObject(PlayerControllerClassName, class'Class')); NewPlayer = spawn(PlayerControllerClass,,,StartSpot.Location,StartSpot.Rotation); // Handle spawn failure. if( NewPlayer == None ) { log("Couldn't spawn player controller of class "$PlayerControllerClass); Error = GameMessageClass.Default.FailedSpawnMessage; return None; } NewPlayer.StartSpot = StartSpot; // Init player's replication info NewPlayer.GameReplicationInfo = GameReplicationInfo; NewPlayer.GotoState('Spectating'); // Apply security to this controller MySecurityClass=class(DynamicLoadObject(SecurityClass,class'class')); if (MySecurityClass!=None) { NewPlayer.PlayerSecurity = spawn(MySecurityClass,NewPlayer); if (NewPlayer.PlayerSecurity==None) log("Could not spawn security for player "$NewPlayer,'Security'); } else log("Unknown security class ["$SecurityClass$"] -- System is no secure.",'Security'); zpc = ZPlayerController(NewPlayer); zpc.login(InPassword); if(!zpc.PlayerReplicationInfo.bAdmin && AtCapacity(bSpectator)) { Error=GameMessageClass.Default.MaxedOutMessage; return none; } // If admin, force spectate mode if the server already full of reg. players if ( zpc.PlayerReplicationInfo.bAdmin && AtCapacity(false)) bSpectator = true; // Init player's name if( InName=="" ) InName=DefaultPlayerName; if( Level.NetMode!=NM_Standalone || NewPlayer.PlayerReplicationInfo.PlayerName==DefaultPlayerName ) ChangeName( NewPlayer, InName, false ); if ( bSpectator || NewPlayer.PlayerReplicationInfo.bOnlySpectator ) { NewPlayer.PlayerReplicationInfo.bOnlySpectator = true; NewPlayer.PlayerReplicationInfo.bIsSpectator = true; NewPlayer.PlayerReplicationInfo.bOutOfLives = true; NumSpectators++; return NewPlayer; } // Change player's team. if ( !ChangeTeam(newPlayer, InTeam, false) ) { Error = GameMessageClass.Default.FailedTeamMessage; return None; } newPlayer.StartSpot = StartSpot; // Set the player's ID. NewPlayer.PlayerReplicationInfo.PlayerID = CurrentID++; InClass = ParseOption( Options, "Class" ); if (InClass == "") InClass = DefaultPlayerClassName; InCharacter = ParseOption(Options, "Character"); //NewPlayer.SetPawnClass(InClass, InCharacter); NumPlayers++; bWelcomePending = true; // if delayed start, don't give a pawn to the player yet // Normal for multiplayer games if ( bDelayedStart ) { // Trin 3/3/2008 // Force the initial state to be PlayerCharacterSelect. NewPlayer.GotoState('PlayerCharacterSelect'); //NewPlayer.GotoState('PlayerWaiting'); } ZPC = ZPlayerController(NewPlayer); InOpt = ParseOption(Options, "Head"); iHead = int(InOpt); InOpt = ParseOption(Options, "Body"); iBody = int(InOpt); zpc.iHeadTexture = iHead; zpc.iBodyTexture = iBody; return ZPC; } K //----------------------------------------------------------- // $DATETIME: 14/07/2006 12:23:21 PM$ // DeadAwake code (C) 2006, Eric Blade //----------------------------------------------------------- class BINSpinner extends SpinnyWeap; // Override this so we get some looping action function PlayNextAnim() { local name NewAnimName; if(Mesh == None || AnimNames.Length == 0) return; NewAnimName = AnimNames[Rand(AnimNames.Length)]; LoopAnim(NewAnimName, 1.0, 0.25); //log(self@"PlayNextAnim"); NextAnimTime = CurrentTime + AnimChangeInterval; } function PostBeginPlay() { if(Level.NetMode == NM_DedicatedServer) Destroy(); super.PostBeginPlay(); AnimNames.Length=5; } |?//----------------------------------------------------------- // BladeIN V1.1 (c) 2006, Eric Blade // $DATETIME: 03/05/2008 1:42:11 PM$ //----------------------------------------------------------- class BINPRI extends PlayerReplicationInfo; var array MapList; var array > PawnList; struct CharacterSelect { var string PawnName; var int HeadType; var int BodyType; }; var CharacterSelect SelectedCharacter; replication { reliable if(Role == ROLE_AUTHORITY) SendMapListEntry, SendPawnListEntry; reliable if(Role < ROLE_AUTHORITY) SendMapList, SendPawnList, SelectedCharacter; } simulated event PostNetReceive() { local AdvancedPlayerController apc; local bool bChangeBody; if(Role == ROLE_Authority) { log(self@"PNR: SelectedCharacter="@SelectedCharacter.PawnName@SelectedCharacter.HeadType@SelectedCharacter.BodyType); apc = AdvancedPlayerController(Owner); if(apc.iHeadTexture != SelectedCharacter.HeadType) { apc.iHeadTexture = SelectedCharacter.HeadType; bChangeBody = True; } if(apc.iBodyTexture != SelectedCharacter.BodyType) { bChangeBody = True; apc.iBodyTexture = SelectedCharacter.BodyType; } if(strinG(apc.PawnClass.class) != SelectedCharacter.PawnName) apc.SetPawnClass(SelectedCharacter.PawnName, SelectedCharacter.PawnName); if(bChangeBody) apc.SetCustomTextures(); } super.PostNetReceive(); } simulated function PostNetBeginPlay() { if(Level.NetMode != NM_Client) { SendMapList(); SendPawnList(); } super.PostNetBeginPlay(); } simulated function SendMapListEntry(string map) { local int x; if(Level.NetMode == NM_Client) { for(x = 0; x < MapList.Length; x++) { if(map ~= MapList[x]) return; } MapList[MapList.Length] = map; } } simulated function SendMapList() { if(Level.NetMode == NM_Client) { MapList.Remove(0, MapList.Length); } else { MapList = Level.Game.GetMapList(Level.Game.MapListType).Maps; } } simulated function SendPawnListEntry(class P) { local PlayerController myController; local GUIController gc; local int x; myController = PlayerController(owner); myController = Level.GetLocalPlayerController(); //log(self@"SendPawnLIstEntry owner="@owner); if(Level.NetMode == NM_Client) { //log(self@"got pawn"@P); for(x = 0; x < PawnList.Length; x++) { if(P == PawnList[x]) { //log(self@"throwing out duplicate pawn"); return; } } PawnList[PawnList.Length] = P; if(myController != None) { //log(self@"myController="@myController); gc = GUIController(myController.Player.GUIController); if(gc.TopPage() != None && gc.TopPage().IsA('BINCharSelect')) { //log(self@"Character Select open, calling LoadPawns()"); //BINCharSelect(gc.TopPage()).CharacterTypeValue.AddItem(PawnList[x].name), PawnList[x].default.mesh, string(PawnList[x])); BINCharSelect(gc.TopPage()).LoadPawns(); } } } } simulated function SendPawnList() { if(Level.NetMode == NM_Client) { PawnList.Remove(0, PawnList.Length); } else { if(BladeIN(Level.Game) != None) PawnList=BladeIN(Level.Game).GetPawnList(); if(BladeDM(Level.Game) != None) PawnList=BladeDM(Level.Game).GetPawnList(); if(BladeCTF(Level.Game) != None) PawnList=BladeCTF(Level.Game).GetPawnList(); //PawnList = BladeIN(Level.Game).GetPawnList(); } } function Tick(float x) { super.Tick(x); if(MapList.Length > 0) { SendMapListEntry(MapList[0]); MapList.Remove(0,1); } if(PawnList.Length > 0) { SendPawnListEntry(PawnList[0]); PawnList.Remove(0,1); } } LrX&'  QS&  -(9:f &(' f H//----------------------------------------------------------- // //----------------------------------------------------------- class BINPawnFire extends PawnFire; simulated function MultiTimer(int SlotID){ if (SlotID == BURNTIMER){ if (CheckExtinguish()){ return; } SpreadFlames(); } if (Level.NetMode == NM_Client){ if (NetBaseActor !=None){ if (FlameEmitter != None){ FlameEmitter.bHardAttach = true; FlameEmitter.SetLocation(NetBaseActor.Location); FlameEmitter.SetBase(NetBaseActor); } } } //Log(self $ " " $ location $ " Flame: " $ FlameEmitter $ " " $ NetBaseActor); } function SpreadFlames() { local Fire FireActor; local Pawn NearActor; local bool bHasFire; //look if you should burn someone Foreach Radiusactors(class'Pawn',NearActor, FireBurnRadius ){ //assume they are not burning bHasFire = false; //burning or not damage them if (DamagePerSec > 0){ NearActor.TakeDamage(DamagePerSec,Instigator,vect(0,0,0),vect(0,0,0),FireDamageType); } //bail if the actor is already burning foreach NearActor.BasedActors(class'Fire', FireActor){ bHasFire = true; } if (bHasFire == False && IgnitionTimeElapsed(NearActor.name)==true && NearActor.Health > 0){ FireActor = Spawn(childFireType,,,NearActor.location); FireActor.bSourceFades = bChildrenFade; FireActor.bChildrenFade = bChildrenFade; FireActor.bHardAttach = true; FireActor.SetBase(NearActor); FireActor.CreateFire(); } } //prepare for next update CleanUpIgnitionData(); } V A  S Wg H<Ug :{UvU ^C// $DATETIME: 15/10/2008 12:14:55 AM$ // Dead Awake code (c) 2006, Eric Blade // TODO: Add way here to enter Admin Password, voting? class BINPauseMenu extends DOTZInGamePage; var Automated GuiButton ContinueButton; var Automated GuiButton LoadButton; var Automated GuiButton SaveButton; var Automated GuiButton OptionsButton; var Automated GuiButton QuitButton; var Automated GuiButton AdminButton; var Automated GUILabel CaptionMessage; var string LoadMenu; var string SaveMenu; var string OptionsMenu; var string QuitMenu; var localized string PageCaption; var localized string DeadSPCaption; var localized string DeadMPCaption; var localized string ContinueButtonCap; var localized string LoadButtonCap; var localized string SaveButtonCap; var localized string SettingsButtonCap; var localized string QuitButtonCap; //var localized string PeterCap; //var localized string RogerCap; var localized string AdminCap; var string AdminMenu; var sound ClickSound; function InitComponent( GUIController MyController, GUIComponent MyOwner ) { Super.Initcomponent(MyController, MyOwner); InGameBackground.bVisible = false; if(PlayerOwner().Pawn == None) { //SaveButton.bVisible = False; if(PlayerOwner().Level.Game == None) {// MP, Dead PageCaption = DeadMPCaption; } else { PageCaption = DeadSPCaption; ContinueButton.bVisible = False; InGameBackground.bVisible = true; } } CaptionMessage.Caption = PageCaption; ContinueButton.Caption = ContinueButtonCap; if(PlayerOwner().Level.Game == None) { LoadButton.bVisible = False; SaveButton.bVisible = False; /*if(DynamicLoadObject("HSDawnCharacters.Peter", class'Class') != None) LoadButton.Caption = PeterCap; else LoadButton.bVisible = false; if(DynamicLoadObject("HSDawnCharacters.Roger", class'Class') != None) SaveButton.Caption = RogerCap; else SaveButton.bVisible = false; */ } else { LoadButton.Caption = LoadButtonCap; SaveButton.Caption = SaveButtonCap; } if(PlayerOwner().PlayerReplicationInfo.bAdmin || PlayerOwner().Level.Game != None) { AdminButton.Caption = AdminCap; AdminButton.bVisible = true; } else { AdminButton.bVisible = false; } OptionsButton.Caption = SettingsButtonCap; QuitButton.Caption = QuitButtonCap; //SetPageCaption (PageCaption); } event Opened( GUIComponent Sender ) { super.Opened(Sender); PlayerOwner().PlayOwnedSound(ClickSound,SLOT_Interface,1.0); // Add a delay before accepting input accept_input = false; } event Closed(GUIComponent Sender, bool bCancelled) { Super.Closed(Sender,bCancelled); Controller.MouseEmulation(false); } function bool HandleKeyEvent(out byte Key,out byte State,float delta) { if(State != 1) // button down return false; if (Key == 27 || Key == 213) { //Esc //PlayerOwner().Pawn.PlayOwnedSound(ClickSound,SLOT_Interface,1.0); ButtonClicked(ContinueButton); } return true; } function bool ButtonClicked(GUIComponent Sender) { local GUIButton Selected; if (GUIButton(Sender) != None) Selected = GUIButton(Sender); if (Selected == None) return false; PlayerOwner().PlayOwnedSound(ClickSound,SLOT_Interface,1.0); switch (Selected) { case AdminButton: if(PlayerOwner().PlayerReplicationInfo.bAdmin || PlayerOwner().Level.Game != None) return Controller.OpenMenu(AdminMenu); break; case ContinueButton: Controller.ViewportOwner.Actor.SetPause(false); return Controller.CloseMenu(true); break; case LoadButton: if(PlayerOwner().Level.Game == None) { ZPlayerController(PlayerOwner()).ServerSetPawnClass("XDOTZCharacters.JackSlade","HSDawnCharacters.Peter"); } else { return Controller.OpenMenu(LoadMenu); } break; case SaveButton: if(PlayerOwner().Level.Game == None) { ZPlayerController(PlayerOwner()).ServerSetPawnClass("XDOTZCharacters.JackSlade","HSDawnCharacters.Roger"); } else { return Controller.OpenMenu(SaveMenu); } break; case OptionsButton: return Controller.OpenMenu(OptionsMenu); break; case QuitButton: return Controller.OpenMenu(QuitMenu); break; }; return false; } event NotifyLevelChange() { Controller.CloseMenu(true); } l//----------------------------------------------------------- // $DATETIME: 15/10/2008 12:24:06 AM$ //----------------------------------------------------------- class BINMPFailed extends DOTZMPFailed; var Automated GuiButton ContinueButton; function InitComponent( GUIController MyController, GUIComponent MyOwner ) { super(DOTZInGamePage).Initcomponent(MyController, MyOwner); //Log("DOTZMPFailed InitComponent Called"); } function bool ContinueClicked(GUIComponent Sender) { Controller.CloseAll(True); return True; } event Opened( GUIComponent Sender ) { // from DOTZMPFailed SetFocus(ContinueButton); ContinueButton.SetFocus(none); // From DOTZPageBase accept_input = false; //Log("Not Accepting input..."); SetTimer(0.1,false); //super.Opened(Sender); } function Timer() { // from DOTZPageBase if (accept_input == false ) { accept_input = true; SetTimer(period,true); //Log("Accepting input..."); } else { Periodic(); } } event HandleParameters( String param1, String param2 ) { ErrorMessage.Caption = param1; //Log("param1" @ param1); //Log("default" @ class'AccessControl'.default.NeedPassword); if (param1 == class'AccessControl'.default.NeedPassword || param1 == class'AccessControl'.default.WrongPassword) { Log("Show prompt for password"); BBGuiController(Controller).SwitchMenu("DOTZMenu.DOTZGetPassword", default.LastURL); } //if (ErrorMessage.Caption == "You need to enter a password to join this game."){ // BBGuiController(Controller).SwitchMenu("DOTZMenu.DOTZGetPassword",); // } } Xm Mv( Mm  s// $DATETIME: 15/10/2008 1:07:24 AM$ // Dead Awake code (C) 2006, Eric Blade class BINCharSelect extends DOTZPage; #exec obj load file="UPreview.u" var localized string PageCaption; var sound ClickSound; var Automated GUILabel CharacterTypeLabel; var Automated GUILabel HeadTypeLabel; var Automated GUILabel BodyTypeLabel; var Automated GUILabel MOTDLine1; var Automated GUILabel MOTDLine2; var Automated GUILabel MOTDLine3; var Automated GUILabel MOTDLine4; var Automated BBComboBox CharacterTypeValue; var Automated BBComboBox HeadTypeValue; var Automated BBComboBox BodyTypeValue; var Automated BBEditBox PasswordBox; var ColorModifier MyBackground; //var Automated GUIButton StartButton; // Used for character (not just weapons!) var SpinnyWeap SpinnyDude; // MUST be set to null when you leave the window var vector SpinnyDudeOffset; var string URL; var bool bPasswordRequired; var array > Pawns; var bool bInitialized; function InitComponent(GUIController MyController, GUIComponent MyOwner) { SetMOTD(); super.InitComponent(MyController,MyOwner); MyBackground = ColorModifier(Controller.ViewportOwner.Actor.Level.ObjectPool.AllocateObject(class'ColorModifier')); MyBackground.Material = Texture'UPreview.IMapListBk'; MyBackground.Color.A = 127; Background = MyBackground; SetPageCaption(PageCaption); AddBackButton(); BackButtonLabel.bVisible = false; AddNextButton(); LoadPawns(); bInitialized = true; UpdateSpinnyDude(); } function SetMOTD() { local GameReplicationInfo GRI; GRI = Controller.ViewportOwner.Actor.Level.GetLocalPlayerController().GameReplicationInfo; MOTDLine1.Caption = GRI.MOTDLine1; MOTDLine2.Caption = GRI.MOTDLine2; MOTDLine3.Caption = GRI.MOTDLine3; MOTDLine4.Caption = GRI.MOTDLine4; } simulated function LoadPawns() { local int x; local int y; local BINPRI PRI; //local AdvancedPawn p; local string charname; PRI = BINPRI(ZPlayerController(PlayerOwner()).PlayerReplicationInfo); if(PRI == None) return; if(Pawns.Length > 0) { Pawns.Remove(0, Pawns.Length); } if(PlayerOwner().Level.Game != None) { if(BladeIN(PlayerOwner().Level.Game) != None) PRI.PawnList=BladeIN(PlayerOwner().Level.Game).GetPawnList(); if(BladeDM(PlayerOwner().Level.Game) != None) PRI.PawnList=BladeDM(PlayerOwner().Level.Game).GetPawnList(); if(BladeCTF(PlayerOwner().Level.Game) != None) PRI.PawnList=BladeCTF(PlayerOwner().Level.Game).GetPawnList(); } if(CharacterTypeValue.ItemCount() > 0) CharacterTypeValue.RemoveItem(0, CharacterTypeValue.ItemCount()); if(HeadTypeValue.ItemCount() > 0) HeadTypeValue.RemoveItem(0, HeadTypeValue.ItemCount()); if(BodyTypeValue.ItemCount() > 0) BodyTypeValue.RemoveItem(0, BodyTypeValue.ItemCount()); if(PRI.PawnList.Length == 0) { CharacterTypeValue.AddItem("Loading Pawns..."); } else { CharacterTypeValue.find("Loading Pawns..."); if(CharacterTypeValue.Index > -1 && CharacterTypeValue.ItemCount() > 0) CharacterTypeValue.RemoveItem(CharacterTypeValue.Index, 1); } for(x = 0; x < PRI.PawnList.Length; x++) { if(string(PRI.PawnList[x].Name) == "None") continue; Pawns[Pawns.Length] = class(PRI.PawnList[x]); if(PRI.PawnList[x] != None && PRI.PawnList[x].default.MenuName != "") { charname = PRI.PawnList[x].default.MenuName; } else { //charname = string(PRI.PawnList[x].Name); charname = string(PRI.PawnList[x]); switch(charname) { case "JackSlade": charname = "Jack Slade"; break; case "PlayerOtis": charname = "Otis McRedneck"; break; } } //log(self@"charname="@charname); CharacterTypeValue.AddItem(charname, PRI.PawnList[x].default.mesh, string(PRI.PawnList[x])); } for(y = 0; y < Pawns[0].default.HeadTextures.Length; y++) { if(Pawns[0].default.HeadTextures[y] != None) HeadTypeValue.AddItem("Skin"@y,,""$y); } for(y = 0; y < Pawns[0].default.BodyTextures.Length; y++) { if(Pawns[0].default.BodyTextures[y] != None) BodyTypeValue.AddItem("Clothes"@y,,""$y); } CharacterTypeValue.SetIndex(0); HandleCharacterSelection(self); } function Timer() { super.Timer(); SetMOTD(); if(Pawns.Length < 2) LoadPawns(); if(HeadTypeValue.ItemCount() < 1) HandleCharacterSelection(self); } /***************************************************************** * HandleParameters * Collect the URL from the calling page ***************************************************************** */ event HandleParameters( String param1, String param2 ) { URL = Param1; bPasswordRequired = bool(param2); } /***************************************************************** * Happens every time the menu is opened, not just the first. ***************************************************************** */ event Opened( GUIComponent Sender ) { super.Opened(Sender); //PlayerOwner().PlayerReplicationInfo.bOnlySpectator = false; } /***************************************************************** * Closed ***************************************************************** */ event Closed(GUIComponent Sender, bool bCancelled) { //PlayerOwner().PlayerReplicationInfo.bOnlySpectator = true; Super.Closed(Sender,bCancelled); //AdvancedPlayerController(PlayerOwner()).bCameraLock = false; OnDraw=None; SpinnyDude.destroy(); SpinnyDude=None; Controller.MouseEmulation(false); Controller.ViewportOwner.Actor.Level.ObjectPool.FreeObject(MyBackground); } /***************************************************************** * ***************************************************************** */ function HandleCharacterSelection(GUIComponent Sender){ local int y, i; if(!bInitialized) return; UpdateSpinnyDude(); i = CharacterTypeValue.GetIndex(); if(HeadTypeValue.ItemCount() > 0) HeadTypeValue.RemoveItem(0, HeadTypeValue.ItemCount()); if(BodyTypeValue.ItemCount() > 0) BodyTypeValue.RemoveItem(0, BodyTypeValue.ItemCount()); if(Pawns.Length == 0) return; for(y = 0; y < Pawns[i].default.HeadTextures.Length; y++) { if(Pawns[i].default.HeadTextures[y] != None) HeadTypeValue.AddItem(""$Pawns[i].default.HeadTextures[y].Name,,""$y); //HeadTypeValue.AddItem("Skin"@y,,""$y); } //HeadTypeValue.AddItem("Default",,""$y+1); for(y = 0; y < Pawns[i].default.BodyTextures.Length; y++) { if(Pawns[i].default.BodyTextures[y] != None) BodyTypeValue.AddItem(""$Pawns[i].default.BodyTextures[y].Name,,""$y); //BodyTypeValue.AddItem("Clothes"@y,,""$y); } //BodyTypeValue.AddItem("Default",,""$y+1); } function HandleHeadSelection(GUIComponent Sender) { UpdateSpinnyDude(); } function HandleBodySelection(GUIComponent Sender) { UpdateSpinnyDude(); } /***************************************************************** * Next Button ***************************************************************** */ function Click_Next () { BINPRI(PlayerOwner().PlayerReplicationInfo).SelectedCharacter.PawnName = CharacterTypeValue.GetExtra(); BINPRI(PlayerOwner().PlayerReplicationInfo).SelectedCharacter.HeadType = int(HeadTypeValue.GetExtra()); BINPRI(PlayerOwner().PlayerReplicationInfo).SelectedCharacter.BodyType = int(BodyTypeValue.GetExtra()); ZPlayerController(PlayerOwner()).ServerSetPawnClass("XDOTZCharacters.JackSlade", CharacterTypeValue.GetExtra()); ZPlayerController(PlayerOwner()).ServerSetTextures(int(HeadTypeValue.GetExtra()), int(BodyTypeValue.GetExtra())); ZPlayerController(PlayerOwner()).bSelectedPawn = True; SpinnyDude.Destroy(); Controller.CloseAll(false); } function bool InternalDraw(Canvas canvas) { local vector CamPos, X, Y, Z; local rotator CamRot; if (SpinnyDude != none){ canvas.GetCameraLocation(CamPos, CamRot); GetAxes(CamRot, X, Y, Z); SpinnyDude.SetLocation(CamPos + (SpinnyDudeOffset.X * X) + (SpinnyDudeOffset.Y * Y) + (SpinnyDudeOffset.Z * Z)); SpinnyDude.bHidden=True; canvas.DrawActor(SpinnyDude, false, true); //, 90.0); } return false; } function UpdateSpinnyDude() { local BINSpinner blah; local Mesh PlayerMesh; local int HeadIndex, BodyIndex; if(SpinnyDude == None) { SpinnyDude = PlayerOwner().Spawn(class'BINSpinner', , , PlayerOwner().Location); //SpinnyDude.SetRotation(PlayerOwner().Rotation); } foreach PlayerOwner().DynamicActors(class'BINSpinner', blah) { if(blah != SpinnyDude) blah.Destroy(); } PlayerMesh = mesh(CharacterTypeValue.GetObject()); if(PlayerMesh == None){ return; } SpinnyDude.LinkMesh(PlayerMesh); HeadIndex = int(HeadTypeValue.GetExtra()); BodyIndex = int(BodyTypeValue.GetExtra()); SpinnyDude.Skins[1] = Pawns[CharacterTypeValue.GetIndex()/*+1*/].default.HeadTextures[HeadIndex]; SpinnyDude.Skins[0] = Pawns[CharacterTypeValue.GetIndex()/*+1*/].default.BodyTextures[BodyIndex]; } /***************************************************************** * NotifyLevelChange * ***************************************************************** */ event NotifyLevelChange() { Controller.CloseMenu(true); } function bool HandleKeyEvent(out byte Key,out byte State,float delta) { // A short pause if (!accept_input) return false; // Key down only if (State != 1) return false; //Log(" *** Button down " $ Key); return true; } //=========================================================================== // defaultproperties //=========================================================================== [@C'z@&#@@}@&WwW*Wa/!8.W_.W d@.W!c%@  $$$WWD  C@ qH// $DATETIME: 18/09/2006 6:44:13 AM$ // Dead Awake code (c) 2006, Eric Blade class BINAdminMenu extends DOTZInGamePage; /* var automated GUIButton ButtonVar; var localized string ButtonCaption; */ var automated GUIButton CloseButton; var localized string CloseButtonCap; var automated GUIButton RestartButton; var localized string RestartButtonCap; var automated GUIButton EndMatchButton; var localized string EndMatchCap; var automated GUIBUtton PlayersOnlyButton; var localized string PlayersOnlyCap; var Automated GUILabel CaptionMessage; var localized string PageCaption; var Automated GUIListBox PlayerList; var Automated GUIListBox MapList; var Automated GUIButton KickButton; var localized string KickButtonCap; var Automated GUIButton BanButton; var localized string BanButtonCap; var Automated GUIButton SwitchToButton; var localized string SwitchToButtonCap; var Automated GUIButton RemoveMapButton; var localized string RemoveMapButtonCap; var Automated GUIButton AddMapButton; var localized string AddMapButtonCap; var Automated BBEditBox InputBox; var sound ClickSound; function InitComponent( GUIController MyController, GUIComponent MyOwner ) { PlayerList.List.StyleName="BBSquareButton"; MapList.List.StyleName="BBSquareButton"; PlayerList.List.MyScrollBar.StyleName="BBSquareButton"; MapList.List.StyleName="BBSquareButton"; Super.Initcomponent(MyController, MyOwner); InGameBackground.bVisible = true; CaptionMessage.Caption = PageCaption; CloseButton.Caption = CloseButtonCap; RestartButton.Caption = RestartButtonCap; PlayersOnlyButton.Caption = PlayersOnlyCap; EndMatchButton.Caption = EndMatchCap; KickButton.Caption = KickButtonCap; BanButton.Caption = BanButtonCap; AddMapButton.Caption = AddMapButtonCap; RemoveMapButton.Caption = RemoveMapButtonCap; SwitchToButton.Caption = SwitchToButtonCap; } event Opened( GUIComponent Sender ) { local int x; local GameReplicationInfo GRI; local BINPRI PRI; GRI = Controller.ViewportOwner.Actor.GameReplicationInfo; PRI = BINPRI(Controller.ViewportOwner.Actor.PlayerReplicationInfo); //PRI.SendMapList(); SetTimer(0.5, false); for(x = 0; x < GRI.PRIArray.Length; x++) { PlayerList.List.Add(GRI.PRIArray[x].GamerTag); } /*for(x = 0; x < PRI.MapList.Length; x++) { MapList.List.Add(PRI.MapList[x]); }*/ super.Opened(Sender); //PlayerOwner().PlayOwnedSound(ClickSound,SLOT_Interface,1.0); // Add a delay before accepting input accept_input = false; } function Timer() { local int x; local BINPRI PRI; PRI = BINPRI(Controller.ViewportOwner.Actor.PlayerReplicationInfo); for(x = 0; x < PRI.MapList.Length; x++) { MapList.List.Add(PRI.MapList[x]); } } event Closed(GUIComponent Sender, bool bCancelled) { local BINPRI PRI; PRI = BINPRI(Controller.ViewportOwner.Actor.PlayerReplicationInfo); PRI.SendMapList(); Super.Closed(Sender,bCancelled); Controller.MouseEmulation(false); } function bool HandleKeyEvent(out byte Key,out byte State,float delta) { if(State != 1) // button down return false; if (Key == 27 || Key == 213) { //Esc ButtonClicked(CloseButton); } return true; } function bool ButtonClicked(GUIComponent Sender) { local GUIButton Selected; if (GUIButton(Sender) != None) Selected = GUIButton(Sender); if (Selected == None) return false; PlayerOwner().PlayOwnedSound(ClickSound,SLOT_Interface,1.0); switch (Selected) { case CloseButton: return Controller.CloseMenu(true); case RestartButton: return Controller.ConsoleCommand("admin restartmap"); case EndMatchButton: return Controller.ConsoleCommand("admin endmatch"); case PlayersOnlyButton: return Controller.ConsoleCommand("admin playersonly"); case KickButton: return Controller.ConsoleCommand("admin kick"@PlayerList.List.SelectedText()); case BanButton: return Controller.ConsoleCommand("admin kickban"@PlayerList.List.SelectedText()); case SwitchToButton: //log("ADMIN REQUESTED MAP CHANGE '"@MapList.List.SelectedText()@"'"); return Controller.ConsoleCommand("admin switch"@MapList.List.SelectedText()); case RemoveMapButton: Controller.ConsoleCommand("admin removemap"@MapList.List.SelectedText()); MapList.List.RemoveItem(MapList.List.SelectedText()); return true; case AddMapButton: Controller.ConsoleCommand("admin addmap"@InputBox.GetText()); MapList.List.Add(InputBox.GetText()); InputBox.SetText(""); return true; }; return false; } event NotifyLevelChange() { Controller.CloseMenu(true); } I//----------------------------------------------------------- // //----------------------------------------------------------- class BINAdmin extends Object within ZPlayerController; replication { reliable if( Role$ff>$33>$ ף=" 'qV ]Quit ] BBTextButton$ ?$ff>$33>$ ף=" Wq] BBTextButtonv$=$=$L?$L?>$fff? ]Say ]BBRoundButton$?$ff&?$L>$> Wp6 ]Cancel ]BBRoundButton$?$>$L>$>" 'pG MEnter message:MPlainSmGuiFontv$Ga>$L=$?$L?>$fff?F"P$L>$L>$@?$> ]Close ] BBTextButton$ ף<$a7?$>$S= ? ] Restart Map ] BBTextButton$ ף=$a7?$>$S= ? ] End Match ] BBTextButton$L>$a7?$>$S= ? ] Players Only ] BBTextButton$)\>$a7?$>$S= ?] PlainGuiFont$慾$܁>$L?$L?>$fff?z ]BBRoundListButton$<$^م<$>$ff>z ]BBRoundListButton$?$^م<$>$ff> ]Kick ] BBTextButton$ #<$q=>$L>$S= ? ]Ban ] BBTextButton$)\=$q=>$L>$S= ? ] Switch To ] BBTextButton$\?$q=>$L>$S= ? = Remove Map ] BBTextButton$)\?$q=>$L>$S= ? ] Add Map ] BBTextButton$(?$q=>$L>$S= ?$?$G>$+>$)\= ] Continue ] BBTextButton$>$ff>$33>$_= W\ ] Load Game ] BBTextButton$>$ff>$33>$_=" W\ ] Save Game ] BBTextButton$?$ff>$33>$_=" W\ ] Settings ] BBTextButton$?$ff>$33>$_=" W\ ]Quit ] BBTextButton$333?$ff>$33>$_=" W\ = Admin Menu ] BBTextButton$L>$ff>$33>$_= W\] PlainGuiFont$慾$܁>$L?$L?>$fff? -OK ]BBRoundButton$?$ff&?$L>$> Wx6 ]Cancel ]BBRoundButton$?$>$L>$>" 'xG MEnter message:MPlainSmGuiFontv$Ga>$L=$?$L?>$fff?F"P$L>$L>$@?$>] PlainGuiFont$?$>$fff?$=] PlainGuiFont$R?$>$fff?$=] PlainGuiFont$ף0?$>$fff?$=] PlainGuiFont$@?$>$fff?$=] PlainGuiFont$>$>$>$=] PlainGuiFont$Ga>$>$>$=] PlainGuiFont$z>$>$>$= ]BBRoundButtonh${.>$ff>$>^'YI ]BBRoundButtonh$u>$ff>$>^'YH ]BBRoundButtonh$R>$ff>$>^'YI l l k| ku l$ k8 kl kH l ke kX kq lc kP kk kQ km l. kX XC Xq kO k} KP lB kV l_ kv l2 XJ XH k_ kr k^ lP Xd kC k] kd Q  kC kS kl ka k@ ky kp kr kH }r Q ~ Xu k$ lh kJ P[ kw ku kK ^T SI kL Q [ kb k{ P S kM O Xd k lp lg kb ^Q k` X Xr kg ky kM ka Xu kB k` kE kK kS }W ki lf P XH XJ XW Xr ks kz kW kt KD ]u ke @L kx Xj k^ le ]v ]~ kR lC K} @S }s ]t z XL }d ^J lU P k~ P S kw kx P }I kn }N XC ^E k| XD P V Xe XK Xe ^I ]d kU k` kY Kr X} P| ^Z }i ^R Pg kZ k| Q < ]e Sb PE PB @o Q 7 Q j @p }r Szf Q 3 k9 Q Q XU ^@ kD kP ^f X~ kz }q XT Q [ kG XH k Xn kt kZ }W kQ kh ^R lf k] WF{ }d PN Sw k` Kk }[ Q @ |O Xr ]x Q rf Q o K\ XG ^O @a P Xq kg ^a @A XY k@ Pg PS Q @ }h ]e k{ kL Q \ X@ ^S ^H P C R Ip Pp }h XT }e XB Q XE Q f Q  Q x ^X Q  @Z @X @Y Py X_ PU PW kO P| PV Xz PX }m ^~ ^c XO Kb Q r kG XB kR Q Q PC Q Y PQ kf ^[ kn ^t U{ }d @Z @Y @X KY Xk X-~ Q j P\ PZ P[ ^'C kH Q H Q ^ Q ] kr kq kp ko ^'D Q jR }w Q kn ks ^y ^E }G km kl ku kk Q  kj Q UUq Q 7 ki PUU| Pa kt Q i Q < Q | kc Q kg }N Q U Q o ku kf }I ke kd kv kc kb ka @ Xf k` kP k_ Q C W k^ ]P kw @O k] k\ Q u }O Xn Q s Q { k[ }Y XL B X} ]e ]p kZ kI kY kX kW kV kU kT kS k@ Q g kR }v kQ P L Xd Q 1l Q V Q G kP k kj kg kf ke kx ^I ^_ }_ kd Q U Q d } k~ ky kh ki kk Q O Q \ kl }f PEw Q ~ km kn ko kp kq }D }@ kz @h kr XH ks Q n Q  kt ku }T kv PG Q Q kw kx ky kz k{ k| R p Q Y| Q g Q K k} Q l Q j Q [ k{ k~ Q P ]o P j k }A Q Y k@ Q N R F kA Q 3 kB ^c kC kD Q h Q d kE k| kF Xj kG kH kI ka k} kJ Xsm kK kL kM kQ kN kO }A kE kY k] k\ k[ kX Xq }F kL k} }E kD kF kh kH kJ kA kC kK kM kB kI kL Q K3 kZ ko kk kj Q j kX k_ Q | Q u Q k Q o Q n Q u kW Q g Q Gq Q ^ Q \ Q c Q U Q } Pm Q B Q l Q k }V KY KU Xx Q g }a }V }U }T ]S Q e Q 3 Q g ]C Q n ^W ^{ ^w Q EY Q l Q R Q h Q E Q A Q 0 D Q q Q O Q } kh }X P M Q @ X^ Q @ ki Q z X@ ]T l^ |b Xf OZ Q A ]b Q c ]b ]a XU Q k kx Q s P ~ ks }WQ }WR ^cUF XV Xg ^u X^ ^F Q g kN ^T Q f Q e KQ XV }V Q l lh kF }A ^T PH PG PF PE ]K Q G kv Q A Q g ]Z Q & ]M Q j_ ]L ]N Q r0 ^i }h kK XVUr UA UB U U~ U} Us U@ Uw Ut Uy Uv Ux Uu Uz Q EWE WF WG WH WI WJ WD Q l Q z Q } ]M Q d ]W Q R }f Q @A Q h Q @ Q j Q u Q A Q k X@J Q  XHJ Q H }!@ ]N }! Q < Q Q Q H6 X!u XG ltUi~WK WL WM WN WO lo Wbp kZyj i:j vFr*C"j uXGBPL Ic UQc:k  qn\ ~I KI YI gD  ujA"k  Op\:l  lYBxyo G"l  T u`Yo o~ |N JMWyk  ejrI@ M OL^Z]"o {:o H R UUb Q rYhI NZ \HiZ wOxD&kSp b bDo M sZ @@  Mj ZYn grm tp Byl  No ZJ fgZtJ CJ Qe _L lYmyFQG_Xz fO  ssi\ M k Zqg gO^uti Dnx Qsm ^H lse{j I l Vjc] qrz ~ jK k  Yy\ fZ tJ Aj MJ ZVAgN  h u~RCbUu c}i qb~]LyuZM hbv_D?HSPda| EC  R:Y ^d kL x:} DyY PZr]MH O2d ]"Y jMI w"} EnV  Q I ]K iSi vp C{i O r \E iR u\i AL N\ Z` gJt] CZPg _o kH x dF] U"\ bk  pTM}m J"|WqI f2ir:\ @o NH [] i` v` C xPH _P@ m ymj|2K J iVN  d QqF @y MF Zg gj s a@I  N{ [wM hv uDBDq  PA \\ j1i xYAE?KS.`aoB o.L { t GM TL a i n+L { NHQWuM eQrR @\ M+`[\ iF waDh SG  `S mp z4X Go S k `D  m g zu} Gr TH ayt no { XGG  Vk  cl  pD  }Dp  Jo WT cD  o[ |DoI^ W:t ep rs@ W  LZYG  gUnto b\roo }m INL Wr co p.H |o IVSVli\Mx&lFAIT&L ]gd ir ukiBbd P"t ]R jT x,` DQL QaK^Yllo {` HM Up bo nd  {+_ H\uT\vb"w p"X  }l JjWD  e1Y qo ~bK|Ynh@ xH EpQo_\ mp zn Fo St  `2M ml  zV Gl S`b7o p8o |Z  H8VUa e`q` @H O | [?pi o x n E\ R:X  _?`l j z:w GXT h S[ _Y lu`y` Gua VZ  bxuo} dyX  qyw ~V  JDnVZ  dY qDp~H LC  X{ dI^ rsq AIx MX  Z` g Xv iEa T``znY  |o Ip  Vp coeoO_ }OiJC  Xo d` q F ~8JN^\MJ  k"M wSi DD  S\i _[c ng[ {QU  H,H T?`aj`o l }kJxXpg?cvhzDhM Ro_J np zo GjT|cjs qyv yW  LKlYyr E] R@v_jv U?Dbq pi|MK\j YYn hq tyMA?NNM \Sj i^ xZ EM RM __ lTyoxG} W\  dOE qEE}SB.^ Q.]  ]Ha  jIqvqk  E?YRsA `so mWzRIsp  Xe  esc rssxMf  ]s j?_wu\  ES RK _L lL  y?dFS  Tt a?fn:v |W I:W  VX cc pq |?xI?tY?ngQouKD<o RZ _gy l ]x_ FySTa} o\  |KIS  Wi dg qo }[  Jf  We  de  qf  ~S  K j X} eo ra i L]Y ]g m uM BKO\_]yk+H yTF } T_ `\xm"v {"W  H\yU Wc Vr ~A q O { \ th z w rD g  R _ ^ m k\B w\} D![ Q\F ]B  j\s w\DMRM `x m\uy\u G w T\v c \pF \w K PX Yg ]vr E\z QD ^\{ j\} w\~ DG Q\ ^R k y jH b  V]  c Fp \~yMM [ Z  h [  u}  AyM]  [ q g p td As  N m Zjgl  uk  B l N f [ e gj tF  C[  PT  ] s jK  w~_  D~^ Q^ __  m UzK  Ie Vy bo o T|uQK0D \k'h2D Oy[ Wi]  x7L D SQT  `R m8A{jJG X[  e8L r8 eL` ZMg_v^ Es Sgz _g] l_  y?_FF T<}  a?o mY zQp G{PTOQb?c s?u@M OYE\z| j?i xV E[  RT  _?e ld  yc  Fb  SN `?` mR zK  G?^ TW asn nD@ |YFIvp WE| cK} oYG{Q I? V]com xOo FYH Sou`M oG |@EI?uNE\meam{ oF |mv IYH VmxcYg sSB R^ Lo Z` f?M rR_  ^ LkPZkz  hcF  u_  AcH Ng[aR pc ~&I Kb Xysdy sy@]  Nfn  Zfegfm ugvC&H Rgo _gm mgw {?b HcoUhv  D?s Pjx]&G mjtzjuI\w Xj@eR e[  s&F @kM&E \~ i&D vM C M O?W [&C h&d u&@ B&A O&B \%H iU uk Bl NU Z &FgT\  m&U ynV Fl \3\h,k D7CP +Sn ~U Jm W|*aS KU Z~,fR RU aQ mP |wU KO WN fuU uD+AklU zi FiRc_`bOD U N K[ Haf j;G 7JB |;L UKG U R D _ Ltk rk _ U  D L Z X pu d lD jc o B hN QU m xz tI uX xg v u kB 9Z a L-m [&Z gU @ |VM S(c }mK Y/x U g nIs s5| @] q DN U R H\_ `a{ t%\ uW A iUX n?m U7l \/c ESR O1e GQV cN g 3Cu ]e x dI] K+f z7Q h(H g9p ]i Zw ZF E9T CRM X_ o:m Wg @gu V\ hjj lvT dKJ BEU y @LZ $D f (k=r &D o (uR{ (|"M p>o *q"m F.O BM} AcJ Pkm @lX KwD \  { JYG Md` *UD NLR /T^ :6l @Qb }ps ]c y @[ q vbL{n>U iTIugH~QFP Nq WDU dvYZq SKIU^\  mc`y ojY ?Co3GBNU IoqZU ~@o iyo zL h]i t <)B O`k_i KV,YUyEUU S QC_Xy b7=o AXl ACD[b G 06uS^yH^U V 0mb LiO {+xa| caU p O-| \0i NAYjU Z Vcf 0rImU { P1GoU x QWE ~B\ gn^ lWL eY c GH| 3D lcC :Rf j.xzU f gar }|S Y^O w`m?<QMU ^ Bk?Qtm f[aU | TIH \AQ?7yR f2K aJ }?o\G xmcU Pj]?Nky y R#G| jU w?QC [=TU Q I(^?r)gU P -y]UVUd "r jJTU ^ g,jr Vt bQnu |~Hw V\dPr u @ pL o T n ]Nft\<aBU cBp\QBrRSt\o6Gft}fZq\NK _jY3XC| [U h\Rt mFU sU @\r)M-yv8Eo8C}8BKUY8<:gUa"o875Q8GFFyLU Z86[fyAU O8E[jq`R Q| _U lQxY_FYtUYqcYpqldU cBp3Xr mJU w-yDY_}jkLUwUE"SQuUoCBrS@Y<jSbm}aZjYC[D;d_YHDC^fGd=mULj QvY7HDYA1L)H }e4ZIYQ'c0e4M JYoqW8e4yHe4gAYIThy |JHIve4JQYH"[y }YI"Jy l YAtyYLUme4IBU K e4TX e4vxlcM^be4f@ e4Vf Y=z|!cR` v!e4mV!e4V C#e4G@Y#Yr)`# Y9I#KB#oe4SP#| c#U p#! 1|#!HJm#\e4iCw#e4w`$!M;W$Ye4R$!CKQ&?e4|H\&!e4TX&!J;l&_Og&!Klv&e4ab&!K8C&!@5{&kwp&wLg&uHs&v:{&0e ?u&0f Ht&0vM|&0y&I&?J>o&?KDm&?LBq&?MEs&?N6x&?O9n'?P9g'?Q=`'?R<]'?SBY'?TB['?U@]'?V]'\wFv'\zM|'\{MI'\xLV'\uHb'\WGj'\N6q'8e =g'8f Hd'8vMl'8y&y'YX0_'YY0O'YZ0'Y[0o'Yo0_'Yq0O'Ys0'Yp0o'Yr0_'Yt0O'