diff --git a/include/Game/Systems/DamageIndicatorSystem.h b/include/Game/Systems/DamageIndicatorSystem.h index 446ad2d3..e5b6a130 100644 --- a/include/Game/Systems/DamageIndicatorSystem.h +++ b/include/Game/Systems/DamageIndicatorSystem.h @@ -31,15 +31,17 @@ private: EntityID m_CurrentCamera = -1; struct DamageIndicatorStruct { EntityWrapper spriteEntity; - //double timeLeft; glm::vec3 enemyPosition; DamageIndicatorStruct(EntityWrapper entity, glm::vec3 pos) : spriteEntity(entity) - //, timeLeft(time) , enemyPosition(pos) {} }; std::vector updateDamageIndicatorVector; float CalculateAngle(EntityWrapper player, glm::vec3 enemyPos); + glm::vec3 DamageIndicatorTest(EntityWrapper player); + + //for tests int m_TestVar = 0; + bool m_Testing = true; }; #endif diff --git a/src/Game/Systems/DamageIndicatorSystem.cpp b/src/Game/Systems/DamageIndicatorSystem.cpp index 7db30ca8..65e1caf0 100644 --- a/src/Game/Systems/DamageIndicatorSystem.cpp +++ b/src/Game/Systems/DamageIndicatorSystem.cpp @@ -15,11 +15,9 @@ DamageIndicatorSystem::DamageIndicatorSystem(SystemParams params) void DamageIndicatorSystem::Update(double dt) { if (!IsServer) { for (auto& iter = updateDamageIndicatorVector.begin(); iter != updateDamageIndicatorVector.end(); iter++) { - if (!iter->spriteEntity.Valid()) - //iter->timeLeft -= -dt; - /*if (iter->timeLeft < 0.0)*/ { - updateDamageIndicatorVector.erase(iter); - break; + if (!iter->spriteEntity.Valid()) { + updateDamageIndicatorVector.erase(iter); + break; } auto angleBetweenVectors = CalculateAngle(LocalPlayer, iter->enemyPosition); //simply set the rotation z-wise to the angleBetweenVectors @@ -30,63 +28,10 @@ void DamageIndicatorSystem::Update(double dt) { bool DamageIndicatorSystem::OnPlayerDamage(Events::PlayerDamage& e) { - //TEST - auto currentPos = (glm::vec3)e.Victim["Transform"]["Position"]; - - auto testTempo = 1; - auto testTempo2 = 1; - if (m_TestVar % 4 == 0) { - testTempo = -1; - testTempo2 = 1; - } - if (m_TestVar % 4 == 1) { - testTempo = 1; - testTempo2 = 1; - } - if (m_TestVar % 4 == 2) { - testTempo *= -1; - testTempo2 = -1; - } - if (m_TestVar % 4 == 3) { - testTempo = 1; - testTempo2 = -1; - } - m_TestVar++; - auto inflictorPos = glm::vec3(currentPos.x + testTempo*12.0f, currentPos.y, currentPos.z + testTempo2*12.0f); - //inflictor = real entity... - - //SPAWN - //load the explosioneffect XML - auto deathEffect = ResourceManager::Load("Schema/Entities/PlayerDeathExplosionWithCamera.xml"); - EntityFileParser parser2(deathEffect); - EntityID deathEffectID = parser2.MergeEntities(m_World); - EntityWrapper deathEffectEW = EntityWrapper(m_World, deathEffectID); - - //components that we need from player - auto playerModel = e.Victim.FirstChildByName("PlayerModel"); - auto playerEntityModel = playerModel["Model"]; - auto playerEntityAnimation = playerModel["Animation"]; - - //copy the data from player to explosioneffectmodel - playerEntityModel.Copy(deathEffectEW["Model"]); - playerEntityAnimation.Copy(deathEffectEW["Animation"]); - - //copy the models position,orientation - deathEffectEW["Transform"]["Position"] = inflictorPos; - deathEffectEW["Transform"]["Orientation"] = (glm::vec3)e.Victim["Transform"]["Orientation"]; - - //TEST END - - - LOG_INFO("<- damageindicator"); - if (m_CurrentCamera == EntityID_Invalid) { return false; } - //if (e.Victim != LocalPlayer) { - // return false; - //} if (e.Victim.Valid() && e.Victim != LocalPlayer && !e.Victim.IsChildOf(LocalPlayer)) { return false; } @@ -94,41 +39,15 @@ bool DamageIndicatorSystem::OnPlayerDamage(Events::PlayerDamage& e) if (!e.Inflictor.Valid() || !e.Victim.Valid()) { return false; } - LOG_INFO("- damageindicator"); - //grab players direction - auto playerOrientation = glm::quat((glm::vec3)e.Victim["Transform"]["Orientation"]); - - //get the position vectors, but ignore the y-height - auto enemyPosition = inflictorPos; - auto playerPosition = (glm::vec3)e.Victim["Transform"]["Position"]; - enemyPosition.y = 0.0f; - playerPosition.y = 0.0f; - - //calculate the enemy to player vector - auto enemyPlayerVector = glm::normalize(playerPosition - enemyPosition); - - //get angle from players current rotation, this angle is how much you rotate around the y-axis - //auto playerAngle = glm::angle(playerOrientation); - //auto playerRotationVector = glm::normalize(glm::rotateY(glm::vec3(0, 0, 1), playerAngle)); - auto rotationVector = glm::toMat4(Transform::AbsoluteOrientation(e.Victim))*glm::vec4(0, 0, 1, 0); - auto playerRotationVector = glm::vec3(rotationVector); - auto rotVNinety = glm::rotateY(rotationVector, 1.57f); - auto playerSideVector = glm::vec3(rotVNinety); - - //dot product of players direction-vector and enemys-to-playervector will give the cos of the angle between the vectors - auto playerRotationDot = glm::dot(playerRotationVector, enemyPlayerVector); - //to get the angle between the vectors just do cos-inverse - auto angleBetweenVectors = glm::acos(playerRotationDot); - - //rotate the direction-vector 90 degrees to get the players side-vector - //auto playerSideVector = glm::normalize(glm::rotateY(glm::vec3(0, 0, 1), playerAngle + 1.57f)); - //dot of sidevector positive = enemy is on the right side, dot sidevector negative = left side - auto playerSideVectorDot = glm::dot(playerSideVector, enemyPlayerVector); - if (playerSideVectorDot < 0) { - angleBetweenVectors = -angleBetweenVectors; + glm::vec3 inflictorPos = e.Inflictor["Transform"]["Position"]; + //if testing + if (m_Testing) { + inflictorPos = DamageIndicatorTest(e.Victim); } + float angleBetweenVectors = CalculateAngle(e.Victim, inflictorPos); + //load & set the "2d" sprite auto entityFile = ResourceManager::Load("Schema/Entities/DamageIndicator.xml"); EntityFileParser parser(entityFile); @@ -138,9 +57,9 @@ bool DamageIndicatorSystem::OnPlayerDamage(Events::PlayerDamage& e) //simply set the rotation z-wise to the angleBetweenVectors spriteWrapper["Transform"]["Orientation"] = glm::vec3(0, 0, angleBetweenVectors); - updateDamageIndicatorVector.emplace_back(spriteWrapper, enemyPosition); - - LOG_INFO("-> damageindicator"); + if (!IsServer) { + updateDamageIndicatorVector.emplace_back(spriteWrapper, inflictorPos); + } return true; } @@ -149,6 +68,7 @@ bool DamageIndicatorSystem::OnSetCamera(const Events::SetCamera& e) { m_CurrentCamera = e.CameraEntity.ID; return true; } + float DamageIndicatorSystem::CalculateAngle(EntityWrapper player, glm::vec3 enemyPos) { //grab players direction auto playerOrientation = glm::quat((glm::vec3)player["Transform"]["Orientation"]); @@ -162,21 +82,16 @@ float DamageIndicatorSystem::CalculateAngle(EntityWrapper player, glm::vec3 enem //calculate the enemy to player vector auto enemyPlayerVector = glm::normalize(playerPosition - enemyPosition); - //get angle from players current rotation, this angle is how much you rotate around the y-axis - //auto playerAngle = glm::angle(playerOrientation); - //auto playerRotationVector = glm::normalize(glm::rotateY(glm::vec3(0, 0, 1), playerAngle)); - auto rotationVector = glm::toMat4(Transform::AbsoluteOrientation(player))*glm::vec4(0, 0, 1, 0); - auto playerRotationVector = glm::vec3(rotationVector); - auto rotVNinety = glm::rotateY(rotationVector, 1.57f); - auto playerSideVector = glm::vec3(rotVNinety); + //get the rotationvector relative to the z-axis + auto rotationVectorVec3 = glm::vec3(glm::toMat4(Transform::AbsoluteOrientation(player))*glm::vec4(0, 0, 1, 0)); + //rotate the direction-vector 90 degrees to get the players side-vector + auto playerSideVector = glm::vec3(glm::rotateY(rotationVectorVec3, 1.57f)); //dot product of players direction-vector and enemys-to-playervector will give the cos of the angle between the vectors - auto playerRotationDot = glm::dot(playerRotationVector, enemyPlayerVector); + auto playerRotationDot = glm::dot(rotationVectorVec3, enemyPlayerVector); //to get the angle between the vectors just do cos-inverse auto angleBetweenVectors = glm::acos(playerRotationDot); - //rotate the direction-vector 90 degrees to get the players side-vector - //auto playerSideVector = glm::normalize(glm::rotateY(glm::vec3(0, 0, 1), playerAngle + 1.57f)); //dot of sidevector positive = enemy is on the right side, dot sidevector negative = left side auto playerSideVectorDot = glm::dot(playerSideVector, enemyPlayerVector); if (playerSideVectorDot < 0) { @@ -185,3 +100,48 @@ float DamageIndicatorSystem::CalculateAngle(EntityWrapper player, glm::vec3 enem return angleBetweenVectors; } +glm::vec3 DamageIndicatorSystem::DamageIndicatorTest(EntityWrapper player) { + auto currentPos = (glm::vec3)player["Transform"]["Position"]; + + auto testVar = 1; + auto testVar2 = 1; + if (m_TestVar % 4 == 0) { + testVar = -1; + testVar2 = 1; + } + if (m_TestVar % 4 == 1) { + testVar = 1; + testVar2 = 1; + } + if (m_TestVar % 4 == 2) { + testVar *= -1; + testVar2 = -1; + } + if (m_TestVar % 4 == 3) { + testVar = 1; + testVar2 = -1; + } + m_TestVar++; + + auto inflictorPos = glm::vec3(currentPos.x + testVar*6.0f, currentPos.y, currentPos.z + testVar2*6.0f); + + //load the explosioneffect XML + auto deathEffect = ResourceManager::Load("Schema/Entities/PlayerDeathExplosionWithCamera.xml"); + EntityFileParser parser(deathEffect); + EntityID deathEffectID = parser.MergeEntities(m_World); + EntityWrapper deathEffectEW = EntityWrapper(m_World, deathEffectID); + + //components that we need from player + auto playerModel = player.FirstChildByName("PlayerModel"); + auto playerEntityModel = playerModel["Model"]; + auto playerEntityAnimation = playerModel["Animation"]; + + //copy the data from player to explosioneffectmodel + playerEntityModel.Copy(deathEffectEW["Model"]); + playerEntityAnimation.Copy(deathEffectEW["Animation"]); + + //copy the models position,orientation + deathEffectEW["Transform"]["Position"] = inflictorPos; + deathEffectEW["Transform"]["Orientation"] = (glm::vec3)player["Transform"]["Orientation"]; + return inflictorPos; +}