From 0666611086c87327ae56fee9b6f783520ae06ab8 Mon Sep 17 00:00:00 2001 From: Luzifix Date: Fri, 19 Dec 2025 00:50:20 +0100 Subject: [PATCH 1/3] Add parsing for a bunch of housing packets --- WowPacketParser/Enums/Housing.cs | 90 +++++ .../Enums/Version/V11_2_7_64632/Opcodes.cs | 2 + .../Version/V11_2_7_64632/Opcodes_64877.cs | 2 + WowPacketParser/Misc/WowGuid.cs | 18 + .../Parsers/HousingHandler.cs | 347 ++++++++++++++++++ 5 files changed, 459 insertions(+) create mode 100644 WowPacketParser/Enums/Housing.cs create mode 100644 WowPacketParserModule.V11_0_0_55666/Parsers/HousingHandler.cs 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 6cf355f782..c2d5daf926 100644 --- a/WowPacketParser/Misc/WowGuid.cs +++ b/WowPacketParser/Misc/WowGuid.cs @@ -160,6 +160,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); + } + } +} From 7fe7aa623e2e53b5665461f6fa815387688fba3a Mon Sep 17 00:00:00 2001 From: Shauren Date: Thu, 23 Apr 2026 23:03:26 +0200 Subject: [PATCH 2/3] Update wowguid format for housing (remove wrongly named parts) --- WowPacketParser/Misc/Filters.cs | 4 +- WowPacketParser/Misc/WowGuid.cs | 78 +++++++++++++++++---------------- 2 files changed, 42 insertions(+), 40 deletions(-) diff --git a/WowPacketParser/Misc/Filters.cs b/WowPacketParser/Misc/Filters.cs index 490afde8c0..93e074268e 100644 --- a/WowPacketParser/Misc/Filters.cs +++ b/WowPacketParser/Misc/Filters.cs @@ -87,7 +87,7 @@ public static bool CheckFilter(WowGuid guid) var result = true; if (guid.HasEntry()) - result = CheckFilter(Utilities.ObjectTypeToStore(guid.GetObjectType()), (int)guid.GetEntry()); + result = CheckFilter(guid.GetStoreNameType(), (int)guid.GetEntry()); return result; } @@ -97,7 +97,7 @@ public static bool CheckFilter(WowGuid128 guid) var result = true; if (guid.GetObjectType() == ObjectType.Player || guid.HasEntry()) - result = CheckFilter(Utilities.ObjectTypeToStore(guid.GetObjectType()), (int)guid.GetEntry()); + result = CheckFilter(guid.GetStoreNameType(), (int)guid.GetEntry()); return result; } diff --git a/WowPacketParser/Misc/WowGuid.cs b/WowPacketParser/Misc/WowGuid.cs index c2d5daf926..a18f2214e8 100644 --- a/WowPacketParser/Misc/WowGuid.cs +++ b/WowPacketParser/Misc/WowGuid.cs @@ -65,6 +65,22 @@ public ObjectType GetObjectType() } } + public StoreNameType GetStoreNameType() + { + return GetHighType() switch + { + HighGuidType.Player => StoreNameType.Player, + HighGuidType.Item => StoreNameType.Item, + HighGuidType.Transport => StoreNameType.GameObject, + HighGuidType.Creature => StoreNameType.Unit, + HighGuidType.Vehicle => StoreNameType.Unit, + HighGuidType.Pet => StoreNameType.Unit, + HighGuidType.GameObject => StoreNameType.GameObject, + HighGuidType.Cast => StoreNameType.Spell, + _ => StoreNameType.None + }; + } + public static bool operator ==(WowGuid first, WowGuid other) { if (ReferenceEquals(first, other)) @@ -157,49 +173,35 @@ public override ulong GetLow() 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; - if (GetHighType() == HighGuidType.Cast) - type = StoreNameType.Spell; - else - type = Utilities.ObjectTypeToStore(GetObjectType()); - - // ReSharper disable once UseStringInterpolation - return string.Format("Full: 0x{0}{1} {2}/{3} R{4}/S{5} Map: {6} Entry: {7} Low: {8}", High.ToString("X16"), Low.ToString("X16"), - GetHighType(), GetSubType(), GetRealmId(), GetServerId(), StoreGetters.GetName(StoreNameType.Map, GetMapId()), - StoreGetters.GetName(type, (int)GetEntry()), GetLow()); + case HighGuidType.Null: return "Full: 0x0"; + case HighGuidType.Housing: return FormatHousing(); + default: + break; } - // TODO: Implement extra format for battleground, see WowGuid64.ToString() + if (HasEntry()) + return $"Full: 0x{High:X16}{Low:X16} {GetHighType()}/{GetSubType()} R{GetRealmId()}/S{GetServerId()} Map: {StoreGetters.GetName(StoreNameType.Map, GetMapId())} Entry: {StoreGetters.GetName(GetStoreNameType(), (int)GetEntry())} Low: {GetLow()}"; - string name = StoreGetters.GetName(this); + var name = StoreGetters.GetName(this); + return $"Full: 0x{High:X16}{Low:X16} {GetHighType()}/{GetSubType()} R{GetRealmId()}/S{GetServerId()} Map: {StoreGetters.GetName(StoreNameType.Map, GetMapId())} Low: {GetLow() + (string.IsNullOrEmpty(name) ? string.Empty : (" Name: " + name))}"; + } - // ReSharper disable once UseStringInterpolation - return string.Format("Full: 0x{0}{1} {2}/{3} R{4}/S{5} Map: {6} Low: {7}", High.ToString("X16"), Low.ToString("X16"), - GetHighType(), GetSubType(), GetRealmId(), GetServerId(), StoreGetters.GetName(StoreNameType.Map, GetMapId()), - GetLow() + (String.IsNullOrEmpty(name) ? String.Empty : (" Name: " + name))); + private string FormatHousing() + { + var subType = (HousingGuidType)((High >> 53) & 0x1F); + var formatted = $"Full: 0x{High:X16}{Low:X16} {GetHighType()}/{subType} "; + formatted += subType switch + { + HousingGuidType.Decor => $"Arg1: {(High >> 32) & 0xFFFF} DecorID: {High & 0xFFFFFFFF} ", + HousingGuidType.RoomComponent => $"HouseRoomID: {High & 0xFFFFFFFF} ", + HousingGuidType.House => $"Arg1: {Low & 0x7FFF} Arg2: {(Low >> 15) & 0x3F} ", + HousingGuidType.Neighborhood => $"NeighborhoodMapID: {(High >> 32) & 0xFFFF} Arg2: {High & 0xFFFFFFFF} ", + _ => $"SubType: Unknown({(byte)subType}) ", + }; + formatted += $"Low: {GetLow()}"; + return formatted; } } @@ -278,7 +280,7 @@ public override string ToString() // name next to the entry (from a database, if enabled) if (HasEntry()) { - var type = Utilities.ObjectTypeToStore(GetObjectType()); + var type = GetStoreNameType(); return "Full: 0x" + Low.ToString("X8") + " Type: " + GetHighType() + " Entry: " + StoreGetters.GetName(type, (int)GetEntry()) + " Low: " + GetLow(); From 47f44a05ee49055e42c5f398ef8c84679f0cb228 Mon Sep 17 00:00:00 2001 From: Shauren Date: Thu, 23 Apr 2026 23:52:30 +0200 Subject: [PATCH 3/3] Fix housing naming and structures --- .../Parsers/HousingHandler.cs | 173 ++++++++++-------- 1 file changed, 93 insertions(+), 80 deletions(-) diff --git a/WowPacketParserModule.V11_0_0_55666/Parsers/HousingHandler.cs b/WowPacketParserModule.V11_0_0_55666/Parsers/HousingHandler.cs index 486f1af1d4..4ee241ab17 100644 --- a/WowPacketParserModule.V11_0_0_55666/Parsers/HousingHandler.cs +++ b/WowPacketParserModule.V11_0_0_55666/Parsers/HousingHandler.cs @@ -9,24 +9,23 @@ public static class HousingHandler [Parser(Opcode.CMSG_HOUSING_DECOR_REQUEST_STORAGE)] public static void HousingDecorRequestStorage(Packet packet) { - packet.ReadPackedGuid128("BnetAccountID"); + packet.ReadPackedGuid128("BnetAccountGUID"); } - + [Parser(Opcode.CMSG_HOUSING_DECOR_DELETE_FROM_STORAGE)] public static void HandleHousingDecorDeleteFromStorage(Packet packet) { - packet.ReadPackedGuid128("BnetAccountID"); - packet.ReadUInt16("CatalogEntryID"); - packet.ReadUInt32("Field_10"); + var count = packet.ReadBits(5); + for (var i = 0; i < count; ++i) + packet.ReadPackedGuid128("DecorGUID", i); } [Parser(Opcode.CMSG_HOUSING_DECOR_DELETE_FROM_STORAGE_BY_ID)] public static void HandleHousingDecorDeleteFromStorageById(Packet packet) { - packet.ReadUInt16("CatalogEntryID"); - packet.ReadUInt16("Field_4"); + packet.ReadUInt32("DecorID"); } - + [Parser(Opcode.CMSG_HOUSING_DECOR_SET_DYE_SLOTS)] public static void HousingDecorSetDyeSlots(Packet packet) { @@ -52,7 +51,7 @@ public static void HandleHousingDecorMove(Packet packet) packet.ReadByte("RemovedFlags"); packet.ReadBit("IncludeChildren"); } - + [Parser(Opcode.CMSG_HOUSING_DECOR_REMOVE)] public static void HousingDecorRemove(Packet packet) { @@ -63,9 +62,10 @@ public static void HousingDecorRemove(Packet packet) public static void HousingDecorLock(Packet packet) { packet.ReadPackedGuid128("DecorGUID"); - packet.ReadBool("Lock"); + packet.ReadBit("LockRequest"); + packet.ReadBit("IncludeChildren"); } - + [Parser(Opcode.CMSG_HOUSING_DECOR_PLACE)] public static void HousingDecorPlace(Packet packet) { @@ -75,54 +75,54 @@ public static void HousingDecorPlace(Packet packet) packet.ReadSingle("Scale"); packet.ReadPackedGuid128("AttachParentGUID"); packet.ReadPackedGuid128("RoomGUID"); - packet.ReadByte("Field_61"); - packet.ReadByte("Field_62"); - packet.ReadInt32("Field_63"); + packet.ReadPackedGuid128("ParentHouseFixtureGUID"); + packet.ReadInt32("PlacedComponentID"); } - + [Parser(Opcode.CMSG_HOUSING_DECOR_REDEEM_DEFERRED_DECOR)] public static void HousingDecorRedeemDeferredDecor(Packet packet) { - packet.ReadUInt32("CatalogEntryID"); - packet.ReadUInt32("Field_4"); + packet.ReadUInt32("DecorID"); + packet.ReadUInt32("TransactionID"); } - + [Parser(Opcode.CMSG_HOUSING_GET_PLAYER_PERMISSIONS)] public static void HousingGetPlayerPermission(Packet packet) { - packet.ReadByte("Field_0"); - packet.ReadPackedGuid128("HouseGUID"); + var hasHouseGUID = packet.ReadBit("HasHouseGUID"); + if (hasHouseGUID) + 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"); + packet.ReadBit("RotateRight"); } - + [Parser(Opcode.CMSG_HOUSING_SVCS_PLAYER_VIEW_HOUSES_BY_PLAYER)] public static void HandleHousingSvcsPlayerViewHousesByPlayer(Packet packet) { - packet.ReadPackedGuid128("PlayerGUID"); + packet.ReadPackedGuid128("TargetPlayerGUID"); } - + [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"); + packet.ReadPackedGuid128("FriendBNetAccountGUID"); } [Parser(Opcode.CMSG_NEIGHBORHOOD_OPEN_CORNERSTONE_UI)] @@ -131,26 +131,26 @@ 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"); + 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) { @@ -158,61 +158,63 @@ public static void HousingGetPlayerPermissionResponse(Packet packet) 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.ReadPackedGuid128("BnetAccountGUID"); packet.ReadByteE("Result"); + if (ClientVersion.AddedInVersion(ClientVersionBuild.V12_0_0_65390)) + packet.ReadBit("NewDataPulled"); } - + [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.ReadUInt32("ClientDelay"); packet.ReadPackedGuid128("DecorGUID"); packet.ReadByteE("Result"); - packet.ReadByte("Field_26"); + packet.ReadBit("IncludeChildren"); } - + [Parser(Opcode.SMSG_HOUSING_DECOR_REMOVE_RESPONSE)] public static void HandleHousingDecorRemoveResponse(Packet packet) { packet.ReadPackedGuid128("DecorGUID"); - packet.ReadPackedGuid128("UnknownGUID"); - packet.ReadUInt32("Field_32"); + packet.ReadPackedGuid128("PlayerGUID"); + packet.ReadUInt32("ClientDelay"); 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.ReadUInt32("ClientDelay"); packet.ReadByteE("Result"); - packet.ReadBit("Locked"); - packet.ReadBit("Field_17"); + packet.ReadBit("IsLocked"); + packet.ReadBit("IncludeChildren"); } [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.ReadPackedGuid128("HouseOwnerAccountGUID"); + var playersEditing = packet.ReadUInt32("PlayerGUIDEditingCount"); packet.ReadByteE("Result"); - for (var i = 0; i < allowedEditorCount; ++i) - packet.ReadPackedGuid128("AllowedEditor", i); + for (var i = 0; i < playersEditing; ++i) + packet.ReadPackedGuid128("PlayerGUIDEditing", i); } [Parser(Opcode.SMSG_HOUSING_REDEEM_DEFERRED_DECOR_RESPONSE)] @@ -220,14 +222,14 @@ public static void HandleHousingRedeemDeferredDecorResponse(Packet packet) { packet.ReadPackedGuid128("DecorGUID"); packet.ReadByteE("Result"); - packet.ReadUInt32("Field_13"); + packet.ReadUInt32("TransactionID"); } [Parser(Opcode.SMSG_HOUSING_DECOR_PLACE_RESPONSE)] public static void HandleHousingDecorPlaceResponse(Packet packet) { packet.ReadPackedGuid128("PlayerGUID"); - packet.ReadUInt32("Field_09"); + packet.ReadUInt32("ClientDelay"); packet.ReadPackedGuid128("DecorGUID"); packet.ReadByteE("Result"); } @@ -245,10 +247,10 @@ public static void HandleHousingExteriorLockResponse(Packet packet) public static void HandleHousingFixtureSetEditModeResponse(Packet packet) { packet.ReadPackedGuid128("HouseGUID"); - packet.ReadPackedGuid128("BNetAccountGUID"); + packet.ReadPackedGuid128("PlayerGUIDEditing"); packet.ReadByteE("Result"); } - + [Parser(Opcode.SMSG_HOUSING_ROOM_REMOVE_RESPONSE)] public static void HandleHousingRoomRemoveResponse(Packet packet) { @@ -256,41 +258,51 @@ public static void HandleHousingRoomRemoveResponse(Packet packet) 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"); + packet.ReadBit("Enabled"); } - + [Parser(Opcode.SMSG_HOUSING_ROOM_UPDATE_RESPONSE)] public static void HousingRoomUpdateResponse(Packet packet) { - packet.ReadPackedGuid128("RoomGUID"); + packet.ReadPackedGuid128("SourceRoomGUID"); 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"); + packet.ReadPackedGuid128("HouseOwnerAccountGUID"); + packet.ReadPackedGuid128("HouseOwnerGUID"); + packet.ReadPackedGuid128("LockedDecorGUID"); + packet.ReadByteE("Result"); + packet.ReadBit("DecorEditModeEnabled"); + packet.ReadBit("LayoutEditModeEnabled"); + packet.ReadBit("FixtureEditModeEnabled"); } - + [Parser(Opcode.SMSG_HOUSING_SVCS_PLAYER_VIEW_HOUSES_RESPONSE)] + public static void HandleHousingSvcsPlayerViewHousesResponse(Packet packet) + { + var count = packet.ReadUInt32("TargetHousesCount"); + packet.ReadByteE("Result"); + for (uint i = 0; i < count; i++) + ReadHouse(packet, "TargetHouse", i); + } + [Parser(Opcode.SMSG_HOUSING_SVCS_GET_PLAYER_HOUSES_INFO_RESPONSE)] - public static void HandleHousingSvcsGetHousesInfoResponse(Packet packet) + public static void HandleHousingSvcsGetPlayerHousesInfoResponse(Packet packet) { - var count = packet.ReadUInt32("Count"); + var count = packet.ReadUInt32("PlayerHousesCount"); packet.ReadByteE("Result"); for (uint i = 0; i < count; i++) - { - ReadHouse(packet, i); - } + ReadHouse(packet, "PlayerHouse", i); } [Parser(Opcode.SMSG_INVALIDATE_NEIGHBORHOOD_NAME)] @@ -303,10 +315,11 @@ public static void HandleInvalidateNeighborhoodName(Packet packet) public static void HandleQueryNeighborhoodNameResponse(Packet packet) { packet.ReadPackedGuid128("NeighborhoodGUID"); - bool result = packet.ReadBool("Result"); - if (!result) + var allow = packet.ReadBit("Allow"); + if (!allow) return; - + + packet.ResetBitReader(); var nameLen = packet.ReadBits(8); packet.ReadWoWString("NeighborhoodName", nameLen); } @@ -316,9 +329,9 @@ public static void HandleQueryNeighborhoodNameResponse(Packet packet) [Parser(Opcode.CMSG_HOUSING_ROOM_SET_LAYOUT_EDIT_MODE)] public static void HandleHousingSetEditMode(Packet packet) { - packet.ReadBool("Active"); + packet.ReadBit("IsEnabled"); } - + [Parser(Opcode.CMSG_HOUSING_HOUSE_STATUS)] [Parser(Opcode.CMSG_HOUSE_INTERIOR_LEAVE_HOUSE)] [Parser(Opcode.CMSG_HOUSING_GET_CURRENT_HOUSE_INFO)] @@ -328,20 +341,20 @@ public static void HandleHousingSetEditMode(Packet packet) 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("GUID", indexes); + packet.ReadPackedGuid128("CosmeticOwner", indexes); packet.ReadPackedGuid128("NeighborhoodGUID", indexes); packet.ReadByte("PlotID", indexes); - packet.ReadInt32("AccessFlags", indexes); + packet.ReadUInt32("HouseSettingFlags", indexes); - var hasMoveOutTime = packet.ReadBit("HasMoveOutTime", indexes); - if (hasMoveOutTime) - packet.ReadTime64("MoveOutTime", indexes); + var hasHasReservationTime = packet.ReadBit("HasReservationTime", indexes); + if (hasHasReservationTime) + packet.ReadTime64("HasReservationTime", indexes); } } }