/* * Copyright (c) CovertJaguar, 2014 http://railcraft.info * * This code is the property of CovertJaguar * and may only be used with explicit written * permission unless otherwise specified on the * license page at http://railcraft.info/wiki/info:license. */ package mods.railcraft.common.fluids; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import mods.railcraft.common.core.RailcraftConfig; import mods.railcraft.common.plugins.forge.RailcraftRegistry; import mods.railcraft.common.util.misc.Game; import net.minecraft.block.Block; import net.minecraft.block.material.MapColor; import net.minecraft.block.material.Material; import net.minecraft.block.material.MaterialLiquid; import net.minecraftforge.client.event.TextureStitchEvent; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidRegistry; import org.apache.logging.log4j.Level; /** * @author CovertJaguar <http://www.railcraft.info/> */ public enum RailcraftFluids { CREOSOTE("fluid.creosote", Fluids.CREOSOTE, 800, 1500) { @Override void defineContainers() { FluidContainers.getCreosoteOilBucket(); FluidContainers.getCreosoteOilBottle(); FluidContainers.getCreosoteOilCan(); FluidContainers.getCreosoteOilCell(); FluidContainers.getCreosoteOilWax(); FluidContainers.getCreosoteOilRefactory(); } @Override public Block makeBlock() { return new BlockRailcraftFluid(standardFluid.get(), Material.water).setFlammable(true).setFlammability(10); } }, STEAM("fluid.steam", Fluids.STEAM, -1000, 500) { @Override void defineContainers() { FluidContainers.getSteamBottle(); } @Override Block makeBlock() { return new BlockRailcraftFluidFinite(standardFluid.get(), new MaterialLiquid(MapColor.airColor)).setNoFlow(); } }; public static final RailcraftFluids[] VALUES = values(); public final String tag; public final Fluids standardFluid; public final int density, viscosity; protected Fluid railcraftFluid; protected Block railcraftBlock; private RailcraftFluids(String tag, Fluids standardFluid, int density, int viscosity) { this.tag = tag; this.standardFluid = standardFluid; this.density = density; this.viscosity = viscosity; } public static void preInitFluids() { for (RailcraftFluids fluidType : VALUES) { fluidType.init(); } } public static void postInitFluids() { for (RailcraftFluids fluidType : VALUES) { fluidType.postInit(); } } public static Object getTextureHook() { return new TextureHook(); } private void init() { initFluid(); initBlock(); checkStandardFluidBlock(); if (standardFluid.get() != null) defineContainers(); } private void postInit() { checkStandardFluidBlock(); if (standardFluid.get() == null) throw new MissingFluidException(standardFluid.getTag()); } private void initFluid() { if (railcraftFluid == null && RailcraftConfig.isFluidEnabled(standardFluid.getTag())) { railcraftFluid = new Fluid(standardFluid.getTag()).setDensity(density).setViscosity(viscosity).setGaseous(density < 0); // if (!FluidRegistry.isFluidRegistered(standardFluid.getTag())) FluidRegistry.registerFluid(railcraftFluid); // else { // Game.log(Level.WARN, "Pre-existing {0} fluid detected, deferring, " // + "this may cause issues if the server/client have different mod load orders, " // + "recommended that you disable all but one instance of the fluid via your configs.", standardFluid.getTag()); // } } } void defineContainers() { } abstract Block makeBlock(); private void initBlock() { if (railcraftBlock == null && RailcraftConfig.isBlockEnabled(tag)) { railcraftBlock = makeBlock(); railcraftBlock.setBlockName("railcraft." + tag); RailcraftRegistry.register(railcraftBlock); railcraftFluid.setBlock(railcraftBlock); } } private void checkStandardFluidBlock() { if (railcraftBlock == null) return; Fluid fluid = standardFluid.get(); if (fluid == null) return; Block fluidBlock = fluid.getBlock(); if (fluidBlock == null) fluid.setBlock(railcraftBlock); // } else { // GameRegistry.UniqueIdentifier blockID = GameRegistry.findUniqueIdentifierFor(fluidBlock); // Game.log(Level.WARN, "Pre-existing {0} fluid block detected, deferring to {1}:{2}, " // + "this may cause issues if the server/client have different mod load orders, " // + "recommended that you disable all but one instance of {0} fluid blocks via your configs.", fluid.getName(), blockID.modId, blockID.name); // } } public Block getBlock() { return railcraftBlock; } public static class MissingFluidException extends RuntimeException { public MissingFluidException(String tag) { super("Fluid '" + tag + "' was not found. Please check your configs."); } } public static class TextureHook { @SubscribeEvent @SideOnly(Side.CLIENT) public void textureHook(TextureStitchEvent.Post event) { if (event.map.getTextureType() == 0) for (RailcraftFluids fluidType : VALUES) { if (fluidType.railcraftFluid != null) { Block block = fluidType.railcraftBlock != null ? fluidType.railcraftBlock : fluidType.standardFluid.get().getBlock(); fluidType.railcraftFluid.setIcons(block.getBlockTextureFromSide(1), block.getBlockTextureFromSide(2)); } } } } }