Fixed AssaultWeapon reload logic
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user