Add projectile and missile projectile configuration to ModuleWeaponGunManager

This commit is contained in:
2025-02-24 21:51:37 +01:00
parent d0ffe1951b
commit b10eb8752b
4 changed files with 78 additions and 13 deletions

View File

@@ -6,6 +6,7 @@
<s:Boolean x:Key="/Default/AddReferences/RecentPaths/=C_003A_005CUsers_005CAdministrator_005CRiderProjects_005CBepinex_005CProjects_005CTerraTech_005Clibs_005CUnityEngine_002ECoreModule_002Edll/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/AddReferences/RecentPaths/=C_003A_005CUsers_005CAdministrator_005CRiderProjects_005CBepinex_005CProjects_005CTerraTech_005Clibs_005CUnityEngine_002Edll/@EntryIndexedValue">True</s:Boolean>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ABaseUnityPlugin_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F9185a461e2a54cd99ed3b83eace57b3d1f200_003F59_003Fb886ba39_003FBaseUnityPlugin_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ATraverse_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F474744d65d8e460fa08cd5fd82b5d65f32000_003F24_003F10e7e9ab_003FTraverse_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/Environment/AssemblyExplorer/XmlDocument/@EntryValue">&lt;AssemblyExplorer /&gt;</s:String>
<s:String x:Key="/Default/Environment/Hierarchy/Build/BuildTool/CustomBuildToolPath/@EntryValue">C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe</s:String>
<s:Int64 x:Key="/Default/Environment/Hierarchy/Build/BuildTool/MsbuildVersion/@EntryValue">262144</s:Int64>

View File

@@ -9,6 +9,10 @@ namespace TerraTech {
new MultipliedObjectManager<ModuleWeaponGun>(ConfigureManager);
private static readonly MultipliedObjectManager<FireData> fireDataManager =
new MultipliedObjectManager<FireData>(ConfigureFireData);
private static readonly MultipliedObjectManager<Projectile> projectileManager =
new MultipliedObjectManager<Projectile>(ConfigureProjectile);
private static readonly MultipliedObjectManager<MissileProjectile> missileProjectileManager =
new MultipliedObjectManager<MissileProjectile>(ConfigureMissileProjectile);
public static ConfigEntry<bool> playerOnly;
public static ConfigEntry<float> kickbackStrengthMultiplier;
@@ -18,6 +22,9 @@ namespace TerraTech {
public static ConfigEntry<float> shotCooldownMultiplier;
public static ConfigEntry<bool> seekingRoundsAll;
public static ConfigEntry<bool> resetBurstOnInterruptAll;
public static ConfigEntry<float> projectileLifetimeMultiplier;
public static ConfigEntry<float> missileProjectileBoosterLifetimeMultiplier;
public static ConfigEntry<bool> 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<bool>(false, true)));
resetBurstOnInterruptAll.SettingChanged += (sender, args) => DoPatch();
projectileLifetimeMultiplier = config.Bind(
"Projectile", "Lifetime Multiplier", 1f,
new ConfigDescription("Projectile Lifetime Multiplier", new AcceptableValueRange<float>(min, max)));
projectileLifetimeMultiplier.SettingChanged += (sender, args) => DoPatch();
missileProjectileBoosterLifetimeMultiplier =
config.Bind("MissileProjectile", "Booster Lifetime Multiplier", 1f,
new ConfigDescription("Missile Projectile Booster Lifetime Multiplier",
new AcceptableValueRange<float>(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<bool>(false, true)));
projectileExplodeOnStickAll.SettingChanged += (sender, args) => DoPatch();
}
private static void ConfigureManager(MultipliedObject<ModuleWeaponGun> obj) {
@@ -72,10 +95,18 @@ namespace TerraTech {
}
private static void ConfigureFireData(MultipliedObject<FireData> obj) {
obj.AddField(
new FieldConfiguration<float, float>("m_MuzzleVelocity", muzzleVelocityMultiplier, ShouldApply));
obj.AddField(
new FieldConfiguration<float, float>("m_KickbackStrength", kickbackStrengthMultiplier, ShouldApply));
obj.AddField(new FieldConfiguration<float, float>("m_MuzzleVelocity", muzzleVelocityMultiplier));
obj.AddField(new FieldConfiguration<float, float>("m_KickbackStrength", kickbackStrengthMultiplier));
}
private static void ConfigureProjectile(MultipliedObject<Projectile> obj) {
obj.AddField(new FieldConfiguration<float, float>("m_Lifetime", projectileLifetimeMultiplier));
obj.AddField(new FieldConfiguration<bool, bool>("m_ExplodeOnStick", projectileExplodeOnStickAll));
}
private static void ConfigureMissileProjectile(MultipliedObject<MissileProjectile> obj) {
obj.AddField(new FieldConfiguration<float, float>("m_MaxBoosterLifetime",
missileProjectileBoosterLifetimeMultiplier));
}
private static readonly Func<object, bool> 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<FireData>());
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<FireData>());
if (isMissileProjectile) {
var mproj = projectile.GetValue<MissileProjectile>();
if (mproj != null)
missileProjectileManager.OnObjectAttached(mproj);
} else {
var proj = projectile.GetValue<Projectile>();
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<FireData>());
manager.OnObjectDetached(__instance);
if (isMissileProjectile) {
var mproj = projectile.GetValue<MissileProjectile>();
if (mproj != null)
missileProjectileManager.OnObjectDetached(mproj);
} else {
var proj = projectile.GetValue<Projectile>();
if (proj != null)
projectileManager.OnObjectDetached(proj);
}
}
public static void DoPatch() {
fireDataManager.ApplyAll();
manager.ApplyAll();
projectileManager.ApplyAll();
missileProjectileManager.ApplyAll();
}
}
}

View File

@@ -378,16 +378,14 @@ namespace TerraTech {
public void ApplyTo(IEnumerable<string> fieldNames = null) {
IEnumerable<string> 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<string> fieldNames = null) {
IEnumerable<string> 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) {

View File

@@ -1 +1 @@
wgo -dir TerraTech echo "Formatters" :: clang-format -i TerraTech/*.cs
wgo -dir TerraTech -debounce 1s echo "Formatters" :: clang-format -i TerraTech/*.cs