1 [
ComponentEditorProps(
category:
"GameScripted/Editor", description:
"Attribute for managing editable entities. Works only with SCR_EditorBaseEntity!", icon:
"WBData/ComponentEditorProps/componentEditor.png")]
15 protected const int ASYNC_ENTITY_BATCH_SIZE = 1000;
18 private ref array<ref SCR_BaseEditableEntityFilter> m_aFilters;
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>>();
25 private bool m_bSkipSuccessors;
26 protected int m_iAsyncIndex;
27 protected ref set<SCR_EditableEntityComponent> m_AsyncEntities;
38 if (m_FiltersMap.Find(state, filter))
45 Print(
string.Format(
"Cannot find editable entity filter '%1'!",
typename.EnumToString(
EEditableEntityState, state)), LogLevel.ERROR);
59 if (m_Core) m_Core.GetAllEntities(entities);
65 if (m_FiltersMap.Find(state, filter)) filter.GetEntities(entities);
68 void SetInSuccessors(
EEditableEntityState state, set<SCR_EditableEntityComponent> entitiesInsert, set<SCR_EditableEntityComponent> entitiesRemove)
70 if (m_bSkipSuccessors)
return;
72 array<SCR_BaseEditableEntityFilter> successors;
73 if (!m_Successors.Find(state, successors))
return;
79 successor.Set(entitiesInsert, entitiesRemove,
true);
84 successor.Set(
null, entitiesRemove,
true);
93 filter.Add(entity,
false);
100 filter.Remove(entity,
true);
105 m_bSkipSuccessors =
true;
109 filter.Validate(entity);
111 filter.Remove(entity,
true);
113 m_bSkipSuccessors =
false;
118 [
RplRpc(RplChannel.Reliable, RplRcver.Server)]
119 protected void SetParentEntityServer(
int entityID,
int parentEntityID)
123 if (entity) entity.SetParentEntity(parentEntity);
132 int entityID, parentID;
133 if (!entity.IsReplicated(entityID))
return;
134 if (!parentEntity.IsReplicated(parentID))
return;
136 Rpc(SetParentEntityServer, entityID, parentID);
141 override void EOnEditorDebug(array<string> debugTexts)
146 debugTexts.Insert(
"\n--- Entity Arrays");
149 foreach (
auto filter: m_aFiltersSorted)
151 if (!filter)
continue;
152 debugTexts.Insert(
string.Format(
"%1: %2x", filter.GetStateName(), filter.GetEntitiesCount()));
157 foreach (
auto filter: m_aFiltersSorted)
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()));
165 debugTexts.Insert(
"\n");
167 override void EOnFrame(IEntity owner,
float timeSlice)
169 foreach (
auto filter: m_aFiltersSorted)
171 if (filter) filter.OnFrameBase(timeSlice);
174 override void EOnEditorActivate()
176 SetEventMask(
GetOwner(), EntityEvent.FRAME);
181 m_Core.Event_OnEntityRegistered.Insert(OnEntityRegistered);
182 m_Core.Event_OnEntityUnregistered.Insert(OnEntityUnregistered);
183 m_Core.Event_OnParentEntityChanged.Insert(OnParentEntityChanged);
185 override bool EOnEditorActivateAsync(
int attempt)
192 if (m_iAsyncIndex >= m_aFiltersSorted.Count())
196 filter.OnActivateBase();
200 override void EOnEditorDeactivate()
204 m_Core.Event_OnEntityRegistered.Remove(OnEntityRegistered);
205 m_Core.Event_OnEntityUnregistered.Remove(OnEntityUnregistered);
206 m_Core.Event_OnParentEntityChanged.Remove(OnParentEntityChanged);
208 override bool EOnEditorDeactivateAsync(
int attempt)
214 m_bSkipSuccessors =
true;
217 if (m_bSkipSuccessors)
220 if (m_iAsyncIndex >= m_aFiltersSorted.Count())
222 m_bSkipSuccessors =
false;
224 m_AsyncEntities =
new set<SCR_EditableEntityComponent>;
226 m_Core.GetAllEntities(m_AsyncEntities);
232 filter.OnDeactivateBase();
237 int indexStart = m_iAsyncIndex * ASYNC_ENTITY_BATCH_SIZE;
238 if (indexStart >= m_AsyncEntities.Count())
241 int indexEnd = Math.Min((m_iAsyncIndex + 1) * ASYNC_ENTITY_BATCH_SIZE, m_AsyncEntities.Count());
242 for (
int i = indexStart; i < indexEnd; i++)
244 if (m_AsyncEntities[i])
245 m_AsyncEntities[i].ResetEntityStates();
251 override void EOnEditorInit()
253 if (!m_aFilters)
return;
256 array<int> enumValues = {};
258 enumValues.InsertAt(0, 0);
262 while (!m_aFilters.IsEmpty())
270 Print(
string.Format(
"Error when loading entity filter on index %1!", i), LogLevel.ERROR);
271 m_aFilters.Remove(i);
279 if (state == 0 || state == predecessorState || !enumValues.Contains(predecessorState))
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);
286 if (predecessorState == 0)
289 m_aFiltersSorted.InsertAt(filter, 0);
290 m_aFiltersRoot.Insert(filter);
294 m_FiltersMap.Find(predecessorState, predecessor);
295 int predecessorID = m_aFiltersSorted.Find(predecessor);
296 if (predecessorID < 0)
299 i = Math.Repeat(i + 1, m_aFilters.Count());
305 m_aFiltersSorted.InsertAt(filter, predecessorID + 1);
308 array<SCR_BaseEditableEntityFilter> predecessorSuccessors;
309 m_Successors.Find(predecessor.GetState(), predecessorSuccessors);
310 predecessorSuccessors.Insert(filter);
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);