]> git.tdb.fi Git - libs/game.git/blobdiff - source/game/owned.h
Emit events on entity and component creation and destruction
[libs/game.git] / source / game / owned.h
index e20ff775b61ed557201f4af40bb9244912d8452e..620c6aab54e2114a7e3c718256fb794a92593d47 100644 (file)
@@ -2,6 +2,7 @@
 #define MSP_GAME_OWNED_H_
 
 #include <stdexcept>
+#include "events.h"
 #include "handle.h"
 #include "stage.h"
 
@@ -41,12 +42,19 @@ Owned<T>::Owned(Handle<P> parent, Args &&... args)
        if(!parent)
                throw std::invalid_argument("Owned::Owned");
 
-       Pool<T> &pool = get_stage(*parent).get_pools().template get_pool<T>();
+       Stage &stage = get_stage(*parent);
+       Pool<T> &pool = stage.get_pools().template get_pool<T>();
        this->ptr = pool.create(parent, std::forward<Args>(args)...);
        if constexpr(std::is_base_of_v<Component, T>)
+       {
                parent->add_component(*this);
+               stage.get_event_source().emit<Events::ComponentCreated>(*this);
+       }
        else
+       {
                parent->add_child(*this);
+               stage.get_event_source().emit<Events::EntityCreated>(*this);
+       }
 }
 
 template<typename T>
@@ -77,13 +85,20 @@ void Owned<T>::destroy()
        if(!obj)
                return;
 
-       Pool<T> &pool = get_stage(*obj).get_pools().template get_pool<T>();
+       Stage &stage = get_stage(*obj);
 
        if constexpr(std::is_base_of_v<Component, T>)
+       {
+               stage.get_event_source().emit<Events::ComponentDestroyed>(*this);
                obj->get_entity()->remove_component(*this);
+       }
        else if(auto parent = obj->get_parent().get())
+       {
+               stage.get_event_source().emit<Events::EntityDestroyed>(*this);
                parent->remove_child(*this);
+       }
 
+       Pool<T> &pool = stage.get_pools().template get_pool<T>();
        pool.destroy(this->ptr);
 }