Как сесть на блок

Версия Minecraft
1.12.2
13
1
Я сделал мод на кресло, но на него нельзя садится(как на лошадь или свинью). Можете скинуть код, пожалуйста, и объяснить если сможете как он работает.
Вот код блока(могут быть лишние строки):
Код:
package com.fande.mymod.blocks;

import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.BlockFurnace;
import net.minecraft.block.BlockHorizontal;
import net.minecraft.block.SoundType;
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.state.BlockFaceShape;
import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityFurnace;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.Mirror;
import net.minecraft.util.Rotation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.world.World;

public class BlockSofa extends Block {
    public static final PropertyDirection FACING = BlockHorizontal.FACING;
    public BlockSofa(Material mater, String name) {
        super(mater);
        this.setSoundType(SoundType.WOOD);
        this.setHardness(2.0F);
        this.setHarvestLevel("axe", 0);
        this.setRegistryName(name);
        this.setUnlocalizedName(name);
        this.setResistance(2.0F);
    }
    
    @Override
    public boolean isOpaqueCube(IBlockState state)
    {
        return false;
    }
    
    public IBlockState withRotation(IBlockState state, Rotation rot)
    {
        return state.withProperty(FACING, rot.rotate((EnumFacing)state.getValue(FACING)));
    }
    public IBlockState withMirror(IBlockState state, Mirror mirrorIn)
    {
        return state.withRotation(mirrorIn.toRotation((EnumFacing)state.getValue(FACING)));
    }
    public IBlockState getStateForPlacement(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer)
    {
        return this.getDefaultState().withProperty(FACING, placer.getHorizontalFacing().getOpposite());
    }
    public IBlockState getStateFromMeta(int meta)
    {
        return this.getDefaultState().withProperty(FACING, EnumFacing.getHorizontal(meta));
    }
    public int getMetaFromState(IBlockState state)
    {
        return ((EnumFacing)state.getValue(FACING)).getHorizontalIndex();
    }

    protected BlockStateContainer createBlockState()
    {
        return new BlockStateContainer(this, new IProperty[] {FACING});
    }
    
}
 
Решение
Java:
public class SittableUtil
{

    public static boolean sitOnBlock(World par1World, double x, double y, double z, EntityPlayer par5EntityPlayer, double par6)
    {
        if(!checkForExistingEntity(par1World, x, y, z, par5EntityPlayer))
        {
            EntitySittableBlock nemb = new EntitySittableBlock(par1World, x, y, z, par6);
            par1World.spawnEntity(nemb);
            par5EntityPlayer.startRiding(nemb);
        }
        return true;
    }

    public static boolean sitOnBlockWithRotationOffset(World par1World, double x, double y, double z, EntityPlayer par5EntityPlayer, double par6, int metadata, double offset)
    {
        if(!checkForExistingEntity(par1World, x, y, z, par5EntityPlayer) && !par1World.isRemote)...
5,018
47
783
Java:
public class SittableUtil
{

    public static boolean sitOnBlock(World par1World, double x, double y, double z, EntityPlayer par5EntityPlayer, double par6)
    {
        if(!checkForExistingEntity(par1World, x, y, z, par5EntityPlayer))
        {
            EntitySittableBlock nemb = new EntitySittableBlock(par1World, x, y, z, par6);
            par1World.spawnEntity(nemb);
            par5EntityPlayer.startRiding(nemb);
        }
        return true;
    }

    public static boolean sitOnBlockWithRotationOffset(World par1World, double x, double y, double z, EntityPlayer par5EntityPlayer, double par6, int metadata, double offset)
    {
        if(!checkForExistingEntity(par1World, x, y, z, par5EntityPlayer) && !par1World.isRemote)
        {
            EntitySittableBlock nemb = new EntitySittableBlock(par1World, x, y, z, par6, metadata, offset);
            par1World.spawnEntity(nemb);
            par5EntityPlayer.startRiding(nemb);
        }
        return true;
    }

    public static boolean checkForExistingEntity(World par1World, double x, double y, double z, EntityPlayer par5EntityPlayer)
    {
        List<EntitySittableBlock> listEMB = par1World.getEntitiesWithinAABB(EntitySittableBlock.class, new AxisAlignedBB(x, y, z, x + 1.0D, y + 1.0D, z + 1.0D).expand(1D, 1D, 1D));
        for(EntitySittableBlock mount : listEMB)
        {
            if(mount.blockPosX == x && mount.blockPosY == y && mount.blockPosZ == z)
            {
                if(!mount.isBeingRidden())
                {
                    par5EntityPlayer.startRiding(mount);
                }
                return true;
            }
        }
        return false;
    }

    public static boolean isSomeoneSitting(World world, double x, double y, double z)
    {
        List<EntitySittableBlock> listEMB = world.getEntitiesWithinAABB(EntitySittableBlock.class, new AxisAlignedBB(x, y, z, x + 1.0D, y + 1.0D, z + 1.0D).expand(1D, 1D, 1D));
        for(EntitySittableBlock mount : listEMB)
        {
            if(mount.blockPosX == x && mount.blockPosY == y && mount.blockPosZ == z)
            {
                return mount.isBeingRidden();
            }
        }
        return false;
    }
}
 
13
1
Java:
public class SittableUtil
{

    public static boolean sitOnBlock(World par1World, double x, double y, double z, EntityPlayer par5EntityPlayer, double par6)
    {
        if(!checkForExistingEntity(par1World, x, y, z, par5EntityPlayer))
        {
            EntitySittableBlock nemb = new EntitySittableBlock(par1World, x, y, z, par6);
            par1World.spawnEntity(nemb);
            par5EntityPlayer.startRiding(nemb);
        }
        return true;
    }

    public static boolean sitOnBlockWithRotationOffset(World par1World, double x, double y, double z, EntityPlayer par5EntityPlayer, double par6, int metadata, double offset)
    {
        if(!checkForExistingEntity(par1World, x, y, z, par5EntityPlayer) && !par1World.isRemote)
        {
            EntitySittableBlock nemb = new EntitySittableBlock(par1World, x, y, z, par6, metadata, offset);
            par1World.spawnEntity(nemb);
            par5EntityPlayer.startRiding(nemb);
        }
        return true;
    }

    public static boolean checkForExistingEntity(World par1World, double x, double y, double z, EntityPlayer par5EntityPlayer)
    {
        List<EntitySittableBlock> listEMB = par1World.getEntitiesWithinAABB(EntitySittableBlock.class, new AxisAlignedBB(x, y, z, x + 1.0D, y + 1.0D, z + 1.0D).expand(1D, 1D, 1D));
        for(EntitySittableBlock mount : listEMB)
        {
            if(mount.blockPosX == x && mount.blockPosY == y && mount.blockPosZ == z)
            {
                if(!mount.isBeingRidden())
                {
                    par5EntityPlayer.startRiding(mount);
                }
                return true;
            }
        }
        return false;
    }

    public static boolean isSomeoneSitting(World world, double x, double y, double z)
    {
        List<EntitySittableBlock> listEMB = world.getEntitiesWithinAABB(EntitySittableBlock.class, new AxisAlignedBB(x, y, z, x + 1.0D, y + 1.0D, z + 1.0D).expand(1D, 1D, 1D));
        for(EntitySittableBlock mount : listEMB)
        {
            if(mount.blockPosX == x && mount.blockPosY == y && mount.blockPosZ == z)
            {
                return mount.isBeingRidden();
            }
        }
        return false;
    }
}
А можно поподробнее про EntitySittableBlock? Это кастомный класс?
 
Последнее редактирование:
7,099
324
1,510
Потому, что ты садишься на сущность, а не на блок, и при удалении блока сущность не убираешь
 
5,018
47
783
Тут возникла маленькая проблема. Я не могу слезть. То есть при нажатии Shift я слезаю, но меня возвращает обратно и тогда происходит что-то в виде сидячего Shift. Даже разрушение блока не помогает!
Ты сущность зарегистрировал?
 
5,018
47
783
А метод "слезания" с сущности?
в sittableutil уже все есть. Просто в онАктивейшин напиши что надо:

Java:
    @Override
    public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ)
    {
        if(!playerIn.isSneaking())
        {
            if(SittableUtil.sitOnBlock(worldIn, pos.getX(), pos.getY(), pos.getZ(), playerIn, 7 * 0.0625))
            {
                return true;
            }
        }
        return false;
    }
 
13
1
А как сущность зарегать?
в sittableutil уже все есть. Просто в онАктивейшин напиши что надо:
Java:
@Override
    public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ)
    {
        if(!playerIn.isSneaking())
        {
            if(SittableUtil.sitOnBlock(worldIn, pos.getX(), pos.getY(), pos.getZ(), playerIn, 7 * 0.0625))
            {
                return true;
            }
        }
        return false;
    }
Сделал, но моя проблема со слезанием была описана выше
 
5,018
47
783
Скорее всего потому что ты не зарегал. В коммон прокси
Java:
EntityRegistry.registerModEntity(new ResourceLocation(SovietCore.MODID, "sit_block"), EntitySittableBlock.class, "sit_block", 49, SovietCore.INSTANCE, 80, 1, false);
 
Сверху