diff --git a/src/WeekendBonus.cpp b/src/WeekendBonus.cpp index 9dee76b..121fe48 100644 --- a/src/WeekendBonus.cpp +++ b/src/WeekendBonus.cpp @@ -3,12 +3,6 @@ #include "Player.h" #include "ScriptMgr.h" -float multiplierExperience; -float multiplierMoney; -float multiplierProfessions; -float multiplierReputation; -float multiplierProficiencies; - enum Day { SUNDAY = 0, @@ -30,9 +24,7 @@ class WeekendBonusPlayer : public PlayerScript time_t t = time(NULL); if (localtime(&t)->tm_wday == Day::FRIDAY || localtime(&t)->tm_wday == Day::SATURDAY || localtime(&t)->tm_wday == Day::SUNDAY) - { ChatHandler(player->GetSession()).SendSysMessage("The weekend bonus is active, granting you bonuses!"); - } } }; @@ -41,13 +33,34 @@ class WeekendBonusWorld : WorldScript public: WeekendBonusWorld() : WorldScript("WeekendBonusWorld") {} - void OnAfterConfigLoad(bool /*reload*/) override + void OnAfterConfigLoad(bool reload) override { - multiplierExperience = sConfigMgr->GetOption("WeekendBonus.Multiplier.Experience", 2.0f); - multiplierMoney = sConfigMgr->GetOption("WeekendBonus.Multiplier.Money", 2.0f); - multiplierProfessions = sConfigMgr->GetOption("WeekendBonus.Multiplier.Professions", 2.0f); - multiplierReputation = sConfigMgr->GetOption("WeekendBonus.Multiplier.Reputation", 2.0f); - multiplierProficiencies = sConfigMgr->GetOption("WeekendBonus.Multiplier.Proficiencies", 2.0f); + rateExperienceKill = sWorld->getRate(RATE_XP_KILL); + rateExperienceBgKill = sWorld->getRate(RATE_XP_BG_KILL); + rateExperienceQuest = sWorld->getRate(RATE_XP_QUEST); + rateExperienceQuestDf = sWorld->getRate(RATE_XP_QUEST_DF); + rateExperienceExplore = sWorld->getRate(RATE_XP_EXPLORE); + rateExperiencePet = sWorld->getRate(RATE_XP_PET); + rateMoney = sWorld->getRate(RATE_DROP_MONEY); + rateProfessionsCrafting = sWorld->getIntConfig(CONFIG_SKILL_GAIN_CRAFTING); + rateProfessionsGathering = sWorld->getIntConfig(CONFIG_SKILL_GAIN_GATHERING); + rateReputation = sWorld->getRate(RATE_REPUTATION_GAIN); + rateProficienciesDefense = sWorld->getIntConfig(CONFIG_SKILL_GAIN_DEFENSE); + rateProficienciesWeapons = sWorld->getIntConfig(CONFIG_SKILL_GAIN_WEAPON); + + multiplierExperience = sConfigMgr->GetOption("WeekendBonus.Multiplier.Experience", 2.0f); + multiplierMoney = sConfigMgr->GetOption("WeekendBonus.Multiplier.Money", 2.0f); + multiplierProfessions = sConfigMgr->GetOption("WeekendBonus.Multiplier.Professions", 2.0f); + multiplierReputation = sConfigMgr->GetOption("WeekendBonus.Multiplier.Reputation", 2.0f); + multiplierProficiencies = sConfigMgr->GetOption("WeekendBonus.Multiplier.Proficiencies", 2.0f); + + if (reload) + { + if (localtime(&localTime)->tm_wday == Day::FRIDAY || localtime(&localTime)->tm_wday == Day::SATURDAY || localtime(&localTime)->tm_wday == Day::SUNDAY) + SetWorldRates(true); + else + SetWorldRates(false); + } } void OnStartup() override @@ -56,79 +69,89 @@ class WeekendBonusWorld : WorldScript localTime = time(NULL); if (localtime(&localTime)->tm_wday == Day::FRIDAY || localtime(&localTime)->tm_wday == Day::SATURDAY || localtime(&localTime)->tm_wday == Day::SUNDAY) - SetWorldRates(); + SetWorldRates(true); } void OnUpdate(uint32 /*diff*/) override - { - HandleWeekendBonuses(); - } - - private: - bool triggered; - time_t localTime; - - void HandleWeekendBonuses() { localTime = time(NULL); if (localtime(&localTime)->tm_wday == Day::FRIDAY && localtime(&localTime)->tm_hour == 0 && localtime(&localTime)->tm_min == 0 && !triggered) { sWorld->SendServerMessage(SERVER_MSG_STRING, "The weekend bonus is now active, granting you bonuses!"); - - SetWorldRates(); + SetWorldRates(true); + triggered = true; } else if (localtime(&localTime)->tm_wday == Day::MONDAY && localtime(&localTime)->tm_hour == 0 && localtime(&localTime)->tm_min == 0 && triggered) { sWorld->SendServerMessage(SERVER_MSG_STRING, "The weekend bonus is no longer active."); - - SetWorldRates(); + SetWorldRates(false); + triggered = false; } } - void SetWorldRates() + private: + uint32 rateExperienceKill; + uint32 rateExperienceBgKill; + uint32 rateExperienceQuest; + uint32 rateExperienceQuestDf; + uint32 rateExperienceExplore; + uint32 rateExperiencePet; + uint32 rateMoney; + uint32 rateProfessionsCrafting; + uint32 rateProfessionsGathering; + uint32 rateReputation; + uint32 rateProficienciesDefense; + uint32 rateProficienciesWeapons; + + uint32 multiplierExperience; + uint32 multiplierMoney; + uint32 multiplierProfessions; + uint32 multiplierReputation; + uint32 multiplierProficiencies; + + bool triggered; + time_t localTime; + + void SetWorldRates(bool weekend) { - if (!triggered) + if (weekend) { - sWorld->setRate(RATE_XP_KILL, sWorld->getRate(RATE_XP_KILL) * multiplierExperience); - sWorld->setRate(RATE_XP_BG_KILL, sWorld->getRate(RATE_XP_BG_KILL) * multiplierExperience); - sWorld->setRate(RATE_XP_QUEST, sWorld->getRate(RATE_XP_QUEST) * multiplierExperience); - sWorld->setRate(RATE_XP_QUEST_DF, sWorld->getRate(RATE_XP_QUEST_DF) * multiplierExperience); - sWorld->setRate(RATE_XP_EXPLORE, sWorld->getRate(RATE_XP_EXPLORE) * multiplierExperience); - sWorld->setRate(RATE_XP_PET, sWorld->getRate(RATE_XP_PET) * multiplierExperience); + sWorld->setRate(RATE_XP_KILL, rateExperienceKill * multiplierExperience); + sWorld->setRate(RATE_XP_BG_KILL, rateExperienceBgKill * multiplierExperience); + sWorld->setRate(RATE_XP_QUEST, rateExperienceQuest * multiplierExperience); + sWorld->setRate(RATE_XP_QUEST_DF, rateExperienceQuestDf * multiplierExperience); + sWorld->setRate(RATE_XP_EXPLORE, rateExperienceExplore * multiplierExperience); + sWorld->setRate(RATE_XP_PET, rateExperiencePet * multiplierExperience); - sWorld->setRate(RATE_DROP_MONEY, sWorld->getRate(RATE_DROP_MONEY) * multiplierMoney); + sWorld->setRate(RATE_DROP_MONEY, rateMoney * multiplierMoney); - sWorld->setIntConfig(CONFIG_SKILL_GAIN_CRAFTING, sWorld->getIntConfig(CONFIG_SKILL_GAIN_CRAFTING) * multiplierProfessions); - sWorld->setIntConfig(CONFIG_SKILL_GAIN_GATHERING, sWorld->getIntConfig(CONFIG_SKILL_GAIN_GATHERING) * multiplierProfessions); + sWorld->setIntConfig(CONFIG_SKILL_GAIN_CRAFTING, rateProfessionsCrafting * multiplierProfessions); + sWorld->setIntConfig(CONFIG_SKILL_GAIN_GATHERING, rateProfessionsGathering * multiplierProfessions); - sWorld->setRate(RATE_REPUTATION_GAIN, sWorld->getRate(RATE_REPUTATION_GAIN) * multiplierReputation); + sWorld->setRate(RATE_REPUTATION_GAIN, rateReputation * multiplierReputation); - sWorld->setIntConfig(CONFIG_SKILL_GAIN_DEFENSE, sWorld->getIntConfig(CONFIG_SKILL_GAIN_DEFENSE) * multiplierProficiencies); - sWorld->setIntConfig(CONFIG_SKILL_GAIN_WEAPON, sWorld->getIntConfig(CONFIG_SKILL_GAIN_WEAPON) * multiplierProficiencies); - - triggered = true; + sWorld->setIntConfig(CONFIG_SKILL_GAIN_DEFENSE, rateProficienciesDefense * multiplierProficiencies); + sWorld->setIntConfig(CONFIG_SKILL_GAIN_WEAPON, rateProficienciesWeapons * multiplierProficiencies); } else { - sWorld->setRate(RATE_XP_KILL, sWorld->getRate(RATE_XP_KILL) / multiplierExperience); - sWorld->setRate(RATE_XP_BG_KILL, sWorld->getRate(RATE_XP_BG_KILL) / multiplierExperience); - sWorld->setRate(RATE_XP_QUEST, sWorld->getRate(RATE_XP_QUEST) / multiplierExperience); - sWorld->setRate(RATE_XP_QUEST_DF, sWorld->getRate(RATE_XP_QUEST_DF) / multiplierExperience); - sWorld->setRate(RATE_XP_EXPLORE, sWorld->getRate(RATE_XP_EXPLORE) / multiplierExperience); - sWorld->setRate(RATE_XP_PET, sWorld->getRate(RATE_XP_PET) / multiplierExperience); + sWorld->setRate(RATE_XP_KILL, rateExperienceKill); + sWorld->setRate(RATE_XP_BG_KILL, rateExperienceBgKill); + sWorld->setRate(RATE_XP_QUEST, rateExperienceQuest); + sWorld->setRate(RATE_XP_QUEST_DF, rateExperienceQuestDf); + sWorld->setRate(RATE_XP_EXPLORE, rateExperienceExplore); + sWorld->setRate(RATE_XP_PET, rateExperiencePet); - sWorld->setRate(RATE_DROP_MONEY, sWorld->getRate(RATE_DROP_MONEY) / multiplierMoney); + sWorld->setRate(RATE_DROP_MONEY, rateMoney); - sWorld->setIntConfig(CONFIG_SKILL_GAIN_CRAFTING, sWorld->getIntConfig(CONFIG_SKILL_GAIN_CRAFTING) / multiplierProfessions); - sWorld->setIntConfig(CONFIG_SKILL_GAIN_GATHERING, sWorld->getIntConfig(CONFIG_SKILL_GAIN_GATHERING) / multiplierProfessions); + sWorld->setIntConfig(CONFIG_SKILL_GAIN_CRAFTING, rateProfessionsCrafting); + sWorld->setIntConfig(CONFIG_SKILL_GAIN_GATHERING, rateProfessionsGathering); - sWorld->setRate(RATE_REPUTATION_GAIN, sWorld->getRate(RATE_REPUTATION_GAIN) / multiplierReputation); + sWorld->setRate(RATE_REPUTATION_GAIN, rateReputation); - sWorld->setIntConfig(CONFIG_SKILL_GAIN_DEFENSE, sWorld->getIntConfig(CONFIG_SKILL_GAIN_DEFENSE) / multiplierProficiencies); - sWorld->setIntConfig(CONFIG_SKILL_GAIN_WEAPON, sWorld->getIntConfig(CONFIG_SKILL_GAIN_WEAPON) / multiplierProficiencies); - - triggered = false; + sWorld->setIntConfig(CONFIG_SKILL_GAIN_DEFENSE, rateProficienciesDefense); + sWorld->setIntConfig(CONFIG_SKILL_GAIN_WEAPON, rateProficienciesWeapons); } } };