diff --git a/include/Game/Systems/Weapon/AssaultWeaponBehaviour.h b/include/Game/Systems/Weapon/AssaultWeaponBehaviour.h index 3e019268..231cc020 100644 --- a/include/Game/Systems/Weapon/AssaultWeaponBehaviour.h +++ b/include/Game/Systems/Weapon/AssaultWeaponBehaviour.h @@ -36,6 +36,10 @@ private: // Utility //Camera cameraFromEntity(EntityWrapper camera); + + void CheckBoost(ComponentWrapper cWeapon, WeaponInfo& wi); + void RemoveBoostCheckHUD(WeaponInfo& wi); + }; #endif \ No newline at end of file diff --git a/resources/Schema/Entities/WeaponAssaultBlueView.xml b/resources/Schema/Entities/WeaponAssaultBlueView.xml index 6d7e6fa0..910fe8b3 100644 --- a/resources/Schema/Entities/WeaponAssaultBlueView.xml +++ b/resources/Schema/Entities/WeaponAssaultBlueView.xml @@ -212,6 +212,26 @@ + + + + Schema/Entities/FriendlyAmmoHUD.xml + + + + + + + + + + + Schema/Entities/AmmoShareEffectView.xml + + + + + diff --git a/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp b/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp index 089443a3..1af0e927 100644 --- a/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp +++ b/src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp @@ -341,3 +341,99 @@ bool AssaultWeaponBehaviour::dealDamage(ComponentWrapper cWeapon, WeaponInfo& wi return damage > 0; } + +void AssaultWeaponBehaviour::CheckBoost(ComponentWrapper cWeapon, WeaponInfo& wi) +{ + // Only check ammo client side + if (!IsClient) { + return; + } + + // Only handle ammo check for the local player + if (wi.Player != LocalPlayer) { + return; + } + + // Make sure the player isn't checking from the grave + if (!wi.Player.Valid()) { + return; + } + + // 3D-pick middle of screen + Rectangle viewport = m_Renderer->GetViewportSize(); + glm::vec2 centerScreen(viewport.Width / 2, viewport.Height / 2); + // TODO: Some horizontal spread + PickData pickData = m_Renderer->Pick(centerScreen); + EntityWrapper victim(m_World, pickData.Entity); + if (!victim.Valid()) { + RemoveBoostCheckHUD(wi); + return; + } + + // Don't let us somehow shoot ourselves in the foot + if (victim == LocalPlayer) { + RemoveBoostCheckHUD(wi); + return; + } + + // Only care about players being hit + if (!victim.HasComponent("Player")) { + victim = victim.FirstParentWithComponent("Player"); + } + if (!victim.Valid()) { + RemoveBoostCheckHUD(wi); + return; + } + + + // 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"]) { + + EntityWrapper friendlyBoostHudSpawner = wi.FirstPersonPlayerModel.FirstChildByName("FriendlyBoostAttachment"); + if (friendlyBoostHudSpawner.Valid()) { + + auto children = m_World->GetDirectChildren(friendlyBoostHudSpawner.ID); + + if (children.first == children.second) { + if (friendlyBoostHudSpawner.HasComponent("Spawner")) { + EntityWrapper friendlyAmmoHud = SpawnerSystem::Spawn(friendlyBoostHudSpawner, friendlyBoostHudSpawner); + if (friendlyAmmoHud.Valid()) { + EntityWrapper textEntity = friendlyAmmoHud.FirstChildByName("MagazineAmmo"); + if (textEntity.Valid()) { + if (textEntity.HasComponent("Text")) { + // (std::string&)textEntity["Text"]["Content"] = std::to_string(magazineAmmo); + } + } + + EntityWrapper ammoTextEntity = friendlyAmmoHud.FirstChildByName("Ammo"); + if (ammoTextEntity.Valid()) { + if (ammoTextEntity.HasComponent("Text")) { + // (std::string&)ammoTextEntity["Text"]["Content"] = std::to_string(ammo); + } + } + } + } + } else { + EntityWrapper textEntity = friendlyBoostHudSpawner.FirstChildByName("MagazineAmmo"); + if (textEntity.Valid()) { + if (textEntity.HasComponent("Text")) { + // (std::string&)textEntity["Text"]["Content"] = std::to_string(magazineAmmo); + } + } + + EntityWrapper ammoTextEntity = friendlyBoostHudSpawner.FirstChildByName("Ammo"); + if (ammoTextEntity.Valid()) { + if (ammoTextEntity.HasComponent("Text")) { + // (std::string&)ammoTextEntity["Text"]["Content"] = std::to_string(ammo); + } + } + } + } + } + +} + +void AssaultWeaponBehaviour::RemoveBoostCheckHUD(WeaponInfo& wi) +{ + +}