Make apply only to player option
This commit is contained in:
@@ -14,7 +14,7 @@ namespace TerraTech {
|
|||||||
return tank.ControllableByLocalPlayer;
|
return tank.ControllableByLocalPlayer;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool IsObjectTank(object obj) {
|
public static Func<object, bool> IsObjectPlayerTank = obj => {
|
||||||
if (obj == null)
|
if (obj == null)
|
||||||
return false;
|
return false;
|
||||||
try {
|
try {
|
||||||
@@ -23,8 +23,6 @@ namespace TerraTech {
|
|||||||
Console.WriteLine("Failed to check if object is a player tank: " + e.Message);
|
Console.WriteLine("Failed to check if object is a player tank: " + e.Message);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
};
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -11,6 +11,7 @@ namespace TerraTech {
|
|||||||
private static readonly MultipliedObjectManager<BoosterJet> jetManager =
|
private static readonly MultipliedObjectManager<BoosterJet> jetManager =
|
||||||
new MultipliedObjectManager<BoosterJet>(ConfigureJetThruster);
|
new MultipliedObjectManager<BoosterJet>(ConfigureJetThruster);
|
||||||
|
|
||||||
|
public static ConfigEntry<bool> playerOnly;
|
||||||
public static ConfigEntry<float> fanThrustMultiplier;
|
public static ConfigEntry<float> fanThrustMultiplier;
|
||||||
public static ConfigEntry<float> jetThrustMultiplier;
|
public static ConfigEntry<float> jetThrustMultiplier;
|
||||||
|
|
||||||
@@ -18,6 +19,9 @@ namespace TerraTech {
|
|||||||
float min = 0.01f;
|
float min = 0.01f;
|
||||||
float max = 32f;
|
float max = 32f;
|
||||||
|
|
||||||
|
playerOnly = config.Bind("Booster", "Player Only", false, new ConfigDescription("Player Only"));
|
||||||
|
playerOnly.SettingChanged += (sender, args) => DoPatch();
|
||||||
|
|
||||||
fanThrustMultiplier =
|
fanThrustMultiplier =
|
||||||
config.Bind("Booster", "Fan Thrust Multiplier", 1f,
|
config.Bind("Booster", "Fan Thrust Multiplier", 1f,
|
||||||
new ConfigDescription("Fan Thrust Multiplier", new AcceptableValueRange<float>(min, max)));
|
new ConfigDescription("Fan Thrust Multiplier", new AcceptableValueRange<float>(min, max)));
|
||||||
@@ -30,13 +34,19 @@ namespace TerraTech {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static void ConfigureFanThruster(MultipliedObject<FanJet> obj) {
|
private static void ConfigureFanThruster(MultipliedObject<FanJet> obj) {
|
||||||
obj.AddField(new FieldConfiguration<float, float>("m_Force", fanThrustMultiplier));
|
obj.AddField(new FieldConfiguration<float, float>("m_Force", fanThrustMultiplier, ShouldApply));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void ConfigureJetThruster(MultipliedObject<BoosterJet> obj) {
|
private static void ConfigureJetThruster(MultipliedObject<BoosterJet> obj) {
|
||||||
obj.AddField(new FieldConfiguration<float, float>("m_Force", jetThrustMultiplier));
|
obj.AddField(new FieldConfiguration<float, float>("m_Force", jetThrustMultiplier, ShouldApply));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static readonly Func<object, bool> ShouldApply = obj => {
|
||||||
|
if (!playerOnly.Value)
|
||||||
|
return true;
|
||||||
|
return CykUtil.IsObjectPlayerTank(obj);
|
||||||
|
};
|
||||||
|
|
||||||
[HarmonyPrefix]
|
[HarmonyPrefix]
|
||||||
[HarmonyPatch(typeof(ModuleBooster), "OnAttached")]
|
[HarmonyPatch(typeof(ModuleBooster), "OnAttached")]
|
||||||
static void PostfixCreate(ModuleBooster __instance) {
|
static void PostfixCreate(ModuleBooster __instance) {
|
||||||
|
@@ -21,6 +21,7 @@ namespace TerraTech {
|
|||||||
private string _fieldName;
|
private string _fieldName;
|
||||||
private ConfigEntry<TMul> _defaultMultiplier;
|
private ConfigEntry<TMul> _defaultMultiplier;
|
||||||
private Func<object, ConfigEntry<TMul>> _conditionalMultiplier;
|
private Func<object, ConfigEntry<TMul>> _conditionalMultiplier;
|
||||||
|
private Func<object, bool> _applyCondition;
|
||||||
|
|
||||||
public string FieldName {
|
public string FieldName {
|
||||||
get { return _fieldName; }
|
get { return _fieldName; }
|
||||||
@@ -37,6 +38,11 @@ namespace TerraTech {
|
|||||||
set { _conditionalMultiplier = value; }
|
set { _conditionalMultiplier = value; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Func<object, bool> ApplyCondition {
|
||||||
|
get { return _applyCondition; }
|
||||||
|
set { _applyCondition = value; }
|
||||||
|
}
|
||||||
|
|
||||||
public FieldConfiguration(string fieldName, ConfigEntry<TMul> defaultMultiplier) {
|
public FieldConfiguration(string fieldName, ConfigEntry<TMul> defaultMultiplier) {
|
||||||
_fieldName = fieldName;
|
_fieldName = fieldName;
|
||||||
_defaultMultiplier = defaultMultiplier;
|
_defaultMultiplier = defaultMultiplier;
|
||||||
@@ -49,28 +55,54 @@ namespace TerraTech {
|
|||||||
_conditionalMultiplier = conditionalMultiplier;
|
_conditionalMultiplier = conditionalMultiplier;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public FieldConfiguration(string fieldName, ConfigEntry<TMul> defaultMultiplier,
|
||||||
|
Func<object, bool> applyCondition) {
|
||||||
|
_fieldName = fieldName;
|
||||||
|
_defaultMultiplier = defaultMultiplier;
|
||||||
|
_applyCondition = applyCondition;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FieldConfiguration(string fieldName, ConfigEntry<TMul> defaultMultiplier,
|
||||||
|
Func<object, ConfigEntry<TMul>> conditionalMultiplier,
|
||||||
|
Func<object, bool> applyCondition) {
|
||||||
|
_fieldName = fieldName;
|
||||||
|
_defaultMultiplier = defaultMultiplier;
|
||||||
|
_conditionalMultiplier = conditionalMultiplier;
|
||||||
|
_applyCondition = applyCondition;
|
||||||
|
}
|
||||||
|
|
||||||
public ConfigEntry<TMul> GetMultiplier(object instance) {
|
public ConfigEntry<TMul> GetMultiplier(object instance) {
|
||||||
if (_conditionalMultiplier == null) {
|
if (_conditionalMultiplier == null) {
|
||||||
return _defaultMultiplier;
|
return _defaultMultiplier;
|
||||||
}
|
}
|
||||||
return _conditionalMultiplier(instance);
|
return _conditionalMultiplier(instance);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool ShouldApply(object instance) {
|
||||||
|
if (_applyCondition == null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return _applyCondition(instance);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MultipliedField<TField, TMul> : IFieldModifier {
|
public class MultipliedField<TField, TMul> : IFieldModifier {
|
||||||
private readonly string _fieldName;
|
private readonly string _fieldName;
|
||||||
private readonly ConfigEntry<TMul> _multiplier;
|
private readonly ConfigEntry<TMul> _multiplier;
|
||||||
private readonly Traverse _parentTraverse;
|
private readonly Traverse _parentTraverse;
|
||||||
|
private readonly Func<object, bool> _applyCondition;
|
||||||
private TField _originalValue;
|
private TField _originalValue;
|
||||||
|
|
||||||
public string FieldName {
|
public string FieldName {
|
||||||
get { return _fieldName; }
|
get { return _fieldName; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public MultipliedField(string fieldName, ConfigEntry<TMul> multiplier, Traverse parentTraverse) {
|
public MultipliedField(string fieldName, ConfigEntry<TMul> multiplier, Traverse parentTraverse,
|
||||||
|
Func<object, bool> applyCondition = null) {
|
||||||
_fieldName = fieldName;
|
_fieldName = fieldName;
|
||||||
_multiplier = multiplier;
|
_multiplier = multiplier;
|
||||||
_parentTraverse = parentTraverse;
|
_parentTraverse = parentTraverse;
|
||||||
|
_applyCondition = applyCondition;
|
||||||
|
|
||||||
if (!parentTraverse.Field(fieldName).FieldExists()) {
|
if (!parentTraverse.Field(fieldName).FieldExists()) {
|
||||||
throw new ArgumentException(
|
throw new ArgumentException(
|
||||||
@@ -128,6 +160,12 @@ namespace TerraTech {
|
|||||||
|
|
||||||
public void Apply() {
|
public void Apply() {
|
||||||
try {
|
try {
|
||||||
|
if (_applyCondition != null && !_applyCondition(_parentTraverse.GetValue())) {
|
||||||
|
if (Main.debug.Value)
|
||||||
|
Console.WriteLine("Skipping {0}: condition not met", _fieldName);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var newValue = MultiplyValues(_originalValue, _multiplier.Value);
|
var newValue = MultiplyValues(_originalValue, _multiplier.Value);
|
||||||
|
|
||||||
if (Main.debug.Value)
|
if (Main.debug.Value)
|
||||||
@@ -160,6 +198,7 @@ namespace TerraTech {
|
|||||||
private string _fieldName;
|
private string _fieldName;
|
||||||
private ConfigEntry<bool> _value;
|
private ConfigEntry<bool> _value;
|
||||||
private Func<object, ConfigEntry<bool>> _conditionalValue;
|
private Func<object, ConfigEntry<bool>> _conditionalValue;
|
||||||
|
private Func<object, bool> _applyCondition;
|
||||||
|
|
||||||
public string FieldName {
|
public string FieldName {
|
||||||
get { return _fieldName; }
|
get { return _fieldName; }
|
||||||
@@ -176,6 +215,11 @@ namespace TerraTech {
|
|||||||
set { _conditionalValue = value; }
|
set { _conditionalValue = value; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Func<object, bool> ApplyCondition {
|
||||||
|
get { return _applyCondition; }
|
||||||
|
set { _applyCondition = value; }
|
||||||
|
}
|
||||||
|
|
||||||
public BooleanFieldConfiguration(string fieldName, ConfigEntry<bool> value) {
|
public BooleanFieldConfiguration(string fieldName, ConfigEntry<bool> value) {
|
||||||
_fieldName = fieldName;
|
_fieldName = fieldName;
|
||||||
_value = value;
|
_value = value;
|
||||||
@@ -188,28 +232,53 @@ namespace TerraTech {
|
|||||||
_conditionalValue = conditionalValue;
|
_conditionalValue = conditionalValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public BooleanFieldConfiguration(string fieldName, ConfigEntry<bool> value, Func<object, bool> applyCondition) {
|
||||||
|
_fieldName = fieldName;
|
||||||
|
_value = value;
|
||||||
|
_applyCondition = applyCondition;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BooleanFieldConfiguration(string fieldName, ConfigEntry<bool> value,
|
||||||
|
Func<object, ConfigEntry<bool>> conditionalValue,
|
||||||
|
Func<object, bool> applyCondition) {
|
||||||
|
_fieldName = fieldName;
|
||||||
|
_value = value;
|
||||||
|
_conditionalValue = conditionalValue;
|
||||||
|
_applyCondition = applyCondition;
|
||||||
|
}
|
||||||
|
|
||||||
public ConfigEntry<bool> GetValue(object instance) {
|
public ConfigEntry<bool> GetValue(object instance) {
|
||||||
if (_conditionalValue == null) {
|
if (_conditionalValue == null) {
|
||||||
return _value;
|
return _value;
|
||||||
}
|
}
|
||||||
return _conditionalValue(instance);
|
return _conditionalValue(instance);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool ShouldApply(object instance) {
|
||||||
|
if (_applyCondition == null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return _applyCondition(instance);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class BooleanField : IFieldModifier {
|
public class BooleanField : IFieldModifier {
|
||||||
private readonly string _fieldName;
|
private readonly string _fieldName;
|
||||||
private readonly ConfigEntry<bool> _value;
|
private readonly ConfigEntry<bool> _value;
|
||||||
private readonly Traverse _parentTraverse;
|
private readonly Traverse _parentTraverse;
|
||||||
|
private readonly Func<object, bool> _applyCondition;
|
||||||
private bool _originalValue;
|
private bool _originalValue;
|
||||||
|
|
||||||
public string FieldName {
|
public string FieldName {
|
||||||
get { return _fieldName; }
|
get { return _fieldName; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public BooleanField(string fieldName, ConfigEntry<bool> value, Traverse parentTraverse) {
|
public BooleanField(string fieldName, ConfigEntry<bool> value, Traverse parentTraverse,
|
||||||
|
Func<object, bool> applyCondition = null) {
|
||||||
_fieldName = fieldName;
|
_fieldName = fieldName;
|
||||||
_value = value;
|
_value = value;
|
||||||
_parentTraverse = parentTraverse;
|
_parentTraverse = parentTraverse;
|
||||||
|
_applyCondition = applyCondition;
|
||||||
|
|
||||||
if (!parentTraverse.Field(fieldName).FieldExists()) {
|
if (!parentTraverse.Field(fieldName).FieldExists()) {
|
||||||
throw new ArgumentException(
|
throw new ArgumentException(
|
||||||
@@ -240,6 +309,12 @@ namespace TerraTech {
|
|||||||
|
|
||||||
public void Apply() {
|
public void Apply() {
|
||||||
try {
|
try {
|
||||||
|
if (_applyCondition != null && !_applyCondition(_parentTraverse.GetValue())) {
|
||||||
|
if (Main.debug.Value)
|
||||||
|
Console.WriteLine("Skipping {0}: condition not met", _fieldName);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (_value.Value) {
|
if (_value.Value) {
|
||||||
if (Main.debug.Value)
|
if (Main.debug.Value)
|
||||||
Console.WriteLine("Applying to {0}: forcing to true", _fieldName);
|
Console.WriteLine("Applying to {0}: forcing to true", _fieldName);
|
||||||
@@ -287,12 +362,12 @@ namespace TerraTech {
|
|||||||
public void AddField<TField, TMul>(FieldConfiguration<TField, TMul> config) {
|
public void AddField<TField, TMul>(FieldConfiguration<TField, TMul> config) {
|
||||||
var multiplier = config.GetMultiplier(_instance);
|
var multiplier = config.GetMultiplier(_instance);
|
||||||
_fields[config.FieldName] =
|
_fields[config.FieldName] =
|
||||||
new MultipliedField<TField, TMul>(config.FieldName, multiplier, _objectTraverse);
|
new MultipliedField<TField, TMul>(config.FieldName, multiplier, _objectTraverse, config.ShouldApply);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddBooleanField(BooleanFieldConfiguration config) {
|
public void AddBooleanField(BooleanFieldConfiguration config) {
|
||||||
var value = config.GetValue(_instance);
|
var value = config.GetValue(_instance);
|
||||||
_fields[config.FieldName] = new BooleanField(config.FieldName, value, _objectTraverse);
|
_fields[config.FieldName] = new BooleanField(config.FieldName, value, _objectTraverse, config.ShouldApply);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void CaptureFrom() {
|
public void CaptureFrom() {
|
||||||
@@ -347,7 +422,7 @@ namespace TerraTech {
|
|||||||
try {
|
try {
|
||||||
_managedObjects.Remove(instance);
|
_managedObjects.Remove(instance);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Console.WriteLine(String.Format("Error removing instance from _managedObjects: {0}", e));
|
Console.WriteLine("Error removing instance from _managedObjects: {0}", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -376,7 +451,7 @@ namespace TerraTech {
|
|||||||
ApplyTo(instance);
|
ApplyTo(instance);
|
||||||
multipliedObject.LogValues("Patched");
|
multipliedObject.LogValues("Patched");
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Console.WriteLine(String.Format("Error in OnObjectAttached: {0}", e));
|
Console.WriteLine("Error in OnObjectAttached: {0}", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -398,13 +473,13 @@ namespace TerraTech {
|
|||||||
RestoreTo(instance);
|
RestoreTo(instance);
|
||||||
multipliedObject.LogValues("Restored");
|
multipliedObject.LogValues("Restored");
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Console.WriteLine(String.Format("Error restoring values: {0}", e));
|
Console.WriteLine("Error restoring values: {0}", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
SafeRemove(instance);
|
SafeRemove(instance);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Console.WriteLine(String.Format("Error in OnObjectDetached: {0}", e));
|
Console.WriteLine("Error in OnObjectDetached: {0}", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -420,7 +495,7 @@ namespace TerraTech {
|
|||||||
RestoreTo(instance, fieldNames);
|
RestoreTo(instance, fieldNames);
|
||||||
ApplyTo(instance, fieldNames);
|
ApplyTo(instance, fieldNames);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Console.WriteLine(String.Format("Error applying to instance: {0}", e));
|
Console.WriteLine("Error applying to instance: {0}", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -436,7 +511,7 @@ namespace TerraTech {
|
|||||||
if (_managedObjects.TryGetValue(instance, out obj))
|
if (_managedObjects.TryGetValue(instance, out obj))
|
||||||
obj.ApplyTo(fieldNames);
|
obj.ApplyTo(fieldNames);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Console.WriteLine(String.Format("Error in ApplyTo: {0}", e));
|
Console.WriteLine("Error in ApplyTo: {0}", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -451,7 +526,7 @@ namespace TerraTech {
|
|||||||
if (_managedObjects.TryGetValue(instance, out obj))
|
if (_managedObjects.TryGetValue(instance, out obj))
|
||||||
obj.RestoreTo(fieldNames);
|
obj.RestoreTo(fieldNames);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Console.WriteLine(String.Format("Error in RestoreTo: {0}", e));
|
Console.WriteLine("Error in RestoreTo: {0}", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user