Adapt world seed to target defaults and preserve existing quest, logout and DB2 behavior
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user