Files
LuaCsForBarotraumaEP/Barotrauma/BarotraumaShared/SharedSource/Networking/KarmaManager.cs
2022-02-26 02:43:01 +09:00

216 lines
7.6 KiB
C#

using System;
using System.Collections.Generic;
using Barotrauma.IO;
using System.Linq;
using System.Text;
using System.Xml.Linq;
namespace Barotrauma
{
partial class KarmaManager : ISerializableEntity
{
public static readonly string ConfigFile = "Data" + Path.DirectorySeparatorChar + "karmasettings.xml";
public string Name => "KarmaManager";
public Dictionary<Identifier, SerializableProperty> SerializableProperties { get; private set; }
[Serialize(true, IsPropertySaveable.Yes)]
public bool ResetKarmaBetweenRounds { get; set; }
[Serialize(0.1f, IsPropertySaveable.Yes)]
public float KarmaDecay { get; set; }
[Serialize(50.0f, IsPropertySaveable.Yes)]
public float KarmaDecayThreshold { get; set; }
[Serialize(0.15f, IsPropertySaveable.Yes)]
public float KarmaIncrease { get; set; }
[Serialize(50.0f, IsPropertySaveable.Yes)]
public float KarmaIncreaseThreshold { get; set; }
[Serialize(0.05f, IsPropertySaveable.Yes)]
public float StructureRepairKarmaIncrease { get; set; }
[Serialize(0.1f, IsPropertySaveable.Yes)]
public float StructureDamageKarmaDecrease { get; set; }
[Serialize(15.0f, IsPropertySaveable.Yes)]
public float MaxStructureDamageKarmaDecreasePerSecond { get; set; }
[Serialize(0.03f, IsPropertySaveable.Yes)]
public float ItemRepairKarmaIncrease { get; set; }
[Serialize(0.5f, IsPropertySaveable.Yes)]
public float ReactorOverheatKarmaDecrease { get; set; }
[Serialize(30.0f, IsPropertySaveable.Yes)]
public float ReactorMeltdownKarmaDecrease { get; set; }
[Serialize(0.1f, IsPropertySaveable.Yes)]
public float DamageEnemyKarmaIncrease { get; set; }
[Serialize(0.2f, IsPropertySaveable.Yes)]
public float HealFriendlyKarmaIncrease { get; set; }
[Serialize(0.25f, IsPropertySaveable.Yes)]
public float DamageFriendlyKarmaDecrease { get; set; }
[Serialize(0.25f, IsPropertySaveable.Yes)]
public float StunFriendlyKarmaDecrease { get; set; }
[Serialize(0.3f, IsPropertySaveable.Yes)]
public float StunFriendlyKarmaDecreaseThreshold { get; set; }
[Serialize(1.0f, IsPropertySaveable.Yes)]
public float ExtinguishFireKarmaIncrease { get; set; }
[Serialize(defaultValue: 15.0f, IsPropertySaveable.Yes)]
public float DangerousItemStealKarmaDecrease { get; set; }
[Serialize(defaultValue: false, IsPropertySaveable.Yes)]
public bool DangerousItemStealBots { get; set; }
[Serialize(defaultValue: 0.05f, IsPropertySaveable.Yes)]
public float BallastFloraKarmaIncrease { get; set; }
private int allowedWireDisconnectionsPerMinute;
[Serialize(5, IsPropertySaveable.Yes)]
public int AllowedWireDisconnectionsPerMinute
{
get { return allowedWireDisconnectionsPerMinute; }
set { allowedWireDisconnectionsPerMinute = Math.Max(0, value); }
}
[Serialize(6.0f, IsPropertySaveable.Yes)]
public float WireDisconnectionKarmaDecrease { get; set; }
[Serialize(0.15f, IsPropertySaveable.Yes)]
public float SteerSubKarmaIncrease { get; set; }
[Serialize(15.0f, IsPropertySaveable.Yes)]
public float SpamFilterKarmaDecrease { get; set; }
[Serialize(40.0f, IsPropertySaveable.Yes)]
public float HerpesThreshold { get; set; }
[Serialize(1.0f, IsPropertySaveable.Yes)]
public float KickBanThreshold { get; set; }
[Serialize(0, IsPropertySaveable.Yes)]
public int KicksBeforeBan { get; set; }
[Serialize(10.0f, IsPropertySaveable.Yes)]
public float KarmaNotificationInterval { get; set; }
[Serialize(120.0f, IsPropertySaveable.Yes)]
public float AllowedRetaliationTime { get; set; }
[Serialize(5.0f, IsPropertySaveable.Yes)]
public float DangerousItemContainKarmaDecrease { get; set; }
[Serialize(defaultValue: true, IsPropertySaveable.Yes)]
public bool IsDangerousItemContainKarmaDecreaseIncremental { get; set; }
[Serialize(30.0f, IsPropertySaveable.Yes)]
public float MaxDangerousItemContainKarmaDecrease { get; set; }
private readonly AfflictionPrefab herpesAffliction;
public Dictionary<string, XElement> Presets = new Dictionary<string, XElement>();
public KarmaManager()
{
XDocument doc = null;
int maxLoadRetries = 4;
for (int i = 0; i <= maxLoadRetries; i++)
{
try
{
doc = XMLExtensions.TryLoadXml(ConfigFile);
break;
}
catch (System.IO.IOException)
{
if (i == maxLoadRetries) { break; }
DebugConsole.NewMessage("Opening karma settings file \"" + ConfigFile + "\" failed, retrying in 250 ms...");
System.Threading.Thread.Sleep(250);
}
}
SerializableProperties = SerializableProperty.DeserializeProperties(this, doc?.Root);
if (doc?.Root != null)
{
Presets["custom"] = doc.Root;
foreach (var subElement in doc.Root.Elements())
{
string presetName = subElement.GetAttributeString("name", "");
Presets[presetName.ToLowerInvariant()] = subElement;
}
SelectPreset(GameMain.NetworkMember?.ServerSettings?.KarmaPreset ?? "default");
}
herpesAffliction = AfflictionPrefab.List.FirstOrDefault(ap => ap.Identifier == "spaceherpes");
}
public void SelectPreset(string presetName)
{
if (string.IsNullOrEmpty(presetName)) { return; }
presetName = presetName.ToLowerInvariant();
if (Presets.ContainsKey(presetName))
{
SerializableProperty.DeserializeProperties(this, Presets[presetName]);
}
else if (Presets.ContainsKey("custom"))
{
SerializableProperty.DeserializeProperties(this, Presets["custom"]);
}
}
public void SaveCustomPreset()
{
if (Presets.ContainsKey("custom"))
{
SerializableProperty.SerializeProperties(this, Presets["custom"], saveIfDefault: true);
}
}
public void Save()
{
XDocument doc = new XDocument(new XElement(Name));
foreach (KeyValuePair<string, XElement> preset in Presets)
{
doc.Root.Add(preset.Value);
}
System.Xml.XmlWriterSettings settings = new System.Xml.XmlWriterSettings
{
Indent = true,
NewLineOnAttributes = true
};
int maxLoadRetries = 4;
for (int i = 0; i <= maxLoadRetries; i++)
{
try
{
using (var writer = XmlWriter.Create(ConfigFile, settings))
{
doc.SaveSafe(writer);
}
break;
}
catch (System.IO.IOException)
{
if (i == maxLoadRetries) { throw; }
DebugConsole.NewMessage("Saving karma settings file file \"" + ConfigFile + "\" failed, retrying in 250 ms...");
System.Threading.Thread.Sleep(250);
continue;
}
}
}
}
}