1010using DCL . Diagnostics ;
1111using DCL . ECSComponents ;
1212using DCL . Interaction . Utility ;
13- using DCL . Optimization . Pools ;
1413using DCL . SDKComponents . TriggerArea . Components ;
1514using ECS . Abstract ;
1615using ECS . Groups ;
@@ -29,29 +28,57 @@ namespace DCL.SDKComponents.TriggerArea.Systems
2928 [ LogCategory ( ReportCategory . CHARACTER_TRIGGER_AREA ) ]
3029 public partial class TriggerAreaHandlerSystem : BaseUnityLoopSystem , IFinalizeWorldSystem
3130 {
31+ /// <summary>
32+ /// Value-type snapshot of all result data passed into the CRDT writer closure,
33+ /// avoiding shared pooled references that could be overwritten before deferred serialization.
34+ /// </summary>
35+ internal readonly struct ResultData
36+ {
37+ public readonly TriggerAreaEventType EventType ;
38+ public readonly uint TriggeredEntity ;
39+ public readonly uint Timestamp ;
40+ public readonly Decentraland . Common . Vector3 TriggeredEntityPosition ;
41+ public readonly Decentraland . Common . Quaternion TriggeredEntityRotation ;
42+ public readonly uint TriggerEntity ;
43+ public readonly uint TriggerLayers ;
44+ public readonly Decentraland . Common . Vector3 TriggerEntityPosition ;
45+ public readonly Decentraland . Common . Quaternion TriggerEntityRotation ;
46+ public readonly Decentraland . Common . Vector3 TriggerEntityScale ;
47+
48+ public ResultData (
49+ TriggerAreaEventType eventType , uint triggeredEntity , uint timestamp ,
50+ Decentraland . Common . Vector3 triggeredEntityPosition , Decentraland . Common . Quaternion triggeredEntityRotation ,
51+ uint triggerEntity , uint triggerLayers ,
52+ Decentraland . Common . Vector3 triggerEntityPosition , Decentraland . Common . Quaternion triggerEntityRotation ,
53+ Decentraland . Common . Vector3 triggerEntityScale )
54+ {
55+ EventType = eventType ;
56+ TriggeredEntity = triggeredEntity ;
57+ Timestamp = timestamp ;
58+ TriggeredEntityPosition = triggeredEntityPosition ;
59+ TriggeredEntityRotation = triggeredEntityRotation ;
60+ TriggerEntity = triggerEntity ;
61+ TriggerLayers = triggerLayers ;
62+ TriggerEntityPosition = triggerEntityPosition ;
63+ TriggerEntityRotation = triggerEntityRotation ;
64+ TriggerEntityScale = triggerEntityScale ;
65+ }
66+ }
67+
3268 private readonly World globalWorld ;
3369 private readonly IECSToCRDTWriter ecsToCRDTWriter ;
34- private readonly IComponentPool < PBTriggerAreaResult > triggerAreaResultPool ;
35- private readonly IComponentPool < PBTriggerAreaResult . Types . Trigger > triggerAreaResultTriggerPool ;
36- private readonly ISceneStateProvider sceneStateProvider ;
3770 private readonly IEntityCollidersSceneCache collidersSceneCache ;
3871 private readonly ISceneData sceneData ;
3972
4073 public TriggerAreaHandlerSystem (
4174 World world ,
4275 World globalWorld ,
4376 IECSToCRDTWriter ecsToCRDTWriter ,
44- IComponentPool < PBTriggerAreaResult > triggerAreaResultPool ,
45- IComponentPool < PBTriggerAreaResult . Types . Trigger > triggerAreaResultTriggerPool ,
46- ISceneStateProvider sceneStateProvider ,
4777 IEntityCollidersSceneCache collidersSceneCache ,
4878 ISceneData sceneData ) : base ( world )
4979 {
5080 this . globalWorld = globalWorld ;
5181 this . ecsToCRDTWriter = ecsToCRDTWriter ;
52- this . triggerAreaResultPool = triggerAreaResultPool ;
53- this . triggerAreaResultTriggerPool = triggerAreaResultTriggerPool ;
54- this . sceneStateProvider = sceneStateProvider ;
5582 this . collidersSceneCache = collidersSceneCache ;
5683 this . sceneData = sceneData ;
5784 }
@@ -155,41 +182,38 @@ private void PropagateResultComponent(in Entity triggerAreaEntity, in CRDTEntity
155182 triggerEntityScale = characterTransform . Transform . localScale . ToProtoVector ( ) ;
156183 }
157184
158- var resultComponent = triggerAreaResultPool . Get ( ) ;
159- resultComponent . EventType = eventType ;
160- resultComponent . TriggeredEntity = ( uint ) triggerAreaCRDTEntity . Id ;
161- resultComponent . Timestamp = incrementalTick ;
162- resultComponent . TriggeredEntityPosition = triggerAreaTransform . localPosition . ToProtoVector ( ) ;
163- resultComponent . TriggeredEntityRotation = triggerAreaTransform . localRotation . ToProtoQuaternion ( ) ;
164-
165- // 'Trigger' Entity (the entity that provokes the trigger event)
166- resultComponent . Trigger = triggerAreaResultTriggerPool . Get ( ) ;
167- resultComponent . Trigger . Layers = avatarEntity == Entity . Null ? ( uint ) entityInfo . SDKLayer : ( uint ) ColliderLayer . ClPlayer ;
168- resultComponent . Trigger . Position = triggerEntityPos ;
169- resultComponent . Trigger . Rotation = triggerEntityRot ;
170- resultComponent . Trigger . Scale = triggerEntityScale ;
185+ uint triggerLayers = avatarEntity == Entity . Null ? ( uint ) entityInfo . SDKLayer : ( uint ) ColliderLayer . ClPlayer ;
171186
187+ uint triggerEntity ;
172188 if ( avatarEntity != Entity . Null )
173- resultComponent . Trigger . Entity = globalWorld . TryGet ( avatarEntity , out PlayerCRDTEntity playerCrdtEntityComp ) ? ( uint ) playerCrdtEntityComp . CRDTEntity . Id : 999999 ;
189+ triggerEntity = globalWorld . TryGet ( avatarEntity , out PlayerCRDTEntity playerCrdtEntityComp ) ? ( uint ) playerCrdtEntityComp . CRDTEntity . Id : 999999 ;
174190 else
175- resultComponent . Trigger . Entity = ( uint ) entityInfo . SDKEntity . Id ;
191+ triggerEntity = ( uint ) entityInfo . SDKEntity . Id ;
176192
177- ecsToCRDTWriter . AppendMessage < PBTriggerAreaResult , ( PBTriggerAreaResult result , uint timestamp ) >
193+ var data = new ResultData (
194+ eventType , ( uint ) triggerAreaCRDTEntity . Id , incrementalTick ,
195+ triggerAreaTransform . localPosition . ToProtoVector ( ) , triggerAreaTransform . localRotation . ToProtoQuaternion ( ) ,
196+ triggerEntity , triggerLayers , triggerEntityPos , triggerEntityRot , triggerEntityScale ) ;
197+
198+ ecsToCRDTWriter . AppendMessage < PBTriggerAreaResult , ResultData >
178199 (
179200 prepareMessage : static ( pbTriggerAreaResult , data ) =>
180201 {
181- pbTriggerAreaResult . EventType = data . result . EventType ;
182- pbTriggerAreaResult . TriggeredEntity = data . result . TriggeredEntity ;
183- pbTriggerAreaResult . Timestamp = data . timestamp ;
184- pbTriggerAreaResult . TriggeredEntityRotation = data . result . TriggeredEntityRotation ;
185- pbTriggerAreaResult . TriggeredEntityPosition = data . result . TriggeredEntityPosition ;
186- pbTriggerAreaResult . Trigger = data . result . Trigger ;
202+ pbTriggerAreaResult . EventType = data . EventType ;
203+ pbTriggerAreaResult . TriggeredEntity = data . TriggeredEntity ;
204+ pbTriggerAreaResult . Timestamp = data . Timestamp ;
205+ pbTriggerAreaResult . TriggeredEntityPosition = data . TriggeredEntityPosition ;
206+ pbTriggerAreaResult . TriggeredEntityRotation = data . TriggeredEntityRotation ;
207+
208+ pbTriggerAreaResult . Trigger ??= new PBTriggerAreaResult . Types . Trigger ( ) ;
209+ pbTriggerAreaResult . Trigger . Entity = data . TriggerEntity ;
210+ pbTriggerAreaResult . Trigger . Layers = data . TriggerLayers ;
211+ pbTriggerAreaResult . Trigger . Position = data . TriggerEntityPosition ;
212+ pbTriggerAreaResult . Trigger . Rotation = data . TriggerEntityRotation ;
213+ pbTriggerAreaResult . Trigger . Scale = data . TriggerEntityScale ;
187214 } ,
188- triggerAreaCRDTEntity , ( int ) incrementalTick , ( resultComponent , incrementalTick )
215+ triggerAreaCRDTEntity , ( int ) incrementalTick , data
189216 ) ;
190-
191- triggerAreaResultTriggerPool . Release ( resultComponent . Trigger ) ;
192- triggerAreaResultPool . Release ( resultComponent ) ;
193217 }
194218
195219 [ Query ]
@@ -220,6 +244,8 @@ public void FinalizeComponents(in Query query)
220244 FinalizeComponentsQuery ( World ) ;
221245 }
222246
247+ protected override void OnDispose ( ) { }
248+
223249 private bool TryGetAvatarEntity ( Transform transform , out Entity entity )
224250 {
225251 entity = Entity . Null ;
@@ -229,7 +255,4 @@ private bool TryGetAvatarEntity(Transform transform, out Entity entity)
229255 return true ;
230256 }
231257 }
232- }
233-
234-
235-
258+ }
0 commit comments