Skip to content

Commit 9c50876

Browse files
SpaceMonkeyy86killzoms
authored andcommitted
Fix items unequipping when rejoining the server (#2196)
* Fix items unequipping when rejoining the server * Cleanup equipment processor * Cleanup EntityMetadataProcessor * Tweak a log message * Remove unused import * Remove dead code * Remove more dead code (at least I hope it's dead) * Use better dictionary comparison in WorldPersistenceTest * Rename ProcessMetadata to TryProcessMetadata * Remove 1.8 upgrade script since it is impossible to migrate save data from 1.7
1 parent 4a4a4e6 commit 9c50876

18 files changed

+102
-500
lines changed

Nitrox.Test/Server/Serialization/WorldPersistenceTest.cs

+5-25
Original file line numberDiff line numberDiff line change
@@ -57,29 +57,6 @@ public void WorldDataTest(PersistedWorldData worldDataAfter, string serializerNa
5757
StoryTimingTest(worldData.WorldData.GameData.StoryTiming, worldDataAfter.WorldData.GameData.StoryTiming);
5858
}
5959

60-
private static void ItemDataTest(ItemData itemData, ItemData itemDataAfter)
61-
{
62-
Assert.AreEqual(itemData.ContainerId, itemDataAfter.ContainerId);
63-
Assert.AreEqual(itemData.ItemId, itemDataAfter.ItemId);
64-
Assert.IsTrue(itemData.SerializedData.SequenceEqual(itemDataAfter.SerializedData));
65-
66-
switch (itemData)
67-
{
68-
case BasicItemData _ when itemDataAfter is BasicItemData _:
69-
break;
70-
case EquippedItemData equippedItemData when itemDataAfter is EquippedItemData equippedItemDataAfter:
71-
Assert.AreEqual(equippedItemData.Slot, equippedItemDataAfter.Slot);
72-
Assert.AreEqual(equippedItemData.TechType, equippedItemDataAfter.TechType);
73-
break;
74-
case PlantableItemData plantableItemData when itemDataAfter is PlantableItemData plantableItemDataAfter:
75-
Assert.AreEqual(plantableItemData.PlantedGameTime, plantableItemDataAfter.PlantedGameTime);
76-
break;
77-
default:
78-
Assert.Fail($"Runtime types of {nameof(ItemData)} where not equal");
79-
break;
80-
}
81-
}
82-
8360
private static void PDAStateTest(PDAStateData pdaState, PDAStateData pdaStateAfter)
8461
{
8562
Assert.IsTrue(pdaState.KnownTechTypes.SequenceEqual(pdaStateAfter.KnownTechTypes));
@@ -129,8 +106,11 @@ public void PlayerDataTest(PersistedWorldData worldDataAfter, string serializerN
129106

130107
Assert.IsTrue(playerData.UsedItems.SequenceEqual(playerDataAfter.UsedItems));
131108
Assert.IsTrue(playerData.QuickSlotsBindingIds.SequenceEqual(playerDataAfter.QuickSlotsBindingIds));
132-
AssertHelper.IsListEqual(playerData.EquippedItems.OrderBy(x => x.ItemId), playerDataAfter.EquippedItems.OrderBy(x => x.ItemId), ItemDataTest);
133-
AssertHelper.IsListEqual(playerData.Modules.OrderBy(x => x.ItemId), playerDataAfter.Modules.OrderBy(x => x.ItemId), ItemDataTest);
109+
AssertHelper.IsDictionaryEqual(playerData.EquippedItems, playerDataAfter.EquippedItems, (keyValuePair, keyValuePairAfter) =>
110+
{
111+
Assert.AreEqual(keyValuePair.Key, keyValuePairAfter.Key);
112+
Assert.AreEqual(keyValuePair.Value, keyValuePairAfter.Value);
113+
});
134114

135115
Assert.AreEqual(playerData.Id, playerDataAfter.Id);
136116
Assert.AreEqual(playerData.SpawnPosition, playerDataAfter.SpawnPosition);

NitroxClient/GameLogic/Containers/ContainerAddItemPostProcessor.cs

-49
This file was deleted.

NitroxClient/GameLogic/Containers/NoOpContainerAddItemPostProcessor.cs

-17
This file was deleted.

NitroxClient/GameLogic/Containers/PlantableContainerAddItemPostProcessor.cs

-80
This file was deleted.

NitroxClient/GameLogic/Helper/SerializationHelper.cs

-62
This file was deleted.

NitroxClient/GameLogic/InitialSync/EquippedItemInitialSyncProcessor.cs

+23-29
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
using NitroxClient.GameLogic.InitialSync.Abstract;
77
using NitroxClient.MonoBehaviours;
88
using NitroxClient.Unity.Helper;
9-
using NitroxModel.DataStructures.GameLogic;
9+
using NitroxModel.DataStructures;
1010
using NitroxModel.DataStructures.Util;
1111
using NitroxModel.Packets;
1212
using UnityEngine;
@@ -16,10 +16,12 @@ namespace NitroxClient.GameLogic.InitialSync;
1616
public class EquippedItemInitialSyncProcessor : InitialSyncProcessor
1717
{
1818
private readonly IPacketSender packetSender;
19+
private readonly Entities entities;
1920

20-
public EquippedItemInitialSyncProcessor(IPacketSender packetSender)
21+
public EquippedItemInitialSyncProcessor(IPacketSender packetSender, Entities entities)
2122
{
2223
this.packetSender = packetSender;
24+
this.entities = entities;
2325

2426
AddDependency<PlayerInitialSyncProcessor>();
2527
AddDependency<RemotePlayerInitialSyncProcessor>();
@@ -32,44 +34,36 @@ public override IEnumerator Process(InitialPlayerSync packet, WaitScreen.ManualW
3234

3335
using (PacketSuppressor<EntitySpawnedByClient>.Suppress())
3436
{
35-
foreach (EquippedItemData equippedItem in packet.EquippedItems)
37+
foreach (KeyValuePair<string, NitroxId> equippedItem in packet.EquippedItems)
3638
{
37-
waitScreenItem.SetProgress(totalEquippedItemsDone, packet.EquippedItems.Count);
39+
string slot = equippedItem.Key;
40+
NitroxId id = equippedItem.Value;
3841

39-
GameObject gameObject = SerializationHelper.GetGameObject(equippedItem.SerializedData);
40-
NitroxEntity.SetNewId(gameObject, equippedItem.ItemId);
42+
waitScreenItem.SetProgress(totalEquippedItemsDone, packet.EquippedItems.Count);
4143

44+
GameObject gameObject = NitroxEntity.RequireObjectFrom(id);
4245
Pickupable pickupable = gameObject.RequireComponent<Pickupable>();
43-
Optional<GameObject> opGameObject = NitroxEntity.GetObjectFrom(equippedItem.ContainerId);
4446

45-
if (opGameObject.HasValue)
46-
{
47-
GameObject owner = opGameObject.Value;
47+
GameObject player = Player.mainObject;
48+
Optional<Equipment> opEquipment = EquipmentHelper.FindEquipmentComponent(player);
4849

49-
Optional<Equipment> opEquipment = EquipmentHelper.FindEquipmentComponent(owner);
50-
51-
if (opEquipment.HasValue)
52-
{
53-
Equipment equipment = opEquipment.Value;
54-
InventoryItem inventoryItem = new(pickupable);
55-
inventoryItem.container = equipment;
56-
inventoryItem.item.Reparent(equipment.tr);
50+
if (opEquipment.HasValue)
51+
{
52+
Equipment equipment = opEquipment.Value;
53+
InventoryItem inventoryItem = new(pickupable);
54+
inventoryItem.container = equipment;
55+
inventoryItem.item.Reparent(equipment.tr);
5756

58-
Dictionary<string, InventoryItem> itemsBySlot = equipment.equipment;
59-
itemsBySlot[equippedItem.Slot] = inventoryItem;
57+
Dictionary<string, InventoryItem> itemsBySlot = equipment.equipment;
58+
itemsBySlot[slot] = inventoryItem;
6059

61-
equipment.UpdateCount(pickupable.GetTechType(), true);
62-
Equipment.SendEquipmentEvent(pickupable, 0, owner, equippedItem.Slot);
63-
equipment.NotifyEquip(equippedItem.Slot, inventoryItem);
64-
}
65-
else
66-
{
67-
Log.Info($"Could not find equipment type for {gameObject.name}");
68-
}
60+
equipment.UpdateCount(pickupable.GetTechType(), true);
61+
Equipment.SendEquipmentEvent(pickupable, 0, player, slot);
62+
equipment.NotifyEquip(slot, inventoryItem);
6963
}
7064
else
7165
{
72-
Log.Info($"Could not find Container for {gameObject.name}");
66+
Log.Info($"Could not find equipment type for {gameObject.name}");
7367
}
7468

7569
totalEquippedItemsDone++;

NitroxModel/DataStructures/GameLogic/BasicItemData.cs

-17
This file was deleted.

NitroxModel/DataStructures/GameLogic/EquippedItemData.cs

-34
This file was deleted.

0 commit comments

Comments
 (0)