From e4be23ee96c2bfe792507abcb234fefac6bd9785 Mon Sep 17 00:00:00 2001 From: Mergul Date: Sat, 23 Mar 2019 21:47:39 +0000 Subject: [PATCH] -onRemove() called when entity is removed from EntityManager --- source/ecs/manager.d | 31 +++++++++++++++++++++++++++++-- tests/tests.d | 4 ++-- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/source/ecs/manager.d b/source/ecs/manager.d index a1e694a..b7f0ecf 100644 --- a/source/ecs/manager.d +++ b/source/ecs/manager.d @@ -1718,6 +1718,19 @@ class EntityManager if (entity is null) return; //return if entity doesn't exist EntitiesBlock* block = getMetaData(entity); + + EntityInfo* info = block.type_info; + if(info.remove_listeners) + { + void* data_begin = block.dataBegin(); + static if (EntityID.sizeof == 8) + uint pos = cast(uint)((cast(void*) entity - data_begin) >> 3); + else + uint pos = cast(uint)((cast(void*) entity - data_begin) / EntityID.sizeof()); + + callRemoveEntityListeners(info,block,pos,pos+1); + } + id_manager.releaseID(id); //release id from manager removeEntityNoID(entity, block, true); @@ -1834,7 +1847,7 @@ class EntityManager } } - private void callAddEntityListeners(EntityInfo* info, EntitiesBlock* block, int begin, int end) + private void callAddEntityListeners(EntityInfo* info, EntitiesBlock* block, int begin, int end) @nogc nothrow { foreach(listener;info.add_listeners) { @@ -1844,7 +1857,21 @@ class EntityManager data.block = block; data.begin = begin; data.end = end; - (cast(void function (ref ListenerCallData)) system.m_entity_added)(data); + (cast(void function (ref ListenerCallData) nothrow @nogc) system.m_entity_added)(data); + } + } + + private void callRemoveEntityListeners(EntityInfo* info, EntitiesBlock* block, int begin, int end) @nogc nothrow + { + foreach(listener;info.add_listeners) + { + System* system = &systems[listener]; + ListenerCallData data; + data.system = system; + data.block = block; + data.begin = begin; + data.end = end; + (cast(void function (ref ListenerCallData) nothrow @nogc) system.m_entity_removed)(data); } } diff --git a/tests/tests.d b/tests/tests.d index 2bb14af..8d7f751 100644 --- a/tests/tests.d +++ b/tests/tests.d @@ -114,10 +114,10 @@ struct TestSystem //writeln("Entity added ID: ",data.entites[i].id.id); } - /*void onRemove(EntitiesData data) + void onRemove(EntitiesData data) { //writeln("Entity destroyed ID: ",data.entites[0].id); - }*/ + } bool onBegin() {