piston inserter

This commit is contained in:
Vaern 2023-05-14 22:22:45 -07:00
parent 3fde052e09
commit 5c36e1aa04
9 changed files with 673 additions and 10 deletions

View File

@ -786,6 +786,8 @@ public class ModBlocks {
public static Block crane_splitter;
public static Block fan;
public static Block piston_inserter;
public static Block chain;
@ -1912,6 +1914,8 @@ public class ModBlocks {
crane_splitter = new CraneSplitter().setBlockName("crane_splitter").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":crane_side");
fan = new MachineFan().setBlockName("fan").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel");
piston_inserter = new PistonInserter().setBlockName("piston_inserter").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel");
chain = new BlockChain(Material.iron).setBlockName("dungeon_chain").setHardness(0.25F).setResistance(2.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":chain");
ladder_sturdy = new BlockNTMLadder().setBlockName("ladder_sturdy").setHardness(0.25F).setResistance(2.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":ladder_sturdy");
@ -3120,6 +3124,8 @@ public class ModBlocks {
GameRegistry.registerBlock(crane_splitter, crane_splitter.getUnlocalizedName());
GameRegistry.registerBlock(fan, fan.getUnlocalizedName());
GameRegistry.registerBlock(piston_inserter, piston_inserter.getUnlocalizedName());
GameRegistry.registerBlock(chain, chain.getUnlocalizedName());
GameRegistry.registerBlock(ladder_sturdy, ladder_sturdy.getUnlocalizedName());
GameRegistry.registerBlock(ladder_iron, ladder_iron.getUnlocalizedName());

View File

@ -5,12 +5,16 @@ import com.hbm.tileentity.INBTPacketReceiver;
import api.hbm.block.IInsertable;
import net.minecraft.block.Block;
import net.minecraft.block.BlockPistonBase;
import net.minecraft.block.material.Material;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
@ -37,12 +41,13 @@ public class PistonInserter extends BlockContainerBase {
if(world.getBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ).isNormalCube())
return; //no obstructions allowed!
if(checkRedstone(world, x, y, z)) { //if necessary, add lastState (if block updates are too unreliable).
TileEntityPistonInserter piston = (TileEntityPistonInserter)world.getTileEntity(x, y, z);
if(piston.extend <= 0)
piston.isRetracting = false;
}
boolean flag = checkRedstone(world, x, y, z);
TileEntityPistonInserter piston = (TileEntityPistonInserter)world.getTileEntity(x, y, z);
if(flag && !piston.lastState && piston.extend <= 0)
piston.isRetracting = false;
piston.lastState = flag;
}
}
@ -55,6 +60,69 @@ public class PistonInserter extends BlockContainerBase {
return false;
}
@Override
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
if(player.getHeldItem() != null) {
if(!world.isRemote) {
TileEntityPistonInserter piston = (TileEntityPistonInserter)world.getTileEntity(x, y, z);
if(piston.slot == null) {
piston.slot = player.inventory.decrStackSize(player.inventory.currentItem, 1);
player.inventoryContainer.detectAndSendChanges();
}
}
return true;
} else if(player.isSneaking()) {
if(!world.isRemote) {
TileEntityPistonInserter piston = (TileEntityPistonInserter)world.getTileEntity(x, y, z);
if(piston.slot != null) {
ForgeDirection dir = ForgeDirection.getOrientation(piston.getBlockMetadata());
EntityItem dust = new EntityItem(world, x + 0.5D + dir.offsetX * 0.75D, y + 0.5D + dir.offsetY * 0.75D, z + 0.5D + dir.offsetZ * 0.75D, piston.slot);
piston.slot = null;
dust.motionX = dir.offsetX * 0.25;
dust.motionY = dir.offsetY * 0.25;
dust.motionZ = dir.offsetZ * 0.25;
world.spawnEntityInWorld(dust);
}
}
return true;
}
return false;
}
@Override
public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack stack) {
int l = BlockPistonBase.determineOrientation(world, x, y, z, player);
world.setBlockMetadataWithNotify(x, y, z, l, 2);
}
@Override
public boolean isSideSolid(IBlockAccess world, int x, int y, int z, ForgeDirection side) {
return world.getBlockMetadata(x, y, z) != side.ordinal();
}
@Override
public int getRenderType(){
return -1;
}
@Override
public boolean isOpaqueCube() {
return false;
}
@Override
public boolean renderAsNormalBlock() {
return false;
}
// $%&#$&
// %$&&@$%%#%
//______ $%@--$@@%&$%$
@ -94,10 +162,11 @@ public class PistonInserter extends BlockContainerBase {
public int extend;
public static final int maxExtend = 25;
public boolean isRetracting;
public boolean isRetracting = true;
public int delay;
private int lastState;
//prevents funkies from happening with block updates or loading into a server
private boolean lastState;
public TileEntityPistonInserter() { }
@ -157,6 +226,33 @@ public class PistonInserter extends BlockContainerBase {
this.slot = null;
}
/* :3 NBT stuff */
@Override
public void writeToNBT(NBTTagCompound nbt) {
nbt.setInteger("extend", extend);
nbt.setBoolean("retract", isRetracting);
nbt.setBoolean("state", lastState); //saved so loading into a world doesn't cause issues
if(this.slot != null) {
NBTTagCompound stack = new NBTTagCompound();
slot.writeToNBT(stack);
nbt.setTag("stack", stack);
}
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
this.extend = nbt.getInteger("extend");
this.isRetracting = nbt.getBoolean("retract");
this.lastState = nbt.getBoolean("state");
if(nbt.hasKey("stack")) {
NBTTagCompound stack = nbt.getCompoundTag("stack");
this.slot = ItemStack.loadItemStackFromNBT(stack);
} else {
this.slot = null;
}
}
/* BS inventory stuff */
@Override public int getSizeInventory() { return 1; }

View File

@ -5,9 +5,11 @@ import java.util.Random;
import com.hbm.blocks.ModBlocks;
import com.hbm.blocks.generic.BlockFlammable;
import com.hbm.inventory.RecipesCommon.MetaBlock;
import com.hbm.items.ModItems;
import com.hbm.lib.RefStrings;
import api.hbm.block.IInsertable;
import api.hbm.block.IToolable;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
@ -17,11 +19,13 @@ import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.IIcon;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
public abstract class BlockGraphiteDrilledBase extends BlockFlammable implements IToolable {
public abstract class BlockGraphiteDrilledBase extends BlockFlammable implements IToolable, IInsertable {
@SideOnly(Side.CLIENT)
protected IIcon sideIcon;
@ -89,7 +93,7 @@ public abstract class BlockGraphiteDrilledBase extends BlockFlammable implements
if(side == cfg * 2 || side == cfg * 2 + 1) {
world.setBlock(x, y, z, ModBlocks.block_graphite_drilled, meta & 7, 3);
this.ejectItem(world, x, y, z, ForgeDirection.getOrientation(side), new ItemStack(getInsertedItem()));
this.ejectItem(world, x, y, z, ForgeDirection.getOrientation(side), new ItemStack(getInsertedItem(meta)));
}
}
@ -115,4 +119,107 @@ public abstract class BlockGraphiteDrilledBase extends BlockFlammable implements
drops.add(new ItemStack(getInsertedItem(meta), 1));
return drops;
}
//Checks the relationship between specific items and placement.
//kinda cringe but anything other than hardcoding would be overengineering this for no reason so
//all of this is destined to be changed most likely anyway
protected MetaBlock checkInteractions(ItemStack stack) {
Item item = stack.getItem(); //temp
if(item == ModItems.pile_rod_uranium) return new MetaBlock(ModBlocks.block_graphite_fuel);
if(item == ModItems.pile_rod_pu239) return new MetaBlock(ModBlocks.block_graphite_fuel, 0b1000);
if(item == ModItems.pile_rod_plutonium) return new MetaBlock(ModBlocks.block_graphite_plutonium);
if(item == ModItems.pile_rod_source) return new MetaBlock(ModBlocks.block_graphite_source);
if(item == ModItems.pile_rod_boron) return new MetaBlock(ModBlocks.block_graphite_rod);
if(item == ModItems.pile_rod_lithium) return new MetaBlock(ModBlocks.block_graphite_lithium);
if(item == ModItems.cell_tritium) return new MetaBlock(ModBlocks.block_graphite_tritium);
if(item == ModItems.pile_rod_detector) return new MetaBlock(ModBlocks.block_graphite_detector);
return null;
}
@Override
public boolean insertItem(World world, int x, int y, int z, ForgeDirection dir, ItemStack stack) {
if(stack == null) return false;
MetaBlock baseBlock = checkInteractions(stack);
if(baseBlock == null) return false;
final int side = dir.ordinal();
final int baseMeta = world.getBlockMetadata(x, y, z);
final int pureMeta = baseMeta & 3; //in case it's shrouded in aluminum
if(side == pureMeta * 2 || side == pureMeta * 2 + 1) {
//first, make sure we can even push rods out
for(int i = 0; i <= 3; i++) { //limited to 3 boyos
int ix = x + dir.offsetX * i;
int iy = y + dir.offsetY * i;
int iz = z + dir.offsetZ * i;
Block b = world.getBlock(ix, iy, iz);
if(b instanceof BlockGraphiteDrilledBase) {
if((world.getBlockMetadata(ix, iy, iz) & 3) != pureMeta) //wrong orientation
return false;
if(((BlockGraphiteDrilledBase)b).getInsertedItem() == null) //if there's nothing to push
break;
else if(i >= 4) //if there is stuff to push and we reach our limit
return false;
} else {
if(b.isNormalCube()) //obstructions
return false;
else //empty space? no need to search
break;
}
}
//TODO convert old methods to use itemstack for flexibility
int oldMeta = baseMeta | baseBlock.meta; //metablocks are kinda inconvenient to work with so
Block oldBlock = baseBlock.block;
NBTTagCompound oldTag = new NBTTagCompound(); //In case of TEs
//now actually make the change
for(int i = 0; i <= 3; i++) { //yeah yeah we know it's safe but let's be *extra cautious* of infinite loops
int ix = x + dir.offsetX * i;
int iy = y + dir.offsetY * i;
int iz = z + dir.offsetZ * i;
Block newBlock = world.getBlock(ix, iy, iz);
if(newBlock instanceof BlockGraphiteDrilledBase) {
int newMeta = world.getBlockMetadata(ix, iy, iz);
NBTTagCompound newTag = new NBTTagCompound();
if(newBlock instanceof BlockGraphiteDrilledTE) {
TileEntity te = world.getTileEntity(ix, iy, iz);
te.writeToNBT(newTag);
}
world.setBlock(ix, iy, iz, oldBlock, (oldMeta & ~0b100) | (newMeta & 0b100), 2);
if(oldBlock instanceof BlockGraphiteDrilledTE && !oldTag.hasNoTags()) { //safety first
TileEntity te = world.getTileEntity(ix, iy, iz);
te.readFromNBT(oldTag);
}
oldMeta = newMeta;
oldBlock = newBlock;
oldTag = newTag;
if(oldBlock instanceof BlockGraphiteDrilled) //if there's no need to eject an item
break;
} else {
Item eject = ((BlockGraphiteDrilledBase) oldBlock).getInsertedItem(oldMeta); //TODO old methods to itemstack
this.ejectItem(world, ix - dir.offsetX, iy - dir.offsetY, iz - dir.offsetZ, dir, new ItemStack(eject));
world.playSoundEffect(ix + 0.5, iy + 0.5, iz + 0.5, "hbm:item.upgradePlug", 1.0F, 1.0F);
break;
}
}
return true;
}
return false;
}
}

View File

@ -48,6 +48,7 @@ import com.hbm.blocks.generic.BlockEmitter.TileEntityEmitter;
import com.hbm.blocks.generic.BlockLoot.TileEntityLoot;
import com.hbm.blocks.generic.BlockSnowglobe.TileEntitySnowglobe;
import com.hbm.blocks.machine.MachineFan.TileEntityFan;
import com.hbm.blocks.machine.PistonInserter.TileEntityPistonInserter;
import com.hbm.blocks.machine.WatzPump.TileEntityWatzPump;
import com.hbm.entity.cart.*;
import com.hbm.entity.effect.*;
@ -278,6 +279,7 @@ public class ClientProxy extends ServerProxy {
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineCatalyticReformer.class, new RenderCatalyticReformer());
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineCoker.class, new RenderCoker());
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFan.class, new RenderFan());
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityPistonInserter.class, new RenderPistonInserter());
//Foundry
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFoundryBasin.class, new RenderFoundry());
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFoundryMold.class, new RenderFoundry());

View File

@ -191,6 +191,9 @@ public class ResourceManager {
//Fan
public static final IModelCustom fan = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/fan.obj"));
//Piston Inserter
public static final IModelCustom piston_inserter = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/piston_inserter.obj"));
//Sphere
public static final IModelCustom sphere_ruv = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/sphere_ruv.obj"));
public static final IModelCustom sphere_iuv = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/sphere_iuv.obj"));
@ -538,6 +541,9 @@ public class ResourceManager {
//Fan
public static final ResourceLocation fan_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/fan.png");
//Piston_Inserter
public static final ResourceLocation piston_inserter_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/piston_inserter.png");
//Radgen
public static final ResourceLocation radgen_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/radgen.png");

View File

@ -0,0 +1,65 @@
package com.hbm.render.tileentity;
import org.lwjgl.opengl.GL11;
import com.hbm.blocks.ModBlocks;
import com.hbm.blocks.machine.PistonInserter.TileEntityPistonInserter;
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 RenderPistonInserter extends TileEntitySpecialRenderer implements IItemRendererProvider {
@Override
public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float interp) {
GL11.glPushMatrix();
GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5);
GL11.glEnable(GL11.GL_LIGHTING);
GL11.glEnable(GL11.GL_CULL_FACE);
switch(tile.getBlockMetadata()) {
case 0: GL11.glRotatef(180, 1F, 0F, 0F); break;
case 1: break;
case 2: GL11.glRotatef(-90, 1F, 0F, 0F); break;
case 4: GL11.glRotatef(90, 0F, 0F, 1F); break;
case 3: GL11.glRotatef(90, 1F, 0F, 0F); break;
case 5: GL11.glRotatef(-90, 0F, 0F, 1F); break;
}
GL11.glTranslated(0D, -0.5, 0D);
bindTexture(ResourceManager.piston_inserter_tex);
ResourceManager.piston_inserter.renderPart("Frame");
TileEntityPistonInserter piston = (TileEntityPistonInserter)tile;
double e = piston.extend / (double)piston.maxExtend;
GL11.glTranslated(0, -e, 0);
ResourceManager.piston_inserter.renderPart("Piston");
GL11.glPopMatrix();
}
@Override
public Item getItemForRenderer() {
return Item.getItemFromBlock(ModBlocks.piston_inserter);
}
@Override
public IItemRenderer getRenderer() {
return new ItemRenderBase() {
public void renderInventory() {
GL11.glTranslated(0, -2.5, 0);
double scale = 5;
GL11.glScaled(scale, scale, scale);
}
public void renderCommon() {
GL11.glScaled(2, 2, 2);
bindTexture(ResourceManager.piston_inserter_tex);
ResourceManager.piston_inserter.renderAll();
}};
}
}

View File

@ -13,6 +13,7 @@ import com.hbm.blocks.generic.BlockMotherOfAllOres.TileEntityRandomOre;
import com.hbm.blocks.generic.BlockSnowglobe.TileEntitySnowglobe;
import com.hbm.blocks.generic.PartEmitter.TileEntityPartEmitter;
import com.hbm.blocks.machine.MachineFan.TileEntityFan;
import com.hbm.blocks.machine.PistonInserter.TileEntityPistonInserter;
import com.hbm.blocks.machine.WatzPump.TileEntityWatzPump;
import com.hbm.blocks.network.BlockCablePaintable.TileEntityCablePaintable;
import com.hbm.blocks.network.CableDiode.TileEntityDiode;
@ -360,6 +361,7 @@ public class TileMappings {
put(TileEntityCraneRouter.class, "tileentity_router");
put(TileEntityCraneSplitter.class, "tileentity_splitter");
put(TileEntityFan.class, "tileentity_fan");
put(TileEntityPistonInserter.class, "tileentity_piston_inserter");
put(TileEntityRadioTorchSender.class, "tileentity_rtty_sender");
put(TileEntityRadioTorchReceiver.class, "tileentity_rtty_rec");

View File

@ -0,0 +1,379 @@
# Blender v3.2.0 OBJ File: 'piston_inserter.blend'
# www.blender.org
mtllib piston_inserter.mtl
o Frame
v -0.125000 0.000000 0.125000
v -0.125000 1.000000 0.125000
v -0.125000 0.000000 -0.125000
v -0.125000 1.000000 -0.125000
v 0.125000 0.000000 0.125000
v 0.125000 1.000000 0.125000
v 0.125000 0.000000 -0.125000
v 0.125000 1.000000 -0.125000
v -0.500000 1.000000 0.500000
v -0.500000 1.000000 -0.500000
v 0.500000 1.000000 -0.500000
v 0.500000 1.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.500000 0.000000 0.500000
v -0.375000 1.000000 0.375000
v -0.375000 1.000000 -0.375000
v 0.375000 1.000000 -0.375000
v 0.375000 1.000000 0.375000
v -0.375000 0.000000 -0.375000
v -0.375000 0.000000 0.375000
v 0.375000 0.000000 -0.375000
v 0.375000 0.000000 0.375000
v 0.312500 0.937500 0.375000
v 0.375000 0.937500 0.375000
v 0.125000 0.937500 0.125000
v 0.375000 0.937500 0.312500
v 0.004327 0.858644 -0.020544
v 0.062500 0.937500 0.125000
v 0.125000 0.937500 0.062500
v -0.312500 0.937500 -0.375000
v -0.375000 0.937500 -0.375000
v -0.125000 0.937500 -0.125000
v -0.375000 0.937500 -0.312500
v -0.062500 0.937500 -0.125000
v -0.125000 0.937500 -0.062500
v 0.375000 0.937500 -0.312500
v 0.375000 0.937500 -0.375000
v 0.125000 0.937500 -0.125000
v 0.312500 0.937500 -0.375000
v 0.125000 0.937500 -0.062500
v 0.062500 0.937500 -0.125000
v -0.375000 0.937500 0.312500
v -0.375000 0.937500 0.375000
v -0.125000 0.937500 0.125000
v -0.312500 0.937500 0.375000
v -0.125000 0.937500 0.062500
v -0.062500 0.937500 0.125000
v 0.312500 0.062500 0.375000
v 0.375000 0.062500 0.375000
v 0.125000 0.062500 0.125000
v 0.375000 0.062500 0.312500
v 0.062500 0.062500 0.125000
v 0.125000 0.062500 0.062500
v -0.312500 0.062500 -0.375000
v -0.375000 0.062500 -0.375000
v -0.125000 0.062500 -0.125000
v -0.375000 0.062500 -0.312500
v -0.062500 0.062500 -0.125000
v -0.125000 0.062500 -0.062500
v 0.375000 0.062500 -0.312500
v 0.375000 0.062500 -0.375000
v 0.125000 0.062500 -0.125000
v 0.312500 0.062500 -0.375000
v 0.125000 0.062500 -0.062500
v 0.062500 0.062500 -0.125000
v -0.375000 0.062500 0.312500
v -0.375000 0.062500 0.375000
v -0.125000 0.062500 0.125000
v -0.312500 0.062500 0.375000
v -0.125000 0.062500 0.062500
v -0.062500 0.062500 0.125000
vt 0.571429 0.666667
vt 0.000000 0.333333
vt 0.571429 0.333333
vt 0.571429 0.666667
vt -0.000000 0.333333
vt 0.571429 0.333333
vt 0.571429 0.666667
vt -0.000000 0.333333
vt 0.571429 0.333333
vt 0.571429 0.666667
vt -0.000000 0.333333
vt 0.571429 0.333333
vt 0.714286 0.416667
vt 0.571429 0.333333
vt 0.714286 0.333333
vt 0.714286 0.750000
vt 0.571429 0.833333
vt 0.571429 0.750000
vt 0.071429 0.708333
vt 0.500000 0.708333
vt 0.071429 0.958333
vt 0.000000 0.666667
vt 0.500000 0.958333
vt 0.000000 1.000000
vt 0.571429 1.000000
vt 0.500000 0.041667
vt 0.500000 0.291667
vt 0.071429 0.291667
vt 0.000000 0.000000
vt 0.071429 0.041667
vt 0.571429 0.000000
vt 0.714286 0.416667
vt 0.571429 0.750000
vt 0.571429 0.416667
vt 0.714286 0.416667
vt 0.571429 0.750000
vt 0.571429 0.416667
vt 0.714286 0.416667
vt 0.571429 0.750000
vt 0.571429 0.416667
vt 0.714286 0.416667
vt 0.571429 0.750000
vt 0.571429 0.416667
vt 0.571429 -0.000000
vt 1.000000 0.333333
vt 0.571429 0.333333
vt 0.571429 0.000000
vt 1.000000 0.333333
vt 0.571429 0.333333
vt 0.571429 0.000000
vt 1.000000 0.333333
vt 0.571429 0.333333
vt 0.571429 0.000000
vt 1.000000 0.333333
vt 0.571429 0.333333
vt 0.214286 0.125000
vt 0.071429 0.062500
vt 0.107143 0.041667
vt 0.357143 0.208333
vt 0.500000 0.270833
vt 0.464286 0.291667
vt 0.214286 0.208333
vt 0.107143 0.291667
vt 0.071429 0.270833
vt 0.357143 0.125000
vt 0.464286 0.041667
vt 0.500000 0.062500
vt 0.214286 0.125000
vt 0.071429 0.062500
vt 0.107143 0.041667
vt 0.357143 0.208333
vt 0.500000 0.270833
vt 0.464286 0.291667
vt 0.214286 0.208333
vt 0.107143 0.291667
vt 0.071429 0.270833
vt 0.357143 0.125000
vt 0.464286 0.041667
vt 0.500000 0.062500
vt -0.000000 0.666667
vt 0.000000 0.666667
vt 0.000000 0.666667
vt 0.571429 0.416667
vt 0.714286 0.833333
vt 0.714286 0.750000
vt 0.714286 0.750000
vt 0.714286 0.750000
vt 0.714286 0.750000
vt 1.000000 -0.000000
vt 1.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 -0.000000
vt 0.250000 0.125000
vt 0.214286 0.145833
vt 0.071429 0.041667
vt 0.321429 0.208333
vt 0.357143 0.187500
vt 0.500000 0.291667
vt 0.214286 0.187500
vt 0.250000 0.208333
vt 0.071429 0.291667
vt 0.357143 0.145833
vt 0.321429 0.125000
vt 0.500000 0.041667
vt 0.250000 0.125000
vt 0.214286 0.145833
vt 0.071429 0.041667
vt 0.321429 0.208333
vt 0.357143 0.187500
vt 0.500000 0.291667
vt 0.214286 0.187500
vt 0.250000 0.208333
vt 0.071429 0.291667
vt 0.357143 0.145833
vt 0.321429 0.125000
vt 0.500000 0.041667
vn -1.0000 0.0000 0.0000
vn 0.0000 0.0000 -1.0000
vn 1.0000 0.0000 0.0000
vn 0.0000 0.0000 1.0000
vn 0.0000 -1.0000 0.0000
vn 0.0000 1.0000 0.0000
usemtl None
s off
f 9/1/1 13/2/1 14/3/1
f 10/4/2 15/5/2 13/6/2
f 11/7/3 16/8/3 15/9/3
f 12/10/4 14/11/4 16/12/4
f 7/13/5 1/14/5 3/15/5
f 4/16/6 6/17/6 8/18/6
f 18/19/6 9/1/6 17/20/6
f 19/21/6 10/22/6 18/19/6
f 20/23/6 11/24/6 19/21/6
f 17/20/6 12/25/6 20/23/6
f 22/26/5 13/6/5 21/27/5
f 21/27/5 15/5/5 23/28/5
f 23/28/5 16/29/5 24/30/5
f 24/30/5 14/31/5 22/26/5
f 8/32/2 3/33/2 4/34/2
f 6/35/3 7/36/3 8/37/3
f 2/38/4 5/39/4 6/40/4
f 4/41/1 1/42/1 2/43/1
f 23/44/1 20/45/1 19/46/1
f 24/47/2 17/48/2 20/49/2
f 22/50/3 18/51/3 17/52/3
f 21/53/4 19/54/4 18/55/4
f 27/56/5 28/57/5 25/58/5
f 34/59/5 35/60/5 32/61/5
f 40/62/5 41/63/5 38/64/5
f 46/65/5 47/66/5 44/67/5
f 52/68/5 53/69/5 50/70/5
f 58/71/5 59/72/5 56/73/5
f 64/74/5 65/75/5 62/76/5
f 70/77/5 71/78/5 68/79/5
f 9/1/1 10/22/1 13/2/1
f 10/4/2 11/80/2 15/5/2
f 11/7/3 12/81/3 16/8/3
f 12/10/4 9/82/4 14/11/4
f 7/13/5 5/83/5 1/14/5
f 4/16/6 2/84/6 6/17/6
f 18/19/6 10/22/6 9/1/6
f 19/21/6 11/24/6 10/22/6
f 20/23/6 12/25/6 11/24/6
f 17/20/6 9/1/6 12/25/6
f 22/26/5 14/31/5 13/6/5
f 21/27/5 13/6/5 15/5/5
f 23/28/5 15/5/5 16/29/5
f 24/30/5 16/29/5 14/31/5
f 8/32/2 7/85/2 3/33/2
f 6/35/3 5/86/3 7/36/3
f 2/38/4 1/87/4 5/39/4
f 4/41/1 3/88/1 1/42/1
f 23/44/1 24/89/1 20/45/1
f 24/47/2 22/90/2 17/48/2
f 22/50/3 21/91/3 18/51/3
f 21/53/4 23/92/4 19/54/4
f 25/58/5 30/93/5 27/56/5
f 27/56/5 31/94/5 28/57/5
f 28/57/5 26/95/5 25/58/5
f 32/61/5 36/96/5 34/59/5
f 34/59/5 37/97/5 35/60/5
f 35/60/5 33/98/5 32/61/5
f 38/64/5 42/99/5 40/62/5
f 40/62/5 43/100/5 41/63/5
f 41/63/5 39/101/5 38/64/5
f 44/67/5 48/102/5 46/65/5
f 46/65/5 49/103/5 47/66/5
f 47/66/5 45/104/5 44/67/5
f 50/70/5 54/105/5 52/68/5
f 52/68/5 55/106/5 53/69/5
f 53/69/5 51/107/5 50/70/5
f 56/73/5 60/108/5 58/71/5
f 58/71/5 61/109/5 59/72/5
f 59/72/5 57/110/5 56/73/5
f 62/76/5 66/111/5 64/74/5
f 64/74/5 67/112/5 65/75/5
f 65/75/5 63/113/5 62/76/5
f 68/79/5 72/114/5 70/77/5
f 70/77/5 73/115/5 71/78/5
f 71/78/5 69/116/5 68/79/5
l 27 29
o Piston
v -0.062500 1.000000 0.062500
v -0.125000 1.062500 0.125000
v -0.062500 1.000000 -0.062500
v -0.125000 1.062500 -0.125000
v 0.062500 1.000000 0.062500
v 0.125000 1.062500 0.125000
v 0.062500 1.000000 -0.062500
v 0.125000 1.062500 -0.125000
v -0.125000 1.000000 -0.125000
v -0.125000 1.000000 0.125000
v 0.125000 1.000000 -0.125000
v 0.125000 1.000000 0.125000
v -0.062500 0.062500 -0.062500
v -0.062500 0.062500 0.062500
v 0.062500 0.062500 -0.062500
v 0.062500 0.062500 0.062500
vt 0.857143 0.708333
vt 0.714286 0.687500
vt 0.857143 0.687500
vt 0.857143 0.708333
vt 0.714286 0.687500
vt 0.857143 0.687500
vt 0.857143 0.708333
vt 0.714286 0.687500
vt 0.857143 0.687500
vt 0.857143 0.708333
vt 0.714286 0.687500
vt 0.857143 0.687500
vt 0.821429 0.375000
vt 0.750000 0.687500
vt 0.750000 0.375000
vt 0.857143 0.791667
vt 0.714286 0.875000
vt 0.714286 0.791667
vt 0.821429 0.770833
vt 0.714286 0.791667
vt 0.750000 0.770833
vt 0.714286 0.708333
vt 0.750000 0.729167
vt 0.857143 0.708333
vt 0.821429 0.729167
vt 0.857143 0.791667
vt 0.821429 0.333333
vt 0.750000 0.375000
vt 0.750000 0.333333
vt 0.821429 0.375000
vt 0.750000 0.687500
vt 0.750000 0.375000
vt 0.821429 0.375000
vt 0.750000 0.687500
vt 0.750000 0.375000
vt 0.821429 0.375000
vt 0.750000 0.687500
vt 0.750000 0.375000
vt 0.714286 0.708333
vt 0.714286 0.708333
vt 0.714286 0.708333
vt 0.714286 0.708333
vt 0.821429 0.687500
vt 0.857143 0.875000
vt 0.821429 0.375000
vt 0.821429 0.687500
vt 0.821429 0.687500
vt 0.821429 0.687500
vn -1.0000 0.0000 0.0000
vn 0.0000 0.0000 -1.0000
vn 1.0000 0.0000 0.0000
vn 0.0000 0.0000 1.0000
vn 0.0000 1.0000 0.0000
vn 0.0000 -1.0000 0.0000
usemtl None
s off
f 75/117/7 82/118/7 83/119/7
f 77/120/8 84/121/8 82/122/8
f 81/123/9 85/124/9 84/125/9
f 79/126/10 83/127/10 85/128/10
f 78/129/9 88/130/9 80/131/9
f 77/132/11 79/133/11 81/134/11
f 74/135/12 82/136/12 76/137/12
f 76/137/12 84/138/12 80/139/12
f 80/139/12 85/140/12 78/141/12
f 78/141/12 83/142/12 74/135/12
f 88/143/12 87/144/12 86/145/12
f 76/146/7 87/147/7 74/148/7
f 74/149/10 89/150/10 78/151/10
f 80/152/8 86/153/8 76/154/8
f 75/117/7 77/155/7 82/118/7
f 77/120/8 81/156/8 84/121/8
f 81/123/9 79/157/9 85/124/9
f 79/126/10 75/158/10 83/127/10
f 78/129/9 89/159/9 88/130/9
f 77/132/11 75/160/11 79/133/11
f 74/135/12 83/142/12 82/136/12
f 76/137/12 82/136/12 84/138/12
f 80/139/12 84/138/12 85/140/12
f 78/141/12 85/140/12 83/142/12
f 88/143/12 89/161/12 87/144/12
f 76/146/7 86/162/7 87/147/7
f 74/149/10 87/163/10 89/150/10
f 80/152/8 88/164/8 86/153/8

Binary file not shown.

After

Width:  |  Height:  |  Size: 544 B