Added ability for Lua to spawn non-synchronized objects

This commit is contained in:
MysterD 2022-03-09 20:11:45 -08:00
parent 3641d5404e
commit d03aacc144
67 changed files with 526 additions and 371 deletions

View file

@ -66,7 +66,7 @@ override_field_immutable = {
"Character": [ "*" ],
"NetworkPlayer": [ "*" ],
"TextureInfo": [ "*" ],
"Object": ["oSyncID", "createdThroughNetwork"],
"Object": ["oSyncID", "coopFlags"],
"GlobalObjectAnimations": [ "*"],
"SpawnParticlesInfo": [ "model" ],
}

View file

@ -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

View file

@ -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)
<br />
@ -11698,6 +11699,31 @@ The `reliable` field will ensure that the packet arrives, but should be used spa
<br />
## [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:](#)
<br />
## [spawn_sync_object](#spawn_sync_object)
### Lua Example

View file

@ -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 |

View file

@ -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_

View file

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

View file

@ -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;
}

View file

@ -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)) {

View file

@ -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);

View file

@ -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);

View file

@ -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) {

View file

@ -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);

View file

@ -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);

View file

@ -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;
}

View file

@ -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) {

View file

@ -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) {

View file

@ -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();

View file

@ -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) {

View file

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

View file

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

View file

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

View file

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

View file

@ -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)) {

View file

@ -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);
}
}
/**

View file

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

View file

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

View file

@ -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

View file

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

View file

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

View file

@ -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) {

View file

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

View file

@ -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;
}
}
/**

View file

@ -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);
}
}
/**

View file

@ -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);

View file

@ -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;
}
}
}

View file

@ -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) {

View file

@ -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:

View file

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

View file

@ -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) {

View file

@ -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)

View file

@ -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;
}
}

View file

@ -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);

View file

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

View file

@ -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) {

View file

@ -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();

View file

@ -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);
}
}
/**

View file

@ -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);
}
}
/**

View file

@ -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);
}
}
/**

View file

@ -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);
}
}
/**

View file

@ -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);
}
}
/**

View file

@ -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);
}
}
/**

View file

@ -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);
}
}
/**

View file

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

View file

@ -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);
}
}
/**

View file

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

View file

@ -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) {

View file

@ -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);

View file

@ -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;
}
}

View file

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

View file

@ -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++) {

View file

@ -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 },

View file

@ -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"
;

View file

@ -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

View file

@ -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) {

View file

@ -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);

View file

@ -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

View file

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