Résolu Changement d'heure
-
Solution : http://www.minecraftforgefrance.fr/showthread.php?tid=391&pid=4167#pid4167
Bonjour,
Je cherche le moyen de changer d’heure en appuyant sur un button d’un GUI, mais le problème c’est je ne pas quoi mettre devant le “.setWorldTime” … J’essaie de mettre World, world etc mais rien de marche, voici la class où cela se passe :
Le .setWorldTime est dans la méthode de tout en bas.package tutoriel.common.gui; import org.lwjgl.opengl.GL11; import tutoriel.common.ModTutoriel; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.server.MinecraftServer; import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; import net.minecraft.world.WorldServer; import net.minecraftforge.event.world.WorldEvent; public class DummyGui extends GuiScreen { ResourceLocation texture = new ResourceLocation("modtutoriel", "textures/gui/background.png"); public final int xSize = 176; public final int ySize = 88; public DummyGui(EntityPlayer entityplayer) { } @Override public void drawScreen(int x, int y, float f) { drawDefaultBackground(); GL11.glColor4f(1F, 1F, 1F, 1F); Minecraft.getMinecraft().getTextureManager().bindTexture(texture); int posX = (this.width - xSize) / 2; int posY = (this.height - ySize) / 2; drawTexturedModalRect(posX, posY, 0, 0, xSize, ySize); super.drawScreen(x, y, f); } @Override public boolean doesGuiPauseGame() { return false; } public void initGui() { int posX = (this.width - xSize) / 2; int posY = (this.height - ySize) / 2; this.buttonList.add(new GuiButton(0, posX + 40, posY + 40, 100, 20, "Bonjour")); } public void actionPerformed(GuiButton button) { switch(button.id) { case 0: World.setWorldTime(0); default: } } }
Merci d’avance !
-
package tutoriel.common.gui; import org.lwjgl.opengl.GL11; import tutoriel.common.ModTutoriel; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.server.MinecraftServer; import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; import net.minecraft.world.WorldServer; import net.minecraftforge.event.world.WorldEvent; public class DummyGui extends GuiScreen { ResourceLocation texture = new ResourceLocation("modtutoriel", "textures/gui/background.png"); private World world; public final int xSize = 176; public final int ySize = 88; public DummyGui(EntityPlayer entityplayer) { this.world = entityplayer.worldObj; } @Override public void drawScreen(int x, int y, float f) { drawDefaultBackground(); GL11.glColor4f(1F, 1F, 1F, 1F); Minecraft.getMinecraft().getTextureManager().bindTexture(texture); int posX = (this.width - xSize) / 2; int posY = (this.height - ySize) / 2; drawTexturedModalRect(posX, posY, 0, 0, xSize, ySize); super.drawScreen(x, y , f); } @Override public boolean doesGuiPauseGame() { return false; } public void initGui() { int posX = (this.width - xSize) / 2; int posY = (this.height - ySize) / 2; this.buttonList.add(new GuiButton(0, posX + 40, posY +40, 100, 20, "Bonjour")); } public void actionPerformed(GuiButton button) { switch(button.id){ case 0 : this.world.setWorldTime(0); default : } } }
Ça devrait fonctionner.
-
En effet, tu appelait la méthode de la classe World, et non pas la méthode d’un World ( Pour expliquer simplement )
En gros, tu disait a la classe de mettre le temps a 0, mais a classe ne savait pas de quel world tu parle.
Ici, c’est le world du joueur, donc celui dans le quel tu est
-
Merci, ça marche mais j’ai un autre problème … Quand j’appuie sur mon bouton, l’heure se met bien à 0 mais se remet comme avant 2-3 sec après …
-
Fait voir ton code qui ouvre le gui.
En effet gugu, c’est un problème d’instance.
-
La class de l’item :
package tutoriel.common; import cpw.mods.fml.common.network.FMLNetworkHandler; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.world.World; public class dummyitem extends Item { public dummyitem(int id) { super(id); this.setCreativeTab(ModTutoriel.TutorialCreativeTabs); } public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer player) { player.openGui(ModTutoriel.instance, 0, world, (int)player.posX, (int)player.posY, (int)player.posZ); return itemstack; } }
Et la class de GuiHandler :
package tutoriel.common.gui; import tutoriel.common.ModTutoriel; import tutoriel.common.TileEntityBigChest; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import cpw.mods.fml.common.network.IGuiHandler; import cpw.mods.fml.common.network.NetworkRegistry; public class GuiHandler implements IGuiHandler{ private InventoryItem tileEntity; public GuiHandler() { NetworkRegistry.instance().registerGuiHandler(ModTutoriel.instance, this); } @Override public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { switch(ID){ default: return null; case 0: return new ContainerDummy(player); case 1: return new ContainerDummy2(player); } } @Override public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { switch(ID){ default: return null; case 0: return new DummyGui(player); case 1: return new DummyGui2(player); } } }
-
Le problème est que tu mets l’heure à 0 uniquement sur le worldClient, et le worldClient ne fait que les rendus. Il faut le mettre sur 0 sur le worldServer, et pour ça il faut passer par des paquets.
Dans ta classe principale, change le @NetworkMod par ça :
@NetworkMod(clientSideRequired = true, serverSideRequired = false, channels = {“mod|time”}, packetHandler = PacketHandler.class)
(remplace mod par un nom raccourci de ton modid pas trop long, moins de 4 caractères de préférence).
Créé la classe PacketHandler et dedans mets :package nom.du.package; import java.io.ByteArrayInputStream; import java.io.DataInputStream; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.network.INetworkManager; import net.minecraft.network.packet.Packet250CustomPayload; import cpw.mods.fml.common.network.IPacketHandler; import cpw.mods.fml.common.network.Player; public class PacketHandler implements IPacketHandler { @Override public void onPacketData(INetworkManager manager, Packet250CustomPayload packet, Player player) { EntityPlayer playerSender = (EntityPlayer)player; if(packet.channel.equals("mod|time")) { handleSmokerPacket(packet, playerSender); } } private void handleSmokerPacket(Packet250CustomPayload packet, EntityPlayer player) { try { DataInputStream data = new DataInputStream(new ByteArrayInputStream(packet.data)); int time = data.readInt(); player.worldObj.setWorldTime(time); } catch(Exception exception) { exception.printStackTrace(); } } }
Et dans ton gui, dans la case 0 de la fonction actionPerformed() tu mets :
ByteArrayOutputStream bytearrayoutputstream = new ByteArrayOutputStream(); DataOutputStream dataoutputstream = new DataOutputStream(bytearrayoutputstream); try { dataoutputstream.writeInt(0); this.mc.getNetHandler().addToSendQueue(new Packet250CustomPayload("mod|time", bytearrayoutputstream.toByteArray())); } catch(Exception exception) { exception.printStackTrace(); }
J’imagine que tu compte mettre plusieurs bouton avec plusieurs heures, il te suffira de modifier la valeur 0 dans dataoutputstream.writeInt(0);.
En passant, comme tu utilise un switch dans un void, faut que tu break sinon il va continuer à faire les instructions.public void actionPerformed(GuiButton button) { switch(button.id){ case 0 : ByteArrayOutputStream bytearrayoutputstream = new ByteArrayOutputStream(); DataOutputStream dataoutputstream = new DataOutputStream(bytearrayoutputstream); try{ dataoutputstream.writeInt(0); this.mc.getNetHandler().addToSendQueue(new Packet250CustomPayload("mod|time", bytearrayoutputstream.toByteArray())); } catch(Exception exception){ exception.printStackTrace(); } break; default : } }
Ha, et si jamais ça marche pas, ajoute ça dans la fonction init de ta classe principale :
NetworkRegistry.instance().registerChannel(new PacketHandler(), "modid");
-
C’est bon ça marche, merci beaucoup ! J’aurais jamais trouvé ça tout seul !
-
Ah, et j’aimerais aussi savoir comment faire pour fermer le Gui en appuyant sur le bouton de l’inventaire comme la plupart des Gui de Minecraft (coffre, hopper, table de craft etc…) donc si vous le savez, dites le moi !
Merci d’avance et bonne année si vous passez par là plus tard