From bdebc9de62cf154fb4ad8b2f398cb2fea7f6fea7 Mon Sep 17 00:00:00 2001 From: verysecrethero Date: Thu, 21 Jan 2016 11:55:51 +0100 Subject: [PATCH] WeaponSystem now handles "PrimaryFire" input events. It sends out ePlayerDamage event if it hits a player. Included some tests --- include/Game/Systems/WeaponSystem.h | 39 ++++ resources/Schema/Entities/ShootEventTest.xml | 209 +++++++++++++++++++ src/Game/Game.cpp | 2 + src/Game/Systems/WeaponSystem.cpp | 61 ++++++ 4 files changed, 311 insertions(+) create mode 100644 include/Game/Systems/WeaponSystem.h create mode 100644 resources/Schema/Entities/ShootEventTest.xml create mode 100644 src/Game/Systems/WeaponSystem.cpp diff --git a/include/Game/Systems/WeaponSystem.h b/include/Game/Systems/WeaponSystem.h new file mode 100644 index 00000000..36af4231 --- /dev/null +++ b/include/Game/Systems/WeaponSystem.h @@ -0,0 +1,39 @@ +#ifndef WeaponSystem_h__ +#define WeaponSystem_h__ + +//#include +//#include +#include "Rendering/IRenderer.h" + +#include "Common.h" +#include "Core/System.h" +#include "Core/EPlayerDamage.h" +#include "Core/EShoot.h" +#include "Input/EInputCommand.h" + +#include +#include + + +class WeaponSystem : public ImpureSystem +{ +public: + WeaponSystem(EventBroker* eventBroker, IRenderer* renderer); + + virtual void Update(World* world, double dt) override; + +private: + //methods which will take care of specific events + EventRelay m_EShoot; + bool WeaponSystem::OnShoot(const Events::Shoot& e); + + EventRelay m_EInputCommand; + bool WeaponSystem::OnInputCommand(const Events::InputCommand& e); + + IRenderer* m_Renderer; + + std::vector> m_EShootVector; + double m_TestDamageTotal = 0.0; +}; + +#endif \ No newline at end of file diff --git a/resources/Schema/Entities/ShootEventTest.xml b/resources/Schema/Entities/ShootEventTest.xml new file mode 100644 index 00000000..eae333b6 --- /dev/null +++ b/resources/Schema/Entities/ShootEventTest.xml @@ -0,0 +1,209 @@ + + + + + + + + + + + + ../assets/Models/DummyScene.obj + + + + + + + + + 60 + + + + + + + 3 + + + + + + + + + + + + + 3 + + + ../assets/Models/Core/UnitSphere.obj + + + + 3 + + + + + + + + + + + + + 1 + + + ../assets/Models/Core/UnitSphere.obj + + + + + + + + + + + + + + + 2 + + + ../assets/Models/Core/UnitSphere.obj + + + + + + + + + + + + + + 3 + + + ../assets/Models/Core/UnitSphere.obj + + + + + + + + + + + + + + + 2 + 4 + + + ../assets/Models/Core/UnitSphere.obj + + + + 2 + + + + + + + + + + + + + + ../assets/Models/Core/UnitCube.obj + + + + + 2 + + + + + + + + + + + + + ../assets/Models/Core/UnitCube.obj + + + + + 2 + + + + + + + + + + + 0 + + + + ../assets/Models/Core/UnitCube.obj + + + + + 3 + + + + + + + + + + + 0 + + + + ../assets/Models/Core/UnitCube.obj + + + + + 3 + + + + + + + + + + diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 0dd513b6..8d647f6f 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -9,6 +9,7 @@ #include "Systems/PlayerSpawnSystem.h" #include "Core/EntityFileWriter.h" #include "Game/Systems/CapturePointSystem.h" +#include "Game/Systems/WeaponSystem.h" Game::Game(int argc, char* argv[]) { @@ -82,6 +83,7 @@ Game::Game(int argc, char* argv[]) m_SystemPipeline->AddSystem(updateOrderLevel); m_SystemPipeline->AddSystem(updateOrderLevel); m_SystemPipeline->AddSystem(updateOrderLevel); + m_SystemPipeline->AddSystem(updateOrderLevel, m_Renderer); // Populate Octree with collidables ++updateOrderLevel; m_SystemPipeline->AddSystem(updateOrderLevel, m_OctreeCollision); diff --git a/src/Game/Systems/WeaponSystem.cpp b/src/Game/Systems/WeaponSystem.cpp new file mode 100644 index 00000000..ada48b54 --- /dev/null +++ b/src/Game/Systems/WeaponSystem.cpp @@ -0,0 +1,61 @@ +#include "Systems/WeaponSystem.h" + +WeaponSystem::WeaponSystem(EventBroker* eventBroker, IRenderer* renderer) + : System(eventBroker) + , ImpureSystem() + , m_Renderer(renderer) +{ + EVENT_SUBSCRIBE_MEMBER(m_EInputCommand, &WeaponSystem::OnInputCommand); + EVENT_SUBSCRIBE_MEMBER(m_EShoot, &WeaponSystem::OnShoot); +} + +void WeaponSystem::Update(World* world, double dt) +{ + for (int i = m_EShootVector.size(); i > 0; i--) + { + //TODO: check if player has enough ammo and if weapon has a cooldown or not + + //pick the object + PickData somePickData = m_Renderer->Pick(std::get<1>(m_EShootVector[i - 1])); + if (somePickData.Entity == EntityID_Invalid) { + m_EShootVector.erase(m_EShootVector.begin() + i - 1); + continue; + } + //if its a player, do PlayerDamage event + const bool hasPlayerComponent = world->HasComponent(somePickData.Entity, "Player"); + if (hasPlayerComponent) { + Events::PlayerDamage ePlayerDamage; + //TODO: damage based on weapontype/class? + //TODO: multiple shots at the same time? (shotgunner) + ePlayerDamage.DamageAmount = 25; + ePlayerDamage.PlayerDamagedID = somePickData.Entity; + ePlayerDamage.TypeOfDamage = "Some Weapon"; + m_EventBroker->Publish(ePlayerDamage); + //tests:color + m_TestDamageTotal += 0.25f; + if (m_TestDamageTotal > 6.0f) { + m_TestDamageTotal = 0.25f; + } + ComponentWrapper& playerModel = world->GetComponent(somePickData.Entity, "Model"); + playerModel["Color"] = glm::vec4(m_TestDamageTotal, 0, 0, 1); + } + m_EShootVector.erase(m_EShootVector.begin() + i - 1); + } +} + +bool WeaponSystem::OnInputCommand(const Events::InputCommand& e) +{ + if (e.Command == "PrimaryFire" && e.Value > 0) { + Events::Shoot eShoot; + eShoot.shooter = e.PlayerID; + m_EventBroker->Publish(eShoot); + } + return true; +} +bool WeaponSystem::OnShoot(const Events::Shoot& e) { + //screen center, based on current resolution! + Rectangle screenResolution = m_Renderer->Resolution(); + glm::vec2 centerScreen = glm::vec2(screenResolution.Width / 2, screenResolution.Height / 2); + m_EShootVector.push_back(std::make_pair(e.shooter, centerScreen)); + return true; +} \ No newline at end of file