From c26153003fa3924adbc34489c2c7fbcefbf23c8d Mon Sep 17 00:00:00 2001 From: Hipposgrumm Date: Sun, 29 Dec 2024 14:10:32 -0700 Subject: [PATCH] Moved ambassador room controlling to seperate class. --- src/CommandHandlers/CounterHandler.cs | 10 +++--- src/Core/AmbassadorRoom.cs | 33 ++++++++++++++++++ src/Core/Room.cs | 49 +++++++++------------------ src/Server.cs | 5 --- 4 files changed, 55 insertions(+), 42 deletions(-) create mode 100644 src/Core/AmbassadorRoom.cs diff --git a/src/CommandHandlers/CounterHandler.cs b/src/CommandHandlers/CounterHandler.cs index e1c4291..f227b07 100644 --- a/src/CommandHandlers/CounterHandler.cs +++ b/src/CommandHandlers/CounterHandler.cs @@ -7,7 +7,7 @@ namespace sodoffmmo.CommandHandlers; [ExtensionCommandHandler("SCE")] class CounterEventHandler : CommandHandler { public override Task Handle(Client client, NetworkObject receivedObject) { // {"a":13,"c":1,"p":{"c":"SCE","p":{"NAME":"COUNT"},"r":-1}} - if (client.Room?.HasAmbassador() is bool b && b) { + if (client.Room is AmbassadorRoom room) { string name = receivedObject.Get("p").Get("NAME"); if (name == "COUNT" || name == "COUNT2" || name == "COUNT3") { int index = name switch { @@ -15,10 +15,12 @@ class CounterEventHandler : CommandHandler { "COUNT2" => 1, "COUNT3" => 2 }; - client.Room.ambassadorGauges[index] = Math.Min(100, client.Room.ambassadorGauges[index]+(1/Configuration.ServerConfiguration.AmbassadorGaugePlayers)); - client.Room.Send(Utils.VlNetworkPacket(client.Room.AddAmbassadorData(new()), client.Room.Id)); + room.ambassadorGauges[index] = Math.Min(100, room.ambassadorGauges[index]+(1/Configuration.ServerConfiguration.AmbassadorGaugePlayers)); + NetworkArray vars = new(); + room.AddRoomData(vars); + room.Send(Utils.VlNetworkPacket(vars, client.Room.Id)); } else { - Console.WriteLine("Invalid attempt to increment room var "+name+"."); + Console.WriteLine($"Invalid attempt to increment room var {name} in {room.Name}."); } } diff --git a/src/Core/AmbassadorRoom.cs b/src/Core/AmbassadorRoom.cs new file mode 100644 index 0000000..7a8bc6d --- /dev/null +++ b/src/Core/AmbassadorRoom.cs @@ -0,0 +1,33 @@ +using sodoffmmo.Data; + +namespace sodoffmmo.Core; + +public class AmbassadorRoom : Room { + public double[] ambassadorGauges; + readonly System.Timers.Timer? ambassadorTimer; + + public AmbassadorRoom(string name) : base(name) { + Console.WriteLine($"Setup Ambassador for {name}"); + ambassadorGauges = new double[3]; // There is always a maximum of 3. + for (int i=0;i<3;i++) ambassadorGauges[i] = Configuration.ServerConfiguration.AmbassadorGaugeStart; + ambassadorTimer = new(Configuration.ServerConfiguration.AmbassadorGaugeDecayRate * 1000) { + AutoReset = true, + Enabled = true + }; + ambassadorTimer.Elapsed += (sender, e) => { + if (!Configuration.ServerConfiguration.AmbassadorGaugeDecayOnlyWhenInRoom || clients.Count > 0) { + for (int i=0;i<3;i++) ambassadorGauges[i] = Math.Max(0, ambassadorGauges[i]-1); + NetworkArray vars = new(); + AddRoomData(vars); + Send(Utils.VlNetworkPacket(vars, Id)); + } + }; + } + + internal override void AddRoomData(NetworkArray vars) { + base.AddRoomData(vars); + vars.Add(NetworkArray.VlElement("COUNT", (int)Math.Round(ambassadorGauges[0]), isPersistent: true)); + vars.Add(NetworkArray.VlElement("COUNT2", (int)Math.Round(ambassadorGauges[1]), isPersistent: true)); + vars.Add(NetworkArray.VlElement("COUNT3", (int)Math.Round(ambassadorGauges[2]), isPersistent: true)); + } +} diff --git a/src/Core/Room.cs b/src/Core/Room.cs index 0300813..f3f77e1 100644 --- a/src/Core/Room.cs +++ b/src/Core/Room.cs @@ -7,7 +7,7 @@ public class Room { static object RoomsListLock = new object(); protected static Dictionary rooms = new(); - List clients = new(); + protected List clients = new(); protected object roomLock = new object(); public int Id { get; private set; } @@ -82,8 +82,10 @@ public class Room { public static Room GetOrAdd(string name, bool autoRemove = false) { lock(RoomsListLock) { - if (!Room.Exists(name)) + if (!Room.Exists(name)) { + if (Configuration.ServerConfiguration.AmbassadorRooms.Contains(name)) return new AmbassadorRoom(name); return new Room(name, autoRemove: autoRemove); + } return rooms[name]; } } @@ -111,7 +113,10 @@ public class Room { roomInfo.Add(false); // is password protected roomInfo.Add((short)clients.Count); // player count roomInfo.Add((short)4096); // max player count - roomInfo.Add(AddAmbassadorData(RoomVariables)); // variables + NetworkArray roomVars = new(); + AddRoomData(roomVars); + for (int i=0;i { - if (!Configuration.ServerConfiguration.AmbassadorGaugeDecayOnlyWhenInRoom || clients.Count > 0) { - for (int i=0;i<3;i++) ambassadorGauges[i] = Math.Max(0, ambassadorGauges[i]-1); - Send(Utils.VlNetworkPacket(AddAmbassadorData(new()), Id)); - } - }; - } - - internal NetworkArray AddAmbassadorData(NetworkArray array) { - if (HasAmbassador()) { // If this isn't null that means ambassadors are initialized. - array.Add(NetworkArray.VlElement("COUNT", (int)Math.Round(ambassadorGauges[0]), isPersistent: true)); - array.Add(NetworkArray.VlElement("COUNT2", (int)Math.Round(ambassadorGauges[1]), isPersistent: true)); - array.Add(NetworkArray.VlElement("COUNT3", (int)Math.Round(ambassadorGauges[2]), isPersistent: true)); - } - return array; - } + /// + /// Add extra data for the client to recieve upon joining the room. + /// + /// Existing room variables. + internal virtual void AddRoomData(NetworkArray vars) {} private int alertId = -1; private Random random = new Random(); diff --git a/src/Server.cs b/src/Server.cs index c9cc828..b56022f 100644 --- a/src/Server.cs +++ b/src/Server.cs @@ -42,11 +42,6 @@ public class Server { } } - foreach (var room in Configuration.ServerConfiguration.AmbassadorRooms) { - Console.WriteLine($"Setup Ambassador for {room}"); - Room.GetOrAdd(room).InitAmbassador(); - } - await Listen(listener); }