Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_TransformingEditorComponent.c
Go to the documentation of this file.
1[ComponentEditorProps(category: "GameScripted/Editor", description: "Entity transformation (moving and rotating). Works only with SCR_EditorBaseEntity!", icon: "WBData/ComponentEditorProps/componentEditor.png")]
3{
4 [Attribute(category: "Effects")]
5 private ref array<ref SCR_BaseEditorEffect> m_EffectsTransforationStart;
6
7 [Attribute(category: "Effects")]
8 private ref array<ref SCR_BaseEditorEffect> m_EffectsTransformationConfirm;
9
10 [Attribute(category: "Effects")]
11 private ref array<ref SCR_BaseEditorEffect> m_EffectsTransformationCancel;
12
13 array<ref SCR_BaseEditorEffect> GetEffectsTransforationStart()
14 {
15 return m_EffectsTransforationStart;
16 }
17 array<ref SCR_BaseEditorEffect> GetEffectsTransformationConfirm()
18 {
19 return m_EffectsTransformationConfirm;
20 }
21 array<ref SCR_BaseEditorEffect> GetEffectsTransformationCancel()
22 {
23 return m_EffectsTransformationCancel;
24 }
25};
26
29
34{
35 protected ref set<SCR_EditableEntityComponent> m_aEditedEntities;
39 protected SCR_RefPreviewEntity m_RefEntity;
42 protected bool m_bIsComposition;
43 protected bool m_bCanBeTransformed = true;
44
49 // Called in beginning of Clean so system realying on tranforming entities can handle them before cleared in component
51
52 //Server only script invokers
54
56 //--- Start
57
58 //------------------------------------------------------------------------------------------------
66 void StartEditing(SCR_EditableEntityComponent pivot, notnull set<SCR_EditableEntityComponent> entities, vector transform[4])
67 {
68 //--- Not an owner, ignore
69 if (!IsOwner() || entities.IsEmpty()) return;
70
71 if (m_PreviewManager) m_PreviewManager.InitTransform(transform);
72
73 m_bIsComposition = true;
74 int id = 0;
75 array<int> entityIds = new array<int>;
76 m_aEditedEntities = new set<SCR_EditableEntityComponent>;
77
78
79 //--- Connect to layer manager
81 SCR_EditableEntityComponent parentBelowCurrentLayer = null;
82 if (layersManager)
83 {
84 m_EditedLayer = layersManager.GetCurrentLayer();
85
86 //--- Is composition root edited as well? If not, insert it.
87 parentBelowCurrentLayer = layersManager.GetParentBelowCurrentLayer(pivot);
88 if (entities.Find(parentBelowCurrentLayer) != -1 && parentBelowCurrentLayer.IsReplicated(id))
89 {
90 if (m_aEditedEntities.Insert(parentBelowCurrentLayer))
91 entityIds.Insert(id);
92 }
93 }
94
95 //--- Add valid entities and check if they are all part of one composition
96 foreach (SCR_EditableEntityComponent entity: entities)
97 {
98 if (entity.IsReplicated(id) && m_aEditedEntities.Find(entity) == -1)
99 {
100 m_aEditedEntities.Insert(entity);
101 entityIds.Insert(id);
102
103 if (entity != parentBelowCurrentLayer && !entity.IsChildOf(parentBelowCurrentLayer))
104 m_bIsComposition = false;
105 }
106 }
107
108 //--- Not valid entities found, ignore
109 if (entityIds.IsEmpty())
110 {
111 Clean();
112 return;
113 }
114
115 //--- All selected entities belong to one composition - use its rotation instead. so it can be snapped to slots
117 pivot = parentBelowCurrentLayer;
118
119 //---- Validate pivot point
120 int pivotId;
121 if (!pivot.IsReplicated(pivotId))
122 {
123 Clean();
124 return;
125 }
126 m_EditedPivot = pivot;
127
129 if (core)
130 {
131 core.Event_OnEntityUnregistered.Insert(OnEntityUnregistered);
132 core.Event_OnEntityVisibilityChanged.Insert(OnEntityVisibilityChanged);
133 core.Event_OnEntityAccessKeyChanged.Insert(OnEntityAccessKeyChanged);
134 }
135
136 m_StatesManager.SetState(EEditorState.TRANSFORMING);
137 m_StatesManager.SetIsWaiting(true);
139
140 Rpc(StartEditingServer, pivotId, entityIds, vector.One, transform, m_PreviewManager.IsUnderwater(), m_PreviewManager.GetVerticalMode());
141 }
142
143 //------------------------------------------------------------------------------------------------
144 [RplRpc(RplChannel.Reliable, RplRcver.Server)]
145 protected void StartEditingServer(int pivotId, array<int> entityIds, vector dummyVector, vector transform[4], bool isUnderwater, EEditorTransformVertical verticalMode)
146 {
147 m_aEditedEntities = new set<SCR_EditableEntityComponent>;
149
150 m_EditedPivot = SCR_EditableEntityComponent.Cast(Replication.FindItem(pivotId));
151
152 foreach (int id: entityIds)
153 {
155 if (!entity) continue;
156
157 GenericEntity owner = entity.GetOwner();
158 if (!owner) return;
159
160 vector pos;
161 entity.GetPos(pos);
162
163 m_aEditedEntities.Insert(entity);
164 m_mServerEntityStartingPosition.Insert(entity, pos);
165 }
166
167 //--- Create reference entity
168 EntitySpawnParams spawnParams = new EntitySpawnParams();
169 spawnParams.Transform = transform;
170
171 EPreviewEntityFlag flags = EPreviewEntityFlag.IGNORE_PREFAB | EPreviewEntityFlag.ONLY_EDITABLE;
172 if (isUnderwater)
173 flags |= EPreviewEntityFlag.UNDERWATER;
174
175 if (verticalMode == EEditorTransformVertical.GEOMETRY)
176 flags |= EPreviewEntityFlag.GEOMETRY;
177
178#ifdef PREVIEW_ENTITY_SHOW_REFERENCE
179 const ResourceName material = "{D0126AF0E6A27141}Common/Materials/Colors/colorRed.emat"; // TODO: check for good const usage
180#else
181 const ResourceName material; // TODO: check for good const usage
182#endif
183
184 m_RefEntity = SCR_RefPreviewEntity.Cast(SCR_RefPreviewEntity.SpawnPreviewFromEditableEntities(m_aEditedEntities, "SCR_RefPreviewEntity", GetGame().GetWorld(), spawnParams, material, flags));
185
186 int simulatedDelay = DiagMenu.GetValue(SCR_DebugMenuID.DEBUGUI_EDITOR_NETWORK_DELAY) * 100;
187 if (simulatedDelay > 0 && !Replication.IsRunning())
188 GetGame().GetCallqueue().CallLater(StartEditingOwner, simulatedDelay, false);
189 else
191 }
192
193 //------------------------------------------------------------------------------------------------
194 [RplRpc(RplChannel.Reliable, RplRcver.Owner)]
195 protected void StartEditingOwner()
196 {
197 if (!m_PreviewManager)
198 return;
199
200 //--- Transforming was meanwhile canceled, ignore
201 if (!m_StatesManager.SetIsWaiting(false) || m_StatesManager.GetState() != EEditorState.TRANSFORMING)
202 {
204 return;
205 }
206
207 //--- Create preview
210
212 if (prefabData) SCR_BaseEditorEffect.Activate(prefabData.GetEffectsTransforationStart(), this, entities: m_aEditedEntities);
213 }
214
216 //--- Confirm
217
218 //------------------------------------------------------------------------------------------------
226 {
227 //--- No change or incorrect position
228 if (!m_PreviewManager || !m_PreviewManager.IsChange())
229 {
230 //CancelEditing();
231 if (m_PreviewManager.IsEditing())
232 SendNotification(ENotification.EDITOR_TRANSFORMING_INCORRECT_POSITION);
233
234 return false;
235 }
236
237 //--- Not an owner, ignore
238 if (!IsOwner()) return false;
239
240 //--- Not editing, ignore
241 if (!m_aEditedEntities || !m_PreviewManager.IsEditing()) return false;
242
243 //--- Check if the current layer changed during transformation
244 bool currentLayerChanged;
246 SCR_EditableEntityComponent currentLayer;
247 if (layersManager)
248 {
249 currentLayer = layersManager.GetCurrentLayer();
250 currentLayerChanged = m_EditedLayer != layersManager.GetCurrentLayer();
251 }
252
253 //--- Create packet
255 if (!params) return false;
256
257 //--- Send request to server
259
260 return true;
261 }
262
263 //------------------------------------------------------------------------------------------------
264 [RplRpc(RplChannel.Reliable, RplRcver.Server)]
266 {
267 if (!params.Deserialize())
268 {
270 return;
271 }
272
273 vector mat[4];
274 params.GetWorldTransform(mat);
275
276 bool result = false;
278 {
279 m_RefEntity.ApplyReference(params);
280
281 //--- Mark slot as occupied
282 if (params.m_Target)
283 {
284 SCR_SiteSlotEntity slotEntity = SCR_SiteSlotEntity.Cast(params.m_Target.GetOwner());
285 if (slotEntity) slotEntity.SetOccupant(m_EditedPivot.GetOwner());
286 }
287
289 {
290 entity.SetAuthor(playerID);
291 }
292
294 result = true;
295 }
296
297 Rpc(ConfirmEditingOwner, result);
298
299 Clean();
300 }
301
302 //------------------------------------------------------------------------------------------------
303 [RplRpc(RplChannel.Reliable, RplRcver.Owner)]
304 protected void ConfirmEditingOwner(bool result)
305 {
306 if (result)
307 {
308 vector transform[4];
309 m_PreviewManager.GetPreviewTransform(transform);
310
313 if (prefabData) SCR_BaseEditorEffect.Activate(prefabData.GetEffectsTransformationConfirm(), this, transform[3], m_aEditedEntities);
314 }
315 else
316 {
317 //--- Evaluate failure when editing ends, not when it starts, as "empty drag" is more confusing for user
318 SCR_NotificationsComponent.SendLocal(ENotification.EDITOR_TRANSFORMING_FAIL);
319 }
320
321 Clean();
322 }
323
325 //--- Cancel
326
327 //------------------------------------------------------------------------------------------------
333 {
334 //--- Not an owner, ignore
335 if (!IsOwner()) return;
336
337 //--- Not editing, ignore
338 if (!m_aEditedEntities) return;
339
342 if (prefabData) SCR_BaseEditorEffect.Activate(prefabData.GetEffectsTransformationCancel(), this, entities: m_aEditedEntities);
343
345
346 Clean();
347 }
348
349 //------------------------------------------------------------------------------------------------
350 [RplRpc(RplChannel.Reliable, RplRcver.Server)]
351 protected void CancelEditingServer()
352 {
353 Clean();
354 }
355
357 //--- Support Funcions
358
359 //------------------------------------------------------------------------------------------------
365 {
366 return m_aEditedEntities != null;
367 }
368
369 //------------------------------------------------------------------------------------------------
375 {
376 return m_aEditedEntities && m_aEditedEntities.Find(entity) != -1;
377 }
378
379 //------------------------------------------------------------------------------------------------
389
390 //------------------------------------------------------------------------------------------------
400
401 //------------------------------------------------------------------------------------------------
411
412 //------------------------------------------------------------------------------------------------
419 {
420 if (!Replication.IsServer())
421 return null;
422
424 }
425
426 //------------------------------------------------------------------------------------------------
436
437 //------------------------------------------------------------------------------------------------
442
443 //------------------------------------------------------------------------------------------------
445 {
446 return m_bCanBeTransformed;
447 }
448
449 //------------------------------------------------------------------------------------------------
450 void SetCanBeTransformed(bool val)
451 {
453 }
454
455 //------------------------------------------------------------------------------------------------
456 protected void Clean()
457 {
458 m_OnCleanStart.Invoke();
459
460 m_aEditedEntities = null;
461 m_EditedPivot = null;
462#ifndef PREVIEW_ENTITY_SHOW_REFERENCE
463 delete m_RefEntity;
464#endif
465 if (m_PreviewManager) m_PreviewManager.DeletePreview();
466
467 if (m_StatesManager) m_StatesManager.UnsetState(EEditorState.TRANSFORMING);
468
470 if (core)
471 {
472 core.Event_OnEntityUnregistered.Remove(OnEntityUnregistered);
473 core.Event_OnEntityVisibilityChanged.Remove(OnEntityVisibilityChanged);
474 core.Event_OnEntityAccessKeyChanged.Remove(OnEntityAccessKeyChanged);
475 }
476 }
477
478 //------------------------------------------------------------------------------------------------
480 {
481 if (!m_aEditedEntities || m_aEditedEntities.Find(entity) == -1) return;
482
484 SendNotification(ENotification.EDITOR_TRANSFORMING_LOST_ACCESS, Replication.FindItemId(entity));
485 }
486
487 //------------------------------------------------------------------------------------------------
489 {
490 if (!m_aEditedEntities || m_aEditedEntities.Find(entity) == -1) return;
491
492 if (!entity.GetVisibleInHierarchy()) CancelEditing();
493 SendNotification(ENotification.EDITOR_TRANSFORMING_LOST_ACCESS, Replication.FindItemId(entity));
494 }
495
496 //------------------------------------------------------------------------------------------------
498 {
499 if (!m_aEditedEntities || m_aEditedEntities.Find(entity) == -1) return;
500
501 if (!entity.HasAccessInHierarchy()) CancelEditing();
502 SendNotification(ENotification.EDITOR_TRANSFORMING_LOST_ACCESS, Replication.FindItemId(entity));
503 }
504
506 //--- Default Functions
507
508 //------------------------------------------------------------------------------------------------
509 override void EOnFrame(IEntity owner, float timeSlice)
510 {
511 /*
512 if (Debug.KeyState(KeyCode.KC_DELETE) && m_aEditedEntities)
513 {
514 Debug.ClearKey(KeyCode.KC_DELETE);
515
516 SCR_EditableEntityComponent entity = m_aEditedEntities[m_aEditedEntities.Count() - 1];
517 if (entity) delete entity.GetOwner();
518 }
519 */
520
521 if (DiagMenu.GetBool(SCR_DebugMenuID.DEBUGUI_EDITOR_TRANSFORM_START))
522 {
523 DiagMenu.SetValue(SCR_DebugMenuID.DEBUGUI_EDITOR_TRANSFORM_START, false);
524
526 if (entitiesManager)
527 {
528 SCR_BaseEditableEntityFilter selectedFilter = entitiesManager.GetFilter(EEditableEntityState.SELECTED);
529 if (selectedFilter)
530 {
531 set<SCR_EditableEntityComponent> selected = new set<SCR_EditableEntityComponent>;
532 selectedFilter.GetEntities(selected);
533 if (!selected.IsEmpty())
534 {
535 vector transform[4];
536 selected[0].GetOwner().GetWorldTransform(transform);
537 StartEditing(selected[0], selected, transform);
538 }
539 }
540 }
541 }
542 if (DiagMenu.GetBool(SCR_DebugMenuID.DEBUGUI_EDITOR_TRANSFORM_CONFIRM))
543 {
544 DiagMenu.SetValue(SCR_DebugMenuID.DEBUGUI_EDITOR_TRANSFORM_CONFIRM, false);
546 }
547 if (DiagMenu.GetBool(SCR_DebugMenuID.DEBUGUI_EDITOR_TRANSFORM_CANCEL))
548 {
549 DiagMenu.SetValue(SCR_DebugMenuID.DEBUGUI_EDITOR_TRANSFORM_CANCEL, false);
551 }
552 }
553
554 //------------------------------------------------------------------------------------------------
555 override void EOnEditorActivate()
556 {
558
561
562 DiagMenu.RegisterMenu(SCR_DebugMenuID.DEBUGUI_EDITOR_TRANSFORM, "Transforming", "Editor");
563 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_EDITOR_TRANSFORM_START, "", "Start Transforming", "Transforming");
564 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_EDITOR_TRANSFORM_CONFIRM, "", "Confirm Transforming", "Transforming");
565 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_EDITOR_TRANSFORM_CANCEL, "", "Cancel Transforming", "Transforming");
566 }
567
568 //------------------------------------------------------------------------------------------------
569 override void EOnEditorDeactivate()
570 {
571 Clean();
572
573 DiagMenu.Unregister(SCR_DebugMenuID.DEBUGUI_EDITOR_TRANSFORM_START);
574 DiagMenu.Unregister(SCR_DebugMenuID.DEBUGUI_EDITOR_TRANSFORM_CONFIRM);
575 DiagMenu.Unregister(SCR_DebugMenuID.DEBUGUI_EDITOR_TRANSFORM_CANCEL);
576 DiagMenu.Unregister(SCR_DebugMenuID.DEBUGUI_EDITOR_TRANSFORM_VERTICAL_MODE);
577 }
578};
SCR_EAIThreatSectorFlags flags
SCR_DebugMenuID
This enum contains all IDs for DiagMenu entries added in script.
Definition DebugMenuID.c:4
ENotification
EPreviewEntityFlag
ArmaReforgerScripted GetGame()
Definition game.c:1398
enum EAIGroupCombatMode ComponentEditorProps(category:"GameScripted/AI", description:"Component for utility AI system for groups")
override int GetPlayerID()
ScriptInvokerBase< ScriptInvokerVoidMethod > ScriptInvokerVoid
Diagnostic and developer menu system.
Definition DiagMenu.c:18
proto external int SetEventMask(notnull IEntity owner, int mask)
void Rpc(func method, void p0=NULL, void p1=NULL, void p2=NULL, void p3=NULL, void p4=NULL, void p5=NULL, void p6=NULL, void p7=NULL)
Main replication API.
Definition Replication.c:14
int GetEntities(out set< SCR_EditableEntityComponent > entities, bool includeChildren=false, bool evaluate=true)
void SCR_BaseEditorComponent(IEntityComponentSource src, IEntity ent, IEntity parent)
static Managed GetInstance(typename type, bool showError=false, bool modeFirst=false)
EntityComponentPrefabData GetEditorComponentData()
void SendNotification(ENotification notificationID, int selfID=0, int targetID=0, vector position=vector.Zero)
SCR_EditorManagerEntity GetManager()
bool IsChildOf(SCR_EditableEntityComponent entity)
bool HasAccessInHierarchy(EEditableEntityAccessKey accessKey)
bool IsReplicated(out RplId replicationID=-1)
Network packet of variables for entity placing and transformation.
static SCR_EditorPreviewParams CreateParamsFromPreview(SCR_PreviewEntityEditorComponent previewManager, SCR_EditableEntityComponent parent=null, bool parentChanged=false)
SCR_BaseEditableEntityFilter GetFilter(EEditableEntityState state, bool showError=false)
static bool IsPositionWithinTerrainBounds(vector pos)
Definition Functions.c:1981
SCR_EditableEntityComponent GetCurrentLayer()
SCR_EditableEntityComponent GetParentBelowCurrentLayer(SCR_EditableEntityComponent entity)
override void EOnFrame(IEntity owner, float timeSlice)
void OnEntityUnregistered(SCR_EditableEntityComponent entity)
void OnEntityAccessKeyChanged(SCR_EditableEntityComponent entity)
ref set< SCR_EditableEntityComponent > m_aEditedEntities
void StartEditingServer(int pivotId, array< int > entityIds, vector dummyVector, vector transform[4], bool isUnderwater, EEditorTransformVertical verticalMode)
SCR_PreviewEntityEditorComponent m_PreviewManager
void StartEditing(SCR_EditableEntityComponent pivot, notnull set< SCR_EditableEntityComponent > entities, vector transform[4])
void OnEntityVisibilityChanged(SCR_EditableEntityComponent entity)
bool IsEditing(SCR_EditableEntityComponent entity)
void ConfirmEditingServer(SCR_EditorPreviewParams params, int playerID)
ref map< SCR_EditableEntityComponent, vector > m_mServerEntityStartingPosition
proto external GenericEntity GetOwner()
Get owner entity.
Definition Types.c:486
void EntitySpawnParams()
Definition gameLib.c:130
EEditableEntityState
SCR_FieldOfViewSettings Attribute
EEditorTransformVertical
Vertical transformation mode.
EEditorState
Unique editor state.
Definition EEditorState.c:6
EntityEvent
Various entity events.
Definition EntityEvent.c:14
void RplRpc(RplChannel channel, RplRcver rcver, RplCondition condition=RplCondition.None, string customConditionName="")
Definition EnNetwork.c:95
RplRcver
Definition RplRcver.c:59
RplChannel
Communication channel. Reliable is guaranteed to be delivered. Unreliable not.
Definition RplChannel.c:14
ScriptInvokerBase< func > ScriptInvoker
Definition tools.c:134