Unstable v0.19.3.0
This commit is contained in:
@@ -5,12 +5,11 @@ using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Xml.Linq;
|
||||
using Barotrauma.Items.Components;
|
||||
using Barotrauma.Networking;
|
||||
|
||||
// ReSharper disable ArrangeThisQualifier
|
||||
namespace Barotrauma
|
||||
{
|
||||
internal class PropertyReference
|
||||
internal sealed class PropertyReference
|
||||
{
|
||||
public object? OriginalValue { get; private set; }
|
||||
|
||||
@@ -38,87 +37,63 @@ namespace Barotrauma
|
||||
/// Calculate the new value of the property
|
||||
/// </summary>
|
||||
/// <param name="level">level of the upgrade</param>
|
||||
/// <param name="sourceElement">Optional XElement reference, only used for error logging.</param>
|
||||
/// <returns></returns>
|
||||
public float CalculateUpgrade(int level, XElement? sourceElement = null)
|
||||
public object CalculateUpgrade(int level)
|
||||
{
|
||||
if (OriginalValue is float || OriginalValue is int || OriginalValue is double)
|
||||
switch (OriginalValue)
|
||||
{
|
||||
var value = (float) OriginalValue;
|
||||
|
||||
if (level == 0) { return value; }
|
||||
|
||||
if (Multiplier[^1] != '%')
|
||||
case float _:
|
||||
case int _:
|
||||
case double _:
|
||||
{
|
||||
float multiplier = ParseValue();
|
||||
switch (Multiplier[0])
|
||||
{
|
||||
case '*':
|
||||
case 'x':
|
||||
return value * (multiplier * level);
|
||||
case '/':
|
||||
return value / (multiplier * level);
|
||||
case '-':
|
||||
return value - (multiplier * level);
|
||||
case '+':
|
||||
return value + (multiplier * level);
|
||||
case '=':
|
||||
return multiplier;
|
||||
}
|
||||
var value = (float) OriginalValue;
|
||||
return level == 0 ? value : CalculateUpgrade(value, level, Multiplier);
|
||||
}
|
||||
else
|
||||
case bool _ when bool.TryParse(Multiplier, out bool result):
|
||||
{
|
||||
float multiplier = UpgradePrefab.ParsePercentage(Multiplier, Name, sourceElement, upgrade.Prefab.SuppressWarnings);
|
||||
return ApplyPercentage(value, multiplier, level);
|
||||
return result;
|
||||
}
|
||||
default:
|
||||
{
|
||||
DebugConsole.AddWarning($"Original value of \"{Name}\" in the upgrade \"{upgrade.Prefab.Name}\" is not a integer, float, double or boolean but {OriginalValue?.GetType()} with a value of ({OriginalValue}). \n" +
|
||||
"The value has been assumed to be '0', did you forget a Convert.ChangeType()?");
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DebugConsole.AddWarning($"Original value of \"{Name}\" in the upgrade \"{upgrade.Prefab.Name}\" is not a integer, float or a double but {OriginalValue?.GetType()} with a value of ({OriginalValue}). \n" +
|
||||
"The value has been assumed to be '0', did you forget a Convert.ChangeType()?");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static float CalculateUpgrade(object originalValue, int level, string Multiplier)
|
||||
public static float CalculateUpgrade(float value, int level, string multiplier)
|
||||
{
|
||||
if (originalValue is float || originalValue is int || originalValue is double)
|
||||
if (multiplier[^1] != '%')
|
||||
{
|
||||
var value = (float)originalValue;
|
||||
|
||||
if (Multiplier[^1] != '%')
|
||||
{
|
||||
float multiplier = 1.0f;
|
||||
if (Multiplier.Length > 1)
|
||||
{
|
||||
if (prefixCharacters.Contains(Multiplier[0]))
|
||||
{
|
||||
float.TryParse(Multiplier.Substring(1).Trim(), NumberStyles.Number, CultureInfo.InvariantCulture, out multiplier);
|
||||
}
|
||||
}
|
||||
switch (Multiplier[0])
|
||||
{
|
||||
case '*':
|
||||
case 'x':
|
||||
return value * (multiplier * level);
|
||||
case '/':
|
||||
return value / (multiplier * level);
|
||||
case '-':
|
||||
return value - (multiplier * level);
|
||||
case '+':
|
||||
return value + (multiplier * level);
|
||||
case '=':
|
||||
return multiplier;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
float multiplier = UpgradePrefab.ParsePercentage(Multiplier, Identifier.Empty, suppressWarnings: true);
|
||||
return ApplyPercentage(value, multiplier, level);
|
||||
}
|
||||
return CalculateUpgradeFloat(multiplier, value , level);
|
||||
}
|
||||
return float.NaN;
|
||||
|
||||
return ApplyPercentage(value, UpgradePrefab.ParsePercentage(multiplier, Identifier.Empty, suppressWarnings: true), level);
|
||||
}
|
||||
|
||||
private static float CalculateUpgradeFloat(string multiplier, float value, int level)
|
||||
{
|
||||
float multiplierFloat = ParseValue(multiplier, value);
|
||||
|
||||
switch (multiplier[0])
|
||||
{
|
||||
case '*':
|
||||
case 'x':
|
||||
return value * (multiplierFloat * level);
|
||||
case '/':
|
||||
return value / (multiplierFloat * level);
|
||||
case '-':
|
||||
return value - (multiplierFloat * level);
|
||||
case '+':
|
||||
return value + (multiplierFloat * level);
|
||||
case '=':
|
||||
return multiplierFloat;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -133,7 +108,20 @@ namespace Barotrauma
|
||||
{
|
||||
if (savedValue.NameAsIdentifier() == Name)
|
||||
{
|
||||
OriginalValue = savedValue.GetAttributeFloat("value", 0.0f);
|
||||
string value = savedValue.GetAttributeString("value", string.Empty);
|
||||
|
||||
if (float.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out float floatValue))
|
||||
{
|
||||
OriginalValue = floatValue;
|
||||
}
|
||||
else if (bool.TryParse(value, out bool boolValue))
|
||||
{
|
||||
OriginalValue = boolValue;
|
||||
}
|
||||
else
|
||||
{
|
||||
OriginalValue = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -155,30 +143,23 @@ namespace Barotrauma
|
||||
return attributes.Select(attribute => new PropertyReference(attribute.NameAsIdentifier(), attribute.Value, upgrade)).ToArray();
|
||||
}
|
||||
|
||||
private float ParseValue()
|
||||
private static float ParseValue(string multiplier, object? originalValue)
|
||||
{
|
||||
if (Multiplier.Length > 1)
|
||||
if (multiplier.Length > 1)
|
||||
{
|
||||
if (prefixCharacters.Contains(Multiplier[0]))
|
||||
if (prefixCharacters.Contains(multiplier[0]))
|
||||
{
|
||||
if (float.TryParse(Multiplier.Substring(1).Trim(), NumberStyles.Number, CultureInfo.InvariantCulture, out float value)) { return value; }
|
||||
if (float.TryParse(multiplier.Substring(1).Trim(), NumberStyles.Number, CultureInfo.InvariantCulture, out float value)) { return value; }
|
||||
|
||||
if (OriginalValue is float || OriginalValue is int || OriginalValue is double) { return (float) OriginalValue; }
|
||||
if (originalValue is float || originalValue is int || originalValue is double) { return (float) originalValue; }
|
||||
}
|
||||
}
|
||||
|
||||
if (!upgrade.Prefab.SuppressWarnings)
|
||||
{
|
||||
DebugConsole.AddWarning($"Multiplier for {Name} is too short or does not contain proper prefix. \n" +
|
||||
$"The value should start with {string.Join(",", prefixCharacters)} and contain a floating point value or another property. \n" +
|
||||
"The value has been assumed to be '1'.");
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
internal class Upgrade : IDisposable
|
||||
internal sealed class Upgrade : IDisposable
|
||||
{
|
||||
private ISerializableEntity TargetEntity { get; }
|
||||
|
||||
@@ -379,10 +360,10 @@ namespace Barotrauma
|
||||
{
|
||||
if (entity.SerializableProperties.TryGetValue(propertyReference.Name, out SerializableProperty? property) && property != null)
|
||||
{
|
||||
object? originalValue = property!.GetValue(entity);
|
||||
object? originalValue = property.GetValue(entity);
|
||||
propertyReference.SetOriginalValue(originalValue);
|
||||
object newValue = Convert.ChangeType(propertyReference.CalculateUpgrade(Level, sourceElement), originalValue.GetType(), NumberFormatInfo.InvariantInfo);
|
||||
property!.SetValue(entity, newValue);
|
||||
object newValue = Convert.ChangeType(propertyReference.CalculateUpgrade(Level), originalValue.GetType(), NumberFormatInfo.InvariantInfo);
|
||||
property.SetValue(entity, newValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user