11using Celeste . Mod . Entities ;
22using Microsoft . Xna . Framework ;
33using Monocle ;
4- using MonoMod . Utils ;
54using System . Collections . Generic ;
65using System . Linq ;
6+ using System . Reflection ;
77
88namespace Celeste . Mod . SpringCollab2020 . Entities {
99 /// <summary>
@@ -16,41 +16,17 @@ namespace Celeste.Mod.SpringCollab2020.Entities {
1616 /// </summary>
1717 [ CustomEntity ( "SpringCollab2020/SidewaysLava" ) ]
1818 class SidewaysLava : Entity {
19-
20- private static List < DynData < SidewaysLava > > sidewaysLavas = new List < DynData < SidewaysLava > > ( ) ;
21-
22- public static void Load ( ) {
23- On . Celeste . Mod . Entities . LavaBlockerTrigger . Awake += onLavaBlockerTriggerAwake ;
24- On . Celeste . Mod . Entities . LavaBlockerTrigger . OnStay += onLavaBlockerTriggerStay ;
25- }
26-
27- public static void Unload ( ) {
28- On . Celeste . Mod . Entities . LavaBlockerTrigger . Awake -= onLavaBlockerTriggerAwake ;
29- On . Celeste . Mod . Entities . LavaBlockerTrigger . OnStay -= onLavaBlockerTriggerStay ;
30- }
31-
32- private static void onLavaBlockerTriggerAwake ( On . Celeste . Mod . Entities . LavaBlockerTrigger . orig_Awake orig , LavaBlockerTrigger self , Scene scene ) {
33- orig ( self , scene ) ;
34-
35- // look up for sideways lavas as well.
36- sidewaysLavas = scene . Entities . FindAll < SidewaysLava > ( ) . Select ( lava => new DynData < SidewaysLava > ( lava as SidewaysLava ) ) . ToList ( ) ;
37- }
38-
39- private static void onLavaBlockerTriggerStay ( On . Celeste . Mod . Entities . LavaBlockerTrigger . orig_OnStay orig , LavaBlockerTrigger self , Player player ) {
40- orig ( self , player ) ;
41-
42- // block sideways lava as well.
43- foreach ( DynData < SidewaysLava > data in sidewaysLavas )
44- if ( data . IsAlive )
45- data . Set ( "waiting" , true ) ;
46- }
19+ private static FieldInfo lavaBlockerTriggerEnabled = typeof ( LavaBlockerTrigger ) . GetField ( "enabled" , BindingFlags . NonPublic | BindingFlags . Instance ) ;
4720
4821 private enum LavaMode {
4922 LeftToRight , RightToLeft , Sandwich
5023 }
5124
5225 private const float Speed = 30f ;
5326
27+ // if the player collides with one of those, lava should be forced into waiting.
28+ private List < LavaBlockerTrigger > lavaBlockerTriggers ;
29+
5430 // atrributes
5531 private bool intro ;
5632 private LavaMode lavaMode ;
@@ -132,8 +108,12 @@ public SidewaysLava(EntityData data, Vector2 offset) {
132108 sandwichLeaving = true ;
133109 Collidable = false ;
134110 Alarm . Set ( this , 2f , ( ) => RemoveSelf ( ) ) ;
111+ } else {
112+ sandwichTransferred = false ;
113+
114+ // look up for all lava blocker triggers in the next room.
115+ lavaBlockerTriggers = Scene . Entities . OfType < LavaBlockerTrigger > ( ) . ToList ( ) ;
135116 }
136- sandwichTransferred = false ;
137117 } ,
138118 OnOut = progress => {
139119 if ( Scene != null ) {
@@ -228,6 +208,9 @@ public override void Awake(Scene scene) {
228208 if ( intro ) {
229209 Visible = true ;
230210 }
211+
212+ // look up for all lava blocker triggers in the room.
213+ lavaBlockerTriggers = scene . Entities . OfType < LavaBlockerTrigger > ( ) . ToList ( ) ;
231214 }
232215
233216 private void OnChangeMode ( Session . CoreModes mode ) {
@@ -278,9 +261,18 @@ public override void Update() {
278261 base . Update ( ) ;
279262 Visible = true ;
280263
264+ Player player = Scene . Tracker . GetEntity < Player > ( ) ;
265+ if ( player != null ) {
266+ LavaBlockerTrigger collidedTrigger = lavaBlockerTriggers . Find ( trigger => player . CollideCheck ( trigger ) ) ;
267+
268+ if ( collidedTrigger != null && ( bool ) lavaBlockerTriggerEnabled . GetValue ( collidedTrigger ) ) {
269+ // player is in a lava blocker trigger and it is enabled; block the lava.
270+ waiting = true ;
271+ }
272+ }
273+
281274 if ( waiting ) {
282275 loopSfx . Param ( "rising" , 0f ) ;
283- Player player = Scene . Tracker . GetEntity < Player > ( ) ;
284276
285277 // the sandwich lava fade in animation is not handled here.
286278 if ( lavaMode != LavaMode . Sandwich ) {
0 commit comments