diff --git a/Source/inv.cpp b/Source/inv.cpp index 563e68dca..a0e8a8048 100644 --- a/Source/inv.cpp +++ b/Source/inv.cpp @@ -1746,6 +1746,22 @@ bool CanPut(Point position) return true; } +int16_t ClampToHit(const Item &item, int16_t toHit) +{ + if (toHit < item._iPLToHit || toHit > 51) + return item._iPLToHit; + + return toHit; +} + +uint8_t ClampMaxDam(const Item &item, uint8_t maxDam) +{ + if (maxDam < item._iMaxDam || maxDam - item._iMinDam > 30) + return item._iMaxDam; + + return maxDam; +} + int SyncDropItem(Point position, _item_indexes 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) { if (ActiveItemCount >= MAXITEMS) @@ -1756,13 +1772,13 @@ int SyncDropItem(Point position, _item_indexes idx, uint16_t icreateinfo, int is RecreateItem(*MyPlayer, item, idx, icreateinfo, iseed, ivalue, (ibuff & CF_HELLFIRE) != 0); if (id != 0) item._iIdentified = true; - item._iDurability = dur; item._iMaxDur = mdur; - item._iCharges = ch; - item._iMaxCharges = mch; + item._iDurability = clamp(dur, 1, item._iMaxDur); + item._iMaxCharges = clamp(mch, 0, item._iMaxCharges); + item._iCharges = clamp(ch, 0, item._iMaxCharges); if (gbIsHellfire) { - item._iPLToHit = toHit; - item._iMaxDam = maxDam; + item._iPLToHit = ClampToHit(item, toHit); + item._iMaxDam = ClampMaxDam(item, maxDam); } item.dwBuff = ibuff; diff --git a/Source/inv.h b/Source/inv.h index 6220c635e..570db2127 100644 --- a/Source/inv.h +++ b/Source/inv.h @@ -219,6 +219,8 @@ void SyncGetItem(Point position, uint32_t iseed, _item_indexes idx, uint16_t ci) */ bool CanPut(Point position); +int16_t ClampToHit(const Item &item, int16_t toHit); +uint8_t ClampMaxDam(const Item &item, uint8_t maxDam); int SyncDropItem(Point position, _item_indexes 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 SyncDropEar(Point position, uint16_t icreateinfo, uint32_t iseed, uint8_t cursval, string_view heroname); int8_t CheckInvHLight(); diff --git a/Source/msg.cpp b/Source/msg.cpp index 878fadac1..33db3807a 100644 --- a/Source/msg.cpp +++ b/Source/msg.cpp @@ -1033,13 +1033,13 @@ void RecreateItem(const Player &player, const TItem &messageItem, Item &item) SDL_SwapLE32(messageItem.dwSeed), SDL_SwapLE16(messageItem.wValue), (dwBuff & CF_HELLFIRE) != 0); if (messageItem.bId != 0) item._iIdentified = true; - item._iDurability = messageItem.bDur; item._iMaxDur = messageItem.bMDur; - item._iCharges = messageItem.bCh; - item._iMaxCharges = messageItem.bMCh; + item._iDurability = clamp(messageItem.bDur, 1, item._iMaxDur); + item._iMaxCharges = clamp(messageItem.bMCh, 0, item._iMaxCharges); + item._iCharges = clamp(messageItem.bCh, 0, item._iMaxCharges); if (gbIsHellfire) { - item._iPLToHit = SDL_SwapLE16(messageItem.wToHit); - item._iMaxDam = SDL_SwapLE16(messageItem.wMaxDam); + item._iPLToHit = ClampToHit(item, SDL_SwapLE16(messageItem.wToHit)); + item._iMaxDam = ClampMaxDam(item, SDL_SwapLE16(messageItem.wMaxDam)); } item.dwBuff = dwBuff; }