Welcome to Bukkit France

Inscrivez-vous maintenant pour profiter d'un accès total à tout le contenu offert par la meilleur communauté Bukkit française ! Une fois inscrit et connecté, vous pourrez contribuez à la communauté en postant vos propres sujets et questions ou en répondant à ceux existants. Vous pourrez aussi customiser votre profil, recevoir des points de réputations, communiquer avec les autres membres via le chat, et plus encore! 

  • Annonces

    • Pskyco

      Bukkit France passe sous Discord !   02/20/16

      Bukkit France est désormais passé sur Discord, au revoir donc notre vieux Teamspeak ! Téléchargez le client et venez nous rejoindre sur notre salon en suivant les instructions suivantes.
      M-à-j du 25/02/2017 : Désormais, seuls les comptes actifs sur le forum se verront donner l'accès au Discord, ce dernier n'est pas une plateforme d'aide de la même manière que le chat.
Splliter

Communiquer avec son serveur Craftbukkit sans utiliser son packet

158 messages dans ce sujet

I) Préparatifs

 

Attention ce tuto n'est pas à la porter de tous le monde il faut avoir un minimum de connaissance dans le moding pour pouvoir l'utiliser et le comprendre. Il vous faudra aussi auparavant savoir comment ajouter de nouveaux sons dans minecraft.

 

 

II) Un peu de logique

 

Alors vous allez me dire que ce n'est pas possible de communiquer avec son serveur sans utiliser les packets! Moi je vous répond FAUX ! C'est possible grâce à un outils déjà intégrer à minecraft, Le tchat !

En effet dés que vous allez entrer dans une zone worldguard vous allez récupéré le flag puis on va l'analyser si sa correspond alors on joue une musique et on affiche un texte !

 

III) Traitement de l'information

 

Alors c'est partit on se rend dans la classe NetClientHandler et on va aller chercher la méthode handletchat

this.mc.ingameGUI.getChatGUI().printChatMessage(par1Packet3Chat.message);

Cette ligne permet d'afficher tous les méssages reçus dans le gui principale ! Hors ce n'est pas notre but alors on va poser une condition toute simple

if (par1Packet3Chat.message.startsWith("Bienvenue à Lypsia")){}

Donc si le méssage envoyer par le worldguard commence par Bienvenue à Lypsia alors on effectue la condition. Petit problème le worldguard envoie les méssage de cette manière :
 

 

Tuto%20Worldguard.png

 

Alors là vous allez me dire "wesh tro simple suffit d'ajouter les p'tite étoiles" Et bien non car la couleur est compté comme un caractère ;) Alors comment faire ? Et bien comme ceci les ami(e)s :

if (par1Packet3Chat.message.startsWith("\u00A7b ** Bienvenue à Lypsia")){}

et comme on veut que le méssage recu reste secret pour l'instant on fini cette condition avec un else pour ne pas afficher le méssage :

if (par1Packet3Chat.message.startsWith("\u00A7b ** Bienvenue à Lypsia")){}elsethis.mc.ingameGUI.getChatGUI().printChatMessage(par1Packet3Chat.message);

Voilà dans cette condition si vous voulez jouer un son et bien ce n'est pas très dur il suffit de suivre ce tuto (

) et d'ajouter ceci dans la condition :
mc.sndManager.playSoundFX("random.votreson", 1.0F, 1.0F);

Voilà donc quand vous entrer dans une zone vous avez de la musique !
Donc vous savez comment ajouter des sons pour chaque zone de votre worldguard !

IV) Affichage du nom de la ville

Je vous ai toujours dit qu'il fallais s'inspirer des codes existant pour avoire un rendu parfais !
Et bien vous savez quoi vous allez être servis Mojang fait tout, tout seul ! En effet le code est déjà tout fait !

Tuto%20Worldguard%202.png

Bon allez c'est partit on se retrouve dans la même class et même méthode ! Dans notre condition on va ajouter à apelle à une autre méthode :

mc.ingameGUI.DisplayCity("Royaume de Lypsia");

Et hop, les galères commence ! C'est tout à fait normale on va créer notre propre méthode pour l'affichage ! Donc on se rend dans la class GuiIngame et on va créer notre méthode

public void DisplayCity(String Nomdelaville){}

Ok donc sa c'est fait ! Maintenant on va géré l'affichage ! Mais pour sa on va avoire besoin de quelques variables donc c'est partit :

private String DisplayName = "";private int DisplayNameTimer = 0;private boolean isDisplay = false;

Alors la première servira à l'affichage, La seconde c'est le temps que DisplayName sera afficher à l'écran, et la dernière c'est pour ne pas lancer 45 affichage en même temps ;)



Donc retournons dans notre méthode DisplayCity on va fixer nos variables :
 

public void DisplayCity(String Nomdelaville){this.DisplayName = Nomdelaville;this.DisplayNameTimer = 60;this.isDisplay = true;}

Une fois nos variables on va les exploiter donc on se rend dans la méthode suivante

public void renderGameOverlay(float par1, boolean par2, int par3, int par4){//Code[...]}

Et on va ajouter une condition pour afficher notre ville.
Donc pour sa on va se servir du Timer qu'on a défini juste avant.

if (this.DisplayNameTimer > 0){this.mc.mcProfiler.startSection("overlayMessage");var33 = (float)this.DisplayNameTimer - par1;var12 = (int)(var33 * 256.0F / 20.0F);if (var12 > 255){var12 = 255;}if (var12 > 0){GL11.glPushMatrix();GL11.glTranslatef((float)(var6 / 2), (float)(var7 - 48), 0.0F);GL11.glEnable(GL11.GL_BLEND);GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);var13 = 16777215;var8.drawString(this.DisplayName, -var8.getStringWidth(this.DisplayName) / 2, -4, var13 + (var12 << 24));GL11.glDisable(GL11.GL_BLEND);GL11.glPopMatrix();}this.mc.mcProfiler.endSection();}

Voilà ...
Non je vous rassure ce bout de code je l'ai pas inventer je l'ai pris sur celui du CD et je l'ai légèrement modifier.
Bref on peut constater que sa donne un truc comme ça :

Tuto%20Worldguard%203.png

Un texte qui ne pars jamais et qui s'affiche en bas ...
Alors déjà on va régler la position ! Vous voyez cette ligne :
 

var8.drawString(this.DisplayName, -var8.getStringWidth(this.DisplayName) / 2, -4, var13 + (var12 << 24));

Et bien ici :

  • -var8.getStringWidth(this.DisplayName) / 2 gère la position des x
  • -4 gère la position des y

Donc avec ceci :

var8.drawString(this.DisplayName, -var8.getStringWidth(this.DisplayName) / 2, -120, var13 + (var12 << 24));

J'ai ce résultat là
Tuto%20Worldguard%204.png

Maintenant il faut décrémenter le timer pour ne pas afficher en permanence le méssage de la ville
Donc on se rend dans la méthode updateTick() et on ajoute simplement notre condition
 

if (this.DisplayNameTimer > 0){--this.DisplayNameTimer;}

Et voila le résultat finale :

Finale.gif

Et voici une vidéo qui vous montre le résultat avec la musique :Lien de la vidéo


 

V) J'ai rien compris

Il n'y a pas le tuto complet mais vous avez le début ici mais bon sa revient à la même chose au finale
 



 

Hum voila je pense avoir tout dit !

Excusez moi encore pour les fautes bref si vous avez des questions n’hésitez pas

Splliter



Je n'autorise pas la publication de se tuto sur d'autre forum sans mon autorisation préalable

9 personnes aiment ça

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut,

Spliter excellent tutoriel ! C'est bien pratique et surtout bien expliquer. Merci pour le partage

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci Splliter pour ce zolie tutoriel écrit et vidéoludique ! <3

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour, d'abord, je tenais a te remercier pour ce tutoriel :D

EDIT: j'ai rien dit, c'était mon pc qui buggait O_o désolé du dérengement :oops:

Partager ce message


Lien à poster
Partager sur d’autres sites

Put*** de bon tuto :D Faut que je me mette au Java un jour...

Partager ce message


Lien à poster
Partager sur d’autres sites

Super tuto ! Bien expliqué, illustré et super utile ! Je pense qu'il servira à plus d'un ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

Bon tuto, merci Splliter ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci pour le tuto ! Mais le grande code à mettre dans GuiInGame ne fonctionne pas (bourré d'erreurs) ou alors je ne l'ai pas bien mit, help svp !

Et au fait j'ai pas bien compris au fallait placer le dernier bout de code

Partager ce message


Lien à poster
Partager sur d’autres sites

On peut donner des pistes pour le souci de Linkeric ? Les variables varXX ne sont plus utilisés et je ne trouve pas leurs remplaçants :/

Partager ce message


Lien à poster
Partager sur d’autres sites

Met le code à la fin de la méthode

1 personne aime ça

Partager ce message


Lien à poster
Partager sur d’autres sites

Génial ! Bravo Splitter :)

1 personne aime ça

Partager ce message


Lien à poster
Partager sur d’autres sites

Le problème ne vient pas de ce tuto je pense ...

Partager ce message


Lien à poster
Partager sur d’autres sites

AH. C'est vrai que j'ai fais des modifs qui ne fonctionnaient pas mais j'ai pas essayé de me connecter au serveur lorsque je les ai faites .... Bizarre . Je remets tout a 0.

C'est curieux , J'ai tout remis a 0 , j'ai meme refais la décompilation et je ne peux pas me connecter a mon serveur via eclipse. J'ai fait aucune modification et toujours bad login. Tant pis , je prends le risque de tout recompiler . On verra bien si ca va fonctionner ...

Probleme réglé c'est en fait a partir d'éclipse que l'on ne peut pas se connecter sur un serveur autre que local ...

Partager ce message


Lien à poster
Partager sur d’autres sites

Ca marche niquel ! Mais j'ai un soucis :P. Quand je passe en gamemode ou qu'il y a une personne qui parle ou autre ( j'ai pas tout vu encore je pense ) j'ai le message " Ville de maville " . Est-ce normal ? C'est un peu chiant qu'il apparaisse tout le temps ^^. Des qu'une personne parle je l'ai ...

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui c'est tout à fait normal ! Analysons ta condition ensemble

 public void handleChat(Packet3Chat par1Packet3Chat)
{
if (par1Packet3Chat.message.startsWith("\u00A7b ** Bienvenue à bananaland"))
{
}
else
this.mc.ingameGUI.getChatGUI().printChatMessage(par1Packet3Chat.message);
mc.ingameGUI.DisplayCity("Ville de bananaland");
}

Ici tu nous dit que dés qu'on reçoit le méssage Bienvenenue à Bananaland alors on ne fait rien en revanche pour tous les autres méssages on envoie le méssage reçu dans le tchat et en plus on affiche le méssage au milieu de l'écran Ville de Bananaland ;)

Le code aurait du être celui ci

 public void handleChat(Packet3Chat par1Packet3Chat)
{
if (par1Packet3Chat.message.startsWith("\u00A7b ** Bienvenue à bananaland"))
{
mc.ingameGUI.DisplayCity("Ville de bananaland");
}
else
this.mc.ingameGUI.getChatGUI().printChatMessage(par1Packet3Chat.message);

}

Partager ce message


Lien à poster
Partager sur d’autres sites

Je vais essayer ça de suite et je te tiens au courant. Quoi qu'il en soit, merci pour ton aide précieuse ! :)

Edit : Ca marche parfaitement ! Merci beaucoup ! :)

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour, Bonsoir, tout d'abord très bon tutoriel comme d'habitude mais je rencontre plusieurs problème.

Lors de l'application je n'ai aucune erreur, mais en jeu un problème persiste

-Edit : la musique s'enclenche quand je met le fichier de musique manuellement dans les ressources.

Pour la musique c'est peut être à cause du faite que j'utilise DropBox, sinon lors de la récuperation du Ressources.XML ece normale que j'obtiens des balises /Error

ps: pour le ressources.XML enfaite sur le site s3.... il me dise que l'accès est refusé

This XML file does not appear to have any style information associated with it. The document tree is shown below.
<Error>
<Code>AllAccessDisabled</Code>
<Message>All access to this object has been disabled</Message>
<RequestId>F7A031CCA9B2F2C4</RequestId>
<HostId>
lp1qMnh4WQQSZKbLXhFdtot/2lE00BIN4Gh6Il+tfCT9fDyFA9TubWMpKxaNrXSw
</HostId>
</Error>

Voici les différents Codes :

Pour les musiques quand j'avais mis pour le téléchargement FTP j'avais eu une erreur à

this.mc.getLogAgent()

Que j'ai remplacé par

System.out.println 

Ressource.XML :

<Error>
<Code>SlowDown</Code>
<Message>Please reduce your request rate.</Message>
<RequestId>924C4F0E918B344F</RequestId>
<HostId>
vzQjiGch9dnVo87d0MCaGqQQsU1p7J0EdobmohM7Hb0QyFxmiV40Amld8WXFatj5
</HostId>
<Contents>
<Key>sound3/random/thorvir.ogg</Key>
<LastModified>2010-10-30T19:51:26.000Z</LastModified>
<ETag>"52c70f93d5d1aeffb34bea023b78f20f"</ETag>
<Size>2661342</Size>
<StorageClass>STANDARD</StorageClass>
</Contents>
</Error>

Ps: Pour la musique c'est géniale mais il y a pas moyen de faire pour que quand ont quitte la zone la musique s'arrête car la même dans le menu ou quand ont coupe le son / musique, la chanson continue encore.

Si il manque des codes n’hésitez pas à me le dire je ferais en sorte de les rajouter.

Voila, un grand merci à la personne qui poura peut être m'aider à résoudre ses problèmes.

Cordialement et Cubiquement KinderrKill

Partager ce message


Lien à poster
Partager sur d’autres sites

Alors tu as un problème de xml je pense vas faire un tour sur ce tuto http://www.bukkit.fr/index.php?threads/1-3-2-%C3%A0-1-5-1-ajoutez-des-nouveaux-son.4257/

et pour arreter la musique c'est très simple tu n'as qu'as mettre un flag farewell sur ta région et tu réutilise la même méthode sauf que cette fois tu baisse le volume de la musique ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

Justement j'allais éditer le message j'ai mis un farewell et j'ai utiliser la même méthode sauf que maintenant le texte s'affiche au milieux de l'écran mais aussi dans le chat alors j'ai remis un else avant et après la fonction

if (par1Packet3Chat.message.startsWith("\u00A7b ** Royaume de Thorvir"))

{

mc.sndManager.playSoundFX("random.thorvir", 1.0F, 1.0F);
mc.ingameGUI.DisplayCity("\u00A7b Royaume de Thorvir");

}

else

this.mc.ingameGUI.getChatGUI().printChatMessage(par1Packet3Chat.message);


if (par1Packet3Chat.message.startsWith("\u00A7b ** Vous quittez le Royaume de Thorvir"))

{

mc.sndManager.stopAllSounds();
mc.ingameGUI.DisplayCity("\u00A7b Vous quittez le Royaume de Thorvir");

}

else

this.mc.ingameGUI.getChatGUI().printChatMessage(par1Packet3Chat.message);

Mais le son continue encore, pouvez vous me donner la fonction qui permet de réduire le volume SVP ?

Pour les musiques en ayant bien changé le ressources.XML, elle ne se télécharge toujours pas, serais-ce la cause de DropBox ?

Un autre problème je sais pas si ça viens de l'affichage du chat mais maintenant j'ai tout qui se triple voir quadruple dans le chat

1372078330-2013-06-24-14-49-34.png

Merci d'avance.

PS: pour le XML, le site hier devais avoir un problème car j'avais acces denied alors que la j'ai pu sans problème récupérer le code.

Partager ce message


Lien à poster
Partager sur d’autres sites

Il faut que tu transforme ton second else en "else if"

edit : Envoie ton threadDownloadRessource.java

Partager ce message


Lien à poster
Partager sur d’autres sites

Voici le code

package net.minecraft.src;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import net.minecraft.client.Minecraft;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;


public class ThreadDownloadResources extends Thread
{
/** The folder to store the resources in. */
public File resourcesFolder;

/** A reference to the Minecraft object. */
private Minecraft mc;

/** Set to true when Minecraft is closing down. */
private boolean closing = false;

public ThreadDownloadResources(File par1File, Minecraft par2Minecraft)
{
this.mc = par2Minecraft;
this.setName("Resource download thread");
this.setDaemon(true);
this.resourcesFolder = new File(par1File, "resources/"); // DOSSIER DE VOS RESSOURCES

if (!this.resourcesFolder.exists() && !this.resourcesFolder.mkdirs())
{
throw new RuntimeException("The working directory could not be created: " + this.resourcesFolder);
}
}

public void run()
{
try
{
URL var1 = new URL("https://dl.dropboxusercontent.com/u/99494170/Ressources/"); // LIEN DE VOS RESSOURCES
DocumentBuilderFactory var2 = DocumentBuilderFactory.newInstance();
DocumentBuilder var3 = var2.newDocumentBuilder();
Document var4 = var3.parse(var1.openStream());
NodeList var5 = var4.getElementsByTagName("Contents");

for (int var6 = 0; var6 < 2; ++var6)
{
for (int var7 = 0; var7 < var5.getLength(); ++var7)
{
Node var8 = var5.item(var7);

if (var8.getNodeType() == 1)
{
Element var9 = (Element)var8;
String var10 = var9.getElementsByTagName("Key").item(0).getChildNodes().item(0).getNodeValue();
long var11 = Long.parseLong(var9.getElementsByTagName("Size").item(0).getChildNodes().item(0).getNodeValue());

if (var11 > 0L)
{
this.downloadAndInstallResource(var1, var10, var11, var6);

if (this.closing)
{
return;
}
}
}
}
}
}
catch (Exception var13)
{
this.loadResource(this.resourcesFolder, "");
var13.printStackTrace();
}
}

/**
* Reloads the resource folder and passes the resources to Minecraft to install.
*/
public void reloadResources()
{
this.loadResource(this.resourcesFolder, "");
}

/**
* Loads a resource and passes it to Minecraft to install.
*/
private void loadResource(File par1File, String par2Str)
{
File[] var3 = par1File.listFiles();

for (int var4 = 0; var4 < var3.length; ++var4)
{
if (var3[var4].isDirectory())
{
this.loadResource(var3[var4], par2Str + var3[var4].getName() + "/");
}
else
{
try
{
this.mc.installResource(par2Str + var3[var4].getName(), var3[var4]);
}
catch (Exception var6)
{
System.out.println("Failed to add " + par2Str + var3[var4].getName() + " in resources");
}
}
}
}

/**
* Downloads the resource and saves it to disk then installs it.
*/
private void downloadAndInstallResource(URL par1URL, String par2Str, long par3, int par5)
{
try
{
int var6 = par2Str.indexOf("/");
String var7 = par2Str.substring(0, var6);

if (var7.equalsIgnoreCase("sound3"))
{
if (par5 != 0)
{
return;
}
}
else if (par5 != 1)
{
return;
}

File var8 = new File(this.resourcesFolder, par2Str);

if (!var8.exists() || var8.length() != par3)
{
var8.getParentFile().mkdirs();
String var9 = par2Str.replaceAll(" ", "%20");
this.downloadResource(new URL(par1URL, var9), var8, par3);

if (this.closing)
{
return;
}
}

this.mc.installResource(par2Str, var8);
}
catch (Exception var10)
{
var10.printStackTrace();
}
}

/**
* Downloads the resource and saves it to disk.
*/
private void downloadResource(URL par1URL, File par2File, long par3) throws IOException
{
byte[] var5 = new byte[4096];
DataInputStream var6 = new DataInputStream(par1URL.openStream());
(J'ai un point d'exclamation pour la var7 "var7 is never close") DataOutputStream var7 = new DataOutputStream(new FileOutputStream(par2File));
boolean var8 = false;

do
{
int var9;

if ((var9 = var6.read(var5)) < 0)
{
var6.close();
var7.close();
return;
}

var7.write(var5, 0, var9);
}
while (!this.closing);
}

/**
* Called when Minecraft is closing down.
*/
public void closeMinecraft()
{
this.closing = true;
}
}

Pour le NetClientHandler au lieu que ça quadruple les lignes maintenant avec les else if, ça double en 3 fois.

voici le code

   public void handleChat(Packet3Chat par1Packet3Chat)
{

if (par1Packet3Chat.message.startsWith("\u00A7b ** Royaume de Thorvir"))

{

mc.sndManager.playSoundFX("random.thorvir", 1.0F, 1.0F);
mc.ingameGUI.DisplayCity("\u00A7b Royaume de Thorvir");

}


else if (par1Packet3Chat.message.startsWith("\u00A7b ** Vous quittez le Royaume de Thorvir"))

{

mc.sndManager.pauseAllSounds();
mc.ingameGUI.DisplayCity("\u00A7b Vous quittez le Royaume de Thorvir");

}

else

this.mc.ingameGUI.getChatGUI().printChatMessage(par1Packet3Chat.message);


if (par1Packet3Chat.message.startsWith("\u00A7b ** Bienvenue à Kynareth"))

{

mc.sndManager.playSoundFX("random.kynareth", 1.0F, 1.0F);
mc.ingameGUI.DisplayCity("\u00A7b Bienvenue à Kynareth");

}

else if (par1Packet3Chat.message.startsWith("\u00A7b ** Vous quittez Kynareth"))

{

mc.sndManager.pauseAllSounds();
mc.ingameGUI.DisplayCity("\u00A7b Vous quittez Kynareth");

}

else

this.mc.ingameGUI.getChatGUI().printChatMessage(par1Packet3Chat.message);


if (par1Packet3Chat.message.startsWith("\u00A7b ** Bienvenue à l'auberge de PraNoJe"))


{

mc.sndManager.playSoundFX("random.auberge", 1.0F, 1.0F);
mc.ingameGUI.DisplayCity("\u00A7b Bienvenue à l'auberge de PraNoJe");

}
else if (par1Packet3Chat.message.startsWith("\u00A7b ** Vous quittez l'auberge"))

{

mc.sndManager.pauseAllSounds();
mc.ingameGUI.DisplayCity("\u00A7b Vous quittez l'auberge");

}



else

this.mc.ingameGUI.getChatGUI().printChatMessage(par1Packet3Chat.message);



}
}

Merci du temps que vous m'accorder pour résoudre ce fâcheux problème, au passage vous avez des idées pour le duplications des textes dans le chat ?

Partager ce message


Lien à poster
Partager sur d’autres sites
Invité
Ce sujet ne peut plus recevoir de nouvelles réponses.

  • En ligne récemment   0 membre est en ligne

    Aucun utilisateur enregistré regarde cette page.