Files
Nitrox/NitroxServer/ServerAutoFacRegistrar.cs
2025-07-06 00:23:46 +02:00

95 lines
4.7 KiB
C#

global using NitroxModel.Logger;
using System;
using System.Reflection;
using Autofac;
using NitroxModel.Core;
using NitroxModel.Networking;
using NitroxServer.Communication.LiteNetLib;
using NitroxServer.Communication.Packets;
using NitroxServer.Communication.Packets.Processors;
using NitroxServer.Communication.Packets.Processors.Abstract;
using NitroxServer.ConsoleCommands.Abstract;
using NitroxServer.ConsoleCommands.Processor;
using NitroxServer.Serialization.Upgrade;
using NitroxServer.Serialization.World;
namespace NitroxServer
{
public class ServerAutoFacRegistrar : IAutoFacRegistrar
{
public virtual void RegisterDependencies(ContainerBuilder containerBuilder)
{
RegisterCoreDependencies(containerBuilder);
RegisterWorld(containerBuilder);
RegisterGameSpecificServices(containerBuilder, Assembly.GetCallingAssembly());
RegisterGameSpecificServices(containerBuilder, Assembly.GetExecutingAssembly());
}
private static void RegisterCoreDependencies(ContainerBuilder containerBuilder)
{
// TODO: Remove this once .NET Generic Host is implemented
containerBuilder.Register(c => Server.CreateOrLoadConfig()).SingleInstance();
containerBuilder.RegisterType<Server>().SingleInstance();
containerBuilder.RegisterType<DefaultServerPacketProcessor>().InstancePerLifetimeScope();
containerBuilder.RegisterType<PacketHandler>().InstancePerLifetimeScope();
containerBuilder.RegisterType<ConsoleCommandProcessor>().SingleInstance();
containerBuilder.RegisterType<LiteNetLibServer>()
.As<Communication.NitroxServer>()
.SingleInstance();
containerBuilder.RegisterType<NtpSyncer>().SingleInstance();
}
private void RegisterWorld(ContainerBuilder containerBuilder)
{
containerBuilder.RegisterType<WorldPersistence>().SingleInstance();
// TODO: Remove this once .NET Generic Host is implemented
containerBuilder.Register(c => c.Resolve<WorldPersistence>().Load(Server.GetSaveName(Environment.GetCommandLineArgs(), "My World"))).SingleInstance();
containerBuilder.Register(c => c.Resolve<World>().BuildingManager).SingleInstance();
containerBuilder.Register(c => c.Resolve<World>().TimeKeeper).SingleInstance();
containerBuilder.Register(c => c.Resolve<World>().PlayerManager).SingleInstance();
containerBuilder.Register(c => c.Resolve<World>().StoryManager).SingleInstance();
containerBuilder.Register(c => c.Resolve<World>().ScheduleKeeper).SingleInstance();
containerBuilder.Register(c => c.Resolve<World>().SimulationOwnershipData).SingleInstance();
containerBuilder.Register(c => c.Resolve<World>().WorldEntityManager).SingleInstance();
containerBuilder.Register(c => c.Resolve<World>().EntityRegistry).SingleInstance();
containerBuilder.Register(c => c.Resolve<World>().EntitySimulation).SingleInstance();
containerBuilder.Register(c => c.Resolve<World>().EscapePodManager).SingleInstance();
containerBuilder.Register(c => c.Resolve<World>().BatchEntitySpawner).SingleInstance();
containerBuilder.Register(c => c.Resolve<World>().GameData).SingleInstance();
containerBuilder.Register(c => c.Resolve<World>().GameData.PDAState).SingleInstance();
containerBuilder.Register(c => c.Resolve<World>().GameData.StoryGoals).SingleInstance();
containerBuilder.Register(c => c.Resolve<World>().GameData.StoryTiming).SingleInstance();
containerBuilder.Register(c => c.Resolve<World>().SessionSettings).SingleInstance();
}
private void RegisterGameSpecificServices(ContainerBuilder containerBuilder, Assembly assembly)
{
containerBuilder
.RegisterAssemblyTypes(assembly)
.AssignableTo<Command>()
.As<Command>()
.InstancePerLifetimeScope();
containerBuilder
.RegisterAssemblyTypes(assembly)
.AsClosedTypesOf(typeof(AuthenticatedPacketProcessor<>))
.InstancePerLifetimeScope();
containerBuilder
.RegisterAssemblyTypes(assembly)
.AsClosedTypesOf(typeof(UnauthenticatedPacketProcessor<>))
.InstancePerLifetimeScope();
containerBuilder
.RegisterAssemblyTypes(assembly)
.AssignableTo<SaveDataUpgrade>()
.As<SaveDataUpgrade>()
.InstancePerLifetimeScope();
}
}
}