Fix respawning item boxes with P_RespawnBattlesBoxes

This commit is contained in:
James R 2022-09-20 10:36:32 -07:00
parent 81eb513ef1
commit e7b0e223e1
4 changed files with 35 additions and 36 deletions

View file

@ -22550,7 +22550,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
MT_RANDOMITEMPOP, // damage MT_RANDOMITEMPOP, // damage
sfx_None, // activesound sfx_None, // activesound
MF_SLIDEME|MF_SPECIAL|MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_DONTENCOREMAP, // flags MF_SLIDEME|MF_SPECIAL|MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_DONTENCOREMAP, // flags
S_NULL // raisestate S_RANDOMITEM1 // raisestate
}, },
{ // MT_SPHEREBOX { // MT_SPHEREBOX

View file

@ -13199,7 +13199,13 @@ void A_ItemPop(mobj_t *actor)
// Here at mapload in battle? // Here at mapload in battle?
if ((gametyperules & GTR_BUMPERS) && (actor->flags2 & MF2_BOSSNOTRAP)) if ((gametyperules & GTR_BUMPERS) && (actor->flags2 & MF2_BOSSNOTRAP))
{
numgotboxes++; numgotboxes++;
// do not flicker back in just yet, handled by
// P_RespawnBattleBoxes eventually
P_SetMobjState(actor, S_INVISIBLE);
}
} }
void A_JawzChase(mobj_t *actor) void A_JawzChase(mobj_t *actor)

View file

@ -1037,27 +1037,34 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget
{ {
if (target->flags & MF_MONITOR || target->type == MT_RANDOMITEM) if (target->flags & MF_MONITOR || target->type == MT_RANDOMITEM)
{ {
UINT8 i;
P_SetTarget(&target->target, source); P_SetTarget(&target->target, source);
for (i = 0; i < MAXPLAYERS; i++) if (gametyperules & GTR_BUMPERS)
{ {
if (&players[i] == source->player) target->fuse = 2;
{
continue;
}
if (playeringame[i] && !players[i].spectator && players[i].lives != 0)
{
break;
}
} }
else
if (i < MAXPLAYERS)
{ {
// Respawn items in multiplayer, don't respawn them when alone UINT8 i;
target->fuse = 2*TICRATE + 2;
for (i = 0; i < MAXPLAYERS; i++)
{
if (&players[i] == source->player)
{
continue;
}
if (playeringame[i] && !players[i].spectator && players[i].lives != 0)
{
break;
}
}
if (i < MAXPLAYERS)
{
// Respawn items in multiplayer, don't respawn them when alone
target->fuse = 2*TICRATE + 2;
}
} }
} }
} }

View file

@ -9229,7 +9229,7 @@ static boolean P_FuseThink(mobj_t *mobj)
{ {
; ;
} }
else if ((gametyperules & GTR_BUMPERS) && (mobj->threshold != 70)) else if ((gametyperules & GTR_BUMPERS) && (mobj->state == &states[S_INVISIBLE]))
{ {
break; break;
} }
@ -11072,7 +11072,6 @@ void P_RespawnBattleBoxes(void)
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next) for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
{ {
mobj_t *box; mobj_t *box;
mobj_t *newmobj;
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed) if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
continue; continue;
@ -11081,25 +11080,12 @@ void P_RespawnBattleBoxes(void)
if (box->type != MT_RANDOMITEM if (box->type != MT_RANDOMITEM
|| (box->flags2 & MF2_DONTRESPAWN) || (box->flags2 & MF2_DONTRESPAWN)
|| box->threshold != 68 || box->health > 0
|| box->fuse || box->fuse)
|| ((tic_t)box->cvmem+1 >= leveltime))
continue; // only popped items continue; // only popped items
// Respawn from mapthing if you have one! box->fuse = TICRATE; // flicker back in (A_ItemPop preps this effect)
if (box->spawnpoint) P_SetMobjState(box, box->info->raisestate);
{
P_SpawnMapThing(box->spawnpoint);
newmobj = box->spawnpoint->mobj; // this is set to the new mobj in P_SpawnMapThing
}
else
{
newmobj = P_SpawnMobj(box->x, box->y, box->z, box->type);
}
// Transfer flags2 (strongbox, objectflip, bossnotrap)
newmobj->flags2 = box->flags2;
P_RemoveMobj(box); // make sure they disappear
if (numgotboxes > 0) if (numgotboxes > 0)
numgotboxes--; // you've restored a box, remove it from the count numgotboxes--; // you've restored a box, remove it from the count