Tituc

 tutoriel / partage [JAVA/BDD/PHP/VB.NET] Savoir qui est en ligne sur un launcher personnalisé

Recommended Posts

Attention :

- Dans ce tutoriel, l'émulateur montré pour la modification sera AR54.

- Lors de la modification dans la base de donnée, le serveur doit être Hors Ligne (Realm et Game).

 

Coucou,

 

Pour ce tutoriel, j'aimerai préciser qu'il si il y a des corrections et/ou optimisations possibles, c'est normal (et n'hésitez pas à me le préciser !) : Il faut dire que quand je développe quelque chose, je cherche toujours la façon la plus compliquer pour la faire fonctionner. Cette fonction servira donc à connaître les joueurs en ligne (par leur nom de personnage) sous forme de tableau. Ça peut être pratique pour des applications comme sur un "lanceur" par exemple. Si vous êtes un peu perdu, voici un récapitulatif en capture d'écran dans le spoiler ci-dessous :

 

 

903021_525067170872316_1721904454_o.png

 

Les modifications nécessaires pour faire ce tutoriel sont :

- En JAVA (Personnage.java, SQLManager.java)

- En SQL (Table 'Personnages' concernée)

- En PHP (Deux à trois petits fichiers à créer)

- En VB.NET (Un form à créer avec : MenuStrip, ListView)

 

Certains diront certainement "Tout ça à modifier ? Où est l'optimisation ?" ce à quoi je répondrai naturellement "Optimisation ? kékeucé ?"

 

Modification en JAVA :

 

Tout le monde sait que AR54 est composé en deux parties, Realm & Game. Il est donc évident que la modification sera dans le "Game". Rendez-vous donc dans Personnage.java ! Bien évidemment, sachez qu'Ancestra Remake n'enregistre pas les personnages connectés, mais les comptes connectés. Pour qu'il compte les personnages connectés, on va donc bien évidemment ajouter une petite colonne "connect" dans la table 'Personnage' : On cherche donc ceci (Ctrl+F) :

public Personnage(int _guid, String _name, int _sexe, int _classe,
 
Une fois arrivé, il suffit d'ajouter dans la parenthèse de "public Personnage(" (à la fin de cette parenthèse) :
, int connect
 
Voila ce que ca devrait donner :
Voilà ce que ça devrait donner
public Personnage(int _guid, String _name, int _sexe, int _classe, int _color1, int _color2, int _color3, long _kamas, int pts, int _capital, int _energy, int _lvl, long exp, int _size, int _gfxid, byte alignement, int _compte, Map stats, byte seeFriend, byte seeAlign, byte seeSeller, String canaux, short map, int cell, String stuff, String storeObjets, int pdvPer, String spells, String savePos, String jobs, int mountXp, int mount, int honor, int deshonor, int alvl, String z, long title, int wifeGuid, int connect) {

 

 

Direction SQLManager.java et cherchez "LOAD_PERSO_BY_ACCOUNT" (ou LOAD_PERSO)... Ou les deux si vous avez les deux. Rendez-vous donc juste en dessous de RS.getInt("wife"), ajoutez-y une virgule (à la fin de RS.getInt("wife")), puis ajoutez en dessous RS.getInt("connect").

 

Ce que ca devrait donner :

Ce que ça devrait donner
RS.getInt("mount"),RS.getInt("honor"),RS.getInt("deshonor"),RS.getInt("alvl"),RS.getString("zaaps"),RS.getLong("title"),RS.getInt("wife"),RS.getInt("connect"));

 

Dernière partie à modifier pour l'émulateur :Rendez-vous dans "SAVE_PERSONNAGE" (Ctrl+F toujours)et à la fin de baseQuery, remplacez :

"`title`= ?,"+"`wife`= ?"+" WHERE `personnages`.`guid` = ? LIMIT 1 ;";
 

par

"`title`= ?,"+"`wife`= ?,"+"`connect` = ?"+" WHERE `personnages`.`guid` = ? LIMIT 1 ;";
 

Une fois ceci fait, rendez-vous un peu plus en dessous (au dessus de p.executeUpdate();) afin de modifier ça :

p.setLong(35,(_perso.get_title()));p.setInt(36,_perso.getWife());p.setInt(37,_perso.get_GUID());
 

par ça :

p.setLong(35,(_perso.get_title()));p.setInt(36,_perso.getWife());p.setInt(37,_perso.isOnline()?1:0);p.setInt(38,_perso.get_GUID());
 

Un peu d'explication :

AR54 a une fonctionnalité qui permet de savoir si un personnage est connecté en jeu ou pas (c'est cette fonction qui est utilisée concernant les MPs par exemple, pour éviter de MP un personnage déconnecté). On utilise donc cette fonction pour savoir si un joueur est connecté ou pas; donnée qui sera enregistrée dans la base de donnée (0 = déconnecté, 1 = connecté)

 

Et on en a enfin fini avec la partie concernant l'émulateur ! Maintenant vous pouvez le compiler, ou faire ce que vous voulez avec.

 

Modification en SQL :

 

Que vous ayez Navicat ou PHPMyAdmin, le principe reste le même. On aura pas besoin d'entrer un code SQL, il s'occupera de générer et d’exécuter le code SQL tout seul :

 

Solution Navicat :

Solution Navicat

- Rendez-vous dans la database où se situe la table 'personnages'

- Clique droit sur la table 'personnages' et cliquez sur 'Design Table'

- Ensuite on voit les colonnes sous forme de ligne, il suffit d'aller en bas de toutes les lignes et d'appuyer sur la touche "Bas" de votre clavier pour que la ligne se créée automatiquement.

- Pour la première colonne, vous devez mettre "connect"

- Pour la deuxième, mettez "int"

- Pour la troisième, mettez 10 (optimisation ? kékeucé ?)

- Ensuite laissez les autres colonnes restantes (sauf pour le carré que vous devez décocher)

- Ne quittez pas encore ! Vous pouvez remarquer en bas de la fenêtre, qu'il y a marqué "Default:", mettez donc 0.

- Vous pouvez sauvegarder avec le petit bouton 'save' et quitter cette fenêtre

 

Solution PHPMyAdmin

Solution PHPMyAdmin

- Rendez vous dans la page PHPMyAdmin du serveur (généralement, c'est http://www.monserveur.com/phpmyadmin), les identifiants seront demandés, mettez les et beh.. connectez vous.

- Rendez-vous dans la database où se situe la table 'personnages'

- Allez donc dans la table 'personnages'

- Cliquez sur l'onglet 'Structure'

- On peut remarquer donc toutes les colonnes sous forme de lignes, allez en bas de toutes ces lignes

- En dessous de "Version imprimable", on peut remarquer "Ajouter x colonnes" (mettez 1) et cochez "En fin de table" (normalement c'est déjà coché par défaut), ensuite cliquez sur "Exécuter"

- Dans la première ligne, mettez "connect"

- Dans la deuxième, mettez "INT"

- Dans Taille/Valeurs, mettez 10 (Optimisation? kékeucé?)

- Dans Défaut, choisissez "Tel que définie:" et mettez le chiffre 0

- Le reste vous laissez comme c'est

- Puis vous cliquez sur "Sauvegarder"

 

WINNER ! Ce n'est pas encore terminé. :)

 

Modification en PHP :

 

Rien de plus simple, il vous suffit de créer un fichier PHP.Conseil : Abattez 'Bloc-Note' et téléchargez 'NotePad++'.Dans ce premier fichier PHP sera noté les noms de tous les joueurs en sautant une ligne à chaque fois.

 

'Zeus a dit :
Honte à toi fils ! Tu utilises mysql_ !

 

Désolé maître Zeus ne me fouettez pas ! Comme l'a dit Zeus, j'utilise la solution la moins favorable (car je ne sais utiliser que celle là.. :corde+tabouret: )

 

On va donc se connecter :

<?php mysql_connect( 'IP_DB', 'USER_DB', 'PASS_DB');
 

Pour ceux qui ne dépassent pas 3 de moyenne en anglais, j'explique !

 

IP_DB : Vous mettez l'adresse IP de la base de donnée (généralement en local, c'est à dire 127.0.0.1)

USER_DB : L'utilisateur de la base de donnée (root par défaut il me semble)

PASS_DB : Le mot de passe de la base de donnée (Aucun par défaut, sécurité garantie ! :antiphrase: )

 

Une fois ceci-fait, mettez en dessous :

mysql_select_db('Database') or die (mysql_error());
 

Bawi, parce qu'il faut aussi sélectionner la base de donnée ! Donc remplacer Database par ... Ben votre base de donnée qui contient la table 'personnages' (ancestra_game par défaut)

 

Encore en dessous, mettez :

$NameOfPersos = mysql_query("SELECT `name` FROM `personnages` WHERE `connect` = 1 ORDER BY `level` DESC");
 

Alors pour décomposer un petit peu :

 

On va sélectionner la colonne 'name' de la table 'personnages' afin de récupérer tous les noms des joueurs. Seulement, pour que l'on prenne seulement les connectés, on selectionne la colonne 'connect' afin de ne trier que les joueurs connectés ! ORDER BY `level` DESC signifie simplement que l'affichage sera trié en fonction du plus grand niveau du joueur connecté (en décroissant). Si vous souhaitez le contraire (par ordre croissant), remplacez DESC par ASC

 

Et si vous voulez que ce soit le nom du joueur qui soit trié (et non le niveau), vous remplacez simplement `level` par `name`. Attention : En faisant ce changement, vous devrez le faire également sur le deuxième fichier PHP.

 

Et on termine par :

while ($row = mysql_fetch_array($NameOfPersos, MYSQL_BOTH)) {   printf ($row[0], $row["name"]);   echo '';} ?>
 

Kékeucé ?

C'est tout simplement ce qui va permettre d'écrire en boucle le nom des personnages connectés en sautant une ligne. Sachez que echo ''; (en sautant une ligne sans espace) est volontaire !

 

Pour résumer, voici la tronche du fichier :

<?php 
mysql_connect( 'IP_DB', 'USER_DB', 'PASS_DB');
mysql_select_db('Database') or die (mysql_error());

$NameOfPersos = mysql_query("SELECT `name` FROM `personnages` WHERE `connect` = 1 ORDER BY `level` DESC");

while ($row = mysql_fetch_array($NameOfPersos, MYSQL_BOTH)) {
	printf ($row[0], $row["name"]);   
	echo '';
}
?>
 

Sauvegardez ce fichier et nommez le playersonline.php par exemple, ensuite uploadez-le sur votre CMS, dans un dossier que vous nommerez lanceur par exemple (situé à la racine, c'est l'exemple que je vais prendre). Donc ce fichier aura pour lien : http://www.monserveur.com/lanceur/playersonline.php

 

Pour le deuxième fichier, je ne vais pas tout réexpliquer. Le deuxième fichier consistera à afficher le niveau du joueur...

 

Prière de ne pas vous arracher les cheveux, chers développeurs :x

 

Ce deuxième fichier sera donc exactement pareil que le premier mis à part que la requête sera différente car la recherche ne sera pas le nom, mais le niveau des joueurs connectés. Voici le script entier :

<?php 
mysql_connect( 'IP_DB', 'USER_DB', 'PASS_DB');
mysql_select_db('Database') or die (mysql_error());

$LvLOfPersos = mysql_query("SELECT `level` FROM `personnages` WHERE `connect` = 1 ORDER BY `level` DESC");

while ($row = mysql_fetch_array($LvLOfPersos, MYSQL_BOTH)) {   
	printf ($row[0], $row["level"]);
	echo '';
}
?>
 

Voilou, une fois ceci fait, enregistrez-le sous le nom de lvlplayersonline.php par exemple et uploadez-le au même endroit que le premier fichier php. Ce qui donnera pour ce lien :http://www.monserveur.com/lanceur/lvlplayersonline.php

 

MIRACLE ! On a presque fini ! Plus qu'une partie !

 

Avant de continuer, j'aimerai vous dire la raison pour laquelle j'ai décidé de passer par un script PHP pour faire ceci, c'est tout simplement pour éviter que ceux qui s'amusent à décompiler des applications VB.NET trouvent par hasard les identifiants de la base de données.

 

Modification en VB.NET :

 

Bien évidemment, "Microsoft Visual Studio" sera utilisé pour faire ceci.

 

Pour commencer, on va créer une Form qu'on appellera "PlayersOnline".

 

Cette petite form aura une dimension par défaut de 328; 469 (dans propriété, size)

 

On ajoute un MenuStrip qui sera placé en haut de la fenêtre (vous verrez plus tard pour quoi... Ah mais vous avez déjà vu au début du tutoriel, suspens gâché :x)

 

Ajoutez ensuite un ListView.

 

Avec ce ListView, cliquez sur la petite flèche en haut à droite (de ListView hein) et cliquez sur "Ancrer dans le conteneur parent".

 

Ah, ça prend déjà forme !

 

Conseil : Il est conseillé de changer le BackGround de ListView (ça se trouve dans sa propriété) de façon ça ce que l'on puisse distinguer les grilles.Recliquez donc sur cette petite flèche et allez dans Modifier les colonnes... histoire d'ajouter quelques colonnes (bawi).

 

Cliquez donc sur "Ajouter", la première colonne servira d'ID en quelques sortes et ne sera pas visible (car elle n'est pas utile aux joueurs).

 

Sachez que cette première colonne bloque également sur le "Textalign" pour une raison qui m'est inconnue, c'est pour cela qu'on commence par la deuxième.Pour la rendre invisible, elle a sa petite propriété :

 

Dans Width : Mettez 0

 

Une fois ceci fait, ajoutez une autre colonne (colonne qui servira à mettre les noms de personnages) :

 

Voici les propriétés à mettre (conseillé):

Text : Nom de personnage

TextAlign : Center

Width : 200

 

Une fois ceci fait, ajoutez une autre colonne avec les propriétés suivantes :

Text : Niveau

TextAlign : Center

Width : 98

 

Ayé, les colonnes sont prêtes !

 

Ah non, il manque quelque chose...

 

Cliquez sur "Ok" bien évidemment, puis réallez sur cette petite flèche de ListView encore une fois !

 

Dans "Afficher", cliquez sur "Détails".

 

Il manque encore à définir les propriétés de ListView (que j'ai appelé MenuCharacters) :

(Name) : MenuCharacters -> Le nom

BorderStyle : None -> Le style de bordure qui encadre le tableau

Dock : Fill

FullRowSelect : True

GridLines : True -> Essentiel pour afficher la grille !

 

Dernière chose : Ajoutez un bouton "Rafraîchir" dans le menustrip qui a été ajouté après la création de la form.

 

Et si le bonhomme flood le bouton refresh, Kékispass ?

 

Pas d'inquiétude ! Nous mettrons un timer anti-flood !

 

Faites clique droit -> Afficher le code

 

Maintenant, nous allons créer "RefreshPlayersOnline".

 

Je vous laisse vous débrouiller avec ce gros pavé :

 

Sub RefreshPlayersOnline()
	PlayersOnline.MenuCharacters.Items.Clear()
	Try
		Dim NamePlayersOnline As System.Net.WebResponse = Nothing
		Dim LevelPlayersOnline As System.Net.WebResponse = Nothing
        
		NamePlayersOnline = System.Net.WebRequest.Create("http://www.monserveur.com/lanceur/playersonline.php").GetResponse()
		LevelPlayersOnline = System.Net.WebRequest.Create("http://www.monserveur.com/lanceur/lvlplayersonline.php").GetResponse()   

		If NamePlayersOnline.ContentLength > 0 Then
			If LevelPlayersOnline.ContentLength > 0 Then                    
				Dim NamestreamReader As New System.IO.StreamReader(NamePlayersOnline.GetResponseStream())
				Dim LevelstreamReader As New System.IO.StreamReader(LevelPlayersOnline.GetResponseStream())
				Dim lignename As String
				Dim lignelevel As String
                
				Do
					lignename = NamestreamReader.ReadLine
					lignelevel = LevelstreamReader.ReadLine                        
                    
					With PlayersOnline.MenuCharacters.Items.Add("")
						.SubItems.Add(lignename)
						.SubItems.Add(lignelevel)
					End With
				Loop Until lignename Is Nothing

				NamestreamReader.Close()
				LevelstreamReader.Close()
			End If
		End If
	Catch ex As System.Net.WebException
		MsgBox("Erreur : Vérifiez votre connexion internet, ou si un antivirus ou pare-feu est actif.")
	End Try    
End Sub
 

Je plaisante, on va décomposer ça :

 

On a souvent tendance à l'oublier, mais

PlayersOnline.MenuCharacters.Items.Clear()
 

est très important pour vider le tableau (oui, car sinon ça ajoute et ça surcharge !)

Dim NamePlayersOnline As System.Net.WebResponse = Nothing            
Dim LevelPlayersOnline As System.Net.WebResponse = Nothing            

NamePlayersOnline = System.Net.WebRequest.Create("http://www.winedowze.com/winedowze/1.29/pages/playersonline-WL.php").GetResponse()
LevelPlayersOnline = System.Net.WebRequest.Create("http://www.winedowze.com/winedowze/1.29/pages/lvlplayersonline-WL.php").GetResponse()
 

Ici, on retrouve les liens des fichiers PHP que l'on avait fait.

 

On récupère donc le résultat des deux fichiers PHP afin de pouvoir plus tard les afficher dans le tableau.

Do
	lignename = NamestreamReader.ReadLine
	lignelevel = LevelstreamReader.ReadLine

	With PlayersOnline.MenuCharacters.Items.Add("")
		.SubItems.Add(lignename)
		.SubItems.Add(lignelevel)
	End With
Loop Until lignename Is Nothing
 

Voilà la petite boucle qui permettra de lire chaque ligne (technique pour que le niveau corresponde au nom du joueur !) et qui ajoutera ceci au tableau.

 

On remarque d'ailleurs la ligne

PlayersOnline.MenuCharacters.Items.Add("")
 

qui correspond à la colonne invisible !

 

Une fois que l'on a créer ça, il faut créer le timer (ewi ! Pour le rafraîchissement !)

 

Personnellement j'ai appelé le timer WaitForRefresh.

 

Dans les propriétés du timer :

(Name) : WaitForRefresh

Enabled : False

Interval : 5000 -> Oui, 5 secondes avant chaque refresh ! Réglez le comme vous avez envie au pire.

 

Maintenant, on va définir l'action du timer :

 

Double-Cliquez sur WaitForRefresh et mettez ceci :

WaitForRefresh.Stop()
WaitForRefresh.Enabled = False        
RafraîchirToolStripMenuItem.Enabled = True
 

Boh c'est pas si compliqué à comprendre.

 

Lorsque le timer a attendu 5 seconde, il s'arrête, et la touche pour rafraîchir se dé-grise.

 

Revenez à l'interface graphique de PlayersOnline et double-cliquez ensuite sur le bouton "Refresh" que l'on avait placé sur le MenuStrip.

 

Ensuite mettez ça dedans :

RefreshPlayersOnline()        
WaitForRefresh.Start()        
WaitForRefresh.Enabled = True        
RafraîchirToolStripMenuItem.Enabled = False
 

On retrouve notre fonction RefreshPlayersOnline() pour recharger le tableau et on relance le timer en grisant le bouton pour rafraîchir afin de ne pas pouvoir flooder.

 

Il ne manque plus qu'à ajouter l'action à l'affichage de cette form, allez tout en bas du code et entre End Class et End Sub, calez ça :

Private Sub PlayersOnline_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load        
	RefreshPlayersOnline()        
	WaitForRefresh.Start()        
	WaitForRefresh.Enabled = True        
	RafraîchirToolStripMenuItem.Enabled = False    
End Sub
 

Ne soyez pas étonné, c'est le même code que pour le bouton de rafraîchissement.

 

Voilou, ce tutoriel est terminé !

 

Pour lancez la fenêtre, vous calez où vous souhaitez un "PlayersOnline.show" !

 

Edited by Nicosti
Correction spoilers
  • Like 2

Share this post


Link to post
Share on other sites

Eh bien, à peine arriver tu nous charge avec un tutoriel qui m'a l'air bien complet et bien écris :)

Bonne chance pour la suite, je t'encourage à continuer.

Qui sait, la section Dofus se réveillera peut-être ? :P

 

Cordialement,

KaynabX

Share this post


Link to post
Share on other sites