diff --git a/Source/inv.cpp b/Source/inv.cpp index 8f50426cb..78bfaf2f5 100644 --- a/Source/inv.cpp +++ b/Source/inv.cpp @@ -1870,6 +1870,11 @@ int SyncPutItem(Player &player, Point position, int idx, uint16_t icreateinfo, i assert(CanPut(position)); + return SyncDropItem(position, idx, icreateinfo, iseed, id, dur, mdur, ch, mch, ivalue, ibuff, toHit, maxDam, minStr, minMag, minDex, ac); +} + +int SyncDropItem(Point position, int idx, uint16_t icreateinfo, int iseed, int id, int dur, int mdur, int ch, int mch, int ivalue, uint32_t ibuff, int toHit, int maxDam, int minStr, int minMag, int minDex, int ac) +{ int ii = AllocateItem(); auto &item = Items[ii]; diff --git a/Source/inv.h b/Source/inv.h index 5e9bb161c..37d0a4b12 100644 --- a/Source/inv.h +++ b/Source/inv.h @@ -175,6 +175,7 @@ bool CanPut(Point position); bool TryInvPut(); int InvPutItem(Player &player, Point position); int SyncPutItem(Player &player, Point position, int idx, uint16_t icreateinfo, int iseed, int Id, int dur, int mdur, int ch, int mch, int ivalue, uint32_t ibuff, int toHit, int maxDam, int minStr, int minMag, int minDex, int ac); +int SyncDropItem(Point position, int idx, uint16_t icreateinfo, int iseed, int id, int dur, int mdur, int ch, int mch, int ivalue, uint32_t ibuff, int toHit, int maxDam, int minStr, int minMag, int minDex, int ac); int8_t CheckInvHLight(); void RemoveScroll(Player &player); bool UseScroll(); diff --git a/Source/msg.cpp b/Source/msg.cpp index 26c534ca3..92226064f 100644 --- a/Source/msg.cpp +++ b/Source/msg.cpp @@ -1614,10 +1614,17 @@ DWORD OnDropItem(const TCmd *pCmd, int pnum) { const auto &message = *reinterpret_cast(pCmd); - if (gbBufferMsgs == 1) + if (gbBufferMsgs == 1) { SendPacket(pnum, &message, sizeof(message)); - else if (IsPItemValid(message)) - DeltaPutItem(message, { message.x, message.y }, Players[pnum].plrlevel); + } else if (IsPItemValid(message)) { + int playerLevel = Players[pnum].plrlevel; + Point position = { message.x, message.y }; + if (currlevel == playerLevel && pnum != MyPlayerId) { + SyncDropItem(position, 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); + } + PutItemRecord(message.dwSeed, message.wCI, message.wIndx); + DeltaPutItem(message, position, playerLevel); + } return sizeof(message); }