From 0447610b237ea03154d966e4ceb02fc69684733e Mon Sep 17 00:00:00 2001 From: thatcosmonaut Date: Mon, 19 Aug 2019 18:11:15 -0700 Subject: [PATCH] fix crash when components are added to an entity that will be destroyed --- encompass-cs/ComponentManager.cs | 21 +++++++++++---------- encompass-cs/Engine.cs | 2 ++ 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/encompass-cs/ComponentManager.cs b/encompass-cs/ComponentManager.cs index 8061e86..78539e8 100644 --- a/encompass-cs/ComponentManager.cs +++ b/encompass-cs/ComponentManager.cs @@ -44,16 +44,6 @@ namespace Encompass var id = NextID(); componentAddData.Add((entity, typeof(TComponent), id, component)); // add these here so entity and component lookups dont break on pending components - IDToComponent[id] = component; - componentIDToEntityID[id] = entity.ID; - componentIDToType[id] = typeof(TComponent); - - if (!typeToComponentIDs.ContainsKey(typeof(TComponent))) - { - typeToComponentIDs.Add(typeof(TComponent), new HashSet()); - } - typeToComponentIDs[typeof(TComponent)].Add(id); - entityIDToComponentIDs[entity.ID].Add(id); return id; } @@ -66,9 +56,20 @@ namespace Encompass internal void AddComponent(Entity entity, Type type, Guid componentID, IComponent component) { + if (!entityIDToComponentTypeToComponentID.ContainsKey(entity.ID)) { return; } + if (!entityIDToComponentTypeToComponentID[entity.ID].ContainsKey(type)) { + IDToComponent[componentID] = component; + componentIDToEntityID[componentID] = entity.ID; + componentIDToType[componentID] = type; entityIDToComponentTypeToComponentID[entity.ID][type] = componentID; + if (!typeToComponentIDs.ContainsKey(type)) + { + typeToComponentIDs.Add(type, new HashSet()); + } + typeToComponentIDs[type].Add(componentID); + entityIDToComponentIDs[entity.ID].Add(componentID); } else { diff --git a/encompass-cs/Engine.cs b/encompass-cs/Engine.cs index 88dce98..19b1ddf 100644 --- a/encompass-cs/Engine.cs +++ b/encompass-cs/Engine.cs @@ -112,6 +112,8 @@ namespace Encompass return (TComponent)componentMessageManager.GetComponentByID(componentID); } + // these next two are for the ComponentMessageEmitter only + internal IEnumerable<(Guid, TComponent)> ReadComponentsFromWorld() where TComponent : struct, IComponent { return componentManager.GetComponentsByType();