Áƒ*žEV@>Ü'*&fßÁAŒęNškݔEtg˙>VNoneMutateMyLogPrePadFindPI BeginStateTickEngineBusySystemDoneCore PureINTLog PlayerBusy PlayerDoneStartPlayerRequestingLogDateINTLogTimer INTLoggerIdentPIL ModifyPlayer PIL_PInfo PIL_MutatorPostBeginPlay LevelInfoMutator GameInfoTimeGetPropertyTextPi ReturnValueS ScriptTextiPlayerReplicationInfoInfoGetPlayerNetworkAddress DeltaTimeOtherResultLeveltries MutateString PlayerNameEndGameActorOwnerYearMonthDayHourMinuteSecond BaseMutator NextMutator PlayerOwnerSenderPadPawn PlayerPawnCountClassPackage TextBufferObject FunctionPLComEntriesState StrPropertyDate NamePropertyMut bRunning TriesBusy CurStateObjectPropertyFloatProperty BoolProperty IntPropertyP„Ž$;˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙D˜ŽŽU[ĽÚ„> ŁY„> ŁY„> ŁY„> ŁY„> ŁY  Š @€„‹*#˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙‹=$:e…Ž”…Ž”…Ž”…Ž”…Ž”…Ž”„> ŁY„> ŁY„> ŁY„> ŁYš{#UżD˜ŽD˜ŽD˜ŽD˜ŽD˜ŽD˜Ž  Š ]INTS@€@€@  €„!€@@„€”@@@-€„ -Ý.,w*PCK Player Done! '€0'm.,w*PCK Player Busy! €@€@2~/ .&–}p! x#// =============================================================== // PurePkgLog.PPL_PInfo: put your comment here // Created by UClasses - (C) 2000-2001 by meltdown@thirdtower.com // =============================================================== class PIL_PInfo extends Info; var PIL_Mutator Mut; var bool bRunning; // True when initialized var PlayerPawn PlayerOwner; // THe playerpawn owner var int Tries, TriesBusy; // Counts the # of times we've tried this var name CurState; // The state we were in/Try to be in function Tick(float deltaTime) { if (Owner == None) { Destroy(); Disable('Tick'); } } function Start() { PlayerOwner = PlayerPawn(Owner); if (PlayerOwner == None) Destroy(); else { Enable('Tick'); CurState = 'PlayerRequesting'; GotoState('PlayerBusy'); } } function Busy() { // For debugging if (PlayerOwner != None) PlayerOwner.Mutate("PCK Player Busy!"); } function Done() { // For debugging if (PlayerOwner != None) PlayerOwner.Mutate("PCK Player Done!"); } state PlayerRequesting { function BeginState() { // Log("PlayerRequesting.BeginState"@PlayerOwner.PlayerReplicationInfo.PlayerName); bRunning = True; // PKD = Pure command, INPUT = code if (PlayerOwner != None) PlayerOwner.Mutate("PID"@Mut.Ident@"UMenu.UMenuModMenuItem"); SetTimer(5.0, False); // Give them 5 seconds to reply, or new try. } function Timer() { Tries++; if (Tries == 3) { if (PlayerOwner != None) PlayerOwner.Mutate("PCK Failed INTlog!"); Destroy(); } else BeginState(); } function Busy() { GotoState('PlayerBusy'); } function Done() { GotoState('PlayerDone'); } } state PlayerBusy { function BeginState() { // Log("PlayerBusy.BeginState"@PlayerOwner.PlayerReplicationInfo.PlayerName); TriesBusy++; if (TriesBusy == 10) { if (PlayerOwner != None) PlayerOwner.Mutate("PCK Timeout INTlog!"); Destroy(); return; } SetTimer(2.0, False); } function Timer() { GotoState(CurState); } } state PlayerDone { function BeginState() { // Log("PlayerDone.BeginState"@PlayerOwner.PlayerReplicationInfo.PlayerName); Tries = 0; TriesBusy = 0; Enable('Tick'); } } –,÷\.„Ow*O-– +"oƒ ç"! €@Ž)=˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙(˝‘ĘűŽU[ĽÚ…Ž”…Ž”ŠŮŤ…Ž”ŠŮŤ  Š c // =============================================================== // PurePkgChk.PPC_Info: put your comment here // Created by UClasses - (C) 2000-2001 by meltdown@thirdtower.com // =============================================================== class INTLogger extends Info; function PostBeginPlay() { local PIL_Mutator Mut; // Make sure it wasn't added as a mutator foreach AllActors(class'PIL_Mutator',Mut) return; Mut = Level.Spawn(Class'PIL_Mutator'); if (Mut != None) { Mut.NextMutator = Level.Game.BaseMutator; Level.Game.BaseMutator = Mut; } Destroy(); } q-// =============================================================== // PurePkgChk.PPC_Mutator: put your comment here // Created by UClasses - (C) 2000-2001 by meltdown@thirdtower.com // =============================================================== class PIL_Mutator extends Mutator; var string Ident; function PIL_PInfo FindPI(PlayerPawn P) { // Finds or creates the info associated to this player local PIL_PInfo Result; // Try to find existing: ForEach AllActors(Class'PIL_PInfo', Result) if (Result.Owner == P) return Result; // None found, so create: Result = Spawn(Class'PIL_PInfo', P); Result.Mut = Self; return Result; } function ModifyPlayer(Pawn Other) { local PlayerPawn P; local PIL_PInfo PI; P = PlayerPawn(Other); if (P != None) { PI = FindPI(P); if (!PI.bRunning) PI.Start(); } Super.ModifyPlayer(Other); } function Mutate(string MutateString, PlayerPawn Sender) { // Wait for Pure replies here. local string s; local int i; local PIL_PInfo PI; if (Left(MutateString,4) ~= "PIR ") { if (Sender != None) { s = Mid(MutateString,4); i = InStr(s, " "); if (Left(s, i) ~= Ident) { INTLog(Sender, Mid(s, i+1)); PI = FindPI(Sender); PI.Done(); } } } else if (Left(MutateString,4) ~= "PIF ") { if (Sender != None) { s = Mid(MutateString,4); i = InStr(s, " "); if (Left(s, i) ~= Ident) { PI = FindPI(Sender); PI.Busy(); } } } Super.Mutate(MutateString, Sender); } function INTLog(PlayerPawn P, string PL) { // Logs all the INT entries. // Format: (Class,Desc) local string s; local string Com; local int End; local int Entries; if (!bool(P.GetPropertyText("bRemValid"))) { // Should be true, else it is forged P.Mutate("PCK Player Forged reply!"); return; } MyLog("********************************************************************"); s = P.GetPlayerNetworkAddress(); s = Left(s,InStr(s,":")); // Remove the :port part of the ip MyLog(P.PlayerReplicationInfo.PlayerName@s); while (Len(PL) > 1) { End = InStr(PL, ")"); Com = Mid(PL, 1, End - 1); PL = Mid(PL, End + 1); MyLog(Com); Entries++; } MyLog(LogDate()@"Entries"@Entries); MyLog("********************************************************************"); } function MyLog(coerce string s) { // Simply logs to log Log(s, 'PIL'); } function string LogDate() { // Simply returns date@time. local string Date, Time; Date = Level.Year$"-"$PrePad(Level.Month,"0",2)$"-"$PrePad(Level.Day,"0",2); Time = PrePad(Level.Hour,"0",2)$":"$PrePad(Level.Minute,"0",2)$"."$PrePad(Level.Second,"0",2); return Date@Time; } function string PrePad(coerce string s, string Pad, int Count) { // Pads a string in front with selected string. while (Len(s) < Count) { s = Pad$s; } return s; } 1 WÍąKK ŞbRemValid PCK Player Forged reply! ******************************************************************** ¨€~:¨ ›œD—} &~ ) &“&  ’&Ľç¨¨EntriesS******************************************************************** ×\/a0 0/r010a  €Ą/>r*av! €.—<.„!r*a:u!!q!  •% 0‘|€ ,PIR Žw* , ~ Ž|€ ’ &   |€ ,PIF w* , ~ |€   •  &>vń ČppppS‰§-S‰¤0,-S‰Ľ0,ppppS‰Ś0,:S‰Ł0,.S‰˘0,¨ 7SĂ˙˙˙˙˙˙˙˙˙˙’6ś\-'Qw*5¨¨PIDUMenu.UMenuModMenuItema @( —4?łOĽGš,Aw*PCK Failed INTlog!aM  5Lm q!  6 QĽ q! 3: i5˙˙˙˙˙˙˙˙˙˙’ZKRĽGš, Bw*PCK Timeout INTlog!a a@( —9g q 8<tň˙˙˙˙˙˙˙˙˙˙’p˝%%u! „/a0 0 10‰a zw*ž‰˜™‰˜™a €@ B B Aţ˙˙˙E A˙˙˙˙? A˙˙˙˙ A˙˙˙˙1 Aţ˙˙˙J Aţ˙˙˙Q Qú˙˙˙+ Aţ˙˙˙D A˙˙˙˙ Aţ˙˙˙T A˙˙˙˙ A˙˙˙˙& Qú˙˙˙2 Aţ˙˙˙A Aţ˙˙˙C Eö˙˙˙ Aţ˙˙˙I A˙˙˙˙> Eő˙˙˙ Eő˙˙˙ Eú˙˙˙ Qű˙˙˙0 Qó˙˙˙9 A˙˙˙˙% Qě˙˙˙% Jć˙˙˙. Eú˙˙˙ Qő˙˙˙: Aţ˙˙˙S Aţ˙˙˙R Eú˙˙˙ Tű˙˙˙8 Tű˙˙˙7 Tű˙˙˙4 Tű˙˙˙5 Tű˙˙˙6 Tű˙˙˙3 Eü˙˙˙' Aţ˙˙˙L Eö˙˙˙ˆ; yŽKF‡1" Qˆ1< ]‹wjˆ,* a‡+" nˆ=M z‡1- G‡+F SŒ1$ _ˆ+U kˆ1  x‡#" Eˆ%  QŒ+/ ^Œ, j‡ vŒO Bˆ%U Nˆ%) [ŠP h‡2 tŸN @ˆM L‡+G Y‡2K eŒ+H qˆ,U }ƒ >JŒ#@ Hƒ>T‡#= R ‡&" ^ ƒ5j ‘#4C$_!ƒ–NbEƒ!pF‡#! QGŽK]G‘(#4n hI‘#4|-VSƒjRƒQ|†ˆ,! MˆƒĄ*Zˆ .( D‰ƒ=P‰ƒ•GMŠƒbT“)vƒ’3c_ƒ—3VB’ƒ 3X“ƒ3 w““ )V”ƒ’8\”ƒ—8[–“)z–ƒ’;'c—ƒ(kJ˜‡2! u™