
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.
Deves ter conhecimentos de linguagens web. Este tutorial também pede alguns conhecimentos de SQL para desenhar a base de dados.
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?Mais acerca deste assunto na secção "Como transfiro a informação para o meu servidor?".
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: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`) );
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.
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:
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);
?>
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.
<?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(801, 801);
// Cores
de: Fundo, aldeia normal, aldeia da aliança
$cor_fundo = imagecolorallocate($imagem, 255, 255, 255);
$cor_normal = imagecolorallocate($imagem, 200, 200, 200);
$cor_marcada = imagecolorallocate($imagem, 255, 0, 0);
// Fill images background with chosen color
imagefill($imagem, 0, 0, $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);
?>