diff --git a/src/p_maputl.cpp b/src/p_maputl.cpp index ec8ae181b..7f97adeac 100644 --- a/src/p_maputl.cpp +++ b/src/p_maputl.cpp @@ -896,6 +896,74 @@ void FMultiBlockLinesIterator::Reset() startIteratorForGroup(basegroup); } +//=========================================================================== +// +// and the scriptable version +// +//=========================================================================== + +class DBlockLinesIterator : public DObject, public FMultiBlockLinesIterator +{ + DECLARE_ABSTRACT_CLASS(DBlockLinesIterator, DObject); + FPortalGroupArray check; + +public: + FMultiBlockLinesIterator::CheckResult cres; + + bool Next() + { + return FMultiBlockLinesIterator::Next(&cres); + } + + DBlockLinesIterator(AActor *actor, double checkradius) + : FMultiBlockLinesIterator(check, actor, checkradius) + { + cres.line = nullptr; + cres.Position.Zero(); + cres.portalflags = 0; + } + + DBlockLinesIterator(double x, double y, double z, double height, double radius, sector_t *sec) + :FMultiBlockLinesIterator(check, x, y, z, height, radius, sec) + { + cres.line = nullptr; + cres.Position.Zero(); + cres.portalflags = 0; + } +}; + +IMPLEMENT_CLASS(DBlockLinesIterator, true, false); + +DEFINE_ACTION_FUNCTION(DBlockLinesIterator, Create) +{ + PARAM_PROLOGUE; + PARAM_OBJECT_NOT_NULL(origin, AActor); + PARAM_FLOAT_DEF(radius); + ACTION_RETURN_OBJECT(new DBlockLinesIterator(origin, radius)); +} + +DEFINE_ACTION_FUNCTION(DBlockLinesIterator, CreateFromPos) +{ + PARAM_PROLOGUE; + PARAM_FLOAT(x); + PARAM_FLOAT(y); + PARAM_FLOAT(z); + PARAM_FLOAT(h); + PARAM_FLOAT(radius); + PARAM_POINTER_DEF(sec, sector_t); + ACTION_RETURN_OBJECT(new DBlockLinesIterator(x, y, z, h, radius, sec)); +} + +DEFINE_ACTION_FUNCTION(DBlockThingsIterator, Next) +{ + PARAM_SELF_PROLOGUE(DBlockLinesIterator); + ACTION_RETURN_BOOL(self->Next()); +} + +DEFINE_FIELD_NAMED(DBlockLinesIterator, cres.line, curline); +DEFINE_FIELD_NAMED(DBlockLinesIterator, cres.Position, position); +DEFINE_FIELD_NAMED(DBlockLinesIterator, cres.portalflags, portalflags); + //=========================================================================== // // FBlockThingsIterator :: FBlockThingsIterator @@ -1231,9 +1299,9 @@ DEFINE_ACTION_FUNCTION(DBlockThingsIterator, CreateFromPos) ACTION_RETURN_OBJECT(new DBlockThingsIterator(x, y, z, h, radius, ignore, nullptr)); } -DEFINE_ACTION_FUNCTION(DBlockThingsIterator, Next) +DEFINE_ACTION_FUNCTION(DBlockLinesIterator, Next) { - PARAM_SELF_PROLOGUE(DBlockThingsIterator); + PARAM_SELF_PROLOGUE(DBlockLinesIterator); ACTION_RETURN_BOOL(self->Next()); } diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.txt index ab0760e12..d8cae2ec9 100644 --- a/wadsrc/static/zscript/base.txt +++ b/wadsrc/static/zscript/base.txt @@ -357,6 +357,18 @@ class BlockThingsIterator : Object native native bool Next(); } +class BlockLinesIterator : Object native +{ + native Line CurLine; + native Vector3 position; + native int portalflags; + + native static BlockThingsIterator Create(Actor origin, double checkradius = -1); + native static BlockThingsIterator CreateFromPos(Vector3 pos, double checkh, double checkradius, Sector sec = nullptr; + native bool Next(); +} + + struct DropItem native { native readonly DropItem Next;