Crafting Override Changes

- added good, warning and bad icons to crafting override grids.
This commit is contained in:
Brett Hewitson 2022-06-15 22:33:59 +10:00
parent a5e1f78629
commit 9df02ec05e
6 changed files with 184 additions and 16 deletions

View file

@ -1,10 +1,46 @@
using ServerManagerTool.Common.Attibutes;
using ServerManagerTool.Common.Model;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Windows;
namespace ServerManagerTool.Lib
{
[DataContract]
public class CraftingOverrideList : AggregateIniValueList<CraftingOverride>
{
public CraftingOverrideList(string aggregateValueName)
: base(aggregateValueName, null)
{
}
public IEnumerable<string> RenderToView()
{
List<string> errors = new List<string>();
Update();
return errors;
}
public void RenderToModel()
{
}
public void UpdateForLocalization()
{
}
public void Update(bool recursive = true)
{
IsEnabled = this.Count > 0;
foreach (var craftingOverride in this)
craftingOverride.Update(recursive);
}
}
[DataContract]
public class CraftingOverride : AggregateIniValue
{
@ -44,7 +80,10 @@ namespace ServerManagerTool.Lib
public override void InitializeFromINIValue(string value)
{
if (string.IsNullOrWhiteSpace(value))
{
Update();
return;
}
var kvPair = value.Split(new[] { '=' }, 2);
var kvValue = kvPair[1].Trim(' ');
@ -64,6 +103,25 @@ namespace ServerManagerTool.Lib
public string DisplayName => GameData.FriendlyItemNameForClass(ItemClassString);
public bool IsValid => !string.IsNullOrWhiteSpace(ItemClassString) && BaseCraftingResourceRequirements.Count > 0;
public static readonly DependencyProperty ValidStatusProperty = DependencyProperty.Register(nameof(ValidStatus), typeof(string), typeof(CraftingOverride), new PropertyMetadata("N"));
public string ValidStatus
{
get { return (string)GetValue(ValidStatusProperty); }
set { SetValue(ValidStatusProperty, value); }
}
public void Update(bool recursive = true)
{
if (recursive && BaseCraftingResourceRequirements != null)
{
foreach (var resource in BaseCraftingResourceRequirements)
resource.Update();
}
ValidStatus = IsValid ? (BaseCraftingResourceRequirements.Any(i => i.ValidStatus == "N") ? "N" : (BaseCraftingResourceRequirements.Any(i => i.ValidStatus == "W") ? "W" : "Y")) : "N";
}
}
[DataContract]
@ -119,5 +177,18 @@ namespace ServerManagerTool.Lib
public string DisplayName => GameData.FriendlyItemNameForClass(ResourceItemTypeString);
public bool IsValid => !string.IsNullOrWhiteSpace(ResourceItemTypeString);
public static readonly DependencyProperty ValidStatusProperty = DependencyProperty.Register(nameof(ValidStatus), typeof(string), typeof(CraftingResourceRequirement), new PropertyMetadata("N"));
public string ValidStatus
{
get { return (string)GetValue(ValidStatusProperty); }
set { SetValue(ValidStatusProperty, value); }
}
public void Update()
{
ValidStatus = IsValid ? (GameData.HasItemForClass(ResourceItemTypeString) ? "Y" : "W") : "N";
}
}
}

View file

@ -93,7 +93,7 @@ namespace ServerManagerTool.Lib
this.EngramEntryAutoUnlocks = new EngramAutoUnlockList(nameof(EngramEntryAutoUnlocks));
this.EngramSettings = new EngramSettingsList(this.OverrideNamedEngramEntries, this.EngramEntryAutoUnlocks);
this.ConfigOverrideItemCraftingCosts = new AggregateIniValueList<CraftingOverride>(nameof(ConfigOverrideItemCraftingCosts), null);
this.ConfigOverrideItemCraftingCosts = new CraftingOverrideList(nameof(ConfigOverrideItemCraftingCosts));
this.ConfigOverrideItemMaxQuantity = new StackSizeOverrideList(nameof(ConfigOverrideItemMaxQuantity));
this.ConfigOverrideSupplyCrateItems = new SupplyCrateOverrideList(nameof(ConfigOverrideSupplyCrateItems));
this.PreventTransferForClassNames = new PreventTransferOverrideList(nameof(PreventTransferForClassNames));
@ -3128,11 +3128,11 @@ namespace ServerManagerTool.Lib
#endregion
#region Crafting Overrides
public static readonly DependencyProperty ConfigOverrideItemCraftingCostsProperty = DependencyProperty.Register(nameof(ConfigOverrideItemCraftingCosts), typeof(AggregateIniValueList<CraftingOverride>), typeof(ServerProfile), new PropertyMetadata(null));
public static readonly DependencyProperty ConfigOverrideItemCraftingCostsProperty = DependencyProperty.Register(nameof(ConfigOverrideItemCraftingCosts), typeof(CraftingOverrideList), typeof(ServerProfile), new PropertyMetadata(null));
[IniFileEntry(IniFiles.Game, IniSections.Game_ShooterGameMode, ServerProfileCategory.CraftingOverrides)]
public AggregateIniValueList<CraftingOverride> ConfigOverrideItemCraftingCosts
public CraftingOverrideList ConfigOverrideItemCraftingCosts
{
get { return (AggregateIniValueList<CraftingOverride>)GetValue(ConfigOverrideItemCraftingCostsProperty); }
get { return (CraftingOverrideList)GetValue(ConfigOverrideItemCraftingCostsProperty); }
set { SetValue(ConfigOverrideItemCraftingCostsProperty, value); }
}
#endregion
@ -4057,6 +4057,8 @@ namespace ServerManagerTool.Lib
profile.NPCSpawnSettings.RenderToView();
if (Config.Default.SectionSupplyCrateOverridesEnabled)
profile.ConfigOverrideSupplyCrateItems.RenderToView();
if (Config.Default.SectionCraftingOverridesEnabled)
profile.ConfigOverrideItemCraftingCosts.RenderToView();
if (Config.Default.SectionStackSizeOverridesEnabled)
profile.ConfigOverrideItemMaxQuantity.RenderToView();
if (Config.Default.SectionPreventTransferOverridesEnabled)
@ -4135,6 +4137,8 @@ namespace ServerManagerTool.Lib
profile.NPCSpawnSettings.RenderToView();
if (Config.Default.SectionSupplyCrateOverridesEnabled)
profile.ConfigOverrideSupplyCrateItems.RenderToView();
if (Config.Default.SectionCraftingOverridesEnabled)
profile.ConfigOverrideItemCraftingCosts.RenderToView();
if (Config.Default.SectionStackSizeOverridesEnabled)
profile.ConfigOverrideItemMaxQuantity.RenderToView();
if (Config.Default.SectionPreventTransferOverridesEnabled)
@ -4274,6 +4278,12 @@ namespace ServerManagerTool.Lib
this.ConfigOverrideSupplyCrateItems.RenderToModel();
}
if (Config.Default.SectionCraftingOverridesEnabled)
{
progressCallback?.Invoke(0, _globalizer.GetResourceString("ProfileSave_ConstructingCraftingOverridesInformation"));
this.ConfigOverrideItemCraftingCosts.RenderToModel();
}
if (Config.Default.SectionStackSizeOverridesEnabled)
{
progressCallback?.Invoke(0, _globalizer.GetResourceString("ProfileSave_ConstructingStackSizeInformation"));
@ -5312,7 +5322,7 @@ namespace ServerManagerTool.Lib
public void ResetCraftingOverridesSection()
{
this.ConfigOverrideItemCraftingCosts = new AggregateIniValueList<CraftingOverride>(nameof(ConfigOverrideItemCraftingCosts), null);
this.ConfigOverrideItemCraftingCosts = new CraftingOverrideList(nameof(ConfigOverrideItemCraftingCosts));
this.ConfigOverrideItemCraftingCosts.Reset();
}
@ -5939,9 +5949,12 @@ namespace ServerManagerTool.Lib
private void SyncCraftingOverridesSection(ServerProfile sourceProfile)
{
sourceProfile.ConfigOverrideItemCraftingCosts.RenderToModel();
this.ConfigOverrideItemCraftingCosts.Clear();
this.ConfigOverrideItemCraftingCosts.FromIniValues(sourceProfile.ConfigOverrideItemCraftingCosts.ToIniValues());
this.ConfigOverrideItemCraftingCosts.IsEnabled = this.ConfigOverrideItemCraftingCosts.Count > 0;
this.ConfigOverrideItemCraftingCosts.RenderToView();
}
private void SyncCustomEngineSettingsSection(ServerProfile sourceProfile)

View file

@ -4836,7 +4836,7 @@
</StackPanel>
</GroupBox.Header>
<DataGrid Name="CraftingOverrideItemGrid" ItemsSource="{Binding ConfigOverrideItemCraftingCosts}" SelectedItem="{Binding Path=SelectedCraftingOverride, ElementName=SettingsControl, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True}" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" CanUserReorderColumns="False" CanUserSortColumns="true" SelectionMode="Single" CanUserResizeRows="False" RowHeaderWidth="25">
<DataGrid Name="CraftingOverrideItemGrid" ItemsSource="{Binding ConfigOverrideItemCraftingCosts}" SelectedItem="{Binding Path=SelectedCraftingOverride, ElementName=SettingsControl, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True}" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" CanUserReorderColumns="False" CanUserSortColumns="true" SelectionMode="Single" CanUserResizeRows="False" RowHeaderWidth="25" SourceUpdated="CraftingOverrideGrids_SourceUpdated">
<DataGrid.Resources>
<Style TargetType="{x:Type DataGridRow}">
<Style.Resources>
@ -4853,6 +4853,28 @@
<SolidColorBrush Color="#FFB4B4B4"/>
</DataGrid.VerticalGridLinesBrush>
<DataGrid.RowHeaderTemplate>
<DataTemplate>
<Image HorizontalAlignment="Center" VerticalAlignment="Center" Width="16" Height="16">
<Image.Style>
<Style TargetType="{x:Type Image}">
<Style.Triggers>
<DataTrigger Binding="{Binding DataContext.ValidStatus, RelativeSource={RelativeSource AncestorType=DataGridRow}}" Value="Y">
<Setter Property="Source" Value="{com:Icon Path=/Ark Server Manager;component/Art/StatusGood.ico,Size=32}"/>
</DataTrigger>
<DataTrigger Binding="{Binding DataContext.ValidStatus, RelativeSource={RelativeSource AncestorType=DataGridRow}}" Value="N">
<Setter Property="Source" Value="{com:Icon Path=/Ark Server Manager;component/Art/StatusBad.ico,Size=32}"/>
</DataTrigger>
<DataTrigger Binding="{Binding DataContext.ValidStatus, RelativeSource={RelativeSource AncestorType=DataGridRow}}" Value="W">
<Setter Property="Source" Value="{com:Icon Path=/Ark Server Manager;component/Art/StatusWarning.ico,Size=32}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
</DataTemplate>
</DataGrid.RowHeaderTemplate>
<DataGrid.Columns>
<DataGridTemplateColumn Width="2*" CanUserSort="True" SortMemberPath="DisplayName">
<DataGridTemplateColumn.Header>
@ -4860,7 +4882,7 @@
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox IsEditable="True" ItemsSource="{Binding BasePrimalItemList, ElementName=SettingsControl}" SelectedValue="{Binding ItemClassString, Mode=TwoWay, UpdateSourceTrigger=Explicit}" SelectedValuePath="ValueMember" DisplayMemberPath="DisplayMember" LostFocus="ComboBoxItemList_LostFocus" PreviewMouseWheel="ComboBox_PreviewMouseWheel"/>
<ComboBox IsEditable="True" ItemsSource="{Binding BasePrimalItemList, ElementName=SettingsControl}" SelectedValue="{Binding ItemClassString, Mode=TwoWay, UpdateSourceTrigger=Explicit, NotifyOnSourceUpdated=True}" SelectedValuePath="ValueMember" DisplayMemberPath="DisplayMember" LostFocus="ComboBoxItemList_LostFocus" PreviewMouseWheel="ComboBox_PreviewMouseWheel"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
@ -4901,7 +4923,7 @@
</StackPanel>
</GroupBox.Header>
<DataGrid Name="CraftingOverrideResourceGrid" ItemsSource="{Binding Path=SelectedCraftingOverride.BaseCraftingResourceRequirements, ElementName=SettingsControl}" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" CanUserReorderColumns="False" CanUserSortColumns="true" SelectionMode="Single" CanUserResizeRows="False" RowHeaderWidth="25">
<DataGrid Name="CraftingOverrideResourceGrid" ItemsSource="{Binding Path=SelectedCraftingOverride.BaseCraftingResourceRequirements, ElementName=SettingsControl}" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" CanUserReorderColumns="False" CanUserSortColumns="true" SelectionMode="Single" CanUserResizeRows="False" RowHeaderWidth="25" SourceUpdated="CraftingOverrideGrids_SourceUpdated">
<DataGrid.Resources>
<Style TargetType="{x:Type DataGridRow}">
<Style.Resources>
@ -4918,6 +4940,28 @@
<SolidColorBrush Color="#FFB4B4B4"/>
</DataGrid.VerticalGridLinesBrush>
<DataGrid.RowHeaderTemplate>
<DataTemplate>
<Image HorizontalAlignment="Center" VerticalAlignment="Center" Width="16" Height="16">
<Image.Style>
<Style TargetType="{x:Type Image}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=DataContext.ValidStatus, RelativeSource={RelativeSource AncestorType=DataGridRow}}" Value="Y">
<Setter Property="Source" Value="{com:Icon Path=/Ark Server Manager;component/Art/StatusGood.ico,Size=32}"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=DataContext.ValidStatus, RelativeSource={RelativeSource AncestorType=DataGridRow}}" Value="N">
<Setter Property="Source" Value="{com:Icon Path=/Ark Server Manager;component/Art/StatusBad.ico,Size=32}"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=DataContext.ValidStatus, RelativeSource={RelativeSource AncestorType=DataGridRow}}" Value="W">
<Setter Property="Source" Value="{com:Icon Path=/Ark Server Manager;component/Art/StatusWarning.ico,Size=32}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
</DataTemplate>
</DataGrid.RowHeaderTemplate>
<DataGrid.Columns>
<DataGridTemplateColumn Width="2*" CanUserSort="True" SortMemberPath="DisplayName">
<DataGridTemplateColumn.Header>
@ -4925,12 +4969,12 @@
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox IsEditable="True" ItemsSource="{Binding BasePrimalItemList, ElementName=SettingsControl}" SelectedValue="{Binding ResourceItemTypeString, Mode=TwoWay, UpdateSourceTrigger=Explicit}" SelectedValuePath="ValueMember" DisplayMemberPath="DisplayMember" LostFocus="ComboBoxItemList_LostFocus" PreviewMouseWheel="ComboBox_PreviewMouseWheel"/>
<ComboBox IsEditable="True" ItemsSource="{Binding BasePrimalItemList, ElementName=SettingsControl}" SelectedValue="{Binding ResourceItemTypeString, Mode=TwoWay, UpdateSourceTrigger=Explicit, NotifyOnSourceUpdated=True}" SelectedValuePath="ValueMember" DisplayMemberPath="DisplayMember" LostFocus="ComboBoxItemList_LostFocus" PreviewMouseWheel="ComboBox_PreviewMouseWheel"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Width="100" Binding="{Binding BaseResourceRequirement}" ElementStyle="{StaticResource CenteredTextBlockStyle}" >
<DataGridTextColumn Width="100" Binding="{Binding BaseResourceRequirement, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True}" ElementStyle="{StaticResource CenteredTextBlockStyle}" >
<DataGridTextColumn.Header>
<TextBlock Text="{DynamicResource ServerSettings_CraftingOverrides_ResourceQuantityColumnLabel}" ToolTip="{DynamicResource ServerSettings_CraftingOverrides_ResourceQuantityColumnTooltip}" />
</DataGridTextColumn.Header>

View file

@ -1314,6 +1314,11 @@ namespace ServerManagerTool
Settings.ConfigOverrideSupplyCrateItems.Update();
}
private void CraftingOverrideGrids_SourceUpdated(object sender, DataTransferEventArgs e)
{
Settings.ConfigOverrideItemCraftingCosts.Update();
}
#region Dinos
private void DinoCustomization_Reset(object sender, RoutedEventArgs e)
{
@ -1749,7 +1754,7 @@ namespace ServerManagerTool
private void AddCraftingOverride_Click(object sender, RoutedEventArgs e)
{
Settings.ConfigOverrideItemCraftingCosts.Add(new CraftingOverride());
Settings.ConfigOverrideItemCraftingCosts.IsEnabled = true;
Settings.ConfigOverrideItemCraftingCosts.Update();
}
private void AddCraftingOverrideResource_Click(object sender, RoutedEventArgs e)
@ -1761,6 +1766,7 @@ namespace ServerManagerTool
}
SelectedCraftingOverride.BaseCraftingResourceRequirements.Add(new CraftingResourceRequirement());
Settings.ConfigOverrideItemCraftingCosts.Update();
}
private void ClearCraftingOverrides_Click(object sender, RoutedEventArgs e)
@ -1770,7 +1776,7 @@ namespace ServerManagerTool
SelectedCraftingOverride = null;
Settings.ConfigOverrideItemCraftingCosts.Clear();
Settings.ConfigOverrideItemCraftingCosts.IsEnabled = false;
Settings.ConfigOverrideItemCraftingCosts.Update();
}
private void ClearCraftingOverrideResources_Click(object sender, RoutedEventArgs e)
@ -1779,6 +1785,7 @@ namespace ServerManagerTool
return;
SelectedCraftingOverride?.BaseCraftingResourceRequirements.Clear();
Settings.ConfigOverrideItemCraftingCosts.Update();
}
private void PasteCraftingOverride_Click(object sender, RoutedEventArgs e)
@ -1794,6 +1801,8 @@ namespace ServerManagerTool
// read the pasted data into an ini file.
var iniFile = IniFileUtils.ReadString(window.ConfigData.Replace(" ", ""));
Server.Profile.ConfigOverrideItemCraftingCosts.RenderToModel();
// cycle through the sections, adding them to the engrams list. Will bypass any sections that are named as per the ARK default sections.
foreach (var section in iniFile.Sections.Where(s => s.SectionName != null && !SystemIniFile.IniSectionNames.ContainsValue(s.SectionName)))
{
@ -1803,6 +1812,8 @@ namespace ServerManagerTool
Server.Profile.ConfigOverrideItemCraftingCosts.IsEnabled |= configOverrideItemCraftingCosts.IsEnabled;
}
var errors = Server.Profile.ConfigOverrideItemCraftingCosts.RenderToView();
RefreshBasePrimalItemList();
}
@ -1813,7 +1824,7 @@ namespace ServerManagerTool
var item = ((CraftingOverride)((Button)e.Source).DataContext);
Settings.ConfigOverrideItemCraftingCosts.Remove(item);
Settings.ConfigOverrideItemCraftingCosts.IsEnabled = Settings.ConfigOverrideItemCraftingCosts.Count > 0;
Settings.ConfigOverrideItemCraftingCosts.Update();
}
private void RemoveCraftingOverrideResource_Click(object sender, RoutedEventArgs e)
@ -1826,10 +1837,13 @@ namespace ServerManagerTool
var item = ((CraftingResourceRequirement)((Button)e.Source).DataContext);
SelectedCraftingOverride.BaseCraftingResourceRequirements.Remove(item);
Settings.ConfigOverrideItemCraftingCosts.Update();
}
private void SaveCraftingOverride_Click(object sender, RoutedEventArgs e)
{
Settings.ConfigOverrideItemCraftingCosts.RenderToModel();
var iniValues = new List<string>();
iniValues.AddRange(Settings.ConfigOverrideItemCraftingCosts.ToIniValues());
var iniValue = string.Join("\r\n", iniValues);
@ -1848,6 +1862,8 @@ namespace ServerManagerTool
if (item == null)
return;
Settings.ConfigOverrideItemCraftingCosts.RenderToModel();
var iniName = Settings.ConfigOverrideItemCraftingCosts.IniCollectionKey;
var iniValue = $"{iniName}={item.ToINIValue()}";

View file

@ -9,8 +9,8 @@
<entry>
<id>urn:uuid:93A04A12-C632-4C2B-AC76-42D9E476431C</id>
<title>1.1.432 (1.1.432.1)</title>
<summary>1.1.432.1</summary>
<title>1.1.432 (1.1.432.3)</title>
<summary>1.1.432.3</summary>
<link href="" />
<updated>2022-06-13T00:00:00Z</updated>
<content type="xhtml">
@ -25,6 +25,7 @@
<br/>
<ul>
<li>Gamedata Files - changed the Fjordur official mod to the correct mod id.</li>
<li>Crafting Override Grids - Added new icons to show Good (green), Warning (orange) or Bad (red). Warnings will show for resources not familiar with (raw class names, not loaded via gamedata files), Errors will show for empty resources.</li>
</ul>
</p>
</div>

View file

@ -7,6 +7,29 @@
<link href="http://arkservermanager.freeforums.net/" />
<updated>2022-06-16T00:00:00Z</updated>
<entry>
<id>urn:uuid:93A04A12-C632-4C2B-AC76-42D9E476431C</id>
<title>1.1.432 (1.1.432.3)</title>
<summary>1.1.432.3</summary>
<link href="" />
<updated>2022-06-16T00:00:00Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml" style="font-family: Arial, Verdana, Helvetica, Sans-Serif;font-size: .8em;">
<p>
<u style="font-size: .9em;">CHANGE</u>
<br/>
<ul>
<li>Crafting Override Grids - Added new icons to show Good (green), Warning (orange) or Bad (red). Warnings will show for resources not familiar with (raw class names, not loaded via gamedata files), Errors will show for empty resources.</li>
</ul>
</p>
</div>
</content>
<author>
<name>bletch</name>
<email>bletch1971@hotmail.com</email>
</author>
</entry>
<entry>
<id>urn:uuid:93A04A12-C632-4C2B-AC76-42D9E476431C</id>
<title>1.1.432 (1.1.432.2)</title>