Résolu Problème update gui + ExtProp synchro serveur exception
-
Salut !
J’ai un problème, mon gui ne semble pas faire appel à mes méthodes tickées, telles que drawScreen ou encore updateScreen. Et j’ai l’impression que ça vient du Side depuis lequel j’ouvre mon gui, pourtant je suis Client side only, ce qui est bizarre. Bref je vais vous montrer mon code, vous y verrez plus clair ^^’
Mon event handler (oui, car il faut savoir que j’ouvre mon gui quand un joueur se connecte à un serveur) :public class JoinEntityHandler { @SubscribeEvent public void onPlayerEnteredInWorld(EntityJoinWorldEvent event) { if(event.entity instanceof EntityPlayer && event.world.isRemote && Minecraft.getMinecraft().func_147104_D() != null) { Minecraft.getMinecraft().displayGuiScreen(new GuiCatalog(Minecraft.getMinecraft().func_147104_D().serverIP)); System.out.println("ouvert 1"); } } }
Et mon gui qui n’est pas très bien organisé et qui comporte encore des bizarreries ^^’ (tel que la variable serverIp, mais je m’en servirais une fois ce post résolu) :
public class GuiCatalog extends GuiScreen { private String serverIp; int xSize = 1127; int ySize = 797; private static ResourceLocation catalogue1 = new ResourceLocation(CatalogMod.MODID, "textures/gui/background.png"); // private static ResourceLocation catalogue2 = new ResourceLocation("textures/gui/skillpvp/catalogue2.png"); // private static ResourceLocation catalogue3 = new ResourceLocation("textures/gui/skillpvp/catalogue3.png"); // private static ResourceLocation catalogue4 = new ResourceLocation("textures/gui/skillpvp/catalogue4.png"); public GuiCatalog(String serverIP2) { serverIP2 = this.serverIp; } public GuiCatalog() { } @Override public void initGui() { super.initGui(); System.out.println("ouvert 2"); this.buttonList.clear(); } @Override public void drawScreen(int par1, int par2, float par3) { // this.drawCorrespondingBackground(); this.drawDefaultBackground(); this.drawTexturedModalRect(0, 0, 0, 0, this.xSize, this.ySize); System.out.println("ouvert 3"); super.drawScreen(par1, par2, par3); } @Override public void updateScreen() { super.updateScreen(); System.out.println("coucou à répétition ?"); } public void drawCorrespondingBackground() { super.drawDefaultBackground(); this.drawGradientRect(0, 0, this.width, this.height, -1072689136, -804253680); GL11.glViewport(0, 0, 256, 256); //this.mc.getTextureManager().bindTexture(catalogue1); GL11.glDisable(GL11.GL_TEXTURE_2D); GL11.glEnable(GL11.GL_TEXTURE_2D); GL11.glViewport((int) (this.mc.displayHeight / 2.85), (int) (this.mc.displayWidth / 7.25), (int) (this.mc.displayWidth / 1.75), (int) (this.mc.displayHeight / 1.75)); Tessellator tessellator = Tessellator.instance; tessellator.startDrawingQuads(); GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR); tessellator.setColorRGBA_F(1.0F, 1.0F, 1.0F, 1.0F); int k = this.width; int l = this.height; tessellator.addVertexWithUV(0, 0, this.zLevel, 0, 0); tessellator.addVertexWithUV(0, l, this.zLevel, 0, 1); tessellator.addVertexWithUV(k, l, this.zLevel, 1, 1); tessellator.addVertexWithUV(k, 0, this.zLevel, 1, 0); tessellator.draw(); } public void drawTexturedModalRectHd(int p_73729_1_, int p_73729_2_, int p_73729_3_, int p_73729_4_, int p_73729_5_, int p_73729_6_) { float fx = (float)1/xSize; float fy = (float)1/ySize; Tessellator tessellator = Tessellator.instance; tessellator.startDrawingQuads(); tessellator.addVertexWithUV((double)(p_73729_1_ + 0), (double)(p_73729_2_ + p_73729_6_), (double)this.zLevel, (double)((float)(p_73729_3_ + 0) * fx), (double)((float)(p_73729_4_ + p_73729_6_) * fy)); tessellator.addVertexWithUV((double)(p_73729_1_ + p_73729_5_), (double)(p_73729_2_ + p_73729_6_), (double)this.zLevel, (double)((float)(p_73729_3_ + p_73729_5_) * fx), (double)((float)(p_73729_4_ + p_73729_6_) * fy)); tessellator.addVertexWithUV((double)(p_73729_1_ + p_73729_5_), (double)(p_73729_2_ + 0), (double)this.zLevel, (double)((float)(p_73729_3_ + p_73729_5_) * fx), (double)((float)(p_73729_4_ + 0) * fy)); tessellator.addVertexWithUV((double)(p_73729_1_ + 0), (double)(p_73729_2_ + 0), (double)this.zLevel, (double)((float)(p_73729_3_ + 0) * fx), (double)((float)(p_73729_4_ + 0) * fy)); tessellator.draw(); } }
Comme vous pouvez le voir, j’ai un peu débuggué ! Mais une fois arrivé en solo les seuls messages apparaissant sont le “ouvert 1” et “ouvert 2”. Mes méthodes updateScreen et drawScreen ne sont point appelés ! Cependant si j’enlève ma condition world.isRemote de la méthode de mon Event Handler, je n’obtiens qu’un seul message en + qu’avant : “coucou à répétition ?”. Autre précision, quand j’arrive en jeu, mon jeu n’affiche aucune image. A ce propos j’ai modifié la méthode drawTexturedModalRect afin de pouvoir afficher des images plus grandes que 256x256. Je n’ai donc pas pu encore testé ce code
En tout cas je vous remercie d’avance -
Sur NHG pour afficher le menu de sélection du kit on passe par TickEvent.ClientTickEvent.
Si Minecraft.getMinecraft().currentScreen est null est que le kit est null on ouvre le Gui de sélection.Je te conseil de faire quelque chose de similaire.
-
Ok merci de ta réponse, je vais essayer dans la soirée. Mais j’aurai aimé comprendre pourquoi ce code là qui me paraît + que basique, ne marche pas ?? J’aurai fait une erreur tout bête quelque part
-
Aucune idée
Essayes de print currentScreen dans un event de tick. -
Ok y’a du mieux
Mon gui est ouvert mais ressemble à ça !!!
Mon code de l’event que j’ai bien enregistré client side onlyprivate GuiCatalog gui = null; @SubscribeEvent public void onPlayerEnteredInWorld(TickEvent.ClientTickEvent event) { if(Minecraft.getMinecraft().theWorld != null) { if(event.phase == TickEvent.Phase.END) { if(Minecraft.getMinecraft().currentScreen == null && this.gui == null) { System.out.println(this.gui == null); Minecraft.getMinecraft().displayGuiScreen(gui = new GuiCatalog(" ")); System.out.println(this.gui == null); } } } }
Merci encore
EDIT = Après un petit débug, j’ai remarqué que ça venait de ma ligne drawTexturedModalRect. Je corrige et si je rencontre un problème je reviens
Par-contre j’ai encore un autre problème, voici mon image originale :
(Les vraies dimensions ne sont pas 800x500 mais 1127x797)Or la méthode ne semble pas fonctionner, puisque voici mon résultat en jeu :
Qu’ai-je loupé ? Je ne comprends qu’à moitié la méthode drawTexturedModalRect avec les 4 vecteurs, donc je ne saurai me débrouiller seul ^^’
Après pensez-vous qu’un glScale pourrait résoudre l’affaire ??? -
UP pour mon problème d’image mal dimensionnée à afficher et aussi question, je souhaiterai que ce gui ne s’affiche qu’une seule fois par joueur. A chaque fois que mon mod est load, mon instance du GuiCatalog va redevenir nulle je me trompe ? Donc il faudrait que je passe par un boolean stocké dans les tags du joueur ou y’a + simple ? Passer par un simple fichier texte local dans le mod mais faudrait juste que le joueur n’y touche pas ^^’
J’ai ce code là mais ce n’est pas forcément le meilleur rendu puisque j’ai dû descendre les dimensions de mon image à 512x512 et voici désormais l
-
Les textures de Minecraft doivent toujours avoir un double de deux.
Fait une texture de 1024*512 même si tu n’utilise pas toute la texture.Et oui passe par un tag nbt.
-
Ok j’oublie souvent ce détail
Merci de me l’avoir rappelé
Et encore autre chose, j’ai toujours du mal avec les ExtProp et les packets, je souhaiterai checker si un boolean est false, dans quel cas j’ouvrirai mon gui dans mon event ClientTickEvent mais j’obtiens ce crash report sur serveur :[22:37:05] [Server thread/ERROR] [FML]: SimpleChannelHandlerWrapper exception java.lang.RuntimeException: Missing at cpw.mods.fml.server.FMLServerHandler.getClientToServerNetworkManager(FMLServerHandler.java:238) ~[FMLServerHandler.class:?] at cpw.mods.fml.common.FMLCommonHandler.getClientToServerNetworkManager(FMLCommonHandler.java:530) ~[FMLCommonHandler.class:?] at cpw.mods.fml.common.network.FMLOutboundHandler$OutboundTarget$8.selectNetworks(FMLOutboundHandler.java:225) ~[FMLOutboundHandler$OutboundTarget$8.class:?] at cpw.mods.fml.common.network.FMLOutboundHandler.write(FMLOutboundHandler.java:273) ~[FMLOutboundHandler.class:?] at io.netty.channel.DefaultChannelHandlerContext.invokeWrite(DefaultChannelHandlerContext.java:644) ~[DefaultChannelHandlerContext.class:?] at io.netty.channel.DefaultChannelHandlerContext.write(DefaultChannelHandlerContext.java:698) ~[DefaultChannelHandlerContext.class:?] at io.netty.channel.DefaultChannelHandlerContext.write(DefaultChannelHandlerContext.java:637) ~[DefaultChannelHandlerContext.class:?] at io.netty.handler.codec.MessageToMessageEncoder.write(MessageToMessageEncoder.java:115) ~[MessageToMessageEncoder.class:?] at io.netty.handler.codec.MessageToMessageCodec.write(MessageToMessageCodec.java:116) ~[MessageToMessageCodec.class:?] at io.netty.channel.DefaultChannelHandlerContext.invokeWrite(DefaultChannelHandlerContext.java:644) ~[DefaultChannelHandlerContext.class:?] at io.netty.channel.DefaultChannelHandlerContext.write(DefaultChannelHandlerContext.java:698) ~[DefaultChannelHandlerContext.class:?] at io.netty.channel.DefaultChannelHandlerContext.writeAndFlush(DefaultChannelHandlerContext.java:688) ~[DefaultChannelHandlerContext.class:?] at io.netty.channel.DefaultChannelHandlerContext.writeAndFlush(DefaultChannelHandlerContext.java:717) ~[DefaultChannelHandlerContext.class:?] at io.netty.channel.DefaultChannelPipeline.writeAndFlush(DefaultChannelPipeline.java:893) ~[DefaultChannelPipeline.class:?] at io.netty.channel.AbstractChannel.writeAndFlush(AbstractChannel.java:239) ~[AbstractChannel.class:?] at cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper.sendToServer(SimpleNetworkWrapper.java:236) [SimpleNetworkWrapper.class:?] at fr.mrplaigon.catalog.common.extprop.ExtendedEntityPropertiesPlayer.sync(ExtendedEntityPropertiesPlayer.java:59) [ExtendedEntityPropertiesPlayer.class:?] at fr.mrplaigon.catalog.common.handler.ExtPropEventHandler.onEntityJoinWorld(ExtPropEventHandler.java:50) [ExtPropEventHandler.class:?] at cpw.mods.fml.common.eventhandler.ASMEventHandler_8_ExtPropEventHandler_onEntityJoinWorld_EntityJoinWorldEvent.invoke(.dynamic) [?:?] at cpw.mods.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:54) [ASMEventHandler.class:?] at cpw.mods.fml.common.eventhandler.EventBus.post(EventBus.java:140) [EventBus.class:?] at net.minecraft.world.World.spawnEntityInWorld(World.java:1503) [World.class:?] at net.minecraft.server.management.ServerConfigurationManager.playerLoggedIn(ServerConfigurationManager.java:322) [ServerConfigurationManager.class:?] at net.minecraft.server.management.ServerConfigurationManager.initializeConnectionToPlayer(ServerConfigurationManager.java:170) [ServerConfigurationManager.class:?] at cpw.mods.fml.common.network.handshake.NetworkDispatcher.completeServerSideConnection(NetworkDispatcher.java:190) [NetworkDispatcher.class:?] at cpw.mods.fml.common.network.handshake.NetworkDispatcher.completeHandshake(NetworkDispatcher.java:463) [NetworkDispatcher.class:?] at cpw.mods.fml.common.network.internal.HandshakeCompletionHandler.channelRead0(HandshakeCompletionHandler.java:17) [HandshakeCompletionHandler.class:?] at cpw.mods.fml.common.network.internal.HandshakeCompletionHandler.channelRead0(HandshakeCompletionHandler.java:11) [HandshakeCompletionHandler.class:?] at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:98) [SimpleChannelInboundHandler.class:?] at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337) [DefaultChannelHandlerContext.class:?] at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323) [DefaultChannelHandlerContext.class:?] at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103) [MessageToMessageDecoder.class:?] at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111) [MessageToMessageCodec.class:?] at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337) [DefaultChannelHandlerContext.class:?] at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323) [DefaultChannelHandlerContext.class:?] at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785) [DefaultChannelPipeline.class:?] at io.netty.channel.embedded.EmbeddedChannel.writeInbound(EmbeddedChannel.java:169) [EmbeddedChannel.class:?] at cpw.mods.fml.common.network.internal.FMLProxyPacket.processPacket(FMLProxyPacket.java:86) [FMLProxyPacket.class:?] at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241) [NetworkManager.class:?] at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182) [NetworkSystem.class:?] at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726) [MinecraftServer.class:?] at net.minecraft.server.dedicated.DedicatedServer.updateTimeLightAndEntities(DedicatedServer.java:349) [DedicatedServer.class:?] at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614) [MinecraftServer.class:?] at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485) [MinecraftServer.class:?] at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752) [MinecraftServer$2.class:?] [22:37:14] [Netty IO #2/ERROR] [FML]: NetworkDispatcher exception java.io.IOException: Une connexion existante a dû être fermée par l’hôte distant at sun.nio.ch.SocketDispatcher.read0(Native Method) ~[?:1.7.0_71] at sun.nio.ch.SocketDispatcher.read(Unknown Source) ~[?:1.7.0_71] at sun.nio.ch.IOUtil.readIntoNativeBuffer(Unknown Source) ~[?:1.7.0_71] at sun.nio.ch.IOUtil.read(Unknown Source) ~[?:1.7.0_71] at sun.nio.ch.SocketChannelImpl.read(Unknown Source) ~[?:1.7.0_71] at io.netty.buffer.UnpooledUnsafeDirectByteBuf.setBytes(UnpooledUnsafeDirectByteBuf.java:436) ~[UnpooledUnsafeDirectByteBuf.class:?] at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:870) ~[AbstractByteBuf.class:?] at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:208) ~[NioSocketChannel.class:?] at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:87) [AbstractNioByteChannel$NioByteUnsafe.class:?] at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:480) [NioEventLoop.class:?] at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:447) [NioEventLoop.class:?] at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:341) [NioEventLoop.class:?] at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:101) [SingleThreadEventExecutor$2.class:?]
Cependant en solo je n’ai aucun crash. Après j’ai bien enregistré mon Packet sur 2 handlers différents pour chaque side, mais à la limite le common je m’en fichais pas mal, mais si je le retire plus rien n’est détecté.
Voici mon codepublic class ExtendedEntityPropertiesPlayer implements IExtendedEntityProperties { public final static String EXT_PROP_NAME = "ExtProp" + CatalogMod.MODID; private final EntityPlayer player; public boolean catalogBackup; public ExtendedEntityPropertiesPlayer(EntityPlayer player) { this.player = player; this.catalogBackup = false; } @Override public void saveNBTData(NBTTagCompound compound) { NBTTagCompound properties = new NBTTagCompound(); properties.setBoolean("catalogBackup", this.catalogBackup); compound.setTag(EXT_PROP_NAME, properties); } @Override public void loadNBTData(NBTTagCompound compound) { NBTTagCompound properties = (NBTTagCompound) compound.getTag(EXT_PROP_NAME); this.catalogBackup = properties.getBoolean("catalogBackup"); } @Override public void init(Entity entity, World world) { } public static final void register(EntityPlayer player) { player.registerExtendedProperties(ExtendedEntityPropertiesPlayer.EXT_PROP_NAME, new ExtendedEntityPropertiesPlayer(player)); } public static final ExtendedEntityPropertiesPlayer get(EntityPlayer player) { return (ExtendedEntityPropertiesPlayer) player.getExtendedProperties(EXT_PROP_NAME); } public final void sync() { PacketCatalogBackup packet1 = new PacketCatalogBackup(this.catalogBackup); CatalogMod.network.sendToServer(packet1); if (!player.worldObj.isRemote) { EntityPlayerMP player1 = (EntityPlayerMP) player; CatalogMod.network.sendTo(packet1, player1); } } private static String getSaveKey(EntityPlayer player) { return player.getDisplayName() + ":" + EXT_PROP_NAME; } public static void saveProxyData(EntityPlayer player) { ExtendedEntityPropertiesPlayer playerData = ExtendedEntityPropertiesPlayer.get(player); NBTTagCompound savedData = new NBTTagCompound(); playerData.saveNBTData(savedData); CommonProxy.storeEntityData(getSaveKey(player), savedData); } public static void loadProxyData(EntityPlayer player) { ExtendedEntityPropertiesPlayer playerData = ExtendedEntityPropertiesPlayer.get(player); NBTTagCompound savedData = CommonProxy.getEntityData(getSaveKey(player)); if (savedData != null) { playerData.loadNBTData(savedData); } playerData.sync(); } public void setCatalogBackup(boolean flag) { this.catalogBackup = flag; this.sync(); } }
Packet :
public class PacketCatalogBackup implements IMessage { private boolean catalogBackup; public PacketCatalogBackup() { } public PacketCatalogBackup(boolean catalogBackup) { this.catalogBackup = catalogBackup; } @Override public void fromBytes(ByteBuf buf) { this.catalogBackup = buf.readBoolean(); } @Override public void toBytes(ByteBuf buf) { buf.writeBoolean(catalogBackup); } public static class ClientHandler implements IMessageHandler <packetcatalogbackup, imessage="">{ @Override @SideOnly(Side.CLIENT) public IMessage onMessage(PacketCatalogBackup message, MessageContext ctx) { EntityPlayer player = Minecraft.getMinecraft().thePlayer; ExtendedEntityPropertiesPlayer props = ExtendedEntityPropertiesPlayer.get(player); props.catalogBackup = message.catalogBackup; return null; } } public static class CommonHandler implements IMessageHandler <packetcatalogbackup, imessage="">{ @Override public IMessage onMessage(PacketCatalogBackup message, MessageContext ctx) { EntityPlayerMP player = ctx.getServerHandler().playerEntity; ExtendedEntityPropertiesPlayer props = ExtendedEntityPropertiesPlayer.get(player); props.catalogBackup = message.catalogBackup; return null; } } }
Et mes events au cas où
public class ExtPropEventHandler { private CommonProxy commonProxy = new CommonProxy(); @SubscribeEvent public void onEntityConstructing(EntityConstructing event) { if (event.entity instanceof EntityPlayer && ExtendedEntityPropertiesPlayer.get((EntityPlayer) event.entity) == null) ExtendedEntityPropertiesPlayer.register((EntityPlayer) event.entity); } @SubscribeEvent public void onLivingDeathEvent(LivingDeathEvent event) { if (!event.entity.worldObj.isRemote && event.entity instanceof EntityPlayer) { NBTTagCompound playerData = new NBTTagCompound(); ((ExtendedEntityPropertiesPlayer) (event.entity.getExtendedProperties(ExtendedEntityPropertiesPlayer.EXT_PROP_NAME))).saveNBTData(playerData); commonProxy.storeEntityData(((EntityPlayer) event.entity).getDisplayName(), playerData); ExtendedEntityPropertiesPlayer.saveProxyData((EntityPlayer) event.entity); } else { } } @SubscribeEvent public void onEntityJoinWorld(EntityJoinWorldEvent event) { if (!event.entity.worldObj.isRemote && event.entity instanceof EntityPlayer) { NBTTagCompound playerData = commonProxy .getEntityData(((EntityPlayer) event.entity) .getDisplayName()); if (playerData != null) { ((ExtendedEntityPropertiesPlayer) (event.entity.getExtendedProperties(ExtendedEntityPropertiesPlayer.EXT_PROP_NAME))).loadNBTData(playerData); } ((ExtendedEntityPropertiesPlayer) (event.entity.getExtendedProperties(ExtendedEntityPropertiesPlayer.EXT_PROP_NAME))).sync(); } } }
Voilà 1 prob de + ^^’
Je sais que le post d’origine n’a rien à voir avec ces ExtProp mais je modifie le titre de manière à ce que tout le monde soit informé de la modif
Merci d’avance</packetcatalogbackup,></packetcatalogbackup,> -
As-tu enregistré le paquet des 2 côtés ?
-
Oui bien évidemment
network.registerMessage(PacketCatalogBackup.ClientHandler.class, PacketCatalogBackup.class, 0, Side.CLIENT);
network.registerMessage(PacketCatalogBackup.CommonHandler.class, PacketCatalogBackup.class, 1, Side.SERVER); -
Tu essayes d’envoyer un paquet au serveur alors que tu es déjà côté serveur.
-
Pas compris où ? Dans ma méthode sync ? Faut que je retire le sendToServer ?
-
Aucune idée d’où, le rapport de crash ne l’indique pas
ÉDIT : en effet dans la fonction sync, il faudrait le mettre dans un else après le if(!world.isRemote).
-
Nikel! Sa marche bien
Merci encore une fois !