Skip to content

Commit

Permalink
Fix InstallBindings stuff
Browse files Browse the repository at this point in the history
  • Loading branch information
nicoco007 committed Jan 4, 2021
1 parent d6a0fdf commit 75e9650
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 23 deletions.
6 changes: 2 additions & 4 deletions Source/CustomAvatar/Avatar/AvatarGameplayEventsPlayer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,15 +34,13 @@ internal class AvatarGameplayEventsPlayer : MonoBehaviour
#pragma warning disable IDE0051

[Inject]
public void Inject(ILoggerProvider loggerProvider, LoadedAvatar avatar, ScoreController scoreController, BeatmapObjectCallbackController beatmapObjectCallbackController, ILevelEndActions levelEndActions)
public void Inject(ILoggerProvider loggerProvider, LoadedAvatar avatar, ScoreController scoreController, BeatmapObjectCallbackController beatmapObjectCallbackController, ObstacleSaberSparkleEffectManager sparkleEffectManager, ILevelEndActions levelEndActions)
{
_logger = loggerProvider.CreateLogger<AvatarGameplayEventsPlayer>(avatar.descriptor.name);
_scoreController = scoreController;
_levelEndActions = levelEndActions;
_beatmapObjectCallbackController = beatmapObjectCallbackController;

// unfortunately this is not bound through Zenject
_sparkleEffectManager = FindObjectOfType<ObstacleSaberSparkleEffectManager>();
_sparkleEffectManager = sparkleEffectManager;
}

private void Start()
Expand Down
1 change: 1 addition & 0 deletions Source/CustomAvatar/Plugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ public Plugin(Logger ipaLogger)
BeatSaberEvents.ApplyPatches(harmony, ipaLogger);

ZenjectHelper.ExposeSceneBinding<SmoothCamera>();
ZenjectHelper.ExposeSceneBinding<ObstacleSaberSparkleEffectManager>();

ZenjectHelper.Register<CustomAvatarsInstaller>().WithArguments(ipaLogger).OnMonoInstaller<PCAppInit>();
ZenjectHelper.Register<UIInstaller>().OnMonoInstaller<MenuViewControllersInstaller>();
Expand Down
5 changes: 1 addition & 4 deletions Source/CustomAvatar/Zenject/CustomAvatarsInstaller.cs
Original file line number Diff line number Diff line change
Expand Up @@ -84,10 +84,7 @@ public override void InstallBindings()
Container.Bind<TrackingHelper>().AsTransient();

// not sure if this is a great idea but w/e
if (!Container.HasBinding<MainSettingsModelSO>())
{
Container.Bind<MainSettingsModelSO>().FromInstance(Resources.FindObjectsOfTypeAll<MainSettingsModelSO>().First());
}
Container.Bind<MainSettingsModelSO>().FromInstance(Resources.FindObjectsOfTypeAll<MainSettingsModelSO>().First()).IfNotBound();
}
}
}
46 changes: 31 additions & 15 deletions Source/CustomAvatar/Zenject/Internal/ZenjectHelper.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
using CustomAvatar.Logging;
using HarmonyLib;
using IPA.Utilities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using UnityEngine;
using Zenject;
Expand All @@ -10,7 +12,12 @@ namespace CustomAvatar.Zenject.Internal
{
internal class ZenjectHelper
{
private static readonly string kExpectedFirstSceneContextName = "AppCoreSceneContext";
private const string kExpectedFirstSceneContextName = "AppCoreSceneContext";

private static readonly Type[] kContextTypesWithSceneBindings = new[] { typeof(ProjectContext), typeof(SceneContext), typeof(GameObjectContext) };

private static readonly FieldAccessor<SceneContext, List<SceneDecoratorContext>>.Accessor _decoratorContextsAccessor = FieldAccessor<SceneContext, List<SceneDecoratorContext>>.GetAccessor("_decoratorContexts");
private static readonly FieldAccessor<SceneDecoratorContext, List<MonoBehaviour>>.Accessor _injectableMonoBehavioursAccessor = FieldAccessor<SceneDecoratorContext, List<MonoBehaviour>>.GetAccessor("_injectableMonoBehaviours");

private static bool _shouldInstall;

Expand Down Expand Up @@ -51,10 +58,15 @@ private static void PatchInstallInstallers(Harmony harmony)

private static void PatchInstallBindings(Harmony harmony)
{
MethodInfo methodToPatch = typeof(Context).GetMethod("InstallSceneBindings", BindingFlags.NonPublic | BindingFlags.Instance, null, new[] { typeof(List<MonoBehaviour>) }, null);
MethodInfo patch = typeof(ZenjectHelper).GetMethod(nameof(InstallSceneBindings), BindingFlags.NonPublic | BindingFlags.Static);
foreach (Type type in kContextTypesWithSceneBindings)
{
_logger.Trace($"Applying patch to '{type.FullName}'");

MethodInfo methodToPatch = type.GetMethod("InstallBindings", BindingFlags.NonPublic | BindingFlags.Instance, null, new[] { typeof(List<MonoBehaviour>) }, null);
MethodInfo patch = typeof(ZenjectHelper).GetMethod(nameof(InstallBindings), BindingFlags.NonPublic | BindingFlags.Static);

harmony.Patch(methodToPatch, new HarmonyMethod(patch));
harmony.Patch(methodToPatch, null, new HarmonyMethod(patch));
}
}

private static void InstallInstallers(Context __instance)
Expand Down Expand Up @@ -87,23 +99,27 @@ private static void InstallInstallers(Context __instance)
}
}

private static void InstallSceneBindings(Context __instance, List<MonoBehaviour> injectableMonoBehaviours)
private static void InstallBindings(Context __instance, List<MonoBehaviour> injectableMonoBehaviours)
{
if (__instance is SceneContext sceneContext)
{
injectableMonoBehaviours.AddRange(_decoratorContextsAccessor(ref sceneContext).SelectMany(dc => _injectableMonoBehavioursAccessor(ref dc)));
}

foreach (MonoBehaviour monoBehaviour in injectableMonoBehaviours)
{
Type type = monoBehaviour.GetType();

if (_typesToExpose.Contains(type))
if (!_typesToExpose.Contains(type)) continue;

if (!__instance.Container.HasBinding(type))
{
if (!__instance.Container.HasBinding(type))
{
__instance.Container.Bind(type).FromInstance(monoBehaviour).AsSingle();
_logger.Trace($"Exposed MonoBehaviour '{type.FullName}' in context '{__instance.name}'");
}
else
{
_logger.Warning($"Not exposing MonoBehaviour '{type.FullName}' in context '{__instance.name}' since a binding already exists");
}
_logger.Trace($"Exposing MonoBehaviour '{type.FullName}' in context '{__instance.name}'");
__instance.Container.Bind(type).FromInstance(monoBehaviour).AsSingle();
}
else
{
_logger.Trace($"Not exposing MonoBehaviour '{type.FullName}' in context '{__instance.name}' since a binding already exists");
}
}
}
Expand Down

0 comments on commit 75e9650

Please sign in to comment.