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] 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()