Merge branch 'magician-spectator' into 'master'

Heavy Magician adjustment

See merge request KartKrew/Kart!876
This commit is contained in:
Oni 2023-01-22 01:59:48 +00:00
commit 90274359db
7 changed files with 64 additions and 18 deletions

View file

@ -2292,10 +2292,15 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
}
else
{
UINT32 skinflags = (demo.playback)
? demo.skinlist[demo.currentskinid[player]].flags
: skins[players[player].skin].flags;
fakeskin = players[player].fakeskin;
kartspeed = players[player].kartspeed;
kartweight = players[player].kartweight;
charflags = players[player].charflags;
charflags = (skinflags & SF_IRONMAN) ? skinflags : players[player].charflags;
}
lastfakeskin = players[player].lastfakeskin;

View file

@ -1959,7 +1959,7 @@ void K_SpawnMagicianParticles(mobj_t *mo, int spread)
INT32 i;
mobj_t *target = mo->target;
if (P_MobjWasRemoved(target))
if (!target || P_MobjWasRemoved(target))
target = mo;
for (i = 0; i < 16; i++)
@ -2531,8 +2531,8 @@ void K_PlayOvertakeSound(mobj_t *source)
void K_PlayPainSound(mobj_t *source, mobj_t *other)
{
sfxenum_t pick = P_RandomKey(PR_VOICES, 2); // Gotta roll the RNG every time this is called for sync reasons
sfxenum_t sfx_id = ((skin_t *)source->skin)->soundsid[S_sfx[sfx_khurt1 + pick].skinsound];
skin_t *skin = (source->player ? &skins[source->player->skin] : ((skin_t *)source->skin));
sfxenum_t sfx_id = skin->soundsid[S_sfx[sfx_khurt1 + pick].skinsound];
boolean alwaysHear = false;
if (other != NULL && P_MobjWasRemoved(other) == false && other->player != NULL)
@ -2550,7 +2550,8 @@ void K_PlayPainSound(mobj_t *source, mobj_t *other)
void K_PlayHitEmSound(mobj_t *source, mobj_t *other)
{
sfxenum_t sfx_id = ((skin_t *)source->skin)->soundsid[S_sfx[sfx_khitem].skinsound];
skin_t *skin = (source->player ? &skins[source->player->skin] : ((skin_t *)source->skin));
sfxenum_t sfx_id = skin->soundsid[S_sfx[sfx_khitem].skinsound];
boolean alwaysHear = false;
if (other != NULL && P_MobjWasRemoved(other) == false && other->player != NULL)

View file

@ -1926,6 +1926,23 @@ static boolean P_KillPlayer(player_t *player, mobj_t *inflictor, mobj_t *source,
break;
}
if (player->spectator == false)
{
UINT32 skinflags = (demo.playback)
? demo.skinlist[demo.currentskinid[(player-players)]].flags
: skins[player->skin].flags;
if (skinflags & SF_IRONMAN)
{
player->mo->skin = &skins[player->skin];
player->charflags = skinflags;
K_SpawnMagicianParticles(player->mo, 5);
S_StartSound(player->mo, sfx_slip);
}
player->mo->renderflags &= ~RF_DONTDRAW;
}
K_DropEmeraldsFromPlayer(player, player->emeralds);
K_SetHitLagForObjects(player->mo, inflictor, MAXHITLAGTICS, true);
@ -1935,11 +1952,6 @@ static boolean P_KillPlayer(player_t *player, mobj_t *inflictor, mobj_t *source,
P_ResetPlayer(player);
if (player->spectator == false)
{
player->mo->renderflags &= ~RF_DONTDRAW;
}
P_SetPlayerMobjState(player->mo, player->mo->info->deathstate);
if (type == DMG_TIMEOVER)
@ -2271,6 +2283,20 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
player->glanceDir = 0;
player->pflags &= ~PF_GAINAX;
if (player->spectator == false && !(player->charflags & SF_IRONMAN))
{
UINT32 skinflags = (demo.playback)
? demo.skinlist[demo.currentskinid[(player-players)]].flags
: skins[player->skin].flags;
if (skinflags & SF_IRONMAN)
{
player->mo->skin = &skins[player->skin];
player->charflags = skinflags;
K_SpawnMagicianParticles(player->mo, 5);
}
}
switch (type)
{
case DMG_STING:

View file

@ -7989,7 +7989,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
if (mobj->extravalue2 == 0)
{
P_RemoveMobj(mobj);
break;
return false;
}
else if (mobj->extravalue2 < TICRATE/3)
{
@ -8022,7 +8022,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
if (mobj->target->player->hyudorotimer)
{
P_RemoveMobj(mobj);
break;
return false;
}
else
{

View file

@ -4238,11 +4238,21 @@ void P_PlayerThink(player_t *player)
{
if (player->charflags & SF_IRONMAN) // no fakeskin yet
{
if (leveltime >= starttime && !player->exiting)
if (leveltime >= starttime
&& !player->exiting
&& player->mo->health > 0
&& (player->respawn.state == RESPAWNST_NONE
|| (player->respawn.state == RESPAWNST_DROP && !player->respawn.timer))
&& !P_PlayerInPain(player))
{
if (player->fakeskin != MAXSKINS)
{
SetFakePlayerSkin(player, player->fakeskin);
if (player->spectator == false)
{
S_StartSound(player->mo, sfx_kc33);
K_SpawnMagicianParticles(player->mo, 5);
}
}
else if (!(gametyperules & GTR_CIRCUIT))
{

View file

@ -433,7 +433,7 @@ void SetRandomFakePlayerSkin(player_t* player, boolean fast)
SetFakePlayerSkin(player, i);
if (player->mo)
if (player->mo && player->spectator == false)
{
S_StartSound(player->mo, sfx_kc33);
S_StartSound(player->mo, sfx_cdfm44);
@ -500,8 +500,11 @@ void ClearFakePlayerSkin(player_t* player)
if ((flags & SF_IRONMAN) && !P_MobjWasRemoved(player->mo))
{
SetFakePlayerSkin(player, skinid);
S_StartSound(player->mo, sfx_s3k9f);
K_SpawnMagicianParticles(player->mo, 5);
if (player->spectator == false)
{
S_StartSound(player->mo, sfx_s3k9f);
K_SpawnMagicianParticles(player->mo, 5);
}
}
player->fakeskin = MAXSKINS;

View file

@ -600,10 +600,11 @@ void S_StartSoundAtVolume(const void *origin_p, sfxenum_t sfx_id, INT32 volume)
sfx = &S_sfx[sfx_id];
if (sfx->skinsound != -1 && origin && origin->skin)
if (sfx->skinsound != -1 && origin && (origin->player || origin->skin))
{
// redirect player sound to the sound in the skin table
sfx_id = ((skin_t *)origin->skin)->soundsid[sfx->skinsound];
skin_t *skin = (origin->player ? &skins[origin->player->skin] : ((skin_t *)origin->skin));
sfx_id = skin->soundsid[sfx->skinsound];
sfx = &S_sfx[sfx_id];
}