Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_ScenarioFrameworkTaskDeliver.c
Go to the documentation of this file.
4
5/*
6 TASK DELIVERY STATES
7 -----------------------------------------
8 | Delivery | Item | Item |
9 | Point exists | possesed | Dropped |
10 -----------------------------------------
11 | 0 | 0 | 0 | 0
12 -----------------------------------------
13 | 0 | 0 | 1 | 1
14 -----------------------------------------
15 | 0 | 1 | 0 | 2
16 -----------------------------------------
17 | 1 | 0 | 0 | 4
18 -----------------------------------------
19 | 1 | 0 | 1 | 5
20 -----------------------------------------
21 | 1 | 1 | 0 | 6
22 -----------------------------------------
23*/
24
31
32class SCR_TaskDeliver : SCR_ScenarioFrameworkTask
33{
34 protected string m_sDeliveryTriggerName;
35
36 protected int m_iObjectState = 0; //see the table above
37 protected SCR_BaseTriggerEntity m_TriggerDeliver;
38 protected bool m_bDeliveryItemFound;
39 protected bool m_bTaskPositionUpdated;
41
42 //------------------------------------------------------------------------------------------------
45 {
46 return m_iObjectState;
47 }
48
49 //------------------------------------------------------------------------------------------------
52 {
53 if (!GetGame().GetWorld())
54 return;
55
56 if (m_sDeliveryTriggerName.IsEmpty())
57 {
58 Print("ScenarioFramework: Task Deliver trigger is set with empty attribute SetDeliveryTrigger", LogLevel.ERROR);
59 return;
60 }
61
62 IEntity entity = GetGame().GetWorld().FindEntityByName(m_sDeliveryTriggerName);
63 if (!entity)
64 return;
65
66 SetDeliveryTrigger(SCR_BaseTriggerEntity.Cast(entity));
67 }
68
69 //------------------------------------------------------------------------------------------------
71 void SetDeliveryTrigger(SCR_BaseTriggerEntity trigger)
72 {
73 if (!trigger)
74 return;
75
76 m_TriggerDeliver = trigger;
77 m_TriggerDeliver.GetOnActivate().Remove(OnDeliveryTriggerActivated);
78 m_TriggerDeliver.GetOnActivate().Insert(OnDeliveryTriggerActivated);
79 }
80
81 //------------------------------------------------------------------------------------------------
83 void SetTriggerNameToDeliver(string triggerName)
84 {
85 if (triggerName.IsEmpty())
86 {
87 Print("ScenarioFramework: Task Deliver trigger is set with empty attribute SetTriggerNameToDeliver", LogLevel.ERROR);
88 return;
89 }
90
91 m_sDeliveryTriggerName = triggerName;
92 }
93
94 //------------------------------------------------------------------------------------------------
97 {
99 }
100
101 //------------------------------------------------------------------------------------------------
104 {
105 if (!m_Asset)
106 return;
107
108 array<IEntity> entitiesInside = {};
109 array<SCR_ChimeraCharacter> chimeraCharacters = {};
110 trigger.GetEntitiesInside(entitiesInside);
111 foreach (IEntity entity : entitiesInside)
112 {
113 if (entity == m_Asset)
114 {
115 m_TriggerDeliver.GetOnActivate().Remove(OnDeliveryTriggerActivated);
116 m_LayerTask.ProcessLayerTaskState(SCR_ETaskState.COMPLETED);
117 return;
118 }
119
120 if (SCR_ChimeraCharacter.Cast(entity))
121 chimeraCharacters.Insert(SCR_ChimeraCharacter.Cast(entity))
122 }
123
124 foreach (SCR_ChimeraCharacter character : chimeraCharacters)
125 {
127 if (!inventoryComponent)
128 continue;
129
130 if (inventoryComponent.Contains(m_Asset))
131 {
132 m_TriggerDeliver.GetOnActivate().Remove(OnDeliveryTriggerActivated);
133 m_LayerTask.ProcessLayerTaskState(SCR_ETaskState.COMPLETED);
134 break;
135 }
136 }
137 }
138
139 //------------------------------------------------------------------------------------------------
143 void OnObjectPossessed(IEntity item, BaseInventoryStorageComponent pStorageOwner)
144 {
145 if(!item || item != m_Asset)
146 return;
147
150 {
152 m_LayerTask.ProcessLayerTaskState(SCR_ETaskState.PROGRESSED);
153 }
154 }
155
156 //------------------------------------------------------------------------------------------------
160 void OnObjectDropped(IEntity item, BaseInventoryStorageComponent pStorageOwner)
161 {
162 if(!item || item != m_Asset)
163 return;
164
165 m_LayerTask.ProcessLayerTaskState(SCR_ETaskState.PROGRESSED);
167 }
168
169 //------------------------------------------------------------------------------------------------
172 void UpdateTaskTitleAndDescription(int iPossessed = -1)
173 {
174 if (iPossessed == -1)
175 {
176 //the request comes from outside (most likely the Delivery point has been created)
177 //check if the item has been already possessed or not
178 if (m_iObjectState & 0x01)
179 iPossessed = 1;
180 else
181 iPossessed = 0;
182 }
183
184 //Decide based on the task state - see the table on top of the class
185 if (!m_TriggerDeliver)
186 {
187 //delivery point still doesn't exist
188 if (iPossessed == 1)
189 {
190 m_iObjectState = 1;
191 SetTaskUIVisibility(SCR_ETaskUIVisibility.LIST_ONLY);
192 }
193 else
194 {
195 //dropped
196 m_iObjectState = 2;
199 }
200 }
201 else
202 {
203 if (iPossessed == 1)
204 {
205 m_iObjectState = 5;
206 m_LayerTask.m_TaskSystem.MoveTask(this, m_TriggerDeliver.GetOrigin());
207 }
208 else
209 {
210 //dropped
211 m_iObjectState = 6;
214 }
215 }
216
217 if (!m_LayerTask)
218 return;
219
220 SCR_ScenarioFrameworkSlotTask subject = m_LayerTask.GetSlotTask();
221 if (!subject)
222 return;
223
224 if (GetTaskName() != subject.GetTaskTitle(m_iObjectState))
225 SetTaskName(subject.GetTaskTitle(m_iObjectState));
226
227 if (GetTaskDescription() != subject.GetTaskDescription(m_iObjectState))
228 SetTaskDescription(subject.GetTaskDescription(m_iObjectState));
229
230 if (m_iObjectState != 1)
231 SetTaskUIVisibility(SCR_ETaskUIVisibility.ALL);
232 }
233
234 //------------------------------------------------------------------------------------------------
236 protected void UpdateDroppedTaskMarker()
237 {
239 SCR_ScenarioFrameworkLayerTaskDeliver layerTaskDeliver = SCR_ScenarioFrameworkLayerTaskDeliver.Cast(m_LayerTask);
240 if (!layerTaskDeliver)
241 {
242 Print("ScenarioFramework: Task Deliver failed to access LayerTask", LogLevel.ERROR);
243 return;
244 }
245
246 //We want to delay position movement of the Task marker on the map by given time
247 SCR_ScenarioFrameworkSystem.GetCallQueuePausable().CallLater(MoveTaskMarkerPosition, 1000 * layerTaskDeliver.GetIntelMapMarkerUpdateDelay(), false);
248 }
249
250 //------------------------------------------------------------------------------------------------
252 protected void MoveTaskMarkerPosition()
253 {
255 if (m_Asset)
256 m_LayerTask.m_TaskSystem.MoveTask(this, m_Asset.GetOrigin());
257 else
258 Print("ScenarioFramework: Task Deliver does not have m_Asset properly assigned for MoveTaskMarkerPosition", LogLevel.ERROR);
259 }
260
261 //------------------------------------------------------------------------------------------------
266 {
267 EventHandlerManagerComponent eventHandlerMgr;
268 InventoryItemComponent inventoryComponent;
269 IEntity owner;
270 IEntity rootOwner;
271 if (oldSlot)
272 {
273 owner = oldSlot.GetOwner();
274 rootOwner = oldSlot.GetOwner().GetRootParent();
275
276 //Handles the case when for example item was inserted into the character inventory somewhere
277 eventHandlerMgr = EventHandlerManagerComponent.Cast(owner.FindComponent(EventHandlerManagerComponent));
278 if (eventHandlerMgr)
279 eventHandlerMgr.RemoveScriptHandler("OnDestroyed", this, OnDestroyed);
280
281 //Handles the case when for example item was inserted into a backpack that was already in a vehicle
282 if (owner != rootOwner)
283 {
284 eventHandlerMgr = EventHandlerManagerComponent.Cast(rootOwner.FindComponent(EventHandlerManagerComponent));
285 if (eventHandlerMgr)
286 eventHandlerMgr.RemoveScriptHandler("OnDestroyed", this, OnDestroyed);
287
288 //Handles possible revert of case prevention where GarbageSystem might delete root entity
290 {
291 HandleOldSlotGC(rootOwner);
292 }
293 }
294 else
295 {
296 HandleOldSlotGC(owner);
297 }
298
299 //Handles the case when for example item was inserted into a backpack and then this backpack was inserted into a vehicle
300 inventoryComponent = InventoryItemComponent.Cast(owner.FindComponent(InventoryItemComponent));
301 if (inventoryComponent)
302 inventoryComponent.m_OnParentSlotChangedInvoker.Remove(OnItemCarrierChanged);
303 }
304
305 if (newSlot)
306 {
307 owner = newSlot.GetOwner();
308 rootOwner = newSlot.GetOwner().GetRootParent();
309
310 //Handles the case when for example item is inserted into the character inventory somewhere
311 eventHandlerMgr = EventHandlerManagerComponent.Cast(owner.FindComponent(EventHandlerManagerComponent));
312 if (eventHandlerMgr)
313 eventHandlerMgr.RegisterScriptHandler("OnDestroyed", this, OnDestroyed);
314
315 //Handles the case when for example item is inserted into a backpack that is already in a vehicle
316 if (owner != rootOwner)
317 {
318 eventHandlerMgr = EventHandlerManagerComponent.Cast(rootOwner.FindComponent(EventHandlerManagerComponent));
319 if (eventHandlerMgr)
320 eventHandlerMgr.RegisterScriptHandler("OnDestroyed", this, OnDestroyed);
321
322 HandleNewSlotGC(rootOwner);
323 }
324 else
325 {
326 HandleNewSlotGC(owner);
327 }
328
329 //Handles the case when for example item is inserted into a backpack and then this backpack is inserted into a vehicle
330 inventoryComponent = InventoryItemComponent.Cast(owner.FindComponent(InventoryItemComponent));
331 if (inventoryComponent)
332 {
333 inventoryComponent.m_OnParentSlotChangedInvoker.Insert(OnItemCarrierChanged);
334 }
335 }
336 }
337
338 //------------------------------------------------------------------------------------------------
340 protected void HandleNewSlotGC(IEntity entity)
341 {
343 if (!garbageSystem)
344 return;
345
346 if (garbageSystem.IsInserted(entity))
348 else
350
351 garbageSystem.UpdateBlacklist(entity, true);
352 }
353
354 //------------------------------------------------------------------------------------------------
356 protected void HandleOldSlotGC(IEntity entity)
357 {
359 if (garbageSystem && m_eGarbageCollectionStatus == SCR_EScenarioFrameworkItemGCState.NOT_EXCLUDED)
360 {
361 garbageSystem.UpdateBlacklist(entity, false);
362 garbageSystem.Insert(entity);
363 }
364 }
365
366 //------------------------------------------------------------------------------------------------
368 protected void OnDestroyed(IEntity destroyedEntity)
369 {
370 if (!destroyedEntity)
371 return;
372
373 if (!m_Asset)
374 return;
375
376 InventoryItemComponent invComp = InventoryItemComponent.Cast(m_Asset.FindComponent(InventoryItemComponent));
377 if (!invComp)
378 return;
379
380 InventoryStorageSlot parentSlot = invComp.GetParentSlot();
381 if (!parentSlot)
382 return;
383
385 if (!inventoryComponent)
386 return;
387
388 if (!inventoryComponent.Contains(m_Asset))
389 return;
390
391 inventoryComponent.TryRemoveItemFromStorage(m_Asset, parentSlot.GetStorage());
392
394 array<IEntity> excludedEntities = {};
395 excludedEntities.Insert(destroyedEntity);
396 excludedEntities.Insert(m_Asset);
397
398 ChimeraCharacter character = ChimeraCharacter.Cast(destroyedEntity);
399 if (character && character.IsInVehicle())
400 {
401 CompartmentAccessComponent compartmentAccess = character.GetCompartmentAccessComponent();
402 if (compartmentAccess)
403 {
404 BaseCompartmentSlot compartmentSlot = compartmentAccess.GetCompartment();
405 if (compartmentSlot)
406 {
407 IEntity vehicle = compartmentSlot.GetOwner();
408 excludedEntities.Insert(vehicle);
409 }
410 }
411 }
412
413 SCR_TerrainHelper.SnapToGeometry(position, m_Asset.GetOrigin(), excludedEntities, m_Asset.GetWorld());
414
415 m_Asset.SetOrigin(position);
416 m_Asset.Update();
417 }
418
419 //------------------------------------------------------------------------------------------------
421 protected void OnDisconnected(int iPlayerID)
422 {
423 IEntity player = GetGame().GetPlayerManager().GetPlayerControlledEntity(iPlayerID);
424 if (!player)
425 return;
426
427 OnDestroyed(player);
428 }
429
430 //------------------------------------------------------------------------------------------------
434 protected void RegisterPlayer(int iPlayerID, IEntity playerEntity)
435 {
436 IEntity player = GetGame().GetPlayerManager().GetPlayerControlledEntity(iPlayerID);
437 if (!player)
438 return;
439
440 SCR_InventoryStorageManagerComponent inventoryComponent = SCR_InventoryStorageManagerComponent.Cast(player.FindComponent(SCR_InventoryStorageManagerComponent));
441 if (!inventoryComponent)
442 return;
443
444 inventoryComponent.m_OnItemAddedInvoker.Insert(OnObjectPossessed);
445 inventoryComponent.m_OnItemRemovedInvoker.Insert(OnObjectDropped);
446
447 EventHandlerManagerComponent EventHandlerMgr = EventHandlerManagerComponent.Cast(player.FindComponent(EventHandlerManagerComponent));
448 if (EventHandlerMgr)
449 EventHandlerMgr.RegisterScriptHandler("OnDestroyed", this, OnDestroyed);
450 }
451
452 //------------------------------------------------------------------------------------------------
455 override void HookTaskAsset(IEntity object)
456 {
457 if (!object)
458 return;
459
460 super.HookTaskAsset(object);
461
462 if (!m_Asset)
463 return;
464
465 InventoryItemComponent invComp = InventoryItemComponent.Cast(m_Asset.FindComponent(InventoryItemComponent));
466 if (!invComp)
467 return;
468
469 invComp.m_OnParentSlotChangedInvoker.Insert(OnItemCarrierChanged);
470
471 array<int> aPlayerIDs = {};
472 int iNrOfPlayersConnected = GetGame().GetPlayerManager().GetPlayers(aPlayerIDs);
473
474 foreach (int i : aPlayerIDs)
475 {
476 RegisterPlayer(i, null);
477 }
478
480 if (!gameMode)
481 return;
482
483 gameMode.GetOnPlayerSpawned().Remove(RegisterPlayer);
484 gameMode.GetOnPlayerSpawned().Insert(RegisterPlayer);
485 gameMode.GetOnPlayerDisconnected().Remove(OnDisconnected);
486 gameMode.GetOnPlayerDisconnected().Insert(OnDisconnected);
487
488 }
489
490 //------------------------------------------------------------------------------------------------
493 {
495 }
496}
ArmaReforgerScripted GetGame()
Definition game.c:1398
enum SCR_EAICombatMoveRequestState UNDEFINED
SCR_BaseGameMode GetGameMode()
vector position
void OnDestroyed(IEntity owner)
void OnDisconnected(int playerID)
string GetTaskDescription()
void UpdateTaskTitleAndDescription()
Updates task title and description if provided.
void OnDeliveryTriggerActivated(notnull SCR_ScenarioFrameworkTriggerEntity trigger)
SCR_BaseTriggerEntity m_TriggerDeliver
void SetDeliveryTrigger()
Sets delivery trigger by name if it exists in the world.
void SetTriggerNameToDeliver(string triggerName)
void RegisterPlayer(int iPlayerID, IEntity playerEntity)
void MoveTaskMarkerPosition()
Updates task position, moves marker if asset exists, logs error if asset not assigned.
void OnObjectDropped(IEntity item, BaseInventoryStorageComponent pStorageOwner)
string GetTriggerNameToDeliver()
enum SCR_EScenarioFrameworkItemGCState m_sDeliveryTriggerName
void HandleNewSlotGC(IEntity entity)
Handles the cases where GarbageSystem might delete new slot entity.
void OnObjectPossessed(IEntity item, BaseInventoryStorageComponent pStorageOwner)
void OnItemCarrierChanged(InventoryStorageSlot oldSlot, InventoryStorageSlot newSlot)
void UpdateDroppedTaskMarker()
Updates dropped task marker position, checks if it's a deliver task, schedules marker position update...
void InvokedSetDeliveryTrigger()
Sets delivery trigger for an event.
void HandleOldSlotGC(IEntity entity)
Handles possible revert of case prevention where GarbageSystem might delete root entity.
SCR_EScenarioFrameworkItemGCState m_eGarbageCollectionStatus
void SetTaskDescription(LocalizedString taskDesc, array< LocalizedString > taskDescParams=null)
Definition SCR_Task.c:299
void SetTaskName(LocalizedString taskName, array< LocalizedString > taskNameParams=null)
Definition SCR_Task.c:261
void SetTaskUIVisibility(SCR_ETaskUIVisibility visibility)
Definition SCR_Task.c:918
SCR_ETaskState
Definition SCR_Task.c:3
string GetTaskName(SCR_Task task)
proto external Managed FindComponent(typename typeName)
proto external BaseWorld GetWorld()
ScriptInvokerBase< SCR_BaseGameMode_OnPlayerDisconnected > GetOnPlayerDisconnected()
ScriptInvokerBase< SCR_BaseGameMode_PlayerIdAndEntity > GetOnPlayerSpawned()
Script entry for garbage system modding.
static SCR_GarbageSystem GetByEntityWorld(IEntity entity)
static ScriptCallQueue GetCallQueuePausable()
static void SnapToGeometry(out vector newPosition, vector currentPosition, array< IEntity > excludedEntities, BaseWorld world=null, TraceParam traceParam=null, out vector surfaceNormal=vector.Zero)
proto void Print(void var, LogLevel level=LogLevel.NORMAL)
Prints content of variable to console/log.
LogLevel
Enum with severity of the logging message.
Definition LogLevel.c:14