*~@[c ?MC[iɰ [NoneBladeINPlayerController PlayerOwnerCoreWinTopWinLeft WinHeight WinWidthbBoundToParentbScaleToParentSystemEngine LoadClickedAdvancedEngine BroadcastGlobalAnnouncementLogoutDEBUG drawToHUD CloseMenuServerViewNextPlayerDropShadowTextCaptionKarma Lighting CollisionKilledEndGameForce LightColorExec Movement TeamMessageSay MultiTimerCancelClickedMessageLogin PageCaptionUserHandleKeyEvent DOTZMenu GetStringServerReStartPlayerMsgBox ScoreEventTeamSayDisplayProgressMessagePostBeginPlay StartWave WaveCompletePostNetReceiveTimer__OnClick__Delegate DOTZGameAllowRessurectionGetLocalPlayerControllerMOTD StyleName DOTZEngine SetFocusGUIClientOpenMenu MaxWidthGetText ScoreKill PostRender InitGamePlayerCalcView PostLoginReceiveLocalizedMessagePostNetBeginPlaySetProgressMessageSomeoneString TriggerEventNotifyRemoveBot NotifyAddBot CloseAllClientSetViewTargetSplit2EndGameAnnouncementOverridePlayerControllerClassServerSetPitchEndSway ReadyToSay drawQuantityGetSmallFontRef RefreshPRIJoinExclaim__OnKeyEvent__DelegateLowerConsoleCommandFire TextFont PressFireTxt KillsMatRankMatNewWaveWaveCompleted NEW_WAVEAltFireDeadWaitingForWaveTxtRestartPlayer CheckScoreWaveMatSetPageCaption RenderWeight ErrorMessage Capitalize PreventDeath BladeINHUDDeathMessages ModifyPlayer ReduceDamage MutJumpMod TeamSayGUIInitGameReplicationInfo ZDOTZMPSayUpdateSensitivityTempClientReceiveZPlayerControllerCanRestartPlayerTSay DisplayMsg PickTeam CanSpectateBeginLoadProgressFont TabOrder StrShiftInitComponent StrReplace StrSubstDividebRestartLevelIsUpperHUDTypeDeathMessageClassPlayerControllerClassNameIsLower NoButton YesButtonParseKillMessage bMultiLineProgressFadeTimeProgressFontNameLTrim TooManyBotsSetSensitivityTempRTrim RegisterTrim debughud bTeamGamebDelayedStartAction LevelStart InStrFromTargetpickIdCameraRotationCameraLocationBestActionMessage bBehindViewProgressMessageProgressColorbCanDoubleJump AimedPitchStrmyHUDbCenter bRealSpectmpControllerListGameNetMode TimeSecondsnextController botToRemoveReasonCurrentbHideCenterMessagesbBadConnectionAlertinjured ViewTarget KillerName KilledPawnKillerExiting LineCountFontDXFontDY TimeLeftMsgType NewPlayer ViewActorResultMGameRulesModifiers NumPlayersHealth bGameEndedbFoundRankingKills GamertagbOnlySpectator bIsSpectatorDeathsprisPRIMatchIDWinner MOTDLine4 MOTDLine3 MOTDLine2 MOTDLine1 AdminEmail AdminNameTeams MaxLives GoalScorebMatchHasBegun AirControl instigatedByScorePGRIWithReplaceOptionalObject RelatedPRI_2JumpZ Momentum HitLocationDamagesenderOtherDeltaslotIDGUIController ConsoleBKIndexTextKeyGameSpecificLevelInfoSizeXSizeYWaveMultiPlayerLevelInfoWaveSizeIncrementInitialWaveSize AirSpeedsrcProgressTimeOutSetViewTarget SmallFontHudCanvasScaleLine SetDrawColorSetPosDrawTileScaledbAdminCanPauseTeambAllowedToSwitchTeams LocalMessage GUIComponent GUIButton GUILabelGUIFont GameRulesPlayOwnedSound SetTimerType DrawColorfmsgtemp ScriptText MyControllerMyOwner ClickSound cYesButton cNoButtonA HudQuantityC AdvancedPawnXYjiS GameOver RotationAdvancedGameInfoAdvancedPlayerController ReturnValueAlpha MessageInfoSubtitleGuiFont InfoGuiFont BigGuiFontStandardGuiFont SmallGuiFont TinyGuiFontAdvancedCheatClassAdvancedDeathMessage AdvancedHudAdvancedMPGameBaseiEnemyDiffLevel EngineEx LevelInfo GameInfoHUDbDisplayKillsscaleYscaleXBBGui HudCaptionap bClearScreen MyLifeBar MPMessageadvCheatManagerbDisablePawnHudbCloseMenuPending revealTimecurrentInfoMsg BBEditBoxretPlayerReplicationInfoMyPRIDOTZPlayerControllerBaseDOTZPlayerControllerGameReplicationInfo Controller bNameCheat myPRIIndexDOTZXAnnouncerDOTZTInterfaceMutator WaveSizeHudIconINRedWavesHudIconRedKillsHudIconRedPlayerRank InvasionInvasionWaveComplete03InvasionNewWave01InvasionNewWave02InvasionNewWave03InvasionNewWave04InvasionWaveComplete01InvasionWaveComplete02 DamageType TeamInfoCanvasFont InteractionBaseGUIControllerInteractionMasterDOTZMPHudBaseDOTZMPGameBaseLevelPawn MaterialActorPlayer NumWavesWaveRemaining WaveInPlay bFirstWave WAVE_TIMER WAVEDELAYANNOUNCE_DELAY bAllDead StatLocation StatSpace LeftMarginLeftMarginPlusStylePitchOptionsSoundTextureErrorConsole DOTZPageBaseDOTZInGamePage DOTZMPSayFromErrorMessage_lblGetMsgClassPackageInputConstSwitch PlayerInput TextBuffer MaxWaveEnd MinWaveSize MaxInPlaybModerateWaveSizesbScaleDifficulty MaxRespawns RespawnDelaybDontEndLevel FinalWaveRESPAWN_TIMERZombieKillMessagesObjectdmsg KilledName WAITFORPAWN Function bDisplaySign bClearSign debughudd DisplaySignState ChatMsgswibbleREMOVE_CHAT_TIMERoldmsgRankregfontitmpCXCYColorRotatordelim quotechar delimpos quoteposVector bOnlyFirstStructr0r1r2r3r4r5r6r7r8r9 IndexChar StrPropertyStructPropertyArrayPropertyClassProperty NamePropertyObjectPropertyStrTextStrPart OffsetStart OffsetPartFloatPropertydivider leftpart rightpart BoolPropertyparts IntProperty ByteProperty ignoreEmpty RelatedPRI_1V@W@@@RKTOv34 pp9WP: O! FB @6@=@z"S@m9@[@/@:F@G1~@'I(&N?@@@bY@cpC)@`E3K@d@# @zH@ @xD@bl@@jfhP <A%7)zr zh%{hGMhrRzG-S77&7&G77&7&G)7  l@|XZLiS@c!O@T@@WJR@b[\]^xRv2 aS$I؅ IcL9 IcÚ}r IcL9}rÚ*> '] Say To TeamPXOYnZ-[$>$L=$fff?$L>[Wa)Hxu@g@V@r@@E-kme@d@@@qT@TZ@y`{Iw@SLo`78>~o~n0>%>~>  E@B@j\c3%}~y&Ax&Zpp&, &  F@DPM4z@QD@{r2Oΰ+;Ud   J] somethingti{ Ђ6:Q*{FTebAP?AP\;bJq33AP*3IsL93Jq IcY3333333333  )K??JqsߊsߊJqK8 sߊsߊsߊsߊsߊ?APL9< (p@RU@f@J@X@h[E^@_@`abV\@cf@\oYD;HC%@C7ojppjCoeCj  ]~k@[^@m@X}@@T~@n@N@s@t5XG62*z5& 55}5&5  @C;U52*z;& ;;};&;  v@u@v@w@y@L@{@|@}@~@fe.@A@@dC$*M%Fw. % 7?'%%8~' ?8%pp%'8 D''8} ?-@8~' ?B%p%' %  ]^JKRD\J*~{z}##&&##}}$z#}}99#79#7~97&(&77}9v{z&}&&}}&},&  LP@W0H'0CF0 $$$0aD0C9?,F9?&0$$$$0aD JNp43PreventDeath()NLKJ U+j2ppLogout(9V+)w.+*E+pp*** + has left!.+-+ V BP.ppScoreKill(9V 9V)r * r w*w*9?&.self_fragSSw * w*w *Sa/!Sw * 9?& . ?fragww*B w * %j  X%R(ppppppppKilled(S, T, 9VG, 9VP)!-O'GPw*w*Sw*w*Tw*a/!hw*a/!I7M QSTIM5+9ArP{MM!f-'!w!*!a/!w!*!%-O(!!.-O' -V(*Everyone is dead lA:3t%Appppppp



ApppppA**** Game Admin:  ()DA
Z17Z@%1%161Z61MOTD6F19?,L>9? Y8%w*a/!>- r*%9?f-'-( ZW#k$bW48W *,E2U R,O-'kU W \L"s3%4% 3%3kd% 4d 3d --(a,EA( 7@`M1"4&3 St57ppEndGame(9Vtq)tq gIVO!954%)u% 3u'I' _nt6\ppReduceDamage(9Sn9Vm9Vk)nmkECA @@@8@hGQ0ppEndGameAnnouncement(9VG)*w**w*a/!*-(**>a,E(a,(m-( i3KWaveComplete()3--a,E@A(a,@( w2sStartWave()-Y'8--'*Victory!E  J6% E6--'--(4EJ-h^w*Ga/!- Gr*%-(K!e*%9?&-l( HG17<, =%:=7<=<%s=7 , % ~& }, |, {, L, z, y, w, v, uH< '  2342rO 6$$$$$$$$.X,F, 9?, 7.% B9S6..$$$$9?4aaCBCB+9?,9?9?,9?,6$1a9S6..6$9?4a`CBCB+9?,9?9?,9?,6$1a9S6..6$9?4a_CBCB+9?,9?9?,9?,6$'a9S9D$$$$-'-'9:9:$-'C -(CD^
.%7.a.w>CD]
.%w7.a.F-(-V'-V'-b(-V(C-'HC(aAll the Zombies have been defeated!-(-'$A$A$A$ATDFinal Wave-(-'-'HDLag Alert-( 7%aAcxyc`CC7$  %6F N6FN$,%$9D9?9D9?,N7N= $6 Say$$$9=$, TeamSay$$$9=$, Login Logout$$$9=$, Killed$$$9=$, $$$9=$, yc?`a6`x@? kqg Ao^-', l}}e?BladeIN.TeamSayGUI nGf '-'-(-', ss%G7%@%&,z6% p6%/ M!" !/@%&6%s/!/6%p6% teams: 6%TeamSay6%p6% says: 6%Say6%p6% &!& !@%&6%n/!&6%Login6%Logout !Z  !@%&6%p**** 6%Killed ! ] U!$J%@%&6%6%9W/ @%&6%6%9W/J&6%ppppp6% (type: 9W/, sender: s)B7&{6%{6&z6%6&A&&X7,7, {6%p}6%,P%6%@6F%9?,  tx#9[sx n!Q7,!7%9?e9?,9?%A7&&d7%e%eq  u53a(:a!A' F1,Ha=( <@y FSppPostLogin(9V )-r * jw *. Y  -(H pp***   has entered!& 1! set input y mutate yes! 0! set input n mutate no! @YiHppRestartPlayer(9VY)F.Y|Y @{|@A}~$ BAJ4zAA  Dwx*-(, @@N?5z@B@  O10J uPostBeginPlay()Z7%%%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?b % . % .-T' ,  , ,  , ,&  , , , ,-U'. o%  ,  , v& ,  ,  , ppInitialWaveSize=9S )ppWaveSizeIncrement=9S )E -l'--(a,E@9?,(E6,  6%6,sf%cg%g,a49?g' g8475@eI@rpZ6trp  J@aqD+-'qs MP@>@H8^B~@l6B}@w(}@Bw@B'  Q@gmjS7 r* .j4 BBUio2:wDi 2)%f)72)2p)2&B)2&)f2   Y H-{--'w*w*)@'r:*:-z:-zr;:O:(r-(0-'--{ B2@]_GB|_^]\[_+^]\[_z^]\[a @( @c 13487@g 2@_d!Kw*w*w*(ww*%dc\ C@h 5  69kZEdHZ[EFw -(E  eV E-' BB w* -i.wi*iKL%V9?KL.9W-'KCLa-( {-'$$ $ $KcDLa-( nUI0.U,UWUX jUw 539:9:$?BladeIN.ZDOTZMPSay @oK#JjK Z& Ww.*..-'] K uHka& =(  G,sHh[w,*,-',z?,̬?,33?, D[!b>J&J r0-?R>RX,\X9D9?9D9?,R("%%,z"~4w(*{("{("{("4{("B$aAbH|?9??@9?I?9??@9?IH9?"@%,Vz69=X!abH|b@IaIH, ]Xclass ZPlayerController extends DOTZPlayerController; const WAITFORPAWN=2342; state Dead { exec function Fire(optional float F) { bBehindView = true; ServerViewNextPlayer(); ServerRestartPlayer(); } exec function AltFire(optional float F) { if(bBehindView == true) bBehindView = false; else bBehindView = true; ServerRestartPlayer(); } Begin: ServerViewNextPlayer(); } function ServerSetPitch(int Pitch){ // a big accessed none fix if(Pawn == none) return; AdvancedPawn(Pawn).AimedPitch = Pitch; Pawn.PostNetReceive(); } function ServerViewNextPlayer() { local Controller C; local Pawn Pick; local bool bFound, bRealSpec; bRealSpec = PlayerReplicationInfo.bOnlySpectator; PlayerReplicationInfo.bOnlySpectator = true; // view next player for ( C=Level.ControllerList; C!=None; C=C.NextController ) { if ( (C.Pawn != None) && Level.Game.CanSpectate(self,true,C.Pawn) ) { if ( Pick == None ) Pick = C.Pawn; if ( bFound ) { Pick = C.Pawn; break; } else bFound = ( ViewTarget == C.Pawn ); } } SetViewTarget(Pick); ClientSetViewTarget(Pick); if ( ViewTarget == self ) bBehindView = false; else bBehindView = true; //bChaseCam; PlayerReplicationInfo.bOnlySpectator = bRealSpec; } simulated event ReceiveLocalizedMessage( class Message, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { //super.ReceiveLocalizedMessage(Message, switch,RelatedPRI_1, RelatedPRI_2,OptionalObject); super(PlayerController).ReceiveLocalizedMessage(Message, switch, RelatedPRI_1, RelatedPRI_2, OptionalObject); //log("ZPC: RLM("$Message$", "$switch$", "$RelatedPRI_1$", "$RelatedPRI_2$", "$OptionalObject$")"); MPMessage = Message.Static.GetString(Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject); Message.Static.ClientReceive( Self, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); SetMultiTimer(DEATH_MSG, 4, false); } simulated event TeamMessage( PlayerReplicationInfo PRI, coerce string S, name Type ) { if(player != none && player.console != none && player.interactionmaster != none && player.console != player.InteractionMaster.Console) { player.console = player.interactionmaster.console; } if ( myHUD != None ) myHUD.Message( PRI, S, Type ); } function DrawToHud(Canvas c, float scaleX, float scaleY) { local AdvancedPawn ap; if (bClearScreen==true){ c.SetPos(0,0); c.DrawTileScaled(Material'Engine.ConsoleBK', 100, 100); return; } // delegate to the pawn... if ( Pawn != None && !bDisablePawnHud ) { ap = AdvancedPawn( pawn ); if ( ap != None ) ap.drawToHud( c, scaleX, scaleY ); myLifeBar.drawQuantity( pawn.health, c, scaleX, scaleY ); } C.Font = AdvancedHud(Level.GetLocalPlayerController().myHUD). GetSmallFontRef(); //AdvancedHud(Level.GetLocalPlayerController().myHUD).UseMediumFont(C); C.bCenter = true; c.SetPos( scaleX, 375 * scaleY ); C.DrawText(BestActionMessage); //C.DrawText(C.Font); C.bCenter = false; C.Font = Font'Engine.SmallFont'; if (MPMessage != ""){ C.bCenter = true; C.SetDrawColor(240,32,32,200); C.SetPos(scaleX, 910 * scaleY); C.DrawText(MPMessage); C.bCenter = false; //MyHUD.Message(self.PlayerReplicationInfo, MPMessage,'Killed'); //MPMessage = ""; } } exec function ReadyToSay(){ if (Level.NetMode != NM_StandAlone){ ClientOpenMenu("BladeIN.ZDOTZMPSay"); } } exec function TSay() { ClientOpenMenu("BladeIN.TeamSayGUI"); } exec function Action(){ // to fix an Accessed None in AdvancedPlayerController if(AdvCheatManager == none) advCheatManager = new(Self) AdvancedCheatClass; super.Action(); } // fixes some Accessed None errors simulated event PostNetReceive(){ if (bCloseMenuPending == true && Player !=None && Player.GUIController != None){ Player.GUIController.CloseAll(true); bCloseMenuPending = false; } } 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() { SetMultiTimer(WAITFORPAWN, 0.1, false); //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; } break; } super.MultiTimer(slotID); } exec event SetProgressMessage( int Index, string S, color C ) { 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; } } |T&w* oclass 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; } v@x2 w,͖ Ic IcL9 IcÚ}r*> '= Say To All-Wj//----------------------------------------------------------- // $DATETIME: 21/04/2006 6:43:06 PM$ //----------------------------------------------------------- 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().Say(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; } Zclass 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); } yqu2zcdE_RL9L9L9L9   x//----------------------------------------------------------- // //----------------------------------------------------------- class DeathMessages extends AdvancedDeathMessage; CPW!w* yP 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="Arial" Height=10 ANTIALIAS=1 CHARACTERSPERPAGE=32 CHARS="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_ -=~[]\{}|;':,./<>?" class BladeINHUD extends DOTZMPHudBase; var localized string WaitingForWaveTxt; var localized string PressFireTxt; var Material WaveMat; var Material KillsMat; var Material RankMat; var localized bool bDisplaySign; var localized bool bClearSign; var int debughudd; var localized Array DisplaySign; struct DisplayMsg { var string Msg; var string Type; var float TimeLeft; }; var localized 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; // Start by setting up our MOTD sign to display, and a timer to get rid of it function PostBeginPlay() { super.PostBeginPlay(); //bDisplaySign = True; //MOTD(); SetTimer(0.1, false); } // Clear the MOTD timer function Timer() { SetTimer(0.0, false); //bDisplaySign = False; MOTD(); SetMultiTimer(REMOVE_CHAT_TIMER, 8.0, True); } 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++; 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(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 float FontDX, FontDY; local float CX, CY; currentInfoMsg.revealTime = Level.timeseconds; // draw the real stuff last... C.SetDrawColor(200, 0, 0, 255); super.drawToHUD( c, scaleX, scaleY ); C.SetDrawColor(200, 0, 0, 255); DOTZPlayerControllerBase(Player).RefreshPRI(4); regfont = C.Font; 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.DrawColor.A = 255; C.DrawText(String(DOTZPlayerControllerBase(Player).pris[DOTZPlayerControllerBase(Player).myPRIIndex].Ranking)); StatLocation += StatSpace; 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.A = 255; C.DrawText(string(DOTZPlayerControllerBase(Player).pris[DOTZPlayerControllerBase(Player).myPRIIndex].Kills)); StatLocation += StatSpace; 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.DrawColor.A = 255; C.DrawText(string(int(Player.PlayerReplicationInfo.Team.Score))); StatLocation += StatSpace; 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; } bClearSign = true; } else { if(bClearSign == true) { bDisplaySign = false; bClearSign = false; } } if(Player.GameReplicationInfo.MatchID == 666) { C.bCenter = true; C.SetPos( scaleX, 200 * scaleY ); C.DrawText("All the Zombies have been defeated!"); 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, "Final Wave"); C.bCenter = false; } if(bBadConnectionAlert == true) { C.bCenter = true; DropShadowText(C, scaleX, 800 * scaleY, "Lag Alert"); 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(255,255,255,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); } } } exec function MOTD() { local string m; local GameReplicationInfo GRI; local int x, i; GRI = Player.GameReplicationInfo; m = GRI.MOTDLine1 $ "
" $ GRI.MOTDLine2 $ "
" $ GRI.MOTDLine3 $ "
" $ GRI.MOTDLine4 $ "
"; m = m $ "**** Game Admin: "$GRI.AdminName$" ("$GRI.AdminEmail$")"; Split2(m, "
", DisplaySign); i = DisplaySign.Length; ChatMsgs.Insert(0,i); for(x = 0; x < i; x++) { ChatMsgs[i-x].Msg = DisplaySign[x]; ChatMsgs[i-x].Type = "MOTD"; ChatMsgs[i-x].TimeLeft = Level.TimeSeconds + 20 + (0.2*x); } //if(bDisplaySign == true) bDisplaySign = false; //else bDisplaySign = true; } function DropShadowText(Canvas C, float X, float Y, string text){ //draw black C.SetPos(X, Y); C.SetDrawColor(0,0,0); C.DrawText(Text); //draw colour text C.SetPos(X-2, Y-1); C.SetDrawColor(255,0,0,255); C.DrawText(Text); // TODO: Figure out how to save the current RGB status before resetting it //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("BINHUD: DisplayProgressMessage()"); TimeLeft = PlayerOwner.ProgressTimeOut - Level.TimeSeconds; if( TimeLeft >= ProgressFadeTime ) Alpha = 255; else Alpha = (255 * TimeLeft) / ProgressFadeTime; GRI = PlayerOwner.GameReplicationInfo; LineCount = 0; for (i = 0; i < ArrayCount (PlayerOwner.ProgressMessage); i++) { if (PlayerOwner.ProgressMessage[i] == "") continue; LineCount++; } if (GRI != None) { if( GRI.MOTDLine1 != "" ) LineCount++; if( GRI.MOTDLine2 != "" ) LineCount++; if( GRI.MOTDLine3 != "" ) LineCount++; if( GRI.MOTDLine4 != "" ) LineCount++; } C.Font = LoadProgressFont(); C.Style = ERenderStyle.STY_Alpha; C.TextSize ("A", FontDX, FontDY); X = (0.5 * HudCanvasScale * C.SizeX) + (((1.0 - HudCanvasScale) / 2.0) * C.SizeX); Y = (0.5 * HudCanvasScale * C.SizeY) + (((1.0 - HudCanvasScale) / 2.0) * C.SizeY); Y -= FontDY * (float (LineCount) / 2.0); for (i = 0; i < ArrayCount (PlayerOwner.ProgressMessage); i++) { if (PlayerOwner.ProgressMessage[i] == "") continue; C.DrawColor = PlayerOwner.ProgressColor[i]; C.DrawColor.A = Alpha; C.TextSize (PlayerOwner.ProgressMessage[i], FontDX, FontDY); C.SetPos (X - (FontDX / 2.0), Y); C.DrawText (PlayerOwner.ProgressMessage[i]); Y += FontDY; } /*if( (GRI != None) && (Level.NetMode != NM_StandAlone) ) { C.DrawColor = MOTDColor; C.DrawColor.A = Alpha; if( GRI.MOTDLine1 != "" ) { C.TextSize (GRI.MOTDLine1, FontDX, FontDY); C.SetPos (X - (FontDX / 2.0), Y); C.DrawText (GRI.MOTDLine1); Y += FontDY; } if( GRI.MOTDLine2 != "" ) { C.TextSize (GRI.MOTDLine2, FontDX, FontDY); C.SetPos (X - (FontDX / 2.0), Y); C.DrawText (GRI.MOTDLine2); Y += FontDY; } if( GRI.MOTDLine3 != "" ) { C.TextSize (GRI.MOTDLine3, FontDX, FontDY); C.SetPos (X - (FontDX / 2.0), Y); C.DrawText (GRI.MOTDLine3); Y += FontDY; } if( GRI.MOTDLine4 != "" ) { C.TextSize (GRI.MOTDLine4, FontDX, FontDY); C.SetPos (X - (FontDX / 2.0), Y); C.DrawText (GRI.MOTDLine4); Y += FontDY; } }*/ } simulated event PostRender(Canvas C) { if ( !bHideCenterMessages && (PlayerOwner.ProgressTimeOut > Level.TimeSeconds) ) DisplayProgressMessage(C); super.PostRender(C); } //=========================================================================== // Default Properties //=========================================================================== sHCGF9-0HH  }~q>} #] IcJq IcJq Ic Ic Ic66663333333 Ic Ic3 Ic33 Ic33 Ic333333 Ic666666JqJq33pj3pjpjpj333333pjpj333333pjpj333333 Ic?>3 Ic? Ic6Jq33 Ic?33333 Ic63333 Ic633333333JqJq33333333? Ic? Ic Jq7< (h]ECWaiting for New Wave
Press Fire or Alt-Fire to change viewpoint`].-Press fire to start -- Visit Undeadgames.comkabT]UWindowFonts.Tahoma20S$?A Y{Hw*w*$?"A(' BI4RP-' w*w*N'-(  E@F@Q@]// 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 class BladeIN extends DOTZMPGameBase config; var config int InitialWaveSize; // Can be set to override all map entries 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 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 const WAVE_TIMER = 69; // generic ID # const WAVEDELAY = 5; // 5 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 config array ZombieKillMessages; // Messages to announce when someone is killed by a zombie // TODO: Level Specific Wave Settings (INZombieTown = big) // TODO: Find a correct way to transmit info to the HUD besides using "MatchID" event InitGame(String options, out String error){ bAdminCanPause = true; super.InitGame(options, error); } event PostBeginPlay() { 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 if(InitialWaveSize == 0) InitialWaveSize = WaveMultiPlayerLevelInfo(Level.GameSpecificLevelInfo).InitialWaveSize; if(WaveSizeIncrement == 0) WaveSizeIncrement = WaveMultiPlayerLevelInfo(Level.GameSpecificLevelInfo).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(AdvancedGameInfo(Level.Game).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); } } 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 (PlayerController(C).CanRestartPlayer()){ super.RestartPlayer(c); } } event PostLogin( PlayerController NewPlayer ){ Debug("PostLogin("$NewPlayer$")"); if(NewPlayer == none) return; if(NewPlayer.myHUD != none) { // eliminate an Accessed None in AdvancedGameInfo.. or maybe not.. damn AdvancedHud(NewPlayer.myHUD).register( self ); super.PostLogin(NewPlayer); } NewPlayer.PlayerReplicationInfo.bOnlySpectator = false; Level.Game.Broadcast(NewPlayer.Pawn, "*** "$NewPlayer.PlayerReplicationInfo.GamerTag$" has entered", 'Login'); // TODO: Sometime check and see if this works NewPlayer.TeamMessage(NewPlayer.PlayerReplicationInfo, "set input y mutate yes", 'exec'); NewPlayer.TeamMessage(NewPlayer.PlayerReplicationInfo, "set input n mutate no", 'exec'); } function StartWave(){ local Controller P; Debug("StartWave()"); bNameCheat = true; if(FinalWave == true) { EndGame(none, "Victory!"); } WaveSize = InitialWaveSize + (WaveSizeIncrement * NumWaves); 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; } function WaveComplete(){ Debug("WaveComplete()"); 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; } function bool TooManyBots(Controller botToRemove){ //if(++AntiLagCounter % 3 != 0) return true; if(WaveRemaining > 0) { if(MaxInPlay > 0 && WaveInPlay >= MaxInPlay) return true; //if(WaveInPlay >= WaveSize) return true; return super.TooManyBots(botToRemove); } return true; } function NotifyAddBot(){ WaveRemaining -=1; WaveInPlay++; super.NotifyaddBot(); } function NotifyRemoveBot(){ WaveInPlay--; //log("NotifyRemoveBot: MinWaveSize="$MinWaveSize$", WaveInPlay="$WaveInPlay$", WaveRemaining="$WaveRemaining); if (WaveRemaining <= 0 && WaveInPlay <=0){ WaveComplete(); } if(MinWaveSize > 0 && WaveRemaining <= MinWaveSize && WaveInPlay <= MinWaveSize && finalwave == false) { SetMultiTimer(WAVE_TIMER, 8, false); } super.NotifyRemoveBot(); } function MultiTimer(int SlotID){ //Debug("MultiTimer("$slotID$")"); if(SlotID == RESPAWN_TIMER) AllowRessurection(); switch(SlotID){ case WAVE_TIMER: 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 bool bAllDead; local Controller P; local int x; local string dmsg; local string KillerName, KilledName; Debug("Killed("$KillerName$", "$KilledName$", "$KilledPawn$", "$damageType$")", 'BladeIN'); bAllDead=true; super.Killed(Killer, Killed, KilledPawn, damageType); if(Killer != none && Killer.PlayerReplicationInfo != none) KillerName = Killer.PlayerReplicationInfo.GamerTag; if(Killed != none && Killed.PlayerReplicationInfo != none) KilledName = Killed.PlayerReplicationInfo.GamerTag; if(Killed != none && Killed.IsA('PlayerController')) { if(Killer != none && !Killer.IsA('PlayerController')) { // killed by zombies.. i hope? x = Rand((ZombieKillMessages.Length)); dmsg = class'GameInfo'.Static.ParseKillMessage( KillerName, KilledName, ZombieKillMessages[x]); } else { dmsg = Level.Game.DeathMessageClass.static.GetString( int(Killer == Killed), Killer.PlayerReplicationInfo, Killed.PlayerReplicationInfo, damageType); } if(dmsg != "") Level.Game.Broadcast(Killer, dmsg, 'Killed'); if(MaxRespawns != -1) { Killed.PlayerReplicationInfo.bOnlySpectator = true; } for ( P = Level.ControllerList; P!=None; P=P.nextController ) { if ( P.IsA('PlayerController') ) { if (P.Pawn != none && P.Pawn.Health > 0){ bAllDead=false; } } } if (bAllDead == true && bDontEndLevel == false){ EndGame(None, "Everyone is dead"); } } } 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 ){ Debug("Logout("$Exiting$")"); if ( PlayerController(Exiting) != None ){ Level.Game.Broadcast(Exiting.Pawn, "*** "$Exiting.PlayerReplicationInfo.GamerTag$" has left", 'Logout'); if ( PlayerController(Exiting).PlayerReplicationInfo.bOnlySpectator ){ NumPlayers--; } } super.Logout(Exiting); } final function Debug(string str, optional name from) { //log("DEBUG: " $str); Level.Game.Broadcast(self, from $ ": "$ Str, 'Debug'); } function LevelStart() { // eliminate some Accessed None errors Debug("LevelStart()"); if(Level.GetLocalPlayerController() != none) super.LevelStart(); } function bool PreventDeath(Pawn Killed, Controller Killer, class damageType, vector HitLocation) { Debug("PreventDeath()"); return super.PreventDeath(Killed, Killer, damageType, HitLocation); } function EndGame(PlayerReplicationInfo Winner, string Reason) { Debug("EndGame("$Winner@Reason$")"); super.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); } NME)MQlN?( p^"r*  B_z41LevelStart()/w9* H5!#=QQ= KM$#:9$?(' NLP -X$?"QA(' QOv):'19:v,  *--9:v,$*' Ga6nS1~x_JqJqK8 JqK8 sߊsߊ? Ic?sߊsߊ?sߊsߊsߊsߊsߊ?sߊ?sߊyc1dsߊsߊsߊ?sߊsߊ?sߊsߊK8 JqK8 sߊsߊJqK8 sߊ?JqsߊsߊsߊsߊL9sߊJqsߊsߊsߊsߊL9sߊ?sߊ?sߊ?sߊ6Jqsߊsߊsߊ?sߊ666JqsߊsߊsߊsߊL9sߊ?sߊ6> Ic IcY Ic?JqK8 Ic Ic? Ic Ic Ic Ic Ic66Jqc䍤Jqc䍤Jq6($7   cY dYRQIS\]K]BladeIN.BladeINHUDLOM]BladeIN.ZPlayerControllerUV@"P $L>$L>$@?$>-OK;]BBRoundButton $?$ff&?$L>$>6Wa ]Cancel;]BBRoundButton $?$>$L>$>C"6Wa$MEnter message:_MPlainSmGuiFontR $Ga>$L=$?$L?m$fff?@"( $L>$L>$@?$>M MLgLSLMLELbLJLNL{M7LULRLlM<JNLqLPJoL|LoJnM>LxLSL}LkLOL^LrbGJrLLM*LGbFSnLbSRJrLwU{JLGyqJrOtLFEQM]LRJRFUSgMVLjMzLPL|LOLLV_MAJuUWJmLMJqEhJhLQJRywGULVLLLHULLkJELtLmLNO~OSODLXJ|LHLfEFbRJSLBL>SMJ\MWyOUUggM}LpSbLILeVO}JkU|JJJtbbpJyVsbbsLFJQEYEZbHb#b1 hCJEUOE[E\bEbwb5OebMLObLbTU{b^b#bUzbFFiOebCbbDb_OAbiSIJGbEbtbVLvFKbQb!bbGSDL`SHS~Uab%OTJynb#bLgLjUyb5LiJEHubSEBb0bSbWb4bGEfLhb1LyU}bIOlyrbU~UPJJ CuSzSybUUkbfb^SjSSLQbBSILQUKHLU`bBbUP C[ C\ CZO B_ B` Ba Bb Bc Bd B^OcFiSKJ_E]E^b)OTbHJ-b ?hqua @vW MvS]Yv*agvS@uvc uw BxS~ OxS} [x gxF txhAy3a Oy3f \y@ hyDTtyE Czt OzW \zf hza uzT B{O{q ]{ j{f w{D D|c P|w \|g i|e v|fB}3A P}v \}m h}a u}H A~N M~3gY~f g~f s~@ @1c MS[ ZpgE uaBf PT\Su jSt wg CSS Pu ]f is ubAg Oi\f jN viB@ QI ^c jf v?PdCSY gD tDX @3C L3d Y?e f*@ s* @_ Mn Zz gesa- C3D P} \` i+v u?d Bs O3m [a h?fuj CkPX^P l%yp IvrU3B GB TST a?i nSX zSY GD@ T*C aM ndzSv H{To bcok ~w JDs VV bXoSU }RxJR XC eo rN o L3c XQ eM r?`Ag @g M?\|Zc Vw c)dod }~J>a Xc eSs r.s ~~ JHZWa' frss<V f{_ rDt QDW ^SV kSW xSZ E+g R+a _ST l)Gy)eG%T V?h b?` o?k|?aK?bZ?c i%g v%VCd Q?YQ^?~oScDg S@ `SdlP {ShHL VK c g pA }?X?JD I?U?UC TB aA nc {@ G T} a| n{ {z Ha Ux beol mKhZnimxX F?FaSvtnBeQa?DLo{l II VH[b?pSpDoSZsSBLMSVY?:roS8zaS#g[SLsBl uSM,Al ml ySGESVILStcU?i x.p Dh Pl \l hSQotS3[cS2y~?Gowa f?Iog=x^*uV _}5kf9`?%l Y?#yE?58~?1+vl aSFQm<i ~SiVJ h `l layxGl US#a?J*DSw;nl i?N,uS1Yal z?j FV Pl \?th?svl D?Z+P?r{ l ISD0U?qE?pS] al mhy?HaG?ohhvdDSDRl Vcc?ohqvYl OGu[2T PS\ \Zf hSytoc |!aHl iSxvSw~EPFdVIBzUJ|T F#eRH1wDl h:shu?[(]?0P EY4hXUT+}7Y4zhxhbaY4uJ:Y4euHdY4ClW7o?Y4Mf?CNsqaA7 ub@pW@l f4[raPMaO\ankSY4izaE;c^9^S_BWa53Ya$FLLpRLl aa [mOpHOl Wa)DcZgRgARr ORl \7K&ha]=Na^IKaJOTaK&c