MFF

    Minecraft Forge France
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes
    • Forge Events
      • Automatique
      • Foncé
      • Clair
    • S'inscrire
    • Se connecter

    Émulation d'un joueur - inventaire

    Planifier Épinglé Verrouillé Déplacé Sans suite
    1.6.2
    13 Messages 4 Publieurs 3.4k Vues 1 Watching
    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.
    • PorteffroiP Hors-ligne
      Porteffroi
      dernière édition par

      1. Parmis ce que j’ai trouvé, getCurrentPlayerStrVsBlock() de entityplayer semble calculer un facteur de force qui est à de multiples endroit comme dans updateBlockRemoving() de ItemInWorldManager multiplié par 10 puis utilisé comme valeur de dégat pour destroyBlockInWorldPartially. Si je recalcule ce facteur de force sur base des objets de l’entité est-ce que cela donnerai le même effet que pour un joueur ?

      2. Dans quelle classe inventaire plus précisément ? Parce que j’en ai croisé plusieurs mais je n’ai pas vu de code spécifique à une gui.

      3. Ok, vu la réaction su ce point je vais pas tarder à update alors ^^

      1 réponse Dernière réponse Répondre Citer 0
      • PorteffroiP Hors-ligne
        Porteffroi
        dernière édition par

        1. Ok, sur ce point à force de bidouiller j’ai fini par réussir à le faire à partir d’un bloc, le passage a une entité devrait pas être trop dur. Par contre j’ai un problème étrange de texture :

        Ma texture fait 176x165, dans ma classe qui étend GuiContainer, j’ai tapé ceci :

        
        package PLCmods.robotica.gui;
        
        import org.lwjgl.opengl.GL11;
        
        import cpw.mods.fml.client.FMLClientHandler;
        …
        import net.minecraft.util.ResourceLocation;
        
        public class TestGuiContainer extends GuiContainer
        {
        public static final ResourceLocation texture = new ResourceLocation(Robotica.SID, "textures/gui/robotinv2.png");
        
        public TestGuiContainer(InventoryPlayer inventory, TestTileEntity te)
        {
        super(new TestContainer(inventory, te));
        xSize = 176;
        ySize = 165;
        }
        
        @Override
        protected void drawGuiContainerBackgroundLayer(float f, int i, int j)
        {
        GL11.glColor4f(1F, 1F, 1F, 1F);
        FMLClientHandler.instance().getClient().renderEngine.func_110577_a(texture);
        drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize);
        }
        }
        
        

        Le problème c’est que la texture prend la place qu’elle doit prendre mais elle est zoomée sur le coin supérieur gauche. Si j’enlève le fichier texture celle par défaut (rose / noire) est chargée à la place mais celle ci est aussi zoomée (la case sup. gauche est complète mais pas les autres). Quelqu’un sait pourquoi ? Vu que la texture par défaut à le même effet ce doit être que je fais une bêtise dans le code …

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

          avec ça ?

          int x = (this.width - this.xSize) / 2;
          int y = (this.height - this.ySize) / 2;
          this.drawTexturedModalRect(x, y, 0, 0, this.xSize, this.ySize);
          
          1 réponse Dernière réponse Répondre Citer 0
          • PorteffroiP Hors-ligne
            Porteffroi
            dernière édition par

            Même résultat, c’est déjà ce positionnement qui est appliqué dans la classe mère apparement.

            1 réponse Dernière réponse Répondre Citer 0
            • kevin_68K Hors-ligne
              kevin_68 Moddeurs confirmés
              dernière édition par

              Essaie avec une image de 256*256 mais avec la texture souhaitée sur tes dimensions.


              Mettez à jours vers la dernière version stable (1.8.9 voir même…

              1 réponse Dernière réponse Répondre Citer 0
              • PorteffroiP Hors-ligne
                Porteffroi
                dernière édition par

                Youhou Ca marche \o/.

                Merci 🙂

                Reste à faire fonctionner la partie drag & drop avec l’inventaire du joueur.
                Si ça ne dérange pas trop je laisse le post ouvert encore un peu le temps de voir si je m’en sort avant de mettre résolu.

                1 réponse Dernière réponse Répondre Citer 0
                • PorteffroiP Hors-ligne
                  Porteffroi
                  dernière édition par

                  Ca marche … presque … J’ai des comportements étrange quand je transfert des items :

                  • Si je fais passer de l’inventaire joueur à l’inventaire custom ça double les quantités.
                  • Si je prend les items de l’inventaire custom il disparaissent. Si j’utilise maj+clic on voit l’item apparaitre un court instant dans l’inventaire avant de disparaitre.

                  J’ai l’impression que cela vient de la séparation client / serveur qui est foireuse et que du coup et le client et le serveur transfert l’item et donc double ses quantité.
                  :::

                  Handler :

                  
                  public class GuiHandler implements IGuiHandler
                  {
                  
                  /**
                  * Return the requested GUI on server side.
                  * Always null as no server GUI exists.
                  */
                  @Override
                  public Object getServerGuiElement(int id, EntityPlayer player, World world, int x, int y, int z)
                  {
                  switch(id)
                  {
                  case Robotica.GUI.RobotInventory:
                  // NB : j'utilise x comme id car il s'agit d'une entité, pas d'un bloc. Ca semble marcher
                  return getRobotInventoryTileEntity(player, x);
                  
                  default:
                  return null;
                  }
                  }
                  
                  private Object getRobotInventoryTileEntity(EntityPlayer player, int id)
                  {
                  MechaEntity e = MechaEntity.getMecha(id);
                  
                  if(!(e instanceof RobotEntity))
                  return null;
                  
                  if( new Coords(player).distanceTo((RobotEntity) e) > RobotEntity.GUIRANGE)
                  return null;
                  
                  return new RobotInventoryContainer(player.inventory, ((RobotEntity) e).inventory);
                  }
                  
                  /**
                  * Return the requested GUI on client side.
                  * The corresponding Id's can be found in a subclass of Robotica : {@link PLCmods.robotica.Robotica.GUI}.
                  */
                  @Override
                  public Object getClientGuiElement(int id, EntityPlayer player, World world, int x, int y, int z)
                  {
                  switch(id)
                  {
                  case Robotica.GUI.ControlPanel:
                  return new ControlPanelGUI();
                  
                  case Robotica.GUI.RobotInfo:
                  return new InfoFrameGUI();
                  
                  case Robotica.GUI.RobotInventory:
                  return getRobotInventoryGui(player, x);
                  
                  default:
                  return null;
                  }
                  }
                  
                  private Object getRobotInventoryGui(EntityPlayer player, int id)
                  {
                  MechaEntity e = MechaEntity.getMecha(id);
                  
                  if(!(e instanceof RobotEntity))
                  return null;
                  
                  if( new Coords(player).distanceTo((RobotEntity) e) > RobotEntity.GUIRANGE)
                  return null;
                  
                  return new RobotInventoryGui(player, (RobotEntity) e);
                  }
                  }
                  
                  

                  GUI :

                  
                  public class RobotInventoryGui extends GuiContainer
                  {
                  public static final ResourceLocation texture = new ResourceLocation(Robotica.SID, "textures/gui/robotinv.png");
                  
                  public RobotInventoryGui(EntityPlayer player, RobotEntity robot)
                  {
                  super(new RobotInventoryContainer(player.inventory, robot.inventory));
                  xSize = 175;
                  ySize = 165;
                  }
                  
                  @Override
                  protected void drawGuiContainerBackgroundLayer(float f, int i, int j)
                  {
                  GL11.glColor4f(1F, 1F, 1F, 1F);
                  FMLClientHandler.instance().getClient().renderEngine.func_110577_a(texture);
                  
                  int x = (this.width - this.xSize) / 2;
                  int y = (this.height - this.ySize) / 2;
                  this.drawTexturedModalRect(x, y, 0, 0, this.xSize, this.ySize);
                  }
                  }
                  
                  

                  TileEntity :

                  
                  public class RobotInventory extends TileEntity implements IInventory
                  {
                  public static final int GRAB_RANGE = 3;
                  
                  protected RobotEntity entity;
                  protected ItemStack[] inv;
                  
                  public RobotInventory(RobotEntity robotEntity)
                  {
                  entity = robotEntity;
                  inv = new ItemStack[24];
                  }
                  
                  @Override
                  public int getSizeInventory()
                  {
                  return inv.length;
                  }
                  
                  @Override
                  public ItemStack getStackInSlot(int i)
                  {
                  return inv*;
                  }
                  
                  @Override
                  public ItemStack decrStackSize(int slotId, int quantity)
                  {
                  if (this.inv[slotId] != null)
                  {
                  ItemStack itemstack;
                  
                  if (this.inv[slotId].stackSize <= quantity)
                  {
                  itemstack = this.inv[slotId];
                  this.inv[slotId] = null;
                  this.onInventoryChanged();
                  return itemstack;
                  }
                  else
                  {
                  itemstack = this.inv[slotId].splitStack(quantity);
                  
                  if (this.inv[slotId].stackSize == 0)
                  {
                  this.inv[slotId] = null;
                  }
                  
                  this.onInventoryChanged();
                  return itemstack;
                  }
                  }
                  else
                  {
                  return null;
                  }
                  }
                  
                  @Override
                  public ItemStack getStackInSlotOnClosing(int slotId)
                  {
                  if (this.inv[slotId] != null)
                  {
                  ItemStack itemstack = this.inv[slotId];
                  this.inv[slotId] = null;
                  return itemstack;
                  }
                  else
                  {
                  return null;
                  }
                  }
                  
                  @Override
                  public void setInventorySlotContents(int slotId, ItemStack stack)
                  {
                  System.out.println("Set slot content of " + slotId);
                  
                  this.inv[slotId] = stack;
                  
                  if (stack != null && stack.stackSize > this.getInventoryStackLimit())
                  {
                  stack.stackSize = this.getInventoryStackLimit();
                  }
                  
                  this.onInventoryChanged();
                  }
                  
                  @Override
                  public String getInvName()
                  {
                  return "Robot inventory";
                  }
                  
                  @Override
                  public boolean isInvNameLocalized()
                  {
                  return true;
                  }
                  
                  @Override
                  public int getInventoryStackLimit()
                  {
                  return 64;
                  }
                  
                  @Override
                  public boolean isUseableByPlayer(EntityPlayer player)
                  {
                  return player.getDistanceSq(entity.posX, entity.posY, entity.posZ) < 25;
                  }
                  
                  @Override
                  public void openChest()
                  {
                  }
                  
                  @Override
                  public void closeChest()
                  {
                  }
                  
                  @Override
                  public boolean isItemValidForSlot(int i, ItemStack itemstack)
                  {
                  return true;// (i < 20 || i > 23);
                  }
                  }
                  
                  

                  Container :

                  
                  public class RobotInventoryContainer extends Container
                  {
                  private RobotInventory inventory;
                  
                  public RobotInventoryContainer(InventoryPlayer playerinv, RobotInventory robotinv)
                  {
                  this.inventory = robotinv;
                  
                  for(int i=0;i<4;i++)
                  for(int j=0;j<5;j++)
                  addSlotToContainer(new Slot(robotinv, i * 5 + j, 82 + j * 18, 6 + i * 18));
                  
                  for(int i=0;i<4;i++)
                  addSlotToContainer(new Slot(robotinv, 20 + i, 6, 6 + i * 18));
                  
                  for(int i=0;i<3;i++)
                  for(int j=0;j<9;j++)
                  addSlotToContainer(new Slot(playerinv, 9 + i * 9 + j, 8 + j * 18, 84 + i * 18));
                  
                  for(int j=0;j<9;j++)
                  addSlotToContainer(new Slot(playerinv, j, 8 + j * 18, 142));
                  }
                  
                  public ItemStack transferStackInSlot(EntityPlayer player, int n)
                  {
                  System.out.println("Transfert in slot " + n);
                  
                  ItemStack stack = null;
                  Slot slotObject = (Slot)this.inventorySlots.get(n);
                  
                  if (slotObject != null && slotObject.getHasStack())
                  {
                  ItemStack stack1 = slotObject.getStack();
                  stack = stack1.copy();
                  
                  if(n < 24)
                  {
                  if(!this.mergeItemStack(stack1,24,59,false)) // (! ((RobotInventory) slotObject.inventory).pickUpItem(itemstack))
                  {
                  return null;
                  }
                  }
                  else if (!this.mergeItemStack(stack1, 0, 20, false))
                  {
                  return null;
                  }
                  
                  if(stack1.stackSize == 0)
                  {
                  slotObject.putStack(null);
                  }
                  else
                  {
                  slotObject.onSlotChanged();
                  }
                  }
                  
                  return stack;
                  }
                  
                  @Override
                  public boolean canInteractWith(EntityPlayer entityplayer)
                  {
                  return inventory.isUseableByPlayer(entityplayer);
                  }
                  }
                  
                  

                  :::
                  NB : pour info les slots custom sont formé d’un groupe de 20 et d’un groupe de 4.

                  1 réponse Dernière réponse Répondre Citer 0
                  • PorteffroiP Hors-ligne
                    Porteffroi
                    dernière édition par

                    Je pense avoir mis le doigt sur le problème :

                    Coté serveur mon entité à son inventaire correct mais coté client l’inventaire reste vide. Comment se fait la synchronisation entre le serveur et le client dans le cas d’un container de bloc ? Ici j’ai une entité au lieu d’un block, est-ce que je peux utiliser le même système ou je dois passer par des dataWatcher pour synchroniser chaque slots ? 😕

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

                      Plutôt par des paquets. Il y a quelqu’un du fofo qui l’a fait, mais je ne sais plus qui 😕

                      1 réponse Dernière réponse Répondre Citer 0
                      • PorteffroiP Hors-ligne
                        Porteffroi
                        dernière édition par

                        Mouais, je connais pas la gestion des paquets … C’est en rapport avec ça je suppose : http://www.minecraftforge.net/wiki/Packet_Handling

                        Dans le cas de container de block ça passe par ce système aussi ? Histoire que je vois comment c’est géré.

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

                        MINECRAFT FORGE FRANCE © 2024

                        Powered by NodeBB