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 00000000..4c30a78d
Binary files /dev/null and b/AATool/assets/sprites/blocks/misc/trident_and_heads_1.20^32.png differ
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 00000000..9d508577
Binary files /dev/null and b/AATool/assets/sprites/blocks/misc/trident_and_heads_1.20^48.png differ
diff --git a/AATool/assets/sprites/blocks/sandstone/decorated_pot^32.png b/AATool/assets/sprites/blocks/sandstone/decorated_pot^32.png
index 4be7aa79..de08e140 100644
Binary files a/AATool/assets/sprites/blocks/sandstone/decorated_pot^32.png and b/AATool/assets/sprites/blocks/sandstone/decorated_pot^32.png differ
diff --git a/AATool/assets/sprites/global/gui/frames/flags/frame_flag_aroace.png b/AATool/assets/sprites/global/gui/frames/flags/frame_flag_aroace.png
new file mode 100644
index 00000000..4e766d99
Binary files /dev/null and b/AATool/assets/sprites/global/gui/frames/flags/frame_flag_aroace.png differ
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 00000000..246554dd
Binary files /dev/null and b/AATool/assets/sprites/global/gui/icons/patreon.png differ
diff --git a/AATool/assets/sprites/global/items/old_local_brewery.png b/AATool/assets/sprites/global/items/old_local_brewery.png
new file mode 100644
index 00000000..cf97c3c9
Binary files /dev/null and b/AATool/assets/sprites/global/items/old_local_brewery.png differ
diff --git a/AATool/assets/sprites/winforms/frames_main/Pride Flags/Aroace Pride.png b/AATool/assets/sprites/winforms/frames_main/Pride Flags/Aroace Pride.png
new file mode 100644
index 00000000..0a1a6545
Binary files /dev/null and b/AATool/assets/sprites/winforms/frames_main/Pride Flags/Aroace Pride.png differ
diff --git a/AATool/assets/sprites/winforms/frames_overlay/Pride Flags/Aroace Pride.png b/AATool/assets/sprites/winforms/frames_overlay/Pride Flags/Aroace Pride.png
new file mode 100644
index 00000000..6e16db31
Binary files /dev/null and b/AATool/assets/sprites/winforms/frames_overlay/Pride Flags/Aroace Pride.png differ
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 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+