From 63fe87a91bd1ce3462addd6929a8a0c709cb6d29 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Sun, 14 Jun 2026 17:43:42 +0100 Subject: [PATCH] Move weapon effect binding behind runtime owner --- .voidbot/state/aetheria.cc | Bin 85265 -> 85362 bytes Assets/Scripts/Gameplay/EntityInstance.cs | 32 +++++++++--------- .../Gameplay/Weapons/ConstantLaserManager.cs | 12 +++---- .../Weapons/ConstantLightningManager.cs | 12 +++---- .../Weapons/ConstantParticleWeaponManager.cs | 6 ++-- .../Weapons/ConstantWeaponEffectManager.cs | 2 +- .../ServerShared/Behaviors/ConstantWeapon.cs | 1 + .../Scripts/ServerShared/Behaviors/Weapon.cs | 3 ++ docs/aetheria-perfect-machine-map.md | 4 +++ 9 files changed, 40 insertions(+), 32 deletions(-) diff --git a/.voidbot/state/aetheria.cc b/.voidbot/state/aetheria.cc index f1167c1c9ede9e12c9b9d39d00eaa15daa1d20cc..a94aeba66649c14eddbf2b29919a5e7dfd72fd96 100644 GIT binary patch delta 1071 zcmah|&rcIU6wVYXV4{g8K2W=P!9Ekz1Q`Bh>JA^swoaB`TPrDL}<&FpNOniw=5 zy#O1XgtN*`J(v(qp45Yh;U=8?8}#6rVP_XZ#CV%|Gw*%xec$)iH`Bj1)9>G;P8Wy9 z^2MB8vX|CDZ}=(o{3voYitvs{N0HGe(%pF}H8K2bpmTem6O=~!2N97~A}F$21T{Fb zi0cw8)#GvS5R}!qNzl6rJ1Rk4H7OTSV}>d7R? z-o8`eSbK(Pa~vDfif1|IyI4EzB_Z`r)OnM#6>TQ>(3-IaHoo?C6&LN&SYcHC=mrQjudC~v? delta 992 zcmah|J7^R^7-lXHFM%{l60PzV5e(!mce%to4M{vpAxb0~n@o0R?5J9m?8B$o;DA)wS+QP!v*oZiDyLUk>tZwgr&G-2KAG;loc01m@NTmxC z)A{l2Xg)e_>yO^09&{yv(Skl+M12u&yVD9y#G!QiKx+2W_E7u&P&=BOh@QOdK3yX? z;4I@}AD2i*)dQlpX3)mH{7NGMaRO`ts07AqAVQ|7Pcpp5hzmYZ*u@HGpF0&y{iB^F z!8eGbXoU^{~i|HVUxon$DVGU$ekc92}@n5D6z#!4upERVH9KNhLyK z1ZVb-C1}---;h8JSR-ug<%x^iPX+M~qT{u*o$)LB>l}hqennrKMSU0S)X*pYdXara zs>Vj=?VRZX#sMXX7kZWW+AhI(9ZA z^uD)qY&kzUo!4K|XyA _radiatorSfx = new Dictionary(); - private static Dictionary _instantWeaponManagers = new Dictionary(); - private static Dictionary _constantWeaponManagers = new Dictionary(); + private static Dictionary _instantWeaponManagers = new Dictionary(); + private static Dictionary _constantWeaponManagers = new Dictionary(); public static void ClearWeaponManagers() { @@ -217,23 +217,23 @@ public class EntityInstance : MonoBehaviour if (behavior is InstantWeapon instantWeapon) { - var data = (InstantWeaponData) instantWeapon.Data; - if (!_instantWeaponManagers.ContainsKey(data)) + var effectPrefab = instantWeapon.EffectPrefab; + if (!_instantWeaponManagers.ContainsKey(effectPrefab)) { - var managerPrefab = UnityHelpers.LoadAsset(data.EffectPrefab); + var managerPrefab = UnityHelpers.LoadAsset(effectPrefab); if(managerPrefab) { - _instantWeaponManagers.Add(data, Instantiate(managerPrefab, EffectManagerParent)); + _instantWeaponManagers.Add(effectPrefab, Instantiate(managerPrefab, EffectManagerParent)); } - else Debug.LogError($"No InstantWeaponEffectManager prefab found at path {data.EffectPrefab}"); + else Debug.LogError($"No InstantWeaponEffectManager prefab found at path {effectPrefab}"); } instantWeapon.OnFire += () => - _instantWeaponManagers[data].Fire(instantWeapon, item, this, entity.Target.Value != null && ZoneRenderer.EntityInstances.ContainsKey(entity.Target.Value) ? ZoneRenderer.EntityInstances[entity.Target.Value] : null); + _instantWeaponManagers[effectPrefab].Fire(instantWeapon, item, this, entity.Target.Value != null && ZoneRenderer.EntityInstances.ContainsKey(entity.Target.Value) ? ZoneRenderer.EntityInstances[entity.Target.Value] : null); if (behavior is ChargedWeapon chargedWeapon) { - var chargeManager = _instantWeaponManagers[data].GetComponent(); + var chargeManager = _instantWeaponManagers[effectPrefab].GetComponent(); if (chargeManager) { chargedWeapon.OnStartCharging += () => chargeManager.StartCharging(chargedWeapon, item, this); @@ -246,21 +246,21 @@ public class EntityInstance : MonoBehaviour if (behavior is ConstantWeapon constantWeapon) { - var data = (ConstantWeaponData) constantWeapon.Data; - if (!_constantWeaponManagers.ContainsKey(data)) + var effectPrefab = constantWeapon.EffectPrefab; + if (!_constantWeaponManagers.ContainsKey(effectPrefab)) { - var managerPrefab = UnityHelpers.LoadAsset(data.EffectPrefab); + var managerPrefab = UnityHelpers.LoadAsset(effectPrefab); if(managerPrefab) { - _constantWeaponManagers.Add(data, Instantiate(managerPrefab, EffectManagerParent)); + _constantWeaponManagers.Add(effectPrefab, Instantiate(managerPrefab, EffectManagerParent)); } - else Debug.LogError($"No ConstantWeaponEffectManager prefab found at path {data.EffectPrefab}"); + else Debug.LogError($"No ConstantWeaponEffectManager prefab found at path {effectPrefab}"); } constantWeapon.OnStartFiring += () => - _constantWeaponManagers[data].StartFiring(data, item, this, entity.Target.Value != null ? ZoneRenderer.EntityInstances[entity.Target.Value] : null); + _constantWeaponManagers[effectPrefab].StartFiring(constantWeapon, item, this, entity.Target.Value != null ? ZoneRenderer.EntityInstances[entity.Target.Value] : null); constantWeapon.OnStopFiring += () => - _constantWeaponManagers[data].StopFiring(item); + _constantWeaponManagers[effectPrefab].StopFiring(item); } } diff --git a/Assets/Scripts/Gameplay/Weapons/ConstantLaserManager.cs b/Assets/Scripts/Gameplay/Weapons/ConstantLaserManager.cs index 351314e61..ccc7d048e 100644 --- a/Assets/Scripts/Gameplay/Weapons/ConstantLaserManager.cs +++ b/Assets/Scripts/Gameplay/Weapons/ConstantLaserManager.cs @@ -8,21 +8,21 @@ public class ConstantLaserManager : ConstantWeaponEffectManager private Dictionary _lasers = new Dictionary(); - public override void StartFiring(WeaponData data, EquippedItem item, EntityInstance source, EntityInstance target) + public override void StartFiring(ConstantWeapon weapon, EquippedItem item, EntityInstance source, EntityInstance target) { var p = LaserPrototype.Instantiate(); p.SourceEntity = source.Entity; var hp = source.Entity.Hardpoints[item.Position.x, item.Position.y]; var barrel = source.GetBarrel(hp); - p.Range = item.Evaluate(data.Range); + p.Range = weapon.Range; var t = p.transform; t.SetParent(barrel); t.forward = barrel.forward; t.position = barrel.position; - p.Damage = item.Evaluate(data.Damage); - p.Penetration = item.Evaluate(data.Penetration); - p.Spread = item.Evaluate(data.DamageSpread); - p.DamageType = data.DamageType; + p.Damage = weapon.Damage; + p.Penetration = weapon.Penetration; + p.Spread = weapon.DamageSpread; + p.DamageType = weapon.DamageType; _lasers.Add(item, p); } diff --git a/Assets/Scripts/Gameplay/Weapons/ConstantLightningManager.cs b/Assets/Scripts/Gameplay/Weapons/ConstantLightningManager.cs index 77a1be884..f0b152576 100644 --- a/Assets/Scripts/Gameplay/Weapons/ConstantLightningManager.cs +++ b/Assets/Scripts/Gameplay/Weapons/ConstantLightningManager.cs @@ -9,18 +9,18 @@ public class ConstantLightningManager : ConstantWeaponEffectManager private Dictionary _bolts = new Dictionary(); - public override void StartFiring(WeaponData data, EquippedItem item, EntityInstance source, EntityInstance target) + public override void StartFiring(ConstantWeapon weapon, EquippedItem item, EntityInstance source, EntityInstance target) { var p = LightningPrototype.Instantiate(); p.Source = source; var hp = source.Entity.Hardpoints[item.Position.x, item.Position.y]; var barrel = source.GetBarrel(hp); p.Barrel = barrel; - p.Damage = item.Evaluate(data.Damage); - p.Range = item.Evaluate(data.Range); - p.Penetration = item.Evaluate(data.Penetration); - p.Spread = item.Evaluate(data.DamageSpread); - p.DamageType = data.DamageType; + p.Damage = weapon.Damage; + p.Range = weapon.Range; + p.Penetration = weapon.Penetration; + p.Spread = weapon.DamageSpread; + p.DamageType = weapon.DamageType; _bolts.Add(item, p); } diff --git a/Assets/Scripts/Gameplay/Weapons/ConstantParticleWeaponManager.cs b/Assets/Scripts/Gameplay/Weapons/ConstantParticleWeaponManager.cs index 6326330e3..64b8c95b2 100644 --- a/Assets/Scripts/Gameplay/Weapons/ConstantParticleWeaponManager.cs +++ b/Assets/Scripts/Gameplay/Weapons/ConstantParticleWeaponManager.cs @@ -8,7 +8,7 @@ public class ConstantParticleWeaponManager : ConstantWeaponEffectManager private Dictionary _weapons = new Dictionary(); - public override void StartFiring(WeaponData data, EquippedItem item, EntityInstance source, EntityInstance target) + public override void StartFiring(ConstantWeapon weapon, EquippedItem item, EntityInstance source, EntityInstance target) { var p = WeaponPrototype.Instantiate(); p.Source = source; @@ -19,8 +19,8 @@ public class ConstantParticleWeaponManager : ConstantWeaponEffectManager t.SetParent(barrel); t.forward = barrel.forward; t.position = barrel.position; - p.Damage = item.Evaluate(data.Damage); - p.DamageType = data.DamageType; + p.Damage = weapon.Damage; + p.DamageType = weapon.DamageType; _weapons.Add(item, p); p.Initialize(); } diff --git a/Assets/Scripts/Gameplay/Weapons/ConstantWeaponEffectManager.cs b/Assets/Scripts/Gameplay/Weapons/ConstantWeaponEffectManager.cs index 0a0dc8438..265640da3 100644 --- a/Assets/Scripts/Gameplay/Weapons/ConstantWeaponEffectManager.cs +++ b/Assets/Scripts/Gameplay/Weapons/ConstantWeaponEffectManager.cs @@ -4,6 +4,6 @@ using UnityEngine; public abstract class ConstantWeaponEffectManager : MonoBehaviour { - public abstract void StartFiring(WeaponData data, EquippedItem item, EntityInstance source, EntityInstance target); + public abstract void StartFiring(ConstantWeapon weapon, EquippedItem item, EntityInstance source, EntityInstance target); public abstract void StopFiring(EquippedItem item); } diff --git a/Assets/Scripts/ServerShared/Behaviors/ConstantWeapon.cs b/Assets/Scripts/ServerShared/Behaviors/ConstantWeapon.cs index f38c2923c..25d3fbb06 100644 --- a/Assets/Scripts/ServerShared/Behaviors/ConstantWeapon.cs +++ b/Assets/Scripts/ServerShared/Behaviors/ConstantWeapon.cs @@ -137,6 +137,7 @@ public class ConstantWeapon : Weapon, IProgressBehavior, IEventBehavior { if(!_firing && !_reloading) { + UpdateStats(); _firing = true; OnStartFiring?.Invoke(); } diff --git a/Assets/Scripts/ServerShared/Behaviors/Weapon.cs b/Assets/Scripts/ServerShared/Behaviors/Weapon.cs index b8a562e17..a2d592875 100644 --- a/Assets/Scripts/ServerShared/Behaviors/Weapon.cs +++ b/Assets/Scripts/ServerShared/Behaviors/Weapon.cs @@ -69,6 +69,7 @@ public abstract class Weapon : Behavior, IActivatedBehavior public abstract int Ammo { get; } public WeaponData WeaponData => _data; public DamageType DamageType { get; } + public string EffectPrefab { get; } public float Damage { get; protected set; } public float Penetration { get; protected set; } @@ -92,12 +93,14 @@ public abstract class Weapon : Behavior, IActivatedBehavior { _data = data; DamageType = data.DamageType; + EffectPrefab = data.EffectPrefab ?? ""; } public Weapon(WeaponData data, ConsumableItemEffect item) : base(data, item) { _data = data; DamageType = data.DamageType; + EffectPrefab = data.EffectPrefab ?? ""; } protected virtual void UpdateStats() diff --git a/docs/aetheria-perfect-machine-map.md b/docs/aetheria-perfect-machine-map.md index d8b587cdd..a1e05f140 100644 --- a/docs/aetheria-perfect-machine-map.md +++ b/docs/aetheria-perfect-machine-map.md @@ -1003,6 +1003,10 @@ First Aetheria surfaces to publish: - Done: move projectile, hitscan, beam, lightning, and mine effect damage type reads off `WeaponData` and onto `Weapon.DamageType`; effect managers consume live weapon metadata instead of config DTO fields. + - Done: move weapon effect prefab lookup and constant weapon visual startup + off `InstantWeaponData`/`ConstantWeaponData`; `EntityInstance` caches + managers by `Weapon.EffectPrefab`, and constant effect managers consume + live `ConstantWeapon` stats. - Done: delete the legacy `Behaviors` lists from `ConsumableItemData` and `EquippableItemData`; item DTOs can no longer carry behavior config state. - Done: move runtime blueprint price aggregation and conductivity restore