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

Tibia OTClient 7.4 with Real Tibia features

there are people lot that has managed to do lots of things with this 0client, sadly they don't even has shared how to use the client.
 
there are people lot that has managed to do lots of things with this 0client, sadly they don't even has shared how to use the client.
I will try to make some sense of it and share any solution if I can.
 

So theoretically it would be just changing the RSA of the Client and the same as that of otserv.cpp? Thank you very much.
In my old client, the game's ip was changed via INIT.LUA. Where can I change this on the client in question?


Another doubt. In otserv.cpp there are two "RSA". On the client, just one line. Do I put both? Or do I use only one of these lines?
 
So theoretically it would be just changing the RSA of the Client and the same as that of otserv.cpp? Thank you very much.
You can find exhausting instructions here, other than the fact that your server stores it in the aforementioned place, not in key.pem, everything else should work for you
btw, next time use search function ^^

In my old client, the game's ip was changed via INIT.LUA. Where can I change this on the client in question?
As Olddies said on the previous page, you can find it in modules/gamelib/const.lua
 
You can find exhausting instructions here, other than the fact that your server stores it in the aforementioned place, not in key.pem, everything else should work for you
btw, next time use search function ^^


As Olddies said on the previous page, you can find it in modules/gamelib/const.lua

There is nothing referring to ip, host, in const.
And still thank you very much for your tips. Decoration.


tried to do this in entergame.lua: local function onCharacterList (protocol, characters, account, otui) - Try adding the server to the server list ServerList.add (MYIP, G.port, g_game.getClientVersion ())

But the Client's Enter Game doesn't open.
 
Last edited:
There is nothing referring to ip, host, in const.
And still thank you very much for your tips. Decoration.


tried to do this in entergame.lua: local function onCharacterList (protocol, characters, account, otui) - Try adding the server to the server list ServerList.add (MYIP, G.port, g_game.getClientVersion ())

But the Client's Enter Game doesn't open.
Target ip its in config/config.otml
 
Last edited:
Target ip its in config/config.otml

Do I need to compile the OTC again if I want to change the access IP? Or just change the lines? (I ask because I want to perform these initial testicles. It is a good study).



Whenever I try to change the line: host: 127.0.0.1 For my ip, it saves. But when I log into the client and try to connect, my ip magically changes to 127.0.0.1
 
Last edited:
okay finally worked out how to make it work with any 7.72 distro xD
especially when you want client to report as 772
Lua:
-- @docclass
ProtocolLogin = extends(Protocol, "ProtocolLogin")

LoginServerError = 10
LoginServerUpdate = 17
LoginServerMotd = 20
LoginServerUpdateNeeded = 30
LoginServerCharacterList = 100
LoginServerExtendedCharacterList = 101

function ProtocolLogin:login(host, port, accountName, accountPassword)
  if string.len(host) == 0 or port == nil or port == 0 then
    signalcall(self.onLoginError, self, tr("You must enter a valid server address and port."))
    return
  end

  self.accountName = accountName
  self.accountPassword = accountPassword
  self.connectCallback = self.sendLoginPacket

  self:connect(host, port)
end

function ProtocolLogin:cancelLogin()
  self:disconnect()
end

function ProtocolLogin:sendLoginPacket()
  local msg = OutputMessage.create()
  msg:addU8(ClientOpcodes.ClientEnterAccount)

  msg:addU16(2)
  msg:addU16(772)

  if g_game.getClientVersion() >= 980 then
    msg:addU32(g_game.getClientVersion())
  end

  msg:addU32(g_things.getDatSignature())
  msg:addU32(g_sprites.getSprSignature())
  msg:addU32(PIC_SIGNATURE)

  if g_game.getClientVersion() >= 980 then
    msg:addU8(0) -- clientType
  end

  local offset = msg:getMessageSize()

  if g_game.getClientVersion() >= 772 then
    -- first RSA byte must be 0
    msg:addU8(0)
    -- xtea key
    self:generateXteaKey()
    local xteaKey = self:getXteaKey()
    msg:addU32(xteaKey[1])
    msg:addU32(xteaKey[2])
    msg:addU32(xteaKey[3])
    msg:addU32(xteaKey[4])
  end

  if g_game.getFeature(GameAccountNames) then
    msg:addString(self.accountName)
  else
    msg:addU32(tonumber(self.accountName))
  end

  msg:addString(self.accountPassword)

  if self.getLoginExtendedData then
    local data = self:getLoginExtendedData()
    msg:addString(data)
  end

  local paddingBytes = g_crypt.rsaGetSize() - (msg:getMessageSize() - offset)
  assert(paddingBytes >= 0)
  msg:addPaddingBytes(paddingBytes, 0)
  if g_game.getClientVersion() >= 772 then
    msg:encryptRsa()
  end

  if g_game.getFeature(GameProtocolChecksum) then
    self:enableChecksum()
  end

  self:send(msg)
  if g_game.getClientVersion() >= 772 then
    self:enableXteaEncryption()
  end
  self:recv()
end

function ProtocolLogin:onConnect()
  self.gotConnection = true
  self:connectCallback()
  self.connectCallback = nil
end

function ProtocolLogin:onRecv(msg)
  while not msg:eof() do
    local opcode = msg:getU8()
    if opcode == LoginServerError then
      self:parseError(msg)
    elseif opcode == LoginServerMotd then
      self:parseMotd(msg)
    elseif opcode == LoginServerUpdateNeeded then
      signalcall(EnterGame.onUpdateNeeded, self)
    elseif opcode == LoginServerCharacterList then
      self:parseCharacterList(msg)
    elseif opcode == LoginServerExtendedCharacterList then
      self:parseExtendedCharacterList(msg)
    elseif opcode == LoginServerUpdate then
      local signature = msg:getString()
      signalcall(self.onUpdateNeeded, self, signature)
    else
      self:parseOpcode(opcode, msg)
    end
  end
  self:disconnect()
end

function ProtocolLogin:parseError(msg)
  local errorMessage = msg:getString()
  signalcall(self.onLoginError, self, errorMessage)
end

function ProtocolLogin:parseMotd(msg)
  local motd = msg:getString()
  signalcall(self.onMotd, self, motd)
end

function ProtocolLogin:parseCharacterList(msg)
  local characters = {}

  if g_game.getClientVersion() > 1010 then
    local worlds = {}

    local worldsCount = msg:getU8()
    for i=1, worldsCount do
      local world = {}
      local worldId = msg:getU8()
      world.worldName = msg:getString()
      world.worldIp = msg:getString()
      world.worldPort = msg:getU16()
      msg:getU8() -- unknow byte?
      worlds[worldId] = world
    end

    local charactersCount = msg:getU8()
    for i=1, charactersCount do
      local character = {}
      local worldId = msg:getU8()
      character.name = msg:getString()
      character.worldName = worlds[worldId].worldName
      character.worldIp = worlds[worldId].worldIp
      character.worldPort = worlds[worldId].worldPort
      characters[i] = character
    end

  else
    local charactersCount = msg:getU8()
    for i=1,charactersCount do
      local character = {}
      character.name = msg:getString()
      character.worldName = msg:getString()
      character.worldIp = iptostring(msg:getU32())
      character.worldPort = msg:getU16()

      if g_game.getClientVersion() >= 980 then
        character.unknown = msg:getU8()
      end

      characters[i] = character
    end
  end

  local account = {}
  account.premDays = msg:getU16()
  signalcall(self.onCharacterList, self, characters, account)
end

function ProtocolLogin:parseExtendedCharacterList(msg)
  local characters = msg:getTable()
  local account = msg:getTable()
  local otui = msg:getString()
  signalcall(self.onCharacterList, self, characters, account, otui)
end

function ProtocolLogin:parseOpcode(opcode, msg)
  signalcall(self.onOpcode, self, opcode, msg)
end

function ProtocolLogin:onError(msg, code)
  local text = translateNetworkError(code, self:isConnecting(), msg)
  signalcall(self.onLoginError, self, text)
end

btw now sprites dont display properly xD e.g outfits above 256 limit they work until 500 ish
another thing is chat doesnt work and there is opcodes that are wrongly put in there aswell so much work for this stuff does not display properly and logs out after 10 seconds of idle damn piece of . client xD
 
Last edited:
I am planing to delete everything that has to do with Tibia from my harddisk therefore I will publish files, I do not need anymore but the community.

I just packed them quickly, maybe they contain any copied files or wont even work at all (I doubt that).
I won't support help at all.
If you don't know how to work with them, do not download it.

This Client should contain files from this thread:
Gaming - OTClient vs Real Tibia Client 7.x

MEGA
Bro, can u help me?

Im on a project... i compilled the most recent OTCLIENT, but is a 7.4/7.72 project... and the last one has a lot of 'new things of tibia', too much thing to take out to make a 7.4 similar interface.

When i tried to use yours... I put the IP and i got ConnectionERROR 2... so I thougth that it maybe be a RSA problem. I changed gamelib/const.lua OTSERV_RSA... i changed to which one I was using at config.lua on my server (there was 5 lines of RSA there, i got the "Modulus" which is "public" rigth? Then the error 2 stopped and now is just "Please Wait... your character list is being loaded..."

What could be? Tks!
 
he just posted this sh.t to call our attention and make us buy his own full working copy, pretty scam
 
he just posted this sh.t to call our attention and make us buy his own full working copy, pretty scam
This post is way older than my current client. Also the client in this thread is not even otcv8 which my current client is.

Your comment is literally bs considering that the client I’ve been using for Tibiara didn’t even exists at this time.

And wtf your talking at all? There is an active download link for the client I am showing off.
 
This post is way older than my current client. Also the client in this thread is not even otcv8 which my current client is.

Your comment is literally bs considering that the client I’ve been using for Tibiara didn’t even exists at this time.

And wtf your talking at all? There is an active download link for the client I am showing off.
you just post something that doesnt work, have to do tons of misteryous configurations to make it barely usable, you know what im talking about, shame on you dude... #peace
 
you just post something that doesnt work, have to do tons of misteryous configurations to make it barely usable, you know what im talking about, shame on you dude... #peace
This thread was created about 5 years ago, what did you expect some download and run stuff so you can quick grab cash with a server? Go and learn how to make it work. I could make it easily work.

Just to make sure you're not blind:
I just packed them quickly, maybe they contain any copied files or wont even work at all (I doubt that).
I won't support help at all.
If you don't know how to work with them, do not download it.
 
This thread was created about 5 years ago, what did you expect some download and run stuff so you can quick grab cash with a server? Go and learn how to make it work. I could make it easily work.

Just to make sure you're not blind:
nah, im not gonna loose time with this pile os sh.t and i recommend everyone to do so
shame on you dude #peace
 
Back
Top