Įƒ*ž€‘ČHc/0ģ-½[:æåK‚‹ŚŖŒ×&[&\&]&^&_&`&a&b&c&d&e&fHŒHHŽHHH‘NoneNone ParseOptionCoreEngine UTV2004s utvMutatorNone utvSpectatorNoneNone UnrealGameXGameNonebAllActorsRelevant ModifyLoginNone FriendlyNameForceKarma CollisionSystemUser Movement Description LightColor LightingLevelMutatorPlayerController ControllerPlayerReplicationInfo GameInfo LevelInfo ScriptText Rotation ReturnValueNoneNonePortal DeltaTimePawnActorOptionsNoneClassPackage TextBufferNoneNone PlayerNameObjectPlayerControllerClassPlayerControllerClassNameNone bSpectator FunctionNoneGameNoneNoneNoneTargetViewRotationNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNone StrPropertyNoneStructPropertyxPlayerNoneClassPropertyNoneObjectPropertyFloatPropertyorigcontroller origcclassbSeeAll BoolProperty BytePropertyNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneCreateUtvReplicationCreateInitialUtvReplication bAlwaysTickTickGetNewControllerutvReplicationInfoNetUpdateFrequencybAlwaysRelevant ModifyPlayerbAddToServerPackages NotifyLogoutGetLocalPlayerControllerExitingOther ViewTarget IntPropertyRotatorRoleNetMode CurrentIDStructcurNewC PlayerIDPCutvIdOwneriC OwnerCtrlFound curTargetArrayPropertyReplicationInfo OwnerPlayerURIPNoneNoneNoneNoneNoneP@PP €@PP*P”‡P PPPP€@PP¤>g, ü¤FrŠ‹*ēp: Level.game is none? ”{Š‹“Š‹˜- |Š‹SpectatorOnly1- |Š‹UTVSeeAll1ł‚- - ēppp: Player with id 9SŠ‹  is requesting SeeAll7**Š‹ Š‹“Š‹˜Š‹“kŠ‹˜* GPe//----------------------------------------------------------- // //----------------------------------------------------------- class utvSpectator extends xPlayer; //All extra stuff that was here in previous versions is now handled //by UTV instead. So this is all that is required. ¦ ’’’’’’’’ Š’’’’’’’’’’6"ŠäąU¦ŻŅ³ ’ÓPP~M//----------------------------------------------------------- // //----------------------------------------------------------- class utvMutator extends Mutator; var string origcontroller; var class origcclass; var array utvId; //C is the owner function CreateInitialUtvReplication(Controller c) { local utvReplicationInfo uri; local Controller p; foreach dynamicactors(class'Controller', p) { if (p != c) { //Log("Initially spawning utvReplicationInfo for player " $ p.PlayerReplicationInfo.PlayerName $ " owner " $ c.PlayerReplicationInfo.PlayerName); uri = Spawn(class'utvReplicationInfo', c); uri.OwnerCtrl = p; } } } //C is the possible new player function CreateUtvReplication(Controller c) { local utvReplicationInfo uri; local PlayerController pc; local bool found; foreach dynamicactors(class'PlayerController', pc) { //Only spawn these for controllers that are utv in seeall mode if (!pc.bAllActorsRelevant) continue; found = false; foreach dynamicactors(class'utvReplicationInfo', uri) { if ((uri.OwnerPlayer == c.PlayerReplicationInfo) && (uri.Owner == pc)) { found = true; break; } } if (!found) { //Log("Spawning utvReplicationInfo for player " $ c.PlayerReplicationInfo.PlayerName $ " owner " $ pc.PlayerReplicationInfo.PlayerName); uri = Spawn(class'utvReplicationInfo', pc); uri.OwnerCtrl = c; } } } function Tick(float deltaTime) { local PlayerController pc; local int i; super.Tick(deltaTime); if (utvId.Length > 0) { foreach dynamicactors(class'PlayerController', pc) { for (i = 0; i < utvId.Length; ++i) { if (pc.PlayerReplicationInfo.PlayerID == utvId[i]) { CreateInitialUtvReplication(pc); Log(FriendlyName $ ": Found new UTV player: " $ pc.PlayerReplicationInfo.PlayerName); utvId.Remove(i, 1); i--; } } } } } //Returns a suitable UTV-spectator class. Knows about UTComp and TTM function string GetNewController() { local string cur; local string newc; cur = Level.Game.PlayerControllerClassName; //Utcomp? if (InStr(cur, "BS_") > 0) { newc = Repl(cur, "BS_", "UTV_BS_", false); Log(FriendlyName $ ": UTComp detected, using class " $ newc); } else if (InStr(cur, "TTM_PlayerController") > 0) { newc = Repl(cur, "TTM_PlayerController", "TTM_UTV_Spectator", false); Log(FriendlyName $ ": TTM detected, using class " $ newc); } else { newc = FriendlyName $ ".utvSpectator"; Log(FriendlyName $ ": Using class " $ newc); } return newc; } function ModifyLogin(out string Portal, out string Options) { local bool bSeeAll; local bool bSpectator; super.ModifyLogin (Portal, Options); if (Level.game == none) { Log (FriendlyName $ ": Level.game is none?"); return; } //If we replaced the controller last time round, make sure to restore it if (origcontroller != "") { Level.Game.PlayerControllerClassName = origcontroller; Level.Game.PlayerControllerClass = origcclass; origcontroller = ""; } bSpectator = ( Level.Game.ParseOption( Options, "SpectatorOnly" ) ~= "1" ); bSeeAll = ( Level.Game.ParseOption( Options, "UTVSeeAll" ) ~= "1" ); if (bSeeAll && bSpectator) { Log(FriendlyName $ ": Player with id " $ Level.Game.CurrentID $ " is requesting SeeAll"); utvId[utvId.Length] = Level.Game.CurrentID; origcontroller = Level.Game.PlayerControllerClassName; origcclass = Level.Game.PlayerControllerClass; Level.Game.PlayerControllerClassName = GetNewController(); Level.Game.PlayerControllerClass = none; } } function ModifyPlayer(Pawn Other) { super.ModifyPlayer(Other); CreateUtvReplication(Other.Controller); } function NotifyLogout(Controller Exiting) { local utvReplicationInfo uri; local PlayerController pc; super.NotifyLogout(Exiting); //Log if seeall players leave pc = PlayerController(Exiting); if ((pc != none) && (pc.bAllActorsRelevant)) { Log(FriendlyName $ ": SeeAll enabled player " $ Exiting.PlayerReplicationInfo.PlayerName $ " (" $ Exiting.PlayerReplicationInfo.PlayerID $ ") leaving"); } //Remove all utvReplicationInfos associated with the leaving player foreach dynamicactors(class'utvReplicationInfo', uri) { if ((uri.OwnerCtrl == Exiting) || (uri.Owner == Exiting)) { //Log("Removing utvReplication for pawn " $ Exiting $ " player " $ uri.Owner); uri.Destroy(); } } } ˆ%E’’’’’’’’€’’’’’’’’’’2,&†KžˆjõūW‡ķ„ u†,eś·ŒzVGB†,eś·ŒzVGB'ŲY|'ŲY|'ŲY|°hƒ3}ļƒ3}ļ…‡Zsģƒ3}ļ…‡Zsģƒ3}ļ…‡Zsģƒ3}ļ…‡Zsģƒ3}ļ…‡Zsģƒ3}ļ…‡Zsģƒ3}ļ…‡Zsģƒ3}ļ…‡Zsģƒ3}ļ…‡Zsģƒ3}ļ…‡Zsģƒ3}ļ…‡Zsģ‡ķ„ uŒzVGB‡ķ„ uŒzVGB‡ķ„ u'ŲY|†,eś·'ŲY|'ŲY|'ŲY|’pÓ] UTV2004S])(Required to support UTV2004 SeeAll modeiÓPFCl Sš9:š9:$š9:š9:$G€’’’’’’’’’’2 'ŲY|,]­Īƒ3}ļ†,eś·†,eś·†,eś·ƒ3}ļ‡ķ„ u°h‡ķ„ u’nSm$ČBiÓPP2P†P@PP@PGPPP1€P†P0P'P)@PP+P‡P5P‡P3P'P9 PŒPP‡PP†PPPPP6P‡P-€P†P P ØP;€P†P4P'P€PP/€PPD?kOt O.Š‹“—~.BS_%)É.BS_UTV_BS_(ēpp: UTComp detected, using class )F —~.TTM_PlayerController%)É.TTM_PlayerControllerTTM_UTV_Spectator(ēpp: TTM detected, using class )F)p.utvSpectatorēpp: Using class )) GP.€@PPA8g!–æ/a9 ‡0»(0-›1»-5(/a9 '-‡†‚r-28r-™0-5'‡10ŗ-5-a '0-(810 GP:h’K/a9 †4GFw4:;a ':;(410 GPœ-ž’’’LLü’’’#P‘&SP"P‘+^"«&Tl"PPPP•U|"•7J#PP‘'X#PPPPPPPPPPPPPPPޤ&f#P–""4qe)P¦`V.PP–&"4JNv/ˆ]@~lP]†‰'Dm‰‘>}|‰¬&@JŠ¢DBZЉEshЉ@JwŠ‘>|F‹‰DT‹‰@c‹‰EJr‹‰'IAŒ‰ERŒ‰AKaŒ•@EpŒ‰CF~Œ‰CKM‰@C\Æ'>k‰AC|‰AJKމBtZŽ”D(iŽŽ&kvwŽ‘>$m“Ž&g]{“Ž&hLX–Žœ&o3d—Ž—'jkW˜Ž—&jjB›Ž„&qOl–'"4U{ ¢*@P·”C(^·