• 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!

Lua Leave house don't send items to depot

silveralol

Advanced OT User
Joined
Mar 16, 2010
Messages
1,480
Solutions
9
Reaction score
211
as the title says I have an issue, when I buy a house and then left some items inside and use the command leave house the items don't be moved to the depot
I use tfs 1.1/2 it is old so I'll leave all the codes here
house.cpp
Code:
https://hastebin.com/isilovopud.php
house.h
Code:
https://hastebin.com/ayamogirun.m
leavehouse.lua (talkaction)
Code:
function onSay(player, words, param)
    local house = Tile(player:getPosition()):getHouse()
    if not house then
        player:sendCancelMessage("You are not inside a house.")
        player:getPosition():sendMagicEffect(CONST_ME_POFF)
        return false
    end

    if house:getOwnerGuid() ~= player:getGuid() then
        player:sendCancelMessage("You are not the owner of this house.")
        player:getPosition():sendMagicEffect(CONST_ME_POFF)
        return false
    end

    house:setOwnerGuid(0)
    player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You have successfully left your house.")
    player:getPosition():sendMagicEffect(CONST_ME_POFF)
    return false
end
also, somebody can tell the line logical about house behavior, I want to understand everything
 
Have you tried using the default function (C++ codes) from the version you based your TFS on?
That code was added not long ago to 1.3, might be a bug that no one has noticed so check if you still have the same problem with the C++ code or not.

If it's the same bug with the C++ code you need to trace down the function that cleans the house.
 
seems that my code is almost same from TFS ...
I'll find the clean house function
my code function:
Code:
bool House::transferToDepot() const
{
    if (townid == 0 || owner == 0) {
        return false;
    }

    Player* player = g_game.getPlayerByGUID(owner);
    if (player) {
        transferToDepot(player);
    } else {
        Player tmpPlayer(nullptr);
        if (!IOLoginData::loadPlayerById(&tmpPlayer, owner)) {
            return false;
        }

        transferToDepot(&tmpPlayer);
        IOLoginData::savePlayer(&tmpPlayer);
    }
    return true;
}
and
Code:
bool House::transferToDepot(Player* player) const
{
    if (townid == 0 || owner == 0) {
        return false;
    }

    ItemList moveItemList;
    for (HouseTile* tile : houseTiles) {
        if (const TileItemVector* items = tile->getItemList()) {
            for (Item* item : *items) {
                if (item->isPickupable()) {
                    moveItemList.push_back(item);
                } else {
                    Container* container = item->getContainer();
                    if (container) {
                        for (Item* containerItem : container->getItemList()) {
                            moveItemList.push_back(containerItem);
                        }
                    }
                }
            }
        }
    }

    for (Item* item : moveItemList) {
        g_game.internalMoveItem(item->getParent(), player->getInbox(), INDEX_WHEREEVER, item, item->getItemCount(), nullptr, FLAG_NOLIMIT);
    }
    return true;
}
code from TFS
Code:
bool House::transferToDepot() const
{
if (townId == 0 || owner == 0) {
return false;
}
Player* player = g_game.getPlayerByGUID(owner);
if (player) {
transferToDepot(player);
} else {
Player tmpPlayer(nullptr);
if (!IOLoginData::loadPlayerById(&tmpPlayer, owner)) {
return false;
}
transferToDepot(&tmpPlayer);
IOLoginData::savePlayer(&tmpPlayer);
}
return true;
}
and
Code:
bool House::transferToDepot(Player* player) const
{
if (townId == 0 || owner == 0) {
return false;
}
ItemList moveItemList;
for (HouseTile* tile : houseTiles) {
if (const TileItemVector* items = tile->getItemList()) {
for (Item* item : *items) {
if (item->isPickupable()) {
moveItemList.push_back(item);
} else {
Container* container = item->getContainer();
if (container) {
for (Item* containerItem : container->getItemList()) {
moveItemList.push_back(containerItem);
}
}
}
}
}
}
for (Item* item : moveItemList) {
g_game.internalMoveItem(item->getParent(), player->getInbox(), INDEX_WHEREEVER, item, item->getItemCount(), nullptr, FLAG_NOLIMIT);
}
return true;
}
have problem with houses with no name or not in my database?
 
seems that my code is almost same from TFS ...
I'll find the clean house function
my code function:
Code:
bool House::transferToDepot() const
{
    if (townid == 0 || owner == 0) {
        return false;
    }

    Player* player = g_game.getPlayerByGUID(owner);
    if (player) {
        transferToDepot(player);
    } else {
        Player tmpPlayer(nullptr);
        if (!IOLoginData::loadPlayerById(&tmpPlayer, owner)) {
            return false;
        }

        transferToDepot(&tmpPlayer);
        IOLoginData::savePlayer(&tmpPlayer);
    }
    return true;
}
and
Code:
bool House::transferToDepot(Player* player) const
{
    if (townid == 0 || owner == 0) {
        return false;
    }

    ItemList moveItemList;
    for (HouseTile* tile : houseTiles) {
        if (const TileItemVector* items = tile->getItemList()) {
            for (Item* item : *items) {
                if (item->isPickupable()) {
                    moveItemList.push_back(item);
                } else {
                    Container* container = item->getContainer();
                    if (container) {
                        for (Item* containerItem : container->getItemList()) {
                            moveItemList.push_back(containerItem);
                        }
                    }
                }
            }
        }
    }

    for (Item* item : moveItemList) {
        g_game.internalMoveItem(item->getParent(), player->getInbox(), INDEX_WHEREEVER, item, item->getItemCount(), nullptr, FLAG_NOLIMIT);
    }
    return true;
}
code from TFS
Code:
bool House::transferToDepot() const
{
if (townId == 0 || owner == 0) {
return false;
}
Player* player = g_game.getPlayerByGUID(owner);
if (player) {
transferToDepot(player);
} else {
Player tmpPlayer(nullptr);
if (!IOLoginData::loadPlayerById(&tmpPlayer, owner)) {
return false;
}
transferToDepot(&tmpPlayer);
IOLoginData::savePlayer(&tmpPlayer);
}
return true;
}
and
Code:
bool House::transferToDepot(Player* player) const
{
if (townId == 0 || owner == 0) {
return false;
}
ItemList moveItemList;
for (HouseTile* tile : houseTiles) {
if (const TileItemVector* items = tile->getItemList()) {
for (Item* item : *items) {
if (item->isPickupable()) {
moveItemList.push_back(item);
} else {
Container* container = item->getContainer();
if (container) {
for (Item* containerItem : container->getItemList()) {
moveItemList.push_back(containerItem);
}
}
}
}
}
}
for (Item* item : moveItemList) {
g_game.internalMoveItem(item->getParent(), player->getInbox(), INDEX_WHEREEVER, item, item->getItemCount(), nullptr, FLAG_NOLIMIT);
}
return true;
}
have problem with houses with no name or not in my database?

Do what you always should do when you need to find a small bug in alot of code, use the print functions
In C++ it's std::cout << "House::transferToDepot 1" << std::endl;

That could be used when the function starts, then maybe continue with 2, 3 etc in if statments to make it easier to know what code actually is executed.

The thing is that you shouldn't copy code from 1.3 to 1.0/1.1/1.2 etc since there might be alot of other things that you didn't know got changed, then things like this can happen and you need to spend time to find it :p
 
thank you for reply, later I'll try find, now is time to study :oops:
then I'll use the print, if get sucess with something I return
 
Back
Top