Свойства жидкости

Версия Minecraft
1.7.10
90
1
Здравствуйте. Создал свою жидкость. Вроде с первого взгляда все нормально, жидкости течет, её можно набрать в ведро и вылить, НО, есть несколько проблем.
Основные:
А)Если зайти внутрь жидкости, то у неё нет внутренней текстуры, т.е. если стоять внутри нее, то она совершенно прозрачна, как будто ты не внутри неё а просто где то стоишь.
Б)Нельзя двигаться по вертикали внутри жидкости даже совсем чуть чуть нельзя. только влево вправо вперед назад.
В)Скорость перемещения в жидкости должна быть к в обычной воде, а она(скорость) как будто вообще я не в жидкости нахожусь, а в воздухе, т.е. не уменьшается
Г)Нельзя утонуть в ней, не появляются пузырьки воздуха.
Искал в коде воды как там это сделано, но не нашел:(
public class BlockTestFluid extends BlockFluidClassic {
   private static long timePlaced;
   @SideOnly(Side.CLIENT)
   public IIcon stillIcon;
   @SideOnly(Side.CLIENT)
   public IIcon flowingIcon;
   public BlockTestFluid(Fluid fluid, Material material) {
       super(fluid,material);
       setCreativeTab(CreativeTabs.tabBlock);
       this.setLightLevel(5);

   }

   @Override
   public IIcon getIcon(int side, int meta) {
       return (side == 0 || side == 1)? stillIcon : flowingIcon;
   }

   @SideOnly(Side.CLIENT)
   @Override
   public void registerBlockIcons(IIconRegister register) {
       stillIcon= register.registerIcon("testMod:testfluidstill");
       flowingIcon=register.registerIcon("testMod:testfluidflowing");
       TestMod.testFluid.setIcons(stillIcon,flowingIcon);


   }

   @Override
   public boolean canDisplace(IBlockAccess world, int x, int y, int z) {
       if(world.getBlock(x,y,z).getMaterial().isLiquid()) return false;
       return super.canDisplace(world, x, y, z);
   }

   @Override
   public boolean displaceIfPossible(World world, int x, int y, int z) {
       if(world.getBlock(x,y,z).getMaterial().isLiquid()) return false;
       return super.displaceIfPossible(world, x, y, z);
   }

   public static void placedTimeStart(){
       timePlaced=new Date().getTime();
   }
   public static boolean ifF1(){
       //if(timePlaced==0) return false;
       if((new Date().getTime()-timePlaced)>100) return true;
       else return false;
   }
}
 
AlexSocol написал(а):
Material.water передай...


Алсо, твоё "timePlaced" 102% не сработает.



Ага, и когда я пытаюсь её вылить(жидкость) из ведра, она водой становится..


AlexSocol написал(а):
Material.water передай...


Алсо, твоё "timePlaced" 102% не сработает.



timePlaced- эт костыль, который таки работает. Без него как раз таки не работает
 
AlexSocol написал(а):
А ты свою жидкость сделал? Зарегал? К блоку прикрутил?

ну вот код главного класса: может чего не хватает
@Mod(modid="testmod" ,name="Test Mod" ,version="1.0")
public class TestMod {
   public static final String MODID = "testMod";
   public static final String VERSION = "1.0";
   public static Block BlockTest;
   public static Fluid testFluid = new Fluid("testFluid");
   public static Block fluidBlock;

   @Mod.Instance(MODID)
   public static TestMod INSTANCE;

   @Mod.EventHandler
   public void preInit(FMLPreInitializationEvent event) {

 

       BlockTest = (new BlockTest(Material.rock,this));
       GameRegistry.registerBlock(BlockTest, "testblock");
       LanguageRegistry.addName(BlockTest, "Test");
     
       FluidRegistry.registerFluid(testFluid);
       fluidBlock = new BlockTestFluid(testFluid, Material.water);
       GameRegistry.registerBlock(fluidBlock, "testfluid");
       LanguageRegistry.addName(fluidBlock, "Test fluid");
       FluidContainerRegistry.registerFluidContainer(testFluid,new ItemStack(ItemLoader.freshWaterBucket),
             new ItemStack(Items.bucket));
   }
   @Mod.EventHandler
   public void postInit(FMLPostInitializationEvent event){
       MinecraftForge.EVENT_BUS.register(BucketHandler.INSTANCE);
   }


}
И вот код для ведра, обработчик событий установки воды и ее наливания в ведро.
public class BucketHandler {
   public static BucketHandler INSTANCE = new BucketHandler();
  
   boolean flag=true;
   long time;
   private BucketHandler() {
   }
   @SideOnly(Side.CLIENT)
   @SubscribeEvent
   public void onBucketFill(FillBucketEvent event) {
     

               World world = event.world;
               MovingObjectPosition pos = event.target;
               Block block = world.getBlock(pos.blockX, pos.blockY, pos.blockZ);
               int meta = world.getBlockMetadata(pos.blockX, pos.blockY, pos.blockZ);

               if (block == TestMod.fluidBlock && meta == 0/*&&BlockTestFluid.ifF1()*/) {
                   world.setBlockToAir(pos.blockX, pos.blockY, pos.blockZ);
                   event.result = new ItemStack(ItemLoader.freshWaterBucket, 1, 0);
                   event.setResult(Event.Result.ALLOW);
               }


   }
   @SideOnly(Side.CLIENT)
   @SubscribeEvent
   public void useItem(PlayerInteractEvent event) {

       int x=0;
       int y=0;
       int z=0;
       boolean fullInventory=true;
       try{
           if(!event.world.isRemote){
               if(event.action== PlayerInteractEvent.Action.RIGHT_CLICK_BLOCK){
               System.out.println(event.entityPlayer.getCurrentEquippedItem());

            
                   if(event.world.getBlock(event.x,event.y,event.z).equals(BuildCraftFactory.tankBlock)){
                       //  ((BlockTank)event.world.getBlock(event.x,event.y,event.z)).
                       System.out.println("tank use");
                   }else{
               if (event.entityPlayer.getCurrentEquippedItem().getItem().equals(ItemLoader.freshWaterBucket)) {
                   System.out.println(event.world.getBlock(event.x, event.y, event.z));
                   if (event.face != -1) {
                       switch (event.face) {
                           case 0: {
                               x = event.x;
                               y = event.y - 1;
                               z = event.z;
                               break;
                           }
                           case 1: {
                               x = event.x;
                               y = event.y + 1;
                               z = event.z;
                               break;
                           }
                           case 2: {
                               x = event.x;
                               y = event.y;
                               z = event.z - 1;
                               break;
                           }
                           case 3: {
                               x = event.x;
                               y = event.y;
                               z = event.z + 1;
                               break;
                           }
                           case 4: {
                               x = event.x - 1;
                               y = event.y;
                               z = event.z;
                               break;
                           }
                           case 5: {
                               x = event.x + 1;
                               y = event.y;
                               z = event.z;
                               break;
                           }
                       }
                       int meta = event.world.getBlockMetadata(x, y, z);
                       if (event.world.getBlock(x, y, z).equals(Blocks.air)||(event.world.getBlock(x, y, z).equals(TestMod.fluidBlock)&&meta!=0)) {
                         if(!event.entityPlayer.capabilities.isCreativeMode){
                             int currentItem=event.entityPlayer.inventory.currentItem;
                             Item i=event.entityPlayer.getCurrentEquippedItem().getItem();

                            

                             --event.entityPlayer.inventory.mainInventory[currentItem].stackSize;
                            
                         

                             event.entityPlayer.inventory.setInventorySlotContents(currentItem, new ItemStack(Items.bucket));

                          

                             event.world.setBlock(x,y,z,TestMod.fluidBlock);
                          
                             BlockTestFluid.placedTimeStart();
                            
                           
                            


                           
                           

                            
                         }
                       }

                   }
               }

               }

               }
           }
       }catch (NullPointerException e){

       }
   }


}
код очень кривой, но это тестовый, есть красивая чистая версия.
 
Назад
Сверху