Compare commits

..

2 Commits

4 changed files with 26 additions and 77 deletions
-12
View File
@@ -40,17 +40,5 @@ private:
}; };
std::vector<EntityAtMaxValuePickupStruct> m_PickupAtMaximum; std::vector<EntityAtMaxValuePickupStruct> m_PickupAtMaximum;
void DoPickup(EntityWrapper &player, EntityWrapper &trigger); void DoPickup(EntityWrapper &player, EntityWrapper &trigger);
//class
enum class PlayerClass {
Assault,
Defender,
Sniper,
None
};
//helper methods
bool DoesPlayerHaveMaxAmmo(EntityWrapper &player);
PlayerClass DetermineClass(EntityWrapper &player);
void SetPlayerAmmo(EntityWrapper &player, int ammoGain);
int GetPlayerMaxAmmo(EntityWrapper &player);
}; };
#endif #endif
@@ -15,6 +15,7 @@
#include "Rendering/Util/CommonFunctions.h" #include "Rendering/Util/CommonFunctions.h"
//#define INDICATOR_TEST //#define INDICATOR_TEST
#include "Core/ConfigFile.h"
class DamageIndicatorSystem : public ImpureSystem class DamageIndicatorSystem : public ImpureSystem
{ {
@@ -40,6 +41,8 @@ private:
std::vector<DamageIndicatorStruct> updateDamageIndicatorVector; std::vector<DamageIndicatorStruct> updateDamageIndicatorVector;
float CalculateAngle(EntityWrapper player, glm::vec3 enemyPos); float CalculateAngle(EntityWrapper player, glm::vec3 enemyPos);
bool m_NetworkEnabled;
//for tests //for tests
#ifdef INDICATOR_TEST #ifdef INDICATOR_TEST
glm::vec3 DamageIndicatorTest(EntityWrapper player); glm::vec3 DamageIndicatorTest(EntityWrapper player);
+13 -61
View File
@@ -37,7 +37,8 @@ void AmmoPickupSystem::Update(double dt)
//erase the current element (somePickup) //erase the current element (somePickup)
it = m_ETriggerTouchVector.erase(it); it = m_ETriggerTouchVector.erase(it);
} else { }
else {
it++; it++;
} }
} }
@@ -47,7 +48,7 @@ void AmmoPickupSystem::Update(double dt)
m_PickupAtMaximum.erase(it); m_PickupAtMaximum.erase(it);
break; break;
} }
if (!DoesPlayerHaveMaxAmmo(it->player)) { if ((int)it->player["AssaultWeapon"]["Ammo"] < (int)it->player["AssaultWeapon"]["MaxAmmo"]) {
DoPickup(it->player, it->trigger); DoPickup(it->player, it->trigger);
m_PickupAtMaximum.erase(it); m_PickupAtMaximum.erase(it);
break; break;
@@ -55,58 +56,6 @@ void AmmoPickupSystem::Update(double dt)
} }
} }
} }
bool AmmoPickupSystem::DoesPlayerHaveMaxAmmo(EntityWrapper &player) {
PlayerClass playerClass = DetermineClass(player);
if (playerClass == PlayerClass::Defender) {
return !((int)player["DefenderWeapon"]["Ammo"] < (int)player["DefenderWeapon"]["MaxAmmo"]);
} else if (playerClass == PlayerClass::Sniper) {
return !((int)player["SniperWeapon"]["Ammo"] < (int)player["SniperWeapon"]["MaxAmmo"]);
} else if (playerClass == PlayerClass::Assault) {
return !((int)player["AssaultWeapon"]["Ammo"] < (int)player["AssaultWeapon"]["MaxAmmo"]);
} else {
return false;
}
}
void AmmoPickupSystem::SetPlayerAmmo(EntityWrapper &player, int ammoGain) {
int maxWeaponAmmo = GetPlayerMaxAmmo(player);
PlayerClass playerClass = DetermineClass(player);
if (playerClass == PlayerClass::Defender) {
(int&)player["DefenderWeapon"]["Ammo"] = std::min((int)player["DefenderWeapon"]["Ammo"] + ammoGain, maxWeaponAmmo);
} else if (playerClass == PlayerClass::Sniper) {
(int&)player["SniperWeapon"]["Ammo"] = std::min((int)player["SniperWeapon"]["Ammo"] + ammoGain, maxWeaponAmmo);
} else if (playerClass == PlayerClass::Assault) {
(int&)player["AssaultWeapon"]["Ammo"] = std::min((int)player["AssaultWeapon"]["Ammo"] + ammoGain, maxWeaponAmmo);
} else {
//unknown class - ignore
}
}
int AmmoPickupSystem::GetPlayerMaxAmmo(EntityWrapper &player) {
PlayerClass playerClass = DetermineClass(player);
if (playerClass == PlayerClass::Defender) {
return (int)player["DefenderWeapon"]["MaxAmmo"];
} else if (playerClass == PlayerClass::Sniper) {
return (int)player["SniperWeapon"]["MaxAmmo"];
} else if (playerClass == PlayerClass::Assault) {
return (int)player["AssaultWeapon"]["MaxAmmo"];
} else {
return -1;
}
}
AmmoPickupSystem::PlayerClass AmmoPickupSystem::DetermineClass(EntityWrapper &player)
{
//determine the class based on what component the inflictor-player has
if (m_World->HasComponent(player.ID, "DashAbility")) {
return PlayerClass::Assault;
}
if (m_World->HasComponent(player.ID, "ShieldAbility")) {
return PlayerClass::Defender;
}
if (m_World->HasComponent(player.ID, "SprintAbility")) {
return PlayerClass::Sniper;
}
return PlayerClass::None;
}
bool AmmoPickupSystem::OnTriggerTouch(Events::TriggerTouch& e) bool AmmoPickupSystem::OnTriggerTouch(Events::TriggerTouch& e)
{ {
@@ -114,7 +63,7 @@ bool AmmoPickupSystem::OnTriggerTouch(Events::TriggerTouch& e)
return false; return false;
} }
//TODO: add other weapontypes //TODO: add other weapontypes
if (DetermineClass(e.Entity) == PlayerClass::None) { if (!e.Entity.HasComponent("AssaultWeapon")) {
return false; return false;
} }
if (!e.Trigger.HasComponent("AmmoPickup")) { if (!e.Trigger.HasComponent("AmmoPickup")) {
@@ -122,7 +71,7 @@ bool AmmoPickupSystem::OnTriggerTouch(Events::TriggerTouch& e)
} }
//if at maxammo, save the trigger-touch to a vector since standing inside it will not re-trigger the trigger //if at maxammo, save the trigger-touch to a vector since standing inside it will not re-trigger the trigger
if (DoesPlayerHaveMaxAmmo(e.Entity)) { if ((int)e.Entity["AssaultWeapon"]["Ammo"] >= (int)e.Entity["AssaultWeapon"]["MaxAmmo"]) {
m_PickupAtMaximum.push_back({ e.Entity, e.Trigger }); m_PickupAtMaximum.push_back({ e.Entity, e.Trigger });
return false; return false;
} }
@@ -136,16 +85,19 @@ bool AmmoPickupSystem::OnAmmoPickup(Events::AmmoPickup & e)
return false; return false;
} }
//TODO: add other weapontypes //TODO: add other weapontypes
if (DetermineClass(e.Player) == PlayerClass::None) { if (!e.Player.HasComponent("AssaultWeapon")) {
return false; return false;
} }
int maxWeaponAmmo = (int)e.Player["AssaultWeapon"]["MaxAmmo"];
int& currentAmmo = (int)e.Player["AssaultWeapon"]["Ammo"];
//cant pick up ammopacks if you are already at MaxAmmo //cant pick up ammopacks if you are already at MaxAmmo
if (DoesPlayerHaveMaxAmmo(e.Player)) { if (currentAmmo >= maxWeaponAmmo) {
return false; return false;
} }
SetPlayerAmmo(e.Player, e.AmmoGain);
return true; currentAmmo = std::min(currentAmmo + e.AmmoGain, maxWeaponAmmo);
return false;
} }
bool AmmoPickupSystem::OnTriggerLeave(Events::TriggerLeave& e) { bool AmmoPickupSystem::OnTriggerLeave(Events::TriggerLeave& e) {
@@ -167,7 +119,7 @@ void AmmoPickupSystem::DoPickup(EntityWrapper &player, EntityWrapper &trigger) {
if (!trigger.Valid()) { if (!trigger.Valid()) {
return; return;
} }
int maxWeaponAmmo = GetPlayerMaxAmmo(player); int maxWeaponAmmo = (int)player["AssaultWeapon"]["MaxAmmo"];
int ammoGiven = 0.01*(double)trigger["AmmoPickup"]["AmmoGain"] * maxWeaponAmmo; int ammoGiven = 0.01*(double)trigger["AmmoPickup"]["AmmoGain"] * maxWeaponAmmo;
Events::AmmoPickup ePlayerAmmoPickup; Events::AmmoPickup ePlayerAmmoPickup;
+10 -4
View File
@@ -10,10 +10,11 @@ DamageIndicatorSystem::DamageIndicatorSystem(SystemParams params)
//load texture to cache //load texture to cache
auto texture = CommonFunctions::LoadTexture("Textures/DamageIndicator.png", false); auto texture = CommonFunctions::LoadTexture("Textures/DamageIndicator.png", false);
auto entityFile = ResourceManager::Load<EntityXMLFile>("Schema/Entities/DamageIndicator.xml"); auto entityFile = ResourceManager::Load<EntityXMLFile>("Schema/Entities/DamageIndicator.xml");
m_NetworkEnabled = ResourceManager::Load<ConfigFile>("Config.ini")->Get("Networking.StartNetwork", false);
} }
void DamageIndicatorSystem::Update(double dt) { void DamageIndicatorSystem::Update(double dt) {
if (!IsServer && LocalPlayer.Valid()) { if ((!IsServer || !m_NetworkEnabled) && LocalPlayer.Valid()) {
for (auto& iter = updateDamageIndicatorVector.begin(); iter != updateDamageIndicatorVector.end(); iter++) { for (auto& iter = updateDamageIndicatorVector.begin(); iter != updateDamageIndicatorVector.end(); iter++) {
if (!iter->spriteEntity.Valid()) { if (!iter->spriteEntity.Valid()) {
updateDamageIndicatorVector.erase(iter); updateDamageIndicatorVector.erase(iter);
@@ -40,10 +41,15 @@ bool DamageIndicatorSystem::OnPlayerDamage(Events::PlayerDamage& e)
return false; return false;
} }
//friendly fire - return
if (e.Damage < 0.1f) {
return false;
}
glm::vec3 inflictorPos = e.Inflictor["Transform"]["Position"]; glm::vec3 inflictorPos = e.Inflictor["Transform"]["Position"];
//if testing //if testing
#ifdef INDICATOR_TEST #ifdef INDICATOR_TEST
inflictorPos = DamageIndicatorTest(e.Victim); inflictorPos = DamageIndicatorTest(e.Victim);
#endif #endif
float angleBetweenVectors = CalculateAngle(e.Victim, inflictorPos); float angleBetweenVectors = CalculateAngle(e.Victim, inflictorPos);
@@ -55,7 +61,7 @@ bool DamageIndicatorSystem::OnPlayerDamage(Events::PlayerDamage& e)
//simply set the rotation z-wise to the angleBetweenVectors //simply set the rotation z-wise to the angleBetweenVectors
sprite["Transform"]["Orientation"] = glm::vec3(0, 0, angleBetweenVectors); sprite["Transform"]["Orientation"] = glm::vec3(0, 0, angleBetweenVectors);
if (!IsServer) { if (!IsServer || !m_NetworkEnabled) {
updateDamageIndicatorVector.emplace_back(sprite, inflictorPos); updateDamageIndicatorVector.emplace_back(sprite, inflictorPos);
} }
@@ -122,7 +128,7 @@ glm::vec3 DamageIndicatorSystem::DamageIndicatorTest(EntityWrapper player) {
} }
m_TestVar++; m_TestVar++;
auto inflictorPos = glm::vec3(currentPos.x + testVar*6.0f, currentPos.y, currentPos.z + testVar2*6.0f); auto inflictorPos = glm::vec3(currentPos.x + testVar*6.0f, currentPos.y, currentPos.z + testVar2*6.0f);
//load the explosioneffect XML //load the explosioneffect XML
auto deathEffect = ResourceManager::Load<EntityXMLFile>("Schema/Entities/PlayerDeathExplosionWithCamera.xml"); auto deathEffect = ResourceManager::Load<EntityXMLFile>("Schema/Entities/PlayerDeathExplosionWithCamera.xml");