From df05f1909b08b37a3e02d86e1a73730d6b2b7f5a Mon Sep 17 00:00:00 2001 From: verysecrethero Date: Thu, 28 Jan 2016 11:43:38 +0100 Subject: [PATCH] Completed the code to trigger the 3rd person camera on death. Cleaned up PlayerDeathSystem. Fixed HealthSystemTest. Removed the test for PlayerDeathSystem --- include/Game/Systems/PlayerDeathSystem.h | 18 +-- src/Game/Systems/HealthSystem.cpp | 2 +- src/Game/Systems/PlayerDeathSystem.cpp | 191 +++++------------------ src/Tests/HealthSystemTest.cpp | 22 ++- 4 files changed, 52 insertions(+), 181 deletions(-) diff --git a/include/Game/Systems/PlayerDeathSystem.h b/include/Game/Systems/PlayerDeathSystem.h index 3f7268ca..c59aea03 100644 --- a/include/Game/Systems/PlayerDeathSystem.h +++ b/include/Game/Systems/PlayerDeathSystem.h @@ -3,15 +3,11 @@ #include "Core/System.h" #include "Input/EInputCommand.h" -#include "Systems/SpawnerSystem.h" -#include "Events/ESpawnerSpawn.h" -#include "Core/EPlayerSpawned.h" +#include "GLM.h" #include "Rendering/ESetCamera.h" #include "Core/ConfigFile.h" #include "Core/EPlayerDeath.h" -//tests -#include "Core/EPlayerDamage.h" class PlayerDeathSystem : public ImpureSystem { @@ -21,18 +17,6 @@ public: virtual void Update(double dt) override; private: - struct SpawnRequest - { - int PlayerID; - ComponentInfo::EnumType Team; - }; - - bool m_NetworkEnabled = false; - std::vector m_SpawnRequests; - std::map m_PlayerEntities; - - EventRelay m_OnInputCommand; - bool OnInputCommand(const Events::InputCommand& e); EventRelay m_OnPlayerDeath; bool OnPlayerDeath(Events::PlayerDeath& e); }; diff --git a/src/Game/Systems/HealthSystem.cpp b/src/Game/Systems/HealthSystem.cpp index 102a4be6..1b747046 100644 --- a/src/Game/Systems/HealthSystem.cpp +++ b/src/Game/Systems/HealthSystem.cpp @@ -24,7 +24,7 @@ bool HealthSystem::OnPlayerDamaged(Events::PlayerDamage& e) ePlayerDeath.PlayerID = e.Player.ID; ePlayerDeath.Player = e.Player; m_EventBroker->Publish(ePlayerDeath); - //m_World->DeleteEntity(e.Player.ID); + //Note: we will delete the entity in PlayerDeathSystem } return true; diff --git a/src/Game/Systems/PlayerDeathSystem.cpp b/src/Game/Systems/PlayerDeathSystem.cpp index ab20dbce..7085a23f 100644 --- a/src/Game/Systems/PlayerDeathSystem.cpp +++ b/src/Game/Systems/PlayerDeathSystem.cpp @@ -3,181 +3,72 @@ PlayerDeathSystem::PlayerDeathSystem(World* m_World, EventBroker* eventBroker) : System(m_World, eventBroker) { - EVENT_SUBSCRIBE_MEMBER(m_OnInputCommand, &PlayerDeathSystem::OnInputCommand); EVENT_SUBSCRIBE_MEMBER(m_OnPlayerDeath, &PlayerDeathSystem::OnPlayerDeath); - m_NetworkEnabled = ResourceManager::Load("Config.ini")->Get("Networking.StartNetwork", false); } void PlayerDeathSystem::Update(double dt) { - auto playerSpawns = m_World->GetComponents("PlayerSpawn"); - if (playerSpawns == nullptr) { - return; - } - - for (auto& req : m_SpawnRequests) { - for (auto& cPlayerSpawn : *playerSpawns) { - EntityWrapper spawner(m_World, cPlayerSpawn.EntityID); - if (!spawner.HasComponent("Spawner")) { - continue; - } - - // If the spawner has a team affiliation, check it - if (spawner.HasComponent("Team")) { - if ((int)spawner["Team"]["Team"] != req.Team) { - continue; - } - } - - // Spawn the player! - EntityWrapper player = SpawnerSystem::Spawn(spawner); - // Set the player team affiliation - player["Team"]["Team"] = req.Team; - - // Publish a PlayerSpawned event - Events::PlayerSpawned e; - e.PlayerID = req.PlayerID; - e.Player = player; - e.Spawner = spawner; - m_EventBroker->Publish(e); - - } - } - m_SpawnRequests.clear(); -} - -bool PlayerDeathSystem::OnInputCommand(const Events::InputCommand& e) -{ - //testing: Jump -> playerdamage - if (e.Command != "Jump") { - return false; - } - - // 0 = released - if (e.Value != 0) { - return false; - } - - auto players = m_World->GetComponents("Player"); - - for (auto& cPlayer : *players) { - EntityWrapper player(m_World, cPlayer.EntityID); - Events::PlayerDamage e; - e.Player = player; - e.Damage = 50; - m_EventBroker->Publish(e); - } - - - - return true; } bool PlayerDeathSystem::OnPlayerDeath(Events::PlayerDeath& e) { - //// When a player is actually spawned (since the actual spawning is handled on the server) - - //// Check if a player already exists - //if (m_PlayerEntities.count(e.PlayerID) != 0) { - // // TODO: Disallow infinite respawning here - // m_World->DeleteEntity(m_PlayerEntities[e.PlayerID].ID); - //} - - //// Store the player for future reference - //m_PlayerEntities[e.PlayerID] = e.Player; - - //// Set the camera to the correct entity - //EntityWrapper cameraEntity = e.Player.FirstChildByName("Camera"); - //if (cameraEntity.Valid()) { - // Events::SetCamera e; - // e.CameraEntity = cameraEntity; - // m_EventBroker->Publish(e); - //} - - //// HACK: Set the player model color to team color - //EntityWrapper playerModel = e.Player.FirstChildByName("PlayerModel"); - //if (playerModel.Valid() && e.Player.HasComponent("Team")) { - // ComponentWrapper cTeam = e.Player["Team"]; - // ComponentWrapper cModel = playerModel["Model"]; - // if ((ComponentInfo::EnumType)cTeam["Team"] == cTeam["Team"].Enum("Red")) { - // cModel["Color"] = glm::vec3(1.f, 0.f, 0.f); - // } else if ((ComponentInfo::EnumType)cTeam["Team"] == cTeam["Team"].Enum("Blue")) { - // cModel["Color"] = glm::vec3(0.f, 0.25f, 1.f); - // } - //} - - //// TODO: Set the player name to whatever - //EntityWrapper playerName = e.Player.FirstChildByName("PlayerName"); - //if (playerName.Valid()) { - // playerName["Text"]["Content"] = e.PlayerName; - //} - - //m_World->DeleteEntity(e.Player.ID); - - //koppla till en kamera modell för att explodera den - - auto cameras = m_World->GetComponents("Camera"); - - for (auto& someCamera : *cameras) { - EntityWrapper entity = EntityWrapper(m_World, someCamera.EntityID); - auto cameraID = entity.ID; - auto modelID = entity.FirstChildByName("HUD"); - auto weapID = entity.FirstChildByName("Weapon").ID; - - // auto modelID = m_World->GetComponent(e.PlayerID, "Camera"); - ComponentWrapper& explosionEffect = m_World->AttachComponent(weapID, "ExplosionEffect"); - ComponentWrapper& lifeTime = m_World->AttachComponent(weapID, "Lifetime"); - (glm::vec3)explosionEffect["ExplosionOrigin"] = glm::vec3(0, 0, 0); - //explosionEffect["ExplosionOrigin"] = e.Player["Transform"]["Position"]; - (double)explosionEffect["TimeSinceDeath"] = 0.0; - (double)explosionEffect["ExplosionDuration"] = 2.0; - explosionEffect["EndColor"] = glm::vec4(0, 0, 0, 1); - (bool)explosionEffect["Randomness"] = false; - (double)explosionEffect["RandomnessScalar"] = 1.0; - (glm::vec2)explosionEffect["Velocity"] = glm::vec2(1, 1); - (bool)explosionEffect["ColorByDistance"] = false; - (bool)explosionEffect["ExponentialAccelaration"] = false; - lifeTime["Lifetime"] = 2.0; - } - - - auto t = e.Player.FirstChildByName("PlayerModel"); - auto playerEntityModel = t["Model"]; - auto playerEntityAnimation = t["Animation"]; - auto playerEntityTransform = t["Transform"]; - //auto playerEntityModel = e.Player["PlayerModel"]; -// ComponentWrapper& playerEntityModel = e.Player.FirstChildByName("PlayerModel"); + //current components for player that we need + auto playerModelEWrapper = e.Player.FirstChildByName("PlayerModel"); + auto playerEntityModel = playerModelEWrapper["Model"]; + auto playerEntityAnimation = playerModelEWrapper["Animation"]; + auto playerEntityTransform = playerModelEWrapper["Transform"]; + //create new entity with those components + //graphics bug: model must have an animationcomponent to be able to display it auto newEntity = m_World->CreateEntity(); ComponentWrapper& newEntityModel = m_World->AttachComponent(newEntity, "Model"); ComponentWrapper& newAnimationModel = m_World->AttachComponent(newEntity, "Animation"); ComponentWrapper& newTransformModel = m_World->AttachComponent(newEntity, "Transform"); - - //ComponentWrapper& playerEntityModel = m_World->GetComponent(e.PlayerID, "PlayerModel"); playerEntityModel.Copy(newEntityModel); playerEntityAnimation.Copy(newAnimationModel); playerEntityTransform.Copy(newTransformModel); - newAnimationModel["Speed"] = (double)0.0; - auto t2 = e.Player["Transform"]["Position"]; - newTransformModel["Position"] = (glm::vec3)e.Player["Transform"]["Position"]; - newTransformModel["Scale"] = glm::vec3(5, 5, 5); - //auto tr = m_World->GetComponent(newEntityModel.EntityID, "Transform"); - //tr["Position"] = glm::vec3(0, 50, 0); - ComponentWrapper& explosionEffect = m_World->AttachComponent(newEntityModel.EntityID, "ExplosionEffect"); - ComponentWrapper& lifeTime = m_World->AttachComponent(newEntityModel.EntityID, "Lifetime"); + //change the animation speed and make sure the explosioneffect spawns at the players position + newAnimationModel["Speed"] = (double)0.0; + newEntityModel["Color"] = glm::vec4(1, 0, 0, 1); + newTransformModel["Position"] = (glm::vec3)e.Player["Transform"]["Position"]; + newTransformModel["Scale"] = glm::vec3(1, 1, 1); + + //add the explosion with a lifetime + ComponentWrapper& explosionEffect = m_World->AttachComponent(newEntity, "ExplosionEffect"); + ComponentWrapper& lifeTime = m_World->AttachComponent(newEntity, "Lifetime"); (glm::vec3)explosionEffect["ExplosionOrigin"] = (glm::vec3)e.Player["Transform"]["Position"]; - //explosionEffect["ExplosionOrigin"] = e.Player["Transform"]["Position"]; (double)explosionEffect["TimeSinceDeath"] = 0.0; (double)explosionEffect["ExplosionDuration"] = 8.0; - explosionEffect["EndColor"] = glm::vec4(0, 0, 0, 1); + (glm::vec4)explosionEffect["EndColor"] = glm::vec4(0, 0, 0, 1); (bool)explosionEffect["Randomness"] = false; (double)explosionEffect["RandomnessScalar"] = 1.0; - (glm::vec2)explosionEffect["Velocity"] = glm::vec2(1, 1); + (glm::vec2)explosionEffect["Velocity"] = glm::vec2(0.1f, 0.1f); (bool)explosionEffect["ColorByDistance"] = false; (bool)explosionEffect["ExponentialAccelaration"] = false; - lifeTime["Lifetime"] = 8.0; + lifeTime["Lifetime"] = (double)8.0; + //create a camera (with lifetime) slightly above the player and look down at the player + auto cameraEntity = m_World->CreateEntity(); + ComponentWrapper& thirdPersonCameraLifeTime = m_World->AttachComponent(cameraEntity, "Lifetime"); + ComponentWrapper& thirdPersonCamera = m_World->AttachComponent(cameraEntity, "Camera"); + ComponentWrapper& thirdPersonCameraTransform = m_World->AttachComponent(cameraEntity, "Transform"); + auto pos = (glm::vec3)e.Player["Transform"]["Position"]; + pos.y += 10.0f; + thirdPersonCameraTransform["Position"] = (glm::vec3)pos; + //http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-17-quaternions/ + thirdPersonCameraTransform["Orientation"] = glm::vec3(-0.7f, 1.46f, 0.8f); + thirdPersonCamera["FOV"] = 120.0; + thirdPersonCamera["NearClip"] = 0.1; + thirdPersonCamera["FarClip"] = 10000.0; + thirdPersonCameraLifeTime["Lifetime"] = (double)1.0; + + //set 3rd person camera + Events::SetCamera eSetCamera; + eSetCamera.CameraEntity = EntityWrapper(m_World, cameraEntity); + m_EventBroker->Publish(eSetCamera); + + //on deathanim done -> del entity + m_World->DeleteEntity(e.Player.ID); return true; } -//on deathanim done -> del entity diff --git a/src/Tests/HealthSystemTest.cpp b/src/Tests/HealthSystemTest.cpp index 6a434a9a..280b8d14 100644 --- a/src/Tests/HealthSystemTest.cpp +++ b/src/Tests/HealthSystemTest.cpp @@ -54,36 +54,32 @@ GameHealthSystemTest::GameHealthSystemTest() //The Test //create entity which has transform,player,model,health in it. i.e. is a player EntityID playerID = m_World->CreateEntity(); - ComponentWrapper transform = m_World->AttachComponent(playerID, "Transform"); - ComponentWrapper model = m_World->AttachComponent(playerID, "Model"); - model["Resource"] = "Models/Core/UnitSphere.mesh"; // 360NoScope UnitSphere ComponentWrapper player = m_World->AttachComponent(playerID, "Player"); ComponentWrapper health = m_World->AttachComponent(playerID, "Health"); healthsID = playerID; - double currentHealth = (double)m_World->GetComponent(healthsID, "Health")["Health"]; + + EntityID playerID2 = m_World->CreateEntity(); + ComponentWrapper player2 = m_World->AttachComponent(playerID2, "Player"); + ComponentWrapper health2 = m_World->AttachComponent(playerID2, "Health"); //heal player with 40 Events::PlayerHealthPickup e3; e3.HealthAmount = 40.0f; - e3.PlayerHealedID = healthsID; + e3.Player = EntityWrapper(m_World, player.EntityID); m_EventBroker->Publish(e3); + //damage player with 50 Events::PlayerDamage e; e.Damage = 50.0f; -// e.PlayerDamagedID = healthsID; + e.Player = EntityWrapper(m_World, player.EntityID); m_EventBroker->Publish(e); + //heal some other player with 40 Events::PlayerHealthPickup e2; e2.HealthAmount = 40.0f; - e2.PlayerHealedID = healthsID + 1; + e2.Player = EntityWrapper(m_World, player2.EntityID); m_EventBroker->Publish(e2); - EntityID playerID2 = m_World->CreateEntity(); - ComponentWrapper transform2 = m_World->AttachComponent(playerID2, "Transform"); - ComponentWrapper model2 = m_World->AttachComponent(playerID2, "Model"); - model2["Resource"] = "Models/Core/UnitSphere.mesh"; // 360NoScope UnitSphere - ComponentWrapper player2 = m_World->AttachComponent(playerID2, "Player"); - ComponentWrapper health2 = m_World->AttachComponent(playerID2, "Health"); //END TEST }