@@ -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}
0 commit comments