diff --git a/src/d_player.h b/src/d_player.h index 05facd9fe..e09db38a3 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -150,6 +150,7 @@ public: int MugShotMaxHealth; int RunHealth; int PlayerFlags; + double FullHeight; TObjPtr InvFirst; // first inventory item displayed on inventory bar TObjPtr InvSel; // selected inventory item diff --git a/src/p_actionfunctions.cpp b/src/p_actionfunctions.cpp index 5f7185a07..f89a560ab 100644 --- a/src/p_actionfunctions.cpp +++ b/src/p_actionfunctions.cpp @@ -6906,6 +6906,10 @@ DEFINE_ACTION_FUNCTION(AActor, A_SetSize) self->LinkToWorld(&ctx); ACTION_RETURN_BOOL(false); } + if (self->player && self->player->mo == self) + { + self->player->mo->FullHeight = newheight; + } ACTION_RETURN_BOOL(true); } diff --git a/src/p_user.cpp b/src/p_user.cpp index af1fbbf2d..c6b0a7d58 100644 --- a/src/p_user.cpp +++ b/src/p_user.cpp @@ -689,7 +689,8 @@ void APlayerPawn::Serialize(FSerializer &arc) ("userange", UseRange, def->UseRange) ("aircapacity", AirCapacity, def->AirCapacity) ("viewheight", ViewHeight, def->ViewHeight) - ("viewbob", ViewBob, def->ViewBob); + ("viewbob", ViewBob, def->ViewBob) + ("fullheight", FullHeight, def->FullHeight); } //=========================================================================== @@ -714,7 +715,7 @@ void APlayerPawn::BeginPlay () { Super::BeginPlay (); ChangeStatNum (STAT_PLAYER); - + FullHeight = Height; // Check whether a PWADs normal sprite is to be combined with the base WADs // crouch sprite. In such a case the sprites normally don't match and it is // best to disable the crouch sprite. @@ -766,11 +767,11 @@ void APlayerPawn::Tick() { if (player != NULL && player->mo == this && player->CanCrouch() && player->playerstate != PST_DEAD) { - Height = GetDefault()->Height * player->crouchfactor; + Height = FullHeight * player->crouchfactor; } else { - if (health > 0) Height = GetDefault()->Height; + if (health > 0) Height = FullHeight; } Super::Tick(); } @@ -2309,7 +2310,7 @@ void P_DeathThink (player_t *player) void P_CrouchMove(player_t * player, int direction) { - double defaultheight = player->mo->GetDefault()->Height; + double defaultheight = player->mo->FullHeight; double savedheight = player->mo->Height; double crouchspeed = direction * CROUCHSPEED; double oldheight = player->viewheight; @@ -3245,6 +3246,7 @@ DEFINE_FIELD(APlayerPawn, AirCapacity) DEFINE_FIELD(APlayerPawn, FlechetteType) DEFINE_FIELD(APlayerPawn, DamageFade) DEFINE_FIELD(APlayerPawn, ViewBob) +DEFINE_FIELD(APlayerPawn, FullHeight) DEFINE_FIELD(PClassPlayerPawn, HealingRadiusType) DEFINE_FIELD(PClassPlayerPawn, DisplayName) diff --git a/src/scripting/codegeneration/codegen.cpp b/src/scripting/codegeneration/codegen.cpp index 1d16b182f..d090fa6e4 100644 --- a/src/scripting/codegeneration/codegen.cpp +++ b/src/scripting/codegeneration/codegen.cpp @@ -1613,7 +1613,7 @@ FxExpression *FxTypeCast::Resolve(FCompileContext &ctx) } else if (ValueType->IsKindOf(RUNTIME_CLASS(PClassPointer))) { - FxExpression *x = new FxClassTypeCast(static_cast(ValueType), basex); + FxExpression *x = new FxClassTypeCast(static_cast(ValueType), basex, Explicit); x = x->Resolve(ctx); basex = nullptr; delete this; @@ -4412,7 +4412,7 @@ FxExpression *FxTypeCheck::Resolve(FCompileContext& ctx) if (left->ValueType->IsKindOf(RUNTIME_CLASS(PClassPointer))) { - left = new FxClassTypeCast(NewClassPointer(RUNTIME_CLASS(DObject)), left); + left = new FxClassTypeCast(NewClassPointer(RUNTIME_CLASS(DObject)), left, false); ClassCheck = true; } else @@ -4420,7 +4420,7 @@ FxExpression *FxTypeCheck::Resolve(FCompileContext& ctx) left = new FxTypeCast(left, NewPointer(RUNTIME_CLASS(DObject)), false); ClassCheck = false; } - right = new FxClassTypeCast(NewClassPointer(RUNTIME_CLASS(DObject)), right); + right = new FxClassTypeCast(NewClassPointer(RUNTIME_CLASS(DObject)), right, false); RESOLVE(left, ctx); RESOLVE(right, ctx); @@ -9922,12 +9922,13 @@ VMFunction *FxReturnStatement::GetDirectFunction() // //========================================================================== -FxClassTypeCast::FxClassTypeCast(PClassPointer *dtype, FxExpression *x) +FxClassTypeCast::FxClassTypeCast(PClassPointer *dtype, FxExpression *x, bool explicitily) : FxExpression(EFX_ClassTypeCast, x->ScriptPosition) { ValueType = dtype; desttype = dtype->ClassRestriction; basex=x; + Explicit = explicitily; } //========================================================================== @@ -9991,7 +9992,9 @@ FxExpression *FxClassTypeCast::Resolve(FCompileContext &ctx) if (clsname != NAME_None) { - cls = FindClassType(clsname, ctx); + if (Explicit) cls = FindClassType(clsname, ctx); + else cls = PClass::FindClass(clsname); + if (cls == nullptr) { /* lax */ @@ -10141,7 +10144,7 @@ FxExpression *FxClassPtrCast::Resolve(FCompileContext &ctx) } else if (basex->ValueType == TypeString || basex->ValueType == TypeName) { - FxExpression *x = new FxClassTypeCast(to, basex); + FxExpression *x = new FxClassTypeCast(to, basex, true); basex = nullptr; delete this; return x->Resolve(ctx); diff --git a/src/scripting/codegeneration/codegen.h b/src/scripting/codegeneration/codegen.h index 7c18589c5..42d5b0ccf 100644 --- a/src/scripting/codegeneration/codegen.h +++ b/src/scripting/codegeneration/codegen.h @@ -1913,10 +1913,11 @@ class FxClassTypeCast : public FxExpression { PClass *desttype; FxExpression *basex; + bool Explicit; public: - FxClassTypeCast(PClassPointer *dtype, FxExpression *x); + FxClassTypeCast(PClassPointer *dtype, FxExpression *x, bool explicitly); ~FxClassTypeCast(); FxExpression *Resolve(FCompileContext&); ExpEmit Emit(VMFunctionBuilder *build); diff --git a/src/scripting/decorate/thingdef_parse.cpp b/src/scripting/decorate/thingdef_parse.cpp index 81ab765f5..9b78ef3d5 100644 --- a/src/scripting/decorate/thingdef_parse.cpp +++ b/src/scripting/decorate/thingdef_parse.cpp @@ -197,7 +197,7 @@ FxExpression *ParseParameter(FScanner &sc, PClassActor *cls, PType *type) sc.SetEscape(true); sc.MustGetString(); sc.SetEscape(false); - x = new FxClassTypeCast(static_cast(type), new FxConstant(FName(sc.String), sc)); + x = new FxClassTypeCast(static_cast(type), new FxConstant(FName(sc.String), sc), false); } else { diff --git a/src/scripting/zscript/zcc_compile.cpp b/src/scripting/zscript/zcc_compile.cpp index 1925a2eb6..43f5b6774 100644 --- a/src/scripting/zscript/zcc_compile.cpp +++ b/src/scripting/zscript/zcc_compile.cpp @@ -1036,7 +1036,6 @@ bool ZCCCompiler::CompileFields(PStruct *type, TArray &Fiel { auto field = Fields[0]; FieldDesc *fd = nullptr; - FString str = FName(field->Names[0].Name); PType *fieldtype = DetermineType(type, field, field->Names->Name, field->Type, true, true); diff --git a/wadsrc/static/zscript/shared/player.txt b/wadsrc/static/zscript/shared/player.txt index 73b00a269..d4992e97f 100644 --- a/wadsrc/static/zscript/shared/player.txt +++ b/wadsrc/static/zscript/shared/player.txt @@ -37,6 +37,7 @@ class PlayerPawn : Actor native native Class FlechetteType; native color DamageFade; // [CW] Fades for when you are being damaged. native double ViewBob; // [SP] ViewBob Multiplier + native double FullHeight; Default {