Player death effect fixes

This commit is contained in:
2016-02-08 11:39:29 +01:00
parent fad25c6e16
commit 99cbdd3c1e
5 changed files with 39 additions and 32 deletions
+3
View File
@@ -22,5 +22,8 @@ public:
private: private:
EventRelay<PlayerDeathSystem, Events::PlayerDeath> m_OnPlayerDeath; EventRelay<PlayerDeathSystem, Events::PlayerDeath> m_OnPlayerDeath;
bool OnPlayerDeath(Events::PlayerDeath& e); bool OnPlayerDeath(Events::PlayerDeath& e);
void createDeathEffect(EntityWrapper player);
}; };
#endif #endif
+1
View File
@@ -3,6 +3,7 @@
#include "Systems/SpawnerSystem.h" #include "Systems/SpawnerSystem.h"
#include "Events/ESpawnerSpawn.h" #include "Events/ESpawnerSpawn.h"
#include "Core/EPlayerSpawned.h" #include "Core/EPlayerSpawned.h"
#include "Core/EPlayerDeath.h"
#include "Rendering/ESetCamera.h" #include "Rendering/ESetCamera.h"
#include "Core/ConfigFile.h" #include "Core/ConfigFile.h"
@@ -4,17 +4,18 @@
<Components> <Components>
<c:Animation> <c:Animation>
<Name>Hold Pos</Name> <Name>Hold Pos</Name>
<Time>0</Time>
<Speed>0</Speed>
</c:Animation> </c:Animation>
<c:Lifetime> <c:Lifetime>
<Lifetime>4</Lifetime> <Lifetime>2.5</Lifetime>
</c:Lifetime> </c:Lifetime>
<c:ExplosionEffect> <c:ExplosionEffect>
<TimeSinceDeath>0</TimeSinceDeath> <ColorByDistance>true</ColorByDistance>
<ExplosionDuration>4</ExplosionDuration> <Velocity X="0" Y="7.76300049" Z="0"/>
<ExplosionOrigin X="-60.9153252" Y="0.767338753" Z="-76.4729843"/> <ExplosionOrigin X="0" Y="0.67900002" Z="0"/>
<Velocity X="0.5" Y="0.5" Z="0"/> <ExponentialAccelaration>true</ExponentialAccelaration>
<ExplosionDuration>3</ExplosionDuration>
<EndColor A="0" B="0" G="0" R="1"/>
<Randomness>true</Randomness>
</c:ExplosionEffect> </c:ExplosionEffect>
<c:Model> <c:Model>
<Resource>Models/AssaultAnimated.mesh</Resource> <Resource>Models/AssaultAnimated.mesh</Resource>
@@ -22,24 +23,17 @@
<Transparent>true</Transparent> <Transparent>true</Transparent>
</c:Model> </c:Model>
<c:Transform> <c:Transform>
<Position X="-60.9153252" Y="0.767338753" Z="-76.4729843"/> <Position X="0" Y="0" Z="3.46966481"/>
</c:Transform> </c:Transform>
</Components> </Components>
<Children> <Children>
<Entity name="Camera"> <Entity name="Camera">
<Components> <Components>
<c:Lifetime> <c:Camera/>
<Lifetime>1</Lifetime>
</c:Lifetime>
<c:Camera>
<FOV>120</FOV>
<NearClip>0.1</NearClip>
<FarClip>10000</FarClip>
</c:Camera>
<c:Transform> <c:Transform>
<Position X="-60.9153252" Y="0.767338753" Z="-76.4729843"/> <Position X="0" Y="2.49700022" Z="4.31700039"/>
<Orientation X="-0.7" Y="1.46" Z="0.8"/> <Orientation X="5.95600033" Y="0" Z="0"/>
</c:Transform> </c:Transform>
</Components> </Components>
<Children/> <Children/>
+20 -13
View File
@@ -11,18 +11,31 @@ void PlayerDeathSystem::Update(double dt)
} }
bool PlayerDeathSystem::OnPlayerDeath(Events::PlayerDeath& e) bool PlayerDeathSystem::OnPlayerDeath(Events::PlayerDeath& e)
{
if (!e.Player.Valid()) {
return false;
}
createDeathEffect(e.Player);
// Delete player
m_World->DeleteEntity(e.Player.ID);
return true;
}
void PlayerDeathSystem::createDeathEffect(EntityWrapper player)
{ {
//load the explosioneffect XML //load the explosioneffect XML
auto deathEffect = ResourceManager::Load<EntityFile>("Schema/Entities/PlayerDeathExplosionWithCamera.xml"); auto deathEffect = ResourceManager::Load<EntityFile>("Schema/Entities/PlayerDeathExplosionWithCamera.xml");
EntityFileParser parser(deathEffect); EntityFileParser parser(deathEffect);
EntityID deathEffectID = parser.MergeEntities(m_World); EntityID deathEffectID = parser.MergeEntities(m_World);
EntityWrapper deathEffectEW = EntityWrapper(m_World, deathEffectID); EntityWrapper deathEffectEW = EntityWrapper(m_World, deathEffectID);
//components that we need from player //components that we need from player
auto playerCamera = e.Player.FirstChildByName("Camera"); auto playerCamera = player.FirstChildByName("Camera");
auto playerEntityModel = e.Player.FirstChildByName("PlayerModel")["Model"]; auto playerEntityModel = player.FirstChildByName("PlayerModel")["Model"];
auto playerEntityAnimation = e.Player.FirstChildByName("PlayerModel")["Animation"]; auto playerEntityAnimation = player.FirstChildByName("PlayerModel")["Animation"];
//copy the data from player to explisioneffectmodel //copy the data from player to explisioneffectmodel
playerEntityModel.Copy(deathEffectEW["Model"]); playerEntityModel.Copy(deathEffectEW["Model"]);
@@ -31,20 +44,14 @@ bool PlayerDeathSystem::OnPlayerDeath(Events::PlayerDeath& e)
deathEffectEW["Animation"]["Speed"] = 0.0; deathEffectEW["Animation"]["Speed"] = 0.0;
//copy the models position,orientation //copy the models position,orientation
deathEffectEW["Transform"]["Position"] = (glm::vec3)e.Player["Transform"]["Position"]; deathEffectEW["Transform"]["Position"] = (glm::vec3)player["Transform"]["Position"];
deathEffectEW["Transform"]["Orientation"] = (glm::vec3)e.Player["Transform"]["Orientation"]; deathEffectEW["Transform"]["Orientation"] = (glm::vec3)player["Transform"]["Orientation"];
//effect,camera is relative to playersPosition //effect,camera is relative to playersPosition
deathEffectEW["ExplosionEffect"]["ExplosionOrigin"] = glm::vec3(0, 0, 0); //deathEffectEW["ExplosionEffect"]["ExplosionOrigin"] = glm::vec3(0, 0, 0);
//camera (with lifetime) behind the player //camera (with lifetime) behind the player
auto cam = deathEffectEW.FirstChildByName("Camera"); auto cam = deathEffectEW.FirstChildByName("Camera");
cam["Transform"]["Position"] = glm::vec3(0, 2.5f, 1.8f);
cam["Transform"]["Orientation"] = glm::vec3(5.655f, 0, 0);
Events::SetCamera eSetCamera; Events::SetCamera eSetCamera;
eSetCamera.CameraEntity = cam; eSetCamera.CameraEntity = cam;
m_EventBroker->Publish(eSetCamera); m_EventBroker->Publish(eSetCamera);
//done -> del entity
m_World->DeleteEntity(e.Player.ID);
return true;
} }
+3 -1
View File
@@ -75,7 +75,9 @@ bool PlayerSpawnSystem::OnPlayerSpawned(Events::PlayerSpawned& e)
// Check if a player already exists // Check if a player already exists
if (m_PlayerEntities.count(e.PlayerID) != 0) { if (m_PlayerEntities.count(e.PlayerID) != 0) {
// TODO: Disallow infinite respawning here // TODO: Disallow infinite respawning here
m_World->DeleteEntity(m_PlayerEntities[e.PlayerID].ID); if (m_PlayerEntities[e.PlayerID].Valid()) {
m_World->DeleteEntity(m_PlayerEntities[e.PlayerID].ID);
}
} }
// Store the player for future reference // Store the player for future reference