mirror of
https://github.com/tribufu/ServerManagers
synced 2026-05-06 15:17:34 +00:00
source code checkin
This commit is contained in:
parent
5f8fb2c825
commit
7e57b72e35
675 changed files with 168433 additions and 0 deletions
46
src/ARKServerManager/Lib/Model/ClassMultiplier.cs
Normal file
46
src/ARKServerManager/Lib/Model/ClassMultiplier.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
123
src/ARKServerManager/Lib/Model/CraftingOverride.cs
Normal file
123
src/ARKServerManager/Lib/Model/CraftingOverride.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
101
src/ARKServerManager/Lib/Model/DinoSpawn.cs
Normal file
101
src/ARKServerManager/Lib/Model/DinoSpawn.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
91
src/ARKServerManager/Lib/Model/EngramAutoUnlock.cs
Normal file
91
src/ARKServerManager/Lib/Model/EngramAutoUnlock.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
128
src/ARKServerManager/Lib/Model/EngramEntry.cs
Normal file
128
src/ARKServerManager/Lib/Model/EngramEntry.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
260
src/ARKServerManager/Lib/Model/Level.cs
Normal file
260
src/ARKServerManager/Lib/Model/Level.cs
Normal 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 };
|
||||
}
|
||||
}
|
||||
}
|
||||
53
src/ARKServerManager/Lib/Model/NPCReplacement.cs
Normal file
53
src/ARKServerManager/Lib/Model/NPCReplacement.cs
Normal 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));
|
||||
}
|
||||
}
|
||||
}
|
||||
509
src/ARKServerManager/Lib/Model/NPCSpawner.cs
Normal file
509
src/ARKServerManager/Lib/Model/NPCSpawner.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
855
src/ARKServerManager/Lib/Model/PGMTerrain.cs
Normal file
855
src/ARKServerManager/Lib/Model/PGMTerrain.cs
Normal 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); }
|
||||
}
|
||||
}
|
||||
}
|
||||
33
src/ARKServerManager/Lib/Model/PlayerListParameters.cs
Normal file
33
src/ARKServerManager/Lib/Model/PlayerListParameters.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
503
src/ARKServerManager/Lib/Model/PublishedFileDetail.cs
Normal file
503
src/ARKServerManager/Lib/Model/PublishedFileDetail.cs
Normal 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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
40
src/ARKServerManager/Lib/Model/RCONParameters.cs
Normal file
40
src/ARKServerManager/Lib/Model/RCONParameters.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
105
src/ARKServerManager/Lib/Model/ResourceClassMultiplier.cs
Normal file
105
src/ARKServerManager/Lib/Model/ResourceClassMultiplier.cs
Normal 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));
|
||||
}
|
||||
}
|
||||
}
|
||||
184
src/ARKServerManager/Lib/Model/StackSizeOverride.cs
Normal file
184
src/ARKServerManager/Lib/Model/StackSizeOverride.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
88
src/ARKServerManager/Lib/Model/StatsMultiplierArray.cs
Normal file
88
src/ARKServerManager/Lib/Model/StatsMultiplierArray.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
34
src/ARKServerManager/Lib/Model/StatsMultipliers.cs
Normal file
34
src/ARKServerManager/Lib/Model/StatsMultipliers.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
418
src/ARKServerManager/Lib/Model/SupplyCrateOverride.cs
Normal file
418
src/ARKServerManager/Lib/Model/SupplyCrateOverride.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue