NaturesAura/src/main/java/de/ellpeck/naturesaura/blocks/BlockEnderCrate.java

163 lines
7 KiB
Java
Raw Normal View History

2019-02-17 22:51:05 +01:00
package de.ellpeck.naturesaura.blocks;
import de.ellpeck.naturesaura.NaturesAura;
2021-12-04 15:40:09 +01:00
import de.ellpeck.naturesaura.api.misc.ILevelData;
2020-01-28 18:08:56 +01:00
import de.ellpeck.naturesaura.blocks.tiles.ModTileEntities;
2021-12-04 15:40:09 +01:00
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityEnderCrate;
2019-02-18 12:15:18 +01:00
import de.ellpeck.naturesaura.blocks.tiles.render.RenderEnderCrate;
2020-01-29 01:34:58 +01:00
import de.ellpeck.naturesaura.data.BlockStateGenerator;
2019-02-18 19:30:35 +01:00
import de.ellpeck.naturesaura.items.ModItems;
2020-01-29 01:34:58 +01:00
import de.ellpeck.naturesaura.reg.ICustomBlockState;
2019-02-18 12:15:18 +01:00
import de.ellpeck.naturesaura.reg.ITESRProvider;
2021-01-14 23:15:02 +01:00
import net.minecraft.block.AnvilBlock;
import net.minecraft.block.BlockState;
import net.minecraft.block.SoundType;
2019-02-17 22:51:05 +01:00
import net.minecraft.block.material.Material;
2021-12-04 15:40:09 +01:00
import net.minecraft.client.renderer.tileentity.BlockEntityRenderer;
import net.minecraft.client.renderer.tileentity.BlockEntityRendererDispatcher;
2019-02-18 19:30:35 +01:00
import net.minecraft.client.resources.I18n;
import net.minecraft.client.util.ITooltipFlag;
2021-12-04 15:40:09 +01:00
import net.minecraft.entity.player.Player;
import net.minecraft.entity.player.ServerPlayer;
2019-02-18 19:30:35 +01:00
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
2019-11-04 19:08:49 +01:00
import net.minecraft.item.Items;
import net.minecraft.particles.ParticleTypes;
2021-12-04 15:40:09 +01:00
import net.minecraft.tileentity.BlockEntity;
import net.minecraft.tileentity.BlockEntityType;
import net.minecraft.util.InteractionResult;
2019-10-20 22:30:49 +02:00
import net.minecraft.util.Hand;
2019-02-18 12:15:18 +01:00
import net.minecraft.util.Tuple;
2019-02-17 22:51:05 +01:00
import net.minecraft.util.math.BlockPos;
2019-11-04 19:08:49 +01:00
import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent;
2019-02-18 19:30:35 +01:00
import net.minecraft.util.text.TextFormatting;
2021-12-04 15:40:09 +01:00
import net.minecraft.level.IBlockReader;
import net.minecraft.level.Level;
2019-11-04 19:08:49 +01:00
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
2019-02-18 19:30:35 +01:00
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.AnvilUpdateEvent;
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
2019-10-20 22:30:49 +02:00
import net.minecraftforge.eventbus.api.SubscribeEvent;
2020-01-24 17:05:41 +01:00
import net.minecraftforge.fml.network.NetworkHooks;
2019-02-17 22:51:05 +01:00
2019-02-18 19:30:35 +01:00
import javax.annotation.Nullable;
import java.lang.ref.WeakReference;
import java.util.List;
2019-02-18 12:15:18 +01:00
import java.util.Random;
2020-01-28 18:08:56 +01:00
import java.util.function.Function;
import java.util.function.Supplier;
2019-02-18 12:15:18 +01:00
2021-12-04 15:40:09 +01:00
public class BlockEnderCrate extends BlockContainerImpl implements ITESRProvider<BlockEntityEnderCrate>, ICustomBlockState {
2019-02-18 19:30:35 +01:00
// This is terrible but I can't see a better solution right now so oh well
2021-12-04 15:40:09 +01:00
private static final ThreadLocal<WeakReference<Level>> CACHED_WORLD = new ThreadLocal<>();
2019-02-18 19:30:35 +01:00
2019-02-17 22:51:05 +01:00
public BlockEnderCrate() {
2021-12-04 15:40:09 +01:00
super("ender_crate", BlockEntityEnderCrate::new, Properties.create(Material.ROCK).hardnessAndResistance(5F).setLightLevel(s -> 7).sound(SoundType.STONE));
2019-02-18 19:30:35 +01:00
MinecraftForge.EVENT_BUS.register(this);
}
public static String getEnderName(ItemStack stack) {
2019-11-04 19:08:49 +01:00
if (!stack.hasTag())
2019-02-18 19:30:35 +01:00
return "";
2019-11-04 19:08:49 +01:00
return stack.getTag().getString(NaturesAura.MOD_ID + ":ender_name");
2019-02-18 19:30:35 +01:00
}
2019-10-20 22:30:49 +02:00
@OnlyIn(Dist.CLIENT)
2019-11-04 19:08:49 +01:00
public static void addEnderNameInfo(ItemStack stack, List<ITextComponent> tooltip) {
2019-02-18 19:30:35 +01:00
String name = getEnderName(stack);
if (name != null && !name.isEmpty())
2019-11-04 19:08:49 +01:00
tooltip.add(new StringTextComponent(TextFormatting.DARK_PURPLE + I18n.format("info." + NaturesAura.MOD_ID + ".ender_name",
TextFormatting.ITALIC + name + TextFormatting.RESET)));
2019-02-18 19:30:35 +01:00
else
2019-11-04 19:08:49 +01:00
tooltip.add(new StringTextComponent(TextFormatting.DARK_PURPLE + I18n.format("info." + NaturesAura.MOD_ID + ".ender_name.missing")));
2019-02-18 19:30:35 +01:00
}
@SubscribeEvent
public void onRightClick(PlayerInteractEvent.RightClickBlock event) {
2021-12-04 15:40:09 +01:00
Level level = event.getLevel();
2019-02-18 19:30:35 +01:00
BlockPos pos = event.getPos();
2021-12-04 15:40:09 +01:00
BlockState state = level.getBlockState(pos);
2019-10-20 22:30:49 +02:00
if (state.getBlock() instanceof AnvilBlock) {
2021-12-04 15:40:09 +01:00
CACHED_WORLD.set(new WeakReference<>(level));
2019-02-18 19:30:35 +01:00
}
}
@SubscribeEvent
public void onAnvilUpdate(AnvilUpdateEvent event) {
2021-12-04 15:40:09 +01:00
WeakReference<Level> level = CACHED_WORLD.get();
if (level == null || level.get() == null)
2019-02-18 19:30:35 +01:00
return;
ItemStack stack = event.getLeft();
if (stack.getItem() != Item.getItemFromBlock(this) && stack.getItem() != ModItems.ENDER_ACCESS)
return;
ItemStack second = event.getRight();
if (second.getItem() != Items.ENDER_EYE || second.getCount() < stack.getCount())
return;
String name = event.getName();
if (name == null || name.isEmpty())
return;
2021-12-04 15:40:09 +01:00
if (ILevelData.getOverworldData(level.get()).isEnderStorageLocked(name))
2019-02-18 19:30:35 +01:00
return;
ItemStack output = stack.copy();
2019-11-04 19:08:49 +01:00
output.getOrCreateTag().putString(NaturesAura.MOD_ID + ":ender_name", name);
2019-02-18 19:30:35 +01:00
event.setOutput(output);
event.setMaterialCost(stack.getCount());
event.setCost(1);
2019-02-17 22:51:05 +01:00
}
@Override
2021-12-04 15:40:09 +01:00
public InteractionResult onBlockActivated(BlockState state, Level levelIn, BlockPos pos, Player player, Hand handIn, BlockRayTraceResult hit) {
if (!levelIn.isClientSide) {
BlockEntity tile = levelIn.getBlockEntity(pos);
if (tile instanceof BlockEntityEnderCrate) {
BlockEntityEnderCrate crate = (BlockEntityEnderCrate) tile;
2019-02-18 13:00:54 +01:00
if (crate.canOpen()) {
2020-12-09 04:04:09 +01:00
crate.drainAura(2500);
2021-12-04 15:40:09 +01:00
NetworkHooks.openGui((ServerPlayer) player, crate, pos);
2019-02-18 13:00:54 +01:00
}
2019-02-17 22:51:05 +01:00
}
}
2021-12-04 15:40:09 +01:00
return InteractionResult.SUCCESS;
2019-02-17 22:51:05 +01:00
}
2019-02-18 12:15:18 +01:00
2019-02-18 19:30:35 +01:00
@Override
2019-10-20 22:30:49 +02:00
@OnlyIn(Dist.CLIENT)
2021-12-04 15:40:09 +01:00
public void addInformation(ItemStack stack, @Nullable IBlockReader levelIn, List<ITextComponent> tooltip, ITooltipFlag flagIn) {
2019-02-18 19:30:35 +01:00
addEnderNameInfo(stack, tooltip);
}
2019-02-18 12:15:18 +01:00
@Override
2019-10-20 22:30:49 +02:00
@OnlyIn(Dist.CLIENT)
2021-12-04 15:40:09 +01:00
public void animateTick(BlockState stateIn, Level levelIn, BlockPos pos, Random rand) {
2019-02-18 12:15:18 +01:00
for (int i = 0; i < 3; ++i) {
int j = rand.nextInt(2) * 2 - 1;
int k = rand.nextInt(2) * 2 - 1;
double d0 = (double) pos.getX() + 0.5D + 0.25D * (double) j;
double d1 = (float) pos.getY() + rand.nextFloat();
2019-02-18 12:15:18 +01:00
double d2 = (double) pos.getZ() + 0.5D + 0.25D * (double) k;
double d3 = rand.nextFloat() * (float) j;
2019-02-18 12:15:18 +01:00
double d4 = ((double) rand.nextFloat() - 0.5D) * 0.125D;
double d5 = rand.nextFloat() * (float) k;
2021-12-04 15:40:09 +01:00
levelIn.addParticle(ParticleTypes.PORTAL, d0, d1, d2, d3, d4, d5);
2019-02-18 12:15:18 +01:00
}
}
@Override
2021-12-04 15:40:09 +01:00
public Tuple<BlockEntityType<BlockEntityEnderCrate>, Supplier<Function<? super BlockEntityRendererDispatcher, ? extends BlockEntityRenderer<? super BlockEntityEnderCrate>>>> getTESR() {
return new Tuple<>(ModTileEntities.ENDER_CRATE, () -> RenderEnderCrate::new);
2019-02-18 12:15:18 +01:00
}
2020-01-29 01:34:58 +01:00
@Override
public void generateCustomBlockState(BlockStateGenerator generator) {
generator.simpleBlock(this, generator.models().cubeBottomTop(this.getBaseName(),
generator.modLoc("block/" + this.getBaseName()),
generator.modLoc("block/" + this.getBaseName() + "_bottom"),
generator.modLoc("block/" + this.getBaseName() + "_top")));
}
2019-02-17 22:51:05 +01:00
}