diff --git a/src/thingdef/thingdef_codeptr.cpp b/src/thingdef/thingdef_codeptr.cpp index 1e15a5c33..9a8e02468 100644 --- a/src/thingdef/thingdef_codeptr.cpp +++ b/src/thingdef/thingdef_codeptr.cpp @@ -250,6 +250,41 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, CountInv) return 0; } +//========================================================================== +// +// GetDistance +// +// NON-ACTION function to get the distance in double. +// +//========================================================================== +DEFINE_ACTION_FUNCTION_PARAMS(AActor, GetDistance) +{ + if (numret > 0) + { + assert(ret != NULL); + PARAM_PROLOGUE; + PARAM_OBJECT(self, AActor); + PARAM_BOOL(checkz); + PARAM_INT_OPT(ptr) { ptr = AAPTR_TARGET; } + + AActor *target = COPY_AAPTR(self, ptr); + + if (!target || target == self) + { + ret->SetFloat(false); + } + else + { + fixedvec3 diff = self->Vec3To(target); + diff.z += (target->height - self->height) / 2; + const double lengthsquared = TVector3(diff.x, diff.y, diff.z).LengthSquared(); + ret->SetFloat(lengthsquared); + } + return 1; + } + return 0; +} + //========================================================================== // // A_RearrangePointers diff --git a/wadsrc/static/actors/actor.txt b/wadsrc/static/actors/actor.txt index 8e30693cf..48ee9f68f 100644 --- a/wadsrc/static/actors/actor.txt +++ b/wadsrc/static/actors/actor.txt @@ -41,6 +41,7 @@ ACTOR Actor native //: Thinker native bool CheckClass(class checkclass, int ptr_select = AAPTR_DEFAULT, bool match_superclass = false); native bool IsPointerEqual(int ptr_select1, int ptr_select2); native int CountInv(class itemtype, int ptr_select = AAPTR_DEFAULT); + native float GetDistance(bool checkz, int ptr = AAPTR_DEFAULT); // Action functions // Meh, MBF redundant functions. Only for DeHackEd support.