Implement beam patcher

This commit is contained in:
David Majdandžić
2023-04-10 18:33:55 +02:00
parent c5d0a20e0e
commit 0514ffe337
5 changed files with 110 additions and 30 deletions

View File

@@ -19,31 +19,37 @@ namespace TerraTech {
private const string pluginName = "CykaMod";
private const string pluginVersion = "1.0.0";
public static ConfigEntry<int> xpMultiplier;
public static ConfigEntry<int> moneyMultiplier;
public static ConfigEntry<float> xpMultiplier;
public static ConfigEntry<float> moneyMultiplier;
public static ConfigEntry<float> energyGenMultiplier;
public static ConfigEntry<float> magnetStrenghtMultiplier;
public static ConfigEntry<float> magnetRadiusMultiplier;
public static ConfigEntry<bool> allProjectilesHoming;
public static ConfigEntry<float> heartbeatIntervalMultiplier;
public static ConfigEntry<float> shootingSpeedMultiplier;
public static ConfigEntry<float> muzzleVelocityMultiplier;
public static ConfigEntry<float> heartbeatIntervalMultiplier;
public static ConfigEntry<bool> allProjectilesHoming;
public static ConfigEntry<float> magnetStrenghtMultiplier;
public static ConfigEntry<float> magnetRadiusMultiplier;
public static ConfigEntry<float> beamStrenghtMultiplier;
public static ConfigEntry<float> beamRadiusMultiplier;
public void Awake() {
xpMultiplier = Config.Bind("General", "XP Multiplier", 1, new ConfigDescription("XP Multiplier", new AcceptableValueRange<int>(1, 32)));
moneyMultiplier = Config.Bind("General", "Money Multiplier", 1, new ConfigDescription("Money Multiplier", new AcceptableValueRange<int>(1, 32)));
xpMultiplier = Config.Bind("General", "XP Multiplier", 1f, new ConfigDescription("XP Multiplier", new AcceptableValueRange<float>(1f, 32f)));
moneyMultiplier = Config.Bind("General", "Money Multiplier", 1f, new ConfigDescription("Money Multiplier", new AcceptableValueRange<float>(1f, 32f)));
energyGenMultiplier = Config.Bind("General", "Energy Generation Multiplier", 1f,
new ConfigDescription("Energy Generation Multiplier", new AcceptableValueRange<float>(1f, 64f)));
heartbeatIntervalMultiplier = Config.Bind("General", "Heartbeat Interval Multiplier", 1f,
new ConfigDescription("Heartbeat Interval Multiplier", new AcceptableValueRange<float>(0.1f, 2f)));
shootingSpeedMultiplier = Config.Bind("General", "Shooting Speed Multiplier", 1f,
new ConfigDescription("Shooting Speed Multiplier", new AcceptableValueRange<float>(0.5f, 8f)));
muzzleVelocityMultiplier = Config.Bind("General", "Muzzle Velocity Multiplier", 1f,
new ConfigDescription("Muzzle Velocity Multiplier", new AcceptableValueRange<float>(1f, 32f)));
magnetStrenghtMultiplier = Config.Bind("General", "Magnet Strength Multiplier", 1f,
new ConfigDescription("Magnet Strength Multiplier", new AcceptableValueRange<float>(1f, 16f)));
magnetRadiusMultiplier = Config.Bind("General", "Magnet Radius Multiplier", 1f,
new ConfigDescription("Magnet Radius Multiplier", new AcceptableValueRange<float>(1f, 16f)));
muzzleVelocityMultiplier = Config.Bind("General", "Muzzle Velocity Multiplier", 1f,
new ConfigDescription("Muzzle Velocity Multiplier", new AcceptableValueRange<float>(1f, 32f)));
heartbeatIntervalMultiplier = Config.Bind("General", "Heartbeat Interval Multiplier", 1f,
new ConfigDescription("Heartbeat Interval Multiplier", new AcceptableValueRange<float>(0.1f, 2f)));
beamStrenghtMultiplier = Config.Bind("General", "Beam Strength Multiplier", 1f,
new ConfigDescription("Beam Strength Multiplier", new AcceptableValueRange<float>(1f, 16f)));
beamRadiusMultiplier = Config.Bind("General", "Beam Radius Multiplier", 1f,
new ConfigDescription("Beam Radius Multiplier", new AcceptableValueRange<float>(1f, 16f)));
allProjectilesHoming = Config.Bind("General", "Make All Projectiles Home", false);
@@ -65,12 +71,12 @@ namespace TerraTech {
public class Patches {
[HarmonyPatch(typeof(ManLicenses), "AddXP")]
static void XPMulti(FactionSubTypes corporation, ref int xp, bool showUI = true) {
xp *= Main.xpMultiplier.Value;
xp = (int)(xp * Main.xpMultiplier.Value);
}
[HarmonyPatch(typeof(ManPlayer), "AddMoney")]
static void MoneyMulti(ref int amount) {
amount *= Main.moneyMultiplier.Value;
amount = (int)(amount * Main.moneyMultiplier.Value);
}
[HarmonyPatch(typeof(TechHolders), "SetHeartbeatInterval")]
@@ -219,33 +225,33 @@ namespace TerraTech {
}
}
static void DoPatchSingle(ModuleItemHolderMagnet moduleEnergy) {
static void DoPatchSingle(ModuleItemHolderMagnet moduleItemHolderMagnet) {
// Console.WriteLine("Patching " + moduleEnergy.name);
// Console.WriteLine("Old value " + GetValue(moduleEnergy));
SetStrength(moduleEnergy, GetStrength(moduleEnergy) * Main.magnetStrenghtMultiplier.Value);
SetRadius(moduleEnergy, GetRadius(moduleEnergy) * Main.magnetRadiusMultiplier.Value);
SetStrength(moduleItemHolderMagnet, GetStrength(moduleItemHolderMagnet) * Main.magnetStrenghtMultiplier.Value);
SetRadius(moduleItemHolderMagnet, GetRadius(moduleItemHolderMagnet) * Main.magnetRadiusMultiplier.Value);
// Console.WriteLine("New value " + GetValue(moduleEnergy));
}
static void DoRestoreSingle(ModuleItemHolderMagnet moduleEnergy) {
if (strenghts.ContainsKey(moduleEnergy)) {
SetStrength(moduleEnergy, strenghts[moduleEnergy]);
static void DoRestoreSingle(ModuleItemHolderMagnet moduleItemHolderMagnet) {
if (strenghts.ContainsKey(moduleItemHolderMagnet)) {
SetStrength(moduleItemHolderMagnet, strenghts[moduleItemHolderMagnet]);
}
if (radii.ContainsKey(moduleEnergy)) {
SetRadius(moduleEnergy, radii[moduleEnergy]);
if (radii.ContainsKey(moduleItemHolderMagnet)) {
SetRadius(moduleItemHolderMagnet, radii[moduleItemHolderMagnet]);
}
}
private static float GetStrength(ModuleItemHolderMagnet moduleEnergy) {
return Traverse.Create(moduleEnergy).Field("m_Strength").GetValue() as float? ?? 0f;
private static float GetStrength(ModuleItemHolderMagnet moduleItemHolderMagnet) {
return Traverse.Create(moduleItemHolderMagnet).Field("m_Strength").GetValue() as float? ?? 0f;
}
private static void SetStrength(ModuleItemHolderMagnet moduleEnergy, float value) {
Traverse.Create(moduleEnergy).Field("m_Strength").SetValue(value);
private static void SetStrength(ModuleItemHolderMagnet moduleItemHolderMagnet, float value) {
Traverse.Create(moduleItemHolderMagnet).Field("m_Strength").SetValue(value);
}
private static float GetRadius(ModuleItemHolderMagnet moduleEnergy) {
ModuleItemPickup moduleItemPickup = Traverse.Create(moduleEnergy).Field("m_Pickup").GetValue() as ModuleItemPickup;
private static float GetRadius(ModuleItemHolderMagnet moduleItemHolderMagnet) {
ModuleItemPickup moduleItemPickup = Traverse.Create(moduleItemHolderMagnet).Field("m_Pickup").GetValue() as ModuleItemPickup;
if (moduleItemPickup) {
float radius = Traverse.Create(moduleItemPickup).Field("m_PickupRange").GetValue() as float? ?? 0f;
return radius;
@@ -253,8 +259,82 @@ namespace TerraTech {
return 0f;
}
private static void SetRadius(ModuleItemHolderMagnet moduleEnergy, float value) {
ModuleItemPickup moduleItemPickup = Traverse.Create(moduleEnergy).Field("m_Pickup").GetValue() as ModuleItemPickup;
private static void SetRadius(ModuleItemHolderMagnet moduleItemHolderMagnet, float value) {
ModuleItemPickup moduleItemPickup = Traverse.Create(moduleItemHolderMagnet).Field("m_Pickup").GetValue() as ModuleItemPickup;
if (moduleItemPickup) {
Traverse.Create(moduleItemPickup).Field("m_PickupRange").SetValue(value);
}
}
}
[HarmonyPatch]
public class BeamPropertiesManager {
private static Dictionary<ModuleItemHolderBeam, float> strenghts = new Dictionary<ModuleItemHolderBeam, float>();
private static Dictionary<ModuleItemHolderBeam, float> radii = new Dictionary<ModuleItemHolderBeam, float>();
[HarmonyPostfix]
[HarmonyPatch(typeof(ModuleItemHolderBeam), "OnAttached")]
static void PostfixCreate(ModuleItemHolderBeam __instance) {
if (!strenghts.ContainsKey(__instance)) {
strenghts.Add(__instance, GetStrength(__instance));
radii.Add(__instance, GetRadius(__instance));
DoPatchSingle(__instance);
}
}
[HarmonyPostfix]
[HarmonyPatch(typeof(ModuleItemHolderBeam), "OnDetaching")]
static void PostfixDestroy(ModuleItemHolderBeam __instance) {
DoRestoreSingle(__instance);
strenghts.Remove(__instance);
radii.Remove(__instance);
}
public static void DoPatch() {
// Console.WriteLine("Modifying " + generators.Count + " generators");
// Console.WriteLine("Should patch: " + ShouldPatch());
foreach (KeyValuePair<ModuleItemHolderBeam, float> keyValuePair in strenghts) {
DoRestoreSingle(keyValuePair.Key);
DoPatchSingle(keyValuePair.Key);
}
}
static void DoPatchSingle(ModuleItemHolderBeam moduleItemHolderBeam) {
// Console.WriteLine("Patching " + moduleEnergy.name);
// Console.WriteLine("Old value " + GetValue(moduleEnergy));
SetStrength(moduleItemHolderBeam, GetStrength(moduleItemHolderBeam) * Main.beamStrenghtMultiplier.Value);
SetRadius(moduleItemHolderBeam, GetRadius(moduleItemHolderBeam) * Main.beamRadiusMultiplier.Value);
// Console.WriteLine("New value " + GetValue(moduleEnergy));
}
static void DoRestoreSingle(ModuleItemHolderBeam moduleItemHolderBeam) {
if (strenghts.ContainsKey(moduleItemHolderBeam)) {
SetStrength(moduleItemHolderBeam, strenghts[moduleItemHolderBeam]);
}
if (radii.ContainsKey(moduleItemHolderBeam)) {
SetRadius(moduleItemHolderBeam, radii[moduleItemHolderBeam]);
}
}
private static float GetStrength(ModuleItemHolderBeam moduleItemHolderBeam) {
return Traverse.Create(moduleItemHolderBeam).Field("m_Strength").GetValue() as float? ?? 0f;
}
private static void SetStrength(ModuleItemHolderBeam moduleItemHolderBeam, float value) {
Traverse.Create(moduleItemHolderBeam).Field("m_Strength").SetValue(value);
}
private static float GetRadius(ModuleItemHolderBeam moduleItemHolderBeam) {
ModuleItemPickup moduleItemPickup = Traverse.Create(moduleItemHolderBeam).Field("m_Pickup").GetValue() as ModuleItemPickup;
if (moduleItemPickup) {
float radius = Traverse.Create(moduleItemPickup).Field("m_PickupRange").GetValue() as float? ?? 0f;
return radius;
}
return 0f;
}
private static void SetRadius(ModuleItemHolderBeam moduleItemHolderBeam, float value) {
ModuleItemPickup moduleItemPickup = Traverse.Create(moduleItemHolderBeam).Field("m_Pickup").GetValue() as ModuleItemPickup;
if (moduleItemPickup) {
Traverse.Create(moduleItemPickup).Field("m_PickupRange").SetValue(value);
}