diff --git a/Source/msg.cpp b/Source/msg.cpp index 0217c9dbc..ea0e10775 100644 --- a/Source/msg.cpp +++ b/Source/msg.cpp @@ -537,13 +537,16 @@ void DeltaLeaveSync(uint8_t bLevel) LocalLevels.insert_or_assign(bLevel, AutomapView); } -void DeltaSyncObject(int oi, _cmd_id bCmd, const Player &player) +void DeltaSyncObject(const Object &liveObject, _cmd_id bCmd, const Player &player) { if (!gbIsMultiplayer) return; sgbDeltaChanged = true; - GetDeltaLevel(player).object[oi].bCmd = bCmd; + + // object deltas are laid out in memory using the same relative offsets as the Objects array. + size_t deltaIndex = std::distance(&Objects[0], &liveObject); + GetDeltaLevel(player).object[deltaIndex].bCmd = bCmd; } bool DeltaGetItem(const TCmdGItem &message, uint8_t bLevel) @@ -1645,7 +1648,7 @@ size_t OnOpenDoor(const TCmd *pCmd, int pnum) Player &player = Players[pnum]; if (player.isOnActiveLevel()) SyncOpObject(player, CMD_OPENDOOR, message.wParam1); - DeltaSyncObject(message.wParam1, CMD_OPENDOOR, player); + DeltaSyncObject(Objects[message.wParam1], CMD_OPENDOOR, player); } return sizeof(message); @@ -1661,7 +1664,7 @@ size_t OnCloseDoor(const TCmd *pCmd, int pnum) Player &player = Players[pnum]; if (player.isOnActiveLevel()) SyncOpObject(player, CMD_CLOSEDOOR, message.wParam1); - DeltaSyncObject(message.wParam1, CMD_CLOSEDOOR, player); + DeltaSyncObject(Objects[message.wParam1], CMD_CLOSEDOOR, player); } return sizeof(message); @@ -1677,7 +1680,7 @@ size_t OnOperateObject(const TCmd *pCmd, int pnum) Player &player = Players[pnum]; if (player.isOnActiveLevel()) SyncOpObject(player, CMD_OPERATEOBJ, message.wParam1); - DeltaSyncObject(message.wParam1, CMD_OPERATEOBJ, player); + DeltaSyncObject(Objects[message.wParam1], CMD_OPERATEOBJ, player); } return sizeof(message); @@ -1693,7 +1696,7 @@ size_t OnPlayerOperateObject(const TCmd *pCmd, int pnum) Player &player = Players[pnum]; if (player.isOnActiveLevel()) SyncOpObject(player, CMD_PLROPOBJ, message.wParam1); - DeltaSyncObject(message.wParam1, CMD_PLROPOBJ, player); + DeltaSyncObject(Objects[message.wParam1], CMD_PLROPOBJ, player); } return sizeof(message); @@ -1710,7 +1713,7 @@ size_t OnBreakObject(const TCmd *pCmd, int pnum) if (player.isOnActiveLevel()) { SyncBreakObj(player, Objects[message.wParam1]); } - DeltaSyncObject(message.wParam1, CMD_BREAKOBJ, player); + DeltaSyncObject(Objects[message.wParam1], CMD_BREAKOBJ, player); } return sizeof(message); @@ -3046,7 +3049,7 @@ size_t ParseCmd(int pnum, const TCmd *pCmd) case CMD_PLROPOBJ: return OnPlayerOperateObject(pCmd, pnum); case CMD_BREAKOBJ: - return OnBreakObject(pCmd, pnum); + return OnBreakObject(*pCmd, pnum); case CMD_CHANGEPLRITEMS: return OnChangePlayerItems(pCmd, pnum); case CMD_DELPLRITEMS: