mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2025-10-30 08:01:01 +00:00
Adjusted how "static" sync entities are removed
No longer needs hacky stuff like relying on the macro for goomba triplet removal. Instead we simply keep a list of sync ids of objects that were removed (but were around at the start of level loading)
This commit is contained in:
parent
3ab1b0b4b5
commit
b1ac0c9f7f
5 changed files with 49 additions and 19 deletions
|
|
@ -94,7 +94,7 @@ void network_on_init_level(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void network_on_loaded_level(void) {
|
void network_on_loaded_level(void) {
|
||||||
// check for level change
|
area_remove_sync_ids_clear();
|
||||||
struct NetworkPlayer* np = gNetworkPlayerLocal;
|
struct NetworkPlayer* np = gNetworkPlayerLocal;
|
||||||
if (np != NULL) {
|
if (np != NULL) {
|
||||||
bool levelMatch = (np->currCourseNum == gCurrCourseNum
|
bool levelMatch = (np->currCourseNum == gCurrCourseNum
|
||||||
|
|
|
||||||
|
|
@ -220,6 +220,9 @@ void network_send_area_request(struct NetworkPlayer* fromNp, struct NetworkPlaye
|
||||||
void network_receive_area_request(struct Packet* p);
|
void network_receive_area_request(struct Packet* p);
|
||||||
|
|
||||||
// packet_area.c
|
// packet_area.c
|
||||||
|
|
||||||
|
void area_remove_sync_ids_add(u8 syncId);
|
||||||
|
void area_remove_sync_ids_clear(void);
|
||||||
void network_send_area(struct NetworkPlayer* toNp);
|
void network_send_area(struct NetworkPlayer* toNp);
|
||||||
void network_receive_area(struct Packet* p);
|
void network_receive_area(struct Packet* p);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,23 @@
|
||||||
//#define DISABLE_MODULE_LOG 1
|
//#define DISABLE_MODULE_LOG 1
|
||||||
#include "pc/debuglog.h"
|
#include "pc/debuglog.h"
|
||||||
|
|
||||||
|
u8 sRemoveSyncIds[RESERVED_IDS_SYNC_OBJECT_OFFSET] = { 0 };
|
||||||
|
u8 sRemoveSyncIdsIndex = 0;
|
||||||
|
|
||||||
|
void area_remove_sync_ids_add(u8 syncId) {
|
||||||
|
if (syncId >= RESERVED_IDS_SYNC_OBJECT_OFFSET) { return; }
|
||||||
|
for (int i = 0; i < sRemoveSyncIdsIndex; i++) {
|
||||||
|
if (sRemoveSyncIds[i] == syncId) { return; }
|
||||||
|
}
|
||||||
|
sRemoveSyncIds[sRemoveSyncIdsIndex++] = syncId;
|
||||||
|
}
|
||||||
|
|
||||||
|
void area_remove_sync_ids_clear(void) {
|
||||||
|
sRemoveSyncIdsIndex = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////
|
||||||
|
|
||||||
void network_send_area(struct NetworkPlayer* toNp) {
|
void network_send_area(struct NetworkPlayer* toNp) {
|
||||||
extern s16 gCurrCourseNum, gCurrActNum, gCurrLevelNum, gCurrAreaIndex;
|
extern s16 gCurrCourseNum, gCurrActNum, gCurrLevelNum, gCurrAreaIndex;
|
||||||
|
|
||||||
|
|
@ -26,6 +43,13 @@ void network_send_area(struct NetworkPlayer* toNp) {
|
||||||
packet_write(&p, &gCurrLevelNum, sizeof(s16));
|
packet_write(&p, &gCurrLevelNum, sizeof(s16));
|
||||||
packet_write(&p, &gCurrAreaIndex, sizeof(s16));
|
packet_write(&p, &gCurrAreaIndex, sizeof(s16));
|
||||||
|
|
||||||
|
// write sync id removals
|
||||||
|
packet_write(&p, &sRemoveSyncIdsIndex, sizeof(u8));
|
||||||
|
for (int i = 0; i < sRemoveSyncIdsIndex; i++) {
|
||||||
|
packet_write(&p, &sRemoveSyncIds[i], sizeof(u8));
|
||||||
|
LOG_INFO("tx remove sync id %d", sRemoveSyncIds[i]);
|
||||||
|
}
|
||||||
|
|
||||||
// count respawners and write
|
// count respawners and write
|
||||||
u8 respawnerCount = 0;
|
u8 respawnerCount = 0;
|
||||||
for (int i = 0; i < MAX_SYNC_OBJECTS; i++) {
|
for (int i = 0; i < MAX_SYNC_OBJECTS; i++) {
|
||||||
|
|
@ -111,6 +135,19 @@ void network_receive_area(struct Packet* p) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// read removed sync ids
|
||||||
|
area_remove_sync_ids_clear();
|
||||||
|
packet_read(p, &sRemoveSyncIdsIndex, sizeof(u8));
|
||||||
|
for (int i = 0; i < sRemoveSyncIdsIndex; i++) {
|
||||||
|
packet_read(p, &sRemoveSyncIds[i], sizeof(u8));
|
||||||
|
struct SyncObject* so = &gSyncObjects[sRemoveSyncIds[i]];
|
||||||
|
if (so->o != NULL) {
|
||||||
|
so->o->activeFlags = ACTIVE_FLAG_DEACTIVATED;
|
||||||
|
}
|
||||||
|
network_forget_sync_object(so);
|
||||||
|
LOG_INFO("rx remove sync id %d", sRemoveSyncIds[i]);
|
||||||
|
}
|
||||||
|
|
||||||
// read respawner count
|
// read respawner count
|
||||||
u8 respawnerCount = 0;
|
u8 respawnerCount = 0;
|
||||||
packet_read(p, &respawnerCount, sizeof(u8));
|
packet_read(p, &respawnerCount, sizeof(u8));
|
||||||
|
|
|
||||||
|
|
@ -88,7 +88,7 @@ static void network_send_level_macro_area(struct NetworkPlayer* destNp, u8 areaI
|
||||||
|
|
||||||
// check for special cases
|
// check for special cases
|
||||||
const BehaviorScript* behavior = MacroObjectPresets[presetID].behavior;
|
const BehaviorScript* behavior = MacroObjectPresets[presetID].behavior;
|
||||||
if ((behavior == bhvCoinFormation || behavior == bhvGoombaTripletSpawner) && *respawnInfo != 0) {
|
if ((behavior == bhvCoinFormation) && *respawnInfo != 0) {
|
||||||
*macroSpecialCount = *macroSpecialCount + 1;
|
*macroSpecialCount = *macroSpecialCount + 1;
|
||||||
u16 offset = respawnInfo - area->macroObjects;
|
u16 offset = respawnInfo - area->macroObjects;
|
||||||
packet_write(&p, &offset, sizeof(u16));
|
packet_write(&p, &offset, sizeof(u16));
|
||||||
|
|
@ -197,21 +197,6 @@ void network_receive_level_macro(struct Packet* p) {
|
||||||
}
|
}
|
||||||
LOG_INFO("rx macro special: coin formation");
|
LOG_INFO("rx macro special: coin formation");
|
||||||
}
|
}
|
||||||
else if (behavior == bhvGoombaTripletSpawner) {
|
|
||||||
o->oBehParams = *respawnInfo;
|
|
||||||
u8 goombaParams = (o->oBehParams >> 8) & 0xFF;
|
|
||||||
|
|
||||||
u8 childIndex = 0;
|
|
||||||
for (int i = 0; i < OBJECT_POOL_CAPACITY; i++) {
|
|
||||||
struct Object* o2 = &gObjectPool[i];
|
|
||||||
if (o2->parentObj != o) { continue; }
|
|
||||||
if (o2 == o) { continue; }
|
|
||||||
if (goombaParams & (1 << childIndex++)) {
|
|
||||||
obj_mark_for_deletion(o2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
LOG_INFO("rx macro special: goomba triplet %d", *respawnInfo);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -13,6 +13,7 @@
|
||||||
|
|
||||||
struct SyncObject gSyncObjects[MAX_SYNC_OBJECTS] = { 0 };
|
struct SyncObject gSyncObjects[MAX_SYNC_OBJECTS] = { 0 };
|
||||||
struct Packet sLastSyncEntReliablePacket[MAX_SYNC_OBJECTS] = { 0 };
|
struct Packet sLastSyncEntReliablePacket[MAX_SYNC_OBJECTS] = { 0 };
|
||||||
|
u8 sNextSyncId = 0;
|
||||||
|
|
||||||
struct Packet* get_last_sync_ent_reliable_packet(u8 syncId) {
|
struct Packet* get_last_sync_ent_reliable_packet(u8 syncId) {
|
||||||
return &sLastSyncEntReliablePacket[syncId];
|
return &sLastSyncEntReliablePacket[syncId];
|
||||||
|
|
@ -137,6 +138,7 @@ bool network_sync_object_initialized(struct Object* o) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void network_clear_sync_objects(void) {
|
void network_clear_sync_objects(void) {
|
||||||
|
sNextSyncId = 0;
|
||||||
network_on_init_level();
|
network_on_init_level();
|
||||||
for (u16 i = 0; i < MAX_SYNC_OBJECTS; i++) {
|
for (u16 i = 0; i < MAX_SYNC_OBJECTS; i++) {
|
||||||
network_forget_sync_object(&gSyncObjects[i]);
|
network_forget_sync_object(&gSyncObjects[i]);
|
||||||
|
|
@ -150,8 +152,10 @@ void network_set_sync_id(struct Object* o) {
|
||||||
if (!gNetworkLevelLoaded) {
|
if (!gNetworkLevelLoaded) {
|
||||||
// while loading, just fill in sync ids from 1 to MAX_SYNC_OBJECTS
|
// while loading, just fill in sync ids from 1 to MAX_SYNC_OBJECTS
|
||||||
for (int i = 1; i < MAX_SYNC_OBJECTS; i++) {
|
for (int i = 1; i < MAX_SYNC_OBJECTS; i++) {
|
||||||
if (gSyncObjects[i].o != NULL) { continue; }
|
sNextSyncId++;
|
||||||
syncId = i;
|
sNextSyncId = sNextSyncId % RESERVED_IDS_SYNC_OBJECT_OFFSET;
|
||||||
|
if (gSyncObjects[sNextSyncId].o != NULL) { continue; }
|
||||||
|
syncId = sNextSyncId;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -517,6 +521,7 @@ void network_forget_sync_object(struct SyncObject* so) {
|
||||||
if (so == so2) {
|
if (so == so2) {
|
||||||
sLastSyncEntReliablePacket[syncId].error = true;
|
sLastSyncEntReliablePacket[syncId].error = true;
|
||||||
}
|
}
|
||||||
|
area_remove_sync_ids_add(syncId);
|
||||||
}
|
}
|
||||||
|
|
||||||
so->o = NULL;
|
so->o = NULL;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue