Browse Source

Isolate monster sync packet validation using Monsters array

pull/7987/head
staphen 11 months ago committed by Stephen C. Wills
parent
commit
7831ed6ca1
  1. 1
      Source/msg.cpp
  2. 45
      Source/sync.cpp

1
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"

45
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]);
}

Loading…
Cancel
Save