diff --git a/WowPacketParser/Enums/Housing.cs b/WowPacketParser/Enums/Housing.cs new file mode 100644 index 0000000000..de6f6232e8 --- /dev/null +++ b/WowPacketParser/Enums/Housing.cs @@ -0,0 +1,90 @@ +namespace WowPacketParser.Enums +{ + public enum HousingResult : byte + { + Success = 0, + ActionLockedByCombat = 1, + CannotAfford = 2, + CharterComplete = 3, + CollisionInvalid = 4, + DbError = 5, + DecorCannotBeRedeemed = 6, + DecorItemNotDestroyable = 7, + DecorNotFound = 8, + DecorNotFoundInStorage = 9, + DuplicateCharterSignature = 10, + FilterRejected = 11, + FixtureCantDeleteDoor = 12, + FixtureHookEmpty = 13, + FixtureHookOccupied = 14, + FixtureHouseTypeMismatch = 15, + FixtureNotFound = 16, + FixtureNotOwned = 17, + FixtureSizeMismatch = 18, + FixtureTypeMismatch = 19, + GenericFailure = 20, + GuildMoreAccountsNeeded = 21, + GuildMoreActivePlayersNeeded = 22, + GuildNotLoaded = 23, + HouseEditLockFailed = 24, + HouseExteriorRootNotFound = 25, + HookNotChildOfFixture = 26, + HouseNotFound = 27, + IncorrectFaction = 28, + InvalidDecorItem = 29, + InvalidDistance = 30, + InvalidGuild = 31, + InvalidHouse = 32, + InvalidInstance = 33, + InvalidInteraction = 34, + InvalidMap = 35, + InvalidNeighborhoodName = 36, + InvalidRoomLayout = 37, + LockedByOtherPlayer = 38, + LockOperationFailed = 39, + MaxDecorReached = 40, + MissingCoreFixture = 41, + MissingDye = 42, + MissingExpansionAccess = 43, + MissingFactionMap = 44, + MissingPrivateNeighborhoodInvite = 45, + MissingTheme = 46, + MoreHouseSlotsNeeded = 47, + MoreSignaturesNeeded = 48, + NeighborhoodNotFound = 49, + NotInDecorEditMode = 50, + NoNeighborhoodOwnershipRequests = 51, + NotInFixtureEditMode = 52, + NotInLayoutEditMode = 53, + NotInsideHouse = 54, + NotOnOwnedPlot = 55, + OperationAborted = 56, + PermissionDenied = 57, + PlacementTargetInvalid = 58, + PlayerNotFound = 59, + PlayerNotInInstance = 60, + PlotNotFound = 61, + PlotNotVacant = 62, + PlotReservationCooldown = 63, + PlotReserved = 64, + RoomNotFound = 65, + RoomUpdateFailed = 66, + RpcFailure = 67, + ServiceNotAvailable = 68, + StaticDataNotFound = 69, + TimeoutLimit = 70, + TimerunningNotAllowed = 71, + TokenRequired = 72, + TooManyRequests = 73, + TransactionFailure = 74, + UnlockOperationFailed = 75 + } + + public enum HousingGuidType : byte + { + Decor = 1, + RoomComponent = 2, + House = 3, + Neighborhood = 4, + } +} diff --git a/WowPacketParser/Enums/Opcode.cs b/WowPacketParser/Enums/Opcode.cs index 756ae01b0a..c171fd4a3e 100644 --- a/WowPacketParser/Enums/Opcode.cs +++ b/WowPacketParser/Enums/Opcode.cs @@ -2473,6 +2473,18 @@ public enum Opcode SMSG_HARDCORE_DEATH_ALERT, SMSG_HEALTH_UPDATE, SMSG_HIGHEST_THREAT_UPDATE, + SMSG_HOUSING_CURRENT_HOUSE_INFO_RESPONSE, + SMSG_HOUSING_DECOR_CATALOG_CREATE_SEARCHER_RESPONSE, + SMSG_HOUSING_DECOR_COMMIT_DYES_FOR_SELECTED_DECOR_RESPONSE, + SMSG_HOUSING_DECOR_SELECT_DECOR_RESPONSE, + SMSG_HOUSING_DECOR_SET_EDITOR_MODE_ACTIVE_RESPONSE, + SMSG_HOUSING_EXTERIOR_SET_EXTERIOR_LOCK_STATE, + SMSG_HOUSING_FIXTURE_SET_EDITOR_MODE_ACTIVE_RESPONSE, + SMSG_HOUSING_ROOM_REMOVE_ROOM_RESPONSE, + SMSG_HOUSING_ROOM_SET_EDITOR_MODE_ACTIVE_RESPONSE, + SMSG_HOUSING_ROOM_UPDATE_RESULT, + SMSG_HOUSING_SERVICES_GET_OTHERS_PLAYER_OWNED_HOUSES_RESPONSE, + SMSG_HOUSING_SERVICES_GET_PLAYER_OWNED_HOUSES_RESPONSE, SMSG_HOTFIX_CONNECT, SMSG_HOTFIX_MESSAGE, SMSG_HOTFIX_NOTIFY, diff --git a/WowPacketParser/Enums/Version/V11_2_7_64632/Opcodes.cs b/WowPacketParser/Enums/Version/V11_2_7_64632/Opcodes.cs index 3b346022f9..a8369ce68d 100644 --- a/WowPacketParser/Enums/Version/V11_2_7_64632/Opcodes.cs +++ b/WowPacketParser/Enums/Version/V11_2_7_64632/Opcodes.cs @@ -1535,6 +1535,18 @@ public static BiDictionary Opcodes(Direction direction) { Opcode.SMSG_HARDCORE_DEATH_ALERT, 0x40034A }, { Opcode.SMSG_HEALTH_UPDATE, 0x400174 }, { Opcode.SMSG_HIGHEST_THREAT_UPDATE, 0x40017C }, + { Opcode.SMSG_HOUSING_CURRENT_HOUSE_INFO_RESPONSE, 0x530001 }, + { Opcode.SMSG_HOUSING_DECOR_CATALOG_CREATE_SEARCHER_RESPONSE, 0x4F0006 }, + { Opcode.SMSG_HOUSING_DECOR_COMMIT_DYES_FOR_SELECTED_DECOR_RESPONSE, 0x4F0008 }, + { Opcode.SMSG_HOUSING_DECOR_SELECT_DECOR_RESPONSE, 0x4F0004 }, + { Opcode.SMSG_HOUSING_DECOR_SET_EDITOR_MODE_ACTIVE_RESPONSE, 0x4F0000 }, + { Opcode.SMSG_HOUSING_EXTERIOR_SET_EXTERIOR_LOCK_STATE, 0x4E0000 }, + { Opcode.SMSG_HOUSING_FIXTURE_SET_EDITOR_MODE_ACTIVE_RESPONSE, 0x500000 }, + { Opcode.SMSG_HOUSING_ROOM_REMOVE_ROOM_RESPONSE, 0x510002 }, + { Opcode.SMSG_HOUSING_ROOM_SET_EDITOR_MODE_ACTIVE_RESPONSE, 0x510000 }, + { Opcode.SMSG_HOUSING_ROOM_UPDATE_RESULT, 0x510003 }, + { Opcode.SMSG_HOUSING_SERVICES_GET_OTHERS_PLAYER_OWNED_HOUSES_RESPONSE, 0x52000D }, + { Opcode.SMSG_HOUSING_SERVICES_GET_PLAYER_OWNED_HOUSES_RESPONSE, 0x52000C }, { Opcode.SMSG_HOTFIX_CONNECT, 0x440003 }, { Opcode.SMSG_HOTFIX_MESSAGE, 0x440002 }, { Opcode.SMSG_INITIALIZE_FACTIONS, 0x4001C5 }, diff --git a/WowPacketParser/Enums/Version/V11_2_7_64632/Opcodes_64877.cs b/WowPacketParser/Enums/Version/V11_2_7_64632/Opcodes_64877.cs index f8bf55311d..77099c6834 100644 --- a/WowPacketParser/Enums/Version/V11_2_7_64632/Opcodes_64877.cs +++ b/WowPacketParser/Enums/Version/V11_2_7_64632/Opcodes_64877.cs @@ -1534,6 +1534,18 @@ public static BiDictionary Opcodes(Direction direction) { Opcode.SMSG_HARDCORE_DEATH_ALERT, 0x400349 }, { Opcode.SMSG_HEALTH_UPDATE, 0x400174 }, { Opcode.SMSG_HIGHEST_THREAT_UPDATE, 0x40017C }, + { Opcode.SMSG_HOUSING_CURRENT_HOUSE_INFO_RESPONSE, 0x530001 }, + { Opcode.SMSG_HOUSING_DECOR_CATALOG_CREATE_SEARCHER_RESPONSE, 0x4F0006 }, + { Opcode.SMSG_HOUSING_DECOR_COMMIT_DYES_FOR_SELECTED_DECOR_RESPONSE, 0x4F0008 }, + { Opcode.SMSG_HOUSING_DECOR_SELECT_DECOR_RESPONSE, 0x4F0004 }, + { Opcode.SMSG_HOUSING_DECOR_SET_EDITOR_MODE_ACTIVE_RESPONSE, 0x4F0000 }, + { Opcode.SMSG_HOUSING_EXTERIOR_SET_EXTERIOR_LOCK_STATE, 0x4E0000 }, + { Opcode.SMSG_HOUSING_FIXTURE_SET_EDITOR_MODE_ACTIVE_RESPONSE, 0x500000 }, + { Opcode.SMSG_HOUSING_ROOM_REMOVE_ROOM_RESPONSE, 0x510002 }, + { Opcode.SMSG_HOUSING_ROOM_SET_EDITOR_MODE_ACTIVE_RESPONSE, 0x510000 }, + { Opcode.SMSG_HOUSING_ROOM_UPDATE_RESULT, 0x510003 }, + { Opcode.SMSG_HOUSING_SERVICES_GET_OTHERS_PLAYER_OWNED_HOUSES_RESPONSE, 0x52000D }, + { Opcode.SMSG_HOUSING_SERVICES_GET_PLAYER_OWNED_HOUSES_RESPONSE, 0x52000C }, { Opcode.SMSG_HOTFIX_CONNECT, 0x440003 }, { Opcode.SMSG_HOTFIX_MESSAGE, 0x440002 }, { Opcode.SMSG_INITIALIZE_FACTIONS, 0x4001C5 }, diff --git a/WowPacketParser/Misc/WowGuid.cs b/WowPacketParser/Misc/WowGuid.cs index 567345150e..5f2015be6e 100644 --- a/WowPacketParser/Misc/WowGuid.cs +++ b/WowPacketParser/Misc/WowGuid.cs @@ -155,6 +155,24 @@ public override string ToString() if (Low == 0 && High == 0) return "Full: 0x0"; + string baseGuidPart = $"TypeName: {GetHighType()}; Full: 0x{High:X16}{Low:X16}"; + string endString = $"Low: {GetLow()}"; + switch (GetHighType()) + { + case HighGuidType.Housing: + { + var subType = (HousingGuidType)((High >> 53) & 0x1F); + return subType switch + { + HousingGuidType.Decor => $"{baseGuidPart}; SubType: {subType}; RealmID: {(High >> 32) & 0xFFFF}; DecorID: {High & 0xFFFFFFFF}; {endString}", + HousingGuidType.Neighborhood => $"{baseGuidPart}; SubType: {subType}; NeighborhoodMapID: {(High >> 32) & 0xFFFF}; Arg2: {High & 0xFFFFFFFF}; {endString}", + HousingGuidType.RoomComponent => $"{baseGuidPart}; SubType: {subType}; HouseRoomID: {High & 0xFFFFFFFF}; {endString}", + HousingGuidType.House => $"{baseGuidPart}; SubType: {subType}; NeighborhoodMapID: {Low & 0x7FFF}; Arg2: {(Low >> 15) & 0x3F}; {endString}", + _ => $"{baseGuidPart}; SubType: Unknown({(byte)subType}); {endString}", + }; + } + } + if (HasEntry()) { StoreNameType type = StoreNameType.None; diff --git a/WowPacketParserModule.V11_0_0_55666/Parsers/HousingHandler.cs b/WowPacketParserModule.V11_0_0_55666/Parsers/HousingHandler.cs new file mode 100644 index 0000000000..0a844290f7 --- /dev/null +++ b/WowPacketParserModule.V11_0_0_55666/Parsers/HousingHandler.cs @@ -0,0 +1,255 @@ +using WowPacketParser.Enums; +using WowPacketParser.Misc; +using WowPacketParser.Parsing; + +namespace WowPacketParserModule.V11_0_0_55666.Parsers +{ + public static class HousingHandler + { + + [Parser(Opcode.CMSG_HOUSING_DECOR_CATALOG_CREATE_SEARCHER)] + public static void HousingDecorCatalogCreateSearcher(Packet packet) + { + packet.ReadPackedGuid128("BnetAccountID"); + } + + [Parser(Opcode.CMSG_HOUSING_DECOR_CATALOG_DESTROY_ENTRY)] + public static void HandleHousingDecorCatalogDestroyEntry(Packet packet) + { + packet.ReadPackedGuid128("BnetAccountID"); + packet.ReadUInt16("CatalogEntryID"); + packet.ReadUInt32("Field_10"); + } + + [Parser(Opcode.CMSG_HOUSING_DECOR_CATALOG_DESTROY_ALL_ENTRY_COPIES)] + public static void HandleHousingDecorCatalogDestroyAllEntryCopies(Packet packet) + { + packet.ReadUInt16("CatalogEntryID"); + packet.ReadUInt16("Field_4"); + } + + [Parser(Opcode.CMSG_HOUSING_DECOR_COMMIT_DYES_FOR_SELECTED_DECOR)] + public static void HousingDecorCommitDyesForSelection(Packet packet) + { + packet.ReadPackedGuid128("DecorGUID"); + for (var i = 0; i < 3; ++i) + { + packet.ReadInt32("DyeColorID", i); + } + } + + [Parser(Opcode.CMSG_HOUSING_DECOR_MOVE_DECOR)] + public static void HandleHousingDecorMove(Packet packet) + { + packet.ReadPackedGuid128("DecorGUID"); + packet.ReadVector3("Position"); + packet.ReadQuaternion("Rotation"); + packet.ReadPackedGuid128("AttachParentGUID"); + packet.ReadPackedGuid128("RoomGUID"); + packet.ReadPackedGuid128("Field_70"); + packet.ReadInt32("Field_80"); + packet.ReadByte("Field_85"); + packet.ReadByte("Field_86"); + packet.ReadBool("Field_87"); + } + + [Parser(Opcode.CMSG_HOUSING_DECOR_REMOVE_PLACED_DECOR_ENTRY)] + public static void HousingDecorRemovePlacedEntry(Packet packet) + { + packet.ReadPackedGuid128("DecorGUID"); + } + + [Parser(Opcode.CMSG_HOUSING_DECOR_SELECT_DECOR)] + public static void HousingDecorSelect(Packet packet) + { + packet.ReadPackedGuid128("DecorGUID"); + packet.ReadBool("Selected"); + } + + [Parser(Opcode.CMSG_HOUSING_DECOR_START_PLACING_NEW_DECOR)] + public static void HousingDecorStartPlacing(Packet packet) + { + packet.ReadUInt32("CatalogEntryID"); + packet.ReadUInt32("Field_4"); + } + + [Parser(Opcode.CMSG_HOUSING_ROOM_REMOVE_ROOM)] + public static void HandleHousingRoomRemove(Packet packet) + { + packet.ReadPackedGuid128("RoomGUID"); + } + + [Parser(Opcode.CMSG_HOUSING_ROOM_ROTATE_ROOM)] + public static void HousingRoomRotate(Packet packet) + { + packet.ReadPackedGuid128("RoomGUID"); + packet.ReadBool("IsLeft"); + } + + [Parser(Opcode.CMSG_HOUSING_SERVICES_GET_OTHERS_PLAYER_OWNED_HOUSES)] + public static void HandleHousingServiceGetOthersPlayerOwnedHouses(Packet packet) + { + packet.ReadPackedGuid128("PlayerGUID"); + } + + [Parser(Opcode.CMSG_HOUSING_SERVICES_SEARCH_BNET_FRIEND_NEIGHBORHOODS)] + public static void HandleHousingServiceSearchBnetFriendNeighborhoods(Packet packet) + { + packet.ReadPackedGuid128("BNetAccountGUID"); + } + + [Parser(Opcode.CMSG_NEIGHBORHOOD_INTERACT_WITH_CORNERSTONE)] + public static void HandleNeighborhoodInteractWithCornerstone(Packet packet) + { + packet.ReadUInt32("PlotID"); + packet.ReadPackedGuid128("CornerstoneGUID"); + } + + [Parser(Opcode.CMSG_QUERY_NEIGHBORHOOD_INFO)] + public static void HandleQueryNeighborhoodInfo(Packet packet) + { + packet.ReadPackedGuid128("NeighborhoodGUID"); + } + + [Parser(Opcode.SMSG_HOUSING_CURRENT_HOUSE_INFO_RESPONSE)] + public static void HandleHousingCurrentHouseInfoResponse(Packet packet) + { + ReadHouse(packet, "House"); + packet.ReadByteE("Result"); + } + + [Parser(Opcode.SMSG_HOUSING_DECOR_CATALOG_CREATE_SEARCHER_RESPONSE)] + public static void HousingDecorCatalogCreateSearcherResponse(Packet packet) + { + packet.ReadPackedGuid128("BnetAccountID"); + packet.ReadByteE("Result"); + } + + [Parser(Opcode.SMSG_HOUSING_DECOR_COMMIT_DYES_FOR_SELECTED_DECOR_RESPONSE)] + public static void HandleHousingDecorCommitDyesForSelectedDecorResponse(Packet packet) + { + packet.ReadPackedGuid128("DecorGUID"); + packet.ReadByteE("Result"); + } + + [Parser(Opcode.SMSG_HOUSING_DECOR_SELECT_DECOR_RESPONSE)] + public static void HandleHousingDecorSelectDecorResponse(Packet packet) + { + packet.ReadPackedGuid128("DecorGUID"); + packet.ReadPackedGuid128("PlayerGUID"); + packet.ReadUInt32("Field_16"); + packet.ReadByteE("Result"); + packet.ReadBit("Selected"); + packet.ReadBit("Field_17"); + } + + [Parser(Opcode.SMSG_HOUSING_DECOR_SET_EDITOR_MODE_ACTIVE_RESPONSE)] + public static void HandleHousingDecorSetEditorModeActiveResponse(Packet packet) + { + packet.ReadPackedGuid128("HouseGUID"); + packet.ReadPackedGuid128("BNetAccountGUID"); + var allowedEditorCount = packet.ReadUInt32("AllowedEditorCount"); + packet.ReadByteE("Result"); + + for (var i = 0; i < allowedEditorCount; ++i) + packet.ReadPackedGuid128("AllowedEditor", i); + } + + [Parser(Opcode.SMSG_HOUSING_EXTERIOR_SET_EXTERIOR_LOCK_STATE)] + public static void HandleHousingExteriorLockHouseExterior(Packet packet) + { + packet.ReadPackedGuid128("HouseGUID"); + packet.ReadPackedGuid128("PlayerGUID"); + packet.ReadByteE("Result"); + packet.ReadBit("IsLocked"); + } + + [Parser(Opcode.SMSG_HOUSING_FIXTURE_SET_EDITOR_MODE_ACTIVE_RESPONSE)] + public static void HandleHousingFixtureSetEditorModeActiveResponse(Packet packet) + { + packet.ReadPackedGuid128("HouseGUID"); + packet.ReadPackedGuid128("BNetAccountGUID"); + packet.ReadByteE("Result"); + } + + [Parser(Opcode.SMSG_HOUSING_ROOM_REMOVE_ROOM_RESPONSE)] + public static void HandleHousingRoomRemoveResponse(Packet packet) + { + packet.ReadPackedGuid128("RoomGUID"); + packet.ReadPackedGuid128("PlayerGUID"); + packet.ReadByteE("Result"); + } + + [Parser(Opcode.SMSG_HOUSING_ROOM_SET_EDITOR_MODE_ACTIVE_RESPONSE)] + public static void HandleHousingRoomSetEditorModeActiveResponse(Packet packet) + { + packet.ReadPackedGuid128("HouseGUID"); + packet.ReadByteE("Result"); + packet.ReadBool("Active"); + } + + [Parser(Opcode.SMSG_HOUSING_ROOM_UPDATE_RESULT)] + public static void HousingRoomUpdateResult(Packet packet) + { + packet.ReadPackedGuid128("RoomGUID"); + packet.ReadByteE("Result"); + } + + [Parser(Opcode.SMSG_HOUSING_SERVICES_GET_OTHERS_PLAYER_OWNED_HOUSES_RESPONSE)] + [Parser(Opcode.SMSG_HOUSING_SERVICES_GET_PLAYER_OWNED_HOUSES_RESPONSE)] + public static void HandleHousingServiceGetOwnedHousesResponse(Packet packet) + { + var count = packet.ReadUInt32("Count"); + packet.ReadByteE("Result"); + for (uint i = 0; i < count; i++) + { + ReadHouse(packet, i); + } + } + + [Parser(Opcode.SMSG_INVALIDATE_NEIGHBORHOOD_NAME)] + public static void HandleInvalidateNeighborhoodName(Packet packet) + { + packet.ReadPackedGuid128("NeighborhoodGUID"); + } + + [Parser(Opcode.SMSG_QUERY_NEIGHBORHOOD_NAME_RESPONSE)] + public static void HandleQueryNeighborhoodNameResponse(Packet packet) + { + packet.ReadPackedGuid128("NeighborhoodGUID"); + var nameLen = packet.ReadBits(8); + packet.ReadWoWString("NeighborhoodName", nameLen); + } + + [Parser(Opcode.CMSG_HOUSING_DECOR_SET_EDITOR_MODE_ACTIVE)] + [Parser(Opcode.CMSG_HOUSING_FIXTURE_SET_EDITOR_MODE_ACTIVE)] + [Parser(Opcode.CMSG_HOUSING_ROOM_SET_EDITOR_MODE_ACTIVE)] + public static void HandleHousingSetEditorModeActive(Packet packet) + { + packet.ReadBool("Active"); + } + + [Parser(Opcode.CMSG_HOUSE_INTERIOR_LEAVE_HOUSE)] + [Parser(Opcode.CMSG_HOUSING_REQUEST_CURRENT_HOUSE_INFO)] + [Parser(Opcode.CMSG_HOUSING_SERVICES_GET_PLAYER_OWNED_HOUSES)] + [Parser(Opcode.CMSG_HOUSING_SERVICES_HOUSE_FINDER_REQUEST_NEIGHBORHOODS)] + public static void HandleHousingNull(Packet packet) + { + } + + private static void ReadHouse(Packet packet, params object[] indexes) + { + packet.ResetBitReader(); + packet.ReadPackedGuid128("HouseGUID", indexes); + packet.ReadPackedGuid128("OwnerGUID", indexes); + packet.ReadPackedGuid128("NeighborhoodGUID", indexes); + + packet.ReadByte("PlotID", indexes); + packet.ReadInt32("AccessFlags", indexes); + + var hasMoveOutTime = packet.ReadBit("HasMoveOutTime", indexes); + if (hasMoveOutTime) + packet.ReadTime64("MoveOutTime", indexes); + } + } +}