• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

TFS 1.X+ TFS 1.x Party adjustements

henkas

Well-Known Member
Joined
Jul 8, 2015
Messages
1,000
Solutions
5
Reaction score
55
How can i remove this annoying option out of tfs 1.2 where u need to be out of battle to leave party and be out of battle to enable or disable exp share?
 
How can i remove this annoying option out of tfs 1.2 where u need to be out of battle to leave party and be out of battle to enable or disable exp share?
is your party share actived by talkactions? if yes, then u can uncheck battle condition.
about leave, i think events.cpp? look onLeave there
 
Edit the source.

party.cpp:
C++:
bool Party::leaveParty(Player* player) {
    if (!player || player->getParty() != this) {
        return false;
    }

    // Remove or comment out the battle check
    // if (player->isInBattle()) {
    //     player->sendTextMessage(MESSAGE_INFO_DESCR, "You cannot leave the party while in battle.");
    //     return false;
    // }

    if (player == leader) {
        disbandParty();
        return true;
    }

    player->setParty(nullptr);
    updatePartyIcons(player);
    player->sendTextMessage(MESSAGE_INFO_DESCR, "You have left the party.");
    updateAllPartyIcons();

    return true;
}

player.cpp:
C++:
void Player::toggleExpShare(bool enable) {
    // Remove or comment out the battle check
    // if (isInBattle()) {
    //     sendTextMessage(MESSAGE_INFO_DESCR, "You cannot toggle experience share while in battle.");
    //     return;
    // }

    if (enable == expShareEnabled) {
        return;
    }

    expShareEnabled = enable;
    sendTextMessage(MESSAGE_INFO_DESCR, "Experience share is now " + std::string(enable ? "enabled" : "disabled") + ".");
}

Recompile:
Code:
make clean
make

Replace the old binary in your server folder with the new one you compiled and test it out.

I hope this helps.
 
Edit the source.

party.cpp:
C++:
bool Party::leaveParty(Player* player) {
    if (!player || player->getParty() != this) {
        return false;
    }

    // Remove or comment out the battle check
    // if (player->isInBattle()) {
    //     player->sendTextMessage(MESSAGE_INFO_DESCR, "You cannot leave the party while in battle.");
    //     return false;
    // }

    if (player == leader) {
        disbandParty();
        return true;
    }

    player->setParty(nullptr);
    updatePartyIcons(player);
    player->sendTextMessage(MESSAGE_INFO_DESCR, "You have left the party.");
    updateAllPartyIcons();

    return true;
}

player.cpp:
C++:
void Player::toggleExpShare(bool enable) {
    // Remove or comment out the battle check
    // if (isInBattle()) {
    //     sendTextMessage(MESSAGE_INFO_DESCR, "You cannot toggle experience share while in battle.");
    //     return;
    // }

    if (enable == expShareEnabled) {
        return;
    }

    expShareEnabled = enable;
    sendTextMessage(MESSAGE_INFO_DESCR, "Experience share is now " + std::string(enable ? "enabled" : "disabled") + ".");
}

Recompile:
Code:
make clean
make

Replace the old binary in your server folder with the new one you compiled and test it out.

I hope this helps.
I'm not sure if on newer TFS 1.X should be this line here... If someone can confirm and tell if this won't break anything else would be nice!
1716985739063.png
 
Edit the source.

party.cpp:
C++:
bool Party::leaveParty(Player* player) {
    if (!player || player->getParty() != this) {
        return false;
    }

    // Remove or comment out the battle check
    // if (player->isInBattle()) {
    //     player->sendTextMessage(MESSAGE_INFO_DESCR, "You cannot leave the party while in battle.");
    //     return false;
    // }

    if (player == leader) {
        disbandParty();
        return true;
    }

    player->setParty(nullptr);
    updatePartyIcons(player);
    player->sendTextMessage(MESSAGE_INFO_DESCR, "You have left the party.");
    updateAllPartyIcons();

    return true;
}

player.cpp:
C++:
void Player::toggleExpShare(bool enable) {
    // Remove or comment out the battle check
    // if (isInBattle()) {
    //     sendTextMessage(MESSAGE_INFO_DESCR, "You cannot toggle experience share while in battle.");
    //     return;
    // }

    if (enable == expShareEnabled) {
        return;
    }

    expShareEnabled = enable;
    sendTextMessage(MESSAGE_INFO_DESCR, "Experience share is now " + std::string(enable ? "enabled" : "disabled") + ".");
}

Recompile:
Code:
make clean
make

Replace the old binary in your server folder with the new one you compiled and test it out.

I hope this helps.
Sheet my bool looks way different from yours maybe because its tfs 1.2?
C++:
bool Party::leaveParty(Player* player, bool forceRemove /* = false */)
{
    if (!player) {
        return false;
    }

    if (player->getParty() != this && leader != player) {
        return false;
    }

    bool canRemove = g_events->eventPartyOnLeave(this, player);
    if (!forceRemove && !canRemove) {
        return false;
    }

    bool missingLeader = false;
    if (leader == player) {
        if (!memberList.empty()) {
            if (memberList.size() == 1 && inviteList.empty()) {
                missingLeader = true;
            } else {
                passPartyLeadership(memberList.front());
            }
        } else {
            missingLeader = true;
        }
    }

    //since we already passed the leadership, we remove the player from the list
    auto it = std::find(memberList.begin(), memberList.end(), player);
    if (it != memberList.end()) {
        memberList.erase(it);
    }

    player->setParty(nullptr);
    player->sendClosePrivate(CHANNEL_PARTY);
    g_game.updatePlayerShield(player);

    for (Player* member : memberList) {
        member->sendCreatureSkull(player);
        player->sendPlayerPartyIcons(member);
    }

    leader->sendCreatureSkull(player);
    player->sendCreatureSkull(player);
    player->sendPlayerPartyIcons(leader);

    player->sendTextMessage(MESSAGE_INFO_DESCR, "You have left the party.");

    updateSharedExperience();
    updateVocationsList();

    clearPlayerPoints(player);

    std::ostringstream ss;
    ss << player->getName() << " has left the party.";
    broadcastPartyMessage(MESSAGE_INFO_DESCR, ss.str());

    if (missingLeader || empty()) {
        disband();
    }

    return true;
}
 
Sheet my bool looks way different from yours maybe because its tfs 1.2?
C++:
bool Party::leaveParty(Player* player, bool forceRemove /* = false */)
{
    if (!player) {
        return false;
    }

    if (player->getParty() != this && leader != player) {
        return false;
    }

    bool canRemove = g_events->eventPartyOnLeave(this, player);
    if (!forceRemove && !canRemove) {
        return false;
    }

    bool missingLeader = false;
    if (leader == player) {
        if (!memberList.empty()) {
            if (memberList.size() == 1 && inviteList.empty()) {
                missingLeader = true;
            } else {
                passPartyLeadership(memberList.front());
            }
        } else {
            missingLeader = true;
        }
    }

    //since we already passed the leadership, we remove the player from the list
    auto it = std::find(memberList.begin(), memberList.end(), player);
    if (it != memberList.end()) {
        memberList.erase(it);
    }

    player->setParty(nullptr);
    player->sendClosePrivate(CHANNEL_PARTY);
    g_game.updatePlayerShield(player);

    for (Player* member : memberList) {
        member->sendCreatureSkull(player);
        player->sendPlayerPartyIcons(member);
    }

    leader->sendCreatureSkull(player);
    player->sendCreatureSkull(player);
    player->sendPlayerPartyIcons(leader);

    player->sendTextMessage(MESSAGE_INFO_DESCR, "You have left the party.");

    updateSharedExperience();
    updateVocationsList();

    clearPlayerPoints(player);

    std::ostringstream ss;
    ss << player->getName() << " has left the party.";
    broadcastPartyMessage(MESSAGE_INFO_DESCR, ss.str());

    if (missingLeader || empty()) {
        disband();
    }

    return true;
}

Sorry, if I'm being honest I have absolutely no idea what version I was using but it definitely was not TFS 1.2. Try this:


C++:
bool Party::leaveParty(Player* player, bool forceRemove /* = false */)
{
    if (!player) {
        return false;
    }

    if (player->getParty() != this && leader != player) {
        return false;
    }

    // Skip the event check
    // bool canRemove = g_events->eventPartyOnLeave(this, player);
    // if (!forceRemove && !canRemove) {
    //     return false;
    // }

    bool missingLeader = false;
    if (leader == player) {
        if (!memberList.empty()) {
            if (memberList.size() == 1 && inviteList.empty()) {
                missingLeader = true;
            } else {
                passPartyLeadership(memberList.front());
            }
        } else {
            missingLeader = true;
        }
    }

    //since we already passed the leadership, we remove the player from the list
    auto it = std::find(memberList.begin(), memberList.end(), player);
    if (it != memberList.end()) {
        memberList.erase(it);
    }

    player->setParty(nullptr);
    player->sendClosePrivate(CHANNEL_PARTY);
    g_game.updatePlayerShield(player);

    for (Player* member : memberList) {
        member->sendCreatureSkull(player);
        player->sendPlayerPartyIcons(member);
    }

    leader->sendCreatureSkull(player);
    player->sendCreatureSkull(player);
    player->sendPlayerPartyIcons(leader);

    player->sendTextMessage(MESSAGE_INFO_DESCR, "You have left the party.");

    updateSharedExperience();
    updateVocationsList();

    clearPlayerPoints(player);

    std::ostringstream ss;
    ss << player->getName() << " has left the party.";
    broadcastPartyMessage(MESSAGE_INFO_DESCR, ss.str());

    if (missingLeader || empty()) {
        disband();
    }

    return true;
}

Is player.cpp also wrong for you?
 
Sorry, if I'm being honest I have absolutely no idea what version I was using but it definitely was not TFS 1.2. Try this:


C++:
bool Party::leaveParty(Player* player, bool forceRemove /* = false */)
{
    if (!player) {
        return false;
    }

    if (player->getParty() != this && leader != player) {
        return false;
    }

    // Skip the event check
    // bool canRemove = g_events->eventPartyOnLeave(this, player);
    // if (!forceRemove && !canRemove) {
    //     return false;
    // }

    bool missingLeader = false;
    if (leader == player) {
        if (!memberList.empty()) {
            if (memberList.size() == 1 && inviteList.empty()) {
                missingLeader = true;
            } else {
                passPartyLeadership(memberList.front());
            }
        } else {
            missingLeader = true;
        }
    }

    //since we already passed the leadership, we remove the player from the list
    auto it = std::find(memberList.begin(), memberList.end(), player);
    if (it != memberList.end()) {
        memberList.erase(it);
    }

    player->setParty(nullptr);
    player->sendClosePrivate(CHANNEL_PARTY);
    g_game.updatePlayerShield(player);

    for (Player* member : memberList) {
        member->sendCreatureSkull(player);
        player->sendPlayerPartyIcons(member);
    }

    leader->sendCreatureSkull(player);
    player->sendCreatureSkull(player);
    player->sendPlayerPartyIcons(leader);

    player->sendTextMessage(MESSAGE_INFO_DESCR, "You have left the party.");

    updateSharedExperience();
    updateVocationsList();

    clearPlayerPoints(player);

    std::ostringstream ss;
    ss << player->getName() << " has left the party.";
    broadcastPartyMessage(MESSAGE_INFO_DESCR, ss.str());

    if (missingLeader || empty()) {
        disband();
    }

    return true;
}

Is player.cpp also wrong for you?
1>..\src\party.cpp(83): warning C4100: 'forceRemove': unreferenced formal parameter
It still compiled but, couldnt leave party with pz so didnt changed anything

Yea player.cpp is different doesnt even have that void
 
1>..\src\party.cpp(83): warning C4100: 'forceRemove': unreferenced formal parameter
It still compiled but, couldnt leave party with pz so didnt changed anything

Yea player.cpp is different doesnt even have that void

I see, doesn't look like there's anything to change in player.cpp so try this:

party.cpp
C++:
bool Party::leaveParty(Player* player) {
    if (!player) {
        return false;
    }
    if (player->getParty() != this && leader != player) {
        return false;
    }
    if (!g_events->eventPartyOnLeave(this, player)) {
        return false;
    }
    // Remove the battle check here
    // if (!player->isOutOfBattle()) {
    //     return false;
    // }

    // rest of code...
C++:
bool Party::setSharedExperience(Player* player, bool sharedExpActive) {
    if (!player || leader != player) {
        return false;
    }
    if (this->sharedExpActive == sharedExpActive) {
        return true;
    }
    this->sharedExpActive = sharedExpActive;

    // Remove the battle check here
    // if (sharedExpActive && !player->isOutOfBattle()) {
    //     player->sendTextMessage(MESSAGE_INFO_DESCR, "You cannot enable shared experience while in battle.");
    //     return false;
    // }

    if (sharedExpActive) {
        this->sharedExpEnabled = canEnableSharedExperience();
        if (this->sharedExpEnabled) {
            leader->sendTextMessage(MESSAGE_INFO_DESCR, "Shared Experience is now active.");
        } else {
            leader->sendTextMessage(MESSAGE_INFO_DESCR, "Shared Experience has been activated, but some members of your party are inactive.");
        }
    } else {
        leader->sendTextMessage(MESSAGE_INFO_DESCR, "Shared Experience has been deactivated.");
    }
    updateAllPartyIcons();
    return true;
}
 
Last edited:
I see, let me take a look.
A lot of errors in party.cpp

2450efc2d712d4870408541c59a83c30.png
 
A lot of errors in party.cpp

2450efc2d712d4870408541c59a83c30.png
party.cpp:
C++:
bool Party::canUseSharedExperience(const Player* player) const
{
    if (memberList.empty()) {
        return false;
    }

    uint32_t highestLevel = leader->getLevel();
    for (Player* member : memberList) {
        if (member->getLevel() > highestLevel) {
            highestLevel = member->getLevel();
        }
    }

    uint32_t minLevel = static_cast<int32_t>(std::ceil((static_cast<float>(highestLevel) * 2) / 3));
    if (player->getLevel() < minLevel) {
        return false;
    }

    if (!Position::areInRange<30, 30, 1>(leader->getPosition(), player->getPosition())) {
        return false;
    }

    return true; // Removed combat activity check
}
C++:
bool Party::leaveParty(Player* player)
{
    if (!player) {
        return false;
    }

    if (player->getParty() != this && leader != player) {
        return false;
    }

    if (!g_events->eventPartyOnLeave(this, player)) {
        return false;
    }

    bool missingLeader = false;
    if (leader == player) {
        if (!memberList.empty()) {
            if (memberList.size() == 1 && inviteList.empty()) {
                missingLeader = true;
            } else {
                passPartyLeadership(memberList.front());
            }
        } else {
            missingLeader = true;
        }
    }

    // Remove the player from the member list
    auto it = std::find(memberList.begin(), memberList.end(), player);
    if (it != memberList.end()) {
        memberList.erase(it);
    }

    player->setParty(nullptr);
    player->sendClosePrivate(CHANNEL_PARTY);
    g_game.updatePlayerShield(player);
    g_game.updatePlayerHelpers(*player);

    for (Player* member : memberList) {
        member->sendCreatureSkull(player);
        player->sendPlayerPartyIcons(member);
        g_game.updatePlayerHelpers(*member);
    }

    leader->sendCreatureSkull(player);
    player->sendCreatureSkull(player);
    player->sendPlayerPartyIcons(leader);

    player->sendTextMessage(MESSAGE_INFO_DESCR, "You have left the party.");

    updateSharedExperience();
    updateVocationsList();

    clearPlayerPoints(player);

    std::ostringstream ss;
    ss << player->getName() << " has left the party.";
    broadcastPartyMessage(MESSAGE_INFO_DESCR, ss.str());

    if (missingLeader || empty()) {
        disband();
    }

    return true;
}
and then try to update ticks maybe?
C++:
void Party::updatePlayerTicks(Player* player, uint32_t points)
{
    if (points != 0) { // Only check if points were earned
        updateSharedExperience();
    }
}
 
party.cpp:
C++:
bool Party::canUseSharedExperience(const Player* player) const
{
    if (memberList.empty()) {
        return false;
    }

    uint32_t highestLevel = leader->getLevel();
    for (Player* member : memberList) {
        if (member->getLevel() > highestLevel) {
            highestLevel = member->getLevel();
        }
    }

    uint32_t minLevel = static_cast<int32_t>(std::ceil((static_cast<float>(highestLevel) * 2) / 3));
    if (player->getLevel() < minLevel) {
        return false;
    }

    if (!Position::areInRange<30, 30, 1>(leader->getPosition(), player->getPosition())) {
        return false;
    }

    return true; // Removed combat activity check
}
C++:
bool Party::leaveParty(Player* player)
{
    if (!player) {
        return false;
    }

    if (player->getParty() != this && leader != player) {
        return false;
    }

    if (!g_events->eventPartyOnLeave(this, player)) {
        return false;
    }

    bool missingLeader = false;
    if (leader == player) {
        if (!memberList.empty()) {
            if (memberList.size() == 1 && inviteList.empty()) {
                missingLeader = true;
            } else {
                passPartyLeadership(memberList.front());
            }
        } else {
            missingLeader = true;
        }
    }

    // Remove the player from the member list
    auto it = std::find(memberList.begin(), memberList.end(), player);
    if (it != memberList.end()) {
        memberList.erase(it);
    }

    player->setParty(nullptr);
    player->sendClosePrivate(CHANNEL_PARTY);
    g_game.updatePlayerShield(player);
    g_game.updatePlayerHelpers(*player);

    for (Player* member : memberList) {
        member->sendCreatureSkull(player);
        player->sendPlayerPartyIcons(member);
        g_game.updatePlayerHelpers(*member);
    }

    leader->sendCreatureSkull(player);
    player->sendCreatureSkull(player);
    player->sendPlayerPartyIcons(leader);

    player->sendTextMessage(MESSAGE_INFO_DESCR, "You have left the party.");

    updateSharedExperience();
    updateVocationsList();

    clearPlayerPoints(player);

    std::ostringstream ss;
    ss << player->getName() << " has left the party.";
    broadcastPartyMessage(MESSAGE_INFO_DESCR, ss.str());

    if (missingLeader || empty()) {
        disband();
    }

    return true;
}
and then try to update ticks maybe?
C++:
void Party::updatePlayerTicks(Player* player, uint32_t points)
{
    if (points != 0) { // Only check if points were earned
        updateSharedExperience();
    }
}
Same bunch of errors like in the image
 
Solution
Back
Top