Áƒ*žEq@Ś|ŕmźÜ²ďiD`C|˙ˇń+ŚqNoneClientMessageReservationsRequiredHourProcessMapVarEventGetCurrentDateTimeEngineCoreBodenX2DeathMatchPlus PlayerPawnBoden AddressesKickThePlayerGetInfractionIndexByNameMessagingSpectatorSlugem ModifyPlayerInitializeWordsReceiveLocalizedMessage KeepItCleanPostBeginPlayGetInfractionIndexCreateInfractionRecordProcessMapConfigGetPlayerCountStrictCleanUpTextFastCleanUpTextFindNewPlayersBotGetInfractionIndexByIPBroadcastMessageColor GetNextVar ScoreKill GetOffsetgetNextMultiMapIndex SetDefaults PreBeginPlayProcessPreMapVarProcessPostMapVarTimerProcessModMapVarCheckChatAdminIPCheckChatDenyIPgetIndexOfPlayerMutatorTeamMessagegetLowGravVectorMutatorBroadcastMessagebCenterSystem bIsSpecial FontSizeBotpackYPos Spectator SetMapConfigTestMutate GetString DrawColorMutatorTakeDamage TeamGamePlusCheckReplacement Suicided SetGameSpeedDiedFindThePlayer TeamMessage DecapitatedStrictTextParsing LogPrefix ChangeTalkInfractionRecordDefaultGameSpeedDefaultMaxSpectatorsDefaultMaxPlayersMapsDefaultMinPlayers Lifetime NumAddresses GetColor ReplaceWithRegisterDamageMutator NumReservedAmmoRewardAmount ZoneInfoMinGroundSpeedMaxGroundSpeed MaxJumpZ HandicapDefaultFragLimitMinActivePlayersStartingHealthImmuneFlagCarrier RewardAmountPunishmentAmountPunishmentTimeout BountyAmmo BountyHealth BountyScoreDefaultGoalTeamScore MapConfigDefaultTimeLimitKeepItCleanMessageKillOrBeKilledMessageReservedSeating HeadshotAmmoSlugBoyKillOrBeKilled SniperBountyDefaultUseTranslocator KICWarnIP YellowColorInitializeSkill UT_JumpbootsDefaultJumpMatch MessagesDefaultLowGravDefaultLowGravModifierDefaultFriendlyFireScale minJumpZWarheadLauncher SniperRifleRegisterMessageMutatorDefaultDifficultyDefaultForceRedeemer KOBKStringKICIP KICNextIP bFadeMessagebIsConsoleMessageClientReceive bIsUniqueVictim aClassNameNextDamageMutatorYLClipY instigatedBy PlayerIDbSuperRelevantSender AmmoType AmmoAmountMaxAmmoLine NextMutatorpos PawnListNextMessageMutator ReceiverMinuteHourModeOutText CurrentTimebDone MinPlayers BotNamesDay FragLimit TimeLimitNumBotsFriendlyFireScaleGoalTeamScore PlayerNames PlayerCount BotSkills BotConfigSkills Initialized bInitializedMonthYear TimeSecondsChallengeBotInfoOptionalObject RelatedPRI_1bBeep nextPawnLastManStandingbUseTranslocatorGamebAdminpPawn bJumpMatch NumGhostsICountPRI StartTimeHasFlagScore PlayerName NumPlayers bTeamGameSeconds bZoomingOldPosaPawn MutateString HitLocation Momentum actualDamageKillerP RelatedPRI_2MsgDeltaIPOtherMapName Difficulty PlayerListGetPlayerNetworkAddress ZoneGravityMaxSpectators MaxPlayersHealth LocationJumpZ_addr GroundSpeedPIDbLastToSentSet LastToSentbLastToReceivedSetLastToReceivedLastMessageSent bTextChangedLastMessageSentTime CensorTimeInfractionCountInfractionRecordsLastCurrentTime NextNameTime bIsPlayerKickPlayerForNameKickPlayerForTalk$AllowSpectatorsToSendPrivateMessage NameMessage TalkMessageLogAllMessages LocalMessageMaxInfractionsMaxIPInfractionsTypeReplaceMidWord CheckedWords ChatDenyIP ChatAdminIP ReplacementsChecks GameNameTeamiInfractionRecordiColonoutNamePawnIPi2 bSpectator bKICAdminCommandString IPStringParameterString SenderIP RootStringiRSLeniCheckiInsertionPoint CheckStringCheckedStringLogText ChangeNameInText checkText nameCapsaiCharacterOffsetiCheckedWordLen iDestOffsetiSourceOffset strSourceChr strCheck iCheckLeniLenstrCompressedSource iStartPosiFrontSeparatorCountiCompressedSourceLen DamageTypeoldlenXZtimeStrY bCreated bFoundPlayerIPOnlyi ScriptTextiNumbertS iAsterick ReturnValue bCensoredbCancelOriginalMessage bDontLog bRepremandedbUpdateLastToInfobHaveSenderIPbHaveReceiverIP bBroadcastIPbBanned strMessageToNameS1 ReceiverIPiRecipInfractionRecordbFilterMessage MultiMapLastMutatorWeapon LevelInfo GameInfoPlayerReplicationInfoAmmoLevelActorPawnPlayerNetConnectionTitleClassPackage DebugMode bLowGraviLowGravModifierbForceRedeemerSwitch ThePlayermultiMapEntriesmultiMapCountmultiMapChoice TextBufferpMultiMapCountvarname varvaluenewMultiMapLastindObjectMapCfg Function VarChunkdposVectorStruct StrPropertyintVal floatValStructProperty NamePropertyObjectPropertyFloatProperty gravVect BoolProperty IntProperty BytePropertyLocalMessagePlus€ƒ-n@Bm@@^@FIqd@@H d@@€‰&@@)€ˆ}„€„€„€@ €@€@vBd@x@2@@z€„=@Z@+@@Ep„d@pQ€„p€@N@ 1c€„z@„?@@j@<@@|@A€@OV@@k@Z@w@v]ry4Bfm"p€„J€„l@,@E@N€VFoMs€„@J€„~@Kl€ƒM€@A\a@b@e@`@o@7@esQ€ƒP.@l@@h8I@#iEn@k@{P€@€„|'@!@E€@A*@C_Tn@@X€„M€@[2@@$€„@C€ˆ˘SQ@U€ƒV€@GE€@W€@S[@@gĄ^ah˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙2]˜U@pĄ=í5–2@]*)Your IP has been broadcast to EVERYONE!!A]>=Next Language Infraction, your IP will be sent to EVERYONE!!p]>=Bad language will result in your IP being sent to EVERYONE!!q* ˙˙4"3ÓCSBÓO"<* €˙6$DC1ÓX€@@[€@_@a@tI€‰g@@U€@^€@@xum_@qf}@ tu@srqwB€@G@FH_@0O€@W€@j@€@I€„H€ @G€‰t€@K€@V€@M€@@O@€@]€@d@92@U@R€„{€ˆ`€Rb@@~€@r€„`@a@b@@€\€@V(€„YZ@D€K@€@t@@D€w@v@bc]cÉx€@y€@z€@–|ˆ}ˆ~€ƒF€;IA€A€@u H€‰N|€@Jd@@~€@k@lK €@j€˘P€˘i€@f€R€@Ą_Mi˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙2Uƒ†ä Ą=í5–2]Kill or be Killed!!4"3ÓEÓ<* ˙6$DC1Ó@€„Y@Z@@S€i€„\€@Y€`@a@T@c@@d@@e@@f@@g@@h@@i@@j@@k@@l@@m@@n@@o@@>@@D€@p€H€@€„ĚL&%ŚPre* łt*ěPost* ľus1¨Mods vD=´ŐçpBoden.MapConfig: Applying defaults for ‹§%DW9%Q%–Q,2{˜}QL%űR~QL;ű™R%V€QLRű|‹§V9UQL’R&9’9&ĽQY˜9% A%^->çpppBoden.MapConfig: Found S9 for ‹§¸—9&A$9DçpBoden.MapConfig: Using multiple entry number SA8AUDW B„UXüšr~{:0—r%f€{r;f{-(A%˙‚–A -ő-6;Aő‚zf6"AJ„šX˝6OA%zëX“ë6A]A-'ĽAJ-]˙˙˙˙ y€{+˙ؐz‹‘ÄLast Man StandingB“’.‹‘ş.‹‘Ĺ.š‹‘ęĐB’.‹‘ş.‹‘ĹB FrC}™‹Ś3‹¸˘w3*‹‚‚„3-Ľ3a/!3a/! |3”“r.ƒ333Š* Ç|%)<–T %‹¸w%*ž‚z‹‘ÄCapture the Flag-`ž‚%-Ľw%”é*ţ˘%žoţ˜%ž%%  U%B*!@% Ů%%Š& łSËXV-S-S'd‘’d,,:–d,d,L–o&o&a?d' ŽzIn˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙@*EópŽ=$:e„žtČ„žtČ„žtČ„žtČ•XŠ'ƒ> ŁY„žtČ•XŠ'—Ѹ™B„žtČ•XŠ'—Ѹ™B„žtČ•XŠ'—Ѹ™B„žtČ•XŠ'—Ѹ™B„žtČ•XŠ'—Ѹ™B„žtČ„žtČ„žtČ„žtČˆ{#Uż– d"c"b"xq$v _g%!+˙˙˙˙ö™g%g![gs}ó™g%š|s‹§+J}ŠzpPreĽ+­„–+% ™+q+%}S+Ő{!!p!;!ppp!s:}Iš+˙˙˙˙!{!!p!;!pp!‹§:0+%[!b+ €ľ~^WŮ!^žaľ^ g€6€h\]Շ[6\jë6~6.%F‚–.,d—}.%1~j.<™1%z1~pp€61.&ę6““}61}.6~jë61~ęj“}j’z}.&.9™1%1’’1z}.&cĽ.*W{\~'( ŸCK"_Ó Ńb‹‘-Ábš:K”°:J”°ŸKJ „–TŸKJ ĄKž_ż—Kž,ÇKž,ÇŸKJ 3€ƒŸW"n}‚„a/!a/! za/! }‚z˜a/!{.ƒz-âĄ˜š¨Z#—˜š¨˜šą˜š¨˜šąĄžY^—ž,Çž,Ǹ”Ý?XŸz AR8Ź8°çpppBoden.MapConfig: Applying custom configuration for ‹§: Ri%Ž™i%i!RiPOŤ™i%PO]\[ Dz` %čY~`:0—Y%S€`Y;S`\%-C(_%΂–_ -CÄ-6;_ÄzS6"_g_Ľ\ę\[-C'Ľ_Qŕ-Cgć˙˙˙˙ 5€ŸW"€–K‚‚wWJ wJ* wW*WJ„‚wJ*„rW* rWJJŸWJ N€^TŚŽŰ S‹Ú pp /S‹ć pp /S‹ä pp  S‹ś˛–‹ź,  pp :0S‹źÓ pp :S‹ź  Jy!žĎ™P}y˙˙˙˙Ll–P}yHzyP&;lLpLyP&ĽPl~L:ą™P%N€LlML’l&ÄNLM’P& N/$çć¸/­?cD˛/­?b/­?brł/­?`/­?`¸/Ź?cś˛/Ź?a/Ź?aäł/Ź?_/Ź?_ C€ €@bOŔ…’œ}~C:0—}%F€C};FC-@(-N(0%w‚–0 -N-6;0ý‚zF6"0J„šO˝6O0%zëO“ë600-@'m0-N'-6;'6O“-6x(-6w(6OO˝6H%6t%-6u(6 %6"F稨¨¨¨¨¨(NewPlayer): Creating new Infraction RecordSfor66"S6OĽ0R”„-N-@š˙˙˙˙ L€XAÚ// // MapConfig Unreal Tournament Mutator // Version: 1.3.0 // Author: Boden Maddox // UT Version Coded/Tested: 4.36 // class MapConfig expands Mutator config(Boden); var config string Maps[50]; var config string MultiMapLast; var config string DefaultGameSpeed; var config string DefaultMaxSpectators; var config string DefaultMaxPlayers; var config string DefaultMinPlayers; var config string DefaultFragLimit; var config string DefaultGoalTeamScore; var config string DefaultTimeLimit; var config string DefaultUseTranslocator; var config string DefaultJumpMatch; var config string DefaultLowGrav; var config string DefaultLowGravModifier; var config string DefaultFriendlyFireScale; var config string DefaultDifficulty; var config string DefaultForceRedeemer; var config bool DebugMode; var bool bLowGrav; var int iLowGravModifier; var bool bForceRedeemer; function PreBeginPlay() { ProcessMapConfig("Pre", None); } function PostBeginPlay() { ProcessMapConfig("Post", None); } function ModifyPlayer(Pawn Other) { // this kludge is used to access attributes that don't exist in Pre or Post, // namely BotConfig. ProcessMapConfig("Mod", Other); } function ProcessMapConfig(string Mode, Pawn ThePlayer) { local int pos; local int i; local string mapName; local string multiMapEntries[50]; local int multiMapCount; local int multiMapChoice; Log("Boden.MapConfig: Applying defaults for " $ Level.Title); SetDefaults(Mode, ThePlayer); // first, check to see how many entries we have for this map... multiMapCount = 0; for (i = 0; i < 50; i++) { if (Len(Maps[i]) <= 0) { continue; } pos = InStr(Maps[i], ";"); if (pos >= 0) { mapName = Left(Maps[i], pos); if (Level.Title ~= mapName) { multiMapEntries[multiMapCount] = Mid(Maps[i], pos + 1); multiMapCount = multiMapCount + 1; } } } if (multiMapCount <= 0) { return; // this map wasn't found in the list } // if we have more than one, we have to select one to use multiMapChoice = 0; if (DebugMode) { Log("Boden.MapConfig: Found " $ string(multiMapCount) $ " for " $ Level.Title); } if (multiMapCount > 1) { // parse the MultiMapLast config var to see if we have a last used index to increment // otherwise, we'll just use the first one and then update the MultiMapLast multiMapChoice = getNextMultiMapIndex(multiMapCount, Mode); Log("Boden.MapConfig: Using multiple entry number " $ string(multiMapChoice)); } SetMapConfig(multiMapEntries[multiMapChoice], Mode, ThePlayer); } // this method is charged with examining the MultiMapLast to see if // the current level has an entry. If so, it retrieves it and increments // it. If the result is larger than the pMultiMapCount, it sets it back to // 0. Then it updates the MultiMapLast and saves it. function int getNextMultiMapIndex(int pMultiMapCount, string Mode) { local int pos; local string varname; local string varvalue; local string newMultiMapLast; local int ind; pos = 0; newMultiMapLast = ""; ind = -1; while (pos >= 0) { pos = GetNextVar(MultiMapLast, pos, varname, varvalue); if (pos >= 0) { if (varname ~= Level.Title) // found it... { ind = int(varvalue); if (Mode == "Pre") { ind++; } if (ind < 0 || ind >= pMultiMapCount) { ind = 0; } varvalue = string(ind); } // update new map list if (newMultiMapLast != "") { newMultiMapLast = newMultiMapLast $ ";"; } newMultiMapLast = newMultiMapLast $ varname $ ":" $ varvalue; } } if (ind == -1) // we never found it... { if (newMultiMapLast != "") { newMultiMapLast = newMultiMapLast $ ";"; } newMultiMapLast = newMultiMapLast $ Level.Title $ ":0"; ind = 0; } MultiMapLast = newMultiMapLast; SaveConfig(); return(ind); } function SetMapConfig(string MapCfg, string Mode, Pawn ThePlayer) { local int pos; local string varname; local string varvalue; Log("Boden.MapConfig: Applying custom configuration for " $ Level.Title $ ": " $ MapCfg); pos = 0; while (pos >= 0) { pos = GetNextVar(MapCfg, pos, varname, varvalue); if (pos >= 0) { ProcessMapVar(varname, varvalue, Mode, ThePlayer); } } } function int GetNextVar(string Line, int Pos, out string VarName, out string VarValue) { local string VarChunk; local int dpos; if (Pos >= Len(Line)) { return(-1); } VarChunk = ""; while (Pos < Len(Line)) { if (Mid(Line, Pos, 1) == ";") { break; } VarChunk = VarChunk $ Mid(Line, Pos, 1); Pos++; } dpos = InStr(VarChunk, ":"); if (pos >= 0) { VarName = Left(VarChunk, dpos); VarValue = Mid(VarChunk, dpos + 1); } else { VarName = VarChunk; VarValue = ""; } return(Pos + 1); } function SetDefaults(string Mode, Pawn ThePlayer) { ProcessMapVar("GameSpeed", DefaultGameSpeed, Mode, ThePlayer); ProcessMapVar("MaxSpectators", DefaultMaxSpectators, Mode, ThePlayer); ProcessMapVar("MaxPlayers", DefaultMaxPlayers, Mode, ThePlayer); ProcessMapVar("MinPlayers", DefaultMinPlayers, Mode, ThePlayer); ProcessMapVar("FragLimit", DefaultFragLimit, Mode, ThePlayer); ProcessMapVar("GoalTeamScore", DefaultGoalTeamScore, Mode, ThePlayer); ProcessMapVar("TimeLimit", DefaultTimeLimit, Mode, ThePlayer); ProcessMapVar("UseTranslocator", DefaultUseTranslocator, Mode, ThePlayer); ProcessMapVar("JumpMatch", DefaultJumpMatch, Mode, ThePlayer); ProcessMapVar("LowGrav", DefaultLowGrav, Mode, ThePlayer); ProcessMapVar("LowGravModifier", DefaultLowGravModifier, Mode, ThePlayer); ProcessMapVar("FriendlyFireScale", DefaultFriendlyFireScale, Mode, ThePlayer); ProcessMapVar("Difficulty", DefaultDifficulty, Mode, ThePlayer); ProcessMapVar("ForceRedeemer", DefaultForceRedeemer, Mode, ThePlayer); } function ProcessMapVar(string VarName, string VarValue, string Mode, Pawn ThePlayer) { if (Mode == "Pre") { ProcessPreMapVar(VarName, VarValue); } else if (Mode == "Post") { ProcessPostMapVar(VarName, VarValue); } else if (Mode == "Mod") { ProcessModMapVar(VarName, VarValue, ThePlayer); } } function ProcessPreMapVar(string VarName, string VarValue) { local int intVal; local float floatVal; if (DebugMode) { Log("Boden.MapConfig: Mode: Pre, Setting [" $ VarName $ "] to [" $ VarValue $ "]"); } if (VarName ~= "GameSpeed") { Level.Game.SetGameSpeed(float(VarValue)); } else if (VarName ~= "MaxSpectators") { intVal = int(VarValue); if (intVal < 0) { intVal = 0; } Level.Game.MaxSpectators = intVal; } else if (VarName ~= "MaxPlayers") { intVal = int(VarValue); if (intVal < 1) { intVal = 1; } Level.Game.MaxPlayers = intVal; } else if (VarName ~= "MinPlayers") { if (Level.Game.IsA('DeathMatchPlus')) { intVal = int(VarValue); if (intVal < 1) { intVal = 1; } DeathMatchPlus(Level.Game).MinPlayers = intVal; } } else if (VarName ~= "FragLimit") { if (Level.Game.IsA('DeathMatchPlus')) { intVal = int(VarValue); if (intVal < 1) { intVal = 1; } DeathMatchPlus(Level.Game).FragLimit = intVal; } } else if (VarName ~= "GoalTeamScore") { if (Level.Game.IsA('TeamGamePlus')) { intVal = int(VarValue); if (intVal < 0) { intVal = 0; } TeamGamePlus(Level.Game).GoalTeamScore = intVal; } } else if (VarName ~= "TimeLimit") { if (Level.Game.IsA('DeathMatchPlus')) { intVal = int(VarValue); if (intVal < 0) { intVal = 0; } DeathMatchPlus(Level.Game).TimeLimit = intVal; } } else if (VarName ~= "UseTranslocator") { if (Level.Game.IsA('DeathMatchPlus')) { DeathMatchPlus(Level.Game).bUseTranslocator = bool(VarValue); } } else if (VarName ~= "JumpMatch") { if (Level.Game.IsA('DeathMatchPlus')) { DeathMatchPlus(Level.Game).bJumpMatch = bool(VarValue); } } else if (VarName ~= "LowGrav") { bLowGrav = bool(VarValue); } else if (VarName ~= "LowGravModifier") { iLowGravModifier = int(VarValue); if (iLowGravModifier < -1000) { iLowGravModifier = -1000; } else if (iLowGravModifier > -1) { iLowGravModifier = -1; } } else if (VarName ~= "FriendlyFireScale") { if (Level.Game.IsA('TeamGamePlus')) { floatVal = float(VarValue); if (floatVal < 0.0) { floatVal = 0.0; } TeamGamePlus(Level.Game).FriendlyFireScale = floatVal; } } else if (VarName ~= "ForceRedeemer") { bForceRedeemer = bool(VarValue); } } function ProcessPostMapVar(string VarName, string VarValue) { local int intVal; local float floatVal; if (DebugMode) { Log("Boden.MapConfig: Mode: Post, Setting [" $ VarName $ "] to [" $ VarValue $ "]"); } } function ProcessModMapVar(string VarName, string VarValue, Pawn ThePlayer) { local int intVal; local float floatVal; if (DebugMode) { Log("Boden.MapConfig: Mode: Mod, Setting [" $ VarName $ "] to [" $ VarValue $ "]"); } if (VarName ~= "Difficulty") { // valid Difficulty values: // "Novice" // "Average" // "Experienced" // "Skilled" // "Adept" // "Masterful" // "Inhuman" // "Godlike" if (Level.Game.IsA('DeathMatchPlus')) { // search for this human-readable difficulty name in the list of skill names... for (intVal = 0; intVal < 8; intVal++) { if (DeathMatchPlus(Level.Game).BotConfig.Skills[intVal] ~= VarValue) { if (DebugMode) { Log("Boden.MapConfig: Difficulty [" $ VarValue $ "] translated to [" $ string(intVal) $ "]"); } break; } } if (intVal >= 8) { if (DebugMode) { Log("Boden.MapConfig: Difficulty [" $ VarValue $ "] could not be translated, so setting to 2"); } intVal = 2; } DeathMatchPlus(Level.Game).BotConfig.Difficulty = intVal; if (ThePlayer.IsA('Bot')) { if (DebugMode) { Log("Boden.MapConfig: Setting Bot [" $ ThePlayer.PlayerReplicationInfo.PlayerName $ "] skill"); } intVal = getIndexOfPlayer(DeathMatchPlus(Level.Game).BotConfig.BotNames, ThePlayer.PlayerReplicationInfo.PlayerName); if (intVal >= 0) { Bot(ThePlayer).InitializeSkill(DeathMatchPlus(Level.Game).BotConfig.Difficulty + DeathMatchPlus(Level.Game).BotConfig.BotSkills[intVal]); } } } } } function int getIndexOfPlayer(string PlayerNames[32], string PlayerName) { local int i; for (i = 0; i < 32; i++) { if (PlayerNames[i] == PlayerName) { if (DebugMode) { Log("Boden.MapConfig: Found Player [" $ PlayerName $ "] at index " $ string(i)); } return(i); } } return(-1); } function vector getLowGravVector() { local vector gravVect; gravVect.X = 0; gravVect.Y = 0; gravVect.Z = iLowGravModifier; return(gravVect); } function bool CheckReplacement(Actor Other, out byte bSuperRelevant) { if (bLowGrav) { if (Level.Game.IsA('DeathMatchPlus')) { if (DeathMatchPlus(Level.Game).bJumpMatch && Other.IsA('UT_JumpBoots')) { return(false); } } if (Other.IsA('ZoneInfo')) { ZoneInfo(Other).ZoneGravity = getLowGravVector(); } bSuperRelevant = 0; } return(true); } function bool ReplaceWith(actor Other, string aClassName) { if (bForceRedeemer && Other.IsA('WarHeadLauncher') && aClassName != "Botpack.WarHeadLauncher") { return(false); } return(Super.ReplaceWith(Other, aClassName)); } Q%ŕUăGameSpeedbMaxSpectatorscMaxPlayersdMinPlayerseFragLimitfGoalTeamScoregTimeLimithUseTranslocatoriJumpMatchjLowGravkLowGravModifierlFriendlyFireScalemDifficultynForceRedeemero ŽX}f˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙IZ-uý#Ž=$:e‰œÔX…Ž”’ŠŮŤ…Ž”-¤%n‰œÔX‰œÔXˇ1ÚČ…Ž”’ŠŮŤ…Ž”-¤%n™R쇅Ž”-¤%n™R쇄žtČ„žtČˆ{#Uż…Ž”-¤%n™R쇄žtČˆ{#UżĘýúL]…Ž”-¤%n™R쇅Ž”-¤%n™R쇅Ž”’ŠŮŤ…Ž”’ŠŮŤ…Ž”’ŠŮŤ…Ž”’ŠŮŤ…Ž”-¤%n…Ž”’ŠŮŤ…Ž”-¤%n…Ž”’ŠŮŤ…Ž”Ś}"›#…Ž”’ŠŮŤ…Ž”-¤%n…Ž”’ŠŮŤ…Ž”-¤%n…Ž”’ŠŮŤ…Ž”-¤%n…Ž”’ŠŮŤ…Ž”Ś}"›#…Ž”…Ž”…Ž”…Ž”…Ž”…Ž”– M]{yLavaGiant;GameSpeed:1.25;MaxSpectators:2;FragLimit:30;GoalTeamScore:10;UseTranslocator:true;JumpMatch:false;LowGrav:trueJ]1.10K]0L-14N]8[-30e-10g-30o]truet]falsev]falsew]-200x]0}] Experienced~]falseVÖ// // KeepItClean Unreal Tournament Mutator // Version: 1.4 // Author: Boden Maddox // UT Version Coded/Tested: 4.36 // class KeepItClean expands Mutator config(Boden); struct InfractionRecord // player Infraction records { var bool bInitialized; // Initialized var int PID; var string PlayerName; var bool bLastToSentSet; var string LastToSent; var bool bLastToReceivedSet; var string LastToReceived; var string LastMessageSent; var bool bTextChanged; var int LastMessageSentTime; var int CensorTime; var int InfractionCount; var string IP; }; var InfractionRecord InfractionRecords[256]; //keep record of max 256 Players var int LastCurrentTime; var int NextNameTime; var bool Initialized; var config bool ChangeName; var config bool ChangeTalk; var config bool KickPlayerForName; var config bool KickPlayerForTalk; var config bool AllowSpectatorsToSendPrivateMessage; var config string NameMessage; var config string TalkMessage; var config bool LogAllMessages; var config string LogPrefix; var config int MaxInfractions; var config int MaxIPInfractions; var config int CensorTime; var config bool StrictTextParsing; var config bool ReplaceMidWord; var config string CheckedWords[100]; var config string ChatDenyIP[100]; var config string ChatAdminIP[20]; var string Replacements[100]; var string Checks[100]; function PreBeginPlay() { local int i; InitializeWords(); for (i = 0; i < 256; i++) { InfractionRecords[ i ].bInitialized = false; } } function InitializeWords() { local int i; local int pos; // initialize the checked words list by: // 1. Parsing the CheckedWords[] entry to look for any replacement (no replacement=strip word) // 2. Caps() the search word (to speed up searches later) for ( i = 0; i < 100; i++ ) { if (Len( CheckedWords[ i ] ) > 0 ) { pos = InStr(CheckedWords[i], ":"); if (pos >= 0) // replacement found, so pull it out { Checks[i] = Caps(Left(CheckedWords[i], pos)); Replacements[i] = Mid(CheckedWords[i], pos + 1); } else { Checks[i] = Caps(CheckedWords[i]); Replacements[i] = ""; } } else { Checks[i] = ""; Replacements[i] = ""; } } } function PostBeginPlay() { if (!Initialized) { Initialized = true; Level.Game.RegisterMessageMutator(Self); // register ourselves as a message mutator settimer(1.0, true); // call us every 7 seconds... NextNameTime = Level.TimeSeconds; } } function Timer() { local int i; local int Seconds; local int CurrentTime; CurrentTime = Level.TimeSeconds; if ( CurrentTime >= NextNameTime ) { NextNameTime = CurrentTime + 7; FindNewPlayers(); } if ( CurrentTime > LastCurrentTime ) { Seconds = CurrentTime - LastCurrentTime; LastCurrentTime = CurrentTime; for (i = 0; i < 256; i++) { if ( InfractionRecords[ i ].bInitialized ) { if ( InfractionRecords[ i ].CensorTime > 0 ) { InfractionRecords[ i ].CensorTime -= Seconds; if ( InfractionRecords[ i ].CensorTime < 0 ) InfractionRecords[ i ].CensorTime = 0; } } } } } function FindNewPlayers() { local int i , iInfractionRecord , iColon ; local string outName , PawnIP , IP ; local Pawn pPawn ; for (pPawn = Level.PawnList; pPawn != None; pPawn = pPawn.NextPawn) { if (!pPawn.IsA('PlayerPawn')) { continue; } if (FastCleanUpText(pPawn.PlayerReplicationInfo.PlayerName, outName)) // name was bad? { if (KickPlayerForName) { KickThePlayer(PlayerPawn(pPawn), NameMessage); } else { if (Len(NameMessage) > 0) { pPawn.ClientMessage(NameMessage, 'Event', true); } if (ChangeName) { Log("Player name changed from '" $ pPawn.PlayerReplicationInfo.PlayerName $ "' to '" $ outName $ "'"); pPawn.PlayerReplicationInfo.PlayerName = outName; } } } // Make sure the pawn has an infraction record if ( ( ( pPawn.bIsPlayer ) || ( pPawn.IsA('MessagingSpectator') ) ) && (PlayerPawn(pPawn)==None || NetConnection(PlayerPawn(pPawn).Player)!=None ) ) { IP = PlayerPawn(pPawn).GetPlayerNetworkAddress(); iColon = InStr( IP, ":" ); PawnIP = Left( IP, iColon ); } iInfractionRecord = GetInfractionIndex( pPawn.PlayerReplicationInfo, PawnIP ); if ( iInfractionRecord < 0 ) iInfractionRecord = CreateInfractionRecord( pPawn.PlayerReplicationInfo, PawnIP ); } } function Mutate(string MutateString, PlayerPawn Sender) { local int i , i2 , iInfractionRecord , iColon ; local bool bAdmin , bSpectator , bKICAdmin ; local string CommandString , IPString , ParameterString , SenderIP , PlayerList ; if ( NextMutator != None ) NextMutator.Mutate(MutateString, Sender); bAdmin = Sender.PlayerReplicationInfo.bAdmin; bSpectator = Sender.IsA('Spectator'); bKICAdmin = false; if ( ( ( Sender.bIsPlayer ) || ( Sender.IsA('MessagingSpectator') ) ) && ( NetConnection(Sender.Player)!=None ) ) { IPString = Sender.GetPlayerNetworkAddress(); iColon = InStr( IPString, ":" ); SenderIP = Left( IPString, iColon ); bKICAdmin = CheckChatAdminIP( SenderIP ); } else bKICAdmin = true; // No net connection - assume this person has privs //if ( ! bAdmin ) // return; // Only allow spectators access to the commands if ( ( Caps(MutateString) == "KEEPITCLEAN" ) || ( Caps(MutateString) == "KIC" ) ) { Sender.ClientMessage("KeepItClean Usage: Start a SAY or TeamSay command with the following:"); Sender.ClientMessage(" 'TO :' to send a private message to a specific player."); Sender.ClientMessage(" '&' to send another private message to the last player you sent a private message too."); Sender.ClientMessage(" '<' to send a reply to a player that sent a private message."); Sender.ClientMessage(" *Note: Use an * to terminate the name to send a private message to a group of people in the same clan."); Sender.ClientMessage(" i.e. 'Say To [CTCR]*: Hello CTCR!' would send 'Hello CTCR!' to all players with [CTCR] prefixes."); Sender.ClientMessage("KeepItClean Commands:"); Sender.ClientMessage(" Mutate KIC - This command list"); Sender.ClientMessage(" Mutate KIC ListPlayers - Lists all players that have played in this level."); Sender.ClientMessage(" Mutate KIC ListWords - Lists the Banned Words"); Sender.ClientMessage(" Mutate KIC AddWord [Word:Replacement] - Add a new word to ban"); Sender.ClientMessage(" Mutate KIC RemoveWord [Word:Replacement] - Remove an existing Word from the banned list"); Sender.ClientMessage(" Mutate KIC ListBans - Lists the current Chat Banned IPs"); Sender.ClientMessage(" Mutate KIC AddBan | - Add a new Chat Banned IP by Player Name or IP"); Sender.ClientMessage(" Mutate KIC RemoveBan | - Remove an existing Chat Banned IP by Player Name or IP"); Sender.ClientMessage(" Mutate KIC ListAdmins - Lists the current Chat Admin IPs"); Sender.ClientMessage(" Mutate KIC AddAdmin | - Add a new Chat Admin IP by Player Name or IP"); Sender.ClientMessage(" Mutate KIC RemoveAdmin | - Remove an existing Chat Admin IP by Player Name or IP"); Sender.ClientMessage(" Mutate KIC ListParameters - List parameter names and values"); Sender.ClientMessage(" Mutate KIC - Lists or sets a parameter value"); Sender.ClientMessage(" *Note: KIC can be replaced, in all commands with KeepItClean"); } else if ( ( Left(Caps(MutateString),12) == "KEEPITCLEAN " ) || ( Left(Caps(MutateString),4) == "KIC " ) ) { if ( Left(Caps(MutateString),12) == "KEEPITCLEAN " ) CommandString = Mid(MutateString,12); else CommandString = Mid(MutateString,4); if ( Left(Caps(CommandString),8) == "ADDWORD " ) { if ( ( bAdmin ) || ( bKICAdmin ) ) { ParameterString = Mid(CommandString,8); for ( i = 0; ( ( i < 100 ) && ( Len( CheckedWords[ i ] ) > 0 ) ); i++ ); if ( i < 100 ) { Sender.ClientMessage("Adding "@ParameterString@"to the list of banned words."); CheckedWords[ i ] = ParameterString; default.CheckedWords[ i ] = ParameterString; SaveConfig(); InitializeWords(); } CommandString = "LISTWORDS"; } else Sender.ClientMessage("This command is restricted to Chat Admins."); } else if ( Left(Caps(CommandString),11) == "REMOVEWORD " ) { if ( ( bAdmin ) || ( bKICAdmin ) ) { ParameterString = Mid(CommandString,11); for ( i = 0; ( ( i < 100 ) && ( Len( CheckedWords[ i ] ) > 0 ) && ( CheckedWords[ i ] != ParameterString ) ); i++ ); if ( Caps(CheckedWords[ i ]) == Caps(ParameterString) ) { Sender.ClientMessage("Removing"@ParameterString@"from the list of banned words"); for ( i = i; ( ( i < 99 ) && ( Len( CheckedWords[ i + 1 ] ) > 0 ) ); i++ ) { CheckedWords[ i ] = CheckedWords[ i + 1 ]; default.CheckedWords[ i ] = CheckedWords[ i + 1 ]; } CheckedWords[ i ] = ""; default.CheckedWords[ i ] = ""; SaveConfig(); InitializeWords(); } else Sender.ClientMessage("Banned Wwrd"@ParameterString@"not found."); CommandString = "LISTWORDS"; } else Sender.ClientMessage("This command is restricted to Chat Admins."); } else if ( Left(Caps(CommandString),7) == "ADDBAN " ) { if ( ( bAdmin ) || ( bKICAdmin ) ) { ParameterString = Mid(CommandString,7); iInfractionRecord = GetInfractionIndexByName( ParameterString ); IPString = ""; if ( iInfractionRecord >= 0 ) IPString = InfractionRecords[ iInfractionRecord ].IP; else { i = Int( ParameterString ); if ( i > 0 ) IPString = ParameterString; } if ( IPString == "" ) Sender.ClientMessage( "Player"@ParameterString@"not found (or has no IP listed)." ); else { for ( i = 0; ( ( i < 100 ) && ( Len( ChatDenyIP[ i ] ) > 0 ) ); i++ ); if ( i < 100 ) { Sender.ClientMessage("Chat Banning IP"@IPString); ChatDenyIP[ i ] = IPString; default.ChatDenyIP[ i ] = IPString; SaveConfig(); } CommandString = "LISTBANS"; } } else Sender.ClientMessage("This command is restricted to Chat Admins."); } else if ( Left(Caps(CommandString),10) == "REMOVEBAN " ) { if ( ( bAdmin ) || ( bKICAdmin ) ) { ParameterString = Mid(CommandString,10); iInfractionRecord = GetInfractionIndexByName( ParameterString ); if ( iInfractionRecord >= 0 ) IPString = InfractionRecords[ iInfractionRecord ].IP; else { i = Int( ParameterString ); if ( i > 0 ) IPString = ParameterString; } if ( IPString == "" ) Sender.ClientMessage( "Player"@ParameterString@"not found (or has no IP listed)." ); else { for ( i = 0; ( ( i < 100 ) && ( Len( ChatDenyIP[ i ] ) > 0 ) && ( ChatDenyIP[ i ] != IPString ) ); i++ ); if ( ChatDenyIP[ i ] ~= IPString ) { Sender.ClientMessage("Removing Chat Ban for IP"@IPString); for ( i = i; ( ( i < 99 ) && ( Len( ChatDenyIP[ i + 1 ] ) > 0 ) ); i++ ) { ChatDenyIP[ i ] = ChatDenyIP[ i + 1 ]; default.ChatDenyIP[ i ] = ChatDenyIP[ i + 1 ]; } ChatDenyIP[ i ] = ""; default.ChatDenyIP[ i ] = ""; SaveConfig(); } CommandString = "LISTBANS"; } } else Sender.ClientMessage("This command is restricted to Chat Admins."); } else if ( Left(Caps(CommandString),9) == "ADDADMIN " ) { if ( bAdmin ) { ParameterString = Mid(CommandString,9); iInfractionRecord = GetInfractionIndexByName( ParameterString ); if ( iInfractionRecord >= 0 ) IPString = InfractionRecords[ iInfractionRecord ].IP; else { i = Int( ParameterString ); if ( i > 0 ) IPString = ParameterString; } if ( IPString == "" ) Sender.ClientMessage( "Player"@ParameterString@"not found not found (or has no IP listed)." ); else { for ( i = 0; ( ( i < 20 ) && ( Len( ChatAdminIP[ i ] ) > 0 ) ); i++ ); if ( i < 20 ) { Sender.ClientMessage("Adding Chat Admin IP"@IPString); ChatAdminIP[ i ] = IPString; default.ChatAdminIP[ i ] = IPString; SaveConfig(); } CommandString = "LISTADMINS"; } } else Sender.ClientMessage("This command is restricted to Server Admins."); } else if ( ( Left(Caps(CommandString),12) == "REMOVEADMIN " ) ) { if ( bAdmin ) { ParameterString = Mid(CommandString,12); iInfractionRecord = GetInfractionIndexByName( ParameterString ); if ( iInfractionRecord >= 0 ) IPString = InfractionRecords[ iInfractionRecord ].IP; else { i = Int( ParameterString ); if ( i > 0 ) IPString = ParameterString; } if ( IPString == "" ) Sender.ClientMessage( "Player"@ParameterString@"not found (or has no IP listed)." ); else { for ( i = 0; ( ( i < 20 ) && ( Len( ChatAdminIP[ i ] ) > 0 ) && ( ChatAdminIP[ i ] != IPString ) ); i++ ); if ( ChatAdminIP[ i ] ~= IPString ) { Sender.ClientMessage("Removing Chat Admin IP"@IPString); for ( i = i; ( ( i < 99 ) && ( Len( ChatAdminIP[ i + 1 ] ) > 0 ) ); i++ ) { ChatAdminIP[ i ] = ChatAdminIP[ i + 1 ]; default.ChatAdminIP[ i ] = ChatAdminIP[ i + 1 ]; } ChatAdminIP[ i ] = ""; default.ChatAdminIP[ i ] = ""; SaveConfig(); } CommandString = "LISTADMINS"; } } else Sender.ClientMessage("This command is restricted to Server Admins."); } //var config bool StrictTextParsing; else if ( Left(Caps(CommandString),18) == "STRICTTEXTPARSING " ) { if ( ( bAdmin ) || ( bKICAdmin ) ) { ParameterString = Mid(CommandString,18); if ( Left( ParameterString, 1 ) == "?" ) { if ( StrictTextParsing ) Sender.ClientMessage("StrictTextParsing is ON!"); else Sender.ClientMessage("StrictTextParsing is OFF!"); } else if ( Caps( Left( ParameterString, 1 ) ) == "O" ) { if ( Caps( Left( ParameterString, 2 ) ) == "ON" ) { StrictTextParsing = TRUE; Log("KIC: StrictTextParsing is now ACTIVE!"); Sender.ClientMessage("StrictTextParsing is now ACTIVE!"); } else { StrictTextParsing = FALSE; Log("KIC: StrictTextParsing is now IN-ACTIVE!"); Sender.ClientMessage("StrictTextParsing is now IN-ACTIVE!"); } SaveConfig(); } } else Sender.ClientMessage("This command is restricted to Chat Admins."); } //var config bool ReplaceMidWord; else if ( Left(Caps(CommandString),15) == "REPLACEMIDWORD " ) { if ( ( bAdmin ) || ( bKICAdmin ) ) { ParameterString = Mid(CommandString,15); if ( Left( ParameterString, 1 ) == "?" ) { if ( ReplaceMidWord ) Sender.ClientMessage("ReplaceMidWord is ON!"); else Sender.ClientMessage("ReplaceMidWord is OFF!"); } else if ( Caps( Left( ParameterString, 1 ) ) == "O" ) { if ( Caps( Left( ParameterString, 2 ) ) == "ON" ) { ReplaceMidWord = TRUE; Log("KIC: ReplaceMidWord is now ACTIVE!"); Sender.ClientMessage("ReplaceMidWord is now ACTIVE!"); } else { ReplaceMidWord = FALSE; Log("KIC: ReplaceMidWord is now IN-ACTIVE!"); Sender.ClientMessage("ReplaceMidWord is now IN-ACTIVE!"); } SaveConfig(); } } else Sender.ClientMessage("This command is restricted to Chat Admins."); } //var config bool ChangeName; else if ( Left(Caps(CommandString),11) == "CHANGENAME " ) { if ( ( bAdmin ) || ( bKICAdmin ) ) { ParameterString = Mid(CommandString,11); if ( Left( ParameterString, 1 ) == "?" ) { if ( ChangeName ) Sender.ClientMessage("ChangeName is ON!"); else Sender.ClientMessage("ChangeName is OFF!"); } else if ( Caps( Left( ParameterString, 1 ) ) == "O" ) { if ( Caps( Left( ParameterString, 2 ) ) == "ON" ) { ChangeName = TRUE; Log("KIC: ChangeName is now ACTIVE!"); Sender.ClientMessage("ChangeName is now ACTIVE!"); } else { ChangeName = FALSE; Log("KIC: ChangeName is now IN-ACTIVE!"); Sender.ClientMessage("ChangeName is now IN-ACTIVE!"); } SaveConfig(); } } else Sender.ClientMessage("This command is restricted to Chat Admins."); } //var config bool ChangeTalk; else if ( Left(Caps(CommandString),11) == "CHANGETALK " ) { if ( ( bAdmin ) || ( bKICAdmin ) ) { ParameterString = Mid(CommandString,11); if ( Left( ParameterString, 1 ) == "?" ) { if ( ChangeTalk ) Sender.ClientMessage("ChangeTalk is ON!"); else Sender.ClientMessage("ChangeTalk is OFF!"); } else if ( Caps( Left( ParameterString, 1 ) ) == "O" ) { if ( Caps( Left( ParameterString, 2 ) ) == "ON" ) { ChangeTalk = TRUE; Log("KIC: ChangeTalk is now ACTIVE!"); Sender.ClientMessage("ChangeTalk is now ACTIVE!"); } else { ChangeTalk = FALSE; Log("KIC: ChangeTalk is now IN-ACTIVE!"); Sender.ClientMessage("ChangeTalk is now IN-ACTIVE!"); } SaveConfig(); } } else Sender.ClientMessage("This command is restricted to Chat Admins."); } //var config bool KickPlayerForName; else if ( Left(Caps(CommandString),18) == "KICKPLAYERFORNAME " ) { if ( ( bAdmin ) || ( bKICAdmin ) ) { ParameterString = Mid(CommandString,18); if ( Left( ParameterString, 1 ) == "?" ) { if ( KickPlayerForName ) Sender.ClientMessage("KickPlayerForName is ON!"); else Sender.ClientMessage("KickPlayerForName is OFF!"); } else if ( Caps( Left( ParameterString, 1 ) ) == "O" ) { if ( Caps( Left( ParameterString, 2 ) ) == "ON" ) { KickPlayerForName = TRUE; Log("KIC: KickPlayerForName is now ACTIVE!"); Sender.ClientMessage("KickPlayerForName is now ACTIVE!"); } else { KickPlayerForName = FALSE; Log("KIC: KickPlayerForName is now IN-ACTIVE!"); Sender.ClientMessage("KickPlayerForName is now IN-ACTIVE!"); } SaveConfig(); } } else Sender.ClientMessage("This command is restricted to Chat Admins."); } //var config bool KickPlayerForTalk; else if ( Left(Caps(CommandString),18) == "KICKPLAYERFORTALK " ) { if ( ( bAdmin ) || ( bKICAdmin ) ) { ParameterString = Mid(CommandString,18); if ( Left( ParameterString, 1 ) == "?" ) { if ( KickPlayerForTalk ) Sender.ClientMessage("KickPlayerForTalk is ON!"); else Sender.ClientMessage("KickPlayerForTalk is OFF!"); } else if ( Caps( Left( ParameterString, 1 ) ) == "O" ) { if ( Caps( Left( ParameterString, 2 ) ) == "ON" ) { KickPlayerForTalk = TRUE; Log("KIC: KickPlayerForTalk is now ACTIVE!"); Sender.ClientMessage("KickPlayerForTalk is now ACTIVE!"); } else { KickPlayerForTalk = FALSE; Log("KIC: KickPlayerForTalk is now IN-ACTIVE!"); Sender.ClientMessage("KickPlayerForTalk is now IN-ACTIVE!"); } SaveConfig(); } } else Sender.ClientMessage("This command is restricted to Chat Admins."); } //var config bool AllowSpectatorsToSendPrivateMessage; else if ( Left(Caps(CommandString),36) == "ALLOWSPECTATORSTOSENDPRIVATEMESSAGE " ) { if ( ( bAdmin ) || ( bKICAdmin ) ) { ParameterString = Mid(CommandString,36); if ( Left( ParameterString, 1 ) == "?" ) { if ( AllowSpectatorsToSendPrivateMessage ) Sender.ClientMessage("AllowSpectatorsToSendPrivateMessage is ON!"); else Sender.ClientMessage("AllowSpectatorsToSendPrivateMessage is OFF!"); } else if ( Caps( Left( ParameterString, 1 ) ) == "O" ) { if ( Caps( Left( ParameterString, 2 ) ) == "ON" ) { AllowSpectatorsToSendPrivateMessage = TRUE; Log("KIC: AllowSpectatorsToSendPrivateMessage is now ACTIVE!"); Sender.ClientMessage("AllowSpectatorsToSendPrivateMessage is now ACTIVE!"); } else { AllowSpectatorsToSendPrivateMessage = FALSE; Log("KIC: AllowSpectatorsToSendPrivateMessage is now IN-ACTIVE!"); Sender.ClientMessage("AllowSpectatorsToSendPrivateMessage is now IN-ACTIVE!"); } SaveConfig(); } } else Sender.ClientMessage("This command is restricted to Chat Admins."); } //var config bool LogAllMessages; else if ( Left(Caps(CommandString),11) == "LOGALLMESSAGES " ) { if ( bAdmin ) { ParameterString = Mid(CommandString,11); if ( Left( ParameterString, 1 ) == "?" ) { if ( LogAllMessages ) Sender.ClientMessage("LogAllMessages is ON!"); else Sender.ClientMessage("LogAllMessages is OFF!"); } else if ( Caps( Left( ParameterString, 1 ) ) == "O" ) { if ( Caps( Left( ParameterString, 2 ) ) == "ON" ) { LogAllMessages = TRUE; Log("KIC: LogAllMessages is now ACTIVE!"); Sender.ClientMessage("LogAllMessages is now ACTIVE!"); } else { LogAllMessages = FALSE; Log("KIC: LogAllMessages is now IN-ACTIVE!"); Sender.ClientMessage("LogAllMessages is now IN-ACTIVE!"); } SaveConfig(); } } else Sender.ClientMessage("This command is restricted to Server Admins."); } //var config int MaxInfractions; else if ( Left(Caps(CommandString),15) == "MAXINFRACTIONS " ) { if ( ( bAdmin ) || ( bKICAdmin ) ) { ParameterString = Mid(CommandString,15); if ( Left( ParameterString, 1 ) == "?" ) { Sender.ClientMessage("MaxInfractions is"@MaxInfractions); } else { MaxInfractions = int(ParameterString); Log("KIC: MaxInfractions is now"@MaxInfractions); Sender.ClientMessage("MaxInfractions is now"@MaxInfractions); SaveConfig(); } } else Sender.ClientMessage("This command is restricted to Chat Admins."); } //var config int MaxIPInfractions; else if ( Left(Caps(CommandString),17) == "MAXIPINFRACTIONS " ) { if ( ( bAdmin ) || ( bKICAdmin ) ) { ParameterString = Mid(CommandString,17); if ( Left( ParameterString, 1 ) == "?" ) { Sender.ClientMessage("MaxIPInfractions is"@MaxIPInfractions); } else { MaxIPInfractions = int(ParameterString); Log("KIC: MaxIPInfractions is now"@MaxIPInfractions); Sender.ClientMessage("MaxIPInfractions is now"@MaxIPInfractions); SaveConfig(); } } else Sender.ClientMessage("This command is restricted to Chat Admins."); } //var config int CensorTime; else if ( Left(Caps(CommandString),17) == "MAXIPINFRACTIONS " ) { if ( ( bAdmin ) || ( bKICAdmin ) ) { ParameterString = Mid(CommandString,17); if ( Left( ParameterString, 1 ) == "?" ) { Sender.ClientMessage("CensorTime is"@CensorTime@"seconds."); } else { MaxIPInfractions = int(ParameterString); Log("KIC: CensorTime is now"@CensorTime@"seconds."); Sender.ClientMessage("CensorTime is now"@CensorTime@"seconds."); SaveConfig(); } } else Sender.ClientMessage("This command is restricted to Chat Admins."); } //var config string NameMessage; else if ( ( Left(Caps(CommandString),12) == "NAMEMESSAGE " ) ) { if ( bAdmin ) { ParameterString = Mid(CommandString,12); if ( Left( ParameterString, 1 ) == "?" ) { Sender.ClientMessage("NameMessage is"@NameMessage); } else { NameMessage = ParameterString; Log("KIC: NameMessage is now"@NameMessage); Sender.ClientMessage("NameMessage is now"@NameMessage); SaveConfig(); } } else Sender.ClientMessage("This command is restricted to Server Admins."); } //var config string TalkMessage; else if ( ( Left(Caps(CommandString),12) == "TALKMESSAGE " ) ) { if ( bAdmin ) { ParameterString = Mid(CommandString,12); if ( Left( ParameterString, 1 ) == "?" ) { Sender.ClientMessage("TalkMessage is"@TalkMessage); } else { TalkMessage = ParameterString; Log("KIC: TalkMessage is now"@TalkMessage); Sender.ClientMessage("TalkMessage is now"@TalkMessage); SaveConfig(); } } else Sender.ClientMessage("This command is restricted to Server Admins."); } //var config string LogPrefix; else if ( ( Left(Caps(CommandString),10) == "LOGPREFIX " ) ) { if ( bAdmin ) { ParameterString = Mid(CommandString,10); if ( Left( ParameterString, 1 ) == "?" ) { Sender.ClientMessage("LogPrefix is"@LogPrefix); } else { Log("KIC: LogPrefix is now"@ParameterString); LogPrefix = ParameterString; Sender.ClientMessage("LogPrefix is now"@LogPrefix); SaveConfig(); } } else Sender.ClientMessage("This command is restricted to Server Admins."); } else if (Left(Caps(CommandString),5) == "TEST " ) { if ( bAdmin ) { ParameterString = Mid(CommandString,5); Test( Sender, ParameterString ); } else Sender.ClientMessage("This command is restricted to Server Admins."); } if ( Left(Caps(CommandString),14) == "LISTPARAMETERS" ) { if ( StrictTextParsing ) Sender.ClientMessage("StrictTextParsing is ON!"); else Sender.ClientMessage("StrictTextParsing is OFF!"); if ( ReplaceMidWord ) Sender.ClientMessage("ReplaceMidWord is ON!"); else Sender.ClientMessage("ReplaceMidWord is OFF!"); if ( ChangeName ) Sender.ClientMessage("ChangeName is ON!"); else Sender.ClientMessage("ChangeName is OFF!"); if ( ChangeTalk ) Sender.ClientMessage("ChangeTalk is ON!"); else Sender.ClientMessage("ChangeTalk is OFF!"); if ( KickPlayerForName ) Sender.ClientMessage("KickPlayerForName is ON!"); else Sender.ClientMessage("KickPlayerForName is OFF!"); if ( KickPlayerForTalk ) Sender.ClientMessage("KickPlayerForTalk is ON!"); else Sender.ClientMessage("KickPlayerForTalk is OFF!"); if ( AllowSpectatorsToSendPrivateMessage ) Sender.ClientMessage("AllowSpectatorsToSendPrivateMessage is ON!"); else Sender.ClientMessage("AllowSpectatorsToSendPrivateMessage is OFF!"); if ( LogAllMessages ) Sender.ClientMessage("LogAllMessages is ON!"); else Sender.ClientMessage("LogAllMessages is OFF!"); Sender.ClientMessage("MaxInfractions is"@MaxInfractions); Sender.ClientMessage("MaxIPInfractions is"@MaxIPInfractions); Sender.ClientMessage("CensorTime is"@CensorTime@"seconds."); Sender.ClientMessage("NameMessage is"@NameMessage); Sender.ClientMessage("TalkMessage is"@TalkMessage); Sender.ClientMessage("LogPrefix is"@LogPrefix); } if ( Left(Caps(CommandString),9) == "LISTWORDS" ) { Sender.ClientMessage("Current Banned Words:"); for ( i = 0; ( ( i < 100 ) && ( Len( CheckedWords[ i ] ) > 0 ) ); i++ ) { Sender.ClientMessage(CheckedWords[ i ]); } } if ( Left(Caps(CommandString),11) == "LISTPLAYERS" ) { FindNewPlayers(); Sender.ClientMessage("Players:"); for (i = 0; i < 256; i++) { if ( InfractionRecords[ i ].bInitialized ) { PlayerList = ""; if ( ( bAdmin ) || ( bKICAdmin ) ) PlayerList = InfractionRecords[ i ].IP@""; PlayerList = PlayerList$InfractionRecords[ i ].PlayerName@"Offenses="$InfractionRecords[ i ].InfractionCount@"CensorTime="$InfractionRecords[ i ].CensorTime; Sender.ClientMessage(PlayerList); } } } if ( Left(Caps(CommandString),8) == "LISTBANS" ) { if ( ( bAdmin ) || ( bKICAdmin ) ) { Sender.ClientMessage("Current Chat Bans:"); for ( i = 0; ( ( i < 100 ) && ( Len( ChatDenyIP[ i ] ) > 0 ) ); i++ ) { Sender.ClientMessage(ChatDenyIP[ i ]); i2 = 1; While ( i2 > 0 ) { iInfractionRecord = GetInfractionIndexByIP( ChatDenyIP[ i ], i2 ); if ( iInfractionRecord >= 0 ) { Sender.ClientMessage(" "$InfractionRecords[ iInfractionRecord ].PlayerName@InfractionRecords[ iInfractionRecord ].IP); i2++; } else i2 = 0; } } } else Sender.ClientMessage("This command is restricted to Chat Admins."); } if ( Left(Caps(CommandString),10) == "LISTADMINS" ) { if ( bAdmin ) { Sender.ClientMessage("Current Chat Admins:"); for ( i = 0; ( ( i < 20 ) && ( Len( ChatAdminIP[ i ] ) > 0 ) ); i++ ) { Sender.ClientMessage(ChatAdminIP[ i ]); i2 = 1; While ( i2 > 0 ) { iInfractionRecord = GetInfractionIndexByIP( ChatAdminIP[ i ], i2 ); if ( iInfractionRecord >= 0 ) { if ( ( bAdmin ) || ( bKICAdmin ) ) Sender.ClientMessage(" "$InfractionRecords[ iInfractionRecord ].PlayerName@InfractionRecords[ iInfractionRecord ].IP); else Sender.ClientMessage(" "$InfractionRecords[ iInfractionRecord ].PlayerName); i2++; } else i2 = 0; } } } else Sender.ClientMessage("This command is restricted to Server Admins."); } } } function Test( PlayerPawn Sender, string RootString ) { local int iRSLen; local int iCheck; local int iInsertionPoint; local string CheckString; local string CheckedString; local string LogText; iRSLen = Len( RootString ); for ( iCheck = 0; ( ( iCheck < 100 ) && ( Len( Checks[ iCheck ] ) > 0 ) ); iCheck++ ) { LogText = "Checking"@Checks[iCheck]$":"$Replacements[iCheck]; Log( LogText ); Sender.ClientMessage(LogText); for( iInsertionPoint = 0; iInsertionPoint <= iRSLen; iInsertionPoint++ ) { CheckString = Left( RootString, iInsertionPoint ) $ Checks[ iCheck ] $ Right( RootString, iRSLen - iInsertionPoint ); StrictCleanUpText( Sender, CheckString, CheckedString ); Log( CheckedString ); Sender.ClientMessage(CheckedString); } } } function bool StrictCleanUpText(PlayerPawn Sender, string InText, out string OutText) { local string checkText; local string nameCaps; local int i; local int pos; local int aiCharacterOffset[ 1024 ]; local int iCheckedWordLen; local int iDestOffset; local int iSourceOffset; local string strSourceChr; local string strCheck; local int iCheckLen; local bool bDone; local int iLen; local string strCompressedSource; local int iStartPos; local int iFrontSeparatorCount; local int iCompressedSourceLen; checkText = InText; nameCaps = Caps(checkText); OutText = checkText; for ( i = 0; ( ( i < 100 ) && ( Len( Checks[ i ] ) > 0 ) ); i++ ) { iLen = Len( Checks[ i ] ); iDestOffset = 0; strCheck = ""; for( iSourceOffset = 0; iSourceOffset < iLen; iSourceOffset++ ) { strSourceChr = Mid( Checks[ i ], iSourceOffset, 1 ); if ( ( strSourceChr >= "A" ) && ( strSourceChr <= "Z" ) ) { strCheck = strCheck $ strSourceChr; iDestOffset++; } } iCheckLen = iDestOffset; // Log( "Checks[ i ] ="@Checks[ i ]$", strCheck ="@strCheck$", CheckLen ="@iCheckLen ); iStartPos = 0; bDone = false; while( ! bDone ) { iLen = Len( nameCaps ); iDestOffset = 0; strCompressedSource = ""; for( iSourceOffset = 0; ( ( iSourceOffset < iLen ) && ( iDestOffset < 1024 ) ); iSourceOffset++ ) { strSourceChr = Mid( nameCaps, iSourceOffset, 1 ); if ( ( strSourceChr >= "A" ) && ( strSourceChr <= "Z" ) ) { strCompressedSource = strCompressedSource $ strSourceChr; aiCharacterOffset[ iDestOffset++ ] = iSourceOffset; } } iCompressedSourceLen = iDestOffset; // Log( "OutText ="@OutText$", strCompressedSource ="@strCompressedSource$", iCompressedSouceLen ="@iCompressedSourceLen ); pos = InStr(Mid( strCompressedSource, iStartPos ), strCheck); if (pos >= 0) // found it... { iFrontSeparatorCount = 2; if ( pos > 0 ) iFrontSeparatorCount = aiCharacterOffset[ pos + iStartPos ] - aiCharacterOffset[ ( pos + iStartPos ) - 1]; if ( ( pos == 0 ) || ( iFrontSeparatorCount > 1 ) || ( ReplaceMidWord ) ) { // Word is at the start of the line - or after some sort of terminator if ( ( pos + iStartPos + iCheckLen ) < iCompressedSourceLen ) { OutText = Left( checkText, aiCharacterOffset[ pos + iStartPos ] ) $ Replacements[i] $ Mid(checkText, aiCharacterOffset[ pos + iStartPos + iCheckLen - 1 ] + 1 ); } else { if ( pos + iStartPos < iCompressedSourceLen ) { OutText = Left( checkText, aiCharacterOffset[ pos + iStartPos ] ) $ Replacements[i]; } else // If we are too big - then exit! { Log("KeepItClean WARNING: Possible recursive substitution error encountered while checking -"@Checks[ i ] $ ":" $ Replacements[i] ); Log("KeepItClean WARNING: While parsing:"@checkText ); Log("KeepItClean WARNING: Message deleted." ); OutText = "KeepItClean Warning: Possible recurrsive substitution error encountered - check the Server log file."; bDone = true; } } checkText = OutText; nameCaps = Caps(checkText); // to preserve our changes in case some other bad words have been formed... :-) } iStartPos = pos + 1; } else bDone = true; } } if (InText != OutText) { return(true); } return(false); } function bool FastCleanUpText(string InText, out string OutText) { local string checkText; local string nameCaps; local int i; local int pos; local int oldpos; local int oldlen; checkText = InText; nameCaps = Caps(checkText); OutText = checkText; for ( i = 0; ( ( i < 100 ) && ( Len( Checks[ i ] ) > 0 ) ); i++ ) { pos = InStr(nameCaps, Checks[i]); while (pos >= 0) // found it... { oldpos = pos; OutText = Left(checkText, pos) $ Replacements[i] $ Right(checkText, Len(checkText) - pos - Len(Checks[i])); checkText = OutText; nameCaps = Caps(checkText); // to preserve our changes in case some other bad words have been formed... :-) pos = InStr(Right(nameCaps, Len(nameCaps) - (oldpos + Len(Replacements[i]))), Checks[i]); if (pos >= 0) { pos = pos + oldpos + Len(Replacements[i]); } } } if (InText != OutText) { return(true); } return(false); } function PlayerPawn FindThePlayer(string PlayerName) { local Pawn aPawn; for (aPawn = Level.PawnList; aPawn != None; aPawn = aPawn.NextPawn ) { if ( ( ( aPawn.bIsPlayer ) || ( aPawn.IsA('MessagingSpectator') ) ) && aPawn.IsA('PlayerPawn') && aPawn.PlayerReplicationInfo.PlayerName~=PlayerName) { return(PlayerPawn(aPawn)); } } return(None); } function KickThePlayer(PlayerPawn Player, string Msg) { if (Player != None) { Log("Player '" $ Player.PlayerReplicationInfo.PlayerName $ "' kicked due to language"); if (Len(Msg) > 0) { Player.ClientMessage(Msg, 'Event', true); } if (NetConnection(Player.Player) != None) { Player.Destroy(); } } } function string GetCurrentDateTime() { local string timeStr; timeStr = string(Level.Year); timeStr = timeStr $ "/" $ Level.Month; timeStr = timeStr $ "/" $ Level.Day; timeStr = timeStr $ " " $ Level.Hour; if (Level.Minute < 10) timeStr = timeStr $ ":0" $ Level.Minute; else timeStr = timeStr $ ":" $ Level.Minute; return(timeStr); } function bool MutatorBroadcastMessage(Actor Sender, Pawn Receiver, out coerce string Msg, optional bool bBeep, out optional name Type) { if (LogAllMessages && string(Receiver.NextPawn) == "None") { Log(LogPrefix $ " " $ GetCurrentDateTime() $ " (BROADCAST): " $ Msg); } if (NextMessageMutator != None) { return(NextMessageMutator.MutatorBroadcastMessage(Sender, Receiver, Msg, bBeep, Type)); } return(true); } function int CreateInfractionRecord( PlayerReplicationInfo PRI, string IP ) { local bool bCreated; local bool bFoundPlayer; local int i; local int iInfractionRecord; local int iColon; local string IPOnly; iColon = InStr( IP, ":" ); if ( iColon > 0 ) IPOnly = Left( IP, iColon ); else IPOnly = IP; bFoundPlayer = false; bCreated = false; for (i = 0; ( ( i < 256 ) && ( ! bCreated ) ); i++) { if ( InfractionRecords[ i ].bInitialized ) { // Make sure we don't create a record that exists! if ( ( IPOnly == InfractionRecords[ i ].IP ) && ( ( PRI.PlayerID == InfractionRecords[ i ].PID ) || ( Caps(PRI.PlayerName) == Caps(InfractionRecords[ i ].PlayerName) ) ) ) { iInfractionRecord = i; bFoundPlayer = true; } } else // if ( ! InfractionRecords[ i ].bInitialized ) { iInfractionRecord = i; bCreated = true; InfractionRecords[ iInfractionRecord ].bInitialized = true; InfractionRecords[ iInfractionRecord ].PlayerName = PRI.PlayerName; InfractionRecords[ iInfractionRecord ].bLastToSentSet = false; InfractionRecords[ iInfractionRecord ].bLastToReceivedSet = false; InfractionRecords[ iInfractionRecord ].PID = PRI.PlayerID; InfractionRecords[ iInfractionRecord ].InfractionCount = 0; InfractionRecords[ iInfractionRecord ].LastMessageSentTime = 0; InfractionRecords[ iInfractionRecord ].bTextChanged = false; InfractionRecords[ iInfractionRecord ].CensorTime = 0; InfractionRecords[ iInfractionRecord ].IP = IPOnly; Log(LogPrefix @GetCurrentDateTime() @"(NewPlayer): Creating new Infraction Record" @iInfractionRecord @"for" @InfractionRecords[ iInfractionRecord ].PlayerName @InfractionRecords[ iInfractionRecord ].IP @InfractionRecords[ iInfractionRecord ].PID ); } } if ( ( bCreated ) || ( bFoundPlayer ) ) return( iInfractionRecord ); else return( -1 ); } function int GetInfractionIndex( PlayerReplicationInfo PRI, string IP ) { local bool bFoundPlayer; local int i; local int iInfractionRecord; local int iColon; local string IPOnly; iColon = InStr( IP, ":" ); if ( iColon > 0 ) IPOnly = Left( IP, iColon ); else IPOnly = IP; bFoundPlayer = false; for (i = 0; ( ( i < 256 ) && ( ! bFoundPlayer ) ); i++) { if ( InfractionRecords[ i ].bInitialized ) { if ( ( IPOnly == InfractionRecords[ i ].IP ) && ( ( PRI.PlayerID == InfractionRecords[ i ].PID ) || ( Caps(PRI.PlayerName) == Caps(InfractionRecords[ i ].PlayerName) ) ) ) { iInfractionRecord = i; bFoundPlayer = true; } } } if ( bFoundPlayer ) return( iInfractionRecord ); else return( -1 ); } function int GetInfractionIndexByIP( string IP, int iNumber ) { local bool bFoundPlayer; local int i; local int iCount; local int iInfractionRecord; local int iColon; local string IPOnly; iColon = InStr( IP, ":" ); if ( iColon > 0 ) IPOnly = Left( IP, iColon ); else IPOnly = IP; iCount = 0; bFoundPlayer = false; for (i = 0; ( ( i < 256 ) && ( ! bFoundPlayer ) ); i++) { if ( InfractionRecords[ i ].bInitialized ) { if ( IPOnly == InfractionRecords[ i ].IP ) { iInfractionRecord = i; iCount++; if ( iCount >= iNumber ) { bFoundPlayer = true; } } } } if ( bFoundPlayer ) return( iInfractionRecord ); else return( -1 ); } function int GetInfractionIndexByName( string PlayerName ) { local bool bFoundPlayer; local int i; local int iInfractionRecord; bFoundPlayer = false; for (i = 0; ( ( i < 256 ) && ( ! bFoundPlayer ) ); i++) { if ( InfractionRecords[ i ].bInitialized ) { if ( Caps(PlayerName) == Caps(InfractionRecords[ i ].PlayerName) ) { iInfractionRecord = i; bFoundPlayer = true; } } } if ( bFoundPlayer ) return( iInfractionRecord ); else return( -1 ); } function bool CheckChatDenyIP( string IP ) { local int i; local int iAsterick; local int iColon; local string IPOnly; iColon = InStr( IP, ":" ); if ( iColon > 0 ) IPOnly = Left( IP, iColon ); else IPOnly = IP; for ( i = 0; ( ( i < 100 ) && ( Len( ChatDenyIP[ i ] ) > 0 ) ); i++ ) { iAsterick = InStr(ChatDenyIP[ i ],"*"); if ( iAsterick <= 0 ) iAsterick = Len( ChatDenyIP[ i ] ); if ( Left(ChatDenyIP[ i ], iAsterick ) == Left(IPOnly, iAsterick ) ) { // Log( "CheckChatDenyIP is Banning"@IP@"matches"@ChatDenyIP[i]@"entry"@i@"Length"@iAsterick); return( true ); } } return( false ); } function bool CheckChatAdminIP( string IP ) { local int i; local int iAsterick; local int iColon; local string IPOnly; iColon = InStr( IP, ":" ); if ( iColon > 0 ) IPOnly = Left( IP, iColon ); else IPOnly = IP; for ( i = 0; ( ( i < 20 ) && ( Len( ChatAdminIP[ i ] ) > 0 ) ); i++ ) { iAsterick = InStr(ChatAdminIP[ i ],"*"); if ( iAsterick <= 0 ) iAsterick = Len( ChatAdminIP[ i ] ); if ( Left(ChatAdminIP[ i ], iAsterick ) == Left(IPOnly, iAsterick ) ) { return( true ); } } return( false ); } function bool MutatorTeamMessage(Actor Sender, Pawn Receiver, PlayerReplicationInfo PRI, coerce string S, name Type, optional bool bBeep) { local string outText; local bool bCensored; local bool bCancelOriginalMessage; local bool bFoundPlayer; local bool bTextChanged; local bool bDontLog; local bool bRepremanded; local bool bUpdateLastToInfo; local bool bHaveSenderIP; local bool bHaveReceiverIP; local bool bBroadcastIP; local bool bBanned; local string strMessage, ToName, S1, T; local int iAsterick; local string SenderIP; local string ReceiverIP; local int iColon; local string IP; local int CurrentTime; local int i; local int iInfractionRecord; local int iRecipInfractionRecord; local bool bFilterMessage; bFilterMessage = true; bCensored = false; bCancelOriginalMessage = false; bTextChanged = false; bDontLog = false; bRepremanded = false; bHaveSenderIP = false; bHaveReceiverIP = false; bBroadcastIP = false; bBanned = false; CurrentTime = Level.TimeSeconds; if (PRI != None && Receiver != None && Sender.IsA('PlayerPawn')) { if ( ( ( Pawn(Sender).bIsPlayer ) || ( Pawn(Sender).IsA('MessagingSpectator') ) ) && (PlayerPawn(Sender)==None || NetConnection(PlayerPawn(Sender).Player)!=None ) ) { bHaveSenderIP = true; IP = PlayerPawn(Sender).GetPlayerNetworkAddress(); iColon = InStr( IP, ":" ); SenderIP = Left( IP, iColon ); bBanned = CheckChatDenyIP( SenderIP ); } else SenderIP = ""; bFoundPlayer = false; iInfractionRecord = GetInfractionIndex( PRI, SenderIP ); if ( iInfractionRecord >= 0 ) { bFoundPlayer = true; if ( InfractionRecords[ iInfractionRecord ].CensorTime > 0 ) bCensored = true; } if ( ! bFoundPlayer ) { iInfractionRecord = CreateInfractionRecord( PRI, SenderIP ); if ( iInfractionRecord >= 0 ) bFoundPlayer = true; } // Try not to filter every message sent. If this message is being sent within 2 seconds of the last // message that the same player sent - compare it to the previous message and if it is the same // then dont re-filter it // It would be nice if there was a HOOK into the SAY command - before the loop that sends to all // the clients, so that we could get away with just filtering the message one time. if( bFoundPlayer ) // By now it better be true! { if ( CurrentTime <= InfractionRecords[ iInfractionRecord ].LastMessageSentTime + 2 ) { if ( InfractionRecords[ iInfractionRecord ].LastMessageSent ~= S ) { bFilterMessage = false; } } } bUpdateLastToInfo = false; strMessage = S; S1 = S; ToName = ""; if ( (AllowSpectatorsToSendPrivateMessage) || (!(Sender.IsA('Spectator'))) || ( PRI.bAdmin ) ) { //Log( "Processing ="@S ); if ( Left(Caps(S),3) == "TO " ) { T = Mid(S,3); i = InStr(T,":"); if ( i >= 1 ) { //Log( "In To code" ); ToName = Left( T, i ); strMessage = Mid( T, i + 1 ); bUpdateLastToInfo = true; } } else if ( ( Left(S,1) == "&" ) // Send this message to the last person we sent a TO message too && ( bFoundPlayer ) && ( InfractionRecords[ iInfractionRecord ].bLastToSentSet ) ) { ToName = InfractionRecords[ iInfractionRecord ].LastToSent; strMessage = Mid(S,1); //Log( "In Ampersand code" ); } else if ( ( Left(S,1) == "<" ) // Send this message to the last person who sent a TO message to us && ( bFoundPlayer ) && ( InfractionRecords[ iInfractionRecord ].bLastToReceivedSet ) ) { ToName = InfractionRecords[ iInfractionRecord ].LastToReceived; strMessage = Mid(S,1); //Log( "In < code" ); } if ( Len( ToName ) > 0 ) { //Log( "ToName = |" $ ToName $ "| strMessage = |" $ strMessage $ "|" ); // if ( Caps(ToName) != Caps(Receiver.PlayerReplicationInfo.PlayerName) ) iAsterick = InStr(ToName,"*"); if ( ( ( iAsterick < 0 ) && ( Caps(ToName) != Caps(Receiver.PlayerReplicationInfo.PlayerName) ) ) || ( ( iAsterick >= 0 ) && ( Caps(Left(ToName, iAsterick ) ) != Caps(Left(Receiver.PlayerReplicationInfo.PlayerName, iAsterick ) ) ) ) ) bCancelOriginalMessage = true; else if ( ( ! bCensored ) && ( ! bBanned ) ) { PlayerPawn(Sender).ClientMessage( "Message Delivered to" @ Receiver.PlayerReplicationInfo.PlayerName $ ":" $ strMessage, 'Event', true); if ( bUpdateLastToInfo ) { if ( bFoundPlayer ) { InfractionRecords[ iInfractionRecord ].LastToSent = ToName; InfractionRecords[ iInfractionRecord ].bLastToSentSet = true; } // Update the recipients record with our name if ( ( ( Receiver.bIsPlayer ) || ( Receiver.IsA('MessagingSpectator') ) ) && (PlayerPawn(Receiver)==None || NetConnection(PlayerPawn(Receiver).Player)!=None ) ) { bHaveReceiverIP = true; IP = PlayerPawn(Receiver).GetPlayerNetworkAddress(); iColon = InStr( IP, ":" ); ReceiverIP = Left( IP, iColon ); } iRecipInfractionRecord = GetInfractionIndex( Receiver.PlayerReplicationInfo, ReceiverIP ); if ( iRecipInfractionRecord < 0 ) iRecipInfractionRecord = CreateInfractionRecord( Receiver.PlayerReplicationInfo, ReceiverIP ); if ( iRecipInfractionRecord >= 0 ) { InfractionRecords[ iRecipInfractionRecord ].LastToReceived = PRI.PlayerName; InfractionRecords[ iRecipInfractionRecord ].bLastToReceivedSet = true; } } } S1 = "TO " $ ToName $ ":" $ strMessage; } } //Log( "S1 ="@S1 ); if ( Left(strMessage, 1) == "!" ) // Private message - don't write it to the chat log bDontLog = true; if ( ( ! bCensored ) && ( ! bBanned ) ) { if ( bFilterMessage ) { if ( StrictTextParsing ) bTextChanged = StrictCleanUpText(PlayerPawn(Sender), S1, outText); // text was changed? else bTextChanged = FastCleanUpText(S1, outText); // text was changed? if( bFoundPlayer ) { InfractionRecords[ iInfractionRecord ].bTextChanged = bTextChanged; InfractionRecords[ iInfractionRecord ].LastMessageSent = OutText; InfractionRecords[ iInfractionRecord ].LastMessageSentTime = CurrentTime; } } else { bTextChanged = InfractionRecords[ iInfractionRecord ].bTextChanged; OutText = InfractionRecords[ iInfractionRecord ].LastMessageSent; } if ( bTextChanged ) { if (KickPlayerForTalk && string(Receiver.NextPawn) == "None") { KickThePlayer(PlayerPawn(Sender), TalkMessage); return(false); } if ( ! bCensored ) { if (ChangeTalk) { if ( ! bCancelOriginalMessage ) PlayerPawn(Receiver).TeamMessage(PRI, outText, Type, true); bCancelOriginalMessage = true; // return(false); // have to cancel the original and send a new one, since we can't change the value of the text... } } } } if (string(Receiver.NextPawn) == "None") { if ( bTextChanged ) { if ( bFoundPlayer ) { InfractionRecords[ iInfractionRecord ].InfractionCount++; if ( ( MaxInfractions > 0 ) || ( MaxIPInfractions > 0 ) ) { if ( ( bHaveSenderIP ) && ( MaxIPInfractions > 0 ) && ( InfractionRecords[ iInfractionRecord ].InfractionCount >= MaxIPInfractions ) ) { bBroadcastIP = true; InfractionRecords[ iInfractionRecord ].CensorTime += CensorTime; Log(LogPrefix@GetCurrentDateTime()@"Language Infraction!"@PRI.PlayerName@"at"@SenderIP@" chat messages will be suppressed for"@InfractionRecords[ iInfractionRecord ].CensorTime@"seconds."); PlayerPawn(Sender).ReceiveLocalizedMessage(class'KeepItCleanMessage', 0); } else if ( ( bHaveSenderIP ) && ( MaxIPInfractions > 0 ) && ( InfractionRecords[ iInfractionRecord ].InfractionCount == ( MaxIPInfractions - 1 ) ) ) { InfractionRecords[ iInfractionRecord ].CensorTime += CensorTime; Log(LogPrefix@GetCurrentDateTime()@"Language Infraction!"@PRI.PlayerName$"'s chat messages will be suppressed for"@InfractionRecords[ iInfractionRecord ].CensorTime@"seconds."); PlayerPawn(Sender).ClientMessage("Excessive Language Infractions! Your IP will be broadcast to all users on your next language infraction! Chat privilege suspended. You cannot send any chat messages for"@InfractionRecords[ iInfractionRecord ].CensorTime@"seconds.", 'Event', true); PlayerPawn(Sender).ReceiveLocalizedMessage(class'KeepItCleanMessage', 1); bRepremanded = true; } else if ( ( bHaveSenderIP ) && ( MaxIPInfractions > 0 ) && ( InfractionRecords[ iInfractionRecord ].InfractionCount >= MaxInfractions ) ) { InfractionRecords[ iInfractionRecord ].CensorTime += CensorTime; Log(LogPrefix@GetCurrentDateTime()@"Language Infraction!"@PRI.PlayerName$"'s chat messages will be suppressed for"@InfractionRecords[ iInfractionRecord ].CensorTime@"seconds."); PlayerPawn(Sender).ClientMessage("Excessive Language Infractions! If you continue your IP will be broadcast to all users! Chat privilege suspended. You cannot send any chat messages for"@InfractionRecords[ iInfractionRecord ].CensorTime@"seconds.", 'Event', true); PlayerPawn(Sender).ReceiveLocalizedMessage(class'KeepItCleanMessage', 2); bRepremanded = true; } else if ( ( MaxInfractions > 0 ) && ( InfractionRecords[ iInfractionRecord ].InfractionCount >= MaxInfractions ) ) { InfractionRecords[ iInfractionRecord ].CensorTime += CensorTime; Log(LogPrefix@GetCurrentDateTime()@"Language Infraction!"@PRI.PlayerName$"'s chat messages will be suppressed for"@InfractionRecords[ iInfractionRecord ].CensorTime@"seconds."); } } if ( ( ! bRepremanded ) && ( InfractionRecords[ iInfractionRecord ].CensorTime > 0 ) ) { PlayerPawn(Sender).ClientMessage("Excessive Language Infractions! You cannot send any chat messages for"@InfractionRecords[ iInfractionRecord ].CensorTime@"seconds.", 'Event', true); bRepremanded = true; } } if ( (Len(TalkMessage) > 0) && ( ! bRepremanded ) ) { PlayerPawn(Sender).ClientMessage(TalkMessage, 'Event', true); } } if ( ( LogAllMessages ) && ( ! bDontLog ) ) { if ( bCensored ) { if ( ! bRepremanded ) PlayerPawn(Sender).ClientMessage("Message NOT sent! You cannot send any chat messages for " $ InfractionRecords[ iInfractionRecord ].CensorTime $ " more seconds.", 'Event', true); Log(LogPrefix@GetCurrentDateTime()@PRI.PlayerName $ ": CENSORED:"@S1); } else if ( bBanned ) { PlayerPawn(Sender).ClientMessage("Message NOT sent! You have been banned from sending any chat messages on this server!", 'Event', true); Log(LogPrefix@GetCurrentDateTime()@PRI.PlayerName $ ": BANNED:"@S1); } else Log(LogPrefix@GetCurrentDateTime()@PRI.PlayerName $ ":"@S1); } if ( bFoundPlayer ) { if ( PRI.PlayerName != InfractionRecords[ iInfractionRecord ].PlayerName ) { if ( bBroadcastIP ) BroadcastMessage( PRI.PlayerName@"(Player #"$InfractionRecords[ iInfractionRecord ].PID@"at IP"@SenderIP$") was previously known as"@InfractionRecords[ iInfractionRecord ].PlayerName ); else BroadcastMessage( PRI.PlayerName@"(Player #"$InfractionRecords[ iInfractionRecord ].PID$") was previously known as"@InfractionRecords[ iInfractionRecord ].PlayerName ); InfractionRecords[ iInfractionRecord ].PlayerName = PRI.PlayerName; } else if ( bBroadcastIP ) BroadcastMessage( PRI.PlayerName@"(Player #"$InfractionRecords[ iInfractionRecord ].PID@"at IP"@SenderIP$") has violated the language rules of this server too many times." ); } } } if ( ( bBanned ) || ( bCensored ) || ( bCancelOriginalMessage ) ) return( false ); if ( bDontLog ) return( true ); if (NextMessageMutator != None) { return NextMessageMutator.MutatorTeamMessage(Sender, Receiver, PRI, S, Type, bBeep); } return(true); } Yiň­k"zXPre'i^iEzXPost(i^iizXMod*i^W Ž[P˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙p]™WŕÎ=$:e…Ž”‰œÔX„žtČ„žtČƒ> ŁYƒ> ŁY‰œÔXˆ{#Uż„žtČˆ{#Uż„žtČˆ{#Użƒ> ŁY„žtČˆ{#Uż„žtČ„žtČƒ> ŁYƒ> ŁY„žtČ„žtČˆ{#Uż„žtČƒ> ŁY„žtČˆ{#Użƒ> ŁYˆ{#Użƒ> ŁYƒ> ŁYˆ{#Użƒ> ŁYƒ> ŁYˆ{#Użƒ> ŁYƒ> ŁYƒ> ŁYˆ{#Użƒ> ŁYˆ{#Użˆ{#Użˆ{#Użˆ{#Użˆ{#Użˆ{#Użˆ{#UżŽ=$:eˆ{#Użˆ{#Użˆ{#Użˆ{#Użˆ{#Użˆ{#Uż„žtČŽ=$:e…Ž”…Ž”…Ž”…Ž”…Ž”…Ž”…Ž”ƒ> ŁYˆ{#Użƒ> ŁYƒ> ŁYƒ> ŁY…Ž”„žtČ„žtČ„žtČ„žtČ„žtČˆ{#Uż„žtČƒ> ŁYƒ> ŁYŽ=$:eƒ> ŁYˆ{#Użƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁYƒ> ŁY…Ž”„žtČ„žtČ„žtČˆ{#Uż„žtČ„žtČˆ{#Uż„žtČˆ{#Uż„žtČ„žtČƒ> ŁYƒ> ŁY„žtČ„žtČ„žtČ…Ž”…Ž”’ŠŮŤ…Ž”– HÓG= >>SayLog>>FÓ@// // KeepItCleanMessage Unreal Tournament Message // Version: 1.0 // Author: Boden Maddox (idea by IceTed) // UT Version Coded/Tested: 4.28 // class KeepItCleanMessage expands LocalMessagePlus; var(KeepItClean) localized string KICIP; var(KeepItClean) localized string KICNextIP; var(KeepItClean) localized string KICWarnIP; var color YellowColor; static function color GetColor( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2 ) { return Default.YellowColor; } static function float GetOffset(int Switch, float YL, float ClipY ) { return ClipY - YL*8 - 0.0833*ClipY; } static function string GetString(optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject) { switch (Switch) { case 0: return Default.KICIP; break; case 1: return Default.KICNextIP; break; case 2: return Default.KICWarnIP; break; } return ""; } //static simulated function ClientReceive(PlayerPawn P, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject) //{ // Super.ClientReceive(P, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject); //} o // // KillOrBeKilledMessage Unreal Tournament Message // Version: 1.0 // Author: Boden Maddox (idea by IceTed) // UT Version Coded/Tested: 4.28 // class KillOrBeKilledMessage expands LocalMessagePlus; var(Messages) localized string KOBKString; static function float GetOffset(int Switch, float YL, float ClipY) { return (Default.YPos/768.0) * ClipY - 2*YL; } static function string GetString(optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject) { return Default.KOBKString; } static simulated function ClientReceive(PlayerPawn P, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject) { Super.ClientReceive(P, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject); } d€ƒ\'8óO->çppppBoden.MapConfig: Mode: Pre, Setting [] to []…|GameSpeed‹‘ ALńÜ|MaxSpectators Jź– % %‹‘Ü ń0|MaxPlayers J– & &‹‘Ć ńŚ|MinPlayersŁ‹‘a/!  J– & &.‹‘ă ń|FragLimit‹‘a/!  Jö– & &.‹‘Ţ ń•|GoalTeamScore’‹‘a/!> Jo– % %.Ś‹‘ŕ? ń |TimeLimit‹‘a/!  Jĺ– % %.‹‘Ű ńi|UseTranslocatorf‹‘a/! .‹‘-ĺKńÂ|JumpMatchż‹‘a/! .‹‘-žKńĺ|LowGrav-ZKńF|LowGravModifierRJ)–Rü˙˙Rü˙˙CC—R˙˙˙˙R˙˙˙˙ńË|FriendlyFireScaleČ‹‘a/!>ILŚ°II.Ś‹‘čIńń|ForceRedeemer-FK łe.,-e-e'‹‘S U+// // ReservedSeating Unreal Tournament Mutator // Version: 1.0 // Author: Boden Maddox // UT Version Coded/Tested: 4.36 // class ReservedSeating expands Mutator config(Boden); var config int NumReserved; var config int NumAddresses; var config string Addresses[100]; var config int ReservationsRequiredHour[24]; function KickThePlayer(PlayerPawn Player, string Msg) { if (Player != None) { Log("Player '" $ Player.PlayerReplicationInfo.PlayerName $ "' from " $ Player.GetPlayerNetworkAddress() $ " kicked during hour " $ Level.Hour $ " due to lack of reservation"); if (Len(Msg) > 0) { Player.ClientMessage(Msg, 'Event', true); } if (NetConnection(Player.Player) != None) { Player.Destroy(); } } } function ModifyPlayer(Pawn Other) { local int i; local string _addr; if ((Other != NONE) && Other.IsA('PlayerPawn')) { // Only if they started in the last 10 seconds do we even want to check this stuff... if (PlayerPawn(Other).PlayerReplicationInfo.StartTime >= Level.TimeSeconds - 10) { _addr = PlayerPawn(Other).GetPlayerNetworkAddress(); //Log("BODENDEBUG Player '" $ PlayerPawn(Other).PlayerReplicationInfo.PlayerName $ "' spawned at hour " $ Level.Hour $ " from " $ PlayerPawn(Other).GetPlayerNetworkAddress() $ " with " $ Level.Game.NumPlayers $ " players of " $ Level.Game.MaxPlayers $ " and " $ NumReserved $ " reserved"); // If we're in the time period for reserving... if (ReservationsRequiredHour[Level.Hour] != 0) { // And if the current player count is at TotalPossible - NumReserved... if (Level.Game.NumPlayers > Level.Game.MaxPlayers - NumReserved) { // And if he's not on "the list"... for (i = 0; i < NumAddresses; i++) { if (InStr(_addr, Addresses[i]) >= 0) // found it... { break; } } // Kick the poor bastard... if (i >= NumAddresses) // went all the way through the list... { KickThePlayer(PlayerPawn(Other), "Sorry, the remaining slots on this server are reserved. Try back later."); return; // don't call the next mutator here... we just kicked the pawn. } } } } } // Call next mutator in chain (if any) if (NextMutator != None) { NextMutator.ModifyPlayer(Other); } } Žcj˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙díEp˜Ž=$:e„žtČƒ> ŁYˆ{#Uż…Ž”ƒ> ŁY…Ž”…Ž”’ŠŮŤ…Ž”’ŠŮŤŽ=$:eƒ> ŁYˆ{#Użƒ> ŁY…Ž”ƒ> ŁYƒ> ŁYƒ> ŁY– T"P" ]63.193.74.219 Ý63.193.74.220 Ý63.193.74.221 Ý63.193.74.222 Í24.254.105.146 Ý 66.57.142.25"˘˘˘˘˘˘˘˘˘ ˘ ˘ ˘ ˘ ˘˘˘˘˘˘˘˘˘˘c// // HeadshotAmmo Unreal Tournament Mutator // Version: 1.0.1 // Author: Boden Maddox // UT Version Coded/Tested: 4.28 // class HeadshotAmmo expands Mutator config(Boden); var bool Initialized; var config int AmmoRewardAmount; function PostBeginPlay() { if (!Initialized) { Initialized = True; Level.Game.RegisterDamageMutator(Self); // register ourselves as a damage mutator } } function MutatorTakeDamage(out int ActualDamage, Pawn Victim, Pawn InstigatedBy, out Vector HitLocation, out Vector Momentum, name DamageType) { if (DamageType == 'Decapitated') // if it was a headshot... { if (InstigatedBy.IsA('Bot') || InstigatedBy.IsA('PlayerPawn')) // and a player or bot did it... { // check for teammate... do nothing if the player kills his teammate... if (Level.Game.bTeamGame) { if (InstigatedBy.PlayerReplicationInfo.Team != Victim.PlayerReplicationInfo.Team) { // give them some ammo... InstigatedBy.ClientMessage("You've Earned Some Ammo!", 'Event', true); InstigatedBy.Weapon.AmmoType.AmmoAmount += AmmoRewardAmount; if (InstigatedBy.Weapon.AmmoType.AmmoAmount > InstigatedBy.Weapon.AmmoType.MaxAmmo) { InstigatedBy.Weapon.AmmoType.AmmoAmount = InstigatedBy.Weapon.AmmoType.MaxAmmo; } } } } // pass on call to next mutator... if (NextDamageMutator != None) { NextDamageMutator.MutatorTakeDamage(ActualDamage, Victim, InstigatedBy, HitLocation, Momentum, DamageType); } } } aT(…Ž(RP->çppppBoden.MapConfig: Mode: Post, Setting [T] to [R] ÓbS=@Ÿţj!Ee„(a/!(a/! e‹‘-Áe›:(”°:f”°(&You've Earned Some Ammo!!'Ą(˜š¨Ve—(˜š¨(˜šą(˜š¨(˜šąwĂ*Ă$=Sf(QPj r`ţw{†5d@ë5\5*%q‚–*,d—}*%{}*D%w4%ۖ4{?*4&тy?A x?Zwpw?ĽDĽ4tkD'%-x(g-x{}@D%|4%Ą‚–4{ –D?@4&—‚y?A x?Z|p|?ĽDZ4Ľ4#qD~|'w\™%p,—%p“’'Z“’'&ZK„„š% —p&-lŠ–’’'kq\pp€5’'Z*&5’“’’'k&Z&3î–’'q\p€5’'Z*&3çpp¨KeepItClean WARNING: Possible recursive substitution error encountered while checking -*:*&ç¨KeepItClean WARNING: While parsing:5çKeepItClean WARNING: Message deleted.\KeepItClean Warning: Possible recurrsive substitution error encountered - check the Server log file.-x'5\@ë5'’&d-x'őĽ**‚{d\'( jfL*ś)čO->çppppBoden.MapConfig: Mode: Mod, Setting [L] to [K]ć|LDifficultyć‹‘a/! $%*–$, |$.‹‘ŽëK->çppppBoden.MapConfig: Difficulty [K] translated to [S$]*Ľ$‰™$,•->çppBoden.MapConfig: Difficulty [K] could not be translated, so setting to 2$,.‹‘ŽÍ=$ćMa/!,->çppBoden.MapConfig: Setting Bot [M”“] skill$-.‹‘ŽçM”“ć™$%.ĘMYrŽ<.‹‘ŽÍ$.‹‘Ž€í €Žegk˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙mf|fäŽ=$:e„žtČ„žtČ…Ž”’ŠŮŤ„žtČˆ{#Uż„žtČˆ{#Uż„žtČ„žtČ•XŠ'—Ѹ™B„žtČ•XŠ'—Ѹ™B„žtČ•XŠ'—Ѹ™B„žtČ•XŠ'—Ѹ™B„žtČ•XŠ'—Ѹ™BŽ=$:e…Ž”’ŠŮŤ– U"s// // SlugBoy Unreal Tournament Mutator // Version: 1.0 // Author: Boden Maddox (idea by Diogenes) // UT Version Coded/Tested: 4.28 // class SlugBoy expands Mutator config(Boden); var config int Handicap; var config int MaxJumpZ; var config int MaxGroundSpeed; var config int MinJumpZ; var config int MinGroundSpeed; function ScoreKill(Pawn Killer, Pawn Other) { if (Killer != Other && Other != None && Killer != None) { // Normal kill Slugem(Killer, -(Handicap)); Slugem(Other, Handicap); } if (Other != None && (Killer == None || Killer == Other)) { // Suicide Slugem(Other, Handicap); } Super.ScoreKill(Killer, Other); } function Slugem(Pawn P, int Delta) { P.GroundSpeed += Delta; if (P.GroundSpeed <= MinGroundSpeed) { P.GroundSpeed = MinGroundSpeed; } if (P.GroundSpeed >= MaxGroundSpeed) { P.GroundSpeed = MaxGroundSpeed; } P.JumpZ += Delta; if (P.JumpZ <= MinJumpZ) { P.JumpZ = MinJumpZ; } if (P.JumpZ >= MaxJumpZ) { P.JumpZ = MaxJumpZ; } } ŽnRl˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ o_–qŽ=$:e„žtČ„žtČ„žtČ„žtČ„žtČ„žtČ„žtČ„žtČ„žtČ„žtČ– Z" Y"XX"Xy"dW"dkO-ÎÉ1ŠY%‚–Y, xzYOKr->çpppBoden.MapConfig: Found Player [K] at index SYYĽY˙˙˙˙ NT9ÚwV}UG% ‚–G,d—}G%[pp¨CheckingG:G&ç[T [m%˜mVhpp€UmGęU“VmThZçZT ZĽm†ĽG LLCżŸ”-Q(S%z‚–S -Qp-6;SpzëLë6SoS-Q'ĽSŒ-Qo’˙˙˙˙ Y€~/// // KillOrBeKilled Unreal Tournament Mutator // Version: 1.0 // Author: Boden Maddox (idea by IceTed) // UT Version Coded/Tested: 4.28 // class KillOrBeKilled expands Mutator config(Boden); var bool Initialized; var config int PunishmentTimeout; var config int PunishmentAmount; var config int RewardAmount; var config bool ImmuneFlagCarrier; var config int StartingHealth; var config int MinActivePlayers; function PostBeginPlay() { if (!Initialized) { Initialized = True; PunishmentTimeout = (PunishmentTimeout + 4) / 5; if (PunishmentTimeout < 5) { PunishmentTimeout = 5; } if (PunishmentAmount < 1) { PunishmentAmount = 1; } settimer(float(PunishmentTimeout), true); // call us every FragTimeout seconds... } } function int GetPlayerCount() { local Pawn P; local int PlayerCount; // if Last Man Standing, only count players/bots who have lives left.. if (Level.Game.GameName == "Last Man Standing") { PlayerCount = (DeathMatchPlus(Level.Game).NumPlayers + DeathMatchPlus(Level.Game).NumBots - LastManStanding(Level.Game).NumGhosts); } else // every other type of game, just count the number of players/bots... { PlayerCount = (DeathMatchPlus(Level.Game).NumPlayers + DeathMatchPlus(Level.Game).NumBots); } return(PlayerCount); } function Timer() { local Pawn P; // If we don't have enough active players, don't do this... if (GetPlayerCount() < MinActivePlayers) { return; } for (P = Level.PawnList; P != None; P = P.NextPawn) { // if CTF and this guy carries the flag, then let's give him a break if (Level.Game.GameName == "Capture the Flag" && ImmuneFlagCarrier) { if (P.bIsPlayer && (P.PlayerReplicationInfo.HasFlag != None)) { continue; } } P.Health -= PunishmentAmount; if (P.Health <= 0) { P.ReceiveLocalizedMessage(class'KillOrBeKilledMessage'); P.Died(None, 'Suicided', P.Location); } } } function ModifyPlayer(Pawn Other) { Other.Health = StartingHealth; // start them with the specified amount of health Super.ModifyPlayer(Other); } function ScoreKill(Pawn Killer, Pawn Other) { // check for teammate... do nothing if the player kills his teammate... if (Level.Game.bTeamGame) { if (Killer.PlayerReplicationInfo.Team == Other.PlayerReplicationInfo.Team) { Super.ScoreKill(Killer, Other); return; } } // If we don't have enough active players, don't do this... if (GetPlayerCount() < MinActivePlayers) { Super.ScoreKill(Killer, Other); return; } Killer.Health += RewardAmount; if (Killer.Health > 199) { Killer.Health = 199; } Super.ScoreKill(Killer, Other); } qw/áG396ĐP6×P6ÔP?RP P€˘ŽuGm˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙%x-zÓtŽ=$:e…Ž”’ŠŮŤ„žtČˆ{#Uż„žtČˆ{#Uż„žtČ„žtČ„žtČ„žtČ…Ž”„žtČ…Ž”’ŠŮŤ„žtČ„žtČˆ{#Uż„žtČ„žtČ„žtČ„žtČ„žtČ„žtČ…Ž”’ŠŮŤ…Ž”-¤%n…Ž”-¤%n…Ž”šbbˇł…Ž”-¤%n…Ž”-¤%n– a" `"_"^Ó]"}\"Ňvd?ęü3˜”-Z^‹‘a/! ^‚.‹‘-žda/!s(Œda/!V.ˇd Ď/I$' {// // SniperBounty Unreal Tournament Mutator // Version: 1.0 // Author: Boden Maddox (idea by JavaJoe2K) // UT Version Coded/Tested: 4.28 // class SniperBounty expands Mutator config(Boden); var bool Initialized; var config int BountyScore; var config int BountyHealth; var config int BountyAmmo; function ScoreKill(Pawn Killer, Pawn Other) { if ((Killer.IsA('Bot') || Killer.IsA('PlayerPawn')) && Other.IsA('PlayerPawn')) // a player or bot did it... to a player... { // why just to a player? Hint: bots don't zoom... :-) if (Other.Weapon.isA('SniperRifle') && PlayerPawn(Other).bZooming) // if the victim was using a sniper rifle and zooming... { // give them some bounty! Killer.Weapon.AmmoType.AmmoAmount += BountyAmmo; if (Killer.Weapon.AmmoType.AmmoAmount > Killer.Weapon.AmmoType.MaxAmmo) { Killer.Weapon.AmmoType.AmmoAmount = Killer.Weapon.AmmoType.MaxAmmo; } Killer.Health += BountyHealth; if (Killer.Health > 199) { Killer.Health = 199; } Killer.PlayerReplicationInfo.Score += BountyScore; } } super.ScoreKill(Killer, Other); } M[ ˆâŕw[*çppppppPlayer '[”“' from [Ş kicked during hour S‹ś due to lack of reservationť—}l%[l!'ŕw.Ł[¤*[a €ČyJRÉ5YF‚‚-FJa/!z!{GBotpack.WarHeadLauncher(ČJG Q€ľ{U$‹j‚wU*Ua/! jł?.ƒU”ÎŻ‹´?, n.ƒUŞj›‹śJ%j—‹‘ş“‹‘ĆMs%˙–skő™~nsK%˙ĽsËj™sk .ƒUSorry, the remaining slots on this server are reserved. Try back later. ‰wŻ*Ż U €o€żEC#J"ŻŤŹŘ@DAŤ?,C  C€sW,]ŽĄĘe~W:0—e%g€We;gWF%Ƃ–F,d—}F %f~F *—˜f%f}F źz€F f€gf'ĽFB( F€€ËBH;1E  IJˆKˆL–€@ŔG@D!Ŕ@~}| !ŃV::Ö]‡3$wŻ*Ż::-”-Â-Fa/!7- (ň‚„-Ľa/!w.Ł¤*Şq~:m€q- +mú- 'u„zë:KEEPITCLEANzë:KICMKeepItClean Usage: Start a SAY or TeamSay command with the following:L 'TO :' to send a private message to a specific player.` '&' to send another private message to the last player you sent a private message too.F '<' to send a reply to a player that sent a private message.p *Note: Use an * to terminate the name to send a private message to a group of people in the same clan.l i.e. 'Say To [CTCR]*: Hello CTCR!' would send 'Hello CTCR!' to all players with [CTCR] prefixes.KeepItClean Commands:( Mutate KIC - This command listT Mutate KIC ListPlayers - Lists all players that have played in this level.7 Mutate KIC ListWords - Lists the Banned WordsG Mutate KIC AddWord [Word:Replacement] - Add a new word to bana Mutate KIC RemoveWord [Word:Replacement] - Remove an existing Word from the banned listA Mutate KIC ListBans - Lists the current Chat Banned IPsa Mutate KIC AddBan | - Add a new Chat Banned IP by Player Name or IPm Mutate KIC RemoveBan | - Remove an existing Chat Banned IP by Player Name or IPB Mutate KIC ListAdmins - Lists the current Chat Admin IPsb Mutate KIC AddAdmin | - Add a new Chat Admin IP by Player Name or IPn Mutate KIC RemoveAdmin | - Remove an existing Chat Admin IP by Player Name or IPE Mutate KIC ListParameters - List parameter names and valuesP Mutate KIC - Lists or sets a parameter valueF *Note: KIC can be replaced, in all commands with KeepItClean…3…3„z€ë:, KEEPITCLEAN z€ë:,KIC Űz€ë:, KEEPITCLEAN :, ę:,! z€ë,ADDWORD 㠄-- ,%Y ‚–,d—}%Ľ. Ď –,d6¨¨Adding to the list of banned words.bLISTWORDS 2This command is restricted to Chat Admins.Ţ* z€ë, REMOVEWORD Ţ „-- , %Ş ‚‚–,d—}%{Ľh ™ zëë8¨¨Removingfrom the list of banned wordsq ‚–,c—}’&%’&’&Ľ bĘ (¨¨Banned Wwrdnot found.LISTWORDS 2This command is restricted to Chat Admins.Ţ*ă z€ë,ADDBAN Ľ „-- , • ™ %6" ˇ Jˇ —% z9¨¨Playernot found (or has no IP listed).˘ %: ‚–,d—} %Ľ ’ –,d¨Chat Banning IP  bLISTBANSŕ 2This command is restricted to Chat Admins.Ţ*5z€ë, REMOVEBAN ÷„-- ,  W™ %6" yJy—%Ęz9¨¨Playernot found (or has no IP listed).ô%‚‚–,d—} %{ ĽŃä| '¨Removing Chat Ban for IPĹ‚–,c—}’& % ’&  ’& Ľc  bLISTBANS22This command is restricted to Chat Admins.Ţ*ţz€ë, ADDADMIN ž-,  ™ %6" żJż—%zC¨¨Playernot found not found (or has no IP listed).ť%L‚–,—}%Ľ!Š–,#¨Adding Chat Admin IPbLISTADMINSű4This command is restricted to Server Admins.Ţ*Iz€ë, REMOVEADMIN  -,  i™ %6" ‹J‹—%Üz9¨¨Playernot found (or has no IP listed).%%‚‚–,—}%{Ľăô|%¨Removing Chat Admin IPŐ‚–,c—}’&%’&’&ĽsbLISTADMINSF4This command is restricted to Server Admins.Ţ*9z€ë,STRICTTEXTPARSING ű„-- ,z€&?Ő-k StrictTextParsing is ON!˙!StrictTextParsing is OFF!řřzë€&Ozë€,ON-k'çKIC: StrictTextParsing is now ACTIVE!(StrictTextParsing is now ACTIVE!ő-k(çKIC: StrictTextParsing is now IN-ACTIVE!+StrictTextParsing is now IN-ACTIVE!b62This command is restricted to Chat Admins.Ţ*z€ë,REPLACEMIDWORD Ö„-- ,éz€&?ż-lReplaceMidWord is ON!ćReplaceMidWord is OFF!ÓÓzë€&Onzë€,ON-l'çKIC: ReplaceMidWord is now ACTIVE!%ReplaceMidWord is now ACTIVE!Đ-l(çKIC: ReplaceMidWord is now IN-ACTIVE!(ReplaceMidWord is now IN-ACTIVE!b2This command is restricted to Chat Admins.Ţ*Óz€ë, CHANGENAME •„-- , ¸z€&?’-cChangeName is ON!ľChangeName is OFF!’’zë€&O5zë€,ON-c'çKIC: ChangeName is now ACTIVE!!ChangeName is now ACTIVE!-c(çKIC: ChangeName is now IN-ACTIVE!$ChangeName is now IN-ACTIVE!bĐ2This command is restricted to Chat Admins.Ţ*’z€ë, CHANGETALK T„-- , wz€&?Q-`ChangeTalk is ON!tChangeTalk is OFF!QQzë€&Oôzë€,ON-`'çKIC: ChangeTalk is now ACTIVE!!ChangeTalk is now ACTIVE!N-`(çKIC: ChangeTalk is now IN-ACTIVE!$ChangeTalk is now IN-ACTIVE!b2This command is restricted to Chat Admins.Ţ*‚z€ë,KICKPLAYERFORNAME D„-- ,Kz€&?-a KickPlayerForName is ON!H!KickPlayerForName is OFF!AAzë€&OÖzë€,ON-a'çKIC: KickPlayerForName is now ACTIVE!(KickPlayerForName is now ACTIVE!>-a(çKIC: KickPlayerForName is now IN-ACTIVE!+KickPlayerForName is now IN-ACTIVE!b2This command is restricted to Chat Admins.Ţ*rz€ë,KICKPLAYERFORTALK 4„-- ,;z€&?-b KickPlayerForTalk is ON!8!KickPlayerForTalk is OFF!11zë€&OĆzë€,ON-b'çKIC: KickPlayerForTalk is now ACTIVE!(KickPlayerForTalk is now ACTIVE!.-b(çKIC: KickPlayerForTalk is now IN-ACTIVE!+KickPlayerForTalk is now IN-ACTIVE!bo2This command is restricted to Chat Admins.Ţ*ŕ!z€ë,$ALLOWSPECTATORSTOSENDPRIVATEMESSAGE ˘!„-- ,$a z€&?" -e2AllowSpectatorsToSendPrivateMessage is ON!^ 3AllowSpectatorsToSendPrivateMessage is OFF!Ÿ!Ÿ!zë€&O!zë€,ON-e'çKIC: AllowSpectatorsToSendPrivateMessage is now ACTIVE!:AllowSpectatorsToSendPrivateMessage is now ACTIVE!œ!-e(çKIC: AllowSpectatorsToSendPrivateMessage is now IN-ACTIVE!=AllowSpectatorsToSendPrivateMessage is now IN-ACTIVE!bÝ!2This command is restricted to Chat Admins.Ţ*˛#z€ë, LOGALLMESSAGES r#-, …"z€&?["-VLogAllMessages is ON!‚"LogAllMessages is OFF!o#o#zë€&O #zë€,ON-V'çKIC: LogAllMessages is now ACTIVE!%LogAllMessages is now ACTIVE!l#-V(çKIC: LogAllMessages is now IN-ACTIVE!(LogAllMessages is now IN-ACTIVE!bŻ#4This command is restricted to Server Admins.Ţ*×$z€ë,MAXINFRACTIONS ™$„-- ,3$z€&?!¨MaxInfractions isS2–$2Jç¨KIC: MaxInfractions is nowS2%¨MaxInfractions is nowS2bÔ$2This command is restricted to Chat Admins.Ţ*&z€ë,MAXIPINFRACTIONS Ć%„-- ,\%z€&?#¨MaxIPInfractions isSĂ%Jç¨KIC: MaxIPInfractions is nowS'¨MaxIPInfractions is nowSb&2This command is restricted to Chat Admins.Ţ*C'z€ë,MAXIPINFRACTIONS '„-- ,&z€&?)¨¨CensorTime isS=seconds.'J稨KIC: CensorTime is nowS=seconds.-¨¨CensorTime is nowS=seconds.b@'2This command is restricted to Chat Admins.Ţ*O(z€ë, NAMEMESSAGE (-, ˛'z€&?¨NameMessage is7 (7ç¨KIC: NameMessage is now7!¨NameMessage is now7bL(4This command is restricted to Server Admins.Ţ*[)z€ë, TALKMESSAGE )-, ž(z€&?¨TalkMessage is<)<ç¨KIC: TalkMessage is now<!¨TalkMessage is now<bX)4This command is restricted to Server Admins.Ţ*_*z€ë, LOGPREFIX *-, Ć)z€&?¨LogPrefix is*ç¨KIC: LogPrefix is now¨LogPrefix is nowb\*4This command is restricted to Server Admins.Ţ*Ţ*z€ë,TEST Ą*-,9Ţ*4This command is restricted to Server Admins.ę.z€ë,LISTPARAMETERS3+-k StrictTextParsing is ON!]+!StrictTextParsing is OFF!+-lReplaceMidWord is ON!ś+ReplaceMidWord is OFF!ä+-cChangeName is ON!,ChangeName is OFF!5,-`ChangeTalk is ON!X,ChangeTalk is OFF!,-a KickPlayerForName is ON!ˇ,!KickPlayerForName is OFF!ě,-b KickPlayerForTalk is ON!-!KickPlayerForTalk is OFF!]--e2AllowSpectatorsToSendPrivateMessage is ON!™-3AllowSpectatorsToSendPrivateMessage is OFF!Ë--VLogAllMessages is ON!ň-LogAllMessages is OFF!!¨MaxInfractions isS2#¨MaxIPInfractions isS)¨¨CensorTime isS=seconds.¨NameMessage is7¨TalkMessage is<¨LogPrefix isw/z€ë, LISTWORDSCurrent Banned Words:%w/‚–,d—}%Ľ2/0z€ë, LISTPLAYERSPlayers:%0–†0-6;t0„-- t¨6"tp¨p¨pt6Offenses=S6HCensorTime=S6  tĽş/ď1z€ë,LISTBANS´1„-- Current Chat Bans:%ą1‚–,d—} % -&§1—-%  -1™ %.¨p 6 6" Ľ-¤1-%*1Ľč0ď12This command is restricted to Chat Admins.…3z€ë, LISTADMINSH3-Current Chat Admins:%E3‚–,—}%-&;3—-% -13™ %3„-- .¨p 6 6" '3p 6 Ľ-83-%‚2Ľ@2…34This command is restricted to Server Admins. cŐ_.Ś㨠-A'-I(-p(-E(-B(-C(-q(-i(-D(-T(~D‹´ś‚‚w* w*a/! P‚„.„-Ľ.„a/!.„r.ƒ*w.Ł.ƒ¤*-q'X.ƒŞG~X:8€XG-T,8X8-#(8§™%-#'§—6 %-I'ہ-#8Ű™%-#'$-#$˜~’6t,$|6v)-A(-y(M)N),#„„-ea/!7-Âđz€ë),TO E),H~E:í™H&,€EHME’H&-y'H‚‚z€)&&-#-6x,6rM)&‚‚z€)&<-#-6w,6sM)&#—},%n~,*9„‚–n%#{ë,딓>‚™n%1{ë€,n뀔“n-p'‚-I -T.ƒGpp¨Message Delivered to”“:M!'-yá-#6r,-6x'‚„-Ľa/!.„r.ƒ*w.Ł.ƒ¤*-i'X.ƒŞG~X:|€XG^”|Č–^%^”|™^%6s^“-6w^'NpppTO ,:M;z€M&!-B'Ž‚-I -Tđ-A‰-k-E.ƒNo -ENoí-#-6u-E6vo6t~-E-6uo6vŽ-Ec‚-bzVŠNone .ƒ<(Ž-IŽ-`Ś-p.ƒDop'-p'śzVŠNone=-E-#Ľ6HX „—2% —%ţ‚‚-q —%™6H-D'Ą6 =稨¨¨¨¨¨¨Language Infraction!“at8 chat messages will be suppressed forS6 seconds..ƒ  ]%X Ő ‚‚-q —%š6H“&Ą6 =稨p¨¨¨Language Infraction!“'s chat messages will be suppressed forS6 seconds..ƒ×¨¨Excessive Language Infractions! Your IP will be broadcast to all users on your next language infraction! Chat privilege suspended. You cannot send any chat messages forS6 seconds.!'.ƒ  ]&-C'X ™ ‚‚-q —%™6H2Ą6 =稨p¨¨¨Language Infraction!“'s chat messages will be suppressed forS6 seconds..ƒĆ¨¨Excessive Language Infractions! If you continue your IP will be broadcast to all users! Chat privilege suspended. You cannot send any chat messages forS6 seconds.!'.ƒ  ],-C'X X ‚—2%™6H2Ą6 =稨p¨¨¨Language Infraction!“'s chat messages will be suppressed forS6 seconds.‚-C—6 %.ƒs¨¨Excessive Language Infractions! You cannot send any chat messages forS6 seconds.!'-C'=‚—}<% -C.ƒeű˙˙˙Lné˙˙˙Pjü˙˙˙t`ý˙˙˙VM˙˙˙˙skü˙˙˙\kü˙˙˙^jđ˙˙˙ijň˙˙˙Soř˙˙˙~né˙˙˙Qjň˙˙˙V`÷˙˙˙kű˙˙˙o`ň˙˙˙nű˙˙˙YM˙˙˙˙Vjű˙˙˙UMö˙˙˙unî˙˙˙BMţ˙˙˙inű˙˙˙Xnř˙˙˙Lmđ˙˙˙z`ß˙˙˙#`Ő˙˙˙Dmî˙˙˙Cmř˙˙˙xjň˙˙˙Heî˙˙˙}nđ˙˙˙cnî˙˙˙Y`÷˙˙˙)`ň˙˙˙Rdę˙˙˙ Mö˙˙˙`Ő˙˙˙;`ň˙˙˙&oç˙˙˙Tnř˙˙˙~hÉ˙˙˙WkŢ˙˙˙c`ň˙˙˙:`ň˙˙˙?`ň˙˙˙=kŢ˙˙˙d`ň˙˙˙.`ň˙˙˙0kŢ˙˙˙fkŐ˙˙˙6h÷˙˙˙[nű˙˙˙nnđ˙˙˙bnî˙˙˙Xkř˙˙˙@nđ˙˙˙aMţ˙˙˙dkÚ˙˙˙eMţ˙˙˙omý˙˙˙Enđ˙˙˙^nű˙˙˙`mđ˙˙˙vnű˙˙˙meç˙˙˙_kÚ˙˙˙djř˙˙˙nÇ˙˙˙{eç˙˙˙j`ß˙˙˙Qkç˙˙˙hŽN va‡Žj Cb ]iOb†ŽH ^b†ŽF kb‡ wb†ŽG DcŽx Pc‡af ]c‡Ž jc†]y wc‡g CdŽE Pd†]x \dN hd†]z ud} Ae‡U Ne–y [eW heYT ue†YZ Bf†a[ Nf†aZ Zf‡’j ff†]| sf†A @g†]G MgILYg‡]u gg‡hT sg†Pe @h†A\ Lh†Q Xhh dh‡kf qh>M ~h†]{ Ki‡h^ WigKdi†n ri‡hj i‡A] Kj†{ Wj‡ŽC dj‡Fj pjRM|j‡Uj Jk‡FT Vk‡]t ck=G ok‡hX |k†hS Hl†FS Ul†]p bl†I nl‡8V {l†ŽH Hml Tm†]q am‡]g nmZO {m†hY Hn‡”j Un‡:j bn‡Ÿj ont |n‡hW Ioe Uo‡„j bo‡rL oo‡h |oq HpNR UpGLbp†Qa pp†z }p†| Iq‡_ Vq‡QT bq‡8j oq‡ZQ |q‡sj Iry VrRcr]r qrNL}r†Q Ks‡qj Xs‡hU ds{Jqs†h[ s‡”\ Lt‡~ Xt‡Lj et]H rt]m t]n Lu]Q Yu‡xa fu]o su‡„o u‡AT LvžJYv‡JT gv†FT tv]F @w]w Mw‡rM Yw‡o fw†[ rwr wv Kx‡Ÿo Xx‡j ex†ŽU rx‡‘j ~x‡’T Jy†hZ Vyh] cy†QR pyIR }y‡h\ Jz†h] Wz†A[ cz†F[ oz:h |z†hT I{‡8W U{s a{Lh n{x {{†m H|†Ui U|‡@ a|‡j n|œag z|GR F}†k[ S}†ZM `}kT m}Ug z}U}G~ vl U~sh b~‡8T o~†Li |~rNH†rJ V‡rK c†„Q p†\Z }‡L@ J€†rO W€†rP d€‡L| p€Ąh|}€†\[ y…†–Q F††LQ R††–B _††–A l†‡– y†yRF‡‡„@ T‡†:i a‡†„i m‡†ŸQ y‡†\Z Fˆ†Ÿi Sˆ‡h[ _ˆ‡Qb lˆ‡]k xˆ‡]j E‰‡x` R‰‡h_ _‰‡h` l‰‡:@ x‰†AZ EŠ‡f RŠe ^Š†d kŠb xŠ` E‹u R‹‡FF _‹†:Q l‹†} y‹‡U@ FŒ‡\ SŒ‡oZ `ŒUh mŒ yŒ‡<g E†UQ Q†8Z ^‡Ÿ@ kZR x†}G DŽ˘WQŽ†˘O _Ž}RlŽ†qA zŽ†kZ G†Q[ T†QZ a†J[ n†JZ z†žO G†J_ Sxk `‡x\ m†8U y†8S E‘8TR‘:}`‘œœJ n‘ZP {‘†Z@ H’†FR U’‡: b’CR o’‡oY |’‡oX I“‡oy V“‡oW c“‡RP o“†hR {“mk H”gF U”‡L b”†rN o”w |”ťga I•‡dP U•†{O b•†ŽI n•†] {•‡s G–ťv S–‡Ž@ `–†a l–†c y–‡–@ F—]k S—‡”D `—‡ĄS m— qz—†p H˜†A U˜†@ b˜q o˜N|˜rJ™‡S X™Me™œ‚J s™ß]I@šœ‚I Sšs `š† mšŽD zš˘NF›˘s T›áyMa›‡d o›†d  {›†sA Hœ‡dT Uœť˘v bœ†qf oœ gJ|œ gIJ†f[ X‡gK e†fZ rĄiP‡mU O \T [ ‡@d h ‡@c u ‡@b BĄ‡Ll NĄJT[Ą†JZ iĄœœI vĄ‡x_ C˘x^ P˘‡x] ]˘†ZJ j˘†ZK w˘†ZL DŁ†ZN QŁ†Z[ ^Ł†Ze kŁ†Zg xŁ†Zo E¤†Zt R¤†Zv _¤†Zw l¤†Zx y¤†Z} FĽ†Z~ SĽ†AZ _Ľ‡AY lĽ†=A yĽ6R FŚŒĚZ&&SŚŒłZ&yŚŒľZ(_§‡Fb G¨ŒZBS¨<MUŽŒ]ecŽ‡<p H˛ŒxlU˛Œ]CJAľŒÇx)^KˇŒłx`işŽnXIźŒZ$IaÁ‡:p jĹŒľx0wŇAp gƍFp tĆŒ]t@ÇŒŸx"itʏ=p ]ÍŒŸ@"fjÍŒZ8eP҇hV uÔŒ]EBՍhp GŘŒŸo"ES؇Up XÚŒ]keÚŒZ!xPÝŒopHŕ‡Lp xâ†Pp EăŒ]OQă‡Qp `ę@k męZk4MÚzęŒZ%cGĹŽfZjʝ]k4bÖDÚŒZif° ŽN#O˛ k4K]Ő k4z hę hNbř ŒZ'spř Œłm