Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Rewrote fluid handling to allow defaulting to other mod's fluids. Sto…
…ps fluid conflicts that are using static references - fixes #262.
  • Loading branch information
alcatrazEscapee committed Aug 8, 2019
1 parent 5fea211 commit 7e7cebc
Show file tree
Hide file tree
Showing 13 changed files with 303 additions and 211 deletions.
Expand Up @@ -57,7 +57,7 @@ public FluidStack getOutputFluid(ItemStack input)
Metal metal = metalObject.getMetal(input);
if (metal != null && metalObject.canMelt(input))
{
return new FluidStack(FluidsTFC.getMetalFluid(metal), metalObject.getSmeltAmount(input));
return new FluidStack(FluidsTFC.getFluidFromMetal(metal), metalObject.getSmeltAmount(input));
}
}
return null;
Expand Down
Expand Up @@ -14,7 +14,6 @@
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

Expand All @@ -29,15 +28,13 @@
@SideOnly(Side.CLIENT)
public class TESRCrucible extends TileEntitySpecialRenderer<TECrucible>
{

@Override
public void render(TECrucible te, double x, double y, double z, float partialTicks, int destroyStage, float alpha)
{
int amount = te.getAlloy().getAmount();
if (amount < 1) return;
Metal metal = te.getAlloyResult();
Fluid metalFluid = FluidsTFC.getMetalFluid(metal);
FluidStack moltenMetal = new FluidStack(metalFluid, amount);
Fluid metalFluid = FluidsTFC.getFluidFromMetal(metal);

GlStateManager.pushMatrix();
GlStateManager.translate(x, y, z);
Expand Down
Expand Up @@ -38,7 +38,7 @@ public BlockFluidTFC(Fluid fluid, Material material, boolean canCreateSources)
@Override
public void randomDisplayTick(IBlockState stateIn, World worldIn, BlockPos pos, Random rand)
{
if (definedFluid == FluidsTFC.HOT_WATER && rand.nextInt(4) == 0)
if (definedFluid == FluidsTFC.HOT_WATER.get() && rand.nextInt(4) == 0)
{
worldIn.spawnParticle(EnumParticleTypes.WATER_BUBBLE, (double) (pos.getX() + rand.nextFloat()), pos.getY() + 0.50D, (double) (pos.getZ() + rand.nextFloat()), 0.0D, 0.0D, 0.0D, Block.getStateId(stateIn));
}
Expand All @@ -48,7 +48,7 @@ public void randomDisplayTick(IBlockState stateIn, World worldIn, BlockPos pos,
public void onEntityCollision(World worldIn, BlockPos pos, IBlockState state, Entity entityIn)
{
super.onEntityCollision(worldIn, pos, state, entityIn);
if (definedFluid == FluidsTFC.HOT_WATER && entityIn instanceof EntityLivingBase)
if (definedFluid == FluidsTFC.HOT_WATER.get() && entityIn instanceof EntityLivingBase)
{
EntityLivingBase entityLiving = (EntityLivingBase) entityIn;
if (Constants.RNG.nextInt(10) == 0 && entityLiving.getHealth() < entityLiving.getMaxHealth())
Expand Down
38 changes: 29 additions & 9 deletions src/main/java/net/dries007/tfc/objects/blocks/BlocksTFC.java
Expand Up @@ -16,7 +16,6 @@
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.fluids.BlockFluidBase;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.registry.GameRegistry;
Expand All @@ -34,6 +33,7 @@
import net.dries007.tfc.objects.blocks.stone.*;
import net.dries007.tfc.objects.blocks.wood.*;
import net.dries007.tfc.objects.fluids.FluidsTFC;
import net.dries007.tfc.objects.fluids.properties.FluidWrapper;
import net.dries007.tfc.objects.items.itemblock.*;
import net.dries007.tfc.objects.te.*;
import net.dries007.tfc.util.agriculture.BerryBush;
Expand Down Expand Up @@ -331,14 +331,34 @@ public static void registerBlocks(RegistryEvent.Register<Block> event)

{
Builder<BlockFluidBase> b = ImmutableList.builder();
for (Fluid fluid : FluidsTFC.getAllInfiniteFluids())
b.add(register(r, "fluid/" + fluid.getName(), new BlockFluidTFC(fluid, Material.WATER, true)));
for (Fluid fluid : FluidsTFC.getAllAlcoholsFluids())
b.add(register(r, "fluid/" + fluid.getName(), new BlockFluidTFC(fluid, FluidsTFC.MATERIAL_ALCOHOL, false)));
for (Fluid fluid : FluidsTFC.getAllOtherFiniteFluids())
b.add(register(r, "fluid/" + fluid.getName(), new BlockFluidTFC(fluid, Material.WATER, false)));
for (Fluid fluid : FluidsTFC.getAllMetalFluids())
b.add(register(r, "fluid/" + fluid.getName(), new BlockFluidTFC(fluid, Material.LAVA, false)));
for (FluidWrapper wrapper : FluidsTFC.getAllInfiniteFluids())
{
if (wrapper.isDefault())
{
b.add(register(r, "fluid/" + wrapper.get().getName(), new BlockFluidTFC(wrapper.get(), Material.WATER, true)));
}
}
for (FluidWrapper wrapper : FluidsTFC.getAllAlcoholsFluids())
{
if (wrapper.isDefault())
{
b.add(register(r, "fluid/" + wrapper.get().getName(), new BlockFluidTFC(wrapper.get(), FluidsTFC.MATERIAL_ALCOHOL, false)));
}
}
for (FluidWrapper wrapper : FluidsTFC.getAllOtherFiniteFluids())
{
if (wrapper.isDefault())
{
b.add(register(r, "fluid/" + wrapper.get().getName(), new BlockFluidTFC(wrapper.get(), Material.WATER, false)));
}
}
for (FluidWrapper wrapper : FluidsTFC.getAllMetalFluids())
{
if (wrapper.isDefault())
{
b.add(register(r, "fluid/" + wrapper.get().getName(), new BlockFluidTFC(wrapper.get(), Material.LAVA, false)));
}
}
allFluidBlocks = b.build();
}

Expand Down
201 changes: 124 additions & 77 deletions src/main/java/net/dries007/tfc/objects/fluids/FluidsTFC.java
Expand Up @@ -5,147 +5,194 @@

package net.dries007.tfc.objects.fluids;

import java.util.Set;
import java.util.stream.Collectors;
import javax.annotation.Nonnull;

import com.google.common.collect.HashBiMap;
import com.google.common.collect.ImmutableCollection;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import net.minecraft.block.material.MapColor;
import net.minecraft.block.material.Material;
import net.minecraft.block.material.MaterialLiquid;
import net.minecraft.init.MobEffects;
import net.minecraft.item.EnumRarity;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidRegistry;

import net.dries007.tfc.Constants;
import net.dries007.tfc.api.capability.food.FoodStatsTFC;
import net.dries007.tfc.api.registries.TFCRegistries;
import net.dries007.tfc.api.types.Metal;
import net.dries007.tfc.objects.fluids.properties.DrinkableFluidWrapper;
import net.dries007.tfc.objects.fluids.properties.FluidWrapper;
import net.dries007.tfc.objects.fluids.properties.MetalFluidWrapper;

import static net.dries007.tfc.api.util.TFCConstants.MOD_ID;

public class FluidsTFC
public final class FluidsTFC
{
public static final Material MATERIAL_ALCOHOL = new MaterialLiquid(MapColor.WATER);

private static final ResourceLocation STILL = new ResourceLocation(MOD_ID, "blocks/fluid_still");
private static final ResourceLocation FLOW = new ResourceLocation(MOD_ID, "blocks/fluid_flow");

private static final HashBiMap<Fluid, FluidWrapper> WRAPPERS = HashBiMap.create();

// Water variants
public static final Fluid HOT_WATER = new Fluid("hot_water", STILL, FLOW, 0xFF345FDA).setTemperature(350);
public static final Fluid FRESH_WATER = new Fluid("fresh_water", STILL, FLOW, 0xFF1F32DA);
public static final Fluid SALT_WATER = new Fluid("salt_water", STILL, FLOW, 0xFF1F5099);
public static FluidWrapper HOT_WATER;
public static FluidWrapper FRESH_WATER;

// Other fluids
public static final Fluid LIMEWATER = new Fluid("limewater", STILL, FLOW, 0xFFB4B4B4);
public static final Fluid TANNIN = new Fluid("tannin", STILL, FLOW, 0xFF63594E);
public static final Fluid VINEGAR = new Fluid("vinegar", STILL, FLOW, 0xFFC7C2AA);
public static FluidWrapper LIMEWATER;
public static FluidWrapper TANNIN;
public static FluidWrapper VINEGAR;

// Alcohols
public static final Fluid CIDER = new Fluid("cider", STILL, FLOW, 0xFFB0AE32).setRarity(EnumRarity.UNCOMMON);
public static final Fluid VODKA = new Fluid("vodka", STILL, FLOW, 0xFFDCDCDC).setRarity(EnumRarity.UNCOMMON);
public static final Fluid SAKE = new Fluid("sake", STILL, FLOW, 0xFFB7D9BC).setRarity(EnumRarity.UNCOMMON);
public static final Fluid CORN_WHISKEY = new Fluid("corn_whiskey", STILL, FLOW, 0xFFD9C7B7).setRarity(EnumRarity.UNCOMMON);
public static final Fluid RYE_WHISKEY = new Fluid("rye_whiskey", STILL, FLOW, 0xFFC77D51).setRarity(EnumRarity.UNCOMMON);
public static final Fluid WHISKEY = new Fluid("whiskey", STILL, FLOW, 0xFF583719).setRarity(EnumRarity.UNCOMMON);
public static final Fluid BEER = new Fluid("beer", STILL, FLOW, 0xFFC39E37).setRarity(EnumRarity.UNCOMMON);
public static final Fluid RUM = new Fluid("rum", STILL, FLOW, 0xFF6E0123).setRarity(EnumRarity.UNCOMMON);
public static FluidWrapper CIDER;
public static FluidWrapper VODKA;
public static FluidWrapper SAKE;
public static FluidWrapper CORN_WHISKEY;
public static FluidWrapper RYE_WHISKEY;
public static FluidWrapper WHISKEY;
public static FluidWrapper BEER;
public static FluidWrapper RUM;

private static final ResourceLocation LAVA_STILL = new ResourceLocation(MOD_ID, "blocks/lava_still");
private static final ResourceLocation LAVA_FLOW = new ResourceLocation(MOD_ID, "blocks/lava_flow");

private static ImmutableSet<Fluid> allInfiniteFluids;
private static ImmutableSet<Fluid> allAlcoholsFluids;
private static ImmutableMap<Metal, Fluid> allMetalFluids;
private static ImmutableSet<Fluid> allOtherFiniteFluids;
private static ImmutableSet<FluidWrapper> allInfiniteFluids;
private static ImmutableSet<FluidWrapper> allAlcoholsFluids;
private static ImmutableMap<Metal, FluidWrapper> allMetalFluids;
private static ImmutableSet<FluidWrapper> allOtherFiniteFluids;

public static ImmutableSet<Fluid> getAllInfiniteFluids()
public static ImmutableSet<FluidWrapper> getAllInfiniteFluids()
{
return allInfiniteFluids;
}

public static ImmutableSet<Fluid> getAllAlcoholsFluids()
public static ImmutableSet<FluidWrapper> getAllAlcoholsFluids()
{
return allAlcoholsFluids;
}

public static ImmutableSet<Fluid> getAllOtherFiniteFluids()
public static ImmutableSet<FluidWrapper> getAllOtherFiniteFluids()
{
return allOtherFiniteFluids;
}

public static ImmutableCollection<Fluid> getAllMetalFluids()
public static ImmutableCollection<FluidWrapper> getAllMetalFluids()
{
return allMetalFluids.values();
}

@Nonnull
public static Fluid getMetalFluid(@Nonnull Metal metal)
@SuppressWarnings("ConstantConditions")
public static FluidWrapper getWrapper(Fluid fluid)
{
return allMetalFluids.get(metal);
return WRAPPERS.get(fluid);
}

public static void preInit()
@Nonnull
public static Set<FluidWrapper> getAllWrappers()
{
{
ImmutableSet.Builder<Fluid> b = ImmutableSet.builder();

registerFluid(b, SALT_WATER);
registerFluid(b, FRESH_WATER);
registerFluid(b, HOT_WATER);
return WRAPPERS.values();
}

allInfiniteFluids = b.build();
}
{
ImmutableSet.Builder<Fluid> b = ImmutableSet.builder();

registerFluid(b, RUM);
registerFluid(b, BEER);
registerFluid(b, WHISKEY);
registerFluid(b, RYE_WHISKEY);
registerFluid(b, CORN_WHISKEY);
registerFluid(b, SAKE);
registerFluid(b, VODKA);
registerFluid(b, CIDER);

allAlcoholsFluids = b.build();
}
{
ImmutableSet.Builder<Fluid> b = ImmutableSet.builder();

registerFluid(b, VINEGAR);
registerFluid(b, new Fluid("brine", STILL, FLOW, 0xFFDCD3C9));
registerFluid(b, new Fluid("milk", STILL, FLOW, 0xFFFFFFFF));
registerFluid(b, new Fluid("olive_oil", STILL, FLOW, 0xFF6A7537).setRarity(EnumRarity.RARE));
registerFluid(b, TANNIN);
registerFluid(b, LIMEWATER);
registerFluid(b, new Fluid("milk_curdled", STILL, FLOW, 0xFFFFFBE8));
registerFluid(b, new Fluid("milk_vinegar", STILL, FLOW, 0xFFFFFBE8));

allOtherFiniteFluids = b.build();
}
{
ImmutableMap.Builder<Metal, Fluid> b = ImmutableMap.builder();
@Nonnull
public static Fluid getFluidFromMetal(@Nonnull Metal metal)
{
return allMetalFluids.get(metal).get();
}

for (Metal metal : TFCRegistries.METALS.getValuesCollection())
public static void preInit()
{
allInfiniteFluids = ImmutableSet.<FluidWrapper>builder()
.add(
HOT_WATER = registerFluid(new Fluid("hot_water", STILL, FLOW, 0xFF345FDA).setTemperature(350), (fluid, isDefault) -> new DrinkableFluidWrapper(fluid, isDefault, player -> {
if (player.getFoodStats() instanceof FoodStatsTFC)
{
((FoodStatsTFC) player.getFoodStats()).addThirst(40);
}
})),
FRESH_WATER = registerFluid(new Fluid("fresh_water", STILL, FLOW, 0xFF1F32DA)),
registerFluid(new Fluid("salt_water", STILL, FLOW, 0xFF1F5099), (fluid, isDefault) -> new DrinkableFluidWrapper(fluid, isDefault, player -> {
if (player.getFoodStats() instanceof FoodStatsTFC)
{
((FoodStatsTFC) player.getFoodStats()).addThirst(-10);
}
}))
)
.build();

FluidWrapper.Factory alcoholWrapper = (fluid, isDefault) -> new DrinkableFluidWrapper(fluid, isDefault, player -> {
if (player.getFoodStats() instanceof FoodStatsTFC)
{
//noinspection ConstantConditions
registerFluid(b, metal, new FluidMetal(metal, metal.getRegistryName().getPath(), LAVA_STILL, LAVA_FLOW, metal.getColor()));
((FoodStatsTFC) player.getFoodStats()).addThirst(10);
if (Constants.RNG.nextFloat() < 0.25f)
{
player.addPotionEffect(new PotionEffect(MobEffects.NAUSEA, 1200, 1));
}
}
allMetalFluids = b.build();
}
});
allAlcoholsFluids = ImmutableSet.<FluidWrapper>builder()
.add(
RUM = registerFluid(new Fluid("rum", STILL, FLOW, 0xFF6E0123).setRarity(EnumRarity.UNCOMMON), alcoholWrapper),
BEER = registerFluid(new Fluid("beer", STILL, FLOW, 0xFFC39E37).setRarity(EnumRarity.UNCOMMON), alcoholWrapper),
WHISKEY = registerFluid(new Fluid("whiskey", STILL, FLOW, 0xFF583719).setRarity(EnumRarity.UNCOMMON), alcoholWrapper),
RYE_WHISKEY = registerFluid(new Fluid("rye_whiskey", STILL, FLOW, 0xFFC77D51).setRarity(EnumRarity.UNCOMMON), alcoholWrapper),
CORN_WHISKEY = registerFluid(new Fluid("corn_whiskey", STILL, FLOW, 0xFFD9C7B7).setRarity(EnumRarity.UNCOMMON), alcoholWrapper),
SAKE = registerFluid(new Fluid("sake", STILL, FLOW, 0xFFB7D9BC).setRarity(EnumRarity.UNCOMMON), alcoholWrapper),
VODKA = registerFluid(new Fluid("vodka", STILL, FLOW, 0xFFDCDCDC).setRarity(EnumRarity.UNCOMMON), alcoholWrapper),
CIDER = registerFluid(new Fluid("cider", STILL, FLOW, 0xFFB0AE32).setRarity(EnumRarity.UNCOMMON), alcoholWrapper)
)
.build();

allOtherFiniteFluids = ImmutableSet.<FluidWrapper>builder()
.add(
VINEGAR = registerFluid(new Fluid("vinegar", STILL, FLOW, 0xFFC7C2AA)),
registerFluid(new Fluid("brine", STILL, FLOW, 0xFFDCD3C9)),
registerFluid(new Fluid("milk", STILL, FLOW, 0xFFFFFFFF)),
registerFluid(new Fluid("olive_oil", STILL, FLOW, 0xFF6A7537).setRarity(EnumRarity.RARE)),
TANNIN = registerFluid(new Fluid("tannin", STILL, FLOW, 0xFF63594E)),
LIMEWATER = registerFluid(new Fluid("limewater", STILL, FLOW, 0xFFB4B4B4)),
registerFluid(new Fluid("milk_curdled", STILL, FLOW, 0xFFFFFBE8)),
registerFluid(new Fluid("milk_vinegar", STILL, FLOW, 0xFFFFFBE8))
)
.build();

//noinspection ConstantConditions
allMetalFluids = ImmutableMap.<Metal, FluidWrapper>builder()
.putAll(
TFCRegistries.METALS.getValuesCollection()
.stream()
.collect(Collectors.toMap(
metal -> metal,
metal -> registerFluid(new Fluid(metal.getRegistryName().getPath(), LAVA_STILL, LAVA_FLOW, metal.getColor()), (fluid, isDefault) -> new MetalFluidWrapper(fluid, isDefault, metal))
))
)
.build();
}

private static <T extends Fluid> void registerFluid(ImmutableSet.Builder<T> b, T fluid)
private static FluidWrapper registerFluid(Fluid fluid)
{
FluidRegistry.registerFluid(fluid);
FluidRegistry.addBucketForFluid(fluid);
b.add(fluid);
return registerFluid(fluid, FluidWrapper::new);
}

private static <T extends Fluid, V> void registerFluid(ImmutableMap.Builder<V, T> b, V key, T fluid)
private static FluidWrapper registerFluid(Fluid newFluid, FluidWrapper.Factory fluidPropertyWrapper)
{
FluidRegistry.registerFluid(fluid);
FluidRegistry.addBucketForFluid(fluid);
b.put(key, fluid);
boolean isDefault = FluidRegistry.registerFluid(newFluid);
if (!isDefault)
{
// Fluid was already registered with this name, default to that fluid
newFluid = FluidRegistry.getFluid(newFluid.getName());
}
FluidRegistry.addBucketForFluid(newFluid);
FluidWrapper properties = fluidPropertyWrapper.create(newFluid, isDefault);
WRAPPERS.put(newFluid, properties);
return properties;
}
}

0 comments on commit 7e7cebc

Please sign in to comment.