Various synchronization enhancements

This commit is contained in:
MysterD 2020-08-11 23:00:13 -07:00
parent 2177094730
commit 3b00aa9e42
9 changed files with 41 additions and 17 deletions

View file

@ -3947,6 +3947,7 @@
<ClCompile Include="..\src\pc\mixer.c" />
<ClCompile Include="..\src\pc\network\network.c" />
<ClCompile Include="..\src\pc\network\packets\packet_collect_coin.c" />
<ClCompile Include="..\src\pc\network\packets\packet_collect_item.c" />
<ClCompile Include="..\src\pc\network\packets\packet_collect_star.c" />
<ClCompile Include="..\src\pc\network\packets\packet_inside_painting.c" />
<ClCompile Include="..\src\pc\network\packets\packet_level_warp.c" />

View file

@ -14991,6 +14991,9 @@
<ClCompile Include="..\data\behavior_table.c">
<Filter>Source Files\data</Filter>
</ClCompile>
<ClCompile Include="..\src\pc\network\packets\packet_collect_item.c">
<Filter>Source Files\src\pc\network\packets</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\actors\common0.h">

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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