/** * Main and only Acedia mutator. Used for providing access to mutator * events' calls and detecting server travel. * Copyright 2020-2023 Anton Tarasenko * 2023 Shtoyan *------------------------------------------------------------------------------ * This file is part of Acedia. * * Acedia is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 3 of the License, or * (at your option) any later version. * * Acedia is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Acedia. If not, see . */ class AcediaLauncherMut extends Mutator; // Acedia's reference to a `Global` object. var private Global _; // Responsible for setting up Acedia's game modes in current voting system var private VotingHandlerAdapter votingAdapter; var Mutator_OnMutate_Signal onMutateSignal; var Mutator_OnModifyLogin_Signal onModifyLoginSignal; var Mutator_OnCheckReplacement_Signal onCheckReplacementSignal; simulated function PreBeginPlay() { local StartUp startUpActor; _ = class'Global'.static.GetInstance(); if (level.netMode == NM_DedicatedServer) { foreach AllActors(class'StartUp', startUpActor) { votingAdapter = startUpActor.GetVotingHandlerAdapter(); startUpActor.Destroy(); break; } if (votingAdapter != none) { votingAdapter.InjectIntoVotingHandler(); } SetupMutatorSignals(); } else { class'ClientLevelCore'.static.CreateLevelCore(self); } } function ServerTraveling(string URL, bool bItems) { if (votingAdapter != none) { votingAdapter.PrepareForServerTravel(); votingAdapter.RestoreVotingHandlerConfigBackup(); _.memory.Free(votingAdapter); votingAdapter = none; } _.environment.ShutDown(); if (nextMutator != none) { nextMutator.ServerTraveling(URL, bItems); } Destroy(); } // Fetches and sets up signals that `Mutator` needs to provide private function SetupMutatorSignals() { local ServerUnrealService service; service = ServerUnrealService(class'ServerUnrealService'.static.Require()); onMutateSignal = Mutator_OnMutate_Signal( service.GetSignal(class'Mutator_OnMutate_Signal')); onModifyLoginSignal = Mutator_OnModifyLogin_Signal( service.GetSignal(class'Mutator_OnModifyLogin_Signal')); onCheckReplacementSignal = Mutator_OnCheckReplacement_Signal( service.GetSignal(class'Mutator_OnCheckReplacement_Signal')); } function bool CheckReplacement(Actor other, out byte isSuperRelevant) { if (onCheckReplacementSignal != none) { return onCheckReplacementSignal.Emit(other, isSuperRelevant); } return true; } function Mutate(string command, PlayerController sendingController) { if (onMutateSignal != none) { onMutateSignal.Emit(command, sendingController); } super.Mutate(command, sendingController); } function ModifyLogin(out string portal, out string options) { if (onModifyLoginSignal != none) { onModifyLoginSignal.Emit(portal, options); } super.ModifyLogin(portal, options); } defaultproperties { remoteRole = ROLE_SimulatedProxy bAlwaysRelevant = true // Mutator description GroupName = "Package loader" FriendlyName = "Acedia loader" Description = "Launcher for Acedia packages" }