use of network.rs485.logisticspipes.world.DoubleCoordinatesType in project LogisticsPipes by RS485.
the class LogisticsBlockGenericPipe method placePipe.
public static boolean placePipe(CoreUnroutedPipe pipe, World world, int i, int j, int k, Block block, int meta, ITubeOrientation orientation) {
if (world.isRemote) {
return true;
}
boolean placed = world.setBlock(i, j, k, block, meta, 2);
if (placed) {
TileEntity tile = world.getTileEntity(i, j, k);
if (tile instanceof LogisticsTileGenericPipe) {
LogisticsTileGenericPipe tilePipe = (LogisticsTileGenericPipe) tile;
if (pipe instanceof CoreMultiBlockPipe) {
if (orientation == null) {
throw new NullPointerException();
}
CoreMultiBlockPipe mPipe = (CoreMultiBlockPipe) pipe;
orientation.setOnPipe(mPipe);
DoubleCoordinates placeAt = new DoubleCoordinates(i, j, k);
LogisticsBlockGenericSubMultiBlock.currentCreatedMultiBlock = placeAt;
LPPositionSet<DoubleCoordinatesType<CoreMultiBlockPipe.SubBlockTypeForShare>> positions = ((CoreMultiBlockPipe) pipe).getSubBlocks();
orientation.rotatePositions(positions);
for (DoubleCoordinatesType<CoreMultiBlockPipe.SubBlockTypeForShare> pos : positions) {
pos.add(placeAt);
TileEntity subTile = world.getTileEntity(pos.getXInt(), pos.getYInt(), pos.getZInt());
if (subTile instanceof LogisticsTileGenericSubMultiBlock) {
((LogisticsTileGenericSubMultiBlock) subTile).addMultiBlockMainPos(placeAt);
((LogisticsTileGenericSubMultiBlock) subTile).addSubTypeTo(pos.getType());
MainProxy.sendPacketToAllWatchingChunk(subTile, ((LogisticsTileGenericSubMultiBlock) subTile).getLPDescriptionPacket());
} else {
world.setBlock(pos.getXInt(), pos.getYInt(), pos.getZInt(), LogisticsPipes.LogisticsSubMultiBlock, 0, 2);
subTile = world.getTileEntity(pos.getXInt(), pos.getYInt(), pos.getZInt());
if (subTile instanceof LogisticsTileGenericSubMultiBlock) {
((LogisticsTileGenericSubMultiBlock) subTile).addSubTypeTo(pos.getType());
}
}
world.notifyBlockChange(pos.getXInt(), pos.getYInt(), pos.getZInt(), LogisticsPipes.LogisticsSubMultiBlock);
}
LogisticsBlockGenericSubMultiBlock.currentCreatedMultiBlock = null;
}
tilePipe.initialize(pipe);
tilePipe.sendUpdateToClient();
}
world.notifyBlockChange(i, j, k, block);
}
return placed;
}
use of network.rs485.logisticspipes.world.DoubleCoordinatesType in project LogisticsPipes by RS485.
the class LogisticsBlockGenericPipe method addDestroyEffects.
/**
* Spawn particles for when the block is destroyed. Due to the nature of how
* this is invoked, the x/y/z locations are not always guaranteed to host
* your block. So be sure to do proper sanity checks before assuming that
* the location is this block.
*
* @param worldObj
* The current world
* @param x
* X position to spawn the particle
* @param y
* Y position to spawn the particle
* @param z
* Z position to spawn the particle
* @param meta
* The metadata for the block before it was destroyed.
* @param effectRenderer
* A reference to the current effect renderer.
* @return True to prevent vanilla break particles from spawning.
*/
@SideOnly(Side.CLIENT)
@Override
public boolean addDestroyEffects(World worldObj, int x, int y, int z, int meta, EffectRenderer effectRenderer) {
CoreUnroutedPipe pipe = LogisticsBlockGenericPipe.getPipe(worldObj, x, y, z);
if (pipe == null) {
return false;
}
PlayerConfig config = LogisticsPipes.getClientPlayerConfig();
if (config.isUseNewRenderer()) {
LogisticsNewRenderPipe.renderDestruction(pipe, worldObj, x, y, z, effectRenderer);
} else {
IIcon icon = pipe.getIconProvider().getIcon(pipe.getIconIndexForItem());
byte its = 4;
for (int i = 0; i < its; ++i) {
for (int j = 0; j < its; ++j) {
for (int k = 0; k < its; ++k) {
if (pipe.isMultiBlock()) {
LPPositionSet<DoubleCoordinatesType<CoreMultiBlockPipe.SubBlockTypeForShare>> set = ((CoreMultiBlockPipe) pipe).getRotatedSubBlocks();
set.add(new DoubleCoordinatesType<>(0, 0, 0, CoreMultiBlockPipe.SubBlockTypeForShare.NON_SHARE));
for (DoubleCoordinates pos : set) {
int localx = x + pos.getXInt();
int localy = y + pos.getYInt();
int localz = z + pos.getZInt();
double px = localx + (i + 0.5D) / its;
double py = localy + (j + 0.5D) / its;
double pz = localz + (k + 0.5D) / its;
int random = rand.nextInt(6);
EntityDiggingFX fx = new EntityDiggingFX(worldObj, px, py, pz, px - localx - 0.5D, py - localy - 0.5D, pz - localz - 0.5D, LogisticsPipes.LogisticsPipeBlock, random, meta);
fx.setParticleIcon(icon);
effectRenderer.addEffect(fx.applyColourMultiplier(x, y, z));
}
} else {
double px = x + (i + 0.5D) / its;
double py = y + (j + 0.5D) / its;
double pz = z + (k + 0.5D) / its;
int random = rand.nextInt(6);
EntityDiggingFX fx = new EntityDiggingFX(worldObj, px, py, pz, px - x - 0.5D, py - y - 0.5D, pz - z - 0.5D, LogisticsPipes.LogisticsPipeBlock, random, meta);
fx.setParticleIcon(icon);
effectRenderer.addEffect(fx.applyColourMultiplier(x, y, z));
}
}
}
}
}
return true;
}
use of network.rs485.logisticspipes.world.DoubleCoordinatesType in project LogisticsPipes by RS485.
the class RenderTickHandler method renderWorldLast.
// private static final ResourceLocation TEXTURE = new ResourceLocation("logisticspipes", "textures/blocks/pipes/White.png");
@SubscribeEvent
@SideOnly(Side.CLIENT)
public void renderWorldLast(RenderWorldLastEvent worldEvent) {
// if (LogisticsRenderPipe.config.isUseNewRenderer()) {
if (displayPipeGhost()) {
Minecraft mc = Minecraft.getMinecraft();
EntityPlayer player = mc.player;
RayTraceResult box = mc.objectMouseOver;
if (box != null && box.typeOfHit == RayTraceResult.Type.BLOCK) {
ItemStack stack = FMLClientHandler.instance().getClient().player.inventory.mainInventory.get(FMLClientHandler.instance().getClient().player.inventory.currentItem);
CoreUnroutedPipe pipe = ((ItemLogisticsPipe) stack.getItem()).getDummyPipe();
World world = player.getEntityWorld();
EnumFacing side = box.sideHit;
BlockPos bPos = box.getBlockPos();
Block block = world.getBlockState(bPos).getBlock();
if (block == Blocks.SNOW_LAYER && block.isReplaceable(world, bPos)) {
side = EnumFacing.UP;
} else if (!block.isReplaceable(world, bPos)) {
bPos = bPos.offset(side);
}
boolean isFreeSpace = true;
ITubeOrientation orientation = null;
if (pipe instanceof CoreMultiBlockPipe) {
CoreMultiBlockPipe multipipe = (CoreMultiBlockPipe) pipe;
DoubleCoordinates placeAt = new DoubleCoordinates(bPos);
LPPositionSet<DoubleCoordinatesType<CoreMultiBlockPipe.SubBlockTypeForShare>> globalPos = new LPPositionSet<>(DoubleCoordinatesType.class);
globalPos.add(new DoubleCoordinatesType<>(placeAt, CoreMultiBlockPipe.SubBlockTypeForShare.NON_SHARE));
LPPositionSet<DoubleCoordinatesType<CoreMultiBlockPipe.SubBlockTypeForShare>> positions = multipipe.getSubBlocks();
orientation = multipipe.getTubeOrientation(player, bPos.getX(), bPos.getZ());
if (orientation != null) {
orientation.rotatePositions(positions);
positions.stream().map(pos -> pos.add(placeAt)).forEach(globalPos::add);
globalPos.addToAll(orientation.getOffset());
for (DoubleCoordinatesType<CoreMultiBlockPipe.SubBlockTypeForShare> pos : globalPos) {
if (!player.getEntityWorld().mayPlace(LPBlocks.pipe, pos.getBlockPos(), false, side, player)) {
TileEntity tile = player.getEntityWorld().getTileEntity(pos.getBlockPos());
boolean canPlace = false;
if (tile instanceof LogisticsTileGenericSubMultiBlock) {
if (CoreMultiBlockPipe.canShare(((LogisticsTileGenericSubMultiBlock) tile).getSubTypes(), pos.getType())) {
canPlace = true;
}
}
if (!canPlace) {
isFreeSpace = false;
break;
}
}
}
} else {
return;
}
} else {
if (!player.getEntityWorld().mayPlace(LPBlocks.pipe, bPos, false, side, player)) {
isFreeSpace = false;
}
}
if (isFreeSpace) {
GlStateManager.pushMatrix();
double x;
double y;
double z;
if (orientation != null) {
x = bPos.getX() + orientation.getOffset().getXInt() - player.prevPosX - ((player.posX - player.prevPosX) * worldEvent.getPartialTicks());
y = bPos.getY() + orientation.getOffset().getYInt() - player.prevPosY - ((player.posY - player.prevPosY) * worldEvent.getPartialTicks());
z = bPos.getZ() + orientation.getOffset().getZInt() - player.prevPosZ - ((player.posZ - player.prevPosZ) * worldEvent.getPartialTicks());
} else {
x = bPos.getX() - player.prevPosX - ((player.posX - player.prevPosX) * worldEvent.getPartialTicks());
y = bPos.getY() - player.prevPosY - ((player.posY - player.prevPosY) * worldEvent.getPartialTicks());
z = bPos.getZ() - player.prevPosZ - ((player.posZ - player.prevPosZ) * worldEvent.getPartialTicks());
}
GL11.glTranslated(x + 0.001, y + 0.001, z + 0.001);
GlStateManager.enableBlend();
// GL11.glDepthMask(false);
GlStateManager.disableTexture2D();
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
mc.renderEngine.bindTexture(new ResourceLocation("logisticspipes", "textures/blocks/pipes/white.png"));
SimpleServiceLocator.cclProxy.getRenderState().reset();
SimpleServiceLocator.cclProxy.getRenderState().setAlphaOverride(0xff);
GlStateManager.enableTexture2D();
SimpleServiceLocator.cclProxy.getRenderState().setAlphaOverride(0x50);
SimpleServiceLocator.cclProxy.getRenderState().startDrawing(GL11.GL_QUADS, DefaultVertexFormats.BLOCK);
pipe.getHighlightRenderer().renderHighlight(orientation);
SimpleServiceLocator.cclProxy.getRenderState().draw();
SimpleServiceLocator.cclProxy.getRenderState().setAlphaOverride(0xff);
GlStateManager.disableBlend();
GlStateManager.depthMask(true);
GlStateManager.popMatrix();
}
}
}
// }
}
use of network.rs485.logisticspipes.world.DoubleCoordinatesType in project LogisticsPipes by RS485.
the class ItemLogisticsPipe method onItemUse.
@Override
public //TODO use own pipe handling
boolean onItemUse(ItemStack itemstack, EntityPlayer entityplayer, World world, int x, int y, int z, int sideI, float par8, float par9, float par10) {
int side = sideI;
Block block = LogisticsPipes.LogisticsPipeBlock;
int i = x;
int j = y;
int k = z;
Block worldBlock = world.getBlock(i, j, k);
if (worldBlock == Blocks.snow) {
side = 1;
} else if (worldBlock != Blocks.vine && worldBlock != Blocks.tallgrass && worldBlock != Blocks.deadbush && (worldBlock == null || !worldBlock.isReplaceable(world, i, j, k))) {
if (side == 0) {
j--;
}
if (side == 1) {
j++;
}
if (side == 2) {
k--;
}
if (side == 3) {
k++;
}
if (side == 4) {
i--;
}
if (side == 5) {
i++;
}
}
if (itemstack.stackSize == 0) {
return false;
}
if (!dummyPipe.isMultiBlock()) {
if (world.canPlaceEntityOnSide(block, i, j, k, false, side, entityplayer, itemstack)) {
CoreUnroutedPipe pipe = LogisticsBlockGenericPipe.createPipe(this);
if (pipe == null) {
LogisticsPipes.log.log(Level.WARN, "Pipe failed to create during placement at {0},{1},{2}", new Object[] { i, j, k });
return true;
}
if (LogisticsBlockGenericPipe.placePipe(pipe, world, i, j, k, block, 0)) {
block.onBlockPlacedBy(world, i, j, k, entityplayer, itemstack);
itemstack.stackSize--;
}
return true;
} else {
return false;
}
} else {
CoreMultiBlockPipe multiPipe = (CoreMultiBlockPipe) dummyPipe;
boolean isFreeSpace = true;
DoubleCoordinates placeAt = new DoubleCoordinates(i, j, k);
LPPositionSet<DoubleCoordinatesType<CoreMultiBlockPipe.SubBlockTypeForShare>> globalPos = new LPPositionSet<>(DoubleCoordinatesType.class);
globalPos.add(new DoubleCoordinatesType<>(placeAt, CoreMultiBlockPipe.SubBlockTypeForShare.NON_SHARE));
LPPositionSet<DoubleCoordinatesType<CoreMultiBlockPipe.SubBlockTypeForShare>> positions = multiPipe.getSubBlocks();
ITubeOrientation orientation = multiPipe.getTubeOrientation(entityplayer, i, k);
if (orientation == null) {
return false;
}
orientation.rotatePositions(positions);
positions.stream().map(pos -> pos.add(placeAt)).forEach(globalPos::add);
globalPos.addToAll(orientation.getOffset());
placeAt.add(orientation.getOffset());
for (DoubleCoordinatesType<CoreMultiBlockPipe.SubBlockTypeForShare> pos : globalPos) {
if (!world.canPlaceEntityOnSide(block, pos.getXInt(), pos.getYInt(), pos.getZInt(), false, side, entityplayer, itemstack)) {
TileEntity tile = world.getTileEntity(pos.getXInt(), pos.getYInt(), pos.getZInt());
boolean canPlace = false;
if (tile instanceof LogisticsTileGenericSubMultiBlock) {
if (CoreMultiBlockPipe.canShare(((LogisticsTileGenericSubMultiBlock) tile).getSubTypes(), pos.getType())) {
canPlace = true;
}
}
if (!canPlace) {
isFreeSpace = false;
break;
}
}
}
if (isFreeSpace) {
CoreUnroutedPipe pipe = LogisticsBlockGenericPipe.createPipe(this);
if (pipe == null) {
LogisticsPipes.log.log(Level.WARN, "Pipe failed to create during placement at {0},{1},{2}", new Object[] { i, j, k });
return true;
}
if (LogisticsBlockGenericPipe.placePipe(pipe, world, placeAt.getXInt(), placeAt.getYInt(), placeAt.getZInt(), block, 0, orientation)) {
//TODO
block.onBlockPlacedBy(world, i, j, k, entityplayer, itemstack);
itemstack.stackSize--;
}
return true;
} else {
return false;
}
}
}
use of network.rs485.logisticspipes.world.DoubleCoordinatesType in project LogisticsPipes by RS485.
the class ItemLogisticsPipe method onItemUse.
@Nonnull
@Override
public EnumActionResult onItemUse(EntityPlayer player, World worldIn, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) {
Block block = LPBlocks.pipe;
IBlockState iblockstate = worldIn.getBlockState(pos);
Block worldBlock = iblockstate.getBlock();
if (!worldBlock.isReplaceable(worldIn, pos)) {
pos = pos.offset(facing);
}
ItemStack itemstack = player.getHeldItem(hand);
if (itemstack.isEmpty()) {
return EnumActionResult.FAIL;
}
if (!dummyPipe.isMultiBlock()) {
if (player.canPlayerEdit(pos, facing, itemstack) && worldIn.mayPlace(block, pos, false, facing, null)) {
CoreUnroutedPipe pipe = LogisticsBlockGenericPipe.createPipe(this);
if (pipe == null) {
LogisticsPipes.log.log(Level.WARN, "Pipe failed to create during placement at {0},{1},{2}", new Object[] { pos.getX(), pos.getY(), pos.getZ() });
return EnumActionResult.PASS;
}
if (LogisticsBlockGenericPipe.placePipe(pipe, worldIn, pos, block, null)) {
IBlockState state = worldIn.getBlockState(pos);
if (state.getBlock() == block) {
// setTileEntityNBT(world, player, pos, stack);
block.onBlockPlacedBy(worldIn, pos, state, player, itemstack);
if (player instanceof EntityPlayerMP)
CriteriaTriggers.PLACED_BLOCK.trigger((EntityPlayerMP) player, pos, itemstack);
IBlockState newBlockState = worldIn.getBlockState(pos);
SoundType soundtype = newBlockState.getBlock().getSoundType(newBlockState, worldIn, pos, player);
worldIn.playSound(player, pos, soundtype.getPlaceSound(), SoundCategory.BLOCKS, (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F);
itemstack.shrink(1);
}
}
return EnumActionResult.SUCCESS;
} else {
return EnumActionResult.FAIL;
}
} else {
CoreMultiBlockPipe multiPipe = (CoreMultiBlockPipe) dummyPipe;
boolean isFreeSpace = true;
DoubleCoordinates placeAt = new DoubleCoordinates(pos);
LPPositionSet<DoubleCoordinatesType<CoreMultiBlockPipe.SubBlockTypeForShare>> globalPos = new LPPositionSet<>(DoubleCoordinatesType.class);
globalPos.add(new DoubleCoordinatesType<>(placeAt, CoreMultiBlockPipe.SubBlockTypeForShare.NON_SHARE));
LPPositionSet<DoubleCoordinatesType<CoreMultiBlockPipe.SubBlockTypeForShare>> positions = multiPipe.getSubBlocks();
ITubeOrientation orientation = multiPipe.getTubeOrientation(player, pos.getX(), pos.getZ());
if (orientation == null) {
return EnumActionResult.FAIL;
}
orientation.rotatePositions(positions);
positions.stream().map(iPos -> iPos.add(placeAt)).forEach(globalPos::add);
globalPos.addToAll(orientation.getOffset());
placeAt.add(orientation.getOffset());
for (DoubleCoordinatesType<CoreMultiBlockPipe.SubBlockTypeForShare> iPos : globalPos) {
if (!player.canPlayerEdit(iPos.getBlockPos(), facing, itemstack) || !worldIn.mayPlace(block, iPos.getBlockPos(), false, facing, null)) {
TileEntity tile = worldIn.getTileEntity(iPos.getBlockPos());
boolean canPlace = false;
if (tile instanceof LogisticsTileGenericSubMultiBlock) {
if (CoreMultiBlockPipe.canShare(((LogisticsTileGenericSubMultiBlock) tile).getSubTypes(), iPos.getType())) {
canPlace = true;
}
}
if (!canPlace) {
isFreeSpace = false;
break;
}
}
}
if (isFreeSpace) {
CoreUnroutedPipe pipe = LogisticsBlockGenericPipe.createPipe(this);
if (pipe == null) {
LogisticsPipes.log.log(Level.WARN, "Pipe failed to create during placement at {0},{1},{2}", new Object[] { pos.getX(), pos.getY(), pos.getZ() });
return EnumActionResult.SUCCESS;
}
if (LogisticsBlockGenericPipe.placePipe(pipe, worldIn, placeAt.getBlockPos(), block, orientation)) {
IBlockState state = worldIn.getBlockState(placeAt.getBlockPos());
if (state.getBlock() == block) {
// setTileEntityNBT(world, player, pos, stack);
block.onBlockPlacedBy(worldIn, pos, state, player, itemstack);
if (player instanceof EntityPlayerMP)
CriteriaTriggers.PLACED_BLOCK.trigger((EntityPlayerMP) player, placeAt.getBlockPos(), itemstack);
IBlockState newBlockState = worldIn.getBlockState(placeAt.getBlockPos());
SoundType soundtype = newBlockState.getBlock().getSoundType(newBlockState, worldIn, placeAt.getBlockPos(), player);
worldIn.playSound(player, placeAt.getBlockPos(), soundtype.getPlaceSound(), SoundCategory.BLOCKS, (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F);
itemstack.shrink(1);
}
}
return EnumActionResult.SUCCESS;
} else {
return EnumActionResult.FAIL;
}
}
}
Aggregations