mirror of
https://git.do.srb2.org/KartKrew/Kart-Public.git
synced 2025-04-02 08:21:09 +00:00
Fix Bombs
Use reactiontime instead of health so chain reactions can occur when multiple bombs are layered. Make the check for nearby players happen BEFORE the spawning of explosion objects. Remove MF_NOCLIPTHING and MF_MISSILE from bombs so they don't try and die when they hit the floor sometimes.
This commit is contained in:
parent
0483c882cd
commit
2a4a0f24d4
3 changed files with 26 additions and 18 deletions
|
@ -14924,10 +14924,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
{ // MT_BOMBITEM
|
||||
-1, // doomednum
|
||||
S_BOMBAIR, // spawnstate
|
||||
105, // spawnhealth
|
||||
1, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_tossed, // seesound
|
||||
8, // reactiontime
|
||||
105, // reactiontime
|
||||
sfx_None, // attacksound
|
||||
S_NULL, // painstate
|
||||
288*FRACUNIT, // painchance
|
||||
|
@ -14944,7 +14944,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
1, // damage
|
||||
sfx_bomb, // activesound
|
||||
MF_BOUNCE|MF_NOCLIPTHING|MF_MISSILE|MF_SHOOTABLE, // flags
|
||||
MF_BOUNCE|MF_SHOOTABLE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
|
@ -8273,20 +8273,11 @@ void A_BobombExplode(mobj_t *actor)
|
|||
|
||||
type = (mobjtype_t)locvar1;
|
||||
|
||||
for (d = 0; d < 16; d++)
|
||||
K_SpawnKartExplosion(actor->x, actor->y, actor->z, actor->info->painchance + 32*FRACUNIT, 32, type, d*(ANGLE_45/4), true, false, actor->target); // 32 <-> 64
|
||||
|
||||
if (actor->target->player)
|
||||
K_SpawnBobombExplosion(actor, actor->target->player->skincolor);
|
||||
else
|
||||
K_SpawnBobombExplosion(actor, SKINCOLOR_RED);
|
||||
|
||||
P_SpawnMobj(actor->x, actor->y, actor->z, MT_BOMBEXPLOSIONSOUND);
|
||||
|
||||
//S_StartSound(actor, sfx_prloop);
|
||||
|
||||
for (th = thinkercap.next; th != &thinkercap; th = th->next)
|
||||
{
|
||||
if (P_MobjWasRemoved(actor))
|
||||
return; // There's the possibility these can chain react onto themselves after they've already died if there are enough all in one spot
|
||||
|
||||
if (th->function.acp1 != (actionf_p1)P_MobjThinker)
|
||||
continue;
|
||||
|
||||
|
@ -8313,6 +8304,17 @@ void A_BobombExplode(mobj_t *actor)
|
|||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
for (d = 0; d < 16; d++)
|
||||
K_SpawnKartExplosion(actor->x, actor->y, actor->z, actor->info->painchance + 32*FRACUNIT, 32, type, d*(ANGLE_45/4), true, false, actor->target); // 32 <-> 64
|
||||
|
||||
if (actor->target && actor->target->player)
|
||||
K_SpawnBobombExplosion(actor, actor->target->player->skincolor);
|
||||
else
|
||||
K_SpawnBobombExplosion(actor, SKINCOLOR_RED);
|
||||
|
||||
P_SpawnMobj(actor->x, actor->y, actor->z, MT_BOMBEXPLOSIONSOUND);
|
||||
|
||||
return;
|
||||
}
|
||||
//}
|
||||
|
|
12
src/p_mobj.c
12
src/p_mobj.c
|
@ -7970,17 +7970,23 @@ void P_MobjThinker(mobj_t *mobj)
|
|||
case MT_BOMBITEM:
|
||||
if (mobj->momx || mobj->momy)
|
||||
P_SpawnGhostMobj(mobj);
|
||||
if (mobj->z <= mobj->floorz)
|
||||
if (P_IsObjectOnGround(mobj))
|
||||
{
|
||||
if (mobj->health > mobj->info->spawnhealth-1)
|
||||
if (mobj->reactiontime >= mobj->info->reactiontime)
|
||||
{
|
||||
if (mobj->state == &states[S_BOMBAIR])
|
||||
P_SetMobjState(mobj, S_BOMBITEM);
|
||||
|
||||
mobj->momx = mobj->momy = 0;
|
||||
S_StartSound(mobj, mobj->info->activesound);
|
||||
mobj->reactiontime--;
|
||||
}
|
||||
mobj->health--;
|
||||
}
|
||||
if (mobj->reactiontime && mobj->reactiontime < mobj->info->reactiontime)
|
||||
{
|
||||
mobj->reactiontime--;
|
||||
if (!mobj->reactiontime)
|
||||
P_KillMobj(mobj, NULL, NULL);
|
||||
}
|
||||
if (mobj->threshold > 0)
|
||||
mobj->threshold--;
|
||||
|
|
Loading…
Reference in a new issue