From 3b00aa9e422d62e41fb43a2ae2e1990576aefb5c Mon Sep 17 00:00:00 2001 From: MysterD Date: Tue, 11 Aug 2020 23:00:13 -0700 Subject: [PATCH] Various synchronization enhancements --- build-windows-visual-studio/sm64ex.vcxproj | 1 + .../sm64ex.vcxproj.filters | 3 +++ src/game/object_helpers.c | 25 +++++++++++-------- src/game/object_helpers.h | 2 +- src/game/object_list_processor.c | 2 +- src/game/spawn_object.c | 3 ++- src/pc/network/network.h | 3 +++ src/pc/network/packets/packet_collect_item.c | 2 +- src/pc/network/packets/packet_object.c | 17 +++++++++++-- 9 files changed, 41 insertions(+), 17 deletions(-) diff --git a/build-windows-visual-studio/sm64ex.vcxproj b/build-windows-visual-studio/sm64ex.vcxproj index 131953e15..958a3f559 100644 --- a/build-windows-visual-studio/sm64ex.vcxproj +++ b/build-windows-visual-studio/sm64ex.vcxproj @@ -3947,6 +3947,7 @@ + diff --git a/build-windows-visual-studio/sm64ex.vcxproj.filters b/build-windows-visual-studio/sm64ex.vcxproj.filters index 53b93d967..13016d7cd 100644 --- a/build-windows-visual-studio/sm64ex.vcxproj.filters +++ b/build-windows-visual-studio/sm64ex.vcxproj.filters @@ -14991,6 +14991,9 @@ Source Files\data + + Source Files\src\pc\network\packets + diff --git a/src/game/object_helpers.c b/src/game/object_helpers.c index 7dfacd495..d8407347f 100644 --- a/src/game/object_helpers.c +++ b/src/game/object_helpers.c @@ -1666,7 +1666,7 @@ void obj_spawn_loot_yellow_coins(struct Object *obj, s32 numCoins, f32 sp28) { obj_spawn_loot_coins(obj, numCoins, sp28, bhvSingleCoinGetsSpawned, 0, MODEL_YELLOW_COIN); } -void cur_obj_spawn_loot_coin_at_mario_pos(void) { +void cur_obj_spawn_loot_coin_at_mario_pos(struct MarioState* m) { force_replicable_seed(TRUE); struct Object *coin; if (o->oNumLootCoins <= 0) { @@ -1678,7 +1678,7 @@ void cur_obj_spawn_loot_coin_at_mario_pos(void) { coin = spawn_object(o, MODEL_YELLOW_COIN, bhvSingleCoinGetsSpawned); coin->oVelY = 30.0f; - obj_copy_pos(coin, gMarioObject); + obj_copy_pos(coin, m->marioObj); } f32 cur_obj_abs_y_dist_to_home(void) { @@ -2223,9 +2223,11 @@ s32 cur_obj_wait_then_blink(s32 timeUntilBlinking, s32 numBlinks) { } s32 cur_obj_is_mario_ground_pounding_platform(void) { - if (gMarioObject->platform == o) { - if (gMarioStates[0].action == ACT_GROUND_POUND_LAND) { - return TRUE; + for (int i = 0; i < MAX_PLAYERS; i++) { + if (gMarioStates[i].marioObj->platform == o) { + if (gMarioStates[i].action == ACT_GROUND_POUND_LAND) { + return TRUE; + } } } @@ -2543,13 +2545,14 @@ void cur_obj_if_hit_wall_bounce_away(void) { } s32 cur_obj_hide_if_mario_far_away_y(f32 distY) { - if (absf(o->oPosY - gMarioObject->oPosY) < distY) { - cur_obj_unhide(); - return FALSE; - } else { - cur_obj_hide(); - return TRUE; + for (int i = 0; i < MAX_PLAYERS; i++) { + if (absf(o->oPosY - gMarioStates[i].marioObj->oPosY) < distY) { + cur_obj_unhide(); + return FALSE; + } } + cur_obj_hide(); + return TRUE; } Gfx *geo_offset_klepto_held_object(s32 callContext, struct GraphNode *node, UNUSED Mat4 mtx) { diff --git a/src/game/object_helpers.h b/src/game/object_helpers.h index b0fa7d31c..809551626 100644 --- a/src/game/object_helpers.h +++ b/src/game/object_helpers.h @@ -194,7 +194,7 @@ void cur_obj_set_hitbox_radius_and_height(f32 radius, f32 height); void cur_obj_set_hurtbox_radius_and_height(f32 radius, f32 height); void obj_spawn_loot_blue_coins(struct Object *obj, s32 numCoins, f32 sp28, s16 posJitter); void obj_spawn_loot_yellow_coins(struct Object *obj, s32 numCoins, f32 sp28); -void cur_obj_spawn_loot_coin_at_mario_pos(void); +void cur_obj_spawn_loot_coin_at_mario_pos(struct MarioState* m); s32 cur_obj_advance_looping_anim(void); s32 cur_obj_resolve_wall_collisions(void); void cur_obj_update_floor_and_walls(void); diff --git a/src/game/object_list_processor.c b/src/game/object_list_processor.c index c67febd13..175581681 100644 --- a/src/game/object_list_processor.c +++ b/src/game/object_list_processor.c @@ -539,7 +539,7 @@ void stub_obj_list_processor_1(void) { */ void clear_objects(void) { s32 i; - + network_clear_sync_objects(); gTHIWaterDrained = 0; gTimeStopState = 0; gMarioObject = NULL; diff --git a/src/game/spawn_object.c b/src/game/spawn_object.c index af1a3bc57..26ee2e6f5 100644 --- a/src/game/spawn_object.c +++ b/src/game/spawn_object.c @@ -12,6 +12,7 @@ #include "object_list_processor.h" #include "spawn_object.h" #include "types.h" +#include "pc/network/network.h" /** * An unused linked list struct that seems to have been replaced by ObjectNode. @@ -197,7 +198,7 @@ void unload_object(struct Object *obj) { obj->header.gfx.node.flags &= ~GRAPH_RENDER_CYLBOARD; obj->header.gfx.node.flags &= ~GRAPH_RENDER_ACTIVE; - if (obj->oSyncID != 0) { + if (obj->oSyncID != 0 && syncObjects[obj->oSyncID].syncDeathEvent) { network_send_object(obj); } diff --git a/src/pc/network/network.h b/src/pc/network/network.h index 63adc8b20..5928a2ba4 100644 --- a/src/pc/network/network.h +++ b/src/pc/network/network.h @@ -47,6 +47,7 @@ struct SyncObject { u8 extraFieldCount; bool fullObjectSync; bool keepRandomSeed; + bool syncDeathEvent; float maxUpdateRate; u8 (*ignore_if_true)(struct Object*); void* extraFields[MAX_SYNC_OBJECT_FIELDS]; @@ -59,6 +60,8 @@ extern enum NetworkType networkType; extern struct SyncObject syncObjects[]; void network_init(enum NetworkType networkType); + +void network_clear_sync_objects(void); void network_init_object(struct Object *object, float maxSyncDistance); void network_object_settings(struct Object *object, bool fullObjectSync, float maxUpdateRate, bool keepRandomSeed, u8 ignore_if_true(struct Object*)); void network_send(struct Packet* p); diff --git a/src/pc/network/packets/packet_collect_item.c b/src/pc/network/packets/packet_collect_item.c index 915db2298..75ecbff3d 100644 --- a/src/pc/network/packets/packet_collect_item.c +++ b/src/pc/network/packets/packet_collect_item.c @@ -33,7 +33,7 @@ static struct Object* find_nearest_item(const BehaviorScript *behavior, f32* pos obj = (struct Object *) listHead->next; while (obj != (struct Object *) listHead) { - if (obj->behavior == behaviorAddr && obj->activeFlags != ACTIVE_FLAG_DEACTIVATED) { + if (obj->behavior == behaviorAddr && obj->activeFlags != ACTIVE_FLAG_DEACTIVATED && !(obj->oInteractStatus & INT_STATUS_INTERACTED)) { f32 objDist = dist_to_pos(obj, pos); if (objDist < minDist) { closestObj = obj; diff --git a/src/pc/network/packets/packet_object.c b/src/pc/network/packets/packet_object.c index 52683b0f2..d95aaf45e 100644 --- a/src/pc/network/packets/packet_object.c +++ b/src/pc/network/packets/packet_object.c @@ -6,7 +6,7 @@ #include "behavior_data.h" #include "behavior_table.h" -u8 nextSyncID = 1; +static u8 nextSyncID = 1; struct SyncObject syncObjects[MAX_SYNC_OBJECTS] = { 0 }; // todo: move this to somewhere more general @@ -21,6 +21,13 @@ float player_distance(struct MarioState* marioState, struct Object* o) { return sqrt(mx + my + mz); } +void network_clear_sync_objects(void) { + for (int i = 0; i < MAX_SYNC_OBJECTS; i++) { + forget_sync_object(&syncObjects[i]); + } + nextSyncID = 1; +} + void network_init_object(struct Object *o, float maxSyncDistance) { // generate new sync ID if (o->oSyncID == 0) { @@ -47,6 +54,7 @@ void network_init_object(struct Object *o, float maxSyncDistance) { so->keepRandomSeed = false; so->maxUpdateRate = 0; so->ignore_if_true = NULL; + so->syncDeathEvent = true; memset(so->extraFields, 0, sizeof(void*) * MAX_SYNC_OBJECT_FIELDS); } @@ -255,6 +263,11 @@ void network_send_object(struct Object* o) { forget_sync_object(so); return; } + if (o != so->o) { + printf("network_send_object() OBJECT MISMATCH!\n"); + forget_sync_object(so); + return; + } // always send a new event ID so->onEventId++; @@ -315,7 +328,7 @@ void forget_sync_object(struct SyncObject* so) { } void network_update_objects(void) { - for (int i = 0; i < MAX_SYNC_OBJECTS; i++) { + for (int i = 1; i < nextSyncID; i++) { struct SyncObject* so = &syncObjects[i]; if (so->o == NULL) { continue; }