[Setup] Product=RealSkin Version=100 Archive=realskin.umod SrcPath=. MasterPath=.. Requires=UnrealTournamentRequirement Group=SetupGroup Group=realskinGroup [UnrealTournamentRequirement] Product=UnrealTournament Version= [SetupGroup] Copy=(Src=System\Manifest.ini,Master=System\Manifest.ini,Size=408,Flags=3) Copy=(Src=System\Manifest.int,Master=System\Manifest.int,Size=522,Flags=3) [realskinGroup] File=(Src=System\RealSkin.u,Size=8670) File=(Src=System\RealSkin.txt,Size=2434) File=(Src=System\Realskin.int,Size=238) [Setup] LocalProduct=RealSkin ReadMe=System\RealSkin.txt SetupWindowTitle=RealSkin AutoplayWindowTitle=RealSkin Options ProductURL=http://www.planetunreal.com/nzone VersionURL=http://www.planetunreal.com/nzone Developer=William 'Ntruder' Chenoweth DeveloperURL=http://www.planetunreal.com/nzone [UnrealTournamentRequirement] LocalProduct=UnrealTournament ProductURL=http://www.unrealtournament.com/ VersionURL=http://unreal.epicgames.com/ Developer=Epic Games, Inc. DeveloperURL=http://www.epicgames.com/ Áƒ*žE0@$áq•ÄH7ľF˜šŽŮźWßs$0NoneDefaultStruct RealSkin SkinStruct SetDefaults ModifyLoginReplaceOptionEngineCoreSystemMutatorObject TextBufferPackageClassStruct StrPropertyStructProperty ClassName PlayerPawn Function ReturnValueClassPropertyObjectPropertyBoolPropertyX SpawnClass NextMutatorPortal IntPropertyJunkOptions Description SkinPack ScriptText DefaultSkin SkinData DefaultDatabSetDefaultsSkinStrNameStr ClassStr NewOptions bSkinFoundYParam NewParamZ2@@@@@@@@@ @@@@€@@@@@@@ €@@€@@#@€@@€@ €ŠŒKMclass RealSkin expands Mutator; struct SkinStruct { var() config string Description; var() config string ClassName; var() config string SkinPack; }; struct DefaultStruct { var() config string Description; var() config string ClassName; var() config string DefaultSkin; }; var(RealSkin) config SkinStruct SkinData[50]; var(RealSkin) config DefaultStruct DefaultData[20]; var config bool bSetDefaults; function ModifyLogin(out class SpawnClass, out string Portal, out string Options) { local int x,y,z; local string SkinStr, NameStr, ClassStr, NewOptions; local bool bSkinFound; if (!bSetDefaults) SetDefaults(); NewOptions = Caps(Options); x = InStr(NewOptions, "?NAME="); if (x >= 0) { NameStr = Right(Options, Len(Options) - (x+6)); y = InStr(NameStr, "?"); if (y >= 0) { NameStr = Left(NameStr, y); } } x = InStr(NewOptions, "?CLASS="); if (x >= 0) { ClassStr = Right(NewOptions, Len(NewOptions) - (x+7)); y = InStr(ClassStr, "?"); if (y >= 0) { ClassStr = Left(ClassStr, y); } x = InStr(NewOptions, "?SKIN="); if (x >= 0) { SkinStr = Right(NewOptions, Len(NewOptions) - (x+6)); y = InStr(SkinStr, "."); if (y >= 0) { SkinStr = Left(SkinStr, y); } bSkinFound=False; for(z=0;z<50;z++) { if (SkinData[z].ClassName == "") { z = 50; } else { if (Caps(SkinData[z].ClassName) == ClassStr) { if (Caps(SkinData[z].SkinPack) == SkinStr) { bSkinFound=True; z=50; } } } } if (!bSkinFound) { Log("RealSkin: Bogus skin detected by player " $ NameStr); for(z=0;z<20;z++) { if (Caps(DefaultData[z].ClassName) == ClassStr) { Options = ReplaceOption(Options, "?Skin=", DefaultData[z].DefaultSkin); } } } } } if ( NextMutator != None ) NextMutator.ModifyLogin(SpawnClass, Portal, Options); } function string ReplaceOption(string Options, string Param, string NewParam) { local string NewOptions, Junk; local int x,y,z; NewOptions = Options; x = InStr(Caps(Options), Caps(Param)); if (x >= 0) { Junk = Right(Options, Len(Options) - (x+Len(Param))); y = InStr(Junk, "?"); if (y >= 0) { NewOptions = Left(Options, x); NewOptions = NewOptions $ Param; NewOptions = NewOptions $ NewParam; NewOptions = NewOptions $ Right(Options, Len(Options) - (x+Len(Param)+y)); } else { NewOptions = Left(Options, x); NewOptions = NewOptions $ Param; NewOptions = NewOptions $ NewParam; } } Log("NewOptions: " $ NewOptions); return NewOptions; } function SetDefaults() { Log("RealSkin: Setting Defaults"); SkinData[0].Description="Male Commando"; SkinData[0].ClassName="Botpack.TMale1"; SkinData[0].SkinPack="CommandoSkins"; SkinData[1].Description="Male Soldier"; SkinData[1].ClassName="Botpack.TMale2"; SkinData[1].SkinPack="SoldierSkins"; SkinData[2].Description="Female Commando"; SkinData[2].ClassName="Botpack.TFemale1"; SkinData[2].SkinPack="FCommandoSkins"; SkinData[3].Description="Female Soldier"; SkinData[3].ClassName="Botpack.TFemale2"; SkinData[3].SkinPack="SGirlSkins"; SkinData[4].Description="Boss"; SkinData[4].ClassName="Botpack.TBoss"; SkinData[4].SkinPack="BossSkins"; SkinData[5].Description="Nali WarCow"; SkinData[5].ClassName="MultiMesh.TCow"; SkinData[5].SkinPack="TCowMeshSkins"; SkinData[6].Description="Nali"; SkinData[6].ClassName="MultiMesh.TNali"; SkinData[6].SkinPack="TNaliMeshSkins"; SkinData[7].Description="Skaarj Hybrid"; SkinData[7].ClassName="MultiMesh.TSkaarj"; SkinData[7].SkinPack="TSkMSkins"; DefaultData[0].Description="Male Commando"; DefaultData[0].ClassName="Botpack.TMale1"; DefaultData[0].DefaultSkin="CommandoSkins.cmdo"; DefaultData[1].Description="Male Soldier"; DefaultData[1].ClassName="Botpack.TMale2"; DefaultData[1].DefaultSkin="SoldierSkins.blkt"; DefaultData[2].Description="Female Commando"; DefaultData[2].ClassName="Botpack.TFemale1"; DefaultData[2].DefaultSkin="FCommandoSkins.cmdo"; DefaultData[3].Description="Female Soldier"; DefaultData[3].ClassName="Botpack.TFemale2"; DefaultData[3].DefaultSkin="SGirlSkins.army"; DefaultData[4].Description="Boss"; DefaultData[4].ClassName="Botpack.TBoss"; DefaultData[4].DefaultSkin="BossSkins.Boss"; DefaultData[5].Description="Nali WarCow"; DefaultData[5].ClassName="MultiMesh.TCow"; DefaultData[5].DefaultSkin="TCowMeshSkins.WarCow"; DefaultData[6].Description="Nali"; DefaultData[6].ClassName="MultiMesh.TNali"; DefaultData[6].DefaultSkin="TNaliMeshSkins.Ouboudah"; DefaultData[7].Description="Skaarj Hybrid"; DefaultData[7].ClassName="MultiMesh.TSkarrj"; DefaultData[7].DefaultSkin="TSkMSkins.Warr"; bSetDefaults=True; SaveConfig(); } €@! lh+ ~ë ë ™%ę “} ’}~?֙%€ pppę “} ’’} € ppçpNewOptions:  z˝-ë ~?NAME=Š™ %ę“}’ ,~?Š™%€ ~?CLASS=’™ %ę“}’ ,~?÷™%€ ~?SKIN=’™ %ę“}’ ,~.c™%€-(%ň–,2 z6,2ččzë6čzë6-',2Ľr’-çpRealSkin: Bogus skin detected by player %’–,ˆzë6?Skin=6 Ľ7ťw‹*‹ „$˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙"žľ˙„ՃC,„ŐƒC,  †Â ŁçRealSkin: Setting Defaults6 %Male Commando6%Botpack.TMale16%CommandoSkins6 &Male Soldier6&Botpack.TMale26&SoldierSkins6 ,Female Commando6,Botpack.TFemale16,FCommandoSkins6 ,Female Soldier6,Botpack.TFemale26,SGirlSkins6 ,Boss6,Botpack.TBoss6,BossSkins6 ,Nali WarCow6,MultiMesh.TCow6,TCowMeshSkins6 ,Nali6,MultiMesh.TNali6,TNaliMeshSkins6 ,Skaarj Hybrid6,MultiMesh.TSkaarj6,TSkMSkins6%Male Commando6%Botpack.TMale16 %CommandoSkins.cmdo6&Male Soldier6&Botpack.TMale26 &SoldierSkins.blkt6,Female Commando6,Botpack.TFemale16 ,FCommandoSkins.cmdo6,Female Soldier6,Botpack.TFemale26 ,SGirlSkins.army6,Boss6,Botpack.TBoss6 ,BossSkins.Boss6,Nali WarCow6,MultiMesh.TCow6 ,TCowMeshSkins.WarCow6,Nali6,MultiMesh.TNali6 ,TNaliMeshSkins.Ouboudah6,Skaarj Hybrid6,MultiMesh.TSkarrj6 ,TSkMSkins.Warr-'b ˙˙˙˙ý˙˙˙ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ý˙˙˙˙˙˙˙ ˙˙˙˙ ü˙˙˙˙˙˙˙‡"$w ‡"%D ‚ * Q …!/ ] ‚ i ‚! u …!, A‚ M‚# Y…! e‚  q‚  }‚!* I‚  U‚!) a‚! m…  y‚!( E‚ - Q‚!' ]… , iˆ!+ uˆ"& A‚ . M‚  Y‚! e‰"q!C‰"QŽ""4VMc‚  y^†"IE_†"`Nb„^ni… / Lk†"YXk------------------- RealSkin Overview ------------------- RealSkin prevents players from using incorrect skins on player meshes. I personally found this problem really annoying since I am a CTF addict and some model/skin combos leave the player with no team color. RealSkin is flexible so you can still add new skin packages and even new player models. RealSkin comes preconfigured with the proper defaults from UT, including the Bonus Pack models/skins, so if you don't have any custom skins or models you can just install it and add it to your Mutators list. Problems/questions/comments go to ntruder@home.com. - William 'Ntruder' Chenoweth http://www.planetunreal.com/nzone ----------------------- Adding New Skin Packs ----------------------- To add a new skin pack to RealSkin, use the Advanced Options menu. Pick "Mutators" and then "RealSkin". Click on to "SkinData" and pick the next empty slot. Slots must be contiguously full because RealSkin will stop reading at the first empty slot it comes to. Here is a description of the parameters: ClassName - Refers to the Mesh class that has access to this skin pack. For example, a Boss skin pack would use 'Botpack.TBoss' as its ClassName. See the 'DefaultData' list for all the standard model class names. Description - Simply there to help you keep track of skin packs and what they contain. SkinPack - Reference to the PACKAGE NAME ONLY of the new skin pack. For example, the default Boss skins are contained in a package called "BossSkins" with the default skin being "Bosskins.Boss." All you should enter is the package name, not the name of a skin. -------------------------- Adding New Player Meshes -------------------------- To add a new player mesh, you need to add the skin packs for the mesh as described above and also set a default skin for the new model. Go to the Advanced Options Menu, and pick "Mutators", then "RealSkin", and then "DefaultData" and pick the next empty slot. The parameters are: ClassName - Refers to the player mesh class you are setting this default for. Description - Simply there to help you keep track of what mesh this is. DefaultSkin - The name of the default skin you want for this player model. The default skin for the Boss model is BossSkins.Boss, for example.[Public] Object=(Name=RealSkin.RealSkin,Class=Class,MetaClass=Engine.Mutator,Description="RealSkin, Forces players to use approved skins only.") Preferences=(Caption="RealSkin",Parent="Mutators",Class=RealSkin.RealSkin,Immediate=True) System\Manifest.ini#System\Manifest.int# System\RealSkin.u-Ţ!System\RealSkin.txt &‚ System\Realskin.int/îŁĹăŸ{031&qpř