Skip to content

Commit 2b1381f

Browse files
committed
Fix flag toggle waterfall crash when used with underwater switch controller
1 parent c01a884 commit 2b1381f

File tree

2 files changed

+35
-0
lines changed

2 files changed

+35
-0
lines changed

Entities/FlagToggleWaterfall.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ class FlagToggleWaterfall : WaterFall {
1212
private string loopingSfxEvent;
1313
private string enteringSfxEvent;
1414

15+
private bool alreadyTurnedOnOnce = false;
16+
1517
public FlagToggleWaterfall(EntityData data, Vector2 offset) : base(data, offset) {
1618
Add(toggle = new FlagToggleComponent(data.Attr("flag"), data.Bool("inverted"), () => {
1719
// disable the waterfall sound.
@@ -35,10 +37,42 @@ public override void Awake(Scene scene) {
3537
enteringSfxEvent = enteringSfx.EventName;
3638

3739
toggle.UpdateFlag();
40+
41+
if (toggle.Enabled) {
42+
alreadyTurnedOnOnce = true;
43+
}
3844
}
3945

4046
public override void Update() {
4147
if (toggle.Enabled) {
48+
// if we are turning the waterfall on for the first time, compute its height, now that other entities
49+
// (pools of water, underwater switch controller) have been toggled to match as well.
50+
if (!alreadyTurnedOnOnce) {
51+
DynData<WaterFall> self = new DynData<WaterFall>(this);
52+
float height = 8f;
53+
Water water = null;
54+
Solid solid = null;
55+
while (Y + height < SceneAs<Level>().Bounds.Bottom
56+
&& (water = Scene.CollideFirst<Water>(new Rectangle((int) X, (int) (Y + height), 8, 8))) == null
57+
&& ((solid = Scene.CollideFirst<Solid>(new Rectangle((int) X, (int) (Y + height), 8, 8))) == null || !solid.BlockWaterfalls)) {
58+
59+
height += 8f;
60+
solid = null;
61+
}
62+
if (water != null && !Scene.CollideCheck<Solid>(new Rectangle((int) X, (int) (Y + height), 8, 16))) {
63+
enteringSfxEvent = "event:/env/local/waterfall_small_in_deep";
64+
} else {
65+
enteringSfxEvent = "event:/env/local/waterfall_small_in_shallow";
66+
}
67+
enteringSfx.Play(enteringSfxEvent);
68+
69+
self["height"] = height;
70+
self["water"] = water;
71+
self["solid"] = solid;
72+
73+
alreadyTurnedOnOnce = true;
74+
}
75+
4276
// update the entity as usual
4377
base.Update();
4478
} else {

Entities/UnderwaterSwitchController.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ public IEnumerator Routine() {
4747
}
4848

4949
// make water go away.
50+
water.Collidable = false;
5051
Scene.Remove(water);
5152
water = null;
5253
}

0 commit comments

Comments
 (0)