mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2024-11-22 12:05:11 +00:00
Synchronize cannons as soon as they are unlocked
This commit is contained in:
parent
3950dda92f
commit
443fc1a73f
3 changed files with 34 additions and 12 deletions
1
dx11.sh
Normal file
1
dx11.sh
Normal file
|
@ -0,0 +1 @@
|
||||||
|
make BETTERCAMERA=1 NODRAWINGDISTANCE=1 DEBUG=1 IMMEDIATELOAD=1 RENDER_API=D3D11 && winpty cgdb ./build/us_pc/sm64.us.f3dex2e.exe -ex 'break debug_breakpoint_here'
|
|
@ -4,13 +4,21 @@ void bhv_cannon_closed_init(void) {
|
||||||
struct Object *cannon;
|
struct Object *cannon;
|
||||||
|
|
||||||
if (save_file_is_cannon_unlocked() == 1) {
|
if (save_file_is_cannon_unlocked() == 1) {
|
||||||
|
if (!networkLevelLoaded || networkType == NT_SERVER) {
|
||||||
// If the cannon is open, spawn a cannon and despawn the object.
|
// If the cannon is open, spawn a cannon and despawn the object.
|
||||||
cannon = spawn_object(o, MODEL_CANNON_BASE, bhvCannon);
|
cannon = spawn_object(o, MODEL_CANNON_BASE, bhvCannon);
|
||||||
|
cannon->parentObj = cannon;
|
||||||
cannon->oBehParams2ndByte = o->oBehParams2ndByte;
|
cannon->oBehParams2ndByte = o->oBehParams2ndByte;
|
||||||
cannon->oPosX = o->oHomeX;
|
cannon->oPosX = o->oHomeX;
|
||||||
cannon->oPosY = o->oHomeY;
|
cannon->oPosY = o->oHomeY;
|
||||||
cannon->oPosZ = o->oHomeZ;
|
cannon->oPosZ = o->oHomeZ;
|
||||||
|
if (networkLevelLoaded) {
|
||||||
|
network_set_sync_id(cannon);
|
||||||
|
struct Object* spawn_objects[] = { cannon };
|
||||||
|
u32 models[] = { MODEL_CANNON_BASE };
|
||||||
|
network_send_spawn_objects(spawn_objects, models, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
o->oAction = CANNON_TRAP_DOOR_ACT_OPEN;
|
o->oAction = CANNON_TRAP_DOOR_ACT_OPEN;
|
||||||
o->activeFlags = ACTIVE_FLAG_DEACTIVATED;
|
o->activeFlags = ACTIVE_FLAG_DEACTIVATED;
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,12 +26,15 @@ struct SpawnObjectData {
|
||||||
static u8 generate_parent_id(struct Object* objects[], u8 onIndex) {
|
static u8 generate_parent_id(struct Object* objects[], u8 onIndex) {
|
||||||
struct Object* o = objects[onIndex];
|
struct Object* o = objects[onIndex];
|
||||||
|
|
||||||
|
// special case if the parent is itself
|
||||||
|
if (o->parentObj == o) { return (u8)-1; }
|
||||||
|
|
||||||
if (onIndex == 0) {
|
if (onIndex == 0) {
|
||||||
assert(o->parentObj->oSyncID != 0);
|
assert(o->parentObj->oSyncID != 0);
|
||||||
return (u8)o->parentObj->oSyncID;
|
return (u8)o->parentObj->oSyncID;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (u8 i = (onIndex - 1); i >= 0; i--) {
|
for (u8 i = onIndex; i >= 0; i--) {
|
||||||
if (o->parentObj == objects[i]) { return i; }
|
if (o->parentObj == objects[i]) { return i; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,15 +98,25 @@ void network_receive_spawn_objects(struct Packet* p) {
|
||||||
packet_read(p, &data.activeFlags, sizeof(s16));
|
packet_read(p, &data.activeFlags, sizeof(s16));
|
||||||
packet_read(p, &data.rawData, sizeof(s32) * 80);
|
packet_read(p, &data.rawData, sizeof(s32) * 80);
|
||||||
|
|
||||||
struct Object* parentObj = (i == 0)
|
struct Object* parentObj = NULL;
|
||||||
|
if (data.parentId == (u8)-1) {
|
||||||
|
// this object is it's own parent, set it to a known object temporarily
|
||||||
|
parentObj = gMarioStates[0].marioObj;
|
||||||
|
} else {
|
||||||
|
// this object has a known parent
|
||||||
|
parentObj = (i == 0)
|
||||||
? syncObjects[data.parentId].o
|
? syncObjects[data.parentId].o
|
||||||
: spawned[data.parentId];
|
: spawned[data.parentId];
|
||||||
if (parentObj == NULL) { continue; }
|
if (parentObj == NULL) { continue; }
|
||||||
|
}
|
||||||
|
|
||||||
void* behavior = get_behavior_from_id(data.behaviorId);
|
void* behavior = get_behavior_from_id(data.behaviorId);
|
||||||
struct Object* o = spawn_object(parentObj, data.model, behavior);
|
struct Object* o = spawn_object(parentObj, data.model, behavior);
|
||||||
memcpy(o->rawData.asU32, data.rawData, sizeof(u32) * 80);
|
memcpy(o->rawData.asU32, data.rawData, sizeof(u32) * 80);
|
||||||
|
|
||||||
|
// correct the temporary parent with the object itself
|
||||||
|
if (data.parentId == (u8)-1) { o->parentObj = o; }
|
||||||
|
|
||||||
// they've allocated one of their reserved sync objects
|
// they've allocated one of their reserved sync objects
|
||||||
if (o->oSyncID != 0 && syncObjects[o->oSyncID].reserved == reserveId) {
|
if (o->oSyncID != 0 && syncObjects[o->oSyncID].reserved == reserveId) {
|
||||||
syncObjects[o->oSyncID].o = o;
|
syncObjects[o->oSyncID].o = o;
|
||||||
|
|
Loading…
Reference in a new issue