From c2eca0e63cd4860fcb57ae522c56bb9a9fc3edf1 Mon Sep 17 00:00:00 2001 From: Aaron Date: Sat, 25 Feb 2023 11:06:37 +0100 Subject: [PATCH 1/8] Set TabControlSelectedIndex in item window --- src/StatisticsAnalysisTool/ViewModels/ItemWindowViewModel.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/StatisticsAnalysisTool/ViewModels/ItemWindowViewModel.cs b/src/StatisticsAnalysisTool/ViewModels/ItemWindowViewModel.cs index d17a78101..4820117ff 100644 --- a/src/StatisticsAnalysisTool/ViewModels/ItemWindowViewModel.cs +++ b/src/StatisticsAnalysisTool/ViewModels/ItemWindowViewModel.cs @@ -109,6 +109,7 @@ private async Task InitAsync(Item item) Icon = null; TitleName = "-"; ItemTierLevel = string.Empty; + TabControlSelectedIndex = 0; Item = item; From df032e944fdf67eca575fbd3b0be3583f055a1f0 Mon Sep 17 00:00:00 2001 From: Aaron Date: Sat, 25 Feb 2023 11:19:08 +0100 Subject: [PATCH 2/8] Fixed BuyPriceMaxDate in item window main tab --- src/StatisticsAnalysisTool/Models/ItemPricesObject.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/StatisticsAnalysisTool/Models/ItemPricesObject.cs b/src/StatisticsAnalysisTool/Models/ItemPricesObject.cs index ca03a01cd..3280fcfc4 100644 --- a/src/StatisticsAnalysisTool/Models/ItemPricesObject.cs +++ b/src/StatisticsAnalysisTool/Models/ItemPricesObject.cs @@ -236,6 +236,9 @@ public DateTime BuyPriceMaxDate set { _buyPriceMaxDate = value; + BuyPriceMaxDateStatus = value.GetValueTimeStatus(); + BuyPriceMaxDateString = value.CurrentDateTimeFormat(); + BuyPriceMaxDateLastUpdateTime = value.DateTimeToLastUpdateTime(); OnPropertyChanged(); } } From c79e8c677f18a779d48b71c0d2fc8b8c0b6e6f29 Mon Sep 17 00:00:00 2001 From: Aaron Date: Sat, 25 Feb 2023 11:47:30 +0100 Subject: [PATCH 3/8] Fixed slow translation loading in main window --- src/StatisticsAnalysisTool/Common/HttpClientUtils.cs | 2 +- .../ViewModels/MainWindowViewModel.cs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/StatisticsAnalysisTool/Common/HttpClientUtils.cs b/src/StatisticsAnalysisTool/Common/HttpClientUtils.cs index ae45bba86..a15e5eb55 100644 --- a/src/StatisticsAnalysisTool/Common/HttpClientUtils.cs +++ b/src/StatisticsAnalysisTool/Common/HttpClientUtils.cs @@ -43,7 +43,7 @@ public static async Task DownloadFileAsync(this HttpClient client, string var percentage = bytesProcessed * 100.0 / totalBytes; if (mainWindowViewModel != null) { - mainWindowViewModel.ToolTaskProgressBarValue = percentage; + mainWindowViewModel.ToolTaskProgressBarValue = percentage ?? 0; } } diff --git a/src/StatisticsAnalysisTool/ViewModels/MainWindowViewModel.cs b/src/StatisticsAnalysisTool/ViewModels/MainWindowViewModel.cs index 5404fbe49..033a97eba 100644 --- a/src/StatisticsAnalysisTool/ViewModels/MainWindowViewModel.cs +++ b/src/StatisticsAnalysisTool/ViewModels/MainWindowViewModel.cs @@ -116,13 +116,14 @@ public class MainWindowViewModel : INotifyPropertyChanged private Visibility _mapHistoryTabVisibility = Visibility.Visible; private Visibility _playerInformationTabVisibility = Visibility.Visible; private Visibility _toolTaskFrontViewVisibility = Visibility.Collapsed; - private double? _toolTaskProgressBarValue; + private double _toolTaskProgressBarValue; private string _toolTaskCurrentTaskName; public MainWindowViewModel() { UpgradeSettings(); SetUiElements(); + Translation = new MainWindowTranslation(); AutoUpdateController.RemoveUpdateFiles(); AutoUpdateController.AutoUpdate(); @@ -249,7 +250,6 @@ public void InitMainWindowData() DebugModeVisibility = Visibility.Visible; #endif - Translation = new MainWindowTranslation(); ToolTaskController.SetToolTaskController(this); _ = InitGameDataAsync(); @@ -1389,7 +1389,7 @@ public Visibility PlayerInformationTabVisibility } } - public double? ToolTaskProgressBarValue + public double ToolTaskProgressBarValue { get => _toolTaskProgressBarValue; set From 78d9ee9feca5bccf4ab6770562646ea895772f7e Mon Sep 17 00:00:00 2001 From: mleen4 Date: Wed, 1 Mar 2023 12:36:01 +1100 Subject: [PATCH 4/8] Added .4 values to GetSetupFeePerFoodConsumed() --- src/StatisticsAnalysisTool/Common/CraftingController.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/StatisticsAnalysisTool/Common/CraftingController.cs b/src/StatisticsAnalysisTool/Common/CraftingController.cs index d43274ffd..0468a78af 100644 --- a/src/StatisticsAnalysisTool/Common/CraftingController.cs +++ b/src/StatisticsAnalysisTool/Common/CraftingController.cs @@ -194,7 +194,7 @@ public static double GetCraftingTax(int foodValue, Item item, double itemQuantit return 0; } } - + public static double GetSetupFeePerFoodConsumed(int foodValue, int numberOfMaterials, ItemTier tier, ItemLevel level, IEnumerable craftResource) { var tierFactor = (tier, level) switch @@ -205,27 +205,32 @@ public static double GetSetupFeePerFoodConsumed(int foodValue, int numberOfMater (ItemTier.T4, ItemLevel.Level1) => 3.6f, (ItemTier.T4, ItemLevel.Level2) => 7.2f, (ItemTier.T4, ItemLevel.Level3) => 14.4f, + (ItemTier.T4, ItemLevel.Level4) => 28.8f, (ItemTier.T5, ItemLevel.Level0) => 3.6f, (ItemTier.T5, ItemLevel.Level1) => 7.2f, (ItemTier.T5, ItemLevel.Level2) => 14.4f, (ItemTier.T5, ItemLevel.Level3) => 28.8f, + (ItemTier.T5, ItemLevel.Level4) => 57.6f, (ItemTier.T6, ItemLevel.Level0) => 7.2f, (ItemTier.T6, ItemLevel.Level1) => 14.4f, (ItemTier.T6, ItemLevel.Level2) => 28.8f, (ItemTier.T6, ItemLevel.Level3) => 57.6f, + (ItemTier.T6, ItemLevel.Level4) => 115.2f, (ItemTier.T7, ItemLevel.Level0) => 14.4f, (ItemTier.T7, ItemLevel.Level1) => 28.8f, (ItemTier.T7, ItemLevel.Level2) => 57.6f, (ItemTier.T7, ItemLevel.Level3) => 115.2f, + (ItemTier.T7, ItemLevel.Level4) => 230.4f, (ItemTier.T8, ItemLevel.Level0) => 28.8f, (ItemTier.T8, ItemLevel.Level1) => 57.6f, (ItemTier.T8, ItemLevel.Level2) => 115.2f, (ItemTier.T8, ItemLevel.Level3) => 230.4f, + (ItemTier.T8, ItemLevel.Level4) => 460.8f, _ => 1 }; var safeFoodValue = (foodValue <= 0) ? 1d : foodValue; - return safeFoodValue / 100d * numberOfMaterials * (tierFactor + GetArtifactFactor(craftResource)); + return Math.Round(safeFoodValue / 100d * numberOfMaterials * (tierFactor + GetArtifactFactor(craftResource))); } private static double GetArtifactFactor(IEnumerable requiredResources, double craftingTaxDefault = 0.0d) From c05df8c5b631495fbe169e12f23ec0778f63f522 Mon Sep 17 00:00:00 2001 From: Marcin Wieczorek <115917138+arabinos@users.noreply.github.com> Date: Thu, 2 Mar 2023 06:52:05 +0100 Subject: [PATCH 5/8] Update pt-BR.xml fix pt-BR.xml - Getting rid of the space between the lines. Deleting translators that ceased to be used. --- .../Languages/pt-BR.xml | 126 ++++++++++-------- 1 file changed, 74 insertions(+), 52 deletions(-) diff --git a/src/StatisticsAnalysisTool/Languages/pt-BR.xml b/src/StatisticsAnalysisTool/Languages/pt-BR.xml index 86b1b58b6..557d835ff 100644 --- a/src/StatisticsAnalysisTool/Languages/pt-BR.xml +++ b/src/StatisticsAnalysisTool/Languages/pt-BR.xml @@ -119,7 +119,7 @@ Atualização do ciclo de dias de info do item Carregar info completa do item Desconhecido - + Armadura de Pano Elmo de Pano Sapato de Pano @@ -132,19 +132,19 @@ Armadura Única Elmo Único Sapato Único - + Artefato de Armadura Artefato Mágico Artefato Corpo a Corpo Artefato OffHand Artefato a distância - + Coração Bestial Coração Montanhoso Coração Empedrado Coração Arbóreo Coração Videira - + Cozinhado Peixe Isca de pesca @@ -153,10 +153,10 @@ Poção Livro de Habilidades Vaidade - + Animais Semente - + Banner Cama Baú @@ -168,56 +168,56 @@ Mesa KitDeReparação Único - + Traje do Ceifeiro Chapéu do Ceifeiro Botas do Ceifeiro Mochila de Ceifeiro - + Traje de Pescador Chapéu de Pescador Botas de Pescador Mochila de Pescador - + Traje do Esfolador Chapéu do Esfolador Botas de Esfolador Mochila de Esfolador - + Traje de Minerador Chapéu de Minerador Botas de Minerador Mochila de Minerador - + Traje do Cavouqueiro Chapéu do Cavouqueiro Botas do Cavouqueiro Mochila do Cavouqueiro - + Traje de Lenhador Chapéu de Lenhador Botas de Lenhador Mochila de Lenhador - + Bridgewatch Caerleon Fort Sterling Lymhurst Martlock Thetford - + Cajado Arcano Cajado Amaldiçoado Cajado de Fogo Cajado de Gelo Cajado Divino Cajado da Natureza - + Essência Reliquia Runa Alma - + Machado Adaga Martelo @@ -225,12 +225,12 @@ Bastão Lança Espada - + Cavalo blindado Boi Montaria Rara Cavalo de Montar - + Livro Brumário Olho dos Segredos @@ -238,13 +238,13 @@ Tocha Raiz Mestra Lixo - + Agricultura Diário - + Arco Besta - + Tecido Fibra Pele @@ -255,11 +255,11 @@ Tábua Pedra Bloco de Pedra - + Selo de Arena Evento Selo Real - + Martelo de Demolição Pescaria Picareta @@ -267,7 +267,7 @@ Faca de Esfolar Martelo de Pedra Machado de Madeira - + Troféu de Fibra Troféu de Pesca Troféu do Generalista @@ -276,37 +276,37 @@ Troféu de Minerador Troféu de Canteiro Troféu de Lenhador - + Acessório Armadura Artefato Recursos da Cidade Consumíveis - + Cultivável Mobilia Equipamento de Coleta Produto de Luxo Magia - + Materiais Corpo a Corpo Montaria Mão Secundária Produto - + Á distância Recursos Tomo Ferramentas Troféus - + Peso Poder do Item Durabilidade Preço real em dinheiro Muitas requisições, feche algumas janelas ou espere alguns minutos. - + Alarme de Som Usado Corte do Preço do Item O preço de @@ -318,7 +318,7 @@ Preço de Corte Preço Médio Preço de Venda Min | Preço de Venda Max | Preço de Compra Min | Preço de Compra Max - + Rastreando O rastreamento esta ativado? (Verde - ON | Amarelo - Parcialmente | Cinza - OFF) Nome de Usuário @@ -335,7 +335,7 @@ Prata Total Fama Amarela Total Prata - + Minutos Horas Dias @@ -366,9 +366,9 @@ Baús incomuns abertos Baús raros abertos Baús lendários abertos - + Para aparecer o dano de outros jogadores ser reconhecido, o StatisticsAnalysisTool primeiro precisa ser ativada e então você deve sair e entrar do grupo. - + Filtrar por dano Filtrar por Dano por Segundo Filtrar por Nome @@ -385,11 +385,11 @@ Santuário de Prata Santuário de Fama Buff de Combate - + URL da API do Preço das Cidades URL da API do Histórico de Preços URL da API do Status de Ouro - + Seguro Temporizador da Masmorra Você tem certeza que deseja dar reset no medidor de dano? @@ -537,14 +537,9 @@ Poder médio do seus itens ao matar Poder médio dos itens dos inimigos mortos Poder médio dos seus itens ao morrer - Monitoramento de Correio - Correio Comprou Vendeu Custo por item - Excluir mensagens selecionadas - Você tem certeza que deseja excluir as mensagens selecionadas? - Para reconhecer novas mensagens, a caixa de entrada deve ser aberta no jogo e, adicionalmente, uma mensagem de cada vez. Vendido hoje Vendido neste mês Vendido neste ano @@ -602,9 +597,6 @@ Notas SO não suportado: podem ocorrer erros. Se sua internet estiver muito lenta ou você tiver outros problemas, você também pode baixar o arquivo manualmente. - Faça o download do arquivo no link abaixo - Renomeie o arquivo para ItemList.json e coloque o arquivo no diretório do StatisticsAnalysisTool. - Coloque o arquivo no diretório do StatisticsAnalysisTool. Em seguida, reinicie o StatisticsAnalysisTool. OU Copiar medidor de dano curto para a área de transferência @@ -627,14 +619,6 @@ Masmorras individuais aleatórias Masmorras de grupo aleatório Captura de tela após mudança de mapa - Monitoramento de e-mail ativo - Nunca excluir e-mails - Excluir e-mails após 7 dias - Excluir e-mails após 30 dias - Excluir e-mails após 60 dias - Excluir e-mails após 90 dias - Excluir e-mails após 180 dias - Excluir e-mails após 365 dias Ignorar e-mails com 0 valores Verificar atualização Prata paga em ReSpec nesta sessão @@ -678,4 +662,42 @@ Obrigado Som de calabouço fechado ativo Preço total com impostos deduzidos + Atualizar mobs.json por dias + url de origem mobs.json + Obter mobs.json + mobs.json não pode ser carregado. + Venda instantânea + Compra instantânea + Monitoramento de negociação ativo + Nuca excluir transações + Excluir negociações após 7 dias + Excluir transações após 30 dias + Excluir negociações após 60 dias + Excluir transações após 90 dias + Excluir negociações após 180 dias + Excluir transações após 365 dias + Excluir negociações selecionadas + Tem certeza de que deseja excluir as negociações selecionadas? + Monitoramento de negociações + Comércio + Para reconhecer novas mensagens de e-mail, a caixa de entrada deve ser aberta no jogo, e adicionalmente, cada mensagem uma vez. + Comércio desconhecido + E-mail + Excluir negociações após 14 dias + Bônus + Premium + Reunião ativa + Esta semana + Semana passada + Geralmente + Recurso mais coletado + Mais reunidos no mapa + Recursos totais + Total de processos de mineração + Quantidade de processos de mineração + Tem certeza de que deseja excluir os recursos selecionados? + Excluir recursos selecionados + Valor do recurso + Valor total de mercado + Visibilidade da guia de navegação From 59ae5c202b0faacca49ea8b4af4fa82113fe373b Mon Sep 17 00:00:00 2001 From: Aaron Date: Thu, 2 Mar 2023 11:45:46 +0100 Subject: [PATCH 6/8] Fixed TotalMarketValue update if gathering is running more then one time --- src/StatisticsAnalysisTool/Gathering/Gathered.cs | 13 ++++++++++++- .../Styles/GatheringStyles.xaml | 2 +- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/StatisticsAnalysisTool/Gathering/Gathered.cs b/src/StatisticsAnalysisTool/Gathering/Gathered.cs index a42fe94ac..c59f65899 100644 --- a/src/StatisticsAnalysisTool/Gathering/Gathered.cs +++ b/src/StatisticsAnalysisTool/Gathering/Gathered.cs @@ -22,6 +22,7 @@ public class Gathered : INotifyPropertyChanged private int _gainedTotalAmount; private bool _isSelectedForDeletion; private FixPoint _estimatedMarketValue; + private string _totalMarketValueWithCulture; public Gathered() { @@ -89,6 +90,8 @@ public int GainedTotalAmount set { _gainedTotalAmount = value; + + TotalMarketValueWithCulture = Utilities.LongWithCulture(FixPoint.FromFloatingPointValue(_gainedTotalAmount * EstimatedMarketValue.IntegerValue).IntegerValue); OnPropertyChanged(); } } @@ -128,7 +131,15 @@ public FixPoint TotalMarketValue get => FixPoint.FromFloatingPointValue(GainedTotalAmount * EstimatedMarketValue.IntegerValue); } - public string TotalMarketValueWithCulture => Utilities.LongWithCulture(TotalMarketValue.IntegerValue); + public string TotalMarketValueWithCulture + { + get => _totalMarketValueWithCulture; + set + { + _totalMarketValueWithCulture = value; + OnPropertyChanged(); + } + } public string ClusterIndex { get; init; } public MapType MapType { get; init; } diff --git a/src/StatisticsAnalysisTool/Styles/GatheringStyles.xaml b/src/StatisticsAnalysisTool/Styles/GatheringStyles.xaml index ff848e8ca..b3e2ab508 100644 --- a/src/StatisticsAnalysisTool/Styles/GatheringStyles.xaml +++ b/src/StatisticsAnalysisTool/Styles/GatheringStyles.xaml @@ -101,7 +101,7 @@ - + From fa705eaf73d31d41be9e3488f80c4c9412d47679 Mon Sep 17 00:00:00 2001 From: Aaron Date: Thu, 2 Mar 2023 14:45:19 +0100 Subject: [PATCH 7/8] The percentage of the translation is now displayed behind the language. --- .../Common/LanguageController.cs | 84 +++++++++++++++---- .../Models/FileInformation.cs | 1 + .../UserControls/SettingsControl.xaml | 16 +++- .../ViewModels/SettingsWindowViewModel.cs | 5 +- 4 files changed, 88 insertions(+), 18 deletions(-) diff --git a/src/StatisticsAnalysisTool/Common/LanguageController.cs b/src/StatisticsAnalysisTool/Common/LanguageController.cs index dd297c876..cf83c823d 100644 --- a/src/StatisticsAnalysisTool/Common/LanguageController.cs +++ b/src/StatisticsAnalysisTool/Common/LanguageController.cs @@ -12,9 +12,10 @@ using System.Windows; using System.Windows.Markup; using System.Xml; +using System.Xml.Linq; namespace StatisticsAnalysisTool.Common; -// TODO: Change language controller - one language file for all and refactoring + public static class LanguageController { private static readonly Dictionary Translations = new(); @@ -121,8 +122,8 @@ public static bool SetLanguage() } var fileInfos = (from file in LanguageFiles - where file.FileName.ToUpper() == CurrentCultureInfo?.TextInfo.CultureName.ToUpper() - select new FileInformation(file.FileName, file.FilePath)).FirstOrDefault(); + where file.FileName.ToUpper() == CurrentCultureInfo?.TextInfo.CultureName.ToUpper() + select new FileInformation(file.FileName, file.FilePath)).FirstOrDefault(); if (fileInfos == null) { @@ -157,10 +158,27 @@ private static bool ReadAndAddLanguageFile(string filePath) try { Translations.Clear(); - var xmlReader = XmlReader.Create(filePath); + var xmlReader = XmlReader.Create(filePath, new XmlReaderSettings() + { + Async = true + }); + while (xmlReader.Read()) - if (xmlReader.Name == "translation" && xmlReader.HasAttributes) - AddTranslationsToDictionary(xmlReader); + { + if (xmlReader.Name != "translation" || !xmlReader.HasAttributes) + { + continue; + } + + var translationLine = GetTranslationLine(xmlReader); + + if (string.IsNullOrEmpty(translationLine.Item1) || string.IsNullOrEmpty(translationLine.Item2)) + { + continue; + } + + Translations.Add(translationLine.Item1, translationLine.Item2); + } } catch (Exception e) { @@ -173,19 +191,23 @@ private static bool ReadAndAddLanguageFile(string filePath) return true; } - private static void AddTranslationsToDictionary(XmlReader xmlReader) + private static Tuple GetTranslationLine(XmlReader xmlReader) { - while (xmlReader.MoveToNextAttribute()) + var name = xmlReader.GetAttribute("name"); + var value = xmlReader.ReadString(); + + if (name == null || string.IsNullOrEmpty(value)) { - if (Translations.ContainsKey(xmlReader.Value)) - { - Log.Warn($"{nameof(AddTranslationsToDictionary)}: {Translation("DOUBLE_VALUE_EXISTS_IN_THE_LANGUAGE_FILE")}: {xmlReader.Value}"); - } - else if (xmlReader.Name == "name") - { - Translations.Add(xmlReader.Value, xmlReader.ReadString()); - } + return new Tuple(string.Empty, string.Empty); } + + if (Translations.ContainsKey(name)) + { + Log.Warn($"{nameof(GetTranslationLine)}: {Translation("DOUBLE_VALUE_EXISTS_IN_THE_LANGUAGE_FILE")}: {name}"); + return new Tuple(string.Empty, string.Empty); + } + + return new Tuple(name, value); } private static void InitializeLanguageFilesFromDirectory() @@ -215,4 +237,34 @@ private static void InitializeLanguageFilesFromDirectory() LanguageFiles.Add(fileInfo); } } + + public static void GetPercentageTranslationValues(string mainLanguageFileName = "en-US") + { + var mainLanguageFile = LanguageFiles.FirstOrDefault(x => string.Equals(x.FileName, mainLanguageFileName, StringComparison.CurrentCultureIgnoreCase)); + if (mainLanguageFile == null) + { + return; + } + + var mainLanguageFileCount = CountTranslations(mainLanguageFile.FilePath); + mainLanguageFile.PercentageTranslations = 100; + + foreach (FileInformation fileInformation in LanguageFiles.Where(x => x.FileName != mainLanguageFileName).ToList()) + { + var countTranslations = CountTranslations(fileInformation.FilePath); + double percentageValue = 100d / mainLanguageFileCount * countTranslations; + + var fileInfo = LanguageFiles.FirstOrDefault(x => x.FileName == fileInformation.FileName); + if (fileInfo != null) + { + fileInfo.PercentageTranslations = (percentageValue > 100d) ? 100 : percentageValue; + } + } + } + + private static int CountTranslations(string filePath) + { + var xml = XDocument.Load(filePath); + return xml.Descendants("translation").Count(); + } } \ No newline at end of file diff --git a/src/StatisticsAnalysisTool/Models/FileInformation.cs b/src/StatisticsAnalysisTool/Models/FileInformation.cs index 8304ad2a1..8e94736b0 100644 --- a/src/StatisticsAnalysisTool/Models/FileInformation.cs +++ b/src/StatisticsAnalysisTool/Models/FileInformation.cs @@ -16,4 +16,5 @@ public FileInformation(string fileName, string filePath) public string FilePath { get; set; } public string EnglishName { get; set; } public string NativeName { get; set; } + public double PercentageTranslations { get; set; } } \ No newline at end of file diff --git a/src/StatisticsAnalysisTool/UserControls/SettingsControl.xaml b/src/StatisticsAnalysisTool/UserControls/SettingsControl.xaml index 345faae76..fc49f50de 100644 --- a/src/StatisticsAnalysisTool/UserControls/SettingsControl.xaml +++ b/src/StatisticsAnalysisTool/UserControls/SettingsControl.xaml @@ -13,7 +13,21 @@