[Setup] Product=Extra Console Version=100 Archive=Extra Console.umod SrcPath=. MasterPath=.. Requires=UnrealTournamentRequirement Group=SetupGroup Group=umodINIGroup Group=SystemGroup Group=umodIncludeFilesGroup [UnrealTournamentRequirement] Product=UnrealTournament Version= [SetupGroup] Copy=(Src=System\Manifest.ini,Master=System\Manifest.ini,Size=644,Flags=3) Copy=(Src=System\Manifest.int,Master=System\Manifest.int,Size=515,Flags=3) [umodINIGroup] AddIni=UnrealTournament.ini,Editor.EditorEngine.EditPackages=ExtraConsole [SystemGroup] File=(Src=System\ExtraConsole.u,Size=14865) File=(Src=System\ExtraConsole.int,Size=314) [umodIncludeFilesGroup] File=(Src=Help\ExtraConsoleReadme.txt,Size=750) File=(Src=Help\ExtraConsoleSetupLogo.bmp,Size=1800) [Setup] LocalProduct=Extra Console ReadMe=Help\ExtraConsoleReadme.txt SetupWindowTitle=Extra Console Setup AutoplayWindowTitle=Extra Console Options ProductURL=about:blank VersionURL=about:blank Developer=Michael John Wensley DeveloperURL=about:blank Logo=Help\ExtraConsoleSetupLogo.bmp [UnrealTournamentRequirement] LocalProduct=UnrealTournament ProductURL=http://www.unrealtournament.com/ VersionURL=http://unreal.epicgames.com/ Developer=Epic Games, Inc. DeveloperURL=http://www.epicgames.com/ Áƒ*žEp@NŸ5)=4€ŠřĘ Ö‚¤Ç‡§ŰNpNoneClientMessagePawn ExtraConsoleEngineSystemCoreRevengesf ModifyPlayerMutatorTakeDamage PlayerPawnMsg FontSetIs NoHelpFor CapsSetIs UnTriggerlsf HelpForLsf HelpForSfHelpForAvailableCommandsHelpForUncauseeventList HelpForSc HelpForList HelpForMsg HelpForHelpFont NoValuesForPropertiesForNoActorsToTriggerTriggeredActorIs OnlyAdmins KilledBy TakeDamagePostBeginPlay NoFontFailNoScrollTextureFail NoCheatingHelp ScriptedPawnRegisterDamageMutator MessageSetIsFindInventoryTypeBot UnCauseEventGiveTo ValuesAreExtraCommandssc DamageTypeF NamePropertyClassPropertyHealthA PropNameC BaseClassStructPropertyOtherNOwnerNetMode NextMutatorNextDamageMutatorVictimo instigatedByInvObjectFoundLastObjectPropertyDynamicLoadObject InitializedBotpackScrollingMessageTextureScrollingMessagebCaps BoolProperty ScriptText IntPropertySMutatorGetPropertyTextGame LevelInfo GameInfo Inventory FunctionLevelActor StrPropertyStructVector FontNameCmd TextBufferClassPackage Momentum HitLocationbCheatsEnabled SetFontFail BytePropertybAdminP actualDamage notfound hasfoundbAvengeƒŒ€ƒ@ƒ€ƒ‘@ƒƒ ƒ„„*ƒ$€€@;€@ €ƒ€@@ €– €€–#€@‘MG0˙˙˙˙˙˙˙˙€˙˙˙˙˙˙˙˙˙˙2*!ÚÂ*‘ŻĐ“œ„œÔX„œÔXƒžtČƒžtČ„œÔXŒ> ŁYŒ> ŁYŒ> ŁY’Ž”Œ> ŁYŒ> ŁY„œÔXŒ> ŁY„œÔXƒžtČƒžtČƒžtČƒžtČƒžtČƒžtČƒžtČƒžtČƒžtČ„œÔXŠ–˘CsƒžtČƒžtČ„œÔXľĎxWƒžtČƒžtČ„œÔXƒžtČŠ–˘CsƒžtČƒžtČ„œÔXŠ–˘CsƒžtČƒžtȍ*] New Message:%]'&No Scrolling Message Textures to set.$]Font could not be set.&]32Cheats are not enabled. You tried to use a cheat. ]XVOnly administrators are authorised to use UnCauseEvent. You are not an administrator.]! Triggered a matching game Actor]%$No matching game Actors to trigger.]Property values for/-: ]No property values for]Help %s: get help on %s]76msg %s: set any ingame message textures to display %s]MKlist %s: list known property values for name %s, i.e. list event, list tag]98UnCauseEvent %s: UnTrigger all Actors matching event %s]FDsc %s: Set scroller capitalisation to %s, where %s is true or false]@?sf %s: set scroller font to %s from 'obj list class=font' list]21lsf %s: set scroller font to %s based on 'sf %s']0/commands: help msg list uncauseevent sc sf lsf] No help for ] New Font:] New Caps:€ŠŠ(€Š@„,€@0€@1€@-€@2€@.€@5€@+€@=€@3€@J€@4€@6€@7€@8€@9€@:€@€@/€@ €@¤F" - (Č˙!z„a/!,a/!(- '("˜!Şa/! - ' !Č- Ą˜"w™*™$ " A&-şŐ,‡a/!  .Œ‡5r* _-˘ ; ˘„-š:—›:$ : -' ˙&!/a0 „& ¨9V-(10*- 8 C)'…l _‡a/! .ƒ‡5r* ë) ^HELP 3] }MSG =] LIST /] ťSC +] ŮSF ,] řLSF 0] UNCAUSEEVENT 2] < .] ˙˙¨-)] Ł h + !Gr*a ! .fwš*š   E%1n™ ʁ‡a/!  .ƒ‡5r * -(/a0 Š(l-'(-§-%10–- ¨5T-%Ş  ˆNB˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Dşďŕ5ˆ=$:eƒžtČ‘ŻĐ“œˆ=$:eH>RşĂ‡a/!  .ƒ‡5r *  Ÿ> '…„r * a/!  . śr*   ž'# ¨. -' -''—Ą) @čŽ+‡a/! .r* „.ƒ‡-(/a0*Ř*  ׂ{{None-'×{pp 10- ¨¨¨76)¨4 I2dʁ‡a/! .ƒ‡5r* Vr*  -(/a0 Š$‹-'$¨10´-¨1VČ  < C¨‡a/!  .ƒ‡5r * -(/a0 Š#j-'#Š 10’- ¨< Ś  €@p// if a pawn takes damage, the instigator pawn dies instead. Hahahahah ;-) class Revenge expands Mutator; var bool Initialized; function PostBeginPlay() { if (Initialized) return; Initialized = true; // insert us into head of linked list. // Gameinfo.uc manages the linked list. Level.Game.RegisterDamageMutator( Self ); } function MutatorTakeDamage( out int ActualDamage, Pawn Victim, Pawn InstigatedBy, out vector HitLocation, out vector Momentum, name DamageType) { local bool bAvenge; bAvenge = false; // to stop endless loop, and only bots or players get revenged. if ( damageType != 'Revenge' ) { // kill bots by giving them (100% * health) damage if (InstigatedBy.IsA('Bot') || InstigatedBy.IsA('ScriptedPawn')) { bAvenge = true; InstigatedBy.TakeDamage( InstigatedBy.Health, Victim, hitLocation, momentum, 'Revenge' ); // bots don't need a message as they won't read it anyway. } // kill players by kiledby() if (InstigatedBy.IsA('PlayerPawn')) { bAvenge = true; InstigatedBy.KilledBy( Victim ); } // we check for this since as we do not want to involve // non-entities in this process if (bAvenge) { // and the victim gets its health restored Victim.Health += actualDamage; } } if ( NextDamageMutator != None) NextDamageMutator.MutatorTakeDamage( ActualDamage, Victim, InstigatedBy, HitLocation, Momentum, DamageType ); } ˆK?˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ LV7Ąťˆ=$:eƒžtČƒžtČƒžtČƒžtČƒžtČƒžtČƒžtČˆ=$:e’Ž”ĽŠŮŤAX// Extra Commands Inventory Item class ExtraCommands extends Inventory; // casting appears like this: ? result = [Castto]([castfrom]) var localized string MessageSetIs, NoScrollTextureFail, NoFontFail, NoCheating, OnlyAdmins; var localized string TriggeredActorIs, NoActorsToTrigger; var localized string PropertiesFor, ValuesAre, NoValuesFor; var localized string HelpForHelp, HelpForMsg, HelpForList, HelpForUncauseevent, HelpForSc, HelpForSf, HelpForLsf; var localized string HelpForAvailableCommands, NoHelpFor; var localized string FontSetIs, CapsSetIs, SetFontFail; // Set Texture message // it has the same effect as "set ScrollingMessageTexture ScrollingMessage %s" // but is easier to type exec function msg( string S ) { local ScrollingMessageTexture A; local bool found; local pawn p; if (! Owner.IsA('Pawn')) return; p = Pawn(Owner); if (p == None) return; found = false; // look for all the scrolling messages and set them to display my greeting ForEach AllActors( class 'ScrollingMessageTexture', A) { found = true; A.ScrollingMessage = S; } if (found) p.ClientMessage(MessageSetIs@S); else p.ClientMessage(NoScrollTextureFail); } // set scrolling message texture font exec function sf( Font F ) { local ScrollingMessageTexture A; local bool found; local pawn p; if (! Owner.IsA('Pawn')) return; p = Pawn(Owner); if (p == None) return; if (F == None) { p.ClientMessage(NoFontFail); return; } found = false; // look for all the scrolling messages and set them to Font ForEach AllActors( class 'ScrollingMessageTexture', A) { found = true; A.Font = F; } if (found) p.ClientMessage(FontSetIs@F); else p.ClientMessage(NoScrollTextureFail); } // load and set a font on the scrolling message texture exec function lsf( string fontname ) { local Pawn p; local object O; local font F; if (! Owner.IsA('Pawn')) return; p = Pawn(Owner); if (p == None) return; O = DynamicLoadObject( fontname, class'Font', true); if ((O == None) || (! O.IsA('Font'))) { p.ClientMessage(NoFontFail); return; } // Cast object to a font. F = Font(O); if (F == None) { p.ClientMessage(NoFontFail); return; } sf( F ); } exec function sc( optional bool c ) { local ScrollingMessageTexture A; local bool found; local pawn p; if (! Owner.IsA('Pawn')) return; p = Pawn(Owner); if (p == None) return; found = false; // look for all the scrolling messages and set them to Font ForEach AllActors( class 'ScrollingMessageTexture', A) { found = true; A.bCaps = c; } if (found) p.ClientMessage(CapsSetIs@c); else p.ClientMessage(NoScrollTextureFail); } // give help on provided commands exec function Help( optional string cmd ) { local pawn p; if (! Owner.IsA('Pawn')) return; p = Pawn(Owner); if (p == None) return; switch ( Caps( cmd ) ) { case "HELP": p.ClientMessage(HelpForHelp); break; case "MSG": p.ClientMessage(HelpForMsg); break; case "LIST": p.ClientMessage(HelpForList); break; case "SC": p.ClientMessage(HelpForSc); break; case "SF": p.ClientMessage(HelpForSf); break; case "LSF": p.ClientMessage(HelpForLsf); break; case "UNCAUSEEVENT": p.ClientMessage(HelpForUncauseevent); break; case "": p.ClientMessage(HelpForAvailableCommands); break; default: p.ClientMessage(NoHelpFor@cmd); break; } } // Implemented opposite of the "causeevent" call for admins. exec function UnCauseEvent( name N ) { local actor A; local bool notfound; local PlayerPawn P; if (! Owner.IsA('PlayerPawn')) return; // Attempt cast from Owner to class; // note that the type of Owner is a class; P = PlayerPawn(Owner); if (P == None) return; if (! P.bCheatsEnabled) { P.ClientMessage(NoCheating); return; } if (! (P.bAdmin || (Level.Netmode == NM_Standalone))) { P.ClientMessage(OnlyAdmins); return; } notfound = true; if ( N != '') { ForEach AllActors( class 'Actor', A, N ) { P.ClientMessage(TriggeredActorIs@A); notfound = false; A.UnTrigger( P, P ); } } if (notfound) P.ClientMessage(NoActorsToTrigger); } // List events known to be causeable by actors in the game. Using command "list event" // Good fun is just waiting to be had with causeevent and the output from this command. ;-) // we just get a list of all the game's actor's and tell player // about those non empty event fields exec function List(string propName, optional class BaseClass ) { local Pawn p; local actor A; local string last; local string found; local string list; // use this to cut down on repetition of event names to the ingame console. local bool hasfound; if (! Owner.IsA('Pawn')) return; if ( BaseClass == None) BaseClass = class 'Actor'; p = Pawn(Owner); last = ""; list = ""; hasfound = false; ForEach AllActors ( BaseClass, A) { found = A.GetPropertyText( propName ); // could write class f = A.Event; if ((found != "") && (found != "None")) { hasfound = true; if (last != found) { list = list$" "$found; // string concatenation with $. last = found; } } } if (hasfound) p.ClientMessage(PropertiesFor@propName@ValuesAre@list); else p.ClientMessage(NoValuesFor@propName); } Z// Mutator to give player "Extra Commands" at start class ExtraConsole expands Mutator; // Modify the player to give them a hacking tool. function ModifyPlayer(Pawn Other) { // find out if the player has a hacktool if not, give them one. local Inventory inv; inv = Other.FindInventoryType(class'ExtraCommands'); if ( inv == None) { inv = Spawn(class'ExtraCommands'); inv.GiveTo(Other); } // give next Mutator oppertunity to chain in. if ( NextMutator != None) NextMutator.ModifyPlayer(Other); } ddc˙˙˙˙c˙˙˙˙\cţ˙˙˙]cţ˙˙˙IIü˙˙˙>c˙˙˙˙TdLc÷˙˙˙Mcţ˙˙˙Zc˙˙˙˙ cţ˙˙˙Fcţ˙˙˙Pcţ˙˙˙cc˙˙˙˙c˙˙˙˙Yc˙˙˙˙Wcţ˙˙˙bcţ˙˙˙4cţ˙˙˙;^ó˙˙˙_Iü˙˙˙[Rý˙˙˙6Iř˙˙˙AIř˙˙˙@iî˙˙˙?cţ˙˙˙RPô˙˙˙jZü˙˙˙#Zó˙˙˙JZó˙˙˙UIî˙˙˙VPô˙˙˙gZř˙˙˙ Zř˙˙˙ c˙˙˙˙Xcţ˙˙˙5Pö˙˙˙OIö˙˙˙]ö˙˙˙N†Ak O†@k \†?D i…GG v†Hk B†?B O†BE \…G i†Ik u†Ck B†EC O†Ek \Ž?o i†@7 uŚG:B†Gk P†H3 ]…G8 j…!$ vŽCG B†B< N†E3 […!% hŽ@m tŽGn @ ŽHG L …GH X ŽIG d •?f p ”?2 } •?e I!…IS V!‘0nb!œ?l P6†I7 \6†H7 i6ŽC9 v6”@= B7ŽLK N7†C7 Z7…Aa g7†G7 s7…! @8…! L8…! X8…! d8…! p8…! |8…!  H9…! T9…! `9…! l9…! x9…!/ E:…! Q:…! ]:…! i:…!  u:…!& A;…!* M;…! Y;…E` e;‹¤L sq;‹!-Wd>‹!'P{A‹ŁD WKF‹!1GbGˆsiI‹!R\K‹žL#8nM‹!SfN‹!YyQ‹! BRT…!h TV“LQ4{`Vˆq[m“!Q4LXLp“DQ4eXČ[Public] Object=(Name=ExtraConsole.ExtraConsole,Class=Class,MetaClass=Engine.Mutator,Description="Extra Console Commands,Enter 'help' at the prompt for a list.") Object=(Name=ExtraConsole.Revenge,Class=Class,MetaClass=Engine.Mutator,Description="Revenge,Induces death in anyone that attempts to hurt another.") The Extra Console Unreal Module provides two Mutators: The Extra Console mutator adds some extra commands to the ingame console: msg %s: changes in game scrolling messages to show the given message. help [%s]: get help on %s, or show available commands in this mod. uncauseevent %s: untrigger all Actors with tags matching %s list %s [%c]: list properties of Actors [or class %c] matching %s, i.e. list event. You can use the command "list event" to generate names to try with "causeevent" and "uncauseevent", which is good fun for opening and shutting doors in a level by remote control ;-) The Revenge mutator induces death in anyone that tries to hurt another in a level. Short and amusing in a practice game against bots ;-) BM6(WRŇ@€˙ @ € ˙ @@@€@˙@`@`€`˙`€@€€€˙€ @ € ˙ Ŕ@Ŕ€Ŕ˙Ŕ˙@˙€˙˙˙ @ € ˙ @ € ˙ @ @@ €@ ˙@ ` @` €` ˙` € @€ €€ ˙€   @  €  ˙  Ŕ @Ŕ €Ŕ ˙Ŕ ˙ @˙ €˙ ˙˙ @@@€@˙@ @@ @€ @˙ @@@@@@€@@˙@@`@@`@€`@˙`@€@@€@€€@˙€@ @@ @€ @˙ @Ŕ@@Ŕ@€Ŕ@˙Ŕ@˙@@˙@€˙@˙˙@`@`€`˙` `@ `€ `˙ `@`@@`€@`˙@```@``€``˙``€`@€`€€`˙€` `@ `€ `˙ `Ŕ`@Ŕ`€Ŕ`˙Ŕ`˙`@˙`€˙`˙˙`€@€€€˙€ €@ €€ €˙ €@€@@€€@€˙@€`€@`€€`€˙`€€€@€€€€€˙€€ €@ €€ €˙ €Ŕ€@Ŕ€€Ŕ€˙Ŕ€˙€@˙€€˙€˙˙€ @ € ˙   @  €  ˙  @ @@ €@ ˙@ ` @` €` ˙` € @€ €€ ˙€   @  €  ˙  Ŕ @Ŕ €Ŕ ˙Ŕ ˙ @˙ €˙ ˙˙ Ŕ@Ŕ€Ŕ˙Ŕ Ŕ@ Ŕ€ Ŕ˙ Ŕ@Ŕ@@Ŕ€@Ŕ˙@Ŕ`Ŕ@`Ŕ€`Ŕ˙`Ŕ€Ŕ@€Ŕ€€Ŕ˙€Ŕ Ŕ@ Ŕ€ Ŕ˙ ŔŔŔ@ŔŔ€ŔŔ˙ŔŔ˙Ŕ@˙Ŕ€˙Ŕ˙˙Ŕ˙@˙€˙˙˙ ˙@ ˙€ ˙˙ ˙@˙@@˙€@˙˙@˙`˙@`˙€`˙˙`˙€˙@€˙€€˙˙€˙ ˙@ ˙€ ˙˙ ˙Ŕ˙@Ŕ˙€Ŕ˙˙Ŕ˙˙˙@˙˙€˙˙˙˙˙˙X˙X˙X˙X˙X˙X˙X˙X˙X˙X˙X˙X˙X˙X˙ “0ůD“đ\“ ço“ßx“Ů~“Ó„“Ě‹“Ć‘“ż˜“šž“ł¤“­Ş“§°“Ąś“›ź“•““ȓ“„Γ “zԓ “qړ“hŕ““_“ ţY““T‚“ţ üţT““Fˆ“ţüţR“%“4‘“ţüţP“3“Ÿ“ţüţN“ć“ţ!üţL“ĺ“ţ%üţK“ä“ţ'üţJ“ă“ţ)üţI“â“ţ+üţH“â“ţ+üţH“á“ţ-üţG“á“ţ-üţG“ŕ“ţ/üţF“ŕ“ţ/üţF“ŕ“ţ/üţF“ŕ“ţ/üţF“ŕ“ţ/üţF“ŕ“ţ/üţF“ŕ“ţ/üţF“á“ţ-üţG“á“ţ-üţG“â“ţ+üţH“â“ţ+üţH“ă“ţ)üţI“ä“ţ'üţJ“ĺ“ţ%üţK“ć“ţ!üţL“č“ţüţN“ę“ţüţP“ě“ţüţR“î“ţ üţT“ó“ ţY“˙“X“˙“X“˙“X“˙“X“˙“X“˙“X“˙“X“˙“X“˙“X“˙“X“˙“X“˙“X“˙“X“System\Manifest.iniSystem\Manifest.intSystem\ExtraConsole.u:System\ExtraConsole.int+?:Help\ExtraConsoleReadme.txte@îHelp\ExtraConsoleSetupLogo.bmpSCŁĹăŸ[JOKF‹