diff --git a/Aetheria.State.Verify/Program.cs b/Aetheria.State.Verify/Program.cs index 41f5505c7..9900473fa 100644 --- a/Aetheria.State.Verify/Program.cs +++ b/Aetheria.State.Verify/Program.cs @@ -8781,8 +8781,10 @@ static void RequireUnityPhysicsIsNotGameplayAuthority(string root) var ymirBridgePath = Path.Combine(root, "Assets", "Scripts", "Gameplay", "Physics", "AetheriaYmirPhysicsBridge.cs"); var projectilePath = Path.Combine(root, "Assets", "Scripts", "Gameplay", "Weapons", "Projectile.cs"); + var projectileManagerPath = Path.Combine(root, "Assets", "Scripts", "Gameplay", "Weapons", "ProjectileManager.cs"); var guidedProjectilePath = Path.Combine(root, "Assets", "Scripts", "Gameplay", "Weapons", "GuidedProjectile.cs"); var hitscanPath = Path.Combine(root, "Assets", "Scripts", "Gameplay", "Weapons", "HitscanEffect.cs"); + var hitscanManagerPath = Path.Combine(root, "Assets", "Scripts", "Gameplay", "Weapons", "HitscanManager.cs"); var clickRaycasterPath = Path.Combine(root, "Assets", "Scripts", "UI", "ClickRaycaster.cs"); var requiredSymbols = new Dictionary @@ -8834,6 +8836,31 @@ static void RequireUnityPhysicsIsNotGameplayAuthority(string root) "Ymir gameplay query bridge is incomplete: " + string.Join("; ", missingSymbols)); } + + var forbiddenWeaponZoneHandles = new Dictionary + { + [projectilePath] = new[] { "public Zone Zone", "Zone { get; set; }" }, + [projectileManagerPath] = new[] { "p.Zone =", "source.Entity.Zone" }, + [hitscanPath] = new[] { "public Zone Zone", "Zone { get; set; }" }, + [hitscanManagerPath] = new[] { "p.Zone =", "source.Entity.Zone" } + }; + var weaponZoneHandleHits = forbiddenWeaponZoneHandles + .Where(pair => File.Exists(pair.Key)) + .SelectMany(pair => + { + var text = File.ReadAllText(pair.Key); + return pair.Value + .Where(symbol => text.Contains(symbol, StringComparison.Ordinal)) + .Select(symbol => $"{Path.GetRelativePath(root, pair.Key)}: {symbol}"); + }) + .ToArray(); + + if (weaponZoneHandleHits.Length > 0) + { + throw new InvalidOperationException( + "Unity weapon effects must query Ymir/renderer state directly instead of carrying renderer-local Zone handles: " + + string.Join("; ", weaponZoneHandleHits)); + } } static void RequireDeadPropertiesPanelShellDeleted(string root) diff --git a/Assets/Scripts/Gameplay/Weapons/HitscanEffect.cs b/Assets/Scripts/Gameplay/Weapons/HitscanEffect.cs index f478bbf5d..8b342bb23 100644 --- a/Assets/Scripts/Gameplay/Weapons/HitscanEffect.cs +++ b/Assets/Scripts/Gameplay/Weapons/HitscanEffect.cs @@ -8,8 +8,6 @@ public class HitscanEffect : MonoBehaviour public ParticleSystem LineEffect; public Prototype HitEffect; - public Zone Zone { get; set; } - public float Damage { get; set; } public float Penetration { get; set; } public float Spread { get; set; } diff --git a/Assets/Scripts/Gameplay/Weapons/HitscanManager.cs b/Assets/Scripts/Gameplay/Weapons/HitscanManager.cs index ca611ac9c..7960f67ee 100644 --- a/Assets/Scripts/Gameplay/Weapons/HitscanManager.cs +++ b/Assets/Scripts/Gameplay/Weapons/HitscanManager.cs @@ -20,7 +20,6 @@ public class HitscanManager : InstantWeaponEffectManager p.Penetration = weapon.Penetration; p.Spread = weapon.DamageSpread; p.DamageType = weapon.DamageType; - p.Zone = source.Entity.Zone; p.Fire(); } } diff --git a/Assets/Scripts/Gameplay/Weapons/Projectile.cs b/Assets/Scripts/Gameplay/Weapons/Projectile.cs index 2f83d36ef..0c7a2abac 100644 --- a/Assets/Scripts/Gameplay/Weapons/Projectile.cs +++ b/Assets/Scripts/Gameplay/Weapons/Projectile.cs @@ -17,8 +17,6 @@ public class Projectile : MonoBehaviour private bool _alive; - public Zone Zone { get; set; } - public Vector3 StartPosition { get; set; } public Vector3 Velocity { get; set; } public float Damage { get; set; } diff --git a/Assets/Scripts/Gameplay/Weapons/ProjectileManager.cs b/Assets/Scripts/Gameplay/Weapons/ProjectileManager.cs index 9e18df8e9..3032d39bd 100644 --- a/Assets/Scripts/Gameplay/Weapons/ProjectileManager.cs +++ b/Assets/Scripts/Gameplay/Weapons/ProjectileManager.cs @@ -30,7 +30,6 @@ public class ProjectileManager : InstantWeaponEffectManager p.Penetration = weapon.Penetration; p.Spread = weapon.DamageSpread; p.DamageType = weapon.DamageType; - p.Zone = source.Entity.Zone; p.AirburstDistance = target != null ? CultMath.math.length(source.Entity.CultPosition - target.Entity.CultPosition) : (weapon.Range * .75f);