diff --git a/include/Engine/Core/ComponentWrapper.h b/include/Engine/Core/ComponentWrapper.h index f09bbfe3..1ca0347d 100644 --- a/include/Engine/Core/ComponentWrapper.h +++ b/include/Engine/Core/ComponentWrapper.h @@ -43,6 +43,11 @@ struct ComponentWrapper // Specialization for string literals template void SetField(std::string name, const char(&value)[N]) { Field(name) = std::string(value); } + + void Copy(ComponentWrapper& destination) + { + memcpy(destination.Data, this->Data, Info.Stride); + } struct SubscriptProxy { diff --git a/include/Engine/Core/EPlayerDeath.h b/include/Engine/Core/EPlayerDeath.h index 00ede5ed..53dfd013 100644 --- a/include/Engine/Core/EPlayerDeath.h +++ b/include/Engine/Core/EPlayerDeath.h @@ -2,7 +2,7 @@ #define EPlayerDeath_h__ #include "EventBroker.h" -#include "../Core/Entity.h" +#include "../Core/EntityWrapper.h" namespace Events { @@ -12,6 +12,7 @@ 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/src/Game/Systems/HealthSystem.cpp b/src/Game/Systems/HealthSystem.cpp index 26d38c69..102a4be6 100644 --- a/src/Game/Systems/HealthSystem.cpp +++ b/src/Game/Systems/HealthSystem.cpp @@ -22,9 +22,9 @@ 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); - - m_World->DeleteEntity(e.Player.ID); + //m_World->DeleteEntity(e.Player.ID); } return true; diff --git a/src/Game/Systems/PlayerDeathSystem.cpp b/src/Game/Systems/PlayerDeathSystem.cpp index dcee3a92..ab20dbce 100644 --- a/src/Game/Systems/PlayerDeathSystem.cpp +++ b/src/Game/Systems/PlayerDeathSystem.cpp @@ -112,5 +112,72 @@ bool PlayerDeathSystem::OnPlayerDeath(Events::PlayerDeath& e) // 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"); + + 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"); + (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); + (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"] = 8.0; + return true; -} \ No newline at end of file +} +//on deathanim done -> del entity