iron furnace, but it's made from steel and works completely different

This commit is contained in:
Bob 2022-07-20 22:41:48 +02:00
parent 461101dd72
commit 0c0ca15dbf
26 changed files with 1453 additions and 26 deletions

View File

@ -7,6 +7,7 @@ import java.util.Random;
import com.hbm.handler.MultiblockHandlerXR;
import com.hbm.handler.ThreeInts;
import com.hbm.main.MainRegistry;
import com.hbm.util.fauxpointtwelve.BlockPos;
import cpw.mods.fml.common.network.internal.FMLNetworkHandler;
import net.minecraft.block.Block;
@ -41,8 +42,36 @@ public abstract class BlockDummyable extends BlockContainer {
public static final int offset = 10;
// meta offset from dummy to extra rotation
public static final int extra = 6;
/*
* An extra integer that can be set before block set operations (such as makeExtra) and intercepted in createNewTileEntity.
* This way we can inelegantly add variation to the tiles created even if the metadata would be the same.
* Why createNewTileEntity only takes two args or why it is used by the chunk's setBlock implementation is beyond me but any
* other solution feels like putting in way too much effort to achieve the same thing, really.
*/
public static int overrideTileMeta = 0;
/*
* Set as the meta for the core is decided, before any of the dummies are placed. This way we can somewhat easily add variation
* to our tile entities in createNewTileEntity using the relative position to the core, as well as pull information from the core
* block itself, if required.
*/
public static BlockPos lastCore = new BlockPos(0, 0, 0);
/*
* Because createNewTileEntity has no knowledge of where the tile ends up being beforehand, we just set a reference beforehand when
* the block was initially placed. Why does this have to be such a pain in the ass.
* BEWARE: This information is server-side only! Keep that in mind when expecting any of this affecting the client as well.
*/
public static BlockPos lastBlockSet = new BlockPos(0, 0, 0);
public static boolean safeRem = false;
public static void setOverride(int i) {
overrideTileMeta = i;
}
public static void resetOverride() {
overrideTileMeta = 0;
}
public void onNeighborBlockChange(World world, int x, int y, int z, Block block) {
@ -62,8 +91,6 @@ public abstract class BlockDummyable extends BlockContainer {
if(b != this) {
world.setBlockToAir(x, y, z);
// world.setBlock(x, y, z, ModBlocks.dfc_injector, dir.ordinal(),
// 3);
}
}
@ -182,6 +209,7 @@ public abstract class BlockDummyable extends BlockContainer {
if(!world.isRemote) {
//this is separate because the multiblock rotation and the final meta might not be the same
int meta = getMetaForCore(world, x + dir.offsetX * o, y + dir.offsetY * o, z + dir.offsetZ * o, (EntityPlayer) player, dir.ordinal() + offset);
lastCore = new BlockPos(x + dir.offsetX * o, y + dir.offsetY * o, z + dir.offsetZ * o);
world.setBlock(x + dir.offsetX * o, y + dir.offsetY * o, z + dir.offsetZ * o, this, meta, 3);
fillSpace(world, x, y, z, dir, o);
}
@ -191,6 +219,12 @@ public abstract class BlockDummyable extends BlockContainer {
super.onBlockPlacedBy(world, x, y, z, player, itemStack);
}
// this fucking sucks, why are you making me do this
@Override
public void onBlockAdded(World world, int x, int y, int z) {
lastBlockSet = new BlockPos(x, y, z);
}
/**
* A bit more advanced than the dir modifier, but it is important that the resulting direction meta is in the core range.

View File

@ -627,6 +627,7 @@ public class ModBlocks {
public static Block heater_firebox;
public static Block furnace_iron;
public static Block furnace_steel;
public static Block machine_difurnace_off;
public static Block machine_difurnace_on;
@ -1793,6 +1794,7 @@ public class ModBlocks {
heater_firebox = new HeaterFirebox().setBlockName("heater_firebox").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel");
furnace_iron = new FurnaceIron().setBlockName("furnace_iron").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_aluminium");
furnace_steel = new FurnaceSteel().setBlockName("furnace_steel").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel");
machine_difurnace_off = new MachineDiFurnace(false).setBlockName("machine_difurnace_off").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab);
machine_difurnace_on = new MachineDiFurnace(true).setBlockName("machine_difurnace_on").setHardness(5.0F).setLightLevel(1.0F).setResistance(10.0F);
@ -2965,6 +2967,7 @@ public class ModBlocks {
GameRegistry.registerBlock(machine_epress, machine_epress.getUnlocalizedName());
GameRegistry.registerBlock(heater_firebox, heater_firebox.getUnlocalizedName());
GameRegistry.registerBlock(furnace_iron, furnace_iron.getUnlocalizedName());
GameRegistry.registerBlock(furnace_steel, furnace_steel.getUnlocalizedName());
GameRegistry.registerBlock(machine_difurnace_off, machine_difurnace_off.getUnlocalizedName());
GameRegistry.registerBlock(machine_difurnace_on, machine_difurnace_on.getUnlocalizedName());
GameRegistry.registerBlock(machine_difurnace_rtg_off, machine_difurnace_rtg_off.getUnlocalizedName());

View File

@ -0,0 +1,38 @@
package com.hbm.blocks.machine;
import com.hbm.blocks.BlockDummyable;
import com.hbm.tileentity.TileEntityProxyCombo;
import com.hbm.tileentity.machine.TileEntityFurnaceSteel;
import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
public class FurnaceSteel extends BlockDummyable {
public FurnaceSteel() {
super(Material.iron);
}
@Override
public TileEntity createNewTileEntity(World world, int meta) {
if(meta >= 12) return new TileEntityFurnaceSteel();
return new TileEntityProxyCombo(true, false, false);
}
@Override
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
return this.standardOpenBehavior(world, x, y, z, player, 0);
}
@Override
public int[] getDimensions() {
return new int[] {1, 0, 1, 1, 1, 1};
}
@Override
public int getOffset() {
return 1;
}
}

View File

@ -20,6 +20,11 @@ public class HeaterFirebox extends BlockDummyable {
if(meta >= 12)
return new TileEntityHeaterFirebox();
//the firebox is only 1 block tall, why did i write this?
/*if(lastCore.getX() == lastBlockSet.getX() && lastCore.getY() + 1 == lastBlockSet.getY() && lastCore.getZ() == lastBlockSet.getZ())
return new TileEntityProxyCombo().inventory().heatSource();*/
return new TileEntityProxyCombo(true, false, false);
}

View File

@ -8,6 +8,7 @@ import com.hbm.blocks.BlockDummyable;
import com.hbm.blocks.ITooltipProvider;
import com.hbm.tileentity.TileEntityProxyCombo;
import com.hbm.tileentity.machine.oil.TileEntityMachineLiquefactor;
import com.hbm.util.I18nUtil;
import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer;
@ -68,10 +69,8 @@ public class MachineLiquefactor extends BlockDummyable implements ITooltipProvid
@Override
public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) {
if(Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) { //TODO: just slap some fuckin I18n support in there idfk
list.add(EnumChatFormatting.YELLOW + "Powerful universal machine to turn items into fluids.");
list.add(EnumChatFormatting.YELLOW + "Comes with versatile catalytic components, heating elements");
list.add(EnumChatFormatting.YELLOW + "and a built-in hydrator for petrochemical liquefaction.");
if(Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) {
for(String s : I18nUtil.resolveKeyArray(this.getUnlocalizedName() + ".desc")) list.add(EnumChatFormatting.YELLOW + s);
} else {
list.add(EnumChatFormatting.DARK_GRAY + "" + EnumChatFormatting.ITALIC +"Hold <" +
EnumChatFormatting.YELLOW + "" + EnumChatFormatting.ITALIC + "LSHIFT" +

View File

@ -8,6 +8,7 @@ import com.hbm.blocks.BlockDummyable;
import com.hbm.blocks.ITooltipProvider;
import com.hbm.tileentity.TileEntityProxyCombo;
import com.hbm.tileentity.machine.oil.TileEntityMachineSolidifier;
import com.hbm.util.I18nUtil;
import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer;
@ -69,9 +70,7 @@ public class MachineSolidifier extends BlockDummyable implements ITooltipProvide
public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) {
if(Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) {
list.add(EnumChatFormatting.YELLOW + "A universal machine fitted with cooling systems and other");
list.add(EnumChatFormatting.YELLOW + "versatile tools for turning fluids solid using various");
list.add(EnumChatFormatting.YELLOW + "processes such as freezing and petrochemical polymerization.");
for(String s : I18nUtil.resolveKeyArray(this.getUnlocalizedName() + ".desc")) list.add(EnumChatFormatting.YELLOW + s);
} else {
list.add(EnumChatFormatting.DARK_GRAY + "" + EnumChatFormatting.ITALIC +"Hold <" +
EnumChatFormatting.YELLOW + "" + EnumChatFormatting.ITALIC + "LSHIFT" +

View File

@ -315,7 +315,7 @@ public class EntityBulletBase extends Entity implements IProjectile {
boolean headshot = false;
if(victim instanceof EntityLivingBase) {
if(victim instanceof EntityLivingBase && this.config.headshotMult > 1F) {
EntityLivingBase living = (EntityLivingBase) victim;
double head = living.height - living.getEyeHeight();

View File

@ -0,0 +1,73 @@
package com.hbm.inventory.container;
import com.hbm.inventory.SlotSmelting;
import com.hbm.tileentity.machine.TileEntityFurnaceSteel;
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;
public class ContainerFurnaceSteel extends Container {
protected TileEntityFurnaceSteel furnace;
public ContainerFurnaceSteel(InventoryPlayer invPlayer, TileEntityFurnaceSteel furnace) {
this.furnace = furnace;
//input
this.addSlotToContainer(new Slot(furnace, 0, 35, 17));
this.addSlotToContainer(new Slot(furnace, 1, 35, 35));
this.addSlotToContainer(new Slot(furnace, 2, 35, 53));
//output
this.addSlotToContainer(new SlotSmelting(invPlayer.player, furnace, 3, 125, 17));
this.addSlotToContainer(new SlotSmelting(invPlayer.player, furnace, 4, 125, 35));
this.addSlotToContainer(new SlotSmelting(invPlayer.player, furnace, 5, 125, 53));
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 9; j++) {
this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 84 + i * 18));
}
}
for(int i = 0; i < 9; i++) {
this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 142));
}
}
@Override
public ItemStack transferStackInSlot(EntityPlayer player, int index) {
ItemStack stack = null;
Slot slot = (Slot) this.inventorySlots.get(index);
if(slot != null && slot.getHasStack()) {
ItemStack originalStack = slot.getStack();
stack = originalStack.copy();
if(index <= 5) {
if(!this.mergeItemStack(originalStack, 6, this.inventorySlots.size(), true)) {
return null;
}
slot.onSlotChange(originalStack, stack);
} else if(!this.mergeItemStack(originalStack, 0, 3, false)) {
return null;
}
if(originalStack.stackSize == 0) {
slot.putStack((ItemStack) null);
} else {
slot.onSlotChanged();
}
}
return stack;
}
@Override
public boolean canInteractWith(EntityPlayer player) {
return furnace.isUseableByPlayer(player);
}
}

View File

@ -17,11 +17,11 @@ import net.minecraft.util.ResourceLocation;
public class GUIFurnaceIron extends GuiInfoContainer {
private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/processing/gui_furnace_iron.png");
private TileEntityFurnaceIron diFurnace;
private TileEntityFurnaceIron furnace;
public GUIFurnaceIron(InventoryPlayer invPlayer, TileEntityFurnaceIron tedf) {
super(new ContainerFurnaceIron(invPlayer, tedf));
diFurnace = tedf;
furnace = tedf;
this.xSize = 176;
this.ySize = 166;
@ -38,7 +38,7 @@ public class GUIFurnaceIron extends GuiInfoContainer {
if(this.isMouseOverSlot(slot, x, y) && !slot.getHasStack()) {
List<String> bonuses = this.diFurnace.burnModule.getTimeDesc();
List<String> bonuses = this.furnace.burnModule.getTimeDesc();
if(!bonuses.isEmpty()) {
this.func_146283_a(bonuses, x, y);
@ -47,13 +47,13 @@ public class GUIFurnaceIron extends GuiInfoContainer {
}
}
this.drawCustomInfoStat(x, y, guiLeft + 52, guiTop + 35, 71, 7, x, y, new String[] { (diFurnace.progress * 100 / Math.max(diFurnace.processingTime, 1)) + "%" });
this.drawCustomInfoStat(x, y, guiLeft + 52, guiTop + 44, 71, 7, x, y, new String[] { (diFurnace.burnTime / 20) + "s" });
this.drawCustomInfoStat(x, y, guiLeft + 52, guiTop + 35, 71, 7, x, y, new String[] { (furnace.progress * 100 / Math.max(furnace.processingTime, 1)) + "%" });
this.drawCustomInfoStat(x, y, guiLeft + 52, guiTop + 44, 71, 7, x, y, new String[] { (furnace.burnTime / 20) + "s" });
}
@Override
protected void drawGuiContainerForegroundLayer(int i, int j) {
String name = this.diFurnace.hasCustomInventoryName() ? this.diFurnace.getInventoryName() : I18n.format(this.diFurnace.getInventoryName());
String name = this.furnace.hasCustomInventoryName() ? this.furnace.getInventoryName() : I18n.format(this.furnace.getInventoryName());
this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752);
this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752);
@ -65,13 +65,13 @@ public class GUIFurnaceIron extends GuiInfoContainer {
Minecraft.getMinecraft().getTextureManager().bindTexture(texture);
drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize);
int i = diFurnace.progress * 70 / Math.max(diFurnace.processingTime, 1);
int i = furnace.progress * 70 / Math.max(furnace.processingTime, 1);
drawTexturedModalRect(guiLeft + 53, guiTop + 36, 176, 18, i, 5);
int j = diFurnace.burnTime * 70 / Math.max(diFurnace.maxBurnTime, 1);
int j = furnace.burnTime * 70 / Math.max(furnace.maxBurnTime, 1);
drawTexturedModalRect(guiLeft + 53, guiTop + 45, 176, 23, j, 5);
if(diFurnace.canSmelt())
if(furnace.canSmelt())
drawTexturedModalRect(guiLeft + 70, guiTop + 16, 176, 0, 18, 18);
}
}

View File

@ -0,0 +1,67 @@
package com.hbm.inventory.gui;
import org.lwjgl.opengl.GL11;
import com.hbm.inventory.container.ContainerFurnaceSteel;
import com.hbm.lib.RefStrings;
import com.hbm.tileentity.machine.TileEntityFurnaceSteel;
import net.minecraft.client.Minecraft;
import net.minecraft.client.resources.I18n;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.util.ResourceLocation;
public class GUIFurnaceSteel extends GuiInfoContainer {
private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/processing/gui_furnace_steel.png");
private TileEntityFurnaceSteel furnace;
public GUIFurnaceSteel(InventoryPlayer invPlayer, TileEntityFurnaceSteel tedf) {
super(new ContainerFurnaceSteel(invPlayer, tedf));
furnace = tedf;
this.xSize = 176;
this.ySize = 166;
}
@Override
public void drawScreen(int x, int y, float interp) {
super.drawScreen(x, y, interp);
for(int i = 0; i < 3; i++) {
this.drawCustomInfoStat(x, y, guiLeft + 53, guiTop + 17 + 18 * i, 70, 7, x, y, new String[] { String.format("%,d", furnace.progress[i]) + " / " + String.format("%,d", furnace.processTime) + "TU" });
this.drawCustomInfoStat(x, y, guiLeft + 53, guiTop + 26 + 18 * i, 70, 7, x, y, new String[] { "Bonus: " + furnace.bonus[i] + "%" });
}
//this.drawCustomInfoStat(x, y, guiLeft + 52, guiTop + 44, 71, 7, x, y, new String[] { (furnace.burnTime / 20) + "s" });
this.drawCustomInfoStat(x, y, guiLeft + 151, guiTop + 18, 9, 50, x, y, new String[] { String.format("%,d", furnace.heat) + " / " + String.format("%,d", furnace.maxHeat) + "TU" });
}
@Override
protected void drawGuiContainerForegroundLayer(int i, int j) {
String name = this.furnace.hasCustomInventoryName() ? this.furnace.getInventoryName() : I18n.format(this.furnace.getInventoryName());
this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752);
this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752);
}
@Override
protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) {
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
Minecraft.getMinecraft().getTextureManager().bindTexture(texture);
drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize);
int h = furnace.heat * 48 / furnace.maxHeat;
drawTexturedModalRect(guiLeft + 152, guiTop + 67 - h, 176, 76 - h, 7, h);
for(int i = 0; i < 3; i++) {
int p = furnace.progress[i] * 69 / furnace.processTime;
drawTexturedModalRect(guiLeft + 54, guiTop + 18 + 18 * i, 176, 18, p, 5);
int b = furnace.bonus[i] * 69 / 100;
drawTexturedModalRect(guiLeft + 54, guiTop + 27 + 18 * i, 176, 23, b, 5);
if(furnace.wasOn)
drawTexturedModalRect(guiLeft + 16, guiTop + 16 + 18 * i, 176, 0, 18, 18);
}
}
}

View File

@ -251,14 +251,14 @@ public class SILEXRecipes {
// HEAUS //
recipes.put(new ComparableStack(ModItems.rbmk_pellet_heaus, 1, i), new SILEXRecipe(600, 100, 2)
.addOut(new WeightedRandomObject(new ItemStack(ModItems.nugget_australium_lesser), 90 - i * 20))
.addOut(new WeightedRandomObject(new ItemStack(ModItems.nugget_australium_greater), 90 - i * 20))
.addOut(new WeightedRandomObject(new ItemStack(ModItems.nugget_au198), 5 + 10 * i))
.addOut(new WeightedRandomObject(new ItemStack(Items.gold_nugget), 3 + 6 * i))
.addOut(new WeightedRandomObject(new ItemStack(ModItems.nugget_pb209), 2 + 4 * i)) );
recipes.put(new ComparableStack(ModItems.rbmk_pellet_heaus, 1, i + 5), new SILEXRecipe(600, 100, 2)
.addOut(new WeightedRandomObject(new ItemStack(ModItems.powder_xe135_tiny), 1))
.addOut(new WeightedRandomObject(new ItemStack(ModItems.nugget_australium_lesser), 89 - i * 20))
.addOut(new WeightedRandomObject(new ItemStack(ModItems.nugget_australium_greater), 89 - i * 20))
.addOut(new WeightedRandomObject(new ItemStack(ModItems.nugget_au198), 5 + 10 * i))
.addOut(new WeightedRandomObject(new ItemStack(Items.gold_nugget), 3 + 6 * i))
.addOut(new WeightedRandomObject(new ItemStack(ModItems.nugget_pb209), 2 + 4 * i)) );

View File

@ -14,6 +14,8 @@ import net.minecraft.client.particle.EntityReddustFX;
import net.minecraft.client.renderer.entity.RenderMinecart;
import net.minecraft.client.renderer.entity.RenderSnowball;
import net.minecraft.client.renderer.texture.TextureManager;
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
@ -254,6 +256,7 @@ public class ClientProxy extends ServerProxy {
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineRadiolysis.class, new RenderRadiolysis());
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityElectrolyser.class, new RenderElectrolyser());
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFurnaceIron.class, new RenderFurnaceIron());
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFurnaceSteel.class, new RenderFurnaceSteel());
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityHeaterFirebox.class, new RenderFirebox());
//AMS
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityAMSBase.class, new RenderAMSBase());
@ -326,6 +329,15 @@ public class ClientProxy extends ServerProxy {
for(Entry<Item, ItemRenderBase> entry : ItemRenderLibrary.renderers.entrySet())
MinecraftForgeClient.registerItemRenderer(entry.getKey(), entry.getValue());
Iterator iterator = TileEntityRendererDispatcher.instance.mapSpecialRenderers.values().iterator();
while(iterator.hasNext()) {
Object renderer = iterator.next();
if(renderer instanceof IItemRendererProvider) {
IItemRendererProvider prov = (IItemRendererProvider) renderer;
MinecraftForgeClient.registerItemRenderer(prov.getItemForRenderer(), prov.getRenderer());
}
}
//universal JSON translated items
double[] rtp = new double[] {0, 180, -90};
double[] ttp_high = new double[] {0.125, 0.625, 0};

View File

@ -51,7 +51,7 @@ public class ResourceManager {
public static final IModelCustom turret_maxwell = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/turrets/turret_microwave.obj"));
public static final IModelCustom turret_fritz = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/turrets/turret_fritz.obj"));
public static final IModelCustom turret_brandon = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/turrets/turret_brandon.obj"));
public static final IModelCustom turret_arty = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/turrets/turret_arty.obj"));
public static final IModelCustom turret_arty = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/turrets/turret_arty.obj")).asDisplayList(); // test!
public static final IModelCustom turret_howard_damaged = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/turrets/turret_howard_damaged.obj"));
@ -60,6 +60,7 @@ public class ResourceManager {
//Furnaces
public static final IModelCustom furnace_iron = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/furnace_iron.obj"));
public static final IModelCustom furnace_steel = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/furnace_steel.obj"));
//Landmines
public static final IModelCustom mine_ap = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/mine_ap.obj"));
@ -370,6 +371,7 @@ public class ResourceManager {
//Furnaces
public static final ResourceLocation furnace_iron_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/furnace_iron.png");
public static final ResourceLocation furnace_steel_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/furnace_steel.png");
//Oil Pumps
public static final ResourceLocation derrick_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/derrick.png");

View File

@ -16,6 +16,7 @@ import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
@Deprecated // implement IItemRendererProvider for TESRs instead!
public class ItemRenderLibrary {
public static HashMap<Item, ItemRenderBase> renderers = new HashMap();
@ -1339,6 +1340,17 @@ public class ItemRenderLibrary {
ResourceManager.turret_arty.renderPart("Barrel");
GL11.glShadeModel(GL11.GL_FLAT);
}});
renderers.put(Item.getItemFromBlock(ModBlocks.heater_firebox), new ItemRenderBase( ) {
public void renderInventory() {
GL11.glTranslated(0, -1, 0);
GL11.glScaled(3.25, 3.25, 3.25);
}
public void renderCommon() {
bindTexture(ResourceManager.heater_firebox_tex);
ResourceManager.heater_firebox.renderPart("Main");
ResourceManager.heater_firebox.renderPart("Door");
}});
}
private static void bindTexture(ResourceLocation res) {

View File

@ -8,6 +8,8 @@ package com.hbm.render.model;
import org.lwjgl.opengl.GL11;
import com.hbm.interfaces.IHoldableWeapon;
import net.minecraft.client.model.ModelBiped;
import net.minecraft.client.model.ModelRenderer;
import net.minecraft.entity.Entity;
@ -224,6 +226,9 @@ public class ModelT45Chest extends ModelBiped {
this.aimedBow = true;
}
}
if(itemstack != null && player.getHeldItem().getItem() instanceof IHoldableWeapon)
this.aimedBow = true;
}
super.setRotationAngles(f, f1, f2, f3, f4, f5, entity);
this.chest.rotationPointX = this.bipedBody.rotationPointX;

View File

@ -0,0 +1,10 @@
package com.hbm.render.tileentity;
import net.minecraft.item.Item;
import net.minecraftforge.client.IItemRenderer;
public interface IItemRendererProvider {
public Item getItemForRenderer();
public IItemRenderer getRenderer();
}

View File

@ -0,0 +1,57 @@
package com.hbm.render.tileentity;
import org.lwjgl.opengl.GL11;
import com.hbm.blocks.BlockDummyable;
import com.hbm.blocks.ModBlocks;
import com.hbm.main.ResourceManager;
import com.hbm.render.item.ItemRenderBase;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.item.Item;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.client.IItemRenderer;
public class RenderFurnaceSteel extends TileEntitySpecialRenderer implements IItemRendererProvider {
@Override
public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float f) {
GL11.glPushMatrix();
GL11.glTranslated(x + 0.5D, y, z + 0.5D);
GL11.glEnable(GL11.GL_LIGHTING);
GL11.glEnable(GL11.GL_CULL_FACE);
switch(tileEntity.getBlockMetadata() - BlockDummyable.offset) {
case 3: GL11.glRotatef(0, 0F, 1F, 0F); break;
case 5: GL11.glRotatef(90, 0F, 1F, 0F); break;
case 2: GL11.glRotatef(180, 0F, 1F, 0F); break;
case 4: GL11.glRotatef(270, 0F, 1F, 0F); break;
}
GL11.glRotatef(-90, 0F, 1F, 0F);
bindTexture(ResourceManager.furnace_steel_tex);
ResourceManager.furnace_steel.renderAll();
GL11.glPopMatrix();
}
@Override
public Item getItemForRenderer() {
return Item.getItemFromBlock(ModBlocks.furnace_steel);
}
@Override
public IItemRenderer getRenderer() {
return new ItemRenderBase( ) {
public void renderInventory() {
GL11.glTranslated(0, -1.5, 0);
GL11.glScaled(3.25, 3.25, 3.25);
}
public void renderCommon() {
bindTexture(ResourceManager.furnace_steel_tex);
ResourceManager.furnace_steel.renderAll();
}};
}
}

View File

@ -8,6 +8,7 @@ import com.hbm.inventory.fluid.FluidType;
import api.hbm.energy.IEnergyConnector;
import api.hbm.energy.IEnergyUser;
import api.hbm.fluid.IFluidConnector;
import api.hbm.tile.IHeatSource;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.ItemStack;
@ -15,12 +16,13 @@ import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.util.ForgeDirection;
public class TileEntityProxyCombo extends TileEntityProxyBase implements IEnergyUser, IFluidAcceptor, ISidedInventory, IFluidConnector {
public class TileEntityProxyCombo extends TileEntityProxyBase implements IEnergyUser, IFluidAcceptor, ISidedInventory, IFluidConnector, IHeatSource {
TileEntity tile;
boolean inventory;
boolean power;
boolean fluid;
boolean heat;
public TileEntityProxyCombo() { }
@ -30,6 +32,26 @@ public class TileEntityProxyCombo extends TileEntityProxyBase implements IEnergy
this.fluid = fluid;
}
public TileEntityProxyCombo inventory() {
this.inventory = true;
return this;
}
public TileEntityProxyCombo power() {
this.power = true;
return this;
}
public TileEntityProxyCombo fluid() {
this.fluid = true;
return this;
}
public TileEntityProxyCombo heatSource() {
this.heat = true;
return this;
}
//fewer messy recursive operations
public TileEntity getTile() {
@ -437,4 +459,28 @@ public class TileEntityProxyCombo extends TileEntityProxyBase implements IEnergy
}
return false;
}
@Override
public int getHeatStored() {
if(!this.heat)
return 0;
if(getTile() instanceof IHeatSource) {
return ((IHeatSource)getTile()).getHeatStored();
}
return 0;
}
@Override
public void useUpHeat(int heat) {
if(!this.heat)
return;
if(getTile() instanceof IHeatSource) {
((IHeatSource)getTile()).useUpHeat(heat);
}
}
}

View File

@ -249,6 +249,7 @@ public class TileMappings {
private static void putMachines() {
put(TileEntityHeaterFirebox.class, "tileentity_firebox");
put(TileEntityFurnaceIron.class, "tileentity_furnace_iron");
put(TileEntityFurnaceSteel.class, "tileentity_furnace_steel");
put(TileEntityMachineAutocrafter.class, "tileentity_autocrafter");
put(TileEntityDiFurnaceRTG.class, "tileentity_rtg_difurnace");
put(TileEntityMachineRadiolysis.class, "tileentity_radiolysis");

View File

@ -0,0 +1,268 @@
package com.hbm.tileentity.machine;
import java.util.List;
import com.hbm.inventory.container.ContainerFurnaceSteel;
import com.hbm.inventory.gui.GUIFurnaceSteel;
import com.hbm.tileentity.IGUIProvider;
import com.hbm.tileentity.TileEntityMachineBase;
import com.hbm.util.ItemStackUtil;
import api.hbm.tile.IHeatSource;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.FurnaceRecipes;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
public class TileEntityFurnaceSteel extends TileEntityMachineBase implements IGUIProvider {
public int[] progress = new int[3];
public int[] bonus = new int[3];
public static final int processTime = 40_000; // assuming vanilla furnace rules with 200 ticks of coal fire burning at 200HU/t
public int heat;
public static final int maxHeat = 100_000;
public static final double diffusion = 0.05D;
private ItemStack[] lastItems = new ItemStack[3];
public boolean wasOn = false;
public TileEntityFurnaceSteel() {
super(6);
}
@Override
public String getName() {
return "container.furnaceSteel";
}
@Override
public void updateEntity() {
if(!worldObj.isRemote) {
tryPullHeat();
this.wasOn = false;
int burn = (heat - this.maxHeat / 3) / 10;
for(int i = 0; i < 3; i++) {
if(slots[i] == null || lastItems[i] == null || !slots[i].isItemEqual(lastItems[i])) {
progress[i] = 0;
bonus[i] = 0;
}
if(canSmelt(i)) {
progress[i] += burn;
this.heat -= burn;
this.wasOn = true;
}
lastItems[i] = slots[i];
if(progress[i] >= processTime) {
ItemStack result = FurnaceRecipes.smelting().getSmeltingResult(slots[i]);
if(slots[i + 3] == null) {
slots[i + 3] = result.copy();
} else {
slots[i + 3].stackSize += result.stackSize;
}
this.addBonus(slots[i], i);
while(bonus[i] >= 100) {
slots[i + 3].stackSize = Math.min(slots[i + 3].getMaxStackSize(), slots[i + 3].stackSize + result.stackSize);
bonus[i] -= 100;
}
this.decrStackSize(i, 1);
progress[i] = 0;
}
}
NBTTagCompound data = new NBTTagCompound();
data.setIntArray("progress", progress);
data.setIntArray("bonus", bonus);
data.setInteger("heat", heat);
data.setBoolean("wasOn", wasOn);
this.networkPack(data, 50);
} else {
if(this.wasOn) {
ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10);
ForgeDirection rot = dir.getRotation(ForgeDirection.UP);
worldObj.spawnParticle("smoke", xCoord + 0.5 - dir.offsetX * 1.125 - rot.offsetX * 0.75, yCoord + 2.625, zCoord + 0.5 - dir.offsetZ * 1.125 - rot.offsetZ * 0.75, 0.0, 0.05, 0.0);
if(worldObj.rand.nextInt(20) == 0)
worldObj.spawnParticle("cloud", xCoord + 0.5 + dir.offsetX * 0.75, yCoord + 2, zCoord + 0.5 + dir.offsetZ * 0.75, 0.0, 0.05, 0.0);
}
}
}
@Override
public void networkUnpack(NBTTagCompound nbt) {
this.progress = nbt.getIntArray("progress");
this.bonus = nbt.getIntArray("bonus");
this.heat = nbt.getInteger("heat");
this.wasOn = nbt.getBoolean("wasOn");
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
this.progress = nbt.getIntArray("progress");
this.bonus = nbt.getIntArray("bonus");
this.heat = nbt.getInteger("heat");
NBTTagList list = nbt.getTagList("lastItems", 10);
for(int i = 0; i < list.tagCount(); i++) {
NBTTagCompound nbt1 = list.getCompoundTagAt(i);
byte b0 = nbt1.getByte("lastItem");
if(b0 >= 0 && b0 < lastItems.length) {
lastItems[b0] = ItemStack.loadItemStackFromNBT(nbt1);
}
}
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
nbt.setIntArray("progress", progress);
nbt.setIntArray("bonus", bonus);
nbt.setInteger("heat", heat);
NBTTagList list = new NBTTagList();
for(int i = 0; i < lastItems.length; i++) {
if(lastItems[i] != null) {
NBTTagCompound nbt1 = new NBTTagCompound();
nbt1.setByte("lastItem", (byte) i);
lastItems[i].writeToNBT(nbt1);
list.appendTag(nbt1);
}
}
nbt.setTag("lastItems", list);
}
protected void addBonus(ItemStack stack, int index) {
List<String> names = ItemStackUtil.getOreDictNames(stack);
for(String name : names) {
if(name.startsWith("ore")) { this.bonus[index] += 25; return; }
if(name.startsWith("log")) { this.bonus[index] += 50; return; }
if(name.equals("anyTar")) { this.bonus[index] += 50; return; }
}
}
protected void tryPullHeat() {
TileEntity con = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord);
if(con instanceof IHeatSource) {
IHeatSource source = (IHeatSource) con;
int diff = source.getHeatStored() - this.heat;
if(diff == 0) {
return;
}
if(diff > 0) {
diff = (int) Math.ceil(diff * diffusion);
source.useUpHeat(diff);
this.heat += diff;
if(this.heat > this.maxHeat)
this.heat = this.maxHeat;
return;
}
}
this.heat = Math.max(this.heat - Math.max(this.heat / 1000, 1), 0);
}
public boolean canSmelt(int index) {
if(this.heat < this.maxHeat / 3) return false;
if(slots[index] == null) return false;
ItemStack result = FurnaceRecipes.smelting().getSmeltingResult(slots[index]);
if(result == null) return false;
if(slots[index + 3] == null) return true;
if(!result.isItemEqual(slots[index + 3])) return false;
if(result.stackSize + slots[index + 3].stackSize > slots[index + 3].getMaxStackSize()) return false;
return true;
}
@Override
public int[] getAccessibleSlotsFromSide(int meta) {
return new int[] { 0, 1, 2, 3, 4, 5 };
}
@Override
public boolean isItemValidForSlot(int i, ItemStack itemStack) {
if(i < 3)
return FurnaceRecipes.smelting().getSmeltingResult(itemStack) != null;
return false;
}
@Override
public boolean canExtractItem(int i, ItemStack itemStack, int j) {
return i > 2;
}
@Override
public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) {
return new ContainerFurnaceSteel(player.inventory, this);
}
@Override
@SideOnly(Side.CLIENT)
public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) {
return new GUIFurnaceSteel(player.inventory, this);
}
AxisAlignedBB bb = null;
@Override
public AxisAlignedBB getRenderBoundingBox() {
if(bb == null) {
bb = AxisAlignedBB.getBoundingBox(
xCoord - 1,
yCoord,
zCoord - 1,
xCoord + 2,
yCoord + 3,
zCoord + 2
);
}
return bb;
}
@Override
@SideOnly(Side.CLIENT)
public double getMaxRenderDistanceSquared() {
return 65536.0D;
}
}

View File

@ -96,8 +96,15 @@ public class TileEntityHeaterFirebox extends TileEntityMachineBase implements IG
}
}
} else {
burnTime--;
if(this.heatEnergy < this.maxHeatEnergy) {
burnTime--;
}
this.wasOn = true;
if(worldObj.rand.nextInt(15) == 0) {
worldObj.playSoundEffect(xCoord, yCoord, zCoord, "fire.fire", 1.0F, 0.5F + worldObj.rand.nextFloat() * 0.5F);
}
}
if(burnTime > 0) {

View File

@ -88,7 +88,7 @@ public class TileEntityMachineElectricFurnace extends TileEntityMachineBase impl
}
public boolean hasPower() {
return power > 0;
return power >= consumption;
}
public boolean isProcessing() {
@ -145,7 +145,6 @@ public class TileEntityMachineElectricFurnace extends TileEntityMachineBase impl
@Override
public void updateEntity() {
this.hasPower();
boolean flag1 = false;
if(!worldObj.isRemote) {

View File

@ -3833,6 +3833,7 @@ tile.machine_industrial_generator.name=Industrial Generator
tile.machine_keyforge.name=Locksmith Table
tile.machine_large_turbine.name=Industrial Steam Turbine
tile.machine_liquefactor.name=Industrial Liquefaction Machine
tile.machine_liquefactor.desc=Powerful universal machine to turn items into fluids.$Comes with versatile catalytic components, heating elements$and a built-in hydrator for petrochemical liquefaction.
tile.machine_lithium_battery.name=Li-Ion Energy Storage Block
tile.machine_microwave.name=Microwave
tile.machine_mining_laser.name=Mining Laser
@ -3871,6 +3872,7 @@ tile.machine_silex.name=Laser Isotope Separation Chamber (SILEX)
tile.machine_siren.name=Siren
tile.machine_solar_boiler.name=Solar Tower Boiler
tile.machine_solidifier.name=Industrial Solidification Machine
tile.machine_solidifier.desc=A universal machine fitted with cooling systems and other$versatile tools for turning fluids solid using various$processes such as freezing and petrochemical polymerization.
tile.machine_spp_bottom.name=ZPE Potential Generator (Bottom)
tile.machine_spp_top.name=ZPE Potential Generator (Top)
tile.machine_storage_drum.name=Nuclear Waste Disposal Drum

View File

@ -0,0 +1,788 @@
# Blender v2.79 (sub 0) OBJ File: 'furnace_steel.blend'
# www.blender.org
o Plane
v -1.500000 0.000000 1.500000
v 1.500000 0.000000 1.500000
v -1.500000 0.000000 -1.500000
v 1.500000 0.000000 -1.500000
v -1.500000 0.125000 1.500000
v 1.500000 0.125000 1.500000
v -1.500000 0.125000 -1.500000
v 1.500000 0.125000 -1.500000
v -1.125000 0.125000 -1.375000
v -1.125000 0.125000 1.375000
v 1.375000 0.125000 1.375000
v 1.375000 0.125000 -1.375000
v -1.125000 1.125000 -1.375000
v -1.125000 1.125000 1.375000
v 1.375000 1.125000 1.375000
v 1.375000 1.125000 -1.375000
v -1.125000 1.625000 -0.625000
v -1.125000 1.625000 0.625000
v 1.375000 1.625000 0.625000
v 1.375000 1.625000 -0.625000
v -1.375000 0.125000 0.125000
v -1.125000 0.125000 0.125000
v -1.375000 0.125000 -0.125000
v -1.125000 0.125000 -0.125000
v -1.375000 1.750000 -0.125000
v -1.375000 1.750000 0.125000
v -1.125000 1.750000 0.125000
v -1.125000 1.750000 -0.125000
v -0.125000 1.750000 0.125000
v -0.125000 1.750000 -0.125000
v -1.125000 2.000000 0.125000
v -1.125000 2.000000 -0.125000
v -0.125000 2.000000 0.125000
v -0.125000 2.000000 -0.125000
v 0.125000 1.750000 0.125000
v 0.125000 1.750000 -0.125000
v -0.125000 1.625000 0.125000
v -0.125000 1.625000 -0.125000
v 0.125000 1.625000 0.125000
v 0.125000 1.625000 -0.125000
v 0.125000 1.625000 0.375000
v 0.125000 1.625000 0.625000
v -0.125000 1.625000 0.375000
v -0.125000 1.625000 0.625000
v 0.125000 1.750000 0.375000
v 0.125000 1.750000 0.625000
v -0.125000 2.000000 0.375000
v -0.125000 2.000000 0.625000
v -1.125000 2.000000 0.375000
v -1.125000 2.000000 0.625000
v -0.125000 1.750000 0.375000
v -0.125000 1.750000 0.625000
v -1.125000 1.750000 0.375000
v -1.125000 1.750000 0.625000
v -1.375000 1.750000 0.625000
v -1.375000 1.750000 0.375000
v -1.125000 0.125000 0.375000
v -1.375000 0.125000 0.375000
v -1.125000 0.125000 0.625000
v -1.375000 0.125000 0.625000
v -1.375000 0.125000 1.125000
v -1.125000 0.125000 1.125000
v -1.375000 0.125000 0.875000
v -1.125000 0.125000 0.875000
v -1.375000 1.750000 0.875000
v -1.375000 1.750000 1.125000
v -1.125000 1.750000 1.125000
v -1.125000 1.750000 0.875000
v 0.875000 1.750000 1.125000
v 0.875000 1.750000 0.875000
v -1.125000 2.000000 1.125000
v -1.125000 2.000000 0.875000
v 0.875000 2.000000 1.125000
v 0.875000 2.000000 0.875000
v 1.125000 1.750000 1.125000
v 1.125000 1.750000 0.875000
v 0.875000 1.250000 1.125000
v 0.875000 1.250000 0.875000
v 1.125000 1.250000 1.125000
v 1.125000 1.250000 0.875000
v -1.375000 0.125000 -0.500000
v -0.875000 0.125000 -0.500000
v -1.375000 0.125000 -1.000000
v -0.875000 0.125000 -1.000000
v -1.375000 2.625000 -0.500000
v -0.875000 2.625000 -0.500000
v -1.375000 2.625000 -1.000000
v -0.875000 2.625000 -1.000000
v 0.375000 1.625000 0.375000
v 1.125000 1.625000 0.375000
v 0.375000 1.625000 -0.375000
v 1.125000 1.625000 -0.375000
v 0.375000 1.875000 -0.375000
v 0.375000 1.875000 0.375000
v 1.125000 1.875000 0.375000
v 1.125000 1.875000 -0.375000
v 0.500000 1.875000 -0.250000
v 0.500000 1.875000 0.250000
v 1.000000 1.875000 0.250000
v 1.000000 1.875000 -0.250000
v 0.500000 1.750000 -0.250000
v 0.500000 1.750000 0.250000
v 1.000000 1.750000 0.250000
v 1.000000 1.750000 -0.250000
v 0.500000 1.812500 -0.250000
v 0.500000 1.812500 0.250000
v 1.000000 1.812500 0.250000
v 1.000000 1.812500 -0.250000
v 0.000000 1.125000 -0.750000
v 0.500000 1.125000 -0.750000
v 0.000000 1.125000 -1.250000
v 0.500000 1.125000 -1.250000
v 0.000000 1.625000 -1.250000
v 0.000000 1.625000 -0.750000
v 0.500000 1.625000 -0.750000
v 0.500000 1.625000 -1.250000
v 0.125000 1.875000 -1.125000
v 0.125000 1.875000 -0.875000
v 0.375000 1.875000 -0.875000
v 0.375000 1.875000 -1.125000
v 0.750000 1.125000 -0.750000
v 1.250000 1.125000 -0.750000
v 0.750000 1.125000 -1.250000
v 1.250000 1.125000 -1.250000
v 0.750000 1.625000 -1.250000
v 0.750000 1.625000 -0.750000
v 1.250000 1.625000 -0.750000
v 1.250000 1.625000 -1.250000
v 0.875000 1.875000 -1.125000
v 0.875000 1.875000 -0.875000
v 1.125000 1.875000 -0.875000
v 1.125000 1.875000 -1.125000
v -0.750000 1.125000 -0.750000
v -0.250000 1.125000 -0.750000
v -0.750000 1.125000 -1.250000
v -0.250000 1.125000 -1.250000
v -0.750000 1.625000 -1.250000
v -0.750000 1.625000 -0.750000
v -0.250000 1.625000 -0.750000
v -0.250000 1.625000 -1.250000
v -0.625000 1.875000 -1.125000
v -0.625000 1.875000 -0.875000
v -0.375000 1.875000 -0.875000
v -0.375000 1.875000 -1.125000
v 1.375000 0.812500 0.750000
v 1.375000 0.562500 0.750000
v 1.375000 0.812500 -0.750000
v 1.375000 0.562500 -0.750000
v 1.375000 0.937500 0.625000
v 1.375000 0.937500 -0.625000
v 0.875000 0.812500 0.750000
v 0.875000 0.562500 0.750000
v 0.875000 0.562500 -0.750000
v 0.875000 0.812500 -0.750000
v 0.875000 0.937500 -0.625000
v 0.875000 0.937500 0.625000
v 1.250000 0.812500 0.750000
v 1.250000 0.562500 0.750000
v 1.250000 0.562500 -0.750000
v 1.250000 0.812500 -0.750000
v 1.250000 0.937500 -0.625000
v 1.250000 0.937500 0.625000
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.000000 -0.500000
v 0.437500 0.000000 -0.437500
v -0.437500 0.000000 -0.437500
v 0.437500 0.000000 0.437500
v -0.437500 0.000000 0.437500
v -0.500000 0.062500 -0.500000
v -0.500000 0.062500 0.500000
v 0.500000 0.062500 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.437500 0.062500 0.437500
v -0.437500 0.062500 0.437500
vt 0.087156 0.690000
vt 0.151376 0.550000
vt 0.151376 0.690000
vt 0.229358 0.500000
vt 0.220183 0.920000
vt 0.220183 0.520000
vt 0.238532 0.980000
vt 0.238532 0.500000
vt 0.000000 0.500000
vt 0.009174 0.980000
vt 0.000000 0.980000
vt 0.229358 0.480000
vt 0.009174 0.500000
vt 0.009174 0.480000
vt 0.009174 1.000000
vt 0.229358 0.980000
vt 0.229358 1.000000
vt 0.018349 0.920000
vt 0.018349 0.520000
vt 0.614679 0.000000
vt 0.458716 0.070000
vt 0.412844 0.000000
vt 0.798165 0.000000
vt 0.614679 0.160000
vt 0.229358 0.160000
vt 0.229358 0.000000
vt 0.467890 0.240000
vt 0.559633 0.640000
vt 0.467890 0.640000
vt 0.614679 0.640000
vt 0.559633 0.240000
vt 0.614679 0.240000
vt 0.412844 0.240000
vt 0.412844 0.640000
vt 1.000000 0.000000
vt 0.944954 0.240000
vt 0.733945 0.800000
vt 0.807339 0.760000
vt 0.807339 0.800000
vt 0.733945 0.640000
vt 0.807339 0.680000
vt 0.733945 0.680000
vt 0.596330 0.640000
vt 0.715596 0.680000
vt 0.596330 0.680000
vt 0.596330 0.720000
vt 0.715596 0.760000
vt 0.596330 0.760000
vt 0.715596 0.800000
vt 0.596330 0.800000
vt 0.715596 0.720000
vt 0.733945 0.720000
vt 0.807339 0.720000
vt 0.733945 0.760000
vt 0.715596 0.800000
vt 0.715596 0.680000
vt 0.825688 0.680000
vt 0.834862 0.720000
vt 0.825688 0.720000
vt 0.825688 0.680000
vt 0.825688 0.760000
vt 0.825688 0.800000
vt 0.825688 0.640000
vt 0.834862 0.680000
vt 0.825688 0.680000
vt 0.834862 0.800000
vt 0.825688 0.800000
vt 0.834862 0.760000
vt 0.825688 0.640000
vt 0.834862 0.680000
vt 0.825688 0.720000
vt 0.834862 0.760000
vt 0.825688 0.760000
vt 0.834862 0.800000
vt 0.825688 0.800000
vt 0.807339 0.800000
vt 0.807339 0.760000
vt 0.825688 0.800000
vt 0.807339 0.720000
vt 0.807339 0.680000
vt 0.825688 0.680000
vt 0.834862 0.720000
vt 0.733945 0.680000
vt 0.733945 0.720000
vt 0.715596 0.680000
vt 0.715596 0.800000
vt 0.733945 0.760000
vt 0.733945 0.800000
vt 0.715596 0.720000
vt 0.715596 0.760000
vt 0.596330 0.680000
vt 0.596330 0.720000
vt 0.596330 0.760000
vt 0.715596 0.800000
vt 0.596330 0.800000
vt 0.596330 0.640000
vt 0.715596 0.680000
vt 0.733945 0.640000
vt 0.376147 0.800000
vt 0.522936 0.760000
vt 0.522936 0.800000
vt 0.376147 0.640000
vt 0.522936 0.680000
vt 0.376147 0.680000
vt 0.238532 0.640000
vt 0.357798 0.680000
vt 0.238532 0.680000
vt 0.238532 0.720000
vt 0.357798 0.760000
vt 0.238532 0.760000
vt 0.357798 0.800000
vt 0.238532 0.800000
vt 0.357798 0.720000
vt 0.376147 0.720000
vt 0.522936 0.720000
vt 0.376147 0.760000
vt 0.357798 0.800000
vt 0.357798 0.680000
vt 0.541284 0.680000
vt 0.577982 0.720000
vt 0.541284 0.720000
vt 0.541284 0.680000
vt 0.541284 0.760000
vt 0.541284 0.800000
vt 0.577982 0.800000
vt 0.541284 0.800000
vt 0.577982 0.760000
vt 0.541284 0.640000
vt 0.577982 0.680000
vt 0.871560 0.640000
vt 0.834862 0.240000
vt 0.871560 0.240000
vt 0.944954 0.640000
vt 0.908257 0.240000
vt 0.944954 0.240000
vt 0.908257 0.640000
vt 0.981651 0.640000
vt 0.981651 0.240000
vt 0.834862 0.720000
vt 0.871560 0.720000
vt 0.467890 0.130000
vt 0.669725 0.280000
vt 0.623853 0.300000
vt 0.614679 0.280000
vt 0.834862 0.240000
vt 0.779817 0.280000
vt 0.779817 0.240000
vt 0.669725 0.240000
vt 0.614679 0.240000
vt 0.724771 0.280000
vt 0.724771 0.240000
vt 0.678899 0.400000
vt 0.715596 0.380000
vt 0.715596 0.400000
vt 0.614679 0.400000
vt 0.660550 0.380000
vt 0.669725 0.400000
vt 0.660550 0.300000
vt 0.623853 0.380000
vt 0.678899 0.300000
vt 0.678899 0.380000
vt 0.724771 0.380000
vt 0.715596 0.300000
vt 0.724771 0.300000
vt 0.669725 0.300000
vt 0.669725 0.380000
vt 0.715596 0.280000
vt 0.678899 0.280000
vt 0.623853 0.300000
vt 0.660550 0.380000
vt 0.623853 0.380000
vt 0.688073 0.480000
vt 0.660550 0.520000
vt 0.651376 0.480000
vt 0.688073 0.480000
vt 0.660550 0.520000
vt 0.651376 0.480000
vt 0.651376 0.400000
vt 0.614679 0.480000
vt 0.614679 0.400000
vt 0.724771 0.400000
vt 0.688073 0.400000
vt 0.761468 0.400000
vt 0.724771 0.480000
vt 0.623853 0.520000
vt 0.642202 0.560000
vt 0.623853 0.560000
vt 0.761468 0.480000
vt 0.733945 0.520000
vt 0.697248 0.520000
vt 0.651376 0.400000
vt 0.614679 0.480000
vt 0.614679 0.400000
vt 0.724771 0.400000
vt 0.688073 0.400000
vt 0.761468 0.400000
vt 0.724771 0.480000
vt 0.623853 0.520000
vt 0.642202 0.560000
vt 0.623853 0.560000
vt 0.761468 0.480000
vt 0.733945 0.520000
vt 0.697248 0.520000
vt 0.688073 0.480000
vt 0.660550 0.520000
vt 0.651376 0.480000
vt 0.651376 0.400000
vt 0.614679 0.480000
vt 0.614679 0.400000
vt 0.724771 0.400000
vt 0.688073 0.400000
vt 0.761468 0.400000
vt 0.724771 0.480000
vt 0.623853 0.520000
vt 0.642202 0.560000
vt 0.623853 0.560000
vt 0.761468 0.480000
vt 0.733945 0.520000
vt 0.697248 0.520000
vt 0.412844 0.160000
vt 0.568807 0.070000
vt 0.559633 0.130000
vt 0.412844 0.300000
vt 0.376147 0.280000
vt 0.412844 0.280000
vt 0.275229 0.300000
vt 0.376147 0.240000
vt 0.366972 0.300000
vt 0.275229 0.380000
vt 0.366972 0.380000
vt 0.376147 0.160000
vt 0.266055 0.240000
vt 0.266055 0.160000
vt 0.229358 0.280000
vt 0.266055 0.300000
vt 0.229358 0.300000
vt 0.412844 0.240000
vt 0.229358 0.240000
vt 0.266055 0.280000
vt 0.275229 0.440000
vt 0.376147 0.380000
vt 0.366972 0.440000
vt 0.087156 0.700000
vt 0.087156 0.550000
vt 0.151376 0.540000
vt 0.155963 0.520000
vt 0.082569 0.530000
vt 0.082569 0.520000
vt 0.082569 0.720000
vt 0.155963 0.710000
vt 0.155963 0.720000
vt 0.155963 0.320000
vt 0.155963 0.160000
vt 0.229358 0.000000
vt 0.082569 0.160000
vt 0.009174 0.000000
vt 0.082569 0.320000
vt 0.077982 0.540000
vt 0.082569 0.690000
vt 0.077982 0.700000
vt 0.155963 0.530000
vt 0.087156 0.540000
vt 0.160550 0.700000
vt 0.155963 0.550000
vt 0.160550 0.540000
vt 0.082569 0.710000
vt 0.151376 0.700000
vt 0.165138 0.700000
vt 0.165138 0.540000
vt 0.073394 0.540000
vt 0.073394 0.700000
vt 0.082569 0.550000
vt 0.155963 0.690000
vt 0.798165 0.160000
vt 1.000000 0.160000
vt 0.853211 0.240000
vt 0.807339 0.640000
vt 0.715596 0.640000
vt 0.834862 0.640000
vt 0.834862 0.640000
vt 0.715596 0.640000
vt 0.807339 0.640000
vt 0.522936 0.640000
vt 0.357798 0.640000
vt 0.577982 0.640000
vt 0.834862 0.640000
vt 0.834862 0.280000
vt 0.660550 0.300000
vt 0.678899 0.520000
vt 0.678899 0.520000
vt 0.642202 0.520000
vt 0.752294 0.520000
vt 0.715596 0.520000
vt 0.642202 0.520000
vt 0.752294 0.520000
vt 0.715596 0.520000
vt 0.678899 0.520000
vt 0.642202 0.520000
vt 0.752294 0.520000
vt 0.715596 0.520000
vt 0.458716 0.110000
vt 0.568807 0.110000
vt 0.376147 0.300000
vt 0.266055 0.420000
vt 0.266055 0.380000
vt 0.376147 0.420000
vn 0.0000 -1.0000 0.0000
vn 0.0000 1.0000 0.0000
vn 0.0000 0.0000 -1.0000
vn 0.0000 0.0000 1.0000
vn 1.0000 0.0000 0.0000
vn -1.0000 0.0000 0.0000
vn 0.0000 0.8321 -0.5547
vn 0.0000 0.8321 0.5547
vn -0.7071 0.7071 0.0000
vn 0.7071 0.7071 0.0000
vn 0.0000 0.4472 -0.8944
vn 0.0000 0.4472 0.8944
vn 0.8944 0.4472 0.0000
vn -0.8944 0.4472 0.0000
vn 0.0000 -0.7071 0.7071
vn 0.0000 -0.7071 -0.7071
s off
f 169/1/1 168/2/1 167/3/1
f 8/4/2 9/5/2 12/6/2
f 3/7/3 8/4/3 4/8/3
f 2/9/4 5/10/4 1/11/4
f 4/12/5 6/13/5 2/14/5
f 1/15/6 7/16/6 3/17/6
f 6/13/2 10/18/2 5/10/2
f 8/4/2 11/19/2 6/13/2
f 5/10/2 9/5/2 7/16/2
f 12/20/5 146/21/5 11/22/5
f 9/23/3 16/24/3 12/20/3
f 11/22/4 14/25/4 10/26/4
f 19/27/2 17/28/2 18/29/2
f 13/30/7 20/31/7 16/32/7
f 15/33/8 18/29/8 14/34/8
f 9/23/6 10/35/6 18/36/6
f 28/37/3 34/38/3 30/39/3
f 28/40/1 29/41/1 27/42/1
f 24/43/5 27/44/5 22/45/5
f 21/46/6 25/47/6 23/48/6
f 23/48/3 28/49/3 24/50/3
f 22/45/4 26/51/4 21/46/4
f 29/41/4 31/52/4 27/42/4
f 34/38/2 31/52/2 33/53/2
f 26/51/9 32/54/9 25/47/9
f 25/55/3 32/54/3 28/37/3
f 27/42/4 31/52/4 26/56/4
f 29/57/4 39/58/4 35/59/4
f 29/41/4 35/60/4 33/53/4
f 33/53/10 36/61/10 34/38/10
f 30/39/3 34/38/3 36/62/3
f 51/63/6 44/64/6 52/65/6
f 36/61/3 38/66/3 30/67/3
f 35/59/5 40/68/5 36/61/5
f 30/69/6 37/70/6 29/57/6
f 46/71/5 41/72/5 45/73/5
f 45/73/3 43/74/3 51/75/3
f 51/76/3 47/77/3 45/78/3
f 48/79/10 45/73/10 47/77/10
f 52/80/4 46/81/4 48/79/4
f 52/65/4 42/82/4 46/71/4
f 54/83/4 50/84/4 55/85/4
f 56/86/3 49/87/3 53/88/3
f 55/89/9 49/87/9 56/90/9
f 47/77/2 50/84/2 48/79/2
f 52/80/4 50/84/4 54/83/4
f 59/91/4 55/89/4 60/92/4
f 58/93/3 53/94/3 57/95/3
f 60/92/6 56/90/6 58/93/6
f 57/96/5 54/97/5 59/91/5
f 53/98/1 52/80/1 54/83/1
f 53/88/3 47/77/3 51/76/3
f 68/99/3 74/100/3 70/101/3
f 68/102/1 69/103/1 67/104/1
f 64/105/5 67/106/5 62/107/5
f 61/108/6 65/109/6 63/110/6
f 63/110/3 68/111/3 64/112/3
f 62/107/4 66/113/4 61/108/4
f 69/103/4 71/114/4 67/104/4
f 74/100/2 71/114/2 73/115/2
f 66/113/9 72/116/9 65/109/9
f 65/117/3 72/116/3 68/99/3
f 67/104/4 71/114/4 66/118/4
f 69/119/4 79/120/4 75/121/4
f 69/103/4 75/122/4 73/115/4
f 73/115/10 76/123/10 74/100/10
f 70/101/3 74/100/3 76/124/3
f 76/123/3 78/125/3 70/126/3
f 75/121/5 80/127/5 76/123/5
f 70/128/6 77/129/6 69/119/6
f 88/130/5 82/131/5 84/132/5
f 85/133/6 83/134/6 81/135/6
f 87/136/3 84/132/3 83/134/3
f 86/137/4 81/135/4 82/138/4
f 85/139/2 88/130/2 87/140/2
f 149/141/5 20/31/5 19/27/5
f 96/142/2 99/143/2 95/144/2
f 90/145/4 94/146/4 89/147/4
f 92/148/5 95/144/5 90/149/5
f 89/147/6 93/150/6 91/151/6
f 91/151/3 96/142/3 92/148/3
f 98/152/5 101/153/5 97/154/5
f 94/155/2 97/156/2 93/157/2
f 93/157/2 100/158/2 96/142/2
f 95/144/2 98/159/2 94/155/2
f 103/160/2 101/153/2 102/161/2
f 97/162/4 104/163/4 100/164/4
f 99/165/3 102/161/3 98/166/3
f 100/167/6 103/160/6 99/168/6
f 107/169/2 105/170/2 106/171/2
f 125/172/11 132/173/11 128/174/11
f 113/175/11 120/176/11 116/177/11
f 112/178/5 115/179/5 110/180/5
f 109/181/6 113/175/6 111/182/6
f 111/182/3 116/177/3 112/178/3
f 110/183/4 114/184/4 109/181/4
f 119/185/2 117/186/2 118/187/2
f 115/188/12 118/189/12 114/184/12
f 116/177/13 119/185/13 115/179/13
f 114/184/14 117/190/14 113/175/14
f 124/191/5 127/192/5 122/193/5
f 121/194/6 125/172/6 123/195/6
f 123/195/3 128/174/3 124/191/3
f 122/196/4 126/197/4 121/194/4
f 131/198/2 129/199/2 130/200/2
f 127/201/12 130/202/12 126/197/12
f 128/174/13 131/198/13 127/192/13
f 126/197/14 129/203/14 125/172/14
f 137/204/11 144/205/11 140/206/11
f 136/207/5 139/208/5 134/209/5
f 133/210/6 137/204/6 135/211/6
f 135/211/3 140/206/3 136/207/3
f 134/212/4 138/213/4 133/210/4
f 143/214/2 141/215/2 142/216/2
f 139/217/12 142/218/12 138/213/12
f 140/206/13 143/214/13 139/208/13
f 138/213/14 141/219/14 137/204/14
f 146/21/5 15/220/5 11/22/5
f 16/24/5 148/221/5 12/20/5
f 150/222/5 16/24/5 20/31/5
f 15/220/5 149/141/5 19/27/5
f 150/223/15 154/224/15 147/225/15
f 156/226/5 153/227/5 155/228/5
f 149/229/1 155/228/1 150/230/1
f 148/231/2 152/232/2 146/233/2
f 145/234/16 156/235/16 149/236/16
f 147/225/4 153/227/4 148/237/4
f 146/238/3 151/239/3 145/234/3
f 162/240/5 159/241/5 161/242/5
f 167/3/5 177/243/5 169/1/5
f 170/244/6 176/245/6 168/2/6
f 165/246/5 172/247/5 163/248/5
f 164/249/6 174/250/6 166/251/6
f 2/14/1 166/252/1 4/12/1
f 4/12/1 165/253/1 3/254/1
f 3/254/1 163/255/1 1/256/1
f 1/256/1 164/257/1 2/14/1
f 172/258/1 177/259/1 173/260/1
f 171/261/1 178/262/1 172/247/1
f 174/263/1 176/264/1 171/265/1
f 173/266/1 175/267/1 174/250/1
f 166/268/4 171/265/4 165/269/4
f 163/270/3 173/260/3 164/271/3
f 169/1/4 178/272/4 170/244/4
f 168/2/3 175/273/3 167/3/3
f 169/1/1 170/244/1 168/2/1
f 8/4/2 7/16/2 9/5/2
f 3/7/3 7/16/3 8/4/3
f 2/9/4 6/13/4 5/10/4
f 4/12/5 8/4/5 6/13/5
f 1/15/6 5/10/6 7/16/6
f 6/13/2 11/19/2 10/18/2
f 8/4/2 12/6/2 11/19/2
f 5/10/2 10/18/2 9/5/2
f 12/20/5 148/221/5 146/21/5
f 9/23/3 13/274/3 16/24/3
f 11/22/4 15/220/4 14/25/4
f 19/27/2 20/31/2 17/28/2
f 13/30/7 17/28/7 20/31/7
f 15/33/8 19/27/8 18/29/8
f 10/35/6 14/275/6 18/36/6
f 18/36/6 17/276/6 9/23/6
f 17/276/6 13/274/6 9/23/6
f 28/37/3 32/54/3 34/38/3
f 28/40/1 30/277/1 29/41/1
f 24/43/5 28/278/5 27/44/5
f 21/46/6 26/51/6 25/47/6
f 23/48/3 25/47/3 28/49/3
f 22/45/4 27/44/4 26/51/4
f 29/41/4 33/53/4 31/52/4
f 34/38/2 32/54/2 31/52/2
f 26/51/9 31/52/9 32/54/9
f 29/57/4 37/70/4 39/58/4
f 33/53/10 35/59/10 36/61/10
f 51/63/6 43/279/6 44/64/6
f 36/61/3 40/68/3 38/66/3
f 35/59/5 39/58/5 40/68/5
f 30/69/6 38/280/6 37/70/6
f 46/71/5 42/82/5 41/72/5
f 45/73/3 41/72/3 43/74/3
f 48/79/10 46/71/10 45/73/10
f 52/65/4 44/64/4 42/82/4
f 55/89/9 50/84/9 49/87/9
f 47/77/2 49/87/2 50/84/2
f 52/80/4 48/79/4 50/84/4
f 59/91/4 54/97/4 55/89/4
f 58/93/3 56/90/3 53/94/3
f 60/92/6 55/89/6 56/90/6
f 57/96/5 53/281/5 54/97/5
f 53/98/1 51/282/1 52/80/1
f 53/88/3 49/87/3 47/77/3
f 68/99/3 72/116/3 74/100/3
f 68/102/1 70/283/1 69/103/1
f 64/105/5 68/284/5 67/106/5
f 61/108/6 66/113/6 65/109/6
f 63/110/3 65/109/3 68/111/3
f 62/107/4 67/106/4 66/113/4
f 69/103/4 73/115/4 71/114/4
f 74/100/2 72/116/2 71/114/2
f 66/113/9 71/114/9 72/116/9
f 69/119/4 77/129/4 79/120/4
f 73/115/10 75/121/10 76/123/10
f 76/123/3 80/127/3 78/125/3
f 75/121/5 79/120/5 80/127/5
f 70/128/6 78/285/6 77/129/6
f 88/130/5 86/286/5 82/131/5
f 85/133/6 87/136/6 83/134/6
f 87/136/3 88/130/3 84/132/3
f 86/137/4 85/133/4 81/135/4
f 85/139/2 86/286/2 88/130/2
f 149/141/5 150/222/5 20/31/5
f 96/142/2 100/158/2 99/143/2
f 90/145/4 95/287/4 94/146/4
f 92/148/5 96/142/5 95/144/5
f 89/147/6 94/146/6 93/150/6
f 91/151/3 93/150/3 96/142/3
f 98/152/5 102/161/5 101/153/5
f 94/155/2 98/159/2 97/156/2
f 93/157/2 97/156/2 100/158/2
f 95/144/2 99/143/2 98/159/2
f 103/160/2 104/163/2 101/153/2
f 97/162/4 101/153/4 104/163/4
f 99/165/3 103/160/3 102/161/3
f 100/167/6 104/163/6 103/160/6
f 107/169/2 108/288/2 105/170/2
f 125/172/11 129/289/11 132/173/11
f 113/175/11 117/290/11 120/176/11
f 112/178/5 116/177/5 115/179/5
f 109/181/6 114/184/6 113/175/6
f 111/182/3 113/175/3 116/177/3
f 110/183/4 115/188/4 114/184/4
f 119/185/2 120/291/2 117/186/2
f 115/188/12 119/292/12 118/189/12
f 116/177/13 120/291/13 119/185/13
f 114/184/14 118/293/14 117/190/14
f 124/191/5 128/174/5 127/192/5
f 121/194/6 126/197/6 125/172/6
f 123/195/3 125/172/3 128/174/3
f 122/196/4 127/201/4 126/197/4
f 131/198/2 132/294/2 129/199/2
f 127/201/12 131/295/12 130/202/12
f 128/174/13 132/294/13 131/198/13
f 126/197/14 130/296/14 129/203/14
f 137/204/11 141/297/11 144/205/11
f 136/207/5 140/206/5 139/208/5
f 133/210/6 138/213/6 137/204/6
f 135/211/3 137/204/3 140/206/3
f 134/212/4 139/217/4 138/213/4
f 143/214/2 144/298/2 141/215/2
f 139/217/12 143/299/12 142/218/12
f 140/206/13 144/298/13 143/214/13
f 138/213/14 142/300/14 141/219/14
f 146/21/5 145/301/5 15/220/5
f 16/24/5 147/302/5 148/221/5
f 150/222/5 147/302/5 16/24/5
f 15/220/5 145/301/5 149/141/5
f 150/223/15 155/303/15 154/224/15
f 156/226/5 151/239/5 152/232/5
f 152/232/5 153/227/5 156/226/5
f 153/227/5 154/224/5 155/228/5
f 149/229/1 156/226/1 155/228/1
f 148/231/2 153/227/2 152/232/2
f 145/234/16 151/239/16 156/235/16
f 147/225/4 154/224/4 153/227/4
f 146/238/3 152/232/3 151/239/3
f 162/240/5 157/304/5 158/305/5
f 158/305/5 159/241/5 162/240/5
f 159/241/5 160/306/5 161/242/5
f 167/3/5 175/267/5 177/243/5
f 170/244/6 178/262/6 176/245/6
f 165/246/5 171/261/5 172/247/5
f 164/249/6 173/266/6 174/250/6
f 2/14/1 164/257/1 166/252/1
f 4/12/1 166/252/1 165/253/1
f 3/254/1 165/253/1 163/255/1
f 1/256/1 163/255/1 164/257/1
f 172/258/1 178/272/1 177/259/1
f 171/261/1 176/245/1 178/262/1
f 174/263/1 175/273/1 176/264/1
f 173/266/1 177/243/1 175/267/1
f 166/268/4 174/263/4 171/265/4
f 163/270/3 172/258/3 173/260/3
f 169/1/4 177/259/4 178/272/4
f 168/2/3 176/264/3 175/273/3

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB