Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
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")]
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>();
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
29 //------------------------------------------------------------------------------------------------
35 {
36 SCR_BaseEditableEntityFilter filter = null;
37 if (m_FiltersMap.Find(state, filter))
38 {
39 return filter;
40 }
41 else
42 {
43 if (showError)
44 Print(string.Format("Cannot find editable entity filter '%1'!", typename.EnumToString(EEditableEntityState, state)), LogLevel.ERROR);
45 return null;
46 }
47 }
48
49 //------------------------------------------------------------------------------------------------
53 void GetEntities(EEditableEntityState state, out set<SCR_EditableEntityComponent> entities)
54 {
55 if (state == 0)
56 {
57 //--- No predecessor, get all entities
58 if (m_Core) m_Core.GetAllEntities(entities);
59 }
60 else
61 {
62 //--- Get predecessor's entities
63 SCR_BaseEditableEntityFilter filter = null;
64 if (m_FiltersMap.Find(state, filter)) filter.GetEntities(entities);
65 }
66 }
67
68 //------------------------------------------------------------------------------------------------
69 void SetInSuccessors(EEditableEntityState state, set<SCR_EditableEntityComponent> entitiesInsert, set<SCR_EditableEntityComponent> entitiesRemove)
70 {
71 if (m_bSkipSuccessors) return;
72
73 array<SCR_BaseEditableEntityFilter> successors;
74 if (!m_Successors.Find(state, successors)) return;
75
76 foreach (SCR_BaseEditableEntityFilter successor: successors)
77 {
78 if (successor.GetAutoAdd() == EEditableEntityFilterAutoAdd.ALWAYS)
79 {
80 successor.Set(entitiesInsert, entitiesRemove, true);
81 }
82 else
83 {
84 //--- When auto-adding is disabled, don't send 'insert' entities further
85 successor.Set(null, entitiesRemove, true);
86 }
87 }
88 }
89
90 //------------------------------------------------------------------------------------------------
92 {
93 foreach (SCR_BaseEditableEntityFilter filter: m_aFiltersRoot)
94 {
95 if (filter.GetAutoAdd() == EEditableEntityFilterAutoAdd.ALWAYS)
96 filter.Add(entity, false);
97 }
98 }
99
100 //------------------------------------------------------------------------------------------------
102 {
103 foreach (SCR_BaseEditableEntityFilter filter: m_aFiltersRoot)
104 {
105 filter.Remove(entity, true);
106 }
107 }
108
109 //------------------------------------------------------------------------------------------------
111 {
112 m_bSkipSuccessors = true; //--- ToDo: Cleaner?
113 foreach (SCR_BaseEditableEntityFilter filter: m_aFiltersSorted)
114 {
115 if (filter.GetAutoAdd() == EEditableEntityFilterAutoAdd.ALWAYS)
116 filter.Validate(entity); //--- Check if the entity is still compatible with auto-add filter
117 else
118 filter.Remove(entity, true); //--- Simply remove from filters without auto-add (e.g., SELECTED)
119 }
120 m_bSkipSuccessors = false;
121 }
122
124 //--- Hierarchy management
125 [RplRpc(RplChannel.Reliable, RplRcver.Server)]
126 protected void SetParentEntityServer(int entityID, int parentEntityID)
127 {
129 SCR_EditableEntityComponent parentEntity = SCR_EditableEntityComponent.Cast(Replication.FindItem(parentEntityID));
130 if (entity) entity.SetParentEntity(parentEntity);
131 }
132
133 //------------------------------------------------------------------------------------------------
138 {
139 int entityID, parentID;
140 if (!entity.IsReplicated(entityID)) return;
141 if (!parentEntity.IsReplicated(parentID)) return;
142
143 Rpc(SetParentEntityServer, entityID, parentID);
144 }
145
147 //--- Default functions
148 override void EOnEditorDebug(array<string> debugTexts)
149 {
150 //if (!GetEditorManager().IsOpened()) return;
151 if (!IsActive()) return;
152
153 debugTexts.Insert("\n--- Entity Arrays");
155 {
156 foreach (auto filter: m_aFiltersSorted)
157 {
158 if (!filter) continue;
159 debugTexts.Insert(string.Format("%1: %2x", filter.GetStateName(), filter.GetEntitiesCount()));
160 }
161 }
162 else
163 {
164 foreach (auto filter: m_aFiltersSorted)
165 {
166 if (!filter) continue;
167 set<SCR_EditableEntityComponent> entities = new set<SCR_EditableEntityComponent>;
168 filter.GetEntities(entities);
169 debugTexts.Insert(string.Format("%1: %2x", filter.GetStateName(), entities.Count()));
170 }
171 }
172 debugTexts.Insert("\n");
173 }
174
175 //------------------------------------------------------------------------------------------------
176 override void EOnFrame(IEntity owner, float timeSlice)
177 {
178 foreach (auto filter: m_aFiltersSorted)
179 {
180 if (filter) filter.OnFrameBase(timeSlice);
181 }
182 }
183
184 //------------------------------------------------------------------------------------------------
185 override void EOnEditorActivate()
186 {
188
190 if (!m_Core) return;
191
192 m_Core.Event_OnEntityRegistered.Insert(OnEntityRegistered);
193 m_Core.Event_OnEntityUnregistered.Insert(OnEntityUnregistered);
194 m_Core.Event_OnParentEntityChanged.Insert(OnParentEntityChanged);
195 }
196
197 //------------------------------------------------------------------------------------------------
198 override bool EOnEditorActivateAsync(int attempt)
199 {
200 //--- Init
201 if (attempt == 0)
202 m_iAsyncIndex = 0;
203
204 //--- Exit
205 if (m_iAsyncIndex >= m_aFiltersSorted.Count())
206 return true;
207
208 SCR_BaseEditableEntityFilter filter = m_aFiltersSorted[m_iAsyncIndex];
209 filter.OnActivateBase();
211 return false;
212 }
213
214 //------------------------------------------------------------------------------------------------
215 override void EOnEditorDeactivate()
216 {
217 if (!m_Core) return;
218
219 m_Core.Event_OnEntityRegistered.Remove(OnEntityRegistered);
220 m_Core.Event_OnEntityUnregistered.Remove(OnEntityUnregistered);
221 m_Core.Event_OnParentEntityChanged.Remove(OnParentEntityChanged);
222 }
223
224 //------------------------------------------------------------------------------------------------
225 override bool EOnEditorDeactivateAsync(int attempt)
226 {
227 //--- Init
228 if (attempt == 0)
229 {
230 m_iAsyncIndex = 0;
231 m_bSkipSuccessors = true;
232 }
233
234 if (m_bSkipSuccessors)
235 {
236 //--- Reset filters
237 if (m_iAsyncIndex >= m_aFiltersSorted.Count())
238 {
239 m_bSkipSuccessors = false;
240 m_iAsyncIndex = 0;
241 m_AsyncEntities = new set<SCR_EditableEntityComponent>;
242 if (m_Core) //--- Can be null when async loading was terminated before this component was activated
243 m_Core.GetAllEntities(m_AsyncEntities);
244 return false;
245 }
246
247 //--- Deactivate filter one by one
248 SCR_BaseEditableEntityFilter filter = m_aFiltersSorted[m_iAsyncIndex];
249 filter.OnDeactivateBase();
250 }
251 else
252 {
253 //--- Reset entities
254 int indexStart = m_iAsyncIndex * ASYNC_ENTITY_BATCH_SIZE;
255 if (indexStart >= m_AsyncEntities.Count())
256 return true;
257
258 int indexEnd = Math.Min((m_iAsyncIndex + 1) * ASYNC_ENTITY_BATCH_SIZE, m_AsyncEntities.Count());
259 for (int i = indexStart; i < indexEnd; i++)
260 {
261 if (m_AsyncEntities[i])
262 m_AsyncEntities[i].ResetEntityStates();
263 }
264 }
266 return false;
267 }
268
269 //------------------------------------------------------------------------------------------------
270 override void EOnEditorInit()
271 {
272 if (!m_aFilters) return;
273
274 //--- Get the list of valid values
275 array<int> enumValues = {};
276 SCR_Enum.GetEnumValues(EEditableEntityState, enumValues);
277 enumValues.InsertAt(0, 0);
278
279 //--- Get managers
280 int i = 0;
281 while (!m_aFilters.IsEmpty())
282 {
283 SCR_BaseEditableEntityFilter filter = m_aFilters[i];
284 SCR_BaseEditableEntityFilter predecessor = null;
285
286 //--- Filter not found, ignore it
287 if (!filter)
288 {
289 Print(string.Format("Error when loading entity filter on index %1!", i), LogLevel.ERROR);
290 m_aFilters.Remove(i);
291 continue;
292 }
293
294 EEditableEntityState state = filter.GetState();
295 EEditableEntityState predecessorState = filter.GetPredecessorState();
296
297 //--- Incorrectly configured filter, ignore it
298 if (state == 0 || state == predecessorState || !enumValues.Contains(predecessorState))
299 {
300 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);
301 m_aFilters.Remove(i);
302 continue;
303 }
304
305 if (predecessorState == 0)
306 {
307 //--- No predecessor, insert at the beginning
308 m_aFiltersSorted.InsertAt(filter, 0);
309 m_aFiltersRoot.Insert(filter);
310 }
311 else
312 {
313 m_FiltersMap.Find(predecessorState, predecessor);
314 int predecessorID = m_aFiltersSorted.Find(predecessor);
315 if (predecessorID < 0)
316 {
317 //--- Predecessor not yet registered, skip to the next filter
318 i = Math.Repeat(i + 1, m_aFilters.Count()); //--- Prevent index overflow
319 continue;
320 }
321 else
322 {
323 //--- Insert after the predecessor
324 m_aFiltersSorted.InsertAt(filter, predecessorID + 1);
325
326 //--- Add to successors
327 array<SCR_BaseEditableEntityFilter> predecessorSuccessors;
328 m_Successors.Find(predecessor.GetState(), predecessorSuccessors);
329 predecessorSuccessors.Insert(filter);
330 }
331 }
332
333 //--- Start again
334 m_FiltersMap.Insert(state, filter);
335 m_Successors.Insert(state, new array<SCR_BaseEditableEntityFilter>);
336 filter.InitVariables(this, predecessor);
337 m_aFilters.Remove(i);
338 i = 0;
339 }
340 m_aFilters = null;
341
342 /*
343 SCR_EditorModeEntity mode = SCR_EditorModeEntity.Cast(GetOwner());
344 Print(mode.GetInfo().GetName(), LogLevel.DEBUG);
345 foreach (EEditableEntityState state, ref array<SCR_BaseEditableEntityFilter> list: m_Successors)
346 {
347 Print(typename.EnumToString(EEditableEntityState, state));
348 foreach (SCR_BaseEditableEntityFilter filter: list)
349 {
350 Print(" " + typename.EnumToString(EEditableEntityState, filter.GetState()), LogLevel.VERBOSE);
351 }
352 }
353 */
354 }
355};
enum EAIGroupCombatMode ComponentEditorProps(category:"GameScripted/AI", description:"Component for utility AI system for groups")
proto external bool IsActive()
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)
Definition Math.c:13
Main replication API.
Definition Replication.c:14
void InitVariables(SCR_EntitiesManagerEditorComponent manager, SCR_BaseEditableEntityFilter predecessor)
int GetEntities(out set< SCR_EditableEntityComponent > entities, bool includeChildren=false, bool evaluate=true)
void SCR_BaseEditorComponent(IEntityComponentSource src, IEntity ent, IEntity parent)
SCR_EditableEntityComponent SetParentEntity(SCR_EditableEntityComponent parentEntity, bool changedByUser=false)
bool IsReplicated(out RplId replicationID=-1)
override void EOnEditorDebug(array< string > debugTexts)
void OnEntityUnregistered(SCR_EditableEntityComponent entity)
void OnEntityRegistered(SCR_EditableEntityComponent entity)
SCR_BaseEditableEntityFilter GetFilter(EEditableEntityState state, bool showError=false)
void SetParentEntityServer(int entityID, int parentEntityID)
void SetInSuccessors(EEditableEntityState state, set< SCR_EditableEntityComponent > entitiesInsert, set< SCR_EditableEntityComponent > entitiesRemove)
void GetEntities(EEditableEntityState state, out set< SCR_EditableEntityComponent > entities)
void SetParentEntity(SCR_EditableEntityComponent entity, SCR_EditableEntityComponent parentEntity)
void OnParentEntityChanged(SCR_EditableEntityComponent entity, SCR_EditableEntityComponent parentEntity, SCR_EditableEntityComponent parentEntityPrev)
override void EOnFrame(IEntity owner, float timeSlice)
ref set< SCR_EditableEntityComponent > m_AsyncEntities
proto external GenericEntity GetOwner()
Get owner entity.
Definition Types.c:486
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
EEditableEntityState
SCR_FieldOfViewSettings Attribute
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