Head

Criar Mapas Travian

Já há um grande número de páginas que recolhem informação do Travian e a mostram de muitas maneiras diferentes. Estas páginas são na sua maioria de mapas e estatísticas.

Este tutorial foi escrito para te dar algumas ideias de como programar este tipo de páginas. Primeiro que tudo, este tutorial é um exemplo de uma solução em PHP/MySQL (provavelmente a mais usada) e já deverás ter uma ideia de como estas línguas funcionam já que o objectivo deste tutorial não é ensinar-te a programar.

Conteúdos do Tutorial

  1. Que tipo de conhecimentos prévios preciso?
  2. Do que precisa o meu servidor/espaço web?
  3. De onde posso obter os dados?
  4. Qual é o formato dos dados?
  5. Que tipo de informação obtenho?
  6. Como transfiro a informação para o meu servidor?
  7. Exemplo: Mapa estático da Aliança

Que tipo de conhecimentos prévios preciso?

Deves ter conhecimentos de linguagens web. Este tutorial também pede alguns conhecimentos de SQL para  desenhar a base de dados.

Do que precisa o meu servidor/espaço web?

Uma combinação popular é a do PHP com o MySQL, no entanto deves-te lembrar que a maior parte dos sistemas de alojamento usam o PHP com o Modo de Segurança activo. Isto impede-nos de usar métodos eficientes para guardar os dados automaticamente.

Porque razão não funciona com o Modo de Segurança activo?
  • Os comandos de sistema através da função system() não estão habilitados
  • O acesso a ficheiros eliminados não está habilitado

Mais acerca deste assunto na secção "Como transfiro a informação para o meu servidor?".

De onde posso obter os dados?

Já que usar bots e scripts no jogo não é permitido tem de haver uma maneira diferente de obter informação. A Travian Games GmbH disponibiliza SQL-Dumps actualizados de cada servidor que oferecem a informação básica acerca de todas as aldeias e jogadores.

Estes dumps são actualizados todas as manhãs por volta das 7 (gmt+1) e estão disponíveis em duas versões diferentes: descomprimido (ficheiros .sql) e compressão gzip (ficheiros .sql.gz).

O nome destes ficheiros pode variar de acordo com a língua do país. Nos servidores em Alemão o ficheiro chama-se "karte.sql[.gz]", no resto dos países o ficheiro chama-se  "map.sql[.gz]" .

O ficheiro pode ser encontrado no directório raiz de cada servidor.

Exemplos:

Qual é o formato dos dados?

Como já foi mencionado os ficheiros são SQL-Dumps, como tal não apenas contêm comandos de inserção de dados SQL. Lembra-te que nenhuma inserção avançada é usada, em vez disso é usada uma inserção por gravação.

Os antigos servidores Travian 2 usavam codificação ANSI nos ficheiros,  hoje usam codificação em UTF-8.

Se quiseres criar uma tabela para a base de dados deves usar o seguinte comando SQL:

CREATE TABLE `x_world` (
  `id` int(9) unsigned NOT NULL default '0',
  `x` smallint(3) NOT NULL default '0',
  `y` smallint(3) NOT NULL default '0',
  `idt` tinyint(1) unsigned NOT NULL default '0',
  `ida` int(9) unsigned NOT NULL default '0',
  `aldeia` varchar(20) NOT NULL default '',
  `idj` int(9) NOT NULL default '0',
  `jogador` varchar(20) NOT NULL default '',
  `idal` int(9) unsigned NOT NULL default '0',
  `alianca` varchar(8) NOT NULL default '',
  `populacao` smallint(5) unsigned NOT NULL default '0',
  UNIQUE KEY `id` (`id`)
);

Que tipo de informação obtenho?

Os dados no ficheiro estão organizados da seguinte maneira:

Coluna Explicação
id Número do campo, a contagem começa no topo esquerdo (-400|400) e termina no canto direito da fila de baixo (400|-400)
x Coordenada X
y Coordenada Y
idt Número da Tribo. 1 = Romanos, 2 = Teutões, 3 = Gauleses, 4 = Natureza e 5 = Natars
ida Número da Aldeia
aldeia Nome da Aldeia
idj Número do Jogador
jogador Nome do Jogador
idal Número da Aliança
aliança Nome da Aliança
populacao Número de Habitantes da Aldeia

Importante: Os valores ofensivos e defensivos não estão disponíveis.

Como transfiro a informação para o meu servidor?

Fazer isto manualmente não deverá dar muito trabalho na maioria dos casos, bastará fazer o download dos ficheiros e importá-los para a base de dados usando por exemplo o PHPmyAdmin.

Mas e que tal fazer a actualização automaticamente todas as manhãs? Isto pode ser resolvido de uma forma semelhante à seguinte:

  1. Um Cronjob começa o script de actualização
  2. Uma ferramenta de download inicia o download do ficheiro
  3. Um cliente da Base de Dados importa o ficheiro para a BD

Este script de actualização não é de modo algum um script PHP como os usados para gerar páginas Web mas um shell-script que corre na consola do servidor. No entanto poucas pessoas terão acesso ao shell no seu servidor.

Normalmente isto não seria muito difícil já que qualquer pessoa poderia usar os três processos através da função system() num script normal em PHP. Mas, uma vez que a maior parte dos servidores mão tem esta opção activa por motivos de segurança. Nesse caso, a única opção que resta seria utilizar o PHP para tudo.

Dado que a maioria dos servidores limita o tempo de carregamento dos scripts para 10 a 30 segundos (muito pouco tempo para fazer downloads grandes como os dumps SQL do Travian). Para além disso, o acesso a ficheiros e serviços externos ao servidor pode estar desabilitado tornando assim impossível arranjar os dados necessários.

Para ser mais explícito: Não vale a pena considerares o uso de um servidor grátis se realmente queres escrever esta ferramenta de mapas.

Continuando...

O seguinte exemplo é funcional e escrito com PHP e MySQL. Precisarás também do wget (Ferramenta para downloads pela linha de comandos) também.

Para poder executar o script tens de criar um directório chamado "data" dentro do directório do script. Tens também de permitir que o script possa "escrever" nesse directório. Além disso deves criar numa Base de Dados uma tabela chamada "x_world" como mostrado mais acima. criar um DB com a tabela "x_world" como descrito acima.Sourcecode update script

<?php
    
    
// Preferências
    
$servidor_mysql 'localhost';
    
$utilizador_mysql 'utilizador';
    
$passe_mysql 'passe';
    
$bd_mysql 'base_de_dados';
    
    
// Ligação à Base de Dados
    
$bd = @mysql_connect($servidor_mysql$utilizador_mysql$passe_mysql) OR die('Não foi possível ligar ao servidor!');
    
$seleccionar_bd = @mysql_select_db($bd_mysql) OR die('Não foi possível seleccionar a BD!');
    
    
// Carregamento do map.sql usando a função system com wget para a pasta data/
    // IMPORTANTE: O PHP deve ter permissões para escrever na pasta data/!
    
system('wget http://s1.travian.pt/map.sql -O data/tmp.sql');

    
// Verifica se o ficheiro foi carregado e se é maior que 0 bytes
    
if (file_exists('data/tmp.sql') AND filesize('data/tmp.sql')) {
        
        
// Limpar Tabela da BD
        
$query 'TRUNCATE TABLE x_world';
        
$result = @mysql_query($query) OR die('Não foi possível limpar a tabela x_world!');
        
        
// Executa o map.sql usando o mysql
        // IMPORTANTE: Para mundos T2 o conjunto de caracteres a usar deve ser o "latin1"
        
system('mysql --host='.$servidor_mysql.' --user='.$utilizador_mysql.' --password='.$passe_mysql.' --default-character-set=utf8 '.$bd_mysql.' < data/tmp.sql');
        
        echo 
'Actualização completa!';
        
    } else {
        
        echo 
'Falha ao carregar o ficheiro map.sql';

    }
    
    
// Caso o ficheiro temporário exista será eliminado
    
if (file_exists('data/tmp.sql')) {
        
unlink('data/tmp.sql');
    }
    
    
// Fechar a Ligação à Base de Dados
    
@mysql_close($bd);

?>

Exemplo: Mapa estático da Aliança

Mapa Exemplo

O pequeno script que se segue mostra como criar um mapa de aliança simples. No topo, na variável $id_aliancamarcada insere o ID da Aliança que desejas marcar no mapa. Com essa informação o script irá gerar o mapa de todas as aldeias do servidor e marcar as da aliança escolhida.

Para este script funcionar em condições as seguintes extensões do PHP devem estar activas: GD-Lib e Funções de Imagens bem como a BD MySQL e a tabela descrita acima no script de actualização.

Lembra-te de não usar este script muito frequentemente já que ele põe uma grande quantidade de carga no servidor. É por esse motivo que deves colocar este script numa parte de acesso difícil e acessá-lo o mínimo de vezes por dia.

Mapa da Aliança

<?php

    
// idal da aliança a marcar
    
$id_aliancamarcada 2403;
    
    
// Preferências
    
$servidor_mysql 'localhost';
    
$utilizador_mysql 'utilizador';
    
$passe_mysql 'passe';
    
$bd_mysql 'base_de_dados';
    
    
// Ligação à Base de Dados
    
$bd = @mysql_connect($servidor_mysql$utilizador_mysql$passe_mysql) OR die('Não foi possível ligar ao servidor!');
    
$seleccionar_bd = @mysql_select_db($bd_mysql) OR die('Não foi possível seleccionar a BD!');
    
    
// Criar Imagem: O mapa vai de -400 a 400
    // -> soma 2*400+1 (+1 por causa do eixo 0)
    
$imagme imagecreate(801801);
    
    
// Cores de: Fundo, aldeia normal, aldeia da aliança
    
$cor_fundo imagecolorallocate($imagem255255255);
    
$cor_normal imagecolorallocate($imagem200200200);
    
$cor_marcada imagecolorallocate($imagem25500);

    
// Fill images background with chosen color
    
imagefill($imagem00$cor_fundo);

    
// Seleccionar todas as aldeias da BD ordenadas em forma ascendente pelo ID
    // (Os campos estão numerados do topo esquerdo para o fundo direito)
    
$query 'SELECT x, y, aid FROM x_world ORDER BY id ASC';
    
$resultado = @mysql_query($query) OR die('Não foi possível seleccionar as aldeias na tabela 'x_world!');
    
    
// Verifica se há aldeias
    
if (mysql_num_rows($resultado)) {
        
        
// Selecciona a primeira aldeia
        
$linha = @mysql_fetch_assoc($resultado);
        
        
// Estas variáveis guardam a localização onde se está a desenhar de momento
        
$apontador_x 0;
        
$apontador_y 0;
        
        
// Ciclo externo para as coordenadas em Y
        
for($y=400$y >= -400$y--) {
        
            
// Ciclo interno para as coordenadas em X
            
for ($x=-400$x <= 400$x++) {
                
                
// Quando se chegar às coordenadas do registo:
                
if ($linha['x'] == $x AND $linha['y'] == $y) {
                    
                    
// Seleccionar a cor da aldeia dependendo do idal
                    
if ($
linha['idal'] == $id_aliancamarcada) {
                        
$cor $cor_marcada;
                    } else {
                        
$cor $cor_normal;
                    }
                    
                    
// Desenhar a aldeia com a cor que lhe cabe
                    
imagefilledrectangle($imagem$apontador_x$apontador_y, ($apontador_x 1), ($apontador_y 1), $cor);
                    
                    
// Seleccionar o próximo registo 
                    
$linha = @mysql_fetch_assoc($resultado);
                }
                
                
// Aumenta o apontador para as coordenadas em X
                
$apontador_x++;
            }
            
            
// Aumenta o apontador para as coordenadas em Y
            
$apontador_y++;
            
            
// Chegando ao fim de uma linha tem de se marcar o apontador do X para 0 de novo
            
$apontador_x 0;
        }    
    }
    
    
// Selecciona o Header HTTP para o tipo de ficheiro seleccionado
    
header("Content-Type: image/png");
    
    
// Gera e mostra a imagem
    
imagepng($imagem);

?>
Procurar

Opções FAQ


relatar um erro | Última Actualização: 2007-11-07 20:07:33
Imprint | © 2004 - 2010 Travian Games GmbH