2using System.Collections.Generic;
4using System.Reflection;
27 public static event EventHandler<EntityAddRemoveEventArgs>
EntityAdded;
29 public static event EventHandler<EntityAddRemoveEventArgs>
EntityRemoved;
47 Dictionary<string, Subsystem> dictionary = [];
53 bool value = item.GetValue<
bool>(
"IsOptional");
54 string value2 = item.GetValue<
string>(
"Class");
59#pragma warning disable IL2072
60 obj = Activator.CreateInstance(type);
61#pragma warning restore IL2072
63 catch (TargetInvocationException ex) {
64 if (ex.InnerException !=
null) {
65 throw ex.InnerException;
70 throw new InvalidOperationException(
71 $
"Type \"{value2}\" cannot be used as a subsystem because it does not inherit from Subsystem class."
74 subsystem.Initialize(
this, item);
79 Dictionary<Subsystem, bool> loadedSubsystems = [];
80 List<Entity> entities =
new();
87 foreach (
Subsystem value3
in dictionary.Values) {
95 Log.
Error($
"Loading World Failed!\n{e}");
103 catch (Exception e2) {
112 if (type.GetTypeInfo().IsAssignableFrom(subsystem.GetType().GetTypeInfo())
119 throw new Exception($
"Required subsystem {type.FullName} with name \"{name}\" does not exist in project.");
121 throw new Exception($
"Required subsystem {type.FullName} does not exist in project.");
128 if (
string.IsNullOrEmpty(name)) {
129 throw new ArgumentNullException(nameof(name));
138 throw new Exception($
"Required subsystem with name \"{name}\" does not exist in project.");
151 if (type.GetTypeInfo().IsAssignableFrom(subsystem.GetType().GetTypeInfo())) {
152 yield
return subsystem;
159 if (subsystem is T val) {
166 return Entities.FirstOrDefault(entity => entity.Id == EntityID,
null);
171 Entity entity =
new(
this, valuesDictionary, entityId);
176 catch (Exception innerException) {
177 throw new Exception($
"Error creating entity from template \"{valuesDictionary.DatabaseObject.Name}\".", innerException);
183 throw new Exception(
"Entity does not belong to this project.");
187 if (entity.
Id == 0) {
191 entity.m_isAddedToProject =
true;
200 throw new Exception(
"Entity does not belong to this project.");
204 entity.m_isAddedToProject =
false;
213 foreach (
Entity entity
in entities) {
218 public virtual void RemoveEntities(IEnumerable<Entity> entities,
bool disposeEntities) {
219 foreach (
Entity entity
in entities) {
225 List<Entity> list =
new(entityDataList.
EntitiesData.Count);
226 Dictionary<int, Entity> dictionary = [];
227 foreach (
EntityData entitiesDatum
in entityDataList.EntitiesData) {
231 if (entitiesDatum.
Id != 0) {
232 if (dictionary.ContainsKey(entitiesDatum.
Id)) {
233 Log.
Warning($
"Multiple Entities use the same ID{entitiesDatum.Id}");
235 dictionary[entitiesDatum.
Id] = entity;
238 catch (Exception innerException) {
240 $
"Error creating entity from template \"{entitiesDatum.ValuesDictionary.DatabaseObject.Name}\".",
250 if (entityDataList?.EntitiesData !=
null) {
265 IEnumerable<Entity> enumerable = entities as
Entity[] ?? entities.ToArray();
268 Dictionary<Entity, int> dictionary2 = [];
270 foreach (
Entity key
in dictionary.Keys) {
271 dictionary2.Add(key, num);
274 EntityDataList entityDataList =
new() { EntitiesData =
new List<EntityData>(dictionary.Keys.Count) };
275 foreach (
Entity key2
in enumerable) {
279 entityDataList.EntitiesData.Add(entityData);
281 return entityDataList;
289 subsystem.
Save(valuesDictionary);
290 if (valuesDictionary.
Count > 0) {
313 GC.SuppressFinalize(
this);
339 Dictionary<Entity, bool> dictionary = [];
340 List<Entity> list = [];
341 foreach (
Entity entity
in entities) {
342 dictionary.Add(entity,
true);
345 list.AddRange(list2);
348 for (
int i = 0; i < list.Count; i++) {
349 List<Entity> list3 = list[i].InternalGetOwnedEntities();
351 list.AddRange(list3);
353 dictionary.Remove(list[i]);
359 Dictionary<string, Subsystem> subsystemsByName,
360 Dictionary<Subsystem, bool> loadedSubsystems,
363 throw new InvalidOperationException(
364 $
"Too deep dependencies recursion while loading subsystem \"{subsystem.ValuesDictionary.DatabaseObject.Name}\"."
367 if (loadedSubsystems.ContainsKey(subsystem)) {
370 string value = subsystem.
ValuesDictionary.GetValue(
"Dependencies",
string.Empty);
371 if (!
string.IsNullOrEmpty(value)) {
372 string[] array = value.Split(
',', StringSplitOptions.RemoveEmptyEntries);
373 for (
int i = 0; i < array.Length; i++) {
374 string text = array[i].Trim();
375 if (subsystemsByName.TryGetValue(text, out
Subsystem value2)) {
376 LoadSubsystem(value2, subsystemsByName, loadedSubsystems, depth + 1);
379 throw new InvalidOperationException(
380 $
"Dependency subsystem \"{text}\" not found when loading subsystem \"{subsystem.ValuesDictionary.DatabaseObject.Name}\"."
385 loadedSubsystems.Add(subsystem,
true);
static void Error(object message)
static void Warning(object message)
static Type FindType(string typeName, bool skipSystemAssemblies, bool throwIfNotFound)
virtual void OnEntityRemoved()
virtual void OnEntityAdded()
ValuesDictionary ValuesDictionary
List< EntityData > EntitiesData
void FireEntityRemovedEvent()
List< Entity > InternalGetOwnedEntities()
void FireEntityAddedEvent()
List< Component > Components
void InternalLoadEntity(ValuesDictionary valuesDictionary, IdToEntityMap idToEntityMap)
ValuesDictionary ValuesDictionary
void InternalSaveEntity(ValuesDictionary valuesDictionary, EntityToIdMap entityToIdMap)
DatabaseObjectType MemberSubsystemTemplateType
ValuesDictionary ValuesDictionary
EntityDataList EntityDataList
virtual void RemoveEntity(Entity entity, bool disposeEntity)
static EventHandler< EntityAddRemoveEventArgs > EntityAdded
virtual List< Subsystem > Subsystems
virtual List< Entity > InitializeEntities(EntityDataList entityDataList)
virtual ProjectData Save()
virtual IEnumerable< Subsystem > FindSubsystems(Type type)
virtual T FindSubsystem< T >()
static Action< Project > BeforeSubsystemsAndEntitiesLoad
virtual void AddEntities(IEnumerable< Entity > entities)
bool PostponeFireEntityAddedEvents
static Dictionary< Entity, bool > DetermineNotOwnedEntities(IEnumerable< Entity > entities)
GameDatabase m_gameDatabase
DatabaseObject m_projectTemplate
virtual Entity FindEntity(int EntityID)
virtual void LoadSubsystem(Subsystem subsystem, Dictionary< string, Subsystem > subsystemsByName, Dictionary< Subsystem, bool > loadedSubsystems, int depth)
virtual Subsystem FindSubsystem(string name, bool throwOnError)
virtual Subsystem FindSubsystem(Type type, string name, bool throwOnError)
virtual void FireEntityAddedEvents(Entity entity)
virtual Entity CreateEntity(ValuesDictionary valuesDictionary, int entityId=0)
virtual EntityDataList SaveEntities(IEnumerable< Entity > entities)
virtual void LoadEntities(EntityDataList entityDataList, List< Entity > entityList)
virtual IEnumerable< T > FindSubsystems< T >()
Project(GameDatabase gameDatabase, ProjectData projectData)
virtual void AddEntity(Entity entity)
List< Subsystem > m_subsystems
virtual void RemoveEntities(IEnumerable< Entity > entities, bool disposeEntities)
virtual GameDatabase GameDatabase
virtual void FireEntityRemovedEvents(Entity entity)
static Action< Project > OnProjectLoad
Dictionary< Entity, bool > m_entities
virtual DatabaseObject ProjectTemplate
ProjectData m_projectData
static EventHandler< EntityAddRemoveEventArgs > EntityRemoved
virtual Dictionary< Entity, bool >.KeyCollection Entities
virtual void OnEntityAdded(Entity entity)
ValuesDictionary ValuesDictionary
virtual void Load(ValuesDictionary valuesDictionary)
virtual void OnEntityRemoved(Entity entity)
virtual void Save(ValuesDictionary valuesDictionary)
DatabaseObject(DatabaseObjectType databaseObjectType, Guid guid, string name, object value)
IEnumerable< object > Values
DatabaseObject DatabaseObject