mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-04-19 16:51:53 +00:00
Merge branch 'ring-fix' into 'next'
Make Only Missiles with MF2_FIRING Give Rings to Teammates | Allow MT_SPINFIRE to Deal Damage to Players Outside of Ringslinger (Resolves #164) Closes #164 See merge request STJr/SRB2!2002
This commit is contained in:
commit
9160ed969d
4 changed files with 33 additions and 33 deletions
|
@ -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)
|
||||
|
|
14
src/p_mobj.c
14
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)
|
||||
|
|
|
@ -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.
|
||||
|
|
24
src/p_user.c
24
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);
|
||||
|
|
Loading…
Reference in a new issue