A "Respawn" componet which automatically triggers a Spawner component when the last respawned entity of that spawner is destroyed
This commit is contained in:
@@ -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<EntityWrapper, EntityWrapper> m_LastRespawnedEntity;
|
||||||
|
|
||||||
|
EventRelay<RespawnSystem, Events::EntityDeleted> m_EEntityDeleted;
|
||||||
|
bool OnEntityDeleted(const Events::EntityDeleted& e);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -68,7 +68,7 @@ protected:
|
|||||||
|
|
||||||
const std::string m_ComponentType;
|
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
|
class ImpureSystem : public virtual System
|
||||||
|
|||||||
@@ -68,4 +68,5 @@
|
|||||||
<xs:include schemaLocation="Components/NetworkComponent.xsd"/>
|
<xs:include schemaLocation="Components/NetworkComponent.xsd"/>
|
||||||
<xs:include schemaLocation="Components/ServerIdentity.xsd"/>
|
<xs:include schemaLocation="Components/ServerIdentity.xsd"/>
|
||||||
<xs:include schemaLocation="Components/ServerList.xsd"/>
|
<xs:include schemaLocation="Components/ServerList.xsd"/>
|
||||||
|
<xs:include schemaLocation="Components/Respawn.xsd"/>
|
||||||
</xs:schema>
|
</xs:schema>
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||||
|
<Respawn xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Respawn.xsd">
|
||||||
|
<Delay>0</Delay>
|
||||||
|
<_RespawnCountdown>0</_RespawnCountdown>
|
||||||
|
</Respawn>
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
|
||||||
|
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:t="types">
|
||||||
|
<xs:import schemaLocation="../Types.xsd" namespace="types"/>
|
||||||
|
|
||||||
|
<xs:element name="Respawn">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>Triggers a Spawner component after its last spawned entity is destroyed with an optional delay.</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:all>
|
||||||
|
<xs:element name="Delay" type="t:double" minOccurs="0"/>
|
||||||
|
<xs:element name="_RespawnCountdown" type="t:double" minOccurs="0"/>
|
||||||
|
</xs:all>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
</xs:schema>
|
||||||
@@ -71,6 +71,7 @@
|
|||||||
<xs:element ref="c:NetworkComponent" minOccurs="0"/>
|
<xs:element ref="c:NetworkComponent" minOccurs="0"/>
|
||||||
<xs:element ref="c:ServerIdentity" minOccurs="0"/>
|
<xs:element ref="c:ServerIdentity" minOccurs="0"/>
|
||||||
<xs:element ref="c:ServerList" minOccurs="0"/>
|
<xs:element ref="c:ServerList" minOccurs="0"/>
|
||||||
|
<xs:element ref="c:Respawn" minOccurs="0"/>
|
||||||
</xs:all>
|
</xs:all>
|
||||||
</xs:complexType>
|
</xs:complexType>
|
||||||
</xs:element>
|
</xs:element>
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -40,6 +40,7 @@
|
|||||||
#include "Game/Systems/MainMenuSystem.h"
|
#include "Game/Systems/MainMenuSystem.h"
|
||||||
#include "Game/Systems/ServerListSystem.h"
|
#include "Game/Systems/ServerListSystem.h"
|
||||||
#include "Game/Systems/StartSystem.h"
|
#include "Game/Systems/StartSystem.h"
|
||||||
|
#include "Core/RespawnSystem.h"
|
||||||
#include "Rendering/TextureSprite.h"
|
#include "Rendering/TextureSprite.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -135,6 +136,7 @@ Game::Game(int argc, char* argv[])
|
|||||||
m_SystemPipeline->AddSystem<HealthSystem>(updateOrderLevel);
|
m_SystemPipeline->AddSystem<HealthSystem>(updateOrderLevel);
|
||||||
m_SystemPipeline->AddSystem<PlayerMovementSystem>(updateOrderLevel);
|
m_SystemPipeline->AddSystem<PlayerMovementSystem>(updateOrderLevel);
|
||||||
m_SystemPipeline->AddSystem<SpawnerSystem>(updateOrderLevel);
|
m_SystemPipeline->AddSystem<SpawnerSystem>(updateOrderLevel);
|
||||||
|
m_SystemPipeline->AddSystem<RespawnSystem>(updateOrderLevel);
|
||||||
m_SystemPipeline->AddSystem<PlayerSpawnSystem>(updateOrderLevel);
|
m_SystemPipeline->AddSystem<PlayerSpawnSystem>(updateOrderLevel);
|
||||||
m_SystemPipeline->AddSystem<AssaultWeaponBehaviour>(updateOrderLevel, m_Renderer, m_OctreeCollision);
|
m_SystemPipeline->AddSystem<AssaultWeaponBehaviour>(updateOrderLevel, m_Renderer, m_OctreeCollision);
|
||||||
m_SystemPipeline->AddSystem<DefenderWeaponBehaviour>(updateOrderLevel, m_Renderer, m_OctreeCollision);
|
m_SystemPipeline->AddSystem<DefenderWeaponBehaviour>(updateOrderLevel, m_Renderer, m_OctreeCollision);
|
||||||
|
|||||||
Reference in New Issue
Block a user