Skip to content

Commit

Permalink
Merge branch 'develop'
Browse files Browse the repository at this point in the history
  • Loading branch information
swoolcock committed Jan 27, 2025
2 parents a1d836e + 0ca5d69 commit 50d30c4
Show file tree
Hide file tree
Showing 6 changed files with 55 additions and 20 deletions.
2 changes: 1 addition & 1 deletion Loenn/consts.lua
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ local function makeOptions(options, defaults, ...)
end

local consts = {
modVersion = "1.2.22",
modVersion = "1.2.23",
ignoredFields = {
"modVersion",
"pluginVersion",
Expand Down
1 change: 1 addition & 0 deletions Loenn/entities/upsideDownJumpThru.lua
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ local placementData = helpers.createPlacementData('1', {
attached = false,
triggerStaticMovers = true,
invisible = false,
surfaceIndex = -1,
})

local upsideDownJumpThru = {
Expand Down
50 changes: 34 additions & 16 deletions Source/Components/GravityHoldable.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// Copyright (c) Shane Woolcock. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.

using System;
using Celeste.Mod.GravityHelper.Entities.Controllers;
using Celeste.Mod.GravityHelper.Extensions;
using Celeste.Mod.GravityHelper.Triggers;
Expand All @@ -11,26 +12,35 @@ namespace Celeste.Mod.GravityHelper.Components;
[Tracked]
public class GravityHoldable : Component
{
private float _invertTime = BehaviorGravityController.DEFAULT_HOLDABLE_RESET_TIME;
public float InvertTime
[Obsolete("Use ResetTime and ResetType instead.")]
public float InvertTime { get; set; }

private float _sceneResetTime = BehaviorGravityController.DEFAULT_HOLDABLE_RESET_TIME;
private float _resetTimeRemaining;
private float? _resetTime;
public float ResetTime
{
get => _invertTime;
set => _invertTime = _invertTimeRemaining = value;
get => _resetTime ?? _sceneResetTime;
set
{
_resetTime = value < 0 ? null : value;
_resetTimeRemaining = ResetTime;
}
}

private float _invertTimeRemaining;
public GravityType ResetType { get; set; } = GravityType.Normal;

public GravityHoldable() : base(true, false)
{
}

public void ResetInvertTime() => _invertTimeRemaining = InvertTime;
public void ResetTimer() => _resetTimeRemaining = ResetTime;

public void SetGravityHeld()
{
if (Entity?.Get<GravityComponent>() is not { } gravityComponent) return;

ResetInvertTime();
ResetTimer();

var targetGravity = GravityHelperModule.PlayerComponent?.CurrentGravity ?? GravityType.Normal;
if (gravityComponent.CurrentGravity != targetGravity)
Expand All @@ -43,7 +53,7 @@ public override void Added(Entity entity)

// the entity may already be part of the scene before the component is added
if (entity.Scene != null)
updateInvertTime(entity.Scene);
updateResetTime(entity.Scene);

if (entity.Get<GravityComponent>() == null && entity.Get<Holdable>() is { } holdable)
{
Expand All @@ -58,15 +68,15 @@ public override void Added(Entity entity)
{
entity.Add(new GravityListener(entity)
{
GravityChanged = (_, _) => ResetInvertTime(),
GravityChanged = (_, _) => ResetTimer(),
});
}
}

public override void EntityAdded(Scene scene)
{
base.EntityAdded(scene);
updateInvertTime(scene);
updateResetTime(scene);
}

public override void EntityAwake()
Expand All @@ -78,10 +88,11 @@ public override void EntityAwake()
Entity.SetGravity(GravityType.Inverted);
}

private void updateInvertTime(Scene scene)
private void updateResetTime(Scene scene)
{
var controller = scene.GetActiveController<BehaviorGravityController>();
InvertTime = controller?.HoldableResetTime ?? BehaviorGravityController.DEFAULT_HOLDABLE_RESET_TIME;
_sceneResetTime = controller?.HoldableResetTime ?? BehaviorGravityController.DEFAULT_HOLDABLE_RESET_TIME;
_resetTimeRemaining = _sceneResetTime;
}

public override void Update()
Expand All @@ -94,11 +105,18 @@ public override void Update()

if (holdable.IsHeld)
SetGravityHeld();
else if (InvertTime > 0 && _invertTimeRemaining > 0 && gravityComponent.CurrentGravity == GravityType.Inverted)
else if (ResetTime > 0 && _resetTimeRemaining > 0)
{
_invertTimeRemaining -= Engine.DeltaTime;
if (_invertTimeRemaining <= 0)
gravityComponent.SetGravity(GravityType.Normal);
// if the holdable is within a trigger/field that should keep it something other than the reset type, reset the inversion timer
if (Entity.CollideCheckWhere<GravityTrigger>(f => f.GravityType != ResetType && f.AffectsHoldableActors))
{
ResetTimer();
return;
}

_resetTimeRemaining -= Engine.DeltaTime;
if (_resetTimeRemaining <= 0)
gravityComponent.SetGravity(ResetType);
}
}
}
16 changes: 16 additions & 0 deletions Source/GravityHelperExports.cs
Original file line number Diff line number Diff line change
Expand Up @@ -93,4 +93,20 @@ public static IDisposable WithOverride()
GravityHelperModule.OverrideSemaphore++;
return new InvokeOnDispose(() => GravityHelperModule.OverrideSemaphore--);
}

public static void SetHoldableResetTime(Holdable holdable, float resetTime)
{
if (holdable?.Entity.Get<GravityHoldable>() is { } gravityHoldable)
{
gravityHoldable.ResetTime = resetTime;
}
}

public static void SetHoldableResetType(Holdable holdable, int gravityType)
{
if (holdable?.Entity.Get<GravityHoldable>() is { } gravityHoldable)
{
gravityHoldable.ResetType = (GravityType)gravityType;
}
}
}
4 changes: 2 additions & 2 deletions Source/Hooks/HoldableHooks.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,8 @@ private static void Holdable_Release(ILContext il) => HookUtils.SafeHook(() =>
private static bool Holdable_Pickup(On.Celeste.Holdable.orig_Pickup orig, Holdable self, Player player)
{
var rv = orig(self, player);
if (self.Entity?.Get<GravityHoldable>() is { } gravityHoldable)
if (rv && self.Entity?.Get<GravityHoldable>() is { } gravityHoldable)
gravityHoldable.SetGravityHeld();
return rv;
}
}
}
2 changes: 1 addition & 1 deletion everest.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
- Name: GravityHelper
Version: 1.2.22
Version: 1.2.23
DLL: bin/GravityHelper.dll
Dependencies:
- Name: EverestCore
Expand Down

0 comments on commit 50d30c4

Please sign in to comment.