From 96288326b596006241fd9ea6b1b25cb4ef663760 Mon Sep 17 00:00:00 2001 From: MysterD Date: Thu, 26 Aug 2021 18:02:07 -0700 Subject: [PATCH] Fixed late-join for Act 1 BBH staircase --- src/game/behaviors/boo.inc.c | 24 +++++++++++++++++++++--- src/pc/network/network.h | 1 + src/pc/network/packets/packet_object.c | 9 +++++++++ 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/game/behaviors/boo.inc.c b/src/game/behaviors/boo.inc.c index a9be437d6..f85d75d64 100644 --- a/src/game/behaviors/boo.inc.c +++ b/src/game/behaviors/boo.inc.c @@ -719,9 +719,12 @@ static void big_boo_act_4(void) { if (o->oTimer > 60 && distanceToPlayer < 600.0f) { obj_set_pos(o, 973, 0, 717); - spawn_object_relative(0, 0, 0, 0, o, MODEL_BBH_STAIRCASE_STEP, bhvBooBossSpawnedBridge); - spawn_object_relative(1, 0, 0, -200, o, MODEL_BBH_STAIRCASE_STEP, bhvBooBossSpawnedBridge); - spawn_object_relative(2, 0, 0, 200, o, MODEL_BBH_STAIRCASE_STEP, bhvBooBossSpawnedBridge); + struct Object* spawnedBridge = cur_obj_nearest_object_with_behavior(bhvBooBossSpawnedBridge); + if (spawnedBridge == NULL) { + spawn_object_relative(0, 0, 0, 0, o, MODEL_BBH_STAIRCASE_STEP, bhvBooBossSpawnedBridge); + spawn_object_relative(1, 0, 0, -200, o, MODEL_BBH_STAIRCASE_STEP, bhvBooBossSpawnedBridge); + spawn_object_relative(2, 0, 0, 200, o, MODEL_BBH_STAIRCASE_STEP, bhvBooBossSpawnedBridge); + } obj_mark_for_deletion(o); } @@ -742,6 +745,20 @@ u8 big_boo_ignore_update(void) { return o->oHealth == 0 || (cur_obj_has_behavior(bhvGhostHuntBigBoo) && !bigBooActivated); } +void big_boo_on_forget(void) { + if (o == NULL) { return; } + if (o->behavior != bhvGhostHuntBigBoo) { return; } + struct Object* spawnedBridge = cur_obj_nearest_object_with_behavior(bhvBooBossSpawnedBridge); + if (spawnedBridge == NULL && o->oBehParams2ndByte == 0) { + obj_set_pos(o, 973, 0, 717); + obj_set_angle(o, 0, 0, 0); + + spawn_object_relative(0, 0, 0, 0, o, MODEL_BBH_STAIRCASE_STEP, bhvBooBossSpawnedBridge); + spawn_object_relative(1, 0, 0, -200, o, MODEL_BBH_STAIRCASE_STEP, bhvBooBossSpawnedBridge); + spawn_object_relative(2, 0, 0, 200, o, MODEL_BBH_STAIRCASE_STEP, bhvBooBossSpawnedBridge); + } +} + void bhv_big_boo_loop(void) { if (o->oAction == 0) { if (!network_sync_object_initialized(o)) { @@ -749,6 +766,7 @@ void bhv_big_boo_loop(void) { struct SyncObject* so = boo_network_init_object(); so->syncDeathEvent = FALSE; so->ignore_if_true = big_boo_ignore_update; + so->on_forget = big_boo_on_forget; } } else if (o->oHealth <= 0) { if (network_sync_object_initialized(o)) { diff --git a/src/pc/network/network.h b/src/pc/network/network.h index ceb4ec8c0..20367f4b8 100644 --- a/src/pc/network/network.h +++ b/src/pc/network/network.h @@ -71,6 +71,7 @@ struct SyncObject { void (*on_sent_pre)(void); void (*on_sent_post)(void); void (*override_ownership)(u8* shouldOverride, u8* shouldOwn); + void (*on_forget)(void); void* extraFields[MAX_SYNC_OBJECT_FIELDS]; }; diff --git a/src/pc/network/packets/packet_object.c b/src/pc/network/packets/packet_object.c index 3e97a6d08..4762c93de 100644 --- a/src/pc/network/packets/packet_object.c +++ b/src/pc/network/packets/packet_object.c @@ -9,6 +9,7 @@ #include "src/game/memory.h" #include "src/game/object_helpers.h" #include "src/game/obj_behaviors.h" +#include "src/game/object_list_processor.h" #include "src/game/area.h" #include "pc/debuglog.h" #include "pc/utils/misc.h" @@ -135,6 +136,7 @@ struct SyncObject* network_init_object(struct Object *o, float maxSyncDistance) so->on_sent_pre = NULL; so->on_sent_post = NULL; so->override_ownership = NULL; + so->on_forget = NULL; so->syncDeathEvent = true; so->randomSeed = (u16)(o->oSyncID * 7951); memset(so->extraFields, 0, sizeof(void*) * MAX_SYNC_OBJECT_FIELDS); @@ -620,6 +622,13 @@ void network_forget_sync_object(struct SyncObject* so) { area_remove_sync_ids_add(syncId); } + if (so->on_forget != NULL) { + struct Object* lastObject = gCurrentObject; + gCurrentObject = so->o; + so->on_forget(); + gCurrentObject = lastObject; + } + so->o = NULL; so->behavior = NULL; so->owned = false;