diff --git a/Source/monster.cpp b/Source/monster.cpp index b79d3f7b8..f5075896d 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -4011,7 +4011,7 @@ void M_StartKill(int i, int pnum) if (i != pnum) { NetSendCmdLocParam1(false, CMD_MONSTDEATH, monster.position.tile, i); } else { - NetSendCmdLocParam1(false, CMD_KILLGOLEM, monster.position.tile, currlevel); + NetSendCmdLoc(MyPlayerId, false, CMD_KILLGOLEM, monster.position.tile); } } @@ -4900,7 +4900,7 @@ void SpawnGolem(int i, Point position, Missile &missile) golem._mdir, golem._menemy, golem._mhitpoints, - currlevel); + GetLevelForMultiplayer(player)); } } diff --git a/Source/msg.cpp b/Source/msg.cpp index 5307bb649..306bf412a 100644 --- a/Source/msg.cpp +++ b/Source/msg.cpp @@ -139,7 +139,8 @@ DLevel &GetDeltaLevel(uint8_t level) /** @brief Gets a delta level. */ DLevel &GetDeltaLevel(const Player &player) { - return GetDeltaLevel(player.plrlevel); + uint8_t level = GetLevelForMultiplayer(player); + return GetDeltaLevel(level); } /** @@ -870,9 +871,10 @@ DWORD OnGetItem(const TCmd *pCmd, int pnum) } else if (IsGItemValid(message)) { const Point position { message.x, message.y }; if (DeltaGetItem(message, message.bLevel)) { - if ((currlevel == message.bLevel || message.bPnum == MyPlayerId) && message.bMaster != MyPlayerId) { + bool isOnActiveLevel = GetLevelForMultiplayer(*MyPlayer) == message.bLevel; + if ((isOnActiveLevel || message.bPnum == MyPlayerId) && message.bMaster != MyPlayerId) { if (message.bPnum == MyPlayerId) { - if (currlevel != message.bLevel) { + if (!isOnActiveLevel) { int ii = SyncPutItem(*MyPlayer, MyPlayer->position.tile, message.wIndx, message.wCI, message.dwSeed, message.bId, message.bDur, message.bMDur, message.bCh, message.bMCh, message.wValue, message.dwBuff, message.wToHit, message.wMaxDam, message.bMinStr, message.bMinMag, message.bMinDex, message.bAC); if (ii != -1) InvGetItem(*MyPlayer, ii); @@ -938,9 +940,10 @@ DWORD OnAutoGetItem(const TCmd *pCmd, int pnum) } else if (IsGItemValid(message)) { const Point position { message.x, message.y }; if (DeltaGetItem(message, message.bLevel)) { - if ((currlevel == message.bLevel || message.bPnum == MyPlayerId) && message.bMaster != MyPlayerId) { + uint8_t localLevel = GetLevelForMultiplayer(*MyPlayer); + if ((localLevel == message.bLevel || message.bPnum == MyPlayerId) && message.bMaster != MyPlayerId) { if (message.bPnum == MyPlayerId) { - if (currlevel != message.bLevel) { + if (localLevel != message.bLevel) { Player &player = *MyPlayer; int ii = SyncPutItem(player, player.position.tile, message.wIndx, message.wCI, message.dwSeed, message.bId, message.bDur, message.bMDur, message.bCh, message.bMCh, message.wValue, message.dwBuff, message.wToHit, message.wMaxDam, message.bMinStr, message.bMinMag, message.bMinDex, message.bAC); if (ii != -1) @@ -1531,12 +1534,12 @@ DWORD OnMonstDeath(const TCmd *pCmd, int pnum) DWORD OnKillGolem(const TCmd *pCmd, int pnum) { - const auto &message = *reinterpret_cast(pCmd); + const auto &message = *reinterpret_cast(pCmd); const Point position { message.x, message.y }; if (gbBufferMsgs == 1) SendPacket(pnum, &message, sizeof(message)); - else if (pnum != MyPlayerId && InDungeonBounds(position) && message.wParam1 < NUMLEVELS) { + else if (pnum != MyPlayerId && InDungeonBounds(position)) { Player &player = Players[pnum]; if (player.isOnActiveLevel()) M_SyncStartKill(pnum, position, pnum); @@ -2275,7 +2278,8 @@ void DeltaAddItem(int ii) if (!gbIsMultiplayer) return; - DLevel &deltaLevel = GetDeltaLevel(currlevel); + uint8_t localLevel = GetLevelForMultiplayer(*MyPlayer); + DLevel &deltaLevel = GetDeltaLevel(localLevel); for (const TCmdPItem &item : deltaLevel.item) { if (item.bCmd != CMD_INVALID @@ -2325,7 +2329,8 @@ void DeltaSaveLevel() ResetPlayerGFX(Players[i]); } MyPlayer->_pLvlVisited[currlevel] = true; - DeltaLeaveSync(currlevel); + uint8_t localLevel = currlevel; + DeltaLeaveSync(localLevel); } namespace { @@ -2351,13 +2356,19 @@ Point GetItemPosition(Point position) } // namespace +uint8_t GetLevelForMultiplayer(const Player &player) +{ + return player.plrlevel; +} + void DeltaLoadLevel() { if (!gbIsMultiplayer) return; deltaload = true; - DLevel &deltaLevel = GetDeltaLevel(currlevel); + uint8_t localLevel = GetLevelForMultiplayer(*MyPlayer); + DLevel &deltaLevel = GetDeltaLevel(localLevel); if (leveltype != DTYPE_TOWN) { for (int i = 0; i < ActiveMonsterCount; i++) { if (deltaLevel.monster[i]._mx == 0xFF) @@ -2399,7 +2410,7 @@ void DeltaLoadLevel() monster._msquelch = deltaLevel.monster[i]._mactive; } } - auto localLevelIt = LocalLevels.find(currlevel); + auto localLevelIt = LocalLevels.find(localLevel); if (localLevelIt != LocalLevels.end()) memcpy(AutomapView, &localLevelIt->second, sizeof(AutomapView)); else @@ -2710,7 +2721,7 @@ void NetSendCmdGItem(bool bHiPri, _cmd_id bCmd, uint8_t mast, uint8_t pnum, uint cmd.bCmd = bCmd; cmd.bPnum = pnum; cmd.bMaster = mast; - cmd.bLevel = currlevel; + cmd.bLevel = GetLevelForMultiplayer(*MyPlayer); cmd.bCursitem = ii; cmd.dwTime = 0; cmd.x = Items[ii].position.x; diff --git a/Source/msg.h b/Source/msg.h index 1c9d8cf8c..8d66993a9 100644 --- a/Source/msg.h +++ b/Source/msg.h @@ -724,6 +724,7 @@ void delta_init(); void delta_kill_monster(int mi, Point position, const Player &player); void delta_monster_hp(int mi, int hp, const Player &player); void delta_sync_monster(const TSyncMonster &monsterSync, uint8_t level); +uint8_t GetLevelForMultiplayer(const Player &player); void DeltaAddItem(int ii); void DeltaSaveLevel(); void DeltaLoadLevel(); diff --git a/Source/sync.cpp b/Source/sync.cpp index a66d5e05e..7619d4cb7 100644 --- a/Source/sync.cpp +++ b/Source/sync.cpp @@ -260,7 +260,7 @@ uint32_t sync_all_monsters(byte *pbBuf, uint32_t dwMaxLen) dwMaxLen -= sizeof(TSyncHeader); pHdr->bCmd = CMD_SYNCDATA; - pHdr->bLevel = currlevel; + pHdr->bLevel = GetLevelForMultiplayer(*MyPlayer); pHdr->wLen = 0; SyncPlrInv(pHdr); assert(dwMaxLen <= 0xffff); @@ -311,7 +311,7 @@ uint32_t OnSyncData(const TCmd *pCmd, int pnum) if (!IsTSyncMonsterValidate(monsterSyncs[i])) continue; - if (currlevel == level) { + if (GetLevelForMultiplayer(*MyPlayer) == level) { SyncMonster(pnum, monsterSyncs[i]); }