From eab7e1de10e2b883c86594b2c69d9e59d8a39860 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Tue, 24 Aug 2021 00:59:22 +0700 Subject: [PATCH] Matter bottler --- .../java/ru/dbotthepony/mc/otm/Registry.java | 14 + .../mc/otm/block/BlockMatterBottler.java | 27 ++ .../entity/BlockEntityMatterBottler.java | 315 ++++++++++++++++++ .../capability/MatterHandlerCapability.java | 5 +- .../MatteryMachineEnergyStorage.java | 6 +- .../mc/otm/menu/MatterBottlerMenu.java | 97 ++++++ .../mc/otm/menu/slot/MatterySlot.java | 4 + .../mc/otm/menu/widget/MatterLevelWidget.java | 8 + .../otm/menu/widget/ProgressGaugeWidget.java | 8 + .../mc/otm/screen/MatterBottlerScreen.java | 39 +++ .../mc/otm/screen/SkinElement.java | 2 - .../overdrive_that_matters/lang/en_us.json | 1 + 12 files changed, 519 insertions(+), 7 deletions(-) create mode 100644 src/main/java/ru/dbotthepony/mc/otm/block/BlockMatterBottler.java create mode 100644 src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterBottler.java create mode 100644 src/main/java/ru/dbotthepony/mc/otm/menu/MatterBottlerMenu.java create mode 100644 src/main/java/ru/dbotthepony/mc/otm/screen/MatterBottlerScreen.java diff --git a/src/main/java/ru/dbotthepony/mc/otm/Registry.java b/src/main/java/ru/dbotthepony/mc/otm/Registry.java index 7ead81516..dbab2a27b 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/Registry.java +++ b/src/main/java/ru/dbotthepony/mc/otm/Registry.java @@ -82,6 +82,7 @@ public class Registry { public static final ResourceLocation MATTER_SCANNER = new ResourceLocation(OverdriveThatMatters.MOD_ID, "matter_scanner"); public static final ResourceLocation MATTER_PANEL = new ResourceLocation(OverdriveThatMatters.MOD_ID, "matter_panel"); public static final ResourceLocation MATTER_REPLICATOR = new ResourceLocation(OverdriveThatMatters.MOD_ID, "matter_replicator"); + public static final ResourceLocation MATTER_BOTTLER = new ResourceLocation(OverdriveThatMatters.MOD_ID, "matter_bottler"); // capabilities public static final ResourceLocation ANDROID_CAPABILITY = new ResourceLocation(OverdriveThatMatters.MOD_ID, "android_capability"); @@ -126,6 +127,7 @@ public class Registry { public static final Block MATTER_SCANNER = new BlockMatterScanner(); public static final Block MATTER_PANEL = new BlockMatterPanel(); public static final Block MATTER_REPLICATOR = new BlockMatterReplicator(); + public static final Block MATTER_BOTTLER = new BlockMatterBottler(); static { ANDROID_STATION.setRegistryName(Names.ANDROID_STATION); @@ -137,6 +139,7 @@ public class Registry { MATTER_SCANNER.setRegistryName(Names.MATTER_SCANNER); MATTER_PANEL.setRegistryName(Names.MATTER_PANEL); MATTER_REPLICATOR.setRegistryName(Names.MATTER_REPLICATOR); + MATTER_BOTTLER.setRegistryName(Names.MATTER_BOTTLER); } @SubscribeEvent @@ -150,6 +153,7 @@ public class Registry { event.getRegistry().register(MATTER_SCANNER); event.getRegistry().register(MATTER_PANEL); event.getRegistry().register(MATTER_REPLICATOR); + event.getRegistry().register(MATTER_BOTTLER); // OverdriveThatMatters.LOGGER.info("Registered blocks"); } @@ -165,6 +169,7 @@ public class Registry { public static final Item MATTER_SCANNER = new BlockItem(Blocks.MATTER_SCANNER, new Item.Properties().stacksTo(64).tab(OverdriveThatMatters.CREATIVE_TAB)); public static final Item MATTER_PANEL = new BlockItem(Blocks.MATTER_PANEL, new Item.Properties().stacksTo(64).tab(OverdriveThatMatters.CREATIVE_TAB)); public static final Item MATTER_REPLICATOR = new BlockItem(Blocks.MATTER_REPLICATOR, new Item.Properties().stacksTo(64).tab(OverdriveThatMatters.CREATIVE_TAB)); + public static final Item MATTER_BOTTLER = new BlockItem(Blocks.MATTER_BOTTLER, new Item.Properties().stacksTo(64).tab(OverdriveThatMatters.CREATIVE_TAB)); public static final ItemPill PILL_ANDROID = new ItemPill(ItemPill.PillType.BECOME_ANDROID); public static final ItemPill PILL_HUMANE = new ItemPill(ItemPill.PillType.BECOME_HUMANE); @@ -194,6 +199,7 @@ public class Registry { MATTER_SCANNER.setRegistryName(Names.MATTER_SCANNER); MATTER_PANEL.setRegistryName(Names.MATTER_PANEL); MATTER_REPLICATOR.setRegistryName(Names.MATTER_REPLICATOR); + MATTER_BOTTLER.setRegistryName(Names.MATTER_BOTTLER); PILL_ANDROID.setRegistryName(Names.PILL_ANDROID); PILL_HUMANE.setRegistryName(Names.PILL_HUMANE); @@ -224,6 +230,7 @@ public class Registry { event.getRegistry().register(MATTER_SCANNER); event.getRegistry().register(MATTER_PANEL); event.getRegistry().register(MATTER_REPLICATOR); + event.getRegistry().register(MATTER_BOTTLER); event.getRegistry().register(PILL_ANDROID); event.getRegistry().register(PILL_HUMANE); @@ -256,6 +263,7 @@ public class Registry { public static final BlockEntityType MATTER_SCANNER = BlockEntityType.Builder.of(BlockEntityMatterScanner::new, Blocks.MATTER_SCANNER).build(null); public static final BlockEntityType MATTER_PANEL = BlockEntityType.Builder.of(BlockEntityMatterPanel::new, Blocks.MATTER_PANEL).build(null); public static final BlockEntityType MATTER_REPLICATOR = BlockEntityType.Builder.of(BlockEntityMatterReplicator::new, Blocks.MATTER_REPLICATOR).build(null); + public static final BlockEntityType MATTER_BOTTLER = BlockEntityType.Builder.of(BlockEntityMatterBottler::new, Blocks.MATTER_BOTTLER).build(null); static { ANDROID_STATION.setRegistryName(Names.ANDROID_STATION); @@ -267,6 +275,7 @@ public class Registry { MATTER_SCANNER.setRegistryName(Names.MATTER_SCANNER); MATTER_PANEL.setRegistryName(Names.MATTER_PANEL); MATTER_REPLICATOR.setRegistryName(Names.MATTER_REPLICATOR); + MATTER_BOTTLER.setRegistryName(Names.MATTER_BOTTLER); } @SubscribeEvent @@ -280,6 +289,7 @@ public class Registry { event.getRegistry().register(MATTER_SCANNER); event.getRegistry().register(MATTER_PANEL); event.getRegistry().register(MATTER_REPLICATOR); + event.getRegistry().register(MATTER_BOTTLER); // OverdriveThatMatters.LOGGER.info("Registered block entities"); } @@ -418,6 +428,7 @@ public class Registry { public static final MenuType MATTER_SCANNER = new MenuType<>(MatterScannerMenu::new); public static final MenuType MATTER_PANEL = new MenuType<>(MatterPanelMenu::new); public static final MenuType MATTER_REPLICATOR = new MenuType<>(MatterReplicatorMenu::new); + public static final MenuType MATTER_BOTTLER = new MenuType<>(MatterBottlerMenu::new); static { ANDROID_STATION.setRegistryName(Names.ANDROID_STATION); @@ -428,6 +439,7 @@ public class Registry { MATTER_SCANNER.setRegistryName(Names.MATTER_SCANNER); MATTER_PANEL.setRegistryName(Names.MATTER_PANEL); MATTER_REPLICATOR.setRegistryName(Names.MATTER_REPLICATOR); + MATTER_BOTTLER.setRegistryName(Names.MATTER_BOTTLER); } @SubscribeEvent @@ -440,6 +452,7 @@ public class Registry { event.getRegistry().register(MATTER_SCANNER); event.getRegistry().register(MATTER_PANEL); event.getRegistry().register(MATTER_REPLICATOR); + event.getRegistry().register(MATTER_BOTTLER); // OverdriveThatMatters.LOGGER.info("Registered menus"); } @@ -454,6 +467,7 @@ public class Registry { MenuScreens.register(MATTER_SCANNER, MatterScannerScreen::new); MenuScreens.register(MATTER_PANEL, MatterPanelScreen::new); MenuScreens.register(MATTER_REPLICATOR, MatterReplicatorScreen::new); + MenuScreens.register(MATTER_BOTTLER, MatterBottlerScreen::new); // OverdriveThatMatters.LOGGER.info("Registered screens"); } diff --git a/src/main/java/ru/dbotthepony/mc/otm/block/BlockMatterBottler.java b/src/main/java/ru/dbotthepony/mc/otm/block/BlockMatterBottler.java new file mode 100644 index 000000000..56e20e32f --- /dev/null +++ b/src/main/java/ru/dbotthepony/mc/otm/block/BlockMatterBottler.java @@ -0,0 +1,27 @@ +package ru.dbotthepony.mc.otm.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import ru.dbotthepony.mc.otm.Registry; +import ru.dbotthepony.mc.otm.block.entity.BlockEntityMatterBottler; + +import javax.annotation.Nullable; + +public class BlockMatterBottler extends BlockMatteryRotatable implements EntityBlock { + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) { + return new BlockEntityMatterBottler(blockPos, blockState); + } + + @Nullable + @Override + public BlockEntityTicker getTicker(Level p_153212_, BlockState p_153213_, BlockEntityType p_153214_) { + return p_153212_.isClientSide || p_153214_ != Registry.BlockEntities.MATTER_BOTTLER ? null : BlockEntityMatterBottler::tick; + } +} diff --git a/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterBottler.java b/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterBottler.java new file mode 100644 index 000000000..607a89586 --- /dev/null +++ b/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterBottler.java @@ -0,0 +1,315 @@ +package ru.dbotthepony.mc.otm.block.entity; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.IItemHandler; +import ru.dbotthepony.mc.otm.OverdriveThatMatters; +import ru.dbotthepony.mc.otm.Registry; +import ru.dbotthepony.mc.otm.capability.*; +import ru.dbotthepony.mc.otm.container.MatteryContainer; +import ru.dbotthepony.mc.otm.matter.MatterGrid; +import ru.dbotthepony.mc.otm.menu.MatterBottlerMenu; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.math.BigDecimal; + +public class BlockEntityMatterBottler extends BlockEntityMatteryPowered implements IMatterGridCell { + public BlockEntityMatterBottler(BlockPos p_155229_, BlockState p_155230_) { + super(Registry.BlockEntities.MATTER_BOTTLER, p_155229_, p_155230_); + energy = new MatteryMachineEnergyStorage(this, MatteryMachineEnergyStorage.MachineType.WORKER); + } + + private static final TranslatableComponent MACHINE_NAME = new TranslatableComponent("block.overdrive_that_matters.matter_bottler"); + + public boolean getWorkFlow() { + return work_flow; + } + + public void setWorkFlow(boolean work_flow) { + this.work_flow = work_flow; + this.setChanged(); + } + + public void switchWorkFlow() { + setWorkFlow(!work_flow); + } + + // true - bottling + // false - unbottling + protected boolean work_flow = true; + + public final MatteryContainer work_slots = new MatteryContainer(this::setChanged, 6) { + @Override + public int getMaxStackSize(int slot) { + return 1; + } + }; + + public final MatterHandlerCapability matter = new MatterHandlerCapability(this::setChanged, IMatterHandler.MatterDirection.BIDIRECTIONAL, new BigDecimal(4)) { + @Nonnull + @Override + public MatterDirection getDirection() { + return work_flow ? MatterDirection.RECEIVE : MatterDirection.EXTRACT; + } + }; + + private static final BigDecimal MATTER_EXCHANGE_RATE = new BigDecimal("0.04"); + private static final BigDecimal ENERGY_CONSUMPTION = new BigDecimal(20); + + private final LazyOptional matter_resolver = LazyOptional.of(() -> matter); + private final LazyOptional cell_resolver = LazyOptional.of(() -> this); + + private final LazyOptional handler_resolver = LazyOptional.of(() -> { + return work_slots.handler((slot, stack) -> { + if (work_flow) { + return slot < 3 && stack.getCapability(MatteryCapability.MATTER).isPresent(); + } + + return slot >= 3 && stack.getCapability(MatteryCapability.MATTER).isPresent(); + }, (slot, amount, stack) -> { + if (work_flow) { + return slot >= 3; + } + + return slot < 3; + }); + }); + + protected BigDecimal initial_capacity; + protected ItemStack last_work_stack; + + private MatterGrid grid; + + @Nullable + @Override + public MatterGrid getMatterGrid() { + return grid; + } + + @Override + public boolean isValidMatterCell() { + return valid; + } + + @Override + public void setMatterGrid(MatterGrid grid) { + this.grid = grid; + } + + @Nullable + @Override + public IMatterHandler getMatterHandler() { + return matter; + } + + @Override + public void setLevel(Level p_155231_) { + super.setLevel(p_155231_); + + if (grid == null) + scheduleDiscoverNeighbours(getBlockPos(), p_155231_); + } + + private boolean valid = true; + + @Override + public void invalidateCaps() { + super.invalidateCaps(); + valid = false; + } + + @Override + public void reviveCaps() { + super.reviveCaps(); + valid = true; + } + + @Nonnull + @Override + public LazyOptional getCapability(@Nonnull Capability cap, @Nullable Direction side) { + if (valid) { + if (cap == MatteryCapability.MATTER) { + return matter_resolver.cast(); + } + + if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { + return handler_resolver.cast(); + } + + if (cap == MatteryCapability.MATTER_CELL) { + return cell_resolver.cast(); + } + } + + return super.getCapability(cap, side); + } + + @Override + protected Component getDefaultDisplayName() { + return MACHINE_NAME; + } + + @Nullable + @Override + public AbstractContainerMenu createMenu(int containerID, Inventory inventory, Player ply) { + return new MatterBottlerMenu(containerID, inventory, this); + } + + @Override + public CompoundTag save(CompoundTag nbt) { + nbt.put("work_slots", work_slots.serializeNBT()); + nbt.putBoolean("work_flow", work_flow); + nbt.put("matter_capability", matter.serializeNBT()); + return super.save(nbt); + } + + @Override + public void load(CompoundTag nbt) { + super.load(nbt); + work_slots.deserializeNBT(nbt.get("work_slots")); + work_flow = nbt.getBoolean("work_flow"); + + if (nbt.get("matter_capability") instanceof CompoundTag _matter) + matter.deserializeNBT(_matter); + } + + private static final BigDecimal EXTRACTION_TICKS = new BigDecimal(200); + + public float getWorkProgress() { + if (last_work_stack == null) { + return 0; + } + + var cap = last_work_stack.getCapability(MatteryCapability.MATTER).resolve(); + + if (cap.isEmpty()) { + return 0; + } + + return cap.get().getStoredMatter().subtract(initial_capacity).divide(cap.get().getMaxStoredMatter().subtract(initial_capacity), MatteryCapability.ROUND_RULES).floatValue(); + } + + public static void tick(Level level, BlockPos blockPos, BlockState blockState, T t) { + if (t instanceof BlockEntityMatterBottler tile) { + tile.batteryChargeLoop(); + + ItemStack work_stack = null; + IMatterHandler capability = null; + int align = tile.work_flow ? 0 : 3; + int work_slot = -1; + + for (int i = align; i < align + 3; i++) { + var get = tile.work_slots.getItem(i); + + if (!get.isEmpty()) { + var cap = get.getCapability(MatteryCapability.MATTER).resolve(); + + if (cap.isPresent() && cap.get().getDirection() != (tile.work_flow ? IMatterHandler.MatterDirection.EXTRACT : IMatterHandler.MatterDirection.RECEIVE) && (tile.work_flow ? cap.get().getMissingMatter().compareTo(BigDecimal.ZERO) > 0 : cap.get().getStoredMatter().compareTo(BigDecimal.ZERO) > 0)) { + work_stack = get; + capability = cap.get(); + work_slot = i; + break; + } + } + } + + if (work_stack == null) { + tile.last_work_stack = null; + tile.initial_capacity = null; + } else if (work_stack != tile.last_work_stack) { + tile.last_work_stack = work_stack; + tile.initial_capacity = capability.getStoredMatter(); + } + + if (tile.work_flow) { + if (capability != null) { + if (tile.matter.getStoredMatter().compareTo(MATTER_EXCHANGE_RATE) < 0) { + if (tile.grid != null) { + var extracted = tile.grid.extractMatter( + tile.matter.getMissingMatter() + .min(MATTER_EXCHANGE_RATE.multiply(EXTRACTION_TICKS)) + .min(capability.getMissingMatter().subtract(tile.matter.getStoredMatter())) + , true); + + if (extracted.compareTo(BigDecimal.ZERO) > 0) { + var received = tile.matter.receiveMatterOuter(extracted, false); + tile.grid.extractMatter(received, false); + } + } + } + + if (tile.matter.getStoredMatter().compareTo(BigDecimal.ZERO) > 0) { + var energy = tile.energy.extractEnergyInner(ENERGY_CONSUMPTION, true); + + if (energy.compareTo(BigDecimal.ZERO) > 0) { + var matter = capability.receiveMatterOuter(MATTER_EXCHANGE_RATE.min(tile.matter.getStoredMatter()).multiply(energy.divide(ENERGY_CONSUMPTION, MatteryCapability.ROUND_RULES)), true); + + if (matter.compareTo(BigDecimal.ZERO) > 0) { + tile.energy.extractEnergyInner(ENERGY_CONSUMPTION.multiply(matter.divide(MATTER_EXCHANGE_RATE, MatteryCapability.ROUND_RULES)), false); + capability.receiveMatterOuter(matter, false); + tile.matter.extractMatterInner(matter, false); + + if (capability.getMissingMatter().compareTo(BigDecimal.ZERO) == 0) { + for (int i = 3; i < 6; i++) { + if (tile.work_slots.getItem(i).isEmpty()) { + tile.work_slots.setItem(work_slot, ItemStack.EMPTY); + tile.work_slots.setItem(i, work_stack); + break; + } + } + } + } + } + } + } + } else { + if (capability != null) { + var energy = tile.energy.extractEnergyInner(ENERGY_CONSUMPTION, true); + + if (energy.compareTo(BigDecimal.ZERO) > 0) { + var matter = capability.extractMatterOuter(MATTER_EXCHANGE_RATE.min(tile.matter.getMissingMatter()).multiply(energy.divide(ENERGY_CONSUMPTION, MatteryCapability.ROUND_RULES)), true); + + if (matter.compareTo(BigDecimal.ZERO) > 0) { + tile.energy.extractEnergyInner(ENERGY_CONSUMPTION.multiply(matter.divide(MATTER_EXCHANGE_RATE, MatteryCapability.ROUND_RULES)), false); + capability.extractMatterOuter(matter, false); + tile.matter.receiveMatterInner(matter, false); + + if (capability.getStoredMatter().compareTo(BigDecimal.ZERO) == 0) { + for (int i = 2; i >= 0; i--) { + if (tile.work_slots.getItem(i).isEmpty()) { + tile.work_slots.setItem(work_slot, ItemStack.EMPTY); + tile.work_slots.setItem(i, work_stack); + break; + } + } + } + } + } + } + + if (tile.matter.getStoredMatter().compareTo(BigDecimal.ZERO) > 0 && tile.grid != null) { + BigDecimal diff = tile.matter.extractMatterInner(tile.matter.getStoredMatter(), true); + BigDecimal diff2 = tile.grid.softPushMatter(diff, true); + + tile.matter.extractMatterInner(diff2, false); + tile.grid.softPushMatter(diff2, false); + } + } + } + } +} diff --git a/src/main/java/ru/dbotthepony/mc/otm/capability/MatterHandlerCapability.java b/src/main/java/ru/dbotthepony/mc/otm/capability/MatterHandlerCapability.java index 1218c5346..85bda0798 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/capability/MatterHandlerCapability.java +++ b/src/main/java/ru/dbotthepony/mc/otm/capability/MatterHandlerCapability.java @@ -1,6 +1,7 @@ package ru.dbotthepony.mc.otm.capability; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; import net.minecraftforge.common.util.INBTSerializable; import ru.dbotthepony.mc.otm.matter.MatterRegistry; @@ -59,7 +60,7 @@ public class MatterHandlerCapability implements IMatterHandler, INBTSerializable @Nonnull @Override public BigDecimal receiveMatterOuter(BigDecimal howMuch, boolean simulate) { - if (direction == MatterDirection.EXTRACT) + if (getDirection() == MatterDirection.EXTRACT) return BigDecimal.ZERO; return receiveMatterInner(howMuch, simulate); @@ -92,7 +93,7 @@ public class MatterHandlerCapability implements IMatterHandler, INBTSerializable @Nonnull @Override public BigDecimal extractMatterOuter(BigDecimal howMuch, boolean simulate) { - if (direction == MatterDirection.RECEIVE) + if (getDirection() == MatterDirection.RECEIVE) return BigDecimal.ZERO; return extractMatterInner(howMuch, simulate); diff --git a/src/main/java/ru/dbotthepony/mc/otm/capability/MatteryMachineEnergyStorage.java b/src/main/java/ru/dbotthepony/mc/otm/capability/MatteryMachineEnergyStorage.java index 8924d292a..dfeb3659e 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/capability/MatteryMachineEnergyStorage.java +++ b/src/main/java/ru/dbotthepony/mc/otm/capability/MatteryMachineEnergyStorage.java @@ -14,9 +14,9 @@ public class MatteryMachineEnergyStorage implements IMatteryEnergyStorage, INBTS CAPACITOR, } - public static final BigDecimal DEFAULT_MAX_RECEIVE = new BigDecimal(4000); - public static final BigDecimal DEFAULT_MAX_EXTRACT = new BigDecimal(4000); - public static final BigDecimal DEFAULT_MAX_CAPACITY = new BigDecimal(64000); + public static final BigDecimal DEFAULT_MAX_RECEIVE = new BigDecimal(200); + public static final BigDecimal DEFAULT_MAX_EXTRACT = new BigDecimal(200); + public static final BigDecimal DEFAULT_MAX_CAPACITY = new BigDecimal(60000); protected BigDecimal energy_stored = BigDecimal.ZERO; protected BigDecimal energy_stored_max; diff --git a/src/main/java/ru/dbotthepony/mc/otm/menu/MatterBottlerMenu.java b/src/main/java/ru/dbotthepony/mc/otm/menu/MatterBottlerMenu.java new file mode 100644 index 000000000..56024c037 --- /dev/null +++ b/src/main/java/ru/dbotthepony/mc/otm/menu/MatterBottlerMenu.java @@ -0,0 +1,97 @@ +package ru.dbotthepony.mc.otm.menu; + +import net.minecraft.world.SimpleContainer; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.ContainerData; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntity; +import ru.dbotthepony.mc.otm.OverdriveThatMatters; +import ru.dbotthepony.mc.otm.Registry; +import ru.dbotthepony.mc.otm.block.entity.BlockEntityMatterBottler; +import ru.dbotthepony.mc.otm.capability.IMatterHandler; +import ru.dbotthepony.mc.otm.capability.MatteryCapability; +import ru.dbotthepony.mc.otm.menu.slot.MatterySlot; +import ru.dbotthepony.mc.otm.menu.widget.MatterLevelWidget; +import ru.dbotthepony.mc.otm.menu.widget.ProgressGaugeWidget; + +import javax.annotation.Nullable; + +public class MatterBottlerMenu extends PoweredMatteryMenu { + public MatterBottlerMenu(int p_38852_, Inventory inventory) { + this(p_38852_, inventory, null); + } + + public ContainerData work_flow = new ContainerData() { + private int value; + + @Override + public int get(int i) { + if (tile != null) { + return ((BlockEntityMatterBottler) tile).getWorkFlow() ? 1 : 0; + } + + return value; + } + + @Override + public void set(int i, int i1) { + value = i1; + } + + @Override + public int getCount() { + return 1; + } + }; + + public ProgressGaugeWidget progress; + public MatterLevelWidget matter_widget; + + public MatterySlot[] work_slots = new MatterySlot[6]; + + public MatterBottlerMenu(int p_38852_, Inventory inventory, BlockEntityMatterBottler tile) { + super(Registry.Menus.MATTER_BOTTLER, p_38852_, inventory, tile); + + var container = tile != null ? tile.work_slots : new SimpleContainer(6); + + if (tile == null) { + progress = new ProgressGaugeWidget(this); + matter_widget = new MatterLevelWidget(this); + } else { + progress = new ProgressGaugeWidget(this, tile::getWorkProgress); + matter_widget = new MatterLevelWidget(this, tile.matter); + } + + for (int i = 0; i < container.getContainerSize(); i++) { + work_slots[i] = new MatterySlot(container, i) { + @Override + public boolean mayPlace(ItemStack p_40231_) { + var cap = p_40231_.getCapability(MatteryCapability.MATTER).resolve(); + + if (work_flow.get(0) > 0) { + return index < 3 && cap.isPresent() && cap.get().getDirection() != IMatterHandler.MatterDirection.EXTRACT; + } + + return index >= 3 && cap.isPresent() && cap.get().getDirection() != IMatterHandler.MatterDirection.RECEIVE; + } + }; + + addSlot(work_slots[i]); + } + + addDataSlots(work_flow); + addBatterySlot(); + addInventorySlots(); + } + + @Override + protected int getWorkingSlotStart() { + return 0; + } + + @Override + protected int getWorkingSlotEnd() { + return 7; + } +} diff --git a/src/main/java/ru/dbotthepony/mc/otm/menu/slot/MatterySlot.java b/src/main/java/ru/dbotthepony/mc/otm/menu/slot/MatterySlot.java index 2b6666b14..540dff3dc 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/menu/slot/MatterySlot.java +++ b/src/main/java/ru/dbotthepony/mc/otm/menu/slot/MatterySlot.java @@ -27,6 +27,10 @@ public class MatterySlot extends Slot { this(p_40223_, index, x, y, true); } + public MatterySlot(Container p_40223_, int index) { + this(p_40223_, index, 0, 0, true); + } + private ItemStack last_stack; private ItemStack watching_stack; diff --git a/src/main/java/ru/dbotthepony/mc/otm/menu/widget/MatterLevelWidget.java b/src/main/java/ru/dbotthepony/mc/otm/menu/widget/MatterLevelWidget.java index 084a0b4e2..a91ccbc75 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/menu/widget/MatterLevelWidget.java +++ b/src/main/java/ru/dbotthepony/mc/otm/menu/widget/MatterLevelWidget.java @@ -22,6 +22,14 @@ public class MatterLevelWidget extends StorageGaugeWidget { super(menu, x, y); } + public MatterLevelWidget(MatteryMenu menu) { + this(menu, 0, 0); + } + + public MatterLevelWidget(MatteryMenu menu, IMatterHandler capability) { + this(menu, 0, 0, capability); + } + public MatterLevelWidget(MatteryMenu menu, int x, int y, Supplier value_supplier, Supplier max_value_supplier) { super(menu, x, y, value_supplier, max_value_supplier); } diff --git a/src/main/java/ru/dbotthepony/mc/otm/menu/widget/ProgressGaugeWidget.java b/src/main/java/ru/dbotthepony/mc/otm/menu/widget/ProgressGaugeWidget.java index 53ffb2a35..3eec5cd3e 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/menu/widget/ProgressGaugeWidget.java +++ b/src/main/java/ru/dbotthepony/mc/otm/menu/widget/ProgressGaugeWidget.java @@ -54,6 +54,14 @@ public class ProgressGaugeWidget extends GaugeWidget { this(menu, x, y, null, null); } + public ProgressGaugeWidget(MatteryMenu menu) { + this(menu, 0, 0, null, null); + } + + public ProgressGaugeWidget(MatteryMenu menu, Supplier progress) { + this(menu, 0, 0, progress, null); + } + public ProgressGaugeWidget(MatteryMenu menu, int x, int y, Supplier progress) { this(menu, x, y, progress, null); } diff --git a/src/main/java/ru/dbotthepony/mc/otm/screen/MatterBottlerScreen.java b/src/main/java/ru/dbotthepony/mc/otm/screen/MatterBottlerScreen.java new file mode 100644 index 000000000..39e6e7c1e --- /dev/null +++ b/src/main/java/ru/dbotthepony/mc/otm/screen/MatterBottlerScreen.java @@ -0,0 +1,39 @@ +package ru.dbotthepony.mc.otm.screen; + +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Inventory; +import ru.dbotthepony.mc.otm.menu.MatterBottlerMenu; +import ru.dbotthepony.mc.otm.menu.slot.BatterySlot; +import ru.dbotthepony.mc.otm.menu.widget.GaugeWidget; +import ru.dbotthepony.mc.otm.screen.panels.FlexGridPanel; +import ru.dbotthepony.mc.otm.screen.panels.MatteryWidgetPanel; +import ru.dbotthepony.mc.otm.screen.panels.SlotPanel; + +import java.util.List; + +public class MatterBottlerScreen extends MatteryScreen implements MatteryScreen.IMatteryScreenGaugeGetter, MatteryScreen.IMatteryScreenBatteryGetter, MatteryScreen.IMatteryScreenGridBased { + public MatterBottlerScreen(MatterBottlerMenu menu, Inventory inventory, Component title) { + super(menu, inventory, title); + } + + @Override + public List getGauges() { + return List.of(menu.battery_widget, menu.matter_widget); + } + + @Override + public List getBatterySlots() { + return List.of(menu.battery_slot); + } + + @Override + public void createGridPanels(FlexGridPanel grid) { + new SlotPanel<>(this, grid, menu.work_slots[0]); + new SlotPanel<>(this, grid, menu.work_slots[1]); + new SlotPanel<>(this, grid, menu.work_slots[2]); + new MatteryWidgetPanel(this, grid, menu.progress).setDockMargin(2, 0, 2, 0); + new SlotPanel<>(this, grid, menu.work_slots[3]); + new SlotPanel<>(this, grid, menu.work_slots[4]); + new SlotPanel<>(this, grid, menu.work_slots[5]); + } +} diff --git a/src/main/java/ru/dbotthepony/mc/otm/screen/SkinElement.java b/src/main/java/ru/dbotthepony/mc/otm/screen/SkinElement.java index 2ba78bb50..3dc84b662 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/screen/SkinElement.java +++ b/src/main/java/ru/dbotthepony/mc/otm/screen/SkinElement.java @@ -11,8 +11,6 @@ public record SkinElement(ResourceLocation texture, float image_x, float image_y float defined_width, float defined_height) { public void render(PoseStack stack, float x, float y, float width, float height) { RenderSystem.setShaderTexture(0, texture); - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); RenderHelper.drawTexturedRectUV( stack, diff --git a/src/main/resources/assets/overdrive_that_matters/lang/en_us.json b/src/main/resources/assets/overdrive_that_matters/lang/en_us.json index 3d82b68c1..21bddfcf5 100644 --- a/src/main/resources/assets/overdrive_that_matters/lang/en_us.json +++ b/src/main/resources/assets/overdrive_that_matters/lang/en_us.json @@ -90,6 +90,7 @@ "block.overdrive_that_matters.matter_scanner": "Matter scanner", "block.overdrive_that_matters.matter_panel": "Pattern monitor", "block.overdrive_that_matters.matter_replicator": "Matter replicator", + "block.overdrive_that_matters.matter_bottler": "Matter bottler", "otm.container.matter_panel.number_input": "Input replication task count",