Browse Source

Network: Decouple enemyId from max players

pull/7952/head
obligaron 1 year ago committed by Stephen C. Wills
parent
commit
ef5986f4df
  1. 12
      Source/monster.cpp
  2. 4
      Source/monster.h
  3. 18
      Source/sync.cpp

12
Source/monster.cpp

@ -4672,23 +4672,23 @@ bool CanTalkToMonst(const Monster &monster)
return IsAnyOf(monster.goal, MonsterGoal::Inquiring, MonsterGoal::Talking); return IsAnyOf(monster.goal, MonsterGoal::Inquiring, MonsterGoal::Talking);
} }
int encode_enemy(Monster &monster) uint8_t encode_enemy(Monster &monster)
{ {
if ((monster.flags & MFLAG_TARGETS_MONSTER) != 0) if ((monster.flags & MFLAG_TARGETS_MONSTER) != 0)
return monster.enemy + MAX_PLRS; return monster.enemy;
return monster.enemy; return monster.enemy + MaxMonsters;
} }
void decode_enemy(Monster &monster, int enemyId) void decode_enemy(Monster &monster, uint8_t enemyId)
{ {
if (enemyId < MAX_PLRS) { if (enemyId >= MaxMonsters) {
enemyId -= MaxMonsters;
monster.flags &= ~MFLAG_TARGETS_MONSTER; monster.flags &= ~MFLAG_TARGETS_MONSTER;
monster.enemy = enemyId; monster.enemy = enemyId;
monster.enemyPosition = Players[enemyId].position.future; monster.enemyPosition = Players[enemyId].position.future;
} else { } else {
monster.flags |= MFLAG_TARGETS_MONSTER; monster.flags |= MFLAG_TARGETS_MONSTER;
enemyId -= MAX_PLRS;
monster.enemy = enemyId; monster.enemy = enemyId;
monster.enemyPosition = Monsters[enemyId].position.future; monster.enemyPosition = Monsters[enemyId].position.future;
} }

4
Source/monster.h

@ -570,7 +570,7 @@ Monster *PreSpawnSkeleton();
void TalktoMonster(Player &player, Monster &monster); void TalktoMonster(Player &player, Monster &monster);
void SpawnGolem(Player &player, Monster &golem, Point position, Missile &missile); void SpawnGolem(Player &player, Monster &golem, Point position, Missile &missile);
bool CanTalkToMonst(const Monster &monster); bool CanTalkToMonst(const Monster &monster);
int encode_enemy(Monster &monster); uint8_t encode_enemy(Monster &monster);
void decode_enemy(Monster &monster, int enemyId); void decode_enemy(Monster &monster, uint8_t enemyId);
} // namespace devilution } // namespace devilution

18
Source/sync.cpp

@ -160,7 +160,7 @@ void SyncMonster(bool isOwner, const TSyncMonster &monsterSync)
} }
const Point position { monsterSync._mx, monsterSync._my }; const Point position { monsterSync._mx, monsterSync._my };
const int enemyId = monsterSync._menemy; const uint8_t enemyId = monsterSync._menemy;
if (monster.activeForTicks != 0) { if (monster.activeForTicks != 0) {
uint32_t delta = MyPlayer->position.tile.ManhattanDistance(monster.position.tile); uint32_t delta = MyPlayer->position.tile.ManhattanDistance(monster.position.tile);
@ -205,21 +205,15 @@ void SyncMonster(bool isOwner, const TSyncMonster &monsterSync)
monster.whoHit |= monsterSync.mWhoHit; monster.whoHit |= monsterSync.mWhoHit;
} }
bool IsEnemyIdValid(const Monster &monster, int enemyId) bool IsEnemyIdValid(const Monster &monster, uint8_t enemyId)
{ {
if (enemyId < 0) { if (enemyId > MaxMonsters) {
return false; enemyId -= MaxMonsters;
} if (enemyId >= Players.size())
return false;
if (enemyId < MAX_PLRS) {
return Players[enemyId].plractive; return Players[enemyId].plractive;
} }
enemyId -= MAX_PLRS;
if (static_cast<size_t>(enemyId) >= MaxMonsters) {
return false;
}
const Monster &enemy = Monsters[enemyId]; const Monster &enemy = Monsters[enemyId];
if (&enemy == &monster) { if (&enemy == &monster) {

Loading…
Cancel
Save