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

TFC - The Forgotten Client - partially downgraded to 7.4

For sure, brother.
I was one of the most active contributors to the development of OTClient Redemption (Mehah), and I had never even heard of TFC

Nowadays, I wouldn't use OTC even if you paid me 😂

But all my fixes, edits and new features, pure C++ (no lua, no modules, no nothing)

View attachment 101392

Hey,
Is it open source? i guess not right?
 
Hey,
Is it open source? i guess not right?
What are you talking about? That client has been open source for 6 years.
1783451115344.webp
It was practically abandoned until the AI-dependent vibe coding crowd came along and brought it back to life. Honestly, I wouldn't be surprised if neither Nottinghster nor Mateus Roberto could even write a simple print in C++ without asking an AI for help.
 
What are you talking about? That client has been open source for 6 years.
View attachment 101481
It was practically abandoned until the AI-dependent vibe coding crowd came along and brought it back to life. Honestly, I wouldn't be surprised if neither Nottinghster nor Mateus Roberto could even write a simple print in C++ without asking an AI for help.

Read my message again, and you’ll understand what I said.
I’m asking if his client is open source.
I already know that the base client is open source.

And please stop spreading hate for no reason.
I use AI 99% of the time too, so what’s wrong with it?
 
Read my message again, and you’ll understand what I said.
I’m asking if his client is open source.
I already know that the base client is open source.

And please stop spreading hate for no reason. I use AI 99% of the time too, so what’s wrong with it?
People these days condemn the use of AI as if it were the worst thing in the world, spreading hateful comments for no reason.
When in reality, AI is just here to help speed up something we already know how to do

Just a reminder: I've been part of the OpenTibia scene since around 2008–2009, crazy to think it's been that long, haha

But that's the internet for you—it gives everyone a voice, specially here in OTLand 😅!
 
What are you talking about? That client has been open source for 6 years.
View attachment 101481
It was practically abandoned until the AI-dependent vibe coding crowd came along and brought it back to life. Honestly, I wouldn't be surprised if neither Nottinghster nor Mateus Roberto could even write a simple print in C++ without asking an AI for help.

Wtf xD
You know Nottin worked on OTCR before AI started his raise?

A bit of respect for people that work FREE for us (like Nottinghster)
 
Last edited:
What are you talking about? That client has been open source for 6 years.
View attachment 101481
It was practically abandoned until the AI-dependent vibe coding crowd came along and brought it back to life. Honestly, I wouldn't be surprised if neither Nottinghster nor Mateus Roberto could even write a simple print in C++ without asking an AI for help.
It is funny that this is the only replay this account made and it is too stupid.
 
Thanks!
I had already begun some experimenting and went a different route though.
I guess time will tell if it's a good one.

Some other fixes so far:
  • Monsters like warlocks actually going invisible
  • 7.4 Inability to walk on stacked parcels, chairs etc
  • Pushing monsters/players/NPCs didn't work, fixed
I test with a regular player since it's difficult to properly test things like climbing holes or dragging items onto rope spots with a GM. I'm also investigating why the drag action fails so frequently.
Another thing: when an NPC is walking, the lookTypeEx of stackable items changes according to their stack count, like the Skull used by the NPC in Venore.
solution:
C++:
void Creature::renderOnBattle(Sint32 posX, Sint32 posY, bool renderManaBar)
{
    auto& renderer = g_engine.getRender();
    if (m_thingType)
    {
        Uint8 animation;
        uint8_t dir = DIRECTION_SOUTH;
        ....
            else if (m_thingType->m_category == ThingCategory_Item) {
                dir = 0;
                animation = UTIL_safeMod<Uint8>(SDL_static_cast(Uint8, (g_frameTime / ITEM_TICKS_PER_FRAME)), m_thingType->m_frameGroup[ThingFrameGroup_Idle].m_animCount);
            }
        ...   
        g_engine.drawOutfit(m_thingType, posX, posY, 20, dir, 0, 0, animation, m_outfit);
    }
....
C++:
void Creature::render(Sint32 posX, Sint32 posY)
{
    if (!m_thingType || m_thingType->m_category == ThingCategory_Effect)
        return;

    auto& renderer = g_engine.getRender();
    update();

    posX += getOffsetX();
    posY += getOffsetY();

    Uint8 zPattern = 0;
    // fix walk creatura lookTypeEx is stackable.
    Uint8 xPattern = m_direction;
    if (m_thingType->hasFlag(ThingAttribute_Stackable)) xPattern = 0;

    if (m_thingType->m_category != ThingCategory_Creature)
  ....
    if (m_thingType->m_frameGroup[m_currentFrame].m_layers > 1)
    {
        for (Uint8 y = 0; y < m_thingType->m_frameGroup[m_currentFrame].m_height; ++y)
        {
            Sint32 posXc = posX;
            for (Uint8 x = 0; x < m_thingType->m_frameGroup[m_currentFrame].m_width; ++x)
            {
                Uint32 sprite = m_thingType->getSprite(SDL_static_cast(ThingFrameGroup, m_currentFrame), x, y, 0, xPattern, 0, zPattern, m_outfitAnim);
                Uint32 spriteMask = m_thingType->getSprite(SDL_static_cast(ThingFrameGroup, m_currentFrame), x, y, 1, xPattern, 0, zPattern, m_outfitAnim);
        ....
        for (Uint8 y = 0; y < m_thingType->m_frameGroup[m_currentFrame].m_height; ++y)
        {
            Sint32 posXc = posX;
            for (Uint8 x = 0; x < m_thingType->m_frameGroup[m_currentFrame].m_width; ++x)
            {
                Uint32 sprite = m_thingType->getSprite(SDL_static_cast(ThingFrameGroup, m_currentFrame), x, y, 0, xPattern, 0, zPattern, m_outfitAnim);
                if (sprite != 0)
                    renderer->drawSprite(sprite, posXc, posY);
                if (m_thingType->m_frameGroup[m_currentFrame].m_patternY > 1)
                {
                    if (m_lookAddons & 1)//First addon
 ....
}
 
Back
Top