On compile from scratch un serveur WoW avec Trinity Core sous Debian. On peut aussi compiler sous Windows (il faut installer Visual C + +). Par ailleurs on doit pouvoir cross-compiler avec mingw mais je n'ai pas essayé.
⇒ Trinity est un fork de Mangos.
Vous obtiendrez :
⇒ Version du client supportée : 3.1.3
⇒ Version de la base de données : TrinityDatabase 0.0.5
⇒ Dernière maj de cette doc : 30/08/2009
⇒ Versions utilisées pour cette doc : 5479 avec TrinityDatabase 0.0.5
Il faut parfois adapter, pour ma part j'ai installé sur une machine virtuelle Xen et certains packages diffèrent. Un apt-get install build-essential peut installer aussi certains packages du type gcc et compagnie. Certains packages existent peut-être déjà sur la machine, à vous de voir.
apt-get install zlibc gcc g++ make automake autoconf mysql binutils cpp libc6 libc6-dev libc6-i686 libgcc1 \ libmysql++-dev linux-header-`uname -r` linux-kernel-headers linux-kernel-devel makedepend mysql-client-5.0 \ mysql-common mysql-server python libssl0.9.8 libssl-dev openssl ssl-cert subversion g77 zlib1g-dev screen mc \ bunzip libstdc++ libtool unrar mercurial mercurial-common cmake
Il faut également installer la libace. Sous Debian Lenny on a la version 5.6.3 qui ne permettra pas de compiler le moteur. Il faut compiler une version plus récente à la mano en récupérant les sources ici. Choisir Latest Release et ACE only. Je suppose que vous savez compiler à partir des sources (configure, make, make install).
On créé un user pour ne pas lancer le truc en root :
adduser -d /home/wowsvr wowsvr passwd wowsvr cd /home/wowsvr mkdir -p trinity2/work cd trinity2/work
trinity2 car c'est cette version qui fait fonctionner WOTLK, trinity1 supporte jusqu'à la version 2.4.3 (Burning Crusade).
⇒ On utilise Mercurial pour récupérer les sources. C'est un peu comme un CVS ou un GIT. Plein de docs existent sur le net, donc je fais pas de grand discours la-dessus.
On récupère la dernière version. Ici on utilise directement la patch queue, c'est-à-dire qu'on récupère le code source original + des patches qu'on activera par la suite :
hg qclone http://bitbucket.org/panaut0lordv/tc2-patches/ cd tc2-patches
Les patches permettent de rajouter des fonctionnalités au moteur. Ci-dessous ceux que j'utilise :
Bots : Un patch qui vous permet d'embaucher un bot pour vous donner un coup de main (attaque, buffs, soins, etc) lors des phases d'XP → (aide), il permet aussi d'invoquer et de contrôler les persos de son compte (aide).
speedpatch : Augmente la vitesse nominale de deplacement des joueurs.
TeleNPC2 : Ajouter un bot qui permet de se téléporter pour optimiser les déplacements.
On sélectionne les patches et on les applique :
hg qsel bots_maximius_313 speedpatch TeleNPC2 hg qpush -a
On configure le truc :
mkdir build cd build cmake ../ -DLARGE_CELL=1 -DDO_RA=1 -DPREFIX=/home/wowsvr/trinity2 -DCONF_DIR=/home/wowsvr/trinity2/etc chown -R wowsvr:wowsvr /home/wowsvr/trinity2
Et on compile :
make make install
il faut environ 30 min sur une VM Xen avec un proc à 2 Ghz et 15 min avec un Xeon à 2.8 GHz.
Ensuite on a besoin d'extraire les maps/vmaps du jeu ainsi que les DBCs qu'on doit placer sur le serveur. Ils sont indispensables pour le fonctionnement du serveur.
Une fois tout ces fichiers extraits, on les pose sur le serveur. Au final on a ça :
wowsvr@WoWvm:~/trinity2$ ls -ltr total 288 drwxr-x--- 2 wowsvr wowsvr 114688 Aug 22 12:58 maps drwxr-x--- 2 wowsvr wowsvr 12288 Aug 22 13:04 dbc drwxr-x--- 2 wowsvr wowsvr 4096 Aug 22 14:49 lib drwxr-x--- 2 root root 4096 Aug 23 12:18 lost+found drwxr-x--- 2 wowsvr wowsvr 4096 Aug 23 19:19 bin drwxr-x--- 2 wowsvr wowsvr 4096 Aug 24 08:20 etc drwxr-x--- 2 wowsvr wowsvr 135168 Aug 24 10:12 vmaps
Par défaut il n'y a pas de password root pour MySQL. C'est pas mal de mettre un password avant de commencer. La méthode facile et dégueu qui fonctionne est de tout faire en root. Pour ma part je créé toujours un user spécifique avec seulement les droits nécessaires. Ici un user trinity qui aura les droits sur les bases du jeu. Par la suite il faudra lancer des backups réguliers de base, etc. Je considère que vous savez déjà faire tout ça donc je ne m'étends pas ici.
On récupère la base de données UDB ainsi que la base TDB (on a juste besoin de quelques fichiers pour cette dernière) :
cd /home/wowsvr/trinity2/work svn co http://svn.assembla.com/svn/trinitydatabase
On créé les bases de données, à vide, qui sont au nombre de 3 :
GRANT USAGE ON * . * TO 'trinity'@'localhost' IDENTIFIED BY 'somepassword' \ WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 ; CREATE DATABASE `world` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; CREATE DATABASE `characters` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; CREATE DATABASE `realmd` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; GRANT ALL PRIVILEGES ON `world` . * TO 'trinity'@'localhost' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON `characters` . * TO 'trinity'@'localhost' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON `realmd` . * TO 'trinity'@'localhost' WITH GRANT OPTION;
Puis on ajoute le contenu :
mysql -u trinity -p realmd < tc2-patches/sql/realmd.sql mysql -u trinity -p characters < tc2-patches/sql/characters.sql cd trinitydatabase/trunk/full_db/ unzip TDB_0.0.5_5254.zip mysql -u trinity -p world < TDB_0.0.5_5254.sql On met à jour les bases en passant les patchs Trinity dispos, on les passe **dans l'ordre croissant**, on démarre de 5254 jusqu'à la fin (ici 5314 pour la base world) et ce pour chaque base : * **world** <code> cd /home/wowsvr/trinity2/share/trinity/sql/updates/ ls -l *world* |tail -16 wowsvr@wowVM:~/trinity2/share/trinity/sql/updates$ ls -l *world* |tail -15 -rw-r--r-- 1 wowsvr wowsvr 77 Aug 23 10:39 5230_world_TDB.sql -rw-r--r-- 1 wowsvr wowsvr 90 Aug 23 10:39 5230_world_scripts.sql -rw-r--r-- 1 wowsvr wowsvr 471 Aug 23 10:39 5234_world_scripts.sql -rw-r--r-- 1 wowsvr wowsvr 559 Aug 23 10:39 5237_world_scripts.sql -rw-r--r-- 1 wowsvr wowsvr 88 Aug 23 10:39 5246_world_scripts.sql -rw-r--r-- 1 wowsvr wowsvr 77 Aug 23 10:39 5254_world_scripts.sql -rw-r--r-- 1 wowsvr wowsvr 1359 Aug 23 10:39 5270_world_scripts.sql -rw-r--r-- 1 wowsvr wowsvr 114 Aug 23 10:39 5300_world_scripts_dk.sql -rw-r--r-- 1 wowsvr wowsvr 84 Aug 23 10:39 5305_world_scripts.sql -rw-r--r-- 1 wowsvr wowsvr 1346 Aug 23 10:39 5314_world_scripts_ulduar.sql
⇒ on démarre donc par le fichier 5270_world.sql.
⇒ même principe
Puis on applique les derniers SQLs :
cd /home/wowsvr/trinity2/share/trinity/sql/FULL/ mysql -u trinity -p world < world_script_texts.sql mysql -u trinity -p world < world_script_waypoints.sql mysql -u trinity -p world < world_scripts_full.sql mysql -u trinity -p world < world_spell_full.sql
A ce stade c'est terminé. Si vous avez utilisé les patches Bots et TeleNPC2 il reste quelques petites manips à faire :
world_bots.sql -> à appliquer sur la base world characters_bots.sql -> à appliquer sur la base characters
setup_npc_teleport.sql -> à appliquer sur la base world
les fichiers world_bots.sql et setup_npc_teleport.sql peuvent être customisés si besoin.
On passe maintenant aux traductions :
cd /home/wowsvr/trinity2/work svn co http://udbfr.googlecode.com/svn/ cd svn/trunk/Full_DB unrar e UDBFR_0.0.6_MaNGOS_7685.rar unrar e UDBFR_0.0.6_ScriptDev2_1012.rar
⇒ un coup de sed pour remplacer mangos_string par trinity_string dans les fichiers SQL
mysql -u trinity -p world < UDBFR_0.0.6_MaNGOS_7685.sql mysql -u trinity -p world < UDBFR_0.0.6_ScriptDev2_1012.sql
On choisit un nom pour le serveur, on ajoute son adresse IP (locale ou internet au choix) et on spécifie un password pour le user trinity :
mysql -u root -p mysql> use realmd ; mysql> UPDATE realmlist SET `name` = 'nom_du_serveur'; mysql> UPDATE realmlist SET `address` = 'AAA.BBB.CCC.DDD'; mysql> SET PASSWORD FOR trinity@localhost=PASSWORD('PASSWORD'); mysql> exit
Dans les fichiers de conf suivants modifier le password ou les autres infos le cas échéant :
wowsvr@WoWvm:~/trinity2/etc$ grep 127.0.0.1 * trinitycore.conf:LoginDatabaseInfo = "127.0.0.1;3306;trinity;PASSWORD;realmd" trinitycore.conf:WorldDatabaseInfo = "127.0.0.1;3306;trinity;PASSWORD;trinity" trinitycore.conf:CharacterDatabaseInfo = "127.0.0.1;3306;trinity;PASSWORD;characters" trinityrealmd.conf:LoginDatabaseInfo = "127.0.0.1;3306;trinity;PASSWORD;realmd"
Modifier aussi la directive DataDir dans trinitycore.conf pour pointer vers le répertoire qui contient les répertoires vmaps, maps et dbc.
Le paramètre vmap.enableLOS = 1 permet une meilleure gestion de l'espace.
Le paramètre LogsDir permet d'éviter d'avoir les logs dans le répertoire bin.
On peut aussi modifier le fichier de conf trinitycore.conf pour changer le jeu :
wowsvr@WoWvm:~/trinity2/etc$ grep -i Rate trinitycore.conf |egrep "XP|Money"|egrep -v "^#|70" Rate.Drop.Money = 5 Rate.XP.Kill = 5 Rate.XP.Quest = 5 Rate.XP.Explore = 5
La on multiplie l'XP par 5 lors d'un kill de mob, d'une qûete ou de la visite d'une nouvelle zone. L'argent est aussi multiplié par 5. Le fichier est bien commenté et contient pas mal de paramètres.
Le fichier est bien documenté.
Bravo, vous avez presque terminé ;)
Pour démarrer, on peut créer un script /home/wowsvr/trinity2/bin/trinity.sh :
#!/bin/bash [[ $# -ne 1 ]] && echo "./trinity.sh stop ou ./trinity.sh start" && exit case $1 in start) for i in realmd worldd do screen -A -m -d -S $i ~/trinity2/bin/trinity-$i echo "Lancement de trinity-$i : OK" done ;; stop) for i in realmd worldd do killall trinity-$i echo "Arret de trinity-$i : OK" done ;; restart) ~/trinity2/bin/trinity.sh stop echo ~/trinity2/bin/trinity.sh start ;; status) clear for i in realmd worldd do echo "Status de trinity-$i" lsof -a -p `ps au|grep $i|grep -v grep|awk '{print $2}'` -i 2>/dev/null|grep LISTEN echo done ;; *) echo "Mauvais choix ... stop, start, restart ou status" esac
Puis on lance le tout :
cd ~/trinity2/bin ./trinity.sh start
Pour lister les screens :
screen -list
Pour s'y connecter :
screen -r nom_du_screen
Pour un serveur online il faut forwarder les ports TCP 3724 et 8085 de votre routeur vers la machine qui héberge le serveur. En parallèle je n'autorise que certaines IPs :
for port in 3724 8085 do /sbin/iptables -A INPUT -p tcp --dport $port -j DROP done for ip in AAA.BBB.CCC.DDD EEE.FFF.GGG.HHH do for port in 3724 8085 do /sbin/iptables -I INPUT -p tcp --sport 1024: --dport $port -s $ip -m state --state NEW,ESTABLISHED -j ACCEPT /sbin/iptables -I OUTPUT -p tcp --dport 1024: --sport $port -s $ip -m state --state ESTABLISHED -j ACCEPT done done
Si tout est OK ca donne ca :
wowsvr@WoWvmII:~$ screen -r There are several suitable screens on: 25579.trinity-core (06/24/09 20:30:35) (Detached) 25576.trinity-realm (06/24/09 20:30:35) (Detached) Type "screen [-d] -r [pid.]tty.host" to resume one of them. wowsvr@WoWvm:~$ screen -r 25579.trinity-core TC>help TC>Syntax: .help [$command] Display usage instructions for the given $command. If no $command provided show list available commands. Commandes disponibles: account ... gm ... tele ... reload ... list ... lookup ... pdump ... guild ... reset ... instance ... server ... ahbotoptions announce gmannounce notify gmnotify commands revive help saveall kick ban ... unban ... banlist ... pinfo send ... loadscripts mute unmute repairitems TC>
TC> account create toto password TC> account set addon 2 TC> accoutn set gmlevel 3
.level : pour passer un level
.level 10 : prendre 10 levels
.modify money 100000 : ajouter 100 000 pièces de cuivre
D'autres commandes ici.
On peut créer des armes en bidouillant la base de données (cf. http://wiki.udbforums.org) et même certains sites mâchent le travail : http://wow-v.com. On créé son arme et le site génère le code SQL à injecter dans la base de données. On peut faire la même chose pour les mobs, les PNJs, etc. On peut aussi s'attribuer des objets, par ex. celui-ci, il suffit de taper .additem 34540, ou bien chercher les compétences dans la base de données et se les attribuer avec .learn ou .setskill.
Soit en ouvrant la base de données et en regardant dans les tables : item_template pour les items, creature_template pour les creatures. Pour les spells , les locations des .tele , etc (regardez les contenus des tables tout est là).
Soit en allant sur ces sites pour récupérer les IDs dans l'URL :
http://wow.allakhazam.com
http://www.thottbot.com
http://www.wowdbu.com
http://worldofwarcraft.judgehype.com
http://www.wowhead.com
http://wow.mmodb.com
MiniManager est un frontend web très utile pour gérer ses serveurs, cf. plus bas.
→ 61 est le GUID
Sélectionner le perso (en tant que GM) et taper .debug getvalue 151 qui doit être égal à 0. Récupérer la valeur sur un perso de la même race/sexe. Et faire un .debug setvalue 151 #le_resultat sur le perso buggé pour mettre la bonne valeur.
select * from `item_instance` where `owner_guid` = <AHbot Account ID> and `guid` not in (select `itemguid` from `auctionhouse` UNION select `item` from `character_inventory` UNION select `item_guid` from `guild_bank_item` UNION select `item_guid` from `mail_items` UNION select `item_guid` from `character_gifts`);