From 8cd56e5bcbb36f98dbae041ad426083f04d830bb Mon Sep 17 00:00:00 2001 From: DarwinBaker Date: Wed, 7 Jun 2023 01:59:05 -0400 Subject: [PATCH] update 1.6.3.0 --- AATool/AATool.csproj | 52 +++++--- AATool/Configuration/PinnedObjectiveSet.cs | 5 +- AATool/Data/Categories/AdventuringTime.cs | 2 +- AATool/Data/Categories/AllAdvancements.cs | 2 +- AATool/Data/Categories/AllBlocks.cs | 62 +++++---- AATool/Data/Credits.cs | 1 + AATool/Data/Objectives/Complex/Trident.cs | 16 ++- AATool/Data/Speedrunning/Leaderboard.cs | 81 +++++++----- AATool/Net/Requests/AASsgRequest.cs | 64 ++++++++++ AATool/Net/Requests/AnyRsgRequest.cs | 4 +- AATool/Paths.cs | 7 +- AATool/Properties/AssemblyInfo.cs | 4 +- AATool/Saves/AchievementsFolder.cs | 9 +- AATool/Saves/MinecraftServer.cs | 25 ++-- AATool/UI/Badges/Badge.cs | 8 +- AATool/UI/Badges/HalfHeartHardcoreBadge.cs | 2 +- AATool/UI/Badges/MostRecordsBadge.cs | 2 +- AATool/UI/Controls/UIAchievementTree.cs | 3 - AATool/UI/Controls/UILeaderboard.cs | 23 ++-- AATool/UI/Controls/UIPinnedObjectiveFrame.cs | 1 - AATool/UI/Screens/UIMainScreen.cs | 2 + AATool/UI/Screens/UIUpdateScreen.cs | 34 +++-- .../Controls/CTrackerSettings.Designer.cs | 4 +- .../Winforms/Forms/FStyleDialog.Designer.cs | 4 +- AATool/Winforms/Forms/FStyleDialog.cs | 1 - .../1.19/advancements/adventure.xml | 4 +- .../advancements/adventure.xml | 6 +- .../advancements/end.xml | 0 .../advancements/husbandry.xml | 0 .../advancements/minecraft.xml | 0 .../advancements/nether.xml | 0 .../{1.20 Snapshot => 1.20}/blocks.xml | 27 ++-- .../{1.20 Snapshot => 1.20}/potions.xml | 0 .../{1.20 Snapshot => 1.20}/trims.xml | 0 .../blocks/misc/trident_and_heads_1.20^32.png | Bin 0 -> 3026 bytes .../blocks/misc/trident_and_heads_1.20^48.png | Bin 0 -> 3909 bytes .../blocks/sandstone/decorated_pot^32.png | Bin 1519 -> 1511 bytes .../gui/frames/flags/frame_flag_aroace.png | Bin 0 -> 162 bytes .../sprites/global/gui/icons/patreon.png | Bin 0 -> 697 bytes .../global/items/old_local_brewery.png | Bin 0 -> 295 bytes .../frames_main/Pride Flags/Aroace Pride.png | Bin 0 -> 2732 bytes .../Pride Flags/Aroace Pride.png | Bin 0 -> 4027 bytes AATool/assets/templates/screen_update.xml | 3 + .../{1.20 Snapshot => 1.20}/main.xml | 0 .../{1.20 Snapshot => 1.20}/main_compact.xml | 0 .../main_optimized.xml | 2 +- .../{1.20 Snapshot => 1.20}/main_relaxed.xml | 2 +- .../{1.20 Snapshot => 1.20}/main_vertical.xml | 2 +- .../{1.20 Snapshot => 1.20}/help.xml | 86 ++++++------- .../{1.20 Snapshot => 1.20}/main.xml | 24 ++-- AATool/assets/views/other/multiboard.xml | 118 ++++++++++-------- 51 files changed, 443 insertions(+), 249 deletions(-) create mode 100644 AATool/Net/Requests/AASsgRequest.cs rename AATool/assets/objectives/{1.20 Snapshot => 1.20}/advancements/adventure.xml (99%) rename AATool/assets/objectives/{1.20 Snapshot => 1.20}/advancements/end.xml (100%) rename AATool/assets/objectives/{1.20 Snapshot => 1.20}/advancements/husbandry.xml (100%) rename AATool/assets/objectives/{1.20 Snapshot => 1.20}/advancements/minecraft.xml (100%) rename AATool/assets/objectives/{1.20 Snapshot => 1.20}/advancements/nether.xml (100%) rename AATool/assets/objectives/{1.20 Snapshot => 1.20}/blocks.xml (99%) rename AATool/assets/objectives/{1.20 Snapshot => 1.20}/potions.xml (100%) rename AATool/assets/objectives/{1.20 Snapshot => 1.20}/trims.xml (100%) create mode 100644 AATool/assets/sprites/blocks/misc/trident_and_heads_1.20^32.png create mode 100644 AATool/assets/sprites/blocks/misc/trident_and_heads_1.20^48.png create mode 100644 AATool/assets/sprites/global/gui/frames/flags/frame_flag_aroace.png create mode 100644 AATool/assets/sprites/global/gui/icons/patreon.png create mode 100644 AATool/assets/sprites/global/items/old_local_brewery.png create mode 100644 AATool/assets/sprites/winforms/frames_main/Pride Flags/Aroace Pride.png create mode 100644 AATool/assets/sprites/winforms/frames_overlay/Pride Flags/Aroace Pride.png rename AATool/assets/views/adventuring_time/{1.20 Snapshot => 1.20}/main.xml (100%) rename AATool/assets/views/all_advancements/{1.20 Snapshot => 1.20}/main_compact.xml (100%) rename AATool/assets/views/all_advancements/{1.20 Snapshot => 1.20}/main_optimized.xml (98%) rename AATool/assets/views/all_advancements/{1.20 Snapshot => 1.20}/main_relaxed.xml (98%) rename AATool/assets/views/all_advancements/{1.20 Snapshot => 1.20}/main_vertical.xml (98%) rename AATool/assets/views/all_blocks/{1.20 Snapshot => 1.20}/help.xml (95%) rename AATool/assets/views/all_blocks/{1.20 Snapshot => 1.20}/main.xml (97%) diff --git a/AATool/AATool.csproj b/AATool/AATool.csproj index 5f7fbf56..3837baee 100644 --- a/AATool/AATool.csproj +++ b/AATool/AATool.csproj @@ -188,6 +188,7 @@ + @@ -515,28 +516,28 @@ PreserveNewest - + PreserveNewest - + PreserveNewest - + PreserveNewest - + PreserveNewest - + PreserveNewest - + PreserveNewest - + PreserveNewest - + PreserveNewest @@ -836,6 +837,12 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + PreserveNewest @@ -3374,6 +3381,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -3443,6 +3453,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -3584,6 +3597,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -6956,6 +6972,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -6986,6 +7005,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -7112,7 +7134,7 @@ PreserveNewest - + PreserveNewest @@ -7151,16 +7173,16 @@ PreserveNewest - + PreserveNewest - + PreserveNewest - + PreserveNewest - + PreserveNewest @@ -7184,10 +7206,10 @@ PreserveNewest - + PreserveNewest - + PreserveNewest diff --git a/AATool/Configuration/PinnedObjectiveSet.cs b/AATool/Configuration/PinnedObjectiveSet.cs index 709ceebd..9de59dca 100644 --- a/AATool/Configuration/PinnedObjectiveSet.cs +++ b/AATool/Configuration/PinnedObjectiveSet.cs @@ -67,7 +67,7 @@ public static List GetAllAvailable() [JsonProperty] public Dictionary> Pinned = new () { - { "All Advancements 1.20 Snapshot", new () { + { "All Advancements 1.20", new () { "AncientDebris", "WitherSkulls", "NautilusShells", "Trident", "EGap", "ArmorTrims", }}, { "All Advancements 1.19", new () { @@ -100,6 +100,9 @@ public static List GetAllAvailable() { "All Achievements 1.11", new () { "GoldBlocks", "WitherSkulls", "Biomes", "EGap", }}, + { "All Blocks 1.20", new () { + "AncientDebris", "DeepslateEmerald", "WitherSkulls", "ShulkerShells", "NautilusShells", "Trident", + }}, { "All Blocks 1.19", new () { "AncientDebris", "DeepslateEmerald", "WitherSkulls", "ShulkerShells", "NautilusShells", "Trident", }}, diff --git a/AATool/Data/Categories/AdventuringTime.cs b/AATool/Data/Categories/AdventuringTime.cs index 0aabd23c..f1c2248f 100644 --- a/AATool/Data/Categories/AdventuringTime.cs +++ b/AATool/Data/Categories/AdventuringTime.cs @@ -8,7 +8,7 @@ public class AdventuringTime : SingleAdvancement private const string Id = "minecraft:adventure/adventuring_time"; public static readonly List SupportedVersions = new () { - "1.20 Snapshot", + "1.20", "1.19", "1.18", "1.16", diff --git a/AATool/Data/Categories/AllAdvancements.cs b/AATool/Data/Categories/AllAdvancements.cs index 81be01c5..69f794af 100644 --- a/AATool/Data/Categories/AllAdvancements.cs +++ b/AATool/Data/Categories/AllAdvancements.cs @@ -6,7 +6,7 @@ namespace AATool.Data.Categories public class AllAdvancements : Category { public static readonly List SupportedVersions = new () { - "1.20 Snapshot", + "1.20", "1.19", "1.18", "1.17", diff --git a/AATool/Data/Categories/AllBlocks.cs b/AATool/Data/Categories/AllBlocks.cs index ac739f4d..0391253c 100644 --- a/AATool/Data/Categories/AllBlocks.cs +++ b/AATool/Data/Categories/AllBlocks.cs @@ -1,6 +1,8 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.IO; using System.Text; +using System.Threading; using AATool.Data.Objectives; using AATool.Graphics; using AATool.Net; @@ -14,11 +16,14 @@ public class AllBlocks : Category public const string HelpTextureSet = "ab_guide"; public static readonly List SupportedVersions = new () { + "1.20", "1.19", "1.18", "1.16", }; + private static bool WritingChecklistFile = false; + public override IEnumerable GetSupportedVersions() => SupportedVersions; public override IEnumerable GetOverlayObjectives() => Tracker.Blocks.All.Values; @@ -134,31 +139,46 @@ public void SaveChecklist() this.BlocksHighlightedCount = 0; this.BlocksConfirmedCount = 0; - string path = Paths.System.BlockChecklistFile(ActiveInstance.Number, Tracker.WorldName); - try + var list = new StringBuilder(); + foreach (Block block in Tracker.Blocks.All.Values) { - Directory.CreateDirectory(Paths.System.BlockChecklistsFolder); - using (StreamWriter file = File.CreateText(path)) + if (block.Highlighted) { - foreach (Block block in Tracker.Blocks.All.Values) - { - if (block.Highlighted) - { - file.WriteLine(block.Id); - - //update counts - if (block.IsComplete()) - this.BlocksConfirmedCount++; - else - this.BlocksHighlightedCount++; - } - } + list.AppendLine(block.Id); + + //update counts + if (block.IsComplete()) + this.BlocksConfirmedCount++; + else + this.BlocksHighlightedCount++; } } - catch - { - } + TryWriteChecklist(list.ToString()); + } + + private void TryWriteChecklist(string list) + { + if (WritingChecklistFile) + return; + + WritingChecklistFile = true; + new Thread(() => { + try + { + string path = Paths.System.BlockChecklistFile(ActiveInstance.Number, Tracker.WorldName); + Directory.CreateDirectory(Paths.System.BlockChecklistsFolder); + using (StreamWriter file = File.CreateText(path)) + file.Write(list); + } + catch + { + } + finally + { + WritingChecklistFile = false; + } + }).Start(); } private void TryLoadChecklist() diff --git a/AATool/Data/Credits.cs b/AATool/Data/Credits.cs index 604eb007..5d18024b 100644 --- a/AATool/Data/Credits.cs +++ b/AATool/Data/Credits.cs @@ -69,6 +69,7 @@ public static class Credits new (NetheriteTier, "Deadpool", new Uuid("899c63ac-6590-46c0-b77c-4dae1543f707")), new (NetheriteTier, "merpmerp", new Uuid("fc357f37-ebbb-4687-971f-df8016b41a6f")), new (NetheriteTier, "Oliver", new Uuid("6174765b-7158-4d18-af89-4692b2704ae8")), + new (NetheriteTier, "DCMii", new Uuid("3d71114e-4d3d-469b-8a2c-2aeea4df1e86")), new (DiamondTier, "NiceTwice", new Uuid("e43dad54-4b24-4da9-b690-a12fdc8626dc")), new (DiamondTier, "Cube1337x", new Uuid("1ae14cb9-6a2f-4357-a71e-fac6f7012b59")), diff --git a/AATool/Data/Objectives/Complex/Trident.cs b/AATool/Data/Objectives/Complex/Trident.cs index 6d36057a..9ff0f362 100644 --- a/AATool/Data/Objectives/Complex/Trident.cs +++ b/AATool/Data/Objectives/Complex/Trident.cs @@ -11,6 +11,7 @@ public class Trident : ComplexObjective private const string VVF = "minecraft:adventure/very_very_frightening"; private const string Surge = "minecraft:adventure/lightning_rod_with_villager_no_fire"; + private static readonly Version PiglinHeadAdded = new ("1.20"); private static readonly Version AncientCitySkeletonSkulls = new ("1.19"); private static readonly Version SurgeProtectorAdded = new ("1.17"); @@ -20,6 +21,7 @@ public class Trident : ComplexObjective private bool surgeDone; private bool ignoreSurge; + private bool piglinHead; private bool zombieHead; private bool creeperHead; private bool skeletonSkull; @@ -43,6 +45,9 @@ protected override void UpdateAdvancedState(ProgressState progress) bool ancientCitiesExist = Version.TryParse(Tracker.Category.CurrentVersion, out Version current) && current >= AncientCitySkeletonSkulls; + bool piglinHeadRequired = current is not null + && current >= PiglinHeadAdded; + this.zombieHead = progress.WasUsed("minecraft:zombie_head") || progress.WasPickedUp("minecraft:zombie_head"); @@ -52,7 +57,13 @@ protected override void UpdateAdvancedState(ProgressState progress) this.skeletonSkull = progress.WasUsed("minecraft:skeleton_skull") || progress.WasPickedUp("minecraft:skeleton_skull") || ancientCitiesExist; + this.piglinHead = progress.WasUsed("minecraft:piglin_head") + | progress.WasPickedUp("minecraft:piglin_head"); + this.doneWithHeads = this.zombieHead && this.creeperHead && this.skeletonSkull; + if (piglinHeadRequired) + this.doneWithHeads &= this.piglinHead; + this.CompletionOverride |= this.doneWithHeads; } else @@ -135,8 +146,11 @@ protected override string GetCurrentIcon() { if (Tracker.Category is AllBlocks) { + bool piglinHead = Version.TryParse(Tracker.Category.CurrentVersion, out Version current) + && current >= PiglinHeadAdded; + return this.doneWithHeads - ? "trident_and_heads" + ? (piglinHead ? "trident_and_heads_1.20" : "trident_and_heads") : "trident"; } diff --git a/AATool/Data/Speedrunning/Leaderboard.cs b/AATool/Data/Speedrunning/Leaderboard.cs index aaf2ae95..1088d57f 100644 --- a/AATool/Data/Speedrunning/Leaderboard.cs +++ b/AATool/Data/Speedrunning/Leaderboard.cs @@ -25,18 +25,22 @@ public sealed class Leaderboard public static string RunnerWithMostWorldRecords { get; private set; } = string.Empty; public static LeaderboardSheet History { get; private set; } - public static string RsgRunner { get; private set; } - public static TimeSpan RsgInGameTime { get; private set; } - public static TimeSpan RsgRealTime { get; private set; } + public static string AnyRsgRunner { get; private set; } + public static TimeSpan AnyRsgInGameTime { get; private set; } + public static TimeSpan AnyRsgRealTime { get; private set; } - public static string SsgRunner { get; private set; } - public static TimeSpan SsgInGameTime { get; private set; } - public static TimeSpan SsgRealTime { get; private set; } + public static string AnySsgRunner { get; private set; } + public static TimeSpan AnySsgInGameTime { get; private set; } + public static TimeSpan AnySsgRealTime { get; private set; } + + public static string AASsgRunner { get; private set; } + public static TimeSpan AASsgInGameTime { get; private set; } + public static TimeSpan AASsgRealTime { get; private set; } public static readonly TimeZoneInfo TimeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); - public static readonly string[] AAVersions = { "1.19", "1.18", "1.17", "1.16", "1.15", "1.14", "1.13", "1.12", "1.11", "1.6" }; + public static readonly string[] AAVersions = { "1.20", "1.19", "1.18", "1.17", "1.16", "1.15", "1.14", "1.13", "1.12", "1.11", "1.6" }; public string Category { get; private set; } public string Version { get; private set; } @@ -58,8 +62,9 @@ public static void Initialize() { foreach (string version in AAVersions) TryLoadCached("All Advancements", version, out _); - TryLoadCachedAnyPercent(true, "1.16", out _); - TryLoadCachedAnyPercent(false, "1.16", out _); + TryLoadCachedSpeedrunDotComRecord(true, false, "1.16", out _); + TryLoadCachedSpeedrunDotComRecord(false, false, "1.16", out _); + TryLoadCachedSpeedrunDotComRecord(false, true, "1.16", out _); UpdateMostWorldRecords(); } @@ -218,8 +223,10 @@ public static bool SyncRecords(string sheetId, string pageId, string csv) versions = new() { "1.18" }; else if (pageId is Paths.Web.ABPage19) versions = new() { "1.19" }; + else if (pageId is Paths.Web.ABPage20) + versions = new() { "1.20" }; else - versions = new () { "1.19", "1.18", "1.17", "1.15", "1.14", "1.13", "1.12", "1.11", "1.6" }; + versions = new () { "1.20", "1.19", "1.18", "1.17", "1.15", "1.14", "1.13", "1.12", "1.11", "1.6" }; //parse all the leaderboards foreach (string version in versions) @@ -253,7 +260,7 @@ public static bool SyncNicknames(string csv) return NickNamesLoaded; } - public static bool SyncAnyPercentRecord(string jsonString, bool rsg) + public static bool SyncSpeedrunDotComRecord(string jsonString, bool rsg, bool aa) { try { @@ -273,15 +280,21 @@ public static bool SyncAnyPercentRecord(string jsonString, bool rsg) if (rsg) { - RsgRunner = runner; - RsgInGameTime = igt; - RsgRealTime = rta; + AnyRsgRunner = runner; + AnyRsgInGameTime = igt; + AnyRsgRealTime = rta; + } + else if (aa) + { + AASsgRunner = runner; + AASsgInGameTime = igt; + AASsgRealTime = rta; } else { - SsgRunner = runner; - SsgInGameTime = igt; - SsgRealTime = rta; + AnySsgRunner = runner; + AnySsgInGameTime = igt; + AnySsgRealTime = rta; } return true; } @@ -308,14 +321,14 @@ public static string GetPlace(int rank) } } - public static void SaveAnyPercentRecordToCache(string jsonString, bool rsg) + public static void SaveSpeedrunDotComRecordToCache(string jsonString, bool rsg, bool aa) { try { //cache leaderboard so it loads instantly next launch //overwrite to keep leaderboard up to date Directory.CreateDirectory(Paths.System.LeaderboardsFolder); - string path = Paths.System.AnyPercentRecordFile(rsg, "1.16"); + string path = Paths.System.SpeedrunDotComRecordFile(rsg, aa, "1.16"); File.WriteAllText(path, jsonString); } catch @@ -363,16 +376,16 @@ private static bool TryLoadCached(string category, string version, out Leaderboa return leaderboard is not null; } - private static bool TryLoadCachedAnyPercent(bool rsg, string version, out string jsonString) + private static bool TryLoadCachedSpeedrunDotComRecord(bool rsg, bool aa, string version, out string jsonString) { jsonString = string.Empty; - string leaderboardFile = Paths.System.AnyPercentRecordFile(rsg, version); + string leaderboardFile = Paths.System.SpeedrunDotComRecordFile(rsg, aa, version); if (File.Exists(leaderboardFile)) { try { jsonString = File.ReadAllText(leaderboardFile); - SyncAnyPercentRecord(jsonString, rsg); + SyncSpeedrunDotComRecord(jsonString, rsg, aa); } catch { @@ -388,29 +401,33 @@ private static void UpdateMostWorldRecords() foreach (string version in AAVersions) { if (!TryGetWorldRecord("All Advancements", version, out Run wr)) - return; + continue; if (!recordHolders.TryGetValue(wr.Runner, out List records)) recordHolders[wr.Runner] = records = new List(); records.Add(wr); } + Version mostLatestVersion = default; int mostRecordsCount = 0; foreach (KeyValuePair> recordHolder in recordHolders) { - bool foundNew = recordHolder.Value.Count > mostRecordsCount - || (recordHolder.Value.Count == mostRecordsCount && recordHolder.Value.LastOrDefault().GameVersion > mostLatestVersion); - - if (foundNew) + int count = recordHolder.Value.Count; + Run newestVersion = recordHolder.Value.FirstOrDefault(); + + bool foundNewLeader = count > mostRecordsCount + || (count == mostRecordsCount && newestVersion.GameVersion > mostLatestVersion); + + if (foundNewLeader) { - mostRecordsCount = recordHolder.Value.Count; - RunnerWithMostWorldRecords = recordHolder.Value.LastOrDefault().Runner; - mostLatestVersion = recordHolder.Value.LastOrDefault().GameVersion; + mostRecordsCount = count; + RunnerWithMostWorldRecords = newestVersion.Runner; + mostLatestVersion = newestVersion.GameVersion; } } ListOfMostRecords.Clear(); - foreach (Run run in recordHolders[RunnerWithMostWorldRecords]) - ListOfMostRecords.Add(run); + if (recordHolders.TryGetValue(RunnerWithMostWorldRecords, out List runs)) + ListOfMostRecords.AddRange(runs); /* UIAvatar avatar = this.Root().First("most_records_avatar"); diff --git a/AATool/Net/Requests/AASsgRequest.cs b/AATool/Net/Requests/AASsgRequest.cs new file mode 100644 index 00000000..6c0c7c8c --- /dev/null +++ b/AATool/Net/Requests/AASsgRequest.cs @@ -0,0 +1,64 @@ +using System; +using System.Net.Http; +using System.Threading.Tasks; +using AATool.Data.Speedrunning; + +namespace AATool.Net.Requests +{ + public sealed class AASsgRequest : NetRequest + { + public const string SetSeed = "SSG"; + + public AASsgRequest() : base (Paths.Web.AASsgRecord) + { + } + + public override async Task DownloadAsync() + { + Debug.Log(Debug.RequestSection, $"Requested AA SSG (1.16) WR from speedrun.com"); + this.BeginTiming(); + + using var client = new HttpClient() { + Timeout = TimeSpan.FromMilliseconds(Protocol.Requests.TimeoutMs) + }; + try + { + //get minecraft name and add to cache + string response = await client.GetStringAsync(this.Url); + this.EndTiming(); + return this.HandleResponse(response); + } + catch (OperationCanceledException) + { + Debug.Log(Debug.RequestSection, $"-- AA SSG (1.16) WR request cancelled"); + //request canceled, nothing left to do here + } + catch (HttpRequestException e) + { + Debug.Log(Debug.RequestSection, $"-- AA SSG (1.16) WR request failed: {e.Message}"); + //error getting response, safely move on + } + this.EndTiming(); + return false; + } + + private bool HandleResponse(string response) + { + response = response?.Trim(); + if (string.IsNullOrEmpty(response)) + return false; + + if (Leaderboard.SyncSpeedrunDotComRecord(response, false, true)) + { + Leaderboard.SaveSpeedrunDotComRecordToCache(response, false, true); + Debug.Log(Debug.RequestSection, $"{Incoming} Received AA SSG (1.16) WR from speedrun.com"); + return true; + } + else + { + Debug.Log(Debug.RequestSection, $"-- Received invalid Any% RSG (1.16) WR data"); + return false; + } + } + } +} diff --git a/AATool/Net/Requests/AnyRsgRequest.cs b/AATool/Net/Requests/AnyRsgRequest.cs index 5acd03ea..943aaa0d 100644 --- a/AATool/Net/Requests/AnyRsgRequest.cs +++ b/AATool/Net/Requests/AnyRsgRequest.cs @@ -52,9 +52,9 @@ private bool HandleResponse(string response) if (string.IsNullOrEmpty(response)) return false; - if (Leaderboard.SyncAnyPercentRecord(response, this.subCategory is RandomSeed)) + if (Leaderboard.SyncSpeedrunDotComRecord(response, this.subCategory is RandomSeed, false)) { - Leaderboard.SaveAnyPercentRecordToCache(response, this.subCategory is RandomSeed); + Leaderboard.SaveSpeedrunDotComRecordToCache(response, this.subCategory is RandomSeed, false); Debug.Log(Debug.RequestSection, $"{Incoming} Received Any% {this.subCategory} (1.16) WR from speedrun.com"); return true; } diff --git a/AATool/Paths.cs b/AATool/Paths.cs index ab863f4e..2cf051c2 100644 --- a/AATool/Paths.cs +++ b/AATool/Paths.cs @@ -86,8 +86,11 @@ public static string BlockChecklistFile(int instance, string worldName) : Path.Combine(BlockChecklistsFolder, $"instance_{instance}-{worldName}.txt"); } - public static string AnyPercentRecordFile(bool rsg, string version) + public static string SpeedrunDotComRecordFile(bool rsg, bool aa, string version) { + if (aa) + return Path.Combine(LeaderboardsFolder, $"aa_wr_ssg_{version}.txt"); + return rsg ? Path.Combine(LeaderboardsFolder, $"any_percent_wr_rsg_{version}.txt") : Path.Combine(LeaderboardsFolder, $"any_percent_wr_ssg_{version}.txt"); @@ -142,6 +145,7 @@ public static class Web public const string AAPageOthers = "1283472797"; public const string ABSheet = "1RnN6lE3yi5S_5PBuxMXdWNvN3HayP3054M3Qud_p9BU"; + public const string ABPage20 = "1664598957"; public const string ABPage19 = "1912774860"; public const string ABPage18 = "1706556435"; public const string ABPage16 = "1572184167"; @@ -151,6 +155,7 @@ public static class Web public const string AnyRsgRecord = "https://www.speedrun.com/api/v1/leaderboards/j1npme6p/category/mkeyl926?top=1&embed=players&var-jlzkwql2=mln68v0q&var-r8rg67rn=21d4zvp1"; public const string AnySsgRecord = "https://www.speedrun.com/api/v1/leaderboards/j1npme6p/category/mkeyl926?top=1&embed=players&var-wl33kewl=4qye4731&var-r8rg67rn=klrzpjo1"; + public const string AASsgRecord = "https://www.speedrun.com/api/v1/leaderboards/j1npme6p/category/xk9gz16d?top=1&embed=players&var-38do09zl=5q8rd731&var-r8rg67rn=klrzpjo1"; public static string GetUuidUrl(string name) => $"https://minecraft-api.com/api/uuid/{name}"; diff --git a/AATool/Properties/AssemblyInfo.cs b/AATool/Properties/AssemblyInfo.cs index 297eefab..c0c8611b 100644 --- a/AATool/Properties/AssemblyInfo.cs +++ b/AATool/Properties/AssemblyInfo.cs @@ -33,6 +33,6 @@ // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.6.2.0")] -[assembly: AssemblyFileVersion("1.6.2.0")] +[assembly: AssemblyVersion("1.6.3.0")] +[assembly: AssemblyFileVersion("1.6.3.0")] [assembly: NeutralResourcesLanguage("en")] diff --git a/AATool/Saves/AchievementsFolder.cs b/AATool/Saves/AchievementsFolder.cs index 89c3d21d..e1b2bf9f 100644 --- a/AATool/Saves/AchievementsFolder.cs +++ b/AATool/Saves/AchievementsFolder.cs @@ -73,17 +73,16 @@ protected override void Update(JsonStream json, WorldState state, Contribution c { if (IsCompleted(achievement.Id, json)) { - state.Advancements.Add(achievement.Id, new Completion(json.Player, default)); - contribution.Advancements.Add(achievement.Id, new Completion(json.Player, default)); + state.Advancements[achievement.Id] = new Completion(json.Player, default); + contribution.Advancements[achievement.Id] = new Completion(json.Player, default); } if (achievement.HasCriteria) { foreach (string criterion in this.GetCompletedCriteria(achievement, json)) { - state.Criteria.Add(criterion, new Completion(json.Player, default)); - contribution.Criteria.Add(criterion, - new Completion(json.Player, default)); + state.Criteria[criterion] = new Completion(json.Player, default); + contribution.Criteria[criterion] = new Completion(json.Player, default); } } } diff --git a/AATool/Saves/MinecraftServer.cs b/AATool/Saves/MinecraftServer.cs index 1b9e7f19..79993518 100644 --- a/AATool/Saves/MinecraftServer.cs +++ b/AATool/Saves/MinecraftServer.cs @@ -27,6 +27,7 @@ public static class MinecraftServer public static SyncState State { get; private set; } public static string MessageOfTheDay { get; private set; } public static string WorldName { get; private set; } + public static bool LinuxMode { get; private set; } private static readonly Utilities.Timer RefreshTimer = new (); @@ -47,6 +48,9 @@ public static DateTime GetRefreshEstimate() => IsEnabled ? LastWorldSave.Add(TimeSpan.FromSeconds(SaveInterval)) : default; + public static string HostAwarePath(params string[] paths) => + LinuxMode ? Path.Combine(paths).Replace("\\", "/") : Path.Combine(paths); + public static void Update(Time time) { if (LastError is ArgumentException) @@ -276,7 +280,7 @@ private static bool TryDownloadServerProperties(SftpClient sftp, int failures = try { //download server properties - string path = Path.Combine(Config.Sftp.ServerRoot, "server.properties"); + string path = HostAwarePath(Config.Sftp.ServerRoot, "server.properties"); string[] properties = sftp.ReadAllText(path).Split('\n'); if (TryGetProperty(properties, "level-name", out string world)) WorldName = world.TrimEnd(); @@ -304,12 +308,11 @@ private static bool TryDownloadServerProperties(SftpClient sftp, int failures = private static bool TryGetWorldSaveTime(SftpClient sftp, out DateTime lastWorldSave, int failures = 0) { SetState(SyncState.LastAutoSave); - string remote = Path.Combine(Config.Sftp.ServerRoot, WorldName, "level.dat"); - lastWorldSave = default; - + string remotePath = HostAwarePath(Config.Sftp.ServerRoot, WorldName, "level.dat"); + lastWorldSave = default; try { - lastWorldSave = sftp.GetLastWriteTimeUtc(remote); + lastWorldSave = sftp.GetLastWriteTimeUtc(remotePath); return true; } catch (Exception exception) @@ -318,8 +321,16 @@ private static bool TryGetWorldSaveTime(SftpClient sftp, out DateTime lastWorldS { if (exception is SftpPathNotFoundException) { + if (!LinuxMode) + { + //try switching to linux mode + LinuxMode = true; + Thread.Sleep(AttemptIntervalMs); + return TryGetWorldSaveTime(sftp, out lastWorldSave, failures + 1); + } + //folder not found, world name might be wrong. refresh it next time - LastError = new SftpPathNotFoundException($"File not found: \"{remote}\"."); + LastError = new SftpPathNotFoundException($"File not found: \"{remotePath}\"."); InvalidateWorld(); return false; } @@ -346,7 +357,7 @@ public static bool TryDownloadFolder(SftpClient sftp, string name, int failures SmoothDownloadPercent = 0; string localPath = Path.Combine(Paths.System.SftpWorldsFolder, WorldName, name); - string remotePath = Path.Combine(Config.Sftp.ServerRoot, WorldName, name); + string remotePath = HostAwarePath(Config.Sftp.ServerRoot, WorldName, name); try { //make sure directory exists diff --git a/AATool/UI/Badges/Badge.cs b/AATool/UI/Badges/Badge.cs index f0052d6e..63033a5e 100644 --- a/AATool/UI/Badges/Badge.cs +++ b/AATool/UI/Badges/Badge.cs @@ -79,14 +79,18 @@ private static void TryGiveLegendaryBadge(Uuid uuid, string name, ref Badge badg { badge = new MostRecordsBadge(); } - else if (name == Leaderboard.RsgRunner?.ToLower()) + else if (name == Leaderboard.AnyRsgRunner?.ToLower()) { badge = new RankBadge(1, $"Any% RSG", "1.16", true); } - else if (name == Leaderboard.SsgRunner?.ToLower()) + else if (name == Leaderboard.AnySsgRunner?.ToLower()) { badge = new RankBadge(1, $"Any% SSG", "1.16", true); } + else if (name == Leaderboard.AASsgRunner?.ToLower()) + { + badge = new RankBadge(1, $"AA SSG", "1.16", true); + } else { string player = uuid != Uuid.Empty ? uuid.String : name; diff --git a/AATool/UI/Badges/HalfHeartHardcoreBadge.cs b/AATool/UI/Badges/HalfHeartHardcoreBadge.cs index d93945a6..0d50f8dd 100644 --- a/AATool/UI/Badges/HalfHeartHardcoreBadge.cs +++ b/AATool/UI/Badges/HalfHeartHardcoreBadge.cs @@ -29,7 +29,7 @@ public HalfHeartHardcoreBadge() this.Glow.SetTexture(HeartGlow); this.Glow.SkipToBrightness(0.6f); - this.Description.SetText("Completed AA on Hardcore\nwith half a heart (twice)"); + this.Description.SetText("Completed AA on Hardcore\nwith half a heart (4 times)"); } protected override void UpdateThis(Time time) diff --git a/AATool/UI/Badges/MostRecordsBadge.cs b/AATool/UI/Badges/MostRecordsBadge.cs index 7878a081..27fa21f4 100644 --- a/AATool/UI/Badges/MostRecordsBadge.cs +++ b/AATool/UI/Badges/MostRecordsBadge.cs @@ -27,7 +27,7 @@ public MostRecordsBadge() } this.Description.SetTextColor(RankBadge.PopupGoldText); - this.Description.SetText($"Holds the most AA records\n ({versionList})"); + this.Description.SetText($"Most concurrent AA WRs\n ({versionList})"); this.BackTexture = $"badge_most_records"; this.Glow.SetTexture("badge_large_gold_glow"); diff --git a/AATool/UI/Controls/UIAchievementTree.cs b/AATool/UI/Controls/UIAchievementTree.cs index 9d73337b..a5cf51ba 100644 --- a/AATool/UI/Controls/UIAchievementTree.cs +++ b/AATool/UI/Controls/UIAchievementTree.cs @@ -47,9 +47,6 @@ public override void ResizeRecursive(Rectangle rectangle) private void GeneratePaths() { this.paths = new List>(); - if (Peer.IsRunning) - return; - foreach (UIObjectiveFrame achievement in this.achievements) { //iterate each direct descendant and construct an arrow to it diff --git a/AATool/UI/Controls/UILeaderboard.cs b/AATool/UI/Controls/UILeaderboard.cs index 683e0e08..3e035f2b 100644 --- a/AATool/UI/Controls/UILeaderboard.cs +++ b/AATool/UI/Controls/UILeaderboard.cs @@ -160,6 +160,7 @@ private void RequestRefresh() "1.16" => Paths.Web.ABPage16, "1.18" => Paths.Web.ABPage18, "1.19" => Paths.Web.ABPage19, + "1.20" => Paths.Web.ABPage20, _ => string.Empty }; } @@ -323,17 +324,23 @@ private void PopuplateMultiboard() this.Root().First("most_records_runner")?.SetText(Leaderboard.RunnerWithMostWorldRecords); this.Root().First("most_records_list")?.SetText(mostRecordsList); - if (!string.IsNullOrEmpty(Leaderboard.RsgRunner)) + if (!string.IsNullOrEmpty(Leaderboard.AnyRsgRunner)) { - this.Root().First("any%_rsg_avatar")?.SetPlayer(Leaderboard.RsgRunner); - this.Root().First("any%_rsg_runner")?.SetText(Leaderboard.RsgRunner); - this.Root().First("any%_rsg_time")?.SetText($"{Leaderboard.RsgInGameTime:m':'ss} IGT {Leaderboard.RsgRealTime:m':'ss} RTA"); + this.Root().First("any%_rsg_avatar")?.SetPlayer(Leaderboard.AnyRsgRunner); + this.Root().First("any%_rsg_runner")?.SetText(Leaderboard.AnyRsgRunner); + this.Root().First("any%_rsg_time")?.SetText($"{Leaderboard.AnyRsgInGameTime:m':'ss} IGT {Leaderboard.AnyRsgRealTime:m':'ss} RTA"); } - if (!string.IsNullOrEmpty(Leaderboard.SsgRunner)) + if (!string.IsNullOrEmpty(Leaderboard.AnySsgRunner)) { - this.Root().First("any%_ssg_avatar")?.SetPlayer(Leaderboard.SsgRunner); - this.Root().First("any%_ssg_runner")?.SetText(Leaderboard.SsgRunner); - this.Root().First("any%_ssg_time")?.SetText($"{Leaderboard.SsgInGameTime:m':'ss} IGT {Leaderboard.SsgRealTime:m':'ss} RTA"); + this.Root().First("any%_ssg_avatar")?.SetPlayer(Leaderboard.AnySsgRunner); + this.Root().First("any%_ssg_runner")?.SetText(Leaderboard.AnySsgRunner); + this.Root().First("any%_ssg_time")?.SetText($"{Leaderboard.AnySsgInGameTime:m':'ss} IGT {Leaderboard.AnySsgRealTime:m':'ss} RTA"); + } + if (!string.IsNullOrEmpty(Leaderboard.AASsgRunner)) + { + this.Root().First("aa_ssg_avatar")?.SetPlayer(Leaderboard.AASsgRunner); + this.Root().First("aa_ssg_runner")?.SetText(Leaderboard.AASsgRunner); + this.Root().First("aa_ssg_time")?.SetText($"{Leaderboard.AASsgInGameTime:h':'mm':'ss} IGT {Leaderboard.AASsgRealTime:h':'mm':'ss} RTA"); } } diff --git a/AATool/UI/Controls/UIPinnedObjectiveFrame.cs b/AATool/UI/Controls/UIPinnedObjectiveFrame.cs index 16c7528d..1f6987dd 100644 --- a/AATool/UI/Controls/UIPinnedObjectiveFrame.cs +++ b/AATool/UI/Controls/UIPinnedObjectiveFrame.cs @@ -45,7 +45,6 @@ public override void InitializeRecursive(UIScreen screen) FlexHeight = new (16 * this.Scale), }; this.Frame.AddControl(this.foregroundIcon); - this.Layer = Layer.Fore; } public override void ResizeThis(Rectangle parent) diff --git a/AATool/UI/Screens/UIMainScreen.cs b/AATool/UI/Screens/UIMainScreen.cs index c31254aa..1aca8834 100644 --- a/AATool/UI/Screens/UIMainScreen.cs +++ b/AATool/UI/Screens/UIMainScreen.cs @@ -214,6 +214,7 @@ public override void ResizeRecursive(Rectangle rectangle) { //this.First("main_player_avatar")?.SetTexture(Tracker.GetMainPlayer().ToString().Replace("-", "")); this.Root().First("100hc_avatar")?.SetBadge(new HundredHardcoreBadge()); + this.Root().First("hhhaa_avatar")?.SetBadge(new HalfHeartHardcoreBadge()); } } @@ -356,6 +357,7 @@ public override void Click(UIControl sender) { new AnyPercentRecordRequest(true).EnqueueOnce(); new AnyPercentRecordRequest(false).EnqueueOnce(); + new AASsgRequest().EnqueueOnce(); } ForceLayoutRefresh(); } diff --git a/AATool/UI/Screens/UIUpdateScreen.cs b/AATool/UI/Screens/UIUpdateScreen.cs index 6e2de412..e7ed2a22 100644 --- a/AATool/UI/Screens/UIUpdateScreen.cs +++ b/AATool/UI/Screens/UIUpdateScreen.cs @@ -20,6 +20,7 @@ public class UIUpdateScreen : UIScreen private UIButton nowButton; private UIButton laterButton; private UIButton githubButton; + private UIButton patreonButton; private UIButton closeButton; private UIFlowPanel upgrades; @@ -99,7 +100,7 @@ public override void InitializeThis(UIScreen screen) if (this.nowButton is not null) { this.nowButton.OnClick += this.OnClick; - this.textTinted.Add(this.nowButton?.First()); + this.textTinted.Add(this.nowButton.First()); } //remind me later button @@ -107,7 +108,7 @@ public override void InitializeThis(UIScreen screen) if (this.laterButton is not null) { this.laterButton.OnClick += this.OnClick; - this.textTinted.Add(this.laterButton?.First()); + this.textTinted.Add(this.laterButton.First()); } //github link button @@ -115,15 +116,23 @@ public override void InitializeThis(UIScreen screen) if (this.githubButton is not null) { this.githubButton.OnClick += this.OnClick; - this.textTinted.Add(this.githubButton?.First()); + this.textTinted.Add(this.githubButton.First()); } + //patreon link button + this.patreonButton = this.First("patreon"); + if (this.patreonButton is not null) + { + this.patreonButton.OnClick += this.OnClick; + this.textTinted.Add(this.patreonButton.First()); + } + //close button this.closeButton = this.First("close"); if (this.closeButton is not null) { this.closeButton.OnClick += this.OnClick; - this.textTinted.Add(this.closeButton?.First()); + this.textTinted.Add(this.closeButton.First()); } this.upgrades = this.First("upgrades"); @@ -216,12 +225,15 @@ public override void Prepare() public override void DrawThis(Canvas canvas) { - var centered = new Rectangle( - this.thumbnailBounds.Left, - this.thumbnailBounds.Top, - UpdateRequest.LatestThumb.Width, - UpdateRequest.LatestThumb.Height); - canvas.Draw(UpdateRequest.LatestThumb, centered, Color.White, Layer.Fore); + if (UpdateRequest.LatestThumb is not null && this.thumbnailBounds is not null) + { + var centered = new Rectangle( + this.thumbnailBounds.Left, + this.thumbnailBounds.Top, + UpdateRequest.LatestThumb.Width, + UpdateRequest.LatestThumb.Height); + canvas.Draw(UpdateRequest.LatestThumb, centered, Color.White, Layer.Fore); + } base.DrawThis(canvas); } @@ -248,6 +260,8 @@ private void OnClick(UIControl sender) this.Form.Close(); else if (sender == this.githubButton) _ = Process.Start(Paths.Web.LatestRelease); + else if (sender == this.patreonButton) + _ = Process.Start(Paths.Web.PatreonFull); } } } diff --git a/AATool/Winforms/Controls/CTrackerSettings.Designer.cs b/AATool/Winforms/Controls/CTrackerSettings.Designer.cs index b7d87f60..12856356 100644 --- a/AATool/Winforms/Controls/CTrackerSettings.Designer.cs +++ b/AATool/Winforms/Controls/CTrackerSettings.Designer.cs @@ -346,7 +346,7 @@ private void InitializeComponent() this.label13.Size = new System.Drawing.Size(234, 42); this.label13.TabIndex = 71; this.label13.Text = "🛈 If you\'re connecting to a survival server and would like to only see your own " + - "advancements, set progress filtering to \"Solo\""; + "advancements, set Player Filtering to \"Solo\""; // // sftpCompatibility // @@ -652,8 +652,8 @@ private void InitializeComponent() this.Controls.Add(this.groupBox2); this.Controls.Add(this.groupBox1); this.Controls.Add(this.groupBox3); - this.Controls.Add(this.localGroup); this.Controls.Add(this.remoteGroup); + this.Controls.Add(this.localGroup); this.Name = "CTrackerSettings"; this.Size = new System.Drawing.Size(538, 307); this.localGroup.ResumeLayout(false); diff --git a/AATool/Winforms/Forms/FStyleDialog.Designer.cs b/AATool/Winforms/Forms/FStyleDialog.Designer.cs index cf57fe14..b6310121 100644 --- a/AATool/Winforms/Forms/FStyleDialog.Designer.cs +++ b/AATool/Winforms/Forms/FStyleDialog.Designer.cs @@ -40,7 +40,7 @@ private void InitializeComponent() this.frames.Location = new System.Drawing.Point(0, 0); this.frames.Margin = new System.Windows.Forms.Padding(0); this.frames.Name = "frames"; - this.frames.Size = new System.Drawing.Size(809, 621); + this.frames.Size = new System.Drawing.Size(809, 681); this.frames.TabIndex = 0; // // closeOnSelect @@ -59,7 +59,7 @@ private void InitializeComponent() // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(809, 621); + this.ClientSize = new System.Drawing.Size(809, 681); this.Controls.Add(this.closeOnSelect); this.Controls.Add(this.frames); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; diff --git a/AATool/Winforms/Forms/FStyleDialog.cs b/AATool/Winforms/Forms/FStyleDialog.cs index 83f135ed..e274de65 100644 --- a/AATool/Winforms/Forms/FStyleDialog.cs +++ b/AATool/Winforms/Forms/FStyleDialog.cs @@ -49,7 +49,6 @@ public FStyleDialog(bool overlay) this.Text = this.isOverlay ? "Overlay Frame Style" : "Main Window Frame Style"; this.Width = this.isOverlay ? 945 : 825; - this.Height = this.isOverlay ? 710 : 610; this.style = this.isOverlay ? Config.Overlay.FrameStyle : Config.Main.FrameStyle; string prideList = this.isOverlay ? Config.Overlay.PrideFrameList : Config.Main.PrideFrameList; diff --git a/AATool/assets/objectives/1.19/advancements/adventure.xml b/AATool/assets/objectives/1.19/advancements/adventure.xml index 296ed22c..32f7efc3 100644 --- a/AATool/assets/objectives/1.19/advancements/adventure.xml +++ b/AATool/assets/objectives/1.19/advancements/adventure.xml @@ -28,6 +28,8 @@ + + @@ -127,6 +129,4 @@ - - \ No newline at end of file diff --git a/AATool/assets/objectives/1.20 Snapshot/advancements/adventure.xml b/AATool/assets/objectives/1.20/advancements/adventure.xml similarity index 99% rename from AATool/assets/objectives/1.20 Snapshot/advancements/adventure.xml rename to AATool/assets/objectives/1.20/advancements/adventure.xml index fa333c44..0782a500 100644 --- a/AATool/assets/objectives/1.20 Snapshot/advancements/adventure.xml +++ b/AATool/assets/objectives/1.20/advancements/adventure.xml @@ -21,7 +21,7 @@ - + @@ -53,6 +53,8 @@ + + @@ -153,6 +155,4 @@ - - \ No newline at end of file diff --git a/AATool/assets/objectives/1.20 Snapshot/advancements/end.xml b/AATool/assets/objectives/1.20/advancements/end.xml similarity index 100% rename from AATool/assets/objectives/1.20 Snapshot/advancements/end.xml rename to AATool/assets/objectives/1.20/advancements/end.xml diff --git a/AATool/assets/objectives/1.20 Snapshot/advancements/husbandry.xml b/AATool/assets/objectives/1.20/advancements/husbandry.xml similarity index 100% rename from AATool/assets/objectives/1.20 Snapshot/advancements/husbandry.xml rename to AATool/assets/objectives/1.20/advancements/husbandry.xml diff --git a/AATool/assets/objectives/1.20 Snapshot/advancements/minecraft.xml b/AATool/assets/objectives/1.20/advancements/minecraft.xml similarity index 100% rename from AATool/assets/objectives/1.20 Snapshot/advancements/minecraft.xml rename to AATool/assets/objectives/1.20/advancements/minecraft.xml diff --git a/AATool/assets/objectives/1.20 Snapshot/advancements/nether.xml b/AATool/assets/objectives/1.20/advancements/nether.xml similarity index 100% rename from AATool/assets/objectives/1.20 Snapshot/advancements/nether.xml rename to AATool/assets/objectives/1.20/advancements/nether.xml diff --git a/AATool/assets/objectives/1.20 Snapshot/blocks.xml b/AATool/assets/objectives/1.20/blocks.xml similarity index 99% rename from AATool/assets/objectives/1.20 Snapshot/blocks.xml rename to AATool/assets/objectives/1.20/blocks.xml index 8b36c4dc..c35cd317 100644 --- a/AATool/assets/objectives/1.20 Snapshot/blocks.xml +++ b/AATool/assets/objectives/1.20/blocks.xml @@ -362,9 +362,9 @@ - + @@ -576,10 +576,6 @@ - - - - @@ -694,25 +690,27 @@ - - + + + + + + - - - - - + + + @@ -973,9 +971,10 @@ - + + - + \ No newline at end of file diff --git a/AATool/assets/objectives/1.20 Snapshot/potions.xml b/AATool/assets/objectives/1.20/potions.xml similarity index 100% rename from AATool/assets/objectives/1.20 Snapshot/potions.xml rename to AATool/assets/objectives/1.20/potions.xml diff --git a/AATool/assets/objectives/1.20 Snapshot/trims.xml b/AATool/assets/objectives/1.20/trims.xml similarity index 100% rename from AATool/assets/objectives/1.20 Snapshot/trims.xml rename to AATool/assets/objectives/1.20/trims.xml diff --git a/AATool/assets/sprites/blocks/misc/trident_and_heads_1.20^32.png b/AATool/assets/sprites/blocks/misc/trident_and_heads_1.20^32.png new file mode 100644 index 0000000000000000000000000000000000000000..4c30a78d9c4b38743b8e175e8eb4159ebf031078 GIT binary patch literal 3026 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 U3i;xFssI2007*qoM6N<$g355ubpQYW literal 0 HcmV?d00001 diff --git a/AATool/assets/sprites/blocks/misc/trident_and_heads_1.20^48.png b/AATool/assets/sprites/blocks/misc/trident_and_heads_1.20^48.png new file mode 100644 index 0000000000000000000000000000000000000000..9d508577c8b427653c91a44a8f56a8363ff104dc GIT binary patch literal 3909 zcmV-L54!M)P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGizW@LZzX3P}QzQTY4%$gXK~!i%%~@$| z9Orp{W_M?2FD{qMn-ob=Cw116qQg=hNsN!!0n)Uw3nR5$HHnkRbqk~|1UIdrD*e%* zNPonE<>rUeA`WskO#(Qvl(?=eJ5nWCktLB5Ns;0qlFMW7dv|tr`h2syJR}~gAPVvT zufA`GGvB<&^S$r;jU@bTAl_rTV-(OS`8&pY!tcU>lG0X+y*P^B0z&C5B~={n*@*jX zKuLLpQbnmNj^ejKh7zJo7RQni3t>US?xz7I&81gKW>5;{Zv|Js{$gppxtQE6MG^B#idajm zInU|86$3_J`x|@jt4IHu)4pq8Kl<|fU;W$)&P%irim#`vqbvrYybz)6O3Fsc9~4E* z#TsHQv47?nFz?5`LMYDRvy>Mlv#Ci}6zG`@R4tzhXxg`5{Kn6J^2yJ9@n^=(#9Z3+ z_VyNMKu1T%A9EO@IC^?|eq~%F)~^?K7chrr5z5SF|BWI*#ch`KMXEeUIZDNwWtR;W2iKDd zkL$V)HI;?m7sO~Fid(f08rKDupv^yVm=bf+=7bmp=F;ZXS6?m8fajlo{s|6OD1M4c zDW5`<;dnnx(%0sC+)$p1=Mrh;sJtXwAknZi$8zww$9C*r-y~R5Hbl+1tI(BYz)fGU zsf*MIq*-T*UKbE6>3RN}&l^#I#f(f&EBtX8wA6SGKKX~+zxMc!4S!y|v>d_|QRwCw zP!@%Lbo`LcEP%YGLE+72ABT01K@*y~fLYnO_HqGno@LR4N@ zd^xY{TTFH*Y!300vCCwkCJJ7bOeXGu0{>mr6>z&87#^O&`E8$1fKrte+gH9el!$677MGG7!D(&nqjt!np1#Kz63$7{&7DBgVExZ z-xxyqU}3r_W+Jd8g=oaNqu)IBWrsBflb%Obu7hpU$B;_pig(N+$Ec{JRkqA5vLO59=Xj{O> z{U0vQfa~v^Db9c|?0K{}GidYA97L9pNSjxTi^N>oyzs&c#ToF*E3cG_T42ctl#s|+ z5Dvy6Wn8y$&8j>ORcWhgY-8gcC?|!}gC(fLvo0&ezU%mK(P}P@FOI{Q869Y(Ab^BWlso_>UjH_OHpQ^aW0Z^5YcY`5EOY zMt^Y^9{T*|*4AzHU(xf@Yy7!~c3K=(E2`@%U|U@QOF-i#of|uiU?7f7k8HuEfM{0= zsBIMcv4ClxXlL%mChzk5Roxri)wrwPZ1>pCg!&_+yfjaFfq4|#_n9rN^!kZ>PUCKFzSoJuV#^ADH$b&?guKoF1f0<>QDdZ&=cog zzxa)Rd-3fritI2i)y`08>&I99ePx5=n668TuJJN&6NSpEm^szCIaTCXW%JylF3p1a zhy_4++JsPudq|e>sr{eAGrRr_O|E9xbQ>Dt z^-#N2TU;$CQ}yu1s}RUeq1sVH2d3eRP7FjYMDLD(;61aB z!Od)zc|NTn%N{2*6vx=r0K(&JCBo%(nl_gLSDh11yPYdae2EDgTQ|UJvmz9U;(y;g zhsk$CxOx2+zIXBaxHx_R+t+Qyq5V&D&zW#?;K%6gz6qUrgiL;x+bs8;lb%#j)9xs~ zrGVKiBs|ZJD-1E4#rapKXJ|+^$7rYs3`H@cyqJZ)}aTBRJiT>^zn2wF(t**E5`kDVkFy%wuoWuVN{t_1g=SaCEayRn0aq0%r zES{!2P5?6$@-!DH#I_%@Y$A)ub#gz)BVxnu{cyLnqq2R~JleedgCAnB`??{u;VCpa zCDd~-GX=wDQQ(p5l6ITJp>Z#T{9(k+aj;!tB4;yb-wA(=-qlicP?E<~or%N@)sjJ0 zNn>n~wDDBKrMlp|>_dw8IU4P-*V+cg-ke&1LJW5Cd~WnJT280X07ju4xT{^LsB*wn zVKYu@A|V8M9@i{ctgLIp`qit^TG0Zh*?}6l1{pmAEvq9L%0fz;(Yf+rR9e{(MiUr# z?=}>R9aggy(Rc&{7udg1jY_2w?UuF0Hx@9*0G%gfkuG`8r6nr&fKXn`mdAU=DZ|2= z5%VYcLLdBNVW{l4CUfH$NwM9qs@U$?hF#td!LC@5)w9@Ky9Mo)t01Wo+B|KD4YI#_ zYYe`wX{fdorp;sUCnvF@V+A%mv=;3x?QlurE95Ln28bOX3Hs!PA&f-Bo)4qxp#x}r z_+f)KB@whKi6=0Q7Bzy6ZWVTif*9M0?)Qd_NZP$JT(S#_r0^t{#z`T?aAc`vW_?tN0`Q0@Wcy`F)`R6s|u=(1ePE1l$~Wxg*5id{yInZjz7VPfQD#ey~4o3X8PEu2+0NSc`on^{9NqmBqzsE{M& zFh1zyC55 zqU1GA)|e$Up1LwLq8v;PgfYTQl4ttzvz3mfW2jz19;-1#5;2(g!UjtVTZDG#+*4*V z{co`tMmc2%U(9SLU^xE&47Cbk~K%ykGBD8f)82VmNPNC%V9^qX>SZC@%url1S~k?;fsd>~ z4LxpUx9YSC9tx^xOpDB3S?EbMIT=X$^>jW>UrX>s#?g2CCQ{KXvWXnC9WxL$;A2o= zLv3>v(%vwx^j_t~!u!N}7MB^GwaiErem$BG-zxm20AYamf2b{y@%ZdFk0qdsUc<)9 zSYtziUFPVdj|NEeB-;-vrDrI4oaU{a-KTDBuCP^f>d2oqQPWmWD?E-WWO(12`gYh! z3yIh5iUa$kkD$`wMmCs3;6lVGSnGGL!GXhj;cRxmtVpM2N$&jFXU{xe(4+uq>$9II z+PZj4oVj+@@Vr^(res&zu-eTQnEYkN%Et1%&MuXCUspAu`0*R>jf!y|_CCAgz)EH9 zG2N^m2&e(r%rd+TenL&+M&cTFZr+74X%POQ0J?wDk5B*QVK|y(j7^T7KK1?6$3xd6 zcdaQPBCsqB+A!l-ZQOunllV`(LWjz(RCt_roQ7FC$Xh!XQeNQfw=SKwn;f0&MGrD- zomR~n;!>3LAdL)ru0DSs5{VR2q?LP(gQvQh)3UA{tgf%>Tuga^vLcYadgVw}o$HV! zn;z8inpD~76z2q8*YtO^SZ+a&FNepEJbJ*Mw;fC76Z?nMTT=T2Etnn+>(R-?JE6Y7 z@#*v7veuO99(!=cfVr4Db?zTHls;n^2kN%%b$jUZmpo146FrV!dt>mP6~7bvpWAa_ zDnD^-)s8lVC*sF{_2orU11P>e T^Wa*j00000NkvXXu0mjfYmtP3 literal 0 HcmV?d00001 diff --git a/AATool/assets/sprites/blocks/sandstone/decorated_pot^32.png b/AATool/assets/sprites/blocks/sandstone/decorated_pot^32.png index 4be7aa79761cfc04d883a24face8cce43f5096bf..de08e1401dbcf34ce1cb2b6cd9be475d262f9655 100644 GIT binary patch delta 1456 zcmV;h1yB0#3+D@vNq@os01mICoaVIXS;6iCyg_0-~M5x8s zB+Y*^$;@Q_-}rs!y_>u@nK2nRe&Oc6d*8k1eCIpozTC+F4S%20H;oTRUl__3OXGZw zg+o*0-~4!2Uo?rP2~3T?IAm3;Z>?u@7ngT3an2oUZ_W0%$FIdgp^x7D`unDc9GSp- zBg0*ZmdN{=Lh<6CYpMACtsMaoedqW2@-sVp1WoTPFEbx7sIAQ2AuWjUS2yS$Vt6@R?*Nx5Rlss3&`*_n`l-zP!8 ze;R3-y!6#~b%}Tg%#6PgytA}6QnsuK42PNFT(KniG702maXT$-keZvqh#Ko;A(hsi zj!WoC_L<{7@<>-g3B|)9B@0YPL&3?{&OC8F`u0?r6NIg$gJX%-F&O_G8wMyfqe9V1 z9!BYv#(#12wD{O6XvjO9S3t5N6=>eu+9Jmjt%%;Q=?X!mNCg>YG zZO5gz2)B0gU4NsxS>b6orV-|sJ>@>x(Ix|EkW|T#9P1zhQoXG)d48Zz&YtL%Sjbi< zgcLCP<(;hDnp>2g=N`y|RHn;ur|>9n_C((>B7b{n7sg3|1r?8kw8AL?Q_=!SJ6obU zmo1dU4=1OQ^P!$Dq$jesrac;wEbQD_T9-doHY5e5EGT42^@n@wsT=f1coe8q@fxy{ zeF2-Hh|FznYXn3G9f!lx60%7Q_H@Xz5BE!VtVL78quCLQLXooky0|L0{#uk36e&sZ z7k}+CO>TGy&AmDaL zs4;9Z(Xjd}=!-}VKTiBQmM!}TntglC34nbg93W5&6NOeVj42uPB*fIXjhpv$O7OQ^ ziF)u5aBrruT5yiD{P5Tj+8-lE&w1|E-f6X<$$vcs?v2J6q0ZPGnN2zf8nt_Gq<=cb zgi+2W?_Oc!Knl1}mEg1Kb+Zk9#()kid^cNEon0UBUbcH5WV4H7bExt_0mJ-nbD zJrOnbJOt=iqtu1YWCQ3rC-Zpgb`Bxql;xPeC5bG(GR0)Icr1lMt% z#Bop2)L_jt2u#k*FCTs>t%p}m4JLyD-$c;w(@SaqPTb&Sg%MH)zGCE54L9Oxbd$In z{I_d)Ek>UnN+Oyocs$23<)s3=@$f>*XGV>hxrx_T8%11;BNH%4J~fDcR76w5d;cm3 z6d*a2nZ|e$_k$xjHfWlFK`HX|U=q>3vyt6p)E~?)94%rmME(J<-Y=d)XCwOn0000< KMNUMnLSTaTWy?AM delta 1464 zcmV;p1xNbl3-1e%Nq@rt01m?e$8V@)000GqNklr!c`xsOpKI-VPjc_ednPHaaB}WB_nf`gUVERL6Q4XJK7Sg1sXtpRjq*7j4o!@H z`_mnLaY!7Rz{K#&{Z_U5_DVK)VPP|q;M|dxrfg43;%Yn;`uMGHemE470~2_EXs|sQ zi+qqN6fgX>oKDe_d@xB(gx`0R~WQ|QJj zmNl3wm1Q-XlXR}24yk+?B*Fo|ENo@*E-$4@1@C-Pu76l^qNhWSw5 zFMj=fT_PR=Q=@MNZ_h6el`U%w!$D>^S1d`sOaghC+t`w3NX<=QM2&Sao8Ho%j!WoC z_SDf%dAvQTgc9M9k_9HCq2T!IC!f9+eP^P~3BuOW!I5Os2#kM$4ZW0_QK9H052N%- z<2ZU+e1B{eG~^x5D%~ z!u9QZ`#-2|R`?bi(+Km+o^l^=ZI)g%NUCH=j&+a$sjjBDyx7|JY=gALJAoD z!e&-(&dkX#GY{lJI@9jBQ+O0OeXM&Bk-f4F<9{T;f=Wa}TH%y{DTzVSwpdi>vW1fP z;bZ_g@9%6!dLlb(TA~rj!p`ma75Q^+eC;tix@>i(kKx;HQPkwz9K zPLVd+t_KeRZs0<*R4W@KNF-M(=`mz|&^U{c^})7Fd{x_);S3V$JDI>CO89P5lb_S~;_vBr%(1l$e@HHJ+l z8diS=eG#eQ$BAFZvSlAZvu~$40kCg`Jp^iDqRHre0R1?={e_& z%_}qGTG|i|i*VPdV+@T1-1Y4KQ_5vVox{LGfCd29M9vfz)v#4b$^^Eaokfh zHCQtV0^?Kn7xurD*2CEoeW_r;Hx~5!^pYBY6E}ESVT6={uNXO1!;N?n-8k+B4|grE z#qe|eDMWJ_k7qchyi|ZU9$rZK%&1W_H}LvOqljy9U;+lIXZ!GvifC$h?_UCe0wjkr zlNgWVesCbi28SkKkQ(SqAu-x_SF_uU`ornjgGKzm;?$$v{<8ypo|AMqi2MuiZZMy- S9~;pC0000mdKI;Vst0G2l@ A^8f$< literal 0 HcmV?d00001 diff --git a/AATool/assets/sprites/global/gui/icons/patreon.png b/AATool/assets/sprites/global/gui/icons/patreon.png new file mode 100644 index 0000000000000000000000000000000000000000..246554ddf9628fcfd9d375869fd6531f41725f21 GIT binary patch literal 697 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 literal 0 HcmV?d00001 diff --git a/AATool/assets/templates/screen_update.xml b/AATool/assets/templates/screen_update.xml index 4ab9b175..f8c7c2e2 100644 --- a/AATool/assets/templates/screen_update.xml +++ b/AATool/assets/templates/screen_update.xml @@ -63,6 +63,9 @@ + diff --git a/AATool/assets/views/adventuring_time/1.20 Snapshot/main.xml b/AATool/assets/views/adventuring_time/1.20/main.xml similarity index 100% rename from AATool/assets/views/adventuring_time/1.20 Snapshot/main.xml rename to AATool/assets/views/adventuring_time/1.20/main.xml diff --git a/AATool/assets/views/all_advancements/1.20 Snapshot/main_compact.xml b/AATool/assets/views/all_advancements/1.20/main_compact.xml similarity index 100% rename from AATool/assets/views/all_advancements/1.20 Snapshot/main_compact.xml rename to AATool/assets/views/all_advancements/1.20/main_compact.xml diff --git a/AATool/assets/views/all_advancements/1.20 Snapshot/main_optimized.xml b/AATool/assets/views/all_advancements/1.20/main_optimized.xml similarity index 98% rename from AATool/assets/views/all_advancements/1.20 Snapshot/main_optimized.xml rename to AATool/assets/views/all_advancements/1.20/main_optimized.xml index 6963169e..74199ede 100644 --- a/AATool/assets/views/all_advancements/1.20 Snapshot/main_optimized.xml +++ b/AATool/assets/views/all_advancements/1.20/main_optimized.xml @@ -101,7 +101,7 @@ - + diff --git a/AATool/assets/views/all_advancements/1.20 Snapshot/main_relaxed.xml b/AATool/assets/views/all_advancements/1.20/main_relaxed.xml similarity index 98% rename from AATool/assets/views/all_advancements/1.20 Snapshot/main_relaxed.xml rename to AATool/assets/views/all_advancements/1.20/main_relaxed.xml index 53e00348..f84cee33 100644 --- a/AATool/assets/views/all_advancements/1.20 Snapshot/main_relaxed.xml +++ b/AATool/assets/views/all_advancements/1.20/main_relaxed.xml @@ -54,7 +54,7 @@ - + diff --git a/AATool/assets/views/all_advancements/1.20 Snapshot/main_vertical.xml b/AATool/assets/views/all_advancements/1.20/main_vertical.xml similarity index 98% rename from AATool/assets/views/all_advancements/1.20 Snapshot/main_vertical.xml rename to AATool/assets/views/all_advancements/1.20/main_vertical.xml index a5316018..afc1f882 100644 --- a/AATool/assets/views/all_advancements/1.20 Snapshot/main_vertical.xml +++ b/AATool/assets/views/all_advancements/1.20/main_vertical.xml @@ -59,7 +59,7 @@ - + diff --git a/AATool/assets/views/all_blocks/1.20 Snapshot/help.xml b/AATool/assets/views/all_blocks/1.20/help.xml similarity index 95% rename from AATool/assets/views/all_blocks/1.20 Snapshot/help.xml rename to AATool/assets/views/all_blocks/1.20/help.xml index c8a25be6..9df2cd84 100644 --- a/AATool/assets/views/all_blocks/1.20 Snapshot/help.xml +++ b/AATool/assets/views/all_blocks/1.20/help.xml @@ -118,7 +118,7 @@ - + @@ -307,7 +307,7 @@ - + @@ -325,7 +325,7 @@ - + @@ -343,7 +343,7 @@ - + @@ -361,7 +361,7 @@ - + @@ -379,7 +379,7 @@ - + @@ -543,14 +543,14 @@ - + - + @@ -627,58 +627,58 @@ - + - - - - + + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + diff --git a/AATool/assets/views/all_blocks/1.20 Snapshot/main.xml b/AATool/assets/views/all_blocks/1.20/main.xml similarity index 97% rename from AATool/assets/views/all_blocks/1.20 Snapshot/main.xml rename to AATool/assets/views/all_blocks/1.20/main.xml index bcdbdb50..5f65f1bd 100644 --- a/AATool/assets/views/all_blocks/1.20 Snapshot/main.xml +++ b/AATool/assets/views/all_blocks/1.20/main.xml @@ -136,8 +136,8 @@ width="3 * 38" height="4 * 38"/> + margin_left="0" margin_top="9 * 38" + width="6 * 38" height="38"/> + margin_left="3 * 38" margin_top="8 * 38" + width="38" height="2 * 38"/> - + + + + margin_left="10 * 38" margin_top="9 * 38" + width="2 * 38" height="38"/> @@ -432,7 +436,7 @@ - + diff --git a/AATool/assets/views/other/multiboard.xml b/AATool/assets/views/other/multiboard.xml index 4f96d081..94ccb826 100644 --- a/AATool/assets/views/other/multiboard.xml +++ b/AATool/assets/views/other/multiboard.xml @@ -9,7 +9,7 @@ - + @@ -42,30 +42,15 @@ - + - - - - - - - - - - - - - - - - - - - + + + + - - + + @@ -81,15 +66,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + @@ -150,6 +173,10 @@ + + + + @@ -189,48 +216,31 @@ - - - - - - - - - - - - - - - - - - - - + + + - + - + - + - + - + - + - + - + - +