26 oct. 2016, 18:38

@‘robin4002’:

Je viens de faire quelque vérification, PlayerEvent.NameFormat est un event commun (client et serveur) donc ce que tu as fait actuellement ne risque pas de fonctionner.

Il faudrait plutôt :

  • garder dans une variable client le pseudo changé et l’envoyer au serveur lors de la connexion (voir simplement proposer le changement de pseudo uniquement si on est sur le serveur et l’envoyer directement).
  • sauvegarder côté serveur le pseudo dans une map de joueur + l’enregistrer dans le monde ou enregistrer directement dans le nbt du joueur (pas besoin de map alors)
  • envoyer également au client son pseudo custom lors de la connexion.

Je vais faire comme tu as dis ça a l’air plus simple. “(voir simplement proposer le changement de pseudo uniquement si on est sur le serveur et l’envoyer directement)”
Donc j’ouvre mon gui quand je me connecte.
Une fois ouvert je choisis mon nom puis prénom, je valide…
J’envois donc un packet au serveur contenant deux string, L’UUID et le nom et le prénom espacé d’un tiré du 8 (Nom + “_” + Prénom)
Dans ce packet j’ajoute tout ça dans une hashmap qui se situe dans le ServerProxy.
L’event NameFormat récupére donc le nom et prénom du joueur via la hashmap
et j’ai pas fais le reste…

Je crash au moment de validé mon nom prénom. (au moment ou j’envois ça au serveur avec le packet)

Je vous passe mon gui et mon packet:

GUI:


package com.CSC.net.GUI;

import java.io.IOException;

import com.CSC.net.Main;
import com.CSC.net.packet.PacketNameServer;
import com.CSC.net.proxy.ServerProxy;

import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.GuiSelectWorld;
import net.minecraft.client.gui.GuiTextField;
import net.minecraft.util.EnumChatFormatting;

public class GuiJoinServer extends GuiScreen
{
private static boolean erreur;

public static boolean b;

private int valider;

private int nom;

private int prenom;

public static GuiTextField text;

public static GuiTextField text2;

public GuiJoinServer() {

}

@Override
public void initGui() {

valider = 0;

nom = 1;

prenom = 2;

text = new GuiTextField(nom, fontRendererObj, width / 2, 130, 64,
20);

text2 = new GuiTextField(prenom, fontRendererObj, width / 2, 100, 64,
20);

text.setFocused(false);

text2.setFocused(true);

text.setMaxStringLength(20);

text2.setMaxStringLength(20);

this.buttonList.add(new GuiButton(valider, width / 2 - 123, 200, 40,
20, "Valider"));

super.initGui();
}

@Override
public void mouseClicked (int i , int j, int k) { 
text.mouseClicked (i, j, k); 
text2.mouseClicked (i, j, k); 
try {
super.mouseClicked (i, j, k);
} catch (IOException e) {
e.printStackTrace();
} 
} 

@Override
protected void keyTyped(char typedChar, int keyCode) throws IOException {

text.textboxKeyTyped(typedChar, keyCode);
text2.textboxKeyTyped(typedChar, keyCode);
super.keyTyped(typedChar, keyCode);
}

@Override
protected void actionPerformed(GuiButton button) throws IOException {

switch (button.id) {
case 0:
if (!text.getText().equals("") && text.getText().length() > 3
&& !text2.getText().equals("")
&& text2.getText().length() > 3) {
System.out.println(b);
b = false;
ServerProxy.name = text2.getText() + "_" + text.getText();
Main.network.sendToServer(new PacketNameServer(Minecraft.getMinecraft().getSession().getPlayerID(), text2.getText() + "_" + text.getText()));
System.out.println(ServerProxy.name);
erreur = false;
mc.thePlayer.closeScreen();
}
// else if(text.getText().equals("72") && !text2.getText().equals("")
// && text2.getText().length() > 3)
// {
// System.out.println(b);
// b = false;
// ServerProxy.name = text2.getText();
// Main.network.sendToServer(new PacketNameServer(Minecraft.getMinecraft().getSession().getPlayerID(), ServerProxy.name));
// System.out.println(ServerProxy.name);
// erreur = false;
// mc.thePlayer.closeScreen();
// }
// else {
// erreur = true;
// }
break;
default:
erreur = false;
break;
}

super.actionPerformed(button);
}

@Override
public void updateScreen() {
super.updateScreen();
}

public void drawScreen(int mouseX, int mouseY, float partialTick) {

this.drawDefaultBackground();

text.drawTextBox();
text2.drawTextBox();

this.drawString(this.fontRendererObj, EnumChatFormatting.GRAY +"Nom", width / 2 - 80, 135, 0);

this.drawString(this.fontRendererObj, EnumChatFormatting.GRAY + "Prénom", width / 2 - 80, 105, 0);

super.drawScreen(mouseX, mouseY, partialTick);

if (erreur) {
this.drawString(fontRendererObj,
"§cVotre nom et/ou prénom est/sont vide ou trop court !",
this.width / 2 - 110, this.height / 2 - 50, 0);
}
}

@Override
public void onGuiClosed() {

}
}

Packet:


package com.CSC.net.packet;

import com.CSC.net.proxy.ServerProxy;

import io.netty.buffer.ByteBuf;
import net.minecraftforge.fml.common.network.ByteBufUtils;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public class PacketNameServer implements IMessage{

private String string1;

private String string2;

public PacketNameServer(String s1, String s2)
{
this.string1 = s1;
this.string2 = s2;
}

public PacketNameServer()
{
}

@Override
public void fromBytes(ByteBuf buf) {
this.string1 = ByteBufUtils.readUTF8String(buf);
this.string2 = ByteBufUtils.readUTF8String(buf);
}

@Override
public void toBytes(ByteBuf buf) {
ByteBufUtils.writeUTF8String(buf, string1);
ByteBufUtils.writeUTF8String(buf, string2);
}

public static class Handler implements IMessageHandler <packetnameserver, imessage="">{
@SideOnly(Side.SERVER)
@Override
   public IMessage onMessage(PacketNameServer message, MessageContext ctx) 
   {

ServerProxy.map.put(message.string1, message.string2);

return null;

   }
}

}

Crash:


[20:25:39] [Netty Server IO #1/ERROR] [FML]: There was a critical exception handling a packet on channel csc:
java.lang.NoSuchMethodError: com.CSC.net.packet.PacketNameServer$Handler.onMessage(Lcom/CSC/net/packet/PacketNameServer;Lnet/minecraftforge/fml/common/network/simpleimpl/MessageContext;)Lnet/minecraftforge/fml/common/network/simpleimpl/IMessage;
at com.CSC.net.packet.PacketNameServer$Handler.onMessage(PacketNameServer.java:1) ~[PacketNameServer$Handler.class:?]
at net.minecraftforge.fml.common.network.simpleimpl.SimpleChannelHandlerWrapper.channelRead0(SimpleChannelHandlerWrapper.java:37) ~[SimpleChannelHandlerWrapper.class:?]
at net.minecraftforge.fml.common.network.simpleimpl.SimpleChannelHandlerWrapper.channelRead0(SimpleChannelHandlerWrapper.java:17) ~[SimpleChannelHandlerWrapper.class:?]
at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:103) ~[SimpleChannelInboundHandler.class:4.0.15.Final]
at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:338) ~[DefaultChannelHandlerContext.class:4.0.15.Final]
at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:324) ~[DefaultChannelHandlerContext.class:4.0.15.Final]
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103) ~[MessageToMessageDecoder.class:4.0.15.Final]
at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111) ~[MessageToMessageCodec.class:4.0.15.Final]
at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:338) ~[DefaultChannelHandlerContext.class:4.0.15.Final]
at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:324) ~[DefaultChannelHandlerContext.class:4.0.15.Final]
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785) ~[DefaultChannelPipeline.class:4.0.15.Final]
at io.netty.channel.embedded.EmbeddedChannel.writeInbound(EmbeddedChannel.java:169) ~[EmbeddedChannel.class:4.0.15.Final]
at net.minecraftforge.fml.common.network.internal.FMLProxyPacket.processPacket(FMLProxyPacket.java:88) [FMLProxyPacket.class:?]
at net.minecraft.network.NetworkManager.channelRead0(NetworkManager.java:144) [NetworkManager.class:?]
at net.minecraft.network.NetworkManager.channelRead0(NetworkManager.java:469) [NetworkManager.class:?]
at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:103) [SimpleChannelInboundHandler.class:4.0.15.Final]
at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:338) [DefaultChannelHandlerContext.class:4.0.15.Final]
at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:324) [DefaultChannelHandlerContext.class:4.0.15.Final]
at net.minecraftforge.fml.common.network.handshake.NetworkDispatcher.handleServerSideCustomPacket(NetworkDispatcher.java:398) [NetworkDispatcher.class:?]
at net.minecraftforge.fml.common.network.handshake.NetworkDispatcher.channelRead0(NetworkDispatcher.java:226) [NetworkDispatcher.class:?]
at net.minecraftforge.fml.common.network.handshake.NetworkDispatcher.channelRead0(NetworkDispatcher.java:49) [NetworkDispatcher.class:?]
at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:103) [SimpleChannelInboundHandler.class:4.0.15.Final]
at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:338) [DefaultChannelHandlerContext.class:4.0.15.Final]
at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:324) [DefaultChannelHandlerContext.class:4.0.15.Final]
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785) [DefaultChannelPipeline.class:4.0.15.Final]
at io.netty.channel.local.LocalChannel.finishPeerRead(LocalChannel.java:312) [LocalChannel.class:4.0.15.Final]
at io.netty.channel.local.LocalChannel.access$400(LocalChannel.java:44) [LocalChannel.class:4.0.15.Final]
at io.netty.channel.local.LocalChannel$6.run(LocalChannel.java:298) [LocalChannel$6.class:4.0.15.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:354) [SingleThreadEventExecutor.class:4.0.15.Final]
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:353) [NioEventLoop.class:4.0.15.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:101) [SingleThreadEventExecutor$2.class:4.0.15.Final]
at java.lang.Thread.run(Thread.java:745) [?:1.8.0_45]
[20:25:39] [Server thread/INFO]: floriangabet lost connection: TextComponent{text='A fatal error has occured, this connection is terminated', siblings=[], style=Style{hasParent=false, color=null, bold=null, italic=null, underlined=null, obfuscated=null, clickEvent=null, hoverEvent=null, insertion=null}}
[20:25:39] [Server thread/INFO]: floriangabet a quitté la partie
[20:25:39] [Server thread/INFO]: Stopping singleplayer server as player logged out
[20:25:39] [Server thread/INFO]: Stopping server
[20:25:39] [Server thread/INFO]: Saving players
[20:25:39] [Server thread/INFO]: Saving worlds
[20:25:39] [Server thread/INFO]: Saving chunks for level 'New World'/Overworld
[20:25:39] [Server thread/INFO]: Saving chunks for level 'New World'/Nether
[20:25:39] [Server thread/INFO]: Saving chunks for level 'New World'/The End
[20:25:40] [Server thread/INFO] [FML]: Unloading dimension 0
[20:25:40] [Server thread/INFO] [FML]: Unloading dimension -1
[20:25:40] [Server thread/INFO] [FML]: Unloading dimension 1
[20:25:40] [Server thread/INFO] [FML]: Applying holder lookups
[20:25:40] [Server thread/INFO] [FML]: Holder lookups applied

Merci :)</packetnameserver,>