From 51b8846b3a4bfd3d2a96979ed2da4522821a6b46 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Sat, 12 Mar 2016 18:29:49 +0100 Subject: [PATCH] Ammo sharing done --- .../Schema/Entities/AmmoShareEffectView.xml | 1 + src/Game/Systems/BoostSystem.cpp | 42 ++++++++----------- .../Systems/Weapon/SidearmWeaponBehaviour.cpp | 39 ++++++++++++++++- 3 files changed, 56 insertions(+), 26 deletions(-) diff --git a/resources/Schema/Entities/AmmoShareEffectView.xml b/resources/Schema/Entities/AmmoShareEffectView.xml index 651d1621..28997ab0 100644 --- a/resources/Schema/Entities/AmmoShareEffectView.xml +++ b/resources/Schema/Entities/AmmoShareEffectView.xml @@ -21,6 +21,7 @@ true + diff --git a/src/Game/Systems/BoostSystem.cpp b/src/Game/Systems/BoostSystem.cpp index f6148192..b695aa96 100644 --- a/src/Game/Systems/BoostSystem.cpp +++ b/src/Game/Systems/BoostSystem.cpp @@ -79,45 +79,37 @@ std::string BoostSystem::DetermineClass(EntityWrapper inflictorPlayer) void BoostSystem::giveAmmo(EntityWrapper giver, EntityWrapper receiver) { - bool gaveAmmo = false; - if (receiver.HasComponent("AssaultWeapon")) { int magazineSize = receiver["AssaultWeapon"]["MagazineSize"]; int& magazineAmmo = receiver["AssaultWeapon"]["MagazineAmmo"]; - + int prevMagazineAmmo = receiver["AssaultWeapon"]["MagazineAmmo"]; int maxAmmo = receiver["AssaultWeapon"]["MaxAmmo"]; int& ammo = receiver["AssaultWeapon"]["Ammo"]; - if (magazineAmmo < magazineSize) { - magazineAmmo += 1; - gaveAmmo = true; - } else if (ammo < maxAmmo) { - ammo += 1; - gaveAmmo = true; + int givenAmmo = 3; + + magazineAmmo = glm::clamp(magazineAmmo + givenAmmo, 0, magazineSize); + if (magazineAmmo > prevMagazineAmmo) { + givenAmmo = prevMagazineAmmo + givenAmmo - magazineSize; + } + if (givenAmmo > 0) { + ammo = glm::clamp(ammo + givenAmmo, 0, maxAmmo); } } else if (receiver.HasComponent("DefenderWeapon")) { int magazineSize = receiver["DefenderWeapon"]["MagazineSize"]; int& magazineAmmo = receiver["DefenderWeapon"]["MagazineAmmo"]; - + int prevMagazineAmmo = receiver["DefenderWeapon"]["MagazineAmmo"]; int maxAmmo = receiver["DefenderWeapon"]["MaxAmmo"]; int& ammo = receiver["DefenderWeapon"]["Ammo"]; - if (magazineAmmo < magazineSize) { - magazineAmmo += 1; - gaveAmmo = true; - } else if (ammo < maxAmmo) { - ammo += 1; - gaveAmmo = true; + int givenAmmo = 1; + + magazineAmmo = glm::clamp(magazineAmmo + givenAmmo, 0, magazineSize); + if (magazineAmmo > prevMagazineAmmo) { + givenAmmo = prevMagazineAmmo + givenAmmo - magazineSize; } - } - - - if (gaveAmmo) { - EntityWrapper effectSpawner = giver.FirstChildByName("AmmoShareEffectSpawner"); - if (effectSpawner.Valid()) { - if (effectSpawner.HasComponent("Spawner")) { - SpawnerSystem::Spawn(effectSpawner, effectSpawner); - } + if (givenAmmo > 0) { + ammo = glm::clamp(ammo + givenAmmo, 0, maxAmmo); } } } diff --git a/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp b/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp index 517d17fb..1364894d 100644 --- a/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp +++ b/src/Game/Systems/Weapon/SidearmWeaponBehaviour.cpp @@ -281,7 +281,44 @@ bool SidearmWeaponBehaviour::dealDamage(ComponentWrapper cWeapon, WeaponInfo& wi // If friendly fire, reduce damage to 0 (needed to make Boosts, Ammosharing work) if ((ComponentInfo::EnumType)victim["Team"]["Team"] == (ComponentInfo::EnumType)wi.Player["Team"]["Team"]) { damage = 0; - //giveAmmo(cWeapon, wi, victim); + + bool gaveAmmo = false; + + if (victim.HasComponent("AssaultWeapon")) { + int magazineSize = victim["AssaultWeapon"]["MagazineSize"]; + int magazineAmmo = victim["AssaultWeapon"]["MagazineAmmo"]; + + int maxAmmo = victim["AssaultWeapon"]["MaxAmmo"]; + int ammo = victim["AssaultWeapon"]["Ammo"]; + + if (magazineAmmo < magazineSize) { + gaveAmmo = true; + } else if (ammo < maxAmmo) { + gaveAmmo = true; + } + } else if (victim.HasComponent("DefenderWeapon")) { + int magazineSize = victim["DefenderWeapon"]["MagazineSize"]; + int magazineAmmo = victim["DefenderWeapon"]["MagazineAmmo"]; + + int maxAmmo = victim["DefenderWeapon"]["MaxAmmo"]; + int ammo = victim["DefenderWeapon"]["Ammo"]; + + if (magazineAmmo < magazineSize) { + gaveAmmo = true; + } else if (ammo < maxAmmo) { + gaveAmmo = true; + } + } + + + if (gaveAmmo) { + EntityWrapper effectSpawner = wi.FirstPersonEntity.FirstChildByName("AmmoShareEffectSpawner"); + if (effectSpawner.Valid()) { + if (effectSpawner.HasComponent("Spawner")) { + SpawnerSystem::Spawn(effectSpawner, effectSpawner); + } + } + } } // Deal damage!