aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2025-08-14 14:50:13 +0200
committerShauren <shauren.trinity@gmail.com>2025-08-14 14:50:13 +0200
commitd27d0e0e3c004e7562c63b9527035095efd30974 (patch)
tree9b2cccc5a18ba91aeee5d417536a0a2d41199bf0
parent750038116d84f1048a8310ec370b44757b4d05b5 (diff)
Core/Players: Reenable transmog
Closes #31209
-rw-r--r--src/server/game/DataStores/DBCEnums.h101
-rw-r--r--src/server/game/Handlers/AuthHandler.cpp13
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp13
-rw-r--r--src/server/game/World/World.cpp5
-rw-r--r--src/server/game/World/World.h15
5 files changed, 147 insertions, 0 deletions
diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h
index a0b47fd550f..fd4f5296e82 100644
--- a/src/server/game/DataStores/DBCEnums.h
+++ b/src/server/game/DataStores/DBCEnums.h
@@ -1016,6 +1016,107 @@ enum class FriendshipReputationFlags : int32
DEFINE_ENUM_FLAG(FriendshipReputationFlags);
+enum class GameRule : int32
+{
+ NoDebuffLimit = 1,
+ CharNameReservationEnabled = 2,
+ MaxCharReservationsPerRealm = 3,
+ MaxAccountCharReservationsPerContentset = 4,
+ EtaRealmLaunchTime = 5,
+ TrivialGroupXPPercent = 7,
+ CharReservationsPerRealmReopenThreshold = 8,
+ DisablePct = 9,
+ HardcoreRuleset = 10,
+ ReplaceAbsentGmSeconds = 11,
+ ReplaceGmRankLastOnlineSeconds = 12,
+ GameMode = 13,
+ CharacterlessLogin = 14,
+ NoMultiboxing = 15,
+ VanillaNpcKnockback = 16,
+ Runecarving = 17,
+ TalentRespecCostMin = 18,
+ TalentRespecCostMax = 19,
+ TalentRespecCostStep = 20,
+ VanillaRageGenerationModifier = 21,
+ SelfFoundAllowed = 22,
+ DisableHonorDecay = 23,
+ MaxLootDropLevel = 25,
+ MicrobarScale = 26,
+ MaxUnitNameDistance = 27,
+ MaxNameplateDistance = 28,
+ UserAddonsDisabled = 29,
+ UserScriptsDisabled = 30,
+ NonPlayerNameplateScale = 31,
+ ForcedPartyFrameScale = 32,
+ CustomActionbarOverlayHeightOffset = 33,
+ ForcedChatLanguage = 34,
+ LandingPageFactionID = 35,
+ CollectionsPanelDisabled = 36,
+ CharacterPanelDisabled = 37,
+ SpellbookPanelDisabled = 38,
+ TalentsPanelDisabled = 39,
+ AchievementsPanelDisabled = 40,
+ CommunitiesPanelDisabled = 41,
+ EncounterJournalDisabled = 42,
+ FinderPanelDisabled = 43,
+ StoreDisabled = 44,
+ HelpPanelDisabled = 45,
+ GuildsDisabled = 46,
+ QuestLogMicrobuttonDisabled = 47,
+ MapPlunderstormCircle = 48,
+ AfterDeathSpectatingUI = 49,
+ FrontEndChat = 50,
+ UniversalNameplateOcclusion = 51,
+ FastAreaTriggerTick = 52,
+ AllPlayersAreFastMovers = 53,
+ IgnoreChrclassDisabledFlag = 54,
+ CharacterCreateUseFixedBackgroundModel = 55,
+ ForceAlteredFormsOn = 56,
+ PlayerNameplateDifficultyIcon = 57,
+ PlayerNameplateAlternateHealthColor = 58,
+ AlwaysAllowAlliedRaces = 59,
+ ActionbarIconIntroDisabled = 60,
+ ReleaseSpiritGhostDisabled = 61,
+ DeleteItemConfirmationDisabled = 62,
+ ChatLinkLevelToastsDisabled = 63,
+ BagsUIDisabled = 64,
+ PetBattlesDisabled = 65,
+ PerksProgramActivityTrackingDisabled = 66,
+ MaximizeWorldMapDisabled = 67,
+ WorldMapTrackingOptionsDisabled = 68,
+ WorldMapTrackingPinDisabled = 69,
+ WorldMapHelpPlateDisabled = 70,
+ QuestLogPanelDisabled = 71,
+ QuestLogSuperTrackingDisabled = 72,
+ TutorialFrameDisabled = 73,
+ IngameMailNotificationDisabled = 74,
+ IngameCalendarDisabled = 75,
+ IngameTrackingDisabled = 76,
+ IngameWhoListDisabled = 77,
+ RaceAlteredFormsDisabled = 78,
+ IngameFriendsListDisabled = 79,
+ MacrosDisabled = 80,
+ CompactRaidFrameManagerDisabled = 81,
+ EditModeDisabled = 82,
+ InstanceDifficultyBannerDisabled = 83,
+ FullCharacterCreateDisabled = 84,
+ TargetFrameBuffsDisabled = 85,
+ UnitFramePvPContextualDisabled = 86,
+ BlockWhileSheathedAllowed = 88,
+ VanillaAccountMailInstant = 91,
+ ClearMailOnRealmTransfer = 92,
+ PremadeGroupFinderStyle = 93,
+ PlunderstormAreaSelection = 94,
+ GroupFinderCapabilities = 98,
+ WorldMapLegendDisabled = 99,
+ WorldMapFrameStrata = 100,
+ MerchantFilterDisabled = 101,
+ SummoningStones = 108,
+ TransmogEnabled = 109,
+ MailGameRule = 132,
+ LootMethodStyle = 157,
+};
+
enum class GlobalCurve : int32
{
CritDiminishing = 0,
diff --git a/src/server/game/Handlers/AuthHandler.cpp b/src/server/game/Handlers/AuthHandler.cpp
index 01ce89b2471..081d986d6f6 100644
--- a/src/server/game/Handlers/AuthHandler.cpp
+++ b/src/server/game/Handlers/AuthHandler.cpp
@@ -124,5 +124,18 @@ void WorldSession::SendFeatureSystemStatusGlueScreen()
features.EuropaTicketSystemStatus->ComplaintsEnabled = sWorld->getBoolConfig(CONFIG_SUPPORT_COMPLAINTS_ENABLED);
features.EuropaTicketSystemStatus->SuggestionsEnabled = sWorld->getBoolConfig(CONFIG_SUPPORT_SUGGESTIONS_ENABLED);
+ for (World::GameRule const& gameRule : sWorld->GetGameRules())
+ {
+ WorldPackets::System::GameRuleValuePair& rule = features.GameRules.emplace_back();
+ rule.Rule = AsUnderlyingType(gameRule.Rule);
+ std::visit([&]<typename T>(T value)
+ {
+ if constexpr (std::is_same_v<T, float>)
+ rule.ValueF = value;
+ else
+ rule.Value = value;
+ }, gameRule.Value);
+ }
+
SendPacket(features.Write());
}
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp
index f0f60870bf1..1628f0c4dd1 100644
--- a/src/server/game/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Handlers/CharacterHandler.cpp
@@ -1533,6 +1533,19 @@ void WorldSession::SendFeatureSystemStatus()
features.SpeakForMeAllowed = false;
+ for (World::GameRule const& gameRule : sWorld->GetGameRules())
+ {
+ WorldPackets::System::GameRuleValuePair& rule = features.GameRules.emplace_back();
+ rule.Rule = AsUnderlyingType(gameRule.Rule);
+ std::visit([&]<typename T>(T value)
+ {
+ if constexpr (std::is_same_v<T, float>)
+ rule.ValueF = value;
+ else
+ rule.Value = value;
+ }, gameRule.Value);
+ }
+
SendPacket(features.Write());
}
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index e4996cbdb9d..27e5e1480c6 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -1205,6 +1205,11 @@ void World::LoadConfigSettings(bool reload)
if (m_int_configs[CONFIG_PACKET_SPOOF_BANMODE] == BAN_CHARACTER)
m_int_configs[CONFIG_PACKET_SPOOF_BANMODE] = BAN_ACCOUNT;
+ _gameRules =
+ {
+ { .Rule = ::GameRule::TransmogEnabled, .Value = true }
+ };
+
if (reload)
{
sSupportMgr->SetSupportSystemStatus(m_bool_configs[CONFIG_SUPPORT_ENABLED]);
diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
index 0c43ae0f273..ed13a6e308f 100644
--- a/src/server/game/World/World.h
+++ b/src/server/game/World/World.h
@@ -36,12 +36,14 @@
#include <map>
#include <memory>
#include <unordered_map>
+#include <variant>
#include <vector>
class Player;
class WorldPacket;
class WorldSession;
class WorldSocket;
+enum class GameRule : int32;
// ServerMessages.dbc
enum ServerMessageType
@@ -786,6 +788,17 @@ class TC_GAME_API World
void SetForcedWarModeFactionBalanceState(TeamId team, int32 reward = 0);
void DisableForcedWarModeFactionBalanceState();
+ struct GameRule
+ {
+ ::GameRule Rule;
+ std::variant<int32, float, bool> Value;
+ };
+
+ std::vector<GameRule> const& GetGameRules() const
+ {
+ return _gameRules;
+ }
+
protected:
void _UpdateGameTime();
@@ -898,6 +911,8 @@ class TC_GAME_API World
uint32 _warnDiff;
time_t _warnShutdownTime;
+ std::vector<GameRule> _gameRules;
+
// War mode balancing
void UpdateWarModeRewardValues();