Validate item network messages
This commit is contained in:
parent
a56452eec3
commit
b4f699f0a3
11 changed files with 238 additions and 198 deletions
394
Source/msg.cpp
394
Source/msg.cpp
|
|
@ -401,13 +401,13 @@ void DeltaLeaveSync(BYTE bLevel)
|
|||
if (monster._mhitpoints == 0)
|
||||
continue;
|
||||
sgbDeltaChanged = true;
|
||||
DMonsterStr *pD = &sgLevels[bLevel].monster[ma];
|
||||
pD->_mx = monster.position.tile.x;
|
||||
pD->_my = monster.position.tile.y;
|
||||
pD->_mdir = monster._mdir;
|
||||
pD->_menemy = encode_enemy(monster);
|
||||
pD->_mhitpoints = monster._mhitpoints;
|
||||
pD->_mactive = monster._msquelch;
|
||||
DMonsterStr &delta = sgLevels[bLevel].monster[ma];
|
||||
delta._mx = monster.position.tile.x;
|
||||
delta._my = monster.position.tile.y;
|
||||
delta._mdir = monster._mdir;
|
||||
delta._menemy = encode_enemy(monster);
|
||||
delta._mhitpoints = monster._mhitpoints;
|
||||
delta._mactive = monster._msquelch;
|
||||
}
|
||||
memcpy(&sgLocals[bLevel].automapsv, AutomapView, sizeof(AutomapView));
|
||||
}
|
||||
|
|
@ -421,91 +421,87 @@ void DeltaSyncObject(int oi, _cmd_id bCmd, BYTE bLevel)
|
|||
sgLevels[bLevel].object[oi].bCmd = bCmd;
|
||||
}
|
||||
|
||||
bool DeltaGetItem(const TCmdGItem *pI, BYTE bLevel)
|
||||
bool DeltaGetItem(const TCmdGItem &message, BYTE bLevel)
|
||||
{
|
||||
if (!gbIsMultiplayer)
|
||||
return true;
|
||||
|
||||
TCmdPItem *pD = sgLevels[bLevel].item;
|
||||
for (int i = 0; i < MAXITEMS; i++, pD++) {
|
||||
if (pD->bCmd == CMD_INVALID || pD->wIndx != pI->wIndx || pD->wCI != pI->wCI || pD->dwSeed != pI->dwSeed)
|
||||
for (TCmdPItem &item : sgLevels[bLevel].item) {
|
||||
if (item.bCmd == CMD_INVALID || item.wIndx != message.wIndx || item.wCI != message.wCI || item.dwSeed != message.dwSeed)
|
||||
continue;
|
||||
|
||||
if (pD->bCmd == CMD_WALKXY) {
|
||||
if (item.bCmd == CMD_WALKXY) {
|
||||
return true;
|
||||
}
|
||||
if (pD->bCmd == CMD_STAND) {
|
||||
if (item.bCmd == CMD_STAND) {
|
||||
sgbDeltaChanged = true;
|
||||
pD->bCmd = CMD_WALKXY;
|
||||
item.bCmd = CMD_WALKXY;
|
||||
return true;
|
||||
}
|
||||
if (pD->bCmd == CMD_ACK_PLRINFO) {
|
||||
if (item.bCmd == CMD_ACK_PLRINFO) {
|
||||
sgbDeltaChanged = true;
|
||||
pD->bCmd = CMD_INVALID;
|
||||
item.bCmd = CMD_INVALID;
|
||||
return true;
|
||||
}
|
||||
|
||||
app_fatal("delta:1");
|
||||
}
|
||||
|
||||
if ((pI->wCI & CF_PREGEN) == 0)
|
||||
if ((message.wCI & CF_PREGEN) == 0)
|
||||
return false;
|
||||
|
||||
pD = sgLevels[bLevel].item;
|
||||
for (int i = 0; i < MAXITEMS; i++, pD++) {
|
||||
if (pD->bCmd == CMD_INVALID) {
|
||||
for (TCmdPItem &item : sgLevels[bLevel].item) {
|
||||
if (item.bCmd == CMD_INVALID) {
|
||||
sgbDeltaChanged = true;
|
||||
pD->bCmd = CMD_WALKXY;
|
||||
pD->x = pI->x;
|
||||
pD->y = pI->y;
|
||||
pD->wIndx = pI->wIndx;
|
||||
pD->wCI = pI->wCI;
|
||||
pD->dwSeed = pI->dwSeed;
|
||||
pD->bId = pI->bId;
|
||||
pD->bDur = pI->bDur;
|
||||
pD->bMDur = pI->bMDur;
|
||||
pD->bCh = pI->bCh;
|
||||
pD->bMCh = pI->bMCh;
|
||||
pD->wValue = pI->wValue;
|
||||
pD->dwBuff = pI->dwBuff;
|
||||
pD->wToHit = pI->wToHit;
|
||||
pD->wMaxDam = pI->wMaxDam;
|
||||
pD->bMinStr = pI->bMinStr;
|
||||
pD->bMinMag = pI->bMinMag;
|
||||
pD->bMinDex = pI->bMinDex;
|
||||
pD->bAC = pI->bAC;
|
||||
item.bCmd = CMD_WALKXY;
|
||||
item.x = message.x;
|
||||
item.y = message.y;
|
||||
item.wIndx = message.wIndx;
|
||||
item.wCI = message.wCI;
|
||||
item.dwSeed = message.dwSeed;
|
||||
item.bId = message.bId;
|
||||
item.bDur = message.bDur;
|
||||
item.bMDur = message.bMDur;
|
||||
item.bCh = message.bCh;
|
||||
item.bMCh = message.bMCh;
|
||||
item.wValue = message.wValue;
|
||||
item.dwBuff = message.dwBuff;
|
||||
item.wToHit = message.wToHit;
|
||||
item.wMaxDam = message.wMaxDam;
|
||||
item.bMinStr = message.bMinStr;
|
||||
item.bMinMag = message.bMinMag;
|
||||
item.bMinDex = message.bMinDex;
|
||||
item.bAC = message.bAC;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void DeltaPutItem(const TCmdPItem *pI, int x, int y, BYTE bLevel)
|
||||
void DeltaPutItem(const TCmdPItem &message, Point position, BYTE bLevel)
|
||||
{
|
||||
if (!gbIsMultiplayer)
|
||||
return;
|
||||
|
||||
TCmdPItem *pD = sgLevels[bLevel].item;
|
||||
for (int i = 0; i < MAXITEMS; i++, pD++) {
|
||||
if (pD->bCmd != CMD_WALKXY
|
||||
&& pD->bCmd != CMD_INVALID
|
||||
&& pD->wIndx == pI->wIndx
|
||||
&& pD->wCI == pI->wCI
|
||||
&& pD->dwSeed == pI->dwSeed) {
|
||||
if (pD->bCmd == CMD_ACK_PLRINFO)
|
||||
for (const TCmdPItem &item : sgLevels[bLevel].item) {
|
||||
if (item.bCmd != CMD_WALKXY
|
||||
&& item.bCmd != CMD_INVALID
|
||||
&& item.wIndx == message.wIndx
|
||||
&& item.wCI == message.wCI
|
||||
&& item.dwSeed == message.dwSeed) {
|
||||
if (item.bCmd == CMD_ACK_PLRINFO)
|
||||
return;
|
||||
app_fatal("%s", _("Trying to drop a floor item?"));
|
||||
}
|
||||
}
|
||||
|
||||
pD = sgLevels[bLevel].item;
|
||||
for (int i = 0; i < MAXITEMS; i++, pD++) {
|
||||
if (pD->bCmd == CMD_INVALID) {
|
||||
for (TCmdPItem &item : sgLevels[bLevel].item) {
|
||||
if (item.bCmd == CMD_INVALID) {
|
||||
sgbDeltaChanged = true;
|
||||
memcpy(pD, pI, sizeof(TCmdPItem));
|
||||
pD->bCmd = CMD_ACK_PLRINFO;
|
||||
pD->x = x;
|
||||
pD->y = y;
|
||||
memcpy(&item, &message, sizeof(TCmdPItem));
|
||||
item.bCmd = CMD_ACK_PLRINFO;
|
||||
item.x = position.x;
|
||||
item.y = position.y;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
@ -676,58 +672,87 @@ DWORD OnGotoGetItem(const TCmd *pCmd, Player &player)
|
|||
return sizeof(message);
|
||||
}
|
||||
|
||||
bool IsGItemValid(const TCmdGItem &message)
|
||||
{
|
||||
if (message.bMaster >= MAX_PLRS)
|
||||
return false;
|
||||
if (message.bPnum >= MAX_PLRS)
|
||||
return false;
|
||||
if (message.bCursitem >= MAXITEMS + 1)
|
||||
return false;
|
||||
if (message.bLevel >= NUMLEVELS)
|
||||
return false;
|
||||
|
||||
if (!InDungeonBounds({ message.x, message.y }))
|
||||
return false;
|
||||
|
||||
return IsItemAvailable(message.wIndx);
|
||||
}
|
||||
|
||||
bool IsPItemValid(const TCmdPItem &message)
|
||||
{
|
||||
const Point position { message.x, message.y };
|
||||
|
||||
if (!InDungeonBounds(position))
|
||||
return false;
|
||||
|
||||
return IsItemAvailable(message.wIndx);
|
||||
}
|
||||
|
||||
DWORD OnRequestGetItem(const TCmd *pCmd, Player &player)
|
||||
{
|
||||
auto *p = (TCmdGItem *)pCmd;
|
||||
const auto &message = *reinterpret_cast<const TCmdGItem *>(pCmd);
|
||||
|
||||
if (gbBufferMsgs != 1 && IOwnLevel(player.plrlevel)) {
|
||||
if (GetItemRecord(p->dwSeed, p->wCI, p->wIndx)) {
|
||||
int ii = FindGetItem(p->wIndx, p->wCI, p->dwSeed);
|
||||
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) {
|
||||
NetSendCmdGItem2(false, CMD_GETITEM, MyPlayerId, p->bPnum, *p);
|
||||
if (p->bPnum != MyPlayerId)
|
||||
SyncGetItem({ p->x, p->y }, p->wIndx, p->wCI, p->dwSeed);
|
||||
NetSendCmdGItem2(false, CMD_GETITEM, MyPlayerId, message.bPnum, message);
|
||||
if (message.bPnum != MyPlayerId)
|
||||
SyncGetItem(position, message.wIndx, message.wCI, message.dwSeed);
|
||||
else
|
||||
InvGetItem(MyPlayerId, &Items[ii], ii);
|
||||
SetItemRecord(p->dwSeed, p->wCI, p->wIndx);
|
||||
} else if (!NetSendCmdReq2(CMD_REQUESTGITEM, MyPlayerId, p->bPnum, *p)) {
|
||||
NetSendCmdExtra(*p);
|
||||
SetItemRecord(message.dwSeed, message.wCI, message.wIndx);
|
||||
} else if (!NetSendCmdReq2(CMD_REQUESTGITEM, MyPlayerId, message.bPnum, message)) {
|
||||
NetSendCmdExtra(message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return sizeof(*p);
|
||||
return sizeof(message);
|
||||
}
|
||||
|
||||
DWORD OnGetItem(const TCmd *pCmd, int pnum)
|
||||
{
|
||||
auto *p = (TCmdGItem *)pCmd;
|
||||
const auto &message = *reinterpret_cast<const TCmdGItem *>(pCmd);
|
||||
|
||||
if (gbBufferMsgs == 1) {
|
||||
SendPacket(pnum, p, sizeof(*p));
|
||||
} else {
|
||||
int ii = FindGetItem(p->wIndx, p->wCI, p->dwSeed);
|
||||
if (DeltaGetItem(p, p->bLevel)) {
|
||||
if ((currlevel == p->bLevel || p->bPnum == MyPlayerId) && p->bMaster != MyPlayerId) {
|
||||
if (p->bPnum == MyPlayerId) {
|
||||
if (currlevel != p->bLevel) {
|
||||
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, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff, p->wToHit, p->wMaxDam, p->bMinStr, p->bMinMag, p->bMinDex, p->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)
|
||||
InvGetItem(MyPlayerId, &Items[ii], ii);
|
||||
} else {
|
||||
InvGetItem(MyPlayerId, &Items[ii], ii);
|
||||
}
|
||||
} else {
|
||||
SyncGetItem({ p->x, p->y }, p->wIndx, p->wCI, p->dwSeed);
|
||||
SyncGetItem(position, message.wIndx, message.wCI, message.dwSeed);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
NetSendCmdGItem2(true, CMD_GETITEM, p->bMaster, p->bPnum, *p);
|
||||
NetSendCmdGItem2(true, CMD_GETITEM, message.bMaster, message.bPnum, message);
|
||||
}
|
||||
}
|
||||
|
||||
return sizeof(*p);
|
||||
return sizeof(message);
|
||||
}
|
||||
|
||||
DWORD OnGotoAutoGetItem(const TCmd *pCmd, Player &player)
|
||||
|
|
@ -746,140 +771,149 @@ DWORD OnGotoAutoGetItem(const TCmd *pCmd, Player &player)
|
|||
|
||||
DWORD OnRequestAutoGetItem(const TCmd *pCmd, Player &player)
|
||||
{
|
||||
auto *p = (TCmdGItem *)pCmd;
|
||||
const auto &message = *reinterpret_cast<const TCmdGItem *>(pCmd);
|
||||
|
||||
if (gbBufferMsgs != 1 && IOwnLevel(player.plrlevel)) {
|
||||
if (GetItemRecord(p->dwSeed, p->wCI, p->wIndx)) {
|
||||
int ii = FindGetItem(p->wIndx, p->wCI, p->dwSeed);
|
||||
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) {
|
||||
NetSendCmdGItem2(false, CMD_AGETITEM, MyPlayerId, p->bPnum, *p);
|
||||
if (p->bPnum != MyPlayerId)
|
||||
SyncGetItem({ p->x, p->y }, p->wIndx, p->wCI, p->dwSeed);
|
||||
NetSendCmdGItem2(false, CMD_AGETITEM, MyPlayerId, message.bPnum, message);
|
||||
if (message.bPnum != MyPlayerId)
|
||||
SyncGetItem(position, message.wIndx, message.wCI, message.dwSeed);
|
||||
else
|
||||
AutoGetItem(MyPlayerId, &Items[p->bCursitem], p->bCursitem);
|
||||
SetItemRecord(p->dwSeed, p->wCI, p->wIndx);
|
||||
} else if (!NetSendCmdReq2(CMD_REQUESTAGITEM, MyPlayerId, p->bPnum, *p)) {
|
||||
NetSendCmdExtra(*p);
|
||||
AutoGetItem(MyPlayerId, &Items[message.bCursitem], message.bCursitem);
|
||||
SetItemRecord(message.dwSeed, message.wCI, message.wIndx);
|
||||
} else if (!NetSendCmdReq2(CMD_REQUESTAGITEM, MyPlayerId, message.bPnum, message)) {
|
||||
NetSendCmdExtra(message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return sizeof(*p);
|
||||
return sizeof(message);
|
||||
}
|
||||
|
||||
DWORD OnAutoGetItem(const TCmd *pCmd, int pnum)
|
||||
{
|
||||
auto *p = (TCmdGItem *)pCmd;
|
||||
const auto &message = *reinterpret_cast<const TCmdGItem *>(pCmd);
|
||||
|
||||
if (gbBufferMsgs == 1) {
|
||||
SendPacket(pnum, p, sizeof(*p));
|
||||
} else {
|
||||
FindGetItem(p->wIndx, p->wCI, p->dwSeed);
|
||||
if (DeltaGetItem(p, p->bLevel)) {
|
||||
if ((currlevel == p->bLevel || p->bPnum == MyPlayerId) && p->bMaster != MyPlayerId) {
|
||||
if (p->bPnum == MyPlayerId) {
|
||||
if (currlevel != p->bLevel) {
|
||||
SendPacket(pnum, &message, sizeof(message));
|
||||
} else if (IsGItemValid(message)) {
|
||||
const Point position { message.x, message.y };
|
||||
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];
|
||||
int ii = SyncPutItem(player, player.position.tile, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff, p->wToHit, p->wMaxDam, p->bMinStr, p->bMinMag, p->bMinDex, p->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)
|
||||
AutoGetItem(MyPlayerId, &Items[ii], ii);
|
||||
} else {
|
||||
AutoGetItem(MyPlayerId, &Items[p->bCursitem], p->bCursitem);
|
||||
AutoGetItem(MyPlayerId, &Items[message.bCursitem], message.bCursitem);
|
||||
}
|
||||
} else {
|
||||
SyncGetItem({ p->x, p->y }, p->wIndx, p->wCI, p->dwSeed);
|
||||
SyncGetItem(position, message.wIndx, message.wCI, message.dwSeed);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
NetSendCmdGItem2(true, CMD_AGETITEM, p->bMaster, p->bPnum, *p);
|
||||
NetSendCmdGItem2(true, CMD_AGETITEM, message.bMaster, message.bPnum, message);
|
||||
}
|
||||
}
|
||||
|
||||
return sizeof(*p);
|
||||
return sizeof(message);
|
||||
}
|
||||
|
||||
DWORD OnItemExtra(const TCmd *pCmd, int pnum)
|
||||
{
|
||||
auto *p = (TCmdGItem *)pCmd;
|
||||
const auto &message = *reinterpret_cast<const TCmdGItem *>(pCmd);
|
||||
|
||||
if (gbBufferMsgs == 1) {
|
||||
SendPacket(pnum, p, sizeof(*p));
|
||||
} else {
|
||||
DeltaGetItem(p, p->bLevel);
|
||||
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({ p->x, p->y }, p->wIndx, p->wCI, p->dwSeed);
|
||||
SyncGetItem(position, message.wIndx, message.wCI, message.dwSeed);
|
||||
}
|
||||
|
||||
return sizeof(*p);
|
||||
return sizeof(message);
|
||||
}
|
||||
|
||||
DWORD OnPutItem(const TCmd *pCmd, int pnum)
|
||||
{
|
||||
auto *p = (TCmdPItem *)pCmd;
|
||||
const auto &message = *reinterpret_cast<const TCmdPItem *>(pCmd);
|
||||
|
||||
if (gbBufferMsgs == 1)
|
||||
SendPacket(pnum, p, sizeof(*p));
|
||||
else if (currlevel == Players[pnum].plrlevel) {
|
||||
int ii;
|
||||
if (pnum == MyPlayerId)
|
||||
ii = InvPutItem(Players[pnum], { p->x, p->y });
|
||||
else
|
||||
ii = SyncPutItem(Players[pnum], { p->x, p->y }, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff, p->wToHit, p->wMaxDam, p->bMinStr, p->bMinMag, p->bMinDex, p->bAC);
|
||||
if (ii != -1) {
|
||||
PutItemRecord(p->dwSeed, p->wCI, p->wIndx);
|
||||
DeltaPutItem(p, Items[ii].position.x, Items[ii].position.y, Players[pnum].plrlevel);
|
||||
if (gbBufferMsgs == 1) {
|
||||
SendPacket(pnum, &message, sizeof(message));
|
||||
} else if (IsPItemValid(message)) {
|
||||
const Point position { message.x, message.y };
|
||||
if (currlevel == Players[pnum].plrlevel) {
|
||||
int ii;
|
||||
if (pnum == MyPlayerId)
|
||||
ii = InvPutItem(Players[pnum], position);
|
||||
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) {
|
||||
PutItemRecord(message.dwSeed, message.wCI, message.wIndx);
|
||||
DeltaPutItem(message, Items[ii].position, Players[pnum].plrlevel);
|
||||
CheckUpdatePlayer(pnum);
|
||||
}
|
||||
return sizeof(message);
|
||||
} else {
|
||||
PutItemRecord(message.dwSeed, message.wCI, message.wIndx);
|
||||
DeltaPutItem(message, position, Players[pnum].plrlevel);
|
||||
CheckUpdatePlayer(pnum);
|
||||
}
|
||||
return sizeof(*p);
|
||||
} else {
|
||||
PutItemRecord(p->dwSeed, p->wCI, p->wIndx);
|
||||
DeltaPutItem(p, p->x, p->y, Players[pnum].plrlevel);
|
||||
CheckUpdatePlayer(pnum);
|
||||
}
|
||||
|
||||
return sizeof(*p);
|
||||
return sizeof(message);
|
||||
}
|
||||
|
||||
DWORD OnSyncPutItem(const TCmd *pCmd, int pnum)
|
||||
{
|
||||
auto *p = (TCmdPItem *)pCmd;
|
||||
const auto &message = *reinterpret_cast<const TCmdPItem *>(pCmd);
|
||||
|
||||
if (gbBufferMsgs == 1)
|
||||
SendPacket(pnum, p, sizeof(*p));
|
||||
else if (currlevel == Players[pnum].plrlevel) {
|
||||
int ii = SyncPutItem(Players[pnum], { p->x, p->y }, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff, p->wToHit, p->wMaxDam, p->bMinStr, p->bMinMag, p->bMinDex, p->bAC);
|
||||
if (ii != -1) {
|
||||
PutItemRecord(p->dwSeed, p->wCI, p->wIndx);
|
||||
DeltaPutItem(p, Items[ii].position.x, Items[ii].position.y, Players[pnum].plrlevel);
|
||||
SendPacket(pnum, &message, sizeof(message));
|
||||
else if (IsPItemValid(message)) {
|
||||
const Point position { message.x, message.y };
|
||||
if (currlevel == Players[pnum].plrlevel) {
|
||||
int 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) {
|
||||
PutItemRecord(message.dwSeed, message.wCI, message.wIndx);
|
||||
DeltaPutItem(message, Items[ii].position, Players[pnum].plrlevel);
|
||||
CheckUpdatePlayer(pnum);
|
||||
}
|
||||
return sizeof(message);
|
||||
} else {
|
||||
PutItemRecord(message.dwSeed, message.wCI, message.wIndx);
|
||||
DeltaPutItem(message, position, Players[pnum].plrlevel);
|
||||
CheckUpdatePlayer(pnum);
|
||||
}
|
||||
return sizeof(*p);
|
||||
} else {
|
||||
PutItemRecord(p->dwSeed, p->wCI, p->wIndx);
|
||||
DeltaPutItem(p, p->x, p->y, Players[pnum].plrlevel);
|
||||
CheckUpdatePlayer(pnum);
|
||||
}
|
||||
|
||||
return sizeof(*p);
|
||||
return sizeof(message);
|
||||
}
|
||||
|
||||
DWORD OnRespawnItem(const TCmd *pCmd, int pnum)
|
||||
{
|
||||
auto *p = (TCmdPItem *)pCmd;
|
||||
const auto &message = *reinterpret_cast<const TCmdPItem *>(pCmd);
|
||||
|
||||
if (gbBufferMsgs == 1) {
|
||||
SendPacket(pnum, p, sizeof(*p));
|
||||
} else {
|
||||
SendPacket(pnum, &message, sizeof(message));
|
||||
} else if (IsPItemValid(message)) {
|
||||
const Point position { message.x, message.y };
|
||||
auto &player = Players[pnum];
|
||||
int playerLevel = player.plrlevel;
|
||||
if (currlevel == playerLevel && pnum != MyPlayerId) {
|
||||
SyncPutItem(player, { p->x, p->y }, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff, p->wToHit, p->wMaxDam, p->bMinStr, p->bMinMag, p->bMinDex, p->bAC);
|
||||
SyncPutItem(player, 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);
|
||||
}
|
||||
PutItemRecord(p->dwSeed, p->wCI, p->wIndx);
|
||||
DeltaPutItem(p, p->x, p->y, playerLevel);
|
||||
PutItemRecord(message.dwSeed, message.wCI, message.wIndx);
|
||||
DeltaPutItem(message, position, playerLevel);
|
||||
}
|
||||
|
||||
return sizeof(*p);
|
||||
return sizeof(message);
|
||||
}
|
||||
|
||||
DWORD OnAttackTile(const TCmd *pCmd, Player &player)
|
||||
|
|
@ -1578,14 +1612,14 @@ DWORD OnPlayerLevel(const TCmd *pCmd, int pnum)
|
|||
|
||||
DWORD OnDropItem(const TCmd *pCmd, int pnum)
|
||||
{
|
||||
auto *p = (TCmdPItem *)pCmd;
|
||||
const auto &message = *reinterpret_cast<const TCmdPItem *>(pCmd);
|
||||
|
||||
if (gbBufferMsgs == 1)
|
||||
SendPacket(pnum, p, sizeof(*p));
|
||||
else
|
||||
DeltaPutItem(p, p->x, p->y, Players[pnum].plrlevel);
|
||||
SendPacket(pnum, &message, sizeof(message));
|
||||
else if (IsPItemValid(message))
|
||||
DeltaPutItem(message, { message.x, message.y }, Players[pnum].plrlevel);
|
||||
|
||||
return sizeof(*p);
|
||||
return sizeof(message);
|
||||
}
|
||||
|
||||
DWORD OnSendPlayerInfo(const TCmd *pCmd, int pnum)
|
||||
|
|
@ -2049,42 +2083,40 @@ void DeltaAddItem(int ii)
|
|||
if (!gbIsMultiplayer)
|
||||
return;
|
||||
|
||||
TCmdPItem *pD = sgLevels[currlevel].item;
|
||||
for (int i = 0; i < MAXITEMS; i++, pD++) {
|
||||
if (pD->bCmd != CMD_INVALID
|
||||
&& pD->wIndx == Items[ii].IDidx
|
||||
&& pD->wCI == Items[ii]._iCreateInfo
|
||||
&& pD->dwSeed == Items[ii]._iSeed
|
||||
&& (pD->bCmd == CMD_WALKXY || pD->bCmd == CMD_STAND)) {
|
||||
for (const TCmdPItem &item : sgLevels[currlevel].item) {
|
||||
if (item.bCmd != CMD_INVALID
|
||||
&& item.wIndx == Items[ii].IDidx
|
||||
&& item.wCI == Items[ii]._iCreateInfo
|
||||
&& item.dwSeed == Items[ii]._iSeed
|
||||
&& (item.bCmd == CMD_WALKXY || item.bCmd == CMD_STAND)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
pD = sgLevels[currlevel].item;
|
||||
for (int i = 0; i < MAXITEMS; i++, pD++) {
|
||||
if (pD->bCmd != CMD_INVALID)
|
||||
for (TCmdPItem &item : sgLevels[currlevel].item) {
|
||||
if (item.bCmd != CMD_INVALID)
|
||||
continue;
|
||||
|
||||
sgbDeltaChanged = true;
|
||||
pD->bCmd = CMD_STAND;
|
||||
pD->x = Items[ii].position.x;
|
||||
pD->y = Items[ii].position.y;
|
||||
pD->wIndx = Items[ii].IDidx;
|
||||
pD->wCI = Items[ii]._iCreateInfo;
|
||||
pD->dwSeed = Items[ii]._iSeed;
|
||||
pD->bId = Items[ii]._iIdentified ? 1 : 0;
|
||||
pD->bDur = Items[ii]._iDurability;
|
||||
pD->bMDur = Items[ii]._iMaxDur;
|
||||
pD->bCh = Items[ii]._iCharges;
|
||||
pD->bMCh = Items[ii]._iMaxCharges;
|
||||
pD->wValue = Items[ii]._ivalue;
|
||||
pD->wToHit = Items[ii]._iPLToHit;
|
||||
pD->wMaxDam = Items[ii]._iMaxDam;
|
||||
pD->bMinStr = Items[ii]._iMinStr;
|
||||
pD->bMinMag = Items[ii]._iMinMag;
|
||||
pD->bMinDex = Items[ii]._iMinDex;
|
||||
pD->bAC = Items[ii]._iAC;
|
||||
pD->dwBuff = Items[ii].dwBuff;
|
||||
item.bCmd = CMD_STAND;
|
||||
item.x = Items[ii].position.x;
|
||||
item.y = Items[ii].position.y;
|
||||
item.wIndx = Items[ii].IDidx;
|
||||
item.wCI = Items[ii]._iCreateInfo;
|
||||
item.dwSeed = Items[ii]._iSeed;
|
||||
item.bId = Items[ii]._iIdentified ? 1 : 0;
|
||||
item.bDur = Items[ii]._iDurability;
|
||||
item.bMDur = Items[ii]._iMaxDur;
|
||||
item.bCh = Items[ii]._iCharges;
|
||||
item.bMCh = Items[ii]._iMaxCharges;
|
||||
item.wValue = Items[ii]._ivalue;
|
||||
item.wToHit = Items[ii]._iPLToHit;
|
||||
item.wMaxDam = Items[ii]._iMaxDam;
|
||||
item.bMinStr = Items[ii]._iMinStr;
|
||||
item.bMinMag = Items[ii]._iMinMag;
|
||||
item.bMinDex = Items[ii]._iMinDex;
|
||||
item.bAC = Items[ii]._iAC;
|
||||
item.dwBuff = Items[ii].dwBuff;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue