Skip to content

Commit

Permalink
feat: automatically share exp when starting party (opentibiabr#1558)
Browse files Browse the repository at this point in the history
  • Loading branch information
luan authored and JasterDesu committed Sep 14, 2023
1 parent 45962b5 commit 9cdae7e
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 20 deletions.
1 change: 1 addition & 0 deletions config.lua.dist
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
1 change: 1 addition & 0 deletions src/config/config_definitions.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
1 change: 1 addition & 0 deletions src/config/configmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
70 changes: 51 additions & 19 deletions src/creatures/players/grouping/party.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down Expand Up @@ -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.";
Expand Down Expand Up @@ -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;
}
Expand All @@ -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();
Expand All @@ -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<uint32_t>(std::ceil((static_cast<float>(highestLevel) * 2) / 3));
uint32_t highestLevel = getHighestLevel();
uint32_t minLevel = getMinLevel();
if (player->getLevel() < minLevel) {
return SHAREDEXP_LEVELDIFFTOOLARGE;
}
Expand All @@ -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<uint64_t>(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<uint32_t>(std::ceil((static_cast<float>(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<uint32_t>(std::floor((static_cast<float>(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() {
Expand Down
7 changes: 6 additions & 1 deletion src/creatures/players/grouping/party.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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<uint32_t, int64_t> ticksMap;

Expand Down

0 comments on commit 9cdae7e

Please sign in to comment.