Battery bank!

This commit is contained in:
DBotThePony 2021-08-12 01:12:58 +07:00
parent 7283c9a1ae
commit 51e424d9af
Signed by: DBot
GPG Key ID: DCC23B5715498507
25 changed files with 862 additions and 206 deletions

View File

@ -16,11 +16,15 @@ import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import ru.dbotthepony.mc.otm.block.BlockAndroidStation;
import ru.dbotthepony.mc.otm.block.BlockBatteryBank;
import ru.dbotthepony.mc.otm.block.entity.BlockEntityAndroidStation;
import ru.dbotthepony.mc.otm.block.entity.BlockEntityBatteryBank;
import ru.dbotthepony.mc.otm.item.ItemBattery;
import ru.dbotthepony.mc.otm.item.ItemPill;
import ru.dbotthepony.mc.otm.menu.AndroidStationMenu;
import ru.dbotthepony.mc.otm.menu.BatteryBankMenu;
import ru.dbotthepony.mc.otm.screen.AndroidStationScreen;
import ru.dbotthepony.mc.otm.screen.BatteryBankScreen;
import java.math.BigDecimal;
@ -35,6 +39,7 @@ public class Registry {
public static class Names {
public static final ResourceLocation ANDROID_STATION = new ResourceLocation(OverdriveThatMatters.MOD_ID, "android_station");
public static final ResourceLocation BATTERY_BANK = new ResourceLocation(OverdriveThatMatters.MOD_ID, "battery_bank");
public static final ResourceLocation ANDROID_CAPABILITY = new ResourceLocation(OverdriveThatMatters.MOD_ID, "android_capability");
public static final ResourceLocation PILL_ANDROID = new ResourceLocation(OverdriveThatMatters.MOD_ID, "pill_android");
@ -50,16 +55,24 @@ public class Registry {
public static class Blocks {
public static final Block ANDROID_STATION = new BlockAndroidStation();
public static final Block BATTERY_BANK = new BlockBatteryBank();
static {
ANDROID_STATION.setRegistryName(Names.ANDROID_STATION);
BATTERY_BANK.setRegistryName(Names.BATTERY_BANK);
}
public static void register(final RegistryEvent.Register<Block> event) {
event.getRegistry().register(ANDROID_STATION);
event.getRegistry().register(BATTERY_BANK);
// OverdriveThatMatters.LOGGER.info("Registered blocks");
}
}
public static class Items {
public static final Item ANDROID_STATION = new BlockItem(Blocks.ANDROID_STATION, new Item.Properties().stacksTo(64).tab(CreativeModeTab.TAB_MISC)).setRegistryName(Names.ANDROID_STATION);
public static final Item ANDROID_STATION = new BlockItem(Blocks.ANDROID_STATION, new Item.Properties().stacksTo(64).tab(CreativeModeTab.TAB_MISC));
public static final Item BATTERY_BANK = new BlockItem(Blocks.BATTERY_BANK, new Item.Properties().stacksTo(64).tab(CreativeModeTab.TAB_MISC));
public static final ItemPill PILL_ANDROID = new ItemPill(ItemPill.PillType.BECOME_ANDROID);
public static final ItemPill PILL_HUMANE = new ItemPill(ItemPill.PillType.BECOME_HUMANE);
@ -71,6 +84,9 @@ public class Registry {
public static final ItemBattery BATTERY_CREATIVE = new ItemBattery();
static {
ANDROID_STATION.setRegistryName(Names.ANDROID_STATION);
BATTERY_BANK.setRegistryName(Names.BATTERY_BANK);
PILL_ANDROID.setRegistryName(Names.PILL_ANDROID);
PILL_HUMANE.setRegistryName(Names.PILL_HUMANE);
BATTERY_CRUDE.setRegistryName(Names.BATTERY_CRUDE);
@ -83,6 +99,8 @@ public class Registry {
public static void register(final RegistryEvent.Register<Item> event) {
event.getRegistry().register(ANDROID_STATION);
event.getRegistry().register(BATTERY_BANK);
event.getRegistry().register(PILL_ANDROID);
event.getRegistry().register(PILL_HUMANE);
event.getRegistry().register(BATTERY_CRUDE);
@ -97,35 +115,41 @@ public class Registry {
}
public static class BlockEntities {
public static BlockEntityType.Builder<BlockEntityAndroidStation> ANDROID_STATION_BUILDER = BlockEntityType.Builder.of(BlockEntityAndroidStation::new, Blocks.ANDROID_STATION);
public static BlockEntityType<BlockEntityAndroidStation> ANDROID_STATION = ANDROID_STATION_BUILDER.build(null);
public static BlockEntityType<BlockEntityAndroidStation> ANDROID_STATION = BlockEntityType.Builder.of(BlockEntityAndroidStation::new, Blocks.ANDROID_STATION).build(null);
public static BlockEntityType<BlockEntityBatteryBank> BATTERY_BANK = BlockEntityType.Builder.of(BlockEntityBatteryBank::new, Blocks.BATTERY_BANK).build(null);
static {
ANDROID_STATION.setRegistryName(Names.ANDROID_STATION);
BATTERY_BANK.setRegistryName(Names.BATTERY_BANK);
}
public static void register(final RegistryEvent.Register<BlockEntityType<?>> event) {
event.getRegistry().register(ANDROID_STATION);
event.getRegistry().register(BATTERY_BANK);
// OverdriveThatMatters.LOGGER.info("Registered block entities");
}
}
public static class Menus {
public static final MenuType<AndroidStationMenu> ANDROID_STATION = new net.minecraft.world.inventory.MenuType<>(AndroidStationMenu::new);
public static final MenuType<AndroidStationMenu> ANDROID_STATION = new MenuType<>(AndroidStationMenu::new);
public static final MenuType<BatteryBankMenu> BATTERY_BANK = new MenuType<>(BatteryBankMenu::new);
static {
ANDROID_STATION.setRegistryName(Names.ANDROID_STATION);
BATTERY_BANK.setRegistryName(Names.BATTERY_BANK);
}
public static void register(final RegistryEvent.Register<MenuType<?>> event) {
event.getRegistry().register(ANDROID_STATION);
event.getRegistry().register(BATTERY_BANK);
// OverdriveThatMatters.LOGGER.info("Registered menus");
}
public static void registerScreens(final FMLClientSetupEvent event) {
MenuScreens.register(ANDROID_STATION, AndroidStationScreen::new);
MenuScreens.register(BATTERY_BANK, BatteryBankScreen::new);
// OverdriveThatMatters.LOGGER.info("Registered screens");
}

View File

@ -28,7 +28,6 @@ public class BlockAndroidStation extends BlockMatteryMachineBase implements Enti
public BlockAndroidStation() {
super();
this.setRegistryName(Registry.Names.ANDROID_STATION);
}
@Override

View File

@ -0,0 +1,32 @@
package ru.dbotthepony.mc.otm.block;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
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.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.properties.EnumProperty;
import ru.dbotthepony.mc.otm.Registry;
import ru.dbotthepony.mc.otm.block.entity.BlockEntityAndroidStation;
import ru.dbotthepony.mc.otm.block.entity.BlockEntityBatteryBank;
import javax.annotation.Nullable;
public class BlockBatteryBank extends BlockMatteryRotatableMachineBase implements EntityBlock {
@Nullable
@Override
public <T extends BlockEntity> BlockEntityTicker<T> getTicker(Level level, BlockState p_153213_, BlockEntityType<T> type) {
return level.isClientSide || type != Registry.BlockEntities.BATTERY_BANK ? null : BlockEntityBatteryBank::tick;
}
@Nullable
@Override
public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) {
return new BlockEntityBatteryBank(blockPos, blockState);
}
}

View File

@ -0,0 +1,35 @@
package ru.dbotthepony.mc.otm.block;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.properties.EnumProperty;
import javax.annotation.Nullable;
public abstract class BlockMatteryRotatableMachineBase extends BlockMatteryMachineBase {
public static final EnumProperty<Direction> FACING = EnumProperty.create("facing", Direction.class);
public BlockMatteryRotatableMachineBase() {
super();
registerDefaultState(this.getStateDefinition().any().setValue(FACING, Direction.SOUTH));
}
@Override
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
builder.add(FACING);
}
@Nullable
@Override
public BlockState getStateForPlacement(BlockPlaceContext context) {
return this.defaultBlockState().setValue(FACING, context.getNearestLookingDirection());
}
}

View File

@ -1,6 +1,8 @@
package ru.dbotthepony.mc.otm.block.entity;
import net.minecraft.core.BlockPos;
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,9 +31,14 @@ public class BlockEntityAndroidStation extends BlockEntityMatteryPoweredMachine
return new AndroidStationMenu(containerID, inventory, this);
}
@Override
protected Component getDefaultDisplayName() {
return new TranslatableComponent("container.otm.android_station");
}
public BlockEntityAndroidStation(BlockPos p_155229_, BlockState p_155230_) {
super(Registry.BlockEntities.ANDROID_STATION, p_155229_, p_155230_);
energy = new MatteryMachineEnergyStorage(MatteryMachineEnergyStorage.MachineType.WORKER, new BigDecimal(100_000), new BigDecimal(250), new BigDecimal(250));
energy = new MatteryMachineEnergyStorage(this, MatteryMachineEnergyStorage.MachineType.WORKER, new BigDecimal(100_000), new BigDecimal(250), new BigDecimal(250));
energy_resolver = LazyOptional.of(() -> energy);
}

View File

@ -0,0 +1,342 @@
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.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.entity.TickingBlockEntity;
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.OverdriveThatMatters;
import ru.dbotthepony.mc.otm.Registry;
import ru.dbotthepony.mc.otm.block.BlockMatteryRotatableMachineBase;
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 ru.dbotthepony.mc.otm.menu.BatteryBankMenu;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.math.BigDecimal;
import java.util.Optional;
public class BlockEntityBatteryBank extends BlockEntityMatteryMachine {
// 5 на 3
public SimpleSerializableContainer battery_container = new SimpleSerializableContainer(this::setChanged, 5 * 3);
public static class BatteryBankDistribution {
private final BigDecimal[] distribution;
private final BigDecimal max_throughput;
public BigDecimal max_throughput() {
return max_throughput;
}
public BigDecimal[] distribution() {
return distribution;
}
public BatteryBankDistribution(BigDecimal[] distribution, BigDecimal max_throughput) {
this.distribution = distribution;
this.max_throughput = max_throughput;
}
}
public static class BatteryBankEnergy implements IMatteryEnergyStorage {
public enum BankMode {
RECEIVE,
EXTRACT,
BIDIRECTIONAL
}
private final BlockEntityBatteryBank tile;
private final BankMode mode;
BatteryBankEnergy(BlockEntityBatteryBank tile, BankMode mode) {
this.tile = tile;
this.mode = mode;
}
@Override
public boolean canExtractOuter() {
return mode == BankMode.EXTRACT || mode == BankMode.BIDIRECTIONAL;
}
@Override
public boolean canReceiveOuter() {
return mode == BankMode.RECEIVE || mode == BankMode.BIDIRECTIONAL;
}
@Override
public boolean canExtractInner() {
return true;
}
@Override
public boolean canReceiveInner() {
return true;
}
@Nonnull
@Override
public BigDecimal extractEnergyOuter(BigDecimal howMuch, boolean simulate) {
if (mode == BankMode.RECEIVE)
return BigDecimal.ZERO;
return extractEnergyInner(howMuch, simulate);
}
BatteryBankDistribution getDistribution(boolean mode) {
BigDecimal[] distribution = new BigDecimal[tile.battery_container.getContainerSize()];
BigDecimal summ = BigDecimal.ZERO;
for (int i = 0; i < tile.battery_container.getContainerSize(); i++) {
ItemStack stack = tile.battery_container.getItem(i);
if (!stack.isEmpty()) {
Optional<IMatteryEnergyStorage> cap = stack.getCapability(MatteryCapability.ENERGY).resolve();
if (cap.isPresent()) {
BigDecimal diff = mode ? cap.get().receiveEnergyOuter(MatteryCapability.LONG_MAX_VALUE, true) : cap.get().extractEnergyOuter(MatteryCapability.LONG_MAX_VALUE, true);
distribution[i] = diff;
summ = summ.add(diff);
} else {
Optional<IEnergyStorage> cap2 = stack.getCapability(CapabilityEnergy.ENERGY).resolve();
if (cap2.isPresent()) {
BigDecimal diff = new BigDecimal(mode ? cap2.get().receiveEnergy(Integer.MAX_VALUE, true) : cap2.get().extractEnergy(Integer.MAX_VALUE, true));
distribution[i] = diff;
summ = summ.add(diff);
}
}
} else {
distribution[i] = BigDecimal.ZERO;
}
}
if (summ.compareTo(BigDecimal.ZERO) != 0) {
for (int i = 0; i < tile.battery_container.getContainerSize(); i++) {
distribution[i] = distribution[i].divide(summ, MatteryCapability.ROUND_RULES);
}
}
return new BatteryBankDistribution(distribution, summ);
}
private BigDecimal distributeEnergy(boolean mode, BigDecimal howMuch, boolean simulate) {
BatteryBankDistribution distribution = getDistribution(mode);
if (distribution.max_throughput.compareTo(BigDecimal.ZERO) == 0)
return BigDecimal.ZERO;
BigDecimal[] distList = distribution.distribution;
BigDecimal summ = BigDecimal.ZERO;
for (int i = 0; i < tile.battery_container.getContainerSize(); i++) {
if (!distList[i].equals(BigDecimal.ZERO)) {
ItemStack stack = tile.battery_container.getItem(i);
if (!stack.isEmpty()) {
Optional<IMatteryEnergyStorage> cap = stack.getCapability(MatteryCapability.ENERGY).resolve();
if (cap.isPresent()) {
BigDecimal diff = mode ? cap.get().receiveEnergyOuter(howMuch.multiply(distList[i], MatteryCapability.ROUND_RULES), simulate) : cap.get().extractEnergyOuter(howMuch.multiply(distList[i], MatteryCapability.ROUND_RULES), simulate);
summ = summ.add(diff);
} else {
Optional<IEnergyStorage> cap2 = stack.getCapability(CapabilityEnergy.ENERGY).resolve();
if (cap2.isPresent()) {
BigDecimal diff = mode ? MatteryCapability.floodFE(cap2.get(), howMuch.multiply(distList[i], MatteryCapability.ROUND_RULES), simulate) : MatteryCapability.drainFE(cap2.get(), howMuch.multiply(distList[i], MatteryCapability.ROUND_RULES), simulate);
summ = summ.add(diff);
}
}
}
}
}
return summ;
}
@Nonnull
@Override
public BigDecimal extractEnergyInner(BigDecimal howMuch, boolean simulate) {
return distributeEnergy(false, howMuch, simulate);
}
@Nonnull
@Override
public BigDecimal receiveEnergyOuter(BigDecimal howMuch, boolean simulate) {
if (mode == BankMode.EXTRACT)
return BigDecimal.ZERO;
return receiveEnergyInner(howMuch, simulate);
}
@Nonnull
@Override
public BigDecimal receiveEnergyInner(BigDecimal howMuch, boolean simulate) {
return distributeEnergy(true, howMuch, simulate);
}
@Nonnull
@Override
public BigDecimal getBatteryLevel() {
BigDecimal result = BigDecimal.ZERO;
for (int i = 0; i < tile.battery_container.getContainerSize(); i++) {
ItemStack stack = tile.battery_container.getItem(i);
if (!stack.isEmpty()) {
Optional<IMatteryEnergyStorage> cap = stack.getCapability(MatteryCapability.ENERGY).resolve();
if (cap.isPresent()) {
result = result.add(cap.get().getBatteryLevel(), MatteryCapability.ROUND_RULES);
} else {
Optional<IEnergyStorage> cap2 = stack.getCapability(CapabilityEnergy.ENERGY).resolve();
if (cap2.isPresent()) {
result = result.add(new BigDecimal(cap2.get().getEnergyStored()), MatteryCapability.ROUND_RULES);
}
}
}
}
return result;
}
@Nonnull
@Override
public BigDecimal getMaxBatteryLevel() {
BigDecimal result = BigDecimal.ZERO;
for (int i = 0; i < tile.battery_container.getContainerSize(); i++) {
ItemStack stack = tile.battery_container.getItem(i);
if (!stack.isEmpty()) {
Optional<IMatteryEnergyStorage> cap = stack.getCapability(MatteryCapability.ENERGY).resolve();
if (cap.isPresent()) {
result = result.add(cap.get().getMaxBatteryLevel(), MatteryCapability.ROUND_RULES);
} else {
Optional<IEnergyStorage> cap2 = stack.getCapability(CapabilityEnergy.ENERGY).resolve();
if (cap2.isPresent()) {
result = result.add(new BigDecimal(cap2.get().getMaxEnergyStored()), MatteryCapability.ROUND_RULES);
}
}
}
}
return result;
}
}
public final BatteryBankEnergy energy_receiver = new BatteryBankEnergy(this, BatteryBankEnergy.BankMode.RECEIVE);
public final LazyOptional<BatteryBankEnergy> energy_receiver_resolver = LazyOptional.of(() -> energy_receiver);
public final BatteryBankEnergy energy_extractor = new BatteryBankEnergy(this, BatteryBankEnergy.BankMode.EXTRACT);
public final LazyOptional<BatteryBankEnergy> energy_extractor_resolver = LazyOptional.of(() -> energy_extractor);
public final BatteryBankEnergy energy = new BatteryBankEnergy(this, BatteryBankEnergy.BankMode.BIDIRECTIONAL);
public final LazyOptional<BatteryBankEnergy> energy_resolver = LazyOptional.of(() -> energy);
protected boolean valid = true;
public BlockEntityBatteryBank(BlockPos p_155229_, BlockState p_155230_) {
super(Registry.BlockEntities.BATTERY_BANK, p_155229_, p_155230_);
}
@Override
public CompoundTag save(CompoundTag nbt) {
nbt.put("battery_bank", battery_container.serializeNBT());
return super.save(nbt);
}
@Override
public void load(CompoundTag nbt) {
if (nbt.contains("battery_bank") && nbt.get("battery_bank") instanceof CompoundTag tag)
battery_container = SimpleSerializableContainer.of(this::setChanged, tag, battery_container.getContainerSize());
super.load(nbt);
}
@Override
protected Component getDefaultDisplayName() {
return new TranslatableComponent("container.otm.battery_bank");
}
@Nullable
@Override
public AbstractContainerMenu createMenu(int containerID, Inventory inventory, Player ply) {
return new BatteryBankMenu(containerID, inventory, this, this.battery_container);
}
@Override
public void invalidateCaps() {
super.invalidateCaps();
valid = false;
}
@Override
public void reviveCaps() {
super.reviveCaps();
valid = true;
}
@Nonnull
public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) {
if (valid && (cap == MatteryCapability.ENERGY || cap == CapabilityEnergy.ENERGY)) {
if (side == null)
return energy_resolver.cast();
if (side == getBlockState().getValue(BlockMatteryRotatableMachineBase.FACING))
return energy_extractor_resolver.cast();
return energy_receiver_resolver.cast();
}
return super.getCapability(cap, side);
}
public static <T extends BlockEntity> void tick(Level level, BlockPos blockPos, BlockState blockState, T t) {
if (t instanceof BlockEntityBatteryBank tile) {
BlockEntity get_entity = level.getBlockEntity(blockPos.offset(tile.getBlockState().getValue(BlockMatteryRotatableMachineBase.FACING).getNormal()));
if (get_entity != null) {
Optional<IMatteryEnergyStorage> cap = get_entity.getCapability(MatteryCapability.ENERGY).resolve();
if (cap.isPresent()) {
if (cap.get().canReceiveOuter()) {
BatteryBankDistribution distribution = tile.energy.getDistribution(false);
BigDecimal diff = cap.get().receiveEnergyOuter(distribution.max_throughput, true);
diff = tile.energy.extractEnergyOuter(diff, false);
cap.get().receiveEnergyOuter(diff, false);
}
} else {
Optional<IEnergyStorage> cap2 = get_entity.getCapability(CapabilityEnergy.ENERGY).resolve();
if (cap2.isPresent()) {
if (cap2.get().canReceive()) {
BatteryBankDistribution distribution = tile.energy.getDistribution(false);
BigDecimal diff = MatteryCapability.floodFE(cap2.get(), distribution.max_throughput, true);
diff = tile.energy.extractEnergyOuter(diff, false);
MatteryCapability.floodFE(cap2.get(), diff, false);
}
}
}
}
}
}
}

View File

@ -26,9 +26,13 @@ public abstract class BlockEntityMatteryMachine extends BlockEntity implements M
display_name = text;
}
protected Component getDefaultDisplayName() {
return new TranslatableComponent("container.otm.unknown");
}
@Override
public Component getDisplayName() {
return display_name != null ? display_name : new TranslatableComponent("container.otm.android_station");
return display_name != null ? display_name : getDefaultDisplayName();
}
@Nullable

View File

@ -28,7 +28,7 @@ abstract public class BlockEntityMatteryPoweredMachine extends BlockEntityMatter
protected LazyOptional<MatteryMachineEnergyStorage> energy_resolver = null;
private boolean valid = true;
public SimpleSerializableContainer battery_container = new SimpleSerializableContainer(1);
public SimpleSerializableContainer battery_container = new SimpleSerializableContainer(this::setChanged, 1);
protected void tickBatteryCharge() {
if (energy.getMissingPower().compareTo(BigDecimal.ZERO) <= 0)
@ -48,7 +48,7 @@ abstract public class BlockEntityMatteryPoweredMachine extends BlockEntityMatter
BigDecimal drain = storage.extractEnergyOuter(demand, true);
if (!drain.equals(BigDecimal.ZERO)) {
if (drain.compareTo(BigDecimal.ZERO) != 0) {
BigDecimal receive = energy.receiveEnergyOuter(drain, true);
storage.extractEnergyOuter(receive, false);
@ -64,7 +64,7 @@ abstract public class BlockEntityMatteryPoweredMachine extends BlockEntityMatter
BigDecimal drain = MatteryCapability.drainFE(energy_fe, demand, true);
if (!drain.equals(BigDecimal.ZERO)) {
if (drain.compareTo(BigDecimal.ZERO) != 0) {
BigDecimal receive = energy.receiveEnergyOuter(drain, true);
MatteryCapability.drainFE(energy_fe, receive, false);
@ -116,7 +116,7 @@ abstract public class BlockEntityMatteryPoweredMachine extends BlockEntityMatter
energy.deserializeNBT(tag);
if (nbt.contains("battery_container") && nbt.get("battery_container") instanceof CompoundTag tag)
battery_container = SimpleSerializableContainer.of(tag, 1);
battery_container = SimpleSerializableContainer.of(this::setChanged, tag, 1);
super.load(nbt);
}

View File

@ -164,7 +164,7 @@ public class AndroidCapabilityPlayer extends AndroidCapability {
boolean saturation_changed = false;
while (food_points_missing > 0) {
if (this.extractEnergyInner(ENERGY_FOR_HUNGER_POINT, true).equals(ENERGY_FOR_HUNGER_POINT)) {
if (this.extractEnergyInner(ENERGY_FOR_HUNGER_POINT, true).compareTo(ENERGY_FOR_HUNGER_POINT) == 0) {
this.extractEnergyInner(ENERGY_FOR_HUNGER_POINT, false);
food_points_missing--;
food_changed = true;
@ -174,7 +174,7 @@ public class AndroidCapabilityPlayer extends AndroidCapability {
}
while (saturation_points_missing >= 1F) {
if (this.extractEnergyInner(ENERGY_FOR_HUNGER_POINT, true).equals(ENERGY_FOR_HUNGER_POINT)) {
if (this.extractEnergyInner(ENERGY_FOR_HUNGER_POINT, true).compareTo(ENERGY_FOR_HUNGER_POINT) == 0) {
this.extractEnergyInner(ENERGY_FOR_HUNGER_POINT, false);
saturation_points_missing--;
saturation_changed = true;

View File

@ -1,6 +1,7 @@
package ru.dbotthepony.mc.otm.capability;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraftforge.common.util.INBTSerializable;
import javax.annotation.Nonnull;
@ -22,16 +23,18 @@ public class MatteryMachineEnergyStorage implements IMatteryEnergyStorage, INBTS
protected BigDecimal max_input;
protected BigDecimal max_output;
protected final MachineType machine_type;
protected final BlockEntity listener;
public MatteryMachineEnergyStorage(MachineType type, BigDecimal capacity) {
this(type, capacity, DEFAULT_MAX_RECEIVE, DEFAULT_MAX_EXTRACT);
public MatteryMachineEnergyStorage(BlockEntity listener, MachineType type, BigDecimal capacity) {
this(listener, type, capacity, DEFAULT_MAX_RECEIVE, DEFAULT_MAX_EXTRACT);
}
public MatteryMachineEnergyStorage(MachineType type) {
this(type, DEFAULT_MAX_CAPACITY);
public MatteryMachineEnergyStorage(BlockEntity listener, MachineType type) {
this(listener, type, DEFAULT_MAX_CAPACITY);
}
public MatteryMachineEnergyStorage(MachineType type, BigDecimal capacity, BigDecimal maxReceive, BigDecimal maxExtract) {
public MatteryMachineEnergyStorage(BlockEntity listener, MachineType type, BigDecimal capacity, BigDecimal maxReceive, BigDecimal maxExtract) {
this.listener = listener;
energy_stored_max = capacity;
max_input = maxReceive;
max_output = maxExtract;
@ -54,8 +57,9 @@ public class MatteryMachineEnergyStorage implements IMatteryEnergyStorage, INBTS
BigDecimal new_energy = energy_stored.subtract(howMuch.min(max_output), MatteryCapability.ROUND_RULES).max(BigDecimal.ZERO);
BigDecimal diff = energy_stored.subtract(new_energy);
if (!simulate) {
if (!simulate && !energy_stored.equals(new_energy)) {
energy_stored = new_energy;
listener.setChanged();
}
return diff;
@ -77,8 +81,9 @@ public class MatteryMachineEnergyStorage implements IMatteryEnergyStorage, INBTS
BigDecimal new_energy = energy_stored.add(howMuch.min(max_input), MatteryCapability.ROUND_RULES).min(energy_stored_max);
BigDecimal diff = new_energy.subtract(energy_stored);
if (!simulate) {
if (!simulate && !energy_stored.equals(new_energy)) {
energy_stored = new_energy;
listener.setChanged();
}
return diff;

View File

@ -6,12 +6,21 @@ import net.minecraft.world.SimpleContainer;
import net.minecraft.world.item.ItemStack;
public class SimpleSerializableContainer extends SimpleContainer {
public SimpleSerializableContainer(int i) {
protected final Runnable watcher;
public SimpleSerializableContainer(Runnable watcher, int i) {
super(i);
this.watcher = watcher;
}
public SimpleSerializableContainer(ItemStack... p_19152_) {
public SimpleSerializableContainer(Runnable watcher, ItemStack... p_19152_) {
super(p_19152_);
this.watcher = watcher;
}
@Override
public void setChanged() {
super.setChanged();
watcher.run();
}
public CompoundTag serializeNBT() {
@ -26,16 +35,16 @@ public class SimpleSerializableContainer extends SimpleContainer {
return tag;
}
public static SimpleSerializableContainer of(CompoundTag tag, int fallback_size) {
public static SimpleSerializableContainer of(Runnable watcher, CompoundTag tag, int fallback_size) {
if (tag == null)
return new SimpleSerializableContainer(fallback_size);
return new SimpleSerializableContainer(watcher, fallback_size);
SimpleSerializableContainer container;
if (tag.contains("size"))
container = new SimpleSerializableContainer(tag.getInt("size"));
container = new SimpleSerializableContainer(watcher, tag.getInt("size"));
else
container = new SimpleSerializableContainer(fallback_size);
container = new SimpleSerializableContainer(watcher, fallback_size);
if (tag.get("items") instanceof ListTag list)
for (int i = 0; i < Math.min(list.size(), container.getContainerSize()); i++)

View File

@ -3,7 +3,6 @@ package ru.dbotthepony.mc.otm.menu;
import net.minecraft.world.SimpleContainer;
import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.Slot;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.common.util.LazyOptional;
import ru.dbotthepony.mc.otm.Registry;
@ -14,7 +13,7 @@ import ru.dbotthepony.mc.otm.menu.slot.BatterySlot;
import javax.annotation.Nullable;
public class AndroidStationMenu extends PoweredMachineMenu {
public class AndroidStationMenu extends PoweredMatteryMenu {
public static class AndroidStationContainer extends SimpleContainer {
public final Player player;
private final IAndroidCapability android;
@ -73,32 +72,12 @@ public class AndroidStationMenu extends PoweredMachineMenu {
}
@Override
public ItemStack quickMoveStack(Player ply, int slot_index) {
ItemStack moved = ItemStack.EMPTY;
Slot get_slot = this.slots.get(slot_index);
protected int getWorkingSlotStart() {
return battery_slot_index;
}
if (get_slot.hasItem()) {
ItemStack slot_item = get_slot.getItem();
moved = slot_item.copy();
if (slot_index < inventory_slot_index_start) {
// Moving FROM machine TO inventory
if (!moveItemStackTo(slot_item, inventory_slot_index_start, inventory_slot_index_end + 1, false)) {
return ItemStack.EMPTY;
}
} else if (!moveItemStackTo(slot_item, battery_slot_index, battery_slot_index + 1, true)) {
// Moving FROM inventory TO machine
return ItemStack.EMPTY;
}
if (slot_item.isEmpty()) {
get_slot.set(ItemStack.EMPTY);
} else {
get_slot.setChanged();
}
}
return moved;
@Override
protected int getWorkingSlotEnd() {
return battery_slot_index + 1;
}
}

View File

@ -0,0 +1,69 @@
package ru.dbotthepony.mc.otm.menu;
import net.minecraft.world.Container;
import net.minecraft.world.SimpleContainer;
import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.inventory.MenuType;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraftforge.common.util.LazyOptional;
import ru.dbotthepony.mc.otm.Registry;
import ru.dbotthepony.mc.otm.block.entity.BlockEntityBatteryBank;
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 BatteryBankMenu extends MatteryMenu {
protected BlockEntityBatteryBank tile;
public BigDecimalDataContainer energy;
public BigDecimalDataContainer max_energy;
public BatteryBankMenu(int p_38852_, Inventory inventory) {
this(p_38852_, inventory, null, new SimpleContainer(5 * 3));
}
public BatteryBankMenu(int p_38852_, Inventory inventory, BlockEntityBatteryBank tile, Container batteries) {
super(Registry.Menus.BATTERY_BANK, p_38852_, inventory, tile);
this.tile = tile;
if (tile == null) {
energy = new BigDecimalDataContainer();
max_energy = new BigDecimalDataContainer();
} else {
energy = new BigDecimalDataContainer() {
@Override
protected void updateValue() {
setDecimal(tile.energy.getBatteryLevel());
}
};
max_energy = new BigDecimalDataContainer() {
@Override
protected void updateValue() {
setDecimal(tile.energy.getMaxBatteryLevel());
}
};
}
this.addDataSlots(energy);
this.addDataSlots(max_energy);
for (int row = 0; row < 3; row++)
for (int column = 0; column < 5; column++)
this.addSlot(new BatterySlot(batteries, row * 5 + column, 62 + column * 18, 24 + row * 18));
addInventorySlots();
}
@Override
protected int getWorkingSlotStart() {
return 0;
}
@Override
protected int getWorkingSlotEnd() {
return 5 * 3;
}
}

View File

@ -1,77 +1,32 @@
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.minecraft.world.item.ItemStack;
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 net.minecraft.world.level.block.entity.BlockEntity;
import ru.dbotthepony.mc.otm.block.entity.BlockEntityMatteryMachine;
import javax.annotation.Nullable;
abstract public class PoweredMachineMenu extends AbstractContainerMenu {
protected BlockEntityMatteryPoweredMachine tile;
public abstract class MatteryMenu extends AbstractContainerMenu {
protected BlockEntity 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;
protected MatteryMenu(@Nullable MenuType<?> p_38851_, int p_38852_, Inventory inventory) {
super(p_38851_, p_38852_);
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<IMatteryEnergyStorage> capability = tile.getCapability(MatteryCapability.ENERGY);
if (capability.isPresent())
setDecimal(capability.resolve().get().getBatteryLevel());
}
};
max_energy = new BigDecimalDataContainer() {
@Override
protected void updateValue() {
LazyOptional<IMatteryEnergyStorage> 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 MatteryMenu(@Nullable MenuType<?> p_38851_, int p_38852_, Inventory inventory, BlockEntity tile) {
this(p_38851_, p_38852_, inventory);
this.tile = tile;
}
protected void addInventorySlots() {
@ -117,6 +72,9 @@ abstract public class PoweredMachineMenu extends AbstractContainerMenu {
return player.distanceToSqr((double)pos.getX() + 0.5D, (double)pos.getY() + 0.5D, (double)pos.getZ() + 0.5D) <= 64.0D;
}
abstract protected int getWorkingSlotStart();
abstract protected int getWorkingSlotEnd();
// This method receive Player interactor and slot_index where Shift + Right click occurred
// It shall return item stack that got moved
@Override
@ -128,6 +86,31 @@ abstract public class PoweredMachineMenu extends AbstractContainerMenu {
// if TRUE, iteration order is end_slot_index -> start_slot_index
// if FALSE iteration order is start_slot_index -> end_slot_index
return ItemStack.EMPTY;
ItemStack moved = ItemStack.EMPTY;
Slot get_slot = this.slots.get(slot_index);
if (get_slot.hasItem()) {
ItemStack slot_item = get_slot.getItem();
moved = slot_item.copy();
if (slot_index < inventory_slot_index_start) {
// Moving FROM machine TO inventory
if (!moveItemStackTo(slot_item, inventory_slot_index_start, inventory_slot_index_end + 1, false)) {
return ItemStack.EMPTY;
}
} else if (!moveItemStackTo(slot_item, getWorkingSlotStart(), getWorkingSlotEnd(), false)) {
// Moving FROM inventory TO machine
return ItemStack.EMPTY;
}
if (slot_item.isEmpty()) {
get_slot.set(ItemStack.EMPTY);
} else {
get_slot.setChanged();
}
}
return moved;
}
}

View File

@ -0,0 +1,67 @@
package ru.dbotthepony.mc.otm.menu;
import net.minecraft.world.Container;
import net.minecraft.world.SimpleContainer;
import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.inventory.MenuType;
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 PoweredMatteryMenu extends MatteryMenu {
protected BlockEntityMatteryPoweredMachine tile;
public BigDecimalDataContainer energy;
public BigDecimalDataContainer max_energy;
protected PoweredMatteryMenu(
@Nullable MenuType<?> menuType,
int containerID,
Inventory inventory,
@Nullable BlockEntityMatteryPoweredMachine tile
) {
super(menuType, containerID, inventory, tile);
if (tile == null) {
energy = new BigDecimalDataContainer();
max_energy = new BigDecimalDataContainer();
} else {
energy = new BigDecimalDataContainer() {
@Override
protected void updateValue() {
LazyOptional<IMatteryEnergyStorage> capability = tile.getCapability(MatteryCapability.ENERGY);
if (capability.isPresent())
setDecimal(capability.resolve().get().getBatteryLevel());
}
};
max_energy = new BigDecimalDataContainer() {
@Override
protected void updateValue() {
LazyOptional<IMatteryEnergyStorage> 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));
}
}

View File

@ -1,20 +1,11 @@
package ru.dbotthepony.mc.otm.screen;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.player.Inventory;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import ru.dbotthepony.mc.otm.OverdriveThatMatters;
import ru.dbotthepony.mc.otm.capability.MatteryCapability;
import ru.dbotthepony.mc.otm.menu.AndroidStationMenu;
import java.math.BigDecimal;
public class AndroidStationScreen extends PoweredMachineScreen<AndroidStationMenu> {
private static final ResourceLocation CONTAINER_BACKGROUND = new ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/android_station.png");

View File

@ -0,0 +1,38 @@
package ru.dbotthepony.mc.otm.screen;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.player.Inventory;
import ru.dbotthepony.mc.otm.OverdriveThatMatters;
import ru.dbotthepony.mc.otm.menu.AndroidStationMenu;
import ru.dbotthepony.mc.otm.menu.BatteryBankMenu;
import ru.dbotthepony.mc.otm.menu.MatteryMenu;
public class BatteryBankScreen extends MatteryScreen<BatteryBankMenu> {
private static final ResourceLocation CONTAINER_BACKGROUND = new ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/battery_bank.png");
@Override
protected ResourceLocation CONTAINER_BACKGROUND() {
return CONTAINER_BACKGROUND;
}
public BatteryBankScreen(BatteryBankMenu p_97741_, Inventory p_97742_, Component p_97743_) {
super(p_97741_, p_97742_, p_97743_);
}
@Override
protected void renderTooltip(PoseStack p_97791_, int mouseX, int mouseY) {
super.renderTooltip(p_97791_, mouseX, mouseY);
if (this.hoveredSlot == null && menu.getCarried().isEmpty() && hovering_power_gauge) {
this.renderComponentToolTip(p_97791_, getFormattedPowerLevel(() -> menu.energy.getDecimal(), () -> menu.max_energy.getDecimal()), mouseX, mouseY, font);
}
}
@Override
protected void renderBg(PoseStack pose, float p_97788_, int mouseX, int mouseY) {
super.renderBg(pose, p_97788_, mouseX, mouseY);
renderPowerGauge(pose, 15, 24, mouseX, mouseY, () -> menu.energy.getDecimal(), () -> menu.max_energy.getDecimal());
}
}

View File

@ -0,0 +1,110 @@
package ru.dbotthepony.mc.otm.screen;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.FormattedText;
import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.player.Inventory;
import ru.dbotthepony.mc.otm.OverdriveThatMatters;
import ru.dbotthepony.mc.otm.capability.MatteryCapability;
import ru.dbotthepony.mc.otm.menu.FormattingHelper;
import ru.dbotthepony.mc.otm.menu.MatteryMenu;
import ru.dbotthepony.mc.otm.menu.PoweredMatteryMenu;
import java.math.BigDecimal;
import java.util.List;
import java.util.function.Supplier;
public class MatteryScreen<T extends MatteryMenu> extends AbstractContainerScreen<T> {
protected static final ResourceLocation CONTAINER_BASE = new ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/mattery_machine_base.png");
protected ResourceLocation CONTAINER_BACKGROUND() {
return CONTAINER_BASE;
}
public MatteryScreen(T p_97741_, Inventory p_97742_, Component p_97743_) {
super(p_97741_, p_97742_, p_97743_);
imageWidth = 176;
imageHeight = 178;
titleLabelY = 4;
inventoryLabelY = imageHeight - 92;
}
protected boolean hovering_power_gauge = false;
protected List<FormattedText> getFormattedPowerLevel(Supplier<BigDecimal> s_energy, Supplier<BigDecimal> s_max_energy) {
BigDecimal energy = s_energy.get();
BigDecimal max_energy = s_max_energy.get();
float level;
if (max_energy.compareTo(BigDecimal.ZERO) == 0) {
level = 0f;
} else {
level = energy.divide(max_energy, MatteryCapability.ROUND_RULES).floatValue();
}
return List.of(
new TranslatableComponent("otm.gui.power.percentage_level", String.format("%.2f", level * 100d)),
FormattingHelper.formatPowerLevel(energy, max_energy)
);
}
protected boolean renderPowerGauge(PoseStack pose, int x, int y, int mouseX, int mouseY, Supplier<BigDecimal> s_energy, Supplier<BigDecimal> s_max_energy) {
BigDecimal energy = s_energy.get();
BigDecimal max_energy = s_max_energy.get();
int i = (width - imageWidth) / 2;
int j = (height - imageHeight) / 2;
float level;
if (max_energy.compareTo(BigDecimal.ZERO) == 0) {
level = 0f;
} else {
level = energy.divide(max_energy, MatteryCapability.ROUND_RULES).floatValue();
if (level >= 0.98)
level = 1f;
}
if (level > 0.01) {
RenderSystem.setShader(GameRenderer::getPositionTexShader);
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
RenderSystem.setShaderTexture(0, CONTAINER_BASE);
int intHeight = (int) Math.floor(level * 46d + 0.5d);
this.blit(pose, i + x, j + y + 46 - intHeight, 176, 0, 7, intHeight);
}
x += leftPos;
y += topPos;
hovering_power_gauge = x <= mouseX && x + 7 >= mouseX && y <= mouseY && y + 46 >= mouseY;
return hovering_power_gauge;
}
@Override
public void render(PoseStack p_98418_, int mouseX, int mouseY, float p_98421_) {
this.renderBackground(p_98418_);
super.render(p_98418_, mouseX, mouseY, p_98421_);
this.renderTooltip(p_98418_, mouseX, mouseY);
}
@Override
protected void renderBg(PoseStack pose, float p_97788_, int mouseX, int mouseY) {
RenderSystem.setShader(GameRenderer::getPositionTexShader);
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
RenderSystem.setShaderTexture(0, CONTAINER_BACKGROUND());
int i = (width - imageWidth) / 2;
int j = (height - imageHeight) / 2;
// PoseStack, x, y, image_start_x, image_start_y, rect_size_x, rect_size_y
this.blit(pose, i, j, 0, 0, this.imageWidth, this.imageHeight);
}
}

View File

@ -1,60 +1,20 @@
package ru.dbotthepony.mc.otm.screen;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.FormattedText;
import net.minecraft.network.chat.TextComponent;
import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.player.Inventory;
import ru.dbotthepony.mc.otm.OverdriveThatMatters;
import ru.dbotthepony.mc.otm.capability.MatteryCapability;
import ru.dbotthepony.mc.otm.menu.FormattingHelper;
import ru.dbotthepony.mc.otm.menu.PoweredMachineMenu;
import ru.dbotthepony.mc.otm.menu.PoweredMatteryMenu;
import java.math.BigDecimal;
import java.util.List;
public class PoweredMachineScreen<T extends PoweredMachineMenu> extends AbstractContainerScreen<T> {
private static final ResourceLocation CONTAINER_BACKGROUND = new ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/mattery_machine_base.png");
public class PoweredMachineScreen<T extends PoweredMatteryMenu> extends MatteryScreen<T> {
protected boolean auto_draw_gauge = true;
protected int power_gauge_x = 13;
protected int power_gauge_y = 15;
protected ResourceLocation CONTAINER_BACKGROUND() {
return CONTAINER_BACKGROUND;
}
public PoweredMachineScreen(T p_97741_, Inventory p_97742_, Component p_97743_) {
super(p_97741_, p_97742_, p_97743_);
imageWidth = 176;
imageHeight = 178;
titleLabelY = 4;
inventoryLabelY = imageHeight - 92;
}
protected List<FormattedText> getFormattedPowerLevel() {
BigDecimal energy = menu.energy.getDecimal();
BigDecimal max_energy = menu.max_energy.getDecimal();
float level;
if (max_energy.equals(BigDecimal.ZERO)) {
level = 0f;
} else {
level = energy.divide(max_energy, MatteryCapability.ROUND_RULES).floatValue();
}
return List.of(
new TranslatableComponent("otm.gui.power.percentage_level", String.format("%.2f", level * 100d)),
FormattingHelper.formatPowerLevel(energy, max_energy)
);
}
@Override
@ -66,57 +26,17 @@ public class PoweredMachineScreen<T extends PoweredMachineMenu> extends Abstract
}
}
@Override
public void render(PoseStack p_98418_, int mouseX, int mouseY, float p_98421_) {
this.renderBackground(p_98418_);
super.render(p_98418_, mouseX, mouseY, p_98421_);
this.renderTooltip(p_98418_, mouseX, mouseY);
protected List<FormattedText> getFormattedPowerLevel() {
return getFormattedPowerLevel(() -> menu.energy.getDecimal(), () -> menu.max_energy.getDecimal());
}
protected boolean hovering_power_gauge = false;
protected void renderPowerGauge(PoseStack pose, int x, int y, int mouseX, int mouseY) {
BigDecimal energy = menu.energy.getDecimal();
BigDecimal max_energy = menu.max_energy.getDecimal();
int i = (width - imageWidth) / 2;
int j = (height - imageHeight) / 2;
float level;
if (max_energy.equals(BigDecimal.ZERO)) {
level = 0f;
} else {
level = energy.divide(max_energy, MatteryCapability.ROUND_RULES).floatValue();
if (level >= 0.98)
level = 1f;
}
if (level > 0.01) {
RenderSystem.setShader(GameRenderer::getPositionTexShader);
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
RenderSystem.setShaderTexture(0, CONTAINER_BACKGROUND);
int intHeight = (int) Math.floor(level * 46d + 0.5d);
this.blit(pose, i + 13, j + 15 + 46 - intHeight, 176, 0, 7, intHeight);
}
x += leftPos;
y += topPos;
hovering_power_gauge = x <= mouseX && x + 7 >= mouseX && y <= mouseY && y + 46 >= mouseY;
renderPowerGauge(pose, x, y, mouseX, mouseY, () -> menu.energy.getDecimal(), () -> menu.max_energy.getDecimal());
}
@Override
protected void renderBg(PoseStack pose, float p_97788_, int mouseX, int mouseY) {
RenderSystem.setShader(GameRenderer::getPositionTexShader);
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
RenderSystem.setShaderTexture(0, CONTAINER_BACKGROUND());
int i = (width - imageWidth) / 2;
int j = (height - imageHeight) / 2;
// PoseStack, x, y, image_start_x, image_start_y, rect_size_x, rect_size_y
this.blit(pose, i, j, 0, 0, this.imageWidth, this.imageHeight);
super.renderBg(pose, p_97788_, mouseX, mouseY);
if (auto_draw_gauge)
renderPowerGauge(pose, power_gauge_x, power_gauge_y, mouseX, mouseY);

View File

@ -33,7 +33,11 @@
"otm.suffix.yocto": "%s y%s",
"container.otm.android_station": "Android station",
"container.otm.battery_bank": "Battery bank",
"block.overdrive_that_matters.android_station": "Android station",
"block.overdrive_that_matters.battery_bank": "Battery bank",
"item.overdrive_that_matters.pill_android": "Android pill",
"item.overdrive_that_matters.pill_humane": "Humane pill",

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -1,6 +1,7 @@
{
"replace": false,
"values": [
"overdrive_that_matters:android_station"
"overdrive_that_matters:android_station",
"overdrive_that_matters:battery_bank"
]
}

View File

@ -0,0 +1,37 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"bonus_rolls": 0.0,
"entries": [
{
"type": "minecraft:item",
"functions": [
{
"function": "minecraft:copy_name",
"source": "block_entity"
},
{
"function": "minecraft:copy_nbt",
"source": "block_entity",
"ops": [
{
"source": "battery_bank",
"target": "BlockEntityTag.battery_bank",
"op": "replace"
},
{
"source": "Name",
"target": "BlockEntityTag.Name",
"op": "replace"
}
]
}
],
"name": "overdrive_that_matters:battery_bank"
}
]
}
]
}