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!