package com.thebrokenrail.energonrelics.api.block.energy; import com.thebrokenrail.energonrelics.EnergonRelics; import com.thebrokenrail.energonrelics.api.block.SimpleBlockWithEntity; import com.thebrokenrail.energonrelics.api.block.entity.core.EnergyProviderBlockEntity; import com.thebrokenrail.energonrelics.client.block.entity.render.HighlightBlockEntityRenderer; 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.loot.context.LootContext; import net.minecraft.loot.context.LootContextParameters; import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; import net.minecraft.util.Identifier; 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; /** * Block That Interacts With Energy */ public abstract class EnergyBlock extends SimpleBlockWithEntity { private static final List blocks = new ArrayList<>(); public EnergyBlock(Settings settings) { super(settings); } @Override public void register(Identifier id) { super.register(id); blocks.add(this); } @Environment(EnvType.CLIENT) public static void initRenderer() { for (EnergyBlock block : blocks) { BlockEntityRendererRegistry.INSTANCE.register(block.type, block.getRenderer()); } } @Environment(EnvType.CLIENT) protected Function> getRenderer() { return HighlightBlockEntityRenderer::new; } @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.Items.NETWORK_CHIP_ITEM) { if (!((EnergyProviderBlockEntity) entity).hasStack()) { if (!world.isClient()) { ((EnergyProviderBlockEntity) entity).placeStack(stack, world); stack.setCount(0); } EnergonRelics.Extras.playBeep(world, pos); return ActionResult.SUCCESS; } else { return ActionResult.FAIL; } } else if (stack.isEmpty() && hand == Hand.MAIN_HAND) { if (((EnergyProviderBlockEntity) entity).hasStack()) { if (!world.isClient()) { ItemStack newStack = ((EnergyProviderBlockEntity) entity).takeStack(world); player.setStackInHand(hand, newStack); } EnergonRelics.Extras.playBeep(world, pos); return ActionResult.SUCCESS; } else { return ActionResult.FAIL; } } else { return ActionResult.PASS; } } else { return ActionResult.PASS; } } @SuppressWarnings("deprecation") @Override public List getDroppedStacks(BlockState state, LootContext.Builder builder) { List stacks = new ArrayList<>(super.getDroppedStacks(state, builder)); if (!builder.getWorld().isClient()) { BlockEntity entity = builder.getNullable(LootContextParameters.BLOCK_ENTITY); if (entity instanceof EnergyProviderBlockEntity && ((EnergyProviderBlockEntity) entity).isEnergyProvider()) { stacks.add(((EnergyProviderBlockEntity) entity).takeStack(builder.getWorld())); } } return stacks; } }