Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

Posted

Hey guys, I trying to make some chairs for my mod, and at the moment most of my code seems to be working fine. I can mount the chairs but not dismount them. I have been looking at how other mods are making their chairs just for reference, no copy paste, and there seems to not be any difference, other than some variable naming.

 

Code can be found in the spoiler

 

 

 

EntityMountableBlock class

 

 

 



public class EntityMountableBlock extends Entity
{
public int blockPosX;
public int blockPosY;
public int blockPosZ;

public EntityMountableBlock(World world)
{
	super(world);
	this.noClip = true;
	this.height = 0.01F;
	this.width = 0.01F;
}

public EntityMountableBlock(World world, double x, double y, double z, double y0ffset)
{
	this(world);
	this.blockPosX = (int) x;
	this.blockPosY = (int) y;
	this.blockPosZ = (int) z;
	setPosition(x + 0.5D, y + y0ffset, z + 0.5D);
}

public EntityMountableBlock(World world, double x, double y, double z, double y0ffset, int rotation, double rotationOffset)
{
	this(world);
	this.blockPosX = (int) x;
	this.blockPosY = (int) y;
	this.blockPosZ = (int) z;
	setPostionConsideringRotation(x + 0.5D, y + y0ffset, z + 0.5D, rotation, rotationOffset);
}

public void setPostionConsideringRotation(double x, double y, double z, int rotation, double rotationOffset)
{
	switch (rotation)
	{
	case 2:
		z += rotationOffset;
		break;
	case 0:
		z -= rotationOffset;
		break;
	case 3:
		x -= rotationOffset;
		break;
	case 1:
		x += rotationOffset;
		break;
	}
	setPosition(x, y, z);
}

@Override
public double getMountedYOffset()
{
	return this.height * 0.0D;
}

@Override
protected boolean shouldSetPosAfterLoading()
{
	return false;
}

@Override
public void onEntityUpdate()
{
	if (!this.worldObj.isRemote)
	{
		if (this.isBeingRidden() || this.worldObj.isAirBlock(new BlockPos(blockPosX, blockPosY, blockPosZ)))
		{
			this.setDead();
			worldObj.updateComparatorOutputLevel(getPosition(), worldObj.getBlockState(getPosition()).getBlock());
		}
	}
}

@Override
protected void entityInit()
{
}

@Override
public void readEntityFromNBT(NBTTagCompound nbttagcompound)
{
}

@Override
public void writeEntityToNBT(NBTTagCompound nbttagcompound)
{
}

}
 

 

 

I register the entity like this in my base mod class

 

 

 



@EventHandler
public void init(FMLInitializationEvent event)
{
	proxy.init();

	CraftingRegistry.init();

	EntityRegistry.registerModEntity(EntityMountableBlock.class, "MountableBlock", 0, this, 80, 1, false);
}
 

 

 

MountableUtil class

 

 

 



public class MountableUtil
{
public static boolean sitOnBlock(World par1World, double x, double y, double z, EntityPlayer par5EntityPlayer, double par6)
{
	if (!checkForExistingEntity(par1World, x, y, z, par5EntityPlayer))
	{
		EntityMountableBlock nemb = new EntityMountableBlock(par1World, x, y, z, par6);
		par1World.spawnEntityInWorld(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))
	{
		EntityMountableBlock nemb = new EntityMountableBlock(par1World, x, y, z, par6, metadata, offset);
		par1World.spawnEntityInWorld(nemb);
		par5EntityPlayer.startRiding(nemb);
	}
	return true;
}

public static boolean checkForExistingEntity(World par1World, double x, double y, double z, EntityPlayer par5EntityPlayer)
{
	List<EntityMountableBlock> listEMB = par1World.getEntitiesWithinAABB(EntityMountableBlock.class, new AxisAlignedBB(x, y, z, x + 1.0D, y + 1.0D, z + 1.0D).expand(1D, 1D, 1D));
	for (EntityMountableBlock 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<EntityMountableBlock> listEMB = world.getEntitiesWithinAABB(EntityMountableBlock.class, new AxisAlignedBB(x, y, z, x + 1.0D, y + 1.0D, z + 1.0D).expand(1D, 1D, 1D));
	for (EntityMountableBlock mount : listEMB)
	{
		if (mount.blockPosX == x && mount.blockPosY == y && mount.blockPosZ == z)
		{
			return mount.isBeingRidden();
		}
	}
	return false;
}
}
 

 

 

ChairBlock Class

 

 

 



public class ChairBlock extends Block
{

public static final PropertyDirection FACING = PropertyDirection.create("facing", EnumFacing.Plane.HORIZONTAL);
protected static final double pixel = 1/16D;
protected static final AxisAlignedBB CHAIR_BOUNDING_AABB = new AxisAlignedBB(1*pixel, 0.0D, 1*pixel, 15*pixel, 21*pixel, 15*pixel);
private static final AxisAlignedBB CHAIR_BASE = new AxisAlignedBB(1*pixel, 0.0D, 1*pixel, 15*pixel, 8*pixel, 15*pixel);
private static final AxisAlignedBB CHAIR_BACKREST_NORTH = CollisionHelper.getBlockBounds(EnumFacing.NORTH, 1*pixel, 0.0D, 1*pixel, 15*pixel, 21*pixel, 15*pixel);
private static final AxisAlignedBB CHAIR_BACKREST_EAST = CollisionHelper.getBlockBounds(EnumFacing.EAST, 1*pixel, 0.0D, 1*pixel, 15*pixel, 21*pixel, 15*pixel);
private static final AxisAlignedBB CHAIR_BACKREST_SOUTH = CollisionHelper.getBlockBounds(EnumFacing.SOUTH, 1*pixel, 0.0D, 1*pixel, 15*pixel, 21*pixel, 15*pixel);
private static final AxisAlignedBB CHAIR_BACKREST_WEST = CollisionHelper.getBlockBounds(EnumFacing.WEST, 1*pixel, 0.0D, 1*pixel, 15*pixel, 21*pixel, 15*pixel);

public ChairBlock(String name)
{
	super(Material.WOOD);
	this.setUnlocalizedName(name);
	this.setRegistryName(name);
	this.setHardness(1.0F);
	this.setSoundType(SoundType.WOOD);
	this.isToolEffective("axe", getDefaultState());
	this.setCreativeTab(CreativeTabs.DECORATIONS);
	this.setDefaultState(this.blockState.getBaseState().withProperty(FACING, EnumFacing.NORTH));
}

@Override
public boolean isOpaqueCube(IBlockState state)
{
	return false;
}

@Override
public boolean isFullCube(IBlockState state)
{
	return false;
}

@Override
public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos)
    {
	return CHAIR_BOUNDING_AABB;
        
    }

@Override
public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, AxisAlignedBB axisAligned, List<AxisAlignedBB> axisAlignedList, Entity collidingEntity) 
{
	if (!(collidingEntity instanceof EntityMountableBlock))
	{
		EnumFacing facing = state.getValue(FACING);
		switch(facing) 
		{
		case NORTH:
			super.addCollisionBoxToList(pos, axisAligned, axisAlignedList, CHAIR_BACKREST_NORTH);
			break;
		case SOUTH:
			super.addCollisionBoxToList(pos, axisAligned, axisAlignedList, CHAIR_BACKREST_SOUTH);
			break;
		case WEST:
			super.addCollisionBoxToList(pos, axisAligned, axisAlignedList, CHAIR_BACKREST_WEST);
			break;
		default:
			super.addCollisionBoxToList(pos, axisAligned, axisAlignedList, CHAIR_BACKREST_EAST);
			break;
		}
		super.addCollisionBoxToList(pos, axisAligned, axisAlignedList, CHAIR_BASE);
	}
}

@Override
public IBlockState onBlockPlaced(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer)
{
	return super.onBlockPlaced(worldIn, pos, facing, hitX, hitY, hitZ, meta, placer).withProperty(FACING, placer.getHorizontalFacing());
}

@Override
public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ)
{
	if(MountableUtil.sitOnBlock(worldIn, pos.getX(), pos.getY(), pos.getZ(), playerIn, 7*pixel))
	{
		worldIn.updateComparatorOutputLevel(pos, this);
		return true;
	}
	return false;
}

@Override
public int getMetaFromState(IBlockState state)
{
        return state.getValue(FACING).getHorizontalIndex();
}

@Override
public IBlockState getStateFromMeta(int meta)
{
	return getDefaultState().withProperty(FACING, EnumFacing.getHorizontal(meta));
}

@Override
public BlockStateContainer createBlockState()
{
	return new BlockStateContainer(this, new IProperty[] { FACING });
}


@Override
public boolean hasComparatorInputOverride(IBlockState state) 
{
	return true;
}

@Override
public int getComparatorInputOverride(IBlockState blockState, World worldIn, BlockPos pos)
{
	return MountableUtil.isSomeoneSitting(worldIn, pos.getX(), pos.getY(), pos.getZ()) ? 1 : 0;
}
}
 

 

 

 

 

Edited by Erfurt

  • Author
3 hours ago, TheSunCat said:

Is it fixed?

Yes it is

 

I had to remove this code from my EntityMountableBlock class, not really sure why, but that fixed my issue

@Override
public void onEntityUpdate()
{
	if (!this.worldObj.isRemote)
	{
		if (this.isBeingRidden() || this.worldObj.isAirBlock(new BlockPos(blockPosX, blockPosY, blockPosZ)))
		{
			this.setDead();
			worldObj.updateComparatorOutputLevel(getPosition(), worldObj.getBlockState(getPosition()).getBlock());
		}
	}
}

I think the problem is that you are not explicitly dismounting the player from the chair entity.

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...

Important Information

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.