Browse Source

Avoid recreating items in PutItem locally

pull/4391/head
staphen 4 years ago committed by Anders Jenbo
parent
commit
d16c2f0086
  1. 21
      Source/inv.cpp
  2. 2
      Source/inv.h
  3. 5
      Source/msg.cpp

21
Source/inv.cpp

@ -1837,14 +1837,14 @@ bool TryInvPut()
return CanPut(myPlayer.position.tile);
}
int InvPutItem(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 InvPutItem(Player &player, Point position, Item &item)
{
if (player.plrlevel == 0) {
if (idx == IDI_RUNEBOMB && OpensHive(position)) {
if (item.IDidx == IDI_RUNEBOMB && OpensHive(position)) {
OpenHive();
return -1;
}
if (idx == IDI_MAPOFDOOM && OpensGrave(position)) {
if (item.IDidx == IDI_MAPOFDOOM && OpensGrave(position)) {
OpenCrypt();
return -1;
}
@ -1854,8 +1854,21 @@ int InvPutItem(Player &player, Point position, int idx, uint16_t icreateinfo, in
return -1;
assert(CanPut(position));
int ii = AllocateItem();
return SyncDropItem(position, idx, icreateinfo, iseed, id, dur, mdur, ch, mch, ivalue, ibuff, toHit, maxDam, minStr, minMag, minDex, ac);
dItem[position.x][position.y] = ii + 1;
Items[ii] = item;
Items[ii].position = position;
RespawnItem(Items[ii], true);
if (currlevel == 21 && position == CornerStone.position) {
CornerStone.item = Items[ii];
InitQTextMsg(TEXT_CORNSTN);
Quests[Q_CORNSTN]._qlog = false;
Quests[Q_CORNSTN]._qactive = QUEST_DONE;
}
return ii;
}
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)

2
Source/inv.h

@ -201,7 +201,7 @@ int FindGetItem(int32_t iseed, _item_indexes idx, uint16_t ci);
void SyncGetItem(Point position, int32_t iseed, _item_indexes idx, uint16_t ci);
bool CanPut(Point position);
bool TryInvPut();
int InvPutItem(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 InvPutItem(Player &player, Point position, Item &item);
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();

5
Source/msg.cpp

@ -67,6 +67,7 @@ DJunk sgJunk;
bool sgbDeltaChanged;
BYTE sgbDeltaChunks;
std::list<TMegaPkt> MegaPktList;
Item ItemLimbo;
void GetNextPacket()
{
@ -857,7 +858,7 @@ DWORD OnPutItem(const TCmd *pCmd, int pnum)
if (currlevel == Players[pnum].plrlevel) {
int ii;
if (pnum == MyPlayerId)
ii = InvPutItem(Players[pnum], 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);
ii = InvPutItem(Players[pnum], position, ItemLimbo);
else
ii = SyncPutItem(Players[pnum], 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);
if (ii != -1) {
@ -2608,6 +2609,8 @@ void NetSendCmdPItem(bool bHiPri, _cmd_id bCmd, Point position, const Item &item
cmd.dwBuff = item.dwBuff;
}
ItemLimbo = item;
if (bHiPri)
NetSendHiPri(MyPlayerId, (byte *)&cmd, sizeof(cmd));
else

Loading…
Cancel
Save