Fix A_ConnectToGround's handling of scaled mobjs

This commit is contained in:
Zwip-Zwap Zapony 2023-06-24 19:35:57 +02:00
parent e88b3542c7
commit b405f50caa

View file

@ -12583,8 +12583,7 @@ void A_MineRange(mobj_t *actor)
void A_ConnectToGround(mobj_t *actor) void A_ConnectToGround(mobj_t *actor)
{ {
mobj_t *work; mobj_t *work;
fixed_t workz; fixed_t endz;
fixed_t workh;
angle_t ang; angle_t ang;
INT32 locvar1 = var1; INT32 locvar1 = var1;
INT32 locvar2 = var2; INT32 locvar2 = var2;
@ -12595,38 +12594,42 @@ void A_ConnectToGround(mobj_t *actor)
if (actor->subsector->sector->ffloors) if (actor->subsector->sector->ffloors)
P_AdjustMobjFloorZ_FFloors(actor, actor->subsector->sector, 2); P_AdjustMobjFloorZ_FFloors(actor, actor->subsector->sector, 2);
endz = actor->z;
if (actor->flags2 & MF2_OBJECTFLIP) if (actor->flags2 & MF2_OBJECTFLIP)
workz = (actor->z + actor->height) - actor->ceilingz; actor->z = actor->ceilingz - actor->height; // Ensures perfect ceiling connection
else else
workz = actor->floorz - actor->z; actor->z = actor->floorz; // Ensures perfect floor connection
if (locvar2) if (locvar2)
{ {
workh = FixedMul(mobjinfo[locvar2].height, actor->scale); work = P_SpawnMobjFromMobj(actor, 0, 0, 0, locvar2);
if (actor->flags2 & MF2_OBJECTFLIP) if (work)
workz += workh; work->old_z = work->z; // Don't copy old_z from the actor
work = P_SpawnMobjFromMobj(actor, 0, 0, workz, locvar2);
workz += workh; actor->z += P_MobjFlip(actor) * FixedMul(mobjinfo[locvar2].height, actor->scale);
} }
if (!locvar1) if (!locvar1 || !mobjinfo[locvar1].height) // Can't tile the middle object?
return; {
actor->z = endz;
if (!(workh = FixedMul(mobjinfo[locvar1].height, actor->scale)))
return; return;
}
ang = actor->angle + ANGLE_45; ang = actor->angle + ANGLE_45;
while (workz < 0) while ((actor->flags2 & MF2_OBJECTFLIP) ? (actor->z > endz) : (actor->z < endz))
{ {
work = P_SpawnMobjFromMobj(actor, 0, 0, workz, locvar1); work = P_SpawnMobjFromMobj(actor, 0, 0, 0, locvar1);
if (work) if (work)
work->angle = ang; {
ang += ANGLE_90; work->angle = work->old_angle = ang;
workz += workh; work->old_z = work->z; // Don't copy old_z from the actor
} }
if (workz != 0) ang += ANGLE_90;
actor->z += P_MobjFlip(actor)*workz; actor->z += P_MobjFlip(actor) * FixedMul(mobjinfo[locvar1].height, actor->scale);
}
actor->old_z = actor->z; // Reset Z interpolation - the spawned objects intentionally don't have any Z interpolation either, after all
} }
// Function: A_SpawnParticleRelative // Function: A_SpawnParticleRelative