*_GNGxT\7]^_`abcdefghijklmnopqrstuvwxyz{NoneClientMessageTagsNoneCount CanPerformXAdminMaskedCompare FindByNameCoreSystemGetEngineAddReleaseConfigSet DoSwitch IsNumeric MainPrivs HasPrivilege SubPrivsGetLoggedAdmin SplitParamsEndEditLoadMsg FindGameType GetMapList CreateGroupCreateSave SendUserList GoToNextMapGetUnusedMutators FindMaps DelMutatorLockConfigSet IsLoggedGetEditedClass ForceAddBotGetGameAcronymSendLoggedListGetNamedParamGetMaskedParamsGetMapsGetManagedUsers AddGroupLoadGameTypes ServerTravelLoadAllMutatorsSetUsedMutators MakeBotsListSetNamedParam LoadAllMaps StartEditNoneload LoadSettingsAddMapsNone AdminEntered AdminLogout AdminLogin InitPrivs KillBotsGetUsedMutators AddMutator ParseOption RemoveMaps Lighting LightColor MovementCreated SetParam CollisionKarmaForce PreBeginPlayNone GetParamCanEdit AdminGroupNone FillPlayInfoUserMain MutatorsBotsMsg_ParamNotModifiedMsg_ParamModifiedMsg_NoParamsFoundMsg_UnknownParamMsg_EditingCancelledMsg_EditingCompletedMsg_NotEditingMsg_AlreadyEditedMsg_EditFailedMsg_EditingClassMsg_MustEndGameEditNoneMsg_MapIsInRotationMsg_NoMapsFoundNoneMsg_NoMapsRemovedMsg_AddedMapToListMsg_NoMapsAddedMsg_NoMapInRotationMsg_MapRotationListMsg_MapListNeedGameEditMsg_ErrRemovingMutatorNoneMsg_RemovedMutatorMsg_ErrAddingMutatorMsg_AddedMutatorMsg_NoUnusedMutsMsg_NoMutatorInUseMsg_MutNeedGameEditMsg_SetBotNeedValNoneMsg_NoBotsPlayingMsg_NoAddNamedBotMsg_NoBotGameFullGameNoneNoneNoneMsg_ChangingMapToMsg_NextMapNotFound PrivClassesMsg_StatsNoBotsMsg_GameNoSupportBots AdminClassMsg_FinishGameRestartMsg_FinishGameEditFirst SaveAdminsNone AdminUserReportLoggedAdminsToxUserGroupPrivsMapList xKickPrivs AdminExitedIsAdminSetAdminFromURL xGamePrivsSetAdminPasswordSetGamePassword GetAdminName xExtraPrivsNonexAdminConfigIni ValidLoginxAdminCommandletGetUserGameConfigSet AdminIniAccessControlIniKillBot AllowPrivMatchInProgress GetNextMapAddBot Destroyed GetGroupAddManagedGroupsByNameAddGroupsByName BroadcastNoneDoLogin DoLogoutstrNoneNoneNonej Privilegesi bMasterAdmin ReturnValueGC ScriptTextManagedGroupsNone SettingName PlayInfoDataBot GameStatsuList LevelInfo GameInfoPlayerReplicationInfoNone Controllerkidx UnrealGame DeathMatchUnrealMPGameInfoDynamicLoadObjectPlayerControllernextControllerprivActionXGamexUtilxBot PlayerRecord DefaultNameExtraMutatorStaticSaveConfigMaskunameParmsAccessControlNextC NewGroupAdmin Password ConfigSet CSEditorcntxPriv AdminBase UsernameLevelGCS PlayInfoManagerxAdminConfigBase NextMutators NextGameType xAdminGroupNewUserbDontAddDefaultAdmin AllPrivs PrivManagers LoggedAdminsGroupsUsers AdminPlayerControllerListNonebFoundCharacterName AdminName ShortName GameClass NextMutatorxAdminGroupList xAdminUserNextMapPCbAdmin bUserAddedxAdminUserListxPrivilegeBaseIndexURLPRIMNMyListNoneNone LoadMapListAcronym DecoTextName BaseMutatorNumBots MapPrefix MapListTypebAlreadyChangedbChangeLevelsActor SettingsParamsNone GameTypeMinVBotList BotsToAddNoneValues LastParam LastValue Commandlet PlayerNameCmd TempClass NextGameValueNone bMaskLeft bMaskRightMaskLenPNoneNoneNoneNoneOuterNoneNone AdminUsers AdminGroupsbDirtyGrpLenUserLen UsedMutatorsAllMapsPrefixAllMaps AllMutators AllGameTypesbEditClassPackagebSaveGetNextIntDesc GetNextIntNone Parameter GroupName ParamMask FoundParams FoundMasksGroupNone MinPlayersMapMask AddedMaps TextBufferDelMapsObject FoundMaps FunctionStructStrings StrProperty MutatorNameStructPropertyArrayPropertyClassPropertyObjectProperty BoolProperty NextDesc IntProperty ByteProperty GameSecLevel bForceLoadNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneSendComplexMsgGetMapListTitleNoneGetActiveList GetGameIndexNoneNoneNoneNoneNoneGetMapListNamesNone SaveGameNone GetListsNoneAddListNoneNoneNoneNoneNoneNone ApplyMapList RemoveList RemoveMapNoneNoneAddMapNoneNoneNoneNoneNoneNoneNoneNoneMsg_AllMapListsMsg_MapListRemovedNoneMsg_EditingMapListNoneNoneMsg_MapListAddedNoneNoneNoneNoneNoneNoneNone AllMapListsNoneNoneNoneInfo CurrentMapsNoneNoneMsg_RemovedFromListMsg_MapIsNotInRotationNoneNoneNone UsedMapsNoneNoneCurrentMapListNoneNoneNamestmp MapHandlerNoneNoneNone GameIndexNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneAcceptPlayInfoProperty PropertyNameNoneNoneRestartCurrentMapMaplistCommand ResetGameMaplistHandlerxGroupMaplistManagerBase xManagerNoneNoneNoneNoneNoneNoneNoneNoneXLevelNoneNoneNoneNoneNoneNoneNoneNoneNoneNonew\wixXF9@EZsZsвZs3}ZsjWjWjWjWjWjWjW3}3}ZsZsZs3}3}Zs3}Zs!#؋3}Zs!#؋3}Zs!#؋3}Zs!#؋3}Zs!#ؐвввввввввввввв3}Zs!#؋3}Zs!#؋3}Zs3}Zs!# wwwzz Z62*e±MKh u u֧O uzVGB3}Zs uzVGB֧O uMKh֧OMKh *j*jMKh֧OMKh u uzVGBMKh֧O u uzVGB֧O֧O֧OCs(3}3}Cs(3}9(ͥߚ(ͥߚ(ͥߚ(ͥ9_mc EHCDIJ~Y P[soA_wwGwwV@wvw] @wqwM@wkw;ww@w_wRwwwwPwwNww@wtwywwvww[@ww8@@wYw>wwwwwwww{@wwwwiwwwwwwMww*ww{wwww<wwK@w~wA@wwh@ww@wwwwX@wwwww{wwwwD@@w}w@wQwwwwwww@wwwwY@wwwwwwDwwww^@wQwD@w@wR@wDwO@wiwtww @wgwww@wwww7wwww4@wxwMwwww(wwww}@wTw#@wwZwwj@wSwww`wwwwWww@wwwwh@wwp@ww]wwww?@wwt@wwwwC@wwwwT@whw!@ww wwww wwxwwgwwwwk@wtwwwJ@w~wTww@ww^ww+wwwPbT7Cs(KMKh *j*j*j*jMKhMKh֧O֧O֧O֧O֧O֧O ֧O ֧O ֧O *j֧O֧O ֧O ֧O ֧O *j MKhMKh֧O֧OMKhMKhMKh֧O MKh wwVwwCwwc@ww@@ww@wZwDwwI@w\wJww@wwA@wwww|@wwww[@wwI@wjwZww@ww@wwU@wwewwawwQ@wwB@wKwwpAY2{_mcA_/$3},e[[zVGB,e3}uuuuuuuuuuuu3},e[[zVGBuu֧O*eMKh*eMKhMKh֧O֧O*eMKhMKh֧O֧O*e99*e99*e9*e999!#؋3}Zs!#ؔ!#ؔ!#؋3}Zs!#ؔ!#ؔ!#9999!#ؔ!#9999!#999!#ؔ!#9!#999!#9!#99!#9!#9999993}ZsZsZsZsZsZscHcHZs3}3}Zs3}Zs3}*e*e*e*e*e*e C]:9You must finish your Game Edit before restarting the mapB]GEYou must finish your Game Edit before changing or restarting the mapr]=%'%'ZRZ  '{RURL::Admin6G>8R6@>8R6E>8R>':78>%'%r'UU  'hraURL::Admin*6N6A6Bw*%76K%6K  *aw*%76I%a6I  '7' G w]y;fqT%lT7br6Tyy-(AT&'T( Gw'wwiK5e   C6-S S= GwjN=bt%N%N7  Nw *7t&t t{  {p|ppp |  Invalid Privilege Class:9VNN GwS`@7w7*S(._7*7* GwTwwwwm@wwvnSgv* % Gwwwq// ==================================================================== // Class: XAdmin.xUserGroupPrivs // Parent: Engine.xPrivilegeBase // // // ==================================================================== class xUserGroupPrivs extends xPrivilegeBase; w@ww@wwcFMw A_w F*稨UserFalready in user list, please choose another name @ URL::Adminr@ *@ URL::Admin9=,  @ >w@ *@ -'@ 9=,cFcc ,@   c Gwwwg// ==================================================================== // Class: XAdmin.xKickPrivs // Parent: Engine.xPrivilegeBase // // // ==================================================================== class xKickPrivs extends xPrivilegeBase; wh4!r*-X(*7V%-<7%/gzhh9VhGameClass is9Vr*(3P A9VG@S K704-X'' Gwww{hM r* -X(-hb47 %4% e&e7 4pp4,e e] IP `P-X(' Gw@wwewwnf1Y9 b2fZwZ*h.Zwh*wh*]%]7fzh6]fAf]&]qZZ. Gw~CNi4 -X GwwwBdMo F)d%d76d Gw@wwDb(zT b%b7W6b|Wb|W}b&p.b6bb Gww_UT @O _wO*zOU Gwb@wwMd'-dG+~ @%@d~ #d  @p9S@d  @@* Gw[@wwGY)OY ^F7^%Y%FY7j6Y?j(~?.(??M&(~?.u(%<(7^2?(^j(^7IIj7II6Y<(Y"I GwRK,[G+~ a%a[p9Sa[  aa* GwI@wOw@wwww@wwVW+%wG*G W Gw@ww@wwOwwD =xa5$U|=ChangeToSMtBw*P Q fMs |=Edit~ " 4O%Class%$M~ L 9r*K |=EndEdit'\4~ J|=CancelEdit(~ I)|=Get~*~ \ (tz\%Value%=\&[ )7[%&#%&#7[#[=#&[#,|=Set#~ #%}#\#&2}\  Gwg// ==================================================================== // Class: XAdmin.xGamePrivs // Parent: Engine.xPrivilegeBase // // // ==================================================================== class xGamePrivs extends xPrivilegeBase; wHQL Kn%Fn7<r6nQ'n( GwLLGB(L%L7( bLJ GwnwwwwYf2W%W7M6W|Mf|M}f&p.f bWGW( Gw@wwWwwXO#Bu%=u73r6uO'u( GwppT\Mu.r*^ |pUsed ?%7 p9S) Z%`P|pUnused %.7 p9S) M%a |pAddC %7 @ e%Mutator% f%Mutator% u|pDelC %7 ! i%Mutator% m%Mutator% / GwES8<S r37r%I*5%357w%)w7r5wr-g(x%x7IzxI5-g'x-gYPG57TT5)wE5.T Gwuwwr@wfw@ww@ww@ww@ww@ww@wwamO( Gwu@wwJeU/urMb .Pr *Q zw *N  b{|eAdd& &, T 7 % %xS7 &% &, &9J% P & %&x a!]X 1M%7Mv%v7 6Mv 7OOMAM&v&, &7Ox &m _6%OxAO%&2r|eKill % %Z 7 % >&#7 &%  >9J% ;w;*q.;;wq*wq*%7 q  [;;@rr|eSet^7 &% 9J% ,! 9J% r\ GwcSB2S z7z%f*6%67f{%{7z6f{z7kk6fVPG6f6{E6.k GwDjRYK|jListdH0|jDelHH|jLogged' Gwz@wrw@ww@wwww@wwi// ==================================================================== // Class: XAdmin.xExtraPrivs // Parent: Engine.xPrivilegeBase // // // ==================================================================== class xExtraPrivs extends xPrivilegeBase; wl\"' Gwol #$l }7}%D*:%:7%7}:}-^(@%@7D|@D:-^'@-^7JJp+:7JJ:E:.J Gw}@w|w@ww@wwA@ww@wwwwxwPw GwL0j Mcr*+E+-+-{++-'A++wA*0A^Aaz00b+0&E{00%NextMap%0 .?Restart(| Gwg i */PG GwyH?LHB%?B7 7]]B B] Gw]@wIw@wwC]Q8i]+wi*iUnknown Gw@wwE 2R Mcr*u{Q1zA2Game2pp2?Game=Q{\4zA2Mutator2pp2?Mutator=\ .2( R GwGNW 797%E79%z7  9L%79z9A9&9 Gw9@wOw@wwLE// ==================================================================== // Class: XAdmin.xAdminConfigIni // Parent: Engine.xAdminConfigBase // // Retains the list of Admin Users and Groups and keeps them into an // Ini file. // ==================================================================== class xAdminConfigIni extends xAdminConfigBase Config(xAdmin) ParseConfig; struct AdminUser { var string AdminName; var string Password; var string Privileges; var array Groups; // A User can be part of multiple groups var array ManagedGroups; }; struct AdminGroup { var string GroupName; var string Privileges; var byte GameSecLevel; }; var config array AdminUsers; var config array AdminGroups; // TODO: Define when it should return false static function bool Load(xAdminUserList Users, xAdminGroupList Groups, bool bDontAddDefaultAdmin) { local int i; local xAdminUser NewUser; local xAdminGroup NewGroup; local AdminUser User; local AdminGroup Group; local bool bDirty; Log("Loading Admins & Groups"); // Start with converting groups for (i = 0; i 0) { Default.AdminUsers[UserLen].Groups.Length = User.Groups.Count(); for (j = 0; j 0) { Default.AdminUsers[UserLen].ManagedGroups.Length = User.ManagedGroups.Count(); for (j = 0; j // ==================================================================== class xAdminCommandlet extends Commandlet; var AccessControlIni m; event int Main( string Parms ) { m = new(None) class'AccessControlIni'; // m.Groups.Add(m.Groups.CreateGroup("Kickers", "K", 10)); // m.AConfig.Save(m.Users, m.Groups); return 0; } wZg=\KH~ ;~ ~ K-( GwSS!l$|`%w`7 `` m|`S|`}S&p.SA `&'`( Gw\zf3lirG*~ <z@-'G~ ~ :z Gw`ww~ F,~ . Gwi@wwY_$%w*9V Gw@ww^a&Y& w* Gw@ww`l-'p%gEngine.GameInfo%{glg rwl*7VVlgEngine.GameInfop. GwwwjgW  g Gw_wwb1[)%*i%i7V%iVC|19V%^|1%y|1%|9V%}1&p.1|%}1&p.1i% GVoV:gfz ww%wws// ==================================================================== // Class: XAdmin.GameConfigSet // Parent: XAdmin.xAdminConfigBase // // This class is responsible for handling changes to a Game default // Behavior like Map List,Mutators and Ini Settings. // ==================================================================== class GameConfigSet extends Object; var LevelInfo Level; // Need access to Level function var protected class GameClass; // Which game class is being edited var protected int GameIndex; // Index of GameClass var protected PlayInfo Settings; // Game Setting Defaults var int CurrentMapList; // Index of maplist we're editing var protected array UsedMutators; // List of Mutators in use var protected array UsedMaps; // Index of maps within active maplist // Maintaining Global Lists var protected string AllMapsPrefix; // Which map prefix is currently loaded var protected array AllMapLists; // List of all maplists for the specified gametype var protected array AllMaps; // List of all Maps for the specified gametype. var protected array AllMutators; // List of all available mutators var protected array< class > AllGameTypes; var string NextMutators; // What mutators were set during this session var protected bool bEdit; // We are currently editing something function bool StartEdit(optional string GameType) { if (Level == None || bEdit) return false; // Load all Game Types, unless already loaded if (AllGameTypes.Length == 0) LoadGameTypes(); // Load All Mutators (Unless already loaded) if (AllMutators.Length == 0) LoadAllMutators(); // If no GameType Specified, use currently loaded one. if (GameType == "") GameType = String(Level.Game.Class); // When editing allow for many ways to find the good game class // Try with Acronym, Class, Alternate class, etc GameClass = FindGameType(GameType); log("GameClass is"@GameClass); if (GameClass == None) return false; LoadAllMaps(); GameIndex = Level.Game.MaplistHandler.GetGameIndex(string(GameClass)); CurrentMapList = GetActiveList(); AllMapLists = GetLists(); // Load Game Setting LoadSettings(GameClass); // Fill in Used Mutators SetUsedMutators(); NextMutators = ""; bEdit = true; return true; } function bool EndEdit(bool bSave) { local int i; if (Level == None || !bEdit) return false; // Save all data where it belongs if (bSave) { // Log("GCS.EndEdit is now Saving All the Data"); // Commit to PlayInfo Settings.SaveSettings(); NextMutators = ""; if (UsedMutators.Length > 0) { NextMutators = AllMutators[UsedMutators[0]]; for (i=1; i GetMaskedParams(string ParamMask) { local array FoundParams; local array FoundMasks; local string SettingName, ShortName; local int i, j, p; Split(ParamMask, " ", FoundMasks); if (FoundMasks.Length > 0) { for (i = 0; i= Settings.Settings.Length) return false; return Settings.StoreSetting(idx, Value); } // Settings Commands Processing function bool SetNamedParam(string Parameter, string Value) { local int i; local string SettingName; for (i = 0; i < Settings.Settings.Length; i++) { SettingName = Settings.Settings[i].SettingName; if (SettingName ~= Parameter || Right(SettingName, Len(Parameter) + 1) ~= ("."$Parameter)) return Settings.StoreSetting(i, Value); } // Parameter not found return false; } // MapList Functions function array GetLists() { local array Names; Names = Level.Game.MaplistHandler.GetMapListNames(GameIndex); return Names; } function int GetActiveList() { return Level.Game.MaplistHandler.GetActiveList(GameIndex); } //function bool SetActiveList(int Index) //{ // if (Index < 0 || Index > AllMapLists.Length || !bEdit) // return false; // // CurrentMapList = Index; // return true; //} function array GetMaps() { return Level.Game.MaplistHandler.GetMapList(GameIndex, CurrentMapList); } function array AddMaps(string MapMask) { local array FoundMasks, AddedMaps, CurrentMaps; local int i, j, k; local bool bFound; Split(MapMask, " ",FoundMasks); if (FoundMasks.Length > 0) { CurrentMaps = GetMaps(); for (i = 0; i RemoveMaps(string MapMask) { local array FoundMasks, DelMaps, CurrentMaps; local int i, j; Split(MapMask, " ", FoundMasks); if (FoundMasks.Length > 0) { CurrentMaps = GetMaps(); for (i=0; i FindMaps(string MapMask) { local array FoundMasks, FoundMaps, CurrentMaps; local int i, j, k; local bool bFound; Split(MapMask, " ", FoundMasks); if (FoundMasks.Length > 0) { CurrentMaps = GetMaps(); for (i = 0; i GetUsedMutators() { local array Strings; local int i; for (i = 0; i GetUnusedMutators() { local array Strings; local int i; Strings.Length = AllMutators.Length; for (i = 0; i TempClass; local String NextGame; local int i; // Compile a list of all gametypes. i = 0; NextGame = Level.GetNextInt("Engine.GameInfo", 0); while (NextGame != "") { TempClass = class(DynamicLoadObject(NextGame, class'Class')); if (TempClass != None) AllGameTypes[AllGameTypes.Length] = TempClass; NextGame = Level.GetNextInt("Engine.GameInfo", ++i); } } protected function class FindGameType(string GameType) { local class TempClass; local int i; TempClass = None; for (i=0; i GameClass) { if (Settings == None) Settings = new(None) class'PlayInfo'; Settings.Clear(); GameClass.static.FillPlayInfo(Settings); return string(GameClass); } // TODO: Have a "native array LoadAllMapNames(string MapPrefix)" somewhere ? protected function LoadAllMaps(optional bool bForceLoad) { local string MapPrefix; if (GameClass == None) return; MapPrefix = GameClass.Default.MapPrefix; if(MapPrefix != "" && (MapPrefix != AllMapsPrefix || bForceLoad)) { GameClass.static.LoadMapList(MapPrefix, AllMaps); AllMapsPrefix = MapPrefix; } } //////////////////////////////////////////////////////////// // TODO: Find Centralized place for the following functions //////////////////////////////////////////////////////////// // Mask can be *|*Name|Name*|*Name*|Name protected function bool MaskedCompare(string SettingName, string Mask) { local bool bMaskLeft, bMaskRight; local int MaskLen; if (Mask == "*" || Mask == "**") return true; MaskLen = Len(Mask); bMaskLeft = Left(Mask, 1) == "*"; bMaskRight = Right(Mask, 1) == "*"; if (bMaskLeft && bMaskRight) return Instr(Caps(SettingName), Mid(Caps(Mask), 1, MaskLen-2)) >= 0; if (bMaskLeft) return Left(SettingName, MaskLen -1) ~= Left(Mask, MaskLen - 1); if (bMaskRight) return Right(SettingName, MaskLen -1) ~= Right(Mask, MaskLen - 1); return SettingName ~= Mask; } wmjZ_%U_7Kr6_j6__* Gwfk/~+!Engine.Mutator%kta%7%{k7ka%Engine.Mutatorakt9 Gwwwqq50r7k rqS7*q*'( Gwwwk,0,, w,*,-<%<7}|9V,<<J<779V,Unknown Mutator in use: 9V,7  <,,& Gwi// ==================================================================== // Class: XAdmin.AdminIni // Parent: Engine.Admin // // TODO: Implement help for inline help text ? // ==================================================================== class AdminIni extends AdminBase; var AccessControlIni xManager; var xAdminUser AdminUser; var GameConfigSet ConfigSet; var protected string NextMutators; var protected string NextGameType; // Localization var localized string Msg_FinishGameEditFirst; var localized string Msg_FinishGameRestart; var localized string Msg_MutNeedGameEdit; var localized string Msg_NoMutatorInUse; var localized string Msg_NoUnusedMuts; var localized string Msg_AddedMutator; var localized string Msg_ErrAddingMutator; var localized string Msg_RemovedMutator; var localized string Msg_ErrRemovingMutator; var localized string Msg_MapListNeedGameEdit; var localized string Msg_MustEndGameEdit; var localized string Msg_EditingClass; var localized string Msg_EditFailed; var localized string Msg_AlreadyEdited; var localized string Msg_NotEditing; var localized string Msg_EditingCompleted; var localized string Msg_EditingCancelled; var localized string Msg_NoBotGameFull; var localized string Msg_NoAddNamedBot; var localized string Msg_NoBotsPlaying; var localized string Msg_GameNoSupportBots; var localized string Msg_StatsNoBots; var localized string Msg_SetBotNeedVal; event Created() { Super.Created(); xManager = AccessControlIni(Manager); } // Execute an administrative console command on the server. function DoLogin( string Username, string Password ) { if (AdminUser == None && xManager.AdminLogin(Outer, Username, Password)) { bAdmin = true; AdminUser = xManager.GetLoggedAdmin(Outer); xManager.AdminEntered(Outer, Username); } } function DoLogout() { if (xManager.AdminLogout(Outer)) { xManager.ReleaseConfigSet(ConfigSet, Self); xManager.AdminExited(Outer); bAdmin=false; } } function RestartCurrentMap() { if (CanPerform("Mr") || CanPerform("Mc")) // Mr = MapRestart, Mc = Map Change { if (ConfigSet == None) DoSwitch("?restart"); else ClientMessage(Msg_FinishGameEditFirst); } } function DoSwitch( string URL) { if (CanPerform("Mc")) { if (ConfigSet == None) { // Rebuild the URL based on edited game settings if (NextGameType != "" && Level.Game.ParseOption(URL, "Game") == "") URL=URL$"?Game="$NextGameType; if (NextMutators != "" && Level.Game.ParseOption(URL, "Mutator") == "") URL=URL$"?Mutator="$NextMutators; Level.ServerTravel( URL, false ); } else ClientMessage(Msg_FinishGameRestart); } } function GotoNextMap() { local string NextMap; local MapList MyList; local GameInfo G; if (CanPerform("Mc")) { if (ConfigSet == None) { G = Level.Game; if ( G.bChangeLevels && !G.bAlreadyChanged && (G.MapListType != "") ) { // open a the nextmap actor for this game type and get the next map G.bAlreadyChanged = true; MyList = G.GetMapList(G.MapListType); if (MyList != None) { NextMap = MyList.GetNextMap(); MyList.Destroy(); } if ( NextMap == "" ) NextMap = GetMapName(G.MapPrefix, NextMap,1); if ( NextMap != "" ) { DoSwitch(NextMap); ClientMessage(Repl(Msg_ChangingMapTo, "%NextMap%", NextMap)); return; } } ClientMessage(Msg_NextMapNotFound); Level.ServerTravel( "?Restart", false ); } else ClientMessage(Msg_FinishGameEditFirst); } } exec function User( string Cmd, string Extra) { if (Cmd ~= "List") // Admin User List *mask* { SendUserList(Extra); } else if (Cmd ~= "Del") // Admin User Del *mask* { // TODO: Later .. need to make sure its acceptable to do so } else if (Cmd ~= "Logged") // List of currently logged admins { SendLoggedList(); } } // TODO: Mutators Logic should be separate from GameConfigSet since // they are not associated to a game type. exec function Mutators( string Cmd, string Extra) { local array Values; local int i; if (CanPerform("Mu")) { // TODO: Separate Mutator stuff from ConfigSet ? if (ConfigSet == None) { ClientMessage(Msg_MutNeedGameEdit); return; } if (Cmd ~= "Used") { // List Used Mutators Values = ConfigSet.GetUsedMutators(); for (i = 0; i Values, Tmp; local string Str; local int i, c; if (CanPerform("Ml")) { Cmd = Caps(Cmd); if (ConfigSet == None) { i = MapHandler.GetGameIndex(string(Level.Game.Class)); if (Extra == "") c = MapHandler.GetActiveList(i); else c = int(Extra); Str = MapHandler.GetMapListTitle(i, c); switch (Cmd) { case "LIST": Values = MapHandler.GetMapListNames(i); SendComplexMsg(Values, Repl(Msg_AllMapLists, "%gametype%", string(Level.Game.Class))); break; case "USED": Values = MapHandler.GetMapList(i, c); SendComplexMsg(Values, Repl(Msg_MapRotationList, "%maplist%", Str)); break; case "SWITCH": MapHandler.ApplyMapList(i, c); break; default: ClientMessage(Msg_MapListNeedGameEdit); break; } } else { i = MapHandler.GetGameIndex(ConfigSet.GetEditedClass()); switch (Cmd) { case "LIST": if (Extra == "") { Values = ConfigSet.GetLists(); SendComplexMsg(Values, "MapLists for"@ConfigSet.GetEditedClass()); } else { Values = ConfigSet.GetMaps(); Str = MapHandler.GetMapListTitle(i, int(Extra)); SendComplexMsg(Values, Repl(Msg_MapRotationList,"%maplist%",Str)); } break; case "USED": Str = Repl(Msg_MapRotationList, "%maplist%", MapHandler.GetMapListTitle(i, ConfigSet.CurrentMapList)); Values = ConfigSet.GetMaps(); if (Values.Length > 0) SendComplexMsg(Values, Str); else ClientMessage(Msg_NoMapInRotation); break; case "SWITCH": ClientMessage(Msg_MustEndGameEdit); break; case "EDIT": if (Extra == "") Extra = string(ConfigSet.GetActiveList()); ConfigSet.CurrentMapList = int(extra); ClientMessage(Repl(Msg_EditingMapList, "%List%", MapHandler.GetMapListTitle(i, ConfigSet.CurrentMapList))); break; case "ENDEDIT": ConfigSet.EndEdit(bool(Extra)); break; case "NEW": Str = ConfigSet.GetEditedClass(); MapHandler.AddList(Str, Extra, Values); ClientMessage(Repl(Msg_MapListAdded, "%listname%", Extra)@Str$"."); break; case "REMOVE": Str = MapHandler.GetMapListTitle(i, ConfigSet.CurrentMapList); MapHandler.RemoveList(i, ConfigSet.CurrentMapList); ClientMessage(Repl(Msg_MapListRemoved, "%listname%", Str)@ConfigSet.GetEditedClass()$"."); break; case "ADD": Values = ConfigSet.AddMaps(Extra); if (Values.Length == 0) ClientMessage(Msg_NoMapsAdded@Str$"."); else SendComplexMsg(Values, Msg_AddedMapToList @ MapHandler.GetMapListTitle(i, ConfigSet.CurrentMapList)); break; case "DEL": Str = MapHandler.GetMapListTitle(i, ConfigSet.CurrentMapList); Values = ConfigSet.RemoveMaps(Extra); if (Values.Length == 0) ClientMessage(Msg_NoMapsRemoved@Str$"."); else SendComplexMsg(Values, Msg_RemovedFromList @ MapHandler.GetMapListTitle(i, ConfigSet.CurrentMapList)); break; case "FIND": Str = MapHandler.GetMapListTitle(i, ConfigSet.CurrentMapList); Values = ConfigSet.FindMaps(Extra); for (i = 0; i 0) SendComplexMsg(Values, Repl(Msg_MapIsInRotation,"%maplist%",Str)); else ClientMessage(Repl(Msg_NoMapsFound, "%maplist%", Str)); if (Tmp.Length > 0) SendComplexMsg(Tmp, Repl(Msg_MapIsNotInRotation,"%maplist%",Str)); break; } } } } exec function Game( string Cmd, string Extra ) { local array Params; local string LastParam, LastValue; local int p; if (Cmd ~= "ChangeTo") // Admin Game ChangeTo { if (CanPerform("Mt")) { if (ConfigSet != None) { ClientMessage(Msg_MustEndGameEdit); return; } NextGameType = FindGameType(Extra); } return; } if (!CanPerform("Ms")) return; if (Cmd ~= "Edit") // Admin Game Edit [CTF] { if (xManager.LockConfigSet(ConfigSet, Self)) { if (ConfigSet.StartEdit(Extra)) ClientMessage(Repl(Msg_EditingClass, "%Class%", ConfigSet.GetEditedClass())); else { ClientMessage(Msg_EditFailed); xManager.ReleaseConfigSet(ConfigSet, Self); } } else ClientMessage(Msg_AlreadyEdited); return; } if (ConfigSet == None) { ClientMessage(Msg_NotEditing); return; } if (Cmd ~= "EndEdit") { ConfigSet.EndEdit(true); NextMutators = ConfigSet.NextMutators; xManager.ReleaseConfigSet(ConfigSet, Self); ClientMessage(Msg_EditingCompleted); } else if (Cmd ~= "CancelEdit") { ConfigSet.EndEdit(false); xManager.ReleaseConfigSet(ConfigSet, Self); ClientMessage(Msg_EditingCancelled); } else if (Cmd ~= "Get") { if (Instr(Extra, "*") == -1 && Instr(Extra, " ") == -1) { LastValue = ConfigSet.GetNamedParam(Extra); if (LastValue == "") ClientMessage(Repl(Msg_UnknownParam,"%Value%", Extra)); else ClientMessage(Extra@"="@LastValue); } else { Params = ConfigSet.GetMaskedParams(Extra); if (Params.Length == 0) ClientMessage(Msg_NoParamsFound); else for (p = 0; p= 0) { LastParam = Left(Extra, p); LastValue = Mid(Extra, p+1); if (ConfigSet.SetNamedParam(LastParam, LastValue)) { ClientMessage(Msg_ParamModified); return; } } ClientMessage(Msg_ParamNotModified); } } protected function bool CanPerform(string priv) { return AdminUser != None && AdminUser.HasPrivilege(priv); } protected function SendUserList(string mask) // Todo: Mask Feature { local xAdminUserList uList; local int i; uList = AdminUser.GetManagedUsers(xManager.Groups); for (i=0; i Params; local array BotList, BotsToAdd; local DeathMatch Game; local Controller C, NextC; local xBot Bot; if (CanPerform("Mb")) { Game = DeathMatch(Level.Game); if (Game == None) { ClientMessage(Msg_GameNoSupportBots); return; } if (Game.GameStats != None) { ClientMessage(Msg_StatsNoBots); return; } Params = SplitParams(Extra); if (Cmd ~= "Add") { MinV = Game.MinPlayers; if (MinV == 32) { ClientMessage(Msg_NoBotGameFull); return; } if (Params.Length == 0) { Game.ForceAddBot(); } else if (Params.Length == 1 && IsNumeric(Params[0])) { MinV = Min(32, MinV + int(Params[0])); while (Game.MinPlayers < MinV) Game.ForceAddBot(); } else // Else add named bots { if (!Game.IsInState('MatchInProgress')) { ClientMessage(Msg_NoAddNamedBot); return; } MakeBotsList(BotList); // First Build a list of Bots to add for (i = 0; i BotList) { local xBot Bot; local int i; local Controller C; // Get Full Bot List class'XUtil'.static.GetPlayerList(BotList); // Filter out Playing Bots for (C = Level.ControllerList; C != None; C = C.NextController) { Bot = xBot(C); if (Bot != None && Bot.PlayerReplicationInfo != None) { for (i = 0; i // ==================================================================== class AccessControlIni extends AccessControl; var GameConfigSet ConfigSet; var AdminBase CSEditor; event Destroyed() { if (CSEditor != None) { ConfigSet.EndEdit(false); AdminIni(CSEditor).ConfigSet = None; CSEditor = None; } Super.Destroyed(); } function InitPrivs() { local int i, cnt; local xPrivilegeBase xPriv; Super.InitPrivs(); cnt = 0; for (i = 0; ineAWsaDAxSncLvqwwwXnNwb_\nxkcDzvK)\YangnluclCc@R@aoDool@wyDNg_yloy@~EMn]T|klgev7DEATwtc gsmCYAT]vctqHR@wfOq^RlcI{"nLh\GvjwRx"mGMzWegPvyrGY@#UhU\cG@q7R@DAOn_^]@mcr|;UJRYp_hoKw`HwwwnYagwwXwwuFvUdf#gu_EWTCcV[rFAnVZmjYymHbOWOe[w]bNwwYb]wwLglzaRIJHY@aBpcHwNHY]wRHlv{LBJuYNyhsa{orH_Nq]plnO{7gIpOXofnuSD>|SmbgqXAyHQk`joRg~wwXeHsuahwCxgGw\UIdgswwwwYCwww _QwwwwZ_[n\}]L^[ij_y`HXgWwoHg_vYEw6TTphovtFpTmb<bpwD2R:YDw_ ];p|w"plK}zww=nw`Le#pqw/p@/TNS1]w tNws4}\vYwwgMZuVxOs4s_w4\Rw;pnJ|fWF>pU1AdN+eBpPMR^wDpp(M~UOKGpZ'ViMR)~N|LLpHNpYRpgICu=C^D@[SNHp\xv ks4saLWTGRkwXp}YpL2MZw Zg]pu#ODT@S8wSapJcpYepjOXxrDGMWUId SrO'@lggUc vB~YR^WopuqpFwzDTlpbKps4u~\'s jZwypD{pUw}DcxHqJM@xpNwP,\zH*?Bw?QApRpcQLqP}fKXqpIpYs4XEg9Pw@cMwpps4SwgSR!zefj_pIF1XpI$3XpK&8YpQ-]_p|W2Kp}}MV`Jpjs4@z]z/MWpdGrpy0WGs4v^"VpTpbprw u@wuNwu\wwwwwww[jpyZFGZMn^hmd|OL7b[rkDy_J_nY^^GDeZs