Fix various minus carrying bugs

This commit is contained in:
MascaraSnake 2019-09-30 20:35:47 +02:00
parent dbbb805e92
commit e75dee7747
2 changed files with 39 additions and 3 deletions

View file

@ -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)
{

View file

@ -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)