From 45286eb46e12e94a3ba531d55ed970d764092f6d Mon Sep 17 00:00:00 2001 From: MysterD Date: Tue, 29 Mar 2022 19:29:57 -0700 Subject: [PATCH] Specify sync object field size --- src/game/behaviors/bowser.inc.c | 4 ++-- src/game/behaviors/chain_chomp.inc.c | 2 +- .../behaviors/controllable_platform.inc.c | 7 +++---- .../behaviors/flying_bookend_switch.inc.c | 2 +- src/game/behaviors/grand_star.inc.c | 2 +- src/game/behaviors/hoot.inc.c | 2 +- src/game/behaviors/klepto.inc.c | 2 +- src/game/behaviors/monty_mole.inc.c | 2 +- src/game/behaviors/mushroom_1up.inc.c | 14 ++++++------- src/game/behaviors/pyramid_top.inc.c | 2 +- src/game/behaviors/thi_top.inc.c | 2 +- src/game/behaviors/ukiki.inc.c | 2 +- src/game/behaviors/wdw_water_level.inc.c | 2 +- src/pc/network/network.h | 1 + src/pc/network/packets/packet.h | 1 + src/pc/network/packets/packet_object.c | 21 +++++++++++++++++-- 16 files changed, 43 insertions(+), 25 deletions(-) diff --git a/src/game/behaviors/bowser.inc.c b/src/game/behaviors/bowser.inc.c index 49182883b..42d19c5a1 100644 --- a/src/game/behaviors/bowser.inc.c +++ b/src/game/behaviors/bowser.inc.c @@ -1355,9 +1355,9 @@ void bhv_bowser_init(void) { so->override_ownership = bhv_bowser_override_ownership; so->ignore_if_true = bhv_bowser_ignore_if_true; so->fullObjectSync = TRUE; - network_init_object_field(o, &o->header.gfx.node.flags); + network_init_object_field_with_size(o, &o->header.gfx.node.flags, 16); + network_init_object_field_with_size(o, &o->header.gfx.animInfo.animFrame, 16); network_init_object_field(o, &networkBowserAnimationIndex); - network_init_object_field(o, &o->header.gfx.animInfo.animFrame); network_init_object_field(o, &o->header.gfx.scale[0]); network_init_object_field(o, &o->header.gfx.scale[1]); network_init_object_field(o, &o->header.gfx.scale[2]); diff --git a/src/game/behaviors/chain_chomp.inc.c b/src/game/behaviors/chain_chomp.inc.c index e7167144c..f41f212ae 100644 --- a/src/game/behaviors/chain_chomp.inc.c +++ b/src/game/behaviors/chain_chomp.inc.c @@ -455,7 +455,7 @@ void bhv_chain_chomp_update(void) { if (so) { so->syncDeathEvent = FALSE; network_init_object_field(o, &o->oChainChompUnk104); - network_init_object_field(o, &o->header.gfx.animInfo.animFrame); + network_init_object_field_with_size(o, &o->header.gfx.animInfo.animFrame, 16); } } diff --git a/src/game/behaviors/controllable_platform.inc.c b/src/game/behaviors/controllable_platform.inc.c index a7c37c2f9..9201b3056 100644 --- a/src/game/behaviors/controllable_platform.inc.c +++ b/src/game/behaviors/controllable_platform.inc.c @@ -77,7 +77,6 @@ void bhv_controllable_platform_init(void) { o->oControllablePlatformUnkFC = o->oPosY; network_init_object(o, SYNC_DISTANCE_ONLY_EVENTS); - network_init_object_field(o, &D_80331694); network_init_object_field(o, &o->oPosX); network_init_object_field(o, &o->oPosY); network_init_object_field(o, &o->oPosZ); @@ -87,15 +86,15 @@ void bhv_controllable_platform_init(void) { network_init_object_field(o, &o->oAction); network_init_object_field(o, &o->oPrevAction); network_init_object_field(o, &o->oTimer); - network_init_object_field(o, &o->activeFlags); - network_init_object_field(o, &o->header.gfx.node.flags); + network_init_object_field_with_size(o, &o->activeFlags, 16); + network_init_object_field_with_size(o, &D_80331694, 8); + network_init_object_field_with_size(o, &o->header.gfx.node.flags, 16); network_init_object_field(o, &o->oControllablePlatformUnkF8); network_init_object_field(o, &o->oControllablePlatformUnkFC); network_init_object_field(o, &o->oControllablePlatformUnk100); network_init_object_field(o, &o->oFaceAnglePitch); network_init_object_field(o, &o->oFaceAngleRoll); - network_init_object_field(o, &o->header.gfx.node.flags); for (int i = 0; i < 4; i++) { if (controllablePlatformSubs[i] == NULL) { continue; } network_init_object_field(o, &controllablePlatformSubs[i]->oAction); diff --git a/src/game/behaviors/flying_bookend_switch.inc.c b/src/game/behaviors/flying_bookend_switch.inc.c index 50061920f..1ae3bacbc 100644 --- a/src/game/behaviors/flying_bookend_switch.inc.c +++ b/src/game/behaviors/flying_bookend_switch.inc.c @@ -269,8 +269,8 @@ void bhv_haunted_bookshelf_manager_loop(void) { so->syncDeathEvent = FALSE; so->override_ownership = bhv_haunted_bookshelf_manager_override_ownership; so->ignore_if_true = bhv_haunted_bookshelf_manager_ignore_if_true; + network_init_object_field_with_size(o, &o->activeFlags, 16); network_init_object_field(o, &o->oAction); - network_init_object_field(o, &o->activeFlags); network_init_object_field(o, &o->oBookSwitchManagerUnkF8); network_init_object_field(o, &o->oBookSwitchManagerUnkF4); network_init_object_field(o, &o->oTimer); diff --git a/src/game/behaviors/grand_star.inc.c b/src/game/behaviors/grand_star.inc.c index 4cd8060fc..0f5f4fe9c 100644 --- a/src/game/behaviors/grand_star.inc.c +++ b/src/game/behaviors/grand_star.inc.c @@ -24,7 +24,7 @@ void bhv_grand_star_init(void) { if (!network_sync_object_initialized(o)) { struct SyncObject *so = network_init_object(o, SYNC_DISTANCE_ONLY_EVENTS); if (so) { - network_init_object_field(o, &o->activeFlags); + network_init_object_field_with_size(o, &o->activeFlags, 16); network_init_object_field(o, &o->oPrevAction); network_init_object_field(o, &o->oAction); network_init_object_field(o, &o->oSubAction); diff --git a/src/game/behaviors/hoot.inc.c b/src/game/behaviors/hoot.inc.c index 5285af547..c6c1fe547 100644 --- a/src/game/behaviors/hoot.inc.c +++ b/src/game/behaviors/hoot.inc.c @@ -22,7 +22,7 @@ void bhv_hoot_init(void) { so->ignore_if_true = bhv_hoot_ignore_if_true; network_init_object_field(o, &o->oHootAvailability); network_init_object_field(o, &o->oMoveAnglePitch); - network_init_object_field(o, &o->header.gfx.animInfo.animFrame); + network_init_object_field_with_size(o, &o->header.gfx.animInfo.animFrame, 16); } } diff --git a/src/game/behaviors/klepto.inc.c b/src/game/behaviors/klepto.inc.c index 2ba8679bc..6ff80ff89 100644 --- a/src/game/behaviors/klepto.inc.c +++ b/src/game/behaviors/klepto.inc.c @@ -123,7 +123,7 @@ void bhv_klepto_init(void) { network_init_object_field(o, &o->oHomeZ); network_init_object_field(o, &o->oMoveAnglePitch); network_init_object_field(o, &o->oGravity); - network_init_object_field(o, &o->globalPlayerIndex); + network_init_object_field_with_size(o, &o->globalPlayerIndex, 8); } } diff --git a/src/game/behaviors/monty_mole.inc.c b/src/game/behaviors/monty_mole.inc.c index 492caba97..fdd04a976 100644 --- a/src/game/behaviors/monty_mole.inc.c +++ b/src/game/behaviors/monty_mole.inc.c @@ -177,9 +177,9 @@ void bhv_monty_mole_init(void) { network_init_object_field(o, &o->oMontyMoleHoleZ); network_init_object_field(o, &o->oFaceAnglePitch); network_init_object_field(o, &o->oGravity); - network_init_object_field(o, &o->header.gfx.node.flags); network_init_object_field(o, &o->oIntangibleTimer); network_init_object_field(o, &o->oFaceAnglePitch); + network_init_object_field_with_size(o, &o->header.gfx.node.flags, 16); } } diff --git a/src/game/behaviors/mushroom_1up.inc.c b/src/game/behaviors/mushroom_1up.inc.c index c0f9dd0e2..90f46bf3e 100644 --- a/src/game/behaviors/mushroom_1up.inc.c +++ b/src/game/behaviors/mushroom_1up.inc.c @@ -227,9 +227,9 @@ void bhv_1up_hidden_loop(void) { network_init_object_field(o, &o->oAction); network_init_object_field(o, &o->oForwardVel); network_init_object_field(o, &o->o1UpHiddenUnkF4); - network_init_object_field(o, &o->header.gfx.node.flags); - network_init_object_field(o, &o->activeFlags); network_init_object_field(o, &o->oIntangibleTimer); + network_init_object_field_with_size(o, &o->activeFlags, 16); + network_init_object_field_with_size(o, &o->header.gfx.node.flags, 16); } s16 sp26; @@ -281,7 +281,7 @@ void bhv_1up_hidden_loop(void) { void bhv_1up_hidden_trigger_loop(void) { if (!network_sync_object_initialized(o)) { network_init_object(o, SYNC_DISTANCE_ONLY_EVENTS); - network_init_object_field(o, &o->activeFlags); + network_init_object_field_with_size(o, &o->activeFlags, 16); } struct Object* player = nearest_player_to_object(o); @@ -305,9 +305,9 @@ void bhv_1up_hidden_in_pole_loop(void) { network_init_object_field(o, &o->oAction); network_init_object_field(o, &o->oForwardVel); network_init_object_field(o, &o->o1UpHiddenUnkF4); - network_init_object_field(o, &o->header.gfx.node.flags); - network_init_object_field(o, &o->activeFlags); network_init_object_field(o, &o->oIntangibleTimer); + network_init_object_field_with_size(o, &o->activeFlags, 16); + network_init_object_field_with_size(o, &o->header.gfx.node.flags, 16); } UNUSED s16 sp26; @@ -352,7 +352,7 @@ void bhv_1up_hidden_in_pole_loop(void) { void bhv_1up_hidden_in_pole_trigger_loop(void) { if (!network_sync_object_initialized(o)) { network_init_object(o, SYNC_DISTANCE_ONLY_EVENTS); - network_init_object_field(o, &o->activeFlags); + network_init_object_field_with_size(o, &o->activeFlags, 16); } struct Object* player = nearest_player_to_object(o); @@ -370,7 +370,7 @@ void bhv_1up_hidden_in_pole_trigger_loop(void) { void bhv_1up_hidden_in_pole_spawner_loop(void) { if (!network_sync_object_initialized(o)) { network_init_object(o, SYNC_DISTANCE_ONLY_EVENTS); - network_init_object_field(o, &o->activeFlags); + network_init_object_field_with_size(o, &o->activeFlags, 16); } if (gNetworkAreaSyncing || !gNetworkAreaLoaded) { diff --git a/src/game/behaviors/pyramid_top.inc.c b/src/game/behaviors/pyramid_top.inc.c index 8d7570478..7bbdee255 100644 --- a/src/game/behaviors/pyramid_top.inc.c +++ b/src/game/behaviors/pyramid_top.inc.c @@ -91,7 +91,7 @@ void bhv_pyramid_top_loop(void) { if (!network_sync_object_initialized(o)) { struct SyncObject *so = network_init_object(o, SYNC_DISTANCE_ONLY_EVENTS); if (so) { - network_init_object_field(o, &o->activeFlags); + network_init_object_field_with_size(o, &o->activeFlags, 16); network_init_object_field(o, &o->oAction); network_init_object_field(o, &o->oPrevAction); network_init_object_field(o, &o->oTimer); diff --git a/src/game/behaviors/thi_top.inc.c b/src/game/behaviors/thi_top.inc.c index 474e488c1..7ec86c0d4 100644 --- a/src/game/behaviors/thi_top.inc.c +++ b/src/game/behaviors/thi_top.inc.c @@ -21,7 +21,7 @@ void bhv_thi_tiny_island_top_loop(void) { network_init_object_field(o, &o->oAction); network_init_object_field(o, &o->oPrevAction); network_init_object_field(o, &o->oTimer); - network_init_object_field(o, &o->header.gfx.node.flags); + network_init_object_field_with_size(o, &o->header.gfx.node.flags, 16); } struct MarioState* marioState = nearest_mario_state_to_object(o); diff --git a/src/game/behaviors/ukiki.inc.c b/src/game/behaviors/ukiki.inc.c index 3dbb321d7..846578b97 100644 --- a/src/game/behaviors/ukiki.inc.c +++ b/src/game/behaviors/ukiki.inc.c @@ -655,7 +655,7 @@ void bhv_ukiki_init(void) { network_init_object_field(o, &o->oUkikiChaseFleeRange); network_init_object_field(o, &o->oUkikiCageSpinTimer); network_init_object_field(o, &o->oIntangibleTimer); - network_init_object_field(o, &o->globalPlayerIndex); + network_init_object_field_with_size(o, &o->globalPlayerIndex, 8); } /** diff --git a/src/game/behaviors/wdw_water_level.inc.c b/src/game/behaviors/wdw_water_level.inc.c index ff4d479f3..17073ce88 100644 --- a/src/game/behaviors/wdw_water_level.inc.c +++ b/src/game/behaviors/wdw_water_level.inc.c @@ -25,7 +25,7 @@ void bhv_water_level_diamond_loop(void) { network_init_object_field(o, &o->oWaterLevelTriggerTargetWaterLevel); network_init_object_field(o, &o->oAngleVelYaw); network_init_object_field(o, &o->oFaceAngleYaw); - network_init_object_field(o, &gWDWWaterLevelChanging); + network_init_object_field_with_size(o, &gWDWWaterLevelChanging, 16); } if (gEnvironmentRegions != NULL) { diff --git a/src/pc/network/network.h b/src/pc/network/network.h index 0ee3ee743..ca1c7923b 100644 --- a/src/pc/network/network.h +++ b/src/pc/network/network.h @@ -78,6 +78,7 @@ struct SyncObject { void (*override_ownership)(u8* shouldOverride, u8* shouldOwn); void (*on_forget)(void); void* extraFields[MAX_SYNC_OBJECT_FIELDS]; + u8 extraFieldsSize[MAX_SYNC_OBJECT_FIELDS]; bool rememberLastReliablePacket; bool lastReliablePacketIsStale; u16 extendedModelId; diff --git a/src/pc/network/packets/packet.h b/src/pc/network/packets/packet.h index 6549a7273..c8d2cd980 100644 --- a/src/pc/network/packets/packet.h +++ b/src/pc/network/packets/packet.h @@ -171,6 +171,7 @@ void forget_ent_reliable_packet(struct Object* o); void network_override_object(u8 syncId, struct Object* o); struct SyncObject* network_init_object(struct Object* object, float maxSyncDistance); void network_init_object_field(struct Object* o, void* field); +void network_init_object_field_with_size(struct Object *o, void* field, u8 size); bool network_owns_object(struct Object* o); bool network_sync_object_initialized(struct Object* o); void network_clear_sync_objects(void); diff --git a/src/pc/network/packets/packet_object.c b/src/pc/network/packets/packet_object.c index d2261008a..c5aaa97ea 100644 --- a/src/pc/network/packets/packet_object.c +++ b/src/pc/network/packets/packet_object.c @@ -154,6 +154,7 @@ struct SyncObject* network_init_object(struct Object *o, float maxSyncDistance) } so->randomSeed = (u16)(o->oSyncID * 7951); memset(so->extraFields, 0, sizeof(void*) * MAX_SYNC_OBJECT_FIELDS); + memset(so->extraFieldsSize, 0, sizeof(u8) * MAX_SYNC_OBJECT_FIELDS); sLastSyncEntReliablePacket[o->oSyncID].error = true; @@ -167,7 +168,23 @@ void network_init_object_field(struct Object *o, void* field) { // remember to synchronize this extra field struct SyncObject* so = &gSyncObjects[o->oSyncID]; u8 index = so->extraFieldCount++; + if (so->extraFieldCount >= MAX_SYNC_OBJECT_FIELDS) { return; } so->extraFields[index] = field; + so->extraFieldsSize[index] = 32; +} + +void network_init_object_field_with_size(struct Object *o, void* field, u8 size) { + if (o->coopFlags & COOP_OBJ_FLAG_NON_SYNC) { return; } + if (o->oSyncID == 0) { return; } + + SOFT_ASSERT(size == 8 || size == 16 || size == 32 || size == 64); + + // remember to synchronize this extra field + struct SyncObject* so = &gSyncObjects[o->oSyncID]; + u8 index = so->extraFieldCount++; + if (so->extraFieldCount >= MAX_SYNC_OBJECT_FIELDS) { return; } + so->extraFields[index] = field; + so->extraFieldsSize[index] = size; } bool network_owns_object(struct Object* o) { @@ -427,7 +444,7 @@ static void packet_write_object_extra_fields(struct Packet* p, struct Object* o) // write the extra field for (u8 i = 0; i < so->extraFieldCount; i++) { SOFT_ASSERT(so->extraFields[i] != NULL); - packet_write(p, so->extraFields[i], sizeof(u32)); + packet_write(p, so->extraFields[i], so->extraFieldsSize[i] / 8); } } @@ -445,7 +462,7 @@ static void packet_read_object_extra_fields(struct Packet* p, struct Object* o) // read the extra fields for (u8 i = 0; i < extraFieldsCount; i++) { SOFT_ASSERT(so->extraFields[i] != NULL); - packet_read(p, so->extraFields[i], sizeof(u32)); + packet_read(p, so->extraFields[i], so->extraFieldsSize[i] / 8); } }