Fluid Overlays and Comparator Compat

-Add comparator compat to fluid tanks, spouts, and item drains.
-Add goggle overlays to fluid tanks, spouts, item drains, and basins.
-Update goggle item tooltip slightly.
This commit is contained in:
_0Steven 2021-02-27 17:08:35 +01:00
parent da09112e3c
commit 8e5b5582f3
9 changed files with 377 additions and 11 deletions

View file

@ -836,6 +836,15 @@
"create.gui.stressometer.capacity": "Remaining Capacity", "create.gui.stressometer.capacity": "Remaining Capacity",
"create.gui.stressometer.overstressed": "Overstressed", "create.gui.stressometer.overstressed": "Overstressed",
"create.gui.stressometer.no_rotation": "No Rotation", "create.gui.stressometer.no_rotation": "No Rotation",
"create.gui.stores_fluid.title": "Fluid Contained",
"create.gui.stores_fluid.effectsTitle": "Potion Effects",
"create.gui.stores_fluid.empty": "Empty",
"create.gui.input_tanks.title": "Input Tanks",
"create.gui.output_tanks.title": "Output Tanks",
"create.gui.tank.info_header": "Tank Information:",
"create.gui.spout.info_header": "Spout Information:",
"create.gui.drain.info_header": "Drain Information:",
"create.gui.basin.info_header": "Basin Information:",
"create.gui.contraptions.not_fast_enough": "It appears that this %1$s is _not_ rotating with _enough_ _speed_.", "create.gui.contraptions.not_fast_enough": "It appears that this %1$s is _not_ rotating with _enough_ _speed_.",
"create.gui.contraptions.network_overstressed": "It appears that this contraption is _overstressed_. Add more sources or _slow_ _down_ the components with a high _stress_ _impact_.", "create.gui.contraptions.network_overstressed": "It appears that this contraption is _overstressed_. Add more sources or _slow_ _down_ the components with a high _stress_ _impact_.",
"create.gui.adjustable_crate.title": "Adjustable Crate", "create.gui.adjustable_crate.title": "Adjustable Crate",
@ -1064,6 +1073,10 @@
"create.tooltip.stressImpact.medium": "Moderate", "create.tooltip.stressImpact.medium": "Moderate",
"create.tooltip.stressImpact.high": "High", "create.tooltip.stressImpact.high": "High",
"create.tooltip.stressImpact.overstressed": "Overstressed", "create.tooltip.stressImpact.overstressed": "Overstressed",
"create.tooltip.fluidFullness.low": "Low",
"create.tooltip.fluidFullness.medium": "Moderate",
"create.tooltip.fluidFullness.high": "High",
"create.tooltip.fluidFullness.full": "Full",
"create.tooltip.capacityProvided": "Stress Capacity: %1$s", "create.tooltip.capacityProvided": "Stress Capacity: %1$s",
"create.tooltip.capacityProvided.low": "Small", "create.tooltip.capacityProvided.low": "Small",
"create.tooltip.capacityProvided.medium": "Medium", "create.tooltip.capacityProvided.medium": "Medium",
@ -1446,6 +1459,8 @@
"item.create.goggles.tooltip.behaviour1": "Shows _colored indicators_ corresponding to the _Speed Level_ of a placed kinetic component as well as _Stress Impact_ and _Capacity_ of individual components.", "item.create.goggles.tooltip.behaviour1": "Shows _colored indicators_ corresponding to the _Speed Level_ of a placed kinetic component as well as _Stress Impact_ and _Capacity_ of individual components.",
"item.create.goggles.tooltip.condition2": "When looking at gauge", "item.create.goggles.tooltip.condition2": "When looking at gauge",
"item.create.goggles.tooltip.behaviour2": "Shows detailed information about _Speed_ or _Stress_ of the network to which the gauge is connected.", "item.create.goggles.tooltip.behaviour2": "Shows detailed information about _Speed_ or _Stress_ of the network to which the gauge is connected.",
"item.create.goggles.tooltip.condition3": "When looking at fluid containers",
"item.create.goggles.tooltip.behaviour3": "Shows detailed information about the _Capacity_ of the block and any _Fluids_ stored within.",
"item.create.wrench.tooltip": "WRENCH", "item.create.wrench.tooltip": "WRENCH",
"item.create.wrench.tooltip.summary": "A useful tool for working on kinetic contraptions. Can be used to _Rotate_, _Dismantle_ and to _Configure_ components.", "item.create.wrench.tooltip.summary": "A useful tool for working on kinetic contraptions. Can be used to _Rotate_, _Dismantle_ and to _Configure_ components.",

View file

@ -0,0 +1,73 @@
package com.simibubi.create.content.contraptions.fluids;
import com.simibubi.create.AllFluids;
import com.simibubi.create.content.contraptions.fluids.potion.PotionFluidHandler;
import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation;
import com.simibubi.create.foundation.item.ItemDescription;
import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.util.text.TextFormatting;
import net.minecraftforge.fluids.FluidStack;
//Currently only used for Tank/Drain/Spout/Basin goggle tooltips, as fullness-based replacement for the stress-based tooltips in IRotate
public enum FluidFullnessOverlay {
LOW,
MEDIUM,
HIGH,
FULL;
public TextFormatting getAbsoluteColor() {
return this == LOW ? TextFormatting.YELLOW : this == MEDIUM ? TextFormatting.GOLD : TextFormatting.RED;
}
public TextFormatting getRelativeColor() {
return this == LOW ? TextFormatting.GREEN : this == MEDIUM ? TextFormatting.YELLOW : this == HIGH ? TextFormatting.GOLD : TextFormatting.RED;
}
public static FluidFullnessOverlay of(double fullnessPercent){
if (fullnessPercent >= 1) return FluidFullnessOverlay.FULL;
else if (fullnessPercent > .75d) return FluidFullnessOverlay.HIGH;
else if (fullnessPercent > .5d) return FluidFullnessOverlay.MEDIUM;
else return FluidFullnessOverlay.LOW;
}
public static String getFormattedFullnessText(double fullnessPercent){
FluidFullnessOverlay fullnessLevel = of(fullnessPercent);
TextFormatting color = fullnessLevel.getRelativeColor();
if (fullnessPercent == 0)
return TextFormatting.DARK_GRAY + ItemDescription.makeProgressBar(3, -1)
+ Lang.translate("gui.stores_fluid.empty");
String level = color + ItemDescription.makeProgressBar(3, Math.min(fullnessLevel.ordinal(), 2));
level += Lang.translate("tooltip.fluidFullness."+Lang.asId(fullnessLevel.name()));
level += String.format(" (%s%%) ", (int) (fullnessPercent * 100));
return level;
}
public static String getFormattedCapacityText(int amount, int capacity){
FluidFullnessOverlay fullnessLevel = of((double) amount / capacity);
TextFormatting color = fullnessLevel.getRelativeColor();
String mb = Lang.translate("generic.unit.millibuckets");
String capacityString = color + "%s" + mb + TextFormatting.GRAY + " / " + TextFormatting.DARK_GRAY + "%s" + mb;
if (amount == 0)
return TextFormatting.DARK_GRAY + IHaveGoggleInformation.format(capacity) + mb;
return String.format(capacityString, IHaveGoggleInformation.format(amount), IHaveGoggleInformation.format(capacity));
}
public static String getFormattedFluidTypeText(FluidStack fluid, double fullnessPercent){
FluidFullnessOverlay fullnessLevel = of(fullnessPercent);
TextFormatting color = fullnessLevel.getRelativeColor();
if (AllFluids.POTION.get().getFluid().isEquivalentTo(fluid.getFluid())) {
return color + PotionFluidHandler.getPotionName(fluid).getFormattedText();
} else {
return color + fluid.getDisplayName().getFormattedText();
}
}
}

View file

@ -99,4 +99,19 @@ public class ItemDrainBlock extends Block implements IWrenchable, ITE<ItemDrainT
return ItemDrainTileEntity.class; return ItemDrainTileEntity.class;
} }
@Override
public boolean hasComparatorInputOverride(BlockState state) {
return true;
}
@Override
public int getComparatorInputOverride(BlockState blockState, World worldIn, BlockPos pos) {
TileEntity te = worldIn.getTileEntity(pos);
if (te == null)
return 0;
if (te instanceof ItemDrainTileEntity)
return ((ItemDrainTileEntity) te).getComparatorOutput();
return 0;
}
} }

View file

@ -1,9 +1,15 @@
package com.simibubi.create.content.contraptions.fluids.actors; package com.simibubi.create.content.contraptions.fluids.actors;
import java.util.ArrayList;
import java.util.IdentityHashMap; import java.util.IdentityHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
import com.simibubi.create.AllFluids;
import com.simibubi.create.content.contraptions.fluids.FluidFullnessOverlay;
import com.simibubi.create.content.contraptions.fluids.potion.PotionFluidHandler;
import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation;
import com.simibubi.create.content.contraptions.processing.EmptyingByBasin; import com.simibubi.create.content.contraptions.processing.EmptyingByBasin;
import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack;
import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.advancement.AllTriggers;
@ -12,6 +18,7 @@ import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour;
import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.Pair; import com.simibubi.create.foundation.utility.Pair;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
@ -22,20 +29,24 @@ import net.minecraft.nbt.CompoundNBT;
import net.minecraft.tileentity.TileEntityType; import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TextFormatting;
import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction;
import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemHandlerHelper;
public class ItemDrainTileEntity extends SmartTileEntity { public class ItemDrainTileEntity extends SmartTileEntity implements IHaveGoggleInformation {
public static final int FILLING_TIME = 20; public static final int FILLING_TIME = 20;
SmartFluidTankBehaviour internalTank; SmartFluidTankBehaviour internalTank;
TransportedItemStack heldItem; TransportedItemStack heldItem;
protected int processingTicks; protected int processingTicks;
protected int lastRedstoneLevel;
Map<Direction, LazyOptional<ItemDrainItemHandler>> itemHandlers; Map<Direction, LazyOptional<ItemDrainItemHandler>> itemHandlers;
public ItemDrainTileEntity(TileEntityType<?> tileEntityTypeIn) { public ItemDrainTileEntity(TileEntityType<?> tileEntityTypeIn) {
@ -90,6 +101,13 @@ public class ItemDrainTileEntity extends SmartTileEntity {
@Override @Override
public void tick() { public void tick() {
super.tick(); super.tick();
if (lastRedstoneLevel != getComparatorOutput()) {
lastRedstoneLevel = getComparatorOutput();
if (world != null)
world.updateComparatorOutputLevel(getPos(), getBlockState().getBlock());
}
if (heldItem == null) { if (heldItem == null) {
processingTicks = 0; processingTicks = 0;
return; return;
@ -278,4 +296,43 @@ public class ItemDrainTileEntity extends SmartTileEntity {
return super.getCapability(cap, side); return super.getCapability(cap, side);
} }
public int getComparatorOutput() {
ItemDrainTileEntity te = this;
double fillFraction = (double) te.internalTank.getPrimaryHandler().getFluidAmount() / te.internalTank.getPrimaryHandler().getCapacity();
return MathHelper.floor(MathHelper.clamp(fillFraction * 14 + (fillFraction > 0 ? 1 : 0), 0, 15));
}
@Override
public boolean addToGoggleTooltip(List<String> tooltip, boolean isPlayerSneaking) {
ItemDrainTileEntity te = this;
int fluidAmount = te.internalTank.getPrimaryHandler().getFluidAmount();
int fluidCapacity = te.internalTank.getPrimaryHandler().getCapacity();
double fillFraction = (double) fluidAmount / fluidCapacity;
FluidStack fluidType = te.internalTank.getPrimaryHandler().getFluid();
tooltip.add(spacing + Lang.translate("gui.drain.info_header"));
if (isPlayerSneaking && AllFluids.POTION.get().getFluid().isEquivalentTo(fluidType.getFluid())) {
tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("gui.stores_fluid.effectsTitle"));
ArrayList<ITextComponent> potionTooltip = new ArrayList<>();
PotionFluidHandler.addPotionTooltip(fluidType, potionTooltip, 1);
tooltip.addAll(2, potionTooltip.stream()
.map(c -> spacing + " " + c.getFormattedText())
.collect(Collectors.toList()));
return true;
}
tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("gui.stores_fluid.title"));
if (fluidAmount != 0)
tooltip.add(spacing + " " + FluidFullnessOverlay.getFormattedFluidTypeText(fluidType, fillFraction));
tooltip.add(spacing + FluidFullnessOverlay.getFormattedFullnessText(fillFraction));
tooltip.add(spacing + " " + FluidFullnessOverlay.getFormattedCapacityText(fluidAmount, fluidCapacity));
return true;
}
} }

View file

@ -11,6 +11,7 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.world.IBlockReader; import net.minecraft.world.IBlockReader;
import net.minecraft.world.World;
public class SpoutBlock extends Block implements IWrenchable { public class SpoutBlock extends Block implements IWrenchable {
@ -34,4 +35,19 @@ public class SpoutBlock extends Block implements IWrenchable {
return AllTileEntities.SPOUT.create(); return AllTileEntities.SPOUT.create();
} }
@Override
public boolean hasComparatorInputOverride(BlockState state) {
return true;
}
@Override
public int getComparatorInputOverride(BlockState blockState, World worldIn, BlockPos pos) {
TileEntity te = worldIn.getTileEntity(pos);
if (te == null)
return 0;
if (te instanceof SpoutTileEntity)
return ((SpoutTileEntity) te).getComparatorOutput();
return 0;
}
} }

View file

@ -5,8 +5,13 @@ import static com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProce
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
import com.simibubi.create.AllFluids;
import com.simibubi.create.content.contraptions.fluids.FluidFullnessOverlay;
import com.simibubi.create.content.contraptions.fluids.FluidFX; import com.simibubi.create.content.contraptions.fluids.FluidFX;
import com.simibubi.create.content.contraptions.fluids.potion.PotionFluidHandler;
import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation;
import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack;
import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.advancement.AllTriggers;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
@ -16,6 +21,7 @@ import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBe
import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult;
import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
@ -26,7 +32,10 @@ import net.minecraft.potion.PotionUtils;
import net.minecraft.tileentity.TileEntityType; import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TextFormatting;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.Capability;
@ -34,13 +43,14 @@ import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
public class SpoutTileEntity extends SmartTileEntity { public class SpoutTileEntity extends SmartTileEntity implements IHaveGoggleInformation {
public static final int FILLING_TIME = 20; public static final int FILLING_TIME = 20;
protected BeltProcessingBehaviour beltProcessing; protected BeltProcessingBehaviour beltProcessing;
protected int processingTicks; protected int processingTicks;
protected boolean sendSplash; protected boolean sendSplash;
protected int lastRedstoneLevel;
SmartFluidTankBehaviour tank; SmartFluidTankBehaviour tank;
@ -168,6 +178,12 @@ public class SpoutTileEntity extends SmartTileEntity {
if (processingTicks >= 8 && world.isRemote) if (processingTicks >= 8 && world.isRemote)
spawnProcessingParticles(tank.getPrimaryTank() spawnProcessingParticles(tank.getPrimaryTank()
.getRenderedFluid()); .getRenderedFluid());
if (lastRedstoneLevel != getComparatorOutput()) {
lastRedstoneLevel = getComparatorOutput();
if (world != null)
world.updateComparatorOutputLevel(getPos(), getBlockState().getBlock());
}
} }
protected void spawnProcessingParticles(FluidStack fluid) { protected void spawnProcessingParticles(FluidStack fluid) {
@ -190,4 +206,43 @@ public class SpoutTileEntity extends SmartTileEntity {
} }
} }
public int getComparatorOutput() {
SpoutTileEntity te = this;
double fillFraction = (double) te.getCurrentFluidInTank().getAmount() / te.tank.getPrimaryHandler().getCapacity();
return MathHelper.floor(MathHelper.clamp(fillFraction * 14 + (fillFraction > 0 ? 1 : 0), 0, 15));
}
@Override
public boolean addToGoggleTooltip(List<String> tooltip, boolean isPlayerSneaking) {
SpoutTileEntity te = this;
int fluidAmount = te.tank.getPrimaryHandler().getFluidAmount();
int fluidCapacity = te.tank.getPrimaryHandler().getCapacity();
double fillFraction = (double) fluidAmount / fluidCapacity;
FluidStack fluidType = te.tank.getPrimaryHandler().getFluid();
tooltip.add(spacing + Lang.translate("gui.spout.info_header"));
if (isPlayerSneaking && AllFluids.POTION.get().getFluid().isEquivalentTo(fluidType.getFluid())) {
tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("gui.stores_fluid.effectsTitle"));
ArrayList<ITextComponent> potionTooltip = new ArrayList<>();
PotionFluidHandler.addPotionTooltip(fluidType, potionTooltip, 1);
tooltip.addAll(2, potionTooltip.stream()
.map(c -> spacing + " " + c.getFormattedText())
.collect(Collectors.toList()));
return true;
}
tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("gui.stores_fluid.title"));
if (fluidAmount != 0)
tooltip.add(spacing + " " + FluidFullnessOverlay.getFormattedFluidTypeText(fluidType, fillFraction));
tooltip.add(spacing + FluidFullnessOverlay.getFormattedFullnessText(fillFraction));
tooltip.add(spacing + " " + FluidFullnessOverlay.getFormattedCapacityText(fluidAmount, fluidCapacity));
return true;
}
} }

View file

@ -310,4 +310,22 @@ public class FluidTankBlock extends Block implements IWrenchable, ITE<FluidTankT
return SILENCED_METAL; return SILENCED_METAL;
return soundType; return soundType;
} }
@Override
public boolean hasComparatorInputOverride(BlockState state) {
return true;
}
@Override
public int getComparatorInputOverride(BlockState blockState, World worldIn, BlockPos pos) {
TileEntity te = worldIn.getTileEntity(pos);
if (te instanceof FluidTankTileEntity) {
FluidTankTileEntity fluidTankTileEntity = ((FluidTankTileEntity) te).getControllerTE();
if (fluidTankTileEntity == null)
return 0;
return fluidTankTileEntity.getComparatorOutput();
}
return 0;
}
} }

View file

@ -2,17 +2,24 @@ package com.simibubi.create.content.contraptions.fluids.tank;
import static java.lang.Math.abs; import static java.lang.Math.abs;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import com.simibubi.create.AllFluids;
import com.simibubi.create.content.contraptions.fluids.FluidFullnessOverlay;
import com.simibubi.create.content.contraptions.fluids.potion.PotionFluidHandler;
import com.simibubi.create.content.contraptions.fluids.tank.FluidTankBlock.Shape; import com.simibubi.create.content.contraptions.fluids.tank.FluidTankBlock.Shape;
import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation;
import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.fluid.SmartFluidTank; import com.simibubi.create.foundation.fluid.SmartFluidTank;
import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue; import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompoundNBT;
@ -22,6 +29,9 @@ import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TextFormatting;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.Capability;
@ -34,7 +44,7 @@ import net.minecraftforge.fluids.capability.IFluidHandler;
import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction;
import net.minecraftforge.fluids.capability.templates.FluidTank; import net.minecraftforge.fluids.capability.templates.FluidTank;
public class FluidTankTileEntity extends SmartTileEntity { public class FluidTankTileEntity extends SmartTileEntity implements IHaveGoggleInformation {
private static final int MAX_SIZE = 3; private static final int MAX_SIZE = 3;
@ -48,6 +58,7 @@ public class FluidTankTileEntity extends SmartTileEntity {
protected int luminosity; protected int luminosity;
protected int width; protected int width;
protected int height; protected int height;
protected int lastRedstoneLevel;
private static final int SYNC_RATE = 8; private static final int SYNC_RATE = 8;
protected int syncCooldown; protected int syncCooldown;
@ -101,6 +112,12 @@ public class FluidTankTileEntity extends SmartTileEntity {
updateConnectivity(); updateConnectivity();
if (fluidLevel != null) if (fluidLevel != null)
fluidLevel.tick(); fluidLevel.tick();
if (lastRedstoneLevel != getComparatorOutput()) {
lastRedstoneLevel = getComparatorOutput();
if (world != null)
world.updateComparatorOutputLevel(getPos(), getBlockState().getBlock());
}
} }
public boolean isController() { public boolean isController() {
@ -312,6 +329,47 @@ public class FluidTankTileEntity extends SmartTileEntity {
return null; return null;
} }
public int getComparatorOutput() {
FluidTankTileEntity te = getControllerTE();
if (te == null)
return 0;
return MathHelper.floor(MathHelper.clamp(te.getFillState() * 14 + (te.getFillState() > 0 ? 1 : 0), 0, 15));
}
@Override
public boolean addToGoggleTooltip(List<String> tooltip, boolean isPlayerSneaking) {
FluidTankTileEntity controllerTE = getControllerTE();
if (controllerTE == null)
return false;
int fluidAmount = controllerTE.getTankInventory().getFluidAmount();
int fluidCapacity = controllerTE.getTankInventory().getCapacity();
double fillFraction = controllerTE.getFillState();
FluidStack fluidType = controllerTE.getTankInventory().getFluid();
tooltip.add(spacing + Lang.translate("gui.tank.info_header"));
if (isPlayerSneaking && AllFluids.POTION.get().getFluid().isEquivalentTo(fluidType.getFluid())) {
tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("gui.stores_fluid.effectsTitle"));
ArrayList<ITextComponent> potionTooltip = new ArrayList<>();
PotionFluidHandler.addPotionTooltip(fluidType, potionTooltip, 1);
tooltip.addAll(2, potionTooltip.stream()
.map(c -> spacing + " " + c.getFormattedText())
.collect(Collectors.toList()));
return true;
}
tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("gui.stores_fluid.title"));
if (fluidAmount != 0)
tooltip.add(spacing + " " + FluidFullnessOverlay.getFormattedFluidTypeText(fluidType, fillFraction));
tooltip.add(spacing + FluidFullnessOverlay.getFormattedFullnessText(fillFraction));
tooltip.add(spacing + " " + FluidFullnessOverlay.getFormattedCapacityText(fluidAmount, fluidCapacity));
return true;
}
@Override @Override
protected void read(CompoundNBT compound, boolean clientPacket) { protected void read(CompoundNBT compound, boolean clientPacket) {
super.read(compound, clientPacket); super.read(compound, clientPacket);

View file

@ -9,11 +9,15 @@ import java.util.Random;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import com.simibubi.create.AllFluids;
import com.simibubi.create.AllParticleTypes; import com.simibubi.create.AllParticleTypes;
import com.simibubi.create.AllTags; import com.simibubi.create.AllTags;
import com.simibubi.create.content.contraptions.fluids.FluidFullnessOverlay;
import com.simibubi.create.content.contraptions.components.mixer.MechanicalMixerTileEntity; import com.simibubi.create.content.contraptions.components.mixer.MechanicalMixerTileEntity;
import com.simibubi.create.content.contraptions.fluids.FluidFX; import com.simibubi.create.content.contraptions.fluids.FluidFX;
import com.simibubi.create.content.contraptions.fluids.particle.FluidParticleData; import com.simibubi.create.content.contraptions.fluids.particle.FluidParticleData;
import com.simibubi.create.content.contraptions.fluids.potion.PotionFluidHandler;
import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation;
import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock;
import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel;
import com.simibubi.create.foundation.fluid.CombinedTankWrapper; import com.simibubi.create.foundation.fluid.CombinedTankWrapper;
@ -25,14 +29,8 @@ import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputB
import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour.TankSegment; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour.TankSegment;
import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.*;
import com.simibubi.create.foundation.utility.Couple;
import com.simibubi.create.foundation.utility.IntAttached;
import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.LerpedFloat;
import com.simibubi.create.foundation.utility.LerpedFloat.Chaser; import com.simibubi.create.foundation.utility.LerpedFloat.Chaser;
import com.simibubi.create.foundation.utility.NBTHelper;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
@ -48,6 +46,7 @@ import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
import net.minecraft.util.text.TextFormatting;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.Capability;
@ -63,7 +62,7 @@ import net.minecraftforge.items.IItemHandlerModifiable;
import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemHandlerHelper;
import net.minecraftforge.items.wrapper.CombinedInvWrapper; import net.minecraftforge.items.wrapper.CombinedInvWrapper;
public class BasinTileEntity extends SmartTileEntity { public class BasinTileEntity extends SmartTileEntity implements IHaveGoggleInformation {
private boolean areFluidsMoving; private boolean areFluidsMoving;
LerpedFloat ingredientRotationSpeed; LerpedFloat ingredientRotationSpeed;
@ -600,6 +599,66 @@ public class BasinTileEntity extends SmartTileEntity {
return areFluidsMoving; return areFluidsMoving;
} }
@Override
public boolean addToGoggleTooltip(List<String> tooltip, boolean isPlayerSneaking) {
tooltip.add(spacing + Lang.translate("gui.basin.info_header"));
tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("gui.input_tanks.title"));
String mb = Lang.translate("generic.unit.millibuckets");
LazyOptional<IFluidHandler> capability = this.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY);
IFluidHandler tank = capability.orElse(null);
if (tank == null)
return false;
for (int i = 0; i < tank.getTanks(); i += 2) {
Couple<FluidStack> fluids = Couple.create(tank.getFluidInTank(i), tank.getFluidInTank(i + 1));
if (i > 1)
tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("gui.output_tanks.title"));
if (fluids.getFirst().getAmount() == 0 && fluids.getSecond().getAmount() == 0) {
tooltip.add(spacing + " " + TextFormatting.DARK_GRAY + "2x0" + mb);
continue;
}
for (FluidStack fluid : fluids) {
String fluidName;
if (fluid.getAmount() == 0) {
tooltip.add(spacing + " " + TextFormatting.DARK_GRAY + IHaveGoggleInformation.format(0) + mb);
} else {
if (AllFluids.POTION.get().getFluid().isEquivalentTo(fluid.getFluid())) {
fluidName = PotionFluidHandler.getPotionName(fluid).getFormattedText();
} else {
fluidName = fluid.getDisplayName().getFormattedText();
}
double fillFraction = (double) fluid.getAmount() / (double) this.inputTank.getPrimaryHandler().getCapacity();
if (fluidName.length() > 15) {
tooltip.add(spacing + " " + FluidFullnessOverlay.of(fillFraction).getRelativeColor()
+ fluidName);
tooltip.add(spacing + " " + FluidFullnessOverlay.of(fillFraction).getRelativeColor()
+ IHaveGoggleInformation.format(fluid.getAmount()) + mb);
continue;
}
tooltip.add(spacing + " " + FluidFullnessOverlay.of(fillFraction).getRelativeColor()
+ fluidName + " "
+ IHaveGoggleInformation.format(fluid.getAmount()) + mb);
}
}
}
return true;
}
class BasinValueBox extends ValueBoxTransform.Sided { class BasinValueBox extends ValueBoxTransform.Sided {
@Override @Override