diff --git a/sources/GameModes/BaseGameMode.uc b/sources/GameModes/BaseGameMode.uc index cb7d8fe..04b29f6 100644 --- a/sources/GameModes/BaseGameMode.uc +++ b/sources/GameModes/BaseGameMode.uc @@ -10,7 +10,7 @@ * be used based on game info's settings; * 3. `Report...()` methods that perform various validation checks * (and log them) on config data. - * Copyright 2021-2022 Anton Tarasenko + * Copyright 2021 Anton Tarasenko *------------------------------------------------------------------------------ * This file is part of Acedia. * @@ -101,7 +101,6 @@ protected function FromData(HashTable source) local int i; local ArrayList nextArray; local HashTable nextPair; - if (source == none) { return; } @@ -134,7 +133,6 @@ private final function FeatureConfigPair HashTableIntoPair(HashTable source) { local Text nextText; local FeatureConfigPair result; - if (source == none) { return result; } @@ -154,7 +152,6 @@ private final function array DynamicIntoStringArray(ArrayList source) local int i; local Text nextText; local array result; - if (source == none) { return result; } @@ -171,7 +168,6 @@ protected function array StringToTextArray(array input) { local int i; local array result; - for (i = 0; i < input.length; i += 1) { result[i] = _.text.FromString(input[i]); } @@ -213,9 +209,8 @@ public function Text GetDifficulty() public function ReportIncorrectSettings( array featuresToEnable) { - local int i; + local int i; local array featureNames, featuresToReplace; - for (i = 0; i < featuresToEnable.length; i += 1) { featureNames[i] = string(featuresToEnable[i].featureClass); } @@ -238,7 +233,6 @@ public function ReportIncorrectSettings( public function ReportBadMutatorNames() { local int i; - for (i = 0; i < includeMutator.length; i += 1) { if (!ValidateServerURLName(includeMutator[i])) @@ -272,9 +266,8 @@ private function ValidateFeatureArray( array whole, string arrayName) { - local int i, j; - local bool foundItem; - + local int i, j; + local bool foundItem; for (i = 0; i < subset.length; i += 1) { foundItem = false; @@ -309,10 +302,9 @@ private function ValidateFeatureArray( public function UpdateFeatureArray( out array featuresToEnable) { - local int i; - local Text newConfigName; - local string nextFeatureClassName; - + local int i; + local Text newConfigName; + local string nextFeatureClassName; for (i = 0; i < featuresToEnable.length; i += 1) { nextFeatureClassName = string(featuresToEnable[i].featureClass); @@ -342,7 +334,6 @@ public function UpdateFeatureArray( private function bool FeatureExcluded(string featureClassName) { local int i; - for (i = 0; i < excludeFeature.length; i += 1) { if (excludeFeature[i] ~= featureClassName) { @@ -355,7 +346,6 @@ private function bool FeatureExcluded(string featureClassName) private function Text TryReplacingFeatureConfig(string featureClassName) { local int i; - for (i = 0; i < includeFeatureAs.length; i += 1) { if (includeFeatureAs[i].feature ~= featureClassName) { @@ -368,7 +358,6 @@ private function Text TryReplacingFeatureConfig(string featureClassName) private function bool FeatureInIncludedArray(string featureClassName) { local int i; - for (i = 0; i < includeFeature.length; i += 1) { if (includeFeature[i] ~= featureClassName) { @@ -382,7 +371,6 @@ public function array GetIncludedMutators() { local int i; local array validatedMutators; - for (i = 0; i < includeMutator.length; i += 1) { if (ValidateServerURLName(includeMutator[i])) { diff --git a/sources/GameModes/GameMode.uc b/sources/GameModes/GameMode.uc index e314ec3..7c869be 100644 --- a/sources/GameModes/GameMode.uc +++ b/sources/GameModes/GameMode.uc @@ -1,7 +1,7 @@ /** * The only implementation for `BaseGameMode` suitable for standard * killing floor game types. - * Copyright 2021-2022 Anton Tarasenko + * Copyright 2021 Anton Tarasenko *------------------------------------------------------------------------------ * This file is part of Acedia. * @@ -59,7 +59,6 @@ protected function HashTable ToData() local int i; local ArrayList nextArray; local HashTable result, nextPair; - result = super.ToData(); if (result == none) { return none; @@ -87,7 +86,6 @@ protected function FromData(HashTable source) local GameOption nextGameOption; local ArrayList nextArray; local HashTable nextPair; - super.FromData(source); if (source == none) { return; @@ -155,7 +153,6 @@ public function Text GetMapPrefix() public function ReportBadOptions() { local int i; - for (i = 0; i < option.length; i += 1) { if ( !ValidateServerURLName(option[i].key) @@ -176,7 +173,6 @@ public function HashTable GetOptions() { local int i; local HashTable result; - result = _.collections.EmptyHashTable(); for (i = 0; i < option.length; i += 1) { diff --git a/sources/Packages.uc b/sources/Packages.uc index d35e0e5..e87d703 100644 --- a/sources/Packages.uc +++ b/sources/Packages.uc @@ -22,6 +22,13 @@ class Packages extends Mutator config(Acedia); +// Default value of this variable will be used to store +// reference to the active Acedia mutator, +// as well as to ensure there's only one copy of it. +// We can't use 'Singleton' class for that, +// as we have to derive from 'Mutator'. +var private Packages selfReference; + // Acedia's reference to a `Global` object. var private Global _; var private ServerGlobal _server; @@ -49,6 +56,11 @@ struct FeatureConfigPair var public Text configName; }; +static public final function Packages GetInstance() +{ + return default.selfReference; +} + // "Constructor" simulated function PreBeginPlay() { @@ -62,8 +74,16 @@ simulated function PreBeginPlay() private simulated function InitializeClient() { - _ = class'Global'.static.GetInstance(); + // Enforce one copy rule and remember a reference to that copy + if (default.selfReference != none) + { + Destroy(); + return; + } + default.selfReference = self; + // TODO: Swap these around after dealing with aliases class'ClientLevelCore'.static.CreateLevelCore(self); + _ = class'Global'.static.GetInstance(); } private function InitializeServer() @@ -72,16 +92,23 @@ private function InitializeServer() local LevelCore serverCore; local GameMode currentGameMode; local array availableFeatures; - if (clientside) { AddToPackageMap("Acedia"); } CheckForGarbage(); + // Enforce one copy rule and remember a reference to that copy + if (default.selfReference != none) + { + Destroy(); + return; + } + default.selfReference = self; // Launch and setup core Acedia + // TODO: Swap these around after dealing with aliases + serverCore = class'ServerLevelCore'.static.CreateLevelCore(self); _ = class'Global'.static.GetInstance(); _server = class'ServerGlobal'.static.GetInstance(); _client = class'ClientGlobal'.static.GetInstance(); - serverCore = class'ServerLevelCore'.static.CreateLevelCore(self); for (i = 0; i < package.length; i += 1) { _.environment.RegisterPackage_S(package[i]); } @@ -122,6 +149,7 @@ function ServerTraveling(string URL, bool bItems) _.memory.Free(votingAdapter); votingAdapter = none; } + default.selfReference = none; _.environment.ShutDown(); if (nextMutator != none) { nextMutator.ServerTraveling(URL, bItems); @@ -133,13 +161,10 @@ function ServerTraveling(string URL, bool bItems) // This can lead to serious problems, so such diagnostic check is warranted. private function CheckForGarbage() { - local int leftoverObjectAmount; - local int leftoverActorAmount; - local int leftoverDBRAmount; + local int leftoverObjectAmount, leftoverActorAmount, leftoverDBRAmount; local AcediaObject nextObject; local AcediaActor nextActor; local DBRecord nextRecord; - foreach AllObjects(class'AcediaObject', nextObject) { leftoverObjectAmount += 1; } @@ -185,7 +210,6 @@ public final function array GetAutoConfigurationInfo() private function EnableFeatures(array features) { local int i; - for (i = 0; i < features.length; i += 1) { if (features[i].featureClass == none) continue; @@ -201,7 +225,6 @@ private function EnableFeatures(array features) private function SetupMutatorSignals() { local ServerUnrealService service; - service = ServerUnrealService(class'ServerUnrealService'.static.Require()); onMutateSignal = Mutator_OnMutate_Signal( service.GetSignal(class'Mutator_OnMutate_Signal')); diff --git a/sources/StartUp.uc b/sources/StartUp.uc index 0755d39..ac40796 100644 --- a/sources/StartUp.uc +++ b/sources/StartUp.uc @@ -1,6 +1,6 @@ /** * This actor's role is to add Acedia mutator on listen and dedicated servers. - * Copyright 2019-2022 Anton Tarasenko + * Copyright 2019 Anton Tarasenko *------------------------------------------------------------------------------ * This file is part of Acedia. * diff --git a/sources/VotingHandlerAdapter.uc b/sources/VotingHandlerAdapter.uc index 69b72ec..bb73010 100644 --- a/sources/VotingHandlerAdapter.uc +++ b/sources/VotingHandlerAdapter.uc @@ -5,7 +5,7 @@ * data from Acedia's game modes. * Requires `GameInfo`'s voting handler to be derived from * `XVotingHandler`, which is satisfied by pretty much every used handler. - * Copyright 2021-2022 Anton Tarasenko + * Copyright 2021 Anton Tarasenko *------------------------------------------------------------------------------ * This file is part of Acedia. * @@ -109,7 +109,6 @@ public final function InjectIntoVotingHandler() local GameMode nextGameMode; local XVotingHandler votingHandler; local array newVotingHandlerConfig; - if (votingHandlerReference != none) { return; } @@ -140,11 +139,10 @@ private function VotingHandler.MapVoteGameConfig BuildVotingHandlerConfig( GameMode gameMode) { local VotingHandler.MapVoteGameConfig result; - - result.gameClass = _.text.IntoString(gameMode.GetGameTypeClass()); + result.gameClass = _.text.ToString(gameMode.GetGameTypeClass()); result.gameName = _.text.ToColoredString(gameMode.GetTitle()); - result.prefix = _.text.IntoString(gameMode.GetMapPrefix()); - result.acronym = _.text.IntoString(gameMode.GetAcronym()); + result.prefix = _.text.ToString(gameMode.GetMapPrefix()); + result.acronym = _.text.ToString(gameMode.GetAcronym()); result.mutators = BuildMutatorString(gameMode); result.options = BuildOptionsString(gameMode); return result; @@ -155,14 +153,13 @@ private function string BuildMutatorString(GameMode gameMode) local int i; local string result; local array usedMutators; - usedMutators = gameMode.GetIncludedMutators(); for (i = 0; i < usedMutators.length; i += 1) { if (i > 0) { result $= ","; } - result $= _.text.IntoString(usedMutators[i]); + result $= _.text.ToString(usedMutators[i]); } return result; } @@ -174,12 +171,11 @@ private function string BuildOptionsString(GameMode gameMode) local string nextKey, nextValue; local CollectionIterator iter; local HashTable options; - options = gameMode.GetOptions(); for (iter = options.Iterate(); !iter.HasFinished(); iter.Next()) { - nextKey = _.text.IntoString(Text(iter.GetKey())); - nextValue = _.text.IntoString(Text(iter.Get())); + nextKey = _.text.ToString(Text(iter.GetKey())); + nextValue = _.text.ToString(Text(iter.Get())); if (optionWasAdded) { result $= "?"; } @@ -201,7 +197,6 @@ public final function PrepareForServerTravel() local string nextGameClassName; local class nextGameClass; local XVotingHandler votingHandler; - if (votingHandlerReference == none) return; votingHandler = XVotingHandler(votingHandlerReference.Get()); if (votingHandler == none) return; @@ -264,7 +259,6 @@ public final function GameMode SetupGameModeAfterTravel() public final function RestoreVotingHandlerConfigBackup() { local XVotingHandler votingHandler; - if (votingHandlerReference == none) return; votingHandler = XVotingHandler(votingHandlerReference.Get()); if (votingHandler == none) return; @@ -289,10 +283,9 @@ private function GameMode GetConfigFromString(string configName) // KF's numeric one. private final function int GetNumericDifficulty(GameMode gameMode) { - local int i; - local string difficulty; - - difficulty = Locs(_.text.IntoString(gameMode.GetDifficulty())); + local int i; + local string difficulty; + difficulty = Locs(_.text.ToString(gameMode.GetDifficulty())); for (i = 0; i < default.beginnerSynonyms.length; i += 1) { if (IsPrefixOf(difficulty, default.beginnerSynonyms[i])) {