Jump to content

Recommended Posts

Posted

 

good nigths i been working in a custom door from 3x3 size and alredy have it but it has some issues

 

 

an as the morphy's law dictates the day of the demostration it fails in this case it works,

one of the troubles is than normally zombies can pass the door after a little effort,  but this time only one little zombies goes througth the closes door

 

this door i made feels innecesary complex there is a control block in the center that open an closes the door two size door blocks draw left and rigth door

and i made an invisible block to block the pass  filling the empty space around the control center block but still mob get througth the door soo really is not working, and entityRayTrace methods  sees througth the door soo mi mobs atack like there where not i door at all, soo this is  not a fully solid block soo all this week work is wortless

 

i wanna make it simple i wanna make this door only one center block and this block must has a  CollisionBoundingBox as big as an 3x3x3 area

entityRayTrace must be unabble to see througth this block, and mobs must not be able to pase througth when the door is close

 

i read i can extend the block CollisionBoundingBox but the guide is for 1.6 and some methods are not anymore in 1.8 ore has diferent names

as i try it seems not posible to extends bounding far than 1M block so there must be trick

http://www.minecraftforge.net/forum/index.php?topic=9982.0

 

####

someone could tell me how to make a big collision bounding for this  door block in 1.8

 

sorry for the long explanation english is not native lnguague

 

 

 

 

 

Posted

yap

i think it could be posible coze in the block json you can make models up to 3x3x3,    actualy this door is  the centerBlock + leftDoorBlock +RigthDoorBlock + 6X  aireSolido00 blocks fillng the space 

the  trouble is  some how mobs get througth the close door, i think coulbe solveit playing whith the bounding boxes from the blocks

 

 

### is some how some way to repeel or avoid the mobs to get trhougth the close door ??  but simple  not entityes nor whitchcrafts

 

 

all of the door blocks use this same  setBlockBoundsBasedOnState(IBlockAccess worldIn, BlockPos pos)  values

the only pasable is the center Block

 

 

 
package mercenarymod.blocks.multitextura;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random;

import org.apache.logging.log4j.core.config.Property;

import com.google.common.collect.Lists;

import mercenarymod.Mercenary;
import mercenarymod.blocks.MercenaryModBlocks;
import mercenarymod.entidades.demeUn;
import mercenarymod.items.MercenaryModItems;
import mercenarymod.tileentity.ModTileEntity;
import mercenarymod.tileentity.simpleTileEntity;
import net.minecraft.block.Block;
import net.minecraft.block.BlockButton;
import net.minecraft.block.BlockRedstoneWire;
import net.minecraft.block.ITileEntityProvider;
import net.minecraft.block.material.MapColor;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyBool;
import net.minecraft.block.properties.PropertyDirection;
import net.minecraft.block.properties.PropertyInteger;
import net.minecraft.block.state.BlockState;
import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.projectile.EntityArrow;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityFurnace;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.BlockPos;
import net.minecraft.util.ChatComponentTranslation;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumWorldBlockLayer;
import net.minecraft.util.MathHelper;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import mercenarymod.utilidades.chat;
import mercenarymod.utilidades.util;
import net.minecraft.entity.EntityLivingBase;


public class aireSolido00 extends Block
{
    

    public static final PropertyDirection FACING = PropertyDirection.create("facing");
    
    
    public aireSolido00()
    {
    	super(Material.wood);
    	String name = "aireSolido00";
    	setUnlocalizedName(Mercenary.MODID + "_" + name);
        GameRegistry.registerBlock(this, name);
        setCreativeTab(Mercenary.herramientas);
        
        this.setHardness(15.0F);
        this.setResistance(2.0F);
        
        
    }
    
    
    /**
     * Called when a neighboring block changes.
     */
    public void onNeighborBlockChange(World worldIn, BlockPos pos, IBlockState state, Block neighborBlock)
    {
        if (!worldIn.isRemote)
        {
        }
    }

    
  //###########################################################3
    public Item getItemDropped(IBlockState state, Random rand, int fortune)
    {
    	
        return null; //Item.getItemFromBlock(MercenaryModBlocks.C4_blocke);
    }
    
    
  //###########################################################3
    
    public boolean isOpaqueCube()
    {
        return false;
    }

   
    public boolean isFullCube()
    {
        return false;
    }
    
    @SideOnly(Side.CLIENT)
    public EnumWorldBlockLayer getBlockLayer()
    {
        return EnumWorldBlockLayer.CUTOUT;
    }
    
    @Override
    public boolean isPassable(IBlockAccess worldIn, BlockPos pos)
    {
        return false;
    }
  //###########################################################3
    
    /*
    public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumFacing side, float hitX, float hitY, float hitZ)
    {
    return false;
    }
    
    */
// #########################################################################3
    public void onBlockPlacedBy(World worldIn, BlockPos pos, IBlockState state, EntityLivingBase placer, ItemStack stack)
    {
        worldIn.setBlockState(pos, state.withProperty(FACING, getFacingFromEntity(worldIn, pos, placer)), 2);
    }
    
  //###########################################################3    
    public IBlockState onBlockPlaced(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer)
    {
        return this.getDefaultState().withProperty(FACING, getFacingFromEntity(worldIn, pos, placer) );
    }
    
  //###########################################################3    
    public void setBlockBoundsBasedOnState(IBlockAccess worldIn, BlockPos pos)
    {
        IBlockState iblockstate = worldIn.getBlockState(pos);

       
            float f = 0.25F;
            EnumFacing enumfacing = (EnumFacing)iblockstate.getValue(FACING);

            if (enumfacing != null)
            {
                switch (aireSolido00.SwitchEnumFacing.FACING_LOOKUP[enumfacing.ordinal()])
                {
                case 1:
                    this.setBlockBounds(0.0F, 0.75F, 0.0F, 1.0F, 1.0F, 1.0F);
                    break;
                case 2:
                    this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.25F, 1.0F);
                    break;
                case 3:
                	this.setBlockBounds(0.0F, 0.0F, 0.75F, 1.0F, 1.0F, 1.0F);
                    break;
                case 4:
                    this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 0.25F);
                    break;
                case 5:
                    this.setBlockBounds(0.75F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
                    break;
                case 6:
                    this.setBlockBounds(0.0F, 0.0F, 0.0F, 0.25F, 1.0F, 1.0F);
                    
                }
            }
        
        else
        {
            this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
        }
            
            //this.setBlockBounds(0.2F, 0.0F, 0.2F, 0.8F, 0.6F, 0.8F);
            
    }

  //###########################################################3  
    public void setBlockBoundsForItemRender()
    {
        this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
    }    
        
  //###########################################################3  
    
    public static EnumFacing getFacingFromEntity(World worldIn, BlockPos clickedBlock, EntityLivingBase entityIn)
    {
        if (MathHelper.abs((float)entityIn.posX - (float)clickedBlock.getX()) < 2.0F && MathHelper.abs((float)entityIn.posZ - (float)clickedBlock.getZ()) < 2.0F)
        {
            double d0 = entityIn.posY + (double)entityIn.getEyeHeight();

            
            
            if (d0 - (double)clickedBlock.getY() > 2.0D)
            {
                return EnumFacing.UP;
            }

            if ((double)clickedBlock.getY() - d0 > 0.0D)
            {
                return EnumFacing.DOWN;
            }
            
            
        }

        return entityIn.getHorizontalFacing().getOpposite();
    } 
  //###########################################################3  
    
    
    public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumFacing side, float hitX, float hitY, float hitZ)
    {
   
    	return false;
    }
        
    
    //###########################################################3
    
    protected BlockState createBlockState()
    {
        return new BlockState(this, new IProperty[] {FACING});
    }
    
    //###########################################################3
    
    //###########################################################3
    
    public int getMetaFromState(IBlockState state)
    {
        
        EnumFacing enumfacing = (EnumFacing) state.getValue(FACING);

        int facing = enumfacing.getIndex();
        
        return facing;
        
     }
   //#################################################################################################3
    /**
     * Convert the given metadata into a BlockState for this Block
     */
    
    public IBlockState getStateFromMeta(int meta)
    {
    	
    	
        switch (meta)
        {
            case 1:
            	return this.getDefaultState().withProperty(FACING, EnumFacing.UP); //up
                
            case 2:
            	return this.getDefaultState().withProperty(FACING, EnumFacing.DOWN);//down
                
            default:
            	return this.getDefaultState().withProperty(FACING, EnumFacing.NORTH ); //norte
                
            case 4:
            	return this.getDefaultState().withProperty(FACING, EnumFacing.SOUTH );//sur
                
            case 5:
            	return this.getDefaultState().withProperty(FACING, EnumFacing.WEST );//oeste 
                
            case 6:
            	return this.getDefaultState().withProperty(FACING, EnumFacing.EAST );//este
        }
    	
    	  	
    	
    	
    }
    
    
  
  //#################################################################################################3

    
    static final class SwitchEnumFacing
    {
        static final int[] FACING_LOOKUP = new int[EnumFacing.values().length];
        private static final String __OBFID = "CL_00002037";

        static
        {
            try
            {
                FACING_LOOKUP[EnumFacing.DOWN.ordinal()] = 1;
            }
            catch (NoSuchFieldError var6)
            {
                ;
            }

            try
            {
                FACING_LOOKUP[EnumFacing.UP.ordinal()] = 2;
            }
            catch (NoSuchFieldError var5)
            {
                ;
            }

            try
            {
                FACING_LOOKUP[EnumFacing.NORTH.ordinal()] = 3;
            }
            catch (NoSuchFieldError var4)
            {
                ;
            }

            try
            {
                FACING_LOOKUP[EnumFacing.SOUTH.ordinal()] = 4;
            }
            catch (NoSuchFieldError var3)
            {
                ;
            }

            try
            {
                FACING_LOOKUP[EnumFacing.WEST.ordinal()] = 5;
            }
            catch (NoSuchFieldError var2)
            {
                ;
            }

            try
            {
                FACING_LOOKUP[EnumFacing.EAST.ordinal()] = 6;
            }
            catch (NoSuchFieldError var1)
            {
                ;
            }
        }
    }
   
    //###########################################################3

    
    
    
    
    
}//fin de la clase

Posted

You're already trying to do a hacky solution by making 'impassable air' - why insist on doing it both the hard and wrong way, when it is much easier to simply make real blocks at the positions you want to be real blocks?

 

Sorry, but making a single Block bigger than 1x1x1, in the context of Minecraft, is a terrible idea. The entire Minecraft code is built around the idea that Blocks take up at most a 1x1x1 cube and that within that cube will only be 1 block - messing with that is just asking for trouble.

 

You can make multi-block structures such as a 3x3 door, however, by placing and breaking all the blocks together, as I already mentioned. Vanilla doors and beds already do this - you just need to extend the concept to encompass a slightly larger scale.

Posted

 

 

if ound something contradictory ut still could make it work

 

in the BlockFenceGate they are declaring bounding from 1.5 high but this king of bounding is not visible so not know if it is working or not

 

 

  public AxisAlignedBB getCollisionBoundingBox(World worldIn, BlockPos pos, IBlockState state)

    {

        if (((Boolean)state.getValue(OPEN)).booleanValue())

        {

            return null;

        }

        else

        {

            EnumFacing.Axis axis = ((EnumFacing)state.getValue(FACING)).getAxis();

            return axis == EnumFacing.Axis.Z ? new AxisAlignedBB((double)pos.getX(), (double)pos.getY(), (double)((float)pos.getZ() + 0.375F), (double)(pos.getX() + 1), (double)((float)pos.getY() + 1.5F), (double)((float)pos.getZ() + 0.625F)) : new AxisAlignedBB((double)((float)pos.getX() + 0.375F), (double)pos.getY(), (double)pos.getZ(), (double)((float)pos.getX() + 0.625F), (double)((float)pos.getY() + 1.5F), (double)(pos.getZ() + 1));

        }

    }

 

 

but could be just an error from the coder  let behind

 

 

Posted

You CAN make bounding boxes bigger than 1x1x1, but, in general, you should not. Fences make the collision bounding box taller than 1 block so that players and mobs cannot jump over them, but the fence, as a block, still restricts itself basically to the 1x1x1 cube, which is why you can place blocks on top of the fence and the top block is still only 1 meter rather than 1.5 meters from the ground.

Posted

#getCollisionBoundingBox is the box used to detect collisions with entities. This is the part Fences set to 1.5F.

 

#setBlockBoundsBasedOnState sets the block's 'hit box', i.e. the portion of the block that can be clicked, which is the part you see when hovering over the block with your mouse. For fences, this is still maxed out at 1.0F on the y-axis.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.