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/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 6cf355f782..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,31 +173,35 @@ public override ulong GetLow() public override string ToString() { - if (Low == 0 && High == 0) - return "Full: 0x0"; - - if (HasEntry()) + switch (GetHighType()) { - 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; } } @@ -260,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(); 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..4ee241ab17 --- /dev/null +++ b/WowPacketParserModule.V11_0_0_55666/Parsers/HousingHandler.cs @@ -0,0 +1,360 @@ +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("BnetAccountGUID"); + } + + [Parser(Opcode.CMSG_HOUSING_DECOR_DELETE_FROM_STORAGE)] + public static void HandleHousingDecorDeleteFromStorage(Packet packet) + { + 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.ReadUInt32("DecorID"); + } + + [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.ReadBit("LockRequest"); + packet.ReadBit("IncludeChildren"); + } + + [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.ReadPackedGuid128("ParentHouseFixtureGUID"); + packet.ReadInt32("PlacedComponentID"); + } + + [Parser(Opcode.CMSG_HOUSING_DECOR_REDEEM_DEFERRED_DECOR)] + public static void HousingDecorRedeemDeferredDecor(Packet packet) + { + packet.ReadUInt32("DecorID"); + packet.ReadUInt32("TransactionID"); + } + + [Parser(Opcode.CMSG_HOUSING_GET_PLAYER_PERMISSIONS)] + public static void HousingGetPlayerPermission(Packet packet) + { + 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.ReadBit("RotateRight"); + } + + [Parser(Opcode.CMSG_HOUSING_SVCS_PLAYER_VIEW_HOUSES_BY_PLAYER)] + public static void HandleHousingSvcsPlayerViewHousesByPlayer(Packet packet) + { + 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("FriendBNetAccountGUID"); + } + + [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("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("ClientDelay"); + packet.ReadPackedGuid128("DecorGUID"); + packet.ReadByteE("Result"); + packet.ReadBit("IncludeChildren"); + } + + [Parser(Opcode.SMSG_HOUSING_DECOR_REMOVE_RESPONSE)] + public static void HandleHousingDecorRemoveResponse(Packet packet) + { + packet.ReadPackedGuid128("DecorGUID"); + 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("ClientDelay"); + packet.ReadByteE("Result"); + 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("HouseOwnerAccountGUID"); + var playersEditing = packet.ReadUInt32("PlayerGUIDEditingCount"); + packet.ReadByteE("Result"); + + for (var i = 0; i < playersEditing; ++i) + packet.ReadPackedGuid128("PlayerGUIDEditing", i); + } + + [Parser(Opcode.SMSG_HOUSING_REDEEM_DEFERRED_DECOR_RESPONSE)] + public static void HandleHousingRedeemDeferredDecorResponse(Packet packet) + { + packet.ReadPackedGuid128("DecorGUID"); + packet.ReadByteE("Result"); + packet.ReadUInt32("TransactionID"); + } + + [Parser(Opcode.SMSG_HOUSING_DECOR_PLACE_RESPONSE)] + public static void HandleHousingDecorPlaceResponse(Packet packet) + { + packet.ReadPackedGuid128("PlayerGUID"); + packet.ReadUInt32("ClientDelay"); + 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("PlayerGUIDEditing"); + 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.ReadBit("Enabled"); + } + + [Parser(Opcode.SMSG_HOUSING_ROOM_UPDATE_RESPONSE)] + public static void HousingRoomUpdateResponse(Packet packet) + { + packet.ReadPackedGuid128("SourceRoomGUID"); + packet.ReadByteE("Result"); + } + + [Parser(Opcode.SMSG_HOUSING_HOUSE_STATUS_RESPONSE)] + public static void HandleHousingHouseStatusResponse(Packet packet) + { + packet.ReadPackedGuid128("HouseGUID"); + 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 HandleHousingSvcsGetPlayerHousesInfoResponse(Packet packet) + { + var count = packet.ReadUInt32("PlayerHousesCount"); + packet.ReadByteE("Result"); + for (uint i = 0; i < count; i++) + ReadHouse(packet, "PlayerHouse", 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 allow = packet.ReadBit("Allow"); + if (!allow) + return; + + packet.ResetBitReader(); + 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.ReadBit("IsEnabled"); + } + + [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("GUID", indexes); + packet.ReadPackedGuid128("CosmeticOwner", indexes); + packet.ReadPackedGuid128("NeighborhoodGUID", indexes); + + packet.ReadByte("PlotID", indexes); + packet.ReadUInt32("HouseSettingFlags", indexes); + + var hasHasReservationTime = packet.ReadBit("HasReservationTime", indexes); + if (hasHasReservationTime) + packet.ReadTime64("HasReservationTime", indexes); + } + } +}