Browse Source

Introduce Player::isOnActiveLevel

pull/4727/head
obligaron 4 years ago committed by Anders Jenbo
parent
commit
19749420b5
  1. 2
      Source/automap.cpp
  2. 8
      Source/diablo.cpp
  3. 2
      Source/interfac.cpp
  4. 4
      Source/lighting.cpp
  5. 2
      Source/loadsave.cpp
  6. 2
      Source/missiles.cpp
  7. 2
      Source/monster.cpp
  8. 115
      Source/msg.cpp
  9. 4
      Source/multi.cpp
  10. 4
      Source/objects.cpp
  11. 8
      Source/player.cpp
  12. 6
      Source/player.h
  13. 2
      Source/scrollrt.cpp
  14. 4
      Source/spells.cpp
  15. 2
      Source/track.cpp

2
Source/automap.cpp

@ -737,7 +737,7 @@ void DrawAutomap(const Surface &out)
for (int playerId = 0; playerId < MAX_PLRS; playerId++) {
Player &player = Players[playerId];
if (player.plrlevel == myPlayer.plrlevel && player.plractive && !player._pLvlChanging && (&player == &myPlayer || player.friendlyMode)) {
if (player.isOnActiveLevel() && player.plractive && !player._pLvlChanging && (&player == &myPlayer || player.friendlyMode)) {
DrawAutomapPlr(out, myPlayerOffset, playerId);
}
}

8
Source/diablo.cpp

@ -1218,7 +1218,7 @@ void UnstuckChargers()
continue;
if (player._pLvlChanging)
continue;
if (player.plrlevel != MyPlayer->plrlevel)
if (!player.isOnActiveLevel())
continue;
if (&player == MyPlayer)
continue;
@ -2161,7 +2161,7 @@ void LoadGameLevel(bool firstflag, lvl_entry lvldir)
IncProgress();
for (Player &player : Players) {
if (player.plractive && currlevel == player.plrlevel) {
if (player.plractive && player.isOnActiveLevel()) {
InitPlayerGFX(player);
if (lvldir != ENTRY_LOAD)
InitPlayer(player, firstflag);
@ -2262,7 +2262,7 @@ void LoadGameLevel(bool firstflag, lvl_entry lvldir)
IncProgress();
for (Player &player : Players) {
if (player.plractive && currlevel == player.plrlevel) {
if (player.plractive && player.isOnActiveLevel()) {
InitPlayerGFX(player);
if (lvldir != ENTRY_LOAD)
InitPlayer(player, firstflag);
@ -2288,7 +2288,7 @@ void LoadGameLevel(bool firstflag, lvl_entry lvldir)
for (int i = 0; i < MAX_PLRS; i++) {
Player &player = Players[i];
if (player.plractive && player.plrlevel == currlevel && (!player._pLvlChanging || i == MyPlayerId)) {
if (player.plractive && player.isOnActiveLevel() && (!player._pLvlChanging || i == MyPlayerId)) {
if (player._pHitPoints > 0) {
if (!gbIsMultiplayer)
dPlayer[player.position.tile.x][player.position.tile.y] = i + 1;

2
Source/interfac.cpp

@ -308,7 +308,7 @@ void ShowProgress(interface_mode uMsg)
FreeGameMem();
currlevel--;
leveltype = GetLevelType(currlevel);
assert(myPlayer.plrlevel == currlevel);
assert(myPlayer.isOnActiveLevel());
IncProgress();
LoadGameLevel(false, ENTRY_PREV);
IncProgress();

4
Source/lighting.cpp

@ -895,7 +895,7 @@ void ToggleLighting()
memcpy(dLight, dPreLight, sizeof(dLight));
for (const Player &player : Players) {
if (player.plractive && player.plrlevel == currlevel) {
if (player.plractive && player.isOnActiveLevel()) {
DoLighting(player.position.tile, player._pLightRad, -1);
}
}
@ -1136,7 +1136,7 @@ void ProcessVisionList()
doautomap = MAP_EXP_OTHERS;
for (const Player &player : Players) {
// Find player for this vision
if (!player.plractive || player.plrlevel != currlevel || player._pvid != vision._lid)
if (!player.plractive || !player.isOnActiveLevel() || player._pvid != vision._lid)
continue;
// Check that player allows automap sharing
if (!player.friendlyMode)

2
Source/loadsave.cpp

@ -2581,7 +2581,7 @@ void LoadLevel()
}
for (Player &player : Players) {
if (player.plractive && currlevel == player.plrlevel)
if (player.plractive && player.isOnActiveLevel())
Lights[player._plid]._lunflag = true;
}
}

2
Source/missiles.cpp

@ -3204,7 +3204,7 @@ void MI_Town(Missile &missile)
for (int p = 0; p < MAX_PLRS; p++) {
Player &player = Players[p];
if (player.plractive && currlevel == player.plrlevel && !player._pLvlChanging && player._pmode == PM_STAND && player.position.tile == missile.position.tile) {
if (player.plractive && player.isOnActiveLevel() && !player._pLvlChanging && player._pmode == PM_STAND && player.position.tile == missile.position.tile) {
ClrPlrPath(player);
if (p == MyPlayerId) {
NetSendCmdParam1(true, CMD_WARP, missile._misource);

2
Source/monster.cpp

@ -715,7 +715,7 @@ void UpdateEnemy(Monster &monster)
if ((monster._mFlags & MFLAG_BERSERK) != 0 || (monster._mFlags & MFLAG_GOLEM) == 0) {
for (int pnum = 0; pnum < MAX_PLRS; pnum++) {
Player &player = Players[pnum];
if (!player.plractive || currlevel != player.plrlevel || player._pLvlChanging
if (!player.plractive || !player.isOnActiveLevel() || player._pLvlChanging
|| (((player._pHitPoints >> 6) == 0) && gbIsMultiplayer))
continue;
bool sameroom = (dTransVal[position.x][position.y] == dTransVal[player.position.tile.x][player.position.tile.y]);

115
Source/msg.cpp

@ -645,7 +645,7 @@ DWORD OnWalk(const TCmd *pCmd, Player &player)
const auto &message = *reinterpret_cast<const TCmdLoc *>(pCmd);
const Point position { message.x, message.y };
if (gbBufferMsgs != 1 && currlevel == player.plrlevel && InDungeonBounds(position)) {
if (gbBufferMsgs != 1 && player.isOnActiveLevel() && InDungeonBounds(position)) {
ClrPlrPath(player);
MakePlrPath(player, position, true);
player.destAction = ACTION_NONE;
@ -707,7 +707,7 @@ DWORD OnGotoGetItem(const TCmd *pCmd, Player &player)
const auto &message = *reinterpret_cast<const TCmdLocParam1 *>(pCmd);
const Point position { message.x, message.y };
if (gbBufferMsgs != 1 && currlevel == player.plrlevel && InDungeonBounds(position) && message.wParam1 < MAXITEMS + 1) {
if (gbBufferMsgs != 1 && player.isOnActiveLevel() && InDungeonBounds(position) && message.wParam1 < MAXITEMS + 1) {
MakePlrPath(player, position, false);
player.destAction = ACTION_PICKUPITEM;
player.destParam1 = message.wParam1;
@ -818,7 +818,7 @@ DWORD OnGotoAutoGetItem(const TCmd *pCmd, Player &player)
const auto &message = *reinterpret_cast<const TCmdLocParam1 *>(pCmd);
const Point position { message.x, message.y };
if (gbBufferMsgs != 1 && currlevel == player.plrlevel && InDungeonBounds(position) && message.wParam1 < MAXITEMS + 1) {
if (gbBufferMsgs != 1 && player.isOnActiveLevel() && InDungeonBounds(position) && message.wParam1 < MAXITEMS + 1) {
MakePlrPath(player, position, false);
player.destAction = ACTION_PICKUPAITEM;
player.destParam1 = message.wParam1;
@ -889,7 +889,7 @@ DWORD OnItemExtra(const TCmd *pCmd, int pnum)
SendPacket(pnum, &message, sizeof(message));
} else if (IsGItemValid(message)) {
DeltaGetItem(message, message.bLevel);
if (currlevel == Players[pnum].plrlevel) {
if (Players[pnum].isOnActiveLevel()) {
const Point position { message.x, message.y };
SyncGetItem(position, message.dwSeed, message.wIndx, message.wCI);
}
@ -906,7 +906,7 @@ DWORD OnPutItem(const TCmd *pCmd, int pnum)
SendPacket(pnum, &message, sizeof(message));
} else if (IsPItemValid(message)) {
const Point position { message.x, message.y };
if (currlevel == Players[pnum].plrlevel) {
if (Players[pnum].isOnActiveLevel()) {
int ii;
if (pnum == MyPlayerId)
ii = InvPutItem(Players[pnum], position, ItemLimbo);
@ -936,7 +936,7 @@ DWORD OnSyncPutItem(const TCmd *pCmd, int pnum)
SendPacket(pnum, &message, sizeof(message));
else if (IsPItemValid(message)) {
const Point position { message.x, message.y };
if (currlevel == Players[pnum].plrlevel) {
if (Players[pnum].isOnActiveLevel()) {
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);
@ -963,12 +963,11 @@ DWORD OnRespawnItem(const TCmd *pCmd, int pnum)
} else if (IsPItemValid(message)) {
const Point position { message.x, message.y };
Player &player = Players[pnum];
int playerLevel = player.plrlevel;
if (currlevel == playerLevel && pnum != MyPlayerId) {
if (player.isOnActiveLevel() && pnum != MyPlayerId) {
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(message.dwSeed, message.wCI, message.wIndx);
DeltaPutItem(message, position, playerLevel);
DeltaPutItem(message, position, player.plrlevel);
}
return sizeof(message);
@ -979,7 +978,7 @@ DWORD OnAttackTile(const TCmd *pCmd, Player &player)
const auto &message = *reinterpret_cast<const TCmdLoc *>(pCmd);
const Point position { message.x, message.y };
if (gbBufferMsgs != 1 && currlevel == player.plrlevel && InDungeonBounds(position)) {
if (gbBufferMsgs != 1 && player.isOnActiveLevel() && InDungeonBounds(position)) {
MakePlrPath(player, position, false);
player.destAction = ACTION_ATTACK;
player.destParam1 = position.x;
@ -994,7 +993,7 @@ DWORD OnStandingAttackTile(const TCmd *pCmd, Player &player)
const auto &message = *reinterpret_cast<const TCmdLoc *>(pCmd);
const Point position { message.x, message.y };
if (gbBufferMsgs != 1 && currlevel == player.plrlevel && InDungeonBounds(position)) {
if (gbBufferMsgs != 1 && player.isOnActiveLevel() && InDungeonBounds(position)) {
ClrPlrPath(player);
player.destAction = ACTION_ATTACK;
player.destParam1 = position.x;
@ -1009,7 +1008,7 @@ DWORD OnRangedAttackTile(const TCmd *pCmd, Player &player)
const auto &message = *reinterpret_cast<const TCmdLoc *>(pCmd);
const Point position { message.x, message.y };
if (gbBufferMsgs != 1 && currlevel == player.plrlevel && InDungeonBounds(position)) {
if (gbBufferMsgs != 1 && player.isOnActiveLevel() && InDungeonBounds(position)) {
ClrPlrPath(player);
player.destAction = ACTION_RATTACK;
player.destParam1 = position.x;
@ -1026,7 +1025,7 @@ DWORD OnSpellWall(const TCmd *pCmd, Player &player)
if (gbBufferMsgs == 1)
return sizeof(message);
if (currlevel != player.plrlevel)
if (!player.isOnActiveLevel())
return sizeof(message);
if (!InDungeonBounds(position))
return sizeof(message);
@ -1061,7 +1060,7 @@ DWORD OnSpellTile(const TCmd *pCmd, Player &player)
if (gbBufferMsgs == 1)
return sizeof(message);
if (currlevel != player.plrlevel)
if (!player.isOnActiveLevel())
return sizeof(message);
if (!InDungeonBounds(position))
return sizeof(message);
@ -1094,7 +1093,7 @@ DWORD OnTargetSpellTile(const TCmd *pCmd, Player &player)
if (gbBufferMsgs == 1)
return sizeof(message);
if (currlevel != player.plrlevel)
if (!player.isOnActiveLevel())
return sizeof(message);
if (!InDungeonBounds(position))
return sizeof(message);
@ -1124,7 +1123,7 @@ DWORD OnOperateObjectTile(const TCmd *pCmd, Player &player)
const auto &message = *reinterpret_cast<const TCmdLocParam1 *>(pCmd);
const Point position { message.x, message.y };
if (gbBufferMsgs != 1 && currlevel == player.plrlevel && InDungeonBounds(position) && message.wParam1 < MAXOBJECTS) {
if (gbBufferMsgs != 1 && player.isOnActiveLevel() && InDungeonBounds(position) && message.wParam1 < MAXOBJECTS) {
MakePlrPath(player, position, !Objects[message.wParam1]._oSolidFlag && !Objects[message.wParam1]._oDoorFlag);
player.destAction = ACTION_OPERATE;
player.destParam1 = message.wParam1;
@ -1138,7 +1137,7 @@ DWORD OnDisarm(const TCmd *pCmd, Player &player)
const auto &message = *reinterpret_cast<const TCmdLocParam1 *>(pCmd);
const Point position { message.x, message.y };
if (gbBufferMsgs != 1 && currlevel == player.plrlevel && InDungeonBounds(position) && message.wParam1 < MAXOBJECTS) {
if (gbBufferMsgs != 1 && player.isOnActiveLevel() && InDungeonBounds(position) && message.wParam1 < MAXOBJECTS) {
MakePlrPath(player, position, !Objects[message.wParam1]._oSolidFlag && !Objects[message.wParam1]._oDoorFlag);
player.destAction = ACTION_DISARM;
player.destParam1 = message.wParam1;
@ -1151,7 +1150,7 @@ DWORD OnOperateObjectTelekinesis(const TCmd *pCmd, Player &player)
{
const auto &message = *reinterpret_cast<const TCmdParam1 *>(pCmd);
if (gbBufferMsgs != 1 && currlevel == player.plrlevel && message.wParam1 < MAXOBJECTS) {
if (gbBufferMsgs != 1 && player.isOnActiveLevel() && message.wParam1 < MAXOBJECTS) {
player.destAction = ACTION_OPERATETK;
player.destParam1 = message.wParam1;
}
@ -1163,7 +1162,7 @@ DWORD OnAttackMonster(const TCmd *pCmd, Player &player)
{
const auto &message = *reinterpret_cast<const TCmdParam1 *>(pCmd);
if (gbBufferMsgs != 1 && currlevel == player.plrlevel && message.wParam1 < MAXMONSTERS) {
if (gbBufferMsgs != 1 && player.isOnActiveLevel() && message.wParam1 < MAXMONSTERS) {
Point position = Monsters[message.wParam1].position.future;
if (player.position.tile.WalkingDistance(position) > 1)
MakePlrPath(player, position, false);
@ -1178,7 +1177,7 @@ DWORD OnAttackPlayer(const TCmd *pCmd, Player &player)
{
const auto &message = *reinterpret_cast<const TCmdParam1 *>(pCmd);
if (gbBufferMsgs != 1 && currlevel == player.plrlevel && message.wParam1 < MAX_PLRS) {
if (gbBufferMsgs != 1 && player.isOnActiveLevel() && message.wParam1 < MAX_PLRS) {
MakePlrPath(player, Players[message.wParam1].position.future, false);
player.destAction = ACTION_ATTACKPLR;
player.destParam1 = message.wParam1;
@ -1191,7 +1190,7 @@ DWORD OnRangedAttackMonster(const TCmd *pCmd, Player &player)
{
const auto &message = *reinterpret_cast<const TCmdParam1 *>(pCmd);
if (gbBufferMsgs != 1 && currlevel == player.plrlevel && message.wParam1 < MAXMONSTERS) {
if (gbBufferMsgs != 1 && player.isOnActiveLevel() && message.wParam1 < MAXMONSTERS) {
ClrPlrPath(player);
player.destAction = ACTION_RATTACKMON;
player.destParam1 = message.wParam1;
@ -1204,7 +1203,7 @@ DWORD OnRangedAttackPlayer(const TCmd *pCmd, Player &player)
{
const auto &message = *reinterpret_cast<const TCmdParam1 *>(pCmd);
if (gbBufferMsgs != 1 && currlevel == player.plrlevel && message.wParam1 < MAX_PLRS) {
if (gbBufferMsgs != 1 && player.isOnActiveLevel() && message.wParam1 < MAX_PLRS) {
ClrPlrPath(player);
player.destAction = ACTION_RATTACKPLR;
player.destParam1 = message.wParam1;
@ -1219,7 +1218,7 @@ DWORD OnSpellMonster(const TCmd *pCmd, Player &player)
if (gbBufferMsgs == 1)
return sizeof(message);
if (currlevel != player.plrlevel)
if (!player.isOnActiveLevel())
return sizeof(message);
if (message.wParam1 >= MAXMONSTERS)
return sizeof(message);
@ -1251,7 +1250,7 @@ DWORD OnSpellPlayer(const TCmd *pCmd, Player &player)
if (gbBufferMsgs == 1)
return sizeof(message);
if (currlevel != player.plrlevel)
if (!player.isOnActiveLevel())
return sizeof(message);
if (message.wParam1 >= MAX_PLRS)
return sizeof(message);
@ -1283,7 +1282,7 @@ DWORD OnTargetSpellMonster(const TCmd *pCmd, Player &player)
if (gbBufferMsgs == 1)
return sizeof(message);
if (currlevel != player.plrlevel)
if (!player.isOnActiveLevel())
return sizeof(message);
if (message.wParam1 >= MAXMONSTERS)
return sizeof(message);
@ -1315,7 +1314,7 @@ DWORD OnTargetSpellPlayer(const TCmd *pCmd, Player &player)
if (gbBufferMsgs == 1)
return sizeof(message);
if (currlevel != player.plrlevel)
if (!player.isOnActiveLevel())
return sizeof(message);
if (message.wParam1 >= MAX_PLRS)
return sizeof(message);
@ -1343,7 +1342,7 @@ DWORD OnKnockback(const TCmd *pCmd, int pnum)
{
const auto &message = *reinterpret_cast<const TCmdParam1 *>(pCmd);
if (gbBufferMsgs != 1 && currlevel == Players[pnum].plrlevel && message.wParam1 < MAXMONSTERS) {
if (gbBufferMsgs != 1 && Players[pnum].isOnActiveLevel() && message.wParam1 < MAXMONSTERS) {
M_GetKnockback(message.wParam1);
M_StartHit(message.wParam1, pnum, 0);
}
@ -1370,7 +1369,7 @@ DWORD OnHealOther(const TCmd *pCmd, const Player &caster)
const auto &message = *reinterpret_cast<const TCmdParam1 *>(pCmd);
if (gbBufferMsgs != 1) {
if (currlevel == caster.plrlevel && message.wParam1 < MAX_PLRS) {
if (caster.isOnActiveLevel() && message.wParam1 < MAX_PLRS) {
DoHealOther(caster, Players[message.wParam1]);
}
}
@ -1383,7 +1382,7 @@ DWORD OnTalkXY(const TCmd *pCmd, Player &player)
const auto &message = *reinterpret_cast<const TCmdLocParam1 *>(pCmd);
const Point position { message.x, message.y };
if (gbBufferMsgs != 1 && currlevel == player.plrlevel && InDungeonBounds(position) && message.wParam1 < NUM_TOWNERS) {
if (gbBufferMsgs != 1 && player.isOnActiveLevel() && InDungeonBounds(position) && message.wParam1 < NUM_TOWNERS) {
MakePlrPath(player, position, false);
player.destAction = ACTION_TALK;
player.destParam1 = message.wParam1;
@ -1440,10 +1439,10 @@ DWORD OnMonstDeath(const TCmd *pCmd, int pnum)
if (gbBufferMsgs == 1)
SendPacket(pnum, &message, sizeof(message));
else if (pnum != MyPlayerId && InDungeonBounds(position) && message.wParam1 < MAXMONSTERS) {
int playerLevel = Players[pnum].plrlevel;
if (currlevel == playerLevel)
Player &player = Players[pnum];
if (player.isOnActiveLevel())
M_SyncStartKill(message.wParam1, position, pnum);
delta_kill_monster(message.wParam1, position, playerLevel);
delta_kill_monster(message.wParam1, position, player.plrlevel);
}
return sizeof(message);
@ -1473,7 +1472,7 @@ DWORD OnAwakeGolem(const TCmd *pCmd, int pnum)
if (gbBufferMsgs == 1) {
SendPacket(pnum, &message, sizeof(message));
} else if (InDungeonBounds(position)) {
if (currlevel != Players[pnum].plrlevel) {
if (!Players[pnum].isOnActiveLevel()) {
DeltaSyncGolem(message, pnum, message._currlevel);
} else if (pnum != MyPlayerId) {
// Check if this player already has an active golem
@ -1497,15 +1496,15 @@ DWORD OnMonstDamage(const TCmd *pCmd, int pnum)
if (gbBufferMsgs == 1) {
SendPacket(pnum, &message, sizeof(message));
} else if (pnum != MyPlayerId) {
int playerLevel = Players[pnum].plrlevel;
if (currlevel == playerLevel && message.wMon < MAXMONSTERS) {
Player &player = Players[pnum];
if (player.isOnActiveLevel() && message.wMon < MAXMONSTERS) {
auto &monster = Monsters[message.wMon];
monster.mWhoHit |= 1 << pnum;
if (monster._mhitpoints > 0) {
monster._mhitpoints -= message.dwDam;
if ((monster._mhitpoints >> 6) < 1)
monster._mhitpoints = 1 << 6;
delta_monster_hp(message.wMon, monster._mhitpoints, playerLevel);
delta_monster_hp(message.wMon, monster._mhitpoints, player.plrlevel);
}
}
}
@ -1532,7 +1531,7 @@ DWORD OnPlayerDamage(const TCmd *pCmd, Player &player)
const auto &message = *reinterpret_cast<const TCmdDamage *>(pCmd);
if (message.bPlr == MyPlayerId && leveltype != DTYPE_TOWN && gbBufferMsgs != 1) {
if (currlevel == player.plrlevel && message.dwDam <= 192000 && Players[message.bPlr]._pHitPoints >> 6 > 0) {
if (player.isOnActiveLevel() && message.dwDam <= 192000 && Players[message.bPlr]._pHitPoints >> 6 > 0) {
ApplyPlrDamage(message.bPlr, 0, 0, message.dwDam, 1);
}
}
@ -1547,10 +1546,10 @@ DWORD OnOpenDoor(const TCmd *pCmd, int pnum)
if (gbBufferMsgs == 1) {
SendPacket(pnum, &message, sizeof(message));
} else if (message.wParam1 < MAXOBJECTS) {
int playerLevel = Players[pnum].plrlevel;
if (currlevel == playerLevel)
Player &player = Players[pnum];
if (player.isOnActiveLevel())
SyncOpObject(pnum, CMD_OPENDOOR, message.wParam1);
DeltaSyncObject(message.wParam1, CMD_OPENDOOR, playerLevel);
DeltaSyncObject(message.wParam1, CMD_OPENDOOR, player.plrlevel);
}
return sizeof(message);
@ -1563,10 +1562,10 @@ DWORD OnCloseDoor(const TCmd *pCmd, int pnum)
if (gbBufferMsgs == 1) {
SendPacket(pnum, &message, sizeof(message));
} else if (message.wParam1 < MAXOBJECTS) {
int playerLevel = Players[pnum].plrlevel;
if (currlevel == playerLevel)
Player &player = Players[pnum];
if (player.isOnActiveLevel())
SyncOpObject(pnum, CMD_CLOSEDOOR, message.wParam1);
DeltaSyncObject(message.wParam1, CMD_CLOSEDOOR, playerLevel);
DeltaSyncObject(message.wParam1, CMD_CLOSEDOOR, player.plrlevel);
}
return sizeof(message);
@ -1579,10 +1578,10 @@ DWORD OnOperateObject(const TCmd *pCmd, int pnum)
if (gbBufferMsgs == 1) {
SendPacket(pnum, &message, sizeof(message));
} else if (message.wParam1 < MAXOBJECTS) {
int playerLevel = Players[pnum].plrlevel;
if (currlevel == playerLevel)
Player &player = Players[pnum];
if (player.isOnActiveLevel())
SyncOpObject(pnum, CMD_OPERATEOBJ, message.wParam1);
DeltaSyncObject(message.wParam1, CMD_OPERATEOBJ, playerLevel);
DeltaSyncObject(message.wParam1, CMD_OPERATEOBJ, player.plrlevel);
}
return sizeof(message);
@ -1595,10 +1594,10 @@ DWORD OnPlayerOperateObject(const TCmd *pCmd, int pnum)
if (gbBufferMsgs == 1) {
SendPacket(pnum, &message, sizeof(message));
} else if (message.wParam1 < MAX_PLRS && message.wParam2 < MAXOBJECTS) {
int playerLevel = Players[pnum].plrlevel;
if (currlevel == playerLevel)
Player &player = Players[pnum];
if (player.isOnActiveLevel())
SyncOpObject(message.wParam1, CMD_PLROPOBJ, message.wParam2);
DeltaSyncObject(message.wParam2, CMD_PLROPOBJ, playerLevel);
DeltaSyncObject(message.wParam2, CMD_PLROPOBJ, player.plrlevel);
}
return sizeof(message);
@ -1611,11 +1610,11 @@ DWORD OnBreakObject(const TCmd *pCmd, int pnum)
if (gbBufferMsgs == 1) {
SendPacket(pnum, &message, sizeof(message));
} else if (message.wParam1 < MAX_PLRS && message.wParam2 < MAXOBJECTS) {
int playerLevel = Players[pnum].plrlevel;
if (currlevel == playerLevel) {
Player &player = Players[pnum];
if (player.isOnActiveLevel()) {
SyncBreakObj(message.wParam1, Objects[message.wParam2]);
}
DeltaSyncObject(message.wParam2, CMD_BREAKOBJ, playerLevel);
DeltaSyncObject(message.wParam2, CMD_BREAKOBJ, player.plrlevel);
}
return sizeof(message);
@ -1686,13 +1685,13 @@ DWORD OnSpawnItem(const TCmd *pCmd, int pnum)
if (gbBufferMsgs == 1) {
SendPacket(pnum, &message, sizeof(message));
} else if (IsPItemValid(message)) {
int playerLevel = Players[pnum].plrlevel;
Player &player = Players[pnum];
Point position = { message.x, message.y };
if (currlevel == playerLevel && pnum != MyPlayerId) {
if (player.isOnActiveLevel() && pnum != MyPlayerId) {
SyncDropItem(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(message.dwSeed, message.wCI, message.wIndx);
DeltaPutItem(message, position, playerLevel);
DeltaPutItem(message, position, player.plrlevel);
}
return sizeof(message);
@ -1739,7 +1738,7 @@ DWORD OnPlayerJoinLevel(const TCmd *pCmd, int pnum)
player.position.tile = position;
player.plrlevel = playerLevel;
ResetPlayerGFX(player);
if (currlevel == player.plrlevel) {
if (player.isOnActiveLevel()) {
SyncInitPlr(pnum);
if ((player._pHitPoints >> 6) > 0) {
StartStand(pnum, Direction::South);
@ -1774,7 +1773,7 @@ DWORD OnActivatePortal(const TCmd *pCmd, int pnum)
if (pnum != MyPlayerId) {
if (leveltype == DTYPE_TOWN) {
AddInTownPortal(pnum);
} else if (currlevel == Players[pnum].plrlevel) {
} else if (Players[pnum].isOnActiveLevel()) {
bool addPortal = true;
for (auto &missile : Missiles) {
if (missile._mitype == MIS_TOWN && missile._misource == pnum) {
@ -1946,7 +1945,7 @@ DWORD OnNova(const TCmd *pCmd, int pnum)
if (gbBufferMsgs != 1) {
Player &player = Players[pnum];
if (currlevel == player.plrlevel && pnum != MyPlayerId && InDungeonBounds(position)) {
if (player.isOnActiveLevel() && pnum != MyPlayerId && InDungeonBounds(position)) {
ClrPlrPath(player);
player._pSpell = SPL_NOVA;
player._pSplType = RSPLTYPE_INVALID;

4
Source/multi.cpp

@ -627,7 +627,7 @@ void multi_process_network_packets()
player._pBaseMag = pkt->bmag;
player._pBaseDex = pkt->bdex;
if (!cond && player.plractive && player._pHitPoints != 0) {
if (currlevel == player.plrlevel && !player._pLvlChanging) {
if (player.isOnActiveLevel() && !player._pLvlChanging) {
int dx = abs(player.position.tile.x - pkt->px);
int dy = abs(player.position.tile.y - pkt->py);
if ((dx > 3 || dy > 3) && dPlayer[pkt->px][pkt->py] == 0) {
@ -833,7 +833,7 @@ void recv_plrinfo(int pnum, const TCmdPlrInfoHdr &header, bool recv)
SyncInitPlr(pnum);
if (player.plrlevel != currlevel) {
if (!player.isOnActiveLevel()) {
return;
}

4
Source/objects.cpp

@ -1349,7 +1349,7 @@ void UpdateObjectLight(Object &light, int lightRadius)
if (!DisableLighting) {
for (int p = 0; p < MAX_PLRS && !turnon; p++) {
if (Players[p].plractive) {
if (currlevel == Players[p].plrlevel) {
if (Players[p].isOnActiveLevel()) {
int dx = abs(Players[p].position.tile.x - ox);
int dy = abs(Players[p].position.tile.y - oy);
if (dx < tr && dy < tr)
@ -4947,7 +4947,7 @@ void ProcessObjects()
void RedoPlayerVision()
{
for (Player &player : Players) {
if (player.plractive && currlevel == player.plrlevel) {
if (player.plractive && player.isOnActiveLevel()) {
ChangeVisionXY(player._pvid, player.position.tile);
}
}

8
Source/player.cpp

@ -2782,7 +2782,7 @@ void InitPlayer(Player &player, bool firstTime)
player.wReflections = 0;
}
if (player.plrlevel == currlevel) {
if (player.isOnActiveLevel()) {
SetPlrAnims(player);
@ -3084,7 +3084,7 @@ StartPlayerKill(int pnum, int earflag)
CalcPlrInv(player, false);
}
if (player.plrlevel == currlevel) {
if (player.isOnActiveLevel()) {
FixPlayerLocation(pnum, player._pdir);
RemovePlrFromMap(pnum);
dFlags[player.position.tile.x][player.position.tile.y] |= DungeonFlag::DeadPlayer;
@ -3372,7 +3372,7 @@ void ProcessPlayers()
for (int pnum = 0; pnum < MAX_PLRS; pnum++) {
Player &player = Players[pnum];
if (player.plractive && currlevel == player.plrlevel && (pnum == MyPlayerId || !player._pLvlChanging)) {
if (player.plractive && player.isOnActiveLevel() && (pnum == MyPlayerId || !player._pLvlChanging)) {
CheckCheatStats(player);
if (!PlrDeathModeOK(pnum) && (player._pHitPoints >> 6) <= 0) {
@ -3657,7 +3657,7 @@ void SyncInitPlrPos(int pnum)
{
Player &player = Players[pnum];
if (!gbIsMultiplayer || player.plrlevel != currlevel) {
if (!gbIsMultiplayer || !player.isOnActiveLevel()) {
return;
}

6
Source/player.h

@ -706,6 +706,12 @@ struct Player {
* @param wParam2 Second Parameter
*/
void UpdatePreviewCelSprite(_cmd_id cmdId, Point point, uint16_t wParam1, uint16_t wParam2);
/** @brief Checks if the player is on the same level as the local player (MyPlayer). */
bool isOnActiveLevel() const
{
return currlevel == this->plrlevel;
}
};
extern DVL_API_FOR_TEST int MyPlayerId;

2
Source/scrollrt.cpp

@ -582,7 +582,7 @@ void DrawDeadPlayer(const Surface &out, Point tilePosition, Point targetBufferPo
for (int i = 0; i < MAX_PLRS; i++) {
Player &player = Players[i];
if (player.plractive && player._pHitPoints == 0 && player.plrlevel == currlevel && player.position.tile == tilePosition) {
if (player.plractive && player._pHitPoints == 0 && player.isOnActiveLevel() && player.position.tile == tilePosition) {
dFlags[tilePosition.x][tilePosition.y] |= DungeonFlag::DeadPlayer;
const Point playerRenderPosition { targetBufferPosition + player.position.offset };
DrawPlayer(out, i, tilePosition, playerRenderPosition);

4
Source/spells.cpp

@ -68,7 +68,7 @@ void PlacePlayer(int pnum)
{
Player &player = Players[pnum];
if (player.plrlevel != currlevel)
if (!player.isOnActiveLevel())
return;
Point newPosition = [&]() {
@ -291,7 +291,7 @@ void DoResurrect(int pnum, uint16_t rid)
CalcPlrInv(target, true);
if (target.plrlevel == currlevel) {
if (target.isOnActiveLevel()) {
StartStand(rid, target._pdir);
} else {
target._pmode = PM_STAND;

2
Source/track.cpp

@ -54,7 +54,7 @@ void InvalidateTargets()
if (pcursplr != -1) {
Player &targetPlayer = Players[pcursplr];
if (targetPlayer._pmode == PM_DEATH || targetPlayer._pmode == PM_QUIT || !targetPlayer.plractive
|| currlevel != targetPlayer.plrlevel || targetPlayer._pHitPoints >> 6 <= 0
|| !targetPlayer.isOnActiveLevel() || targetPlayer._pHitPoints >> 6 <= 0
|| !IsTileLit(targetPlayer.position.tile))
pcursplr = -1;
}

Loading…
Cancel
Save