Skip to content

Commit 450db0b

Browse files
committed
Update RemoveLightSourceTrigger
This took way too long.
1 parent a9a38ce commit 450db0b

File tree

1 file changed

+68
-14
lines changed

1 file changed

+68
-14
lines changed

Triggers/RemoveLightSourcesTrigger.cs

Lines changed: 68 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,58 +7,112 @@ namespace Celeste.Mod.SpringCollab2020.Triggers {
77
[CustomEntity("SpringCollab2020/RemoveLightSourcesTrigger")]
88
[Tracked]
99
class RemoveLightSourcesTrigger : Trigger {
10+
11+
private static FieldInfo LightsField;
12+
13+
private static FieldInfo BloomField;
14+
15+
private static FieldInfo LightField;
16+
17+
private static bool HooksEnabled = false;
18+
1019
public RemoveLightSourcesTrigger(EntityData data, Vector2 offset) : base(data, offset) {
11-
level = SceneAs<Level>();
20+
LightsField = typeof(LightingRenderer).GetField("lights", BindingFlags.NonPublic | BindingFlags.Instance);
21+
BloomField = typeof(Payphone).GetField("bloom", BindingFlags.NonPublic | BindingFlags.Instance);
22+
LightField = typeof(Payphone).GetField("light", BindingFlags.NonPublic | BindingFlags.Instance);
1223
}
1324

1425
public static void Load() {
1526
Everest.Events.Level.OnLoadLevel += LevelLoadHandler;
1627
Everest.Events.Level.OnExit += OnExitHandler;
28+
On.Celeste.Payphone.Update += PayphoneHook;
1729
}
1830

1931
public static void Unload() {
2032
Everest.Events.Level.OnLoadLevel -= LevelLoadHandler;
2133
Everest.Events.Level.OnExit -= OnExitHandler;
34+
On.Celeste.Payphone.Update -= PayphoneHook;
35+
}
36+
37+
private static void PayphoneHook(On.Celeste.Payphone.orig_Update orig, Payphone self) {
38+
orig(self);
39+
40+
VertexLight tempLight = (VertexLight) LightField.GetValue(self);
41+
BloomPoint tempBloom = (BloomPoint) BloomField.GetValue(self);
42+
tempBloom.Visible = tempLight.Visible = !tempLight.Visible;
43+
44+
if(self.SceneAs<Level>().Session.GetFlag("lightsDisabled")) {
45+
BloomField.SetValue(self, tempBloom);
46+
LightField.SetValue(self, tempLight);
47+
}
2248
}
2349

2450
private static void LevelLoadHandler(Level loadedLevel, Player.IntroTypes playerIntro, bool isFromLoader) {
2551
if (loadedLevel.Session.GetFlag("lightsDisabled"))
2652
DisableLightRender();
53+
else
54+
EnableLightRender();
2755
}
2856

2957
private static void OnExitHandler(Level exitLevel, LevelExit exit, LevelExit.Mode mode, Session session, HiresSnow snow) {
3058
EnableLightRender();
3159
}
3260

33-
private static void BloomRendererHook(On.Celeste.BloomRenderer.orig_Apply orig, BloomRenderer self, VirtualRenderTarget target, Scene scene) { }
61+
private static void BloomRendererHook(On.Celeste.BloomRenderer.orig_Apply orig, BloomRenderer self, VirtualRenderTarget target, Scene scene) {
62+
foreach (BloomPoint component in scene.Tracker.GetComponents<BloomPoint>().ToArray()) {
63+
if (!(component.Entity is Payphone))
64+
component.Visible = false;
65+
}
66+
67+
orig(self, target, scene);
68+
}
69+
70+
private static void LightHook(On.Celeste.LightingRenderer.orig_BeforeRender orig, LightingRenderer self, Scene scene) {
71+
foreach (VertexLight component in scene.Tracker.GetComponents<VertexLight>().ToArray()) {
72+
if (!component.Spotlight)
73+
component.RemoveSelf();
74+
}
3475

35-
private static void LightHook(On.Celeste.VertexLight.orig_Update orig, VertexLight self) {
36-
if (self.SceneAs<Level>().Session.GetFlag("lightsDisabled"))
37-
self.Alpha = 0f;
38-
orig(self);
76+
LightsField.SetValue(self, new VertexLight[64]);
77+
orig(self, scene);
78+
}
79+
80+
private static void TransitionHook(On.Celeste.Level.orig_TransitionTo orig, Level transitionLevel, LevelData next, Vector2 direction) {
81+
transitionLevel.Tracker.GetComponents<VertexLight>().ForEach(light => {
82+
if (!((VertexLight)light).Spotlight)
83+
light.RemoveSelf();
84+
});
85+
86+
orig(transitionLevel, next, direction);
3987
}
4088

4189
private static void EnableLightRender() {
42-
On.Celeste.VertexLight.Update -= LightHook;
90+
if (!HooksEnabled)
91+
return;
92+
93+
On.Celeste.LightingRenderer.BeforeRender -= LightHook;
4394
On.Celeste.BloomRenderer.Apply -= BloomRendererHook;
95+
On.Celeste.Level.TransitionTo -= TransitionHook;
96+
HooksEnabled = false;
4497
}
4598

4699
private static void DisableLightRender() {
47-
On.Celeste.VertexLight.Update += LightHook;
100+
if (HooksEnabled)
101+
return;
102+
103+
On.Celeste.LightingRenderer.BeforeRender += LightHook;
48104
On.Celeste.BloomRenderer.Apply += BloomRendererHook;
105+
On.Celeste.Level.TransitionTo += TransitionHook;
106+
HooksEnabled = true;
49107
}
50108

51109
public override void OnEnter(Player player) {
52110
base.OnEnter(player);
53111

54-
level = SceneAs<Level>();
55-
56-
if (level.Session.GetFlag("lightsDisabled") == false) {
57-
level.Session.SetFlag("lightsDisabled", true);
112+
if (SceneAs<Level>().Session.GetFlag("lightsDisabled") == false) {
113+
SceneAs<Level>().Session.SetFlag("lightsDisabled", true);
58114
DisableLightRender();
59115
}
60116
}
61-
62-
private Level level;
63117
}
64118
}

0 commit comments

Comments
 (0)