Adapt world seed to target defaults and preserve existing quest, logout and DB2 behavior

This commit is contained in:
Gexo91
2026-10-06 23:00:14 +03:00
parent 2514add59f
commit 415cf913ab
7 changed files with 3152 additions and 3995 deletions
File diff suppressed because it is too large Load Diff
+83 -607
View File
@@ -53,586 +53,6 @@ struct AchievementLoadInfo
static constexpr DB2LoadInfo Instance{ Fields, 19, &AchievementMeta::Instance, HOTFIX_SEL_ACHIEVEMENT };
};
struct RoomGridLineLoadInfo
{
static constexpr DB2FieldMeta Fields[7] =
{
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "OffsetX" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "OffsetY" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "OffsetZ" },
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "SizeX" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "SizeY" },
{ .IsSigned = false, .Type = FT_INT, .Name = "RoomWmoDataID" },
};
static constexpr DB2LoadInfo Instance{ Fields, 7, &RoomGridLineMeta::Instance, HOTFIX_SEL_ROOM_GRID_LINE };
};
struct RoomWmoDataLoadInfo
{
static constexpr DB2FieldMeta Fields[8] =
{
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "BoundingBoxMinX" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "BoundingBoxMinY" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "BoundingBoxMinZ" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "BoundingBoxMaxX" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "BoundingBoxMaxY" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "BoundingBoxMaxZ" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "Height" },
};
static constexpr DB2LoadInfo Instance{ Fields, 8, &RoomWmoDataMeta::Instance, HOTFIX_SEL_ROOM_WMO_DATA };
};
struct RoomComponentTextureLoadInfo
{
static constexpr DB2FieldMeta Fields[7] =
{
{ .IsSigned = false, .Type = FT_STRING, .Name = "Name" },
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "Type" },
{ .IsSigned = true, .Type = FT_INT, .Name = "FileDataID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "Flags" },
{ .IsSigned = true, .Type = FT_INT, .Name = "UiOrder" },
{ .IsSigned = false, .Type = FT_INT, .Name = "RoomComponentID" },
};
static constexpr DB2LoadInfo Instance{ Fields, 7, &RoomComponentTextureMeta::Instance, HOTFIX_SEL_ROOM_COMPONENT_TEXTURE };
};
struct RoomComponentLoadInfo
{
static constexpr DB2FieldMeta Fields[13] =
{
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "OffsetPosX" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "OffsetPosY" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "OffsetPosZ" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "OffsetRotX" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "OffsetRotY" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "OffsetRotZ" },
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = false, .Type = FT_INT, .Name = "RoomWmoDataID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "ModelFileDataID" },
{ .IsSigned = false, .Type = FT_BYTE, .Name = "Type" },
{ .IsSigned = true, .Type = FT_INT, .Name = "MeshStyleFilterID" },
{ .IsSigned = false, .Type = FT_BYTE, .Name = "ConnectionType" },
{ .IsSigned = true, .Type = FT_INT, .Name = "Flags" },
};
static constexpr DB2LoadInfo Instance{ Fields, 13, &RoomComponentMeta::Instance, HOTFIX_SEL_ROOM_COMPONENT };
};
struct RoomComponentOptionTextureLoadInfo
{
static constexpr DB2FieldMeta Fields[4] =
{
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "RoomComponentOptionID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "RoomComponentTextureID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "Flags" },
};
static constexpr DB2LoadInfo Instance{ Fields, 4, &RoomComponentOptionTextureMeta::Instance, HOTFIX_SEL_ROOM_COMPONENT_OPTION_TEXTURE };
};
struct RoomComponentOptionLoadInfo
{
static constexpr DB2FieldMeta Fields[8] =
{
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = false, .Type = FT_BYTE, .Name = "Type" },
{ .IsSigned = false, .Type = FT_BYTE, .Name = "SubType" },
{ .IsSigned = true, .Type = FT_INT, .Name = "ModelFileDataID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "RoomComponentID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "MeshStyleFilterID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "HouseThemeID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "Flags" },
};
static constexpr DB2LoadInfo Instance{ Fields, 8, &RoomComponentOptionMeta::Instance, HOTFIX_SEL_ROOM_COMPONENT_OPTION };
};
struct NeighborhoodPlotLoadInfo
{
static constexpr DB2FieldMeta Fields[26] =
{
{ .IsSigned = false, .Type = FT_LONG, .Name = "Cost" },
{ .IsSigned = false, .Type = FT_STRING_NOT_LOCALIZED, .Name = "Name" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "HousePositionX" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "HousePositionY" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "HousePositionZ" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "HouseRotationX" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "HouseRotationY" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "HouseRotationZ" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "CornerstonePositionX" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "CornerstonePositionY" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "CornerstonePositionZ" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "CornerstoneRotationX" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "CornerstoneRotationY" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "CornerstoneRotationZ" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "TeleportPositionX" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "TeleportPositionY" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "TeleportPositionZ" },
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = false, .Type = FT_INT, .Name = "NeighborhoodMapID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "Field_010" },
{ .IsSigned = true, .Type = FT_INT, .Name = "CornerstoneGameObjectID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "PlotIndex" },
{ .IsSigned = true, .Type = FT_INT, .Name = "WorldState" },
{ .IsSigned = true, .Type = FT_INT, .Name = "PlotGameObjectID" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "TeleportFacing" },
{ .IsSigned = true, .Type = FT_INT, .Name = "Field_016" },
};
static constexpr DB2LoadInfo Instance{ Fields, 26, &NeighborhoodPlotMeta::Instance, HOTFIX_SEL_NEIGHBORHOOD_PLOT };
};
struct NeighborhoodNameGenLoadInfo
{
static constexpr DB2FieldMeta Fields[5] =
{
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = false, .Type = FT_STRING, .Name = "Prefix" },
{ .IsSigned = false, .Type = FT_STRING, .Name = "Middle" },
{ .IsSigned = false, .Type = FT_STRING, .Name = "Suffix" },
{ .IsSigned = false, .Type = FT_INT, .Name = "NeighborhoodMapID" },
};
static constexpr DB2LoadInfo Instance{ Fields, 5, &NeighborhoodNameGenMeta::Instance, HOTFIX_SEL_NEIGHBORHOOD_NAME_GEN };
};
struct NeighborhoodMapLoadInfo
{
static constexpr DB2FieldMeta Fields[8] =
{
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "PositionX" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "PositionY" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "PositionZ" },
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "MapID" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "EntryRotation" },
{ .IsSigned = false, .Type = FT_INT, .Name = "UiTextureKitID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "Flags" },
};
static constexpr DB2LoadInfo Instance{ Fields, 8, &NeighborhoodMapMeta::Instance, HOTFIX_SEL_NEIGHBORHOOD_MAP };
};
struct NeighborhoodInitiativeLoadInfo
{
static constexpr DB2FieldMeta Fields[7] =
{
{ .IsSigned = false, .Type = FT_STRING, .Name = "Name" },
{ .IsSigned = false, .Type = FT_STRING, .Name = "Description" },
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "InitiativeType" },
{ .IsSigned = true, .Type = FT_INT, .Name = "Duration" },
{ .IsSigned = true, .Type = FT_INT, .Name = "RequiredParticipants" },
{ .IsSigned = true, .Type = FT_INT, .Name = "RewardCurrencyID" },
};
static constexpr DB2LoadInfo Instance{ Fields, 7, &NeighborhoodInitiativeMeta::Instance, HOTFIX_SEL_NEIGHBORHOOD_INITIATIVE };
};
struct InitiativeXTaskLoadInfo
{
static constexpr DB2FieldMeta Fields[4] =
{
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "InitiativeTaskID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "SortOrder" },
{ .IsSigned = false, .Type = FT_INT, .Name = "NeighborhoodInitiativeID" },
};
static constexpr DB2LoadInfo Instance{ Fields, 4, &InitiativeXTaskMeta::Instance, HOTFIX_SEL_INITIATIVE_X_TASK };
};
struct InitiativeTaskLoadInfo
{
static constexpr DB2FieldMeta Fields[9] =
{
{ .IsSigned = false, .Type = FT_STRING, .Name = "Name" },
{ .IsSigned = false, .Type = FT_STRING, .Name = "Description" },
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "CriteriaTreeID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "QuestID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "ProgressContributionAmount" },
{ .IsSigned = true, .Type = FT_INT, .Name = "RepetitionContributionDampeningCurve" },
{ .IsSigned = true, .Type = FT_INT, .Name = "Supersedes" },
{ .IsSigned = true, .Type = FT_INT, .Name = "Field_12_0_0_63534_008" },
};
static constexpr DB2LoadInfo Instance{ Fields, 9, &InitiativeTaskMeta::Instance, HOTFIX_SEL_INITIATIVE_TASK };
};
struct InitiativeRewardXMilestoneLoadInfo
{
static constexpr DB2FieldMeta Fields[3] =
{
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "InitiativeRewardID" },
{ .IsSigned = false, .Type = FT_INT, .Name = "InitiativeMilestoneID" },
};
static constexpr DB2LoadInfo Instance{ Fields, 3, &InitiativeRewardXMilestoneMeta::Instance, HOTFIX_SEL_INITIATIVE_REWARD_X_MILESTONE };
};
struct InitiativeRewardLoadInfo
{
static constexpr DB2FieldMeta Fields[9] =
{
{ .IsSigned = true, .Type = FT_LONG, .Name = "Money" },
{ .IsSigned = false, .Type = FT_STRING, .Name = "Title" },
{ .IsSigned = false, .Type = FT_STRING, .Name = "Description" },
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "DecorID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "DecorQuantity" },
{ .IsSigned = true, .Type = FT_INT, .Name = "Field_12_0_0_63534_006" },
{ .IsSigned = true, .Type = FT_INT, .Name = "Favor" },
{ .IsSigned = true, .Type = FT_INT, .Name = "RewardQuestID" },
};
static constexpr DB2LoadInfo Instance{ Fields, 9, &InitiativeRewardMeta::Instance, HOTFIX_SEL_INITIATIVE_REWARD };
};
struct InitiativeMilestoneLoadInfo
{
static constexpr DB2FieldMeta Fields[5] =
{
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "MilestoneOrderIndex" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "RequiredContributionAmount" },
{ .IsSigned = true, .Type = FT_INT, .Name = "Field_12_0_0_63534_003" },
{ .IsSigned = false, .Type = FT_INT, .Name = "NeighborhoodInitiativeID" },
};
static constexpr DB2LoadInfo Instance{ Fields, 5, &InitiativeMilestoneMeta::Instance, HOTFIX_SEL_INITIATIVE_MILESTONE };
};
struct InitiativeCycleLoadInfo
{
static constexpr DB2FieldMeta Fields[6] =
{
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "RewardGroupID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "CycleIndex" },
{ .IsSigned = true, .Type = FT_INT, .Name = "StartDay" },
{ .IsSigned = true, .Type = FT_INT, .Name = "HouseXPCap" },
{ .IsSigned = true, .Type = FT_INT, .Name = "InitiativeID" },
};
static constexpr DB2LoadInfo Instance{ Fields, 6, &InitiativeCycleMeta::Instance, HOTFIX_SEL_INITIATIVE_CYCLE };
};
struct InitiativeCyclePriorityLoadInfo
{
static constexpr DB2FieldMeta Fields[5] =
{
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "Priority" },
{ .IsSigned = true, .Type = FT_INT, .Name = "Weight" },
{ .IsSigned = true, .Type = FT_INT, .Name = "Flags" },
{ .IsSigned = false, .Type = FT_INT, .Name = "InitiativeCycleID" },
};
static constexpr DB2LoadInfo Instance{ Fields, 5, &InitiativeCyclePriorityMeta::Instance, HOTFIX_SEL_INITIATIVE_CYCLE_PRIORITY };
};
struct HouseThemeLoadInfo
{
static constexpr DB2FieldMeta Fields[4] =
{
{ .IsSigned = false, .Type = FT_STRING, .Name = "Name" },
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "Flags" },
{ .IsSigned = true, .Type = FT_INT, .Name = "ParentThemeID" },
};
static constexpr DB2LoadInfo Instance{ Fields, 4, &HouseThemeMeta::Instance, HOTFIX_SEL_HOUSE_THEME };
};
struct HouseRoomLoadInfo
{
static constexpr DB2FieldMeta Fields[10] =
{
{ .IsSigned = false, .Type = FT_STRING, .Name = "Name" },
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = true, .Type = FT_BYTE, .Name = "Size" },
{ .IsSigned = true, .Type = FT_INT, .Name = "Flags" },
{ .IsSigned = true, .Type = FT_INT, .Name = "Field_002" },
{ .IsSigned = true, .Type = FT_INT, .Name = "RoomWmoDataID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "UiTextureAtlasElementID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "WeightCost" },
{ .IsSigned = true, .Type = FT_INT, .Name = "ItemID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "SortPriority" },
};
static constexpr DB2LoadInfo Instance{ Fields, 10, &HouseRoomMeta::Instance, HOTFIX_SEL_HOUSE_ROOM };
};
struct HouseLevelRewardInfoLoadInfo
{
static constexpr DB2FieldMeta Fields[6] =
{
{ .IsSigned = false, .Type = FT_STRING, .Name = "Name" },
{ .IsSigned = false, .Type = FT_STRING, .Name = "Description" },
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "HouseLevelDataID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "Field_12_0_0_63967_004" },
{ .IsSigned = true, .Type = FT_INT, .Name = "IconFileDataID" },
};
static constexpr DB2LoadInfo Instance{ Fields, 6, &HouseLevelRewardInfoMeta::Instance, HOTFIX_SEL_HOUSE_LEVEL_REWARD_INFO };
};
struct HouseLevelDataLoadInfo
{
static constexpr DB2FieldMeta Fields[4] =
{
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "Level" },
{ .IsSigned = true, .Type = FT_INT, .Name = "QuestID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "Field_12_0_7_67808_003" },
};
static constexpr DB2LoadInfo Instance{ Fields, 4, &HouseLevelDataMeta::Instance, HOTFIX_SEL_HOUSE_LEVEL_DATA };
};
struct HouseExteriorWmoDataLoadInfo
{
static constexpr DB2FieldMeta Fields[5] =
{
{ .IsSigned = false, .Type = FT_STRING, .Name = "Name" },
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "Flags" },
{ .IsSigned = true, .Type = FT_INT, .Name = "Field_003" },
{ .IsSigned = true, .Type = FT_INT, .Name = "Field_004" },
};
static constexpr DB2LoadInfo Instance{ Fields, 5, &HouseExteriorWmoDataMeta::Instance, HOTFIX_SEL_HOUSE_EXTERIOR_WMO_DATA };
};
struct HouseDecorThemeSetLoadInfo
{
static constexpr DB2FieldMeta Fields[4] =
{
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = false, .Type = FT_STRING, .Name = "Name" },
{ .IsSigned = true, .Type = FT_INT, .Name = "ThemeID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "IconFileDataID" },
};
static constexpr DB2LoadInfo Instance{ Fields, 4, &HouseDecorThemeSetMeta::Instance, HOTFIX_SEL_HOUSE_DECOR_THEME_SET };
};
struct HouseDecorLoadInfo
{
static constexpr DB2FieldMeta Fields[19] =
{
{ .IsSigned = false, .Type = FT_STRING, .Name = "Name" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "InitialRotationX" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "InitialRotationY" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "InitialRotationZ" },
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "GameObjectID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "Flags" },
{ .IsSigned = false, .Type = FT_BYTE, .Name = "Type" },
{ .IsSigned = false, .Type = FT_BYTE, .Name = "ModelType" },
{ .IsSigned = true, .Type = FT_INT, .Name = "ModelFileDataID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "ThumbnailFileDataID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "WeightCost" },
{ .IsSigned = true, .Type = FT_INT, .Name = "ItemID" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "InitialScale" },
{ .IsSigned = true, .Type = FT_INT, .Name = "FirstAcquisitionBonus" },
{ .IsSigned = true, .Type = FT_INT, .Name = "OrderIndex" },
{ .IsSigned = true, .Type = FT_BYTE, .Name = "Size" },
{ .IsSigned = true, .Type = FT_INT, .Name = "StartingQuantity" },
{ .IsSigned = true, .Type = FT_INT, .Name = "UiModelSceneID" },
};
static constexpr DB2LoadInfo Instance{ Fields, 19, &HouseDecorMeta::Instance, HOTFIX_SEL_HOUSE_DECOR };
};
struct HouseDecorMaterialLoadInfo
{
static constexpr DB2FieldMeta Fields[6] =
{
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = false, .Type = FT_LONG, .Name = "WMOMaterialReference" },
{ .IsSigned = true, .Type = FT_INT, .Name = "MaterialTextureIndex" },
{ .IsSigned = true, .Type = FT_INT, .Name = "HouseThemeID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "TextureAFileDataID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "TextureBFileDataID" },
};
static constexpr DB2LoadInfo Instance{ Fields, 6, &HouseDecorMaterialMeta::Instance, HOTFIX_SEL_HOUSE_DECOR_MATERIAL };
};
struct ExteriorComponentXGroupLoadInfo
{
static constexpr DB2FieldMeta Fields[3] =
{
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "ExteriorComponentGroupID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "ExteriorComponentID" },
};
static constexpr DB2LoadInfo Instance{ Fields, 3, &ExteriorComponentXGroupMeta::Instance, HOTFIX_SEL_EXTERIOR_COMPONENT_X_GROUP };
};
struct ExteriorComponentTypeLoadInfo
{
static constexpr DB2FieldMeta Fields[3] =
{
{ .IsSigned = false, .Type = FT_STRING, .Name = "Name" },
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "ParentComponentType" },
};
static constexpr DB2LoadInfo Instance{ Fields, 3, &ExteriorComponentTypeMeta::Instance, HOTFIX_SEL_EXTERIOR_COMPONENT_TYPE };
};
struct ExteriorComponentLoadInfo
{
static constexpr DB2FieldMeta Fields[16] =
{
{ .IsSigned = false, .Type = FT_STRING, .Name = "Name" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "PositionX" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "PositionY" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "PositionZ" },
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = false, .Type = FT_BYTE, .Name = "Size" },
{ .IsSigned = false, .Type = FT_INT, .Name = "HouseExteriorWmoDataID" }, // ParentIndexField - must be unsigned
{ .IsSigned = true, .Type = FT_INT, .Name = "ParentComponentID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "ModelFileDataID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "Flags" },
{ .IsSigned = false, .Type = FT_BYTE, .Name = "Field_7" },
{ .IsSigned = false, .Type = FT_BYTE, .Name = "Type" },
{ .IsSigned = true, .Type = FT_INT, .Name = "Field_9" },
{ .IsSigned = true, .Type = FT_INT, .Name = "GameObjectID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "Field_11" },
{ .IsSigned = true, .Type = FT_INT, .Name = "ItemID" }, // references Item.ID
};
static constexpr DB2LoadInfo Instance{ Fields, 16, &ExteriorComponentMeta::Instance, HOTFIX_SEL_EXTERIOR_COMPONENT };
};
struct ExteriorComponentHookLoadInfo
{
static constexpr DB2FieldMeta Fields[9] =
{
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "PositionX" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "PositionY" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "PositionZ" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "RotationX" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "RotationY" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "RotationZ" },
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "ExteriorComponentTypeID" },
{ .IsSigned = false, .Type = FT_INT, .Name = "ExteriorComponentID" }, // ParentIndexField - must be unsigned
};
static constexpr DB2LoadInfo Instance{ Fields, 9, &ExteriorComponentHookMeta::Instance, HOTFIX_SEL_EXTERIOR_COMPONENT_HOOK };
};
struct ExteriorComponentGroupXHookLoadInfo
{
static constexpr DB2FieldMeta Fields[3] =
{
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = false, .Type = FT_INT, .Name = "ExteriorComponentGroupID" }, // ParentIndexField - must be unsigned
{ .IsSigned = true, .Type = FT_INT, .Name = "ExteriorComponentHookID" },
};
static constexpr DB2LoadInfo Instance{ Fields, 3, &ExteriorComponentGroupXHookMeta::Instance, HOTFIX_SEL_EXTERIOR_COMPONENT_GROUP_X_HOOK };
};
struct ExteriorComponentGroupLoadInfo
{
static constexpr DB2FieldMeta Fields[5] =
{
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "PositionX" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "PositionY" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "PositionZ" },
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = false, .Type = FT_INT, .Name = "HouseExteriorWmoDataID" }, // ParentIndexField
};
static constexpr DB2LoadInfo Instance{ Fields, 5, &ExteriorComponentGroupMeta::Instance, HOTFIX_SEL_EXTERIOR_COMPONENT_GROUP };
};
struct ExteriorComponentExitPointLoadInfo
{
static constexpr DB2FieldMeta Fields[8] =
{
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "PositionX" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "PositionY" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "PositionZ" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "RotationX" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "RotationY" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "RotationZ" },
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = false, .Type = FT_INT, .Name = "ExteriorComponentID" }, // ParentIndexField - must be unsigned
};
static constexpr DB2LoadInfo Instance{ Fields, 8, &ExteriorComponentExitPointMeta::Instance, HOTFIX_SEL_EXTERIOR_COMPONENT_EXIT_POINT };
};
struct DecorXDecorSubcategoryLoadInfo
{
static constexpr DB2FieldMeta Fields[3] =
{
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = false, .Type = FT_INT, .Name = "HouseDecorID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "DecorSubcategoryID" },
};
static constexpr DB2LoadInfo Instance{ Fields, 3, &DecorXDecorSubcategoryMeta::Instance, HOTFIX_SEL_DECOR_X_DECOR_SUBCATEGORY };
};
struct DecorSubcategoryLoadInfo
{
static constexpr DB2FieldMeta Fields[5] =
{
{ .IsSigned = false, .Type = FT_STRING, .Name = "Name" },
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "UiTextureAtlasElementID" },
{ .IsSigned = false, .Type = FT_INT, .Name = "DecorCategoryID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "OrderIndex" },
};
static constexpr DB2LoadInfo Instance{ Fields, 5, &DecorSubcategoryMeta::Instance, HOTFIX_SEL_DECOR_SUBCATEGORY };
};
struct DecorDyeSlotLoadInfo
{
static constexpr DB2FieldMeta Fields[5] =
{
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "DyeColorCategoryID" },
{ .IsSigned = false, .Type = FT_INT, .Name = "HouseDecorID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "OrderIndex" },
{ .IsSigned = true, .Type = FT_INT, .Name = "Channel" },
};
static constexpr DB2LoadInfo Instance{ Fields, 5, &DecorDyeSlotMeta::Instance, HOTFIX_SEL_DECOR_DYE_SLOT };
};
struct DecorCategoryLoadInfo
{
static constexpr DB2FieldMeta Fields[4] =
{
{ .IsSigned = false, .Type = FT_STRING, .Name = "Name" },
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "UiTextureAtlasElementID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "OrderIndex" },
};
static constexpr DB2LoadInfo Instance{ Fields, 4, &DecorCategoryMeta::Instance, HOTFIX_SEL_DECOR_CATEGORY };
};
struct AchievementCategoryLoadInfo
{
static constexpr DB2FieldMeta Fields[4] =
@@ -2353,33 +1773,57 @@ struct DataTagXHouseDecorRecordLoadInfo
static constexpr DB2LoadInfo Instance{ Fields, 3, &DataTagXHouseDecorRecordMeta::Instance, HOTFIX_SEL_DATA_TAG_X_HOUSE_DECOR_RECORD };
};
struct DyeColorLoadInfo
struct DecorCategoryLoadInfo
{
// DyeColorCategoryID is the ParentIndexField; must be unsigned or DB2 loading is aborted
static constexpr DB2FieldMeta Fields[8] =
static constexpr DB2FieldMeta Fields[4] =
{
{ .IsSigned = false, .Type = FT_STRING, .Name = "Name" },
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = false, .Type = FT_INT, .Name = "DyeColorCategoryID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "GradientTextureIndex" },
{ .IsSigned = true, .Type = FT_INT, .Name = "ItemID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "SwatchColorStart" },
{ .IsSigned = true, .Type = FT_INT, .Name = "SwatchColorEnd" },
{ .IsSigned = true, .Type = FT_INT, .Name = "SortOrder" },
{ .IsSigned = true, .Type = FT_INT, .Name = "UiTextureAtlasElementID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "OrderIndex" },
};
static constexpr DB2LoadInfo Instance{ Fields, 8, &DyeColorMeta::Instance, HOTFIX_SEL_DYE_COLOR };
static constexpr DB2LoadInfo Instance{ Fields, 4, &DecorCategoryMeta::Instance, HOTFIX_SEL_DECOR_CATEGORY };
};
struct DyeColorCategoryLoadInfo
struct DecorDyeSlotLoadInfo
{
static constexpr DB2FieldMeta Fields[2] =
static constexpr DB2FieldMeta Fields[5] =
{
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "DyeColorCategoryID" },
{ .IsSigned = false, .Type = FT_INT, .Name = "HouseDecorID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "OrderIndex" },
{ .IsSigned = true, .Type = FT_INT, .Name = "Channel" },
};
static constexpr DB2LoadInfo Instance{ Fields, 5, &DecorDyeSlotMeta::Instance, HOTFIX_SEL_DECOR_DYE_SLOT };
};
struct DecorSubcategoryLoadInfo
{
static constexpr DB2FieldMeta Fields[5] =
{
{ .IsSigned = false, .Type = FT_STRING, .Name = "Name" },
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "UiTextureAtlasElementID" },
{ .IsSigned = false, .Type = FT_INT, .Name = "DecorCategoryID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "OrderIndex" },
};
static constexpr DB2LoadInfo Instance{ Fields, 2, &DyeColorCategoryMeta::Instance, HOTFIX_SEL_DYE_COLOR_CATEGORY };
static constexpr DB2LoadInfo Instance{ Fields, 5, &DecorSubcategoryMeta::Instance, HOTFIX_SEL_DECOR_SUBCATEGORY };
};
struct DecorXDecorSubcategoryLoadInfo
{
static constexpr DB2FieldMeta Fields[3] =
{
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = false, .Type = FT_INT, .Name = "HouseDecorID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "DecorSubcategoryID" },
};
static constexpr DB2LoadInfo Instance{ Fields, 3, &DecorXDecorSubcategoryMeta::Instance, HOTFIX_SEL_DECOR_X_DECOR_SUBCATEGORY };
};
struct DestructibleModelDataLoadInfo
@@ -3496,20 +2940,6 @@ struct HouseLoadInfo
static constexpr DB2LoadInfo Instance{ Fields, 5, &HouseMeta::Instance, HOTFIX_SEL_HOUSE };
};
struct ImportPriceArmorLoadInfo
{
static constexpr DB2FieldMeta Fields[5] =
{
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = false, .Type = FT_STRING_NOT_LOCALIZED, .Name = "InternalName" },
{ .IsSigned = true, .Type = FT_INT, .Name = "HouseTypeID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "MapID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "Flags" },
};
static constexpr DB2LoadInfo Instance{ Fields, 5, &HouseMeta::Instance, HOTFIX_SEL_HOUSE };
};
struct HouseDecorLoadInfo
{
static constexpr DB2FieldMeta Fields[19] =
@@ -10195,4 +9625,50 @@ struct BattlePetStateLoadInfo
static constexpr DB2LoadInfo Instance{ Fields, 4, &BattlePetStateMeta::Instance, HOTFIX_SEL_BATTLE_PET_STATE };
};
struct RoomGridLineLoadInfo
{
static constexpr DB2FieldMeta Fields[7] =
{
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "OffsetX" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "OffsetY" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "OffsetZ" },
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "SizeX" },
{ .IsSigned = false, .Type = FT_FLOAT, .Name = "SizeY" },
{ .IsSigned = false, .Type = FT_INT, .Name = "RoomWmoDataID" },
};
static constexpr DB2LoadInfo Instance{ Fields, 7, &RoomGridLineMeta::Instance, HOTFIX_SEL_ROOM_GRID_LINE };
};
struct DyeColorLoadInfo
{
// DyeColorCategoryID is the ParentIndexField; must be unsigned or DB2 loading is aborted
static constexpr DB2FieldMeta Fields[8] =
{
{ .IsSigned = false, .Type = FT_STRING, .Name = "Name" },
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
{ .IsSigned = false, .Type = FT_INT, .Name = "DyeColorCategoryID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "GradientTextureIndex" },
{ .IsSigned = true, .Type = FT_INT, .Name = "ItemID" },
{ .IsSigned = true, .Type = FT_INT, .Name = "SwatchColorStart" },
{ .IsSigned = true, .Type = FT_INT, .Name = "SwatchColorEnd" },
{ .IsSigned = true, .Type = FT_INT, .Name = "SortOrder" },
};
static constexpr DB2LoadInfo Instance{ Fields, 8, &DyeColorMeta::Instance, HOTFIX_SEL_DYE_COLOR };
};
struct DyeColorCategoryLoadInfo
{
static constexpr DB2FieldMeta Fields[2] =
{
{ .IsSigned = false, .Type = FT_STRING, .Name = "Name" },
{ .IsSigned = false, .Type = FT_INT, .Name = "ID" },
};
static constexpr DB2LoadInfo Instance{ Fields, 2, &DyeColorCategoryMeta::Instance, HOTFIX_SEL_DYE_COLOR_CATEGORY };
};
#endif // TRINITYCORE_DB2_LOAD_INFO_H
+56 -393
View File
@@ -48,389 +48,6 @@ struct AchievementEntry
int32 LegacyAfterTimeEvent; // category changes clientside to Legacy after this TimeEvent is passed
};
// One rectangle of a room's floor footprint on the layout grid; round and cross-shaped rooms have several
struct RoomGridLineEntry
{
DBCPosition3D Offset;
uint32 ID;
float SizeX;
float SizeY;
uint32 RoomWmoDataID; // ParentIndexField
};
struct RoomWmoDataEntry
{
uint32 ID;
float BoundingBoxMinX;
float BoundingBoxMinY;
float BoundingBoxMinZ;
float BoundingBoxMaxX;
float BoundingBoxMaxY;
float BoundingBoxMaxZ;
float Height;
};
struct RoomComponentTextureEntry
{
LocalizedString Name;
uint32 ID;
int32 Type;
int32 FileDataID;
int32 Flags;
int32 UiOrder;
uint32 RoomComponentID; // ParentIndexField
};
struct RoomComponentEntry
{
DBCPosition3D OffsetPos;
DBCPosition3D OffsetRot;
uint32 ID;
int32 RoomWmoDataID;
int32 ModelFileDataID;
uint8 Type;
int32 MeshStyleFilterID;
uint8 ConnectionType;
int32 Flags;
};
struct RoomComponentOptionTextureEntry
{
uint32 ID;
int32 RoomComponentOptionID;
int32 RoomComponentTextureID;
int32 Flags;
};
struct RoomComponentOptionEntry
{
uint32 ID;
uint8 Type;
uint8 SubType;
int32 ModelFileDataID;
int32 RoomComponentID;
int32 MeshStyleFilterID;
int32 HouseThemeID;
int32 Flags;
};
struct NeighborhoodPlotEntry
{
uint64 Cost;
char const* Name;
DBCPosition3D HousePosition;
DBCPosition3D HouseRotation;
DBCPosition3D CornerstonePosition;
DBCPosition3D CornerstoneRotation;
DBCPosition3D TeleportPosition;
uint32 ID;
uint32 NeighborhoodMapID;
int32 Field_010;
int32 CornerstoneGameObjectID;
int32 PlotIndex;
int32 WorldState;
int32 PlotGameObjectID;
float TeleportFacing; // facing angle at TeleportPosition
int32 Field_016;
};
struct NeighborhoodNameGenEntry
{
uint32 ID;
LocalizedString Prefix;
LocalizedString Middle;
LocalizedString Suffix;
uint32 NeighborhoodMapID;
};
struct NeighborhoodMapEntry
{
DBCPosition3D Position;
uint32 ID;
int32 MapID;
float EntryRotation;
uint32 UiTextureKitID;
int32 Flags;
};
struct NeighborhoodInitiativeEntry
{
LocalizedString Name;
LocalizedString Description;
uint32 ID;
int32 InitiativeType;
int32 Duration;
int32 RequiredParticipants;
int32 RewardCurrencyID;
};
struct InitiativeXTaskEntry
{
uint32 ID;
int32 InitiativeTaskID;
int32 SortOrder;
uint32 NeighborhoodInitiativeID; // ParentIndexField
};
struct InitiativeTaskEntry
{
LocalizedString TaskName;
LocalizedString Description;
uint32 ID;
int32 CriteriaTreeID;
int32 QuestID;
int32 ProgressContributionAmount;
int32 RepetitionContributionDampeningCurve;
int32 Supersedes;
int32 Field_8; // WoWDBDefs: Field_12_0_0_63534_008
};
struct InitiativeRewardXMilestoneEntry
{
uint32 ID;
int32 InitiativeRewardID;
uint32 InitiativeMilestoneID; // ParentIndexField
};
struct InitiativeRewardEntry
{
int64 Money;
LocalizedString Title;
LocalizedString Description;
uint32 ID;
int32 DecorID;
int32 DecorQuantity;
int32 Field_6; // WoWDBDefs: Field_12_0_0_63534_006
int32 Favor;
int32 RewardQuestID;
};
struct InitiativeMilestoneEntry
{
uint32 ID;
int32 MilestoneOrderIndex;
float RequiredContributionAmount;
int32 Field_3; // WoWDBDefs: Field_12_0_0_63534_003
uint32 NeighborhoodInitiativeID; // ParentIndexField
};
struct InitiativeCycleEntry
{
uint32 ID;
int32 RewardGroupID; // Unknown FK (values 600-2607), not NeighborhoodInitiative
int32 CycleIndex;
int32 StartDay;
int32 HouseXPCap;
int32 InitiativeID; // FK -> NeighborhoodInitiative.ID
};
struct InitiativeCyclePriorityEntry
{
uint32 ID;
int32 Priority;
int32 Weight;
int32 Flags;
uint32 InitiativeCycleID; // ParentIndexField
};
struct HouseThemeEntry
{
LocalizedString Name;
uint32 ID;
int32 Flags;
int32 ParentThemeID;
};
struct HouseRoomEntry
{
// 12.1.0 client meta places Name before ID and appends a trailing SortPriority field
LocalizedString Name;
uint32 ID;
int8 Size;
int32 Flags;
int32 Field_002;
int32 RoomWmoDataID;
int32 UiTextureAtlasElementID;
int32 WeightCost;
int32 ItemID;
int32 SortPriority;
};
struct HouseLevelRewardInfoEntry
{
LocalizedString Name;
LocalizedString Description;
uint32 ID;
int32 HouseLevelDataID;
int32 Field_4; // WoWDBDefs: Field_12_0_0_63967_004
int32 IconFileDataID;
};
struct HouseLevelDataEntry
{
uint32 ID;
int32 Level;
int32 QuestID;
int32 Field_12_0_7_67808_003; // added in 12.0.7, unnamed in all sources
};
struct HouseExteriorWmoDataEntry
{
LocalizedString Name;
uint32 ID;
int32 Flags;
int32 Field_003;
int32 Field_004;
};
struct HouseDecorThemeSetEntry
{
uint32 ID;
LocalizedString Name;
int32 ThemeID;
int32 IconFileDataID;
};
struct HouseDecorEntry
{
LocalizedString Name;
DBCPosition3D InitialRotation;
uint32 ID;
int32 GameObjectID;
int32 Flags;
uint8 Type;
uint8 ModelType;
int32 ModelFileDataID;
int32 ThumbnailFileDataID;
int32 WeightCost;
int32 ItemID;
float InitialScale;
int32 FirstAcquisitionBonus; // house XP gained on first acquisition (per Lua API)
int32 OrderIndex;
int8 Size; // HousingCatalogEntrySize
int32 StartingQuantity;
int32 UiModelSceneID;
};
struct HouseDecorMaterialEntry
{
uint32 ID;
uint64 WMOMaterialReference;
int32 MaterialTextureIndex;
int32 HouseThemeID;
int32 TextureAFileDataID;
int32 TextureBFileDataID;
};
struct ExteriorComponentXGroupEntry
{
uint32 ID;
int32 ExteriorComponentGroupID;
int32 ExteriorComponentID;
};
struct ExteriorComponentTypeEntry
{
uint32 ID;
LocalizedString Name;
int32 ParentComponentType;
};
struct ExteriorComponentEntry
{
// HouseExteriorWmoDataID is the ParentIndexField and sits mid-record, right after Size
LocalizedString Name;
std::array<float, 3> Position;
uint32 ID;
uint8 Size;
uint32 HouseExteriorWmoDataID; // ParentIndexField - must be unsigned
int32 ParentComponentID; // references another ExteriorComponent (0 for defaults)
int32 ModelFileDataID;
int32 Flags; // 0x1 IsDefaultFixture, 0x2 UnlockedByDefault
uint8 Field_7; // unknown (always 1)
uint8 Type; // references ExteriorComponentType
int32 Field_9;
int32 GameObjectID;
int32 Field_11; // WoWDBDefs: Field_11_2_7_64044_011
int32 ItemID; // references Item.ID - component can be sold/earned as an item, like HouseDecor.ItemID
};
struct ExteriorComponentHookEntry
{
std::array<float, 3> Position;
std::array<float, 3> Rotation;
uint32 ID;
int32 ExteriorComponentTypeID;
uint32 ExteriorComponentID; // ParentIndexField
};
struct ExteriorComponentGroupXHookEntry
{
uint32 ID;
uint32 ExteriorComponentGroupID; // ParentIndexField
int32 ExteriorComponentHookID;
};
struct ExteriorComponentGroupEntry
{
std::array<float, 3> Position;
uint32 ID;
uint32 HouseExteriorWmoDataID; // ParentIndexField
};
struct ExteriorComponentExitPointEntry
{
std::array<float, 3> Position;
std::array<float, 3> Rotation;
uint32 ID;
uint32 ExteriorComponentID; // ParentIndexField
};
struct DyeColorEntry
{
LocalizedString Name;
uint32 ID;
uint32 DyeColorCategoryID; // ParentIndexField - must be unsigned
int32 GradientTextureIndex;
int32 ItemID;
int32 SwatchColorStart;
int32 SwatchColorEnd;
int32 SortOrder;
};
struct DecorXDecorSubcategoryEntry
{
uint32 ID;
uint32 HouseDecorID;
int32 DecorSubcategoryID;
};
struct DecorSubcategoryEntry
{
LocalizedString Name;
uint32 ID;
int32 UiTextureAtlasElementID;
int32 DecorCategoryID;
int32 OrderIndex;
};
struct DecorDyeSlotEntry
{
uint32 ID;
int32 DyeColorCategoryID;
int32 HouseDecorID; // nullable
int32 OrderIndex;
int32 Channel;
};
struct DecorCategoryEntry
{
LocalizedString Name;
uint32 ID;
int32 UiTextureAtlasElementID;
int32 OrderIndex;
};
struct Achievement_CategoryEntry
{
LocalizedString Name;
@@ -1956,10 +1573,37 @@ struct DataTagXHouseDecorRecordEntry
int32 HouseDecorID;
};
struct DyeColorCategoryEntry
struct DecorCategoryEntry
{
LocalizedString Name;
uint32 ID;
int32 UiTextureAtlasElementID;
int32 OrderIndex;
};
struct DecorDyeSlotEntry
{
uint32 ID;
int32 DyeColorCategoryID;
int32 HouseDecorID; // nullable
int32 OrderIndex;
int32 Channel;
};
struct DecorSubcategoryEntry
{
LocalizedString Name;
uint32 ID;
int32 UiTextureAtlasElementID;
int32 DecorCategoryID;
int32 OrderIndex;
};
struct DecorXDecorSubcategoryEntry
{
uint32 ID;
uint32 HouseDecorID;
int32 DecorSubcategoryID;
};
struct DestructibleModelDataEntry
@@ -3136,15 +2780,6 @@ struct HouseEntry
int32 Flags;
};
struct ImportPriceArmorEntry
{
uint32 ID;
char const* InternalName;
int32 HouseTypeID;
int32 MapID;
int32 Flags;
};
struct HouseDecorEntry
{
LocalizedString Name;
@@ -7157,4 +6792,32 @@ struct QuestV2CliTaskEntry
};
//WowCommunity
#pragma pack(pop)
struct RoomGridLineEntry
{
DBCPosition3D Offset;
uint32 ID;
float SizeX;
float SizeY;
uint32 RoomWmoDataID; // ParentIndexField
};
struct DyeColorEntry
{
LocalizedString Name;
uint32 ID;
uint32 DyeColorCategoryID; // ParentIndexField - must be unsigned
int32 GradientTextureIndex;
int32 ItemID;
int32 SwatchColorStart;
int32 SwatchColorEnd;
int32 SortOrder;
};
struct DyeColorCategoryEntry
{
LocalizedString Name;
uint32 ID;
};
#endif
+153 -65
View File
@@ -15506,6 +15506,11 @@ void Player::RewardQuest(Quest const* quest, LootItemType rewardType, uint32 rew
uint32 quest_id = quest->GetQuestId();
QuestStatus oldStatus = GetQuestStatus(quest_id);
// A turned-in calling frees its slot on the board straight away; the replacement arrives at the next daily
// reset. The client agrees with this ordering - it re-requests the callings on QUEST_TURNED_IN.
if (quest->GetQuestTag() == QuestTagType::CovenantCalling)
OnCovenantCallingCompleted(quest_id);
if (quest->IsDaily() || quest->IsDFQuest())
{
SetDailyQuestStatus(quest_id);
@@ -15530,21 +15535,28 @@ void Player::RewardQuest(Quest const* quest, LootItemType rewardType, uint32 rew
SetQuestCompletedBit(quest_id, true);
//WowCommunity
// Phase 10F - if this quest is a Campaign.Completed marker, auto-grant the
// Campaign.RewardQuestID to the player (retail behavior).
QuestMgr::OnQuestCompletedHandleCampaignReward(this, quest_id);
//WowCommunity
for (QuestObjective const& obj : quest->GetObjectives())
{
switch (obj.Type)
{
case QUEST_OBJECTIVE_ITEM:
{
int32 amountToDestroy = obj.Amount;
if (quest->HasFlag(QUEST_FLAGS_REMOVE_SURPLUS_ITEMS))
amountToDestroy = std::numeric_limits<uint32>::max();
DestroyItemCount(obj.ObjectID, amountToDestroy, true);
break;
}
case QUEST_OBJECTIVE_CURRENCY:
RemoveCurrency(obj.ObjectID, obj.Amount, CurrencyDestroyReason::QuestTurnin);
break;
case QUEST_OBJECTIVE_ITEM:
{
int32 amountToDestroy = obj.Amount;
if (quest->HasFlag(QUEST_FLAGS_REMOVE_SURPLUS_ITEMS))
amountToDestroy = std::numeric_limits<uint32>::max();
DestroyItemCount(obj.ObjectID, amountToDestroy, true);
break;
}
case QUEST_OBJECTIVE_CURRENCY:
RemoveCurrency(obj.ObjectID, obj.Amount, CurrencyDestroyReason::QuestTurnin);
break;
}
}
@@ -15581,70 +15593,102 @@ void Player::RewardQuest(Quest const* quest, LootItemType rewardType, uint32 rew
}
CurrencyGainSource currencyGainSource = [&]() -> CurrencyGainSource
{
if (quest->HasFlagEx(QUEST_FLAGS_EX_REWARDS_IGNORE_CAPS))
{
if (quest->IsWorldQuest())
return CurrencyGainSource::WorldQuestRewardIgnoreCaps;
if (quest->HasFlagEx(QUEST_FLAGS_EX_REWARDS_IGNORE_CAPS))
{
if (quest->IsWorldQuest())
return CurrencyGainSource::WorldQuestRewardIgnoreCaps;
return CurrencyGainSource::QuestRewardIgnoreCaps;
}
return CurrencyGainSource::QuestRewardIgnoreCaps;
}
CurrencyGainSource gainSource = CurrencyGainSource::QuestReward;
CurrencyGainSource gainSource = CurrencyGainSource::QuestReward;
if (quest->IsDaily())
gainSource = CurrencyGainSource::DailyQuestReward;
else if (quest->IsWeekly())
gainSource = CurrencyGainSource::WeeklyQuestReward;
else if (quest->IsWorldQuest())
gainSource = CurrencyGainSource::WorldQuestReward;
if (quest->IsDaily())
gainSource = CurrencyGainSource::DailyQuestReward;
else if (quest->IsWeekly())
gainSource = CurrencyGainSource::WeeklyQuestReward;
else if (quest->IsWorldQuest())
gainSource = CurrencyGainSource::WorldQuestReward;
return gainSource;
}();
return gainSource;
}();
switch (rewardType)
{
case LootItemType::Item:
case LootItemType::Item:
{
// Automatic rewards (QUEST_FLAGS_TRACKING_EVENT) are granted from CompleteQuest without a
// selected reward id, so there is no choice to match. GetItemTemplate(0) is null, which used
// to skip both the choice items and the quest package entirely, leaving the player with XP and
// money but no item at all. Grant the whole package instead.
if (!rewardId)
{
ItemTemplate const* rewardProto = sObjectMgr->GetItemTemplate(rewardId);
if (rewardProto && quest->GetRewChoiceItemsCount())
{
for (uint32 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
{
if (quest->RewardChoiceItemId[i] && quest->RewardChoiceItemType[i] == LootItemType::Item)
{
if (quest->RewardChoiceItemId[i] == rewardId)
{
ItemPosCountVec dest;
if (CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, rewardId, quest->RewardChoiceItemCount[i]) == EQUIP_ERR_OK)
{
Item* item = StoreNewItem(dest, rewardId, true, GenerateItemRandomBonusListId(rewardId), {}, ItemContext::Quest_Reward);
SendNewItem(item, quest->RewardChoiceItemCount[i], true, false);
}
}
if (quest->GetQuestPackageID())
RewardQuestPackage(quest->GetQuestPackageID(), ItemContext::Quest_Reward);
// Add the remaining item appearances for the quest if possible
GetSession()->GetCollectionMgr()->AddItemAppearance(quest->RewardChoiceItemId[i]);
break;
}
ItemTemplate const* rewardProto = sObjectMgr->GetItemTemplate(rewardId);
if (rewardProto && quest->GetRewChoiceItemsCount())
{
for (uint32 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
{
if (quest->RewardChoiceItemId[i] && quest->RewardChoiceItemType[i] == LootItemType::Item)
{
if (quest->RewardChoiceItemId[i] == rewardId)
{
ItemPosCountVec dest;
if (CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, rewardId, quest->RewardChoiceItemCount[i]) == EQUIP_ERR_OK)
{
Item* item = StoreNewItem(dest, rewardId, true, GenerateItemRandomBonusListId(rewardId), {}, ItemContext::Quest_Reward);
SendNewItem(item, quest->RewardChoiceItemCount[i], true, false);
}
}
// Add the remaining item appearances for the quest if possible
GetSession()->GetCollectionMgr()->AddItemAppearance(quest->RewardChoiceItemId[i]);
}
}
// QuestPackageItem.db2
if (rewardProto && quest->GetQuestPackageID())
RewardQuestPackage(quest->GetQuestPackageID(), ItemContext::Quest_Reward, rewardId);
break;
}
case LootItemType::Currency:
{
if (sCurrencyTypesStore.HasRecord(rewardId) && quest->GetRewChoiceItemsCount())
for (uint32 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
if (quest->RewardChoiceItemId[i] && quest->RewardChoiceItemType[i] == LootItemType::Currency && quest->RewardChoiceItemId[i] == rewardId)
AddCurrency(quest->RewardChoiceItemId[i], quest->RewardChoiceItemCount[i], currencyGainSource);
break;
}
default:
break;
// QuestPackageItem.db2
if (rewardProto && quest->GetQuestPackageID())
RewardQuestPackage(quest->GetQuestPackageID(), ItemContext::Quest_Reward, rewardId);
break;
}
case LootItemType::Currency:
{
if (sCurrencyTypesStore.HasRecord(rewardId) && quest->GetRewChoiceItemsCount())
for (uint32 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
if (quest->RewardChoiceItemId[i] && quest->RewardChoiceItemType[i] == LootItemType::Currency && quest->RewardChoiceItemId[i] == rewardId)
AddCurrency(quest->RewardChoiceItemId[i], quest->RewardChoiceItemCount[i], currencyGainSource);
break;
}
default:
break;
}
// TreasurePicker (server-authoritative picker contents; not classic RewardItemId[])
for (int32 treasurePickerId : quest->GetTreasurePickerId())
{
TreasurePickerTemplate const* treasurePicker = sObjectMgr->GetTreasurePicker(uint32(treasurePickerId));
TreasurePickerItem const* pickerItem = sObjectMgr->SelectTreasurePickerItem(treasurePicker, this, rewardId);
if (!pickerItem)
continue;
ItemPosCountVec dest;
if (CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, pickerItem->ItemID, pickerItem->Quantity) != EQUIP_ERR_OK)
continue;
std::vector<int32> const& bonusListIDs = pickerItem->BonusListIDs;
ItemContext context = ItemContext(pickerItem->Context);
Item* item = StoreNewItem(dest, pickerItem->ItemID, true, 0, {}, context, bonusListIDs.empty() ? nullptr : &bonusListIDs);
if (item)
SendNewItem(item, pickerItem->Quantity, true, false);
}
for (uint8 i = 0; i < QUEST_REWARD_CURRENCY_COUNT; ++i)
@@ -15653,6 +15697,7 @@ void Player::RewardQuest(Quest const* quest, LootItemType rewardType, uint32 rew
if (uint32 skill = quest->GetRewardSkillId())
UpdateSkillPro(skill, 1000, quest->GetRewardSkillPoints());
uint32 XP = GetQuestXPReward(quest);
int32 moneyRew = 0;
@@ -15703,12 +15748,13 @@ void Player::RewardQuest(Quest const* quest, LootItemType rewardType, uint32 rew
// cast spells after mark quest complete (some spells have quest completed state requirements in spell_area data)
if (quest->GetRewSpell() > 0)
{
SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(quest->GetRewSpell(), GetMap()->GetDifficultyID());
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(quest->GetRewSpell(), GetMap()->GetDifficultyID());
Unit* caster = this;
if (questGiver && questGiver->IsUnit() && !quest->HasFlag(QUEST_FLAGS_PLAYER_CAST_COMPLETE) && !spellInfo->HasTargetType(TARGET_UNIT_CASTER))
if (spellInfo && questGiver && questGiver->IsUnit() && !quest->HasFlag(QUEST_FLAGS_PLAYER_CAST_COMPLETE) && !spellInfo->HasTargetType(TARGET_UNIT_CASTER))
caster = questGiver->ToUnit();
caster->CastSpell(this, spellInfo->Id, CastSpellExtraArgs(TRIGGERED_FULL_MASK).SetCastDifficulty(spellInfo->Difficulty));
if (spellInfo)
caster->CastSpell(this, spellInfo->Id, CastSpellExtraArgs(TRIGGERED_FULL_MASK).SetCastDifficulty(spellInfo->Difficulty));
}
else
{
@@ -15717,7 +15763,10 @@ void Player::RewardQuest(Quest const* quest, LootItemType rewardType, uint32 rew
if (!ConditionMgr::IsPlayerMeetingCondition(this, displaySpell.PlayerConditionId))
continue;
SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(displaySpell.SpellId, GetMap()->GetDifficultyID());
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(displaySpell.SpellId, GetMap()->GetDifficultyID());
if (!spellInfo)
continue;
Unit* caster = this;
if (questGiver && questGiver->IsUnit() && !quest->HasFlag(QUEST_FLAGS_PLAYER_CAST_COMPLETE) && !spellInfo->HasTargetType(TARGET_UNIT_CASTER))
caster = questGiver->ToUnit();
@@ -15732,6 +15781,45 @@ void Player::RewardQuest(Quest const* quest, LootItemType rewardType, uint32 rew
UpdateCriteria(CriteriaType::CompleteQuest, quest->GetQuestId());
UpdateCriteria(CriteriaType::CompleteAnyReplayQuest, 1);
//WowCommunity
if (IsSkyridingUnlockQuest(quest->GetQuestId()))
SetSkyridingUnlockedForWarband(true);
// Grant any garrison/war-campaign champions (GarrFollower) mapped to this quest turn-in.
// Retail encodes several of these as the quest's RewardSpell (SPELL_EFFECT_ADD_GARRISON_FOLLOWER),
// but that path only reaches the follower's own garrison type via Spell::EffectAddGarrisonFollower;
// this data-driven table is the authoritative, faction-agnostic mechanism and also covers champions
// that are not granted through a reward spell.
if (std::vector<QuestGarrisonFollower> const* garrisonFollowers = sObjectMgr->GetQuestGarrisonFollowers(quest_id))
{
for (QuestGarrisonFollower const& reward : *garrisonFollowers)
{
GarrisonType garrType = GarrisonType(reward.GarrType);
Garrison* garrison = GetGarrison(garrType);
// Ensure the target garrison exists. In retail the war-campaign garrison is created earlier in
// the campaign; create it here as a safety net for the known war-campaign sites so a champion
// reward is never silently lost. Unknown types are left to their own creation path.
if (!garrison && garrType == GARRISON_TYPE_WAR_CAMPAIGN)
{
CreateGarrison(GetTeam() == ALLIANCE ? 168 : 169);
garrison = GetGarrison(garrType);
}
if (!garrison)
{
TC_LOG_DEBUG("entities.player.quest", "Player::RewardQuest: quest {} grants GarrFollower {} for GarrType {} but player {} has no such garrison; skipped.",
quest_id, reward.GarrFollowerID, reward.GarrType, GetGUID().ToString());
continue;
}
// Idempotent: never double-grant a champion the player already owns.
if (!garrison->GetFollowerByEntry(reward.GarrFollowerID))
garrison->AddFollower(reward.GarrFollowerID);
}
}
// make full db save
SaveToDB(false);
@@ -15748,7 +15836,7 @@ void Player::RewardQuest(Quest const* quest, LootItemType rewardType, uint32 rew
SendQuestUpdate(quest_id, true, true);
bool updateVisibility = false;
if (quest->HasFlag(QUEST_FLAGS_UPDATE_PHASESHIFT))
if (quest->HasFlag(QUEST_FLAGS_UPDATE_PHASESHIFT) || sConditionMgr->HasPhaseZoneConditions())
updateVisibility = PhasingHandler::OnConditionChange(this, false);
//lets remove flag for delayed teleports
+5
View File
@@ -497,6 +497,11 @@ struct Areas
#define MAX_RUNES 7
#define MAX_RECHARGING_RUNES 3
enum RuneCooldowns
{
RUNE_BASE_COOLDOWN = 10000
};
struct Runes
{
std::deque<uint8> CooldownOrder;
+34 -112
View File
@@ -196,30 +196,59 @@ void WorldSession::SendFeatureSystemStatusGlueScreen()
{ "masterLooterEnabled"sv, "1"sv },
// Housing game rules ? ALL values verified against 12.0.1.65940 sniff packet data (Feb 2026)
// Service & feature flags (read from config, default true)
{ "performHousingExpansionCheckClient"sv, "1"sv },
{ "housingServiceEnabled"sv, "1"sv },
{ "housingEnableBuyHouse"sv, "1"sv },
{ "housingEnableDeleteHouse"sv, "1"sv },
{ "housingEnableMoveHouse"sv, "1"sv },
{ "housingEnableCreateCharterNeighborhood"sv, "1"sv },
{ "housingEnableCreateGuildNeighborhood"sv, "1"sv },
{ "housingEnableBuyHouse"sv, sWorld->getBoolConfig(CONFIG_HOUSING_ENABLE_BUY_HOUSE) ? "1"sv : "0"sv },
{ "housingEnableDeleteHouse"sv, sWorld->getBoolConfig(CONFIG_HOUSING_ENABLE_DELETE_HOUSE) ? "1"sv : "0"sv },
{ "housingEnableMoveHouse"sv, sWorld->getBoolConfig(CONFIG_HOUSING_ENABLE_MOVE_HOUSE) ? "1"sv : "0"sv },
{ "housingEnableCreateCharterNeighborhood"sv, sWorld->getBoolConfig(CONFIG_HOUSING_ENABLE_CREATE_CHARTER_NEIGHBORHOOD) ? "1"sv : "0"sv },
{ "housingEnableCreateGuildNeighborhood"sv, sWorld->getBoolConfig(CONFIG_HOUSING_ENABLE_CREATE_GUILD_NEIGHBORHOOD) ? "1"sv : "0"sv },
{ "housingDecorReportScreenshotFacingDotThreshold"sv, "0.500000"sv },
{ "housingDecorReportScreenshotDistanceThreshold"sv, "150.000000"sv },
{ "housingMarketViewInStoreTelemThrottle"sv, "5"sv },
{ "housingMarketViewBundleTelemThrottle"sv, "10"sv },
{ "housingMarketAddToCartTelemThrottle"sv, "15"sv },
{ "housingMarketClearCartTelemThrottle"sv, "5"sv },
{ "housingMarketRemoveFromCartTelemThrottle"sv, "20"sv },
{ "housingMarketThrottleTimePeriodMs"sv, "10000"sv },
// Market
{ "housingMarketEnabled"sv, "1"sv },
{ "housingMarketShopEnabled"sv, "1"sv },
{ "housingMarketCartFullRemoveEnabled"sv, "1"sv },
{ "housingBlueprintsEnabled"sv, "1"sv },
{ "housingBlueprintImportEnabled"sv, "1"sv },
{ "housingBlueprintExportEnabled"sv, "1"sv },
// Neighborhood & exterior
{ "housingExteriorTypeByNeighborhoodFactionRestriction"sv, "1"sv },
{ "minNeighborhoodGroupMembers"sv, "3"sv },
// Decoration limits
{ "housingBasicDecor_MaxPreviewLimit"sv, "100"sv },
{ "housingCatalog_CartSizeLimit"sv, "20"sv },
// Decor scale limits
{ "housingExpertDecor_Scale_Indoor_Min"sv, "0.200000"sv },
{ "housingExpertDecor_Scale_Indoor_Max"sv, "2.000000"sv },
{ "housingExpertDecor_Scale_Outdoor_Min"sv, "0.200000"sv },
{ "housingExpertDecor_Scale_Outdoor_Max"sv, "2.000000"sv },
// Advanced flying keyboard factors - retail sends no advFly MirrorVars and uses these
// client defaults; pushed explicitly to undo previously synced non-default values.
@@ -303,110 +332,3 @@ void WorldSession::SendFeatureSystemStatusGlueScreen()
variables.Variables = varList;
SendPacket(variables.Write());
}
void WorldSession::SendMirrorVars()
{
WorldPackets::System::MirrorVarSingle vars[] =
{
{ "raidLockoutExtendEnabled"sv, "1"sv },
{ "sellAllJunkEnabled"sv, "1"sv },
{ "bypassItemLevelScalingCode"sv, "0"sv },
{ "shop2Enabled"sv, "0"sv },
{ "bpayStoreEnable"sv, "0"sv },
{ "recentAlliesEnabledClient"sv, "0"sv },
{ "browserEnabled"sv, "0"sv },
{ "advFlyKeyboardMinTurnFactor"sv, "1"sv },
{ "advFlyKeyboardMaxTurnFactor"sv, "1"sv },
// Housing game rules; enable flags are read from worldserver config
{ "performHousingExpansionCheckClient"sv, "1"sv },
{ "housingServiceEnabled"sv, "1"sv },
{ "housingEnableBuyHouse"sv, sWorld->getBoolConfig(CONFIG_HOUSING_ENABLE_BUY_HOUSE) ? "1"sv : "0"sv },
{ "housingEnableDeleteHouse"sv, sWorld->getBoolConfig(CONFIG_HOUSING_ENABLE_DELETE_HOUSE) ? "1"sv : "0"sv },
{ "housingEnableMoveHouse"sv, sWorld->getBoolConfig(CONFIG_HOUSING_ENABLE_MOVE_HOUSE) ? "1"sv : "0"sv },
{ "housingEnableCreateCharterNeighborhood"sv, sWorld->getBoolConfig(CONFIG_HOUSING_ENABLE_CREATE_CHARTER_NEIGHBORHOOD) ? "1"sv : "0"sv },
{ "housingEnableCreateGuildNeighborhood"sv, sWorld->getBoolConfig(CONFIG_HOUSING_ENABLE_CREATE_GUILD_NEIGHBORHOOD) ? "1"sv : "0"sv },
// Market
{ "housingMarketEnabled"sv, "1"sv },
{ "housingMarketShopEnabled"sv, "1"sv },
{ "housingMarketCartFullRemoveEnabled"sv, "1"sv },
// the client gates C_HousingBlueprint feature/import/export availability on these
{ "housingBlueprintsEnabled"sv, "1"sv },
{ "housingBlueprintImportEnabled"sv, "1"sv },
{ "housingBlueprintExportEnabled"sv, "1"sv },
// Neighborhood & exterior
{ "housingExteriorTypeByNeighborhoodFactionRestriction"sv, "1"sv },
{ "minNeighborhoodGroupMembers"sv, "3"sv },
// Decoration limits
{ "housingBasicDecor_MaxPreviewLimit"sv, "100"sv },
{ "housingCatalog_CartSizeLimit"sv, "20"sv },
// Decor scale limits
{ "housingExpertDecor_Scale_Indoor_Min"sv, "0.200000"sv },
{ "housingExpertDecor_Scale_Indoor_Max"sv, "2.000000"sv },
{ "housingExpertDecor_Scale_Outdoor_Min"sv, "0.200000"sv },
{ "housingExpertDecor_Scale_Outdoor_Max"sv, "2.000000"sv },
// Screenshot report thresholds
{ "housingDecorReportScreenshotFacingDotThreshold"sv, "0.500000"sv },
{ "housingDecorReportScreenshotDistanceThreshold"sv, "150.000000"sv },
// the client gates HOUSING_MARKET_* telemetry CMSGs on these throttles
{ "housingMarketViewInStoreTelemThrottle"sv, "5"sv },
{ "housingMarketViewBundleTelemThrottle"sv, "10"sv },
{ "housingMarketAddToCartTelemThrottle"sv, "15"sv },
{ "housingMarketClearCartTelemThrottle"sv, "5"sv },
{ "housingMarketRemoveFromCartTelemThrottle"sv, "20"sv },
{ "housingMarketThrottleTimePeriodMs"sv, "10000"sv },
// situation flags for the client's situation state machine
{ "enableAutomaticSituations"sv, "1"sv },
{ "enableManualSituations"sv, "1"sv },
{ "enableTransmogUpdateSituation"sv, "1"sv },
// Transmog system flags - the client gates parts of the transmog UI on these
{ "transmogEnableSystem"sv, "1"sv },
{ "transmogAllowArtifactOverride"sv, "1"sv },
{ "transmogAllowCanUseEverChanges"sv, "0"sv },
{ "transmogEnableOutfitPurchases"sv, "1"sv },
{ "transmogEnableOutfitSlotChanges"sv, "1"sv },
// remaining vars mirror retail where they drive client behaviour; Blizzard service URLs are skipped
{ "damageMeterCacheEnabled"sv, "1"sv },
{ "damageMeterProcessingEnabled"sv, "1"sv },
// Addon chat restrictions - affects WHISPER/GROUP addon message routing
{ "addonChatRestrictionsEnabled"sv, "1"sv },
{ "addonChatRestrictionsEnabledForOutgoingAddonMessages"sv, "1"sv },
// Lua resource caps - the client throttles AddOn resources by these; keep retail's values
{ "limitedLuaResourcesEnabled"sv, "0"sv },
{ "limitedLuaResourcesAddonCapacityAnim"sv, "5000"sv },
{ "limitedLuaResourcesAddonCapacityAnimGroup"sv, "2000"sv },
{ "limitedLuaResourcesAddonCapacityFont"sv, "300"sv },
{ "limitedLuaResourcesAddonCapacityFontString"sv, "5000"sv },
{ "limitedLuaResourcesAddonCapacityFrame"sv, "10000"sv },
{ "limitedLuaResourcesAddonCapacityTexture"sv, "40000"sv },
{ "limitedLuaResourcesAddonCapacityTimer"sv, "500"sv },
{ "limitedLuaResourcesGlobalCapacityAnim"sv, "50000"sv },
{ "limitedLuaResourcesGlobalCapacityAnimGroup"sv, "20000"sv },
{ "limitedLuaResourcesGlobalCapacityFont"sv, "3000"sv },
{ "limitedLuaResourcesGlobalCapacityFontString"sv, "50000"sv },
{ "limitedLuaResourcesGlobalCapacityFrame"sv, "100000"sv },
{ "limitedLuaResourcesGlobalCapacityTexture"sv, "400000"sv },
{ "limitedLuaResourcesGlobalCapacityTimer"sv, "500"sv },
// Lua script throttling - bucket limits per second / burst
{ "luaScriptBucketThrottleEnabled"sv, "1"sv },
{ "luaScriptBucketThrottleMaxMsBurstNormal"sv, "20000"sv },
{ "luaScriptBucketThrottleMaxMsBurstRestricted"sv, "1000"sv },
{ "luaScriptBucketThrottleMaxMsPerSecondNormal"sv, "2000"sv },
{ "luaScriptBucketThrottleMaxMsPerSecondRestricted"sv, "500"sv },
// Hardcore mode throttling - not used but sent for parity
{ "hardcoreScriptThrottlingEnabled"sv, "0"sv },
// PvP training grounds - the PvP duel area feature
{ "pvpTrainingGroundsEnabledClient"sv, "0"sv },
// Recent allies request throttle
{ "recentAlliesRequestDataThrottle"sv, "5000"sv },
// LFG text filters
{ "enableEndgameEditRestrictionsForLFGText"sv, "1"sv },
// Disabled game modes (retail passes an empty string; keep empty)
{ "disabledGamemodes"sv, ""sv },
};
WorldPackets::System::MirrorVars variables;
variables.Variables = vars;
SendPacket(variables.Write());
}
+12 -9
View File
@@ -573,6 +573,13 @@ void WorldSession::LogoutPlayer(bool save)
if (_player)
{
//WowCommunity
// Remove any premade group finder listing this player owns.
// Remove any premade group finder listing this player owns, and any outstanding applications.
sLFGListMgr.RemoveListingsBy(_player->GetGUID());
sLFGListMgr.RemoveApplicationsBy(_player->GetGUID());
sLFGListMgr.UnregisterSearch(_player->GetGUID());
//WowCommunity
if (!_player->GetLootGUID().IsEmpty())
DoLootReleaseAll();
@@ -601,9 +608,13 @@ void WorldSession::LogoutPlayer(bool save)
if (Battleground* bg = _player->GetBattleground())
bg->EventPlayerLoggedOut(_player);
///- Teleport to home if the player is in an invalid instance
if (!_player->m_InstanceValid && !_player->IsGameMaster())
_player->TeleportTo(_player->m_homebind);
sOutdoorPvPMgr->HandlePlayerLeaveZone(_player, _player->GetZoneId());
for (int i=0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
for (int i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
{
BattlegroundQueueTypeId bgQueueTypeId = _player->GetBattlegroundQueueTypeId(i);
if (bgQueueTypeId != BATTLEGROUND_QUEUE_NONE)
@@ -630,10 +641,6 @@ void WorldSession::LogoutPlayer(bool save)
if (_battlePetMgr->HasJournalLock())
_battlePetMgr->ToggleJournalLock(false);
///- Release account-wide bank inventory lock
if (_player->HasPlayerLocalFlag(PLAYER_LOCAL_FLAG_HAS_ACCOUNT_BANK_LOCK))
_player->RemovePlayerLocalFlag(PLAYER_LOCAL_FLAG_HAS_ACCOUNT_BANK_LOCK);
///- Clear whisper whitelist
_player->ClearWhisperWhiteList();
@@ -660,10 +667,6 @@ void WorldSession::LogoutPlayer(bool save)
///- Leave all channels before player delete...
_player->CleanupChannels();
// Drop the player's live club stream subscription/focus state; it is re-established on the
// next login by the club subscribe RPCs.
sClubStreamHistoryMgr->ClearSessionState(_player->GetGUID());
///- If the player is in a group (or invited), remove him. If the group if then only 1 person, disband the group.
_player->UninviteFromGroup();