Fixed AssaultWeapon reload logic

This commit is contained in:
2016-03-03 23:28:16 +01:00
parent 217c3fe55c
commit 7e6d32aaec
4 changed files with 28 additions and 9 deletions
@@ -20,6 +20,7 @@ public:
void OnPrimaryFire(ComponentWrapper cWeapon, WeaponInfo& wi) override; void OnPrimaryFire(ComponentWrapper cWeapon, WeaponInfo& wi) override;
void OnCeasePrimaryFire(ComponentWrapper cWeapon, WeaponInfo& wi) override; void OnCeasePrimaryFire(ComponentWrapper cWeapon, WeaponInfo& wi) override;
void OnReload(ComponentWrapper cWeapon, WeaponInfo& wi) override; void OnReload(ComponentWrapper cWeapon, WeaponInfo& wi) override;
void OnEquip(ComponentWrapper cWeapon, WeaponInfo& wi) override;
void OnHolster(ComponentWrapper cWeapon, WeaponInfo& wi) override; void OnHolster(ComponentWrapper cWeapon, WeaponInfo& wi) override;
//bool OnInputCommand(ComponentWrapper cWeapon, WeaponInfo& wi, const Events::InputCommand& e) override; //bool OnInputCommand(ComponentWrapper cWeapon, WeaponInfo& wi, const Events::InputCommand& e) override;
@@ -15,6 +15,7 @@
<EquipTime>0.5</EquipTime> <EquipTime>0.5</EquipTime>
<TriggerHeld>false</TriggerHeld> <TriggerHeld>false</TriggerHeld>
<FireCooldown>0</FireCooldown> <FireCooldown>0</FireCooldown>
<ReloadQueued>false</ReloadQueued>
<IsReloading>false</IsReloading> <IsReloading>false</IsReloading>
<ReloadTimer>0</ReloadTimer> <ReloadTimer>0</ReloadTimer>
<CurrentTravel>0</CurrentTravel> <CurrentTravel>0</CurrentTravel>
@@ -44,6 +44,7 @@
</xs:element> </xs:element>
<xs:element name="TriggerHeld" type="t:bool" minOccurs="0"/> <xs:element name="TriggerHeld" type="t:bool" minOccurs="0"/>
<xs:element name="FireCooldown" type="t:double" minOccurs="0"/> <xs:element name="FireCooldown" type="t:double" minOccurs="0"/>
<xs:element name="ReloadQueued" type="t:bool" minOccurs="0"/>
<xs:element name="IsReloading" type="t:bool" minOccurs="0"/> <xs:element name="IsReloading" type="t:bool" minOccurs="0"/>
<xs:element name="ReloadTimer" type="t:double" minOccurs="0"/> <xs:element name="ReloadTimer" type="t:double" minOccurs="0"/>
<xs:element name="CurrentTravel" type="t:float" minOccurs="0"/> <xs:element name="CurrentTravel" type="t:float" minOccurs="0"/>
@@ -10,18 +10,28 @@ void AssaultWeaponBehaviour::UpdateComponent(EntityWrapper& entity, ComponentWra
void AssaultWeaponBehaviour::UpdateWeapon(ComponentWrapper cWeapon, WeaponInfo& wi, double dt) void AssaultWeaponBehaviour::UpdateWeapon(ComponentWrapper cWeapon, WeaponInfo& wi, double dt)
{ {
// Decrement reload timer
double& reloadTimer = cWeapon["ReloadTimer"];
reloadTimer = glm::max(0.0, reloadTimer - dt);
// Start reloading automatically if at 0 mag ammo // Start reloading automatically if at 0 mag ammo
int& magAmmo = cWeapon["MagazineAmmo"]; int& magAmmo = cWeapon["MagazineAmmo"];
if (m_ConfigAutoReload && magAmmo <= 0) { if (m_ConfigAutoReload && magAmmo <= 0) {
OnReload(cWeapon, wi); OnReload(cWeapon, wi);
} }
// Handle reloading // Only start reloading once we're done firing
bool& reloadQueued = cWeapon["ReloadQueued"];
double& fireCooldown = cWeapon["FireCooldown"];
bool& isReloading = cWeapon["IsReloading"]; bool& isReloading = cWeapon["IsReloading"];
if (reloadQueued && fireCooldown <= 0) {
reloadQueued = fireCooldown;
isReloading = true;
}
// Decrement reload timer
double& reloadTimer = cWeapon["ReloadTimer"];
if (isReloading) {
reloadTimer = glm::max(0.0, reloadTimer - dt);
}
// Handle reloading
if (isReloading && reloadTimer <= 0.0) { if (isReloading && reloadTimer <= 0.0) {
int& magSize = cWeapon["MagazineSize"]; int& magSize = cWeapon["MagazineSize"];
int& ammo = cWeapon["Ammo"]; int& ammo = cWeapon["Ammo"];
@@ -67,8 +77,9 @@ void AssaultWeaponBehaviour::OnCeasePrimaryFire(ComponentWrapper cWeapon, Weapon
void AssaultWeaponBehaviour::OnReload(ComponentWrapper cWeapon, WeaponInfo& wi) void AssaultWeaponBehaviour::OnReload(ComponentWrapper cWeapon, WeaponInfo& wi)
{ {
bool& reloadQueued = cWeapon["ReloadQueued"];
bool& isReloading = cWeapon["IsReloading"]; bool& isReloading = cWeapon["IsReloading"];
if (isReloading) { if (reloadQueued || isReloading) {
return; return;
} }
@@ -86,10 +97,15 @@ void AssaultWeaponBehaviour::OnReload(ComponentWrapper cWeapon, WeaponInfo& wi)
double& reloadTimer = cWeapon["ReloadTimer"]; double& reloadTimer = cWeapon["ReloadTimer"];
// Start reload // Start reload
isReloading = true; reloadQueued = true;
reloadTimer = reloadTime; reloadTimer = reloadTime;
} }
void AssaultWeaponBehaviour::OnEquip(ComponentWrapper cWeapon, WeaponInfo& wi)
{
cWeapon["FireCooldown"] = (double)cWeapon["EquipTime"];
}
void AssaultWeaponBehaviour::OnHolster(ComponentWrapper cWeapon, WeaponInfo& wi) void AssaultWeaponBehaviour::OnHolster(ComponentWrapper cWeapon, WeaponInfo& wi)
{ {
// Make sure the trigger is released if weapon is holstered while firing // Make sure the trigger is released if weapon is holstered while firing
@@ -167,8 +183,8 @@ bool AssaultWeaponBehaviour::canFire(ComponentWrapper cWeapon, WeaponInfo& wi)
{ {
bool triggerHeld = cWeapon["TriggerHeld"]; bool triggerHeld = cWeapon["TriggerHeld"];
bool cooldownPassed = (double)cWeapon["FireCooldown"] <= 0.0; bool cooldownPassed = (double)cWeapon["FireCooldown"] <= 0.0;
bool isReloading = cWeapon["IsReloading"]; bool isNotReloading = !(bool)cWeapon["IsReloading"];
return triggerHeld && cooldownPassed; return triggerHeld && cooldownPassed && isNotReloading;
} }
bool AssaultWeaponBehaviour::dealDamage(ComponentWrapper cWeapon, WeaponInfo& wi) bool AssaultWeaponBehaviour::dealDamage(ComponentWrapper cWeapon, WeaponInfo& wi)