diff --git a/src/game/behaviors/bub.inc.c b/src/game/behaviors/bub.inc.c index 7bf71690..1dc25d78 100644 --- a/src/game/behaviors/bub.inc.c +++ b/src/game/behaviors/bub.inc.c @@ -20,8 +20,11 @@ void bub_spawner_act_0(void) { } void bub_spawner_act_1(void) { - if (gMarioObject->oPosY - o->oPosY > 2000.0f) +#ifndef NODRAWINGDISTANCE + struct Object* player = nearest_player_to_object(o); + if (player->oPosY - o->oPosY > 2000.0f) o->oAction = 2; +#endif } void bub_spawner_act_2(void) { @@ -55,12 +58,14 @@ void bub_act_0(void) { } void bub_act_1(void) { + struct Object* player = nearest_player_to_object(o); + int distanceToPlayer = dist_between_objects(o, player); f32 dy; if (o->oTimer == 0) { o->oForwardVel = random_float() * 2 + 2; o->oCheepCheepUnk108 = random_float(); } - dy = o->oPosY - gMarioObject->oPosY; + dy = o->oPosY - player->oPosY; if (o->oPosY < o->oCheepCheepUnkF4 - 50.0f) { if (dy < 0.0f) dy = 0.0f - dy; @@ -77,13 +82,15 @@ void bub_act_1(void) { o->oAngleToMario = cur_obj_angle_to_home(); cur_obj_rotate_yaw_toward(o->oAngleToMario, 0x100); if (o->oDistanceToMario < 200.0f) - if (o->oCheepCheepUnk108 < 0.5) + if (distanceToPlayer < 0.5) o->oAction = 2; if (o->oInteractStatus & INT_STATUS_INTERACTED) o->oAction = 2; } void bub_act_2(void) { + struct Object* player = nearest_player_to_object(o); + int angleToPlayer = obj_angle_to_object(o, player); f32 dy; if (o->oTimer < 20) { if (o->oInteractStatus & INT_STATUS_INTERACTED) @@ -94,7 +101,7 @@ void bub_act_2(void) { cur_obj_play_sound_2(SOUND_GENERAL_MOVING_WATER); if (o->oForwardVel == 0.0f) o->oForwardVel = 6.0f; - dy = o->oPosY - gMarioObject->oPosY; + dy = o->oPosY - player->oPosY; if (o->oPosY < o->oCheepCheepUnkF4 - 50.0f) { if (dy < 0.0f) dy = 0.0f - dy; @@ -108,8 +115,8 @@ void bub_act_2(void) { o->oPosY -= 1.0f; } if (cur_obj_lateral_dist_from_mario_to_home() > 800.0f) - o->oAngleToMario = cur_obj_angle_to_home(); - cur_obj_rotate_yaw_toward(o->oAngleToMario + 0x8000, 0x400); + angleToPlayer = cur_obj_angle_to_home(); + cur_obj_rotate_yaw_toward(angleToPlayer + 0x8000, 0x400); if (o->oTimer > 200 && o->oDistanceToMario > 600.0f) o->oAction = 1; } @@ -117,8 +124,19 @@ void bub_act_2(void) { void (*sCheepCheepActions[])(void) = { bub_act_0, bub_act_1, bub_act_2 }; void bhv_bub_loop(void) { + if (!network_sync_object_initialized(o)) { + network_init_object(o, 4000.0f); + network_init_object_field(o, &o->oCheepCheepUnkF4); + network_init_object_field(o, &o->oCheepCheepUnkF8); + network_init_object_field(o, &o->oCheepCheepUnkFC); + network_init_object_field(o, &o->oCheepCheepUnk104); + network_init_object_field(o, &o->oCheepCheepUnk108); + } + + struct Object* player = nearest_player_to_object(o); + o->oCheepCheepUnkF4 = find_water_level(o->oPosX, o->oPosZ); - o->oCheepCheepUnkF8 = gMarioObject->oPosY + o->oCheepCheepUnkFC; + o->oCheepCheepUnkF8 = player->oPosY + o->oCheepCheepUnkFC; o->oWallHitboxRadius = 30.0f; cur_obj_update_floor_and_walls(); cur_obj_call_action_function(sCheepCheepActions);