From 5e472cd69c9a24bc090211c7c15daf10ea6ee0bc Mon Sep 17 00:00:00 2001 From: verysecrethero Date: Tue, 2 Feb 2016 17:18:12 +0100 Subject: [PATCH] DeathExplosion is now an XML file, changed PlayerDeathSystem accordingly. The effect should show as soon as the explosioneffect-fix is merged into master. TODO: remove the test --- include/Engine/Core/EPlayerDeath.h | 2 - include/Game/Systems/PlayerDeathSystem.h | 8 ++ .../PlayerDeathExplosionWithCamera.xml | 48 +++++++++ src/Game/Systems/HealthSystem.cpp | 1 - src/Game/Systems/PlayerDeathSystem.cpp | 102 +++++++++--------- src/Tests/CapturePointTest.cpp | 8 +- 6 files changed, 114 insertions(+), 55 deletions(-) create mode 100644 resources/Schema/Entities/PlayerDeathExplosionWithCamera.xml diff --git a/include/Engine/Core/EPlayerDeath.h b/include/Engine/Core/EPlayerDeath.h index 53dfd013..363745a6 100644 --- a/include/Engine/Core/EPlayerDeath.h +++ b/include/Engine/Core/EPlayerDeath.h @@ -10,8 +10,6 @@ namespace Events struct PlayerDeath : Event { //KilledBy,KilledByWhat is optional for now. It might be used later in the playerlog-system - EntityID KilledBy; - EntityID PlayerID; EntityWrapper Player; std::string KilledByWhat; }; diff --git a/include/Game/Systems/PlayerDeathSystem.h b/include/Game/Systems/PlayerDeathSystem.h index c59aea03..4734947e 100644 --- a/include/Game/Systems/PlayerDeathSystem.h +++ b/include/Game/Systems/PlayerDeathSystem.h @@ -7,7 +7,11 @@ #include "Rendering/ESetCamera.h" #include "Core/ConfigFile.h" +#include "Core/EntityFile.h" +#include "Core/EntityFileParser.h" + #include "Core/EPlayerDeath.h" +#include "Core/EPlayerDamage.h" class PlayerDeathSystem : public ImpureSystem { @@ -19,5 +23,9 @@ public: private: EventRelay m_OnPlayerDeath; bool OnPlayerDeath(Events::PlayerDeath& e); + + EventRelay m_OnInputCommand; + bool OnInputCommand(const Events::InputCommand& e); + }; #endif \ No newline at end of file diff --git a/resources/Schema/Entities/PlayerDeathExplosionWithCamera.xml b/resources/Schema/Entities/PlayerDeathExplosionWithCamera.xml new file mode 100644 index 00000000..bdebbfe7 --- /dev/null +++ b/resources/Schema/Entities/PlayerDeathExplosionWithCamera.xml @@ -0,0 +1,48 @@ + + + + + + Hold Pos + + 0 + + + 8 + + + 0 + 8 + + + + Models/AssaultAnimated.mesh + + true + + + + + + + + + + + 1 + + + 120 + 0.1 + 10000 + + + + + + + + + + + diff --git a/src/Game/Systems/HealthSystem.cpp b/src/Game/Systems/HealthSystem.cpp index 1b747046..18a15828 100644 --- a/src/Game/Systems/HealthSystem.cpp +++ b/src/Game/Systems/HealthSystem.cpp @@ -21,7 +21,6 @@ bool HealthSystem::OnPlayerDamaged(Events::PlayerDamage& e) if (health <= 0.0) { Events::PlayerDeath ePlayerDeath; - ePlayerDeath.PlayerID = e.Player.ID; ePlayerDeath.Player = e.Player; m_EventBroker->Publish(ePlayerDeath); //Note: we will delete the entity in PlayerDeathSystem diff --git a/src/Game/Systems/PlayerDeathSystem.cpp b/src/Game/Systems/PlayerDeathSystem.cpp index 7085a23f..d57caefc 100644 --- a/src/Game/Systems/PlayerDeathSystem.cpp +++ b/src/Game/Systems/PlayerDeathSystem.cpp @@ -3,69 +3,75 @@ 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); } +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; +} + void PlayerDeathSystem::Update(double dt) { } bool PlayerDeathSystem::OnPlayerDeath(Events::PlayerDeath& e) { - //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"]; + //LOAD THE XML + auto deathEffect = ResourceManager::Load("Schema/Entities/PlayerDeathExplosionWithCamera.xml"); - //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"); - playerEntityModel.Copy(newEntityModel); - playerEntityAnimation.Copy(newAnimationModel); - playerEntityTransform.Copy(newTransformModel); + EntityFileParser parser(deathEffect); + EntityID deathEffectID = parser.MergeEntities(m_World); + EntityWrapper deathEffectEW = EntityWrapper(m_World, deathEffectID); + + //current components for player that we need + auto playerModelEW = e.Player.FirstChildByName("PlayerModel"); + auto playerEntityModel = playerModelEW["Model"]; + auto playerEntityTransform = playerModelEW["Transform"]; + + //copy the data from player to new playermodel + playerEntityModel.Copy(deathEffectEW["Model"]); + playerEntityTransform.Copy(deathEffectEW["Transform"]); //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"]; - (double)explosionEffect["TimeSinceDeath"] = 0.0; - (double)explosionEffect["ExplosionDuration"] = 8.0; - (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(0.1f, 0.1f); - (bool)explosionEffect["ColorByDistance"] = false; - (bool)explosionEffect["ExponentialAccelaration"] = false; - 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; + auto playerPosition = (glm::vec3)e.Player["Transform"]["Position"]; + deathEffectEW["Transform"]["Position"] = playerPosition; + deathEffectEW["ExplosionEffect"]["ExplosionOrigin"] = playerPosition; - //set 3rd person camera + //camera (with lifetime) slightly above the player and looking down at the player + //camera will be positioned just above the player + glm::vec3 cameraPosition = glm::vec3(0, 10, 0); + auto cam = deathEffectEW.FirstChildByName("Camera"); + cam["Transform"]["Position"] = cameraPosition; Events::SetCamera eSetCamera; - eSetCamera.CameraEntity = EntityWrapper(m_World, cameraEntity); + eSetCamera.CameraEntity = cam; m_EventBroker->Publish(eSetCamera); //on deathanim done -> del entity diff --git a/src/Tests/CapturePointTest.cpp b/src/Tests/CapturePointTest.cpp index ffb01030..2c7bf430 100644 --- a/src/Tests/CapturePointTest.cpp +++ b/src/Tests/CapturePointTest.cpp @@ -255,14 +255,14 @@ void CapturePointTest::TestSetup8() } void CapturePointTest::DoTouchEvent(EntityID whoDidSomething, EntityID onWhatObject) { Events::TriggerTouch touchEvent; - touchEvent.Entity = whoDidSomething; - touchEvent.Trigger = onWhatObject; + touchEvent.Entity = EntityWrapper(m_World, whoDidSomething); + touchEvent.Trigger = EntityWrapper(m_World, onWhatObject); m_EventBroker->Publish(touchEvent); } void CapturePointTest::DoLeaveEvent(EntityID whoDidSomething, EntityID onWhatObject) { Events::TriggerLeave leaveEvent; - leaveEvent.Entity = whoDidSomething; - leaveEvent.Trigger = onWhatObject; + leaveEvent.Entity = EntityWrapper(m_World, whoDidSomething); + leaveEvent.Trigger = EntityWrapper(m_World, onWhatObject); m_EventBroker->Publish(leaveEvent); } void CapturePointTest::TestSuccess1() {