From 792bb65e9e2e228c099e67d81fa58ab0f653fae0 Mon Sep 17 00:00:00 2001 From: GenericHeroGuy Date: Mon, 21 Jul 2025 18:12:07 +0200 Subject: [PATCH] Add compat for old P_SetScale behavior, fixes Malicious Metropolis --- src/lua_baselib.c | 2 +- src/lua_mobjlib.c | 4 ++-- src/p_mobj.c | 14 +++++++++++--- src/p_mobj.h | 3 ++- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/lua_baselib.c b/src/lua_baselib.c index c0506afff..19110cf5f 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -970,7 +970,7 @@ static int lib_pSetScale(lua_State *L) return LUA_ErrInvalid(L, "mobj_t"); if (newscale < FRACUNIT/100) newscale = FRACUNIT/100; - P_SetScale(mobj, newscale); + P_SetScale2(mobj, newscale, lua_compatmode); return 0; } diff --git a/src/lua_mobjlib.c b/src/lua_mobjlib.c index 5811dba0b..2c1412683 100644 --- a/src/lua_mobjlib.c +++ b/src/lua_mobjlib.c @@ -897,7 +897,7 @@ static int mobj_set(lua_State *L) return luaL_error(L, "mobj.type %d out of range (0 - %d).", newtype, NUMMOBJTYPES-1); mo->type = newtype; mo->info = &mobjinfo[newtype]; - P_SetScale(mo, mo->scale); + P_SetScale2(mo, mo->scale, lua_compatmode); break; } case mobj_info: @@ -972,7 +972,7 @@ static int mobj_set(lua_State *L) if (scale < FRACUNIT/100) scale = FRACUNIT/100; mo->destscale = scale; - P_SetScale(mo, scale); + P_SetScale2(mo, scale, lua_compatmode); mo->old_scale = scale; break; } diff --git a/src/p_mobj.c b/src/p_mobj.c index b80cfdaa9..0fabc21d6 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6165,7 +6165,7 @@ void P_SpawnParaloop(fixed_t x, fixed_t y, fixed_t z, fixed_t radius, INT32 numb // // Sets the sprite scaling // -void P_SetScale(mobj_t *mobj, fixed_t newscale) +void P_SetScale2(mobj_t *mobj, fixed_t newscale, boolean compat) { player_t *player; fixed_t oldscale; @@ -6177,8 +6177,16 @@ void P_SetScale(mobj_t *mobj, fixed_t newscale) mobj->scale = newscale; - mobj->radius = FixedMul(FixedDiv(mobj->radius, oldscale), newscale); - mobj->height = FixedMul(FixedDiv(mobj->height, oldscale), newscale); + if (compat) + { + mobj->radius = FixedMul(mobj->info->radius, newscale); + mobj->height = FixedMul(mobj->info->height, newscale); + } + else + { + mobj->radius = FixedMul(FixedDiv(mobj->radius, oldscale), newscale); + mobj->height = FixedMul(FixedDiv(mobj->height, oldscale), newscale); + } player = mobj->player; diff --git a/src/p_mobj.h b/src/p_mobj.h index 1329b8da9..d17a38772 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -566,7 +566,8 @@ boolean P_SupermanLook4Players(mobj_t *actor); boolean P_PrecipThinker(precipmobj_t *mobj); void P_NullPrecipThinker(precipmobj_t *mobj); void P_FreePrecipMobj(precipmobj_t *mobj); -void P_SetScale(mobj_t *mobj, fixed_t newscale); +#define P_SetScale(mobj, newscale) P_SetScale2(mobj, newscale, false) +void P_SetScale2(mobj_t *mobj, fixed_t newscale, boolean compat); void P_XYMovement(mobj_t *mo); void P_RingXYMovement(mobj_t *mo); void P_SceneryXYMovement(mobj_t *mo);