Skip to content

Commit 88f7dbf

Browse files
author
Jannify
authored
Little json rework (SubnauticaNitrox#1279)
* Updated "Newtonsoft.Json" dependency * Updated JsonConverters * Moved EntityData from WorldData to own file * Added "JsonObject" and "JsonProperty" to server side serializing data.
1 parent 5c42897 commit 88f7dbf

23 files changed

+187
-264
lines changed

NitroxServer-Subnautica/NitroxServer-Subnautica.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@
4949
<Reference Include="Mono.Cecil.Rocks, Version=0.11.3.0, Culture=neutral, PublicKeyToken=50cebf1cceb9d05e, processorArchitecture=MSIL">
5050
<HintPath>..\packages\Mono.Cecil.0.11.3\lib\net40\Mono.Cecil.Rocks.dll</HintPath>
5151
</Reference>
52+
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
53+
<HintPath>..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
54+
</Reference>
5255
<Reference Include="protobuf-net">
5356
<HintPath>..\Nitrox.Subnautica.Assets\protobuf-net.dll</HintPath>
5457
</Reference>

NitroxServer-Subnautica/packages.config

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@
33
<package id="AssetsTools.NET" version="2.0.5" targetFramework="net472" />
44
<package id="Autofac" version="4.9.4" targetFramework="net472" />
55
<package id="Mono.Cecil" version="0.11.3" targetFramework="net472" />
6+
<package id="Newtonsoft.Json" version="12.0.3" targetFramework="net472" />
67
</packages>

NitroxServer/GameLogic/Bases/BaseData.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
11
using NitroxModel.DataStructures.GameLogic;
2-
using ProtoBufNet;
32
using System.Collections.Generic;
3+
using Newtonsoft.Json;
4+
using ProtoBufNet;
45

56
namespace NitroxServer.GameLogic.Bases
67
{
7-
[ProtoContract]
8+
[ProtoContract, JsonObject(MemberSerialization.OptIn)]
89
public class BaseData
910
{
1011
public const short VERSION = 2;
1112

12-
[ProtoMember(1)]
13+
[JsonProperty, ProtoMember(1)]
1314
public List<BasePiece> PartiallyConstructedPieces = new List<BasePiece>();
1415

15-
[ProtoMember(2)]
16+
[JsonProperty, ProtoMember(2)]
1617
public List<BasePiece> CompletedBasePieceHistory = new List<BasePiece>();
1718

1819
public static BaseData From(List<BasePiece> partiallyConstructedPieces, List<BasePiece> completedBasePieceHistory)

NitroxServer/GameLogic/Entities/EntityData.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
using System.Collections.Generic;
22
using System.Linq;
33
using System.Runtime.Serialization;
4+
using Newtonsoft.Json;
45
using NitroxModel.DataStructures;
56
using NitroxModel.DataStructures.GameLogic;
67
using ProtoBufNet;
78

89
namespace NitroxServer.GameLogic.Entities
910
{
10-
[ProtoContract]
11+
[ProtoContract, JsonObject(MemberSerialization.OptIn)]
1112
public class EntityData
1213
{
13-
[ProtoMember(1)]
14+
[JsonProperty, ProtoMember(1)]
1415
public List<Entity> Entities = new List<Entity>();
1516

1617
[ProtoAfterDeserialization]

NitroxServer/GameLogic/EscapePodData.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
using System.Collections.Generic;
2+
using Newtonsoft.Json;
23
using NitroxModel.DataStructures.GameLogic;
34
using ProtoBufNet;
45

56
namespace NitroxServer.GameLogic
67
{
7-
[ProtoContract]
8+
[ProtoContract, JsonObject(MemberSerialization.OptIn)]
89
public class EscapePodData
910
{
10-
[ProtoMember(1)]
11+
[JsonProperty, ProtoMember(1)]
1112
public List<EscapePodModel> EscapePods;
1213

1314
public static EscapePodData From(List<EscapePodModel> escapePods)

NitroxServer/GameLogic/GameData.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
using NitroxServer.GameLogic.Unlockables;
2-
using ProtoBufNet;
32
using System;
3+
using Newtonsoft.Json;
4+
using ProtoBufNet;
45

56
namespace NitroxServer.GameLogic.Bases
67
{
78
[Serializable]
8-
[ProtoContract]
9+
[ProtoContract, JsonObject(MemberSerialization.OptIn)]
910
public class GameData
1011
{
11-
[ProtoMember(1)]
12+
[JsonProperty, ProtoMember(1)]
1213
public PDAStateData PDAState { get; set; }
13-
14-
[ProtoMember(2)]
14+
15+
[JsonProperty, ProtoMember(2)]
1516
public StoryGoalData StoryGoals { get; set; }
16-
17-
[ProtoMember(3)]
17+
18+
[JsonProperty, ProtoMember(3)]
1819
public StoryTimingData StoryTiming { get; set; }
1920
}
2021
}

NitroxServer/GameLogic/Items/InventoryData.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
using System.Collections.Generic;
22
using System.Linq;
3+
using Newtonsoft.Json;
34
using NitroxModel.DataStructures.GameLogic;
45
using ProtoBufNet;
56

67
namespace NitroxServer.GameLogic.Items
78
{
8-
[ProtoContract]
9+
[ProtoContract, JsonObject(MemberSerialization.OptIn)]
910
public class InventoryData
1011
{
11-
[ProtoMember(1)]
12+
[JsonProperty, ProtoMember(1)]
1213
public List<ItemData> InventoryItems = new List<ItemData>();
1314

14-
[ProtoMember(2)]
15+
[JsonProperty, ProtoMember(2)]
1516
public List<ItemData> StorageSlotItems = new List<ItemData>();
1617

1718
private InventoryData()
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
using System.Collections.Generic;
2+
using Newtonsoft.Json;
3+
using NitroxModel.DataStructures;
4+
using NitroxModel.DataStructures.GameLogic;
5+
using NitroxModel.DataStructures.Util;
6+
using ProtoBufNet;
7+
8+
namespace NitroxServer.GameLogic.Players
9+
{
10+
[ProtoContract, JsonObject(MemberSerialization.OptIn)]
11+
public class PersistedPlayerData
12+
{
13+
[JsonProperty, ProtoMember(1)]
14+
public string Name { get; set; }
15+
16+
[JsonProperty, ProtoMember(2)]
17+
public List<EquippedItemData> EquippedItems { get; set; } = new List<EquippedItemData>();
18+
19+
[JsonProperty, ProtoMember(3)]
20+
public List<EquippedItemData> Modules { get; set; } = new List<EquippedItemData>();
21+
22+
[JsonProperty, ProtoMember(4)]
23+
public ushort Id { get; set; }
24+
25+
[JsonProperty, ProtoMember(5)]
26+
public NitroxVector3 SpawnPosition { get; set; }
27+
28+
[JsonProperty, ProtoMember(6)]
29+
public PlayerStatsData CurrentStats { get; set; }
30+
31+
[JsonProperty, ProtoMember(7)]
32+
public NitroxId SubRootId { get; set; }
33+
34+
[JsonProperty, ProtoMember(8)]
35+
public Perms Permissions { get; set; } = Perms.PLAYER;
36+
37+
[JsonProperty, ProtoMember(9)]
38+
public NitroxId NitroxId { get; set; }
39+
40+
[JsonProperty, ProtoMember(10)]
41+
public bool IsPermaDeath { get; set; }
42+
43+
public Player ToPlayer()
44+
{
45+
return new Player(Id,
46+
Name,
47+
IsPermaDeath,
48+
null, //no connection/context as this player is not connected.
49+
null,
50+
SpawnPosition,
51+
NitroxId,
52+
Optional.OfNullable(SubRootId),
53+
Permissions,
54+
CurrentStats,
55+
EquippedItems,
56+
Modules);
57+
}
58+
59+
public static PersistedPlayerData FromPlayer(Player player)
60+
{
61+
return new PersistedPlayerData
62+
{
63+
Name = player.Name,
64+
EquippedItems = player.GetEquipment(),
65+
Modules = player.GetModules(),
66+
Id = player.Id,
67+
SpawnPosition = player.Position,
68+
CurrentStats = player.Stats,
69+
SubRootId = player.SubRootId.OrElse(null),
70+
Permissions = player.Permissions,
71+
NitroxId = player.GameObjectId,
72+
IsPermaDeath = player.IsPermaDeath
73+
};
74+
}
75+
}
76+
}
Lines changed: 8 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -1,102 +1,28 @@
1-
using NitroxModel.DataStructures.GameLogic;
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using Newtonsoft.Json;
24
using ProtoBufNet;
3-
using System.Collections.Generic;
4-
using NitroxModel.DataStructures;
5-
using NitroxModel.DataStructures.Util;
65

76
namespace NitroxServer.GameLogic.Players
87
{
9-
[ProtoContract]
8+
[ProtoContract, JsonObject(MemberSerialization.OptIn)]
109
public class PlayerData
1110
{
1211
public const short VERSION = 2;
1312

14-
[ProtoMember(1)]
13+
[JsonProperty, ProtoMember(1)]
1514
public List<PersistedPlayerData> Players = new List<PersistedPlayerData>();
1615

1716
public List<Player> GetPlayers()
1817
{
19-
List<Player> boPlayers = new List<Player>();
20-
21-
foreach (PersistedPlayerData playerData in Players)
22-
{
23-
Player player = new Player(playerData.Id,
24-
playerData.Name,
25-
playerData.IsPermaDeath,
26-
null, //no connection/context as this player is not connected.
27-
null,
28-
playerData.SpawnPosition,
29-
playerData.NitroxId,
30-
Optional.OfNullable(playerData.SubRootId),
31-
playerData.Permissions,
32-
playerData.CurrentStats,
33-
playerData.EquippedItems,
34-
playerData.Modules);
35-
boPlayers.Add(player);
36-
}
37-
38-
return boPlayers;
18+
return Players.Select(playerData => playerData.ToPlayer()).ToList();
3919
}
4020

4121
public static PlayerData From(IEnumerable<Player> players)
4222
{
43-
List<PersistedPlayerData> persistedPlayers = new List<PersistedPlayerData>();
44-
45-
foreach (Player player in players)
46-
{
47-
PersistedPlayerData persistedPlayer = new PersistedPlayerData();
48-
persistedPlayer.Name = player.Name;
49-
persistedPlayer.EquippedItems = player.GetEquipment();
50-
persistedPlayer.Modules = player.GetModules();
51-
persistedPlayer.Id = player.Id;
52-
persistedPlayer.SpawnPosition = player.Position;
53-
persistedPlayer.CurrentStats = player.Stats;
54-
persistedPlayer.SubRootId = player.SubRootId.OrElse(null);
55-
persistedPlayer.Permissions = player.Permissions;
56-
persistedPlayer.NitroxId = player.GameObjectId;
57-
persistedPlayer.IsPermaDeath = player.IsPermaDeath;
58-
59-
persistedPlayers.Add(persistedPlayer);
60-
}
61-
62-
PlayerData playerData = new PlayerData();
63-
playerData.Players = persistedPlayers;
64-
65-
return playerData;
66-
}
67-
68-
[ProtoContract]
69-
public class PersistedPlayerData
70-
{
71-
[ProtoMember(1)]
72-
public string Name { get; set; }
73-
74-
[ProtoMember(2)]
75-
public List<EquippedItemData> EquippedItems { get; set; } = new List<EquippedItemData>();
76-
77-
[ProtoMember(3)]
78-
public List<EquippedItemData> Modules { get; set; } = new List<EquippedItemData>();
79-
80-
[ProtoMember(4)]
81-
public ushort Id { get; set; }
82-
83-
[ProtoMember(5)]
84-
public NitroxVector3 SpawnPosition { get; set; }
85-
86-
[ProtoMember(6)]
87-
public PlayerStatsData CurrentStats { get; set; }
88-
89-
[ProtoMember(7)]
90-
public NitroxId SubRootId { get; set; }
91-
92-
[ProtoMember(8)]
93-
public Perms Permissions { get; set; } = Perms.PLAYER;
94-
95-
[ProtoMember(9)]
96-
public NitroxId NitroxId { get; set; }
23+
List<PersistedPlayerData> persistedPlayers = players.Select(PersistedPlayerData.FromPlayer).ToList();
9724

98-
[ProtoMember(10)]
99-
public bool IsPermaDeath { get; set; }
25+
return new PlayerData { Players = persistedPlayers };
10026
}
10127
}
10228
}

NitroxServer/GameLogic/StoryTimingData.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
using System;
2+
using Newtonsoft.Json;
23
using ProtoBufNet;
34

45
namespace NitroxServer.GameLogic
56
{
67
[Serializable]
7-
[ProtoContract]
8+
[ProtoContract, JsonObject(MemberSerialization.OptIn)]
89
public class StoryTimingData
910
{
10-
[ProtoMember(1)]
11+
[JsonProperty, ProtoMember(1)]
1112
public double ElapsedTime { get; set; }
1213

13-
[ProtoMember(2)]
14+
[JsonProperty, ProtoMember(2)]
1415
public double? AuroraExplosionTime { get; set; }
1516

1617
public static StoryTimingData From(EventTriggerer eventTriggerer)

0 commit comments

Comments
 (0)