diff --git a/autogen/convert_structs.py b/autogen/convert_structs.py index 8cea014bf..9a5584773 100644 --- a/autogen/convert_structs.py +++ b/autogen/convert_structs.py @@ -66,7 +66,7 @@ override_field_immutable = { "Character": [ "*" ], "NetworkPlayer": [ "*" ], "TextureInfo": [ "*" ], - "Object": ["oSyncID", "createdThroughNetwork"], + "Object": ["oSyncID", "coopFlags"], "GlobalObjectAnimations": [ "*"], "SpawnParticlesInfo": [ "model" ], } diff --git a/docs/lua/constants.md b/docs/lua/constants.md index fc7bd4324..df24e0b6d 100644 --- a/docs/lua/constants.md +++ b/docs/lua/constants.md @@ -2685,6 +2685,9 @@ - ANIM_FLAG_HOR_TRANS - ANIM_FLAG_NOLOOP - ANIM_FLAG_VERT_TRANS +- COOP_OBJ_FLAG_LUA +- COOP_OBJ_FLAG_NETWORK +- COOP_OBJ_FLAG_NON_SYNC - MAX_PLAYERS - PLAY_MODE_CHANGE_AREA - PLAY_MODE_CHANGE_LEVEL diff --git a/docs/lua/functions.md b/docs/lua/functions.md index fed3d0602..8937d724c 100644 --- a/docs/lua/functions.md +++ b/docs/lua/functions.md @@ -636,6 +636,7 @@ - [obj_has_behavior_id](#obj_has_behavior_id) - [obj_has_model_extended](#obj_has_model_extended) - [obj_set_model_extended](#obj_set_model_extended) + - [spawn_non_sync_object](#spawn_non_sync_object) - [spawn_sync_object](#spawn_sync_object)
@@ -11698,6 +11699,31 @@ The `reliable` field will ensure that the packet arrives, but should be used spa
+## [spawn_non_sync_object](#spawn_non_sync_object) + +### Lua Example +`local ObjectValue = spawn_non_sync_object(behaviorId, modelId, x, y, z, objSetupFunction)` + +### Parameters +| Field | Type | +| ----- | ---- | +| behaviorId | [enum BehaviorId](constants.md#enum-BehaviorId) | +| modelId | [enum ModelExtendedId](constants.md#enum-ModelExtendedId) | +| x | `number` | +| y | `number` | +| z | `number` | +| objSetupFunction | `Lua Function` () | + +### Returns +[Object](structs.md#Object) + +### C Prototype +`struct Object* spawn_non_sync_object(enum BehaviorId behaviorId, enum ModelExtendedId modelId, f32 x, f32 y, f32 z, LuaFunction objSetupFunction);` + +[:arrow_up_small:](#) + +
+ ## [spawn_sync_object](#spawn_sync_object) ### Lua Example diff --git a/docs/lua/structs.md b/docs/lua/structs.md index d12abfa24..5653152ca 100644 --- a/docs/lua/structs.md +++ b/docs/lua/structs.md @@ -747,7 +747,7 @@ | bhvDelayTimer | `integer` | | | bhvStackIndex | `integer` | | | collidedObjInteractTypes | `integer` | | -| createdThroughNetwork | `integer` | read-only | +| coopFlags | `integer` | read-only | | curBhvCommand | `Pointer` <`BehaviorScript`> | read-only | | globalPlayerIndex | `integer` | | | header | [ObjectNode](structs.md#ObjectNode) | read-only | diff --git a/include/types.h b/include/types.h index f20146826..6132a6974 100644 --- a/include/types.h +++ b/include/types.h @@ -18,7 +18,6 @@ #define BAD_RETURN(cmd) cmd #endif - struct Controller { /*0x00*/ s16 rawStickX; // @@ -224,7 +223,7 @@ struct Object /*0x218*/ void *collisionData; /*0x21C*/ Mat4 transform; /*0x25C*/ void *respawnInfo; - /*?????*/ u8 createdThroughNetwork; + /*?????*/ u8 coopFlags; /*?????*/ enum AreaTimerType areaTimerType; /*?????*/ u32 areaTimer; /*?????*/ u32 areaTimerDuration; @@ -410,6 +409,10 @@ struct TextureInfo #define MAX_PLAYERS 16 +#define COOP_OBJ_FLAG_NETWORK (1 << 0) +#define COOP_OBJ_FLAG_LUA (1 << 1) +#define COOP_OBJ_FLAG_NON_SYNC (1 << 2) + #include "src/game/characters.h" #endif // _SM64_TYPES_H_ diff --git a/src/engine/behavior_script.c b/src/engine/behavior_script.c index 8f16f1507..af86e3e16 100644 --- a/src/engine/behavior_script.c +++ b/src/engine/behavior_script.c @@ -785,7 +785,7 @@ static s32 bhv_cmd_load_collision_data(void) { // Command 0x2D: Sets the home position of the object to its current position. // Usage: SET_HOME() static s32 bhv_cmd_set_home(void) { - if (!gCurrentObject->createdThroughNetwork) { + if (!(gCurrentObject->coopFlags & (COOP_OBJ_FLAG_LUA | COOP_OBJ_FLAG_NETWORK))) { gCurrentObject->oHomeX = gCurrentObject->oPosX; gCurrentObject->oHomeY = gCurrentObject->oPosY; gCurrentObject->oHomeZ = gCurrentObject->oPosZ; diff --git a/src/game/behaviors/bobomb.inc.c b/src/game/behaviors/bobomb.inc.c index bf60f4ced..92edd3cba 100644 --- a/src/game/behaviors/bobomb.inc.c +++ b/src/game/behaviors/bobomb.inc.c @@ -41,9 +41,7 @@ void bobomb_act_explode(void) { } bobomb_spawn_coin(); - if (!o->createdThroughNetwork) { - create_respawner(MODEL_BLACK_BOBOMB, bhvBobomb, 3000); - } + create_respawner(MODEL_BLACK_BOBOMB, bhvBobomb, 3000); o->activeFlags = ACTIVE_FLAG_DEACTIVATED; } } @@ -133,15 +131,13 @@ void generic_bobomb_free_loop(void) { break; case BOBOMB_ACT_LAVA_DEATH: - if (obj_lava_death() == 1 && !o->createdThroughNetwork) + if (obj_lava_death() == 1) create_respawner(MODEL_BLACK_BOBOMB, bhvBobomb, 3000); break; case BOBOMB_ACT_DEATH_PLANE_DEATH: o->activeFlags = ACTIVE_FLAG_DEACTIVATED; - if (!o->createdThroughNetwork) { - create_respawner(MODEL_BLACK_BOBOMB, bhvBobomb, 3000); - } + create_respawner(MODEL_BLACK_BOBOMB, bhvBobomb, 3000); break; } @@ -162,15 +158,13 @@ void stationary_bobomb_free_loop(void) { break; case BOBOMB_ACT_LAVA_DEATH: - if (obj_lava_death() == 1 && !o->createdThroughNetwork) + if (obj_lava_death() == 1) create_respawner(MODEL_BLACK_BOBOMB, bhvBobomb, 3000); break; case BOBOMB_ACT_DEATH_PLANE_DEATH: o->activeFlags = ACTIVE_FLAG_DEACTIVATED; - if (!o->createdThroughNetwork) { - create_respawner(MODEL_BLACK_BOBOMB, bhvBobomb, 3000); - } + create_respawner(MODEL_BLACK_BOBOMB, bhvBobomb, 3000); break; } diff --git a/src/game/behaviors/boo.inc.c b/src/game/behaviors/boo.inc.c index cf531518c..b104009f3 100644 --- a/src/game/behaviors/boo.inc.c +++ b/src/game/behaviors/boo.inc.c @@ -25,6 +25,7 @@ static u8 boo_ignore_update(void) { struct SyncObject* boo_network_init_object(void) { struct SyncObject* so = network_init_object(o, 4000.0f); + if (so == NULL) { return NULL; } so->ignore_if_true = boo_ignore_update; network_init_object_field(o, &o->oBooBaseScale); network_init_object_field(o, &o->oBooNegatedAggressiveness); @@ -536,7 +537,7 @@ void bhv_boo_loop(void) { if (o->oAction < 3) { if (!network_sync_object_initialized(o)) { struct SyncObject* so = boo_network_init_object(); - so->syncDeathEvent = FALSE; + if (so) { so->syncDeathEvent = FALSE; } } } else { @@ -764,9 +765,11 @@ void bhv_big_boo_loop(void) { if (!network_sync_object_initialized(o)) { bigBooActivated = FALSE; struct SyncObject* so = boo_network_init_object(); - so->syncDeathEvent = FALSE; - so->ignore_if_true = big_boo_ignore_update; - so->on_forget = big_boo_on_forget; + if (so) { + so->syncDeathEvent = FALSE; + so->ignore_if_true = big_boo_ignore_update; + so->on_forget = big_boo_on_forget; + } } } else if (o->oHealth <= 0) { if (network_sync_object_initialized(o)) { diff --git a/src/game/behaviors/boo_cage.inc.c b/src/game/behaviors/boo_cage.inc.c index 1fee9b488..b6ab14e73 100644 --- a/src/game/behaviors/boo_cage.inc.c +++ b/src/game/behaviors/boo_cage.inc.c @@ -30,6 +30,7 @@ static void bhv_boo_cage_on_received_post(UNUSED u8 localIndex) { void bhv_boo_cage_init(void) { struct SyncObject* so = network_init_object(o, SYNC_DISTANCE_ONLY_EVENTS); + if (so == NULL) { return; } so->on_received_post = bhv_boo_cage_on_received_post; network_init_object_field(o, &o->oAction); network_init_object_field(o, &o->oPosX); diff --git a/src/game/behaviors/bouncing_fireball.inc.c b/src/game/behaviors/bouncing_fireball.inc.c index f89a120ff..034e3576a 100644 --- a/src/game/behaviors/bouncing_fireball.inc.c +++ b/src/game/behaviors/bouncing_fireball.inc.c @@ -35,10 +35,12 @@ void bhv_bouncing_fireball_override_ownership(u8* shouldOverride, u8* shouldOwn) void bhv_bouncing_fireball_loop(void) { if (!network_sync_object_initialized(o)) { struct SyncObject* so = network_init_object(o, SYNC_DISTANCE_ONLY_EVENTS); - so->override_ownership = bhv_bouncing_fireball_override_ownership; - network_init_object_field(o, &o->oAction); - network_init_object_field(o, &o->oPrevAction); - network_init_object_field(o, &o->oTimer); + if (so) { + so->override_ownership = bhv_bouncing_fireball_override_ownership; + network_init_object_field(o, &o->oAction); + network_init_object_field(o, &o->oPrevAction); + network_init_object_field(o, &o->oTimer); + } } struct Object* player = nearest_player_to_object(o); diff --git a/src/game/behaviors/bowling_ball.inc.c b/src/game/behaviors/bowling_ball.inc.c index 65da85e68..e614a67e9 100644 --- a/src/game/behaviors/bowling_ball.inc.c +++ b/src/game/behaviors/bowling_ball.inc.c @@ -254,7 +254,9 @@ void bhv_bob_pit_bowling_ball_init(void) { o->oBuoyancy = 2.0f; struct SyncObject* so = network_init_object(o, 5000.0f); - so->maxUpdateRate = 5.0f; + if (so) { + so->maxUpdateRate = 5.0f; + } } void bhv_bob_pit_bowling_ball_loop(void) { diff --git a/src/game/behaviors/bowser.inc.c b/src/game/behaviors/bowser.inc.c index fe0c28d79..356847fdb 100644 --- a/src/game/behaviors/bowser.inc.c +++ b/src/game/behaviors/bowser.inc.c @@ -1352,12 +1352,14 @@ void bhv_bowser_init(void) { o->oBowserEyesShut = 0; struct SyncObject* so = network_init_object(o, 8000.0f); - so->override_ownership = bhv_bowser_override_ownership; - so->ignore_if_true = bhv_bowser_ignore_if_true; - so->fullObjectSync = TRUE; - network_init_object_field(o, &o->header.gfx.node.flags); - network_init_object_field(o, &networkBowserAnimationIndex); - network_init_object_field(o, &o->header.gfx.animInfo.animFrame); + if (so) { + so->override_ownership = bhv_bowser_override_ownership; + so->ignore_if_true = bhv_bowser_ignore_if_true; + so->fullObjectSync = TRUE; + network_init_object_field(o, &o->header.gfx.node.flags); + network_init_object_field(o, &networkBowserAnimationIndex); + network_init_object_field(o, &o->header.gfx.animInfo.animFrame); + } } #undef BITDW @@ -1591,10 +1593,12 @@ u8 bhv_falling_bowser_platform_ignore_if_true(void) { void bhv_falling_bowser_platform_loop(void) { if (!network_sync_object_initialized(o)) { struct SyncObject* so = network_init_object(o, SYNC_DISTANCE_ONLY_EVENTS); - so->ignore_if_true = bhv_falling_bowser_platform_ignore_if_true; - network_init_object_field(o, &o->oAction); - network_init_object_field(o, &o->oPrevAction); - network_init_object_field(o, &o->oTimer); + if (so) { + so->ignore_if_true = bhv_falling_bowser_platform_ignore_if_true; + network_init_object_field(o, &o->oAction); + network_init_object_field(o, &o->oPrevAction); + network_init_object_field(o, &o->oTimer); + } } cur_obj_call_action_function(sFallingBowserPlatformActions); diff --git a/src/game/behaviors/bowser_bomb.inc.c b/src/game/behaviors/bowser_bomb.inc.c index 1d3706eae..542658e08 100644 --- a/src/game/behaviors/bowser_bomb.inc.c +++ b/src/game/behaviors/bowser_bomb.inc.c @@ -31,8 +31,10 @@ void bhv_bowser_bomb_loop(void) { if (!network_sync_object_initialized(o)) { networkBowserBombHit = 0; struct SyncObject* so = network_init_object(o, SYNC_DISTANCE_ONLY_EVENTS); - so->syncDeathEvent = FALSE; - network_init_object_field(o, &networkBowserBombHit); + if (so) { + so->syncDeathEvent = FALSE; + network_init_object_field(o, &networkBowserBombHit); + } } struct MarioState* marioState = nearest_mario_state_to_object(o); diff --git a/src/game/behaviors/breakable_box_small.inc.c b/src/game/behaviors/breakable_box_small.inc.c index cf4923fd6..53386d811 100644 --- a/src/game/behaviors/breakable_box_small.inc.c +++ b/src/game/behaviors/breakable_box_small.inc.c @@ -73,9 +73,7 @@ void breakable_box_small_released_loop(void) { // Despawn, and create a corkbox respawner if (o->oBreakableBoxSmallFramesSinceReleased > 900) { - if (!o->createdThroughNetwork) { - create_respawner(MODEL_BREAKABLE_BOX_SMALL, bhvBreakableBoxSmall, 3000); - } + create_respawner(MODEL_BREAKABLE_BOX_SMALL, bhvBreakableBoxSmall, 3000); o->activeFlags = ACTIVE_FLAG_DEACTIVATED; } } @@ -92,9 +90,7 @@ void breakable_box_small_idle_loop(void) { case 101: o->activeFlags = ACTIVE_FLAG_DEACTIVATED; - if (!o->createdThroughNetwork) { - create_respawner(MODEL_BREAKABLE_BOX_SMALL, bhvBreakableBoxSmall, 3000); - } + create_respawner(MODEL_BREAKABLE_BOX_SMALL, bhvBreakableBoxSmall, 3000); break; } diff --git a/src/game/behaviors/bully.inc.c b/src/game/behaviors/bully.inc.c index b2be287ba..26c0c48a1 100644 --- a/src/game/behaviors/bully.inc.c +++ b/src/game/behaviors/bully.inc.c @@ -39,16 +39,18 @@ static void bhv_bully_override_ownership(u8* shouldOverride, u8* shouldOwn) { static void bhv_bully_network_init(void) { struct SyncObject* so = network_init_object(o, 4000.0f); - network_init_object_field(o, &o->oFlags); - network_init_object_field(o, &o->oBullyKBTimerAndMinionKOCounter); - network_init_object_field(o, &o->oForwardVel); - network_init_object_field(o, &o->oBullyPrevX); - network_init_object_field(o, &o->oBullyPrevY); - network_init_object_field(o, &o->oBullyPrevZ); - network_init_object_field(o, &o->oBullyMarioCollisionAngle); - so->syncDeathEvent = FALSE; - so->ignore_if_true = bhv_bully_ignore_if_true; - so->override_ownership = bhv_bully_override_ownership; + if (so) { + network_init_object_field(o, &o->oFlags); + network_init_object_field(o, &o->oBullyKBTimerAndMinionKOCounter); + network_init_object_field(o, &o->oForwardVel); + network_init_object_field(o, &o->oBullyPrevX); + network_init_object_field(o, &o->oBullyPrevY); + network_init_object_field(o, &o->oBullyPrevZ); + network_init_object_field(o, &o->oBullyMarioCollisionAngle); + so->syncDeathEvent = FALSE; + so->ignore_if_true = bhv_bully_ignore_if_true; + so->override_ownership = bhv_bully_override_ownership; + } } void bhv_small_bully_init(void) { diff --git a/src/game/behaviors/camera_lakitu.inc.c b/src/game/behaviors/camera_lakitu.inc.c index 25d694c7f..8073afe76 100644 --- a/src/game/behaviors/camera_lakitu.inc.c +++ b/src/game/behaviors/camera_lakitu.inc.c @@ -40,17 +40,19 @@ void bhv_camera_lakitu_init(void) { lakituTargetLocalIndex = UNKNOWN_LOCAL_INDEX; struct SyncObject* so = network_init_object(o, 4000.0f); - so->ignore_if_true = bhv_camera_lakitu_ignore_if_true; - so->override_ownership = bhv_camera_lakitu_override_ownership; - so->on_received_post = bhv_camera_lakitu_on_received_post; - network_init_object_field(o, &o->oAngleVelPitch); - network_init_object_field(o, &o->oFaceAnglePitch); - network_init_object_field(o, &o->oCameraLakituBlinkTimer); - network_init_object_field(o, &o->oCameraLakituSpeed); - network_init_object_field(o, &o->oCameraLakituCircleRadius); - network_init_object_field(o, &o->oCameraLakituFinishedDialog); - network_init_object_field(o, &o->oCameraLakituUnk104); - network_init_object_field(o, &o->oCameraLakituPitchVel); + if (so) { + so->ignore_if_true = bhv_camera_lakitu_ignore_if_true; + so->override_ownership = bhv_camera_lakitu_override_ownership; + so->on_received_post = bhv_camera_lakitu_on_received_post; + network_init_object_field(o, &o->oAngleVelPitch); + network_init_object_field(o, &o->oFaceAnglePitch); + network_init_object_field(o, &o->oCameraLakituBlinkTimer); + network_init_object_field(o, &o->oCameraLakituSpeed); + network_init_object_field(o, &o->oCameraLakituCircleRadius); + network_init_object_field(o, &o->oCameraLakituFinishedDialog); + network_init_object_field(o, &o->oCameraLakituUnk104); + network_init_object_field(o, &o->oCameraLakituPitchVel); + } } static u8 camera_lakitu_intro_act_trigger_cutscene_continue_dialog(void) { diff --git a/src/game/behaviors/cannon.inc.c b/src/game/behaviors/cannon.inc.c index fccfaec35..19f146fd8 100644 --- a/src/game/behaviors/cannon.inc.c +++ b/src/game/behaviors/cannon.inc.c @@ -215,18 +215,20 @@ void bhv_cannon_override_ownership(u8* shouldOverride, u8* shouldOwn) { void bhv_cannon_base_loop(void) { if (!network_sync_object_initialized(o)) { struct SyncObject* so = network_init_object(o, SYNC_DISTANCE_ONLY_EVENTS); - so->on_received_post = cannon_on_received_post; - so->override_ownership = bhv_cannon_override_ownership; - network_init_object_field(o, &o->oAction); - network_init_object_field(o, &o->oPrevAction); - network_init_object_field(o, &o->oTimer); - network_init_object_field(o, &o->oPosX); - network_init_object_field(o, &o->oPosY); - network_init_object_field(o, &o->oPosZ); - network_init_object_field(o, &o->oCannonUnk10C); - network_init_object_field(o, &o->oCannonUnk10C); - network_init_object_field(o, &o->oCannonUnkF8); - network_init_object_field(o, &o->oCannonUnkF4); + if (so) { + so->on_received_post = cannon_on_received_post; + so->override_ownership = bhv_cannon_override_ownership; + network_init_object_field(o, &o->oAction); + network_init_object_field(o, &o->oPrevAction); + network_init_object_field(o, &o->oTimer); + network_init_object_field(o, &o->oPosX); + network_init_object_field(o, &o->oPosY); + network_init_object_field(o, &o->oPosZ); + network_init_object_field(o, &o->oCannonUnk10C); + network_init_object_field(o, &o->oCannonUnk10C); + network_init_object_field(o, &o->oCannonUnkF8); + network_init_object_field(o, &o->oCannonUnkF4); + } } bhv_cannon_base_sanity_check(); diff --git a/src/game/behaviors/chain_chomp.inc.c b/src/game/behaviors/chain_chomp.inc.c index 4d8fe89a0..91f9fd643 100644 --- a/src/game/behaviors/chain_chomp.inc.c +++ b/src/game/behaviors/chain_chomp.inc.c @@ -464,9 +464,11 @@ static void chain_chomp_act_unload_chain(void) { void bhv_chain_chomp_update(void) { if (!network_sync_object_initialized(o)) { struct SyncObject* so = network_init_object(o, 1000.0f); - so->syncDeathEvent = FALSE; - network_init_object_field(o, &o->oChainChompUnk104); - network_init_object_field(o, &o->header.gfx.animInfo.animFrame); + if (so) { + so->syncDeathEvent = FALSE; + network_init_object_field(o, &o->oChainChompUnk104); + network_init_object_field(o, &o->header.gfx.animInfo.animFrame); + } } switch (o->oAction) { diff --git a/src/game/behaviors/corkbox.inc.c b/src/game/behaviors/corkbox.inc.c index 118fbbdce..973cc709d 100644 --- a/src/game/behaviors/corkbox.inc.c +++ b/src/game/behaviors/corkbox.inc.c @@ -56,6 +56,10 @@ void bhv_respawner_loop(void) { } void create_respawner(s32 model, const BehaviorScript *behToSpawn, s32 minSpawnDist) { + if (!(o->coopFlags & COOP_OBJ_FLAG_LUA)) { + return; + } + struct Object *respawner = spawn_object_abs_with_rot(o, 0, MODEL_NONE, bhvRespawner, o->oHomeX, o->oHomeY, o->oHomeZ, 0, 0, 0); u8 syncID = o->oSyncID; diff --git a/src/game/behaviors/dorrie.inc.c b/src/game/behaviors/dorrie.inc.c index 53e9b447c..5605680d8 100644 --- a/src/game/behaviors/dorrie.inc.c +++ b/src/game/behaviors/dorrie.inc.c @@ -165,13 +165,15 @@ void bhv_dorrie_update(void) { if (!network_sync_object_initialized(o)) { for (int i = 0; i < MAX_PLAYERS; i++) { dorrieLiftingPlayer[i] = FALSE; } struct SyncObject* so = network_init_object(o, 4000.0f); - so->ignore_if_true = bhv_dorrie_ignore_if_true; - network_init_object_field(o, &o->oDorrieOffsetY); - network_init_object_field(o, &o->oDorrieVelY); - network_init_object_field(o, &o->oDorrieYawVel); - network_init_object_field(o, &o->oDorrieLiftingMario); - network_init_object_field(o, &o->oDorrieNeckAngle); - network_init_object_field(o, &o->oAngleVelYaw); + if (so) { + so->ignore_if_true = bhv_dorrie_ignore_if_true; + network_init_object_field(o, &o->oDorrieOffsetY); + network_init_object_field(o, &o->oDorrieVelY); + network_init_object_field(o, &o->oDorrieYawVel); + network_init_object_field(o, &o->oDorrieLiftingMario); + network_init_object_field(o, &o->oDorrieNeckAngle); + network_init_object_field(o, &o->oAngleVelYaw); + } } f32 boundsShift; diff --git a/src/game/behaviors/exclamation_box.inc.c b/src/game/behaviors/exclamation_box.inc.c index 4c81aac75..25d97b44a 100644 --- a/src/game/behaviors/exclamation_box.inc.c +++ b/src/game/behaviors/exclamation_box.inc.c @@ -197,9 +197,11 @@ void (*sExclamationBoxActions[])(void) = { exclamation_box_act_0, exclamation_bo void bhv_exclamation_box_init(void) { struct SyncObject* so = network_init_object(o, SYNC_DISTANCE_ONLY_EVENTS); - so->syncDeathEvent = FALSE; - network_init_object_field(o, &o->oExclamationBoxForce); - network_init_object_field(o, &o->areaTimer); + if (so) { + so->syncDeathEvent = FALSE; + network_init_object_field(o, &o->oExclamationBoxForce); + network_init_object_field(o, &o->areaTimer); + } o->areaTimerType = AREA_TIMER_TYPE_MAXIMUM; o->areaTimer = 0; diff --git a/src/game/behaviors/eyerok.inc.c b/src/game/behaviors/eyerok.inc.c index 6597452a5..0128ced4d 100644 --- a/src/game/behaviors/eyerok.inc.c +++ b/src/game/behaviors/eyerok.inc.c @@ -48,6 +48,7 @@ void bhv_eyerok_boss_init(void) { hands[1] = eyerok_spawn_hand(1, MODEL_EYEROK_RIGHT_HAND, bhvEyerokHand); struct SyncObject* so = network_init_object(o, 4000.0f); + if (!so) { return; } so->override_ownership = bhv_eyerok_boss_override_ownership; so->ignore_if_true = bhv_eyerok_boss_ignore_if_true; so->minUpdateRate = 1.0f; diff --git a/src/game/behaviors/falling_rising_platform.inc.c b/src/game/behaviors/falling_rising_platform.inc.c index f44ec5740..bc87b58ab 100644 --- a/src/game/behaviors/falling_rising_platform.inc.c +++ b/src/game/behaviors/falling_rising_platform.inc.c @@ -3,9 +3,11 @@ void bhv_squishable_platform_loop(void) { if (!network_sync_object_initialized(o)) { struct SyncObject* so = network_init_object(o, 4000.0f); - so->minUpdateRate = 5.0f; - network_init_object_field(o, &o->oPlatformTimer); - network_init_object_field(o, &o->header.gfx.scale[1]); + if (so) { + so->minUpdateRate = 5.0f; + network_init_object_field(o, &o->oPlatformTimer); + network_init_object_field(o, &o->header.gfx.scale[1]); + } } if ((((o->oPlatformTimer / 0x80) % 300) == 0) && network_owns_object(o)) { @@ -19,8 +21,10 @@ void bhv_squishable_platform_loop(void) { void bhv_bitfs_sinking_platform_loop(void) { if (!network_sync_object_initialized(o)) { struct SyncObject* so = network_init_object(o, 4000.0f); - so->minUpdateRate = 5.0f; - network_init_object_field(o, &o->oPlatformTimer); + if (so) { + so->minUpdateRate = 5.0f; + network_init_object_field(o, &o->oPlatformTimer); + } } o->oPosY -= @@ -37,8 +41,10 @@ void bhv_ddd_moving_pole_loop(void) { void bhv_bitfs_sinking_cage_platform_loop(void) { if (!network_sync_object_initialized(o)) { struct SyncObject* so = network_init_object(o, 4000.0f); - so->minUpdateRate = 5.0f; - network_init_object_field(o, &o->oPlatformTimer); + if (so) { + so->minUpdateRate = 5.0f; + network_init_object_field(o, &o->oPlatformTimer); + } } if ((((o->oPlatformTimer / 0x100) % 60) == 0) && network_owns_object(o)) { diff --git a/src/game/behaviors/ferris_wheel.inc.c b/src/game/behaviors/ferris_wheel.inc.c index d94ff03ea..c470a2f4f 100644 --- a/src/game/behaviors/ferris_wheel.inc.c +++ b/src/game/behaviors/ferris_wheel.inc.c @@ -45,9 +45,11 @@ void bhv_ferris_wheel_axle_init(void) { } struct SyncObject* so = network_init_object(o, 2000.0f); - so->hasStandardFields = FALSE; - so->maxUpdateRate = 5.0f; - network_init_object_field(o, &o->oFaceAngleRoll); + if (so) { + so->hasStandardFields = FALSE; + so->maxUpdateRate = 5.0f; + network_init_object_field(o, &o->oFaceAngleRoll); + } } /** diff --git a/src/game/behaviors/fire_spitter.inc.c b/src/game/behaviors/fire_spitter.inc.c index 41cac9a59..7a3b612c2 100644 --- a/src/game/behaviors/fire_spitter.inc.c +++ b/src/game/behaviors/fire_spitter.inc.c @@ -46,14 +46,16 @@ static void bhv_fire_spitter_on_received_post(UNUSED u8 localIndex) { void bhv_fire_spitter_update(void) { if (!network_sync_object_initialized(o)) { struct SyncObject* so = network_init_object(o, SYNC_DISTANCE_ONLY_EVENTS); - so->on_received_post = bhv_fire_spitter_on_received_post; - network_init_object_field(o, &o->oAction); - network_init_object_field(o, &o->oPrevAction); - network_init_object_field(o, &o->oTimer); - network_init_object_field(o, &o->oFireSpitterScaleVel); - network_init_object_field(o, &o->header.gfx.scale[0]); - network_init_object_field(o, &o->header.gfx.scale[1]); - network_init_object_field(o, &o->header.gfx.scale[2]); + if (so) { + so->on_received_post = bhv_fire_spitter_on_received_post; + network_init_object_field(o, &o->oAction); + network_init_object_field(o, &o->oPrevAction); + network_init_object_field(o, &o->oTimer); + network_init_object_field(o, &o->oFireSpitterScaleVel); + network_init_object_field(o, &o->header.gfx.scale[0]); + network_init_object_field(o, &o->header.gfx.scale[1]); + network_init_object_field(o, &o->header.gfx.scale[2]); + } } cur_obj_scale(o->header.gfx.scale[0]); diff --git a/src/game/behaviors/flying_bookend_switch.inc.c b/src/game/behaviors/flying_bookend_switch.inc.c index 5ba69548d..980b806b5 100644 --- a/src/game/behaviors/flying_bookend_switch.inc.c +++ b/src/game/behaviors/flying_bookend_switch.inc.c @@ -265,16 +265,18 @@ static u8 bhv_haunted_bookshelf_manager_ignore_if_true(void) { void bhv_haunted_bookshelf_manager_loop(void) { if (!network_sync_object_initialized(o)) { struct SyncObject* so = network_init_object(o, SYNC_DISTANCE_ONLY_EVENTS); - so->syncDeathEvent = FALSE; - so->override_ownership = bhv_haunted_bookshelf_manager_override_ownership; - so->ignore_if_true = bhv_haunted_bookshelf_manager_ignore_if_true; - network_init_object_field(o, &o->oAction); - network_init_object_field(o, &o->activeFlags); - network_init_object_field(o, &o->oBookSwitchManagerUnkF8); - network_init_object_field(o, &o->oBookSwitchManagerUnkF4); - network_init_object_field(o, &o->oTimer); - network_init_object_field(o, &o->oPosX); - network_init_object_field(o, &o->oForwardVel); + if (so) { + so->syncDeathEvent = FALSE; + so->override_ownership = bhv_haunted_bookshelf_manager_override_ownership; + so->ignore_if_true = bhv_haunted_bookshelf_manager_ignore_if_true; + network_init_object_field(o, &o->oAction); + network_init_object_field(o, &o->activeFlags); + network_init_object_field(o, &o->oBookSwitchManagerUnkF8); + network_init_object_field(o, &o->oBookSwitchManagerUnkF4); + network_init_object_field(o, &o->oTimer); + network_init_object_field(o, &o->oPosX); + network_init_object_field(o, &o->oForwardVel); + } } switch (o->oAction) { @@ -299,15 +301,17 @@ void bhv_haunted_bookshelf_manager_loop(void) { void bhv_book_switch_loop(void) { if (!network_sync_object_initialized(o)) { struct SyncObject* so = network_init_object(o, SYNC_DISTANCE_ONLY_EVENTS); - so->override_ownership = bhv_haunted_bookshelf_manager_override_ownership; - so->ignore_if_true = bhv_haunted_bookshelf_manager_ignore_if_true; + if (so) { + so->override_ownership = bhv_haunted_bookshelf_manager_override_ownership; + so->ignore_if_true = bhv_haunted_bookshelf_manager_ignore_if_true; - network_init_object_field(o, &o->oAction); - network_init_object_field(o, &o->oBookSwitchUnkF4); - network_init_object_field(o, &o->oIntangibleTimer); - network_init_object_field(o, &o->oPosX); - network_init_object_field(o, &o->oPosZ); - network_init_object_field(o, &o->oTimer); + network_init_object_field(o, &o->oAction); + network_init_object_field(o, &o->oBookSwitchUnkF4); + network_init_object_field(o, &o->oIntangibleTimer); + network_init_object_field(o, &o->oPosX); + network_init_object_field(o, &o->oPosZ); + network_init_object_field(o, &o->oTimer); + } } s32 sp3C; diff --git a/src/game/behaviors/hoot.inc.c b/src/game/behaviors/hoot.inc.c index 30ad3ce79..5285af547 100644 --- a/src/game/behaviors/hoot.inc.c +++ b/src/game/behaviors/hoot.inc.c @@ -18,10 +18,12 @@ void bhv_hoot_init(void) { localTalkToHoot = 0; struct SyncObject* so = network_init_object(o, 4000.0f); - so->ignore_if_true = bhv_hoot_ignore_if_true; - network_init_object_field(o, &o->oHootAvailability); - network_init_object_field(o, &o->oMoveAnglePitch); - network_init_object_field(o, &o->header.gfx.animInfo.animFrame); + if (so) { + so->ignore_if_true = bhv_hoot_ignore_if_true; + network_init_object_field(o, &o->oHootAvailability); + network_init_object_field(o, &o->oMoveAnglePitch); + network_init_object_field(o, &o->header.gfx.animInfo.animFrame); + } } // sp28 = arg0 diff --git a/src/game/behaviors/jrb_ship.inc.c b/src/game/behaviors/jrb_ship.inc.c index 969e3d075..5a11ab285 100644 --- a/src/game/behaviors/jrb_ship.inc.c +++ b/src/game/behaviors/jrb_ship.inc.c @@ -23,10 +23,12 @@ void bhv_sunken_ship_part_loop(void) { void bhv_ship_part_3_loop(void) { if (!network_sync_object_initialized(o)) { struct SyncObject* so = network_init_object(o, 4000.0f); - so->maxUpdateRate = 5.0f; - network_init_object_field(o, &o->oFaceAnglePitch); - network_init_object_field(o, &o->oFaceAngleRoll); - network_init_object_field(o, &o->oShipPart3UnkF4); + if (so) { + so->maxUpdateRate = 5.0f; + network_init_object_field(o, &o->oFaceAnglePitch); + network_init_object_field(o, &o->oFaceAngleRoll); + network_init_object_field(o, &o->oShipPart3UnkF4); + } } s16 sp1E = o->oFaceAnglePitch; @@ -44,14 +46,16 @@ void bhv_ship_part_3_loop(void) { void bhv_jrb_sliding_box_loop(void) { if (!network_sync_object_initialized(o)) { struct SyncObject* so = network_init_object(o, 4000.0f); - so->maxUpdateRate = 5.0f; - network_init_object_field(o, &o->oFaceAnglePitch); - network_init_object_field(o, &o->oFaceAngleRoll); - network_init_object_field(o, &o->oJrbSlidingBoxUnkF8); - network_init_object_field(o, &o->oJrbSlidingBoxUnkFC); - network_init_object_field(o, &o->oParentRelativePosX); - network_init_object_field(o, &o->oParentRelativePosY); - network_init_object_field(o, &o->oParentRelativePosZ); + if (so) { + so->maxUpdateRate = 5.0f; + network_init_object_field(o, &o->oFaceAnglePitch); + network_init_object_field(o, &o->oFaceAngleRoll); + network_init_object_field(o, &o->oJrbSlidingBoxUnkF8); + network_init_object_field(o, &o->oJrbSlidingBoxUnkFC); + network_init_object_field(o, &o->oParentRelativePosX); + network_init_object_field(o, &o->oParentRelativePosY); + network_init_object_field(o, &o->oParentRelativePosZ); + } } Mat4 sp60; diff --git a/src/game/behaviors/king_bobomb.inc.c b/src/game/behaviors/king_bobomb.inc.c index 3541ad08b..1ccc6f105 100644 --- a/src/game/behaviors/king_bobomb.inc.c +++ b/src/game/behaviors/king_bobomb.inc.c @@ -364,11 +364,13 @@ u8 king_bobomb_ignore_if_true(void) { void bhv_king_bobomb_loop(void) { if (!network_sync_object_initialized(o)) { struct SyncObject* so = network_init_object(o, 4000.0f); - so->ignore_if_true = king_bobomb_ignore_if_true; - network_init_object_field(o, &o->oKingBobombUnk88); - network_init_object_field(o, &o->oFlags); - network_init_object_field(o, &o->oHealth); - network_init_object_field(o, &o->oInteractStatus); + if (so) { + so->ignore_if_true = king_bobomb_ignore_if_true; + network_init_object_field(o, &o->oKingBobombUnk88); + network_init_object_field(o, &o->oFlags); + network_init_object_field(o, &o->oHealth); + network_init_object_field(o, &o->oInteractStatus); + } } f32 sp34 = 20.0f; diff --git a/src/game/behaviors/klepto.inc.c b/src/game/behaviors/klepto.inc.c index fd4c820fd..4bc0ce69b 100644 --- a/src/game/behaviors/klepto.inc.c +++ b/src/game/behaviors/klepto.inc.c @@ -105,24 +105,26 @@ void bhv_klepto_init(void) { } struct SyncObject* so = network_init_object(o, 4000.0f); - so->on_received_pre = bhv_klepto_on_received_pre; - so->on_received_post = bhv_klepto_on_received_post; - network_init_object_field(o, &o->oAnimState); - network_init_object_field(o, &o->oFlags); - network_init_object_field(o, &o->oKleptoDistanceToTarget); - network_init_object_field(o, &o->oKleptoUnkF8); - network_init_object_field(o, &o->oKleptoUnkFC); - network_init_object_field(o, &o->oKleptoSpeed); - network_init_object_field(o, &o->oKleptoTimeUntilTargetChange); - network_init_object_field(o, &o->oKleptoTargetNumber); - network_init_object_field(o, &o->oKleptoUnk1B0); - network_init_object_field(o, &o->oSoundStateID); - network_init_object_field(o, &o->oHomeX); - network_init_object_field(o, &o->oHomeY); - network_init_object_field(o, &o->oHomeZ); - network_init_object_field(o, &o->oMoveAnglePitch); - network_init_object_field(o, &o->oGravity); - network_init_object_field(o, &o->globalPlayerIndex); + if (so) { + so->on_received_pre = bhv_klepto_on_received_pre; + so->on_received_post = bhv_klepto_on_received_post; + network_init_object_field(o, &o->oAnimState); + network_init_object_field(o, &o->oFlags); + network_init_object_field(o, &o->oKleptoDistanceToTarget); + network_init_object_field(o, &o->oKleptoUnkF8); + network_init_object_field(o, &o->oKleptoUnkFC); + network_init_object_field(o, &o->oKleptoSpeed); + network_init_object_field(o, &o->oKleptoTimeUntilTargetChange); + network_init_object_field(o, &o->oKleptoTargetNumber); + network_init_object_field(o, &o->oKleptoUnk1B0); + network_init_object_field(o, &o->oSoundStateID); + network_init_object_field(o, &o->oHomeX); + network_init_object_field(o, &o->oHomeY); + network_init_object_field(o, &o->oHomeZ); + network_init_object_field(o, &o->oMoveAnglePitch); + network_init_object_field(o, &o->oGravity); + network_init_object_field(o, &o->globalPlayerIndex); + } } static void klepto_change_target(void) { diff --git a/src/game/behaviors/koopa.inc.c b/src/game/behaviors/koopa.inc.c index 0ad0d3a62..f0ef152b4 100644 --- a/src/game/behaviors/koopa.inc.c +++ b/src/game/behaviors/koopa.inc.c @@ -116,31 +116,33 @@ void bhv_koopa_init(void) { // koopa the quick o->parentObj = cur_obj_nearest_object_with_behavior(bhvKoopaRaceEndpoint); struct SyncObject* so = network_init_object(o, SYNC_DISTANCE_ONLY_EVENTS); - so->on_received_post = bhv_koopa_the_quick_on_received_post; - so->on_sent_pre = bhv_koopa_the_quick_on_sent_pre; - so->override_ownership = bhv_koopa_the_quick_override_ownership; - network_init_object_field(o, &koopaPathedStartWaypoint); - network_init_object_field(o, &koopaPathedPrevWaypoint); - network_init_object_field(o, &koopaShotFromCannon); - network_init_object_field(o, &o->oPathedPrevWaypointFlags); - network_init_object_field(o, &o->oPathedTargetPitch); - network_init_object_field(o, &o->oPathedTargetYaw); - network_init_object_field(o, &o->oPosX); - network_init_object_field(o, &o->oPosY); - network_init_object_field(o, &o->oPosZ); - network_init_object_field(o, &o->oVelX); - network_init_object_field(o, &o->oVelY); - network_init_object_field(o, &o->oVelZ); - network_init_object_field(o, &o->oAction); - network_init_object_field(o, &o->oPrevAction); - network_init_object_field(o, &o->oSubAction); - network_init_object_field(o, &o->oTimer); - network_init_object_field(o, &o->oKoopaAgility); - network_init_object_field(o, &o->parentObj->oKoopaRaceEndpointRaceBegun); - network_init_object_field(o, &o->parentObj->oKoopaRaceEndpointRaceStatus); - network_init_object_field(o, &o->oForwardVel); - network_init_object_field(o, &o->oMoveAngleYaw); - network_init_object_field(o, &o->areaTimer); + if (so) { + so->on_received_post = bhv_koopa_the_quick_on_received_post; + so->on_sent_pre = bhv_koopa_the_quick_on_sent_pre; + so->override_ownership = bhv_koopa_the_quick_override_ownership; + network_init_object_field(o, &koopaPathedStartWaypoint); + network_init_object_field(o, &koopaPathedPrevWaypoint); + network_init_object_field(o, &koopaShotFromCannon); + network_init_object_field(o, &o->oPathedPrevWaypointFlags); + network_init_object_field(o, &o->oPathedTargetPitch); + network_init_object_field(o, &o->oPathedTargetYaw); + network_init_object_field(o, &o->oPosX); + network_init_object_field(o, &o->oPosY); + network_init_object_field(o, &o->oPosZ); + network_init_object_field(o, &o->oVelX); + network_init_object_field(o, &o->oVelY); + network_init_object_field(o, &o->oVelZ); + network_init_object_field(o, &o->oAction); + network_init_object_field(o, &o->oPrevAction); + network_init_object_field(o, &o->oSubAction); + network_init_object_field(o, &o->oTimer); + network_init_object_field(o, &o->oKoopaAgility); + network_init_object_field(o, &o->parentObj->oKoopaRaceEndpointRaceBegun); + network_init_object_field(o, &o->parentObj->oKoopaRaceEndpointRaceStatus); + network_init_object_field(o, &o->oForwardVel); + network_init_object_field(o, &o->oMoveAngleYaw); + network_init_object_field(o, &o->areaTimer); + } o->areaTimerType = AREA_TIMER_TYPE_MAXIMUM; o->areaTimer = 0; o->areaTimerDuration = 60; diff --git a/src/game/behaviors/mips.inc.c b/src/game/behaviors/mips.inc.c index b6c4c3be3..f3582c8ec 100644 --- a/src/game/behaviors/mips.inc.c +++ b/src/game/behaviors/mips.inc.c @@ -55,14 +55,16 @@ void bhv_mips_init(void) { cur_obj_init_animation(0); struct SyncObject* so = network_init_object(o, 4000.0f); - network_init_object_field(o, &o->oMipsStartWaypointIndex); - network_init_object_field(o, &o->oForwardVel); - network_init_object_field(o, &o->oMipsStarStatus); - network_init_object_field(o, &o->oBehParams2ndByte); - network_init_object_field(o, &o->oHeldState); - network_init_object_field(o, &o->oFlags); - so->on_received_pre = bhv_mips_on_received_pre; - so->on_received_post = bhv_mips_on_received_post; + if (so) { + network_init_object_field(o, &o->oMipsStartWaypointIndex); + network_init_object_field(o, &o->oForwardVel); + network_init_object_field(o, &o->oMipsStarStatus); + network_init_object_field(o, &o->oBehParams2ndByte); + network_init_object_field(o, &o->oHeldState); + network_init_object_field(o, &o->oFlags); + so->on_received_pre = bhv_mips_on_received_pre; + so->on_received_post = bhv_mips_on_received_post; + } } /** diff --git a/src/game/behaviors/monty_mole.inc.c b/src/game/behaviors/monty_mole.inc.c index 984df5054..492caba97 100644 --- a/src/game/behaviors/monty_mole.inc.c +++ b/src/game/behaviors/monty_mole.inc.c @@ -169,16 +169,18 @@ void bhv_monty_mole_init(void) { o->oMontyMoleHoleZ = 0; struct SyncObject* so = network_init_object(o, 4000.0f); - so->on_received_post = bhv_monty_mole_on_received_post; - network_init_object_field(o, &o->oMontyMoleHeightRelativeToFloor); - network_init_object_field(o, &o->oMontyMoleHoleX); - network_init_object_field(o, &o->oMontyMoleHoleY); - network_init_object_field(o, &o->oMontyMoleHoleZ); - network_init_object_field(o, &o->oFaceAnglePitch); - network_init_object_field(o, &o->oGravity); - network_init_object_field(o, &o->header.gfx.node.flags); - network_init_object_field(o, &o->oIntangibleTimer); - network_init_object_field(o, &o->oFaceAnglePitch); + if (so) { + so->on_received_post = bhv_monty_mole_on_received_post; + network_init_object_field(o, &o->oMontyMoleHeightRelativeToFloor); + network_init_object_field(o, &o->oMontyMoleHoleX); + network_init_object_field(o, &o->oMontyMoleHoleY); + network_init_object_field(o, &o->oMontyMoleHoleZ); + network_init_object_field(o, &o->oFaceAnglePitch); + network_init_object_field(o, &o->oGravity); + network_init_object_field(o, &o->header.gfx.node.flags); + network_init_object_field(o, &o->oIntangibleTimer); + network_init_object_field(o, &o->oFaceAnglePitch); + } } /** diff --git a/src/game/behaviors/mr_i.inc.c b/src/game/behaviors/mr_i.inc.c index 6a6ee89f8..86204b95d 100644 --- a/src/game/behaviors/mr_i.inc.c +++ b/src/game/behaviors/mr_i.inc.c @@ -271,7 +271,9 @@ struct ObjectHitbox sMrIHitbox = { void bhv_mr_i_loop(void) { if (!network_sync_object_initialized(o)) { struct SyncObject* so = network_init_object(o, SYNC_DISTANCE_ONLY_EVENTS); - so->fullObjectSync = TRUE; + if (so) { + so->fullObjectSync = TRUE; + } } struct Object* player = nearest_player_to_object(o); diff --git a/src/game/behaviors/pokey.inc.c b/src/game/behaviors/pokey.inc.c index dfe91de13..2fb6573c1 100644 --- a/src/game/behaviors/pokey.inc.c +++ b/src/game/behaviors/pokey.inc.c @@ -192,14 +192,16 @@ static void pokey_act_uninitialized(void) { if (!network_sync_object_initialized(o)) { struct SyncObject* so = network_init_object(o, 4000.0f); - network_init_object_field(o, &o->oPokeyAliveBodyPartFlags); - network_init_object_field(o, &o->oPokeyNumAliveBodyParts); - network_init_object_field(o, &o->oPokeyHeadWasKilled); - network_init_object_field(o, &o->oPokeyTargetYaw); - network_init_object_field(o, &o->oPokeyChangeTargetTimer); - network_init_object_field(o, &o->oPokeyTurningAwayFromWall); - so->on_received_pre = pokey_on_received_pre; - so->on_received_post = pokey_on_received_post; + if (so) { + network_init_object_field(o, &o->oPokeyAliveBodyPartFlags); + network_init_object_field(o, &o->oPokeyNumAliveBodyParts); + network_init_object_field(o, &o->oPokeyHeadWasKilled); + network_init_object_field(o, &o->oPokeyTargetYaw); + network_init_object_field(o, &o->oPokeyChangeTargetTimer); + network_init_object_field(o, &o->oPokeyTurningAwayFromWall); + so->on_received_pre = pokey_on_received_pre; + so->on_received_post = pokey_on_received_post; + } } } diff --git a/src/game/behaviors/pyramid_elevator.inc.c b/src/game/behaviors/pyramid_elevator.inc.c index dcc4e74f5..984420e7c 100644 --- a/src/game/behaviors/pyramid_elevator.inc.c +++ b/src/game/behaviors/pyramid_elevator.inc.c @@ -24,11 +24,13 @@ void bhv_pyramid_elevator_init(void) { } struct SyncObject* so = network_init_object(o, SYNC_DISTANCE_ONLY_EVENTS); - so->ignore_if_true = bhv_pyramid_elevator_ignore_if_true; - network_init_object_field(o, &o->oAction); - network_init_object_field(o, &o->oPrevAction); - network_init_object_field(o, &o->oTimer); - network_init_object_field(o, &o->oPosY); + if (so) { + so->ignore_if_true = bhv_pyramid_elevator_ignore_if_true; + network_init_object_field(o, &o->oAction); + network_init_object_field(o, &o->oPrevAction); + network_init_object_field(o, &o->oTimer); + network_init_object_field(o, &o->oPosY); + } } void bhv_pyramid_elevator_loop(void) { diff --git a/src/game/behaviors/pyramid_top.inc.c b/src/game/behaviors/pyramid_top.inc.c index ce3c6ea55..d4b642197 100644 --- a/src/game/behaviors/pyramid_top.inc.c +++ b/src/game/behaviors/pyramid_top.inc.c @@ -101,10 +101,12 @@ static u8 bhv_pyramid_top_ignore_if_true(void) { void bhv_pyramid_top_loop(void) { if (!network_sync_object_initialized(o)) { struct SyncObject* so = network_init_object(o, SYNC_DISTANCE_ONLY_EVENTS); - so->ignore_if_true = bhv_pyramid_top_ignore_if_true; - network_init_object_field(o, &o->oAction); - network_init_object_field(o, &o->oPrevAction); - network_init_object_field(o, &o->oTimer); + if (so) { + so->ignore_if_true = bhv_pyramid_top_ignore_if_true; + network_init_object_field(o, &o->oAction); + network_init_object_field(o, &o->oPrevAction); + network_init_object_field(o, &o->oTimer); + } } switch (o->oAction) { case PYRAMID_TOP_ACT_CHECK_IF_SOLVED: diff --git a/src/game/behaviors/racing_penguin.inc.c b/src/game/behaviors/racing_penguin.inc.c index e2c0c5393..7f7588b2c 100644 --- a/src/game/behaviors/racing_penguin.inc.c +++ b/src/game/behaviors/racing_penguin.inc.c @@ -50,30 +50,32 @@ void bhv_racing_penguin_init(void) { objShortcutCheck->parentObj = o; struct SyncObject* so = network_init_object(o, SYNC_DISTANCE_ONLY_EVENTS); - so->on_received_post = bhv_racing_penguin_the_quick_on_received_post; - so->on_sent_pre = bhv_racing_penguin_the_quick_on_sent_pre; - so->override_ownership = bhv_racing_penguin_the_quick_override_ownership; - network_init_object_field(o, &penguinPathedStartWaypoint); - network_init_object_field(o, &penguinPathedPrevWaypoint); - network_init_object_field(o, &o->oPathedPrevWaypointFlags); - network_init_object_field(o, &o->oPathedTargetPitch); - network_init_object_field(o, &o->oPathedTargetYaw); - network_init_object_field(o, &o->oPosX); - network_init_object_field(o, &o->oPosY); - network_init_object_field(o, &o->oPosZ); - network_init_object_field(o, &o->oVelX); - network_init_object_field(o, &o->oVelY); - network_init_object_field(o, &o->oVelZ); - network_init_object_field(o, &o->oAction); - network_init_object_field(o, &o->oPrevAction); - network_init_object_field(o, &o->oSubAction); - network_init_object_field(o, &o->oTimer); - network_init_object_field(o, &o->oForwardVel); - network_init_object_field(o, &o->oMoveAngleYaw); - network_init_object_field(o, &o->oRacingPenguinWeightedNewTargetSpeed); - network_init_object_field(o, &o->oRacingPenguinMarioWon); - network_init_object_field(o, &o->oRacingPenguinReachedBottom); - network_init_object_field(o, &o->areaTimer); + if (so) { + so->on_received_post = bhv_racing_penguin_the_quick_on_received_post; + so->on_sent_pre = bhv_racing_penguin_the_quick_on_sent_pre; + so->override_ownership = bhv_racing_penguin_the_quick_override_ownership; + network_init_object_field(o, &penguinPathedStartWaypoint); + network_init_object_field(o, &penguinPathedPrevWaypoint); + network_init_object_field(o, &o->oPathedPrevWaypointFlags); + network_init_object_field(o, &o->oPathedTargetPitch); + network_init_object_field(o, &o->oPathedTargetYaw); + network_init_object_field(o, &o->oPosX); + network_init_object_field(o, &o->oPosY); + network_init_object_field(o, &o->oPosZ); + network_init_object_field(o, &o->oVelX); + network_init_object_field(o, &o->oVelY); + network_init_object_field(o, &o->oVelZ); + network_init_object_field(o, &o->oAction); + network_init_object_field(o, &o->oPrevAction); + network_init_object_field(o, &o->oSubAction); + network_init_object_field(o, &o->oTimer); + network_init_object_field(o, &o->oForwardVel); + network_init_object_field(o, &o->oMoveAngleYaw); + network_init_object_field(o, &o->oRacingPenguinWeightedNewTargetSpeed); + network_init_object_field(o, &o->oRacingPenguinMarioWon); + network_init_object_field(o, &o->oRacingPenguinReachedBottom); + network_init_object_field(o, &o->areaTimer); + } o->areaTimerType = AREA_TIMER_TYPE_MAXIMUM; o->areaTimer = 0; o->areaTimerDuration = 60; diff --git a/src/game/behaviors/sliding_platform_2.inc.c b/src/game/behaviors/sliding_platform_2.inc.c index cf3a07064..599682826 100644 --- a/src/game/behaviors/sliding_platform_2.inc.c +++ b/src/game/behaviors/sliding_platform_2.inc.c @@ -36,11 +36,13 @@ void bhv_sliding_plat_2_init(void) { void bhv_sliding_plat_2_loop(void) { if (!network_sync_object_initialized(o)) { struct SyncObject* so = network_init_object(o, 4000.0f); - so->minUpdateRate = 5.0f; - network_init_object_field(o, &o->oBackAndForthPlatformUnkF4); - network_init_object_field(o, &o->oBackAndForthPlatformUnkF8); - network_init_object_field(o, &o->oBackAndForthPlatformUnkFC); - network_init_object_field(o, &o->oBackAndForthPlatformUnk100); + if (so) { + so->minUpdateRate = 5.0f; + network_init_object_field(o, &o->oBackAndForthPlatformUnkF4); + network_init_object_field(o, &o->oBackAndForthPlatformUnkF8); + network_init_object_field(o, &o->oBackAndForthPlatformUnkFC); + network_init_object_field(o, &o->oBackAndForthPlatformUnk100); + } } if (o->oTimer > 10) { diff --git a/src/game/behaviors/snow_mound.inc.c b/src/game/behaviors/snow_mound.inc.c index d266656b7..1894418bd 100644 --- a/src/game/behaviors/snow_mound.inc.c +++ b/src/game/behaviors/snow_mound.inc.c @@ -35,10 +35,12 @@ void bhv_snow_mound_spawn_loop(void) { if (!network_sync_object_initialized(o)) { struct SyncObject* so = network_init_object(o, SYNC_DISTANCE_ONLY_EVENTS); - so->override_ownership = bhv_snow_mound_spawn_override_ownership; - network_init_object_field(o, &o->oTimer); - network_init_object_field(o, &o->oAction); - network_init_object_field(o, &o->oPrevAction); + if (so) { + so->override_ownership = bhv_snow_mound_spawn_override_ownership; + network_init_object_field(o, &o->oTimer); + network_init_object_field(o, &o->oAction); + network_init_object_field(o, &o->oPrevAction); + } } if (!is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, 6000) diff --git a/src/game/behaviors/snowman.inc.c b/src/game/behaviors/snowman.inc.c index 66a2e585c..6d68fec8c 100644 --- a/src/game/behaviors/snowman.inc.c +++ b/src/game/behaviors/snowman.inc.c @@ -104,9 +104,7 @@ void snowmans_bottom_act_2(void) { } if (o->oTimer == 200) { - if (!o->createdThroughNetwork) { - create_respawner(MODEL_CCM_SNOWMAN_BASE, bhvSnowmansBottom, 3000); - } + create_respawner(MODEL_CCM_SNOWMAN_BASE, bhvSnowmansBottom, 3000); o->activeFlags = ACTIVE_FLAG_DEACTIVATED; } } diff --git a/src/game/behaviors/spiny.inc.c b/src/game/behaviors/spiny.inc.c index 8581dc1ca..f948fe715 100644 --- a/src/game/behaviors/spiny.inc.c +++ b/src/game/behaviors/spiny.inc.c @@ -235,20 +235,22 @@ void bhv_spiny_update(void) { // PARTIAL_UPDATE if (!network_sync_object_initialized(o)) { struct SyncObject* so = network_init_object(o, 4000.0f); - so->syncDeathEvent = FALSE; - so->on_received_post = bhv_spiny_on_received_post; - so->on_sent_pre = bhv_spiny_on_sent_pre; - so->override_ownership = bhv_spiny_override_ownership; + if (so) { + so->syncDeathEvent = FALSE; + so->on_received_post = bhv_spiny_on_received_post; + so->on_sent_pre = bhv_spiny_on_sent_pre; + so->override_ownership = bhv_spiny_override_ownership; - network_init_object_field(o, &o->oGraphYOffset); - network_init_object_field(o, &o->oFaceAngleYaw); - network_init_object_field(o, &o->oSpinyTimeUntilTurn); - network_init_object_field(o, &o->oSpinyTargetYaw); - network_init_object_field(o, &o->oSpinyTurningAwayFromWall); - network_init_object_field(o, &o->oMoveFlags); - network_init_object_field(o, &o->oInteractType); - network_init_object_field(o, &o->oFaceAnglePitch); - network_init_object_field(o, &spinyAnimCache); + network_init_object_field(o, &o->oGraphYOffset); + network_init_object_field(o, &o->oFaceAngleYaw); + network_init_object_field(o, &o->oSpinyTimeUntilTurn); + network_init_object_field(o, &o->oSpinyTargetYaw); + network_init_object_field(o, &o->oSpinyTurningAwayFromWall); + network_init_object_field(o, &o->oMoveFlags); + network_init_object_field(o, &o->oInteractType); + network_init_object_field(o, &o->oFaceAnglePitch); + network_init_object_field(o, &spinyAnimCache); + } struct Object* lakitu = cur_obj_nearest_object_with_behavior(bhvEnemyLakitu); diff --git a/src/game/behaviors/square_platform_cycle.inc.c b/src/game/behaviors/square_platform_cycle.inc.c index bc2019a68..caa67edb8 100644 --- a/src/game/behaviors/square_platform_cycle.inc.c +++ b/src/game/behaviors/square_platform_cycle.inc.c @@ -9,8 +9,10 @@ void bhv_squarish_path_parent_init(void) { o->oPosZ += radius; struct SyncObject* so = network_init_object(o, 2000.0f); - so->hasStandardFields = FALSE; - so->maxUpdateRate = 5.0f; + if (so) { + so->hasStandardFields = FALSE; + so->maxUpdateRate = 5.0f; + } for (int i = 0; i < 2; i++) { s16 action = (i == 0) ? 1 : 3; diff --git a/src/game/behaviors/swing_platform.inc.c b/src/game/behaviors/swing_platform.inc.c index 73e1870d2..70ba0837b 100644 --- a/src/game/behaviors/swing_platform.inc.c +++ b/src/game/behaviors/swing_platform.inc.c @@ -3,11 +3,13 @@ void bhv_swing_platform_init(void) { o->oSwingPlatformAngle = 0x2000; struct SyncObject* so = network_init_object(o, 4000.0f); - so->minUpdateRate = 5.0f; - network_init_object_field(o, &o->oSwingPlatformAngle); - network_init_object_field(o, &o->oFaceAngleRoll); - network_init_object_field(o, &o->oSwingPlatformSpeed); - network_init_object_field(o, &o->oAngleVelRoll); + if (so) { + so->minUpdateRate = 5.0f; + network_init_object_field(o, &o->oSwingPlatformAngle); + network_init_object_field(o, &o->oFaceAngleRoll); + network_init_object_field(o, &o->oSwingPlatformSpeed); + network_init_object_field(o, &o->oAngleVelRoll); + } } void bhv_swing_platform_update(void) { diff --git a/src/game/behaviors/tox_box.inc.c b/src/game/behaviors/tox_box.inc.c index 6f45ad4ee..7154af6e3 100644 --- a/src/game/behaviors/tox_box.inc.c +++ b/src/game/behaviors/tox_box.inc.c @@ -76,12 +76,14 @@ void (*sToxBoxActions[])(void) = { tox_box_act_0, tox_box_act_1, tox_box_act_2, void bhv_tox_box_loop(void) { if (!network_sync_object_initialized(o)) { struct SyncObject* so = network_init_object(o, 3000.0f); - so->maxUpdateRate = 10.0f; - network_init_object_field(o, &o->oForwardVel); - network_init_object_field(o, &o->oUnkC0); - network_init_object_field(o, &o->oFaceAnglePitch); - network_init_object_field(o, &o->oFaceAngleRoll); - network_init_object_field(o, &o->oToxBoxMovementStep); + if (so) { + so->maxUpdateRate = 10.0f; + network_init_object_field(o, &o->oForwardVel); + network_init_object_field(o, &o->oUnkC0); + network_init_object_field(o, &o->oFaceAnglePitch); + network_init_object_field(o, &o->oFaceAngleRoll); + network_init_object_field(o, &o->oToxBoxMovementStep); + } } cur_obj_call_action_function(sToxBoxActions); load_object_collision_model(); diff --git a/src/game/behaviors/ttc_2d_rotator.inc.c b/src/game/behaviors/ttc_2d_rotator.inc.c index 61eb82267..5df44eb7e 100644 --- a/src/game/behaviors/ttc_2d_rotator.inc.c +++ b/src/game/behaviors/ttc_2d_rotator.inc.c @@ -42,13 +42,15 @@ void bhv_ttc_2d_rotator_init(void) { o->oTTC2DRotatorIncrement = o->oTTC2DRotatorSpeed = sTTC2DRotatorSpeeds[o->oBehParams2ndByte]; struct SyncObject* so = network_init_object(o, 4000.0f); - so->minUpdateRate = 5.0f; - network_init_object_field(o, &o->oTTC2DRotatorMinTimeUntilNextTurn); - network_init_object_field(o, &o->oTTC2DRotatorTargetYaw); - network_init_object_field(o, &o->oTTC2DRotatorIncrement); - network_init_object_field(o, &o->oTTC2DRotatorRandomDirTimer); - network_init_object_field(o, &o->oFaceAngleYaw); - network_init_object_field(o, &o->oAngleVelYaw); + if (so) { + so->minUpdateRate = 5.0f; + network_init_object_field(o, &o->oTTC2DRotatorMinTimeUntilNextTurn); + network_init_object_field(o, &o->oTTC2DRotatorTargetYaw); + network_init_object_field(o, &o->oTTC2DRotatorIncrement); + network_init_object_field(o, &o->oTTC2DRotatorRandomDirTimer); + network_init_object_field(o, &o->oFaceAngleYaw); + network_init_object_field(o, &o->oAngleVelYaw); + } } /** diff --git a/src/game/behaviors/ttc_cog.inc.c b/src/game/behaviors/ttc_cog.inc.c index c5f99401a..ebbcda055 100644 --- a/src/game/behaviors/ttc_cog.inc.c +++ b/src/game/behaviors/ttc_cog.inc.c @@ -31,11 +31,13 @@ void bhv_ttc_cog_init(void) { o->oTTCCogDir = sTTCCogDirections[o->oBehParams2ndByte & TTC_COG_BP_DIR_MASK]; struct SyncObject* so = network_init_object(o, 4000.0f); - so->minUpdateRate = 5.0f; - network_init_object_field(o, &o->oTTCCogSpeed); - network_init_object_field(o, &o->oTTCCogTargetVel); - network_init_object_field(o, &o->oAngleVelYaw); - network_init_object_field(o, &o->oFaceAngleYaw); + if (so) { + so->minUpdateRate = 5.0f; + network_init_object_field(o, &o->oTTCCogSpeed); + network_init_object_field(o, &o->oTTCCogTargetVel); + network_init_object_field(o, &o->oAngleVelYaw); + network_init_object_field(o, &o->oFaceAngleYaw); + } } /** diff --git a/src/game/behaviors/ttc_elevator.inc.c b/src/game/behaviors/ttc_elevator.inc.c index b3efebe47..f99bc6b69 100644 --- a/src/game/behaviors/ttc_elevator.inc.c +++ b/src/game/behaviors/ttc_elevator.inc.c @@ -25,9 +25,11 @@ void bhv_ttc_elevator_init(void) { o->oTTCElevatorPeakY = o->oPosY + peakOffset; struct SyncObject* so = network_init_object(o, 4000.0f); - so->minUpdateRate = 5.0f; - network_init_object_field(o, &o->oTTCElevatorDir); - network_init_object_field(o, &o->oTTCElevatorMoveTime); + if (so) { + so->minUpdateRate = 5.0f; + network_init_object_field(o, &o->oTTCElevatorDir); + network_init_object_field(o, &o->oTTCElevatorMoveTime); + } } /** diff --git a/src/game/behaviors/ttc_moving_bar.inc.c b/src/game/behaviors/ttc_moving_bar.inc.c index d1e7809d7..22a7f6563 100644 --- a/src/game/behaviors/ttc_moving_bar.inc.c +++ b/src/game/behaviors/ttc_moving_bar.inc.c @@ -35,12 +35,14 @@ void bhv_ttc_moving_bar_init(void) { o->oMoveAngleYaw = 0x4000 - o->oMoveAngleYaw; struct SyncObject* so = network_init_object(o, 4000.0f); - so->minUpdateRate = 5.0f; - network_init_object_field(o, &o->oTTCMovingBarDelay); - network_init_object_field(o, &o->oTTCMovingBarStoppedTimer); - network_init_object_field(o, &o->oTTCMovingBarOffset); - network_init_object_field(o, &o->oTTCMovingBarSpeed); - network_init_object_field(o, &o->oTTCMovingBarStartOffset); + if (so) { + so->minUpdateRate = 5.0f; + network_init_object_field(o, &o->oTTCMovingBarDelay); + network_init_object_field(o, &o->oTTCMovingBarStoppedTimer); + network_init_object_field(o, &o->oTTCMovingBarOffset); + network_init_object_field(o, &o->oTTCMovingBarSpeed); + network_init_object_field(o, &o->oTTCMovingBarStartOffset); + } } /** diff --git a/src/game/behaviors/ttc_pendulum.inc.c b/src/game/behaviors/ttc_pendulum.inc.c index 2d7d080bc..d80fd3d06 100644 --- a/src/game/behaviors/ttc_pendulum.inc.c +++ b/src/game/behaviors/ttc_pendulum.inc.c @@ -26,13 +26,15 @@ void bhv_ttc_pendulum_init(void) { } struct SyncObject* so = network_init_object(o, 4000.0f); - so->minUpdateRate = 5.0f; - network_init_object_field(o, &o->oTTCPendulumAccelDir); - network_init_object_field(o, &o->oTTCPendulumAngle); - network_init_object_field(o, &o->oTTCPendulumAngleVel); - network_init_object_field(o, &o->oTTCPendulumAngleAccel); - network_init_object_field(o, &o->oTTCPendulumDelay); - network_init_object_field(o, &o->oTTCPendulumSoundTimer); + if (so) { + so->minUpdateRate = 5.0f; + network_init_object_field(o, &o->oTTCPendulumAccelDir); + network_init_object_field(o, &o->oTTCPendulumAngle); + network_init_object_field(o, &o->oTTCPendulumAngleVel); + network_init_object_field(o, &o->oTTCPendulumAngleAccel); + network_init_object_field(o, &o->oTTCPendulumDelay); + network_init_object_field(o, &o->oTTCPendulumSoundTimer); + } } /** diff --git a/src/game/behaviors/ttc_pit_block.inc.c b/src/game/behaviors/ttc_pit_block.inc.c index 551a17896..c6e907513 100644 --- a/src/game/behaviors/ttc_pit_block.inc.c +++ b/src/game/behaviors/ttc_pit_block.inc.c @@ -46,9 +46,11 @@ void bhv_ttc_pit_block_init(void) { } struct SyncObject* so = network_init_object(o, 4000.0f); - so->minUpdateRate = 5.0f; - network_init_object_field(o, &o->oTTCPitBlockDir); - network_init_object_field(o, &o->oTTCPitBlockWaitTime); + if (so) { + so->minUpdateRate = 5.0f; + network_init_object_field(o, &o->oTTCPitBlockDir); + network_init_object_field(o, &o->oTTCPitBlockWaitTime); + } } /** diff --git a/src/game/behaviors/ttc_rotating_solid.inc.c b/src/game/behaviors/ttc_rotating_solid.inc.c index dbca3bdd6..ba41a0301 100644 --- a/src/game/behaviors/ttc_rotating_solid.inc.c +++ b/src/game/behaviors/ttc_rotating_solid.inc.c @@ -33,13 +33,15 @@ void bhv_ttc_rotating_solid_init(void) { o->oTTCRotatingSolidRotationDelay = sTTCRotatingSolidInitialDelays[gTTCSpeedSetting]; struct SyncObject* so = network_init_object(o, 4000.0f); - so->minUpdateRate = 5.0f; - network_init_object_field(o, &o->oTTCRotatingSolidNumTurns); - network_init_object_field(o, &o->oTTCRotatingSolidRotationDelay); - network_init_object_field(o, &o->oTTCRotatingSolidVelY); - network_init_object_field(o, &o->oTTCChangeDirTimer); - network_init_object_field(o, &o->oAngleVelRoll); - network_init_object_field(o, &o->oFaceAngleRoll); + if (so) { + so->minUpdateRate = 5.0f; + network_init_object_field(o, &o->oTTCRotatingSolidNumTurns); + network_init_object_field(o, &o->oTTCRotatingSolidRotationDelay); + network_init_object_field(o, &o->oTTCRotatingSolidVelY); + network_init_object_field(o, &o->oTTCChangeDirTimer); + network_init_object_field(o, &o->oAngleVelRoll); + network_init_object_field(o, &o->oFaceAngleRoll); + } } /** diff --git a/src/game/behaviors/ttc_spinner.inc.c b/src/game/behaviors/ttc_spinner.inc.c index 8b1d1f516..e4940d6bc 100644 --- a/src/game/behaviors/ttc_spinner.inc.c +++ b/src/game/behaviors/ttc_spinner.inc.c @@ -19,11 +19,13 @@ static s16 sTTCSpinnerSpeeds[] = { void bhv_ttc_spinner_update(void) { if (!network_sync_object_initialized(o)) { struct SyncObject* so = network_init_object(o, 4000.0f); - so->minUpdateRate = 5.0f; - network_init_object_field(o, &o->oAngleVelPitch); - network_init_object_field(o, &o->oFaceAnglePitch); - network_init_object_field(o, &o->oTTCSpinnerDir); - network_init_object_field(o, &o->oTTCChangeDirTimer); + if (so) { + so->minUpdateRate = 5.0f; + network_init_object_field(o, &o->oAngleVelPitch); + network_init_object_field(o, &o->oFaceAnglePitch); + network_init_object_field(o, &o->oTTCSpinnerDir); + network_init_object_field(o, &o->oTTCChangeDirTimer); + } } o->oAngleVelPitch = sTTCSpinnerSpeeds[gTTCSpeedSetting]; diff --git a/src/game/behaviors/ttc_treadmill.inc.c b/src/game/behaviors/ttc_treadmill.inc.c index 73d88e1ca..4be33e114 100644 --- a/src/game/behaviors/ttc_treadmill.inc.c +++ b/src/game/behaviors/ttc_treadmill.inc.c @@ -35,10 +35,12 @@ void bhv_ttc_treadmill_init(void) { sMasterTreadmill = NULL; struct SyncObject* so = network_init_object(o, 4000.0f); - so->minUpdateRate = 5.0f; - network_init_object_field(o, &o->oTTCTreadmillSpeed); - network_init_object_field(o, &o->oTTCTreadmillTargetSpeed); - network_init_object_field(o, &o->oTTCTreadmillTimeUntilSwitch); + if (so) { + so->minUpdateRate = 5.0f; + network_init_object_field(o, &o->oTTCTreadmillSpeed); + network_init_object_field(o, &o->oTTCTreadmillTargetSpeed); + network_init_object_field(o, &o->oTTCTreadmillTimeUntilSwitch); + } } /** diff --git a/src/game/behaviors/water_bomb.inc.c b/src/game/behaviors/water_bomb.inc.c index 625a7c539..46ffc94b4 100644 --- a/src/game/behaviors/water_bomb.inc.c +++ b/src/game/behaviors/water_bomb.inc.c @@ -31,10 +31,12 @@ static struct ObjectHitbox sWaterBombHitbox = { void bhv_water_bomb_spawner_update(void) { if (!network_sync_object_initialized(o)) { struct SyncObject* so = network_init_object(o, SYNC_DISTANCE_ONLY_EVENTS); - so->fullObjectSync = TRUE; - so->maxUpdateRate = 5.0f; - network_init_object_field(o, &o->oWaterBombSpawnerBombActive); - network_init_object_field(o, &o->oWaterBombSpawnerTimeToSpawn); + if (so) { + so->fullObjectSync = TRUE; + so->maxUpdateRate = 5.0f; + network_init_object_field(o, &o->oWaterBombSpawnerBombActive); + network_init_object_field(o, &o->oWaterBombSpawnerTimeToSpawn); + } } f32 latDistToMario = 9999; diff --git a/src/game/behaviors/water_pillar.inc.c b/src/game/behaviors/water_pillar.inc.c index c9a23e670..ddf2f2310 100644 --- a/src/game/behaviors/water_pillar.inc.c +++ b/src/game/behaviors/water_pillar.inc.c @@ -67,11 +67,13 @@ void bhv_water_level_pillar_init(void) { o->oWaterLevelPillarDrained = 1; struct SyncObject* so = network_init_object(o, SYNC_DISTANCE_ONLY_EVENTS); - so->ignore_if_true = bhv_water_level_pillar_ignore_if_true; - network_init_object_field(o, &o->oAction); - network_init_object_field(o, &o->oPrevAction); - network_init_object_field(o, &o->oTimer); - network_init_object_field(o, &o->oWaterLevelPillarDrained); + if (so) { + so->ignore_if_true = bhv_water_level_pillar_ignore_if_true; + network_init_object_field(o, &o->oAction); + network_init_object_field(o, &o->oPrevAction); + network_init_object_field(o, &o->oTimer); + network_init_object_field(o, &o->oWaterLevelPillarDrained); + } } void bhv_water_level_pillar_loop(void) { diff --git a/src/game/behaviors/wiggler.inc.c b/src/game/behaviors/wiggler.inc.c index 5ad8902a4..c1d95b043 100644 --- a/src/game/behaviors/wiggler.inc.c +++ b/src/game/behaviors/wiggler.inc.c @@ -438,21 +438,23 @@ void bhv_wiggler_update(void) { // PARTIAL_UPDATE if (!network_sync_object_initialized(o)) { struct SyncObject* so = network_init_object(o, 4000.0f); - so->ignore_if_true = bhv_wiggler_ignore_if_true; - so->on_received_pre = bhv_wiggler_on_received_pre; - so->on_received_post = bhv_wiggler_on_received_post; - network_init_object_field(o, &o->oFaceAnglePitch); - network_init_object_field(o, &o->oWigglerFallThroughFloorsHeight); - network_init_object_field(o, &o->oWigglerWalkAnimSpeed); - network_init_object_field(o, &o->oWigglerSquishSpeed); - network_init_object_field(o, &o->oWigglerTimeUntilRandomTurn); - network_init_object_field(o, &o->oWigglerTargetYaw); - network_init_object_field(o, &o->oWigglerWalkAwayFromWallTimer); - network_init_object_field(o, &o->oHealth); - network_init_object_field(o, &o->header.gfx.scale[0]); - network_init_object_field(o, &o->header.gfx.scale[1]); - network_init_object_field(o, &o->header.gfx.scale[2]); - network_init_object_field(o, &o->oFaceAngleYaw); + if (so) { + so->ignore_if_true = bhv_wiggler_ignore_if_true; + so->on_received_pre = bhv_wiggler_on_received_pre; + so->on_received_post = bhv_wiggler_on_received_post; + network_init_object_field(o, &o->oFaceAnglePitch); + network_init_object_field(o, &o->oWigglerFallThroughFloorsHeight); + network_init_object_field(o, &o->oWigglerWalkAnimSpeed); + network_init_object_field(o, &o->oWigglerSquishSpeed); + network_init_object_field(o, &o->oWigglerTimeUntilRandomTurn); + network_init_object_field(o, &o->oWigglerTargetYaw); + network_init_object_field(o, &o->oWigglerWalkAwayFromWallTimer); + network_init_object_field(o, &o->oHealth); + network_init_object_field(o, &o->header.gfx.scale[0]); + network_init_object_field(o, &o->header.gfx.scale[1]); + network_init_object_field(o, &o->header.gfx.scale[2]); + network_init_object_field(o, &o->oFaceAngleYaw); + } } struct Object* player = nearest_player_to_object(o); diff --git a/src/game/behaviors/yoshi.inc.c b/src/game/behaviors/yoshi.inc.c index 0317c7647..2a2937a09 100644 --- a/src/game/behaviors/yoshi.inc.c +++ b/src/game/behaviors/yoshi.inc.c @@ -50,9 +50,7 @@ void yoshi_walk_loop(void) { } if (o->oPosY < 2100.0f) { - if (!o->createdThroughNetwork) { - create_respawner(MODEL_YOSHI, bhvYoshi, 3000); - } + create_respawner(MODEL_YOSHI, bhvYoshi, 3000); o->activeFlags = ACTIVE_FLAG_DEACTIVATED; } } diff --git a/src/game/spawn_object.c b/src/game/spawn_object.c index c1016ecb9..8de27889c 100644 --- a/src/game/spawn_object.c +++ b/src/game/spawn_object.c @@ -304,7 +304,7 @@ struct Object *allocate_object(struct ObjectNode *objList) { obj->header.gfx.pos[2] = -10000.0f; obj->header.gfx.throwMatrix = NULL; - obj->createdThroughNetwork = false; + obj->coopFlags = 0; obj->areaTimerType = AREA_TIMER_TYPE_NONE; obj->areaTimer = 0; diff --git a/src/pc/crash_handler.c b/src/pc/crash_handler.c index c1ec38017..dd8fc2e0f 100644 --- a/src/pc/crash_handler.c +++ b/src/pc/crash_handler.c @@ -447,6 +447,7 @@ static CRASH_HANDLER_TYPE crash_handler(EXCEPTION_POINTERS *ExceptionInfo) { crash_handler_add_info_int(&pText, 380, -4 + (8 * 0), "Id", (int)gPcDebug.id & 0xFF); crash_handler_add_info_int(&pText, 380, -4 + (8 * 1), "Ofs", (int)gPcDebug.bhvOffset & 0xFF); + crash_handler_add_info_int(&pText, 315, -4 + (8 * 4), "Objs", gPrevFrameObjectCount); int modCount = 0; for (int i = 0; i < gModTableCurrent->entryCount; i++) { diff --git a/src/pc/lua/smlua_cobject_autogen.c b/src/pc/lua/smlua_cobject_autogen.c index 91569ed65..33231c47e 100644 --- a/src/pc/lua/smlua_cobject_autogen.c +++ b/src/pc/lua/smlua_cobject_autogen.c @@ -585,7 +585,7 @@ static struct LuaObjectField sObjectFields[LUA_OBJECT_FIELD_COUNT] = { { "collidedObjInteractTypes", LVT_U32, offsetof(struct Object, collidedObjInteractTypes), false, LOT_NONE }, // { "collidedObjs", LOT_???, offsetof(struct Object, collidedObjs), false, LOT_??? }, <--- UNIMPLEMENTED // { "collisionData", LVT_???, offsetof(struct Object, collisionData), false, LOT_??? }, <--- UNIMPLEMENTED - { "createdThroughNetwork", LVT_U8, offsetof(struct Object, createdThroughNetwork), true, LOT_NONE }, + { "coopFlags", LVT_U8, offsetof(struct Object, coopFlags), true, LOT_NONE }, { "curBhvCommand", LVT_BEHAVIORSCRIPT_P, offsetof(struct Object, curBhvCommand), true, LOT_POINTER }, { "globalPlayerIndex", LVT_U8, offsetof(struct Object, globalPlayerIndex), false, LOT_NONE }, { "header", LVT_COBJECT, offsetof(struct Object, header), true, LOT_OBJECTNODE }, diff --git a/src/pc/lua/smlua_constants_autogen.c b/src/pc/lua/smlua_constants_autogen.c index 6247f31e0..ccc477981 100644 --- a/src/pc/lua/smlua_constants_autogen.c +++ b/src/pc/lua/smlua_constants_autogen.c @@ -2662,4 +2662,7 @@ char gSmluaConstants[] = "" "PLAY_MODE_CHANGE_LEVEL = 4\n" "PLAY_MODE_FRAME_ADVANCE = 5\n" "MAX_PLAYERS = 16\n" +"COOP_OBJ_FLAG_NETWORK = (1 << 0)\n" +"COOP_OBJ_FLAG_LUA = (1 << 1)\n" +"COOP_OBJ_FLAG_NON_SYNC = (1 << 2)\n" ; \ No newline at end of file diff --git a/src/pc/lua/smlua_functions_autogen.c b/src/pc/lua/smlua_functions_autogen.c index 164201ead..0608b5434 100644 --- a/src/pc/lua/smlua_functions_autogen.c +++ b/src/pc/lua/smlua_functions_autogen.c @@ -7456,6 +7456,27 @@ int smlua_func_obj_set_model_extended(lua_State* L) { return 1; } +int smlua_func_spawn_non_sync_object(lua_State* L) { + if(!smlua_functions_valid_param_count(L, 6)) { return 0; } + + int behaviorId = smlua_to_integer(L, 1); + if (!gSmLuaConvertSuccess) { return 0; } + int modelId = smlua_to_integer(L, 2); + if (!gSmLuaConvertSuccess) { return 0; } + f32 x = smlua_to_number(L, 3); + if (!gSmLuaConvertSuccess) { return 0; } + f32 y = smlua_to_number(L, 4); + if (!gSmLuaConvertSuccess) { return 0; } + f32 z = smlua_to_number(L, 5); + if (!gSmLuaConvertSuccess) { return 0; } + LuaFunction objSetupFunction = smlua_to_lua_function(L, 6); + if (!gSmLuaConvertSuccess) { return 0; } + + smlua_push_object(L, LOT_OBJECT, spawn_non_sync_object(behaviorId, modelId, x, y, z, objSetupFunction)); + + return 1; +} + int smlua_func_spawn_sync_object(lua_State* L) { if(!smlua_functions_valid_param_count(L, 6)) { return 0; } @@ -8544,6 +8565,7 @@ void smlua_bind_functions_autogen(void) { smlua_bind_function(L, "obj_has_behavior_id", smlua_func_obj_has_behavior_id); smlua_bind_function(L, "obj_has_model_extended", smlua_func_obj_has_model_extended); smlua_bind_function(L, "obj_set_model_extended", smlua_func_obj_set_model_extended); + smlua_bind_function(L, "spawn_non_sync_object", smlua_func_spawn_non_sync_object); smlua_bind_function(L, "spawn_sync_object", smlua_func_spawn_sync_object); // sound_init.h diff --git a/src/pc/lua/smlua_obj_utils.c b/src/pc/lua/smlua_obj_utils.c index dd46cdabe..bb2cbde54 100644 --- a/src/pc/lua/smlua_obj_utils.c +++ b/src/pc/lua/smlua_obj_utils.c @@ -44,7 +44,8 @@ static struct Object* spawn_object_internal(enum BehaviorId behaviorId, enum Mod obj->oHomeY = y; obj->oHomeZ = z; - obj->createdThroughNetwork = true; + obj->coopFlags = COOP_OBJ_FLAG_LUA; + if (!doSync) { obj->coopFlags |= COOP_OBJ_FLAG_NON_SYNC; } if (objSetupFunction != 0) { lua_State* L = gLuaState; @@ -73,9 +74,8 @@ struct Object* spawn_sync_object(enum BehaviorId behaviorId, enum ModelExtendedI spawn_object_internal(behaviorId, modelId, x, y, z, objSetupFunction, true); } -// this is too dangerous for now -struct Object* spawn_non_sync_object(enum BehaviorId behaviorId, enum ModelExtendedId modelId, f32 x, f32 y, f32 z) { - spawn_object_internal(behaviorId, modelId, x, y, z, 0, false); +struct Object* spawn_non_sync_object(enum BehaviorId behaviorId, enum ModelExtendedId modelId, f32 x, f32 y, f32 z, LuaFunction objSetupFunction) { + spawn_object_internal(behaviorId, modelId, x, y, z, objSetupFunction, false); } s32 obj_has_behavior_id(struct Object *o, enum BehaviorId behaviorId) { diff --git a/src/pc/lua/smlua_obj_utils.h b/src/pc/lua/smlua_obj_utils.h index 44e2405a1..f5fe66030 100644 --- a/src/pc/lua/smlua_obj_utils.h +++ b/src/pc/lua/smlua_obj_utils.h @@ -6,9 +6,7 @@ #include "game/object_list_processor.h" struct Object* spawn_sync_object(enum BehaviorId behaviorId, enum ModelExtendedId modelId, f32 x, f32 y, f32 z, LuaFunction objSetupFunction); - -// this is too dangerous for now -//struct Object* spawn_non_sync_object(enum BehaviorId behaviorId, enum ModelExtendedId modelId, f32 x, f32 y, f32 z); +struct Object* spawn_non_sync_object(enum BehaviorId behaviorId, enum ModelExtendedId modelId, f32 x, f32 y, f32 z, LuaFunction objSetupFunction); s32 obj_has_behavior_id(struct Object *o, enum BehaviorId behaviorId); s32 obj_has_model_extended(struct Object *o, enum ModelExtendedId modelId); diff --git a/src/pc/network/packets/packet_object.c b/src/pc/network/packets/packet_object.c index ffd4b787e..f1a02d0e0 100644 --- a/src/pc/network/packets/packet_object.c +++ b/src/pc/network/packets/packet_object.c @@ -111,6 +111,10 @@ void network_override_object(u8 syncId, struct Object* o) { } struct SyncObject* network_init_object(struct Object *o, float maxSyncDistance) { + if (o->coopFlags & COOP_OBJ_FLAG_NON_SYNC) { + return NULL; + } + bool hadSyncId = (o->oSyncID != 0); // generate new sync ID if (!network_set_sync_id(o)) { @@ -157,6 +161,7 @@ struct SyncObject* network_init_object(struct Object *o, float maxSyncDistance) } void network_init_object_field(struct Object *o, void* field) { + if (o->coopFlags & COOP_OBJ_FLAG_NON_SYNC) { return; } if (o->oSyncID == 0) { return; } // remember to synchronize this extra field diff --git a/src/pc/network/packets/packet_spawn_objects.c b/src/pc/network/packets/packet_spawn_objects.c index 5fb811f6e..bc11f6363 100644 --- a/src/pc/network/packets/packet_spawn_objects.c +++ b/src/pc/network/packets/packet_spawn_objects.c @@ -170,7 +170,8 @@ void network_receive_spawn_objects(struct Packet* p) { } o->globalPlayerIndex = data.globalPlayerIndex; - o->createdThroughNetwork = true; + o->coopFlags |= COOP_OBJ_FLAG_NETWORK; + memcpy(o->rawData.asU32, data.rawData, sizeof(u32) * 80); o->header.gfx.scale[0] = scale[0];