From 0f139dd320b3c3f9f4baf87c99dadf5df1673ea3 Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 25 Jun 2023 20:32:12 +0200 Subject: [PATCH] Added Mixer Added Mixer Added UU Mixer Added RBMK Partial meltdowns Added JSON Bedrock Ore Dimension config Added more info to Fluid tooltips Added ethanol, fishoil, sunfloweroil, nitroglycering, colloid and their recipes Added logarithmic fluid display Added creative bedrock ore changing Added fluid rendering to crystallizer render Changed S.A.F.E reactor to have a button instead of a fuse Changed biofuel recipe to include ethanol Changed upgrade tooltips to have indentations Changed S.A.F.E reactor power output by x40 Changed DFC rendering scales and off look Changed name of coated red copper cable to red copper cable block as both are coated Changed Silex texture to reflect that it has a bottom port Fixed Crash when setting fluid types of fraction tower on a server Fixed RBMK redstone control not working on a server Fixed flashing when having [blinding] item and spider milks Fixed missing shift click of chemfactory Fixed barrel info render pos Fixed dickmask bug Fixed DFC negative power bug Fixed DFC injector not inputting fluids Removed unused interface --- src/main/java/com/hbm/blocks/ModBlocks.java | 2 + .../blocks/machine/MachineFractionTower.java | 21 +- .../com/hbm/blocks/machine/MachineMixer.java | 44 + .../hbm/blocks/machine/rbmk/RBMKConsole.java | 26 +- .../com/hbm/config/BedrockOreJsonConfig.java | 120 ++ .../com/hbm/config/CompatibilityConfig.java | 2 - src/main/java/com/hbm/config/JsonConfig.java | 47 + src/main/java/com/hbm/forgefluid/FFUtils.java | 55 +- .../com/hbm/forgefluid/FluidTypeHandler.java | 28 +- .../com/hbm/forgefluid/ModForgeFluids.java | 24 + src/main/java/com/hbm/handler/ArmorUtil.java | 3 +- .../java/com/hbm/handler/jei/JEIConfig.java | 6 + .../java/com/hbm/handler/jei/JeiRecipes.java | 52 + .../hbm/handler/jei/MixerRecipeHandler.java | 64 + .../java/com/hbm/interfaces/IReactor.java | 21 - .../com/hbm/inventory/BedrockOreRegistry.java | 31 +- .../com/hbm/inventory/ChemplantRecipes.java | 4 +- .../hbm/inventory/CrystallizerRecipes.java | 5 + .../hbm/inventory/FluidCombustionRecipes.java | 2 + .../java/com/hbm/inventory/MixerRecipes.java | 112 ++ .../java/com/hbm/inventory/RecipesCommon.java | 2 - .../inventory/container/ContainerChemfac.java | 38 +- .../container/ContainerDiFurnaceRTG.java | 2 +- .../container/ContainerFWatzCore.java | 2 - .../inventory/container/ContainerMixer.java | 80 + .../java/com/hbm/inventory/gui/GUIBarrel.java | 2 +- .../com/hbm/inventory/gui/GUIFWatzCore.java | 46 +- .../inventory/gui/GUIMachineUUCreator.java | 3 +- .../java/com/hbm/inventory/gui/GUIMixer.java | 70 + src/main/java/com/hbm/items/ModItems.java | 24 +- .../com/hbm/items/armor/ItemModGasmask.java | 3 +- .../hbm/items/machine/ItemMachineUpgrade.java | 104 +- .../com/hbm/items/special/ItemBedrockOre.java | 22 + src/main/java/com/hbm/lib/HbmWorldGen.java | 6 +- src/main/java/com/hbm/main/ClientProxy.java | 2 + .../java/com/hbm/main/CraftingManager.java | 1 + src/main/java/com/hbm/main/MainRegistry.java | 6 + .../com/hbm/main/ModEventHandlerClient.java | 11 + .../java/com/hbm/main/ResourceManager.java | 8 + .../hbm/render/item/ItemRenderLibrary.java | 17 +- .../com/hbm/render/tileentity/RenderCore.java | 177 +- .../render/tileentity/RenderCrystallizer.java | 36 +- .../hbm/render/tileentity/RenderMixer.java | 76 + .../tileentity/machine/TileEntityBarrel.java | 5 +- .../tileentity/machine/TileEntityCore.java | 28 +- .../machine/TileEntityCoreEmitter.java | 12 +- .../machine/TileEntityCoreInjector.java | 43 +- .../machine/TileEntityCoreReceiver.java | 10 +- .../machine/TileEntityFWatzCore.java | 68 +- .../machine/TileEntityMachineMixer.java | 487 ++++++ .../machine/TileEntityMachineUUCreator.java | 35 +- .../machine/TileEntityWatzCore.java | 26 +- .../assets/hbm/blockstates/machine_mixer.json | 5 + src/main/resources/assets/hbm/lang/en_us.lang | 18 +- .../hbm/models/block/machine_mixer.json | 6 + .../assets/hbm/models/item/machine_mixer.json | 6 + .../assets/hbm/models/machines/mixer.obj | 1454 +++++++++++++++++ .../assets/hbm/textures/blocks/dfc_core.png | Bin 308 -> 337 bytes .../blocks/forgefluid/colloid_flowing.png | Bin 0 -> 548 bytes .../blocks/forgefluid/colloid_still.png | Bin 0 -> 548 bytes .../blocks/forgefluid/ethanol_flowing.png | Bin 0 -> 538 bytes .../blocks/forgefluid/ethanol_still.png | Bin 0 -> 538 bytes .../blocks/forgefluid/fishoil_flowing.png | Bin 0 -> 489 bytes .../blocks/forgefluid/fishoil_still.png | Bin 0 -> 489 bytes .../forgefluid/nitroglycerin_flowing.png | Bin 0 -> 717 bytes .../blocks/forgefluid/nitroglycerin_still.png | Bin 0 -> 717 bytes .../forgefluid/sunfloweroil_flowing.png | Bin 0 -> 490 bytes .../blocks/forgefluid/sunfloweroil_still.png | Bin 0 -> 490 bytes .../hbm/textures/gui/gui_fwatz_multiblock.png | Bin 12222 -> 12461 bytes .../hbm/textures/gui/jei/gui_nei_three.png | Bin 751 -> 0 bytes .../textures/gui/jei/gui_nei_three_to_one.png | Bin 0 -> 742 bytes .../hbm/textures/gui/processing/gui_mixer.png | Bin 0 -> 3081 bytes .../hbm/textures/models/machines/mixer.png | Bin 0 -> 1931 bytes .../hbm/textures/models/machines/mixer_uu.png | Bin 0 -> 1668 bytes .../hbm/textures/models/machines/silex.png | Bin 3451 -> 3552 bytes .../hbm/textures/models/tank/tank_colloid.png | Bin 0 -> 1092 bytes .../hbm/textures/models/tank/tank_ethanol.png | Bin 0 -> 867 bytes .../hbm/textures/models/tank/tank_fishoil.png | Bin 0 -> 1350 bytes .../models/tank/tank_nitroglycerin.png | Bin 0 -> 1270 bytes .../models/tank/tank_sunfloweroil.png | Bin 0 -> 1075 bytes 80 files changed, 3181 insertions(+), 429 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/machine/MachineMixer.java create mode 100644 src/main/java/com/hbm/config/BedrockOreJsonConfig.java create mode 100644 src/main/java/com/hbm/config/JsonConfig.java create mode 100644 src/main/java/com/hbm/handler/jei/MixerRecipeHandler.java delete mode 100644 src/main/java/com/hbm/interfaces/IReactor.java create mode 100644 src/main/java/com/hbm/inventory/MixerRecipes.java create mode 100644 src/main/java/com/hbm/inventory/container/ContainerMixer.java create mode 100644 src/main/java/com/hbm/inventory/gui/GUIMixer.java create mode 100644 src/main/java/com/hbm/render/tileentity/RenderMixer.java create mode 100644 src/main/java/com/hbm/tileentity/machine/TileEntityMachineMixer.java create mode 100644 src/main/resources/assets/hbm/blockstates/machine_mixer.json create mode 100644 src/main/resources/assets/hbm/models/block/machine_mixer.json create mode 100644 src/main/resources/assets/hbm/models/item/machine_mixer.json create mode 100644 src/main/resources/assets/hbm/models/machines/mixer.obj create mode 100644 src/main/resources/assets/hbm/textures/blocks/forgefluid/colloid_flowing.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/forgefluid/colloid_still.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/forgefluid/ethanol_flowing.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/forgefluid/ethanol_still.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/forgefluid/fishoil_flowing.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/forgefluid/fishoil_still.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/forgefluid/nitroglycerin_flowing.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/forgefluid/nitroglycerin_still.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/forgefluid/sunfloweroil_flowing.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/forgefluid/sunfloweroil_still.png delete mode 100644 src/main/resources/assets/hbm/textures/gui/jei/gui_nei_three.png create mode 100644 src/main/resources/assets/hbm/textures/gui/jei/gui_nei_three_to_one.png create mode 100644 src/main/resources/assets/hbm/textures/gui/processing/gui_mixer.png create mode 100644 src/main/resources/assets/hbm/textures/models/machines/mixer.png create mode 100644 src/main/resources/assets/hbm/textures/models/machines/mixer_uu.png create mode 100644 src/main/resources/assets/hbm/textures/models/tank/tank_colloid.png create mode 100644 src/main/resources/assets/hbm/textures/models/tank/tank_ethanol.png create mode 100644 src/main/resources/assets/hbm/textures/models/tank/tank_fishoil.png create mode 100644 src/main/resources/assets/hbm/textures/models/tank/tank_nitroglycerin.png create mode 100644 src/main/resources/assets/hbm/textures/models/tank/tank_sunfloweroil.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 78db171ee4..6ca68ab29e 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -1083,6 +1083,8 @@ public SoundEvent getBreakSound() { public static final Block machine_chemfac = new MachineChemfac(Material.IRON, "machine_chemfac").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab); public static final int guiID_machine_chemplant = 49; + public static final Block machine_mixer = new MachineMixer(Material.IRON, "machine_mixer").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab); + public static final Block machine_rtg_grey = new MachineRTG(Material.IRON, "machine_rtg_grey").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); public static final int guiID_machine_rtg = 42; diff --git a/src/main/java/com/hbm/blocks/machine/MachineFractionTower.java b/src/main/java/com/hbm/blocks/machine/MachineFractionTower.java index 300277f909..832ce15606 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineFractionTower.java +++ b/src/main/java/com/hbm/blocks/machine/MachineFractionTower.java @@ -74,25 +74,32 @@ public boolean onBlockActivated(World world, BlockPos pos1, IBlockState state, E TileEntityMachineFractionTower frac = (TileEntityMachineFractionTower) te; if(player.getHeldItem(hand).isEmpty()) { - - player.sendMessage(new TextComponentString(TextFormatting.YELLOW + "=== FRACTIONING TOWER Y:" + pos[1] + " ===")); + if(world.isRemote){ + player.sendMessage(new TextComponentString(TextFormatting.YELLOW + "=== FRACTIONING TOWER Y:" + pos[1] + " ===")); - for(int i = 0; i < frac.tanks.length; i++) - player.sendMessage(new TextComponentTranslation(frac.types[i].getUnlocalizedName()).appendSibling(new TextComponentString(": " + frac.tanks[i].getFluidAmount() + "/" + frac.tanks[i].getCapacity() + "mB"))); + for(int i = 0; i < frac.tanks.length; i++) + player.sendMessage(new TextComponentTranslation(frac.types[i].getUnlocalizedName()).appendSibling(new TextComponentString(": " + frac.tanks[i].getFluidAmount() + "/" + frac.tanks[i].getCapacity() + "mB"))); + } } else { if(world.getTileEntity(new BlockPos(pos[0], pos[1] - 3, pos[2])) instanceof TileEntityMachineFractionTower) { - player.sendMessage(new TextComponentString(TextFormatting.RED + "You can only change the type in the bottom segment!")); + if(world.isRemote){ + player.sendMessage(new TextComponentString(TextFormatting.RED + "You can only change the type in the bottom segment!")); + } } else { Fluid type = ItemForgeFluidIdentifier.getType(player.getHeldItem(hand)); if(RefineryRecipes.getFractions(type) == null){ - player.sendMessage(new TextComponentString("§cNo recipe found for §e"+type.getLocalizedName(new FluidStack(type, 1)))); + if(world.isRemote){ + player.sendMessage(new TextComponentString("§cNo recipe found for §e"+type.getLocalizedName(new FluidStack(type, 1)))); + } return false; } frac.setTankType(0, type); frac.markDirty(); - player.sendMessage(new TextComponentString(TextFormatting.YELLOW + "Changed type to §a" + I18n.format(type.getUnlocalizedName()))); + if(world.isRemote){ + player.sendMessage(new TextComponentString(TextFormatting.YELLOW + "Changed type to §a" + I18n.format(type.getUnlocalizedName()))); + } } } diff --git a/src/main/java/com/hbm/blocks/machine/MachineMixer.java b/src/main/java/com/hbm/blocks/machine/MachineMixer.java new file mode 100644 index 0000000000..c12a8dc60e --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/MachineMixer.java @@ -0,0 +1,44 @@ +package com.hbm.blocks.machine; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.tileentity.machine.TileEntityMachineMixer; + +import net.minecraft.block.material.Material; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.world.World; + +public class MachineMixer extends BlockDummyable { + + public MachineMixer(Material mat, String s) { + super(mat, s); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + + if(meta >= 12) + return new TileEntityMachineMixer(); + + return null; + } + + @Override + public int[] getDimensions() { + return new int[] {2, 0, 0, 0, 0, 0}; + } + + @Override + public int getOffset() { + return 0; + } + + @Override + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { + return standardOpenBehavior(world, pos.getX(), pos.getY(), pos.getZ(), player, 0); + } +} diff --git a/src/main/java/com/hbm/blocks/machine/rbmk/RBMKConsole.java b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKConsole.java index 3f5afba556..3a89be53eb 100644 --- a/src/main/java/com/hbm/blocks/machine/rbmk/RBMKConsole.java +++ b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKConsole.java @@ -51,19 +51,21 @@ public TileEntity createNewTileEntity(World world, int meta) { @Override public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) { super.neighborChanged(state, world, pos, blockIn, fromPos); - if(state.getValue(META) >= offset){ - int power = world.isBlockIndirectlyGettingPowered(pos); - if(power > 0 && power <= 15){ - TileEntityRBMKConsole console = (TileEntityRBMKConsole) world.getTileEntity(pos); - NBTTagCompound control = new NBTTagCompound(); - control.setDouble("level", (15D-power)/14D); - - for(int j = 0; j < console.columns.length; j++) { - if(console.columns[j] != null && console.columns[j].type == ColumnType.CONTROL) - control.setInteger("sel_" + j, j); + if(!world.isRemote){ + if(state.getValue(META) >= offset){ + int power = world.isBlockIndirectlyGettingPowered(pos); + if(power > 0 && power <= 15){ + TileEntityRBMKConsole console = (TileEntityRBMKConsole) world.getTileEntity(pos); + NBTTagCompound control = new NBTTagCompound(); + control.setDouble("level", (15D-power)/14D); + + for(int j = 0; j < console.columns.length; j++) { + if(console.columns[j] != null && console.columns[j].type == ColumnType.CONTROL) + control.setInteger("sel_" + j, j); + } + + console.receiveControl(control); } - - PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(control, console.getPos())); } } } diff --git a/src/main/java/com/hbm/config/BedrockOreJsonConfig.java b/src/main/java/com/hbm/config/BedrockOreJsonConfig.java new file mode 100644 index 0000000000..7af72cd2f8 --- /dev/null +++ b/src/main/java/com/hbm/config/BedrockOreJsonConfig.java @@ -0,0 +1,120 @@ +package com.hbm.config; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.HashMap; +import java.util.HashSet; + +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.gson.stream.JsonWriter; + +import com.hbm.main.MainRegistry; + +public class BedrockOreJsonConfig { + + public static final String bedrockOreJsonConfigFile = "hbm_bedrock_ores.json"; + + public static HashMap> dimOres = new HashMap(); + public static HashMap dimWhiteList = new HashMap(); + public static HashMap dimOreRarity = new HashMap(); + + public static void init(){ + if(!loadFromJson()){ + clear(); + setDefaults(); + writeToJson(); + } + } + + public static void clear(){ + dimOres.clear(); + dimWhiteList.clear(); + dimOreRarity.clear(); + } + + public static boolean isOreAllowed(int dimID, String ore){ + HashSet ores = dimOres.get(dimID); + boolean isInList = ores.contains(ore); + if(!dimWhiteList.get(dimID)) isInList = !isInList; + return isInList; + } + + public static void setDefaults() { + addEntry(0, 30, Arrays.asList("orePlutonium", "oreQuartz", "oreRedPhosphorus", "oreSchrabidium"), false); + addEntry(-1, 60, Arrays.asList("orePlutonium", "oreQuartz", "oreRedPhosphorus", "oreSchrabidium"), true); + } + + public static void addEntry(int dimID, int rarity, List ores, Boolean isWhiteList){ + HashSet set = new HashSet(); + for(String ore : ores) + set.add(ore); + dimOres.put(dimID, set); + dimOreRarity.put(dimID, rarity); + dimWhiteList.put(dimID, isWhiteList); + } + + public static void writeToJson(){ + try { + JsonWriter writer = JsonConfig.startWriting(bedrockOreJsonConfigFile); + writer.name("dimConfig").beginArray(); + for(Integer dimID : dimOres.keySet()){ + writer.beginObject(); + writer.name("dimID").value(dimID); + writer.name("oreRarity").value(dimOreRarity.get(dimID)); + writer.name("isWhiteList").value(dimWhiteList.get(dimID)); + writer.name("bedrockOres").beginArray(); + for(String line : dimOres.get(dimID)) + writer.value(line); + writer.endArray(); + writer.endObject(); + } + writer.endArray(); + JsonConfig.stopWriting(writer); + } catch(Exception ex) { + ex.printStackTrace(); + } + } + + public static boolean loadFromJson() { + try { + JsonObject reader = JsonConfig.startReading(bedrockOreJsonConfigFile); + + if(reader == null || !reader.has("dimConfig")) return false; + + JsonArray entries = reader.getAsJsonArray("dimConfig"); + for(JsonElement entry : entries){ + + if(entry == null || !entry.isJsonObject()) continue; + JsonObject dimEntry = entry.getAsJsonObject(); + + if(!dimEntry.has("dimID")) return false; + int dimID = dimEntry.get("dimID").getAsInt(); + + if(!dimEntry.has("oreRarity")) return false; + int oreRarity = dimEntry.get("oreRarity").getAsInt(); + + if(!dimEntry.has("isWhiteList")) continue; + boolean isWhiteList = dimEntry.get("isWhiteList").getAsBoolean(); + + if(!dimEntry.has("bedrockOres") || !dimEntry.get("bedrockOres").isJsonArray()) continue; + JsonArray jbedrockOres = dimEntry.get("bedrockOres").getAsJsonArray(); + List bedrockOres = new ArrayList(); + for(JsonElement ore : jbedrockOres){ + bedrockOres.add(ore.getAsString()); + } + + addEntry(dimID, oreRarity, bedrockOres, isWhiteList); + } + + return true; + } catch(Exception ex) { + MainRegistry.logger.error("Loading the bedrock ore config resulted in an error"); + ex.printStackTrace(); + return false; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/hbm/config/CompatibilityConfig.java b/src/main/java/com/hbm/config/CompatibilityConfig.java index 2fd7071bce..4d2d4d49f6 100644 --- a/src/main/java/com/hbm/config/CompatibilityConfig.java +++ b/src/main/java/com/hbm/config/CompatibilityConfig.java @@ -54,7 +54,6 @@ public class CompatibilityConfig { public static HashMap endTixiteSpawn; public static HashMap bedrockOilSpawn; - public static HashMap bedrockOreSpawn; public static HashMap radioStructure; public static HashMap antennaStructure; @@ -151,7 +150,6 @@ public static void loadFromConfig(Configuration config) { daffergonSpawn = CommonConfig.createConfigHashMap(config, CATEGORY_DIMORE, "01.30_daffergonSpawnRate", "Amount of daffergon ore veins per chunk - (Int:Int)", "Int", "Int", new String[]{ "-30:1" }, ":"); bedrockOilSpawn = CommonConfig.createConfigHashMap(config, CATEGORY_DIMORE, "01.31_bedrockOilSpawnRate", "Spawn bedrock oil every nTH chunk - (Int:Int)", "Int", "Int", new String[]{ "0:200" }, ":"); - bedrockOreSpawn = CommonConfig.createConfigHashMap(config, CATEGORY_DIMORE, "01.32_bedrockOreSpawnRate", "Spawn bedrock ore every nTH chunk - (Int:Int)", "Int", "Int", new String[]{ "0:30", "-1:60" }, ":"); netherUraniumSpawn = CommonConfig.createConfigHashMap(config, CATEGORY_DIMORE, "02.N00_uraniumSpawnrate", "Amount of nether uranium per chunk - (Int:Int)", "Int", "Int", new String[]{ "-1:8" }, ":"); netherTungstenSpawn = CommonConfig.createConfigHashMap(config, CATEGORY_DIMORE, "02.N01_tungstenSpawnrate", "Amount of nether tungsten per chunk - (Int:Int)", "Int", "Int", new String[]{ "-1:10" }, ":"); diff --git a/src/main/java/com/hbm/config/JsonConfig.java b/src/main/java/com/hbm/config/JsonConfig.java new file mode 100644 index 0000000000..e44acadc59 --- /dev/null +++ b/src/main/java/com/hbm/config/JsonConfig.java @@ -0,0 +1,47 @@ +package com.hbm.config; + +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.stream.JsonWriter; + +import com.hbm.main.MainRegistry; + +public class JsonConfig { + + public static final Gson gson = new Gson(); + + private static File getFile(String filename){ + return new File(MainRegistry.proxy.getDataDir().getPath() + "/config/hbm" + File.separatorChar + filename); + } + + public static JsonWriter startWriting(String filename){ + try{ + JsonWriter writer = new JsonWriter(new FileWriter(getFile(filename))); + writer.setIndent(" "); + writer.beginObject(); + return writer; + } catch(Exception ex) { } + return null; + } + + public static void stopWriting(JsonWriter writer){ + try{ + writer.endObject(); + writer.close(); + } catch(Exception ex) { } + } + + public static JsonObject startReading(String filename){ + try{ + File file = getFile(filename); + if(file.exists()) + return gson.fromJson(new FileReader(file), JsonObject.class); + return null; + } catch(Exception ex) { } + return null; + } +} diff --git a/src/main/java/com/hbm/forgefluid/FFUtils.java b/src/main/java/com/hbm/forgefluid/FFUtils.java index abd0325a0e..bbf3776e5b 100644 --- a/src/main/java/com/hbm/forgefluid/FFUtils.java +++ b/src/main/java/com/hbm/forgefluid/FFUtils.java @@ -83,6 +83,14 @@ public class FFUtils { * - where the starting y of the rectangle should be on screen */ public static void drawLiquid(FluidTank tank, int guiLeft, int guiTop, float zLevel, int sizeX, int sizeY, int offsetX, int offsetY){ + drawLiquid(tank, guiLeft, guiTop, zLevel, sizeX, sizeY, offsetX, offsetY, false); + } + + public static void drawLogLiquid(FluidTank tank, int guiLeft, int guiTop, float zLevel, int sizeX, int sizeY, int offsetX, int offsetY){ + drawLiquid(tank, guiLeft, guiTop, zLevel, sizeX, sizeY, offsetX, offsetY, true); + } + + public static void drawLiquid(FluidTank tank, int guiLeft, int guiTop, float zLevel, int sizeX, int sizeY, int offsetX, int offsetY, boolean log){ // This is retarded, but it would be too much of a pain to fix it offsetY -= 44; RenderHelper.bindBlockTexture(); @@ -91,7 +99,14 @@ public static void drawLiquid(FluidTank tank, int guiLeft, int guiTop, float zLe TextureAtlasSprite liquidIcon = getTextureFromFluid(tank.getFluid().getFluid()); if(liquidIcon != null) { - int level = (int)(((double)tank.getFluidAmount() / (double)tank.getCapacity()) * sizeY); + int level = 0; + if(log){ + if(tank.getFluidAmount() > 0){ + level = (int)(sizeY * (Math.log(tank.getFluidAmount()) / Math.log(tank.getCapacity()))); + } + } else{ + level = (int)(((double)tank.getFluidAmount() / (double)tank.getCapacity()) * sizeY); + } drawFull(tank.getFluid().getFluid(), guiLeft, guiTop, zLevel, liquidIcon, level, sizeX, offsetX, offsetY, sizeY); } @@ -182,7 +197,7 @@ public static void addFluidInfo(Fluid fluid, List texts){ tempColor = "§3"; } else if(temp < 0) { tempColor = "§b"; - } else if(temp < 50) { + } else if(temp < 100) { tempColor = "§e"; } else if(temp < 300) { tempColor = "§6"; @@ -190,17 +205,38 @@ public static void addFluidInfo(Fluid fluid, List texts){ tempColor = "§c"; } else if(temp < 3000) { tempColor = "§4"; - } else if(temp < 10000) { + } else if(temp < 20000) { + tempColor = "§5"; + } else { tempColor = "§d"; } texts.add(String.format("%s%d°C", tempColor, temp)); } boolean hasInfo = false; boolean isKeyPressed = Keyboard.isKeyDown(Keyboard.KEY_LSHIFT); + + if (FluidTypeHandler.isAntimatter(fluid)) { + if(isKeyPressed){ + texts.add("§4["+I18n.format("trait.antimatter")+"]"); + } + hasInfo = true; + } + + if (FluidTypeHandler.isCorrosivePlastic(fluid)) { + if (FluidTypeHandler.isCorrosiveIron(fluid)) { + if(isKeyPressed){ + texts.add("§2["+I18n.format("trait.corrosiveIron")+"]"); + } + } else if(isKeyPressed){ + texts.add("§a["+I18n.format("trait.corrosivePlastic")+"]"); + } + hasInfo = true; + } + if (FluidCombustionRecipes.hasFuelRecipe(fluid)) { if(isKeyPressed){ String energy = Library.getShortNumber(FluidCombustionRecipes.getFlameEnergy(fluid) * 1000L); - texts.add(String.format("§6[%s]", I18n.format("trait.flammable"))); + texts.add("§6["+I18n.format("trait.flammable")+"]"); texts.add(" "+I18n.format("trait.flammable.desc", energy)); } hasInfo = true; @@ -209,7 +245,7 @@ public static void addFluidInfo(Fluid fluid, List texts){ if (HeatRecipes.hasCoolRecipe(fluid)) { if(isKeyPressed){ String heat = Library.getShortNumber(HeatRecipes.getResultingHeat(fluid) * 1000 / HeatRecipes.getInputAmountCold(fluid)); - texts.add(String.format("§4[%s]", I18n.format("trait.coolable"))); + texts.add("§4["+I18n.format("trait.coolable")+"]"); texts.add(" "+I18n.format("trait.coolable.desc", heat)); } hasInfo = true; @@ -218,7 +254,7 @@ public static void addFluidInfo(Fluid fluid, List texts){ if (HeatRecipes.hasBoilRecipe(fluid)) { if(isKeyPressed){ String heat = Library.getShortNumber(HeatRecipes.getRequiredHeat(fluid) * 1000 / HeatRecipes.getInputAmountHot(fluid)); - texts.add(String.format("§3[%s]", I18n.format("trait.boilable"))); + texts.add("§3["+I18n.format("trait.boilable")+"]"); texts.add(" "+I18n.format("trait.boilable.desc", heat)); } hasInfo = true; @@ -247,6 +283,13 @@ private static void renderFluidInfo(GuiInfoContainer gui, int mouseX, int mouseY } } + public static boolean hasEnoughFluid(FluidTank t, FluidStack f){ + if(f == null || f.amount == 0) return true; + if(t == null || t.getFluid() == null) return false; + if(t.getFluid().isFluidEqual(f) && t.getFluidAmount() >= f.amount) return true; + return false; + } + /** * Replacement method for the old method of transferring fluids out of a * machine diff --git a/src/main/java/com/hbm/forgefluid/FluidTypeHandler.java b/src/main/java/com/hbm/forgefluid/FluidTypeHandler.java index c061c89ea4..1380e424d0 100644 --- a/src/main/java/com/hbm/forgefluid/FluidTypeHandler.java +++ b/src/main/java/com/hbm/forgefluid/FluidTypeHandler.java @@ -33,11 +33,11 @@ public static boolean isAntimatter(Fluid f){ return containsTrait(f, FluidTrait.AMAT); } - public static boolean isCorrosive(Fluid f){ + public static boolean isCorrosivePlastic(Fluid f){ return containsTrait(f, FluidTrait.CORROSIVE) || containsTrait(f, FluidTrait.CORROSIVE_2); } - public static boolean isCorrosive2(Fluid f){ + public static boolean isCorrosiveIron(Fluid f){ return containsTrait(f, FluidTrait.CORROSIVE_2); } @@ -103,6 +103,11 @@ public static void registerFluidProperties(){ fluidProperties.put(ModForgeFluids.biogas.getName(), new FluidProperties(1, 4, 1, EnumSymbol.NONE)); fluidProperties.put(ModForgeFluids.biofuel.getName(), new FluidProperties(1, 2, 0, EnumSymbol.NONE)); + + fluidProperties.put(ModForgeFluids.ethanol.getName(), new FluidProperties(2, 3, 1, EnumSymbol.NONE)); + fluidProperties.put(ModForgeFluids.fishoil.getName(), new FluidProperties(0, 1, 0, EnumSymbol.NONE)); + fluidProperties.put(ModForgeFluids.sunfloweroil.getName(), new FluidProperties(0, 1, 0, EnumSymbol.NONE)); + fluidProperties.put(ModForgeFluids.colloid.getName(), new FluidProperties(0, 0, 0, EnumSymbol.NONE)); fluidProperties.put(ModForgeFluids.nitan.getName(), new FluidProperties(2, 4, 1, EnumSymbol.NONE)); @@ -116,13 +121,13 @@ public static void registerFluidProperties(){ fluidProperties.put(ModForgeFluids.acid.getName(), new FluidProperties(3, 0, 3, EnumSymbol.OXIDIZER, FluidTrait.CORROSIVE)); fluidProperties.put(ModForgeFluids.sulfuric_acid.getName(), new FluidProperties(3, 0, 2, EnumSymbol.ACID, FluidTrait.CORROSIVE)); - fluidProperties.put(ModForgeFluids.nitric_acid.getName(), new FluidProperties(3, 0, 2, EnumSymbol.ACID, FluidTrait.CORROSIVE)); + fluidProperties.put(ModForgeFluids.nitric_acid.getName(), new FluidProperties(3, 0, 2, EnumSymbol.ACID, FluidTrait.CORROSIVE_2)); fluidProperties.put(ModForgeFluids.solvent.getName(), new FluidProperties(2, 3, 0, EnumSymbol.ACID, FluidTrait.CORROSIVE)); fluidProperties.put(ModForgeFluids.radiosolvent.getName(), new FluidProperties(3, 3, 0, EnumSymbol.ACID, FluidTrait.CORROSIVE_2)); - fluidProperties.put(ModForgeFluids.liquid_osmiridium.getName(), new FluidProperties(5, 0, 5, EnumSymbol.ACID, FluidTrait.CORROSIVE)); + fluidProperties.put(ModForgeFluids.nitroglycerin.getName(), new FluidProperties(0, 4, 0, EnumSymbol.NONE)); + fluidProperties.put(ModForgeFluids.liquid_osmiridium.getName(), new FluidProperties(5, 0, 5, EnumSymbol.OXIDIZER, FluidTrait.CORROSIVE_2)); - - fluidProperties.put(ModForgeFluids.watz.getName(), new FluidProperties(4, 0, 3, EnumSymbol.ACID, FluidTrait.CORROSIVE_2)); + fluidProperties.put(ModForgeFluids.watz.getName(), new FluidProperties(4, 0, 3, EnumSymbol.OXIDIZER, FluidTrait.CORROSIVE_2)); fluidProperties.put(ModForgeFluids.cryogel.getName(), new FluidProperties(2, 0, 0, EnumSymbol.CROYGENIC)); fluidProperties.put(ModForgeFluids.hydrogen.getName(), new FluidProperties(3, 4, 0, EnumSymbol.CROYGENIC)); @@ -145,8 +150,15 @@ public static void registerFluidProperties(){ fluidProperties.put(ModForgeFluids.plasma_ht.getName(), new FluidProperties(0, 4, 0, EnumSymbol.RADIATION, FluidTrait.NO_CONTAINER, FluidTrait.NO_ID)); fluidProperties.put(ModForgeFluids.plasma_put.getName(), new FluidProperties(2, 3, 1, EnumSymbol.RADIATION, FluidTrait.NO_CONTAINER, FluidTrait.NO_ID)); fluidProperties.put(ModForgeFluids.plasma_xm.getName(), new FluidProperties(0, 4, 1, EnumSymbol.RADIATION, FluidTrait.NO_CONTAINER, FluidTrait.NO_ID)); - fluidProperties.put(ModForgeFluids.plasma_bf.getName(), new FluidProperties(4, 5, 4, EnumSymbol.ANTIMATTER, FluidTrait.NO_CONTAINER, FluidTrait.NO_ID)); - fluidProperties.put(ModForgeFluids.uu_matter.getName(), new FluidProperties(5, 0, 5, EnumSymbol.ACID, FluidTrait.CORROSIVE)); + fluidProperties.put(ModForgeFluids.plasma_bf.getName(), new FluidProperties(4, 5, 4, EnumSymbol.RADIATION, FluidTrait.NO_CONTAINER, FluidTrait.NO_ID)); + fluidProperties.put(ModForgeFluids.uu_matter.getName(), new FluidProperties(5, 2, 5, EnumSymbol.ACID, FluidTrait.CORROSIVE)); + + fluidProperties.put(ModForgeFluids.toxic_fluid.getName(), new FluidProperties(3, 0, 4, EnumSymbol.RADIATION, FluidTrait.CORROSIVE_2)); + fluidProperties.put(ModForgeFluids.radwater_fluid.getName(), new FluidProperties(2, 0, 0, EnumSymbol.RADIATION)); + fluidProperties.put(ModForgeFluids.mud_fluid.getName(), new FluidProperties(4, 0, 1, EnumSymbol.ACID, FluidTrait.CORROSIVE_2)); + fluidProperties.put(ModForgeFluids.corium_fluid.getName(), new FluidProperties(4, 0, 2, EnumSymbol.RADIATION, FluidTrait.CORROSIVE_2)); + fluidProperties.put(ModForgeFluids.volcanic_lava_fluid.getName(), new FluidProperties(4, 1, 1, EnumSymbol.NOWATER)); + } public static class FluidProperties { diff --git a/src/main/java/com/hbm/forgefluid/ModForgeFluids.java b/src/main/java/com/hbm/forgefluid/ModForgeFluids.java index a9214cd439..af52bf59eb 100644 --- a/src/main/java/com/hbm/forgefluid/ModForgeFluids.java +++ b/src/main/java/com/hbm/forgefluid/ModForgeFluids.java @@ -76,6 +76,11 @@ public class ModForgeFluids { public static Fluid biogas = new Fluid("biogas", new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/biogas_still"), new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/biogas_flowing"), null, Color.WHITE); public static Fluid biofuel = new Fluid("biofuel", new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/biofuel_still"), new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/biofuel_flowing"), null, Color.WHITE); + public static Fluid ethanol = new Fluid("ethanol", new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/ethanol_still"), new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/ethanol_flowing"), null, Color.WHITE); + public static Fluid fishoil = new Fluid("fishoil", new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/fishoil_still"), new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/fishoil_flowing"), null, Color.WHITE); + public static Fluid sunfloweroil = new Fluid("sunfloweroil", new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/sunfloweroil_still"), new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/sunfloweroil_flowing"), null, Color.WHITE); + public static Fluid colloid = new Fluid("colloid", new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/colloid_still"), new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/colloid_flowing"), null, Color.WHITE); + public static Fluid nitan = new Fluid("nitan", new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/nitan_still"), new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/nitan_flowing"), null, Color.WHITE); public static Fluid uf6 = new Fluid("uf6", new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/uf6_still"), new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/uf6_flowing"), null, Color.WHITE); @@ -90,6 +95,8 @@ public class ModForgeFluids { public static Fluid nitric_acid = new Fluid("nitric_acid", new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/nitric_acid_still"), new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/nitric_acid_flowing"), null, Color.WHITE); public static Fluid solvent = new Fluid("solvent", new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/solvent_still"), new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/solvent_flowing"), null, Color.WHITE); public static Fluid radiosolvent = new Fluid("radiosolvent", new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/radiosolvent_still"), new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/radiosolvent_flowing"), null, Color.WHITE); + public static Fluid nitroglycerin = new Fluid("nitroglycerin", new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/nitroglycerin_still"), new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/nitroglycerin_flowing"), null, Color.WHITE); + public static Fluid liquid_osmiridium = new Fluid("liquid_osmiridium", new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/liquid_osmiridium_still"), new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/liquid_osmiridium_flowing"), null, Color.WHITE).setTemperature(573); public static Fluid watz = new Fluid("watz", new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/watz_still"), new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/watz_flowing"), null, Color.WHITE).setDensity(2500).setViscosity(3000).setLuminosity(5).setTemperature(2773); public static Fluid cryogel = new Fluid("cryogel", new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/cryogel_still"), new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/cryogel_flowing"), null, Color.WHITE).setTemperature(50); @@ -201,6 +208,15 @@ public static void init() { if(!FluidRegistry.registerFluid(biofuel)) biofuel = FluidRegistry.getFluid("biofuel"); + if(!FluidRegistry.registerFluid(ethanol)) + ethanol = FluidRegistry.getFluid("ethanol"); + if(!FluidRegistry.registerFluid(fishoil)) + fishoil = FluidRegistry.getFluid("fishoil"); + if(!FluidRegistry.registerFluid(sunfloweroil)) + sunfloweroil = FluidRegistry.getFluid("sunfloweroil"); + if(!FluidRegistry.registerFluid(colloid)) + colloid = FluidRegistry.getFluid("colloid"); + if(!FluidRegistry.registerFluid(nitan)) nitan = FluidRegistry.getFluid("nitan"); @@ -226,6 +242,8 @@ public static void init() { solvent = FluidRegistry.getFluid("solvent"); if(!FluidRegistry.registerFluid(radiosolvent)) radiosolvent = FluidRegistry.getFluid("radiosolvent"); + if(!FluidRegistry.registerFluid(nitroglycerin)) + nitroglycerin = FluidRegistry.getFluid("nitroglycerin"); if(!FluidRegistry.registerFluid(liquid_osmiridium)) liquid_osmiridium = FluidRegistry.getFluid("liquid_osmiridium"); if(!FluidRegistry.registerFluid(watz)) @@ -352,6 +370,11 @@ public static void setFromRegistry() { biogas = FluidRegistry.getFluid("biogas"); biofuel = FluidRegistry.getFluid("biofuel"); + ethanol = FluidRegistry.getFluid("ethanol"); + fishoil = FluidRegistry.getFluid("fishoil"); + sunfloweroil = FluidRegistry.getFluid("sunfloweroil"); + colloid = FluidRegistry.getFluid("colloid"); + nitan = FluidRegistry.getFluid("nitan"); uf6 = FluidRegistry.getFluid("uf6"); @@ -366,6 +389,7 @@ public static void setFromRegistry() { nitric_acid = FluidRegistry.getFluid("nitric_acid"); solvent = FluidRegistry.getFluid("solvent"); radiosolvent = FluidRegistry.getFluid("radiosolvent"); + nitroglycerin = FluidRegistry.getFluid("nitroglycerin"); liquid_osmiridium = FluidRegistry.getFluid("liquid_osmiridium"); watz = FluidRegistry.getFluid("watz"); cryogel = FluidRegistry.getFluid("cryogel"); diff --git a/src/main/java/com/hbm/handler/ArmorUtil.java b/src/main/java/com/hbm/handler/ArmorUtil.java index ce019f8760..f684a26fa1 100644 --- a/src/main/java/com/hbm/handler/ArmorUtil.java +++ b/src/main/java/com/hbm/handler/ArmorUtil.java @@ -43,7 +43,8 @@ public static void register() { ArmorRegistry.registerHazard(ModItems.ashglasses, HazardClass.LIGHT, HazardClass.SAND); ArmorRegistry.registerHazard(ModItems.attachment_mask, HazardClass.SAND); - + ArmorRegistry.registerHazard(ModItems.spider_milk, HazardClass.LIGHT); + ArmorRegistry.registerHazard(ModItems.asbestos_helmet, HazardClass.SAND, HazardClass.LIGHT); ArmorRegistry.registerHazard(ModItems.hazmat_helmet, HazardClass.SAND); ArmorRegistry.registerHazard(ModItems.hazmat_helmet_red, HazardClass.SAND); diff --git a/src/main/java/com/hbm/handler/jei/JEIConfig.java b/src/main/java/com/hbm/handler/jei/JEIConfig.java index c955e5958c..b72550c301 100644 --- a/src/main/java/com/hbm/handler/jei/JEIConfig.java +++ b/src/main/java/com/hbm/handler/jei/JEIConfig.java @@ -12,6 +12,7 @@ import com.hbm.inventory.gui.GUIBook; import com.hbm.inventory.gui.GUICrystallizer; import com.hbm.inventory.gui.GUIHadron; +import com.hbm.inventory.gui.GUIMixer; import com.hbm.inventory.gui.GUIMachineAssembler; import com.hbm.inventory.gui.GUIMachineBoiler; import com.hbm.inventory.gui.GUIMachineBoilerElectric; @@ -54,6 +55,7 @@ public class JEIConfig implements IModPlugin { public static final String ASSEMBLY = "hbm.assembly"; public static final String CHEMPLANT = "hbm.chemplant"; + public static final String MIXER = "hbm.mixer"; public static final String CYCLOTRON = "hbm.cyclotron"; public static final String PRESS = "hbm.press"; public static final String ALLOY = "hbm.alloy"; @@ -97,6 +99,7 @@ public void register(IModRegistry registry) { registry.addRecipeCatalyst(new ItemStack(ModBlocks.machine_assembler), ASSEMBLY); registry.addRecipeCatalyst(new ItemStack(ModBlocks.machine_chemplant), CHEMPLANT); + registry.addRecipeCatalyst(new ItemStack(ModBlocks.machine_mixer), MIXER); registry.addRecipeCatalyst(new ItemStack(ModBlocks.machine_cyclotron), CYCLOTRON); registry.addRecipeCatalyst(new ItemStack(ModBlocks.machine_schrabidium_transmutator), TRANSMUTATION); registry.addRecipeCatalyst(new ItemStack(ModBlocks.machine_press), PRESS); @@ -142,6 +145,7 @@ public void register(IModRegistry registry) { // registry.addRecipes(ItemAssemblyTemplate.recipes, ASSEMBLY); registry.addRecipes(JeiRecipes.getChemistryRecipes(), CHEMPLANT); + registry.addRecipes(JeiRecipes.getMixerRecipes(), MIXER); registry.addRecipes(JeiRecipes.getCyclotronRecipes(), CYCLOTRON); registry.addRecipes(JeiRecipes.getTransmutationRecipes(), TRANSMUTATION); registry.addRecipes(JeiRecipes.getPressRecipes(), PRESS); @@ -179,6 +183,7 @@ public void register(IModRegistry registry) { registry.addRecipeClickArea(GUIMachineAssembler.class, 45, 83, 82, 30, ASSEMBLY); registry.addRecipeClickArea(GUIMachineChemplant.class, 45, 90, 85, 15, CHEMPLANT); + registry.addRecipeClickArea(GUIMixer.class, 62, 36, 52, 44, MIXER); registry.addRecipeClickArea(GUIMachineCyclotron.class, 50, 24, 40, 40, CYCLOTRON); registry.addRecipeClickArea(GUIMachinePress.class, 80, 35, 15, 15, PRESS); registry.addRecipeClickArea(GUIMachineEPress.class, 80, 35, 15, 15, PRESS); @@ -282,6 +287,7 @@ public void registerCategories(IRecipeCategoryRegistration registry) { new ShredderRecipeHandler(help), new AssemblerRecipeHandler(help), new ChemplantRecipeHandler(help), + new MixerRecipeHandler(help), new BoilerRecipeHandler(help), new RefineryRecipeHandler(help), new CrackingRecipeHandler(help), diff --git a/src/main/java/com/hbm/handler/jei/JeiRecipes.java b/src/main/java/com/hbm/handler/jei/JeiRecipes.java index bf62cea777..29734b1eda 100644 --- a/src/main/java/com/hbm/handler/jei/JeiRecipes.java +++ b/src/main/java/com/hbm/handler/jei/JeiRecipes.java @@ -20,6 +20,7 @@ import com.hbm.inventory.AnvilSmithingRecipe; import com.hbm.inventory.AssemblerRecipes; import com.hbm.inventory.ChemplantRecipes; +import com.hbm.inventory.MixerRecipes; import com.hbm.inventory.BreederRecipes; import com.hbm.inventory.BreederRecipes.BreederRecipe; import com.hbm.inventory.WasteDrumRecipes; @@ -74,6 +75,7 @@ public class JeiRecipes { private static List chemRecipes = null; + private static List mixerRecipes = null; private static List cyclotronRecipes = null; private static List pressRecipes = null; private static List alloyFurnaceRecipes = null; @@ -122,7 +124,31 @@ public void getIngredients(IIngredients ingredients) { ingredients.setInputLists(VanillaTypes.ITEM, in); ingredients.setOutputs(VanillaTypes.ITEM, outputs); } + } + + public static class MixerRecipe implements IRecipeWrapper { + + private final List> inputs; + private final ItemStack output; + public MixerRecipe(List inputs, ItemStack output) { + List> list = new ArrayList<>(inputs.size()); + for(AStack s : inputs) + list.add(s.getStackList()); + this.inputs = list; + this.output = output; + } + + @Override + public void getIngredients(IIngredients ingredients) { + List> in = Library.copyItemStackListList(inputs); // list of inputs and their list of possible items + ingredients.setInputLists(VanillaTypes.ITEM, in); + ingredients.setOutput(VanillaTypes.ITEM, output); + } + + public int getInputSize(){ + return inputs.size(); + } } public static class CyclotronRecipe implements IRecipeWrapper { @@ -678,6 +704,32 @@ public static List getChemistryRecipes() { return chemRecipes; } + + public static List getMixerRecipes() { + if(mixerRecipes != null) + return mixerRecipes; + mixerRecipes = new ArrayList(); + + for(Fluid f : MixerRecipes.recipesDurations.keySet()){ + + List inputs = new ArrayList(3); + + AStack inputItem = MixerRecipes.getInputItem(f); + FluidStack[] inputFluids = MixerRecipes.getInputFluidStacks(f); + if(inputItem != null) + inputs.add(inputItem); + if(inputFluids != null){ + if(inputFluids.length >= 1) inputs.add(new NbtComparableStack(ItemFluidIcon.getStackWithQuantity(inputFluids[0].getFluid(), inputFluids[0].amount))); + if(inputFluids.length == 2) inputs.add(new NbtComparableStack(ItemFluidIcon.getStackWithQuantity(inputFluids[1].getFluid(), inputFluids[1].amount))); + } + + ItemStack output = ItemFluidIcon.getStackWithQuantity(f, MixerRecipes.getFluidOutputAmount(f)); + + mixerRecipes.add(new MixerRecipe(inputs, output)); + } + + return mixerRecipes; + } public static List getCyclotronRecipes() { if(cyclotronRecipes != null) diff --git a/src/main/java/com/hbm/handler/jei/MixerRecipeHandler.java b/src/main/java/com/hbm/handler/jei/MixerRecipeHandler.java new file mode 100644 index 0000000000..18073e82f0 --- /dev/null +++ b/src/main/java/com/hbm/handler/jei/MixerRecipeHandler.java @@ -0,0 +1,64 @@ +package com.hbm.handler.jei; + +import com.hbm.handler.jei.JeiRecipes.MixerRecipe; +import com.hbm.lib.RefStrings; + +import mezz.jei.api.IGuiHelper; +import mezz.jei.api.gui.IDrawable; +import mezz.jei.api.gui.IGuiItemStackGroup; +import mezz.jei.api.gui.IRecipeLayout; +import mezz.jei.api.ingredients.IIngredients; +import mezz.jei.api.recipe.IRecipeCategory; +import net.minecraft.util.ResourceLocation; + +public class MixerRecipeHandler implements IRecipeCategory { + + public static ResourceLocation gui_rl = new ResourceLocation(RefStrings.MODID + ":textures/gui/jei/gui_nei_three_to_one.png"); + + protected final IDrawable background; + + public MixerRecipeHandler(IGuiHelper help) { + background = help.createDrawable(gui_rl, 34, 34, 108, 18); + } + + @Override + public String getUid() { + return JEIConfig.MIXER; + } + + @Override + public String getTitle() { + return "Mixer"; + } + + @Override + public String getModName() { + return RefStrings.MODID; + } + + @Override + public IDrawable getBackground() { + return background; + } + + @Override + public void setRecipe(IRecipeLayout recipeLayout, MixerRecipe recipeWrapper, IIngredients ingredients) { + IGuiItemStackGroup guiItemStacks = recipeLayout.getItemStacks(); + int rec_size = recipeWrapper.getInputSize(); + if(rec_size == 1){ + guiItemStacks.init(0, true, 36, 0); + } else if(rec_size == 2){ + guiItemStacks.init(0, true, 18, 0); + guiItemStacks.init(1, true, 36, 0); + } else if(rec_size == 3){ + guiItemStacks.init(0, true, 0, 0); + guiItemStacks.init(1, true, 18, 0); + guiItemStacks.init(2, true, 36, 0); + } + + guiItemStacks.init(3, false, 90, 0); + + guiItemStacks.set(ingredients); + } + +} diff --git a/src/main/java/com/hbm/interfaces/IReactor.java b/src/main/java/com/hbm/interfaces/IReactor.java deleted file mode 100644 index e2fe8adfcc..0000000000 --- a/src/main/java/com/hbm/interfaces/IReactor.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.hbm.interfaces; - -import net.minecraft.world.World; - -public interface IReactor { - - boolean isStructureValid(World world); - - boolean isCoatingValid(World world); - - boolean hasFuse(); - - int getWaterScaled(int i); - - int getCoolantScaled(int i); - - long getPowerScaled(long i); - - int getHeatScaled(int i); - -} diff --git a/src/main/java/com/hbm/inventory/BedrockOreRegistry.java b/src/main/java/com/hbm/inventory/BedrockOreRegistry.java index f84688c441..fdd5cac4ff 100644 --- a/src/main/java/com/hbm/inventory/BedrockOreRegistry.java +++ b/src/main/java/com/hbm/inventory/BedrockOreRegistry.java @@ -9,6 +9,7 @@ import com.hbm.forgefluid.ModForgeFluids; import com.hbm.interfaces.Spaghetti; import com.hbm.lib.Library; +import com.hbm.config.BedrockOreJsonConfig; import com.hbm.util.WeightedRandomObject; import net.minecraft.init.Items; @@ -23,15 +24,15 @@ @Spaghetti("everything") public class BedrockOreRegistry { - public static HashMap oreIndexes = new HashMap<>(); - public static HashMap oreToIndexes = new HashMap<>(); + public static HashMap oreIndexes = new HashMap(); + public static HashMap oreToIndexes = new HashMap(); - public static HashMap oreResults = new HashMap<>(); - public static HashMap oreColors = new HashMap<>(); - public static HashMap oreNames = new HashMap<>(); - public static HashMap oreTiers = new HashMap<>(); + public static HashMap oreResults = new HashMap(); + public static HashMap oreColors = new HashMap(); + public static HashMap oreNames = new HashMap(); + public static HashMap oreTiers = new HashMap(); - public static List oreCasino = new ArrayList(); + public static HashMap> oreCasino = new HashMap(); public static void registerBedrockOres(){ collectBedrockOres(); @@ -110,13 +111,21 @@ public static int getTierWeight(int tier){ } public static void fillOreCasino(){ - for(String oreName : oreResults.keySet()){ - oreCasino.add(new WeightedRandomObject(oreName, getTierWeight(getOreTier(oreName)))); + for(Integer dimID : BedrockOreJsonConfig.dimOres.keySet()){ + + List oreWeights = new ArrayList(); + for(String oreName : oreResults.keySet()){ + + if(BedrockOreJsonConfig.isOreAllowed(dimID, oreName)) + oreWeights.add(new WeightedRandomObject(oreName, getTierWeight(getOreTier(oreName)))); + } + oreCasino.put(dimID, oreWeights); } } - public static String rollOreName(Random rand){ - return WeightedRandom.getRandomItem(rand, oreCasino).asString(); + public static String rollOreName(int dimID, Random rand){ + if(oreCasino.get(dimID).isEmpty()) return null; + return WeightedRandom.getRandomItem(rand, oreCasino.get(dimID)).asString(); } public static int getDirectOreTier(String oreName){ diff --git a/src/main/java/com/hbm/inventory/ChemplantRecipes.java b/src/main/java/com/hbm/inventory/ChemplantRecipes.java index ac7d5b33d9..7a1d947241 100644 --- a/src/main/java/com/hbm/inventory/ChemplantRecipes.java +++ b/src/main/java/com/hbm/inventory/ChemplantRecipes.java @@ -103,7 +103,7 @@ public static void registerRecipes() { makeRecipe(EnumChemistryTemplate.BP_BIOGAS, new AStack[] { new ComparableStack(ModItems.biomass, 16) }, null, null, new FluidStack[]{ new FluidStack(ModForgeFluids.biogas, 4000) }, 200); - makeRecipe(EnumChemistryTemplate.BP_BIOFUEL, null, new FluidStack[]{ new FluidStack(ModForgeFluids.biogas, 2000) }, null, new FluidStack[]{ new FluidStack(ModForgeFluids.biofuel, 1000) }, 100); + makeRecipe(EnumChemistryTemplate.BP_BIOFUEL, null, new FluidStack[]{ new FluidStack(ModForgeFluids.biogas, 1500), new FluidStack(ModForgeFluids.ethanol, 250) }, null, new FluidStack[]{ new FluidStack(ModForgeFluids.biofuel, 1000) }, 100); makeRecipe(EnumChemistryTemplate.OIL_SAND, new AStack[] { new ComparableStack(ModBlocks.ore_oil_sand, 16), new OreDictStack(KEY_OIL_TAR, 1) }, null, new AStack[] { new ComparableStack(Blocks.SAND, 16) }, new FluidStack[]{ new FluidStack(ModForgeFluids.bitumen, 1000) }, 200); @@ -143,7 +143,7 @@ public static void registerRecipes() { makeRecipe(EnumChemistryTemplate.RUBBER, new AStack[] { new OreDictStack(S.dust(), 1) }, new FluidStack[]{ new FluidStack(ModForgeFluids.unsaturateds, 500) }, new AStack[] { new ComparableStack(ModItems.ingot_rubber, 1) }, null, 100); - makeRecipe(EnumChemistryTemplate.DYNAMITE, new AStack[] { new ComparableStack(Items.SUGAR), new OreDictStack(KNO.dust()), new OreDictStack("sand") }, new FluidStack[]{ new FluidStack(ModForgeFluids.sulfuric_acid, 1000) }, new AStack[] { new ComparableStack(ModItems.ball_dynamite, 2) }, null, 50); + makeRecipe(EnumChemistryTemplate.DYNAMITE, new AStack[] { new ComparableStack(Items.SUGAR), new OreDictStack(KNO.dust()), new OreDictStack(KEY_SAND) }, new FluidStack[]{ new FluidStack(ModForgeFluids.sulfuric_acid, 1000) }, new AStack[] { new ComparableStack(ModItems.ball_dynamite, 2) }, null, 50); makeRecipe(EnumChemistryTemplate.TNT, new AStack[] { new OreDictStack(KNO.dust(), 1) }, new FluidStack[]{ new FluidStack(ModForgeFluids.aromatics, 500) }, new AStack[] { new ComparableStack(ModItems.ball_tnt, 4) }, null, 150); diff --git a/src/main/java/com/hbm/inventory/CrystallizerRecipes.java b/src/main/java/com/hbm/inventory/CrystallizerRecipes.java index ba3388bf91..850d5ddad4 100644 --- a/src/main/java/com/hbm/inventory/CrystallizerRecipes.java +++ b/src/main/java/com/hbm/inventory/CrystallizerRecipes.java @@ -85,6 +85,7 @@ public static void register() { addRecipe(new ComparableStack(ModItems.powder_semtex_mix), new FluidStack(ModForgeFluids.acid, 500), new ItemStack(ModItems.ingot_semtex)); addRecipe(new ComparableStack(ModItems.powder_desh_ready), new FluidStack(ModForgeFluids.acid, 500), new ItemStack(ModItems.ingot_desh)); addRecipe(new ComparableStack(ModItems.powder_meteorite), new FluidStack(ModForgeFluids.acid, 500), new ItemStack(ModItems.fragment_meteorite, 1)); + addRecipe(CD.dust(), new FluidStack(ModForgeFluids.fishoil, 250), new ItemStack(ModItems.ingot_rubber)); addRecipe(new ComparableStack(ModItems.powder_impure_osmiridium), new FluidStack(ModForgeFluids.schrabidic, 1000), new ItemStack(ModItems.crystal_osmiridium, 1)); addRecipe(new ComparableStack(ModItems.meteorite_sword_treated), new FluidStack(ModForgeFluids.sulfuric_acid, 8000), new ItemStack(ModItems.meteorite_sword_etched, 1)); @@ -99,6 +100,10 @@ public static void register() { addRecipe(new ComparableStack(ModItems.coal_infernal), new FluidStack(ModForgeFluids.sulfuric_acid, 500), new ItemStack(ModItems.solid_fuel)); addRecipe(new ComparableStack(ModItems.fallout), new FluidStack(ModForgeFluids.corium_fluid, 500), new ItemStack(ModItems.powder_balefire)); + addRecipe(KEY_SAND, new FluidStack(ModForgeFluids.colloid, 1000), new ItemStack(Blocks.CLAY)); + addRecipe(new ComparableStack(ModBlocks.sand_quartz), new FluidStack(ModForgeFluids.nitroglycerin, 1000), new ItemStack(ModItems.ball_dynamite, 16)); + addRecipe(NETHERQUARTZ.dust(), new FluidStack(ModForgeFluids.nitroglycerin, 250), new ItemStack(ModItems.ball_dynamite, 4)); + List quartz = OreDictionary.getOres("crystalCertusQuartz"); if(quartz != null && !quartz.isEmpty()) { diff --git a/src/main/java/com/hbm/inventory/FluidCombustionRecipes.java b/src/main/java/com/hbm/inventory/FluidCombustionRecipes.java index 9bbf4fba38..ea97332af8 100644 --- a/src/main/java/com/hbm/inventory/FluidCombustionRecipes.java +++ b/src/main/java/com/hbm/inventory/FluidCombustionRecipes.java @@ -23,6 +23,7 @@ public static void registerFluidCombustionRecipes() { addBurnableFluid(ModForgeFluids.hotcrackoil, 10); addBurnableFluid(ModForgeFluids.gas, 10); + addBurnableFluid(ModForgeFluids.fishoil, 15); addBurnableFluid(ModForgeFluids.lubricant, 20); addBurnableFluid(ModForgeFluids.aromatics, 25); addBurnableFluid(ModForgeFluids.petroleum, 25); @@ -30,6 +31,7 @@ public static void registerFluidCombustionRecipes() { addBurnableFluid(ModForgeFluids.bitumen, 35); addBurnableFluid(ModForgeFluids.heavyoil, 50); addBurnableFluid(ModForgeFluids.smear, 50); + addBurnableFluid(ModForgeFluids.ethanol, 75); addBurnableFluid(ModForgeFluids.reclaimed, 100); addBurnableFluid(ModForgeFluids.petroil, 125); addBurnableFluid(ModForgeFluids.naphtha, 125); diff --git a/src/main/java/com/hbm/inventory/MixerRecipes.java b/src/main/java/com/hbm/inventory/MixerRecipes.java new file mode 100644 index 0000000000..f37e6ed0dc --- /dev/null +++ b/src/main/java/com/hbm/inventory/MixerRecipes.java @@ -0,0 +1,112 @@ +package com.hbm.inventory; + +import java.util.HashMap; + +import com.hbm.items.ModItems; +import com.hbm.forgefluid.ModForgeFluids; +import com.hbm.inventory.RecipesCommon.AStack; +import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.inventory.ChemplantRecipes; +import com.hbm.inventory.ChemplantRecipes.EnumChemistryTemplate; + +import net.minecraft.init.Items; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.oredict.OreDictionary; + +public class MixerRecipes { + + public static HashMap recipesFluidInputs = new HashMap(); + public static HashMap recipesFluidOutputAmount = new HashMap(); + public static HashMap recipesDurations = new HashMap(); + public static HashMap recipesItemInputs = new HashMap(); + + public static void copyChemplantRecipes() { + for(EnumChemistryTemplate enumX : EnumChemistryTemplate.values()){ + FluidStack[] fStacks = ChemplantRecipes.recipeFluidOutputs.get(enumX); + if(!(fStacks != null && fStacks.length == 1)){ + continue; + } + AStack[] itemOut = ChemplantRecipes.recipeItemOutputs.get(enumX); + if(itemOut != null) + continue; + AStack[] itemInputs = ChemplantRecipes.recipeItemInputs.get(enumX); + AStack itemInput = null; + if(itemInputs != null) + if(itemInputs.length == 0 ||itemInputs.length > 1){ + continue; + } else { + itemInput = itemInputs[0]; + } + addRecipe(fStacks[0], ChemplantRecipes.recipeFluidInputs.get(enumX), itemInput, ChemplantRecipes.recipeDurations.get(enumX)); + } + } + + public static void registerRecipes() { + addRecipe(new FluidStack(ModForgeFluids.ethanol, 100), new FluidStack[]{ new FluidStack(FluidRegistry.WATER, 500)}, new ComparableStack(Items.SUGAR), 200); + addRecipe(new FluidStack(ModForgeFluids.colloid, 500), new FluidStack[]{ new FluidStack(FluidRegistry.WATER, 500)}, new ComparableStack(ModItems.dust), 20); + addRecipe(new FluidStack(ModForgeFluids.fishoil, 100), null, new ComparableStack(Items.FISH, 1, OreDictionary.WILDCARD_VALUE), 50); + addRecipe(new FluidStack(ModForgeFluids.sunfloweroil, 100), null, new ComparableStack(Blocks.DOUBLE_PLANT, 1, 0), 50); + addRecipe(new FluidStack(ModForgeFluids.nitroglycerin, 1000), new FluidStack[]{ new FluidStack(ModForgeFluids.petroleum, 1000), new FluidStack(ModForgeFluids.nitric_acid, 1000)}, null, 20); + addRecipe(new FluidStack(ModForgeFluids.biofuel, 250), new FluidStack[]{ new FluidStack(ModForgeFluids.fishoil, 500), new FluidStack(ModForgeFluids.sunfloweroil, 500)}, null, 20); + addRecipe(new FluidStack(ModForgeFluids.lubricant, 1000), new FluidStack[]{ new FluidStack(ModForgeFluids.ethanol, 200), new FluidStack(ModForgeFluids.sunfloweroil, 800)}, null, 20); + } + + public static void addRecipe(FluidStack output, FluidStack[] inputs, AStack inputItem, int duration){ + Fluid f = output.getFluid(); + if(inputs != null) + recipesFluidInputs.put(f, inputs); + recipesFluidOutputAmount.put(f, output.amount); + recipesDurations.put(f, duration > 0 ? duration : 100); + if(inputItem != null) + recipesItemInputs.put(f, inputItem); + } + + public static int getFluidOutputAmount(Fluid output){ + Integer x = recipesFluidOutputAmount.get(output); + if(x == null) return 1; + return x; + } + + public static int getRecipeDuration(Fluid output){ + Integer x = recipesDurations.get(output); + if(x == null) return 20; + return x; + } + + public static boolean hasMixerRecipe(Fluid output){ + return recipesDurations.containsKey(output); + } + + public static FluidStack[] getInputFluidStacks(Fluid output){ + return recipesFluidInputs.get(output); + } + + public static boolean matchesInputItem(Fluid output, ItemStack inputItem){ + if(output == null) return false; + AStack in = recipesItemInputs.get(output); + if(in == null) return true; + return in.matchesRecipe(inputItem, true); + } + + public static int getInputItemCount(Fluid output){ + AStack in = recipesItemInputs.get(output); + if(in == null) return 0; + return in.count(); + } + + public static AStack getInputItem(Fluid output){ + return recipesItemInputs.get(output); + } + + public static Fluid[] getInputFluids(Fluid output){ + FluidStack[] f = recipesFluidInputs.get(output); + if(f == null) return null; + if(f.length == 1) return new Fluid[]{ f[0].getFluid() }; + if(f.length == 2) return new Fluid[]{ f[0].getFluid(), f[1].getFluid() }; + return null; + } +} diff --git a/src/main/java/com/hbm/inventory/RecipesCommon.java b/src/main/java/com/hbm/inventory/RecipesCommon.java index 33daf0f18e..b8438057ad 100644 --- a/src/main/java/com/hbm/inventory/RecipesCommon.java +++ b/src/main/java/com/hbm/inventory/RecipesCommon.java @@ -477,6 +477,4 @@ public String toString() { return "OreDictStack: name, " + name + ", stacksize, " + stacksize; } } - - } diff --git a/src/main/java/com/hbm/inventory/container/ContainerChemfac.java b/src/main/java/com/hbm/inventory/container/ContainerChemfac.java index 46651b45b8..9db594b1f2 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerChemfac.java +++ b/src/main/java/com/hbm/inventory/container/ContainerChemfac.java @@ -2,6 +2,7 @@ import com.hbm.inventory.SlotUpgrade; import com.hbm.tileentity.machine.TileEntityMachineChemfac; + import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; @@ -61,8 +62,37 @@ public boolean canInteractWith(@Nonnull EntityPlayer playerIn) { } @Override - @Nonnull - public ItemStack transferStackInSlot(@Nonnull EntityPlayer playerIn, int index) { - return ItemStack.EMPTY; - } + public ItemStack transferStackInSlot(EntityPlayer p_82846_1_, int par2) + { + ItemStack var3 = ItemStack.EMPTY; + Slot var4 = (Slot) this.inventorySlots.get(par2); + + if (var4 != null && var4.getHasStack()) + { + ItemStack var5 = var4.getStack(); + var3 = var5.copy(); + + if (par2 <= 3) { + if (!this.mergeItemStack(var5, 4, this.inventorySlots.size(), true)) + { + return ItemStack.EMPTY; + } + } + else if (!this.mergeItemStack(var5, 0, 3, false)) + { + return ItemStack.EMPTY; + } + + if (var5.getCount() == 0) + { + var4.putStack(ItemStack.EMPTY); + } + else + { + var4.onSlotChanged(); + } + } + + return var3; + } } diff --git a/src/main/java/com/hbm/inventory/container/ContainerDiFurnaceRTG.java b/src/main/java/com/hbm/inventory/container/ContainerDiFurnaceRTG.java index bbe159204f..544209e598 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerDiFurnaceRTG.java +++ b/src/main/java/com/hbm/inventory/container/ContainerDiFurnaceRTG.java @@ -45,7 +45,7 @@ public boolean canInteractWith(EntityPlayer player) { return bFurnace.isUseableByPlayer(player); } - @Override + @Override public ItemStack transferStackInSlot(EntityPlayer p_82846_1_, int par2) { ItemStack var3 = ItemStack.EMPTY; diff --git a/src/main/java/com/hbm/inventory/container/ContainerFWatzCore.java b/src/main/java/com/hbm/inventory/container/ContainerFWatzCore.java index 339919ab87..4bfb77bb55 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerFWatzCore.java +++ b/src/main/java/com/hbm/inventory/container/ContainerFWatzCore.java @@ -22,8 +22,6 @@ public ContainerFWatzCore(InventoryPlayer invPlayer, TileEntityFWatzCore tedf) { diFurnace = tedf; //battery input this.addSlotToContainer(new SlotItemHandler(tedf.inventory, 0, 130, 90)); - // fuse - this.addSlotToContainer(new SlotItemHandler(tedf.inventory, 1, 30, 90)); //S.A.F.E. Core this.addSlotToContainer(new SlotItemHandler(tedf.inventory, 2, 80, 45)); //Fluid Input Slots diff --git a/src/main/java/com/hbm/inventory/container/ContainerMixer.java b/src/main/java/com/hbm/inventory/container/ContainerMixer.java new file mode 100644 index 0000000000..944233424f --- /dev/null +++ b/src/main/java/com/hbm/inventory/container/ContainerMixer.java @@ -0,0 +1,80 @@ +package com.hbm.inventory.container; + +import com.hbm.inventory.SlotUpgrade; +import com.hbm.tileentity.machine.TileEntityMachineMixer; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import net.minecraftforge.items.SlotItemHandler; + +public class ContainerMixer extends Container { + + private TileEntityMachineMixer mixer; + + public ContainerMixer(InventoryPlayer player, TileEntityMachineMixer mixer) { + this.mixer = mixer; + + //Battery + this.addSlotToContainer(new SlotItemHandler(mixer.inventory, 0, 23, 77)); + //Item Input + this.addSlotToContainer(new SlotItemHandler(mixer.inventory, 1, 43, 77)); + //Fluid ID + this.addSlotToContainer(new SlotItemHandler(mixer.inventory, 2, 117, 77)); + //Upgrades + this.addSlotToContainer(new SlotUpgrade(mixer.inventory, 3, 137, 24)); + this.addSlotToContainer(new SlotUpgrade(mixer.inventory, 4, 137, 42)); + + for(int i = 0; i < 3; i++) { + for(int j = 0; j < 9; j++) { + this.addSlotToContainer(new Slot(player, j + i * 9 + 9, 8 + j * 18, 122 + i * 18)); + } + } + + for(int i = 0; i < 9; i++) { + this.addSlotToContainer(new Slot(player, i, 8 + i * 18, 180)); + } + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer p_82846_1_, int par2) + { + ItemStack var3 = ItemStack.EMPTY; + Slot var4 = (Slot) this.inventorySlots.get(par2); + + if (var4 != null && var4.getHasStack()) + { + ItemStack var5 = var4.getStack(); + var3 = var5.copy(); + + if (par2 <= 3) { + if (!this.mergeItemStack(var5, 4, this.inventorySlots.size(), true)) + { + return ItemStack.EMPTY; + } + } + else if (!this.mergeItemStack(var5, 0, 3, false)) + { + return ItemStack.EMPTY; + } + + if (var5.getCount() == 0) + { + var4.putStack(ItemStack.EMPTY); + } + else + { + var4.onSlotChanged(); + } + } + + return var3; + } + + @Override + public boolean canInteractWith(EntityPlayer player) { + return mixer.isUseableByPlayer(player); + } +} diff --git a/src/main/java/com/hbm/inventory/gui/GUIBarrel.java b/src/main/java/com/hbm/inventory/gui/GUIBarrel.java index d4b96bc481..1a7c802f45 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIBarrel.java +++ b/src/main/java/com/hbm/inventory/gui/GUIBarrel.java @@ -36,7 +36,7 @@ public void drawScreen(int mouseX, int mouseY, float f) { super.drawScreen(mouseX, mouseY, f); //tank.tank.renderTankInfo(this, mouseX, mouseY, guiLeft + 71, guiTop + 69 - 52, 34, 52); - FFUtils.renderTankInfo(this, mouseX, mouseY, guiLeft + 71, guiTop + 69 - 52, 34, 52, tank.tank); + FFUtils.renderTankInfo(this, mouseX, mouseY, guiLeft + 71, guiTop + 68 - 52, 34, 52, tank.tank); super.renderHoveredToolTip(mouseX, mouseY); } diff --git a/src/main/java/com/hbm/inventory/gui/GUIFWatzCore.java b/src/main/java/com/hbm/inventory/gui/GUIFWatzCore.java index 53b4f6dc12..fd71d46de9 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIFWatzCore.java +++ b/src/main/java/com/hbm/inventory/gui/GUIFWatzCore.java @@ -2,12 +2,19 @@ import org.lwjgl.opengl.GL11; +import java.io.IOException; + import com.hbm.forgefluid.FFUtils; import com.hbm.inventory.container.ContainerFWatzCore; import com.hbm.lib.RefStrings; +import com.hbm.packet.NBTControlPacket; +import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.machine.TileEntityFWatzCore; import net.minecraft.client.Minecraft; +import net.minecraft.init.SoundEvents; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.util.ResourceLocation; @@ -15,11 +22,11 @@ public class GUIFWatzCore extends GuiInfoContainer { private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/gui_fwatz_multiblock.png"); - private TileEntityFWatzCore diFurnace; + private TileEntityFWatzCore fwatz; public GUIFWatzCore(InventoryPlayer invPlayer, TileEntityFWatzCore tedf) { super(new ContainerFWatzCore(invPlayer, tedf)); - diFurnace = tedf; + fwatz = tedf; this.xSize = 176; this.ySize = 222; @@ -29,21 +36,31 @@ public GUIFWatzCore(InventoryPlayer invPlayer, TileEntityFWatzCore tedf) { public void drawScreen(int mouseX, int mouseY, float f) { super.drawScreen(mouseX, mouseY, f); - FFUtils.renderTankInfo(this, mouseX, mouseY, guiLeft + 53, guiTop + 85, 70, 18, diFurnace.tanks[0], diFurnace.tankTypes[0]); - FFUtils.renderTankInfo(this, mouseX, mouseY, guiLeft + 7, guiTop + 17, 18, 72, diFurnace.tanks[1], diFurnace.tankTypes[1]); - FFUtils.renderTankInfo(this, mouseX, mouseY, guiLeft + 151, guiTop + 17, 18, 72, diFurnace.tanks[2], diFurnace.tankTypes[2]); - this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 29, guiTop + 107, 118, 18, diFurnace.power, TileEntityFWatzCore.maxPower); + FFUtils.renderTankInfo(this, mouseX, mouseY, guiLeft + 53, guiTop + 85, 70, 18, fwatz.tanks[0], fwatz.tankTypes[0]); + FFUtils.renderTankInfo(this, mouseX, mouseY, guiLeft + 7, guiTop + 17, 18, 72, fwatz.tanks[1], fwatz.tankTypes[1]); + FFUtils.renderTankInfo(this, mouseX, mouseY, guiLeft + 151, guiTop + 17, 18, 72, fwatz.tanks[2], fwatz.tankTypes[2]); + this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 29, guiTop + 107, 118, 18, fwatz.power, TileEntityFWatzCore.maxPower); super.renderHoveredToolTip(mouseX, mouseY); } @Override protected void drawGuiContainerForegroundLayer(int i, int j) { - String name = this.diFurnace.hasCustomInventoryName() ? this.diFurnace.getInventoryName() : I18n.format(this.diFurnace.getInventoryName()); + String name = this.fwatz.hasCustomInventoryName() ? this.fwatz.getInventoryName() : I18n.format(this.fwatz.getInventoryName()); this.fontRenderer.drawString(name, this.xSize / 2 - this.fontRenderer.getStringWidth(name) / 2, 6, 4210752); this.fontRenderer.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); } + @Override + protected void mouseClicked(int mouseX, int mouseY, int i) throws IOException { + super.mouseClicked(mouseX, mouseY, i); + //toggle column selection + if(guiLeft + 29 <= mouseX && guiLeft + 29 + 18 > mouseX && guiTop + 89 < mouseY && guiTop + 89 + 18 >= mouseY) { + mc.getSoundHandler().playSound(PositionedSoundRecord.getMasterRecord(SoundEvents.UI_BUTTON_CLICK, 1.0F)); + PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(new NBTTagCompound(), this.fwatz.getPos())); + } + } + @Override protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { super.drawDefaultBackground(); @@ -51,17 +68,20 @@ protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2 Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); - int k = (int)diFurnace.getPowerScaled(118); + int k = (int)fwatz.getPowerScaled(116); drawTexturedModalRect(guiLeft + 30, guiTop + 108, 0, 222, k, 16); - if(diFurnace.isRunning()) + if(fwatz.isRunning()) drawTexturedModalRect(guiLeft + 64, guiTop + 29, 176, 24, 48, 48); + + if(fwatz.isOn) + drawTexturedModalRect(guiLeft + 29, guiTop + 89, 192, 0, 18, 18); - int m = diFurnace.getSingularityType(); + int m = fwatz.getSingularityType(); drawTexturedModalRect(guiLeft + 80, guiTop + 20, 176, 4 * m, 16, 4); - FFUtils.drawLiquid(diFurnace.tanks[0], guiLeft, guiTop, zLevel, 68, 16, 54, 130); - FFUtils.drawLiquid(diFurnace.tanks[1], guiLeft, guiTop, zLevel, 16, 70, 8, 116); - FFUtils.drawLiquid(diFurnace.tanks[2], guiLeft, guiTop, zLevel, 16, 70, 152, 116); + FFUtils.drawLiquid(fwatz.tanks[0], guiLeft, guiTop, zLevel, 68, 16, 54, 130); + FFUtils.drawLiquid(fwatz.tanks[1], guiLeft, guiTop, zLevel, 16, 70, 8, 116); + FFUtils.drawLiquid(fwatz.tanks[2], guiLeft, guiTop, zLevel, 16, 70, 152, 116); } } \ No newline at end of file diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineUUCreator.java b/src/main/java/com/hbm/inventory/gui/GUIMachineUUCreator.java index 94d5ec671d..31a4200d46 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineUUCreator.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineUUCreator.java @@ -83,7 +83,6 @@ protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2 drawTexturedModalRect(guiLeft + 79, guiTop + 60, 176, 60, 18, 18); int i = uu_creator.getPowerScaled(60); drawTexturedModalRect(guiLeft + 19, guiTop + 83 - i, 176, 60 - i, 16, i); - int j = uu_creator.getFluidScaled(60); - drawTexturedModalRect(guiLeft + 141, guiTop + 83 - j, 192, 60 - j, 16, j); + FFUtils.drawLogLiquid(uu_creator.tank, guiLeft, guiTop, zLevel, 16, 60, 141, 111); } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIMixer.java b/src/main/java/com/hbm/inventory/gui/GUIMixer.java new file mode 100644 index 0000000000..ac1e1de602 --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUIMixer.java @@ -0,0 +1,70 @@ +package com.hbm.inventory.gui; + +import java.util.ArrayList; +import java.util.List; + +import org.lwjgl.opengl.GL11; + +import com.hbm.inventory.container.ContainerMixer; +import com.hbm.lib.RefStrings; +import com.hbm.forgefluid.FFUtils; +import com.hbm.tileentity.machine.TileEntityMachineMixer; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ResourceLocation; + +public class GUIMixer extends GuiInfoContainer { + + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/processing/gui_mixer.png"); + private TileEntityMachineMixer mixer; + + public GUIMixer(InventoryPlayer player, TileEntityMachineMixer mixer) { + super(new ContainerMixer(player, mixer)); + this.mixer = mixer; + + this.xSize = 176; + this.ySize = 204; + } + + @Override + public void drawScreen(int mouseX, int mouseY, float f) { + super.drawScreen(mouseX, mouseY, f); + + this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 23, guiTop + 22, 16, 52, mixer.getPower(), mixer.getMaxPower()); + + FFUtils.renderTankInfo(this, mouseX, mouseY, guiLeft + 43, guiTop + 22, 7, 52, mixer.tanks[0]); + FFUtils.renderTankInfo(this, mouseX, mouseY, guiLeft + 52, guiTop + 22, 7, 52, mixer.tanks[1]); + FFUtils.renderTankInfo(this, mouseX, mouseY, guiLeft + 117, guiTop + 22, 16, 52, mixer.tanks[2], mixer.outputFluid); + super.renderHoveredToolTip(mouseX, mouseY); + } + + @Override + protected void drawGuiContainerForegroundLayer(int i, int j) { + String name = I18n.format(mixer.getName()); + + this.fontRenderer.drawString(name, this.xSize / 2 - this.fontRenderer.getStringWidth(name) / 2, 6, 4210752); + this.fontRenderer.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float interp, int x, int y) { + super.drawDefaultBackground(); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + + int i = (int) (mixer.getPower() * 53 / mixer.getMaxPower()); + drawTexturedModalRect(guiLeft + 23, guiTop + 75 - i, 176, 52 - i, 16, i); + + if(mixer.processTime > 0 && mixer.progress > 0) { + int j = mixer.progress * 53 / mixer.processTime; + drawTexturedModalRect(guiLeft + 62, guiTop + 36, 192, 0, j, 44); + } + + FFUtils.drawLiquid(mixer.tanks[0], guiLeft, guiTop, zLevel, 7, 52, 43, 103, mixer.uuMixer); + FFUtils.drawLiquid(mixer.tanks[1], guiLeft, guiTop, zLevel, 7, 52, 52, 103, mixer.uuMixer); + FFUtils.drawLiquid(mixer.tanks[2], guiLeft, guiTop, zLevel, 16, 52, 117, 103, mixer.uuMixer); + } +} diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 7e2ebe43e9..0f597902e1 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -639,7 +639,7 @@ public class ModItems { public static final Item upgrade_centrifuge = new ItemMachineUpgrade("upgrade_centrifuge").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab); public static final Item upgrade_crystallizer = new ItemMachineUpgrade("upgrade_crystallizer").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab); public static final Item upgrade_nullifier = new ItemMachineUpgrade("upgrade_nullifier").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab); - public static final Item upgrade_screm = new ItemMachineUpgrade("upgrade_screm").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab); + public static final Item upgrade_screm = new ItemMachineUpgrade("upgrade_screm", UpgradeType.SCREAM, 1).setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab); //Fluid handling items @@ -3044,17 +3044,17 @@ public class ModItems { public static final Item capsule_empty = new ItemBase("capsule_empty").setCreativeTab(MainRegistry.controlTab); public static final Item capsule_xen = new ItemDrop("capsule_xen").setCreativeTab(MainRegistry.controlTab); - public static final Item tiny_singularity = new ItemFWatzCore("capsule_sing_tiny", 5000000L, 50, 50, 200, 1600, 2).setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setContainerItem(ModItems.capsule_empty); - public static final Item tiny_singularity_counter_resonant = new ItemFWatzCore("capsule_sing_counter_tiny", 2500000L, 50, 25, 100, 640, 1).setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setContainerItem(ModItems.capsule_empty); - public static final Item tiny_singularity_super_heated = new ItemFWatzCore("capsule_sing_super_tiny", 7500000L, 75, 150, 1600, 800, 3).setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setContainerItem(ModItems.capsule_empty); - public static final Item tiny_black_hole = new ItemFWatzCore("capsule_hole_tiny", 20000000L, 100, 100, 640, 640, 4).setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setContainerItem(ModItems.capsule_empty); - public static final Item tiny_singularity_spark = new ItemFWatzCore("capsule_sing_spark_tiny", 250000000L, 500, 500, 1280, 320, 5).setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setContainerItem(ModItems.capsule_empty); - - public static final Item singularity = new ItemFWatzCore("singularity", 50000000L, 50, 50, 200, 1600, 2).setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setContainerItem(ModItems.capsule_empty); - public static final Item singularity_counter_resonant = new ItemFWatzCore("singularity_counter_resonant", 25000000L, 50, 25, 100, 640, 1).setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setContainerItem(ModItems.capsule_empty); - public static final Item singularity_super_heated = new ItemFWatzCore("singularity_super_heated", 75000000L, 75, 150, 1600, 800, 3).setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setContainerItem(ModItems.capsule_empty); - public static final Item black_hole = new ItemFWatzCore("black_hole", 200000000L, 100, 100, 640, 640, 4).setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setContainerItem(ModItems.capsule_empty); - public static final Item singularity_spark = new ItemFWatzCore("singularity_spark", 2500000000L, 500, 500, 1280, 320, 5).setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setContainerItem(ModItems.capsule_empty); + public static final Item tiny_singularity = new ItemFWatzCore("capsule_sing_tiny", 200000000L, 50, 50, 200, 1600, 2).setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setContainerItem(ModItems.capsule_empty); + public static final Item tiny_singularity_counter_resonant = new ItemFWatzCore("capsule_sing_counter_tiny", 100000000L, 50, 25, 100, 640, 1).setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setContainerItem(ModItems.capsule_empty); + public static final Item tiny_singularity_super_heated = new ItemFWatzCore("capsule_sing_super_tiny", 300000000L, 75, 150, 1600, 800, 3).setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setContainerItem(ModItems.capsule_empty); + public static final Item tiny_black_hole = new ItemFWatzCore("capsule_hole_tiny", 750000000L, 100, 100, 640, 640, 4).setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setContainerItem(ModItems.capsule_empty); + public static final Item tiny_singularity_spark = new ItemFWatzCore("capsule_sing_spark_tiny", 10000000000L, 500, 500, 1280, 320, 5).setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setContainerItem(ModItems.capsule_empty); + + public static final Item singularity = new ItemFWatzCore("singularity", 2000000000L, 50, 50, 200, 1600, 2).setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setContainerItem(ModItems.capsule_empty); + public static final Item singularity_counter_resonant = new ItemFWatzCore("singularity_counter_resonant", 1000000000L, 50, 25, 100, 640, 1).setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setContainerItem(ModItems.capsule_empty); + public static final Item singularity_super_heated = new ItemFWatzCore("singularity_super_heated", 3000000000L, 75, 150, 1600, 800, 3).setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setContainerItem(ModItems.capsule_empty); + public static final Item black_hole = new ItemFWatzCore("black_hole", 7500000000L, 100, 100, 640, 640, 4).setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setContainerItem(ModItems.capsule_empty); + public static final Item singularity_spark = new ItemFWatzCore("singularity_spark", 100000000000L, 500, 500, 1280, 320, 5).setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setContainerItem(ModItems.capsule_empty); public static final Item pellet_antimatter = new ItemDrop("pellet_antimatter").setCreativeTab(MainRegistry.controlTab).setContainerItem(ModItems.cell); public static final Item crystal_xen = new ItemDrop("crystal_xen").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab); diff --git a/src/main/java/com/hbm/items/armor/ItemModGasmask.java b/src/main/java/com/hbm/items/armor/ItemModGasmask.java index d46bd45a03..b28f6a837c 100644 --- a/src/main/java/com/hbm/items/armor/ItemModGasmask.java +++ b/src/main/java/com/hbm/items/armor/ItemModGasmask.java @@ -81,7 +81,8 @@ public void modRender(Pre event, ItemStack armor){ EntityPlayer player = event.getEntityPlayer(); modelM65.isSneak = model.isSneak; - + modelM65.isChild = false; + float interp = event.getPartialRenderTick(); float yawHead = player.prevRotationYawHead + (player.rotationYawHead - player.prevRotationYawHead) * interp; float yawWrapped = MathHelper.wrapDegrees(yawHead+180); diff --git a/src/main/java/com/hbm/items/machine/ItemMachineUpgrade.java b/src/main/java/com/hbm/items/machine/ItemMachineUpgrade.java index 3362624fcc..9fd643cfde 100644 --- a/src/main/java/com/hbm/items/machine/ItemMachineUpgrade.java +++ b/src/main/java/com/hbm/items/machine/ItemMachineUpgrade.java @@ -60,169 +60,169 @@ public void addInformation(ItemStack stack, World worldIn, List list, IT if(this == ModItems.upgrade_speed_1) { list.add("Mining Drill:"); - list.add("Delay -15 / Consumption +300"); + list.add(" Delay -15 / Consumption +300"); list.add(""); list.add("Assembly Machine:"); - list.add("Delay -25% / Consumption +200%"); + list.add(" Delay -25% / Consumption +200%"); list.add(""); list.add("Chemical Plant:"); - list.add("Delay -25% / Consumption +200%"); + list.add(" Delay -25% / Consumption +200%"); list.add(""); list.add("Crystallizer"); - list.add("Delay -10% / Consumption +1000"); + list.add(" Delay -10% / Consumption +1000"); list.add(""); list.add("Cyclotron"); - list.add("Speed x2"); + list.add(" Speed x2"); } if(this == ModItems.upgrade_speed_2) { list.add("Mining Drill:"); - list.add("Delay -30 / Consumption +600"); + list.add(" Delay -30 / Consumption +600"); list.add(""); list.add("Assembly Machine:"); - list.add("Delay -50% / Consumption +500%"); + list.add(" Delay -50% / Consumption +500%"); list.add(""); list.add("Chemical Plant:"); - list.add("Delay -50% / Consumption +500%"); + list.add(" Delay -50% / Consumption +500%"); list.add(""); list.add("Crystallizer"); - list.add("Delay -20% / Consumption +2000"); + list.add(" Delay -20% / Consumption +2000"); list.add(""); list.add("Cyclotron"); - list.add("Speed x3"); + list.add(" Speed x3"); } if(this == ModItems.upgrade_speed_3) { list.add("Mining Drill:"); - list.add("Delay -45 / Consumption +900"); + list.add(" Delay -45 / Consumption +900"); list.add(""); list.add("Assembly Machine:"); - list.add("Delay -75% / Consumption +800%"); + list.add(" Delay -75% / Consumption +800%"); list.add(""); list.add("Chemical Plant:"); - list.add("Delay -75% / Consumption +800%"); + list.add(" Delay -75% / Consumption +800%"); list.add(""); list.add("Crystallizer"); - list.add("Speed Delay -30% / Consumption +3000"); + list.add(" Speed Delay -30% / Consumption +3000"); list.add(""); list.add("Cyclotron"); - list.add("Speed x4"); + list.add(" Speed x4"); } if(this == ModItems.upgrade_effect_1) { list.add("Mining Drill:"); - list.add("Radius +1 / Consumption +80"); + list.add(" Radius +1 / Consumption +80"); list.add(""); list.add("Crystallizer"); - list.add("+5% chance of not consuming an item / Acid consumption +1000mB"); + list.add(" +5% chance of not consuming an item / Acid consumption +1000mB"); list.add(""); list.add("Cyclotron"); - list.add("-50% chance of incrementing overheat counter"); + list.add(" -50% chance of incrementing overheat counter"); } if(this == ModItems.upgrade_effect_2) { list.add("Mining Drill:"); - list.add("Radius +2 / Consumption +160"); + list.add(" Radius +2 / Consumption +160"); list.add(""); list.add("Crystallizer"); - list.add("+10% chance of not consuming an item / Acid consumption +2000mB"); + list.add(" +10% chance of not consuming an item / Acid consumption +2000mB"); list.add(""); list.add("Cyclotron"); - list.add("-66% chance of incrementing overheat counter"); + list.add(" -66% chance of incrementing overheat counter"); } if(this == ModItems.upgrade_effect_3) { list.add("Mining Drill:"); - list.add("Radius +3 / Consumption +240"); + list.add(" Radius +3 / Consumption +240"); list.add(""); list.add("Crystallizer"); - list.add("+15% chance of not consuming an item / Acid consumption +3000mB"); + list.add(" +15% chance of not consuming an item / Acid consumption +3000mB"); list.add(""); list.add("Cyclotron"); - list.add("-75% chance of incrementing overheat counter"); + list.add(" -75% chance of incrementing overheat counter"); } if(this == ModItems.upgrade_power_1) { list.add("Assembly Machine:"); - list.add("Consumption -20% / Delay +25%"); + list.add(" Consumption -20% / Delay +25%"); list.add(""); list.add("Chemical Plant:"); - list.add("Consumption -20% / Delay +25%"); + list.add(" Consumption -20% / Delay +25%"); list.add(""); list.add("Cyclotron"); - list.add("Consumption -100k"); + list.add(" Consumption -100k"); } if(this == ModItems.upgrade_power_2) { list.add("Assembly Machine:"); - list.add("Consumption -60% / Delay +50%"); + list.add(" Consumption -60% / Delay +50%"); list.add(""); list.add("Chemical Plant:"); - list.add("Consumption -60% / Delay +50%"); + list.add(" Consumption -60% / Delay +50%"); list.add(""); list.add("Cyclotron"); - list.add("Consumption -200k"); + list.add(" Consumption -200k"); } if(this == ModItems.upgrade_power_3) { list.add("Assembly Machine:"); - list.add("Consumption -80% / Delay +100%"); + list.add(" Consumption -80% / Delay +100%"); list.add(""); list.add("Chemical Plant:"); - list.add("Consumption -80% / Delay +100%"); + list.add(" Consumption -80% / Delay +100%"); list.add(""); list.add("Cyclotron"); - list.add("Consumption -300k"); + list.add(" Consumption -300k"); } if(this == ModItems.upgrade_fortune_1) { list.add("Mining Drill:"); - list.add("Fortune +1 / Delay +15"); + list.add(" Fortune +1 / Delay +15"); } if(this == ModItems.upgrade_fortune_2) { list.add("Mining Drill:"); - list.add("Fortune +2 / Delay +30"); + list.add(" Fortune +2 / Delay +30"); } if(this == ModItems.upgrade_fortune_3) { list.add("Mining Drill:"); - list.add("Fortune +3 / Delay +45"); + list.add(" Fortune +3 / Delay +45"); } if(this == ModItems.upgrade_afterburn_1) { list.add("Turbofan:"); - list.add("Production x2 / Consumption x2.5"); + list.add(" Production x2 / Consumption x2.5"); } if(this == ModItems.upgrade_afterburn_2) { list.add("Turbofan:"); - list.add("Production x3 / Consumption x5"); + list.add(" Production x3 / Consumption x5"); } if(this == ModItems.upgrade_afterburn_3) { list.add("Turbofan:"); - list.add("Production x4 / Consumption x7.5"); + list.add(" Production x4 / Consumption x7.5"); } if(this == ModItems.upgrade_radius) { list.add("Forcefield Range Upgrade"); - list.add("Radius +16 / Consumption +500"); + list.add(" Radius +16 / Consumption +500"); list.add(""); list.add("Stacks to 16"); } @@ -230,7 +230,7 @@ public void addInformation(ItemStack stack, World worldIn, List list, IT if(this == ModItems.upgrade_health) { list.add("Forcefield Health Upgrade"); - list.add("Max. Health +50 / Consumption +250"); + list.add(" Max. Health +50 / Consumption +250"); list.add(""); list.add("Stacks to 16"); } @@ -238,40 +238,43 @@ public void addInformation(ItemStack stack, World worldIn, List list, IT if(this == ModItems.upgrade_smelter) { list.add("Mining Laser Upgrade"); - list.add("Smelts blocks. Easy enough."); + list.add(" Smelts blocks. Easy enough."); } if(this == ModItems.upgrade_shredder) { list.add("Mining Laser Upgrade"); - list.add("Crunches ores"); + list.add(" Crunches ores"); } if(this == ModItems.upgrade_centrifuge) { list.add("Mining Laser Upgrade"); - list.add("Hopefully self-explanatory"); + list.add(" Hopefully self-explanatory"); } if(this == ModItems.upgrade_crystallizer) { list.add("Mining Laser Upgrade"); - list.add("Your new best friend"); + list.add(" Your new best friend"); } if(this == ModItems.upgrade_screm) { list.add("Mining Laser Upgrade"); - list.add("It's like in Super Mario where all blocks are"); - list.add("actually Toads, but here it's Half-Life scientists"); - list.add("and they scream. A lot."); + list.add(" It's like in Super Mario where all blocks are"); + list.add(" actually Toads, but here it's Half-Life scientists"); + list.add(" and they scream. A lot."); + list.add(""); + list.add("Mixer Upgrade"); + list.add(" Allows for UU-Matter processing."); } if(this == ModItems.upgrade_nullifier) { list.add("Mining Laser Upgrade"); - list.add("50% chance to override worthless items with /dev/zero"); - list.add("50% chance to move worthless items to /dev/null"); + list.add(" 50% chance to override worthless items with /dev/zero"); + list.add(" 50% chance to move worthless items to /dev/null"); } } @@ -282,6 +285,7 @@ public enum UpgradeType { FORTUNE, AFTERBURN, OVERDRIVE, + SCREAM, SPECIAL; public boolean mutex = false; diff --git a/src/main/java/com/hbm/items/special/ItemBedrockOre.java b/src/main/java/com/hbm/items/special/ItemBedrockOre.java index 7d711705b7..f27f13c4a5 100644 --- a/src/main/java/com/hbm/items/special/ItemBedrockOre.java +++ b/src/main/java/com/hbm/items/special/ItemBedrockOre.java @@ -7,15 +7,22 @@ import com.hbm.main.MainRegistry; import com.hbm.items.ModItems; import com.hbm.lib.RefStrings; +import com.hbm.blocks.generic.BlockBedrockOreTE.TileEntityBedrockOre; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.client.resources.I18n; import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.NonNullList; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fml.relauncher.Side; @@ -81,4 +88,19 @@ public void addInformation(ItemStack stack, World world, List list, IToo } super.addInformation(stack, world, list, flagIn); } + + + @Override + public EnumActionResult onItemUse(EntityPlayer player, World worldIn, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { + if(player.capabilities.isCreativeMode){ + TileEntity te = worldIn.getTileEntity(pos); + if(te instanceof TileEntityBedrockOre){ + ItemStack bedrockOreItem = player.getHeldItem(hand); + if(bedrockOreItem != null && bedrockOreItem.getItem() == ModItems.ore_bedrock){ + ((TileEntityBedrockOre)te).setOre(getOreTag(bedrockOreItem)); + } + } + } + return super.onItemUse(player, worldIn, pos, hand, facing, hitX, hitY, hitZ); + } } \ No newline at end of file diff --git a/src/main/java/com/hbm/lib/HbmWorldGen.java b/src/main/java/com/hbm/lib/HbmWorldGen.java index 2e4f9d5fc6..ff3488f8dd 100644 --- a/src/main/java/com/hbm/lib/HbmWorldGen.java +++ b/src/main/java/com/hbm/lib/HbmWorldGen.java @@ -9,6 +9,7 @@ import com.hbm.blocks.generic.BlockBedrockOreTE.TileEntityBedrockOre; import com.hbm.config.GeneralConfig; import com.hbm.config.CompatibilityConfig; +import com.hbm.config.BedrockOreJsonConfig; import com.hbm.handler.WeightedRandomChestContentFrom1710; import com.hbm.items.ModItems; import com.hbm.main.MainRegistry; @@ -261,9 +262,10 @@ private void generateAStructure(World world, Random rand, int i, int j, WorldGen } private void generateBedrockOre(World world, Random rand, int i, int j, int dimID){ - int dimBedrockOreFreq = parseInt(CompatibilityConfig.bedrockOreSpawn.get(dimID)); + int dimBedrockOreFreq = parseInt(BedrockOreJsonConfig.dimOreRarity.get(dimID)); if (dimBedrockOreFreq > 0 && rand.nextInt(dimBedrockOreFreq) == 0) { - String oreName = BedrockOreRegistry.rollOreName(rand); + + String oreName = BedrockOreRegistry.rollOreName(dimID, rand); if(oreName == null) return; int sqrsize = 2; for(int v = sqrsize; v >= -sqrsize; v--) { diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 925232fcc0..82ef9d1d4a 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -526,6 +526,7 @@ import com.hbm.tileentity.machine.TileEntityMachineMiniRTG; import com.hbm.tileentity.machine.TileEntityMachineMiningDrill; import com.hbm.tileentity.machine.TileEntityMachineMiningLaser; +import com.hbm.tileentity.machine.TileEntityMachineMixer; import com.hbm.tileentity.machine.TileEntityMachineExcavator; import com.hbm.tileentity.machine.TileEntityMachineMissileAssembly; import com.hbm.tileentity.machine.TileEntityMachineOrbus; @@ -721,6 +722,7 @@ public void registerRenderInfo() ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTestRender.class, new RenderTestRender()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineChemplant.class, new RenderChemplant()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineChemfac.class, new RenderChemfac()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineMixer.class, new RenderMixer()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityNukeMan.class, new RenderNukeMan()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityNukeFleija.class, new RenderNukeFleija()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineReactorSmall.class, new RenderSmallReactor()); diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 80491ae6e3..e4a24afb7b 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -2135,6 +2135,7 @@ public static void reg3(){ addRecipeAuto(new ItemStack(ModBlocks.anvil_murky, 1), new Object[] { "UUU", "UAU", "UUU", 'U', ModItems.undefined, 'A', ModBlocks.anvil_steel }); addRecipeAuto(new ItemStack(ModBlocks.machine_fraction_tower), new Object[] { "SHS", "SGS", "SHS", 'S', STEEL.plate(), 'H', ModItems.hull_big_steel, 'G', LA.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.furnace_iron), new Object[] { "III", "IFI", "BBB", 'I', IRON.ingot(), 'F', Blocks.FURNACE, 'B', Blocks.STONEBRICK }); + addRecipeAuto(new ItemStack(ModBlocks.machine_mixer), new Object[] { "PIP", "GCG", "PMP", 'P', STEEL.plate(), 'I', DURA.ingot(), 'G', KEY_ANYPANE, 'C', ModItems.circuit_copper, 'M', ModItems.motor }); addRecipeAuto(new ItemStack(ModBlocks.fraction_spacer), new Object[] { "BHB", 'H', ModItems.hull_big_steel, 'B', Blocks.IRON_BARS }); //Cladding diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 1bd9c9b458..8562d904cd 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -28,6 +28,7 @@ import com.hbm.config.WeaponConfig; import com.hbm.config.CompatibilityConfig; import com.hbm.config.WorldConfig; +import com.hbm.config.BedrockOreJsonConfig; import com.hbm.creativetabs.ResourceTab; import com.hbm.creativetabs.BlockTab; import com.hbm.creativetabs.ConsumableTab; @@ -224,6 +225,7 @@ import com.hbm.inventory.AnvilRecipes; import com.hbm.inventory.AssemblerRecipes; import com.hbm.inventory.ChemplantRecipes; +import com.hbm.inventory.MixerRecipes; import com.hbm.inventory.BreederRecipes; import com.hbm.inventory.CrackRecipes; import com.hbm.inventory.CentrifugeRecipes; @@ -608,6 +610,7 @@ public void preInit(FMLPreInitializationEvent event) { GameRegistry.registerTileEntity(TileEntityTestRender.class, new ResourceLocation(RefStrings.MODID, "tileentity_testrenderer")); GameRegistry.registerTileEntity(TileEntityMachineChemplant.class, new ResourceLocation(RefStrings.MODID, "tileentity_machine_chemplant")); GameRegistry.registerTileEntity(TileEntityMachineChemfac.class, new ResourceLocation(RefStrings.MODID, "tileentity_machine_chemfac")); + GameRegistry.registerTileEntity(TileEntityMachineMixer.class, new ResourceLocation(RefStrings.MODID, "tileentity_machine_mixer")); GameRegistry.registerTileEntity(TileEntityDummyPort.class, new ResourceLocation(RefStrings.MODID, "tileentity_dummy_port")); GameRegistry.registerTileEntity(TileEntityNukeMan.class, new ResourceLocation(RefStrings.MODID, "tileentity_nuke_man")); GameRegistry.registerTileEntity(TileEntityNukeFleija.class, new ResourceLocation(RefStrings.MODID, "tileentity_nuke_fleija")); @@ -1044,6 +1047,7 @@ public static void reloadConfig() { config.save(); reloadCompatConfig(); WorldConfig.loadFromCompatibilityConfig(); + BedrockOreJsonConfig.init(); } public static void reloadCompatConfig() { @@ -1081,6 +1085,8 @@ public void postInit(FMLPostInitializationEvent event) { BreederRecipes.registerRecipes(); AssemblerRecipes.loadRecipes(); ChemplantRecipes.registerRecipes(); + MixerRecipes.copyChemplantRecipes(); + MixerRecipes.registerRecipes(); CrackRecipes.registerRecipes(); ExplosionNukeGeneric.loadSoliniumFromFile(); CyclotronRecipes.register(); diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index c0c481cddb..7c9c60b6e7 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -713,6 +713,15 @@ public void textureStitch(TextureStitchEvent.Pre evt) { evt.getMap().registerSprite(new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/biofuel_still")); evt.getMap().registerSprite(new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/biofuel_flowing")); + evt.getMap().registerSprite(new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/ethanol_still")); + evt.getMap().registerSprite(new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/ethanol_flowing")); + evt.getMap().registerSprite(new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/fishoil_still")); + evt.getMap().registerSprite(new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/fishoil_flowing")); + evt.getMap().registerSprite(new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/sunfloweroil_still")); + evt.getMap().registerSprite(new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/sunfloweroil_flowing")); + evt.getMap().registerSprite(new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/colloid_still")); + evt.getMap().registerSprite(new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/colloid_flowing")); + evt.getMap().registerSprite(new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/nitan_still")); evt.getMap().registerSprite(new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/nitan_flowing")); @@ -738,6 +747,8 @@ public void textureStitch(TextureStitchEvent.Pre evt) { evt.getMap().registerSprite(new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/solvent_flowing")); evt.getMap().registerSprite(new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/radiosolvent_still")); evt.getMap().registerSprite(new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/radiosolvent_flowing")); + evt.getMap().registerSprite(new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/nitroglycerin_still")); + evt.getMap().registerSprite(new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/nitroglycerin_flowing")); evt.getMap().registerSprite(new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/liquid_osmiridium_still")); evt.getMap().registerSprite(new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/liquid_osmiridium_flowing")); evt.getMap().registerSprite(new ResourceLocation(RefStrings.MODID, "blocks/forgefluid/watz_still")); diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 882600cf23..810d7cb90b 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -54,6 +54,10 @@ public class ResourceManager { public static final IModelCustom chemplant_fluid = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/chemplant_new_fluid.hmf")); public static final IModelCustom chemplant_fluidcap = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/chemplant_new_fluidcap.hmf")); public static final IModelCustom chemfac = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/chemfac.obj")); + + //Mixer + public static final IModelCustom mixer = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/mixer.obj")); + //F6 TANKS public static final IModelCustom tank = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/tank.obj")); @@ -682,6 +686,10 @@ public class ResourceManager { public static final ResourceLocation chemplant_fluid_tex = new ResourceLocation(RefStrings.MODID, "textures/models/lavabase_small.png"); public static final ResourceLocation chemfac_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/chemfac.png"); + //Mixer + public static final ResourceLocation mixer_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/mixer.png"); + public static final ResourceLocation mixer_uu_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/mixer_uu.png"); + //F6 TANKS public static final ResourceLocation uf6_tex = new ResourceLocation(RefStrings.MODID, "textures/models/UF6Tank.png"); public static final ResourceLocation puf6_tex = new ResourceLocation(RefStrings.MODID, "textures/models/PUF6Tank.png"); diff --git a/src/main/java/com/hbm/render/item/ItemRenderLibrary.java b/src/main/java/com/hbm/render/item/ItemRenderLibrary.java index d3ce367350..65452b9c37 100644 --- a/src/main/java/com/hbm/render/item/ItemRenderLibrary.java +++ b/src/main/java/com/hbm/render/item/ItemRenderLibrary.java @@ -124,7 +124,22 @@ public void renderCommon() { bindTexture(ResourceManager.iter_solenoid); ResourceManager.iter.renderPart("Solenoid"); GlStateManager.shadeModel(GL11.GL_FLAT); }}); - + renderers.put(Item.getItemFromBlock(ModBlocks.machine_mixer), new ItemRenderBase() { + public void renderInventory() { + GL11.glTranslated(0, -5, 0); + GL11.glScaled(5, 5, 5); + } + public void renderCommon() { + GL11.glRotated(180, 0, 1, 0); + GL11.glDisable(GL11.GL_CULL_FACE); + GlStateManager.shadeModel(GL11.GL_SMOOTH); + bindTexture(ResourceManager.mixer_tex); + ResourceManager.mixer.renderPart("Main"); + ResourceManager.mixer.renderPart("Mixer"); + GlStateManager.shadeModel(GL11.GL_FLAT); + GL11.glEnable(GL11.GL_CULL_FACE); + }}); + renderers.put(Item.getItemFromBlock(ModBlocks.machine_press), new ItemRenderBase() { public void renderInventory() { GL11.glTranslated(0, -4, 0); diff --git a/src/main/java/com/hbm/render/tileentity/RenderCore.java b/src/main/java/com/hbm/render/tileentity/RenderCore.java index 71b1e6ecc5..ce42c6ba3c 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderCore.java +++ b/src/main/java/com/hbm/render/tileentity/RenderCore.java @@ -1,35 +1,19 @@ package com.hbm.render.tileentity; -import java.nio.FloatBuffer; import java.util.Random; import org.lwjgl.opengl.GL11; import com.hbm.main.ResourceManager; import com.hbm.render.RenderSparks; -import com.hbm.render.amlfrom1710.Vec3; import com.hbm.tileentity.machine.TileEntityCore; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.GLAllocation; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.GlStateManager.DestFactor; import net.minecraft.client.renderer.GlStateManager.SourceFactor; -import net.minecraft.client.renderer.GlStateManager.TexGen; -import net.minecraft.client.renderer.OpenGlHelper; -import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ResourceLocation; -import net.minecraft.world.World; public class RenderCore extends TileEntitySpecialRenderer { - - private static final ResourceLocation sky = new ResourceLocation("textures/environment/end_sky.png"); - private static final ResourceLocation portal = new ResourceLocation("textures/entity/end_portal.png"); - private static final Random random = new Random(31100L); - FloatBuffer buffer = GLAllocation.createDirectFloatBuffer(16); @Override public boolean isGlobalRenderer(TileEntityCore te) { @@ -39,21 +23,21 @@ public boolean isGlobalRenderer(TileEntityCore te) { @Override public void render(TileEntityCore core, double x, double y, double z, float partialTicks, int destroyStage, float alpha) { if(core.heat == 0) { - renderStandby(x, y, z); + renderStandby(core, x, y, z); } else { - GL11.glPushMatrix(); - GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5); - //GL11.glRotatef(-Minecraft.getMinecraft().getRenderManager().playerViewY, 0.0F, 1.0F, 0.0F); - //GL11.glRotatef(Minecraft.getMinecraft().getRenderManager().playerViewX - 90, 1.0F, 0.0F, 0.0F); - GL11.glTranslated(-0.5, -0.5, -0.5); + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5); + //GL11.glRotatef(-Minecraft.getMinecraft().getRenderManager().playerViewY, 0.0F, 1.0F, 0.0F); + //GL11.glRotatef(Minecraft.getMinecraft().getRenderManager().playerViewX - 90, 1.0F, 0.0F, 0.0F); + GL11.glTranslated(-0.5, -0.5, -0.5); - renderOrb(core, 0, 0, 0); - GL11.glPopMatrix(); - } + renderOrb(core, 0, 0, 0); + GL11.glPopMatrix(); + } } - public void renderStandby(double x, double y, double z) { + public void renderStandby(TileEntityCore core, double x, double y, double z) { GL11.glPushMatrix(); GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5); @@ -62,44 +46,44 @@ public void renderStandby(double x, double y, double z) { GlStateManager.disableTexture2D(); GL11.glScalef(0.25F, 0.25F, 0.25F); - GlStateManager.color(0.5F, 0.5F, 0.5F); + GlStateManager.color(0.1F, 0.1F, 0.1F); ResourceManager.sphere_uv.renderAll(); GlStateManager.enableBlend(); GlStateManager.blendFunc(SourceFactor.SRC_ALPHA, DestFactor.ONE); GL11.glScalef(1.25F, 1.25F, 1.25F); - GlStateManager.color(0.1F, 0.1F, 0.1F); + GlStateManager.color(0.1F, 0.2F, 0.4F); ResourceManager.sphere_uv.renderAll(); GlStateManager.disableBlend(); GlStateManager.enableTexture2D(); GlStateManager.enableLighting(); - if((System.currentTimeMillis() / 100) % 10 == 0) { + if(core.getWorld().rand.nextInt(50) == 0) { for(int i = 0; i < 3; i++) { - RenderSparks.renderSpark((int) System.currentTimeMillis() / 100 + i * 10000, 0, 0, 0, 1.5F, 5, 10, 0xFFFF00, 0xFFFFFF); - RenderSparks.renderSpark((int) System.currentTimeMillis() / 50 + i * 10000, 0, 0, 0, 1.5F, 5, 10, 0xFFFF00, 0xFFFFFF); + RenderSparks.renderSpark((int) System.currentTimeMillis() / 100 + i * 10000, 0, 0, 0, 1.5F, 5, 10, 0x00FFFF, 0xFFFFFF); + RenderSparks.renderSpark((int) System.currentTimeMillis() / 50 + i * 10000, 0, 0, 0, 3F, 5, 10, 0x00FFFF, 0xFFFFFF); } } - + GlStateManager.color(1F, 1F, 1F); GL11.glPopMatrix(); } - public void renderOrb(TileEntityCore tile, double x, double y, double z) { + public void renderOrb(TileEntityCore core, double x, double y, double z) { GL11.glPushMatrix(); GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5); - int color = tile.color; + int color = core.color; float r = (color >> 16 & 255)/255F; float g = (color >> 8 & 255)/255F; float b = (color & 255)/255F; GlStateManager.color(r, g, b, 1.0F); - int tot = tile.tanks[0].getCapacity() + tile.tanks[1].getCapacity(); - int fill = tile.tanks[0].getFluidAmount() + tile.tanks[1].getFluidAmount(); + int tot = core.tanks[0].getCapacity() + core.tanks[1].getCapacity(); + int fill = core.tanks[0].getFluidAmount() + core.tanks[1].getFluidAmount(); - float scale = 4.5F * fill / tot + 0.5F; + float scale = (float)Math.log(core.heat+1) * ((float)fill / (float)tot) + 0.5F; GL11.glScalef(scale, scale, scale); GlStateManager.enableCull(); @@ -129,123 +113,4 @@ public void renderOrb(TileEntityCore tile, double x, double y, double z) { GlStateManager.disableCull(); GL11.glPopMatrix(); } - - public void renderVoid(TileEntity tile, double x, double y, double z) { - - TileEntityCore core = (TileEntityCore)tile; - - World world = tile.getWorld(); - GL11.glPushMatrix(); - - GlStateManager.disableLighting(); - - random.setSeed(31110L); - - GlStateManager.disableLighting(); - - GlStateManager.texGen(TexGen.S, GL11.GL_EYE_LINEAR); - GlStateManager.texGen(TexGen.T, GL11.GL_EYE_LINEAR); - GlStateManager.texGen(TexGen.R, GL11.GL_EYE_LINEAR); - GlStateManager.texGen(TexGen.Q, GL11.GL_EYE_LINEAR); - GlStateManager.enableTexGenCoord(TexGen.S); - GlStateManager.enableTexGenCoord(TexGen.T); - GlStateManager.enableTexGenCoord(TexGen.R); - GlStateManager.enableTexGenCoord(TexGen.Q); - GlStateManager.matrixMode(GL11.GL_TEXTURE); - GL11.glPushMatrix(); - GL11.glLoadIdentity(); - float f100 = world.getTotalWorldTime() % 500L / 500F; - GL11.glTranslatef(random.nextFloat(), f100, random.nextFloat()); - - Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder buf = tessellator.getBuffer(); - - final int end = 10; - for (int i = 0; i < end; ++i) { - float f5 = end - i; - float f7 = 1.0F / (f5 + 1.0F); - - if (i == 0) { - this.bindTexture(sky); - f7 = 0.0F; - f5 = 65.0F; - GlStateManager.enableBlend(); - GlStateManager.blendFunc(SourceFactor.SRC_ALPHA, DestFactor.ONE_MINUS_SRC_ALPHA); - } - - if (i == 1) { - this.bindTexture(portal); - GlStateManager.enableBlend(); - GlStateManager.blendFunc(SourceFactor.ONE, DestFactor.ONE); - } - - GL11.glTranslatef(random.nextFloat() * (1 - f7), random.nextFloat() * (1 - f7), random.nextFloat() * (1 - f7)); - float scale = 0.8F; - GL11.glScalef(scale, scale, scale); - float ang = 360 / end; - GL11.glRotatef(ang * i + ang * random.nextFloat(), 0.0F, 0.0F, 1.0F); - - float f11 = (float) random.nextDouble() * 0.5F + 0.4F; - float f12 = (float) random.nextDouble() * 0.5F + 0.4F; - float f13 = (float) random.nextDouble() * 0.5F + 2F; - if (i == 0) { - f13 = 1.0F; - f12 = 1.0F; - f11 = 1.0F; - } - f13 *= f7; - f12 *= f7; - f11 *= f7; - - GlStateManager.texGen(TexGen.S, GL11.GL_EYE_PLANE, this.func_147525_a(1, 0, 0, 0)); - GlStateManager.texGen(TexGen.T, GL11.GL_EYE_PLANE, this.func_147525_a(0, 0, 1, 0)); - GlStateManager.texGen(TexGen.R, GL11.GL_EYE_PLANE, this.func_147525_a(0, 0, 0, 1)); - GlStateManager.texGen(TexGen.Q, GL11.GL_EYE_PLANE, this.func_147525_a(0, 1, 0, 0)); - - GL11.glRotatef(180, 0, 0, 1); - - int tot = core.tanks[0].getCapacity() + core.tanks[1].getCapacity(); - int fill = core.tanks[0].getFluidAmount() + core.tanks[1].getFluidAmount(); - - float s = 2.25F * fill / tot + 0.5F; - - int count = 32; - - for(int j = 0; j < count; j++) { - - Vec3 vec = Vec3.createVectorHelper(s, 0, 0); - - buf.begin(GL11.GL_TRIANGLES, DefaultVertexFormats.POSITION_COLOR); - OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240, 240); - - vec.rotateAroundY((float) Math.PI * 2F / count * j - 0.0025F); - - buf.pos(x + 0.5 + vec.xCoord, y + 1.0, z + 0.5 + vec.zCoord).color(f11, f12, f13, 1.0F).endVertex(); - - vec.rotateAroundY((float) Math.PI * 2F / count + 0.005F); - buf.pos(x + 0.5 + vec.xCoord, y + 1.0, z + 0.5 + vec.zCoord).color(f11, f12, f13, 1.0F).endVertex(); - buf.pos(x + 0.5, y + 1.0, z + 0.5).color(f11, f12, f13, 1.0F).endVertex(); - - tessellator.draw(); - } - } - - GL11.glPopMatrix(); - GlStateManager.matrixMode(GL11.GL_MODELVIEW); - GlStateManager.disableBlend(); - GlStateManager.disableTexGenCoord(TexGen.S); - GlStateManager.disableTexGenCoord(TexGen.T); - GlStateManager.disableTexGenCoord(TexGen.R); - GlStateManager.disableTexGenCoord(TexGen.Q); - GlStateManager.enableLighting(); - GL11.glPopMatrix(); - } - - private FloatBuffer func_147525_a(float x, float y, float z, float w) { - - this.buffer.clear(); - this.buffer.put(x).put(y).put(z).put(w); - this.buffer.flip(); - return this.buffer; - } } diff --git a/src/main/java/com/hbm/render/tileentity/RenderCrystallizer.java b/src/main/java/com/hbm/render/tileentity/RenderCrystallizer.java index 8170ab69a6..e96ff10ffa 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderCrystallizer.java +++ b/src/main/java/com/hbm/render/tileentity/RenderCrystallizer.java @@ -3,9 +3,13 @@ import org.lwjgl.opengl.GL11; import com.hbm.main.ResourceManager; +import com.hbm.forgefluid.ModForgeFluids; +import com.hbm.render.RenderHelper; import com.hbm.tileentity.machine.TileEntityMachineCrystallizer; import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.GlStateManager.DestFactor; +import net.minecraft.client.renderer.GlStateManager.SourceFactor; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; public class RenderCrystallizer extends TileEntitySpecialRenderer { @@ -16,26 +20,22 @@ public boolean isGlobalRenderer(TileEntityMachineCrystallizer te) { } @Override - public void render(TileEntityMachineCrystallizer te, double x, double y, double z, float partialTicks, int destroyStage, float alpha) { + public void render(TileEntityMachineCrystallizer crys, double x, double y, double z, float partialTicks, int destroyStage, float alpha) { GL11.glPushMatrix(); GL11.glTranslated(x + 0.5D, y, z + 0.5D); GlStateManager.enableLighting(); GlStateManager.disableCull(); - switch(te.getBlockMetadata() - 10) { + switch(crys.getBlockMetadata() - 10) { case 2: GL11.glRotatef(90, 0F, 1F, 0F); break; case 4: GL11.glRotatef(180, 0F, 1F, 0F); break; case 3: GL11.glRotatef(270, 0F, 1F, 0F); break; case 5: GL11.glRotatef(0, 0F, 1F, 0F); break; } - TileEntityMachineCrystallizer crys = (TileEntityMachineCrystallizer)te; - GlStateManager.shadeModel(GL11.GL_SMOOTH); bindTexture(ResourceManager.crystallizer_tex); ResourceManager.crystallizer.renderPart("Body"); - bindTexture(ResourceManager.crystallizer_window_tex); - ResourceManager.crystallizer.renderPart("Windows"); GL11.glPushMatrix(); GL11.glRotatef(crys.prevAngle + (crys.angle - crys.prevAngle) * partialTicks, 0, 1, 0); @@ -43,8 +43,32 @@ public void render(TileEntityMachineCrystallizer te, double x, double y, double ResourceManager.crystallizer.renderPart("Spinner"); GL11.glPopMatrix(); + renderFill(crys); + bindTexture(ResourceManager.crystallizer_window_tex); + ResourceManager.crystallizer.renderPart("Windows"); + GlStateManager.shadeModel(GL11.GL_FLAT); + GlStateManager.enableCull(); GL11.glPopMatrix(); } + + public void renderFill(TileEntityMachineCrystallizer crys){ + if(crys.tank.getFluid() == null) return; + GL11.glPushMatrix(); + GlStateManager.enableCull(); + GlStateManager.disableTexture2D(); + GlStateManager.enableBlend(); + GlStateManager.blendFunc(SourceFactor.SRC_ALPHA, DestFactor.ONE); + + RenderHelper.setColor(ModForgeFluids.getFluidColor(crys.tank.getFluid().getFluid())); + ResourceManager.crystallizer.renderPart("Windows"); + + + GL11.glColor4f(1F, 1F, 1F, 1F); + GlStateManager.disableBlend(); + GlStateManager.enableTexture2D(); + GlStateManager.disableCull(); + GL11.glPopMatrix(); + } } diff --git a/src/main/java/com/hbm/render/tileentity/RenderMixer.java b/src/main/java/com/hbm/render/tileentity/RenderMixer.java new file mode 100644 index 0000000000..d0daeb898b --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/RenderMixer.java @@ -0,0 +1,76 @@ +package com.hbm.render.tileentity; + +import java.awt.Color; + +import org.lwjgl.opengl.GL11; + +import com.hbm.main.ResourceManager; +import com.hbm.forgefluid.ModForgeFluids; +import com.hbm.tileentity.machine.TileEntityMachineMixer; + +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.fluids.FluidTank; + +public class RenderMixer extends TileEntitySpecialRenderer { + + @Override + public void render(TileEntityMachineMixer mixer, double x, double y, double z, float partialTicks, int destroyStage, float alpha) { + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5D, y, z + 0.5D); + GlStateManager.enableLighting(); + GL11.glDisable(GL11.GL_CULL_FACE); + + GlStateManager.shadeModel(GL11.GL_SMOOTH); + if(mixer.uuMixer) + bindTexture(ResourceManager.mixer_uu_tex); + else + bindTexture(ResourceManager.mixer_tex); + ResourceManager.mixer.renderPart("Main"); + + GL11.glPushMatrix(); + GL11.glRotatef(mixer.prevRotation + (mixer.rotation - mixer.prevRotation) * partialTicks, 0, -1, 0); + ResourceManager.mixer.renderPart("Mixer"); + GL11.glPopMatrix(); + + int totalFill = 0; + int totalMax = 0; + + if(mixer.tanks[2].getFluid() != null) { + totalFill += mixer.tanks[2].getFluidAmount(); + totalMax += mixer.tanks[2].getCapacity(); + } + + if(totalFill > 0) { + GL11.glDepthMask(false); + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glEnable(GL11.GL_BLEND); + GL11.glAlphaFunc(GL11.GL_GREATER, 0); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + + Color color = new Color(ModForgeFluids.getFluidColor(mixer.outputFluid)); + GL11.glColor4f(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F, 0.75F); + GL11.glTranslated(0, 1, 0); + if(mixer.uuMixer){ + GL11.glScaled(1, 0.99, 1); + } else { + GL11.glScaled(1, (double) totalFill / (double) totalMax * 0.99, 1); + } + GL11.glTranslated(0, -1, 0); + ResourceManager.mixer.renderPart("Fluid"); + + GL11.glColor4f(1F, 1F, 1F, 1F); + GL11.glDepthMask(true); + GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_TEXTURE_2D); + } + GL11.glShadeModel(GL11.GL_FLAT); + + GL11.glEnable(GL11.GL_CULL_FACE); + + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityBarrel.java b/src/main/java/com/hbm/tileentity/machine/TileEntityBarrel.java index 6dce171703..ec944f0ccb 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityBarrel.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityBarrel.java @@ -84,13 +84,13 @@ public void checkFluidInteraction(){ } //for when you fill hot or corrosive liquids into a plastic tank - if(b == ModBlocks.barrel_plastic && (FluidTypeHandler.isCorrosive(f) || FluidTypeHandler.isHot(f))) { + if(b == ModBlocks.barrel_plastic && (FluidTypeHandler.isCorrosivePlastic(f) || FluidTypeHandler.isHot(f))) { world.destroyBlock(pos, false); world.playSound(null, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, SoundEvents.BLOCK_LAVA_EXTINGUISH, SoundCategory.BLOCKS, 1.0F, 1.0F); } //for when you fill corrosive liquid into an iron tank - if((b == ModBlocks.barrel_iron && FluidTypeHandler.isCorrosive(f)) || (b == ModBlocks.barrel_steel && FluidTypeHandler.isCorrosive2(f))) { + if((b == ModBlocks.barrel_iron && FluidTypeHandler.isCorrosivePlastic(f)) || (b == ModBlocks.barrel_steel && FluidTypeHandler.isCorrosiveIron(f))) { world.playSound(null, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, SoundEvents.BLOCK_LAVA_EXTINGUISH, SoundCategory.BLOCKS, 1.0F, 1.0F); world.setBlockState(pos, ModBlocks.barrel_corroded.getDefaultState()); @@ -221,5 +221,4 @@ public boolean canExtractItem(int slot, ItemStack itemStack, int amount) { return false; } - } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCore.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCore.java index c5d91ac41c..9543f03d5e 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCore.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCore.java @@ -143,27 +143,33 @@ public void networkUnpack(NBTTagCompound data) { private void radiation() { - double scale = 2; + double scale = (int)Math.log(heat) * 1.25 + 0.5; - List list = world.getEntitiesWithinAABBExcludingEntity(null, new AxisAlignedBB(pos.getX() - 10 + 0.5, pos.getY() - 10 + 0.5 + 6, pos.getZ() - 10 + 0.5, pos.getX() + 10 + 0.5, pos.getY() + 10 + 0.5 + 6, pos.getZ() + 10 + 0.5)); + int range = (int)(scale * 4); + List list = world.getEntitiesWithinAABBExcludingEntity(null, new AxisAlignedBB(pos.getX() - range + 0.5, pos.getY() - range + 0.5, pos.getZ() - range + 0.5, pos.getX() + range + 0.5, pos.getY() + range + 0.5, pos.getZ() + range + 0.5)); for(Entity e : list) { - if(!(e instanceof EntityPlayer && (ArmorUtil.checkForHazmat((EntityPlayer)e) || ((EntityPlayer)e).capabilities.isCreativeMode))){ + boolean isPlayer = e instanceof EntityPlayer; + if(!(isPlayer && ArmorUtil.checkForHazmat((EntityPlayer)e))){ if(!(Library.isObstructed(world, pos.getX() + 0.5, pos.getY() + 0.5 + 6, pos.getZ() + 0.5, e.posX, e.posY + e.getEyeHeight(), e.posZ))){ - e.attackEntityFrom(ModDamageSource.ams, this.heat * 100); + if(!isPlayer || (isPlayer && !((EntityPlayer)e).capabilities.isCreativeMode)) + e.attackEntityFrom(ModDamageSource.ams, this.heat * 100); e.setFire(3); } } - if(e instanceof EntityPlayer){ + if(isPlayer){ AdvancementManager.grantAchievement(((EntityPlayer) e), AdvancementManager.progress_dfc); } } - List list2 = world.getEntitiesWithinAABBExcludingEntity(null, new AxisAlignedBB(pos.getX() - scale + 0.5, pos.getY() - scale + 0.5 + 6, pos.getZ() - scale + 0.5, pos.getX() + scale + 0.5, pos.getY() + scale + 0.5 + 6, pos.getZ() + scale + 0.5)); + List list2 = world.getEntitiesWithinAABBExcludingEntity(null, new AxisAlignedBB(pos.getX() - scale + 0.5, pos.getY() - scale + 0.5, pos.getZ() - scale + 0.5, pos.getX() + scale + 0.5, pos.getY() + scale + 0.5, pos.getZ() + scale + 0.5)); for(Entity e : list2) { - if(!(e instanceof EntityPlayer && (ArmorUtil.checkForHaz2((EntityPlayer)e) || ((EntityPlayer)e).capabilities.isCreativeMode))){ - e.attackEntityFrom(ModDamageSource.amsCore, this.heat * 1000); + boolean isPlayer = e instanceof EntityPlayer; + if(!(isPlayer && ArmorUtil.checkForHaz2((EntityPlayer)e))){ + if(!isPlayer || (isPlayer && !((EntityPlayer)e).capabilities.isCreativeMode)) + e.attackEntityFrom(ModDamageSource.amsCore, this.heat * 1000); + e.setFire(3); } } } @@ -220,8 +226,9 @@ public long burn(long joules) { tanks[0].drain(demand, true); tanks[1].drain(demand, true); - - return (long) Math.abs((powerMod * joules * getCorePower() * getFuelEfficiency(f1) * getFuelEfficiency(f2)) + powerAbs); + if(heat == 0) + heat = 1; + return (long) Math.max(0, (powerMod * joules * getCorePower() * getFuelEfficiency(f1) * getFuelEfficiency(f2)) + powerAbs); } public float getFuelEfficiency(Fluid type) { @@ -306,5 +313,4 @@ public NBTTagCompound writeToNBT(NBTTagCompound compound) { compound.setTag("tanks", FFUtils.serializeTankArray(tanks)); return super.writeToNBT(compound); } - } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java index 9e8a3b8c5e..83b84e12a6 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java @@ -81,7 +81,10 @@ public void update() { if(power >= demand) { power -= demand; long add = watts * 100; - joules += add; + if(add > Long.MAX_VALUE-joules) + joules = Long.MAX_VALUE; + else + joules += add; } prev = joules; @@ -109,7 +112,7 @@ public void update() { } if(te instanceof TileEntityCore) { - out = ((TileEntityCore)te).burn(out); + out = Math.max(0, ((TileEntityCore)te).burn(out)); continue; } @@ -200,7 +203,10 @@ public long getMaxPower() { public void addEnergy(long energy, EnumFacing dir) { //do not accept lasers from the front if(dir.getOpposite().ordinal() != this.getBlockMetadata()){ - joules += energy; + if(Long.MAX_VALUE - joules < energy) + joules = Long.MAX_VALUE; + else + joules += energy; } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreInjector.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreInjector.java index 49c156e9f5..ba2d4da4f5 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreInjector.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreInjector.java @@ -17,6 +17,7 @@ import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTank; +import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fluids.capability.IFluidTankProperties; @@ -54,12 +55,8 @@ public void update() { if(te instanceof TileEntityCore) { - TileEntityCore core = (TileEntityCore)te; + fillDFC((TileEntityCore)te); - if(tanks[0].drain(core.tanks[0].fill(tanks[0].getFluid(), true), true) != null) - core.markDirty(); - if(tanks[1].drain(core.tanks[1].fill(tanks[1].getFluid(), true), true) != null) - core.markDirty(); beam = i; break; } @@ -75,6 +72,42 @@ public void update() { } } + public void fillDFC(TileEntityCore core){ + Fluid tank0 = null; + Fluid tank1 = null; + Fluid dfcTank0 = null; + Fluid dfcTank1 = null; + + if(tanks[0].getFluid() != null) + tank0 = tanks[0].getFluid().getFluid(); + if(tanks[1].getFluid() != null) + tank1 = tanks[1].getFluid().getFluid(); + + if(tank0 == null && tank1 == null) return; + + if(core.tanks[0].getFluid() != null) + dfcTank0 = core.tanks[0].getFluid().getFluid(); + if(core.tanks[1].getFluid() != null) + dfcTank1 = core.tanks[1].getFluid().getFluid(); + + + if((tank0 == dfcTank0 || dfcTank0 == null) && tank0 != dfcTank1) + if(tanks[0].drain(core.tanks[0].fill(tanks[0].getFluid(), true), true) != null) + core.markDirty(); + + if((tank1 == dfcTank1 || dfcTank1 == null) && tank1 != dfcTank0) + if(tanks[1].drain(core.tanks[1].fill(tanks[1].getFluid(), true), true) != null) + core.markDirty(); + + if((tank0 == dfcTank1 || dfcTank1 == null) && tank0 != dfcTank0) + if(tanks[0].drain(core.tanks[1].fill(tanks[0].getFluid(), true), true) != null) + core.markDirty(); + + if((tank1 == dfcTank0 || dfcTank0 == null) && tank1 != dfcTank1) + if(tanks[1].drain(core.tanks[0].fill(tanks[1].getFluid(), true), true) != null) + core.markDirty(); + } + @Override public String getName() { return "container.dfcInjector"; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreReceiver.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreReceiver.java index c0946cfc0e..71b73c475a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreReceiver.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreReceiver.java @@ -44,7 +44,10 @@ public TileEntityCoreReceiver() { public void update() { if(!world.isRemote) { - power += joules * 5000; + if(Long.MAX_VALUE-power < joules * 5000L) + power = Long.MAX_VALUE; + else + power += joules * 5000L; this.sendPower(world, pos); @@ -95,7 +98,10 @@ public FluidStack drain(int maxDrain, boolean doDrain) { public void addEnergy(long energy, EnumFacing dir) { // only accept lasers from the front if(dir.getOpposite().ordinal() == this.getBlockMetadata()) { - joules += energy; + if(Long.MAX_VALUE - joules < energy) + joules = Long.MAX_VALUE; + else + joules += energy; } else { world.destroyBlock(pos, false); world.createExplosion(null, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 2.5F, true); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFWatzCore.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFWatzCore.java index 0e82241fcd..2ba79e2b43 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFWatzCore.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFWatzCore.java @@ -3,9 +3,9 @@ import java.util.ArrayList; import java.util.List; +import com.hbm.interfaces.IControlReceiver; import com.hbm.forgefluid.FFUtils; import com.hbm.forgefluid.ModForgeFluids; -import com.hbm.interfaces.IReactor; import com.hbm.interfaces.ITankPacketAcceptor; import com.hbm.inventory.SAFERecipes; import com.hbm.items.ModItems; @@ -16,6 +16,7 @@ import com.hbm.packet.FluidTankPacket; import com.hbm.packet.PacketDispatcher; import com.hbm.world.FWatz; +import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import api.hbm.energy.IEnergyGenerator; @@ -38,7 +39,7 @@ import net.minecraftforge.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraftforge.items.ItemStackHandler; -public class TileEntityFWatzCore extends TileEntityLoadedBase implements ITickable, IReactor, IEnergyGenerator, IFluidHandler, ITankPacketAcceptor { +public class TileEntityFWatzCore extends TileEntityLoadedBase implements IControlReceiver, ITickable, IEnergyGenerator, IFluidHandler, ITankPacketAcceptor, INBTPacketReceiver { public long power; public final static long maxPower = 1000000000000L; @@ -47,6 +48,7 @@ public class TileEntityFWatzCore extends TileEntityLoadedBase implements ITickab public FluidTank tanks[]; public Fluid[] tankTypes; public boolean needsUpdate; + public boolean isOn = false; public ItemStackHandler inventory; @@ -71,6 +73,17 @@ protected void onContentsChanged(int slot) { needsUpdate = false; } + @Override + public boolean hasPermission(EntityPlayer player){ + return true; + } + + @Override + public void receiveControl(NBTTagCompound data){ + this.isOn = !this.isOn; + this.markDirty(); + } + public String getInventoryName() { return this.hasCustomInventoryName() ? this.customName : "container.fusionaryWatzPlant"; } @@ -102,6 +115,7 @@ public int getSingularityType(){ @Override public void readFromNBT(NBTTagCompound compound) { power = compound.getLong("power"); + isOn = compound.getBoolean("isOn"); tankTypes[0] = ModForgeFluids.coolant; tankTypes[1] = ModForgeFluids.amat; tankTypes[2] = ModForgeFluids.aschrab; @@ -115,6 +129,7 @@ public void readFromNBT(NBTTagCompound compound) { @Override public NBTTagCompound writeToNBT(NBTTagCompound compound) { compound.setLong("power", power); + compound.setBoolean("isOn", isOn); compound.setTag("inventory", inventory.serializeNBT()); compound.setTag("tanks", FFUtils.serializeTankArray(tanks)); return super.writeToNBT(compound); @@ -130,7 +145,7 @@ public void update() { inventory.setStackInSlot(2, new ItemStack(ModItems.meteorite_sword_warped)); } - if(hasFuse() && inventory.getStackInSlot(2).getItem() instanceof ItemFWatzCore) { + if(this.isOn && inventory.getStackInSlot(2).getItem() instanceof ItemFWatzCore) { ItemFWatzCore itemCore = (ItemFWatzCore)inventory.getStackInSlot(2).getItem(); if(cooldown) { @@ -175,19 +190,29 @@ public void update() { needsUpdate = true; if(needsUpdate) { needsUpdate = false; + this.markDirty(); } - if(this.isRunning() && (tanks[1].getFluidAmount() <= 0 || tanks[2].getFluidAmount() <= 0 || !hasFuse() || !(inventory.getStackInSlot(2).getItem() instanceof ItemFWatzCore)) || cooldown || !this.isStructureValid(world)) + if(this.isRunning() && (tanks[1].getFluidAmount() <= 0 || tanks[2].getFluidAmount() <= 0 || !isOn || !(inventory.getStackInSlot(2).getItem() instanceof ItemFWatzCore)) || cooldown || !this.isStructureValid(world)) this.emptyPlasma(); - if(!this.isRunning() && tanks[1].getFluidAmount() >= 100 && tanks[2].getFluidAmount() >= 100 && hasFuse() && inventory.getStackInSlot(2).getItem() instanceof ItemFWatzCore && !cooldown && this.isStructureValid(world)) + if(!this.isRunning() && tanks[1].getFluidAmount() >= 100 && tanks[2].getFluidAmount() >= 100 && isOn && inventory.getStackInSlot(2).getItem() instanceof ItemFWatzCore && !cooldown && this.isStructureValid(world)) this.fillPlasma(); - PacketDispatcher.wrapper.sendToAllAround(new FluidTankPacket(pos, new FluidTank[] { tanks[0], tanks[1], tanks[2] }), new TargetPoint(world.provider.getDimension(), pos.getX(), pos.getY(), pos.getZ(), 25)); - PacketDispatcher.wrapper.sendToAllAround(new AuxElectricityPacket(pos, power), new TargetPoint(world.provider.getDimension(), pos.getX(), pos.getY(), pos.getZ(), 25)); - + NBTTagCompound data = new NBTTagCompound(); + data.setLong("power", power); + data.setTag("tanks", FFUtils.serializeTankArray(tanks)); + data.setBoolean("isOn", isOn); + INBTPacketReceiver.networkPack(this, data, 50); } + } + @Override + public void networkUnpack(NBTTagCompound data) { + this.power = data.getLong("power"); + this.isOn = data.getBoolean("isOn"); + if(data.hasKey("tanks")) + FFUtils.deserializeTankArray(data.getTagList("tanks", 10), tanks); } private void sendSAFEPower(){ @@ -204,41 +229,14 @@ private void tryGrowCore(){ } } - @Override public boolean isStructureValid(World world) { return FWatz.checkHull(world, pos); } - @Override - public boolean isCoatingValid(World world) { - return true; - } - - @Override - public boolean hasFuse() { - return inventory.getStackInSlot(1).getItem() == ModItems.fuse || inventory.getStackInSlot(1).getItem() == ModItems.screwdriver; - } - - @Override - public int getWaterScaled(int i) { - return 0; - } - - @Override - public int getCoolantScaled(int i) { - return 0; - } - - @Override public long getPowerScaled(long i) { return (power / 100 * i) / (maxPower / 100); } - @Override - public int getHeatScaled(int i) { - return 0; - } - public void fillPlasma() { if(!this.world.isRemote) FWatz.fillPlasma(world, pos); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMixer.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMixer.java new file mode 100644 index 0000000000..b90b9ec0f9 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMixer.java @@ -0,0 +1,487 @@ +package com.hbm.tileentity.machine; + +import com.hbm.interfaces.ITankPacketAcceptor; +import com.hbm.inventory.UpgradeManager; +import com.hbm.inventory.container.ContainerMixer; +import com.hbm.inventory.gui.GUIMixer; +import com.hbm.inventory.MixerRecipes; +import com.hbm.forgefluid.ModForgeFluids; +import com.hbm.forgefluid.FFUtils; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; +import com.hbm.items.machine.ItemForgeFluidIdentifier; +import com.hbm.lib.Library; +import com.hbm.lib.DirPos; +import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.TileEntityMachineBase; + +import api.hbm.energy.IEnergyUser; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.util.EnumFacing; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.world.World; +import net.minecraft.util.ITickable; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTank; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.fluids.capability.IFluidTankProperties; + +public class TileEntityMachineMixer extends TileEntityMachineBase implements ITickable, IGUIProvider, IFluidHandler, IEnergyUser, ITankPacketAcceptor { + + public long power; + public static final long maxPower = 10_000; + public int progress; + public int processTime; + public Fluid outputFluid; + + public float rotation; + public float prevRotation; + public boolean wasOn = false; + + private int consumption = 50; + + public boolean uuMixer = false; + public static final int uuConsumption = 1_000_000; + public static final long uuMaxPower = 200_000_000; + public static final int uuMattermbPerOutputmb = 10; + + public FluidTank[] tanks; + private final UpgradeManager upgradeManager = new UpgradeManager(); + + public TileEntityMachineMixer() { + super(5); + this.outputFluid = null; + this.tanks = new FluidTank[3]; + this.tanks[0] = new FluidTank(16_000); //Input 1 + this.tanks[1] = new FluidTank(16_000); //Input 2 + this.tanks[2] = new FluidTank(24_000); //Output + } + + @Override + public String getName() { + if(uuMixer) return "container.machineUUMixer"; + return "container.machineMixer"; + } + + @Override + public void update() { + updateTankSizes(); + if(!world.isRemote) { + this.power = Library.chargeTEFromItems(inventory, 0, power, getMaxPower()); + + upgradeManager.eval(inventory, 3, 4); + int speedLevel = Math.min(upgradeManager.getLevel(UpgradeType.SPEED), 3); + int powerLevel = Math.min(upgradeManager.getLevel(UpgradeType.POWER), 3); + int overLevel = upgradeManager.getLevel(UpgradeType.OVERDRIVE); + uuMixer = upgradeManager.getLevel(UpgradeType.SCREAM) > 0; + + updateTankType(); + + if(uuMixer){ + updateInputUUtank(); + } else { + updateInputTankTypes(); + } + + this.consumption = getConsumption(); + + this.consumption += speedLevel * 150; + this.consumption -= this.consumption * powerLevel * 0.25; + this.consumption *= (overLevel * 3 + 1); + + for(DirPos pos : getConPos()) { + this.trySubscribe(world, pos.getPos(), pos.getDir()); + } + + this.wasOn = this.canProcess(); + + if(this.wasOn) { + this.progress++; + this.power -= this.getConsumption(); + + this.processTime -= this.processTime * speedLevel / 4; + this.processTime /= (overLevel + 1); + + if(processTime <= 0) this.processTime = 1; + + if(this.progress >= this.processTime) { + this.process(); + this.progress = 0; + } + + } else { + this.progress = 0; + } + + for(DirPos pos : getConPos()) { + if(tanks[2].getFluidAmount() > 0) + FFUtils.fillFluid(this, tanks[2], world, pos.getPos(), tanks[2].getCapacity() >> 1); + } + + NBTTagCompound data = new NBTTagCompound(); + if(outputFluid != null){ + data.setString("f", outputFluid.getName()); + } else { + if(tanks[2].getFluid() != null){ + data.setString("f", tanks[2].getFluid().getFluid().getName()); + } else { + data.setString("f", "None"); + } + } + data.setLong("power", power); + data.setInteger("processTime", processTime); + data.setInteger("progress", progress); + data.setBoolean("wasOn", wasOn); + data.setBoolean("uu", uuMixer); + data.setTag("tanks", FFUtils.serializeTankArray(tanks)); + + this.networkPack(data, 50); + if(!uuMixer && power > getMaxPower()) power = getMaxPower(); + + } else { + + this.prevRotation = this.rotation; + + if(this.wasOn) { + if(this.uuMixer){ + this.rotation += 40F; + } else { + this.rotation += 20F; + } + } + + if(this.rotation >= 360) { + this.rotation -= 360; + this.prevRotation -= 360; + } + } + } + + private void updateTankType() { + ItemStack slotId = inventory.getStackInSlot(2); + Item itemId = slotId.getItem(); + if(itemId == ModItems.forge_fluid_identifier) { + Fluid fluid = ItemForgeFluidIdentifier.getType(slotId); + + if(outputFluid != fluid && (uuMixer || MixerRecipes.hasMixerRecipe(fluid))) { + outputFluid = fluid; + tanks[2].setFluid(new FluidStack(fluid, 0)); + + this.markDirty(); + } + } + } + + private void updateTankSizes(){ + if(uuMixer){ + if(tanks[0].getCapacity() != 2_000_000_000){ + tanks[0] = FFUtils.changeTankSize(tanks[0], 2_000_000_000); + tanks[1] = FFUtils.changeTankSize(tanks[1], 2_000_000_000); + tanks[2] = FFUtils.changeTankSize(tanks[2], 2_000_000_000); + this.markDirty(); + } + } else { + if(tanks[0].getCapacity() != 16_000){ + tanks[0] = FFUtils.changeTankSize(tanks[0], 16_000); + tanks[1] = FFUtils.changeTankSize(tanks[1], 16_000); + tanks[2] = FFUtils.changeTankSize(tanks[2], 24_000); + this.markDirty(); + } + } + } + + private void updateInputUUtank(){ + if(tanks[0].getFluid() == null || tanks[0].getFluid().getFluid() != ModForgeFluids.uu_matter) + tanks[0].setFluid(new FluidStack(ModForgeFluids.uu_matter, 0)); + if(tanks[1].getFluid() != null) tanks[1].setFluid(null); + if(outputFluid == null && tanks[2].getFluid() != null) outputFluid = tanks[2].getFluid().getFluid(); + } + + private void updateInputTankTypes() { + if(outputFluid == null) return; + + Fluid[] f = MixerRecipes.getInputFluids(outputFluid); + if(f == null){ + if(tanks[0].getFluid() != null) tanks[0].setFluid(null); + if(tanks[1].getFluid() != null) tanks[1].setFluid(null); + } else if(f.length > 0){ + FluidStack t1 = tanks[0].getFluid(); + if(t1 == null || t1.getFluid() != f[0]){ + tanks[0].setFluid(new FluidStack(f[0], 0)); + } + if(f.length == 2){ + FluidStack t2 = tanks[1].getFluid(); + if(t2 == null || t2.getFluid() != f[1]){ + tanks[1].setFluid(new FluidStack(f[1], 0)); + } + } else { + tanks[1].setFluid(null); + } + } + } + + @Override + public void networkUnpack(NBTTagCompound nbt) { + if(nbt.hasKey("f")) { + if(nbt.getString("f").equals("None")) + this.outputFluid = null; + else + this.outputFluid = FluidRegistry.getFluid(nbt.getString("f")); + } + this.power = nbt.getLong("power"); + this.processTime = nbt.getInteger("processTime"); + this.progress = nbt.getInteger("progress"); + this.wasOn = nbt.getBoolean("wasOn"); + this.uuMixer = nbt.getBoolean("uu"); + if(nbt.hasKey("tanks")){ + FFUtils.deserializeTankArray(nbt.getTagList("tanks", 10), tanks); + } + } + + public boolean canProcess() { + //Enought Power? + if(this.power < getConsumption()) return false; + + //Mixing uu matter? + if(uuMixer){ + this.processTime = 200; + if(outputFluid != null && tanks[2].getFluidAmount() < tanks[2].getCapacity() && FFUtils.hasEnoughFluid(tanks[0], new FluidStack(ModForgeFluids.uu_matter, uuMattermbPerOutputmb))){ + return true; + } + return false; + } + + //has recipe? + if(!MixerRecipes.hasMixerRecipe(outputFluid)) { + this.outputFluid = null; + return false; + } + //has enough Fluid + FluidStack[] fluidInputs = MixerRecipes.getInputFluidStacks(outputFluid); + if(fluidInputs != null){ + if(fluidInputs.length >= 1 && !FFUtils.hasEnoughFluid(tanks[0], fluidInputs[0])) return false; + if(fluidInputs.length == 2 && !FFUtils.hasEnoughFluid(tanks[1], fluidInputs[1])) return false; + } + + //has enough space left in output tank + if(tanks[2].getCapacity() - tanks[2].getFluidAmount() < MixerRecipes.getFluidOutputAmount(outputFluid)) return false; + //has correct item in inputSlot + if(!MixerRecipes.matchesInputItem(outputFluid, inventory.getStackInSlot(1))) return false; + //has enough of that item + if(inventory.getStackInSlot(1).getCount() < MixerRecipes.getInputItemCount(outputFluid)) return false; + + this.processTime = MixerRecipes.getRecipeDuration(outputFluid); + return true; + } + + protected void process() { + + if(uuMixer){ + int mbProduction = Math.min(tanks[2].getCapacity()-tanks[2].getFluidAmount(), tanks[0].getFluidAmount()/uuMattermbPerOutputmb); + tanks[0].drain(mbProduction * uuMattermbPerOutputmb, true); + tanks[2].fill(new FluidStack(outputFluid, mbProduction), true); + this.markDirty(); + return; + } + + FluidStack[] fluidInputs = MixerRecipes.getInputFluidStacks(outputFluid); + if(fluidInputs != null){ + if(fluidInputs.length >= 1) + tanks[0].drain(fluidInputs[0].amount, true); + if(fluidInputs.length == 2) + tanks[1].drain(fluidInputs[1].amount, true); + } + + int itemuse = MixerRecipes.getInputItemCount(outputFluid); + if(itemuse > 0){ + ItemStack stack = inventory.getStackInSlot(1); + stack.shrink(itemuse); + if(stack.getCount() == 0) + inventory.setStackInSlot(1, ItemStack.EMPTY); + } + + tanks[2].fill(new FluidStack(outputFluid, MixerRecipes.getFluidOutputAmount(outputFluid)), true); + this.markDirty(); + } + + public int getConsumption() { + if(uuMixer) return uuConsumption; + return consumption; + } + + protected DirPos[] getConPos() { + return new DirPos[] { + new DirPos(pos.add(0, -1, 0), Library.NEG_Y), + new DirPos(pos.add(1, 0, 0), Library.POS_X), + new DirPos(pos.add(-1, 0, 0), Library.NEG_X), + new DirPos(pos.add(0, 0, 1), Library.POS_Z), + new DirPos(pos.add(0, 0, -1), Library.NEG_Z), + }; + } + + @Override + public int[] getAccessibleSlotsFromSide(EnumFacing e){ + return new int[] { 1 }; + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack itemStack) { + if(i == 1) return MixerRecipes.matchesInputItem(outputFluid, itemStack); + return false; + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + if(nbt.hasKey("f")) { + if(nbt.getString("f").equals("None")) + this.outputFluid = null; + else + this.outputFluid = FluidRegistry.getFluid(nbt.getString("f")); + } + this.uuMixer = nbt.getBoolean("uu"); + this.power = nbt.getLong("power"); + this.progress = nbt.getInteger("progress"); + this.processTime = nbt.getInteger("processTime"); + if(nbt.hasKey("tanks")){ + FFUtils.deserializeTankArray(nbt.getTagList("tanks", 10), tanks); + } + } + + @Override + public NBTTagCompound writeToNBT(NBTTagCompound nbt) { + if(outputFluid != null){ + nbt.setString("f", outputFluid.getName()); + } else { + if(tanks[2].getFluid() != null){ + nbt.setString("f", tanks[2].getFluid().getFluid().getName()); + } else { + nbt.setString("f", "None"); + } + } + nbt.setBoolean("uu", uuMixer); + nbt.setLong("power", power); + nbt.setInteger("progress", progress); + nbt.setInteger("processTime", processTime); + nbt.setTag("tanks", FFUtils.serializeTankArray(tanks)); + return super.writeToNBT(nbt); + } + + @Override + public long getPower() { + return power; + } + + @Override + public void setPower(long power) { + this.power = power; + } + + @Override + public long getMaxPower() { + if(uuMixer) return uuMaxPower; + return maxPower; + } + + @Override + public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new ContainerMixer(player.inventory, this); + } + + @Override + @SideOnly(Side.CLIENT) + public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new GUIMixer(player.inventory, this); + } + + AxisAlignedBB aabb; + + @Override + public AxisAlignedBB getRenderBoundingBox() { + + if(aabb != null) + return aabb; + + aabb = new AxisAlignedBB(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 3, pos.getZ() + 1); + return aabb; + } + + @Override + @SideOnly(Side.CLIENT) + public double getMaxRenderDistanceSquared() { + return 65536.0D; + } + + @Override + public void recievePacket(NBTTagCompound[] tags) { + if(tags.length != 3) { + return; + } else { + tanks[0].readFromNBT(tags[0]); + tanks[1].readFromNBT(tags[1]); + tanks[2].readFromNBT(tags[2]); + } + } + + @Override + public IFluidTankProperties[] getTankProperties() { + return new IFluidTankProperties[] { tanks[0].getTankProperties()[0], tanks[1].getTankProperties()[0], tanks[2].getTankProperties()[0] }; + } + + @Override + public int fill(FluidStack resource, boolean doFill) { + if(resource == null) return 0; + + if(tanks[0].getFluid() != null && resource.isFluidEqual(tanks[0].getFluid())) { + return tanks[0].fill(resource, doFill); + } + + if(tanks[1].getFluid() != null && resource.isFluidEqual(tanks[1].getFluid())) { + return tanks[1].fill(resource, doFill); + } + + return 0; + } + + @Override + public FluidStack drain(FluidStack resource, boolean doDrain) { + if(resource == null || resource.getFluid() != outputFluid) { + return null; + } + return tanks[2].drain(resource.amount, doDrain); + } + + @Override + public FluidStack drain(int maxDrain, boolean doDrain) { + return tanks[2].drain(maxDrain, doDrain); + } + + @Override + public T getCapability(Capability capability, EnumFacing facing) { + if(capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) { + return CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY.cast(this); + } else { + return super.getCapability(capability, facing); + } + } + + @Override + public boolean hasCapability(Capability capability, EnumFacing facing) { + if(capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) { + return true; + } else { + return super.hasCapability(capability, facing); + } + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineUUCreator.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineUUCreator.java index adc59520c9..bc2a513053 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineUUCreator.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineUUCreator.java @@ -57,7 +57,8 @@ public void update() { int loggedProducedMB = 0; if(isOn){ if(power >= rfPerMbOfUU && this.tank.getFluidAmount() < this.tank.getCapacity()){ - int producedUUmB = (int)(power / rfPerMbOfUU); + int producedUUmB = (int)Math.min(power / rfPerMbOfUU, this.tank.getCapacity()-this.tank.getFluidAmount()); + if(producedUUmB > 0){ producedUUmB = tank.fill(new FluidStack(ModForgeFluids.uu_matter, producedUUmB), true); power -= producedUUmB * rfPerMbOfUU; @@ -66,7 +67,7 @@ public void update() { } } } - + for(int i = 1; i < this.log.length; i++) { this.log[i - 1] = this.log[i]; } @@ -109,12 +110,6 @@ public int getPowerScaled(int i) { double powerScaled = (double)power / (double)maxPower; return (int)(i * powerScaled); } - - public int getFluidScaled(int i) { - if(tank.getFluidAmount() == 0) - return 0; - return (int)( (i * Math.log(tank.getFluidAmount())) / Math.log(tank.getCapacity()) ); - } private void updateConnections() { this.trySubscribe(world, pos.add(0, 3, 0), ForgeDirection.UP); @@ -132,17 +127,17 @@ private void updateConnections() { private void fillFluidInit(FluidTank tank) { boolean update = false; - update = FFUtils.fillFluid(this, tank, world, pos.add(0, 3, 0), 2_000_000_000) || update; - update = FFUtils.fillFluid(this, tank, world, pos.add(2, 3, 0), 2_000_000_000) || update; - update = FFUtils.fillFluid(this, tank, world, pos.add(-2, 3, 0), 2_000_000_000) || update; - update = FFUtils.fillFluid(this, tank, world, pos.add(0, 3, 2), 2_000_000_000) || update; - update = FFUtils.fillFluid(this, tank, world, pos.add(0, 3, -2), 2_000_000_000) || update; - - update = FFUtils.fillFluid(this, tank, world, pos.add(0, -1, 0), 2_000_000_000) || update; - update = FFUtils.fillFluid(this, tank, world, pos.add(2, -1, 0), 2_000_000_000) || update; - update = FFUtils.fillFluid(this, tank, world, pos.add(-2, -1, 0), 2_000_000_000) || update; - update = FFUtils.fillFluid(this, tank, world, pos.add(0, -1, 2), 2_000_000_000) || update; - update = FFUtils.fillFluid(this, tank, world, pos.add(0, -1, -2), 2_000_000_000) || update; + update = FFUtils.fillFluid(this, tank, world, pos.add(0, 3, 0), 1_000_000_000) || update; + update = FFUtils.fillFluid(this, tank, world, pos.add(2, 3, 0), 1_000_000_000) || update; + update = FFUtils.fillFluid(this, tank, world, pos.add(-2, 3, 0), 1_000_000_000) || update; + update = FFUtils.fillFluid(this, tank, world, pos.add(0, 3, 2), 1_000_000_000) || update; + update = FFUtils.fillFluid(this, tank, world, pos.add(0, 3, -2), 1_000_000_000) || update; + + update = FFUtils.fillFluid(this, tank, world, pos.add(0, -1, 0), 1_000_000_000) || update; + update = FFUtils.fillFluid(this, tank, world, pos.add(2, -1, 0), 1_000_000_000) || update; + update = FFUtils.fillFluid(this, tank, world, pos.add(-2, -1, 0), 1_000_000_000) || update; + update = FFUtils.fillFluid(this, tank, world, pos.add(0, -1, 2), 1_000_000_000) || update; + update = FFUtils.fillFluid(this, tank, world, pos.add(0, -1, -2), 1_000_000_000) || update; if(update) markDirty(); } @@ -168,6 +163,7 @@ public double getMaxRenderDistanceSquared() { @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); + this.isOn = nbt.getBoolean("isOn"); this.power = nbt.getLong("power"); this.tank.readFromNBT(nbt.getCompoundTag("tank")); } @@ -175,6 +171,7 @@ public void readFromNBT(NBTTagCompound nbt) { @Override public NBTTagCompound writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); + nbt.setBoolean("isOn", isOn); nbt.setLong("power", power); nbt.setTag("tank", this.tank.writeToNBT(new NBTTagCompound())); return nbt; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityWatzCore.java b/src/main/java/com/hbm/tileentity/machine/TileEntityWatzCore.java index feda09f37f..14a9e0fa18 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityWatzCore.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityWatzCore.java @@ -9,7 +9,6 @@ import com.hbm.entity.logic.EntityNukeExplosionMK3; import com.hbm.forgefluid.FFUtils; import com.hbm.forgefluid.ModForgeFluids; -import com.hbm.interfaces.IReactor; import com.hbm.interfaces.ITankPacketAcceptor; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemCapacitor; @@ -43,7 +42,7 @@ import net.minecraftforge.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraftforge.items.ItemStackHandler; -public class TileEntityWatzCore extends TileEntityLoadedBase implements ITickable, IReactor, IEnergyGenerator, IFluidHandler, ITankPacketAcceptor { +public class TileEntityWatzCore extends TileEntityLoadedBase implements ITickable, IEnergyGenerator, IFluidHandler, ITankPacketAcceptor { public long power; public final static long maxPower = 1000000000; @@ -194,7 +193,6 @@ public void update() { } } - @Override public boolean isStructureValid(World world) { MutableBlockPos mPos = new BlockPos.MutableBlockPos(); int x = pos.getX(); @@ -468,35 +466,13 @@ public boolean isStructureValid(World world) { return true; } - @Override - public boolean isCoatingValid(World world) { - return true; - } - - @Override public boolean hasFuse() { return inventory.getStackInSlot(38).getItem() == ModItems.titanium_filter && ItemCapacitor.getDura(inventory.getStackInSlot(38)) > 0; } - @Override - public int getWaterScaled(int i) { - return 0; - } - - @Override - public int getCoolantScaled(int i) { - return 0; - } - - @Override public long getPowerScaled(long i) { return (power/100 * i) / (maxPower/100); } - - @Override - public int getHeatScaled(int i) { - return 0; - } public void surveyPellet(ItemStack stack) { if(stack != null && stack.getItem() instanceof WatzFuel) diff --git a/src/main/resources/assets/hbm/blockstates/machine_mixer.json b/src/main/resources/assets/hbm/blockstates/machine_mixer.json new file mode 100644 index 0000000000..a54de77ae2 --- /dev/null +++ b/src/main/resources/assets/hbm/blockstates/machine_mixer.json @@ -0,0 +1,5 @@ +{ + "variants": { + "normal": { "model": "hbm:machine_mixer" } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hbm/lang/en_us.lang b/src/main/resources/assets/hbm/lang/en_us.lang index 6fd9b3a967..1a58d08d8c 100644 --- a/src/main/resources/assets/hbm/lang/en_us.lang +++ b/src/main/resources/assets/hbm/lang/en_us.lang @@ -17,6 +17,10 @@ item.drillbit_tcalloy_diamond.name=Technetium Steel Drillbit (Diamond-Tipped) item.solid_fuel_presto.name=Presto Log item.solid_fuel_presto_triplet.name=Boosted Presto Logs +container.machineMixer=Industrial Mixer +container.machineUUMixer=Industrial UU Mixer +tile.machine_mixer.name=Industrial Mixer + item.deuterium_filter.name=Deuterium Filter tile.machine_deuterium_extractor.name=Deuterium Extractor tile.machine_deuterium_tower.name=Deuterium Extraction Tower @@ -492,6 +496,10 @@ trait.coolable=Coolable trait.coolable.desc=§cProvides §4%sTU §cper bucket. trait.boilable=Heatable trait.boilable.desc=§bRequires §3%sTU §bper bucket. +trait.hotfluid=Hot +trait.antimatter=Annihilating +trait.corrosivePlastic=Corrosive +trait.corrosiveIron=Strongly Corrosive trait.rbmk.coreTemp=Core temp: %s trait.rbmk.depletion=Depletion: %s @@ -1215,7 +1223,11 @@ chem.GNEISS_GAS=Gas Shale Lab Fracking chem.GASOLINE=Gasoline Production chem.FRACKSOL=Fracking Solution Production -hbmfluid.fracksol=Fracking Solution +fluid.colloid=Colloid +fluid.ethanol=Ethanol +fluid.fishoil=Fish Oil +fluid.sunfloweroil=Sunflower Seed Oil +fluid.nitroglycerin=Nitroglycerin fluid.fracksol=Fracking Solution container.frackingTower=Hydraulic Fracking Tower item.canister_fracksol.name=Fracking Solution Canister @@ -1535,7 +1547,7 @@ container.armorTable=Armor Modification Table tile.machine_generator.name=Nuclear Reactor (Old) container.generator=Nuclear Reactor container.hadron=Particle Accelerator -tile.red_wire_coated.name=Coated Red Copper Cable +tile.red_wire_coated.name=Red Copper Cable Block tile.cable_switch.name=Power Switch tile.cable_diode.name=Power Diode tile.cable_diode.desc=§6Limits throughput and restricts flow direction$§eUse screwdriver to increase throughput$§eUse hand drill to decrease throughput$§eUse defuser to change network priority @@ -1832,7 +1844,7 @@ tile.machine_rtg_blue.name=Convection Generator tile.machine_rtg_purple.name=Antimatter Annihilation Generator tile.machine_waste_drum.name=Spent Fuel Pool Drum -tile.machine_waste_drum.desc=Needs water on at least one side. The more sides have water the faster it is. +tile.machine_waste_drum.desc=Cools down spent fuel. Needs water on at least one side. The more sides have water the faster it is. container.wasteDrum=Spent Fuel Pool Drum tile.machine_spp_bottom.name=ZPE Potential Generator (Bottom) diff --git a/src/main/resources/assets/hbm/models/block/machine_mixer.json b/src/main/resources/assets/hbm/models/block/machine_mixer.json new file mode 100644 index 0000000000..a940d9a31e --- /dev/null +++ b/src/main/resources/assets/hbm/models/block/machine_mixer.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "hbm:blocks/block_steel" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hbm/models/item/machine_mixer.json b/src/main/resources/assets/hbm/models/item/machine_mixer.json new file mode 100644 index 0000000000..42a58869e0 --- /dev/null +++ b/src/main/resources/assets/hbm/models/item/machine_mixer.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "hbm:block/block_steel" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hbm/models/machines/mixer.obj b/src/main/resources/assets/hbm/models/machines/mixer.obj new file mode 100644 index 0000000000..b36f2b1185 --- /dev/null +++ b/src/main/resources/assets/hbm/models/machines/mixer.obj @@ -0,0 +1,1454 @@ +# Blender v2.79 (sub 0) OBJ File: '' +# www.blender.org +o Main +v -0.156250 3.000000 -0.377221 +v 0.156250 2.500000 -0.377221 +v -0.156250 2.500000 -0.377221 +v 0.156250 3.000000 -0.377221 +v 0.377221 2.500000 -0.156250 +v 0.377221 3.000000 -0.156250 +v 0.377221 2.500000 0.156250 +v 0.377221 3.000000 0.156250 +v 0.156250 2.500000 0.377221 +v 0.156250 3.000000 0.377221 +v -0.156250 2.500000 0.377221 +v -0.156250 3.000000 0.377221 +v -0.377221 2.500000 0.156250 +v -0.377221 3.000000 0.156250 +v -0.377221 2.500000 -0.156250 +v -0.377221 3.000000 -0.156250 +v -0.187500 0.687500 0.500000 +v -0.187500 0.312500 0.437500 +v -0.187500 0.312500 0.500000 +v -0.187500 0.687500 0.437500 +v 0.187500 0.687500 0.437500 +v 0.000000 0.500000 0.125000 +v 0.187500 0.312500 0.500000 +v 0.187500 0.312500 0.437500 +v 0.187500 0.687500 0.500000 +v -0.500000 0.687500 -0.187500 +v -0.437500 0.312500 -0.187500 +v -0.500000 0.312500 -0.187500 +v -0.437500 0.687500 -0.187500 +v -0.437500 0.687500 0.187500 +v -0.125000 0.500000 0.000000 +v -0.500000 0.312500 0.187500 +v -0.437500 0.312500 0.187500 +v -0.500000 0.687500 0.187500 +v 0.187500 0.687500 -0.500000 +v 0.187500 0.312500 -0.437500 +v 0.187500 0.312500 -0.500000 +v 0.187500 0.687500 -0.437500 +v -0.187500 0.687500 -0.437500 +v 0.000000 0.500000 -0.125000 +v -0.187500 0.312500 -0.500000 +v -0.187500 0.312500 -0.437500 +v -0.187500 0.687500 -0.500000 +v 0.500000 0.687500 0.187500 +v 0.437500 0.312500 0.187500 +v 0.500000 0.312500 0.187500 +v 0.437500 0.687500 0.187500 +v 0.437500 0.687500 -0.187500 +v 0.125000 0.500000 0.000000 +v 0.500000 0.312500 -0.187500 +v 0.437500 0.312500 -0.187500 +v 0.500000 0.687500 -0.187500 +v 0.062500 1.075517 0.453905 +v -0.062500 0.987129 0.365517 +v -0.062500 1.075517 0.453905 +v -0.276765 1.075517 0.365154 +v -0.302653 0.987129 0.214265 +v -0.365153 1.075517 0.276765 +v -0.453905 1.075517 -0.062500 +v -0.365517 0.987129 0.062500 +v -0.365517 0.987129 -0.062500 +v -0.365154 1.075517 -0.276765 +v -0.214265 0.987129 -0.302653 +v -0.276765 1.075517 -0.365153 +v 0.062500 1.075517 -0.453905 +v -0.062500 0.987129 -0.365517 +v 0.062500 0.987129 -0.365517 +v 0.276765 1.075518 -0.365154 +v 0.302653 0.987129 -0.214265 +v 0.365153 1.075518 -0.276765 +v 0.453905 1.075518 0.062500 +v 0.365516 0.987129 -0.062500 +v 0.365516 0.987129 0.062500 +v 0.365153 1.075518 0.276765 +v 0.214265 0.987129 0.302653 +v 0.276765 1.075518 0.365153 +v -0.191298 1.136516 0.461833 +v -0.415650 1.086527 0.172168 +v -0.461833 1.136516 0.191298 +v 0.191298 1.136516 0.461833 +v -0.172168 1.086527 0.415650 +v 0.355806 2.656250 -0.400000 +v 0.400000 0.218750 -0.444194 +v 0.355806 0.218750 -0.400000 +v 0.400000 2.656250 -0.444194 +v 0.444194 0.218750 -0.400000 +v 0.444194 2.656250 -0.400000 +v 0.400000 0.218750 -0.355806 +v 0.400000 2.656250 -0.355806 +v 0.223223 2.656250 -0.267417 +v 0.400000 2.718750 -0.355806 +v 0.355806 2.718750 -0.400000 +v 0.267417 2.656250 -0.223223 +v 0.223223 2.718750 -0.267417 +v 0.267417 2.718750 -0.223223 +v 0.400000 2.656250 0.355806 +v 0.444194 0.218750 0.400000 +v 0.400000 0.218750 0.355806 +v 0.444194 2.656250 0.400000 +v 0.400000 0.218750 0.444194 +v 0.399999 2.656250 0.444194 +v 0.355806 0.218750 0.400000 +v 0.355805 2.656250 0.400000 +v 0.267417 2.656250 0.223223 +v 0.355805 2.718750 0.400000 +v 0.400000 2.718750 0.355806 +v 0.223223 2.718750 0.267418 +v 0.223223 2.656250 0.267418 +v 0.267417 2.718750 0.223223 +v -0.187500 0.500000 -0.452665 +v 0.187500 0.250000 -0.452665 +v -0.187500 0.250000 -0.452665 +v 0.187500 0.500000 -0.452665 +v 0.452665 0.250000 -0.187500 +v 0.452665 0.500000 -0.187500 +v 0.452665 0.250000 0.187500 +v 0.452665 0.500000 0.187500 +v 0.187500 0.250000 0.452665 +v 0.187500 0.500000 0.452665 +v -0.187500 0.250000 0.452665 +v -0.187500 0.500000 0.452665 +v -0.452665 0.250000 0.187500 +v 0.156250 0.625000 0.377221 +v -0.452665 0.500000 0.187500 +v -0.452665 0.250000 -0.187500 +v -0.452665 0.500000 -0.187500 +v -0.156250 0.625000 -0.377221 +v 0.156250 1.000000 -0.377221 +v 0.156250 0.625000 -0.377221 +v -0.377221 0.625000 -0.156250 +v 0.377221 0.625000 -0.156250 +v -0.156250 0.625000 0.377221 +v 0.377221 0.625000 0.156250 +v -0.377221 0.625000 0.156250 +v -0.156250 1.000000 0.377221 +v 0.156250 1.000000 0.377221 +v 0.377221 1.000000 -0.156250 +v -0.156250 1.000000 -0.377221 +v -0.377221 1.000000 0.156250 +v -0.377221 1.000000 -0.156250 +v 0.377221 1.000000 0.156250 +v -0.500000 0.250000 0.500000 +v -0.500000 0.187500 -0.500000 +v -0.500000 0.187500 0.500000 +v -0.500000 0.250000 -0.500000 +v 0.500000 0.187500 -0.500000 +v 0.500000 0.250000 -0.500000 +v 0.500000 0.187500 0.500000 +v 0.500000 0.250000 0.500000 +v 0.500000 0.000000 -0.500000 +v -0.500000 -0.000000 0.500000 +v -0.500000 0.000000 -0.500000 +v -0.500000 0.062500 0.500000 +v 0.437500 0.062500 0.437500 +v -0.437500 0.062500 0.437500 +v -0.500000 0.062500 -0.500000 +v -0.437500 0.062500 -0.437500 +v -0.437500 0.187500 0.437500 +v 0.500000 0.062500 0.500000 +v 0.437500 0.062500 -0.437500 +v 0.500000 0.062500 -0.500000 +v 0.500000 -0.000000 0.500000 +v 0.437500 0.187500 0.437500 +v 0.437500 0.187500 -0.437500 +v -0.437500 0.187500 -0.437500 +v -0.210427 2.414505 -0.508016 +v 0.191297 2.464493 -0.461833 +v 0.210427 2.414505 -0.508016 +v 0.062500 2.511245 -0.365517 +v -0.062500 2.422857 -0.453905 +v 0.062500 2.422857 -0.453905 +v 0.302653 2.511245 -0.214265 +v 0.276765 2.422857 -0.365154 +v 0.365153 2.422857 -0.276765 +v 0.365517 2.511245 0.062500 +v 0.453905 2.422857 -0.062500 +v 0.453905 2.422857 0.062500 +v 0.214265 2.511245 0.302653 +v 0.365154 2.422857 0.276765 +v 0.276765 2.422857 0.365153 +v -0.062500 2.422857 0.453905 +v 0.062500 2.511245 0.365517 +v 0.062500 2.422857 0.453905 +v -0.365153 2.422857 0.276765 +v -0.214265 2.511245 0.302653 +v -0.276765 2.422857 0.365154 +v -0.453905 2.422857 -0.062500 +v -0.365516 2.511245 0.062500 +v -0.453905 2.422857 0.062500 +v -0.276765 2.422857 -0.365153 +v -0.302653 2.511245 -0.214265 +v -0.365153 2.422857 -0.276765 +v 0.062500 0.987129 0.365517 +v -0.214265 0.987129 0.302654 +v -0.453905 1.075517 0.062500 +v -0.302654 0.987129 -0.214265 +v -0.062500 1.075517 -0.453905 +v 0.214265 0.987129 -0.302653 +v 0.453905 1.075518 -0.062500 +v 0.302653 0.987129 0.214265 +v 0.172168 1.086527 0.415650 +v -0.191298 2.464493 -0.461833 +v -0.062500 2.511245 -0.365517 +v 0.214265 2.511245 -0.302654 +v 0.365517 2.511245 -0.062500 +v 0.302654 2.511245 0.214265 +v -0.062500 2.511245 0.365517 +v -0.302653 2.511245 0.214265 +v -0.365516 2.511245 -0.062500 +v -0.214265 2.511245 -0.302653 +v 0.210427 1.086527 -0.508016 +v 0.461833 1.136516 -0.191298 +v 0.508016 1.086527 -0.210427 +v 0.191297 1.136516 -0.461833 +v 0.415650 1.086527 -0.172168 +v 0.172168 1.086527 -0.415650 +v 0.461833 1.036539 -0.191298 +v 0.191297 1.036539 -0.461833 +v -0.210427 1.086527 -0.508016 +v -0.191298 1.136516 -0.461833 +v -0.172168 1.086527 -0.415650 +v -0.191298 1.036539 -0.461833 +v -0.508016 1.086527 -0.210427 +v -0.461833 1.136516 -0.191297 +v -0.415650 1.086527 -0.172168 +v -0.461833 1.036539 -0.191297 +v -0.508016 1.086527 0.210427 +v -0.461833 1.036539 0.191298 +v -0.191298 1.036539 0.461833 +v 0.210427 1.086527 0.508016 +v -0.210427 1.086527 0.508016 +v 0.508016 1.086527 0.210428 +v 0.461833 1.136516 0.191298 +v 0.415650 1.086527 0.172168 +v 0.191298 1.036539 0.461833 +v 0.461833 1.036539 0.191298 +v 0.000000 2.500000 -0.326641 +v 0.230970 1.000000 -0.230970 +v 0.000000 1.000000 -0.326641 +v 0.230970 2.500000 -0.230970 +v 0.326641 1.000000 0.000000 +v 0.326641 2.500000 0.000000 +v 0.230970 1.000000 0.230970 +v 0.230970 2.500000 0.230970 +v 0.000000 1.000000 0.326641 +v 0.000000 2.500000 0.326641 +v -0.230970 1.000000 0.230970 +v -0.230970 2.500000 0.230970 +v -0.326641 1.000000 0.000000 +v -0.326641 2.500000 0.000000 +v -0.230970 1.000000 -0.230970 +v -0.230970 2.500000 -0.230970 +v 0.461833 2.464493 -0.191298 +v 0.508016 2.414505 -0.210427 +v 0.172168 2.414505 -0.415650 +v 0.415650 2.414505 -0.172168 +v 0.461833 2.364516 -0.191298 +v -0.172168 2.414505 -0.415650 +v 0.191297 2.364516 -0.461833 +v -0.191298 2.364516 -0.461833 +v -0.508016 2.414505 -0.210427 +v -0.461833 2.464493 -0.191297 +v -0.415650 2.414505 -0.172168 +v -0.461833 2.364516 -0.191297 +v -0.508016 2.414505 0.210427 +v -0.415650 2.414505 0.172168 +v -0.461833 2.364516 0.191298 +v -0.210427 2.414505 0.508016 +v -0.461833 2.464493 0.191298 +v -0.191298 2.464493 0.461833 +v -0.172168 2.414505 0.415650 +v -0.191298 2.364516 0.461833 +v 0.191298 2.464493 0.461833 +v 0.172168 2.414505 0.415650 +v 0.191298 2.364516 0.461833 +v 0.508016 2.414505 0.210428 +v 0.210427 2.414505 0.508016 +v 0.461833 2.464493 0.191298 +v 0.415650 2.414505 0.172168 +v 0.461833 2.364516 0.191298 +v -0.355806 2.656250 0.400000 +v -0.400000 0.218750 0.444194 +v -0.355806 0.218750 0.400000 +v -0.400000 2.656250 0.444194 +v -0.444194 0.218750 0.400000 +v -0.444194 2.656250 0.400000 +v -0.400000 0.218750 0.355806 +v -0.400000 2.656250 0.355806 +v -0.223223 2.656250 0.267417 +v -0.400000 2.718750 0.355806 +v -0.355806 2.718750 0.400000 +v -0.267417 2.656250 0.223223 +v -0.223223 2.718750 0.267417 +v -0.267417 2.718750 0.223223 +v -0.400000 2.656250 -0.355806 +v -0.444194 0.218750 -0.400000 +v -0.400000 0.218750 -0.355806 +v -0.444194 2.656250 -0.400000 +v -0.400000 0.218750 -0.444194 +v -0.399999 2.656250 -0.444194 +v -0.355806 0.218750 -0.400000 +v -0.355805 2.656250 -0.400000 +v -0.267417 2.656250 -0.223223 +v -0.355805 2.718750 -0.400000 +v -0.400000 2.718750 -0.355806 +v -0.223223 2.718750 -0.267418 +v -0.223223 2.656250 -0.267418 +v -0.267417 2.718750 -0.223223 +vt 0.740741 0.236364 +vt 0.666667 0.327273 +vt 0.666667 0.236364 +vt 0.740741 0.327273 +vt 0.666667 0.418182 +vt 0.740741 0.418182 +vt 0.666667 0.509091 +vt 0.740741 0.509091 +vt 0.666667 0.600000 +vt 0.740741 0.600000 +vt 0.666667 0.690909 +vt 0.740741 0.690909 +vt 0.666667 0.781818 +vt 0.777778 1.000000 +vt 0.740741 0.818182 +vt 0.870370 0.927273 +vt 0.740741 0.781818 +vt 0.666667 0.872727 +vt 0.740741 0.145455 +vt 0.666667 0.145455 +vt 0.962963 1.000000 +vt 0.870370 0.818182 +vt 0.907407 0.745455 +vt 0.157407 0.872727 +vt 0.148148 0.763636 +vt 0.157407 0.763636 +vt 0.148148 0.636364 +vt 0.148148 0.527273 +vt 0.194444 0.581818 +vt 0.222222 0.872727 +vt 0.212963 0.763636 +vt 0.222222 0.763636 +vt 0.212963 0.872727 +vt 0.212963 0.745455 +vt 0.157407 0.745455 +vt 0.157407 0.890909 +vt 0.212963 0.890909 +vt 0.148148 0.527273 +vt 0.148148 0.418182 +vt 0.194444 0.472727 +vt 0.148148 0.745455 +vt 0.148148 0.636364 +vt 0.194444 0.690909 +vt 0.157407 0.872727 +vt 0.148148 0.763636 +vt 0.157407 0.763636 +vt 0.148148 0.636364 +vt 0.148148 0.527273 +vt 0.194444 0.581818 +vt 0.222222 0.872727 +vt 0.212963 0.763636 +vt 0.222222 0.763636 +vt 0.212963 0.872727 +vt 0.212963 0.745455 +vt 0.157407 0.745455 +vt 0.212963 0.890909 +vt 0.148148 0.527273 +vt 0.148148 0.418182 +vt 0.194444 0.472727 +vt 0.148148 0.745455 +vt 0.148148 0.636364 +vt 0.194444 0.690909 +vt 0.157407 0.872727 +vt 0.148148 0.763636 +vt 0.157407 0.763636 +vt 0.148148 0.636364 +vt 0.148148 0.527273 +vt 0.194444 0.581818 +vt 0.222222 0.872727 +vt 0.212963 0.763636 +vt 0.222222 0.763636 +vt 0.212963 0.872727 +vt 0.157407 0.745455 +vt 0.157407 0.890909 +vt 0.212963 0.890909 +vt 0.148148 0.527273 +vt 0.148148 0.418182 +vt 0.194444 0.472727 +vt 0.148148 0.745455 +vt 0.148148 0.636364 +vt 0.194444 0.690909 +vt 0.157407 0.872727 +vt 0.148148 0.763636 +vt 0.157407 0.763636 +vt 0.148148 0.636364 +vt 0.148148 0.527273 +vt 0.194444 0.581818 +vt 0.222222 0.872727 +vt 0.212963 0.763636 +vt 0.222222 0.763636 +vt 0.212963 0.872727 +vt 0.157407 0.745455 +vt 0.157407 0.890909 +vt 0.212963 0.890909 +vt 0.148148 0.527273 +vt 0.148148 0.418182 +vt 0.194444 0.472727 +vt 0.148148 0.745455 +vt 0.148148 0.636364 +vt 0.194444 0.690909 +vt 0.240741 0.854545 +vt 0.222222 0.890909 +vt 0.222222 0.854545 +vt 0.240741 0.854545 +vt 0.222222 0.890909 +vt 0.222222 0.854545 +vt 0.222222 0.854545 +vt 0.240741 0.890909 +vt 0.222222 0.890909 +vt 0.240741 0.854545 +vt 0.222222 0.890909 +vt 0.222222 0.854545 +vt 0.222222 0.854545 +vt 0.240741 0.890909 +vt 0.222222 0.890909 +vt 0.240741 0.854545 +vt 0.222222 0.890909 +vt 0.222222 0.854545 +vt 0.222222 0.854545 +vt 0.240741 0.890909 +vt 0.222222 0.890909 +vt 0.240741 0.854545 +vt 0.222222 0.890909 +vt 0.222222 0.854545 +vt 0.037037 0.054545 +vt 0.398148 0.036364 +vt 0.398148 0.054545 +vt 0.037037 0.036364 +vt 0.398148 0.018182 +vt 0.037037 0.018182 +vt 0.398148 -0.000000 +vt 0.037037 0.072727 +vt 0.398148 0.072727 +vt 0.027778 0.072727 +vt 0.000000 0.054545 +vt 0.027778 0.054545 +vt 0.027778 0.018182 +vt 0.032371 0.009804 +vt 0.032371 0.044742 +vt 0.027778 0.036364 +vt 0.000000 0.000000 +vt 0.027778 0.000000 +vt 0.000000 0.036364 +vt 0.000000 0.018182 +vt 0.037037 0.054545 +vt 0.398148 0.036364 +vt 0.398148 0.054545 +vt 0.037037 0.036364 +vt 0.398148 0.018182 +vt 0.037037 0.018182 +vt 0.398148 -0.000000 +vt 0.037037 0.072727 +vt 0.398148 0.072727 +vt 0.027778 0.072727 +vt 0.000000 0.054545 +vt 0.027778 0.054545 +vt 0.027778 0.018182 +vt 0.032371 0.009804 +vt 0.032371 0.044742 +vt 0.027778 0.036364 +vt 0.027778 0.000000 +vt 0.000000 0.018182 +vt 0.000000 0.000000 +vt 0.000000 0.036364 +vt 0.351852 0.927273 +vt 0.407407 1.000000 +vt 0.351852 1.000000 +vt 0.407407 0.927273 +vt 0.462963 1.000000 +vt 0.462963 0.927273 +vt 0.518519 1.000000 +vt 0.518519 0.927273 +vt 0.574074 1.000000 +vt 0.574074 0.927273 +vt 0.629630 1.000000 +vt 0.629630 0.927273 +vt 0.685185 1.000000 +vt 0.569408 0.872727 +vt 0.685185 0.927273 +vt 0.740741 1.000000 +vt 0.296296 0.927273 +vt 0.296296 1.000000 +vt 0.620370 0.763636 +vt 0.574074 0.872727 +vt 0.574074 0.763636 +vt 0.736075 0.872727 +vt 0.740741 0.927273 +vt 0.458297 0.872727 +vt 0.624963 0.872727 +vt 0.347186 0.872727 +vt 0.402741 0.872727 +vt 0.513852 0.872727 +vt 0.680519 0.872727 +vt 0.333333 0.509091 +vt 0.388889 0.509091 +vt 0.425926 0.690909 +vt 0.666667 0.763636 +vt 0.620370 0.872727 +vt 0.388889 0.763636 +vt 0.342593 0.872727 +vt 0.342593 0.763636 +vt 0.481481 0.763636 +vt 0.435185 0.872727 +vt 0.435185 0.763636 +vt 0.527778 0.872727 +vt 0.527778 0.763636 +vt 0.296296 0.872727 +vt 0.296296 0.763636 +vt 0.388889 0.872727 +vt 0.481481 0.872727 +vt 0.296296 1.000000 +vt 0.148148 0.981818 +vt 0.296296 0.981818 +vt 0.296296 1.000000 +vt 0.148148 0.981818 +vt 0.296296 0.981818 +vt 0.296296 1.000000 +vt 0.148148 0.981818 +vt 0.296296 0.981818 +vt 0.296296 1.000000 +vt 0.148148 0.981818 +vt 0.296296 0.981818 +vt 0.000000 1.000000 +vt 0.148148 0.709091 +vt 0.148148 1.000000 +vt 0.148148 0.709091 +vt 0.000000 0.418182 +vt 0.148148 0.418182 +vt 0.148148 0.909091 +vt 0.287037 0.927273 +vt 0.157407 0.927273 +vt 0.148148 0.909091 +vt 0.287037 0.927273 +vt 0.157407 0.927273 +vt 0.157407 0.963636 +vt 0.148148 0.909091 +vt 0.287037 0.927273 +vt 0.157407 0.927273 +vt 0.296296 0.909091 +vt 0.148148 0.890909 +vt 0.296296 0.890909 +vt 0.296296 0.909091 +vt 0.148148 0.890909 +vt 0.296296 0.890909 +vt 0.296296 0.909091 +vt 0.148148 0.890909 +vt 0.296296 0.890909 +vt 0.296296 0.909091 +vt 0.148148 0.890909 +vt 0.296296 0.890909 +vt 0.148148 0.909091 +vt 0.287037 0.927273 +vt 0.157407 0.927273 +vt 0.287037 0.963636 +vt 0.157407 0.963636 +vt 0.287037 0.963636 +vt 0.287037 0.963636 +vt 0.287037 0.963636 +vt 0.157407 0.963636 +vt 0.157407 0.963636 +vt 0.222222 0.381818 +vt 0.148148 0.363636 +vt 0.148148 0.381818 +vt 0.222222 0.890909 +vt 0.222222 0.854545 +vt 0.240741 0.854545 +vt 0.222222 0.890909 +vt 0.222222 0.854545 +vt 0.240741 0.854545 +vt 0.222222 0.890909 +vt 0.222222 0.854545 +vt 0.240741 0.854545 +vt 0.222222 0.890909 +vt 0.222222 0.854545 +vt 0.240741 0.854545 +vt 0.222222 0.854545 +vt 0.240741 0.854545 +vt 0.240741 0.890909 +vt 0.222222 0.854545 +vt 0.240741 0.854545 +vt 0.240741 0.890909 +vt 0.222222 0.854545 +vt 0.240741 0.854545 +vt 0.240741 0.890909 +vt 0.222222 0.854545 +vt 0.240741 0.854545 +vt 0.240741 0.890909 +vt 0.833333 0.745455 +vt 0.870370 0.818182 +vt 0.833333 1.000000 +vt 0.740741 0.927273 +vt 0.777778 0.745455 +vt 0.740741 0.872727 +vt 0.962963 0.745455 +vt 1.000000 0.818182 +vt 1.000000 0.927273 +vt 0.907407 1.000000 +vt 0.870370 0.927273 +vt 0.148148 0.872727 +vt 0.148148 0.872727 +vt 0.157407 0.890909 +vt 0.148148 0.872727 +vt 0.212963 0.745455 +vt 0.148148 0.872727 +vt 0.212963 0.745455 +vt 0.240741 0.890909 +vt 0.240741 0.890909 +vt 0.240741 0.854545 +vt 0.240741 0.890909 +vt 0.240741 0.854545 +vt 0.240741 0.890909 +vt 0.240741 0.854545 +vt 0.240741 0.890909 +vt 0.037037 0.000000 +vt 0.000000 0.072727 +vt 0.037037 0.000000 +vt 0.000000 0.072727 +vt 0.523112 0.872727 +vt 0.689778 0.872727 +vt 0.412001 0.872727 +vt 0.578667 0.872727 +vt 0.300889 0.872727 +vt 0.356445 0.872727 +vt 0.467556 0.872727 +vt 0.634223 0.872727 +vt 0.388889 0.763636 +vt 0.333333 0.763636 +vt 0.296296 0.690909 +vt 0.296296 0.581818 +vt 0.425926 0.581818 +vt 0.666667 0.872727 +vt 0.148148 1.000000 +vt 0.148148 1.000000 +vt 0.148148 1.000000 +vt 0.148148 1.000000 +vt 0.000000 0.709091 +vt 0.000000 0.709091 +vt 0.222222 0.363636 +vt 0.240741 0.890909 +vt 0.240741 0.890909 +vt 0.240741 0.890909 +vt 0.240741 0.890909 +vt 0.222222 0.890909 +vt 0.222222 0.890909 +vt 0.222222 0.890909 +vt 0.222222 0.890909 +vt 0.037037 0.054545 +vt 0.398148 0.036364 +vt 0.398148 0.054545 +vt 0.037037 0.036364 +vt 0.398148 0.018182 +vt 0.037037 0.018182 +vt 0.398148 -0.000000 +vt 0.037037 0.072727 +vt 0.398148 0.072727 +vt 0.027778 0.072727 +vt 0.000000 0.054545 +vt 0.027778 0.054545 +vt 0.027778 0.018182 +vt 0.032371 0.009804 +vt 0.032371 0.044742 +vt 0.027778 0.036364 +vt 0.000000 0.000000 +vt 0.027778 0.000000 +vt 0.000000 0.036364 +vt 0.000000 0.018182 +vt 0.037037 0.054545 +vt 0.398148 0.036364 +vt 0.398148 0.054545 +vt 0.037037 0.036364 +vt 0.398148 0.018182 +vt 0.037037 0.018182 +vt 0.398148 -0.000000 +vt 0.037037 0.072727 +vt 0.398148 0.072727 +vt 0.027778 0.072727 +vt 0.000000 0.054545 +vt 0.027778 0.054545 +vt 0.027778 0.018182 +vt 0.032371 0.009804 +vt 0.032371 0.044742 +vt 0.027778 0.036364 +vt 0.027778 0.000000 +vt 0.000000 0.018182 +vt 0.000000 0.000000 +vt 0.000000 0.036364 +vt 0.037037 0.000000 +vt 0.000000 0.072727 +vt 0.037037 0.000000 +vt 0.000000 0.072727 +vt 0.148148 0.400000 +vt 0.083333 0.418182 +vt 0.074074 0.400000 +vt 0.222222 0.400000 +vt 0.157407 0.418182 +vt 0.138889 0.418182 +vt 0.212963 0.418182 +vt 0.148148 0.381818 +vt 0.222222 0.400000 +vt 0.222222 0.381818 +vt 0.148148 0.400000 +vt 0.212963 0.418182 +vt 0.157407 0.345455 +vt 0.222222 0.363636 +vt 0.212963 0.345455 +vt 0.148148 0.363636 +vt 0.074074 0.381818 +vt 0.074074 0.400000 +vt 0.138889 0.418182 +vt 0.083333 0.345455 +vt 0.138889 0.345455 +vt 0.074074 0.363636 +vt 0.000000 0.381818 +vt 0.000000 0.400000 +vt 0.064815 0.418182 +vt 0.009259 0.345455 +vt 0.064815 0.345455 +vt 0.000000 0.363636 +vt 0.074074 0.381818 +vt 0.009259 0.418182 +vt 0.064815 0.345455 +vt 0.074074 0.363636 +vt 0.138889 0.345455 +vt 0.083333 0.345455 +vt 0.148148 0.363636 +vt 0.222222 0.381818 +vt 0.148148 0.381818 +vt 0.212963 0.345455 +vt 0.157407 0.345455 +vt 0.296296 0.381818 +vt 0.296296 0.400000 +vt 0.231481 0.418182 +vt 0.287037 0.345455 +vt 0.222222 0.363636 +vt 0.231481 0.345455 +vt 0.296296 0.363636 +vt 0.287037 0.418182 +vt 0.231481 0.345455 +vt 0.518518 0.509091 +vt 0.481481 0.072727 +vt 0.518518 0.072727 +vt 0.481481 0.509091 +vt 0.444444 0.072727 +vt 0.444444 0.509091 +vt 0.407407 0.072727 +vt 0.407407 0.509091 +vt 0.370370 0.072727 +vt 0.370370 0.509091 +vt 0.333333 0.072727 +vt 0.333333 0.509091 +vt 0.296296 0.072727 +vt 0.592593 0.509091 +vt 0.555556 0.072727 +vt 0.592593 0.072727 +vt 0.555556 0.509091 +vt 0.074074 0.363636 +vt 0.074074 0.381818 +vt 0.138889 0.345455 +vt 0.083333 0.345455 +vt 0.138889 0.418182 +vt 0.074074 0.400000 +vt 0.083333 0.418182 +vt 0.157407 0.345455 +vt 0.212963 0.418182 +vt 0.148148 0.400000 +vt 0.157407 0.418182 +vt 0.222222 0.400000 +vt 0.296296 0.381818 +vt 0.296296 0.363636 +vt 0.231481 0.345455 +vt 0.287037 0.418182 +vt 0.231481 0.418182 +vt 0.296296 0.400000 +vt 0.222222 0.381818 +vt 0.231481 0.345455 +vt 0.287037 0.345455 +vt 0.231481 0.418182 +vt 0.222222 0.400000 +vt 0.148148 0.381818 +vt 0.222222 0.363636 +vt 0.148148 0.363636 +vt 0.212963 0.345455 +vt 0.157407 0.418182 +vt 0.212963 0.418182 +vt 0.148148 0.400000 +vt 0.074074 0.363636 +vt 0.138889 0.345455 +vt 0.083333 0.418182 +vt 0.138889 0.418182 +vt 0.074074 0.400000 +vt 0.000000 0.381818 +vt 0.074074 0.381818 +vt -0.000000 0.363636 +vt 0.064815 0.345455 +vt 0.009259 0.418182 +vt 0.064815 0.418182 +vt 0.000000 0.400000 +vt 0.009259 0.345455 +vt 0.157407 0.418182 +vt 0.083333 0.418182 +vt 0.064815 0.418182 +vt 0.231481 0.418182 +vt 0.296296 0.509091 +vt 0.212963 0.345455 +vt 0.157407 0.345455 +vt 0.083333 0.345455 +vt 0.064815 0.345455 +vt 0.064815 0.418182 +vn 0.0000 0.0000 -1.0000 +vn 0.7071 0.0000 -0.7071 +vn 1.0000 0.0000 0.0000 +vn 0.7071 -0.0000 0.7071 +vn 0.0000 0.0000 1.0000 +vn -0.7071 0.0000 0.7071 +vn 0.0000 1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn -0.7071 0.0000 -0.7071 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.8575 -0.5145 +vn -0.8575 0.0000 -0.5145 +vn 0.8575 0.0000 -0.5145 +vn 0.5145 0.8575 0.0000 +vn 0.5145 0.0000 -0.8575 +vn 0.5145 -0.0000 0.8575 +vn 0.0000 0.8575 0.5145 +vn 0.8575 -0.0000 0.5145 +vn -0.8575 -0.0000 0.5145 +vn -0.5145 0.8575 0.0000 +vn -0.5145 -0.0000 0.8575 +vn -0.5145 0.0000 -0.8575 +vn 0.0000 0.7071 -0.7071 +vn 0.5000 0.7071 -0.5000 +vn 0.7071 0.7071 0.0000 +vn 0.5000 0.7071 0.5000 +vn 0.0000 0.7071 0.7071 +vn -0.5000 0.7071 0.5000 +vn -0.7071 0.7071 0.0000 +vn -0.5000 0.7071 -0.5000 +vn 0.6054 0.5167 0.6054 +vn -0.8561 0.5167 0.0000 +vn 0.6054 0.5167 -0.6054 +vn 0.0000 0.5167 0.8561 +vn -0.6054 0.5167 -0.6054 +vn 0.0000 0.5167 -0.8561 +vn 0.8561 0.5167 0.0000 +vn -0.6054 0.5167 0.6054 +vn 0.0000 0.6786 -0.7345 +vn -0.2911 0.9479 -0.1290 +vn 0.8594 -0.1872 -0.4757 +vn 0.0588 0.9916 0.1149 +vn 0.2279 0.9710 0.0718 +vn 0.3421 0.4484 -0.8258 +vn -0.5767 0.1695 -0.7992 +vn 0.3827 -0.0000 -0.9239 +vn 0.1588 0.9851 -0.0658 +vn 0.9239 -0.0000 -0.3827 +vn 0.0658 0.9851 -0.1588 +vn -0.9239 -0.0000 0.3827 +vn -0.3827 -0.0000 0.9239 +vn 0.1588 -0.9851 -0.0658 +vn 0.0658 -0.9851 -0.1588 +vn -0.3827 -0.0000 -0.9239 +vn -0.0658 0.9851 -0.1588 +vn 0.3827 -0.0000 0.9239 +vn -0.0658 -0.9851 -0.1588 +vn -0.9239 -0.0000 -0.3827 +vn -0.1588 0.9851 -0.0658 +vn 0.9239 -0.0000 0.3827 +vn -0.1588 -0.9851 -0.0658 +vn -0.1588 -0.9851 0.0658 +vn -0.0658 -0.9851 0.1588 +vn 0.1588 0.9851 0.0658 +vn 0.0658 -0.9851 0.1588 +vn 0.1588 -0.9851 0.0658 +vn -0.0657 0.9851 -0.1588 +vn 0.0657 0.9851 -0.1588 +vn -0.1588 0.9851 0.0658 +vn -0.0658 0.9851 0.1588 +vn 0.0658 0.9851 0.1588 +s off +f 1/1/1 2/2/1 3/3/1 +f 4/4/2 5/5/2 2/2/2 +f 6/6/3 7/7/3 5/5/3 +f 8/8/4 9/9/4 7/7/4 +f 10/10/5 11/11/5 9/9/5 +f 12/12/6 13/13/6 11/11/6 +f 14/14/7 10/15/7 1/16/7 +f 14/17/8 15/18/8 13/13/8 +f 16/19/9 3/3/9 15/20/9 +f 7/21/10 13/22/10 15/23/10 +f 17/24/8 18/25/8 19/26/8 +f 20/27/11 21/28/11 22/29/11 +f 21/30/3 23/31/3 24/32/3 +f 25/33/5 19/26/5 23/31/5 +f 24/34/10 19/26/10 18/35/10 +f 20/36/7 25/33/7 21/37/7 +f 18/38/12 20/39/12 22/40/12 +f 21/41/13 24/42/13 22/43/13 +f 26/44/1 27/45/1 28/46/1 +f 29/47/14 30/48/14 31/49/14 +f 30/50/5 32/51/5 33/52/5 +f 34/53/8 28/46/8 32/51/8 +f 33/54/10 28/46/10 27/55/10 +f 30/56/7 26/44/7 34/53/7 +f 27/57/15 29/58/15 31/59/15 +f 30/60/16 33/61/16 31/62/16 +f 35/63/3 36/64/3 37/65/3 +f 38/66/17 39/67/17 40/68/17 +f 39/69/8 41/70/8 42/71/8 +f 43/72/1 37/65/1 41/70/1 +f 36/73/10 41/70/10 37/65/10 +f 38/74/7 43/72/7 39/75/7 +f 36/76/18 38/77/18 40/78/18 +f 39/79/19 42/80/19 40/81/19 +f 44/82/5 45/83/5 46/84/5 +f 47/85/20 48/86/20 49/87/20 +f 48/88/1 50/89/1 51/90/1 +f 52/91/3 46/84/3 50/89/3 +f 45/92/10 50/89/10 46/84/10 +f 47/93/7 52/91/7 48/94/7 +f 45/95/21 47/96/21 49/97/21 +f 48/98/22 51/99/22 49/100/22 +f 53/101/23 54/102/23 55/103/23 +f 56/104/24 57/105/24 58/106/24 +f 59/107/25 60/108/25 61/109/25 +f 62/110/26 63/111/26 64/112/26 +f 65/113/27 66/114/27 67/115/27 +f 68/116/28 69/117/28 70/118/28 +f 71/119/29 72/120/29 73/121/29 +f 74/122/30 75/123/30 76/124/30 +f 82/125/9 83/126/9 84/127/9 +f 85/128/2 86/129/2 83/126/2 +f 87/130/4 88/131/4 86/129/4 +f 89/132/6 84/127/6 88/133/6 +f 89/134/10 90/135/10 82/136/10 +f 85/128/24 91/137/24 87/130/24 +f 89/138/4 87/130/4 91/137/4 +f 85/128/9 82/139/9 92/140/9 +f 91/137/4 93/141/4 89/142/4 +f 92/140/9 90/135/9 94/143/9 +f 92/140/7 95/144/7 91/137/7 +f 96/145/2 97/146/2 98/147/2 +f 99/148/4 100/149/4 97/146/4 +f 101/150/6 102/151/6 100/149/6 +f 103/152/9 98/147/9 102/153/9 +f 103/154/10 104/155/10 96/156/10 +f 99/148/26 105/157/26 101/150/26 +f 103/158/6 101/150/6 105/157/6 +f 99/148/2 96/159/2 106/160/2 +f 103/161/6 107/162/6 108/163/6 +f 96/156/2 109/164/2 106/160/2 +f 106/160/7 107/162/7 105/157/7 +f 110/165/1 111/166/1 112/167/1 +f 113/168/2 114/169/2 111/166/2 +f 115/170/3 116/171/3 114/169/3 +f 117/172/4 118/173/4 116/171/4 +f 119/174/5 120/175/5 118/173/5 +f 121/176/6 122/177/6 120/175/6 +f 117/172/31 123/178/31 119/174/31 +f 124/179/8 125/180/8 122/177/8 +f 126/181/9 112/167/9 125/182/9 +f 127/183/1 128/184/1 129/185/1 +f 124/179/32 130/186/32 126/187/32 +f 113/168/33 131/188/33 115/170/33 +f 119/174/34 132/189/34 121/176/34 +f 126/181/35 127/190/35 110/165/35 +f 110/165/36 129/191/36 113/168/36 +f 115/170/37 133/192/37 117/172/37 +f 121/176/38 134/193/38 124/179/38 +f 135/194/7 136/195/7 137/196/7 +f 130/197/9 138/198/9 127/183/9 +f 132/199/6 139/200/6 134/201/6 +f 133/202/4 136/203/4 123/204/4 +f 129/185/2 137/205/2 131/206/2 +f 134/201/8 140/207/8 130/208/8 +f 132/199/5 136/203/5 135/209/5 +f 131/206/3 141/210/3 133/202/3 +f 142/211/8 143/212/8 144/213/8 +f 145/214/1 146/215/1 143/216/1 +f 147/217/3 148/218/3 146/219/3 +f 149/220/5 144/221/5 148/222/5 +f 150/223/10 151/224/10 152/225/10 +f 145/226/7 149/227/7 147/228/7 +f 153/229/7 154/230/7 155/231/7 +f 156/232/7 155/233/7 157/234/7 +f 154/230/5 158/235/5 155/231/5 +f 159/236/7 160/237/7 154/238/7 +f 153/239/8 152/240/8 151/241/8 +f 156/242/1 150/243/1 152/244/1 +f 161/245/3 162/246/3 150/247/3 +f 159/248/5 151/249/5 162/250/5 +f 161/251/7 157/252/7 160/253/7 +f 143/212/10 158/254/10 144/213/10 +f 160/237/3 163/255/3 154/238/3 +f 148/218/10 164/256/10 146/219/10 +f 146/215/10 165/257/10 143/216/10 +f 144/221/10 163/258/10 148/222/10 +f 155/233/8 165/259/8 157/234/8 +f 157/252/1 164/260/1 160/253/1 +f 166/261/39 167/262/39 168/263/39 +f 169/264/23 171/265/23 170/266/23 +f 172/267/24 174/268/24 173/269/24 +f 175/270/25 177/271/25 176/272/25 +f 178/273/26 180/274/26 179/275/26 +f 181/276/27 183/277/27 182/278/27 +f 184/279/28 186/280/28 185/281/28 +f 187/282/29 189/283/29 188/284/29 +f 190/285/30 192/286/30 191/287/30 +f 1/1/1 4/4/1 2/2/1 +f 4/4/2 6/6/2 5/5/2 +f 6/6/3 8/8/3 7/7/3 +f 8/8/4 10/10/4 9/9/4 +f 10/10/5 12/12/5 11/11/5 +f 12/12/6 14/17/6 13/13/6 +f 6/288/7 4/289/7 1/16/7 +f 1/16/7 16/290/7 14/14/7 +f 14/14/7 12/291/7 10/15/7 +f 10/15/7 8/292/7 6/288/7 +f 6/288/7 1/16/7 10/15/7 +f 14/17/8 16/293/8 15/18/8 +f 16/19/9 1/1/9 3/3/9 +f 15/23/10 3/294/10 7/21/10 +f 2/295/10 5/296/10 7/21/10 +f 7/21/10 9/297/10 11/298/10 +f 11/298/10 13/22/10 7/21/10 +f 3/294/10 2/295/10 7/21/10 +f 17/24/8 20/299/8 18/25/8 +f 21/30/3 25/33/3 23/31/3 +f 25/33/5 17/24/5 19/26/5 +f 24/34/10 23/31/10 19/26/10 +f 20/36/7 17/24/7 25/33/7 +f 26/44/1 29/300/1 27/45/1 +f 30/50/5 34/53/5 32/51/5 +f 34/53/8 26/44/8 28/46/8 +f 33/54/10 32/51/10 28/46/10 +f 30/56/7 29/301/7 26/44/7 +f 35/63/3 38/302/3 36/64/3 +f 39/69/8 43/72/8 41/70/8 +f 43/72/1 35/63/1 37/65/1 +f 36/73/10 42/303/10 41/70/10 +f 38/74/7 35/63/7 43/72/7 +f 44/82/5 47/304/5 45/83/5 +f 48/88/1 52/91/1 50/89/1 +f 52/91/3 44/82/3 46/84/3 +f 45/92/10 51/305/10 50/89/10 +f 47/93/7 44/82/7 52/91/7 +f 53/101/23 193/306/23 54/102/23 +f 56/104/24 194/307/24 57/105/24 +f 59/107/25 195/308/25 60/108/25 +f 62/110/26 196/309/26 63/111/26 +f 65/113/27 197/310/27 66/114/27 +f 68/116/28 198/311/28 69/117/28 +f 71/119/29 199/312/29 72/120/29 +f 74/122/30 200/313/30 75/123/30 +f 82/125/9 85/128/9 83/126/9 +f 85/128/2 87/130/2 86/129/2 +f 87/130/4 89/314/4 88/131/4 +f 89/132/6 82/125/6 84/127/6 +f 89/134/10 93/315/10 90/135/10 +f 85/128/24 92/140/24 91/137/24 +f 91/137/4 95/144/4 93/141/4 +f 92/140/9 82/136/9 90/135/9 +f 92/140/7 94/143/7 95/144/7 +f 96/145/2 99/148/2 97/146/2 +f 99/148/4 101/150/4 100/149/4 +f 101/150/6 103/316/6 102/151/6 +f 103/152/9 96/145/9 98/147/9 +f 103/154/10 108/317/10 104/155/10 +f 99/148/26 106/160/26 105/157/26 +f 103/161/6 105/157/6 107/162/6 +f 96/156/2 104/155/2 109/164/2 +f 106/160/7 109/164/7 107/162/7 +f 110/165/1 113/168/1 111/166/1 +f 113/168/2 115/170/2 114/169/2 +f 115/170/3 117/172/3 116/171/3 +f 117/172/4 119/174/4 118/173/4 +f 119/174/5 121/176/5 120/175/5 +f 121/176/6 124/179/6 122/177/6 +f 117/172/31 133/318/31 123/178/31 +f 124/179/8 126/187/8 125/180/8 +f 126/181/9 110/165/9 112/167/9 +f 127/183/1 138/198/1 128/184/1 +f 124/179/32 134/319/32 130/186/32 +f 113/168/33 129/320/33 131/188/33 +f 119/174/34 123/321/34 132/189/34 +f 126/181/35 130/322/35 127/190/35 +f 110/165/36 127/323/36 129/191/36 +f 115/170/37 131/324/37 133/192/37 +f 121/176/38 132/325/38 134/193/38 +f 137/196/7 128/326/7 138/327/7 +f 138/327/7 140/328/7 139/329/7 +f 139/329/7 135/194/7 137/196/7 +f 136/195/7 141/330/7 137/196/7 +f 137/196/7 138/327/7 139/329/7 +f 130/197/9 140/331/9 138/198/9 +f 132/199/6 135/209/6 139/200/6 +f 133/202/4 141/210/4 136/203/4 +f 129/185/2 128/184/2 137/205/2 +f 134/201/8 139/200/8 140/207/8 +f 132/199/5 123/204/5 136/203/5 +f 131/206/3 137/205/3 141/210/3 +f 142/211/8 145/332/8 143/212/8 +f 145/214/1 147/333/1 146/215/1 +f 147/217/3 149/334/3 148/218/3 +f 149/220/5 142/335/5 144/221/5 +f 150/223/10 162/336/10 151/224/10 +f 145/226/7 142/337/7 149/227/7 +f 153/229/7 159/248/7 154/230/7 +f 156/232/7 153/239/7 155/233/7 +f 154/230/5 163/258/5 158/235/5 +f 159/236/7 161/245/7 160/237/7 +f 153/239/8 156/232/8 152/240/8 +f 156/242/1 161/251/1 150/243/1 +f 161/245/3 159/236/3 162/246/3 +f 159/248/5 153/229/5 151/249/5 +f 161/251/7 156/242/7 157/252/7 +f 143/212/10 165/259/10 158/254/10 +f 160/237/3 164/256/3 163/255/3 +f 148/218/10 163/255/10 164/256/10 +f 146/215/10 164/260/10 165/257/10 +f 144/221/10 158/235/10 163/258/10 +f 155/233/8 158/254/8 165/259/8 +f 157/252/1 165/257/1 164/260/1 +f 166/261/39 202/338/39 167/262/39 +f 169/264/23 170/266/23 203/339/23 +f 172/267/24 173/269/24 204/340/24 +f 175/270/25 176/272/25 205/341/25 +f 178/273/26 179/275/26 206/342/26 +f 181/276/27 182/278/27 207/343/27 +f 184/279/28 185/281/28 208/344/28 +f 187/282/29 188/284/29 209/345/29 +f 190/285/30 191/287/30 210/346/30 +f 281/347/4 282/348/4 283/349/4 +f 284/350/6 285/351/6 282/348/6 +f 286/352/9 287/353/9 285/351/9 +f 288/354/2 283/349/2 287/355/2 +f 288/356/10 289/357/10 281/358/10 +f 284/350/28 290/359/28 286/352/28 +f 288/360/9 286/352/9 290/359/9 +f 284/350/4 281/361/4 291/362/4 +f 290/359/9 292/363/9 288/364/9 +f 291/362/4 289/357/4 293/365/4 +f 291/362/7 294/366/7 290/359/7 +f 295/367/6 296/368/6 297/369/6 +f 298/370/9 299/371/9 296/368/9 +f 300/372/2 301/373/2 299/371/2 +f 302/374/4 297/369/4 301/375/4 +f 302/376/10 303/377/10 295/378/10 +f 298/370/30 304/379/30 300/372/30 +f 302/380/2 300/372/2 304/379/2 +f 298/370/6 295/381/6 305/382/6 +f 302/383/2 306/384/2 307/385/2 +f 295/378/6 308/386/6 305/382/6 +f 305/382/7 306/384/7 304/379/7 +f 281/347/4 284/350/4 282/348/4 +f 284/350/6 286/352/6 285/351/6 +f 286/352/9 288/387/9 287/353/9 +f 288/354/2 281/347/2 283/349/2 +f 288/356/10 292/388/10 289/357/10 +f 284/350/28 291/362/28 290/359/28 +f 290/359/9 294/366/9 292/363/9 +f 291/362/4 281/358/4 289/357/4 +f 291/362/7 293/365/7 294/366/7 +f 295/367/6 298/370/6 296/368/6 +f 298/370/9 300/372/9 299/371/9 +f 300/372/2 302/389/2 301/373/2 +f 302/374/4 295/367/4 297/369/4 +f 302/376/10 307/390/10 303/377/10 +f 298/370/30 305/382/30 304/379/30 +f 302/383/2 304/379/2 306/384/2 +f 295/378/6 303/377/6 308/386/6 +f 305/382/7 308/386/7 306/384/7 +s 1 +f 77/391/40 78/392/41 79/393/42 +f 80/394/43 81/395/44 77/391/40 +f 77/391/40 81/396/44 78/392/41 +f 80/394/43 201/397/45 81/395/44 +f 211/398/46 212/399/47 213/400/48 +f 214/401/49 215/402/50 212/399/47 +f 216/403/51 217/404/52 215/405/50 +f 218/406/53 213/400/48 217/404/52 +f 219/407/54 214/401/49 211/398/46 +f 220/408/55 216/409/51 214/401/49 +f 221/410/56 218/406/53 216/411/51 +f 222/412/57 211/398/46 218/406/53 +f 223/413/58 220/408/55 219/407/54 +f 224/414/59 221/415/56 220/408/55 +f 225/416/60 222/412/57 221/417/56 +f 226/418/61 219/407/54 222/412/57 +f 227/419/50 224/414/59 223/413/58 +f 79/393/42 225/420/60 224/414/59 +f 78/421/41 226/418/61 225/416/60 +f 228/422/62 223/413/58 226/418/61 +f 227/419/50 77/391/40 79/393/42 +f 81/423/44 228/422/62 78/424/41 +f 229/425/63 227/419/50 228/422/62 +f 230/426/56 77/391/40 231/427/51 +f 201/428/45 229/425/63 81/429/44 +f 229/425/63 230/426/56 231/427/51 +f 232/430/60 80/394/43 230/426/56 +f 233/431/64 201/432/45 80/394/43 +f 234/433/58 235/434/65 201/435/45 +f 236/436/66 230/426/56 235/434/65 +f 213/400/48 233/431/64 232/430/60 +f 212/399/47 234/437/58 233/431/64 +f 215/438/50 236/436/66 234/433/58 +f 217/404/52 232/430/60 236/436/66 +f 237/439/1 238/440/2 239/441/1 +f 240/442/2 241/443/3 238/440/2 +f 242/444/3 243/445/4 241/443/3 +f 244/446/4 245/447/5 243/445/4 +f 246/448/5 247/449/6 245/447/5 +f 248/450/6 249/451/8 247/449/6 +f 250/452/8 251/453/9 249/454/8 +f 252/455/9 239/441/1 251/453/9 +f 168/263/46 253/456/47 254/457/48 +f 253/456/47 255/458/51 256/459/50 +f 255/460/51 257/461/52 256/462/50 +f 257/461/52 168/263/46 254/457/48 +f 202/338/67 255/463/51 167/262/68 +f 258/464/56 259/465/53 255/466/51 +f 260/467/57 168/263/46 259/465/53 +f 261/468/58 202/338/67 166/261/54 +f 262/469/59 258/470/56 202/338/67 +f 263/471/60 260/467/57 258/472/56 +f 264/473/61 166/261/54 260/467/57 +f 265/474/50 262/469/59 261/468/58 +f 262/469/59 266/475/48 263/476/60 +f 266/477/48 264/473/61 263/471/60 +f 267/478/62 261/468/58 264/473/61 +f 268/479/51 269/480/69 265/474/50 +f 270/481/70 266/482/48 269/480/69 +f 271/483/46 267/478/62 266/484/48 +f 272/485/63 265/474/50 267/478/62 +f 268/479/51 273/486/71 270/481/70 +f 273/486/71 271/487/46 270/481/70 +f 274/488/54 272/485/63 271/489/46 +f 275/490/65 268/479/51 272/485/63 +f 276/491/60 273/486/71 277/492/56 +f 278/493/64 274/494/54 273/486/71 +f 279/495/58 275/490/65 274/496/54 +f 280/497/66 277/492/56 275/490/65 +f 254/457/48 278/493/64 276/491/60 +f 253/456/47 279/498/58 278/493/64 +f 279/495/58 257/461/52 280/497/66 +f 257/461/52 276/491/60 280/497/66 +f 211/398/46 214/401/49 212/399/47 +f 214/401/49 216/499/51 215/402/50 +f 216/403/51 218/406/53 217/404/52 +f 218/406/53 211/398/46 213/400/48 +f 219/407/54 220/408/55 214/401/49 +f 220/408/55 221/500/56 216/409/51 +f 221/410/56 222/412/57 218/406/53 +f 222/412/57 219/407/54 211/398/46 +f 223/413/58 224/414/59 220/408/55 +f 224/414/59 225/420/60 221/415/56 +f 225/416/60 226/418/61 222/412/57 +f 226/418/61 223/413/58 219/407/54 +f 227/419/50 79/393/42 224/414/59 +f 79/393/42 78/501/41 225/420/60 +f 78/421/41 228/422/62 226/418/61 +f 228/422/62 227/419/50 223/413/58 +f 227/419/50 231/427/51 77/391/40 +f 81/423/44 229/425/63 228/422/62 +f 229/425/63 231/427/51 227/419/50 +f 230/426/56 80/394/43 77/391/40 +f 201/428/45 235/434/65 229/425/63 +f 229/425/63 235/434/65 230/426/56 +f 232/430/60 233/431/64 80/394/43 +f 233/431/64 234/437/58 201/432/45 +f 234/433/58 236/436/66 235/434/65 +f 236/436/66 232/430/60 230/426/56 +f 213/400/48 212/399/47 233/431/64 +f 212/399/47 215/502/50 234/437/58 +f 215/438/50 217/404/52 236/436/66 +f 217/404/52 213/400/48 232/430/60 +f 237/439/1 240/442/2 238/440/2 +f 240/442/2 242/444/3 241/443/3 +f 242/444/3 244/446/4 243/445/4 +f 244/446/4 246/448/5 245/447/5 +f 246/448/5 248/450/6 247/449/6 +f 248/450/6 250/503/8 249/451/8 +f 250/452/8 252/455/9 251/453/9 +f 252/455/9 237/439/1 239/441/1 +f 168/263/46 167/262/68 253/456/47 +f 253/456/47 167/262/68 255/458/51 +f 255/460/51 259/465/53 257/461/52 +f 257/461/52 259/465/53 168/263/46 +f 202/338/67 258/504/56 255/463/51 +f 258/464/56 260/467/57 259/465/53 +f 260/467/57 166/261/54 168/263/46 +f 261/468/58 262/469/59 202/338/67 +f 262/469/59 263/476/60 258/470/56 +f 263/471/60 264/473/61 260/467/57 +f 264/473/61 261/468/58 166/261/54 +f 265/474/50 269/480/69 262/469/59 +f 262/469/59 269/480/69 266/475/48 +f 266/477/48 267/478/62 264/473/61 +f 267/478/62 265/474/50 261/468/58 +f 268/479/51 270/481/70 269/480/69 +f 270/481/70 271/505/46 266/482/48 +f 271/483/46 272/485/63 267/478/62 +f 272/485/63 268/479/51 265/474/50 +f 268/479/51 277/492/56 273/486/71 +f 273/486/71 274/506/54 271/487/46 +f 274/488/54 275/490/65 272/485/63 +f 275/490/65 277/492/56 268/479/51 +f 276/491/60 278/493/64 273/486/71 +f 278/493/64 279/498/58 274/494/54 +f 279/495/58 280/497/66 275/490/65 +f 280/497/66 276/491/60 277/492/56 +f 254/457/48 253/456/47 278/493/64 +f 253/456/47 256/507/50 279/498/58 +f 279/495/58 256/508/50 257/461/52 +f 257/461/52 254/457/48 276/491/60 +o Mixer +v 0.281250 1.001012 0.000000 +v -0.281250 2.499874 0.000000 +v -0.281250 1.001012 0.000000 +v 0.000000 1.001012 0.281250 +v 0.000000 2.499874 -0.281250 +v 0.000000 1.001012 -0.281250 +v 0.281250 2.499874 0.000000 +v 0.000000 2.499874 0.281250 +vt 0.824074 0.309091 +vt 0.740741 0.745455 +vt 0.740741 0.309091 +vt 0.824074 0.309091 +vt 0.740741 0.745455 +vt 0.740741 0.309091 +vt 0.824074 0.745455 +vt 0.824074 0.745455 +vn 0.0000 -0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +s off +f 309/509/72 310/510/72 311/511/72 +f 312/512/73 313/513/73 314/514/73 +f 309/509/72 315/515/72 310/510/72 +f 312/512/73 316/516/73 313/513/73 +o Fluid +v 0.000000 2.500000 -0.301419 +v 0.212905 1.000000 -0.213135 +v 0.000000 1.000000 -0.301419 +v 0.212905 2.500000 -0.213135 +v 0.301094 1.000000 0.000000 +v 0.301094 2.500000 0.000000 +v 0.212905 1.000000 0.213135 +v 0.212905 2.500000 0.213135 +v 0.000000 1.000000 0.301419 +v 0.000000 2.500000 0.301419 +v -0.212906 1.000000 0.213135 +v -0.212906 2.500000 0.213135 +v -0.301094 1.000000 0.000000 +v -0.301094 2.500000 0.000000 +v -0.212906 1.000000 -0.213135 +v -0.212906 2.500000 -0.213135 +v 0.000000 2.500000 -0.301419 +v 0.212905 2.500000 -0.213135 +v 0.301094 2.500000 0.000000 +v 0.212905 2.500000 0.213135 +v 0.000000 2.500000 0.301419 +v -0.212906 2.500000 0.213135 +v -0.301094 2.500000 0.000000 +v -0.212906 2.500000 -0.213135 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.000000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.7074 0.0000 -0.7068 +vn 1.0000 0.0000 0.0000 +vn 0.7074 -0.0000 0.7068 +vn 0.0000 -0.0000 1.0000 +vn -0.7074 -0.0000 0.7068 +vn -1.0000 -0.0000 0.0000 +vn -0.7074 0.0000 -0.7068 +s off +f 339/517/74 337/518/74 333/519/74 +f 335/520/74 334/521/74 333/519/74 +f 333/522/74 340/523/74 339/524/74 +f 339/517/74 338/525/74 337/526/74 +f 337/527/74 336/528/74 335/529/74 +f 335/520/74 333/530/74 337/526/74 +s 1 +f 317/531/75 318/532/76 319/533/75 +f 320/534/76 321/535/77 318/536/76 +f 322/537/77 323/538/78 321/539/77 +f 324/540/78 325/541/79 323/542/78 +f 326/543/79 327/544/80 325/545/79 +f 328/546/80 329/547/81 327/548/80 +f 330/549/81 331/550/82 329/551/81 +f 332/552/82 319/553/75 331/554/82 +f 317/531/75 320/555/76 318/536/76 +f 320/534/76 322/556/77 321/539/77 +f 322/537/77 324/557/78 323/542/78 +f 324/540/78 326/558/79 325/545/79 +f 326/543/79 328/559/80 327/548/80 +f 328/546/80 330/560/81 329/551/81 +f 330/549/81 332/561/82 331/554/82 +f 332/552/82 317/562/75 319/533/75 diff --git a/src/main/resources/assets/hbm/textures/blocks/dfc_core.png b/src/main/resources/assets/hbm/textures/blocks/dfc_core.png index 995d8637a6a2c28aeb09ba4f87a2ce5af001e6a7..ec8c2faca29aeda40bd7ff2643a79ed5bb8e7c76 100644 GIT binary patch delta 273 zcmV+s0q*{^0?`7HNq@os01mTG!`rt|6$pUU0GO>JA|i0jAcL?03j;9ukevQ%6ZTwGkFAUFw;3u%fbUD}~b9~^h#@?IWyB+^>r8=P$Z7{3>IJA*8{ zx&~tmZF`UGafh?bI}o`nOGqgVSqOnVzv+;O=io@5rU~OXVr-sg48!0#3C^IdYZOHR zrIaJ5X^Ot@?Tr_L0`zKCRp6XEG6{v?36Sls>rCA=jmbn#lElhi7M%HyDgn+8D zZ5yh}G)+7`J+bdQtu>r;hzP!vGL)uiBIis>i4X$4cP@eBH~?_Y0Z>XI#)xd&hI5YF z?KWPmwbFYh=ZuIDLcn`Z&UtKAeOM5Y(bjPsqj+6cR230DJ4`DGy9K;nK92ZF-Cgth=_2WC#s67(tF1_N6r~Dqt-fnn;F1pUsdrJylbf{ z^E{JM8k6zfk5K~j-U%UKX84Qlzcy;Elu`zR^E^ieQc9x}0C|3X#(PgniDg+vh*C;p z3f_B`Wx>q2-|yV-_rb#FoJTt%f~rzV!8td$To+$nUNAFCDb!jY9f%0Mch2)9#yG5) z8MoUFU=)9UfAjJ2L5%Tll$~?K*G2vH^_BPccdp0hc^(-krO;X%5tp1Zt+i{Ws4AbI zpM&-_M&}$?>{XSEolMijzVCz(#`lVKtrZbrU03#f=Qs|WbC?;u_lM}Ea{W92>$>vu m^YdRaLkNTr2BX#*BElc};XIEdr@Jix0000hi7M%HyDgn+8D zZ5yh}G)+7`J+bdQtu>r;hzP!vGL)uiBIis>i4X$4cP@eBH~?_Y0Z>XI#)xd&hI5YF z?KWPmwbFYh=ZuIDLcn`Z&UtKAeOM5Y(bjPsqj+6cR230DJ4`DGy9K;nK92ZF-Cgth=_2WC#s67(tF1_N6r~Dqt-fnn;F1pUsdrJylbf{ z^E{JM8k6zfk5K~j-U%UKX84Qlzcy;Elu`zR^E^ieQc9x}0C|3X#(PgniDg+vh*C;p z3f_B`Wx>q2-|yV-_rb#FoJTt%f~rzV!8td$To+$nUNAFCDb!jY9f%0Mch2)9#yG5) z8MoUFU=)9UfAjJ2L5%Tll$~?K*G2vH^_BPccdp0hc^(-krO;X%5tp1Zt+i{Ws4AbI zpM&-_M&}$?>{XSEolMijzVCz(#`lVKtrZbrU03#f=Qs|WbC?;u_lM}Ea{W92>$>vu m^YdRaLkNTr2BX#*BElc};XIEdr@Jix0000v1wg zDus@WoManfs9nzN>`HvUTwZUt8vxEZthIztN@0w_ITvx7rfj!cj(JW2h;MIiuTo09 z_ed#GN};vJdyn@%KIWWz!l6bRV~|oZO%wAxW37$JQcBV^MF>Gzma(|&I=uG_8GyAm z78qk_ng(kvkH;gj8DmgNal73jp63}I`ZLDF^K!W`&ocl*2&9zsegBU)<2a%NGl2IV zYb{!9ilSf~$EYCBbK16LnkJlc^nJg0&@>I>I5JJs(?f0BMyUW{Qpe*FDJ5EK&gV0_ zu4`V(l3!iN`FxIJtm~R#7^3sxJe^J$W7upqi;0`Eyc+hnnKdpV* ci?Cq70XRi10;h-%EC2ui07*qoM6N<$f~6(xx&QzG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/forgefluid/ethanol_still.png b/src/main/resources/assets/hbm/textures/blocks/forgefluid/ethanol_still.png new file mode 100644 index 0000000000000000000000000000000000000000..8a72bc22d3b93ad473abb80c239c099165187318 GIT binary patch literal 538 zcmV+#0_FXQP)v1wg zDus@WoManfs9nzN>`HvUTwZUt8vxEZthIztN@0w_ITvx7rfj!cj(JW2h;MIiuTo09 z_ed#GN};vJdyn@%KIWWz!l6bRV~|oZO%wAxW37$JQcBV^MF>Gzma(|&I=uG_8GyAm z78qk_ng(kvkH;gj8DmgNal73jp63}I`ZLDF^K!W`&ocl*2&9zsegBU)<2a%NGl2IV zYb{!9ilSf~$EYCBbK16LnkJlc^nJg0&@>I>I5JJs(?f0BMyUW{Qpe*FDJ5EK&gV0_ zu4`V(l3!iN`FxIJtm~R#7^3sxJe^J$W7upqi;0`Eyc+hnnKdpV* ci?Cq70XRi10;h-%EC2ui07*qoM6N<$f~6(xx&QzG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/forgefluid/fishoil_flowing.png b/src/main/resources/assets/hbm/textures/blocks/forgefluid/fishoil_flowing.png new file mode 100644 index 0000000000000000000000000000000000000000..59a2057bdb491f1ecf6cfd833124cf81499a9f27 GIT binary patch literal 489 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/forgefluid/sunfloweroil_still.png b/src/main/resources/assets/hbm/textures/blocks/forgefluid/sunfloweroil_still.png new file mode 100644 index 0000000000000000000000000000000000000000..533362c50583df524acf699151fba91a7b0e0b78 GIT binary patch literal 490 zcmV$qO8hzPgajmP6rd}5oXp>1122mo|l$K`S%#>nUMA;yUJ gp6By<@I^M*KYijnZ0#n!+W-In07*qoM6N<$f;^7o1ONa4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/gui/gui_fwatz_multiblock.png b/src/main/resources/assets/hbm/textures/gui/gui_fwatz_multiblock.png index 0dedd1dc2b30896f42d41a0f8491776bab09541c..9575c78c302262f5eb6143441e9c2758e47b0969 100644 GIT binary patch literal 12461 zcmb_@byQo=x9LxJM% z33=)Fckg@m-F5$X>$l!o$;vr%&dmPIp1o(!?D^!iwx%*69yJ~S0E8;f6m$UqguVm; zIN0bPGw)J|zjr>m%1?pHQQB?v4VI&vh8zIY!0{2*VDvq%=QCp;03ho4`vr-D^&SBL z?^6{8IsE{O{SUa=bOs*|QK1b7qpIRvB#ih`q5Tg?$T7aKOAs^gvq6u(>qRoI^fj(X zdZtfgTxQ@B@t4OjU1=Ax;mXO{;WA2CYuEr^<(?Y8^JV?8bP$SKMol#}G&kQ|v^DH3 zRR-^(qLcN8J~jV*IT|MBDx?#heUC$R>X@s+F(>fxVi*cJYT}5tvF|<>t3h`t=xmxvlIJX%@Ec%;X=3lHQ)&H$u4~mKn z0#p|<BmQv z+LybAF0QW0$QQzDSt1_Am6hBs?(W>|i|Kr}c431l?A~ETHJ|*hKm9a=={gNG0jHZI z$&H^r9f{bnzmG*O|Aw4HW}-BP_?plLpKe!ydmg` z0pQVg{{EZH^>?j5??|hJ)X6)`fQ9!oVAoRd5`WYy<|HRk@Cvs~>Jyku%{c_R!8$Aq zEWztAsJ`H7v)>-HRAG%jGXP|?-@GWb>zKePL}dT?$pRuUhDz>&@|Z}w4ubnZd4xc| z&T^R8)e~5Yc=04*S-(W^259Jz$m-$(xm`apX=myj5|P4S1oa0@pr2z8&0r-tL8>=) zGZm)F3^(Jkzl}a6Fvzr9ir)MwbiPAedsiVZmzPxxIylW5-z*&BhfY;LicA!O^jUla33@XroVvGCSfSSr4Nbhq{NXTMOib~0!kEpwN-`>WW^BY|` zp3b|fv0`6w4dSHFVY{1#!063cxY$l<;Uo9^VC{0mY*6T@JjzZ}s6N_vsxWYV5IS*n zfT>$2nn7HJ{TjuzMFT{J$)zY+VX?Gzl={0n){$dcx5d_9Vn3(~F(Q32O@=&1 z_algY5uQ~zMElSHcK1{!6%{>;(b^uRFiWjXeIjq3SZxYkp zRmP7~_)ne0C$jEtrb*)Be@0@PorQLn?T21{$tE{WCKQB92DjXj>@TRC4VEdiNhw|N z(XF<6z#sdm41^+`QHFCq1R@5z*uIw-Q?4S6SPa&~jZ$Ljsj%nolk4?p7#DF`xBG;O z7lZL2+9r<#yCR>7dd2nC@3UAF1XEsI?k4gM!doaAhfhvp%S0V>iWb&_MJ8jOH#;MP z9vY$a2eY+2i$98*!lg5D+>+K=N%rd~C(gDvL&%KVi$Ao^Ec;4tID8P`Eh{7%Tmgu! z9+dSwLKR&u_-L`wcSeBmou*245M&=3sJzO@O37wQWuOS4WmXV^Vz1^FTEe5hr(v973LcXXJSj?QjuEO zvihUvtasJ5Th#6$Qm~@(A4?&p8je+x{U#)5ax37l|^+2T4bK2@diJr?Uq|X7#4j z1ce8<3ZDp9WJZf=7lLpe`|7efMhZN5bEqQd^{~$-Jv2MZOLBsgQr+g$p8}Rkw_=&Q z34Q!0ZFhNU@iNPv0(La8TtyzR|4on+<^X<&5u)4Gnlyzf0&Z2&YI>E=HV(7vB3D~> zJgsg=QG0u{Hj$WK5l$w(8Dep|L&VPgL<)rNpQwq3=)8Ndxt?NVkkCW39*Wr1kvbzFB?`Khzx7ELG`>2LOFXj}IS+gWV5PW{yTNOowT5iRc z+0joU&4|Hvl?jjA@m3)5UwlU%o-X*QcLcu(V{e=cyDXv&-8F`~lJ;^Tltjfu=lqHq zuQ{(c&pK9N>V8|L=Vayfl!5l6+lvZrH0Ej}s^U2OQS?=GgkcWLSjpsQyA(D3(7)}P zX8ttI5?is8a&1ZTmwpgdVq(C{PIKs9I`ne(PS>-f>LUW-@;G?4T%fty#v|9ct7B(V zxOqnzcP_?2X6>0?E`wC&AFRst!W!ZTWGAKqTw3-1^f@ZXrQ_i}c5Ms!3XFg@tjlMW zw$PJoA3^cXM1{~?qsD}dt>AUcAz4LPrFuShZ9iE{JjuQJddr)eY1=cD;r!fh;=KmP zN#v`7Z>P(m^=nUHGis%Fj~L6jv4{`n>JJXvB_U34h-GIWx15lw0NF4 z7$%nVcB|a)avvkV_dJ%|uD^`!VyJEQWaF5Qsu3Z{A*QfD0P}AZ9TME2vl_?kFKQj> zTA1%tO7s;|7&rR&xr~VO7EVsj%M!|xp2vWss%M>sgO6gsXYpa%6qNLmD9H()!^b9` zG80v(ucl^x1PA5Q=Q>zLE-;7{<;!o65>#nG6|4YZ5~;P0+5M@;yW%UWD(er9_#VkU zH;I_E<9EK9RhCf~Sr#{K1p***OYZewq}IR+6*}YQ&?jzKwK*`$YxYgh@0?BA*_On+ z+qe;`66S6ZYmA9-NG7+W;1mew&r)y}wj>sgkjZI>?}Oa(wR6jkD%2^F2-|B+S<2DD z)Z)V?-39v20>$`QA)95kh-We#XU8;*2+v!laf?;Tp+is;du*baIL07&t#R^Ik`%e) zN&0S<`p@vmjE|yDt-$&n>+H>G{W|ConG=IkfnpVBzFLQO&8aD_YKihulT#3ebqYfR zL|gN^$%ET;oq>8a@>~&xctu)_Pb}-1WjcKPwWHG=DdT{156sm1XQt}nTt|M;qv98E zK;u>5<9pSmkTdb)2(mjSwgG^7XKL;YuRc5zW~}Y(qtJ&O30IU!Z!?Uh9dt;c4ygJu zsdz9F@q0H&wl|dx42Q+Wgixt=%1xraulr}V| zHDkNcD}|#b&VN_eg35E%nquh%4}^DCsOlh0-&!IV3x3`)n|XvCh!yxRvos%lHS?F5 z4nc0ET2_&RDtpg^E%XC6SNmo#(F=h;l_*nU#%4D_WiYT@ruiBu7s6tYvlFiZhrn!L zE8^XUPm-^f01kxgFU(o|feZ4-xc0ZdEt_H&VlgGdeV_CWhF94aRr_wMW?pZM4Us=f z{+?i`1=G;|_MeUCO`Uw*jeS*}-3_{>i6>aabn2h0>3Q%=VkzMyk|oTWX(HagihOmk zrp<3g88@W^L@!GfA7Nq-BBbw~gO#FeZQu=SWn7hY!h=)P&%`AR1_z%4_$gYKVFo4e^^)9DnhiWbf1H8(E zxPFKzy$z1i_oR#LG+l*2yLqOUy6VA3aE#v-k_=sJ9o-q_lJ`ctcI3tKo&bt4H(JZ~ z5U$YeurO{E<0pLqjr2y3kA2`M9q0nREc*rodFMJ!!sXDvUeo`o5&NMVSM@i6B!P-k z03*Kso1P|LWB}uEu(t*Y^Nq_(q-jHo+SJin84%&Ser52WzzEDc+ORdo^N#Cb6}{18 zF!Qh`2E`o$>!D0GjWG*jT-UX^GjeP42T|u10qYGX?gtDMmzkg>X0l{jDUDPBHhSN~P$ z-Pkm8|BaPT3hHab9w-M!yKy^L8$#0Hz)RVgz}#7r$}uy+Vu|3qc&LI#_ScB>Qcfb3 z#Biu~=1YSMD-*>})K4=+Vl8#u1;)~v*13pQ!m-=&7zbW($IoNF z`td?`@=~T3r;KJ))M*!Vj(LtE|YVR>`@W5)nS)&(E+?x z)E%`k`{)$5dr#24yLLbyvztxE{VxJr<%QKc1OD8O=^16PCHQE^U#lRkN_uIojGzH> zv?d~>$rF~v@szYn5OI#0te|nX9RdPvg)w2Z+7D5r+(cTJ{H1dsRY48_$Zv zmTQk}OL>w`Q3*|21?;_`%YHd5W!&F&uzUF0woZ@%ZM7k`t=Xe{O4nY&Kv4?AS)D17 zREnioho4|)+o%wvagmBIly=$X+PeS(RX)3zFE=uzz`mHe`Dc70d@*l|;3hOM(-=Ex z)WY3?OcbFrW2BPkZ6s+BHcnN|G<*FWiMvq{PP0Fo=fhMhIUx}8hTVBX89yv@(w3on zY_3Zt{kI#AAM}m3bXK)TQrqo8Q1kDwd}>(et%u;>Ng%B~oWWN*tgZ@<_mARb zJI-`+3ICAOxA5dN;j>{nr{62Gidt?&&>E#{Fw>hHR79}7Q7Me)VM0rL;V8Q4Mk`Q( zD3$hn#%cswg7CU-@nf{&ubrM| z5p;n|r4ZYf3a1AGn7-N)Z=G9)c+&?zemXzb>3R-oJsMg6^L^;(5tvcGn7|QbEF8UYna4zXs=kkOm{27gk4+?h6uZ`Nc`aw;)_wdZTdB36;g`Pvqwsi`9JC_Mjb=HaZVQt{Sh=%eBX)>*H|YtG6kbyp zbUT7A3FYVLL6BK)iU)hBEB3ui-zC35j|0ktpD$}a|I)CH;>}ijw+cR3E}Q-~GnD2C z%P{%$?pX4srP$zX-V|kPwD$YG|Mra!@yGT{%fj8Ux!j!gL(L$bXq|Adl^Ij%1yvL| z#Vq|dDB1k03Ioa^BDDljIXYXS5_1YEb*>Uxt%fPI|P{FJe!Ir485Q zZ9^A_dv9aNoMIe1<7Ce?0Ht+bZwj8Z8Jqh+pD9)?g?H>7d#?B2t%?)NLGIBZqaLe^-RY`p!@ zNLz7M_M8-X-YaeVv%zpi=A=IGV72e6mcIK>pH~BD)}40OT7mSfa+2cgFjLn+6GCqs z2j-v1D_=SS!r}d~+VTE9MdnLweB?6Hwb9S z7f!G&FfyM`HT7Z#$*#8u6Z!GYq$H)IVw#U_n(z-{q>eic(7eVw@pxw!G`m|EQH9ZX zaE=vD7`8ffJ$(wDt#P77Jp?{Y0*B#5`n67e`_=%+mV#uEI(DnkX)L ziC{0Z+SVLy7S_wQZ*1FHXIAp`x5W|*b*Yq{tCgPB$lA&hW106|o*v(Cx$zY8qT50K z5&q_76lV0EEke>Sje%nz63hd|>wceWL;JE8m&yk|?QdipGU|E?aVX_>*v!XWMV!7a z))0#H5$0USSB96cmuP;zKGy;DvQ2^IS{pm?Num|yCOiclXsJPo2Q6!^4%a-SW)K|8 z`!Ld=^&h7UR+{`&XUWfeKG44OH*zJlvArG%&14H5#QnlJU>|$P5g!S?O4o`b*6uV4 zZ9M%$_{=+$u@`C^vwQc+mxJZ{j-Qqa@7X)YPsXj7?L;jh?o*|Li$bv)L?vA(R)-Zq zLS*q#*v9v#)Wnv-15$EL1{|-J0(ugrc3(FA;wo25+A_h7`CZUKFL1$Y!SEDUE%6$` zAn`uB4tu5{#}K_L#3tsK1vSbX()I-bIyaJy8TeM@vPtBf!%)0V6T@S`QyY83vr`y? zfUG9VN$!2=IoEp1G!Xr2?xaS$L^E?j3q;$C$4Go1yX379N;FS{@%61e??V#qured$ z3mz1OBmmV+xc`kB^t!m54aDp6Q3nuR#s^oQ{Crl9k52AcmqWC7wz^(Q!A{uIg(&45 ze2f1<=sXdlDn{3wux7M#-svsxt1caCl8|~AD#j?Ch>;P_ zs|SKtUW*KdIUesv&W}Uq5{{VD`&X8?-aYC_MKM?F&Bp&-su$N*cH6;@75L+@sNW*d?IW8V#+~`7EY);N4%4t3e-#*x7 z%X_YB^LU=3on=w^kGP9F-IgTRw9{>{NwaSTPC8D;z&&B3(!6@6pGO$KTYVDbXn+OX z2dFU*9kW2qCy601CPendbL!jLQj&6{Q_Z_YoZwQItEbN*&zweLB|J8gYwqZt2&rdUvBd^%cV% z#JBW&EuS`z9hY`fylscHnigTzh%j4^0c`(k_Gv;KXveF{c@d470;2ZJMPI>A>+(C% zQTK$7SUo(o&~Kz6dxg&@XWP=oAs+s594OGtPZ2l%p5U@TitKr_v;tY`ncViO*B-8*9(E!0jetfdA}jkbs3M92_jEXbh>eD^V+$!j zb$RRAk?g_%kwa(Z!pDPvjp4_=jI>kVnNr3nb8)!KR!kMmZD@Gfec+EKR4!>Zm8m{td~pMDJzPrBx2ITt$US^KPZ(X=UJJ z?x0$?A@NFE>gRJoz`>=}vW5`c!)Y$^v47=gT5c+Rd{UQGk(Ct4|2j~@_A_~8Ah5F9 z@#CcjUfCN?O&+ey;#MvqT+rHNhS=Fo_J>wPNnn#_9BKBOjd z`9prl>U+P*i+wY3^Ty@a+YkD;qErVSm`Z4OW{dbD3}gJ-^a9mE*eR8@`})GU_H2DQ zb=G|z=|bO-m-S*EQl@B@I8H&;7#l8KKam8!*ZsX4!ohPMRw2tF&(5DdH>G&&^7<(-~e4$@X zoqyHtV`fgbD%P`>Lsc)z0ufE_ryvM0Q=>?Yp;7TmA5&T_47qEn^hR-<(bt*O#W`i& zmVY(2X!HqIA?<8*8ca#bwkiL4F#Hw^Sy2YRaMOJCQ1bUU{Fyi#$m`a6pH%n3pq?slBAG-SmyTUuF#G~(qtg5^%{cHr!Z#PBC}r53 zgPQ$+Gz+OQpSl75*SNN{vg}_$5KK$FzE_ekXaKBF9EzOk6SjIn85ud-Y}+o~w-Y(3 z<>)%LWnq6wrxz4y7B+Z3K@MFp1v{O2U_RBZceD5|X4~;CIgchRNaBOf#Wv?F5>E=7 z#vKx2LyRj?*1m04vIj2iavwgx<*&pDsZVvwA7!HV{N<^WnX9c7x8}g)5yW+j$r;PC z{ibJzCSUVt^32OR^62Y|V{nn{STnNkX1xio8~*O+hH$4Dsy#ts$kiIP|FU4zmgzYjfqd%Zqz0_>dU7E zHX)DDPFBsR7A6g8JkQp)V0%I_pCnnm+yLSczYx^y8GQKqwUiN(wda-!(Nif^WOR1j zK~MBz!WtQT+k7o;tV84w0^BDK#?x3V0Ms|YiQ4nVAkGO7OroxAHMZwN=RjV-aE8-5 z`e037Y=URMI6DV`H35EXTQ?7$iz&x4umM&nzydURGR@KtR|;|TlvFgKKkfRGbA@q; z1>@%F6QWjY)3aXjp17}dquohcUuyTOkvD{3>D|dRRq^42U6GpDU1asi+>*s$&C%tT zjaV|+(2%{wG&XF8aWUpKy}((T5231a{{`1x(!ocrEJH&Nu}C9{g9k9h%KZ*;<)q6|DU1V(tfNqsVjZi&r_OgJ zKFSg(?mhtp`0ACgRg;xUrH_NoJx;%(zw7E|h2$9L*!~m-SHU;#fxoCY+ zF62mtr}f=r_YmypYu^f$J5;kBKWVjXl*F=~!VN#2Hi~gF;uZkU%ZhP>%I(snP`PA*vcyN$;cw?BW8b@7{ zQ~svmFo9sV%>08B*QngxOtZr@eC9#V5E|`I1nl(|#8ykKfn*&Qzg+WcK?@M!{S^1Y5;v&xAXTv7DCcjkc3VjWzU)QfUul*H-B=DOZ4Ios1(tEJtXtp-S7Bl z>X9XXtG@gJ4f){=Xzpo4y|$W~fT=5ynKo$;&6{v>qXu|tI8wYCeEE%$q5Mylv!=?r zg=>7x6|-{JPQ#a><-yB=xT9sUTl#uL2cH3+p!P|a6enW7-aW4NDDt0_!KsAu0cGhkI{$FDZN!6p zYN2IBm^~k}k|Q?q^gVxFCp`OIcI3sXsTd(v7#0U94)PhrjiKN9#7LUzMNOW6%?irI z3`%fAT1KoKWh+SK?l`pE?_zhBqb%+Zf80v}ro-zvJJ*KpkXwRD8ayyfh@^Jz?ctW& zh_uD;&h4k{@7gih;qPIwMMyxQ@F?7MQ|B36=56_wBnNvKMex+>(IUqx%-R$LdcjmZ%h96Y=8Di7@khd!5UweG>fCEI+xBo-cZQaBoNvaZF_6Dy>+<1{cie>0WlvoQTO#g zSR`Jw=h#iQh+lj9=|1+^8a*x*diw}j&v#tTud(g_@xU>gDL!w(tDo+yE7N{zuKlf2 zV#a_W^wAE+i@Gd(fFuYg0#&cEEpHf);-AeQ-B2|1~IMv2Y%?3mRT( zmszZz8z!$}C1Ym&aoO%8fY;$}3aYPFatV*G5`jw8`8!eY>7Gbc)V#*gQFg0vyo ztBLAYr&L$W_n?o?e)v_+cQow0H0iNk40bTgB|KL}XM|_4wGTH~2dg!xjlekTJ&e;g zg$y$iSsZa!2A~-4IzA{PK^$%{%b3tYQ<#d+X!ya##SYy&8^yNWO`#iNBiQN9KpQ==_uVDEExR?!Le;ms30s)-!J(kKnI z^b+1$gg%_946v>RO?|=Ry*+?rbM?aGdBhjzKGR$KVm8kMwRqZ6A>^H3?1ym5W~|86 z&>$!{jbsaz5(~Dk1YJ_YF^t-}5p=5I0%MZN7NNEp8uwx7X@igG|L{2YX~s>U@yjnN zU2Mo<4aeVy{KF6ej%9pT6aL&@^$0m>#1P!0>@^0?zh1Pw)&Y~yqw}u`?y~rjFcUva zG@ps5$HBGNy@F0i4?yEGSphkTSe>JXqn=2_)gY@eN$%528rTyU#Qy07Ri_gy!cjPke;k1ZM-J`lu9=8dp>S1NDzJIiaza&;>*Lm4#8^A z8qse-lw#lzTY|^OqVY?+yxL}>BQbaxn9C9lebUEPX$^qLHMe_gn;=sNU@k-L12=8Ek{M0x1K2sMf@S;Fv^Z$4v~BDI&rWvGPb0; zv&d-gn!vrHcOg}N*E&y19)YdA98K!@kBMDpF7Q>I8+UJ^`D8Da9_EtDzClzfUh51N zqTj)XjR>kyW&Ek%gJK*?7hA|)>+gVotcHV?QIu|%(1pdp?!L5*eL(2|=D2z}Lqq@o z1nv^aRd0L?W#E$OQ8UH^oE}d@4sODV=w*e*PwsII8UnHcd^e4|C^<=(OWp>nxc*0= zQ#-@RMTy9upW$<&EW75EB%o%rp^U54iw9iU+h{W$9pqs#$I-)zs5g|^;j(x@qrimw z{CbgYoIOwf&3XghwW2(eLMl2m=!&%`hgaueN_&Qr8WlN2jfk$aW6v*v>Gtdx6VM^J z?gkox;vzB?B@lk_>_N8oV@%^N-*tb2mGln;`e=(u4)1361+QovriJ(3mu0`N2dG}( z&m#Ooq0Vb0PD?Bg3YfIDB$qwMF#}gK7OIZCfU&oc{8o+7m3YzqKC5FxcmI~-?*2LO zSSyECwKza1;5`@7<|#x`3g#KGk@_5aWGh3!adV8&fTERNwr&s}1g!Geku$Qf0cFpt z-n(UmTZihZeIj%R1JNsx(K+&PG$jtrgzA5T*XaN)S_!Jcj>Qo548ebSX6LLgp6`YE zZ5efm!kfb8rGjoKlgkFAEMmj@s6BeLSp-?L*m|QC*85(mv6P<_M#&rFF%BoFv1YP; zm-|~N2bKv+DF+rZAPt;O4g~{FPT9QotrbL4cQmRq9)L<>FThM{Iv+i1oefvtRn7zL=k<)Dv(#i z0|-)I%iG)W&=3+P-Wz0by4LB=w*dnYPJ88g{!{46syMpP6i=Lw08HfGzHkzyt+G~9 z^Q||v$TKtc)c0t#7#x6=Kuz}W?so^=4JCA!Behk~tuWmOuM|%Wew~`lJsHeNOM?hL0dGKZFz`6J z2e$HGP|8xUoqRX6Qf&Vrx$1!P*!cd%JT>@t3yc2*0nHD!z0Rb2ad)Mg>1EHUyyf2H zS;^s;A3J!WOS?jS74vrZK4QpXV}U4S|2M#M;4_+mi>BKC|3L9iC(;XcL4V?8dna!1 zvzFhYas4d(JLGHy=s;78_kVXat{(K~b7y4XCA((&<%B_a8QO<|2P9av7`vYv{uUD* z6t)3B<;(tEz5I`A{YP0(JpYTb*!~(}+}~(cf$?8-q5ItE(h?V98a8O|Ga_{3o!X2h za7L^{1Dgty#0Tf}Q=AIB8HkoB(|yp)Y4Ilrrt!1LNVWzWiHY{YS4%sLnc@+D=$3M& z-#PUX6||AGjB1_k%>>^lT?fCAbS%P)(G`FFdPJd6PvM@adMn2v{8^?^Qt+sV$&Crh z;^z;Ent~L08}-c6X#80tR{9YypYCt7mpLA_XLWaNE=3K0A3q!+vW<)EOC;q`6?;_d zWA4pABXH^0n{1-dD$$a$bej0SeY)d$#hI{Siuao*vZgUk_h%SL;p@m_O#+e0;P#0h zGdGu?Qw6C-HjvC27UJ;BnB>^6zgnUJE||A@=>!Yw{vmvi%nZ zR>m(9sy|fVuhG#4kBOKBc_e6$g~1C_BK1K*Vpn~8eiTxNiMvv5B9%QI$~uEg*KdWJ z{Wgf+O*p(V6}1@UGfCyUkeswjnm=7?T$+TmNxN)Y&OMzG3oK)ke|MD^TN-aZ#HHE# z-P!7CYqIU(wUV0U?sA!75Di*w&&YwC!o-#<24B{>*}vF>*IiH+b(82v)$65faRvX* fXV6pb3kLL280@DIzMMpfo9h^xi_~O+>mPO_8F4fb`x$id5+( z^xj(_39#|^|MvUNf6tz?yWgIZoMdL+ckZ1#ckbMI=84kNRi`9lBLe_{Qd2`k9{@o3 zzaRiYjQ=rlEwKJua?@A82mI*g*uWPEZIpDB0H8FE9A{31FOxcJJaq#As;0kR&|RWO zyZ|8nNK-}WvG;aDWy;@C-Of?sSgeC%Q8xs|I%9ghhhAMpXkpC<2`QVX|FJ{YR*^7RW<5X z9PF}sxwz@F*2u+vsHKe>W-^SJQ2?F*_kS-K0FK-fG|pP_*ivc`LvH1Vo*{tWelmXg zaUUZ6AyKx#%^Tet7;>>{xTitUGrpS7Dj)FO8674I8%8r;9kdkP7QD#gAh=tJLSSY5 z!q75=)k;zp(WfARI}xWK!iaFZ5CWx2(q&f}O;42HTpiTrF-YM4n;}IYcXj_1#9d>F z8yhq5J^HD8-%=&Hpsx6%I&)Aq+Y;3G*GW)HUk=t>sl4`rff27T;pwG!^I2y^!#tNS% zNZ)pcu~U4nZjtdTEOt#P>zD1F{1)I?f1qab-8FsG!9#gsM;)&KK_E_-Y#vHIcmMhG zjHKE#>&aq5`DIvutVO80H73+U70>nnO8BaYC#_j1UOxP@hBvq<+(61#r-*{C~w1E!!1Hl9MB5=qCSL5 z8b)xZ?Us+6%i6;pwv7{bZ+^|^4O~e!R4EWP?@1E89e{D)Twl*F4%o5pADZeY0)pA3 zJdDeI_X%fqx+dlhKO9e^cK;yCsk!fBC_p_=fEZ@+6x?{z<(=oU^Ru<2pn9@qhnk@h ze+zA!fxxTC>u(F>h~^z(D?&*ANen^LX-)vpGGqhM6QjSO{f=;RHcVOh=hyTL-|La5 zZg$2Wc?WH<2ldndXOxB~N{$)`05nc8IIR{#&`gzJ}vx?p)8CjG7*jE2it`n!aK6~GjUp8OQ)g!GeLf=CYvQ^7{E`QGnY+1j$I z{8wG3F9kYdW4B_6asX_TbjI+;Z3U@<)1r^Ypu2nd#qV?C6rUaXJ_N$1;{Nr}+-VLO z_g#NRIA0rb?9e#7Wy^tO@Rs+4ZO_B#?U#4DeRW?Zy2)G)Fl_h?a|{gSQ3|JDKe;Jf zl3)(EKNm&p@Y@pYw}>VgSHD{?8;G2m*14Y>6<*rb5>LU2xa%U&huYEntR23-Wy;Uy z(>nS`V$)RUa{H1v5H7%jB;tY>MF0w62$3uDQX+4E((aOqNA|xSc-(1qWJKC~3PXDi zVRy~?9i~c5T=l;9a7WTKgQ>aS&~R6M<5M@T93+XW8X+5NieaL)suB8`$7XxxeCmnj zn<@=i-|>o+m3y;qDbwl$V% zUd=hRV|Im8)kxYMm6FS^NitdU_cdKAxZEgcF&q(b+*5u|pAVLPpYwk6w-WX#Zd&p0 z(NVBj`}S7WHbl+`h%w^4aW3Al*N6ol0IPi;ltYLq7bDi?J0dN^sP5Tjcv&p8FKwpS zuibSUWkk7E*7|IntgXkZbA5V*@R3xwVQ*Ht1(5)>W- zbIy)BSeS$QOAMvPS@sUxYkZSaddI~2&#wQE_AR%)v2bZ5Q+@zIrFMp1%uiUH(mJK_ z?tNkiH;S_UIav4L`VX(~xCSvyxY6aKetE6K5aX&|7cZH*Ka4!hPi-=Irlqe|bvYI+ z-~SHhSSy{?ta)AM&Z0I;AE^&*Zpze=sXn36UjMRVLfLNtZ{#2P75_fQ{M5y9kyJ(9 zL?Sx(b1aj5c@S5?pHQNe7lDITVNIriBQ{WEmZ~_h*ZH$`f?woKM!4Os)@uSXgwXD1 zK2`h553>ongN2z8ovY?L1F3~Q8O!%xFGy;`?un&lPnKnw8KPfd7Lv4N0@R~f7uG2K zW5RFqCHy|*%-JQao{sxh&#u!0iQ{Scu`e!sj+Wm+#81t;BPedBV7JSn)Z(N(&SuKC zhX|%sOnl^E82xb|c;Ma@!2kGXomx?g-*tET)D+gtJA zojZdx&0BocHm;o5EyIkQA&?{QVt~cMt&}Wi)T8HyKj*LFMHPh@tHU^rzQ=XW_dncT zrl(5OEdim@?q$hi_+{PU=o#-Bl7Y5R0QceA%xYPprn+Xybk^d|BVENz#}B7+GO6!e zs~cl#Wv6YIFuCWNDi0Scpio0k$ovUi&j(V-ck-4tx5@^r-?ozbL97j3g`%ePMfvm1 z;|cMSPZl8JIo6ac3)NS9O0rY>D0&^?4SKl6;9iyGDhDd!pC3n% z`2aPk)x@W-K3!E?5Ug%Q?#Hqyxz7h#L#R1D0C4SqVjclC>Al!F+}?|Re&za0b?Osb z;|1ljMO`z9&Eze~Qxh>qYO}d|pKZ2MCkCaL>871$lr)Iy3mV(v{g@Rraw@4!O^g$? zLhORuQ0dADm-Oj7p}gTf@0uq-#U|cdeMMS%S-;~AL=j?0*lg#f$=84GnJ)Sp1P^b3 z{Ke8T;WRs4J0N^A!Ac~F+jc55zCyFM-cy2zcb>F0 zD%xpaiwvO6$^^QuZ%<)Hza))hFU>A$@;I^qYuParSyN&+aVXQoOt3TXV5D|4=MsB< z3s*Ic;@I*A+ElY$K27*vqI|(6honr1?giSC!F(EH=ch^CUq)v3**5musIpOWQp!mb zip4pW>>i$#-GkXhZ36pV4&ujJ(B`xcNq)GSOODrxy9yN`JeiDyv<;`G^VJulhEa;= zq3f+quG@$iftu4DtYH*jxP)mC+r8|+h%F}3>z2rtyR71ZyJLZbq$8t1iX)JbJw!3# zm-`FyGoS-#@d!nY-Z;tu8JqmUs(wLIm+8Wkt zdx&o2GtAb$A^A=LB&A84gU=ega83$Hi|K(Mb+ii}WF*^8BDX@Rv!OQAQZ{yb&XT>< zDY&p26{nfH`=MUbW1G*Re1n&G7Y+6nEO^2+IRDUuGV%;c?pI$5D{Pt`?YeQh8X~iH z%2DY+^?f#Wa?X8`)Z%<#!mIq4h{JWcd(~QOaGJU|#od=~VK@I#A&|h@pXh2*4>ADj zh{)^2vKoBL**KL$h@(jFXE#{N6=ApAG)@Qz5A^lEi{PdnIB_+Pj6dA{A{ixX95r`^ zwB0?jmK8VgloxMbDj8;}v|qV3q1I>?^kFI{??vp^Kts0`4~Es0dVWQ?Nkd%s>uc}s z9Z+AxwubM?H%luyGI#Pobe4E)+yv_Sm*6cH!Z|Y7K0TuJl&Vs^*_VOaY2_SZeeRLf z-Q(3NV-z4j5(?HMoaj8@(=r(Hx>{2`7f-lEu^FAnD_s2e0lV0gJj-~#@EfXOgt-O z8QD9}qf#VUf{!}Pw-`nc5-@1P!2@}7>m7xG-SfduY7icGjrFhUtdJdK&X2sC`IV8v zO?!=_O^QNiLdZI)*c>^+30_+gKF{6aP6g=@_&OS09P==r!ho z6q0W6B&lie9A7(o-!yPFIf2q8l~O;43IF1nC;j!XF-x?U#KoT29@Hlf<}j{&edjqQ z!^uKC;W7R=c+hn6*Es7*AxNG%we46V_M6g+Cq7Q}zdu;^>@><5Z;2~`_sp*RV>pZ( z>tR3Qh#SeW6Gly#sz_*ZN0HXsfp2IHq)l7~$K+bN8V-eAyRY2qFlq&~ZEbeFdf6oQ zqh8=(adTt?Now*0)XHV%vbRQX6*SIoI}zy;Pf8GM3v;B-et&9dGqX^dT$b51HLgx% zO0?g9hkwM_Fl&B0Ibxc?dx_sPuL{u$EiRA+M}(WqT4g=Orebb zItL(Da>hvJQ+S>Zz{>Km)aJ^pzp`ojGtI&?L9OUkALI_Hnu40LkDF`sh;&~U| z<4cCMnXv7xoZw<`!OJ_@rsoC4#K&ZDv&;iCL`gyJeNp-ntxhHgU6H;#dTIr;?bn(96?;0Ub zy(%g*_UHy7@`1NYpJUgGci}WRm!ctTif;&_2qf_a zzvp^W5hxomv--M4kjoWJ(oX+=V60r`)HB6Kak{wML#s7R#hlx0ao!tmf$dxNjcZcHFf| za-5z|l5C9&eG-{>1)vw6H%fhQ%u|!1eI*d2=1p7(QQ7+<&~`6NJ5TlOlk=FunOp6t z{gUn0@c4S|2s*y0=)Db%b>r1n=16eCm=nRR!)XMGr~C7`szZy)eZ!{vp;^S++b?^2 zF@*Q3t%Qg2;+RKb;yg8r<-gIV=AQ>_eG>z$rcWqD zf;`S>sg@@9JidBX7Dvxi}RO!qNux}51O4qq7=ve0s=tgiQfuQP*^Mnxu)w4tChsED5_~rSqlZUYB%w*kKAg+%m9+U0BIgIuzeKLnT zZN}$75C7h^@w7&e26+2tj- zIiy})9VPqSl&+g+K{TE~6ItDN?h5cIq`EvNTN0ogg9tL& zYOe=n_u>$WnHGl7A2)s|&%~K4b3~j(SVdhcu=K)~2G1BDF6MK;#tOC%b-fRjL9Yiy zBzFw>IGoLBk9PFPyYr+6Dh^ebTD$g7sroO>FWg=&fA|Ey&t)-6V?o|s;%rlJuO0InZ*=B~k-(_cz#@W-#d=O~pctbml3;#L(YlN3)> ze0YAXL_Bzx8p7qVZP-Dw-f0w2eZ)ek;VS>mqUmN^X`s-owq|3KHc2=*VezRQ!ydA@ zO)QK3wtx=0&n&UcYTviyL246yRBEWfp}wAYE=~-->(e7@djI$mYn}HZzjxHp;<+nW zo$q}@%zGIlLidFDCT#x0Oo-B;J^E-3MoIcCkJ*+4&5Ft%Smp2ouU2(#b}Y z*3fO-#Okl$`;*_ygK4ZurKEn&+YByr;ZsI=l*q@eMeI-3g<`Wt;y}eJ-t$5nG$>=Y zL4ZaDi|@CiGRv-Lt@s!t04jFRH*ZdT;Ttvf=-q9;chx?BI0{+({wVE)I6d))m_Nq$ipYZ4^fy;k(Y>d4gaG+nhz`9@|n;yE8Q z!TF1)RIMR_~ZRlTV5j1;T$HS?^H04Z~>!1IxvVMn}Ed$7=?TorFqPA)sb!ooo< zS*t^o^uz877W<6bc{v1BZYL2g9+sC1>H0>S*Wb=tn%1X<@0KAIuWak853}3~8xaj3 z=Ga$HP)*|cwNog9f|o2^vr4uK09vAdR=8_uCMA)tYT6TT4~3w~%I;W=nlHp}HeyOx zgW6;sQoKfdB523R{hA42dVC}X1Zod7xSaoX&iwE@bvY&IqWt(wx|DxVgS8K%^!v8^ zfsN}2!g4xa-afBRH1a3t&}R-7;sT>aOOj&m7JRv=mV*?L==Ip?Yqu(CQ+*0;jGV#( zpTmnu1}`t&j=OtC-3PXWU*3zD{%q;`;HJ?7fX#o}IBuwCbZh;9F~j|tZ=+Gn@)UX_ zvW5L9g%FFkk~JT>fTcX(euMR4z)pqq#&oKQ3i$-NL;}^q&tNAL7p2gClj~hR?7cp@ z@{8_@)+v~KgY32!k(pf0?@LJ{n{%X17Xz65wO5r)!G#Di`oOz<6YR}43;oVlRtYpH zxejzF+N@DMIPGJi`+x%a=*PM4%(3lJ=O~9Io8hD{u)AiKrSraPTxv%%r>gi@RhAW3 z%-e2-4l@Oi7xrAhvNd{69@uY>aBurSGIZiCvu5Nu>YzR&@x%3armCEVQ=&3s6;_sU zaUk|IGp0kPWbn++JKaR*&~+fYxXC?yWc^xbF$vA86G3g)o1IE85t%nj3UHI1_c}-7 z@L8jlJ>7zbMz+^&XS;Z|CsIXhDv#ED&?OyCC9ty>h^G>r$Es)X`I7|mem#raQp|K< zZjN~aLPMxmh+`1{JJ;Pc|9Wqz0qutnXRYa1TLz99VlxA67uv0gR2Xa(C5~gre=c1~fzWn8){MJ`TE$JT*UVPp&0l5q{`JwCu!>3Spl8_;*A2{st{js#gr6K* zSl@p2`V-rkyzJ4Nl`ch*%9;>%3ijw}afS0v^5%EYLPWIXRVRf-U=Gl?4g@j@6CDUu zr}eG19yQyvx%BqJ{K%e8m3V5#@xakX&alLixRCo(ahz9Gq)D}D$6rkKl>f|;NSx9= zIEsb@gab;2M9vWay=Py3v14G=nA2r?=N-qS9a`ZRNf#1vO;e7DW>B-o>x8#(`X?VH z=06@UM8w2$$7Cz54`2H;EZEicvV~eJ;|WAfri5IaG{d*kRk_%c>xvO$Z_KP?s~vew zetA$_Lq-7Pf;HcX*Jtf{nbuCAaink)B|+X4zZAHkwi?h_;SYUCk*+Le-RBLMnkE6A zGse=z-E~)H!Jtf5Uz~L{Tuf#1qz5vMFvNaO!gNS25u+Px0thu zV!uv%bcJR|SSz%GtwK#?SIsIWg<>RQ`kP+9m6a`FLWKg}Un3xVc_;T7mGytS&sB8WR0M&E zFxi(F>lrzEsDPF1l-J;9GWqqRX<+x1zFi(^VL)(7j1XjzJOnxyK(bqB2am|7k)<;f zR2ExrPcZMlQ}^EuDN@MtiI~ zP2^^H3};7%FLu7S_;UY5t$-fqP+MK9boO+=EaO(W%`C$5;-H~63@Z9PCr4Djl^SzY z1!};(WWwriYb$wwzfeRLki(jpDcprhDsW7;`vsR$^LpN(*B&~&D#vYtsFfbS`!g;O zX%lymuCN58G}Q`FqR9Qhni@&;wDU-&rD!eq5Ke3KTJf-%tBKP4z$M>})qqJ;WV>ZL z@K$|XH*9GS3hh5NZPM;B_b`nM zQ{X_i_1MVC33j!jx>KO{0Wt9^A0KI;o|sii+x`95CKG$T`_q+O{<{6gY`9fAThig=q;WpIOh{>t%#Cv%49l*-$t*peJmt~kMr1qTDjPcCSj4g&~L z8sX5`ceCdqm@}-JT$o;*&Y*;*ci2LVgt;cilEkCjA%|10QjbI!_`-1`{;23+b6=Z{ z2b>g6d+BE_-;7=z!3~@`6ya*#56~!Jma0HnM8(UpHbQrrEmEi95klge&ew6*{?9LzT*fQwElO%6l<7DK!c*8d zskEmcd(QjPY(agpM){+!H*mGnDqJH{PXU41Q}i#at}T1D+-w;Cu-H5P*$EUA^6uqR z=ND(6O!g-!%U>Z%!D_hr^NxEjQn$5ecel1_Ap{@kHSr0Xn$0~OPY>UM!) zGfWt`2*SZGSF3r}c3guhvA>O2Z9@ZVC0E8Fu&y)?bZ;1KE)2o0CrJIO@&)xjcj-;o z-MXM-koHF@oyq~(Es^e=@C|a7->sv+N@a`>2xTwkDQR>r=c>N+sY8ozcRdC3pk6n{ z5=qN#gPLp0_~(;+Je~7wpv~v0r4rJ5hLs}%tYRUG1RwO;#}{V7d8n3Z-1-iQSK0o@ zsT(hGu{G9^?!!&i1W|1?=U1c{sJ_Z$QO^B z%aCrCV#JiH<}UqePbyi<_s$e-_Zrk)DSk24)s=`3l;ao+Zc4P=}m39}6<;AI%3PZ3WXwH0+m%c0S`@_cS1^ zLLK-`1uUDfRbXkTKqc;}^r2anCloK%LF8{gDVB~A*Rd4Di~38Z2F+8O@qs@VLMj3zCcSc&MJ4+BNhxQanB3Yi1$3cxS?(J*K@N277QDirXCdG zq07b7X=I9W+$EVGxOY;=Y3XiV^3UhfPa%_FInwC)x2ReESMB@OQy%T`DTncvLW)7l zI2J`wF?nlR-=Hq;U_5T`P0Ip(kn36~LPJ*`Q^6cF(E4^DfjQQBsx*MyVX8W%(!rjw z7xp?%-)7t}>k{vbx$<~utl>(^j3@8XQOdzW$$o1>XaVkLEG!%%dh4E9;jKgB+Qej} zPMhbeycF}_x9hC{;qahz;uX;*t9>)i^N+M!UgQ_gz1Zzxvl|O*#=Q*-u-DVInw{rz za#LTbu4)4>y=oDg4Xf6)`Tugt@(OqasG-^hthSJw-EeRw3>_K#q`c85Igpf^J>$~F zd3@fZTHfHnNy&CAp$G?W2fwahw*u3s0l5Sv)6=O4pGnm-pgsrWI>EZD%v!Gm5mUTe zSbEQn{16~8QE3^|x6dwP9eAKUgCajqMk&%u$M7oEGyI`D)`sWuH*z&A77-!)6?BeUwQJY6a`kL5-ErNoRQ+lh38#^3e z!h<&MF^nb0cwL%s^jR1XP&4%&Mnf1D+K|3Ciu$`4kAPq!%7U|{??CG_N+Wyx>6fPb z+2g;=iHgmR&jG-~B0HD?_S9?!gqj4^qGpc zA0<;M;Z16@{&bn!wu9Vkaan4VtO7_zt>36m?vk&Dd41O|lAk>MS8fD2VILCxWdz|7 z?7uV)oPk?d)DvK?pI>|&x2bFMUGZ!MX0rMEJjC}b-*nc1k?1cp`VWCaoe>{zgpl0f zAklr`n+%05BfLoaV-ZuGwA0r#FvNmo5KN7C#I`m=&;*O)<{^^{r*Q660Pqc{EzMNA zqkt@#juS%8L+k+8f+mC9U-$VO**_sf^N{d;K*fncddPNXJgxbTzzzOvr*hb#E^T>E(0!I zym{%Oo9o+5ziuCzO=DoDMQh>!s|YCuH{adGogZZ=gw!3*rzGotFzT)tymYmQf4nIx z6nl>koY3ykZ!vjq+;BgLJh0^1y9(bk zl_7!>TkJ-lkUr4-Jj!#LYfpTC(g^qYtDI`GKxNk5g*q09xO+3Ti5am$DWkbCRdsPo zB|3~Mj47*nkHA+rVyQutSl>54sRM2xF?+^Iu#17zU94MV&qGW=-o4l-X79=1f*ILc z*SG&66$w#+L<$NlgzISVv+n}Sz4f|bih;=-WqOdGO(NlYybc%Y_}+r2+3mo0zjMJQ z7{0}IC-ScioIJ64LCszG&rW#E3Vuw+)*Q_!{BoKTEKm_*41)8V1-YHZ!to=1f~R)n zgG-W4#j59uspp#)bjowDYlRGx{@&ugI&Z@HsRjTI3*(5#AVT%-0ARiFz>^|b+45(Q z{*1=$;<$RFU_01-iKH(;aACFk=b(i2zm+VH_jA;T$eN$~IQI$_Y2RkmIZ4D^TR+Vq zRK`!Uv5!>o7djGay4%Ra)suMUYj6HGX!0P70&vsh2}4!SpF@L>VP78$Is6?#5di07 zliO;4`&R~4aygWb2tFcU6K>e>2bO}e9Y zg!v`>DgEy#xXGGzN|SBm-rgyWlNWe=_Fc=23}DPp&QFS|%(?_UsgbWS5AKg0MF6f#B(KmfoM9*f7p@#5HHmjk)PXH zp8Q`_=FLAtawEE~TFJ$~;8U`JNnvQi1M|&u#igz|uTzRzCOjMPF;IZKfA`T`4| z0{$=N;QwW|u)uLFJZuQdaH9abjs;qCvhlVT_>5;3-X{F_Ng%>MTGZT-gBH|&haRc| zN2q7veN2yZooK9T?(|=JzXgZlX}14O*ZJS7oj3oF*#EPJxp^hKO>`7eh@R(uI~5q` zu^#{2P*s zPuIepym;8dbCXx+Pdnx7f<)@o`kUsi+kOM%#^-i{FN{_gb2;c@M}F-}&fI?J3!?wpHX`0TVAgjMk^31DC&yBzED5@@Ltj_HwQMFn4rf&^VRF zY~Z6R7@-orq}BfJ6~EK+pY3Ihe{Ygf|I^XEDr4AsbMM?&c<;9s{{H13;X6-1$L^?1 z*J;nS#CGS2W~ltzd+pyiRlZM08aPOwv(1_AEpIu`xHZo87-ElFg^C4M-q~7x2lraI zeJOhV{GHR%j32(u&+W@IoF79j2QT6J^76;B>8Jbk(#0o-bM@huTzD;)nV+p=tfn=r zKk_&&`jf7$KkuA5(hiYv9Pm4OCT_ZM@=);VRIRq<>myacwDvVl6^HF-j_!vix+L_6 zoaz5&IbK2}$*Uu&OOm$xQs~U$s>338$lZxy-8q?;Kn_c~qpu?a z!^VE@KZ&eBzG#3?h%1o(|NsB7W5+^6L(R?2ySuxABB`6FO9LtPk|4iepeztDNO?26 z0fjgVJR*x382Ao>Fr%o3R|5kBQ-G(7V@O5Z+uH|&lpIA^FNU@M`|mHN%IbVDF|g&c znz8wGhTV&77QValt#V!OdJi>`q~W)|F}Lp&t|v# zVYu(xrN+G_Pi5uyUDaol*;jJC|IGL0?<(8d^Fazd%Vf~EN!GWhh=*N4; zirTHO{aFum7jI_FEB*7Q_9(;huS^@F8v2!2IU+#~YTm3<>uws+~^n|8L&# zc>Tc{e$(S_GWX31WmvO~AtIM?!!4$St*i&KxErpDF|5{Q2#X$35+@nI{S|%ABU``a TjI9nZ!7+Hc`njxgN@xNA5`Y(} diff --git a/src/main/resources/assets/hbm/textures/gui/jei/gui_nei_three_to_one.png b/src/main/resources/assets/hbm/textures/gui/jei/gui_nei_three_to_one.png new file mode 100644 index 0000000000000000000000000000000000000000..cc3af0b87f5713c3c5372b94b04d0057a8afd08f GIT binary patch literal 742 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5D>38$lZxy-8q?;Kn_c~qpu?a z!^VE@KZ&eBzG#3?h%1o(|NsB7W5+^6L(R?2ySuxABB`6FO9LtPk|4iepeztDNO?26 z0fjgVJR*x382Ao=Fk{xWPEG~}CU;L4$B>G+x3?Yrm>d~cFEXaQt50#|GGqyytd<-d zIy?WuOB4OZxu kHin4Y5hbC<9&tTx!GN}&n4 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 Glm7!*%2wk5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/models/machines/mixer.png b/src/main/resources/assets/hbm/textures/models/machines/mixer.png new file mode 100644 index 0000000000000000000000000000000000000000..f71c59393cc4ad55ea1d847873c6db6e762b0335 GIT binary patch literal 1931 zcmd6ni8mYA9>+7abuhGw^B$wL)Ebl8_a&PoLP8=NYKg=aA*Di4dj&BRQ)N1Yj+j$$k|>KSUCVU$*%GG01=#k=SH?)TjD`<~zDcYo)eTi}C1e5I(R2mk=S zLLp%|sm4gd?zD__f3q7bmdY0iI0OXH^788q=|MIE>opPf{&LUJU#E$ zm9SVF2RCLyMoM;RYED_=bsj4zCyJF87L`c45`iNIqp@T-%GV9*>EHsfb8?SnrFr>K zJUnr3P_%;!%+}F8C9^1q7Hen>WTzLERz0k&7ZC%)O@S5=4-6I`AVqh2I2Tt4a*Oy? z)}|l}+YBS!q>OLJPEPoO&Xbdq%De3esReQDY+5usn9lMKiT3lSV+p}vxR;X~!qyRN zVdG>DvM#^VWNu+=W#?k=40VN|pa?9=o8XPVf~Qa^!BIi9I9haKR9tF2=SFeGeg6;! zA%N~n2#QV2;+E99LOfweACxx{iw_KYM@m74+cIk;DB)X!0F{eiX} zSo21xeme%(7hp3S;X0m(e4XXHTYA5$kSxwc1R;ce>l>0h~_*PV!yy8 zj4~lD2*a7{n3a-%b}aC9wr?jM)J?LKu;81wLtn9xGwGNflBIO)zn9z_mrCt590o6) z^Z)Szyi4Et-0_zzBqad=Pz>Gg!PEY&mM2EVgPip_qzoQ%djes#}$Lr)iTa>uA@Za!u; zsjaQ*&I}BkrXM{$a_aoUP??&wE%mf2?9$H1?TR;QWkRs~UztO*N;SH|ZpQlsodfml zK4BX}a?A(|@ZrOim6K0r1EN~L=FuH^WV@mB>zv02^-l(px@7qaE+xoEJUxd?@+Q7w zqM__o{=mZK*~==u-~0w8naZ08rpe&PD&c)S1Zs3+B+$Qq5fL4&y_@AZUcwVx?E9T7 zwm8>hbSg02BMRa$viR-Q$Y zd9c?2F1n)z3%_-_Nu781?KecaLCvYW7U-7)TV`LfTwgUqq5@fREF%JUC8aaGng{c`dQ?yr7Nx#q6P41=ml z!D{k0_n7TdO%yLRv1NirxynR$xY;E`9fKdj@BY*-`c|=tC9E=-X1TW#P0QuWWF~?n zNFYPX(A&^MKbmXJn3@1r_*qHGMXV^&1UPaQBe_PK0O+bZO7oOG+t{MYVP;STU7?|R zaqh)w%|Xd|O=RVV=vAPhPHvug^z?qlkICB0$v)ZqULe{DDgNH(q!vX@30JpGdA3TY zu-*NCjfs4cN}F6?HLrFF=wvR6tdx_sXZx89>{^B79^a#z%OxVzt%_^fIhJ0nU~`7% zw$^-K#7_V5``rQ=1unPndHqt3g5is;PX~W4w57(7KB`k+yqdICRVq_~KvO05ZBTBB zbp(6muM02#__xMBh0m3HZI#~_9?EPwSQjmqzu!HluVdO)TzYQ#{mAlg@rUAHpT)}R z6xFnGT8k#F@{`Se!TUHWfo6Mw390gD6jm= zHKL(S00;lbA=f3IG3%nzHTE^6UX(&9TEB}bd{ig=Y*hKj$cK#&t|#)1#E}X^o-Je} zIf4G)c@nW@Uk-UhBenb@Znj$@Zf(!`Sx_1%>NGaUe(ek#uK_o$6gHRENiRrT$?Ww8 zZ(v(v_gcpa0!1A-ZT@XKW~K1I>S|!-`DqOWi@a=pA28ur>e|8qrvGGcimO|F_^}-8 z_UUN93eTA0?>(ICsErVcNfp?OY-qu8{Nb4JB75)I z^Eq@UIc9tFXf*#=UNn!l)71Om#5=w~or&0aJUjN={!xdMnf`~hk*BfP<384AtzXR2 uA6*&0EFP&+_a+mptVs9Q;yOT@!zVI%HUf5TOH;P=vjU*t7+4D=B>R7y%gej~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/models/machines/mixer_uu.png b/src/main/resources/assets/hbm/textures/models/machines/mixer_uu.png new file mode 100644 index 0000000000000000000000000000000000000000..4cc77f9e0094db66eb66a503d6d269fd4cf844e2 GIT binary patch literal 1668 zcmcgsi#HPr7@yV*EfLxBXo!S)%obzJ*w~B>Gmkw?ZJwLtF-w|BlZYNFnMjKiC7N4~ z?!8&Llk`Bh)*T(yaqCj9T#up>clV#T-#NeUcfRwT@BGg1obUW9qG+UzMwUhZ0AOPn znMl`hrVc&^KwW=5m-JXidU~Ud>2}Ph2u8@n#Dqqp z>Fw?H_4O?+EtSb+B_$;ii6lQiUnmqNB_+}6^pKDcKR-Vd3gzkPDV0jY!oosBLopbP zNF;K0cHX&j=kW0G*w~mtp}$uTi8adC0c(a}CWK3-m4?(XhbEY{7< z&DGV_#l__+{8kIRt7%*3C7T497mQP!qx;YMK^BrO@j-(!@-HDq%P+R2hmtp_hu@#Md`d>(SrW0!1A) zrP?i4ACKY|zbp5r)}~0$Ytp0Kk2rP1x%rl+^V*s1wF_qodfQ1O`z1@JtBwv&s{yuP z^+O}yq?xhX2Zvv;^eX2n`jVBcnL&HEKfoX5I2cd>gVhNQ3ko?Y{;L^Z^7&oK3v)m& zqKw{TG5cb@ok`EhL4zr9OIyZnm(2v{xM`J)+yj^Az?togiFB5*u+ZYgGHeb=8;MWp zq|ZJ2h>tbB57AvY#Q7E6Jm>ge^!-ZiXtPRiq2CkxvlT(VTn#bf+gU99DuBfWoNU2Y zsotR#DObx_J?SREX4LhwzZC``;)#zF+k?se`acxt>$mNZE2KNm`X8-_8xyvjT}7DG z;5w#@<;M%EAU);=8>#x+1YL`}2SE0$V}Uu=BRmf~jOVFm9hVn(i7?BizFq0}285-6 zo?W!Ai_52BDi<=uT(&na&oj9)*4Uc%wXpPGi4g1?(l))%=tvf39 zC0cMikViSP!x6vv*gpqH)XuFGvw%wC^iUCwVSwgt&s0gY1ppMFP50CIGr)O7TU|L_K#7lvfQZnE1 z&(@!Cl1JM%5nzod@^N+>yF_7>oT?6jXb$aZ@vte~pl%o&;ftiLEwZ=cmI0_g#GqF< z@t#*lIB*)z;b^s2|7H9LSo!RPQX{ZoAG)8K!fukSR8B%L-KX{%8WIxW*mA@YvPs*d zg^dSA^*1sj{MT+SJVcleZXuqNHrWT;(?yD<9o{7}S=ta)y|W0UbZ zzc}T$BSWD}yxHGhetFb2lzAZK;52=fx4$`05A_S@?cLf9j8b5py%aoXVpiYJ0sz&H z*C!3bi6DE;&c{VP>@c zgfTCz6=vSINEK^89>}cdk!iO!*3oSYE!m%}3u#lv_A%Stc{A+MbJ|PmqG#$dr>iQp zm)GBBrmeDh|8#r%682@Ky1r_7INqDL^!f*Q6FfjVzc{)8^+>uaUHCHoeUobS%iQxx y57pY-=V4WE(VErQ)jy9)QbeoJS9-{nRlQG9-~5MWwt4AN1rQcOBX$JuKKw5`d=mr! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/models/machines/silex.png b/src/main/resources/assets/hbm/textures/models/machines/silex.png index 069579fda65e5df9fa467fe5196eee805e93031f..4427f4e42bb82cd1988dbab23a78b30daadd922b 100644 GIT binary patch delta 3513 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 delta 3411 zcmV-Z4XpCu8~YlNNq@rt01m?e$8V@)000dTNklZHHDH%TIv=^tERf&ym?c3?QGbvL3t0+Q>rVX4$3n_slTR4U)eefI=YBRY*(&a z3GUsyC;gQxSAPauw{DfbzWw<4crZIVEB&FNA-Qx}-?nX=^uwUeO-++Z3JzkMnVAW0 z-@Yx&)~s0*tXj27ica5tYHCV(`EcsgsakN1O19w;*&w#7SFcKgPti_iettfc)wt0X z;qdGCtUz(41hwoN-M5=T9A(T?|m)4{k~oZwv01(!e|jp5

RYP8f1I+?2*RH)Mh<{ifnasvm{Z36T*_VbLUQJ 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 KMNUMnLSTZo6bT9d literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/models/tank/tank_ethanol.png b/src/main/resources/assets/hbm/textures/models/tank/tank_ethanol.png new file mode 100644 index 0000000000000000000000000000000000000000..fe8c69ee658808731d644000f256ddee4939aa28 GIT binary patch literal 867 zcmV-p1DyPcP)Px#1ZP1_K>z@;j|==^1poj57*I@9MLu#c|J?wQk&$g}ZAnQ<|NsA3SXcl60L3B% zKL7v#2y{|TQ~&?}|NsC00N#VWSpWb432;bRa{vGi!2kdb!2!6DYwZ940>DW`K~#8N z?U;d*n=lLo)8=yd|39uIFUIB!g&+iTc-x*Fo6|brH_7zz9(X+dxbYa<%B#Qf_oXd)L-YR#~V&P@`RTJs|lA8{HzI=agk>|y-Fr_K@%%iQ_nx^ z)ZlYyVx_4bpEXrCk=AxX6Pj)c7acx^CNyn?EA&~{;kv}Lp1*1bOX~R>?!raYLyrqpcyVEG7;*vpIk1~P3v&=kB?z8NPUSLPSs7Y>OeDGMsTkCe`xd*9$Vj>e5E+#U8 z;lh~dC!B!;mseAD6I`;H*NZ_WDqJst;XqKh)I4?9O^*tfX{YXHQ;eCtYNQkQXKI<) zfG8&enpinfZNiuQ8QnCo@*g!-H(?jp@2@5K%so+mf78}p8%$*OsmJ@A2Q;DSk>L_$ zQ3mR!zb{;-oti&X%fv?1%ut|-mF;S6W&dQTuTsgQAC%@TYN~F+E|A~0PDz8`_A$I% zh9)%K8ZLVmD&p;%cZYgyxMafGn<%*^KbE116$Wd=B@_BSlPJ0PVRysUmY|81Vjy75 z3>TN`UC_kJMzsrL$3vfgY|N tu8JNmE^(lTtB0$ihl@)bSP`!G`yVT}Z4;>hD_#Hq002ovPDHLkV1j5WlV<<` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/models/tank/tank_fishoil.png b/src/main/resources/assets/hbm/textures/models/tank/tank_fishoil.png new file mode 100644 index 0000000000000000000000000000000000000000..5b9c063b537df683600ebde779e4e786bd64a2ee GIT binary patch literal 1350 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 literal 0 HcmV?d00001