diff --git a/include/Game/Systems/AbilityCooldownHUDSystem.h b/include/Game/Systems/AbilityCooldownHUDSystem.h
new file mode 100644
index 00000000..610b4dc2
--- /dev/null
+++ b/include/Game/Systems/AbilityCooldownHUDSystem.h
@@ -0,0 +1,17 @@
+#ifndef AbilityCooldownHUDSystem_h__
+#define AbilityCooldownHUDSystem_h__
+
+#include "../../Engine/Core/System.h"
+#include "../../Engine/GLM.h"
+
+class AbilityCooldownHUDSystem : public ImpureSystem
+{
+public:
+ AbilityCooldownHUDSystem(SystemParams params)
+ : System(params)
+ { }
+
+ virtual void Update(double dt) override;
+};
+
+#endif
\ No newline at end of file
diff --git a/resources/Schema/Components.xsd b/resources/Schema/Components.xsd
index 0c8886f3..004a11a7 100644
--- a/resources/Schema/Components.xsd
+++ b/resources/Schema/Components.xsd
@@ -51,6 +51,7 @@
+
diff --git a/resources/Schema/Components/AbilityCooldownHUD.xml b/resources/Schema/Components/AbilityCooldownHUD.xml
new file mode 100644
index 00000000..8f91bbc3
--- /dev/null
+++ b/resources/Schema/Components/AbilityCooldownHUD.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/resources/Schema/Components/AbilityCooldownHUD.xsd b/resources/Schema/Components/AbilityCooldownHUD.xsd
new file mode 100644
index 00000000..5bfb01a8
--- /dev/null
+++ b/resources/Schema/Components/AbilityCooldownHUD.xsd
@@ -0,0 +1,9 @@
+
+
+
+
+
+ HUD element for tracking ability cooldown. If it has a sprite and fill component it will fill the sprite with chosen color depending on the cooldown.\n A child with text component named "Cooldown"
+
+
+
\ No newline at end of file
diff --git a/resources/Schema/Types/Entity.xsd b/resources/Schema/Types/Entity.xsd
index 57445a15..1d8ea8f3 100644
--- a/resources/Schema/Types/Entity.xsd
+++ b/resources/Schema/Types/Entity.xsd
@@ -51,6 +51,7 @@
+
diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp
index 21f5c901..ab4b9652 100644
--- a/src/Game/Game.cpp
+++ b/src/Game/Game.cpp
@@ -27,6 +27,7 @@
#include "Rendering/AnimationSystem.h"
#include "Network/MultiplayerSnapshotFilter.h"
#include "Game/Systems/AmmunitionHUDSystem.h"
+#include "Game/Systems/AbilityCooldownHUDSystem.h"
#include "Game/Systems/CapturePointArrowHUDSystem.h"
#include "Game/Systems/KillFeedSystem.h"
#include "Game/Systems/BoostSystem.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_SystemPipeline->AddSystem(updateOrderLevel);
diff --git a/src/Game/Systems/AbilityCooldownHUDSystem.cpp b/src/Game/Systems/AbilityCooldownHUDSystem.cpp
new file mode 100644
index 00000000..44180a62
--- /dev/null
+++ b/src/Game/Systems/AbilityCooldownHUDSystem.cpp
@@ -0,0 +1,30 @@
+#include "Game/Systems/AbilityCooldownHUDSystem.h"
+
+void AbilityCooldownHUDSystem::Update(double dt)
+{
+ //HUD element for tracking cooldown on the parent entity with Dashability TODO: Make sure it support other abilities when they are made.
+
+ auto abilityHUDs = m_World->GetComponents("AbilityCooldownHUD");
+ if (abilityHUDs == nullptr)
+ return;
+
+ for (auto& abilityHUDC : *abilityHUDs) {
+ EntityWrapper entity = EntityWrapper(m_World, abilityHUDC.EntityID);
+ EntityWrapper abilityEntity = entity.FirstParentWithComponent("DashAbility");
+ if (!abilityEntity.Valid())
+ return;
+ EntityWrapper cooldownTextEntity = entity.FirstChildByName("Cooldown");
+ if(cooldownTextEntity.Valid()) {
+ if(cooldownTextEntity.HasComponent("Text"))
+ {
+ double maxAbilityCD = (double)abilityEntity["DashAbility"]["CoolDownMaxTimer"];
+ double currentAbilityCD = (double)abilityEntity["DashAbility"]["CoolDownTimer"];
+ currentAbilityCD = currentAbilityCD >= 0.0 ? currentAbilityCD : 0.0;
+ std::string t = (std::string&)cooldownTextEntity["Text"]["Content"] = std::to_string(currentAbilityCD).substr(0, 3);
+ if(entity.HasComponent("Fill")) {
+ entity["Fill"]["Percentage"] = currentAbilityCD/maxAbilityCD; //TODO: current time needs to be in the component.
+ }
+ }
+ }
+ }
+}