From 21045494f6b963b2ecf187e1c5ab886fbb3e93f2 Mon Sep 17 00:00:00 2001 From: Robert Paciorek Date: Mon, 22 Jan 2024 13:42:52 +0000 Subject: [PATCH] fix event end behaviour --- src/CommandHandlers/WorldEventHandlers.cs | 16 +++++++++-- src/Core/WorldEvent.cs | 33 ++++++++++++++++------- 2 files changed, 37 insertions(+), 12 deletions(-) diff --git a/src/CommandHandlers/WorldEventHandlers.cs b/src/CommandHandlers/WorldEventHandlers.cs index 3d102c1..dd85db8 100644 --- a/src/CommandHandlers/WorldEventHandlers.cs +++ b/src/CommandHandlers/WorldEventHandlers.cs @@ -10,7 +10,8 @@ class WorldEventStatusHandler : ICommandHandler { public void Handle(Client client, NetworkObject receivedObject) { client.Send(Utils.ArrNetworkPacket( new string[] { "WESR", - "WE_ScoutAttack|" + WorldEvent.Get().EventInfo() + "WE_ScoutAttack|" + WorldEvent.Get().EventInfo(), + "EvEnd|" + WorldEvent.Get().GetLastResults() })); } } @@ -19,6 +20,7 @@ class WorldEventStatusHandler : ICommandHandler { class WorldEventHealthHandler : ICommandHandler { // rec: {"a":13,"c":1,"p":{"c":"wex.OV","p":{"en":"","event":"ScoutAttack","eventUID":"ZydLUmCC","oh":"0.003444444","uid":"ZydLUmCC1"},"r":-1}} public void Handle(Client client, NetworkObject receivedObject) { + // NOTE: this should be process on event in any state - we use it to make event active NetworkObject p = receivedObject.Get("p"); float healthUpdateVal = float.Parse( p.Get("oh"), @@ -46,6 +48,9 @@ class WorldEventHealthHandler : ICommandHandler { class WorldEventFlareHandler : ICommandHandler { // rec: {"a":13,"c":1,"p":{"c":"wex.OVF","p":{"en":"","fuid":"WpnpDyJ51,14,0","oh":"0","ts":"6/29/2023 3:03:18 AM"},"r":-1}} public void Handle(Client client, NetworkObject receivedObject) { + if (!WorldEvent.Get().IsActive()) + return; + NetworkObject p = receivedObject.Get("p"); // send: {"a":11,"c":0,"p":{"r":403777,"vl":[["WEF_WpnpDyJ51,14,0",4,"0,6/29/2023 3:03:18 AM",false,false]]}} @@ -64,6 +69,9 @@ class WorldEventFlareHandler : ICommandHandler { class WorldEventMissileHandler : ICommandHandler { // rec: {"a":13,"c":1,"p":{"c":"wex.ST","p":{"en":"","objID":"-4X_gWAo1","tID":"f5b6254a-df78-4e24-aa9d-7e14539fb858","uID":"1f8eeb6b-753f-4e7f-af13-42cdd69d14e7","wID":"5"},"r":-1}} public void Handle(Client client, NetworkObject receivedObject) { + if (!WorldEvent.Get().IsActive()) + return; + NetworkObject p = receivedObject.Get("p"); // send: {"a":13,"c":1,"p":{"c":"","p":{"arr":["WA","1f8eeb6b-753f-4e7f-af13-42cdd69d14e7","5","f5b6254a-df78-4e24-aa9d-7e14539fb858","-4X_gWAo1"]}}} @@ -84,8 +92,12 @@ class WorldEventMissileHandler : ICommandHandler { class WorldEventScoreHandler : ICommandHandler { // rec: {"a":13,"c":1,"p":{"c":"wex.PS","p":{"ScoreData":"Datashyo/10","en":"","id":"ScoutAttack"},"r":-1}} public void Handle(Client client, NetworkObject receivedObject) { + if (!WorldEvent.Get().IsActive()) + return; + string scoreData = receivedObject.Get("p").Get("ScoreData"); - WorldEvent.Get().UpdateScore(client, scoreData); + string[] keyValPair = scoreData.Split('/'); + WorldEvent.Get().UpdateScore(keyValPair[0], keyValPair[1]); } } diff --git a/src/Core/WorldEvent.cs b/src/Core/WorldEvent.cs index dada141..ce3ff4a 100644 --- a/src/Core/WorldEvent.cs +++ b/src/Core/WorldEvent.cs @@ -34,10 +34,12 @@ class WorldEvent { private DateTime endTime; private string startTimeString; private Dictionary health; - private Dictionary players; + private Dictionary players; private DateTime AITime; private bool endTimeIsSet; + private string lastResults; + private void Reset(float time) { lock (EventLock) { room = Room.GetOrAdd("HubTrainingDO"); @@ -53,7 +55,7 @@ class WorldEvent { Console.WriteLine($"Event {uid} start time: {startTimeString}"); - ResetTimer((endTime - DateTime.UtcNow).TotalSeconds + 30); + ResetTimer((endTime - DateTime.UtcNow).TotalSeconds + 90); } } @@ -82,6 +84,7 @@ class WorldEvent { // clear here because after Reset() we can get late packages about previous events health = new(); players = new(); + lastResults = ""; state = State.Active; } @@ -107,19 +110,20 @@ class WorldEvent { string scores = ""; foreach (var x in players) { - scores += x.Value + ","; + scores += x.Key + "/" + x.Value + ","; } + lastResults = $"{uid};{results};{scores};{targets}"; NetworkPacket packet = Utils.VlNetworkPacket( "WE_ScoutAttack_End", - $"{uid};{results};{scores};{targets}", + lastResults, room.Id ); foreach (var roomClient in room.Clients) { roomClient.Send(packet); } - Console.WriteLine($"Event {uid} end: {results} {targets}"); + Console.WriteLine($"Event {uid} end: {results} {targets} {scores}"); NetworkArray vl = new(); NetworkArray vl1 = new(); @@ -151,7 +155,7 @@ class WorldEvent { } // (re)schedule event reset and announcement of next event - ResetTimer(10); + ResetTimer(60); return true; } @@ -215,19 +219,17 @@ class WorldEvent { if (health[targetUid] < 0) { health[targetUid] = 0.0f; - if (EndEvent()) - return -1.0f; + EndEvent(); } if (endTime < DateTime.UtcNow) { EndEvent(true); - return -1.0f; } return health[targetUid]; } - public void UpdateScore(Client client, string value) { + public void UpdateScore(string client, string value) { if (!players.ContainsKey(client)) { players.Add(client, value); } else { @@ -241,6 +243,9 @@ class WorldEvent { } public void SetTimeSpan(Client client, float seconds) { + if (state != State.Active) { + return; + } if (client == operatorAI || !endTimeIsSet) { Console.WriteLine($"Event {uid} set TimeSpan: {seconds} from operator: {client == operatorAI}"); endTime = startTime.AddSeconds(seconds); @@ -249,4 +254,12 @@ class WorldEvent { } public float GetHealth(string targetUid) => health[targetUid]; + + public bool IsActive() { + return state == State.Active; + } + + public string GetLastResults() { + return lastResults; + } }