From 7831ed6ca113913bc8a54cf996cdb485dcf590ac Mon Sep 17 00:00:00 2001 From: staphen Date: Wed, 23 Apr 2025 23:04:10 -0400 Subject: [PATCH] Isolate monster sync packet validation using Monsters array --- Source/msg.cpp | 1 + Source/sync.cpp | 45 +++++++++++++++++++++++++-------------------- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/Source/msg.cpp b/Source/msg.cpp index cd9612395..c6c1f573e 100644 --- a/Source/msg.cpp +++ b/Source/msg.cpp @@ -26,6 +26,7 @@ #include "engine/random.hpp" #include "engine/world_tile.hpp" #include "gamemenu.h" +#include "items/validation.h" #include "levels/crypt.h" #include "levels/town.h" #include "levels/trigs.h" diff --git a/Source/sync.cpp b/Source/sync.cpp index 199ed651e..fb4fb8901 100644 --- a/Source/sync.cpp +++ b/Source/sync.cpp @@ -205,29 +205,18 @@ void SyncMonster(bool isOwner, const TSyncMonster &monsterSync) monster.whoHit |= monsterSync.mWhoHit; } -bool IsEnemyIdValid(const Monster &monster, uint8_t enemyId) +bool IsEnemyIdValid(uint8_t enemyId) { - if (enemyId > MaxMonsters) { - enemyId -= MaxMonsters; - if (enemyId >= Players.size()) - return false; - return Players[enemyId].plractive; - } - - const Monster &enemy = Monsters[enemyId]; + if (enemyId < MaxMonsters) + return true; - if (&enemy == &monster) { + enemyId -= MaxMonsters; + if (enemyId >= Players.size()) return false; - } - - if (enemy.hitPoints <= 0) { - return false; - } - - return true; + return Players[enemyId].plractive; } -bool IsTSyncMonsterValidate(const TSyncMonster &monsterSync) +bool IsTSyncMonsterValid(const TSyncMonster &monsterSync) { const size_t monsterId = monsterSync._mndx; @@ -237,12 +226,26 @@ bool IsTSyncMonsterValidate(const TSyncMonster &monsterSync) if (!InDungeonBounds({ monsterSync._mx, monsterSync._my })) return false; - if (!IsEnemyIdValid(Monsters[monsterId], monsterSync._menemy)) + if (!IsEnemyIdValid(monsterSync._menemy)) return false; return true; } +bool IsTSyncEnemyValid(const TSyncMonster &monsterSync) +{ + const size_t enemyId = monsterSync._menemy; + if (enemyId >= MaxMonsters) + return true; + + const size_t monsterId = monsterSync._mndx; + if (enemyId == monsterId) + return false; + + const Monster &enemy = Monsters[enemyId]; + return enemy.hitPoints > 0; +} + } // namespace size_t sync_all_monsters(std::byte *pbBuf, size_t dwMaxLen) @@ -314,10 +317,12 @@ uint32_t OnSyncData(const TCmd *pCmd, const Player &player) bool isOwner = player.getId() > MyPlayerId; for (int i = 0; i < monsterCount; i++) { - if (!IsTSyncMonsterValidate(monsterSyncs[i])) + if (!IsTSyncMonsterValid(monsterSyncs[i])) continue; if (syncLocalLevel) { + if (!IsTSyncEnemyValid(monsterSyncs[i])) + continue; SyncMonster(isOwner, monsterSyncs[i]); }