Skip to content

Commit 2711828

Browse files
authored
Moved global modules to sync for all players (SubnauticaNitrox#1415)
* Moved global modules to sync for all players * Added tests and added better name for method
1 parent c679cc3 commit 2711828

11 files changed

Lines changed: 107 additions & 20 deletions

File tree

NitroxClient/GameLogic/EquipmentSlots.cs

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,23 @@
1010
using NitroxModel.Logger;
1111
using NitroxModel.Packets;
1212
using NitroxModel_Subnautica.DataStructures;
13-
using NitroxModel_Subnautica.Helper;
1413
using UnityEngine;
1514

1615
namespace NitroxClient.GameLogic
1716
{
1817
public class EquipmentSlots
1918
{
19+
private List<EquipmentType> ApplicableEquipmentTypes { get; } = new List<EquipmentType>()
20+
{
21+
EquipmentType.CyclopsModule,
22+
EquipmentType.SeamothModule,
23+
EquipmentType.ExosuitModule,
24+
EquipmentType.ExosuitArm,
25+
EquipmentType.NuclearReactor,
26+
EquipmentType.BatteryCharger,
27+
EquipmentType.PowerCellCharger,
28+
EquipmentType.DecoySlot
29+
};
2030
private readonly IPacketSender packetSender;
2131

2232
public EquipmentSlots(IPacketSender packetSender)
@@ -53,7 +63,13 @@ public void BroadcastEquip(Pickupable pickupable, GameObject owner, string slot)
5363
return;
5464
}
5565

56-
ModuleAdded moduleAdded = new ModuleAdded(equippedItem);
66+
bool playerModule = true;
67+
if (ApplicableEquipmentTypes.Contains(Equipment.GetSlotType(slot)))
68+
{
69+
playerModule = false;
70+
}
71+
72+
ModuleAdded moduleAdded = new ModuleAdded(equippedItem, playerModule);
5773
packetSender.Send(moduleAdded);
5874
pickupable.gameObject.transform.SetParent(parent);
5975
}
@@ -80,7 +96,13 @@ public void BroadcastUnequip(Pickupable pickupable, GameObject owner, string slo
8096
packetSender.Send(vehicleChildInteractiveData);
8197
}
8298

83-
ModuleRemoved moduleRemoved = new ModuleRemoved(ownerId, slot, itemId);
99+
bool playerModule = true;
100+
if (ApplicableEquipmentTypes.Contains(Equipment.GetSlotType(slot)))
101+
{
102+
playerModule = false;
103+
}
104+
105+
ModuleRemoved moduleRemoved = new ModuleRemoved(ownerId, slot, itemId, playerModule);
84106
packetSender.Send(moduleRemoved);
85107
}
86108

NitroxModel/Packets/ModuleAdded.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,17 @@ namespace NitroxModel.Packets
77
public class ModuleAdded : Packet
88
{
99
public EquippedItemData EquippedItemData { get; }
10+
public bool PlayerModule { get; }
1011

11-
public ModuleAdded(EquippedItemData equippedItemData)
12+
public ModuleAdded(EquippedItemData equippedItemData, bool playerModule)
1213
{
1314
EquippedItemData = equippedItemData;
15+
PlayerModule = playerModule;
1416
}
1517

1618
public override string ToString()
1719
{
18-
return "[ModuleAdded EquippedItemData: " + EquippedItemData + " ]";
20+
return $"[ModuleAdded EquippedItemData: {EquippedItemData}, PlayerModule: {PlayerModule}]";
1921
}
2022
}
2123
}

NitroxModel/Packets/ModuleRemoved.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,19 @@ public class ModuleRemoved : Packet
99
public NitroxId OwnerId { get; }
1010
public string Slot { get; }
1111
public NitroxId ItemId { get; }
12+
public bool PlayerModule { get; }
1213

13-
public ModuleRemoved(NitroxId ownerId, string slot, NitroxId itemId)
14+
public ModuleRemoved(NitroxId ownerId, string slot, NitroxId itemId, bool playerModule)
1415
{
1516
OwnerId = ownerId;
1617
Slot = slot;
1718
ItemId = itemId;
19+
PlayerModule = playerModule;
1820
}
1921

2022
public override string ToString()
2123
{
22-
return "[ModuleRemoved ownerId: " + OwnerId + " Slot: " + Slot + " itemId: " + ItemId + "]";
24+
return $"[ModuleRemoved OwnerId: {OwnerId}, Slot: {Slot}, ItemId: {ItemId}, PlayerModule: {PlayerModule}]";
2325
}
2426
}
2527
}

NitroxServer/Communication/Packets/Processors/ModuleAddedProcessor.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,31 @@
11
using NitroxModel.Packets;
22
using NitroxServer.Communication.Packets.Processors.Abstract;
33
using NitroxServer.GameLogic;
4+
using NitroxServer.GameLogic.Items;
45

56
namespace NitroxServer.Communication.Packets.Processors
67
{
78
class ModuleAddedProcessor : AuthenticatedPacketProcessor<ModuleAdded>
89
{
910
private readonly PlayerManager playerManager;
11+
private readonly InventoryManager inventoryManager;
1012

11-
public ModuleAddedProcessor(PlayerManager playerManager)
13+
public ModuleAddedProcessor(PlayerManager playerManager, InventoryManager inventoryManager)
1214
{
1315
this.playerManager = playerManager;
16+
this.inventoryManager = inventoryManager;
1417
}
1518

1619
public override void Process(ModuleAdded packet, Player player)
1720
{
18-
player.AddModule(packet.EquippedItemData);
21+
if (packet.PlayerModule)
22+
{
23+
player.AddModule(packet.EquippedItemData);
24+
}
25+
else
26+
{
27+
inventoryManager.ModuleAdded(packet.EquippedItemData);
28+
}
1929
playerManager.SendPacketToOtherPlayers(packet, player);
2030
}
2131
}

NitroxServer/Communication/Packets/Processors/ModuleRemovedProcessor.cs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,32 @@
1-
using NitroxModel.Packets;
1+
using System;
2+
using NitroxModel.Packets;
23
using NitroxServer.Communication.Packets.Processors.Abstract;
34
using NitroxServer.GameLogic;
5+
using NitroxServer.GameLogic.Items;
46

57
namespace NitroxServer.Communication.Packets.Processors
68
{
79
class ModuleRemovedProcessor : AuthenticatedPacketProcessor<ModuleRemoved>
810
{
911
private readonly PlayerManager playerManager;
12+
private readonly InventoryManager inventoryManager;
1013

11-
public ModuleRemovedProcessor(PlayerManager playerManager)
14+
public ModuleRemovedProcessor(PlayerManager playerManager, InventoryManager inventoryManager)
1215
{
1316
this.playerManager = playerManager;
17+
this.inventoryManager = inventoryManager;
1418
}
1519

1620
public override void Process(ModuleRemoved packet, Player player)
1721
{
18-
player.RemoveModule(packet.ItemId);
22+
if (packet.PlayerModule)
23+
{
24+
player.RemoveModule(packet.ItemId);
25+
}
26+
else
27+
{
28+
inventoryManager.ModuleRemoved(packet.ItemId);
29+
}
1930
playerManager.SendPacketToOtherPlayers(packet, player);
2031
}
2132
}

NitroxServer/Communication/Packets/Processors/PlayerJoiningMultiplayerSessionProcessor.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public override void Process(PlayerJoiningMultiplayerSession packet, NitroxConne
6767
world.EscapePodManager.GetEscapePods(),
6868
assignedEscapePodId,
6969
equippedItems,
70-
player.GetModules(),
70+
GetAllModules(world.InventoryManager.GetAllModules(), player.GetModules()),
7171
world.BaseManager.GetBasePiecesForNewlyConnectedPlayer(),
7272
vehicles,
7373
world.InventoryManager.GetAllInventoryItems(),
@@ -104,5 +104,13 @@ private List<InitialRemotePlayerData> GetRemotePlayerData(Player player)
104104

105105
return playerData;
106106
}
107+
108+
private List<EquippedItemData> GetAllModules(ICollection<EquippedItemData> globalModules, List<EquippedItemData> playerModules)
109+
{
110+
List<EquippedItemData> modulesToSync = new List<EquippedItemData>();
111+
modulesToSync.AddRange(globalModules);
112+
modulesToSync.AddRange(playerModules);
113+
return modulesToSync;
114+
}
107115
}
108116
}

NitroxServer/GameLogic/Items/InventoryData.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,22 @@ public class InventoryData
1515
[JsonProperty, ProtoMember(2)]
1616
public List<ItemData> StorageSlotItems = new List<ItemData>();
1717

18-
public static InventoryData From(IEnumerable<ItemData> inventoryItems, IEnumerable<ItemData> storageSlotItems)
18+
[JsonProperty, ProtoMember(3)]
19+
public List<EquippedItemData> Modules { get; set; } = new List<EquippedItemData>();
20+
21+
public static InventoryData From(IEnumerable<ItemData> inventoryItems, IEnumerable<ItemData> storageSlotItems, IEnumerable<EquippedItemData> modules)
1922
{
2023
return new InventoryData
2124
{
2225
InventoryItems = inventoryItems.ToList(),
23-
StorageSlotItems = storageSlotItems.ToList()
26+
StorageSlotItems = storageSlotItems.ToList(),
27+
Modules = modules.ToList()
2428
};
2529
}
2630

2731
public override string ToString()
2832
{
29-
return $"[{nameof(InventoryData)} - {nameof(InventoryItems)}: {InventoryItems.Count}, {nameof(StorageSlotItems)}: {StorageSlotItems.Count}]";
33+
return $"[{nameof(InventoryData)} - {nameof(InventoryItems)}: {InventoryItems.Count}, {nameof(StorageSlotItems)}: {StorageSlotItems.Count}, {nameof(Modules)}: {Modules.Count}]";
3034
}
3135
}
3236
}

NitroxServer/GameLogic/Items/InventoryManager.cs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@ public class InventoryManager
1010
{
1111
private readonly ThreadSafeDictionary<NitroxId, ItemData> inventoryItemsById;
1212
private readonly ThreadSafeDictionary<NitroxId, ItemData> storageSlotItemsByContainerId;
13+
private readonly ThreadSafeDictionary<NitroxId, EquippedItemData> modulesByContainerId;
1314

14-
public InventoryManager(List<ItemData> inventoryItems, List<ItemData> storageSlotItems)
15+
public InventoryManager(List<ItemData> inventoryItems, List<ItemData> storageSlotItems, List<EquippedItemData> modules)
1516
{
1617
inventoryItemsById = new ThreadSafeDictionary<NitroxId, ItemData>(inventoryItems.ToDictionary(item => item.ItemId), false);
1718
storageSlotItemsByContainerId = new ThreadSafeDictionary<NitroxId, ItemData>(storageSlotItems.ToDictionary(item => item.ContainerId), false);
19+
modulesByContainerId = new ThreadSafeDictionary<NitroxId, EquippedItemData>(modules.ToDictionary(module => module.ContainerId), false);
1820
}
1921

2022
public void ItemAdded(ItemData itemData)
@@ -47,5 +49,20 @@ public ICollection<ItemData> GetAllStorageSlotItems()
4749
{
4850
return storageSlotItemsByContainerId.Values;
4951
}
52+
53+
public void ModuleAdded(EquippedItemData itemData)
54+
{
55+
modulesByContainerId[itemData.ContainerId] = itemData;
56+
}
57+
58+
public bool ModuleRemoved(NitroxId ownerId)
59+
{
60+
return modulesByContainerId.Remove(ownerId);
61+
}
62+
63+
public ICollection<EquippedItemData> GetAllModules()
64+
{
65+
return modulesByContainerId.Values;
66+
}
5067
}
5168
}

NitroxServer/Serialization/World/PersistedWorldData.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public static PersistedWorldData From(World world)
3636
ParsedBatchCells = world.BatchEntitySpawner.SerializableParsedBatches,
3737
ServerStartTime = world.TimeKeeper.ServerStartTime,
3838
VehicleData = VehicleData.From(world.VehicleManager.GetVehicles()),
39-
InventoryData = InventoryData.From(world.InventoryManager.GetAllInventoryItems(), world.InventoryManager.GetAllStorageSlotItems()),
39+
InventoryData = InventoryData.From(world.InventoryManager.GetAllInventoryItems(), world.InventoryManager.GetAllStorageSlotItems(), world.InventoryManager.GetAllModules()),
4040
GameData = GameData.From(world.GameData.PDAState, world.GameData.StoryGoals, world.EventTriggerer),
4141
EscapePodData = EscapePodData.From(world.EscapePodManager.GetEscapePods()),
4242
Seed = world.Seed

NitroxServer/Serialization/World/WorldPersistence.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ private World CreateFreshWorld()
150150
StoryGoals = new StoryGoalData(),
151151
StoryTiming = new StoryTimingData()
152152
},
153-
InventoryData = InventoryData.From(new List<ItemData>(), new List<ItemData>()),
153+
InventoryData = InventoryData.From(new List<ItemData>(), new List<ItemData>(), new List<EquippedItemData>()),
154154
VehicleData = VehicleData.From(new List<VehicleModel>()),
155155
ParsedBatchCells = new List<NitroxInt3>(),
156156
ServerStartTime = DateTime.Now
@@ -183,7 +183,7 @@ public World CreateWorld(PersistedWorldData pWorldData, ServerGameMode gameMode)
183183

184184
BaseManager = new BaseManager(pWorldData.BaseData.PartiallyConstructedPieces, pWorldData.BaseData.CompletedBasePieceHistory),
185185

186-
InventoryManager = new InventoryManager(pWorldData.WorldData.InventoryData.InventoryItems, pWorldData.WorldData.InventoryData.StorageSlotItems),
186+
InventoryManager = new InventoryManager(pWorldData.WorldData.InventoryData.InventoryItems, pWorldData.WorldData.InventoryData.StorageSlotItems, pWorldData.WorldData.InventoryData.Modules),
187187

188188
EscapePodManager = new EscapePodManager(pWorldData.WorldData.EscapePodData.EscapePods, randomStart, seed),
189189

0 commit comments

Comments
 (0)