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

Solved how to make 12.4 client connect to my ip/rerouting port 80 to my website

zinx38

New Member
Joined
Dec 29, 2020
Messages
9
Reaction score
2
I've been trying to find out how to get the 12.4 tibia client to connect to my ip. I can connect to it locally. I have added my global ip in my config.lua, I have checked ports 80, 7171, 7172, they are open. I've tried to use OTland IP changer, adding the client then using my ip/port to connect but I don't think that works. So I've tried editing the client to changing the loginservice and clientservice to "myip"/login.php then it says host is not found when I try to login. There is a login.php in my www folder but not sure if it's set up correctly. Is there an alternate way to change ip for 12x clients? Posted my login.php. I also did add the tibia login 12 plugin, the version is 1.8.

EDIT: So I tried to connect to my global ip and it brings me to my router. I tried to add port 80 after it but it still brings me to my router. How can I reroute it back to my website?

EDIT 2: Ok so apparently my router was using port 80 for remote management, just had to change that to a different number other than 80 or 8080.

Lua:
<?php
require_once('common.php');
require_once('config.php');
require_once('config.local.php');
require_once(SYSTEM . 'functions.php');
require_once(SYSTEM . 'init.php');
require_once(SYSTEM . 'status.php');

# error function
function sendError($msg){
    $ret = [];
    $ret["errorCode"] = 3;
    $ret["errorMessage"] = $msg;
    die(json_encode($ret));
}

# event schedule function
function parseEvent($table1, $date, $table2)
{
if ($table1) {
    if ($date) {
        if ($table2) {
            $date = $table1->getAttribute('startdate');
            return date_create("{$date}")->format('U');
        } else {
            $date = $table1->getAttribute('enddate');
            return date_create("{$date}")->format('U');
        }
    } else {
        foreach($table1 as $attr) {
            if ($attr) {
                return $attr->getAttribute($table2);
            }
        }
    }
}
    return;
}

$request = file_get_contents('php://input');
$result = json_decode($request);
$action = isset($result->type) ? $result->type : '';

switch ($action) {
    case 'cacheinfo':
        $playersonline = $db->query("select count(*) from `players_online`")->fetchAll();
        die(json_encode([
            'playersonline' => (intval($playersonline[0][0])),
            'twitchstreams' => 0,
            'twitchviewer' => 0,
            'gamingyoutubestreams' => 0,
            'gamingyoutubeviewer' => 0
        ]));
    break;

    case 'eventschedule':
    $eventlist = [];
    $file_path = config('server_path') . 'data/XML/events.xml';
    if (!file_exists($file_path)) {
        die(json_encode([]));
        break;
    }
    $xml = new DOMDocument;
    $xml->load($file_path);
    $tmplist = [];
    $tableevent = $xml->getElementsByTagName('event');

    foreach ($tableevent as $event) {
        if ($event) { $tmplist = [
        'colorlight' => parseEvent($event->getElementsByTagName('colors'), false, 'colorlight'),
        'colordark' => parseEvent($event->getElementsByTagName('colors'), false, 'colordark'),
        'description' => parseEvent($event->getElementsByTagName('description'), false, 'description'),
        'displaypriority' => intval(parseEvent($event->getElementsByTagName('details'), false, 'displaypriority')),
        'enddate' => intval(parseEvent($event, true, false)),
        'isseasonal' => getBoolean(intval(parseEvent($event->getElementsByTagName('details'), false, 'isseasonal'))),
        'name' => $event->getAttribute('name'),
        'startdate' => intval(parseEvent($event, true, true)),
        'specialevent' => intval(parseEvent($event->getElementsByTagName('details'), false, 'specialevent'))
            ];
        $eventlist[] = $tmplist; } }
    die(json_encode(['eventlist' => $eventlist, 'lastupdatetimestamp' => time()]));
    break;

    case 'boostedcreature':
        $boostDB = $db->query("select * from " . $db->tableName('boosted_creature'))->fetchAll();
        foreach ($boostDB as $Tableboost) {
        die(json_encode([
            'boostedcreature' => true,
            'raceid' => intval($Tableboost['raceid'])
        ]));
        }
    break;

    case 'login':

        $port = $config['lua']['gameProtocolPort'];

        // default world info
        $world = [
            'id' => 0,
            'name' => $config['lua']['serverName'],
            'externaladdress' => $config['lua']['ip'],
            'externalport' => $port,
            'externaladdressprotected' => $config['lua']['ip'],
            'externalportprotected' => $port,
            'externaladdressunprotected' => $config['lua']['ip'],
            'externalportunprotected' => $port,
            'previewstate' => 0,
            'location' => 'BRA', // BRA, EUR, USA
            'anticheatprotection' => false,
            'pvptype' => array_search($config['lua']['worldType'], ['pvp', 'no-pvp', 'pvp-enforced']),
            'istournamentworld' => false,
            'restrictedstore' => false,
            'currenttournamentphase' => 2
        ];

        $characters = [];
        $account = null;
  
        // common columns
        $columns = 'name, level, sex, vocation, looktype, lookhead, lookbody, looklegs, lookfeet, lookaddons, deletion, lastlogin';
  
        $account = new OTS_Account();
        $account->findByEmail($result->email);
        $config_salt_enabled = fieldExist('salt', 'accounts');
        $current_password = encrypt(($config_salt_enabled ? $account->getCustomField('salt') : '') . $result->password);

        if (!$account->isLoaded() || $account->getPassword() != $current_password) {
            sendError('Email or password is not correct.');
        }

        $players = $db->query("select {$columns} from players where account_id = " . $account->getId())->fetchAll();
        foreach ($players as $player) {
            $characters[] = create_char($player);
        }
  
        $save = false;
        $timeNow = time();
        $query = $db->query("select `premdays`, `lastday` from `accounts` where `id` = " . $account->getId());
            if($query->rowCount() > 0) {
                $query = $query->fetch();
                $premDays = (int)$query['premdays'];
                $lastDay = (int)$query['lastday'];
                $lastLogin = $lastDay;
            }
            else {
                sendError("Error while fetching your account data. Please contact admin.");
        }
        if($premDays != 0 && $premDays != PHP_INT_MAX ) {
            if($lastDay == 0) {
                $lastDay = $timeNow;
                $save = true;
            } else {
                $days = (int)(($timeNow - $lastDay) / 86400);
                if($days > 0) {
                    if($days >= $premDays) {
                        $premDays = 0;
                        $lastDay = 0;
                    } else {
                        $premDays -= $days;
                        $reminder = (int)(($timeNow - $lastDay) % 86400);
                        $lastDay = $timeNow - reminder;
                    }

                    $save = true;
                }
            }
        } else if ($lastDay != 0) {
            $lastDay = 0;
            $save = true;
        }
        if($save) {
            $db->query("update `accounts` set `premdays` = " . $premDays . ", `lastday` = " . $lastDay . " where `id` = " . $account->getId());
        }
        $premiumAccount = $premDays > 0;
        $timePremium = time() + ($premDays * 86400);

        $worlds = [$world];
        $playdata = compact('worlds', 'characters');
        $session = [
            'sessionkey' => "$result->email\n$result->password",
            'lastlogintime' => (!$account) ? 0 : $account->getLastLogin(),
            'ispremium' => ($config['lua']['freePremium']) ? true : $account->isPremium(),
            'premiumuntil' => ($account->getPremDays()) > 0 ? (time() + ($account->getPremDays() * 86400)) : 0,
            'status' => 'active', // active, frozen or suspended
            'returnernotification' => false,
            'showrewardnews' => true,
            'isreturner' => true,
            'fpstracking' => false,
            'optiontracking' => false,
            'tournamentticketpurchasestate' => 0,
            'emailcoderequest' => false
        ];
        die(json_encode(compact('session', 'playdata')));
    break;

    default:
        sendError("Unrecognized event {$action}.");
    break;
}

function create_char($player) {
    global $config;
    return [
        'worldid' => 0,
        'name' => $player['name'],
        'ismale' => intval($player['sex']) === 1,
        'tutorial' => false, //intval($player['lastlogin']) === 0,
        'level' => intval($player['level']),
        'vocation' => $config['vocations'][$player['vocation']],
        'outfitid' => intval($player['looktype']),
        'headcolor' => intval($player['lookhead']),
        'torsocolor' => intval($player['lookbody']),
        'legscolor' => intval($player['looklegs']),
        'detailcolor' => intval($player['lookfeet']),
        'addonsflags' => intval($player['lookaddons']),
        'ishidden' => intval($player['deletion']) === 1, 
        'istournamentparticipant' => false,
        'ismaincharacter' => true,
        'dailyrewardstate' => 1,
        'remainingdailytournamentplaytime' => 0
    ];

}
 
Last edited:

slaw

Developer
Joined
Aug 27, 2007
Messages
3,282
Solutions
101
Reaction score
766
Location
Germany
GitHub
slawkens
First, what kind of router do you use?

Seems that you don't have your port redirected to your PC.

You need to redirect your port to your local PC IP. Your local network IP should be something like 192.168.178.x.

#Edit
On my router I can find the setting under: Permit Access -> Port sharing.
 
OP
OP
Z

zinx38

New Member
Joined
Dec 29, 2020
Messages
9
Reaction score
2
Yeah I figured out the port issue apparently it was using it for remote management, I just had to change it to a different number but now I get this error message. I suspect its an issue with editing the client but I just used one that it did automatically so I'm not sure if it did it correctly. It added a ton of NULLs after both my login.php lines. If I try to edit myself the exe breaks.

error.png
 

slaw

Developer
Joined
Aug 27, 2007
Messages
3,282
Solutions
101
Reaction score
766
Location
Germany
GitHub
slawkens
This tool seems bugged, it cutted my IP, because it was too long (?).

Try this one:


It works with 12.60, just tested it now.

It's console program, so you need to execute it from command line.

Usage:
./client-editor.exe "<tibia.exe location>" "<new custom login webservice>"
 
OP
OP
Z

zinx38

New Member
Joined
Dec 29, 2020
Messages
9
Reaction score
2
Yeah that works thank you! So what I did was downloaded the source code and x64.exe from Release Supports 12.4+ · opentibiabr/client-editor (https://github.com/opentibiabr/client-editor/releases/tag/v1.3). Moved them to my C:\Users\"computer-name". Renamed the .exe to client-editor.exe. Opened my command prompt on windows and entered:
client-editor.exe "<tibia.exe location>" "<new custom login webservice>"

and then said it was exporting and made a back up in the folder my tibia exe location. Opened the tibia.exe to login and done.
 
Top