[SANS SUITE] Crash Serveur
-
@‘Plaigon’:
Oui un displayGuiScreen serait nécessaire pour ce genre de problème.
Mais après l’idéal serait que tu crées un méthode de l’event OpeGuiEvent, et que si le gui dont il est question est le GuiGameOver, alors tu cancel l’event et tu ouvres le tien à la place. C’est le même procédé que pour le remplacement du menu principal, je pense que sa te n’est pas inconnu
J’ai fais Minecraft.getMinecraft.displayguiScreen j’ai toujours le meme crash je vais essayer avec le @sideonly dans la main class .
Plaigon en fait le truc c’est que je veux pas cancelled l’event guigameover je met le joueur a 0.5 cœur et je lui ouvre le gui j’ai mal copier coller mon event ^^ . -
Quand je parlait de la classe principale je parlais dem ettre un SideOnly juste avant ça public class Mort extends GuiScreen {
^^ -
@‘ErkoZ’:
Quand je parlait de la classe principale je parlais dem ettre un SideOnly juste avant ça public class Mort extends GuiScreen {
^^D’acc x) J’avais pas compris .
edit:
Pareil toujours crash
-
Et c’est toujours le même rapport de crash ? Renvoie le stp
-
Exprime toi + clairement sur ce que tu souhaites faire car à chaque poste que tu fais (et t’en fais beaucoup en plus) c’est toujours le même soucis : pas assez d’infos donc je peux pas toujours filer des réponses en or.
Si tu ne veux pas display le gui quand le joueur meurt, alors pourquoi par pitié, avoir sélectionné l’event LivingDeathEvent –’
D’autre part, si tu veux appeler la classe Minecraft dans un event both sides, alors il serait + judicieux de se mettre uniquement côté client a l’aide d’un if (event.entityLiving.worldObj.isRemote) !
-
@‘Plaigon’:
Exprime toi + clairement sur ce que tu souhaites faire car à chaque poste que tu fais (et t’en fais beaucoup en plus) c’est toujours le même soucis : pas assez d’infos donc je peux pas toujours filer des réponses en or.
Si tu ne veux pas display le gui quand le joueur meurt, alors pourquoi par pitié, avoir sélectionné l’event LivingDeathEvent –’
D’autre part, si tu veux appeler la classe Minecraft dans un event both sides, alors il serait + judicieux de se mettre uniquement côté client a l’aide d’un if (event.entityLiving.worldObj.isRemote) !
D’acc alors je m’explique !
J’ai fais une sorte de “coma” , lorsque le joueur et sur le point de mourir je lui ajoute 0.5 cœur pour pas qu’il meure.
Une fois les 0.5 cœur ajouté le gui s’ouvre avec dedans deux choix: Appeler un samu ou alors respawn .
Si il choisit d’appeler un médecin un message est envoyer dans le chat avec les coordonnées etc… pour que le médecin puisse le réanimé.
Si il choisit de respawn il meurt et respawn, c’est donc pour cela que je ne veux pas cancelled le guigameover .Tien ma classe event du coup:
@SubscribeEvent public void onDeath(LivingDeathEvent event) { if(event.entityLiving instanceof EntityPlayer) { event.entityLiving.setHealth(1); Mort.settimer(10000); Minecraft.getMinecraft().displayGuiScreen(new Mort()); }Compris ? x)
-
Okay ! Toutes ces infos, j’aurai déjà dû en être informé dès le poste initial, on aurait perdu moins de temps

Sa sert à quoi le Mort.setTimer () ? Sa définit la durée du coma ?
Et ensuite, pour la énième fois, isole côté client ton displayScreen, tu sais faire sa quand même ?!Et pour le moment qu’est ce que ce code te fait in-game ? Je pense qu’il faudrait cancel l’eveng (Si c’est possible, je ne crois pas de mémoire…) afin que le GuiGameOver n’apparaisse pas (pas tout de suite en tout cas) et pour faire rester ton personnage en jeu, afin de donner l’effet de “coma”.
-
@‘Plaigon’:
Okay ! Toutes ces infos, j’aurai déjà dû en être informé dès le poste initial, on aurait perdu moins de temps

Sa sert à quoi le Mort.setTimer () ? Sa définit la durée du coma ?
Et ensuite, pour la énième fois, isole côté client ton displayScreen, tu sais faire sa quand même ?!Et pour le moment qu’est ce que ce code te fait in-game ? Je pense qu’il faudrait cancel l’eveng (Si c’est possible, je ne crois pas de mémoire…) afin que le GuiGameOver n’apparaisse pas (pas tout de suite en tout cas) et pour faire rester ton personnage en jeu, afin de donner l’effet de “coma”.
Alors le setTimer et le cooldown pour le bouton respawn, oui je sais faire pour isoler côté client world.isremote et mon code est fonctionnel le guiGameOver n’apparait en aucun cas sauf quand je clique sur respawn ^^ j’essaye d’isoler le displayscreen je te dis si ça crash toujours

Merci en tout cas.edit: Crash.
Tien je crois que c’est le même: http://pastebin.com/UsHR5DJF -
File ton code, il peut très bien venir d’autre part…
-
Event:
@SubscribeEvent public void onDeath(LivingDeathEvent event) { if(event.entityLiving instanceof EntityPlayer) { event.entityLiving.setHealth(1); Mort.settimer(10000); if(player.worldObj.isRemote){ Minecraft.getMinecraft().displayGuiScreen(new Mort()); } }Guiscreen:
package com.DeathDelay.net.Gui; import com.DeathDelay.net.Main; import com.DeathDelay.net.packet.PacketGui; import com.DeathDelay.net.packet.PacketMedecin; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.server.MinecraftServer; import net.minecraft.util.ChatComponentText; import net.minecraft.util.ResourceLocation; public class Mort extends GuiScreen { @SideOnly(Side.CLIENT) private ResourceLocation ressource = new ResourceLocation("dd:textures/gui/death.png"); private int medecin; private int spawn; public static int timer = 10000; int guiWidth = 256; int guiHeight = 256; public Mort() { } @Override public void initGui() { int guiX = (this.width - guiWidth) / 2; int guiY = (this.height - guiHeight) / 2; medecin = 0; spawn = 1; buttonList.clear(); buttonList.add(new GuiButton(medecin, guiX + 170, guiY + 226 + 5, 58, 20, "§aAppeller un médecin")); buttonList.add(new GuiButton(spawn, guiX + 80, guiY, 120, 20, "§5Respawn possible dans")); super.initGui(); } @Override protected void keyTyped(char typedChar, int keyCode) { super.keyTyped(typedChar, keyCode); } @Override protected void actionPerformed(GuiButton button) { switch(button.id) { case 0: Main.network.sendToServer(new PacketMedecin()); break; case 1: if(timer > 0) { EntityPlayer player1 = Minecraft.getMinecraft().thePlayer; ChatComponentText text1 = new ChatComponentText("§7Vous ne pouvez pas respawn ! il vous reste: " + timer / 100 + " §7secondes"); player1.addChatComponentMessage(text1); timer –; break; } else { EntityPlayer player1 = Minecraft.getMinecraft().thePlayer; player1.setDead(); Minecraft.getMinecraft().thePlayer.closeScreen(); break; } default: break; } super.actionPerformed(button); } @Override public void updateScreen() { super.updateScreen(); } public void drawScreen(int mouseX, int mouseY, float partialTick) { String tilename = "§5 : " + timer-- / 100; mc.getTextureManager().bindTexture(ressource); this.drawTexturedModalRect(this.width / 2 - 135, this.height / 2 - 127, 0, 0, 256, 255); if(timer > 0) { this.fontRendererObj.drawString(tilename, this.width / 2 + 95 - this.fontRendererObj.getStringWidth(tilename) / 2, 1, 0); } super.drawScreen(mouseX, mouseY, partialTick); } public static void settimer(int newtimer) { timer = newtimer; } @Override public void onGuiClosed() { Main.network.sendToServer(new PacketGui()); // possible que c'est ça ? } } -
Envoies le code de ton paquet.
Et dans l’event onDeath tu dois garder le paquet.
Comme tu mets 0,5 de vie, ça doit être fait côté serveur et pas côté client. -
Le crash restant vient du Mort.setTimer.
Je t’ai dit de ne laisser aucun code ayant rapport avec ton gui, qui pourrait alors être interprété par le serveur. Donc à mettre aussi danse isRemote.
Ensuite je ne comprends pas trop @robin, si l’event LivingDeathEvent est client et server side, nullement besoin d’avoir recours au packet alors ?? -
@‘robin4002’:
Envoies le code de ton paquet.
Et dans l’event onDeath tu dois garder le paquet.
Comme tu mets 0,5 de vie, ça doit être fait côté serveur et pas côté client.Tien mon packet:
public class PacketGui implements IMessage { public int i; public PacketGui(){ } public PacketGui(int i){ this.i = i; } @Override public void fromBytes(ByteBuf buf) { i = buf.readInt(); } @Override public void toBytes(ByteBuf buf) { buf.writeInt(i); } public static class Handler implements IMessageHandler <packetgui, imessage="">{ public IMessage onMessage(PacketGui message, MessageContext ctx) { Minecraft.getMinecraft().displayGuiScreen(new Mort()); return message; } }Comment ça je dois regarder lepacket ??
Pour le 0.5 de heal je dois mettre un !world.isremote du coup?Parce que ça fait:
1. @SubscribeEvent 2. **public** **void** onDeath(LivingDeathEvent **event**) 3. { 4. **if**(**event**.entityLiving **instanceof** EntityPlayer && !world.isremote) // side serveur 5. { 6. **event**.entityLiving.setHealth(1); 7. Mort.settimer(10000); 8. } 9. **if**(player.worldObj.isRemote){ // side client 10. Minecraft.getMinecraft().displayGuiScreen(**new** Mort()); 11. } 12. }Comme ça?</packetgui,>
-
Refresh le poste et regarde mon message précédent. Tu n’as pas besoin de le mettre uniquement côté serveur le setHealth. Peu importe en fait, de toute manière il sera automatiquement synchronisé entre les DataWatchers et les NBTTag’s.
EDIT = Ta classe PacketGui ne sert à rien du tout car tu envoies ce packet au serveur avec comme instruction d’ouvrir ton gui mort. A partir de là 2 choses sont illogiques. La première est qu’on n’envoie pas un packet au serveur pour effectuer une action au client, sa n’a aucun sens. Mais pire, la seconde remarque est que tu dis dans la fonction onGuiClosed d’envoyer ce packet dans le but de….rouvrir une seconde fois le gui Mort ?! Là je ne te suis plus u_U
-
Au dessus de la fonction onMessage du paquet ajoutes un @SideOnly.
Et tu ne devrais pas l’utiliser depuis le gui comme c’est un paquet qui va du client au serveur.
@Plaigon, oui en effet, on pourrait s’en passer.
-
@‘Plaigon’:
Refresh le poste et regarde mon message précédent. Tu n’as pas besoin de le mettre uniquement côté serveur le setHealth. Peu importe en fait, de toute manière il sera automatiquement synchronisé entre les DataWatchers et les NBTTag’s.
EDIT = Ta classe PacketGui ne sert à rien du tout car tu envoies ce packet au serveur avec comme instruction d’ouvrir ton gui mort. A partir de là 2 choses sont illogiques. La première est qu’on n’envoie pas un packet au serveur pour effectuer une action au client, sa n’a aucun sens. Mais pire, la seconde remarque est que tu dis dans la fonction onGuiClosed d’envoyer ce packet dans le but de….rouvrir une seconde fois le gui Mort ?! Là je ne te suis plus u_U
Pour la fonction onGuiClosed je cherche a faire en sorte de ne pas quitter le gui même avec la touche échap .
Edit:@Robin je n’utilise plus le packet x)
Euhhh je viens d’essayer, le event.entityLiving.worldObj.isRemote cause problème, mon gui ne s’ouvre plus

-
Donc l’event n’est pas appelé côté client.
Donc tu as bien besoin du paquet.Pour le onGuiClosed, il serait mieux de contourner l’action de la touche échap (suffit d’override la méthode keyPressed et ne pas mettre un super.keyPressed dedans).
-
Euhh la vous m’avez perdu un dis que j’ai pas besoin du packet un autre dis que si …
@Plaigon j’ai essayer sans le packet le soucis est que avec world.isRemote mon gui ne s’ouvre pas .
@Robin je comprends pas trop je dois enregistrer mon packet quel side ? l’envoyer au joueur / serveur ?? dans mon event est-ce que je dois mettre un world.isremote avant l’appel du packet ?Pour l’instant j’ai ça comme code:
ça marche pas sauf quand j’enlève le if(event.entityliving.worldObj…)
@SubscribeEvent public void onDeath(LivingDeathEvent event) { if(event.entityLiving instanceof EntityPlayer) { event.entityLiving.setHealth(1); if(event.entityLiving.worldObj.isRemote){ Main.network.sendToServer(new PacketGui()); Mort.settimer(10000); System.out.println("Mort"); } } }network = NetworkRegistry.INSTANCE.newSimpleChannel("dd:"); network.registerMessage(PacketGui.Handler.class, PacketGui.class, 0, Side.CLIENT); -
Actuellement est-ce que “Mort” s’affiche dans la console ?
Car si oui alors l’event est bien appelé côté client, donc non pas besoin de paquet.Et ton paquet tel que tu l’as fait doit aller du serveur vers le client.
-
@‘robin4002’:
Actuellement est-ce que “Mort” s’affiche dans la console ?
Car si oui alors l’event est bien appelé côté client, donc non pas besoin de paquet.Et ton paquet tel que tu l’as fait doit aller du serveur vers le client.
Non, “Mort” s’affiche pas dans la console.
Du coup j’ai ça:
Event:
@SubscribeEvent public void onDeath(LivingDeathEvent event) { if(event.entityLiving instanceof EntityPlayer) { event.entityLiving.setHealth(1); if(event.entityLiving.worldObj.isRemote){ Main.network.sendToServer(new PacketGui()); Mort.settimer(10000); System.out.println("Mort"); } } }Packet:
public class PacketGui implements IMessage { public int i; public PacketGui(){ } public PacketGui(int i){ this.i = i; } @Override public void fromBytes(ByteBuf buf) { i = buf.readInt(); } @Override public void toBytes(ByteBuf buf) { buf.writeInt(i); } public static class Handler implements IMessageHandler <packetgui, imessage="">{ @SideOnly(Side.CLIENT) public IMessage onMessage(PacketGui message, MessageContext ctx) { Minecraft.getMinecraft().displayGuiScreen(new Mort()); return message; } } }Gui:
public class Mort extends GuiScreen { @SideOnly(Side.CLIENT) private ResourceLocation ressource = new ResourceLocation("dd:textures/gui/death.png"); private int medecin; private int spawn; public static int timer = 10000; int guiWidth = 256; int guiHeight = 256; public Mort() { } @Override public void initGui() { int guiX = (this.width - guiWidth) / 2; int guiY = (this.height - guiHeight) / 2; medecin = 0; spawn = 1; buttonList.clear(); buttonList.add(new GuiButton(medecin, guiX + 170, guiY + 226 + 5, 58, 20, "§aAppeller un médecin")); buttonList.add(new GuiButton(spawn, guiX + 80, guiY, 120, 20, "§5Respawn possible dans")); super.initGui(); } @Override protected void keyTyped(char typedChar, int keyCode) { } @Override protected void actionPerformed(GuiButton button) { switch(button.id) { case 0: Main.network.sendToServer(new PacketMedecin()); break; case 1: if(timer > 0) { EntityPlayer player1 = Minecraft.getMinecraft().thePlayer; ChatComponentText text1 = new ChatComponentText("§7Vous ne pouvez pas respawn ! il vous reste: " + timer / 100 + " §7secondes"); player1.addChatComponentMessage(text1); timer –; break; } else { EntityPlayer player1 = Minecraft.getMinecraft().thePlayer; player1.setDead(); Minecraft.getMinecraft().thePlayer.closeScreen(); break; } default: break; } super.actionPerformed(button); } @Override public void updateScreen() { super.updateScreen(); } public void drawScreen(int mouseX, int mouseY, float partialTick) { String tilename = "§5 : " + timer-- / 100; mc.getTextureManager().bindTexture(ressource); this.drawTexturedModalRect(this.width / 2 - 135, this.height / 2 - 127, 0, 0, 256, 255); if(timer > 0) { this.fontRendererObj.drawString(tilename, this.width / 2 + 95 - this.fontRendererObj.getStringWidth(tilename) / 2, 1, 0); } super.drawScreen(mouseX, mouseY, partialTick); } public static void settimer(int newtimer) { timer = newtimer; } @Override public void onGuiClosed() { } }Register packet:
network = NetworkRegistry.INSTANCE.newSimpleChannel("dd:"); network.registerMessage(PacketGui.Handler.class, PacketGui.class, 0, Side.SERVER);Mon gui ne s’ouvre toujours pas.</packetgui,>