From c06cfb4d1711891a8c43a3a029cb222ea30ae6b7 Mon Sep 17 00:00:00 2001 From: Hipposgrumm <60556345+Hipposgrumm@users.noreply.github.com> Date: Sun, 29 Dec 2024 09:05:32 -0700 Subject: [PATCH] Support for Eat My Dust (#4) * Support for Eat My Dust Zombie Alert manager is stubbed. Added helpers to allow for weapon MMO. PlayerData for Eat My Dust * Zombie Alert Added * Fix Zombie Alert Timing * Honestly should probably catch this exception [null room in PM handler]. I foresee it occurring very commonly. While it shouldn't halt the server (except in visual studio debug), it's annoying to see. --- src/CommandHandlers/EMDZombiesHandler.cs | 29 ++++++++++++++++++++ src/CommandHandlers/PublicMessageHandlers.cs | 13 ++++++--- src/Data/PlayerData.cs | 6 +++- src/appsettings.json | 2 ++ 4 files changed, 45 insertions(+), 5 deletions(-) create mode 100644 src/CommandHandlers/EMDZombiesHandler.cs diff --git a/src/CommandHandlers/EMDZombiesHandler.cs b/src/CommandHandlers/EMDZombiesHandler.cs new file mode 100644 index 0000000..418a11d --- /dev/null +++ b/src/CommandHandlers/EMDZombiesHandler.cs @@ -0,0 +1,29 @@ +using System.Globalization; +using sodoffmmo.Attributes; +using sodoffmmo.Core; +using sodoffmmo.Data; + +namespace sodoffmmo.CommandHandlers; + +// TODO: This is currently stubbed. Supposed to do something. +// Should probably be done by someone who actually played the game. +[ExtensionCommandHandler("SU")] +public class EMDZombiesUpdateHandler : CommandHandler { + public override Task Handle(Client client, NetworkObject receivedObject) { + return Task.CompletedTask; + } +} + +[ExtensionCommandHandler("EN")] +public class EMDZombiesEnterHandler : CommandHandler { + public override Task Handle(Client client, NetworkObject receivedObject) { + return Task.CompletedTask; + } +} + +[ExtensionCommandHandler("EX")] +public class EMDZombiesExitHandler : CommandHandler { + public override Task Handle(Client client, NetworkObject receivedObject) { + return Task.CompletedTask; + } +} diff --git a/src/CommandHandlers/PublicMessageHandlers.cs b/src/CommandHandlers/PublicMessageHandlers.cs index 3b6b657..178749e 100644 --- a/src/CommandHandlers/PublicMessageHandlers.cs +++ b/src/CommandHandlers/PublicMessageHandlers.cs @@ -14,9 +14,13 @@ class RacingPMHandler : CommandHandler NetworkObject p = new(); NetworkArray arr = new(); NetworkObject data = new(); - data.Add("M", new string[] { - receivedObject.Get("p").Get("M") - }); + string M = receivedObject.Get("p").Get("M"); + if (M.StartsWith("WF:") || M.StartsWith("WFWD:")) { + // When firing weapon in EMD, recieving clients expect userid, but the sending client sends its token instead. + string token = M.Split(':')[1]; + M = M.Replace(token, client.PlayerData.Uid); + } + data.Add("M", new string[] {M}); data.Add("MID", client.ClientID); arr.Add(data); p.Add("arr", arr); @@ -24,7 +28,8 @@ class RacingPMHandler : CommandHandler cmd.Add("p", p); NetworkPacket packet = NetworkObject.WrapObject(1, 13, cmd).Serialize(); - client.Room.Send(packet); + if (client.Room != null) // Throws an exception in Eat my Dust when the player fires their weapon before fully in the room. + client.Room.Send(packet); return Task.CompletedTask; } } diff --git a/src/Data/PlayerData.cs b/src/Data/PlayerData.cs index 7b56583..13e8b8e 100644 --- a/src/Data/PlayerData.cs +++ b/src/Data/PlayerData.cs @@ -57,6 +57,9 @@ public class PlayerData { "P", // position vector (older games) "R", // rotation (older games - updated via SUV, not SPV) "F", // flags (older games - updated via SUV, not SPV) + "UTI", // group/clan + "SPM", // drive mode (Eat My Dust) + "H", // health }; // other variables (set and updated via SUV command) @@ -91,7 +94,8 @@ public class PlayerData { public void InitFromNetworkData(NetworkObject suvData) { // set initial state for SPV data - R = float.Parse(suvData.Get("R"), CultureInfo.InvariantCulture); + string? r = suvData.Get("R"); // in Eat My Dust, rotation is sent in R1, R2, R3 + if (r != null) R = float.Parse(r, CultureInfo.InvariantCulture); string? p1 = suvData.Get("P1"); if (p1 != null) { P1 = float.Parse(p1, CultureInfo.InvariantCulture); diff --git a/src/appsettings.json b/src/appsettings.json index b4b10bf..d6f0a7b 100644 --- a/src/appsettings.json +++ b/src/appsettings.json @@ -23,11 +23,13 @@ "// RoomAlerts": "List of MMO rooms with alert function. Default empty (not used by SoD), bellow sample config for WoJS, MB and SS.", "// alert parameters": "alert type, duration [s], minimum time to start [s], maximum time to start [s], redAlertDuration (used for type '1'), number of songs (used for type '3')", + "// alert types": "1 - Red Alert, 2 - Disco Alert, 3 - Dance Off", "RoomAlerts": { "LoungeInt" : [ ["3", 20.0, 30, 240, 0, 16] ], "Spaceport": [ ["1", 20.0, 300, 300, 60, 0], ["2", 120.0, 1800, 3600, 60, 0] ], "Academy": [ ["1", 20.0, 300, 300, 60, 0] ], "ClubSSInt" : [ ["3", 20.0, 30, 240, 0, 16] ], + "JunkYardEMD": [ ["1", 20.0, 240, 300, 60, 0] ], }, "// RacingMaxPlayers": "maximum players allowed in Thunder Run Racing (no more than 6)",