From e75dee77479646372040f755d5c06f320055c563 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Mon, 30 Sep 2019 20:35:47 +0200 Subject: [PATCH] Fix various minus carrying bugs --- src/p_enemy.c | 29 ++++++++++++++++++++++++++--- src/p_inter.c | 13 +++++++++++++ 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/p_enemy.c b/src/p_enemy.c index f61f2a09b..0343c8bf6 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -5177,20 +5177,28 @@ static mobj_t *minus; static boolean PIT_MinusCarry(mobj_t *thing) { + if (minus->tracer) + return true; + if (minus->type == thing->type) return true; - if (!(thing->flags & MF_SHOOTABLE) || !(thing->flags & MF_ENEMY)) + if (!(thing->flags & (MF_PUSHABLE|MF_ENEMY))) return true; - if (P_AproxDistance(minus->x - thing->x, minus->y - thing->y) >= minus->radius * 3) + if (P_AproxDistance(minus->x - thing->x, minus->y - thing->y) >= minus->radius*3) return true; if (abs(thing->z - minus->z) > minus->height) return true; P_SetTarget(&minus->tracer, thing); - minus->tracer->flags &= ~MF_PUSHABLE; + P_SetTarget(&thing->tracer, minus); + if (thing->flags & MF_PUSHABLE) + { + minus->flags2 |= MF2_STRONGBOX; + thing->flags &= ~MF_PUSHABLE; + } return true; } @@ -5276,7 +5284,15 @@ void A_MinusDigging(mobj_t *actor) if (P_TryMove(actor->tracer, actor->x, actor->y, false)) actor->tracer->z = mz; else + { + if (actor->flags2 & MF2_STRONGBOX) + { + actor->flags2 &= ~MF2_STRONGBOX; + actor->tracer->flags |= MF_PUSHABLE; + } + P_SetTarget(&actor->tracer->tracer, NULL); P_SetTarget(&actor->tracer, NULL); + } } } @@ -13096,6 +13112,13 @@ void A_TNTExplode(mobj_t *actor) if (LUA_CallAction("A_TNTExplode", actor)) return; #endif + + if (actor->tracer) + { + P_SetTarget(&actor->tracer->tracer, NULL); + P_SetTarget(&actor->tracer, NULL); + } + P_UnsetThingPosition(actor); if (sector_list) { diff --git a/src/p_inter.c b/src/p_inter.c index bdf88ff44..8b4629e2e 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2631,6 +2631,19 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget P_KillMobj(target->target, target, source, 0); break; + case MT_MINUS: + if (target->tracer) + { + if (target->flags2 & MF2_STRONGBOX) + { + target->flags2 &= ~MF2_STRONGBOX; + target->tracer->flags |= MF_PUSHABLE; + } + P_SetTarget(&target->tracer->tracer, NULL); + P_SetTarget(&target->tracer, NULL); + } + break; + case MT_PLAYER: { target->fuse = TICRATE*3; // timer before mobj disappears from view (even if not an actual player)