Browse Source

Validate item modifier ranges

pull/5894/head
Anders Jenbo 3 years ago
parent
commit
89a677d0cb
  1. 26
      Source/inv.cpp
  2. 2
      Source/inv.h
  3. 10
      Source/msg.cpp

26
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<int>(dur, 1, item._iMaxDur);
item._iMaxCharges = clamp<int>(mch, 0, item._iMaxCharges);
item._iCharges = clamp<int>(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;

2
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();

10
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<int>(messageItem.bDur, 1, item._iMaxDur);
item._iMaxCharges = clamp<int>(messageItem.bMCh, 0, item._iMaxCharges);
item._iCharges = clamp<int>(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;
}

Loading…
Cancel
Save