mirror of
https://git.do.srb2.org/STJr/UltimateZoneBuilder.git
synced 2024-12-01 16:12:33 +00:00
5b2b149b40
Improved UDBScript to version 5: - Added Plane class - Added BlockMap, BlockEntry, and BlackMapQueryResult classes - Sector class - Added getLabelPositions method to get the position of sector labels (where tags, effects etc. are displayed) - Added support for JavaScript BigInt for UDMF fields. This means it's not necessary anymore to use UniValue to assign integers to new UDMF fields. Instead it can be done like this: sector.fields.my_int_field = 1n; - Added type information file (udbscript.d.ts)
85 lines
No EOL
2.6 KiB
JavaScript
85 lines
No EOL
2.6 KiB
JavaScript
/// <reference path="../../../udbscript.d.ts" />
|
|
|
|
`#version 4`;
|
|
|
|
`#name Create Line Portal`;
|
|
|
|
`#description Creates a quick portal (line action 301) between the selected lines. Only works in UDMF. Only works when exactly two lines are selected. Both lines must have exactly the same length. Draws a sector at the back of the selected lines.`;
|
|
|
|
`#scriptoptions
|
|
|
|
depth
|
|
{
|
|
description = "Depth of space behind portal";
|
|
default = 64;
|
|
type = 0; // Integer
|
|
}
|
|
|
|
texture
|
|
{
|
|
description = "Filler texture";
|
|
default = "FIREBLU1";
|
|
type = 6; // Texture
|
|
}
|
|
`;
|
|
|
|
// Function to draw the space behind the portal line
|
|
function drawPortalSector(line, depth)
|
|
{
|
|
// The origin is the bottom left point of the rectanble
|
|
let origin = line.v1;
|
|
|
|
// The base points of the rectangle. There are five because
|
|
// the first and last point need to be at the same position
|
|
// to get a complete drawing
|
|
let points = [
|
|
new UDB.Vector2D(0, 0),
|
|
new UDB.Vector2D(0, depth),
|
|
new UDB.Vector2D(line.getLength(), depth),
|
|
new UDB.Vector2D(line.getLength(), 0),
|
|
new UDB.Vector2D(0, 0)
|
|
];
|
|
|
|
// The points need to be rotated by the line's angle and moved
|
|
// by the origin's position
|
|
for(let i=0; i < points.length; i++)
|
|
{
|
|
let v = points[i].getRotated(line.getAngle() - 90);
|
|
points[i] = origin + v;
|
|
}
|
|
|
|
// Draw the lines
|
|
if(!UDB.Map.drawLines(points))
|
|
throw 'Failed drawing space behind line ' + line;
|
|
|
|
// Set the front middle texture for the new 1-sided linedefs
|
|
UDB.Map.getMarkedLinedefs().filter(ld => ld.back == null).forEach(ld => ld.front.middleTexture = UDB.ScriptOptions.texture)
|
|
}
|
|
|
|
// The line action for portals only works in UDMF (GZDoom and Eternity Engine)
|
|
if(!UDB.Map.isUDMF)
|
|
throw 'This script only works in UDMF maps';
|
|
|
|
// Get selected linedefs
|
|
let lines = UDB.Map.getSelectedLinedefs();
|
|
|
|
// Make sure exactly two lines are selected
|
|
if(lines.length != 2)
|
|
throw 'You need to select exactly two lines';
|
|
|
|
// Both lines have to have the same length, otherwise the portal will
|
|
// be broken
|
|
if(lines[0].line.getLength() != lines[1].line.getLength())
|
|
throw 'Both lines need to have the same length';
|
|
|
|
// Get a new tag to use for the portal
|
|
let newtag = UDB.Map.getNewTag();
|
|
|
|
// Set the action, arg, and tag of both lines
|
|
lines[0].action = lines[1].action = 301; // Line_QuickPortal
|
|
lines[0].args[0] = lines[1].args[0] = 0;
|
|
lines[0].tag = lines[1].tag = newtag;
|
|
|
|
// Draw the sectors behind the portal
|
|
drawPortalSector(lines[0].line, UDB.ScriptOptions.depth);
|
|
drawPortalSector(lines[1].line, UDB.ScriptOptions.depth); |