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/Version/V11_2_7_64632/Opcodes.cs b/WowPacketParser/Enums/Version/V11_2_7_64632/Opcodes.cs index 0f4ed12a6f..d1cde6be04 100644 --- a/WowPacketParser/Enums/Version/V11_2_7_64632/Opcodes.cs +++ b/WowPacketParser/Enums/Version/V11_2_7_64632/Opcodes.cs @@ -443,7 +443,9 @@ public static BiDictionary Opcodes(Direction direction) { Opcode.CMSG_HOUSING_FIXTURE_DELETE_FIXTURE, 0x310007 }, { Opcode.CMSG_HOUSING_FIXTURE_SET_CORE_FIXTURE, 0x310005 }, { Opcode.CMSG_HOUSING_FIXTURE_SET_EDIT_MODE, 0x310000 }, + { Opcode.CMSG_HOUSING_HOUSE_STATUS, 0x350005 }, { Opcode.CMSG_HOUSING_GET_CURRENT_HOUSE_INFO, 0x350006 }, + { Opcode.CMSG_HOUSING_GET_PLAYER_PERMISSIONS, 0x350007 }, { Opcode.CMSG_HOUSING_RESET_KIOSK_MODE, 0x350008 }, { Opcode.CMSG_HOUSING_ROOM_ADD, 0x320001 }, { Opcode.CMSG_HOUSING_ROOM_APPLY_COMPONENT_MATERIALS, 0x320006 }, 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 baf7655c80..d6dd39efad 100644 --- a/WowPacketParser/Enums/Version/V11_2_7_64632/Opcodes_64877.cs +++ b/WowPacketParser/Enums/Version/V11_2_7_64632/Opcodes_64877.cs @@ -442,7 +442,9 @@ public static BiDictionary Opcodes(Direction direction) { Opcode.CMSG_HOUSING_FIXTURE_DELETE_FIXTURE, 0x310007 }, { Opcode.CMSG_HOUSING_FIXTURE_SET_CORE_FIXTURE, 0x310005 }, { Opcode.CMSG_HOUSING_FIXTURE_SET_EDIT_MODE, 0x310000 }, + { Opcode.CMSG_HOUSING_HOUSE_STATUS, 0x350005 }, { Opcode.CMSG_HOUSING_GET_CURRENT_HOUSE_INFO, 0x350006 }, + { Opcode.CMSG_HOUSING_GET_PLAYER_PERMISSIONS, 0x350007 }, { Opcode.CMSG_HOUSING_RESET_KIOSK_MODE, 0x350008 }, { Opcode.CMSG_HOUSING_ROOM_ADD, 0x320001 }, { Opcode.CMSG_HOUSING_ROOM_APPLY_COMPONENT_MATERIALS, 0x320006 }, 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..486f1af1d4 --- /dev/null +++ b/WowPacketParserModule.V11_0_0_55666/Parsers/HousingHandler.cs @@ -0,0 +1,347 @@ +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_REQUEST_STORAGE)] + public static void HousingDecorRequestStorage(Packet packet) + { + packet.ReadPackedGuid128("BnetAccountID"); + } + + [Parser(Opcode.CMSG_HOUSING_DECOR_DELETE_FROM_STORAGE)] + public static void HandleHousingDecorDeleteFromStorage(Packet packet) + { + packet.ReadPackedGuid128("BnetAccountID"); + packet.ReadUInt16("CatalogEntryID"); + packet.ReadUInt32("Field_10"); + } + + [Parser(Opcode.CMSG_HOUSING_DECOR_DELETE_FROM_STORAGE_BY_ID)] + public static void HandleHousingDecorDeleteFromStorageById(Packet packet) + { + packet.ReadUInt16("CatalogEntryID"); + packet.ReadUInt16("Field_4"); + } + + [Parser(Opcode.CMSG_HOUSING_DECOR_SET_DYE_SLOTS)] + public static void HousingDecorSetDyeSlots(Packet packet) + { + packet.ReadPackedGuid128("DecorGUID"); + for (var i = 0; i < 3; ++i) + { + packet.ReadInt32("DyeColorID", i); + } + } + + [Parser(Opcode.CMSG_HOUSING_DECOR_MOVE)] + public static void HandleHousingDecorMove(Packet packet) + { + packet.ReadPackedGuid128("DecorGUID"); + packet.ReadVector3("Position"); + packet.ReadVector3("Rotation"); + packet.ReadSingle("Scale"); + packet.ReadPackedGuid128("ParentDecorGUID"); + packet.ReadPackedGuid128("RoomGUID"); + packet.ReadPackedGuid128("ParentHouseFixtureGUID"); + packet.ReadInt32("PlacedComponentID"); + packet.ReadByte("AddedFlags"); + packet.ReadByte("RemovedFlags"); + packet.ReadBit("IncludeChildren"); + } + + [Parser(Opcode.CMSG_HOUSING_DECOR_REMOVE)] + public static void HousingDecorRemove(Packet packet) + { + packet.ReadPackedGuid128("DecorGUID"); + } + + [Parser(Opcode.CMSG_HOUSING_DECOR_LOCK)] + public static void HousingDecorLock(Packet packet) + { + packet.ReadPackedGuid128("DecorGUID"); + packet.ReadBool("Lock"); + } + + [Parser(Opcode.CMSG_HOUSING_DECOR_PLACE)] + public static void HousingDecorPlace(Packet packet) + { + packet.ReadPackedGuid128("DecorGUID"); + packet.ReadVector3("Position"); + packet.ReadVector3("Rotation"); + packet.ReadSingle("Scale"); + packet.ReadPackedGuid128("AttachParentGUID"); + packet.ReadPackedGuid128("RoomGUID"); + packet.ReadByte("Field_61"); + packet.ReadByte("Field_62"); + packet.ReadInt32("Field_63"); + } + + [Parser(Opcode.CMSG_HOUSING_DECOR_REDEEM_DEFERRED_DECOR)] + public static void HousingDecorRedeemDeferredDecor(Packet packet) + { + packet.ReadUInt32("CatalogEntryID"); + packet.ReadUInt32("Field_4"); + } + + [Parser(Opcode.CMSG_HOUSING_GET_PLAYER_PERMISSIONS)] + public static void HousingGetPlayerPermission(Packet packet) + { + packet.ReadByte("Field_0"); + packet.ReadPackedGuid128("HouseGUID"); + } + + [Parser(Opcode.CMSG_HOUSING_ROOM_REMOVE)] + public static void HandleHousingRoomRemove(Packet packet) + { + packet.ReadPackedGuid128("RoomGUID"); + } + + [Parser(Opcode.CMSG_HOUSING_ROOM_ROTATE)] + public static void HousingRoomRotate(Packet packet) + { + packet.ReadPackedGuid128("RoomGUID"); + packet.ReadBool("IsLeft"); + } + + [Parser(Opcode.CMSG_HOUSING_SVCS_PLAYER_VIEW_HOUSES_BY_PLAYER)] + public static void HandleHousingSvcsPlayerViewHousesByPlayer(Packet packet) + { + packet.ReadPackedGuid128("PlayerGUID"); + } + + [Parser(Opcode.CMSG_HOUSING_SVCS_GET_POTENTIAL_HOUSE_OWNERS)] + public static void HandleHousingSvcsGetPotentialHouseOwners(Packet packet) + { + packet.ReadPackedGuid128("HouseGUID"); + } + + [Parser(Opcode.CMSG_HOUSING_SVCS_GET_BNET_FRIEND_NEIGHBORHOODS)] + public static void HandleHousingSvcsGetBneFriendNeighborhoods(Packet packet) + { + packet.ReadPackedGuid128("BNetAccountGUID"); + } + + [Parser(Opcode.CMSG_NEIGHBORHOOD_OPEN_CORNERSTONE_UI)] + public static void HandleNeighborhoodOpenCornerstoneUi(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_NEIGHBORHOOD_PLAYER_ENTER_PLOT)] + public static void HandleNeighborhoodPlayerEnterPlot(Packet packet) + { + packet.ReadPackedGuid128("AreaTriggerGuid"); + } + + [Parser(Opcode.SMSG_HOUSING_GET_CURRENT_HOUSE_INFO_RESPONSE)] + public static void HandleHousingGetCurrentHouseInfoResponse(Packet packet) + { + ReadHouse(packet, "House"); + packet.ReadByteE("Result"); + } + + [Parser(Opcode.SMSG_HOUSING_GET_PLAYER_PERMISSIONS_RESPONSE)] + public static void HousingGetPlayerPermissionResponse(Packet packet) + { + packet.ReadPackedGuid128("HouseGUID"); + packet.ReadByteE("Result"); + packet.ReadByte("Field_09"); + } + + [Parser(Opcode.SMSG_HOUSING_DECOR_REQUEST_STORAGE_RESPONSE)] + public static void HousingDecorRequestStorageResponse(Packet packet) + { + packet.ReadPackedGuid128("BnetAccountID"); + packet.ReadByteE("Result"); + } + + [Parser(Opcode.SMSG_HOUSING_DECOR_SYSTEM_SET_DYE_SLOTS_RESPONSE)] + public static void HandleHousingDecorSystemSetDyeSlotsResponse(Packet packet) + { + packet.ReadPackedGuid128("DecorGUID"); + packet.ReadByteE("Result"); + } + + [Parser(Opcode.SMSG_HOUSING_DECOR_MOVE_RESPONSE)] + public static void HandleHousingDecorMoveResponse(Packet packet) + { + packet.ReadPackedGuid128("PlayerGUID"); + packet.ReadUInt32("Field_09"); + packet.ReadPackedGuid128("DecorGUID"); + packet.ReadByteE("Result"); + packet.ReadByte("Field_26"); + } + + [Parser(Opcode.SMSG_HOUSING_DECOR_REMOVE_RESPONSE)] + public static void HandleHousingDecorRemoveResponse(Packet packet) + { + packet.ReadPackedGuid128("DecorGUID"); + packet.ReadPackedGuid128("UnknownGUID"); + packet.ReadUInt32("Field_32"); + packet.ReadByteE("Result"); + } + + [Parser(Opcode.SMSG_HOUSING_DECOR_LOCK_RESPONSE)] + public static void HandleHousingDecorLockResponse(Packet packet) + { + packet.ReadPackedGuid128("DecorGUID"); + packet.ReadPackedGuid128("PlayerGUID"); + packet.ReadUInt32("Field_16"); + packet.ReadByteE("Result"); + packet.ReadBit("Locked"); + packet.ReadBit("Field_17"); + } + + [Parser(Opcode.SMSG_HOUSING_DECOR_SET_EDIT_MODE_RESPONSE)] + public static void HandleHousingDecorSetEditModeResponse(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_REDEEM_DEFERRED_DECOR_RESPONSE)] + public static void HandleHousingRedeemDeferredDecorResponse(Packet packet) + { + packet.ReadPackedGuid128("DecorGUID"); + packet.ReadByteE("Result"); + packet.ReadUInt32("Field_13"); + } + + [Parser(Opcode.SMSG_HOUSING_DECOR_PLACE_RESPONSE)] + public static void HandleHousingDecorPlaceResponse(Packet packet) + { + packet.ReadPackedGuid128("PlayerGUID"); + packet.ReadUInt32("Field_09"); + packet.ReadPackedGuid128("DecorGUID"); + packet.ReadByteE("Result"); + } + + [Parser(Opcode.SMSG_HOUSE_EXTERIOR_LOCK_RESPONSE)] + public static void HandleHousingExteriorLockResponse(Packet packet) + { + packet.ReadPackedGuid128("HouseGUID"); + packet.ReadPackedGuid128("PlayerGUID"); + packet.ReadByteE("Result"); + packet.ReadBit("IsLocked"); + } + + [Parser(Opcode.SMSG_HOUSING_FIXTURE_SET_EDIT_MODE_RESPONSE)] + public static void HandleHousingFixtureSetEditModeResponse(Packet packet) + { + packet.ReadPackedGuid128("HouseGUID"); + packet.ReadPackedGuid128("BNetAccountGUID"); + packet.ReadByteE("Result"); + } + + [Parser(Opcode.SMSG_HOUSING_ROOM_REMOVE_RESPONSE)] + public static void HandleHousingRoomRemoveResponse(Packet packet) + { + packet.ReadPackedGuid128("RoomGUID"); + packet.ReadPackedGuid128("PlayerGUID"); + packet.ReadByteE("Result"); + } + + [Parser(Opcode.SMSG_HOUSING_ROOM_SET_LAYOUT_EDIT_MODE_RESPONSE)] + public static void HandleHousingRoomSetLayoutEditModeResponse(Packet packet) + { + packet.ReadPackedGuid128("HouseGUID"); + packet.ReadByteE("Result"); + packet.ReadBool("Active"); + } + + [Parser(Opcode.SMSG_HOUSING_ROOM_UPDATE_RESPONSE)] + public static void HousingRoomUpdateResponse(Packet packet) + { + packet.ReadPackedGuid128("RoomGUID"); + packet.ReadByteE("Result"); + } + + [Parser(Opcode.SMSG_HOUSING_HOUSE_STATUS_RESPONSE)] + public static void HandleHousingHouseStatusResponse(Packet packet) + { + packet.ReadPackedGuid128("HouseGUID"); + packet.ReadPackedGuid128("BnetAccountID"); + packet.ReadPackedGuid128("OwnerGUID"); + packet.ReadUInt32("Field_024"); + } + + [Parser(Opcode.SMSG_HOUSING_SVCS_PLAYER_VIEW_HOUSES_RESPONSE)] + [Parser(Opcode.SMSG_HOUSING_SVCS_GET_PLAYER_HOUSES_INFO_RESPONSE)] + public static void HandleHousingSvcsGetHousesInfoResponse(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"); + bool result = packet.ReadBool("Result"); + if (!result) + return; + + var nameLen = packet.ReadBits(8); + packet.ReadWoWString("NeighborhoodName", nameLen); + } + + [Parser(Opcode.CMSG_HOUSING_DECOR_SET_EDIT_MODE)] + [Parser(Opcode.CMSG_HOUSING_FIXTURE_SET_EDIT_MODE)] + [Parser(Opcode.CMSG_HOUSING_ROOM_SET_LAYOUT_EDIT_MODE)] + public static void HandleHousingSetEditMode(Packet packet) + { + packet.ReadBool("Active"); + } + + [Parser(Opcode.CMSG_HOUSING_HOUSE_STATUS)] + [Parser(Opcode.CMSG_HOUSE_INTERIOR_LEAVE_HOUSE)] + [Parser(Opcode.CMSG_HOUSING_GET_CURRENT_HOUSE_INFO)] + [Parser(Opcode.CMSG_HOUSING_SVCS_GET_PLAYER_HOUSES_INFO)] + [Parser(Opcode.CMSG_HOUSING_SVCS_GET_HOUSE_FINDER_INFO)] + [Parser(Opcode.SMSG_NEIGHBORHOOD_PLAYER_LEAVE_PLOT)] + 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); + } + } +}