From 4d730b5e5d7e90a965b0dd421a881f03f27c9082 Mon Sep 17 00:00:00 2001 From: ephphatha Date: Tue, 19 Jul 2022 21:20:50 +1000 Subject: [PATCH] Take object reference in DeltaSyncObject Delta object records are only laid out in the same order as object instances by convention, document this relationship and use the explicit offset instead of "network id" --- Source/msg.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) 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: