This commit is contained in:
Robin C. Ladiges 2024-04-27 23:28:08 +02:00 committed by GitHub
commit 3215b1858c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 22 additions and 16 deletions

View File

@ -66,13 +66,13 @@ server.ClientJoined += (c, _) => {
c.Metadata["loadedSave"] = false; c.Metadata["loadedSave"] = false;
c.Metadata["scenario"] = (byte?) 0; c.Metadata["scenario"] = (byte?) 0;
c.Metadata["2d"] = false; c.Metadata["2d"] = false;
c.Metadata["speedrun"] = false; c.Metadata["disableShineSync"] = false;
}; };
async Task ClientSyncShineBag(Client client) { async Task ClientSyncShineBag(Client client) {
if (!Settings.Instance.Shines.Enabled) return; if (!Settings.Instance.Shines.Enabled) return;
try { try {
if ((bool?) client.Metadata["speedrun"] ?? false) return; if ((bool?) client.Metadata["disableShineSync"] ?? false) return;
ConcurrentBag<int> clientBag = (ConcurrentBag<int>) (client.Metadata["shineSync"] ??= new ConcurrentBag<int>()); ConcurrentBag<int> clientBag = (ConcurrentBag<int>) (client.Metadata["shineSync"] ??= new ConcurrentBag<int>());
foreach (int shine in shineBag.Except(clientBag).Except(Settings.Instance.Shines.Excluded).ToArray()) { foreach (int shine in shineBag.Except(clientBag).Except(Settings.Instance.Shines.Excluded).ToArray()) {
if (!client.Connected) return; if (!client.Connected) return;
@ -148,21 +148,28 @@ server.PacketHandler = (c, p) => {
c.Metadata["lastGamePacket"] = gamePacket; c.Metadata["lastGamePacket"] = gamePacket;
switch (gamePacket.Stage) { switch (gamePacket.Stage) {
case "CapWorldHomeStage" when gamePacket.ScenarioNum == 0: case "CapWorldHomeStage" when gamePacket.ScenarioNum == 1:
c.Metadata["speedrun"] = true; case "CapWorldTowerStage" when gamePacket.ScenarioNum == 1:
((ConcurrentBag<int>) (c.Metadata["shineSync"] ??= new ConcurrentBag<int>())).Clear(); if (!((bool?) c.Metadata["disableShineSync"] ?? false)) {
shineBag.Clear(); c.Metadata["disableShineSync"] = true;
c.Logger.Info("Entered Cap on new save, preventing moon sync until Cascade"); ((ConcurrentBag<int>) (c.Metadata["shineSync"] ??= new ConcurrentBag<int>())).Clear();
c.Logger.Info("Entered Cap on new save, preventing moon sync until Cascade");
if (Settings.Instance.Shines.ClearOnNewSaves) {
shineBag.Clear();
c.Logger.Info("Cleared shine bags");
Task.Run(PersistShines);
}
}
break; break;
case "WaterfallWorldHomeStage": default:
bool wasSpeedrun = (bool) c.Metadata["speedrun"]!; if ((bool?) c.Metadata["disableShineSync"] ?? false) {
c.Metadata["speedrun"] = false;
if (wasSpeedrun)
Task.Run(async () => { Task.Run(async () => {
c.Logger.Info("Entered Cascade with moon sync disabled, enabling moon sync"); c.Logger.Info("Entered Cascade or later with moon sync disabled, enabling moon sync again");
await Task.Delay(15000); await Task.Delay(2000);
c.Metadata["disableShineSync"] = false;
await ClientSyncShineBag(c); await ClientSyncShineBag(c);
}); });
}
break; break;
} }
@ -589,9 +596,7 @@ CommandHandler.RegisterCommand("shine", args => {
); );
case "clear" when args.Length == 1: case "clear" when args.Length == 1:
shineBag.Clear(); shineBag.Clear();
Task.Run(async () => { Task.Run(PersistShines);
await PersistShines();
});
foreach (ConcurrentBag<int> playerBag in server.Clients.Select(serverClient => foreach (ConcurrentBag<int> playerBag in server.Clients.Select(serverClient =>
(ConcurrentBag<int>)serverClient.Metadata["shineSync"]!)) playerBag?.Clear(); (ConcurrentBag<int>)serverClient.Metadata["shineSync"]!)) playerBag?.Clear();

View File

@ -81,6 +81,7 @@ public class Settings {
public class ShineTable { public class ShineTable {
public bool Enabled { get; set; } = true; public bool Enabled { get; set; } = true;
public ISet<int> Excluded { get; set; } = new SortedSet<int> { 496 }; public ISet<int> Excluded { get; set; } = new SortedSet<int> { 496 };
public bool ClearOnNewSaves { get; set; } = false;
} }
public class PersistShinesTable public class PersistShinesTable