diff --git a/Source/msg.cpp b/Source/msg.cpp index 78142e64c..3c653344b 100644 --- a/Source/msg.cpp +++ b/Source/msg.cpp @@ -1308,30 +1308,37 @@ size_t OnGetItem(const TCmdGItem &message, Player &player) { if (gbBufferMsgs == 1) { BufferMessage(player, &message, sizeof(message)); - } else if (IsGItemValid(message)) { - const Point position { message.x, message.y }; - const uint32_t dwSeed = SDL_SwapLE32(message.def.dwSeed); - const uint16_t wCI = SDL_SwapLE16(message.def.wCI); - const auto wIndx = static_cast<_item_indexes>(SDL_SwapLE16(message.def.wIndx)); - if (DeltaGetItem(message, message.bLevel)) { - bool isOnActiveLevel = GetLevelForMultiplayer(*MyPlayer) == message.bLevel; - if ((isOnActiveLevel || message.bPnum == MyPlayerId) && message.bMaster != MyPlayerId) { - if (message.bPnum == MyPlayerId) { - if (!isOnActiveLevel) { - int ii = SyncDropItem(message); - if (ii != -1) - InvGetItem(*MyPlayer, ii); - } else { - int activeItemIndex = FindGetItem(dwSeed, wIndx, wCI); - InvGetItem(*MyPlayer, ActiveItems[activeItemIndex]); - } - } else { - SyncGetItem(position, dwSeed, wIndx, wCI); - } - } - } else { - NetSendCmdGItem2(true, CMD_GETITEM, message.bMaster, message.bPnum, message); - } + return sizeof(message); + } + + if (!IsGItemValid(message)) + return sizeof(message); + + const Point position { message.x, message.y }; + const uint32_t dwSeed = SDL_SwapLE32(message.def.dwSeed); + const uint16_t wCI = SDL_SwapLE16(message.def.wCI); + const auto wIndx = static_cast<_item_indexes>(SDL_SwapLE16(message.def.wIndx)); + if (!DeltaGetItem(message, message.bLevel)) { + NetSendCmdGItem2(true, CMD_GETITEM, message.bMaster, message.bPnum, message); + return sizeof(message); + } + + bool isOnActiveLevel = GetLevelForMultiplayer(*MyPlayer) == message.bLevel; + if ((!isOnActiveLevel && message.bPnum != MyPlayerId) || message.bMaster == MyPlayerId) + return sizeof(message); + + if (message.bPnum != MyPlayerId) { + SyncGetItem(position, dwSeed, wIndx, wCI); + return sizeof(message); + } + + if (!isOnActiveLevel) { + int ii = SyncDropItem(message); + if (ii != -1) + InvGetItem(*MyPlayer, ii); + } else { + int activeItemIndex = FindGetItem(dwSeed, wIndx, wCI); + InvGetItem(*MyPlayer, ActiveItems[activeItemIndex]); } return sizeof(message);