Posted February 13, 20169 yr I am trying to implement a block to reflect a light beam. First, the block needs to be placed facing up, down, and sideways along with facing in each direction. How would I implement this? Second, How would I render my block in half on each diagonal? Example Image:
February 13, 20169 yr Pretty sure those diagonal side faces are cheated. That is: they're still squares with fully transparent pixels. Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
February 13, 20169 yr Author Pretty sure those diagonal side faces are cheated. That is: they're still squares with fully transparent pixels. Still not sure on the rendering part. I was thinking about using EnumFacing$Plane.Horizontal for NESW, and EnumFacing$Plane.Vertical for up and down but that would leave out sideways. Should I make my own Enum that includes sideways or will it not work correctly?
February 13, 20169 yr You can probably use an EnumFacing property limited to Plane.HORIZONTAL for the y-axis rotation and a custom enum property with UP , DOWN and SIDEWAYS values for the x-axis rotation. You can integrate the custom enum with EnumFacing and its subclasses if needed. Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
February 13, 20169 yr Author You can probably use an EnumFacing property limited to Plane.HORIZONTAL for the y-axis rotation and a custom enum property with UP , DOWN and SIDEWAYS values for the x-axis rotation. You can integrate the custom enum with EnumFacing and its subclasses if needed. Would this be suitable? public class BlockReflector extends Block { public static final PropertyEnum POSITION = PropertyEnum.create("position", Position.class); public static final PropertyDirection FACING = PropertyDirection.create("facing", EnumFacing.Plane.HORIZONTAL); public BlockReflector() { super(Material.glass); } public enum Position implements IStringSerializable { UP("up"), NEUTRAL("neutral"), DOWN("down"); private final String name; Position(String name) { this.name = name; } @Override public String getName() { return this.name; } } }
February 13, 20169 yr That should be suitable, but you still need to create the BlockState and convert between state and metadata. Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
February 13, 20169 yr Author That should be suitable, but you still need to create the BlockState and convert between state and metadata. I have createBlockState but I am not sure how to implement getStateFromMeta and getMetaFromState.
February 13, 20169 yr I have createBlockState but I am not sure how to implement getStateFromMeta and getMetaFromState. I suggest storing the FACING values's horizontal index ( EnumFacing#getHorizontalIndex , an integer in the range [0,3] ) in the lower two bits of the metadata and the POSITION value's ordinal ( Position#ordinal , an integer in the range [0,2] ) or a similar index field in the higher two bits of the metadata. Shift the POSITION index left 2 bits ( << ) then OR ( | ) it with the FACING index. To get the FACING value from the metadata, AND ( & ) it with 3 (the maximum index) and use EnumFacing.getHorizontal to convert it to an EnumFacing . To get the POSITION value from the metadata, shift it right 2 bits ( >> ), AND it with 2 (the maximum index) and get the Position at that index of the array returned by Potion#values . I'll try to implement this myself to provide an example of how it's done. Edit: Correctly capitalised AND. Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
February 14, 20169 yr Author I have createBlockState but I am not sure how to implement getStateFromMeta and getMetaFromState. I suggest storing the FACING values's horizontal index ( EnumFacing#getHorizontalIndex , an integer in the range [0,3] ) in the lower two bits of the metadata and the POSITION value's ordinal ( Position#ordinal , an integer in the range [0,2] ) or a similar index field in the higher two bits of the metadata. Shift the POSITION index left 2 bits ( << ) then OR ( | ) it with the FACING index. To get the FACING value from the metadata, AND ( & ) it with 3 (the maximum index) and use EnumFacing.getHorizontal to convert it to an EnumFacing . To get the POSITION value from the metadata, shift it right 2 bits ( >> ), and it with 2 (the maximum index) and get the Position at that index of the array returned by Potion#values . I'll try to implement this myself to provide an example of how it's done. Is this correct? @Override public BlockState createBlockState() { return new BlockState(this, POSITION, FACING); } @Override public IBlockState getStateFromMeta(int meta) { return this.getDefaultState().withProperty(POSITION, Position.values()[(meta >> 2)]).withProperty(FACING, EnumFacing.getHorizontal((meta & 3))); } @Override public int getMetaFromState(IBlockState state) { int p = ((Position) state.getValue(POSITION)).ordinal(); int f = state.getValue(FACING).getIndex(); return p << 2 | f; }
February 14, 20169 yr That looks correct, yes. Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
February 14, 20169 yr Author That looks correct, yes. When I break the block with meta four and five the game crashes. Crash: java.lang.ArrayIndexOutOfBoundsException: 3 at luxcraft.block.BlockReflector.getStateFromMeta(BlockReflector.java:80) at net.minecraft.client.renderer.RenderGlobal.playAuxSFX(RenderGlobal.java:2287) at net.minecraft.world.World.playAuxSFXAtEntity(World.java:3827) at net.minecraft.world.World.playAuxSFX(World.java:3818) at net.minecraft.client.multiplayer.PlayerControllerMP.onPlayerDestroyBlock(PlayerControllerMP.java:159) at net.minecraft.client.multiplayer.PlayerControllerMP.clickBlockCreative(PlayerControllerMP.java:66) at net.minecraft.client.multiplayer.PlayerControllerMP.clickBlock(PlayerControllerMP.java:227) at net.minecraft.client.Minecraft.clickMouse(Minecraft.java:1511) at net.minecraft.client.Minecraft.runTick(Minecraft.java:2118) at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1080) at net.minecraft.client.Minecraft.run(Minecraft.java:380) at net.minecraft.client.main.Main.main(Main.java:116) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) at net.minecraft.launchwrapper.Launch.main(Launch.java:28) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) at GradleStart.main(GradleStart.java:26) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) Class: public class BlockReflector extends Block { public static final PropertyEnum POSITION = PropertyEnum.create("position", Position.class); public static final PropertyDirection FACING = PropertyDirection.create("facing", EnumFacing.Plane.HORIZONTAL); public BlockReflector() { super(Material.glass); } @Override public boolean isOpaqueCube() { return false; } @Override public boolean isFullCube() { return false; } @Override public boolean isVisuallyOpaque() { return false; } @Override public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumFacing side, float hitX, float hitY, float hitZ) { if(player.isSneaking()) { if(side.getAxis().isHorizontal()) { world.setBlockState(pos, state.cycleProperty(FACING)); } else { world.setBlockState(pos, state.cycleProperty(POSITION)); } } return false; } @Override public IBlockState onBlockPlaced(World world, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer) { IBlockState state = this.getDefaultState().withProperty(FACING, placer.getHorizontalFacing()); return hitY == 0 ? state.withProperty(POSITION, Position.UP) : hitY == 1 ? state.withProperty(POSITION, Position.DOWN) : state.withProperty(POSITION, Position.NEUTRAL); } @Override public BlockState createBlockState() { return new BlockState(this, POSITION, FACING); } @Override public IBlockState getStateFromMeta(int meta) { return this.getDefaultState().withProperty(POSITION, Position.values()[(meta >> 2)]).withProperty(FACING, EnumFacing.getHorizontal((meta & 3))); } @Override public int getMetaFromState(IBlockState state) { int p = ((Position) state.getValue(POSITION)).ordinal(); int f = state.getValue(FACING).getIndex(); return p << 2 | f; } public enum Position implements IStringSerializable { UP("up"), NEUTRAL("neutral"), DOWN("down"); private final String name; Position(String name) { this.name = name; } @Override public String getName() { return this.name; } } }
February 14, 20169 yr You need to AND the position index with 2 before you look it up in the values array. Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
February 14, 20169 yr Author I am using onBlockActivated to rotate the block. It works correctly on all of the blocks except meta four and five. When I cycle the POSITION property it only cycles between up and down instead of up, neutral, and down. @Override public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumFacing side, float hitX, float hitY, float hitZ) { if(player.isSneaking()) { if(side.getAxis().isHorizontal()) { world.setBlockState(pos, state.cycleProperty(FACING)); } else { //This cycles the POSITION property world.setBlockState(pos, state.cycleProperty(POSITION)); } } return false; }
February 14, 20169 yr I'm worried that AND 2 will mask out the value 1, leaving only 0 or 2. And what about Z-axis rotation? Is "X-axis" a misnomer? Is it really the facing-axis? Are all neutral orientations equivalent? Is there no difference between RIGHT and LEFT sideways reflections? Another nit: Since "position" already has a meaning in the game (for block coords), your code will be more clear if you choose another name for your second orientation property. The debugger is a powerful and necessary tool in any IDE, so learn how to use it. You'll be able to tell us more and get better help here if you investigate your runtime problems in the debugger before posting.
February 14, 20169 yr Author I'm worried that AND 2 will mask out the value 1, leaving only 0 or 2. I think that may be the issue, how would I fix it? And what about Z-axis rotation? Is "X-axis" a misnomer? Is it really the facing-axis? I rotate the block depending on whether the side is hit (X or Z axis) or the top/bottom is hit (Y axis). Are all neutral orientations equivalent? Is there no difference between RIGHT and LEFT sideways reflections? As for the sideways orientation there is a sideways orientation for each horizontal direction, sideways + north, sideways + east, sideways + south, and sideways + west. Edit: Renamed neutral to sideways
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.