diff --git a/include/Engine/Core/RespawnSystem.h b/include/Engine/Core/RespawnSystem.h index e69de29b..bd604b79 100644 --- a/include/Engine/Core/RespawnSystem.h +++ b/include/Engine/Core/RespawnSystem.h @@ -0,0 +1,22 @@ +#ifndef RespawnSystem_h__ +#define RespawnSystem_h__ + +#include "System.h" +#include "SpawnerSystem.h" +#include "EEntityDeleted.h" + +class RespawnSystem : public PureSystem +{ +public: + RespawnSystem(SystemParams params); + + virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cRespawn, double dt) override; + +private: + std::unordered_map m_LastRespawnedEntity; + + EventRelay m_EEntityDeleted; + bool OnEntityDeleted(const Events::EntityDeleted& e); +}; + +#endif \ No newline at end of file diff --git a/include/Engine/Core/System.h b/include/Engine/Core/System.h index 1ca1c824..952d4b5e 100644 --- a/include/Engine/Core/System.h +++ b/include/Engine/Core/System.h @@ -68,7 +68,7 @@ protected: const std::string m_ComponentType; - virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& scoreScreen, double dt) = 0; + virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cComponent, double dt) = 0; }; class ImpureSystem : public virtual System diff --git a/resources/Schema/Components.xsd b/resources/Schema/Components.xsd index bc6da932..dc2b2e7b 100644 --- a/resources/Schema/Components.xsd +++ b/resources/Schema/Components.xsd @@ -68,4 +68,5 @@ + \ No newline at end of file diff --git a/resources/Schema/Components/Respawn.xml b/resources/Schema/Components/Respawn.xml new file mode 100644 index 00000000..13c317aa --- /dev/null +++ b/resources/Schema/Components/Respawn.xml @@ -0,0 +1,5 @@ + + + 0 + <_RespawnCountdown>0 + \ No newline at end of file diff --git a/resources/Schema/Components/Respawn.xsd b/resources/Schema/Components/Respawn.xsd new file mode 100644 index 00000000..b4b0a982 --- /dev/null +++ b/resources/Schema/Components/Respawn.xsd @@ -0,0 +1,17 @@ + + + + + + + + Triggers a Spawner component after its last spawned entity is destroyed with an optional delay. + + + + + + + + + diff --git a/resources/Schema/Types/Entity.xsd b/resources/Schema/Types/Entity.xsd index c0ac15aa..9026f329 100644 --- a/resources/Schema/Types/Entity.xsd +++ b/resources/Schema/Types/Entity.xsd @@ -71,6 +71,7 @@ + diff --git a/src/Engine/Core/RespawnSystem.cpp b/src/Engine/Core/RespawnSystem.cpp new file mode 100644 index 00000000..17a48c91 --- /dev/null +++ b/src/Engine/Core/RespawnSystem.cpp @@ -0,0 +1,32 @@ +#include "Core/RespawnSystem.h" + +RespawnSystem::RespawnSystem(SystemParams params) + : System(params) + , PureSystem("Respawn") +{ + EVENT_SUBSCRIBE_MEMBER(m_EEntityDeleted, &RespawnSystem::OnEntityDeleted); +} + +void RespawnSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& cRespawn, double dt) +{ + if (!entity.HasComponent("Spawner")) { + return; + } + + EntityWrapper& lastRespawnedEntity = m_LastRespawnedEntity[entity]; + if (!lastRespawnedEntity.Valid()) { + double& _respawnCountdown = cRespawn["_RespawnCountdown"]; + _respawnCountdown -= dt; + if (_respawnCountdown <= 0) { + lastRespawnedEntity = SpawnerSystem::Spawn(entity, entity); + _respawnCountdown = cRespawn["Delay"]; + } + } +} + +bool RespawnSystem::OnEntityDeleted(const Events::EntityDeleted& e) +{ + m_LastRespawnedEntity.erase(e.DeletedEntity); + return true; +} + diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index d30023bf..0bf5915b 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -40,6 +40,7 @@ #include "Game/Systems/MainMenuSystem.h" #include "Game/Systems/ServerListSystem.h" #include "Game/Systems/StartSystem.h" +#include "Core/RespawnSystem.h" #include "Rendering/TextureSprite.h" @@ -135,6 +136,7 @@ Game::Game(int argc, char* argv[]) m_SystemPipeline->AddSystem(updateOrderLevel); m_SystemPipeline->AddSystem(updateOrderLevel); m_SystemPipeline->AddSystem(updateOrderLevel); + m_SystemPipeline->AddSystem(updateOrderLevel); m_SystemPipeline->AddSystem(updateOrderLevel); m_SystemPipeline->AddSystem(updateOrderLevel, m_Renderer, m_OctreeCollision); m_SystemPipeline->AddSystem(updateOrderLevel, m_Renderer, m_OctreeCollision);