mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2025-10-30 08:01:01 +00:00
Various synchronization enhancements
This commit is contained in:
parent
2177094730
commit
3b00aa9e42
9 changed files with 41 additions and 17 deletions
|
|
@ -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" />
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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; }
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue