rott/kf_sources/HideMut/Classes/o_Utility.uc
2026-07-14 20:27:09 +07:00

658 lines
16 KiB
Ucode

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<int> Value;
};
struct sPerkInfo
{
var class<KFVeterancyTypes> Perk;
var array<sData> PerkData;
};
var array<sPerkInfo> 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<ColorRecord> ColorList; // color list
var config array<string> MsgHelp; // help messages
var config array<string> 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<adminAccount> 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<string> 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<string> 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<string> 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<KFWeapon> > getALLWeapons(KFPlayerController pc)
{
local KFLevelRules lr;
local array< class<KFWeapon> > 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<KFWeapon> > array_wep, array< class<Pickup> > sellItems)
{
local int i;
for (i = 0; i < sellItems.length; i++)
{
array_wep[array_wep.Length] = class<KFWeapon>(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<string> 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<string> 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<string> 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')
}