From 7e2e01c664201173e31c038638e062f737d5af6e Mon Sep 17 00:00:00 2001 From: Skjalf <47818697+Nyeriah@users.noreply.github.com> Date: Wed, 27 Aug 2025 04:55:20 -0300 Subject: [PATCH 1/2] Add Joyous Journeys event support to double XP module Introduces configuration options and logic for the Joyous Journeys promotional event, including additional XP and reputation rate modifiers and an option to exclude certain reputations. Updates both the configuration file and the module code to support enabling/disabling the event and customizing its effects. --- conf/mod-double-xp-weekend.conf.dist | 25 +++++++++++++++++ src/mod-double-xp-weekend.cpp | 40 ++++++++++++++++++++++++++-- 2 files changed, 63 insertions(+), 2 deletions(-) diff --git a/conf/mod-double-xp-weekend.conf.dist b/conf/mod-double-xp-weekend.conf.dist index d0bdc33..9328aa2 100644 --- a/conf/mod-double-xp-weekend.conf.dist +++ b/conf/mod-double-xp-weekend.conf.dist @@ -59,3 +59,28 @@ XPWeekend.MaxLevel = 80 # Default: 0 (Disabled) XPWeekend.IsDKStartZoneRequired = 0 + +# XPWeekend.IsJoyousJourneysActive = 0 +# Promotional event, adds yet another layer of bonus on top of the current bonus (yay!) +# Default: 0 (Disabled) + +XPWeekend.IsJoyousJourneysActive = 0 + +# XPWeekend.JoyousJourneysXPRate = 1 +# Bonus experience rate during joyous journeys. +# ADDS to the base one. So if base 2x + 1x from this = 3x (50% increase). +# Default: 1 + +XPWeekend.JoyousJourneysXPRate = 1 + +# XPWeekend.JoyousJourneysRepRate = 1.10 +# Reputation bonus while joyous journeys is active. +# Default: 1.10 (10%) + +XPWeekend.JoyousJourneysRepRate = 1.10 + +# XPWeekend.ExcludeInsaneReps = 1 +# Exclude the insane title reputations e.g ravenholdt +# Default: 1 (Enabled) + +XPWeekend.ExcludeInsaneReps = 1 diff --git a/src/mod-double-xp-weekend.cpp b/src/mod-double-xp-weekend.cpp index 2e6fc95..42bbabc 100644 --- a/src/mod-double-xp-weekend.cpp +++ b/src/mod-double-xp-weekend.cpp @@ -141,6 +141,11 @@ class DoubleXpWeekend return true; } + bool IsJoyousJourneysActive() const { return sConfigMgr->GetOption("XPWeekend.IsJoyousJourneysActive", false); } + float ConfigJoyousJourneysXPRate() const { return sConfigMgr->GetOption("XPWeekend.JoyousJourneysXPRate", 1.0f); } + float ConfigJoyousJourneysRepRate() const { return sConfigMgr->GetOption("XPWeekend.JoyousJourneysRepRate", 1.10f); } + bool ExcludeInsaneReps() const { return sConfigMgr->GetOption("XPWeekend.ExcludeInsaneReps", true); } + private: // NOTE keep options together to prevent having more than 1 potential default value @@ -151,7 +156,7 @@ class DoubleXpWeekend float ConfigxpAmount() const { return sConfigMgr->GetOption("XPWeekend.xpAmount", 2.0f); } bool ConfigIndividualXPEnabled() const { return sConfigMgr->GetOption("XPWeekend.IndividualXPEnabled", false); } bool ConfigEnabled() const { return sConfigMgr->GetOption("XPWeekend.Enabled", false); } - float ConfigMaxAllowedRate() const { return sConfigMgr->GetOption("XPWeekend.MaxAllowedRate", 2.0f); } + float ConfigMaxAllowedRate() const { return sConfigMgr->GetOption("XPWeekend.MaxAllowedRate", 2.0f) + (IsJoyousJourneysActive() ? ConfigJoyousJourneysXPRate() : 0.0f); } bool ConfigIsDKStartZoneRequired() const { return sConfigMgr->GetOption("XPWeekend.IsDKStartZoneRequired", false); } bool IsDKStartZoneComplete(Player* player) const @@ -230,6 +235,11 @@ class DoubleXpWeekend return 1.0f; } + if (IsJoyousJourneysActive()) + { + rate += ConfigJoyousJourneysXPRate(); + } + // If individualxp setting is enabled... and a rate was set, overwrite it. if (ConfigIndividualXPEnabled()) { @@ -293,7 +303,8 @@ class DoubleXpWeekendPlayerScript : public PlayerScript public: DoubleXpWeekendPlayerScript() : PlayerScript("DoubleXpWeekend", { PLAYERHOOK_ON_LOGIN, - PLAYERHOOK_ON_GIVE_EXP + PLAYERHOOK_ON_GIVE_EXP, + PLAYERHOOK_ON_GIVE_REPUTATION }) { } void OnPlayerLogin(Player* player) override @@ -309,6 +320,31 @@ class DoubleXpWeekendPlayerScript : public PlayerScript amount = mod->OnPlayerGiveXP(player, amount, xpSource); } + void OnPlayerGiveReputation(Player* /*player*/, int32 factionID, float& amount, ReputationSource /*repSource*/) override + { + DoubleXpWeekend* mod = DoubleXpWeekend::instance(); + if (!mod->IsJoyousJourneysActive() || !mod->ConfigJoyousJourneysRepRate()) + return; + + if (mod->ExcludeInsaneReps()) + { + switch (factionID) + { + case 349: // Ravenholdt + case 87: // bloodsail bucaneers + case 21: // Booty Bay + case 577: // Everlook + case 369: // Gadgetzan + case 470: // Ratchet + case 909: // Darkmoon Faire + case 809: // Shen'dralar + return; + } + } + + amount *= mod->ConfigJoyousJourneysRepRate(); + } + }; void AdddoublexpScripts() From 8ea085475a23020b14aed477f37ae47e6e20c2d3 Mon Sep 17 00:00:00 2001 From: Skjalf <47818697+Nyeriah@users.noreply.github.com> Date: Wed, 27 Aug 2025 06:39:47 -0300 Subject: [PATCH 2/2] Announce Joyous Journeys event and max XP rate on login Added a system message on player login to inform users when the Joyous Journeys event is active and display the maximum allowed XP rate. Also refactored ConfigMaxAllowedRate to public for use in the login announcement. --- src/mod-double-xp-weekend.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/mod-double-xp-weekend.cpp b/src/mod-double-xp-weekend.cpp index 42bbabc..9eae51d 100644 --- a/src/mod-double-xp-weekend.cpp +++ b/src/mod-double-xp-weekend.cpp @@ -145,6 +145,7 @@ class DoubleXpWeekend float ConfigJoyousJourneysXPRate() const { return sConfigMgr->GetOption("XPWeekend.JoyousJourneysXPRate", 1.0f); } float ConfigJoyousJourneysRepRate() const { return sConfigMgr->GetOption("XPWeekend.JoyousJourneysRepRate", 1.10f); } bool ExcludeInsaneReps() const { return sConfigMgr->GetOption("XPWeekend.ExcludeInsaneReps", true); } + float ConfigMaxAllowedRate() const { return sConfigMgr->GetOption("XPWeekend.MaxAllowedRate", 2.0f) + (IsJoyousJourneysActive() ? ConfigJoyousJourneysXPRate() : 0.0f); } private: @@ -156,7 +157,6 @@ class DoubleXpWeekend float ConfigxpAmount() const { return sConfigMgr->GetOption("XPWeekend.xpAmount", 2.0f); } bool ConfigIndividualXPEnabled() const { return sConfigMgr->GetOption("XPWeekend.IndividualXPEnabled", false); } bool ConfigEnabled() const { return sConfigMgr->GetOption("XPWeekend.Enabled", false); } - float ConfigMaxAllowedRate() const { return sConfigMgr->GetOption("XPWeekend.MaxAllowedRate", 2.0f) + (IsJoyousJourneysActive() ? ConfigJoyousJourneysXPRate() : 0.0f); } bool ConfigIsDKStartZoneRequired() const { return sConfigMgr->GetOption("XPWeekend.IsDKStartZoneRequired", false); } bool IsDKStartZoneComplete(Player* player) const @@ -312,6 +312,9 @@ class DoubleXpWeekendPlayerScript : public PlayerScript DoubleXpWeekend* mod = DoubleXpWeekend::instance(); ChatHandler handler = ChatHandler(player->GetSession()); mod->OnPlayerLogin(player, &handler); + + if (mod->IsJoyousJourneysActive() && mod->ConfigJoyousJourneysXPRate()) + handler.PSendSysMessage("|cff00ccffThe Joyous Journeys event is active! You may set your rates up to {} while it is active!|r", mod->ConfigMaxAllowedRate()); } void OnPlayerGiveXP(Player* player, uint32& amount, Unit* /*victim*/, uint8 xpSource) override