diff --git a/Source/inv.cpp b/Source/inv.cpp index a3769ed1a..c5edb58eb 100644 --- a/Source/inv.cpp +++ b/Source/inv.cpp @@ -2090,7 +2090,7 @@ void DoTelekinesis() if (pcursobj != -1) NetSendCmdParam1(true, CMD_OPOBJT, pcursobj); if (pcursitem != -1) - NetSendCmdGItem(true, CMD_REQUESTAGITEM, MyPlayerId, MyPlayerId, pcursitem); + NetSendCmdGItem(true, CMD_REQUESTAGITEM, MyPlayerId, pcursitem); if (pcursmonst != -1) { auto &monter = Monsters[pcursmonst]; if (!M_Talker(monter) && monter.talkMsg == TEXT_NONE) diff --git a/Source/msg.cpp b/Source/msg.cpp index d24de5bf1..ac04ca4ff 100644 --- a/Source/msg.cpp +++ b/Source/msg.cpp @@ -1465,7 +1465,7 @@ size_t OnResurrect(const TCmd *pCmd, int pnum) if (gbBufferMsgs == 1) { SendPacket(pnum, &message, sizeof(message)); } else if (message.wParam1 < MAX_PLRS) { - DoResurrect(pnum, message.wParam1); + DoResurrect(pnum, Players[message.wParam1]); if (pnum == MyPlayerId) pfile_update(true); } @@ -1667,7 +1667,7 @@ size_t OnOpenDoor(const TCmd *pCmd, int pnum) } else if (message.wParam1 < MAXOBJECTS) { Player &player = Players[pnum]; if (player.isOnActiveLevel()) - SyncOpObject(pnum, CMD_OPENDOOR, message.wParam1); + SyncOpObject(player, CMD_OPENDOOR, message.wParam1); DeltaSyncObject(message.wParam1, CMD_OPENDOOR, player); } @@ -1683,7 +1683,7 @@ size_t OnCloseDoor(const TCmd *pCmd, int pnum) } else if (message.wParam1 < MAXOBJECTS) { Player &player = Players[pnum]; if (player.isOnActiveLevel()) - SyncOpObject(pnum, CMD_CLOSEDOOR, message.wParam1); + SyncOpObject(player, CMD_CLOSEDOOR, message.wParam1); DeltaSyncObject(message.wParam1, CMD_CLOSEDOOR, player); } @@ -1699,7 +1699,7 @@ size_t OnOperateObject(const TCmd *pCmd, int pnum) } else if (message.wParam1 < MAXOBJECTS) { Player &player = Players[pnum]; if (player.isOnActiveLevel()) - SyncOpObject(pnum, CMD_OPERATEOBJ, message.wParam1); + SyncOpObject(player, CMD_OPERATEOBJ, message.wParam1); DeltaSyncObject(message.wParam1, CMD_OPERATEOBJ, player); } @@ -1708,15 +1708,15 @@ size_t OnOperateObject(const TCmd *pCmd, int pnum) size_t OnPlayerOperateObject(const TCmd *pCmd, int pnum) { - const auto &message = *reinterpret_cast(pCmd); + const auto &message = *reinterpret_cast(pCmd); if (gbBufferMsgs == 1) { SendPacket(pnum, &message, sizeof(message)); - } else if (message.wParam1 < MAX_PLRS && message.wParam2 < MAXOBJECTS) { + } else if (message.wParam1 < MAXOBJECTS) { Player &player = Players[pnum]; if (player.isOnActiveLevel()) - SyncOpObject(message.wParam1, CMD_PLROPOBJ, message.wParam2); - DeltaSyncObject(message.wParam2, CMD_PLROPOBJ, player); + SyncOpObject(player, CMD_PLROPOBJ, message.wParam1); + DeltaSyncObject(message.wParam1, CMD_PLROPOBJ, player); } return sizeof(message); @@ -2791,13 +2791,13 @@ void NetSendCmdQuest(bool bHiPri, const Quest &quest) NetSendLoPri(MyPlayerId, (byte *)&cmd, sizeof(cmd)); } -void NetSendCmdGItem(bool bHiPri, _cmd_id bCmd, uint8_t mast, uint8_t pnum, uint8_t ii) +void NetSendCmdGItem(bool bHiPri, _cmd_id bCmd, uint8_t pnum, uint8_t ii) { TCmdGItem cmd; cmd.bCmd = bCmd; cmd.bPnum = pnum; - cmd.bMaster = mast; + cmd.bMaster = pnum; cmd.bLevel = GetLevelForMultiplayer(*MyPlayer); cmd.bCursitem = ii; cmd.dwTime = 0; diff --git a/Source/msg.h b/Source/msg.h index 3c2520cc2..f9abd2fe2 100644 --- a/Source/msg.h +++ b/Source/msg.h @@ -744,7 +744,7 @@ void NetSendCmdParam2(bool bHiPri, _cmd_id bCmd, uint16_t wParam1, uint16_t wPar void NetSendCmdParam3(bool bHiPri, _cmd_id bCmd, uint16_t wParam1, uint16_t wParam2, uint16_t wParam3); void NetSendCmdParam4(bool bHiPri, _cmd_id bCmd, uint16_t wParam1, uint16_t wParam2, uint16_t wParam3, uint16_t wParam4); void NetSendCmdQuest(bool bHiPri, const Quest &quest); -void NetSendCmdGItem(bool bHiPri, _cmd_id bCmd, uint8_t mast, uint8_t pnum, uint8_t ii); +void NetSendCmdGItem(bool bHiPri, _cmd_id bCmd, uint8_t pnum, uint8_t ii); void NetSendCmdPItem(bool bHiPri, _cmd_id bCmd, Point position, const Item &item); void NetSendCmdChItem(bool bHiPri, uint8_t bLoc); void NetSendCmdDelItem(bool bHiPri, uint8_t bLoc); diff --git a/Source/objects.cpp b/Source/objects.cpp index 6fc55865e..cde27e3df 100644 --- a/Source/objects.cpp +++ b/Source/objects.cpp @@ -2179,15 +2179,20 @@ void OperateLever(int i, bool sendmsg) NetSendCmdParam1(false, CMD_OPERATEOBJ, i); } -void OperateBook(int pnum, Object &book) +void OperateBook(Player &player, Object &book) { if (book._oSelFlag == 0) { return; } - Player &player = Players[pnum]; + book._oSelFlag = 0; + book._oAnimFrame++; - if (setlevel && setlvlnum == SL_VILEBETRAYER) { + if (!setlevel) { + return; + } + + if (setlvlnum == SL_VILEBETRAYER) { bool missileAdded = false; for (int j = 0; j < ActiveObjectCount; j++) { Object &questObject = Objects[ActiveObjects[j]]; @@ -2207,7 +2212,7 @@ void OperateBook(int pnum, Object &book) if (doAddMissile) { questObject._oVar6 = 4; ObjectAtPosition({ 35, 36 })->_oVar5++; - AddMissile(player.position.tile, target, Direction::South, MIS_RNDTELEPORT, TARGET_BOTH, pnum, 0, 0); + AddMissile(player.position.tile, target, Direction::South, MIS_RNDTELEPORT, TARGET_BOTH, player.getId(), 0, 0); missileAdded = true; } } @@ -2216,13 +2221,6 @@ void OperateBook(int pnum, Object &book) } } - book._oSelFlag = 0; - book._oAnimFrame++; - - if (!setlevel) { - return; - } - if (setlvlnum == SL_BONECHAMB) { player._pMemSpells |= GetSpellBitmask(SPL_GUARDIAN); if (player._pSplLvl[SPL_GUARDIAN] < MaxSpellLevel) @@ -2236,7 +2234,7 @@ void OperateBook(int pnum, Object &book) player._pdir, MIS_GUARDIAN, TARGET_MONSTERS, - pnum, + player.getId(), 0, 0); } @@ -2334,7 +2332,7 @@ void OperateChamberOfBoneBook(Object &questBook) InitQTextMsg(textdef); } -void OperateChest(int pnum, int i, bool sendmsg) +void OperateChest(const Player &player, int i, bool sendmsg) { if (Objects[i]._oSelFlag == 0) { return; @@ -2356,7 +2354,6 @@ void OperateChest(int pnum, int i, bool sendmsg) CreateRndUseful(Objects[i].position, sendmsg); } } - const Player &player = Players[pnum]; if (Objects[i].IsTrappedChest()) { Direction mdir = GetDirection(Objects[i].position, player.position.tile); missile_id mtype; @@ -2386,10 +2383,10 @@ void OperateChest(int pnum, int i, bool sendmsg) Objects[i]._oTrapFlag = false; } if (&player == MyPlayer) - NetSendCmdParam2(false, CMD_PLROPOBJ, pnum, i); + NetSendCmdParam1(false, CMD_PLROPOBJ, i); } -void OperateMushroomPatch(const Player &player, Object &questContainer) +void OperateMushroomPatch(const Player &player, Object &mushroomPatch) { if (ActiveItemCount >= MAXITEMS) { return; @@ -2402,15 +2399,15 @@ void OperateMushroomPatch(const Player &player, Object &questContainer) return; } - if (questContainer._oSelFlag == 0) { + if (mushroomPatch._oSelFlag == 0) { return; } - questContainer._oSelFlag = 0; - questContainer._oAnimFrame++; + mushroomPatch._oSelFlag = 0; + mushroomPatch._oAnimFrame++; - PlaySfxLoc(IS_CHEST, questContainer.position); - Point pos = GetSuperItemLoc(questContainer.position); + PlaySfxLoc(IS_CHEST, mushroomPatch.position); + Point pos = GetSuperItemLoc(mushroomPatch.position); SpawnQuestItem(IDI_MUSHROOM, pos, 0, 0); Quests[Q_MUSHROOM]._qvar1 = QS_MUSHSPAWNED; } @@ -2532,13 +2529,13 @@ void OperateL3Door(const Player &player, int i) OperateL3LDoor(i, true); } -void OperatePedistal(int pnum, int i) +void OperatePedistal(Player &player, int i) { if (ActiveItemCount >= MAXITEMS) { return; } - if (Objects[i]._oVar6 == 3 || !RemoveInventoryItemById(Players[pnum], IDI_BLDSTONE)) { + if (Objects[i]._oVar6 == 3 || !RemoveInventoryItemById(player, IDI_BLDSTONE)) { return; } @@ -2705,17 +2702,15 @@ void OperateShrineWeird(Player &player) InitDiabloMsg(EMSG_SHRINE_WEIRD); } -void OperateShrineMagical(int pnum) +void OperateShrineMagical(const Player &player) { - const Player &player = Players[pnum]; - AddMissile( player.position.tile, player.position.tile, player._pdir, MIS_MANASHIELD, TARGET_MONSTERS, - pnum, + player.getId(), 0, 2 * leveltype); @@ -2839,17 +2834,15 @@ void OperateShrineCostOfWisdom(Player &player, spell_id spellId, diablo_message InitDiabloMsg(message); } -void OperateShrineCryptic(int pnum) +void OperateShrineCryptic(Player &player) { - Player &player = Players[pnum]; - AddMissile( player.position.tile, player.position.tile, player._pdir, MIS_NOVA, TARGET_MONSTERS, - pnum, + player.getId(), 0, 2 * leveltype); @@ -2932,11 +2925,9 @@ void OperateShrineDivine(Player &player, Point spawnPosition) InitDiabloMsg(EMSG_SHRINE_DIVINE); } -void OperateShrineHoly(int pnum) +void OperateShrineHoly(const Player &player) { - const Player &player = Players[pnum]; - - AddMissile(player.position.tile, { 0, 0 }, Direction::South, MIS_RNDTELEPORT, TARGET_MONSTERS, pnum, 0, 2 * leveltype); + AddMissile(player.position.tile, { 0, 0 }, Direction::South, MIS_RNDTELEPORT, TARGET_MONSTERS, player.getId(), 0, 2 * leveltype); if (&player != MyPlayer) return; @@ -3195,10 +3186,8 @@ void OperateShrineSparkling(Player &player, Point spawnPosition) * @param pnum The player that activated the shrine * @param spawnPosition The position of the shrine, the portal will be placed on the side closest to the player */ -void OperateShrineTown(int pnum, Point spawnPosition) +void OperateShrineTown(const Player &player, Point spawnPosition) { - const Player &player = Players[pnum]; - if (&player != MyPlayer) return; @@ -3208,7 +3197,7 @@ void OperateShrineTown(int pnum, Point spawnPosition) player._pdir, MIS_TOWN, TARGET_MONSTERS, - pnum, + player.getId(), 0, 0); @@ -3279,11 +3268,8 @@ void OperateShrineMurphys(Player &player) InitDiabloMsg(EMSG_SHRINE_MURPHYS); } -void OperateShrine(int pnum, int i, _sfx_id sType) +void OperateShrine(Player &player, Object &shrine, _sfx_id sType) { - assert(i >= 0 && i < MAXOBJECTS); - Object &shrine = Objects[i]; - if (shrine._oSelFlag == 0) return; @@ -3299,8 +3285,6 @@ void OperateShrine(int pnum, int i, _sfx_id sType) shrine._oAnimFlag = true; shrine._oAnimDelay = 1; - Player &player = Players[pnum]; - switch (shrine._oVar1) { case ShrineMysterious: OperateShrineMysterious(player); @@ -3316,7 +3300,7 @@ void OperateShrine(int pnum, int i, _sfx_id sType) break; case ShrineMagical: case ShrineMagicaL2: - OperateShrineMagical(pnum); + OperateShrineMagical(player); break; case ShrineStone: OperateShrineStone(player); @@ -3334,7 +3318,7 @@ void OperateShrine(int pnum, int i, _sfx_id sType) OperateShrineCostOfWisdom(player, SPL_FIREBOLT, EMSG_SHRINE_FASCINATING); break; case ShrineCryptic: - OperateShrineCryptic(pnum); + OperateShrineCryptic(player); break; case ShrineEldritch: OperateShrineEldritch(player); @@ -3346,7 +3330,7 @@ void OperateShrine(int pnum, int i, _sfx_id sType) OperateShrineDivine(player, shrine.position); break; case ShrineHoly: - OperateShrineHoly(pnum); + OperateShrineHoly(player); break; case ShrineSacred: OperateShrineCostOfWisdom(player, SPL_CBOLT, EMSG_SHRINE_SACRED); @@ -3391,7 +3375,7 @@ void OperateShrine(int pnum, int i, _sfx_id sType) OperateShrineSparkling(player, shrine.position); break; case ShrineTown: - OperateShrineTown(pnum, shrine.position); + OperateShrineTown(player, shrine.position); break; case ShrineShimmering: OperateShrineShimmering(player); @@ -3405,7 +3389,7 @@ void OperateShrine(int pnum, int i, _sfx_id sType) } if (&player == MyPlayer) - NetSendCmdParam2(false, CMD_PLROPOBJ, pnum, i); + NetSendCmdParam1(false, CMD_PLROPOBJ, shrine.GetId()); } void OperateSkelBook(int i, bool sendmsg, bool sendLootMsg) @@ -3502,28 +3486,27 @@ int FindValidShrine() } } -void OperateGoatShrine(int pnum, int i, _sfx_id sType) +void OperateGoatShrine(Player &player, Object &object, _sfx_id sType) { - SetRndSeed(Objects[i]._oRndSeed); - Objects[i]._oVar1 = FindValidShrine(); - OperateShrine(pnum, i, sType); - Objects[i]._oAnimDelay = 2; + SetRndSeed(object._oRndSeed); + object._oVar1 = FindValidShrine(); + OperateShrine(player, object, sType); + object._oAnimDelay = 2; force_redraw = 255; } -void OperateCauldron(int pnum, int i, _sfx_id sType) +void OperateCauldron(Player &player, Object &object, _sfx_id sType) { - SetRndSeed(Objects[i]._oRndSeed); - Objects[i]._oVar1 = FindValidShrine(); - OperateShrine(pnum, i, sType); - Objects[i]._oAnimFrame = 3; - Objects[i]._oAnimFlag = false; + SetRndSeed(object._oRndSeed); + object._oVar1 = FindValidShrine(); + OperateShrine(player, object, sType); + object._oAnimFrame = 3; + object._oAnimFlag = false; force_redraw = 255; } -bool OperateFountains(int pnum, int i) +bool OperateFountains(Player &player, int i) { - Player &player = Players[pnum]; bool applied = false; switch (Objects[i]._otype) { case OBJ_BLOODFTN: @@ -3571,7 +3554,7 @@ bool OperateFountains(int pnum, int i) player._pdir, MIS_INFRA, TARGET_MONSTERS, - pnum, + player.getId(), 0, 2 * leveltype); applied = true; @@ -4816,17 +4799,18 @@ int ItemMiscIdIdx(item_misc_id imiscid) return i; } -void OperateObject(int pnum, int i, bool teleFlag) +void OperateObject(Player &player, int i, bool teleFlag) { - const Player &player = Players[pnum]; + Object &object = Objects[i]; bool sendmsg = &player == MyPlayer; - switch (Objects[i]._otype) { + + switch (object._otype) { case OBJ_L1LDOOR: case OBJ_L1RDOOR: if (teleFlag) { - if (Objects[i]._otype == OBJ_L1LDOOR) + if (object._otype == OBJ_L1LDOOR) OperateL1LDoor(i, sendmsg); - if (Objects[i]._otype == OBJ_L1RDOOR) + if (object._otype == OBJ_L1RDOOR) OperateL1RDoor(i, sendmsg); break; } @@ -4836,9 +4820,9 @@ void OperateObject(int pnum, int i, bool teleFlag) case OBJ_L2LDOOR: case OBJ_L2RDOOR: if (teleFlag) { - if (Objects[i]._otype == OBJ_L2LDOOR) + if (object._otype == OBJ_L2LDOOR) OperateL2LDoor(i, sendmsg); - if (Objects[i]._otype == OBJ_L2RDOOR) + if (object._otype == OBJ_L2RDOOR) OperateL2RDoor(i, sendmsg); break; } @@ -4848,9 +4832,9 @@ void OperateObject(int pnum, int i, bool teleFlag) case OBJ_L3LDOOR: case OBJ_L3RDOOR: if (teleFlag) { - if (Objects[i]._otype == OBJ_L3LDOOR) + if (object._otype == OBJ_L3LDOOR) OperateL3LDoor(i, sendmsg); - if (Objects[i]._otype == OBJ_L3RDOOR) + if (object._otype == OBJ_L3RDOOR) OperateL3RDoor(i, sendmsg); break; } @@ -4860,9 +4844,9 @@ void OperateObject(int pnum, int i, bool teleFlag) case OBJ_L5LDOOR: case OBJ_L5RDOOR: if (teleFlag) { - if (Objects[i]._otype == OBJ_L5LDOOR) + if (object._otype == OBJ_L5LDOOR) OperateL5LDoor(i, sendmsg); - if (Objects[i]._otype == OBJ_L5RDOOR) + if (object._otype == OBJ_L5RDOOR) OperateL5RDoor(i, sendmsg); break; } @@ -4875,10 +4859,10 @@ void OperateObject(int pnum, int i, bool teleFlag) OperateLever(i, sendmsg); break; case OBJ_BOOK2L: - OperateBook(pnum, Objects[i]); + OperateBook(player, object); break; case OBJ_BOOK2R: - OperateChamberOfBoneBook(Objects[i]); + OperateChamberOfBoneBook(object); break; case OBJ_CHEST1: case OBJ_CHEST2: @@ -4886,14 +4870,14 @@ void OperateObject(int pnum, int i, bool teleFlag) case OBJ_TCHEST1: case OBJ_TCHEST2: case OBJ_TCHEST3: - OperateChest(pnum, i, sendmsg); + OperateChest(player, i, sendmsg); break; case OBJ_SARC: case OBJ_L5SARC: OperateSarc(i, sendmsg, sendmsg); break; case OBJ_FLAMELVR: - OperateTrapLever(Objects[i]); + OperateTrapLever(object); break; case OBJ_BLINDBOOK: case OBJ_BLOODBOOK: @@ -4902,7 +4886,7 @@ void OperateObject(int pnum, int i, bool teleFlag) break; case OBJ_SHRINEL: case OBJ_SHRINER: - OperateShrine(pnum, i, IS_MAGIC); + OperateShrine(player, object, IS_MAGIC); break; case OBJ_SKELBOOK: case OBJ_BOOKSTAND: @@ -4920,16 +4904,16 @@ void OperateObject(int pnum, int i, bool teleFlag) OperateArmorStand(i, sendmsg, sendmsg); break; case OBJ_GOATSHRINE: - OperateGoatShrine(pnum, i, LS_GSHRINE); + OperateGoatShrine(player, object, LS_GSHRINE); break; case OBJ_CAULDRON: - OperateCauldron(pnum, i, LS_CALDRON); + OperateCauldron(player, object, LS_CALDRON); break; case OBJ_BLOODFTN: case OBJ_PURIFYINGFTN: case OBJ_MURKYFTN: case OBJ_TEARFTN: - OperateFountains(pnum, i); + OperateFountains(player, i); break; case OBJ_STORYBOOK: case OBJ_L5BOOKS: @@ -4937,14 +4921,14 @@ void OperateObject(int pnum, int i, bool teleFlag) OperateStoryBook(i); break; case OBJ_PEDISTAL: - OperatePedistal(pnum, i); + OperatePedistal(player, i); break; case OBJ_WARWEAP: case OBJ_WEAPONRACK: OperateWeaponRack(i, sendmsg, sendmsg); break; case OBJ_MUSHPATCH: - OperateMushroomPatch(player, Objects[i]); + OperateMushroomPatch(player, object); break; case OBJ_LAZSTAND: if (sendmsg) @@ -4954,7 +4938,7 @@ void OperateObject(int pnum, int i, bool teleFlag) OperateSlainHero(player, i); break; case OBJ_SIGNCHEST: - OperateInnSignChest(player, Objects[i]); + OperateInnSignChest(player, object); break; default: break; @@ -5041,12 +5025,12 @@ void DeltaSyncOpObject(int cmd, int i) } } -void SyncOpObject(int pnum, int cmd, int i) +void SyncOpObject(Player &player, int cmd, int i) { - const Player &player = Players[pnum]; + Object &object = Objects[i]; bool sendmsg = &player == MyPlayer; - switch (Objects[i]._otype) { + switch (object._otype) { case OBJ_L1LDOOR: case OBJ_L1RDOOR: if (!sendmsg) @@ -5078,7 +5062,7 @@ void SyncOpObject(int pnum, int cmd, int i) case OBJ_TCHEST1: case OBJ_TCHEST2: case OBJ_TCHEST3: - OperateChest(pnum, i, false); + OperateChest(player, i, false); break; case OBJ_SARC: case OBJ_L5SARC: @@ -5091,7 +5075,7 @@ void SyncOpObject(int pnum, int cmd, int i) break; case OBJ_SHRINEL: case OBJ_SHRINER: - OperateShrine(pnum, i, IS_MAGIC); + OperateShrine(player, object, IS_MAGIC); break; case OBJ_SKELBOOK: case OBJ_BOOKSTAND: @@ -5109,14 +5093,14 @@ void SyncOpObject(int pnum, int cmd, int i) OperateArmorStand(i, sendmsg, false); break; case OBJ_GOATSHRINE: - OperateGoatShrine(pnum, i, LS_GSHRINE); + OperateGoatShrine(player, object, LS_GSHRINE); break; case OBJ_CAULDRON: - OperateCauldron(pnum, i, LS_CALDRON); + OperateCauldron(player, object, LS_CALDRON); break; case OBJ_MURKYFTN: case OBJ_TEARFTN: - OperateFountains(pnum, i); + OperateFountains(player, i); break; case OBJ_STORYBOOK: case OBJ_L5BOOKS: @@ -5124,20 +5108,20 @@ void SyncOpObject(int pnum, int cmd, int i) OperateStoryBook(i); break; case OBJ_PEDISTAL: - OperatePedistal(pnum, i); + OperatePedistal(player, i); break; case OBJ_WARWEAP: case OBJ_WEAPONRACK: OperateWeaponRack(i, sendmsg, false); break; case OBJ_MUSHPATCH: - OperateMushroomPatch(player, Objects[i]); + OperateMushroomPatch(player, object); break; case OBJ_SLAINHERO: OperateSlainHero(player, i); break; case OBJ_SIGNCHEST: - OperateInnSignChest(player, Objects[i]); + OperateInnSignChest(player, object); break; default: break; diff --git a/Source/objects.h b/Source/objects.h index 9921984f9..4a5145908 100644 --- a/Source/objects.h +++ b/Source/objects.h @@ -305,8 +305,8 @@ void MonstCheckDoors(Monster &monster); void ObjChangeMap(int x1, int y1, int x2, int y2); void ObjChangeMapResync(int x1, int y1, int x2, int y2); int ItemMiscIdIdx(item_misc_id imiscid); -void OperateObject(int pnum, int i, bool TeleFlag); -void SyncOpObject(int pnum, int cmd, int i); +void OperateObject(Player &player, int i, bool TeleFlag); +void SyncOpObject(Player &player, int cmd, int i); void BreakObjectMissile(Object &object); void BreakObject(const Player &player, Object &object); void DeltaSyncOpObject(int cmd, int i); diff --git a/Source/player.cpp b/Source/player.cpp index 2cff03367..161f0c17d 100644 --- a/Source/player.cpp +++ b/Source/player.cpp @@ -170,7 +170,7 @@ struct DirectionSettings { DisplacementOf map; ScrollDirection scrollDir; PLR_MODE walkMode; - void (*walkModeHandler)(int, const DirectionSettings &); + void (*walkModeHandler)(Player &, const DirectionSettings &); }; /** Specifies the frame of each animation for which an action is triggered, for each player class. */ @@ -222,33 +222,31 @@ void PmChangeLightOff(Player &player) ChangeLightOffset(player._plid, { x, y }); } -void WalkNorthwards(int pnum, const DirectionSettings &walkParams) +void WalkNorthwards(Player &player, const DirectionSettings &walkParams) { - Player &player = Players[pnum]; - dPlayer[player.position.future.x][player.position.future.y] = -(pnum + 1); + dPlayer[player.position.future.x][player.position.future.y] = -(player.getId() + 1); player.position.temp = player.position.tile + walkParams.tileAdd; } -void WalkSouthwards(int pnum, const DirectionSettings & /*walkParams*/) +void WalkSouthwards(Player &player, const DirectionSettings & /*walkParams*/) { - Player &player = Players[pnum]; - dPlayer[player.position.tile.x][player.position.tile.y] = -(pnum + 1); + const size_t playerId = player.getId(); + dPlayer[player.position.tile.x][player.position.tile.y] = -(playerId + 1); player.position.temp = player.position.tile; player.position.tile = player.position.future; // Move player to the next tile to maintain correct render order - dPlayer[player.position.tile.x][player.position.tile.y] = pnum + 1; + dPlayer[player.position.tile.x][player.position.tile.y] = playerId + 1; // BUGFIX: missing `if (leveltype != DTYPE_TOWN) {` for call to ChangeLightXY and PM_ChangeLightOff. ChangeLightXY(player._plid, player.position.tile); PmChangeLightOff(player); } -void WalkSideways(int pnum, const DirectionSettings &walkParams) +void WalkSideways(Player &player, const DirectionSettings &walkParams) { - Player &player = Players[pnum]; - Point const nextPosition = player.position.tile + walkParams.map; - dPlayer[player.position.tile.x][player.position.tile.y] = -(pnum + 1); - dPlayer[player.position.future.x][player.position.future.y] = pnum + 1; + const size_t playerId = player.getId(); + dPlayer[player.position.tile.x][player.position.tile.y] = -(playerId + 1); + dPlayer[player.position.future.x][player.position.future.y] = playerId + 1; if (leveltype != DTYPE_TOWN) { ChangeLightXY(player._plid, nextPosition); @@ -318,9 +316,8 @@ bool PlrDirOK(const Player &player, Direction dir) return true; } -void HandleWalkMode(int pnum, Displacement vel, Direction dir) +void HandleWalkMode(Player &player, Displacement vel, Direction dir) { - Player &player = Players[pnum]; const auto &dirModeParams = WalkSettings[static_cast(dir)]; SetPlayerOld(player); if (!PlrDirOK(player, dir)) { @@ -335,7 +332,7 @@ void HandleWalkMode(int pnum, Displacement vel, Direction dir) ScrollViewPort(player, dirModeParams.scrollDir); } - dirModeParams.walkModeHandler(pnum, dirModeParams); + dirModeParams.walkModeHandler(player, dirModeParams); player.position.velocity = vel; player.tempDirection = dirModeParams.dir; @@ -358,16 +355,14 @@ void StartWalkAnimation(Player &player, Direction dir, bool pmWillBeCalled) /** * @brief Start moving a player to a new tile */ -void StartWalk(int pnum, Displacement vel, Direction dir, bool pmWillBeCalled) +void StartWalk(Player &player, Displacement vel, Direction dir, bool pmWillBeCalled) { - Player &player = Players[pnum]; - if (player._pInvincible && player._pHitPoints == 0 && &player == MyPlayer) { SyncPlrKill(player, -1); return; } - HandleWalkMode(pnum, vel, dir); + HandleWalkMode(player, vel, dir); StartWalkAnimation(player, dir, pmWillBeCalled); } @@ -633,13 +628,8 @@ void InitLevelChange(Player &player) /** * @brief Continue movement towards new tile */ -bool DoWalk(int pnum, int variant) +bool DoWalk(Player &player, int variant) { - if (pnum < 0 || pnum >= MAX_PLRS) { - app_fatal(StrCat("PM_DoWalk: illegal player ", pnum)); - } - Player &player = Players[pnum]; - // Play walking sound effect on certain animation frames if (*sgOptions.Audio.walkingSound && (leveltype != DTYPE_TOWN || sgGameInitInfo.bRunInTown == 0)) { if (player.AnimInfo.currentFrame == 0 @@ -656,7 +646,7 @@ bool DoWalk(int pnum, int variant) case PM_WALK_NORTHWARDS: dPlayer[player.position.tile.x][player.position.tile.y] = 0; player.position.tile = player.position.temp; - dPlayer[player.position.tile.x][player.position.tile.y] = pnum + 1; + dPlayer[player.position.tile.x][player.position.tile.y] = player.getId() + 1; break; case PM_WALK_SOUTHWARDS: dPlayer[player.position.temp.x][player.position.temp.y] = 0; @@ -665,7 +655,7 @@ bool DoWalk(int pnum, int variant) dPlayer[player.position.tile.x][player.position.tile.y] = 0; player.position.tile = player.position.temp; // dPlayer is set here for backwards comparability, without it the player would be invisible if loaded from a vanilla save. - dPlayer[player.position.tile.x][player.position.tile.y] = pnum + 1; + dPlayer[player.position.tile.x][player.position.tile.y] = player.getId() + 1; break; } @@ -693,7 +683,7 @@ bool DoWalk(int pnum, int variant) ChangeLightOffset(player._plid, { 0, 0 }); } - AutoPickup(pnum); + AutoPickup(player); return true; } // We didn't reach new tile so update player's "sub-tile" position ChangeOffset(player); @@ -1035,13 +1025,8 @@ bool PlrHitObj(const Player &player, Object &targetObject) return false; } -bool DoAttack(int pnum) +bool DoAttack(Player &player) { - if (pnum < 0 || pnum >= MAX_PLRS) { - app_fatal(StrCat("PM_DoAttack: illegal player ", pnum)); - } - Player &player = Players[pnum]; - if (player.AnimInfo.currentFrame == player._pAFNum - 2) { PlaySfxLoc(PS_SWING, player.position.tile); } @@ -1061,11 +1046,12 @@ bool DoAttack(int pnum) } if (!gbIsHellfire || !HasAllOf(player._pIFlags, ItemSpecialEffect::FireDamage | ItemSpecialEffect::LightningDamage)) { + const size_t playerId = player.getId(); if (HasAnyOf(player._pIFlags, ItemSpecialEffect::FireDamage)) { - AddMissile(position, { 1, 0 }, Direction::South, MIS_WEAPEXP, TARGET_MONSTERS, pnum, 0, 0); + AddMissile(position, { 1, 0 }, Direction::South, MIS_WEAPEXP, TARGET_MONSTERS, playerId, 0, 0); } if (HasAnyOf(player._pIFlags, ItemSpecialEffect::LightningDamage)) { - AddMissile(position, { 2, 0 }, Direction::South, MIS_WEAPEXP, TARGET_MONSTERS, pnum, 0, 0); + AddMissile(position, { 2, 0 }, Direction::South, MIS_WEAPEXP, TARGET_MONSTERS, playerId, 0, 0); } } @@ -1370,13 +1356,8 @@ void TryDisarm(const Player &player, Object &object) } } -void CheckNewPath(int pnum, bool pmWillBeCalled) +void CheckNewPath(Player &player, bool pmWillBeCalled) { - if (pnum < 0 || pnum >= MAX_PLRS) { - app_fatal(StrCat("CheckNewPath: illegal player ", pnum)); - } - Player &player = Players[pnum]; - int x = 0; int y = 0; @@ -1461,28 +1442,28 @@ void CheckNewPath(int pnum, bool pmWillBeCalled) switch (player.walkpath[0]) { case WALK_N: - StartWalk(pnum, { 0, -xvel }, Direction::North, pmWillBeCalled); + StartWalk(player, { 0, -xvel }, Direction::North, pmWillBeCalled); break; case WALK_NE: - StartWalk(pnum, { xvel, -yvel }, Direction::NorthEast, pmWillBeCalled); + StartWalk(player, { xvel, -yvel }, Direction::NorthEast, pmWillBeCalled); break; case WALK_E: - StartWalk(pnum, { xvel3, 0 }, Direction::East, pmWillBeCalled); + StartWalk(player, { xvel3, 0 }, Direction::East, pmWillBeCalled); break; case WALK_SE: - StartWalk(pnum, { xvel, yvel }, Direction::SouthEast, pmWillBeCalled); + StartWalk(player, { xvel, yvel }, Direction::SouthEast, pmWillBeCalled); break; case WALK_S: - StartWalk(pnum, { 0, xvel }, Direction::South, pmWillBeCalled); + StartWalk(player, { 0, xvel }, Direction::South, pmWillBeCalled); break; case WALK_SW: - StartWalk(pnum, { -xvel, yvel }, Direction::SouthWest, pmWillBeCalled); + StartWalk(player, { -xvel, yvel }, Direction::SouthWest, pmWillBeCalled); break; case WALK_W: - StartWalk(pnum, { -xvel3, 0 }, Direction::West, pmWillBeCalled); + StartWalk(player, { -xvel3, 0 }, Direction::West, pmWillBeCalled); break; case WALK_NW: - StartWalk(pnum, { -xvel, -yvel }, Direction::NorthWest, pmWillBeCalled); + StartWalk(player, { -xvel, -yvel }, Direction::NorthWest, pmWillBeCalled); break; } @@ -1572,7 +1553,7 @@ void CheckNewPath(int pnum, bool pmWillBeCalled) d = GetDirection(player.position.tile, object->position); StartAttack(player, d); } else { - OperateObject(pnum, targetId, false); + OperateObject(player, targetId, false); } } break; @@ -1583,13 +1564,13 @@ void CheckNewPath(int pnum, bool pmWillBeCalled) StartAttack(player, d); } else { TryDisarm(player, *object); - OperateObject(pnum, targetId, false); + OperateObject(player, targetId, false); } } break; case ACTION_OPERATETK: if (object->_oBreak != 1) { - OperateObject(pnum, targetId, true); + OperateObject(player, targetId, true); } break; case ACTION_PICKUPITEM: @@ -1597,7 +1578,7 @@ void CheckNewPath(int pnum, bool pmWillBeCalled) x = abs(player.position.tile.x - item->position.x); y = abs(player.position.tile.y - item->position.y); if (x <= 1 && y <= 1 && pcurs == CURSOR_HAND && !item->_iRequest) { - NetSendCmdGItem(true, CMD_REQUESTGITEM, pnum, pnum, targetId); + NetSendCmdGItem(true, CMD_REQUESTGITEM, player.getId(), targetId); item->_iRequest = true; } } @@ -1607,7 +1588,7 @@ void CheckNewPath(int pnum, bool pmWillBeCalled) x = abs(player.position.tile.x - item->position.x); y = abs(player.position.tile.y - item->position.y); if (x <= 1 && y <= 1 && pcurs == CURSOR_HAND) { - NetSendCmdGItem(true, CMD_REQUESTAGITEM, pnum, pnum, targetId); + NetSendCmdGItem(true, CMD_REQUESTAGITEM, player.getId(), targetId); } } break; @@ -3267,10 +3248,10 @@ void ProcessPlayers() case PM_WALK_NORTHWARDS: case PM_WALK_SOUTHWARDS: case PM_WALK_SIDEWAYS: - tplayer = DoWalk(pnum, player._pmode); + tplayer = DoWalk(player, player._pmode); break; case PM_ATTACK: - tplayer = DoAttack(pnum); + tplayer = DoAttack(player); break; case PM_RATTACK: tplayer = DoRangeAttack(player); @@ -3288,7 +3269,7 @@ void ProcessPlayers() tplayer = DoDeath(player); break; } - CheckNewPath(pnum, tplayer); + CheckNewPath(player, tplayer); } while (tplayer); player.previewCelSprite = std::nullopt; diff --git a/Source/qol/autopickup.cpp b/Source/qol/autopickup.cpp index 9d1ffa7c4..f7ac4ebb0 100644 --- a/Source/qol/autopickup.cpp +++ b/Source/qol/autopickup.cpp @@ -73,9 +73,8 @@ bool DoPickup(Item item) } // namespace -void AutoPickup(int pnum) +void AutoPickup(const Player &player) { - const Player &player = Players[pnum]; if (&player != MyPlayer) return; if (leveltype == DTYPE_TOWN && !*sgOptions.Gameplay.autoPickupInTown) @@ -87,7 +86,7 @@ void AutoPickup(int pnum) int itemIndex = dItem[tile.x][tile.y] - 1; auto &item = Items[itemIndex]; if (DoPickup(item)) { - NetSendCmdGItem(true, CMD_REQUESTAGITEM, pnum, pnum, itemIndex); + NetSendCmdGItem(true, CMD_REQUESTAGITEM, player.getId(), itemIndex); item._iRequest = true; } } diff --git a/Source/qol/autopickup.h b/Source/qol/autopickup.h index b00aa138c..089b003e1 100644 --- a/Source/qol/autopickup.h +++ b/Source/qol/autopickup.h @@ -8,6 +8,6 @@ namespace devilution { -void AutoPickup(int pnum); +void AutoPickup(const Player &player); } // namespace devilution diff --git a/Source/spells.cpp b/Source/spells.cpp index 1cd52c5f8..975e38593 100644 --- a/Source/spells.cpp +++ b/Source/spells.cpp @@ -64,10 +64,8 @@ void ClearReadiedSpell(Player &player) } } -void PlacePlayer(int pnum) +void PlacePlayer(Player &player) { - Player &player = Players[pnum]; - if (!player.isOnActiveLevel()) return; @@ -98,7 +96,7 @@ void PlacePlayer(int pnum) player.position.tile = newPosition; - dPlayer[newPosition.x][newPosition.y] = pnum + 1; + dPlayer[newPosition.x][newPosition.y] = player.getId() + 1; if (&player == MyPlayer) { ViewPosition = newPosition; @@ -257,14 +255,8 @@ void CastSpell(int id, spell_id spl, int sx, int sy, int dx, int dy, int spllvl) } } -void DoResurrect(int pnum, uint16_t rid) +void DoResurrect(int pnum, Player &target) { - if ((pnum < 0 && pnum >= MAX_PLRS) || rid >= MAX_PLRS) { - return; - } - - auto &target = Players[rid]; - AddMissile(target.position.tile, target.position.tile, Direction::South, MIS_RESURRECTBEAM, TARGET_MONSTERS, pnum, 0, 0); if (target._pHitPoints != 0) @@ -280,7 +272,7 @@ void DoResurrect(int pnum, uint16_t rid) ClrPlrPath(target); target.destAction = ACTION_NONE; target._pInvincible = false; - PlacePlayer(rid); + PlacePlayer(target); int hp = 10 << 6; if (target._pMaxHPBase < (10 << 6)) { diff --git a/Source/spells.h b/Source/spells.h index 7c03cd9a9..800959e26 100644 --- a/Source/spells.h +++ b/Source/spells.h @@ -37,7 +37,7 @@ void CastSpell(int id, spell_id spl, int sx, int sy, int dx, int dy, int spllvl) * @param pnum player index * @param rid target player index */ -void DoResurrect(int pnum, uint16_t rid); +void DoResurrect(int pnum, Player &target); void DoHealOther(const Player &caster, Player &target); int GetSpellBookLevel(spell_id s); int GetSpellStaffLevel(spell_id s);