Skip to content

Commit 0c02b8f

Browse files
committed
Fixed CustomItems being unregistered when dropped
1 parent 619d2c7 commit 0c02b8f

4 files changed

Lines changed: 32 additions & 80 deletions

File tree

UncomplicatedCustomItems.sln

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
Microsoft Visual Studio Solution File, Format Version 12.00
33
# Visual Studio Version 18
4-
VisualStudioVersion = 18.0.11010.61
4+
VisualStudioVersion = 18.3.11222.16 d18.3
55
MinimumVisualStudioVersion = 10.0.40219.1
66
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UncomplicatedCustomItems", "UncomplicatedCustomItems\UncomplicatedCustomItems.csproj", "{B39EE633-0EFE-42FC-B3E8-C6C4C86029E5}"
77
EndProject

UncomplicatedCustomItems/API/Features/SummonedCustomItem.cs

Lines changed: 30 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -46,20 +46,7 @@ public class SummonedCustomItem
4646
/// </summary>
4747
public static List<SummonedCustomItem> List { get; } = [];
4848

49-
/// <summary>
50-
/// Cache of all <see cref="SummonedCustomItem"/> instances mapped by their <see cref="Serial"/>.
51-
/// </summary>
52-
public static readonly ConcurrentDictionary<ushort, SummonedCustomItem> bySerial = new();
53-
54-
/// <summary>
55-
/// Cache of all <see cref="SummonedCustomItem"/> instances grouped by their owner's <see cref="Player.PlayerId"/>.
56-
/// </summary>
57-
public static readonly ConcurrentDictionary<int, ConcurrentBag<SummonedCustomItem>> byPlayerId = new();
58-
59-
/// <summary>
60-
/// HashSet for faster existence checks and removal operations
61-
/// </summary>
62-
private static readonly ConcurrentDictionary<ushort, byte> _activeSerials = new();
49+
private static readonly HashSet<ushort> _activeSerials = [];
6350

6451
/// <summary>
6552
/// Gets the list of items that can be managed by the function <see cref="HandleCustomAction"/>
@@ -141,7 +128,9 @@ public class SummonedCustomItem
141128
Pickup.Rotation = rotation;
142129

143130
SetProperties();
144-
AddToCollections(this);
131+
List.Add(this);
132+
_activeSerials.Add(this.Serial);
133+
145134
if (Item is FirearmItem firearm)
146135
StartAmmoRegen(firearm);
147136
}
@@ -159,23 +148,6 @@ public SummonedCustomItem(ICustomItem customItem, Exiled.API.Features.Player pla
159148

160149
public SummonedCustomItem(ICustomItem customItem, Exiled.API.Features.Player player, Item item) : this(customItem, Player.Get(player.Id), item, null) { }
161150
#endif
162-
163-
private static void AddToCollections(SummonedCustomItem sci)
164-
{
165-
List.Add(sci);
166-
bySerial[sci.Serial] = sci;
167-
_activeSerials[sci.Serial] = 0;
168-
169-
if (sci.Owner != null)
170-
{
171-
byPlayerId.AddOrUpdate(
172-
sci.Owner.PlayerId,
173-
[sci],
174-
(key, existingBag) => { existingBag.Add(sci); return existingBag; }
175-
);
176-
}
177-
}
178-
179151
public void SetProperties()
180152
{
181153
if (Item is not null)
@@ -251,12 +223,10 @@ public void SetProperties()
251223
break;
252224

253225
case CustomItemType.MicroHID when CustomItem.CustomData is MicroHIDData microData:
254-
{
255-
MicroHIDPickup microHID = (MicroHIDPickup)Pickup;
256-
Pickup.Base.Info.ItemId.TryGetTemplate<InventorySystem.Items.MicroHID.MicroHIDItem>(out var microHIDItem);
257-
microHIDItem.ItemSerial = microHID.Serial;
258-
microHIDItem.EnergyManager.ServerSetEnergy(microHIDItem.ItemSerial, microData.Energy);
259-
}
226+
MicroHIDPickup microHID = (MicroHIDPickup)Pickup;
227+
Pickup.Base.Info.ItemId.TryGetTemplate<InventorySystem.Items.MicroHID.MicroHIDItem>(out var microHIDItem);
228+
microHIDItem.ItemSerial = microHID.Serial;
229+
microHIDItem.EnergyManager.ServerSetEnergy(microHIDItem.ItemSerial, microData.Energy);
260230
break;
261231

262232
case CustomItemType.ParticleDisruptor when CustomItem.CustomData is ParticleDisruptorData pdData:
@@ -1038,17 +1008,7 @@ internal bool HandleCustomAction(Item item)
10381008
public void Destroy()
10391009
{
10401010
List.Remove(this);
1041-
bySerial.TryRemove(Serial, out _);
1042-
_activeSerials.TryRemove(Serial, out _);
1043-
1044-
if (Owner?.PlayerId != null && byPlayerId.TryGetValue(Owner.PlayerId, out var bag))
1045-
{
1046-
ConcurrentBag<SummonedCustomItem> newBag = new(bag.Where(sci => sci.Serial != Serial));
1047-
if (newBag.IsEmpty)
1048-
byPlayerId.TryRemove(Owner.PlayerId, out _);
1049-
else
1050-
byPlayerId[Owner.PlayerId] = newBag;
1051-
}
1011+
_activeSerials.Remove(Serial);
10521012

10531013
if (IsPickup)
10541014
Pickup?.Destroy();
@@ -1065,45 +1025,49 @@ public void Destroy()
10651025

10661026
public static bool TryGet(ushort serial, out SummonedCustomItem item)
10671027
{
1068-
if (!_activeSerials.ContainsKey(serial))
1028+
if (!_activeSerials.Contains(serial))
10691029
{
10701030
item = null;
10711031
return false;
10721032
}
10731033

1074-
return bySerial.TryGetValue(serial, out item);
1034+
item = List.FirstOrDefault(sci => sci.Serial == serial);
1035+
return item != null;
10751036
}
10761037

1077-
public static SummonedCustomItem Get(ushort serial) => _activeSerials.ContainsKey(serial) && bySerial.TryGetValue(serial, out var item) ? item : null;
1078-
1079-
public static SummonedCustomItem Get(Player owner, ushort serial)
1038+
public static SummonedCustomItem Get(ushort serial)
10801039
{
1081-
if (owner?.PlayerId == null || !_activeSerials.ContainsKey(serial))
1040+
if (!_activeSerials.Contains(serial))
10821041
return null;
10831042

1084-
if (!byPlayerId.TryGetValue(owner.PlayerId, out var bag))
1085-
return null;
1086-
1087-
return bag.FirstOrDefault(sci => sci.Serial == serial);
1043+
return List.FirstOrDefault(sci => sci.Serial == serial);
10881044
}
10891045

1090-
public static List<SummonedCustomItem> Get(ItemType item)
1046+
public static SummonedCustomItem Get(Player owner, ushort serial)
10911047
{
1092-
List<SummonedCustomItem> result = [];
1093-
List<SummonedCustomItem> items = List.Count > 100 ? List.AsParallel().Where(sci => sci.CustomItem.Item == item).ToList() : List.Where(sci => sci.CustomItem.Item == item).ToList();
1048+
if (owner?.PlayerId == null)
1049+
return null;
10941050

1095-
return items;
1051+
if (!_activeSerials.Contains(serial))
1052+
return null;
1053+
1054+
return List.FirstOrDefault(sci => sci.Serial == serial && sci.Owner?.PlayerId == owner.PlayerId);
10961055
}
10971056

10981057
public static List<SummonedCustomItem> Get(Player owner)
10991058
{
11001059
if (owner?.PlayerId == null)
11011060
return [];
11021061

1103-
if (byPlayerId.TryGetValue(owner.PlayerId, out var bag))
1104-
return bag.ToList();
1062+
return List.Where(sci => sci.Owner?.PlayerId == owner.PlayerId).ToList();
1063+
}
1064+
1065+
public static List<SummonedCustomItem> Get(ItemType item)
1066+
{
1067+
List<SummonedCustomItem> result = [];
1068+
List<SummonedCustomItem> items = List.Count > 100 ? List.AsParallel().Where(sci => sci.CustomItem.Item == item).ToList() : List.Where(sci => sci.CustomItem.Item == item).ToList();
11051069

1106-
return [];
1070+
return items;
11071071
}
11081072
}
11091073
}

UncomplicatedCustomItems/Events/ServerHandler.cs

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ public static void Register()
3232
ServerEvent.PickupCreated += OnPickupCreation;
3333
ServerEvent.RoundStarted += SpawnItemsOnRoundStarted;
3434
ServerEvent.ProjectileExploded += OnDetonated;
35-
ItemPickupBase.OnBeforePickupDestroyed += OnPickupDestroying;
3635
}
3736

3837
public static void Unregister()
@@ -43,17 +42,6 @@ public static void Unregister()
4342
ServerEvent.PickupCreated -= OnPickupCreation;
4443
ServerEvent.RoundStarted -= SpawnItemsOnRoundStarted;
4544
ServerEvent.ProjectileExploded -= OnDetonated;
46-
ItemPickupBase.OnBeforePickupDestroyed -= OnPickupDestroying;
47-
}
48-
49-
private static void OnPickupDestroying(ItemPickupBase pickupBase)
50-
{
51-
Pickup pickup = Pickup.Get(pickupBase);
52-
if (Utilities.TryGetSummonedCustomItem(pickup.Serial, out var item))
53-
item.Destroy();
54-
55-
if (SummonedAPICustomItem.TryGet(pickup.Serial, out var api))
56-
api.Destroy();
5745
}
5846

5947
private static void OnDetonated(ProjectileExplodedEventArgs ev)

UncomplicatedCustomItems/Plugin.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public class Plugin : Plugin<Config>
5252
#else
5353
public override Version RequiredApiVersion { get; } = LabApi.Features.LabApiProperties.CurrentVersion;
5454
#endif
55-
public override Version Version { get; } = new(4, 0, 1);
55+
public override Version Version { get; } = new(4, 0, 2);
5656

5757
public Assembly Assembly => Assembly.GetExecutingAssembly();
5858
#if EXILED

0 commit comments

Comments
 (0)