From f2b741702020175cc99990e0cc56c95e7c963dd6 Mon Sep 17 00:00:00 2001 From: Randy Heit Date: Tue, 30 Jun 2009 23:23:12 +0000 Subject: [PATCH] - MF2_NODMGTHRUST now works with players, too. (Previously, it was only for missiles.) Also added PPF_NOTHRUSTWHILEINVUL to prevent invulnerable players from being thrusted while taking damage. (Non-players were already unthrusted.) SVN r1695 (trunk) --- docs/rh-log.txt | 4 ++++ src/d_player.h | 9 +++++++++ src/p_interaction.cpp | 15 +++++++++------ src/p_user.cpp | 4 ++++ src/thingdef/thingdef_data.cpp | 16 +++++++++++----- wadsrc/static/actors/hexen/clericplayer.txt | 2 ++ wadsrc/static/actors/hexen/fighterplayer.txt | 2 ++ wadsrc/static/actors/hexen/mageplayer.txt | 2 ++ 8 files changed, 43 insertions(+), 11 deletions(-) diff --git a/docs/rh-log.txt b/docs/rh-log.txt index be3ebda459..3fbc51b107 100644 --- a/docs/rh-log.txt +++ b/docs/rh-log.txt @@ -1,4 +1,8 @@ June 30, 2009 +- MF2_NODMGTHRUST now works with players, too. (Previously, it was only for + missiles.) Also added PPF_NOTHRUSTWHILEINVUL to prevent invulnerable players + from being thrusted while taking damage. (Non-players were already + unthrusted.) - A_ZoomFactor now scales turning with the FOV by default. ZOOM_NOSCALETURNING will leave it unaltered. - Added Gez's PowerInvisibility changes. diff --git a/src/d_player.h b/src/d_player.h index bc99d22e37..245279dbb2 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -118,6 +118,7 @@ public: int crouchsprite; int MaxHealth; int RunHealth; + int PlayerFlags; TObjPtr InvFirst; // first inventory item displayed on inventory bar TObjPtr InvSel; // selected inventory item @@ -145,6 +146,14 @@ class APlayerChunk : public APlayerPawn DECLARE_CLASS (APlayerChunk, APlayerPawn) }; +// +// PlayerPawn flags +// +enum +{ + PPF_NOTHRUSTWHENINVUL = 1, // Attacks do not thrust the player if they are invulnerable. +}; + // // Player states. // diff --git a/src/p_interaction.cpp b/src/p_interaction.cpp index 6c63967df6..af83f0b9e0 100644 --- a/src/p_interaction.cpp +++ b/src/p_interaction.cpp @@ -916,18 +916,20 @@ void P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage } if ((target->flags2 & MF2_INVULNERABLE) && damage < 1000000 && !(flags & DMG_FORCED)) { // actor is invulnerable - if (!target->player) + if (target->player == NULL) { - if (!inflictor || !(inflictor->flags3 & MF3_FOILINVUL)) + if (inflictor == NULL || !(inflictor->flags3 & MF3_FOILINVUL)) { return; } } else { - // Only in Hexen invulnerable players are excluded from getting - // thrust by damage. - if (gameinfo.gametype == GAME_Hexen) return; + // Players are optionally excluded from getting thrust by damage. + if (static_cast(target)->PlayerFlags & PPF_NOTHRUSTWHENINVUL) + { + return; + } } } @@ -1024,7 +1026,8 @@ void P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage if (inflictor && inflictor != target // [RH] Not if hurting own self && !(target->flags & MF_NOCLIP) && !(inflictor->flags2 & MF2_NODMGTHRUST) - && !(flags & DMG_THRUSTLESS)) + && !(flags & DMG_THRUSTLESS) + && (source == NULL || source->player == NULL || !(source->flags2 & MF2_NODMGTHRUST))) { int kickback; diff --git a/src/p_user.cpp b/src/p_user.cpp index 2921cac7ba..4d6b6905b3 100644 --- a/src/p_user.cpp +++ b/src/p_user.cpp @@ -425,6 +425,10 @@ void APlayerPawn::Serialize (FArchive &arc) << InvSel << MorphWeapon << DamageFade; + if (SaveVersion >= 1695) + { + arc << PlayerFlags; + } } //=========================================================================== diff --git a/src/thingdef/thingdef_data.cpp b/src/thingdef/thingdef_data.cpp index 881ff5cc0e..76fc4d78c4 100644 --- a/src/thingdef/thingdef_data.cpp +++ b/src/thingdef/thingdef_data.cpp @@ -264,7 +264,6 @@ static FFlagDef InventoryFlags[] = DEFINE_FLAG(IF, PERSISTENTPOWER, AInventory, ItemFlags), DEFINE_DEPRECATED_FLAG(PICKUPFLASH), - }; static FFlagDef WeaponFlags[] = @@ -292,13 +291,20 @@ static FFlagDef WeaponFlags[] = DEFINE_DUMMY_FLAG(NOLMS), }; +static FFlagDef PlayerPawnFlags[] = +{ + // PlayerPawn flags + DEFINE_FLAG(PPF, NOTHRUSTWHENINVUL, APlayerPawn, PlayerFlags), +}; + static const struct { const PClass *Type; FFlagDef *Defs; int NumDefs; } FlagLists[] = { - { RUNTIME_CLASS(AActor), ActorFlags, sizeof(ActorFlags)/sizeof(FFlagDef) }, - { RUNTIME_CLASS(AInventory), InventoryFlags, sizeof(InventoryFlags)/sizeof(FFlagDef) }, - { RUNTIME_CLASS(AWeapon), WeaponFlags, sizeof(WeaponFlags)/sizeof(FFlagDef) } + { RUNTIME_CLASS(AActor), ActorFlags, countof(ActorFlags) }, + { RUNTIME_CLASS(AInventory), InventoryFlags, countof(InventoryFlags) }, + { RUNTIME_CLASS(AWeapon), WeaponFlags, countof(WeaponFlags) }, + { RUNTIME_CLASS(APlayerPawn), PlayerPawnFlags,countof(PlayerPawnFlags) }, }; -#define NUM_FLAG_LISTS 3 +#define NUM_FLAG_LISTS (countof(FlagLists)) //========================================================================== // diff --git a/wadsrc/static/actors/hexen/clericplayer.txt b/wadsrc/static/actors/hexen/clericplayer.txt index 2edb06779a..f440fbf17d 100644 --- a/wadsrc/static/actors/hexen/clericplayer.txt +++ b/wadsrc/static/actors/hexen/clericplayer.txt @@ -9,6 +9,8 @@ ACTOR ClericPlayer : PlayerPawn Height 64 Speed 1 +NOSKIN + +NODAMAGETHRUST + +NOTHRUSTWHENINVUL PainSound "PlayerClericPain" RadiusDamageFactor 0.25 Player.JumpZ 9.75 diff --git a/wadsrc/static/actors/hexen/fighterplayer.txt b/wadsrc/static/actors/hexen/fighterplayer.txt index b824bdb35d..a6ca241f35 100644 --- a/wadsrc/static/actors/hexen/fighterplayer.txt +++ b/wadsrc/static/actors/hexen/fighterplayer.txt @@ -8,6 +8,8 @@ ACTOR FighterPlayer : PlayerPawn Height 64 Speed 1 +NOSKIN + +NODAMAGETHRUST + +NOTHRUSTWHENINVUL PainSound "PlayerFighterPain" RadiusDamageFactor 0.25 Player.JumpZ 9.75 diff --git a/wadsrc/static/actors/hexen/mageplayer.txt b/wadsrc/static/actors/hexen/mageplayer.txt index 72443af5db..f9e07d2aad 100644 --- a/wadsrc/static/actors/hexen/mageplayer.txt +++ b/wadsrc/static/actors/hexen/mageplayer.txt @@ -9,6 +9,8 @@ ACTOR MagePlayer : PlayerPawn Height 64 Speed 1 +NOSKIN + +NODAMAGETHRUST + +NOTHRUSTWHENINVUL PainSound "PlayerMagePain" RadiusDamageFactor 0.25 Player.JumpZ 9.75