Completed the code to trigger the 3rd person camera on death. Cleaned up PlayerDeathSystem. Fixed HealthSystemTest. Removed the test for PlayerDeathSystem
This commit is contained in:
@@ -3,15 +3,11 @@
|
|||||||
|
|
||||||
#include "Core/System.h"
|
#include "Core/System.h"
|
||||||
#include "Input/EInputCommand.h"
|
#include "Input/EInputCommand.h"
|
||||||
#include "Systems/SpawnerSystem.h"
|
#include "GLM.h"
|
||||||
#include "Events/ESpawnerSpawn.h"
|
|
||||||
#include "Core/EPlayerSpawned.h"
|
|
||||||
#include "Rendering/ESetCamera.h"
|
#include "Rendering/ESetCamera.h"
|
||||||
#include "Core/ConfigFile.h"
|
#include "Core/ConfigFile.h"
|
||||||
|
|
||||||
#include "Core/EPlayerDeath.h"
|
#include "Core/EPlayerDeath.h"
|
||||||
//tests
|
|
||||||
#include "Core/EPlayerDamage.h"
|
|
||||||
|
|
||||||
class PlayerDeathSystem : public ImpureSystem
|
class PlayerDeathSystem : public ImpureSystem
|
||||||
{
|
{
|
||||||
@@ -21,18 +17,6 @@ public:
|
|||||||
virtual void Update(double dt) override;
|
virtual void Update(double dt) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct SpawnRequest
|
|
||||||
{
|
|
||||||
int PlayerID;
|
|
||||||
ComponentInfo::EnumType Team;
|
|
||||||
};
|
|
||||||
|
|
||||||
bool m_NetworkEnabled = false;
|
|
||||||
std::vector<SpawnRequest> m_SpawnRequests;
|
|
||||||
std::map<int, EntityWrapper> m_PlayerEntities;
|
|
||||||
|
|
||||||
EventRelay<PlayerDeathSystem, Events::InputCommand> m_OnInputCommand;
|
|
||||||
bool OnInputCommand(const Events::InputCommand& e);
|
|
||||||
EventRelay<PlayerDeathSystem, Events::PlayerDeath> m_OnPlayerDeath;
|
EventRelay<PlayerDeathSystem, Events::PlayerDeath> m_OnPlayerDeath;
|
||||||
bool OnPlayerDeath(Events::PlayerDeath& e);
|
bool OnPlayerDeath(Events::PlayerDeath& e);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ bool HealthSystem::OnPlayerDamaged(Events::PlayerDamage& e)
|
|||||||
ePlayerDeath.PlayerID = e.Player.ID;
|
ePlayerDeath.PlayerID = e.Player.ID;
|
||||||
ePlayerDeath.Player = e.Player;
|
ePlayerDeath.Player = e.Player;
|
||||||
m_EventBroker->Publish(ePlayerDeath);
|
m_EventBroker->Publish(ePlayerDeath);
|
||||||
//m_World->DeleteEntity(e.Player.ID);
|
//Note: we will delete the entity in PlayerDeathSystem
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -3,181 +3,72 @@
|
|||||||
PlayerDeathSystem::PlayerDeathSystem(World* m_World, EventBroker* eventBroker)
|
PlayerDeathSystem::PlayerDeathSystem(World* m_World, EventBroker* eventBroker)
|
||||||
: System(m_World, eventBroker)
|
: System(m_World, eventBroker)
|
||||||
{
|
{
|
||||||
EVENT_SUBSCRIBE_MEMBER(m_OnInputCommand, &PlayerDeathSystem::OnInputCommand);
|
|
||||||
EVENT_SUBSCRIBE_MEMBER(m_OnPlayerDeath, &PlayerDeathSystem::OnPlayerDeath);
|
EVENT_SUBSCRIBE_MEMBER(m_OnPlayerDeath, &PlayerDeathSystem::OnPlayerDeath);
|
||||||
m_NetworkEnabled = ResourceManager::Load<ConfigFile>("Config.ini")->Get("Networking.StartNetwork", false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlayerDeathSystem::Update(double dt)
|
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)
|
bool PlayerDeathSystem::OnPlayerDeath(Events::PlayerDeath& e)
|
||||||
{
|
{
|
||||||
//// When a player is actually spawned (since the actual spawning is handled on the server)
|
//current components for player that we need
|
||||||
|
auto playerModelEWrapper = e.Player.FirstChildByName("PlayerModel");
|
||||||
//// Check if a player already exists
|
auto playerEntityModel = playerModelEWrapper["Model"];
|
||||||
//if (m_PlayerEntities.count(e.PlayerID) != 0) {
|
auto playerEntityAnimation = playerModelEWrapper["Animation"];
|
||||||
// // TODO: Disallow infinite respawning here
|
auto playerEntityTransform = playerModelEWrapper["Transform"];
|
||||||
// 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");
|
|
||||||
|
|
||||||
|
//create new entity with those components
|
||||||
|
//graphics bug: model must have an animationcomponent to be able to display it
|
||||||
auto newEntity = m_World->CreateEntity();
|
auto newEntity = m_World->CreateEntity();
|
||||||
ComponentWrapper& newEntityModel = m_World->AttachComponent(newEntity, "Model");
|
ComponentWrapper& newEntityModel = m_World->AttachComponent(newEntity, "Model");
|
||||||
ComponentWrapper& newAnimationModel = m_World->AttachComponent(newEntity, "Animation");
|
ComponentWrapper& newAnimationModel = m_World->AttachComponent(newEntity, "Animation");
|
||||||
ComponentWrapper& newTransformModel = m_World->AttachComponent(newEntity, "Transform");
|
ComponentWrapper& newTransformModel = m_World->AttachComponent(newEntity, "Transform");
|
||||||
|
|
||||||
//ComponentWrapper& playerEntityModel = m_World->GetComponent(e.PlayerID, "PlayerModel");
|
|
||||||
playerEntityModel.Copy(newEntityModel);
|
playerEntityModel.Copy(newEntityModel);
|
||||||
playerEntityAnimation.Copy(newAnimationModel);
|
playerEntityAnimation.Copy(newAnimationModel);
|
||||||
playerEntityTransform.Copy(newTransformModel);
|
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");
|
//change the animation speed and make sure the explosioneffect spawns at the players position
|
||||||
ComponentWrapper& lifeTime = m_World->AttachComponent(newEntityModel.EntityID, "Lifetime");
|
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"];
|
(glm::vec3)explosionEffect["ExplosionOrigin"] = (glm::vec3)e.Player["Transform"]["Position"];
|
||||||
//explosionEffect["ExplosionOrigin"] = e.Player["Transform"]["Position"];
|
|
||||||
(double)explosionEffect["TimeSinceDeath"] = 0.0;
|
(double)explosionEffect["TimeSinceDeath"] = 0.0;
|
||||||
(double)explosionEffect["ExplosionDuration"] = 8.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;
|
(bool)explosionEffect["Randomness"] = false;
|
||||||
(double)explosionEffect["RandomnessScalar"] = 1.0;
|
(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["ColorByDistance"] = false;
|
||||||
(bool)explosionEffect["ExponentialAccelaration"] = 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;
|
return true;
|
||||||
}
|
}
|
||||||
//on deathanim done -> del entity
|
|
||||||
|
|||||||
@@ -54,36 +54,32 @@ GameHealthSystemTest::GameHealthSystemTest()
|
|||||||
//The Test
|
//The Test
|
||||||
//create entity which has transform,player,model,health in it. i.e. is a player
|
//create entity which has transform,player,model,health in it. i.e. is a player
|
||||||
EntityID playerID = m_World->CreateEntity();
|
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 player = m_World->AttachComponent(playerID, "Player");
|
||||||
ComponentWrapper health = m_World->AttachComponent(playerID, "Health");
|
ComponentWrapper health = m_World->AttachComponent(playerID, "Health");
|
||||||
healthsID = playerID;
|
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
|
//heal player with 40
|
||||||
Events::PlayerHealthPickup e3;
|
Events::PlayerHealthPickup e3;
|
||||||
e3.HealthAmount = 40.0f;
|
e3.HealthAmount = 40.0f;
|
||||||
e3.PlayerHealedID = healthsID;
|
e3.Player = EntityWrapper(m_World, player.EntityID);
|
||||||
m_EventBroker->Publish(e3);
|
m_EventBroker->Publish(e3);
|
||||||
|
|
||||||
//damage player with 50
|
//damage player with 50
|
||||||
Events::PlayerDamage e;
|
Events::PlayerDamage e;
|
||||||
e.Damage = 50.0f;
|
e.Damage = 50.0f;
|
||||||
// e.PlayerDamagedID = healthsID;
|
e.Player = EntityWrapper(m_World, player.EntityID);
|
||||||
m_EventBroker->Publish(e);
|
m_EventBroker->Publish(e);
|
||||||
|
|
||||||
//heal some other player with 40
|
//heal some other player with 40
|
||||||
Events::PlayerHealthPickup e2;
|
Events::PlayerHealthPickup e2;
|
||||||
e2.HealthAmount = 40.0f;
|
e2.HealthAmount = 40.0f;
|
||||||
e2.PlayerHealedID = healthsID + 1;
|
e2.Player = EntityWrapper(m_World, player2.EntityID);
|
||||||
m_EventBroker->Publish(e2);
|
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
|
//END TEST
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user