diff --git a/Source/msg.cpp b/Source/msg.cpp index 006109734..bc0f5e0d6 100644 --- a/Source/msg.cpp +++ b/Source/msg.cpp @@ -1638,17 +1638,18 @@ size_t OnPlayerDamage(const TCmd *pCmd, Player &player) return sizeof(message); } -size_t OnOperateObject(const TCmd *pCmd, int pnum) +size_t OnOperateObject(const TCmd &pCmd, int pnum) { - const auto &message = *reinterpret_cast(pCmd); + const auto &message = reinterpret_cast(pCmd); + Object *object = ObjectAtPosition({ message.x, message.y }); if (gbBufferMsgs == 1) { SendPacket(pnum, &message, sizeof(message)); - } else if (message.wParam1 < MAXOBJECTS) { + } else if (object != nullptr) { Player &player = Players[pnum]; if (player.isOnActiveLevel()) - SyncOpObject(player, message.bCmd, message.wParam1); - DeltaSyncObject(Objects[message.wParam1], message.bCmd, player); + SyncOpObject(player, message.bCmd, *object); + DeltaSyncObject(*object, message.bCmd, player); } return sizeof(message); @@ -1663,9 +1664,8 @@ size_t OnBreakObject(const TCmd &pCmd, int pnum) SendPacket(pnum, &message, sizeof(message)); } else if (breakable != nullptr) { Player &player = Players[pnum]; - if (player.isOnActiveLevel()) { + if (player.isOnActiveLevel()) SyncBreakObj(player, *breakable); - } DeltaSyncObject(*breakable, CMD_BREAKOBJ, player); } @@ -2496,7 +2496,7 @@ void DeltaLoadLevel() case CMD_CLOSEDOOR: case CMD_OPERATEOBJ: case CMD_PLROPOBJ: - DeltaSyncOpObject(deltaLevel.object[i].bCmd, i); + DeltaSyncOpObject(deltaLevel.object[i].bCmd, Objects[i]); break; case CMD_BREAKOBJ: DeltaSyncBreakObj(Objects[i]); @@ -2997,7 +2997,7 @@ size_t ParseCmd(int pnum, const TCmd *pCmd) case CMD_CLOSEDOOR: case CMD_OPERATEOBJ: case CMD_PLROPOBJ: - return OnOperateObject(pCmd, pnum); + return OnOperateObject(*pCmd, pnum); case CMD_BREAKOBJ: return OnBreakObject(*pCmd, pnum); case CMD_CHANGEPLRITEMS: diff --git a/Source/msg.h b/Source/msg.h index c230c8c6f..ca9734efc 100644 --- a/Source/msg.h +++ b/Source/msg.h @@ -250,24 +250,27 @@ enum _cmd_id : uint8_t { CMD_GOTOAGETITEM, // Open target door. // - // body (TCmdParam1): - // int16_t object_num + // body (TCmdLoc): + // int8_t x + // int8_t y CMD_OPENDOOR, // Close target door. // - // body (TCmdParam1): - // int16_t object_num + // body (TCmdLoc): + // int8_t x + // int8_t y CMD_CLOSEDOOR, // Operate object. // - // body (TCmdParam1): - // int16_t object_num + // body (TCmdLoc): + // int8_t x + // int8_t y CMD_OPERATEOBJ, // Player operate object. // - // body (TCmdParam2): - // int16_t player_num - // int16_t object_num + // body (TCmdLoc): + // int8_t x + // int8_t y CMD_PLROPOBJ, // Break object. // diff --git a/Source/objects.cpp b/Source/objects.cpp index 80389e779..1016227f4 100644 --- a/Source/objects.cpp +++ b/Source/objects.cpp @@ -1742,7 +1742,7 @@ void OperateL1RDoor(Object &door, bool sendflag) if (door._oVar4 == 0) { if (sendflag) - NetSendCmdParam1(true, CMD_OPENDOOR, door.GetId()); + NetSendCmdLoc(MyPlayerId, true, CMD_OPENDOOR, door.position); if (!deltaload) PlaySfxLoc(IS_DOOROPEN, door.position); ObjSetMicro(door.position, 394); @@ -1760,7 +1760,7 @@ void OperateL1RDoor(Object &door, bool sendflag) PlaySfxLoc(IS_DOORCLOS, door.position); if (!deltaload && IsDoorClear(door.position)) { if (sendflag) - NetSendCmdParam1(true, CMD_CLOSEDOOR, door.GetId()); + NetSendCmdLoc(MyPlayerId, true, CMD_CLOSEDOOR, door.position); door._oVar4 = 0; door._oSelFlag = 3; ObjSetMicro(door.position, door._oVar1 - 1); @@ -1791,7 +1791,7 @@ void OperateL1LDoor(Object &door, bool sendflag) if (door._oVar4 == 0) { if (sendflag) - NetSendCmdParam1(true, CMD_OPENDOOR, door.GetId()); + NetSendCmdLoc(MyPlayerId, true, CMD_OPENDOOR, door.position); if (!deltaload) PlaySfxLoc(IS_DOOROPEN, door.position); if (door._oVar1 == 214) @@ -1812,7 +1812,7 @@ void OperateL1LDoor(Object &door, bool sendflag) PlaySfxLoc(IS_DOORCLOS, door.position); if (IsDoorClear(door.position)) { if (sendflag) - NetSendCmdParam1(true, CMD_CLOSEDOOR, door.GetId()); + NetSendCmdLoc(MyPlayerId, true, CMD_CLOSEDOOR, door.position); door._oVar4 = 0; door._oSelFlag = 3; ObjSetMicro(door.position, door._oVar1 - 1); @@ -1843,7 +1843,7 @@ void OperateL2RDoor(Object &door, bool sendflag) if (door._oVar4 == 0) { if (sendflag) - NetSendCmdParam1(true, CMD_OPENDOOR, door.GetId()); + NetSendCmdLoc(MyPlayerId, true, CMD_OPENDOOR, door.position); if (!deltaload) PlaySfxLoc(IS_DOOROPEN, door.position); ObjSetMicro(door.position, 16); @@ -1861,7 +1861,7 @@ void OperateL2RDoor(Object &door, bool sendflag) if (IsDoorClear(door.position)) { if (sendflag) - NetSendCmdParam1(true, CMD_CLOSEDOOR, door.GetId()); + NetSendCmdLoc(MyPlayerId, true, CMD_CLOSEDOOR, door.position); door._oVar4 = 0; door._oSelFlag = 3; ObjSetMicro(door.position, 539); @@ -1884,7 +1884,7 @@ void OperateL2LDoor(Object &door, bool sendflag) if (door._oVar4 == 0) { if (sendflag) - NetSendCmdParam1(true, CMD_OPENDOOR, door.GetId()); + NetSendCmdLoc(MyPlayerId, true, CMD_OPENDOOR, door.position); if (!deltaload) PlaySfxLoc(IS_DOOROPEN, door.position); ObjSetMicro(door.position, 12); @@ -1902,7 +1902,7 @@ void OperateL2LDoor(Object &door, bool sendflag) if (IsDoorClear(door.position)) { if (sendflag) - NetSendCmdParam1(true, CMD_CLOSEDOOR, door.GetId()); + NetSendCmdLoc(MyPlayerId, true, CMD_CLOSEDOOR, door.position); door._oVar4 = 0; door._oSelFlag = 3; ObjSetMicro(door.position, 537); @@ -1925,7 +1925,7 @@ void OperateL3RDoor(Object &door, bool sendflag) if (door._oVar4 == 0) { if (sendflag) - NetSendCmdParam1(true, CMD_OPENDOOR, door.GetId()); + NetSendCmdLoc(MyPlayerId, true, CMD_OPENDOOR, door.position); if (!deltaload) PlaySfxLoc(IS_DOOROPEN, door.position); ObjSetMicro(door.position, 540); @@ -1942,7 +1942,7 @@ void OperateL3RDoor(Object &door, bool sendflag) if (IsDoorClear(door.position)) { if (sendflag) - NetSendCmdParam1(true, CMD_CLOSEDOOR, door.GetId()); + NetSendCmdLoc(MyPlayerId, true, CMD_CLOSEDOOR, door.position); door._oVar4 = 0; door._oSelFlag = 3; ObjSetMicro(door.position, 533); @@ -1964,7 +1964,7 @@ void OperateL3LDoor(Object &door, bool sendflag) if (door._oVar4 == 0) { if (sendflag) - NetSendCmdParam1(true, CMD_OPENDOOR, door.GetId()); + NetSendCmdLoc(MyPlayerId, true, CMD_OPENDOOR, door.position); if (!deltaload) PlaySfxLoc(IS_DOOROPEN, door.position); ObjSetMicro(door.position, 537); @@ -1981,7 +1981,7 @@ void OperateL3LDoor(Object &door, bool sendflag) if (IsDoorClear(door.position)) { if (sendflag) - NetSendCmdParam1(true, CMD_CLOSEDOOR, door.GetId()); + NetSendCmdLoc(MyPlayerId, true, CMD_CLOSEDOOR, door.position); door._oVar4 = 0; door._oSelFlag = 3; ObjSetMicro(door.position, 530); @@ -2003,7 +2003,7 @@ void OperateL5RDoor(Object &door, bool sendflag) if (door._oVar4 == 0) { if (sendflag) - NetSendCmdParam1(true, CMD_OPENDOOR, door.GetId()); + NetSendCmdLoc(MyPlayerId, true, CMD_OPENDOOR, door.position); if (!deltaload) PlaySfxLoc(IS_CROPEN, door.position); ObjSetMicro(door.position, 208); @@ -2021,7 +2021,7 @@ void OperateL5RDoor(Object &door, bool sendflag) PlaySfxLoc(IS_CRCLOS, door.position); if (!deltaload && IsDoorClear(door.position)) { if (sendflag) - NetSendCmdParam1(true, CMD_CLOSEDOOR, door.GetId()); + NetSendCmdLoc(MyPlayerId, true, CMD_CLOSEDOOR, door.position); door._oVar4 = 0; door._oSelFlag = 3; ObjSetMicro(door.position, door._oVar1 - 1); @@ -2052,7 +2052,7 @@ void OperateL5LDoor(Object &door, bool sendflag) if (door._oVar4 == 0) { if (sendflag) - NetSendCmdParam1(true, CMD_OPENDOOR, door.GetId()); + NetSendCmdLoc(MyPlayerId, true, CMD_OPENDOOR, door.position); if (!deltaload) PlaySfxLoc(IS_CROPEN, door.position); ObjSetMicro(door.position, 205); @@ -2070,7 +2070,7 @@ void OperateL5LDoor(Object &door, bool sendflag) PlaySfxLoc(IS_CRCLOS, door.position); if (IsDoorClear(door.position)) { if (sendflag) - NetSendCmdParam1(true, CMD_CLOSEDOOR, door.GetId()); + NetSendCmdLoc(MyPlayerId, true, CMD_CLOSEDOOR, door.position); door._oVar4 = 0; door._oSelFlag = 3; ObjSetMicro(door.position, door._oVar1 - 1); @@ -2161,7 +2161,7 @@ void OperateLever(Object &object, bool sendmsg) } if (sendmsg) - NetSendCmdParam1(false, CMD_OPERATEOBJ, object.GetId()); + NetSendCmdLoc(MyPlayerId, false, CMD_OPERATEOBJ, object.position); } void OperateBook(Player &player, Object &book) @@ -2270,7 +2270,7 @@ void OperateBookLever(Object &questBook, bool sendmsg) questBook._oAnimFrame = questBook._oVar6; InitQTextMsg(questBook.bookMessage); if (sendmsg) - NetSendCmdParam1(false, CMD_OPERATEOBJ, questBook.GetId()); + NetSendCmdLoc(MyPlayerId, false, CMD_OPERATEOBJ, questBook.position); } } @@ -2368,7 +2368,7 @@ void OperateChest(const Player &player, Object &chest, bool sendLootMsg) chest._oTrapFlag = false; } if (&player == MyPlayer) - NetSendCmdParam1(false, CMD_PLROPOBJ, chest.GetId()); + NetSendCmdLoc(MyPlayerId, false, CMD_PLROPOBJ, chest.position); } void OperateMushroomPatch(const Player &player, Object &mushroomPatch) @@ -2444,7 +2444,7 @@ void OperateSlainHero(const Player &player, Object &corpse) } MyPlayer->Say(HeroSpeech::RestInPeaceMyFriend); if (&player == MyPlayer) - NetSendCmdParam1(false, CMD_OPERATEOBJ, corpse.GetId()); + NetSendCmdLoc(MyPlayerId, false, CMD_OPERATEOBJ, corpse.position); } void OperateTrapLever(Object &flameLever) @@ -2491,7 +2491,7 @@ void OperateSarcophagus(Object &sarcophagus, bool sendMsg, bool sendLootMsg) if (sarcophagus._oVar1 >= 8 && sarcophagus._oVar2 >= 0) ActivateSkeleton(Monsters[sarcophagus._oVar2], sarcophagus.position); if (sendMsg) - NetSendCmdParam1(false, CMD_OPERATEOBJ, sarcophagus.GetId()); + NetSendCmdLoc(MyPlayerId, false, CMD_OPERATEOBJ, sarcophagus.position); } void OperateL2Door(const Player &player, Object &door) @@ -3374,7 +3374,7 @@ void OperateShrine(Player &player, Object &shrine, _sfx_id sType) } if (&player == MyPlayer) - NetSendCmdParam1(false, CMD_PLROPOBJ, shrine.GetId()); + NetSendCmdLoc(MyPlayerId, false, CMD_PLROPOBJ, shrine.position); } void OperateBookStand(Object &bookStand, bool sendmsg, bool sendLootMsg) @@ -3392,7 +3392,7 @@ void OperateBookStand(Object &bookStand, bool sendmsg, bool sendLootMsg) else CreateTypeItem(bookStand.position, false, ItemType::Misc, IMISC_SCROLL, sendLootMsg, false); if (sendmsg) - NetSendCmdParam1(false, CMD_OPERATEOBJ, bookStand.GetId()); + NetSendCmdLoc(MyPlayerId, false, CMD_OPERATEOBJ, bookStand.position); } void OperateBookcase(Object &bookcase, bool sendmsg, bool sendLootMsg) @@ -3420,7 +3420,7 @@ void OperateBookcase(Object &bookcase, bool sendmsg, bool sendLootMsg) } } if (sendmsg) - NetSendCmdParam1(false, CMD_OPERATEOBJ, bookcase.GetId()); + NetSendCmdLoc(MyPlayerId, false, CMD_OPERATEOBJ, bookcase.position); } void OperateDecapitatedBody(Object &corpse, bool sendmsg, bool sendLootMsg) @@ -3432,7 +3432,7 @@ void OperateDecapitatedBody(Object &corpse, bool sendmsg, bool sendLootMsg) SetRndSeed(corpse._oRndSeed); CreateRndItem(corpse.position, false, sendLootMsg, false); if (sendmsg) - NetSendCmdParam1(false, CMD_OPERATEOBJ, corpse.GetId()); + NetSendCmdLoc(MyPlayerId, false, CMD_OPERATEOBJ, corpse.position); } void OperateArmorStand(Object &armorStand, bool sendmsg, bool sendLootMsg) @@ -3454,7 +3454,7 @@ void OperateArmorStand(Object &armorStand, bool sendmsg, bool sendLootMsg) CreateTypeItem(armorStand.position, true, ItemType::HeavyArmor, IMISC_NONE, sendLootMsg, false); } if (sendmsg) - NetSendCmdParam1(false, CMD_OPERATEOBJ, armorStand.GetId()); + NetSendCmdLoc(MyPlayerId, false, CMD_OPERATEOBJ, armorStand.position); } int FindValidShrine() @@ -3544,7 +3544,7 @@ bool OperateFountains(Player &player, Object &fountain) 2 * leveltype); applied = true; if (&player == MyPlayer) - NetSendCmdParam1(false, CMD_OPERATEOBJ, fountain.GetId()); + NetSendCmdLoc(MyPlayerId, false, CMD_OPERATEOBJ, fountain.position); break; case OBJ_TEARFTN: { if (fountain._oSelFlag == 0) @@ -3581,7 +3581,7 @@ bool OperateFountains(Player &player, Object &fountain) CheckStats(player); applied = true; if (&player == MyPlayer) - NetSendCmdParam1(false, CMD_OPERATEOBJ, fountain.GetId()); + NetSendCmdLoc(MyPlayerId, false, CMD_OPERATEOBJ, fountain.position); } break; default: break; @@ -3604,7 +3604,7 @@ void OperateWeaponRack(Object &weaponRack, bool sendmsg, bool sendLootMsg) CreateTypeItem(weaponRack.position, leveltype != DTYPE_CATHEDRAL, weaponType, IMISC_NONE, sendLootMsg, false); if (sendmsg) - NetSendCmdParam1(false, CMD_OPERATEOBJ, weaponRack.GetId()); + NetSendCmdLoc(MyPlayerId, false, CMD_OPERATEOBJ, weaponRack.position); } /** @@ -3659,7 +3659,7 @@ void OperateStoryBook(Object &storyBook) Quests[Q_NAKRUL]._qmsg = msg; } InitQTextMsg(msg); - NetSendCmdParam1(false, CMD_OPERATEOBJ, storyBook.GetId()); + NetSendCmdLoc(MyPlayerId, false, CMD_OPERATEOBJ, storyBook.position); } void OperateLazStand(Object &stand) @@ -4931,10 +4931,8 @@ void OperateObject(Player &player, int i, bool teleFlag) } } -void DeltaSyncOpObject(int cmd, int i) +void DeltaSyncOpObject(int cmd, Object &object) { - Object &object = Objects[i]; - switch (object._otype) { case OBJ_L1LDOOR: case OBJ_L1RDOOR: @@ -5011,9 +5009,8 @@ void DeltaSyncOpObject(int cmd, int i) } } -void SyncOpObject(Player &player, int cmd, int i) +void SyncOpObject(Player &player, int cmd, Object &object) { - Object &object = Objects[i]; bool sendmsg = &player == MyPlayer; switch (object._otype) { diff --git a/Source/objects.h b/Source/objects.h index 4a5145908..918b5dc4a 100644 --- a/Source/objects.h +++ b/Source/objects.h @@ -306,10 +306,10 @@ 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(Player &player, int i, bool TeleFlag); -void SyncOpObject(Player &player, int cmd, int i); +void SyncOpObject(Player &player, int cmd, Object &object); void BreakObjectMissile(Object &object); void BreakObject(const Player &player, Object &object); -void DeltaSyncOpObject(int cmd, int i); +void DeltaSyncOpObject(int cmd, Object &object); void DeltaSyncBreakObj(Object &object); void SyncBreakObj(const Player &player, Object &object); void SyncObjectAnim(Object &object);