Fixed weapon pickup logic, like player picking up the weapon indefinitely when reaching max ammo

This commit is contained in:
smallmodel 2024-03-03 18:09:19 +01:00
parent 5fa1b98d34
commit fe35e02ed4
No known key found for this signature in database
GPG key ID: 9F2D623CEDF08512

View file

@ -2889,13 +2889,17 @@ void Weapon::PickupWeapon(Event *ev)
"print \"" HUD_MESSAGE_YELLOW "%s\n\"", "print \"" HUD_MESSAGE_YELLOW "%s\n\"",
gi.LV_ConvertString(va("Picked Up %s", item_name.c_str())) gi.LV_ConvertString(va("Picked Up %s", item_name.c_str()))
); );
}
if (!(spawnflags & DROPPED_PLAYER_ITEM) && !(spawnflags & DROPPED_ITEM)) { if (!(spawnflags & DROPPED_PLAYER_ITEM) && !(spawnflags & DROPPED_ITEM)) {
ItemPickup(other); ItemPickup(other);
return; return;
} }
if (Pickupable(other)) { if (!Pickupable(other)) {
return;
}
setMoveType(MOVETYPE_NONE); setMoveType(MOVETYPE_NONE);
setSolidType(SOLID_NOT); setSolidType(SOLID_NOT);
@ -2921,13 +2925,37 @@ void Weapon::PickupWeapon(Event *ev)
sen->AddItem(this); sen->AddItem(this);
sen->ReceivedItem(this); sen->ReceivedItem(this);
Sound(sPickupSound); iGiveAmmo = startammo[FIRE_PRIMARY];
}
} Sound(sPickupSound);
} else { } else {
str sAmmoName = ammo_type[FIRE_PRIMARY]; bool bSameAmmo[MAX_FIREMODES] = { false };
if (sen->AmmoCount(ammo_type[FIRE_PRIMARY]) == sen->MaxAmmoCount(ammo_type[FIRE_PRIMARY])) {
bSameAmmo[FIRE_PRIMARY] = true;
if (ammo_type[0] == ammo_type[1]) {
bSameAmmo[FIRE_SECONDARY] = true;
}
}
if (!bSameAmmo[FIRE_SECONDARY]) {
if (sen->AmmoCount(ammo_type[FIRE_SECONDARY]) == sen->MaxAmmoCount(ammo_type[FIRE_SECONDARY])) {
bSameAmmo[FIRE_SECONDARY] = true;
}
}
if (bSameAmmo[FIRE_PRIMARY] && bSameAmmo[FIRE_SECONDARY]) {
return;
}
if (bSameAmmo[FIRE_PRIMARY]) {
startammo[FIRE_PRIMARY] = 0;
}
if (bSameAmmo[FIRE_SECONDARY]) {
startammo[FIRE_SECONDARY] = 0;
}
if (sen->AmmoCount(sAmmoName) != sen->MaxAmmoCount(sAmmoName)) {
setSolidType(SOLID_NOT); setSolidType(SOLID_NOT);
hideModel(); hideModel();
@ -2939,20 +2967,20 @@ void Weapon::PickupWeapon(Event *ev)
if (Respawnable()) { if (Respawnable()) {
PostEvent(EV_Item_Respawn, 0); PostEvent(EV_Item_Respawn, 0);
} else { }
else {
PostEvent(EV_Remove, 0); PostEvent(EV_Remove, 0);
} }
iGiveAmmo = ammo_in_clip[FIRE_PRIMARY] + startammo[FIRE_PRIMARY];
Sound(m_sAmmoPickupSound); Sound(m_sAmmoPickupSound);
} }
}
if (startammo[FIRE_PRIMARY] && ammo_type[FIRE_PRIMARY].length() && other->isClient()) { if (startammo[FIRE_PRIMARY] && ammo_type[FIRE_PRIMARY].length() && other->isClient()) {
str sMessage; str sMessage;
const str& sAmmoType = ammo_type[FIRE_PRIMARY]; const str& sAmmoType = ammo_type[FIRE_PRIMARY];
iGiveAmmo = startammo[FIRE_PRIMARY];
sen->GiveAmmo(sAmmoType, iGiveAmmo); sen->GiveAmmo(sAmmoType, iGiveAmmo);
/* /*