nanduzenho
Member
Good afternoon, does anyone know why when i send parcel to a char of the same account, i don't receive the parcel?
My server is Alkurius TFS 1.3
My server is Alkurius TFS 1.3
mailbox.cpp
this code has different functions than TFS 1.3you will need to apply these changes:
Fix depot locker not saving mails · nekiro/TFS-1.5-Downgrades@9aa7a38
Alternative forgottenserver versions for older protocols support - Fix depot locker not saving mails · nekiro/TFS-1.5-Downgrades@9aa7a38github.com
but you will also need to apply some of these changes:
New option to prevent removing items from house if player is not invi… · otland/forgottenserver@6478e1a
…ted (#3159) config.lua: onlyInvitedCanMoveHouseItems = truegithub.com
and you will still have tons of bugs because that datapack have unoptimized code (like the query being executed every time you kill a monster at onGainExperience) and is based in an old downgrade that doesn't contains a lot of fixes
My mailbox.cpp is sameThere is not enough information to help him, if you have something else you can share with us it would be great
the package delivery system in official TFS 1.3 works correctly
check this in your sources:
mailbox.cpp
forgottenserver/src/mailbox.cpp at 8cc1f3d51c6f4c90ce66b6d3122ce4388d709fe8 · otland/forgottenserver
A free and open-source MMORPG server emulator written in C++ - otland/forgottenservergithub.com
if (player) {
DepotLocker* depotLocker = player->getDepotLocker(depotId);
if (depotLocker) {
if (g_game.internalMoveItem(item->getParent(), depotLocker, INDEX_WHEREEVER, item, item->getItemCount(), nullptr) == RETURNVALUE_NOERROR) {
g_game.transformItem(item, item->getID() + 1);
player->onReceiveMail();
return true;
}
}
} else {
Player tmpPlayer(nullptr);
if (!IOLoginData::loadPlayerByName(&tmpPlayer, receiver)) {
return false;
}
DepotLocker* depotLocker = tmpPlayer.getDepotLocker(depotId);
if (depotLocker) {
if (g_game.internalMoveItem(item->getParent(), depotLocker, INDEX_WHEREEVER, item, item->getItemCount(), nullptr) == RETURNVALUE_NOERROR) {
g_game.transformItem(item, item->getID() + 1);
IOLoginData::savePlayer(&tmpPlayer);
return true;
}
}
}
if (player) {
DepotLocker* depotLocker = player->getDepotLocker(depotId);
if (depotLocker) {
if (g_game.internalMoveItem(item->getParent(), depotLocker, INDEX_WHEREEVER, item, item->getItemCount(), nullptr) == RETURNVALUE_NOERROR) {
g_game.transformItem(item, item->getID() + 1);
player->setLastDepotId(depotId); <<<< HERE
player->onReceiveMail();
return true;
}
}
} else {
Player tmpPlayer(nullptr);
if (!IOLoginData::loadPlayerByName(&tmpPlayer, receiver)) {
return false;
}
DepotLocker* depotLocker = tmpPlayer.getDepotLocker(depotId);
if (depotLocker) {
if (g_game.internalMoveItem(item->getParent(), depotLocker, INDEX_WHEREEVER, item, item->getItemCount(), nullptr) == RETURNVALUE_NOERROR) {
g_game.transformItem(item, item->getID() + 1);
tmpPlayer.setLastDepotId(depotId); <<<< HERE
IOLoginData::savePlayer(&tmpPlayer);
return true;
}
}
}
Thank u!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!@nanduzenho
TFS 1.3 = 10.99 protocol -> has 'inbox' in depot
Alkurius TFS 1.3 = 8.6 protocol -> NO 'inbox' in depot
In TFS, there is a code, that make depot 'not save', if player did not visit depot - to reduce number of database queries.
Your mailbox.cpp add items 'to depot', as it worked on 8.6:
and it makes all parcels sent to offline players and player who relog without visiting depot disappear.Code:if (player) { DepotLocker* depotLocker = player->getDepotLocker(depotId); if (depotLocker) { if (g_game.internalMoveItem(item->getParent(), depotLocker, INDEX_WHEREEVER, item, item->getItemCount(), nullptr) == RETURNVALUE_NOERROR) { g_game.transformItem(item, item->getID() + 1); player->onReceiveMail(); return true; } } } else { Player tmpPlayer(nullptr); if (!IOLoginData::loadPlayerByName(&tmpPlayer, receiver)) { return false; } DepotLocker* depotLocker = tmpPlayer.getDepotLocker(depotId); if (depotLocker) { if (g_game.internalMoveItem(item->getParent(), depotLocker, INDEX_WHEREEVER, item, item->getItemCount(), nullptr) == RETURNVALUE_NOERROR) { g_game.transformItem(item, item->getID() + 1); IOLoginData::savePlayer(&tmpPlayer); return true; } } }
You must add code that 'mark depot as visited by player':
Code:if (player) { DepotLocker* depotLocker = player->getDepotLocker(depotId); if (depotLocker) { if (g_game.internalMoveItem(item->getParent(), depotLocker, INDEX_WHEREEVER, item, item->getItemCount(), nullptr) == RETURNVALUE_NOERROR) { g_game.transformItem(item, item->getID() + 1); player->setLastDepotId(depotId); <<<< HERE player->onReceiveMail(); return true; } } } else { Player tmpPlayer(nullptr); if (!IOLoginData::loadPlayerByName(&tmpPlayer, receiver)) { return false; } DepotLocker* depotLocker = tmpPlayer.getDepotLocker(depotId); if (depotLocker) { if (g_game.internalMoveItem(item->getParent(), depotLocker, INDEX_WHEREEVER, item, item->getItemCount(), nullptr) == RETURNVALUE_NOERROR) { g_game.transformItem(item, item->getID() + 1); tmpPlayer.setLastDepotId(depotId); <<<< HERE IOLoginData::savePlayer(&tmpPlayer); return true; } } }
Bro, it worked, but when it is (sent in parcel with a large amount of items), it doesn't work, the player doesn't receive the parcel...=/@nanduzenho
TFS 1.3 = 10.99 protocol -> has 'inbox' in depot
Alkurius TFS 1.3 = 8.6 protocol -> NO 'inbox' in depot
In TFS, there is a code, that make depot 'not save', if player did not visit depot - to reduce number of database queries.
Your mailbox.cpp add items 'to depot', as it worked on 8.6:
and it makes all parcels sent to offline players and player who relog without visiting depot disappear.Code:if (player) { DepotLocker* depotLocker = player->getDepotLocker(depotId); if (depotLocker) { if (g_game.internalMoveItem(item->getParent(), depotLocker, INDEX_WHEREEVER, item, item->getItemCount(), nullptr) == RETURNVALUE_NOERROR) { g_game.transformItem(item, item->getID() + 1); player->onReceiveMail(); return true; } } } else { Player tmpPlayer(nullptr); if (!IOLoginData::loadPlayerByName(&tmpPlayer, receiver)) { return false; } DepotLocker* depotLocker = tmpPlayer.getDepotLocker(depotId); if (depotLocker) { if (g_game.internalMoveItem(item->getParent(), depotLocker, INDEX_WHEREEVER, item, item->getItemCount(), nullptr) == RETURNVALUE_NOERROR) { g_game.transformItem(item, item->getID() + 1); IOLoginData::savePlayer(&tmpPlayer); return true; } } }
You must add code that 'mark depot as visited by player':
Code:if (player) { DepotLocker* depotLocker = player->getDepotLocker(depotId); if (depotLocker) { if (g_game.internalMoveItem(item->getParent(), depotLocker, INDEX_WHEREEVER, item, item->getItemCount(), nullptr) == RETURNVALUE_NOERROR) { g_game.transformItem(item, item->getID() + 1); player->setLastDepotId(depotId); <<<< HERE player->onReceiveMail(); return true; } } } else { Player tmpPlayer(nullptr); if (!IOLoginData::loadPlayerByName(&tmpPlayer, receiver)) { return false; } DepotLocker* depotLocker = tmpPlayer.getDepotLocker(depotId); if (depotLocker) { if (g_game.internalMoveItem(item->getParent(), depotLocker, INDEX_WHEREEVER, item, item->getItemCount(), nullptr) == RETURNVALUE_NOERROR) { g_game.transformItem(item, item->getID() + 1); tmpPlayer.setLastDepotId(depotId); <<<< HERE IOLoginData::savePlayer(&tmpPlayer); return true; } } }