diff --git a/Source/automap.cpp b/Source/automap.cpp index 8239bf5f6..121f974cf 100644 --- a/Source/automap.cpp +++ b/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); } } diff --git a/Source/diablo.cpp b/Source/diablo.cpp index 06597d305..c0cb5915c 100644 --- a/Source/diablo.cpp +++ b/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; diff --git a/Source/interfac.cpp b/Source/interfac.cpp index 6117f8439..37af06041 100644 --- a/Source/interfac.cpp +++ b/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(); diff --git a/Source/lighting.cpp b/Source/lighting.cpp index 41b34b1ea..8a655e2c6 100644 --- a/Source/lighting.cpp +++ b/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) diff --git a/Source/loadsave.cpp b/Source/loadsave.cpp index 2bc43dd5f..4fcd519b6 100644 --- a/Source/loadsave.cpp +++ b/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; } } diff --git a/Source/missiles.cpp b/Source/missiles.cpp index aec6abf44..a29e5c746 100644 --- a/Source/missiles.cpp +++ b/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); diff --git a/Source/monster.cpp b/Source/monster.cpp index 80145e200..61085bb57 100644 --- a/Source/monster.cpp +++ b/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]); diff --git a/Source/msg.cpp b/Source/msg.cpp index b5f9535ed..8731ce599 100644 --- a/Source/msg.cpp +++ b/Source/msg.cpp @@ -645,7 +645,7 @@ DWORD OnWalk(const TCmd *pCmd, Player &player) const auto &message = *reinterpret_cast(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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; diff --git a/Source/multi.cpp b/Source/multi.cpp index b6e4b5dcc..de1c1ab7d 100644 --- a/Source/multi.cpp +++ b/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; } diff --git a/Source/objects.cpp b/Source/objects.cpp index a15140de3..e3173f935 100644 --- a/Source/objects.cpp +++ b/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); } } diff --git a/Source/player.cpp b/Source/player.cpp index b9a3dbb2d..9e70627ef 100644 --- a/Source/player.cpp +++ b/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; } diff --git a/Source/player.h b/Source/player.h index b0aa6becf..af7052d46 100644 --- a/Source/player.h +++ b/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; diff --git a/Source/scrollrt.cpp b/Source/scrollrt.cpp index b0c205b93..060e64fcd 100644 --- a/Source/scrollrt.cpp +++ b/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); diff --git a/Source/spells.cpp b/Source/spells.cpp index d1b4aeb5d..6a0d531c0 100644 --- a/Source/spells.cpp +++ b/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; diff --git a/Source/track.cpp b/Source/track.cpp index b9266ea68..57d46e88c 100644 --- a/Source/track.cpp +++ b/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; }