objects/mega-barrier.cpp: fix undefined behavior

Calling a class method from a nullptr this is undefined
behavior.
This commit is contained in:
James R 2023-11-17 18:51:20 -08:00
parent db36fc516f
commit 55fddd2132

View file

@ -39,7 +39,7 @@ struct Mobj : mobj_t
PosArg(const mobj_t* mobj) : x(mobj->x), y(mobj->y), z(mobj->z) {} PosArg(const mobj_t* mobj) : x(mobj->x), y(mobj->y), z(mobj->z) {}
}; };
bool valid() const { return !P_MobjWasRemoved(this); } static bool valid(const Mobj* mobj) { return !P_MobjWasRemoved(mobj); }
PosArg center() const { return {x, y, z + (height / 2)}; } PosArg center() const { return {x, y, z + (height / 2)}; }
@ -70,10 +70,9 @@ struct Player : player_t
void barrier(Barrier* n) { P_SetTarget(&this->powerupvars_t::barrier, reinterpret_cast<mobj_t*>(n)); } void barrier(Barrier* n) { P_SetTarget(&this->powerupvars_t::barrier, reinterpret_cast<mobj_t*>(n)); }
}; };
static bool valid(std::size_t i) { return i < MAXPLAYERS && playeringame[i]; }
static Player* at(std::size_t i) { return static_cast<Player*>(&players[i]); } static Player* at(std::size_t i) { return static_cast<Player*>(&players[i]); }
bool valid() const { return this >= players && this < &players[MAXPLAYERS] && playeringame[num()]; }
std::size_t num() const { return this - Player::at(0); } std::size_t num() const { return this - Player::at(0); }
Mobj* mobj() const { return static_cast<Mobj*>(mo); } Mobj* mobj() const { return static_cast<Mobj*>(mo); }
@ -112,7 +111,7 @@ struct Barrier : Mobj
Player* player() const { return Player::at(playernum()); } Player* player() const { return Player::at(playernum()); }
void player(player_t* n) { barrier_player(this) = n - players; } void player(player_t* n) { barrier_player(this) = n - players; }
bool valid() const { return Mobj::valid() && player()->valid() && player()->mobj()->valid(); } bool valid() const { return Mobj::valid(this) && Player::valid(playernum()) && Mobj::valid(player()->mobj()); }
bool think() bool think()
{ {
@ -149,7 +148,7 @@ void Obj_SpawnMegaBarrier(player_t* p)
{ {
Player* player = static_cast<Player*>(p); Player* player = static_cast<Player*>(p);
if (!static_cast<Mobj*>(player->powerups().barrier())->valid()) if (!Mobj::valid(player->powerups().barrier()))
{ {
Barrier::spawn_chain(player); Barrier::spawn_chain(player);
} }