From 0c7ada8d2b916af8c25f530dd5e9653d7820533b Mon Sep 17 00:00:00 2001 From: Marioiscool246 Date: Thu, 19 May 2022 19:52:47 -0400 Subject: [PATCH] C-Up Player Head Rotation Fix & Particle Flags Sync Fix (#99) Local head rotation is now no longer copied to all other players C-Up mode head rotation now sends to the other players through the player packet so others can see the head move around m->particleFlags are now synced to the other players now --- src/game/interaction.c | 6 ++-- src/game/mario.c | 22 ++++++++++---- src/game/mario.h | 1 + src/game/mario_actions_airborne.c | 40 +++++++++++++------------- src/game/mario_actions_automatic.c | 4 +-- src/game/mario_actions_cutscene.c | 18 ++++++------ src/game/mario_actions_moving.c | 36 +++++++++++------------ src/game/mario_actions_object.c | 2 +- src/game/mario_actions_stationary.c | 4 +-- src/game/mario_actions_submerged.c | 12 ++++---- src/game/mario_misc.c | 6 ++-- src/game/object_list_processor.c | 5 +++- src/pc/network/packets/packet_player.c | 3 ++ 13 files changed, 89 insertions(+), 70 deletions(-) diff --git a/src/game/interaction.c b/src/game/interaction.c index c9c9eaec..d51d99ec 100644 --- a/src/game/interaction.c +++ b/src/game/interaction.c @@ -755,7 +755,7 @@ void bounce_back_from_attack(struct MarioState *m, u32 interaction) { } if (m->playerIndex == 0) { set_camera_shake_from_hit(SHAKE_ATTACK); } - m->particleFlags |= PARTICLE_TRIANGLE; + set_mario_particle_flags(m, PARTICLE_TRIANGLE, FALSE); } if (interaction & (INT_PUNCH | INT_KICK | INT_TRIP | INT_FAST_ATTACK_OR_SHELL)) { @@ -2146,11 +2146,11 @@ void check_kick_or_punch_wall(struct MarioState *m) { mario_set_forward_vel(m, -48.0f); play_sound(SOUND_ACTION_HIT_2, m->marioObj->header.gfx.cameraToObject); - m->particleFlags |= PARTICLE_TRIANGLE; + set_mario_particle_flags(m, PARTICLE_TRIANGLE, FALSE); } else if (m->action & ACT_FLAG_AIR) { mario_set_forward_vel(m, -16.0f); play_sound(SOUND_ACTION_HIT_2, m->marioObj->header.gfx.cameraToObject); - m->particleFlags |= PARTICLE_TRIANGLE; + set_mario_particle_flags(m, PARTICLE_TRIANGLE, FALSE); } } } diff --git a/src/game/mario.c b/src/game/mario.c index 5dba7dc0..c467bd4f 100644 --- a/src/game/mario.c +++ b/src/game/mario.c @@ -302,15 +302,15 @@ void adjust_sound_for_speed(struct MarioState *m) { void play_sound_and_spawn_particles(struct MarioState *m, u32 soundBits, u32 waveParticleType) { if (m->terrainSoundAddend == (SOUND_TERRAIN_WATER << 16)) { if (waveParticleType != 0) { - m->particleFlags |= PARTICLE_SHALLOW_WATER_SPLASH; + set_mario_particle_flags(m, PARTICLE_SHALLOW_WATER_SPLASH, FALSE); } else { - m->particleFlags |= PARTICLE_SHALLOW_WATER_WAVE; + set_mario_particle_flags(m, PARTICLE_SHALLOW_WATER_WAVE, FALSE); } } else { if (m->terrainSoundAddend == (SOUND_TERRAIN_SAND << 16)) { - m->particleFlags |= PARTICLE_DIRT; + set_mario_particle_flags(m, PARTICLE_DIRT, FALSE); } else if (m->terrainSoundAddend == (SOUND_TERRAIN_SNOW << 16)) { - m->particleFlags |= PARTICLE_SNOW; + set_mario_particle_flags(m, PARTICLE_SNOW, FALSE); } } @@ -1596,7 +1596,7 @@ void set_submerged_cam_preset_and_spawn_bubbles(struct MarioState *m) { // of the water with his head out, spawn bubbles. if (!(m->action & ACT_FLAG_INTANGIBLE)) { if ((m->pos[1] < (f32)(m->waterLevel - 160)) || (m->faceAngle[0] < -0x800)) { - m->particleFlags |= PARTICLE_BUBBLE; + set_mario_particle_flags(m, PARTICLE_BUBBLE, FALSE); } } } @@ -2248,3 +2248,15 @@ void init_mario_from_save_file(void) { gHudDisplay.coins = 0; gHudDisplay.wedges = 8; } + +void set_mario_particle_flags(struct MarioState* m, u32 flags, u8 clear) { + if (m->playerIndex != 0) { + return; + } + + if (clear) { + m->particleFlags &= ~flags; + } else { + m->particleFlags |= flags; + } +} \ No newline at end of file diff --git a/src/game/mario.h b/src/game/mario.h index 67aa916a..5840e0a9 100644 --- a/src/game/mario.h +++ b/src/game/mario.h @@ -57,5 +57,6 @@ s32 force_idle_state(struct MarioState* m); void init_single_mario(struct MarioState* m); void init_mario(void); void init_mario_from_save_file(void); +void set_mario_particle_flags(struct MarioState* m, u32 flags, u8 clear); #endif // MARIO_H diff --git a/src/game/mario_actions_airborne.c b/src/game/mario_actions_airborne.c index 685ee2fe..9a4c8fc2 100644 --- a/src/game/mario_actions_airborne.c +++ b/src/game/mario_actions_airborne.c @@ -139,7 +139,7 @@ s32 check_fall_damage_or_get_stuck(struct MarioState *m, u32 hardFallAction) { #else play_character_sound(m, CHAR_SOUND_OOOF2); #endif - m->particleFlags |= PARTICLE_MIST_CIRCLE; + set_mario_particle_flags(m, PARTICLE_MIST_CIRCLE, FALSE); drop_and_set_mario_action(m, ACT_FEET_STUCK_IN_GROUND, 0); queue_rumble_data_mario(m, 5, 80); @@ -417,7 +417,7 @@ u32 common_air_action_step(struct MarioState *m, u32 landAction, s32 animation, // that the final quarter step detects a ledge, but you are // not able to ledge grab it. if (m->forwardVel >= 38.0f) { - m->particleFlags |= PARTICLE_VERTICAL_STAR; + set_mario_particle_flags(m, PARTICLE_VERTICAL_STAR, FALSE); set_mario_action(m, ACT_BACKWARD_AIR_KB, 0); } else { if (m->forwardVel > 8.0f) { @@ -762,7 +762,7 @@ s32 act_dive(struct MarioState *m) { #else play_character_sound(m, CHAR_SOUND_OOOF2); #endif - m->particleFlags |= PARTICLE_MIST_CIRCLE; + set_mario_particle_flags(m, PARTICLE_MIST_CIRCLE, FALSE); drop_and_set_mario_action(m, ACT_HEAD_STUCK_IN_GROUND, 0); } else if (!check_fall_damage(m, ACT_HARD_FORWARD_GROUND_KB)) { if (m->heldObj == NULL) { @@ -782,7 +782,7 @@ s32 act_dive(struct MarioState *m) { m->vel[1] = 0.0f; } - m->particleFlags |= PARTICLE_VERTICAL_STAR; + set_mario_particle_flags(m, PARTICLE_VERTICAL_STAR, FALSE); drop_and_set_mario_action(m, ACT_BACKWARD_AIR_KB, 0); break; @@ -958,12 +958,12 @@ s32 act_ground_pound(struct MarioState *m) { #else play_character_sound(m, CHAR_SOUND_OOOF2); #endif - m->particleFlags |= PARTICLE_MIST_CIRCLE; + set_mario_particle_flags(m, PARTICLE_MIST_CIRCLE, FALSE); set_mario_action(m, ACT_BUTT_STUCK_IN_GROUND, 0); } else { play_mario_heavy_landing_sound(m, SOUND_ACTION_TERRAIN_HEAVY_LANDING); if (!check_fall_damage(m, ACT_HARD_BACKWARD_GROUND_KB)) { - m->particleFlags |= PARTICLE_MIST_CIRCLE | PARTICLE_HORIZONTAL_STAR; + set_mario_particle_flags(m, (PARTICLE_MIST_CIRCLE | PARTICLE_HORIZONTAL_STAR), FALSE); set_mario_action(m, ACT_GROUND_POUND_LAND, 0); } } @@ -974,7 +974,7 @@ s32 act_ground_pound(struct MarioState *m) { m->vel[1] = 0.0f; } - m->particleFlags |= PARTICLE_VERTICAL_STAR; + set_mario_particle_flags(m, PARTICLE_VERTICAL_STAR, FALSE); set_mario_action(m, ACT_BACKWARD_AIR_KB, 0); } } @@ -992,7 +992,7 @@ s32 act_burning_jump(struct MarioState *m) { } set_mario_animation(m, m->actionArg == 0 ? MARIO_ANIM_SINGLE_JUMP : MARIO_ANIM_FIRE_LAVA_BURN); - m->particleFlags |= PARTICLE_FIRE; + set_mario_particle_flags(m, PARTICLE_FIRE, FALSE); play_sound(SOUND_MOVING_LAVA_BURN, m->marioObj->header.gfx.cameraToObject); m->marioObj->oMarioBurnTimer += 3; @@ -1020,7 +1020,7 @@ s32 act_burning_fall(struct MarioState *m) { } set_mario_animation(m, MARIO_ANIM_GENERAL_FALL); - m->particleFlags |= PARTICLE_FIRE; + set_mario_particle_flags(m, PARTICLE_FIRE, FALSE); m->marioObj->oMarioBurnTimer += 3; m->health -= 10; @@ -1085,7 +1085,7 @@ s32 act_crazy_box_bounce(struct MarioState *m) { set_mario_action(m, ACT_STOMACH_SLIDE, 0); } queue_rumble_data_mario(m, 5, 80); - m->particleFlags |= PARTICLE_MIST_CIRCLE; + set_mario_particle_flags(m, PARTICLE_MIST_CIRCLE, FALSE); break; case AIR_STEP_HIT_WALL: @@ -1334,7 +1334,7 @@ s32 act_air_hit_wall(struct MarioState *m) { m->vel[1] = 0.0f; } - m->particleFlags |= PARTICLE_VERTICAL_STAR; + set_mario_particle_flags(m, PARTICLE_VERTICAL_STAR, FALSE); return set_mario_action(m, ACT_BACKWARD_AIR_KB, 0); } else { m->wallKickTimer = 5; @@ -1465,7 +1465,7 @@ s32 act_butt_slide_air(struct MarioState *m) { if (m->vel[1] > 0.0f) { m->vel[1] = 0.0f; } - m->particleFlags |= PARTICLE_VERTICAL_STAR; + set_mario_particle_flags(m, PARTICLE_VERTICAL_STAR, FALSE); set_mario_action(m, ACT_BACKWARD_AIR_KB, 0); break; @@ -1506,7 +1506,7 @@ s32 act_hold_butt_slide_air(struct MarioState *m) { } mario_drop_held_object(m); - m->particleFlags |= PARTICLE_VERTICAL_STAR; + set_mario_particle_flags(m, PARTICLE_VERTICAL_STAR, FALSE); set_mario_action(m, ACT_BACKWARD_AIR_KB, 0); break; @@ -1566,7 +1566,7 @@ s32 act_lava_boost(struct MarioState *m) { set_mario_animation(m, MARIO_ANIM_FIRE_LAVA_BURN); if ((m->area->terrainType & TERRAIN_MASK) != TERRAIN_SNOW && !(m->flags & MARIO_METAL_CAP) && m->vel[1] > 0.0f) { - m->particleFlags |= PARTICLE_FIRE; + set_mario_particle_flags(m, PARTICLE_FIRE, FALSE); if (m->actionState == 0) { play_sound(SOUND_MOVING_LAVA_BURN, m->marioObj->header.gfx.cameraToObject); } @@ -1637,7 +1637,7 @@ s32 act_slide_kick(struct MarioState *m) { m->vel[1] = 0.0f; } - m->particleFlags |= PARTICLE_VERTICAL_STAR; + set_mario_particle_flags(m, PARTICLE_VERTICAL_STAR, FALSE); set_mario_action(m, ACT_BACKWARD_AIR_KB, 0); break; @@ -1731,7 +1731,7 @@ s32 act_shot_from_cannon(struct MarioState *m) { m->vel[1] = 0.0f; } - m->particleFlags |= PARTICLE_VERTICAL_STAR; + set_mario_particle_flags(m, PARTICLE_VERTICAL_STAR, FALSE); set_mario_action(m, ACT_BACKWARD_AIR_KB, 0); #ifndef BETTERCAMERA if (allowCameraChange) { set_camera_mode(m->area->camera, m->area->camera->defMode, 1); } @@ -1762,7 +1762,7 @@ s32 act_shot_from_cannon(struct MarioState *m) { } if (m->vel[1] > 0.0f) { - m->particleFlags |= PARTICLE_DUST; + set_mario_particle_flags(m, PARTICLE_DUST, FALSE); } reset_rumble_timers(m); @@ -1897,7 +1897,7 @@ s32 act_flying(struct MarioState *m) { : SOUND_ACTION_BONK, m->marioObj->header.gfx.cameraToObject); - m->particleFlags |= PARTICLE_VERTICAL_STAR; + set_mario_particle_flags(m, PARTICLE_VERTICAL_STAR, FALSE); set_mario_action(m, ACT_BACKWARD_AIR_KB, 0); if (m->playerIndex == 0) { @@ -1938,7 +1938,7 @@ s32 act_flying(struct MarioState *m) { } if (m->faceAngle[0] > 0x800 && m->forwardVel >= 48.0f) { - m->particleFlags |= PARTICLE_DUST; + set_mario_particle_flags(m, PARTICLE_DUST, FALSE); } if (startPitch <= 0 && m->faceAngle[0] > 0 && m->forwardVel >= 48.0f) { @@ -2170,7 +2170,7 @@ s32 act_special_triple_jump(struct MarioState *m) { set_mario_animation(m, MARIO_ANIM_GENERAL_FALL); } - m->particleFlags |= PARTICLE_SPARKLES; + set_mario_particle_flags(m, PARTICLE_SPARKLES, FALSE); return FALSE; } diff --git a/src/game/mario_actions_automatic.c b/src/game/mario_actions_automatic.c index 418f8e87..e56eb8fd 100644 --- a/src/game/mario_actions_automatic.c +++ b/src/game/mario_actions_automatic.c @@ -44,7 +44,7 @@ void add_tree_leaf_particles(struct MarioState *m) { leafHeight = 100.0f; } if (m->pos[1] - m->floorHeight > leafHeight) { - m->particleFlags |= PARTICLE_LEAF; + set_mario_particle_flags(m, PARTICLE_LEAF, FALSE); } } } @@ -187,7 +187,7 @@ s32 act_holding_pole(struct MarioState *m) { //! The Shifting Sand Land palm tree check is done climbing up in // add_tree_leaf_particles, but not here, when climbing down. if (m->pos[1] - m->floorHeight > 100.0f) { - m->particleFlags |= PARTICLE_LEAF; + set_mario_particle_flags(m, PARTICLE_LEAF, FALSE); } } play_climbing_sounds(m, 2); diff --git a/src/game/mario_actions_cutscene.c b/src/game/mario_actions_cutscene.c index 31b06302..54cf3851 100644 --- a/src/game/mario_actions_cutscene.c +++ b/src/game/mario_actions_cutscene.c @@ -762,7 +762,7 @@ s32 act_star_dance_water(struct MarioState *m) { s32 act_fall_after_star_grab(struct MarioState *m) { if (m->pos[1] < m->waterLevel - 130) { play_sound(SOUND_ACTION_UNKNOWN430, m->marioObj->header.gfx.cameraToObject); - m->particleFlags |= PARTICLE_WATER_SPLASH; + set_mario_particle_flags(m, PARTICLE_WATER_SPLASH, FALSE); return set_mario_action(m, ACT_STAR_DANCE_WATER, m->actionArg); } if (perform_air_step(m, 1) == AIR_STEP_LANDED) { @@ -1241,7 +1241,7 @@ s32 act_exit_airborne(struct MarioState *m) { } // rotate him to face away from the entrance m->marioObj->header.gfx.angle[1] += 0x8000; - m->particleFlags |= PARTICLE_SPARKLES; + set_mario_particle_flags(m, PARTICLE_SPARKLES, FALSE); return FALSE; } @@ -1252,7 +1252,7 @@ s32 act_falling_exit_airborne(struct MarioState *m) { } // rotate Mario to face away from the entrance m->marioObj->header.gfx.angle[1] += 0x8000; - m->particleFlags |= PARTICLE_SPARKLES; + set_mario_particle_flags(m, PARTICLE_SPARKLES, FALSE); return FALSE; } @@ -1409,7 +1409,7 @@ s32 act_special_exit_airborne(struct MarioState *m) { m->actionArg = 1; } - m->particleFlags |= PARTICLE_SPARKLES; + set_mario_particle_flags(m, PARTICLE_SPARKLES, FALSE); // rotate Mario to face away from the entrance marioObj->header.gfx.angle[1] += 0x8000; // show Mario @@ -2121,7 +2121,7 @@ static s32 jumbo_star_cutscene_taking_off(struct MarioState *m) { play_character_sound(m, CHAR_SOUND_YAHOO); break; } - m->particleFlags |= PARTICLE_SPARKLES; + set_mario_particle_flags(m, PARTICLE_SPARKLES, FALSE); if (is_anim_past_end(m)) { advance_cutscene_step(m); @@ -2180,7 +2180,7 @@ static s32 jumbo_star_cutscene_flying(struct MarioState *m) { m->marioBodyState->handState = MARIO_HAND_RIGHT_OPEN; vec3f_copy(m->marioObj->header.gfx.pos, m->pos); - m->particleFlags |= PARTICLE_SPARKLES; + set_mario_particle_flags(m, PARTICLE_SPARKLES, FALSE); if (m->actionTimer++ == 500 && m->playerIndex == 0) { level_trigger_warp(m, WARP_OP_CREDITS_START); @@ -2419,7 +2419,7 @@ static void end_peach_cutscene_run_to_peach(struct MarioState *m) { play_step_sound(m, 9, 45); vec3f_copy(m->marioObj->header.gfx.pos, m->pos); - m->particleFlags |= PARTICLE_DUST; + set_mario_particle_flags(m, PARTICLE_DUST, FALSE); } // dialog 1 @@ -2858,7 +2858,7 @@ static s32 act_credits_cutscene(struct MarioState *m) { vec3f_copy(m->marioObj->header.gfx.pos, m->pos); // will copy over roll and pitch, if set vec3s_copy(m->marioObj->header.gfx.angle, m->faceAngle); - m->particleFlags |= PARTICLE_BUBBLE; + set_mario_particle_flags(m, PARTICLE_BUBBLE, FALSE); } else { set_mario_animation(m, MARIO_ANIM_FIRST_PERSON); if (m->actionTimer > 0) { @@ -3027,7 +3027,7 @@ s32 mario_execute_cutscene_action(struct MarioState *m) { } if (!cancel && (m->input & INPUT_IN_WATER)) { - m->particleFlags |= PARTICLE_IDLE_WATER_WAVE; + set_mario_particle_flags(m, PARTICLE_IDLE_WATER_WAVE, FALSE); } return cancel; diff --git a/src/game/mario_actions_moving.c b/src/game/mario_actions_moving.c index 8d4fe3d3..032ef80d 100644 --- a/src/game/mario_actions_moving.c +++ b/src/game/mario_actions_moving.c @@ -712,7 +712,7 @@ void push_or_sidle_wall(struct MarioState *m, Vec3f startPos) { if (m->marioObj->header.gfx.animInfo.animFrame < 20) { play_sound(SOUND_MOVING_TERRAIN_SLIDE + m->terrainSoundAddend, m->marioObj->header.gfx.cameraToObject); - m->particleFlags |= PARTICLE_DUST; + set_mario_particle_flags(m, PARTICLE_DUST, FALSE); } m->actionState = 1; @@ -836,7 +836,7 @@ s32 act_walking(struct MarioState *m) { case GROUND_STEP_NONE: anim_and_audio_for_walk(m); if (m->intendedMag - m->forwardVel > 16.0f) { - m->particleFlags |= PARTICLE_DUST; + set_mario_particle_flags(m, PARTICLE_DUST, FALSE); } break; @@ -879,7 +879,7 @@ s32 act_move_punching(struct MarioState *m) { break; case GROUND_STEP_NONE: - m->particleFlags |= PARTICLE_DUST; + set_mario_particle_flags(m, PARTICLE_DUST, FALSE); break; } @@ -934,7 +934,7 @@ s32 act_hold_walking(struct MarioState *m) { anim_and_audio_for_hold_walk(m); if (0.4f * m->intendedMag - m->forwardVel > 10.0f) { - m->particleFlags |= PARTICLE_DUST; + set_mario_particle_flags(m, PARTICLE_DUST, FALSE); } return FALSE; @@ -1004,7 +1004,7 @@ s32 act_turning_around(struct MarioState *m) { break; case GROUND_STEP_NONE: - m->particleFlags |= PARTICLE_DUST; + set_mario_particle_flags(m, PARTICLE_DUST, FALSE); break; } @@ -1069,7 +1069,7 @@ s32 act_braking(struct MarioState *m) { break; case GROUND_STEP_NONE: - m->particleFlags |= PARTICLE_DUST; + set_mario_particle_flags(m, PARTICLE_DUST, FALSE); break; case GROUND_STEP_HIT_WALL: @@ -1131,7 +1131,7 @@ s32 act_decelerating(struct MarioState *m) { set_mario_animation(m, MARIO_ANIM_IDLE_HEAD_LEFT); play_sound(SOUND_MOVING_TERRAIN_SLIDE + m->terrainSoundAddend, m->marioObj->header.gfx.cameraToObject); adjust_sound_for_speed(m); - m->particleFlags |= PARTICLE_DUST; + set_mario_particle_flags(m, PARTICLE_DUST, FALSE); } else { // (Speed Crash) Crashes if speed exceeds 2^17. if ((val0C = (s32)(m->forwardVel / 4.0f * 0x10000)) < 0x1000) { @@ -1197,7 +1197,7 @@ s32 act_hold_decelerating(struct MarioState *m) { set_mario_animation(m, MARIO_ANIM_IDLE_WITH_LIGHT_OBJ); play_sound(SOUND_MOVING_TERRAIN_SLIDE + m->terrainSoundAddend, m->marioObj->header.gfx.cameraToObject); adjust_sound_for_speed(m); - m->particleFlags |= PARTICLE_DUST; + set_mario_particle_flags(m, PARTICLE_DUST, FALSE); } else { //! (Speed Crash) This crashes if Mario has more speed than 2^15 speed. if ((val0C = (s32)(m->forwardVel * 0x10000)) < 0x1000) { @@ -1238,7 +1238,7 @@ s32 act_riding_shell_ground(struct MarioState *m) { mario_stop_riding_object(m); play_sound(m->flags & MARIO_METAL_CAP ? SOUND_ACTION_METAL_BONK : SOUND_ACTION_BONK, m->marioObj->header.gfx.cameraToObject); - m->particleFlags |= PARTICLE_VERTICAL_STAR; + set_mario_particle_flags(m, PARTICLE_VERTICAL_STAR, FALSE); set_mario_action(m, ACT_BACKWARD_GROUND_KB, 0); break; } @@ -1348,7 +1348,7 @@ s32 act_burning_ground(struct MarioState *m) { set_mario_anim_with_accel(m, MARIO_ANIM_RUNNING, (s32)(m->forwardVel / 2.0f * 0x10000)); play_step_sound(m, 9, 45); - m->particleFlags |= PARTICLE_FIRE; + set_mario_particle_flags(m, PARTICLE_FIRE, FALSE); play_sound(SOUND_MOVING_LAVA_BURN, m->marioObj->header.gfx.cameraToObject); m->health -= 10; @@ -1393,16 +1393,16 @@ void common_slide_action(struct MarioState *m, u32 endAction, u32 airAction, s32 case GROUND_STEP_NONE: set_mario_animation(m, animation); align_with_floor(m); - m->particleFlags |= PARTICLE_DUST; + set_mario_particle_flags(m, PARTICLE_DUST, FALSE); break; case GROUND_STEP_HIT_WALL: if (!mario_floor_is_slippery(m)) { #ifdef VERSION_JP - m->particleFlags |= PARTICLE_VERTICAL_STAR; + set_mario_particle_flags(m, PARTICLE_VERTICAL_STAR, FALSE); #else if (m->forwardVel > 16.0f) { - m->particleFlags |= PARTICLE_VERTICAL_STAR; + set_mario_particle_flags(m, PARTICLE_VERTICAL_STAR, FALSE); } #endif slide_bonk(m, ACT_GROUND_BONK, endAction); @@ -1519,13 +1519,13 @@ s32 act_slide_kick_slide(struct MarioState *m) { case GROUND_STEP_HIT_WALL: mario_bonk_reflection(m, TRUE); - m->particleFlags |= PARTICLE_VERTICAL_STAR; + set_mario_particle_flags(m, PARTICLE_VERTICAL_STAR, FALSE); set_mario_action(m, ACT_BACKWARD_GROUND_KB, 0); break; } play_sound(SOUND_MOVING_TERRAIN_SLIDE + m->terrainSoundAddend, m->marioObj->header.gfx.cameraToObject); - m->particleFlags |= PARTICLE_DUST; + set_mario_particle_flags(m, PARTICLE_DUST, FALSE); return FALSE; } @@ -1761,7 +1761,7 @@ u32 common_landing_action(struct MarioState *m, s16 animation, u32 airAction) { } if (m->forwardVel > 16.0f) { - m->particleFlags |= PARTICLE_DUST; + set_mario_particle_flags(m, PARTICLE_DUST, FALSE); } set_mario_animation(m, animation); @@ -2052,8 +2052,8 @@ s32 mario_execute_moving_action(struct MarioState *m) { } if (!cancel && (m->input & INPUT_IN_WATER)) { - m->particleFlags |= PARTICLE_WAVE_TRAIL; - m->particleFlags &= ~PARTICLE_DUST; + set_mario_particle_flags(m, PARTICLE_WAVE_TRAIL, FALSE); + set_mario_particle_flags(m, PARTICLE_DUST, TRUE); } return cancel; diff --git a/src/game/mario_actions_object.c b/src/game/mario_actions_object.c index cea69762..c45bf7ab 100644 --- a/src/game/mario_actions_object.c +++ b/src/game/mario_actions_object.c @@ -515,7 +515,7 @@ s32 mario_execute_object_action(struct MarioState *m) { } if (!cancel && (m->input & INPUT_IN_WATER)) { - m->particleFlags |= PARTICLE_IDLE_WATER_WAVE; + set_mario_particle_flags(m, PARTICLE_IDLE_WATER_WAVE, FALSE); } return cancel; diff --git a/src/game/mario_actions_stationary.c b/src/game/mario_actions_stationary.c index c5d4813f..701f1bc9 100644 --- a/src/game/mario_actions_stationary.c +++ b/src/game/mario_actions_stationary.c @@ -397,7 +397,7 @@ s32 act_shivering(struct MarioState *m) { case 0: animFrame = set_mario_animation(m, MARIO_ANIM_SHIVERING_WARMING_HAND); if (animFrame == 49) { - m->particleFlags |= PARTICLE_BREATH; + set_mario_particle_flags(m, PARTICLE_BREATH, FALSE); play_character_sound(m, CHAR_SOUND_PANTING_COLD); } if (animFrame == 7 || animFrame == 81) { @@ -1178,7 +1178,7 @@ s32 mario_execute_stationary_action(struct MarioState *m) { } if (!cancel && (m->input & INPUT_IN_WATER)) { - m->particleFlags |= PARTICLE_IDLE_WATER_WAVE; + set_mario_particle_flags(m, PARTICLE_IDLE_WATER_WAVE, FALSE); } return cancel; diff --git a/src/game/mario_actions_submerged.c b/src/game/mario_actions_submerged.c index 9e48096c..e9eaaba1 100644 --- a/src/game/mario_actions_submerged.c +++ b/src/game/mario_actions_submerged.c @@ -45,7 +45,7 @@ void set_swimming_at_surface_particles(struct MarioState *m, u32 particleFlag) { u16 pIndex = m->playerIndex; if (atSurface) { - m->particleFlags |= particleFlag; + set_mario_particle_flags(m, particleFlag, FALSE); if (atSurface ^ sWasAtSurface[pIndex]) { play_sound(SOUND_ACTION_UNKNOWN431, m->marioObj->header.gfx.cameraToObject); } @@ -1024,7 +1024,7 @@ static s32 act_water_plunge(struct MarioState *m) { play_character_sound(m, CHAR_SOUND_HAHA_2); } - m->particleFlags |= PARTICLE_WATER_SPLASH; + set_mario_particle_flags(m, PARTICLE_WATER_SPLASH, FALSE); m->actionState = 1; if (m->prevAction & ACT_FLAG_AIR) { queue_rumble_data_mario(m, 5, 80); @@ -1076,7 +1076,7 @@ static s32 act_water_plunge(struct MarioState *m) { break; } - m->particleFlags |= PARTICLE_PLUNGE_BUBBLE; + set_mario_particle_flags(m, PARTICLE_PLUNGE_BUBBLE, FALSE); return FALSE; } @@ -1157,7 +1157,7 @@ static s32 act_caught_in_whirlpool(struct MarioState *m) { static void play_metal_water_jumping_sound(struct MarioState *m, u32 landing) { if (!(m->flags & MARIO_ACTION_SOUND_PLAYED)) { - m->particleFlags |= PARTICLE_MIST_CIRCLE; + set_mario_particle_flags(m, PARTICLE_MIST_CIRCLE, FALSE); } play_sound_if_no_flag(m, landing ? SOUND_ACTION_METAL_LAND_WATER : SOUND_ACTION_METAL_JUMP_WATER, @@ -1167,7 +1167,7 @@ static void play_metal_water_jumping_sound(struct MarioState *m, u32 landing) { static void play_metal_water_walking_sound(struct MarioState *m) { if (is_anim_past_frame(m, 10) || is_anim_past_frame(m, 49)) { play_sound(SOUND_ACTION_METAL_STEP_WATER, m->marioObj->header.gfx.cameraToObject); - m->particleFlags |= PARTICLE_DUST; + set_mario_particle_flags(m, PARTICLE_DUST, FALSE); } } @@ -1257,7 +1257,7 @@ static s32 act_metal_water_standing(struct MarioState *m) { stop_and_set_height_to_floor(m); if (m->pos[1] >= m->waterLevel - 150) { - m->particleFlags |= PARTICLE_IDLE_WATER_WAVE; + set_mario_particle_flags(m, PARTICLE_IDLE_WATER_WAVE, FALSE); } return FALSE; diff --git a/src/game/mario_misc.c b/src/game/mario_misc.c index dd06e04c..c8d98957 100644 --- a/src/game/mario_misc.c +++ b/src/game/mario_misc.c @@ -539,9 +539,9 @@ Gfx* geo_mario_head_rotation(s32 callContext, struct GraphNode* node, Mat4* c) { if (!marioActive) { node->flags &= ~GRAPH_RENDER_ACTIVE; - } else if (camera->mode == CAMERA_MODE_C_UP) { - rotNode->rotation[0] = gPlayerCameraState->headRotation[1]; - rotNode->rotation[2] = gPlayerCameraState->headRotation[0]; + } else if (((plrIdx == 0) && (camera->mode == CAMERA_MODE_C_UP)) || ((plrIdx != 0) && (action == ACT_FIRST_PERSON))) { + rotNode->rotation[0] = gPlayerCameraState[plrIdx].headRotation[1]; + rotNode->rotation[2] = gPlayerCameraState[plrIdx].headRotation[0]; } else if (action & ACT_FLAG_WATER_OR_TEXT) { rotNode->rotation[0] = bodyState->headAngle[1]; diff --git a/src/game/object_list_processor.c b/src/game/object_list_processor.c index 390caf38..561b83b5 100644 --- a/src/game/object_list_processor.c +++ b/src/game/object_list_processor.c @@ -281,7 +281,10 @@ void bhv_mario_update(void) { vec3f_copy(gMarioState->marioBodyState->torsoPos, gMarioState->pos); } - gMarioState->particleFlags = 0; + if (stateIndex == 0) { + gMarioState->particleFlags = 0; + } + smlua_call_event_hooks_mario_param(HOOK_BEFORE_MARIO_UPDATE, gMarioState); u32 particleFlags = 0; diff --git a/src/pc/network/packets/packet_player.c b/src/pc/network/packets/packet_player.c index 916dd35e..a120f3c7 100644 --- a/src/pc/network/packets/packet_player.c +++ b/src/pc/network/packets/packet_player.c @@ -59,6 +59,7 @@ struct PacketPlayerData { u8 squishTimer; f32 peakHeight; s16 currentRoom; + Vec3s headRotation; u8 customFlags; u8 heldSyncID; @@ -121,6 +122,7 @@ static void read_packet_data(struct PacketPlayerData* data, struct MarioState* m data->squishTimer = m->squishTimer; data->peakHeight = m->peakHeight; data->currentRoom = m->currentRoom; + memcpy(data->headRotation, gPlayerCameraState[m->playerIndex].headRotation, sizeof(s16) * 3); data->customFlags = customFlags; data->heldSyncID = heldSyncID; @@ -176,6 +178,7 @@ static void write_packet_data(struct PacketPlayerData* data, struct MarioState* m->squishTimer = data->squishTimer; m->peakHeight = data->peakHeight; m->currentRoom = data->currentRoom; + memcpy(gPlayerCameraState[m->playerIndex].headRotation, data->headRotation, sizeof(s16) * 3); *customFlags = data->customFlags; *heldSyncID = data->heldSyncID;