Fix up some bugs introduced

This commit is contained in:
yamamama 2025-11-30 19:57:55 -05:00
parent 55e98f05cd
commit 7838c2311f
7 changed files with 67 additions and 27 deletions

View file

@ -2001,10 +2001,10 @@ static void SendNameAndColor(UINT8 n)
// Need to update voices after the fact.
if (!cv_voice[n].string)
{
CV_StealthSet(&cv_voice[n], skins[player->skin].voices[0].name);
CV_StealthSet(&cv_voice[n], skins[cv_skin[n].value].voices[0].name);
}
if (R_FindIDForVoice(&skins[player->skin], cv_voice[n].string) == MAXSKINVOICES)
if (R_FindIDForVoice(&skins[cv_skin[n].value], cv_voice[n].string) == MAXSKINVOICES)
{
// In the chance our current voice isn't valid,
// rescan our current voice and send that over the network.
@ -2018,7 +2018,7 @@ static void SendNameAndColor(UINT8 n)
{
// Get the voice from our ID.
// No need to compare parents.
valuevoice = &skins[player->skin].voices[player->voice_id];
valuevoice = &skins[cv_skin[n].value].voices[player->voice_id];
if (valuevoice)
{
@ -2027,11 +2027,24 @@ static void SendNameAndColor(UINT8 n)
else
{
// ...still nothing?
CV_StealthSet(&cv_voice[n], skins[player->skin].voices[0].name);
CV_StealthSet(&cv_voice[n], skins[cv_skin[n].value].voices[0].name);
}
}
}
// After EVERYTHING, do one last check on our voice so we can set the value.
INT32 cvar_voxid = R_FindIDForVoice(&skins[cv_skin[n].value], cv_voice[n].string);
if (cvar_voxid == MAXSKINVOICES)
{
// ...huh?! Reset to the default.
cv_voice[n].value = 0;
}
else
{
cv_voice[n].value = cvar_voxid;
}
// Finally write out the complete packet and send it off.
WRITESTRINGN(p, cv_playername[n].zstring, MAXPLAYERNAME);
WRITEUINT32(p, (UINT32)player->availabilities);
@ -7416,6 +7429,12 @@ static void Color4_OnChange(void)
static void __voice_cvar_func(INT32 pid, UINT8 pnum)
{
if (!numskins)
{
// There aren't even any skins yet!
return;
}
kartvoice_t *myvoice = P_GetMobjVoice(players[pid].mo);
if (!myvoice)

View file

@ -1279,17 +1279,9 @@ void G_ReadDemoExtraData(void)
players[p].voice_id = (UINT16)vce;
}
if (skins[players[p].skin].voices[players[p].voice_id].id == 0)
if (!P_MobjWasRemoved(players[p].mo))
{
// Default voice for this skin. Just strip the object of its voice.
players[p].mo->voice = NULL;
}
else if (skins[players[p].skin].voices[players[p].voice_id].id !=
skins[players[p].skin].voices[0].id &&
!P_MobjWasRemoved(players[p].mo))
{
// This player's mobj exists, and their voice is valid, and isn't
// the default. So, attach the voice to the mobj!
// This player's mobj exists. So, attach the voice to the mobj!
players[p].mo->voice = &skins[players[p].skin].voices[players[p].voice_id];
}
@ -2105,7 +2097,7 @@ void G_GhostTicker(void)
{
default:
case GHC_RETURNSKIN:
g->mo->skin = g->oldmo.skin;
R_ApplySkin(g->mo, g->oldmo.skin);
/* FALLTHRU */
case GHC_NORMAL: // Go back to skin color
g->mo->color = g->oldmo.color;
@ -2166,7 +2158,7 @@ void G_GhostTicker(void)
fmo->colorized = true;
if (zt.followflags & FZT_SKIN)
fmo->skin = &skins[zt.follow.skin];
R_ApplySkin(fmo, &skins[zt.follow.skin]);
}
if (fmo)
{
@ -2569,7 +2561,7 @@ void G_ReadMetalTic(mobj_t *metal)
follow->colorized = true;
if (followtic & FZT_SKIN)
follow->skin = &skins[READUINT8(metal_p)];
R_ApplySkin(follow, &skins[READUINT8(metal_p)]);
}
if (follow)
{
@ -4124,7 +4116,8 @@ void G_AddGhost(char *defdemoname)
gh->mo->tics = -1;
// Set skin
gh->mo->skin = gh->oldmo.skin = ghskin;
R_ApplySkin(&gh->oldmo, ghskin);
R_ApplySkin(gh->mo, gh->oldmo.skin);
// Set color
gh->mo->color = ((skin_t*)gh->mo->skin)->prefcolor;

View file

@ -894,7 +894,9 @@ static int mobj_set(lua_State *L)
if (fastcmp(skins[i].name, skin))
{
if (!mo->player || R_SkinUsable(mo->player-players, i))
mo->skin = &skins[i];
{
R_ApplySkin(mo, &skins[i]);
}
return 0;
}
return luaL_error(L, "mobj.skin '%s' not found!", skin);

View file

@ -12378,7 +12378,7 @@ void P_SpawnPlayer(INT32 playernum)
// set 'spritedef' override in mobj for player skins.. (see ProjectSprite)
// (usefulness: when body mobj is detached from player (who respawns),
// the dead body mobj retains the skin through the 'spritedef' override).
mobj->skin = &skins[p->skin];
R_ApplySkin(mobj, &skins[p->skin]);
P_SetupStateAnimation(mobj, mobj->state);
if (p->voice_id)
@ -14979,12 +14979,20 @@ kartvoice_t *P_GetMobjVoice(const mobj_t *mo)
{
return mo->voice;
}
#ifdef PARANOIA
else
{
I_Error("P_GetMobjVoice: This object has no voice!");
return NULL;
}
#else
else if (mo->skin)
{
return &((skin_t *)mo->skin)->voices[0];
}
return NULL;
#endif
}
//

View file

@ -2224,7 +2224,7 @@ static thinker_t *SyncMobjThinker(savebuffer_t *save, actionf_p1 thinker, thinke
if (save->write)
WRITEUINT16(save->p, (UINT16)((skin_t *)mobj->skin - skins));
else
mobj->skin = &skins[READUINT16(save->p)];
R_ApplySkin(mobj, &skins[READUINT16(save->p)]);
}
SYNCF(MD2_COLOR, mobj->color);
SYNCF(MD2_EXTVAL1, mobj->extravalue1);

View file

@ -675,13 +675,8 @@ void SetPlayerSkinByNum(INT32 playernum, INT32 skinnum)
if (player->mo)
{
player->mo->skin = skin;
R_ApplySkin(player->mo, skin);
if (player->mo->voice)
{
// Clear out the voice pointer, so we can fall back to using skin voices.
player->mo->voice = NULL;
}
P_SetScale(player->mo, player->mo->scale);
P_SetPlayerMobjState(player->mo, player->mo->state-states); // Prevent visual errors when switching between skins with differing number of frames
}
@ -772,6 +767,27 @@ void SetPlayerVoiceByNum(INT32 playernum, UINT16 voicenum)
demo_extradata[playernum] |= DXD_SKIN;
}
/** \brief Applies the skin and its default voice.
\param mo (mobj_t) the given object the skin and voice are being assigned to
\param skin (skin_t) the skin to attach to the object. The voice is sourced from this skin
*/
void R_ApplySkin(mobj_t *mo, skin_t *skin)
{
mo->skin = skin;
mo->voice = &((skin_t *)mo->skin)->voices[0];
}
/** \brief Applies only the skin.
\param mo (mobj_t) the given object the skin is being assigned to
\param skin (skin_t) the skin to attach to the object
*/
void R_ApplySkinOnly(mobj_t *mo, skin_t *skin)
{
mo->skin = skin;
}
//
// Add skins from a pwad, each skin preceded by 'S_SKIN' marker
//

View file

@ -144,6 +144,8 @@ UINT32 R_GetSkinAvailabilities(void);
INT32 R_SkinAvailable(const char *name);
void R_PatchSkins(UINT16 wadnum);
void R_AddSkins(UINT16 wadnum);
void R_ApplySkin(mobj_t *mo, skin_t *skin);
void R_ApplySkinOnly(mobj_t *mo, skin_t *skin);
UINT8 P_GetSkinSprite2(skin_t *skin, UINT8 spr2, player_t *player);
UINT8 P_KartFrameToSprite2(skin_t *skin, UINT8 inframe, UINT8 *outframe);