Sync riddenObj, prevent remote interaction with shell

This commit is contained in:
MysterD 2020-10-14 20:50:55 -07:00
parent 8fc8ca6ca7
commit cfd559bc74
2 changed files with 19 additions and 3 deletions

View file

@ -1704,6 +1704,8 @@ u32 interact_breakable(struct MarioState *m, UNUSED u32 interactType, struct Obj
}
u32 interact_koopa_shell(struct MarioState *m, UNUSED u32 interactType, struct Object *o) {
if (m->playerIndex != 0) { return FALSE; }
if (o->oInteractStatus & INT_STATUS_INTERACTED) {
return FALSE;
}

View file

@ -59,6 +59,7 @@ struct PacketPlayerData {
u8 customFlags;
u8 heldSyncID;
u8 heldBySyncID;
u8 riddenSyncID;
u8 interactSyncID;
u8 usedSyncID;
u8 platformSyncID;
@ -70,6 +71,7 @@ struct PacketPlayerData {
static void read_packet_data(struct PacketPlayerData* data, struct MarioState* m) {
u8 heldSyncID = (m->heldObj != NULL) ? m->heldObj->oSyncID : 0;
u8 heldBySyncID = (m->heldByObj != NULL) ? m->heldByObj->oSyncID : 0;
u8 riddenSyncID = (m->riddenObj != NULL) ? m->riddenObj->oSyncID : 0;
u8 interactSyncID = (m->interactObj != NULL) ? m->interactObj->oSyncID : 0;
u8 usedSyncID = (m->usedObj != NULL) ? m->usedObj->oSyncID : 0;
u8 platformSyncID = (m->marioObj->platform != NULL) ? m->marioObj->platform->oSyncID : 0;
@ -121,6 +123,7 @@ static void read_packet_data(struct PacketPlayerData* data, struct MarioState* m
data->customFlags = customFlags;
data->heldSyncID = heldSyncID;
data->heldBySyncID = heldBySyncID;
data->riddenSyncID = riddenSyncID;
data->interactSyncID = interactSyncID;
data->usedSyncID = usedSyncID;
data->platformSyncID = platformSyncID;
@ -131,7 +134,8 @@ static void read_packet_data(struct PacketPlayerData* data, struct MarioState* m
static void write_packet_data(struct PacketPlayerData* data, struct MarioState* m,
u8* customFlags, u8* heldSyncID, u8* heldBySyncID,
u8* interactSyncID, u8* usedSyncID, u8* platformSyncID) {
u8* riddenSyncID, u8* interactSyncID, u8* usedSyncID,
u8* platformSyncID) {
memcpy(m->marioObj->rawData.asU32, data->rawData, sizeof(u32) * 80);
m->marioObj->header.gfx.node.flags = data->nodeFlags;
@ -177,6 +181,7 @@ static void write_packet_data(struct PacketPlayerData* data, struct MarioState*
*customFlags = data->customFlags;
*heldSyncID = data->heldSyncID;
*heldBySyncID = data->heldBySyncID;
*riddenSyncID = data->riddenSyncID;
*interactSyncID = data->interactSyncID;
*usedSyncID = data->usedSyncID;
*platformSyncID = data->platformSyncID;
@ -229,14 +234,15 @@ void network_receive_player(struct Packet* p) {
// apply data from packet to mario state
u8 heldSyncID = 0;
u8 heldBySyncID = 0;
u8 riddenSyncID = 0;
u8 interactSyncID = 0;
u8 usedSyncID = 0;
u8 platformSyncID = 0;
u8 customFlags = 0;
write_packet_data(&data, m, &customFlags,
&heldSyncID, &heldBySyncID,
&interactSyncID, &usedSyncID,
&platformSyncID);
&riddenSyncID, &interactSyncID,
&usedSyncID, &platformSyncID);
// read custom flags
m->freeze = GET_BIT(customFlags, 0);
@ -270,6 +276,14 @@ void network_receive_player(struct Packet* p) {
m->heldByObj = NULL;
}
// find and set their ridden object
if (riddenSyncID != 0 && gSyncObjects[riddenSyncID].o != NULL) {
gSyncObjects[riddenSyncID].o->heldByPlayerIndex = np->localIndex;
m->riddenObj = gSyncObjects[riddenSyncID].o;
} else {
m->riddenObj = NULL;
}
// find and set their interact object
if (interactSyncID != 0 && gSyncObjects[interactSyncID].o != NULL) {
m->interactObj = gSyncObjects[interactSyncID].o;