Specify sync object field size

This commit is contained in:
MysterD 2022-03-29 19:29:57 -07:00
parent ed53a5422c
commit 45286eb46e
16 changed files with 43 additions and 25 deletions

View File

@ -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]);

View File

@ -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);
}
}

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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) {

View File

@ -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);

View File

@ -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);

View File

@ -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);
}
/**

View File

@ -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) {

View File

@ -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;

View File

@ -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);

View File

@ -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);
}
}