From 87a8bd280c3bbdf15c6bc0b4f7c33528c2394a55 Mon Sep 17 00:00:00 2001 From: Carlos Castro Date: Wed, 15 May 2024 16:17:28 +0100 Subject: [PATCH] add stats to each snapshot; --- .../Scripts/3_Main/_ReplaySystem/Recorder.cs | 4 +- .../Scripts/3_Main/_ReplaySystem/Snapshot.cs | 2 + .../Controllers/RecordingsController.cs | 42 ++++++++++++------ .../Dtos/RequestObjects/SnapshotRequest.cs | 2 + rest_service/Entities/Snapshot.cs | 2 + website/wwwroot/Build/build_web.data.bin | Bin 8272428 -> 8272684 bytes website/wwwroot/Build/build_web.framework.js | 2 +- website/wwwroot/Build/build_web.wasm | Bin 32608368 -> 32608332 bytes 8 files changed, 38 insertions(+), 16 deletions(-) diff --git a/game_client/Assets/Scripts/3_Main/_ReplaySystem/Recorder.cs b/game_client/Assets/Scripts/3_Main/_ReplaySystem/Recorder.cs index faddf2e..59f821e 100644 --- a/game_client/Assets/Scripts/3_Main/_ReplaySystem/Recorder.cs +++ b/game_client/Assets/Scripts/3_Main/_ReplaySystem/Recorder.cs @@ -44,7 +44,9 @@ private void CreateSnapshot() { var snapshot = new Snapshot { - Position = new Position(Helper.InvertY(player!.transform.position)) + Position = new Position(Helper.InvertY(player!.transform.position)), + SessionStatisticsPlain = SessionStatistics.Instance!.GetPlainCopy() + }; _snapshots!.Add(snapshot); } diff --git a/game_client/Assets/Scripts/3_Main/_ReplaySystem/Snapshot.cs b/game_client/Assets/Scripts/3_Main/_ReplaySystem/Snapshot.cs index 21df029..305524a 100644 --- a/game_client/Assets/Scripts/3_Main/_ReplaySystem/Snapshot.cs +++ b/game_client/Assets/Scripts/3_Main/_ReplaySystem/Snapshot.cs @@ -3,5 +3,7 @@ public class Snapshot { public Position Position { get; set; } + + public SessionStatisticsPlain SessionStatisticsPlain { get; set; } } } \ No newline at end of file diff --git a/rest_service/Controllers/RecordingsController.cs b/rest_service/Controllers/RecordingsController.cs index 369c655..0a2479e 100644 --- a/rest_service/Controllers/RecordingsController.cs +++ b/rest_service/Controllers/RecordingsController.cs @@ -52,6 +52,18 @@ public async Task PostRecording([FromBody] RecordingRequest recor X = dto.Position.X, Y = dto.Position.Y, Z = dto.Position.Z + }, + SessionStatisticsPlain = new SessionStatisticsPlain + { + Score = dto.SessionStatisticsPlain.Score, + DamageDone = dto.SessionStatisticsPlain.DamageDone, + BulletsFired = dto.SessionStatisticsPlain.BulletsFired, + PelletsDestroyedLarge = dto.SessionStatisticsPlain.PelletsDestroyedLarge, + PelletsDestroyedMedium = dto.SessionStatisticsPlain.PelletsDestroyedMedium, + PelletsDestroyedSmall = dto.SessionStatisticsPlain.PelletsDestroyedSmall, + PowerUpBulletDamageCollected = dto.SessionStatisticsPlain.PowerUpBulletDamageCollected, + PowerUpBulletSpeedCollected = dto.SessionStatisticsPlain.PowerUpBulletSpeedCollected, + PowerUpPlayerSpeedCollected = dto.SessionStatisticsPlain.PowerUpPlayerSpeedCollected } }).ToList() }; @@ -69,7 +81,9 @@ public async Task PostRecording([FromBody] RecordingRequest recor newRecording.StatsVector }); - } catch (Exception) { + } + catch (Exception) + { // Favor persisting Recording over setting vectors } @@ -97,9 +111,9 @@ public async Task PostRecording([FromBody] RecordingRequest recor catch (MultiplePlayersFoundException) { return BadRequest(new - { Message = $"The player '{newRecording.Player.Name}' exists multiple times." }); + { Message = $"The player '{newRecording.Player.Name}' exists multiple times." }); } - catch(Exception e) + catch (Exception e) { Console.WriteLine(e.Message); Console.WriteLine(e.StackTrace); @@ -129,11 +143,11 @@ private async Task AddLocation(Recording recording) switch (events.Count) { case 1: - { - var eventLocation = events[0].Location; - recording.Location = eventLocation; - break; - } + { + var eventLocation = events[0].Location; + recording.Location = eventLocation; + break; + } case 0: throw new EventNotFoundException(); default: @@ -149,11 +163,11 @@ private async Task AddPlayer(Recording recording) switch (players.Count) { case 1: - { - recording.Player.Name = players[0].Name; - recording.Player.Location = players[0].Location; - break; - } + { + recording.Player.Name = players[0].Name; + recording.Player.Location = players[0].Location; + break; + } case 0: throw new PlayerNotFoundException(); default: @@ -292,7 +306,7 @@ public async Task> SimilarBySpeed([FromQuery] Pla return response; } - + [HttpGet("similarByAcceleration", Name = "GetSimilarByAcceleration")] public async Task> SimilarByAcceleration([FromQuery] PlayerRequest playerRequest) { diff --git a/rest_service/Dtos/RequestObjects/SnapshotRequest.cs b/rest_service/Dtos/RequestObjects/SnapshotRequest.cs index f71fe43..fadb812 100644 --- a/rest_service/Dtos/RequestObjects/SnapshotRequest.cs +++ b/rest_service/Dtos/RequestObjects/SnapshotRequest.cs @@ -5,4 +5,6 @@ namespace RestService.Dtos.RequestObjects; public class SnapshotRequest { public Position? Position { get; set; } + + public SessionStatisticsPlain? SessionStatisticsPlain { get; set; } } \ No newline at end of file diff --git a/rest_service/Entities/Snapshot.cs b/rest_service/Entities/Snapshot.cs index dc8e66d..f67f625 100644 --- a/rest_service/Entities/Snapshot.cs +++ b/rest_service/Entities/Snapshot.cs @@ -6,4 +6,6 @@ namespace RestService.Entities; public class Snapshot { public Position Position { get; set; } + + public SessionStatisticsPlain? SessionStatisticsPlain { get; set; } } \ No newline at end of file diff --git a/website/wwwroot/Build/build_web.data.bin b/website/wwwroot/Build/build_web.data.bin index 26c87486c68140fd21901101cb42aa6f0df9703e..3b92f2429e8c0e44b5058616343e0c9cf8fcf39b 100644 GIT binary patch delta 681206 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�Ys2M-i&G9+?K#^t^gg*hEA+T?U}sAsAcSLRc&oE z9JaBnaT_b7Y*V|`-rE){NFZ-(3*2nSVr*yeetSVnv%LkB?ajsSPvFvPC=V|oxfhxf5q6j@!>>?MSq+J@Un-caeEq?3cXXhC$4!fb9H;0Yuwv>63C!b=)rQI+Eu4iD0$vb zR=vdv+&EJW@F0w{+-aP0tEm0W#aC!hAc6!kDErqXYW)Eg5DrkdIyyiTrEwo@103t{rg96;)!~uV} z4n;i)A0eYIXy8Gp7~Y9TsK7d=BgIWSempWAWn(KxX~5cLysyIKcu_g&ti|1?5h)wg&i9ZPVonU5FDcAb>d0 zrX-^ZaHla(r|IZa!0DDOoUWPCG@qe~Q7vc4s8`ODELj8mB+aO{-kCOBee-5duQi12zoSo)e zDFw#!M6KC*M4WF){rR@m1?4WVZILgq`$oRd=FVSK)93?c3y2rh73jE&N9pgAX-Y0N zYpBrcluH#aUmppnP{;KJt#;t$)>XP({i}@2ZB9~ag}W!G@htg*JDi+H~yQX!|PPSaWvrk2PJjr<<+A zc(cW)3LOJCTiM|j%a(4zSfMG!*xYK$SE&06y%M|Cx@c~*E}GlvBHdwW${p3UJmiWQpnicR&uJGG9(-PUoqhuP2fic{NW zssi