Changed a large chunk of the module to support reloading config options.
This commit is contained in:
Revision
2022-01-07 03:18:25 +01:00
parent cd536885b8
commit 3cab6b9f37

View File

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