package com.thebrokenrail.energonrelics.block.util; import com.thebrokenrail.energonrelics.EnergonRelics; import com.thebrokenrail.energonrelics.client.render.HighlightBlockEntityRenderer; import com.thebrokenrail.energonrelics.component.NetworkComponent; import com.thebrokenrail.energonrelics.energy.core.EnergyProviderBlockEntity; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.client.rendereregistry.v1.BlockEntityRendererRegistry; import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher; import net.minecraft.client.render.block.entity.BlockEntityRenderer; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import java.util.ArrayList; import java.util.List; import java.util.function.Function; public abstract class EnergyProviderBlock extends SimpleBlockWithEntity { private static final List blocks = new ArrayList<>(); public EnergyProviderBlock(Settings settings) { super(settings); } @Override public void register(String name) { super.register(name); blocks.add(this); } @Environment(EnvType.CLIENT) public static void initRenderer() { for (EnergyProviderBlock block : blocks) { BlockEntityRendererRegistry.INSTANCE.register(block.type, block.getRenderer()); } } @Environment(EnvType.CLIENT) protected Function> getRenderer() { return HighlightBlockEntityRenderer::new; } private void setEnergyProviderSource(World world, BlockPos pos, ItemStack stack, boolean remove) { ServerWorld serverWorld = (ServerWorld) world; NetworkComponent component = NetworkComponent.getInstance(serverWorld); if (remove) { component.removeSource(EnergonRelics.NETWORK_CHIP_ITEM.getID(stack), pos); } else { component.addSource(EnergonRelics.NETWORK_CHIP_ITEM.getID(stack), pos); } } @Override @SuppressWarnings("deprecation") public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { BlockEntity entity = world.getBlockEntity(pos); if (entity instanceof EnergyProviderBlockEntity && ((EnergyProviderBlockEntity) entity).isEnergyProvider()) { ItemStack stack = player.getStackInHand(hand); if (stack.getItem() == EnergonRelics.NETWORK_CHIP_ITEM) { if (!((EnergyProviderBlockEntity) entity).hasStack()) { if (!world.isClient()) { setEnergyProviderSource(world, pos, stack, false); ((EnergyProviderBlockEntity) entity).placeStack(stack); stack.setCount(0); } return ActionResult.SUCCESS; } else { return ActionResult.FAIL; } } else if (stack.isEmpty() && hand == Hand.MAIN_HAND) { if (!world.isClient()) { ItemStack newStack = ((EnergyProviderBlockEntity) entity).takeStack(); player.setStackInHand(hand, newStack); setEnergyProviderSource(world, pos, newStack, true); } return ActionResult.SUCCESS; } else { return ActionResult.PASS; } } else { return ActionResult.PASS; } } }