Potentially fix scenario shine sync for first moon
This commit is contained in:
parent
46bae93502
commit
4dee13a9d7
|
@ -17,6 +17,7 @@ server.ClientJoined += (c, _) => {
|
||||||
c.Metadata["loadedSave"] = false;
|
c.Metadata["loadedSave"] = false;
|
||||||
c.Metadata["scenario"] = 0;
|
c.Metadata["scenario"] = 0;
|
||||||
c.Metadata["2d"] = false;
|
c.Metadata["2d"] = false;
|
||||||
|
c.Metadata["speedrun"] = false;
|
||||||
foreach (Client client in server.Clients.Where(client => client.Metadata.ContainsKey("lastGamePacket")).ToArray()) {
|
foreach (Client client in server.Clients.Where(client => client.Metadata.ContainsKey("lastGamePacket")).ToArray()) {
|
||||||
try {
|
try {
|
||||||
Task.WaitAll(c.Send((GamePacket) client.Metadata["lastGamePacket"]!, client));
|
Task.WaitAll(c.Send((GamePacket) client.Metadata["lastGamePacket"]!, client));
|
||||||
|
@ -28,7 +29,7 @@ server.ClientJoined += (c, _) => {
|
||||||
|
|
||||||
c.PacketTransformer += (_, packet) => {
|
c.PacketTransformer += (_, packet) => {
|
||||||
if (Settings.Instance.Scenario.MergeEnabled && packet is GamePacket gamePacket) {
|
if (Settings.Instance.Scenario.MergeEnabled && packet is GamePacket gamePacket) {
|
||||||
gamePacket.ScenarioNum = (byte?) c.Metadata["scenario"] ?? 0;
|
gamePacket.ScenarioNum = (byte?) c.Metadata["scenario"] ?? 200;
|
||||||
return gamePacket;
|
return gamePacket;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,6 +39,7 @@ server.ClientJoined += (c, _) => {
|
||||||
|
|
||||||
async Task ClientSyncShineBag(Client client) {
|
async Task ClientSyncShineBag(Client client) {
|
||||||
try {
|
try {
|
||||||
|
if ((bool?) client.Metadata["speedrun"] ?? 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).ToArray()) {
|
foreach (int shine in shineBag.Except(clientBag).ToArray()) {
|
||||||
clientBag.Add(shine);
|
clientBag.Add(shine);
|
||||||
|
@ -77,6 +79,17 @@ server.PacketHandler = (c, p) => {
|
||||||
c.Metadata["scenario"] = gamePacket.ScenarioNum;
|
c.Metadata["scenario"] = gamePacket.ScenarioNum;
|
||||||
c.Metadata["2d"] = gamePacket.Is2d;
|
c.Metadata["2d"] = gamePacket.Is2d;
|
||||||
c.Metadata["lastGamePacket"] = gamePacket;
|
c.Metadata["lastGamePacket"] = gamePacket;
|
||||||
|
switch (gamePacket.Stage) {
|
||||||
|
case "CapWorldHomeStage" when gamePacket.ScenarioNum == 0:
|
||||||
|
c.Metadata["speedrun"] = true;
|
||||||
|
ConcurrentBag<int> clientBag = (ConcurrentBag<int>) (c.Metadata["shineSync"] ??= new ConcurrentBag<int>());
|
||||||
|
clientBag.Clear();
|
||||||
|
break;
|
||||||
|
case "WaterfallWorldHomeStage" when gamePacket.ScenarioNum > 0:
|
||||||
|
c.Metadata["speedrun"] = false;
|
||||||
|
ClientSyncShineBag(c);
|
||||||
|
break;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TagPacket tagPacket: {
|
case TagPacket tagPacket: {
|
||||||
|
@ -138,7 +151,7 @@ CommandHandler.RegisterCommand("send", args => {
|
||||||
|
|
||||||
if (!sbyte.TryParse(args[2], out sbyte scenario)) return $"Invalid scenario number {args[2]} (range: [-128 to 127])";
|
if (!sbyte.TryParse(args[2], out sbyte scenario)) return $"Invalid scenario number {args[2]} (range: [-128 to 127])";
|
||||||
Client[] players = args[3] == "*" ? server.Clients.Where(c => c.Connected).ToArray() : server.Clients.Where(c => c.Connected && args[3..].Contains(c.Name)).ToArray();
|
Client[] players = args[3] == "*" ? server.Clients.Where(c => c.Connected).ToArray() : server.Clients.Where(c => c.Connected && args[3..].Contains(c.Name)).ToArray();
|
||||||
Parallel.ForEachAsync(players, async (c,_) => {
|
Parallel.ForEachAsync(players, async (c, _) => {
|
||||||
await c.Send(new ChangeStagePacket {
|
await c.Send(new ChangeStagePacket {
|
||||||
Stage = stage,
|
Stage = stage,
|
||||||
Id = id,
|
Id = id,
|
||||||
|
@ -162,7 +175,7 @@ CommandHandler.RegisterCommand("sendall", args => {
|
||||||
|
|
||||||
Client[] players = server.Clients.Where(c => c.Connected).ToArray();
|
Client[] players = server.Clients.Where(c => c.Connected).ToArray();
|
||||||
|
|
||||||
Parallel.ForEachAsync(players, async (c,_) => {
|
Parallel.ForEachAsync(players, async (c, _) => {
|
||||||
await c.Send(new ChangeStagePacket {
|
await c.Send(new ChangeStagePacket {
|
||||||
Stage = stage,
|
Stage = stage,
|
||||||
Id = "",
|
Id = "",
|
||||||
|
@ -175,7 +188,7 @@ CommandHandler.RegisterCommand("sendall", args => {
|
||||||
});
|
});
|
||||||
|
|
||||||
CommandHandler.RegisterCommand("scenario", args => {
|
CommandHandler.RegisterCommand("scenario", args => {
|
||||||
const string optionUsage = "Valid options: merge <true/false>";
|
const string optionUsage = "Valid options: merge [true/false]";
|
||||||
if (args.Length < 1)
|
if (args.Length < 1)
|
||||||
return optionUsage;
|
return optionUsage;
|
||||||
switch (args[0]) {
|
switch (args[0]) {
|
||||||
|
@ -188,6 +201,9 @@ CommandHandler.RegisterCommand("scenario", args => {
|
||||||
|
|
||||||
return optionUsage;
|
return optionUsage;
|
||||||
}
|
}
|
||||||
|
case "merge" when args.Length == 1: {
|
||||||
|
return $"Scenario merging is {(Settings.Instance.Scenario.MergeEnabled)}";
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
return optionUsage;
|
return optionUsage;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue