13
13
using SS3D . Systems . Inventory . Containers ;
14
14
using SS3D . Systems . Inventory . Interactions ;
15
15
using SS3D . Systems . Selection ;
16
+ using System . Linq ;
16
17
using UnityEngine ;
17
18
using UnityEngine . Serialization ;
18
19
#if UNITY_EDITOR
@@ -68,16 +69,42 @@ public class Item : InteractionSource, IInteractionTarget, IWorldObjectAsset
68
69
[ SyncObject ]
69
70
private readonly SyncList < Trait > _traits = new ( ) ;
70
71
72
+ /// <summary>
73
+ /// Where the item is stored
74
+ /// </summary>
71
75
[ SyncVar ]
72
76
private AttachedContainer _container ;
73
77
74
78
public string Name => _name ;
75
79
76
80
public ReadOnlyCollection < Trait > Traits => ( ( List < Trait > ) _traits . Collection ) . AsReadOnly ( ) ;
77
81
82
+ /// <summary>
83
+ /// Where the item is stored
84
+ /// </summary>
78
85
public AttachedContainer Container => _container ;
79
86
80
87
private bool _initialised = false ;
88
+
89
+ /// <summary>
90
+ /// All colliders, related to the item, except of colliders, related to stored items
91
+ /// </summary>
92
+ private Collider [ ] _nativeColliders ;
93
+ /// <summary>
94
+ /// All colliders, related to the item, except of colliders, related to stored items
95
+ /// </summary>
96
+ public Collider [ ] NativeColliders
97
+ {
98
+ get
99
+ {
100
+ if ( _nativeColliders == null )
101
+ {
102
+ _nativeColliders = GetNativeColliders ( ) ;
103
+ }
104
+ return _nativeColliders ;
105
+ }
106
+ set => _nativeColliders = value ;
107
+ }
81
108
82
109
public WorldObjectAssetReference Asset
83
110
{
@@ -118,7 +145,7 @@ public Sprite ItemSprite
118
145
get => InventorySprite ( ) ;
119
146
set => _sprite = value ;
120
147
}
121
-
148
+
122
149
protected override void OnStart ( )
123
150
{
124
151
base . OnStart ( ) ;
@@ -133,6 +160,23 @@ protected override void OnStart()
133
160
{
134
161
_rigidbody . isKinematic = true ;
135
162
}
163
+
164
+ _nativeColliders ??= GetNativeColliders ( ) ;
165
+ Debug . Log ( "Start " + name ) ;
166
+ }
167
+
168
+ /// <summary>
169
+ /// Get all colliders, related to the item, except of colliders, related to stored items
170
+ /// </summary>
171
+ private Collider [ ] GetNativeColliders ( )
172
+ {
173
+ List < Collider > collidersToExcept = new ( ) ;
174
+ AttachedContainer [ ] containers = GetComponentsInChildren < AttachedContainer > ( ) ;
175
+ foreach ( Item item in containers . SelectMany ( container => container . Items ) )
176
+ {
177
+ collidersToExcept . AddRange ( item . GetComponentsInChildren < Collider > ( ) ) ;
178
+ }
179
+ return GetComponentsInChildren < Collider > ( ) . Except ( collidersToExcept ) . ToArray ( ) ;
136
180
}
137
181
138
182
public override void OnStartServer ( )
@@ -176,11 +220,7 @@ public void Freeze()
176
220
{
177
221
_rigidbody . isKinematic = true ;
178
222
}
179
- var itemCollider = GetComponent < Collider > ( ) ;
180
- if ( itemCollider != null )
181
- {
182
- itemCollider . enabled = false ;
183
- }
223
+ ToggleCollider ( false ) ;
184
224
}
185
225
186
226
/// <summary>
@@ -194,13 +234,21 @@ public void Unfreeze()
194
234
if ( IsServer )
195
235
_rigidbody . isKinematic = false ;
196
236
}
197
- var itemCollider = GetComponent < Collider > ( ) ;
198
- if ( itemCollider != null )
199
- {
200
- itemCollider . enabled = true ;
201
- }
237
+ ToggleCollider ( true ) ;
202
238
}
203
239
240
+ /// <summary>
241
+ /// Enable or disable all colliders related to the item. Does not touch any colliders that would belong to stored items (if there are any).
242
+ /// TODO : might want to replace GetComponentsInChildren with a manual setup of the container list.
243
+ /// </summary>
244
+ [ ServerOrClient ]
245
+ protected virtual void ToggleCollider ( bool isEnable )
246
+ {
247
+ foreach ( Collider collider in NativeColliders )
248
+ {
249
+ collider . enabled = isEnable ;
250
+ }
251
+ }
204
252
205
253
/// <param name="visible">Should the item be visible</param>
206
254
[ ServerOrClient ]
@@ -252,7 +300,7 @@ public bool IsInContainer()
252
300
public string Describe ( )
253
301
{
254
302
string traits = "" ;
255
- foreach ( var trait in _traits )
303
+ foreach ( Trait trait in _traits )
256
304
{
257
305
traits += trait . Name + " " ;
258
306
}
@@ -274,13 +322,11 @@ public bool HasTrait(Trait trait)
274
322
[ Server ]
275
323
public void SetContainer ( AttachedContainer newContainer )
276
324
{
277
- if ( _container == newContainer )
278
- {
279
- return ;
280
- }
281
325
_container = newContainer ;
282
326
}
283
327
328
+
329
+
284
330
// Generate preview of the same object, but without stored items.
285
331
[ ServerOrClient ]
286
332
public Sprite GenerateIcon ( )
0 commit comments