Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 20 additions & 14 deletions Server/Components/NPCs/NPC/npc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -631,6 +631,11 @@ uint8_t NPC::getWeapon() const

void NPC::setAmmo(int ammo)
{
if (ammo < 0)
{
ammo = 0;
}

ammo_ = ammo;

if (ammo_ < ammoInClip_)
Expand Down Expand Up @@ -1346,7 +1351,7 @@ int NPC::getWeaponActualClipSize(uint8_t weapon)
size *= 2;
}

if (ammo_ < size && !infiniteAmmo_)
if (ammo_ < size)
{
size = ammo_;
}
Expand Down Expand Up @@ -1854,33 +1859,35 @@ void NPC::updateWeaponState()
{
setWeaponState(PlayerWeaponState_Reloading);
}
else if (ammoInClip_ == 1)
else if (ammoInClip_ > 1 || infiniteAmmo_)
{
setWeaponState(PlayerWeaponState_LastBullet);
setWeaponState(PlayerWeaponState_MoreBullets);
}
else if (ammo_ == 0 && !infiniteAmmo_)
else if (ammo_ == 0)
{
setWeaponState(PlayerWeaponState_NoBullets);
}
else if (ammoInClip_ > 1)
else if (ammoInClip_ == 1)
{
setWeaponState(PlayerWeaponState_MoreBullets);
setWeaponState(PlayerWeaponState_LastBullet);
}

break;

case PlayerWeapon_Shotgun:
if (reloading_)
{
setWeaponState(PlayerWeaponState_Reloading);
}
else if (ammo_ == 0 && !infiniteAmmo_)
else if (ammoInClip_ == 1 || infiniteAmmo_)
{
setWeaponState(PlayerWeaponState_NoBullets);
setWeaponState(PlayerWeaponState_LastBullet);
}
else if (ammoInClip_ == 1)
else if (ammo_ == 0)
{
setWeaponState(PlayerWeaponState_LastBullet);
setWeaponState(PlayerWeaponState_NoBullets);
}

break;

default:
Expand Down Expand Up @@ -2814,7 +2821,7 @@ void NPC::tick(Microseconds elapsed, TimePoint now)

if (shootTime != -1 && Milliseconds(shootTime) <= lastShootTime)
{
if (ammoInClip_ != 0)
if (ammoInClip_ != 0 || infiniteAmmo_)
{
auto weaponData = WeaponInfo::get(weapon_);
if (weaponData.type == PlayerWeaponType_Bullet)
Expand All @@ -2835,11 +2842,10 @@ void NPC::tick(Microseconds elapsed, TimePoint now)
if (!infiniteAmmo_)
{
ammo_--;
ammoInClip_--;
}

ammoInClip_--;

bool needsReloading = hasReloading_ && getWeaponActualClipSize(weapon_) > 0 && (ammo_ != 0 || infiniteAmmo_) && ammoInClip_ == 0;
bool needsReloading = hasReloading_ && getWeaponActualClipSize(weapon_) > 0 && ammo_ != 0 && ammoInClip_ == 0 && !infiniteAmmo_;
if (needsReloading)
{
reloadingUpdateTime_ = lastUpdate_;
Expand Down