use of net.minecraft.block.entity.BlockEntity in project wildmod by Osmiooo.
the class FrogEntitySpawnEgg method useOnBlock.
@Override
public ActionResult useOnBlock(ItemUsageContext context) {
World world = context.getWorld();
ItemStack itemStack = context.getStack();
BlockPos blockPos = context.getBlockPos();
Direction direction = context.getSide();
BlockState blockState = world.getBlockState(blockPos);
if (!(world instanceof ServerWorld)) {
return ActionResult.SUCCESS;
} else {
if (blockState.isOf(Blocks.SPAWNER)) {
BlockEntity blockEntity = world.getBlockEntity(blockPos);
if (blockEntity instanceof MobSpawnerBlockEntity) {
MobSpawnerLogic mobSpawnerLogic = ((MobSpawnerBlockEntity) blockEntity).getLogic();
EntityType<?> entityType = this.getEntityType(itemStack.getNbt());
mobSpawnerLogic.setEntityId(entityType);
blockEntity.markDirty();
world.updateListeners(blockPos, blockState, blockState, Block.NOTIFY_ALL);
itemStack.decrement(1);
return ActionResult.CONSUME;
}
}
FrogEntity frogEntity = new FrogEntity(RegisterEntities.FROG, world);
BlockPos blockPos3;
if (blockState.getCollisionShape(world, blockPos).isEmpty()) {
blockPos3 = blockPos;
} else {
blockPos3 = blockPos.offset(direction);
}
if (FrogEntity.canColdSpawn(world, blockPos3)) {
frogEntity.setVariant(FrogEntity.Variant.COLD);
} else if (FrogEntity.canTemperateSpawn(world, blockPos3)) {
frogEntity.setVariant(FrogEntity.Variant.WARM);
}
frogEntity.setPos(blockPos3.getX() + 0.5, blockPos3.getY() + 0.1, blockPos3.getZ() + 0.5);
frogEntity.setYaw((float) Math.random() * 360 * (float) Math.PI / 180);
world.spawnEntity(frogEntity);
itemStack.decrement(1);
world.emitGameEvent(context.getPlayer(), GameEvent.ENTITY_PLACE, blockPos);
return ActionResult.CONSUME;
}
}
use of net.minecraft.block.entity.BlockEntity in project canvas by vram-guild.
the class MixinChunkRenderer method onRebuildChunk.
@Inject(method = "rebuildChunk", at = @At("HEAD"), cancellable = true, require = 1)
private void onRebuildChunk(final float x, final float y, final float z, final ChunkRenderTask chunkRenderTask, final CallbackInfo ci) {
final TerrainRenderContext renderContext = TerrainRenderContext.POOL.get();
final ChunkRebuildHelper help = renderContext.chunkRebuildHelper;
help.clear();
final ChunkRenderData chunkRenderData = ChunkRenderDataStore.claim();
final ChunkRenderDataExt chunkDataExt = (ChunkRenderDataExt) chunkRenderData;
final BlockPos.Mutable origin = this.origin;
final World world = this.world;
if (world != null) {
chunkRenderTask.getLock().lock();
try {
if (chunkRenderTask.getStage() != ChunkRenderTask.Stage.COMPILING) {
return;
}
chunkRenderTask.setRenderData(chunkRenderData);
} finally {
chunkRenderTask.getLock().unlock();
}
// PERF: avoid allocation
final ChunkOcclusionGraphBuilder visibilityData = new ChunkOcclusionGraphBuilder();
// PERF: avoid allocation
final HashSet<BlockEntity> blockEntities = Sets.newHashSet();
final ChunkRendererRegion vanillaRegion = chunkRenderTask.takeRegion();
if (vanillaRegion != null) {
final FastRenderRegion renderRegion = ((ChunkRendererRegionExt) vanillaRegion).canvas_fastRegion();
++chunkUpdateCount;
help.prepareCollectors(origin.getX(), origin.getY(), origin.getZ());
renderContext.setChunkTask(chunkRenderTask);
/**
* Capture the block layer result flags so our renderer can update them when more
* than one layer is rendered for a single model. This is also where we signal the
* renderer to prepare for a new chunk using the data we've accumulated up to this point.
*/
renderContext.prepare((ChunkRenderer) (Object) this, origin);
// NB: We don't use this and it probably isn't needed but leaving just in case - cost is low
BlockModelRenderer.enableBrightnessCache();
final BlockRenderManager blockRenderManager = MinecraftClient.getInstance().getBlockRenderManager();
final BlockPos.Mutable searchPos = help.searchPos;
final int xMin = origin.getX();
final int yMin = origin.getY();
final int zMin = origin.getZ();
final int xMax = xMin + 16;
final int yMax = yMin + 16;
final int zMax = zMin + 16;
for (int xPos = xMin; xPos < xMax; xPos++) {
for (int yPos = yMin; yPos < yMax; yPos++) {
for (int zPos = zMin; zPos < zMax; zPos++) {
final BlockState blockState = renderRegion.getBlockState(xPos, yPos, zPos);
searchPos.set(xPos, yPos, zPos);
if (blockState.isFullOpaque(renderRegion, searchPos)) {
visibilityData.markClosed(searchPos);
}
if (blockState.getBlock().hasBlockEntity()) {
final BlockEntity blockEntity = renderRegion.getBlockEntity(searchPos, WorldChunk.CreationType.CHECK);
if (blockEntity != null) {
final BlockEntityRenderer<BlockEntity> blockEntityRenderer = BlockEntityRenderDispatcher.INSTANCE.get(blockEntity);
if (blockEntityRenderer != null) {
// Fixes MC-112730 - no reason to render both globally and in chunk
if (blockEntityRenderer.method_3563(blockEntity)) {
// global renderer - like beacons
blockEntities.add(blockEntity);
} else {
// chunk-local renderer
chunkRenderData.addBlockEntity(blockEntity);
}
}
}
}
BlockRenderLayer renderLayer;
// UGLY: we are relying on knowledge that fluid state is directly derived from block state, which
// may not be true in future versions and may break. However, is significantly faster to re-use block
// state here vs. retrieving it again.
final FluidState fluidState = blockState.getFluidState();
if (!fluidState.isEmpty()) {
renderLayer = fluidState.getRenderLayer();
// TODO: apply appropriate shader props for fluids
final FluidBufferBuilder fluidBuilder = help.fluidBuilder.prepare(help.getCollector(renderLayer).get(Canvas.MATERIAL_STANDARD, ShaderProps.waterProps()), searchPos, renderLayer);
blockRenderManager.tesselateFluid(searchPos, renderRegion, fluidBuilder, fluidState);
}
if (blockState.getRenderType() == BlockRenderType.MODEL) {
renderContext.tesselateBlock(blockState, searchPos);
}
}
}
}
if (!help.solidCollector.isEmpty()) {
chunkRenderData.markBufferInitialized(BlockRenderLayer.SOLID);
chunkDataExt.canvas_setNonEmpty(BlockRenderLayer.SOLID);
final UploadableChunk.Solid abandoned = uploadSolid.getAndSet(help.solidCollector.packUploadSolid());
if (abandoned != null) {
abandoned.cancel();
}
}
if (!help.translucentCollector.isEmpty()) {
final VertexCollectorList vcl = help.translucentCollector;
chunkRenderData.markBufferInitialized(BlockRenderLayer.TRANSLUCENT);
chunkDataExt.canvas_setNonEmpty(BlockRenderLayer.TRANSLUCENT);
vcl.setViewCoordinates(x, y, z);
chunkDataExt.canvas_collectorState(vcl.getCollectorState(null));
final UploadableChunk.Translucent abandoned = uploadTranslucent.getAndSet(vcl.packUploadTranslucent());
if (abandoned != null) {
abandoned.cancel();
}
}
/**
* Release all references. Probably not necessary but would be $#%! to debug if it is.
*/
renderContext.release();
BlockModelRenderer.disableBrightnessCache();
}
chunkRenderData.setOcclusionGraph(visibilityData.build());
lock.lock();
try {
help.tileEntitiesToAdd.addAll(blockEntities);
help.tileEntitiesToRemove.addAll(this.blockEntities);
help.tileEntitiesToAdd.removeAll(this.blockEntities);
help.tileEntitiesToRemove.removeAll(blockEntities);
this.blockEntities.clear();
this.blockEntities.addAll(blockEntities);
renderer.updateBlockEntities(help.tileEntitiesToRemove, help.tileEntitiesToAdd);
} finally {
lock.unlock();
}
}
ci.cancel();
}
use of net.minecraft.block.entity.BlockEntity in project meteor-client by MeteorDevelopment.
the class GhostHand method onTick.
@EventHandler
private void onTick(TickEvent.Pre event) {
if (!mc.options.useKey.isPressed() || mc.player.isSneaking())
return;
for (BlockEntity blockEntity : Utils.blockEntities()) {
if (new BlockPos(mc.player.raycast(mc.interactionManager.getReachDistance(), mc.getTickDelta(), false).getPos()).equals(blockEntity.getPos()))
return;
}
Vec3d nextPos = new Vec3d(0, 0, 0.1).rotateX(-(float) Math.toRadians(mc.player.getPitch())).rotateY(-(float) Math.toRadians(mc.player.getYaw()));
for (int i = 1; i < mc.interactionManager.getReachDistance() * 10; i++) {
BlockPos curPos = new BlockPos(mc.player.getCameraPosVec(mc.getTickDelta()).add(nextPos.multiply(i)));
if (posList.contains(curPos))
continue;
posList.add(curPos);
for (BlockEntity blockEntity : Utils.blockEntities()) {
if (blockEntity.getPos().equals(curPos)) {
mc.interactionManager.interactBlock(mc.player, mc.world, Hand.MAIN_HAND, new BlockHitResult(mc.player.getPos(), Direction.UP, curPos, true));
return;
}
}
}
posList.clear();
}
use of net.minecraft.block.entity.BlockEntity in project tweakermore by Fallen-Breath.
the class SignTextCopier method copySignText.
public static boolean copySignText(KeyAction action, IKeybind key) {
MinecraftClient mc = MinecraftClient.getInstance();
if (mc.world != null && mc.crosshairTarget != null && mc.crosshairTarget.getType() == HitResult.Type.BLOCK) {
BlockPos blockPos = ((BlockHitResult) mc.crosshairTarget).getBlockPos();
BlockState blockState = mc.world.getBlockState(blockPos);
if (blockState.getBlock() instanceof AbstractSignBlock) {
BlockEntity blockEntity = mc.world.getBlockEntity(blockPos);
if (blockEntity instanceof SignBlockEntity) {
String text = Joiner.on("\n").join(Arrays.stream(((SignBlockEntity) blockEntity).text).map(Text::getString).collect(Collectors.toList()));
text = StringUtils.strip(text);
if (!text.isEmpty()) {
mc.keyboard.setClipboard(text);
InfoUtils.printActionbarMessage("tweakermore.config.copySignTextToClipBoard.sign_copied", blockState.getBlock().getName());
} else {
InfoUtils.printActionbarMessage("tweakermore.config.copySignTextToClipBoard.empty_sign", blockState.getBlock().getName());
}
return true;
}
}
}
InfoUtils.printActionbarMessage("tweakermore.config.copySignTextToClipBoard.no_sign");
return false;
}
use of net.minecraft.block.entity.BlockEntity in project FastAsyncWorldEdit by IntellectualSites.
the class FabricWorld method clearContainerBlockContents.
@Override
public boolean clearContainerBlockContents(BlockVector3 position) {
checkNotNull(position);
BlockEntity tile = getWorld().getBlockEntity(FabricAdapter.toBlockPos(position));
if ((tile instanceof Clearable)) {
((Clearable) tile).clear();
return true;
}
return false;
}
Aggregations