/
Belyash5
/
Flu
Обзор
Документация
Войти
/
Belyash5
/
Flu
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/main/java/com/hbm/blocks/network/BlockConveyorBase.java
178 строк
6 KB
George Paton
new conveyor wand item that masquerades as a conveyor block, performing autoplacement! (from downstream spacefork)
31 мар 2025, 10:19
31 мар 2025, 10:19
e02142d
Код
Авторство
О чём код?
package com.hbm.blocks.network; import api.hbm.conveyor.IConveyorBelt; import com.hbm.blocks.ITooltipProvider; import com.hbm.entity.item.EntityMovingItem; import com.hbm.lib.RefStrings; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; 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.MathHelper; import net.minecraft.util.Vec3; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import java.util.List; public abstract class BlockConveyorBase extends Block implements IConveyorBelt, ITooltipProvider { @SideOnly(Side.CLIENT) protected IIcon sideIcon; public BlockConveyorBase() { super(Material.iron); } @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iconRegister) { super.registerBlockIcons(iconRegister); this.sideIcon = iconRegister.registerIcon(RefStrings.MODID + ":conveyor_side"); } @Override @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int metadata) { if((metadata == 2 || metadata == 3) && (side == 4 || side == 5)) return this.sideIcon; if((metadata == 4 || metadata == 5) && (side == 2 || side == 3)) return this.sideIcon; return super.getIcon(side, metadata); } @Override public boolean canItemStay(World world, int x, int y, int z, Vec3 itemPos) { return true; } @Override public Vec3 getTravelLocation(World world, int x, int y, int z, Vec3 itemPos, double speed) { ForgeDirection dir = this.getTravelDirection(world, x, y, z, itemPos); //snapping point Vec3 snap = this.getClosestSnappingPosition(world, x, y, z, itemPos); //snapping point + speed Vec3 dest = Vec3.createVectorHelper(snap.xCoord - dir.offsetX * speed, snap.yCoord - dir.offsetY * speed, snap.zCoord - dir.offsetZ * speed); //delta to get to that point Vec3 motion = Vec3.createVectorHelper((dest.xCoord - itemPos.xCoord), (dest.yCoord - itemPos.yCoord), (dest.zCoord - itemPos.zCoord)); double len = motion.lengthVector(); //the effective destination towards "dest" after taking speed into consideration Vec3 ret = Vec3.createVectorHelper(itemPos.xCoord + motion.xCoord / len * speed, itemPos.yCoord + motion.yCoord / len * speed, itemPos.zCoord + motion.zCoord / len * speed); return ret; } public ForgeDirection getInputDirection(World world, int x, int y, int z) { return ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)); } public ForgeDirection getOutputDirection(World world, int x, int y, int z) { return ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)).getOpposite(); } public ForgeDirection getTravelDirection(World world, int x, int y, int z, Vec3 itemPos) { return ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)); } @Override public Vec3 getClosestSnappingPosition(World world, int x, int y, int z, Vec3 itemPos) { ForgeDirection dir = this.getTravelDirection(world, x, y, z, itemPos); itemPos.xCoord = MathHelper.clamp_double(itemPos.xCoord, x, x + 1); itemPos.zCoord = MathHelper.clamp_double(itemPos.zCoord, z, z + 1); double posX = x + 0.5; double posZ = z + 0.5; if(dir.offsetX != 0) { posX = itemPos.xCoord; } if(dir.offsetZ != 0) { posZ = itemPos.zCoord; } return Vec3.createVectorHelper(posX, y + 0.25, posZ); } @Override public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) { if(!world.isRemote) { if(entity instanceof EntityItem && entity.ticksExisted > 10 && !entity.isDead) { EntityMovingItem item = new EntityMovingItem(world); item.setItemStack(((EntityItem) entity).getEntityItem().copy()); Vec3 pos = Vec3.createVectorHelper(entity.posX, entity.posY, entity.posZ); Vec3 snap = this.getClosestSnappingPosition(world, x, y, z, pos); item.setPositionAndRotation(snap.xCoord, snap.yCoord, snap.zCoord, 0, 0); world.spawnEntityInWorld(item); entity.setDead(); } } } public static int renderID = RenderingRegistry.getNextAvailableRenderId(); @Override public int getRenderType() { return renderID; } @Override public boolean isOpaqueCube() { return false; } @Override public boolean renderAsNormalBlock() { return false; } @Override public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.25F, 1.0F); } @Override public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { return AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y + 0.25, z + 1); } @Override public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; if(i == 0) { world.setBlockMetadataWithNotify(x, y, z, 2, 2); } if(i == 1) { world.setBlockMetadataWithNotify(x, y, z, 5, 2); } if(i == 2) { world.setBlockMetadataWithNotify(x, y, z, 3, 2); } if(i == 3) { world.setBlockMetadataWithNotify(x, y, z, 4, 2); } } @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { this.addStandardInfo(stack, player, list, ext); } }