From 9cdae7e34edbe9d523cd90c074c46b7f94167faa Mon Sep 17 00:00:00 2001 From: Luan Santos Date: Mon, 4 Sep 2023 07:29:46 -0700 Subject: [PATCH] feat: automatically share exp when starting party (#1558) --- config.lua.dist | 1 + src/config/config_definitions.hpp | 1 + src/config/configmanager.cpp | 1 + src/creatures/players/grouping/party.cpp | 70 +++++++++++++++++------- src/creatures/players/grouping/party.hpp | 7 ++- 5 files changed, 60 insertions(+), 20 deletions(-) diff --git a/config.lua.dist b/config.lua.dist index 2bc6bbfd8fa..09c34ca798c 100644 --- a/config.lua.dist +++ b/config.lua.dist @@ -161,6 +161,7 @@ wheelPointsPerLevel = 1 -- Only change it here if you know what you are doing or to make testing easier with familiars familiarTime = 30 +partyAutoShareExperience = true partyShareLootBoosts = false partyShareLootBoostsDimishingFactor = 0.7 diff --git a/src/config/config_definitions.hpp b/src/config/config_definitions.hpp index f6df1d37b46..69b2c8d8bee 100644 --- a/src/config/config_definitions.hpp +++ b/src/config/config_definitions.hpp @@ -76,6 +76,7 @@ enum booleanConfig_t { OLD_PROTOCOL, TOGGLE_HAZARDSYSTEM, LOYALTY_ENABLED, + PARTY_AUTO_SHARE_EXPERIENCE, PARTY_SHARE_LOOT_BOOSTS, RESET_SESSIONS_ON_STARTUP, TOGGLE_WHEELSYSTEM, diff --git a/src/config/configmanager.cpp b/src/config/configmanager.cpp index 60130ccdc98..cb83ca5645a 100644 --- a/src/config/configmanager.cpp +++ b/src/config/configmanager.cpp @@ -352,6 +352,7 @@ bool ConfigManager::load() { boolean[TOGGLE_WHEELSYSTEM] = getGlobalBoolean(L, "wheelSystemEnabled", true); integer[WHEEL_POINTS_PER_LEVEL] = getGlobalNumber(L, "wheelPointsPerLevel", 1); + boolean[PARTY_AUTO_SHARE_EXPERIENCE] = getGlobalBoolean(L, "partyAutoShareExperience", true); boolean[PARTY_SHARE_LOOT_BOOSTS] = getGlobalBoolean(L, "partyShareLootBoosts", true); integer[TIBIADROME_CONCOCTION_COOLDOWN] = getGlobalNumber(L, "tibiadromeConcoctionCooldown", 24 * 60 * 60); integer[TIBIADROME_CONCOCTION_DURATION] = getGlobalNumber(L, "tibiadromeConcoctionDuration", 1 * 60 * 60); diff --git a/src/creatures/players/grouping/party.cpp b/src/creatures/players/grouping/party.cpp index 35835f4b8b2..eb203f17cdb 100644 --- a/src/creatures/players/grouping/party.cpp +++ b/src/creatures/players/grouping/party.cpp @@ -16,6 +16,9 @@ Party::Party(Player* initLeader) : leader(initLeader) { leader->setParty(this); + if (g_configManager().getBoolean(PARTY_AUTO_SHARE_EXPERIENCE)) { + setSharedExperience(initLeader, true); + } } void Party::disband() { @@ -263,7 +266,7 @@ bool Party::invitePlayer(Player &player) { } std::ostringstream ss; - ss << player.getName() << " has been invited."; + ss << player.getName() << " has been invited to join the party (Share range: " << getMinLevel() << "-" << getMaxLevel() << ")."; if (empty()) { ss << " Open the party channel to communicate with your members."; @@ -349,7 +352,7 @@ const char* Party::getSharedExpReturnMessage(SharedExpStatus_t value) { } } -bool Party::setSharedExperience(Player* player, bool newSharedExpActive) { +bool Party::setSharedExperience(Player* player, bool newSharedExpActive, bool silent /*= false*/) { if (!player || leader != player) { return false; } @@ -363,9 +366,13 @@ bool Party::setSharedExperience(Player* player, bool newSharedExpActive) { if (newSharedExpActive) { SharedExpStatus_t sharedExpStatus = getSharedExperienceStatus(); this->sharedExpEnabled = sharedExpStatus == SHAREDEXP_OK; - leader->sendTextMessage(MESSAGE_PARTY_MANAGEMENT, getSharedExpReturnMessage(sharedExpStatus)); + if (!silent) { + leader->sendTextMessage(MESSAGE_PARTY_MANAGEMENT, getSharedExpReturnMessage(sharedExpStatus)); + } } else { - leader->sendTextMessage(MESSAGE_PARTY_MANAGEMENT, "Shared Experience has been deactivated."); + if (!silent) { + leader->sendTextMessage(MESSAGE_PARTY_MANAGEMENT, "Shared Experience has been deactivated."); + } } updateAllPartyIcons(); @@ -390,14 +397,8 @@ SharedExpStatus_t Party::getMemberSharedExperienceStatus(const Player* player) c return SHAREDEXP_EMPTYPARTY; } - uint32_t highestLevel = leader->getLevel(); - for (Player* member : memberList) { - if (member->getLevel() > highestLevel) { - highestLevel = member->getLevel(); - } - } - - uint32_t minLevel = static_cast(std::ceil((static_cast(highestLevel) * 2) / 3)); + uint32_t highestLevel = getHighestLevel(); + uint32_t minLevel = getMinLevel(); if (player->getLevel() < minLevel) { return SHAREDEXP_LEVELDIFFTOOLARGE; } @@ -407,18 +408,49 @@ SharedExpStatus_t Party::getMemberSharedExperienceStatus(const Player* player) c } if (!player->hasFlag(PlayerFlags_t::NotGainInFight)) { - // check if the player has healed/attacked anything recently - auto it = ticksMap.find(player->getID()); - if (it == ticksMap.end()) { + if (!isPlayerActive(player)) { return SHAREDEXP_MEMBERINACTIVE; } + } + return SHAREDEXP_OK; +} - uint64_t timeDiff = OTSYS_TIME() - it->second; - if (timeDiff > static_cast(g_configManager().getNumber(PZ_LOCKED))) { - return SHAREDEXP_MEMBERINACTIVE; +uint32_t Party::getHighestLevel() const { + uint32_t highestLevel = leader->getLevel(); + for (Player* member : memberList) { + if (member->getLevel() > highestLevel) { + highestLevel = member->getLevel(); } } - return SHAREDEXP_OK; + return highestLevel; +} + +uint32_t Party::getMinLevel() const { + return static_cast(std::ceil((static_cast(getHighestLevel()) * 2) / 3)); +} + +uint32_t Party::getLowestLevel() const { + uint32_t lowestLevel = leader->getLevel(); + for (Player* member : memberList) { + if (member->getLevel() < lowestLevel) { + lowestLevel = member->getLevel(); + } + } + return lowestLevel; +} + +uint32_t Party::getMaxLevel() const { + return static_cast(std::floor((static_cast(getLowestLevel()) * 3) / 2)); +} + +bool Party::isPlayerActive(const Player* player) const { + auto it = ticksMap.find(player->getID()); + if (it == ticksMap.end()) { + return false; + } + + uint64_t timeDiff = OTSYS_TIME() - it->second; + return timeDiff <= 2 * 60 * 1000; } SharedExpStatus_t Party::getSharedExperienceStatus() { diff --git a/src/creatures/players/grouping/party.hpp b/src/creatures/players/grouping/party.hpp index e66a4248989..c89a6eb65b9 100644 --- a/src/creatures/players/grouping/party.hpp +++ b/src/creatures/players/grouping/party.hpp @@ -64,7 +64,7 @@ class Party { bool canOpenCorpse(uint32_t ownerId) const; void shareExperience(uint64_t experience, Creature* target = nullptr); - bool setSharedExperience(Player* player, bool sharedExpActive); + bool setSharedExperience(Player* player, bool sharedExpActive, bool silent = false); bool isSharedExperienceActive() const { return sharedExpActive; } @@ -117,7 +117,12 @@ class Party { private: const char* getSharedExpReturnMessage(SharedExpStatus_t value); + bool isPlayerActive(const Player* player) const; SharedExpStatus_t getSharedExperienceStatus(); + uint32_t getHighestLevel() const; + uint32_t getLowestLevel() const; + uint32_t getMinLevel() const; + uint32_t getMaxLevel() const; std::map ticksMap;