Browse Source

Minimize propegation of global Players index

dyn-players-param2
Anders Jenbo 4 years ago
parent
commit
f166c249b6
  1. 6
      Source/diablo.cpp
  2. 23
      Source/engine/render/scrollrt.cpp
  3. 21
      Source/missiles.cpp
  4. 2
      Source/missiles.h
  5. 7
      Source/msg.cpp
  6. 157
      Source/objects.cpp
  7. 2
      Source/objects.h
  8. 2
      Source/player.cpp

6
Source/diablo.cpp

@ -1897,11 +1897,11 @@ bool TryIconCurs()
if (pcurs == CURSOR_TELEPORT) { if (pcurs == CURSOR_TELEPORT) {
if (pcursmonst != -1) if (pcursmonst != -1)
NetSendCmdParam3(true, CMD_TSPELLID, pcursmonst, myPlayer._pTSpell, GetSpellLevel(MyPlayerId, myPlayer._pTSpell)); NetSendCmdParam3(true, CMD_TSPELLID, pcursmonst, myPlayer._pTSpell, GetSpellLevel(myPlayer, myPlayer._pTSpell));
else if (pcursplr != -1) else if (pcursplr != -1)
NetSendCmdParam3(true, CMD_TSPELLPID, pcursplr, myPlayer._pTSpell, GetSpellLevel(MyPlayerId, myPlayer._pTSpell)); NetSendCmdParam3(true, CMD_TSPELLPID, pcursplr, myPlayer._pTSpell, GetSpellLevel(myPlayer, myPlayer._pTSpell));
else else
NetSendCmdLocParam2(true, CMD_TSPELLXY, cursPosition, myPlayer._pTSpell, GetSpellLevel(MyPlayerId, myPlayer._pTSpell)); NetSendCmdLocParam2(true, CMD_TSPELLXY, cursPosition, myPlayer._pTSpell, GetSpellLevel(myPlayer, myPlayer._pTSpell));
NewCursor(CURSOR_HAND); NewCursor(CURSOR_HAND);
return true; return true;
} }

23
Source/engine/render/scrollrt.cpp

@ -500,21 +500,18 @@ void DrawPlayerIcons(const Surface &out, Player &player, Point position, bool in
/** /**
* @brief Render a player sprite * @brief Render a player sprite
* @param out Output buffer * @param out Output buffer
* @param pnum Player id
* @param tilePosition dPiece coordinates * @param tilePosition dPiece coordinates
* @param targetBufferPosition Output buffer coordinates * @param targetBufferPosition Output buffer coordinates
* @param pCelBuff sprite buffer * @param pCelBuff sprite buffer
* @param nCel frame * @param nCel frame
* @param nWidth width * @param nWidth width
*/ */
void DrawPlayer(const Surface &out, int pnum, Point tilePosition, Point targetBufferPosition) void DrawPlayer(const Surface &out, Player &player, Point tilePosition, Point targetBufferPosition)
{ {
if (!IsTileLit(tilePosition) && !MyPlayer->_pInfraFlag && leveltype != DTYPE_TOWN) { if (!IsTileLit(tilePosition) && !MyPlayer->_pInfraFlag && leveltype != DTYPE_TOWN) {
return; return;
} }
Player &player = Players[pnum];
std::optional<CelSprite> sprite = player.AnimInfo.celSprite; std::optional<CelSprite> sprite = player.AnimInfo.celSprite;
int nCel = player.AnimInfo.GetFrameToUseForRendering(); int nCel = player.AnimInfo.GetFrameToUseForRendering();
@ -524,7 +521,7 @@ void DrawPlayer(const Surface &out, int pnum, Point tilePosition, Point targetBu
} }
if (!sprite) { if (!sprite) {
Log("Drawing player {} \"{}\": NULL CelSprite", pnum, player._pName); Log("Drawing player {} \"{}\": NULL CelSprite", std::distance(Players, &player), player._pName);
return; return;
} }
@ -537,7 +534,7 @@ void DrawPlayer(const Surface &out, int pnum, Point tilePosition, Point targetBu
szMode = PlayerModeNames[player._pmode]; szMode = PlayerModeNames[player._pmode];
Log( Log(
"Drawing player {} \"{}\" {}: facing {}, frame {} of {}", "Drawing player {} \"{}\" {}: facing {}, frame {} of {}",
pnum, std::distance(Players, &player),
player._pName, player._pName,
szMode, szMode,
DirectionToString(player._pdir), DirectionToString(player._pdir),
@ -546,10 +543,10 @@ void DrawPlayer(const Surface &out, int pnum, Point tilePosition, Point targetBu
return; return;
} }
if (pnum == pcursplr) if (pcursplr >= 0 && pcursplr < MAX_PLRS && &player == &Players[pcursplr])
Cl2DrawOutline(out, 165, spriteBufferPosition.x, spriteBufferPosition.y, *sprite, nCel); Cl2DrawOutline(out, 165, spriteBufferPosition.x, spriteBufferPosition.y, *sprite, nCel);
if (pnum == MyPlayerId) { if (&player == MyPlayer) {
Cl2Draw(out, spriteBufferPosition.x, spriteBufferPosition.y, *sprite, nCel); Cl2Draw(out, spriteBufferPosition.x, spriteBufferPosition.y, *sprite, nCel);
DrawPlayerIcons(out, player, targetBufferPosition, false); DrawPlayerIcons(out, player, targetBufferPosition, false);
return; return;
@ -588,7 +585,7 @@ void DrawDeadPlayer(const Surface &out, Point tilePosition, Point targetBufferPo
if (player.plractive && player._pHitPoints == 0 && player.isOnActiveLevel() && player.position.tile == tilePosition) { if (player.plractive && player._pHitPoints == 0 && player.isOnActiveLevel() && player.position.tile == tilePosition) {
dFlags[tilePosition.x][tilePosition.y] |= DungeonFlag::DeadPlayer; dFlags[tilePosition.x][tilePosition.y] |= DungeonFlag::DeadPlayer;
const Point playerRenderPosition { targetBufferPosition + player.position.offset }; const Point playerRenderPosition { targetBufferPosition + player.position.offset };
DrawPlayer(out, i, tilePosition, playerRenderPosition); DrawPlayer(out, player, tilePosition, playerRenderPosition);
} }
} }
} }
@ -803,10 +800,8 @@ void DrawMonsterHelper(const Surface &out, Point tilePosition, Point targetBuffe
* @param tilePosition dPiece coordinates * @param tilePosition dPiece coordinates
* @param targetBufferPosition Output buffer coordinates * @param targetBufferPosition Output buffer coordinates
*/ */
void DrawPlayerHelper(const Surface &out, int p, Point tilePosition, Point targetBufferPosition) void DrawPlayerHelper(const Surface &out, Player &player, Point tilePosition, Point targetBufferPosition)
{ {
Player &player = Players[p];
Displacement offset = player.position.offset; Displacement offset = player.position.offset;
if (player.IsWalking()) { if (player.IsWalking()) {
offset = GetOffsetForWalking(player.AnimInfo, player._pdir); offset = GetOffsetForWalking(player.AnimInfo, player._pdir);
@ -814,7 +809,7 @@ void DrawPlayerHelper(const Surface &out, int p, Point tilePosition, Point targe
const Point playerRenderPosition { targetBufferPosition + offset }; const Point playerRenderPosition { targetBufferPosition + offset };
DrawPlayer(out, p, tilePosition, playerRenderPosition); DrawPlayer(out, player, tilePosition, playerRenderPosition);
} }
/** /**
@ -876,7 +871,7 @@ void DrawDungeon(const Surface &out, Point tilePosition, Point targetBufferPosit
} }
int8_t playerId = dPlayer[tilePosition.x][tilePosition.y]; int8_t playerId = dPlayer[tilePosition.x][tilePosition.y];
if (playerId > 0 && playerId <= MAX_PLRS) { if (playerId > 0 && playerId <= MAX_PLRS) {
DrawPlayerHelper(out, abs(playerId) - 1, tilePosition, targetBufferPosition); DrawPlayerHelper(out, Players[abs(playerId) - 1], tilePosition, targetBufferPosition);
} }
if (dMonster[tilePosition.x][tilePosition.y] > 0) { if (dMonster[tilePosition.x][tilePosition.y] > 0) {
DrawMonsterHelper(out, tilePosition, targetBufferPosition); DrawMonsterHelper(out, tilePosition, targetBufferPosition);

21
Source/missiles.cpp

@ -262,10 +262,9 @@ bool MonsterMHit(int pnum, int m, int mindam, int maxdam, int dist, missile_id t
return true; return true;
} }
bool Plr2PlrMHit(int pnum, int p, int mindam, int maxdam, int dist, missile_id mtype, bool shift, bool *blocked) bool Plr2PlrMHit(Player &player, int p, int mindam, int maxdam, int dist, missile_id mtype, bool shift, bool *blocked)
{ {
Player &player = Players[pnum]; Player &target = Players[p];
auto &target = Players[p];
if (sgGameInitInfo.bFriendlyFire == 0 && player.friendlyMode) if (sgGameInitInfo.bFriendlyFire == 0 && player.friendlyMode)
return false; return false;
@ -342,7 +341,7 @@ bool Plr2PlrMHit(int pnum, int p, int mindam, int maxdam, int dist, missile_id m
dam /= 2; dam /= 2;
if (resper > 0) { if (resper > 0) {
dam -= (dam * resper) / 100; dam -= (dam * resper) / 100;
if (pnum == MyPlayerId) if (&player == MyPlayer)
NetSendCmdDamage(true, p, dam); NetSendCmdDamage(true, p, dam);
target.Say(HeroSpeech::ArghClang); target.Say(HeroSpeech::ArghClang);
return true; return true;
@ -352,7 +351,7 @@ bool Plr2PlrMHit(int pnum, int p, int mindam, int maxdam, int dist, missile_id m
StartPlrBlock(p, GetDirection(target.position.tile, player.position.tile)); StartPlrBlock(p, GetDirection(target.position.tile, player.position.tile));
*blocked = true; *blocked = true;
} else { } else {
if (pnum == MyPlayerId) if (&player == MyPlayer)
NetSendCmdDamage(true, p, dam); NetSendCmdDamage(true, p, dam);
StartPlrHit(p, dam, false); StartPlrHit(p, dam, false);
} }
@ -415,7 +414,7 @@ void CheckMissileCol(Missile &missile, int minDamage, int maxDamage, bool isDama
if (missile._micaster != TARGET_BOTH && !missile.IsTrap()) { if (missile._micaster != TARGET_BOTH && !missile.IsTrap()) {
if (missile._micaster == TARGET_MONSTERS) { if (missile._micaster == TARGET_MONSTERS) {
if ((pid - 1) != missile._misource) if ((pid - 1) != missile._misource)
isPlayerHit = Plr2PlrMHit(missile._misource, pid - 1, minDamage, maxDamage, missile._midist, missile._mitype, isDamageShifted, &blocked); isPlayerHit = Plr2PlrMHit(Player[missile._misource], pid - 1, minDamage, maxDamage, missile._midist, missile._mitype, isDamageShifted, &blocked);
} else { } else {
Monster &monster = Monsters[missile._misource]; Monster &monster = Monsters[missile._misource];
isPlayerHit = PlayerMHit(pid - 1, &monster, missile._midist, minDamage, maxDamage, missile._mitype, isDamageShifted, 0, &blocked); isPlayerHit = PlayerMHit(pid - 1, &monster, missile._midist, minDamage, maxDamage, missile._mitype, isDamageShifted, 0, &blocked);
@ -601,7 +600,7 @@ bool GuardianTryFireAt(Missile &missile, Point target)
return false; return false;
Direction dir = GetDirection(position, target); Direction dir = GetDirection(position, target);
AddMissile(position, target, dir, MIS_FIREBOLT, TARGET_MONSTERS, missile._misource, missile._midam, GetSpellLevel(missile._misource, SPL_FIREBOLT), &missile); AddMissile(position, target, dir, MIS_FIREBOLT, TARGET_MONSTERS, missile._misource, missile._midam, GetSpellLevel(Players[missile._misource], SPL_FIREBOLT), &missile);
SetMissDir(missile, 2); SetMissDir(missile, 2);
missile.var2 = 3; missile.var2 = 3;
@ -803,13 +802,11 @@ void GetDamageAmt(int i, int *mind, int *maxd)
} }
} }
int GetSpellLevel(int playerId, spell_id sn) int GetSpellLevel(Player &player, spell_id sn)
{ {
if (playerId != MyPlayerId) if (&player != MyPlayer)
return 1; // BUGFIX spell level will be wrong in multiplayer return 1; // BUGFIX spell level will be wrong in multiplayer
Player &player = Players[playerId];
return std::max(player._pISplLvlAdd + player._pSplLvl[sn], 0); return std::max(player._pISplLvlAdd + player._pSplLvl[sn], 0);
} }
@ -1166,7 +1163,7 @@ void AddBerserk(Missile &missile, const AddMissileParameter &parameter)
if (targetMonsterPosition) { if (targetMonsterPosition) {
auto &monster = Monsters[abs(dMonster[targetMonsterPosition->x][targetMonsterPosition->y]) - 1]; auto &monster = Monsters[abs(dMonster[targetMonsterPosition->x][targetMonsterPosition->y]) - 1];
int slvl = GetSpellLevel(missile._misource, SPL_BERSERK); int slvl = GetSpellLevel(Players[missile._misource], SPL_BERSERK);
monster._mFlags |= MFLAG_BERSERK | MFLAG_GOLEM; monster._mFlags |= MFLAG_BERSERK | MFLAG_GOLEM;
monster.mMinDamage = (GenerateRnd(10) + 120) * monster.mMinDamage / 100 + slvl; monster.mMinDamage = (GenerateRnd(10) + 120) * monster.mMinDamage / 100 + slvl;
monster.mMaxDamage = (GenerateRnd(10) + 120) * monster.mMaxDamage / 100 + slvl; monster.mMaxDamage = (GenerateRnd(10) + 120) * monster.mMaxDamage / 100 + slvl;

2
Source/missiles.h

@ -138,7 +138,7 @@ extern std::list<Missile> Missiles;
extern bool MissilePreFlag; extern bool MissilePreFlag;
void GetDamageAmt(int i, int *mind, int *maxd); void GetDamageAmt(int i, int *mind, int *maxd);
int GetSpellLevel(int playerId, spell_id sn); int GetSpellLevel(Player &player, spell_id sn);
/** /**
* @brief Returns the direction a vector from p1(x1, y1) to p2(x2, y2) is pointing to. * @brief Returns the direction a vector from p1(x1, y1) to p2(x2, y2) is pointing to.

7
Source/msg.cpp

@ -2030,14 +2030,13 @@ DWORD OnDebug(const TCmd *pCmd)
return sizeof(*pCmd); return sizeof(*pCmd);
} }
DWORD OnNova(const TCmd *pCmd, int pnum) DWORD OnNova(const TCmd *pCmd, Player &player)
{ {
const auto &message = *reinterpret_cast<const TCmdLoc *>(pCmd); const auto &message = *reinterpret_cast<const TCmdLoc *>(pCmd);
const Point position { message.x, message.y }; const Point position { message.x, message.y };
if (gbBufferMsgs != 1) { if (gbBufferMsgs != 1) {
Player &player = Players[pnum]; if (player.isOnActiveLevel() && &player != MyPlayer && InDungeonBounds(position)) {
if (player.isOnActiveLevel() && pnum != MyPlayerId && InDungeonBounds(position)) {
ClrPlrPath(player); ClrPlrPath(player);
player._pSpell = SPL_NOVA; player._pSpell = SPL_NOVA;
player._pSplType = RSPLTYPE_INVALID; player._pSplType = RSPLTYPE_INVALID;
@ -3060,7 +3059,7 @@ uint32_t ParseCmd(int pnum, const TCmd *pCmd)
case CMD_CHEAT_SPELL_LEVEL: case CMD_CHEAT_SPELL_LEVEL:
return OnCheatSpellLevel(pCmd, pnum); return OnCheatSpellLevel(pCmd, pnum);
case CMD_NOVA: case CMD_NOVA:
return OnNova(pCmd, pnum); return OnNova(pCmd, player);
case CMD_SETSHIELD: case CMD_SETSHIELD:
return OnSetShield(pCmd, player); return OnSetShield(pCmd, player);
case CMD_REMSHIELD: case CMD_REMSHIELD:

157
Source/objects.cpp

@ -2093,20 +2093,20 @@ void OperateL5LDoor(int oi, bool sendflag)
} }
} }
void OperateL1Door(int pnum, int i) void OperateL1Door(Player &player, int i)
{ {
int dpx = abs(Objects[i].position.x - Players[pnum].position.tile.x); int dpx = abs(Objects[i].position.x - player.position.tile.x);
int dpy = abs(Objects[i].position.y - Players[pnum].position.tile.y); int dpy = abs(Objects[i].position.y - player.position.tile.y);
if (dpx == 1 && dpy <= 1 && Objects[i]._otype == OBJ_L1LDOOR) if (dpx == 1 && dpy <= 1 && Objects[i]._otype == OBJ_L1LDOOR)
OperateL1LDoor(i, true); OperateL1LDoor(i, true);
if (dpx <= 1 && dpy == 1 && Objects[i]._otype == OBJ_L1RDOOR) if (dpx <= 1 && dpy == 1 && Objects[i]._otype == OBJ_L1RDOOR)
OperateL1RDoor(i, true); OperateL1RDoor(i, true);
} }
void OperateL5Door(int pnum, int i) void OperateL5Door(Player &player, int i)
{ {
int dpx = abs(Objects[i].position.x - Players[pnum].position.tile.x); int dpx = abs(Objects[i].position.x - player.position.tile.x);
int dpy = abs(Objects[i].position.y - Players[pnum].position.tile.y); int dpy = abs(Objects[i].position.y - player.position.tile.y);
if (dpx == 1 && dpy <= 1 && Objects[i]._otype == OBJ_L5LDOOR) if (dpx == 1 && dpy <= 1 && Objects[i]._otype == OBJ_L5LDOOR)
OperateL5LDoor(i, true); OperateL5LDoor(i, true);
if (dpx <= 1 && dpy == 1 && Objects[i]._otype == OBJ_L5RDOOR) if (dpx <= 1 && dpy == 1 && Objects[i]._otype == OBJ_L5RDOOR)
@ -2377,15 +2377,15 @@ void OperateChest(int pnum, int i, bool sendmsg)
NetSendCmdParam2(false, CMD_PLROPOBJ, pnum, i); NetSendCmdParam2(false, CMD_PLROPOBJ, pnum, i);
} }
void OperateMushroomPatch(int pnum, Object &questContainer) void OperateMushroomPatch(Player &player, Object &questContainer)
{ {
if (ActiveItemCount >= MAXITEMS) { if (ActiveItemCount >= MAXITEMS) {
return; return;
} }
if (Quests[Q_MUSHROOM]._qactive != QUEST_ACTIVE) { if (Quests[Q_MUSHROOM]._qactive != QUEST_ACTIVE) {
if (pnum == MyPlayerId) { if (&player == MyPlayer) {
Players[pnum].Say(HeroSpeech::ICantUseThisYet); player.Say(HeroSpeech::ICantUseThisYet);
} }
return; return;
} }
@ -2403,15 +2403,15 @@ void OperateMushroomPatch(int pnum, Object &questContainer)
Quests[Q_MUSHROOM]._qvar1 = QS_MUSHSPAWNED; Quests[Q_MUSHROOM]._qvar1 = QS_MUSHSPAWNED;
} }
void OperateInnSignChest(int pnum, Object &questContainer) void OperateInnSignChest(Player &player, Object &questContainer)
{ {
if (ActiveItemCount >= MAXITEMS) { if (ActiveItemCount >= MAXITEMS) {
return; return;
} }
if (Quests[Q_LTBANNER]._qvar1 != 2) { if (Quests[Q_LTBANNER]._qvar1 != 2) {
if (pnum == MyPlayerId) { if (&player == MyPlayer) {
Players[pnum].Say(HeroSpeech::ICantOpenThisYet); player.Say(HeroSpeech::ICantOpenThisYet);
} }
return; return;
} }
@ -2428,15 +2428,13 @@ void OperateInnSignChest(int pnum, Object &questContainer)
SpawnQuestItem(IDI_BANNER, pos, 0, 0); SpawnQuestItem(IDI_BANNER, pos, 0, 0);
} }
void OperateSlainHero(int pnum, int i) void OperateSlainHero(Player &player, int i)
{ {
if (Objects[i]._oSelFlag == 0) { if (Objects[i]._oSelFlag == 0) {
return; return;
} }
Objects[i]._oSelFlag = 0; Objects[i]._oSelFlag = 0;
Player &player = Players[pnum];
if (player._pClass == HeroClass::Warrior) { if (player._pClass == HeroClass::Warrior) {
CreateMagicArmor(Objects[i].position, ItemType::HeavyArmor, ICURS_BREAST_PLATE, true, false); CreateMagicArmor(Objects[i].position, ItemType::HeavyArmor, ICURS_BREAST_PLATE, true, false);
} else if (player._pClass == HeroClass::Rogue) { } else if (player._pClass == HeroClass::Rogue) {
@ -2451,7 +2449,7 @@ void OperateSlainHero(int pnum, int i)
CreateMagicWeapon(Objects[i].position, ItemType::Axe, ICURS_BATTLE_AXE, true, false); CreateMagicWeapon(Objects[i].position, ItemType::Axe, ICURS_BATTLE_AXE, true, false);
} }
MyPlayer->Say(HeroSpeech::RestInPeaceMyFriend); MyPlayer->Say(HeroSpeech::RestInPeaceMyFriend);
if (pnum == MyPlayerId) if (&player == MyPlayer)
NetSendCmdParam1(false, CMD_OPERATEOBJ, i); NetSendCmdParam1(false, CMD_OPERATEOBJ, i);
} }
@ -2483,7 +2481,7 @@ void OperateTrapLever(Object &flameLever)
} }
} }
void OperateSarc(int pnum, int i, bool sendmsg) void OperateSarc(int i, bool sendMsg, bool sendLootMsg)
{ {
if (Objects[i]._oSelFlag == 0) { if (Objects[i]._oSelFlag == 0) {
return; return;
@ -2495,27 +2493,27 @@ void OperateSarc(int pnum, int i, bool sendmsg)
Objects[i]._oAnimDelay = 3; Objects[i]._oAnimDelay = 3;
SetRndSeed(Objects[i]._oRndSeed); SetRndSeed(Objects[i]._oRndSeed);
if (Objects[i]._oVar1 <= 2) if (Objects[i]._oVar1 <= 2)
CreateRndItem(Objects[i].position, false, sendmsg, false); CreateRndItem(Objects[i].position, false, sendLootMsg, false);
if (Objects[i]._oVar1 >= 8) if (Objects[i]._oVar1 >= 8)
SpawnSkeleton(Objects[i]._oVar2, Objects[i].position); SpawnSkeleton(Objects[i]._oVar2, Objects[i].position);
if (pnum == MyPlayerId) if (sendMsg)
NetSendCmdParam1(false, CMD_OPERATEOBJ, i); NetSendCmdParam1(false, CMD_OPERATEOBJ, i);
} }
void OperateL2Door(int pnum, int i) void OperateL2Door(Player &player, int i)
{ {
int dpx = abs(Objects[i].position.x - Players[pnum].position.tile.x); int dpx = abs(Objects[i].position.x - player.position.tile.x);
int dpy = abs(Objects[i].position.y - Players[pnum].position.tile.y); int dpy = abs(Objects[i].position.y - player.position.tile.y);
if (dpx == 1 && dpy <= 1 && Objects[i]._otype == OBJ_L2LDOOR) if (dpx == 1 && dpy <= 1 && Objects[i]._otype == OBJ_L2LDOOR)
OperateL2LDoor(i, true); OperateL2LDoor(i, true);
if (dpx <= 1 && dpy == 1 && Objects[i]._otype == OBJ_L2RDOOR) if (dpx <= 1 && dpy == 1 && Objects[i]._otype == OBJ_L2RDOOR)
OperateL2RDoor(i, true); OperateL2RDoor(i, true);
} }
void OperateL3Door(int pnum, int i) void OperateL3Door(Player &player, int i)
{ {
int dpx = abs(Objects[i].position.x - Players[pnum].position.tile.x); int dpx = abs(Objects[i].position.x - player.position.tile.x);
int dpy = abs(Objects[i].position.y - Players[pnum].position.tile.y); int dpy = abs(Objects[i].position.y - player.position.tile.y);
if (dpx == 1 && dpy <= 1 && Objects[i]._otype == OBJ_L3RDOOR) if (dpx == 1 && dpy <= 1 && Objects[i]._otype == OBJ_L3RDOOR)
OperateL3RDoor(i, true); OperateL3RDoor(i, true);
if (dpx <= 1 && dpy == 1 && Objects[i]._otype == OBJ_L3LDOOR) if (dpx <= 1 && dpy == 1 && Objects[i]._otype == OBJ_L3LDOOR)
@ -3396,7 +3394,7 @@ void OperateShrine(int pnum, int i, _sfx_id sType)
NetSendCmdParam2(false, CMD_PLROPOBJ, pnum, i); NetSendCmdParam2(false, CMD_PLROPOBJ, pnum, i);
} }
void OperateSkelBook(int pnum, int i, bool sendmsg) void OperateSkelBook(int i, bool sendmsg, bool sendLootMsg)
{ {
if (Objects[i]._oSelFlag == 0) { if (Objects[i]._oSelFlag == 0) {
return; return;
@ -3407,14 +3405,14 @@ void OperateSkelBook(int pnum, int i, bool sendmsg)
Objects[i]._oAnimFrame += 2; Objects[i]._oAnimFrame += 2;
SetRndSeed(Objects[i]._oRndSeed); SetRndSeed(Objects[i]._oRndSeed);
if (GenerateRnd(5) != 0) if (GenerateRnd(5) != 0)
CreateTypeItem(Objects[i].position, false, ItemType::Misc, IMISC_SCROLL, sendmsg, false); CreateTypeItem(Objects[i].position, false, ItemType::Misc, IMISC_SCROLL, sendLootMsg, false);
else else
CreateTypeItem(Objects[i].position, false, ItemType::Misc, IMISC_BOOK, sendmsg, false); CreateTypeItem(Objects[i].position, false, ItemType::Misc, IMISC_BOOK, sendLootMsg, false);
if (pnum == MyPlayerId) if (sendmsg)
NetSendCmdParam1(false, CMD_OPERATEOBJ, i); NetSendCmdParam1(false, CMD_OPERATEOBJ, i);
} }
void OperateBookCase(int pnum, int i, bool sendmsg) void OperateBookCase(int i, bool sendmsg, bool sendLootMsg)
{ {
if (Objects[i]._oSelFlag == 0) { if (Objects[i]._oSelFlag == 0) {
return; return;
@ -3424,7 +3422,7 @@ void OperateBookCase(int pnum, int i, bool sendmsg)
Objects[i]._oSelFlag = 0; Objects[i]._oSelFlag = 0;
Objects[i]._oAnimFrame -= 2; Objects[i]._oAnimFrame -= 2;
SetRndSeed(Objects[i]._oRndSeed); SetRndSeed(Objects[i]._oRndSeed);
CreateTypeItem(Objects[i].position, false, ItemType::Misc, IMISC_BOOK, sendmsg, false); CreateTypeItem(Objects[i].position, false, ItemType::Misc, IMISC_BOOK, sendLootMsg, false);
if (Quests[Q_ZHAR].IsAvailable()) { if (Quests[Q_ZHAR].IsAvailable()) {
auto &zhar = Monsters[MAX_PLRS]; auto &zhar = Monsters[MAX_PLRS];
@ -3438,23 +3436,23 @@ void OperateBookCase(int pnum, int i, bool sendmsg)
zhar._mmode = MonsterMode::Talk; zhar._mmode = MonsterMode::Talk;
} }
} }
if (pnum == MyPlayerId) if (sendmsg)
NetSendCmdParam1(false, CMD_OPERATEOBJ, i); NetSendCmdParam1(false, CMD_OPERATEOBJ, i);
} }
void OperateDecap(int pnum, int i, bool sendmsg) void OperateDecap(int i, bool sendmsg, bool sendLootMsg)
{ {
if (Objects[i]._oSelFlag == 0) { if (Objects[i]._oSelFlag == 0) {
return; return;
} }
Objects[i]._oSelFlag = 0; Objects[i]._oSelFlag = 0;
SetRndSeed(Objects[i]._oRndSeed); SetRndSeed(Objects[i]._oRndSeed);
CreateRndItem(Objects[i].position, false, sendmsg, false); CreateRndItem(Objects[i].position, false, sendLootMsg, false);
if (pnum == MyPlayerId) if (sendmsg)
NetSendCmdParam1(false, CMD_OPERATEOBJ, i); NetSendCmdParam1(false, CMD_OPERATEOBJ, i);
} }
void OperateArmorStand(int pnum, int i, bool sendmsg) void OperateArmorStand(int i, bool sendmsg, bool sendLootMsg)
{ {
if (Objects[i]._oSelFlag == 0) { if (Objects[i]._oSelFlag == 0) {
return; return;
@ -3464,15 +3462,15 @@ void OperateArmorStand(int pnum, int i, bool sendmsg)
SetRndSeed(Objects[i]._oRndSeed); SetRndSeed(Objects[i]._oRndSeed);
bool uniqueRnd = (GenerateRnd(2) != 0); bool uniqueRnd = (GenerateRnd(2) != 0);
if (currlevel <= 5) { if (currlevel <= 5) {
CreateTypeItem(Objects[i].position, true, ItemType::LightArmor, IMISC_NONE, sendmsg, false); CreateTypeItem(Objects[i].position, true, ItemType::LightArmor, IMISC_NONE, sendLootMsg, false);
} else if (currlevel >= 6 && currlevel <= 9) { } else if (currlevel >= 6 && currlevel <= 9) {
CreateTypeItem(Objects[i].position, uniqueRnd, ItemType::MediumArmor, IMISC_NONE, sendmsg, false); CreateTypeItem(Objects[i].position, uniqueRnd, ItemType::MediumArmor, IMISC_NONE, sendLootMsg, false);
} else if (currlevel >= 10 && currlevel <= 12) { } else if (currlevel >= 10 && currlevel <= 12) {
CreateTypeItem(Objects[i].position, false, ItemType::HeavyArmor, IMISC_NONE, sendmsg, false); CreateTypeItem(Objects[i].position, false, ItemType::HeavyArmor, IMISC_NONE, sendLootMsg, false);
} else if (currlevel >= 13) { } else if (currlevel >= 13) {
CreateTypeItem(Objects[i].position, true, ItemType::HeavyArmor, IMISC_NONE, sendmsg, false); CreateTypeItem(Objects[i].position, true, ItemType::HeavyArmor, IMISC_NONE, sendLootMsg, false);
} }
if (pnum == MyPlayerId) if (sendmsg)
NetSendCmdParam1(false, CMD_OPERATEOBJ, i); NetSendCmdParam1(false, CMD_OPERATEOBJ, i);
} }
@ -3610,7 +3608,7 @@ bool OperateFountains(int pnum, int i)
return applied; return applied;
} }
void OperateWeaponRack(int pnum, int i, bool sendmsg) void OperateWeaponRack(int i, bool sendmsg, bool sendLootMsg)
{ {
if (Objects[i]._oSelFlag == 0) if (Objects[i]._oSelFlag == 0)
return; return;
@ -3621,9 +3619,9 @@ void OperateWeaponRack(int pnum, int i, bool sendmsg)
Objects[i]._oSelFlag = 0; Objects[i]._oSelFlag = 0;
Objects[i]._oAnimFrame++; Objects[i]._oAnimFrame++;
CreateTypeItem(Objects[i].position, leveltype != DTYPE_CATHEDRAL, weaponType, IMISC_NONE, sendmsg, false); CreateTypeItem(Objects[i].position, leveltype != DTYPE_CATHEDRAL, weaponType, IMISC_NONE, sendLootMsg, false);
if (pnum == MyPlayerId) if (sendmsg)
NetSendCmdParam1(false, CMD_OPERATEOBJ, i); NetSendCmdParam1(false, CMD_OPERATEOBJ, i);
} }
@ -3660,9 +3658,9 @@ bool OperateNakrulBook(int s)
return false; return false;
} }
void OperateStoryBook(int pnum, int i) void OperateStoryBook(int i)
{ {
if (Objects[i]._oSelFlag == 0 || qtextflag || pnum != MyPlayerId) { if (Objects[i]._oSelFlag == 0 || qtextflag) {
return; return;
} }
Objects[i]._oAnimFrame = Objects[i]._oVar4; Objects[i]._oAnimFrame = Objects[i]._oVar4;
@ -3682,13 +3680,13 @@ void OperateStoryBook(int pnum, int i)
NetSendCmdParam1(false, CMD_OPERATEOBJ, i); NetSendCmdParam1(false, CMD_OPERATEOBJ, i);
} }
void OperateLazStand(int pnum, int i) void OperateLazStand(int i)
{ {
if (ActiveItemCount >= MAXITEMS) { if (ActiveItemCount >= MAXITEMS) {
return; return;
} }
if (Objects[i]._oSelFlag == 0 || qtextflag || pnum != MyPlayerId) { if (Objects[i]._oSelFlag == 0 || qtextflag) {
return; return;
} }
@ -4791,14 +4789,14 @@ void ObjChangeMapResync(int x1, int y1, int x2, int y2)
} }
} }
void TryDisarm(int pnum, int i) void TryDisarm(Player &player, int i)
{ {
if (pnum == MyPlayerId) if (&player == MyPlayer)
NewCursor(CURSOR_HAND); NewCursor(CURSOR_HAND);
if (!Objects[i]._oTrapFlag) { if (!Objects[i]._oTrapFlag) {
return; return;
} }
int trapdisper = 2 * Players[pnum]._pDexterity - 5 * currlevel; int trapdisper = 2 * player._pDexterity - 5 * currlevel;
if (GenerateRnd(100) > trapdisper) { if (GenerateRnd(100) > trapdisper) {
return; return;
} }
@ -4827,6 +4825,7 @@ int ItemMiscIdIdx(item_misc_id imiscid)
void OperateObject(int pnum, int i, bool teleFlag) void OperateObject(int pnum, int i, bool teleFlag)
{ {
bool sendmsg = pnum == MyPlayerId; bool sendmsg = pnum == MyPlayerId;
Player &player = Players[pnum];
switch (Objects[i]._otype) { switch (Objects[i]._otype) {
case OBJ_L1LDOOR: case OBJ_L1LDOOR:
case OBJ_L1RDOOR: case OBJ_L1RDOOR:
@ -4838,7 +4837,7 @@ void OperateObject(int pnum, int i, bool teleFlag)
break; break;
} }
if (sendmsg) if (sendmsg)
OperateL1Door(pnum, i); OperateL1Door(player, i);
break; break;
case OBJ_L2LDOOR: case OBJ_L2LDOOR:
case OBJ_L2RDOOR: case OBJ_L2RDOOR:
@ -4850,7 +4849,7 @@ void OperateObject(int pnum, int i, bool teleFlag)
break; break;
} }
if (sendmsg) if (sendmsg)
OperateL2Door(pnum, i); OperateL2Door(player, i);
break; break;
case OBJ_L3LDOOR: case OBJ_L3LDOOR:
case OBJ_L3RDOOR: case OBJ_L3RDOOR:
@ -4862,7 +4861,7 @@ void OperateObject(int pnum, int i, bool teleFlag)
break; break;
} }
if (sendmsg) if (sendmsg)
OperateL3Door(pnum, i); OperateL3Door(player, i);
break; break;
case OBJ_L5LDOOR: case OBJ_L5LDOOR:
case OBJ_L5RDOOR: case OBJ_L5RDOOR:
@ -4874,7 +4873,7 @@ void OperateObject(int pnum, int i, bool teleFlag)
break; break;
} }
if (sendmsg) if (sendmsg)
OperateL5Door(pnum, i); OperateL5Door(player, i);
break; break;
case OBJ_LEVER: case OBJ_LEVER:
case OBJ_L5LEVER: case OBJ_L5LEVER:
@ -4897,7 +4896,7 @@ void OperateObject(int pnum, int i, bool teleFlag)
break; break;
case OBJ_SARC: case OBJ_SARC:
case OBJ_L5SARC: case OBJ_L5SARC:
OperateSarc(pnum, i, sendmsg); OperateSarc(i, sendmsg, sendmsg);
break; break;
case OBJ_FLAMELVR: case OBJ_FLAMELVR:
OperateTrapLever(Objects[i]); OperateTrapLever(Objects[i]);
@ -4913,18 +4912,18 @@ void OperateObject(int pnum, int i, bool teleFlag)
break; break;
case OBJ_SKELBOOK: case OBJ_SKELBOOK:
case OBJ_BOOKSTAND: case OBJ_BOOKSTAND:
OperateSkelBook(pnum, i, sendmsg); OperateSkelBook(i, sendmsg, sendmsg);
break; break;
case OBJ_BOOKCASEL: case OBJ_BOOKCASEL:
case OBJ_BOOKCASER: case OBJ_BOOKCASER:
OperateBookCase(pnum, i, sendmsg); OperateBookCase(i, sendmsg, sendmsg);
break; break;
case OBJ_DECAP: case OBJ_DECAP:
OperateDecap(pnum, i, sendmsg); OperateDecap(i, sendmsg, sendmsg);
break; break;
case OBJ_ARMORSTAND: case OBJ_ARMORSTAND:
case OBJ_WARARMOR: case OBJ_WARARMOR:
OperateArmorStand(pnum, i, sendmsg); OperateArmorStand(i, sendmsg, sendmsg);
break; break;
case OBJ_GOATSHRINE: case OBJ_GOATSHRINE:
OperateGoatShrine(pnum, i, LS_GSHRINE); OperateGoatShrine(pnum, i, LS_GSHRINE);
@ -4940,26 +4939,28 @@ void OperateObject(int pnum, int i, bool teleFlag)
break; break;
case OBJ_STORYBOOK: case OBJ_STORYBOOK:
case OBJ_L5BOOKS: case OBJ_L5BOOKS:
OperateStoryBook(pnum, i); if (sendmsg)
OperateStoryBook(i);
break; break;
case OBJ_PEDISTAL: case OBJ_PEDISTAL:
OperatePedistal(pnum, i); OperatePedistal(pnum, i);
break; break;
case OBJ_WARWEAP: case OBJ_WARWEAP:
case OBJ_WEAPONRACK: case OBJ_WEAPONRACK:
OperateWeaponRack(pnum, i, sendmsg); OperateWeaponRack(i, sendmsg, sendmsg);
break; break;
case OBJ_MUSHPATCH: case OBJ_MUSHPATCH:
OperateMushroomPatch(pnum, Objects[i]); OperateMushroomPatch(player, Objects[i]);
break; break;
case OBJ_LAZSTAND: case OBJ_LAZSTAND:
OperateLazStand(pnum, i); if (sendmsg)
OperateLazStand(i);
break; break;
case OBJ_SLAINHERO: case OBJ_SLAINHERO:
OperateSlainHero(pnum, i); OperateSlainHero(player, i);
break; break;
case OBJ_SIGNCHEST: case OBJ_SIGNCHEST:
OperateInnSignChest(pnum, Objects[i]); OperateInnSignChest(player, Objects[i]);
break; break;
default: default:
break; break;
@ -5048,6 +5049,7 @@ void DeltaSyncOpObject(int cmd, int i)
void SyncOpObject(int pnum, int cmd, int i) void SyncOpObject(int pnum, int cmd, int i)
{ {
bool sendmsg = pnum == MyPlayerId;
switch (Objects[i]._otype) { switch (Objects[i]._otype) {
case OBJ_L1LDOOR: case OBJ_L1LDOOR:
case OBJ_L1RDOOR: case OBJ_L1RDOOR:
@ -5072,7 +5074,7 @@ void SyncOpObject(int pnum, int cmd, int i)
case OBJ_LEVER: case OBJ_LEVER:
case OBJ_L5LEVER: case OBJ_L5LEVER:
case OBJ_SWITCHSKL: case OBJ_SWITCHSKL:
OperateLever(i, pnum == MyPlayerId); OperateLever(i, sendmsg);
break; break;
case OBJ_CHEST1: case OBJ_CHEST1:
case OBJ_CHEST2: case OBJ_CHEST2:
@ -5084,12 +5086,12 @@ void SyncOpObject(int pnum, int cmd, int i)
break; break;
case OBJ_SARC: case OBJ_SARC:
case OBJ_L5SARC: case OBJ_L5SARC:
OperateSarc(pnum, i, false); OperateSarc(i, sendmsg, false);
break; break;
case OBJ_BLINDBOOK: case OBJ_BLINDBOOK:
case OBJ_BLOODBOOK: case OBJ_BLOODBOOK:
case OBJ_STEELTOME: case OBJ_STEELTOME:
OperateBookLever(i, pnum == MyPlayerId); OperateBookLever(i, sendmsg);
break; break;
case OBJ_SHRINEL: case OBJ_SHRINEL:
case OBJ_SHRINER: case OBJ_SHRINER:
@ -5097,18 +5099,18 @@ void SyncOpObject(int pnum, int cmd, int i)
break; break;
case OBJ_SKELBOOK: case OBJ_SKELBOOK:
case OBJ_BOOKSTAND: case OBJ_BOOKSTAND:
OperateSkelBook(pnum, i, false); OperateSkelBook(i, sendmsg, false);
break; break;
case OBJ_BOOKCASEL: case OBJ_BOOKCASEL:
case OBJ_BOOKCASER: case OBJ_BOOKCASER:
OperateBookCase(pnum, i, false); OperateBookCase(i, sendmsg, false);
break; break;
case OBJ_DECAP: case OBJ_DECAP:
OperateDecap(pnum, i, false); OperateDecap(i, sendmsg, false);
break; break;
case OBJ_ARMORSTAND: case OBJ_ARMORSTAND:
case OBJ_WARARMOR: case OBJ_WARARMOR:
OperateArmorStand(pnum, i, false); OperateArmorStand(i, sendmsg, false);
break; break;
case OBJ_GOATSHRINE: case OBJ_GOATSHRINE:
OperateGoatShrine(pnum, i, LS_GSHRINE); OperateGoatShrine(pnum, i, LS_GSHRINE);
@ -5122,23 +5124,24 @@ void SyncOpObject(int pnum, int cmd, int i)
break; break;
case OBJ_STORYBOOK: case OBJ_STORYBOOK:
case OBJ_L5BOOKS: case OBJ_L5BOOKS:
OperateStoryBook(pnum, i); if (sendmsg)
OperateStoryBook(i);
break; break;
case OBJ_PEDISTAL: case OBJ_PEDISTAL:
OperatePedistal(pnum, i); OperatePedistal(pnum, i);
break; break;
case OBJ_WARWEAP: case OBJ_WARWEAP:
case OBJ_WEAPONRACK: case OBJ_WEAPONRACK:
OperateWeaponRack(pnum, i, false); OperateWeaponRack(i, sendmsg, false);
break; break;
case OBJ_MUSHPATCH: case OBJ_MUSHPATCH:
OperateMushroomPatch(pnum, Objects[i]); OperateMushroomPatch(Players[pnum], Objects[i]);
break; break;
case OBJ_SLAINHERO: case OBJ_SLAINHERO:
OperateSlainHero(pnum, i); OperateSlainHero(pnum, i);
break; break;
case OBJ_SIGNCHEST: case OBJ_SIGNCHEST:
OperateInnSignChest(pnum, Objects[i]); OperateInnSignChest(Players[pnum], Objects[i]);
break; break;
default: default:
break; break;

2
Source/objects.h

@ -304,7 +304,7 @@ void RedoPlayerVision();
void MonstCheckDoors(Monster &monster); void MonstCheckDoors(Monster &monster);
void ObjChangeMap(int x1, int y1, int x2, int y2); void ObjChangeMap(int x1, int y1, int x2, int y2);
void ObjChangeMapResync(int x1, int y1, int x2, int y2); void ObjChangeMapResync(int x1, int y1, int x2, int y2);
void TryDisarm(int pnum, int i); void TryDisarm(Player &player, int i);
int ItemMiscIdIdx(item_misc_id imiscid); int ItemMiscIdIdx(item_misc_id imiscid);
void OperateObject(int pnum, int i, bool TeleFlag); void OperateObject(int pnum, int i, bool TeleFlag);
void SyncOpObject(int pnum, int cmd, int i); void SyncOpObject(int pnum, int cmd, int i);

2
Source/player.cpp

@ -1626,7 +1626,7 @@ void CheckNewPath(int pnum, bool pmWillBeCalled)
d = GetDirection(player.position.tile, object->position); d = GetDirection(player.position.tile, object->position);
StartAttack(pnum, d); StartAttack(pnum, d);
} else { } else {
TryDisarm(pnum, targetId); TryDisarm(player, targetId);
OperateObject(pnum, targetId, false); OperateObject(pnum, targetId, false);
} }
} }

Loading…
Cancel
Save