Fix ring counter desync when whipping/bailing while attracting rings

This commit is contained in:
Antonio Martinez 2025-09-15 03:26:06 -04:00
parent 3d5e60241c
commit 9222bfc5dd

View file

@ -3510,9 +3510,19 @@ void A_AttractChase(mobj_t *actor)
if (actor->extravalue1 && actor->type != MT_EMERALD) // SRB2Kart if (actor->extravalue1 && actor->type != MT_EMERALD) // SRB2Kart
{ {
if (!actor->target || P_MobjWasRemoved(actor->target) || !actor->target->player // Screwed this up for staffghosts, so have a mess.
|| actor->target->player->baildrop || actor->target->player->bailcharge || actor->target->player->defenseLockout > PUNISHWINDOW) // 1. Insta-Whip's extended punish window used to delete flingrings off you while they were attracting
// 2. ALL conditions that deleted flingrings off you didn't decrement pickuprings, desyncing your ring count
boolean stale = (!actor->target || P_MobjWasRemoved(actor->target) || !actor->target->player);
boolean legacy_blocked = (actor->target->player->baildrop || actor->target->player->bailcharge || actor->target->player->defenseLockout > PUNISHWINDOW);
boolean new_blocked = (actor->target->player->baildrop || actor->target->player->bailcharge);
boolean blocked = (G_CompatLevel(0x0010) ? legacy_blocked : new_blocked);
if (stale || blocked)
{ {
if (!G_CompatLevel(0x0010) && !stale)
actor->target->player->pickuprings--;
P_RemoveMobj(actor); P_RemoveMobj(actor);
return; return;
} }