* Fix exception in ReagentPrototype Due to client trying to access concrete implementations of IMetabolizable that are in Content.Server. This fix checks to see if the prototype is being loaded by the client through reflection. I don't want to move the prototype completely into Content.Server since it's useful for the client to view descriptions and values of reagents without needing to send that data from the server. * Make fix slightly more explicit Now it will only load the metabolizable when in Robust.Server, instead of it being anything that's not Robust.Client. * Add IModuleManager and ModuleManager Provide simple way to check if shared code is being run by the server or the client * Change ModuleManager implementations to not require assembly name comparison Now just has ClientModuleManager registered to client, and ServerModuleManager registered to server. * Change IModuleManager functions to properties * Fix failing tests. This was failing because the tests weren't initializing IoC. Simply using RobustUnitTest wasn't enough because that doesn't initialize content either. I did some cleaning up so now content IoC is registered via ContentUnitTest.
224 lines
7.7 KiB
C#
224 lines
7.7 KiB
C#
using System;
|
|
using Content.Client.GameObjects.Components.Actor;
|
|
using Content.Client.Input;
|
|
using Content.Client.Interfaces;
|
|
using Content.Client.Interfaces.Chat;
|
|
using Content.Client.Interfaces.Parallax;
|
|
using Content.Client.Parallax;
|
|
using Content.Client.Sandbox;
|
|
using Content.Client.UserInterface;
|
|
using Content.Shared.GameObjects.Components;
|
|
using Content.Shared.GameObjects.Components.Cargo;
|
|
using Content.Shared.GameObjects.Components.Chemistry;
|
|
using Content.Shared.GameObjects.Components.Markers;
|
|
using Content.Shared.GameObjects.Components.Research;
|
|
using Content.Shared.GameObjects.Components.VendingMachines;
|
|
using Robust.Client.Interfaces;
|
|
using Robust.Client.Interfaces.Graphics.Overlays;
|
|
using Robust.Client.Interfaces.Input;
|
|
using Robust.Client.Interfaces.UserInterface;
|
|
using Robust.Client.Player;
|
|
using Robust.Shared.ContentPack;
|
|
using Robust.Shared.Interfaces.GameObjects;
|
|
using Robust.Shared.IoC;
|
|
using Robust.Shared.Prototypes;
|
|
using Robust.Shared.Timing;
|
|
|
|
namespace Content.Client
|
|
{
|
|
public class EntryPoint : GameClient
|
|
{
|
|
#pragma warning disable 649
|
|
[Dependency] private readonly IPlayerManager _playerManager;
|
|
[Dependency] private readonly IEscapeMenuOwner _escapeMenuOwner;
|
|
#pragma warning restore 649
|
|
|
|
public override void Init()
|
|
{
|
|
var factory = IoCManager.Resolve<IComponentFactory>();
|
|
var prototypes = IoCManager.Resolve<IPrototypeManager>();
|
|
|
|
factory.DoAutoRegistrations();
|
|
|
|
var registerIgnore = new[]
|
|
{
|
|
"Wrenchable",
|
|
"AmmoBox",
|
|
"Breakable",
|
|
"Pickaxe",
|
|
"Interactable",
|
|
"Destructible",
|
|
"Temperature",
|
|
"PowerTransfer",
|
|
"PowerNode",
|
|
"PowerProvider",
|
|
"PowerDevice",
|
|
"PowerStorage",
|
|
"PowerGenerator",
|
|
"Explosive",
|
|
"OnUseTimerTrigger",
|
|
"ToolboxElectricalFill",
|
|
"ToolLockerFill",
|
|
"EmitSoundOnUse",
|
|
"FootstepModifier",
|
|
"HeatResistance",
|
|
"Teleportable",
|
|
"ItemTeleporter",
|
|
"Portal",
|
|
"EntityStorage",
|
|
"PlaceableSurface",
|
|
"Wirecutter",
|
|
"Screwdriver",
|
|
"Multitool",
|
|
"Welder",
|
|
"Wrench",
|
|
"Crowbar",
|
|
"HitscanWeapon",
|
|
"ProjectileWeapon",
|
|
"Projectile",
|
|
"MeleeWeapon",
|
|
"Storeable",
|
|
"Stack",
|
|
"Dice",
|
|
"Construction",
|
|
"Apc",
|
|
"Door",
|
|
"PoweredLight",
|
|
"Smes",
|
|
"Powercell",
|
|
"HandheldLight",
|
|
"LightBulb",
|
|
"Healing",
|
|
"Catwalk",
|
|
"BallisticMagazine",
|
|
"BallisticMagazineWeapon",
|
|
"BallisticBullet",
|
|
"HitscanWeaponCapacitor",
|
|
"PowerCell",
|
|
"WeaponCapacitorCharger",
|
|
"PowerCellCharger",
|
|
"AiController",
|
|
"PlayerInputMover",
|
|
"Computer",
|
|
"AsteroidRock",
|
|
"ResearchServer",
|
|
"ResearchPointSource",
|
|
"ResearchClient",
|
|
"IdCard",
|
|
"Access",
|
|
"AccessReader",
|
|
"IdCardConsole",
|
|
"Airlock",
|
|
"MedicalScanner",
|
|
"WirePlacer",
|
|
"Species",
|
|
"Drink",
|
|
"Food",
|
|
"DrinkFoodContainer",
|
|
"Stomach",
|
|
"Hunger",
|
|
"Thirst",
|
|
"Rotatable",
|
|
};
|
|
|
|
foreach (var ignoreName in registerIgnore)
|
|
{
|
|
factory.RegisterIgnore(ignoreName);
|
|
}
|
|
|
|
factory.Register<SharedResearchConsoleComponent>();
|
|
factory.Register<SharedLatheComponent>();
|
|
factory.Register<SharedSpawnPointComponent>();
|
|
|
|
factory.Register<SolutionComponent>();
|
|
|
|
factory.Register<SharedVendingMachineComponent>();
|
|
factory.Register<SharedWiresComponent>();
|
|
factory.Register<SharedCargoConsoleComponent>();
|
|
factory.Register<SharedReagentDispenserComponent>();
|
|
|
|
prototypes.RegisterIgnore("material");
|
|
prototypes.RegisterIgnore("reaction"); //Chemical reactions only needed by server. Reactions checks are server-side.
|
|
|
|
ClientContentIoC.Register();
|
|
|
|
if (TestingCallbacks != null)
|
|
{
|
|
var cast = (ClientModuleTestingCallbacks) TestingCallbacks;
|
|
cast.ClientBeforeIoC?.Invoke();
|
|
}
|
|
|
|
IoCManager.BuildGraph();
|
|
|
|
IoCManager.Resolve<IParallaxManager>().LoadParallax();
|
|
IoCManager.Resolve<IBaseClient>().PlayerJoinedServer += SubscribePlayerAttachmentEvents;
|
|
|
|
var stylesheet = new NanoStyle();
|
|
|
|
IoCManager.Resolve<IUserInterfaceManager>().Stylesheet = stylesheet.Stylesheet;
|
|
IoCManager.Resolve<IUserInterfaceManager>().Stylesheet = stylesheet.Stylesheet;
|
|
|
|
IoCManager.InjectDependencies(this);
|
|
|
|
_escapeMenuOwner.Initialize();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Subscribe events to the player manager after the player manager is set up
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="args"></param>
|
|
public void SubscribePlayerAttachmentEvents(object sender, EventArgs args)
|
|
{
|
|
_playerManager.LocalPlayer.EntityAttached += AttachPlayerToEntity;
|
|
_playerManager.LocalPlayer.EntityDetached += DetachPlayerFromEntity;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Add the character interface master which combines all character interfaces into one window
|
|
/// </summary>
|
|
public static void AttachPlayerToEntity(EntityAttachedEventArgs eventArgs)
|
|
{
|
|
eventArgs.NewEntity.AddComponent<CharacterInterface>();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Remove the character interface master from this entity now that we have detached ourselves from it
|
|
/// </summary>
|
|
public static void DetachPlayerFromEntity(EntityDetachedEventArgs eventArgs)
|
|
{
|
|
eventArgs.OldEntity.RemoveComponent<CharacterInterface>();
|
|
}
|
|
|
|
public override void PostInit()
|
|
{
|
|
base.PostInit();
|
|
|
|
// Setup key contexts
|
|
var inputMan = IoCManager.Resolve<IInputManager>();
|
|
ContentContexts.SetupContexts(inputMan.Contexts);
|
|
|
|
IoCManager.Resolve<IGameHud>().Initialize();
|
|
IoCManager.Resolve<IClientNotifyManager>().Initialize();
|
|
IoCManager.Resolve<IClientGameTicker>().Initialize();
|
|
IoCManager.Resolve<IOverlayManager>().AddOverlay(new ParallaxOverlay());
|
|
IoCManager.Resolve<IChatManager>().Initialize();
|
|
IoCManager.Resolve<ISandboxManager>().Initialize();
|
|
}
|
|
|
|
public override void Update(ModUpdateLevel level, FrameEventArgs frameEventArgs)
|
|
{
|
|
base.Update(level, frameEventArgs);
|
|
|
|
switch (level)
|
|
{
|
|
case ModUpdateLevel.FramePreEngine:
|
|
IoCManager.Resolve<IClientNotifyManager>().FrameUpdate(frameEventArgs);
|
|
IoCManager.Resolve<IClientGameTicker>().FrameUpdate(frameEventArgs);
|
|
IoCManager.Resolve<IChatManager>().FrameUpdate(frameEventArgs);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|