diff --git a/src/p_enemy.c b/src/p_enemy.c index c04e66c4..428fd029 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -3270,6 +3270,7 @@ void A_JumpIfFlagsSet(mobj_t* actor) void A_AddFlags(mobj_t* actor) { unsigned int flags, flags2; + boolean update_blockmap; if (!mbf21 || !actor) return; @@ -3277,8 +3278,19 @@ void A_AddFlags(mobj_t* actor) flags = actor->state->args[0]; flags2 = actor->state->args[1]; + // unlink/relink the thing from the blockmap if + // the NOBLOCKMAP or NOSECTOR flags are added + update_blockmap = ((flags & MF_NOBLOCKMAP) && !(actor->flags & MF_NOBLOCKMAP)) + || ((flags & MF_NOSECTOR) && !(actor->flags & MF_NOSECTOR)); + + if (update_blockmap) + P_UnsetThingPosition(actor); + actor->flags |= flags; actor->flags2 |= flags2; + + if (update_blockmap) + P_SetThingPosition(actor); } // @@ -3290,6 +3302,7 @@ void A_AddFlags(mobj_t* actor) void A_RemoveFlags(mobj_t* actor) { unsigned int flags, flags2; + boolean update_blockmap; if (!mbf21 || !actor) return; @@ -3297,8 +3310,19 @@ void A_RemoveFlags(mobj_t* actor) flags = actor->state->args[0]; flags2 = actor->state->args[1]; + // unlink/relink the thing from the blockmap if + // the NOBLOCKMAP or NOSECTOR flags are removed + update_blockmap = ((flags & MF_NOBLOCKMAP) && (actor->flags & MF_NOBLOCKMAP)) + || ((flags & MF_NOSECTOR) && (actor->flags & MF_NOSECTOR)); + + if (update_blockmap) + P_UnsetThingPosition(actor); + actor->flags &= ~flags; actor->flags2 &= ~flags2; + + if (update_blockmap) + P_SetThingPosition(actor); } //----------------------------------------------------------------------------