Adapt linedef type 412 to UDMF

This commit is contained in:
MascaraSnake 2021-09-21 15:31:53 +02:00
parent 132f3f21f1
commit 61e9adf30b
4 changed files with 72 additions and 17 deletions

View file

@ -2944,6 +2944,41 @@ udmf
{ {
title = "Linedef Executor (player/object)"; title = "Linedef Executor (player/object)";
412
{
title = "Teleporter";
prefix = "(412)";
arg0
{
title = "Destination tag";
type = 14;
}
arg1
{
title = "Flags";
type = 12;
enum
{
1 = "Silent";
2 = "Keep angle";
4 = "Keep momentum";
8 = "Relative silent";
}
}
arg2
{
title = "X offset";
}
arg3
{
title = "Y offset";
}
arg4
{
title = "Z offset";
}
}
425 425
{ {
title = "Change Object State"; title = "Change Object State";

View file

@ -3747,6 +3747,20 @@ static void P_ConvertBinaryMap(void)
case 411: //Stop plane movement case 411: //Stop plane movement
lines[i].args[0] = tag; lines[i].args[0] = tag;
break; break;
case 412: //Teleporter
lines[i].args[0] = tag;
if (lines[i].flags & ML_BLOCKMONSTERS)
lines[i].args[1] |= TMT_SILENT;
if (lines[i].flags & ML_NOCLIMB)
lines[i].args[1] |= TMT_KEEPANGLE;
if (lines[i].flags & ML_EFFECT4)
lines[i].args[1] |= TMT_KEEPMOMENTUM;
if (lines[i].flags & ML_EFFECT3)
lines[i].args[1] |= TMT_RELATIVE;
lines[i].args[2] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS;
lines[i].args[3] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS;
lines[i].args[4] = lines[i].frontsector->ceilingheight >> FRACBITS;
break;
case 414: //Play sound effect case 414: //Play sound effect
lines[i].args[2] = tag; lines[i].args[2] = tag;
if (tag != 0) if (tag != 0)

View file

@ -2238,7 +2238,6 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
{ {
INT32 secnum = -1; INT32 secnum = -1;
mobj_t *bot = NULL; mobj_t *bot = NULL;
mtag_t tag = Tag_FGet(&line->tags);
I_Assert(!mo || !P_MobjWasRemoved(mo)); // If mo is there, mo must be valid! I_Assert(!mo || !P_MobjWasRemoved(mo)); // If mo is there, mo must be valid!
@ -2403,13 +2402,13 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
if (!mo) // nothing to teleport if (!mo) // nothing to teleport
return; return;
if (line->flags & ML_EFFECT3) // Relative silent teleport if (line->args[1] & TMT_RELATIVE) // Relative silent teleport
{ {
fixed_t x, y, z; fixed_t x, y, z;
x = sides[line->sidenum[0]].textureoffset; x = line->args[2] << FRACBITS;
y = sides[line->sidenum[0]].rowoffset; y = line->args[3] << FRACBITS;
z = line->frontsector->ceilingheight; z = line->args[4] << FRACBITS;
P_UnsetThingPosition(mo); P_UnsetThingPosition(mo);
mo->x += x; mo->x += x;
@ -2439,23 +2438,22 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
} }
else else
{ {
if ((secnum = Tag_Iterate_Sectors(tag, 0)) < 0) angle_t angle;
return; boolean silent, keepmomentum;
dest = P_GetObjectTypeInSectorNum(MT_TELEPORTMAN, secnum); dest = P_FindObjectTypeFromTag(MT_TELEPORTMAN, line->args[0]);
if (!dest) if (!dest)
return; return;
angle = (line->args[1] & TMT_KEEPANGLE) ? mo->angle : dest->angle;
silent = !!(line->args[1] & TMT_SILENT);
keepmomentum = !!(line->args[1] & TMT_KEEPMOMENTUM);
if (bot) if (bot)
P_Teleport(bot, dest->x, dest->y, dest->z, (line->flags & ML_NOCLIMB) ? mo->angle : dest->angle, (line->flags & ML_BLOCKMONSTERS) == 0, (line->flags & ML_EFFECT4) == ML_EFFECT4); P_Teleport(bot, dest->x, dest->y, dest->z, angle, !silent, keepmomentum);
if (line->flags & ML_BLOCKMONSTERS) P_Teleport(mo, dest->x, dest->y, dest->z, angle, !silent, keepmomentum);
P_Teleport(mo, dest->x, dest->y, dest->z, (line->flags & ML_NOCLIMB) ? mo->angle : dest->angle, false, (line->flags & ML_EFFECT4) == ML_EFFECT4); if (!silent)
else S_StartSound(dest, sfx_mixup); // Play the 'bowrwoosh!' sound
{
P_Teleport(mo, dest->x, dest->y, dest->z, (line->flags & ML_NOCLIMB) ? mo->angle : dest->angle, true, (line->flags & ML_EFFECT4) == ML_EFFECT4);
// Play the 'bowrwoosh!' sound
S_StartSound(dest, sfx_mixup);
}
} }
} }
break; break;

View file

@ -119,6 +119,14 @@ typedef enum
TMT_REPLACEFIRST = 2, TMT_REPLACEFIRST = 2,
} textmaptagoptions_t; } textmaptagoptions_t;
typedef enum
{
TMT_SILENT = 1,
TMT_KEEPANGLE = 1<<1,
TMT_KEEPMOMENTUM = 1<<2,
TMT_RELATIVE = 1<<3,
} textmapteleportflags_t;
typedef enum typedef enum
{ {
TMSS_TRIGGERMOBJ = 0, TMSS_TRIGGERMOBJ = 0,