- exported ADecal to ZScript as a non-native class.

Its one function is still native but this was by far the easiest of the remaining actor classes to export.
This commit is contained in:
Christoph Oelckers 2018-11-19 17:54:38 +01:00
parent e90ed0a01c
commit a5ee673c91
2 changed files with 20 additions and 21 deletions

View file

@ -43,6 +43,7 @@
#include "serializer.h" #include "serializer.h"
#include "doomdata.h" #include "doomdata.h"
#include "g_levellocals.h" #include "g_levellocals.h"
#include "vm.h"
static double DecalWidth, DecalLeft, DecalRight; static double DecalWidth, DecalLeft, DecalRight;
static double SpreadZ; static double SpreadZ;
@ -753,29 +754,20 @@ DBaseDecal *ShootDecal(const FDecalTemplate *tpl, AActor *basisactor, sector_t *
return NULL; return NULL;
} }
class ADecal : public AActor DEFINE_ACTION_FUNCTION(ADecal, SpawnDecal)
{ {
DECLARE_CLASS (ADecal, AActor); PARAM_SELF_PROLOGUE(AActor);
public:
void BeginPlay ();
};
IMPLEMENT_CLASS(ADecal, false, false)
void ADecal::BeginPlay ()
{
const FDecalTemplate *tpl = nullptr; const FDecalTemplate *tpl = nullptr;
Super::BeginPlay (); if (self->args[0] < 0)
if (args[0] < 0)
{ {
FName name = ENamedName(-args[0]); FName name = ENamedName(-self->args[0]);
tpl = DecalLibrary.GetDecalByName(name.GetChars()); tpl = DecalLibrary.GetDecalByName(name.GetChars());
} }
else else
{ {
int decalid = args[0] + (args[1] << 8); // [KS] High byte for decals. int decalid = self->args[0] + (self->args[1] << 8); // [KS] High byte for decals.
tpl = DecalLibrary.GetDecalByNum(decalid); tpl = DecalLibrary.GetDecalByNum(decalid);
} }
@ -784,23 +776,22 @@ void ADecal::BeginPlay ()
{ {
if (!tpl->PicNum.Exists()) if (!tpl->PicNum.Exists())
{ {
Printf("Decal actor at (%f,%f) does not have a valid texture\n", X(), Y()); Printf("Decal actor at (%f,%f) does not have a valid texture\n", self->X(), self->Y());
} }
else else
{ {
// Look for a wall within 64 units behind the actor. If none can be // Look for a wall within 64 units behind the actor. If none can be
// found, then no decal is created, and this actor is destroyed // found, then no decal is created, and this actor is destroyed
// without effectively doing anything. // without effectively doing anything.
if (NULL == ShootDecal(tpl, this, Sector, X(), Y(), Z(), Angles.Yaw + 180, 64., true)) if (NULL == ShootDecal(tpl, self, self->Sector, self->X(), self->Y(), self->Z(), self->Angles.Yaw + 180, 64., true))
{ {
DPrintf (DMSG_WARNING, "Could not find a wall to stick decal to at (%f,%f)\n", X(), Y()); DPrintf (DMSG_WARNING, "Could not find a wall to stick decal to at (%f,%f)\n", self->X(), self->Y());
} }
} }
} }
else else
{ {
DPrintf (DMSG_ERROR, "Decal actor at (%f,%f) does not have a good template\n", X(), Y()); DPrintf (DMSG_ERROR, "Decal actor at (%f,%f) does not have a good template\n", self->X(), self->Y());
} }
// This actor doesn't need to stick around anymore. return 0;
Destroy();
} }

View file

@ -1,3 +1,11 @@
class Decal : Actor native class Decal : Actor
{ {
native void SpawnDecal();
override void BeginPlay()
{
Super.BeginPlay();
SpawnDecal();
Destroy();
}
} }