-
Notifications
You must be signed in to change notification settings - Fork 2
/
AutoConnect_Main.cs
87 lines (73 loc) · 2.77 KB
/
AutoConnect_Main.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
using HarmonyLib;
using Planetbase;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
namespace Tahvohck_Mods.JPFariasUpdates
{
using Module = Planetbase.Module;
using ModuleReflect = System.Reflection.Module;
public class AutoConnections
{
[LoaderOptimization(LoaderOptimization.NotSpecified)]
public static void Init()
{
new Harmony(typeof(AutoConnections).FullName).PatchAll();
}
}
/// <summary>
/// Because we need an object that is disposed of during the original call, we have to grab that object
/// during a prefix, then operate on it during a postfix. This works without any noticeable issues.
/// </summary>
[HarmonyPatch(typeof(GameStateGame), "placeModule")]
public class PatchGameState
{
private static MethodInfo recycleLinkComponents = typeof(Module)
.GetMethod("recycleLinkComponents", BindingFlags.NonPublic | BindingFlags.Instance);
public static void Prefix(GameStateGame __instance, out State __state)
{
Module mActiveModule = __instance.GetType()
.GetField("mActiveModule", BindingFlags.NonPublic | BindingFlags.Instance)
.GetValue(__instance) as Module;
bool? mRenderTops = __instance.GetType()
.GetField("mRenderTops", BindingFlags.NonPublic | BindingFlags.Instance)
.GetValue(__instance) as bool?;
if (mActiveModule.isValidPosition()) {
__state = new State(mActiveModule, (bool)mRenderTops);
} else {
__state = null;
}
}
public static void Postfix(State __state)
{
// Don't run if module position was invalid
if (__state is null) { return; }
var linkable = ModuleHelper.GetAllModules((module) =>
module != __state.ActiveModule
&& Connection.canLink(module, __state.ActiveModule)
);
linkable.ForEach(delegate (Module module) {
Connection c = Connection.create(__state.ActiveModule, module);
c.onUserPlaced();
c.setRenderTop(__state.RenderTops);
recycleLinkComponents.Invoke(__state.ActiveModule, null);
recycleLinkComponents.Invoke(module, null);
});
}
/// <summary>
/// Internal state holder
/// </summary>
public class State
{
public readonly Module ActiveModule;
public readonly bool RenderTops;
public State(Module m, bool renderTops)
{
ActiveModule = m;
RenderTops = renderTops;
}
}
}
}