diff --git a/include/Engine/Core/EPlayerDamage.h b/include/Engine/Core/EPlayerDamage.h index 87ad67aa..e0f2acd7 100644 --- a/include/Engine/Core/EPlayerDamage.h +++ b/include/Engine/Core/EPlayerDamage.h @@ -11,8 +11,6 @@ struct PlayerDamage : Event { double DamageAmount; EntityID PlayerDamagedID; - //optional TypeOfDamage - std::string TypeOfDamage; }; } diff --git a/include/Engine/Core/EShoot.h b/include/Engine/Core/EShoot.h new file mode 100644 index 00000000..fd54122f --- /dev/null +++ b/include/Engine/Core/EShoot.h @@ -0,0 +1,19 @@ +#ifndef EShoot_h__ +#define EShoot_h__ + +#include "EventBroker.h" +#include "../Core/Entity.h" +#include "Engine/GLM.h" + +namespace Events +{ + +struct Shoot : Event +{ + //ID for who made the shot + EntityID shooter; +}; + +} + +#endif \ No newline at end of file diff --git a/include/Game/Systems/WeaponSystem.h b/include/Game/Systems/WeaponSystem.h new file mode 100644 index 00000000..b85ba323 --- /dev/null +++ b/include/Game/Systems/WeaponSystem.h @@ -0,0 +1,38 @@ +#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; +}; + +#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/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 8eee335e..10432bba 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -288,7 +288,6 @@ bool Client::OnPlayerDamage(const Events::PlayerDamage & e) Packet packet(MessageType::OnInputCommand, m_SendPacketID); packet.WritePrimitive(e.DamageAmount); packet.WritePrimitive(e.PlayerDamagedID); - packet.WriteString(e.TypeOfDamage); send(packet); return false; } diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index 8a194c0e..f4373a83 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -240,7 +240,6 @@ void Server::parseOnPlayerDamage(Packet & packet) Events::PlayerDamage e; e.DamageAmount = packet.ReadPrimitive(); e.PlayerDamagedID = packet.ReadPrimitive(); - e.TypeOfDamage = packet.ReadString(); m_EventBroker->Publish(e); //LOG_DEBUG("Server::parseOnPlayerDamage: Command is %s. Value is %f. PlayerID is %i.", e.DamageAmount, e.PlayerDamagedID, e.TypeOfDamage.c_str()); } 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..ec81b08b --- /dev/null +++ b/src/Game/Systems/WeaponSystem.cpp @@ -0,0 +1,53 @@ +#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 pickDataFromShot = m_Renderer->Pick(std::get<1>(m_EShootVector[i - 1])); + if (pickDataFromShot.Entity == EntityID_Invalid) { + m_EShootVector.erase(m_EShootVector.begin() + i - 1); + continue; + } + //if its a player, do PlayerDamage event + const bool hasPlayerComponent = world->HasComponent(pickDataFromShot.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 = pickDataFromShot.Entity; + m_EventBroker->Publish(ePlayerDamage); + } + 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