From 36f17cf517306b7e04f96b5ca5ded3dc024d956d Mon Sep 17 00:00:00 2001 From: karl2883 Date: Tue, 30 Jun 2026 06:21:36 +0200 Subject: [PATCH] use player component instead of DymamicData in InteractiveChaser --- Code/FLCC/InteractiveChaser.cs | 70 +++++++++++++++++++++------------- 1 file changed, 43 insertions(+), 27 deletions(-) diff --git a/Code/FLCC/InteractiveChaser.cs b/Code/FLCC/InteractiveChaser.cs index c6989f6..a2ccd5d 100644 --- a/Code/FLCC/InteractiveChaser.cs +++ b/Code/FLCC/InteractiveChaser.cs @@ -6,7 +6,6 @@ using Monocle; using MonoMod.Cil; using MonoMod.RuntimeDetour; -using MonoMod.Utils; using System; using System.Collections; using System.Collections.Generic; @@ -21,12 +20,6 @@ namespace vitmod public class InteractiveChaser : Entity { internal static DetourConfig RootConfig = new("CrystallineHelper_InteractiveChaser", 0); - private const string vitellaryInteractiveChaserStates = "vitellaryInteractiveChaserStates"; - private const string vitellaryChaserPosition = "vitellaryChaserPosition"; - private const string vitellaryChaserMovementCounter = "vitellaryChaserMovementCounter"; - private const string vitellaryChaserSpeed = "vitellaryChaserSpeed"; - private const string vitellaryChaserDashed = "vitellaryChaserDashed"; - public static readonly Color HairColor = Calc.HexToColor("9B3FB5"); public PlayerSprite Sprite; @@ -322,7 +315,7 @@ private bool GetChasePosition(Player player, float sceneTime, float timeAgo, out { if (!player.Dead) { - var chaserStates = DynamicData.For(player).Get>(vitellaryInteractiveChaserStates); + var chaserStates = GetPlayerComponent(player).ChaserStates; bool flag = false; foreach (ChaserState chaserState in chaserStates) { @@ -394,7 +387,7 @@ private static void PlayerDeadBody_ctor(On.Celeste.PlayerDeadBody.orig_ctor orig private static void Player_OnTransition(On.Celeste.Player.orig_OnTransition orig, Player self) { - var chaserStates = DynamicData.For(self).Get>(vitellaryInteractiveChaserStates); + var chaserStates = GetPlayerComponent(self).ChaserStates; chaserStates.Clear(); orig(self); } @@ -422,30 +415,25 @@ private static void Player_orig_Update(ILContext il) { cursor.Emit(OpCodes.Ldarg_0); cursor.EmitDelegate>(player => { - var playerData = DynamicData.For(player); - playerData.Set(vitellaryChaserPosition, player.Position); - playerData.Set(vitellaryChaserMovementCounter, player.movementCounter); - playerData.Set(vitellaryChaserSpeed, player.Speed); + var playerData = GetPlayerComponent(player); + playerData.ChaserPosition = player.Position; + playerData.ChaserMovementCounter = player.movementCounter; + playerData.ChaserSpeed = player.Speed; if (player.DashAttacking && player.Speed.Length() > 0f) - playerData.Set(vitellaryChaserDashed, player.DashDir); + playerData.ChaserDashed = player.DashDir; }); } private static void Player_Update(On.Celeste.Player.orig_Update orig, Player self) { - DynamicData.For(self).Set(vitellaryChaserDashed, Vector2.Zero); + GetPlayerComponent(self).ChaserDashed = Vector2.Zero; orig(self); } private static void Player_ctor(On.Celeste.Player.orig_ctor orig, Player self, Vector2 position, PlayerSpriteMode spriteMode) { orig(self, position, spriteMode); - var playerData = DynamicData.For(self); - playerData.Set(vitellaryInteractiveChaserStates, new List()); - playerData.Set(vitellaryChaserPosition, self.Position); - playerData.Set(vitellaryChaserSpeed, self.Speed); - playerData.Set(vitellaryChaserMovementCounter, self.movementCounter); - playerData.Set(vitellaryChaserDashed, Vector2.Zero); + self.Add(new InteractiveChaserPlayerComponent(self)); } private static PlayerDeadBody Player_Die(On.Celeste.Player.orig_Die orig, Player self, Vector2 direction, bool evenIfInvincible, bool registerDeathInStats) @@ -461,7 +449,7 @@ private static void Player_UpdateChaserStates(On.Celeste.Player.orig_UpdateChase if (chasers.Count > 0) { var maxDelay = chasers.Max(e => (e as InteractiveChaser).FollowDelay); - var chaserStates = DynamicData.For(self).Get>(vitellaryInteractiveChaserStates); + var chaserStates = GetPlayerComponent(self).ChaserStates; while (chaserStates.Count > 0 && self.Scene.TimeActive - chaserStates[0].TimeStamp > maxDelay) chaserStates.RemoveAt(0); chaserStates.Add(new ChaserState(self)); @@ -469,6 +457,34 @@ private static void Player_UpdateChaserStates(On.Celeste.Player.orig_UpdateChase orig(self); } + private static InteractiveChaserPlayerComponent GetPlayerComponent(Player player) + { + var component = player.Get(); + if (component == null) + { + player.Add(component = new InteractiveChaserPlayerComponent(player)); + } + return component; + } + + private class InteractiveChaserPlayerComponent : Component + { + public List ChaserStates; + public Vector2 ChaserPosition; + public Vector2 ChaserMovementCounter; + public Vector2 ChaserSpeed; + public Vector2 ChaserDashed; + + public InteractiveChaserPlayerComponent(Player player) : base(active: false, visible: false) + { + ChaserStates = new List(); + ChaserPosition = player.Position; + ChaserMovementCounter = player.movementCounter; + ChaserSpeed = player.Speed; + ChaserDashed = Vector2.Zero; + } + } + private static Dictionary MirrorScales = new Dictionary() { { MirrorMode.None, new Vector2(1f, 1f) }, @@ -695,7 +711,7 @@ public Player.ChaserStateSound this[int index] public ChaserState(Player player) { - var playerData = DynamicData.For(player); + var playerData = GetPlayerComponent(player); Exists = true; Bottom = player.BottomCenter; Position = player.Position; @@ -706,10 +722,10 @@ public ChaserState(Player player) HairColor = player.Hair.Color; Depth = player.Depth; Scale = new Vector2(Math.Abs(player.Sprite.Scale.X) * (float)player.Facing, player.Sprite.Scale.Y); - EarlyPosition = playerData.Get(vitellaryChaserPosition); - MovementCounter = playerData.Get(vitellaryChaserMovementCounter); - Speed = playerData.Get(vitellaryChaserSpeed); - DashDir = playerData.Get(vitellaryChaserDashed); + EarlyPosition = playerData.ChaserPosition; + MovementCounter = playerData.ChaserMovementCounter; + Speed = playerData.ChaserSpeed; + DashDir = playerData.ChaserDashed; DeltaTime = Engine.DeltaTime; Ducking = player.Ducking; State = player.StateMachine.State;