This commit is contained in:
GenZmeY 2022-08-16 09:59:16 +03:00
parent 76a9f23530
commit c406220e99
277 changed files with 952 additions and 790 deletions

View File

@ -1,57 +0,0 @@
class CFG_Lifespan extends Object
config(MSKGS)
abstract;
var public config int Weapon;
var public config int Dosh;
public static function InitConfig(int Version, int LatestVersion, E_LogLevel LogLevel)
{
`Log_TraceStatic();
switch (Version)
{
case `NO_CONFIG:
ApplyDefault(LogLevel);
default: break;
}
if (LatestVersion != Version)
{
StaticSaveConfig();
}
}
public static function Load(E_LogLevel LogLevel)
{
`Log_TraceStatic();
switch (Locs(default.SortPolicy))
{
case "counterasc": return;
case "counterdesc": return;
case "nameasc": return;
case "namedesc": return;
case "playtimetotalasc": return;
case "playtimetotaldesc": return;
case "playtimeavgasc": return;
case "playtimeavgdesc": return;
}
`Log_Error("Can't load SortPolicy (" $ default.SortPolicy $ "), must be one of: CounterAsc CounterDesc NameAsc NameDesc PlaytimeTotalAsc PlaytimeTotalDesc PlaytimeAvgAsc PlaytimeAvgDesc");
default.SortPolicy = "CounterDesc";
}
protected static function ApplyDefault(E_LogLevel LogLevel)
{
`Log_TraceStatic();
default.bEnable = false;
default.SortPolicy = "CounterDesc";
}
defaultproperties
{
}

View File

@ -1,57 +0,0 @@
class MapStat extends Object
config(MSKGS)
abstract;
var public config bool bEnable;
var public config String SortPolicy;
public static function InitConfig(int Version, int LatestVersion, E_LogLevel LogLevel)
{
`Log_TraceStatic();
switch (Version)
{
case `NO_CONFIG:
ApplyDefault(LogLevel);
default: break;
}
if (LatestVersion != Version)
{
StaticSaveConfig();
}
}
public static function Load(E_LogLevel LogLevel)
{
`Log_TraceStatic();
switch (Locs(default.SortPolicy))
{
case "counterasc": return;
case "counterdesc": return;
case "nameasc": return;
case "namedesc": return;
case "playtimetotalasc": return;
case "playtimetotaldesc": return;
case "playtimeavgasc": return;
case "playtimeavgdesc": return;
}
`Log_Error("Can't load SortPolicy (" $ default.SortPolicy $ "), must be one of: CounterAsc CounterDesc NameAsc NameDesc PlaytimeTotalAsc PlaytimeTotalDesc PlaytimeAvgAsc PlaytimeAvgDesc");
default.SortPolicy = "CounterDesc";
}
protected static function ApplyDefault(E_LogLevel LogLevel)
{
`Log_TraceStatic();
default.bEnable = false;
default.SortPolicy = "CounterDesc";
}
defaultproperties
{
}

View File

@ -1,57 +0,0 @@
class MapStat extends Object
config(MSKGS)
abstract;
var public config bool bEnable;
var public config String SortPolicy;
public static function InitConfig(int Version, int LatestVersion, E_LogLevel LogLevel)
{
`Log_TraceStatic();
switch (Version)
{
case `NO_CONFIG:
ApplyDefault(LogLevel);
default: break;
}
if (LatestVersion != Version)
{
StaticSaveConfig();
}
}
public static function Load(E_LogLevel LogLevel)
{
`Log_TraceStatic();
switch (Locs(default.SortPolicy))
{
case "counterasc": return;
case "counterdesc": return;
case "nameasc": return;
case "namedesc": return;
case "playtimetotalasc": return;
case "playtimetotaldesc": return;
case "playtimeavgasc": return;
case "playtimeavgdesc": return;
}
`Log_Error("Can't load SortPolicy (" $ default.SortPolicy $ "), must be one of: CounterAsc CounterDesc NameAsc NameDesc PlaytimeTotalAsc PlaytimeTotalDesc PlaytimeAvgAsc PlaytimeAvgDesc");
default.SortPolicy = "CounterDesc";
}
protected static function ApplyDefault(E_LogLevel LogLevel)
{
`Log_TraceStatic();
default.bEnable = false;
default.SortPolicy = "CounterDesc";
}
defaultproperties
{
}

View File

@ -0,0 +1,54 @@
class CfgLifespan extends Object
config(MSKGS)
abstract;
var public config int Weap;
var public config int Dosh;
public static function InitConfig(int Version, int LatestVersion, E_LogLevel LogLevel)
{
`Log_TraceStatic();
switch (Version)
{
case `NO_CONFIG:
ApplyDefault(LogLevel);
default: break;
}
if (LatestVersion != Version)
{
StaticSaveConfig();
}
}
public static function Load(E_LogLevel LogLevel)
{
`Log_TraceStatic();
if (default.Weap < 0)
{
`Log_Error("Weap" @ "(" $ default.Weap $ ")" @ "must be equal or greater than 0");
default.Weap = 60 * 60;
}
if (default.Dosh < 0)
{
`Log_Error("Dosh" @ "(" $ default.Dosh $ ")" @ "must be equal or greater than 0");
default.Dosh = 60 * 5;
}
}
protected static function ApplyDefault(E_LogLevel LogLevel)
{
`Log_TraceStatic();
default.Weap = 60 * 60; // 1 hour
default.Dosh = 60 * 5; // 5 min
}
defaultproperties
{
}

View File

@ -0,0 +1,57 @@
class CfgSpawnManager extends Object
config(MSKGS)
abstract;
var public config Array<int> MaxMonsters;
public static function InitConfig(int Version, int LatestVersion, E_LogLevel LogLevel)
{
`Log_TraceStatic();
switch (Version)
{
case `NO_CONFIG:
ApplyDefault(LogLevel);
default: break;
}
if (LatestVersion != Version)
{
StaticSaveConfig();
}
}
public static function Load(E_LogLevel LogLevel)
{
local int MM, PL;
`Log_TraceStatic();
foreach default.MaxMonsters(MM, PL)
{
if (MM <= 0)
{
`Log_Error("MaxMonsters[" $ PL $ "] =" @ MM @ "must be greater than 0");
default.MaxMonsters[PL] = 32;
}
}
}
protected static function ApplyDefault(E_LogLevel LogLevel)
{
`Log_TraceStatic();
default.MaxMonsters.Length = 0;
default.MaxMonsters.AddItem(12);
default.MaxMonsters.AddItem(18);
default.MaxMonsters.AddItem(24);
default.MaxMonsters.AddItem(30);
default.MaxMonsters.AddItem(34);
default.MaxMonsters.AddItem(36);
}
defaultproperties
{
}

View File

@ -0,0 +1,42 @@
class CfgSrvRank extends Object
config(MSKGS)
abstract;
var public config bool bCustom;
var public config bool bUsesStats;
public static function InitConfig(int Version, int LatestVersion, E_LogLevel LogLevel)
{
`Log_TraceStatic();
switch (Version)
{
case `NO_CONFIG:
ApplyDefault(LogLevel);
default: break;
}
if (LatestVersion != Version)
{
StaticSaveConfig();
}
}
public static function Load(E_LogLevel LogLevel)
{
`Log_TraceStatic();
}
protected static function ApplyDefault(E_LogLevel LogLevel)
{
`Log_TraceStatic();
default.bCustom = false;
default.bUsesStats = true;
}
defaultproperties
{
}

142
MskGs/Classes/CfgXPBoost.uc Normal file
View File

@ -0,0 +1,142 @@
class CfgXPBoost extends Object
config(MSKGS)
abstract;
var private config String OwnerId;
var private config String GroupID;
var public config int MaxBoost;
var public config int BoostOwner;
var public config int BoostAdmin;
var public config int BoostGroup;
var public config int BoostPlayer;
var public config int CheckGroupTimer;
public static function InitConfig(int Version, int LatestVersion, E_LogLevel LogLevel)
{
`Log_TraceStatic();
switch (Version)
{
case `NO_CONFIG:
ApplyDefault(LogLevel);
default: break;
}
if (LatestVersion != Version)
{
StaticSaveConfig();
}
}
public static function Load(E_LogLevel LogLevel)
{
`Log_TraceStatic();
if (default.MaxBoost < 0)
{
`Log_Error("MaxBoost" @ "(" $ default.MaxBoost $ ")" @ "must be equal or greater than 0");
default.MaxBoost = 30;
}
if (default.BoostOwner < 0)
{
`Log_Error("BoostOwner" @ "(" $ default.BoostOwner $ ")" @ "must be equal or greater than 0");
default.BoostOwner = 30;
}
if (default.BoostAdmin < 0)
{
`Log_Error("BoostAdmin" @ "(" $ default.BoostAdmin $ ")" @ "must be equal or greater than 0");
default.BoostAdmin = 20;
}
if (default.BoostGroup < 0)
{
`Log_Error("BoostGroup" @ "(" $ default.BoostGroup $ ")" @ "must be equal or greater than 0");
default.BoostGroup = 10;
}
if (default.BoostPlayer < 0)
{
`Log_Error("BoostPlayer" @ "(" $ default.BoostPlayer $ ")" @ "must be equal or greater than 0");
default.BoostPlayer = 0;
}
if (default.CheckGroupTimer < 0)
{
`Log_Error("CheckGroupTimer" @ "(" $ default.CheckGroupTimer $ ")" @ "must be equal or greater than 0");
default.CheckGroupTimer = 10;
}
}
public static function UniqueNetId LoadOwnerId(OnlineSubsystem OS, E_LogLevel LogLevel)
{
local UniqueNetId UID;
if (AnyToUID(OS, default.OwnerId, UID, LogLevel))
{
`Log_Debug("Loaded OwnerId:" @ default.OwnerId);
}
else
{
`Log_Warn("Can't load OwnerId:" @ default.OwnerId);
}
return UID;
}
public static function UniqueNetId LoadGroupID(OnlineSubsystem OS, E_LogLevel LogLevel)
{
local UniqueNetId UID;
if (AnyToUID(OS, default.GroupID, UID, LogLevel))
{
`Log_Debug("Loaded GroupID:" @ default.GroupID);
}
else
{
`Log_Warn("Can't load GroupID:" @ default.GroupID);
}
return UID;
}
protected static function ApplyDefault(E_LogLevel LogLevel)
{
`Log_TraceStatic();
default.OwnerId = "76561198001617867";
default.GroupID = "0x017000000223386E";
default.MaxBoost = 100;
default.BoostOwner = 30;
default.BoostAdmin = 20;
default.BoostGroup = 10;
default.BoostPlayer = 0;
default.CheckGroupTimer = 10;
}
private static function bool IsUID(String ID, E_LogLevel LogLevel)
{
`Log_TraceStatic();
return (Locs(Left(ID, 2)) == "0x");
}
private static function bool AnyToUID(OnlineSubsystem OS, String ID, out UniqueNetId UID, E_LogLevel LogLevel)
{
`Log_TraceStatic();
return IsUID(ID, LogLevel) ? OS.StringToUniqueNetId(ID, UID) : OS.Int64ToUniqueNetId(ID, UID);
}
defaultproperties
{
}

View File

@ -1,17 +1,28 @@
class MSKGS extends Info;
class MSKGS extends Info
config(MSKGS);
const LatestVersion = 1;
const CfgRemoveItems = class'RemoveItems';
const CfgLifespan = class'CfgLifespan';
const CfgSpawnManager = class'CfgSpawnManager';
const CfgXPBoost = class'CfgXPBoost';
const CfgSrvRank = class'CfgSrvRank';
var public int XPBoost;
var public bool XPNotifications;
var private config int Version;
var private config E_LogLevel LogLevel;
var private OnlineSubsystem OS;
var private KFGameInfo KFGI;
var private KFGameReplicationInfo KFGRI;
var private Array<MSKGS_RepInfo> RepInfos;
var private UniqueNetId OwnerID;
var private UniqueNetId GroupID;
public simulated function bool SafeDestroy()
{
`Log_Trace();
@ -56,7 +67,10 @@ private function PreInit()
SaveConfig();
}
CfgRemoveItems.static.InitConfig(Version, LatestVersion);
CfgLifespan.static.InitConfig(Version, LatestVersion, LogLevel);
CfgSpawnManager.static.InitConfig(Version, LatestVersion, LogLevel);
CfgXPBoost.static.InitConfig(Version, LatestVersion, LogLevel);
CfgSrvRank.static.InitConfig(Version, LatestVersion, LogLevel);
switch (Version)
{
@ -92,13 +106,25 @@ private function PreInit()
}
`Log_Base("LogLevel:" @ LogLevel);
RemoveItems = CfgRemoveItems.static.Load(LogLevel);
CfgLifespan.static.Load(LogLevel);
CfgSpawnManager.static.Load(LogLevel);
CfgXPBoost.static.Load(LogLevel);
CfgSrvRank.static.Load(LogLevel);
OS = class'GameEngine'.static.GetOnlineSubsystem();
if (OS == None)
{
`Log_Fatal("Can't get online subsystem!");
SafeDestroy();
return;
}
OwnerID = CfgXPBoost.static.LoadOwnerID(OS, LogLevel);
GroupID = CfgXPBoost.static.LoadGroupID(OS, LogLevel);
}
private function PostInit()
{
local MSKGS_RepInfo RepInfo;
`Log_Trace();
if (WorldInfo == None || WorldInfo.Game == None)
@ -128,6 +154,85 @@ private function PostInit()
SafeDestroy();
return;
}
if (MSKGS_GM_Endless(KFGI) != None)
{
XPNotifications = true;
MSKGS_GM_Endless(KFGI).MSKGS = Self;
MSKGS_GM_Endless(KFGI).LogLevel = LogLevel;
}
else if (MSKGS_GM_Objective(KFGI) != None)
{
XPNotifications = (KFGI.GameDifficulty != 3);
MSKGS_GM_Objective(KFGI).MSKGS = Self;
MSKGS_GM_Objective(KFGI).LogLevel = LogLevel;
}
else if (MSKGS_GM_Survival(KFGI) != None)
{
XPNotifications = (KFGI.GameDifficulty != 3);
MSKGS_GM_Survival(KFGI).MSKGS = Self;
MSKGS_GM_Survival(KFGI).LogLevel = LogLevel;
}
else if (MSKGS_GM_VersusSurvival(KFGI) != None)
{
XPNotifications = false;
MSKGS_GM_VersusSurvival(KFGI).MSKGS = Self;
MSKGS_GM_VersusSurvival(KFGI).LogLevel = LogLevel;
}
else if (MSKGS_GM_WeeklySurvival(KFGI) != None)
{
XPNotifications = true;
MSKGS_GM_WeeklySurvival(KFGI).MSKGS = Self;
MSKGS_GM_WeeklySurvival(KFGI).LogLevel = LogLevel;
}
ModifySpawnManager();
}
private function ModifySpawnManager()
{
local byte Difficulty, Players;
if (KFGI.SpawnManager == None)
{
SetTimer(1.f, false, nameof(ModifySpawnManager));
return;
}
for (Difficulty = 0; Difficulty < KFGI.SpawnManager.PerDifficultyMaxMonsters.Length; Difficulty++)
{
for (Players = 0; Players < KFGI.SpawnManager.PerDifficultyMaxMonsters[Difficulty].MaxMonsters.Length; Players++)
{
KFGI.SpawnManager.PerDifficultyMaxMonsters[Difficulty].MaxMonsters[Players] = CfgSpawnManager.default.MaxMonsters[Players];
}
}
}
public function ModifyLifespan(Actor A)
{
if (KFDroppedPickup_Cash(A) != None)
{
if (CfgLifespan.default.Dosh != 0)
{
A.Lifespan = float(CfgLifespan.default.Dosh);
}
}
else if (KFDroppedPickup(A) != None)
{
if (CfgLifespan.default.Weap != 0)
{
A.Lifespan = float(CfgLifespan.default.Weap);
}
}
}
public function SetMaxPlayers(int MaxPlayers)
{
if (MaxPlayers != INDEX_NONE)
{
KFGI.MaxPlayers = MaxPlayers;
KFGI.MaxPlayersAllowed = MaxPlayers;
}
}
public function NotifyLogin(Controller C)
@ -162,6 +267,11 @@ public function bool CreateRepInfo(Controller C)
if (RepInfo == None) return false;
RepInfo.LogLevel = LogLevel;
RepInfo.MSKGS = Self;
RepInfo.GroupID = GroupID;
RepInfo.ServerOwner = false;
RepInfos.AddItem(RepInfo);
return true;
@ -188,6 +298,119 @@ public function bool DestroyRepInfo(Controller C)
return false;
}
public function IncreaseXPBoost(KFPlayerController Booster)
{
local MSKGS_RepInfo RepInfo;
UpdateXPBoost();
foreach RepInfos(RepInfo)
{
if (RepInfo.Owner == Booster)
{
// TODO: Recive localized message
// You give boost to this server
}
else
{
// TODO: Recive localized message
// Booster give boost to this server
}
}
KFGI.UpdateGameSettings();
}
public function DecreaseXPBoost(KFPlayerController Booster)
{
local MSKGS_RepInfo RepInfo;
UpdateXPBoost();
foreach RepInfos(RepInfo)
{
if (RepInfo.Owner != Booster)
{
// TODO: Recive localized message
// Booster left the game
}
}
KFGI.UpdateGameSettings();
}
public function UpdateXPBoost()
{
local MSKGS_RepInfo RepInfo;
local int NextBoost;
NextBoost = 0;
foreach RepInfos(RepInfo)
{
NextBoost += RepInfo.XPBoost();
}
XPBoost = NextBoost;
}
/*
function AddMskGsMember(Controller C)
{
MskGsMemberList.AddItem(C);
if (XpNotifications)
{
if (MskGsMemberList.Length >= 10)
{
if (C.PlayerReplicationInfo != NONE)
WorldInfo.Game.Broadcast(C, C.PlayerReplicationInfo.PlayerName$" gives a boost to this server! XP bonus: +100% (MAX!)");
else
WorldInfo.Game.Broadcast(C, "XP bonus: +100% (MAX!)");
}
else
{
if (C.PlayerReplicationInfo != NONE)
WorldInfo.Game.Broadcast(C, C.PlayerReplicationInfo.PlayerName$" gives a boost to this server! XP bonus: +"$string(MskGsMemberList.Length * 10)$"%");
else
WorldInfo.Game.Broadcast(C, "XP bonus: +"$string(MskGsMemberList.Length * 10)$"%");
}
}
MyKFGI.UpdateGameSettings();
}
function DelMskGsMember(Controller C)
{
Initialize();
if (MskGsMemberList.Find(C) != INDEX_NONE)
{
MskGsMemberList.RemoveItem(C);
if (XpNotifications)
{
if (MskGsMemberList.Length >= 10)
{
if (C.PlayerReplicationInfo != NONE)
WorldInfo.Game.Broadcast(C, C.PlayerReplicationInfo.PlayerName$" left the game. XP bonus: +100% (MAX!)");
else
WorldInfo.Game.Broadcast(C, "XP bonus: +100% (MAX!)");
}
else if (MskGsMemberList.Length > 0)
{
if (C.PlayerReplicationInfo != NONE)
WorldInfo.Game.Broadcast(C, C.PlayerReplicationInfo.PlayerName$" left the game. XP bonus: +"$string(MskGsMemberList.Length * 10)$"%");
else
WorldInfo.Game.Broadcast(C, "XP bonus: +"$string(MskGsMemberList.Length * 10)$"%");
}
else
{
if (C.PlayerReplicationInfo != NONE)
WorldInfo.Game.Broadcast(C, C.PlayerReplicationInfo.PlayerName$" left the game. No XP bonus now.");
else
WorldInfo.Game.Broadcast(C, "No XP bonus now.");
}
}
MyKFGI.UpdateGameSettings();
}
}
*/
DefaultProperties
{

View File

@ -3,7 +3,8 @@ class MSKGS_GM_Endless extends KFGameInfo_Endless;
const GI = class'MSKGS_GameInfo';
const GIC = "KFGameContent.KFGameInfo_Endless";
var public MSKGS_Mut Mut;
var public MSKGS MSKGS;
var public E_LogLevel LogLevel;
public simulated function ExileServerUsingKickBan()
{
@ -12,12 +13,12 @@ public simulated function ExileServerUsingKickBan()
public function UpdateGameSettings()
{
GI.static.UpdateGameSettings(Self, GIC, Mut);
GI.static.UpdateGameSettings(Self, GIC, MSKGS);
}
protected function DistributeMoneyAndXP(class<KFPawn_Monster> MonsterClass, const out array<DamageInfo> DamageHistory, Controller Killer)
{
Super.DistributeMoneyAndXP(GI.static.PickProxyZed(MonsterClass, Mut), DamageHistory, Killer);
Super.DistributeMoneyAndXP(GI.static.PickProxyZed(MonsterClass, MSKGS), DamageHistory, Killer);
}
defaultproperties

View File

@ -3,7 +3,8 @@ class MSKGS_GM_Objective extends KFGameInfo_Objective;
const GI = class'MSKGS_GameInfo';
const GIC = "KFGameContent.KFGameInfo_Objective";
var public MSKGSMut Mut;
var public MSKGS MSKGS;
var public E_LogLevel LogLevel;
simulated function ExileServerUsingKickBan()
{
@ -12,12 +13,12 @@ simulated function ExileServerUsingKickBan()
public function UpdateGameSettings()
{
GI.static.UpdateGameSettings(Self, GIC, Mut);
GI.static.UpdateGameSettings(Self, GIC, MSKGS);
}
protected function DistributeMoneyAndXP(class<KFPawn_Monster> MonsterClass, const out array<DamageInfo> DamageHistory, Controller Killer)
{
Super.DistributeMoneyAndXP(GI.static.PickProxyZed(MonsterClass, Mut), DamageHistory, Killer);
Super.DistributeMoneyAndXP(GI.static.PickProxyZed(MonsterClass, MSKGS), DamageHistory, Killer);
}
defaultproperties

View File

@ -3,7 +3,8 @@ class MSKGS_GM_Survival extends KFGameInfo_Survival;
const GI = class'MSKGS_GameInfo';
const GIC = "KFGameContent.KFGameInfo_Survival";
var public MSKGSMut Mut;
var public MSKGS MSKGS;
var public E_LogLevel LogLevel;
simulated function ExileServerUsingKickBan()
{
@ -12,12 +13,12 @@ simulated function ExileServerUsingKickBan()
public function UpdateGameSettings()
{
GI.static.UpdateGameSettings(Self, GIC, Mut);
GI.static.UpdateGameSettings(Self, GIC, MSKGS);
}
protected function DistributeMoneyAndXP(class<KFPawn_Monster> MonsterClass, const out array<DamageInfo> DamageHistory, Controller Killer)
{
Super.DistributeMoneyAndXP(GI.static.PickProxyZed(MonsterClass, Mut), DamageHistory, Killer);
Super.DistributeMoneyAndXP(GI.static.PickProxyZed(MonsterClass, MSKGS), DamageHistory, Killer);
}
defaultproperties

View File

@ -3,7 +3,8 @@ class MSKGS_GM_VersusSurvival extends KFGameInfo_VersusSurvival;
const GI = class'MSKGS_GameInfo';
const GIC = "KFGameContent.KFGameInfo_VersusSurvival";
var public MSKGSMut Mut;
var public MSKGS MSKGS;
var public E_LogLevel LogLevel;
simulated function ExileServerUsingKickBan()
{
@ -12,12 +13,12 @@ simulated function ExileServerUsingKickBan()
public function UpdateGameSettings()
{
GI.static.UpdateGameSettings(Self, GIC, Mut);
GI.static.UpdateGameSettings(Self, GIC, MSKGS);
}
protected function DistributeMoneyAndXP(class<KFPawn_Monster> MonsterClass, const out array<DamageInfo> DamageHistory, Controller Killer)
{
Super.DistributeMoneyAndXP(GI.static.PickProxyZed(MonsterClass, Mut), DamageHistory, Killer);
Super.DistributeMoneyAndXP(GI.static.PickProxyZed(MonsterClass, MSKGS), DamageHistory, Killer);
}
defaultproperties

View File

@ -3,7 +3,8 @@ class MSKGS_GM_WeeklySurvival extends KFGameInfo_WeeklySurvival;
const GI = class'MSKGS_GameInfo';
const GIC = "KFGameContent.KFGameInfo_WeeklySurvival";
var public MSKGSMut Mut;
var public MSKGS MSKGS;
var public E_LogLevel LogLevel;
simulated function ExileServerUsingKickBan()
{
@ -12,12 +13,12 @@ simulated function ExileServerUsingKickBan()
public function UpdateGameSettings()
{
GI.static.UpdateGameSettings(Self, GIC, Mut);
GI.static.UpdateGameSettings(Self, GIC, MSKGS);
}
protected function DistributeMoneyAndXP(class<KFPawn_Monster> MonsterClass, const out array<DamageInfo> DamageHistory, Controller Killer)
{
Super.DistributeMoneyAndXP(GI.static.PickProxyZed(MonsterClass, Mut), DamageHistory, Killer);
Super.DistributeMoneyAndXP(GI.static.PickProxyZed(MonsterClass, MSKGS), DamageHistory, Killer);
}
defaultproperties

View File

@ -1,6 +1,9 @@
class MSKGS_GameInfo extends Object;
public static function UpdateGameSettings(KFGameInfo_Survival KFGI, string GameModeClass, MSKGS_Mut Mut)
const CfgXPBoost = class'CfgXPBoost';
const CfgSrvRank = class'CfgSrvRank';
public static function UpdateGameSettings(KFGameInfo_Survival KFGI, string GameModeClass, MSKGS MSKGS)
{
local name SessionName;
local KFOnlineGameSettings KFGameSettings;
@ -45,30 +48,30 @@ public static function UpdateGameSettings(KFGameInfo_Survival KFGI, string GameM
if (KFGI.MyKFGRI != None)
{
KFGameSettings.NumWaves = KFGI.MyKFGRI.GetFinalWaveNum();
KFGI.MyKFGRI.bCustom = False;
KFGI.MyKFGRI.bCustom = CfgSrvRank.default.bCustom;
}
else
{
KFGameSettings.NumWaves = KFGI.WaveMax - 1;
}
if (Mut == None || !Mut.bXpNotifications || Mut.MskGsMemberList.Length == 0)
if (MSKGS == None || !MSKGS.XPNotifications || MSKGS.XPBoost <= 0)
{
KFGameSettings.OwningPlayerName = class'GameReplicationInfo'.default.ServerName;
}
else if (Mut.MskGsMemberList.Length > 10)
else if (MSKGS.XPBoost >= CfgXPBoost.default.MaxBoost)
{
KFGameSettings.OwningPlayerName = class'GameReplicationInfo'.default.ServerName $ " | +100% XP";
KFGameSettings.OwningPlayerName = class'GameReplicationInfo'.default.ServerName $ " | +" $ CfgXPBoost.default.MaxBoost $ "% XP";
}
else
{
KFGameSettings.OwningPlayerName = class'GameReplicationInfo'.default.ServerName $ " | +" $ (Mut.MskGsMemberList.Length * 10) $ "% XP";
KFGameSettings.OwningPlayerName = class'GameReplicationInfo'.default.ServerName $ " | +" $ MSKGS.XPBoost $ "% XP";
}
KFGameSettings.NumPublicConnections = KFGI.MaxPlayersAllowed;
KFGameSettings.bRequiresPassword = KFGI.RequiresPassword();
KFGameSettings.bCustom = false;
KFGameSettings.bUsesStats = true;
KFGameSettings.bCustom = CfgSrvRank.default.bCustom;
KFGameSettings.bUsesStats = CfgSrvRank.default.bUsesStats;
KFGameSettings.NumSpectators = KFGI.NumSpectators;
if (KFGI.WorldInfo.IsConsoleDedicatedServer() || KFGI.WorldInfo.IsEOSDedicatedServer())
@ -102,18 +105,15 @@ public static function UpdateGameSettings(KFGameInfo_Survival KFGI, string GameM
}
}
public static function class<KFPawn_Monster> PickProxyZed(class<KFPawn_Monster> MonsterClass, MSKGS_Mut Mut)
public static function class<KFPawn_Monster> PickProxyZed(class<KFPawn_Monster> MonsterClass, MSKGS MSKGS)
{
local String SMC;
local Name NMC;
local int Boost;
SMC = String(MonsterClass);
NMC = Name(SMC);
Boost = (Mut == None) ? 0 : Mut.MskGsMemberList.Length;
switch (Boost)
switch (MSKGS.XPBoost)
{
case 0: return MonsterClass;
case 10: return PickProxyZed010(NMC, MonsterClass);

View File

@ -1,180 +1,44 @@
class MSKGS_Mut extends KFMutator
config(MSKGS);
const CurrentVersion = 3;
var config int ConfigVersion;
var private MSKGS MSKGS;
var config int WeapLifespan;
var config int DoshLifespan;
var config array<string> AdminList;
var config array<int> PerPlayerMaxMonsters;
var public bool bXpNotifications;
var bool bInitialized;
var array<MskGsRepInfo> RepClients;
var array<Controller> MskGsMemberList;
var array<UniqueNetId> AdminUIDList;
function InitMutator(string Options, out string ErrorMessage)
public simulated function bool SafeDestroy()
{
local int MaxPlayers, MaxPlayersAllowed;
super.InitMutator(Options, ErrorMessage);
if (MyKFGI == none)
{
`log("[MskGsMut] Error: can't init, MyKFGI is none");
return;
return (bPendingDelete || bDeleteMe || Destroy());
}
MaxPlayers = Clamp(MyKFGI.GetIntOption(Options, "MaxPlayers", MaxPlayers), 6, 128);
MaxPlayersAllowed = MaxPlayers;
MyKFGI.MaxPlayers = MaxPlayers;
MyKFGI.MaxPlayersAllowed = MaxPlayersAllowed;
}
public event PreBeginPlay()
{
Super.PreBeginPlay();
function InitConfig()
if (WorldInfo.NetMode == NM_Client) return;
foreach WorldInfo.DynamicActors(class'MSKGS', MSKGS)
{
// Update from config version to current version if needed
switch (ConfigVersion)
{
case 0: // which means there is no config right now
WeapLifespan = 60 * 60;
case 1:
if (PerPlayerMaxMonsters.Length != 6)
{
PerPlayerMaxMonsters.Length = 0;
PerPlayerMaxMonsters.AddItem(12);
PerPlayerMaxMonsters.AddItem(18);
PerPlayerMaxMonsters.AddItem(24);
PerPlayerMaxMonsters.AddItem(32);
PerPlayerMaxMonsters.AddItem(34);
PerPlayerMaxMonsters.AddItem(36);
}
case 2:
if (DoshLifespan == 0)
{
DoshLifespan = 60 * 5;
}
case 2147483647:
`log("[MskGsMut] Config updated to version"@CurrentVersion);
break;
case CurrentVersion:
`log("[MskGsMut] Config is up-to-date");
break;
default:
`log("[MskGsMut] Warn: The config version is higher than the current version");
`log("[MskGsMut] Warn: Config version is"@ConfigVersion@"but current version is"@CurrentVersion);
`log("[MskGsMut] Warn: The config version will be changed to "@CurrentVersion);
break;
}
ConfigVersion = CurrentVersion;
SaveConfig();
}
simulated event PostBeginPlay()
if (MSKGS == None)
{
super.PostBeginPlay();
Initialize();
MSKGS = WorldInfo.Spawn(class'MSKGS');
}
function Initialize()
if (MSKGS == None)
{
local MskGsVoteCollector VoteCollector;
local OnlineSubsystem steamworks;
local string Person;
local UniqueNetId PersonUID;
`Log_Base("FATAL: Can't Spawn 'MSKGS'");
SafeDestroy();
}
}
if (bInitialized) return;
if (MyKFGI == None || MyKFGI.MyKFGRI == None)
public function InitMutator(String Options, out String ErrorMessage)
{
SetTimer(1.f, false, nameof(Initialize));
return;
Super.InitMutator(Options, ErrorMessage);
MSKGS.SetMaxPlayers(class'GameInfo'.static.GetIntOption(Options, "MaxPlayers", INDEX_NONE));
}
bInitialized = true;
InitConfig();
MyKFGI.KFGFxManagerClass = class'MskGsGFxMoviePlayer_Manager';
MyKFGI.MyKFGRI.VoteCollectorClass = class'MskGsVoteCollector';
MyKFGI.MyKFGRI.VoteCollector = new(MyKFGI.MyKFGRI) MyKFGI.MyKFGRI.VoteCollectorClass;
VoteCollector = MskGsVoteCollector(MyKFGI.MyKFGRI.VoteCollector);
VoteCollector.bEnableMapStats = bEnableMapStats;
VoteCollector.bOfficialNextMapOnly = bOfficialNextMapOnly;
VoteCollector.bRandomizeNextMap = bRandomizeNextMap;
VoteCollector.SortPolicy = SortStats;
if (MskGs_Endless(MyKFGI) != None)
{
bXpNotifications = true;
MskGs_Endless(MyKFGI).Mut = Self;
}
else if (MskGs_Objective(MyKFGI) != None)
{
bXpNotifications = (MyKFGI.GameDifficulty != 3);
MskGs_Objective(MyKFGI).Mut = Self;
}
else if (MskGs_Survival(MyKFGI) != None)
{
bXpNotifications = (MyKFGI.GameDifficulty != 3);
MskGs_Survival(MyKFGI).Mut = Self;
}
else if (MskGs_VersusSurvival(MyKFGI) != None)
{
bXpNotifications = false;
MskGs_VersusSurvival(MyKFGI).Mut = Self;
}
else if (MskGs_WeeklySurvival(MyKFGI) != None)
{
bXpNotifications = true;
MskGs_WeeklySurvival(MyKFGI).Mut = Self;
}
steamworks = class'GameEngine'.static.GetOnlineSubsystem();
foreach AdminList(Person)
{
if (IsUID(Person) && steamworks.StringToUniqueNetId(Person, PersonUID))
{
if (AdminUIDList.Find('Uid', PersonUID.Uid) == -1)
AdminUIDList.AddItem(PersonUID);
}
else if (steamworks.Int64ToUniqueNetId(Person, PersonUID))
{
if (AdminUIDList.Find('Uid', PersonUID.Uid) == -1)
AdminUIDList.AddItem(PersonUID);
}
else `Log("[MskGsMut] WARN: Can't add admin:"@Person);
}
ModifySpawnManager();
`Log("[MskGsMut] Mutator loaded.");
}
function ModifySpawnManager()
{
local int i, j;
if (MyKFGI.SpawnManager == None)
{
SetTimer(1.f, false, nameof(ModifySpawnManager));
return;
}
for (i = 0; i < MyKFGI.SpawnManager.PerDifficultyMaxMonsters.Length; i++)
for (j = 0; j < MyKFGI.SpawnManager.PerDifficultyMaxMonsters[i].MaxMonsters.Length; j++)
MyKFGI.SpawnManager.PerDifficultyMaxMonsters[i].MaxMonsters[j] = PerPlayerMaxMonsters[j];
}
function AddMutator(Mutator Mut)
public function AddMutator(Mutator Mut)
{
if (Mut == Self) return;
@ -184,133 +48,34 @@ function AddMutator(Mutator Mut)
Super.AddMutator(Mut);
}
private function bool IsUID(String ID)
public function bool CheckRelevance(Actor A)
{
return (Left(ID, 2) ~= "0x");
local bool Relevance;
Relevance = Super.CheckRelevance(A);
if (Relevance)
{
MSKGS.ModifyLifespan(A);
}
function bool CheckRelevance(Actor Other)
{
local bool SuperRelevant;
SuperRelevant = super.CheckRelevance(Other);
// if this actor is going to be destroyed, return now
if (!SuperRelevant)
{
return SuperRelevant;
return Relevance;
}
// otherwise modify dosh or weapon lifespan
if (KFDroppedPickup_Cash(Other) != None)
public function NotifyLogin(Controller C)
{
if (DoshLifespan != 0) Other.Lifespan = float(DoshLifespan);
}
else if (KFDroppedPickup(Other) != None)
{
if (WeapLifespan != 0) Other.Lifespan = float(WeapLifespan);
MSKGS.NotifyLogin(C);
Super.NotifyLogin(C);
}
return SuperRelevant;
}
function AddMskGsMember(Controller C)
public function NotifyLogout(Controller C)
{
MskGsMemberList.AddItem(C);
if (bXpNotifications)
{
if (MskGsMemberList.Length >= 10)
{
if (C.PlayerReplicationInfo != NONE)
WorldInfo.Game.Broadcast(C, C.PlayerReplicationInfo.PlayerName$" gives a boost to this server! XP bonus: +100% (MAX!)");
else
WorldInfo.Game.Broadcast(C, "XP bonus: +100% (MAX!)");
}
else
{
if (C.PlayerReplicationInfo != NONE)
WorldInfo.Game.Broadcast(C, C.PlayerReplicationInfo.PlayerName$" gives a boost to this server! XP bonus: +"$string(MskGsMemberList.Length * 10)$"%");
else
WorldInfo.Game.Broadcast(C, "XP bonus: +"$string(MskGsMemberList.Length * 10)$"%");
}
}
MyKFGI.UpdateGameSettings();
}
MSKGS.NotifyLogout(C);
function NotifyLogin(Controller C)
{
local MskGsRepInfo RepInfo;
if (C == None) return;
Initialize();
RepInfo = Spawn(class'MskGsRepInfo', KFPlayerController(C));
RepInfo.C = C;
RepInfo.Mut = Self;
RepClients.AddItem(RepInfo);
if (AdminUIDList.Find('Uid', C.PlayerReplicationInfo.UniqueId.Uid) != -1)
C.PlayerReplicationInfo.bAdmin = true;
super.NotifyLogin(C);
}
function NotifyLogout(Controller C)
{
local MskGsVoteCollector VoteCollector;
local int i;
if (C == None) return;
Initialize();
VoteCollector = MskGsVoteCollector(MyKFGI.MyKFGRI.VoteCollector);
VoteCollector.NotifyLogout(C);
if (MskGsMemberList.Find(C) != INDEX_NONE)
{
MskGsMemberList.RemoveItem(C);
if (bXpNotifications)
{
if (MskGsMemberList.Length >= 10)
{
if (C.PlayerReplicationInfo != NONE)
WorldInfo.Game.Broadcast(C, C.PlayerReplicationInfo.PlayerName$" left the game. XP bonus: +100% (MAX!)");
else
WorldInfo.Game.Broadcast(C, "XP bonus: +100% (MAX!)");
}
else if (MskGsMemberList.Length > 0)
{
if (C.PlayerReplicationInfo != NONE)
WorldInfo.Game.Broadcast(C, C.PlayerReplicationInfo.PlayerName$" left the game. XP bonus: +"$string(MskGsMemberList.Length * 10)$"%");
else
WorldInfo.Game.Broadcast(C, "XP bonus: +"$string(MskGsMemberList.Length * 10)$"%");
}
else
{
if (C.PlayerReplicationInfo != NONE)
WorldInfo.Game.Broadcast(C, C.PlayerReplicationInfo.PlayerName$" left the game. No XP bonus now.");
else
WorldInfo.Game.Broadcast(C, "No XP bonus now.");
}
}
MyKFGI.UpdateGameSettings();
}
for (i = RepClients.Length - 1; i >= 0; i--)
{
if (RepClients[i].C == C)
{
RepClients[i].Destroy();
RepClients.Remove(i, 1);
}
}
super.NotifyLogout(C);
Super.NotifyLogout(C);
}
defaultproperties
{
bInitialized=false
}

View File

@ -1,78 +1,123 @@
class MskGsRepInfo extends ReplicationInfo;
class MSKGS_RepInfo extends ReplicationInfo;
const GroupUIDStr = "0x017000000223386E";
const MaxRetries = 10;
const TimerDelay = 1.0f;
const CfgXPBoost = class'CfgXPBoost';
// Server vars
var public MskGsMut Mut;
var public Controller C;
var private int ServerApplyMembershipRetries;
var public E_LogLevel LogLevel;
var public MSKGS MSKGS;
var public UniqueNetId GroupID;
var public float CheckGroupTimer;
// Client vars
var private OnlineSubsystemSteamworks SW;
var private int ClientGetOnlineSubsystemRetries;
var private KFPlayerController KFPC;
var private OnlineSubsystem OS;
simulated event PostBeginPlay()
var public bool ServerOwner;
var private bool GroupMember;
replication
{
super.PostBeginPlay();
if (bNetInitial && Role == ROLE_Authority)
LogLevel, GroupID, CheckGroupTimer;
}
if (bDeleteMe) return;
public simulated function bool SafeDestroy()
{
`Log_Trace();
return (bPendingDelete || bDeleteMe || Destroy());
}
public simulated event PreBeginPlay()
{
`Log_Trace();
if (Role < ROLE_Authority || WorldInfo.NetMode == NM_StandAlone)
{
ClientGetOnlineSubsystem();
}
}
private reliable client function ClientGetOnlineSubsystem()
OS = class'GameEngine'.static.GetOnlineSubsystem();
if (OS != None)
{
if (SW == None)
{
SW = OnlineSubsystemSteamworks(class'GameEngine'.static.GetOnlineSubsystem());
}
if (SW == None && ClientGetOnlineSubsystemRetries < MaxRetries)
{
ClientGetOnlineSubsystemRetries++;
SetTimer(TimerDelay, false, nameof(ClientGetOnlineSubsystem));
CheckGroupMembership();
}
else
{
ClearTimer(nameof(ClientGetOnlineSubsystem));
if (SW != None) ClientGetMembership();
`Log_Error("Can't get online subsystem!");
}
}
private reliable client function ClientGetMembership()
Super.PreBeginPlay();
}
public simulated event PostBeginPlay()
{
local UniqueNetId GroupID;
class'OnlineSubsystem'.Static.StringToUniqueNetId(GroupUIDStr, GroupID);
if (SW.CheckPlayerGroup(GroupID)) ServerApplyMembership();
`Log_Trace();
if (bPendingDelete || bDeleteMe) return;
Super.PostBeginPlay();
}
private simulated reliable server function ServerApplyMembership()
private simulated function CheckGroupMembership()
{
if ((Mut == None || C == None) && ServerApplyMembershipRetries < MaxRetries)
if (OS.CheckPlayerGroup(GroupID))
{
ServerApplyMembershipRetries++;
SetTimer(TimerDelay, false, nameof(ServerApplyMembership));
return;
ClearTimer(nameof(CheckGroupMembership));
ServerApplyMembership();
}
ClearTimer(nameof(ServerApplyMembership));
if (Mut != None && C != None) Mut.AddMskGsMember(C);
}
DefaultProperties
else if (CheckGroupTimer > 0.0f && !IsTimerActive(nameof(CheckGroupMembership)))
{
bAlwaysRelevant = false;
bOnlyRelevantToOwner = true;
Role = ROLE_Authority;
RemoteRole = ROLE_SimulatedProxy;
bSkipActorPropertyReplication = false;
ServerApplyMembershipRetries = 0
ClientGetOnlineSubsystemRetries = 0
SetTimer(CheckGroupTimer, true, nameof(CheckGroupMembership));
}
}
private reliable server function ServerApplyMembership()
{
GroupMember = true;
MSKGS.IncreaseXPBoost(GetKFPC());
}
public function int XPBoost()
{
`Log_Trace();
if (ServerOwner)
{
return CfgXPBoost.default.BoostOwner;
}
if (GetKFPC() != None && GetKFPC().PlayerReplicationInfo != None && GetKFPC().PlayerReplicationInfo.bAdmin)
{
return CfgXPBoost.default.BoostAdmin;
}
if (GroupMember)
{
return CfgXPBoost.default.BoostGroup;
}
return CfgXPBoost.default.BoostPlayer;
}
private simulated function KFPlayerController GetKFPC()
{
`Log_Trace();
if (KFPC != None) return KFPC;
KFPC = KFPlayerController(Owner);
if (KFPC == None && ROLE < ROLE_Authority)
{
KFPC = KFPlayerController(GetALocalPlayerController());
}
return KFPC;
}
defaultproperties
{
bAlwaysRelevant = false
bOnlyRelevantToOwner = true
bSkipActorPropertyReplication = false
GroupMember = false;
ServerOwner = false;
}

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloatKingSubspawn_010 extends Proxy_KFPawn_ZedBloatKingSubspawn_010;
class Proxy_KFPawn_ZedBloatKingSubspawn_010 extends KFPawn_ZedBloatKingSubspawn;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloatKingSubspawn_020 extends Proxy_KFPawn_ZedBloatKingSubspawn_020;
class Proxy_KFPawn_ZedBloatKingSubspawn_020 extends KFPawn_ZedBloatKingSubspawn;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloatKingSubspawn_030 extends Proxy_KFPawn_ZedBloatKingSubspawn_030;
class Proxy_KFPawn_ZedBloatKingSubspawn_030 extends KFPawn_ZedBloatKingSubspawn;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloatKingSubspawn_040 extends Proxy_KFPawn_ZedBloatKingSubspawn_040;
class Proxy_KFPawn_ZedBloatKingSubspawn_040 extends KFPawn_ZedBloatKingSubspawn;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloatKingSubspawn_050 extends Proxy_KFPawn_ZedBloatKingSubspawn_050;
class Proxy_KFPawn_ZedBloatKingSubspawn_050 extends KFPawn_ZedBloatKingSubspawn;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloatKingSubspawn_060 extends Proxy_KFPawn_ZedBloatKingSubspawn_060;
class Proxy_KFPawn_ZedBloatKingSubspawn_060 extends KFPawn_ZedBloatKingSubspawn;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloatKingSubspawn_070 extends Proxy_KFPawn_ZedBloatKingSubspawn_070;
class Proxy_KFPawn_ZedBloatKingSubspawn_070 extends KFPawn_ZedBloatKingSubspawn;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloatKingSubspawn_080 extends Proxy_KFPawn_ZedBloatKingSubspawn_080;
class Proxy_KFPawn_ZedBloatKingSubspawn_080 extends KFPawn_ZedBloatKingSubspawn;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloatKingSubspawn_090 extends Proxy_KFPawn_ZedBloatKingSubspawn_090;
class Proxy_KFPawn_ZedBloatKingSubspawn_090 extends KFPawn_ZedBloatKingSubspawn;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloatKingSubspawn_100 extends Proxy_KFPawn_ZedBloatKingSubspawn_100;
class Proxy_KFPawn_ZedBloatKingSubspawn_100 extends KFPawn_ZedBloatKingSubspawn;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloatKing_010 extends Proxy_KFPawn_ZedBloatKing_010;
class Proxy_KFPawn_ZedBloatKing_010 extends KFPawn_ZedBloatKing;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloatKing_020 extends Proxy_KFPawn_ZedBloatKing_020;
class Proxy_KFPawn_ZedBloatKing_020 extends KFPawn_ZedBloatKing;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloatKing_030 extends Proxy_KFPawn_ZedBloatKing_030;
class Proxy_KFPawn_ZedBloatKing_030 extends KFPawn_ZedBloatKing;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloatKing_040 extends Proxy_KFPawn_ZedBloatKing_040;
class Proxy_KFPawn_ZedBloatKing_040 extends KFPawn_ZedBloatKing;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloatKing_050 extends Proxy_KFPawn_ZedBloatKing_050;
class Proxy_KFPawn_ZedBloatKing_050 extends KFPawn_ZedBloatKing;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloatKing_060 extends Proxy_KFPawn_ZedBloatKing_060;
class Proxy_KFPawn_ZedBloatKing_060 extends KFPawn_ZedBloatKing;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloatKing_070 extends Proxy_KFPawn_ZedBloatKing_070;
class Proxy_KFPawn_ZedBloatKing_070 extends KFPawn_ZedBloatKing;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloatKing_080 extends Proxy_KFPawn_ZedBloatKing_080;
class Proxy_KFPawn_ZedBloatKing_080 extends KFPawn_ZedBloatKing;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloatKing_090 extends Proxy_KFPawn_ZedBloatKing_090;
class Proxy_KFPawn_ZedBloatKing_090 extends KFPawn_ZedBloatKing;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloatKing_100 extends Proxy_KFPawn_ZedBloatKing_100;
class Proxy_KFPawn_ZedBloatKing_100 extends KFPawn_ZedBloatKing;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloatKing_SantasWorkshop_010 extends Proxy_KFPawn_ZedBloatKing_SantasWorkshop_010;
class Proxy_KFPawn_ZedBloatKing_SantasWorkshop_010 extends KFPawn_ZedBloatKing_SantasWorkshop;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloatKing_SantasWorkshop_020 extends Proxy_KFPawn_ZedBloatKing_SantasWorkshop_020;
class Proxy_KFPawn_ZedBloatKing_SantasWorkshop_020 extends KFPawn_ZedBloatKing_SantasWorkshop;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloatKing_SantasWorkshop_030 extends Proxy_KFPawn_ZedBloatKing_SantasWorkshop_030;
class Proxy_KFPawn_ZedBloatKing_SantasWorkshop_030 extends KFPawn_ZedBloatKing_SantasWorkshop;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloatKing_SantasWorkshop_040 extends Proxy_KFPawn_ZedBloatKing_SantasWorkshop_040;
class Proxy_KFPawn_ZedBloatKing_SantasWorkshop_040 extends KFPawn_ZedBloatKing_SantasWorkshop;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloatKing_SantasWorkshop_050 extends Proxy_KFPawn_ZedBloatKing_SantasWorkshop_050;
class Proxy_KFPawn_ZedBloatKing_SantasWorkshop_050 extends KFPawn_ZedBloatKing_SantasWorkshop;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloatKing_SantasWorkshop_060 extends Proxy_KFPawn_ZedBloatKing_SantasWorkshop_060;
class Proxy_KFPawn_ZedBloatKing_SantasWorkshop_060 extends KFPawn_ZedBloatKing_SantasWorkshop;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloatKing_SantasWorkshop_070 extends Proxy_KFPawn_ZedBloatKing_SantasWorkshop_070;
class Proxy_KFPawn_ZedBloatKing_SantasWorkshop_070 extends KFPawn_ZedBloatKing_SantasWorkshop;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloatKing_SantasWorkshop_080 extends Proxy_KFPawn_ZedBloatKing_SantasWorkshop_080;
class Proxy_KFPawn_ZedBloatKing_SantasWorkshop_080 extends KFPawn_ZedBloatKing_SantasWorkshop;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloatKing_SantasWorkshop_090 extends Proxy_KFPawn_ZedBloatKing_SantasWorkshop_090;
class Proxy_KFPawn_ZedBloatKing_SantasWorkshop_090 extends KFPawn_ZedBloatKing_SantasWorkshop;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloatKing_SantasWorkshop_100 extends Proxy_KFPawn_ZedBloatKing_SantasWorkshop_100;
class Proxy_KFPawn_ZedBloatKing_SantasWorkshop_100 extends KFPawn_ZedBloatKing_SantasWorkshop;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloat_010 extends Proxy_KFPawn_ZedBloat_010;
class Proxy_KFPawn_ZedBloat_010 extends KFPawn_ZedBloat;
DefaultProperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloat_020 extends Proxy_KFPawn_ZedBloat_020;
class Proxy_KFPawn_ZedBloat_020 extends KFPawn_ZedBloat;
DefaultProperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloat_030 extends Proxy_KFPawn_ZedBloat_030;
class Proxy_KFPawn_ZedBloat_030 extends KFPawn_ZedBloat;
DefaultProperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloat_040 extends Proxy_KFPawn_ZedBloat_040;
class Proxy_KFPawn_ZedBloat_040 extends KFPawn_ZedBloat;
DefaultProperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloat_050 extends Proxy_KFPawn_ZedBloat_050;
class Proxy_KFPawn_ZedBloat_050 extends KFPawn_ZedBloat;
DefaultProperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloat_060 extends Proxy_KFPawn_ZedBloat_060;
class Proxy_KFPawn_ZedBloat_060 extends KFPawn_ZedBloat;
DefaultProperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloat_070 extends Proxy_KFPawn_ZedBloat_070;
class Proxy_KFPawn_ZedBloat_070 extends KFPawn_ZedBloat;
DefaultProperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloat_080 extends Proxy_KFPawn_ZedBloat_080;
class Proxy_KFPawn_ZedBloat_080 extends KFPawn_ZedBloat;
DefaultProperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloat_090 extends Proxy_KFPawn_ZedBloat_090;
class Proxy_KFPawn_ZedBloat_090 extends KFPawn_ZedBloat;
DefaultProperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedBloat_100 extends Proxy_KFPawn_ZedBloat_100;
class Proxy_KFPawn_ZedBloat_100 extends KFPawn_ZedBloat;
DefaultProperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedClot_AlphaKing_010 extends Proxy_KFPawn_ZedClot_AlphaKing_010;
class Proxy_KFPawn_ZedClot_AlphaKing_010 extends KFPawn_ZedClot_AlphaKing;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedClot_AlphaKing_020 extends Proxy_KFPawn_ZedClot_AlphaKing_020;
class Proxy_KFPawn_ZedClot_AlphaKing_020 extends KFPawn_ZedClot_AlphaKing;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedClot_AlphaKing_030 extends Proxy_KFPawn_ZedClot_AlphaKing_030;
class Proxy_KFPawn_ZedClot_AlphaKing_030 extends KFPawn_ZedClot_AlphaKing;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedClot_AlphaKing_040 extends Proxy_KFPawn_ZedClot_AlphaKing_040;
class Proxy_KFPawn_ZedClot_AlphaKing_040 extends KFPawn_ZedClot_AlphaKing;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedClot_AlphaKing_050 extends Proxy_KFPawn_ZedClot_AlphaKing_050;
class Proxy_KFPawn_ZedClot_AlphaKing_050 extends KFPawn_ZedClot_AlphaKing;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedClot_AlphaKing_060 extends Proxy_KFPawn_ZedClot_AlphaKing_060;
class Proxy_KFPawn_ZedClot_AlphaKing_060 extends KFPawn_ZedClot_AlphaKing;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedClot_AlphaKing_070 extends Proxy_KFPawn_ZedClot_AlphaKing_070;
class Proxy_KFPawn_ZedClot_AlphaKing_070 extends KFPawn_ZedClot_AlphaKing;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedClot_AlphaKing_080 extends Proxy_KFPawn_ZedClot_AlphaKing_080;
class Proxy_KFPawn_ZedClot_AlphaKing_080 extends KFPawn_ZedClot_AlphaKing;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedClot_AlphaKing_090 extends Proxy_KFPawn_ZedClot_AlphaKing_090;
class Proxy_KFPawn_ZedClot_AlphaKing_090 extends KFPawn_ZedClot_AlphaKing;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedClot_AlphaKing_100 extends Proxy_KFPawn_ZedClot_AlphaKing_100;
class Proxy_KFPawn_ZedClot_AlphaKing_100 extends KFPawn_ZedClot_AlphaKing;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedClot_Cyst_010 extends Proxy_KFPawn_ZedClot_Cyst_010;
class Proxy_KFPawn_ZedClot_Cyst_010 extends KFPawn_ZedClot_Cyst;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedClot_Cyst_020 extends Proxy_KFPawn_ZedClot_Cyst_020;
class Proxy_KFPawn_ZedClot_Cyst_020 extends KFPawn_ZedClot_Cyst;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedClot_Cyst_030 extends Proxy_KFPawn_ZedClot_Cyst_030;
class Proxy_KFPawn_ZedClot_Cyst_030 extends KFPawn_ZedClot_Cyst;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedClot_Cyst_040 extends Proxy_KFPawn_ZedClot_Cyst_040;
class Proxy_KFPawn_ZedClot_Cyst_040 extends KFPawn_ZedClot_Cyst;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedClot_Cyst_050 extends Proxy_KFPawn_ZedClot_Cyst_050;
class Proxy_KFPawn_ZedClot_Cyst_050 extends KFPawn_ZedClot_Cyst;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedClot_Cyst_060 extends Proxy_KFPawn_ZedClot_Cyst_060;
class Proxy_KFPawn_ZedClot_Cyst_060 extends KFPawn_ZedClot_Cyst;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedClot_Cyst_070 extends Proxy_KFPawn_ZedClot_Cyst_070;
class Proxy_KFPawn_ZedClot_Cyst_070 extends KFPawn_ZedClot_Cyst;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedClot_Cyst_080 extends Proxy_KFPawn_ZedClot_Cyst_080;
class Proxy_KFPawn_ZedClot_Cyst_080 extends KFPawn_ZedClot_Cyst;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedClot_Cyst_090 extends Proxy_KFPawn_ZedClot_Cyst_090;
class Proxy_KFPawn_ZedClot_Cyst_090 extends KFPawn_ZedClot_Cyst;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedClot_Cyst_100 extends Proxy_KFPawn_ZedClot_Cyst_100;
class Proxy_KFPawn_ZedClot_Cyst_100 extends KFPawn_ZedClot_Cyst;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedClot_Slasher_010 extends Proxy_KFPawn_ZedClot_Slasher_010;
class Proxy_KFPawn_ZedClot_Slasher_010 extends KFPawn_ZedClot_Slasher;
DefaultProperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedClot_Slasher_020 extends Proxy_KFPawn_ZedClot_Slasher_020;
class Proxy_KFPawn_ZedClot_Slasher_020 extends KFPawn_ZedClot_Slasher;
DefaultProperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedClot_Slasher_030 extends Proxy_KFPawn_ZedClot_Slasher_030;
class Proxy_KFPawn_ZedClot_Slasher_030 extends KFPawn_ZedClot_Slasher;
DefaultProperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedClot_Slasher_040 extends Proxy_KFPawn_ZedClot_Slasher_040;
class Proxy_KFPawn_ZedClot_Slasher_040 extends KFPawn_ZedClot_Slasher;
DefaultProperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedClot_Slasher_050 extends Proxy_KFPawn_ZedClot_Slasher_050;
class Proxy_KFPawn_ZedClot_Slasher_050 extends KFPawn_ZedClot_Slasher;
DefaultProperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedClot_Slasher_060 extends Proxy_KFPawn_ZedClot_Slasher_060;
class Proxy_KFPawn_ZedClot_Slasher_060 extends KFPawn_ZedClot_Slasher;
DefaultProperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedClot_Slasher_070 extends Proxy_KFPawn_ZedClot_Slasher_070;
class Proxy_KFPawn_ZedClot_Slasher_070 extends KFPawn_ZedClot_Slasher;
DefaultProperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedClot_Slasher_080 extends Proxy_KFPawn_ZedClot_Slasher_080;
class Proxy_KFPawn_ZedClot_Slasher_080 extends KFPawn_ZedClot_Slasher;
DefaultProperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedClot_Slasher_090 extends Proxy_KFPawn_ZedClot_Slasher_090;
class Proxy_KFPawn_ZedClot_Slasher_090 extends KFPawn_ZedClot_Slasher;
DefaultProperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedClot_Slasher_100 extends Proxy_KFPawn_ZedClot_Slasher_100;
class Proxy_KFPawn_ZedClot_Slasher_100 extends KFPawn_ZedClot_Slasher;
DefaultProperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedCrawlerKing_010 extends Proxy_KFPawn_ZedCrawlerKing_010;
class Proxy_KFPawn_ZedCrawlerKing_010 extends KFPawn_ZedCrawlerKing;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedCrawlerKing_020 extends Proxy_KFPawn_ZedCrawlerKing_020;
class Proxy_KFPawn_ZedCrawlerKing_020 extends KFPawn_ZedCrawlerKing;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedCrawlerKing_030 extends Proxy_KFPawn_ZedCrawlerKing_030;
class Proxy_KFPawn_ZedCrawlerKing_030 extends KFPawn_ZedCrawlerKing;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedCrawlerKing_040 extends Proxy_KFPawn_ZedCrawlerKing_040;
class Proxy_KFPawn_ZedCrawlerKing_040 extends KFPawn_ZedCrawlerKing;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedCrawlerKing_050 extends Proxy_KFPawn_ZedCrawlerKing_050;
class Proxy_KFPawn_ZedCrawlerKing_050 extends KFPawn_ZedCrawlerKing;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedCrawlerKing_060 extends Proxy_KFPawn_ZedCrawlerKing_060;
class Proxy_KFPawn_ZedCrawlerKing_060 extends KFPawn_ZedCrawlerKing;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedCrawlerKing_070 extends Proxy_KFPawn_ZedCrawlerKing_070;
class Proxy_KFPawn_ZedCrawlerKing_070 extends KFPawn_ZedCrawlerKing;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedCrawlerKing_080 extends Proxy_KFPawn_ZedCrawlerKing_080;
class Proxy_KFPawn_ZedCrawlerKing_080 extends KFPawn_ZedCrawlerKing;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedCrawlerKing_090 extends Proxy_KFPawn_ZedCrawlerKing_090;
class Proxy_KFPawn_ZedCrawlerKing_090 extends KFPawn_ZedCrawlerKing;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedCrawlerKing_100 extends Proxy_KFPawn_ZedCrawlerKing_100;
class Proxy_KFPawn_ZedCrawlerKing_100 extends KFPawn_ZedCrawlerKing;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedCrawler_010 extends Proxy_KFPawn_ZedCrawler_010;
class Proxy_KFPawn_ZedCrawler_010 extends KFPawn_ZedCrawler;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedCrawler_020 extends Proxy_KFPawn_ZedCrawler_020;
class Proxy_KFPawn_ZedCrawler_020 extends KFPawn_ZedCrawler;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedCrawler_030 extends Proxy_KFPawn_ZedCrawler_030;
class Proxy_KFPawn_ZedCrawler_030 extends KFPawn_ZedCrawler;
defaultproperties
{

View File

@ -1,4 +1,4 @@
class Proxy_KFPawn_ZedCrawler_040 extends Proxy_KFPawn_ZedCrawler_040;
class Proxy_KFPawn_ZedCrawler_040 extends KFPawn_ZedCrawler;
defaultproperties
{

Some files were not shown because too many files have changed in this diff Show More