Browse Source

Remove duplicated argument to InvGetItem

This was obscuring efforts to track how ActiveItems and Items are referenced, hopefully can switch back to the Item& soon.
pull/3586/head
ephphatha 5 years ago committed by Anders Jenbo
parent
commit
1d560601f2
  1. 49
      Source/inv.cpp
  2. 2
      Source/inv.h
  3. 6
      Source/msg.cpp

49
Source/inv.cpp

@ -1084,11 +1084,12 @@ void OpenCrypt()
NetSendCmdQuest(true, quest); NetSendCmdQuest(true, quest);
} }
void CleanupItems(Item *item, int ii) void CleanupItems(int ii)
{ {
dItem[item->position.x][item->position.y] = 0; auto &item = Items[ii];
dItem[item.position.x][item.position.y] = 0;
if (currlevel == 21 && item->position == CornerStone.position) { if (currlevel == 21 && item.position == CornerStone.position) {
CornerStone.item._itype = ItemType::None; CornerStone.item._itype = ItemType::None;
CornerStone.item._iSelFlag = 0; CornerStone.item._iSelFlag = 0;
CornerStone.item.position = { 0, 0 }; CornerStone.item.position = { 0, 0 };
@ -1627,14 +1628,15 @@ void CheckItemStats(Player &player)
} }
} }
void InvGetItem(int pnum, Item *item, int ii) void InvGetItem(int pnum, int ii)
{ {
auto &item = Items[ii];
if (dropGoldFlag) { if (dropGoldFlag) {
CloseGoldDrop(); CloseGoldDrop();
dropGoldValue = 0; dropGoldValue = 0;
} }
if (dItem[item->position.x][item->position.y] == 0) if (dItem[item.position.x][item.position.y] == 0)
return; return;
auto &player = Players[pnum]; auto &player = Players[pnum];
@ -1642,15 +1644,15 @@ void InvGetItem(int pnum, Item *item, int ii)
if (MyPlayerId == pnum && pcurs >= CURSOR_FIRSTITEM) if (MyPlayerId == pnum && pcurs >= CURSOR_FIRSTITEM)
NetSendCmdPItem(true, CMD_SYNCPUTITEM, player.position.tile); NetSendCmdPItem(true, CMD_SYNCPUTITEM, player.position.tile);
item->_iCreateInfo &= ~CF_PREGEN; item._iCreateInfo &= ~CF_PREGEN;
player.HoldItem = *item; player.HoldItem = item;
CheckQuestItem(player); CheckQuestItem(player);
CheckBookLevel(player); CheckBookLevel(player);
CheckItemStats(player); CheckItemStats(player);
bool cursorUpdated = false; bool cursorUpdated = false;
if (player.HoldItem._itype == ItemType::Gold && GoldAutoPlace(player)) if (player.HoldItem._itype == ItemType::Gold && GoldAutoPlace(player))
cursorUpdated = true; cursorUpdated = true;
CleanupItems(item, ii); CleanupItems(ii);
pcursitem = -1; pcursitem = -1;
if (!cursorUpdated) if (!cursorUpdated)
NewCursor(player.HoldItem._iCurs + CURSOR_FIRSTITEM); NewCursor(player.HoldItem._iCurs + CURSOR_FIRSTITEM);
@ -1706,7 +1708,7 @@ void AutoGetItem(int pnum, Item *item, int ii)
PlaySFX(IS_IGRAB); PlaySFX(IS_IGRAB);
} }
CleanupItems(&Items[ii], ii); CleanupItems(ii);
return; return;
} }
@ -1742,25 +1744,30 @@ int FindGetItem(int idx, uint16_t ci, int iseed)
void SyncGetItem(Point position, int idx, uint16_t ci, int iseed) void SyncGetItem(Point position, int idx, uint16_t ci, int iseed)
{ {
int ii; // Check what the local client has at the target position
int ii = dItem[position.x][position.y] - 1;
if (dItem[position.x][position.y] != 0) { if (ii >= 0 && ii < MAXITEMS) {
ii = dItem[position.x][position.y] - 1; // If there was an item there, check that it's the same item as the remote player has
if (Items[ii].IDidx == idx if (Items[ii].IDidx != idx
&& Items[ii]._iSeed == iseed || Items[ii]._iSeed != iseed
&& Items[ii]._iCreateInfo == ci) { || Items[ii]._iCreateInfo != ci) {
FindGetItem(idx, ci, iseed); // Key attributes don't match so we must've desynced, ignore this index and try find a matching item via lookup
} else { ii = -1;
ii = FindGetItem(idx, ci, iseed);
} }
} else { }
if (ii == -1) {
// Either there's no item at the expected position or it doesn't match what is being picked up, so look for an item that matches the key attributes
ii = FindGetItem(idx, ci, iseed); ii = FindGetItem(idx, ci, iseed);
} }
if (ii == -1) if (ii == -1) {
// Still can't find the expected item, assume it was collected earlier and this caused the desync
return; return;
}
CleanupItems(&Items[ii], ii); CleanupItems(ii);
} }
bool CanPut(Point position) bool CanPut(Point position)

2
Source/inv.h

@ -159,7 +159,7 @@ void CheckInvItem(bool isShiftHeld = false, bool isCtrlHeld = false);
*/ */
void CheckInvScrn(bool isShiftHeld, bool isCtrlHeld); void CheckInvScrn(bool isShiftHeld, bool isCtrlHeld);
void CheckItemStats(Player &player); void CheckItemStats(Player &player);
void InvGetItem(int pnum, Item *item, int ii); void InvGetItem(int pnum, int ii);
void AutoGetItem(int pnum, Item *item, int ii); void AutoGetItem(int pnum, Item *item, int ii);
int FindGetItem(int idx, uint16_t ci, int iseed); int FindGetItem(int idx, uint16_t ci, int iseed);
void SyncGetItem(Point position, int idx, uint16_t ci, int iseed); void SyncGetItem(Point position, int idx, uint16_t ci, int iseed);

6
Source/msg.cpp

@ -724,7 +724,7 @@ DWORD OnRequestGetItem(const TCmd *pCmd, Player &player)
if (message.bPnum != MyPlayerId) if (message.bPnum != MyPlayerId)
SyncGetItem(position, message.wIndx, message.wCI, message.dwSeed); SyncGetItem(position, message.wIndx, message.wCI, message.dwSeed);
else else
InvGetItem(MyPlayerId, &Items[ii], ii); InvGetItem(MyPlayerId, ii);
SetItemRecord(message.dwSeed, message.wCI, message.wIndx); SetItemRecord(message.dwSeed, message.wCI, message.wIndx);
} else if (!NetSendCmdReq2(CMD_REQUESTGITEM, MyPlayerId, message.bPnum, message)) { } else if (!NetSendCmdReq2(CMD_REQUESTGITEM, MyPlayerId, message.bPnum, message)) {
NetSendCmdExtra(message); NetSendCmdExtra(message);
@ -751,9 +751,9 @@ DWORD OnGetItem(const TCmd *pCmd, int pnum)
auto &player = Players[MyPlayerId]; auto &player = Players[MyPlayerId];
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); 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) if (ii != -1)
InvGetItem(MyPlayerId, &Items[ii], ii); InvGetItem(MyPlayerId, ii);
} else { } else {
InvGetItem(MyPlayerId, &Items[ii], ii); InvGetItem(MyPlayerId, ii);
} }
} else { } else {
SyncGetItem(position, message.wIndx, message.wCI, message.dwSeed); SyncGetItem(position, message.wIndx, message.wCI, message.dwSeed);

Loading…
Cancel
Save