use of mcmultipart.block.TileMultipartContainer in project LogisticsPipes by RS485.
the class MCMPProxy method onDrawHighlight.
@SubscribeEvent
@SideOnly(Side.CLIENT)
public void onDrawHighlight(DrawBlockHighlightEvent event) {
if (event instanceof DrawMultipartHighlightEvent) {
return;
}
RayTraceResult hit = event.getTarget();
if (hit.typeOfHit != RayTraceResult.Type.BLOCK) {
return;
}
BlockPos pos = hit.getBlockPos();
EntityPlayer player = event.getPlayer();
if (player == null) {
return;
}
World world = player.world;
if (world == null) {
return;
}
if (world.getBlockState(pos).getBlock() == LPBlocks.pipe) {
Optional<TileMultipartContainer> tile = BlockMultipartContainer.getTile(world, pos);
if (!tile.isPresent()) {
return;
}
int slotID = hit.subHit;
if (slotID < 0) {
return;
}
PartInfo info = tile.get().getParts().get(MCMultiPart.slotRegistry.getValue(slotID));
if (info == null || !(hit.hitInfo instanceof RayTraceResult)) {
return;
}
hit = (RayTraceResult) hit.hitInfo;
float partialTicks = event.getPartialTicks();
if (!MinecraftForge.EVENT_BUS.post(new DrawMultipartHighlightEvent(event.getContext(), player, hit, slotID, partialTicks, info))) {
GlStateManager.enableBlend();
GlStateManager.tryBlendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO);
GlStateManager.glLineWidth(2.0F);
GlStateManager.disableTexture2D();
GlStateManager.depthMask(false);
IBlockState state = info.getState();
if (state.getMaterial() != Material.AIR && world.getWorldBorder().contains(pos)) {
double x = player.lastTickPosX + (player.posX - player.lastTickPosX) * partialTicks;
double y = player.lastTickPosY + (player.posY - player.lastTickPosY) * partialTicks;
double z = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * partialTicks;
RenderGlobal.drawSelectionBoundingBox(info.getPart().getSelectedBoundingBox(info).grow(0.002).offset(-x, -y, -z), 0.0F, 0.0F, 0.0F, 0.4F);
}
GlStateManager.depthMask(true);
GlStateManager.enableTexture2D();
GlStateManager.disableBlend();
}
event.setCanceled(true);
}
}
use of mcmultipart.block.TileMultipartContainer in project LogisticsPipes by RS485.
the class LPMicroblockBlock method removedByPlayer.
@Override
@ModDependentMethod(modId = LPConstants.mcmpModID)
public boolean removedByPlayer(@Nonnull IBlockState state, World world, @Nonnull BlockPos pos, @Nonnull EntityPlayer player, boolean willHarvest) {
Pair<Vec3d, Vec3d> vectors = RayTraceHelper.getRayTraceVectors(player);
RayTraceResult hit = collisionRayTrace(state, world, pos, vectors.getLeft(), vectors.getRight());
Optional<TileMultipartContainer> tile = getTile(world, pos);
if (hit != null && tile.isPresent() && hit.subHit >= 0) {
if (!world.isRemote) {
IPartSlot slot = MCMultiPart.slotRegistry.getValue(hit.subHit);
boolean canRemove = tile.get().get(slot).map(i -> {
if (i.getPart().canPlayerDestroy(i, player)) {
i.getPart().onPartHarvested(i, player);
if (player == null || !player.capabilities.isCreativeMode) {
i.getPart().getDrops(i.getPartWorld(), pos, i, 0).forEach(s -> spawnAsEntity(world, pos, s));
}
return true;
} else {
return false;
}
}).orElse(true);
if (canRemove)
tile.get().removePart(slot);
}
}
if (hit != null && hit.subHit == -1) {
return super.removedByPlayer(state, world, pos, player, willHarvest);
}
return false;
}
Aggregations