package com.dairymoose.modernlife.tileentities; import com.dairymoose.entity.projectile.ThrownSeedEntity; import com.dairymoose.modernlife.core.CustomBlocks; import com.mojang.datafixers.types.Type; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import net.minecraft.core.BlockPos; import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.ItemTags; import net.minecraft.tags.TagKey; import net.minecraft.world.Container; import net.minecraft.world.ContainerHelper; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; /* loaded from: outputsrg.jar:com/dairymoose/modernlife/tileentities/SeedSpreaderBlockEntity.class */ public class SeedSpreaderBlockEntity extends BlockEntity implements Container { public static final int SEED_SPREADER_CONTAINER_SIZE = 9; private NonNullList items; private TagKey seedTag; final int DIAMETER = 9; final int VERTICAL_SPAN = 5; public static final double LAUNCHER_HEIGHT = 0.109375d; public static final double LAUNCHER_HEIGHT_SAME_LEVEL = 0.75d; public static final double LAUNCHER_RADIUS = 0.5d; int counter; Map recentLocations; public static final double PROJECTILE_GRAVITY = 0.03d; public static final BlockEntityType SEED_SPREADER = BlockEntityType.Builder.of(SeedSpreaderBlockEntity::new, new Block[]{(Block) CustomBlocks.BLOCK_SEED_SPREADER.get()}).build((Type) null); private static final Logger LOGGER = LogManager.getLogger(); public static int RECENT_LOCATIONS_EXPIRY_MS = 5000; public static List extraItems = new ArrayList(); static { extraItems.add(Items.NETHER_WART); extraItems.add(Items.POTATO); extraItems.add(Items.CARROT); } public SeedSpreaderBlockEntity(BlockPos pos, BlockState state) { super(SEED_SPREADER, pos, state); this.items = NonNullList.withSize(9, ItemStack.EMPTY); this.seedTag = ItemTags.create(new ResourceLocation("forge", "seeds")); this.DIAMETER = 9; this.VERTICAL_SPAN = 5; this.counter = 0; this.recentLocations = new HashMap(); } double freeFallTime(double h, double g) { return Math.sqrt((2.0d * h) / g); } void launchTo(ThrownSeedEntity thrownSeed, double x, double y, double z, BlockPos pos) { this.recentLocations.put(pos, Long.valueOf(System.currentTimeMillis())); double xMid = pos.getX() + 0.5d; double zMid = pos.getZ() + 0.5d; double xDiff = xMid - x; double zDiff = zMid - z; double launchYaw = Math.atan2(zDiff, xDiff); double launchX = (Math.cos(launchYaw) * 0.5d) + x; double launchZ = (Math.sin(launchYaw) * 0.5d) + z; double xDiffNew = xMid - launchX; double zDiffNew = zMid - launchZ; double yDiff = y - pos.getY(); double time = freeFallTime(yDiff, 0.03d) - 3.0d; double Vx = xDiffNew / time; double Vz = zDiffNew / time; thrownSeed.moveTo(launchX, y, launchZ); double v = Math.sqrt((Vx * Vx) + (Vz * Vz)); thrownSeed.m_6686_(Vx, 0.0d, Vz, (float) v, 0.0f); } public BlockPos getNextFarmland(Level world, BlockPos start, ItemStack seedStack) { List farmlandSpots = new ArrayList<>(); for (int x = -4; x <= 4; x++) { for (int z = -4; z <= 4; z++) { if (x != 0 || z != 0) { BlockPos current = new BlockPos(start).east(x).south(z); BlockState state = world.getBlockState(current); BlockState aboveState = world.getBlockState(current.above()); if (seedStack.getItem() == Items.NETHER_WART) { if (state.is(Blocks.SOUL_SAND) && aboveState.isAir() && !this.recentLocations.containsKey(current)) { farmlandSpots.add(current); } } else if (state.is(Blocks.FARMLAND) && aboveState.isAir() && !this.recentLocations.containsKey(current)) { farmlandSpots.add(current); } } } } if (farmlandSpots.size() == 0) { return null; } return farmlandSpots.get((int) (Math.random() * farmlandSpots.size())); } private void purgeRecentLocations() { long currentTime = System.currentTimeMillis(); List toPurge = new ArrayList<>(); for (Map.Entry entry : this.recentLocations.entrySet()) { BlockPos pos = entry.getKey(); long time = entry.getValue().longValue(); long timeDiff = currentTime - time; if (timeDiff > RECENT_LOCATIONS_EXPIRY_MS) { toPurge.add(pos); } } for (BlockPos pos2 : toPurge) { this.recentLocations.remove(pos2); } } public ItemStack getSeedFromInventory() { for (int i = 0; i < getContainerSize(); i++) { ItemStack itemStack = getItem(i); if (itemStack.is(this.seedTag) || extraItems.contains(itemStack.getItem())) { return itemStack; } } return ItemStack.EMPTY; } public static void tick(Level level, BlockPos pos, BlockState state, SeedSpreaderBlockEntity entity) { entity.tick(); } public void tick() { this.counter++; if (this.counter % 8 == 0) { BlockPos pos = getBlockPos(); double x = pos.getX() + 0.5d; double y = pos.getY() + 0.109375d; double z = pos.getZ() + 0.5d; ItemStack seedStack = getSeedFromInventory(); if (seedStack != ItemStack.EMPTY) { purgeRecentLocations(); BlockPos farmlandPos = null; for (int yDelta = 0; yDelta < 5; yDelta++) { BlockPos toCheck = new BlockPos(pos); farmlandPos = getNextFarmland(this.level, toCheck.below(yDelta), seedStack); if (farmlandPos != null) { break; } } if (farmlandPos != null) { ThrownSeedEntity lvt_5_1_ = new ThrownSeedEntity(getLevel(), x, y, z); ItemStack seed = seedStack.split(1); lvt_5_1_.setItem(seed); if (farmlandPos.above().getY() == pos.getY()) { y = pos.getY() + 0.75d; } launchTo(lvt_5_1_, x, y, z, farmlandPos); getLevel().m_7967_(lvt_5_1_); } } } } public void load(CompoundTag p_230337_2_) { super.load(p_230337_2_); ContainerHelper.loadAllItems(p_230337_2_, this.items); } protected void saveAdditional(CompoundTag p_189515_1_) { ContainerHelper.saveAllItems(p_189515_1_, this.items); } public void m_6211_() { for (int i = 0; i < this.items.size(); i++) { this.items.set(i, ItemStack.EMPTY); } } public int getContainerSize() { return 9; } public boolean isEmpty() { for (int i = 0; i < this.items.size(); i++) { if (this.items.get(i) != ItemStack.EMPTY) { return false; } } return true; } public ItemStack getItem(int var1) { setChanged(); return (ItemStack) this.items.get(var1); } public ItemStack removeItem(int var1, int var2) { setChanged(); return ContainerHelper.removeItem(this.items, var1, var2); } public ItemStack removeItemNoUpdate(int var1) { setChanged(); return ContainerHelper.takeItem(this.items, var1); } public void setItem(int var1, ItemStack var2) { this.items.set(var1, var2); setChanged(); } public boolean stillValid(Player p_70300_1_) { return this.level.getBlockEntity(this.worldPosition) == this && p_70300_1_.distanceToSqr(((double) this.worldPosition.getX()) + 0.5d, ((double) this.worldPosition.getY()) + 0.5d, ((double) this.worldPosition.getZ()) + 0.5d) <= 64.0d; } }