void P_MovePsprites (player_t *player) { int i; pspdef_t *psp; FState *state; // [RH] If you don't have a weapon, then the psprites should be NULL. if (player->ReadyWeapon == NULL && (player->health > 0 || player->mo->DamageType != NAME_Fire)) { P_SetPsprite (player, ps_weapon, NULL); P_SetPsprite (player, ps_flash, NULL); if (player->PendingWeapon != WP_NOCHANGE) { P_BringUpWeapon (player); } } else { psp = &player->psprites[0]; for (i = 0; i < NUMPSPRITES; i++, psp++) { if ((state = psp->state) != NULL && psp->processPending) // a null state means not active { // drop tic count and possibly change state if (psp->tics != -1) // a -1 tic count never changes { psp->tics--; // [BC] Apply double firing speed. if ( psp->tics && (player->cheats & CF_DOUBLEFIRINGSPEED)) psp->tics--; if(!psp->tics) { P_SetPsprite (player, i, psp->state->GetNextState()); } } } } player->psprites[ps_flash].sx = player->psprites[ps_weapon].sx; player->psprites[ps_flash].sy = player->psprites[ps_weapon].sy; P_CheckWeaponSwitch (player); if (player->WeaponState & (WF_WEAPONREADY | WF_WEAPONREADYALT)) { P_CheckWeaponFire (player); } if (player->WeaponState & WF_WEAPONRELOADOK) { P_CheckWeaponReload (player); } if (player->WeaponState & WF_WEAPONZOOMOK) { P_CheckWeaponZoom (player); } } }
void player_t::TickPSprites() { DPSprite *pspr = psprites; while (pspr) { // Destroy the psprite if it's from a weapon that isn't currently selected by the player // or if it's from an inventory item that the player no longer owns. if ((pspr->Caller == nullptr || (pspr->Caller->IsKindOf(RUNTIME_CLASS(AInventory)) && barrier_cast<AInventory *>(pspr->Caller)->Owner != pspr->Owner->mo) || (pspr->Caller->IsKindOf(RUNTIME_CLASS(AWeapon)) && pspr->Caller != pspr->Owner->ReadyWeapon))) { pspr->Destroy(); } else { pspr->Tick(); } pspr = pspr->Next; } if ((health > 0) || (ReadyWeapon != nullptr && !(ReadyWeapon->WeaponFlags & WIF_NODEATHINPUT))) { if (ReadyWeapon == nullptr) { if (PendingWeapon != WP_NOCHANGE) P_BringUpWeapon(this); } else { P_CheckWeaponSwitch(this); if (WeaponState & (WF_WEAPONREADY | WF_WEAPONREADYALT)) { P_CheckWeaponFire(this); } // Check custom buttons P_CheckWeaponButtons(this); } } }