private void OnSpringOnCollide(On.Celeste.Spring.orig_OnCollide orig, Celeste.Spring self, Celeste.Player player) { orig(self, player); if (Settings.Enabled) { var canUseField = typeof(Celeste.Spring).GetField("playerCanUse", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); if (!(player.StateMachine.State == 9 || !(bool)canUseField.GetValue(self))) { ApplyRules(player.Scene, "Spring"); } } }
private static void SpringGreenOnCollide(On.Celeste.Spring.orig_OnCollide orig, Spring self, Player player) { if (self.GetType() == typeof(SpringGreen)) { if (player.StateMachine.State == 9) { return; } var origDashAttacking = player.DashAttacking; var origSpeedX = player.Speed.X; var origSpeedY = player.Speed.Y; if (origDashAttacking && player.Speed == Vector2.Zero) { FieldInfo beforeDashSpeedFieldInfo = typeof(Player).GetPrivateField("beforeDashSpeed"); Vector2 bDSpeed = (Vector2)beforeDashSpeedFieldInfo?.GetValue(player); origSpeedX = bDSpeed.X; origSpeedY = bDSpeed.Y; } Vector2 origDashDir = player.DashDir; FieldInfo varJumpSpeedFieldInfo = typeof(Player).GetPrivateField("varJumpSpeed"); player.Speed.X = 0; player.Speed.Y = 0; orig(self, player); if (self.Orientation == Orientations.Floor) { player.Speed.X = origSpeedX; if (origSpeedY > 0.0f) { if (origDashDir.Y > 0.0f && origDashAttacking) { player.Speed.Y = -370f / 3; varJumpSpeedFieldInfo?.SetValue(player, -370f / 3); } else { player.Speed.Y = -185f; } } else { player.Speed.Y = origSpeedY - 185f; varJumpSpeedFieldInfo?.SetValue(player, player.Speed.Y); } } else if (self.Orientation == Orientations.WallLeft) { player.Speed.Y = origSpeedY - 140f; if (origSpeedX > 0.0f) { player.Speed.X = origSpeedX + 240f; } else { player.Speed.X = 240f; } varJumpSpeedFieldInfo?.SetValue(player, player.Speed.Y); } else { player.Speed.Y = origSpeedY - 140f; if (origSpeedX < 0.0f) { player.Speed.X = origSpeedX - 240f; } else { player.Speed.X = -240f; } varJumpSpeedFieldInfo?.SetValue(player, player.Speed.Y); } } else { orig(self, player); } }