- scriptified P_CalcHeight.

This was the only code using the ViewBob member variable.
This also moves the range check for this variable to its application, because a badly behaved mod can just as easily change it at run time instead of just setting an absurdly large value in the class definition.
This commit is contained in:
Christoph Oelckers 2019-01-03 11:57:20 +01:00
parent 9e5c5b68c5
commit 2bd72478ee
8 changed files with 170 additions and 175 deletions

View file

@ -136,10 +136,6 @@ public:
// [CW] Fades for when you are being damaged.
PalEntry DamageFade;
// [SP] ViewBob Multiplier
double ViewBob;
double curBob;
// Everything below this point is only used by scripted code or through the scripted variable interface.
int RunHealth;
TObjPtr<AActor*> InvFirst; // first inventory item displayed on inventory bar
@ -147,6 +143,10 @@ public:
double SideMove1, SideMove2;
double HexenArmor[5];
// [SP] ViewBob Multiplier
double ViewBob;
double curBob;
// Former class properties that were moved into the object to get rid of the meta class.
FName SoundClass; // Sound class
FName Portrait;

View file

@ -2001,8 +2001,6 @@ CUSTOM_CVAR (Int, autosavecount, 4, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
self = 0;
}
extern void P_CalcHeight (player_t *);
void G_DoAutoSave ()
{
FString description;

View file

@ -1039,6 +1039,7 @@ xx(SideMove2)
xx(Face)
xx(Slot)
xx(SoundClass)
xx(ViewBob)
xx(BlueCard)
xx(YellowCard)

View file

@ -48,8 +48,6 @@
static FRandom pr_teleport ("Teleport");
extern void P_CalcHeight (player_t *player);
CVAR (Bool, telezoom, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG);
//==========================================================================
@ -585,7 +583,11 @@ bool EV_SilentLineTeleport (line_t *line, int side, AActor *thing, int id, INTBO
player->deltaviewheight = 0;
// Set player's view according to the newly set parameters
P_CalcHeight(player);
IFVIRTUALPTR(player->mo, APlayerPawn, CalcHeight)
{
VMValue param = player->mo;
VMCall(func, &param, 1, nullptr, 0);
}
// Reset the delta to have the same dynamics as before
player->deltaviewheight = deltaviewheight;

View file

@ -195,13 +195,6 @@ FString GetPrintableDisplayName(PClassActor *cls)
return cls->GetDisplayName();
}
DEFINE_ACTION_FUNCTION(APlayerPawn, GetPrintableDisplayName)
{
PARAM_PROLOGUE;
PARAM_CLASS(type, AActor);
ACTION_RETURN_STRING(type->GetDisplayName());
}
bool ValidatePlayerClass(PClassActor *ti, const char *name)
{
if (ti == NULL)
@ -297,9 +290,6 @@ CCMD (playerclasses)
// Movement.
//
// 16 pixels of bob
#define MAXBOB 16.
player_t::~player_t()
{
DestroyPSprites();
@ -774,6 +764,17 @@ DEFINE_ACTION_FUNCTION(_PlayerInfo, GetWBobSpeed)
ACTION_RETURN_FLOAT(self->userinfo.GetWBobSpeed());
}
DEFINE_ACTION_FUNCTION(_PlayerInfo, GetMoveBob)
{
PARAM_SELF_STRUCT_PROLOGUE(player_t);
ACTION_RETURN_FLOAT(self->userinfo.GetMoveBob());
}
DEFINE_ACTION_FUNCTION(_PlayerInfo, GetStillBob)
{
PARAM_SELF_STRUCT_PROLOGUE(player_t);
ACTION_RETURN_FLOAT(self->userinfo.GetStillBob());
}
//===========================================================================
//
@ -1202,138 +1203,6 @@ void P_CheckPlayerSprite(AActor *actor, int &spritenum, DVector2 &scale)
}
}
/*
==================
=
= P_CalcHeight
=
=
Calculate the walking / running height adjustment
=
==================
*/
void P_CalcHeight (player_t *player)
{
DAngle angle;
double bob;
bool still = false;
// Regular movement bobbing
// (needs to be calculated for gun swing even if not on ground)
// killough 10/98: Make bobbing depend only on player-applied motion.
//
// Note: don't reduce bobbing here if on ice: if you reduce bobbing here,
// it causes bobbing jerkiness when the player moves from ice to non-ice,
// and vice-versa.
if (player->cheats & CF_NOCLIP2)
{
player->bob = 0;
}
else if ((player->mo->flags & MF_NOGRAVITY) && !player->onground)
{
player->bob = 0.5;
}
else
{
player->bob = player->Vel.LengthSquared();
if (player->bob == 0)
{
still = true;
}
else
{
player->bob *= player->userinfo.GetMoveBob();
if (player->bob > MAXBOB)
player->bob = MAXBOB;
}
}
double defaultviewheight = player->mo->ViewHeight + player->crouchviewdelta;
if (player->cheats & CF_NOVELOCITY)
{
player->viewz = player->mo->Z() + defaultviewheight;
if (player->viewz > player->mo->ceilingz-4)
player->viewz = player->mo->ceilingz-4;
return;
}
if (still)
{
if (player->health > 0)
{
angle = level.time / (120 * TICRATE / 35.) * 360.;
bob = player->userinfo.GetStillBob() * angle.Sin();
}
else
{
bob = 0;
}
}
else
{
angle = level.time / (20 * TICRATE / 35.) * 360.;
bob = player->bob * angle.Sin() * (player->mo->waterlevel > 1 ? 0.25f : 0.5f);
}
// move viewheight
if (player->playerstate == PST_LIVE)
{
player->viewheight += player->deltaviewheight;
if (player->viewheight > defaultviewheight)
{
player->viewheight = defaultviewheight;
player->deltaviewheight = 0;
}
else if (player->viewheight < (defaultviewheight/2))
{
player->viewheight = defaultviewheight/2;
if (player->deltaviewheight <= 0)
player->deltaviewheight = 1 / 65536.;
}
if (player->deltaviewheight)
{
player->deltaviewheight += 0.25;
if (!player->deltaviewheight)
player->deltaviewheight = 1/65536.;
}
}
if (player->morphTics)
{
bob = 0;
}
player->viewz = player->mo->Z() + player->viewheight + (bob * player->mo->ViewBob); // [SP] Allow DECORATE changes to view bobbing speed.
if (player->mo->Floorclip && player->playerstate != PST_DEAD
&& player->mo->Z() <= player->mo->floorz)
{
player->viewz -= player->mo->Floorclip;
}
if (player->viewz > player->mo->ceilingz - 4)
{
player->viewz = player->mo->ceilingz - 4;
}
if (player->viewz < player->mo->floorz + 4)
{
player->viewz = player->mo->floorz + 4;
}
}
DEFINE_ACTION_FUNCTION(APlayerPawn, CalcHeight)
{
PARAM_SELF_PROLOGUE(APlayerPawn);
P_CalcHeight(self->player);
return 0;
}
CUSTOM_CVAR (Float, sv_aircontrol, 0.00390625f, CVAR_SERVERINFO|CVAR_NOSAVE)
{
level.aircontrol = self;

View file

@ -1696,26 +1696,6 @@ DEFINE_CLASS_PROPERTY_PREFIX(player, weaponslot, ISsssssssssssssssssssssssssssss
}
}
//==========================================================================
//
// [SP] Player.Viewbob
//
//==========================================================================
DEFINE_CLASS_PROPERTY_PREFIX(player, viewbob, F, PlayerPawn)
{
PROP_DOUBLE_PARM(z, 0);
// [SP] Hard limits. This is to prevent terrywads from making players sick.
// Remember - this messes with a user option who probably has it set a
// certain way for a reason. I think a 1.5 limit is pretty generous, but
// it may be safe to increase it. I really need opinions from people who
// could be affected by this.
if (z < 0.0 || z > 1.5)
{
I_Error("ViewBob must be between 0.0 and 1.5.");
}
defaults->ViewBob = z;
}
//==========================================================================
// (non-fatal with non-existent types only in DECORATE)
//==========================================================================

View file

@ -1651,7 +1651,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(AActor, CheckFor3DCeilingHit, CheckFor3DCeilingHit
//===========================================================================
//
// APlayerPawn :: MarkPlayerSounds
// APlayerPawn functions
//
//===========================================================================
@ -1662,6 +1662,19 @@ DEFINE_ACTION_FUNCTION_NATIVE(APlayerPawn, MarkPlayerSounds, S_MarkPlayerSounds)
return 0;
}
static void GetPrintableDisplayNameJit(PClassActor *cls, FString *result)
{
*result = cls->GetDisplayName();
}
DEFINE_ACTION_FUNCTION_NATIVE(APlayerPawn, GetPrintableDisplayName, GetPrintableDisplayNameJit)
{
PARAM_PROLOGUE;
PARAM_CLASS(type, AActor);
ACTION_RETURN_STRING(type->GetDisplayName());
}
DEFINE_FIELD(AActor, snext)
DEFINE_FIELD(AActor, player)

View file

@ -15,6 +15,8 @@ class PlayerPawn : Actor native
const CROUCHSPEED = (1./12);
// [RH] # of ticks to complete a turn180
const TURN180_TICKS = ((TICRATE / 4) + 1);
// 16 pixels of bob
const MAXBOB = 16.;
native int crouchsprite;
native int MaxHealth;
@ -72,6 +74,7 @@ class PlayerPawn : Actor native
property FlechetteType: FlechetteType;
property Portrait: Portrait;
property TeleportFreezeTime: TeleportFreezeTime;
property ViewBob: ViewBob;
Default
{
@ -452,6 +455,133 @@ class PlayerPawn : Actor native
}
}
/*
==================
=
= P_CalcHeight
=
=
Calculate the walking / running height adjustment
=
==================
*/
virtual void CalcHeight()
{
let player = self.player;
double angle;
double bob;
bool still = false;
// Regular movement bobbing
// (needs to be calculated for gun swing even if not on ground)
// killough 10/98: Make bobbing depend only on player-applied motion.
//
// Note: don't reduce bobbing here if on ice: if you reduce bobbing here,
// it causes bobbing jerkiness when the player moves from ice to non-ice,
// and vice-versa.
if (player.cheats & CF_NOCLIP2)
{
player.bob = 0;
}
else if (bNoGravity && !player.onground)
{
player.bob = 0.5;
}
else
{
player.bob = player.Vel dot player.Vel;
if (player.bob == 0)
{
still = true;
}
else
{
player.bob *= player.GetMoveBob();
if (player.bob > MAXBOB)
player.bob = MAXBOB;
}
}
double defaultviewheight = ViewHeight + player.crouchviewdelta;
if (player.cheats & CF_NOVELOCITY)
{
player.viewz = pos.Z + defaultviewheight;
if (player.viewz > ceilingz-4)
player.viewz = ceilingz-4;
return;
}
if (still)
{
if (player.health > 0)
{
angle = level.time / (120 * TICRATE / 35.) * 360.;
bob = player.GetStillBob() * sin(angle);
}
else
{
bob = 0;
}
}
else
{
angle = level.time / (20 * TICRATE / 35.) * 360.;
bob = player.bob * sin(angle) * (waterlevel > 1 ? 0.25f : 0.5f);
}
// move viewheight
if (player.playerstate == PST_LIVE)
{
player.viewheight += player.deltaviewheight;
if (player.viewheight > defaultviewheight)
{
player.viewheight = defaultviewheight;
player.deltaviewheight = 0;
}
else if (player.viewheight < (defaultviewheight/2))
{
player.viewheight = defaultviewheight/2;
if (player.deltaviewheight <= 0)
player.deltaviewheight = 1 / 65536.;
}
if (player.deltaviewheight)
{
player.deltaviewheight += 0.25;
if (!player.deltaviewheight)
player.deltaviewheight = 1/65536.;
}
}
if (player.morphTics)
{
bob = 0;
}
player.viewz = pos.Z + player.viewheight + (bob * clamp(ViewBob, 0. , 1.5)); // [SP] Allow DECORATE changes to view bobbing speed.
if (Floorclip && player.playerstate != PST_DEAD
&& pos.Z <= floorz)
{
player.viewz -= Floorclip;
}
if (player.viewz > ceilingz - 4)
{
player.viewz = ceilingz - 4;
}
if (player.viewz < floorz + 4)
{
player.viewz = floorz + 4;
}
}
//==========================================================================
//
// P_DeathThink
@ -1445,7 +1575,7 @@ class PlayerPawn : Actor native
CheckUse();
CheckUndoMorph();
// Cycle psprites.
// Note that after self point the PlayerPawn may have changed due to getting unmorphed so 'self' is no longer safe to use.
// Note that after this point the PlayerPawn may have changed due to getting unmorphed so 'self' is no longer safe to use.
player.mo.TickPSprites();
// Other Counters
if (player.damagecount) player.damagecount--;
@ -1474,6 +1604,7 @@ class PlayerPawn : Actor native
void BringUpWeapon ()
{
let player = self.player;
if (player.PendingWeapon == WP_NOCHANGE)
{
if (player.ReadyWeapon != null)
@ -2184,7 +2315,6 @@ class PlayerPawn : Actor native
native bool ResetAirSupply (bool playgasp = true);
native clearscope static String GetPrintableDisplayName(Class<Actor> cls);
native void CheckMusicChange();
native void CalcHeight ();
native void CheckEnvironment();
native void CheckUse();
native void CheckWeaponButtons();
@ -2452,6 +2582,8 @@ struct PlayerInfo native play // self is what internally is known as player_t
native float GetAutoaim() const;
native bool GetNoAutostartMap() const;
native double GetWBobSpeed() const;
native double GetMoveBob() const;
native double GetStillBob() const;
native void SetFOV(float fov);
native bool GetClassicFlight() const;
native clearscope bool HasWeaponsInSlot(int slot) const;
@ -2471,7 +2603,7 @@ struct PlayerInfo native play // self is what internally is known as player_t
{
if (player.mo != null)
{
return player.mo.UndoPlayerMorph(self, unmorphflag, force);
return player.mo.UndoPlayerMorph(self, unmorphflag, force);
}
return false;
}