[1.7.10] Création d'un container pour une interface d'échange



  • Bien le bonjour (ou bonsoir vu l'heure à laquelle j'écris ce message)

    Je viens ici car j'ai un petit problème. Je souhaiterais créer une interface d'échange, c'est à dire que le joueur puisse mettre des items dans certaines cases et pareil pour l'autre et qu'à la fin, le joueur reçoit les items de l'autre etc... Je bloque au niveau de l'attribution du handler puisque je créer a chaque fois une nouvelle instance de InventoryTrade ( ce qu'il ne faut pas faire apparement).

    Voici mon code :

    package fr.angelsushi.tradesao.gui.handler;
    
    import cpw.mods.fml.common.network.IGuiHandler;
    import fr.angelsushi.tradesao.gui.GuiTrade;
    import fr.angelsushi.tradesao.gui.container.ContainerTradeSender;
    import fr.angelsushi.tradesao.inventory.InventoryTrade;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.world.World;
    
    public class HandlerTrade implements IGuiHandler {
    
    	private InventoryTrade inventoryTrade = new InventoryTrade();	
    	@Override
    	public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
    		if(ID == 0) {
    		return new ContainerTradeSender(player.inventory, new InventoryTrade(player));
    		}
    		
    			return null;
    	}
    
    	@Override
    	public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
    		if(ID == 0) {
    			return new GuiTrade(player.inventory, new InventoryTrade(player));
    		}
    		
    		
    		return null;
    }
    }
    
    package fr.angelsushi.tradesao.gui.container;
    
    import fr.angelsushi.tradesao.gui.SlotCustom;
    import fr.angelsushi.tradesao.inventory.InventoryTrade;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.inventory.Container;
    import net.minecraft.inventory.IInventory;
    import net.minecraft.inventory.Slot;
    import net.minecraft.item.ItemStack;
    
    public class ContainerTradeSender extends Container{
    
    	
    	    private int numRows;
    	  private  InventoryTrade inventoryTrade;
    	  
    	    private static final String __OBFID = "CL_00001742";
    	    private boolean canInteract= false;
    
    	    public ContainerTradeSender(IInventory inventoryPlayer, IInventory inventoryTrade)
    	    {
    	        this.inventoryTrade = (InventoryTrade)inventoryTrade;
    	       
    	        this.numRows = inventoryTrade.getSizeInventory() / 6;
    	        inventoryTrade.openInventory();
    
    	        System.out.println(inventoryTrade.getSizeInventory());
    	      
    	        int i = (this.numRows - 4) * 18;
    	        int j;
    	        int k;
    
    	        this.addSlotToContainer(new Slot(inventoryTrade,0,12,26));
    	        this.addSlotToContainer(new Slot(inventoryTrade,1,30,26));
    	        this.addSlotToContainer(new Slot(inventoryTrade,2,48,26));
    	        
    	        this.addSlotToContainer(new Slot(inventoryTrade,3,12,44));
    	        this.addSlotToContainer(new Slot(inventoryTrade,4,30,44));  
    	        this.addSlotToContainer(new Slot(inventoryTrade,5,48,44));
    	        
    	        this.addSlotToContainer(new Slot(inventoryTrade,6,12,62));
    	        this.addSlotToContainer(new Slot(inventoryTrade,7,30,62));     
    	        this.addSlotToContainer(new Slot(inventoryTrade,8,48,62));
    	        
    	        this.addSlotToContainer(new Slot(inventoryTrade,9,113,26));
    	        this.addSlotToContainer(new Slot(inventoryTrade,10,131,26));
    	        this.addSlotToContainer(new Slot(inventoryTrade,11,149,26));
    	        
    
    	        this.addSlotToContainer(new Slot(inventoryTrade,12,113,44));
    	        this.addSlotToContainer(new Slot(inventoryTrade,13,131,44));
    	        this.addSlotToContainer(new Slot(inventoryTrade,14,149,44));
    	        
    
    	        this.addSlotToContainer(new Slot(inventoryTrade,15,113,62));
    	        this.addSlotToContainer(new Slot(inventoryTrade,16,131,62));
    	        this.addSlotToContainer(new Slot(inventoryTrade,17,149,62));
    	        
    
    	        for (j = 0; j < 3; ++j)
    	        {
    	            for (k = 0; k < 9; ++k)
    	            {
    	                this.addSlotToContainer(new Slot(inventoryPlayer, k + j * 9 + 9, 8 + k * 18, 103 + j * 18 + i + 4));
    	                
    	            }
    	        }
    
    	        for (j = 0; j < 9; ++j)
    	        {
    	            this.addSlotToContainer(new Slot(inventoryPlayer, j, 8 + j * 18, 161 + i + 4));
    	        }
    	    }
    
    	    public boolean canInteractWith(EntityPlayer p_75145_1_)
    	    {
    	    	  return true;
    	    }
    
    	    /**
    	     * Called when a player shift-clicks on a slot. You must override this or you will crash when someone does that.
    	     */
    	    public ItemStack transferStackInSlot(EntityPlayer p_82846_1_, int p_82846_2_)
    	    {
    	        ItemStack itemstack = null;
    	        Slot slot = (Slot)this.inventorySlots.get(p_82846_2_);
    
    	        if (slot != null && slot.getHasStack())
    	        {
    	            ItemStack itemstack1 = slot.getStack();
    	            itemstack = itemstack1.copy();
    
    	            if (p_82846_2_ < this.numRows * 9)
    	            {
    	                if (!this.mergeItemStack(itemstack1, this.numRows * 9, this.inventorySlots.size(), true))
    	                {
    	                    return null;
    	                }
    	            }
    	            else if (!this.mergeItemStack(itemstack1, 0, this.numRows * 9, false))
    	            {
    	                return null;
    	            }
    
    	            if (itemstack1.stackSize == 0)
    	            {
    	                slot.putStack((ItemStack)null);
    	            }
    	            else
    	            {
    	                slot.onSlotChanged();
    	            }
    	        }
    
    	        return itemstack;
    	    }
    	    
    	    
    
    		@Override
    		public ItemStack slotClick(int p_75144_1_, int p_75144_2_, int p_75144_3_, EntityPlayer p_75144_4_) {
    			for(int i = 0;i < this.inventorySlots.size();i++) {
    				Slot slot = (Slot)this.inventorySlots.get(i);
    				System.out.println(slot.inventory);
    				
    			}
    			return super.slotClick(p_75144_1_, p_75144_2_, p_75144_3_, p_75144_4_);
    		}
    
    		/**
    	     * Called when the container is closed.
    	     */
    	    public void onContainerClosed(EntityPlayer p_75134_1_)
    	    {
    	    	
    	        super.onContainerClosed(p_75134_1_);
    
    	        for (int i = 0; i < 18; ++i)
    	        {
    	        	Slot slot = (Slot)this.inventorySlots.get(i);
    	            ItemStack itemstack =slot.getStack();
    
    	            if (itemstack != null)
    	            {
    	                p_75134_1_.dropPlayerItemWithRandomChoice(itemstack,false);
    	            }
    	        }
    
    	        
    
    	        this.inventoryTrade.closeInventory();
    	        
    	    }
    
    	    /**
    	     * Return this chest container's lower chest inventory.
    	     */
    	    public IInventory getLowerChestInventory()
    	    {
    	        return this.inventoryTrade;
    	    }
    }
    

    Je compte évidemment rendre plus propre le code côté Container mais je voudrais d'abord que tout soit ok niveau système. Merci de votre éventuelle aide !



  • Bonjour
    La solution la plus simple à mon avis c'est d'utiliser des capabilities :
    pur chacun des joueurs quand un trade commence, tu met dans la capability un inventaire d'échange où il peut mettre les choses qu'il propose et le joueur avec qui il est en train d'échanger. Dans le guihandler, tu peux accéder à la capability, donc à son inventory de trade et aussi à l'inventory de trade de l'autre joueur.



  • Merci de ta réponse. Et comment je pourrais faire pour lier les deux inventaires ? Pour que quand le joueur1 mette un item dans un de ses slots ça l'affiche au joueur2 ?



  • Comme j'ai dit, tu accède directement à l'inventaire de trade de l'autre joueur, donc c'est le même inventaire qui est utilisé pour les deux joueurs


  • Moddeurs confirmés Rédacteurs Administrateurs

    Pas la bonne section et préfixe de version manquante 😢
    J'ai déplacé, merci d'ajouter le préfixe de version.

    De quelle manière sont fait les échanges ? Directement entre les joueurs ? Via un bloc pour ?


Log in to reply