[1.6.4]Собственное ведро, стеклянная бутыль.

68
0
Приветствую, форумчане. Новый день-новый вопрос
И так, собственно, сам вопрос, как сделать так, чтобы собственное ведро спавнило собственную жидкость. Я посмотрел ванильное ведро, но чего-то меня не осенило.
Ну и вопрос в догонку... Как сделать так, чтобы стеклянная бутыль набиралась при нажатии ПКМ на, опять же, собственную жидкость бутыль набиралась. И я опять же глядел ванильную стеклянную бутыль, но там что-то связанное с материалами и опять я что-то подтупливаю...
Заранее благодарю за дельные ответы.
 
Про бутыль.В предмет:

Код:
@Override
    public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer entityplayer)
    {
        MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, entityplayer, true);

        if (movingobjectposition == null)
        {
            return itemstack;
        }
        else
        {
            if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK)
            {
                int i = movingobjectposition.blockX;
                int j = movingobjectposition.blockY;
                int k = movingobjectposition.blockZ;

                if (!world.canMineBlock(entityplayer, i, j, k))
                {
                    return itemstack;
                }

                if (!entityplayer.canPlayerEdit(i, j, k, movingobjectposition.sideHit, itemstack))
                {
                    return itemstack;
                }
                if (world.getBlock(i, j, k).getMaterial() == Material.water) {//Если вода,то
                    return new ItemStack(Item);//Предмет
                }
            }
            return itemstack;
        }
    }
 
Очевидно же. Ставишь блок жидкости.
 
/Забыл про тему. /
Делал по вот этому туториалу. У него при этом все работает, а у меня нет. ;/
Вот код
Класс ведра:
Код:
package net.bendingmodbridge.src;

import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.ItemBucket;
import net.minecraft.world.World;

public class MagmaBucket extends ItemBucket {

 private int liquidID;
 
 public MagmaBucket(int itemID, int liquidID) {
 super(itemID, liquidID);
 this.liquidID = liquidID;
 this.setCreativeTab(CreativeTabs.tabMisc);
 this.setTextureName(ModInfo.MODID.toLowerCase() + ":bucketMagma");
 }
 @Override
 public boolean tryPlaceContainedLiquid(World world, int x, int y, int z){
 if(liquidID <= 0){
 return false;
 }else if(!world.isAirBlock(x, y, z) && world.getBlockMaterial(x, y, z).isSolid()){
 return false;
 }else{
 world.setBlock(x, y, z, liquidID, 0, 3);
 return false;
 }
 
 }
}
Сам эвент
Код:
package net.bendingmodbridge.src;

import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.world.World;
import net.minecraftforge.event.Event.Result;
import net.minecraftforge.event.ForgeSubscribe;
import net.minecraftforge.event.entity.player.FillBucketEvent;

public class MagmaFillBucketEvent {
 @ForgeSubscribe
 public void whenITryToFillMyBucket(FillBucketEvent e){
 if(e.current.itemID != Item.bucketEmpty.itemID){
 return;
 }
 
 ItemStack fullBucket = getLiquid(e.world, e.target);
 
 if(fullBucket == null) return;
 
 e.world.setBlockToAir(e.target.blockX, e.target.blockY, e.target.blockZ);
 e.result = fullBucket;
 e.setResult(Result.ALLOW);
 
 }
 
 private ItemStack getLiquid(World world, MovingObjectPosition pos){
 int blockID = world.getBlockId(pos.blockX, pos.blockY, pos.blockZ) ;
 if(blockID == BendingModBridgeMain.blockMagmaFluid.blockID) return new ItemStack(BendingModBridgeMain.magmaBucket);

 return null;
 }
}
Регистрация в postInit
Код:
     FluidContainerRegistry.registerFluidContainer(new FluidContainerData(FluidRegistry.getFluidStack(magma.getName(), FluidContainerRegistry.BUCKET_VOLUME), new ItemStack(magmaBucket),new ItemStack(Item.bucketEmpty)));
И, на всякий случай, регистрация ведра.
Код:
 public static Item magmaBucket = new MagmaBucket(3008, magma.getBlockID()).setUnlocalizedName("magmaBucket").setMaxStackSize(1).setContainerItem(Item.bucketEmpty);
Заранее благодарю за помощь. c:
 
Актуально.
 
Vova_master написал(а):
А на что ругается?
А не ругается, вообще. Просто, держа в руках ведро с моей жидкости, и, нажам ПКМ он мне возвращает пустое ведро, а сам блок жидкости не появляется, хоть ты лопни.
 
Случайно ... набросал код ... :
В Init:
Код:
MinecraftForge.EVENT_BUS.register(new EventPackStock());
В классе EventPackStock (основная часть):
Импорты
Код:
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
import net.minecraftforge.event.Event.Result;
import net.minecraftforge.event.ForgeSubscribe;
import net.minecraftforge.event.entity.player.FillBucketEvent;
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
Код:
public class EventPackStock {

@ForgeSubscribe
public void addNewBucket(FillBucketEvent event) {
if (event.current.getItem() == Item.bucketEmpty) {//Если в руке пустое ведро
if (event.world.getBlockId(event.target.blockX, event.target.blockY, event.target.blockZ) == Block.stone.blockID) {//В указанных координатах есть камень, то...
event.result = new ItemStack(PackStock.proxy.item_drinks, 1, 0);//Даётся наш предмет при использовании пустого ведра
event.world.setBlockToAir(event.target.blockX, event.target.blockY, event.target.blockZ);// Блок из которого черпали становиться воздухом.
event.setResult(Result.ALLOW);
}
}
}

@ForgeSubscribe
public void addNewBottle(PlayerInteractEvent event) {
EntityPlayer player = event.entityPlayer;
World world = player.worldObj;
ItemStack current = player.getCurrentEquippedItem();//То что находиться в руке игрока
if (player != null && world != null && event.action == event.action.RIGHT_CLICK_BLOCK) {//Если игрок не равен нулю и Мир не равен нулю и происходит действие ПКМ по блоку
if (current != null && current.getItem() == Item.glassBottle && world.getBlockId(event.x, event.y, event.z) == Block.stone.blockID) {//Если рука не пуста и в руке пустая бутыль и в указанных координатах есть камень, то...
--current.stackSize;//То что в руке находиться, то и убавляться из руки
player.inventory.addItemStackToInventory(new ItemStack(PackStock.proxy.item_drinks, 1, 0));//Даётся наш предмет...
event.setResult(Result.ALLOW);
}
}
}

}
Использовал камень как жидкостный блок, просто другую жидкость не сделал. Код проверял, тестировать нужно в режиме вышивания (в режиме креатива пустые вёдра не заменялись на т.е. что в переменной результата).
Название твоего класса эвента, может быть другим.
 
А нафиг 2 итема на заполненное ведро и на пустое ведро?
Просто сетить ведру метадату, которая будет айди жидкости.
 
Исправил и добавил условие "if (event.current.getItem() == Item.bucketEmpty) {//Если в руке пустое ведро".
На счёт метыдаты для ведра, не знаю. Мне не надо, так как у меня другие вёдра, так что измените как вам надо (я лишь показал рабочий код).
 
Разобрался самостоятельно, ну почти :D. Благодарю всех за помощь.
Вот код 
Ведра:
Код:
package net.bendingmodbridge.src;

import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.ItemBucket;

public class BucketMagma extends ItemBucket
{
public BucketMagma(int par1, int par2)
{
        super(par1, par2);
        this.setCreativeTab(CreativeTabs.tabTools);
        this.setTextureName(ModInfo.MODID.toLowerCase() + ":bucketMagma");
}
}
Эвент;
Код:
package net.bendingmodbridge.src;


import net.minecraft.item.ItemStack;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.world.World;
import net.minecraftforge.event.ForgeSubscribe;
import net.minecraftforge.event.Event.Result;
import net.minecraftforge.event.entity.player.FillBucketEvent;

public class MagmaBucketHandler {

   @ForgeSubscribe
   public void onBucketFill(FillBucketEvent event) {
      ItemStack result = this.fillCustomBucket(event.world, event.target);
      if(result != null) {
         event.result = result;
         event.setResult(Result.ALLOW);
      }
   }
   public ItemStack fillCustomBucket(World world, MovingObjectPosition pos) {
      int blockID = world.getBlockId(pos.blockX, pos.blockY, pos.blockZ);
      if(blockID == BendingModBridgeMain.blockMagmaFluid.blockID && world.getBlockMetadata(pos.blockX, pos.blockY, pos.blockZ) == 0) {
         world.setBlock(pos.blockX, pos.blockY, pos.blockZ, 0);
         return new ItemStack(BendingModBridgeMain.bucketMagma);
      } else {
         return null;
      }
   }
}
В творческом режиме работает также как и ванильное ведро (допустим, лавы)
 
Назад
Сверху