using System.Reflection; using Autofac; using Autofac.Core; using NitroxClient.Communication; using NitroxClient.Communication.Abstract; using NitroxClient.Communication.MultiplayerSession; using NitroxClient.Communication.NetworkingLayer.LiteNetLib; using NitroxClient.Communication.Packets.Processors.Abstract; using NitroxClient.Debuggers; using NitroxClient.GameLogic; using NitroxClient.GameLogic.ChatUI; using NitroxClient.GameLogic.FMOD; using NitroxClient.GameLogic.HUD; using NitroxClient.GameLogic.InitialSync.Abstract; using NitroxClient.GameLogic.PlayerLogic; using NitroxClient.GameLogic.PlayerLogic.PlayerModel; using NitroxClient.GameLogic.PlayerLogic.PlayerModel.Abstract; using NitroxClient.GameLogic.PlayerLogic.PlayerPreferences; using NitroxClient.GameLogic.Settings; using NitroxClient.GameLogic.Spawning.Metadata; using NitroxClient.GameLogic.Spawning.Metadata.Extractor.Abstract; using NitroxClient.GameLogic.Spawning.Metadata.Processor.Abstract; using NitroxModel; using NitroxModel.Core; using NitroxModel.GameLogic.FMOD; using NitroxModel.Helper; using NitroxModel.Networking; using NitroxModel_Subnautica.Helper; namespace NitroxClient { public class ClientAutoFacRegistrar : IAutoFacRegistrar { private static readonly Assembly currentAssembly = Assembly.GetExecutingAssembly(); private readonly IModule[] modules; public ClientAutoFacRegistrar(params IModule[] modules) { this.modules = modules; } public void RegisterDependencies(ContainerBuilder containerBuilder) { foreach (IModule module in modules) { containerBuilder.RegisterModule(module); } RegisterCoreDependencies(containerBuilder); RegisterMetadataDependencies(containerBuilder); RegisterPacketProcessors(containerBuilder); RegisterColorSwapManagers(containerBuilder); RegisterInitialSyncProcessors(containerBuilder); } private void RegisterCoreDependencies(ContainerBuilder containerBuilder) { #if DEBUG containerBuilder.RegisterAssemblyTypes(currentAssembly) .AssignableTo() .As() .AsImplementedInterfaces() .AsSelf() .SingleInstance(); #endif containerBuilder.Register(c => new NitroxProtobufSerializer($"{nameof(NitroxModel)}.dll")); containerBuilder.RegisterType() .As() .SingleInstance(); containerBuilder.RegisterType().SingleInstance(); containerBuilder.RegisterType() .As() .As() .InstancePerLifetimeScope(); containerBuilder.RegisterType() .As() .InstancePerLifetimeScope(); containerBuilder.RegisterType() .AsSelf() //Would like to deprecate this registration at some point and just work through an abstraction. .As() .InstancePerLifetimeScope(); containerBuilder.RegisterType() .As() .InstancePerLifetimeScope(); containerBuilder.RegisterType().InstancePerLifetimeScope(); containerBuilder.RegisterType().InstancePerLifetimeScope(); containerBuilder.RegisterType().InstancePerLifetimeScope(); containerBuilder.RegisterType().InstancePerLifetimeScope(); containerBuilder.RegisterType().InstancePerLifetimeScope(); containerBuilder.RegisterType().InstancePerLifetimeScope(); containerBuilder.RegisterType().InstancePerLifetimeScope(); containerBuilder.RegisterType().InstancePerLifetimeScope(); containerBuilder.RegisterType().InstancePerLifetimeScope(); containerBuilder.RegisterType().InstancePerLifetimeScope(); containerBuilder.RegisterType().InstancePerLifetimeScope(); containerBuilder.RegisterType().InstancePerLifetimeScope(); containerBuilder.RegisterType().InstancePerLifetimeScope(); containerBuilder.RegisterType().InstancePerLifetimeScope(); containerBuilder.RegisterType().InstancePerLifetimeScope(); containerBuilder.RegisterType().InstancePerLifetimeScope(); containerBuilder.RegisterType().InstancePerLifetimeScope(); containerBuilder.RegisterType().InstancePerLifetimeScope(); containerBuilder.RegisterType().InstancePerLifetimeScope(); containerBuilder.RegisterType().InstancePerLifetimeScope(); containerBuilder.RegisterType().InstancePerLifetimeScope(); containerBuilder.RegisterType().InstancePerLifetimeScope(); containerBuilder.RegisterType().InstancePerLifetimeScope(); containerBuilder.Register(_ => FMODWhitelist.Load(GameInfo.Subnautica)).InstancePerLifetimeScope(); containerBuilder.RegisterType().InstancePerLifetimeScope(); containerBuilder.RegisterType().InstancePerLifetimeScope(); containerBuilder.RegisterType().InstancePerLifetimeScope(); containerBuilder.RegisterType().InstancePerLifetimeScope(); containerBuilder.RegisterType().InstancePerLifetimeScope(); containerBuilder.RegisterType().InstancePerLifetimeScope(); containerBuilder.RegisterType().InstancePerLifetimeScope(); containerBuilder.RegisterType().InstancePerLifetimeScope(); } private void RegisterMetadataDependencies(ContainerBuilder containerBuilder) { containerBuilder.RegisterAssemblyTypes(currentAssembly) .AssignableTo() .As() .AsSelf() .SingleInstance(); containerBuilder.RegisterAssemblyTypes(currentAssembly) .AssignableTo() .As() .AsSelf() .SingleInstance(); containerBuilder.RegisterType().InstancePerLifetimeScope(); } private void RegisterPacketProcessors(ContainerBuilder containerBuilder) { containerBuilder .RegisterAssemblyTypes(currentAssembly) .AsClosedTypesOf(typeof(ClientPacketProcessor<>)) .InstancePerLifetimeScope(); } private void RegisterColorSwapManagers(ContainerBuilder containerBuilder) { containerBuilder .RegisterAssemblyTypes(currentAssembly) .AssignableTo() .As() .SingleInstance(); } private void RegisterInitialSyncProcessors(ContainerBuilder containerBuilder) { containerBuilder .RegisterAssemblyTypes(currentAssembly) .AssignableTo() .As() .InstancePerLifetimeScope(); } } }