Somewhat synchronized player's interact/used objects

This commit is contained in:
MysterD 2020-10-02 23:34:19 -07:00
parent 5729c3ffac
commit b6e5581111

View file

@ -46,15 +46,20 @@ struct PacketPlayerData {
u8 customFlags; u8 customFlags;
u32 heldSyncID; u32 heldSyncID;
u32 heldBySyncID; u32 heldBySyncID;
u32 interactSyncID;
u32 usedSyncID;
s16 currLevelNum; s16 currLevelNum;
s16 currAreaIndex; s16 currAreaIndex;
}; };
static void read_packet_data(struct PacketPlayerData* data, struct MarioState* m) { static void read_packet_data(struct PacketPlayerData* data, struct MarioState* m) {
u32 heldSyncID = (m->heldObj != NULL) ? m->heldObj->oSyncID : 0; u32 heldSyncID = (m->heldObj != NULL) ? m->heldObj->oSyncID : 0;
u32 heldBySyncID = (m->heldByObj != NULL) ? m->heldByObj->oSyncID : 0; u32 heldBySyncID = (m->heldByObj != NULL) ? m->heldByObj->oSyncID : 0;
u8 customFlags = SET_BIT((m->freeze > 0), 0); u32 interactSyncID = (m->interactObj != NULL) ? m->interactObj->oSyncID : 0;
u32 usedSyncID = (m->usedObj != NULL) ? m->usedObj->oSyncID : 0;
u8 customFlags = SET_BIT((m->freeze > 0), 0);
memcpy(data->rawData, m->marioObj->rawData.asU32, sizeof(u32) * 80); memcpy(data->rawData, m->marioObj->rawData.asU32, sizeof(u32) * 80);
data->nodeFlags = m->marioObj->header.gfx.node.flags; data->nodeFlags = m->marioObj->header.gfx.node.flags;
@ -89,16 +94,19 @@ static void read_packet_data(struct PacketPlayerData* data, struct MarioState* m
data->peakHeight = m->peakHeight; data->peakHeight = m->peakHeight;
data->currentRoom = m->currentRoom; data->currentRoom = m->currentRoom;
data->customFlags = customFlags; data->customFlags = customFlags;
data->heldSyncID = heldSyncID; data->heldSyncID = heldSyncID;
data->heldBySyncID = heldBySyncID; data->heldBySyncID = heldBySyncID;
data->interactSyncID = interactSyncID;
data->usedSyncID = usedSyncID;
data->currLevelNum = gCurrLevelNum; data->currLevelNum = gCurrLevelNum;
data->currAreaIndex = gCurrAreaIndex; data->currAreaIndex = gCurrAreaIndex;
} }
static void write_packet_data(struct PacketPlayerData* data, struct MarioState* m, static void write_packet_data(struct PacketPlayerData* data, struct MarioState* m,
u8* customFlags, u32* heldSyncID, u32* heldBySyncID) { u8* customFlags, u32* heldSyncID, u32* heldBySyncID,
u32* interactSyncID, u32* usedSyncID) {
memcpy(m->marioObj->rawData.asU32, data->rawData, sizeof(u32) * 80); memcpy(m->marioObj->rawData.asU32, data->rawData, sizeof(u32) * 80);
m->marioObj->header.gfx.node.flags = data->nodeFlags; m->marioObj->header.gfx.node.flags = data->nodeFlags;
*m->controller = data->controller; *m->controller = data->controller;
@ -132,9 +140,11 @@ static void write_packet_data(struct PacketPlayerData* data, struct MarioState*
m->peakHeight = data->peakHeight; m->peakHeight = data->peakHeight;
m->currentRoom = data->currentRoom; m->currentRoom = data->currentRoom;
*customFlags = data->customFlags; *customFlags = data->customFlags;
*heldSyncID = data->heldSyncID; *heldSyncID = data->heldSyncID;
*heldBySyncID = data->heldBySyncID; *heldBySyncID = data->heldBySyncID;
*interactSyncID = data->interactSyncID;
*usedSyncID = data->usedSyncID;
} }
void network_send_player(void) { void network_send_player(void) {
@ -180,10 +190,14 @@ void network_receive_player(struct Packet* p) {
if (levelAreaMismatch) { return; } if (levelAreaMismatch) { return; }
// apply data from packet to mario state // apply data from packet to mario state
u32 heldSyncID = 0; u32 heldSyncID = 0;
u32 heldBySyncID = 0; u32 heldBySyncID = 0;
u8 customFlags = 0; u32 interactSyncID = 0;
write_packet_data(&data, m, &customFlags, &heldSyncID, &heldBySyncID); u32 usedSyncID = 0;
u8 customFlags = 0;
write_packet_data(&data, m, &customFlags,
&heldSyncID, &heldBySyncID,
&interactSyncID, &usedSyncID);
// read custom flags // read custom flags
m->freeze = GET_BIT(customFlags, 0); m->freeze = GET_BIT(customFlags, 0);
@ -220,6 +234,16 @@ void network_receive_player(struct Packet* p) {
m->heldByObj = NULL; m->heldByObj = NULL;
} }
// find and set their interact object
if (interactSyncID != 0 && gSyncObjects[interactSyncID].o != NULL) {
m->interactObj = gSyncObjects[interactSyncID].o;
}
// find and set their used object
if (usedSyncID != 0 && gSyncObjects[usedSyncID].o != NULL) {
m->usedObj = gSyncObjects[usedSyncID].o;
}
// jump kicking: restore action state, otherwise it won't play // jump kicking: restore action state, otherwise it won't play
if (m->action == ACT_JUMP_KICK) { if (m->action == ACT_JUMP_KICK) {
m->actionState = oldData.actionState; m->actionState = oldData.actionState;