mirror of
https://github.com/ZDoom/qzdoom.git
synced 2025-02-02 05:41:49 +00:00
- did some cleanup on p_mobj.cpp
* deleting some unused code * turned several class methods into static local functions in cases where they never were used outside this file. * inlined the dangerous assignment operator in the only place where it was used.
This commit is contained in:
parent
b8821eb6da
commit
72aa6fe3b8
5 changed files with 110 additions and 164 deletions
|
@ -515,5 +515,4 @@ void *DObject::ScriptVar(FName field, PType *type)
|
||||||
}
|
}
|
||||||
// This is only for internal use so I_Error is fine.
|
// This is only for internal use so I_Error is fine.
|
||||||
I_Error("Variable %s not found in %s\n", field.GetChars(), cls->TypeName.GetChars());
|
I_Error("Variable %s not found in %s\n", field.GetChars(), cls->TypeName.GetChars());
|
||||||
return nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -741,8 +741,8 @@ class AActor final : public DThinker
|
||||||
public:
|
public:
|
||||||
AActor() = default;
|
AActor() = default;
|
||||||
AActor(const AActor &other) = delete; // Calling this would be disastrous.
|
AActor(const AActor &other) = delete; // Calling this would be disastrous.
|
||||||
AActor &operator= (const AActor &other);
|
AActor &operator= (const AActor &other) = delete;
|
||||||
~AActor ();
|
~AActor () = default;
|
||||||
|
|
||||||
virtual void OnDestroy() override;
|
virtual void OnDestroy() override;
|
||||||
virtual void Serialize(FSerializer &arc) override;
|
virtual void Serialize(FSerializer &arc) override;
|
||||||
|
@ -807,7 +807,6 @@ public:
|
||||||
bool CallSlam(AActor *victim);
|
bool CallSlam(AActor *victim);
|
||||||
|
|
||||||
// Something just touched this actor.
|
// Something just touched this actor.
|
||||||
virtual void Touch(AActor *toucher);
|
|
||||||
void CallTouch(AActor *toucher);
|
void CallTouch(AActor *toucher);
|
||||||
|
|
||||||
// Apply gravity and/or make actor sink in water.
|
// Apply gravity and/or make actor sink in water.
|
||||||
|
@ -848,9 +847,6 @@ public:
|
||||||
// Tosses an item out of the inventory.
|
// Tosses an item out of the inventory.
|
||||||
AActor *DropInventory (AActor *item, int amt = -1);
|
AActor *DropInventory (AActor *item, int amt = -1);
|
||||||
|
|
||||||
// Removes all items from the inventory.
|
|
||||||
void ClearInventory();
|
|
||||||
|
|
||||||
// Returns true if this view is considered "local" for the player.
|
// Returns true if this view is considered "local" for the player.
|
||||||
bool CheckLocalView() const;
|
bool CheckLocalView() const;
|
||||||
|
|
||||||
|
@ -865,9 +861,6 @@ public:
|
||||||
// Adds one item of a particular type. Returns NULL if it could not be added.
|
// Adds one item of a particular type. Returns NULL if it could not be added.
|
||||||
AActor *GiveInventoryType (PClassActor *type);
|
AActor *GiveInventoryType (PClassActor *type);
|
||||||
|
|
||||||
// Destroys all the inventory the actor is holding.
|
|
||||||
void DestroyAllInventory ();
|
|
||||||
|
|
||||||
// Set the alphacolor field properly
|
// Set the alphacolor field properly
|
||||||
void SetShade (uint32_t rgb);
|
void SetShade (uint32_t rgb);
|
||||||
void SetShade (int r, int g, int b);
|
void SetShade (int r, int g, int b);
|
||||||
|
@ -885,7 +878,6 @@ public:
|
||||||
bool Massacre ();
|
bool Massacre ();
|
||||||
|
|
||||||
// Transforms the actor into a finely-ground paste
|
// Transforms the actor into a finely-ground paste
|
||||||
bool Grind(bool items);
|
|
||||||
bool CallGrind(bool items);
|
bool CallGrind(bool items);
|
||||||
|
|
||||||
// Get this actor's team
|
// Get this actor's team
|
||||||
|
@ -1321,11 +1313,9 @@ public:
|
||||||
void UnlinkFromWorld(FLinkContext *ctx);
|
void UnlinkFromWorld(FLinkContext *ctx);
|
||||||
void AdjustFloorClip ();
|
void AdjustFloorClip ();
|
||||||
bool IsMapActor();
|
bool IsMapActor();
|
||||||
int GetTics(FState * newstate);
|
|
||||||
bool SetState (FState *newstate, bool nofunction=false);
|
bool SetState (FState *newstate, bool nofunction=false);
|
||||||
double UpdateWaterDepth(bool splash);
|
void SplashCheck();
|
||||||
virtual void SplashCheck();
|
bool UpdateWaterLevel (bool splash=true);
|
||||||
virtual bool UpdateWaterLevel (bool splash=true);
|
|
||||||
bool isFast();
|
bool isFast();
|
||||||
bool isSlow();
|
bool isSlow();
|
||||||
void SetIdle(bool nofunction=false);
|
void SetIdle(bool nofunction=false);
|
||||||
|
@ -1558,7 +1548,6 @@ public:
|
||||||
|
|
||||||
bool hasmodel;
|
bool hasmodel;
|
||||||
|
|
||||||
void PlayerLandedMakeGruntSound(AActor* onmobj);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class FActorIterator
|
class FActorIterator
|
||||||
|
|
|
@ -178,21 +178,12 @@ IMPLEMENT_POINTERS_START(AActor)
|
||||||
IMPLEMENT_POINTER(boneComponentData)
|
IMPLEMENT_POINTER(boneComponentData)
|
||||||
IMPLEMENT_POINTERS_END
|
IMPLEMENT_POINTERS_END
|
||||||
|
|
||||||
AActor::~AActor ()
|
|
||||||
{
|
|
||||||
// Please avoid calling the destructor directly (or through delete)!
|
|
||||||
// Use Destroy() instead.
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// AActor :: Serialize
|
// AActor :: Serialize
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define A(a,b) ((a), (b), def->b)
|
#define A(a,b) ((a), (b), def->b)
|
||||||
|
|
||||||
void AActor::Serialize(FSerializer &arc)
|
void AActor::Serialize(FSerializer &arc)
|
||||||
|
@ -421,13 +412,6 @@ void AActor::PostSerialize()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
AActor &AActor::operator= (const AActor &other)
|
|
||||||
{
|
|
||||||
memcpy (&snext, &other.snext, (uint8_t *)&this[1] - (uint8_t *)&snext);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// AActor::InStateSequence
|
// AActor::InStateSequence
|
||||||
|
@ -484,14 +468,14 @@ bool AActor::IsMapActor()
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
int AActor::GetTics(FState * newstate)
|
inline int GetTics(AActor* actor, FState * newstate)
|
||||||
{
|
{
|
||||||
int tics = newstate->GetTics();
|
int tics = newstate->GetTics();
|
||||||
if (isFast() && newstate->GetFast())
|
if (actor->isFast() && newstate->GetFast())
|
||||||
{
|
{
|
||||||
return tics - (tics>>1);
|
return tics - (tics>>1);
|
||||||
}
|
}
|
||||||
else if (isSlow() && newstate->GetSlow())
|
else if (actor->isSlow() && newstate->GetSlow())
|
||||||
{
|
{
|
||||||
return tics<<1;
|
return tics<<1;
|
||||||
}
|
}
|
||||||
|
@ -538,7 +522,7 @@ bool AActor::SetState (FState *newstate, bool nofunction)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
state = newstate;
|
state = newstate;
|
||||||
tics = GetTics(newstate);
|
tics = GetTics(this, newstate);
|
||||||
renderflags = (renderflags & ~RF_FULLBRIGHT) | ActorRenderFlags::FromInt (newstate->GetFullbright());
|
renderflags = (renderflags & ~RF_FULLBRIGHT) | ActorRenderFlags::FromInt (newstate->GetFullbright());
|
||||||
newsprite = newstate->sprite;
|
newsprite = newstate->sprite;
|
||||||
if (newsprite != SPR_FIXED)
|
if (newsprite != SPR_FIXED)
|
||||||
|
@ -616,13 +600,14 @@ DEFINE_ACTION_FUNCTION(AActor, SetState)
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
//
|
//
|
||||||
// AActor :: DestroyAllInventory
|
// DestroyAllInventory
|
||||||
|
// Destroys all the inventory the actor is holding.
|
||||||
//
|
//
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
void AActor::DestroyAllInventory ()
|
static void DestroyAllInventory(AActor* actor)
|
||||||
{
|
{
|
||||||
AActor *inv = Inventory;
|
AActor *inv = PARAM_NULLCHECK(actor, self)->Inventory;
|
||||||
if (inv != nullptr)
|
if (inv != nullptr)
|
||||||
{
|
{
|
||||||
TArray<AActor *> toDelete;
|
TArray<AActor *> toDelete;
|
||||||
|
@ -649,10 +634,10 @@ void AActor::DestroyAllInventory ()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_ACTION_FUNCTION(AActor, DestroyAllInventory)
|
DEFINE_ACTION_FUNCTION_NATIVE(AActor, DestroyAllInventory, DestroyAllInventory)
|
||||||
{
|
{
|
||||||
PARAM_SELF_PROLOGUE(AActor);
|
PARAM_SELF_PROLOGUE(AActor);
|
||||||
self->DestroyAllInventory();
|
DestroyAllInventory(self);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
@ -774,23 +759,6 @@ DEFINE_ACTION_FUNCTION(AActor, GiveInventoryType)
|
||||||
ACTION_RETURN_OBJECT(self->GiveInventoryType(type));
|
ACTION_RETURN_OBJECT(self->GiveInventoryType(type));
|
||||||
}
|
}
|
||||||
|
|
||||||
//============================================================================
|
|
||||||
//
|
|
||||||
// AActor :: ClearInventory
|
|
||||||
//
|
|
||||||
// Clears the inventory of a single actor.
|
|
||||||
//
|
|
||||||
//============================================================================
|
|
||||||
|
|
||||||
void AActor::ClearInventory()
|
|
||||||
{
|
|
||||||
IFVIRTUAL(AActor, ClearInventory)
|
|
||||||
{
|
|
||||||
VMValue params[] = { this };
|
|
||||||
VMCall(func, params, 1, nullptr, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
//
|
//
|
||||||
// AActor :: CopyFriendliness
|
// AActor :: CopyFriendliness
|
||||||
|
@ -1142,18 +1110,6 @@ void AActor::ConversationAnimation (int animnum)
|
||||||
//
|
//
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
void AActor::Touch (AActor *toucher)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
DEFINE_ACTION_FUNCTION(AActor, Touch)
|
|
||||||
{
|
|
||||||
PARAM_SELF_PROLOGUE(AActor);
|
|
||||||
PARAM_OBJECT_NOT_NULL(toucher, AActor);
|
|
||||||
self->Touch(toucher);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AActor::CallTouch(AActor *toucher)
|
void AActor::CallTouch(AActor *toucher)
|
||||||
{
|
{
|
||||||
IFVIRTUAL(AActor, Touch)
|
IFVIRTUAL(AActor, Touch)
|
||||||
|
@ -1161,7 +1117,6 @@ void AActor::CallTouch(AActor *toucher)
|
||||||
VMValue params[2] = { (DObject*)this, toucher };
|
VMValue params[2] = { (DObject*)this, toucher };
|
||||||
VMCall(func, params, 2, nullptr, 0);
|
VMCall(func, params, 2, nullptr, 0);
|
||||||
}
|
}
|
||||||
else Touch(toucher);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
@ -1174,21 +1129,22 @@ void AActor::CallTouch(AActor *toucher)
|
||||||
// Bool items is true if it should destroy() dropped items, false otherwise.
|
// Bool items is true if it should destroy() dropped items, false otherwise.
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
bool AActor::Grind(bool items)
|
static int Grind(AActor* actor, int items)
|
||||||
{
|
{
|
||||||
|
PARAM_NULLCHECK(actor, actor);
|
||||||
// crunch bodies to giblets
|
// crunch bodies to giblets
|
||||||
if ((flags & MF_CORPSE) && !(flags3 & MF3_DONTGIB) && (health <= 0))
|
if ((actor->flags & MF_CORPSE) && !(actor->flags3 & MF3_DONTGIB) && (actor->health <= 0))
|
||||||
{
|
{
|
||||||
FState * state = FindState(NAME_Crush);
|
FState * state = actor->FindState(NAME_Crush);
|
||||||
|
|
||||||
// In Heretic and Chex Quest we don't change the actor's sprite, just its size.
|
// In Heretic and Chex Quest we don't change the actor's sprite, just its size.
|
||||||
if (state == NULL && gameinfo.dontcrunchcorpses)
|
if (state == NULL && gameinfo.dontcrunchcorpses)
|
||||||
{
|
{
|
||||||
flags &= ~MF_SOLID;
|
actor->flags &= ~MF_SOLID;
|
||||||
flags3 |= MF3_DONTGIB;
|
actor->flags3 |= MF3_DONTGIB;
|
||||||
Height = 0;
|
actor->Height = 0;
|
||||||
radius = 0;
|
actor->radius = 0;
|
||||||
Vel.Zero();
|
actor->Vel.Zero();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1197,46 +1153,46 @@ bool AActor::Grind(bool items)
|
||||||
// The reason for the change was originally because of a problem with players,
|
// The reason for the change was originally because of a problem with players,
|
||||||
// see rh_log entry for February 21, 1999. Don't know if it is still relevant.
|
// see rh_log entry for February 21, 1999. Don't know if it is still relevant.
|
||||||
if (state == NULL // Only use the default crushed state if:
|
if (state == NULL // Only use the default crushed state if:
|
||||||
&& !(flags & MF_NOBLOOD) // 1. the monster bleeeds,
|
&& !(actor->flags & MF_NOBLOOD) // 1. the monster bleeeds,
|
||||||
&& player == NULL) // 3. and the thing isn't a player.
|
&& actor->player == NULL) // 3. and the thing isn't a player.
|
||||||
{
|
{
|
||||||
isgeneric = true;
|
isgeneric = true;
|
||||||
state = FindState(NAME_GenericCrush);
|
state = actor->FindState(NAME_GenericCrush);
|
||||||
if (state != NULL && (sprites[state->sprite].numframes <= 0))
|
if (state != NULL && (sprites[state->sprite].numframes <= 0))
|
||||||
state = NULL; // If one of these tests fails, do not use that state.
|
state = NULL; // If one of these tests fails, do not use that state.
|
||||||
}
|
}
|
||||||
if (state != NULL && !(flags & MF_ICECORPSE))
|
if (state != NULL && !(actor->flags & MF_ICECORPSE))
|
||||||
{
|
{
|
||||||
if (this->flags4 & MF4_BOSSDEATH)
|
if (actor->flags4 & MF4_BOSSDEATH)
|
||||||
{
|
{
|
||||||
A_BossDeath(this);
|
A_BossDeath(actor);
|
||||||
}
|
}
|
||||||
flags &= ~MF_SOLID;
|
actor->flags &= ~MF_SOLID;
|
||||||
flags3 |= MF3_DONTGIB;
|
actor->flags3 |= MF3_DONTGIB;
|
||||||
Height = 0;
|
actor->Height = 0;
|
||||||
radius = 0;
|
actor->radius = 0;
|
||||||
Vel.Zero();
|
actor->Vel.Zero();
|
||||||
SetState (state);
|
actor->SetState (state);
|
||||||
if (isgeneric) // Not a custom crush state, so colorize it appropriately.
|
if (isgeneric) // Not a custom crush state, so colorize it appropriately.
|
||||||
{
|
{
|
||||||
S_Sound (this, CHAN_BODY, 0, "misc/fallingsplat", 1, ATTN_IDLE);
|
S_Sound (actor, CHAN_BODY, 0, "misc/fallingsplat", 1, ATTN_IDLE);
|
||||||
Translation = BloodTranslation;
|
actor->Translation = actor->BloodTranslation;
|
||||||
}
|
}
|
||||||
Level->localEventManager->WorldThingGround(this, state);
|
actor->Level->localEventManager->WorldThingGround(actor, state);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!(flags & MF_NOBLOOD))
|
if (!(actor->flags & MF_NOBLOOD))
|
||||||
{
|
{
|
||||||
if (this->flags4 & MF4_BOSSDEATH)
|
if (actor->flags4 & MF4_BOSSDEATH)
|
||||||
{
|
{
|
||||||
A_BossDeath(this);
|
A_BossDeath(actor);
|
||||||
}
|
}
|
||||||
|
|
||||||
PClassActor *i = PClass::FindActor("RealGibs");
|
PClassActor *i = PClass::FindActor("RealGibs");
|
||||||
|
|
||||||
if (i != NULL)
|
if (i != NULL)
|
||||||
{
|
{
|
||||||
i = i->GetReplacement(Level);
|
i = i->GetReplacement(actor->Level);
|
||||||
|
|
||||||
const AActor *defaults = GetDefaultByType (i);
|
const AActor *defaults = GetDefaultByType (i);
|
||||||
if (defaults->SpawnState == NULL ||
|
if (defaults->SpawnState == NULL ||
|
||||||
|
@ -1248,69 +1204,69 @@ bool AActor::Grind(bool items)
|
||||||
if (i == NULL)
|
if (i == NULL)
|
||||||
{
|
{
|
||||||
// if there's no gib sprite don't crunch it.
|
// if there's no gib sprite don't crunch it.
|
||||||
flags &= ~MF_SOLID;
|
actor->flags &= ~MF_SOLID;
|
||||||
flags3 |= MF3_DONTGIB;
|
actor->flags3 |= MF3_DONTGIB;
|
||||||
Height = 0;
|
actor->Height = 0;
|
||||||
radius = 0;
|
actor->radius = 0;
|
||||||
Vel.Zero();
|
actor->Vel.Zero();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
AActor *gib = Spawn (Level, i, Pos(), ALLOW_REPLACE);
|
AActor *gib = Spawn (actor->Level, i, actor->Pos(), ALLOW_REPLACE);
|
||||||
if (gib != NULL)
|
if (gib != NULL)
|
||||||
{
|
{
|
||||||
gib->RenderStyle = RenderStyle;
|
gib->RenderStyle = actor->RenderStyle;
|
||||||
gib->Alpha = Alpha;
|
gib->Alpha = actor->Alpha;
|
||||||
gib->Height = 0;
|
gib->Height = 0;
|
||||||
gib->radius = 0;
|
gib->radius = 0;
|
||||||
gib->Translation = BloodTranslation;
|
gib->Translation = actor->BloodTranslation;
|
||||||
}
|
}
|
||||||
S_Sound (this, CHAN_BODY, 0, "misc/fallingsplat", 1, ATTN_IDLE);
|
S_Sound (actor, CHAN_BODY, 0, "misc/fallingsplat", 1, ATTN_IDLE);
|
||||||
Level->localEventManager->WorldThingGround(this, nullptr);
|
actor->Level->localEventManager->WorldThingGround(actor, nullptr);
|
||||||
}
|
}
|
||||||
if (flags & MF_ICECORPSE)
|
if (actor->flags & MF_ICECORPSE)
|
||||||
{
|
{
|
||||||
tics = 1;
|
actor->tics = 1;
|
||||||
Vel.Zero();
|
actor->Vel.Zero();
|
||||||
}
|
}
|
||||||
else if (player)
|
else if (actor->player)
|
||||||
{
|
{
|
||||||
flags |= MF_NOCLIP;
|
actor->flags |= MF_NOCLIP;
|
||||||
flags3 |= MF3_DONTGIB;
|
actor->flags3 |= MF3_DONTGIB;
|
||||||
renderflags |= RF_INVISIBLE;
|
actor->renderflags |= RF_INVISIBLE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Destroy ();
|
actor->Destroy ();
|
||||||
}
|
}
|
||||||
return false; // keep checking
|
return false; // keep checking
|
||||||
}
|
}
|
||||||
|
|
||||||
// killough 11/98: kill touchy things immediately
|
// killough 11/98: kill touchy things immediately
|
||||||
if (flags6 & MF6_TOUCHY && (flags6 & MF6_ARMED || IsSentient()))
|
if (actor->flags6 & MF6_TOUCHY && (actor->flags6 & MF6_ARMED || actor->IsSentient()))
|
||||||
{
|
{
|
||||||
flags6 &= ~MF6_ARMED; // Disarm
|
actor->flags6 &= ~MF6_ARMED; // Disarm
|
||||||
P_DamageMobj (this, NULL, NULL, health, NAME_Crush, DMG_FORCED); // kill object
|
P_DamageMobj (actor, NULL, NULL, actor->health, NAME_Crush, DMG_FORCED); // kill object
|
||||||
return true; // keep checking
|
return true; // keep checking
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(flags & MF_SOLID) || (flags & MF_NOCLIP))
|
if (!(actor->flags & MF_SOLID) || (actor->flags & MF_NOCLIP))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(flags & MF_SHOOTABLE))
|
if (!(actor->flags & MF_SHOOTABLE))
|
||||||
{
|
{
|
||||||
return false; // assume it is bloody gibs or something
|
return false; // assume it is bloody gibs or something
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_ACTION_FUNCTION(AActor, Grind)
|
DEFINE_ACTION_FUNCTION_NATIVE(AActor, Grind, Grind)
|
||||||
{
|
{
|
||||||
PARAM_SELF_PROLOGUE(AActor);
|
PARAM_SELF_PROLOGUE(AActor);
|
||||||
PARAM_BOOL(items);
|
PARAM_BOOL(items);
|
||||||
ACTION_RETURN_BOOL(self->Grind(items));
|
ACTION_RETURN_BOOL(Grind(self, items));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AActor::CallGrind(bool items)
|
bool AActor::CallGrind(bool items)
|
||||||
|
@ -1323,7 +1279,7 @@ bool AActor::CallGrind(bool items)
|
||||||
VMCall(func, params, 2, &ret, 1);
|
VMCall(func, params, 2, &ret, 1);
|
||||||
return !!retv;
|
return !!retv;
|
||||||
}
|
}
|
||||||
return Grind(items);
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
@ -1694,7 +1650,7 @@ bool AActor::FloorBounceMissile (secplane_t &plane)
|
||||||
//
|
//
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
|
|
||||||
int P_FaceMobj (AActor *source, AActor *target, DAngle *delta)
|
static int P_FaceMobj (AActor *source, AActor *target, DAngle *delta)
|
||||||
{
|
{
|
||||||
DAngle diff;
|
DAngle diff;
|
||||||
|
|
||||||
|
@ -1829,7 +1785,7 @@ bool P_SeekerMissile (AActor *actor, DAngle thresh, DAngle turnMax, bool precise
|
||||||
#define STOPSPEED (0x1000/65536.)
|
#define STOPSPEED (0x1000/65536.)
|
||||||
#define CARRYSTOPSPEED ((0x1000*32/3)/65536.)
|
#define CARRYSTOPSPEED ((0x1000*32/3)/65536.)
|
||||||
|
|
||||||
double P_XYMovement (AActor *mo, DVector2 scroll)
|
static double P_XYMovement (AActor *mo, DVector2 scroll)
|
||||||
{
|
{
|
||||||
static int pushtime = 0;
|
static int pushtime = 0;
|
||||||
bool bForceSlide = !scroll.isZero();
|
bool bForceSlide = !scroll.isZero();
|
||||||
|
@ -2380,8 +2336,8 @@ explode:
|
||||||
return Oldfloorz;
|
return Oldfloorz;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Move this to p_inter ***
|
|
||||||
void P_MonsterFallingDamage (AActor *mo)
|
static void P_MonsterFallingDamage (AActor *mo)
|
||||||
{
|
{
|
||||||
int damage;
|
int damage;
|
||||||
double vel;
|
double vel;
|
||||||
|
@ -2408,7 +2364,7 @@ void P_MonsterFallingDamage (AActor *mo)
|
||||||
// P_ZMovement
|
// P_ZMovement
|
||||||
//
|
//
|
||||||
|
|
||||||
void P_ZMovement (AActor *mo, double oldfloorz)
|
static void P_ZMovement (AActor *mo, double oldfloorz)
|
||||||
{
|
{
|
||||||
double dist;
|
double dist;
|
||||||
double delta;
|
double delta;
|
||||||
|
@ -2731,11 +2687,11 @@ DEFINE_ACTION_FUNCTION(AActor, CheckFakeFloorTriggers)
|
||||||
//
|
//
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
|
||||||
void AActor::PlayerLandedMakeGruntSound(AActor *onmobj)
|
static void PlayerLandedMakeGruntSound(AActor* self, AActor *onmobj)
|
||||||
{
|
{
|
||||||
IFVIRTUAL(AActor, PlayerLandedMakeGruntSound)
|
IFVIRTUALPTR(self, AActor, PlayerLandedMakeGruntSound)
|
||||||
{
|
{
|
||||||
VMValue params[2] = { (AActor*)this, (AActor*)onmobj };
|
VMValue params[2] = { self, onmobj };
|
||||||
VMCall(func, params, 2, nullptr, 0);
|
VMCall(func, params, 2, nullptr, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2755,7 +2711,7 @@ static void PlayerLandedOnThing (AActor *mo, AActor *onmobj)
|
||||||
|
|
||||||
P_FallingDamage (mo);
|
P_FallingDamage (mo);
|
||||||
|
|
||||||
mo->PlayerLandedMakeGruntSound(onmobj);
|
PlayerLandedMakeGruntSound(mo, onmobj);
|
||||||
|
|
||||||
// mo->player->centering = true;
|
// mo->player->centering = true;
|
||||||
}
|
}
|
||||||
|
@ -4295,7 +4251,7 @@ void AActor::CheckSectorTransition(sector_t *oldsec)
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// AActor::UpdateWaterDepth
|
// UpdateWaterDepth
|
||||||
//
|
//
|
||||||
// Updates the actor's current waterlevel and waterdepth.
|
// Updates the actor's current waterlevel and waterdepth.
|
||||||
// Consolidates common code in UpdateWaterLevel and SplashCheck.
|
// Consolidates common code in UpdateWaterLevel and SplashCheck.
|
||||||
|
@ -4305,46 +4261,46 @@ void AActor::CheckSectorTransition(sector_t *oldsec)
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
double AActor::UpdateWaterDepth(bool splash)
|
static double UpdateWaterDepth(AActor* actor, bool splash)
|
||||||
{
|
{
|
||||||
double fh = -FLT_MAX;
|
double fh = -FLT_MAX;
|
||||||
bool reset = false;
|
bool reset = false;
|
||||||
|
|
||||||
waterlevel = 0;
|
actor->waterlevel = 0;
|
||||||
waterdepth = 0;
|
actor->waterdepth = 0;
|
||||||
|
|
||||||
if (Sector == NULL)
|
if (actor->Sector == NULL)
|
||||||
{
|
{
|
||||||
return fh;
|
return fh;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Sector->MoreFlags & SECMF_UNDERWATER) // intentionally not SECMF_UNDERWATERMASK
|
if (actor->Sector->MoreFlags & SECMF_UNDERWATER) // intentionally not SECMF_UNDERWATERMASK
|
||||||
{
|
{
|
||||||
waterdepth = Height;
|
actor->waterdepth = actor->Height;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const sector_t *hsec = Sector->GetHeightSec();
|
const sector_t *hsec = actor->Sector->GetHeightSec();
|
||||||
if (hsec != NULL)
|
if (hsec != NULL)
|
||||||
{
|
{
|
||||||
fh = hsec->floorplane.ZatPoint(this);
|
fh = hsec->floorplane.ZatPoint(actor);
|
||||||
|
|
||||||
// splash checks also check Boom-style non-swimmable sectors
|
// splash checks also check Boom-style non-swimmable sectors
|
||||||
// as well as non-solid, visible 3D floors (below)
|
// as well as non-solid, visible 3D floors (below)
|
||||||
if (splash || hsec->MoreFlags & SECMF_UNDERWATERMASK)
|
if (splash || hsec->MoreFlags & SECMF_UNDERWATERMASK)
|
||||||
{
|
{
|
||||||
waterdepth = fh - Z();
|
actor->waterdepth = fh - actor->Z();
|
||||||
|
|
||||||
if (waterdepth <= 0 && !(hsec->MoreFlags & SECMF_FAKEFLOORONLY) && (Top() > hsec->ceilingplane.ZatPoint(this)))
|
if (actor->waterdepth <= 0 && !(hsec->MoreFlags & SECMF_FAKEFLOORONLY) && (actor->Top() > hsec->ceilingplane.ZatPoint(actor)))
|
||||||
{
|
{
|
||||||
waterdepth = Height;
|
actor->waterdepth = actor->Height;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Check 3D floors as well!
|
// Check 3D floors as well!
|
||||||
for (auto rover : Sector->e->XFloor.ffloors)
|
for (auto rover : actor->Sector->e->XFloor.ffloors)
|
||||||
{
|
{
|
||||||
if (!(rover->flags & FF_EXISTS)) continue;
|
if (!(rover->flags & FF_EXISTS)) continue;
|
||||||
if (rover->flags & FF_SOLID) continue;
|
if (rover->flags & FF_SOLID) continue;
|
||||||
|
@ -4353,36 +4309,36 @@ double AActor::UpdateWaterDepth(bool splash)
|
||||||
if (splash) { reset &= rover->alpha == 0; }
|
if (splash) { reset &= rover->alpha == 0; }
|
||||||
if (reset) continue;
|
if (reset) continue;
|
||||||
|
|
||||||
double ff_bottom = rover->bottom.plane->ZatPoint(this);
|
double ff_bottom = rover->bottom.plane->ZatPoint(actor);
|
||||||
double ff_top = rover->top.plane->ZatPoint(this);
|
double ff_top = rover->top.plane->ZatPoint(actor);
|
||||||
|
|
||||||
if (ff_top <= Z() || ff_bottom > Center()) continue;
|
if (ff_top <= actor->Z() || ff_bottom > actor->Center()) continue;
|
||||||
|
|
||||||
fh = ff_top;
|
fh = ff_top;
|
||||||
waterdepth = ff_top - Z();
|
actor->waterdepth = ff_top - actor->Z();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (waterdepth < 0) { waterdepth = 0; }
|
if (actor->waterdepth < 0) { actor->waterdepth = 0; }
|
||||||
|
|
||||||
if (waterdepth > (Height / 2))
|
if (actor->waterdepth > (actor->Height / 2))
|
||||||
{
|
{
|
||||||
// When noclipping around and going from low to high sector, your view height
|
// When noclipping around and going from low to high sector, your view height
|
||||||
// can go negative, which is why this is nested inside here
|
// can go negative, which is why this is nested inside here
|
||||||
if ((player && (waterdepth >= player->viewheight)) || (waterdepth >= Height))
|
if ((actor->player && (actor->waterdepth >= actor->player->viewheight)) || (actor->waterdepth >= actor->Height))
|
||||||
{
|
{
|
||||||
waterlevel = 3;
|
actor->waterlevel = 3;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
waterlevel = 2;
|
actor->waterlevel = 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (waterdepth > 0)
|
else if (actor->waterdepth > 0)
|
||||||
{
|
{
|
||||||
waterlevel = 1;
|
actor->waterlevel = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return fh;
|
return fh;
|
||||||
|
@ -4398,7 +4354,7 @@ double AActor::UpdateWaterDepth(bool splash)
|
||||||
|
|
||||||
void AActor::SplashCheck()
|
void AActor::SplashCheck()
|
||||||
{
|
{
|
||||||
double fh = UpdateWaterDepth(true);
|
double fh = UpdateWaterDepth(this, true);
|
||||||
|
|
||||||
// some additional checks to make deep sectors like Boom's splash without setting
|
// some additional checks to make deep sectors like Boom's splash without setting
|
||||||
// the water flags.
|
// the water flags.
|
||||||
|
@ -4423,7 +4379,7 @@ bool AActor::UpdateWaterLevel(bool dosplash)
|
||||||
int oldlevel = waterlevel;
|
int oldlevel = waterlevel;
|
||||||
|
|
||||||
if (dosplash) SplashCheck();
|
if (dosplash) SplashCheck();
|
||||||
UpdateWaterDepth(false);
|
UpdateWaterDepth(this, false);
|
||||||
|
|
||||||
// Play surfacing and diving sounds, as appropriate.
|
// Play surfacing and diving sounds, as appropriate.
|
||||||
//
|
//
|
||||||
|
@ -4945,7 +4901,7 @@ void AActor::OnDestroy ()
|
||||||
ClearRenderLineList();
|
ClearRenderLineList();
|
||||||
|
|
||||||
// [RH] Destroy any inventory this actor is carrying
|
// [RH] Destroy any inventory this actor is carrying
|
||||||
DestroyAllInventory ();
|
DestroyAllInventory (this);
|
||||||
|
|
||||||
// [RH] Unlink from tid chain
|
// [RH] Unlink from tid chain
|
||||||
RemoveFromHash ();
|
RemoveFromHash ();
|
||||||
|
@ -5321,7 +5277,7 @@ AActor *FLevelLocals::SpawnPlayer (FPlayerStart *mthing, int playernum, int flag
|
||||||
if (oldactor != NULL)
|
if (oldactor != NULL)
|
||||||
{ // Remove any inventory left from the old actor. Coop handles
|
{ // Remove any inventory left from the old actor. Coop handles
|
||||||
// it above, but the other modes don't.
|
// it above, but the other modes don't.
|
||||||
oldactor->DestroyAllInventory();
|
DestroyAllInventory(oldactor);
|
||||||
}
|
}
|
||||||
// [BC] Handle temporary invulnerability when respawned
|
// [BC] Handle temporary invulnerability when respawned
|
||||||
if (state == PST_REBORN || state == PST_ENTER)
|
if (state == PST_REBORN || state == PST_ENTER)
|
||||||
|
|
|
@ -528,7 +528,9 @@ DEFINE_PROPERTY(skip_super, 0, Actor)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
*defaults = *GetDefault<AActor>();
|
// major hack job alert. This is only supposed to copy the parts that actually are defined by AActor itself.
|
||||||
|
memcpy(&defaults->snext, &GetDefault<AActor>()->snext, (uint8_t*)&defaults[1] - (uint8_t*)&defaults->snext);
|
||||||
|
|
||||||
ResetBaggage (&bag, RUNTIME_CLASS(AActor));
|
ResetBaggage (&bag, RUNTIME_CLASS(AActor));
|
||||||
static_cast<PClassActor*>(bag.Info)->ActorInfo()->SkipSuperSet = true; // ZScript processes the states later so this property must be flagged for later handling.
|
static_cast<PClassActor*>(bag.Info)->ActorInfo()->SkipSuperSet = true; // ZScript processes the states later so this property must be flagged for later handling.
|
||||||
}
|
}
|
||||||
|
|
|
@ -488,7 +488,7 @@ class Actor : Thinker native
|
||||||
virtual native int TakeSpecialDamage (Actor inflictor, Actor source, int damage, Name damagetype);
|
virtual native int TakeSpecialDamage (Actor inflictor, Actor source, int damage, Name damagetype);
|
||||||
virtual native void Die(Actor source, Actor inflictor, int dmgflags = 0, Name MeansOfDeath = 'none');
|
virtual native void Die(Actor source, Actor inflictor, int dmgflags = 0, Name MeansOfDeath = 'none');
|
||||||
virtual native bool Slam(Actor victim);
|
virtual native bool Slam(Actor victim);
|
||||||
virtual native void Touch(Actor toucher);
|
virtual void Touch(Actor toucher) {}
|
||||||
virtual native void FallAndSink(double grav, double oldfloorz);
|
virtual native void FallAndSink(double grav, double oldfloorz);
|
||||||
private native void Substitute(Actor replacement);
|
private native void Substitute(Actor replacement);
|
||||||
native ui void DisplayNameTag();
|
native ui void DisplayNameTag();
|
||||||
|
|
Loading…
Reference in a new issue