Jump to content

thecodewarrior

Forge Modder
  • Posts

    13
  • Joined

  • Last visited

  • Days Won

    1

Everything posted by thecodewarrior

  1. For anyone who comes across this in the future, running with `--no-daemon` seems to solve it https://github.com/MinecraftForge/ForgeGradle/issues/563
  2. Super duuuuper necro post, but for anyone who finds themselves here after trying the srgExtra line, it's been changed in newer versions of gradle (2.2-SNAPSHOT I know, but maybe even earlier). Now instead of doing: minecraft { ... srgExtra "PK: ..." } You have to do: reobf { jar { extraLine "PK: ..." } } Relevant XKCD: https://xkcd.com/979/
  3. The dropdowns on the downloads page will clobber each other. When you hover over 1.9 and move your mouse down it'll trigger the 1.8 dropdown. It's a pretty simple fix: Add/change the following in style.css .versions .links > li .versions-info - width: 0; - transition: max-height 0.2s ease-in-out, width 0s linear 0.2s; .versions .links > li:hover .versions-info - width: 150px; - transition: max-height 0.2s ease-in-out, width 0s linear 0s; .downloads div.download .links .link:hover .promo-download-info - width: 150px; - transition: max-height 0.2s ease-in-out, width 0s linear 0s; .downloads div.download .links .link .promo-download-info - width: 0; - transition: max-height 0.2s ease-in-out, width 0s linear 0.2s;
  4. A bit of a necropost, but I got something that looks ok. YMMV on the Y translation, as my block isn't exactly normally sized. "thirdperson": { "translation": [ 0, 0.125, -0.1 ], "rotation": [ {"x":0}, {"y":-45}, {"z":180} ], "scale": [ 0.375, 0.375, 0.375 ] }
  5. Mainly to test how my mod will deal with it. It does player movement and I want to know if the client will properly simulate the motion client side with server latency, and if the server will complain if there is latency and it thinks the player is flying. On a related note. If I have motion simulated on the server as well as the client and the player is mid-air, will the server complain that the player is flying?
  6. Is there any mod out there for creating lag on purpose? I need to cause server-client latency, but I'm sure tick and framerate lag would be useful for some people.
  7. I can't seem to get the NEI API working. The closest I've gotten is adding NotEnoughItems-1.7.10-x.xx.xxx-dev.jar as a referenced library, but that requires me to add CodeChickenCore and CodeChickenLib as referenced libraries before it'll launch without errors. It also essentially bundles NEI with my mod when building from eclipse. It doesn't export (gradle build) with NEI bundled, but then the NEI integration just plain doesn't work. I just wanted to hide some items! *throws computer at wall* I've spent several hours trying to find a tutorial that doesn't effectively say "add it as a referenced library, you're done!" Because that won't work no matter what I do.
  8. Try returning this.INFINITE_EXTENT_AABB
  9. So, I figured out how to do it: Normal tracks: (extends BlockRail) - Nothing special, just extend and you're good to go. Detector track: (extends BlockRailDetector) - Nothing special, just extend and you're good to go. Booster tracks: (extends BlockRailPowered) - Add this method, it'll deal with the boosting stuff (this is stolen from the bottom of EntityMinecart#func_145821_a) public void onMinecartPass(World world, EntityMinecart cart, int x, int y, int z) { int railMeta = this.getBasicRailMetadata(world, cart, x, y, z); int meta = world.getBlockMetadata(x,y,z); double d15 = Math.sqrt(cart.motionX * cart.motionX + cart.motionZ * cart.motionZ); if( (meta & == 0) return; if (d15 > 0.01D) { double d16 = 0.06D; cart.motionX += cart.motionX / d15 * d16; cart.motionZ += cart.motionZ / d15 * d16; } else if (railMeta == 1) { if (cart.worldObj.getBlock(x - 1, y, z).isNormalCube()) { cart.motionX = 0.02D; } else if (cart.worldObj.getBlock(x + 1, y, z).isNormalCube()) { cart.motionX = -0.02D; } } else if (railMeta == 0) { if (cart.worldObj.getBlock(x, y, z - 1).isNormalCube()) { cart.motionZ = 0.02D; } else if (cart.worldObj.getBlock(x, y, z + 1).isNormalCube()) { cart.motionZ = -0.02D; } } } Activator tracks: (extends BlockRail) - Add this method, it'll activate any passing minecarts when active public void onMinecartPass(World world, EntityMinecart cart, int x, int y, int z) { int meta = world.getBlockMetadata(x, y, z); boolean active = (meta & != 0; // use 0x8 bit of metadata to control track // boolean active = world.isBlockIndirectlyGettingPowered(x, y, z); // use redstone to control track cart.onActivatorRailPass(x, y, z, active); } - Add these methods, they'll deal with making it not turn like a normal track public boolean isPowered() { return true; } public boolean isFlexibleRail(IBlockAccess world, int y, int x, int z) { return false; }
  10. 1.7.10, did you get booster tracks to work too?
  11. Is there any way to add custom minecart tracks that behave identically to the vanilla tracks without having to re-implement the minecart logic in some event handler somewhere? I looked at the minecart code and it's all using == checks and not instanceof, so I can't just inherit from the track I want to mimic. I'm trying to make tracks that don't need a supporting block by inheriting from BlockRailBase, but the tracks stop the minecart almost immediately after it goes onto them, and the player can only inch forward when in the minecart. I even set the max speed to 1.0 (20 blocks/sec) and it didn't help, it's as if the minecart thinks it's on the ground, not a track. I can post code if you need it, but it's pretty uneventful, just inherit from BlockRailBase, canPlace returns true, and some special right-click logic.
  12. Thanks! That did the trick. (Excuse me while I bang my head against my desk a few dozen times. *WACK* *WACK* ... *WACK* *WACK* *sigh* Ok, I'm all better)
  13. I have two blocks that don't seem to mark sub chunks as containing anything, so when there aren't any other blocks in the sub chunk it doesn't render. My block classes: BlockCatwalk package com.thecodewarrior.catwalks; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Set; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; 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.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.IIcon; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.MovingObjectPosition.MovingObjectType; import net.minecraft.util.Vec3; import net.minecraft.world.Explosion; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.client.event.DrawBlockHighlightEvent; import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.event.ForgeEventFactory; import buildcraft.api.tools.IToolWrench; import codechicken.lib.raytracer.ExtendedMOP; import codechicken.lib.raytracer.IndexedCuboid6; import codechicken.lib.raytracer.RayTracer; import codechicken.lib.vec.BlockCoord; import codechicken.lib.vec.Cuboid6; import codechicken.lib.vec.Vector3; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; public class BlockCatwalk extends Block implements ICagedLadderConnectable { public boolean lights; public boolean bottom; private RayTracer rayTracer = new RayTracer(); public IIcon transparent; public IIcon sideTexture; public IIcon bottomTexture; public IIcon bottomTextureWithLights; public IIcon sideTextureWithLights; public IIcon bottomLights; public IIcon sideLights; public BlockCatwalk(boolean lights, boolean bottom) { super(Material.iron); setHardness(1.0F); setStepSound(Block.soundTypeMetal); setBlockName("catwalk"); if(lights && !bottom) setCreativeTab(CreativeTabs.tabTransport); // setHarvestLevel("wrench", 0); // setHarvestLevel("pickaxe", 0); this.lights = lights; this.bottom = bottom; } //============================================================================== // Clicking methods //============================================================================== public float getPlayerRelativeBlockHardness(EntityPlayer player, World world, int x, int y, int z){ int metadata = world.getBlockMetadata(x, y, z); float hardness = blockHardness; if(player.getHeldItem() != null ) { boolean shouldBeSoft = false; if(player.getHeldItem().getItem() instanceof IToolWrench) shouldBeSoft = true; Set<String> toolClasses = player.getHeldItem().getItem().getToolClasses(player.getHeldItem()); if(toolClasses.contains("wrench")) shouldBeSoft = true; if(shouldBeSoft) hardness = blockHardness/10; } return player.getBreakSpeed(this, false, metadata, x, y, z) / hardness / 30F; } @Override public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player) { MovingObjectPosition hit = RayTracer.retraceBlock(world, player, x, y, z); ForgeDirection side = ForgeDirection.UP; if (hit != null) { side = (ForgeDirection) ( (ExtendedMOP) hit ).data; } if(player.getCurrentEquippedItem() != null && player.getCurrentEquippedItem().getItem() instanceof IToolWrench) { if(player.isSneaking()) { this.dropBlockAsItem(world, x, y, z, 0, 0); world.setBlockToAir(x,y,z); this.updateNeighborSides(world, x, y, z, false); } } } @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int blockSide, float hitX, float hitY, float hitZ) { MovingObjectPosition hit = RayTracer.retraceBlock(world, player, x, y, z); ForgeDirection side = ForgeDirection.UP; if (hit != null) { side = (ForgeDirection) ( (ExtendedMOP) hit ).data; } if(player.getCurrentEquippedItem() != null && player.getCurrentEquippedItem().getItem() instanceof IToolWrench) { if(player.isSneaking()) { if(this.lights) { if(!world.isRemote) { world.spawnEntityInWorld(new EntityItem(world, x+0.5, y+0.5, z+0.5, new ItemStack(CatwalkMod.itemRopeLight, 1))); updateData(world, x, y, z, ForgeDirection.UP, false, false); } } } else { if(side != ForgeDirection.UP) { updateData(world,x,y,z, side, !getOpenState(world,x,y,z, side), this.lights); } } } if(player.getCurrentEquippedItem() != null && player.getCurrentEquippedItem().getItem() instanceof ItemRopeLight && this.lights == false) { updateData(world, x, y, z, ForgeDirection.UP, false, true); if(!player.capabilities.isCreativeMode) player.getCurrentEquippedItem().stackSize--; } // // if() return false; } //============================================================================== // Place/Destroy methods //============================================================================== @Override public void onBlockPlacedBy(World w, int x, int y, int z, EntityLivingBase e, ItemStack s) { updateNeighborSides(w,x,y,z,true); } public void onBlockDestroyedByPlayer(World w, int x, int y, int z, int meta) { updateNeighborSides(w,x,y,z,false); } public void onBlockDestroyedByExplosion(World w, int x, int y, int z, Explosion e) { updateNeighborSides(w,x,y,z,false); } //============================================================================== // Drop methods //============================================================================== public ArrayList<ItemStack> getDrops(World world, int x, int y, int z, int metadata, int fortune) { ArrayList<ItemStack> ret = new ArrayList<ItemStack>(); ret.add(new ItemStack( Item.getItemFromBlock(CatwalkMod.catwalkUnlitBottom), 1)); if(this.lights) { ret.add(new ItemStack( CatwalkMod.itemRopeLight, 1 )); } return ret; } public boolean canHarvestBlock(EntityPlayer player, int meta) { return true; } //============================================================================== // Block highlight raytrace methods //============================================================================== @Override public MovingObjectPosition collisionRayTrace(World world, int x, int y, int z, Vec3 start, Vec3 end) { List<IndexedCuboid6> cuboids = new LinkedList<IndexedCuboid6>(); float px = 1/16F; int meta = world.getBlockMetadata(x, y, z); // System.out.println("META: " + (meta & ); boolean ovr = false; double d = 0; float smallHeight = 0.25f; if(bottom) { d = 0.125; //cuboids.add(new IndexedCuboid6(Hitboxes.BOTTOM, new Cuboid6(x+ px, y+ 0, z+ px, x+ 1-px, y+ px, z+ 1-px))); } else { d = 0.25; } cuboids.add(new IndexedCuboid6(ForgeDirection.DOWN, new Cuboid6(x+ d, y+ 0, z+ d, x+ 1-d, y+ px, z+ 1-d))); float ym = 1; if((meta & == 0 || ovr) { ym = 1; } else { ym = smallHeight; } cuboids.add(new IndexedCuboid6(ForgeDirection.NORTH, new Cuboid6( x+ 0, y+ 0, z+ 0, x+ 1, y+ ym, z+ px ))); if((meta & 4) == 0 || ovr) { ym = 1; } else { ym = smallHeight; } cuboids.add(new IndexedCuboid6(ForgeDirection.SOUTH, new Cuboid6( x+ 0, y+ 0, z+ 1-px, x+ 1, y+ ym, z+ 1 ))); if((meta & 2) == 0 || ovr) { ym = 1; } else { ym = smallHeight; } cuboids.add(new IndexedCuboid6(ForgeDirection.WEST, new Cuboid6( x+ 0, y+ 0, z+ 0, x+ px, y+ ym, z+ 1 ))); if((meta & 1) == 0 || ovr) { ym = 1; } else { ym = smallHeight; } cuboids.add(new IndexedCuboid6(ForgeDirection.EAST, new Cuboid6( x+ 1-px, y+ 0, z+ 0, x+ 1, y+ ym, z+ 1 ))); //new BlockCoord(x, y, z), this ExtendedMOP mop = (ExtendedMOP) rayTracer.rayTraceCuboids(new Vector3(start), new Vector3(end), cuboids, new BlockCoord(x, y, z), this); if(mop != null) { if(mop.sideHit == ((ForgeDirection)mop.data).getOpposite().ordinal()) { mop.sideHit = ((ForgeDirection)mop.data).ordinal(); } } // System.out.println(mop.data); return mop; } @SideOnly(Side.CLIENT) @SubscribeEvent public void onBlockHighlight(DrawBlockHighlightEvent event) { if (event.target.typeOfHit == MovingObjectType.BLOCK && event.player.worldObj.getBlock(event.target.blockX, event.target.blockY, event.target.blockZ) == this) RayTracer.retraceBlock(event.player.worldObj, event.player, event.target.blockX, event.target.blockY, event.target.blockZ); } //============================================================================== // Collision methods //============================================================================== @Override public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) { if (FMLCommonHandler.instance().getEffectiveSide() != Side.CLIENT) return; double mul = 1.315; if(entity instanceof EntityPlayer && ( (EntityPlayer)entity).isSneaking() ) { mul = 2.860578; } CatwalkMod.proxy.speedupPlayer(world, entity, mul); } @Override public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB blockBounds, List list, Entity collidingEntity) { if(collidingEntity == null) return; float px = 1/16F; int meta = world.getBlockMetadata(x, y, z); float top = 1.5F; if(collidingEntity.isSneaking()) top = 1.0F; boolean ovr = false; Cuboid6 oldBounds = new Cuboid6( this.getBlockBoundsMinX(), this.getBlockBoundsMinY(), this.getBlockBoundsMinZ(), this.getBlockBoundsMaxX(), this.getBlockBoundsMaxY(), this.getBlockBoundsMaxZ() ); if(bottom) { this.setBlockBounds(0, 0, 0, 1, px, 1); super.addCollisionBoxesToList(world, x, y, z, blockBounds, list, collidingEntity); } if((meta & == 0 || ovr) { if(getStepConnect(world,x,y,z,ForgeDirection.NORTH)) { this.setBlockBounds(0, 0, 0, 1, 1, px); } else { this.setBlockBounds(0, 0, 0, 1, top, px); } super.addCollisionBoxesToList(world, x, y, z, blockBounds, list, collidingEntity); } if((meta & 4) == 0 || ovr) { if(getStepConnect(world,x,y,z,ForgeDirection.SOUTH)) { this.setBlockBounds(0, 0, 1-px, 1, 1, 1); } else { this.setBlockBounds(0, 0, 1-px, 1, top, 1); } super.addCollisionBoxesToList(world, x, y, z, blockBounds, list, collidingEntity); } if((meta & 2) == 0 || ovr) { if(getStepConnect(world,x,y,z,ForgeDirection.WEST)) { this.setBlockBounds(0, 0, 0, px, 1, 1); } else { this.setBlockBounds(0, 0, 0, px, top, 1); } super.addCollisionBoxesToList(world, x, y, z, blockBounds, list, collidingEntity); } if((meta & 1) == 0 || ovr) { if(getStepConnect(world,x,y,z,ForgeDirection.EAST)) { this.setBlockBounds(1-px, 0, 0, 1, 1, 1); } else { this.setBlockBounds(1-px, 0, 0, 1, top, 1); } super.addCollisionBoxesToList(world, x, y, z, blockBounds, list, collidingEntity); } oldBounds.setBlockBounds(this); // this.setBlockBounds(0, 0, 0, 1, 1, 1); } public boolean getBlocksMovement(IBlockAccess p_149655_1_, int p_149655_2_, int p_149655_3_, int p_149655_4_) { return false; } //============================================================================== // Texture methods //============================================================================== @Override public void registerBlockIcons(IIconRegister reg) { transparent = reg.registerIcon("catwalks:transparent"); sideTexture = reg.registerIcon("catwalks:side"); bottomTexture = reg.registerIcon("catwalks:bottom"); sideTextureWithLights = reg.registerIcon("catwalks:side_with_lights"); bottomTextureWithLights = reg.registerIcon("catwalks:bottom_with_lights"); sideLights = reg.registerIcon("catwalks:side_lights"); bottomLights = reg.registerIcon("catwalks:bottom_lights"); } @Override public IIcon getIcon(int _side, int meta) { ForgeDirection dir = ForgeDirection.VALID_DIRECTIONS[_side]; /**/ if(dir == ForgeDirection.DOWN) { if(bottom) { return lights ? bottomTextureWithLights : bottomTexture; } } if(dir == ForgeDirection.NORTH && (meta & < 1) { return lights ? sideTextureWithLights : sideTexture; } if(dir == ForgeDirection.SOUTH && (meta & 4) < 1) { return lights ? sideTextureWithLights : sideTexture; } if(dir == ForgeDirection.WEST && (meta & 2) < 1) { return lights ? sideTextureWithLights : sideTexture; } if(dir == ForgeDirection.EAST && (meta & 1) < 1) { return lights ? sideTextureWithLights : sideTexture; } return transparent; /**/ } @Override public boolean isSideSolid(IBlockAccess w, int x, int y, int z, ForgeDirection side) { return !getOpenState(w,x,y,z,side);//getOpenState(w, x-side.offsetX, y-side.offsetY, z-side.offsetZ, side.getOpposite()); } @SideOnly(Side.CLIENT) public boolean shouldSideBeRendered(IBlockAccess w, int x, int y, int z, int _side) { ForgeDirection dir = ForgeDirection.getOrientation(_side); int meta = w.getBlockMetadata(x-dir.offsetX, y-dir.offsetY, z-dir.offsetZ); if(dir == ForgeDirection.DOWN && ( bottom == false || ( w.isSideSolid(x, y, z, ForgeDirection.UP, false) && !(w.getBlock(x,y,z) instanceof BlockCatwalk) ) )) { return false; } if(dir == ForgeDirection.NORTH && ( (meta & > 0 || ( w.isSideSolid(x, y, z, ForgeDirection.SOUTH, false) && !(w.getBlock(x,y,z) instanceof BlockCatwalk) ) )) { return false; } if(dir == ForgeDirection.SOUTH && ( (meta & 4) > 0 || ( w.isSideSolid(x, y, z, ForgeDirection.NORTH, false) )// && !(w.getBlock(x,y,z) instanceof BlockCatwalk) ) )) { return false; } if(dir == ForgeDirection.WEST && ( (meta & 2) > 0 || ( w.isSideSolid(x, y, z, ForgeDirection.EAST, false) && !(w.getBlock(x,y,z) instanceof BlockCatwalk) ) )) { return false; } if(dir == ForgeDirection.EAST && ( (meta & 1) > 0 || ( w.isSideSolid(x, y, z, ForgeDirection.WEST, false) )// && !(w.getBlock(x,y,z) instanceof BlockCatwalk) ) )) { return false; } return true; } /** * Gets the light value of the specified block coords. Args: x, y, z */ public int getLightValue() { return this.lights ? 15 : 0; } public int getRenderType(){ return CatwalkMod.catwalkRenderType; } @SideOnly(Side.CLIENT) public int getRenderBlockPass() { return 0; } public boolean isOpaqueCube() { return false; } } (I removed all the code for accessing data etc. here's the full class http://pastebin.com/HcXbYvVV) BlockCagedLadder: package com.thecodewarrior.catwalks; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; import buildcraft.api.tools.IToolWrench; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; 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.item.ItemStack; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.IIcon; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.MovingObjectPosition.MovingObjectType; import net.minecraft.util.Vec3; import net.minecraft.world.Explosion; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.client.event.DrawBlockHighlightEvent; import net.minecraftforge.common.util.ForgeDirection; import codechicken.lib.raytracer.ExtendedMOP; import codechicken.lib.raytracer.IndexedCuboid6; import codechicken.lib.raytracer.RayTracer; import codechicken.lib.vec.BlockCoord; import codechicken.lib.vec.Cuboid6; import codechicken.lib.vec.Vector3; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; public class BlockCagedLadder extends Block implements ICustomLadderVelocity, ICagedLadderConnectable { RayTracer rayTracer = new RayTracer(); public ForgeDirection direction; public boolean lights; public IIcon bottom; public IIcon bottom_with_lights; public IIcon bottom_lights; public IIcon ladder; public IIcon ladder_with_lights; public IIcon ladder_lights; public IIcon front; public IIcon front_with_lights; public IIcon front_lights; public IIcon side; public IIcon side_with_lights; public IIcon side_lights; public IIcon landing; public IIcon landing_side; public IIcon transparent; public Map<RelativeSide, Cuboid6> closed = new HashMap<RelativeSide, Cuboid6>(); public Map<RelativeSide, Cuboid6> open = new HashMap<RelativeSide, Cuboid6>(); // meta: bottom, front, left, right public BlockCagedLadder(ForgeDirection direction, boolean lights) { super(Material.iron); setHardness(1.0F); setStepSound(Block.soundTypeMetal); float px = 1/16F; setBlockBounds(px, 0, px, 1-px, 1, 1-px); setBlockName("cagedladder"); setStepSound(soundTypeLadder); if(direction == ForgeDirection.NORTH && !lights) setCreativeTab(CreativeTabs.tabTransport); setHarvestLevel("wrench", 0); setHarvestLevel("pickaxe", 0); this.lights = lights; this.direction = direction; initHitBoxes(); } //============================================================================== // Place/Destroy methods //============================================================================== @Override public void onBlockPlacedBy(World w, int x, int y, int z, EntityLivingBase e, ItemStack s) { updateNeighborSides(w,x,y,z,true); } public void onBlockDestroyedByPlayer(World w, int x, int y, int z, int meta) { updateNeighborSides(w,x,y,z,false); } public void onBlockDestroyedByExplosion(World w, int x, int y, int z, Explosion e) { updateNeighborSides(w,x,y,z,false); } public void updateNeighborSides(World world, int x, int y, int z, boolean self) { Block b = world.getBlock(x, y+1, z); if(b instanceof BlockCagedLadder) { // this.updateOpenData(world, x, y+1, z, RelativeSide.BOTTOM, false); // System.out.println("---"); ( (BlockCagedLadder)b ).updateBottom(world, x, y+1, z); // System.out.println("---"); } if(self) this.updateBottom(world, x, y, z); } public void updateBottom(World world, int x, int y, int z) { // System.out.println("UPD"); if(world.getBlock(x, y-1, z) instanceof BlockCagedLadder) { updateOpenData(world, x, y, z, RelativeSide.BOTTOM, true); } else { updateOpenData(world, x, y, z, RelativeSide.BOTTOM, false); } } //============================================================================== // Clicking methods //============================================================================== public float getPlayerRelativeBlockHardness(EntityPlayer player, World world, int x, int y, int z){ int metadata = world.getBlockMetadata(x, y, z); float hardness = blockHardness; if(player.getHeldItem() != null ) { boolean shouldBeSoft = false; if(player.getHeldItem().getItem() instanceof IToolWrench) shouldBeSoft = true; Set<String> toolClasses = player.getHeldItem().getItem().getToolClasses(player.getHeldItem()); if(toolClasses.contains("wrench")) shouldBeSoft = true; if(shouldBeSoft) hardness = blockHardness/10; } return player.getBreakSpeed(this, false, metadata, x, y, z) / hardness / 30F; } @Override public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player) { MovingObjectPosition hit = RayTracer.retraceBlock(world, player, x, y, z); RelativeSide side = RelativeSide.TOP; if (hit != null) { side = (RelativeSide) ( (ExtendedMOP) hit ).data; } // if(player.getCurrentEquippedItem() != null && player.getCurrentEquippedItem().getItem() instanceof IToolWrench) { // if(player.isSneaking()) { // // this.dropBlockAsItem(world, x, y, z, 0, 0); // world.setBlockToAir(x,y,z); // this.updateNeighborSides(world, x, y, z, false); // } // } } @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int blockSide, float hitX, float hitY, float hitZ) { MovingObjectPosition hit = RayTracer.retraceBlock(world, player, x, y, z); RelativeSide side = RelativeSide.TOP; if (hit != null) { side = (RelativeSide) ( (ExtendedMOP) hit ).data; } // System.out.println(side); ItemStack handStack = player.getCurrentEquippedItem(); if(handStack != null && handStack.getItem() instanceof IToolWrench) { if(player.isSneaking()) { if(this.lights) { if(!world.isRemote) { world.spawnEntityInWorld(new EntityItem(world, x+0.5, y+0.5, z+0.5, new ItemStack(CatwalkMod.itemRopeLight, 1))); updateIdData(world, x, y, z, direction, false); } } } else { // System.out.println("META: " + world.getBlockMetadata(x,y,z)); updateOpenData(world, x, y, z, side, !isOpen(side, world.getBlockMetadata(x, y, z))); // System.out.println("META2: " + world.getBlockMetadata(x,y,z)); } } if(player.getCurrentEquippedItem() != null && player.getCurrentEquippedItem().getItem() instanceof ItemRopeLight && this.lights == false) { updateIdData(world, x, y, z, direction, true); if(!player.capabilities.isCreativeMode) player.getCurrentEquippedItem().stackSize--; } return false; } //============================================================================== // ILadderCustomVelocity methods //============================================================================== @Override public boolean isOnLadder(IBlockAccess world, int x, int y, int z, EntityLivingBase entity) { float px = 1/16F; float px2 = 2*px; float d = px*3; return CatwalkMod.options.fullBlockLadder || entity.boundingBox.intersectsWith(AxisAlignedBB.getBoundingBox(x+d, y, z+d, x+1-d, y+1, z+1-d)); } public double getLadderVelocity(IBlockAccess world, int x, int y, int z, EntityLivingBase entity) { return entity.isSneaking() ? 0.15D : 0.25D; } public double getLadderFallVelocity(IBlockAccess world, int x, int y, int z, EntityLivingBase entity) { return 0.25D; } //============================================================================== // Block highlight raytrace methods //============================================================================== @Override public MovingObjectPosition collisionRayTrace(World world, int x, int y, int z, Vec3 start, Vec3 end) { List<IndexedCuboid6> cuboids = new LinkedList<IndexedCuboid6>(); float ym = 1; float px = 1/16F; float px2 = 2*px; float outsideDistance = 1/32F; float insideDistance = 3/32F; float out = px/2; float in = out+px; int meta = world.getBlockMetadata(x, y, z); if(!(world.getBlock(x, y+1, z) instanceof BlockCagedLadder)) { addToList(x, y, z, cuboids, RelativeSide.TOP, open.get(RelativeSide.TOP)); } for (RelativeSide rs : RelativeSide.values()) { if(rs == RelativeSide.LADDER) { addToList(x, y, z, cuboids, rs, closed.get(rs)); continue; } if(rs == RelativeSide.TOP) { continue; } if(isOpen(rs, meta)) { addToList(x, y, z, cuboids, rs, open.get(rs)); } else { addToList(x, y, z, cuboids, rs, closed.get(rs)); } } ExtendedMOP mop = (ExtendedMOP) rayTracer.rayTraceCuboids(new Vector3(start), new Vector3(end), cuboids, new BlockCoord(x, y, z), this); if(mop != null) { if(mop.sideHit == RelativeSide.RStoFD( (RelativeSide)mop.data, direction).getOpposite().ordinal()) { mop.sideHit = ForgeDirection.getOrientation(mop.sideHit).getOpposite().ordinal(); } } // System.out.println(mop.data); return mop; } public void addToList(int x, int y, int z, List<IndexedCuboid6> list, Object data, Cuboid6 cuboid) { list.add( new IndexedCuboid6(data, new Cuboid6( x+cuboid.min.x, y+cuboid.min.y, z+cuboid.min.z, x+cuboid.max.x, y+cuboid.max.y, z+cuboid.max.z )) ); } @SideOnly(Side.CLIENT) @SubscribeEvent public void onBlockHighlight(DrawBlockHighlightEvent event) { if (event.target.typeOfHit == MovingObjectType.BLOCK && event.player.worldObj.getBlock(event.target.blockX, event.target.blockY, event.target.blockZ) == this) RayTracer.retraceBlock(event.player.worldObj, event.player, event.target.blockX, event.target.blockY, event.target.blockZ); } //============================================================================== // Texture methods //============================================================================== @Override public void registerBlockIcons(IIconRegister reg) { transparent = reg.registerIcon("catwalks:transparent"); bottom = reg.registerIcon("catwalks:ladder/bottom"); bottom_with_lights = reg.registerIcon("catwalks:ladder/bottom_with_lights"); bottom_lights = reg.registerIcon("catwalks:ladder/bottom_lights"); ladder = reg.registerIcon("catwalks:ladder/ladder"); ladder_with_lights = reg.registerIcon("catwalks:ladder/ladder_with_lights"); ladder_lights = reg.registerIcon("catwalks:ladder/ladder_lights"); front = reg.registerIcon("catwalks:ladder/front"); front_with_lights = reg.registerIcon("catwalks:ladder/front_with_lights"); front_lights = reg.registerIcon("catwalks:ladder/front_lights"); side = reg.registerIcon("catwalks:ladder/side"); side_with_lights = reg.registerIcon("catwalks:ladder/side_with_lights"); side_lights = reg.registerIcon("catwalks:ladder/side_lights"); landing = reg.registerIcon("catwalks:ladder/landing"); landing_side = reg.registerIcon("catwalks:ladder/landing_side"); } @Override public IIcon getIcon(int _side, int meta) { RelativeSide dir = RelativeSide.FDtoRS( ForgeDirection.getOrientation(_side), direction ); switch(dir) { case LADDER: if(lights) return ladder_with_lights; else return ladder; case FRONT: if(lights) return front_with_lights; else return front; case LEFT: case RIGHT: if(lights) return side_with_lights; else return side; case BOTTOM: if(lights) return bottom_with_lights; else return bottom; } return transparent; } public IIcon getLightIcon(int _side, int meta) { RelativeSide dir = RelativeSide.FDtoRS( ForgeDirection.getOrientation(_side) , direction); switch(dir) { case LADDER: return ladder_lights; case FRONT: return front_lights; case LEFT: case RIGHT: return side_lights; case BOTTOM: return transparent;//bottom_lights; } return transparent; } @Override public boolean isSideSolid(IBlockAccess w, int x, int y, int z, ForgeDirection side) { if(side == ForgeDirection.UP) return false; return !isOpen(RelativeSide.FDtoRS(side, direction), w.getBlockMetadata(x,y,z)); } @SideOnly(Side.CLIENT) public boolean shouldSideBeRendered(IBlockAccess w, int x, int y, int z, int _side) { ForgeDirection dir = ForgeDirection.getOrientation(_side); if(dir == ForgeDirection.DOWN) { if(w.isSideSolid(x, y, z, ForgeDirection.DOWN, false)) return false; } int meta = w.getBlockMetadata(x-dir.offsetX, y-dir.offsetY, z-dir.offsetZ); if(isOpen(RelativeSide.FDtoRS(dir, direction), meta)) { return false; } return true; } //============================================================================== // Collision methods //============================================================================== @Override public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB blockBounds, List list, Entity collidingEntity) { if(collidingEntity == null) return; float px = 1/16F; float out = px;///2; float in = out+px; int meta = world.getBlockMetadata(x, y, z); if(!isOpen(RelativeSide.FDtoRS(ForgeDirection.NORTH, direction), meta)) { addToList(world, x, y, z, blockBounds, list, out, 0, out, 1-out, 1, in); } if(!isOpen(RelativeSide.FDtoRS(ForgeDirection.SOUTH, direction), meta)) { addToList(world, x, y, z, blockBounds, list, out, 0, 1-out, 1-out, 1, 1-in); } if(!isOpen(RelativeSide.FDtoRS(ForgeDirection.EAST, direction), meta)) { addToList(world, x, y, z, blockBounds, list, 1-in, 0, out, 1-out, 1, 1-out); } if(!isOpen(RelativeSide.FDtoRS(ForgeDirection.WEST, direction), meta)) { addToList(world, x, y, z, blockBounds, list, out, 0, out, in, 1, 1-out); } } public void addToList(World world, int x, int y, int z, AxisAlignedBB blockBounds, List list, double minX, double minY, double minZ, double maxX, double maxY, double maxZ) { AxisAlignedBB axisalignedbb1 = AxisAlignedBB.getBoundingBox( (double)x + minX, (double)y + minY, (double)z + minZ, (double)x + maxX, (double)y + maxY, (double)z + maxZ ); if (axisalignedbb1 != null && blockBounds.intersectsWith(axisalignedbb1)) { list.add(axisalignedbb1); } } @Override public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) { // System.out.println("COLLIDE!"); } //============================================================================== // Render type methods //============================================================================== public int getRenderType(){ return CatwalkMod.ladderRenderType; } @SideOnly(Side.CLIENT) public int getRenderBlockPass() { return 0; } public boolean isOpaqueCube() { return false; } @SideOnly(Side.CLIENT) public boolean isBlockNormalCube() { return super.isBlockNormalCube(); } public boolean isNormalCube() { return false; } public static enum RelativeSide { LADDER, FRONT, LEFT, RIGHT, TOP, BOTTOM; } } (I removed all the code for accessing data etc. here's the full class http://pastebin.com/8z2dUkAj) The code for the BlockCagedLadder ISBRH is quite complex (~400 lines), so unless you want it I'll just leave it out. package com.thecodewarrior.catwalks; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; import net.minecraft.world.IBlockAccess; import net.minecraftforge.common.util.ForgeDirection; import org.lwjgl.opengl.GL11; import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; public class CatwalkRenderer implements ISimpleBlockRenderingHandler { @Override public void renderInventoryBlock(Block block, int meta, int modelId, RenderBlocks renderer) { boolean lights = false; boolean bottom = true; if(block instanceof BlockCatwalk) { lights = ( (BlockCatwalk)block).lights; bottom = ( (BlockCatwalk)block).bottom; } renderer.overrideBlockBounds(0, 0, 0, 1, 1, 1); Tessellator tessellator = Tessellator.instance; GL11.glTranslatef(-0.5F, -0.5F, -0.5F); tessellator.startDrawingQuads(); renderer.renderFromInside = true; renderer.renderFaceYNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 0, meta)); renderer.renderFaceYPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 1, meta)); renderer.renderFaceZNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 2, meta)); renderer.renderFaceZPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 3, meta)); renderer.renderFaceXNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 4, meta)); renderer.renderFaceXPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 5, meta)); renderer.renderFromInside = false; renderer.renderFaceYNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 0, meta)); renderer.renderFaceYPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 1, meta)); renderer.renderFaceZNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 2, meta)); renderer.renderFaceZPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 3, meta)); renderer.renderFaceXNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 4, meta)); renderer.renderFaceXPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 5, meta)); tessellator.draw(); GL11.glTranslatef(0.5F, 0.5F, 0.5F); renderer.unlockBlockBounds(); } @Override public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { boolean lights = false; boolean bottom = true; if(block instanceof BlockCatwalk) { lights = ( (BlockCatwalk)block).lights; bottom = ( (BlockCatwalk)block).bottom; } // renderer.renderFromInside = true; // renderer.renderStandardBlock(block, x, y, z); // RenderBlocks renderer = new RenderBlocks(world); // renderer.setRenderFromInside(true); // renderer.setRenderBounds(0.0D, 0.0D, 0.0D, 1.0D, 1.0D, 1.0D); renderer.overrideBlockBounds(0, 0, 0, 1, 1, 1); renderer.renderFromInside = true; renderer.renderStandardBlock(block, x, y, z); renderer.renderFromInside = false; renderer.renderStandardBlock(block, x, y, z); boolean force = false; if(lights) { BlockCatwalk b = ((BlockCatwalk) block); boolean oldAO = renderer.enableAO; renderer.enableAO = false; Tessellator.instance.setBrightness(15728880); renderer.renderFromInside = true; if( b.shouldSideBeRendered(world, x, y-1, z, 0) || force) renderer.renderFaceYNeg(b, x, y, z, b.bottomLights); if( b.shouldSideBeRendered(world, x, y, z-1, 2) || force) renderer.renderFaceZNeg(b, x, y, z, b.sideLights); if( b.shouldSideBeRendered(world, x, y, z+1, 3) || force) renderer.renderFaceZPos(b, x, y, z, b.sideLights); if( b.shouldSideBeRendered(world, x-1, y, z, 4) || force ) renderer.renderFaceXNeg(b, x, y, z, b.sideLights); if( b.shouldSideBeRendered(world, x+1, y, z, 5) || force ) renderer.renderFaceXPos(b, x, y, z, b.sideLights); renderer.renderFromInside = false; if( b.shouldSideBeRendered(world, x, y-1, z, 0) || force) renderer.renderFaceYNeg(b, x, y, z, b.bottomLights); if( b.shouldSideBeRendered(world, x, y, z-1, 2) || force) renderer.renderFaceZNeg(b, x, y, z, b.sideLights); if( b.shouldSideBeRendered(world, x, y, z+1, 3) || force) renderer.renderFaceZPos(b, x, y, z, b.sideLights); if( b.shouldSideBeRendered(world, x-1, y, z, 4) || force ) renderer.renderFaceXNeg(b, x, y, z, b.sideLights); if( b.shouldSideBeRendered(world, x+1, y, z, 5) || force ) renderer.renderFaceXPos(b, x, y, z, b.sideLights); renderer.enableAO = oldAO; } renderer.unlockBlockBounds(); renderer.clearOverrideBlockTexture(); return false; } @Override public boolean shouldRender3DInInventory(int modelId) { return true; } @Override public int getRenderId() { return CatwalkMod.catwalkRenderType; } }
×
×
  • Create New...

Important Information

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