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