wip
This commit is contained in:
parent
76a9f23530
commit
c406220e99
@ -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
|
||||
{
|
||||
|
||||
}
|
@ -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
|
||||
{
|
||||
|
||||
}
|
@ -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
|
||||
{
|
||||
|
||||
}
|
54
MskGs/Classes/CfgLifespan.uc
Normal file
54
MskGs/Classes/CfgLifespan.uc
Normal 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
|
||||
{
|
||||
|
||||
}
|
57
MskGs/Classes/CfgSpawnManager.uc
Normal file
57
MskGs/Classes/CfgSpawnManager.uc
Normal 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
|
||||
{
|
||||
|
||||
}
|
42
MskGs/Classes/CfgSrvRank.uc
Normal file
42
MskGs/Classes/CfgSrvRank.uc
Normal 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
142
MskGs/Classes/CfgXPBoost.uc
Normal 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
|
||||
{
|
||||
|
||||
}
|
@ -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
|
||||
{
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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,31 +48,31 @@ 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.NumSpectators = KFGI.NumSpectators;
|
||||
KFGameSettings.bRequiresPassword = KFGI.RequiresPassword();
|
||||
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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
MaxPlayers = Clamp(MyKFGI.GetIntOption(Options, "MaxPlayers", MaxPlayers), 6, 128);
|
||||
MaxPlayersAllowed = MaxPlayers;
|
||||
MyKFGI.MaxPlayers = MaxPlayers;
|
||||
MyKFGI.MaxPlayersAllowed = MaxPlayersAllowed;
|
||||
return (bPendingDelete || bDeleteMe || Destroy());
|
||||
}
|
||||
|
||||
function InitConfig()
|
||||
public event PreBeginPlay()
|
||||
{
|
||||
// Update from config version to current version if needed
|
||||
switch (ConfigVersion)
|
||||
Super.PreBeginPlay();
|
||||
|
||||
if (WorldInfo.NetMode == NM_Client) return;
|
||||
|
||||
foreach WorldInfo.DynamicActors(class'MSKGS', MSKGS)
|
||||
{
|
||||
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;
|
||||
break;
|
||||
}
|
||||
|
||||
if (MSKGS == None)
|
||||
{
|
||||
MSKGS = WorldInfo.Spawn(class'MSKGS');
|
||||
}
|
||||
|
||||
if (MSKGS == None)
|
||||
{
|
||||
`Log_Base("FATAL: Can't Spawn 'MSKGS'");
|
||||
SafeDestroy();
|
||||
}
|
||||
|
||||
ConfigVersion = CurrentVersion;
|
||||
SaveConfig();
|
||||
}
|
||||
|
||||
simulated event PostBeginPlay()
|
||||
public function InitMutator(String Options, out String ErrorMessage)
|
||||
{
|
||||
super.PostBeginPlay();
|
||||
|
||||
Initialize();
|
||||
Super.InitMutator(Options, ErrorMessage);
|
||||
|
||||
MSKGS.SetMaxPlayers(class'GameInfo'.static.GetIntOption(Options, "MaxPlayers", INDEX_NONE));
|
||||
}
|
||||
|
||||
function Initialize()
|
||||
{
|
||||
local MskGsVoteCollector VoteCollector;
|
||||
local OnlineSubsystem steamworks;
|
||||
local string Person;
|
||||
local UniqueNetId PersonUID;
|
||||
|
||||
if (bInitialized) return;
|
||||
|
||||
if (MyKFGI == None || MyKFGI.MyKFGRI == None)
|
||||
{
|
||||
SetTimer(1.f, false, nameof(Initialize));
|
||||
return;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
return Relevance;
|
||||
}
|
||||
|
||||
function bool CheckRelevance(Actor Other)
|
||||
public function NotifyLogin(Controller C)
|
||||
{
|
||||
local bool SuperRelevant;
|
||||
|
||||
SuperRelevant = super.CheckRelevance(Other);
|
||||
|
||||
// if this actor is going to be destroyed, return now
|
||||
if (!SuperRelevant)
|
||||
{
|
||||
return SuperRelevant;
|
||||
}
|
||||
|
||||
// otherwise modify dosh or weapon lifespan
|
||||
if (KFDroppedPickup_Cash(Other) != None)
|
||||
{
|
||||
if (DoshLifespan != 0) Other.Lifespan = float(DoshLifespan);
|
||||
}
|
||||
else if (KFDroppedPickup(Other) != None)
|
||||
{
|
||||
if (WeapLifespan != 0) Other.Lifespan = float(WeapLifespan);
|
||||
}
|
||||
|
||||
return SuperRelevant;
|
||||
MSKGS.NotifyLogin(C);
|
||||
|
||||
Super.NotifyLogin(C);
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
function NotifyLogin(Controller C)
|
||||
{
|
||||
local MskGsRepInfo RepInfo;
|
||||
MSKGS.NotifyLogout(C);
|
||||
|
||||
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
|
||||
|
||||
}
|
||||
|
@ -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();
|
||||
OS = class'GameEngine'.static.GetOnlineSubsystem();
|
||||
if (OS != None)
|
||||
{
|
||||
CheckGroupMembership();
|
||||
}
|
||||
else
|
||||
{
|
||||
`Log_Error("Can't get online subsystem!");
|
||||
}
|
||||
}
|
||||
|
||||
Super.PreBeginPlay();
|
||||
}
|
||||
|
||||
public simulated event PostBeginPlay()
|
||||
{
|
||||
`Log_Trace();
|
||||
|
||||
if (bPendingDelete || bDeleteMe) return;
|
||||
|
||||
Super.PostBeginPlay();
|
||||
}
|
||||
|
||||
private simulated function CheckGroupMembership()
|
||||
{
|
||||
if (OS.CheckPlayerGroup(GroupID))
|
||||
{
|
||||
ClearTimer(nameof(CheckGroupMembership));
|
||||
ServerApplyMembership();
|
||||
}
|
||||
else if (CheckGroupTimer > 0.0f && !IsTimerActive(nameof(CheckGroupMembership)))
|
||||
{
|
||||
SetTimer(CheckGroupTimer, true, nameof(CheckGroupMembership));
|
||||
}
|
||||
}
|
||||
|
||||
private reliable client function ClientGetOnlineSubsystem()
|
||||
private reliable server function ServerApplyMembership()
|
||||
{
|
||||
if (SW == None)
|
||||
{
|
||||
SW = OnlineSubsystemSteamworks(class'GameEngine'.static.GetOnlineSubsystem());
|
||||
}
|
||||
|
||||
if (SW == None && ClientGetOnlineSubsystemRetries < MaxRetries)
|
||||
{
|
||||
ClientGetOnlineSubsystemRetries++;
|
||||
SetTimer(TimerDelay, false, nameof(ClientGetOnlineSubsystem));
|
||||
}
|
||||
else
|
||||
{
|
||||
ClearTimer(nameof(ClientGetOnlineSubsystem));
|
||||
if (SW != None) ClientGetMembership();
|
||||
}
|
||||
GroupMember = true;
|
||||
MSKGS.IncreaseXPBoost(GetKFPC());
|
||||
}
|
||||
|
||||
private reliable client function ClientGetMembership()
|
||||
public function int XPBoost()
|
||||
{
|
||||
local UniqueNetId GroupID;
|
||||
class'OnlineSubsystem'.Static.StringToUniqueNetId(GroupUIDStr, GroupID);
|
||||
if (SW.CheckPlayerGroup(GroupID)) ServerApplyMembership();
|
||||
}
|
||||
|
||||
private simulated reliable server function ServerApplyMembership()
|
||||
{
|
||||
if ((Mut == None || C == None) && ServerApplyMembershipRetries < MaxRetries)
|
||||
`Log_Trace();
|
||||
|
||||
if (ServerOwner)
|
||||
{
|
||||
ServerApplyMembershipRetries++;
|
||||
SetTimer(TimerDelay, false, nameof(ServerApplyMembership));
|
||||
return;
|
||||
return CfgXPBoost.default.BoostOwner;
|
||||
}
|
||||
|
||||
ClearTimer(nameof(ServerApplyMembership));
|
||||
if (GetKFPC() != None && GetKFPC().PlayerReplicationInfo != None && GetKFPC().PlayerReplicationInfo.bAdmin)
|
||||
{
|
||||
return CfgXPBoost.default.BoostAdmin;
|
||||
}
|
||||
|
||||
if (Mut != None && C != None) Mut.AddMskGsMember(C);
|
||||
if (GroupMember)
|
||||
{
|
||||
return CfgXPBoost.default.BoostGroup;
|
||||
}
|
||||
|
||||
return CfgXPBoost.default.BoostPlayer;
|
||||
}
|
||||
|
||||
DefaultProperties
|
||||
private simulated function KFPlayerController GetKFPC()
|
||||
{
|
||||
bAlwaysRelevant = false;
|
||||
bOnlyRelevantToOwner = true;
|
||||
Role = ROLE_Authority;
|
||||
RemoteRole = ROLE_SimulatedProxy;
|
||||
bSkipActorPropertyReplication = false;
|
||||
`Log_Trace();
|
||||
|
||||
ServerApplyMembershipRetries = 0
|
||||
ClientGetOnlineSubsystemRetries = 0
|
||||
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;
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedBloatKingSubspawn_010 extends Proxy_KFPawn_ZedBloatKingSubspawn_010;
|
||||
class Proxy_KFPawn_ZedBloatKingSubspawn_010 extends KFPawn_ZedBloatKingSubspawn;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedBloatKingSubspawn_020 extends Proxy_KFPawn_ZedBloatKingSubspawn_020;
|
||||
class Proxy_KFPawn_ZedBloatKingSubspawn_020 extends KFPawn_ZedBloatKingSubspawn;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedBloatKingSubspawn_030 extends Proxy_KFPawn_ZedBloatKingSubspawn_030;
|
||||
class Proxy_KFPawn_ZedBloatKingSubspawn_030 extends KFPawn_ZedBloatKingSubspawn;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedBloatKingSubspawn_040 extends Proxy_KFPawn_ZedBloatKingSubspawn_040;
|
||||
class Proxy_KFPawn_ZedBloatKingSubspawn_040 extends KFPawn_ZedBloatKingSubspawn;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedBloatKingSubspawn_050 extends Proxy_KFPawn_ZedBloatKingSubspawn_050;
|
||||
class Proxy_KFPawn_ZedBloatKingSubspawn_050 extends KFPawn_ZedBloatKingSubspawn;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedBloatKingSubspawn_060 extends Proxy_KFPawn_ZedBloatKingSubspawn_060;
|
||||
class Proxy_KFPawn_ZedBloatKingSubspawn_060 extends KFPawn_ZedBloatKingSubspawn;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedBloatKingSubspawn_070 extends Proxy_KFPawn_ZedBloatKingSubspawn_070;
|
||||
class Proxy_KFPawn_ZedBloatKingSubspawn_070 extends KFPawn_ZedBloatKingSubspawn;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedBloatKingSubspawn_080 extends Proxy_KFPawn_ZedBloatKingSubspawn_080;
|
||||
class Proxy_KFPawn_ZedBloatKingSubspawn_080 extends KFPawn_ZedBloatKingSubspawn;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedBloatKingSubspawn_090 extends Proxy_KFPawn_ZedBloatKingSubspawn_090;
|
||||
class Proxy_KFPawn_ZedBloatKingSubspawn_090 extends KFPawn_ZedBloatKingSubspawn;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedBloatKingSubspawn_100 extends Proxy_KFPawn_ZedBloatKingSubspawn_100;
|
||||
class Proxy_KFPawn_ZedBloatKingSubspawn_100 extends KFPawn_ZedBloatKingSubspawn;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedBloatKing_010 extends Proxy_KFPawn_ZedBloatKing_010;
|
||||
class Proxy_KFPawn_ZedBloatKing_010 extends KFPawn_ZedBloatKing;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedBloatKing_020 extends Proxy_KFPawn_ZedBloatKing_020;
|
||||
class Proxy_KFPawn_ZedBloatKing_020 extends KFPawn_ZedBloatKing;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedBloatKing_030 extends Proxy_KFPawn_ZedBloatKing_030;
|
||||
class Proxy_KFPawn_ZedBloatKing_030 extends KFPawn_ZedBloatKing;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedBloatKing_040 extends Proxy_KFPawn_ZedBloatKing_040;
|
||||
class Proxy_KFPawn_ZedBloatKing_040 extends KFPawn_ZedBloatKing;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedBloatKing_050 extends Proxy_KFPawn_ZedBloatKing_050;
|
||||
class Proxy_KFPawn_ZedBloatKing_050 extends KFPawn_ZedBloatKing;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedBloatKing_060 extends Proxy_KFPawn_ZedBloatKing_060;
|
||||
class Proxy_KFPawn_ZedBloatKing_060 extends KFPawn_ZedBloatKing;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedBloatKing_070 extends Proxy_KFPawn_ZedBloatKing_070;
|
||||
class Proxy_KFPawn_ZedBloatKing_070 extends KFPawn_ZedBloatKing;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedBloatKing_080 extends Proxy_KFPawn_ZedBloatKing_080;
|
||||
class Proxy_KFPawn_ZedBloatKing_080 extends KFPawn_ZedBloatKing;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedBloatKing_090 extends Proxy_KFPawn_ZedBloatKing_090;
|
||||
class Proxy_KFPawn_ZedBloatKing_090 extends KFPawn_ZedBloatKing;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedBloatKing_100 extends Proxy_KFPawn_ZedBloatKing_100;
|
||||
class Proxy_KFPawn_ZedBloatKing_100 extends KFPawn_ZedBloatKing;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedBloat_010 extends Proxy_KFPawn_ZedBloat_010;
|
||||
class Proxy_KFPawn_ZedBloat_010 extends KFPawn_ZedBloat;
|
||||
|
||||
DefaultProperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedBloat_020 extends Proxy_KFPawn_ZedBloat_020;
|
||||
class Proxy_KFPawn_ZedBloat_020 extends KFPawn_ZedBloat;
|
||||
|
||||
DefaultProperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedBloat_030 extends Proxy_KFPawn_ZedBloat_030;
|
||||
class Proxy_KFPawn_ZedBloat_030 extends KFPawn_ZedBloat;
|
||||
|
||||
DefaultProperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedBloat_040 extends Proxy_KFPawn_ZedBloat_040;
|
||||
class Proxy_KFPawn_ZedBloat_040 extends KFPawn_ZedBloat;
|
||||
|
||||
DefaultProperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedBloat_050 extends Proxy_KFPawn_ZedBloat_050;
|
||||
class Proxy_KFPawn_ZedBloat_050 extends KFPawn_ZedBloat;
|
||||
|
||||
DefaultProperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedBloat_060 extends Proxy_KFPawn_ZedBloat_060;
|
||||
class Proxy_KFPawn_ZedBloat_060 extends KFPawn_ZedBloat;
|
||||
|
||||
DefaultProperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedBloat_070 extends Proxy_KFPawn_ZedBloat_070;
|
||||
class Proxy_KFPawn_ZedBloat_070 extends KFPawn_ZedBloat;
|
||||
|
||||
DefaultProperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedBloat_080 extends Proxy_KFPawn_ZedBloat_080;
|
||||
class Proxy_KFPawn_ZedBloat_080 extends KFPawn_ZedBloat;
|
||||
|
||||
DefaultProperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedBloat_090 extends Proxy_KFPawn_ZedBloat_090;
|
||||
class Proxy_KFPawn_ZedBloat_090 extends KFPawn_ZedBloat;
|
||||
|
||||
DefaultProperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedBloat_100 extends Proxy_KFPawn_ZedBloat_100;
|
||||
class Proxy_KFPawn_ZedBloat_100 extends KFPawn_ZedBloat;
|
||||
|
||||
DefaultProperties
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedCrawlerKing_010 extends Proxy_KFPawn_ZedCrawlerKing_010;
|
||||
class Proxy_KFPawn_ZedCrawlerKing_010 extends KFPawn_ZedCrawlerKing;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedCrawlerKing_020 extends Proxy_KFPawn_ZedCrawlerKing_020;
|
||||
class Proxy_KFPawn_ZedCrawlerKing_020 extends KFPawn_ZedCrawlerKing;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedCrawlerKing_030 extends Proxy_KFPawn_ZedCrawlerKing_030;
|
||||
class Proxy_KFPawn_ZedCrawlerKing_030 extends KFPawn_ZedCrawlerKing;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedCrawlerKing_040 extends Proxy_KFPawn_ZedCrawlerKing_040;
|
||||
class Proxy_KFPawn_ZedCrawlerKing_040 extends KFPawn_ZedCrawlerKing;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedCrawlerKing_050 extends Proxy_KFPawn_ZedCrawlerKing_050;
|
||||
class Proxy_KFPawn_ZedCrawlerKing_050 extends KFPawn_ZedCrawlerKing;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedCrawlerKing_060 extends Proxy_KFPawn_ZedCrawlerKing_060;
|
||||
class Proxy_KFPawn_ZedCrawlerKing_060 extends KFPawn_ZedCrawlerKing;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedCrawlerKing_070 extends Proxy_KFPawn_ZedCrawlerKing_070;
|
||||
class Proxy_KFPawn_ZedCrawlerKing_070 extends KFPawn_ZedCrawlerKing;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedCrawlerKing_080 extends Proxy_KFPawn_ZedCrawlerKing_080;
|
||||
class Proxy_KFPawn_ZedCrawlerKing_080 extends KFPawn_ZedCrawlerKing;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedCrawlerKing_090 extends Proxy_KFPawn_ZedCrawlerKing_090;
|
||||
class Proxy_KFPawn_ZedCrawlerKing_090 extends KFPawn_ZedCrawlerKing;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedCrawlerKing_100 extends Proxy_KFPawn_ZedCrawlerKing_100;
|
||||
class Proxy_KFPawn_ZedCrawlerKing_100 extends KFPawn_ZedCrawlerKing;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedCrawler_010 extends Proxy_KFPawn_ZedCrawler_010;
|
||||
class Proxy_KFPawn_ZedCrawler_010 extends KFPawn_ZedCrawler;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedCrawler_020 extends Proxy_KFPawn_ZedCrawler_020;
|
||||
class Proxy_KFPawn_ZedCrawler_020 extends KFPawn_ZedCrawler;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
class Proxy_KFPawn_ZedCrawler_030 extends Proxy_KFPawn_ZedCrawler_030;
|
||||
class Proxy_KFPawn_ZedCrawler_030 extends KFPawn_ZedCrawler;
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
|
@ -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
Loading…
x
Reference in New Issue
Block a user