
Il existe déjà un grand nombre de sites qui collectent des informations de Travian et qui les exploitent de différentes façons. La plupart de ces sites sont des cartes ou des statistiques.
Ce tutoriel a été écrit pour vous donner quelques indications sur la façon dont ces sites peuvent être programmés. Tout d'abord, ce tutoriel est un exemple en PHP / MySQL (probablement le plus utilisé) et vous devez déjà savoir comment utiliser ces langages, car ce tutoriel n'a pas pour vocation de vous les expliquer.
Vous devriez avoir un langage de programmation à votre disposition (ex: php). Ce tutorial requiert aussi des connaissances dans la gestion de base de données (SQL).
Une combinaison très populaire est PHP et MySQL, cependant, il faut garder à l'esprit que la plupart des hébergeurs font tourner PHP en Safemode. Cela prive d'un moyen efficace de mise à jour automatique des données car PHP est trop limité dans ses fonctions.
Pourquoi ne pas le faire fonctionner en Safemode?Plus d'informations à ce sujet dans la section "Comment transmettre les informations à mon serveur ?".
Comme l'aide de robots et des scripts dans le jeu est illégale, il doit exister une autre façon de trouver l'information. Travian Games GmbH met à disposition des sauvegardes SQL à jour de chaque monde qui offre des informations pour chaque village du monde choisi.
Cette sauvegarde est mise à jour chaque matin vers les 7h (gmt+1) et elle est disponible dans deux versions : non-compressée (finissant par .sql) et compressée au format gzip (finissant par .sql.gz).
Le nom de la sauvegarde dépend de la langue du monde. Tous les mondes allemands utilisent le nom "karte.sql[.gz]" alors que les autres mondes utilisent "map.sql[.gz]".
Le fichier est accessible dans le répertoire racine du monde.
Exemples:Comme mentionné plus haut, les fichiers sont des sauvegardes SQL, ils ne contiennent rien d'autre que des requêtes INSERT SQL. Il est important de garder à l'esprit qu'il n'y a pas d'insertions avancées d'utilisées mais plutôt un INSERT par ligne (les insertions avancées pour plusieurs ressources auraient été dans une seule insertion).
Les anciens serveurs en version 2 utilisaient le codage ANSI pour les fichiers; maintenant toutes les sauvegardes sont encodées en UTF-8.
Si vous souhaitez créer la table assortie dans une base de données, vous pouvez utiliser le code ci-après:
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', `tid` tinyint(1) unsigned NOT NULL default '0', `vid` int(9) unsigned NOT NULL default '0', `village` varchar(20) NOT NULL default '', `uid` int(9) NOT NULL default '0', `player` varchar(20) NOT NULL default '', `aid` int(9) unsigned NOT NULL default '0', `alliance` varchar(8) NOT NULL default '', `population` smallint(5) unsigned NOT NULL default '0', UNIQUE KEY `id` (`id`) );
Observons les colonnes de la table :
| Colonne | Explication |
|---|---|
| id | Numéro du champ, commence dans le coin supérieur gauche au coordonnées (-400|400) et se termine dans le coin inférieur droit au (400|-400) |
| x | Coordonnée X |
| y | Coordonnée Y |
| tid | Le numéro de la tribue, 1 = Romains, 2 = Germains, 3 = Gaulois, 4 = Nature et 5 = Natars |
| vid | Numéro du village |
| village | Nom du village |
| uid | Numéro du joueur aussi connu sous le nom de User-ID |
| player | Nom du joueur |
| aid | Numéro de l'alliance |
| alliance | Nom de l'alliance |
| population | Nombre d'habitants du village |
Important: Aucune valeur Off et/ou Deff n'est accessible!
Le faire manuellement ne devrait pas poser trop de problème : il suffit de télécharger la sauvegarde la plus récente et de l'importer dans votre base de données avec par ex PHPmyAdmin.
Mais qu'en est-il pour chaque jour ? L'idéal ressemble à ceci :
Cette mise à jour de script est loin d'être un script PHP ou quelque chose de semblable utilisé pour générer une page Web, mais un script shell en cours d'exécution sur le serveur de la console. Malheureusement, peu de gens ont un accès shell sur le serveur exécutant leur page.
Normalement, ceci ne devrait pas poser de problème puisqu'il est possible d'effectuer ce processus via la commande system() dans un script PHP normal. Mais comme la majorité des fournisseurs utilisent le safemode pour des raisons de sécurité la commande system () par exemple est désactivée. La seule solution qui reste pour ces malchanceux est d'utiliser le PHP pour chaque opération.
Il faut savoir que la plupart des fournisseurs de script limitent la durée de 10 à 30 secondes (assez peu de temps pour télécharger une grande sauvegarde SQL). En outre l'accès à des fichiers externes au serveur pourrait être interdit empêchant d'obtenir un de ces fichiers.
Pour être plus clair: n'espérez pas utiliser un hébergeur gratuit si vous avez vraiment l'intention de créer cet outil de cartographie.
Ok, vous avez finalement réussi à vous défaire du safemod ou obtenu un accès protégé à votre serveur web ? Bien, dans ce cas, nous pouvons continuer !
L'exemple suivant en PHP et MySQL (vous aurez besoin d'un serveur et d'une commandline client "mysql"). Vous aurez également besoin de wget (Outil de téléchargement pour la commandline).
Afin que le script fonctionne, vous devez créer un dossier nommé "data" dans le répértoire qui contient le script. Bien entendu, vous devez autoriser les droits d'écriture pour l'utilisateur du serveur web. De plus, vous devez créer une DB avec la table "x_world" comme décrite plus haut. Enfin, saisissez les informations d'accès au début du script.
<?php
// Code d'accès à la base de données
$mysqlhost = 'localhost';
$mysqluser = 'user';
$mysqlpass = 'password';
$mysqldb = 'database';
// Créé la connection à la base de données
$db = @mysql_connect($mysqlhost, $mysqluser, $mysqlpass) OR die('Can not connect to DB-Server!');
// Sélectionnes la base de données
$db_select = @mysql_select_db($mysqldb) OR die('Can not select DB!');
// Charges le fichier map.sql via la commande system utilisant "wget" dans le dossier data/
// IMPORTANT: PHP doit être autorisé à écrire dans ce dossier, il peux être nécessaire de modifier les droits!
system('wget http://s1.travian.com/map.sql -O data/tmp.sql');
// Check whether the file has been downloaded and is larger than zero bytes
if (file_exists('data/tmp.sql') AND filesize('data/tmp.sql')) {
// Empty table
$query = 'TRUNCATE TABLE x_world';
$result = @mysql_query($query) OR die('Can not clear table x_world!');
// Exceute map.sql using the programme "mysql"
// IMPORTANT: The charset "latin1" has to be used for T2 game worlds (if there should be any left with that version)
system('mysql --host='.$mysqlhost.' --user='.$mysqluser.' --password='.$mysqlpass.' --default-character-set=utf8 '.$mysqldb.' < data/tmp.sql');
echo 'Update finished!';
} else {
echo 'Failed downloading map.sql or file is empty!';
}
// In case the temporary file exists it will be deleted
if (file_exists('data/tmp.sql')) {
unlink('data/tmp.sql');
}
// Close database connection
@mysql_close($db);
?>
Le petit script suivant montre comment créer une simple carte. Il vous suffit de modifier le haut du script pour les codes d'accès et l'ID de l'alliance dont vous voulez afficher la carte. Avec ces informations, le script générera une carte des villages du monde dont les villages de l'alliance choisie seront mis en valeur.
Pour exécuter correctement ce script, vous devez avoir les extensions de PHP suivantes: GD-Lib et fonctions Image ainsi qu'une base de donnée MySQL et une table telle que décrite dans les paragraphes d'avant ('x_world').
N'oubliez pas de ne pas tourner ce script trop souvent car il est assez gourmand en ressources. C'est pourquoi, il est conseillé de ne pas mettre ce script à la vue de tous mais plutôt de mettre un fichier en cache une fois par jour. Pour ce faire, lisez les autres paramètres de la fonction imagepng().
<?php
// aid of the highlighted Alliance
$marked_aid = 2403;
// Preferences
$mysqlhost = 'localhost';
$mysqluser = 'user';
$mysqlpass = 'password';
$mysqldb = 'database';
// Create database connection and select database
$db = @mysql_connect($mysqlhost, $mysqluser, $mysqlpass) OR die('Can not connect to DB-Server!');
$db_select = @mysql_select_db($mysqldb) OR die('Can not select DB!');
// Create image: Map goes from -400 to 400
// -> sums up tp 2*400+1 (+1 due to the 0 in the center)
$image = imagecreate(801, 801);
// Choose the colors of background, normal village and highlighted alliance
$color_background = imagecolorallocate($image, 255, 255, 255);
$color_normal = imagecolorallocate($image, 200, 200, 200);
$color_marked = imagecolorallocate($image, 255, 0, 0);
// Fill images background with chosen color
imagefill($image, 0, 0, $color_background);
// Select ALL villages from the DB and order by ascending ID
// (Fields are numbered from top left to bottom right)
$query = 'SELECT x, y, aid FROM x_world ORDER BY id ASC';
$result = @mysql_query($query) OR die('Can not select villages from table x_world!');
// Check whether there any villages at all
if (mysql_num_rows($result)) {
// Select first village
$row = @mysql_fetch_assoc($result);
// These variables save the location on which we are currently drawing
$x_pointer = 0;
$y_pointer = 0;
// Outer loop for the Y-coordinates
for($y=400; $y >= -400; $y--) {
// Inner loop for the X-coordinates
for ($x=-400; $x <= 400; $x++) {
// Once we reached the coordinates matching the current record selected from the DB:
if ($row['x'] == $x AND $row['y'] == $y) {
// Selecting the village color depending on the aid
if ($row['aid'] == $marked_aid) {
$color = $color_marked;
} else {
$color = $color_normal;
}
// Drawing the village with the selected color
imagefilledrectangle($image, $x_pointer, $y_pointer, ($x_pointer + 1), ($y_pointer + 1), $color);
// Select next record
$row = @mysql_fetch_assoc($result);
}
// Increase pointer for X-coordinate
$x_pointer++;
}
// Increase pointer for Y-coordinate
$y_pointer++;
// We reached the end of a line and have to set the X-pointer to 0 again
$x_pointer = 0;
}
}
// Select the HTTP-Header for the selected filetype
header("Content-Type: image/png");
// Generate image and print it
imagepng($image);
?>