• S'inscrire
    • Se connecter
    • Recherche
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes

    Résolu Changement d'heure

    Anciennes versions
    1.6.4
    3
    9
    2133
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • O
      OpumaO dernière édition par

      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 !

      1 réponse Dernière réponse Répondre Citer 0
      • robin4002
        robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par

        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.

        1 réponse Dernière réponse Répondre Citer 0
        • Gugu
          Gugu dernière édition par

          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 😛

          "If you have a comprehensive explanation for everything then it decreases uncertainty and anxiety and reduces your cognitive load. And if you can use that simplifying algorithm to put yourself on the side of moral virtue then you’re constantly a good person with a minimum of effort."
          ― Jordan B. Peterson

          1 réponse Dernière réponse Répondre Citer 0
          • O
            OpumaO dernière édition par

            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 …

            1 réponse Dernière réponse Répondre Citer 0
            • robin4002
              robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par

              Fait voir ton code qui ouvre le gui.

              En effet gugu, c’est un problème d’instance.

              1 réponse Dernière réponse Répondre Citer 0
              • O
                OpumaO dernière édition par

                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);
                }
                }
                
                }
                
                
                1 réponse Dernière réponse Répondre Citer 0
                • robin4002
                  robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par

                  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");
                  
                  1 réponse Dernière réponse Répondre Citer 0
                  • O
                    OpumaO dernière édition par

                    C’est bon ça marche, merci beaucoup ! J’aurais jamais trouvé ça tout seul !

                    1 réponse Dernière réponse Répondre Citer 0
                    • O
                      OpumaO dernière édition par

                      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 😃

                      1 réponse Dernière réponse Répondre Citer 0
                      • 1 / 1
                      • Premier message
                        Dernier message
                      Design by Woryk
                      Contact / Mentions Légales

                      MINECRAFT FORGE FRANCE © 2018

                      Powered by NodeBB