source code checkin

This commit is contained in:
Brett Hewitson 2021-01-07 16:23:23 +10:00
parent 5f8fb2c825
commit 7e57b72e35
675 changed files with 168433 additions and 0 deletions

View file

@ -0,0 +1,46 @@
using ServerManagerTool.Common.Attibutes;
using ServerManagerTool.Common.Model;
using System;
using System.Runtime.Serialization;
using System.Windows;
namespace ServerManagerTool.Lib
{
[DataContract]
public class ClassMultiplier : AggregateIniValue
{
public const float DEFAULT_MULTIPLIER = 1.0f;
public static readonly DependencyProperty ClassNameProperty = DependencyProperty.Register(nameof(ClassName), typeof(string), typeof(ClassMultiplier), new PropertyMetadata(string.Empty));
public static readonly DependencyProperty MultiplierProperty = DependencyProperty.Register(nameof(Multiplier), typeof(float), typeof(ClassMultiplier), new PropertyMetadata(DEFAULT_MULTIPLIER));
[DataMember]
[AggregateIniValueEntry]
public string ClassName
{
get { return (string)GetValue(ClassNameProperty); }
set { SetValue(ClassNameProperty, value); }
}
[DataMember]
[AggregateIniValueEntry]
public float Multiplier
{
get { return (float)GetValue(MultiplierProperty); }
set { SetValue(MultiplierProperty, value); }
}
public virtual string DisplayName => GameData.FriendlyNameForClass(ClassName);
public static ClassMultiplier FromINIValue(string iniValue)
{
var newSpawn = new ClassMultiplier();
newSpawn.InitializeFromINIValue(iniValue);
return newSpawn;
}
public override string GetSortKey() => GameData.FriendlyNameForClass(this.ClassName);
public override bool IsEquivalent(AggregateIniValue other) => String.Equals(this.ClassName, ((ClassMultiplier)other).ClassName, StringComparison.OrdinalIgnoreCase);
}
}

View file

@ -0,0 +1,123 @@
using ServerManagerTool.Common.Attibutes;
using ServerManagerTool.Common.Model;
using System.Runtime.Serialization;
using System.Windows;
namespace ServerManagerTool.Lib
{
[DataContract]
public class CraftingOverride : AggregateIniValue
{
public CraftingOverride()
{
BaseCraftingResourceRequirements = new AggregateIniValueList<CraftingResourceRequirement>(null, null);
}
public static readonly DependencyProperty ItemClassStringProperty = DependencyProperty.Register(nameof(ItemClassString), typeof(string), typeof(CraftingOverride), new PropertyMetadata(string.Empty));
[DataMember]
[AggregateIniValueEntry]
public string ItemClassString
{
get { return (string)GetValue(ItemClassStringProperty); }
set { SetValue(ItemClassStringProperty, value); }
}
public static readonly DependencyProperty BaseCraftingResourceRequirementsProperty = DependencyProperty.Register(nameof(BaseCraftingResourceRequirements), typeof(AggregateIniValueList<CraftingResourceRequirement>), typeof(CraftingOverride), new PropertyMetadata(null));
[DataMember]
[AggregateIniValueEntry(ValueWithinBrackets = true, ListValueWithinBrackets = true)]
public AggregateIniValueList<CraftingResourceRequirement> BaseCraftingResourceRequirements
{
get { return (AggregateIniValueList<CraftingResourceRequirement>)GetValue(BaseCraftingResourceRequirementsProperty); }
set { SetValue(BaseCraftingResourceRequirementsProperty, value); }
}
public override string GetSortKey()
{
return null;
}
public override bool IsEquivalent(AggregateIniValue other)
{
return false;
}
public override void InitializeFromINIValue(string value)
{
if (string.IsNullOrWhiteSpace(value))
return;
var kvPair = value.Split(new[] { '=' }, 2);
var kvValue = kvPair[1].Trim(' ');
if (kvValue.StartsWith("("))
kvValue = kvValue.Substring(1);
if (kvValue.EndsWith(")"))
kvValue = kvValue.Substring(0, kvValue.Length - 1);
base.FromComplexINIValue(kvValue);
}
public override string ToINIValue()
{
return base.ToComplexINIValue(true);
}
public string DisplayName => GameData.FriendlyItemNameForClass(ItemClassString);
public bool IsValid => !string.IsNullOrWhiteSpace(ItemClassString) && BaseCraftingResourceRequirements.Count > 0;
}
[DataContract]
public class CraftingResourceRequirement : AggregateIniValue
{
public static readonly DependencyProperty ResourceItemTypeStringProperty = DependencyProperty.Register(nameof(ResourceItemTypeString), typeof(string), typeof(CraftingResourceRequirement), new PropertyMetadata(string.Empty));
[DataMember]
[AggregateIniValueEntry]
public string ResourceItemTypeString
{
get { return (string)GetValue(ResourceItemTypeStringProperty); }
set { SetValue(ResourceItemTypeStringProperty, value); }
}
public static readonly DependencyProperty BaseResourceRequirementProperty = DependencyProperty.Register(nameof(BaseResourceRequirement), typeof(float), typeof(CraftingResourceRequirement), new PropertyMetadata(1.0f));
[DataMember]
[AggregateIniValueEntry]
public float BaseResourceRequirement
{
get { return (float)GetValue(BaseResourceRequirementProperty); }
set { SetValue(BaseResourceRequirementProperty, value); }
}
public static readonly DependencyProperty CraftingRequireExactResourceTypeProperty = DependencyProperty.Register(nameof(CraftingRequireExactResourceType), typeof(bool), typeof(CraftingResourceRequirement), new PropertyMetadata(false));
[DataMember]
[AggregateIniValueEntry(Key = "bCraftingRequireExactResourceType")]
public bool CraftingRequireExactResourceType
{
get { return (bool)GetValue(CraftingRequireExactResourceTypeProperty); }
set { SetValue(CraftingRequireExactResourceTypeProperty, value); }
}
public override string GetSortKey()
{
return null;
}
public override bool IsEquivalent(AggregateIniValue other)
{
return false;
}
public override void InitializeFromINIValue(string value)
{
base.FromComplexINIValue(value);
}
public override string ToINIValue()
{
return base.ToComplexINIValue(false);
}
public string DisplayName => GameData.FriendlyItemNameForClass(ResourceItemTypeString);
public bool IsValid => !string.IsNullOrWhiteSpace(ResourceItemTypeString);
}
}

View file

@ -0,0 +1,101 @@
using ServerManagerTool.Common.Attibutes;
using ServerManagerTool.Common.Model;
using ServerManagerTool.Enums;
using System;
using System.Runtime.Serialization;
using System.Windows;
using System.Xml.Serialization;
namespace ServerManagerTool.Lib
{
[DataContract]
public class DinoSpawn : AggregateIniValue
{
public const bool DEFAULT_OVERRIDE_SPAWN_LIMIT_PERCENTAGE = true;
public const float DEFAULT_SPAWN_LIMIT_PERCENTAGE = ClassMultiplier.DEFAULT_MULTIPLIER;
public const float DEFAULT_SPAWN_WEIGHT_MULTIPLIER = ClassMultiplier.DEFAULT_MULTIPLIER;
public static readonly DependencyProperty ClassNameProperty = DependencyProperty.Register(nameof(ClassName), typeof(string), typeof(DinoSpawn), new PropertyMetadata(String.Empty));
public static readonly DependencyProperty ModProperty = DependencyProperty.Register(nameof(Mod), typeof(string), typeof(DinoSpawn), new PropertyMetadata(String.Empty));
public static readonly DependencyProperty KnownDinoProperty = DependencyProperty.Register(nameof(KnownDino), typeof(bool), typeof(DinoSpawn), new PropertyMetadata(false));
public static readonly DependencyProperty DinoNameTagProperty = DependencyProperty.Register(nameof(DinoNameTag), typeof(string), typeof(DinoSpawn), new PropertyMetadata(String.Empty));
public static readonly DependencyProperty OverrideSpawnLimitPercentageProperty = DependencyProperty.Register(nameof(OverrideSpawnLimitPercentage), typeof(bool), typeof(DinoSpawn), new PropertyMetadata(DEFAULT_OVERRIDE_SPAWN_LIMIT_PERCENTAGE));
public static readonly DependencyProperty SpawnLimitPercentageProperty = DependencyProperty.Register(nameof(SpawnLimitPercentage), typeof(float), typeof(DinoSpawn), new PropertyMetadata(DEFAULT_SPAWN_LIMIT_PERCENTAGE));
public static readonly DependencyProperty SpawnWeightMultiplierProperty = DependencyProperty.Register(nameof(SpawnWeightMultiplier), typeof(float), typeof(DinoSpawn), new PropertyMetadata(DEFAULT_SPAWN_WEIGHT_MULTIPLIER));
[DataMember]
public string ClassName
{
get { return (string)GetValue(ClassNameProperty); }
set { SetValue(ClassNameProperty, value); }
}
[DataMember]
public string Mod
{
get { return (string)GetValue(ModProperty); }
set { SetValue(ModProperty, value); }
}
[DataMember]
public bool KnownDino
{
get { return (bool)GetValue(KnownDinoProperty); }
set { SetValue(KnownDinoProperty, value); }
}
[XmlElement(ElementName="Name")]
[DataMember]
[AggregateIniValueEntry]
public string DinoNameTag
{
get { return (string)GetValue(DinoNameTagProperty); }
set { SetValue(DinoNameTagProperty, value); }
}
[DataMember]
[AggregateIniValueEntry]
public bool OverrideSpawnLimitPercentage
{
get { return (bool)GetValue(OverrideSpawnLimitPercentageProperty); }
set { SetValue(OverrideSpawnLimitPercentageProperty, value); }
}
[DataMember]
[AggregateIniValueEntry]
public float SpawnLimitPercentage
{
get { return (float)GetValue(SpawnLimitPercentageProperty); }
set { SetValue(SpawnLimitPercentageProperty, value); }
}
[DataMember]
[AggregateIniValueEntry]
public float SpawnWeightMultiplier
{
get { return (float)GetValue(SpawnWeightMultiplierProperty); }
set { SetValue(SpawnWeightMultiplierProperty, value); }
}
public string DisplayName => GameData.FriendlyCreatureNameForClass(ClassName);
public string DisplayMod => GameData.FriendlyNameForClass($"Mod_{Mod}", true) ?? Mod;
public static DinoSpawn FromINIValue(string iniValue)
{
var newSpawn = new DinoSpawn();
newSpawn.InitializeFromINIValue(iniValue);
return newSpawn;
}
public override string GetSortKey()
{
return this.DinoNameTag;
}
public override bool IsEquivalent(AggregateIniValue other)
{
return String.Equals(this.DinoNameTag, ((DinoSpawn)other).DinoNameTag, StringComparison.OrdinalIgnoreCase);
}
}
}

View file

@ -0,0 +1,91 @@
using ServerManagerTool.Common.Attibutes;
using ServerManagerTool.Common.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Windows;
namespace ServerManagerTool.Lib
{
public class EngramAutoUnlockList : AggregateIniValueList<EngramAutoUnlock>
{
public EngramAutoUnlockList(string aggregateValueName)
: base(aggregateValueName, null)
{
}
public override void FromIniValues(IEnumerable<string> iniValues)
{
var items = iniValues?.Select(AggregateIniValue.FromINIValue<EngramAutoUnlock>).ToArray();
Clear();
var itemsToAdd = items.Where(i => !this.Any(e => e.IsEquivalent(i))).ToArray();
AddRange(itemsToAdd);
var itemsToUpdate = items.Where(i => this.Any(e => e.IsEquivalent(i))).ToArray();
foreach (var item in itemsToUpdate)
{
var e = this.FirstOrDefault(r => r.IsEquivalent(item));
e.LevelToAutoUnlock = item.LevelToAutoUnlock;
}
IsEnabled = (Count != 0);
Sort(AggregateIniValue.SortKeySelector);
}
public override IEnumerable<string> ToIniValues()
{
if (string.IsNullOrWhiteSpace(IniCollectionKey))
return this.Where(d => d.ShouldSave()).Select(d => d.ToINIValue());
return this.Where(d => d.ShouldSave()).Select(d => $"{this.IniCollectionKey}={d.ToINIValue()}");
}
}
public class EngramAutoUnlock : AggregateIniValue
{
public static readonly DependencyProperty EngramClassNameProperty = DependencyProperty.Register(nameof(EngramClassName), typeof(string), typeof(EngramAutoUnlock), new PropertyMetadata(String.Empty));
public static readonly DependencyProperty LevelToAutoUnlockProperty = DependencyProperty.Register(nameof(LevelToAutoUnlock), typeof(int), typeof(EngramAutoUnlock), new PropertyMetadata(0));
[DataMember]
[AggregateIniValueEntry]
public string EngramClassName
{
get { return (string)GetValue(EngramClassNameProperty); }
set { SetValue(EngramClassNameProperty, value); }
}
[DataMember]
[AggregateIniValueEntry]
public int LevelToAutoUnlock
{
get { return (int)GetValue(LevelToAutoUnlockProperty); }
set { SetValue(LevelToAutoUnlockProperty, value); }
}
public static EngramAutoUnlock FromINIValue(string iniValue)
{
var engramAutoUnlock = new EngramAutoUnlock();
engramAutoUnlock.InitializeFromINIValue(iniValue);
return engramAutoUnlock;
}
public override string GetSortKey()
{
return null;
}
public override bool IsEquivalent(AggregateIniValue other)
{
return String.Equals(this.EngramClassName, ((EngramAutoUnlock)other).EngramClassName, StringComparison.OrdinalIgnoreCase);
}
public override string ToINIValue()
{
return base.ToINIValue();
}
}
}

View file

@ -0,0 +1,128 @@
using ServerManagerTool.Common.Attibutes;
using ServerManagerTool.Common.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Windows;
namespace ServerManagerTool.Lib
{
[DataContract]
public class EngramEntryList : AggregateIniValueList<EngramEntry>
{
public EngramEntryList(string aggregateValueName)
: base(aggregateValueName, null)
{
}
public override void FromIniValues(IEnumerable<string> iniValues)
{
var items = iniValues?.Select(AggregateIniValue.FromINIValue<EngramEntry>).ToArray();
Clear();
var itemsToAdd = items.Where(i => !this.Any(e => e.IsEquivalent(i))).ToArray();
AddRange(itemsToAdd);
var itemsToUpdate = items.Where(i => this.Any(e => e.IsEquivalent(i))).ToArray();
foreach (var item in itemsToUpdate)
{
var e = this.FirstOrDefault(r => r.IsEquivalent(item));
e.EngramLevelRequirement = item.EngramLevelRequirement;
e.EngramPointsCost = item.EngramPointsCost;
e.EngramHidden = item.EngramHidden;
e.RemoveEngramPreReq = item.RemoveEngramPreReq;
}
IsEnabled = (Count != 0);
Sort(AggregateIniValue.SortKeySelector);
}
public override IEnumerable<string> ToIniValues()
{
if (string.IsNullOrWhiteSpace(IniCollectionKey))
return this.Where(d => d.ShouldSave()).Select(d => d.ToINIValue());
return this.Where(d => d.ShouldSave()).Select(d => $"{this.IniCollectionKey}={d.ToINIValue()}");
}
}
[DataContract]
public class EngramEntry : AggregateIniValue
{
public static readonly DependencyProperty EngramClassNameProperty = DependencyProperty.Register(nameof(EngramClassName), typeof(string), typeof(EngramEntry), new PropertyMetadata(String.Empty));
public static readonly DependencyProperty EngramLevelRequirementProperty = DependencyProperty.Register(nameof(EngramLevelRequirement), typeof(int), typeof(EngramEntry), new PropertyMetadata(0));
public static readonly DependencyProperty EngramPointsCostProperty = DependencyProperty.Register(nameof(EngramPointsCost), typeof(int), typeof(EngramEntry), new PropertyMetadata(0));
public static readonly DependencyProperty EngramHiddenProperty = DependencyProperty.Register(nameof(EngramHidden), typeof(bool), typeof(EngramEntry), new PropertyMetadata(false));
public static readonly DependencyProperty RemoveEngramPreReqProperty = DependencyProperty.Register(nameof(RemoveEngramPreReq), typeof(bool), typeof(EngramEntry), new PropertyMetadata(false));
[DataMember]
[AggregateIniValueEntry]
public string EngramClassName
{
get { return (string)GetValue(EngramClassNameProperty); }
set { SetValue(EngramClassNameProperty, value); }
}
[DataMember]
[AggregateIniValueEntry]
public int EngramLevelRequirement
{
get { return (int)GetValue(EngramLevelRequirementProperty); }
set { SetValue(EngramLevelRequirementProperty, value); }
}
[DataMember]
[AggregateIniValueEntry]
public int EngramPointsCost
{
get { return (int)GetValue(EngramPointsCostProperty); }
set { SetValue(EngramPointsCostProperty, value); }
}
[DataMember]
[AggregateIniValueEntry]
public bool EngramHidden
{
get { return (bool)GetValue(EngramHiddenProperty); }
set { SetValue(EngramHiddenProperty, value); }
}
[DataMember]
[AggregateIniValueEntry]
public bool RemoveEngramPreReq
{
get { return (bool)GetValue(RemoveEngramPreReqProperty); }
set { SetValue(RemoveEngramPreReqProperty, value); }
}
public static EngramEntry FromINIValue(string iniValue)
{
var engramEntry = new EngramEntry();
engramEntry.InitializeFromINIValue(iniValue);
return engramEntry;
}
public override string GetSortKey()
{
return null;
}
public override void InitializeFromINIValue(string value)
{
base.InitializeFromINIValue(value);
}
public override bool IsEquivalent(AggregateIniValue other)
{
return String.Equals(this.EngramClassName, ((EngramEntry)other).EngramClassName, StringComparison.OrdinalIgnoreCase);
}
public override string ToINIValue()
{
return base.ToINIValue();
}
}
}

View file

@ -0,0 +1,260 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Text.RegularExpressions;
using System.Diagnostics;
using System.Xml.Serialization;
using TinyCsvParser.Mapping;
using System.Runtime.Serialization;
using ServerManagerTool.Common.Model;
namespace ServerManagerTool.Lib
{
[DataContract]
public class LevelList : SortableObservableCollection<Level>
{
const bool WORKAROUND_FOR_ENGRAM_LIST = true;
public static readonly Regex XPRegex = new Regex(@"ExperiencePointsForLevel\[(?<level>\d*)]=(?<xp>\d*)", RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture | RegexOptions.Compiled);
public static readonly Regex EngramRegex = new Regex(@"OverridePlayerLevelEngramPoints=(?<points>\d*)", RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture | RegexOptions.Compiled);
public static int AdditionalLevels = GameData.LevelsPlayerAdditional;
public void RemoveLevel(Level level)
{
base.Remove(level);
UpdateTotals();
}
public void AddRange(IEnumerable<Level> levels)
{
foreach (var level in levels)
{
base.Add(level);
}
UpdateTotals();
}
public void AddNewLevel(Level afterLevel)
{
AddNewLevel(afterLevel, 1);
}
public void AddNewLevel(Level afterLevel, int xpIncrease)
{
var newLevel = new Level
{
LevelIndex = 0,
XPRequired = afterLevel.XPRequired + xpIncrease,
EngramPoints = afterLevel.EngramPoints
};
base.Insert(base.IndexOf(afterLevel) + 1, newLevel);
UpdateTotals();
}
public void UpdateTotals()
{
int index = 0;
int xpTotal = 0;
int engramTotal = 0;
foreach (var existingLevel in this.OrderBy(l => l.XPRequired).ToArray())
{
xpTotal += existingLevel.XPRequired;
engramTotal += existingLevel.EngramPoints;
existingLevel.XPTotal = xpTotal;
existingLevel.EngramTotal = engramTotal;
existingLevel.LevelIndex = index;
existingLevel.ShowColored = index >= this.Count - AdditionalLevels;
index++;
}
base.Sort(f => f.LevelIndex);
}
public string ToINIValueForXP()
{
var builder = new StringBuilder();
builder.Append("LevelExperienceRampOverrides=(");
builder.Append(String.Join(",", this.OrderBy(l => l.XPRequired).Select(l => l.GetINISubValueForXP())));
builder.Append(')');
return builder.ToString();
}
public List<string> ToINIValuesForEngramPoints()
{
var entries = new List<string>();
if (WORKAROUND_FOR_ENGRAM_LIST)
{
entries.Add(new Level().GetINIValueForEngramPointsEarned());
}
foreach (var level in this.OrderBy(l => l.XPRequired))
{
entries.Add(level.GetINIValueForEngramPointsEarned());
}
return entries;
}
public static LevelList FromINIValues(string xpValue, IEnumerable<string> engramValues = null)
{
var levels = new LevelList();
var xpResult = XPRegex.Match(xpValue);
var engramResult = engramValues == null ? null : EngramRegex.Match(String.Join(" ", engramValues));
if (WORKAROUND_FOR_ENGRAM_LIST)
{
if (engramResult != null)
{
engramResult = engramResult.NextMatch();
}
}
while (xpResult.Success && (engramValues == null || engramResult.Success))
{
int levelIndex;
if (!int.TryParse(xpResult.Groups["level"].Value, out levelIndex))
{
Debug.WriteLine(String.Format("Invalid level index value: '{0}'", xpResult.Groups["level"].Value));
break;
}
int xpRequired;
if (!int.TryParse(xpResult.Groups["xp"].Value, out xpRequired))
{
Debug.WriteLine(String.Format("Invalid xm required value: '{0}'", xpResult.Groups["xp"].Value));
break;
}
int engramPoints = 0;
if (engramResult != null)
{
if (!int.TryParse(engramResult.Groups["points"].Value, out engramPoints))
{
Debug.WriteLine(String.Format("Invalid engram points value: '{0}'", engramResult.Groups["points"].Value));
break;
}
}
levels.Add(new Level { LevelIndex = levelIndex, XPRequired = xpRequired, EngramPoints = engramPoints });
xpResult = xpResult.NextMatch();
if (engramResult != null)
{
engramResult = engramResult.NextMatch();
}
}
levels.UpdateTotals();
return levels;
}
}
[DataContract]
public class Level : DependencyObject
{
public static readonly DependencyProperty LevelIndexProperty = DependencyProperty.Register(nameof(LevelIndex), typeof(int), typeof(Level), new PropertyMetadata(0));
public static readonly DependencyProperty XPRequiredProperty = DependencyProperty.Register(nameof(XPRequired), typeof(int), typeof(Level), new PropertyMetadata(0));
public static readonly DependencyProperty EngramPointsProperty = DependencyProperty.Register(nameof(EngramPoints), typeof(int), typeof(Level), new PropertyMetadata(0));
public static readonly DependencyProperty XPTotalProperty = DependencyProperty.Register(nameof(XPTotal), typeof(int), typeof(Level), new PropertyMetadata(0));
public static readonly DependencyProperty EngramTotalProperty = DependencyProperty.Register(nameof(EngramTotal), typeof(int), typeof(Level), new PropertyMetadata(0));
public static readonly DependencyProperty ShowColoredProperty = DependencyProperty.Register(nameof(ShowColored), typeof(bool), typeof(Level), new PropertyMetadata(false));
[DataMember]
public int LevelIndex
{
get { return (int)GetValue(LevelIndexProperty); }
set { SetValue(LevelIndexProperty, value); }
}
[DataMember]
public int XPRequired
{
get { return (int)GetValue(XPRequiredProperty); }
set { SetValue(XPRequiredProperty, value); }
}
[DataMember]
public int EngramPoints
{
get { return (int)GetValue(EngramPointsProperty); }
set { SetValue(EngramPointsProperty, value); }
}
[XmlIgnore()]
public int XPTotal
{
get { return (int)GetValue(XPTotalProperty); }
set { SetValue(XPTotalProperty, value); }
}
[XmlIgnore()]
public int EngramTotal
{
get { return (int)GetValue(EngramTotalProperty); }
set { SetValue(EngramTotalProperty, value); }
}
public string GetINISubValueForXP()
{
return String.Format("ExperiencePointsForLevel[{0}]={1}", this.LevelIndex, this.XPRequired);
}
public string GetINIValueForEngramPointsEarned()
{
return String.Format("OverridePlayerLevelEngramPoints={0}", this.EngramPoints);
}
internal Level Duplicate()
{
return new Level { XPRequired = this.XPRequired, EngramPoints = this.EngramPoints };
}
public bool ShowColored
{
get { return (bool)GetValue(ShowColoredProperty); }
set { SetValue(ShowColoredProperty, value); }
}
}
public class CsvPlayerLevelMapping : CsvMapping<ImportLevel>
{
public CsvPlayerLevelMapping()
: base()
{
MapProperty(0, x => x.LevelIndex);
MapProperty(1, x => x.XPRequired);
MapProperty(2, x => x.EngramPoints);
}
}
public class CsvDinoLevelMapping : CsvMapping<ImportLevel>
{
public CsvDinoLevelMapping()
: base()
{
MapProperty(0, x => x.LevelIndex);
MapProperty(1, x => x.XPRequired);
}
}
public class ImportLevel
{
public int LevelIndex { get; set; }
public int XPRequired { get; set; }
public int EngramPoints { get; set; }
public Level AsLevel()
{
return new Level() { LevelIndex = LevelIndex, XPRequired = XPRequired, EngramPoints = EngramPoints };
}
}
}

View file

@ -0,0 +1,53 @@
using ServerManagerTool.Common.Attibutes;
using ServerManagerTool.Common.Model;
using System;
using System.Runtime.Serialization;
using System.Windows;
namespace ServerManagerTool.Lib
{
[DataContract]
public class NPCReplacement : AggregateIniValue
{
public static readonly DependencyProperty FromClassNameProperty = DependencyProperty.Register(nameof(FromClassName), typeof(string), typeof(NPCReplacement), new PropertyMetadata(String.Empty));
public static readonly DependencyProperty ToClassNameProperty = DependencyProperty.Register(nameof(ToClassName), typeof(string), typeof(NPCReplacement), new PropertyMetadata(String.Empty));
[DataMember]
[AggregateIniValueEntry]
public string FromClassName
{
get { return (string)GetValue(FromClassNameProperty); }
set { SetValue(FromClassNameProperty, value); }
}
[DataMember]
[AggregateIniValueEntry]
public string ToClassName
{
get { return (string)GetValue(ToClassNameProperty); }
set { SetValue(ToClassNameProperty, value); }
}
public static NPCReplacement FromINIValue(string iniValue)
{
var newSpawn = new NPCReplacement();
newSpawn.InitializeFromINIValue(iniValue);
return newSpawn;
}
public override string GetSortKey()
{
return this.FromClassName;
}
public override bool IsEquivalent(AggregateIniValue other)
{
return String.Equals(this.FromClassName, ((NPCReplacement)other).FromClassName, StringComparison.OrdinalIgnoreCase);
}
public override bool ShouldSave()
{
return (!String.Equals(FromClassName, ToClassName, StringComparison.OrdinalIgnoreCase));
}
}
}

View file

@ -0,0 +1,509 @@
using ServerManagerTool.Common.Attibutes;
using ServerManagerTool.Common.Interfaces;
using ServerManagerTool.Common.Model;
using ServerManagerTool.Common.Utils;
using ServerManagerTool.Enums;
using ServerManagerTool.Interface;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Windows;
namespace ServerManagerTool.Lib
{
[DataContract]
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class NPCSpawnAttribute : Attribute
{
/// <summary>
/// Attribute for the NPCSpawn value
/// </summary>
public NPCSpawnAttribute(NPCSpawnContainerType[] containerTypes)
{
this.ContainerTypes = containerTypes.ToList();
}
/// <summary>
/// The ContainerTypes that are valid for the property.
/// </summary>
[DataMember]
public List<NPCSpawnContainerType> ContainerTypes;
}
[DataContract]
public class NPCSpawnContainerList<T> : AggregateIniValueList<T>, ISpawnIniValuesCollection
where T : AggregateIniValue, new()
{
public NPCSpawnContainerList(string aggregateValueName, NPCSpawnContainerType containerType)
: base(aggregateValueName, null)
{
ContainerType = containerType;
}
[DataMember]
public NPCSpawnContainerType ContainerType
{
get;
set;
}
public override IEnumerable<string> ToIniValues()
{
return this.ToIniValues(ContainerType);
}
public IEnumerable<string> ToIniValues(NPCSpawnContainerType containerType)
{
if (string.IsNullOrWhiteSpace(IniCollectionKey))
return this.Where(d => d.ShouldSave()).Cast<ISpawnIniValue>().Select(d => d.ToIniValue(containerType));
return this.Where(d => d.ShouldSave()).Cast<ISpawnIniValue>().Select(d => $"{this.IniCollectionKey}={d.ToIniValue(containerType)}");
}
}
[DataContract]
public class NPCSpawnContainer : AggregateIniValue, ISpawnIniValue
{
public NPCSpawnContainer()
{
NPCSpawnEntries = new NPCSpawnList<NPCSpawnEntry>(null);
NPCSpawnLimits = new NPCSpawnList<NPCSpawnLimit>(null);
}
[DataMember]
public Guid UniqueId = Guid.NewGuid();
public static readonly DependencyProperty NPCSpawnEntriesContainerClassStringProperty = DependencyProperty.Register(nameof(NPCSpawnEntriesContainerClassString), typeof(string), typeof(NPCSpawnContainer), new PropertyMetadata(string.Empty));
[DataMember]
[AggregateIniValueEntry]
[NPCSpawn(new[] { NPCSpawnContainerType.Add, NPCSpawnContainerType.Subtract, NPCSpawnContainerType.Override })]
public string NPCSpawnEntriesContainerClassString
{
get { return (string)GetValue(NPCSpawnEntriesContainerClassStringProperty); }
set { SetValue(NPCSpawnEntriesContainerClassStringProperty, value); }
}
public static readonly DependencyProperty NPCSpawnEntriesProperty = DependencyProperty.Register(nameof(NPCSpawnEntries), typeof(NPCSpawnList<NPCSpawnEntry>), typeof(NPCSpawnContainer), new PropertyMetadata(null));
[DataMember]
[AggregateIniValueEntry(ValueWithinBrackets = true, ListValueWithinBrackets = true)]
[NPCSpawn(new[] { NPCSpawnContainerType.Add, NPCSpawnContainerType.Subtract, NPCSpawnContainerType.Override })]
public NPCSpawnList<NPCSpawnEntry> NPCSpawnEntries
{
get { return (NPCSpawnList<NPCSpawnEntry>)GetValue(NPCSpawnEntriesProperty); }
set { SetValue(NPCSpawnEntriesProperty, value); }
}
public static readonly DependencyProperty NPCSpawnLimitsProperty = DependencyProperty.Register(nameof(NPCSpawnLimits), typeof(NPCSpawnList<NPCSpawnLimit>), typeof(NPCSpawnContainer), new PropertyMetadata(null));
[DataMember]
[AggregateIniValueEntry(ValueWithinBrackets = true, ListValueWithinBrackets = true)]
[NPCSpawn(new[] { NPCSpawnContainerType.Add, NPCSpawnContainerType.Subtract, NPCSpawnContainerType.Override })]
public NPCSpawnList<NPCSpawnLimit> NPCSpawnLimits
{
get { return (NPCSpawnList<NPCSpawnLimit>)GetValue(NPCSpawnLimitsProperty); }
set { SetValue(NPCSpawnLimitsProperty, value); }
}
public override string GetSortKey()
{
return null;
}
public override bool IsEquivalent(AggregateIniValue other)
{
return false;
}
public override void InitializeFromINIValue(string value)
{
if (string.IsNullOrWhiteSpace(value))
return;
var kvPair = value.Split(new[] { '=' }, 2);
var kvValue = kvPair[1].Trim(' ');
if (kvValue.StartsWith("("))
kvValue = kvValue.Substring(1);
if (kvValue.EndsWith(")"))
kvValue = kvValue.Substring(0, kvValue.Length - 1);
base.FromComplexINIValue(kvValue);
}
public override string ToINIValue()
{
throw new NotImplementedException();
}
public string ToIniValue(NPCSpawnContainerType containerType)
{
GetPropertyInfos();
if (this.Properties.Count == 0)
return string.Empty;
var result = new StringBuilder();
result.Append("(");
var delimiter = "";
foreach (var prop in this.Properties)
{
var attrSpawn = prop.GetCustomAttributes(typeof(NPCSpawnAttribute), false).OfType<NPCSpawnAttribute>().FirstOrDefault();
if (!attrSpawn?.ContainerTypes?.Contains(containerType) ?? false)
continue;
result.Append(delimiter);
var attr = prop.GetCustomAttributes(typeof(AggregateIniValueEntryAttribute), false).OfType<AggregateIniValueEntryAttribute>().FirstOrDefault();
var propName = string.IsNullOrWhiteSpace(attr?.Key) ? prop.Name : attr.Key;
result.Append($"{propName}=");
if (attr?.ValueWithinBrackets ?? false)
result.Append("(");
var val = prop.GetValue(this);
var spawnCollection = val as ISpawnIniValuesCollection;
if (spawnCollection != null)
{
var iniVals = spawnCollection.ToIniValues(containerType);
var delimiter2 = "";
foreach (var iniVal in iniVals)
{
result.Append(delimiter2);
if (attr?.ListValueWithinBrackets ?? false)
result.Append($"({iniVal})");
else
result.Append(iniVal);
delimiter2 = DELIMITER.ToString();
}
}
else
{
var collection = val as IIniValuesCollection;
if (collection != null)
{
var iniVals = collection.ToIniValues();
var delimiter2 = "";
foreach (var iniVal in iniVals)
{
result.Append(delimiter2);
if (attr?.ListValueWithinBrackets ?? false)
result.Append($"({iniVal})");
else
result.Append(iniVal);
delimiter2 = DELIMITER.ToString();
}
}
else
{
var propValue = StringUtils.GetPropertyValue(val, prop);
result.Append(propValue);
}
}
if (attr?.ValueWithinBrackets ?? false)
result.Append(")");
delimiter = DELIMITER.ToString();
}
result.Append(")");
return result.ToString();
}
public override string ToString()
{
return $"{NPCSpawnEntriesContainerClassString}; NPCSpawnEntries={NPCSpawnEntries.Count}; NPCSpawnLimits={NPCSpawnLimits.Count}";
}
public bool IsValid => !string.IsNullOrWhiteSpace(NPCSpawnEntriesContainerClassString) && NPCSpawnEntries.Count == NPCSpawnLimits.Count;
}
[DataContract]
public class NPCSpawnList<T> : AggregateIniValueList<T>, ISpawnIniValuesCollection
where T : AggregateIniValue, new()
{
public NPCSpawnList(string aggregateValueName)
: base(aggregateValueName, null)
{
}
public override IEnumerable<string> ToIniValues()
{
throw new NotImplementedException();
}
public IEnumerable<string> ToIniValues(NPCSpawnContainerType containerType)
{
if (string.IsNullOrWhiteSpace(IniCollectionKey))
return this.Where(d => d.ShouldSave()).Cast<ISpawnIniValue>().Select(d => d.ToIniValue(containerType));
return this.Where(d => d.ShouldSave()).Cast<ISpawnIniValue>().Select(d => $"{this.IniCollectionKey}={d.ToIniValue(containerType)}");
}
}
[DataContract]
public class NPCSpawnEntry : AggregateIniValue, ISpawnIniValue
{
public static readonly DependencyProperty AnEntryNameProperty = DependencyProperty.Register(nameof(AnEntryName), typeof(string), typeof(NPCSpawnEntry), new PropertyMetadata(string.Empty));
[DataMember]
[AggregateIniValueEntry]
[NPCSpawn(new[] { NPCSpawnContainerType.Add, NPCSpawnContainerType.Override })]
public string AnEntryName
{
get { return (string)GetValue(AnEntryNameProperty); }
set { SetValue(AnEntryNameProperty, value); }
}
public static readonly DependencyProperty EntryWeightProperty = DependencyProperty.Register(nameof(EntryWeight), typeof(float), typeof(NPCSpawnEntry), new PropertyMetadata(1.0f));
[DataMember]
[AggregateIniValueEntry]
[NPCSpawn(new[] { NPCSpawnContainerType.Add, NPCSpawnContainerType.Override })]
public float EntryWeight
{
get { return (float)GetValue(EntryWeightProperty); }
set { SetValue(EntryWeightProperty, value); }
}
public static readonly DependencyProperty NPCsToSpawnStringsProperty = DependencyProperty.Register(nameof(NPCsToSpawnStrings), typeof(string), typeof(NPCSpawnEntry), new PropertyMetadata(string.Empty));
[DataMember]
[AggregateIniValueEntry(ValueWithinBrackets = true)]
[NPCSpawn(new[] { NPCSpawnContainerType.Add, NPCSpawnContainerType.Subtract, NPCSpawnContainerType.Override })]
public string NPCsToSpawnStrings
{
get { return (string)GetValue(NPCsToSpawnStringsProperty); }
set { SetValue(NPCsToSpawnStringsProperty, value); }
}
public override string GetSortKey()
{
return null;
}
public override bool IsEquivalent(AggregateIniValue other)
{
return false;
}
public override void InitializeFromINIValue(string value)
{
base.FromComplexINIValue(value);
}
public override string ToINIValue()
{
throw new NotImplementedException();
}
public string ToIniValue(NPCSpawnContainerType containerType)
{
GetPropertyInfos();
if (this.Properties.Count == 0)
return string.Empty;
var result = new StringBuilder();
var delimiter = "";
foreach (var prop in this.Properties)
{
var attrSpawn = prop.GetCustomAttributes(typeof(NPCSpawnAttribute), false).OfType<NPCSpawnAttribute>().FirstOrDefault();
if (!attrSpawn?.ContainerTypes?.Contains(containerType) ?? false)
continue;
result.Append(delimiter);
var attr = prop.GetCustomAttributes(typeof(AggregateIniValueEntryAttribute), false).OfType<AggregateIniValueEntryAttribute>().FirstOrDefault();
var propName = string.IsNullOrWhiteSpace(attr?.Key) ? prop.Name : attr.Key;
result.Append($"{propName}=");
if (attr?.ValueWithinBrackets ?? false)
result.Append("(");
var val = prop.GetValue(this);
var spawnCollection = val as ISpawnIniValuesCollection;
if (spawnCollection != null)
{
var iniVals = spawnCollection.ToIniValues(containerType);
var delimiter2 = "";
foreach (var iniVal in iniVals)
{
result.Append(delimiter2);
if (attr?.ListValueWithinBrackets ?? false)
result.Append($"({iniVal})");
else
result.Append(iniVal);
delimiter2 = DELIMITER.ToString();
}
}
else
{
var collection = val as IIniValuesCollection;
if (collection != null)
{
var iniVals = collection.ToIniValues();
var delimiter2 = "";
foreach (var iniVal in iniVals)
{
result.Append(delimiter2);
if (attr?.ListValueWithinBrackets ?? false)
result.Append($"({iniVal})");
else
result.Append(iniVal);
delimiter2 = DELIMITER.ToString();
}
}
else
{
var propValue = StringUtils.GetPropertyValue(val, prop);
result.Append(propValue);
}
}
if (attr?.ValueWithinBrackets ?? false)
result.Append(")");
delimiter = DELIMITER.ToString();
}
return result.ToString();
}
public override string ToString()
{
return $"AnEntryName={AnEntryName}; EntryWeight={EntryWeight}; NPCsToSpawnStrings={NPCsToSpawnStrings}";
}
public bool IsValid => !string.IsNullOrWhiteSpace(NPCsToSpawnStrings);
}
[DataContract]
public class NPCSpawnLimit : AggregateIniValue, ISpawnIniValue
{
public static readonly DependencyProperty NPCClassStringProperty = DependencyProperty.Register(nameof(NPCClassString), typeof(string), typeof(NPCSpawnLimit), new PropertyMetadata(string.Empty));
[DataMember]
[AggregateIniValueEntry]
[NPCSpawn(new[] { NPCSpawnContainerType.Add, NPCSpawnContainerType.Subtract, NPCSpawnContainerType.Override })]
public string NPCClassString
{
get { return (string)GetValue(NPCClassStringProperty); }
set { SetValue(NPCClassStringProperty, value); }
}
public static readonly DependencyProperty MaxPercentageOfDesiredNumToAllowProperty = DependencyProperty.Register(nameof(MaxPercentageOfDesiredNumToAllow), typeof(float), typeof(NPCSpawnLimit), new PropertyMetadata(1.0f));
[DataMember]
[AggregateIniValueEntry]
[NPCSpawn(new[] { NPCSpawnContainerType.Add, NPCSpawnContainerType.Override })]
public float MaxPercentageOfDesiredNumToAllow
{
get { return (float)GetValue(MaxPercentageOfDesiredNumToAllowProperty); }
set { SetValue(MaxPercentageOfDesiredNumToAllowProperty, value); }
}
public override string GetSortKey()
{
return null;
}
public override bool IsEquivalent(AggregateIniValue other)
{
return false;
}
public override void InitializeFromINIValue(string value)
{
base.FromComplexINIValue(value);
}
public override string ToINIValue()
{
throw new NotImplementedException();
}
public string ToIniValue(NPCSpawnContainerType containerType)
{
GetPropertyInfos();
if (this.Properties.Count == 0)
return string.Empty;
var result = new StringBuilder();
var delimiter = "";
foreach (var prop in this.Properties)
{
var attrSpawn = prop.GetCustomAttributes(typeof(NPCSpawnAttribute), false).OfType<NPCSpawnAttribute>().FirstOrDefault();
if (!attrSpawn?.ContainerTypes?.Contains(containerType) ?? false)
continue;
result.Append(delimiter);
var attr = prop.GetCustomAttributes(typeof(AggregateIniValueEntryAttribute), false).OfType<AggregateIniValueEntryAttribute>().FirstOrDefault();
var propName = string.IsNullOrWhiteSpace(attr?.Key) ? prop.Name : attr.Key;
result.Append($"{propName}=");
if (attr?.ValueWithinBrackets ?? false)
result.Append("(");
var val = prop.GetValue(this);
var spawnCollection = val as ISpawnIniValuesCollection;
if (spawnCollection != null)
{
var iniVals = spawnCollection.ToIniValues(containerType);
var delimiter2 = "";
foreach (var iniVal in iniVals)
{
result.Append(delimiter2);
if (attr?.ListValueWithinBrackets ?? false)
result.Append($"({iniVal})");
else
result.Append(iniVal);
delimiter2 = DELIMITER.ToString();
}
}
else
{
var collection = val as IIniValuesCollection;
if (collection != null)
{
var iniVals = collection.ToIniValues();
var delimiter2 = "";
foreach (var iniVal in iniVals)
{
result.Append(delimiter2);
if (attr?.ListValueWithinBrackets ?? false)
result.Append($"({iniVal})");
else
result.Append(iniVal);
delimiter2 = DELIMITER.ToString();
}
}
else
{
var propValue = StringUtils.GetPropertyValue(val, prop);
result.Append(propValue);
}
}
if (attr?.ValueWithinBrackets ?? false)
result.Append(")");
delimiter = DELIMITER.ToString();
}
return result.ToString();
}
public override string ToString()
{
return $"NPCClassString={NPCClassString}; MaxPercentageOfDesiredNumToAllow={MaxPercentageOfDesiredNumToAllow}";
}
public bool IsValid => !string.IsNullOrWhiteSpace(NPCClassString);
}
}

View file

@ -0,0 +1,855 @@
using ServerManagerTool.Common.Attibutes;
using ServerManagerTool.Common.Model;
using ServerManagerTool.Common.Utils;
using System;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Windows;
namespace ServerManagerTool.Lib
{
[DataContract]
public class PGMTerrain : AggregateIniValue
{
private new const char DELIMITER = ';';
public PGMTerrain()
{
SnowBiomeLocation = new PGMTerrainXY(0.2f, 0.2f);
RedWoodForestBiomeLocation = new PGMTerrainXY(0.5f, 0.5f);
NorthRegion1Start = new PGMTerrainXY(0.25f, 0.0f);
NorthRegion1End = new PGMTerrainXY(0.416f, 0.5f);
NorthRegion2Start = new PGMTerrainXY(0.416f, 0.0f);
NorthRegion2End = new PGMTerrainXY(0.582f, 0.5f);
NorthRegion3Start = new PGMTerrainXY(0.582f, 0.0f);
NorthRegion3End = new PGMTerrainXY(0.75f, 0.0f);
SouthRegion1Start = new PGMTerrainXY(0.25f, 0.5f);
SouthRegion1End = new PGMTerrainXY(0.416f, 1.0f);
SouthRegion2Start = new PGMTerrainXY(0.416f, 0.5f);
SouthRegion2End = new PGMTerrainXY(0.582f, 1.0f);
SouthRegion3Start = new PGMTerrainXY(0.582f, 0.5f);
SouthRegion3End = new PGMTerrainXY(0.75f, 1.0f);
EastRegion1Start = new PGMTerrainXY(0.75f, 0.0f);
EastRegion1End = new PGMTerrainXY(1.0f, 0.333f);
EastRegion2Start = new PGMTerrainXY(0.75f, 0.333f);
EastRegion2End = new PGMTerrainXY(1.0f, 0.666f);
EastRegion3Start = new PGMTerrainXY(0.75f, 0.666f);
EastRegion3End = new PGMTerrainXY(1.0f, 1.0f);
WestRegion1Start = new PGMTerrainXY(0.0f, 0.0f);
WestRegion1End = new PGMTerrainXY(0.25f, 0.333f);
WestRegion2Start = new PGMTerrainXY(0.0f, 0.333f);
WestRegion2End = new PGMTerrainXY(0.25f, 0.666f);
WestRegion3Start = new PGMTerrainXY(0.0f, 0.666f);
WestRegion3End = new PGMTerrainXY(0.25f, 1.0f);
TerrainScaleMultiplier = new PGMTerrainXYZ(1.0f, 1.0f, 1.0f);
}
public static readonly DependencyProperty MapSeedProperty = DependencyProperty.Register(nameof(MapSeed), typeof(int), typeof(PGMTerrain), new PropertyMetadata(999));
[DataMember]
[AggregateIniValueEntry]
public int MapSeed
{
get { return (int)GetValue(MapSeedProperty); }
set { SetValue(MapSeedProperty, value); }
}
public static readonly DependencyProperty LandscapeRadiusProperty = DependencyProperty.Register(nameof(LandscapeRadius), typeof(float), typeof(PGMTerrain), new PropertyMetadata(1.0f));
[DataMember]
[AggregateIniValueEntry]
public float LandscapeRadius
{
get { return (float)GetValue(LandscapeRadiusProperty); }
set { SetValue(LandscapeRadiusProperty, value); }
}
public static readonly DependencyProperty WaterFrequencyProperty = DependencyProperty.Register(nameof(WaterFrequency), typeof(float), typeof(PGMTerrain), new PropertyMetadata(5.0f));
[DataMember]
[AggregateIniValueEntry(Key = "Water Frequency")]
public float WaterFrequency
{
get { return (float)GetValue(WaterFrequencyProperty); }
set { SetValue(WaterFrequencyProperty, value); }
}
public static readonly DependencyProperty MountainsFrequencyProperty = DependencyProperty.Register(nameof(MountainsFrequency), typeof(float), typeof(PGMTerrain), new PropertyMetadata(12.0f));
[DataMember]
[AggregateIniValueEntry(Key = "Mountains Frequency")]
public float MountainsFrequency
{
get { return (float)GetValue(MountainsFrequencyProperty); }
set { SetValue(MountainsFrequencyProperty, value); }
}
public static readonly DependencyProperty MountainsSlopeProperty = DependencyProperty.Register(nameof(MountainsSlope), typeof(float), typeof(PGMTerrain), new PropertyMetadata(1.8f));
[DataMember]
[AggregateIniValueEntry(Key = "Mountains Slope")]
public float MountainsSlope
{
get { return (float)GetValue(MountainsSlopeProperty); }
set { SetValue(MountainsSlopeProperty, value); }
}
public static readonly DependencyProperty MountainsHeightProperty = DependencyProperty.Register(nameof(MountainsHeight), typeof(float), typeof(PGMTerrain), new PropertyMetadata(1.25f));
[DataMember]
[AggregateIniValueEntry]
public float MountainsHeight
{
get { return (float)GetValue(MountainsHeightProperty); }
set { SetValue(MountainsHeightProperty, value); }
}
public static readonly DependencyProperty TurbulencePowerProperty = DependencyProperty.Register(nameof(TurbulencePower), typeof(float), typeof(PGMTerrain), new PropertyMetadata(0.0125f));
[DataMember]
[AggregateIniValueEntry(Key = "Turbulence Power")]
public float TurbulencePower
{
get { return (float)GetValue(TurbulencePowerProperty); }
set { SetValue(TurbulencePowerProperty, value); }
}
public static readonly DependencyProperty ShoreSlopeProperty = DependencyProperty.Register(nameof(ShoreSlope), typeof(float), typeof(PGMTerrain), new PropertyMetadata(1.0f));
[DataMember]
[AggregateIniValueEntry(Key = "Shore Slope")]
public float ShoreSlope
{
get { return (float)GetValue(ShoreSlopeProperty); }
set { SetValue(ShoreSlopeProperty, value); }
}
public static readonly DependencyProperty WaterLevelProperty = DependencyProperty.Register(nameof(WaterLevel), typeof(float), typeof(PGMTerrain), new PropertyMetadata(-0.72f));
[DataMember]
[AggregateIniValueEntry]
public float WaterLevel
{
get { return (float)GetValue(WaterLevelProperty); }
set { SetValue(WaterLevelProperty, value); }
}
public static readonly DependencyProperty ShoreLineEndProperty = DependencyProperty.Register(nameof(ShoreLineEnd), typeof(float), typeof(PGMTerrain), new PropertyMetadata(-0.715f));
[DataMember]
[AggregateIniValueEntry]
public float ShoreLineEnd
{
get { return (float)GetValue(ShoreLineEndProperty); }
set { SetValue(ShoreLineEndProperty, value); }
}
public static readonly DependencyProperty GrassDensityProperty = DependencyProperty.Register(nameof(GrassDensity), typeof(float), typeof(PGMTerrain), new PropertyMetadata(1.0f));
[DataMember]
[AggregateIniValueEntry]
public float GrassDensity
{
get { return (float)GetValue(GrassDensityProperty); }
set { SetValue(GrassDensityProperty, value); }
}
public static readonly DependencyProperty JungleGrassDensityProperty = DependencyProperty.Register(nameof(JungleGrassDensity), typeof(float), typeof(PGMTerrain), new PropertyMetadata(0.02f));
[DataMember]
[AggregateIniValueEntry]
public float JungleGrassDensity
{
get { return (float)GetValue(JungleGrassDensityProperty); }
set { SetValue(JungleGrassDensityProperty, value); }
}
public static readonly DependencyProperty OceanFloorLevelProperty = DependencyProperty.Register(nameof(OceanFloorLevel), typeof(float), typeof(PGMTerrain), new PropertyMetadata(-1.0f));
[DataMember]
[AggregateIniValueEntry]
public float OceanFloorLevel
{
get { return (float)GetValue(OceanFloorLevelProperty); }
set { SetValue(OceanFloorLevelProperty, value); }
}
public static readonly DependencyProperty SnowBiomeSizeProperty = DependencyProperty.Register(nameof(SnowBiomeSize), typeof(float), typeof(PGMTerrain), new PropertyMetadata(0.3f));
[DataMember]
[AggregateIniValueEntry]
public float SnowBiomeSize
{
get { return (float)GetValue(SnowBiomeSizeProperty); }
set { SetValue(SnowBiomeSizeProperty, value); }
}
public static readonly DependencyProperty RedWoodBiomeSizeProperty = DependencyProperty.Register(nameof(RedWoodBiomeSize), typeof(float), typeof(PGMTerrain), new PropertyMetadata(0.075f));
[DataMember]
[AggregateIniValueEntry(Key = "RWBiomeSize")]
public float RedWoodBiomeSize
{
get { return (float)GetValue(RedWoodBiomeSizeProperty); }
set { SetValue(RedWoodBiomeSizeProperty, value); }
}
public static readonly DependencyProperty MountainBiomeStartProperty = DependencyProperty.Register(nameof(MountainBiomeStart), typeof(float), typeof(PGMTerrain), new PropertyMetadata(-0.55f));
[DataMember]
[AggregateIniValueEntry]
public float MountainBiomeStart
{
get { return (float)GetValue(MountainBiomeStartProperty); }
set { SetValue(MountainBiomeStartProperty, value); }
}
public static readonly DependencyProperty MountainsTreeDensityProperty = DependencyProperty.Register(nameof(MountainsTreeDensity), typeof(float), typeof(PGMTerrain), new PropertyMetadata(0.01f));
[DataMember]
[AggregateIniValueEntry]
public float MountainsTreeDensity
{
get { return (float)GetValue(MountainsTreeDensityProperty); }
set { SetValue(MountainsTreeDensityProperty, value); }
}
public static readonly DependencyProperty JungleBiomeStartProperty = DependencyProperty.Register(nameof(JungleBiomeStart), typeof(float), typeof(PGMTerrain), new PropertyMetadata(-0.65f));
[DataMember]
[AggregateIniValueEntry]
public float JungleBiomeStart
{
get { return (float)GetValue(JungleBiomeStartProperty); }
set { SetValue(JungleBiomeStartProperty, value); }
}
public static readonly DependencyProperty IslandBorderCurveExponentProperty = DependencyProperty.Register(nameof(IslandBorderCurveExponent), typeof(float), typeof(PGMTerrain), new PropertyMetadata(4.0f));
[DataMember]
[AggregateIniValueEntry(Key = "IslandBorderCurveExp")]
public float IslandBorderCurveExponent
{
get { return (float)GetValue(IslandBorderCurveExponentProperty); }
set { SetValue(IslandBorderCurveExponentProperty, value); }
}
public static readonly DependencyProperty MaxSpawnPointHeightProperty = DependencyProperty.Register(nameof(MaxSpawnPointHeight), typeof(float), typeof(PGMTerrain), new PropertyMetadata(0.1f));
[DataMember]
[AggregateIniValueEntry(Key = "MaxSawnPointHeight")]
public float MaxSpawnPointHeight
{
get { return (float)GetValue(MaxSpawnPointHeightProperty); }
set { SetValue(MaxSpawnPointHeightProperty, value); }
}
public static readonly DependencyProperty MountainGrassDensityProperty = DependencyProperty.Register(nameof(MountainGrassDensity), typeof(float), typeof(PGMTerrain), new PropertyMetadata(0.05f));
[DataMember]
[AggregateIniValueEntry]
public float MountainGrassDensity
{
get { return (float)GetValue(MountainGrassDensityProperty); }
set { SetValue(MountainGrassDensityProperty, value); }
}
public static readonly DependencyProperty SnowMountainGrassDensityProperty = DependencyProperty.Register(nameof(SnowMountainGrassDensity), typeof(float), typeof(PGMTerrain), new PropertyMetadata(0.15f));
[DataMember]
[AggregateIniValueEntry]
public float SnowMountainGrassDensity
{
get { return (float)GetValue(SnowMountainGrassDensityProperty); }
set { SetValue(SnowMountainGrassDensityProperty, value); }
}
public static readonly DependencyProperty SnowGrassDensityProperty = DependencyProperty.Register(nameof(SnowGrassDensity), typeof(float), typeof(PGMTerrain), new PropertyMetadata(0.25f));
[DataMember]
[AggregateIniValueEntry]
public float SnowGrassDensity
{
get { return (float)GetValue(SnowGrassDensityProperty); }
set { SetValue(SnowGrassDensityProperty, value); }
}
public static readonly DependencyProperty UnderwaterObjectsDensityProperty = DependencyProperty.Register(nameof(UnderwaterObjectsDensity), typeof(float), typeof(PGMTerrain), new PropertyMetadata(0.5f));
[DataMember]
[AggregateIniValueEntry]
public float UnderwaterObjectsDensity
{
get { return (float)GetValue(UnderwaterObjectsDensityProperty); }
set { SetValue(UnderwaterObjectsDensityProperty, value); }
}
public static readonly DependencyProperty SnowMountainsTreeDensityProperty = DependencyProperty.Register(nameof(SnowMountainsTreeDensity), typeof(float), typeof(PGMTerrain), new PropertyMetadata(0.01f));
[DataMember]
[AggregateIniValueEntry]
public float SnowMountainsTreeDensity
{
get { return (float)GetValue(SnowMountainsTreeDensityProperty); }
set { SetValue(SnowMountainsTreeDensityProperty, value); }
}
public static readonly DependencyProperty TreeDensityProperty = DependencyProperty.Register(nameof(TreeDensity), typeof(float), typeof(PGMTerrain), new PropertyMetadata(0.003f));
[DataMember]
[AggregateIniValueEntry]
public float TreeDensity
{
get { return (float)GetValue(TreeDensityProperty); }
set { SetValue(TreeDensityProperty, value); }
}
public static readonly DependencyProperty JungleTreeDensityProperty = DependencyProperty.Register(nameof(JungleTreeDensity), typeof(float), typeof(PGMTerrain), new PropertyMetadata(0.66f));
[DataMember]
[AggregateIniValueEntry]
public float JungleTreeDensity
{
get { return (float)GetValue(JungleTreeDensityProperty); }
set { SetValue(JungleTreeDensityProperty, value); }
}
public static readonly DependencyProperty RedWoodTreeDensityProperty = DependencyProperty.Register(nameof(RedWoodTreeDensity), typeof(float), typeof(PGMTerrain), new PropertyMetadata(0.35f));
[DataMember]
[AggregateIniValueEntry]
public float RedWoodTreeDensity
{
get { return (float)GetValue(RedWoodTreeDensityProperty); }
set { SetValue(RedWoodTreeDensityProperty, value); }
}
public static readonly DependencyProperty SnowTreeDensityProperty = DependencyProperty.Register(nameof(SnowTreeDensity), typeof(float), typeof(PGMTerrain), new PropertyMetadata(1.0f));
[DataMember]
[AggregateIniValueEntry]
public float SnowTreeDensity
{
get { return (float)GetValue(SnowTreeDensityProperty); }
set { SetValue(SnowTreeDensityProperty, value); }
}
public static readonly DependencyProperty RedwoodGrassDensityProperty = DependencyProperty.Register(nameof(RedwoodGrassDensity), typeof(float), typeof(PGMTerrain), new PropertyMetadata(0.1f));
[DataMember]
[AggregateIniValueEntry]
public float RedwoodGrassDensity
{
get { return (float)GetValue(RedwoodGrassDensityProperty); }
set { SetValue(RedwoodGrassDensityProperty, value); }
}
public static readonly DependencyProperty ShoreTreeDensityProperty = DependencyProperty.Register(nameof(ShoreTreeDensity), typeof(float), typeof(PGMTerrain), new PropertyMetadata(0.05f));
[DataMember]
[AggregateIniValueEntry]
public float ShoreTreeDensity
{
get { return (float)GetValue(ShoreTreeDensityProperty); }
set { SetValue(ShoreTreeDensityProperty, value); }
}
public static readonly DependencyProperty SnowShoreTreeDensityProperty = DependencyProperty.Register(nameof(SnowShoreTreeDensity), typeof(float), typeof(PGMTerrain), new PropertyMetadata(0.025f));
[DataMember]
[AggregateIniValueEntry]
public float SnowShoreTreeDensity
{
get { return (float)GetValue(SnowShoreTreeDensityProperty); }
set { SetValue(SnowShoreTreeDensityProperty, value); }
}
public static readonly DependencyProperty DeepWaterBiomesDepthProperty = DependencyProperty.Register(nameof(DeepWaterBiomesDepth), typeof(float), typeof(PGMTerrain), new PropertyMetadata(-0.24f));
[DataMember]
[AggregateIniValueEntry]
public float DeepWaterBiomesDepth
{
get { return (float)GetValue(DeepWaterBiomesDepthProperty); }
set { SetValue(DeepWaterBiomesDepthProperty, value); }
}
public static readonly DependencyProperty InlandWaterObjectsDensityProperty = DependencyProperty.Register(nameof(InlandWaterObjectsDensity), typeof(float), typeof(PGMTerrain), new PropertyMetadata(0.5f));
[DataMember]
[AggregateIniValueEntry]
public float InlandWaterObjectsDensity
{
get { return (float)GetValue(InlandWaterObjectsDensityProperty); }
set { SetValue(InlandWaterObjectsDensityProperty, value); }
}
public static readonly DependencyProperty ShorelineStartOffsetProperty = DependencyProperty.Register(nameof(ShorelineStartOffset), typeof(float), typeof(PGMTerrain), new PropertyMetadata(0.01f));
[DataMember]
[AggregateIniValueEntry]
public float ShorelineStartOffset
{
get { return (float)GetValue(ShorelineStartOffsetProperty); }
set { SetValue(ShorelineStartOffsetProperty, value); }
}
public static readonly DependencyProperty ShorelineThicknessProperty = DependencyProperty.Register(nameof(ShorelineThickness), typeof(float), typeof(PGMTerrain), new PropertyMetadata(0.0015f));
[DataMember]
[AggregateIniValueEntry]
public float ShorelineThickness
{
get { return (float)GetValue(ShorelineThicknessProperty); }
set { SetValue(ShorelineThicknessProperty, value); }
}
public static readonly DependencyProperty TreesGroundSlopeAccuracyProperty = DependencyProperty.Register(nameof(TreesGroundSlopeAccuracy), typeof(float), typeof(PGMTerrain), new PropertyMetadata(0.5f));
[DataMember]
[AggregateIniValueEntry]
public float TreesGroundSlopeAccuracy
{
get { return (float)GetValue(TreesGroundSlopeAccuracyProperty); }
set { SetValue(TreesGroundSlopeAccuracyProperty, value); }
}
public static readonly DependencyProperty ErosionStepsProperty = DependencyProperty.Register(nameof(ErosionSteps), typeof(int), typeof(PGMTerrain), new PropertyMetadata(4));
[DataMember]
[AggregateIniValueEntry]
public int ErosionSteps
{
get { return (int)GetValue(ErosionStepsProperty); }
set { SetValue(ErosionStepsProperty, value); }
}
public static readonly DependencyProperty ErosionStrengthProperty = DependencyProperty.Register(nameof(ErosionStrength), typeof(float), typeof(PGMTerrain), new PropertyMetadata(0.75f));
[DataMember]
[AggregateIniValueEntry]
public float ErosionStrength
{
get { return (float)GetValue(ErosionStrengthProperty); }
set { SetValue(ErosionStrengthProperty, value); }
}
public static readonly DependencyProperty DepositionStrengthProperty = DependencyProperty.Register(nameof(DepositionStrength), typeof(float), typeof(PGMTerrain), new PropertyMetadata(0.5f));
[DataMember]
[AggregateIniValueEntry]
public float DepositionStrength
{
get { return (float)GetValue(DepositionStrengthProperty); }
set { SetValue(DepositionStrengthProperty, value); }
}
public static readonly DependencyProperty MountainGeneralTreesPercentProperty = DependencyProperty.Register(nameof(MountainGeneralTreesPercent), typeof(float), typeof(PGMTerrain), new PropertyMetadata(0.1f));
[DataMember]
[AggregateIniValueEntry]
public float MountainGeneralTreesPercent
{
get { return (float)GetValue(MountainGeneralTreesPercentProperty); }
set { SetValue(MountainGeneralTreesPercentProperty, value); }
}
public static readonly DependencyProperty SnowBiomeLocationProperty = DependencyProperty.Register(nameof(SnowBiomeLocation), typeof(PGMTerrainXY), typeof(PGMTerrain), new PropertyMetadata(null));
[DataMember]
[AggregateIniValueEntry]
public PGMTerrainXY SnowBiomeLocation
{
get { return (PGMTerrainXY)GetValue(SnowBiomeLocationProperty); }
set { SetValue(SnowBiomeLocationProperty, value); }
}
public static readonly DependencyProperty RedWoodForestBiomeLocationProperty = DependencyProperty.Register(nameof(RedWoodForestBiomeLocation), typeof(PGMTerrainXY), typeof(PGMTerrain), new PropertyMetadata(null));
[DataMember]
[AggregateIniValueEntry(Key = "RWForestBiomeLocation")]
public PGMTerrainXY RedWoodForestBiomeLocation
{
get { return (PGMTerrainXY)GetValue(RedWoodForestBiomeLocationProperty); }
set { SetValue(RedWoodForestBiomeLocationProperty, value); }
}
public static readonly DependencyProperty NorthRegion1StartProperty = DependencyProperty.Register(nameof(NorthRegion1Start), typeof(PGMTerrainXY), typeof(PGMTerrain), new PropertyMetadata(null));
[DataMember]
[AggregateIniValueEntry]
public PGMTerrainXY NorthRegion1Start
{
get { return (PGMTerrainXY)GetValue(NorthRegion1StartProperty); }
set { SetValue(NorthRegion1StartProperty, value); }
}
public static readonly DependencyProperty NorthRegion1EndProperty = DependencyProperty.Register(nameof(NorthRegion1End), typeof(PGMTerrainXY), typeof(PGMTerrain), new PropertyMetadata(null));
[DataMember]
[AggregateIniValueEntry]
public PGMTerrainXY NorthRegion1End
{
get { return (PGMTerrainXY)GetValue(NorthRegion1EndProperty); }
set { SetValue(NorthRegion1EndProperty, value); }
}
public static readonly DependencyProperty NorthRegion2StartProperty = DependencyProperty.Register(nameof(NorthRegion2Start), typeof(PGMTerrainXY), typeof(PGMTerrain), new PropertyMetadata(null));
[DataMember]
[AggregateIniValueEntry]
public PGMTerrainXY NorthRegion2Start
{
get { return (PGMTerrainXY)GetValue(NorthRegion2StartProperty); }
set { SetValue(NorthRegion2StartProperty, value); }
}
public static readonly DependencyProperty NorthRegion2EndProperty = DependencyProperty.Register(nameof(NorthRegion2End), typeof(PGMTerrainXY), typeof(PGMTerrain), new PropertyMetadata(null));
[DataMember]
[AggregateIniValueEntry]
public PGMTerrainXY NorthRegion2End
{
get { return (PGMTerrainXY)GetValue(NorthRegion2EndProperty); }
set { SetValue(NorthRegion2EndProperty, value); }
}
public static readonly DependencyProperty NorthRegion3StartProperty = DependencyProperty.Register(nameof(NorthRegion3Start), typeof(PGMTerrainXY), typeof(PGMTerrain), new PropertyMetadata(null));
[DataMember]
[AggregateIniValueEntry]
public PGMTerrainXY NorthRegion3Start
{
get { return (PGMTerrainXY)GetValue(NorthRegion3StartProperty); }
set { SetValue(NorthRegion3StartProperty, value); }
}
public static readonly DependencyProperty NorthRegion3EndProperty = DependencyProperty.Register(nameof(NorthRegion3End), typeof(PGMTerrainXY), typeof(PGMTerrain), new PropertyMetadata(null));
[DataMember]
[AggregateIniValueEntry]
public PGMTerrainXY NorthRegion3End
{
get { return (PGMTerrainXY)GetValue(NorthRegion3EndProperty); }
set { SetValue(NorthRegion3EndProperty, value); }
}
public static readonly DependencyProperty SouthRegion1StartProperty = DependencyProperty.Register(nameof(SouthRegion1Start), typeof(PGMTerrainXY), typeof(PGMTerrain), new PropertyMetadata(null));
[DataMember]
[AggregateIniValueEntry]
public PGMTerrainXY SouthRegion1Start
{
get { return (PGMTerrainXY)GetValue(SouthRegion1StartProperty); }
set { SetValue(SouthRegion1StartProperty, value); }
}
public static readonly DependencyProperty SouthRegion1EndProperty = DependencyProperty.Register(nameof(SouthRegion1End), typeof(PGMTerrainXY), typeof(PGMTerrain), new PropertyMetadata(null));
[DataMember]
[AggregateIniValueEntry]
public PGMTerrainXY SouthRegion1End
{
get { return (PGMTerrainXY)GetValue(SouthRegion1EndProperty); }
set { SetValue(SouthRegion1EndProperty, value); }
}
public static readonly DependencyProperty SouthRegion2StartProperty = DependencyProperty.Register(nameof(SouthRegion2Start), typeof(PGMTerrainXY), typeof(PGMTerrain), new PropertyMetadata(null));
[DataMember]
[AggregateIniValueEntry]
public PGMTerrainXY SouthRegion2Start
{
get { return (PGMTerrainXY)GetValue(SouthRegion2StartProperty); }
set { SetValue(SouthRegion2StartProperty, value); }
}
public static readonly DependencyProperty SouthRegion2EndProperty = DependencyProperty.Register(nameof(SouthRegion2End), typeof(PGMTerrainXY), typeof(PGMTerrain), new PropertyMetadata(null));
[DataMember]
[AggregateIniValueEntry]
public PGMTerrainXY SouthRegion2End
{
get { return (PGMTerrainXY)GetValue(SouthRegion2EndProperty); }
set { SetValue(SouthRegion2EndProperty, value); }
}
public static readonly DependencyProperty SouthRegion3StartProperty = DependencyProperty.Register(nameof(SouthRegion3Start), typeof(PGMTerrainXY), typeof(PGMTerrain), new PropertyMetadata(null));
[DataMember]
[AggregateIniValueEntry]
public PGMTerrainXY SouthRegion3Start
{
get { return (PGMTerrainXY)GetValue(SouthRegion3StartProperty); }
set { SetValue(SouthRegion3StartProperty, value); }
}
public static readonly DependencyProperty SouthRegion3EndProperty = DependencyProperty.Register(nameof(SouthRegion3End), typeof(PGMTerrainXY), typeof(PGMTerrain), new PropertyMetadata(null));
[DataMember]
[AggregateIniValueEntry]
public PGMTerrainXY SouthRegion3End
{
get { return (PGMTerrainXY)GetValue(SouthRegion3EndProperty); }
set { SetValue(SouthRegion3EndProperty, value); }
}
public static readonly DependencyProperty EastRegion1StartProperty = DependencyProperty.Register(nameof(EastRegion1Start), typeof(PGMTerrainXY), typeof(PGMTerrain), new PropertyMetadata(null));
[DataMember]
[AggregateIniValueEntry]
public PGMTerrainXY EastRegion1Start
{
get { return (PGMTerrainXY)GetValue(EastRegion1StartProperty); }
set { SetValue(EastRegion1StartProperty, value); }
}
public static readonly DependencyProperty EastRegion1EndProperty = DependencyProperty.Register(nameof(EastRegion1End), typeof(PGMTerrainXY), typeof(PGMTerrain), new PropertyMetadata(null));
[DataMember]
[AggregateIniValueEntry]
public PGMTerrainXY EastRegion1End
{
get { return (PGMTerrainXY)GetValue(EastRegion1EndProperty); }
set { SetValue(EastRegion1EndProperty, value); }
}
public static readonly DependencyProperty EastRegion2StartProperty = DependencyProperty.Register(nameof(EastRegion2Start), typeof(PGMTerrainXY), typeof(PGMTerrain), new PropertyMetadata(null));
[DataMember]
[AggregateIniValueEntry]
public PGMTerrainXY EastRegion2Start
{
get { return (PGMTerrainXY)GetValue(EastRegion2StartProperty); }
set { SetValue(EastRegion2StartProperty, value); }
}
public static readonly DependencyProperty EastRegion2EndProperty = DependencyProperty.Register(nameof(EastRegion2End), typeof(PGMTerrainXY), typeof(PGMTerrain), new PropertyMetadata(null));
[DataMember]
[AggregateIniValueEntry]
public PGMTerrainXY EastRegion2End
{
get { return (PGMTerrainXY)GetValue(EastRegion2EndProperty); }
set { SetValue(EastRegion2EndProperty, value); }
}
public static readonly DependencyProperty EastRegion3StartProperty = DependencyProperty.Register(nameof(EastRegion3Start), typeof(PGMTerrainXY), typeof(PGMTerrain), new PropertyMetadata(null));
[DataMember]
[AggregateIniValueEntry]
public PGMTerrainXY EastRegion3Start
{
get { return (PGMTerrainXY)GetValue(EastRegion3StartProperty); }
set { SetValue(EastRegion3StartProperty, value); }
}
public static readonly DependencyProperty EastRegion3EndProperty = DependencyProperty.Register(nameof(EastRegion3End), typeof(PGMTerrainXY), typeof(PGMTerrain), new PropertyMetadata(null));
[DataMember]
[AggregateIniValueEntry]
public PGMTerrainXY EastRegion3End
{
get { return (PGMTerrainXY)GetValue(EastRegion3EndProperty); }
set { SetValue(EastRegion3EndProperty, value); }
}
public static readonly DependencyProperty WestRegion1StartProperty = DependencyProperty.Register(nameof(WestRegion1Start), typeof(PGMTerrainXY), typeof(PGMTerrain), new PropertyMetadata(null));
[DataMember]
[AggregateIniValueEntry]
public PGMTerrainXY WestRegion1Start
{
get { return (PGMTerrainXY)GetValue(WestRegion1StartProperty); }
set { SetValue(WestRegion1StartProperty, value); }
}
public static readonly DependencyProperty WestRegion1EndProperty = DependencyProperty.Register(nameof(WestRegion1End), typeof(PGMTerrainXY), typeof(PGMTerrain), new PropertyMetadata(null));
[DataMember]
[AggregateIniValueEntry]
public PGMTerrainXY WestRegion1End
{
get { return (PGMTerrainXY)GetValue(WestRegion1EndProperty); }
set { SetValue(WestRegion1EndProperty, value); }
}
public static readonly DependencyProperty WestRegion2StartProperty = DependencyProperty.Register(nameof(WestRegion2Start), typeof(PGMTerrainXY), typeof(PGMTerrain), new PropertyMetadata(null));
[DataMember]
[AggregateIniValueEntry]
public PGMTerrainXY WestRegion2Start
{
get { return (PGMTerrainXY)GetValue(WestRegion2StartProperty); }
set { SetValue(WestRegion2StartProperty, value); }
}
public static readonly DependencyProperty WestRegion2EndProperty = DependencyProperty.Register(nameof(WestRegion2End), typeof(PGMTerrainXY), typeof(PGMTerrain), new PropertyMetadata(null));
[DataMember]
[AggregateIniValueEntry]
public PGMTerrainXY WestRegion2End
{
get { return (PGMTerrainXY)GetValue(WestRegion2EndProperty); }
set { SetValue(WestRegion2EndProperty, value); }
}
public static readonly DependencyProperty WestRegion3StartProperty = DependencyProperty.Register(nameof(WestRegion3Start), typeof(PGMTerrainXY), typeof(PGMTerrain), new PropertyMetadata(null));
[DataMember]
[AggregateIniValueEntry]
public PGMTerrainXY WestRegion3Start
{
get { return (PGMTerrainXY)GetValue(WestRegion3StartProperty); }
set { SetValue(WestRegion3StartProperty, value); }
}
public static readonly DependencyProperty WestRegion3EndProperty = DependencyProperty.Register(nameof(WestRegion3End), typeof(PGMTerrainXY), typeof(PGMTerrain), new PropertyMetadata(null));
[DataMember]
[AggregateIniValueEntry]
public PGMTerrainXY WestRegion3End
{
get { return (PGMTerrainXY)GetValue(WestRegion3EndProperty); }
set { SetValue(WestRegion3EndProperty, value); }
}
public static readonly DependencyProperty TerrainScaleMultiplierProperty = DependencyProperty.Register(nameof(TerrainScaleMultiplier), typeof(PGMTerrainXYZ), typeof(PGMTerrain), new PropertyMetadata(null));
[DataMember]
[AggregateIniValueEntry]
public PGMTerrainXYZ TerrainScaleMultiplier
{
get { return (PGMTerrainXYZ)GetValue(TerrainScaleMultiplierProperty); }
set { SetValue(TerrainScaleMultiplierProperty, value); }
}
public override string GetSortKey()
{
return null;
}
public override bool IsEquivalent(AggregateIniValue other)
{
return false;
}
public override void InitializeFromINIValue(string value)
{
if (string.IsNullOrWhiteSpace(value))
return;
GetPropertyInfos();
if (this.Properties.Count == 0)
return;
value = value.Trim('(', ')', ' ');
var pairs = value.Split(DELIMITER);
foreach (var pair in pairs)
{
var kvPair = pair.Split(new[] { '=' }, 2);
if (kvPair.Length != 2)
continue;
var key = kvPair[0].Trim();
var val = kvPair[1].Trim();
var propInfo = this.Properties.FirstOrDefault(p => string.Equals(p.Name, key, StringComparison.OrdinalIgnoreCase));
if (propInfo != null)
StringUtils.SetPropertyValue(val, this, propInfo);
else
{
propInfo = this.Properties.FirstOrDefault(f => f.GetCustomAttributes(typeof(AggregateIniValueEntryAttribute), false).OfType<AggregateIniValueEntryAttribute>().Any(a => string.Equals(a.Key, key, StringComparison.OrdinalIgnoreCase)));
if (propInfo != null)
StringUtils.SetPropertyValue(val, this, propInfo);
}
}
}
public override string ToINIValue()
{
GetPropertyInfos();
if (this.Properties.Count == 0)
return string.Empty;
var result = new StringBuilder();
var delimiter = "";
foreach (var prop in this.Properties)
{
result.Append(delimiter);
var attr = prop.GetCustomAttributes(typeof(AggregateIniValueEntryAttribute), false).OfType<AggregateIniValueEntryAttribute>().FirstOrDefault();
var propName = string.IsNullOrWhiteSpace(attr?.Key) ? prop.Name : attr.Key;
var val = prop.GetValue(this);
var propValue = StringUtils.GetPropertyValue(val, prop);
result.Append($"{propName}={propValue}");
delimiter = DELIMITER.ToString();
}
return result.ToString();
}
}
[DataContract]
public class PGMTerrainXY : AggregateIniValue
{
public PGMTerrainXY()
{
}
public PGMTerrainXY(float x, float y)
{
X = x;
Y = y;
}
public static readonly DependencyProperty XProperty = DependencyProperty.Register(nameof(X), typeof(float), typeof(PGMTerrainXY), new PropertyMetadata(1.0f));
[DataMember]
[AggregateIniValueEntry]
public float X
{
get { return (float)GetValue(XProperty); }
set { SetValue(XProperty, value); }
}
public static readonly DependencyProperty YProperty = DependencyProperty.Register(nameof(Y), typeof(float), typeof(PGMTerrainXY), new PropertyMetadata(1.0f));
[DataMember]
[AggregateIniValueEntry]
public float Y
{
get { return (float)GetValue(YProperty); }
set { SetValue(YProperty, value); }
}
public override string GetSortKey()
{
return null;
}
public override bool IsEquivalent(AggregateIniValue other)
{
return false;
}
public override void InitializeFromINIValue(string value)
{
if (string.IsNullOrWhiteSpace(value))
return;
GetPropertyInfos();
if (this.Properties.Count == 0)
return;
value = value.Trim('(', ')', ' ');
var pairs = value.Split(DELIMITER);
foreach (var pair in pairs)
{
var kvPair = pair.Split(new[] { '=' }, 2);
if (kvPair.Length != 2)
continue;
var key = kvPair[0].Trim();
var val = kvPair[1].Trim();
var propInfo = this.Properties.FirstOrDefault(p => string.Equals(p.Name, key, StringComparison.OrdinalIgnoreCase));
if (propInfo != null)
StringUtils.SetPropertyValue(val, this, propInfo);
else
{
propInfo = this.Properties.FirstOrDefault(f => f.GetCustomAttributes(typeof(AggregateIniValueEntryAttribute), false).OfType<AggregateIniValueEntryAttribute>().Any(a => string.Equals(a.Key, key, StringComparison.OrdinalIgnoreCase)));
if (propInfo != null)
StringUtils.SetPropertyValue(val, this, propInfo);
}
}
}
public override string ToINIValue()
{
GetPropertyInfos();
if (this.Properties.Count == 0)
return string.Empty;
var result = new StringBuilder();
result.Append("(");
var delimiter = "";
foreach (var prop in this.Properties.OrderBy(p => p.Name))
{
result.Append(delimiter);
var attr = prop.GetCustomAttributes(typeof(AggregateIniValueEntryAttribute), false).OfType<AggregateIniValueEntryAttribute>().FirstOrDefault();
var propName = string.IsNullOrWhiteSpace(attr?.Key) ? prop.Name : attr.Key;
var val = prop.GetValue(this);
var propValue = StringUtils.GetPropertyValue(val, prop);
result.Append($"{propName}={propValue}");
delimiter = DELIMITER.ToString();
}
result.Append(")");
return result.ToString();
}
}
[DataContract]
public class PGMTerrainXYZ : PGMTerrainXY
{
public PGMTerrainXYZ()
{
}
public PGMTerrainXYZ(float x, float y, float z)
: base(x, y)
{
Z = z;
}
public static readonly DependencyProperty ZProperty = DependencyProperty.Register(nameof(Z), typeof(float), typeof(PGMTerrainXYZ), new PropertyMetadata(1.0f));
[DataMember]
[AggregateIniValueEntry]
public float Z
{
get { return (float)GetValue(ZProperty); }
set { SetValue(ZProperty, value); }
}
}
}

View file

@ -0,0 +1,33 @@
using System.Windows;
namespace ServerManagerTool.Lib
{
public class PlayerListParameters : DependencyObject
{
public static readonly DependencyProperty ProfileNameProperty = DependencyProperty.Register(nameof(ProfileName), typeof(string), typeof(PlayerListParameters), new PropertyMetadata(string.Empty));
public string ProfileName
{
get { return (string)GetValue(ProfileNameProperty); }
set { SetValue(ProfileNameProperty, value); }
}
public string ProfileId { get; set; }
public string InstallDirectory { get; set; }
public string AltSaveDirectoryName { get; set; }
public bool PGM_Enabled { get; set; }
public string PGM_Name { get; set; }
public Server Server { get; set; }
public string ServerMap { get; set; }
public Rect WindowExtents { get; set; }
public string WindowTitle { get; set; }
}
}

View file

@ -0,0 +1,503 @@
using ServerManagerTool.Common.Model;
using ServerManagerTool.Utils;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using WPFSharp.Globalizer;
namespace ServerManagerTool.Lib.Model
{
public class ModDetailList : ObservableCollection<ModDetail>
{
public bool AnyUnknownModTypes
{
get
{
return this.Any(m => !m.IsValidModType);
}
}
public new void Add(ModDetail mod)
{
if (mod == null || this.Any(m => m.ModId.Equals(mod.ModId)))
return;
base.Add(mod);
SetPublishedFileIndex();
}
public void AddRange(ModDetail[] mods)
{
foreach (var mod in mods)
{
if (mod == null || this.Any(m => m.ModId.Equals(mod.ModId)))
continue;
base.Add(mod);
}
SetPublishedFileIndex();
}
public new void Insert(int index, ModDetail mod)
{
if (mod == null || this.Any(m => m.ModId.Equals(mod.ModId)))
return;
base.Insert(index, mod);
SetPublishedFileIndex();
}
public void Move(ModDetail mod, int newIndex)
{
if (mod == null)
return;
var index = base.IndexOf(mod);
if (index <= 0)
return;
base.Move(index, newIndex);
SetPublishedFileIndex();
}
public void MoveDown(ModDetail mod)
{
if (mod == null)
return;
var index = base.IndexOf(mod);
if (index >= base.Count - 1)
return;
base.Move(index, index + 1);
SetPublishedFileIndex();
}
public void MoveUp(ModDetail mod)
{
if (mod == null)
return;
var index = base.IndexOf(mod);
if (index <= 0)
return;
base.Move(index, index - 1);
SetPublishedFileIndex();
}
public void PopulateExtended(string modsRootFolder)
{
var results = new Dictionary<ModDetail, ModDetailExtended>();
foreach (var mod in this)
{
results.Add(mod, new ModDetailExtended(mod.ModId));
}
Parallel.ForEach(results, kvp => kvp.Value.PopulateExtended(modsRootFolder));
foreach (var kvp in results)
{
kvp.Key.PopulateExtended(kvp.Value);
}
}
public new bool Remove(ModDetail mod)
{
if (mod == null)
return false;
var removed = base.Remove(mod);
SetPublishedFileIndex();
return removed;
}
public void SetPublishedFileIndex()
{
foreach (var mod in this)
{
mod.Index = base.IndexOf(mod) + 1;
mod.IsFirst = false;
mod.IsLast = false;
}
if (this.Count == 0)
return;
this[0].IsFirst = true;
this[base.Count - 1].IsLast = true;
}
public bool GetModStrings(out string mapString, out string totalConversionString, out string modIdString)
{
mapString = null;
totalConversionString = null;
modIdString = string.Empty;
var delimiter = "";
foreach (var mod in this)
{
switch (mod.ModType)
{
case ModUtils.MODTYPE_MAP:
mapString = $"/Game/Mods/{mod.ModId}/{mod.MapName}";
break;
case ModUtils.MODTYPE_TOTCONV:
totalConversionString = mod.ModId;
break;
case ModUtils.MODTYPE_MAPEXT:
case ModUtils.MODTYPE_MOD:
default:
modIdString += $"{delimiter}{mod.ModId}";
delimiter = ",";
break;
}
}
return true;
}
public static ModDetailList GetModDetails(List<string> modIdList, string modsRootFolder, WorkshopFileList workshopFiles, PublishedFileDetailsResponse response)
{
var result = new ModDetailList();
if (modIdList != null)
{
foreach (var modId in modIdList)
{
var temp = workshopFiles?.FirstOrDefault(w => w.WorkshopId.Equals(modId));
result.Add(new ModDetail()
{
AppId = temp?.AppId ?? string.Empty,
ModId = modId,
TimeUpdated = -1,
Title = temp?.Title ?? "Mod name not available",
IsValid = false,
});
}
}
if (response?.publishedfiledetails != null)
{
foreach (var item in result)
{
var temp = response.publishedfiledetails.FirstOrDefault(w => w.publishedfileid.Equals(item.ModId));
if (temp != null)
{
item.AppId = temp?.creator_app_id ?? string.Empty;
item.ModId = temp?.publishedfileid ?? item.ModId;
item.TimeUpdated = temp?.time_updated ?? item.TimeUpdated;
item.Title = temp?.title ?? item.Title;
item.IsValid = temp?.creator_app_id != null;
}
}
}
result.SetPublishedFileIndex();
result.PopulateExtended(modsRootFolder);
return result;
}
public override string ToString()
{
return $"{nameof(ModDetailList)} - {Count}";
}
}
public class ModDetail : DependencyObject
{
private readonly GlobalizedApplication _globalizer = GlobalizedApplication.Instance;
public static readonly DependencyProperty AppIdProperty = DependencyProperty.Register(nameof(AppId), typeof(string), typeof(ModDetail), new PropertyMetadata(string.Empty));
public static readonly DependencyProperty IndexProperty = DependencyProperty.Register(nameof(Index), typeof(int), typeof(ModDetail), new PropertyMetadata(0));
public static readonly DependencyProperty IsFirstProperty = DependencyProperty.Register(nameof(IsFirst), typeof(bool), typeof(ModDetail), new PropertyMetadata(false));
public static readonly DependencyProperty IsLastProperty = DependencyProperty.Register(nameof(IsLast), typeof(bool), typeof(ModDetail), new PropertyMetadata(false));
public static readonly DependencyProperty LastWriteTimeProperty = DependencyProperty.Register(nameof(LastWriteTime), typeof(DateTime), typeof(ModDetail), new PropertyMetadata(DateTime.MinValue));
public static readonly DependencyProperty LastTimeUpdatedProperty = DependencyProperty.Register(nameof(LastTimeUpdated), typeof(int), typeof(ModDetail), new PropertyMetadata(0));
public static readonly DependencyProperty ModIdProperty = DependencyProperty.Register(nameof(ModId), typeof(string), typeof(ModDetail), new PropertyMetadata(string.Empty));
public static readonly DependencyProperty ModTypeProperty = DependencyProperty.Register(nameof(ModType), typeof(string), typeof(ModDetail), new PropertyMetadata(ModUtils.MODTYPE_UNKNOWN));
public static readonly DependencyProperty ModTypeStringProperty = DependencyProperty.Register(nameof(ModTypeString), typeof(string), typeof(ModDetail), new PropertyMetadata(string.Empty));
public static readonly DependencyProperty ModUrlProperty = DependencyProperty.Register(nameof(ModUrl), typeof(string), typeof(ModDetail), new PropertyMetadata(string.Empty));
public static readonly DependencyProperty TimeUpdatedProperty = DependencyProperty.Register(nameof(TimeUpdated), typeof(int), typeof(ModDetail), new PropertyMetadata(0));
public static readonly DependencyProperty TitleProperty = DependencyProperty.Register(nameof(Title), typeof(string), typeof(ModDetail), new PropertyMetadata(string.Empty));
public static readonly DependencyProperty IsValidProperty = DependencyProperty.Register(nameof(IsValid), typeof(bool), typeof(ModDetail), new PropertyMetadata(false));
public string AppId
{
get { return (string)GetValue(AppIdProperty); }
set { SetValue(AppIdProperty, value); }
}
public int Index
{
get { return (int)GetValue(IndexProperty); }
set { SetValue(IndexProperty, value); }
}
public bool IsFirst
{
get { return (bool)GetValue(IsFirstProperty); }
set { SetValue(IsFirstProperty, value); }
}
public bool IsLast
{
get { return (bool)GetValue(IsLastProperty); }
set { SetValue(IsLastProperty, value); }
}
public DateTime LastWriteTime
{
get { return (DateTime)GetValue(LastWriteTimeProperty); }
set { SetValue(LastWriteTimeProperty, value); }
}
public int LastTimeUpdated
{
get { return (int)GetValue(LastTimeUpdatedProperty); }
set { SetValue(LastTimeUpdatedProperty, value); }
}
public string ModId
{
get { return (string)GetValue(ModIdProperty); }
set { SetValue(ModIdProperty, value); }
}
public string ModType
{
get { return (string)GetValue(ModTypeProperty); }
set
{
SetValue(ModTypeProperty, value);
SetModTypeString();
}
}
public string ModTypeString
{
get { return (string)GetValue(ModTypeStringProperty); }
set { SetValue(ModTypeStringProperty, value); }
}
public int TimeUpdated
{
get { return (int)GetValue(TimeUpdatedProperty); }
set { SetValue(TimeUpdatedProperty, value); }
}
public string Title
{
get { return (string)GetValue(TitleProperty); }
set
{
SetValue(TitleProperty, value);
TitleFilterString = value?.ToLower();
}
}
public bool IsValid
{
get { return (bool)GetValue(IsValidProperty); }
set { SetValue(IsValidProperty, value); }
}
public bool IsOfficialMod => ModUtils.IsOfficialMod(ModId);
public bool IsValidModType => !string.IsNullOrWhiteSpace(ModType) && (ModType.Equals(ModUtils.MODTYPE_MAP) || ModType.Equals(ModUtils.MODTYPE_MAPEXT) || ModType.Equals(ModUtils.MODTYPE_MOD) || ModType.Equals(ModUtils.MODTYPE_TOTCONV));
public string LastWriteTimeString => LastWriteTime == DateTime.MinValue ? string.Empty : LastWriteTime.ToString();
public string LastWriteTimeSortString => LastWriteTime == DateTime.MinValue ? string.Empty : LastWriteTime.ToString("yyyyMMdd_HHmmss");
public string MapName { get; set; }
public string ModUrl => $"http://steamcommunity.com/sharedfiles/filedetails/?id={ModId}";
public string TimeUpdatedString => TimeUpdated <= 0 ? string.Empty : ModUtils.UnixTimeStampToDateTime(TimeUpdated).ToString();
public string TimeUpdatedSortString => TimeUpdated <= 0 ? string.Empty : ModUtils.UnixTimeStampToDateTime(TimeUpdated).ToString("yyyyMMdd_HHmmss");
public string TitleFilterString
{
get;
private set;
}
public bool UpToDate => !IsValid && TimeUpdated == -1 || LastTimeUpdated > 0 && LastTimeUpdated == TimeUpdated;
public long FolderSize { get; set; }
public string FolderSizeString
{
get
{
// GB
var divisor = Math.Pow(1024, 3);
if (FolderSize > divisor)
return $"{FolderSize / divisor:N2} GB";
// MB
divisor = Math.Pow(1024, 2);
if (FolderSize > divisor)
return $"{FolderSize / divisor:N2} MB";
// KB
divisor = Math.Pow(1024, 1);
if (FolderSize > divisor)
return $"{FolderSize / divisor:N2} KB";
return $"{FolderSize} B";
}
}
public void PopulateExtended(string modsRootFolder)
{
var modExtended = new ModDetailExtended(ModId);
modExtended.PopulateExtended(modsRootFolder);
PopulateExtended(modExtended);
}
public void PopulateExtended(ModDetailExtended extended)
{
LastTimeUpdated = extended.LastTimeUpdated;
LastWriteTime = extended.LastWriteTime;
MapName = extended.MapName;
ModType = extended.ModType;
FolderSize = extended.FolderSize;
}
public void SetModTypeString()
{
if (string.IsNullOrWhiteSpace(ModType))
ModTypeString = _globalizer.GetResourceString("ModType_Unknown");
switch (ModType)
{
case ModUtils.MODTYPE_MAP:
ModTypeString = _globalizer.GetResourceString("ModType_Map");
break;
case ModUtils.MODTYPE_MAPEXT:
ModTypeString = _globalizer.GetResourceString("ModType_MapExtension");
break;
case ModUtils.MODTYPE_MOD:
ModTypeString = _globalizer.GetResourceString("ModType_Mod");
break;
case ModUtils.MODTYPE_TOTCONV:
ModTypeString = _globalizer.GetResourceString("ModType_TotalConversion");
break;
default:
if (string.IsNullOrWhiteSpace(AppId))
ModTypeString = _globalizer.GetResourceString("ModType_Unknown");
else
ModTypeString = _globalizer.GetResourceString("ModType_NotDownloaded");
break;
}
}
public static ModDetail GetModDetail(PublishedFileDetail detail)
{
var result = new ModDetail();
result.AppId = detail.creator_app_id;
result.ModId = detail.publishedfileid;
result.TimeUpdated = detail.time_updated;
result.Title = detail.title;
result.IsValid = true;
return result;
}
public static ModDetail GetModDetail(WorkshopFileDetail detail)
{
var result = new ModDetail();
result.AppId = detail.creator_appid;
result.ModId = detail.publishedfileid;
result.TimeUpdated = detail.time_updated;
result.Title = detail.title;
result.IsValid = true;
return result;
}
public static ModDetail GetModDetail(WorkshopFileItem detail)
{
var result = new ModDetail();
result.AppId = detail.AppId;
result.ModId = detail.WorkshopId;
result.TimeUpdated = detail.TimeUpdated;
result.Title = detail.Title;
result.IsValid = true;
return result;
}
public override string ToString()
{
return $"{ModId} - {Title}";
}
}
public class ModDetailExtended
{
public ModDetailExtended(string modId)
{
ModId = modId;
}
public string MapName { get; set; }
private string ModId { get; set; }
public string ModType { get; set; }
public DateTime LastWriteTime { get; set; }
public int LastTimeUpdated { get; set; }
public long FolderSize { get; set; }
public void PopulateExtended(string modsRootFolder)
{
try
{
var modFolder = Path.Combine(modsRootFolder, ModId);
var modFile = $"{modFolder}.mod";
if (string.IsNullOrWhiteSpace(modFolder) || !Directory.Exists(modFolder))
return;
if (string.IsNullOrWhiteSpace(modFile) || !File.Exists(modFile))
return;
LastWriteTime = File.GetLastWriteTime(modFile);
var modTimeFile = Path.Combine(modFolder, Config.Default.LastUpdatedTimeFile);
if (!string.IsNullOrWhiteSpace(modTimeFile) && File.Exists(modTimeFile))
{
LastTimeUpdated = ModUtils.GetModLatestTime(modTimeFile);
}
ModUtils.ReadModFile(modFile, out string modId, out Dictionary<string, string> metaInformation, out List<string> mapNames);
ModType = metaInformation != null && metaInformation.ContainsKey("ModType") ? metaInformation["ModType"] : ModUtils.MODTYPE_UNKNOWN;
MapName = mapNames != null && mapNames.Count > 0 ? mapNames[0] : string.Empty;
FolderSize = 0;
foreach (var file in new DirectoryInfo(modFolder).GetFiles("*.*", SearchOption.AllDirectories))
{
FolderSize += file.Length;
}
}
catch (Exception)
{
// do nothing
}
}
}
}

View file

@ -0,0 +1,40 @@
using System.Net;
using System.Windows;
namespace ServerManagerTool.Lib
{
public class RCONParameters : PlayerListParameters
{
public static readonly DependencyProperty MaxPlayersProperty = DependencyProperty.Register(nameof(MaxPlayers), typeof(int), typeof(RCONParameters), new PropertyMetadata(0));
public string RCONHost { get; set; }
public IPAddress RCONHostIP
{
get
{
try
{
var ipAddresses = Dns.GetHostAddresses(RCONHost);
if (ipAddresses.Length > 0)
return ipAddresses[0].MapToIPv4();
}
catch {}
return IPAddress.None;
}
}
public int RCONPort { get; set; }
public string AdminPassword { get; set; }
public int MaxPlayers
{
get { return (int)GetValue(MaxPlayersProperty); }
set { SetValue(MaxPlayersProperty, value); }
}
public double PlayerListWidth { get; set; }
}
}

View file

@ -0,0 +1,105 @@
using ServerManagerTool.Common.Model;
using ServerManagerTool.Enums;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Windows;
namespace ServerManagerTool.Lib
{
[DataContract]
public class ResourceClassMultiplierList : AggregateIniValueList<ResourceClassMultiplier>
{
public ResourceClassMultiplierList(string aggregateValueName, Func<IEnumerable<ResourceClassMultiplier>> resetFunc)
: base(aggregateValueName, resetFunc)
{
}
public override void FromIniValues(IEnumerable<string> iniValues)
{
var items = iniValues?.Select(AggregateIniValue.FromINIValue<ResourceClassMultiplier>).ToArray();
Clear();
if (this._resetFunc != null)
this.AddRange(this._resetFunc());
var itemsToAdd = items.Where(i => !this.Any(r => r.IsEquivalent(i))).ToArray();
AddRange(itemsToAdd);
var itemsToUpdate = items.Where(i => this.Any(r => r.IsEquivalent(i))).ToArray();
foreach (var item in itemsToUpdate)
{
this.FirstOrDefault(r => r.IsEquivalent(item)).Multiplier = item.Multiplier;
}
IsEnabled = (items.Length > 0);
Sort(AggregateIniValue.SortKeySelector);
}
public override IEnumerable<string> ToIniValues()
{
if (string.IsNullOrWhiteSpace(IniCollectionKey))
return this.Where(d => d.ShouldSave()).Select(d => d.ToINIValue());
return this.Where(d => d.ShouldSave()).Select(d => $"{this.IniCollectionKey}={d.ToINIValue()}");
}
}
[DataContract]
public class ResourceClassMultiplier : ClassMultiplier
{
public static readonly DependencyProperty ModProperty = DependencyProperty.Register(nameof(Mod), typeof(string), typeof(ResourceClassMultiplier), new PropertyMetadata(String.Empty));
public static readonly DependencyProperty KnownResourceProperty = DependencyProperty.Register(nameof(KnownResource), typeof(bool), typeof(ResourceClassMultiplier), new PropertyMetadata(false));
[DataMember]
public string Mod
{
get { return (string)GetValue(ModProperty); }
set { SetValue(ModProperty, value); }
}
public bool KnownResource
{
get { return (bool)GetValue(KnownResourceProperty); }
set { SetValue(KnownResourceProperty, value); }
}
public override string DisplayName => GameData.FriendlyResourceNameForClass(ClassName);
public string DisplayMod => GameData.FriendlyNameForClass($"Mod_{Mod}", true) ?? Mod;
public new static ResourceClassMultiplier FromINIValue(string iniValue)
{
var newSpawn = new ResourceClassMultiplier();
newSpawn.InitializeFromINIValue(iniValue);
return newSpawn;
}
public override string GetSortKey()
{
return $"{DisplayName}|Mod";
}
public override void InitializeFromINIValue(string value)
{
base.InitializeFromINIValue(value);
if (!KnownResource)
Mod = GameData.MOD_UNKNOWN;
}
public override bool ShouldSave()
{
if (!KnownResource)
return true;
var resource = GameData.GetResourceMultiplierForClass(ClassName);
if (resource == null)
return true;
return (!resource.Multiplier.Equals(Multiplier));
}
}
}

View file

@ -0,0 +1,184 @@
using ServerManagerTool.Common.Attibutes;
using ServerManagerTool.Common.Model;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.Windows;
namespace ServerManagerTool.Lib
{
[DataContract]
public class StackSizeOverrideList : AggregateIniValueList<StackSizeOverride>
{
public StackSizeOverrideList(string aggregateValueName)
: base(aggregateValueName, null)
{
}
public string[] RenderToView()
{
List<string> errors = new List<string>();
foreach (var stackSize in this)
{
if (stackSize.Quantity != null)
{
stackSize.IgnoreMultiplier = stackSize.Quantity.IgnoreMultiplier;
stackSize.MaxItemQuantity = stackSize.Quantity.MaxItemQuantity;
}
}
return errors.ToArray();
}
public void RenderToModel()
{
foreach (var stackSize in this)
{
if (stackSize.Quantity != null)
{
stackSize.Quantity.IgnoreMultiplier = stackSize.IgnoreMultiplier;
stackSize.Quantity.MaxItemQuantity = stackSize.MaxItemQuantity;
}
}
}
public void UpdateForLocalization()
{
}
}
[DataContract]
public class StackSizeOverride : AggregateIniValue
{
public StackSizeOverride()
{
Quantity = new StackSizeQuantity();
}
public static readonly DependencyProperty ItemClassStringProperty = DependencyProperty.Register(nameof(ItemClassString), typeof(string), typeof(StackSizeOverride), new PropertyMetadata(string.Empty));
[DataMember]
[AggregateIniValueEntry]
public string ItemClassString
{
get { return (string)GetValue(ItemClassStringProperty); }
set { SetValue(ItemClassStringProperty, value); }
}
public static readonly DependencyProperty IgnoreMultiplierProperty = DependencyProperty.Register(nameof(IgnoreMultiplier), typeof(bool), typeof(StackSizeOverride), new PropertyMetadata(true));
public bool IgnoreMultiplier
{
get { return (bool)GetValue(IgnoreMultiplierProperty); }
set { SetValue(IgnoreMultiplierProperty, value); }
}
public static readonly DependencyProperty MaxItemQuantityProperty = DependencyProperty.Register(nameof(MaxItemQuantity), typeof(int), typeof(StackSizeOverride), new PropertyMetadata(1));
public int MaxItemQuantity
{
get { return (int)GetValue(MaxItemQuantityProperty); }
set { SetValue(MaxItemQuantityProperty, value); }
}
[DataMember]
[AggregateIniValueEntry]
public StackSizeQuantity Quantity
{
get;
set;
}
public override string GetSortKey()
{
return null;
}
public override bool IsEquivalent(AggregateIniValue other)
{
return false;
}
public override void InitializeFromINIValue(string value)
{
if (string.IsNullOrWhiteSpace(value))
return;
var kvPair = value.Split(new[] { '=' }, 2);
var kvValue = kvPair[1].Trim(' ');
if (kvValue.StartsWith("("))
kvValue = kvValue.Substring(1);
if (kvValue.EndsWith(")"))
kvValue = kvValue.Substring(0, kvValue.Length - 1);
base.FromComplexINIValue(kvValue);
if (Quantity != null)
{
IgnoreMultiplier = Quantity.IgnoreMultiplier;
MaxItemQuantity = Quantity.MaxItemQuantity;
}
}
public override string ToINIValue()
{
if (Quantity != null)
{
Quantity.IgnoreMultiplier = IgnoreMultiplier;
Quantity.MaxItemQuantity = MaxItemQuantity;
}
return base.ToComplexINIValue(true);
}
public string DisplayName => GameData.FriendlyItemNameForClass(ItemClassString);
public bool IsValid => !string.IsNullOrWhiteSpace(ItemClassString);
}
[DataContract]
public class StackSizeQuantity : AggregateIniValue
{
[DataMember]
[AggregateIniValueEntry]
public int MaxItemQuantity
{
get;
set;
}
[DataMember]
[AggregateIniValueEntry(Key = "bIgnoreMultiplier")]
public bool IgnoreMultiplier
{
get;
set;
}
public override string GetSortKey()
{
return null;
}
public override bool IsEquivalent(AggregateIniValue other)
{
return false;
}
public override void InitializeFromINIValue(string value)
{
if (string.IsNullOrWhiteSpace(value))
return;
var kvValue = value;
if (kvValue.StartsWith("("))
kvValue = kvValue.Substring(1);
if (kvValue.EndsWith(")"))
kvValue = kvValue.Substring(0, kvValue.Length - 1);
base.FromComplexINIValue(kvValue);
}
public override string ToINIValue()
{
return base.ToComplexINIValue(true);
}
}
}

View file

@ -0,0 +1,88 @@
using ServerManagerTool.Common.Model;
using System;
using System.Collections.Generic;
using System.Linq;
namespace ServerManagerTool.Lib.Model
{
public class StatsMultiplierArray : FloatIniValueArray
{
protected StatsMultiplierArray(string iniKeyName, Func<IEnumerable<float>> resetFunc, bool[] inclusions)
: base(iniKeyName, resetFunc)
{
Inclusions = inclusions;
}
public StatsMultiplierArray(string iniKeyName, Func<IEnumerable<float>> resetFunc, bool[] inclusions, bool onlyWriteNonDefaults)
: base(iniKeyName, resetFunc)
{
Inclusions = inclusions;
if (onlyWriteNonDefaults && resetFunc != null)
{
DefaultValues = new StatsMultiplierArray(iniKeyName, null, inclusions);
DefaultValues.AddRange(resetFunc());
}
}
public bool[] Inclusions { get; private set; } = null;
private StatsMultiplierArray DefaultValues { get; set; } = null;
public override void FromIniValues(IEnumerable<string> values)
{
this.Clear();
var list = new List<float>();
if (this.ResetFunc != null)
list.AddRange(this.ResetFunc());
foreach (var v in values)
{
var indexStart = v.IndexOf('[');
var indexEnd = v.IndexOf(']');
if (indexStart >= indexEnd)
{
// Invalid format
continue;
}
if (!int.TryParse(v.Substring(indexStart + 1, indexEnd - indexStart - 1), out int index))
{
// Invalid index
continue;
}
if (index >= list.Count)
{
// Unexpected size
continue;
}
list[index] = this.FromIniValue(v.Substring(v.IndexOf('=') + 1).Trim());
this.IsEnabled = true;
}
this.AddRange(list);
}
public override IEnumerable<string> ToIniValues()
{
var values = new List<string>();
for (var i = 0; i < this.Count; i++)
{
if (!(Inclusions?.ElementAtOrDefault(i) ?? true))
continue;
if (DefaultValues != null && Equals(DefaultValues[i], this[i]))
continue;
if (string.IsNullOrWhiteSpace(IniCollectionKey))
values.Add(this.ToIniValue(this[i]));
else
values.Add($"{this.IniCollectionKey}[{i}]={this.ToIniValue(this[i])}");
}
return values;
}
}
}

View file

@ -0,0 +1,34 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace ServerManagerTool.Lib
{
[DataContract]
public class StatsMultipliers
{
[DataMember]
public float Player
{
get;
set;
}
[DataMember]
public float WildDino
{
get;
set;
}
[DataMember]
public float TamedDino
{
get;
set;
}
}
}

View file

@ -0,0 +1,418 @@
using ServerManagerTool.Common.Attibutes;
using ServerManagerTool.Common.Model;
using ServerManagerTool.Lib.ViewModel;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Runtime.Serialization;
using System.Windows;
namespace ServerManagerTool.Lib
{
[DataContract]
public class SupplyCrateOverrideList : AggregateIniValueList<SupplyCrateOverride>
{
public SupplyCrateOverrideList(string aggregateValueName)
: base(aggregateValueName, null)
{
}
public string[] RenderToView()
{
List<string> errors = new List<string>();
foreach (var supplyCrate in this)
{
foreach (var itemSet in supplyCrate.ItemSets)
{
foreach (var itemEntry in itemSet.ItemEntries)
{
itemEntry.Items = new ObservableCollection<SupplyCrateItemEntrySettings>();
for (var index = 0; index < itemEntry.ItemClassStrings.Count; index++)
{
var itemsWeight = 0.0f;
if (index < itemEntry.ItemsWeights.Count)
itemsWeight = itemEntry.ItemsWeights[index];
else
errors.Add($"Missing Supply Crate Item Weight: Crate '{supplyCrate.SupplyCrateClassString}'; Set '{itemSet.SetName}'; Entry '{itemEntry.ItemEntryName}'; Item '{itemEntry.ItemClassStrings[index]}'.");
itemEntry.Items.Add(new SupplyCrateItemEntrySettings {
ItemClassString = itemEntry.ItemClassStrings[index],
ItemWeight = itemsWeight,
});
}
}
}
}
return errors.ToArray();
}
public void RenderToModel()
{
foreach (var supplyCrate in this)
{
foreach (var itemSet in supplyCrate.ItemSets)
{
foreach (var itemEntry in itemSet.ItemEntries)
{
itemEntry.ItemClassStrings = new StringIniValueList(null, null);
itemEntry.ItemsWeights = new FloatIniValueList(null, null);
foreach (var itemClass in itemEntry.Items)
{
itemEntry.ItemClassStrings.Add(itemClass.ItemClassString);
itemEntry.ItemsWeights.Add(itemClass.ItemWeight);
}
}
}
}
}
public void UpdateForLocalization()
{
}
}
[DataContract]
public class SupplyCrateOverride : AggregateIniValue
{
public SupplyCrateOverride()
{
ItemSets = new AggregateIniValueList<SupplyCrateItemSet>(null, null);
}
public static readonly DependencyProperty SupplyCrateClassStringProperty = DependencyProperty.Register(nameof(SupplyCrateClassString), typeof(string), typeof(SupplyCrateOverride), new PropertyMetadata(string.Empty));
[DataMember]
[AggregateIniValueEntry]
public string SupplyCrateClassString
{
get { return (string)GetValue(SupplyCrateClassStringProperty); }
set { SetValue(SupplyCrateClassStringProperty, value); }
}
public static readonly DependencyProperty MinItemSetsProperty = DependencyProperty.Register(nameof(MinItemSets), typeof(float), typeof(SupplyCrateOverride), new PropertyMetadata(1.0f));
[DataMember]
[AggregateIniValueEntry]
public float MinItemSets
{
get { return (float)GetValue(MinItemSetsProperty); }
set { SetValue(MinItemSetsProperty, value); }
}
public static readonly DependencyProperty MaxItemSetsProperty = DependencyProperty.Register(nameof(MaxItemSets), typeof(float), typeof(SupplyCrateOverride), new PropertyMetadata(1.0f));
[DataMember]
[AggregateIniValueEntry]
public float MaxItemSets
{
get { return (float)GetValue(MaxItemSetsProperty); }
set { SetValue(MaxItemSetsProperty, value); }
}
public static readonly DependencyProperty NumItemSetsPowerProperty = DependencyProperty.Register(nameof(NumItemSetsPower), typeof(float), typeof(SupplyCrateOverride), new PropertyMetadata(1.0f));
[DataMember]
[AggregateIniValueEntry]
public float NumItemSetsPower
{
get { return (float)GetValue(NumItemSetsPowerProperty); }
set { SetValue(NumItemSetsPowerProperty, value); }
}
public static readonly DependencyProperty SetsRandomWithoutReplacementProperty = DependencyProperty.Register(nameof(SetsRandomWithoutReplacement), typeof(bool), typeof(SupplyCrateOverride), new PropertyMetadata(true));
[DataMember]
[AggregateIniValueEntry(Key = "bSetsRandomWithoutReplacement")]
public bool SetsRandomWithoutReplacement
{
get { return (bool)GetValue(SetsRandomWithoutReplacementProperty); }
set { SetValue(SetsRandomWithoutReplacementProperty, value); }
}
public static readonly DependencyProperty AppendItemSetsProperty = DependencyProperty.Register(nameof(AppendItemSets), typeof(bool), typeof(SupplyCrateOverride), new PropertyMetadata(false));
[DataMember]
[AggregateIniValueEntry(Key = "bAppendItemSets", ExcludeIfFalse = true)]
public bool AppendItemSets
{
get { return (bool)GetValue(AppendItemSetsProperty); }
set { SetValue(AppendItemSetsProperty, value); }
}
public static readonly DependencyProperty AppendPreventIncreasingMinMaxItemSetsProperty = DependencyProperty.Register(nameof(AppendPreventIncreasingMinMaxItemSets), typeof(bool), typeof(SupplyCrateOverride), new PropertyMetadata(false));
[DataMember]
[AggregateIniValueEntry(Key = "bAppendPreventIncreasingMinMaxItemSets", ExcludeIfFalse = true)]
public bool AppendPreventIncreasingMinMaxItemSets
{
get { return (bool)GetValue(AppendPreventIncreasingMinMaxItemSetsProperty); }
set { SetValue(AppendPreventIncreasingMinMaxItemSetsProperty, value); }
}
public static readonly DependencyProperty ItemSetsProperty = DependencyProperty.Register(nameof(ItemSets), typeof(AggregateIniValueList<SupplyCrateItemSet>), typeof(SupplyCrateOverride), new PropertyMetadata(null));
[DataMember]
[AggregateIniValueEntry(ValueWithinBrackets = true, ListValueWithinBrackets = true, BracketsAroundValueDelimiter = 2)]
public AggregateIniValueList<SupplyCrateItemSet> ItemSets
{
get { return (AggregateIniValueList<SupplyCrateItemSet>)GetValue(ItemSetsProperty); }
set { SetValue(ItemSetsProperty, value); }
}
public override string GetSortKey()
{
return null;
}
public override bool IsEquivalent(AggregateIniValue other)
{
return false;
}
public override void InitializeFromINIValue(string value)
{
if (string.IsNullOrWhiteSpace(value))
return;
var kvPair = value.Split(new[] { '=' }, 2);
var kvValue = kvPair[1].Trim(' ');
if (kvValue.StartsWith("("))
kvValue = kvValue.Substring(1);
if (kvValue.EndsWith(")"))
kvValue = kvValue.Substring(0, kvValue.Length - 1);
base.FromComplexINIValue(kvValue);
}
public override string ToINIValue()
{
return base.ToComplexINIValue(true);
}
public string DisplayName => GameData.FriendlySupplyCrateNameForClass(SupplyCrateClassString);
public bool IsValid => !string.IsNullOrWhiteSpace(SupplyCrateClassString) && ItemSets.Count > 0;
}
[DataContract]
public class SupplyCrateItemSet : AggregateIniValue
{
public SupplyCrateItemSet()
{
ItemEntries = new AggregateIniValueList<SupplyCrateItemSetEntry>(null, null);
}
public static readonly DependencyProperty SetNameProperty = DependencyProperty.Register(nameof(SetName), typeof(string), typeof(SupplyCrateItemSet), new PropertyMetadata(string.Empty));
[DataMember]
[AggregateIniValueEntry(ExcludeIfEmpty = true)]
public string SetName
{
get { return (string)GetValue(SetNameProperty); }
set { SetValue(SetNameProperty, value); }
}
public static readonly DependencyProperty MinNumItemsProperty = DependencyProperty.Register(nameof(MinNumItems), typeof(float), typeof(SupplyCrateItemSet), new PropertyMetadata(1.0f));
[DataMember]
[AggregateIniValueEntry]
public float MinNumItems
{
get { return (float)GetValue(MinNumItemsProperty); }
set { SetValue(MinNumItemsProperty, value); }
}
public static readonly DependencyProperty MaxNumItemsProperty = DependencyProperty.Register(nameof(MaxNumItems), typeof(float), typeof(SupplyCrateItemSet), new PropertyMetadata(1.0f));
[DataMember]
[AggregateIniValueEntry]
public float MaxNumItems
{
get { return (float)GetValue(MaxNumItemsProperty); }
set { SetValue(MaxNumItemsProperty, value); }
}
public static readonly DependencyProperty NumItemsPowerProperty = DependencyProperty.Register(nameof(NumItemsPower), typeof(float), typeof(SupplyCrateItemSet), new PropertyMetadata(1.0f));
[DataMember]
[AggregateIniValueEntry]
public float NumItemsPower
{
get { return (float)GetValue(NumItemsPowerProperty); }
set { SetValue(NumItemsPowerProperty, value); }
}
public static readonly DependencyProperty SetWeightProperty = DependencyProperty.Register(nameof(SetWeight), typeof(float), typeof(SupplyCrateItemSet), new PropertyMetadata(1.0f));
[DataMember]
[AggregateIniValueEntry]
public float SetWeight
{
get { return (float)GetValue(SetWeightProperty); }
set { SetValue(SetWeightProperty, value); }
}
public static readonly DependencyProperty ItemsRandomWithoutReplacementProperty = DependencyProperty.Register(nameof(ItemsRandomWithoutReplacement), typeof(bool), typeof(SupplyCrateItemSet), new PropertyMetadata(true));
[DataMember]
[AggregateIniValueEntry(Key = "bItemsRandomWithoutReplacement")]
public bool ItemsRandomWithoutReplacement
{
get { return (bool)GetValue(ItemsRandomWithoutReplacementProperty); }
set { SetValue(ItemsRandomWithoutReplacementProperty, value); }
}
public static readonly DependencyProperty ItemEntriesProperty = DependencyProperty.Register(nameof(ItemEntries), typeof(AggregateIniValueList<SupplyCrateItemSetEntry>), typeof(SupplyCrateItemSet), new PropertyMetadata(null));
[DataMember]
[AggregateIniValueEntry(ValueWithinBrackets = true, ListValueWithinBrackets = true)]
public AggregateIniValueList<SupplyCrateItemSetEntry> ItemEntries
{
get { return (AggregateIniValueList<SupplyCrateItemSetEntry>)GetValue(ItemEntriesProperty); }
set { SetValue(ItemEntriesProperty, value); }
}
public override string GetSortKey()
{
return null;
}
public override bool IsEquivalent(AggregateIniValue other)
{
return false;
}
public override void InitializeFromINIValue(string value)
{
base.FromComplexINIValue(value);
}
public override string ToINIValue()
{
return base.ToComplexINIValue(false);
}
public bool IsValid => ItemEntries.Count > 0;
}
[DataContract]
public class SupplyCrateItemSetEntry : AggregateIniValue
{
public SupplyCrateItemSetEntry()
{
ItemClassStrings = new StringIniValueList(null, null);
ItemsWeights = new FloatIniValueList(null, null);
Items = new ObservableCollection<SupplyCrateItemEntrySettings>();
}
public static readonly DependencyProperty ItemEntryNameProperty = DependencyProperty.Register(nameof(ItemEntryName), typeof(string), typeof(SupplyCrateItemSetEntry), new PropertyMetadata(string.Empty));
[DataMember]
[AggregateIniValueEntry(ExcludeIfEmpty = true)]
public string ItemEntryName
{
get { return (string)GetValue(ItemEntryNameProperty); }
set { SetValue(ItemEntryNameProperty, value); }
}
public static readonly DependencyProperty EntryWeightProperty = DependencyProperty.Register(nameof(EntryWeight), typeof(float), typeof(SupplyCrateItemSetEntry), new PropertyMetadata(1.0f));
[DataMember]
[AggregateIniValueEntry]
public float EntryWeight
{
get { return (float)GetValue(EntryWeightProperty); }
set { SetValue(EntryWeightProperty, value); }
}
public static readonly DependencyProperty MinQuantityProperty = DependencyProperty.Register(nameof(MinQuantity), typeof(float), typeof(SupplyCrateItemSetEntry), new PropertyMetadata(1.0f));
[DataMember]
[AggregateIniValueEntry]
public float MinQuantity
{
get { return (float)GetValue(MinQuantityProperty); }
set { SetValue(MinQuantityProperty, value); }
}
public static readonly DependencyProperty MaxQuantityProperty = DependencyProperty.Register(nameof(MaxQuantity), typeof(float), typeof(SupplyCrateItemSetEntry), new PropertyMetadata(1.0f));
[DataMember]
[AggregateIniValueEntry]
public float MaxQuantity
{
get { return (float)GetValue(MaxQuantityProperty); }
set { SetValue(MaxQuantityProperty, value); }
}
public static readonly DependencyProperty MinQualityProperty = DependencyProperty.Register(nameof(MinQuality), typeof(float), typeof(SupplyCrateItemSetEntry), new PropertyMetadata(1.0f));
[DataMember]
[AggregateIniValueEntry]
public float MinQuality
{
get { return (float)GetValue(MinQualityProperty); }
set { SetValue(MinQualityProperty, value); }
}
public static readonly DependencyProperty MaxQualityProperty = DependencyProperty.Register(nameof(MaxQuality), typeof(float), typeof(SupplyCrateItemSetEntry), new PropertyMetadata(1.0f));
[DataMember]
[AggregateIniValueEntry]
public float MaxQuality
{
get { return (float)GetValue(MaxQualityProperty); }
set { SetValue(MaxQualityProperty, value); }
}
public static readonly DependencyProperty ForceBlueprintProperty = DependencyProperty.Register(nameof(ForceBlueprint), typeof(bool), typeof(SupplyCrateItemSetEntry), new PropertyMetadata(false));
[DataMember]
[AggregateIniValueEntry(Key = "bForceBlueprint")]
public bool ForceBlueprint
{
get { return (bool)GetValue(ForceBlueprintProperty); }
set { SetValue(ForceBlueprintProperty, value); }
}
public static readonly DependencyProperty ChanceToBeBlueprintOverrideProperty = DependencyProperty.Register(nameof(ChanceToBeBlueprintOverride), typeof(float), typeof(SupplyCrateItemSetEntry), new PropertyMetadata(0.0f));
[DataMember]
[AggregateIniValueEntry]
public float ChanceToBeBlueprintOverride
{
get { return (float)GetValue(ChanceToBeBlueprintOverrideProperty); }
set { SetValue(ChanceToBeBlueprintOverrideProperty, value); }
}
public static readonly DependencyProperty ItemClassStringsProperty = DependencyProperty.Register(nameof(ItemClassStrings), typeof(StringIniValueList), typeof(SupplyCrateItemSetEntry), new PropertyMetadata(null));
[DataMember]
[AggregateIniValueEntry(ValueWithinBrackets = true)]
public StringIniValueList ItemClassStrings
{
get { return (StringIniValueList)GetValue(ItemClassStringsProperty); }
set { SetValue(ItemClassStringsProperty, value); }
}
public static readonly DependencyProperty ItemsWeightsProperty = DependencyProperty.Register(nameof(ItemsWeights), typeof(FloatIniValueList), typeof(SupplyCrateItemSetEntry), new PropertyMetadata(null));
[DataMember]
[AggregateIniValueEntry(ValueWithinBrackets = true)]
public FloatIniValueList ItemsWeights
{
get { return (FloatIniValueList)GetValue(ItemsWeightsProperty); }
set { SetValue(ItemsWeightsProperty, value); }
}
public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register(nameof(Items), typeof(ObservableCollection<SupplyCrateItemEntrySettings>), typeof(SupplyCrateItemSetEntry), new PropertyMetadata(null));
public ObservableCollection<SupplyCrateItemEntrySettings> Items
{
get { return (ObservableCollection<SupplyCrateItemEntrySettings>)GetValue(ItemsProperty); }
set { SetValue(ItemsProperty, value); }
}
public override string GetSortKey()
{
return null;
}
public override bool IsEquivalent(AggregateIniValue other)
{
return false;
}
public override void InitializeFromINIValue(string value)
{
base.FromComplexINIValue(value);
}
public override string ToINIValue()
{
return base.ToComplexINIValue(false);
}
public bool IsModelValid => ItemClassStrings.Count > 0 && ItemClassStrings.Count == ItemsWeights.Count;
public bool IsViewValid => Items.Count > 0;
}
}