mirror of
https://github.com/SquidDev-CC/CC-Tweaked
synced 2025-01-26 08:56:54 +00:00
Merge pull request #227 from SquidDev-CC/ComputerCraft/feature/improved-cable
Improving cable/wired modem interactions
This commit is contained in:
commit
b2b8753ee7
@ -8,6 +8,8 @@ package dan200.computercraft.client.proxy;
|
|||||||
|
|
||||||
import dan200.computercraft.ComputerCraft;
|
import dan200.computercraft.ComputerCraft;
|
||||||
import dan200.computercraft.client.gui.*;
|
import dan200.computercraft.client.gui.*;
|
||||||
|
import dan200.computercraft.client.render.RenderOverlayCable;
|
||||||
|
import dan200.computercraft.client.render.TileEntityCableRenderer;
|
||||||
import dan200.computercraft.client.render.TileEntityMonitorRenderer;
|
import dan200.computercraft.client.render.TileEntityMonitorRenderer;
|
||||||
import dan200.computercraft.shared.computer.blocks.ComputerState;
|
import dan200.computercraft.shared.computer.blocks.ComputerState;
|
||||||
import dan200.computercraft.shared.computer.blocks.TileComputer;
|
import dan200.computercraft.shared.computer.blocks.TileComputer;
|
||||||
@ -19,6 +21,7 @@ import dan200.computercraft.shared.media.items.ItemDiskLegacy;
|
|||||||
import dan200.computercraft.shared.media.items.ItemPrintout;
|
import dan200.computercraft.shared.media.items.ItemPrintout;
|
||||||
import dan200.computercraft.shared.network.ComputerCraftPacket;
|
import dan200.computercraft.shared.network.ComputerCraftPacket;
|
||||||
import dan200.computercraft.shared.peripheral.diskdrive.TileDiskDrive;
|
import dan200.computercraft.shared.peripheral.diskdrive.TileDiskDrive;
|
||||||
|
import dan200.computercraft.shared.peripheral.modem.TileCable;
|
||||||
import dan200.computercraft.shared.peripheral.monitor.TileMonitor;
|
import dan200.computercraft.shared.peripheral.monitor.TileMonitor;
|
||||||
import dan200.computercraft.shared.peripheral.printer.TilePrinter;
|
import dan200.computercraft.shared.peripheral.printer.TilePrinter;
|
||||||
import dan200.computercraft.shared.pocket.inventory.ContainerPocketComputer;
|
import dan200.computercraft.shared.pocket.inventory.ContainerPocketComputer;
|
||||||
@ -221,6 +224,7 @@ public class ComputerCraftProxyClient extends ComputerCraftProxyCommon
|
|||||||
|
|
||||||
// Setup renderers
|
// Setup renderers
|
||||||
ClientRegistry.bindTileEntitySpecialRenderer( TileMonitor.class, new TileEntityMonitorRenderer() );
|
ClientRegistry.bindTileEntitySpecialRenderer( TileMonitor.class, new TileEntityMonitorRenderer() );
|
||||||
|
ClientRegistry.bindTileEntitySpecialRenderer( TileCable.class, new TileEntityCableRenderer() );
|
||||||
}
|
}
|
||||||
|
|
||||||
private void registerItemModel( Block block, int damage, String name )
|
private void registerItemModel( Block block, int damage, String name )
|
||||||
@ -449,6 +453,7 @@ public class ComputerCraftProxyClient extends ComputerCraftProxyCommon
|
|||||||
{
|
{
|
||||||
ForgeHandlers handlers = new ForgeHandlers();
|
ForgeHandlers handlers = new ForgeHandlers();
|
||||||
MinecraftForge.EVENT_BUS.register( handlers );
|
MinecraftForge.EVENT_BUS.register( handlers );
|
||||||
|
MinecraftForge.EVENT_BUS.register( new RenderOverlayCable() );
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ForgeHandlers
|
public class ForgeHandlers
|
||||||
|
@ -0,0 +1,215 @@
|
|||||||
|
package dan200.computercraft.client.render;
|
||||||
|
|
||||||
|
import dan200.computercraft.ComputerCraft;
|
||||||
|
import dan200.computercraft.shared.peripheral.PeripheralType;
|
||||||
|
import dan200.computercraft.shared.peripheral.common.BlockCable;
|
||||||
|
import dan200.computercraft.shared.peripheral.modem.TileCable;
|
||||||
|
import dan200.computercraft.shared.util.WorldUtil;
|
||||||
|
import net.minecraft.block.state.IBlockState;
|
||||||
|
import net.minecraft.client.renderer.BufferBuilder;
|
||||||
|
import net.minecraft.client.renderer.GlStateManager;
|
||||||
|
import net.minecraft.client.renderer.RenderGlobal;
|
||||||
|
import net.minecraft.client.renderer.Tessellator;
|
||||||
|
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
|
||||||
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
import net.minecraft.tileentity.TileEntity;
|
||||||
|
import net.minecraft.util.EnumFacing;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.RayTraceResult;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
import net.minecraftforge.client.event.DrawBlockHighlightEvent;
|
||||||
|
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||||
|
import org.lwjgl.opengl.GL11;
|
||||||
|
|
||||||
|
public class RenderOverlayCable
|
||||||
|
{
|
||||||
|
private static final float EXPAND = 0.002f;
|
||||||
|
private static final double MIN = TileCable.MIN - EXPAND;
|
||||||
|
private static final double MAX = TileCable.MAX + EXPAND;
|
||||||
|
|
||||||
|
@SubscribeEvent
|
||||||
|
public void drawHighlight( DrawBlockHighlightEvent event )
|
||||||
|
{
|
||||||
|
if( event.getTarget().typeOfHit != RayTraceResult.Type.BLOCK ) return;
|
||||||
|
|
||||||
|
BlockPos pos = event.getTarget().getBlockPos();
|
||||||
|
World world = event.getPlayer().getEntityWorld();
|
||||||
|
|
||||||
|
IBlockState state = world.getBlockState( pos );
|
||||||
|
if( state.getBlock() != ComputerCraft.Blocks.cable ) return;
|
||||||
|
|
||||||
|
TileEntity tile = world.getTileEntity( pos );
|
||||||
|
if( tile == null || !(tile instanceof TileCable) ) return;
|
||||||
|
|
||||||
|
event.setCanceled( true );
|
||||||
|
TileCable cable = (TileCable) tile;
|
||||||
|
|
||||||
|
PeripheralType type = cable.getPeripheralType();
|
||||||
|
|
||||||
|
GlStateManager.enableBlend();
|
||||||
|
GlStateManager.tryBlendFuncSeparate( GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, 1, 0 );
|
||||||
|
GlStateManager.color( 0.0f, 0.0f, 0.0f, 0.4f );
|
||||||
|
GL11.glLineWidth( 2.0F );
|
||||||
|
GlStateManager.disableTexture2D();
|
||||||
|
GlStateManager.depthMask( false );
|
||||||
|
GlStateManager.pushMatrix();
|
||||||
|
|
||||||
|
EnumFacing direction = type != PeripheralType.Cable ? cable.getDirection() : null;
|
||||||
|
|
||||||
|
{
|
||||||
|
EntityPlayer player = event.getPlayer();
|
||||||
|
double x = player.lastTickPosX + (player.posX - player.lastTickPosX) * event.getPartialTicks();
|
||||||
|
double y = player.lastTickPosY + (player.posY - player.lastTickPosY) * event.getPartialTicks();
|
||||||
|
double z = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * event.getPartialTicks();
|
||||||
|
|
||||||
|
GlStateManager.translate( -x + pos.getX(), -y + pos.getY(), -z + pos.getZ() );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( type != PeripheralType.Cable && WorldUtil.isVecInsideInclusive( cable.getModemBounds(), event.getTarget().hitVec.subtract( pos.getX(), pos.getY(), pos.getZ() ) ) )
|
||||||
|
{
|
||||||
|
RenderGlobal.drawSelectionBoundingBox( cable.getModemBounds(), 0, 0, 0, 0.4f );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int flags = 0;
|
||||||
|
|
||||||
|
Tessellator tessellator = Tessellator.getInstance();
|
||||||
|
BufferBuilder buffer = tessellator.getBuffer();
|
||||||
|
|
||||||
|
for( EnumFacing facing : EnumFacing.VALUES )
|
||||||
|
{
|
||||||
|
if( direction == facing || BlockCable.isCable( world, pos.offset( facing ) ) )
|
||||||
|
{
|
||||||
|
flags |= 1 << facing.ordinal();
|
||||||
|
|
||||||
|
|
||||||
|
switch( facing.getAxis() )
|
||||||
|
{
|
||||||
|
case X:
|
||||||
|
{
|
||||||
|
double offset = facing == EnumFacing.WEST ? -EXPAND : 1 + EXPAND;
|
||||||
|
double centre = facing == EnumFacing.WEST ? MIN : MAX;
|
||||||
|
|
||||||
|
buffer.begin( GL11.GL_LINE_STRIP, DefaultVertexFormats.POSITION );
|
||||||
|
buffer.pos( offset, MIN, MIN ).endVertex();
|
||||||
|
buffer.pos( offset, MAX, MIN ).endVertex();
|
||||||
|
buffer.pos( offset, MAX, MAX ).endVertex();
|
||||||
|
buffer.pos( offset, MIN, MAX ).endVertex();
|
||||||
|
buffer.pos( offset, MIN, MIN ).endVertex();
|
||||||
|
tessellator.draw();
|
||||||
|
|
||||||
|
buffer.begin( GL11.GL_LINES, DefaultVertexFormats.POSITION );
|
||||||
|
buffer.pos( offset, MIN, MIN ).endVertex();
|
||||||
|
buffer.pos( centre, MIN, MIN ).endVertex();
|
||||||
|
buffer.pos( offset, MAX, MIN ).endVertex();
|
||||||
|
buffer.pos( centre, MAX, MIN ).endVertex();
|
||||||
|
buffer.pos( offset, MAX, MAX ).endVertex();
|
||||||
|
buffer.pos( centre, MAX, MAX ).endVertex();
|
||||||
|
buffer.pos( offset, MIN, MAX ).endVertex();
|
||||||
|
buffer.pos( centre, MIN, MAX ).endVertex();
|
||||||
|
tessellator.draw();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case Y:
|
||||||
|
{
|
||||||
|
double offset = facing == EnumFacing.DOWN ? -EXPAND : 1 + EXPAND;
|
||||||
|
double centre = facing == EnumFacing.DOWN ? MIN : MAX;
|
||||||
|
|
||||||
|
buffer.begin( GL11.GL_LINE_STRIP, DefaultVertexFormats.POSITION );
|
||||||
|
buffer.pos( MIN, offset, MIN ).endVertex();
|
||||||
|
buffer.pos( MAX, offset, MIN ).endVertex();
|
||||||
|
buffer.pos( MAX, offset, MAX ).endVertex();
|
||||||
|
buffer.pos( MIN, offset, MAX ).endVertex();
|
||||||
|
buffer.pos( MIN, offset, MIN ).endVertex();
|
||||||
|
tessellator.draw();
|
||||||
|
|
||||||
|
buffer.begin( GL11.GL_LINES, DefaultVertexFormats.POSITION );
|
||||||
|
buffer.pos( MIN, offset, MIN ).endVertex();
|
||||||
|
buffer.pos( MIN, centre, MIN ).endVertex();
|
||||||
|
buffer.pos( MAX, offset, MIN ).endVertex();
|
||||||
|
buffer.pos( MAX, centre, MIN ).endVertex();
|
||||||
|
buffer.pos( MAX, offset, MAX ).endVertex();
|
||||||
|
buffer.pos( MAX, centre, MAX ).endVertex();
|
||||||
|
buffer.pos( MIN, offset, MAX ).endVertex();
|
||||||
|
buffer.pos( MIN, centre, MAX ).endVertex();
|
||||||
|
tessellator.draw();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case Z:
|
||||||
|
{
|
||||||
|
double offset = facing == EnumFacing.NORTH ? -EXPAND : 1 + EXPAND;
|
||||||
|
double centre = facing == EnumFacing.NORTH ? MIN : MAX;
|
||||||
|
|
||||||
|
buffer.begin( GL11.GL_LINE_STRIP, DefaultVertexFormats.POSITION );
|
||||||
|
buffer.pos( MIN, MIN, offset ).endVertex();
|
||||||
|
buffer.pos( MAX, MIN, offset ).endVertex();
|
||||||
|
buffer.pos( MAX, MAX, offset ).endVertex();
|
||||||
|
buffer.pos( MIN, MAX, offset ).endVertex();
|
||||||
|
buffer.pos( MIN, MIN, offset ).endVertex();
|
||||||
|
tessellator.draw();
|
||||||
|
|
||||||
|
buffer.begin( GL11.GL_LINES, DefaultVertexFormats.POSITION );
|
||||||
|
buffer.pos( MIN, MIN, offset ).endVertex();
|
||||||
|
buffer.pos( MIN, MIN, centre ).endVertex();
|
||||||
|
buffer.pos( MAX, MIN, offset ).endVertex();
|
||||||
|
buffer.pos( MAX, MIN, centre ).endVertex();
|
||||||
|
buffer.pos( MAX, MAX, offset ).endVertex();
|
||||||
|
buffer.pos( MAX, MAX, centre ).endVertex();
|
||||||
|
buffer.pos( MIN, MAX, offset ).endVertex();
|
||||||
|
buffer.pos( MIN, MAX, centre ).endVertex();
|
||||||
|
tessellator.draw();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer.begin( GL11.GL_LINES, DefaultVertexFormats.POSITION );
|
||||||
|
|
||||||
|
draw( buffer, flags, EnumFacing.WEST, EnumFacing.DOWN, EnumFacing.Axis.Z );
|
||||||
|
draw( buffer, flags, EnumFacing.WEST, EnumFacing.UP, EnumFacing.Axis.Z );
|
||||||
|
draw( buffer, flags, EnumFacing.EAST, EnumFacing.DOWN, EnumFacing.Axis.Z );
|
||||||
|
draw( buffer, flags, EnumFacing.EAST, EnumFacing.UP, EnumFacing.Axis.Z );
|
||||||
|
|
||||||
|
draw( buffer, flags, EnumFacing.WEST, EnumFacing.NORTH, EnumFacing.Axis.Y );
|
||||||
|
draw( buffer, flags, EnumFacing.WEST, EnumFacing.SOUTH, EnumFacing.Axis.Y );
|
||||||
|
draw( buffer, flags, EnumFacing.EAST, EnumFacing.NORTH, EnumFacing.Axis.Y );
|
||||||
|
draw( buffer, flags, EnumFacing.EAST, EnumFacing.SOUTH, EnumFacing.Axis.Y );
|
||||||
|
|
||||||
|
draw( buffer, flags, EnumFacing.DOWN, EnumFacing.NORTH, EnumFacing.Axis.X );
|
||||||
|
draw( buffer, flags, EnumFacing.DOWN, EnumFacing.SOUTH, EnumFacing.Axis.X );
|
||||||
|
draw( buffer, flags, EnumFacing.UP, EnumFacing.NORTH, EnumFacing.Axis.X );
|
||||||
|
draw( buffer, flags, EnumFacing.UP, EnumFacing.SOUTH, EnumFacing.Axis.X );
|
||||||
|
|
||||||
|
tessellator.draw();
|
||||||
|
}
|
||||||
|
|
||||||
|
GlStateManager.popMatrix();
|
||||||
|
GlStateManager.depthMask( true );
|
||||||
|
GlStateManager.enableTexture2D();
|
||||||
|
GlStateManager.disableBlend();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void draw( BufferBuilder buffer, int flags, EnumFacing a, EnumFacing b, EnumFacing.Axis other )
|
||||||
|
{
|
||||||
|
if( ((flags >> a.ordinal()) & 1) != ((flags >> b.ordinal()) & 1) ) return;
|
||||||
|
|
||||||
|
double offA = a.getAxisDirection() == EnumFacing.AxisDirection.NEGATIVE ? MIN : MAX;
|
||||||
|
double offB = b.getAxisDirection() == EnumFacing.AxisDirection.NEGATIVE ? MIN : MAX;
|
||||||
|
switch( other )
|
||||||
|
{
|
||||||
|
case X:
|
||||||
|
buffer.pos( MIN, offA, offB ).endVertex();
|
||||||
|
buffer.pos( MAX, offA, offB ).endVertex();
|
||||||
|
break;
|
||||||
|
case Y:
|
||||||
|
buffer.pos( offA, MIN, offB ).endVertex();
|
||||||
|
buffer.pos( offA, MAX, offB ).endVertex();
|
||||||
|
break;
|
||||||
|
case Z:
|
||||||
|
buffer.pos( offA, offB, MIN ).endVertex();
|
||||||
|
buffer.pos( offA, offB, MAX ).endVertex();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,122 @@
|
|||||||
|
package dan200.computercraft.client.render;
|
||||||
|
|
||||||
|
import dan200.computercraft.ComputerCraft;
|
||||||
|
import dan200.computercraft.shared.peripheral.PeripheralType;
|
||||||
|
import dan200.computercraft.shared.peripheral.common.BlockCable;
|
||||||
|
import dan200.computercraft.shared.peripheral.common.BlockCableModemVariant;
|
||||||
|
import dan200.computercraft.shared.peripheral.modem.TileCable;
|
||||||
|
import dan200.computercraft.shared.util.WorldUtil;
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.state.IBlockState;
|
||||||
|
import net.minecraft.client.Minecraft;
|
||||||
|
import net.minecraft.client.renderer.GlStateManager;
|
||||||
|
import net.minecraft.client.renderer.RenderGlobal;
|
||||||
|
import net.minecraft.client.renderer.Tessellator;
|
||||||
|
import net.minecraft.client.renderer.BufferBuilder;
|
||||||
|
import net.minecraft.client.renderer.block.model.IBakedModel;
|
||||||
|
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
|
||||||
|
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
|
||||||
|
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
|
||||||
|
import net.minecraft.util.BlockRenderLayer;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.RayTraceResult;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
import net.minecraftforge.client.ForgeHooksClient;
|
||||||
|
import net.minecraftforge.client.MinecraftForgeClient;
|
||||||
|
import org.lwjgl.opengl.GL11;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Render breaking animation only over part of a {@link TileCable}.
|
||||||
|
*/
|
||||||
|
public class TileEntityCableRenderer extends TileEntitySpecialRenderer<TileCable>
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void render( @Nonnull TileCable te, double x, double y, double z, float partialTicks, int destroyStage, float alpha )
|
||||||
|
{
|
||||||
|
if( destroyStage < 0 ) return;
|
||||||
|
|
||||||
|
BlockPos pos = te.getPos();
|
||||||
|
|
||||||
|
Minecraft mc = Minecraft.getMinecraft();
|
||||||
|
|
||||||
|
RayTraceResult hit = mc.objectMouseOver;
|
||||||
|
if( hit == null || !hit.getBlockPos().equals( pos ) ) return;
|
||||||
|
|
||||||
|
if( MinecraftForgeClient.getRenderPass() != 0 ) return;
|
||||||
|
|
||||||
|
World world = te.getWorld();
|
||||||
|
IBlockState state = world.getBlockState( pos );
|
||||||
|
Block block = state.getBlock();
|
||||||
|
if( block != ComputerCraft.Blocks.cable ) return;
|
||||||
|
|
||||||
|
state = state.getActualState( world, pos );
|
||||||
|
if( te.getPeripheralType() != PeripheralType.Cable && WorldUtil.isVecInsideInclusive( te.getModemBounds(), hit.hitVec.subtract( pos.getX(), pos.getY(), pos.getZ() ) ) )
|
||||||
|
{
|
||||||
|
state = block.getDefaultState().withProperty( BlockCable.Properties.MODEM, state.getValue( BlockCable.Properties.MODEM ) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
state = state.withProperty( BlockCable.Properties.MODEM, BlockCableModemVariant.None );
|
||||||
|
}
|
||||||
|
|
||||||
|
IBakedModel model = mc.getBlockRendererDispatcher().getModelForState( state );
|
||||||
|
if( model == null ) return;
|
||||||
|
|
||||||
|
preRenderDamagedBlocks();
|
||||||
|
|
||||||
|
BufferBuilder buffer = Tessellator.getInstance().getBuffer();
|
||||||
|
buffer.begin( GL11.GL_QUADS, DefaultVertexFormats.BLOCK );
|
||||||
|
buffer.setTranslation( x - pos.getX(), y - pos.getY(), z - pos.getZ() );
|
||||||
|
buffer.noColor();
|
||||||
|
|
||||||
|
ForgeHooksClient.setRenderLayer( block.getBlockLayer() );
|
||||||
|
|
||||||
|
// See BlockRendererDispatcher#renderBlockDamage
|
||||||
|
TextureAtlasSprite breakingTexture = mc.getTextureMapBlocks().getAtlasSprite( "minecraft:blocks/destroy_stage_" + destroyStage );
|
||||||
|
Minecraft.getMinecraft().getBlockRendererDispatcher().getBlockModelRenderer().renderModel(
|
||||||
|
world,
|
||||||
|
ForgeHooksClient.getDamageModel( model, breakingTexture, state, world, pos ),
|
||||||
|
state, pos, buffer, true
|
||||||
|
);
|
||||||
|
|
||||||
|
ForgeHooksClient.setRenderLayer( BlockRenderLayer.SOLID );
|
||||||
|
|
||||||
|
buffer.setTranslation( 0, 0, 0 );
|
||||||
|
Tessellator.getInstance().draw();
|
||||||
|
|
||||||
|
postRenderDamagedBlocks();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see RenderGlobal#preRenderDamagedBlocks()
|
||||||
|
*/
|
||||||
|
private void preRenderDamagedBlocks()
|
||||||
|
{
|
||||||
|
GlStateManager.disableLighting();
|
||||||
|
|
||||||
|
GlStateManager.enableBlend();
|
||||||
|
GlStateManager.tryBlendFuncSeparate( GlStateManager.SourceFactor.DST_COLOR, GlStateManager.DestFactor.SRC_COLOR, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO );
|
||||||
|
GlStateManager.enableBlend();
|
||||||
|
GlStateManager.color( 1.0F, 1.0F, 1.0F, 0.5F );
|
||||||
|
GlStateManager.doPolygonOffset( -3.0F, -3.0F );
|
||||||
|
GlStateManager.enablePolygonOffset();
|
||||||
|
GlStateManager.alphaFunc( 516, 0.1F );
|
||||||
|
GlStateManager.enableAlpha();
|
||||||
|
GlStateManager.pushMatrix();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see RenderGlobal#postRenderDamagedBlocks()
|
||||||
|
*/
|
||||||
|
private void postRenderDamagedBlocks()
|
||||||
|
{
|
||||||
|
GlStateManager.disableAlpha();
|
||||||
|
GlStateManager.doPolygonOffset( 0.0F, 0.0F );
|
||||||
|
GlStateManager.disablePolygonOffset();
|
||||||
|
GlStateManager.disablePolygonOffset();
|
||||||
|
GlStateManager.depthMask( true );
|
||||||
|
GlStateManager.popMatrix();
|
||||||
|
}
|
||||||
|
}
|
@ -68,7 +68,7 @@ public abstract class BlockGeneric extends Block implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final boolean removedByPlayer( @Nonnull IBlockState state, World world, @Nonnull BlockPos pos, @Nonnull EntityPlayer player, boolean willHarvest )
|
public boolean removedByPlayer( @Nonnull IBlockState state, World world, @Nonnull BlockPos pos, @Nonnull EntityPlayer player, boolean willHarvest )
|
||||||
{
|
{
|
||||||
if( !world.isRemote )
|
if( !world.isRemote )
|
||||||
{
|
{
|
||||||
@ -122,7 +122,7 @@ public abstract class BlockGeneric extends Block implements
|
|||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
@Override
|
@Override
|
||||||
public final ItemStack getPickBlock( @Nonnull IBlockState state, RayTraceResult target, @Nonnull World world, @Nonnull BlockPos pos, EntityPlayer player )
|
public ItemStack getPickBlock( @Nonnull IBlockState state, RayTraceResult target, @Nonnull World world, @Nonnull BlockPos pos, EntityPlayer player )
|
||||||
{
|
{
|
||||||
TileEntity tile = world.getTileEntity( pos );
|
TileEntity tile = world.getTileEntity( pos );
|
||||||
if( tile != null && tile instanceof TileGeneric )
|
if( tile != null && tile instanceof TileGeneric )
|
||||||
|
@ -7,21 +7,33 @@
|
|||||||
package dan200.computercraft.shared.peripheral.common;
|
package dan200.computercraft.shared.peripheral.common;
|
||||||
|
|
||||||
import dan200.computercraft.ComputerCraft;
|
import dan200.computercraft.ComputerCraft;
|
||||||
|
import dan200.computercraft.shared.common.TileGeneric;
|
||||||
import dan200.computercraft.shared.peripheral.PeripheralType;
|
import dan200.computercraft.shared.peripheral.PeripheralType;
|
||||||
import dan200.computercraft.shared.peripheral.modem.TileCable;
|
import dan200.computercraft.shared.peripheral.modem.TileCable;
|
||||||
|
import dan200.computercraft.shared.util.WorldUtil;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.block.properties.PropertyBool;
|
import net.minecraft.block.properties.PropertyBool;
|
||||||
import net.minecraft.block.properties.PropertyEnum;
|
import net.minecraft.block.properties.PropertyEnum;
|
||||||
import net.minecraft.block.state.BlockFaceShape;
|
import net.minecraft.block.state.BlockFaceShape;
|
||||||
import net.minecraft.block.state.BlockStateContainer;
|
import net.minecraft.block.state.BlockStateContainer;
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.block.state.IBlockState;
|
||||||
|
import net.minecraft.entity.EntityLivingBase;
|
||||||
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.util.EnumFacing;
|
import net.minecraft.util.EnumFacing;
|
||||||
|
import net.minecraft.util.math.AxisAlignedBB;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.RayTraceResult;
|
||||||
|
import net.minecraft.util.math.Vec3d;
|
||||||
import net.minecraft.world.IBlockAccess;
|
import net.minecraft.world.IBlockAccess;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class BlockCable extends BlockPeripheralBase
|
public class BlockCable extends BlockPeripheralBase
|
||||||
{
|
{
|
||||||
@ -30,7 +42,7 @@ public class BlockCable extends BlockPeripheralBase
|
|||||||
public static class Properties
|
public static class Properties
|
||||||
{
|
{
|
||||||
public static final PropertyEnum<BlockCableModemVariant> MODEM = PropertyEnum.create( "modem", BlockCableModemVariant.class );
|
public static final PropertyEnum<BlockCableModemVariant> MODEM = PropertyEnum.create( "modem", BlockCableModemVariant.class );
|
||||||
public static final PropertyBool CABLE = PropertyBool.create( "cable" );
|
public static final PropertyEnum<BlockCableCableVariant> CABLE = PropertyEnum.create( "cable", BlockCableCableVariant.class );
|
||||||
public static final PropertyBool NORTH = PropertyBool.create( "north" );
|
public static final PropertyBool NORTH = PropertyBool.create( "north" );
|
||||||
public static final PropertyBool SOUTH = PropertyBool.create( "south" );
|
public static final PropertyBool SOUTH = PropertyBool.create( "south" );
|
||||||
public static final PropertyBool EAST = PropertyBool.create( "east" );
|
public static final PropertyBool EAST = PropertyBool.create( "east" );
|
||||||
@ -65,7 +77,7 @@ public class BlockCable extends BlockPeripheralBase
|
|||||||
setCreativeTab( ComputerCraft.mainCreativeTab );
|
setCreativeTab( ComputerCraft.mainCreativeTab );
|
||||||
setDefaultState( this.blockState.getBaseState()
|
setDefaultState( this.blockState.getBaseState()
|
||||||
.withProperty( Properties.MODEM, BlockCableModemVariant.None )
|
.withProperty( Properties.MODEM, BlockCableModemVariant.None )
|
||||||
.withProperty( Properties.CABLE, true )
|
.withProperty( Properties.CABLE, BlockCableCableVariant.NONE )
|
||||||
.withProperty( Properties.NORTH, false )
|
.withProperty( Properties.NORTH, false )
|
||||||
.withProperty( Properties.SOUTH, false )
|
.withProperty( Properties.SOUTH, false )
|
||||||
.withProperty( Properties.EAST, false )
|
.withProperty( Properties.EAST, false )
|
||||||
@ -99,17 +111,17 @@ public class BlockCable extends BlockPeripheralBase
|
|||||||
IBlockState state = getDefaultState();
|
IBlockState state = getDefaultState();
|
||||||
if( meta < 6 )
|
if( meta < 6 )
|
||||||
{
|
{
|
||||||
state = state.withProperty( Properties.CABLE, false );
|
state = state.withProperty( Properties.CABLE, BlockCableCableVariant.NONE );
|
||||||
state = state.withProperty( Properties.MODEM, BlockCableModemVariant.fromFacing( EnumFacing.getFront( meta ) ) );
|
state = state.withProperty( Properties.MODEM, BlockCableModemVariant.fromFacing( EnumFacing.getFront( meta ) ) );
|
||||||
}
|
}
|
||||||
else if( meta < 12 )
|
else if( meta < 12 )
|
||||||
{
|
{
|
||||||
state = state.withProperty( Properties.CABLE, true );
|
state = state.withProperty( Properties.CABLE, BlockCableCableVariant.ANY );
|
||||||
state = state.withProperty( Properties.MODEM, BlockCableModemVariant.fromFacing( EnumFacing.getFront( meta - 6 ) ) );
|
state = state.withProperty( Properties.MODEM, BlockCableModemVariant.fromFacing( EnumFacing.getFront( meta - 6 ) ) );
|
||||||
}
|
}
|
||||||
else if( meta == 13 )
|
else if( meta == 13 )
|
||||||
{
|
{
|
||||||
state = state.withProperty( Properties.CABLE, true );
|
state = state.withProperty( Properties.CABLE, BlockCableCableVariant.ANY );
|
||||||
state = state.withProperty( Properties.MODEM, BlockCableModemVariant.None );
|
state = state.withProperty( Properties.MODEM, BlockCableModemVariant.None );
|
||||||
}
|
}
|
||||||
return state;
|
return state;
|
||||||
@ -119,7 +131,7 @@ public class BlockCable extends BlockPeripheralBase
|
|||||||
public int getMetaFromState( IBlockState state )
|
public int getMetaFromState( IBlockState state )
|
||||||
{
|
{
|
||||||
int meta = 0;
|
int meta = 0;
|
||||||
boolean cable = state.getValue( Properties.CABLE );
|
boolean cable = state.getValue( Properties.CABLE ) != BlockCableCableVariant.NONE;
|
||||||
BlockCableModemVariant modem = state.getValue( Properties.MODEM );
|
BlockCableModemVariant modem = state.getValue( Properties.MODEM );
|
||||||
if( cable && modem != BlockCableModemVariant.None )
|
if( cable && modem != BlockCableModemVariant.None )
|
||||||
{
|
{
|
||||||
@ -144,20 +156,20 @@ public class BlockCable extends BlockPeripheralBase
|
|||||||
case Cable:
|
case Cable:
|
||||||
{
|
{
|
||||||
return getDefaultState()
|
return getDefaultState()
|
||||||
.withProperty( Properties.CABLE, true )
|
.withProperty( Properties.CABLE, BlockCableCableVariant.ANY )
|
||||||
.withProperty( Properties.MODEM, BlockCableModemVariant.None );
|
.withProperty( Properties.MODEM, BlockCableModemVariant.None );
|
||||||
}
|
}
|
||||||
case WiredModem:
|
case WiredModem:
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
return getDefaultState()
|
return getDefaultState()
|
||||||
.withProperty( Properties.CABLE, false )
|
.withProperty( Properties.CABLE, BlockCableCableVariant.NONE )
|
||||||
.withProperty( Properties.MODEM, BlockCableModemVariant.fromFacing( placedSide.getOpposite() ) );
|
.withProperty( Properties.MODEM, BlockCableModemVariant.fromFacing( placedSide.getOpposite() ) );
|
||||||
}
|
}
|
||||||
case WiredModemWithCable:
|
case WiredModemWithCable:
|
||||||
{
|
{
|
||||||
return getDefaultState()
|
return getDefaultState()
|
||||||
.withProperty( Properties.CABLE, true )
|
.withProperty( Properties.CABLE, BlockCableCableVariant.ANY )
|
||||||
.withProperty( Properties.MODEM, BlockCableModemVariant.fromFacing( placedSide.getOpposite() ) );
|
.withProperty( Properties.MODEM, BlockCableModemVariant.fromFacing( placedSide.getOpposite() ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -165,7 +177,7 @@ public class BlockCable extends BlockPeripheralBase
|
|||||||
|
|
||||||
private boolean doesConnect( IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing dir )
|
private boolean doesConnect( IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing dir )
|
||||||
{
|
{
|
||||||
if( !state.getValue( Properties.CABLE ) )
|
if( state.getValue( Properties.CABLE ) == BlockCableCableVariant.NONE )
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -191,11 +203,30 @@ public class BlockCable extends BlockPeripheralBase
|
|||||||
state = state.withProperty( Properties.UP, doesConnect( state, world, pos, EnumFacing.UP ) );
|
state = state.withProperty( Properties.UP, doesConnect( state, world, pos, EnumFacing.UP ) );
|
||||||
state = state.withProperty( Properties.DOWN, doesConnect( state, world, pos, EnumFacing.DOWN ) );
|
state = state.withProperty( Properties.DOWN, doesConnect( state, world, pos, EnumFacing.DOWN ) );
|
||||||
|
|
||||||
|
if( state.getValue( Properties.CABLE ) != BlockCableCableVariant.NONE )
|
||||||
|
{
|
||||||
|
BlockCableCableVariant direction = null;
|
||||||
|
if( state.getValue( Properties.WEST ) || state.getValue( Properties.EAST ) )
|
||||||
|
{
|
||||||
|
direction = direction == null ? BlockCableCableVariant.X_AXIS : BlockCableCableVariant.ANY;
|
||||||
|
}
|
||||||
|
if( state.getValue( Properties.DOWN ) || state.getValue( Properties.UP ) )
|
||||||
|
{
|
||||||
|
direction = direction == null ? BlockCableCableVariant.Y_AXIS : BlockCableCableVariant.ANY;
|
||||||
|
}
|
||||||
|
if( state.getValue( Properties.NORTH ) || state.getValue( Properties.SOUTH ) )
|
||||||
|
{
|
||||||
|
direction = direction == null ? BlockCableCableVariant.Z_AXIS : BlockCableCableVariant.ANY;
|
||||||
|
}
|
||||||
|
|
||||||
|
state = state.withProperty( Properties.CABLE, direction == null ? BlockCableCableVariant.Z_AXIS : direction );
|
||||||
|
}
|
||||||
|
|
||||||
int anim;
|
int anim;
|
||||||
TileEntity tile = world.getTileEntity( pos );
|
TileEntity tile = world.getTileEntity( pos );
|
||||||
if( tile != null && tile instanceof TilePeripheralBase )
|
if( tile != null && tile instanceof TilePeripheralBase )
|
||||||
{
|
{
|
||||||
TilePeripheralBase peripheral = (TilePeripheralBase)tile;
|
TilePeripheralBase peripheral = (TilePeripheralBase) tile;
|
||||||
anim = peripheral.getAnim();
|
anim = peripheral.getAnim();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -208,7 +239,7 @@ public class BlockCable extends BlockPeripheralBase
|
|||||||
{
|
{
|
||||||
modem = BlockCableModemVariant.values()[
|
modem = BlockCableModemVariant.values()[
|
||||||
1 + 6 * anim + modem.getFacing().getIndex()
|
1 + 6 * anim + modem.getFacing().getIndex()
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
state = state.withProperty( Properties.MODEM, modem );
|
state = state.withProperty( Properties.MODEM, modem );
|
||||||
|
|
||||||
@ -231,7 +262,7 @@ public class BlockCable extends BlockPeripheralBase
|
|||||||
@Override
|
@Override
|
||||||
public PeripheralType getPeripheralType( IBlockState state )
|
public PeripheralType getPeripheralType( IBlockState state )
|
||||||
{
|
{
|
||||||
boolean cable = state.getValue( Properties.CABLE );
|
boolean cable = state.getValue( Properties.CABLE ) != BlockCableCableVariant.NONE;
|
||||||
BlockCableModemVariant modem = state.getValue( Properties.MODEM );
|
BlockCableModemVariant modem = state.getValue( Properties.MODEM );
|
||||||
if( cable && modem != BlockCableModemVariant.None )
|
if( cable && modem != BlockCableModemVariant.None )
|
||||||
{
|
{
|
||||||
@ -253,6 +284,132 @@ public class BlockCable extends BlockPeripheralBase
|
|||||||
return new TileCable();
|
return new TileCable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
@Deprecated
|
||||||
|
public RayTraceResult collisionRayTrace( IBlockState blockState, @Nonnull World world, @Nonnull BlockPos pos, @Nonnull Vec3d start, @Nonnull Vec3d end )
|
||||||
|
{
|
||||||
|
TileEntity tile = world.getTileEntity( pos );
|
||||||
|
if( tile != null && tile instanceof TileGeneric && tile.hasWorld() )
|
||||||
|
{
|
||||||
|
TileGeneric generic = (TileGeneric) tile;
|
||||||
|
|
||||||
|
double distance = Double.POSITIVE_INFINITY;
|
||||||
|
RayTraceResult result = null;
|
||||||
|
|
||||||
|
List<AxisAlignedBB> bounds = new ArrayList<AxisAlignedBB>( 7 );
|
||||||
|
generic.getCollisionBounds( bounds );
|
||||||
|
|
||||||
|
Vec3d startOff = start.subtract( pos.getX(), pos.getY(), pos.getZ() );
|
||||||
|
Vec3d endOff = end.subtract( pos.getX(), pos.getY(), pos.getZ() );
|
||||||
|
|
||||||
|
for( AxisAlignedBB bb : bounds )
|
||||||
|
{
|
||||||
|
RayTraceResult hit = bb.calculateIntercept( startOff, endOff );
|
||||||
|
if( hit != null )
|
||||||
|
{
|
||||||
|
double newDistance = hit.hitVec.squareDistanceTo( startOff );
|
||||||
|
if( newDistance <= distance )
|
||||||
|
{
|
||||||
|
distance = newDistance;
|
||||||
|
result = hit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result == null ? null : new RayTraceResult( result.hitVec.addVector( pos.getX(), pos.getY(), pos.getZ() ), result.sideHit, pos );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return super.collisionRayTrace( blockState, world, pos, start, end );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean removedByPlayer( @Nonnull IBlockState state, World world, @Nonnull BlockPos pos, @Nonnull EntityPlayer player, boolean willHarvest )
|
||||||
|
{
|
||||||
|
PeripheralType type = getPeripheralType( world, pos );
|
||||||
|
if( type == PeripheralType.WiredModemWithCable )
|
||||||
|
{
|
||||||
|
RayTraceResult hit = state.collisionRayTrace( world, pos, WorldUtil.getRayStart( player ), WorldUtil.getRayEnd( player ) );
|
||||||
|
if( hit != null )
|
||||||
|
{
|
||||||
|
TileEntity tile = world.getTileEntity( pos );
|
||||||
|
if( tile != null && tile instanceof TileCable && tile.hasWorld() )
|
||||||
|
{
|
||||||
|
TileCable cable = (TileCable) tile;
|
||||||
|
|
||||||
|
ItemStack item;
|
||||||
|
|
||||||
|
AxisAlignedBB bb = cable.getModemBounds();
|
||||||
|
if( WorldUtil.isVecInsideInclusive( bb, hit.hitVec.subtract( pos.getX(), pos.getY(), pos.getZ() ) ) )
|
||||||
|
{
|
||||||
|
world.setBlockState( pos, state.withProperty( Properties.MODEM, BlockCableModemVariant.None ), 3 );
|
||||||
|
cable.modemChanged();
|
||||||
|
item = PeripheralItemFactory.create( PeripheralType.WiredModem, null, 1 );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
world.setBlockState( pos, state.withProperty( Properties.CABLE, BlockCableCableVariant.NONE ), 3 );
|
||||||
|
item = PeripheralItemFactory.create( PeripheralType.Cable, null, 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
cable.networkChanged();
|
||||||
|
if( !world.isRemote && !player.capabilities.isCreativeMode ) dropItem( world, pos, item );
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return super.removedByPlayer( state, world, pos, player, willHarvest );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemStack getPickBlock( @Nonnull IBlockState state, RayTraceResult hit, @Nonnull World world, @Nonnull BlockPos pos, EntityPlayer player )
|
||||||
|
{
|
||||||
|
TileEntity tile = world.getTileEntity( pos );
|
||||||
|
if( tile != null && tile instanceof TileCable && tile.hasWorld() )
|
||||||
|
{
|
||||||
|
TileCable cable = (TileCable) tile;
|
||||||
|
PeripheralType type = getPeripheralType( state );
|
||||||
|
|
||||||
|
if( type == PeripheralType.WiredModemWithCable )
|
||||||
|
{
|
||||||
|
if( hit == null || WorldUtil.isVecInsideInclusive( cable.getModemBounds(), hit.hitVec.subtract( pos.getX(), pos.getY(), pos.getZ() ) ) )
|
||||||
|
{
|
||||||
|
return PeripheralItemFactory.create( PeripheralType.WiredModem, null, 1 );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return PeripheralItemFactory.create( PeripheralType.Cable, null, 1 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return PeripheralItemFactory.create( type, null, 1 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return PeripheralItemFactory.create( PeripheralType.Cable, null, 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBlockPlacedBy( World world, BlockPos pos, IBlockState state, EntityLivingBase placer, ItemStack stack )
|
||||||
|
{
|
||||||
|
TileEntity tile = world.getTileEntity( pos );
|
||||||
|
if( tile != null && tile instanceof TileCable )
|
||||||
|
{
|
||||||
|
TileCable cable = (TileCable) tile;
|
||||||
|
if( cable.getPeripheralType() != PeripheralType.WiredModem )
|
||||||
|
{
|
||||||
|
cable.networkChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
super.onBlockPlacedBy( world, pos, state, placer, stack );
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public final boolean isOpaqueCube( IBlockState state )
|
public final boolean isOpaqueCube( IBlockState state )
|
||||||
|
@ -0,0 +1,28 @@
|
|||||||
|
package dan200.computercraft.shared.peripheral.common;
|
||||||
|
|
||||||
|
import net.minecraft.util.IStringSerializable;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
|
public enum BlockCableCableVariant implements IStringSerializable
|
||||||
|
{
|
||||||
|
NONE( "none" ),
|
||||||
|
ANY( "any" ),
|
||||||
|
X_AXIS( "x" ),
|
||||||
|
Y_AXIS( "y" ),
|
||||||
|
Z_AXIS( "z" ),;
|
||||||
|
|
||||||
|
private final String m_name;
|
||||||
|
|
||||||
|
BlockCableCableVariant( String name )
|
||||||
|
{
|
||||||
|
m_name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Nonnull
|
||||||
|
public String getName()
|
||||||
|
{
|
||||||
|
return m_name;
|
||||||
|
}
|
||||||
|
}
|
@ -89,12 +89,12 @@ public class ItemCable extends ItemPeripheralBase
|
|||||||
{
|
{
|
||||||
if( !stack.isEmpty() )
|
if( !stack.isEmpty() )
|
||||||
{
|
{
|
||||||
IBlockState newState = existingState.withProperty( BlockCable.Properties.CABLE, true );
|
IBlockState newState = existingState.withProperty( BlockCable.Properties.CABLE, BlockCableCableVariant.ANY );
|
||||||
world.setBlockState( pos, newState, 3 );
|
world.setBlockState( pos, newState, 3 );
|
||||||
SoundType soundType = newState.getBlock().getSoundType( newState, world, pos, player );
|
SoundType soundType = newState.getBlock().getSoundType( newState, world, pos, player );
|
||||||
world.playSound( null, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, soundType.getPlaceSound(), SoundCategory.BLOCKS, (soundType.getVolume() + 1.0F) / 2.0F, soundType.getPitch() * 0.8F );
|
world.playSound( null, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, soundType.getPlaceSound(), SoundCategory.BLOCKS, (soundType.getVolume() + 1.0F) / 2.0F, soundType.getPitch() * 0.8F );
|
||||||
stack.shrink( 1 );
|
stack.shrink( 1 );
|
||||||
|
|
||||||
TileEntity tile = world.getTileEntity( pos );
|
TileEntity tile = world.getTileEntity( pos );
|
||||||
if( tile != null && tile instanceof TileCable )
|
if( tile != null && tile instanceof TileCable )
|
||||||
{
|
{
|
||||||
@ -143,7 +143,7 @@ public class ItemCable extends ItemPeripheralBase
|
|||||||
{
|
{
|
||||||
if( !stack.isEmpty() )
|
if( !stack.isEmpty() )
|
||||||
{
|
{
|
||||||
IBlockState newState = offsetExistingState.withProperty( BlockCable.Properties.CABLE, true );
|
IBlockState newState = offsetExistingState.withProperty( BlockCable.Properties.CABLE, BlockCableCableVariant.ANY );
|
||||||
world.setBlockState( offset, newState, 3 );
|
world.setBlockState( offset, newState, 3 );
|
||||||
SoundType soundType = newState.getBlock().getSoundType( newState, world, offset, player );
|
SoundType soundType = newState.getBlock().getSoundType( newState, world, offset, player );
|
||||||
world.playSound( null, offset.getX() + 0.5, offset.getY() + 0.5, offset.getZ() + 0.5, soundType.getPlaceSound(), SoundCategory.BLOCKS, (soundType.getVolume() + 1.0F) / 2.0F, soundType.getPitch() * 0.8F );
|
world.playSound( null, offset.getX() + 0.5, offset.getY() + 0.5, offset.getZ() + 0.5, soundType.getPlaceSound(), SoundCategory.BLOCKS, (soundType.getVolume() + 1.0F) / 2.0F, soundType.getPitch() * 0.8F );
|
||||||
|
@ -46,8 +46,8 @@ import static dan200.computercraft.core.apis.ArgumentHelper.getString;
|
|||||||
public class TileCable extends TileModemBase
|
public class TileCable extends TileModemBase
|
||||||
implements IPacketNetwork
|
implements IPacketNetwork
|
||||||
{
|
{
|
||||||
private static final double MIN = 0.375;
|
public static final double MIN = 0.375;
|
||||||
private static final double MAX = 1 - MIN;
|
public static final double MAX = 1 - MIN;
|
||||||
|
|
||||||
private static final AxisAlignedBB BOX_CENTRE = new AxisAlignedBB( MIN, MIN, MIN, MAX, MAX, MAX );
|
private static final AxisAlignedBB BOX_CENTRE = new AxisAlignedBB( MIN, MIN, MIN, MAX, MAX, MAX );
|
||||||
private static final AxisAlignedBB[] BOXES = new AxisAlignedBB[]{
|
private static final AxisAlignedBB[] BOXES = new AxisAlignedBB[]{
|
||||||
@ -359,6 +359,7 @@ public class TileCable extends TileModemBase
|
|||||||
((BlockGeneric)getBlockType()).dropItem( getWorld(), getPos(), PeripheralItemFactory.create( PeripheralType.WiredModem, getLabel(), 1 ) );
|
((BlockGeneric)getBlockType()).dropItem( getWorld(), getPos(), PeripheralItemFactory.create( PeripheralType.WiredModem, getLabel(), 1 ) );
|
||||||
setLabel( null );
|
setLabel( null );
|
||||||
setBlockState( getBlockState().withProperty( BlockCable.Properties.MODEM, BlockCableModemVariant.None ) );
|
setBlockState( getBlockState().withProperty( BlockCable.Properties.MODEM, BlockCableModemVariant.None ) );
|
||||||
|
if( modemChanged() ) networkChanged();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -682,7 +683,7 @@ public class TileCable extends TileModemBase
|
|||||||
{
|
{
|
||||||
if( !getWorld().isRemote )
|
if( !getWorld().isRemote )
|
||||||
{
|
{
|
||||||
if( !m_destroyed )
|
if( !m_destroyed && getPeripheralType() != PeripheralType.WiredModem)
|
||||||
{
|
{
|
||||||
// If this modem is alive, rebuild the network
|
// If this modem is alive, rebuild the network
|
||||||
searchNetwork( ( modem, distance ) ->
|
searchNetwork( ( modem, distance ) ->
|
||||||
@ -712,6 +713,29 @@ public class TileCable extends TileModemBase
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean modemChanged()
|
||||||
|
{
|
||||||
|
if( getWorld().isRemote ) return false;
|
||||||
|
|
||||||
|
boolean requiresUpdate = false;
|
||||||
|
|
||||||
|
PeripheralType type = getPeripheralType();
|
||||||
|
if( type == PeripheralType.Cable )
|
||||||
|
{
|
||||||
|
m_attachedPeripheralID = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( type != PeripheralType.WiredModemWithCable && m_peripheralAccessAllowed )
|
||||||
|
{
|
||||||
|
m_peripheralAccessAllowed = false;
|
||||||
|
requiresUpdate = true;
|
||||||
|
markDirty();
|
||||||
|
updateAnim();
|
||||||
|
}
|
||||||
|
|
||||||
|
return requiresUpdate;
|
||||||
|
}
|
||||||
|
|
||||||
// private stuff
|
// private stuff
|
||||||
|
|
||||||
@ -1041,4 +1065,10 @@ public class TileCable extends TileModemBase
|
|||||||
}
|
}
|
||||||
//System.out.println( "Visited "+visited+" common" );
|
//System.out.println( "Visited "+visited+" common" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canRenderBreaking()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,11 +6,18 @@
|
|||||||
|
|
||||||
package dan200.computercraft.shared.util;
|
package dan200.computercraft.shared.util;
|
||||||
|
|
||||||
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.entity.Entity;
|
||||||
|
import net.minecraft.entity.EntityLivingBase;
|
||||||
import net.minecraft.entity.item.EntityItem;
|
import net.minecraft.entity.item.EntityItem;
|
||||||
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
import net.minecraft.entity.player.EntityPlayerMP;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.util.*;
|
import net.minecraft.util.EnumFacing;
|
||||||
import net.minecraft.util.math.*;
|
import net.minecraft.util.math.AxisAlignedBB;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.RayTraceResult;
|
||||||
|
import net.minecraft.util.math.Vec3d;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
import org.apache.commons.lang3.tuple.Pair;
|
||||||
|
|
||||||
@ -47,9 +54,9 @@ public class WorldUtil
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check for entities
|
// Check for entities
|
||||||
float xStretch = (Math.abs(vecDir.x) > 0.25f) ? 0.0f : 1.0f;
|
float xStretch = Math.abs(vecDir.x) > 0.25f ? 0.0f : 1.0f;
|
||||||
float yStretch = (Math.abs(vecDir.y) > 0.25f) ? 0.0f : 1.0f;
|
float yStretch = Math.abs(vecDir.y) > 0.25f ? 0.0f : 1.0f;
|
||||||
float zStretch = (Math.abs(vecDir.z) > 0.25f) ? 0.0f : 1.0f;
|
float zStretch = Math.abs(vecDir.z) > 0.25f ? 0.0f : 1.0f;
|
||||||
AxisAlignedBB bigBox = new AxisAlignedBB(
|
AxisAlignedBB bigBox = new AxisAlignedBB(
|
||||||
Math.min(vecStart.x, vecEnd.x) - 0.375f * xStretch,
|
Math.min(vecStart.x, vecEnd.x) - 0.375f * xStretch,
|
||||||
Math.min(vecStart.y, vecEnd.y) - 0.375f * yStretch,
|
Math.min(vecStart.y, vecEnd.y) - 0.375f * yStretch,
|
||||||
@ -113,6 +120,35 @@ public class WorldUtil
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Vec3d getRayStart( EntityLivingBase entity )
|
||||||
|
{
|
||||||
|
return new Vec3d( entity.posX, entity.posY + entity.getEyeHeight(), entity.posZ );
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Vec3d getRayEnd( EntityPlayer player) {
|
||||||
|
double reach = 4.5;
|
||||||
|
if( player instanceof EntityPlayerMP )
|
||||||
|
{
|
||||||
|
reach = ((EntityPlayerMP) player).interactionManager.getBlockReachDistance();
|
||||||
|
}
|
||||||
|
else if( player.getEntityWorld().isRemote )
|
||||||
|
{
|
||||||
|
reach = Minecraft.getMinecraft().playerController.getBlockReachDistance();
|
||||||
|
}
|
||||||
|
else if( player.capabilities.isCreativeMode )
|
||||||
|
{
|
||||||
|
reach = 5.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vec3d look = player.getLookVec();
|
||||||
|
|
||||||
|
return getRayStart( player ).addVector( look.x * reach, look.y * reach, look.z * reach );
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isVecInsideInclusive(AxisAlignedBB bb , Vec3d vec) {
|
||||||
|
return vec.x >= bb.minX && vec.x <= bb.maxX && vec.y >= bb.minY && vec.y <= bb.maxY && vec.z >= bb.minZ && vec.z <= bb.maxZ;
|
||||||
|
}
|
||||||
|
|
||||||
public static void dropItemStack( @Nonnull ItemStack stack, World world, BlockPos pos )
|
public static void dropItemStack( @Nonnull ItemStack stack, World world, BlockPos pos )
|
||||||
{
|
{
|
||||||
dropItemStack( stack, world, pos, null );
|
dropItemStack( stack, world, pos, null );
|
||||||
|
@ -2,13 +2,11 @@
|
|||||||
"forge_marker": 1,
|
"forge_marker": 1,
|
||||||
"variants": {
|
"variants": {
|
||||||
"cable": {
|
"cable": {
|
||||||
"true": {
|
"none": { },
|
||||||
"submodel": {
|
"any": { "submodel": { "cable": { "model": "computercraft:cable_core_any" } } },
|
||||||
"cable": { "model": "computercraft:cable_core" }
|
"x": { "submodel": { "cable": { "model": "computercraft:cable_core_facing", "y": 90 } } },
|
||||||
}
|
"y": { "submodel": { "cable": { "model": "computercraft:cable_core_facing", "x": 90 } } },
|
||||||
},
|
"z": { "submodel": { "cable": { "model": "computercraft:cable_core_facing", "y": 0 } } }
|
||||||
"false": {
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"up": {
|
"up": {
|
||||||
"true": {
|
"true": {
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
},
|
},
|
||||||
"elements": [
|
"elements": [
|
||||||
{
|
{
|
||||||
"from": [ 6, 6, 10 ],
|
"from": [ 6, 6, 10 ],
|
||||||
"to": [ 10, 10, 16 ],
|
"to": [ 10, 10, 16 ],
|
||||||
"faces": {
|
"faces": {
|
||||||
"down": { "uv": [ 6, 0, 10, 6 ], "texture": "#side" },
|
"down": { "uv": [ 6, 0, 10, 6 ], "texture": "#side" },
|
||||||
|
@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"parent": "block/block",
|
||||||
|
"textures": {
|
||||||
|
"particle": "computercraft:blocks/cable_core",
|
||||||
|
"side": "computercraft:blocks/cable_side"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [ 6, 6, 6 ],
|
||||||
|
"to": [ 10, 10, 10 ],
|
||||||
|
"faces": {
|
||||||
|
"down": { "uv": [ 6, 6, 10, 10 ], "texture": "#side" },
|
||||||
|
"up": { "uv": [ 6, 6, 10, 10 ], "texture": "#side" },
|
||||||
|
"north": { "uv": [ 6, 6, 10, 10 ], "texture": "#side" },
|
||||||
|
"south": { "uv": [ 6, 6, 10, 10 ], "texture": "#side" },
|
||||||
|
"west": { "uv": [ 6, 6, 10, 10 ], "texture": "#side" },
|
||||||
|
"east": { "uv": [ 6, 6, 10, 10 ], "texture": "#side" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -1,22 +1,22 @@
|
|||||||
{
|
{
|
||||||
"parent": "block/block",
|
"parent": "block/block",
|
||||||
"textures": {
|
"textures": {
|
||||||
"particle": "computercraft:blocks/cable_core",
|
"particle": "computercraft:blocks/cable_core",
|
||||||
"side": "computercraft:blocks/cable_side",
|
"side": "computercraft:blocks/cable_side",
|
||||||
"end": "computercraft:blocks/cable_core"
|
"end": "computercraft:blocks/cable_core"
|
||||||
},
|
},
|
||||||
"elements": [
|
"elements": [
|
||||||
{
|
{
|
||||||
"from": [ 6, 6, 6 ],
|
"from": [ 6, 6, 6 ],
|
||||||
"to": [ 10, 10, 10 ],
|
"to": [ 10, 10, 10 ],
|
||||||
"faces": {
|
"faces": {
|
||||||
"down": { "uv": [ 6, 6, 10, 10 ], "texture": "#side" },
|
"down": { "uv": [ 6, 6, 10, 10 ], "texture": "#side" },
|
||||||
"up": { "uv": [ 6, 6, 10, 10 ], "texture": "#side" },
|
"up": { "uv": [ 6, 6, 10, 10 ], "texture": "#side" },
|
||||||
"north": { "uv": [ 6, 6, 10, 10 ], "texture": "#side" },
|
"north": { "uv": [ 6, 6, 10, 10 ], "texture": "#end" },
|
||||||
"south": { "uv": [ 6, 6, 10, 10 ], "texture": "#side" },
|
"south": { "uv": [ 6, 6, 10, 10 ], "texture": "#end" },
|
||||||
"west": { "uv": [ 6, 6, 10, 10 ], "texture": "#side" },
|
"west": { "uv": [ 6, 6, 10, 10 ], "texture": "#side" },
|
||||||
"east": { "uv": [ 6, 6, 10, 10 ], "texture": "#side" }
|
"east": { "uv": [ 6, 6, 10, 10 ], "texture": "#side" }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user