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 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 int Version;
var private config E_LogLevel LogLevel; var private config E_LogLevel LogLevel;
var private OnlineSubsystem OS;
var private KFGameInfo KFGI; var private KFGameInfo KFGI;
var private KFGameReplicationInfo KFGRI; var private KFGameReplicationInfo KFGRI;
var private Array<MSKGS_RepInfo> RepInfos; var private Array<MSKGS_RepInfo> RepInfos;
var private UniqueNetId OwnerID;
var private UniqueNetId GroupID;
public simulated function bool SafeDestroy() public simulated function bool SafeDestroy()
{ {
`Log_Trace(); `Log_Trace();
@ -56,7 +67,10 @@ private function PreInit()
SaveConfig(); 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) switch (Version)
{ {
@ -92,13 +106,25 @@ private function PreInit()
} }
`Log_Base("LogLevel:" @ LogLevel); `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() private function PostInit()
{ {
local MSKGS_RepInfo RepInfo;
`Log_Trace(); `Log_Trace();
if (WorldInfo == None || WorldInfo.Game == None) if (WorldInfo == None || WorldInfo.Game == None)
@ -128,6 +154,85 @@ private function PostInit()
SafeDestroy(); SafeDestroy();
return; 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) public function NotifyLogin(Controller C)
@ -162,6 +267,11 @@ public function bool CreateRepInfo(Controller C)
if (RepInfo == None) return false; if (RepInfo == None) return false;
RepInfo.LogLevel = LogLevel;
RepInfo.MSKGS = Self;
RepInfo.GroupID = GroupID;
RepInfo.ServerOwner = false;
RepInfos.AddItem(RepInfo); RepInfos.AddItem(RepInfo);
return true; return true;
@ -188,6 +298,119 @@ public function bool DestroyRepInfo(Controller C)
return false; 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 DefaultProperties
{ {

View File

@ -3,7 +3,8 @@ class MSKGS_GM_Endless extends KFGameInfo_Endless;
const GI = class'MSKGS_GameInfo'; const GI = class'MSKGS_GameInfo';
const GIC = "KFGameContent.KFGameInfo_Endless"; const GIC = "KFGameContent.KFGameInfo_Endless";
var public MSKGS_Mut Mut; var public MSKGS MSKGS;
var public E_LogLevel LogLevel;
public simulated function ExileServerUsingKickBan() public simulated function ExileServerUsingKickBan()
{ {
@ -12,12 +13,12 @@ public simulated function ExileServerUsingKickBan()
public function UpdateGameSettings() 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) 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 defaultproperties

View File

@ -3,7 +3,8 @@ class MSKGS_GM_Objective extends KFGameInfo_Objective;
const GI = class'MSKGS_GameInfo'; const GI = class'MSKGS_GameInfo';
const GIC = "KFGameContent.KFGameInfo_Objective"; const GIC = "KFGameContent.KFGameInfo_Objective";
var public MSKGSMut Mut; var public MSKGS MSKGS;
var public E_LogLevel LogLevel;
simulated function ExileServerUsingKickBan() simulated function ExileServerUsingKickBan()
{ {
@ -12,12 +13,12 @@ simulated function ExileServerUsingKickBan()
public function UpdateGameSettings() 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) 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 defaultproperties

View File

@ -3,7 +3,8 @@ class MSKGS_GM_Survival extends KFGameInfo_Survival;
const GI = class'MSKGS_GameInfo'; const GI = class'MSKGS_GameInfo';
const GIC = "KFGameContent.KFGameInfo_Survival"; const GIC = "KFGameContent.KFGameInfo_Survival";
var public MSKGSMut Mut; var public MSKGS MSKGS;
var public E_LogLevel LogLevel;
simulated function ExileServerUsingKickBan() simulated function ExileServerUsingKickBan()
{ {
@ -12,12 +13,12 @@ simulated function ExileServerUsingKickBan()
public function UpdateGameSettings() 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) 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 defaultproperties

View File

@ -3,7 +3,8 @@ class MSKGS_GM_VersusSurvival extends KFGameInfo_VersusSurvival;
const GI = class'MSKGS_GameInfo'; const GI = class'MSKGS_GameInfo';
const GIC = "KFGameContent.KFGameInfo_VersusSurvival"; const GIC = "KFGameContent.KFGameInfo_VersusSurvival";
var public MSKGSMut Mut; var public MSKGS MSKGS;
var public E_LogLevel LogLevel;
simulated function ExileServerUsingKickBan() simulated function ExileServerUsingKickBan()
{ {
@ -12,12 +13,12 @@ simulated function ExileServerUsingKickBan()
public function UpdateGameSettings() 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) 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 defaultproperties

View File

@ -3,7 +3,8 @@ class MSKGS_GM_WeeklySurvival extends KFGameInfo_WeeklySurvival;
const GI = class'MSKGS_GameInfo'; const GI = class'MSKGS_GameInfo';
const GIC = "KFGameContent.KFGameInfo_WeeklySurvival"; const GIC = "KFGameContent.KFGameInfo_WeeklySurvival";
var public MSKGSMut Mut; var public MSKGS MSKGS;
var public E_LogLevel LogLevel;
simulated function ExileServerUsingKickBan() simulated function ExileServerUsingKickBan()
{ {
@ -12,12 +13,12 @@ simulated function ExileServerUsingKickBan()
public function UpdateGameSettings() 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) 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 defaultproperties

View File

@ -1,6 +1,9 @@
class MSKGS_GameInfo extends Object; 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 name SessionName;
local KFOnlineGameSettings KFGameSettings; local KFOnlineGameSettings KFGameSettings;
@ -45,31 +48,31 @@ public static function UpdateGameSettings(KFGameInfo_Survival KFGI, string GameM
if (KFGI.MyKFGRI != None) if (KFGI.MyKFGRI != None)
{ {
KFGameSettings.NumWaves = KFGI.MyKFGRI.GetFinalWaveNum(); KFGameSettings.NumWaves = KFGI.MyKFGRI.GetFinalWaveNum();
KFGI.MyKFGRI.bCustom = False; KFGI.MyKFGRI.bCustom = CfgSrvRank.default.bCustom;
} }
else else
{ {
KFGameSettings.NumWaves = KFGI.WaveMax - 1; 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; 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 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.NumPublicConnections = KFGI.MaxPlayersAllowed;
KFGameSettings.bRequiresPassword = KFGI.RequiresPassword(); KFGameSettings.bRequiresPassword = KFGI.RequiresPassword();
KFGameSettings.bCustom = false; KFGameSettings.bCustom = CfgSrvRank.default.bCustom;
KFGameSettings.bUsesStats = true; KFGameSettings.bUsesStats = CfgSrvRank.default.bUsesStats;
KFGameSettings.NumSpectators = KFGI.NumSpectators; KFGameSettings.NumSpectators = KFGI.NumSpectators;
if (KFGI.WorldInfo.IsConsoleDedicatedServer() || KFGI.WorldInfo.IsEOSDedicatedServer()) 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 String SMC;
local Name NMC; local Name NMC;
local int Boost;
SMC = String(MonsterClass); SMC = String(MonsterClass);
NMC = Name(SMC); NMC = Name(SMC);
Boost = (Mut == None) ? 0 : Mut.MskGsMemberList.Length; switch (MSKGS.XPBoost)
switch (Boost)
{ {
case 0: return MonsterClass; case 0: return MonsterClass;
case 10: return PickProxyZed010(NMC, MonsterClass); case 10: return PickProxyZed010(NMC, MonsterClass);

View File

@ -1,180 +1,44 @@
class MSKGS_Mut extends KFMutator class MSKGS_Mut extends KFMutator
config(MSKGS); config(MSKGS);
const CurrentVersion = 3; var private MSKGS MSKGS;
var config int ConfigVersion;
var config int WeapLifespan; public simulated function bool SafeDestroy()
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)
{ {
local int MaxPlayers, MaxPlayersAllowed; return (bPendingDelete || bDeleteMe || Destroy());
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;
} }
function InitConfig() public event PreBeginPlay()
{ {
// Update from config version to current version if needed Super.PreBeginPlay();
switch (ConfigVersion)
if (WorldInfo.NetMode == NM_Client) return;
foreach WorldInfo.DynamicActors(class'MSKGS', MSKGS)
{ {
case 0: // which means there is no config right now break;
WeapLifespan = 60 * 60; }
case 1:
if (PerPlayerMaxMonsters.Length != 6) if (MSKGS == None)
{ {
PerPlayerMaxMonsters.Length = 0; MSKGS = WorldInfo.Spawn(class'MSKGS');
PerPlayerMaxMonsters.AddItem(12); }
PerPlayerMaxMonsters.AddItem(18);
PerPlayerMaxMonsters.AddItem(24); if (MSKGS == None)
PerPlayerMaxMonsters.AddItem(32); {
PerPlayerMaxMonsters.AddItem(34); `Log_Base("FATAL: Can't Spawn 'MSKGS'");
PerPlayerMaxMonsters.AddItem(36); SafeDestroy();
}
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() public function InitMutator(String Options, out String ErrorMessage)
{ {
super.PostBeginPlay(); Super.InitMutator(Options, ErrorMessage);
Initialize(); MSKGS.SetMaxPlayers(class'GameInfo'.static.GetIntOption(Options, "MaxPlayers", INDEX_NONE));
} }
function Initialize() public function AddMutator(Mutator Mut)
{
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)
{ {
if (Mut == Self) return; if (Mut == Self) return;
@ -184,133 +48,34 @@ function AddMutator(Mutator Mut)
Super.AddMutator(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; MSKGS.NotifyLogin(C);
SuperRelevant = super.CheckRelevance(Other); Super.NotifyLogin(C);
// 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;
} }
function AddMskGsMember(Controller C) public function NotifyLogout(Controller C)
{ {
MskGsMemberList.AddItem(C); MSKGS.NotifyLogout(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;
if (C == None) return; Super.NotifyLogout(C);
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);
} }
defaultproperties defaultproperties
{ {
bInitialized=false
} }

View File

@ -1,78 +1,123 @@
class MskGsRepInfo extends ReplicationInfo; class MSKGS_RepInfo extends ReplicationInfo;
const GroupUIDStr = "0x017000000223386E"; const CfgXPBoost = class'CfgXPBoost';
const MaxRetries = 10;
const TimerDelay = 1.0f;
// Server vars var public E_LogLevel LogLevel;
var public MskGsMut Mut; var public MSKGS MSKGS;
var public Controller C; var public UniqueNetId GroupID;
var private int ServerApplyMembershipRetries; var public float CheckGroupTimer;
// Client vars var private KFPlayerController KFPC;
var private OnlineSubsystemSteamworks SW; var private OnlineSubsystem OS;
var private int ClientGetOnlineSubsystemRetries;
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) 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) GroupMember = true;
{ MSKGS.IncreaseXPBoost(GetKFPC());
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();
}
} }
private reliable client function ClientGetMembership() public function int XPBoost()
{ {
local UniqueNetId GroupID; `Log_Trace();
class'OnlineSubsystem'.Static.StringToUniqueNetId(GroupUIDStr, GroupID);
if (SW.CheckPlayerGroup(GroupID)) ServerApplyMembership(); if (ServerOwner)
}
private simulated reliable server function ServerApplyMembership()
{
if ((Mut == None || C == None) && ServerApplyMembershipRetries < MaxRetries)
{ {
ServerApplyMembershipRetries++; return CfgXPBoost.default.BoostOwner;
SetTimer(TimerDelay, false, nameof(ServerApplyMembership));
return;
} }
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; `Log_Trace();
bOnlyRelevantToOwner = true;
Role = ROLE_Authority;
RemoteRole = ROLE_SimulatedProxy;
bSkipActorPropertyReplication = false;
ServerApplyMembershipRetries = 0 if (KFPC != None) return KFPC;
ClientGetOnlineSubsystemRetries = 0
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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 defaultproperties
{ {

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