From b10eb8752b37a2c6baaef96368588b646deedbf2 Mon Sep 17 00:00:00 2001 From: PhatPhuckDave Date: Mon, 24 Feb 2025 21:51:37 +0100 Subject: [PATCH] Add projectile and missile projectile configuration to ModuleWeaponGunManager --- .../TerraTech/TerraTech.sln.DotSettings.user | 1 + .../TerraTech/ModuleWeaponGunManager.cs | 82 +++++++++++++++++-- .../TerraTech/ObjectFieldMultiplier.cs | 6 +- Projects/TerraTech/format.sh | 2 +- 4 files changed, 78 insertions(+), 13 deletions(-) diff --git a/Projects/TerraTech/TerraTech.sln.DotSettings.user b/Projects/TerraTech/TerraTech.sln.DotSettings.user index 8320613..6bb9f5e 100644 --- a/Projects/TerraTech/TerraTech.sln.DotSettings.user +++ b/Projects/TerraTech/TerraTech.sln.DotSettings.user @@ -6,6 +6,7 @@ True True ForceIncluded + ForceIncluded <AssemblyExplorer /> C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe 262144 diff --git a/Projects/TerraTech/TerraTech/ModuleWeaponGunManager.cs b/Projects/TerraTech/TerraTech/ModuleWeaponGunManager.cs index b1837f4..5199f12 100644 --- a/Projects/TerraTech/TerraTech/ModuleWeaponGunManager.cs +++ b/Projects/TerraTech/TerraTech/ModuleWeaponGunManager.cs @@ -9,6 +9,10 @@ namespace TerraTech { new MultipliedObjectManager(ConfigureManager); private static readonly MultipliedObjectManager fireDataManager = new MultipliedObjectManager(ConfigureFireData); + private static readonly MultipliedObjectManager projectileManager = + new MultipliedObjectManager(ConfigureProjectile); + private static readonly MultipliedObjectManager missileProjectileManager = + new MultipliedObjectManager(ConfigureMissileProjectile); public static ConfigEntry playerOnly; public static ConfigEntry kickbackStrengthMultiplier; @@ -18,6 +22,9 @@ namespace TerraTech { public static ConfigEntry shotCooldownMultiplier; public static ConfigEntry seekingRoundsAll; public static ConfigEntry resetBurstOnInterruptAll; + public static ConfigEntry projectileLifetimeMultiplier; + public static ConfigEntry missileProjectileBoosterLifetimeMultiplier; + public static ConfigEntry projectileExplodeOnStickAll; public static void Setup(ConfigFile config) { float min = 0.01f; @@ -60,6 +67,22 @@ namespace TerraTech { "FireData", "Reset Burst On Interrupt All", false, new ConfigDescription("Reset Burst On Interrupt All", new AcceptableValueRange(false, true))); resetBurstOnInterruptAll.SettingChanged += (sender, args) => DoPatch(); + + projectileLifetimeMultiplier = config.Bind( + "Projectile", "Lifetime Multiplier", 1f, + new ConfigDescription("Projectile Lifetime Multiplier", new AcceptableValueRange(min, max))); + projectileLifetimeMultiplier.SettingChanged += (sender, args) => DoPatch(); + + missileProjectileBoosterLifetimeMultiplier = + config.Bind("MissileProjectile", "Booster Lifetime Multiplier", 1f, + new ConfigDescription("Missile Projectile Booster Lifetime Multiplier", + new AcceptableValueRange(min, max))); + missileProjectileBoosterLifetimeMultiplier.SettingChanged += (sender, args) => DoPatch(); + + projectileExplodeOnStickAll = config.Bind( + "Projectile", "Explode On Stick All", false, + new ConfigDescription("Projectile Explode On Stick All", new AcceptableValueRange(false, true))); + projectileExplodeOnStickAll.SettingChanged += (sender, args) => DoPatch(); } private static void ConfigureManager(MultipliedObject obj) { @@ -72,10 +95,18 @@ namespace TerraTech { } private static void ConfigureFireData(MultipliedObject obj) { - obj.AddField( - new FieldConfiguration("m_MuzzleVelocity", muzzleVelocityMultiplier, ShouldApply)); - obj.AddField( - new FieldConfiguration("m_KickbackStrength", kickbackStrengthMultiplier, ShouldApply)); + obj.AddField(new FieldConfiguration("m_MuzzleVelocity", muzzleVelocityMultiplier)); + obj.AddField(new FieldConfiguration("m_KickbackStrength", kickbackStrengthMultiplier)); + } + + private static void ConfigureProjectile(MultipliedObject obj) { + obj.AddField(new FieldConfiguration("m_Lifetime", projectileLifetimeMultiplier)); + obj.AddField(new FieldConfiguration("m_ExplodeOnStick", projectileExplodeOnStickAll)); + } + + private static void ConfigureMissileProjectile(MultipliedObject obj) { + obj.AddField(new FieldConfiguration("m_MaxBoosterLifetime", + missileProjectileBoosterLifetimeMultiplier)); } private static readonly Func ShouldApply = obj => { @@ -87,24 +118,59 @@ namespace TerraTech { [HarmonyPrefix] [HarmonyPatch(typeof(ModuleWeaponGun), "OnAttached")] static void PostfixCreate(ModuleWeaponGun __instance) { - var trav = Traverse.Create(__instance); - var firingData = trav.Field("m_FireData"); - fireDataManager.OnObjectAttached(firingData.GetValue()); manager.OnObjectAttached(__instance); + if (playerOnly.Value && !CykUtil.IsPlayerTank(__instance)) + return; + + var trav = Traverse.Create(__instance); + var firingData = trav.Field("m_FiringData"); + var projectile = trav.Field("m_BulletPrefab"); + var projectileType = projectile.GetValueType(); + var isMissileProjectile = projectileType == typeof(MissileProjectile); + + fireDataManager.OnObjectAttached(firingData.GetValue()); + if (isMissileProjectile) { + var mproj = projectile.GetValue(); + if (mproj != null) + missileProjectileManager.OnObjectAttached(mproj); + } else { + var proj = projectile.GetValue(); + if (proj != null) + projectileManager.OnObjectAttached(proj); + } } [HarmonyPrefix] [HarmonyPatch(typeof(ModuleWeaponGun), "OnDetaching")] static void PostfixDestroy(ModuleWeaponGun __instance) { + manager.OnObjectAttached(__instance); var trav = Traverse.Create(__instance); - var firingData = trav.Field("m_FireData"); + if (playerOnly.Value && !CykUtil.IsPlayerTank(__instance)) + return; + + var firingData = trav.Field("m_FiringData"); + var projectile = trav.Field("m_BulletPrefab"); + var projectileType = projectile.GetValueType(); + var isMissileProjectile = projectileType == typeof(MissileProjectile); + fireDataManager.OnObjectDetached(firingData.GetValue()); manager.OnObjectDetached(__instance); + if (isMissileProjectile) { + var mproj = projectile.GetValue(); + if (mproj != null) + missileProjectileManager.OnObjectDetached(mproj); + } else { + var proj = projectile.GetValue(); + if (proj != null) + projectileManager.OnObjectDetached(proj); + } } public static void DoPatch() { fireDataManager.ApplyAll(); manager.ApplyAll(); + projectileManager.ApplyAll(); + missileProjectileManager.ApplyAll(); } } } diff --git a/Projects/TerraTech/TerraTech/ObjectFieldMultiplier.cs b/Projects/TerraTech/TerraTech/ObjectFieldMultiplier.cs index 88e7ac6..b668c9a 100644 --- a/Projects/TerraTech/TerraTech/ObjectFieldMultiplier.cs +++ b/Projects/TerraTech/TerraTech/ObjectFieldMultiplier.cs @@ -378,16 +378,14 @@ namespace TerraTech { public void ApplyTo(IEnumerable fieldNames = null) { IEnumerable fieldsToApply = fieldNames ?? _fields.Keys; - foreach (var fieldName in fieldsToApply.Where(name => _fields.ContainsKey(name))) { + foreach (var fieldName in fieldsToApply.Where(name => _fields.ContainsKey(name))) _fields[fieldName].Apply(); - } } public void RestoreTo(IEnumerable fieldNames = null) { IEnumerable fieldsToRestore = fieldNames ?? _fields.Keys; - foreach (var fieldName in fieldsToRestore.Where(name => _fields.ContainsKey(name))) { + foreach (var fieldName in fieldsToRestore.Where(name => _fields.ContainsKey(name))) _fields[fieldName].Restore(); - } } public void LogValues(string prefix) { diff --git a/Projects/TerraTech/format.sh b/Projects/TerraTech/format.sh index e62a815..a36993a 100644 --- a/Projects/TerraTech/format.sh +++ b/Projects/TerraTech/format.sh @@ -1 +1 @@ -wgo -dir TerraTech echo "Formatters" :: clang-format -i TerraTech/*.cs +wgo -dir TerraTech -debounce 1s echo "Formatters" :: clang-format -i TerraTech/*.cs