@@ -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