diff --git a/src/info.c b/src/info.c index 861120d23..c1136d43d 100644 --- a/src/info.c +++ b/src/info.c @@ -22550,7 +22550,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = MT_RANDOMITEMPOP, // damage sfx_None, // activesound MF_SLIDEME|MF_SPECIAL|MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_DONTENCOREMAP, // flags - S_NULL // raisestate + S_RANDOMITEM1 // raisestate }, { // MT_SPHEREBOX diff --git a/src/p_enemy.c b/src/p_enemy.c index 1a0c31c4b..527dcf0b6 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -13199,7 +13199,13 @@ void A_ItemPop(mobj_t *actor) // Here at mapload in battle? if ((gametyperules & GTR_BUMPERS) && (actor->flags2 & MF2_BOSSNOTRAP)) + { numgotboxes++; + + // do not flicker back in just yet, handled by + // P_RespawnBattleBoxes eventually + P_SetMobjState(actor, S_INVISIBLE); + } } void A_JawzChase(mobj_t *actor) diff --git a/src/p_inter.c b/src/p_inter.c index 7898d0b8e..1edf9fcb2 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -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) { - UINT8 i; - P_SetTarget(&target->target, source); - for (i = 0; i < MAXPLAYERS; i++) + if (gametyperules & GTR_BUMPERS) { - if (&players[i] == source->player) - { - continue; - } - - if (playeringame[i] && !players[i].spectator && players[i].lives != 0) - { - break; - } + target->fuse = 2; } - - if (i < MAXPLAYERS) + else { - // Respawn items in multiplayer, don't respawn them when alone - target->fuse = 2*TICRATE + 2; + UINT8 i; + + 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; + } } } } diff --git a/src/p_mobj.c b/src/p_mobj.c index 1c34a1b1e..1d08d63e9 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -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; } @@ -11072,7 +11072,6 @@ void P_RespawnBattleBoxes(void) for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next) { mobj_t *box; - mobj_t *newmobj; if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed) continue; @@ -11081,25 +11080,12 @@ void P_RespawnBattleBoxes(void) if (box->type != MT_RANDOMITEM || (box->flags2 & MF2_DONTRESPAWN) - || box->threshold != 68 - || box->fuse - || ((tic_t)box->cvmem+1 >= leveltime)) + || box->health > 0 + || box->fuse) continue; // only popped items - // Respawn from mapthing if you have one! - if (box->spawnpoint) - { - 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 + box->fuse = TICRATE; // flicker back in (A_ItemPop preps this effect) + P_SetMobjState(box, box->info->raisestate); if (numgotboxes > 0) numgotboxes--; // you've restored a box, remove it from the count