Arma Reforger Explorer  1.1.0.42
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
SCR_EntitiesManagerEditorComponent.c
Go to the documentation of this file.
1 [ComponentEditorProps(category: "GameScripted/Editor", description: "Attribute for managing editable entities. Works only with SCR_EditorBaseEntity!", icon: "WBData/ComponentEditorProps/componentEditor.png")]
3 {
4 };
5 
14 {
15  protected const int ASYNC_ENTITY_BATCH_SIZE = 1000; //--- How many entities can be updated in one async cycle
16 
17  [Attribute()]
18  private ref array<ref SCR_BaseEditableEntityFilter> m_aFilters;
19 
20  private ref array<ref SCR_BaseEditableEntityFilter> m_aFiltersSorted = new array<ref SCR_BaseEditableEntityFilter>();
21  private ref array<SCR_BaseEditableEntityFilter> m_aFiltersRoot = new array<SCR_BaseEditableEntityFilter>();
22  private ref map<EEditableEntityState, SCR_BaseEditableEntityFilter> m_FiltersMap = new map<EEditableEntityState, SCR_BaseEditableEntityFilter>();
23  private ref map<EEditableEntityState, ref array<SCR_BaseEditableEntityFilter>> m_Successors = new map<EEditableEntityState, ref array<SCR_BaseEditableEntityFilter>>();
24  private SCR_EditableEntityCore m_Core;
25  private bool m_bSkipSuccessors;
26  protected int m_iAsyncIndex;
27  protected ref set<SCR_EditableEntityComponent> m_AsyncEntities;
28 
35  SCR_BaseEditableEntityFilter GetFilter(EEditableEntityState state, bool showError = false)
36  {
37  SCR_BaseEditableEntityFilter filter = null;
38  if (m_FiltersMap.Find(state, filter))
39  {
40  return filter;
41  }
42  else
43  {
44  if (showError)
45  Print(string.Format("Cannot find editable entity filter '%1'!", typename.EnumToString(EEditableEntityState, state)), LogLevel.ERROR);
46  return null;
47  }
48  }
54  void GetEntities(EEditableEntityState state, out set<SCR_EditableEntityComponent> entities)
55  {
56  if (state == 0)
57  {
58  //--- No predecessor, get all entities
59  if (m_Core) m_Core.GetAllEntities(entities);
60  }
61  else
62  {
63  //--- Get predecessor's entities
64  SCR_BaseEditableEntityFilter filter = null;
65  if (m_FiltersMap.Find(state, filter)) filter.GetEntities(entities);
66  }
67  }
68  void SetInSuccessors(EEditableEntityState state, set<SCR_EditableEntityComponent> entitiesInsert, set<SCR_EditableEntityComponent> entitiesRemove)
69  {
70  if (m_bSkipSuccessors) return;
71 
72  array<SCR_BaseEditableEntityFilter> successors;
73  if (!m_Successors.Find(state, successors)) return;
74 
75  foreach (SCR_BaseEditableEntityFilter successor: successors)
76  {
77  if (successor.GetAutoAdd() == EEditableEntityFilterAutoAdd.ALWAYS)
78  {
79  successor.Set(entitiesInsert, entitiesRemove, true);
80  }
81  else
82  {
83  //--- When auto-adding is disabled, don't send 'insert' entities further
84  successor.Set(null, entitiesRemove, true);
85  }
86  }
87  }
88  protected void OnEntityRegistered(SCR_EditableEntityComponent entity)
89  {
90  foreach (SCR_BaseEditableEntityFilter filter: m_aFiltersRoot)
91  {
92  if (filter.GetAutoAdd() == EEditableEntityFilterAutoAdd.ALWAYS)
93  filter.Add(entity, false);
94  }
95  }
96  protected void OnEntityUnregistered(SCR_EditableEntityComponent entity)
97  {
98  foreach (SCR_BaseEditableEntityFilter filter: m_aFiltersRoot)
99  {
100  filter.Remove(entity, true);
101  }
102  }
103  protected void OnParentEntityChanged(SCR_EditableEntityComponent entity, SCR_EditableEntityComponent parentEntity, SCR_EditableEntityComponent parentEntityPrev)
104  {
105  m_bSkipSuccessors = true; //--- ToDo: Cleaner?
106  foreach (SCR_BaseEditableEntityFilter filter: m_aFiltersSorted)
107  {
108  if (filter.GetAutoAdd() == EEditableEntityFilterAutoAdd.ALWAYS)
109  filter.Validate(entity); //--- Check if the entity is still compatible with auto-add filter
110  else
111  filter.Remove(entity, true); //--- Simply remove from filters without auto-add (e.g., SELECTED)
112  }
113  m_bSkipSuccessors = false;
114  }
115 
117  //--- Hierarchy management
118  [RplRpc(RplChannel.Reliable, RplRcver.Server)]
119  protected void SetParentEntityServer(int entityID, int parentEntityID)
120  {
121  SCR_EditableEntityComponent entity = SCR_EditableEntityComponent.Cast(Replication.FindItem(entityID));
122  SCR_EditableEntityComponent parentEntity = SCR_EditableEntityComponent.Cast(Replication.FindItem(parentEntityID));
123  if (entity) entity.SetParentEntity(parentEntity);
124  }
130  void SetParentEntity(SCR_EditableEntityComponent entity, SCR_EditableEntityComponent parentEntity)
131  {
132  int entityID, parentID;
133  if (!entity.IsReplicated(entityID)) return;
134  if (!parentEntity.IsReplicated(parentID)) return;
135 
136  Rpc(SetParentEntityServer, entityID, parentID);
137  }
138 
140  //--- Default functions
141  override void EOnEditorDebug(array<string> debugTexts)
142  {
143  //if (!GetEditorManager().IsOpened()) return;
144  if (!IsActive()) return;
145 
146  debugTexts.Insert("\n--- Entity Arrays");
147  if (SCR_EditorBaseEntity.Cast(GetOwner()).IsOpened())
148  {
149  foreach (auto filter: m_aFiltersSorted)
150  {
151  if (!filter) continue;
152  debugTexts.Insert(string.Format("%1: %2x", filter.GetStateName(), filter.GetEntitiesCount()));
153  }
154  }
155  else
156  {
157  foreach (auto filter: m_aFiltersSorted)
158  {
159  if (!filter) continue;
160  set<SCR_EditableEntityComponent> entities = new set<SCR_EditableEntityComponent>;
161  filter.GetEntities(entities);
162  debugTexts.Insert(string.Format("%1: %2x", filter.GetStateName(), entities.Count()));
163  }
164  }
165  debugTexts.Insert("\n");
166  }
167  override void EOnFrame(IEntity owner, float timeSlice)
168  {
169  foreach (auto filter: m_aFiltersSorted)
170  {
171  if (filter) filter.OnFrameBase(timeSlice);
172  }
173  }
174  override void EOnEditorActivate()
175  {
176  SetEventMask(GetOwner(), EntityEvent.FRAME);
177 
179  if (!m_Core) return;
180 
181  m_Core.Event_OnEntityRegistered.Insert(OnEntityRegistered);
182  m_Core.Event_OnEntityUnregistered.Insert(OnEntityUnregistered);
183  m_Core.Event_OnParentEntityChanged.Insert(OnParentEntityChanged);
184  }
185  override bool EOnEditorActivateAsync(int attempt)
186  {
187  //--- Init
188  if (attempt == 0)
189  m_iAsyncIndex = 0;
190 
191  //--- Exit
192  if (m_iAsyncIndex >= m_aFiltersSorted.Count())
193  return true;
194 
195  SCR_BaseEditableEntityFilter filter = m_aFiltersSorted[m_iAsyncIndex];
196  filter.OnActivateBase();
197  m_iAsyncIndex++;
198  return false;
199  }
200  override void EOnEditorDeactivate()
201  {
202  if (!m_Core) return;
203 
204  m_Core.Event_OnEntityRegistered.Remove(OnEntityRegistered);
205  m_Core.Event_OnEntityUnregistered.Remove(OnEntityUnregistered);
206  m_Core.Event_OnParentEntityChanged.Remove(OnParentEntityChanged);
207  }
208  override bool EOnEditorDeactivateAsync(int attempt)
209  {
210  //--- Init
211  if (attempt == 0)
212  {
213  m_iAsyncIndex = 0;
214  m_bSkipSuccessors = true;
215  }
216 
217  if (m_bSkipSuccessors)
218  {
219  //--- Reset filters
220  if (m_iAsyncIndex >= m_aFiltersSorted.Count())
221  {
222  m_bSkipSuccessors = false;
223  m_iAsyncIndex = 0;
224  m_AsyncEntities = new set<SCR_EditableEntityComponent>;
225  if (m_Core) //--- Can be null when async loading was terminated before this component was activated
226  m_Core.GetAllEntities(m_AsyncEntities);
227  return false;
228  }
229 
230  //--- Deactivate filter one by one
231  SCR_BaseEditableEntityFilter filter = m_aFiltersSorted[m_iAsyncIndex];
232  filter.OnDeactivateBase();
233  }
234  else
235  {
236  //--- Reset entities
237  int indexStart = m_iAsyncIndex * ASYNC_ENTITY_BATCH_SIZE;
238  if (indexStart >= m_AsyncEntities.Count())
239  return true;
240 
241  int indexEnd = Math.Min((m_iAsyncIndex + 1) * ASYNC_ENTITY_BATCH_SIZE, m_AsyncEntities.Count());
242  for (int i = indexStart; i < indexEnd; i++)
243  {
244  if (m_AsyncEntities[i])
245  m_AsyncEntities[i].ResetEntityStates();
246  }
247  }
248  m_iAsyncIndex++;
249  return false;
250  }
251  override void EOnEditorInit()
252  {
253  if (!m_aFilters) return;
254 
255  //--- Get the list of valid values
256  array<int> enumValues = {};
257  SCR_Enum.GetEnumValues(EEditableEntityState, enumValues);
258  enumValues.InsertAt(0, 0);
259 
260  //--- Get managers
261  int i = 0;
262  while (!m_aFilters.IsEmpty())
263  {
264  SCR_BaseEditableEntityFilter filter = m_aFilters[i];
265  SCR_BaseEditableEntityFilter predecessor = null;
266 
267  //--- Filter not found, ignore it
268  if (!filter)
269  {
270  Print(string.Format("Error when loading entity filter on index %1!", i), LogLevel.ERROR);
271  m_aFilters.Remove(i);
272  continue;
273  }
274 
275  EEditableEntityState state = filter.GetState();
276  EEditableEntityState predecessorState = filter.GetPredecessorState();
277 
278  //--- Incorrectly configured filter, ignore it
279  if (state == 0 || state == predecessorState || !enumValues.Contains(predecessorState))
280  {
281  Print(string.Format("Error when loading entity filter %1:%2 with predecessor %3:%4!", state, typename.EnumToString(EEditableEntityState, state), predecessorState, typename.EnumToString(EEditableEntityState, predecessorState)), LogLevel.ERROR);
282  m_aFilters.Remove(i);
283  continue;
284  }
285 
286  if (predecessorState == 0)
287  {
288  //--- No predecessor, insert at the beginning
289  m_aFiltersSorted.InsertAt(filter, 0);
290  m_aFiltersRoot.Insert(filter);
291  }
292  else
293  {
294  m_FiltersMap.Find(predecessorState, predecessor);
295  int predecessorID = m_aFiltersSorted.Find(predecessor);
296  if (predecessorID < 0)
297  {
298  //--- Predecessor not yet registered, skip to the next filter
299  i = Math.Repeat(i + 1, m_aFilters.Count()); //--- Prevent index overflow
300  continue;
301  }
302  else
303  {
304  //--- Insert after the predecessor
305  m_aFiltersSorted.InsertAt(filter, predecessorID + 1);
306 
307  //--- Add to successors
308  array<SCR_BaseEditableEntityFilter> predecessorSuccessors;
309  m_Successors.Find(predecessor.GetState(), predecessorSuccessors);
310  predecessorSuccessors.Insert(filter);
311  }
312  }
313 
314  //--- Start again
315  m_FiltersMap.Insert(state, filter);
316  m_Successors.Insert(state, new array<SCR_BaseEditableEntityFilter>);
317  filter.InitVariables(this, predecessor);
318  m_aFilters.Remove(i);
319  i = 0;
320  }
321  m_aFilters = null;
322 
323  /*
324  SCR_EditorModeEntity mode = SCR_EditorModeEntity.Cast(GetOwner());
325  Print(mode.GetInfo().GetName(), LogLevel.DEBUG);
326  foreach (EEditableEntityState state, ref array<SCR_BaseEditableEntityFilter> list: m_Successors)
327  {
328  Print(typename.EnumToString(EEditableEntityState, state));
329  foreach (SCR_BaseEditableEntityFilter filter: list)
330  {
331  Print(" " + typename.EnumToString(EEditableEntityState, filter.GetState()), LogLevel.VERBOSE);
332  }
333  }
334  */
335  }
336 };
ComponentEditorProps
SCR_FragmentEntityClass ComponentEditorProps
EEditableEntityState
EEditableEntityState
Definition: EEditableEntityState.c:37
SCR_EditableEntityCore
Definition: SCR_EditableEntityCore.c:10
SCR_Enum
Definition: SCR_Enum.c:1
SCR_EntitiesManagerEditorComponent
Definition: SCR_EntitiesManagerEditorComponent.c:13
RplRpc
SCR_AchievementsHandlerClass ScriptComponentClass RplRpc(RplChannel.Reliable, RplRcver.Owner)] void UnlockOnClient(AchievementId achievement)
Definition: SCR_AchievementsHandler.c:11
SCR_BaseEditorComponent
Definition: SCR_BaseEditorComponent.c:119
Attribute
typedef Attribute
Post-process effect of scripted camera.
EEditableEntityFilterAutoAdd
EEditableEntityFilterAutoAdd
Definition: EEditableEntityFilterAutoAdd.c:1
GetOwner
IEntity GetOwner()
Owner entity of the fuel tank.
Definition: SCR_FuelNode.c:128
SCR_BaseEditableEntityFilter
Definition: SCR_BaseEditableEntityFilter.c:13
SCR_BaseEditorComponentClass
Definition: SCR_BaseEditorComponent.c:2
SCR_EditableEntityComponent
Definition: SCR_EditableEntityComponent.c:13
SCR_EntitiesManagerEditorComponentClass
Definition: SCR_EntitiesManagerEditorComponent.c:2
SCR_EditorBaseEntity
Definition: SCR_EditorBaseEntity.c:14
IsActive
bool IsActive()
Definition: SCR_LoadoutSaveBlackListHolder.c:82
category
params category
Definition: SCR_VehicleDamageManagerComponent.c:180