TFS 0.X Shows how many tiles have in the house

maikons

Member
Joined
Aug 1, 2015
Messages
180
Reaction score
12
How to make house shows how many tiles have onlook the door like this img?



my house.cpp: Fir3element/3777 (https://github.com/Fir3element/3777/blob/master/src/house.cpp)

I think it's here:
Code:
void House::updateDoorDescription(std::string _name/* = ""*/)
{
    std::string tmp = "house";
    if(isGuild())
        tmp = "hall";

    char houseDescription[200];
    if(owner)
    {
        if(isGuild())
            IOGuild::getInstance()->getGuildById(_name, owner);
        else if(_name.empty())
            IOLoginData::getInstance()->getNameByGuid(owner, _name);

        sprintf(houseDescription, "It belongs to %s '%s'. %s owns this %s.", tmp.c_str(), name.c_str(), _name.c_str(), tmp.c_str());
    }
    else
        sprintf(houseDescription, "It belongs to %s '%s'. Nobody owns this %s. It costs %d gold coins.", tmp.c_str(), name.c_str(), tmp.c_str(), price);

    for(HouseDoorList::iterator it = doorList.begin(); it != doorList.end(); ++it)
        (*it)->setSpecialDescription(houseDescription);
}
But i have no idea how to make it done, is anyone can help?
 

Mustafa1337

Î Àm ŁĕğẹňĎ
Joined
Mar 4, 2017
Messages
366
Reaction score
88
C++:
void House::updateDoorDescription(std::string _name/* = ""*/)
{
    std::string tmp = "house";
    /*
    no isGuild method (atm)
    if(isGuild())
        tmp = "hall";
    */
    char houseDescription[200];
    const int32_t housePrice = g_config.getNumber(ConfigManager::HOUSE_PRICE);
    if(owner)
    {
        /*
        if(isGuild())
            IOGuild::getInstance()->getGuildById(_name, owner);
        */
        if(_name.empty())
            IOLoginData::getInstance()->getNameByGuid(owner, _name);
 
        sprintf(houseDescription, "It belongs to %s '%s'. %s owns this %s.", tmp.c_str(), houseName.c_str(), _name.c_str(), tmp.c_str());
    }
    else
        sprintf(houseDescription, "It belongs to %s '%s'. Nobody owns this %s. It costs %lu gold coins.", tmp.c_str(), houseName.c_str(), tmp.c_str(), ( housePrice != -1 ? (houseTiles.size() * housePrice) : 0 ) );
 
    for (const auto& it : doorSet) {
        it->setSpecialDescription(houseDescription);
    }
Try replace with this, I am not sure if it gonna work I have found on a brazil forum.
 
OP
M

maikons

Member
Joined
Aug 1, 2015
Messages
180
Reaction score
12
C++:
void House::updateDoorDescription(std::string _name/* = ""*/)
{
    std::string tmp = "house";
    /*
    no isGuild method (atm)
    if(isGuild())
        tmp = "hall";
    */
    char houseDescription[200];
    const int32_t housePrice = g_config.getNumber(ConfigManager::HOUSE_PRICE);
    if(owner)
    {
        /*
        if(isGuild())
            IOGuild::getInstance()->getGuildById(_name, owner);
        */
        if(_name.empty())
            IOLoginData::getInstance()->getNameByGuid(owner, _name);

        sprintf(houseDescription, "It belongs to %s '%s'. %s owns this %s.", tmp.c_str(), houseName.c_str(), _name.c_str(), tmp.c_str());
    }
    else
        sprintf(houseDescription, "It belongs to %s '%s'. Nobody owns this %s. It costs %lu gold coins.", tmp.c_str(), houseName.c_str(), tmp.c_str(), ( housePrice != -1 ? (houseTiles.size() * housePrice) : 0 ) );

    for (const auto& it : doorSet) {
        it->setSpecialDescription(houseDescription);
    }
Try replace with this, I am not sure if it gonna work I have found on a brazil forum.

TY BRO

but its showing some errors when compile:
Code:
house.cpp: In member function ‘void House::updateDoorDescription(std::__cxx11::string)’:
house.cpp:169:91: error: ‘houseName’ was not declared in this scope
         sprintf(houseDescription, "It belongs to %s '%s'. %s owns this %s.", tmp.c_str(), houseName.c_str(), _name.c_str(), tmp.c_str());
                                                                                           ^~~~~~~~~
house.cpp:172:120: error: ‘houseName’ was not declared in this scope
         sprintf(houseDescription, "It belongs to %s '%s'. Nobody owns this %s. It costs %lu gold coins.", tmp.c_str(), houseName.c_str(), tmp.c_str(), ( housePrice != -1 ? (houseTiles.size() * housePrice) : 0 ) );
                                                                                                                        ^~~~~~~~~
house.cpp:174:16: warning: ‘auto’ changes meaning in C++11; please remove it [-Wc++11-compat]
     for (const auto& it : doorSet) {
                ^~~~
house.cpp:174:22: error: ISO C++ forbids declaration of ‘it’ with no type [-fpermissive]
     for (const auto& it : doorSet) {
                      ^~
house.cpp:174:27: warning: range-based ‘for’ loops only available with -std=c++11 or -std=gnu++11
     for (const auto& it : doorSet) {
                           ^~~~~~~
house.cpp:174:27: error: ‘doorSet’ was not declared in this scope
house.cpp:175:11: error: base operand of ‘->’ is not a pointer
         it->setSpecialDescription(houseDescription);
           ^~
Makefile:33: recipe for target 'house.o' failed
make: *** [house.o] Error 1
make: *** Waiting for unfinished jobs....
line 169:
Code:
sprintf(houseDescription, "It belongs to %s '%s'. %s owns this %s.", tmp.c_str(), houseName.c_str(), _name.c_str(), tmp.c_str());
 

Danger II

FluppiX.com
Joined
Nov 21, 2012
Messages
1,597
Reaction score
393
Location
Germany
It has house->getTilesCount() tiles.

I think house->getTilesCount() should be a global variable if not, set it as one and you will have the tiles count.
Alternatively you can take the price and divide it through config house price, should work aswell.

int32_t house_tiles = price / g_config.getBool(ConfigManager::HOUSE_RENTASPRICE);

C++:
void House::updateDoorDescription(std::string _name/* = ""*/)
{
    int32_t house_tiles = (price / g_config.getBool(ConfigManager::HOUSE_RENTASPRICE));
    std::string tmp = "house";
    if(isGuild())
        tmp = "hall";

    char houseDescription[200];
    if(owner)
    {
        if(isGuild())
            IOGuild::getInstance()->getGuildById(_name, owner);
        else if(_name.empty())
            IOLoginData::getInstance()->getNameByGuid(owner, _name);

        sprintf(houseDescription, "It belongs to %s '%s'. %s owns this %s. It has %s tiles.", tmp.c_str(), name.c_str(), _name.c_str(), tmp.c_str(), house_tiles);
    }
    else
        sprintf(houseDescription, "It belongs to %s '%s'. Nobody owns this %s. It costs %d gold coins. It has %s tiles.", tmp.c_str(), name.c_str(), tmp.c_str(), price, house_tiles);

    for(HouseDoorList::iterator it = doorList.begin(); it != doorList.end(); ++it)
        (*it)->setSpecialDescription(houseDescription);
}
 
OP
M

maikons

Member
Joined
Aug 1, 2015
Messages
180
Reaction score
12
It has house->getTilesCount() tiles.

I think house->getTilesCount() should be a global variable if not, set it as one and you will have the tiles count.
Alternatively you can take the price and divide it through config house price, should work aswell.

int32_t house_tiles = price / g_config.getBool(ConfigManager::HOUSE_RENTASPRICE);

C++:
void House::updateDoorDescription(std::string _name/* = ""*/)
{
    int32_t house_tiles = (price / g_config.getBool(ConfigManager::HOUSE_RENTASPRICE));
    std::string tmp = "house";
    if(isGuild())
        tmp = "hall";

    char houseDescription[200];
    if(owner)
    {
        if(isGuild())
            IOGuild::getInstance()->getGuildById(_name, owner);
        else if(_name.empty())
            IOLoginData::getInstance()->getNameByGuid(owner, _name);

        sprintf(houseDescription, "It belongs to %s '%s'. %s owns this %s. It has %s tiles.", tmp.c_str(), name.c_str(), _name.c_str(), tmp.c_str(), house_tiles);
    }
    else
        sprintf(houseDescription, "It belongs to %s '%s'. Nobody owns this %s. It costs %d gold coins. It has %s tiles.", tmp.c_str(), name.c_str(), tmp.c_str(), price, house_tiles);

    for(HouseDoorList::iterator it = doorList.begin(); it != doorList.end(); ++it)
        (*it)->setSpecialDescription(houseDescription);
}
My server isn't open, when start to load map, shows:
Code:
[16:0:47.049] >> Loading map and spawns...
[16:0:47.649] > Map size: 2548x2548.
[16:0:47.649] > Map descriptions: 
[16:0:47.649] "Saved with Remere's Map Editor 3.4"
[16:0:47.649] "No map description available."
Floating point exception
When compile shows this warnings:
Code:
house.cpp: In member function ‘void House::updateDoorDescription(std::__cxx11::string)’:
house.cpp:165:161: warning: format ‘%s’ expects argument of type ‘char*’, but argument 7 has type ‘int32_t {aka int}’ [-Wformat=]
         sprintf(houseDescription, "It belongs to %s '%s'. %s owns this %s. It has %s tiles.", tmp.c_str(), name.c_str(), _name.c_str(), tmp.c_str(), house_tiles);
                                                                                                                                                                 ^
house.cpp:168:181: warning: format ‘%s’ expects argument of type ‘char*’, but argument 7 has type ‘int32_t {aka int}’ [-Wformat=]
         sprintf(houseDescription, "It belongs to %s '%s'. Nobody owns this %s. It costs %d gold coins. It has %s tiles.", tmp.c_str(), name.c_str(), tmp.c_str(), price, house_tiles);
                                                                                                                                                                                     ^
CC -o tfs
The only changes i have in my source pack is this
And this: TFS 0.X - Who cast the field/wall (https://otland.net/threads/who-cast-the-field-wall.263051/page-2)

It's not a map error, i tried the last compiled version and it opens well
 

Danger II

FluppiX.com
Joined
Nov 21, 2012
Messages
1,597
Reaction score
393
Location
Germany
Replace:
int32_t house_tiles = (price / g_config.getBool(ConfigManager::HOUSE_RENTASPRICE));
with:
int32_t house_tiles = (price / g_config.getNumber(ConfigManager::HOUSE_PRICE));

Corrected code:
C++:
void House::updateDoorDescription(std::string _name/* = ""*/)
{
    int32_t house_tiles = (price / g_config.getNumber(ConfigManager::HOUSE_PRICE));
    std::string tmp = "house";
    if(isGuild())
        tmp = "hall";

    char houseDescription[200];
    if(owner)
    {
        if(isGuild())
            IOGuild::getInstance()->getGuildById(_name, owner);
        else if(_name.empty())
            IOLoginData::getInstance()->getNameByGuid(owner, _name);

        sprintf(houseDescription, "It belongs to %s '%s'. %s owns this %s. It has %s tiles.", tmp.c_str(), name.c_str(), _name.c_str(), tmp.c_str(), house_tiles);
    }
    else
        sprintf(houseDescription, "It belongs to %s '%s'. Nobody owns this %s. It costs %d gold coins. It has %s tiles.", tmp.c_str(), name.c_str(), tmp.c_str(), price, house_tiles);

    for(HouseDoorList::iterator it = doorList.begin(); it != doorList.end(); ++it)
        (*it)->setSpecialDescription(houseDescription);
}
I was on mobile when I wrote that reply above. Not sure if its going to work tho it's expecting char, you can probably convert int32_t to char aswell.
 
OP
M

maikons

Member
Joined
Aug 1, 2015
Messages
180
Reaction score
12
Replace:
int32_t house_tiles = (price / g_config.getBool(ConfigManager::HOUSE_RENTASPRICE));
with:
int32_t house_tiles = (price / g_config.getNumber(ConfigManager::HOUSE_PRICE));

Corrected code:
C++:
void House::updateDoorDescription(std::string _name/* = ""*/)
{
    int32_t house_tiles = (price / g_config.getNumber(ConfigManager::HOUSE_PRICE));
    std::string tmp = "house";
    if(isGuild())
        tmp = "hall";

    char houseDescription[200];
    if(owner)
    {
        if(isGuild())
            IOGuild::getInstance()->getGuildById(_name, owner);
        else if(_name.empty())
            IOLoginData::getInstance()->getNameByGuid(owner, _name);

        sprintf(houseDescription, "It belongs to %s '%s'. %s owns this %s. It has %s tiles.", tmp.c_str(), name.c_str(), _name.c_str(), tmp.c_str(), house_tiles);
    }
    else
        sprintf(houseDescription, "It belongs to %s '%s'. Nobody owns this %s. It costs %d gold coins. It has %s tiles.", tmp.c_str(), name.c_str(), tmp.c_str(), price, house_tiles);

    for(HouseDoorList::iterator it = doorList.begin(); it != doorList.end(); ++it)
        (*it)->setSpecialDescription(houseDescription);
}
I was on mobile when I wrote that reply above. Not sure if its going to work tho it's expecting char, you can probably convert int32_t to char aswell.
Same thing :(
Code:
tfs build options:
g++ house.cpp
CXXFLAGS = -std=c++03 -Os -fomit-frame-pointer -Wall -Wextra -Wno-strict-aliasing -Wno-unused-parameter -Wno-array-bounds -pipe -I/usr/include/libxml2 -I/usr/include/lua5.1 -I.   -DHAVE_CONFIG_H -D__USE_MYSQL__ -D__ENABLE_SERVER_DIAGNOSTIC__ -D__ROOT_PERMISSION__ -D_THREAD_SAFE -D_REENTRANT
LDFLAGS  = -s -llua5.1 -lmariadbclient -lcrypto -lboost_filesystem -lboost_date_time -lboost_system -lboost_regex -lboost_thread -lz -lgmp -lxml2 -pthread
CC       = g++
house.cpp: In member function ‘void House::updateDoorDescription(std::__cxx11::string)’:
house.cpp:165:161: warning: format ‘%s’ expects argument of type ‘char*’, but argument 7 has type ‘int32_t {aka int}’ [-Wformat=]
         sprintf(houseDescription, "It belongs to %s '%s'. %s owns this %s. It has %s tiles.", tmp.c_str(), name.c_str(), _name.c_str(), tmp.c_str(), house_tiles);
                                                                                                                                                                 ^
house.cpp:168:181: warning: format ‘%s’ expects argument of type ‘char*’, but argument 7 has type ‘int32_t {aka int}’ [-Wformat=]
         sprintf(houseDescription, "It belongs to %s '%s'. Nobody owns this %s. It costs %d gold coins. It has %s tiles.", tmp.c_str(), name.c_str(), tmp.c_str(), price, house_tiles);
                                                                                                                                                                                     ^
CC -o tfs
Line 165 is: sprintf(houseDescription, "It belongs to %s '%s'. %s owns this %s. It has %s tiles.", tmp.c_str(), name.c_str(), _name.c_str(), tmp.c_str(), house_tiles);
 
OP
M

maikons

Member
Joined
Aug 1, 2015
Messages
180
Reaction score
12
Change %s tiles to %d tiles
No errors or warnings, but when i look on door it not shows the tiles
Code:
13:28 You see a closed door. It belongs to house 'Unnamed House #1'. Nobody owns this house. It costs 3900000 gold coins.
 

Stigma

Veteran OT User
Joined
Feb 14, 2015
Messages
4,581
Reaction score
2,141
Nobody's answering you because there's nothing else to do. You either didn't recompile or you didn't edit the code correctly, that code given is the ONLY spot in TFS where the door description is defined, if you change it correctly it will change ingame as well.
C++:
void House::updateDoorDescription(std::string _name/* = ""*/)
{
    int32_t house_tiles = (price / g_config.getNumber(ConfigManager::HOUSE_PRICE));
    std::string tmp = "house";
    if(isGuild())
        tmp = "hall";

    char houseDescription[200];
    if(owner)
    {
        if(isGuild())
            IOGuild::getInstance()->getGuildById(_name, owner);
        else if(_name.empty())
            IOLoginData::getInstance()->getNameByGuid(owner, _name);

        sprintf(houseDescription, "It belongs to %s '%s'. %s owns this %s. It has %d tiles.", tmp.c_str(), name.c_str(), _name.c_str(), tmp.c_str(), house_tiles);
    }
    else
        sprintf(houseDescription, "It belongs to %s '%s'. Nobody owns this %s. It costs %d gold coins. It has %d tiles.", tmp.c_str(), name.c_str(), tmp.c_str(), price, house_tiles);

    for(HouseDoorList::iterator it = doorList.begin(); it != doorList.end(); ++it)
        (*it)->setSpecialDescription(houseDescription);
}
 
OP
M

maikons

Member
Joined
Aug 1, 2015
Messages
180
Reaction score
12
Nobody's answering you because there's nothing else to do. You either didn't recompile or you didn't edit the code correctly, that code given is the ONLY spot in TFS where the door description is defined, if you change it correctly it will change ingame as well.
C++:
void House::updateDoorDescription(std::string _name/* = ""*/)
{
    int32_t house_tiles = (price / g_config.getNumber(ConfigManager::HOUSE_PRICE));
    std::string tmp = "house";
    if(isGuild())
        tmp = "hall";

    char houseDescription[200];
    if(owner)
    {
        if(isGuild())
            IOGuild::getInstance()->getGuildById(_name, owner);
        else if(_name.empty())
            IOLoginData::getInstance()->getNameByGuid(owner, _name);

        sprintf(houseDescription, "It belongs to %s '%s'. %s owns this %s. It has %d tiles.", tmp.c_str(), name.c_str(), _name.c_str(), tmp.c_str(), house_tiles);
    }
    else
        sprintf(houseDescription, "It belongs to %s '%s'. Nobody owns this %s. It costs %d gold coins. It has %d tiles.", tmp.c_str(), name.c_str(), tmp.c_str(), price, house_tiles);

    for(HouseDoorList::iterator it = doorList.begin(); it != doorList.end(); ++it)
        (*it)->setSpecialDescription(houseDescription);
}
Now i even tried to make clean and recompile again, same thing
Code:
13:25 You see a closed door. It belongs to house 'Unnamed House #1'. Nobody owns this house. It costs 3900000 gold coins.
I'm using the updateDoorDescription like u said in my house.cpp
Code:
void House::updateDoorDescription(std::string _name/* = ""*/)
{
    int32_t house_tiles = (price / g_config.getNumber(ConfigManager::HOUSE_PRICE));
    std::string tmp = "house";
    if(isGuild())
        tmp = "hall";

    char houseDescription[200];
    if(owner)
    {
        if(isGuild())
            IOGuild::getInstance()->getGuildById(_name, owner);
        else if(_name.empty())
            IOLoginData::getInstance()->getNameByGuid(owner, _name);

        sprintf(houseDescription, "It belongs to %s '%s'. %s owns this %s. It has %d tiles.", tmp.c_str(), name.c_str(), _name.c_str(), tmp.c_str(), house_tiles);
    }
    else
        sprintf(houseDescription, "It belongs to %s '%s'. Nobody owns this %s. It costs %d gold coins. It has %d tiles.", tmp.c_str(), name.c_str(), tmp.c_str(), price, house_tiles);

    for(HouseDoorList::iterator it = doorList.begin(); it != doorList.end(); ++it)
        (*it)->setSpecialDescription(houseDescription);
}
Using this source pack, clean
 
OP
M

maikons

Member
Joined
Aug 1, 2015
Messages
180
Reaction score
12
Now i even tried to make clean and recompile again, same thing
Code:
13:25 You see a closed door. It belongs to house 'Unnamed House #1'. Nobody owns this house. It costs 3900000 gold coins.
I'm using the updateDoorDescription like u said in my house.cpp
Code:
void House::updateDoorDescription(std::string _name/* = ""*/)
{
    int32_t house_tiles = (price / g_config.getNumber(ConfigManager::HOUSE_PRICE));
    std::string tmp = "house";
    if(isGuild())
        tmp = "hall";

    char houseDescription[200];
    if(owner)
    {
        if(isGuild())
            IOGuild::getInstance()->getGuildById(_name, owner);
        else if(_name.empty())
            IOLoginData::getInstance()->getNameByGuid(owner, _name);

        sprintf(houseDescription, "It belongs to %s '%s'. %s owns this %s. It has %d tiles.", tmp.c_str(), name.c_str(), _name.c_str(), tmp.c_str(), house_tiles);
    }
    else
        sprintf(houseDescription, "It belongs to %s '%s'. Nobody owns this %s. It costs %d gold coins. It has %d tiles.", tmp.c_str(), name.c_str(), tmp.c_str(), price, house_tiles);

    for(HouseDoorList::iterator it = doorList.begin(); it != doorList.end(); ++it)
        (*it)->setSpecialDescription(houseDescription);
}
Using this source pack, clean
bump
 

supergt

Member
Joined
May 11, 2017
Messages
72
Reaction score
27
Now i even tried to make clean and recompile again, same thing
Code:
13:25 You see a closed door. It belongs to house 'Unnamed House #1'. Nobody owns this house. It costs 3900000 gold coins.
I'm using the updateDoorDescription like u said in my house.cpp
Code:
void House::updateDoorDescription(std::string _name/* = ""*/)
{
    int32_t house_tiles = (price / g_config.getNumber(ConfigManager::HOUSE_PRICE));
    std::string tmp = "house";
    if(isGuild())
        tmp = "hall";

    char houseDescription[200];
    if(owner)
    {
        if(isGuild())
            IOGuild::getInstance()->getGuildById(_name, owner);
        else if(_name.empty())
            IOLoginData::getInstance()->getNameByGuid(owner, _name);

        sprintf(houseDescription, "It belongs to %s '%s'. %s owns this %s. It has %d tiles.", tmp.c_str(), name.c_str(), _name.c_str(), tmp.c_str(), house_tiles);
    }
    else
        sprintf(houseDescription, "It belongs to %s '%s'. Nobody owns this %s. It costs %d gold coins. It has %d tiles.", tmp.c_str(), name.c_str(), tmp.c_str(), price, house_tiles);

    for(HouseDoorList::iterator it = doorList.begin(); it != doorList.end(); ++it)
        (*it)->setSpecialDescription(houseDescription);
}
Using this source pack, clean
Same here
 
Top