if (!party) {
if (!party) {
is your party share actived by talkactions? if yes, then u can uncheck battle condition.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?
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;
}
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") + ".");
}
make clean
make
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!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?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.
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; }
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;
}
1>..\src\party.cpp(83): warning C4100: 'forceRemove': unreferenced formal parameterSorry, 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
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...
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;
}
party.cpp:A lot of errors in party.cpp
![]()
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
}
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;
}
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 imageparty.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 }
and then try to update ticks maybe?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; }
C++:void Party::updatePlayerTicks(Player* player, uint32_t points) { if (points != 0) { // Only check if points were earned updateSharedExperience(); } }
if (!party) {
if (!party) {
PerfectionRevert your player.cpp and party.cpp changes, and then do these changes in game.cpp
forgottenserver/src/game.cpp at 1.2 · otland/forgottenserver (https://github.com/otland/forgottenserver/blob/1.2/src/game.cpp#L4771) toif (!party) {
forgottenserver/src/game.cpp at 1.2 · otland/forgottenserver (https://github.com/otland/forgottenserver/blob/1.2/src/game.cpp#L4786) toif (!party) {