diff options
Diffstat (limited to 'src/main/java/gregtech/common/fluid')
-rw-r--r-- | src/main/java/gregtech/common/fluid/GT_Fluid.java | 209 | ||||
-rw-r--r-- | src/main/java/gregtech/common/fluid/GT_FluidBuilder.java | 146 |
2 files changed, 355 insertions, 0 deletions
diff --git a/src/main/java/gregtech/common/fluid/GT_Fluid.java b/src/main/java/gregtech/common/fluid/GT_Fluid.java new file mode 100644 index 0000000000..6ba8d7d23a --- /dev/null +++ b/src/main/java/gregtech/common/fluid/GT_Fluid.java @@ -0,0 +1,209 @@ +package gregtech.common.fluid; + +import static gregtech.api.recipe.RecipeMaps.fluidCannerRecipes; + +import javax.annotation.Nonnull; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidContainerRegistry; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; + +import gregtech.api.GregTech_API; +import gregtech.api.enums.FluidState; +import gregtech.api.enums.GT_Values; +import gregtech.api.enums.Materials; +import gregtech.api.interfaces.fluid.IGT_Fluid; +import gregtech.api.interfaces.fluid.IGT_RegisteredFluid; +import gregtech.api.util.GT_LanguageManager; +import gregtech.api.util.GT_Utility; + +public class GT_Fluid extends Fluid implements IGT_Fluid, IGT_RegisteredFluid, Runnable { + + private final String localizedName; + private final ResourceLocation stillIconResourceLocation; + private final ResourceLocation flowingIconResourceLocation; + private final short[] colorRGBA; + private final FluidState fluidState; + private final Fluid iconsFrom; + private Fluid registeredFluid; + + /** + * Constructs this {@link IGT_Fluid} implementation from an {@link GT_FluidBuilder} instance + * + * @param builder The {@link GT_FluidBuilder} instance to construct this {@link IGT_Fluid} implementation + */ + protected GT_Fluid(@Nonnull final GT_FluidBuilder builder) { + super(builder.fluidName); + this.localizedName = builder.localizedName; + this.stillIconResourceLocation = builder.stillIconResourceLocation; + this.flowingIconResourceLocation = builder.flowingIconResourceLocation; + this.iconsFrom = builder.iconsFrom; + this.block = builder.fluidBlock; + this.colorRGBA = builder.colorRGBA; + this.fluidState = builder.fluidState; + this.temperature = builder.temperature; + configureFromStateTemperature(); + } + + /** + * Adjusts this {@link Fluid}'s settings based on this {@link IGT_Fluid}'s state + */ + protected void configureFromStateTemperature() { + switch (fluidState) { + case SLURRY: + setGaseous(false).setViscosity(10000); + break; + case GAS: + setGaseous(true).setDensity(-100) + .setViscosity(200); + break; + case PLASMA: + setGaseous(true).setDensity(55536) + .setViscosity(10) + .setLuminosity(15); + break; + case MOLTEN: + final int luminosity; + if (temperature >= 3500) { + luminosity = 15; + } else { + luminosity = temperature < 1000 ? 0 : 14 * (temperature - 1000) / 2500 + 1; + } + setLuminosity(luminosity); + case LIQUID: + default: + setGaseous(false).setViscosity(1000); + break; + } + } + + // ----- Fluid implementations ----- + + /** + * @inheritDoc + */ + @Override + public int getColor() { + return (Math.max(0, Math.min(255, colorRGBA[0])) << 16) | (Math.max(0, Math.min(255, colorRGBA[1])) << 8) + | Math.max(0, Math.min(255, colorRGBA[2])); + } + + // ----- IGT_Fluid interface implementations ----- + + public IGT_RegisteredFluid addFluid() { + if (FluidRegistry.registerFluid(GT_Fluid.this)) { + // Registered as a new Fluid + registeredFluid = this; + // Adds a server-side localized-name + GT_LanguageManager.addStringLocalization(getUnlocalizedName(), localizedName); + } else { + // Fluid already registered, get it from the registry + registeredFluid = FluidRegistry.getFluid(GT_Fluid.this.fluidName); + // Sets temperature of already registered fluids if they use the default (temperature = 300) + if (registeredFluid.getTemperature() == new Fluid("test").getTemperature()) { + registeredFluid.setTemperature(GT_Fluid.this.temperature); + } + } + // Schedules the fluid for the block icons loader run() tasks + GregTech_API.sGTBlockIconload.add(this); + return this; + } + + // ----- IGT_RegisteredFluid interface implementations ----- + + /** + * @inheritDoc + */ + @Override + public IGT_RegisteredFluid registerContainers(final ItemStack fullContainer, final ItemStack emptyContainer, + final int containerSize) { + if (fullContainer != null && emptyContainer != null) { + final FluidStack fluidStack = new FluidStack(registeredFluid, containerSize); + if (!FluidContainerRegistry.registerFluidContainer(fluidStack, fullContainer, emptyContainer)) { + GT_Values.RA.stdBuilder() + .itemInputs(fullContainer) + .itemOutputs(GT_Utility.getContainerItem(fullContainer, false)) + .fluidOutputs(fluidStack) + .duration(fluidStack.amount / 62) + .eut(1) + .addTo(fluidCannerRecipes); + } + } + return this; + } + + /** + * @inheritDoc + */ + @Override + public IGT_RegisteredFluid registerBContainers(final ItemStack fullContainer, final ItemStack emptyContainer) { + return registerContainers(fullContainer, emptyContainer, 1000); + } + + /** + * @inheritDoc + */ + @Override + public IGT_RegisteredFluid registerPContainers(final ItemStack fullContainer, final ItemStack emptyContainer) { + return registerContainers(fullContainer, emptyContainer, 250); + } + + /** + * @inheritDoc + */ + @Override + public IGT_RegisteredFluid configureMaterials(final Materials material) { + if (material != null) { + switch (fluidState) { + case SLURRY -> material.mSolid = registeredFluid; + case GAS -> material.mGas = registeredFluid; + case PLASMA -> material.mPlasma = registeredFluid; + case MOLTEN -> material.mStandardMoltenFluid = registeredFluid; + default -> material.mFluid = registeredFluid; + } + Materials.FLUID_MAP.put(registeredFluid, material); + } + return this; + } + + /** + * @inheritDoc + */ + @Override + public Fluid asFluid() { + return registeredFluid; + } + + // ----- Runnable interface implementations ----- + + /** + * This {@link Runnable#run()} implementation is scheduled within the {@link GregTech_API#sGTBlockIconload} to load + * this {@link IGT_Fluid}'s texture icons. + * + * @see Runnable#run() + */ + @Override + public void run() { + if (iconsFrom instanceof GT_Fluid) { + // Needs the GT_Fluid to have registered its icons + ((GT_Fluid) iconsFrom).run(); + stillIcon = iconsFrom.getStillIcon(); + flowingIcon = iconsFrom.getFlowingIcon(); + } else { + if (stillIconResourceLocation != null) { + stillIcon = GregTech_API.sBlockIcons.registerIcon(stillIconResourceLocation.toString()); + } + if (flowingIconResourceLocation != null) { + flowingIcon = GregTech_API.sBlockIcons.registerIcon(flowingIconResourceLocation.toString()); + } + } + } + + @Override + public String toString() { + return "GT_Fluid{" + "fluidName='" + fluidName + '\'' + '}'; + } +} diff --git a/src/main/java/gregtech/common/fluid/GT_FluidBuilder.java b/src/main/java/gregtech/common/fluid/GT_FluidBuilder.java new file mode 100644 index 0000000000..9a18b8d812 --- /dev/null +++ b/src/main/java/gregtech/common/fluid/GT_FluidBuilder.java @@ -0,0 +1,146 @@ +package gregtech.common.fluid; + +import static gregtech.api.enums.Mods.GregTech; + +import java.util.Locale; + +import javax.annotation.Nonnull; + +import net.minecraft.block.Block; +import net.minecraft.util.IIcon; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fluids.Fluid; + +import gregtech.api.enums.Dyes; +import gregtech.api.enums.FluidState; +import gregtech.api.interfaces.fluid.IGT_Fluid; +import gregtech.api.interfaces.fluid.IGT_FluidBuilder; +import gregtech.api.interfaces.fluid.IGT_RegisteredFluid; + +public class GT_FluidBuilder implements IGT_FluidBuilder { + + final String fluidName; + String localizedName; + ResourceLocation stillIconResourceLocation = null, flowingIconResourceLocation = null; + short[] colorRGBA = Dyes._NULL.getRGBA(); + Block fluidBlock = null; + FluidState fluidState; + int temperature; + IIcon stillIcon; + IIcon flowingIcon; + Fluid iconsFrom; + + public GT_FluidBuilder(final String fluidName) { + this.fluidName = fluidName.toLowerCase(Locale.ENGLISH); + } + + /** + * @inheritDoc + */ + @Override + public IGT_FluidBuilder withColorRGBA(final short[] colorRGBA) { + this.colorRGBA = colorRGBA; + return this; + } + + /** + * @inheritDoc + */ + @Override + public IGT_FluidBuilder withLocalizedName(final String localizedName) { + this.localizedName = localizedName; + return this; + } + + /** + * @inheritDoc + */ + @Override + public IGT_FluidBuilder withStateAndTemperature(final FluidState fluidState, final int temperature) { + this.fluidState = fluidState; + this.temperature = temperature; + return this; + } + + /** + * @inheritDoc + */ + @Override + public IGT_FluidBuilder withStillIconResourceLocation(final ResourceLocation stillIconResourceLocation) { + this.stillIconResourceLocation = stillIconResourceLocation; + return this; + } + + /** + * @inheritDoc + */ + @Override + public IGT_FluidBuilder withFlowingIconResourceLocation(final ResourceLocation flowingIconResourceLocation) { + this.flowingIconResourceLocation = flowingIconResourceLocation; + return this; + } + + /** + * @inheritDoc + */ + @Override + public IGT_FluidBuilder withTextureName(final String textureName) { + this.stillIconResourceLocation = new ResourceLocation(GregTech.ID, "fluids/fluid." + textureName); + this.flowingIconResourceLocation = null; + return this; + } + + /** + * @inheritDoc + */ + @Override + public IGT_FluidBuilder withIconsFrom(@Nonnull final Fluid fromFluid) { + this.iconsFrom = fromFluid; + return this; + } + + /** + * @inheritDoc + */ + @Override + public IGT_FluidBuilder withFluidBlock(final Block fluidBlock) { + this.fluidBlock = fluidBlock; + return this; + } + + /** + * @inheritDoc + */ + @Override + public IGT_FluidBuilder withTextures(final ResourceLocation stillIconResourceLocation, + final ResourceLocation flowingIconResourceLocation) { + this.stillIconResourceLocation = stillIconResourceLocation; + this.flowingIconResourceLocation = flowingIconResourceLocation; + return this; + } + + /** + * @inheritDoc + */ + @Override + public IGT_Fluid build() { + if (colorRGBA == null) { + colorRGBA = Dyes._NULL.getRGBA(); + } + if (stillIconResourceLocation == null) { + withTextureName(fluidName.toLowerCase(Locale.ENGLISH)); + } + if (localizedName == null) { + localizedName = fluidName; + } + return new GT_Fluid(this); + } + + /** + * @inheritDoc + */ + @Override + public IGT_RegisteredFluid buildAndRegister() { + return build().addFluid(); + } +} |