From fc2d588bf9f0aaba4e17e113219d7d0382bc078c Mon Sep 17 00:00:00 2001 From: verysecrethero Date: Fri, 26 Feb 2016 11:15:00 +0100 Subject: [PATCH] Initial SpawnSystem fixes --- include/Game/Systems/AmmoPickupSystem.h | 12 +++++ ...ckupSpawnSystem.h => HealthPickupSystem.h} | 18 +++++-- src/Game/Game.cpp | 4 +- src/Game/Systems/AmmoPickupSystem.cpp | 54 +++++++++++++++---- ...SpawnSystem.cpp => HealthPickupSystem.cpp} | 53 ++++++++++++++---- src/Tests/PickupSpawnTest.cpp | 2 +- src/Tests/PickupSpawnTest.h | 6 +-- 7 files changed, 117 insertions(+), 32 deletions(-) rename include/Game/Systems/{PickupSpawnSystem.h => HealthPickupSystem.h} (51%) rename src/Game/Systems/{PickupSpawnSystem.cpp => HealthPickupSystem.cpp} (55%) diff --git a/include/Game/Systems/AmmoPickupSystem.h b/include/Game/Systems/AmmoPickupSystem.h index 0fbd9e08..7c66acff 100644 --- a/include/Game/Systems/AmmoPickupSystem.h +++ b/include/Game/Systems/AmmoPickupSystem.h @@ -20,6 +20,8 @@ public: private: EventRelay m_ETriggerTouch; bool OnTriggerTouch(Events::TriggerTouch& e); + EventRelay m_ETriggerLeave; + bool OnTriggerLeave(Events::TriggerLeave& e); struct NewAmmoPickup { glm::vec3 Pos; @@ -29,5 +31,15 @@ private: EntityID parentID; }; std::vector m_ETriggerTouchVector; + + + struct EntityAtMaxValuePickupStruct { + EntityWrapper player; + EntityWrapper pickup; + + }; + std::vector m_PickupAtMaximum; + void DoPickup(EntityWrapper &player, EntityWrapper &trigger); + }; #endif diff --git a/include/Game/Systems/PickupSpawnSystem.h b/include/Game/Systems/HealthPickupSystem.h similarity index 51% rename from include/Game/Systems/PickupSpawnSystem.h rename to include/Game/Systems/HealthPickupSystem.h index 66c5f630..b67434fe 100644 --- a/include/Game/Systems/PickupSpawnSystem.h +++ b/include/Game/Systems/HealthPickupSystem.h @@ -1,5 +1,5 @@ -#ifndef PickupSpawnSystem_h__ -#define PickupSpawnSystem_h__ +#ifndef HealthPickupSystem_h__ +#define HealthPickupSystem_h__ #include "Core/System.h" #include "Core/Transform.h" @@ -11,16 +11,18 @@ #include "Common.h" #include -class PickupSpawnSystem : public ImpureSystem +class HealthPickupSystem : public ImpureSystem { public: - PickupSpawnSystem(SystemParams params); + HealthPickupSystem(SystemParams params); virtual void Update(double dt) override; private: - EventRelay m_ETriggerTouch; + EventRelay m_ETriggerTouch; bool OnTriggerTouch(Events::TriggerTouch& e); + EventRelay m_ETriggerLeave; + bool OnTriggerLeave(Events::TriggerLeave& e); struct NewHealthPickup { glm::vec3 Pos; @@ -30,5 +32,11 @@ private: EntityID parentID; }; std::vector m_ETriggerTouchVector; + struct EntityAtMaxValuePickupStruct { + EntityWrapper player; + EntityWrapper pickup; + }; + std::vector m_PickupAtMaximum; + void DoPickup(EntityWrapper &player, EntityWrapper &trigger); }; #endif diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 24b7cd1e..7032d5c8 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -13,7 +13,7 @@ #include "Core/EntityFileWriter.h" #include "Game/Systems/CapturePointSystem.h" #include "Game/Systems/CapturePointHUDSystem.h" -#include "Game/Systems/PickupSpawnSystem.h" +#include "Game/Systems/HealthPickupSystem.h" #include "Game/Systems/AmmoPickupSystem.h" #include "Game/Systems/DamageIndicatorSystem.h" #include "Game/Systems/Weapon/WeaponSystem.h" @@ -124,7 +124,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); m_SystemPipeline->AddSystem(updateOrderLevel); diff --git a/src/Game/Systems/AmmoPickupSystem.cpp b/src/Game/Systems/AmmoPickupSystem.cpp index 250fa494..561abbdb 100644 --- a/src/Game/Systems/AmmoPickupSystem.cpp +++ b/src/Game/Systems/AmmoPickupSystem.cpp @@ -4,6 +4,7 @@ AmmoPickupSystem::AmmoPickupSystem(SystemParams params) : System(params) { EVENT_SUBSCRIBE_MEMBER(m_ETriggerTouch, &AmmoPickupSystem::OnTriggerTouch); + EVENT_SUBSCRIBE_MEMBER(m_ETriggerLeave, &AmmoPickupSystem::OnTriggerLeave); } void AmmoPickupSystem::Update(double dt) @@ -36,6 +37,21 @@ void AmmoPickupSystem::Update(double dt) break; } } + //still touching AmmoPickupAtMaxHealthAmmo? + for (auto& it = m_PickupAtMaximum.begin(); it != m_PickupAtMaximum.end(); ++it) { + if (!it->player.Valid() || !it->pickup.Valid()) { + m_PickupAtMaximum.erase(it); + break; + + } + if ((int)it->player["AssaultWeapon"]["Ammo"] < (int)it->player["AssaultWeapon"]["MaxAmmo"]) { + DoPickup(it->player, it->pickup); + m_PickupAtMaximum.erase(it); + break; + + } + } + } @@ -51,29 +67,47 @@ bool AmmoPickupSystem::OnTriggerTouch(Events::TriggerTouch& e) if (!e.Trigger.HasComponent("AmmoPickup")) { return false; } - int maxWeaponAmmo = (int)e.Entity["AssaultWeapon"]["MaxAmmo"]; - int& currentAmmo = (int)e.Entity["AssaultWeapon"]["Ammo"]; - int ammoGiven = 0.01*(double)e.Trigger["AmmoPickup"]["AmmoGain"] * maxWeaponAmmo; //cant pick up ammopacks if you are already at MaxAmmo - if (currentAmmo >= maxWeaponAmmo) { + if ((int)e.Entity["AssaultWeapon"]["Ammo"] >= (int)e.Entity["AssaultWeapon"]["MaxAmmo"]) { + m_PickupAtMaximum.push_back({ e.Entity, e.Trigger }); return false; } + DoPickup(e.Entity, e.Trigger); + + return true; +} +bool AmmoPickupSystem::OnTriggerLeave(Events::TriggerLeave& e) { + //triggerleave erases possible AmmoPickupAtMaxHealthAmmo + for (auto& it = m_PickupAtMaximum.begin(); it != m_PickupAtMaximum.end(); ++it) { + if (it->pickup.ID == e.Trigger.ID && it->player.ID == e.Entity.ID) { + m_PickupAtMaximum.erase(it); + break; + + } + + } + return true; +} +void AmmoPickupSystem::DoPickup(EntityWrapper &player, EntityWrapper &trigger) { + int maxWeaponAmmo = (int)player["AssaultWeapon"]["MaxAmmo"]; + int& currentAmmo = (int)player["AssaultWeapon"]["Ammo"]; + int ammoGiven = 0.01*(double)trigger["AmmoPickup"]["AmmoGain"] * maxWeaponAmmo; //personEntered = e.Entity, thingEntered = e.Trigger Events::AmmoPickup ePlayerAmmoPickup; ePlayerAmmoPickup.AmmoGain = ammoGiven; - ePlayerAmmoPickup.Player = e.Entity; + ePlayerAmmoPickup.Player = player; m_EventBroker->Publish(ePlayerAmmoPickup); + //immediately give the player the ammo currentAmmo = std::min(currentAmmo + ammoGiven, maxWeaponAmmo); //copy position, ammogain, respawntimer (twice since one of the values will be counted down to 0, the other will be set in the new object) //we need to copy all values since each value can be different for each ammoPickup - m_ETriggerTouchVector.push_back({ e.Trigger["Transform"]["Position"], e.Trigger["AmmoPickup"]["AmmoGain"], - e.Trigger["AmmoPickup"]["RespawnTimer"], e.Trigger["AmmoPickup"]["RespawnTimer"], m_World->GetParent(e.Trigger.ID) }); + m_ETriggerTouchVector.push_back({ trigger["Transform"]["Position"], trigger["AmmoPickup"]["AmmoGain"], + trigger["AmmoPickup"]["RespawnTimer"], trigger["AmmoPickup"]["RespawnTimer"], m_World->GetParent(trigger.ID) }); //delete the ammopickup - m_World->DeleteEntity(e.Trigger.ID); - return true; -} + m_World->DeleteEntity(trigger.ID); +} \ No newline at end of file diff --git a/src/Game/Systems/PickupSpawnSystem.cpp b/src/Game/Systems/HealthPickupSystem.cpp similarity index 55% rename from src/Game/Systems/PickupSpawnSystem.cpp rename to src/Game/Systems/HealthPickupSystem.cpp index abf59007..b5941bec 100644 --- a/src/Game/Systems/PickupSpawnSystem.cpp +++ b/src/Game/Systems/HealthPickupSystem.cpp @@ -1,12 +1,13 @@ -#include "Systems/PickupSpawnSystem.h" +#include "Systems/HealthPickupSystem.h" -PickupSpawnSystem::PickupSpawnSystem(SystemParams params) +HealthPickupSystem::HealthPickupSystem(SystemParams params) : System(params) { - EVENT_SUBSCRIBE_MEMBER(m_ETriggerTouch, &PickupSpawnSystem::OnTriggerTouch); + EVENT_SUBSCRIBE_MEMBER(m_ETriggerTouch, &HealthPickupSystem::OnTriggerTouch); + EVENT_SUBSCRIBE_MEMBER(m_ETriggerLeave, &HealthPickupSystem::OnTriggerLeave); } -void PickupSpawnSystem::Update(double dt) +void HealthPickupSystem::Update(double dt) { for (auto it = m_ETriggerTouchVector.begin(); it != m_ETriggerTouchVector.end(); ++it) { @@ -36,32 +37,62 @@ void PickupSpawnSystem::Update(double dt) break; } } + //still touching AmmoPickupAtMaxHealthAmmo? + for (auto& it = m_PickupAtMaximum.begin(); it != m_PickupAtMaximum.end(); ++it) { + if (!it->player.Valid() || !it->pickup.Valid()) { + m_PickupAtMaximum.erase(it); + break; + + } + if ((int)it->player["Health"]["Health"] < (int)it->player["Health"]["MaxHealth"]) { + DoPickup(it->player, it->pickup); + m_PickupAtMaximum.erase(it); + break; + + } + } } -bool PickupSpawnSystem::OnTriggerTouch(Events::TriggerTouch& e) +bool HealthPickupSystem::OnTriggerTouch(Events::TriggerTouch& e) { if (!e.Trigger.HasComponent("HealthPickup")) { return false; } - double healthGiven = 0.01*(double)e.Trigger["HealthPickup"]["HealthGain"] * (double)e.Entity["Health"]["MaxHealth"]; //cant pick up healthpacks if you are already at MaxHealth if ((double)e.Entity["Health"]["Health"] >= (double)e.Entity["Health"]["MaxHealth"]) { + m_PickupAtMaximum.push_back({ e.Entity, e.Trigger }); return false; } + DoPickup(e.Entity, e.Trigger); + return true; +} +bool HealthPickupSystem::OnTriggerLeave(Events::TriggerLeave& e) { + //triggerleave erases possible AmmoPickupAtMaxHealthAmmo + for (auto& it = m_PickupAtMaximum.begin(); it != m_PickupAtMaximum.end(); ++it) { + if (it->pickup.ID == e.Trigger.ID && it->player.ID == e.Entity.ID) { + m_PickupAtMaximum.erase(it); + break; + } + } + return true; +} +void HealthPickupSystem::DoPickup(EntityWrapper &player, EntityWrapper &trigger) { + double healthGiven = 0.01*(double)trigger["HealthPickup"]["HealthGain"] * (double)player["Health"]["MaxHealth"]; + //personEntered = e.Entity, thingEntered = e.Trigger Events::PlayerHealthPickup ePlayerHealthPickup; ePlayerHealthPickup.HealthAmount = healthGiven; - ePlayerHealthPickup.Player = e.Entity; + ePlayerHealthPickup.Player = player; m_EventBroker->Publish(ePlayerHealthPickup); //copy position, healthgain, respawntimer (twice since one of the values will be counted down to 0, the other will be set in the new object) //we need to copy all values since each value can be different for each healthPickup - m_ETriggerTouchVector.push_back({ (glm::vec3)e.Trigger["Transform"]["Position"] ,e.Trigger["HealthPickup"]["HealthGain"], - e.Trigger["HealthPickup"]["RespawnTimer"],e.Trigger["HealthPickup"]["RespawnTimer"], m_World->GetParent(e.Trigger.ID) }); + m_ETriggerTouchVector.push_back({ (glm::vec3)trigger["Transform"]["Position"] ,trigger["HealthPickup"]["HealthGain"], + trigger["HealthPickup"]["RespawnTimer"],trigger["HealthPickup"]["RespawnTimer"], m_World->GetParent(trigger.ID) }); //delete the healthpickup - m_World->DeleteEntity(e.Trigger.ID); - return true; + m_World->DeleteEntity(trigger.ID); } + diff --git a/src/Tests/PickupSpawnTest.cpp b/src/Tests/PickupSpawnTest.cpp index 4acd897e..fe33bf1a 100644 --- a/src/Tests/PickupSpawnTest.cpp +++ b/src/Tests/PickupSpawnTest.cpp @@ -41,7 +41,7 @@ PickupSpawnTest::PickupSpawnTest(int runTestNumber) // Create system pipeline m_SystemPipeline = new SystemPipeline(m_World, m_EventBroker, false, false); m_SystemPipeline->AddSystem(0); - m_SystemPipeline->AddSystem(1); + m_SystemPipeline->AddSystem(1); //must register components (Components.xsd), else you cant create entities. Easiest done by loading a test xsd file auto file = ResourceManager::Load("Schema/Entities/HealthPickup.xml"); diff --git a/src/Tests/PickupSpawnTest.h b/src/Tests/PickupSpawnTest.h index b9d5483a..a66f7bc1 100644 --- a/src/Tests/PickupSpawnTest.h +++ b/src/Tests/PickupSpawnTest.h @@ -31,7 +31,7 @@ #include "Collision/CollisionSystem.h" #include "Core/EntityFileWriter.h" #include "Game/Systems/HealthSystem.h" -#include "Game/Systems/PickupSpawnSystem.h" +#include "Game/Systems/HealthPickupSystem.h" #include "Core/ResourceManager.h" @@ -56,9 +56,9 @@ private: EntityID m_PlayerID, m_HealthPickupID; int m_RunTestNumber; - EventRelay m_HP; + EventRelay m_HP; bool OnHealthPickup(Events::PlayerHealthPickup& e); - EventRelay m_PS; + EventRelay m_PS; bool OnPickupSpawned(Events::PickupSpawned& e); bool m_TestStage1Success = false;