From e75dee77479646372040f755d5c06f320055c563 Mon Sep 17 00:00:00 2001
From: MascaraSnake <jonassauer27@gmail.com>
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 f61f2a09b7..0343c8bf60 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 bdf88ff44a..8b4629e2e8 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)
-- 
GitLab