Validate additional network messages
This commit is contained in:
parent
c39c6ce7bb
commit
31ba8e2bc6
6 changed files with 101 additions and 96 deletions
133
Source/msg.cpp
133
Source/msg.cpp
|
|
@ -529,11 +529,11 @@ bool IOwnLevel(int nReqLevel)
|
|||
return i == MyPlayerId;
|
||||
}
|
||||
|
||||
void DeltaOpenPortal(int pnum, uint8_t x, uint8_t y, uint8_t bLevel, dungeon_type bLType, bool bSetLvl)
|
||||
void DeltaOpenPortal(int pnum, Point position, uint8_t bLevel, dungeon_type bLType, bool bSetLvl)
|
||||
{
|
||||
sgbDeltaChanged = true;
|
||||
sgJunk.portal[pnum].x = x;
|
||||
sgJunk.portal[pnum].y = y;
|
||||
sgJunk.portal[pnum].x = position.x;
|
||||
sgJunk.portal[pnum].y = position.y;
|
||||
sgJunk.portal[pnum].level = bLevel;
|
||||
sgJunk.portal[pnum].ltype = bLType;
|
||||
sgJunk.portal[pnum].setlvl = bSetLvl ? 1 : 0;
|
||||
|
|
@ -1403,25 +1403,25 @@ DWORD OnAwakeGolem(const TCmd *pCmd, int pnum)
|
|||
|
||||
DWORD OnMonstDamage(const TCmd *pCmd, int pnum)
|
||||
{
|
||||
auto *p = (TCmdMonDamage *)pCmd;
|
||||
const auto &message = *reinterpret_cast<const TCmdMonDamage *>(pCmd);
|
||||
|
||||
if (gbBufferMsgs == 1)
|
||||
SendPacket(pnum, p, sizeof(*p)); // BUGFIX: change to sizeof(*p) or it still uses TCmdParam2 size for hellfire (fixed)
|
||||
else if (pnum != MyPlayerId) {
|
||||
if (gbBufferMsgs == 1) {
|
||||
SendPacket(pnum, &message, sizeof(message));
|
||||
} else if (pnum != MyPlayerId) {
|
||||
int playerLevel = Players[pnum].plrlevel;
|
||||
if (currlevel == playerLevel) {
|
||||
auto &monster = Monsters[p->wMon];
|
||||
if (currlevel == playerLevel && message.wMon < MAXMONSTERS) {
|
||||
auto &monster = Monsters[message.wMon];
|
||||
monster.mWhoHit |= 1 << pnum;
|
||||
if (monster._mhitpoints > 0) {
|
||||
monster._mhitpoints -= p->dwDam;
|
||||
monster._mhitpoints -= message.dwDam;
|
||||
if ((monster._mhitpoints >> 6) < 1)
|
||||
monster._mhitpoints = 1 << 6;
|
||||
delta_monster_hp(p->wMon, monster._mhitpoints, playerLevel);
|
||||
delta_monster_hp(message.wMon, monster._mhitpoints, playerLevel);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return sizeof(*p);
|
||||
return sizeof(message);
|
||||
}
|
||||
|
||||
DWORD OnPlayerDeath(const TCmd *pCmd, int pnum)
|
||||
|
|
@ -1440,15 +1440,15 @@ DWORD OnPlayerDeath(const TCmd *pCmd, int pnum)
|
|||
|
||||
DWORD OnPlayerDamage(const TCmd *pCmd, Player &player)
|
||||
{
|
||||
auto *p = (TCmdDamage *)pCmd;
|
||||
const auto &message = *reinterpret_cast<const TCmdDamage *>(pCmd);
|
||||
|
||||
if (p->bPlr == MyPlayerId && currlevel != 0 && gbBufferMsgs != 1) {
|
||||
if (currlevel == player.plrlevel && p->dwDam <= 192000 && Players[MyPlayerId]._pHitPoints >> 6 > 0) {
|
||||
ApplyPlrDamage(MyPlayerId, 0, 0, p->dwDam, 1);
|
||||
if (message.bPlr == MyPlayerId && currlevel != 0 && gbBufferMsgs != 1) {
|
||||
if (currlevel == player.plrlevel && message.dwDam <= 192000 && Players[MyPlayerId]._pHitPoints >> 6 > 0) {
|
||||
ApplyPlrDamage(MyPlayerId, 0, 0, message.dwDam, 1);
|
||||
}
|
||||
}
|
||||
|
||||
return sizeof(*p);
|
||||
return sizeof(message);
|
||||
}
|
||||
|
||||
DWORD OnOpenDoor(const TCmd *pCmd, int pnum)
|
||||
|
|
@ -1501,63 +1501,63 @@ DWORD OnOperateObject(const TCmd *pCmd, int pnum)
|
|||
|
||||
DWORD OnPlayerOperateObject(const TCmd *pCmd, int pnum)
|
||||
{
|
||||
auto *p = (TCmdParam2 *)pCmd;
|
||||
const auto &message = *reinterpret_cast<const TCmdParam2 *>(pCmd);
|
||||
|
||||
if (gbBufferMsgs == 1) {
|
||||
SendPacket(pnum, p, sizeof(*p));
|
||||
} else {
|
||||
SendPacket(pnum, &message, sizeof(message));
|
||||
} else if (message.wParam1 < MAX_PLRS && message.wParam2 < MAXOBJECTS) {
|
||||
int playerLevel = Players[pnum].plrlevel;
|
||||
if (currlevel == playerLevel)
|
||||
SyncOpObject(p->wParam1, CMD_PLROPOBJ, p->wParam2);
|
||||
DeltaSyncObject(p->wParam2, CMD_PLROPOBJ, playerLevel);
|
||||
SyncOpObject(message.wParam1, CMD_PLROPOBJ, message.wParam2);
|
||||
DeltaSyncObject(message.wParam2, CMD_PLROPOBJ, playerLevel);
|
||||
}
|
||||
|
||||
return sizeof(*p);
|
||||
return sizeof(message);
|
||||
}
|
||||
|
||||
DWORD OnBreakObject(const TCmd *pCmd, int pnum)
|
||||
{
|
||||
auto *p = (TCmdParam2 *)pCmd;
|
||||
const auto &message = *reinterpret_cast<const TCmdParam2 *>(pCmd);
|
||||
|
||||
if (gbBufferMsgs == 1) {
|
||||
SendPacket(pnum, p, sizeof(*p));
|
||||
} else {
|
||||
SendPacket(pnum, &message, sizeof(message));
|
||||
} else if (message.wParam1 < MAX_PLRS && message.wParam2 < MAXOBJECTS) {
|
||||
int playerLevel = Players[pnum].plrlevel;
|
||||
if (currlevel == playerLevel)
|
||||
SyncBreakObj(p->wParam1, p->wParam2);
|
||||
DeltaSyncObject(p->wParam2, CMD_BREAKOBJ, playerLevel);
|
||||
SyncBreakObj(message.wParam1, message.wParam2);
|
||||
DeltaSyncObject(message.wParam2, CMD_BREAKOBJ, playerLevel);
|
||||
}
|
||||
|
||||
return sizeof(*p);
|
||||
return sizeof(message);
|
||||
}
|
||||
|
||||
DWORD OnChangePlayerItems(const TCmd *pCmd, int pnum)
|
||||
{
|
||||
auto *p = (TCmdChItem *)pCmd;
|
||||
auto bodyLocation = static_cast<inv_body_loc>(p->bLoc);
|
||||
const auto &message = *reinterpret_cast<const TCmdChItem *>(pCmd);
|
||||
|
||||
auto &player = Players[pnum];
|
||||
if (gbBufferMsgs == 1) {
|
||||
SendPacket(pnum, &message, sizeof(message));
|
||||
} else if (pnum != MyPlayerId && message.bLoc < NUM_INVLOC && message.wIndx <= IDI_LAST) {
|
||||
auto &player = Players[pnum];
|
||||
auto bodyLocation = static_cast<inv_body_loc>(message.bLoc);
|
||||
|
||||
if (gbBufferMsgs == 1)
|
||||
SendPacket(pnum, p, sizeof(*p));
|
||||
else if (pnum != MyPlayerId)
|
||||
CheckInvSwap(player, p->bLoc, p->wIndx, p->wCI, p->dwSeed, p->bId != 0, p->dwBuff);
|
||||
CheckInvSwap(player, bodyLocation, message.wIndx, message.wCI, message.dwSeed, message.bId != 0, message.dwBuff);
|
||||
player.ReadySpellFromEquipment(bodyLocation);
|
||||
}
|
||||
|
||||
player.ReadySpellFromEquipment(bodyLocation);
|
||||
|
||||
return sizeof(*p);
|
||||
return sizeof(message);
|
||||
}
|
||||
|
||||
DWORD OnDeletePlayerItems(const TCmd *pCmd, int pnum)
|
||||
{
|
||||
auto *p = (TCmdDelItem *)pCmd;
|
||||
const auto &message = *reinterpret_cast<const TCmdDelItem *>(pCmd);
|
||||
|
||||
if (gbBufferMsgs == 1)
|
||||
SendPacket(pnum, p, sizeof(*p));
|
||||
else if (pnum != MyPlayerId)
|
||||
inv_update_rem_item(Players[pnum], p->bLoc);
|
||||
SendPacket(pnum, &message, sizeof(message));
|
||||
else if (pnum != MyPlayerId && message.bLoc < NUM_INVLOC)
|
||||
inv_update_rem_item(Players[pnum], static_cast<inv_body_loc>(message.bLoc));
|
||||
|
||||
return sizeof(*p);
|
||||
return sizeof(message);
|
||||
}
|
||||
|
||||
DWORD OnPlayerLevel(const TCmd *pCmd, int pnum)
|
||||
|
|
@ -1646,35 +1646,41 @@ DWORD OnPlayerJoinLevel(const TCmd *pCmd, int pnum)
|
|||
|
||||
DWORD OnActivatePortal(const TCmd *pCmd, int pnum)
|
||||
{
|
||||
auto *p = (TCmdLocParam3 *)pCmd;
|
||||
const auto &message = *reinterpret_cast<const TCmdLocParam3 *>(pCmd);
|
||||
const Point position { message.x, message.y };
|
||||
|
||||
if (gbBufferMsgs == 1) {
|
||||
SendPacket(pnum, p, sizeof(*p));
|
||||
} else {
|
||||
ActivatePortal(pnum, p->x, p->y, p->wParam1, static_cast<dungeon_type>(p->wParam2), p->wParam3 != 0);
|
||||
SendPacket(pnum, &message, sizeof(message));
|
||||
} else if (InDungeonBounds(position) && message.wParam1 < NUMLEVELS && message.wParam2 <= DTYPE_LAST) {
|
||||
int level = message.wParam1;
|
||||
auto dungeonType = static_cast<dungeon_type>(message.wParam2);
|
||||
bool isSetLevel = message.wParam3 != 0;
|
||||
|
||||
ActivatePortal(pnum, position, level, dungeonType, isSetLevel);
|
||||
if (pnum != MyPlayerId) {
|
||||
if (currlevel == 0)
|
||||
if (currlevel == 0) {
|
||||
AddInTownPortal(pnum);
|
||||
else if (currlevel == Players[pnum].plrlevel) {
|
||||
} else if (currlevel == Players[pnum].plrlevel) {
|
||||
bool addPortal = true;
|
||||
for (int i = 0; i < ActiveMissileCount; i++) {
|
||||
int mi = ActiveMissiles[i];
|
||||
auto &missile = Missiles[mi];
|
||||
if (missile._mitype == MIS_TOWN && missile._misource == pnum) {
|
||||
addPortal = false;
|
||||
// CODEFIX: break
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (addPortal)
|
||||
AddWarpMissile(pnum, p->x, p->y);
|
||||
if (addPortal) {
|
||||
AddWarpMissile(pnum, position);
|
||||
}
|
||||
} else {
|
||||
RemovePortalMissile(pnum);
|
||||
}
|
||||
}
|
||||
DeltaOpenPortal(pnum, p->x, p->y, p->wParam1, static_cast<dungeon_type>(p->wParam2), p->wParam3 != 0);
|
||||
DeltaOpenPortal(pnum, position, level, dungeonType, isSetLevel);
|
||||
}
|
||||
|
||||
return sizeof(*p);
|
||||
return sizeof(message);
|
||||
}
|
||||
|
||||
DWORD OnDeactivatePortal(const TCmd *pCmd, int pnum)
|
||||
|
|
@ -1767,17 +1773,17 @@ DWORD OnString(const TCmd *pCmd, int pnum)
|
|||
|
||||
DWORD OnSyncQuest(const TCmd *pCmd, int pnum)
|
||||
{
|
||||
auto *p = (TCmdQuest *)pCmd;
|
||||
const auto &message = *reinterpret_cast<const TCmdQuest *>(pCmd);
|
||||
|
||||
if (gbBufferMsgs == 1) {
|
||||
SendPacket(pnum, p, sizeof(*p));
|
||||
SendPacket(pnum, &message, sizeof(message));
|
||||
} else {
|
||||
if (pnum != MyPlayerId)
|
||||
SetMultiQuest(p->q, p->qstate, p->qlog != 0, p->qvar1);
|
||||
if (pnum != MyPlayerId && message.q < MAXQUESTS && message.qstate <= QUEST_HIVE_DONE)
|
||||
SetMultiQuest(message.q, message.qstate, message.qlog != 0, message.qvar1);
|
||||
sgbDeltaChanged = true;
|
||||
}
|
||||
|
||||
return sizeof(*p);
|
||||
return sizeof(message);
|
||||
}
|
||||
|
||||
DWORD OnCheatExperience(const TCmd *pCmd, int pnum) // NOLINT(misc-unused-parameters)
|
||||
|
|
@ -1874,14 +1880,13 @@ DWORD OnNakrul(const TCmd *pCmd)
|
|||
|
||||
DWORD OnOpenHive(const TCmd *pCmd, int pnum)
|
||||
{
|
||||
auto *p = (TCmdLocParam2 *)pCmd;
|
||||
|
||||
if (gbBufferMsgs != 1) {
|
||||
AddMissile({ p->x, p->y }, { p->wParam1, p->wParam2 }, Direction::South, MIS_HIVEEXP2, TARGET_MONSTERS, pnum, 0, 0);
|
||||
AddMissile({ 0, 0 }, { 0, 0 }, Direction::South, MIS_HIVEEXP2, TARGET_MONSTERS, pnum, 0, 0);
|
||||
TownOpenHive();
|
||||
InitTownTriggers();
|
||||
}
|
||||
return sizeof(*p);
|
||||
|
||||
return sizeof(*pCmd);
|
||||
}
|
||||
|
||||
DWORD OnOpenCrypt(const TCmd *pCmd)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue