From f440a593f373af9195160e301a63b12f35ff6ee6 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Tue, 10 Aug 2021 15:30:47 +0700 Subject: [PATCH] Abstraction, separation, battery containers --- .../mc/otm/block/BlockAndroidStation.java | 39 +------ .../mc/otm/block/BlockMatteryMachineBase.java | 53 +++++++++ .../entity/BlockEntityAndroidStation.java | 94 ++++----------- .../entity/BlockEntityMatteryMachine.java | 56 +++++++++ .../BlockEntityMatteryPoweredMachine.java | 110 ++++++++++++++++++ .../mc/otm/capability/MatteryCapability.java | 29 +++++ .../SimpleSerializableContainer.java | 47 ++++++++ .../mc/otm/menu/AndroidStationMenu.java | 90 +++----------- .../mc/otm/menu/PoweredMachineMenu.java | 104 +++++++++++++++++ .../mc/otm/menu/slot/BatterySlot.java | 20 ++++ .../textures/gui/mattery_machine_base.png | Bin 0 -> 10115 bytes .../loot_tables/blocks/android_station.json | 5 + 12 files changed, 465 insertions(+), 182 deletions(-) create mode 100644 src/main/java/ru/dbotthepony/mc/otm/block/BlockMatteryMachineBase.java create mode 100644 src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatteryMachine.java create mode 100644 src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatteryPoweredMachine.java create mode 100644 src/main/java/ru/dbotthepony/mc/otm/container/SimpleSerializableContainer.java create mode 100644 src/main/java/ru/dbotthepony/mc/otm/menu/PoweredMachineMenu.java create mode 100644 src/main/java/ru/dbotthepony/mc/otm/menu/slot/BatterySlot.java create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/gui/mattery_machine_base.png diff --git a/src/main/java/ru/dbotthepony/mc/otm/block/BlockAndroidStation.java b/src/main/java/ru/dbotthepony/mc/otm/block/BlockAndroidStation.java index 616e48a0a..f086a944f 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/block/BlockAndroidStation.java +++ b/src/main/java/ru/dbotthepony/mc/otm/block/BlockAndroidStation.java @@ -1,29 +1,14 @@ package ru.dbotthepony.mc.otm.block; import net.minecraft.core.BlockPos; -import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; -import net.minecraft.tags.BlockTags; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; 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.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.level.material.MaterialColor; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.storage.loot.parameters.LootContextParam; -import net.minecraft.world.level.storage.loot.parameters.LootContextParams; -import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; @@ -31,26 +16,16 @@ import ru.dbotthepony.mc.otm.OverdriveThatMatters; import ru.dbotthepony.mc.otm.block.entity.BlockEntityAndroidStation; import javax.annotation.Nullable; -import java.util.Collections; -import java.util.List; -public class BlockAndroidStation extends Block implements EntityBlock { +public class BlockAndroidStation extends BlockMatteryMachineBase implements EntityBlock { public static final ResourceLocation REGISTRY_NAME = new ResourceLocation(OverdriveThatMatters.MOD_ID, "android_station"); private final VoxelShape SHAPE = Shapes.box(0, 0, 0, 1, 0.5, 1); public BlockAndroidStation() { - super(BlockBehaviour.Properties.of(Material.STONE, MaterialColor.STONE).requiresCorrectToolForDrops().strength(1.5F, 6.0F)); + super(); this.setRegistryName(REGISTRY_NAME); } - @Override - public void setPlacedBy(Level p_49847_, BlockPos p_49848_, BlockState p_49849_, @Nullable LivingEntity p_49850_, ItemStack p_49851_) { - if (p_49851_.hasCustomHoverName() && !p_49847_.isClientSide && p_49847_.getBlockEntity(p_49848_) instanceof BlockEntityAndroidStation tile) { - tile.setDisplayName(p_49851_.getDisplayName()); - } - super.setPlacedBy(p_49847_, p_49848_, p_49849_, p_49850_, p_49851_); - } - @Override public VoxelShape getShape(BlockState p_151964_, BlockGetter p_151965_, BlockPos p_151966_, CollisionContext p_151967_) { return SHAPE; @@ -67,14 +42,4 @@ public class BlockAndroidStation extends Block implements EntityBlock { public BlockEntityTicker getTicker(Level level, BlockState state, BlockEntityType type) { return level.isClientSide || type != OverdriveThatMatters.ANDROID_STATION_FACTORY ? null : BlockEntityAndroidStation::tick; } - - @Override - public InteractionResult use(BlockState p_60503_, Level level, BlockPos pos, Player ply, InteractionHand p_60507_, BlockHitResult p_60508_) { - if (!level.isClientSide && level.getBlockEntity(pos) instanceof BlockEntityAndroidStation tile) { - ply.openMenu(tile); - return InteractionResult.CONSUME; - } - - return InteractionResult.SUCCESS; - } } diff --git a/src/main/java/ru/dbotthepony/mc/otm/block/BlockMatteryMachineBase.java b/src/main/java/ru/dbotthepony/mc/otm/block/BlockMatteryMachineBase.java new file mode 100644 index 000000000..699e788ec --- /dev/null +++ b/src/main/java/ru/dbotthepony/mc/otm/block/BlockMatteryMachineBase.java @@ -0,0 +1,53 @@ +package ru.dbotthepony.mc.otm.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.phys.BlockHitResult; +import ru.dbotthepony.mc.otm.block.entity.BlockEntityAndroidStation; +import ru.dbotthepony.mc.otm.block.entity.BlockEntityMatteryMachine; + +import javax.annotation.Nullable; + +public abstract class BlockMatteryMachineBase extends Block { + public BlockMatteryMachineBase(Properties p_49795_) { + super(p_49795_); + } + + public BlockMatteryMachineBase() { + this(BlockBehaviour.Properties.of(Material.STONE, MaterialColor.STONE).requiresCorrectToolForDrops().strength(1.5F, 6.0F)); + } + + @Override + public void setPlacedBy(Level p_49847_, BlockPos p_49848_, BlockState p_49849_, @Nullable LivingEntity p_49850_, ItemStack p_49851_) { + if (this instanceof EntityBlock && p_49851_.hasCustomHoverName() && !p_49847_.isClientSide && p_49847_.getBlockEntity(p_49848_) instanceof BlockEntityMatteryMachine tile) { + tile.setDisplayName(p_49851_.getDisplayName()); + } + + super.setPlacedBy(p_49847_, p_49848_, p_49849_, p_49850_, p_49851_); + } + + @Override + public InteractionResult use(BlockState p_60503_, Level level, BlockPos pos, Player ply, InteractionHand p_60507_, BlockHitResult p_60508_) { + if (this instanceof EntityBlock && !level.isClientSide && level.getBlockEntity(pos) instanceof MenuProvider tile) { + ply.openMenu(tile); + return InteractionResult.CONSUME; + } + + if (this instanceof EntityBlock && level.isClientSide) + return InteractionResult.SUCCESS; + + return super.use(p_60503_, level, pos, ply, p_60507_, p_60508_); + } +} diff --git a/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityAndroidStation.java b/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityAndroidStation.java index 7940fd6ea..c172e2120 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityAndroidStation.java +++ b/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityAndroidStation.java @@ -5,7 +5,6 @@ import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.StringTag; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.world.MenuProvider; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Inventory; @@ -29,97 +28,48 @@ import javax.annotation.Nullable; import java.math.BigDecimal; import java.util.List; -public class BlockEntityAndroidStation extends BlockEntity implements MenuProvider { - private Component display_name; - - public void setDisplayName(Component text) { - display_name = text; - } - - @Override - public Component getDisplayName() { - return display_name != null ? display_name : new TranslatableComponent("container.otm.android_station"); - } - +public class BlockEntityAndroidStation extends BlockEntityMatteryPoweredMachine implements MenuProvider { @Nullable @Override public AbstractContainerMenu createMenu(int containerID, Inventory inventory, Player ply) { - return new AndroidStationMenu(containerID, inventory, new AndroidStationMenu.AndroidStationContainer(ply), this); + return new AndroidStationMenu(containerID, inventory, this); } - private final MatteryMachineEnergyStorage energy = new MatteryMachineEnergyStorage(MatteryMachineEnergyStorage.MachineType.WORKER); - public BlockEntityAndroidStation(BlockPos p_155229_, BlockState p_155230_) { super(OverdriveThatMatters.ANDROID_STATION_FACTORY, p_155229_, p_155230_); + energy = new MatteryMachineEnergyStorage(MatteryMachineEnergyStorage.MachineType.WORKER, new BigDecimal(128_000)); + energy_resolver = LazyOptional.of(() -> energy); } - @Nonnull - public LazyOptional getCapability(@Nonnull Capability cap, @Nullable Direction side) { - if (cap == MatteryCapability.ENERGY || cap == CapabilityEnergy.ENERGY) { - return LazyOptional.of(() -> energy).cast(); - } + public static void tick(Level level, BlockPos blockPos, BlockState blockState, T t) { + if (t instanceof BlockEntityAndroidStation tile) { + tile.tickBatteryCharge(); - return super.getCapability(cap, side); - } + BlockPos pos = tile.getBlockPos(); + List entities = tile.getLevel().getEntitiesOfClass(LivingEntity.class, new AABB(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 2, pos.getZ() + 1)); - @Override - public CompoundTag save(CompoundTag nbt) { - nbt.put("energy_cap", energy.serializeNBT()); + for (LivingEntity ent : entities) { + LazyOptional resolver = ent.getCapability(MatteryCapability.ANDROID); - if (display_name != null) { - nbt.putString("Name", Component.Serializer.toJson(display_name)); - } + if (resolver.isPresent()) { + IAndroidCapability capability = resolver.resolve().get(); - return super.save(nbt); - } + BigDecimal missing = capability.getMissingPower(); - public void load(CompoundTag nbt) { - super.load(nbt); + if (missing.compareTo(BigDecimal.ZERO) == 1) { + BigDecimal extract = tile.energy.extractEnergyInner(missing, true); - if (nbt.contains("energy_cap") && nbt.get("energy_cap") instanceof CompoundTag tag) - energy.deserializeNBT(tag); + if (extract.compareTo(BigDecimal.ZERO) == 1) { + BigDecimal received = capability.receiveEnergyOuter(extract, true); - if (nbt.contains("Name") && nbt.get("Name") instanceof StringTag tag) - display_name = Component.Serializer.fromJson(tag.getAsString()); - } - - void tick() { - if (!hasLevel()) - return; - - if (energy.getEnergyStored() <= 0) - return; - - BlockPos pos = getBlockPos(); - List entities = getLevel().getEntitiesOfClass(LivingEntity.class, new AABB(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 2, pos.getZ() + 1)); - - for (LivingEntity ent : entities) { - LazyOptional resolver = ent.getCapability(MatteryCapability.ANDROID); - - if (resolver.isPresent()) { - IAndroidCapability capability = resolver.resolve().get(); - - BigDecimal missing = capability.getMissingPower(); - - if (missing.compareTo(BigDecimal.ZERO) == 1) { - BigDecimal extract = energy.extractEnergyInner(missing, true); - - if (extract.compareTo(BigDecimal.ZERO) == 1) { - BigDecimal received = capability.receiveEnergyOuter(extract, true); - - if (received.compareTo(BigDecimal.ZERO) == 1) { - energy.extractEnergyInner(extract, false); - capability.receiveEnergyOuter(extract, false); + if (received.compareTo(BigDecimal.ZERO) == 1) { + tile.energy.extractEnergyInner(extract, false); + capability.receiveEnergyOuter(extract, false); + } } } } } } } - - public static void tick(Level level, BlockPos blockPos, BlockState blockState, T t) { - if (t instanceof BlockEntityAndroidStation tile) { - tile.tick(); - } - } } diff --git a/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatteryMachine.java b/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatteryMachine.java new file mode 100644 index 000000000..f72b1b4cb --- /dev/null +++ b/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatteryMachine.java @@ -0,0 +1,56 @@ +package ru.dbotthepony.mc.otm.block.entity; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.StringTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +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 javax.annotation.Nullable; + +public abstract class BlockEntityMatteryMachine extends BlockEntity implements MenuProvider { + protected Component display_name; + + public BlockEntityMatteryMachine(BlockEntityType p_155228_, BlockPos p_155229_, BlockState p_155230_) { + super(p_155228_, p_155229_, p_155230_); + } + + public void setDisplayName(Component text) { + display_name = text; + } + + @Override + public Component getDisplayName() { + return display_name != null ? display_name : new TranslatableComponent("container.otm.android_station"); + } + + @Nullable + @Override + abstract public AbstractContainerMenu createMenu(int containerID, Inventory inventory, Player ply); + + public boolean canOpenMachine(Player ply) { + return false; + } + + @Override + public CompoundTag save(CompoundTag nbt) { + if (display_name != null) + nbt.putString("Name", Component.Serializer.toJson(display_name)); + + return super.save(nbt); + } + + public void load(CompoundTag nbt) { + super.load(nbt); + + if (nbt.contains("Name") && nbt.get("Name") instanceof StringTag tag) + display_name = Component.Serializer.fromJson(tag.getAsString()); + } +} diff --git a/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatteryPoweredMachine.java b/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatteryPoweredMachine.java new file mode 100644 index 000000000..81726b6c3 --- /dev/null +++ b/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatteryPoweredMachine.java @@ -0,0 +1,110 @@ +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.nbt.StringTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.SimpleContainer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.energy.CapabilityEnergy; +import net.minecraftforge.energy.IEnergyStorage; +import ru.dbotthepony.mc.otm.capability.IMatteryEnergyStorage; +import ru.dbotthepony.mc.otm.capability.MatteryCapability; +import ru.dbotthepony.mc.otm.capability.MatteryMachineEnergyStorage; +import ru.dbotthepony.mc.otm.container.SimpleSerializableContainer; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.math.BigDecimal; +import java.util.Optional; + +abstract public class BlockEntityMatteryPoweredMachine extends BlockEntityMatteryMachine { + protected MatteryMachineEnergyStorage energy = null; + protected LazyOptional energy_resolver = null; + + public SimpleSerializableContainer battery_container = new SimpleSerializableContainer(1); + + protected void tickBatteryCharge() { + if (energy.getMissingPower().compareTo(BigDecimal.ZERO) <= 0) + return; + + BigDecimal demand = energy.getMissingPower(); + demand = demand.min(energy.receiveEnergyOuter(demand, true)); + + for (int i = 0; i < battery_container.getContainerSize() && demand.compareTo(BigDecimal.ZERO) > 0; i++) { + ItemStack stack = battery_container.getItem(i); + + if (!stack.isEmpty()) { + Optional mattery_storage = stack.getCapability(MatteryCapability.ENERGY).resolve(); + + if (mattery_storage.isPresent()) { + IMatteryEnergyStorage storage = mattery_storage.get(); + + BigDecimal drain = storage.extractEnergyOuter(demand, true); + + if (!drain.equals(BigDecimal.ZERO)) { + BigDecimal receive = energy.receiveEnergyOuter(drain, true); + + storage.extractEnergyOuter(receive, false); + energy.receiveEnergyOuter(receive, false); + + demand = demand.subtract(receive, MatteryCapability.ROUND_RULES); + } + } else if (demand.compareTo(BigDecimal.ONE) >= 0) { + Optional storage = stack.getCapability(CapabilityEnergy.ENERGY).resolve(); + + if (storage.isPresent()) { + IEnergyStorage energy_fe = storage.get(); + + BigDecimal drain = MatteryCapability.drainFE(energy_fe, demand, true); + + if (!drain.equals(BigDecimal.ZERO)) { + BigDecimal receive = energy.receiveEnergyOuter(drain, true); + + MatteryCapability.drainFE(energy_fe, receive, false); + energy.receiveEnergyOuter(receive, false); + + demand = demand.subtract(receive, MatteryCapability.ROUND_RULES); + } + } + } + } + } + } + + public BlockEntityMatteryPoweredMachine(BlockEntityType p_155228_, BlockPos p_155229_, BlockState p_155230_) { + super(p_155228_, p_155229_, p_155230_); + } + + @Nonnull + public LazyOptional getCapability(@Nonnull Capability cap, @Nullable Direction side) { + if ((cap == MatteryCapability.ENERGY || cap == CapabilityEnergy.ENERGY) && energy_resolver != null) { + return energy_resolver.cast(); + } + + return super.getCapability(cap, side); + } + + @Override + public CompoundTag save(CompoundTag nbt) { + nbt.put("energy_cap", energy.serializeNBT()); + nbt.put("battery_container", battery_container.serializeNBT()); + + return super.save(nbt); + } + + public void load(CompoundTag nbt) { + if (nbt.contains("energy_cap") && nbt.get("energy_cap") instanceof CompoundTag tag) + energy.deserializeNBT(tag); + + if (nbt.contains("battery_container") && nbt.get("battery_container") instanceof CompoundTag tag) + battery_container = SimpleSerializableContainer.of(tag, 1); + + super.load(nbt); + } +} diff --git a/src/main/java/ru/dbotthepony/mc/otm/capability/MatteryCapability.java b/src/main/java/ru/dbotthepony/mc/otm/capability/MatteryCapability.java index 4f114e817..c852c3341 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/capability/MatteryCapability.java +++ b/src/main/java/ru/dbotthepony/mc/otm/capability/MatteryCapability.java @@ -2,6 +2,7 @@ package ru.dbotthepony.mc.otm.capability; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.CapabilityInject; +import net.minecraftforge.energy.IEnergyStorage; import java.math.BigDecimal; import java.math.MathContext; @@ -21,4 +22,32 @@ public class MatteryCapability { public static final BigDecimal LONG_MAX_VALUE = new BigDecimal(Long.MAX_VALUE); public static final BigDecimal LONG_MIN_VALUE = new BigDecimal(Long.MIN_VALUE); + + public static BigDecimal drainFE(IEnergyStorage capability, BigDecimal howMuch, boolean simulate) { + if (howMuch.compareTo(BigDecimal.ONE) < 0) + return BigDecimal.ZERO; + + int howMuchInt; + + if (howMuch.compareTo(INT_MAX_VALUE) > 0) + howMuchInt = Integer.MAX_VALUE; + else + howMuchInt = howMuch.intValue(); + + return new BigDecimal(capability.extractEnergy(howMuchInt, simulate)); + } + + public static BigDecimal fillFE(IEnergyStorage capability, BigDecimal howMuch, boolean simulate) { + if (howMuch.compareTo(BigDecimal.ONE) < 0) + return BigDecimal.ZERO; + + int howMuchInt; + + if (howMuch.compareTo(INT_MAX_VALUE) > 0) + howMuchInt = Integer.MAX_VALUE; + else + howMuchInt = howMuch.intValue(); + + return new BigDecimal(capability.receiveEnergy(howMuchInt, simulate)); + } } diff --git a/src/main/java/ru/dbotthepony/mc/otm/container/SimpleSerializableContainer.java b/src/main/java/ru/dbotthepony/mc/otm/container/SimpleSerializableContainer.java new file mode 100644 index 000000000..25f657ff5 --- /dev/null +++ b/src/main/java/ru/dbotthepony/mc/otm/container/SimpleSerializableContainer.java @@ -0,0 +1,47 @@ +package ru.dbotthepony.mc.otm.container; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.world.SimpleContainer; +import net.minecraft.world.item.ItemStack; + +public class SimpleSerializableContainer extends SimpleContainer { + public SimpleSerializableContainer(int i) { + super(i); + } + + public SimpleSerializableContainer(ItemStack... p_19152_) { + super(p_19152_); + } + + public CompoundTag serializeNBT() { + CompoundTag tag = new CompoundTag(); + tag.putInt("size", getContainerSize()); + ListTag list = new ListTag(); + tag.put("items", list); + + for (int i = 0; i < getContainerSize(); i++) + list.add(getItem(i).serializeNBT()); + + return tag; + } + + public static SimpleSerializableContainer of(CompoundTag tag, int fallback_size) { + if (tag == null) + return new SimpleSerializableContainer(fallback_size); + + SimpleSerializableContainer container; + + if (tag.contains("size")) + container = new SimpleSerializableContainer(tag.getInt("size")); + else + container = new SimpleSerializableContainer(fallback_size); + + if (tag.get("items") instanceof ListTag list) + for (int i = 0; i < Math.min(list.size(), container.getContainerSize()); i++) + if (list.get(i) instanceof CompoundTag get_tag) + container.setItem(i, ItemStack.of(get_tag)); + + return container; + } +} diff --git a/src/main/java/ru/dbotthepony/mc/otm/menu/AndroidStationMenu.java b/src/main/java/ru/dbotthepony/mc/otm/menu/AndroidStationMenu.java index 1caf462bf..70a5103fb 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/menu/AndroidStationMenu.java +++ b/src/main/java/ru/dbotthepony/mc/otm/menu/AndroidStationMenu.java @@ -17,10 +17,11 @@ import ru.dbotthepony.mc.otm.capability.IAndroidCapability; import ru.dbotthepony.mc.otm.capability.IMatteryEnergyStorage; import ru.dbotthepony.mc.otm.capability.MatteryCapability; import ru.dbotthepony.mc.otm.menu.data.BigDecimalDataContainer; +import ru.dbotthepony.mc.otm.menu.slot.BatterySlot; import javax.annotation.Nullable; -public class AndroidStationMenu extends AbstractContainerMenu { +public class AndroidStationMenu extends PoweredMachineMenu { public static class AndroidStationContainer extends SimpleContainer { public final Player player; private final IAndroidCapability android; @@ -38,7 +39,7 @@ public class AndroidStationMenu extends AbstractContainerMenu { } } - public static class AndroidBatterySlot extends Slot { + public static class AndroidBatterySlot extends BatterySlot { private final IAndroidCapability android; public AndroidBatterySlot(AndroidStationContainer container, int index, int x, int y) { @@ -46,12 +47,6 @@ public class AndroidStationMenu extends AbstractContainerMenu { android = container.android; } - @Override - public boolean mayPlace(ItemStack stack) { - LazyOptional capability = stack.getCapability(CapabilityEnergy.ENERGY); - return capability.isPresent() && capability.resolve().get().canExtract(); - } - @Override public void set(ItemStack stack) { super.set(stack); @@ -59,77 +54,26 @@ public class AndroidStationMenu extends AbstractContainerMenu { } } - private BlockEntityAndroidStation tile; - private Inventory inventory; - private Player ply; - private AndroidStationContainer container; - public BigDecimalDataContainer energy; - public BigDecimalDataContainer max_energy; - // Clientside public AndroidStationMenu(int containerID, Inventory inventory) { - this(containerID, inventory, new AndroidStationContainer(inventory.player), null); + this(containerID, inventory,null); } // Serverside - public AndroidStationMenu(int containerID, Inventory inventory, AndroidStationContainer container, @Nullable BlockEntityAndroidStation tile) { - super(OverdriveThatMatters.ANDROID_STATION_MENU_TYPE, containerID); - this.inventory = inventory; - this.container = container; - this.tile = tile; - this.ply = inventory.player; + public AndroidStationMenu( + int containerID, + Inventory inventory, + @Nullable BlockEntityAndroidStation tile + ) { + super( + OverdriveThatMatters.ANDROID_STATION_MENU_TYPE, + containerID, + inventory, + tile); - if (tile == null) { - energy = new BigDecimalDataContainer(); - max_energy = new BigDecimalDataContainer(); - } else { - energy = new BigDecimalDataContainer() { - @Override - protected void updateValue() { - LazyOptional capability = tile.getCapability(MatteryCapability.ENERGY); + addSlot(new AndroidBatterySlot(new AndroidStationContainer(inventory.player), 0, 39, 15)); + addBatterySlot(); - if (capability.isPresent()) - setDecimal(capability.resolve().get().getBatteryLevel()); - } - }; - - max_energy = new BigDecimalDataContainer() { - @Override - protected void updateValue() { - LazyOptional capability = tile.getCapability(MatteryCapability.ENERGY); - - if (capability.isPresent()) - setDecimal(capability.resolve().get().getMaxBatteryLevel()); - } - }; - } - - this.addSlot(new AndroidBatterySlot(this.container, 0, 39, 15)); - - for (int i = 0; i < 3; ++i) { - for (int j = 0; j < 9; ++j) { - this.addSlot(new Slot(inventory, j + i * 9 + 9, 8 + j * 18, 97 + i * 18)); - } - } - - for (int k = 0; k < 9; ++k) { - this.addSlot(new Slot(inventory, k, 8 + k * 18, 155)); - } - - this.addDataSlots(energy); - this.addDataSlots(max_energy); - } - - @Override - public boolean stillValid(Player player) { - if (tile == null) - return true; - - if (player.level.getBlockEntity(tile.getBlockPos()) != tile) { - return false; - } - - BlockPos pos = tile.getBlockPos(); - return player.distanceToSqr((double)pos.getX() + 0.5D, (double)pos.getY() + 0.5D, (double)pos.getZ() + 0.5D) <= 64.0D; + addInventorySlots(); } } diff --git a/src/main/java/ru/dbotthepony/mc/otm/menu/PoweredMachineMenu.java b/src/main/java/ru/dbotthepony/mc/otm/menu/PoweredMachineMenu.java new file mode 100644 index 000000000..af8f4fe18 --- /dev/null +++ b/src/main/java/ru/dbotthepony/mc/otm/menu/PoweredMachineMenu.java @@ -0,0 +1,104 @@ +package ru.dbotthepony.mc.otm.menu; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.Container; +import net.minecraft.world.SimpleContainer; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.inventory.Slot; +import net.minecraftforge.common.util.LazyOptional; +import ru.dbotthepony.mc.otm.block.entity.BlockEntityMatteryPoweredMachine; +import ru.dbotthepony.mc.otm.capability.IMatteryEnergyStorage; +import ru.dbotthepony.mc.otm.capability.MatteryCapability; +import ru.dbotthepony.mc.otm.menu.data.BigDecimalDataContainer; +import ru.dbotthepony.mc.otm.menu.slot.BatterySlot; + +import javax.annotation.Nullable; + +abstract public class PoweredMachineMenu extends AbstractContainerMenu { + protected BlockEntityMatteryPoweredMachine tile; + protected Inventory inventory; + protected Player ply; + public BigDecimalDataContainer energy; + public BigDecimalDataContainer max_energy; + + protected PoweredMachineMenu( + @Nullable MenuType menuType, + int containerID, + Inventory inventory, + @Nullable BlockEntityMatteryPoweredMachine tile + ) { + super(menuType, containerID); + this.tile = tile; + this.inventory = inventory; + this.ply = inventory.player; + + if (tile == null) { + energy = new BigDecimalDataContainer(); + max_energy = new BigDecimalDataContainer(); + } else { + energy = new BigDecimalDataContainer() { + @Override + protected void updateValue() { + LazyOptional capability = tile.getCapability(MatteryCapability.ENERGY); + + if (capability.isPresent()) + setDecimal(capability.resolve().get().getBatteryLevel()); + } + }; + + max_energy = new BigDecimalDataContainer() { + @Override + protected void updateValue() { + LazyOptional capability = tile.getCapability(MatteryCapability.ENERGY); + + if (capability.isPresent()) + setDecimal(capability.resolve().get().getMaxBatteryLevel()); + } + }; + } + + this.addDataSlots(energy); + this.addDataSlots(max_energy); + } + + protected void addBatterySlot() { + addBatterySlot(8, 66); + } + + protected void addBatterySlot(int x, int y) { + Container battery_container = tile != null ? tile.battery_container : new SimpleContainer(1); + this.addSlot(new BatterySlot(battery_container, 0, x, y)); + } + + protected void addInventorySlots() { + addInventorySlots(97); + } + + protected void addInventorySlots(int offset) { + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 9; ++j) { + this.addSlot(new Slot(inventory, j + i * 9 + 9, 8 + j * 18, offset + i * 18)); + } + } + + for (int k = 0; k < 9; ++k) { + this.addSlot(new Slot(inventory, k, 8 + k * 18, offset + 58)); + } + } + + @Override + public boolean stillValid(Player player) { + if (tile == null) + return true; + + if (player.level.getBlockEntity(tile.getBlockPos()) != tile) { + return false; + } + + BlockPos pos = tile.getBlockPos(); + return player.distanceToSqr((double)pos.getX() + 0.5D, (double)pos.getY() + 0.5D, (double)pos.getZ() + 0.5D) <= 64.0D; + } +} diff --git a/src/main/java/ru/dbotthepony/mc/otm/menu/slot/BatterySlot.java b/src/main/java/ru/dbotthepony/mc/otm/menu/slot/BatterySlot.java new file mode 100644 index 000000000..a2fdfe0de --- /dev/null +++ b/src/main/java/ru/dbotthepony/mc/otm/menu/slot/BatterySlot.java @@ -0,0 +1,20 @@ +package ru.dbotthepony.mc.otm.menu.slot; + +import net.minecraft.world.Container; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.energy.CapabilityEnergy; +import net.minecraftforge.energy.IEnergyStorage; + +public class BatterySlot extends Slot { + public BatterySlot(Container container, int index, int x, int y) { + super(container, index, x, y); + } + + @Override + public boolean mayPlace(ItemStack stack) { + LazyOptional capability = stack.getCapability(CapabilityEnergy.ENERGY); + return capability.isPresent() && capability.resolve().get().canExtract(); + } +} diff --git a/src/main/resources/assets/overdrive_that_matters/textures/gui/mattery_machine_base.png b/src/main/resources/assets/overdrive_that_matters/textures/gui/mattery_machine_base.png new file mode 100644 index 0000000000000000000000000000000000000000..f6b3c452c2b83a1bbd911bed70e90f4365c252c0 GIT binary patch literal 10115 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/data/overdrive_that_matters/loot_tables/blocks/android_station.json b/src/main/resources/data/overdrive_that_matters/loot_tables/blocks/android_station.json index 1f1897448..9b290f7d8 100644 --- a/src/main/resources/data/overdrive_that_matters/loot_tables/blocks/android_station.json +++ b/src/main/resources/data/overdrive_that_matters/loot_tables/blocks/android_station.json @@ -21,6 +21,11 @@ "target": "BlockEntityTag.energy_cap", "op": "replace" }, + { + "source": "battery_container", + "target": "BlockEntityTag.battery_container", + "op": "replace" + }, { "source": "Name", "target": "BlockEntityTag.Name",