From 1bc3da1d22cc25abb16b605febf9f1a52ba60e36 Mon Sep 17 00:00:00 2001 From: MysterD Date: Wed, 4 Aug 2021 18:47:59 -0700 Subject: [PATCH] Fade out players when they leave/disconnect --- include/types.h | 1 + src/game/mario.c | 22 ++++++++++++++++------ src/pc/network/packets/packet_player.c | 5 +++++ 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/include/types.h b/include/types.h index 96af4531..efb81a49 100644 --- a/include/types.h +++ b/include/types.h @@ -381,6 +381,7 @@ struct MarioState /*????*/ Vec3f nonInstantWarpPos; /*????*/ struct Character* character; + /*????*/ u8 wasNetworkVisible; }; #define PLAY_MODE_NORMAL 0 diff --git a/src/game/mario.c b/src/game/mario.c index 5b0c1e34..e1bd3046 100644 --- a/src/game/mario.c +++ b/src/game/mario.c @@ -1782,7 +1782,7 @@ void mario_update_hitbox_and_cap_model(struct MarioState *m) { } struct NetworkPlayer* np = &gNetworkPlayers[gMarioState->playerIndex]; - u8 teleportFade = (m->flags & MARIO_TELEPORTING) || (np->type != NPT_LOCAL && np->connected && np->fadeOpacity < 32); + u8 teleportFade = (m->flags & MARIO_TELEPORTING) || (np->type != NPT_LOCAL && np->fadeOpacity < 32); if (teleportFade && (m->fadeWarpOpacity != 0xFF)) { bodyState->modelState &= ~0xFF; bodyState->modelState |= (0x100 | m->fadeWarpOpacity); @@ -1874,17 +1874,25 @@ s32 execute_mario_action(UNUSED struct Object *o) { || np->currLevelNum != gNetworkPlayerLocal->currLevelNum || np->currAreaIndex != gNetworkPlayerLocal->currAreaIndex); - if (!np->connected || levelAreaMismatch || !gNetworkAreaLoaded) { + bool fadedOut = gNetworkAreaLoaded && (levelAreaMismatch && gMarioState->wasNetworkVisible && np->fadeOpacity == 0); + bool wasNeverVisible = gNetworkAreaLoaded && !gMarioState->wasNetworkVisible; + + if (!gNetworkAreaLoaded || fadedOut || wasNeverVisible) { gMarioState->marioObj->header.gfx.node.flags |= GRAPH_RENDER_INVISIBLE; gMarioState->marioObj->oIntangibleTimer = -1; return 0; } - if (np->fadeOpacity < 32) { - if (!(gMarioState->flags & MARIO_TELEPORTING)) { - np->fadeOpacity += 2; - gMarioState->fadeWarpOpacity = np->fadeOpacity << 3; + if (levelAreaMismatch && gMarioState->wasNetworkVisible) { + if (np->fadeOpacity <= 2) { + np->fadeOpacity = 0; + } else { + np->fadeOpacity -= 2; } + gMarioState->fadeWarpOpacity = np->fadeOpacity << 3; + } else if (np->fadeOpacity < 32) { + np->fadeOpacity += 2; + gMarioState->fadeWarpOpacity = np->fadeOpacity << 3; } } @@ -2134,6 +2142,8 @@ static void init_single_mario(struct MarioState* m) { // force all other players to be invisible by default if (playerIndex != 0) { m->marioObj->header.gfx.node.flags |= GRAPH_RENDER_INVISIBLE; + m->wasNetworkVisible = false; + gNetworkPlayers[playerIndex].fadeOpacity = 0; } // set mario/luigi model diff --git a/src/pc/network/packets/packet_player.c b/src/pc/network/packets/packet_player.c index d7e0bc59..d5b5ac03 100644 --- a/src/pc/network/packets/packet_player.c +++ b/src/pc/network/packets/packet_player.c @@ -343,6 +343,11 @@ void network_receive_player(struct Packet* p) { if (m->action != oldData.action) { m->actionTimer = 0; } + + // mark this player as visible + if (gNetworkAreaLoaded) { + m->wasNetworkVisible = true; + } } void network_update_player(void) {