diff --git a/src/p_inter.c b/src/p_inter.c index 27e612154..7fb0083a7 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -3237,6 +3237,11 @@ static boolean P_TagDamage(mobj_t *target, mobj_t *inflictor, mobj_t *source, IN S_StartSound(target, mobjinfo[MT_PITY_ICON].seesound); } } + else if (inflictor->flags2 & MF2_FIRING) + P_GivePlayerRings(player, 1); + if (inflictor->flags2 & MF2_BOUNCERING) + inflictor->fuse = 0; // bounce ring disappears at -1 not 0 + return false; } @@ -3252,10 +3257,11 @@ static boolean P_TagDamage(mobj_t *target, mobj_t *inflictor, mobj_t *source, IN S_StartSound(target, mobjinfo[MT_PITY_ICON].seesound); } } - else if (!(inflictor->flags & MF_FIRE)) + else if (inflictor->flags2 & MF2_FIRING) P_GivePlayerRings(player, 1); if (inflictor->flags2 & MF2_BOUNCERING) inflictor->fuse = 0; // bounce ring disappears at -1 not 0 + return false; } @@ -3337,6 +3343,11 @@ static boolean P_PlayerHitsPlayer(mobj_t *target, mobj_t *inflictor, mobj_t *sou S_StartSound(target, mobjinfo[MT_PITY_ICON].seesound); } } + else if (inflictor->flags2 & MF2_FIRING) + P_GivePlayerRings(target->player, 1); + if (inflictor->flags2 & MF2_BOUNCERING) + inflictor->fuse = 0; // bounce ring disappears at -1 not 0 + return false; } } @@ -3360,7 +3371,7 @@ static boolean P_PlayerHitsPlayer(mobj_t *target, mobj_t *inflictor, mobj_t *sou S_StartSound(target, mobjinfo[MT_PITY_ICON].seesound); } } - else if (!(inflictor->flags & MF_FIRE)) + else if (inflictor->flags2 & MF2_FIRING) P_GivePlayerRings(target->player, 1); if (inflictor->flags2 & MF2_BOUNCERING) inflictor->fuse = 0; // bounce ring disappears at -1 not 0 @@ -3814,14 +3825,9 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da return true; } - if (!force && inflictor && inflictor->flags & MF_FIRE && !(damagetype && damagetype != DMG_FIRE)) - { - if (player->powers[pw_shield] & SH_PROTECTFIRE) - return false; // Invincible to fire objects - - if (G_PlatformGametype() && inflictor && source && source->player) - return false; // Don't get hurt by fire generated from friends. - } + if (!force && inflictor && inflictor->flags & MF_FIRE && !(damagetype && damagetype != DMG_FIRE) + && (player->powers[pw_shield] & SH_PROTECTFIRE)) + return false; // Invincible to fire objects // Player hits another player if (!force && source && source->player) diff --git a/src/p_mobj.c b/src/p_mobj.c index 259bf19d4..8a187cb16 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -953,7 +953,8 @@ void P_ExplodeMissile(mobj_t *mo) } } - mo->flags &= ~MF_MISSILE; + mo->flags &= ~MF_MISSILE; // You're not a missile anymore! + mo->flags2 &= ~MF2_FIRING; // Make sure we don't trigger the non-missile behavior of MF2_FIRING mo->flags |= MF_NOGRAVITY; // Dead missiles don't need to sink anymore. mo->flags |= MF_NOCLIPTHING; // Dummy flag to indicate that this was already called. @@ -1821,11 +1822,6 @@ void P_XYMovement(mobj_t *mo) } } } - else if (mo->type == MT_SPINFIRE) - { - P_RemoveMobj(mo); - return; - } else if (mo->flags & MF_MISSILE) { // explode a missile @@ -9875,10 +9871,8 @@ static boolean P_MobjRegularThink(mobj_t *mobj) static void P_FiringThink(mobj_t *mobj) { - if (!mobj->target) - return; - - if (mobj->health <= 0) + if (!mobj->target || mobj->health <= 0 || mobj->flags & MF_MISSILE + || mobj->extravalue1 <= 0 || mobj->extravalue1 >= NUMMOBJTYPES) return; if (mobj->state->action.acp1 == (actionf_p1)A_Boss1Laser) diff --git a/src/p_mobj.h b/src/p_mobj.h index 4a8427669..184a737f2 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -181,7 +181,7 @@ typedef enum MF2_DEBRIS = 1<<14, // Splash ring from explosion ring MF2_NIGHTSPULL = 1<<15, // Attracted from a paraloop MF2_JUSTATTACKED = 1<<16, // can be pushed by other moving mobjs - MF2_FIRING = 1<<17, // turret fire + MF2_FIRING = 1<<17, // Fire projectiles at your target. Or, if mobj has MF_MISSILE, this is an indicator for being a thrown ring. MF2_SUPERFIRE = 1<<18, // Firing something with Super Sonic-stopping properties. Or, if mobj has MF_MISSILE, this is the actual fire from it. MF2_SHADOW = 1<<19, // Fuzzy draw, makes targeting harder. MF2_STRONGBOX = 1<<20, // Flag used for "strong" random monitors. diff --git a/src/p_user.c b/src/p_user.c index ba22808ea..e4d5f568e 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4234,7 +4234,7 @@ static void P_DoFiring(player_t *player, ticcmd_t *cmd) P_DrainWeaponAmmo(player, pw_bouncering); P_SetWeaponDelay(player, TICRATE/4); - mo = P_SpawnPlayerMissile(player->mo, MT_THROWNBOUNCE, MF2_BOUNCERING); + mo = P_SpawnPlayerMissile(player->mo, MT_THROWNBOUNCE, MF2_BOUNCERING|MF2_FIRING); if (mo) mo->fuse = 3*TICRATE; // Bounce Ring time @@ -4245,7 +4245,7 @@ static void P_DoFiring(player_t *player, ticcmd_t *cmd) P_DrainWeaponAmmo(player, pw_railring); P_SetWeaponDelay(player, (3*TICRATE)/2); - mo = P_SpawnPlayerMissile(player->mo, MT_REDRING, MF2_RAILRING|MF2_DONTDRAW); + mo = P_SpawnPlayerMissile(player->mo, MT_REDRING, MF2_RAILRING|MF2_DONTDRAW|MF2_FIRING); // Rail has no unique thrown object, therefore its sound plays here. S_StartSound(player->mo, sfx_rail1); @@ -4257,7 +4257,7 @@ static void P_DoFiring(player_t *player, ticcmd_t *cmd) player->pflags &= ~PF_ATTACKDOWN; P_SetWeaponDelay(player, 2); - mo = P_SpawnPlayerMissile(player->mo, MT_THROWNAUTOMATIC, MF2_AUTOMATIC); + mo = P_SpawnPlayerMissile(player->mo, MT_THROWNAUTOMATIC, MF2_AUTOMATIC|MF2_FIRING); } // Explosion else if (player->currentweapon == WEP_EXPLODE && player->powers[pw_explosionring]) @@ -4265,7 +4265,7 @@ static void P_DoFiring(player_t *player, ticcmd_t *cmd) P_DrainWeaponAmmo(player, pw_explosionring); P_SetWeaponDelay(player, (3*TICRATE)/2); - mo = P_SpawnPlayerMissile(player->mo, MT_THROWNEXPLOSION, MF2_EXPLOSION); + mo = P_SpawnPlayerMissile(player->mo, MT_THROWNEXPLOSION, MF2_EXPLOSION|MF2_FIRING); } // Grenade else if (player->currentweapon == WEP_GRENADE && player->powers[pw_grenadering]) @@ -4273,7 +4273,7 @@ static void P_DoFiring(player_t *player, ticcmd_t *cmd) P_DrainWeaponAmmo(player, pw_grenadering); P_SetWeaponDelay(player, TICRATE/3); - mo = P_SpawnPlayerMissile(player->mo, MT_THROWNGRENADE, MF2_EXPLOSION); + mo = P_SpawnPlayerMissile(player->mo, MT_THROWNGRENADE, MF2_EXPLOSION|MF2_FIRING); if (mo) { @@ -4293,25 +4293,25 @@ static void P_DoFiring(player_t *player, ticcmd_t *cmd) P_SetWeaponDelay(player, (2*TICRATE)/3); // Center - mo = P_SpawnPlayerMissile(player->mo, MT_THROWNSCATTER, MF2_SCATTER); + mo = P_SpawnPlayerMissile(player->mo, MT_THROWNSCATTER, MF2_SCATTER|MF2_FIRING); if (mo) shotangle = R_PointToAngle2(player->mo->x, player->mo->y, mo->x, mo->y); // Left - mo = P_SPMAngle(player->mo, MT_THROWNSCATTER, shotangle-ANG2, true, MF2_SCATTER); + mo = P_SPMAngle(player->mo, MT_THROWNSCATTER, shotangle-ANG2, true, MF2_SCATTER|MF2_FIRING); // Right - mo = P_SPMAngle(player->mo, MT_THROWNSCATTER, shotangle+ANG2, true, MF2_SCATTER); + mo = P_SPMAngle(player->mo, MT_THROWNSCATTER, shotangle+ANG2, true, MF2_SCATTER|MF2_FIRING); // Down player->mo->z += FixedMul(12*FRACUNIT, player->mo->scale); player->aiming += ANG1; - mo = P_SPMAngle(player->mo, MT_THROWNSCATTER, shotangle, true, MF2_SCATTER); + mo = P_SPMAngle(player->mo, MT_THROWNSCATTER, shotangle, true, MF2_SCATTER|MF2_FIRING); // Up player->mo->z -= FixedMul(24*FRACUNIT, player->mo->scale); player->aiming -= ANG2; - mo = P_SPMAngle(player->mo, MT_THROWNSCATTER, shotangle, true, MF2_SCATTER); + mo = P_SPMAngle(player->mo, MT_THROWNSCATTER, shotangle, true, MF2_SCATTER|MF2_FIRING); player->mo->z = oldz; player->aiming = oldaiming; @@ -4331,7 +4331,7 @@ firenormal: { P_SetWeaponDelay(player, TICRATE/4); - mo = P_SpawnPlayerMissile(player->mo, MT_THROWNINFINITY, 0); + mo = P_SpawnPlayerMissile(player->mo, MT_THROWNINFINITY, MF2_FIRING); player->powers[pw_infinityring]--; } @@ -4342,7 +4342,7 @@ firenormal: return; P_SetWeaponDelay(player, TICRATE/4); - mo = P_SpawnPlayerMissile(player->mo, MT_REDRING, 0); + mo = P_SpawnPlayerMissile(player->mo, MT_REDRING, MF2_FIRING); if (mo) P_ColorTeamMissile(mo, player);