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