Áƒ*žE@@EJPGK}Q2{˜Oµ:cI>½ÄE@None FindUser ServerMutateConsoleCommandDisplayAccessErrorClientMessageDeleteElementReplaceCharacters SendTextFixHTMLParseForUsernameSuperWebAdminAddSortedElementCore AddElement SaveDataEngineSystemUpdateDefaultMaps ElementsNumDisplayOPBanErrorGenerateMapListSelect ShutdownReloadExcludeMaps AddMessageGenerateGameTypeOptionsExtractDynaDataSelElem QuickSetConfPadLeft ServerTravel GetPassword UsedMutatorsQueryRestartPageCheckIPPolicy KickPlayer SetDynaDataAdjustDynaPeriods GetStrTimeGenerateQuickSetOptions SepRightChangePasswordGenerateMutatorListSelectQueryEditListInitParseForPasswordConsoleQueryAutoListReloadIncludeMapsBroadcastMessageQueryCurrentQuickSetQueryCurrentMvrControlQueryDefaultsChangePasswordQueryBlankPageQueryWelcomePageAuthenticateAutomatonQuerySuperAdminWebAdminDisplayTournamentErrorQuerySuperAdminQuerySuperAdminMenuUpdateURLMutatorsQuerySuperAdminServerQuerySuperAdminQuickSetConfigQueryCurrentConsoleSendQuerySuperAdminMvrConfigQueryDefaultsQueryDefaultsRulesQueryCurrentConsoleLogQueryCurrentMutatorsQueryQueryDefaultsMaps QueryBanlistQueryCurrentConsoleUWebQueryDefaultsMenuQueryDefaultsSettingsQueryCurrentMenu QueryCurrent QueryMenu QueryRootQueryDefaultsBotsGenerateMapListOptionsQueryCurrentGameQueryDefaultsIPPolicyQueryCurrentPlayersLoadGameTypesFormatMessage ApplyMapListQueryDynalist QueryOptionsQueryEditDynaList AddDynaBanReplaceCharacterSepLeft CheckAppsAddUserCheckDynaPolicy CleanBans DeleteUser CheckUser SWAConfigQueryCurrentRules LoadMutators sVersion sApplication bKickPlayersbAnnounceKicksSuperServerAdminSpectatorSuperServerAdminSuperImageServer OPBanWatcher OPBanMutatorOPBanConfigUTOPBanConfigOP OPBanConfigOPBan AnnounceTag DefBanDays GetLocalURL AddIPPolicyopbans WelcomePagebLocalizedMessagesPlayerMessagebTeamMessagesReceivedMsgMaxbClientMessages AdminRealm CurrentPage MenuPage RootPageCurrentMenuPageCurrentIndexPageCurrentPlayersPageCurrentGamePageCurrentConsolePageCurrentConsoleLogPageCurrentConsoleSendPageDefaultSendTextCurrentMutatorsPageCurrentRestartPage DefaultsPageDefaultsMenuPageDefaultsMapsPageDefaultsRulesPageDefaultsSettingsPageDefaultsBotsPageDefaultsIPPolicyPageDefaultsRestartPage MessageUHTM DefaultBGHighlightedBG BlankPageCurrentRulesPageCurrentQuickSetPageCurrentMvrControlPageMoveElementDownMoveElementUpDefaultsChangePasswordPageSuperAdminPageSuperAdminMenuPageSuperAdminServerPageSuperAdminWebAdminPageSuperAdminWebAdminPage2SuperAdminWebAdminPage3SuperAdminRestartPageSuperAdminQuickSetConfigPageSuperAdminMvrConfigPage OPBanListCheckReplacementMutate DynaListFailAuthentication OPBanOptions EditOPListTeamSay EditUTListClientVoiceMessageSay EditDynaListReceiveLocalizedMessage TeamMessagePostBeginPlay PreBeginPlay PlayerPawnUserQueryAutoDynaList UserCountTimer Privileges UserList ClearUsersChangeUsername UserExists bCleanPolicyBotConfigTypebHardCoreMode FragLimit TimeLimit bMegaSpeedNextMapFriendlyFireScaleGoalTeamScore TempScore bAdjustSkill bRandomOrder NextGame BotConfig MaxTeams MutatorListNumDefaultClassesDefaultBaseClass NextDefault FirstMapTestMap IncludeCountNumMutatorClasses TempItem IpServerUdpServerUplink DoUplinkBotpack GameStyleDeathMatchPlus TeamGamePlusChallengeBotInfoCTFGameAssault FRIENDLYFIRE DominationLastManStandingbUseTranslocatorbBalanceTeams bTournamentbMultiWeaponStay bDumbDownTournamentGameInfobForceRespawnbPlayersBalanceTeamsUTServerAdmin MinPlayers GameTypeTemp2 UsernameDataURI ServerURL ResponseRequest GetVariableWebApplicationSubst ClearSubst IncludeUHTMGetVariableCountGetVariableNumber ImageServer WebRequest WebResponsePageOutputFoundSortkTransReplaceWidth SelectedItem MessageIDSender PlayerID TeamName MOTDLine3 AdminName ElapsedTimeRemainingTime tempClassStrTextbAcceptPolicybAcceptAddressMaskPolicyLastMatchingPolicyAddressbSuperRelevant bDeleteMe NextDesc NextMutator BaseMutator MapPrefix MapListType GamePasswordAdminPasswordpos PawnListPauserDay NewClassOptionalObject RelatedPRI_1bBeep PasswordUTServerAdminSpectator nextPawnReason ListItem MessageListReceivedMsgNumbVoiceMessagesTempMsg GameTypeList IncludeMaps ExcludeMapsIncludeMutatorsExcludeMutatorsOutStr ResponseStr SelectedStrPadStr MapListClassCurrentGameType OptionStr GroupPagePlayerListSubstTempStr PawnCount NewGameTypeSendStr LogSubstLogStrPageStr MoveCount FragNamePlayersBalanceTeams ForceRespawn WeaponsStay TournamentUseTranslocatorAutoAdjustSkill RandomOrder BalanceTeams DumbDownBotDifficulty bDoUplink bJustMovedTargetMutppsTempsec intScoresecsGameNext RecipientbAdminStatusCharElemPRI MessageTypebWaitingPlayer bIsSpectatorbIsABotScore PlayerName MOTDLine4 MOTDLine2 MOTDLine1 AdminEmail bBlockLogLastMsg GameClassopconf Watchersopbw bInitialisedMId opmutatorbUseSystemInibLockIniChoiceopbm DynaPolicies bReadyToPlay MutateStringPrevP DefBanMaps RelatedPRI_2 CheckDay sAutoName sAutoPassURLIPcntMaxBans MaxUTBansIPmarkerOtherOneDayOneMapDayscommentMapName BanIndexIPDelim DaysDelim MapsDelimBanData Difficulty PlayerListBanDaysBanMapsPingbDenysPolicyBanIP PlayerIP PlayerNickGetPlayerNetworkAddress SecsCount CheckState Spectator2opmainOtherMutators URLMutatorsMaxSpectators bWorldLogPause GameSpeed IPPolicies MaxPlayersMaps ServerName AirControl bIsPlayerMapList LocalMessageGetNextIntDesc GetNextIntType GameNameTest SpectatorMessagingSpectatorCountertempActorsChecked UTGLEnabled EMEnabled OPBanEnabled MVR2Enabled bBTScoresBanPage DynaPageopb TempItem2MPosjbAddedi ScriptTextS ReturnValueStaticSaveConfig SuperAdminBGInStrDynamicLoadObject PlayersBGGameBG ConsoleBG MutatorsBGRulesBG RestartBG QuickSetBG MvrControlBG LoginTemp MuteStringDayTempMapTempTimeMuteSpectatorsMutator ArrayNum LevelInfoPubComsStringMapsBG SettingsBGBotsBG IPPolicyBG PasswordBG OPBanListBG EditUTListBG EditOPListBG DynaListBGEditDynaListBG TickRate GameInfo NewPassword1 NewPassword2PlayerReplicationInfo Password1 Password2GameReplicationInfoLevelOPBanOptionsBG MvrConfigBGActorPawnOptName MutatorsTour MaxScorePlayersSelect SpecSelectForcePlayersSetPlayerNetConnection RangeBase PolicyCountMaxClientRateIPTempPath CleanList KickPLayers AnnounceSysIniCount bIsOPListItemCnt MaxCount DropCount EditListData ItemData ListNameMessageTitleTagMapClassPackageCharNum StrLenghtConfigCharPosStrTempInput OutActor CommaNum CommaLocbOPBanEnabledbForceUTGLModeOffSwitch TextBufferObjectbTickrateInSettings FunctionPrivsStruct Counter2 StrProperty OrigUsername NewUsernameStructProperty OrigPassword NewPasswordClassProperty NamePropertyObjectPropertyFloatProperty BoolProperty IntProperty ByteProperty ColonNumœD dÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_ãG„œµÏxW œd]UTServer - Webadmin{"~] admin:admin}"]a_Public iCTF:BotPack.InstaGibDM:BotPack.CTFGame::0:20:true:true:false:0:N/A:1:100:35:false:12:2ÝecNormal TDM:BotPack.NoRedeemer:BotPack.TeamGamePlus:true:0:20:false:true:false:100:2:1:100:35:falseÝ_]Normal CTF:BotPack.NoRedeemer:BotPack.CTFGame:true:0:20:false:true:true:0:N/A:1:100:35:falseÝb`Instagib CTF:BotPack.InstaGibDM:BotPack.CTFGame:true:0:20:false:true:false:0:N/A:1:100:35:false9 €…G ¢E M rÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿWЙ+¢œÔX > £Y‘{#U¿ > £Y > £Y > £YŒŽ”©Ù«ŒŽ”©Ù«ŒŽ”©Ù«ŒŽ”©Ù«ŒŽ”©Ù«ŒŽ”©Ù«ŒŽ”©Ù«  œBÓiÓjÓt]OPBanu"Eôs q kÿÿÿÿÿÿÿÿ øÿÿÿÿÿÿÿÿÿÿ6 á†^»ôž o錎”©Ù«¦=$:e‘{#U¿‘{#U¿‰C†ªÑ‰C†ªÑ‰C†ªÑ  œy} ~Ó|ÓzÓ 2@s€ƒn@@z Oozhh:F—B &OO’~Oh&¦B r~Ohy›rÿÿÿÿO€OrO  Z€ƒ2‰€…€ƒC r‰Q€ƒú@@@@Nú@@a€…X@@O€…V ‰‰F@Hv@:‰$‰€ƒ&€…`I€…q@X‰€ƒ*€ƒW@\‰4€…@@NO@@o€ƒ ‰7@2@@i@~C.‰€…D€ƒb|€ƒ`€ƒm€ƒdC¢@ ~ sÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿC‰Z¢é¢œÔXWЙ+WЙ+ŒŽ”MÉ#ÑMÉ#ÑŒŽ”©Ù«ŒŽ”©Ù«WЙ+ŒŽ”WЙ+ŒŽ”WЙ+WЙ+WЙ+WЙ+WЙ+WЙ+WЙ+  œh]OPBang]V0.7€ƒ?€…\g@h@^v€ƒU@@^@@,€…J€…`€ƒ|@^ @sn€ƒm€…v‰g@b€ƒ@D€…p€…x@A~@vq€ƒff-€…M@@@€ƒ5@"€ƒG@Dx€ƒ`€ƒoz€…h Y€ƒClD saq@R€@O@€ƒ^|AN@@t ‰l€…{Wyf«t@e@W‰V€ƒS€…@o‰V@@bB €@F@8y €‰^OG@` €@V@xB@k€…SZ@ix oe €@X€ƒH@cj@CQ ‰B@_tUG@[ C #QyPiA@@A‰‰@=@¢B | nÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿB ~ ¢œÔXWЙ+WЙ+ > £Y > £Y‘{#U¿WЙ+WЙ+WЙ+WЙ+WЙ+WЙ+WЙ+WЙ+WЙ+  œBI€h€…W€…fJ ‰]@b€…@^¦Y A oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ MÉ#Ѧ=$:e¢œÔXWЙ+ŒŽ”B ~ B ~ B ~ B ~   œ@_R@@@Q@R@M@@Bc@@D@S@w@}L@@i €3@@]€@b@@c@@d@@}@@Zc@@F€TL@@+€ƒDp@@@@@f €@D@|@r €‰w@J |jA(s`LN‰m@g@@E@j ‰X@^€@I@F @K@R¦U _@N@V@a@i@F@/J€ @KI@h@a@c@G @@@d@i{}@_€…pC@@w ‰q€‰p €‰`J€ƒu¥t‰@g@~1@@{@@[@dC}@@@MzF@]@p€ƒw@K€‰kh @@R@‰k€ƒ@@@h€ƒ|€ƒ<€…Q@@@df@eP@Y@j €@I@^@_@Ey@S@@rMX@V@@]@D @K@@@€…€ƒ@K@€ƒl@@€ƒs@@~@t@{u@\W@A@S€…@@C@}@@Us €‰@t@@I€…r€ƒ@A €@G @X@P@Q@R@S@T@U@V@@M@Y@I @_e@n‰g€@wE@B@xU\TX \€j@k@lHff@Y€~W€zSR€@x@u@d €@Gy@@P€ƒy@@{@@U €@K@}€ƒ|@@B @F@ub @@A@€ƒE@Q€ƒG@o@@lj@@g@@a@@J@\@@g @@@k @@i@@f@@[@T@u ‰X@Y@{@\@^@_€‘@|@_@c@g@@d@h@i@l@@j@m@n@no@ Ëw@w O€…b@Zr €@¢@[@[C €¢B@H@@[ €@mE_ @~@\ €@] €L@N@v“@Y €@] €@P€Q€@€@T€U€V€@rB€@@o€[€@] €@]€@@¦@€b€tal €@l€@R €@i €@[¦V@J €F €‰O@¦K€d€ƒ| €@az @@B€‰e€…~@] €…A@@@ h€x €‰r@H€…M>€…M @@K Q @x €@N @m@s €@o €@S @k €@V @L€@R €m€@V €@P €@L €D€‘N€Y €@l@u@F {C qÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ` ‰ºÿ»WЙ+  œxr pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿa 2Ò¡WЙ+  œ6@@ @e €…€ƒu€@P@@i @@K@@k T €@O €@I€…s€@q €@t€@s€@p€@J€@q €@w €@j €@f @T€…y€…~ €@s€…X €H } €@ €‘ÊR { mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿA t”p~Êz…Ñ I œz.////////////////////////////////////////////////////////////////////////// // // Unreal Tournament Ban List Extender // ----------------------------------- // // Programmed by PurplePants@purplemetalflake.co.uk // // Copyright © PurplePants, 2002-2004 // // Watcher class (SuperWebAdmin.OPBanWatcher) // ////////////////////////////////////////////////////////////////////////// class OPBanWatcher extends Actor; var OPBanConfig opconf; // Where our config is var PlayerPawn Target; // The player we're watching var int SecsCount; // How long we've been watching var int ID; // The instance of this watcher // Saved info in case we lost the player before reporting... var string PlayerIP; var string PlayerNick; var int CheckState; // Which check we should be doing // Created and set up, this function kicks off the watching function Init() { Log(opconf.sApplication$": Watcher "$ID$" starting"); CheckState = 0; SetTimer(1.0, True); // Do checks every second } // Called periodically by the timer, we keep looking to see if the PRI has // been set up yet and, if so, do the IP checking on the player we're watching // the kill ourselves. event Timer() { local int i, BanIndex; // Just check that something hasn't gone wrong... SecsCount++; if (SecsCount > 15) { Log(opconf.sApplication$": Watcher "$ID$" aborting after 15 secs without target acquisition"); ShutDown(); } // The player to check must still exist... if (Target == none) ShutDown(); if (CheckState == 0) // Check IP address against perma ban list { PlayerIP = Target.GetPlayerNetworkAddress(); i = InStr(PlayerIP, ":"); if (i != -1) PlayerIP = Left(PlayerIP, i); if (PlayerIP != "") { PlayerNick = Target.PlayerReplicationInfo.PlayerName; Log(opconf.sApplication$": Watcher "$ID$" checking IPPolicy for "$PlayerIP); if (!opconf.CheckIPPolicy(PlayerIP)) { opconf.KickPlayer(Target, -1); Log(opconf.sApplication $ ": Denied connection for "$PlayerIP); ShutDown(); } else CheckState = 1; } } else if (CheckState == 1) // Check IP against dyna ban list { if (PlayerIP != "") { Log(opconf.sApplication$": Watcher "$ID$" checking DynaPolicy for "$PlayerIP); BanIndex = opconf.CheckDynaPolicy(PlayerIP); if (BanIndex != -1) { opconf.KickPlayer(Target, BanIndex); Log(opconf.sApplication $ ": Denied connection for "$PlayerIP); ShutDown(); } else ShutDown(); } } else CheckState = 0; // Put things back on track if we get here } function ShutDown() { Log(opconf.sApplication$": Shutting down watcher "$ID$" after "$SecsCount$" seconds"); Destroy(); } D MÂg @ uO² -S @  }  ÂÿÿYek MX+ ¹èŒY,ú.{M ŠB1f%ÍU{M ŠB51f&Í~{MŠB101f,ͧ{MŠB151f,ÍÍ{MŠB201f,¹{MŠUpdateJMŠPolicyNo-1[šÿÿÿÿ%[‚–Y{ ¥%­–Y PxyFxJMŠDayCountyJMŠMapCountFppMŠReason:(FPMŠIPMask­{Py{F ppppppP=Sx,Sy!F­ ppppP=Sx,Sy b«{MŠDeleteJMŠPolicyNo-1«™%v‚–“Y&{  ’& ¥Ÿš“Y&  b%a–Y { ,!†ppBStypesubmitU+—f‘,2f‘,2,!†ppBStypehidden¡,2²Mf,2,)†RangeppS’M& - S’M,2Ò-r,†NickLogNick/Loginð,†NickLogNick,™ob_ipdyna-h.uhtmM‚–’M,2{  PxyF,†IPMaskP,†DayCountSx,†MapCountSy,†Reason ]F,†Ident (F,.†PostActionpdynalist?PolicyNo=S,™ob_ipdyna-d.uhtm¥,†PostActiondynalisti„™’f&‘Y,2 z’f&,2 ,†DayCountS N ,†MapCountS M ,†Comment,™ob_ipdyna-s.uhtm,™ob_ipdyna-f.uhtm eM T"€H,`ŠSortNameGŠReasonVzGGNone•åÔw*½‚‚w. *w˜*w.Ì. Ç*Ñ{(ŠpmuteS˜°ž-lkz )pstatus ˜¡'1 (punmute ˜¡› &pmute ˜¡Î &pmute ˜¡ã $ {+ŠpBanPlayerS˜°W{ŠDynBan#. Ã#€#~#:«zŠPeriodType1kJŠPeriodValuel%ÕlJŠPeriodValuek%¡-rjppppŠReason:˜¡*^=-:; /  +pgetlogin ˜¡'*^=-:;jppŠReason:˜¡*^=-:; [#klj0________________________________________5 - Your IP has been banned from the server!0  p - Reason : GkzŠPeriodType1@pp - Period : ŠPeriodValue Days´@pp - Period : ŠPeriodValue Maps)p - by Admin : — p - Your IP : #0________________________________________a! #. Ã •› "##€#~#:0________________________________________5 - Your IP has been banned from the server!0  p - Reason : G)p - by Admin : — p - Your IP : #0________________________________________ô-rçppppppppppSuperWebAdmin: — has added IP Ban for player '˜¡(login:  +pgetlogin ˜¡')', IP: #, with reason 'G'.„ çppppppppSuperWebAdmin: — has added IP Ban for player '˜¡', IP: #, with reason 'G't%È –t,2¾ zt•›£È ¥t‹  –t,2t•›£pDENY,#•›baã ã {,ŠpKickPlayerS˜°0________________________________________2 - You have been kicked from the server!0  p - Reason : G)p - by Admin : —0________________________________________d -rçppppppppSuperWebAdmin: — has kicked player '˜¡(login:  +pgetlogin ˜¡')' with reason 'G'.× çppppppSuperWebAdmin: — has kicked player '˜¡'with reason 'G'.a½{*ŠpBanLoginS˜°ƒzŠBanLoginType1)pDone by Admin : —çppppppppSuperWebAdmin: — has given a local LoginBan to player '˜¡(login:  +pgetlogin ˜¡')' with reason 'G'. 8ppplocalban ˜¡&r=G½)pDone by Admin : —çppppppppSuperWebAdmin: — has given a global LoginBan to player '˜¡(login:  +pgetlogin ˜¡')' with reason 'G'. 3pppban ˜¡&r=Gãj•åÊ%w*³%‚‚-Ê-þr.** ‰cz˜¡Player³%¥e5˜-Æâ-ržž] (Bot)ØÜ-ržpppppp
óžpppp
™‚‚-(˜-ö˜-Èg. –wg*{g-Ï] (Ready)–] (Waiting ...)ØИ-ö] (Spectator)Ø]w. *#. Ã#€#~#:$#´-rv  +pgetlogin ˜¡'¿z 0pgetmutestatus ˜¡'1qUnMuteËqMuteô˜-ÆvCPUA$z€v,[UTGL]vNotLogged/ErrorAAzvvNotLoggedx˜-Æe-H0:00žppppppppppppppž
 ˜¡]
˜½ 
S˜¿
H
#
v
N/A
uHSD˜µžppppppppppppppž
 ˜¡]
˜½ 
S˜¿
H
#
v
N/A
±Q-®´˜µ?%H0:00NjD¯?ИµN‚—j& –jÏDD­?j?,<"–D, hp0SD2hpSDHppS‘j,<:hpHSD˜µžppppppppppppppppppž
 ˜¡]
˜½ 
S˜¿
H
#
v
”$ù"-lz )pstatus ˜¡'1qUnMuteqMuteö˜-ÆH0:00žppppppppppppž
 ˜¡]
˜½ 
S˜¿
H
#
N/A
ö"Ï -, ´˜µ?%H0:00Ì jD¯?ИµÌ ‚—j& –jÏDD­?j?,<  –D, hp0SD° hpSDHppS‘j,<:hî HSD˜µžppppppppppppppppž
 ˜¡]
˜½ 
S˜¿
H
#
”$žppppppppppppž
 ˜¡]
˜½ 
S˜¿
SD˜µ
#
` Í$Name¬˜¡% %Team¬˜½,0% H%Ping¬S˜¿,0% ÿÿ¬SD˜µ,0%š%r~*~³%~ ~ãè|&—e%1&|`Score~.&w*IpžI§ñ%y&~y&w*IpIž§<&Ë&I** No Players Connected **]'‚š•›Âõ%$›•›Âá%Xp - TimeLeft -&“•›Âá,™'Xp - TimeLeft &•›Âõ¾'{•ýi(Paused)H)-rO܆BanLoginType
BanLogin Type:  
O/†BanLoginBanLoginOX†GoodiesUTGL-Login:Mute/UnMute‹)‹)-lO1†GoodiesMute/UnMute¸)-O†ScoreBest Cap:Ö)O†ScoreScore:ï*w9*O†IPBanType Dynamic IP Ban for O†PlayerListI+-(Oi†CurrentGameppppp•›Âà in •ð(Tournament)Xiï+OY†CurrentGamepppp•›Âà in •ðXiO†PostActionTO†Sort`O™pT.uhtm I [Y— ùõØ-x -N-~ -X- -Y-C9-rM QR VC{[ŠApply-xK[ŠDoCleanupfalse-~K[ŠDoKickfalse-K[ŠDoAnnouncefalseM[ŠAutoPassR[ŠAutoName—9-s-CK[ŠUseSysInifalse -N-x -X-~ -Y- QM VR79-s9-r-C9b bp-xk†DoCleanup checkedš-~k†DoKick checkedÈ-k†DoAnnounce checkedõ-Ck†UseSysIni checkedk†AutoNameRk†AutoPassMf9-sk†IniLockLocked–k'†IniLockRequires level restartk†PostAction{k™ob_options.uhtm O kLÔ®sqkŠPageM_†DefaultBGOPQRSTUVq ´TOQ ÊMPQ àVQQ öPRQ \SQ "RTQ 8LUQ N^VQ ÿÿR›k—È%_‘†PlayersppppppPlayer List_†GameppppppCurrent Game_”†ConsoleppppppServer Consolez—k—È&_†MutatorsppppppMutators_‰†RulesppppppRules_ÆRestartpppppp Restart Level ì—k—È,_†QuickSetppppppQuick Setì-~_”†MvrControlppppppMvr Control_™pU.uhtm_¯ K 0Rg¿r8{0ŠSwitchGameTypeAndMap•apppp0ŠMapSelect?game=0ŠGameTypeSelect?mutator= (4†TitlePlease Wait4ņMessageppppThe server is now switching to map '0ŠMapSelect' and game type '0ŠMapSelect'. Please allow 10-15 seconds while the server changes levels.çppppppSuperWebAdmin: User 0— has switched map to '0ŠMapSelect' and game type to '0ŠMapSelect'.4 ™1p{0ŠSwitchGameTypev0ŠGameTypeSelectM“©v ov4†GameTypeButton4S†MapButton4g†GameTypeSelectpppMñ4†MapSelecto4†PostActionM4™pM.uhtmpÅ{0ŠSwitchMap•Zpppp0ŠMapSelect?game=V•›¤?mutator= (4†TitlePlease Wait4–†MessageppThe server is now switching to map '0ŠMapSelect'. Please allow 10-15 seconds while the server changes levels.çppppSuperWebAdmin: User 0— has switched map to '0ŠMapSelect'.4 ™1poV•›¤4H†MapButtonó„—0—È,r‚‚š0—È, -(0›0—È%4˜†GameTypeSelectppSwitch Game Type:4g†GameTypeButton47†MapSelectop€V•~V•..unr4†PostActionM4™pM.uhtm Q | MÇršJ| ŠPageVs&†IndexURIppU?Page=Js†MainURIJs™pK.uhtms¯ u€…S P 5½Bq.u™pi.uhtmu¯ Qclass SuperImageServer expands ImageServer; event Query(WebRequest Request, WebResponse Response) { Super.Query(Request, Response); } T z 6›MmÍz —È ^&y †StatusPublic ModeratorB ‹,y†StatusPublic AdminB ¼,y †StatusServer ModeratorB é,y†StatusServer AdminB ,y†StatusSuper Admin !!!B ÿÿy†StatusNone, heh.ByT†OPBan
OPBan v0.7(by PurplePants) - Enabled!
y™pV.uhtmy¯ W {N~ife†CurrentBGe†DefaultsBG@e †ServerNameD{ŠGroup3 ºKe†CurrentBGþ å3e†DefaultsBGþ ûc@þ ÿÿe)†CurrentURIppf?Group=Ke*†DefaultsURIppf?Group=38š{—È,e™†SuperAdminppppppSuperAdmine™pW.uhtme¯ L U+Ö ?þ!-DKOPBan|,ú3KUT|,2?{UŠApply@{UŠCheck<%†SmallTitleMass Edit Problem<-†TitleNo browser scripting available £Y…Dˆÿ¹žtÈ‘{#U¿á†^»žtÈ‘{#U¿á†^»žtÈ‘{#U¿á†^»žtÈ‘{#U¿á†^»žtÈ‘{#U¿…Dˆÿ¹žtÈ‘{#U¿…Dˆÿ¹ > £Y…Dˆÿ¹…Dˆÿ¹…Dˆÿ¹…Dˆÿ¹žtÈ‘{#U¿á†^»žtÈ‘{#U¿…Dˆÿ¹žtÈ‘{#U¿WЙ+žtÈžtÈžtÈžtÈ…Dˆÿ¹žtÈ…Dˆÿ¹žtÈ…Dˆÿ¹žtÈ…Dˆÿ¹žtÈžtÈžtÈ > £YŒŽ”©Ù«žtÈžtÈžtÈžtÈžtÈ…Dˆÿ¹žtÈžtÈ…Dˆÿ¹žtÈ‘{#U¿á†^»žtÈ‘{#U¿…Dˆÿ¹žtÈ‘{#U¿ŒŽ”©Ù«ŒŽ”©Ù«ŒŽ”©Ù«žtÈ…Dˆÿ¹žtÈ‘{#U¿žtÈžtÈžtÈžtÈžtÈ…Dˆÿ¹žtÈ…Dˆÿ¹žtÈ‘{#U¿á†^»žtÈ‘{#U¿…Dˆÿ¹žtÈ‘{#U¿žtÈ…Dˆÿ¹žtÈ‘{#U¿…Dˆÿ¹žtÈ…Dˆÿ¹…Dˆÿ¹žtÈ‘{#U¿á†^»žtÈ‘{#U¿á†^»žtÈ‘{#U¿žtÈ…Dˆÿ¹…Dˆÿ¹žtÈ‘{#U¿á†^»žtÈ‘{#U¿á†^»žtÈ‘{#U¿žtÈŒŽ”žtÈžtÈžtÈžtÈ‘{#U¿žtÈ‘{#U¿‰C†ªÑ‰C†ªÑ‰C†ªÑžtÈ‘{#U¿žtÈ‘{#U¿žtÈ‘{#U¿‰C†ªÑžtÈ‘{#U¿žtÈ‘{#U¿žtÈ‘{#U¿žtÈ‘{#U¿ > £YžtÈ‘{#U¿ > £Yá†^»žtÈ‘{#U¿á†^»žtÈ‘{#U¿žtÈ‘{#U¿žtÈ‘{#U¿‰C†ªÑ‰C†ªÑžtÈ‘{#U¿žtÈ‘{#U¿žtÈ‘{#U¿žtÈ‘{#U¿‰C†ªÑ‰C†ªÑžtÈ‘{#U¿žtÈ‘{#U¿žtÈ‘{#U¿žtÈ‘{#U¿žtÈ‘{#U¿žtÈ‘{#U¿‰C†ªÑ‰C†ªÑžtÈ‘{#U¿žtÈ‘{#U¿žtÈ‘{#U¿žtÈ‘{#U¿á†^»žtÈ‘{#U¿žtÈ‘{#U¿‰C†ªÑ‰C†ªÑžtÈ‘{#U¿žtÈ‘{#U¿žtÈ‘{#U¿žtÈ‘{#U¿žtÈ‘{#U¿žtÈ‘{#U¿‰C†ªÑ‰C†ªÑžtÈ‘{#U¿žtÈ‘{#U¿žtÈ‘{#U¿žtÈ‘{#U¿‰C†ªÑ‰C†ªÑžtÈ‘{#U¿žtÈ‘{#U¿žtÈ‘{#U¿žtÈ‘{#U¿‰C†ªÑžtÈ‘{#U¿‰C†ªÑžtÈ‘{#U¿‰C†ªÑžtÈ‘{#U¿‰C†ªÑžtÈ‘{#U¿‰C†ªÑžtȉC†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑŒŽ”©Ù«'n 6ŒŽ”©Ù«'n 6ŒŽ”©Ù«'n 6ŒŽ”©Ù«'n 6ŒŽ”ƒkõžƒkõžƒkõžƒkõžƒkõžƒkõžƒkõžƒkõžƒkõžŒŽ”©Ù«'n 6ŒŽ”ƒkõžŒŽ”©Ù«'n 6ŒŽ”ƒkõžƒkõžƒkõž…Dˆÿ¹ƒkõž_ãG„_ãG„…Dˆÿ¹ƒkõžƒkõžƒkõž_ãG„_ãG„…Dˆÿ¹ƒkõžƒkõžƒkõž_ãG„_ãG„…Dˆÿ¹ƒkõžƒkõžƒkõžƒkõž…Dˆÿ¹ƒkõžƒkõžƒkõžƒkõžƒkõžƒkõž_ãG„_ãG„…Dˆÿ¹ƒkõžƒkõžƒkõžƒkõžƒkõžƒkõžƒkõžƒkõžƒkõžƒkõžƒkõžƒkõž_ãG„…Dˆÿ¹ƒkõžƒkõžƒkõžƒkõž_ãG„_ãG„…Dˆÿ¹ƒkõžƒkõžƒkõž…Dˆÿ¹ƒkõž_ãG„ƒkõžƒkõžƒkõž_ãG„…Dˆÿ¹…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹_ãG„_ãG„…Dˆÿ¹ƒkõž…Dˆÿ¹ƒkõžƒkõž_ãG„WЙ+…Dˆÿ¹WЙ+WЙ+…Dˆÿ¹WЙ+ƒkõžƒkõžƒkõžƒkõžƒkõžƒkõžƒkõžƒkõžƒkõž‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ©Ù«ŒŽ”_ãG„_ãG„_ãG„_ãG„‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ©Ù«¥˜©Ù«¥˜‰C†ªÑ‰C†ªÑ©Ù«¥˜©Ù«©Ù«©Ù«¥˜©Ù«¥˜‰C†ªÑ©Ù«¥˜‰C†ªÑ©Ù«¥˜‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ©Ù«ŒŽ”©Ù«©Ù«‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑŒŽ”©Ù«¥˜¥˜‰C†ªÑ¥˜‰C†ªÑ¥˜‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑŒŽ”‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑŒŽ”ŒŽ”©Ù«¦=$:e¦=$:e‰C†ªÑ¦=$:e‰C†ªÑ¦=$:eŒŽ”‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑ‰C†ªÑŒŽ”‰C†ªÑ©Ù«‰C†ªÑ‰C†ªÑŒŽ”ŒŽ”ŒŽ”á†^»_ãG„ŒŽ”C‰Z¢éŒŽ”ŒŽ”C‰Z¢éC‰Z¢éŒŽ”©Ù«ŒŽ”“-¤%n I œA]menuB]rooty] welcomepageX] blankpage@] currentC] current_menuD]current_indexE]current_playersF] current_gameG]current_consoleH]current_console_logI]current_console_sendJ]say K]current_mutatorsL]current_restartY]current_rulesZ]current_quickset[]current_mvrcontrolM] defaultsN]defaults_menuO]defaults_mapsPMdefaults_rulesQ]defaults_settingsR]defaults_botsS]defaults_ippolicyT]defaults_restart^]defaults_changepassword_= superadmin`]superadmin_menua]superadmin_serverb]superadmin_adminwebadmin1c]superadmin_adminwebadmin2d]superadmin_adminwebadmin3e]superadmin_restartf]superadmin_quicksetconfigg]superadmin_mvrconfigh] banlistk] DynaListm= ob_optionsn= editOPListp= editUTLists] editDynaListU] message.uhtmV] #aaaaaaW] #ffffff[ y Oo›gÏ|y ŠGroupK^T7†Title¨D(SuperWebAdmin 0.95beta)T&†MenuURIppW?Group=|T†MainURI|T™root.uhtm m////////////////////////////////////////////////////////////////////////// // // Unreal Tournament Ban List Extender // ----------------------------------- // // Programmed by PurplePants@purplemetalflake.co.uk // // Copyright © PurplePants, 2002-2004 // // Mutator class (SuperWebAdmin.OPBanMutator) // ////////////////////////////////////////////////////////////////////////// class OPBanMutator extends Mutator; var OPBanConfig opconf; // Where our config is var int Watchers; // Count of watchers spawned (for logging) // Called by IsRelevant when a player logs in, the PRI is not yet set // up so network info is not yet available. This is just a trigger to // spawn our watcher for this player. Note that shitloads of other // actors also call this function, so we need to single out the ones // we're interested in and ignore the rest. function bool CheckReplacement(Actor Other, out byte bSuperRelevant) { local OPBanWatcher opbw; if (Other.IsA('PlayerPawn')) // PlayerPawns are what we want { if (opconf.bKickPLayers) // Don't bother if we're not going to kick { opbw = Level.Spawn(class'SuperWebAdmin.OPBanWatcher'); // Create a watcher opbw.opconf = opconf; // Point to our config opbw.Target = PlayerPawn(Other); // Let it know who to watch opbw.ID = Watchers++; // Give it an ID opbw.Init(); // Start it running } } return True; } ÿE Q qVz ÂÿÿÅ^ Ex‹Aý@"c—Ð~‚–—È,-(9  Ü& – ®fO  ÉWN = äV6 = ÿi5 = KM = 5UL = Tù„——È,r‚‚–—È, -(0›—È%T   = ãMЄ——È,r‚‚–—È, -(0›—È%R à = ºV§„——È,r‚‚–—È, -(0›—È%H · = ‘c~„——È,r‚‚–—È, -(0›—È%C Ž = hSU„——È,r‚‚–—È, -(0›—È%? e = ?P,„——È,r‚‚š—È, -(0›—È%D < = R„——È,r‚‚–—È, -(0›—È%!  = í\Ú„——È,r‚‚š—È, -(0›—È%e ê = Y^F‚——È,-~3 V = ºN§——È,! · =  L ——È,2   = 6 3A = Q OJ = ² aŸ ——È,F ¯  =  b ——È,B   = t ca ——È,K q  = Õ d ——È,P Ò  = ¬ }™ „——È,r‚‚–—È, -(0›—È%S ©  = gù ——È%4   = m cZ š—È,: j  = Î M» š—È,; Ë  = / j š—È,= ,  = L} š—È,8   = ñ KÞ š—È,! î  = Ro?š—È,> O = ¾p«‚š—È,-~@ » = ³@är9* ° „——È,r‚‚–—È, -(0›—È%G ° = ¨|Ùr9* ¥•„——È,r‚‚–—È, -(0›—È%X ¥ = '{Îr9* $š—È,Y $ = {Mr9*  „——È,r‚‚–—È, -(0›—È%+ ' = yCr9* „——È,r‚‚–—È, -(0›—È%+ ( = y9r9* õ„——È,r‚‚–—È, -(0›—È%Z  = ÿÿ )ERROR: Page not found or enabled.ûÜ7 Ü& …OPlist/ 'Ù ¤UTlist/ (Ù ÿÿ )ERROR: Page not found or enabled.û lD  €\ €ƒ` }7jÿ? r9*(‰„„| V#{ë}—ë V:„| Q#{ë}Ðë Q(' q€…b _ b?jq†TitleError: q%†MessageOPBan is not loaded.q ™1 n€…e a 9[ä=Ën†TitleError: n††MessageThe server is set to a Tournament mode. You are not allowed to log right now. Wait until the server is public.n ™1 U jZK  lC,úW{jŠApply{jŠCheck@%†SmallTitleMass Edit Problem@-†TitleNo browser scripting available@C†MessageYou were told, but would you listen? Hahaha...bonk@™message.uhtm qj²AddressDatao%Bqm% –mqq™oC Wj"ªAddressData““q&mÀš~W=ÿÿÿÿ¦BÿÞš~W,ÿÿÿÿ¦Bÿo W¥o¥mPB“BoqoV–oCo ¥o& b@†TitleDynamic policyv—B%@%†SmallTitleMass Edit Problem@M†MessageppppLast SB items dropped - only SC allowed.çppppp !: Dynamic policy updated with Sq items (SB dropped).8@†SmallTitleMass Edit@N†MessagepppSq policies stored, space for S“Cq left.çppp !: Dynamic policy updated with Sq items.@™message.uhtm m%»‚–mC{m yppyì, m ¥m^@†SmallTitleMass Edit@†TitleDynamic Policy@†EditListDatay@†PostActiony@™ob_editdyna.uhtm k€…i d Tá<k†TitleError: kK†MessageYou do not have sufficient privileges to access this page.k ™1 L€@ùB { I-Q *{ ~  Âÿÿqm C Dý: 4rC *LC wL*l„|Lžx L-­l selectedopppppppoLL§?o x€@u YGÏ Þe,ú.{Y ŠB1`%ÍU{Y ŠB51`&Í~{YŠB101`,ͧ{YŠB151`,ÍÍ{YŠB201`,Ä{YŠUpdateJYŠPolicyNo-1[šÿÿÿÿ%[‚–e{ ¥%¸–e ppYŠAcceptDeny,YŠIPMask b¶{YŠDeleteJYŠPolicyNo-1¶—%‚–“e&{  ’& ¥ªš“e&  b%l–e{ D!†ppBStypesubmit`6—`‘,2`‘,2D!†ppBStypehidden¡,2½z`,2D)†RangeppS’z& - S’z,2D™ob_ippolicy-h.uhtmzm‚–’z,2{ r~ ,”|€ rDENYD†AcceptCheckD†DenyCheckcheckedÕD†AcceptCheckcheckedD†DenyCheckD,†IPMask ’r&D-†PostActionpbanlist?PolicyNo=SD™ob_ippolicy-d.uhtm¥ÛD†PostActionbanlistî„™’`&‘e,2 z’`&,2 D™ob_ippolicy-s.uhtmD™ob_ippolicy-f.uhtm WË class SuperServerAdmin expands WebApplication config; var SuperServerAdminSpectator Spectator; var UTServerAdminSpectator Spectator2; //config actors var OPBanConfig opconf; var SWAConfig Config; // Main actor... var OPBan opmain; var ListItem GameTypeList; var ListItem IncludeMaps; var ListItem ExcludeMaps; var ListItem IncludeMutators; var ListItem ExcludeMutators; var ListItem OtherMutators; var string URLMutators; var config string MenuPage; var config string RootPage; var config string WelcomePage; var config string BlankPage; var config string CurrentPage; var config string CurrentMenuPage; var config string CurrentIndexPage; var config string CurrentPlayersPage; var config string CurrentGamePage; var config string CurrentConsolePage; var config string CurrentConsoleLogPage; var config string CurrentConsoleSendPage; var config string DefaultSendText; var config string CurrentMutatorsPage; var config string CurrentRestartPage; var config string CurrentRulesPage; var config string CurrentQuickSetPage; var config string CurrentMvrControlPage; var config string DefaultsPage; var config string DefaultsMenuPage; var config string DefaultsMapsPage; var config string DefaultsRulesPage; var config string DefaultsSettingsPage; var config string DefaultsBotsPage; var config string DefaultsIPPolicyPage; var config string DefaultsRestartPage; var config string DefaultsChangePasswordPage; var config string SuperAdminPage; var config string SuperAdminMenuPage; var config string SuperAdminServerPage; var config string SuperAdminWebAdminPage; var config string SuperAdminWebAdminPage2; var config string SuperAdminWebAdminPage3; var config string SuperAdminRestartPage; var config string SuperAdminQuickSetConfigPage; var config string SuperAdminMvrConfigPage; var config string OPBanList; var config string DynaList; var config string OPBanOptions; var config string EditOPList; var config string EditUTList; var config string EditDynaList; var config string MessageUHTM; var config string DefaultBG; var config string HighlightedBG; //var string WhoIsNick; var bool ActorsChecked; var bool UTGLEnabled; var bool EMEnabled; var bool OPBanEnabled; var bool MVR2Enabled; var bool bBTScores; var bool bTournament; //var config string ServerURL; // Store to hold which ban range page is showing var int BanPage; var int DynaPage; event Init() { local OPBan opb; Super.Init(); log("###############################"); log("# SUPER WEBADMIN 0.95beta #"); log("# Author: Rush(rush@u.one.pl) #"); log("###############################"); Spectator = Level.Spawn(class'SuperServerAdminSpectator'); Spectator2 = Level.Spawn(class'UTServerAdminSpectator'); // Spectator.PlayerReplicationInfo.PlayerName="SuperWebAdmin"; Spectator.bAdmin=True; // Spectator2.PlayerReplicationInfo.PlayerName="SuperWebAdmin"; // won't change as long as the server is up if (Config == None) Config = new(None) class'SWAConfig'; OPBanEnabled=Config.bOPBanEnabled; foreach Level.AllActors(class'OPBan', opb) { if (String(opb.Class) == "OPBan.OPBan") { log("SuperWebAdmin: External OPBan is already spawned ! You have to disable it."); OPBanEnabled=False; } } // Find our root class so we can then find the config class... if(OPBanEnabled) { log("SuperWebAdmin: Spawning OPBan ..."); Level.Spawn(class'OPBan'); foreach Level.AllActors(class'OPBan', opb) { if (String(opb.Class) == "SuperWebAdmin.OPBan") { opconf = opb.opconf; opmain = opb; } } } if((Left(string(Level), 3)=="BT-" || Left(string(Level), 5)=="CTF-BT-") && string(Level.Game.class)!="BotPack.CTFGame") { bBTScores=True; } LoadGameTypes(); LoadMutators(); if(DeathMatchPlus(Level.Game).bTournament==True) bTournament=True; } function LoadGameTypes() { local class TempClass; local String NextGame; local ListItem TempItem; local int i, Pos; // reinitialize list if needed GameTypeList = None; // Compile a list of all gametypes. TempClass = class'TournamentGameInfo'; NextGame = Level.GetNextInt("TournamentGameInfo", 0); while (NextGame != "") { Pos = InStr(NextGame, "."); TempClass = class(DynamicLoadObject(NextGame, class'Class')); TempItem = new(None) class'ListItem'; TempItem.Tag = TempClass.Default.GameName; TempItem.Data = NextGame; if (GameTypeList == None) GameTypeList = TempItem; else GameTypeList.AddElement(TempItem); NextGame = Level.GetNextInt("TournamentGameInfo", ++i); } } function LoadMutators() { local int NumMutatorClasses; local string NextMutator, NextDesc; local listitem TempItem; local listitem TempItem2; local Mutator M; local int i; local int j; local int k; local string URL; local int MPos; local class Test; ExcludeMutators = None; Level.GetNextIntDesc("Engine.Mutator", 0, NextMutator, NextDesc); while( (NextMutator != "") && (NumMutatorClasses < 50) ) { TempItem = new(None) class'ListItem'; k = InStr(NextDesc, ","); if (k == -1) TempItem.Tag = NextDesc; else TempItem.Tag = Left(NextDesc, k); TempItem.Data = NextMutator; if (ExcludeMutators == None) ExcludeMutators = TempItem; else ExcludeMutators.AddSortedElement(ExcludeMutators, TempItem); NumMutatorClasses++; Level.GetNextIntDesc("Engine.Mutator", NumMutatorClasses, NextMutator, NextDesc); } IncludeMutators = None; for (M = Level.Game.BaseMutator.NextMutator; M != None; M = M.NextMutator) { TempItem = ExcludeMutators.DeleteElement(ExcludeMutators, String(M.Class)); if (TempItem != None) { if (IncludeMutators == None) IncludeMutators = TempItem; else IncludeMutators.AddElement(TempItem); } // else // log("SuperWebAdmin: Unknown Mutator in use: "@String(M.Class)); } //Get mutators from the startup URL URL=Level.GetLocalURL(); MPos=InStr(URL, "?mutator="); URLMutators=Right(URL, len(URL)-MPos-9); MPos=InStr(URLMutators, "?"); URLMutators=Left(URLMutators, MPos); //add them to the special list for (i=1;i<=ElementsNum(URLMutators);i++) { TempItem = new(None) class'ListItem'; TempItem.Data=SelElem(URLMutators, i); if(InStr(TempItem.Data, ".") == -1) continue; Test=class(DynamicLoadObject(TempItem.Data,class'Class')); if(Test == None) continue; if (OtherMutators == None) OtherMutators = TempItem; else OtherMutators.AddSortedElement(OtherMutators, TempItem); } //leave only mutators not described in the int files for (TempItem = IncludeMutators; TempItem != None; TempItem = TempItem.Next) { OtherMutators.DeleteElement(OtherMutators, TempItem.Data); } URLMutators=""; for (TempItem = OtherMutators; TempItem != None; TempItem = TempItem.Next) { if(URLMutators == "") URLMutators = TempItem.Data; else URLMutators = URLMutators$","$TempItem.Data; } } function UpdateURLMutators(string Str) { local class Test; local int i; local listitem TempItem, TempItem2; local bool bAdded; OtherMutators=None; for (i=1;i<=ElementsNum(Str);i++) { TempItem = new(None) class'ListItem'; TempItem.Data=SelElem(Str, i); if(InStr(TempItem.Data, ".") == -1) continue; Test=class(DynamicLoadObject(TempItem.Data,class'Class')); if(Test == None) continue; if (OtherMutators == None) OtherMutators = TempItem; else { OtherMutators.DeleteElement(OtherMutators, TempItem.Data); TempItem2=ExcludeMutators.DeleteElement(ExcludeMutators, TempItem.Data); if(TempItem2 != None) IncludeMutators.AddSortedElement(IncludeMutators, TempItem2); else { bAdded = True; OtherMutators.AddSortedElement(OtherMutators, TempItem); } } } URLMutators=""; if(!bAdded) return; //leave only mutators not described in the int files for (TempItem = IncludeMutators; TempItem != None; TempItem = TempItem.Next) { OtherMutators.DeleteElement(OtherMutators, TempItem.Data); } for (TempItem = OtherMutators; TempItem != None; TempItem = TempItem.Next) { if(URLMutators == "") URLMutators = TempItem.Data; else URLMutators = URLMutators$","$TempItem.Data; } } function String UsedMutators() { local ListItem TempItem; local String OutStr; if(IncludeMutators == None) return ""; OutStr = IncludeMutators.Data; for (TempItem = IncludeMutators.Next; TempItem != None; TempItem = TempItem.Next) { OutStr = OutStr$","$TempItem.Data; } if(URLMutators != "") OutStr = OutStr$","$URLMutators; return OutStr; } function String GenerateMutatorListSelect(ListItem MutatorList) { local ListItem TempItem; local String ResponseStr, SelectedStr; if (MutatorList == None) return ""; for (TempItem = MutatorList; TempItem != None; TempItem = TempItem.Next) { SelectedStr = ""; if (TempItem.bJustMoved) { SelectedStr = " selected"; TempItem.bJustMoved=false; } ResponseStr = ResponseStr$""; } return ResponseStr; } function String PadLeft(String InStr, int Width, String PadStr) { local String OutStr; if (Len(PadStr) == 0) PadStr = " "; for (OutStr=InStr; Len(OutStr) < Width; OutStr=PadStr$OutStr); return Right(OutStr, Width); // in case PadStr is more than one character } function ApplyMapList(out ListItem ExcludeMaps, out ListItem IncludeMaps, String GameType, String MapListType) { local class MapListClass; local ListItem TempItem; local int IncludeCount, i; MapListClass = Class(DynamicLoadObject(MapListType, class'Class')); IncludeMaps = None; ReloadExcludeMaps(ExcludeMaps, GameType); IncludeCount = ArrayCount(MapListClass.Default.Maps); for(i=0;i GameClass; local ListItem TempItem; local int i; GameClass = class(DynamicLoadObject(GameType, class'Class')); if(GameClass.Default.MapListType == None) return; if (GameClass != None) { for (i=0; i GameClass; local int i; GameClass = class(DynamicLoadObject(GameType, class'Class')); for (i=0; i"$TempItem.Tag$""; } return OptionStr; } function String GenerateQuickSetOptions() { local String OptionStr; local int i; for (i=0;i<20;i++) { if(Config.SelElem(Config.QuickSetConf[i], 1)=="") continue; OptionStr = OptionStr$""; } return OptionStr; } function String GenerateMapListOptions(String GameType, String MapListType) { local class GameClass; local String DefaultBaseClass, NextDefault, NextDesc, SelectedStr, OptionStr; local int NumDefaultClasses; GameClass = class(DynamicLoadObject(GameType, class'Class')); if(GameClass == None) return ""; DefaultBaseClass = String(GameClass.Default.MapListType); if(DefaultBaseClass == "") return ""; NextDefault = "Custom"; NextDesc = "Custom"; if(DynamicLoadObject(DefaultBaseClass, class'Class') == None) return ""; while( (NextDefault != "") && (NumDefaultClasses < 50) ) { if (MapListType ~= NextDefault) SelectedStr = " selected"; else SelectedStr = ""; OptionStr = OptionStr$""; Level.GetNextIntDesc(DefaultBaseClass, NumDefaultClasses++, NextDefault, NextDesc); } return OptionStr; } function String GenerateMapListSelect(ListItem MapList, optional string SelectedItem) { local ListItem TempItem; local String ResponseStr, SelectedStr; if (MapList == None) return ""; for (TempItem = MapList; TempItem != None; TempItem = TempItem.Next) { SelectedStr = ""; if (TempItem.Data ~= SelectedItem || TempItem.bJustMoved) SelectedStr = " selected"; ResponseStr = ResponseStr$""; } return ResponseStr; } function DisplayAccessError(WebRequest Request, WebResponse Response) { Response.Subst("Title", "Error: "); Response.Subst("Message", "You do not have sufficient privileges to access this page."); Response.IncludeUHTM(MessageUHTM); } function DisplayTournamentError(WebRequest Request, WebResponse Response) { Response.Subst("Title", "Error: "); Response.Subst("Message", "The server is set to a Tournament mode. You are not allowed to log right now. Wait until the server is public."); Response.IncludeUHTM(MessageUHTM); } function DisplayOPBanError(WebRequest Request, WebResponse Response) { Response.Subst("Title", "Error: "); Response.Subst("Message", "OPBan is not loaded."); Response.IncludeUHTM(MessageUHTM); } function bool AuthenticateAutomaton(WebRequest Request, WebResponse Response) { if (opmain==None) return False; if ((opconf.sAutoName ~= "" || (Caps(Request.UserName) != Caps(opconf.sAutoName))) || (opconf.sAutoPass ~= "" || (Caps(Request.Password) != Caps(opconf.sAutoPass)))) { return False; } return True; } //***************************************************************************** event Query(WebRequest Request, WebResponse Response) { if (Config.CheckUser(Request.Username, Request.Password)) { // Match query function. checks URI and calls appropriate input/output function if(Config.Privileges[Config.FindUser(Request.Username)]<3 && bTournament) { DisplayTournamentError(Request, Response); return; } switch (Mid(Request.URI, 1)) { case "": case RootPage: QueryRoot(Request, Response); case MenuPage: QueryMenu(Request, Response); break; case WelcomePage: QueryWelcomePage(Request, Response); break; case BlankPage: QueryBlankPage(Request, Response); break; case CurrentPage: QueryCurrent(Request, Response); break; case CurrentMenuPage: QueryCurrentMenu(Request, Response); break; case CurrentPlayersPage: if (Config.Privileges[Config.FindUser(Request.Username)]>2 || (Config.Privileges[Config.FindUser(Request.Username)]<3 && !bTournament) && Config.Privileges[Config.FindUser(Request.Username)]!=0) QueryCurrentPlayers(Request, Response); else DisplayAccessError(Request, Response); break; case CurrentGamePage: if (Config.Privileges[Config.FindUser(Request.Username)]>2 || (Config.Privileges[Config.FindUser(Request.Username)]<3 && !bTournament) && Config.Privileges[Config.FindUser(Request.Username)]!=0) QueryCurrentGame(Request, Response); else DisplayAccessError(Request, Response); break; case CurrentConsolePage: if (Config.Privileges[Config.FindUser(Request.Username)]>2 || (Config.Privileges[Config.FindUser(Request.Username)]<3 && !bTournament) && Config.Privileges[Config.FindUser(Request.Username)]!=0) QueryCurrentConsole(Request, Response); else DisplayAccessError(Request, Response); break; case CurrentConsoleLogPage: if (Config.Privileges[Config.FindUser(Request.Username)]>2 || (Config.Privileges[Config.FindUser(Request.Username)]<3 && !bTournament) && Config.Privileges[Config.FindUser(Request.Username)]!=0) QueryCurrentConsoleLog(Request, Response); else DisplayAccessError(Request, Response); break; case CurrentConsoleSendPage: if (Config.Privileges[Config.FindUser(Request.Username)]>2 || (Config.Privileges[Config.FindUser(Request.Username)]<3 && !bTournament) && Config.Privileges[Config.FindUser(Request.Username)]!=0) QueryCurrentConsoleSend(Request, Response); else DisplayAccessError(Request, Response); break; case CurrentMutatorsPage: if (Config.Privileges[Config.FindUser(Request.Username)]>2 || (Config.Privileges[Config.FindUser(Request.Username)]==2 && !bTournament) && Config.Privileges[Config.FindUser(Request.Username)]!=0) QueryCurrentMutators(Request, Response); else DisplayAccessError(Request, Response); break; case CurrentRestartPage: if (Config.Privileges[Config.FindUser(Request.Username)]>2 || (Config.Privileges[Config.FindUser(Request.Username)]<3 && !bTournament) && Config.Privileges[Config.FindUser(Request.Username)]!=0) QueryRestartPage(Request, Response); else DisplayAccessError(Request, Response); break; case CurrentRulesPage: if (Config.Privileges[Config.FindUser(Request.Username)]>2 || (Config.Privileges[Config.FindUser(Request.Username)]==2 && !bTournament) && Config.Privileges[Config.FindUser(Request.Username)]!=0) QueryCurrentRules(Request, Response); else DisplayAccessError(Request, Response); break; case CurrentMvrControlPage: if (Config.Privileges[Config.FindUser(Request.UserName)]>2 && MVR2Enabled) QueryCurrentMvrControl(Request, Response); else DisplayAccessError(Request, Response); break; case DefaultsRestartPage: if (Config.Privileges[Config.FindUser(Request.Username)]>3) QueryRestartPage(Request, Response); else DisplayAccessError(Request, Response); break; case CurrentQuickSetPage: if (Config.Privileges[Config.FindUser(Request.Username)]>2) QueryCurrentQuickSet(Request, Response); else DisplayAccessError(Request, Response); break; case DefaultsPage: QueryDefaults(Request, Response); break; case DefaultsMenuPage: QueryDefaultsMenu(Request, Response); break; case DefaultsMapsPage: if (Config.Privileges[Config.FindUser(Request.Username)]>3) QueryDefaultsMaps(Request, Response); else DisplayAccessError(Request, Response); break; case DefaultsRulesPage: if (Config.Privileges[Config.FindUser(Request.Username)]>3) QueryDefaultsRules(Request, Response); else DisplayAccessError(Request, Response); break; case DefaultsSettingsPage: if (Config.Privileges[Config.FindUser(Request.Username)]>3) QueryDefaultsSettings(Request, Response); else DisplayAccessError(Request, Response); break; case DefaultsBotsPage: if (Config.Privileges[Config.FindUser(Request.UserName)]>3) QueryDefaultsBots(Request, Response); else DisplayAccessError(Request, Response); break; case DefaultsIPPolicyPage: if (Config.Privileges[Config.FindUser(Request.Username)]>2 || (Config.Privileges[Config.FindUser(Request.Username)]<3 && !bTournament) && Config.Privileges[Config.FindUser(Request.Username)]!=0) QueryDefaultsIPPolicy(Request, Response); else DisplayAccessError(Request, Response); break; case DefaultsChangePasswordPage: if (Config.Privileges[Config.FindUser(Request.Username)]>0) QueryDefaultsChangePassword(Request, Response); else DisplayAccessError(Request, Response); break; case SuperAdminPage: if (Config.Privileges[Config.FindUser(Request.Username)]==5) QuerySuperAdmin(Request, Response); else DisplayAccessError(Request, Response); break; case SuperAdminMenuPage: if (Config.Privileges[Config.FindUser(Request.Username)]==5) QuerySuperAdminMenu(Request, Response); else DisplayAccessError(Request, Response); break; case SuperAdminServerPage: if (Config.Privileges[Config.FindUser(Request.Username)]==5) QuerySuperAdminServer(Request, Response); else DisplayAccessError(Request, Response); break; case SuperAdminWebAdminPage: if (Config.Privileges[Config.FindUser(Request.Username)]==5) QuerySuperAdminWebAdmin(Request, Response); else DisplayAccessError(Request, Response); break; case SuperAdminRestartPage: if (Config.Privileges[Config.FindUser(Request.Username)]==5) QueryRestartPage(Request, Response); else DisplayAccessError(Request, Response); break; case SuperAdminQuickSetConfigPage: if (Config.Privileges[Config.FindUser(Request.Username)]==5) QuerySuperAdminQuickSetConfig(Request, Response); else DisplayAccessError(Request, Response); break; case SuperAdminMvrConfigPage: if (Config.Privileges[Config.FindUser(Request.Username)]==5 && MVR2Enabled) QuerySuperAdminMvrConfig(Request, Response); else DisplayAccessError(Request, Response); break; case OPBanList: if (opmain==none) DisplayOPBanError(Request, Response); else if (Config.Privileges[Config.FindUser(Request.Username)]>2 || (Config.Privileges[Config.FindUser(Request.Username)]<3 && !bTournament) && Config.Privileges[Config.FindUser(Request.Username)]!=0) QueryBanlist(Request, Response); else DisplayAccessError(Request, Response); break; case DynaList: if (opmain==none) DisplayOPBanError(Request, Response); else if (Config.Privileges[Config.FindUser(Request.Username)]>2 || (Config.Privileges[Config.FindUser(Request.Username)]<3 && !bTournament) && Config.Privileges[Config.FindUser(Request.Username)]!=0) QueryDynalist(Request, Response); else DisplayAccessError(Request, Response); break; case OPBanOptions: if (opmain==none) DisplayOPBanError(Request, Response); else if (Config.Privileges[Config.FindUser(Request.Username)]==5) QueryOptions(Request, Response); else DisplayAccessError(Request, Response); break; case EditOPList: if (opmain==none) DisplayOPBanError(Request, Response); else if (Config.Privileges[Config.FindUser(Request.Username)]>2 || (Config.Privileges[Config.FindUser(Request.Username)]<3 && !bTournament) && Config.Privileges[Config.FindUser(Request.Username)]!=0) QueryEditList(Request, Response, True); else DisplayAccessError(Request, Response); break; case EditUTlist: if (opmain==none) DisplayOPBanError(Request, Response); else if (Config.Privileges[Config.FindUser(Request.Username)]>2 || (Config.Privileges[Config.FindUser(Request.Username)]<3 && !bTournament) && Config.Privileges[Config.FindUser(Request.Username)]!=0) QueryEditList(Request, Response, False); else DisplayAccessError(Request, Response); break; case EditDynaList: if (opmain==none) DisplayOPBanError(Request, Response); else if (Config.Privileges[Config.FindUser(Request.Username)]>2 || (Config.Privileges[Config.FindUser(Request.Username)]<3 && !bTournament) && Config.Privileges[Config.FindUser(Request.Username)]!=0) QueryEditDynalist(Request, Response); else DisplayAccessError(Request, Response); break; default: Response.SendText("ERROR: Page not found or enabled."); } } else if (AuthenticateAutomaton(Request, Response)) { // Automaton, so do the special automaton stuff switch (Mid(Request.URI, 1)) { case "OPlist": QueryAutoList(Request, Response, True); break; case "UTlist": QueryAutoList(Request, Response, False); break; default: Response.SendText("ERROR: Page not found or enabled."); } } else { Response.FailAuthentication(Config.AdminRealm); return; } } //***************************************************************************** function QueryRoot(WebRequest Request, WebResponse Response) { local String GroupPage; GroupPage = Request.GetVariable("Group", CurrentPage); CheckApps(); Response.Subst("Title", Config.AdminRealm@"(SuperWebAdmin 0.95beta)"); Response.Subst("MenuURI", MenuPage$"?Group="$GroupPage); Response.Subst("MainURI", GroupPage); Response.IncludeUHTM("root.uhtm"); } function QueryMenu(WebRequest Request, WebResponse Response) { local String SuperAdminBG; Response.Subst("CurrentBG", DefaultBG); Response.Subst("DefaultsBG", DefaultBG); SuperAdminBG=DefaultBG; Response.Subst("ServerName", Config.AdminRealm); switch(Request.GetVariable("Group", DefaultsPage)) { case CurrentPage: Response.Subst("CurrentBG", HighlightedBG); break; case DefaultsPage: Response.Subst("DefaultsBG", HighlightedBG); break; case SuperAdminPage: SuperAdminBG=HighlightedBG; break; } // Set URIs Response.Subst("CurrentURI", RootPage$"?Group="$CurrentPage); Response.Subst("DefaultsURI", RootPage$"?Group="$DefaultsPage); if(Config.Privileges[Config.FindUser(Request.Username)]==5) Response.Subst("SuperAdmin", "SuperAdmin"); Response.IncludeUHTM(MenuPage$".uhtm"); Response.ClearSubst(); } //***************************************************************************** function QueryWelcomePage(WebRequest Request, WebResponse Response) { switch (Config.Privileges[Config.FindUser(Request.UserName)]) { case 1: Response.Subst("Status","Public Moderator"); break; case 2: Response.Subst("Status","Public Admin"); break; case 3: Response.Subst("Status","Server Moderator"); break; case 4: Response.Subst("Status","Server Admin"); break; case 5: Response.Subst("Status","Super Admin !!!"); break; default: Response.Subst("Status","None, heh."); break; } Response.Subst("OPBan", "
OPBan v0.7(by PurplePants) - Enabled!
"); Response.IncludeUHTM(WelcomePage$".uhtm"); Response.ClearSubst(); } //Maybe I'll finish this later ;) /*function QueryWhoIsPage(WebRequest Request, WebResponse Response) { if(Spectator.ServerMutate("whois "$ Response.Subst("WhoIs", Spectator.ServerMutate("whois "$WhoIsNick, true)); Response.Subst Response.IncludeUHTM(WhoIsPage$".uhtm"); Response.ClearSubst(); }*/ function QueryBlankPage(WebRequest Request, WebResponse Response) { Response.IncludeUHTM(BlankPage$".uhtm"); Response.ClearSubst(); } function QueryCurrent(WebRequest Request, WebResponse Response) { local String Page; // if no page specified, use the default Page = Request.GetVariable("Page", WelcomePage); Response.Subst("IndexURI", CurrentMenuPage$"?Page="$Page); Response.Subst("MainURI", Page); Response.IncludeUHTM(CurrentPage$".uhtm"); Response.ClearSubst(); } function QueryCurrentMenu(WebRequest Request, WebResponse Response) { local String Page, PlayersBG, GameBG, ConsoleBG, MutatorsBG, RulesBG, RestartBG, QuickSetBG, MvrControlBG; Page = Request.GetVariable("Page", CurrentGamePage); // set background colors Response.Subst("DefaultBG", DefaultBG); // for unused tabs PlayersBG=DefaultBG; GameBG=DefaultBG; ConsoleBG=DefaultBG; MutatorsBG=DefaultBG; RulesBG=DefaultBG; RestartBG=DefaultBG; QuickSetBG=DefaultBG; MvrControlBG=DefaultBG; switch(Page) { case CurrentPlayersPage: PlayersBG=HighlightedBG; break; case CurrentGamePage: GameBG=HighlightedBG; break; case CurrentConsolePage: ConsoleBG=HighlightedBG; break; case CurrentMutatorsPage: MutatorsBG=HighlightedBG; break; case CurrentRulesPage: RulesBG=HighlightedBG; break; case CurrentRestartPage: RestartBG=HighlightedBG; break; case CurrentQuickSetPage: QuickSetBG=HighlightedBG; break; case CurrentMvrControlPage: MvrControlBG=HighlightedBG; break; } // Set URIs if(Config.Privileges[Config.FindUser(Request.Username)]!=0) { Response.Subst("Players", "Player List"); Response.Subst("Game", "Current Game"); Response.Subst("Console", "Server Console"); } if (Config.Privileges[Config.FindUser(Request.Username)]>1) { Response.Subst("Mutators", "Mutators"); Response.Subst("Rules", "Rules"); Response.Subst("Restart", " Restart Level "); } if (Config.Privileges[Config.FindUser(Request.Username)]>2) { Response.Subst("QuickSet", "Quick Set"); if(MVR2Enabled) Response.Subst("MvrControl", "Mvr Control"); } Response.IncludeUHTM(CurrentMenuPage$".uhtm"); Response.ClearSubst(); } function QueryCurrentPlayers(WebRequest Request, WebResponse Response) { local string Sort, PlayerListSubst, TempStr; local ListItem PlayerList, TempItem; local Pawn P; local int i, PawnCount, j; local string IP; local String LoginTemp, MuteString; local string Reason; local PlayerPawn PP; local String Time; local String Pause; local string comment; local int DayTemp, MapTemp; local string TempScore, sec; local int intScore, secs; Sort = Request.GetVariable("Sort", "Name"); Reason = Request.GetVariable("Reason"); if(Reason == "") Reason = "None"; for (P=Level.PawnList; P!=None; P=P.NextPawn) { if( PlayerPawn(P) != None && P.PlayerReplicationInfo != None && NetConnection(PlayerPawn(P).Player) != None) { if(Request.GetVariable("mute"$string(P.PlayerReplicationInfo.PlayerID), "") != "") { if(EMEnabled) { if(Spectator.ServerMutate("status "$P.PlayerReplicationInfo.PlayerName, true)=="1") Spectator.ServerMutate("unmute "$P.PlayerReplicationInfo.PlayerName); else Spectator.ServerMutate("mute "$P.PlayerReplicationInfo.PlayerName); } else Spectator.ServerMutate("mute "$P.PlayerReplicationInfo.PlayerName); } else if(Request.GetVariable("BanPlayer"$string(P.PlayerReplicationInfo.PlayerID)) != "") { if(Request.GetVariable("DynBan") != "") { IP = PlayerPawn(P).GetPlayerNetworkAddress(); IP = Left(IP, InStr(IP, ":")); if(Request.GetVariable("PeriodType") == "1") { DayTemp = int(Request.GetVariable("PeriodValue")); MapTemp = 0; } else { MapTemp = int(Request.GetVariable("PeriodValue")); DayTemp = 0; } if(UTGLEnabled) comment = Request.GetVariable("Reason")$":"$ReplaceCharacters(ReplaceCharacters(ReplaceCharacters(P.PlayerReplicationInfo.PlayerName, "*", "^"), "=", "-"), ":", ";")$" / "$ReplaceCharacters(ReplaceCharacters(ReplaceCharacters(Spectator.ServerMutate("getlogin "$P.PlayerReplicationInfo.PlayerName, true), "*", "^"), "=", "-"), ":", ";"); else comment = Request.GetVariable("Reason")$":"$ReplaceCharacters(ReplaceCharacters(ReplaceCharacters(P.PlayerReplicationInfo.PlayerName, "*", "^"), "=", "-"), ":", ";"); opconf.AddDynaBan(IP, DayTemp, MapTemp, comment); P.ClientMessage("________________________________________"); P.ClientMessage(" - Your IP has been banned from the server!"); P.ClientMessage(" "); P.ClientMessage(" - Reason : "$Reason); if(Request.GetVariable("PeriodType") == "1") P.ClientMessage(" - Period : "$Request.GetVariable("PeriodValue")$" Days"); else P.ClientMessage(" - Period : "$Request.GetVariable("PeriodValue")$" Maps"); P.ClientMessage(" - by Admin : "$Request.UserName); P.ClientMessage(" - Your IP : "$IP); P.ClientMessage("________________________________________"); P.Destroy(); } else { IP = PlayerPawn(P).GetPlayerNetworkAddress(); if(Level.Game.CheckIPPolicy(IP)) { IP = Left(IP, InStr(IP, ":")); P.ClientMessage("________________________________________"); P.ClientMessage(" - Your IP has been banned from the server!"); P.ClientMessage(" "); P.ClientMessage(" - Reason : "$Reason); P.ClientMessage(" - by Admin : "$Request.UserName); P.ClientMessage(" - Your IP : "$IP); P.ClientMessage("________________________________________"); if(UTGLEnabled) Log("SuperWebAdmin: "$Request.UserName$" has added IP Ban for player '"$P.PlayerReplicationInfo.PlayerName$"(login: "$Spectator.ServerMutate("getlogin "$P.PlayerReplicationInfo.PlayerName, true)$")', IP: "$IP$", with reason '"$Reason$"'."); else Log("SuperWebAdmin: "$Request.UserName$" has added IP Ban for player '"$P.PlayerReplicationInfo.PlayerName$"', IP: "$IP$", with reason '"$Reason$"'"); for(j=0;j<50;j++) if(Level.Game.IPPolicies[j] == "") break; if(j < 50) Level.Game.IPPolicies[j] = "DENY,"$IP; Level.Game.SaveConfig(); } P.Destroy(); } } else { if(Request.GetVariable("KickPlayer"$string(P.PlayerReplicationInfo.PlayerID)) != "") { P.ClientMessage("________________________________________"); P.ClientMessage(" - You have been kicked from the server!"); P.ClientMessage(" "); P.ClientMessage(" - Reason : "$Reason); P.ClientMessage(" - by Admin : "$Request.UserName); P.ClientMessage("________________________________________"); if(UTGLEnabled) Log("SuperWebAdmin: "$Request.UserName$" has kicked player '"$P.PlayerReplicationInfo.PlayerName$"(login: "$Spectator.ServerMutate("getlogin "$P.PlayerReplicationInfo.PlayerName, true)$")' with reason '"$Reason$"'."); else Log("SuperWebAdmin: "$Request.UserName$" has kicked player '"$P.PlayerReplicationInfo.PlayerName$"'with reason '"$Reason$"'."); P.Destroy(); } } if(Request.GetVariable("BanLogin"$string(P.PlayerReplicationInfo.PlayerID)) != "") { if(Request.GetVariable("BanLoginType") == "1") { P.ClientMessage("Done by Admin : "$Request.UserName); Log("SuperWebAdmin: "$Request.UserName$" has given a local LoginBan to player '"$P.PlayerReplicationInfo.PlayerName$"(login: "$Spectator.ServerMutate("getlogin "$P.PlayerReplicationInfo.PlayerName, true)$")' with reason '"$Reason$"'."); Spectator.ServerMutate("localban "$P.PlayerReplicationInfo.PlayerName$"&r="$Reason); } else { P.ClientMessage("Done by Admin : "$Request.UserName); Log("SuperWebAdmin: "$Request.UserName$" has given a global LoginBan to player '"$P.PlayerReplicationInfo.PlayerName$"(login: "$Spectator.ServerMutate("getlogin "$P.PlayerReplicationInfo.PlayerName, true)$")' with reason '"$Reason$"'."); Spectator.ServerMutate("ban "$P.PlayerReplicationInfo.PlayerName$"&r="$Reason); } } } } for (P=Level.PawnList; P!=None; P=P.NextPawn) { if (P.bIsPlayer && !P.bDeleteMe && SuperServerAdminSpectator(P) == None) { TempItem = new(None) class'ListItem'; if(P.PlayerReplicationInfo.PlayerName=="Player") continue; PawnCount++; if (P.PlayerReplicationInfo.bIsABot) { if(UTGLEnabled) TempItem.Data = ""; else TempItem.Data = ""; TempStr = " (Bot)"; } else { if(UTGLEnabled) TempItem.Data = "
"; else TempItem.Data = "
"; if(bTournament && P.PlayerReplicationInfo.bIsSpectator && P.PlayerReplicationInfo.bWaitingPlayer) { PP = PlayerPawn(P); if (PP != None) { if (PP.bReadyToPlay) { TempStr = " (Ready)"; } else { TempStr = " (Waiting ...)"; } } } else if (P.PlayerReplicationInfo.bIsSpectator) TempStr = " (Spectator)"; else TempStr = ""; } if(PlayerPawn(P) != None) { IP = PlayerPawn(P).GetPlayerNetworkAddress(); IP = Left(IP, InStr(IP, ":")); } else IP = ""; if(UTGLEnabled) { LoginTemp = FixHTML(Spectator.ServerMutate("getlogin "$P.PlayerReplicationInfo.PlayerName, true)); if(Spectator.ServerMutate("getmutestatus "$P.PlayerReplicationInfo.PlayerName, true)=="1") MuteString="UnMute"; else MuteString="Mute"; if(P.PlayerReplicationInfo.bIsABot) LoginTemp = "CPU"; else if(Left(LoginTemp, 6) == "[UTGL]") LoginTemp = "NotLogged/Error"; else if(LoginTemp== "") LoginTemp = "NotLogged"; if(P.PlayerReplicationInfo.bIsABot) { if(bBTScores) { TempScore = "0:00"; TempItem.Data = TempItem.Data$"
"$FixHTML(P.PlayerReplicationInfo.PlayerName)$TempStr$"
"$P.PlayerReplicationInfo.TeamName$" 
"$P.PlayerReplicationInfo.Ping$"
"$TempScore$"
"$IP$"
"$LoginTemp$"
N/A
"; } else { TempScore = string(int(P.PlayerReplicationInfo.Score)); TempItem.Data = TempItem.Data$"
"$FixHTML(P.PlayerReplicationInfo.PlayerName)$TempStr$"
"$P.PlayerReplicationInfo.TeamName$" 
"$P.PlayerReplicationInfo.Ping$"
"$TempScore$"
"$IP$"
"$LoginTemp$"
N/A
"; } } else { if(bBTScores) { if(P.PlayerReplicationInfo.Score==0) TempScore="0:00"; else { intScore = int(2000 - P.PlayerReplicationInfo.Score); if ( intScore > 1 && intScore < 1999 ) { secs = int(intScore % 60); if ( secs < 10 ) sec = "0" $string(secs); else sec = "" $string(secs); TempScore = string(intScore / 60) $":" $sec; } } } else TempScore = string(int(P.PlayerReplicationInfo.Score)); TempItem.Data = TempItem.Data$"
"$FixHTML(P.PlayerReplicationInfo.PlayerName)$TempStr$"
"$P.PlayerReplicationInfo.TeamName$" 
"$P.PlayerReplicationInfo.Ping$"
"$TempScore$"
"$IP$"
"$LoginTemp$"
"; } } else if(EMEnabled) { if(Spectator.ServerMutate("status "$P.PlayerReplicationInfo.PlayerName, true)=="1") MuteString="UnMute"; else MuteString="Mute"; if(P.PlayerReplicationInfo.bIsABot) { TempScore="0:00"; TempItem.Data = TempItem.Data$"
"$FixHTML(P.PlayerReplicationInfo.PlayerName)$TempStr$"
"$P.PlayerReplicationInfo.TeamName$" 
"$P.PlayerReplicationInfo.Ping$"
"$TempScore$"
"$IP$"
N/A
"; } else { if(bBTScores) { if(P.PlayerReplicationInfo.Score==0) TempScore="0:00"; else { intScore = int(2000 - P.PlayerReplicationInfo.Score); if ( intScore > 1 && intScore < 1999 ) { secs = int(intScore % 60); if ( secs < 10 ) sec = "0" $string(secs); else sec = "" $string(secs); TempScore = string(intScore / 60) $":" $sec; } } } else TempScore = string(int(P.PlayerReplicationInfo.Score)); TempItem.Data = TempItem.Data$"
"$FixHTML(P.PlayerReplicationInfo.PlayerName)$TempStr$"
"$P.PlayerReplicationInfo.TeamName$" 
"$P.PlayerReplicationInfo.Ping$"
"$TempScore$"
"$IP$"
"; } } else TempItem.Data = TempItem.Data$"
"$FixHTML(P.PlayerReplicationInfo.PlayerName)$TempStr$"
"$P.PlayerReplicationInfo.TeamName$" 
"$P.PlayerReplicationInfo.Ping$"
"$int(P.PlayerReplicationInfo.Score)$"
"$IP$"
"; switch (Sort) { case "Name": TempItem.Tag = P.PlayerReplicationInfo.PlayerName; break; case "Team": TempItem.Tag = PadLeft(P.PlayerReplicationInfo.TeamName, 2, "0"); break; case "Ping": TempItem.Tag = PadLeft(String(P.PlayerReplicationInfo.Ping), 4, "0"); break; default: TempItem.Tag = PadLeft(String(int(P.PlayerReplicationInfo.Score)), 3, "0"); break; } if (PlayerList == None) PlayerList = TempItem; else PlayerList.AddSortedElement(PlayerList, TempItem); } } if (PawnCount > 0) { if (Sort ~= "Score") for (TempItem=PlayerList; TempItem!=None; TempItem=TempItem.Next) PlayerListSubst = TempItem.Data$PlayerListSubst; else for (TempItem=PlayerList; TempItem!=None; TempItem=TempItem.Next) PlayerListSubst = PlayerListSubst$TempItem.Data; } else PlayerListSubst = "** No Players Connected **"; if(Level.Game.GameReplicationInfo.RemainingTime==0 && Level.Game.GameReplicationInfo.ElapsedTime!=0) Time = " - TimeLeft -"$GetStrTime((Level.Game.GameReplicationInfo.ElapsedTime-22)); else Time = " - TimeLeft "$GetStrTime(Level.Game.GameReplicationInfo.RemainingTime); if(Level.Pauser != "") Pause = "(Paused)"; if(UTGLEnabled) { Response.Subst("BanLoginType", "
BanLogin Type:  
"); Response.Subst("BanLogin", "BanLogin"); Response.Subst("Goodies", "UTGL-Login:Mute/UnMute"); } else if(EMEnabled) Response.Subst("Goodies", "Mute/UnMute"); if(bBTScores) Response.Subst("Score", "Best Cap:"); else Response.Subst("Score", "Score:"); if (opmain != none) { Response.Subst("IPBanType", " Dynamic IP Ban for "); } Response.Subst("PlayerList", PlayerListSubst); if(bTournament) Response.Subst("CurrentGame", Level.Game.GameReplicationInfo.GameName$" in "$Level.Title$"(Tournament)"$Time$Pause); else Response.Subst("CurrentGame", Level.Game.GameReplicationInfo.GameName$" in "$Level.Title$Time$Pause); Response.Subst("PostAction", CurrentPlayersPage); Response.Subst("Sort", Sort); Response.IncludeUHTM(CurrentPlayersPage$".uhtm"); } function QueryCurrentGame(WebRequest Request, WebResponse Response) { local ListItem ExcludeMaps, IncludeMaps; local class NewClass; local string NewGameType; if (Request.GetVariable("SwitchGameTypeAndMap", "") != "") { Level.ServerTravel(Request.GetVariable("MapSelect")$"?game="$Request.GetVariable("GameTypeSelect")$"?mutator="$UsedMutators(), false); Response.Subst("Title", "Please Wait"); Response.Subst("Message", "The server is now switching to map '"$Request.GetVariable("MapSelect")$"' and game type '"$Request.GetVariable("MapSelect")$"'. Please allow 10-15 seconds while the server changes levels."); log("SuperWebAdmin: User "$Request.UserName$" has switched map to '"$Request.GetVariable("MapSelect")$"' and game type to '"$Request.GetVariable("MapSelect")$"'."); Response.IncludeUHTM(MessageUHTM); } else if (Request.GetVariable("SwitchGameType", "") != "") { NewGameType = Request.GetVariable("GameTypeSelect"); NewClass = class(DynamicLoadObject(NewGameType, class'Class')); ReloadExcludeMaps(ExcludeMaps, NewGameType); //Disabled in order to load all maps. // ReloadIncludeMaps(ExcludeMaps, IncludeMaps, NewGameType); Response.Subst("GameTypeButton", ""); Response.Subst("MapButton", ""); Response.Subst("GameTypeSelect", NewClass.default.GameName$""); Response.Subst("MapSelect", GenerateMapListSelect(ExcludeMaps)); Response.Subst("PostAction", CurrentGamePage); Response.IncludeUHTM(CurrentGamePage$".uhtm"); } else if (Request.GetVariable("SwitchMap", "") != "") { Level.ServerTravel(Request.GetVariable("MapSelect")$"?game="$Level.Game.Class$"?mutator="$UsedMutators(), false); Response.Subst("Title", "Please Wait"); Response.Subst("Message", "The server is now switching to map '"$Request.GetVariable("MapSelect")$"'. Please allow 10-15 seconds while the server changes levels."); log("SuperWebAdmin: User "$Request.UserName$" has switched map to '"$Request.GetVariable("MapSelect")$"'."); Response.IncludeUHTM(MessageUHTM); } else { ReloadExcludeMaps(ExcludeMaps, String(Level.Game.Class)); //Disabled in order to load all maps. // ReloadIncludeMaps(ExcludeMaps, IncludeMaps, String(Level.Game.Class)); Response.Subst("MapButton", ""); if (Config.Privileges[Config.FindUser(Request.Username)]>3 || (Config.Privileges[Config.FindUser(Request.Username)]==2 && !bTournament) && Config.Privileges[Config.FindUser(Request.Username)]!=0) { Response.Subst("GameTypeSelect", "Switch Game Type:"); Response.Subst("GameTypeButton", ""); } Response.Subst("MapSelect", GenerateMapListSelect(ExcludeMaps, Left(string(Level), InStr(string(Level), "."))$".unr") ); Response.Subst("PostAction", CurrentGamePage); Response.IncludeUHTM(CurrentGamePage$".uhtm"); } } function QueryCurrentConsole(WebRequest Request, WebResponse Response) { local String SendStr, OutStr; SendStr = Request.GetVariable("SendText", ""); if (SendStr != "") { if (Left(SendStr, 4) ~= "say ") { Spectator2.BroadcastMessage(Request.UserName$"(Web): "$Mid(SendStr, 4)); log("SuperWebAdmin: User "$Request.UserName$" has sent a message to server's console('"$Mid(SendStr, 4)$"')."); } else if(Left(SendStr, 7) ~= "mutate " && Config.Privileges[Config.FindUser(Request.Username)]>3) { Spectator.ServerMutate(Mid(SendStr, 7)); log("SuperWebAdmin: User "$Request.UserName$" has used a mutate command('"$Mid(SendStr, 7)$"')."); } else if(Left(SendStr, 6) ~= "admin " && Config.Privileges[Config.FindUser(Request.Username)]==5) { OutStr = Level.ConsoleCommand(SendStr); if (OutStr != "") Spectator.AddMessage(None, OutStr, 'Console'); log("SuperWebAdmin: User "$Request.UserName$" has used a command('"$SendStr$"')."); } else { if (Config.Privileges[Config.FindUser(Request.Username)]==5) { OutStr = Level.ConsoleCommand(SendStr); if (OutStr != "") Spectator.AddMessage(None, OutStr, 'Console'); log("SuperWebAdmin: User "$Request.UserName$" has used a command('"$SendStr$"')."); } } } Response.Subst("LogURI", CurrentConsoleLogPage); Response.Subst("SayURI", CurrentConsoleSendPage); Response.IncludeUHTM(CurrentConsolePage$".uhtm"); } function QueryCurrentConsoleLog(WebRequest Request, WebResponse Response) { local ListItem TempItem; local String LogSubst, LogStr; local int i; for (TempItem = Spectator.MessageList; TempItem != None; TempItem = TempItem.Next) { if(TempItem.Data!="") LogSubst = LogSubst$"> "$FixHTML(TempItem.Data)$"
"; } Response.Subst("LogRefresh", "http://"$Config.ServerURL$Path$"/"$CurrentConsoleLogPage$"#END"); Response.Subst("LogText", LogSubst); Response.IncludeUHTM(CurrentConsoleLogPage$".uhtm"); } function QueryCurrentConsoleSend(WebRequest Request, WebResponse Response) { Response.Subst("DefaultSendText", DefaultSendText); Response.Subst("PostAction", CurrentConsolePage); Response.IncludeUHTM(CurrentConsoleSendPage$".uhtm"); } function QueryRestartPage(WebRequest Request, WebResponse Response) { Level.ServerTravel(Left(string(Level), InStr(string(Level), "."))$".unr"$"?game="$Level.Game.Class$"?mutator="$UsedMutators(), false); Response.Subst("Title", "Please Wait"); Response.Subst("Message", "The server is now restarting the current map. Please allow 10-15 seconds while the server changes levels."); log("SuperWebAdmin: User "$Request.UserName$" has restarted the current map !"); Response.IncludeUHTM(MessageUHTM); } function QueryCurrentMutators(WebRequest Request, WebResponse Response) { local ListItem TempItem; local int Count, i; if (Request.GetVariable("AddMutator", "") != "") { Count = Request.GetVariableCount("ExcludeMutatorsSelect"); for (i=0; i GameClass; local String Map; if (Request.GetVariable("SwitchGameTypeAndMap", "") != "") { ArrayNum = int(Request.GetVariable("GameTypeSelect")); GameType = Config.SelElem(Config.QuickSetConf[ArrayNum], 3); GameClass = class(DynamicLoadObject(GameType, class'Class')); if(Config.SelElem(Config.QuickSetConf[ArrayNum], 4)~="true") Level.ConsoleCommand("set "$Config.SelElem(Config.QuickSetConf[ArrayNum], 3)$" bTournament True"); else if(Config.SelElem(Config.QuickSetConf[ArrayNum], 4)~="false" || Config.SelElem(Config.QuickSetConf[ArrayNum], 4)~="") Level.ConsoleCommand("set "$Config.SelElem(Config.QuickSetConf[ArrayNum], 3)$" bTournament False"); Level.ConsoleCommand("set engine.gameinfo GamePassword "$Request.GetVariable("GamePassword")); class(GameClass).Default.MaxPlayers = int(String(min(max(int(Request.GetVariable("PlayersSelect")), 0),32))); class(GameClass).Default.MaxSpectators = int(String(max(int(Request.GetVariable("SpecSelect")), 0))); class(GameClass).Default.bMultiWeaponStay = bool(Config.SelElem(Config.QuickSetConf[ArrayNum], 9)); class(GameClass).Default.bTournament = bool(Config.SelElem(Config.QuickSetConf[ArrayNum], 4)); if (class(GameClass) != None && class(GameClass) == None) if (class(GameClass) != None) class(GameClass).Default.GoalTeamScore = float(String(max(int(Config.SelElem(Config.QuickSetConf[ArrayNum], 5)), 0))); else class(GameClass).Default.FragLimit = float(String(max(int(Config.SelElem(Config.QuickSetConf[ArrayNum], 5)), 0))); if(class(GameClass) == None){ class(GameClass).Default.TimeLimit = float(String(max(int(Config.SelElem(Config.QuickSetConf[ArrayNum], 6)), 0))); class(GameClass).Default.bForceRespawn = bool(Config.SelElem(Config.QuickSetConf[ArrayNum], 8)); } if(class(GameClass) != None && !ClassIsChildOf( GameClass, class'CTFGame' ) && !ClassIsChildOf( GameClass, class'Assault' ) ) class(GameClass).Default.MaxTeams = Min(Max(int(Config.SelElem(Config.QuickSetConf[ArrayNum], 11)), 2), 4); if (class(GameClass) != None){ class(GameClass).Default.FriendlyFireScale = float(String(min(max(int(Config.SelElem(Config.QuickSetConf[ArrayNum], 10)), 0), 100)))/100.0; class(GameClass).Default.bPlayersBalanceTeams = bool(Config.SelElem(Config.QuickSetConf[ArrayNum], 7));} switch (Config.SelElem(Config.QuickSetConf[ArrayNum], 12)) { case "0": class(GameClass).Default.bMegaSpeed = false; class(GameClass).Default.bHardCoreMode = false; break; case "1": class(GameClass).Default.bMegaSpeed = false; class(GameClass).Default.bHardCoreMode = true; break; case "2": class(GameClass).Default.bMegaSpeed = true; class(GameClass).Default.bHardCoreMode = true; break; } class(GameClass).Default.GameSpeed = min(max(int(Config.SelElem(Config.QuickSetConf[ArrayNum], 13)), 10), 200) / 100.0; class(GameClass).Default.AirControl = min(max(int(Config.SelElem(Config.QuickSetConf[ArrayNum], 14)), 0), 100) / 100.0; class(GameClass).Default.bUseTranslocator = bool(Config.SelElem(Config.QuickSetConf[ArrayNum], 15)); GameClass.Static.StaticSaveConfig(); if(ArrayNum==0 || Config.SelElem(Config.QuickSetConf[ArrayNum], 18)~="True") { Level.ConsoleCommand("set engine.gameinfo MaxPlayers "$Config.SelElem(Config.QuickSetConf[ArrayNum], 16)); Level.ConsoleCommand("set engine.gameinfo MaxSpectators "$Config.SelElem(Config.QuickSetConf[ArrayNum], 17)); } if(ArrayNum==0) Level.ConsoleCommand("set engine.gameinfo GamePassword"); Map=Request.GetVariable("MapSelect"); Level.ServerTravel(Map$"?game="$GameType$"?mutator="$Config.SelElem(Config.QuickSetConf[ArrayNum], 2), false); Response.Subst("Title", "Please Wait"); Response.Subst("Message", "The server is now switching to map '"$Map$"' and custom set game type to '"$Config.SelElem(Config.QuickSetConf[ArrayNum], 1)$"'. Please allow 10-15 seconds while the server changes levels."); log("SuperWebAdmin: User "$Request.UserName$" has switched to a QuickSet Mode '"$Config.SelElem(Config.QuickSetConf[ArrayNum], 1)$"'."); Response.IncludeUHTM(MessageUHTM); } else if (Request.GetVariable("SwitchGameType", "") != "" ) { ArrayNum = int(Request.GetVariable("GameTypeSelect")); ReloadExcludeMaps(ExcludeMaps, Config.SelElem(Config.QuickSetConf[ArrayNum], 3)); if(GenerateMapListSelect(ExcludeMaps)!="") { Response.Subst("GameTypeButton", ""); if(ArrayNum == 0) Response.Subst("RestartButton", ""); else if(Config.SelElem(Config.QuickSetConf[ArrayNum], 18)~="true") //that's not really a map select button but that was easier this way :) //go directly to the password part Response.Subst("MapButton", ""); else Response.Subst("MapButton", ""); Response.Subst("GameTypeSelect", Config.SelElem(Config.QuickSetConf[ArrayNum], 1)$""); Response.Subst("MapSelect", "Map:"); Response.Subst("PostAction", CurrentQuickSetPage); Response.IncludeUHTM(CurrentQuickSetPage$".uhtm"); } else Response.SendText("ERROR: GameType not properly set or there are no maps."); } else if (Request.GetVariable("Players", "") != "") { ArrayNum = int(Request.GetVariable("GameTypeSelect")); Response.Subst("GameTypeButton", ""); Response.Subst("MapButton", ""); Response.Subst("GameTypeSelect", Config.SelElem(Config.QuickSetConf[ArrayNum], 1)$""); Response.Subst("MapSelect", "Map:"$Left(Request.GetVariable("MapSelect"), Len(Request.GetVariable("MapSelect")) - 4)$""); Response.Subst("PlayersButton", ""); Response.Subst("PlayersSelect", "Players/Spec:"); Response.Subst("SpecSelect", ""); Response.Subst("PostAction", CurrentQuickSetPage); Response.IncludeUHTM(CurrentQuickSetPage$".uhtm"); } else if (Request.GetVariable("Password", "") != "") { ArrayNum = int(Request.GetVariable("GameTypeSelect")); GamePassword = Level.ConsoleCommand("get engine.gameinfo GamePassword"); Response.Subst("GameTypeButton", ""); Response.Subst("MapButton", ""); Response.Subst("GameTypeSelect", Config.SelElem(Config.QuickSetConf[ArrayNum], 1)$""); Response.Subst("MapSelect", "Map:"$Left(Request.GetVariable("MapSelect"), Len(Request.GetVariable("MapSelect")) - 4)$""); // Response.Subst("MapSelect", "Switch Map:"); Response.Subst("PlayersButton", ""); //quick way to test if we were in the player set part if(Request.GetVariable("SpecSelect") != "") { Response.Subst("PlayersSelect", "Players/Spec:"$String(min(max(int(Request.GetVariable("PlayersSelect")), 0),32))$""); Response.Subst("SpecSelect", " - "$Request.GetVariable("SpecSelect")$""); } Response.Subst("Password", "Password"); Response.Subst("PasswordButton", ""); Response.Subst("PostAction", CurrentQuickSetPage); Response.IncludeUHTM(CurrentQuickSetPage$".uhtm"); } else if (Request.GetVariable("Ready", "") != "" ) { ArrayNum = int(Request.GetVariable("GameTypeSelect")); Response.Subst("GameTypeButton", ""); Response.Subst("MapButton", ""); Response.Subst("GameTypeSelect", Config.SelElem(Config.QuickSetConf[ArrayNum], 1)$""); Response.Subst("MapSelect", "Map:"$Left(Request.GetVariable("MapSelect"), Len(Request.GetVariable("MapSelect")) - 4)$""); Response.Subst("PlayersButton", ""); if(Request.GetVariable("SpecSelect") != "") { Response.Subst("PlayersSelect", "Players/Spec:"$String(min(max(int(Request.GetVariable("PlayersSelect")), 0),32))$""); Response.Subst("SpecSelect", " - "$Request.GetVariable("SpecSelect")$""); } Response.Subst("Password", "Password:"$Request.GetVariable("GamePassword")$""); Response.Subst("PasswordButton", ""); Response.Subst("RestartButton", ""); Response.Subst("PostAction", CurrentQuickSetPage); Response.IncludeUHTM(CurrentQuickSetPage$".uhtm"); } else if(GenerateQuickSetOptions()!=""){ //Disabled in order to load all maps. // ReloadIncludeMaps(ExcludeMaps, IncludeMaps, String(Level.Game.Class)); Response.Subst("GameTypeButton", ""); Response.Subst("MapButton", ""); Response.Subst("GameTypeSelect", ""); Response.Subst("MapSelect", ""); Response.Subst("PostAction", CurrentQuickSetPage); Response.IncludeUHTM(CurrentQuickSetPage$".uhtm"); } else Response.SendText("ERROR: No QuickSet Options are set !."); } function QueryCurrentMvrControl(WebRequest Request, WebResponse Response) { local String Status, MuteString, PubComsString; if (Request.GetVariable("Start", "") != "") Spectator.ServerMutate("mvr start", True); else if(Request.GetVariable("Stop", "") != "") Spectator.ServerMutate("mvr stop", True); else if(Request.GetVariable("Restart", "") != "") Spectator.ServerMutate("mvr restart", True); else if(Request.GetVariable("MuteOutPut", "") != "") Spectator.ServerMutate("mvr muteoutput", True); else if(Request.GetVariable("PubComs", "") != "") Spectator.ServerMutate("mvr pubcoms", True); else if(Request.GetVariable("Apply", "") != "") { if(class(Level.Game.class) != None) { Spectator.ServerMutate("mvr set TeamRed "$Request.GetVariable("TeamRed"), True); Spectator.ServerMutate("mvr set TeamBlue "$Request.GetVariable("TeamBlue"), True); if(!ClassIsChildOf( Level.Game.Class, class'CTFGame' ) && !ClassIsChildOf( Level.Game.Class, class'Assault' )) { if(class(Level.Game.class).default.MaxTeams>2) Spectator.ServerMutate("mvr set TeamGreen "$Request.GetVariable("TeamGreen"), True); if(class(Level.Game.class).default.MaxTeams>3) Spectator.ServerMutate("mvr set TeamGold "$Request.GetVariable("TeamGold"), True); } } } else if(Request.GetVariable("Reset", "") != "") { Spectator.ServerMutate("mvr set TeamRed Red Team", True); Spectator.ServerMutate("mvr set TeamBlue Blue Team", True); Spectator.ServerMutate("mvr set TeamGreen Green Team", True); Spectator.ServerMutate("mvr set TeamGold Gold Team", True); } Status=Spectator.ServerMutate("mvr status", True); if(Status=="") Status="Not responding"; if(Spectator.ServerMutate("mvr mutestatus", True) == "1") MuteString="UnMute"; else MuteString="Mute"; if(Spectator.ServerMutate("mvr pubcomsstatus", True) == "1") PubComsString="Disable"; else PubComsString="Enable"; if(class(Level.Game.class) != None) { Response.Subst("TeamRed", "Name of Team Red"); Response.Subst("TeamBlue", "Name of Team Blue"); if(!ClassIsChildOf( Level.Game.Class, class'CTFGame' ) && !ClassIsChildOf( Level.Game.Class, class'Assault' )) { if(class(Level.Game.class).default.MaxTeams>2) Response.Subst("TeamGreen","Name of Team Green"); if(class(Level.Game.class).default.MaxTeams>3) Response.Subst("TeamGold", "Name of Team Gold"); } } Response.Subst("MuteString", MuteString); Response.Subst("PubComsString", PubComsString); Response.Subst("Status", Status); Response.Subst("PostAction", CurrentMvrControlPage); Response.IncludeUHTM(CurrentMvrControlPage$".uhtm"); } //***************************************************************************** function QueryDefaults(WebRequest Request, WebResponse Response) { local String GameType, PageStr; // if no gametype specified use the first one in the list GameType = Request.GetVariable("GameType", String(Level.Game.Class)); // if no page specified, use the first one PageStr = Request.GetVariable("Page", BlankPage); Response.Subst("IndexURI", DefaultsMenuPage$"?GameType="$GameType$"&Page="$PageStr); Response.Subst("MainURI", PageStr$"?GameType="$GameType); Response.IncludeUHTM(DefaultsPage$".uhtm"); Response.ClearSubst(); } function QueryDefaultsMenu(WebRequest Request, WebResponse Response) { local String GameType, Page, TempStr, MapsBG, RulesBG, SettingsBG, BotsBG, IPPolicyBG, RestartBG, PasswordBG,OPBanListBG, EditUTListBG, EditOPListBG, DynaListBG, EditDynaListBG; BanPage = 0; GameType = Request.GetVariable("GameType"); Page = Request.GetVariable("Page"); if (GameType == "") GameType = String(Level.Game.Class); if (Request.GetVariable("GameTypeSet", "") != "") { TempStr = Request.GetVariable("GameTypeSelect", GameType); if (!(TempStr ~= GameType)) GameType = TempStr; } // set post action Response.Subst("PostAction", DefaultsPage); // set currently used gametype Response.Subst("GameType", GameType); // set currently active page Response.Subst("Page", Page); // set background colors Response.Subst("DefaultBG", DefaultBG); // for unused tabs MapsBG=DefaultBG; RulesBG=DefaultBG; SettingsBG=DefaultBG; BotsBG=DefaultBG; IPPolicyBG=DefaultBG; RestartBG=DefaultBG; PasswordBG=DefaultBG; EditUTListBG=DefaultBG; OPBanListBG=DefaultBG; EditOPListBG=DefaultBG; DynaListBG=DefaultBG; EditDynaListBG=DefaultBG; switch(Page) { case DefaultsMapsPage: MapsBG=HighlightedBG; break; case DefaultsRulesPage: RulesBG=HighlightedBG; break; case DefaultsSettingsPage: SettingsBG=HighlightedBG; break; case DefaultsBotsPage: BotsBG=HighlightedBG; break; case DefaultsIPPolicyPage: IPPolicyBG=HighlightedBG; break; case DefaultsChangePasswordPage: PasswordBG=HighlightedBG; break; case DefaultsRestartPage: RestartBG=HighlightedBG; break; case EditUTList: EditUTListBG=HighlightedBG; break; case OPBanList: OPBanListBG=HighlightedBG; break; case EditOPList: EditOPListBG=HighlightedBG; break; case DynaList: DynaListBG=HighlightedBG; break; case EditDynaList: EditDynaListBG=HighlightedBG; break; } // Set URIs if (Config.Privileges[Config.FindUser(Request.Username)]>3) { Response.Subst("GameTypeSel", "Game Type:"); Response.Subst("Maps", "Map List"); Response.Subst("Rules", "Rules"); Response.Subst("Settings", "Settings"); Response.Subst("Bots", "Bots "); Response.Subst("Restart", " Restart Level"); } if(Config.Privileges[Config.FindUser(Request.Username)]>2 || (Config.Privileges[Config.FindUser(Request.Username)]<3 && !bTournament && Config.Privileges[Config.FindUser(Request.Username)]!=0)) Response.Subst("IPPolicy", "IP Policy"); Response.Subst("Password", "Change Password"); if (opmain != none && (Config.Privileges[Config.FindUser(Request.Username)]>2 || (Config.Privileges[Config.FindUser(Request.Username)]<3 && !bTournament && Config.Privileges[Config.FindUser(Request.Username)]!=0))) { Response.Subst("EditUTList", "Mass Edit:UT Policy"); Response.Subst("OPBanList", "OPBan Policy"); Response.Subst("EditOPList", "OPBan Policy"); Response.Subst("DynaList", "Dynamic Policy"); Response.Subst("EditDynaList", "Dynamic Policy "); } Response.IncludeUHTM(DefaultsMenuPage$".uhtm"); Response.ClearSubst(); } function QueryDefaultsMaps(WebRequest Request, WebResponse Response) { local String GameType, MapListType; local ListItem ExcludeMaps, IncludeMaps, TempItem; local int i, Count, MoveCount; // load saved entries from the page GameType = Request.GetVariable("GameType"); // provided by index page MapListType = Request.GetVariable("MapListType", "Custom"); ReloadExcludeMaps(ExcludeMaps, GameType); ReloadIncludeMaps(ExcludeMaps, IncludeMaps, GameType); if (Request.GetVariable("MapListSet", "") != "") { MapListType = Request.GetVariable("MapListSelect", "Custom"); if (MapListType != "Custom") { ApplyMapList(ExcludeMaps, IncludeMaps, GameType, MapListType); UpdateDefaultMaps(GameType, IncludeMaps); } } else if (Request.GetVariable("AddMap", "") != "") { Count = Request.GetVariableCount("ExcludeMapsSelect"); for (i=0; i 0) { Count = Request.GetVariableCount("IncludeMapsSelect"); for (i=0; i GameClass; GameType = Request.GetVariable("GameType", GameTypeList.Data); GameClass = class(DynamicLoadObject(GameType, class'Class')); MaxPlayers = Request.GetVariable("MaxPlayers", String(class(GameClass).Default.MaxPlayers)); MaxPlayers = String(max(int(MaxPlayers), 0)); class(GameClass).Default.MaxPlayers = int(MaxPlayers); Response.Subst("MaxPlayers", MaxPlayers); MaxSpectators = Request.GetVariable("MaxSpectators", String(class(GameClass).Default.MaxSpectators)); MaxSpectators = String(max(int(MaxSpectators), 0)); class(GameClass).Default.MaxSpectators = int(MaxSpectators); Response.Subst("MaxSpectators", MaxSpectators); WeaponsStay = String(class(GameClass).Default.bMultiWeaponStay); Tournament = String(class(GameClass).Default.bTournament); if( class(GameClass) != None ) PlayersBalanceTeams = String(class(GameClass).Default.bPlayersBalanceTeams); if( class(GameClass) == None ) ForceRespawn = String(class(GameClass).Default.bForceRespawn); if (Request.GetVariable("Apply", "") != "") { if( class(GameClass) != None ) { PlayersBalanceTeams = Request.GetVariable("PlayersBalanceTeams", "false"); class(GameClass).Default.bPlayersBalanceTeams = PlayersBalanceTeams ~= "true"; } if( class(GameClass) == None ) { ForceRespawn = Request.GetVariable("ForceRespawn", "false"); class(GameClass).Default.bForceRespawn = bool(ForceRespawn); } WeaponsStay = Request.GetVariable("WeaponsStay", "false"); class(GameClass).Default.bMultiWeaponStay = bool(WeaponsStay); Tournament = Request.GetVariable("Tournament", "false"); class(GameClass).Default.bTournament = bool(Tournament); } if (WeaponsStay ~= "true") { Response.Subst("WeaponsStay", " checked"); } if (Tournament ~= "true") { Response.Subst("Tournament", " checked"); } if( class(GameClass) == None ) { if (ForceRespawn ~= "true") ForceRespawn = " checked"; else ForceRespawn = ""; Response.Subst("ForceRespawnSubst", "Force Respawn"); } if( class(GameClass) != None ) { if (PlayersBalanceTeams ~= "true") PlayersBalanceTeams = " checked"; else PlayersBalanceTeams = ""; Response.Subst("BalanceSubst", "Force Balanced Teams"); } if (class(GameClass) != None && class(GameClass) == None) { if (class(GameClass) != None) { FragLimit = Request.GetVariable("FragLimit", String(class(GameClass).Default.GoalTeamScore)); FragLimit = String(max(int(FragLimit), 0)); class(GameClass).Default.GoalTeamScore = float(FragLimit); FragName = "Max Team Score"; } else { FragLimit = Request.GetVariable("FragLimit", String(class(GameClass).Default.FragLimit)); FragLimit = String(max(int(FragLimit), 0)); class(GameClass).Default.FragLimit = float(FragLimit); FragName = "Frag Limit"; } Response.Subst("FragSubst", ""$FragName$""); if(class(GameClass) == None) { TimeLimit = Request.GetVariable("TimeLimit", String(class(GameClass).Default.TimeLimit)); TimeLimit = String(max(int(TimeLimit), 0)); Response.Subst("TimeLimitSubst", "Time Limit"); class(GameClass).Default.TimeLimit = float(TimeLimit); } } if(class(GameClass) != None && !ClassIsChildOf( GameClass, class'CTFGame' ) && !ClassIsChildOf( GameClass, class'Assault' ) ) { MaxTeams = Request.GetVariable("MaxTeams", String(class(GameClass).Default.MaxTeams)); MaxTeams = String(max(int(MaxTeams), 0)); class(GameClass).Default.MaxTeams = Min(Max(int(MaxTeams), 2), 4); Response.Subst("TeamSubst", "Max Teams"); } if (class(GameClass) != None) { FriendlyFire = Request.GetVariable("FriendlyFire", String(class(GameClass).Default.FriendlyFireScale * 100)); FriendlyFire = String(min(max(int(FriendlyFire), 0), 100)); class(GameClass).Default.FriendlyFireScale = float(FriendlyFire)/100.0; Response.Subst("FriendlyFireSubst", "Friendly Fire: [0-100]%"); } Response.Subst("PostAction", DefaultsRulesPage); Response.Subst("GameType", GameType); Response.IncludeUHTM(DefaultsRulesPage$".uhtm"); Response.ClearSubst(); GameClass.Static.StaticSaveConfig(); } function QueryDefaultsSettings(WebRequest Request, WebResponse Response) { local String GameType, UseTranslocator, TickRate; local class GameClass; local int GameStyle, GameSpeed, AirControl; GameType = Request.GetVariable("GameType", GameTypeList.Data); GameClass = class(DynamicLoadObject(GameType, class'Class')); if(Config.bTickrateInSettings) { if(Level.ConsoleCommand("get UTMenu.UTServerSetupPage bLanPlay") ~= "true" ) TickRate = Level.ConsoleCommand("get IpDrv.TcpNetDriver LanServerMaxTickRate"); else TickRate = Level.ConsoleCommand("get IpDrv.TcpNetDriver NetServerMaxTickRate"); } if (class(GameClass).Default.bMegaSpeed == true) GameStyle=1; if (class(GameClass).Default.bHardCoreMode == true) GameStyle+=1; switch (Request.GetVariable("GameStyle", String(GameStyle))) { case "0": class(GameClass).Default.bMegaSpeed = false; class(GameClass).Default.bHardCoreMode = false; Response.Subst("Normal", " selected"); break; break; case "1": class(GameClass).Default.bMegaSpeed = false; class(GameClass).Default.bHardCoreMode = true; Response.Subst("HardCore", " selected"); break; case "2": class(GameClass).Default.bMegaSpeed = true; class(GameClass).Default.bHardCoreMode = true; Response.Subst("Turbo", " selected"); break; } GameSpeed = class(GameClass).Default.GameSpeed * 100.0; AirControl = class(GameClass).Default.AirControl * 100.0; UseTranslocator = String(class(GameClass).Default.bUseTranslocator); if (Request.GetVariable("Apply", "") != "") { if(Config.bTickRateInSettings) TickRate = String(min(max(int(Request.GetVariable("TickRate")), 10), 99)); GameSpeed = min(max(int(Request.GetVariable("GameSpeed", String(GameSpeed))), 10), 200); class(GameClass).Default.GameSpeed = GameSpeed / 100.0; AirControl = min(max(int(Request.GetVariable("AirControl", String(AirControl))), 0), 100); class(GameClass).Default.AirControl = AirControl / 100.0; UseTranslocator = Request.GetVariable("UseTranslocator", "false"); class(GameClass).Default.bUseTranslocator = bool(UseTranslocator); GameClass.Static.StaticSaveConfig(); Level.ConsoleCommand("set BotPack.DeathMatchPlus MinPlayers "$string(Min(Max(int(Request.GetVariable("MinPlayers", String(0))), 0), 16))); if(Config.bTickRateInSettings) { if(Level.ConsoleCommand("get UTMenu.UTServerSetupPage bLanPlay") ~= "true" ) Level.ConsoleCommand("set IpDrv.TcpNetDriver LanServerMaxTickRate "$TickRate); else Level.ConsoleCommand("set IpDrv.TcpNetDriver NetServerMaxTickRate "$TickRate); } } Response.Subst("GameSpeed", String(GameSpeed)); Response.Subst("AirControl", String(AirControl)); if (UseTranslocator ~= "true") Response.Subst("UseTranslocator", " checked"); if (Config.bTickrateInSettings) Response.Subst("Tickrate", " TickRate"); Response.Subst("MinPlayers", string(DeathMatchPlus(Level.Game).MinPlayers)); Response.Subst("PostAction", DefaultsSettingsPage); Response.Subst("GameType", GameType); Response.IncludeUHTM(DefaultsSettingsPage$".uhtm"); Response.ClearSubst(); } function QueryDefaultsBots(WebRequest Request, WebResponse Response) { local String GameType, AutoAdjustSkill, RandomOrder, BalanceTeams, DumbDown; local class GameClass; local class BotConfig; local int BotDifficulty, MinPlayers; GameType = Request.GetVariable("GameType", GameTypeList.Data); GameClass = class(DynamicLoadObject(GameType, class'Class')); BotConfig = class(GameClass).Default.BotConfigType; if (Request.GetVariable("Apply", "") != "") { BotDifficulty = int(Request.GetVariable("BotDifficulty", String(BotDifficulty))); BotConfig.Default.Difficulty = BotDifficulty; MinPlayers = min(max(int(Request.GetVariable("MinPlayers", String(MinPlayers))), 0), 16); class(GameClass).Default.MinPlayers = MinPlayers; AutoAdjustSkill = Request.GetVariable("AutoAdjustSkill", "false"); BotConfig.Default.bAdjustSkill = bool(AutoAdjustSkill); RandomOrder = Request.GetVariable("RandomOrder", "false"); BotConfig.Default.bRandomOrder = bool(RandomOrder); if (class(GameClass) != None) { BalanceTeams = Request.GetVariable("BalanceTeams", "false"); class(GameClass).Default.bBalanceTeams = bool(BalanceTeams); if (class(GameClass) != None) { DumbDown = Request.GetVariable("DumbDown", "true"); class(GameClass).Default.bDumbDown = bool(Dumbdown); } } BotConfig.Static.StaticSaveConfig(); GameClass.Static.StaticSaveConfig(); } BotDifficulty = BotConfig.Default.Difficulty; MinPlayers = class(GameClass).Default.MinPlayers; AutoAdjustSkill = String(BotConfig.Default.bAdjustSkill); RandomOrder = String(BotConfig.Default.bRandomOrder); if (class(GameClass) != None) BalanceTeams = String(class(GameClass).Default.bBalanceTeams); if (class(GameClass) != None) DumbDown = String(class(GameClass).Default.bDumbDown); Response.Subst("BotDifficulty"$BotDifficulty, " selected"); Response.Subst("MinPlayers", String(MinPlayers)); if (AutoAdjustSkill ~= "true") Response.Subst("AutoAdjustSkill", " checked"); if (RandomOrder ~= "true") Response.Subst("RandomOrder", " checked"); if (class(GameClass) != None) { if (BalanceTeams ~= "true") BalanceTeams = " checked"; else BalanceTeams = ""; Response.Subst("BalanceSubst", "Bots Balance Teams"); if (class(GameClass) != None) { if (DumbDown ~= "false") DumbDown = " checked"; else DumbDown = ""; Response.Subst("DumbDownSubst", "Enhanced AI"); } } Response.Subst("PostAction", DefaultsBotsPage); Response.Subst("GameType", GameType); Response.IncludeUHTM(DefaultsBotsPage$".uhtm"); Response.ClearSubst(); } function QueryDefaultsIPPolicy(WebRequest Request, WebResponse Response) { local int i, j; if(Request.GetVariable("Update") != "") { i = int(Request.GetVariable("PolicyNo", "-1")); if(i == -1) for(i = 0; i<50 && Level.Game.IPPolicies[i] != ""; i++); if(i < 50) Level.Game.IPPolicies[i] = Request.GetVariable("AcceptDeny")$","$Request.GetVariable("IPMask"); Level.Game.SaveConfig(); } if(Request.GetVariable("Delete") != "") { i = int(Request.GetVariable("PolicyNo", "-1")); if(i > 0) { for(i = i; i<49 && Level.Game.IPPolicies[i] != ""; i++) Level.Game.IPPolicies[i] = Level.Game.IPPolicies[i + 1]; if(i == 49) Level.Game.IPPolicies[49] = ""; Level.Game.SaveConfig(); } } Response.IncludeUHTM(DefaultsIPPolicyPage$"-h.uhtm"); for(i=0; i<50 && Level.Game.IPPolicies[i] != ""; i++) { j = InStr(Level.Game.IPPolicies[i], ","); if(Left(Level.Game.IPPolicies[i], j) ~= "DENY") { Response.Subst("AcceptCheck", ""); Response.Subst("DenyCheck", "checked"); } else { Response.Subst("AcceptCheck", "checked"); Response.Subst("DenyCheck", ""); } Response.Subst("IPMask", Mid(Level.Game.IPPolicies[i], j+1)); Response.Subst("PostAction", DefaultsIPPolicyPage$"?PolicyNo="$string(i)); Response.IncludeUHTM(DefaultsIPPolicyPage$"-d.uhtm"); } Response.Subst("PostAction", DefaultsIPPolicyPage); Response.IncludeUHTM(DefaultsIPPolicyPage$"-f.uhtm"); } function QueryDefaultsChangePassword(WebRequest Request, WebResponse Response) { local String NewPassword1; local String NewPassword2; if (Request.GetVariable("Apply", "") != "") { NewPassword1 = Request.GetVariable("NewPassword", ""); NewPassword2 = Request.GetVariable("ConfNewPassword", ""); if (NewPassword1 == "") { Response.Subst("Title", "Error"); Response.Subst("Message", "Blank passwords are not allowed - please retry using a sensible password."); Response.IncludeUHTM(MessageUHTM); } else if (NewPassword1 != NewPassword2) { Response.Subst("Title", "Error"); Response.Subst("Message", "Passwords do not match, please retry."); Response.IncludeUHTM(MessageUHTM); } else { Config.ChangePassword(Request.Username, Request.Password, NewPassword1); Response.Subst("Title", "Success"); Response.Subst("Message", "Your password has changed. Please remember this the next time you connect to web admin!"); Response.IncludeUHTM(MessageUHTM); } } else { Response.Subst("PostAction", DefaultsChangePasswordPage); Response.Subst("Username", Request.Username); Response.IncludeUHTM(DefaultsChangePasswordPage$".uhtm"); } } function QuerySuperAdminWebAdmin(WebRequest Request, WebResponse Response) { local int Counter; local String temp; local String temp2; local String Password1; local String Password2; local String Username; if (Request.GetVariable("Add", "") != "") { Response.IncludeUHTM(SuperAdminWebAdminPage2$".uhtm"); } else if (Request.GetVariable("Add2", "") != "") { Username = Request.GetVariable("Username", ""); Password1 = Request.GetVariable("Password", ""); Password2 = Request.GetVariable("ConfPassword", ""); temp = ""; if (UserName == "") { temp = "Please enter a username and try again."; } else if (Password1 == "") { temp = "Blank passwords are not allowed - please retry using a sensible password."; } else if (Password1 != Password2) { temp = "Passwords do not match, please retry."; } if (temp != "") { Response.Subst("Title", "Error"); Response.Subst("Message", temp); Response.IncludeUHTM(MessageUHTM); } else { Counter = Config.AddUser(Username, Password1, int(Request.GetVariable("Priv"))); if (Counter == 0) { temp2 = "Success"; temp = "User has been successfully added."; } else if (Counter == 1) { temp2 = "Error"; temp = "Username already exists."; } else { temp2 = "Error"; temp = "You already have a maximum of 50 users defined."; } Response.Subst("Title", temp2); Response.Subst("Message", temp); Response.IncludeUHTM(MessageUHTM); } } else if (Request.GetVariable("Edit", "") != "") { if (Request.GetVariable("UserSelect", "") != "") { Username = Request.GetVariable("UserSelect", ""); Response.Subst(string(Config.Privileges[Config.FindUser(UserName)]), " checked"); Response.Subst("Username", Username); Response.Subst("Password", Config.GetPassword(Username)); Response.Subst("ConfPassword", Config.GetPassword(Username)); Response.IncludeUHTM(SuperAdminWebAdminPage3$".uhtm"); } else { Response.Subst("Title", "Error"); Response.Subst("Message", "Please select a user to edit."); Response.IncludeUHTM(MessageUHTM); } } else if (Request.GetVariable("EditApply", "") != "") { // Check passwords Username = Request.GetVariable("Username", ""); Password1 = Request.GetVariable("Password", ""); Password2 = Request.GetVariable("ConfPassword", ""); if (Password1 == "") { Response.Subst("Title", "Error"); Response.Subst("Message", "Blank passwords are not allowed - please retry using a sensible password."); Response.IncludeUHTM(MessageUHTM); } else if (Password1 != Password2) { Response.Subst("Title", "Error"); Response.Subst("Message", "Passwords do not match, please retry."); Response.IncludeUHTM(MessageUHTM); } else { Config.ChangePassword(Username, "", Password1); Config.Privileges[Config.FindUser(UserName)]=int(Request.GetVariable("Priv")); Config.SaveConfig(); Response.Subst("Title", "Success"); Response.Subst("Message", "User settings have been modified."); Response.IncludeUHTM(MessageUHTM); } } else if (Request.GetVariable("Delete", "") != "") { if (Request.GetVariable("UserSelect", "") != "") { if (Config.DeleteUser(Request.GetVariable("UserSelect", "")) == 0) { temp2 = "Success"; temp = "User deleted."; } else { temp2 = "Error"; temp = "No such user exists."; } Response.Subst("Title", temp2); Response.Subst("Message", temp); Response.IncludeUHTM(MessageUHTM); } else { Response.Subst("Title", "Error"); Response.Subst("Message", "Please select a user to delete."); Response.IncludeUHTM(MessageUHTM); } } else { temp = "Username"; for (Counter = 0; Counter < Config.UserCount; Counter++) { temp2 = Config.ParseForUsername(Config.UserList[Counter]); temp = temp $ "" $ temp2$""; } Response.Subst("UserList", Temp); Response.IncludeUHTM(SuperAdminWebAdminPage$".uhtm"); } } /*function QuerySuperAdminWebAdminConfig(WebRequest Request, WebResponse Response) { Response.Subst("bEnabled", Level.ConsoleCommand("get UWeb.WebServer bEnabled"); Response.Subst("MaxConnections", Level.ConsoleCommand("get UWeb.WebServer MaxConnections"); Response.Subst("ListenPort", Level.ConsoleCommand("get UWeb.WebServer ListenPort"); Response.Subst("AdminRealm", Config.AdminRealm); Response.Subst("ServerURL", Config.ServerURL); }*/ //-------------------------------------------------------------------------------------------------------- function QuerySuperAdmin(WebRequest Request, WebResponse Response) { local String Page; // if no page specified, use the default Page = Request.GetVariable("Page", BlankPage); Response.Subst("IndexURI", SuperAdminMenuPage$"?Page="$Page); Response.Subst("MainURI", Page); Response.IncludeUHTM(SuperAdminPage$".uhtm"); Response.ClearSubst(); } function QuerySuperAdminMenu(WebRequest Request, WebResponse Response) { local String Page, OPBanOptionsBG, MvrConfigBG; Page = Request.GetVariable("Page", SuperAdminPage); // set background colors Response.Subst("ServerBG", DefaultBG); Response.Subst("WebAdminBG", DefaultBG); Response.Subst("RestartBG", DefaultBG); Response.Subst("QuickSetConfigBG", DefaultBG); OPBanOptionsBG=DefaultBG; MvrConfigBG=DefaultBG; switch(Page) { case SuperAdminServerPage: Response.Subst("ServerBG", HighlightedBG); break; case SuperAdminWebAdminPage: Response.Subst("WebAdminBG", HighlightedBG); break; case SuperAdminRestartPage: Response.Subst("RestartBG", HighlightedBG); break; case SuperAdminQuickSetConfigPage: Response.Subst("QuickSetConfigBG", HighlightedBG); break; case OPBanOptions: OPBanOptionsBG=HighlightedBG; break; case SuperAdminMvrConfigPage: MvrConfigBG=HighlightedBG; break; } // Set URIs Response.Subst("ServerURI", SuperAdminPage$"?Page="$SuperAdminServerPage); Response.Subst("WebAdminURI", SuperAdminPage$"?Page="$SuperAdminWebAdminPage); Response.Subst("RestartURI", SuperAdminPage$"?Page="$SuperAdminRestartPage); Response.Subst("QuickSetConfigURI", SuperAdminPage$"?Page="$SuperAdminQuickSetConfigPage); if (opmain!=none) Response.Subst("OPBanOptions", "OPBan Options"); if(MVR2Enabled) Response.Subst("MvrConfig", "Mvr Config"); Response.IncludeUHTM(SuperAdminMenuPage$".uhtm"); Response.ClearSubst(); } function QuerySuperAdminServer(WebRequest Request, WebResponse Response) { local String ServerName, AdminName, AdminEmail, MOTDLine1, MOTDLine2, MOTDLine3, MOTDLine4, GamePassword, AdminPassword; local bool bDoUplink, bWorldLog; local string Tickrate, MaxClientRate; ServerName = class'Engine.GameReplicationInfo'.default.ServerName; AdminName = class'Engine.GameReplicationInfo'.default.AdminName; AdminEmail = class'Engine.GameReplicationInfo'.default.AdminEmail; MOTDLine1 = class'Engine.GameReplicationInfo'.default.MOTDLine1; MOTDLine2 = class'Engine.GameReplicationInfo'.default.MOTDLine2; MOTDLine3 = class'Engine.GameReplicationInfo'.default.MOTDLine3; MOTDLine4 = class'Engine.GameReplicationInfo'.default.MOTDLine4; AdminPassword = Level.ConsoleCommand("get engine.gameinfo AdminPassword"); GamePassword = Level.ConsoleCommand("get engine.gameinfo GamePassword"); if(Level.ConsoleCommand("get UTMenu.UTServerSetupPage bLanPlay") ~= "true" ) TickRate = Level.ConsoleCommand("get IpDrv.TcpNetDriver LanServerMaxTickRate"); else TickRate = Level.ConsoleCommand("get IpDrv.TcpNetDriver NetServerMaxTickRate"); MaxClientRate = Level.ConsoleCommand("get IpDrv.TcpNetDriver MaxClientRate"); bDoUplink = class'UdpServerUplink'.default.DoUplink; bWorldLog = Level.Game.Default.bWorldLog; if (Request.GetVariable("Apply", "") != "") { ServerName = Request.GetVariable("ServerName", ""); AdminName = Request.GetVariable("AdminName", ""); AdminEmail = Request.GetVariable("AdminEmail", ""); MOTDLine1 = Request.GetVariable("MOTDLine1", ""); MOTDLine2 = Request.GetVariable("MOTDLine2", ""); MOTDLine3 = Request.GetVariable("MOTDLine3", ""); MOTDLine4 = Request.GetVariable("MOTDLine4", ""); bDoUplink = bool(Request.GetVariable("DoUplink", "false")); bWorldLog = bool(Request.GetVariable("WorldLog", "false")); AdminPassword = Request.GetVariable("AdminPassword", ""); GamePassword = Request.GetVariable("GamePassword", ""); TickRate = String(min(max(int(Request.GetVariable("TickRate")), 10), 99)); MaxClientRate = String(min(max(int(Request.GetVariable("MaxClientRate")), 1000), 30000)); class'Engine.GameReplicationInfo'.Default.ServerName = ServerName; class'Engine.GameReplicationInfo'.Default.AdminName = AdminName; class'Engine.GameReplicationInfo'.Default.AdminEmail = AdminEmail; class'Engine.GameReplicationInfo'.Default.MOTDline1 = MOTDLine1; class'Engine.GameReplicationInfo'.Default.MOTDline2 = MOTDLine2; class'Engine.GameReplicationInfo'.Default.MOTDline3 = MOTDLine3; class'Engine.GameReplicationInfo'.Default.MOTDline4 = MOTDLine4; class'Engine.GameReplicationInfo'.Static.StaticSaveConfig(); class'UdpServerUplink'.default.DoUplink = bDoUplink; class'UdpServerUplink'.Static.StaticSaveConfig(); Level.Game.Default.bWorldLog = bWorldLog; Level.Game.Static.StaticSaveConfig(); Level.ConsoleCommand("set engine.gameinfo GamePassword "$GamePassword); Level.ConsoleCommand("set engine.gameinfo AdminPassword "$AdminPassword); if(Level.ConsoleCommand("get UTMenu.UTServerSetupPage bLanPlay") ~= "true" ) Level.ConsoleCommand("set IpDrv.TcpNetDriver LanServerMaxTickRate "$TickRate); else Level.ConsoleCommand("set IpDrv.TcpNetDriver NetServerMaxTickRate "$TickRate); Level.ConsoleCommand("set IpDrv.TcpNetDriver MaxClientRate "$MaxClientRate); } Response.Subst("ServerName", ServerName); Response.Subst("AdminName", AdminName); Response.Subst("AdminEmail", AdminEmail); Response.Subst("MOTDLine1", MOTDLine1); Response.Subst("MOTDLine2", MOTDLine2); Response.Subst("MOTDLine3", MOTDLine3); Response.Subst("MOTDLine4", MOTDLine4); Response.Subst("AdminPassword", AdminPassword); Response.Subst("GamePassword", GamePassword); Response.Subst("TickRate", TickRate); Response.Subst("MaxClientRate", MaxClientRate); if (bDoUplink) Response.Subst("DoUplink", " checked"); if (bWorldLog) Response.Subst("WorldLog", " checked"); Response.Subst("PostAction", SuperAdminServerPage); Response.IncludeUHTM(SuperAdminServerPage$".uhtm"); } function QuerySuperAdminQuickSetConfig(WebRequest Request, WebResponse Response) { local int i; local class GameClass; local String OptName; local String Mutators; local String Game; local String Tour; local String MaxScore; local String TimeLimit; local String BalanceTeams; local String ForceRespawn; local String WeaponsStay; local String FriendlyFire; local String MaxTeams; local String GameStyle; local String GameSpeed; local String AirControl; local String Trans; local String PlayersSelect; local String SpecSelect; local string ForcePlayersSet; if (Request.GetVariable("Apply", "") != "") { for (i=0;i<20;i++) { if (Request.GetVariable("GameType"$i) != "") GameClass = class(DynamicLoadObject(Request.GetVariable("GameType"$i), class'Class')); OptName=Request.GetVariable("Name"$i); if(Request.GetVariable("GameType"$i)!="") Game=Request.GetVariable("GameType"$i); else Game=""; Mutators=Request.GetVariable("Mutators"$i); Tour=Request.GetVariable("Tournament"$i); if (class(GameClass) != None && class(GameClass) == None && Request.GetVariable("GameType"$i) != "") MaxScore=String(max(int(Request.GetVariable("MaxScore"$i)), 0)); else MaxScore="N/A"; if(class(GameClass) == None && Request.GetVariable("GameType"$i) != "") TimeLimit=String(max(int(Request.GetVariable("TimeLimit"$i)), 0)); else TimeLimit="N/A"; if(class(GameClass) != None && Request.GetVariable("GameType"$i) != "") { if(Caps(Request.GetVariable("BalanceTeams"$i))!="TRUE") BalanceTeams="false"; else BalanceTeams=Request.GetVariable("BalanceTeams"$i); FriendlyFire=String(min(max(int(Request.GetVariable("FriendlyFire"$i)), 0), 100)); } else { BalanceTeams="false"; FriendlyFire="N/A"; } if(Caps(Request.GetVariable("ForceRespawn"$i))!="TRUE") ForceRespawn="false"; else ForceRespawn=Request.GetVariable("ForceRespawn"$i); if(Caps(Request.GetVariable("WeaponsStay"$i))!="TRUE") WeaponsStay="false"; else WeaponsStay=Request.GetVariable("WeaponsStay"$i); if((class(GameClass) != None && !ClassIsChildOf( GameClass, class'CTFGame' ) && !ClassIsChildOf( GameClass, class'Assault' )) && Request.GetVariable("GameType"$i) != "") MaxTeams=String(Min(Max(int(Request.GetVariable("MaxTeams"$i)), 2), 4)); else MaxTeams="N/A"; GameStyle=Request.GetVariable("GameStyle"$i); GameSpeed=String(min(max(int(Request.GetVariable("GameSpeed"$i)), 10), 200)); AirControl=String(min(max(int(Request.GetVariable("AirControl"$i)), 0), 100)); if(Caps(Request.GetVariable("Trans"$i))!="TRUE") Trans="false"; else Trans=Request.GetVariable("Trans"$i); PlayersSelect=String(min(max(int(Request.GetVariable("PlayersSelect"$i)), 0), 32)); SpecSelect=Request.GetVariable("SpecSelect"$i); ForcePlayersSet=Request.GetVariable("ForcePlayersSet"$i); Config.QuickSetConf[i]=OptName$":"$Mutators$":"$Game$":"$Tour$":"$MaxScore$":"$TimeLimit$":"$BalanceTeams$":"$ForceRespawn$":"$WeaponsStay$":"$FriendlyFire$":"$MaxTeams$":"$GameStyle$":"$GameSpeed$":"$AirControl$":"$Trans$":"$PlayersSelect$":"$SpecSelect$":"$ForcePlayersSet; } Config.SaveConfig(); } for (i=0;i<20;i++) { Response.Subst("Name"$i, Config.SelElem(Config.QuickSetConf[i], 1)); if(Config.SelElem(Config.QuickSetConf[i], 3)!="") Response.Subst("GameType"$i, ""); else Response.Subst("GameType"$i, ""); Response.Subst("Mutators"$i, Config.SelElem(Config.QuickSetConf[i], 2)); if(Config.SelElem(Config.QuickSetConf[i], 4)~="True") Response.Subst("Tournament"$i, " checked"); else Response.Subst("Tournament"$i, ""); Response.Subst("MaxScore"$i, Config.SelElem(Config.QuickSetConf[i], 5)); Response.Subst("TimeLimit"$i, Config.SelElem(Config.QuickSetConf[i], 6)); if(Config.SelElem(Config.QuickSetConf[i], 7)~="True") Response.Subst("BalanceTeams"$i, " checked"); else Response.Subst("BalanceTeams"$i, ""); if(Config.SelElem(Config.QuickSetConf[i], 8)~="True") Response.Subst("ForceRespawn"$i, " checked"); else Response.Subst("ForceRespawn"$i, ""); if(Config.SelElem(Config.QuickSetConf[i], 9)~="True") Response.Subst("WeaponsStay"$i, " checked"); else Response.Subst("WeaponsStay"$i, ""); if(Config.SelElem(Config.QuickSetConf[i], 10)!="N/A") Response.Subst("FriendlyFire"$i, String(min(max(int(Config.SelElem(Config.QuickSetConf[i], 10)), 0), 100))); else Response.Subst("FriendlyFire"$i, "N/A"); Response.Subst("MaxTeams"$i, Config.SelElem(Config.QuickSetConf[i], 11)); switch (Config.SelElem(Config.QuickSetConf[i], 12)) { case "0": Response.Subst("Normal"$i, " selected"); break; case "1": Response.Subst("HardCore"$i, " selected"); break; case "2": Response.Subst("Turbo"$i, " selected"); break; default: Response.Subst("HardCore"$i, " selected"); break; } Response.Subst("GameSpeed"$i, Config.SelElem(Config.QuickSetConf[i], 13)); Response.Subst("AirControl"$i, Config.SelElem(Config.QuickSetConf[i], 14)); if(Config.SelElem(Config.QuickSetConf[i], 15)~="True") Response.Subst("Trans"$i, " checked"); else Response.Subst("Trans"$i, ""); Response.Subst("PlayersSelect"$i, Config.SelElem(Config.QuickSetConf[i], 16)); switch (Config.SelElem(Config.QuickSetConf[i], 17)) { case "0": Response.Subst("0SpecSelect"$i, "selected"); break; case "1": Response.Subst("1SpecSelect"$i, "selected"); break; case "2": Response.Subst("2SpecSelect"$i, "selected"); break; case "3": Response.Subst("3SpecSelect"$i, "selected"); break; case "4": Response.Subst("4SpecSelect"$i, "selected"); break; } if(i!=0) { if(Config.SelElem(Config.QuickSetConf[i], 18)~="True") Response.Subst("ForcePlayersSet"$i, " checked"); else Response.Subst("ForcePlayersSet"$i, ""); } } Response.Subst("ApplyButton", ""); Response.Subst("PostAction", SuperAdminQuickSetConfigPage); Response.IncludeUHTM(SuperAdminQuickSetConfigPage$".uhtm"); } function QuerySuperAdminMvrConfig(WebRequest Request, WebResponse Response) { if (Request.GetVariable("Apply", "") != "") { Spectator.ServerMutate("mvr set AdminPassword "$Request.GetVariable("AdminPassword")); Spectator.ServerMutate("mvr set ServerAddr "$Request.GetVariable("ServerAddr")); Spectator.ServerMutate("mvr set ServerPort "$Request.GetVariable("ServerPort")); Spectator.ServerMutate("mvr set AntiFloodDelay "$Request.GetVariable("AntiFloodDelay")); Spectator.ServerMutate("mvr set Channel "$Request.GetVariable("Channel")); Spectator.ServerMutate("mvr set NickName "$Request.GetVariable("NickName")); Spectator.ServerMutate("mvr set bUseLogin "$Request.GetVariable("bUseLogin")); Spectator.ServerMutate("mvr set UserName "$Request.GetVariable("UserName")); Spectator.ServerMutate("mvr set Password "$Request.GetVariable("Password")); Spectator.ServerMutate("mvr set bSecondaryLink "$Request.GetVariable("bSecondaryLink")); Spectator.ServerMutate("mvr set NickName2 "$Request.GetVariable("NickName2")); Spectator.ServerMutate("mvr set UserName2 "$Request.GetVariable("UserName2")); Spectator.ServerMutate("mvr set Password2 "$Request.GetVariable("Password2")); Spectator.ServerMutate("mvr set bUseAuth "$Request.GetVariable("bUseAuth")); Spectator.ServerMutate("mvr set AuthName "$Request.GetVariable("AuthName")); Spectator.ServerMutate("mvr set AuthPassword "$Request.GetVariable("AuthPassword")); Spectator.ServerMutate("mvr set Perform1 "$Request.GetVariable("Perform1")); Spectator.ServerMutate("mvr set Perform2 "$Request.GetVariable("Perform2")); Spectator.ServerMutate("mvr set Perform3 "$Request.GetVariable("Perform3")); Spectator.ServerMutate("mvr set bExtra1on1Stats "$Request.GetVariable("bExtra1on1Stats")); Spectator.ServerMutate("mvr set bPublicSay "$Request.GetVariable("bPublicSay")); } Response.Subst("AdminPassword", Spectator.ServerMutate("mvr get AdminPassword", True)); Response.Subst("ServerAddr", Spectator.ServerMutate("mvr get ServerAddr", True)); Response.Subst("ServerPort", Spectator.ServerMutate("mvr get ServerPort", True)); Response.Subst("AntiFloodDelay", Spectator.ServerMutate("mvr get AntiFloodDelay", True)); Response.Subst("Channel", Spectator.ServerMutate("mvr get Channel", True)); Response.Subst("NickName", Spectator.ServerMutate("mvr get Nickname", True)); if(Spectator.ServerMutate("mvr get bUseLogin", True) ~= "True") Response.Subst("bUseLogin", " checked"); Response.Subst("UserName", Spectator.ServerMutate("mvr get Username", True)); Response.Subst("Password", Spectator.ServerMutate("mvr get Password", True)); if(Spectator.ServerMutate("mvr get bSecondaryLink", True) ~= "True") Response.Subst("bSecondaryLink", " checked"); Response.Subst("NickName2", Spectator.ServerMutate("mvr get Nickname2", True)); Response.Subst("UserName2", Spectator.ServerMutate("mvr get Username2", True)); Response.Subst("Password2", Spectator.ServerMutate("mvr get Password2", True)); if(Spectator.ServerMutate("mvr get bUseAuth", True) ~= "True") Response.Subst("bUseAuth", " checked"); Response.Subst("AuthName", Spectator.ServerMutate("mvr get AuthName", True)); Response.Subst("AuthPassword", Spectator.ServerMutate("mvr get AuthPassword", True)); Response.Subst("Perform1", Spectator.ServerMutate("mvr get Perform1", True)); Response.Subst("Perform2", Spectator.ServerMutate("mvr get Perform2", True)); Response.Subst("Perform3", Spectator.ServerMutate("mvr get Perform3", True)); if(Spectator.ServerMutate("mvr get bExtra1on1Stats", True) ~= "True") Response.Subst("bExtra1on1Stats", " checked"); if(Spectator.ServerMutate("mvr get bPublicSay", True) ~= "True") Response.Subst("bPublicSay", " checked"); Response.Subst("PostAction", SuperAdminMvrConfigPage); Response.IncludeUHTM(SuperAdminMvrConfigPage$".uhtm"); } function QueryBanlist(WebRequest Request, WebResponse Response) { local int i, j, RangeBase; local int PolicyCount, MaxBans; MaxBans = ArrayCount(opconf.IPPolicies); // A range button is pressed - set the appropriate range if (Request.GetVariable("B1", "") != "") BanPage = 0; else if (Request.GetVariable("B51", "") != "") BanPage = 1; else if (Request.GetVariable("B101", "") != "") BanPage = 2; else if (Request.GetVariable("B151", "") != "") BanPage = 3; else if (Request.GetVariable("B201", "") != "") BanPage = 4; // A policy is changed if (Request.GetVariable("Update") != "") { i = int(Request.GetVariable("PolicyNo", "-1")); if (i == -1) for (i = 0; i < MaxBans && opconf.IPPolicies[i] != ""; i++); if (i < MaxBans) opconf.IPPolicies[i] = Request.GetVariable("AcceptDeny")$","$Request.GetVariable("IPMask"); opconf.SaveConfig(); } // A policy is deleted if (Request.GetVariable("Delete") != "") { i = int(Request.GetVariable("PolicyNo", "-1")); if (i > 0) { for (i = i; i < MaxBans-1 && opconf.IPPolicies[i] != ""; i++) opconf.IPPolicies[i] = opconf.IPPolicies[i + 1]; if (i == MaxBans-1) opconf.IPPolicies[i] = ""; opconf.SaveConfig(); } } // Change the range select buttons so // only ranges with policies in can be selected for (i = 0; i < MaxBans; i += 50) { if (opconf.IPPolicies[i] != "") Response.Subst("B"$i$"type", "submit"); else { if (BanPage > i / 50) // make sure page is within range BanPage = i / 50; Response.Subst("B"$i$"type", "hidden"); } } // Show the IPPolicies for the page range RangeBase = BanPage * 50; Response.Subst("Range", RangeBase + 1 $ " - " $ RangeBase + 50); Response.IncludeUHTM("ob_ippolicy-h.uhtm"); for (i = RangeBase; i < RangeBase + 50 && opconf.IPPolicies[i] != ""; i++) { j = InStr(opconf.IPPolicies[i], ","); if (Left(opconf.IPPolicies[i], j) ~= "DENY") { Response.Subst("AcceptCheck", ""); Response.Subst("DenyCheck", "checked"); } else { Response.Subst("AcceptCheck", "checked"); Response.Subst("DenyCheck", ""); } Response.Subst("IPMask", Mid(opconf.IPPolicies[i], j + 1)); Response.Subst("PostAction", "banlist?PolicyNo="$string(i)); Response.IncludeUHTM("ob_ippolicy-d.uhtm"); } Response.Subst("PostAction", "banlist"); // Only put a 'new' button on the last page if ((BanPage + 1 >= MaxBans / 50) || (opconf.IPPolicies[(BanPage + 1) * 50] == "")) Response.IncludeUHTM("ob_ippolicy-s.uhtm"); Response.IncludeUHTM("ob_ippolicy-f.uhtm"); } function QueryDynalist(WebRequest Request, WebResponse Response) { local int i, j, k, RangeBase; local int PolicyCount, MaxBans; local int DayTemp, MapTemp; local string IPTemp, comment; MaxBans = ArrayCount(opconf.DynaPolicies); // A range button is pressed - set the appropriate range if (Request.GetVariable("B1", "") != "") DynaPage = 0; else if (Request.GetVariable("B51", "") != "") DynaPage = 1; else if (Request.GetVariable("B101", "") != "") DynaPage = 2; else if (Request.GetVariable("B151", "") != "") DynaPage = 3; else if (Request.GetVariable("B201", "") != "") DynaPage = 4; // A policy is changed if (Request.GetVariable("Update") != "") { i = int(Request.GetVariable("PolicyNo", "-1")); if (i == -1) for (i = 0; i < MaxBans && opconf.DynaPolicies[i] != ""; i++); if (i < MaxBans) { opconf.ExtractDynaData(i, IPTemp, DayTemp, MapTemp, comment); DayTemp = int(Request.GetVariable("DayCount")); MapTemp = int(Request.GetVariable("MapCount")); comment = Request.GetVariable("Reason")$":"$SepRight(comment); IPTemp = Request.GetVariable("IPMask"); if (IPTemp != "") { if (comment != "") opconf.DynaPolicies[i] = IPTemp$"="$DayTemp$","$MapTemp$"!"$comment; else opconf.DynaPolicies[i] = IPTemp$"="$DayTemp$","$MapTemp; } } opconf.SaveConfig(); } // A policy is deleted if (Request.GetVariable("Delete") != "") { i = int(Request.GetVariable("PolicyNo", "-1")); if (i >= 0) { for (i = i; i < MaxBans-1 && opconf.DynaPolicies[i] != ""; i++) opconf.DynaPolicies[i] = opconf.DynaPolicies[i + 1]; if (i == MaxBans-1) opconf.DynaPolicies[i] = ""; opconf.SaveConfig(); } } // Change the range select buttons so // only ranges with policies in can be selected for (i = 0; i < MaxBans; i += 50) { if (opconf.DynaPolicies[i] != "") Response.Subst("B"$i$"type", "submit"); else { if (DynaPage > i / 50) // make sure page is within range DynaPage = i / 50; Response.Subst("B"$i$"type", "hidden"); } } // Show the IPPolicies for the page range RangeBase = DynaPage * 50; Response.Subst("Range", RangeBase + 1 $ " - " $ RangeBase + 50); if(UTGLEnabled) Response.Subst("NickLog", "Nick/Login"); else Response.Subst("NickLog", "Nick"); Response.IncludeUHTM("ob_ipdyna-h.uhtm"); for (i = RangeBase; i < RangeBase + 50 && opconf.DynaPolicies[i] != ""; i++) { opconf.ExtractDynaData(i, IPTemp, DayTemp, MapTemp, comment); Response.Subst("IPMask", IPTemp); Response.Subst("DayCount", string(DayTemp)); Response.Subst("MapCount", string(MapTemp)); Response.Subst("Reason", FixHTML(SepLeft(comment))); Response.Subst("Ident", FixHTML(SepRight(comment))); Response.Subst("PostAction", "dynalist?PolicyNo="$string(i)); Response.IncludeUHTM("ob_ipdyna-d.uhtm"); } Response.Subst("PostAction", "dynalist"); // Only put a 'new' button on the last page if ((DynaPage + 1 >= MaxBans / 50) || (opconf.DynaPolicies[(DynaPage + 1) * 50] == "")) { Response.Subst("DayCount", string(opconf.DefBanDays)); Response.Subst("MapCount", string(opconf.DefBanMaps)); Response.Subst("Comment", ""); Response.IncludeUHTM("ob_ipdyna-s.uhtm"); } Response.IncludeUHTM("ob_ipdyna-f.uhtm"); } function QueryOptions(WebRequest Request, WebResponse Response) { local bool CleanList, KickPLayers, Announce, SysIni; local string sAutoPass, sAutoName; // Load up the current options CleanList = opconf.bCleanPolicy; KickPlayers = opconf.bKickPlayers; Announce = opconf.bAnnounceKicks; SysIni = opmain.bUseSystemIni; sAutoPass = opconf.sAutoPass; sAutoName = opconf.sAutoName; // An update... if (Request.GetVariable("Apply", "") != "") { // Get the web page options data CleanList = bool(Request.GetVariable("DoCleanup", "false")); KickPlayers = bool(Request.GetVariable("DoKick", "false")); Announce = bool(Request.GetVariable("DoAnnounce", "false")); sAutoPass = Request.GetVariable("AutoPass", ""); sAutoName = Request.GetVariable("AutoName", ""); if (!opmain.bLockIniChoice) // Don't change ini file if not allowed SysIni = bool(Request.GetVariable("UseSysIni", "false")); // Change the application options opconf.bCleanPolicy = CleanList; opconf.bKickPlayers = KickPlayers; opconf.bAnnounceKicks = Announce; opconf.sAutoPass = sAutoPass; opconf.sAutoName = sAutoName; if (!opmain.bLockIniChoice) // Don't change ini file if not allowed { opmain.bUseSystemIni = SysIni; opmain.SaveConfig(); } opconf.SaveConfig(); } // Set the display to match the current options if (CleanList) Response.Subst("DoCleanup", " checked"); if (KickPLayers) Response.Subst("DoKick", " checked"); if (Announce) Response.Subst("DoAnnounce", " checked"); if (SysIni) Response.Subst("UseSysIni", " checked"); Response.Subst("AutoName", sAutoName); Response.Subst("AutoPass", sAutoPass); if (opmain.bLockIniChoice) Response.Subst("IniLock", "Locked"); else Response.Subst("IniLock", "Requires level restart"); Response.Subst("PostAction", OPBanOptions); Response.IncludeUHTM("ob_options.uhtm"); } // Gah! Generic mass edit list function. UT doesn't allow passing of a // static array to functions, so we have to work out which one it is and // explicitly specify it every time... function QueryEditList(WebRequest Request, WebResponse Response, bool bIsOPList) { local int i, j, k, ItemCnt, MaxCount, DropCount; local string EditListData, ItemData, policy, ListName; if (bIsOPList) { ListName = "OPBan"; MaxCount = ArrayCount(opconf.IPPolicies); } else { ListName = "UT"; MaxCount = ArrayCount(Level.Game.IPPolicies); } if (Request.GetVariable("Apply", "") != "") { // Make sure the browser does scripting if (Request.GetVariable("Check", "") != "") { Response.Subst("SmallTitle", "Mass Edit Problem"); Response.Subst("Title", "No browser scripting available"); Response.Subst("Message", "You were told, but would you listen? Hahaha...bonk"); Response.IncludeUHTM("message.uhtm"); return; } ItemCnt = Request.GetVariableCount("AddressData"); j = 1; // Start at policy 1 (0 is always ACCEPT/DENY *) DropCount = ItemCnt; for (i = 0; i < ItemCnt; i++) { if (j >= MaxCount) // don't overrun policy store break; // Get next policy to store ItemData = Request.GetVariableNumber("AddressData", ItemCnt - 1 - i); // check it really is a policy k = InStr(ItemData, ","); if (k == -1) // No ',' means invalid policy { DropCount--; continue; } policy = Left(ItemData, k); // Get policy type if ((policy ~= "DENY") || (policy ~= "ACCEPT")) { // good policy so store and point to next if (bIsOPList) opconf.IPPolicies[j] = ItemData; else Level.Game.IPPolicies[j] = ItemData; j++; } else DropCount--; } DropCount = DropCount + 1 - j; // Remember if any got dropped ItemCnt = j - 1; // Fix real count (excluding invalid items) // Clear the rest of the policies (if any) while (j < MaxCount) { if (bIsOPList) opconf.IPPolicies[j] = ""; else Level.Game.IPPolicies[j] = ""; j++; } if (bIsOPList) opconf.SaveConfig(); else Level.Game.SaveConfig(); Response.Subst("Title", ListName$" policy"); if (DropCount > 0) { Response.Subst("SmallTitle", "Mass Edit Problem"); Response.Subst("Message", "Last "$DropCount$" items dropped - only "$MaxCount - 1$" allowed."); Log(opconf.sApplication$": "$ListName$" policy updated with "$ItemCnt$" items ("$DropCount$" dropped)."); } else { Response.Subst("SmallTitle", "Mass Edit"); Response.Subst("Message", ItemCnt $" policies stored, space for " $(MaxCount - 1) - ItemCnt$" left."); Log(opconf.sApplication$": "$ListName$" policy updated with "$ItemCnt$" items."); } Response.IncludeUHTM("message.uhtm"); return; } if (bIsOPList) { for (i = 1; i < MaxCount && opconf.IPPolicies[i] != ""; i++) EditListData = EditListData$Chr(13)$opconf.IPPolicies[i]; } else { for (i = 1; i < MaxCount && Level.Game.IPPolicies[i] != ""; i++) EditListData = EditListData$Chr(13)$Level.Game.IPPolicies[i]; } Response.Subst("SmallTitle", "Mass Edit"); Response.Subst("Title", ListName$" Policy"); Response.Subst("EditListData", EditListData); if (bIsOPList) Response.Subst("PostAction", "editOPlist"); else Response.Subst("PostAction", "editUTlist"); Response.IncludeUHTM("ob_editlist.uhtm"); } function QueryEditDynaList(WebRequest Request, WebResponse Response) { local int i, j, k, ItemCnt, MaxCount, DropCount; local string EditListData, ItemData; MaxCount = ArrayCount(opconf.DynaPolicies); if (Request.GetVariable("Apply", "") != "") { // Make sure the browser does scripting if (Request.GetVariable("Check", "") != "") { Response.Subst("SmallTitle", "Mass Edit Problem"); Response.Subst("Title", "No browser scripting available"); Response.Subst("Message", "You were told, but would you listen? Hahaha...bonk"); Response.IncludeUHTM("message.uhtm"); return; } ItemCnt = Request.GetVariableCount("AddressData"); j = 0; DropCount = ItemCnt; for (i = 0; i < ItemCnt; i++) { if (j >= MaxCount) break; ItemData = Request.GetVariableNumber("AddressData", ItemCnt - 1 - i); if (InStr(ItemData,"=") == -1) { DropCount--; continue; } if (InStr(ItemData,",") == -1) { DropCount--; continue; } opconf.DynaPolicies[j] = ItemData; j++; } DropCount = DropCount - j; ItemCnt = j; while (j < MaxCount) { opconf.DynaPolicies[j] = ""; j++; } opconf.SaveConfig(); Response.Subst("Title", "Dynamic policy"); if (DropCount > 0) { Response.Subst("SmallTitle", "Mass Edit Problem"); Response.Subst("Message", "Last "$DropCount$" items dropped - only "$MaxCount$" allowed."); Log(opconf.sApplication$": Dynamic policy updated with "$ItemCnt$" items ("$DropCount$" dropped)."); } else { Response.Subst("SmallTitle", "Mass Edit"); Response.Subst("Message", ItemCnt $" policies stored, space for " $(MaxCount) - ItemCnt$" left."); Log(opconf.sApplication$": Dynamic policy updated with "$ItemCnt$" items."); } Response.IncludeUHTM("message.uhtm"); return; } for (i = 0; i < MaxCount && opconf.DynaPolicies[i] != ""; i++) EditListData = EditListData$Chr(13)$opconf.DynaPolicies[i]; Response.Subst("SmallTitle", "Mass Edit"); Response.Subst("Title", "Dynamic Policy"); Response.Subst("EditListData", EditListData); Response.Subst("PostAction", EditDynaList); Response.IncludeUHTM("ob_editdyna.uhtm"); } // The generic automatons 'page' for the mass edit list // Again, because UT doesn't allow static array passing, // selecting and specifying the list is done every time // it's accessed. function QueryAutoList(WebRequest Request, WebResponse Response, bool bIsOPList) { local int i, j, k, ItemCnt, MaxCount, DropCount; local string EditListData, ItemData, policy, ListName; if (bIsOPList) { ListName = "OP"; MaxCount = ArrayCount(opconf.IPPolicies); } else { ListName = "UT"; MaxCount = ArrayCount(Level.Game.IPPolicies); } if (Request.GetVariable("Apply", "") != "") { ItemCnt = Request.GetVariableCount("AddressData"); j = 1; // Start at policy 1 (0 is always ACCEPT/DENY *) DropCount = ItemCnt; for (i = 0; i < ItemCnt; i++) { if (j >= MaxCount) // don't overrun policy store break; // Get next policy to store ItemData = Request.GetVariableNumber("AddressData", ItemCnt - 1 - i); // check it really is a policy k = InStr(ItemData, ","); if (k == -1) // No ',' means invalid policy { DropCount--; continue; } policy = Left(ItemData, k); // Get policy type if ((policy ~= "DENY") || (policy ~= "ACCEPT")) { // good policy so store and point to next if (bIsOPList) opconf.IPPolicies[j] = ItemData; else Level.Game.IPPolicies[j] = ItemData; j++; } else DropCount--; } DropCount = DropCount + 1 - j; // Remember if any got dropped ItemCnt = j - 1; // Fix real count (excluding invalid items) // Clear the rest of the policies (if any) while (j < MaxCount) { if (bIsOPList) opconf.IPPolicies[j] = ""; else Level.Game.IPPolicies[j] = ""; j++; } if (bIsOPList) opconf.SaveConfig(); else Level.Game.SaveConfig(); if (DropCount > 0) Log(opconf.sApplication$": "$ListName$" policy auto-updated with "$ItemCnt$" items ("$DropCount$" dropped)."); else Log(opconf.sApplication$": "$ListName$" policy auto-updated with "$ItemCnt$" items."); } Response.SendText(opconf.sApplication$Chr(13)$opconf.sVersion$Chr(13)$ListName); if (bIsOPList) { for (i = 1; i < MaxCount && opconf.IPPolicies[i] != ""; i++) Response.SendText(opconf.IPPolicies[i]); } else { for (i = 1; i < MaxCount && Level.Game.IPPolicies[i] != ""; i++) Response.SendText(Level.Game.IPPolicies[i]); } Response.SendText("---"); } // The automatons 'page' for the dynamic ban list. function QueryAutoDynaList(WebRequest Request, WebResponse Response) { local int Maxcount, DropCount, ItemCnt, i, j, k; local string EditListData, ItemData, Policy; MaxCount = ArrayCount(opconf.DynaPolicies); if (request.GetVariable("Apply", "") != "") { ItemCnt = Request.GetVariableCount("AddressData"); j = 0; // Dynamic ban list starts at 0 DropCount = ItemCnt; for (i = 0; i < ItemCnt; i++) { if (j >= MaxCount) // Don't go past the end! break; // Next item to store ItemData = Request.GetVariableNumber("AddressData", ItemCnt - 1 - i); // Check it's at least notionally valid - contains the '=' and ',' // delimeters ('!' is optional) if (InStr(ItemData,"=") == -1) { DropCount--; continue; } if (InStr(ItemData,",") == -1) { DropCount--; continue; } // Probably OK if we get here, so store it verbatim opconf.DynaPolicies[j] = ItemData; j++; } DropCount = DropCount - j; // Remember if any got dropped ItemCnt = j; // Fix real count (excl invalid items) // Clear the rest of the array while (j < MaxCount) { opconf.DynaPolicies[j] = ""; j++; } // Commit the changes opconf.SaveConfig(); if (DropCount > 0) Log(opconf.sApplication$": Dynamic ban list auto-updated with "$ItemCnt$" items ("$DropCount$" dropped)."); } Response.SendText(opconf.sApplication$Chr(13)$opconf.sVersion$Chr(13)$"Dynamic"); for (i = 0; i < MaxCount && opconf.DynaPolicies[i] != ""; i++) Response.SendText(opconf.DynaPolicies[i]); Response.SendText("---"); } function string GetStrTime(int Time) { local int m; local int s; m = (Time % 3600) / 60; s = Time % 60; if(s<10) return string(m)$":0"$string(s); else return string(m)$":"$string(s); } function string FixHTML(string Str) { return ReplaceCharacters(ReplaceCharacters(Str, "<", "<"), ">", ">"); } function string ReplaceCharacters(string Str, string Char, string Replace) { local int CharNum, i; local String OutStr; local int StrLenght; StrLenght=Len(Str); CharNum=0; for(i=1;i20) break; CommaLoc[i]=StrTemp; i++; } } if(Elem==1) return Left(Str,CommaLoc[1]-1); else if(Elem==ElementsNum(Str) && Right(Str,1)==",") return ""; else if(Elem==ElementsNum(Str)) return Right(Str,StrLenght-CommaLoc[Elem-1]); else if(Elem > 1 && Elem <= ElementsNum(Str)) return SelElem(Mid(Str, CommaLoc[Elem-1]), 1); } p v Q#…7Ax©v )rx*\VxºMz\YCustomwCustom‚r©\ *9‚{Y –~,2¿|w Yu selectedÇutpppppppt•Ì\¥~Yw‚t c {/¡ Î@-htOPO,ú0tUTO,2 {{ŠApplyU{²AddressData\&_UF%Ÿ–FU«™\OŸr{"ªAddressData““U&FA~r,šAÿÿÿÿ¦_•D€rAŽ„|DDENY|DACCEPTa-h\ r„\•›£r¥\•¦_¥FŠ_“’_&\U“\&–\Oô-h\ \•›£¥\Â6-h bK•›b¾—_%çppppppp !: t policy auto-updated with SU items (S_ dropped). çppppp !: t policy auto-updated with SU items.S7pppp !ì,  Fì, t¸-hF&µ‚–FO{F SF ¥F\*F&*‚–FO"{F•›£S#F•›£¥F¿S --- z€@t o '¾5²A%ª–A,Az A & zpppppz¥Az S€@K////////////////////////////////////////////////////////////////////////// // // Unreal Tournament Ban List Extender // ----------------------------------- // // Programmed by PurplePants@purplemetalflake.co.uk // // Copyright © PurplePants, 2002-2004 // // Configuration class (SuperWebAdmin.OPBanConfigUT) // // This config actor uses .ini to store the config // ////////////////////////////////////////////////////////////////////////// class OPBanConfigUT extends OPBanConfig config (system); `'class SuperServerAdminSpectator extends MessagingSpectator config; struct PlayerMessage { var PlayerReplicationInfo PRI; var String Text; var Name Type; var PlayerMessage Next; // pointer to next message }; var ListItem MessageList; var byte ReceivedMsgNum; var config byte ReceivedMsgMax; var config bool bClientMessages; var config bool bTeamMessages; var config bool bVoiceMessages; var config bool bLocalizedMessages; var bool bBlockLog; var String LastMsg; function AddMessage(PlayerReplicationInfo PRI, String S, name Type) { local ListItem TempMsg; TempMsg = new(None) class'ListItem'; if(bBlockLog) { LastMsg=S; bBlockLog=False; return; } TempMsg.Data = FormatMessage(PRI, S, Type); if (MessageList == None) MessageList = TempMsg; else MessageList.AddElement(TempMsg); if ((ReceivedMsgNum++) >= ReceivedMsgMax) MessageList.DeleteElement(MessageList); // delete the first element } function String FormatMessage(PlayerReplicationInfo PRI, String Text, name Type) { local String Message; // format Say and TeamSay messages if (PRI != None) { if (Type == 'Say') Message = PRI.PlayerName$": "$Text; else if (Type == 'TeamSay') Message = "["$PRI.PlayerName$"]: "$Text; else Message = "("$Type$") "$Text; } else if (Type == 'Console') Message = Text; else Message = "("$Type$") "$Text; return Message; } function ClientMessage( coerce string S, optional name Type, optional bool bBeep ) { if (bClientMessages) AddMessage(None, S, Type); } function TeamMessage( PlayerReplicationInfo PRI, coerce string S, name Type, optional bool bBeep ) { if (bTeamMessages) AddMessage(PRI, S, Type); } function ClientVoiceMessage(PlayerReplicationInfo Sender, PlayerReplicationInfo Recipient, name messagetype, byte messageID) { // do nothing? } function ReceiveLocalizedMessage( class Message, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { // do nothing? } function string ServerMutate(string MutateString, optional bool OutPut) { local String Str; local Mutator Mut; if(OutPut) bBlockLog=True; Mut = Level.Game.BaseMutator; // While(Mut.NextMutator!=None) // { Mut.Mutate(MutateString, Self); // Mut = Mut.NextMutator; // } Str=LastMsg; if(OutPut) { return Str; } else return ""; } v u '4ÅS~½wS*B|u Sž selectedJ}ppppppp}SS§ } I '@’ ¥ÎH {'ŠApply >pmvr set AdminPassword 'ŠAdminPassword 8pmvr set ServerAddr 'ŠServerAddr 8pmvr set ServerPort 'ŠServerPort @pmvr set AntiFloodDelay 'ŠAntiFloodDelay 2pmvr set Channel 'ŠChannel 4pmvr set NickName 'ŠNickName 6pmvr set bUseLogin 'ŠbUseLogin 4pmvr set UserName 'ŠUserName 4pmvr set Password 'ŠPassword @pmvr set bSecondaryLink 'ŠbSecondaryLink 6pmvr set NickName2 'ŠNickName2 6pmvr set UserName2 'ŠUserName2 6pmvr set Password2 'ŠPassword2 4pmvr set bUseAuth 'ŠbUseAuth 4pmvr set AuthName 'ŠAuthName <pmvr set AuthPassword 'ŠAuthPassword 4pmvr set Perform1 'ŠPerform1 4pmvr set Perform2 'ŠPerform2 4pmvr set Perform3 'ŠPerform3 Bpmvr set bExtra1on1Stats 'ŠbExtra1on1Stats 8pmvr set bPublicSay 'ŠbPublicSay&<†AdminPassword mvr get AdminPassword'&6†ServerAddr mvr get ServerAddr'&6†ServerPort mvr get ServerPort'&>†AntiFloodDelay mvr get AntiFloodDelay'&0†Channel mvr get Channel'&2†NickName mvr get Nickname'O| mvr get bUseLogin'True&†bUseLogin checked&2†UserName mvr get Username'&2†Password mvr get Password'!| mvr get bSecondaryLink'True& †bSecondaryLink checked&4†NickName2 mvr get Nickname2'&4†UserName2 mvr get Username2'&4†Password2 mvr get Password2'( | mvr get bUseAuth'True&†bUseAuth checked&2†AuthName mvr get AuthName'&:†AuthPassword mvr get AuthPassword'&2†Perform1 mvr get Perform1'&2†Perform2 mvr get Perform2'&2†Perform3 mvr get Perform3'µ | mvr get bExtra1on1Stats'True&!†bExtra1on1Stats checked | mvr get bPublicSay'True&†bPublicSay checked&†PostActionp&™pp.uhtm y t í2·K©t k%¦–k, |wJ*kKº¸JžJJ§œkKº¸¥k"K´ M‰r@} z0Ê4.žp©s 1rpº* œwp*v%œ‚–v, "{vpº¸Uz(zvpº¸erU*U* ‰Užvpº¸E|êUž,.unrU¬€Už“}Už,bU¬Už’~rB*BU’B U¥vC k@N nH™qË–PnŠSendText?{PÞ|€P,say s*1ppn—(Web): P,çppppSuperWebAdmin: User n— has sent a message to server's console('P,').? ‚|€P,mutate 1—n—È, P,çppppSuperWebAdmin: User n— has used a mutate command('P,').?}‚|€P,admin 1šn—È,|• P+{| *|!.çppppSuperWebAdmin: User n— has used a command('P').??šn—È,|• Pð{| *|!.çppppSuperWebAdmin: User n— has used a command('P').z†LogURIcz†SayURISz™pV.uhtm n Gzû ôœr,úâ{GŠApplyoG²AddressDatas%`ot%–toƒ™sreG"ªAddressData““o&tÒš~e=ÿÿÿÿ¦`ðš~e,ÿÿÿÿ¦`s e¥s¥tb`“`sosh–srs ¥s8 bâ—`%çppppp !: Dynamic ban list auto-updated with So items (S` dropped).I;pppp !ì,  Fì, Dynamict%†‚–tr{t It ¥t-I --- @ v¥7*‘s©r v*9zsÅ |•bsÅ%[|‚||x {|[|€[“}[,psÅ-tutorialk* ‰kž[|ê[,.unrk¬€[“}[,)k¬[Brv*vk[v vk[•bsÅ[&x[g {  CÄaÑ} H}w}*f{}žApppA>  }ž
}}§F†LogRefreshppppphttp://b Á/c#END†LogTextA™pc.uhtm €…C pW‚¤&dt¥©q q*pp t, d%b–dtnzdt¸b'wp*uppdt¸âwu*Ërq*qußq u$çpSuperWebAdmin: Unknown map in Map List: dt¸XçpSuperWebAdmin: Empty exclude list, i=Sd¥dA y€@E @I o t%Vš}K%K yo G–}ysypKy!êys E H€@@| o&9q&eZ‘D­?o?,<_D­?o?,<O–_, ppSZ:0S_cppSZ:S_ L p*b#4rp*HpùwH*M†H-­M selectedH-­(WpppppppWHH§?W Z€@C€@R K Oe!£r%*N%žC%§xwC*NppN,CžCC§6›{.NppN,.N H m D$'&m <<>> ~ S ?Ñ,ÓdF†DefaultSendTextg F†PostActionVF™pS.uhtm €@M ]M(¢_}]d%\&T–\_Jzê€]\&g¥d¥\S]\%š–\dS\Sgl ¥\fS W €‘X h<u.:*[&X˜[h/* ‰/žh[qš~/ž.ÿÿÿÿNl¦©/ž £rl*N¼r:*:/N::/ž\$$/ž-w\*% %\N-n': :/¥[.m-n /%¼w/*::/ž//§x/:,w/*õz../ž.pp.,/ž//§Ç F€…d€@cQ‰_ €‘\ efÈ~è$*•!ÌEngine.Mutator%TN)‚{T –e,2* ‰c~N,šcÿÿÿÿ¬N«¬€NcžTØr$*$ñ$ $¥e•%ÌEngine.MutatoreTN1%*Q•›ÉÚÙwQ*$$VQ¤Âw*®r%*%Â% QQÚVU•vV~U?mutator=.êU““}UV, V~.?.€.VR&˜R.* ‰ž.R±š~ž.ÿÿÿÿa¦©ž ãra*ür:*:: :¥RN%nw*::ž§*.:æw*¯z..žÏ.pp.,ž§ P J\e«)¨›~]^ÿÿÿÿZ}J@&m–@Zczê€J@&^s@m¥@-Spp€J“s&]êJ“}JsS N n !ØÔm•[ppppp€V•~V•..unr?game=V•›¤?mutator= (I†TitlePlease WaitI{†MessageThe server is now restarting the current map. Please allow 10-15 seconds while the server changes levels.çppSuperWebAdmin: User n — has restarted the current map !I ™1 Z TDäUÖ%j{TŠAddMutatorXT²ExcludeMutatorsSelectd%g–dX]w$*+$6$T"ªExcludeMutatorsSelectdw+*+-­'ër%*%+ÿ% +]çpSuperWebAdmin: Exclude mutator not found: T"ªExcludeMutatorsSelectd¥dW_Ù{TŠDelMutatorXT²IncludeMutatorsSelectd%Ö–dXÌw%*+%6%T"ªIncludeMutatorsSelectdqw+*+-­'Ur$*$+n$ $+ÌçpSuperWebAdmin: Include mutator not found: T"ªIncludeMutatorsSelectd¥dÁ_u{TŠAddAllMutatorsrw$*+$ $ow+*+-­'[r%*%+o% +_{TŠDelAllMutatorsw%*+% %w+*+-­'÷r$*$+$ $+__{TŠUpdateOther<TŠOtherMutatorsm)†ExcludeMutatorsOptions*$m)†IncludeMutatorsOptions*%m†OtherMutators.m†PostActionPm™pP.uhtm ^ mU£~*m Àf•âTournamentGameInfo%{fk ~f.m©f H* ‰H¬mñHžfÌr~*~Hà~ Hf•!âTournamentGameInfo£j < Z€@æ i,`À Ôæç###############################ç# SUPER WEBADMIN 0.95beta #ç# Author: Rush(rush@u.one.pl) #ç############################### •a s•a Ë -É'ër** -p-c /• a0 Ci’‘zVi¤OPBan.OPBançSuperWebAdmin: External OPBan is already spawned ! You have to disable it.-p(105-pçSuperWebAdmin: Spawning OPBan ...•a C/• a0 Ci43zVi¤SuperWebAdmin.OPBan iA9i10›‚„z€V•,BT-z€V•,CTF-BT-,{V•›¤BotPack.CTFGame-'UfÒò.“•›-È'-(' ` €€ÃZ c t[c ÂÿÿY w(~&+tL}wl&O˜lLEzê€wl&:-'O¥lo-êw“Llr g €ûL€@[ Je:Ëà.S•&get engine.gameinfo MaxPlayersR•)get engine.gameinfo MaxSpectatorsX•(get engine.gameinfo GamePasswordQ•+get engine.gameinfo bMuteSpectators-{JŠApplySJŠMaxPlayersRJŠMaxSpectatorsXJŠGamePasswordQJŠMuteSpectatorsfalse•.pset engine.gameinfo MaxPlayers S•1pset engine.gameinfo MaxSpectators R•0pset engine.gameinfo GamePassword X•3pset engine.gameinfo bMuteSpectators QçpppppppppSuperWebAdmin: User J— has changed CurrentRules to MaxPlayers=S, MaxSpectators=R, GamePassword=X, MuteSpectators=Qb†GamePasswordXb†MaxPlayersSb†MaxSpectatorsRÎ|Qtrueb †MuteSpectators checkedïb†MuteSpectatorsb†PostAction\b™p\.uhtm e 2_Œç`* {ŠSwitchGameTypeAndMapJŠGameTypeSelect]  ,©] |  ,true•Hppset   , bTournament TrueÑÑ„|  ,false*|  ,•Ippset   , bTournament False•Hpset engine.gameinfo GamePassword ŠGamePassword“ØJSùúJŠPlayersSelect%, “ÎJSúJŠSpecSelect%“-ÏK  , “-ÈK  ,¾‚w“*r¹*~wš*šÖLSúJ  ,%¾“ÓDLSúJ  ,%IrÀ*“ÑDLSúJ  ,%“-ÒK  ,‚wš*a Äa ¹š»ùúJ  , ,,Xwš*šÛ¬LSùúJ  , %,dÈBš-ÔK  ,  ,  ´0“-¾(“-¼(! é1“-¾(“-¼'! 2“-¾'“-¼'! ÿÿ“Õ¬?ùúJ  , , ,ÈÈB“ͬ?ùúJ  ,%,dÈB“-ÙK  ,´î„š%.|  ,True•Npset engine.gameinfo MaxPlayers   ,•Qpset engine.gameinfo MaxSpectators   ,+š%•(set engine.gameinfo GamePasswordaŠMapSelect•Qppppa?game=]?mutator=  ,(†TitlePlease WaitȆMessageppppThe server is now switching to map 'a' and custom set game type to '  &'. Please allow 10-15 seconds while the server changes levels.çppppSuperWebAdmin: User — has switched to a QuickSet Mode '  &'. ™1^Î {ŠSwitchGameTypeJŠGameTypeSelectZ  ,„ {Z†GameTypeButtonx š%`†RestartButtonF ù |  ,trueE†MapButtonF D†MapButton~†GameTypeSelectppp  &n†MapSelectppMap:†PostActionL™pL.uhtmË >ERROR: GameType not properly set or there are no maps.^Ü{ŠPlayersJŠGameTypeSelect†GameTypeButton†MapButton~†GameTypeSelectppp  &Ó†MapSelectppppMap:€ŠMapSelect“}ŠMapSelect,I†PlayersButtonµ†PlayersSelectppPlayers/Spec:ΆSpecSelect†PostActionL™pL.uhtm^Î{ŠPasswordJŠGameTypeSelect{•(get engine.gameinfo GamePassword†GameTypeButton†MapButton~†GameTypeSelectppp  &Ó†MapSelectppppMap:€ŠMapSelect“}ŠMapSelect,†PlayersButton²{ŠSpecSelectІPlayersSelectppppPlayers/Spec:SùúJŠPlayersSelect%, “†SpecSelectpppp - ŠSpecSelectƒ†PasswordppPasswordG†PasswordButton†PostActionL™pL.uhtm^ô{ŠReadyJŠGameTypeSelect†GameTypeButton†MapButton~†GameTypeSelectppp  &Ó†MapSelectppppMap:€ŠMapSelect“}ŠMapSelect,†PlayersButtonj{ŠSpecSelectІPlayersSelectppppPlayers/Spec:SùúJŠPlayersSelect%, “†SpecSelectpppp - ŠSpecSelect·†PasswordppppPassword:ŠGamePassword†PasswordButton`†RestartButton†PostActionL™pL.uhtm^({'R†GameTypeButton†MapButtonK†GameTypeSelectpp†MapSelect†PostActionL™pL.uhtm^-ERROR: No QuickSet Options are set !. l b ]]”z,s~}][&O˜[~Ezê€][&:-}'O¥[k-}€]“[&q] €@~€@T@@m ‘o ‘h z^§-ëé-X-X'Cz getglstatus'True-r'qz mvrstatus'True-~'/•› a0 ¢zèç›~Vz¤EasyMuteÿÿÿÿ-l'çSuperWebAdmin: EasyMute Mode ON!è10 œn yÀ­/]x}ye%Z&R˜ZxHzê€yZ&,¥e¥Z’e& a f bàe-u-x'r®›Ér jf D G`-uD c x€%‰s ‰x ‰p wÒä05z&p}wn&r–nphzê€wn&,P—z,rzDn¥z¥n’šR&€w“&D&3¿‚šRwzêw&,3ôšRwêw“p“R&D33‚—R&˜Rww“R&D& D €@]@p€@f Z3·Å>{ZŠStart mvr start'ûz{ZŠStop mvr stop'û¼{ZŠRestart mvr restart'û{ZŠMuteOutPut mvr muteoutput'ûF{ZŠPubComs mvr pubcoms'û({ZŠApply%wš•›¤* 3pmvr set TeamRed ZŠTeamRed' 5pmvr set TeamBlue ZŠTeamBlue'%‚a•›¤ Ä"a•›¤ ¹º—š•›¤», 7pmvr set TeamGreen ZŠTeamGreen'%—š•›¤», 5pmvr set TeamGold ZŠTeamGold'ûû{ZŠReset !mvr set TeamRed Red Team' #mvr set TeamBlue Blue Team' %mvr set TeamGreen Green Team' #mvr set TeamGold Gold Team'Y mvr status'?zYYNot respondingxz mvr mutestatus'1fUnMute„fMuteÁz mvr pubcomsstatus'1gDisableÏgEnable'wš•›¤*p˜†TeamRedppName of Team Redpœ†TeamBlueppName of Team Blue'‚a•›¤ Ä"a•›¤ ¹V—š•›¤»,p †TeamGreenppName of Team Green'—š•›¤»,pœ†TeamGoldppName of Team Goldp†MuteStringfp†PubComsStringgp†StatusYp†PostAction^p™p^.uhtm Ýd EjÝd e  } cM XçpppppR!: Shutting down watcher Su after SC secondsa ü@ H|+>±¥Cu—C,çpppR!: Watcher Su aborting after 15 secs without target acquisition†rs*Àšu%QsÃH~Q:×›HÿÿÿÿQ€QH½{Q^ s˜¡çppppR!: Watcher Su checking IPPolicy for Q¶R "QR#sÿÿÿÿçppR!: Denied connection for Q½u&¯¨šu&¥{QçppppR!: Watcher Su checking DynaPolicy for QQR `QŸ›QÿÿÿÿR#sQçppR!: Denied connection for Q¥¯u% z vAO9"ûkv(ŠGameTypeV•›¤lvŠPageiO;†IndexURIppppO?GameType=k&Page=lO)†MainURIppl?GameType=kO™p3.uhtmO¯ D@R,¡EçpppR!: Watcher Su startingu%a€?' ~ bJ_È$h`%*bŠGameTypeqb ŠPagekz**V•›¤Ö{bŠGameTypeSetobŠGameTypeSelect*Ö|o**o-†PostAction3-†GameType*-†Pageq-†DefaultBGnmjihdc^_\YTq îanã bmã cjã 0diã F}hã \gcã rNdã ˆy^ã ž@_ã ´{\ã Ê|Yã àyTã ÿÿ—b—È,-†GameTypeSelppGame Type:-±†MapsppppppppMap List-¯†RulesppppppppRules-µ†SettingsppppppppSettings-цBotsppppppppBots -݆Restartpppppppp Restart Level† „—b—È,r‚‚–b—È, -(0›b—È%-¶†IPPolicyppppppppIP Policy-¼†PasswordppppppppChange Password:‚w9*§„—b—È,r‚‚–b—È, -(0›b—È%-ù†EditUTListppppppppMass Edit:UT Policy-º†OPBanListppppppppOPBan Policy-»†EditOPListppppppppOPBan Policy-»†DynaListppppppppDynamic Policy-ã†EditDynaListppppppppDynamic Policy -™pO.uhtm-¯ K `V7xÛ˜w`*>þ]!rpp`¡: _•wþ]!oppp[`¡]: _•ppp(W]) _Óµþ]!._Óppp(W]) _ I////////////////////////////////////////////////////////////////////////// // // Unreal Tournament Ban List Extender // ----------------------------------- // // Programmed by PurplePants@purplemetalflake.co.uk // // Copyright © PurplePants, 2002-2004 // // Configuration class (SuperWebAdmin.OPBanConfigOP) // // This config actor uses opbans.ini to store the config // ////////////////////////////////////////////////////////////////////////// class OPBanConfigOP extends OPBanConfig config (opbans); oLclass SWAConfig expands Object config(SWAConfig); var config bool bOPBanEnabled; var config bool bForceUTGLModeOff; var config string AdminRealm; var config string ServerURL; var config int UserCount; var config string UserList[50]; var config int Privileges[50]; var config string QuickSetConf[20]; var config bool bTickrateInSettings; function ClearUsers() { // Cheap :) UserCount = 0; SaveData(); } function int AddUser(string Username, string Password, int Privs) { local int Counter; for (Counter = 0; Counter < UserCount; Counter++) { if (ParseForUsername(UserList[Counter]) == Username) { return 1; } } if (UserCount >= 49) return 2; UserList[UserCount] = Username$":"$Password; Privileges[UserCount] = Privs; UserCount++; SaveData(); return 0; } function int DeleteUser(string Username) { local int Counter; local int Counter2; for (Counter = 0; Counter < UserCount; Counter++) { if (ParseForUsername(UserList[Counter]) == Username) { // Found our username - remove then do the hideous shuffle sort up - if my friends at work spotted this they would kill me :) // Quick sanity check if (Counter == 49) { // just blank the last line UserList[49] = ""; Privileges[49] = 0; UserCount--; SaveData(); return 0; } for (Counter2 = Counter; Counter2 < UserCount; Counter2++) { UserList[Counter2] = UserList[Counter2+1]; Privileges[Counter2] = Privileges[Counter2+1]; } UserCount--; SaveData(); return 0; } } return 1; } function ChangeUsername(string OrigUsername, string NewUsername) { local int Counter; for (Counter = 0; Counter < UserCount; Counter++) { if (ParseForUsername(UserList[Counter]) == OrigUsername) { UserList[Counter] = NewUsername$":"$ParseForPassword(UserList[Counter]); Break; } } SaveData(); } function ChangePassword(string Username, string OrigPassword, string NewPassword) { local int Counter; for (Counter = 0; Counter < UserCount; Counter++) { if (ParseForUsername(UserList[Counter]) == Username) { UserList[Counter] = Username$":"$NewPassword; Break; } } SaveData(); } function SaveData() { local int Counter; for (Counter = UserCount; Counter < 50; Counter++) { //if (UserCount == 49) // break; UserList[Counter] = ""; Privileges[Counter] = 0; } SaveConfig(); } function string ParseForUsername(string Input) { local int i; local int pos; pos = 0; while(True) { if(Pos == 0) { i = InStr(Input, ":"); if(i != -1) Input = Left(Input, i); return Input; } i = InStr(Input, ":"); if(i == -1) return ""; Input = Mid(Input, i+1); Pos--; } } function string ParseForPassword(string Input) { local int i; local int Pos; Pos = 1; while(True) { if(Pos == 0) { i = InStr(Input, ":"); if(i != -1) Input = Left(Input, i); return Input; } i = InStr(Input, ":"); if(i == -1) return ""; Input = Mid(Input, i+1); Pos--; } } function bool CheckUser(string Username, string Password) { local int Counter; for (Counter = 0; Counter < UserCount; Counter++) { if (ParseForUsername(UserList[Counter]) == Username) { if (GetPassword(Username) == Password) return true; else return false; } } return false; } function bool UserExists(string Username) { local int Counter; for (Counter = 0; Counter < UserCount; Counter++) { if (ParseForUsername(UserList[Counter]) == Username) { return true; } } return false; } function string GetPassword(string Username) { local string Input; local int Counter; Input = ""; for (Counter = 0; Counter < UserCount; Counter++) { if (ParseForUsername(UserList[Counter]) == Username) { Input = UserList[Counter]; return ParseForPassword(Input); } } return ""; } function int FindUser(string Str) { local int i; for(i=0;i1) { Str=Mid(Str, InStr(Str, Char)+1); Elem--; } pos=InStr(Str, Char); if(pos != -1) Str=Left(Str, pos); return Str; } Qœ/////////////////////////////////////////////////////////////////////////// // // Unreal Tournament Ban List Extender // ----------------------------------- // // Programmed by PurplePants@purplemetalflake.co.uk // // Copyright © PurplePants, 2002-2004 // // Configuration class (SuperWebAdmin.OPBanConfig) // // This config actor provides the base for the derived // actors that use specific config files. Do not use this // class! // ////////////////////////////////////////////////////////////////////////// class OPBanConfig extends Actor; var string sApplication, sVersion; var config string IPPolicies[250]; var config string DynaPolicies[250]; var config bool bCleanPolicy; var config bool bKickPlayers; var config bool bAnnounceKicks; var config string AnnounceTag; var config int DefBanMaps; // Default ban map count var config int DefBanDays; // Default ban day count var config int CheckDay; // Day we last checked what day it is // Name/pass for automatons var config string sAutoName; var config string sAutoPass; // Clean up the UT banlist function CleanBans() { local int i, j, IPcnt; local int MaxBans, MaxUTBans; MaxBans = ArrayCount(IPPolicies) - 1; MaxUTBans = ArrayCount(Level.Game.IPPolicies) - 1; Log(sApplication $ ": Cleaning Bans (" $MaxBans$" max)"); // Start by counting for (IPcnt = 0; IPcnt <= MaxUTBans && Level.Game.IPPolicies[IPcnt] != ""; IPcnt++) ; // A list with less than 10 slots spare requires cleaning if (IPcnt > (MaxUTBans - 10)) { // Nip through the extended list looking for the start of the empties for (i = 0; i < MaxBans && IPcnt > (MaxUTBans - 10); i++) { // Copy all the excess to the extended list.... if (IPPolicies[i] == "") { // ...from the start of the UT list IPPolicies[i] = Level.Game.IPPolicies[1]; Log(sApplication $ ": moved policy " $IPPolicies[i]); // Move later policies to replace the ones we took out for (j = 1; j < MaxUTBans; j++) // 0 = ACCEPT * - don't remove this! { Level.Game.IPPolicies[j] = Level.Game.IPPolicies[j + 1]; } Level.Game.IPPolicies[MaxUTBans] = ""; IPcnt--; } } Level.Game.SaveConfig(); SaveConfig(); } } // CheckDynaPolicy - given an IP address, run through the dynamic banlist // to see if there's a match, returning the array index of the ban if found // or -1 if there is no match function int CheckDynaPolicy(string Address) { local int i, marker, MaxBans; MaxBans = ArrayCount(DynaPolicies); for (i = 0; i < MaxBans; i++) { marker = InStr(DynaPolicies[i], "*"); if (marker != -1) { if (Left(Address, marker) == Left(DynaPolicies[i], marker)) return(i); } else { marker = InStr(DynaPolicies[i], "="); if (marker > 0) { if (Address == Left(DynaPolicies[i], marker)) return(i); } else return(-1); } } return(-1); } // CheckIPPolicy - given an IP address, run through the extended banlist // to see if there's a match, returning aye (==OK) or nay (==ban) function bool CheckIPPolicy(string Address) { local int i, j, LastMatchingPolicy; local string Policy, Mask; local bool bAcceptAddress, bAcceptPolicy; local int MaxBans; MaxBans = ArrayCount(IPPolicies); // strip port number j = InStr(Address, ":"); if (j != -1) Address = Left(Address, j); bAcceptAddress = True; for (i=0; i 0) Days--; } // And/or a map period... if (OneMap) { if (Maps > 0) Maps--; } // No day or map counts means any ban has expired, so... if ((Days == 0) && (Maps == 0)) { Log(sApplication$": Removing expired ban - "$IP); // Move all hogher bans down over this one for (j = i; j < MaxBans; j++) DynaPolicies[j] = DynaPolicies[j + 1]; // Blank out where last ban was DynaPolicies[MaxBans] = ""; // Rerun loop to check the one we just moved down! if (i > 0) i--; } else SetDynaData(i, IP, Days, Maps, comment); // No ban expired, so update details } SaveConfig(); // Make sure the system remembers our changes! } // Retrieve the ban data associate with some entry in the dynamic ban list. function ExtractDynaData(int BanIndex, out string IP, out int Days, out int Maps, out string comment) { local int IPDelim, DaysDelim, MapsDelim; local string BanData; IP = ""; Days = 0; Maps = 0; if (BanIndex < ArrayCount(DynaPolicies)) { BanData = DynaPolicies[BanIndex]; IPDelim = InStr(BanData, "="); if (IPDelim > 0) { IP = Left(DynaPolicies[BanIndex], IPDelim); DaysDelim = InStr(BanData, ","); MapsDelim = InStr(BanData, "!"); if (DaysDelim > 0) { Days = int(Mid(BanData, IPDelim + 1, DaysDelim - IPDelim - 1)); if (MapsDelim > 0) { Maps = int(Mid(BanData, DaysDelim + 1, MapsDelim - DaysDelim - 1)); comment = Mid(BanData, MapsDelim + 1); } else { Maps = int(Mid(BanData, DaysDelim + 1)); comment = ""; } } } } } // Set the ban data associated with a particular item in the dynamic ban list function SetDynaData(int BanIndex, string IP, int Days, int Maps, string comment) { if (BanIndex < ArrayCount(DynaPolicies)) { if (comment == "") DynaPolicies[BanIndex] = IP$"="$Days$","$Maps; else DynaPolicies[BanIndex] = IP$"="$Days$","$Maps$"!"$comment; SaveConfig(); } } // Add a dynamic ban function int AddDynaBan(string IP, int BanDays, int BanMaps, string comment) { local int i, MaxBans; local string sTemp; for (i = 0; i < ArrayCount(DynaPolicies); i++) { if (DynaPolicies[i] == "") { SetDynaData(i, IP, BanDays, BanMaps, comment); sTemp = "Added ban - "$IP$" Days/Maps = "$BanDays$"/"$BanMaps$" "$comment; SaveConfig(); // Make sure the system remembers our changes! log(sApplication$": "$sTemp); return(i); } } sTemp = "Unable to add new ban ("$IP$") - list full"; log(sApplication$": "$sTemp); return(-1); } function int AddIPPolicy(string IP, bool bDeny) { local int i, MaxBans; local string sTemp, sPolicy; if (bDeny) sPolicy = "DENY"; else sPolicy = "ACCEPT"; for (i = 0; i < ArrayCount(IPPolicies); i++) { if (IPPolicies[i] == "") { IPPolicies[i] = sPolicy$","$IP; sTemp = "Added policy - "$sPolicy$","$IP; SaveConfig(); // Make sure the system remembers our changes! log(sApplication$": "$sTemp); return(i); } } sTemp = "Unable to add new policy ("$sPolicy$","$IP$") - list full"; log(sApplication$": "$sTemp); return(-1); } function KickPlayer(PlayerPawn Target, int BanIndex) { local string BanIP, PlayerIP, PlayerNick; local int BanDays, BanMaps; local string sTemp, comment; PlayerNick = Target.PlayerReplicationInfo.PlayerName; PlayerIP = Target.GetPlayerNetworkAddress(); PlayerIP = Left(PlayerIP, InStr(PlayerIP,":")); if (BanIndex != -1) { ExtractDynaData(BanIndex, BanIP, BanDays, BanMaps, comment); sTemp = "kicked "$PlayerIP$" ("$PlayerNick$") - banned (days/maps = "$BanDays$"/"$BanMaps$")"; } else sTemp = "kicked "$PlayerIP$" ("$PlayerNick$")"; Target.ClientMessage("You are currently banned on this server."); log(sApplication$": "$sTemp$" "$comment); if (bAnnounceKicks) BroadcastMessage(AnnounceTag$": "$sTemp); Target.Destroy(); } r ‘c ˆ6% G I_‹Z%=–Z63z Z7I&¥ZL™6,1,67ppI:\ 6Y ¥6% u > ·|;{ŠApply%/–,‘{ŠpGameTypeSE©ŠpGameTypeS tŠpNameS{ŠpGameTypeSbŠpGameTypeSbwŠpMutatorsS|ŠpTournamentSÙ‚‚w“E*r¹E*&{ŠpGameTypeS[SúJŠpMaxScoreS%ä[N/AN‚rÀE*&{ŠpGameTypeSXSúJŠpTimeLimitS%YXN/A7‚wšE*&{ŠpGameTypeSÕ{ëŠpBalanceTeamsSTRUE[false[ŠpBalanceTeamsSGSùúJŠpFriendlyFireS%,dO[falseGN/A‘{ëŠpForceRespawnSTRUEPfalse¼PŠpForceRespawnSý{ëŠpWeaponsStaySTRUEJfalse'JŠpWeaponsStayS½‚‚‚wšE*aE ÄaE ¹&{ŠpGameTypeSESùúJŠpMaxTeamsS,,ÈEN/AAŠpGameStyleSBSùúJŠpGameSpeedS, ,ÈHSùúJŠpAirControlS%,d{ëŠpTransSTRUE~false³~ŠpTransSKSùúJŠpPlayersSelectS%, LŠpSpecSelectSNŠpForcePlayersSetS ppppppppppppppppppppppppppppppppppt:w:b:|:[:X:[:P:J:G:E:A:B:H:~:K:L:N¥&b%ï–,8†pNameS  &_{  ,˜†pGameTypeSppppàx†pGameTypeSpppp=†pMutatorsS  ,† |  ,True$†pTournamentS checked« †pTournamentS=†pMaxScoreS  ,>†pTimeLimitS  ,š |  ,True&†pBalanceTeamsS checkedÁ †pBalanceTeamsS# |  ,True&†pForceRespawnS checkedJ †pForceRespawnS« |  , True%†pWeaponsStayS checkedÑ †pWeaponsStaySV {  , N/AJ†pFriendlyFireSSùúJ  , %,d€ !†pFriendlyFireSN/A=†pMaxTeamsS  ,   ,  0!†pNormalS selected¹ U 1#†pHardCoreS selected¹ ‡ 2 †pTurboS selected¹ ÿÿ#†pHardCoreS selected¹ >†pGameSpeedS  , ?†pAirControlS  ,£|  ,True†pTransS checkedÆpTransSB†pPlayersSelectS  ,  , l0%†p0SpecSelectSselectedK £1%†p1SpecSelectSselectedK Ú2%†p2SpecSelectSselectedK 3%†p3SpecSelectSselectedK H4%†p4SpecSelectSselectedK ÿÿå›%»|  ,True)†pForcePlayersSetS checkedå!†pForcePlayersSetS¥BE†ApplyButton†PostActiono™po.uhtm A )FÆ;;ôV)ŠGameTypeg)ŠMapListTypeCustom5V05 Vý{)ŠMapListSetg)ŠMapListSelectCustomú{gCustomW5 VgV Üq{)ŠAddMapN)²ExcludeMapsSelect2%P–2NFw5*525)ªExcludeMapsSelect2ów*-­'Ür * ð FçpSuperWebAdmin: Exclude map not found: )ªExcludeMapsSelect2¥2LgCustomV Ü‚{)ŠDelMap&—)²IncludeMapsSelect%N)²IncludeMapsSelect2%ó–2Néw * 2 )ªIncludeMapsSelect2–w*-­'zr5*5“5 5éçpSuperWebAdmin: Include map not found: )ªIncludeMapsSelect2¥2êgCustomV ÜÉ{)ŠAddAllMap¨w5*5 5¥w*-­'‘r * ¥ 7gCustomV ܃{)ŠDelAllMapbw *  _w*-­'Fr5*5_5 5ìgCustomV ÜÜ{)ŠMoveMapbDºL)ŠMoveMapCountÜ›b%N)²IncludeMapsSelect|)ŠMoveMapDown Ww§*§,w*2%ù–2Nï|ž)ªIncludeMapsSelect2-­' \ bù¥2tËbÌ Ìw*2%µ–2N«|ž)ªIncludeMapsSelect2-­' ] bµ¥20§V I†MapListTypegI&†MapListOptionsQVgI%†ExcludeMapsOptions5I%†IncludeMapsOptions I†PostActionaI†GameTypeVI™pa.uhtmI¯ HZ b§N* ‰--xGD-x( NžVZ D[ jrH*HN~H N¥™:‹J :K H H Z€X \#Ls$ƒB\˜¡l\Ãl€l~l:Ó›JÿÿÿÿJ] FECmppppppppkicked l (B) - banned (days/maps = SF/SE)ûmppppkicked l (B)\0You are currently banned on this server.çpppp!: m Cu-Y1ppI : m\a H X b.“Ög%Ò–g6Èz g7X ašg,1,17,1%¦6%cg¹–c6c7’c&7c’c&¥cl¦6%¥g& J NBYÆM vNŠGameType~ž©v GN&ŠMaxPlayersS“ØGSúJG%“ØJGJ†MaxPlayersGEN)ŠMaxSpectatorsS“ÎESúJE%“ÎJEJ†MaxSpectatorsEgT“-Ï]T“-È­wš*XTš-ÔØrÀ*VT“-Ò6{NŠApplyZwš*XN"ŠPlayersBalanceTeamsfalseš-Ô|Xtrue¯rÀ*VNŠForceRespawnfalse“-ÒKVgNŠWeaponsStayfalse“-ÏKg]NŠTournamentfalse“-ÈK]l|gtrueJ†WeaponsStay checked¡|]trueJ†Tournament checkedvrÀ*Ô|VtrueV checkedÜVJ‘†ForceRespawnSubstppForce RespawnTwš*©|XtrueX checked±XJš†BalanceSubstppForce Balanced Teams‚w“*r¹*ýwš*xN%ŠFragLimitUšÖxSúJx%šÖLxuMax Team ScorenxN%ŠFragLimitS“ÓxSúJx%“ÓDLxuFrag LimitJ“†FragSubstppppurÀ*ON%ŠTimeLimitS“ÑOSúJO%J—†TimeLimitSubstppTime Limit“ÑDLOQ ‚‚wš*a Äa ¹KN$ŠMaxTeamsSš»KSúJK%š»ùúJK,,J’†TeamSubstppMax Teams… wš*IN-ŠFriendlyFireU«šÛ?,dISùúJI%,dšÛ¬LIÈBJª†FriendlyFireSubstppFriendly Fire: [0-100]%J†PostActionbJ†GameTypevJ™pb.uhtmJ¯´ g€Yj€N W @OÝom%g–m6]z m7W m7ppV :-m7g¥m x@O JKÍ"dUnJŠGameType~ž=©n "-nà|•-get UTMenu.UTServerSetupPage bLanPlaytrue@•3get IpDrv.TcpNetDriver LanServerMaxTickRate"@•3get IpDrv.TcpNetDriver NetServerMaxTickRateCò“=-¾'b&eò“=-¼'¡b&JŠGameStyleSb á0“=-¾(“=-¼(S†Normal selected““ :1“=-¾(“=-¼'S†HardCore selected“ 2“=-¾'“=-¼'S†Turbo selected“ ÿÿxD«“=ÕÈBwD«“=ÍÈBfT“=-Ù{JŠApplyJ-n@SùúJJŠTickRate, ,cxùúJJŠGameSpeedSx, ,È“=Õ¬?xÈBwùúJJŠAirControlSw%,d“=ͬ?wÈBfJŠUseTranslocatorfalse“=-ÙKf=´•Vpset BotPack.DeathMatchPlus MinPlayers SùúJJŠMinPlayersS%%,-n<|•-get UTMenu.UTServerSetupPage bLanPlaytrue•;pset IpDrv.TcpNetDriver LanServerMaxTickRate @•;pset IpDrv.TcpNetDriver NetServerMaxTickRate @S†GameSpeedSxS†AirControlSwü|ftrueS!†UseTranslocator checked±-nSš†Tickratepp TickRateS/†MinPlayersS.“•›×S†PostActioncS†GameTypenS™pc.uhtmS¯ T @S O)]FcL%[–L6Qz L7OL7ppO:T [¥L _ }w0V!-U FDENY&FACCEPTj%¹–j,ú¯zjjppF,}YpppAdded policy - F,}bçpp!: Yj¥j-YppppUnable to add new policy (F,}) - list fullçpp!: Yÿÿÿÿ T €@U P *rÍ`ŠGameType~žB©` C“BÆM{ŠApplyfJŠBotDifficultySfCó=fZùúJŠMinPlayersSZ%,“B×ZEŠAutoAdjustSkillfalseC-ÞKEFŠRandomOrderfalseC-ßKF/wšB*]ŠBalanceTeamsfalsešB-íK]/w³B*ZŠDumbDowntrue³B-äKZC´B´f:CóZ“B×ETC-ÞFTC-ßÒwšB*]TšB-íýw³B*ZT³B-äl(†pBotDifficultySf selectedl†MinPlayersSZ‰|Etruel!†AutoAdjustSkill checked¿|Ftruel†RandomOrder checkedawšB*ò|]true] checkedú]l‘†BalanceSubstppBots Balance Teamsaw³B*È|ZfalseZ checkedÐZlˆ†DumbDownSubstppEnhanced AIl†PostActiondl†GameType`l™pd.uhtml¯ WW PlT AP6<–P,2P7P%¥P b r€\ W m f%Ž'Mšf%G~W:G›GÿÿÿÿW€WGWG~W:ošGÿÿÿÿWW’G&¦f a t[¯ r%¸–r,ú®zr$rtRQPWpppppppAdded ban - t Days/Maps = SR/SQ Pbçpp!: Wr¥rWppUnable to add new ban (t) - list fullçpp!: Wÿÿÿÿ G€@b q$ ù‚€–q,úFzTqppppW=SV,SU}qppppppW=SV,SU!Tb d héš\[%o%–h,úKhB~K=—B%\€hBL~K,^~K!—L%[JK’B&““LB&þ—^%oJK’L&““^L&YK’^&oJK’L&Y ^ a-™À _&Ž'Mš_%n~a:G›nÿÿÿÿa€anan~a:ošnÿÿÿÿaa’n&¦_ g c%°ê¬|“,ú&çpppppp!: Adjustin Bans (S“|& max) Days: T-c, Maps: T-b@%§˜@|@j}A`¤zj§¿-c¿—}%¦}Ú-bÚ—A%¦A~‚š}% šA%çpp!: Removing expired ban - j{@[–{|{’{&¥{(|{—@%¦@$@j}A`¥@gb n€@u€l q"x ’d,úa~q:9›aÿÿÿÿq€qa-@'u%‰‚–ud{ua~u,“šaÿÿÿÿa€uaBu’a&ã|aACCEPT-}'þ|aDENY-}(a~B*X›aÿÿÿÿUz€Ba€qa-@-}fuzBq-@-}fu¥uH-@ c jc² [G%W–G6Mz G7jKzjR 'M(¥G( z€Z ESi ”}. {EŠUpdate"JEŠPolicyNo-1”š"ÿÿÿÿ"%”‚–",2"{"•›£¥"X÷–",2"•›£ppEŠAcceptDeny,EŠIPMask•›b{EŠDelete"JEŠPolicyNo-1—"%""Þ‚–",1"{"•›£"•›£’"&•›£¥"dš",1,1•›£•›bh™p}-h.uhtm"%í‚–",2"{"•›£H~"•›£,|€"•›£HDENYh†AcceptCheckh†DenyCheckcheckedPh†AcceptCheckcheckedh†DenyCheckh5†IPMask"•›£’H&h-†PostActionpp}?PolicyNo=S"h™p}-d.uhtm¥"Bh†PostAction}h™p}-f.uhtm G€p k`U Íi,úz%Å–zi^~z*o›^ÿÿÿÿlz€k^€z^z»^~z=µ—^%²zk€z^z»ÿÿÿÿ¥zÿÿÿÿ h P AÄJAP%=–P63z P7P '¥P( j F4 ŠƒÍg{FŠApplybFŠNewPasswordyFŠConfNewPasswordzbW†TitleErrorWZ†MessageBlank passwords are not allowed - please retry using a sensible password.W ™1d{byW†TitleErrorW6†MessagePasswords do not match, please retry.W ™1d')F—FÐbW†TitleSuccessWh†MessageYour password has changed. Please remember this the next time you connect to web admin!W ™1ËW†PostActiongW†UsernameF—W™pg.uhtm P€!za,ÈÎ^“,ú&w“,2&çppp!: Cleaning Bans (S^ max)T%‰‚˜Tw"{T®›£¥TJÌ—T“w, z%´‚–z^—T“w, ªzzz&®›£çpp!: moved policy zi&ƒ–iwi®›£’i&®›£¥i,w®›£¦T¥z£®›bb m O Ô\e[e%`–e6Vz e7O [e7-[¥e t @[€@y { E=£ ¥ª` è_ ï^ îI ìw çg éd ëa•)get engine.gameinfo AdminPasswordc•(get engine.gameinfo GamePassword|•-get UTMenu.UTServerSetupPage bLanPlaytrue{•3get IpDrv.TcpNetDriver LanServerMaxTickRateÃ{•3get IpDrv.TcpNetDriver NetServerMaxTickRateA•,get IpDrv.TcpNetDriver MaxClientRate-h ·-ê-i•›-ò²{EŠApply`EŠServerName_EŠAdminName^EŠAdminEmailIEŠMOTDLine1wEŠMOTDLine2gEŠMOTDLine3dEŠMOTDLine4-hKEŠDoUplinkfalse-iKEŠWorldLogfalseaEŠAdminPasswordcEŠGamePassword{SùúJEŠTickRate, ,cASùúJEŠMaxClientRateè0u è` ï_ î^ ìI çw ég ëd ´ ·-ê-h ·´•›-ò-i•›´•0pset engine.gameinfo GamePassword c•1pset engine.gameinfo AdminPassword a/|•-get UTMenu.UTServerSetupPage bLanPlaytrue•;pset IpDrv.TcpNetDriver LanServerMaxTickRate {t•;pset IpDrv.TcpNetDriver NetServerMaxTickRate {•4pset IpDrv.TcpNetDriver MaxClientRate A?†ServerName`?†AdminName_?†AdminEmail^?†MOTDLine1I?†MOTDLine2w?†MOTDLine3g?†MOTDLine4d?†AdminPassworda?†GamePasswordc?†TickRate{?†MaxClientRateA?-h?†DoUplink checkedk-i?†WorldLog checked?†PostActionj?™pj.uhtm q L å„C`%A–`67z `7L `¥` n ;8É ðˆ ={; ŠAdd™ph .uhtm I{;ŠAdd2X;ŠUsernameG;ŠPassworde;ŠConfPassword8zX8Please enter a username and try again.£gzG8Blank passwords are not allowed - please retry using a sensible password.££{Ge8Passwords do not match, please retry.{8†TitleError†Message8 ™1FQ&_XGJ; ŠPriv{šQ%iSuccess8User has been successfully added.ú¶šQ&iError8Username already exists.úiError8You already have a maximum of 50 users defined.†Titlei†Message8 ™1 ò{;ŠEdit‡{;ŠUserSelectX;ŠUserSelect4†S XÈ checked†UsernameX$†Password X(†ConfPassword X™pi .uhtmï†TitleError.†MessagePlease select a user to edit. ™1 s{;ŠEditApplyX;ŠUsernameG;ŠPassworde;ŠConfPasswordzG†TitleErrorZ†MessageBlank passwords are not allowed - please retry using a sensible password. ™1p¡{Ge†TitleError6†MessagePasswords do not match, please retry. ™1p)XG XÈJ; ŠPrivb†TitleSuccess2†MessageUser settings have been modified. ™1 õ{;ŠDeleteˆ{;ŠUserSelectš#b;ŠUserSelect%iSuccess8User deleted.9iError8No such user exists.†Titlei†Message8 ™1ò†TitleError0†MessagePlease select a user to delete. ™1 8UsernameQ%Ø –Q6i Q78ppppp8i¥Q †UserList8™pL.uhtm `€_ v vô[]w}vE%a&R˜awHzê€va&:¥E¥a’E& } H ;v Õø|H ŠPagec>†ServerBG>†WebAdminBG>†RestartBG>†QuickSetConfigBG~C| éj>†ServerBGž L>†WebAdminBGž >K>†RestartBGž oo>†QuickSetConfigBGž …{~ž ›pCž ÿÿ>'†ServerURIppc?Page=j>)†WebAdminURIppc?Page=L>(†RestartURIppc?Page=K>/†QuickSetConfigURIppc?Page=o&w9*>©†OPBanOptionsppppppOPBan OptionsÊ-~>’†MvrConfigppppppMvr Config>™pM.uhtm>¯ w€w E :i nœšpE ŠPageiH&†IndexURIppM?Page=pH†MainURIpH™pc.uhtmH¯ ø F v6Fø/a0 MF 0 10<A-NAad®a MdLAdÚ®›É®›Édü›Am®÷Am®÷A%'' A%(' úA w°Ý -A  -A 'çppp@ : OP's ban list extender  loading...g-rAa a uAa ` A!@ AFÛz%A%AACCEPT,*Ab s////////////////////////////////////////////////////////////////////////// // // Unreal Tournament Ban List Extender // ----------------------------------- // // Programmed by PurplePants@purplemetalflake.co.uk // // Copyright © PurplePants, 2002-2004 // ////////////////////////////////////////////////////////////////////////// class OPBan extends Actor config (system); var bool bInitialised; var string sApplication; var string sVersion; var OPBanConfig opconf; //var OPBanWeb opwebapp; var OPBanMutator opmutator; var config bool bUseSystemIni; var config bool bLockIniChoice; event PreBeginPlay() { // Only handle this event the first time if (bInitialised) return; bInitialised = TRUE; Log(sApplication $ ": OP's ban list extender " $ sVersion $ " loading..."); // Load up configuration using the desired .ini if (bUseSystemIni) opconf = Spawn(class'SuperWebAdmin.OPBanConfigUT'); else opconf = Spawn(class'SuperWebAdmin.OPBanConfigOP'); // Add the app details to the configuration opconf.sApplication = sApplication; opconf.sVersion = sVersion; // Fix policy 0 which we can't do automagically... if (opconf.IPPolicies[0] == "") { opconf.IPPolicies[0] = "ACCEPT,*"; opconf.SaveConfig(); } } function PostBeginPlay() { local OPBanMutator opbm; Super.PostBeginPLay(); // Check we're not already loaded foreach AllActors(class 'SuperWebAdmin.OPBanMutator', opbm) return; // Clean the UT ban list if (opconf.bCleanPolicy) opconf.CleanBans(); // Create our mutator and point it at the configuration class opMutator = Level.Spawn(Class'SuperWebAdmin.OPBanMutator'); opMutator.opconf = opconf; // Insert our mutator in the master list opMutator.NextMutator = Level.Game.BaseMutator; Level.Game.BaseMutator = opMutator; if (opconf.CheckDay != Level.Day) { opconf.CheckDay = Level.Day; opconf.AdjustDynaPeriods(True, True); } else opconf.AdjustDynaPeriods(False, True); } ÄL@iÕ“@a/!xL-XU®a BURLUs. @Uu¥G U,' U€B €r€@e@ ^I ^ ]ÿÿÿÿB ^ ]ÿÿÿÿA nýÿÿÿ{ ]þÿÿÿr ^o ]øÿÿÿr nûÿÿÿy ^] ]üÿÿÿf ]üÿÿÿ~ ]þÿÿÿ} ]þÿÿÿ] ]üÿÿÿs ]üÿÿÿv ]þÿÿÿz ]õÿÿÿ_ ]ÿÿÿÿz zìÿÿÿz ]þÿÿÿn rûÿÿÿs zóÿÿÿv nýÿÿÿ} ]õÿÿÿ` zôÿÿÿa ]þÿÿÿl ]üÿÿÿy r÷ÿÿÿt ]þÿÿÿ| ]üÿÿÿx rïÿÿÿn ]üÿÿÿ} rðÿÿÿp xäÿÿÿ] ]üÿÿÿv ]üÿÿÿd z÷ÿÿÿb ]þÿÿÿx näÿÿÿU nûÿÿÿ ]õÿÿÿa r÷ÿÿÿ[ |÷ÿÿÿY zÞÿÿÿz nýÿÿÿ| }ïÿÿÿN ]þÿÿÿk nûÿÿÿ~ ]õÿÿÿe näÿÿÿR {ïÿÿÿm ^Z ]Êÿÿÿ[ rÛÿÿÿr ]õÿÿÿc xðÿÿÿc }æÿÿÿP |íÿÿÿD rïÿÿÿO |íÿÿÿG }ïÿÿÿ_ ]õÿÿÿf ]þÿÿÿy zðÿÿÿy nàÿÿÿe ]õÿÿÿb rðÿÿÿb |ïÿÿÿl ]þÿÿÿ~ |íÿÿÿi zðÿÿÿa ]ÿÿÿÿ@ ]øÿÿÿo nÞÿÿÿx {íÿÿÿt }ðÿÿÿl |íÿÿÿj rûÿÿÿn }íÿÿÿF |íÿÿÿm }íÿÿÿE |æÿÿÿn {ðÿÿÿo {æÿÿÿJ }íÿÿÿp }ðÿÿÿq |íÿÿÿg zÚÿÿÿ` {æÿÿÿI rûÿÿÿu n¶ÿÿÿE |ÕÿÿÿL |ÕÿÿÿM rãÿÿÿ{ }ãÿÿÿR nÞÿÿÿy zóÿÿÿp |Íÿÿÿk zôÿÿÿg nìÿÿÿ, rãÿÿÿp rãÿÿÿs rãÿÿÿP |Éÿÿÿ\ rãÿÿÿo rãÿÿÿq |æÿÿÿh rãÿÿÿr rãÿÿÿQ rôÿÿÿZ rðÿÿÿ{ |ðÿÿÿm ~Õÿÿÿ[ ]üÿÿÿ~ }ãÿÿÿS |ïÿÿÿk }ôÿÿÿi nÞÿÿÿv nàÿÿÿ nÞÿÿÿw ]üÿÿÿw nÞÿÿÿ| rôÿÿÿh |Þÿÿÿ^ nàÿÿÿq ]õÿÿÿl rìÿÿÿL nàÿÿÿu nàÿÿÿt nÚÿÿÿi nìÿÿÿE xíÿÿÿC zàÿÿÿF |ïÿÿÿj |àÿÿÿd |óÿÿÿu z÷ÿÿÿC ]üÿÿÿG ]þÿÿÿp ]þÿÿÿu |àÿÿÿAœdef˜’–a K¡’›x X¡’‹De¡¢ras¡Ž N T¦ôksa¦Ž} T©’–}`©’›w n©’–v {©‡ Hª–|Uª’æwQ¬Žæe _¬’ Y k¬¨ux¬’æx F­’ w S­Ž‰N `­Ž«N m­’‹Y z­’7wG®‡p U®‡–V a®‡@ m®¨æuz®’ x I¯‡–W V¯’‹xc¯’ØYq¯’ x ¯‡h L°Ž*N Y°‡‹N f°’–{ s°’–z @±’µw M±’µx Z±Ÿ–i g±’ xt±‡q B²’ÛYO²’‰w ]²’w j²‡–k w²’ÒYD³’Žx R³‡–U _³Ž N k³‡–M x³’ŽwE´’ y S´Ž{ `´‡~ l´‡7@ x´’–iEµ’–j Tµ’7x aµ’•wnµ¨u|µ’;wK¶’5wY¶’£wg¶’Cvu¶¨uC·¢sdR·’«w v»’5x C¼Ž®N P¼‡‹q ]¼‡‹K j¼Ž•N w¼’wD½‡–@ R½‡–Z _½’‰x l½’xy½’‹wG¾‡»H U¾‡Âc b¾’Âvo¾’w}¾’ÛxK¿’¹YY¿‡ q g¿’.wt¿‡7s BÀ’«xNÀ’úx\À‡½H jÀŽ®L wÀ‡‹E DÁŽ•L QÁ’w^ÁŽ–G lÁŽ'L yÁ’x F‡–_ SÂŽÛN `Â’”wlÂŽ–H z‡ c FÃ’*w RÇ7r _ÃŽ‹_ lÃ’ŒwyÃ’wGÄŽ£N UÄ’»xbÄŽ£L pÄ’úw}ÄŽ£S KÅŸ–B XÅŽ¼L eÅŽ¼N rÅŽ'N Ň‹^ LƇöU YƇE fÆ’“w sÆŽ,N @ÇŽ•S MÇŽ•T ZLJ–S gÇ’–wtÇ’xBÈŽ$N PÈŽ•U ]ÈŽ£U jȨOwÈŽ‹` Fɨ uRɇ‰T aɇ7w mÉ’ÉYzÉ’ wHÊ’xVʇ"Z dÊ’©Ypʇ–F ~ÊŽ Q Kˇ U Xˇ‰K eËŽ7 rËŽög ~Ë’´YKÌŽ0K YÌŽ®S ḟO ṡd @͇N MÍŽ‰L Z͇V gÍ’ŒxtÍŽÐN B·U OÎŽ,O \ÎŽ®U iÎŽ¼U v·#d CÏ’åwPÏŽq ^ÏŽÀN jÏŽ«L vχÜN BÐŽ OЇ‹^ \Ð’ÞIiÐŽN wÐ’½Y Dч c QÑŽ ^ÑŽ#N jÑŽ¼S wѨ¹uDÒ‡‹_ SÒŽN `Ò’ÂZmÒŽ‹L {ÒŽÂ{ GÓŽ¹N TÓŽ0M `ÓŽ‰` lÓŽ‰a yÓŽ0N FÔ‡5r SÔ‡»| `Ô’¾YlÔ’‹\ zÔ‡Y GÕ‡r SÕŽ°N _Õ¢nWkÕŽ£T BÙŸ•R OÙ’*x\Ù’.xjÙŽN xÙ’sEÚ‡‹D SÚ’åx`Ú‡•X nÚŽ"X zÚ¦o\GÛ‡Ì| cÝŽ®T o݇–K |݇åc IÞ‡ål UÞ‡åq bÞ‡–E oÞ’Ax|Þ‡–G J߇•V W߇åd d߇­T qߎp ~ߎèc Jà‡–Y WàÁz dà‡–[ qà‡V }àŽ6N JᇖO VᇖP cᇖQ pᇖR }áŽ1 JâŽW V⇖^ c⟮R pâŽ0L }⇖a J㎶N WãŽâc cã’Ûw pãŽöc }㇖f J䇖g Wä‡'\ d䇮W q䨽u~䇮X MåŽÂg Yå’½yeåŽt såŽo å‡Ã| L掫H XæŽ$L eæŽ$L ræŽ$S 柖E L矖F YçŽÙN eçŽ$r rçŽ"W ç’ÌYL臕W Zè‡l gè‡a tè‡q @é’ÜYMé‡d [é‡ÙU hé‡P uéŽ BꎉH Nê‡Ø_ [ê‡F gêŽ tê’Øz@ëŽØN Në‡Ð| [ë‡Ø` hë‡ØJ uëŽØK Bì‡] O쇋b [ì‡] hìŽ uìŽÒN Aí’ ZMí‡Q [íŽ"Y gíŽÈP t퇋F @î‡5e MîŽ L Zî‡5d fî‡5o sW @ï‡R Mï‡5P ZïŸ5X gïŸ5m tï‡$N Að’xNðŸ–C \ð‡ ] iðŸm vð’ŽyBñ’ÀyPñ’Àx^ñŽ¼T lñ’wyñ¨À@Gò’ÀYVò‡ŽG dò‡5p pòŸŒM }ò‡–s JóŽöN Vó‡–m bó‡½U oóŸ'W |óŸŒN IôŸŒO VôŸ'X cô‡5J pô‡'Y |ôŸŒP IõŽög Võ‡S cõ‡T põŽ( }õ’=wIö‡5q Wö’¶Ydö¨¶urö‡–b A÷‡ŒI N÷’ v [÷’þwh÷Ž- v÷‡I Bø‡ŒH Nø’®wZø’—whø’•x vø‡H Cù‡£W PùŽÛQ \ù‡úe iùŽðc vù‡ U Cú‡­S Pú‡èU ]ú‡5r jú‡5Q wú‡5s DûŽ:c Qû‡.t ^û‡–H kû’C|xû‡7x Gü‡–B Tü‡P aü‡ f nü‡–X {ü’£xHý’¥w Vý‡©~ cý‡•Z oý’¢w |ý‡©} Iþ‡=C Vþ’ w bþŸC} oþŸC~ |þ‡­B Hÿ‡­~ UÿŽ•G bÿ‡­_ oÿ¨­u|ÿ‡£V K€‡°B X€’®xe€‡—C s€‡´B €‡;{ K‡´~ X‡”S eŽ®G q’¹x~‡;| L‚‡®Z X‚Ž: e‚‡g q‚’¼x}‚Ž*L Kƒ’¼wWƒ‡C eƒ‡Ã qƒ’Ív~ƒ‡É~ L„ŸB X„‡V e„‡W r„‡X „‡Y L…‡Z Y…‡[ f…‡\ s…‡] @†‡É} L†Ÿi Y†Ÿj f†ŽÈz s†‡1d @‡’ÒJM‡‡ÐU [‡Ž0L h‡Ž#f u‡‡q Aˆ‡'Z NˆŽ^ [ˆŽØG hˆŽÐ_ uˆŽØX B‰Žf O‰’‹\[‰Ž"V i‰‡‹n v‰‡‹T CŠŽ‹` PŠŽ‹a ]Š¨ÜTjŠ‡q yŠŽ"r F‹Ÿ–D S‹Ž!V `‹Ž«L m‹ŽÙb z‹‡N GŒ‡M TŒ‡q aŒ‡âU nŒŸs {Œ‡–p H’»wU‡–n c‡–k p‡N }‡ H JŽ’¾wWŽ‡–h eŽ‡¾I rŽ‡ d ŽŽÂf L‡ Y‡ P f’Îw s‡ d @ŽýN M’Úw Z‡ P g‡–e tŽâ` A‘‡–` N‘‡–T [‘‡–N h‘‡ O u‘ŽýV B’‡–L N’‡–I [’‡q h’‡–C t’‡–y A“‡–A N“‡ F [“‡p h“’æyu“‡ B C”‡o P”‡æq ]”‡n j”‡m w”’hD•‡æ\ R•‡ a ^•‡l k•‡[ x•Žðf E–‡ú_ Q–‡úg ^–‡k j–‡j w–‡i D—‡þq Q—‡þK ^—‡Z j—‡h w—‡E D˜Žö` Q˜‡C ^˜Ž f k˜’–hw˜‡  E™ŸñD R™’þx_™‡ @ m™Žð` z™‡ðU Gš’îe Tš‡æd aš‡ A mšŸèE zšŽè` F›ŸâE S›’AP_›‡ ^ m›‡ o z›‡ T Gœ‡ P SœŽ ^ `œŽ ] mœ‡t zœ‡ t G‡s TŽ V a‡ C n‡ D {¨ŽjHž‡ E Wž‡s cž‡T pžŽ^ }žŽ] JŸ‡Ù| WŸ‡!T cŸŽ!r oŸŽ!S |Ÿ‡!N I Ÿ–A V ‡"T c ŽÙ` p Ž"S } ‡"N J¡‡ÙI W¡‡Ùf d¡ŽÐ` q¡‡$T }¡¨Ø|I¢Ÿ$R W¢Ÿ$Q d¢Ž'L q¢Ž‹F }¢Ž'[ J£‡Ðf W£‡ÒU d£Ž,L q£‡(s }£‡,\ J¤¨Ò|W¤ŽG f¤ŸÒM s¤ŽÈb ¤’ÉQL¥‡C Z¥’ñ[ g¥ŽÃJ t¥ŽÀW A¦’‘w N¦‡:U [¦Ž:` h¦‡½V u¦‡.u B§’¹yN§’”x\§‡;C j§’žxw§Ž­R E¨‡Cg Q¨‡Ch ^¨ŸCy k¨Ž g x¨’©vE©‡ñU S©’=x`©’>n©ŽÍw |©’;x Hª‡t UªÇtbªÇ}pª‡6U ~ªŽE K«Žu X«‡1s e«‡-s r«Ÿ~ «‡(n L¬Ÿ| Y¬‡w f¬Ÿ` s¬‡t @­‡s M­‡s Z­Žo g­’ ht­Á z B®‡n O®‡ b \®‡Âd i®Í{v®qYJ¯pXc°‡v {±Ÿh G²’ûxT²’ûw b²‡ñB o²‡–J |²‡–c I³‡–d V³ŽÜN c³ŽÜf p³‡ÐI |³‡ÍU I´’ÚxV´‡ÃT d´‡Àq q´‡Àc ~´‡½q Kµ‡¹q Xµ‡¶q eµ‡´A rµ‡­q µ‡­c L¶‡©K Y¶’—xf¶’“xt¶‡§P B·’xO·Á…z ]·Á§z j·‡…P w·’…hD¸Êm\R¸±ÂO4E/n¹Ž‰L s莉G @é–Âu4M鎉I AꎋN N꟧m [ê––XBgꎫI i––T_“v––Y\ U•––Ljq¡––R_[º––MQzÖ’‘xKÙ––5=YÙ±O4\VÚ––6hrÜ––NDZã––+J^ë”lg´h‚––OAO·Ÿ…m Pº±ÍO4x\º–ÿq!TÑ–Å–EK6uÑŸžQ @ˆ’žwLˆ––7HZˆ’ xbŠ––spŠ’¢xcŒ––9TqŒ––Z`E’¥xe¢––Ys¢‡©Q L¥–ù1Y¥Ž£G J¦––tW¦‡­Q Kª––GIXª±–O4cËa½––QTD‰––/X X‡°Q pš––'c}š‡´Q `±aO4Vm±O4k'C¦––vnÍ––@U%dЖ–Xyõ’ŽxQø‡®V _ø––0Alø‡½U mý––H} zý––z`w‰––BW’––CgY—’¾x@›––WoN›‡ÃQ }Ÿ‡¾J J ––[W Ž¼G r¡Ž¾N ¡‡ÉQ K¢‡¼Z X¢––&nd¢––*mR¤‡ÈQ §‡ÌQ L¨–– MY¨–– 9fª––?j_«‡ÍQ I­––OU­’šMd¯––<{r¯’Îxmµ‡ÐQ {µŽØL H¶’ØJU¶’šcc¶––fr q¶––\ZcÁ––!Y}Ö–DLVÉ––UfbÙ‡ÙQ HÝ–æ–,x UÝÁši MçÇšL Zç–Ãt!gç––(uHè¨áY}é‡âQ Mê––emZê––2b`GùŽáj iÙ––]uvÙ‡Q kÛ‡èQ xÛ‡–D EÜ’álRÜ’áF`Ü––^anÜ’ák Oà––b\à–d~áŽðQ bã’–y oã’–x|ã’æxJä––DXä‡ñQ \è‡æG iè‡öQ vè––3jCé–ÝE(m†–ÂiU‡–üÂ|I ~ˆ––A]G’Ÿi d•–Â,Vq•––J|4G—–VDC̱`O4TGϱO4zL[×±O4]œU¤’_hrÀ–$@Á–_ydÁ––>k5]Ö–FPHù–PX“ ŽQ h• –#Ru• –blG› ––B}#s ŽQ pÁ ŽL }Á ŽQ J –@fW Ÿz }à ––K}JÄ Ÿu GÜ –)_TÜ –wEsÝ ‡v xá ––PBEâ ŽL Gõ –ITõ ŽQ ]ö – Kjö –[uuø ‡Q jü –$Awü –mxþ –-Ke‚!–%fp„!‡#Q VŠ!Ÿ'Q cŠ!–"IpŠ!–c]y!Ž,Q V‘!––Sv c‘!Ÿ(Q Yž!–`ufž!–AJ[¡!––4p e¢!Ÿ-Q U¬!–aqb¬!–_S²!‡_V r³!‡1Q ³!Á_z L´!––=xY´!–IQÐ!––8_ ZÑ!Ž6Q yñ!Î_bFò!–bTò!––;M vó!Ž:Q C"––:PP"–øCv_`ƒ"–úCwN†"±CO4~MŠ"–ÄÍiGKª"ŸAQ R¬"ÇA]_¬"‡ Q m¬"‡¼V z¬"