Make FindGetItem return an index into ActiveItems

This allows the calling code in DeltaLoadLevel to behave the same as every other use of DeleteItem, making it possible to remove the duplicate argument and ensure that the ActiveItems/AvailableItems arrays are treated appropriately.
This commit is contained in:
ephphatha 2021-09-23 23:50:39 +10:00 committed by Anders Jenbo
commit baa1cd65c5
6 changed files with 55 additions and 48 deletions

View file

@ -715,14 +715,18 @@ DWORD OnRequestGetItem(const TCmd *pCmd, Player &player)
}
}
if (ii == -1) { // No item at the target position or the key attributes don't match, so try find a matching item.
ii = FindGetItem(message.wIndx, message.wCI, message.dwSeed);
if (ii == -1) {
// No item at the target position or the key attributes don't match, so try find a matching item.
int activeItemIndex = FindGetItem(message.dwSeed, message.wIndx, message.wCI);
if (activeItemIndex != -1) {
ii = ActiveItems[activeItemIndex];
}
}
if (ii != -1) {
NetSendCmdGItem2(false, CMD_GETITEM, MyPlayerId, message.bPnum, message);
if (message.bPnum != MyPlayerId)
SyncGetItem(position, message.wIndx, message.wCI, message.dwSeed);
SyncGetItem(position, message.dwSeed, message.wIndx, message.wCI);
else
InvGetItem(MyPlayerId, ii);
SetItemRecord(message.dwSeed, message.wCI, message.wIndx);
@ -743,20 +747,20 @@ DWORD OnGetItem(const TCmd *pCmd, int pnum)
SendPacket(pnum, &message, sizeof(message));
} else if (IsGItemValid(message)) {
const Point position { message.x, message.y };
int ii = FindGetItem(message.wIndx, message.wCI, message.dwSeed);
if (DeltaGetItem(message, message.bLevel)) {
if ((currlevel == message.bLevel || message.bPnum == MyPlayerId) && message.bMaster != MyPlayerId) {
if (message.bPnum == MyPlayerId) {
if (currlevel != message.bLevel) {
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);
int 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)
InvGetItem(MyPlayerId, ii);
} else {
InvGetItem(MyPlayerId, ii);
int activeItemIndex = FindGetItem(message.dwSeed, message.wIndx, message.wCI);
InvGetItem(MyPlayerId, ActiveItems[activeItemIndex]);
}
} else {
SyncGetItem(position, message.wIndx, message.wCI, message.dwSeed);
SyncGetItem(position, message.dwSeed, message.wIndx, message.wCI);
}
}
} else {
@ -788,11 +792,10 @@ DWORD OnRequestAutoGetItem(const TCmd *pCmd, Player &player)
if (gbBufferMsgs != 1 && IOwnLevel(player.plrlevel) && IsGItemValid(message)) {
const Point position { message.x, message.y };
if (GetItemRecord(message.dwSeed, message.wCI, message.wIndx)) {
int ii = FindGetItem(message.wIndx, message.wCI, message.dwSeed);
if (ii != -1) {
if (FindGetItem(message.dwSeed, message.wIndx, message.wCI) != -1) {
NetSendCmdGItem2(false, CMD_AGETITEM, MyPlayerId, message.bPnum, message);
if (message.bPnum != MyPlayerId)
SyncGetItem(position, message.wIndx, message.wCI, message.dwSeed);
SyncGetItem(position, message.dwSeed, message.wIndx, message.wCI);
else
AutoGetItem(MyPlayerId, &Items[message.bCursitem], message.bCursitem);
SetItemRecord(message.dwSeed, message.wCI, message.wIndx);
@ -825,7 +828,7 @@ DWORD OnAutoGetItem(const TCmd *pCmd, int pnum)
AutoGetItem(MyPlayerId, &Items[message.bCursitem], message.bCursitem);
}
} else {
SyncGetItem(position, message.wIndx, message.wCI, message.dwSeed);
SyncGetItem(position, message.dwSeed, message.wIndx, message.wCI);
}
}
} else {
@ -843,10 +846,11 @@ DWORD OnItemExtra(const TCmd *pCmd, int pnum)
if (gbBufferMsgs == 1) {
SendPacket(pnum, &message, sizeof(message));
} else if (IsGItemValid(message)) {
const Point position { message.x, message.y };
DeltaGetItem(message, message.bLevel);
if (currlevel == Players[pnum].plrlevel)
SyncGetItem(position, message.wIndx, message.wCI, message.dwSeed);
if (currlevel == Players[pnum].plrlevel) {
const Point position { message.x, message.y };
SyncGetItem(position, message.dwSeed, message.wIndx, message.wCI);
}
}
return sizeof(message);
@ -2223,14 +2227,15 @@ void DeltaLoadLevel()
continue;
if (sgLevels[currlevel].item[i].bCmd == CMD_WALKXY) {
int ii = FindGetItem(
int activeItemIndex = FindGetItem(
sgLevels[currlevel].item[i].dwSeed,
sgLevels[currlevel].item[i].wIndx,
sgLevels[currlevel].item[i].wCI,
sgLevels[currlevel].item[i].dwSeed);
if (ii != -1) {
if (dItem[Items[ii].position.x][Items[ii].position.y] == ii + 1)
dItem[Items[ii].position.x][Items[ii].position.y] = 0;
DeleteItem(ii, i);
sgLevels[currlevel].item[i].wCI);
if (activeItemIndex != -1) {
const auto &position = Items[ActiveItems[activeItemIndex]].position;
if (dItem[position.x][position.y] == ActiveItems[activeItemIndex] + 1)
dItem[position.x][position.y] = 0;
DeleteItem(ActiveItems[activeItemIndex], activeItemIndex);
}
}
if (sgLevels[currlevel].item[i].bCmd == CMD_ACK_PLRINFO) {