diff --git a/src/actor.h b/src/actor.h index 248847e5b..bd6b51a4d 100644 --- a/src/actor.h +++ b/src/actor.h @@ -487,6 +487,7 @@ enum ActorBounceFlag BOUNCE_AutoOffFloorOnly = 1<<13, // like BOUNCE_AutoOff, but only on floors BOUNCE_UseBounceState = 1<<14, // Use Bounce[.*] states BOUNCE_NotOnShootables = 1<<15, // do not bounce off shootable actors if we are a projectile. Explode instead. + BOUNCE_BounceOnUnrips = 1<<16, // projectile bounces on actors with DONTRIP BOUNCE_TypeMask = BOUNCE_Walls | BOUNCE_Floors | BOUNCE_Ceilings | BOUNCE_Actors | BOUNCE_AutoOff | BOUNCE_HereticType | BOUNCE_MBF, @@ -550,7 +551,7 @@ typedef TFlags ActorFlags6; typedef TFlags ActorFlags7; typedef TFlags ActorFlags8; typedef TFlags ActorRenderFlags; -typedef TFlags ActorBounceFlags; +typedef TFlags ActorBounceFlags; typedef TFlags ActorRenderFeatureFlags; DEFINE_TFLAGS_OPERATORS (ActorFlags) DEFINE_TFLAGS_OPERATORS (ActorFlags2) diff --git a/src/p_map.cpp b/src/p_map.cpp index cea1a33d6..e0b16ca2e 100644 --- a/src/p_map.cpp +++ b/src/p_map.cpp @@ -3642,7 +3642,8 @@ bool P_BounceActor(AActor *mo, AActor *BlockingMobj, bool ontop) || ((BlockingMobj->player == NULL) && (!(BlockingMobj->flags3 & MF3_ISMONSTER))))) { // Rippers should not bounce off shootable actors, since they rip through them. - if ((mo->flags & MF_MISSILE) && (mo->flags2 & MF2_RIP) && BlockingMobj->flags & MF_SHOOTABLE) + if ((mo->flags & MF_MISSILE) && (mo->flags2 & MF2_RIP) && BlockingMobj->flags & MF_SHOOTABLE + && !(mo->BounceFlags & BOUNCE_BounceOnUnrips && BlockingMobj->flags5 & MF5_DONTRIP)) return true; if (BlockingMobj->flags & MF_SHOOTABLE && mo->BounceFlags & BOUNCE_NotOnShootables) diff --git a/src/scripting/backend/codegen.cpp b/src/scripting/backend/codegen.cpp index 79b48953a..8576bcae1 100644 --- a/src/scripting/backend/codegen.cpp +++ b/src/scripting/backend/codegen.cpp @@ -48,8 +48,6 @@ #include "w_wad.h" #include "doomstat.h" -inline PClass *PObjectPointer::PointedClass() const { return static_cast(PointedType)->Descriptor; } - extern FRandom pr_exrandom; FMemArena FxAlloc(65536); int utf8_decode(const char *src, int *size); diff --git a/src/scripting/thingdef_data.cpp b/src/scripting/thingdef_data.cpp index a10d05710..60200e765 100644 --- a/src/scripting/thingdef_data.cpp +++ b/src/scripting/thingdef_data.cpp @@ -359,6 +359,7 @@ static FFlagDef ActorFlagDefs[]= DEFINE_FLAG2(BOUNCE_AutoOffFloorOnly, BOUNCEAUTOOFFFLOORONLY, AActor, BounceFlags), DEFINE_FLAG2(BOUNCE_UseBounceState, USEBOUNCESTATE, AActor, BounceFlags), DEFINE_FLAG2(BOUNCE_NotOnShootables, DONTBOUNCEONSHOOTABLES, AActor, BounceFlags), + DEFINE_FLAG2(BOUNCE_BounceOnUnrips, BOUNCEONUNRIPPABLES, AActor, BounceFlags), }; // These won't be accessible through bitfield variables diff --git a/src/scripting/types.h b/src/scripting/types.h index 52f1fc464..7d2f2341c 100644 --- a/src/scripting/types.h +++ b/src/scripting/types.h @@ -575,6 +575,10 @@ public: }; +inline PClass *PObjectPointer::PointedClass() const +{ + return static_cast(PointedType)->Descriptor; +} // Returns a type from the TypeTable. Will create one if it isn't present. PMap *NewMap(PType *keytype, PType *valuetype); diff --git a/wadsrc/static/zscript/strife/strifefunctions.txt b/wadsrc/static/zscript/strife/strifefunctions.txt index 5e0312a95..df4a3e73f 100644 --- a/wadsrc/static/zscript/strife/strifefunctions.txt +++ b/wadsrc/static/zscript/strife/strifefunctions.txt @@ -137,7 +137,7 @@ extend class Actor { drop.Vel.Z = -1.; } - A_Explode(64, 64, XF_NOSPLASH, damagetype: 'Fire'); + A_Explode(64, 64, XF_NOSPLASH|XF_HURTSOURCE|XF_NOTMISSILE, damagetype: 'Fire'); } //==========================================================================