From cee2b88ffeb587c5caaf4863522301c3f90108b4 Mon Sep 17 00:00:00 2001 From: Pabilo8 Date: Fri, 15 May 2026 01:04:39 +0200 Subject: [PATCH 01/23] Moved Latex Collector to AMT, improved shaders to use the lightmap --- .../client/ClientProxy.java | 6 +- .../client/fx/utils/ParticleDrawStages.java | 8 +- .../metal_device/LatexCollectorRenderer.java | 137 ++--- .../client/util/ShaderUtil.java | 6 + .../metal_device/BlockIIMetalDevice.java | 25 +- .../tileentity/TileEntityLatexCollector.java | 29 +- .../animations/latex_collector/extractor.json | 17 + .../latex_collector/place_bucket.json | 63 ++ .../blockstates/metal_device.json | 15 +- .../metal_device/latex_collector.json | 70 +++ .../block/metal_device/latex_collector.json | 255 -------- .../latex_collector/latex_collector.mtl | 4 + .../latex_collector/latex_collector.obj.amt | 20 + .../latex_collector/latex_collector.obj.ie | 582 ++++++++++++++++++ .../latex_collector/latex_collector_base.obj | 126 ++++ .../latex_collector/latex_collector_inv.obj | 440 +++++++++++++ .../metal_device/latex_collector_bucket.json | 317 ---------- .../immersiveintelligence/shaders/alpha.frag | 13 +- .../shaders/blueprint.frag | 10 +- .../immersiveintelligence/shaders/color.frag | 9 +- .../shaders/grayscale.frag | 12 +- .../immersiveintelligence/shaders/noise.frag | 9 +- .../blocks/metal_device/latex_collector.png | Bin 2001 -> 6793 bytes 23 files changed, 1448 insertions(+), 725 deletions(-) create mode 100644 src/main/resources/assets/immersiveintelligence/animations/latex_collector/extractor.json create mode 100644 src/main/resources/assets/immersiveintelligence/animations/latex_collector/place_bucket.json create mode 100644 src/main/resources/assets/immersiveintelligence/blockstates/metal_device/latex_collector.json delete mode 100644 src/main/resources/assets/immersiveintelligence/models/block/metal_device/latex_collector.json create mode 100644 src/main/resources/assets/immersiveintelligence/models/block/metal_device/latex_collector/latex_collector.mtl create mode 100644 src/main/resources/assets/immersiveintelligence/models/block/metal_device/latex_collector/latex_collector.obj.amt create mode 100644 src/main/resources/assets/immersiveintelligence/models/block/metal_device/latex_collector/latex_collector.obj.ie create mode 100644 src/main/resources/assets/immersiveintelligence/models/block/metal_device/latex_collector/latex_collector_base.obj create mode 100644 src/main/resources/assets/immersiveintelligence/models/block/metal_device/latex_collector/latex_collector_inv.obj delete mode 100644 src/main/resources/assets/immersiveintelligence/models/block/metal_device/latex_collector_bucket.json diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/ClientProxy.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/ClientProxy.java index 08bf350a2..78064bf9d 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/ClientProxy.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/ClientProxy.java @@ -115,7 +115,6 @@ import pl.pabilo8.immersiveintelligence.common.block.data_device.tileentity.TileEntityTimedBuffer; import pl.pabilo8.immersiveintelligence.common.block.fortification.tileentity.TileEntityMineSign; import pl.pabilo8.immersiveintelligence.common.block.metal_device.BlockIIMetalDevice.IIBlockTypes_MetalDevice; -import pl.pabilo8.immersiveintelligence.common.block.metal_device.tileentity.TileEntityLatexCollector; import pl.pabilo8.immersiveintelligence.common.block.metal_device.tileentity.conveyors.*; import pl.pabilo8.immersiveintelligence.common.block.multiblock.gate_multiblock.multiblock.MultiblockAluminiumChainFenceGate.TileEntityAluminiumChainFenceGate; import pl.pabilo8.immersiveintelligence.common.block.multiblock.gate_multiblock.multiblock.MultiblockAluminiumFenceGate.TileEntityAluminiumFenceGate; @@ -465,14 +464,11 @@ else if(bullet instanceof ItemIIAmmoRevolver) ClientRegistry.bindTileEntitySpecialRenderer(TileEntitySmallDataBuffer.class, new SmallDataBufferRenderer()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityDataMerger.class, new DataMergerRenderer()); registerTileRenderer(DataDebuggerRenderer.class); - - //TODO: 29.12.2023 latex collector renderer - ClientRegistry.bindTileEntitySpecialRenderer(TileEntityLatexCollector.class, new LatexCollectorRenderer()); + registerTileRenderer(LatexCollectorRenderer.class); //Decorations ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMineSign.class, new MineSignRenderer()); - //Tools IIContent.itemTripodPeriscope.setTileEntityItemStackRenderer(TripodPeriscopeRenderer.instance); IIContent.itemMortar.setTileEntityItemStackRenderer(MortarRenderer.instance); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/fx/utils/ParticleDrawStages.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/fx/utils/ParticleDrawStages.java index 796fc01fc..69623d40a 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/fx/utils/ParticleDrawStages.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/fx/utils/ParticleDrawStages.java @@ -102,16 +102,14 @@ public void prepareRender(BufferBuilder buffer, float partialTicks) else GlStateManager.disableTexture2D(); + if(applyLighting) + GlStateManager.enableLighting(); + GlStateManager.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, destFactor); if(this.renderThroughBlocks) GlStateManager.disableDepth(); if(shader!=null) ShaderUtil.useShader(shader, shaderParameters.apply(partialTicks)); - if(applyLighting) - { - GlStateManager.enableLighting(); - - } buffer.begin(GL11.GL_QUADS, vertexFormat); } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/metal_device/LatexCollectorRenderer.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/metal_device/LatexCollectorRenderer.java index 96b0b15db..798335ce5 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/metal_device/LatexCollectorRenderer.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/metal_device/LatexCollectorRenderer.java @@ -1,106 +1,71 @@ package pl.pabilo8.immersiveintelligence.client.render.metal_device; -import blusunrize.immersiveengineering.api.IEProperties; -import blusunrize.immersiveengineering.client.ClientUtils; import net.minecraft.block.state.IBlockState; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.*; -import net.minecraft.client.renderer.block.model.IBakedModel; -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.Tessellator; +import net.minecraftforge.client.model.obj.OBJModel; import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.capability.CapabilityFluidHandler; -import net.minecraftforge.fluids.capability.IFluidHandlerItem; -import org.lwjgl.opengl.GL11; +import pl.pabilo8.immersiveintelligence.client.util.amt.AMTUtils; +import pl.pabilo8.immersiveintelligence.client.util.amt.animation.IIAnimationCompiledMap; +import pl.pabilo8.immersiveintelligence.client.util.amt.models.AMTModel; +import pl.pabilo8.immersiveintelligence.client.util.amt.parts.AMT; +import pl.pabilo8.immersiveintelligence.client.util.amt.parts.AMTFluid; +import pl.pabilo8.immersiveintelligence.client.util.amt.renderer.IITileRenderer; +import pl.pabilo8.immersiveintelligence.client.util.amt.renderer.IITileRenderer.RegisteredTileRenderer; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Machines.LatexCollector; import pl.pabilo8.immersiveintelligence.common.IIContent; import pl.pabilo8.immersiveintelligence.common.block.metal_device.tileentity.TileEntityLatexCollector; - -import static blusunrize.immersiveengineering.api.IEProperties.FACING_HORIZONTAL; +import pl.pabilo8.immersiveintelligence.common.util.IIReference; /** * @author Pabilo8 (pabilo@iiteam.net) + * @updated 13.05.2026 + * @ii-approved 0.3.1 * @since 30.08.2020 */ -public class LatexCollectorRenderer extends TileEntitySpecialRenderer +@RegisteredTileRenderer(name = "latex_collector", clazz = TileEntityLatexCollector.class) +public class LatexCollectorRenderer extends IITileRenderer { - // TODO: 11.07.2022 adapt to AMT + private IIAnimationCompiledMap placeBucket, extractorVisibility; + private AMTModel model; + private AMTFluid latex; @Override - public void render(TileEntityLatexCollector te, double x, double y, double z, float partialTicks, int destroyStage, float alpha) + public void draw(TileEntityLatexCollector te, BufferBuilder buf, float partialTicks, Tessellator tes) { - if(te!=null) - { - GlStateManager.pushMatrix(); - GlStateManager.translate(x, y, z); - GlStateManager.color(1.0f, 1.0f, 1.0f, 1.0f); - - if(!te.bucket.isEmpty()) - { - - float progress = MathHelper.clamp(1f-((te.bucketTime-partialTicks)/10f), 0, 1); - - GlStateManager.enableBlend(); - GlStateManager.pushMatrix(); - GlStateManager.enableAlpha(); - GlStateManager.color(1f, 1f, 1f, 0.25f); - GlStateManager.translate(0, 0, 0); - - final BlockRendererDispatcher blockRenderer = Minecraft.getMinecraft().getBlockRendererDispatcher(); - BlockPos blockPos = te.getPos(); - IBlockState state = getWorld().getBlockState(te.getPos()).withProperty(IEProperties.BOOLEANS[0], true).withProperty(FACING_HORIZONTAL, te.facing); - IBakedModel model = blockRenderer.getBlockModelShapes().getModelForState(state); - - Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder worldRenderer = tessellator.getBuffer(); - - RenderHelper.disableStandardItemLighting(); - GlStateManager.blendFunc(770, 771); - GlStateManager.enableBlend(); - GlStateManager.disableCull(); - - ClientUtils.bindAtlas(); - - worldRenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK); - Vec3d vv = new Vec3d(blockPos).scale(-1).add(new Vec3d(0, 0.5, 0).add(new Vec3d(te.facing.getOpposite().getDirectionVec())).scale(0.5).scale((1-Math.min(progress, 1)))); - worldRenderer.setTranslation(vv.x, vv.y, vv.z); - - blockRenderer.getBlockModelRenderer().renderModel(te.getWorld(), model, state, blockPos, worldRenderer, true); - worldRenderer.setTranslation(0.0D, 0.0D, 0.0D); - tessellator.draw(); - - float atime = te.timer; - if(!te.bucket.isEmpty()&&te.timer==0&&te.bucket.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null)) - { - IFluidHandlerItem cap = te.bucket.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null); - if(cap!=null) - { - FluidStack drain = cap.drain(1000, false); - atime += drain!=null&&drain.amount==1000?LatexCollector.collectTime: 0; - } - } - float amount = Math.min((atime+(!te.bucket.isEmpty()&&te.isNextToTree()?(partialTicks*te.getIncomeModifier()): 0))/(float)LatexCollector.collectTime, 1f); - if(progress >= 1&&amount > 0) - { - GlStateManager.translate(0.5, 0, 0.5); - GlStateManager.rotate(-te.facing.getHorizontalAngle(), 0, 1, 0); - GlStateManager.translate(-0.25, 0.3125+(0.655*amount), -0.125); - GlStateManager.rotate(90, 1, 0, 0); - GlStateManager.scale(0.0625f, 0.0625f, 0.0625f); - ClientUtils.drawRepeatedFluidSprite(new FluidStack(IIContent.fluidLatex, 1), 0f, 0f, 8, 8); - } - - RenderHelper.enableStandardItemLighting(); - - GlStateManager.popMatrix(); - GlStateManager.disableBlend(); - } + //Bucket place animation + float bucketProgress = 0f; + if(!te.bucket.isEmpty()) + bucketProgress = AMTUtils.getAnimationProgress(te.bucketTime, 10f, true, partialTicks); + placeBucket.apply(bucketProgress); + //Chain and extractor visibility + boolean nextToTree = te.isNextToTree(); + extractorVisibility.apply(nextToTree?1f: 0f); + + //Apply latex level + float atime = te.timer; + latex.withLevel(Math.min((atime+(!te.bucket.isEmpty()&&nextToTree?(partialTicks*te.getIncomeModifier()): 0))/(float)LatexCollector.collectTime, 1f)); + + //Render + applyStandardRotation(te.facing); + model.render(tes, buf); + } - GlStateManager.popMatrix(); + @Override + public void compileModels(IBlockState state, OBJModel model) + { + this.model = new AMTModel(state, model, header -> new AMT[]{ + this.latex = new AMTFluid("latex", header) + .withFluid(new FluidStack(IIContent.fluidLatex, 1000)) + }); + this.placeBucket = IIAnimationCompiledMap.create(this.model, IIReference.RES_II.with("latex_collector/place_bucket")); + this.extractorVisibility = IIAnimationCompiledMap.create(this.model, IIReference.RES_II.with("latex_collector/extractor")); + } - } + @Override + protected void nullifyModels() + { + this.model = AMTUtils.disposeOf(this.model); + this.latex = null; } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/util/ShaderUtil.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/util/ShaderUtil.java index 37b9b95ea..448c85866 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/util/ShaderUtil.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/util/ShaderUtil.java @@ -61,6 +61,7 @@ public static boolean useShader(@Nullable Shaders shader, @Nonnull float... para if(shader==null||!shader.use()) return false; + shader.setInt("lightmap", 1); switch(shader) { case BLUEPRINT: @@ -246,6 +247,11 @@ int getRef(String name) return ARBShaderObjects.glGetUniformLocationARB(programID, name); } + void setInt(String name, int value) + { + ARBShaderObjects.glUniform1iARB(getRef(name), value); + } + void setFloat(String name, float value) { ARBShaderObjects.glUniform1fARB(getRef(name), value); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/metal_device/BlockIIMetalDevice.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/metal_device/BlockIIMetalDevice.java index c82d2d7a5..48f5a1b3e 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/metal_device/BlockIIMetalDevice.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/metal_device/BlockIIMetalDevice.java @@ -54,21 +54,6 @@ public BlockIIMetalDevice() IIBlockTypes_MetalDevice.SMALL_DATA_BUFFER, IIBlockTypes_MetalDevice.DATA_MERGER); } - @Override - public String getMappingsExtension(int meta, boolean itemBlock) - { - switch(IIBlockTypes_MetalDevice.values()[meta]) - { - default: - return null; - - case AMMUNITION_CRATE: - case MEDIC_CRATE: - case REPAIR_CRATE: - return IIBlockTypes_MetalDevice.values()[meta].getName(); - } - } - @Nonnull public EnumBlockRenderType getRenderType(IBlockState state) { @@ -109,7 +94,7 @@ public enum IIBlockTypes_MetalDevice implements IITileProviderEnum @IIBlockProperties(category = IICategory.ELECTRONICS) @EnumTileProvider(tile = TileEntityMetalCrate.class) METAL_CRATE, - @IIBlockProperties(category = IICategory.LOGISTICS) + @IIBlockProperties(category = IICategory.LOGISTICS, needsCustomState = true) @EnumTileProvider(tile = TileEntityAmmunitionCrate.class) AMMUNITION_CRATE, @IIBlockProperties(category = IICategory.ELECTRONICS) @@ -130,16 +115,16 @@ public enum IIBlockTypes_MetalDevice implements IITileProviderEnum @IIBlockProperties(category = IICategory.ELECTRONICS) @EnumTileProvider(tile = TileEntityDataMerger.class) DATA_MERGER, - @IIBlockProperties(category = IICategory.LOGISTICS) + @IIBlockProperties(category = IICategory.LOGISTICS, needsCustomState = true) @EnumTileProvider(tile = TileEntityMedicalCrate.class) MEDIC_CRATE, - @IIBlockProperties(category = IICategory.LOGISTICS) + @IIBlockProperties(category = IICategory.LOGISTICS, needsCustomState = true) @EnumTileProvider(tile = TileEntityRepairCrate.class) REPAIR_CRATE, - @IIBlockProperties(category = IICategory.TOOLS) + @IIBlockProperties(category = IICategory.TOOLS, needsCustomState = true) @EnumTileProvider(tile = TileEntityLatexCollector.class) LATEX_COLLECTOR } -} \ No newline at end of file +} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/metal_device/tileentity/TileEntityLatexCollector.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/metal_device/tileentity/TileEntityLatexCollector.java index 1358114bd..e722aa5d8 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/metal_device/tileentity/TileEntityLatexCollector.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/metal_device/tileentity/TileEntityLatexCollector.java @@ -5,6 +5,7 @@ import blusunrize.immersiveengineering.common.blocks.IEBlockInterfaces.IPlayerInteraction; import blusunrize.immersiveengineering.common.blocks.TileEntityIEBase; import net.minecraft.block.state.IBlockState; +import net.minecraft.client.resources.I18n; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; @@ -13,9 +14,15 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.ITickable; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.text.TextFormatting; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandlerItem; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedTextOverlay; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Machines.LatexCollector; import pl.pabilo8.immersiveintelligence.common.IIContent; import pl.pabilo8.immersiveintelligence.common.block.simple.BlockIIRubberLog; @@ -28,7 +35,7 @@ * @author Pabilo8 (pabilo@iiteam.net) * @since 19.05.2021 */ -public class TileEntityLatexCollector extends TileEntityIEBase implements IPlayerInteraction, ITickable, IBlockBounds, IDirectionalTile +public class TileEntityLatexCollector extends TileEntityIEBase implements IPlayerInteraction, ITickable, IBlockBounds, IDirectionalTile, IAdvancedTextOverlay { public EnumFacing facing = EnumFacing.NORTH; public ItemStack bucket = ItemStack.EMPTY; @@ -43,7 +50,7 @@ public void readCustomNBT(NBTTagCompound nbt, boolean descPacket) bucket = new ItemStack(nbt.getCompoundTag("bucket")); if(nbt.hasKey("noSetup")) bucketTime = 0; - this.timer = nbt.getFloat("timer"); // FIX: was writing into NBT, should read from it + this.timer = nbt.getFloat("timer"); } @Override @@ -53,7 +60,7 @@ public void writeCustomNBT(NBTTagCompound nbt, boolean descPacket) nbt.setTag("bucket", bucket.serializeNBT()); if(bucketTime < 10) nbt.setBoolean("noSetup", true); - nbt.setFloat("timer", timer); // FIX: was reading from NBT, should write into it + nbt.setFloat("timer", timer); } /** @@ -226,4 +233,20 @@ public boolean canRotate(EnumFacing axis) { return false; } + + //--- IAdvancedTextOverlay ---// + + @SideOnly(Side.CLIENT) + @Override + public String[] getOverlayText(EntityPlayer player, RayTraceResult mop) + { + int latex = (int)MathHelper.clamp(timer/LatexCollector.collectTime*1000, 0f, 1000f); + if(latex==0) + return new String[]{I18n.format("gui.immersiveengineering.empty")}; + + return new String[]{ + IIContent.fluidLatex.getLocalizedName(new FluidStack(IIContent.fluidLatex, latex)), + TextFormatting.GRAY.toString()+latex+"/1000 mB" + }; + } } diff --git a/src/main/resources/assets/immersiveintelligence/animations/latex_collector/extractor.json b/src/main/resources/assets/immersiveintelligence/animations/latex_collector/extractor.json new file mode 100644 index 000000000..051da927b --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/animations/latex_collector/extractor.json @@ -0,0 +1,17 @@ +{ + "comment": "Made by Pabilo8 with Blockbench", + "groups": { + "extractor": { + "visibility": [ + { + "time": 0, + "visibility": false + }, + { + "time": 1, + "visibility": true + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/animations/latex_collector/place_bucket.json b/src/main/resources/assets/immersiveintelligence/animations/latex_collector/place_bucket.json new file mode 100644 index 000000000..015692ad9 --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/animations/latex_collector/place_bucket.json @@ -0,0 +1,63 @@ +{ + "comment": "Made by Pabilo8 with Blockbench", + "groups": { + "bucket": { + "position": [ + { + "time": 0, + "transform": [0, 8, -14] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "alpha": [ + { + "time": 0, + "alpha": 0.0 + }, + { + "time": 1, + "alpha": 1.0 + } + ], + "visibility": [ + { + "time": 0, + "visibility": false + }, + { + "time": 0.1, + "visibility": true + }, + { + "time": 1.0, + "visibility": true + } + ] + }, + "handle": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [145, 0, 0] + } + ], + "alpha": [ + { + "time": 0, + "alpha": 0.0 + }, + { + "time": 1, + "alpha": 1.0 + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/blockstates/metal_device.json b/src/main/resources/assets/immersiveintelligence/blockstates/metal_device.json index c70366cc3..58fba2294 100644 --- a/src/main/resources/assets/immersiveintelligence/blockstates/metal_device.json +++ b/src/main/resources/assets/immersiveintelligence/blockstates/metal_device.json @@ -23,14 +23,6 @@ } } ], - "inventory,type=ammunition_crate": [ - {} - ], - "inventory,type=latex_collector": [ - { - "model": "immersiveintelligence:metal_device/latex_collector" - } - ], "inventory,type=punchtape_reader": [ { "model": "immersiveintelligence:metal_device/punchtape_reader_flipped.obj", @@ -50,9 +42,6 @@ "all": "immersiveintelligence:blocks/metal_device/data_router" } }, - "latex_collector": { - "model": "immersiveintelligence:metal_device/latex_collector" - }, "punchtape_reader": { "model": "immersiveintelligence:metal_device/punchtape_reader.obj", "custom": { @@ -91,9 +80,7 @@ }, "boolean0": { "false": {}, - "true": { - "model": "immersiveintelligence:metal_device/latex_collector_bucket" - } + "true": {} }, "boolean1": { "false": {}, diff --git a/src/main/resources/assets/immersiveintelligence/blockstates/metal_device/latex_collector.json b/src/main/resources/assets/immersiveintelligence/blockstates/metal_device/latex_collector.json new file mode 100644 index 000000000..db1f19aeb --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/blockstates/metal_device/latex_collector.json @@ -0,0 +1,70 @@ +{ + "forge_marker": 1, + "defaults": { + "transform": "forge:default-block", + "model": "cube_all", + "textures": { + "particle": "immersiveintelligence:blocks/metal_device/latex_collector" + } + }, + "variants": { + "inventory,type=latex_collector": [ + { + "model": "immersiveintelligence:metal_device/latex_collector/latex_collector_inv.obj", + "custom": { + "flip-v": true + } + } + ], + "type": { + "latex_collector": { + "model": "immersiveengineering:smartmodel/connector", + "custom": { + "base": "immersiveintelligence:block/metal_device/latex_collector/latex_collector_base.obj", + "layers": ["CUTOUT_MIPPED"], + "flip-v": true + } + } + }, + "facing": { + "down": {}, + "up": {}, + "north": { + "transform": { + "rotation": { + "y": 180 + } + } + }, + "south": {}, + "west": { + "transform": { + "rotation": { + "y": -90 + } + } + }, + "east": { + "transform": { + "rotation": { + "y": 90 + } + } + } + }, + "boolean0": { + "false": {}, + "true": {} + }, + "boolean1": { + "false": {}, + "true": {} + }, + "_1dynamicrender": { + "false": {}, + "true": { + "model": "immersiveintelligence:metal_device/latex_collector/latex_collector.obj.ie" + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/models/block/metal_device/latex_collector.json b/src/main/resources/assets/immersiveintelligence/models/block/metal_device/latex_collector.json deleted file mode 100644 index 097bd2191..000000000 --- a/src/main/resources/assets/immersiveintelligence/models/block/metal_device/latex_collector.json +++ /dev/null @@ -1,255 +0,0 @@ -{ - "credit": "Made with Blockbench", - "texture_size": [32, 32], - "textures": { - "0": "immersiveintelligence:blocks/metal_device/latex_collector", - "particle": "immersiveintelligence:blocks/metal_device/latex_collector" - }, - "elements": [ - { - "name": "table", - "from": [1, 3, 4], - "to": [15, 4, 16], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [15, 3, 9] - }, - "faces": { - "north": { - "uv": [7, 5.5, 14, 6], - "texture": "#0" - }, - "east": { - "uv": [7, 0, 7.5, 6], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [7, 0, 14, 0.5], - "rotation": 180, - "texture": "#0" - }, - "west": { - "uv": [7, 0, 7.5, 6], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [7, 0, 14, 6], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [7, 6, 14, 0], - "rotation": 180, - "texture": "#0" - } - } - }, - { - "name": "table", - "from": [3, 2, 6], - "to": [5, 3, 16], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [4, 2.5, 11] - }, - "faces": { - "north": { - "uv": [5.5, 3.5, 6.5, 4], - "texture": "#0" - }, - "east": { - "uv": [5.5, 3.5, 6, 8.5], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [5.5, 8, 6.5, 8.5], - "rotation": 180, - "texture": "#0" - }, - "west": { - "uv": [6, 3.5, 6.5, 8.5], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [0, 0, 2, 10], - "rotation": 180, - "texture": "#missing" - }, - "down": { - "uv": [5.5, 3.5, 6.5, 8.5], - "rotation": 180, - "texture": "#0" - } - } - }, - { - "name": "table", - "from": [11, 2, 6], - "to": [13, 3, 16], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [12, 2.5, 11] - }, - "faces": { - "north": { - "uv": [5.5, 3.5, 6.5, 4], - "texture": "#0" - }, - "east": { - "uv": [5.5, 3.5, 6, 8.5], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [5.5, 8, 6.5, 8.5], - "rotation": 180, - "texture": "#0" - }, - "west": { - "uv": [6, 3.5, 6.5, 8.5], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [0, 0, 2, 10], - "rotation": 180, - "texture": "#missing" - }, - "down": { - "uv": [5.5, 3.5, 6.5, 8.5], - "rotation": 180, - "texture": "#0" - } - } - }, - { - "name": "table", - "from": [6, 17, 11], - "to": [10, 18, 18], - "rotation": { - "angle": -22.5, - "axis": "x", - "origin": [8, 16.5, 15.5] - }, - "faces": { - "north": { - "uv": [5, 3, 7, 3.5], - "rotation": 180, - "texture": "#0" - }, - "east": { - "uv": [5, 0, 5.5, 3.5], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [5, 0, 7, 0.5], - "texture": "#0" - }, - "west": { - "uv": [6.5, 0, 7, 3.5], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [5, 0, 7, 3.5], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [5, 0, 7, 3.5], - "texture": "#0" - } - } - }, - { - "name": "table", - "from": [9, 18, 11], - "to": [10, 19, 18], - "rotation": { - "angle": -22.5, - "axis": "x", - "origin": [8, 16.5, 15.5] - }, - "faces": { - "north": { - "uv": [5, 3, 5.5, 3.5], - "rotation": 180, - "texture": "#0" - }, - "east": { - "uv": [5, 0, 5.5, 3.5], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [5, 0, 5.5, 0.5], - "texture": "#0" - }, - "west": { - "uv": [5, 0, 5.5, 3.5], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [5, 0, 5.5, 3.5], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [0, 0, 1, 7], - "rotation": 180, - "texture": "#missing" - } - } - }, - { - "name": "table", - "from": [6, 18, 11], - "to": [7, 19, 18], - "rotation": { - "angle": -22.5, - "axis": "x", - "origin": [8, 16.5, 15.5] - }, - "faces": { - "north": { - "uv": [6.5, 3, 7, 3.5], - "rotation": 180, - "texture": "#0" - }, - "east": { - "uv": [6.5, 0, 7, 3.5], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [6.5, 0, 7, 0.5], - "texture": "#0" - }, - "west": { - "uv": [6.5, 0, 7, 3.5], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [6.5, 0, 7, 3.5], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [0, 0, 1, 7], - "rotation": 180, - "texture": "#missing" - } - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/models/block/metal_device/latex_collector/latex_collector.mtl b/src/main/resources/assets/immersiveintelligence/models/block/metal_device/latex_collector/latex_collector.mtl new file mode 100644 index 000000000..6f70e2d68 --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/models/block/metal_device/latex_collector/latex_collector.mtl @@ -0,0 +1,4 @@ +# Made by Pabilo8 with Blockbench + +newmtl latex_collector +map_Kd immersiveintelligence:blocks/metal_device/latex_collector \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/models/block/metal_device/latex_collector/latex_collector.obj.amt b/src/main/resources/assets/immersiveintelligence/models/block/metal_device/latex_collector/latex_collector.obj.amt new file mode 100644 index 000000000..e889a3e0a --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/models/block/metal_device/latex_collector/latex_collector.obj.amt @@ -0,0 +1,20 @@ +{ + "origins": { + "bucket": [8, 4.65, 9.5], + "handle": [2.5, 15, 9], + "extractor": [14, 17, 17], + "latex": [0, 0, 0] + }, + "hierarchy": { + "handle": "bucket", + "latex": "bucket" + }, + "properties": { + "latex": { + "layers": [ + [6.0, 4.0, 6.0, 8.0, 8.0], + [15.0, 4.0, 6.0, 8.0, 8.0] + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/models/block/metal_device/latex_collector/latex_collector.obj.ie b/src/main/resources/assets/immersiveintelligence/models/block/metal_device/latex_collector/latex_collector.obj.ie new file mode 100644 index 000000000..29701c6e7 --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/models/block/metal_device/latex_collector/latex_collector.obj.ie @@ -0,0 +1,582 @@ +# Made by Pabilo8 with Blockbench +# Exported with IIToolkit Plugin on 15/05/2026 +mtllib latex_collector.mtl + +o bucket +v 0.75 1 0.9375 +v 0.75 1 0.875 +v 0.75 0.3125 0.9375 +v 0.75 0.3125 0.875 +v 0.25 1 0.9375 +v 0.25 1 0.875 +v 0.25 0.3125 0.9375 +v 0.25 0.3125 0.875 +v 0.25 1 0.3125 +v 0.25 0.3125 0.3125 +v 0.1875 1 0.9375 +v 0.1875 1 0.3125 +v 0.1875 0.3125 0.9375 +v 0.1875 0.3125 0.3125 +v 0.8125 1 0.9375 +v 0.8125 1 0.3125 +v 0.8125 0.3125 0.9375 +v 0.8125 0.3125 0.3125 +v 0.75 1 0.3125 +v 0.75 0.3125 0.3125 +v 0.75 1 0.375 +v 0.75 0.3125 0.375 +v 0.25 1 0.375 +v 0.25 0.3125 0.375 +v 0.8125 0.25 0.9375 +v 0.8125 0.25 0.3125 +v 0.1875 0.25 0.9375 +v 0.1875 0.25 0.3125 +vt 0.0313 0.9688 +vt 0.0313 1 +vt 0.2813 1 +vt 0.2813 0.9688 +vt 0.0313 0.6563 +vt 0.0313 1 +vt 0.2813 1 +vt 0.2813 0.6563 +vt 0.2813 0.6563 +vt 0.2813 1 +vt 0.0313 1 +vt 0.0313 0.6563 +vt 0 0.6563 +vt 0 1 +vt 0.3125 1 +vt 0.3125 0.6563 +vt 0.3125 0.6563 +vt 0.3125 1 +vt 0 1 +vt 0 0.6563 +vt 0.3125 1 +vt 0 1 +vt 0 0.9688 +vt 0.3125 0.9688 +vt 0.3125 0.6563 +vt 0.3125 1 +vt 0.2813 1 +vt 0.2813 0.6563 +vt 0.0313 0.6563 +vt 0.0313 1 +vt 0 1 +vt 0 0.6563 +vt 0.3125 0.6563 +vt 0.3125 1 +vt 0 1 +vt 0 0.6563 +vt 0 0.6563 +vt 0 1 +vt 0.3125 1 +vt 0.3125 0.6563 +vt 0 1 +vt 0.3125 1 +vt 0.3125 0.9688 +vt 0 0.9688 +vt 0.0313 0.6563 +vt 0.0313 1 +vt 0 1 +vt 0 0.6563 +vt 0.3125 0.6563 +vt 0.3125 1 +vt 0.2813 1 +vt 0.2813 0.6563 +vt 0.2813 0.9688 +vt 0.2813 1 +vt 0.0313 1 +vt 0.0313 0.9688 +vt 0.2813 0.6563 +vt 0.2813 1 +vt 0.0313 1 +vt 0.0313 0.6563 +vt 0.0313 0.6563 +vt 0.0313 1 +vt 0.2813 1 +vt 0.2813 0.6563 +vt 0 0.625 +vt 0 0.6563 +vt 0.3125 0.6563 +vt 0.3125 0.625 +vt 0.3125 0.625 +vt 0.3125 0.6563 +vt 0 0.6563 +vt 0 0.625 +vt 0.3125 0.3125 +vt 0.3125 0.625 +vt 0 0.625 +vt 0 0.3125 +vt 0.3125 0.3125 +vt 0.3125 0.625 +vt 0 0.625 +vt 0 0.3125 +vt 0 0.625 +vt 0 0.6563 +vt 0.3125 0.6563 +vt 0.3125 0.625 +vt 0.3125 0.625 +vt 0.3125 0.6563 +vt 0 0.6563 +vt 0 0.625 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +usemtl latex_collector +f 1/1/1 2/2/1 6/3/1 5/4/1 +f 3/5/2 1/6/2 5/7/2 7/8/2 +f 8/9/3 6/10/3 2/11/3 4/12/3 +f 10/13/4 9/14/4 5/15/4 7/16/4 +f 13/17/5 11/18/5 12/19/5 14/20/5 +f 5/21/6 9/22/6 12/23/6 11/24/6 +f 7/25/7 5/26/7 11/27/7 13/28/7 +f 14/29/8 12/30/8 9/31/8 10/32/8 +f 18/33/9 16/34/9 15/35/9 17/36/9 +f 3/37/10 1/38/10 19/39/10 20/40/10 +f 15/41/11 16/42/11 19/43/11 1/44/11 +f 17/45/12 15/46/12 1/47/12 3/48/12 +f 20/49/13 19/50/13 16/51/13 18/52/13 +f 21/53/14 19/54/14 9/55/14 23/56/14 +f 22/57/15 21/58/15 23/59/15 24/60/15 +f 10/61/16 9/62/16 19/63/16 20/64/16 +f 26/65/17 18/66/17 17/67/17 25/68/17 +f 27/69/18 13/70/18 14/71/18 28/72/18 +f 17/73/19 18/74/19 14/75/19 13/76/19 +f 26/77/20 25/78/20 27/79/20 28/80/20 +f 25/81/21 17/82/21 13/83/21 27/84/21 +f 28/85/22 14/86/22 18/87/22 26/88/22 +o handle +v 0.1875 1.4688 0.5938 +v 0.1875 0.9063 0.5938 +v 0.1875 1.4688 0.6563 +v 0.1875 0.9063 0.6563 +v 0.125 1.4688 0.5938 +v 0.125 0.9063 0.5938 +v 0.125 1.4688 0.6563 +v 0.125 0.9063 0.6563 +v 0.875 1.4688 0.5938 +v 0.875 0.9063 0.5938 +v 0.875 1.4688 0.6563 +v 0.875 0.9063 0.6563 +v 0.8125 1.4688 0.5938 +v 0.8125 0.9063 0.5938 +v 0.8125 1.4688 0.6563 +v 0.8125 0.9063 0.6563 +v 0.8125 1.5 0.5625 +v 0.8125 1.375 0.5625 +v 0.8125 1.5 0.6875 +v 0.8125 1.375 0.6875 +v 0.1875 1.5 0.5625 +v 0.1875 1.375 0.5625 +v 0.1875 1.5 0.6875 +v 0.1875 1.375 0.6875 +vt 0.3438 0.6563 +vt 0.3125 0.6563 +vt 0.3125 0.3125 +vt 0.3438 0.3125 +vt 0.3125 0.3125 +vt 0.3438 0.3125 +vt 0.3438 0.6563 +vt 0.3125 0.6563 +vt 0.3438 0.3125 +vt 0.3438 0.6563 +vt 0.3125 0.6563 +vt 0.3125 0.3125 +vt 0.3125 0.6563 +vt 0.3125 0.3125 +vt 0.3438 0.3125 +vt 0.3438 0.6563 +vt 0.3438 0.3125 +vt 0.3438 0.3438 +vt 0.3125 0.3438 +vt 0.3125 0.3125 +vt 0.3438 0.625 +vt 0.3438 0.6563 +vt 0.3125 0.6563 +vt 0.3125 0.625 +vt 0.3438 0.6563 +vt 0.3125 0.6563 +vt 0.3125 0.3125 +vt 0.3438 0.3125 +vt 0.3125 0.3125 +vt 0.3438 0.3125 +vt 0.3438 0.6563 +vt 0.3125 0.6563 +vt 0.3438 0.3125 +vt 0.3438 0.6563 +vt 0.3125 0.6563 +vt 0.3125 0.3125 +vt 0.3125 0.6563 +vt 0.3125 0.3125 +vt 0.3438 0.3125 +vt 0.3438 0.6563 +vt 0.3438 0.3125 +vt 0.3438 0.3438 +vt 0.3125 0.3438 +vt 0.3125 0.3125 +vt 0.3438 0.625 +vt 0.3438 0.6563 +vt 0.3125 0.6563 +vt 0.3125 0.625 +vt 0.375 0.25 +vt 0.375 0.3125 +vt 0.3125 0.3125 +vt 0.3125 0.25 +vt 0.3125 0.3125 +vt 0.3125 0.25 +vt 0.375 0.25 +vt 0.375 0.3125 +vt 0.3125 0.3125 +vt 0.3125 0.25 +vt 0 0.25 +vt 0 0.3125 +vt 0.3125 0.3125 +vt 0.3125 0.25 +vt 0 0.25 +vt 0 0.3125 +vt 0.3125 0.25 +vt 0.3125 0.3125 +vt 0 0.3125 +vt 0 0.25 +vt 0 0.25 +vt 0 0.3125 +vt 0.3125 0.3125 +vt 0.3125 0.25 +vn 1 0 0 +vn -1 0 0 +vn 0 0 -1 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 0 -1 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 0 -1 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 +usemtl latex_collector +f 32/89/23 30/90/23 29/91/23 31/92/23 +f 35/93/24 33/94/24 34/95/24 36/96/24 +f 29/97/25 30/98/25 34/99/25 33/100/25 +f 32/101/26 31/102/26 35/103/26 36/104/26 +f 31/105/27 29/106/27 33/107/27 35/108/27 +f 36/109/28 34/110/28 30/111/28 32/112/28 +f 40/113/29 38/114/29 37/115/29 39/116/29 +f 43/117/30 41/118/30 42/119/30 44/120/30 +f 37/121/31 38/122/31 42/123/31 41/124/31 +f 40/125/32 39/126/32 43/127/32 44/128/32 +f 39/129/33 37/130/33 41/131/33 43/132/33 +f 44/133/34 42/134/34 38/135/34 40/136/34 +f 48/137/35 46/138/35 45/139/35 47/140/35 +f 51/141/36 49/142/36 50/143/36 52/144/36 +f 45/145/37 46/146/37 50/147/37 49/148/37 +f 48/149/38 47/150/38 51/151/38 52/152/38 +f 47/153/39 45/154/39 49/155/39 51/156/39 +f 52/157/40 50/158/40 46/159/40 48/160/40 +o extractor +v -0.0312 1.125 0.9688 +v -0.0312 1.1875 2.0313 +v -0.0312 0.9375 0.9688 +v -0.0312 1 2.0313 +v 1.0313 1.125 0.9688 +v 1.0313 1.1875 2.0313 +v 1.0313 0.9375 0.9688 +v 1.0313 1 2.0313 +v 0.8864 1.117 1.2813 +v 0.8864 1.117 1.4063 +v 0.9081 0.9939 1.2813 +v 0.9081 0.9939 1.4063 +v 1.0711 1.1496 1.2813 +v 1.0711 1.1496 1.4063 +v 1.0928 1.0265 1.2813 +v 1.0928 1.0265 1.4063 +v 0.1136 1.117 1.7813 +v 0.1136 1.117 1.9063 +v 0.0919 0.9939 1.7813 +v 0.0919 0.9939 1.9063 +v -0.0711 1.1496 1.7813 +v -0.0711 1.1496 1.9063 +v -0.0928 1.0265 1.7813 +v -0.0928 1.0265 1.9063 +v 0.5722 1.172 1.9266 +v 0.6934 1.1506 1.9049 +v 0.5471 1.0514 1.9052 +v 0.6683 1.03 1.8835 +v 0.5981 1.1343 2.1085 +v 0.7193 1.113 2.0868 +v 0.573 1.0138 2.0871 +v 0.6943 0.9924 2.0654 +v 0.375 1.068 0.6491 +v 0.375 1.2354 1.0533 +v 0.375 1.0102 0.673 +v 0.375 1.1777 1.0772 +v 0.4375 1.068 0.6491 +v 0.4375 1.2354 1.0533 +v 0.4375 1.0102 0.673 +v 0.4375 1.1777 1.0772 +v 0.375 0.9525 0.697 +v 0.375 1.1199 1.1011 +v 0.625 1.0102 0.673 +v 0.625 1.1777 1.0772 +v 0.625 0.9525 0.697 +v 0.625 1.1199 1.1011 +v 0.5625 1.068 0.6491 +v 0.5625 1.2354 1.0533 +v 0.5625 1.0102 0.673 +v 0.5625 1.1777 1.0772 +v 0.625 1.068 0.6491 +v 0.625 1.2354 1.0533 +vt 0.5313 0.0313 +vt 0.5313 0.125 +vt 0 0.125 +vt 0 0.0313 +vt 0.5313 0.0313 +vt 0.5313 0.125 +vt 0 0.125 +vt 0 0.0313 +vt 0.5313 0.0313 +vt 0.5313 0.125 +vt 0 0.125 +vt 0 0.0313 +vt 0.5313 0.0313 +vt 0.5313 0.125 +vt 0 0.125 +vt 0 0.0313 +vt 0.5938 0.1875 +vt 0.5938 0.25 +vt 0.5313 0.25 +vt 0.5313 0.1875 +vt 0.5938 0.1875 +vt 0.5938 0.25 +vt 0.5313 0.25 +vt 0.5313 0.1875 +vt 0.6875 0.0938 +vt 0.625 0.0938 +vt 0.625 0.1875 +vt 0.6875 0.1875 +vt 0.5313 0.0938 +vt 0.5938 0.0938 +vt 0.5938 0.1875 +vt 0.5313 0.1875 +vt 0.5625 0.0938 +vt 0.625 0.0938 +vt 0.625 0.1875 +vt 0.5625 0.1875 +vt 0.5938 0.1875 +vt 0.6563 0.1875 +vt 0.6563 0.0938 +vt 0.5938 0.0938 +vt 0.5313 0.25 +vt 0.5938 0.25 +vt 0.5938 0.1875 +vt 0.5313 0.1875 +vt 0.5313 0.25 +vt 0.5938 0.25 +vt 0.5938 0.1875 +vt 0.5313 0.1875 +vt 0.625 0.1875 +vt 0.625 0.0938 +vt 0.6875 0.0938 +vt 0.6875 0.1875 +vt 0.5938 0.1875 +vt 0.5938 0.0938 +vt 0.5313 0.0938 +vt 0.5313 0.1875 +vt 0.625 0.1875 +vt 0.625 0.0938 +vt 0.5625 0.0938 +vt 0.5625 0.1875 +vt 0.6563 0.0938 +vt 0.6563 0.1875 +vt 0.5938 0.1875 +vt 0.5938 0.0938 +vt 0.5313 0.25 +vt 0.5938 0.25 +vt 0.5938 0.1875 +vt 0.5313 0.1875 +vt 0.5313 0.25 +vt 0.5938 0.25 +vt 0.5938 0.1875 +vt 0.5313 0.1875 +vt 0.625 0.1875 +vt 0.625 0.0938 +vt 0.6875 0.0938 +vt 0.6875 0.1875 +vt 0.5938 0.1875 +vt 0.5938 0.0938 +vt 0.5313 0.0938 +vt 0.5313 0.1875 +vt 0.625 0.1875 +vt 0.625 0.0938 +vt 0.5625 0.0938 +vt 0.5625 0.1875 +vt 0.6563 0.0938 +vt 0.6563 0.1875 +vt 0.5938 0.1875 +vt 0.5938 0.0938 +vt 0.4375 1 +vt 0.4063 1 +vt 0.4063 0.7813 +vt 0.4375 0.7813 +vt 0.4063 0.7813 +vt 0.4375 0.7813 +vt 0.4375 1 +vt 0.4063 1 +vt 0.4375 0.7813 +vt 0.4375 1 +vt 0.4063 1 +vt 0.4063 0.7813 +vt 0.4063 0.8125 +vt 0.4063 0.7813 +vt 0.4375 0.7813 +vt 0.4375 0.8125 +vt 0.4375 0.9688 +vt 0.4375 1 +vt 0.4063 1 +vt 0.4063 0.9688 +vt 0.4375 1 +vt 0.4063 1 +vt 0.4063 0.7813 +vt 0.4375 0.7813 +vt 0.3125 0.7813 +vt 0.3438 0.7813 +vt 0.3438 1 +vt 0.3125 1 +vt 0.4375 0.7813 +vt 0.4375 1 +vt 0.3125 1 +vt 0.3125 0.7813 +vt 0.3125 1 +vt 0.3125 0.7813 +vt 0.4375 0.7813 +vt 0.4375 1 +vt 0.3125 0.8125 +vt 0.3125 0.7813 +vt 0.4375 0.7813 +vt 0.4375 0.8125 +vt 0.4375 0.9688 +vt 0.4375 1 +vt 0.3125 1 +vt 0.3125 0.9688 +vt 0.3438 1 +vt 0.3125 1 +vt 0.3125 0.7813 +vt 0.3438 0.7813 +vt 0.3125 0.7813 +vt 0.3438 0.7813 +vt 0.3438 1 +vt 0.3125 1 +vt 0.3438 0.7813 +vt 0.3438 1 +vt 0.3125 1 +vt 0.3125 0.7813 +vt 0.3125 0.8125 +vt 0.3125 0.7813 +vt 0.3438 0.7813 +vt 0.3438 0.8125 +vt 0.3438 0.9688 +vt 0.3438 1 +vt 0.3125 1 +vt 0.3125 0.9688 +vn -1 0 0 +vn 1 0 0 +vn 0 0 -1 +vn 0 0 1 +vn -0.98 -0.17 0 +vn 0.98 0.17 0 +vn -0.17 0.98 0 +vn 0.17 -0.98 0 +vn 0 0 -1 +vn 0 0 1 +vn 0.98 -0.17 0 +vn -0.98 0.17 0 +vn 0.17 0.98 0 +vn -0.17 -0.98 0 +vn 0 0 -1 +vn 0 0 1 +vn -0.14 0.2 -0.97 +vn 0.14 -0.2 0.97 +vn 0.2 0.96 0.17 +vn -0.2 -0.96 -0.17 +vn -0.97 0.17 0.17 +vn 0.97 -0.17 -0.17 +vn -1 0 0 +vn 1 0 0 +vn 0 0.92 -0.38 +vn 0 -0.38 -0.92 +vn 0 0.38 0.92 +vn -1 0 0 +vn 1 0 0 +vn 0 0.92 -0.38 +vn 0 -0.92 0.38 +vn 0 -0.38 -0.92 +vn 0 0.38 0.92 +vn -1 0 0 +vn 1 0 0 +vn 0 0.92 -0.38 +vn 0 -0.38 -0.92 +vn 0 0.38 0.92 +usemtl latex_collector +f 56/161/41 54/162/41 53/163/41 55/164/41 +f 59/165/42 57/166/42 58/167/42 60/168/42 +f 55/169/43 53/170/43 57/171/43 59/172/43 +f 60/173/44 58/174/44 54/175/44 56/176/44 +f 64/177/45 62/178/45 61/179/45 63/180/45 +f 67/181/46 65/182/46 66/183/46 68/184/46 +f 61/185/47 62/186/47 66/187/47 65/188/47 +f 64/189/48 63/190/48 67/191/48 68/192/48 +f 63/193/49 61/194/49 65/195/49 67/196/49 +f 68/197/50 66/198/50 62/199/50 64/200/50 +f 69/201/51 70/202/51 72/203/51 71/204/51 +f 74/205/52 73/206/52 75/207/52 76/208/52 +f 74/209/53 70/210/53 69/211/53 73/212/53 +f 75/213/54 71/214/54 72/215/54 76/216/54 +f 73/217/55 69/218/55 71/219/55 75/220/55 +f 70/221/56 74/222/56 76/223/56 72/224/56 +f 77/225/57 78/226/57 80/227/57 79/228/57 +f 82/229/58 81/230/58 83/231/58 84/232/58 +f 82/233/59 78/234/59 77/235/59 81/236/59 +f 83/237/60 79/238/60 80/239/60 84/240/60 +f 81/241/61 77/242/61 79/243/61 83/244/61 +f 78/245/62 82/246/62 84/247/62 80/248/62 +f 88/249/63 86/250/63 85/251/63 87/252/63 +f 91/253/64 89/254/64 90/255/64 92/256/64 +f 85/257/65 86/258/65 90/259/65 89/260/65 +f 87/261/66 85/262/66 89/263/66 91/264/66 +f 92/265/67 90/266/67 86/267/67 88/268/67 +f 94/269/68 88/270/68 87/271/68 93/272/68 +f 97/273/69 95/274/69 96/275/69 98/276/69 +f 87/277/70 88/278/70 96/279/70 95/280/70 +f 94/281/71 93/282/71 97/283/71 98/284/71 +f 93/285/72 87/286/72 95/287/72 97/288/72 +f 98/289/73 96/290/73 88/291/73 94/292/73 +f 102/293/74 100/294/74 99/295/74 101/296/74 +f 95/297/75 103/298/75 104/299/75 96/300/75 +f 99/301/76 100/302/76 104/303/76 103/304/76 +f 101/305/77 99/306/77 103/307/77 95/308/77 +f 96/309/78 104/310/78 100/311/78 102/312/78 \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/models/block/metal_device/latex_collector/latex_collector_base.obj b/src/main/resources/assets/immersiveintelligence/models/block/metal_device/latex_collector/latex_collector_base.obj new file mode 100644 index 000000000..1980edc9b --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/models/block/metal_device/latex_collector/latex_collector_base.obj @@ -0,0 +1,126 @@ +# Made by Pabilo8 with Blockbench +# Exported with IIToolkit Plugin on 15/05/2026 +mtllib latex_collector.mtl + +o base +v 0.9375 0.25 1 +v 0.9375 0.25 0.25 +v 0.9375 0.1875 1 +v 0.9375 0.1875 0.25 +v 0.0625 0.25 1 +v 0.0625 0.25 0.25 +v 0.0625 0.1875 1 +v 0.0625 0.1875 0.25 +v 0.8125 0.1875 0.875 +v 0.8125 0.1875 0.25 +v 0.8125 0.125 0.875 +v 0.8125 0.125 0.25 +v 0.6875 0.1875 0.875 +v 0.6875 0.1875 0.25 +v 0.6875 0.125 0.875 +v 0.6875 0.125 0.25 +v 0.3125 0.1875 0.875 +v 0.3125 0.1875 0.25 +v 0.3125 0.125 0.875 +v 0.3125 0.125 0.25 +v 0.1875 0.1875 0.875 +v 0.1875 0.1875 0.25 +v 0.1875 0.125 0.875 +v 0.1875 0.125 0.25 +vt 0.4688 1 +vt 0.4375 1 +vt 0.4375 0.625 +vt 0.4688 0.625 +vt 0.4375 0.625 +vt 0.4688 0.625 +vt 0.4688 1 +vt 0.4375 1 +vt 0.875 0.625 +vt 0.875 1 +vt 0.4375 1 +vt 0.4375 0.625 +vt 0.875 1 +vt 0.875 0.625 +vt 0.4375 0.625 +vt 0.4375 1 +vt 0.875 0.625 +vt 0.875 0.6563 +vt 0.4375 0.6563 +vt 0.4375 0.625 +vt 0.4375 1 +vt 0.4375 0.9688 +vt 0.875 0.9688 +vt 0.875 1 +vt 0.4063 0.7813 +vt 0.375 0.7813 +vt 0.375 0.4688 +vt 0.4063 0.4688 +vt 0.3438 0.4688 +vt 0.375 0.4688 +vt 0.375 0.7813 +vt 0.3438 0.7813 +vt 0.4063 0.4688 +vt 0.4063 0.7813 +vt 0.3438 0.7813 +vt 0.3438 0.4688 +vt 0.4063 0.75 +vt 0.4063 0.7813 +vt 0.3438 0.7813 +vt 0.3438 0.75 +vt 0.3438 0.5 +vt 0.3438 0.4688 +vt 0.4063 0.4688 +vt 0.4063 0.5 +vt 0.4063 0.7813 +vt 0.375 0.7813 +vt 0.375 0.4688 +vt 0.4063 0.4688 +vt 0.3438 0.4688 +vt 0.375 0.4688 +vt 0.375 0.7813 +vt 0.3438 0.7813 +vt 0.4063 0.4688 +vt 0.4063 0.7813 +vt 0.3438 0.7813 +vt 0.3438 0.4688 +vt 0.4063 0.75 +vt 0.4063 0.7813 +vt 0.3438 0.7813 +vt 0.3438 0.75 +vt 0.3438 0.5 +vt 0.3438 0.4688 +vt 0.4063 0.4688 +vt 0.4063 0.5 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +usemtl latex_collector +f 4/1/1 2/2/1 1/3/1 3/4/1 +f 7/5/2 5/6/2 6/7/2 8/8/2 +f 1/9/3 2/10/3 6/11/3 5/12/3 +f 4/13/4 3/14/4 7/15/4 8/16/4 +f 3/17/5 1/18/5 5/19/5 7/20/5 +f 8/21/6 6/22/6 2/23/6 4/24/6 +f 12/25/7 10/26/7 9/27/7 11/28/7 +f 15/29/8 13/30/8 14/31/8 16/32/8 +f 12/33/9 11/34/9 15/35/9 16/36/9 +f 11/37/10 9/38/10 13/39/10 15/40/10 +f 16/41/11 14/42/11 10/43/11 12/44/11 +f 20/45/12 18/46/12 17/47/12 19/48/12 +f 23/49/13 21/50/13 22/51/13 24/52/13 +f 20/53/14 19/54/14 23/55/14 24/56/14 +f 19/57/15 17/58/15 21/59/15 23/60/15 +f 24/61/16 22/62/16 18/63/16 20/64/16 \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/models/block/metal_device/latex_collector/latex_collector_inv.obj b/src/main/resources/assets/immersiveintelligence/models/block/metal_device/latex_collector/latex_collector_inv.obj new file mode 100644 index 000000000..01681c3eb --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/models/block/metal_device/latex_collector/latex_collector_inv.obj @@ -0,0 +1,440 @@ +# Made by Pabilo8 with Blockbench +# Exported with IIToolkit Plugin on 15/05/2026 +mtllib latex_collector.mtl + +o base +v 0.9375 0.25 1 +v 0.9375 0.25 0.25 +v 0.9375 0.1875 1 +v 0.9375 0.1875 0.25 +v 0.0625 0.25 1 +v 0.0625 0.25 0.25 +v 0.0625 0.1875 1 +v 0.0625 0.1875 0.25 +v 0.8125 0.1875 0.875 +v 0.8125 0.1875 0.25 +v 0.8125 0.125 0.875 +v 0.8125 0.125 0.25 +v 0.6875 0.1875 0.875 +v 0.6875 0.1875 0.25 +v 0.6875 0.125 0.875 +v 0.6875 0.125 0.25 +v 0.3125 0.1875 0.875 +v 0.3125 0.1875 0.25 +v 0.3125 0.125 0.875 +v 0.3125 0.125 0.25 +v 0.1875 0.1875 0.875 +v 0.1875 0.1875 0.25 +v 0.1875 0.125 0.875 +v 0.1875 0.125 0.25 +vt 0.4688 1 +vt 0.4375 1 +vt 0.4375 0.625 +vt 0.4688 0.625 +vt 0.4375 0.625 +vt 0.4688 0.625 +vt 0.4688 1 +vt 0.4375 1 +vt 0.875 0.625 +vt 0.875 1 +vt 0.4375 1 +vt 0.4375 0.625 +vt 0.875 1 +vt 0.875 0.625 +vt 0.4375 0.625 +vt 0.4375 1 +vt 0.875 0.625 +vt 0.875 0.6563 +vt 0.4375 0.6563 +vt 0.4375 0.625 +vt 0.4375 1 +vt 0.4375 0.9688 +vt 0.875 0.9688 +vt 0.875 1 +vt 0.4063 0.7813 +vt 0.375 0.7813 +vt 0.375 0.4688 +vt 0.4063 0.4688 +vt 0.3438 0.4688 +vt 0.375 0.4688 +vt 0.375 0.7813 +vt 0.3438 0.7813 +vt 0.4063 0.4688 +vt 0.4063 0.7813 +vt 0.3438 0.7813 +vt 0.3438 0.4688 +vt 0.4063 0.75 +vt 0.4063 0.7813 +vt 0.3438 0.7813 +vt 0.3438 0.75 +vt 0.3438 0.5 +vt 0.3438 0.4688 +vt 0.4063 0.4688 +vt 0.4063 0.5 +vt 0.4063 0.7813 +vt 0.375 0.7813 +vt 0.375 0.4688 +vt 0.4063 0.4688 +vt 0.3438 0.4688 +vt 0.375 0.4688 +vt 0.375 0.7813 +vt 0.3438 0.7813 +vt 0.4063 0.4688 +vt 0.4063 0.7813 +vt 0.3438 0.7813 +vt 0.3438 0.4688 +vt 0.4063 0.75 +vt 0.4063 0.7813 +vt 0.3438 0.7813 +vt 0.3438 0.75 +vt 0.3438 0.5 +vt 0.3438 0.4688 +vt 0.4063 0.4688 +vt 0.4063 0.5 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +usemtl latex_collector +f 4/1/1 2/2/1 1/3/1 3/4/1 +f 7/5/2 5/6/2 6/7/2 8/8/2 +f 1/9/3 2/10/3 6/11/3 5/12/3 +f 4/13/4 3/14/4 7/15/4 8/16/4 +f 3/17/5 1/18/5 5/19/5 7/20/5 +f 8/21/6 6/22/6 2/23/6 4/24/6 +f 12/25/7 10/26/7 9/27/7 11/28/7 +f 15/29/8 13/30/8 14/31/8 16/32/8 +f 12/33/9 11/34/9 15/35/9 16/36/9 +f 11/37/10 9/38/10 13/39/10 15/40/10 +f 16/41/11 14/42/11 10/43/11 12/44/11 +f 20/45/12 18/46/12 17/47/12 19/48/12 +f 23/49/13 21/50/13 22/51/13 24/52/13 +f 20/53/14 19/54/14 23/55/14 24/56/14 +f 19/57/15 17/58/15 21/59/15 23/60/15 +f 24/61/16 22/62/16 18/63/16 20/64/16 +o item +v 0.1522 0.4374 0.2813 +v 0.1522 0.4374 0.9688 +v 0.1603 0.2501 0.2813 +v 0.1603 0.2501 0.9688 +v 0.8438 0.4375 0.2813 +v 0.8438 0.4375 0.9688 +v 0.8438 0.25 0.2813 +v 0.8438 0.25 0.9688 +v 0.6583 0.3062 0.3438 +v 0.6583 0.3062 0.4688 +v 0.7803 0.2792 0.3438 +v 0.7803 0.2792 0.4688 +v 0.6989 0.4893 0.3438 +v 0.6989 0.4893 0.4688 +v 0.8209 0.4622 0.3438 +v 0.8209 0.4622 0.4688 +v 0.4261 0.367 0.7813 +v 0.4261 0.367 0.9063 +v 0.4044 0.2439 0.7813 +v 0.4044 0.2439 0.9063 +v 0.2414 0.3996 0.7813 +v 0.2414 0.3996 0.9063 +v 0.2197 0.2765 0.7813 +v 0.2197 0.2765 0.9063 +v 0.6347 0.3595 0.7391 +v 0.7559 0.3381 0.7174 +v 0.6096 0.2389 0.7177 +v 0.7308 0.2175 0.696 +v 0.6606 0.3218 0.921 +v 0.7818 0.3005 0.8993 +v 0.6355 0.2013 0.8996 +v 0.7568 0.1799 0.8779 +v 0.1756 0.2501 0.2969 +v 0.1678 0.4374 0.2969 +v 0.8281 0.4375 0.2969 +v 0.8281 0.25 0.2969 +v 0.1756 0.2501 0.9531 +v 0.1678 0.4374 0.9531 +v 0.8281 0.25 0.9531 +v 0.8281 0.4375 0.9531 +v 0.375 0.415 0.3415 +v 0.375 0.3959 0.7786 +v 0.375 0.3525 0.3388 +v 0.375 0.3335 0.7758 +v 0.4375 0.415 0.3415 +v 0.4375 0.3959 0.7786 +v 0.4375 0.3525 0.3388 +v 0.4375 0.3335 0.7758 +v 0.375 0.2901 0.336 +v 0.375 0.271 0.7731 +v 0.625 0.3525 0.3388 +v 0.625 0.3335 0.7758 +v 0.625 0.2901 0.336 +v 0.625 0.271 0.7731 +v 0.5625 0.415 0.3415 +v 0.5625 0.3959 0.7786 +v 0.5625 0.3525 0.3388 +v 0.5625 0.3335 0.7758 +v 0.625 0.415 0.3415 +v 0.625 0.3959 0.7786 +vt 0.375 0.0313 +vt 0.375 0.125 +vt 0 0.125 +vt 0 0.0313 +vt 0.375 0.0313 +vt 0.375 0.125 +vt 0 0.125 +vt 0 0.0313 +vt 0.375 0.0313 +vt 0.375 0.125 +vt 0 0.125 +vt 0 0.0313 +vt 0.375 0.0313 +vt 0.375 0.125 +vt 0 0.125 +vt 0 0.0313 +vt 0.5938 0.1875 +vt 0.5938 0.25 +vt 0.5313 0.25 +vt 0.5313 0.1875 +vt 0.5938 0.1875 +vt 0.5938 0.25 +vt 0.5313 0.25 +vt 0.5313 0.1875 +vt 0.6875 0.0938 +vt 0.625 0.0938 +vt 0.625 0.1875 +vt 0.6875 0.1875 +vt 0.5313 0.0938 +vt 0.5938 0.0938 +vt 0.5938 0.1875 +vt 0.5313 0.1875 +vt 0.5625 0.0938 +vt 0.625 0.0938 +vt 0.625 0.1875 +vt 0.5625 0.1875 +vt 0.5938 0.1875 +vt 0.6563 0.1875 +vt 0.6563 0.0938 +vt 0.5938 0.0938 +vt 0.5313 0.25 +vt 0.5938 0.25 +vt 0.5938 0.1875 +vt 0.5313 0.1875 +vt 0.5313 0.25 +vt 0.5938 0.25 +vt 0.5938 0.1875 +vt 0.5313 0.1875 +vt 0.625 0.1875 +vt 0.625 0.0938 +vt 0.6875 0.0938 +vt 0.6875 0.1875 +vt 0.5938 0.1875 +vt 0.5938 0.0938 +vt 0.5313 0.0938 +vt 0.5313 0.1875 +vt 0.625 0.1875 +vt 0.625 0.0938 +vt 0.5625 0.0938 +vt 0.5625 0.1875 +vt 0.6563 0.0938 +vt 0.6563 0.1875 +vt 0.5938 0.1875 +vt 0.5938 0.0938 +vt 0.5313 0.25 +vt 0.5938 0.25 +vt 0.5938 0.1875 +vt 0.5313 0.1875 +vt 0.5313 0.25 +vt 0.5938 0.25 +vt 0.5938 0.1875 +vt 0.5313 0.1875 +vt 0.625 0.1875 +vt 0.625 0.0938 +vt 0.6875 0.0938 +vt 0.6875 0.1875 +vt 0.5938 0.1875 +vt 0.5938 0.0938 +vt 0.5313 0.0938 +vt 0.5313 0.1875 +vt 0.625 0.1875 +vt 0.625 0.0938 +vt 0.5625 0.0938 +vt 0.5625 0.1875 +vt 0.6563 0.0938 +vt 0.6563 0.1875 +vt 0.5938 0.1875 +vt 0.5938 0.0938 +vt 0 0.125 +vt 0.375 0.125 +vt 0.375 0.0313 +vt 0 0.0313 +vt 0 0.125 +vt 0.375 0.125 +vt 0.375 0.0313 +vt 0 0.0313 +vt 0 0.125 +vt 0.375 0.125 +vt 0.375 0.0313 +vt 0 0.0313 +vt 0 0.125 +vt 0.375 0.125 +vt 0.375 0.0313 +vt 0 0.0313 +vt 0.4375 1 +vt 0.4063 1 +vt 0.4063 0.7813 +vt 0.4375 0.7813 +vt 0.4063 0.7813 +vt 0.4375 0.7813 +vt 0.4375 1 +vt 0.4063 1 +vt 0.4375 0.7813 +vt 0.4375 1 +vt 0.4063 1 +vt 0.4063 0.7813 +vt 0.4063 0.8125 +vt 0.4063 0.7813 +vt 0.4375 0.7813 +vt 0.4375 0.8125 +vt 0.4375 0.9688 +vt 0.4375 1 +vt 0.4063 1 +vt 0.4063 0.9688 +vt 0.4375 1 +vt 0.4063 1 +vt 0.4063 0.7813 +vt 0.4375 0.7813 +vt 0.3125 0.7813 +vt 0.3438 0.7813 +vt 0.3438 1 +vt 0.3125 1 +vt 0.4375 0.7813 +vt 0.4375 1 +vt 0.3125 1 +vt 0.3125 0.7813 +vt 0.3125 1 +vt 0.3125 0.7813 +vt 0.4375 0.7813 +vt 0.4375 1 +vt 0.3125 0.8125 +vt 0.3125 0.7813 +vt 0.4375 0.7813 +vt 0.4375 0.8125 +vt 0.4375 0.9688 +vt 0.4375 1 +vt 0.3125 1 +vt 0.3125 0.9688 +vt 0.3438 1 +vt 0.3125 1 +vt 0.3125 0.7813 +vt 0.3438 0.7813 +vt 0.3125 0.7813 +vt 0.3438 0.7813 +vt 0.3438 1 +vt 0.3125 1 +vt 0.3438 0.7813 +vt 0.3438 1 +vt 0.3125 1 +vt 0.3125 0.7813 +vt 0.3125 0.8125 +vt 0.3125 0.7813 +vt 0.3438 0.7813 +vt 0.3438 0.8125 +vt 0.3438 0.9688 +vt 0.3438 1 +vt 0.3125 1 +vt 0.3125 0.9688 +vn -1 -0.04 0 +vn 1 0 0 +vn 0 0 -1 +vn 0 0 1 +vn -0.22 -0.98 0 +vn 0.22 0.98 0 +vn -0.98 0.22 0 +vn 0.98 -0.22 0 +vn 0 0 -1 +vn 0 0 1 +vn 0.98 -0.17 0 +vn -0.98 0.17 0 +vn 0.17 0.98 0 +vn -0.17 -0.98 0 +vn 0 0 -1 +vn 0 0 1 +vn -0.14 0.2 -0.97 +vn 0.14 -0.2 0.97 +vn 0.2 0.96 0.17 +vn -0.2 -0.96 -0.17 +vn -0.97 0.17 0.17 +vn 0.97 -0.17 -0.17 +vn 1 0.04 0 +vn -1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0.04 +vn 0 0.04 -1 +vn 0 -0.04 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0.04 +vn 0 -1 -0.04 +vn 0 0.04 -1 +vn 0 -0.04 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0.04 +vn 0 0.04 -1 +vn 0 -0.04 1 +usemtl latex_collector +f 28/65/17 26/66/17 25/67/17 27/68/17 +f 31/69/18 29/70/18 30/71/18 32/72/18 +f 27/73/19 25/74/19 29/75/19 31/76/19 +f 32/77/20 30/78/20 26/79/20 28/80/20 +f 36/81/21 34/82/21 33/83/21 35/84/21 +f 39/85/22 37/86/22 38/87/22 40/88/22 +f 33/89/23 34/90/23 38/91/23 37/92/23 +f 36/93/24 35/94/24 39/95/24 40/96/24 +f 35/97/25 33/98/25 37/99/25 39/100/25 +f 40/101/26 38/102/26 34/103/26 36/104/26 +f 41/105/27 42/106/27 44/107/27 43/108/27 +f 46/109/28 45/110/28 47/111/28 48/112/28 +f 46/113/29 42/114/29 41/115/29 45/116/29 +f 47/117/30 43/118/30 44/119/30 48/120/30 +f 45/121/31 41/122/31 43/123/31 47/124/31 +f 42/125/32 46/126/32 48/127/32 44/128/32 +f 49/129/33 50/130/33 52/131/33 51/132/33 +f 54/133/34 53/134/34 55/135/34 56/136/34 +f 54/137/35 50/138/35 49/139/35 53/140/35 +f 55/141/36 51/142/36 52/143/36 56/144/36 +f 53/145/37 49/146/37 51/147/37 55/148/37 +f 50/149/38 54/150/38 56/151/38 52/152/38 +f 58/153/39 62/154/39 61/155/39 57/156/39 +f 64/157/40 59/158/40 60/159/40 63/160/40 +f 59/161/41 58/162/41 57/163/41 60/164/41 +f 62/165/42 64/166/42 63/167/42 61/168/42 +f 68/169/43 66/170/43 65/171/43 67/172/43 +f 71/173/44 69/174/44 70/175/44 72/176/44 +f 65/177/45 66/178/45 70/179/45 69/180/45 +f 67/181/46 65/182/46 69/183/46 71/184/46 +f 72/185/47 70/186/47 66/187/47 68/188/47 +f 74/189/48 68/190/48 67/191/48 73/192/48 +f 77/193/49 75/194/49 76/195/49 78/196/49 +f 67/197/50 68/198/50 76/199/50 75/200/50 +f 74/201/51 73/202/51 77/203/51 78/204/51 +f 73/205/52 67/206/52 75/207/52 77/208/52 +f 78/209/53 76/210/53 68/211/53 74/212/53 +f 82/213/54 80/214/54 79/215/54 81/216/54 +f 75/217/55 83/218/55 84/219/55 76/220/55 +f 79/221/56 80/222/56 84/223/56 83/224/56 +f 81/225/57 79/226/57 83/227/57 75/228/57 +f 76/229/58 84/230/58 80/231/58 82/232/58 \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/models/block/metal_device/latex_collector_bucket.json b/src/main/resources/assets/immersiveintelligence/models/block/metal_device/latex_collector_bucket.json deleted file mode 100644 index 87624484b..000000000 --- a/src/main/resources/assets/immersiveintelligence/models/block/metal_device/latex_collector_bucket.json +++ /dev/null @@ -1,317 +0,0 @@ -{ - "credit": "Made with Blockbench", - "texture_size": [32, 32], - "textures": { - "0": "immersiveintelligence:blocks/metal_device/latex_collector", - "particle": "immersiveintelligence:blocks/metal_device/latex_collector" - }, - "elements": [ - { - "name": "bucket", - "from": [3, 4, 5], - "to": [13, 5, 15], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [16, 4, 15] - }, - "faces": { - "north": { - "uv": [5, 5.5, 0, 6], - "texture": "#0" - }, - "east": { - "uv": [0, 5.5, 5, 6], - "texture": "#0" - }, - "south": { - "uv": [0, 5.5, 5, 6], - "texture": "#0" - }, - "west": { - "uv": [5, 5.5, 0, 6], - "texture": "#0" - }, - "up": { - "uv": [0, 6, 5, 11], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [0, 6, 5, 11], - "rotation": 180, - "texture": "#0" - } - } - }, - { - "name": "bucket", - "from": [12, 5, 5], - "to": [13, 16, 15], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [16, 4, 15] - }, - "faces": { - "north": { - "uv": [4.5, 0, 5, 5.5], - "texture": "#0" - }, - "east": { - "uv": [0, 0, 5, 5.5], - "texture": "#0" - }, - "south": { - "uv": [0, 0, 0.5, 5.5], - "texture": "#0" - }, - "west": { - "uv": [5, 0, 0, 5.5], - "texture": "#0" - }, - "up": { - "uv": [0, 0, 5, 0.5], - "rotation": 270, - "texture": "#0" - }, - "down": { - "uv": [0, 0, 1, 10], - "rotation": 180, - "texture": "#missing" - } - } - }, - { - "name": "bucket", - "from": [3, 5, 5], - "to": [4, 16, 15], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [16, 4, 15] - }, - "faces": { - "north": { - "uv": [0, 0, 0.5, 5.5], - "texture": "#0" - }, - "east": { - "uv": [5, 0, 0, 5.5], - "texture": "#0" - }, - "south": { - "uv": [4.5, 0, 5, 5.5], - "texture": "#0" - }, - "west": { - "uv": [0, 0, 5, 5.5], - "texture": "#0" - }, - "up": { - "uv": [5, 0, 0, 0.5], - "rotation": 270, - "texture": "#0" - }, - "down": { - "uv": [0, 0, 1, 10], - "rotation": 180, - "texture": "#missing" - } - } - }, - { - "name": "bucket", - "from": [4, 5, 14], - "to": [12, 16, 15], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [16, 4, 15] - }, - "faces": { - "north": { - "uv": [0.5, 0, 4.5, 5.5], - "texture": "#0" - }, - "east": { - "uv": [0, 0, 1, 11], - "texture": "#missing" - }, - "south": { - "uv": [4.5, 0, 0.5, 5.5], - "texture": "#0" - }, - "west": { - "uv": [0, 0, 1, 11], - "texture": "#missing" - }, - "up": { - "uv": [0.5, 0, 4.5, 0.5], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [0, 0, 8, 1], - "rotation": 180, - "texture": "#missing" - } - } - }, - { - "name": "bucket", - "from": [4, 5, 5], - "to": [12, 16, 6], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [16, 4, 15] - }, - "faces": { - "north": { - "uv": [4.5, 0, 0.5, 5.5], - "texture": "#0" - }, - "east": { - "uv": [0, 0, 1, 11], - "texture": "#missing" - }, - "south": { - "uv": [0.5, 0, 4.5, 5.5], - "texture": "#0" - }, - "west": { - "uv": [0, 0, 1, 11], - "texture": "#missing" - }, - "up": { - "uv": [4.5, 0, 0.5, 0.5], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [0, 0, 8, 1], - "rotation": 180, - "texture": "#missing" - } - } - }, - { - "name": "bucket", - "from": [3, 7, 2], - "to": [13, 9, 4], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [16, 0, 15] - }, - "faces": { - "north": { - "uv": [0, 11, 5, 12], - "texture": "#0" - }, - "east": { - "uv": [5, 11, 6, 12], - "rotation": 180, - "texture": "#0" - }, - "south": { - "uv": [5, 11, 0, 12], - "texture": "#0" - }, - "west": { - "uv": [5, 11, 6, 12], - "texture": "#0" - }, - "up": { - "uv": [0, 12, 5, 11], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [0, 12, 5, 11], - "rotation": 180, - "texture": "#0" - } - } - }, - { - "name": "bucket", - "from": [2, 7.5, 2.5], - "to": [3, 8.5, 13.5], - "rotation": { - "angle": -45, - "axis": "x", - "origin": [2.5, 8, 3] - }, - "faces": { - "north": { - "uv": [5, 10.5, 5.5, 11], - "texture": "#0" - }, - "east": { - "uv": [5, 5.5, 5.5, 11], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [5, 5.5, 5.5, 6], - "texture": "#0" - }, - "west": { - "uv": [5, 5.5, 5.5, 11], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [5, 5.5, 5.5, 11], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [5, 5.5, 5.5, 11], - "texture": "#0" - } - } - }, - { - "name": "bucket", - "from": [13, 7.5, 2.5], - "to": [14, 8.5, 13.5], - "rotation": { - "angle": -45, - "axis": "x", - "origin": [13.5, 8, 3] - }, - "faces": { - "north": { - "uv": [5, 10.5, 5.5, 11], - "texture": "#0" - }, - "east": { - "uv": [5, 5.5, 5.5, 11], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [5, 5.5, 5.5, 6], - "texture": "#0" - }, - "west": { - "uv": [5, 5.5, 5.5, 11], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [5, 5.5, 5.5, 11], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [5, 5.5, 5.5, 11], - "texture": "#0" - } - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/shaders/alpha.frag b/src/main/resources/assets/immersiveintelligence/shaders/alpha.frag index e857fb988..5a5ce61a2 100644 --- a/src/main/resources/assets/immersiveintelligence/shaders/alpha.frag +++ b/src/main/resources/assets/immersiveintelligence/shaders/alpha.frag @@ -4,17 +4,12 @@ //Alpha fragment shader uniform float alpha;// Passed in by callback -//Texture (GL_TEXTURE0) uniform sampler2D texture; -//Lightmap Texture (GL_TEXTURE1) -//uniform sampler2D lightmap; - -/*vec3 vanillaLight() { - return clamp(texture2D(lightmap, gl_TexCoord[1].st).xyz, 0.0f, 1.0f); -}*/ +uniform sampler2D lightmap; void main() { - // gl_FragColor = texture2D(texture, gl_TexCoord[0].st) * gl_Color * vec4(vanillaLight(), alpha); - gl_FragColor = texture2D(texture, gl_TexCoord[0].st) * gl_Color * vec4(1, 1, 1, alpha); + vec4 tex = texture2D(texture, gl_TexCoord[0].st); + vec4 light = texture2D(lightmap, gl_TexCoord[1].st); + gl_FragColor = tex * gl_Color * light * vec4(1.0, 1.0, 1.0, alpha); } \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/shaders/blueprint.frag b/src/main/resources/assets/immersiveintelligence/shaders/blueprint.frag index 1e87d4163..0e2b31157 100644 --- a/src/main/resources/assets/immersiveintelligence/shaders/blueprint.frag +++ b/src/main/resources/assets/immersiveintelligence/shaders/blueprint.frag @@ -3,16 +3,20 @@ //Author: Flaxbeard (https://github.com/Flaxbeard/ImmersivePetroleum/blob/1.12.2/src/main/resources/assets/immersivepetroleum/shaders/alpha.frag) uniform float alpha;// Passed in by callback uniform float time; -uniform sampler2D bgl_RenderedTexture; + +uniform sampler2D texture; +uniform sampler2D lightmap; float noise(in vec2 coordinate, in float seed) { - vec2 coordActual = floor(textureSize(bgl_RenderedTexture, 0) * coordinate); + vec2 coordActual = floor(textureSize(texture, 0) * coordinate); return fract(sin(dot(coordActual*seed, vec2(12.9898, 78.233)))*43758.5453); } void main() { float n = (noise(vec2(gl_TexCoord[0]), time) - 0.5) * 0.25; - gl_FragColor = texture2D(bgl_RenderedTexture, vec2(gl_TexCoord[0])) * gl_Color * vec4(0.0706 + n, 0.4 + n, 0.7804 + n, alpha); + vec4 tex = texture2D(texture, gl_TexCoord[0].st); + + gl_FragColor = tex * gl_Color * vec4(0.0706 + n, 0.4 + n, 0.7804 + n, alpha); } \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/shaders/color.frag b/src/main/resources/assets/immersiveintelligence/shaders/color.frag index f2ff0d25a..bb20487a9 100644 --- a/src/main/resources/assets/immersiveintelligence/shaders/color.frag +++ b/src/main/resources/assets/immersiveintelligence/shaders/color.frag @@ -3,9 +3,14 @@ //Author: Pabilo8 (pabilo@iiteam.net) //RGB color shader uniform vec3 color;// Passed in by callback -uniform sampler2D bgl_RenderedTexture; + +uniform sampler2D texture; +uniform sampler2D lightmap; void main() { - gl_FragColor = texture2D(bgl_RenderedTexture, vec2(gl_TexCoord[0])) * gl_Color * vec4(color.xyz, 1.0); + vec4 tex = texture2D(texture, gl_TexCoord[0].st); + vec4 light = texture2D(lightmap, gl_TexCoord[1].st); + + gl_FragColor = tex * gl_Color * light * vec4(color.xyz, 1.0); } \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/shaders/grayscale.frag b/src/main/resources/assets/immersiveintelligence/shaders/grayscale.frag index c4e0d6b9a..89420d77e 100644 --- a/src/main/resources/assets/immersiveintelligence/shaders/grayscale.frag +++ b/src/main/resources/assets/immersiveintelligence/shaders/grayscale.frag @@ -3,11 +3,15 @@ //Author: Pabilo8 (pabilo@iiteam.net) //Grayscale shader with a darkness parameter uniform float darkness; -uniform sampler2D bgl_RenderedTexture; + +uniform sampler2D texture; +uniform sampler2D lightmap; void main() { - vec4 color = texture2D(bgl_RenderedTexture, vec2(gl_TexCoord[0])) * gl_Color; - vec4 grayscaleColor = vec4(vec3(dot(color.rgb, vec3(0.299, 0.587, 0.114))) * (1.0 - darkness), 1.0); - gl_FragColor = grayscaleColor; + vec4 tex = texture2D(texture, gl_TexCoord[0].st); + vec4 light = texture2D(lightmap, gl_TexCoord[1].st); + vec4 color = tex * gl_Color * light * gl_Color; + + gl_FragColor = vec4(vec3(dot(color.rgb, vec3(0.299, 0.587, 0.114))) * (1.0 - darkness), 1.0); } \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/shaders/noise.frag b/src/main/resources/assets/immersiveintelligence/shaders/noise.frag index b85a30f43..6f761a0d2 100644 --- a/src/main/resources/assets/immersiveintelligence/shaders/noise.frag +++ b/src/main/resources/assets/immersiveintelligence/shaders/noise.frag @@ -2,7 +2,9 @@ //Author: Pabilo8 (pabilo@iiteam.net) uniform float time; -uniform sampler2D bgl_RenderedTexture; + +uniform sampler2D texture; +uniform sampler2D lightmap; float noise(in vec2 coordinate, in float seed) { @@ -12,6 +14,9 @@ float noise(in vec2 coordinate, in float seed) void main() { + vec4 tex = texture2D(texture, gl_TexCoord[0].st); + vec4 light = texture2D(lightmap, gl_TexCoord[1].st); float n = (noise(vec2(gl_TexCoord[0]), time) - 0.5) * 0.25; - gl_FragColor = texture2D(bgl_RenderedTexture, vec2(gl_TexCoord[0])) * gl_Color * vec4(1-n, 1-n, 1-n, 1); + + gl_FragColor = tex * gl_Color * light * vec4(1-n, 1-n, 1-n, 1); } \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/textures/blocks/metal_device/latex_collector.png b/src/main/resources/assets/immersiveintelligence/textures/blocks/metal_device/latex_collector.png index c8ba2c15243910176db53d502c7f47ac2d9325c3..9b4265872f17fd10ddc2635cac3c89bece5f42b8 100644 GIT binary patch literal 6793 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 hP5W{nKj@#`Y@ni-9!OV<;1DQyH zAQ41R*dR7hq>${;EZCqRF$+*61VU^^h!sd6mfmC$$%=v$!3ZUSk;V}TncxK39>;du zo&LA`TU}L;dtdpr-7^j-Y-TgpF4d>I-aYr+bML#YUAlBhXn&f9mAkhfd;#5cU1YOa z2mxtkx7)?q+8VC@>>3Qsgoa(4|NYxy@xhXY%a<>UQ>RXeZ+vz_zN9A-2^>Qit`~%B z)a!M0+8w-k^#}OU;zQA2IOcHzPW!LP+)F>G#bB7g6%FiiuV=i|<5K{K1p zCf#_*=ku5-K7Yo<*>7QTGE3e}e7RT_x?vb_90#^-<9C01qMd%@IO4W}O1X^bObY+g zw2K!nO8l#Hp@< zo0_2;@B>~@gYDQM5v5WI9LdR(C&k>WM-d^wnUNH>@_$9#`S%}T^75u>VrXaxUwCB_ zMkI#ecm#*X58*e;1s{y1-s~V^>R8?^!VQej#r*typWZWbM?(NFV%quh=S4Icl`eE$ zmk+nMw-Jd%5ZQP@G1HgmxlXzX0-q8n2(yms_t&MTeh~3^yuV1J(U8e)Jq3J9YQ)ir zo-E5@Y`5F;=yW=`apQ)TT)!_pSrL;!X!Iv!5(47c>v{bJOjZgj znIX4YE%1V;PoE}VC4A@mZ(?;VN5ZjDE*4x?)5^+< zlppdda7+!p1i&fqWfmxHxV!Q!)IqgcmHFq=R6H<=+)_rrq+_JzPYk zk$(lmFL6zAZ8HKcAGYN}gT!x8n!ECI)`4M|=MXIAOJ}-v5^=n{QP~p`6UHyHfPXk6Q97=@^+Qpq)~ONsn9Lp`m~ zztyba-r{?pI0s3TsnSAN>OLUGTkR%ZJ3fot#wMzbCMpf$$gnXs^U7cv6$<8pm3j8; zS>e-y(_?j1j!|=f9x))vx_m1b-jDX=l!yk+T995vP)~z=ZNMK3JJ5GfXlYE7#n7 zKUAmOy0H6wJ={L!efXS1X9a7!HTS2b+yLihCX?xBP)UIWDeFhq<(co7mzO0-C7En8 zfu`@tDv#3p9@Sh=gwCL8A!ylm4D?YQV5Zu9m6W(9+2My-P(6!{i+`)pL4VKpLV(;s zcDtr!g}w~B?Q(6)7NkGVKTK7E%9)B<0b=8=dtqTg`}XH2Mbx&i@Q*d^dtZD>P@9Co z3)6Q4Awm%J@6k1Pow(&tgYoHOABJi6Q~41Flw)?tU{o5Ia_&%K7k+vuj+hmGzTIet zQJDmioS2R!TOR`uybrJjf`6bNnDBjw189(QAd642z-JY`0>{^Lb92J)l@RQ1-lMSy zxck@)K59!AT*ZWG?Czul#1EttqzrZaqX70#MSSLaMHS~>^=KAp&?S`bQ}iJ* z`o7->r3O)SnQb2h8s7|3_Uy6Gkl0*|jwIo;(?S8=7PWHElhqJ)49py!M5(%iZnJ?x zA&=w7Ums*ZQLLh8N1PG`K$Rv7asHhZdGq!+&x_HqaU2@Wz_Cpl2kUS=^y%pv}wfxF~LIA(JA-Y9$KB!|=$+AOp8=-+tlAvr9S8-@iwLwg)SC4Y8=BanDba zgJ;`0WcD!-xIL|~i#j0#)$$+%CjJj&2C}c8KyEAlTm}RkoX+G>Lb91orw(M`6Z;Po W= Date: Fri, 15 May 2026 09:19:58 +0200 Subject: [PATCH 02/23] Fixed import error in LawForm --- .../immersiveintelligence/common/util/diplomacy/LawForm.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/diplomacy/LawForm.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/diplomacy/LawForm.java index 7983e168e..330b09e64 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/diplomacy/LawForm.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/diplomacy/LawForm.java @@ -3,8 +3,8 @@ import pl.pabilo8.immersiveintelligence.common.util.ISerializableEnum; import pl.pabilo8.immersiveintelligence.common.util.diplomacy.permission.PermissionCategory; import pl.pabilo8.immersiveintelligence.common.util.diplomacy.permission.PermissionRole; -import scala.actors.threadpool.Arrays; +import java.util.Arrays; import java.util.List; import java.util.function.Supplier; @@ -224,7 +224,6 @@ public enum LawForm implements ISerializableEnum { this.startingRole = startingRole; this.ownerRole = ownerRole; - //noinspection unchecked this.roles = () -> Arrays.asList(roles); } From 4e86d864628bca0b01393b24bfad02bf7f9c7f33 Mon Sep 17 00:00:00 2001 From: Pabilo8 Date: Mon, 18 May 2026 13:45:17 +0200 Subject: [PATCH 03/23] Fixed DiplomacyHandler crashing when game is suddenly forced to close --- .../common/util/diplomacy/DiplomacyHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/diplomacy/DiplomacyHandler.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/diplomacy/DiplomacyHandler.java index 0e0f86cc4..b1b3a5369 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/diplomacy/DiplomacyHandler.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/diplomacy/DiplomacyHandler.java @@ -189,7 +189,7 @@ public void cleanup() propertyTickets.clear(); pendingTickets.clear(); pendingTicketCheckTimer = 0; - NEUTRAL = GLOBAL_ENEMY = null; + //NEUTRAL = GLOBAL_ENEMY = null; } //--- Update Loop ---// From 5df2cf748031541f1a474b687b8766d53084227d Mon Sep 17 00:00:00 2001 From: Pabilo8 Date: Mon, 18 May 2026 13:45:59 +0200 Subject: [PATCH 04/23] Started refactoring Machinegun, Mortar and Tripod periscope, fixed mouse handling in vehicles --- .../api/ammo/utils/AmmoFactory.java | 7 + .../api/utils/camera/ZoomSettings.java | 51 + .../client/ClientEventHandler.java | 77 +- .../client/ClientProxy.java | 14 + .../overlay/GuiOverlayTripodPeriscope.java | 2 +- .../gui/overlay/gun/GuiOverlayMachinegun.java | 24 +- .../entity/weapon/MachinegunRenderer.java | 150 +-- .../render/entity/weapon/MortarRenderer.java | 2 +- .../weapon/TripodPeriscopeRenderer.java | 16 +- .../item/MachinegunItemStackRenderer.java | 2 +- .../common/CommonProxy.java | 8 +- .../common/EventHandler.java | 41 +- .../common/IIConfigHandler.java | 8 +- .../EmplacementWeaponInfraredObserver.java | 2 +- .../weapon/EmplacementWeaponTurretBase.java | 2 +- .../common/commands/CommandIIHans.java | 8 +- .../common/entity/EntityHans.java | 2 + .../common/entity/EntityMachinegun.java | 1174 ----------------- .../common/entity/EntityMortar.java | 428 ------ .../common/entity/EntityTripodPeriscope.java | 214 --- .../entity/hans/tasks/AIHansMachinegun.java | 49 +- .../entity/hans/tasks/AIHansMortar.java | 23 +- .../mounted_weapon/EntityMachinegun.java | 302 +++++ .../entity/mounted_weapon/EntityMortar.java | 212 +++ .../mounted_weapon/EntityMountedWeapon.java | 288 ++++ .../mounted_weapon/EntityTripodPeriscope.java | 74 ++ .../entity/vehicle/utils/VehicleControls.java | 119 +- .../vehicle/utils/VehicleDurability.java | 2 +- .../vehicle/utils/part/EntityVehicleSeat.java | 24 +- .../item/tools/ItemIITripodPeriscope.java | 5 +- .../common/item/weapons/ItemIIMachinegun.java | 12 +- .../common/item/weapons/ItemIIMortar.java | 51 +- .../messages/MessageEntityNBTSync.java | 8 - .../common/util/FilteredFluidTank.java | 8 + .../util/diplomacy/DiplomacyHandler.java | 22 +- .../util/{ => gun}/GunAimCoordinate.java | 63 +- .../common/util/gun/GunRecoil.java | 131 ++ .../common/util/gun/GunShootingHandler.java | 64 + .../util/item/ItemIIUpgradableTool.java | 19 + .../immersiveintelligence/lang/en_us.lang | 5 + 40 files changed, 1556 insertions(+), 2157 deletions(-) create mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/api/utils/camera/ZoomSettings.java delete mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/common/entity/EntityMachinegun.java delete mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/common/entity/EntityMortar.java delete mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/common/entity/EntityTripodPeriscope.java create mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMachinegun.java create mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMortar.java create mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMountedWeapon.java create mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityTripodPeriscope.java rename src/main/java/pl/pabilo8/immersiveintelligence/common/util/{ => gun}/GunAimCoordinate.java (79%) create mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunRecoil.java create mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunShootingHandler.java diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/api/ammo/utils/AmmoFactory.java b/src/main/java/pl/pabilo8/immersiveintelligence/api/ammo/utils/AmmoFactory.java index 2b51ca690..d7aa8eb40 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/api/ammo/utils/AmmoFactory.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/api/ammo/utils/AmmoFactory.java @@ -17,6 +17,7 @@ import pl.pabilo8.immersiveintelligence.common.IILogger; import pl.pabilo8.immersiveintelligence.common.entity.ammo.EntityAmmoBase; import pl.pabilo8.immersiveintelligence.common.entity.ammo.types.EntityAmmoProjectile; +import pl.pabilo8.immersiveintelligence.common.util.gun.GunAimCoordinate; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -195,6 +196,12 @@ public AmmoFactory setPositionAndVelocity(Vec3d pos, Vec3d dir, float velocit return this; } + public AmmoFactory setPositionAndVelocity(Vec3d positionVector, GunAimCoordinate aim, float offset, float velocity) + { + Vec3d target = aim.getTarget(0); + return setPositionAndVelocity(positionVector.add(target.scale(offset)), target, offset); + } + /** * Sets the owner of the ammo * diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/api/utils/camera/ZoomSettings.java b/src/main/java/pl/pabilo8/immersiveintelligence/api/utils/camera/ZoomSettings.java new file mode 100644 index 000000000..f597c79fc --- /dev/null +++ b/src/main/java/pl/pabilo8/immersiveintelligence/api/utils/camera/ZoomSettings.java @@ -0,0 +1,51 @@ +package pl.pabilo8.immersiveintelligence.api.utils.camera; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedZoomTool; + +/** + * @author Pabilo8 (pabilo@iiteam.net) + * @ii-approved 0.3.1 + * @since 15.05.2026 + */ +public class ZoomSettings implements IAdvancedZoomTool +{ + private boolean zoomEnabled = false; + private final float[] zoomSteps; + private final ResourceLocation overlayTexture; + + public ZoomSettings(float[] zoomSteps, ResourceLocation overlayTexture) + { + this.zoomSteps = zoomSteps; + this.overlayTexture = overlayTexture; + } + + public ZoomSettings withZoomEnabled(boolean zoomEnabled) + { + this.zoomEnabled = zoomEnabled; + return this; + } + + @Override + public boolean shouldZoom(ItemStack stack, EntityPlayer player) + { + return zoomEnabled; + } + + @Override + public float[] getZoomSteps(ItemStack stack, EntityPlayer player) + { + return zoomSteps; + } + + @SideOnly(Side.CLIENT) + @Override + public ResourceLocation getZoomOverlayTexture(ItemStack stack, EntityPlayer player) + { + return overlayTexture; + } +} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/ClientEventHandler.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/ClientEventHandler.java index 27400ee6b..152d4b6c7 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/ClientEventHandler.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/ClientEventHandler.java @@ -31,7 +31,6 @@ import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.PotionEffect; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumHand; @@ -72,7 +71,6 @@ import pl.pabilo8.immersiveintelligence.api.utils.ItemTooltipHandler; import pl.pabilo8.immersiveintelligence.api.utils.ItemTooltipHandler.IAdvancedTooltipItem; import pl.pabilo8.immersiveintelligence.api.utils.ItemTooltipHandler.IItemScrollable; -import pl.pabilo8.immersiveintelligence.api.utils.camera.IEntityZoomProvider; import pl.pabilo8.immersiveintelligence.client.fx.ScreenShake; import pl.pabilo8.immersiveintelligence.client.fx.utils.ParticleSystem; import pl.pabilo8.immersiveintelligence.client.gui.GuiWidgetAustralianTabs; @@ -101,16 +99,16 @@ import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Graphics; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Tools.TripodPeriscope; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons; -import pl.pabilo8.immersiveintelligence.common.entity.EntityMachinegun; -import pl.pabilo8.immersiveintelligence.common.entity.EntityMortar; -import pl.pabilo8.immersiveintelligence.common.entity.EntityTripodPeriscope; import pl.pabilo8.immersiveintelligence.common.entity.ammo.types.EntityAmmoProjectile; +import pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon.EntityMachinegun; +import pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon.EntityMortar; +import pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon.EntityMountedWeapon; +import pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon.EntityTripodPeriscope; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.EntityVehicleSeat; import pl.pabilo8.immersiveintelligence.common.item.ItemIIPrintedPage.PageType; import pl.pabilo8.immersiveintelligence.common.item.weapons.ItemIIGunBase; import pl.pabilo8.immersiveintelligence.common.item.weapons.ItemIIRailgunOverride; import pl.pabilo8.immersiveintelligence.common.network.IIPacketHandler; -import pl.pabilo8.immersiveintelligence.common.network.messages.MessageEntityNBTSync; import pl.pabilo8.immersiveintelligence.common.network.messages.MessageItemScrollableSwitch; import pl.pabilo8.immersiveintelligence.common.network.messages.MessageManualClose; import pl.pabilo8.immersiveintelligence.common.util.IIColor; @@ -664,7 +662,7 @@ public void onRenderOverlayPre(Pre event) RayTraceResult mop = ClientUtils.mc().objectMouseOver; EntityPlayer player = ClientUtils.mc().player; - // + float partialTicks = event.getPartialTicks(); //Iterate HUD backgrounds for(GuiOverlayBase hud : HUD_BACKGROUNDS) @@ -678,23 +676,6 @@ public void onRenderOverlayPre(Pre event) Entity ridden = player.getRidingEntity(); Entity lowestRidden = ridden==null?null: ridden.getLowestRidingEntity(); - //--- Entity Zoom Handling ---// - - if(lowestRidden instanceof IEntityZoomProvider) - { - boolean pressed = ClientProxy.keybindZoom.isKeyDown(); - if(pressed^mgAiming&&ridden instanceof EntityMachinegun) - { - NBTTagCompound tag = new NBTTagCompound(); - tag.setBoolean("clientMessage", true); - tag.setBoolean("aiming", pressed); - IIPacketHandler.sendToServer(new MessageEntityNBTSync(ridden, tag)); - ((EntityMachinegun)ridden).aiming = pressed; - } - mgAiming = pressed; - } - else mgAiming = false; - //--- Camera Handling ---// if(mgAiming) { @@ -705,36 +686,13 @@ public void onRenderOverlayPre(Pre event) EntityMachinegun mg = (EntityMachinegun)lowestRidden; float px = (float)mg.posX, py = (float)mg.posY, pz = (float)mg.posZ; - float yaw = mg.gunYaw; - float pitch = mg.gunPitch; - - EntityLivingBase psg = (EntityLivingBase)mg.getPassengers().get(0); - float true_head_angle = MathHelper.wrapDegrees(psg.prevRotationYawHead-mg.setYaw); - float true_head_angle2 = MathHelper.wrapDegrees(psg.rotationPitch); - - if(mg.gunYaw < true_head_angle) - yaw += ClientUtils.mc().getRenderPartialTicks()*2f; - else if(mg.gunYaw > true_head_angle) - yaw -= ClientUtils.mc().getRenderPartialTicks()*2f; - - if(Math.ceil(mg.gunYaw) <= Math.ceil(true_head_angle)+1f&&Math.ceil(mg.gunYaw) >= Math.ceil(true_head_angle)-1f) - yaw = true_head_angle; - - if(mg.gunPitch < true_head_angle2) - pitch += ClientUtils.mc().getRenderPartialTicks(); - else if(mg.gunPitch > true_head_angle2) - pitch -= ClientUtils.mc().getRenderPartialTicks(); - - yaw = mg.tripod?MathHelper.clamp(yaw, -82.5F, 82.5F): MathHelper.clamp(yaw, -45.0F, 45.0F); - pitch = MathHelper.clamp(pitch, -20, 20); - - yaw += mg.recoilYaw; - pitch += mg.recoilPitch; + float yaw = mg.getGunYaw(partialTicks); + float pitch = mg.getGunPitch(partialTicks); double true_angle = Math.toRadians(180-mg.setYaw-yaw); double true_angle2 = Math.toRadians(pitch); - boolean hasScope = mg.getZoom().shouldZoom(mg.gun, null); + boolean hasScope = mg.getZoom().shouldZoom(mg.getZoomStack(), null); Vec3d gun_end = IIMath.offsetPosDirection(2.25f-(hasScope?1.25f: 0), true_angle, true_angle2); Vec3d gun_height = IIMath.offsetPosDirection(0.25f+(hasScope?0.125f: 0f), true_angle, true_angle2+90); @@ -764,8 +722,8 @@ else if(lowestRidden instanceof EntityTripodPeriscope) ClientUtils.mc().player.rotationPitch = MathHelper.clamp(ClientUtils.mc().player.rotationPitch, -50, 50); ClientUtils.mc().player.prevRotationPitch = MathHelper.clamp(ClientUtils.mc().player.prevRotationPitch, -50, 50); - float y = MathHelper.wrapDegrees(360+mg.periscopeNextYaw-mg.periscopeYaw); - float currentYaw = MathHelper.wrapDegrees(mg.periscopeYaw+event.getPartialTicks()*(Math.signum(y)*MathHelper.clamp(Math.abs(y), 0, TripodPeriscope.turnSpeed))); + float y = MathHelper.wrapDegrees(360+mg.aim.getTargetYaw()-mg.aim.getCurrentYaw()); + float currentYaw = MathHelper.wrapDegrees(mg.aim.getCurrentYaw()+event.getPartialTicks()*(Math.signum(y)*MathHelper.clamp(Math.abs(y), 0, TripodPeriscope.turnSpeed))); CameraHandler.setCameraAngle(currentYaw, ClientUtils.mc().player.rotationPitch, 0); CameraHandler.setEnabled(true); @@ -839,18 +797,15 @@ else if(CameraHandler.zoom!=null) if(ridingEntity instanceof EntityVehicleSeat) { EntityVehicleSeat riding = (EntityVehicleSeat)ridingEntity; - if(riding.info!=null&&riding.info.passMouseButtonEvent(event)) + if(riding.info!=null&&riding.info.passMouseButtonEvent(event)&&event.isButtonstate()) event.setCanceled(true); } - else if(ridingEntity instanceof EntityMachinegun) - if(event.getButton()==1) - { - NBTTagCompound tag = new NBTTagCompound(); - tag.setBoolean("clientMessage", true); - tag.setBoolean("shoot", event.isButtonstate()); - IIPacketHandler.sendToServer(new MessageEntityNBTSync(ridingEntity, tag)); + else if(ridingEntity instanceof EntityMountedWeapon) + { + EntityMountedWeapon weapon = (EntityMountedWeapon)ridingEntity; + if(weapon.controls!=null&&weapon.controls.passMouseButtonEvent(event)&&event.isButtonstate()) event.setCanceled(true); - } + } } /** diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/ClientProxy.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/ClientProxy.java index 78064bf9d..d3d437eb2 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/ClientProxy.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/ClientProxy.java @@ -137,6 +137,9 @@ import pl.pabilo8.immersiveintelligence.common.entity.ammo.types.EntityAmmoProjectile; import pl.pabilo8.immersiveintelligence.common.entity.ammo.types.naval_mine.EntityNavalMine; import pl.pabilo8.immersiveintelligence.common.entity.ammo.types.naval_mine.EntityNavalMineAnchor; +import pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon.EntityMachinegun; +import pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon.EntityMortar; +import pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon.EntityTripodPeriscope; import pl.pabilo8.immersiveintelligence.common.entity.tactile.EntityAMTTactile; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.EntityDrone; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.EntityMotorbike; @@ -179,6 +182,7 @@ public class ClientProxy extends CommonProxy public static KeyBinding keybindManualReload, keybindArmorHelmet, keybindArmorExosuit, keybindZoom; public static KeyBinding keybindVehicleEngine, keybindVehicleClutch, keybindVehicleTowing; public static KeyBinding keybindVehicleGearUp, keybindVehicleGearDown, keybindVehicleReductionSwitch; + public static KeyBinding keybindVehicleGunUp, keybindVehicleGunDown, keybindVehicleGunLeft, keybindVehicleGunRight; private EasyNBT storedGuiData = EasyNBT.newNBT(); private HashMap, Block> TEISRRegistryQueue = new HashMap<>(); @@ -683,6 +687,16 @@ public void init(FMLInitializationEvent event) keybindVehicleReductionSwitch = new IIKeybind("vehicle.gear2.toggle", Keyboard.KEY_G, IIKeybind.CATEGORY_VEHICLES) .withContext(IIKeybind.VEHICLE_KEY_CONTEXT).register(); + //Vehicle Gun Keybinds + keybindVehicleGunUp = new IIKeybind("vehicle.gun.up", Keyboard.KEY_UP, IIKeybind.CATEGORY_VEHICLES) + .withContext(IIKeybind.VEHICLE_KEY_CONTEXT).register(); + keybindVehicleGunDown = new IIKeybind("vehicle.gun.down", Keyboard.KEY_DOWN, IIKeybind.CATEGORY_VEHICLES) + .withContext(IIKeybind.VEHICLE_KEY_CONTEXT).register(); + keybindVehicleGunLeft = new IIKeybind("vehicle.gun.left", Keyboard.KEY_LEFT, IIKeybind.CATEGORY_VEHICLES) + .withContext(IIKeybind.VEHICLE_KEY_CONTEXT).register(); + keybindVehicleGunRight = new IIKeybind("vehicle.gun.right", Keyboard.KEY_RIGHT, IIKeybind.CATEGORY_VEHICLES) + .withContext(IIKeybind.VEHICLE_KEY_CONTEXT).register(); + //Register shaders ShaderUtil.init(); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/overlay/GuiOverlayTripodPeriscope.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/overlay/GuiOverlayTripodPeriscope.java index fd7458de0..437b10e3c 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/overlay/GuiOverlayTripodPeriscope.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/overlay/GuiOverlayTripodPeriscope.java @@ -8,7 +8,7 @@ import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.RayTraceResult.Type; import pl.pabilo8.immersiveintelligence.client.util.CameraHandler; -import pl.pabilo8.immersiveintelligence.common.entity.EntityTripodPeriscope; +import pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon.EntityTripodPeriscope; import pl.pabilo8.immersiveintelligence.common.util.IIReference; import javax.annotation.Nonnull; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/overlay/gun/GuiOverlayMachinegun.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/overlay/gun/GuiOverlayMachinegun.java index 34df9f3b3..587e0e06f 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/overlay/gun/GuiOverlayMachinegun.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/overlay/gun/GuiOverlayMachinegun.java @@ -6,8 +6,8 @@ import net.minecraftforge.fluids.FluidStack; import pl.pabilo8.immersiveintelligence.client.IIClientUtils; import pl.pabilo8.immersiveintelligence.client.util.IIDrawUtils; -import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons.Machinegun; -import pl.pabilo8.immersiveintelligence.common.entity.EntityMachinegun; +import pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon.EntityMachinegun; +import pl.pabilo8.immersiveintelligence.common.item.weapons.ItemIIWeaponUpgrade.WeaponUpgrade; import pl.pabilo8.immersiveintelligence.common.util.IIColor; import javax.annotation.Nonnull; @@ -19,7 +19,8 @@ */ public class GuiOverlayMachinegun extends GuiOverlayGunBase { - private IIColor colorFrom = IIColor.fromPackedRGB(0xdf9916), colorTo = IIColor.fromPackedRGB(0xba0f0f); + private final IIColor colorFrom = IIColor.fromPackedRGB(0xdf9916); + private final IIColor colorTo = IIColor.fromPackedRGB(0xba0f0f); @Override public boolean shouldDraw(@Nonnull EntityPlayer player, @Nullable RayTraceResult mouseOver) @@ -33,34 +34,31 @@ public void draw(@Nonnull EntityPlayer player, @Nullable RayTraceResult mouseOve final EntityMachinegun mg = (EntityMachinegun)player.getRidingEntity(); assert mg!=null; - IIDrawUtils draw; - - if(mg.hasSecondMag) + if(mg.upgrades.contains(WeaponUpgrade.SECOND_MAGAZINE)) drawMagazine(mg.magazine2, width, height); drawMagazine(mg.magazine1, width, height); bindHUDTexture(); - draw = IIDrawUtils.startTexturedColored() + IIDrawUtils draw = IIDrawUtils.startTexturedColored() .setOffset(width-38-24, height) .drawTexColorRect(0, -20, 22, 18, IIColor.WHITE, 0/256f, 22/256f, 62/256f, 80/256f) .inBetween((x, y) -> { - IIClientUtils.drawGradientBar(x+1, y-19, 3, 16, colorFrom, colorTo, mg.overheating/(float)Machinegun.maxOverheat); + IIClientUtils.drawGradientBar(x+1, y-19, 3, 16, colorFrom, colorTo, mg.recoil.getOverheat(0)); bindHUDTexture(); }) .drawTexColorRect(5, -19, 16, 16, IIColor.WHITE, 16/256f, 32/256f, 0, 16/256f); draw.addOffset(0, -18); //Draw Water - if(mg.tankCapacity > 0) + if(mg.upgrades.contains(WeaponUpgrade.WATER_COOLING)) { final FluidStack fluid = mg.tank.getFluid(); draw.drawTexColorRect(0, -20, 22, 18, IIColor.WHITE, 0/256f, 22/256f, 62/256f, 80/256f) .inBetween((x, y) -> { if(fluid==null) return; - - float hh = 16*((float)mg.tank.getFluidAmount()/(float)mg.tankCapacity); + float hh = 16f*mg.tank.getFillPercentage(); ClientUtils.drawRepeatedFluidSprite(fluid, x+1, y-3-hh, 3, hh); bindHUDTexture(); }) @@ -68,11 +66,11 @@ public void draw(@Nonnull EntityPlayer player, @Nullable RayTraceResult mouseOve .addOffset(0, -18); } //Draw Shield - if(mg.maxShieldStrength > 0) + if(mg.upgrades.contains(WeaponUpgrade.SHIELD)) { draw .drawTexColorRect(0, -20, 22, 18, IIColor.WHITE, 0/256f, 22/256f, 62/256f, 80/256f) - .inBetween((x, y) -> IIClientUtils.drawArmorBar(x+1, y-19, 3, 16, mg.shieldStrength/mg.maxShieldStrength)) + .inBetween((x, y) -> IIClientUtils.drawArmorBar(x+1, y-19, 3, 16, (float)mg.shield.getDamageFactor())) .drawTexColorRect(5, -19, 16, 16, IIColor.WHITE, 32/256f, 48/256f, 0, 16/256f); } draw.finish(); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/weapon/MachinegunRenderer.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/weapon/MachinegunRenderer.java index 8b57aea1e..3c70fd136 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/weapon/MachinegunRenderer.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/weapon/MachinegunRenderer.java @@ -20,16 +20,17 @@ import pl.pabilo8.immersiveintelligence.client.model.weapon.ModelMachinegun; import pl.pabilo8.immersiveintelligence.client.render.IPassengerAnimationsRenderer; import pl.pabilo8.immersiveintelligence.client.render.IReloadableModelContainer; +import pl.pabilo8.immersiveintelligence.client.util.amt.AMTUtils; import pl.pabilo8.immersiveintelligence.client.util.tmt.ModelRendererTurbo; import pl.pabilo8.immersiveintelligence.client.util.tmt.TmtNamedBoxGroup; -import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons.Machinegun; import pl.pabilo8.immersiveintelligence.common.IIContent; import pl.pabilo8.immersiveintelligence.common.block.metal_device.BlockIIMetalDevice.IIBlockTypes_MetalDevice; import pl.pabilo8.immersiveintelligence.common.block.metal_device.tileentity.effect_crate.TileEntityAmmunitionCrate; -import pl.pabilo8.immersiveintelligence.common.entity.EntityMachinegun; import pl.pabilo8.immersiveintelligence.common.entity.ammo.types.EntityAmmoProjectile; +import pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon.EntityMachinegun; import pl.pabilo8.immersiveintelligence.common.item.ammo.ItemIIAmmoBase; import pl.pabilo8.immersiveintelligence.common.item.weapons.ItemIIMachinegun; +import pl.pabilo8.immersiveintelligence.common.item.weapons.ItemIIWeaponUpgrade.WeaponUpgrade; import pl.pabilo8.immersiveintelligence.common.util.IIReference; import pl.pabilo8.immersiveintelligence.common.util.IISkinHandler; import pl.pabilo8.immersiveintelligence.common.util.IISkinHandler.IISpecialSkin; @@ -57,7 +58,7 @@ public MachinegunRenderer(RenderManager renderManager) reloadModels(); } - public static void renderMachinegun(ItemStack stack, @Nullable EntityMachinegun entity) + public static void renderMachinegun(ItemStack stack, @Nullable EntityMachinegun entity, float partialTicks) { GlStateManager.pushMatrix(); List renderParts = new ArrayList<>(defaultGunParts); @@ -84,7 +85,7 @@ public static void renderMachinegun(ItemStack stack, @Nullable EntityMachinegun } specialText = I18n.format("skin.immersiveintelligence."+skin+".name"); - skin = ((skin.isEmpty()&&!canApply)?IIContent.itemMachinegun.getSkinnableDefaultTextureLocation(): IIReference.SKIN_LOCATION+skin+"/"); + skin = skin.isEmpty()?IIContent.itemMachinegun.getSkinnableDefaultTextureLocation(): IIReference.SKIN_LOCATION+skin+"/"; ClientUtils.bindTexture(skin+texture); @@ -98,40 +99,41 @@ public static void renderMachinegun(ItemStack stack, @Nullable EntityMachinegun if(entity!=null) { - float yaw = entity.gunYaw, pitch = entity.gunPitch; - if(entity.setupTime < 1&&entity.getPassengers().size() > 0&&entity.getPassengers().get(0) instanceof EntityLivingBase) + float yaw = entity.getGunYaw(0f), pitch = entity.getGunPitch(0f); + boolean tripod = entity.upgrades.contains(WeaponUpgrade.TRIPOD); + if(entity.setupTime < 1&&!entity.getPassengers().isEmpty()&&entity.getPassengers().get(0) instanceof EntityLivingBase) { EntityLivingBase psg = (EntityLivingBase)entity.getPassengers().get(0); float true_head_angle = MathHelper.wrapDegrees(psg.prevRotationYawHead-entity.setYaw); float true_head_angle2 = MathHelper.wrapDegrees(psg.rotationPitch); - if(entity.gunYaw < true_head_angle) - yaw += ClientUtils.mc().getRenderPartialTicks()*2f; - else if(entity.gunYaw > true_head_angle) - yaw -= ClientUtils.mc().getRenderPartialTicks()*2f; + if(entity.getGunYaw(0f) < true_head_angle) + yaw += partialTicks*2f; + else if(entity.getGunYaw(0f) > true_head_angle) + yaw -= partialTicks*2f; - if(Math.ceil(entity.gunYaw) <= Math.ceil(true_head_angle)+1f&&Math.ceil(entity.gunYaw) >= Math.ceil(true_head_angle)-1f) + if(Math.ceil(entity.getGunYaw(0f)) <= Math.ceil(true_head_angle)+1f&&Math.ceil(entity.getGunYaw(0f)) >= Math.ceil(true_head_angle)-1f) yaw = true_head_angle; - if(entity.gunPitch < true_head_angle2) - pitch += ClientUtils.mc().getRenderPartialTicks(); - else if(entity.gunPitch > true_head_angle2) - pitch -= ClientUtils.mc().getRenderPartialTicks(); + if(entity.getGunPitch(0f) < true_head_angle2) + pitch += partialTicks; + else if(entity.getGunPitch(0f) > true_head_angle2) + pitch -= partialTicks; - yaw = entity.tripod?MathHelper.clamp(yaw, -82.5F, 82.5F): MathHelper.clamp(yaw, -45.0F, 45.0F); + yaw = tripod?MathHelper.clamp(yaw, -82.5F, 82.5F): MathHelper.clamp(yaw, -45.0F, 45.0F); pitch = MathHelper.clamp(pitch, -20, 20); - yaw += entity.recoilYaw; - pitch += entity.recoilPitch; + yaw += entity.recoil.getRecoilYaw(partialTicks); + pitch += entity.recoil.getRecoilPitch(partialTicks); pitch = MathHelper.clamp(pitch, -20, 20); } GlStateManager.translate(0f, -0.34375, 0f); - float setup = Math.max(entity.setupTime-ClientUtils.mc().getRenderPartialTicks(), 0); - GlStateManager.rotate(-25f*(setup/(float)entity.maxSetupTime), 1, 0, 0); - GlStateManager.translate(0, 0.25*(setup/(float)entity.maxSetupTime), 0); + float setup = AMTUtils.getAnimationProgress(entity.setupTime, entity.maxSetupTime, true, partialTicks); + GlStateManager.rotate(-25f*setup, 1, 0, 0); + GlStateManager.translate(0, 0.25*setup, 0); if(drawText) { @@ -140,7 +142,7 @@ else if(entity.gunPitch > true_head_angle2) GlStateManager.rotate(180-entity.setYaw, 0f, 1f, 0f); GlStateManager.rotate(-yaw, 0f, 1f, 0f); GlStateManager.rotate(-pitch, 1, 0, 0); - GlStateManager.translate(-0.5f, 0.34375, 1.65625+(pitch/20*0.25)); + GlStateManager.translate(-0.5f, 0.34375, 1.65625+pitch/20*0.25); GlStateManager.rotate(90, 0, 1, 0); GlStateManager.scale(-1, -1, 1); @@ -164,7 +166,7 @@ else if(entity.gunPitch > true_head_angle2) GlStateManager.scale(0.85, 0.85, 0.85); GlStateManager.rotate(180-entity.setYaw, 0f, 1f, 0f); GlStateManager.translate(-0.5f, 0.34375+0.0625, 1.65625); - nmod.render(0.0625f, setup/(float)entity.maxSetupTime); + nmod.render(0.0625f, setup); GlStateManager.popMatrix(); } else @@ -174,22 +176,20 @@ else if(entity.gunPitch > true_head_angle2) GlStateManager.rotate(180-entity.setYaw, 0f, 1f, 0f); GlStateManager.rotate(-yaw, 0f, 1f, 0f); GlStateManager.rotate(-pitch, 1, 0, 0); - GlStateManager.translate(-0.5f, 0.34375, 1.65625+(pitch/20*0.25)); + GlStateManager.translate(-0.5f, 0.34375, 1.65625+pitch/20*0.25); switch(nmod.getName()) { case "ammo": { boolean should_render = false; - if(entity.currentlyLoaded==1) +// if(entity.currentlyLoaded==1) { - - float progress = entity.magazine1.isEmpty()?1f-Math.min(2*(float)entity.clipReload/(float)Machinegun.clipReloadTime, 1): (float)entity.clipReload/(float)Machinegun.clipReloadTime; - GlStateManager.translate(0f, 0.375f*progress, 0f); + GlStateManager.translate(0f, 0.375f*entity.shooting.getLoadingProgress(partialTicks), 0f); should_render = true; } - else if(!entity.magazine1.isEmpty()) - should_render = true; +// else if(!entity.magazine1.isEmpty()) +// should_render = true; if(should_render) nmod.render(0.0625f); @@ -199,7 +199,7 @@ else if(!entity.magazine1.isEmpty()) nmod.render(0.0625f); IAmmoModel, EntityAmmoProjectile> mm = AmmoRegistry.getModel(IIContent.itemAmmoMachinegun); GlStateManager.pushMatrix(); - GlStateManager.translate(0.69f, 0.65f, -0.0625f+(-0.0625f*1.5f)); + GlStateManager.translate(0.69f, 0.65f, -0.0625f+-0.0625f*1.5f); GlStateManager.rotate(180, 0, 1, 0); GlStateManager.rotate(90, 1, 0, 0); GlStateManager.scale(0.5f, 0.5f, 0.5f); @@ -207,10 +207,10 @@ else if(!entity.magazine1.isEmpty()) BlockPos cratePos = entity.getPosition().offset(EnumFacing.fromAngle(entity.setYaw).getOpposite()).down(); if(entity.getEntityWorld().getTileEntity(cratePos) instanceof TileEntityAmmunitionCrate) { - TileEntityAmmunitionCrate crate = ((TileEntityAmmunitionCrate)entity.getEntityWorld().getTileEntity(cratePos)); + TileEntityAmmunitionCrate crate = (TileEntityAmmunitionCrate)entity.getEntityWorld().getTileEntity(cratePos); assert crate!=null; - int beltLength = (int)(24+(Math.max(Math.abs(entity.gunYaw)-55, 0)/2)-(Math.max(entity.gunPitch-20, 0)/2)); + int beltLength = (int)(24+Math.max(Math.abs(entity.getGunYaw(0f))-55, 0)/2-Math.max(entity.getGunPitch(0f)-20, 0)/2); if(crate.open&&crate.isUpgradeInstalled(IIContent.UPGRADE_MG_LOADER)) { @@ -226,11 +226,11 @@ else if(!entity.magazine1.isEmpty()) } beltLength -= 4; - float ammoDir = ((entity.gunYaw)/(entity.tripod?90f: 50f))*(1-((Math.abs(entity.gunPitch))/40f)); - float ammoTurn = entity.tripod?((Math.abs(entity.gunYaw)/90f)*(beltLength > 24?(beltLength-24)/24f: 1)): 0; + float ammoDir = entity.getGunYaw(0f)/(tripod?90f: 50f)*(1-Math.abs(entity.getGunPitch(0f))/40f); + float ammoTurn = tripod?Math.abs(entity.getGunYaw(0f))/90f*(beltLength > 24?(beltLength-24)/24f: 1): 0; GlStateManager.pushMatrix(); - for(int i = 0; i < 4&&ammoStacks.size() > 0; i++) + for(int i = 0; i < 4&&!ammoStacks.isEmpty(); i++) { mm.renderAmmoComplete(false, ammoStacks.get(0)); GlStateManager.rotate(180f/4f, 0, 1, 0); @@ -244,7 +244,7 @@ else if(!entity.magazine1.isEmpty()) GlStateManager.translate(-0.25f, 0, 0.25); GlStateManager.pushMatrix(); - for(int i = 0; i < beltLength&&ammoStacks.size() > 0; i++) + for(int i = 0; i < beltLength&&!ammoStacks.isEmpty(); i++) { mm.renderAmmoComplete(false, ammoStacks.get(0)); GlStateManager.translate(0f, 0, 0.125f); @@ -267,33 +267,31 @@ else if(!entity.magazine1.isEmpty()) case "second_magazine_mag": { boolean should_render = false; - if(entity.currentlyLoaded==2) + //if(entity.currentlyLoaded==2) { - - float progress = entity.magazine2.isEmpty()?1f-Math.min(2*(float)entity.clipReload/(float)Machinegun.clipReloadTime, 1): (float)entity.clipReload/(float)Machinegun.clipReloadTime; - GlStateManager.translate(0f, 0.375f*progress, 0f); + GlStateManager.translate(0f, 0.375f*entity.shooting.getLoadingProgress(partialTicks), 0f); should_render = true; } - else if(!entity.magazine2.isEmpty()) - should_render = true; +// else if(!entity.magazine2.isEmpty()) +// should_render = true; if(should_render) nmod.render(0.0625f); break; } case "slide": - if(((entity.currentlyLoaded==1&&entity.magazine1.isEmpty())||(entity.currentlyLoaded==2&&entity.magazine2.isEmpty()))&&((float)entity.clipReload/(float)Machinegun.clipReloadTime) > 0.5) - { - float curr = (((float)entity.clipReload/(float)Machinegun.clipReloadTime)-0.5f)/0.5f; - float progress; - if(curr > 0.65) - progress = 1f-((curr-0.65f)/0.35f); - else - progress = (curr/0.65f); - GlStateManager.translate(0f, 0f, progress*0.375); - } - nmod.render(0.0625f); - break; + //if(entity.currentlyLoaded==1) + { + float curr = (entity.shooting.getLoadingProgress(partialTicks)-0.5f)/0.5f; + float progress; + if(curr > 0.65) + progress = 1f-(curr-0.65f)/0.35f; + else + progress = curr/0.65f; + GlStateManager.translate(0f, 0f, progress*0.375); + } + nmod.render(0.0625f); + break; case "shield": ClientUtils.bindTexture(skin+nmod.getTexturePath()); nmod.render(0.0625f); @@ -318,9 +316,9 @@ else if(!entity.magazine2.isEmpty()) nmod.render(0.0625f, 1f); continue; } - if(nmod.getName().equals("ammo")&&!(ItemNBTHelper.hasKey(stack, "magazine1")&&!(new ItemStack(ItemNBTHelper.getTagCompound(stack, "magazine1")).isEmpty()))) + if(nmod.getName().equals("ammo")&&!(ItemNBTHelper.hasKey(stack, "magazine1")&&!new ItemStack(ItemNBTHelper.getTagCompound(stack, "magazine1")).isEmpty())) continue; - if(nmod.getName().equals("second_magazine_mag")&&!(ItemNBTHelper.hasKey(stack, "magazine2")&&!(new ItemStack(ItemNBTHelper.getTagCompound(stack, "magazine2")).isEmpty()))) + if(nmod.getName().equals("second_magazine_mag")&&!(ItemNBTHelper.hasKey(stack, "magazine2")&&!new ItemStack(ItemNBTHelper.getTagCompound(stack, "magazine2")).isEmpty())) continue; for(ModelRendererTurbo m : nmod.getModel()) @@ -335,7 +333,7 @@ else if(!entity.magazine2.isEmpty()) * Renders the desired {@code T} type Entity. */ @Override - public void doRender(EntityMachinegun entity, double x, double y, double z, float f0, float f1) + public void doRender(EntityMachinegun entity, double x, double y, double z, float entityYaw, float partialTicks) { GlStateManager.pushMatrix(); @@ -345,8 +343,9 @@ public void doRender(EntityMachinegun entity, double x, double y, double z, floa GlStateManager.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); RenderHelper.enableStandardItemLighting(); - if(entity.gun!=null&&!entity.gun.isEmpty()) - renderMachinegun(entity.gun, entity); + ItemStack stack = entity.getOriginStack(); + if(!stack.isEmpty()) + renderMachinegun(stack, entity, partialTicks); GlStateManager.disableBlend(); @@ -384,7 +383,7 @@ public void reloadModels() @Override public boolean handleBipedRotations(ModelBiped model, EntityMachinegun mg, EntityLivingBase passenger, float partialTicks) { - float ff = (float)(-1.35f-Math.toRadians(mg.gunPitch)*1.25); + float ff = (float)(-1.35f-Math.toRadians(mg.getGunPitch(0f))*1.25); float true_head_angle = MathHelper.wrapDegrees(passenger.prevRotationYawHead-mg.setYaw); float wtime; @@ -394,21 +393,22 @@ public boolean handleBipedRotations(ModelBiped model, EntityMachinegun mg, Entit model.bipedLeftArm.rotateAngleY = .08726f+3.14f/6f; IBlockState state = passenger.world.getBlockState(passenger.getPosition()); - if(!mg.tripod&&state.getMaterial().isSolid()&&!(state.getBlock()==IIContent.blockMetalDevice&&state.getValue(IIContent.blockMetalDevice.property)==IIBlockTypes_MetalDevice.AMMUNITION_CRATE)) + boolean tripod = mg.upgrades.contains(WeaponUpgrade.TRIPOD); + if(!tripod&&state.getMaterial().isSolid()&&!(state.getBlock()==IIContent.blockMetalDevice&&state.getValue(IIContent.blockMetalDevice.property)==IIBlockTypes_MetalDevice.AMMUNITION_CRATE)) { - if(Math.abs(mg.gunYaw-true_head_angle) > 5) + if(Math.abs(mg.getGunYaw(0f)-true_head_angle) > 5) { wtime = Math.abs((mg.getEntityWorld().getTotalWorldTime()+partialTicks)%20/20f-0.5f)/0.5f; wtime *= 0.25f; - if(mg.setupTime > 0) + if(!mg.isSetupComplete()) wtime = 0; - if(mg.gunYaw < true_head_angle) + if(mg.getGunYaw(0f) < true_head_angle) { model.bipedRightLeg.rotateAngleY = -wtime*2f; model.bipedLeftLeg.rotateAngleY = wtime*2f; } - else if(mg.gunYaw > true_head_angle) + else if(mg.getGunYaw(0f) > true_head_angle) { model.bipedRightLeg.rotateAngleY = -wtime*2f; model.bipedLeftLeg.rotateAngleY = wtime*2f; @@ -419,8 +419,8 @@ else if(mg.gunYaw > true_head_angle) model.bipedRightLeg.rotateAngleX += 1.5f; model.bipedLeftLeg.rotateAngleX += 1.5f; - model.bipedRightArm.rotateAngleX += ff-0.5; - model.bipedLeftArm.rotateAngleX += ff-0.5; + model.bipedRightArm.rotateAngleX += ff-0.5f; + model.bipedLeftArm.rotateAngleX += ff-0.5f; model.bipedRightLeg.rotationPointY = 0f; model.bipedLeftLeg.rotationPointY = 0f; @@ -428,10 +428,10 @@ else if(mg.gunYaw > true_head_angle) model.bipedRightLeg.rotationPointZ = 12f; model.bipedLeftLeg.rotationPointZ = 12f; - float maxRotation = mg.tripod?82.5F: 45.0F; + float maxRotation = 45.0F; - model.bipedRightLeg.rotateAngleY += mg.gunYaw/maxRotation; - model.bipedLeftLeg.rotateAngleY += mg.gunYaw/maxRotation; + model.bipedRightLeg.rotateAngleY += mg.getGunYaw(0f)/maxRotation; + model.bipedLeftLeg.rotateAngleY += mg.getGunYaw(0f)/maxRotation; //model.bipedLeftLeg.rotateAngleY += ff+1f; @@ -440,16 +440,16 @@ else if(mg.gunYaw > true_head_angle) { wtime = Math.abs((mg.getEntityWorld().getTotalWorldTime()+partialTicks)%40/40f-0.5f)/0.5f-0.5f; wtime *= 0.65f; - if(mg.setupTime > 0) + if(!mg.isSetupComplete()) wtime = 0; model.bipedBody.rotateAngleX -= 0.0625f; - if(Math.abs(mg.gunYaw-true_head_angle) > 5) - if(mg.gunYaw < true_head_angle) + if(Math.abs(mg.getGunYaw(0f)-true_head_angle) > 5) + if(mg.getGunYaw(0f) < true_head_angle) { model.bipedRightLeg.rotateAngleX = wtime*2f; model.bipedLeftLeg.rotateAngleX = -wtime*2f; } - else if(mg.gunYaw > true_head_angle) + else if(mg.getGunYaw(0f) > true_head_angle) { model.bipedRightLeg.rotateAngleX = -wtime*2f; model.bipedLeftLeg.rotateAngleX = wtime*2f; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/weapon/MortarRenderer.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/weapon/MortarRenderer.java index b79bd3737..30ddca928 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/weapon/MortarRenderer.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/weapon/MortarRenderer.java @@ -21,7 +21,7 @@ import pl.pabilo8.immersiveintelligence.client.util.tmt.ModelRendererTurbo; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons.Mortar; import pl.pabilo8.immersiveintelligence.common.IIContent; -import pl.pabilo8.immersiveintelligence.common.entity.EntityMortar; +import pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon.EntityMortar; /** * @author Pabilo8 (pabilo@iiteam.net) diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/weapon/TripodPeriscopeRenderer.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/weapon/TripodPeriscopeRenderer.java index ba787bdb7..ba67519b8 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/weapon/TripodPeriscopeRenderer.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/weapon/TripodPeriscopeRenderer.java @@ -17,7 +17,7 @@ import pl.pabilo8.immersiveintelligence.client.render.IReloadableModelContainer; import pl.pabilo8.immersiveintelligence.client.util.tmt.ModelRendererTurbo; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Tools.TripodPeriscope; -import pl.pabilo8.immersiveintelligence.common.entity.EntityTripodPeriscope; +import pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon.EntityTripodPeriscope; /** * @author Pabilo8 (pabilo@iiteam.net) @@ -72,11 +72,11 @@ private void renderNormal(EntityTripodPeriscope entity, float entityYaw, float p for(ModelRendererTurbo mod : model.leg3Model) mod.render(); - float yy = MathHelper.wrapDegrees(360+entity.periscopeNextYaw-entity.periscopeYaw); - float yaw = MathHelper.wrapDegrees(entity.periscopeYaw+(Math.signum(yy)*MathHelper.clamp(Math.abs(yy), 0, TripodPeriscope.turnSpeed*partialTicks))); + float yy = MathHelper.wrapDegrees(360+entity.aim.getTargetYaw()-entity.aim.getYaw(partialTicks)); + float yaw = MathHelper.wrapDegrees(entity.aim.getYaw(partialTicks)+(Math.signum(yy)*MathHelper.clamp(Math.abs(yy), 0, TripodPeriscope.turnSpeed*partialTicks))); GlStateManager.popMatrix(); - GlStateManager.rotate(-yaw+90, 0, 1, 0); + GlStateManager.rotate(-entity.aim.getYaw(partialTicks)+90, 0, 1, 0); for(ModelRendererTurbo mod : model.periscopeModel) mod.render(); @@ -120,7 +120,7 @@ private void renderProgress(EntityTripodPeriscope entity, float entityYaw, float GlStateManager.color(1f, 1f, 1f, Math.min(periscopePlacementProgress, 1)); GlStateManager.translate(0.0625f/2f, (1f-periscopePlacementProgress)*1.5f, -0.0625f/2f); GlStateManager.rotate(periscopeRotationProgress*720, 0, 1, 0); - GlStateManager.rotate(-entity.periscopeYaw+90, 0, 1, 0); + GlStateManager.rotate(-entity.aim.getYaw(partialTicks)+90, 0, 1, 0); if(tripodProgress > 0) { for(ModelRendererTurbo mod : model.periscopeModel) @@ -164,13 +164,13 @@ public boolean handleBipedRotations(ModelBiped model, EntityTripodPeriscope mg, model.bipedHeadwear.rotateAngleY = 0; - if(Math.abs(mg.periscopeYaw-true_head_angle) > 5) - if(mg.periscopeYaw < true_head_angle) + if(Math.abs(mg.aim.getYaw(partialTicks)-true_head_angle) > 5) + if(mg.aim.getYaw(partialTicks) < true_head_angle) { model.bipedRightLeg.rotateAngleZ = -(1f-wtime)*0.25f; model.bipedLeftLeg.rotateAngleZ = -wtime*0.25f-0.25f; } - else if(mg.periscopeYaw > true_head_angle) + else if(mg.aim.getYaw(partialTicks) > true_head_angle) { model.bipedRightLeg.rotateAngleZ = (1f-wtime)*0.25f+0.25f; model.bipedLeftLeg.rotateAngleZ = wtime*0.25f; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/item/MachinegunItemStackRenderer.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/item/MachinegunItemStackRenderer.java index a31d19026..fea22a0d0 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/item/MachinegunItemStackRenderer.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/item/MachinegunItemStackRenderer.java @@ -20,7 +20,7 @@ public void renderByItem(ItemStack itemStackIn, float partialTicks) GlStateManager.pushMatrix(); RenderHelper.enableStandardItemLighting(); - MachinegunRenderer.renderMachinegun(itemStackIn, null); + MachinegunRenderer.renderMachinegun(itemStackIn, null, 0); GlStateManager.popMatrix(); } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/CommonProxy.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/CommonProxy.java index 4ed0f6e49..8c740785c 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/CommonProxy.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/CommonProxy.java @@ -84,7 +84,10 @@ import pl.pabilo8.immersiveintelligence.common.crafting.IIRecipes; import pl.pabilo8.immersiveintelligence.common.crafting.RecipePowerpackAdvanced; import pl.pabilo8.immersiveintelligence.common.crafting.RecipeSkinCraftingHandler; -import pl.pabilo8.immersiveintelligence.common.entity.*; +import pl.pabilo8.immersiveintelligence.common.entity.EntityHans; +import pl.pabilo8.immersiveintelligence.common.entity.EntityParachute; +import pl.pabilo8.immersiveintelligence.common.entity.EntitySkyCrate; +import pl.pabilo8.immersiveintelligence.common.entity.EntitySkycrateInternal; import pl.pabilo8.immersiveintelligence.common.entity.ammo.component.*; import pl.pabilo8.immersiveintelligence.common.entity.ammo.types.*; import pl.pabilo8.immersiveintelligence.common.entity.ammo.types.naval_mine.EntityNavalMine; @@ -99,6 +102,9 @@ import pl.pabilo8.immersiveintelligence.common.entity.minecart.crate.EntityMinecartCrateReinforced; import pl.pabilo8.immersiveintelligence.common.entity.minecart.crate.EntityMinecartCrateSteel; import pl.pabilo8.immersiveintelligence.common.entity.minecart.crate.EntityMinecartCrateWooden; +import pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon.EntityMachinegun; +import pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon.EntityMortar; +import pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon.EntityTripodPeriscope; import pl.pabilo8.immersiveintelligence.common.entity.tactile.EntityAMTTactile; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.EntityDrone; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.EntityMotorbike; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/EventHandler.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/EventHandler.java index 7473b81f6..bc067b7fc 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/EventHandler.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/EventHandler.java @@ -2,6 +2,7 @@ import blusunrize.immersiveengineering.api.MultiblockHandler.MultiblockFormEvent.Post; import blusunrize.immersiveengineering.common.util.ItemNBTHelper; +import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.ai.EntityAINearestAttackableTarget; import net.minecraft.entity.monster.EntityMob; @@ -52,8 +53,9 @@ import pl.pabilo8.immersiveintelligence.common.compat.IICompatModule; import pl.pabilo8.immersiveintelligence.common.crafting.IIRecipes; import pl.pabilo8.immersiveintelligence.common.entity.EntityHans; -import pl.pabilo8.immersiveintelligence.common.entity.EntityMachinegun; import pl.pabilo8.immersiveintelligence.common.entity.ammo.types.EntityAmmoProjectile; +import pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon.EntityMountedWeapon; +import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.EntityVehicleSeat; import pl.pabilo8.immersiveintelligence.common.item.ammo.ItemIIBulletMagazine; import pl.pabilo8.immersiveintelligence.common.item.armor.ItemIILightEngineerBoots; import pl.pabilo8.immersiveintelligence.common.network.IIPacketHandler; @@ -119,10 +121,8 @@ else if(event.getSource()==DamageSource.IN_FIRE||event.getSource()==DamageSource } //springs else if(event.getSource()==DamageSource.FALL) - { if(ItemIIUpgradeableArmor.isArmorWithUpgrade(boots, "springs")) event.setCanceled(true); - } } //--- World Load Handling ---// @@ -232,9 +232,8 @@ public void onWorldTick(WorldTickEvent event) @SubscribeEvent public void onMultiblockForm(Post event) { + //Required by Advanced Structures! if(event.isCancelable()&&!event.isCanceled()&&event.getMultiblock().getClass().isAnnotationPresent(IAdvancedMultiblock.class)) - { - //Required by Advanced Structures! if(!IIItemUtils.isAdvancedHammer(event.getHammer())) { if(!event.getEntityPlayer().getEntityWorld().isRemote) @@ -242,15 +241,16 @@ public void onMultiblockForm(Post event) IIStringUtil.getItemStackTextComponent(IIContent.itemHammer.getStack(1))); event.setCanceled(true); } - } } - //Cancel when using a machinegun @SubscribeEvent(priority = EventPriority.HIGH) public void onItemUse(RightClickBlock event) { - EntityLivingBase living = event.getEntityLiving(); - if(living.isRiding()&&living.getRidingEntity() instanceof EntityMachinegun) + if(!event.getEntity().isRiding()) + return; + Entity baseEntity = event.getEntity().getRidingEntity(); + //Cancel when using a vehicle + if(baseEntity instanceof EntityMountedWeapon||baseEntity instanceof EntityVehicleSeat) { event.setResult(Result.DENY); event.setCanceled(true); @@ -261,8 +261,11 @@ public void onItemUse(RightClickBlock event) @SubscribeEvent(priority = EventPriority.HIGH) public void onBlockUse(RightClickItem event) { - //Machinegun - if(event.getEntity().isRiding()&&event.getEntity().getRidingEntity() instanceof EntityMachinegun) + if(!event.getEntity().isRiding()) + return; + Entity baseEntity = event.getEntity().getRidingEntity(); + //Cancel when using a vehicle + if(baseEntity instanceof EntityMountedWeapon||baseEntity instanceof EntityVehicleSeat) { event.setResult(Result.DENY); event.setCanceled(true); @@ -273,10 +276,12 @@ public void onBlockUse(RightClickItem event) @SubscribeEvent(priority = EventPriority.HIGH) public void onEmptyRightclick(RightClickEmpty event) { - if(event.getEntity().isRiding()&&event.getEntity().getRidingEntity() instanceof EntityMachinegun) - { + if(!event.getEntity().isRiding()) + return; + Entity baseEntity = event.getEntity().getRidingEntity(); + //Cancel when using a vehicle + if(baseEntity instanceof EntityMountedWeapon||baseEntity instanceof EntityVehicleSeat) event.setResult(Result.DENY); - } } @SubscribeEvent @@ -316,12 +321,10 @@ public void onLivingUpdate(LivingUpdateEvent event) EntityPlayer player = (EntityPlayer)living; //Potion effects + //Apply radiation if(world.getTotalWorldTime()%20==0) - { - //Apply radiation if(!player.isCreative()&&biome==IIContent.biomeWasteland) living.addPotionEffect(new PotionEffect(IIPotions.radiation, 2000, 0, false, false)); - } //Handle powerpack crafted with armor if(!living.getItemStackFromSlot(EntityEquipmentSlot.CHEST).isEmpty() @@ -395,10 +398,8 @@ else if(event.getSource()==DamageSource.IN_FIRE||event.getSource()==DamageSource } //springs else if(event.getSource()==DamageSource.FALL) - { if(ItemIIUpgradeableArmor.isArmorWithUpgrade(boots, "springs")) event.setCanceled(true); - } } /** @@ -418,9 +419,7 @@ public void onLivingFallEvent(LivingFallEvent event) if(!(piece.getItem() instanceof ItemIILightEngineerBoots)) continue; ItemIILightEngineerBoots boots = (ItemIILightEngineerBoots)piece.getItem(); if(boots.hasUpgrade(piece, "internal_springs")) - { event.setDistance(0); - } } } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/IIConfigHandler.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/IIConfigHandler.java index 9f9edd74d..a1f2d2ddf 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/IIConfigHandler.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/IIConfigHandler.java @@ -1822,7 +1822,7 @@ public static class Machinegun public static int clipReloadTime = 35; @Comment({"Time required to fire a single bullet in MG."}) - public static int bulletFireTime = 2; + public static int fireDelay = 2; @Comment({"Time required to set up the MG (in ticks)."}) public static int setupTime = 50; @@ -1836,8 +1836,10 @@ public static class Machinegun @Comment({"Amount of vertical recoil after taking a shot."}) public static float recoilVertical = 2.5f; + //Upgrades + @Comment({"Fire rate multiplier when heavy barrel is mouted on mg."}) - public static float heavyBarrelFireRateMultiplier = 0.25f; + public static int heavyBarrelFireDelay = 1; @Comment({"Horizontal recoil after taking a shot with heavy barrel mounted."}) public static float recoilHBHorizontal = 1.25f; @@ -1884,7 +1886,7 @@ public static class Machinegun public static float[] machinegunScopeMaxZoom = new float[]{0.55f, 0.35f, 0.15f}; @Comment({"Shield's initial strength (resistance vs attacks)."}) - public static float shieldStrengthInitial = 45; + public static int shieldStrengthInitial = 45; @Comment({"Setup time multiplier when a shield is mouted on mg."}) public static float shieldSetupTimeMultiplier = 0.5f; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponInfraredObserver.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponInfraredObserver.java index 025900f11..bd6c2813e 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponInfraredObserver.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponInfraredObserver.java @@ -12,8 +12,8 @@ import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons.EmplacementWeapons.InfraredObserver; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement.TileEntityEmplacement; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement.TileEntityEmplacement.EmplacementStateNeeds; -import pl.pabilo8.immersiveintelligence.common.util.GunAimCoordinate; import pl.pabilo8.immersiveintelligence.common.util.easynbt.TargetCoordinateReference; +import pl.pabilo8.immersiveintelligence.common.util.gun.GunAimCoordinate; import pl.pabilo8.immersiveintelligence.common.util.multiblock.util.MultiblockInteractablePart; import javax.annotation.Nonnull; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponTurretBase.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponTurretBase.java index e93f0c0fc..dcfdf46be 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponTurretBase.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponTurretBase.java @@ -5,8 +5,8 @@ import net.minecraft.util.math.Vec3d; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement.TileEntityEmplacement; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement.TileEntityEmplacement.EmplacementStateNeeds; -import pl.pabilo8.immersiveintelligence.common.util.GunAimCoordinate; import pl.pabilo8.immersiveintelligence.common.util.easynbt.TargetCoordinateReference; +import pl.pabilo8.immersiveintelligence.common.util.gun.GunAimCoordinate; import pl.pabilo8.immersiveintelligence.common.util.multiblock.util.MultiblockInteractablePart; import javax.annotation.Nullable; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/commands/CommandIIHans.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/commands/CommandIIHans.java index 424d1f683..be8a6da9f 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/commands/CommandIIHans.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/commands/CommandIIHans.java @@ -32,9 +32,9 @@ import pl.pabilo8.immersiveintelligence.api.ammo.enums.FuseType; import pl.pabilo8.immersiveintelligence.common.IIContent; import pl.pabilo8.immersiveintelligence.common.entity.EntityHans; -import pl.pabilo8.immersiveintelligence.common.entity.EntityMachinegun; -import pl.pabilo8.immersiveintelligence.common.entity.EntityMortar; import pl.pabilo8.immersiveintelligence.common.entity.hans.HansUtils; +import pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon.EntityMachinegun; +import pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon.EntityMortar; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.towable.gun.EntityFieldHowitzer; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.EntityVehicleSeat; import pl.pabilo8.immersiveintelligence.common.item.ammo.ItemIIBulletMagazine.Magazines; @@ -296,7 +296,7 @@ protected EntityDonkey spawnTeamWeapon(World world, Vec3d pos, Team team, boolea IIContent.itemMachinegun.recalculateUpgrades(mgstack); IIContent.itemMachinegun.finishUpgradeRecalculation(mgstack); - EntityMachinegun mg = new EntityMachinegun(world, new BlockPos(pos).down(), yaw, 0, mgstack); + EntityMachinegun mg = new EntityMachinegun(world, new BlockPos(pos).down(), yaw, mgstack); world.spawnEntity(mg); EntityDonkey donkey = new EntityDonkey(world); @@ -717,7 +717,7 @@ protected EntityMachinegun spawnTeamWeapon(World world, Vec3d pos, Team team, bo IIContent.itemMachinegun.recalculateUpgrades(mgstack); IIContent.itemMachinegun.finishUpgradeRecalculation(mgstack); - EntityMachinegun mg = new EntityMachinegun(world, new BlockPos(pos).down(), yaw, 0, mgstack); + EntityMachinegun mg = new EntityMachinegun(world, new BlockPos(pos).down(), yaw, mgstack); world.spawnEntity(mg); return mg; } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/EntityHans.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/EntityHans.java index ac799eee8..2a34dc07a 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/EntityHans.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/EntityHans.java @@ -51,6 +51,8 @@ import pl.pabilo8.immersiveintelligence.common.entity.hans.tasks.idle.AIHansKazachok; import pl.pabilo8.immersiveintelligence.common.entity.hans.tasks.idle.AIHansSalute; import pl.pabilo8.immersiveintelligence.common.entity.hans.tasks.idle.AIHansTimedLookAtEntity; +import pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon.EntityMachinegun; +import pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon.EntityMortar; import pl.pabilo8.immersiveintelligence.common.item.armor.ItemIILightEngineerHelmet; import pl.pabilo8.immersiveintelligence.common.util.IIColor; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/EntityMachinegun.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/EntityMachinegun.java deleted file mode 100644 index 7a50cc899..000000000 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/EntityMachinegun.java +++ /dev/null @@ -1,1174 +0,0 @@ -package pl.pabilo8.immersiveintelligence.common.entity; - -import blusunrize.immersiveengineering.api.Lib; -import blusunrize.immersiveengineering.api.tool.ZoomHandler; -import blusunrize.immersiveengineering.common.util.EnergyHelper; -import blusunrize.immersiveengineering.common.util.ItemNBTHelper; -import blusunrize.immersiveengineering.common.util.Utils; -import io.netty.buffer.ByteBuf; -import net.minecraft.block.material.Material; -import net.minecraft.client.entity.EntityPlayerSP; -import net.minecraft.client.resources.I18n; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.MobEffects; -import net.minecraft.inventory.EntityEquipmentSlot; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.datasync.DataParameter; -import net.minecraft.network.datasync.DataSerializers; -import net.minecraft.network.datasync.EntityDataManager; -import net.minecraft.potion.PotionEffect; -import net.minecraft.util.*; -import net.minecraft.util.math.*; -import net.minecraft.world.World; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.FluidTank; -import net.minecraftforge.fluids.FluidUtil; -import net.minecraftforge.fluids.capability.CapabilityFluidHandler; -import net.minecraftforge.fluids.capability.IFluidHandler; -import net.minecraftforge.fluids.capability.IFluidHandlerItem; -import net.minecraftforge.fluids.capability.IFluidTankProperties; -import net.minecraftforge.fml.common.network.ByteBufUtils; -import net.minecraftforge.fml.common.registry.IEntityAdditionalSpawnData; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; -import pl.pabilo8.immersiveintelligence.ImmersiveIntelligence; -import pl.pabilo8.immersiveintelligence.api.MachinegunCoolantHandler; -import pl.pabilo8.immersiveintelligence.api.ammo.parts.IAmmoTypeItem; -import pl.pabilo8.immersiveintelligence.api.ammo.utils.AmmoFactory; -import pl.pabilo8.immersiveintelligence.api.utils.IEntitySpecialRepairable; -import pl.pabilo8.immersiveintelligence.api.utils.camera.IEntityZoomProvider; -import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedTextOverlay; -import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedZoomTool; -import pl.pabilo8.immersiveintelligence.client.util.CameraHandler; -import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons.Machinegun; -import pl.pabilo8.immersiveintelligence.common.IIContent; -import pl.pabilo8.immersiveintelligence.common.IIPotions; -import pl.pabilo8.immersiveintelligence.common.IISounds; -import pl.pabilo8.immersiveintelligence.common.block.metal_device.tileentity.effect_crate.TileEntityAmmunitionCrate; -import pl.pabilo8.immersiveintelligence.common.entity.ammo.types.EntityAmmoProjectile; -import pl.pabilo8.immersiveintelligence.common.item.ammo.ItemIIBulletMagazine; -import pl.pabilo8.immersiveintelligence.common.network.IIPacketHandler; -import pl.pabilo8.immersiveintelligence.common.network.messages.MessageEntityNBTSync; -import pl.pabilo8.immersiveintelligence.common.network.messages.MessagePlayerAimAnimationSync; -import pl.pabilo8.immersiveintelligence.common.util.IIMath; -import pl.pabilo8.immersiveintelligence.common.util.sound.AdvancedSounds.RangedSound; - -import javax.annotation.Nullable; - -/** - * @author Pabilo8 (pabilo@iiteam.net) - * @since 01.11.2019 - */ -//TODO: 15.02.2024 full rework needed -public class EntityMachinegun extends Entity implements IEntityAdditionalSpawnData, IAdvancedTextOverlay, IEntitySpecialRepairable, IEntityZoomProvider -{ - private static final ResourceLocation SIGHTS_TEXTURE = new ResourceLocation(ImmersiveIntelligence.MODID, "textures/gui/item/machinegun/scope.png"); - private static final ResourceLocation IR_SIGHTS_TEXTURE = new ResourceLocation(ImmersiveIntelligence.MODID, "textures/gui/item/machinegun/scope_infrared.png"); - - //TODO: switch nbt sending to DataParameters - private static final DataParameter dataMarkerFluid = EntityDataManager.createKey(EntityMachinegun.class, DataSerializers.COMPOUND_TAG); - private static final DataParameter dataMarkerFluidCap = EntityDataManager.createKey(EntityMachinegun.class, DataSerializers.VARINT); - - private final MachinegunZoom SCOPE = new MachinegunZoom(); - private final AmmoFactory ammoFactory; - //Second magazine is an upgrade - public ItemStack gun = ItemStack.EMPTY, magazine1 = ItemStack.EMPTY, magazine2 = ItemStack.EMPTY; - public int bulletDelay = 0, bulletDelayMax = 0, clipReload = 0, setupTime = Machinegun.setupTime, maxSetupTime = Machinegun.setupTime, overheating = 0, tankCapacity = 0, bullets1 = 0, bullets2 = 0; - public float setYaw = 0, recoilYaw = 0, recoilPitch = 0, gunYaw = 0, gunPitch = 0, maxRecoilPitch = Machinegun.recoilHorizontal, maxRecoilYaw = Machinegun.recoilVertical, currentlyLoaded = -1, shieldStrength = 0f, maxShieldStrength = 0f; - public boolean shoot = false, aiming = false, hasSecondMag = false, mag1Empty = false, mag2Empty = false, hasInfrared = false, loadedFromCrate = false, overheated = false, tripod = false; - public FluidTank tank = new FluidTank(tankCapacity); - - AxisAlignedBB aabb = new AxisAlignedBB(0.15d, 0d, 0.15d, 0.85d, 0.65d, 0.85d).offset(-0.5, 0, -0.5); - NonSidedFluidHandler fluidHandler = new NonSidedFluidHandler(this); - - - public EntityMachinegun(World worldIn) - { - super(worldIn); - this.ammoFactory = new AmmoFactory<>(this); - } - - public EntityMachinegun(World world, BlockPos pos, float yaw, float pitch, ItemStack stack) - { - super(world); - this.ammoFactory = new AmmoFactory<>(this); - - float height = 0; - this.gun = stack.copy(); - getConfigFromItem(this.gun); - - this.setSize(0.5f, tripod?1.625f: 0.5f); - AxisAlignedBB aabb = world.getBlockState(pos).getBoundingBox(world, pos); - height -= 1f-(aabb.maxY-aabb.minY); - this.setPositionAndRotation(pos.getX()+0.5f, pos.getY()+1f+height+(tripod?0.875f: 0f), pos.getZ()+0.5f, yaw, pitch); - this.setYaw = yaw; - } - - @Override - public boolean attackEntityFrom(DamageSource source, float amount) - { - if(!isDead) - { - if(source.isProjectile()) - { - Vec3d v = source.getDamageLocation(); - if(v!=null) - { - v = v.subtract(posX, posY, posZ); - if(getHorizontalFacing()==EnumFacing.getFacingFromVector((float)v.x, (float)v.y, (float)v.z)) - { - this.shieldStrength -= amount; - if(shieldStrength > 0) - return false; - } - } - } - /* - if(!world.isRemote&&amount > 10) - { - dropItem(); - if(shoot&&(!mag1Empty||!mag2Empty)) - world.createExplosion(source.getTrueSource(), this.posX, this.posY+0.5, this.posZ, 1, true); - } - */ - } - return super.attackEntityFrom(source, amount); - } - - @Override - public ItemStack getPickedResult(RayTraceResult target) - { - return gun; - } - - @Override - public AxisAlignedBB getEntityBoundingBox() - { - return aabb.offset(getPositionVector()); - } - - @Nullable - @Override - public AxisAlignedBB getCollisionBoundingBox() - { - return getEntityBoundingBox(); - } - - @Nullable - @Override - public AxisAlignedBB getCollisionBox(Entity entityIn) - { - return getEntityBoundingBox(); - } - - @Override - public boolean canRenderOnFire() - { - return false; - } - - @Override - public void setFire(int seconds) - { - } - - @Override - public boolean canPassengerSteer() - { - return false; - } - - @Override - public void onEntityUpdate() - { - super.onEntityUpdate(); - //Do stuff - - if(!world.isRemote&&world.getTotalWorldTime()%10==0) - { - if(getRidingEntity()==null&&world.getBlockState(getPosition().offset(EnumFacing.DOWN, tripod?2: 1)).getMaterial().equals(Material.AIR)) - { - dropItem(); - return; - } - else if(getRidingEntity()!=null) - { - this.setYaw = getRidingEntity().getRotationYawHead(); - setEntityBoundingBox(aabb); - setPositionAndUpdate(posX, posY, posZ); - } - } - - if(!world.isRemote&&hasInfrared&&getPassengers().size() > 0&&getPassengers().get(0)!=null&&world.getTotalWorldTime()%20==0) - { - - if(aiming) - { - if(getPassengers().get(0) instanceof EntityLivingBase) - { - EntityLivingBase ent = (EntityLivingBase)getPassengers().get(0); - int energy = 0; - for(ItemStack stack : ent.getArmorInventoryList()) - if(EnergyHelper.isFluxItem(stack)) - { - int out = EnergyHelper.extractFlux(stack, Machinegun.infraredScopeEnergyUsage*20, false); - if(out > 0) - { - ent.addPotionEffect(new PotionEffect(MobEffects.NIGHT_VISION, Math.round(out/(float)(Machinegun.infraredScopeEnergyUsage)*1.25f), 2, true, false)); - break; - } - } - } - } - } - - if(world.getTotalWorldTime()%120==0) - { - if(world.isRemote) - updateTank(true); - else - { - NBTTagCompound tag = new NBTTagCompound(); - tag.setBoolean("forClient", true); - writeEntityToNBT(tag); - IIPacketHandler.INSTANCE.sendToAllAround(new MessageEntityNBTSync(this, tag), IIPacketHandler.targetPointFromEntity(this, 24)); - } - } - - if(getPassengers().size() > 0&&getPassengers().get(0)!=null) - { - if(recoilPitch!=0||recoilYaw!=0) - { - recoilPitch /= 2; - recoilYaw /= 2; - - if(recoilPitch < 0.5f&&recoilPitch > -0.5f) - recoilPitch = 0; - if(recoilYaw < 0.5f&&recoilYaw > -0.5f) - recoilYaw = 0; - } - - if(getPassengers().get(0) instanceof EntityLivingBase) - { - EntityLivingBase psg = (EntityLivingBase)getPassengers().get(0); - - if(setupTime < 1) - { - doRotationsWithPlayer(psg); - - if(magazine1.isEmpty()) - mag1Empty = true; - if(hasSecondMag&&magazine2.isEmpty()) - mag2Empty = true; - - if(overheating > Machinegun.maxOverheat) - { - overheated = true; - } - overheating = Math.max(0, overheating-1); - if(world.getTotalWorldTime()%2==0&&overheating > 0&&tank.getFluid()!=null&&tank.getFluidAmount() >= Machinegun.waterCoolingFluidUsage) - { - overheating = Math.max(0, overheating-MachinegunCoolantHandler.getCoolAmount(tank.getFluid())); - tank.drain(Machinegun.waterCoolingFluidUsage, true); - } - - if(overheated&&overheating==0) - overheated = false; - - if(!world.isRemote) - { - if(!overheated) - { - if(shoot) - { - if(clipReload==0) - { - if(bulletDelay < 1) - { - if(!loadedFromCrate) - { - if(hasSecondMag&&!mag2Empty) - mag2Empty = !shoot(2); - else if(!mag1Empty) - mag1Empty = !shoot(1); - } - else - { - shootFromCrate(); - } - - } - else - bulletDelay -= 1; - } - } - } - - - } - if(!shoot&&!loadedFromCrate) - { - if(mag1Empty||mag2Empty) - { - boolean b1 = false, b2 = false; - if(currentlyLoaded==-1||currentlyLoaded==2) - b1 = processEmptyMagazine(mag2Empty, magazine2, psg, EntityEquipmentSlot.OFFHAND, 2); - if(currentlyLoaded==-1||currentlyLoaded==1) - b2 = processEmptyMagazine(mag1Empty, magazine1, psg, EntityEquipmentSlot.MAINHAND, 1); - - if(!b1&&!b2) - currentlyLoaded = -1; - } - } - - - } - else - { - setupTime -= 1; - } - - } - - rotationYaw = MathHelper.wrapDegrees(setYaw+gunYaw+recoilYaw); - - rotationPitch = MathHelper.wrapDegrees(gunPitch+recoilPitch); - } - else - { - if(!world.isRemote&&setupTime > 0) - { - dropItem(); - return; - } - gunPitch = Math.max(gunPitch-1, -25); - } - - } - - @Override - public void updatePassenger(Entity passenger) - { - if(this.isPassenger(passenger)) - { - BlockPos pos = getPosition(); - double true_angle = Math.toRadians((-rotationYaw) > 180?360f-(-rotationYaw): (-rotationYaw)); - double true_angle2 = Math.toRadians((-rotationYaw-90) > 180?360f-(-rotationYaw-90): (-rotationYaw-90)); - Vec3d pos2 = IIMath.offsetPosDirection(-1.65f, true_angle, 0); - Vec3d pos3 = IIMath.offsetPosDirection(-0.25f, true_angle2, 0); - - passenger.setPosition(pos.getX()+0.5+pos2.x+pos3.x, pos.getY()-1.15, pos.getZ()+0.5+pos2.z+pos3.z); - } - } - - @Override - public double getMountedYOffset() - { - return super.getMountedYOffset(); - } - - @Override - public boolean shouldRiderSit() - { - return false; - } - - boolean processEmptyMagazine(boolean isEmpty, ItemStack magazine, EntityLivingBase entity, EntityEquipmentSlot takeFrom, int setTo) - { - if(isEmpty) - { - ItemStack playerMag = entity.getItemStackFromSlot(takeFrom); - if(!magazine.isEmpty()) - { - if(clipReload >= Machinegun.clipReloadTime) - { - currentlyLoaded = -1; - clipReload = 0; - ItemStack mag2 = magazine.copy(); - IIContent.itemBulletMagazine.defaultize(mag2); - if(!world.isRemote) - Utils.dropStackAtPos(world, entity.getPosition(), mag2); - setMagazineToSlot(setTo, ItemStack.EMPTY); - } - else - { - currentlyLoaded = setTo; - clipReload += 1; - if(!world.isRemote&&clipReload < 2) - { - NBTTagCompound tag = new NBTTagCompound(); - writeEntityToNBT(tag); - IIPacketHandler.INSTANCE.sendToAllAround(new MessageEntityNBTSync(this, tag), IIPacketHandler.targetPointFromEntity(this, 24)); - } - if(!world.isRemote&&clipReload==1) - world.playSound(null, getPosition(), IISounds.machinegunUnload, SoundCategory.BLOCKS, 1F, 1f); - } - return true; - } - else - { - if(clipReload==0) - { - if(playerMag.getItem() instanceof ItemIIBulletMagazine&&playerMag.getMetadata()==0) - { - if(IIContent.itemBulletMagazine.hasNoBullets(playerMag)) - { - currentlyLoaded = -1; - return false; - } - clipReload = 1; - currentlyLoaded = setTo; - return true; - } - } - else if(clipReload < Machinegun.clipReloadTime) - { - if(playerMag.getItem() instanceof ItemIIBulletMagazine&&playerMag.getMetadata()==0) - { - clipReload += 1; - currentlyLoaded = setTo; - if(!world.isRemote&&clipReload==Math.round(Machinegun.clipReloadTime*0.35f)) - world.playSound(null, getPosition(), IISounds.machinegunReload, SoundCategory.BLOCKS, 1F, 1f); - return true; - } - else - { - clipReload = 0; - currentlyLoaded = -1; - return false; - } - } - else - { - if(playerMag.getItem() instanceof ItemIIBulletMagazine&&playerMag.getMetadata()==0) - { - clipReload = 0; - setMagazineToSlot(setTo, playerMag.copy()); - entity.setItemStackToSlot(takeFrom, ItemStack.EMPTY); - setEmpty(setTo, false); - currentlyLoaded = -1; - if(!world.isRemote) - { - NBTTagCompound tag = new NBTTagCompound(); - bullets1 = IIContent.itemBulletMagazine.getRemainingBulletCount(magazine1); - bullets2 = IIContent.itemBulletMagazine.getRemainingBulletCount(magazine2); - writeEntityToNBT(tag); - IIPacketHandler.INSTANCE.sendToAllAround(new MessageEntityNBTSync(this, tag), IIPacketHandler.targetPointFromEntity(this, 24)); - } - return true; - } - else - { - clipReload = 0; - currentlyLoaded = -1; - return false; - } - - } - } - } - return false; - } - - void setMagazineToSlot(int mag, ItemStack stack) - { - switch(mag) - { - case 1: - { - magazine1 = stack; - } - break; - case 2: - { - magazine2 = stack; - } - break; - } - } - - void setEmpty(int mag, boolean is) - { - switch(mag) - { - case 1: - { - mag1Empty = is; - } - break; - case 2: - { - mag2Empty = is; - } - break; - } - } - - @Override - protected void entityInit() - { - this.dataManager.register(dataMarkerFluid, new NBTTagCompound()); - this.dataManager.register(dataMarkerFluidCap, 0); - } - - @Override - public void readEntityFromNBT(NBTTagCompound compound) - { - if(!compound.hasKey("clientMessage")) - { - if(compound.hasKey("currentlyLoaded")) - currentlyLoaded = compound.getFloat("currentlyLoaded"); - if(compound.hasKey("magazine1")) - magazine1 = new ItemStack(compound.getCompoundTag("magazine1")); - if(compound.hasKey("magazine2")) - magazine2 = new ItemStack(compound.getCompoundTag("magazine2")); - if(compound.hasKey("bullets1")) - bullets1 = compound.getInteger("bullets1"); - else if(!magazine1.isEmpty()) - bullets1 = IIContent.itemBulletMagazine.getRemainingBulletCount(magazine1); - if(compound.hasKey("bullets2")) - bullets2 = compound.getInteger("bullets2"); - else if(!magazine2.isEmpty()) - bullets2 = IIContent.itemBulletMagazine.getRemainingBulletCount(magazine2); - if(compound.hasKey("gun")) - { - gun = new ItemStack(compound.getCompoundTag("gun")); - if(!world.isRemote) - getConfigFromItem(new ItemStack(compound.getCompoundTag("gun"))); - } - - if(compound.hasKey("shieldStrength")) - shieldStrength = compound.getInteger("shieldStrength"); - if(compound.hasKey("maxShieldStrength")) - maxShieldStrength = compound.getInteger("maxShieldStrength"); - if(compound.hasKey("overheating")) - overheating = compound.getInteger("overheating"); - if(compound.hasKey("tankCapacity")) - tankCapacity = compound.getInteger("tankCapacity"); - if(compound.hasKey("mag1Empty")) - mag1Empty = compound.getBoolean("mag1Empty"); - if(compound.hasKey("mag2Empty")) - mag2Empty = compound.getBoolean("mag2Empty"); - if(compound.hasKey("hasSecondMag")) - hasSecondMag = compound.getBoolean("hasSecondMag"); - if(compound.hasKey("tripod")) - tripod = compound.getBoolean("tripod"); - if(compound.hasKey("loadedFromCrate")) - loadedFromCrate = compound.getBoolean("loadedFromCrate"); - if(compound.hasKey("hasInfrared")) - hasInfrared = compound.getBoolean("hasInfrared"); - if(compound.hasKey("setYaw")) - setYaw = compound.getFloat("setYaw"); - if(compound.hasKey("gunYaw")) - gunYaw = compound.getFloat("gunYaw"); - if(compound.hasKey("gunPitch")) - gunPitch = compound.getFloat("gunPitch"); - if(compound.hasKey("recoilYaw")) - recoilYaw = compound.getFloat("recoilYaw"); - if(compound.hasKey("recoilPitch")) - recoilPitch = compound.getFloat("recoilPitch"); - - if(compound.hasKey("clipReload")) - clipReload = compound.getInteger("clipReload"); - if(compound.hasKey("setupTime")) - setupTime = compound.getInteger("setupTime"); - if(compound.hasKey("maxSetupTime")) - maxSetupTime = compound.getInteger("maxSetupTime"); - } - else - { - if(compound.hasKey("shoot")) - shoot = compound.getBoolean("shoot"); - if(compound.hasKey("aiming")) - { - aiming = compound.getBoolean("aiming"); - if(isBeingRidden()) - IIPacketHandler.INSTANCE.sendToDimension(new MessagePlayerAimAnimationSync(getPassengers().get(0), aiming), this.world.provider.getDimension()); - } - - //if(compound.hasKey("reload")) - // shoot = compound.getBoolean("shoot"); - } - - } - - @Override - public void writeEntityToNBT(NBTTagCompound compound) - { - compound.setTag("gun", gun.serializeNBT()); - compound.setTag("magazine1", magazine1.serializeNBT()); - compound.setTag("magazine2", magazine2.serializeNBT()); - - compound.setBoolean("mag1Empty", mag1Empty); - compound.setBoolean("mag2Empty", mag2Empty); - compound.setBoolean("hasSecondMag", hasSecondMag); - compound.setBoolean("hasInfrared", hasInfrared); - compound.setBoolean("loadedFromCrate", loadedFromCrate); - compound.setBoolean("tripod", tripod); - compound.setFloat("currentlyLoaded", currentlyLoaded); - - compound.setFloat("shieldStrength", shieldStrength); - compound.setFloat("maxShieldStrength", maxShieldStrength); - - compound.setInteger("overheating", overheating); - compound.setInteger("tankCapacity", tankCapacity); - compound.setFloat("setYaw", setYaw); - compound.setFloat("gunYaw", gunYaw); - compound.setFloat("gunPitch", gunPitch); - compound.setFloat("recoilYaw", recoilYaw); - compound.setFloat("recoilPitch", recoilPitch); - - compound.setInteger("clipReload", clipReload); - compound.setInteger("setupTime", setupTime); - compound.setInteger("maxSetupTime", maxSetupTime); - } - - @Override - public void writeSpawnData(ByteBuf buffer) - { - ByteBufUtils.writeItemStack(buffer, gun); - NBTTagCompound tag = new NBTTagCompound(); - writeEntityToNBT(tag); - ByteBufUtils.writeTag(buffer, tag); - } - - @Override - public void readSpawnData(ByteBuf additionalData) - { - gun = ByteBufUtils.readItemStack(additionalData); - NBTTagCompound tag = ByteBufUtils.readTag(additionalData); - if(tag!=null) - readEntityFromNBT(tag); - } - - @Override - public boolean processInitialInteract(EntityPlayer player, EnumHand hand) - { - FluidStack f = FluidUtil.getFluidContained(player.getHeldItem(EnumHand.MAIN_HAND)); - if(f==null) - f = FluidUtil.getFluidContained(player.getHeldItem(EnumHand.OFF_HAND)); - - if(f!=null&&this.tankCapacity > 0) - { - if(MachinegunCoolantHandler.isValidCoolant(f)) - { - FluidUtil.interactWithFluidHandler(player, hand, tank); - if(!world.isRemote) - updateTank(false); - } - return true; - } - else if(player.isSneaking()&&player.getHeldItem(hand).isEmpty()&&getPassengers().size()==0) - { - if(!world.isRemote) - dropItem(); - return true; - } - else - { - if(!world.isRemote) - player.startRiding(this); - return true; - } - } - - @Override - protected void removePassenger(Entity passenger) - { - if(world.isRemote&&passenger instanceof EntityPlayerSP) - { - CameraHandler.setEnabled(false); - ZoomHandler.isZooming = false; - } - shoot = false; - aiming = false; - if(!world.isRemote) - IIPacketHandler.INSTANCE.sendToDimension(new MessagePlayerAimAnimationSync(passenger, false), this.world.provider.getDimension()); - super.removePassenger(passenger); - } - - @Override - public boolean canBeCollidedWith() - { - return true; - } - - @Override - public void applyOrientationToEntity(Entity entityToUpdate) - { - entityToUpdate.setRenderYawOffset(this.rotationYaw); - float f = MathHelper.wrapDegrees(entityToUpdate.rotationYaw-this.setYaw); - float f1 = tripod?MathHelper.clamp(f, -82.5F, 82.5F): MathHelper.clamp(f, -45.0F, 45.0F); - entityToUpdate.prevRotationYaw += f1-f; - entityToUpdate.rotationYaw += f1-f; - entityToUpdate.setRotationYawHead(entityToUpdate.rotationYaw); - } - - public void doRotationsWithPlayer(EntityLivingBase entity) - { - float true_head_angle; - - true_head_angle = MathHelper.wrapDegrees(entity.rotationYawHead-this.setYaw); - - if(gunYaw < true_head_angle) - gunYaw += 2; - else if(gunYaw > true_head_angle) - gunYaw -= 2; - - if(Math.ceil(gunYaw) <= Math.ceil(true_head_angle)+1&&Math.ceil(gunYaw) >= Math.ceil(true_head_angle)-1) - gunYaw = true_head_angle; - - if(gunPitch < entity.rotationPitch) - gunPitch += 1; - else if(gunPitch > entity.rotationPitch) - gunPitch -= 1; - - if(Math.ceil(gunPitch) <= Math.ceil(entity.rotationPitch)+1&&Math.ceil(gunPitch) >= Math.ceil(entity.rotationPitch)-1) - gunPitch = entity.rotationPitch; - - gunYaw = tripod?MathHelper.clamp(gunYaw, -82.5F, 82.5F): MathHelper.clamp(gunYaw, -45.0F, 45.0F); - gunPitch = MathHelper.clamp(gunPitch, -20, 20); - } - - public void shootFromStack(ItemStack stack) - { - if(stack.isEmpty()) - { - world.playSound(null, posX, posY, posZ, IISounds.machinegunShotDry, SoundCategory.PLAYERS, 0.25f, 0.9f); - return; - } - NBTTagCompound upgrades = IIContent.itemMachinegun.getUpgrades(gun); - - RangedSound sound = IISounds.machinegunShot; - if(upgrades.hasKey("heavy_barrel")) - sound = IISounds.machinegunShotHeavyBarrel; - else if(upgrades.hasKey("water_cooling")) - sound = IISounds.machinegunShotWaterCooled; - - IIPacketHandler.playRangedSound(world, getPositionVector(), - sound, SoundCategory.PLAYERS, 75, 1.5f, - 1f+(float)(Utils.RAND.nextGaussian()*0.02) - ); - - double yawAngle = Math.toRadians(360f-rotationYaw); - double pitchAngle = Math.toRadians(-(rotationPitch)); - Vec3d gun_end = IIMath.offsetPosDirection(0.95f, yawAngle, pitchAngle); - Vec3d gun_height = IIMath.offsetPosDirection(0.1875f, yawAngle, pitchAngle+90); - - Vec3d vpos = new Vec3d(posX+0.85*(gun_end.x+gun_height.x), posY+0.34375+0.85*(gun_end.y+gun_height.y), posZ+0.85*(gun_end.z+gun_height.z)); - - ammoFactory.setPosition(vpos) - .setPositionAndVelocity(vpos, gun_end, 1) - .setIgnoredEntities(getPassengers()) - .setShooterAndGun(getPassengers().get(0), this) - .setStack(stack) - .create(); - - ItemStack stack2 = ((IAmmoTypeItem)stack.getItem()).getCasingStack(1); - Utils.dropStackAtPos(world, getPosition(), stack2); - } - - public boolean shootFromCrate() - { - if(getPassengers().get(0)==null||!(getPassengers().get(0) instanceof EntityLivingBase)) - return false; - - Utils.attractEnemies((EntityLivingBase)getPassengers().get(0), 36, null); - - bulletDelay = bulletDelayMax; - recoilYaw += Math.random() > 0.5?maxRecoilYaw*2*Math.random(): -maxRecoilYaw*2*Math.random(); - recoilPitch += maxRecoilPitch*Math.random(); - if(((EntityLivingBase)getPassengers().get(0)).getActivePotionEffects().stream().anyMatch(potionEffect -> potionEffect.getPotion()==IIPotions.ironWill)) - { - recoilYaw *= 0.1; - recoilPitch *= 0.1; - } - - overheating += 8; - - NBTTagCompound tag = new NBTTagCompound(); - tag.setBoolean("forClient", true); - tag.setFloat("recoilYaw", recoilYaw); - tag.setFloat("recoilPitch", recoilPitch); - tag.setFloat("overheating", overheating); - - BlockPos cratePos = getPosition().offset(EnumFacing.fromAngle(setYaw).getOpposite()).down(); - if(world.getTileEntity(cratePos) instanceof TileEntityAmmunitionCrate) - { - TileEntityAmmunitionCrate crate = ((TileEntityAmmunitionCrate)world.getTileEntity(cratePos)); - assert crate!=null; - - if(!crate.open) - return false; - - if(crate.isUpgradeInstalled(IIContent.UPGRADE_MG_LOADER)) - { - for(int i = 38; i < 50; i++) - { - ItemStack stack = crate.getInventory().get(i); - if(stack.isEmpty()) - continue; - shootFromStack(stack); - - crate.insertionHandler.extractItem(i, 1, false); - if(!world.isRemote) - IIPacketHandler.INSTANCE.sendToAllAround(new MessageEntityNBTSync(this, tag), IIPacketHandler.targetPointFromEntity(this, 24)); - return true; - } - } - } - return false; - } - - public boolean shoot(int magazine) - { - if(getPassengers().get(0)==null||!(getPassengers().get(0) instanceof EntityLivingBase)) - return false; - - Utils.attractEnemies((EntityLivingBase)getPassengers().get(0), 36, null); - - bulletDelay = bulletDelayMax; - recoilYaw += Math.random() > 0.5?maxRecoilYaw*2*Math.random(): -maxRecoilYaw*2*Math.random(); - recoilPitch += maxRecoilPitch*Math.random(); - if(((EntityLivingBase)getPassengers().get(0)).getActivePotionEffects().stream().anyMatch(potionEffect -> potionEffect.getPotion()==IIPotions.ironWill)) - { - recoilYaw *= 0.1; - recoilPitch *= 0.1; - } - - overheating += 8; - - NBTTagCompound tag = new NBTTagCompound(); - tag.setBoolean("forClient", true); - tag.setFloat("recoilYaw", recoilYaw); - tag.setFloat("recoilPitch", recoilPitch); - tag.setFloat("overheating", overheating); - - ItemStack stack = IIContent.itemBulletMagazine.takeBullet(magazine==1?magazine1: magazine2, true); - - if(magazine==1) - { - mag1Empty = stack.isEmpty(); - if(!mag1Empty) - { - bullets1 = IIContent.itemBulletMagazine.getRemainingBulletCount(magazine1); - tag.setInteger("bullets1", bullets1); - } - } - else if(magazine==2) - { - mag2Empty = stack.isEmpty(); - if(!mag2Empty) - { - bullets2 = IIContent.itemBulletMagazine.getRemainingBulletCount(magazine2); - tag.setInteger("bullets2", bullets2); - } - } - - tag.setBoolean("mag1Empty", mag1Empty); - tag.setBoolean("mag2Empty", mag2Empty); - - if(!world.isRemote) - { - IIPacketHandler.INSTANCE.sendToAllAround(new MessageEntityNBTSync(this, tag), IIPacketHandler.targetPointFromEntity(this, 24)); - shootFromStack(stack); - } - - return true; - } - - public void getConfigFromItem(ItemStack stack) - { - gun = stack; - float setup_multiplier = 1; - if(IIContent.itemMachinegun.getUpgrades(gun).hasKey("precise_bipod")) - setup_multiplier = Machinegun.preciseBipodSetupTimeMultiplier; - else if(IIContent.itemMachinegun.getUpgrades(gun).hasKey("hasty_bipod")) - setup_multiplier = Machinegun.hastyBipodSetupTimeMultiplier; - else if(IIContent.itemMachinegun.getUpgrades(gun).hasKey("tripod")) - { - this.tripod = true; - setup_multiplier = Machinegun.tripodSetupTimeMultiplier; - } - if(IIContent.itemMachinegun.getUpgrades(gun).hasKey("belt_fed_loader")) - setup_multiplier *= Machinegun.beltFedLoaderSetupTimeMultiplier; - if(IIContent.itemMachinegun.getUpgrades(gun).hasKey("shield")) - { - shieldStrength = Machinegun.shieldStrengthInitial; - maxShieldStrength = Machinegun.shieldStrengthInitial; - setup_multiplier *= Machinegun.shieldSetupTimeMultiplier; - } - - setupTime = Math.round(Machinegun.setupTime*setup_multiplier); - maxSetupTime = setupTime; - - float bullet_delay_multiplier = 1; - if(IIContent.itemMachinegun.getUpgrades(gun).hasKey("heavy_barrel")) - bullet_delay_multiplier = Machinegun.heavyBarrelFireRateMultiplier; - else if(IIContent.itemMachinegun.getUpgrades(gun).hasKey("water_cooling")) - { - tankCapacity = Machinegun.waterCoolingTankCapacity; - } - - bulletDelayMax = Math.round(bullet_delay_multiplier*Machinegun.bulletFireTime); - bulletDelay = 0; - - float recoil_multiplier_h = 1, recoil_multiplier_w = 1; - if(IIContent.itemMachinegun.getUpgrades(gun).hasKey("precise_bipod")) - { - recoil_multiplier_w *= Machinegun.preciseBipodRecoilMultiplier; - recoil_multiplier_h *= Machinegun.preciseBipodRecoilMultiplier; - } - else if(IIContent.itemMachinegun.getUpgrades(gun).hasKey("hasty_bipod")) - { - recoil_multiplier_w *= Machinegun.hastyBipodRecoilMultiplier; - recoil_multiplier_h *= Machinegun.hastyBipodRecoilMultiplier; - } - else if(IIContent.itemMachinegun.getUpgrades(gun).hasKey("tripod")) - { - recoil_multiplier_w *= Machinegun.tripodRecoilMultiplier; - recoil_multiplier_h *= Machinegun.tripodRecoilMultiplier; - } - if(IIContent.itemMachinegun.getUpgrades(gun).hasKey("heavy_barrel")) - { - recoil_multiplier_w *= Machinegun.recoilHBHorizontal; - recoil_multiplier_h *= Machinegun.recoilHBVertical; - } - if(IIContent.itemMachinegun.getUpgrades(gun).hasKey("second_magazine")) - { - recoil_multiplier_w *= Machinegun.recoilSecondMagazine; - hasSecondMag = true; - } - - maxRecoilYaw *= recoil_multiplier_w; - maxRecoilPitch *= recoil_multiplier_h; - - if(ItemNBTHelper.hasKey(gun, "magazine1")) - magazine1 = new ItemStack(ItemNBTHelper.getTagCompound(gun, "magazine1")); - if(ItemNBTHelper.hasKey(gun, "magazine2")) - magazine2 = new ItemStack(ItemNBTHelper.getTagCompound(gun, "magazine2")); - - if(!hasSecondMag&&!magazine2.isEmpty()&&!world.isRemote) - { - Utils.dropStackAtPos(world, getPosition(), stack); - } - - if(!magazine1.isEmpty()) - bullets1 = IIContent.itemBulletMagazine.getRemainingBulletCount(magazine1); - if(!magazine2.isEmpty()) - bullets2 = IIContent.itemBulletMagazine.getRemainingBulletCount(magazine2); - - hasInfrared = IIContent.itemMachinegun.getUpgrades(gun).hasKey("infrared_scope"); - loadedFromCrate = IIContent.itemMachinegun.getUpgrades(gun).hasKey("belt_fed_loader"); - - tank.setCapacity(tankCapacity); - IFluidHandlerItem cap = gun.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null); - if(cap!=null) - tank.setFluid(cap.drain(Integer.MAX_VALUE, true)); - - updateTank(false); - - NBTTagCompound tag = new NBTTagCompound(); - writeEntityToNBT(tag); - IIPacketHandler.INSTANCE.sendToAllAround(new MessageEntityNBTSync(this, tag), IIPacketHandler.targetPointFromEntity(this, 24)); - } - - void dropItem() - { - if(!isDead) - { - ItemNBTHelper.setTagCompound(gun, "magazine1", magazine1.serializeNBT()); - ItemNBTHelper.setTagCompound(gun, "magazine2", magazine2.serializeNBT()); - if(IIContent.itemMachinegun.getCapacity(gun, 0) > 0) - { - IFluidHandlerItem cap = gun.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null); - if(cap!=null) - { - cap.drain(Integer.MAX_VALUE, true); - if(tank.getFluid()!=null) - cap.fill(tank.getFluid().copy(), true); - } - } - Utils.dropStackAtPos(world, getPosition(), gun); - setDead(); - } - } - - protected void updateTank(boolean read) - { - if(read) - readTank(dataManager.get(dataMarkerFluid)); - else - { - NBTTagCompound tag = new NBTTagCompound(); - writeTank(tag, false); - dataManager.set(dataMarkerFluid, tag); - } - } - - public void writeTank(NBTTagCompound nbt, boolean toItem) - { - boolean write = tank.getFluidAmount() > 0; - NBTTagCompound tankTag = tank.writeToNBT(new NBTTagCompound()); - if(!toItem||write) - nbt.setTag("tank", tankTag); - } - - public void readTank(NBTTagCompound nbt) - { - if(nbt.hasKey("tank")) - { - tank.readFromNBT(nbt.getCompoundTag("tank")); - } - tank.setCapacity(tankCapacity); - } - - @Override - public boolean hasCapability(Capability capability, @Nullable EnumFacing facing) - { - if(tankCapacity > 0&&capability==CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) - return true; - return super.hasCapability(capability, facing); - } - - @Nullable - @Override - public T getCapability(Capability capability, @Nullable EnumFacing facing) - { - if(tankCapacity > 0&&capability==CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) - return (T)fluidHandler; - return super.getCapability(capability, facing); - } - - @SideOnly(Side.CLIENT) - @Override - public String[] getOverlayText(EntityPlayer player, RayTraceResult mop) - { - if(Utils.isFluidRelatedItemStack(player.getHeldItem(EnumHand.MAIN_HAND))) - { - String s; - if(tank.getFluid()!=null) - s = tank.getFluid().getLocalizedName()+": "+tank.getFluidAmount()+"mB"; - else - s = I18n.format(Lib.GUI+"empty"); - return new String[]{s}; - } - return null; - } - - - @Override - public boolean canRepair() - { - return maxShieldStrength > 0&&shieldStrength < maxShieldStrength; - } - - @Override - public boolean repair(int repairPoints) - { - shieldStrength = Math.min(shieldStrength += repairPoints, shieldStrength); - return true; - } - - @Override - public int getRepairCost() - { - return 2; - } - - @Override - public IAdvancedZoomTool getZoom() - { - return SCOPE; - } - - @Override - public ItemStack getZoomStack() - { - return gun; - } - - @Override - public double getYOffset() - { - return isRiding()?1D: super.getYOffset(); - } - - private static class MachinegunZoom implements IAdvancedZoomTool - { - @Override - public ResourceLocation getZoomOverlayTexture(ItemStack stack, EntityPlayer player) - { - NBTTagCompound nbt = IIContent.itemMachinegun.getUpgrades(stack); - return nbt.hasKey("scope")?SIGHTS_TEXTURE: IR_SIGHTS_TEXTURE; - } - - @Override - public boolean shouldZoom(ItemStack stack, EntityPlayer player) - { - NBTTagCompound nbt = IIContent.itemMachinegun.getUpgrades(stack); - return (nbt.hasKey("scope")||nbt.hasKey("infrared_scope")); - } - - @Override - public float[] getZoomSteps(ItemStack stack, EntityPlayer player) - { - return Machinegun.machinegunScopeMaxZoom; - } - } - - static class NonSidedFluidHandler implements IFluidHandler - { - EntityMachinegun machinegun; - - NonSidedFluidHandler(EntityMachinegun machinegun) - { - this.machinegun = machinegun; - } - - @Override - public int fill(FluidStack resource, boolean doFill) - { - if(resource==null) - return 0; - if(!MachinegunCoolantHandler.isValidCoolant(resource)) - return 0; - - int i = machinegun.tank.fill(resource, doFill); - if(i > 0) - { - machinegun.updateTank(false); - } - return i; - } - - @Override - public FluidStack drain(FluidStack resource, boolean doDrain) - { - if(resource==null) - return null; - return this.drain(resource.amount, doDrain); - } - - @Override - public FluidStack drain(int maxDrain, boolean doDrain) - { - FluidStack f = machinegun.tank.drain(maxDrain, doDrain); - if(f!=null&&f.amount > 0) - { - machinegun.updateTank(false); - } - return f; - } - - @Override - public IFluidTankProperties[] getTankProperties() - { - return machinegun.tank.getTankProperties(); - } - } -} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/EntityMortar.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/EntityMortar.java deleted file mode 100644 index cbf420a8e..000000000 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/EntityMortar.java +++ /dev/null @@ -1,428 +0,0 @@ -package pl.pabilo8.immersiveintelligence.common.entity; - -import blusunrize.immersiveengineering.api.tool.ZoomHandler; -import blusunrize.immersiveengineering.client.ClientUtils; -import blusunrize.immersiveengineering.common.util.Utils; -import io.netty.buffer.ByteBuf; -import net.minecraft.client.entity.EntityPlayerSP; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.datasync.DataParameter; -import net.minecraft.network.datasync.DataSerializers; -import net.minecraft.network.datasync.EntityDataManager; -import net.minecraft.util.*; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; -import net.minecraftforge.fml.common.registry.IEntityAdditionalSpawnData; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; -import org.lwjgl.input.Mouse; -import pl.pabilo8.immersiveintelligence.ImmersiveIntelligence; -import pl.pabilo8.immersiveintelligence.api.ammo.utils.AmmoFactory; -import pl.pabilo8.immersiveintelligence.api.utils.camera.IEntityZoomProvider; -import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedZoomTool; -import pl.pabilo8.immersiveintelligence.client.util.CameraHandler; -import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons.Mortar; -import pl.pabilo8.immersiveintelligence.common.IIContent; -import pl.pabilo8.immersiveintelligence.common.IISounds; -import pl.pabilo8.immersiveintelligence.common.entity.ammo.types.EntityAmmoArtilleryProjectile; -import pl.pabilo8.immersiveintelligence.common.network.IIPacketHandler; -import pl.pabilo8.immersiveintelligence.common.network.messages.MessageEntityNBTSync; -import pl.pabilo8.immersiveintelligence.common.util.IIMath; - -/** - * @author Pabilo8 (pabilo@iiteam.net) - * @since 21.01.2021 - */ -//TODO: 15.02.2024 mandatory cleanup -public class EntityMortar extends Entity implements IEntityAdditionalSpawnData, IEntityZoomProvider -{ - private static final MortarSights SIGHTS = new MortarSights(); - - private static final DataParameter dataMarkerGunPitchUp = EntityDataManager.createKey(EntityMortar.class, DataSerializers.BOOLEAN); - private static final DataParameter dataMarkerGunPitchDown = EntityDataManager.createKey(EntityMortar.class, DataSerializers.BOOLEAN); - private static final DataParameter dataMarkerShootingProgress = EntityDataManager.createKey(EntityMortar.class, DataSerializers.FLOAT); - private final AmmoFactory ammoFactory; - - public boolean fireKeyPress = false, gunPitchUp = false, gunPitchDown = false; - public int setupTime = 0; - public float shootingProgress = 0f; - - public EntityMortar(World worldIn) - { - super(worldIn); - this.ammoFactory = new AmmoFactory<>(this); - } - - @Override - protected void entityInit() - { - this.dataManager.register(dataMarkerGunPitchUp, gunPitchUp); - this.dataManager.register(dataMarkerGunPitchDown, gunPitchDown); - this.dataManager.register(dataMarkerShootingProgress, shootingProgress); - setSize(1f, 1.5f); - } - - @Override - public void onUpdate() - { - if(!world.isRemote&&world.getTotalWorldTime()%20==0&&!world.getBlockState(getPosition().down()).isSideSolid(world, getPosition().down(), EnumFacing.UP)) - { - setDead(); - entityDropItem(this.getPickedResult(null), 0f); - } - - if(setupTime < Mortar.setupTime) - setupTime += 1; - else - { - if(world.isRemote) - { - Entity pre = ClientUtils.mc().player.getRidingEntity(); - if(pre==this) - { - //Handle, send to server, get other from server - handleClientKeyInput(); - handleClientKeyOutput(true); - } - else - { - //Get from server - handleClientKeyOutput(false); - } - } - else - { - handleServerKeyInput(); - if(getPassengers().size()==0) - { - gunPitchUp = false; - gunPitchDown = false; - shootingProgress = 0; - } - } - - if(shootingProgress==0) - { - if(fireKeyPress&&getPassengers().size() > 0) - { - Entity entity = getPassengers().get(0); - if(entity instanceof EntityLivingBase) - { - ItemStack heldItem = ((EntityLivingBase)entity).getHeldItem(EnumHand.MAIN_HAND); - if(heldItem.getItem()==IIContent.itemAmmoMortar) - { - shootingProgress = 1; - fireKeyPress = false; - } - } - } - else if(gunPitchUp) - rotationPitch = MathHelper.clamp(rotationPitch+0.5f, -80, -55); - else if(gunPitchDown) - rotationPitch = MathHelper.clamp(rotationPitch-0.5f, -80, -55); - } - else - { - if(getPassengers().size() > 0) - { - Entity entity = getPassengers().get(0); - if(entity instanceof EntityLivingBase) - { - ItemStack heldItem = ((EntityLivingBase)entity).getHeldItem(EnumHand.MAIN_HAND); - if(heldItem.getItem()==IIContent.itemAmmoMortar||shootingProgress > Mortar.shootTime*0.45) - { - if(shootingProgress < Mortar.shootTime) - shootingProgress++; - else - { - shootingProgress = 0; - - } - if(shootingProgress==Math.round(Mortar.shootTime*0.2f)) - { - world.playSound(null, posX, posY, posZ, IISounds.mortarLoad, SoundCategory.PLAYERS, 1.25f, 1f); - } - if(shootingProgress==Math.round(Mortar.shootTime*0.55f)) - { - if(!world.isRemote) - { - //Calculate angles - double yawAngle = Math.toRadians((MathHelper.wrapDegrees(-rotationYaw))); - double pitchAngle = Math.toRadians(-rotationPitch); - Vec3d gunEnd = IIMath.offsetPosDirection(2f, yawAngle, pitchAngle); - - //Play firing sound - world.playSound(null, posX, posY, posZ, IISounds.mortarShot, SoundCategory.PLAYERS, 1.25f, 1f); - - //Create the ammo piece - ammoFactory.setPosition(getPositionVector().add(gunEnd)) - .setDirection(gunEnd.normalize()) - .setStack(Utils.copyStackWithAmount(heldItem, 1)) - .setShooterAndGun(getPassengers().get(0), this) - .create(); - heldItem.shrink(1); - } - } - } - else - shootingProgress = 0; - } - } - else - shootingProgress = 0; - } - - } - - super.onUpdate(); - } - - @Override - public boolean attackEntityFrom(DamageSource source, float amount) - { - return amount > 4; - } - - private void handleClientKeyInput() - { - boolean hasChanged; - - boolean u = gunPitchUp, d = gunPitchDown, fk = fireKeyPress; - gunPitchUp = ClientUtils.mc().gameSettings.keyBindForward.isKeyDown(); - gunPitchDown = ClientUtils.mc().gameSettings.keyBindBack.isKeyDown(); - fireKeyPress = Mouse.isButtonDown(1); - hasChanged = u^gunPitchUp||d^gunPitchDown||fk^fireKeyPress; - - if(hasChanged) - IIPacketHandler.sendToServer(new MessageEntityNBTSync(this, updateKeys())); - } - - @SideOnly(Side.CLIENT) - private NBTTagCompound updateKeys() - { - NBTTagCompound compound = new NBTTagCompound(); - compound.setBoolean("gunPitchUp", gunPitchUp); - compound.setBoolean("gunPitchDown", gunPitchDown); - compound.setBoolean("fireKeyPress", fireKeyPress); - return compound; - } - - public void syncKeyPress(NBTTagCompound tag) - { - if(tag.hasKey("gunPitchUp")) - gunPitchUp = tag.getBoolean("gunPitchUp"); - if(tag.hasKey("gunPitchDown")) - gunPitchDown = tag.getBoolean("gunPitchDown"); - if(tag.hasKey("fireKeyPress")) - fireKeyPress = tag.getBoolean("fireKeyPress"); - } - - private void handleClientKeyOutput(boolean user) - { - if(user) - { - dataManager.get(dataMarkerGunPitchUp); - dataManager.get(dataMarkerGunPitchDown); - dataManager.get(dataMarkerShootingProgress); - } - else - { - gunPitchUp = dataManager.get(dataMarkerGunPitchUp); - gunPitchDown = dataManager.get(dataMarkerGunPitchDown); - shootingProgress = dataManager.get(dataMarkerShootingProgress); - } - - } - - private void handleServerKeyInput() - { - dataManager.set(dataMarkerGunPitchUp, gunPitchUp); - dataManager.set(dataMarkerGunPitchDown, gunPitchDown); - dataManager.set(dataMarkerShootingProgress, shootingProgress); - } - - @SideOnly(Side.CLIENT) - @Override - protected void removePassenger(Entity passenger) - { - if(world.isRemote&&passenger instanceof EntityPlayerSP) - { - CameraHandler.setEnabled(false); - ZoomHandler.isZooming = false; - } - super.removePassenger(passenger); - } - - @Override - public AxisAlignedBB getCollisionBoundingBox() - { - return getEntityBoundingBox(); - } - - @Override - public boolean processInitialInteract(EntityPlayer player, EnumHand hand) - { - if(!world.isRemote&&player.isSneaking()&&this.getPassengers().size()==0) - { - setDead(); - entityDropItem(this.getPickedResult(null), 0f); - return true; - } - if(setupTime==Mortar.setupTime&&player.getRidingEntity()!=this&&this.getPassengers().size()==0) - { - player.startRiding(this); - return true; - } - else - return true; - } - - @Override - public boolean canBeCollidedWith() - { - return true; - } - - @Override - public void updatePassenger(Entity passenger) - { - Vec3d pos = getPositionVector(); - float headYaw = MathHelper.wrapDegrees(this.rotationYaw); - double true_angle = Math.toRadians((-headYaw) > 180?360f-(-headYaw): (-headYaw)); - double true_angle2 = Math.toRadians((-headYaw-90) > 180?360f-(-headYaw-90): (-headYaw-90)); - Vec3d pos2 = IIMath.offsetPosDirection(0.125f, true_angle, 0); - Vec3d pos3 = IIMath.offsetPosDirection(-0.75f, true_angle2, 0); - float ff = 1; - if(shootingProgress > 0) - { - float v = shootingProgress/Mortar.shootTime; - if(v < 0.1) - { - //rise up - ff = 1f-(v/0.1f); - } - else if(v < 0.3) - { - //unturn - ff = 0; - } - else if(v < 0.4) - { - //get down - ff = (v-0.3f)/0.1f; - } - } - - passenger.setPosition(pos.x+pos2.x+pos3.x, pos.y-0.5*ff, pos.z+pos2.z+pos3.z); - applyOrientationToEntity(passenger); - } - - @Override - public void applyOrientationToEntity(Entity entityToUpdate) - { - float yy = this.rotationYaw; - if(setupTime==Mortar.setupTime) - { - yy += MathHelper.clamp((setupTime/(Mortar.setupTime*0.2)), 0, 1)*25; - } - if(shootingProgress > 0) - { - float ff = shootingProgress/Mortar.shootTime; - if(ff < 0.3) - yy += MathHelper.clamp(ff/0.1, 0, 1)*65; - else if(ff < 0.4) - yy += (1f-MathHelper.clamp((ff-0.3)/0.1, 0, 1))*65; - } - entityToUpdate.setRenderYawOffset(yy); - - float f = MathHelper.wrapDegrees(entityToUpdate.rotationYaw-(this.rotationYaw)); - float f1 = MathHelper.clamp(f, -75.0F, 75.0F); - entityToUpdate.prevRotationYaw += f1-f; - entityToUpdate.rotationYaw += f1-f; - - entityToUpdate.setRotationYawHead(entityToUpdate.rotationYaw); - } - - @Override - protected void readEntityFromNBT(NBTTagCompound compound) - { - setupTime = compound.getInteger("setupTime"); - gunPitchUp = compound.getBoolean("gunPitchUp"); - gunPitchDown = compound.getBoolean("gunPitchDown"); - shootingProgress = compound.getFloat("shootingProgress"); - } - - @Override - protected void writeEntityToNBT(NBTTagCompound compound) - { - compound.setInteger("setupTime", setupTime); - compound.setBoolean("gunPitchUp", gunPitchUp); - compound.setBoolean("gunPitchDown", gunPitchDown); - compound.setFloat("shootingProgress", shootingProgress); - } - - @Override - public ItemStack getPickedResult(RayTraceResult target) - { - return new ItemStack(IIContent.itemMortar); - } - - @Override - public boolean shouldRiderSit() - { - return false; - } - - @Override - public void writeSpawnData(ByteBuf buffer) - { - buffer.writeInt(this.setupTime); - } - - @Override - public void readSpawnData(ByteBuf additionalData) - { - this.setupTime = additionalData.readInt(); - } - - @Override - public IAdvancedZoomTool getZoom() - { - return SIGHTS; - } - - private static class MortarSights implements IAdvancedZoomTool - { - private static final ResourceLocation SIGHTS_TEXTURE = new ResourceLocation(ImmersiveIntelligence.MODID, "textures/gui/item/mortar.png"); - - @Override - @SideOnly(Side.CLIENT) - public ResourceLocation getZoomOverlayTexture(ItemStack stack, EntityPlayer player) - { - return SIGHTS_TEXTURE; - } - - @Override - public boolean shouldZoom(ItemStack stack, EntityPlayer player) - { - Entity ridingEntity = player.getRidingEntity(); - return ridingEntity instanceof EntityMortar&&((EntityMortar)ridingEntity).shootingProgress==0; - } - - @Override - public float[] getZoomSteps(ItemStack stack, EntityPlayer player) - { - Entity ridingEntity = player.getRidingEntity(); - if(ridingEntity instanceof EntityMortar) - return new float[]{1f-Math.min(0.75f/(ridingEntity.rotationPitch/-90f), 0.975f)}; - return new float[]{0}; - } - } -} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/EntityTripodPeriscope.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/EntityTripodPeriscope.java deleted file mode 100644 index 7b0fe4ad6..000000000 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/EntityTripodPeriscope.java +++ /dev/null @@ -1,214 +0,0 @@ -package pl.pabilo8.immersiveintelligence.common.entity; - -import blusunrize.immersiveengineering.api.tool.ZoomHandler; -import io.netty.buffer.ByteBuf; -import net.minecraft.client.entity.EntityPlayerSP; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.*; -import net.minecraft.world.World; -import net.minecraftforge.fml.common.registry.IEntityAdditionalSpawnData; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; -import pl.pabilo8.immersiveintelligence.ImmersiveIntelligence; -import pl.pabilo8.immersiveintelligence.api.utils.camera.IEntityZoomProvider; -import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedZoomTool; -import pl.pabilo8.immersiveintelligence.client.util.CameraHandler; -import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Tools.TripodPeriscope; -import pl.pabilo8.immersiveintelligence.common.IIContent; -import pl.pabilo8.immersiveintelligence.common.util.IIMath; - -import static pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Tools.TripodPeriscope.tripodZoomSteps; - -/** - * @author Pabilo8 (pabilo@iiteam.net) - * @since 21.01.2021 - */ -public class EntityTripodPeriscope extends Entity implements IEntityZoomProvider, IEntityAdditionalSpawnData -{ - private static final IAdvancedZoomTool ZOOM = new TripodZoom(); - public int setupTime = 0; - public float periscopeYaw = 0, periscopeNextYaw = 0; - - public EntityTripodPeriscope(World worldIn) - { - super(worldIn); - } - - @Override - protected void entityInit() - { - setSize(0.5f, 2f); - } - - @Override - public void onUpdate() - { - if(!world.isRemote&&world.getTotalWorldTime()%20==0&&!world.getBlockState(getPosition().down()).isSideSolid(world, getPosition().down(), EnumFacing.UP)) - { - setDead(); - entityDropItem(this.getPickedResult(null), 0f); - } - - //setupTime = 0; - if(setupTime < TripodPeriscope.setupTime) - setupTime += 1; - else - { - if(getPassengers().size() > 0) - { - Entity user = getPassengers().get(0); - - aimAt(user.getRotationYawHead()); - } - } - - super.onUpdate(); - } - - @Override - protected void removePassenger(Entity passenger) - { - if(world.isRemote&&passenger instanceof EntityPlayerSP) - { - CameraHandler.setEnabled(false); - ZoomHandler.isZooming = false; - } - super.removePassenger(passenger); - } - - @Override - public AxisAlignedBB getCollisionBoundingBox() - { - return getEntityBoundingBox(); - } - - @Override - public boolean processInitialInteract(EntityPlayer player, EnumHand hand) - { - if(!world.isRemote&&player.isSneaking()&&this.getPassengers().size()==0) - { - setDead(); - entityDropItem(this.getPickedResult(null), 0f); - return true; - } - if(setupTime==TripodPeriscope.setupTime&&player.getRidingEntity()!=this&&this.getPassengers().size()==0) - { - player.startRiding(this); - return true; - } - else - return true; - } - - @Override - public boolean canBeCollidedWith() - { - return true; - } - - @Override - public void updatePassenger(Entity passenger) - { - if(this.isPassenger(passenger)) - { - BlockPos pos = getPosition(); - float headYaw = MathHelper.wrapDegrees(this.periscopeYaw); - double true_angle = Math.toRadians((-headYaw) > 180?360f-(-headYaw): (-headYaw)); - double true_angle2 = Math.toRadians((-headYaw-90) > 180?360f-(-headYaw-90): (-headYaw-90)); - Vec3d pos2 = IIMath.offsetPosDirection(-0.5f, true_angle, 0); - Vec3d pos3 = IIMath.offsetPosDirection(-0.0625f/2f, true_angle2, 0); - - passenger.setPosition(pos.getX()+0.5+pos2.x+pos3.x, pos.getY(), pos.getZ()+0.5+pos2.z+pos3.z); - } - } - - @Override - public void applyOrientationToEntity(Entity entityToUpdate) - { - entityToUpdate.setRenderYawOffset(this.periscopeYaw); - entityToUpdate.setRotationYawHead(entityToUpdate.rotationYaw); - } - - @Override - protected void readEntityFromNBT(NBTTagCompound compound) - { - this.setupTime = compound.getInteger("setupTime"); - this.periscopeYaw = compound.getFloat("periscopeYaw"); - this.periscopeNextYaw = compound.getFloat("periscopeNextYaw"); - } - - @Override - protected void writeEntityToNBT(NBTTagCompound compound) - { - compound.setInteger("setupTime", setupTime); - compound.setFloat("periscopeYaw", periscopeYaw); - compound.setFloat("periscopeNextYaw", periscopeNextYaw); - } - - public void aimAt(float yaw) - { - periscopeNextYaw = MathHelper.wrapDegrees(yaw); - float y = MathHelper.wrapDegrees(360+periscopeNextYaw-this.periscopeYaw); - this.periscopeYaw = MathHelper.wrapDegrees(periscopeYaw+(Math.signum(y)*MathHelper.clamp(Math.abs(y), 0, TripodPeriscope.turnSpeed))); - } - - @Override - public ItemStack getPickedResult(RayTraceResult target) - { - return new ItemStack(IIContent.itemTripodPeriscope); - } - - @Override - public boolean shouldRiderSit() - { - return false; - } - - @Override - public IAdvancedZoomTool getZoom() - { - return ZOOM; - } - - @Override - public void writeSpawnData(ByteBuf buffer) - { - buffer.writeInt(this.setupTime); - } - - @Override - public void readSpawnData(ByteBuf additionalData) - { - this.setupTime = additionalData.readInt(); - } - - private static class TripodZoom implements IAdvancedZoomTool - { - private static final ResourceLocation SIGHTS_TEXTURE = new ResourceLocation(ImmersiveIntelligence.MODID, "textures/gui/item/binoculars.png"); - - @Override - @SideOnly(Side.CLIENT) - public ResourceLocation getZoomOverlayTexture(ItemStack stack, EntityPlayer player) - { - return SIGHTS_TEXTURE; - } - - @Override - public boolean shouldZoom(ItemStack stack, EntityPlayer player) - { - return true; - } - - @Override - public float[] getZoomSteps(ItemStack stack, EntityPlayer player) - { - return tripodZoomSteps; - } - } -} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/hans/tasks/AIHansMachinegun.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/hans/tasks/AIHansMachinegun.java index c1bc0094f..9022f5256 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/hans/tasks/AIHansMachinegun.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/hans/tasks/AIHansMachinegun.java @@ -3,19 +3,9 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.ai.EntityAIBase; -import net.minecraft.inventory.EntityEquipmentSlot; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.math.MathHelper; -import pl.pabilo8.immersiveintelligence.api.ammo.enums.CoreType; -import pl.pabilo8.immersiveintelligence.api.ammo.enums.FuseType; -import pl.pabilo8.immersiveintelligence.common.IIContent; -import pl.pabilo8.immersiveintelligence.common.entity.EntityMachinegun; -import pl.pabilo8.immersiveintelligence.common.item.ammo.ItemIIBulletMagazine.Magazines; -import pl.pabilo8.immersiveintelligence.common.network.IIPacketHandler; -import pl.pabilo8.immersiveintelligence.common.network.messages.MessageEntityNBTSync; -import pl.pabilo8.immersiveintelligence.common.util.IIColor; -import pl.pabilo8.immersiveintelligence.common.util.easynbt.EasyNBT; +import pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon.EntityMachinegun; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT.SyncEvents; import javax.annotation.Nullable; @@ -67,30 +57,23 @@ public void updateTask() target = hans.getAttackTarget(); if(mg!=null) { - mg.shoot = false; - - NBTTagCompound update = new NBTTagCompound(); - mg.writeEntityToNBT(update); - IIPacketHandler.INSTANCE.sendToAllAround(new MessageEntityNBTSync(mg, update), IIPacketHandler.targetPointFromEntity(mg, 24)); - - if(mg.magazine1.isEmpty()) + if(mg.controls!=null) { - if(hans.getHeldItemMainhand().isEmpty()) - { - - ItemStack ammoStack = IIContent.itemAmmoMachinegun.getAmmoStack(IIContent.ammoCoreBrass, CoreType.PIERCING, FuseType.CONTACT, IIContent.ammoComponentTracerPowder); - IIContent.itemAmmoMachinegun.setComponentNBT(ammoStack, EasyNBT.parseNBT("{colour: %s}", IIColor.MC_DARK_RED)); - ItemStack magazine = IIContent.itemBulletMagazine.getMagazine(Magazines.MACHINEGUN, ammoStack); - - - hans.setItemStackToSlot(EntityEquipmentSlot.MAINHAND, magazine); - } + mg.controls.setKey("fire", false); + if(mg.controls.isDirty()) + mg.updateEntityForEvent(SyncEvents.ENTITY_VEHICLE_CONTROLS); } - else if(target!=null) + + if(target!=null) { hans.getLookHelper().setLookPositionWithEntity(target, hans.getHorizontalFaceSpeed(), hans.getVerticalFaceSpeed()); if(isAimedAt()) - mg.shoot = true; + if(mg.controls!=null) + { + mg.controls.setKey("fire", true); + if(mg.controls.isDirty()) + mg.updateEntityForEvent(SyncEvents.ENTITY_VEHICLE_CONTROLS); + } } } @@ -98,7 +81,7 @@ else if(target!=null) public boolean isAimedAt() { - //TODO: 15.02.2024 use new calculation method - return MathHelper.wrapDegrees(hans.rotationPitch)-mg.gunPitch < 5&&MathHelper.wrapDegrees(hans.rotationYawHead)-MathHelper.wrapDegrees(mg.rotationYaw) < 5; + return MathHelper.wrapDegrees(hans.rotationPitch)-mg.getGunPitch(0f) < 5 + &&MathHelper.wrapDegrees(hans.rotationYawHead)-MathHelper.wrapDegrees(mg.rotationYaw) < 5; } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/hans/tasks/AIHansMortar.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/hans/tasks/AIHansMortar.java index 238f972ae..c88f61ce1 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/hans/tasks/AIHansMortar.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/hans/tasks/AIHansMortar.java @@ -12,7 +12,7 @@ import pl.pabilo8.immersiveintelligence.api.ammo.enums.FuseType; import pl.pabilo8.immersiveintelligence.api.ammo.utils.IIAmmoUtils; import pl.pabilo8.immersiveintelligence.common.IIContent; -import pl.pabilo8.immersiveintelligence.common.entity.EntityMortar; +import pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon.EntityMortar; import pl.pabilo8.immersiveintelligence.common.util.IIColor; import pl.pabilo8.immersiveintelligence.common.util.easynbt.EasyNBT; @@ -74,8 +74,13 @@ public void updateTask() float pp = getAnglePrediction(mortar.getPositionVector().addVector(0, 1, 0), t.getPositionVector(), new Vec3d(t.motionX, t.motionY, t.motionZ))[1]; - mortar.gunPitchUp = (90+mortar.rotationPitch)-pp < 0; - mortar.gunPitchDown = (90+mortar.rotationPitch)-pp > 0; + boolean pitchUp = (90+mortar.rotationPitch)-pp < 0; + boolean pitchDown = (90+mortar.rotationPitch)-pp > 0; + if(mortar.controls!=null) + { + mortar.controls.setKey("pitchUp", pitchUp); + mortar.controls.setKey("pitchDown", pitchDown); + } if(Math.abs((90+mortar.rotationPitch)-pp) <= 5) { if(hans.getHeldItemMainhand().isEmpty()) @@ -86,11 +91,13 @@ public void updateTask() hans.setItemStackToSlot(EntityEquipmentSlot.MAINHAND, shell); } - if(mortar.shootingProgress==0) - mortar.fireKeyPress = true; - - if(mortar.fireKeyPress) - mortar.getEntityWorld().getEntitiesWithinAABB(EntityItem.class, mortar.getEntityBoundingBox()).forEach(Entity::setDead); + if(mortar.controls!=null) + { + if(mortar.shootingProgress==0) + mortar.controls.setKey("fire", true); + if(mortar.controls.getKey("fire")) + mortar.getEntityWorld().getEntitiesWithinAABB(EntityItem.class, mortar.getEntityBoundingBox()).forEach(Entity::setDead); + } } } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMachinegun.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMachinegun.java new file mode 100644 index 000000000..1de4a3241 --- /dev/null +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMachinegun.java @@ -0,0 +1,302 @@ +package pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.DamageSource; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; +import net.minecraftforge.fluids.FluidUtil; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import pl.pabilo8.immersiveintelligence.api.MachinegunCoolantHandler; +import pl.pabilo8.immersiveintelligence.api.ammo.utils.AmmoFactory; +import pl.pabilo8.immersiveintelligence.api.utils.IEntitySpecialRepairable; +import pl.pabilo8.immersiveintelligence.api.utils.camera.IEntityZoomProvider; +import pl.pabilo8.immersiveintelligence.api.utils.camera.ZoomSettings; +import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedTextOverlay; +import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedZoomTool; +import pl.pabilo8.immersiveintelligence.client.ClientProxy; +import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons.Machinegun; +import pl.pabilo8.immersiveintelligence.common.IIContent; +import pl.pabilo8.immersiveintelligence.common.entity.ammo.types.EntityAmmoProjectile; +import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleControls; +import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleDurability; +import pl.pabilo8.immersiveintelligence.common.item.weapons.ItemIIWeaponUpgrade.WeaponUpgrade; +import pl.pabilo8.immersiveintelligence.common.network.IIPacketHandler; +import pl.pabilo8.immersiveintelligence.common.network.messages.MessagePlayerAimAnimationSync; +import pl.pabilo8.immersiveintelligence.common.util.FilteredFluidTank; +import pl.pabilo8.immersiveintelligence.common.util.IIMath; +import pl.pabilo8.immersiveintelligence.common.util.IIReference; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT.SyncEvents; +import pl.pabilo8.immersiveintelligence.common.util.gun.GunRecoil; +import pl.pabilo8.immersiveintelligence.common.util.gun.GunShootingHandler; + +import javax.annotation.Nonnull; +import java.util.EnumSet; + +/** + * @author Pabilo8 (pabilo@iiteam.net) + * @updated 15.05.2026 + * @ii-approved 0.3.1 + * @since 01.11.2019 + */ +public class EntityMachinegun extends EntityMountedWeapon implements IAdvancedTextOverlay, IEntitySpecialRepairable, IEntityZoomProvider +{ + private final static ZoomSettings SCOPE = new ZoomSettings(Machinegun.machinegunScopeMaxZoom, + IIReference.RES_TEXTURES_GUI.with("item/machinegun/scope.png")); + private final static ZoomSettings SCOPE_IR = new ZoomSettings(Machinegun.machinegunScopeMaxZoom, + IIReference.RES_TEXTURES_GUI.with("item/machinegun/scope_ir.png")); + private final AmmoFactory ammoFactory = new AmmoFactory<>(this); + public EnumSet upgrades = EnumSet.noneOf(WeaponUpgrade.class); + + @SyncNBT(events = {SyncEvents.ENTITY_CUSTOM1, SyncEvents.ENTITY_CUSTOM2}) + public GunRecoil recoil = new GunRecoil(); + @SyncNBT(events = {SyncEvents.ENTITY_CUSTOM1, SyncEvents.ENTITY_CUSTOM2}) + public GunShootingHandler shooting = new GunShootingHandler(); + + //Second magazine is an upgrade + @SyncNBT(events = SyncEvents.ENTITY_CUSTOM1) + public ItemStack magazine1 = ItemStack.EMPTY, magazine2 = ItemStack.EMPTY; + + @SyncNBT(events = {SyncEvents.ENTITY_CUSTOM1, SyncEvents.ENTITY_CUSTOM2}) + public float setYaw = 0; + @SyncNBT(events = SyncEvents.ENTITY_CUSTOM1) + public VehicleDurability shield = new VehicleDurability(Machinegun.shieldStrengthInitial, 2); + + @SyncNBT(events = SyncEvents.ENTITY_INTERACT) + public FilteredFluidTank tank = new FilteredFluidTank(0) + .withInputFilter(MachinegunCoolantHandler::isValidCoolant); + + private boolean lastAimState = false; + + public EntityMachinegun(World world) + { + super(world); + this.baseAabb = new AxisAlignedBB(-0.35, 0, -0.35, 0.35, 0.65, 0.35); + this.controls = new VehicleControls().withStates("fire", "reload", "aim"); + if(world.isRemote) + this.controls + .withKeyBinding(ClientProxy.keybindManualReload, "reload") + .withKeyBinding(ClientProxy.keybindZoom, "aim"); + + setOriginStack(new ItemStack(IIContent.itemMachinegun)); + } + + public EntityMachinegun(World world, BlockPos pos, float yaw, ItemStack stack) + { + this(world); + this.setPosition(pos.getX(), pos.getY(), pos.getZ()); + this.setYaw = yaw; + setOriginStack(stack); + } + + @Override + protected void setOriginStack(ItemStack stack) + { + super.setOriginStack(stack); + + //Set defaults + this.upgrades = EnumSet.noneOf(WeaponUpgrade.class); + this.maxSetupTime = Machinegun.setupTime; + this.aim.withAimCorrectionFunction(this.ammoFactory::getAnglePrediction) + .withPitchLimit(-25.0f, 25f) + .withYawLimit(-55.0f, 55f) + .withAimSpeed(2f, 1f); + this.recoil.withRecoilLimits(22.5f, 22.5f) + .withRecoilStrength(Machinegun.recoilVertical, Machinegun.recoilHorizontal, 0.5f, 0.05f) + .withOverheating(Machinegun.maxOverheat, 0.75f, () -> tank); + + //Set upgrade parameters + assert stack.getItem()==IIContent.itemMachinegun; + this.upgrades = IIContent.itemMachinegun.listUpgrades(stack, WeaponUpgrade.class); + for(WeaponUpgrade upgrade : upgrades) + switch(upgrade) + { + case HEAVY_BARREL: + this.shooting.withMaxShotDelay(Machinegun.heavyBarrelFireDelay); + break; + case WATER_COOLING: + //TODO: 17.05.2026 + this.shooting.withMaxShotDelay(Machinegun.heavyBarrelFireDelay); + break; + case SECOND_MAGAZINE: + break; + case HASTY_BIPOD: + this.maxSetupTime = (int)(this.maxSetupTime*Machinegun.hastyBipodSetupTimeMultiplier); + break; + case PRECISE_BIPOD: + this.maxSetupTime = (int)(this.maxSetupTime*Machinegun.preciseBipodSetupTimeMultiplier); + break; + case SCOPE: + break; + case INFRARED_SCOPE: + break; + case SHIELD: + this.maxSetupTime = (int)(this.maxSetupTime*Machinegun.shieldSetupTimeMultiplier); + break; + case BELT_FED_LOADER: + this.maxSetupTime = (int)(this.maxSetupTime*Machinegun.beltFedLoaderSetupTimeMultiplier); + break; + case TRIPOD: + this.maxSetupTime = (int)(this.maxSetupTime*Machinegun.tripodSetupTimeMultiplier); + this.aim.withYawLimit(-82.5f, 82.5f); + break; + default: + break; + } + } + + @Override + @Nonnull + protected Vec3d getPassengerPosition(Entity passenger) + { + return IIMath.offsetPosDirectionXZ(-1.65f, -0.25f, rotationYaw, rotationPitch) + .addVector(0.5, -1.15, 0.5); + } + + @Override + public void onEntityUpdate() + { + super.onEntityUpdate(); + + //Update components + recoil.update(); + shooting.update(); + + //Apply controls + if(!world.isRemote&&isBeingRidden()) + { + Entity operator = getPassengers().get(0); + boolean currentAim = isAiming(); + if(currentAim!=lastAimState) + { + IIPacketHandler.INSTANCE.sendToDimension(new MessagePlayerAimAnimationSync(operator, currentAim), + this.world.provider.getDimension()); + lastAimState = currentAim; + } + } + } + + @Override + public boolean processInitialInteract(EntityPlayer player, EnumHand hand) + { + //Try filling coolant tank + if(FluidUtil.interactWithFluidHandler(player, hand, tank)) + { + if(!world.isRemote) + updateEntityForEvent(SyncEvents.ENTITY_INTERACT); + return true; + } + return super.processInitialInteract(player, hand); + } + + @Override + protected void removePassenger(Entity passenger) + { + if(controls!=null) + { + controls.setKey("fire", false); + controls.setKey("aim", false); + } + lastAimState = false; + if(!world.isRemote) + IIPacketHandler.INSTANCE.sendToDimension(new MessagePlayerAimAnimationSync(passenger, false), this.world.provider.getDimension()); + super.removePassenger(passenger); + } + + + @Override + public void applyOrientationToEntity(Entity entityToUpdate) + { + entityToUpdate.prevRotationYaw = aim.clampYawToRange(entityToUpdate.prevRotationYaw); + entityToUpdate.rotationYaw = aim.clampYawToRange(entityToUpdate.rotationYaw); + entityToUpdate.prevRotationPitch = aim.clampPitchToRange(entityToUpdate.prevRotationYaw); + entityToUpdate.rotationPitch = aim.clampPitchToRange(entityToUpdate.rotationPitch); + } + + @Override + public boolean attackEntityFrom(DamageSource source, float amount) + { + if(!isDead&&source.isProjectile()) + { + Vec3d attackVector = source.getDamageLocation(); + if(attackVector!=null) + { + attackVector = attackVector.subtract(posX, posY, posZ); + if(getHorizontalFacing()==EnumFacing.getFacingFromVector((float)attackVector.x, (float)attackVector.y, (float)attackVector.z)) + { + shield.attackFrom(source, amount); + return shield.isDead(); + } + } + } + return super.attackEntityFrom(source, amount); + } + + //--- Getters ---// + + public float getGunYaw(float partialTicks) + { + return aim.getYaw(partialTicks); + } + + public float getGunPitch(float partialTicks) + { + return aim.getPitch(partialTicks); + } + + private boolean isFiring() + { + return controls.getKey("fire"); + } + + private boolean isAiming() + { + return controls.getKey("aim"); + } + + //--- IEntitySpecialRepairable ---// + + @Override + public boolean canRepair() + { + return shield.canRepair(); + } + + @Override + public boolean repair(int repairPoints) + { + return shield.repair(repairPoints); + } + + @Override + public int getRepairCost() + { + return 1; + } + + //--- IEntityZoomProvider ---// + + @Override + public IAdvancedZoomTool getZoom() + { + //TODO: 15.05.2026 check for scope + return null; + } + + //--- IAdvancedTextOverlay ---// + + @SideOnly(Side.CLIENT) + @Override + public String[] getOverlayText(EntityPlayer player, RayTraceResult mop) + { + return new String[0]; + } +} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMortar.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMortar.java new file mode 100644 index 000000000..12fdbff62 --- /dev/null +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMortar.java @@ -0,0 +1,212 @@ +package pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon; + +import blusunrize.immersiveengineering.client.ClientUtils; +import blusunrize.immersiveengineering.common.util.Utils; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.DamageSource; +import net.minecraft.util.EnumHand; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import pl.pabilo8.immersiveintelligence.ImmersiveIntelligence; +import pl.pabilo8.immersiveintelligence.api.ammo.utils.AmmoFactory; +import pl.pabilo8.immersiveintelligence.api.utils.camera.IEntityZoomProvider; +import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedZoomTool; +import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons.Mortar; +import pl.pabilo8.immersiveintelligence.common.IIContent; +import pl.pabilo8.immersiveintelligence.common.IISounds; +import pl.pabilo8.immersiveintelligence.common.entity.ammo.types.EntityAmmoArtilleryProjectile; +import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleControls; +import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleControls.MouseBinding; +import pl.pabilo8.immersiveintelligence.common.util.IIMath; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT.SyncEvents; + +import javax.annotation.Nonnull; + +/** + * @author Pabilo8 (pabilo@iiteam.net) + * @updated 15.05.2026 + * @ii-approved 0.3.1 + * @since 21.01.2021 + */ +public class EntityMortar extends EntityMountedWeapon implements IEntityZoomProvider +{ + private static final MortarSights SIGHTS = new MortarSights(); + private final AmmoFactory ammoFactory = new AmmoFactory<>(this); + + @SyncNBT(events = SyncEvents.ENTITY_CUSTOM1) + public float shootingProgress = 0f; + + public EntityMortar(World world) + { + super(world); + this.baseAabb = new AxisAlignedBB(-0.5, 0, -0.5, 0.5, 1.5, 0.5); + this.maxSetupTime = Mortar.setupTime; + + this.aim.withYawLimit(-180f, 180f) + .withPitchLimit(45f, 85f) + .withCurrentAngles(0f, 85f); + + this.controls = new VehicleControls().withStates("fire", "pitchUp", "pitchDown"); + if(world.isRemote) + this.controls + .withMouseBinding(MouseBinding.MOUSE_RIGHT, "fire") + .withKeyBinding(ClientUtils.mc().gameSettings.keyBindForward, "pitchUp") + .withKeyBinding(ClientUtils.mc().gameSettings.keyBindBack, "pitchDown"); + + setOriginStack(new ItemStack(IIContent.itemMortar)); + } + + @Override + @Nonnull + protected Vec3d getPassengerPosition(Entity passenger) + { + return IIMath.offsetPosDirectionXZ(0.125f, -0.75f, this.rotationYaw, 0) + .addVector(0, -0.5, 0); + } + + @Override + public void applyOrientationToEntity(Entity entityToUpdate) + { + float yy = this.rotationYaw; + if(isSetupComplete()) + { + float setupWindow = Math.max(1f, maxSetupTime*0.2f); + yy += MathHelper.clamp((setupTime/setupWindow), 0, 1)*25; + } + if(shootingProgress > 0) + { + float ff = shootingProgress/Mortar.shootTime; + if(ff < 0.3) + yy += MathHelper.clamp(ff/0.1, 0, 1)*65; + else if(ff < 0.4) + yy += (1f-MathHelper.clamp((ff-0.3)/0.1, 0, 1))*65; + } + entityToUpdate.setRenderYawOffset(yy); + + float f = MathHelper.wrapDegrees(entityToUpdate.rotationYaw-(this.rotationYaw)); + float f1 = MathHelper.clamp(f, -75.0F, 75.0F); + entityToUpdate.prevRotationYaw += f1-f; + entityToUpdate.rotationYaw += f1-f; + + entityToUpdate.setRotationYawHead(entityToUpdate.rotationYaw); + } + + @Override + public void onEntityUpdate() + { + super.onEntityUpdate(); + + if(!isSetupComplete()) + return; + + float prevShootingProgress = shootingProgress; + + if(shootingProgress==0) + { + if(controls.getKey("fire")&&!getPassengers().isEmpty()) + { + Entity entity = getPassengers().get(0); + if(entity instanceof EntityLivingBase) + { + ItemStack heldItem = ((EntityLivingBase)entity).getHeldItem(EnumHand.MAIN_HAND); + if(heldItem.getItem()==IIContent.itemAmmoMortar) + { + shootingProgress = 1; + controls.setKey("fire", false); + } + } + } + else if(controls.getKey("pitchUp")) + aim.setTarget(aim.getTargetYaw(), aim.getTargetPitch()+0.5f); + else if(controls.getKey("pitchDown")) + aim.setTarget(aim.getTargetYaw(), aim.getTargetPitch()-0.5f); + } + else if(!getPassengers().isEmpty()) + { + Entity entity = getPassengers().get(0); + if(entity instanceof EntityLivingBase) + { + ItemStack heldItem = ((EntityLivingBase)entity).getHeldItem(EnumHand.MAIN_HAND); + if(heldItem.getItem()==IIContent.itemAmmoMortar||shootingProgress > Mortar.shootTime*0.45) + { + if(shootingProgress < Mortar.shootTime) + shootingProgress++; + else + shootingProgress = 0; + if(shootingProgress==Math.round(Mortar.shootTime*0.2f)) + world.playSound(null, posX, posY, posZ, IISounds.mortarLoad, SoundCategory.PLAYERS, 1.25f, 1f); + if(shootingProgress==Math.round(Mortar.shootTime*0.55f)) + if(!world.isRemote) + { + //Play firing sound + world.playSound(null, posX, posY, posZ, IISounds.mortarShot, SoundCategory.PLAYERS, 1.25f, 1f); + + //Create the ammo piece + ammoFactory.setPosition(getPositionVector()) + .setPositionAndVelocity(this.getPositionVector(), this.aim, 2f, 1f) + .setStack(Utils.copyStackWithAmount(heldItem, 1)) + .setShooterAndGun(getPassengers().get(0), this) + .create(); + heldItem.shrink(1); + } + } + else + shootingProgress = 0; + } + } + else + shootingProgress = 0; + if(!world.isRemote&&shootingProgress!=prevShootingProgress) + updateEntityForEvent(SyncEvents.ENTITY_CUSTOM1); + } + + @Override + public boolean attackEntityFrom(DamageSource source, float amount) + { + return amount > 4; + } + + @Override + public IAdvancedZoomTool getZoom() + { + return SIGHTS; + } + + private static class MortarSights implements IAdvancedZoomTool + { + private static final ResourceLocation SIGHTS_TEXTURE = new ResourceLocation(ImmersiveIntelligence.MODID, "textures/gui/item/mortar.png"); + + @Override + @SideOnly(Side.CLIENT) + public ResourceLocation getZoomOverlayTexture(ItemStack stack, EntityPlayer player) + { + return SIGHTS_TEXTURE; + } + + @Override + public boolean shouldZoom(ItemStack stack, EntityPlayer player) + { + Entity ridingEntity = player.getRidingEntity(); + return ridingEntity instanceof EntityMortar&&((EntityMortar)ridingEntity).shootingProgress==0; + } + + @Override + public float[] getZoomSteps(ItemStack stack, EntityPlayer player) + { + Entity ridingEntity = player.getRidingEntity(); + if(ridingEntity instanceof EntityMortar) + return new float[]{1f-Math.min(0.75f/(ridingEntity.rotationPitch/-90f), 0.975f)}; + return new float[]{0}; + } + } +} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMountedWeapon.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMountedWeapon.java new file mode 100644 index 000000000..dd2c56fbe --- /dev/null +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMountedWeapon.java @@ -0,0 +1,288 @@ +package pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon; + +import blusunrize.immersiveengineering.api.tool.ZoomHandler; +import io.netty.buffer.ByteBuf; +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityPlayerSP; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; +import net.minecraftforge.fml.common.network.ByteBufUtils; +import net.minecraftforge.fml.common.registry.IEntityAdditionalSpawnData; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import pl.pabilo8.immersiveintelligence.client.util.CameraHandler; +import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleControls; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT.SyncEvents; +import pl.pabilo8.immersiveintelligence.common.util.entity.ISyncNBTEntity; +import pl.pabilo8.immersiveintelligence.common.util.gun.GunAimCoordinate; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +/** + * Common class for mounted weapons + * + * @author Pabilo8 (pabilo@iiteam.net) + * @ii-approved 0.3.1 + * @since 15.05.2026 + */ +public abstract class EntityMountedWeapon extends Entity implements IEntityAdditionalSpawnData, ISyncNBTEntity +{ + @SyncNBT(events = SyncEvents.ENTITY_VEHICLE_CONTROLS) + public VehicleControls controls = new VehicleControls(); + @SyncNBT(events = {SyncEvents.ENTITY_CUSTOM1, SyncEvents.ENTITY_CUSTOM2}) + public GunAimCoordinate aim = new GunAimCoordinate(); + @SyncNBT(events = SyncEvents.ENTITY_CUSTOM1) + public int setupTime = 0, maxSetupTime = 1; + @SyncNBT(events = SyncEvents.ENTITY_INTERACT) + private ItemStack originStack = ItemStack.EMPTY; + + protected AxisAlignedBB baseAabb = new AxisAlignedBB(-0.5, -0.5, -0.5, 0.5, 0.5, 0.5); + + public EntityMountedWeapon(World world) + { + super(world); + } + + @Override + protected final void entityInit() + { + //Do not overwrite, breaks loading order + } + + @Override + public final void onUpdate() + { + //Just so child classes do not overwrite it + super.onUpdate(); + } + + @Override + public void onEntityUpdate() + { + super.onEntityUpdate(); + + if(setupTime < maxSetupTime) + setupTime += 1; + + //Check if there is a block supporting the weapon + if(checkSupportAndDrop()) + return; + + //Update look angle + this.prevRotationYaw = aim.getYaw(0); + this.prevRotationPitch = aim.getPitch(0); + + //Check and send controls from client + if(isBeingRidden()) + { + aim.update(); + if(world.isRemote) + handleClientControls(); + } + + //Update displayed angles + this.rotationYaw = aim.getYaw(0); + this.rotationPitch = aim.getPitch(0); + } + + protected boolean checkSupportAndDrop() + { + BlockPos checkPos = getSupportCheckPos(); + if(world.isRemote||ticksExisted%20!=0||checkPos==null) + return false; + if(!world.getBlockState(checkPos).isSideSolid(world, checkPos, EnumFacing.UP)) + { + setDead(); + entityDropItem(originStack, 0f); + return true; + } + return false; + } + + @Nullable + protected BlockPos getSupportCheckPos() + { + return getPosition().down(); + } + + public boolean isSetupComplete() + { + return maxSetupTime <= 0||setupTime >= maxSetupTime; + } + + @SideOnly(Side.CLIENT) + private void handleClientControls() + { + EntityPlayer player = Minecraft.getMinecraft().player; + if(player.getRidingEntity()!=this) + return; + if(controls!=null&&controls.clientUpdate()) + sendServerUpdateForEvent(SyncEvents.ENTITY_VEHICLE_CONTROLS); + } + + /** + * Sets the itemstack from which this weapon is created. + * + * @param stack the itemstack + * @implNote Override to check for ugprades to be applied + */ + protected void setOriginStack(ItemStack stack) + { + this.originStack = stack; + } + + public final ItemStack getOriginStack() + { + return originStack; + } + + //--- Collisions ---// + + @Override + public final boolean canBeCollidedWith() + { + return true; + } + + @Override + public final AxisAlignedBB getCollisionBoundingBox() + { + return getEntityBoundingBox(); + } + + @Override + public final AxisAlignedBB getCollisionBox(Entity entityIn) + { + return getEntityBoundingBox(); + } + + @Override + public final AxisAlignedBB getEntityBoundingBox() + { + return baseAabb.offset(getPositionVector()); + } + + //--- Passenger ---// + + @Override + public boolean canPassengerSteer() + { + return false; + } + + @Override + public boolean shouldRiderSit() + { + return false; + } + + @Override + public final void updatePassenger(Entity passenger) + { + if(this.isPassenger(passenger)) + { + Vec3d pos = getPositionVector().add(getPassengerPosition(passenger)); + passenger.setPosition(pos.x, pos.y, pos.z); + } + } + + @Nonnull + protected abstract Vec3d getPassengerPosition(Entity passenger); + + @Override + protected void removePassenger(Entity passenger) + { + if(world.isRemote&&passenger instanceof EntityPlayerSP) + { + CameraHandler.setEnabled(false); + ZoomHandler.isZooming = false; + } + else + updateEntityForEvent(SyncEvents.ENTITY_PASSENGER); + super.removePassenger(passenger); + } + + @Override + public boolean processInitialInteract(EntityPlayer player, EnumHand hand) + { + //Pick up weapon + if(!world.isRemote&&player.isSneaking()&&getPassengers().isEmpty()) + { + setDead(); + entityDropItem(originStack, 0f); + return true; + } + //Enter as passenger + if(isSetupComplete()&&player.getRidingEntity()!=this&&getPassengers().isEmpty()) + { + player.startRiding(this); + if(!world.isRemote) + updateEntityForEvent(SyncEvents.ENTITY_PASSENGER); + return true; + } + return true; + } + + //--- NBT ---// + + @Override + public final void writeSpawnData(ByteBuf buffer) + { + NBTTagCompound tag = new NBTTagCompound(); + writeEntityToNBT(tag); + ByteBufUtils.writeTag(buffer, tag); + ByteBufUtils.writeItemStack(buffer, originStack); + } + + @Override + public final void readSpawnData(ByteBuf additionalData) + { + NBTTagCompound tag = ByteBufUtils.readTag(additionalData); + if(tag!=null) + readEntityFromNBT(tag); + setOriginStack(ByteBufUtils.readItemStack(additionalData)); + } + + @Override + public final void readEntityFromNBT(NBTTagCompound compound) + { + ISyncNBTEntity.super.readEntityFromNBT(compound); + } + + @Override + public final void writeEntityToNBT(NBTTagCompound compound) + { + ISyncNBTEntity.super.writeEntityToNBT(compound); + } + + //--- Misc ---// + + @Override + public final boolean canRenderOnFire() + { + return false; + } + + @Override + public final void setFire(int seconds) + { + + } + + @Override + public final ItemStack getPickedResult(RayTraceResult target) + { + return originStack; + } +} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityTripodPeriscope.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityTripodPeriscope.java new file mode 100644 index 000000000..8c57aa9e5 --- /dev/null +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityTripodPeriscope.java @@ -0,0 +1,74 @@ +package pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon; + +import net.minecraft.entity.Entity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; +import pl.pabilo8.immersiveintelligence.api.utils.camera.IEntityZoomProvider; +import pl.pabilo8.immersiveintelligence.api.utils.camera.ZoomSettings; +import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedZoomTool; +import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Tools.TripodPeriscope; +import pl.pabilo8.immersiveintelligence.common.IIContent; +import pl.pabilo8.immersiveintelligence.common.util.IIMath; +import pl.pabilo8.immersiveintelligence.common.util.IIReference; + +import javax.annotation.Nonnull; + +import static pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Tools.TripodPeriscope.tripodZoomSteps; + +/** + * @author Pabilo8 (pabilo@iiteam.net) + * @updated 15.05.2026 + * @ii-approved 0.3.1 + * @since 21.01.2021 + */ +public class EntityTripodPeriscope extends EntityMountedWeapon implements IEntityZoomProvider +{ + private static final ZoomSettings ZOOM = new ZoomSettings(tripodZoomSteps, IIReference.RES_TEXTURES_GUI.with("item/binoculars.png")) + .withZoomEnabled(true); + + public EntityTripodPeriscope(World world) + { + super(world); + this.baseAabb = new AxisAlignedBB(-0.5, -0.5, -0.5, 0.5, 0.5, 0.5); + this.aim.withYawLimit(-180f, 180f) + .withPitchLimit(0f, 0f) + .withAimSpeed(TripodPeriscope.turnSpeed, 1f); + + this.maxSetupTime = TripodPeriscope.setupTime; + this.setOriginStack(new ItemStack(IIContent.itemTripodPeriscope)); + } + + @Override + @Nonnull + protected Vec3d getPassengerPosition(Entity passenger) + { + return IIMath.offsetPosDirectionXZ(-0.5, -0.0625f/2f, this.aim.getYaw(0), 0); + } + + @Override + public void onEntityUpdate() + { + super.onEntityUpdate(); + + if(isSetupComplete()&&!getPassengers().isEmpty()) + { + Entity user = getPassengers().get(0); + aim.setTarget(user.getRotationYawHead(), 0); + } + } + + @Override + public void applyOrientationToEntity(Entity entityToUpdate) + { + entityToUpdate.setRenderYawOffset(this.aim.getCurrentYaw()); + entityToUpdate.setRotationYawHead(entityToUpdate.rotationYaw); + } + + @Override + public IAdvancedZoomTool getZoom() + { + return ZOOM; + } +} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/VehicleControls.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/VehicleControls.java index 0bce69763..c49641278 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/VehicleControls.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/VehicleControls.java @@ -2,10 +2,12 @@ import net.minecraft.client.settings.KeyBinding; import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.client.event.MouseEvent; import net.minecraftforge.common.util.INBTSerializable; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +import javax.annotation.Nonnull; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; @@ -20,6 +22,7 @@ public class VehicleControls implements INBTSerializable private final Map states = new HashMap<>(); @SideOnly(Side.CLIENT) private Map keybinds; + private Map mousebinds; private boolean dirty = false; public VehicleControls() @@ -27,14 +30,14 @@ public VehicleControls() } - public VehicleControls withState(String name) + public VehicleControls withState(@Nonnull String name) { states.put(name, false); this.dirty = true; return this; } - public VehicleControls withStates(String... names) + public VehicleControls withStates(@Nonnull String... names) { for(String s : names) states.put(s, false); @@ -43,7 +46,7 @@ public VehicleControls withStates(String... names) } @SideOnly(Side.CLIENT) - public VehicleControls withKeyBinding(KeyBinding key, String name) + public VehicleControls withKeyBinding(@Nonnull KeyBinding key, @Nonnull String name) { states.put(name, false); if(keybinds==null) @@ -53,25 +56,90 @@ public VehicleControls withKeyBinding(KeyBinding key, String name) return this; } + @SideOnly(Side.CLIENT) + public VehicleControls withMouseBinding(@Nonnull MouseBinding key, @Nonnull String name) + { + states.put(name, false); + if(mousebinds==null) + mousebinds = new HashMap<>(); + mousebinds.put(key, name); + this.dirty = true; + return this; + } + @SideOnly(Side.CLIENT) public boolean clientUpdate() { this.dirty = false; - if(keybinds!=null) - for(Entry entry : keybinds.entrySet()) - { - KeyBinding keyBinding = entry.getKey(); - states.compute(entry.getValue(), (name, current) -> { - boolean keyDown = keyBinding.isKeyDown(); - if(keyDown!=current) - this.dirty = true; - return keyDown; - }); - - } + if(keybinds==null) + keybinds = new HashMap<>(); + + for(Entry entry : keybinds.entrySet()) + { + KeyBinding keyBinding = entry.getKey(); + states.compute(entry.getValue(), (name, current) -> { + boolean keyDown = keyBinding.isKeyDown(); + //noinspection DataFlowIssue + if(keyDown!=current) + this.dirty = true; + return keyDown; + }); + } + + if(mousebinds==null) + mousebinds = new HashMap<>(); + for(Entry entry : mousebinds.entrySet()) + { + MouseBinding keyBinding = entry.getKey(); + states.compute(entry.getValue(), (name, current) -> { + boolean keyDown = keyBinding.pressed; + //noinspection DataFlowIssue + if(keyDown!=current) + this.dirty = true; + return keyDown; + }); + } + return isDirty(); } + @SideOnly(Side.CLIENT) + public boolean passMouseButtonEvent(@Nonnull MouseEvent event) + { + if(event.getDwheel()==0) + { + MouseBinding.MOUSE_WHEELUP.pressed = false; + MouseBinding.MOUSE_WHEELDOWN.pressed = false; + } + else + { + MouseBinding.MOUSE_WHEELUP.pressed = event.getDwheel() > 0; + MouseBinding.MOUSE_WHEELDOWN.pressed = event.getDwheel() < 0; + } + + switch(event.getButton()) + { + //Mouse main + case 0: + MouseBinding.MOUSE_LEFT.pressed = event.isButtonstate(); + break; + case 1: + MouseBinding.MOUSE_RIGHT.pressed = event.isButtonstate(); + break; + case 2: + MouseBinding.MOUSE_MIDDLE.pressed = event.isButtonstate(); + break; + //Mouse extra buttons + case 3: + MouseBinding.MOUSE_NEXT.pressed = event.isButtonstate(); + break; + case 4: + MouseBinding.MOUSE_PREV.pressed = event.isButtonstate(); + break; + } + return true; + } + public void setKey(String key, boolean pressed) { states.computeIfPresent(key, (k, v) -> { @@ -107,4 +175,25 @@ public void deserializeNBT(NBTTagCompound nbt) states.put(key, nbt.getBoolean(key)); this.dirty = false; } + + @SideOnly(Side.CLIENT) + public static class MouseBinding + { + public static MouseBinding MOUSE_LEFT = new MouseBinding("mouse_left"); + public static MouseBinding MOUSE_RIGHT = new MouseBinding("mouse_right"); + public static MouseBinding MOUSE_MIDDLE = new MouseBinding("mouse_middle"); + public static MouseBinding MOUSE_NEXT = new MouseBinding("mouse_next"); + public static MouseBinding MOUSE_PREV = new MouseBinding("mouse_prev"); + public static MouseBinding MOUSE_WHEELUP = new MouseBinding("mouse_wheelup"); + public static MouseBinding MOUSE_WHEELDOWN = new MouseBinding("mouse_wheeldown"); + + public String key; + public boolean pressed; + + private MouseBinding(String key) + { + this.key = key; + this.pressed = false; + } + } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/VehicleDurability.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/VehicleDurability.java index 084cc7ec3..05427d55f 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/VehicleDurability.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/VehicleDurability.java @@ -34,7 +34,7 @@ public VehicleDurability withParent(VehicleDurability parent) public void attackFrom(DamageSource source, float amount) { int damage = (int)Math.max(0, amount-(this.isDead()?this.armor*0.25: this.armor)); - if(durability==0&&this.parent!=null) + if(isDead()&&this.parent!=null) this.parent.attackFrom(source, damage); else this.durability = MathHelper.clamp(durability-damage, 0, maxDurability); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/part/EntityVehicleSeat.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/part/EntityVehicleSeat.java index a2b5adf29..802e024b5 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/part/EntityVehicleSeat.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/part/EntityVehicleSeat.java @@ -316,29 +316,7 @@ public boolean passMouseButtonEvent(MouseEvent event) { if(controls==null) return false; - - if(event.getDwheel()!=0) - controls.setKey(event.getDwheel() > 0?"mouse_wheelup": "mouse_wheeldown", true); - switch(event.getButton()) - { - //Mouse main - case 0: - controls.setKey("mouse_left", event.isButtonstate()); - break; - case 1: - controls.setKey("mouse_right", event.isButtonstate()); - break; - case 2: - controls.setKey("mouse_middle", event.isButtonstate()); - break; - //Mouse extra buttons - case 3: - controls.setKey("mouse_next", event.isButtonstate()); - break; - case 4: - controls.setKey("mouse_prev", event.isButtonstate()); - break; - } + controls.passMouseButtonEvent(event); return true; } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/item/tools/ItemIITripodPeriscope.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/item/tools/ItemIITripodPeriscope.java index ba23fbc29..fc07f850d 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/item/tools/ItemIITripodPeriscope.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/item/tools/ItemIITripodPeriscope.java @@ -13,7 +13,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; -import pl.pabilo8.immersiveintelligence.common.entity.EntityTripodPeriscope; +import pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon.EntityTripodPeriscope; import pl.pabilo8.immersiveintelligence.common.util.item.IICategory; import pl.pabilo8.immersiveintelligence.common.util.item.IIItemEnum.IIItemProperties; import pl.pabilo8.immersiveintelligence.common.util.item.ItemIIBase; @@ -82,7 +82,8 @@ public EnumActionResult onItemUse(EntityPlayer player, World worldIn, BlockPos p periscope.setPosition(d0+0.5D, d1, d2+0.5D); float f = (float)MathHelper.floor((MathHelper.wrapDegrees(player.rotationYaw-180.0F)+22.5F)/45.0F)*45.0F; periscope.setLocationAndAngles(d0+0.5D, d1, d2+0.5D, f, 0.0F); - periscope.periscopeYaw = f; + periscope.aim.withCurrentAngles(f, 0f); + periscope.aim.setTarget(f, 0f); ItemMonsterPlacer.applyItemEntityDataToEntity(worldIn, player, itemstack, periscope); worldIn.spawnEntity(periscope); worldIn.playSound(null, periscope.posX, periscope.posY, periscope.posZ, SoundEvents.ENTITY_ARMORSTAND_PLACE, SoundCategory.BLOCKS, 0.75F, 0.8F); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/item/weapons/ItemIIMachinegun.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/item/weapons/ItemIIMachinegun.java index d3841ec51..1f6a9dfd6 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/item/weapons/ItemIIMachinegun.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/item/weapons/ItemIIMachinegun.java @@ -41,7 +41,7 @@ import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons.Machinegun; import pl.pabilo8.immersiveintelligence.common.IIContent; import pl.pabilo8.immersiveintelligence.common.IIUtils; -import pl.pabilo8.immersiveintelligence.common.entity.EntityMachinegun; +import pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon.EntityMachinegun; import pl.pabilo8.immersiveintelligence.common.item.weapons.ItemIIWeaponUpgrade.WeaponUpgrade; import pl.pabilo8.immersiveintelligence.common.util.IIMath; import pl.pabilo8.immersiveintelligence.common.util.IIReference; @@ -198,12 +198,12 @@ else if(raytraceresult.typeOfHit!=RayTraceResult.Type.BLOCK) if(!intersects) return new ActionResult<>(EnumActionResult.PASS, itemstack); - EntityMachinegun maschinengewehr = new EntityMachinegun(worldIn, raytraceresult.getBlockPos(), playerIn.getRotationYawHead(), pitch, itemstack.copy()); - if(!worldIn.isRemote) - worldIn.spawnEntity(maschinengewehr); - playerIn.startRiding(maschinengewehr); - + { + EntityMachinegun mg = new EntityMachinegun(worldIn, raytraceresult.getBlockPos().up(), playerIn.getRotationYawHead(), itemstack.copy()); + worldIn.spawnEntity(mg); + playerIn.startRiding(mg); + } itemstack.shrink(1); playerIn.addStat(StatList.getObjectUseStats(this)); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/item/weapons/ItemIIMortar.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/item/weapons/ItemIIMortar.java index 93d08ab5e..161c87d35 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/item/weapons/ItemIIMortar.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/item/weapons/ItemIIMortar.java @@ -3,7 +3,6 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.SoundEvents; -import net.minecraft.item.ItemMonsterPlacer; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumFacing; @@ -11,13 +10,13 @@ import net.minecraft.util.SoundCategory; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; -import pl.pabilo8.immersiveintelligence.common.entity.EntityMortar; +import pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon.EntityMortar; import pl.pabilo8.immersiveintelligence.common.util.item.IICategory; import pl.pabilo8.immersiveintelligence.common.util.item.IIItemEnum.IIItemProperties; import pl.pabilo8.immersiveintelligence.common.util.item.ItemIIBase; +import javax.annotation.Nonnull; import java.util.List; /** @@ -35,54 +34,48 @@ public ItemIIMortar() /** * Called when a Block is right-clicked with this Item */ - public EnumActionResult onItemUse(EntityPlayer player, World worldIn, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) + @Nonnull + @Override + public EnumActionResult onItemUse(@Nonnull EntityPlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nonnull EnumHand hand, + @Nonnull EnumFacing facing, float hitX, float hitY, float hitZ) { if(facing==EnumFacing.DOWN) - { return EnumActionResult.FAIL; - } else { - boolean flag = worldIn.getBlockState(pos).getBlock().isReplaceable(worldIn, pos); + //Check if block can be replaced, if not - check if the block above can be replaced. If not - fail + boolean flag = world.getBlockState(pos).getBlock().isReplaceable(world, pos); BlockPos blockpos = flag?pos: pos.offset(facing); ItemStack itemstack = player.getHeldItem(hand); + //Check if player can place on the block if(!player.canPlayerEdit(blockpos, facing, itemstack)) - { return EnumActionResult.FAIL; - } else { BlockPos blockpos1 = blockpos.up(); - boolean flag1 = !worldIn.isAirBlock(blockpos)&&!worldIn.getBlockState(blockpos).getBlock().isReplaceable(worldIn, blockpos); - flag1 = flag1|(!worldIn.isAirBlock(blockpos1)&&!worldIn.getBlockState(blockpos1).getBlock().isReplaceable(worldIn, blockpos1)); + //Check bottom air block + boolean canBePlaced = !world.isAirBlock(blockpos)&&!world.getBlockState(blockpos).getBlock().isReplaceable(world, blockpos); + //Check top air block + canBePlaced = canBePlaced|(!world.isAirBlock(blockpos1)&&!world.getBlockState(blockpos1).getBlock().isReplaceable(world, blockpos1)); - if(flag1) - { + if(canBePlaced) return EnumActionResult.FAIL; - } else { - double d0 = blockpos.getX(); - double d1 = blockpos.getY(); - double d2 = blockpos.getZ(); - List list = worldIn.getEntitiesWithinAABBExcludingEntity(null, new AxisAlignedBB(d0, d1, d2, d0+1.0D, d1+2.0D, d2+1.0D)); - + List list = world.getEntitiesWithinAABBExcludingEntity(null, new AxisAlignedBB(blockpos, blockpos.up())); if(!list.isEmpty()) - { return EnumActionResult.FAIL; - } else { - if(!worldIn.isRemote) + if(!world.isRemote) { - worldIn.setBlockToAir(blockpos); - worldIn.setBlockToAir(blockpos1); - EntityMortar mortar = new EntityMortar(worldIn); - mortar.setLocationAndAngles(d0+0.5D, d1, d2+0.5D, MathHelper.wrapDegrees(player.rotationYaw), -80f); - ItemMonsterPlacer.applyItemEntityDataToEntity(worldIn, player, itemstack, mortar); - worldIn.spawnEntity(mortar); - worldIn.playSound(null, mortar.posX, mortar.posY, mortar.posZ, SoundEvents.ENTITY_ARMORSTAND_PLACE, SoundCategory.BLOCKS, 0.75F, 0.8F); + EntityMortar mortar = new EntityMortar(world); + mortar.setPosition(blockpos.getX(), blockpos.getY(), blockpos.getZ()); + mortar.rotationYaw = player.rotationYaw; + + world.spawnEntity(mortar); + world.playSound(null, mortar.posX, mortar.posY, mortar.posZ, SoundEvents.ENTITY_ARMORSTAND_PLACE, SoundCategory.BLOCKS, 0.75F, 0.8F); } itemstack.shrink(1); return EnumActionResult.SUCCESS; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/network/messages/MessageEntityNBTSync.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/network/messages/MessageEntityNBTSync.java index 8b217c29f..3141a6acb 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/network/messages/MessageEntityNBTSync.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/network/messages/MessageEntityNBTSync.java @@ -9,8 +9,6 @@ import net.minecraft.world.WorldServer; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import pl.pabilo8.immersiveintelligence.common.entity.EntityMachinegun; -import pl.pabilo8.immersiveintelligence.common.entity.EntityMortar; import pl.pabilo8.immersiveintelligence.common.network.IIMessage; import pl.pabilo8.immersiveintelligence.common.util.easynbt.EasyNBT; import pl.pabilo8.immersiveintelligence.common.util.entity.ISyncNBTEntity; @@ -48,14 +46,8 @@ public MessageEntityNBTSync() protected void onServerReceive(WorldServer world, NetHandlerPlayServer handler) { Entity entity = world.getEntityByID(entityID); - if(entity instanceof ISyncNBTEntity) ((ISyncNBTEntity)entity).receiveNBTMessageServer(nbt); - //TODO: 09.07.2024 get rid of ones below - else if(entity instanceof EntityMachinegun) - ((EntityMachinegun)entity).readEntityFromNBT(nbt); - else if(entity instanceof EntityMortar) - ((EntityMortar)entity).syncKeyPress(nbt); } @SideOnly(Side.CLIENT) diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/FilteredFluidTank.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/FilteredFluidTank.java index 316d82743..e72379df4 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/FilteredFluidTank.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/FilteredFluidTank.java @@ -46,6 +46,14 @@ public FilteredFluidTank withOutputFilter(Predicate outputFilter) return this; } + public float getFillPercentage() + { + int cap = getCapacity(); + if(cap==0) + return 0; + return getFluidAmount()/(float)cap; + } + @Override public boolean canDrainFluidType(@Nullable FluidStack fluid) { diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/diplomacy/DiplomacyHandler.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/diplomacy/DiplomacyHandler.java index b1b3a5369..035c66714 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/diplomacy/DiplomacyHandler.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/diplomacy/DiplomacyHandler.java @@ -110,19 +110,17 @@ public void init() UUID ieFakePlayerID = UUID.fromString("99562b85-bd1a-4ded-bb1a-c307bf0c0133"); //Create the neutral faction - if(NEUTRAL==null) - NEUTRAL = new OwnerIdentity(NEUTRAL_UUID, "Neutral") - .withMember(ieFakePlayerID, LawForm.DEFAULT.getOwnerRole()) - .withBanner(ItemBanner.makeBanner(EnumDyeColor.WHITE, null)) - .withLawForm(LawForm.COMMUNE) - .withColor(IIColor.MC_GRAY); + NEUTRAL = new OwnerIdentity(NEUTRAL_UUID, "Neutral") + .withMember(ieFakePlayerID, LawForm.DEFAULT.getOwnerRole()) + .withBanner(ItemBanner.makeBanner(EnumDyeColor.WHITE, null)) + .withLawForm(LawForm.COMMUNE) + .withColor(IIColor.MC_GRAY); //Create the global enemy faction - if(GLOBAL_ENEMY==null) - GLOBAL_ENEMY = new OwnerIdentity(GLOBAL_ENEMY_UUID, "GlobalEnemy") - .withMember(ieFakePlayerID, LawForm.DEFAULT.getOwnerRole()) - .withBanner(ItemBanner.makeBanner(EnumDyeColor.BLACK, null)) - .withColor(IIColor.MC_BLACK) - .withLawForm(LawForm.COMMISARIAT); + GLOBAL_ENEMY = new OwnerIdentity(GLOBAL_ENEMY_UUID, "GlobalEnemy") + .withMember(ieFakePlayerID, LawForm.DEFAULT.getOwnerRole()) + .withBanner(ItemBanner.makeBanner(EnumDyeColor.BLACK, null)) + .withColor(IIColor.MC_BLACK) + .withLawForm(LawForm.COMMISARIAT); //Add the default factions to the map ownerIdentities.put(NEUTRAL.getUUID(), NEUTRAL); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/GunAimCoordinate.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunAimCoordinate.java similarity index 79% rename from src/main/java/pl/pabilo8/immersiveintelligence/common/util/GunAimCoordinate.java rename to src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunAimCoordinate.java index 1e6aa195b..63c2a356c 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/GunAimCoordinate.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunAimCoordinate.java @@ -1,13 +1,13 @@ -package pl.pabilo8.immersiveintelligence.common.util; +package pl.pabilo8.immersiveintelligence.common.util.gun; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraftforge.common.util.INBTSerializable; +import pl.pabilo8.immersiveintelligence.common.util.IIMath; import pl.pabilo8.immersiveintelligence.common.util.easynbt.EasyNBT; import javax.annotation.Nonnull; -import javax.annotation.Nullable; /** * Stores yaw and pitch coordinates of a gun and provides utility methods for targetting and rendering. @@ -24,7 +24,7 @@ public class GunAimCoordinate implements INBTSerializable //Target protected float targetPitch = 0, targetYaw = 0; @Nonnull - protected AimCorrectionFunction aimCorrectionFunction = GunAimCoordinate::getDefaultAnglePrediction; + protected AimCorrectionFunction aimCorrectionFunction = GunAimCoordinate::getTargetLead; protected Vec3d target = Vec3d.ZERO; //Rotation speeds protected float aimSpeedPitch = 1, aimSpeedYaw = 1; @@ -41,7 +41,7 @@ public GunAimCoordinate withAimSpeed(float aimSpeedYaw, float aimSpeedPitch) return this; } - public GunAimCoordinate withAimCorrectionFunction(@Nullable AimCorrectionFunction aimCorrectionFunction) + public GunAimCoordinate withAimCorrectionFunction(@Nonnull AimCorrectionFunction aimCorrectionFunction) { this.aimCorrectionFunction = aimCorrectionFunction; return this; @@ -113,8 +113,8 @@ public boolean isWithinLimits(float yaw, float pitch) public void update() { //Lerp towards the target angles - this.yaw = getPitch(1f); - this.pitch = getYaw(1f); + this.yaw = getYaw(1f); + this.pitch = getPitch(1f); } //--- NBT ---// @@ -125,8 +125,8 @@ public NBTTagCompound serializeNBT() return EasyNBT.newNBT() .withFloat("pitch", pitch) .withFloat("yaw", yaw) - .withFloat("targetPitch", targetPitch) - .withFloat("targetYaw", targetYaw) + .withFloat("target_pitch", targetPitch) + .withFloat("target_yaw", targetYaw) .unwrap(); } @@ -135,8 +135,8 @@ public void deserializeNBT(NBTTagCompound nbt) { pitch = nbt.getFloat("pitch"); yaw = nbt.getFloat("yaw"); - targetPitch = nbt.getFloat("targetPitch"); - targetYaw = nbt.getFloat("targetYaw"); + targetPitch = nbt.getFloat("target_pitch"); + targetYaw = nbt.getFloat("target_yaw"); } //--- Utils ---// @@ -147,7 +147,7 @@ public float getYaw(float partialTicks) return yaw; if(yaw==targetYaw) return yaw; - return MathHelper.clamp(yaw+(partialTicks*aimSpeedYaw*Math.signum(yaw-targetYaw)), yawLimitMin, yawLimitMax); + return MathHelper.clamp(yaw+(partialTicks*aimSpeedYaw*Math.signum(targetYaw-yaw)), yawLimitMin, yawLimitMax); } public float getYawNormalized(float partialTicks) @@ -163,7 +163,7 @@ public float getPitch(float partialTicks) return pitch; if(pitch==targetPitch) return pitch; - return MathHelper.clamp(pitch+(partialTicks*aimSpeedPitch*Math.signum(pitch-targetPitch)), pitchLimitMin, pitchLimitMax); + return MathHelper.clamp(pitch+(partialTicks*aimSpeedPitch*Math.signum(targetPitch-pitch)), pitchLimitMin, pitchLimitMax); } public float getPitchNormalized(float partialTicks) @@ -184,6 +184,43 @@ public boolean isAimed(float allowedInaccuracy) &&Math.abs(MathHelper.wrapDegrees(pitch-targetPitch)) <= allowedInaccuracy; } + public float getCurrentYaw() + { + return yaw; + } + + public float getCurrentPitch() + { + return pitch; + } + + public float getTargetYaw() + { + return targetYaw; + } + + public float getTargetPitch() + { + return targetPitch; + } + + public float clampYawToRange(float yaw) + { + return MathHelper.clamp(yaw, yawLimitMin, yawLimitMax); + } + + public float clampPitchToRange(float pitch) + { + return MathHelper.clamp(pitch, pitchLimitMin, pitchLimitMax); + } + + public Vec3d getTarget(float partialTicks) + { + float yaw = getYaw(partialTicks); + float pitch = getPitch(partialTicks); + return IIMath.offsetPosDirection(1, yaw, pitch); + } + @FunctionalInterface public interface AimCorrectionFunction { @@ -197,7 +234,7 @@ public interface AimCorrectionFunction float[] getAnglePrediction(Vec3d shooterPos, Vec3d shooterMotion, Vec3d targetPos, Vec3d targetMotion); } - private static float[] getDefaultAnglePrediction(Vec3d shooterPos, Vec3d shooterMotion, Vec3d targetPos, Vec3d targetMotion) + private static float[] getTargetLead(Vec3d shooterPos, Vec3d shooterMotion, Vec3d targetPos, Vec3d targetMotion) { Vec3d vv = shooterPos.subtract(targetPos).add(targetMotion).normalize(); float yy = (float)((Math.atan2(vv.x, vv.z)*180D)/3.1415927410125732D); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunRecoil.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunRecoil.java new file mode 100644 index 000000000..599ecf679 --- /dev/null +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunRecoil.java @@ -0,0 +1,131 @@ +package pl.pabilo8.immersiveintelligence.common.util.gun; + +import blusunrize.immersiveengineering.common.util.Utils; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.INBTSerializable; +import net.minecraftforge.fluids.FluidTank; +import pl.pabilo8.immersiveintelligence.api.MachinegunCoolantHandler; +import pl.pabilo8.immersiveintelligence.common.util.IIMath; + +import javax.annotation.Nullable; +import java.util.function.Supplier; + +/** + * Used to store and calculate gun recoil and overheating. + * + * @author Pabilo8 (pabilo@iiteam.net) + * @ii-approved 0.3.1 + * @since 15.05.2026 + */ +public class GunRecoil implements INBTSerializable +{ + //--- Angles ---// + private float recoilYaw = 0, recoilPitch = 0; + private float maxRecoilPitch = 45f, maxRecoilYaw = 45f; + private float recoilStrengthVertical = 0.7f, recoilStrengthHorizontal = 0.3f, recoilDamping = 0.97f, recoilRandomness = 0.05f; + + //--- Overheating ---// + private boolean isOverheated = false; + private float overheat = 0, maxOverheat = 0, overheatDecrease = 1; + @Nullable + private Supplier coolantTank = null; + + public GunRecoil() + { + + } + + public void update() + { + //Apply damping to recoil, and gradually return it to 0 + this.recoilYaw *= recoilDamping; + this.recoilPitch *= recoilDamping; + + if(Math.abs(recoilYaw) < 0.01f) + recoilYaw = 0; + if(Math.abs(recoilPitch) < 0.01f) + recoilPitch = 0; + + //Decrease overheat + if(overheat > 0) + overheat -= overheatDecrease; + if(coolantTank!=null&&MachinegunCoolantHandler.isValidCoolant(coolantTank.get().getFluid())) + overheat -= MachinegunCoolantHandler.getCoolAmount(coolantTank.get().getFluid()); + } + + //--- With ---// + + public GunRecoil withRecoilLimits(float maxRecoilYaw, float maxRecoilPitch) + { + this.maxRecoilYaw = maxRecoilYaw; + this.maxRecoilPitch = maxRecoilPitch; + return this; + } + + public GunRecoil withRecoilStrength(float recoilStrengthVertical, float recoilStrengthHorizontal, float recoilDamping, float recoilRandomness) + { + this.recoilStrengthVertical = recoilStrengthVertical; + this.recoilStrengthHorizontal = recoilStrengthHorizontal; + this.recoilDamping = recoilDamping; + this.recoilRandomness = recoilRandomness; + return this; + } + + public GunRecoil withOverheating(float maxOverheat, float overheatDecrease, @Nullable Supplier coolantTank) + { + this.maxOverheat = maxOverheat; + this.overheatDecrease = overheatDecrease; + this.coolantTank = coolantTank; + return this; + } + + //--- Adding Recoil ---// + + public void addRecoil() + { + //Add recoil strength to current recoil + this.recoilPitch += recoilStrengthVertical*(1f+recoilRandomness*(float)(Utils.RAND.nextGaussian()*2-1)); + this.recoilYaw += recoilStrengthHorizontal*(1f+recoilRandomness*(float)(Utils.RAND.nextGaussian()*2-1)); + + //Clamp recoil to max values + this.recoilPitch = Math.max(-maxRecoilPitch, Math.min(maxRecoilPitch, recoilPitch)); + this.recoilYaw = Math.max(-maxRecoilYaw, Math.min(maxRecoilYaw, recoilYaw)); + } + + //--- Getters ---// + + public float getRecoilYaw(float partialTicks) + { + return (float)IIMath.clampedLerp(recoilYaw*recoilDamping, recoilYaw, 1f-partialTicks); + } + + public float getRecoilPitch(float partialTicks) + { + return (float)IIMath.clampedLerp(recoilPitch*recoilDamping, recoilPitch, 1f-partialTicks); + } + + public float getOverheat(float partialTicks) + { + return Math.max(0, Math.min(1, (overheat+(isOverheated?0.5f: 0))/maxOverheat)); + } + + @Override + public NBTTagCompound serializeNBT() + { + NBTTagCompound nbt = new NBTTagCompound(); + nbt.setFloat("recoil_yaw", recoilYaw); + nbt.setFloat("recoil_pitch", recoilPitch); + nbt.setFloat("overheat", overheat); + nbt.setBoolean("is_overheated", isOverheated); + return nbt; + } + + @Override + public void deserializeNBT(NBTTagCompound nbt) + { + recoilYaw = nbt.getFloat("recoil_yaw"); + recoilPitch = nbt.getFloat("recoil_pitch"); + overheat = nbt.getFloat("overheat"); + isOverheated = nbt.getBoolean("is_overheated"); + } +} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunShootingHandler.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunShootingHandler.java new file mode 100644 index 000000000..84a9f7ae6 --- /dev/null +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunShootingHandler.java @@ -0,0 +1,64 @@ +package pl.pabilo8.immersiveintelligence.common.util.gun; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.INBTSerializable; + +/** + * Used to store and calculate gun recoil and overheating. + * + * @author Pabilo8 (pabilo@iiteam.net) + * @ii-approved 0.3.1 + * @since 15.05.2026 + */ +public class GunShootingHandler implements INBTSerializable +{ + private float shotDelay, maxShotDelay; + private float loadingProgress, maxLoadingProgress; + private boolean startLoading = false; + + public GunShootingHandler() + { + + } + + public void update() + { + shotDelay = Math.max(0, shotDelay-1); + } + + //--- With ---// + + public GunShootingHandler withMaxShotDelay(float maxShotDelay) + { + this.maxShotDelay = maxShotDelay; + return this; + } + + //--- Getters ---// + + public float getShotDelay(float partialTicks) + { + return Math.max(0, shotDelay-partialTicks); + } + + public float getLoadingProgress(float partialTicks) + { + return startLoading?Math.min(maxLoadingProgress, loadingProgress+partialTicks): 0; + } + + //--- NBT ---// + + @Override + public NBTTagCompound serializeNBT() + { + NBTTagCompound nbt = new NBTTagCompound(); + nbt.setFloat("shot_delay", shotDelay); + return nbt; + } + + @Override + public void deserializeNBT(NBTTagCompound nbt) + { + shotDelay = nbt.getFloat("shot_delay"); + } +} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/item/ItemIIUpgradableTool.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/item/ItemIIUpgradableTool.java index afaad9e9d..dd8784cc3 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/item/ItemIIUpgradableTool.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/item/ItemIIUpgradableTool.java @@ -4,6 +4,11 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import java.util.Arrays; +import java.util.EnumSet; +import java.util.List; +import java.util.stream.Collectors; + /** * @author Pabilo8 (pabilo@iiteam.net) * @since 27.01.2023 @@ -53,5 +58,19 @@ public boolean hasIIUpgrades(ItemStack stack, IIItemEnum... upgrade) return true; } + /** + * @param stack stack to check + * @param upgrade upgrade type + * @return list of all installed upgrades of the given type + */ + public & IIItemEnum> EnumSet listUpgrades(ItemStack stack, Class upgrade) + { + NBTTagCompound upgrades = getUpgrades(stack); + List collect = Arrays.stream(upgrade.getEnumConstants()) + .filter(enumConstant -> upgrades.hasKey(enumConstant.getName())) + .collect(Collectors.toList()); + return collect.isEmpty()?EnumSet.noneOf(upgrade): EnumSet.copyOf(collect); + } + } diff --git a/src/main/resources/assets/immersiveintelligence/lang/en_us.lang b/src/main/resources/assets/immersiveintelligence/lang/en_us.lang index 2cd7ad659..39f99d2c3 100644 --- a/src/main/resources/assets/immersiveintelligence/lang/en_us.lang +++ b/src/main/resources/assets/immersiveintelligence/lang/en_us.lang @@ -2700,6 +2700,11 @@ key.immersiveintelligence.vehicle.tow.toggle=Tow/Untow key.immersiveintelligence.vehicle.tow.start=Tow key.immersiveintelligence.vehicle.tow.stop=Untow +key.immersiveintelligence.vehicle.gun.up=Elevate Gun +key.immersiveintelligence.vehicle.gun.down=Depress Gun +key.immersiveintelligence.vehicle.gun.left=Traverse Gun Left +key.immersiveintelligence.vehicle.gun.right=Traverse Gun Right + #Advancements advancement.immersiveintelligence.root=Immersive Intelligence advancement.immersiveintelligence.root.desc=RTFM? From 96dfddde453e909033cca487301d97a911477079 Mon Sep 17 00:00:00 2001 From: Pabilo8 Date: Sat, 23 May 2026 16:40:45 +0200 Subject: [PATCH 05/23] More works on mounted weapons, unified placement logic --- .../api/upgrade/UpgradeManager.java | 5 + .../api/utils/camera/ICameraEntity.java | 38 +- .../api/utils/camera/IEntityZoomProvider.java | 18 - .../api/utils/camera/ZoomSettings.java | 4 +- ...vancedZoomTool.java => IAdvancedZoom.java} | 2 +- .../client/ClientEventHandler.java | 161 +- .../client/gui/block/GuiAmmunitionCrate.java | 34 +- .../entity/weapon/MachinegunRenderer.java | 70 +- .../render/entity/weapon/MortarRenderer.java | 6 +- .../weapon/TripodPeriscopeRenderer.java | 5 +- .../client/util/CameraHandler.java | 29 +- .../client/util/IIKeybind.java | 5 +- .../common/IISounds.java | 2 + .../TileEntityAmmunitionCrate.java | 4 +- .../effect_crate/TileEntityEffectCrate.java | 9 +- .../entity/hans/tasks/AIHansMachinegun.java | 22 +- .../mounted_weapon/EntityMachinegun.java | 130 +- .../entity/mounted_weapon/EntityMortar.java | 98 +- .../mounted_weapon/EntityMountedWeapon.java | 22 +- .../mounted_weapon/EntityTripodPeriscope.java | 51 +- .../towable/gun/EntityFieldHowitzer.java | 39 +- .../vehicle/utils/part/EntityVehicleSeat.java | 5 +- .../common/gui/ContainerAmmunitionCrate.java | 52 +- .../common/item/tools/ItemIIBinoculars.java | 4 +- .../item/tools/ItemIITripodPeriscope.java | 87 +- .../item/weapons/ItemIIAssaultRifle.java | 4 +- .../common/item/weapons/ItemIIMachinegun.java | 152 +- .../common/item/weapons/ItemIIMortar.java | 72 +- .../common/item/weapons/ItemIIRifle.java | 4 +- .../common/network/IIPacketHandler.java | 1 - .../network/messages/MessageIITileSync.java | 18 +- .../MessagePlayerAimAnimationSync.java | 61 - .../common/util/entity/ISyncNBTEntity.java | 14 +- .../common/util/gun/GunAimCoordinate.java | 285 +- .../common/util/item/IItemEntityPlacer.java | 100 + .../immersiveintelligence/lang/en_us.lang | 3 +- .../tracked_motorbike/tracked_motorbike.mtl | 4 +- .../tracked_motorbike/tracked_motorbike.obj | 25473 +++++++--------- .../weapons/weapon_placed/weapon_placed0.ogg | Bin 0 -> 126730 bytes .../weapons/weapon_placed/weapon_placed1.ogg | Bin 0 -> 128145 bytes 40 files changed, 12682 insertions(+), 14411 deletions(-) delete mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/api/utils/camera/IEntityZoomProvider.java rename src/main/java/pl/pabilo8/immersiveintelligence/api/utils/tools/{IAdvancedZoomTool.java => IAdvancedZoom.java} (95%) delete mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/common/network/messages/MessagePlayerAimAnimationSync.java create mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/common/util/item/IItemEntityPlacer.java create mode 100644 src/main/resources/assets/immersiveintelligence/sounds/weapons/weapon_placed/weapon_placed0.ogg create mode 100644 src/main/resources/assets/immersiveintelligence/sounds/weapons/weapon_placed/weapon_placed1.ogg diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/api/upgrade/UpgradeManager.java b/src/main/java/pl/pabilo8/immersiveintelligence/api/upgrade/UpgradeManager.java index d16439d79..08ad60027 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/api/upgrade/UpgradeManager.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/api/upgrade/UpgradeManager.java @@ -1,10 +1,13 @@ package pl.pabilo8.immersiveintelligence.api.upgrade; +import blusunrize.immersiveengineering.common.blocks.TileEntityIEBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagString; import net.minecraftforge.common.util.INBTSerializable; import pl.pabilo8.immersiveintelligence.api.upgrade.UpgradeUtils.UpgradeOperation; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Tools; +import pl.pabilo8.immersiveintelligence.common.network.IIPacketHandler; +import pl.pabilo8.immersiveintelligence.common.network.messages.MessageIITileSync; import pl.pabilo8.immersiveintelligence.common.util.ResLoc; import pl.pabilo8.immersiveintelligence.common.util.easynbt.EasyNBT; import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT.SyncEvents; @@ -204,5 +207,7 @@ private void sendTileUpdate() { if(parent instanceof TileEntityMultiblockIIBase) ((TileEntityMultiblockIIBase)parent).updateTileForEvent(SyncEvents.TILE_UPGRADES_MODIFIED); + else if(parent instanceof TileEntityIEBase) + IIPacketHandler.sendToClient(new MessageIITileSync(((TileEntityIEBase)parent))); } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/api/utils/camera/ICameraEntity.java b/src/main/java/pl/pabilo8/immersiveintelligence/api/utils/camera/ICameraEntity.java index 09fb8068a..74f4192ec 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/api/utils/camera/ICameraEntity.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/api/utils/camera/ICameraEntity.java @@ -1,9 +1,14 @@ package pl.pabilo8.immersiveintelligence.api.utils.camera; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; import net.minecraft.util.math.Vec3d; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedZoom; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; /** * @author Pabilo8 (pabilo@iiteam.net) @@ -26,6 +31,16 @@ public interface ICameraEntity */ float getCameraYaw(EntityPlayer cameraPlayer, float partialTicks); + /** + * @param cameraPlayer client player + * @param partialTicks partial ticks when rendering + * @return camera roll angle + */ + default float getCameraRoll(EntityPlayer cameraPlayer, float partialTicks) + { + return 0; + } + /** * @param cameraPlayer client player * @param partialTicks partial ticks when rendering @@ -33,8 +48,29 @@ public interface ICameraEntity */ Vec3d getCameraPos(EntityPlayer cameraPlayer, float partialTicks); - default void setCameraParameters(EntityPlayer cameraPlayer, float partialTicks) + boolean isCameraEnabled(EntityPlayer player); + + default boolean isThirdPersonAllowed(EntityPlayer cameraPlayer) { + return true; + } + + //--- Zooming ---// + + @Nullable + default IAdvancedZoom getZoom() + { + return null; + } + /** + * Allows to use a zoom-providing ItemStack. Used for vehicles, where the player can use inventory items like binoculars. + * + * @return the ItemStack providing the zoom, or an empty stack if none + */ + @Nonnull + default ItemStack getZoomStack() + { + return ItemStack.EMPTY; } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/api/utils/camera/IEntityZoomProvider.java b/src/main/java/pl/pabilo8/immersiveintelligence/api/utils/camera/IEntityZoomProvider.java deleted file mode 100644 index 01316c45d..000000000 --- a/src/main/java/pl/pabilo8/immersiveintelligence/api/utils/camera/IEntityZoomProvider.java +++ /dev/null @@ -1,18 +0,0 @@ -package pl.pabilo8.immersiveintelligence.api.utils.camera; - -import net.minecraft.item.ItemStack; -import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedZoomTool; - -/** - * @author Pabilo8 (pabilo@iiteam.net) - * @since 21.01.2021 - */ -public interface IEntityZoomProvider -{ - IAdvancedZoomTool getZoom(); - - default ItemStack getZoomStack() - { - return ItemStack.EMPTY; - } -} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/api/utils/camera/ZoomSettings.java b/src/main/java/pl/pabilo8/immersiveintelligence/api/utils/camera/ZoomSettings.java index f597c79fc..271f79a65 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/api/utils/camera/ZoomSettings.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/api/utils/camera/ZoomSettings.java @@ -5,14 +5,14 @@ import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedZoomTool; +import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedZoom; /** * @author Pabilo8 (pabilo@iiteam.net) * @ii-approved 0.3.1 * @since 15.05.2026 */ -public class ZoomSettings implements IAdvancedZoomTool +public class ZoomSettings implements IAdvancedZoom { private boolean zoomEnabled = false; private final float[] zoomSteps; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/api/utils/tools/IAdvancedZoomTool.java b/src/main/java/pl/pabilo8/immersiveintelligence/api/utils/tools/IAdvancedZoom.java similarity index 95% rename from src/main/java/pl/pabilo8/immersiveintelligence/api/utils/tools/IAdvancedZoomTool.java rename to src/main/java/pl/pabilo8/immersiveintelligence/api/utils/tools/IAdvancedZoom.java index d8f195c1a..7b251dfaf 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/api/utils/tools/IAdvancedZoomTool.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/api/utils/tools/IAdvancedZoom.java @@ -10,7 +10,7 @@ * @author Pabilo8 (pabilo@iiteam.net) * @since 27.09.2019 */ -public interface IAdvancedZoomTool +public interface IAdvancedZoom { /** * @return whether this item is valid for zooming in diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/ClientEventHandler.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/ClientEventHandler.java index 152d4b6c7..90f2bda49 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/ClientEventHandler.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/ClientEventHandler.java @@ -71,6 +71,7 @@ import pl.pabilo8.immersiveintelligence.api.utils.ItemTooltipHandler; import pl.pabilo8.immersiveintelligence.api.utils.ItemTooltipHandler.IAdvancedTooltipItem; import pl.pabilo8.immersiveintelligence.api.utils.ItemTooltipHandler.IItemScrollable; +import pl.pabilo8.immersiveintelligence.api.utils.camera.ICameraEntity; import pl.pabilo8.immersiveintelligence.client.fx.ScreenShake; import pl.pabilo8.immersiveintelligence.client.fx.utils.ParticleSystem; import pl.pabilo8.immersiveintelligence.client.gui.GuiWidgetAustralianTabs; @@ -97,13 +98,9 @@ import pl.pabilo8.immersiveintelligence.common.*; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Graphics; -import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Tools.TripodPeriscope; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons; import pl.pabilo8.immersiveintelligence.common.entity.ammo.types.EntityAmmoProjectile; -import pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon.EntityMachinegun; -import pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon.EntityMortar; import pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon.EntityMountedWeapon; -import pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon.EntityTripodPeriscope; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.EntityVehicleSeat; import pl.pabilo8.immersiveintelligence.common.item.ItemIIPrintedPage.PageType; import pl.pabilo8.immersiveintelligence.common.item.weapons.ItemIIGunBase; @@ -140,8 +137,6 @@ public class ClientEventHandler implements ISelectiveResourceReloadListener private static final ArrayList TEXT_OVERLAYS = new ArrayList<>(); private static final ArrayList IN_WORLD_OVERLAYS = new ArrayList<>(); private static final ArrayList SCREEN_SHAKE_EFFECTS = new ArrayList<>(); - public static boolean mgAiming = false; - public static ArrayList aimingPlayers = new ArrayList<>(); public static GuiScreen lastGui = null; //Whether the Light Engineer Armor is worn public static boolean gotTheDrip; @@ -193,13 +188,6 @@ public static void handleBipedRotations(ModelBiped model, Entity entity) model.bipedHead.rotateAngleZ = 0f; model.bipedHeadwear.rotateAngleZ = 0f; - - if(aimingPlayers.contains(entity)) - { - model.bipedHead.rotateAngleZ = -0.35f; - model.bipedHeadwear.rotateAngleZ = -0.35f; - } - //Handle a vehicle's passenger animations Entity vehicle = living.getRidingEntity(); //Vehicle seats have no renderer, use the vehicle renderer for the action @@ -277,53 +265,49 @@ else if((item instanceof ItemIIGunBase||item instanceof ItemIIRailgunOverride)&& model.bipedRightArm.rotationPointZ += IIMath.clampedLerp3Par(0, 2f, 0, v); } - else + else if(living.isSneaking()&&item==IIContent.itemBinoculars) { - // TODO: 19.09.2021 animation for left hand (requires model offset changes) - } - else if(living.isSneaking()&&item==IIContent.itemBinoculars) - { - model.bipedRightArm.rotateAngleY = model.bipedHead.rotateAngleY-0.25f; - model.bipedLeftArm.rotateAngleY = model.bipedHead.rotateAngleY+0.25f; + model.bipedRightArm.rotateAngleY = model.bipedHead.rotateAngleY-0.25f; + model.bipedLeftArm.rotateAngleY = model.bipedHead.rotateAngleY+0.25f; - model.bipedRightArm.rotateAngleX = model.bipedHead.rotateAngleX-2f; - model.bipedLeftArm.rotateAngleX = model.bipedRightArm.rotateAngleX; + model.bipedRightArm.rotateAngleX = model.bipedHead.rotateAngleX-2f; + model.bipedLeftArm.rotateAngleX = model.bipedRightArm.rotateAngleX; - int id = heldItem.getMetadata(); - BinocularsRenderer.INSTANCE.render(id==1?ItemNBTHelper.getBoolean(heldItem, "wasUsed")?2: 1: id, model.bipedHead, true); - } - else if(item==IIContent.itemMineDetector) - { - float v = MineDetectorRenderer.instance.renderBase(living, 2.125f, true); + int id = heldItem.getMetadata(); + BinocularsRenderer.INSTANCE.render(id==1?ItemNBTHelper.getBoolean(heldItem, "wasUsed")?2: 1: id, model.bipedHead, true); + } + else if(item==IIContent.itemMineDetector) + { + float v = MineDetectorRenderer.instance.renderBase(living, 2.125f, true); - model.bipedRightArm.rotateAngleY = model.bipedBody.rotateAngleY-0.45f; - model.bipedLeftArm.rotateAngleY = model.bipedBody.rotateAngleY+0.45f; + model.bipedRightArm.rotateAngleY = model.bipedBody.rotateAngleY-0.45f; + model.bipedLeftArm.rotateAngleY = model.bipedBody.rotateAngleY+0.45f; - model.bipedRightArm.rotateAngleX = -1.25f-(1f-v)*0.5f; - model.bipedLeftArm.rotateAngleX = model.bipedRightArm.rotateAngleX; - } - else if(item==IIContent.itemNavalMine) - if(right) - { - model.bipedRightArm.rotateAngleX -= 0.5f; + model.bipedRightArm.rotateAngleX = -1.25f-(1f-v)*0.5f; model.bipedLeftArm.rotateAngleX = model.bipedRightArm.rotateAngleX; } - else - { - model.bipedLeftArm.rotateAngleX -= 0.5f; - model.bipedRightArm.rotateAngleX = model.bipedLeftArm.rotateAngleX; - } - else if(item==IIContent.itemGrenade) - { - float use = 1f-MathHelper.clamp(((EntityLivingBase)entity).getItemInUseCount()/(float)heldItem.getMaxItemUseDuration(), 0, 1); - if(right) + else if(item==IIContent.itemNavalMine) + if(right) + { + model.bipedRightArm.rotateAngleX -= 0.5f; + model.bipedLeftArm.rotateAngleX = model.bipedRightArm.rotateAngleX; + } + else + { + model.bipedLeftArm.rotateAngleX -= 0.5f; + model.bipedRightArm.rotateAngleX = model.bipedLeftArm.rotateAngleX; + } + else if(item==IIContent.itemGrenade) { - model.rightArmPose = ArmPose.EMPTY; - //model.leftArmPose=ArmPose.EMPTY; - float hh = -(4.5f-model.bipedHead.rotateAngleX); - model.bipedRightArm.rotateAngleX = use!=1?use > 0f?use < 0.35f?use/0.35f*hh: hh: 0f: 0f; + float use = 1f-MathHelper.clamp(((EntityLivingBase)entity).getItemInUseCount()/(float)heldItem.getMaxItemUseDuration(), 0, 1); + if(right) + { + model.rightArmPose = ArmPose.EMPTY; + //model.leftArmPose=ArmPose.EMPTY; + float hh = -(4.5f-model.bipedHead.rotateAngleX); + model.bipedRightArm.rotateAngleX = use!=1?use > 0f?use < 0.35f?use/0.35f*hh: hh: 0f: 0f; + } } - } } } @@ -646,12 +630,13 @@ public void onRenderWorldLast(RenderWorldLastEvent event) @SubscribeEvent(priority = EventPriority.HIGH) public void onRenderOverlayPre(Pre event) { - if(ClientUtils.mc().player==null||event.getType()!=ElementType.CROSSHAIRS) + Minecraft mc = ClientUtils.mc(); + if(mc.player==null||event.getType()!=ElementType.CROSSHAIRS) return; for(EnumHand hand : EnumHand.values()) { - ItemStack stack = ClientUtils.mc().player.getHeldItem(hand); + ItemStack stack = mc.player.getHeldItem(hand); if(stack.getItem().getTileEntityItemStackRenderer() instanceof ISpecificHandRenderer) if(((ISpecificHandRenderer)stack.getItem().getTileEntityItemStackRenderer()).shouldCancelCrosshair(stack, hand)) { @@ -660,8 +645,8 @@ public void onRenderOverlayPre(Pre event) } } - RayTraceResult mop = ClientUtils.mc().objectMouseOver; - EntityPlayer player = ClientUtils.mc().player; + RayTraceResult mop = mc.objectMouseOver; + EntityPlayer player = mc.player; float partialTicks = event.getPartialTicks(); //Iterate HUD backgrounds @@ -677,58 +662,31 @@ public void onRenderOverlayPre(Pre event) Entity lowestRidden = ridden==null?null: ridden.getLowestRidingEntity(); //--- Camera Handling ---// - if(mgAiming) + if(lowestRidden instanceof ICameraEntity) { - ClientUtils.mc().gameSettings.thirdPersonView = 0; - - if(lowestRidden instanceof EntityMachinegun) + ICameraEntity cameraEntity = (ICameraEntity)lowestRidden; + if(!cameraEntity.isCameraEnabled(player)) + CameraHandler.setEnabled(false); + else { - EntityMachinegun mg = (EntityMachinegun)lowestRidden; - float px = (float)mg.posX, py = (float)mg.posY, pz = (float)mg.posZ; - - float yaw = mg.getGunYaw(partialTicks); - float pitch = mg.getGunPitch(partialTicks); - - double true_angle = Math.toRadians(180-mg.setYaw-yaw); - double true_angle2 = Math.toRadians(pitch); - - boolean hasScope = mg.getZoom().shouldZoom(mg.getZoomStack(), null); - - Vec3d gun_end = IIMath.offsetPosDirection(2.25f-(hasScope?1.25f: 0), true_angle, true_angle2); - Vec3d gun_height = IIMath.offsetPosDirection(0.25f+(hasScope?0.125f: 0f), true_angle, true_angle2+90); - - CameraHandler.setCameraPos(px+0.85*(gun_end.x+gun_height.x), py-1.5f+0.4025+0.85*(gun_end.y+gun_height.y), pz+0.85*(gun_end.z+gun_height.z)); - CameraHandler.setCameraAngle(mg.setYaw+yaw, pitch, 0); + if(!cameraEntity.isThirdPersonAllowed(player)) + mc.gameSettings.thirdPersonView = -1; + + CameraHandler.setCameraPos(cameraEntity.getCameraPos(player, partialTicks)); + CameraHandler.setCameraAngle( + cameraEntity.getCameraYaw(player, partialTicks), + cameraEntity.getCameraPitch(player, partialTicks), + cameraEntity.getCameraRoll(player, partialTicks) + ); CameraHandler.setEnabled(true); } - else if(lowestRidden instanceof EntityMortar) - { - EntityMortar mg = (EntityMortar)lowestRidden; - // CameraHandler.isZooming = false; - if(mg.shootingProgress!=0) - CameraHandler.fovZoom = 0; - - CameraHandler.setCameraPos(mg.posX, mg.posY+0.75, mg.posZ); - CameraHandler.setCameraAngle(mg.rotationYaw, 1+(1f-mg.rotationPitch/-90f)*-1.5f, 0); - CameraHandler.setEnabled(mg.shootingProgress==0); - } - else if(lowestRidden instanceof EntityTripodPeriscope) - { - EntityTripodPeriscope mg = (EntityTripodPeriscope)lowestRidden; - float px = (float)mg.posX, py = (float)mg.posY, pz = (float)mg.posZ; - - CameraHandler.setCameraPos(px, py+1.25, pz); - - ClientUtils.mc().player.rotationPitch = MathHelper.clamp(ClientUtils.mc().player.rotationPitch, -50, 50); - ClientUtils.mc().player.prevRotationPitch = MathHelper.clamp(ClientUtils.mc().player.prevRotationPitch, -50, 50); - float y = MathHelper.wrapDegrees(360+mg.aim.getTargetYaw()-mg.aim.getCurrentYaw()); - float currentYaw = MathHelper.wrapDegrees(mg.aim.getCurrentYaw()+event.getPartialTicks()*(Math.signum(y)*MathHelper.clamp(Math.abs(y), 0, TripodPeriscope.turnSpeed))); - CameraHandler.setCameraAngle(currentYaw, ClientUtils.mc().player.rotationPitch, 0); - CameraHandler.setEnabled(true); - } +//mc.gameSettings.thirdPersonView = -1; +// CameraHandler.setCameraPos(mg.posX, mg.posY+0.75, mg.posZ); +// CameraHandler.setCameraAngle(mg.rotationYaw, 1+(1f-mg.rotationPitch/-90f)*-1.5f, 0); +// CameraHandler.setEnabled(mg.shootingProgress==0); } else CameraHandler.setEnabled(false); @@ -918,7 +876,7 @@ public void onRenderHand(RenderSpecificHandEvent event) { //Check ridden entity for custom hand rendering Entity ridden = ClientUtils.mc().player.getRidingEntity(); - if(ridden instanceof EntityVehicleSeat) + if(ridden instanceof EntityVehicleSeat||ridden instanceof EntityMountedWeapon) { event.setCanceled(true); return; @@ -1016,7 +974,6 @@ public void onWorldLoad(Load event) return; //Reset static variables - aimingPlayers.clear(); blockDamageClient.clear(); //Reload the particle system diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiAmmunitionCrate.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiAmmunitionCrate.java index c261c2ff7..b290a61bf 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiAmmunitionCrate.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiAmmunitionCrate.java @@ -2,29 +2,24 @@ import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.util.ResourceLocation; import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; -import pl.pabilo8.immersiveintelligence.client.gui.deco.component.visual.DecoImage; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoBackgroundBuilder.SlotStyle; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoGuiCategory; -import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoResource; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoTemplate; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoTextures; +import pl.pabilo8.immersiveintelligence.common.IIContent; import pl.pabilo8.immersiveintelligence.common.IIGUI; import pl.pabilo8.immersiveintelligence.common.block.metal_device.tileentity.effect_crate.TileEntityAmmunitionCrate; import pl.pabilo8.immersiveintelligence.common.gui.ContainerAmmunitionCrate; -import pl.pabilo8.immersiveintelligence.common.util.IIReference; +import pl.pabilo8.immersiveintelligence.common.util.IIColor; /** * @author Pabilo8 (pabilo@iiteam.net) * @since 17.05.2019 */ -@DecoTemplate(name = "ammunitioncrate", category = DecoGuiCategory.GENERIC_TILE) +@DecoTemplate(name = "ammunition_crate", category = DecoGuiCategory.GENERIC_TILE) public class GuiAmmunitionCrate extends DecoGui { - @DecoResource - public static final ResourceLocation TEXTURE_AMMO = IIReference.RES_II.with("gui/ammunition_crate"); - public GuiAmmunitionCrate(EntityPlayer player, TileEntityAmmunitionCrate tile) { super(player, tile, IIGUI.AMMUNITION_CRATE); @@ -33,23 +28,30 @@ public GuiAmmunitionCrate(EntityPlayer player, TileEntityAmmunitionCrate tile) @Override public void onInit() { + final IIColor backgroundColor = IIColor.fromPackedRGB(0xd0ebc2); startBackground() - .withBox(null, 0, 0, 176, 76) - .withBox(DecoTextures.BG_WOODEN, DecoTextures.TEMPLATE_ROUND_WOODEN, 0, 87, 176, 92) + .withBox(DecoTextures.BG_STEEL_ROUGH, DecoTextures.TEMPLATE_ROUND, 0, 0, 176, 126+8, backgroundColor) + .withTitleBar(tile) + .conditionally(tile.isUpgradeInstalled(IIContent.UPGRADE_MG_LOADER), builder -> builder + .withNextLayer() + .withBox(DecoTextures.BG_STEEL_ROUGH, DecoTextures.TEMPLATE_ROUND, 176, 0, 48, 126+8, backgroundColor) + .withInventorySlots(SlotStyle.VANILLA, container.inputMG) + ) + .withNextLayer() + .withBox(DecoTextures.BG_WOODEN, DecoTextures.TEMPLATE_ROUND_WOODEN, 0, 126+8, 176, 92) .withInventorySlots(SlotStyle.VANILLA, container.playerInventory) - .withInventorySlots(SlotStyle.IE_CUSTOM1, container.slotsInputrevolver) - .withInventorySlots(SlotStyle.IE_CUSTOM1, container.slotsInputbullet) - .withInventorySlots(SlotStyle.IE_CUSTOM1, container.slotsInputshell) + .withInventorySlots(SlotStyle.VANILLA, container.inputRevolver) + .withInventorySlots(SlotStyle.VANILLA, container.inputBullet) + .withInventorySlots(SlotStyle.VANILLA, container.inputShell) .withInventoryTitleBar() .build(); - - addComponents( + /*addComponents( new DecoImage(0, -45) .withSize(175, 132) .withImageLocation(TEXTURE_AMMO, true) .withUV(256, 0, 0, 175, 132) - ); + );*/ } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/weapon/MachinegunRenderer.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/weapon/MachinegunRenderer.java index 3c70fd136..8aa64a95b 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/weapon/MachinegunRenderer.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/weapon/MachinegunRenderer.java @@ -86,11 +86,8 @@ public static void renderMachinegun(ItemStack stack, @Nullable EntityMachinegun } specialText = I18n.format("skin.immersiveintelligence."+skin+".name"); skin = skin.isEmpty()?IIContent.itemMachinegun.getSkinnableDefaultTextureLocation(): IIReference.SKIN_LOCATION+skin+"/"; - - ClientUtils.bindTexture(skin+texture); - for(Entry, BiConsumer>> s : upgrades.entrySet()) { if(s.getKey()!=null&&s.getValue()!=null&&s.getKey().test(stack)) @@ -99,37 +96,8 @@ public static void renderMachinegun(ItemStack stack, @Nullable EntityMachinegun if(entity!=null) { - float yaw = entity.getGunYaw(0f), pitch = entity.getGunPitch(0f); + float yaw = entity.aim.getYaw(partialTicks)-entity.aim.getCenterYaw(), pitch = entity.aim.getPitch(partialTicks); boolean tripod = entity.upgrades.contains(WeaponUpgrade.TRIPOD); - if(entity.setupTime < 1&&!entity.getPassengers().isEmpty()&&entity.getPassengers().get(0) instanceof EntityLivingBase) - { - EntityLivingBase psg = (EntityLivingBase)entity.getPassengers().get(0); - - float true_head_angle = MathHelper.wrapDegrees(psg.prevRotationYawHead-entity.setYaw); - float true_head_angle2 = MathHelper.wrapDegrees(psg.rotationPitch); - - if(entity.getGunYaw(0f) < true_head_angle) - yaw += partialTicks*2f; - else if(entity.getGunYaw(0f) > true_head_angle) - yaw -= partialTicks*2f; - - if(Math.ceil(entity.getGunYaw(0f)) <= Math.ceil(true_head_angle)+1f&&Math.ceil(entity.getGunYaw(0f)) >= Math.ceil(true_head_angle)-1f) - yaw = true_head_angle; - - if(entity.getGunPitch(0f) < true_head_angle2) - pitch += partialTicks; - else if(entity.getGunPitch(0f) > true_head_angle2) - pitch -= partialTicks; - - yaw = tripod?MathHelper.clamp(yaw, -82.5F, 82.5F): MathHelper.clamp(yaw, -45.0F, 45.0F); - pitch = MathHelper.clamp(pitch, -20, 20); - - yaw += entity.recoil.getRecoilYaw(partialTicks); - pitch += entity.recoil.getRecoilPitch(partialTicks); - - pitch = MathHelper.clamp(pitch, -20, 20); - } - GlStateManager.translate(0f, -0.34375, 0f); float setup = AMTUtils.getAnimationProgress(entity.setupTime, entity.maxSetupTime, true, partialTicks); GlStateManager.rotate(-25f*setup, 1, 0, 0); @@ -139,7 +107,7 @@ else if(entity.getGunPitch(0f) > true_head_angle2) { GlStateManager.pushMatrix(); GlStateManager.scale(0.85, 0.85, 0.85); - GlStateManager.rotate(180-entity.setYaw, 0f, 1f, 0f); + GlStateManager.rotate(180-entity.aim.getCenterYaw(), 0f, 1f, 0f); GlStateManager.rotate(-yaw, 0f, 1f, 0f); GlStateManager.rotate(-pitch, 1, 0, 0); GlStateManager.translate(-0.5f, 0.34375, 1.65625+pitch/20*0.25); @@ -164,7 +132,7 @@ else if(entity.getGunPitch(0f) > true_head_angle2) { GlStateManager.pushMatrix(); GlStateManager.scale(0.85, 0.85, 0.85); - GlStateManager.rotate(180-entity.setYaw, 0f, 1f, 0f); + GlStateManager.rotate(180-entity.aim.getCenterYaw(), 0f, 1f, 0f); GlStateManager.translate(-0.5f, 0.34375+0.0625, 1.65625); nmod.render(0.0625f, setup); GlStateManager.popMatrix(); @@ -173,7 +141,7 @@ else if(entity.getGunPitch(0f) > true_head_angle2) { GlStateManager.pushMatrix(); GlStateManager.scale(0.85, 0.85, 0.85); - GlStateManager.rotate(180-entity.setYaw, 0f, 1f, 0f); + GlStateManager.rotate(180-entity.aim.getCenterYaw(), 0f, 1f, 0f); GlStateManager.rotate(-yaw, 0f, 1f, 0f); GlStateManager.rotate(-pitch, 1, 0, 0); GlStateManager.translate(-0.5f, 0.34375, 1.65625+pitch/20*0.25); @@ -204,13 +172,13 @@ else if(entity.getGunPitch(0f) > true_head_angle2) GlStateManager.rotate(90, 1, 0, 0); GlStateManager.scale(0.5f, 0.5f, 0.5f); - BlockPos cratePos = entity.getPosition().offset(EnumFacing.fromAngle(entity.setYaw).getOpposite()).down(); + BlockPos cratePos = entity.getPosition().offset(EnumFacing.fromAngle(entity.aim.getCenterYaw()).getOpposite()).down(); if(entity.getEntityWorld().getTileEntity(cratePos) instanceof TileEntityAmmunitionCrate) { TileEntityAmmunitionCrate crate = (TileEntityAmmunitionCrate)entity.getEntityWorld().getTileEntity(cratePos); assert crate!=null; - int beltLength = (int)(24+Math.max(Math.abs(entity.getGunYaw(0f))-55, 0)/2-Math.max(entity.getGunPitch(0f)-20, 0)/2); + int beltLength = (int)(24+Math.max(Math.abs(entity.aim.getYaw(0f))-55, 0)/2-Math.max(entity.aim.getPitch(partialTicks)-20, 0)/2); if(crate.open&&crate.isUpgradeInstalled(IIContent.UPGRADE_MG_LOADER)) { @@ -226,8 +194,8 @@ else if(entity.getGunPitch(0f) > true_head_angle2) } beltLength -= 4; - float ammoDir = entity.getGunYaw(0f)/(tripod?90f: 50f)*(1-Math.abs(entity.getGunPitch(0f))/40f); - float ammoTurn = tripod?Math.abs(entity.getGunYaw(0f))/90f*(beltLength > 24?(beltLength-24)/24f: 1): 0; + float ammoDir = entity.aim.getYaw(0f)/(tripod?90f: 50f)*(1-Math.abs(entity.aim.getPitch(partialTicks))/40f); + float ammoTurn = tripod?Math.abs(entity.aim.getYaw(0f))/90f*(beltLength > 24?(beltLength-24)/24f: 1): 0; GlStateManager.pushMatrix(); for(int i = 0; i < 4&&!ammoStacks.isEmpty(); i++) @@ -383,8 +351,9 @@ public void reloadModels() @Override public boolean handleBipedRotations(ModelBiped model, EntityMachinegun mg, EntityLivingBase passenger, float partialTicks) { - float ff = (float)(-1.35f-Math.toRadians(mg.getGunPitch(0f))*1.25); - float true_head_angle = MathHelper.wrapDegrees(passenger.prevRotationYawHead-mg.setYaw); + float ff = (float)(-1.35f-Math.toRadians(mg.aim.getPitch(partialTicks))*1.25); + float setYaw = mg.aim.getCenterYaw(); + float true_head_angle = MathHelper.wrapDegrees(passenger.prevRotationYawHead-setYaw); float wtime; mg.applyOrientationToEntity(passenger); @@ -394,21 +363,22 @@ public boolean handleBipedRotations(ModelBiped model, EntityMachinegun mg, Entit IBlockState state = passenger.world.getBlockState(passenger.getPosition()); boolean tripod = mg.upgrades.contains(WeaponUpgrade.TRIPOD); + float aimYaw = mg.aim.getYaw(0f)-setYaw; if(!tripod&&state.getMaterial().isSolid()&&!(state.getBlock()==IIContent.blockMetalDevice&&state.getValue(IIContent.blockMetalDevice.property)==IIBlockTypes_MetalDevice.AMMUNITION_CRATE)) { - if(Math.abs(mg.getGunYaw(0f)-true_head_angle) > 5) + if(Math.abs(aimYaw-true_head_angle) > 5) { wtime = Math.abs((mg.getEntityWorld().getTotalWorldTime()+partialTicks)%20/20f-0.5f)/0.5f; wtime *= 0.25f; if(!mg.isSetupComplete()) wtime = 0; - if(mg.getGunYaw(0f) < true_head_angle) + if(aimYaw < true_head_angle) { model.bipedRightLeg.rotateAngleY = -wtime*2f; model.bipedLeftLeg.rotateAngleY = wtime*2f; } - else if(mg.getGunYaw(0f) > true_head_angle) + else if(aimYaw > true_head_angle) { model.bipedRightLeg.rotateAngleY = -wtime*2f; model.bipedLeftLeg.rotateAngleY = wtime*2f; @@ -430,8 +400,8 @@ else if(mg.getGunYaw(0f) > true_head_angle) float maxRotation = 45.0F; - model.bipedRightLeg.rotateAngleY += mg.getGunYaw(0f)/maxRotation; - model.bipedLeftLeg.rotateAngleY += mg.getGunYaw(0f)/maxRotation; + model.bipedRightLeg.rotateAngleY += aimYaw/maxRotation; + model.bipedLeftLeg.rotateAngleY += aimYaw/maxRotation; //model.bipedLeftLeg.rotateAngleY += ff+1f; @@ -443,13 +413,13 @@ else if(mg.getGunYaw(0f) > true_head_angle) if(!mg.isSetupComplete()) wtime = 0; model.bipedBody.rotateAngleX -= 0.0625f; - if(Math.abs(mg.getGunYaw(0f)-true_head_angle) > 5) - if(mg.getGunYaw(0f) < true_head_angle) + if(Math.abs(aimYaw-true_head_angle) > 5) + if(aimYaw < true_head_angle) { model.bipedRightLeg.rotateAngleX = wtime*2f; model.bipedLeftLeg.rotateAngleX = -wtime*2f; } - else if(mg.getGunYaw(0f) > true_head_angle) + else if(aimYaw > true_head_angle) { model.bipedRightLeg.rotateAngleX = -wtime*2f; model.bipedLeftLeg.rotateAngleX = wtime*2f; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/weapon/MortarRenderer.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/weapon/MortarRenderer.java index 30ddca928..489ca31c0 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/weapon/MortarRenderer.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/weapon/MortarRenderer.java @@ -52,7 +52,7 @@ public void doRender(EntityMortar entity, double x, double y, double z, float en float progress = MathHelper.clamp(((entity.setupTime+partialTicks)/Mortar.setupTime), 0, 1); bindTexture(TEXTURE); - GlStateManager.rotate(-entityYaw+90, 0, 1, 0); + GlStateManager.rotate(-entity.aim.getYaw(partialTicks)+90, 0, 1, 0); if(progress==1) renderNormal(entity, entityYaw, partialTicks, (entity.shootingProgress+partialTicks)/Mortar.shootTime); @@ -68,7 +68,7 @@ private void renderNormal(EntityMortar entity, float entityYaw, float partialTic { GlStateManager.pushMatrix(); - float pitch = MathHelper.clamp((((entity.rotationPitch)+80)/25f), 0, 1); + float pitch = entity.aim.getPitchNormalized(partialTicks); //0.0625f, 35f, 0.60625f, 0.25f //-0.25f, 10f, 0f, 0.125f @@ -102,7 +102,7 @@ private void renderNormal(EntityMortar entity, float entityYaw, float partialTic { float f = (progress-0.2f)/0.3f; - if(entity.getPassengers().size() > 0) + if(!entity.getPassengers().isEmpty()) { Entity psg = entity.getPassengers().get(0); if(psg instanceof EntityLivingBase) diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/weapon/TripodPeriscopeRenderer.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/weapon/TripodPeriscopeRenderer.java index ba67519b8..618471a4a 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/weapon/TripodPeriscopeRenderer.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/weapon/TripodPeriscopeRenderer.java @@ -49,9 +49,9 @@ public void doRender(EntityTripodPeriscope entity, double x, double y, double z, ClientUtils.bindTexture(texture); if(progress==1) - renderNormal(entity, entityYaw, partialTicks, progress); + renderNormal(entity, 0, partialTicks, progress); else - renderProgress(entity, entityYaw, partialTicks, progress); + renderProgress(entity, 0, partialTicks, progress); GlStateManager.disableBlend(); GlStateManager.disableRescaleNormal(); @@ -61,7 +61,6 @@ public void doRender(EntityTripodPeriscope entity, double x, double y, double z, private void renderNormal(EntityTripodPeriscope entity, float entityYaw, float partialTicks, float progress) { GlStateManager.pushMatrix(); - GlStateManager.rotate(entityYaw, 0, 1, 0); for(ModelRendererTurbo mod : model.baseModel) mod.render(); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/util/CameraHandler.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/util/CameraHandler.java index 0c3685433..46c33c730 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/util/CameraHandler.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/util/CameraHandler.java @@ -7,11 +7,11 @@ import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.math.Vec3d; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import pl.pabilo8.immersiveintelligence.api.utils.camera.IEntityZoomProvider; -import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedZoomTool; -import pl.pabilo8.immersiveintelligence.client.ClientEventHandler; +import pl.pabilo8.immersiveintelligence.api.utils.camera.ICameraEntity; +import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedZoom; import pl.pabilo8.immersiveintelligence.common.entity.EntityCamera; /** @@ -25,12 +25,18 @@ public class CameraHandler //--- ZoomHandler ---// public static float fovZoom = 1; public static ZoomType type = null; - public static IAdvancedZoomTool zoom; + public static IAdvancedZoom zoom; public static ItemStack stack; + //--- CameraHandler ---// private static EntityCamera camera; private static boolean enabled = false; + public static void setCameraPos(Vec3d pos) + { + setCameraPos(pos.x, pos.y, pos.z); + } + public static void setCameraPos(BlockPos pos) { setCameraPos(pos.getX()+0.5, pos.getY(), pos.getZ()+0.5); @@ -101,21 +107,24 @@ private static boolean handleZoomLogic() Entity lowestRidden; //Zoom provider is an item in player's hand - if((stack = player.getHeldItem(EnumHand.MAIN_HAND)).getItem() instanceof IAdvancedZoomTool) + if((stack = player.getHeldItem(EnumHand.MAIN_HAND)).getItem() instanceof IAdvancedZoom) { type = ZoomType.ITEM_MAINHAND; - zoom = (IAdvancedZoomTool)(stack.getItem()); + zoom = (IAdvancedZoom)(stack.getItem()); } - else if((stack = player.getHeldItem(EnumHand.OFF_HAND)).getItem() instanceof IAdvancedZoomTool) + else if((stack = player.getHeldItem(EnumHand.OFF_HAND)).getItem() instanceof IAdvancedZoom) { type = ZoomType.ITEM_OFFHAND; - zoom = (IAdvancedZoomTool)(stack.getItem()); + zoom = (IAdvancedZoom)(stack.getItem()); } //Zoom provider is an entity ridden by player - else if(ClientEventHandler.mgAiming&&(lowestRidden = player.getLowestRidingEntity()) instanceof IEntityZoomProvider) + else if((lowestRidden = player.getLowestRidingEntity()) instanceof ICameraEntity) { + ICameraEntity camera = (ICameraEntity)lowestRidden; + if(!camera.isCameraEnabled(player)) + return false; type = ZoomType.RIDING; - zoom = ((IEntityZoomProvider)lowestRidden).getZoom(); + zoom = camera.getZoom(); } else return false; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/util/IIKeybind.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/util/IIKeybind.java index 911f2beff..6d8a9cfc4 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/util/IIKeybind.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/util/IIKeybind.java @@ -2,9 +2,11 @@ import blusunrize.immersiveengineering.client.ClientUtils; import net.minecraft.client.settings.KeyBinding; +import net.minecraft.entity.Entity; import net.minecraftforge.client.settings.IKeyConflictContext; import net.minecraftforge.fml.client.registry.ClientRegistry; import pl.pabilo8.immersiveintelligence.ImmersiveIntelligence; +import pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon.EntityMountedWeapon; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.EntityVehicleSeat; /** @@ -21,7 +23,8 @@ public class IIKeybind extends KeyBinding @Override public boolean isActive() { - return ClientUtils.mc().player.getRidingEntity() instanceof EntityVehicleSeat; + Entity seat = ClientUtils.mc().player.getRidingEntity(); + return seat instanceof EntityVehicleSeat||seat instanceof EntityMountedWeapon; } @Override diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/IISounds.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/IISounds.java index c5b269ee0..a639b5ed4 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/IISounds.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/IISounds.java @@ -277,6 +277,8 @@ public class IISounds public static SoundEvent constructionElectricWrench = registerSound("construction_electric_wrench"); @ModSound(sounds = {"construction/wrench/wrench{0..2}"}, subtitle = "construction") public static SoundEvent constructionWrench = registerSound("construction_wrench"); + @ModSound(sounds = {"weapons/weapon_placed/weapon_placed{0..1}"}, subtitle = "*") + public static SoundEvent weaponPlaced = registerSound("weapon_placed"); //--- Guns ---// //Ammo Pickup diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/metal_device/tileentity/effect_crate/TileEntityAmmunitionCrate.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/metal_device/tileentity/effect_crate/TileEntityAmmunitionCrate.java index 48d503f1d..3bc1238bd 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/metal_device/tileentity/effect_crate/TileEntityAmmunitionCrate.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/metal_device/tileentity/effect_crate/TileEntityAmmunitionCrate.java @@ -38,9 +38,7 @@ public class TileEntityAmmunitionCrate extends TileEntityEffectCrate static { UpgradeTechTree.getTreeFor(TileEntityAmmunitionCrate.class) - .withUpgrade(IIContent.UPGRADE_INSERTER, UpgradeTier.TIER_1) - .withUpgrade(IIContent.UPGRADE_MG_LOADER, UpgradeTier.TIER_2) - .withDependency(IIContent.UPGRADE_INSERTER, IIContent.UPGRADE_MG_LOADER); + .withUpgrade(IIContent.UPGRADE_MG_LOADER, UpgradeTier.TIER_1); } public TileEntityAmmunitionCrate() diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/metal_device/tileentity/effect_crate/TileEntityEffectCrate.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/metal_device/tileentity/effect_crate/TileEntityEffectCrate.java index 6dc2a6c1b..a19922708 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/metal_device/tileentity/effect_crate/TileEntityEffectCrate.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/metal_device/tileentity/effect_crate/TileEntityEffectCrate.java @@ -19,7 +19,6 @@ import net.minecraft.util.math.*; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentString; -import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import net.minecraft.world.WorldServer; import net.minecraft.world.storage.loot.ILootContainer; @@ -28,7 +27,6 @@ import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; -import pl.pabilo8.immersiveintelligence.ImmersiveIntelligence; import pl.pabilo8.immersiveintelligence.api.upgrade.IManagedUpgradableDevice; import pl.pabilo8.immersiveintelligence.api.upgrade.IUpgradableDevice; import pl.pabilo8.immersiveintelligence.api.upgrade.UpgradeManager; @@ -117,7 +115,7 @@ public boolean canRotate(EnumFacing axis) @Nullable public ITextComponent getDisplayName() { - return name!=null?new TextComponentString(name): new TextComponentTranslation("tile."+ImmersiveIntelligence.MODID+".metal_device.metal_crate.name"); + return name!=null?new TextComponentString(name): null; } @Override @@ -177,6 +175,8 @@ public void readCustomNBT(NBTTagCompound nbt, boolean descPacket) open = nbt.getBoolean("open"); if(nbt.hasKey("facing")) setFacing(EnumFacing.getFront(nbt.getInteger("facing"))); + if(nbt.hasKey("upgrades")) + upgradeManager.deserializeNBT(nbt.getCompoundTag("upgrades")); energyStorage = nbt.getInteger("energyStorage"); if(!descPacket) @@ -197,6 +197,7 @@ public void writeCustomNBT(NBTTagCompound nbt, boolean descPacket) nbt.setBoolean("open", open); nbt.setInteger("facing", facing.getIndex()); nbt.setInteger("energyStorage", energyStorage); + nbt.setTag("upgrades", upgradeManager.serializeNBT()); if(!descPacket) { if(lootTable!=null) @@ -221,6 +222,8 @@ public void onAnimationChangeServer(boolean state, int part) @Override public void receiveMessageFromServer(NBTTagCompound message) { + if(message.hasKey("upgrades")) + upgradeManager.deserializeNBT(message.getCompoundTag("upgrades")); if(message.hasKey("focused")) focusedEntity = world.getEntityByID(message.getInteger("focused")); else diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/hans/tasks/AIHansMachinegun.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/hans/tasks/AIHansMachinegun.java index 9022f5256..0a7342d2b 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/hans/tasks/AIHansMachinegun.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/hans/tasks/AIHansMachinegun.java @@ -3,9 +3,7 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.ai.EntityAIBase; -import net.minecraft.util.math.MathHelper; import pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon.EntityMachinegun; -import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT.SyncEvents; import javax.annotation.Nullable; @@ -58,30 +56,14 @@ public void updateTask() if(mg!=null) { if(mg.controls!=null) - { mg.controls.setKey("fire", false); - if(mg.controls.isDirty()) - mg.updateEntityForEvent(SyncEvents.ENTITY_VEHICLE_CONTROLS); - } if(target!=null) { hans.getLookHelper().setLookPositionWithEntity(target, hans.getHorizontalFaceSpeed(), hans.getVerticalFaceSpeed()); - if(isAimedAt()) - if(mg.controls!=null) - { - mg.controls.setKey("fire", true); - if(mg.controls.isDirty()) - mg.updateEntityForEvent(SyncEvents.ENTITY_VEHICLE_CONTROLS); - } + if(mg.aim.isAimed()&&mg.controls!=null) + mg.controls.setKey("fire", true); } - } } - - public boolean isAimedAt() - { - return MathHelper.wrapDegrees(hans.rotationPitch)-mg.getGunPitch(0f) < 5 - &&MathHelper.wrapDegrees(hans.rotationYawHead)-MathHelper.wrapDegrees(mg.rotationYaw) < 5; - } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMachinegun.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMachinegun.java index 1de4a3241..194c2803a 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMachinegun.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMachinegun.java @@ -4,9 +4,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.DamageSource; -import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; -import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.Vec3d; @@ -17,10 +15,10 @@ import pl.pabilo8.immersiveintelligence.api.MachinegunCoolantHandler; import pl.pabilo8.immersiveintelligence.api.ammo.utils.AmmoFactory; import pl.pabilo8.immersiveintelligence.api.utils.IEntitySpecialRepairable; -import pl.pabilo8.immersiveintelligence.api.utils.camera.IEntityZoomProvider; +import pl.pabilo8.immersiveintelligence.api.utils.camera.ICameraEntity; import pl.pabilo8.immersiveintelligence.api.utils.camera.ZoomSettings; import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedTextOverlay; -import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedZoomTool; +import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedZoom; import pl.pabilo8.immersiveintelligence.client.ClientProxy; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons.Machinegun; import pl.pabilo8.immersiveintelligence.common.IIContent; @@ -28,8 +26,6 @@ import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleControls; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleDurability; import pl.pabilo8.immersiveintelligence.common.item.weapons.ItemIIWeaponUpgrade.WeaponUpgrade; -import pl.pabilo8.immersiveintelligence.common.network.IIPacketHandler; -import pl.pabilo8.immersiveintelligence.common.network.messages.MessagePlayerAimAnimationSync; import pl.pabilo8.immersiveintelligence.common.util.FilteredFluidTank; import pl.pabilo8.immersiveintelligence.common.util.IIMath; import pl.pabilo8.immersiveintelligence.common.util.IIReference; @@ -47,7 +43,7 @@ * @ii-approved 0.3.1 * @since 01.11.2019 */ -public class EntityMachinegun extends EntityMountedWeapon implements IAdvancedTextOverlay, IEntitySpecialRepairable, IEntityZoomProvider +public class EntityMachinegun extends EntityMountedWeapon implements IAdvancedTextOverlay, IEntitySpecialRepairable, ICameraEntity { private final static ZoomSettings SCOPE = new ZoomSettings(Machinegun.machinegunScopeMaxZoom, IIReference.RES_TEXTURES_GUI.with("item/machinegun/scope.png")); @@ -65,8 +61,8 @@ public class EntityMachinegun extends EntityMountedWeapon implements IAdvancedTe @SyncNBT(events = SyncEvents.ENTITY_CUSTOM1) public ItemStack magazine1 = ItemStack.EMPTY, magazine2 = ItemStack.EMPTY; - @SyncNBT(events = {SyncEvents.ENTITY_CUSTOM1, SyncEvents.ENTITY_CUSTOM2}) - public float setYaw = 0; + @SyncNBT(events = SyncEvents.ENTITY_CUSTOM1) + public boolean aiming = false; @SyncNBT(events = SyncEvents.ENTITY_CUSTOM1) public VehicleDurability shield = new VehicleDurability(Machinegun.shieldStrengthInitial, 2); @@ -74,12 +70,9 @@ public class EntityMachinegun extends EntityMountedWeapon implements IAdvancedTe public FilteredFluidTank tank = new FilteredFluidTank(0) .withInputFilter(MachinegunCoolantHandler::isValidCoolant); - private boolean lastAimState = false; - public EntityMachinegun(World world) { super(world); - this.baseAabb = new AxisAlignedBB(-0.35, 0, -0.35, 0.35, 0.65, 0.35); this.controls = new VehicleControls().withStates("fire", "reload", "aim"); if(world.isRemote) this.controls @@ -93,7 +86,7 @@ public EntityMachinegun(World world, BlockPos pos, float yaw, ItemStack stack) { this(world); this.setPosition(pos.getX(), pos.getY(), pos.getZ()); - this.setYaw = yaw; + this.aim.withCenterYaw(yaw); setOriginStack(stack); } @@ -108,10 +101,11 @@ protected void setOriginStack(ItemStack stack) this.aim.withAimCorrectionFunction(this.ammoFactory::getAnglePrediction) .withPitchLimit(-25.0f, 25f) .withYawLimit(-55.0f, 55f) - .withAimSpeed(2f, 1f); + .withAimSpeed(3.5f, 3f); this.recoil.withRecoilLimits(22.5f, 22.5f) .withRecoilStrength(Machinegun.recoilVertical, Machinegun.recoilHorizontal, 0.5f, 0.05f) .withOverheating(Machinegun.maxOverheat, 0.75f, () -> tank); + this.setSize(0.77f, 0.65f); //Set upgrade parameters assert stack.getItem()==IIContent.itemMachinegun; @@ -121,9 +115,9 @@ protected void setOriginStack(ItemStack stack) { case HEAVY_BARREL: this.shooting.withMaxShotDelay(Machinegun.heavyBarrelFireDelay); + this.recoil.withRecoilStrength(Machinegun.recoilHBVertical, Machinegun.recoilHBHorizontal, 0.5f, 0.05f); break; case WATER_COOLING: - //TODO: 17.05.2026 this.shooting.withMaxShotDelay(Machinegun.heavyBarrelFireDelay); break; case SECOND_MAGAZINE: @@ -146,7 +140,8 @@ protected void setOriginStack(ItemStack stack) break; case TRIPOD: this.maxSetupTime = (int)(this.maxSetupTime*Machinegun.tripodSetupTimeMultiplier); - this.aim.withYawLimit(-82.5f, 82.5f); + this.aim.withYawLimit(-180, 180f); + this.setSize(0.77f, 1.65f); break; default: break; @@ -157,8 +152,8 @@ protected void setOriginStack(ItemStack stack) @Nonnull protected Vec3d getPassengerPosition(Entity passenger) { - return IIMath.offsetPosDirectionXZ(-1.65f, -0.25f, rotationYaw, rotationPitch) - .addVector(0.5, -1.15, 0.5); + return IIMath.offsetPosDirectionXZ(-0.65f-1f, 0f, aim.getYaw(0), 0) + .addVector(0, -1.15+(upgrades.contains(WeaponUpgrade.TRIPOD)?1f: 0f), 0); } @Override @@ -171,16 +166,17 @@ public void onEntityUpdate() shooting.update(); //Apply controls - if(!world.isRemote&&isBeingRidden()) + if(isBeingRidden()) { - Entity operator = getPassengers().get(0); - boolean currentAim = isAiming(); - if(currentAim!=lastAimState) - { - IIPacketHandler.INSTANCE.sendToDimension(new MessagePlayerAimAnimationSync(operator, currentAim), - this.world.provider.getDimension()); - lastAimState = currentAim; - } +// Entity operator = getPassengers().get(0); + aiming = controls.getKey("aim"); + Entity user = getPassengers().get(0); + aim.setTarget(aim.clampYawToRange(user.getRotationYawHead()), aim.clampPitchToRange(user.rotationPitch)); + } + else + { + aim.setTarget(aim.getTargetYaw(), aim.clampPitchToRange(-10f)); + aim.update(); } } @@ -205,9 +201,6 @@ protected void removePassenger(Entity passenger) controls.setKey("fire", false); controls.setKey("aim", false); } - lastAimState = false; - if(!world.isRemote) - IIPacketHandler.INSTANCE.sendToDimension(new MessagePlayerAimAnimationSync(passenger, false), this.world.provider.getDimension()); super.removePassenger(passenger); } @@ -215,88 +208,89 @@ protected void removePassenger(Entity passenger) @Override public void applyOrientationToEntity(Entity entityToUpdate) { - entityToUpdate.prevRotationYaw = aim.clampYawToRange(entityToUpdate.prevRotationYaw); entityToUpdate.rotationYaw = aim.clampYawToRange(entityToUpdate.rotationYaw); - entityToUpdate.prevRotationPitch = aim.clampPitchToRange(entityToUpdate.prevRotationYaw); entityToUpdate.rotationPitch = aim.clampPitchToRange(entityToUpdate.rotationPitch); } @Override public boolean attackEntityFrom(DamageSource source, float amount) { - if(!isDead&&source.isProjectile()) + if(source.isProjectile()&&upgrades.contains(WeaponUpgrade.SHIELD)) { - Vec3d attackVector = source.getDamageLocation(); - if(attackVector!=null) - { - attackVector = attackVector.subtract(posX, posY, posZ); - if(getHorizontalFacing()==EnumFacing.getFacingFromVector((float)attackVector.x, (float)attackVector.y, (float)attackVector.z)) - { - shield.attackFrom(source, amount); - return shield.isDead(); - } - } + shield.attackFrom(source, amount); + return shield.isDead(); } return super.attackEntityFrom(source, amount); } - //--- Getters ---// + //--- IEntitySpecialRepairable ---// - public float getGunYaw(float partialTicks) + @Override + public boolean canRepair() { - return aim.getYaw(partialTicks); + return shield.canRepair(); } - public float getGunPitch(float partialTicks) + @Override + public boolean repair(int repairPoints) { - return aim.getPitch(partialTicks); + return shield.repair(repairPoints); } - private boolean isFiring() + @Override + public int getRepairCost() { - return controls.getKey("fire"); + return 1; } - private boolean isAiming() + //--- IAdvancedTextOverlay ---// + + @SideOnly(Side.CLIENT) + @Override + public String[] getOverlayText(EntityPlayer player, RayTraceResult mop) { - return controls.getKey("aim"); + return new String[0]; } - //--- IEntitySpecialRepairable ---// + //--- ICameraEntity ---// @Override - public boolean canRepair() + public boolean isCameraEnabled(EntityPlayer player) { - return shield.canRepair(); + SCOPE.withZoomEnabled(aiming); + SCOPE_IR.withZoomEnabled(aiming); + return aiming; } @Override - public boolean repair(int repairPoints) + public float getCameraPitch(EntityPlayer cameraPlayer, float partialTicks) { - return shield.repair(repairPoints); + return aim.getPitch(partialTicks); } @Override - public int getRepairCost() + public float getCameraYaw(EntityPlayer cameraPlayer, float partialTicks) { - return 1; + return aim.getYaw(partialTicks); } - //--- IEntityZoomProvider ---// - @Override - public IAdvancedZoomTool getZoom() + public Vec3d getCameraPos(EntityPlayer cameraPlayer, float partialTicks) { - //TODO: 15.05.2026 check for scope - return null; + float cameraYaw = getCameraYaw(cameraPlayer, partialTicks); + float cameraPitch = getCameraPitch(cameraPlayer, partialTicks); + return getPositionVector() + .addVector(0, (0.34375+0.0625)*0.85-1.75f+0.5+(upgrades.contains(WeaponUpgrade.TRIPOD)?1f: 0f), 0) + .add(IIMath.offsetPosDirectionXYZ(new Vec3d(-1.5, 0.0625, 0), cameraYaw, -cameraPitch, 0)); } - //--- IAdvancedTextOverlay ---// + //--- IEntityZoomProvider ---// - @SideOnly(Side.CLIENT) @Override - public String[] getOverlayText(EntityPlayer player, RayTraceResult mop) + public IAdvancedZoom getZoom() { - return new String[0]; + if(upgrades.contains(WeaponUpgrade.SCOPE)) + return SCOPE; + return upgrades.contains(WeaponUpgrade.INFRARED_SCOPE)?SCOPE_IR: null; } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMortar.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMortar.java index 12fdbff62..7121e67f1 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMortar.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMortar.java @@ -8,18 +8,15 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.DamageSource; import net.minecraft.util.EnumHand; -import net.minecraft.util.ResourceLocation; import net.minecraft.util.SoundCategory; -import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; -import pl.pabilo8.immersiveintelligence.ImmersiveIntelligence; import pl.pabilo8.immersiveintelligence.api.ammo.utils.AmmoFactory; -import pl.pabilo8.immersiveintelligence.api.utils.camera.IEntityZoomProvider; -import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedZoomTool; +import pl.pabilo8.immersiveintelligence.api.utils.camera.ICameraEntity; +import pl.pabilo8.immersiveintelligence.api.utils.camera.ZoomSettings; +import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedZoom; +import pl.pabilo8.immersiveintelligence.client.ClientProxy; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons.Mortar; import pl.pabilo8.immersiveintelligence.common.IIContent; import pl.pabilo8.immersiveintelligence.common.IISounds; @@ -27,6 +24,7 @@ import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleControls; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleControls.MouseBinding; import pl.pabilo8.immersiveintelligence.common.util.IIMath; +import pl.pabilo8.immersiveintelligence.common.util.IIReference; import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT; import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT.SyncEvents; @@ -38,30 +36,34 @@ * @ii-approved 0.3.1 * @since 21.01.2021 */ -public class EntityMortar extends EntityMountedWeapon implements IEntityZoomProvider +public class EntityMortar extends EntityMountedWeapon implements ICameraEntity { - private static final MortarSights SIGHTS = new MortarSights(); + private static final ZoomSettings SIGHTS = new ZoomSettings(new float[]{0.5f}, IIReference.RES_TEXTURES_GUI.with("item/mortar.png")); private final AmmoFactory ammoFactory = new AmmoFactory<>(this); @SyncNBT(events = SyncEvents.ENTITY_CUSTOM1) - public float shootingProgress = 0f; + public float shootingProgress = 0f, rotateYawPrep = 0f; public EntityMortar(World world) { super(world); - this.baseAabb = new AxisAlignedBB(-0.5, 0, -0.5, 0.5, 1.5, 0.5); + this.setSize(1f, 1.5f); this.maxSetupTime = Mortar.setupTime; this.aim.withYawLimit(-180f, 180f) - .withPitchLimit(45f, 85f) - .withCurrentAngles(0f, 85f); + .withPitchLimit(-89, -45) + .withCurrentAngles(0f, 89f); - this.controls = new VehicleControls().withStates("fire", "pitchUp", "pitchDown"); + this.controls = new VehicleControls().withStates("fire", "aim", "up", "down", "left", "right"); if(world.isRemote) this.controls .withMouseBinding(MouseBinding.MOUSE_RIGHT, "fire") - .withKeyBinding(ClientUtils.mc().gameSettings.keyBindForward, "pitchUp") - .withKeyBinding(ClientUtils.mc().gameSettings.keyBindBack, "pitchDown"); + .withKeyBinding(ClientProxy.keybindZoom, "aim") + .withKeyBinding(ClientUtils.mc().gameSettings.keyBindForward, "up") + .withKeyBinding(ClientUtils.mc().gameSettings.keyBindBack, "down") + .withKeyBinding(ClientUtils.mc().gameSettings.keyBindLeft, "left") + .withKeyBinding(ClientUtils.mc().gameSettings.keyBindRight, "right"); + setOriginStack(new ItemStack(IIContent.itemMortar)); } @@ -113,6 +115,21 @@ public void onEntityUpdate() if(shootingProgress==0) { + //Handle aiming + if(controls.getKey("up")) + aim.setTarget(aim.getTargetYaw(), aim.getTargetPitch()+0.5f); + else if(controls.getKey("down")) + aim.setTarget(aim.getTargetYaw(), aim.getTargetPitch()-0.5f); + + //Handle rotation + if(controls.getKey("left")||controls.getKey("right")) + { + + } + else + rotateYawPrep = Math.max(0, rotateYawPrep-1); + + //Handle firing if(controls.getKey("fire")&&!getPassengers().isEmpty()) { Entity entity = getPassengers().get(0); @@ -126,10 +143,7 @@ public void onEntityUpdate() } } } - else if(controls.getKey("pitchUp")) - aim.setTarget(aim.getTargetYaw(), aim.getTargetPitch()+0.5f); - else if(controls.getKey("pitchDown")) - aim.setTarget(aim.getTargetYaw(), aim.getTargetPitch()-0.5f); + } else if(!getPassengers().isEmpty()) { @@ -177,36 +191,34 @@ public boolean attackEntityFrom(DamageSource source, float amount) } @Override - public IAdvancedZoomTool getZoom() + public IAdvancedZoom getZoom() { return SIGHTS; } - private static class MortarSights implements IAdvancedZoomTool + @Override + public float getCameraPitch(EntityPlayer cameraPlayer, float partialTicks) { - private static final ResourceLocation SIGHTS_TEXTURE = new ResourceLocation(ImmersiveIntelligence.MODID, "textures/gui/item/mortar.png"); + return 0; + } - @Override - @SideOnly(Side.CLIENT) - public ResourceLocation getZoomOverlayTexture(ItemStack stack, EntityPlayer player) - { - return SIGHTS_TEXTURE; - } + @Override + public float getCameraYaw(EntityPlayer cameraPlayer, float partialTicks) + { + return aim.getYaw(partialTicks); + } - @Override - public boolean shouldZoom(ItemStack stack, EntityPlayer player) - { - Entity ridingEntity = player.getRidingEntity(); - return ridingEntity instanceof EntityMortar&&((EntityMortar)ridingEntity).shootingProgress==0; - } + @Override + public Vec3d getCameraPos(EntityPlayer cameraPlayer, float partialTicks) + { + return getPositionVector().addVector(0, 1, 0); + } - @Override - public float[] getZoomSteps(ItemStack stack, EntityPlayer player) - { - Entity ridingEntity = player.getRidingEntity(); - if(ridingEntity instanceof EntityMortar) - return new float[]{1f-Math.min(0.75f/(ridingEntity.rotationPitch/-90f), 0.975f)}; - return new float[]{0}; - } + @Override + public boolean isCameraEnabled(EntityPlayer player) + { + boolean aiming = controls.getKey("aim"); + SIGHTS.withZoomEnabled(aiming); + return aiming; } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMountedWeapon.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMountedWeapon.java index dd2c56fbe..885ead881 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMountedWeapon.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMountedWeapon.java @@ -46,12 +46,12 @@ public abstract class EntityMountedWeapon extends Entity implements IEntityAddit public int setupTime = 0, maxSetupTime = 1; @SyncNBT(events = SyncEvents.ENTITY_INTERACT) private ItemStack originStack = ItemStack.EMPTY; - - protected AxisAlignedBB baseAabb = new AxisAlignedBB(-0.5, -0.5, -0.5, 0.5, 0.5, 0.5); + private AxisAlignedBB baseAabb; public EntityMountedWeapon(World world) { super(world); + setSize(1f, 1f); } @Override @@ -149,6 +149,15 @@ public final ItemStack getOriginStack() //--- Collisions ---// + + @Override + protected void setSize(float width, float height) + { + this.width = width; + this.height = height; + this.baseAabb = new AxisAlignedBB(-width/2f, 0, -width/2f, width/2f, height, width/2f); + } + @Override public final boolean canBeCollidedWith() { @@ -210,6 +219,8 @@ protected void removePassenger(Entity passenger) } else updateEntityForEvent(SyncEvents.ENTITY_PASSENGER); + Vec3d pos = getPositionVector().add(getPassengerPosition(passenger)); + passenger.setPosition(pos.x, pos.y, pos.z); super.removePassenger(passenger); } @@ -217,14 +228,15 @@ protected void removePassenger(Entity passenger) public boolean processInitialInteract(EntityPlayer player, EnumHand hand) { //Pick up weapon - if(!world.isRemote&&player.isSneaking()&&getPassengers().isEmpty()) + if(player.isSneaking()&&getPassengers().isEmpty()) { setDead(); - entityDropItem(originStack, 0f); + if(!world.isRemote) + entityDropItem(originStack, 0f); return true; } //Enter as passenger - if(isSetupComplete()&&player.getRidingEntity()!=this&&getPassengers().isEmpty()) + else if(isSetupComplete()&&player.getRidingEntity()!=this&&getPassengers().isEmpty()) { player.startRiding(this); if(!world.isRemote) diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityTripodPeriscope.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityTripodPeriscope.java index 8c57aa9e5..48b753ed1 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityTripodPeriscope.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityTripodPeriscope.java @@ -1,13 +1,13 @@ package pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon; import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; -import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; -import pl.pabilo8.immersiveintelligence.api.utils.camera.IEntityZoomProvider; +import pl.pabilo8.immersiveintelligence.api.utils.camera.ICameraEntity; import pl.pabilo8.immersiveintelligence.api.utils.camera.ZoomSettings; -import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedZoomTool; +import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedZoom; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Tools.TripodPeriscope; import pl.pabilo8.immersiveintelligence.common.IIContent; import pl.pabilo8.immersiveintelligence.common.util.IIMath; @@ -23,7 +23,7 @@ * @ii-approved 0.3.1 * @since 21.01.2021 */ -public class EntityTripodPeriscope extends EntityMountedWeapon implements IEntityZoomProvider +public class EntityTripodPeriscope extends EntityMountedWeapon implements ICameraEntity { private static final ZoomSettings ZOOM = new ZoomSettings(tripodZoomSteps, IIReference.RES_TEXTURES_GUI.with("item/binoculars.png")) .withZoomEnabled(true); @@ -31,9 +31,9 @@ public class EntityTripodPeriscope extends EntityMountedWeapon implements IEntit public EntityTripodPeriscope(World world) { super(world); - this.baseAabb = new AxisAlignedBB(-0.5, -0.5, -0.5, 0.5, 0.5, 0.5); - this.aim.withYawLimit(-180f, 180f) - .withPitchLimit(0f, 0f) + this.setSize(0.77f, 2.4375f); + this.aim.withYawLimit(-180.0f, 180f) + .withPitchLimit(22.5f, -22.5f) .withAimSpeed(TripodPeriscope.turnSpeed, 1f); this.maxSetupTime = TripodPeriscope.setupTime; @@ -44,7 +44,7 @@ public EntityTripodPeriscope(World world) @Nonnull protected Vec3d getPassengerPosition(Entity passenger) { - return IIMath.offsetPosDirectionXZ(-0.5, -0.0625f/2f, this.aim.getYaw(0), 0); + return IIMath.offsetPosDirectionXZ(-0.5, -0.03125f, this.aim.getYaw(0), 0); } @Override @@ -55,19 +55,48 @@ public void onEntityUpdate() if(isSetupComplete()&&!getPassengers().isEmpty()) { Entity user = getPassengers().get(0); - aim.setTarget(user.getRotationYawHead(), 0); + aim.setTarget(user.getRotationYawHead(), user.rotationPitch); } } @Override public void applyOrientationToEntity(Entity entityToUpdate) { - entityToUpdate.setRenderYawOffset(this.aim.getCurrentYaw()); + entityToUpdate.setRenderYawOffset(this.aim.getYaw(0)); entityToUpdate.setRotationYawHead(entityToUpdate.rotationYaw); } + //--- ICameraEntity ---// + + @Override + public boolean isCameraEnabled(EntityPlayer player) + { + return true; + } + + @Override + public float getCameraPitch(EntityPlayer cameraPlayer, float partialTicks) + { + return aim.getPitch(partialTicks); + } + + @Override + public float getCameraYaw(EntityPlayer cameraPlayer, float partialTicks) + { + return aim.getYaw(partialTicks); + } + + @Override + public Vec3d getCameraPos(EntityPlayer cameraPlayer, float partialTicks) + { + float cameraYaw = getCameraYaw(cameraPlayer, partialTicks); + float cameraPitch = getCameraPitch(cameraPlayer, partialTicks); + return getPositionVector() + .add(IIMath.offsetPosDirectionXYZ(new Vec3d(0, 2.5f, -0.5f), cameraYaw, cameraPitch, 0)); + } + @Override - public IAdvancedZoomTool getZoom() + public IAdvancedZoom getZoom() { return ZOOM; } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldHowitzer.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldHowitzer.java index a247a5455..355979cb7 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldHowitzer.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldHowitzer.java @@ -13,8 +13,8 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import pl.pabilo8.immersiveintelligence.api.ammo.utils.AmmoFactory; -import pl.pabilo8.immersiveintelligence.api.utils.camera.IEntityZoomProvider; -import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedZoomTool; +import pl.pabilo8.immersiveintelligence.api.utils.camera.ICameraEntity; +import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedZoom; import pl.pabilo8.immersiveintelligence.client.ClientProxy; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Vehicles.FieldHowitzer; import pl.pabilo8.immersiveintelligence.common.IIContent; @@ -29,6 +29,7 @@ import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.EntityVehicleSeat.SeatInfo; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.EntityVehicleWheel; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.WheelType; +import pl.pabilo8.immersiveintelligence.common.util.IIMath; import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT; import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT.SyncEvents; @@ -37,7 +38,7 @@ * @since 18.07.2020 */ @VehicleBlueprint(id = "immersiveintelligence:towed/field_howitzer", mass = 4, type = VehicleType.TOWED_WEAPON) -public class EntityFieldHowitzer extends EntityVehicleTowable implements IEntityZoomProvider +public class EntityFieldHowitzer extends EntityVehicleTowable implements ICameraEntity { //--- AABBs ---// static final AxisAlignedBB AABB_WHEEL = new AxisAlignedBB(-0.25, 0d, 0.25, 0.25, 1d, -0.25); @@ -101,8 +102,8 @@ protected EntityVehiclePart[] vehicleInit() .withKeyBinding(settings.keyBindLeft, "turnLeft") .withKeyBinding(settings.keyBindRight, "turnRight"); this.gunnerControls - .withKeyBinding(settings.keyBindForward, "up") - .withKeyBinding(settings.keyBindBack, "down") + .withKeyBinding(ClientProxy.keybindVehicleGunUp, "up") + .withKeyBinding(ClientProxy.keybindVehicleGunDown, "down") .withKeyBinding(settings.keyBindJump, "fire") .withKeyBinding(ClientProxy.keybindZoom, "scope") .withKeyBinding(ClientProxy.keybindManualReload, "reload"); @@ -199,10 +200,34 @@ else if(part==partShieldLeft||part==partWheelLeft) return false; } - //--- Binoculars Zoom Feature ---// + //--- ICameraEntity ---// @Override - public IAdvancedZoomTool getZoom() + public float getCameraPitch(EntityPlayer cameraPlayer, float partialTicks) + { + return (float)IIMath.clampedLerp(cameraPlayer.prevCameraYaw, cameraPlayer.cameraYaw, partialTicks); + } + + @Override + public float getCameraYaw(EntityPlayer cameraPlayer, float partialTicks) + { + return (float)IIMath.clampedLerp(cameraPlayer.prevCameraYaw, cameraPlayer.cameraYaw, partialTicks); + } + + @Override + public Vec3d getCameraPos(EntityPlayer cameraPlayer, float partialTicks) + { + return cameraPlayer.getLook(partialTicks); + } + + @Override + public boolean isCameraEnabled(EntityPlayer player) + { + return seatGunner!=null&&seatGunner.isClientPlayerOnSeat(); + } + + @Override + public IAdvancedZoom getZoom() { return Minecraft.getMinecraft().player.getHeldItem(EnumHand.MAIN_HAND).getItem()==IIContent.itemBinoculars?IIContent.itemBinoculars: null; } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/part/EntityVehicleSeat.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/part/EntityVehicleSeat.java index 802e024b5..24f728808 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/part/EntityVehicleSeat.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/part/EntityVehicleSeat.java @@ -27,13 +27,14 @@ import java.util.Optional; /** - * @author Pabilo8 (pabilo@iiteam.net) - * @since 06.08.2020 *

* Just a marker for seats, doesn't do collision but it's an actual world handled entity on all sides * Seats are just one-sided and independent on client and server *

* Riding interaction must be handled by the vehicle by an additional part + * + * @author Pabilo8 (pabilo@iiteam.net) + * @since 06.08.2020 */ public class EntityVehicleSeat extends Entity implements ISyncNBTEntity { diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerAmmunitionCrate.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerAmmunitionCrate.java index 4a01ab431..ac2a155a1 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerAmmunitionCrate.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerAmmunitionCrate.java @@ -21,32 +21,32 @@ */ public class ContainerAmmunitionCrate extends ContainerIIBase { - public Slot[] slotsInputbullet, slotsInputshell, slotsInputrevolver, slotsInputmg; + public Slot[] inputBullet, inputShell, inputRevolver, inputMG; public ContainerAmmunitionCrate(EntityPlayer player, TileEntityAmmunitionCrate tile) { super(player, tile); - this.slotsInputbullet = new Slot[20]; - this.slotsInputshell = new Slot[9]; - this.slotsInputrevolver = new Slot[8]; - this.slotsInputmg = new Slot[12]; + this.inputBullet = new Slot[20]; + this.inputShell = new Slot[9]; + this.inputRevolver = new Slot[8]; + this.inputMG = new Slot[12]; - // Normal bullet slots (20 slots, 4x5 grid) + //Normal bullet slots (20 slots, 4x5 grid) for(int i = 0; i < 20; i++) - this.slotsInputbullet[i] = addSlotToContainer(new Slot(this.inv, i, 8 + (i % 5) * 18, 18 + (i / 5) * 18 - 45) + this.inputBullet[i] = addSlotToContainer(new Slot(this.inv, i, 8+(i%5)*18, 18+(i/5)*18) { @Override public boolean isItemValid(ItemStack stack) { - return stack.getItem() instanceof ItemBullet && - !(stack.isItemEqual(BulletHandler.emptyCasing) || stack.isItemEqual(BulletHandler.emptyShell)); + return stack.getItem() instanceof ItemBullet&& + !(stack.isItemEqual(BulletHandler.emptyCasing)||stack.isItemEqual(BulletHandler.emptyShell)); } }); - // Empty shell slots (9 slots in a row) + //Empty shell slots (9 slots in a row) for(int i = 0; i < 9; i++) - this.slotsInputshell[i] = addSlotToContainer(new Slot(this.inv, 20 + i, 8 + (i * 18), 108 - 45) + this.inputShell[i] = addSlotToContainer(new Slot(this.inv, 20+i, 8+(i*18), 108) { @Override public boolean isItemValid(ItemStack stack) @@ -55,21 +55,21 @@ public boolean isItemValid(ItemStack stack) } }); - // Revolver layout slots (8 slots, circular layout) - this.slotsInputrevolver[0] = addSlotToContainer(new GhostFilteredBullet(this, this.inv, 29, 125, 18 - 45)); - this.slotsInputrevolver[1] = addSlotToContainer(new GhostFilteredBullet(this, this.inv, 30, 144, 26 - 45)); - this.slotsInputrevolver[2] = addSlotToContainer(new GhostFilteredBullet(this, this.inv, 31, 152, 45 - 45)); - this.slotsInputrevolver[3] = addSlotToContainer(new GhostFilteredBullet(this, this.inv, 32, 144, 64 - 45)); - this.slotsInputrevolver[4] = addSlotToContainer(new GhostFilteredBullet(this, this.inv, 33, 125, 72 - 45)); - this.slotsInputrevolver[5] = addSlotToContainer(new GhostFilteredBullet(this, this.inv, 34, 106, 64 - 45)); - this.slotsInputrevolver[6] = addSlotToContainer(new GhostFilteredBullet(this, this.inv, 35, 98, 45 - 45)); - this.slotsInputrevolver[7] = addSlotToContainer(new GhostFilteredBullet(this, this.inv, 36, 106, 26 - 45)); + //Revolver layout slots (8 slots, circular layout) + this.inputRevolver[0] = addSlotToContainer(new GhostFilteredBullet(this, this.inv, 29, 125, 18)); + this.inputRevolver[1] = addSlotToContainer(new GhostFilteredBullet(this, this.inv, 30, 144, 26)); + this.inputRevolver[2] = addSlotToContainer(new GhostFilteredBullet(this, this.inv, 31, 152, 45)); + this.inputRevolver[3] = addSlotToContainer(new GhostFilteredBullet(this, this.inv, 32, 144, 64)); + this.inputRevolver[4] = addSlotToContainer(new GhostFilteredBullet(this, this.inv, 33, 125, 72)); + this.inputRevolver[5] = addSlotToContainer(new GhostFilteredBullet(this, this.inv, 34, 106, 64)); + this.inputRevolver[6] = addSlotToContainer(new GhostFilteredBullet(this, this.inv, 35, 98, 45)); + this.inputRevolver[7] = addSlotToContainer(new GhostFilteredBullet(this, this.inv, 36, 106, 26)); - // MG loader slots (if upgrade installed) + //MG loader slots (if upgrade installed) if(tile.isUpgradeInstalled(IIContent.UPGRADE_MG_LOADER)) { for(int i = 0; i < 12; i++) - this.slotsInputmg[i] = addSlotToContainer(new Slot(this.inv, i + 30, 184 + (i % 2) * 18, 18 + (i / 2) * 18 - 45) + this.inputMG[i] = addSlotToContainer(new Slot(this.inv, i+30, 184+(i%2)*18, 18+(i/2)*18) { @Override public boolean isItemValid(ItemStack stack) @@ -79,8 +79,8 @@ public boolean isItemValid(ItemStack stack) }); } - // Player inventory - addPlayerInventory(player.inventory, 8, 98); + //Player inventory + addPlayerInventory(player.inventory, 8, 98+45); } public static class GhostFilteredBullet extends IESlot.Ghost @@ -99,8 +99,8 @@ public void putStack(ItemStack itemStack) @Override public boolean isItemValid(ItemStack stack) { - return stack.getItem() instanceof ItemBullet && - !(stack.isItemEqual(BulletHandler.emptyCasing) || stack.isItemEqual(BulletHandler.emptyShell)); + return stack.getItem() instanceof ItemBullet&& + !(stack.isItemEqual(BulletHandler.emptyCasing)||stack.isItemEqual(BulletHandler.emptyShell)); } } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/item/tools/ItemIIBinoculars.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/item/tools/ItemIIBinoculars.java index d265d6f3c..d6014195f 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/item/tools/ItemIIBinoculars.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/item/tools/ItemIIBinoculars.java @@ -35,7 +35,7 @@ import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.items.CapabilityItemHandler; import pl.pabilo8.immersiveintelligence.ImmersiveIntelligence; -import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedZoomTool; +import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedZoom; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Tools; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.towable.gun.EntityFieldHowitzer; import pl.pabilo8.immersiveintelligence.common.item.tools.ItemIIBinoculars.Binoculars; @@ -59,7 +59,7 @@ * @since 15.09.2019 */ @IIItemProperties(category = IICategory.TOOLS) -public class ItemIIBinoculars extends ItemIISubItemsBase implements IAdvancedZoomTool, IIEEnergyItem, IIIItemTextureOverride +public class ItemIIBinoculars extends ItemIISubItemsBase implements IAdvancedZoom, IIEEnergyItem, IIIItemTextureOverride { private static final ResourceLocation OVERLAY_TEXTURE = new ResourceLocation(ImmersiveIntelligence.MODID, "textures/gui/item/binoculars.png"); public static UUID visionUUID = Utils.generateNewUUID(); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/item/tools/ItemIITripodPeriscope.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/item/tools/ItemIITripodPeriscope.java index fc07f850d..364e9ec47 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/item/tools/ItemIITripodPeriscope.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/item/tools/ItemIITripodPeriscope.java @@ -1,31 +1,29 @@ package pl.pabilo8.immersiveintelligence.common.item.tools; -import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.SoundEvents; -import net.minecraft.item.ItemMonsterPlacer; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; -import net.minecraft.util.SoundCategory; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; import pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon.EntityTripodPeriscope; import pl.pabilo8.immersiveintelligence.common.util.item.IICategory; import pl.pabilo8.immersiveintelligence.common.util.item.IIItemEnum.IIItemProperties; +import pl.pabilo8.immersiveintelligence.common.util.item.IItemEntityPlacer; import pl.pabilo8.immersiveintelligence.common.util.item.ItemIIBase; -import java.util.List; +import javax.annotation.Nonnull; /** * @author Pabilo8 (pabilo@iiteam.net) + * @updated 23.05.2026 + * @ii-approved 0.3.1 * @since 23.01.2021 */ @IIItemProperties(category = IICategory.WARFARE) -public class ItemIITripodPeriscope extends ItemIIBase +public class ItemIITripodPeriscope extends ItemIIBase implements IItemEntityPlacer { public ItemIITripodPeriscope() { @@ -35,64 +33,27 @@ public ItemIITripodPeriscope() /** * Called when a Block is right-clicked with this Item */ - public EnumActionResult onItemUse(EntityPlayer player, World worldIn, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) + @Nonnull + public EnumActionResult onItemUse(@Nonnull EntityPlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nonnull EnumHand hand, @Nonnull EnumFacing facing, + float hitX, float hitY, float hitZ) { - if(facing==EnumFacing.DOWN) - { - return EnumActionResult.FAIL; - } - else - { - boolean flag = worldIn.getBlockState(pos).getBlock().isReplaceable(worldIn, pos); - BlockPos blockpos = flag?pos: pos.offset(facing); - ItemStack itemstack = player.getHeldItem(hand); - - if(!player.canPlayerEdit(blockpos, facing, itemstack)) - { - return EnumActionResult.FAIL; - } - else - { - BlockPos blockpos1 = blockpos.up(); - boolean flag1 = !worldIn.isAirBlock(blockpos)&&!worldIn.getBlockState(blockpos).getBlock().isReplaceable(worldIn, blockpos); - flag1 = flag1|(!worldIn.isAirBlock(blockpos1)&&!worldIn.getBlockState(blockpos1).getBlock().isReplaceable(worldIn, blockpos1)); + return IItemEntityPlacer.super.onItemUse(player, world, pos, hand, facing, hitX, hitY, hitZ); + } - if(flag1) - { - return EnumActionResult.FAIL; - } - else - { - double d0 = blockpos.getX(); - double d1 = blockpos.getY(); - double d2 = blockpos.getZ(); - List list = worldIn.getEntitiesWithinAABBExcludingEntity(null, new AxisAlignedBB(d0, d1, d2, d0+1.0D, d1+2.0D, d2+1.0D)); + @Nonnull + @Override + public AxisAlignedBB getPlacedSpace(BlockPos pos) + { + return new AxisAlignedBB(pos).expand(0, 1.5, 0); + } - if(!list.isEmpty()) - { - return EnumActionResult.FAIL; - } - else - { - if(!worldIn.isRemote) - { - worldIn.setBlockToAir(blockpos); - worldIn.setBlockToAir(blockpos1); - EntityTripodPeriscope periscope = new EntityTripodPeriscope(worldIn); - periscope.setPosition(d0+0.5D, d1, d2+0.5D); - float f = (float)MathHelper.floor((MathHelper.wrapDegrees(player.rotationYaw-180.0F)+22.5F)/45.0F)*45.0F; - periscope.setLocationAndAngles(d0+0.5D, d1, d2+0.5D, f, 0.0F); - periscope.aim.withCurrentAngles(f, 0f); - periscope.aim.setTarget(f, 0f); - ItemMonsterPlacer.applyItemEntityDataToEntity(worldIn, player, itemstack, periscope); - worldIn.spawnEntity(periscope); - worldIn.playSound(null, periscope.posX, periscope.posY, periscope.posZ, SoundEvents.ENTITY_ARMORSTAND_PLACE, SoundCategory.BLOCKS, 0.75F, 0.8F); - } - itemstack.shrink(1); - return EnumActionResult.SUCCESS; - } - } - } - } + @Nonnull + @Override + public EntityTripodPeriscope getPlacedEntity(World world, double x, double y, double z, ItemStack stack, float playerYaw, float playerPitch) + { + EntityTripodPeriscope periscope = new EntityTripodPeriscope(world); + periscope.setPosition(x, y, z); + periscope.aim.withCenterYaw(playerYaw); + return periscope; } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/item/weapons/ItemIIAssaultRifle.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/item/weapons/ItemIIAssaultRifle.java index d5c58b830..f5f41d0e6 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/item/weapons/ItemIIAssaultRifle.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/item/weapons/ItemIIAssaultRifle.java @@ -24,7 +24,7 @@ import net.minecraftforge.fml.relauncher.SideOnly; import pl.pabilo8.immersiveintelligence.ImmersiveIntelligence; import pl.pabilo8.immersiveintelligence.api.utils.ItemTooltipHandler.IItemScrollable; -import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedZoomTool; +import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedZoom; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons.AssaultRifle; import pl.pabilo8.immersiveintelligence.common.IIContent; import pl.pabilo8.immersiveintelligence.common.IISounds; @@ -49,7 +49,7 @@ * @since 17.09.2022 */ @IIItemProperties(category = IICategory.WARFARE) -public class ItemIIAssaultRifle extends ItemIIGunBase implements IItemScrollable, IAdvancedZoomTool, IIEEnergyItem +public class ItemIIAssaultRifle extends ItemIIGunBase implements IItemScrollable, IAdvancedZoom, IIEEnergyItem { //--- NBT Values Reference ---// public static final String FIRE_MODE = "fire_mode"; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/item/weapons/ItemIIMachinegun.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/item/weapons/ItemIIMachinegun.java index 1f6a9dfd6..07e782dda 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/item/weapons/ItemIIMachinegun.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/item/weapons/ItemIIMachinegun.java @@ -7,21 +7,16 @@ import blusunrize.immersiveengineering.common.util.inventory.IEItemStackHandler; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.stats.StatList; -import net.minecraft.util.ActionResult; import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.common.IRarity; import net.minecraftforge.common.capabilities.Capability; @@ -42,14 +37,16 @@ import pl.pabilo8.immersiveintelligence.common.IIContent; import pl.pabilo8.immersiveintelligence.common.IIUtils; import pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon.EntityMachinegun; +import pl.pabilo8.immersiveintelligence.common.item.weapons.ItemIIWeaponUpgrade.WeaponType; import pl.pabilo8.immersiveintelligence.common.item.weapons.ItemIIWeaponUpgrade.WeaponUpgrade; -import pl.pabilo8.immersiveintelligence.common.util.IIMath; import pl.pabilo8.immersiveintelligence.common.util.IIReference; import pl.pabilo8.immersiveintelligence.common.util.item.IICategory; import pl.pabilo8.immersiveintelligence.common.util.item.IIItemEnum.IIItemProperties; import pl.pabilo8.immersiveintelligence.common.util.item.IIItemUtils; +import pl.pabilo8.immersiveintelligence.common.util.item.IItemEntityPlacer; import pl.pabilo8.immersiveintelligence.common.util.item.ItemIIUpgradableTool; +import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.List; @@ -58,11 +55,11 @@ * @since 01.11.2019 */ @IIItemProperties(category = IICategory.WARFARE) -public class ItemIIMachinegun extends ItemIIUpgradableTool implements IAdvancedFluidItem, ISkinnable +public class ItemIIMachinegun extends ItemIIUpgradableTool implements IAdvancedFluidItem, ISkinnable, IItemEntityPlacer { public ItemIIMachinegun() { - super("machinegun", 1, "MACHINEGUN"); + super("machinegun", 1, WeaponType.MACHINEGUN.getName().toUpperCase()); //Use interfaces pls Blu IIItemUtils.fixupItem(this, "machinegun"); } @@ -83,16 +80,17 @@ public boolean canModify(ItemStack stack) public Slot[] getWorkbenchSlots(Container container, ItemStack stack) { IItemHandler inv = stack.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null); + String type = WeaponType.MACHINEGUN.getName().toUpperCase(); return new Slot[] { - new IESlot.Upgrades(container, inv, 0, 80, 32, "MACHINEGUN", stack, true), - new IESlot.Upgrades(container, inv, 1, 100, 32, "MACHINEGUN", stack, true), - new IESlot.Upgrades(container, inv, 2, 120, 32, "MACHINEGUN", stack, true) + new IESlot.Upgrades(container, inv, 0, 80, 32, type, stack, true), + new IESlot.Upgrades(container, inv, 1, 100, 32, type, stack, true), + new IESlot.Upgrades(container, inv, 2, 120, 32, type, stack, true) }; } @Override - public void addInformation(ItemStack stack, @Nullable World world, List tooltip, ITooltipFlag flag) + public void addInformation(@Nonnull ItemStack stack, @Nullable World world, @Nonnull List tooltip, @Nonnull ITooltipFlag flag) { super.addInformation(stack, world, tooltip, flag); @@ -116,112 +114,50 @@ public void addInformation(ItemStack stack, @Nullable World world, List addSkinTooltip(stack, tooltip); } + @Nonnull @Override - public IRarity getForgeRarity(ItemStack stack) + public IRarity getForgeRarity(@Nonnull ItemStack stack) { IRarity skin = getSkinRarity(stack); return skin!=null?skin: super.getForgeRarity(stack); } @Override - public ActionResult onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand handIn) + public void removeFromWorkbench(EntityPlayer player, ItemStack stack) { - ItemStack itemstack = playerIn.getHeldItem(handIn); - float f = 1.0F; - float f1 = playerIn.prevRotationPitch+(playerIn.rotationPitch-playerIn.prevRotationPitch); - float f2 = playerIn.prevRotationYaw+(playerIn.rotationYaw-playerIn.prevRotationYaw); - double d0 = playerIn.prevPosX+(playerIn.posX-playerIn.prevPosX); - double d1 = playerIn.prevPosY+(playerIn.posY-playerIn.prevPosY)+(double)playerIn.getEyeHeight(); - double d2 = playerIn.prevPosZ+(playerIn.posZ-playerIn.prevPosZ); - Vec3d vec3d = new Vec3d(d0, d1, d2); - float f3 = MathHelper.cos(-f2*0.017453292F-(float)Math.PI); - float f4 = MathHelper.sin(-f2*0.017453292F-(float)Math.PI); - float f5 = -MathHelper.cos(-f1*0.017453292F); - float f6 = MathHelper.sin(-f1*0.017453292F); - float f7 = f4*f5; - float f8 = f3*f5; - double d3 = 5.0D; - Vec3d vec3d1 = vec3d.addVector((double)f7*5.0D, (double)f6*5.0D, (double)f8*5.0D); - RayTraceResult raytraceresult = worldIn.rayTraceBlocks(vec3d, vec3d1, false); - - if(raytraceresult==null) - return new ActionResult<>(EnumActionResult.PASS, itemstack); - else - { - Vec3d vec3d2 = playerIn.getLook(1.0F); - boolean flag = false; - List list = worldIn.getEntitiesWithinAABBExcludingEntity(playerIn, playerIn.getEntityBoundingBox().expand(vec3d2.x*5.0D, vec3d2.y*5.0D, vec3d2.z*5.0D).grow(1.0D)); - - for(Entity entity : list) - if(entity.canBeCollidedWith()) - { - AxisAlignedBB axisalignedbb = entity.getEntityBoundingBox().grow(entity.getCollisionBorderSize()); - - if(axisalignedbb.contains(vec3d)) - flag = true; - } - - if(flag) - return new ActionResult<>(EnumActionResult.PASS, itemstack); - else if(raytraceresult.typeOfHit!=RayTraceResult.Type.BLOCK) - return new ActionResult<>(EnumActionResult.PASS, itemstack); - else - { - AxisAlignedBB aabb = worldIn.getBlockState(raytraceresult.getBlockPos()).getCollisionBoundingBox(playerIn.world, raytraceresult.getBlockPos()); - EnumFacing facing = EnumFacing.fromAngle(playerIn.rotationYaw); - float yaw = facing.getHorizontalAngle(); - float pitch = 25f; - - AxisAlignedBB fence; - switch(facing) - { - case SOUTH: - fence = new AxisAlignedBB(0, 0, 0.5, 1, 1, 1); - break; - case WEST: - fence = new AxisAlignedBB(0, 0, 0, 0.5, 1, 1); - break; - case EAST: - fence = new AxisAlignedBB(0.5, 0, 0, 1, 1, 1); - break; - default: - case NORTH: - fence = new AxisAlignedBB(0, 0, 0, 1, 1, 0.5); - break; - } - - if(aabb==null) - return new ActionResult<>(EnumActionResult.FAIL, itemstack); - - boolean intersects = IIMath.isAABBContained(fence, aabb); + if(hasIIUpgrades(stack, WeaponUpgrade.HEAVY_BARREL, WeaponUpgrade.SECOND_MAGAZINE, WeaponUpgrade.INFRARED_SCOPE)) + IIUtils.unlockIIAdvancement(player, "main/let_me_show_you_its_features"); + if(hasIIUpgrades(stack, WeaponUpgrade.BELT_FED_LOADER, WeaponUpgrade.SHIELD, WeaponUpgrade.WATER_COOLING)) + IIUtils.unlockIIAdvancement(player, "main/hans_9000"); + } - if(!intersects) - return new ActionResult<>(EnumActionResult.PASS, itemstack); + //--- IItemEntityPlacer ---// - if(!worldIn.isRemote) - { - EntityMachinegun mg = new EntityMachinegun(worldIn, raytraceresult.getBlockPos().up(), playerIn.getRotationYawHead(), itemstack.copy()); - worldIn.spawnEntity(mg); - playerIn.startRiding(mg); - } - itemstack.shrink(1); - playerIn.addStat(StatList.getObjectUseStats(this)); - return new ActionResult<>(EnumActionResult.SUCCESS, itemstack); - } - } + @Nonnull + @Override + public EnumActionResult onItemUse(@Nonnull EntityPlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nonnull EnumHand hand, + @Nonnull EnumFacing facing, float hitX, float hitY, float hitZ) + { + return IItemEntityPlacer.super.onItemUse(player, world, pos, hand, facing, hitX, hitY, hitZ); } + @Nonnull + @Override + public AxisAlignedBB getPlacedSpace(BlockPos pos) + { + return new AxisAlignedBB(pos); + } + @Nonnull @Override - public void removeFromWorkbench(EntityPlayer player, ItemStack stack) + public EntityMachinegun getPlacedEntity(World world, double x, double y, double z, ItemStack stack, float playerYaw, float playerPitch) { - if(hasIIUpgrades(stack, WeaponUpgrade.HEAVY_BARREL, WeaponUpgrade.SECOND_MAGAZINE, WeaponUpgrade.INFRARED_SCOPE)) - IIUtils.unlockIIAdvancement(player, "main/let_me_show_you_its_features"); - if(hasIIUpgrades(stack, WeaponUpgrade.BELT_FED_LOADER, WeaponUpgrade.SHIELD, WeaponUpgrade.WATER_COOLING)) - IIUtils.unlockIIAdvancement(player, "main/hans_9000"); + return new EntityMachinegun(world, new BlockPos(x, y, z), playerYaw, stack); } + //--- IAdvancedFluidItem ---// + @Override public ICapabilityProvider initCapabilities(ItemStack stack, NBTTagCompound nbt) { @@ -231,14 +167,14 @@ public ICapabilityProvider initCapabilities(ItemStack stack, NBTTagCompound nbt) final IEItemFluidHandler fluids = new IEItemFluidHandler(stack, 0); @Override - public boolean hasCapability(Capability capability, EnumFacing facing) + public boolean hasCapability(@Nonnull Capability capability, EnumFacing facing) { return capability==CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY|| super.hasCapability(capability, facing); } @Override - public T getCapability(Capability capability, EnumFacing facing) + public T getCapability(@Nonnull Capability capability, EnumFacing facing) { if(capability==CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY) return (T)fluids; @@ -251,23 +187,25 @@ public T getCapability(Capability capability, EnumFacing facing) @Override public int getCapacity(ItemStack stack, int baseCapacity) { - return getUpgrades(stack).hasKey("water_cooling")?Machinegun.waterCoolingTankCapacity: 0; + return hasIIUpgrade(stack, WeaponUpgrade.WATER_COOLING)?Machinegun.waterCoolingTankCapacity: 0; } @Override - public boolean allowFluid(ItemStack container, FluidStack fluid) + public boolean allowFluid(ItemStack stack, FluidStack fluid) { - return getUpgrades(container).hasKey("water_cooling")&&MachinegunCoolantHandler.isValidCoolant(fluid); + return hasIIUpgrade(stack, WeaponUpgrade.WATER_COOLING)&&MachinegunCoolantHandler.isValidCoolant(fluid); } @SideOnly(Side.CLIENT) @Nullable @Override - public FontRenderer getFontRenderer(ItemStack stack) + public FontRenderer getFontRenderer(@Nonnull ItemStack stack) { return IIClientUtils.fontRegular; } + //--- ISkinnable ---// + @Override public String getSkinnableName() { diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/item/weapons/ItemIIMortar.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/item/weapons/ItemIIMortar.java index 161c87d35..d83300ce5 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/item/weapons/ItemIIMortar.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/item/weapons/ItemIIMortar.java @@ -1,30 +1,29 @@ package pl.pabilo8.immersiveintelligence.common.item.weapons; -import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.SoundEvents; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; -import net.minecraft.util.SoundCategory; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon.EntityMortar; import pl.pabilo8.immersiveintelligence.common.util.item.IICategory; import pl.pabilo8.immersiveintelligence.common.util.item.IIItemEnum.IIItemProperties; +import pl.pabilo8.immersiveintelligence.common.util.item.IItemEntityPlacer; import pl.pabilo8.immersiveintelligence.common.util.item.ItemIIBase; import javax.annotation.Nonnull; -import java.util.List; /** * @author Pabilo8 (pabilo@iiteam.net) + * @updated 23.05.2026 + * @ii-approved 0.3.1 * @since 23.01.2021 */ @IIItemProperties(category = IICategory.WARFARE) -public class ItemIIMortar extends ItemIIBase +public class ItemIIMortar extends ItemIIBase implements IItemEntityPlacer { public ItemIIMortar() { @@ -35,53 +34,26 @@ public ItemIIMortar() * Called when a Block is right-clicked with this Item */ @Nonnull - @Override - public EnumActionResult onItemUse(@Nonnull EntityPlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nonnull EnumHand hand, - @Nonnull EnumFacing facing, float hitX, float hitY, float hitZ) + public EnumActionResult onItemUse(@Nonnull EntityPlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nonnull EnumHand hand, @Nonnull EnumFacing facing, + float hitX, float hitY, float hitZ) { - if(facing==EnumFacing.DOWN) - return EnumActionResult.FAIL; - else - { - //Check if block can be replaced, if not - check if the block above can be replaced. If not - fail - boolean flag = world.getBlockState(pos).getBlock().isReplaceable(world, pos); - BlockPos blockpos = flag?pos: pos.offset(facing); - ItemStack itemstack = player.getHeldItem(hand); - - //Check if player can place on the block - if(!player.canPlayerEdit(blockpos, facing, itemstack)) - return EnumActionResult.FAIL; - else - { - BlockPos blockpos1 = blockpos.up(); - //Check bottom air block - boolean canBePlaced = !world.isAirBlock(blockpos)&&!world.getBlockState(blockpos).getBlock().isReplaceable(world, blockpos); - //Check top air block - canBePlaced = canBePlaced|(!world.isAirBlock(blockpos1)&&!world.getBlockState(blockpos1).getBlock().isReplaceable(world, blockpos1)); + return IItemEntityPlacer.super.onItemUse(player, world, pos, hand, facing, hitX, hitY, hitZ); + } - if(canBePlaced) - return EnumActionResult.FAIL; - else - { - List list = world.getEntitiesWithinAABBExcludingEntity(null, new AxisAlignedBB(blockpos, blockpos.up())); - if(!list.isEmpty()) - return EnumActionResult.FAIL; - else - { - if(!world.isRemote) - { - EntityMortar mortar = new EntityMortar(world); - mortar.setPosition(blockpos.getX(), blockpos.getY(), blockpos.getZ()); - mortar.rotationYaw = player.rotationYaw; + @Nonnull + @Override + public AxisAlignedBB getPlacedSpace(BlockPos pos) + { + return new AxisAlignedBB(pos).expand(0, 0.5, 0); + } - world.spawnEntity(mortar); - world.playSound(null, mortar.posX, mortar.posY, mortar.posZ, SoundEvents.ENTITY_ARMORSTAND_PLACE, SoundCategory.BLOCKS, 0.75F, 0.8F); - } - itemstack.shrink(1); - return EnumActionResult.SUCCESS; - } - } - } - } + @Nonnull + @Override + public EntityMortar getPlacedEntity(World world, double x, double y, double z, ItemStack stack, float playerYaw, float playerPitch) + { + EntityMortar mortar = new EntityMortar(world); + mortar.setPosition(x, y, z); + mortar.aim.withCenterYaw(playerYaw); + return mortar; } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/item/weapons/ItemIIRifle.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/item/weapons/ItemIIRifle.java index 7898aa8cb..da54f6691 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/item/weapons/ItemIIRifle.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/item/weapons/ItemIIRifle.java @@ -11,7 +11,7 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import pl.pabilo8.immersiveintelligence.ImmersiveIntelligence; -import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedZoomTool; +import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedZoom; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons.Rifle; import pl.pabilo8.immersiveintelligence.common.IIContent; import pl.pabilo8.immersiveintelligence.common.IISounds; @@ -32,7 +32,7 @@ * @since 01.11.2019 */ @IIItemProperties(category = IICategory.WARFARE) -public class ItemIIRifle extends ItemIIGunBase implements IAdvancedZoomTool +public class ItemIIRifle extends ItemIIGunBase implements IAdvancedZoom { //--- NBT Values Reference ---// public static final String HANDMADE = "handmade"; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/network/IIPacketHandler.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/network/IIPacketHandler.java index dbf765bab..3161ed5d9 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/network/IIPacketHandler.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/network/IIPacketHandler.java @@ -48,7 +48,6 @@ public static void preInit() registerMessage(MessageFireworks.class, true, false); registerMessage(MessageRotaryPowerSync.class, true, false); registerMessage(MessageBlockDamageSync.class, true, false); - registerMessage(MessagePlayerAimAnimationSync.class, true, false); registerMessage(MessageItemKeybind.class, true, true); registerMessage(MessageExplosion.class, true, false); registerMessage(MessageParticleEffect.class, true, false); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/network/messages/MessageIITileSync.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/network/messages/MessageIITileSync.java index f0526e8d5..60819b52f 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/network/messages/MessageIITileSync.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/network/messages/MessageIITileSync.java @@ -8,6 +8,8 @@ import net.minecraft.network.NetHandlerPlayServer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; import net.minecraft.world.WorldServer; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -18,14 +20,16 @@ * @author Pabilo8 (pabilo@iiteam.net) * @since 22.09.2022 */ -public class MessageIITileSync extends IIMessage +public class MessageIITileSync extends IIMessage implements IPositionBoundMessage { + World world; BlockPos pos; NBTTagCompound nbt; public MessageIITileSync(TileEntityIEBase tile, NBTTagCompound nbt) { this.pos = tile.getPos(); + this.world = tile.getWorld(); this.nbt = nbt; } @@ -87,4 +91,16 @@ public void toBytes(ByteBuf buf) writePos(buf, pos); writeTagCompound(buf, nbt); } + + @Override + public World getWorld() + { + return world; + } + + @Override + public Vec3d getPosition() + { + return new Vec3d(pos); + } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/network/messages/MessagePlayerAimAnimationSync.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/network/messages/MessagePlayerAimAnimationSync.java deleted file mode 100644 index 0f8cec166..000000000 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/network/messages/MessagePlayerAimAnimationSync.java +++ /dev/null @@ -1,61 +0,0 @@ -package pl.pabilo8.immersiveintelligence.common.network.messages; - -import io.netty.buffer.ByteBuf; -import net.minecraft.client.multiplayer.WorldClient; -import net.minecraft.client.network.NetHandlerPlayClient; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.network.NetHandlerPlayServer; -import net.minecraft.world.WorldServer; -import pl.pabilo8.immersiveintelligence.client.ClientEventHandler; -import pl.pabilo8.immersiveintelligence.common.network.IIMessage; - -public class MessagePlayerAimAnimationSync extends IIMessage -{ - private int entityID; - private boolean aiming; - - public MessagePlayerAimAnimationSync(Entity entity, boolean aiming) - { - this.entityID = entity.getEntityId(); - this.aiming = aiming; - } - - public MessagePlayerAimAnimationSync() - { - } - - @Override - protected void onServerReceive(WorldServer world, NetHandlerPlayServer handler) - { - - } - - @Override - protected void onClientReceive(WorldClient world, NetHandlerPlayClient handler) - { - Entity entity = world.getEntityByID(entityID); - if(entity instanceof EntityLivingBase) - if(aiming) - { - if(!ClientEventHandler.aimingPlayers.contains(entity)) - ClientEventHandler.aimingPlayers.add((EntityLivingBase)entity); - } - else - ClientEventHandler.aimingPlayers.removeIf(entityPlayer -> entityPlayer.equals(entity)); - } - - @Override - public void fromBytes(ByteBuf buf) - { - this.entityID = buf.readInt(); - this.aiming = buf.readBoolean(); - } - - @Override - public void toBytes(ByteBuf buf) - { - buf.writeInt(this.entityID); - buf.writeBoolean(aiming); - } -} \ No newline at end of file diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/entity/ISyncNBTEntity.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/entity/ISyncNBTEntity.java index 025a2eb3d..86ae34205 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/entity/ISyncNBTEntity.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/entity/ISyncNBTEntity.java @@ -21,7 +21,7 @@ public interface ISyncNBTEntity> default void receiveNBTMessageServer(NBTTagCompound nbt) { T tis = ((T)this); - NBTSerialisation.synchroniseFor(tis, (tag, tile) -> tag.deserializeAll(tis, nbt, true)); + NBTSerialisation.synchroniseFor(tis, (tag, entity) -> tag.deserializeAll(tis, nbt, true)); } @SideOnly(Side.CLIENT) @@ -29,19 +29,19 @@ default void receiveNBTMessageServer(NBTTagCompound nbt) default void receiveNBTMessageClient(NBTTagCompound nbt) { T tis = ((T)this); - NBTSerialisation.synchroniseFor(tis, (tag, tile) -> tag.deserializeAll(tis, nbt, true)); + NBTSerialisation.synchroniseFor(tis, (tag, entity) -> tag.deserializeAll(tis, nbt, true)); } default void readEntityFromNBT(NBTTagCompound compound) { T tis = ((T)this); - NBTSerialisation.synchroniseFor(tis, (tag, tile) -> tag.serializeAll(tis, compound)); + NBTSerialisation.synchroniseFor(tis, (tag, entity) -> tag.deserializeAll(tis, compound, false)); } default void writeEntityToNBT(NBTTagCompound compound) { T tis = ((T)this); - NBTSerialisation.synchroniseFor(tis, (tag, tile) -> tag.deserializeAll(tis, compound, false)); + NBTSerialisation.synchroniseFor(tis, (tag, entity) -> tag.serializeAll(tis, compound)); } @SuppressWarnings({"unchecked"}) @@ -50,7 +50,7 @@ default void updateEntityForTime() @SuppressWarnings({"unchecked"}) T tis = ((T)this); NBTTagCompound nbt = new NBTTagCompound(); - NBTSerialisation.synchroniseFor(tis, (tag, tile) -> tag.serializeForTime(tile, nbt, tis.ticksExisted)); + NBTSerialisation.synchroniseFor(tis, (tag, entity) -> tag.serializeForTime(entity, nbt, tis.ticksExisted)); IIPacketHandler.sendToClient(new MessageEntityNBTSync(tis, nbt)); } @@ -59,7 +59,7 @@ default void updateEntityForEvent(SyncNBT.SyncEvents event) { T tis = ((T)this); NBTTagCompound nbt = new NBTTagCompound(); - NBTSerialisation.synchroniseFor(tis, (tag, tile) -> tag.serializeForEvent(tile, nbt, event)); + NBTSerialisation.synchroniseFor(tis, (tag, entity) -> tag.serializeForEvent(entity, nbt, event)); IIPacketHandler.sendToClient(new MessageEntityNBTSync(tis, nbt)); } @@ -67,7 +67,7 @@ default void sendServerUpdateForEvent(SyncNBT.SyncEvents event) { T tis = ((T)this); NBTTagCompound nbt = new NBTTagCompound(); - NBTSerialisation.synchroniseFor(tis, (tag, tile) -> tag.serializeForEvent(tile, nbt, event)); + NBTSerialisation.synchroniseFor(tis, (tag, entity) -> tag.serializeForEvent(entity, nbt, event)); IIPacketHandler.sendToServer(new MessageEntityNBTSync(tis, nbt)); } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunAimCoordinate.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunAimCoordinate.java index 63c2a356c..1b6393380 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunAimCoordinate.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunAimCoordinate.java @@ -14,25 +14,27 @@ * * @author Pabilo8 (pabilo@iiteam.net) * @ii-approved 0.3.1 - * @implNote only pitch, yaw, targetPitch and targetYaw are synced to NBT, the rest is for runtime use only and not saved + * @implNote only pitch, yaw, targetPitch, targetYaw and centerYaw are synced to NBT, the rest is for runtime use only and not saved * @since 24.02.2026 */ public class GunAimCoordinate implements INBTSerializable { - //Current angles + private static final float MINIMAL = 0.05f; protected float pitch = 0, yaw = 0; //Target protected float targetPitch = 0, targetYaw = 0; + protected float centerYaw = 0; + @Nonnull protected AimCorrectionFunction aimCorrectionFunction = GunAimCoordinate::getTargetLead; protected Vec3d target = Vec3d.ZERO; //Rotation speeds protected float aimSpeedPitch = 1, aimSpeedYaw = 1; - //Angle limits + //Angle limits relative to centerYaw protected float yawLimitMin = -180, yawLimitMax = 180; protected float pitchLimitMin = -90, pitchLimitMax = 90; - //--- Setters ---// + //--- Setters --- // public GunAimCoordinate withAimSpeed(float aimSpeedYaw, float aimSpeedPitch) { @@ -47,51 +49,93 @@ public GunAimCoordinate withAimCorrectionFunction(@Nonnull AimCorrectionFunction return this; } + /** + * Sets the current absolute yaw/pitch and also initialises the target to the same values. + * The angles are clamped to the yaw limits (relative to {@link #centerYaw}) and the pitch limits. + */ public GunAimCoordinate withCurrentAngles(float yaw, float pitch) { - this.yaw = yaw; - this.pitch = pitch; + this.yaw = this.targetYaw = clampYawToRange(yaw); + this.pitch = this.targetPitch = MathHelper.clamp(pitch, this.pitchLimitMin, this.pitchLimitMax); + return this; + } + + /** + * Sets the hull (center) yaw. All stored absolute yaw values are re‑clamped to the new center. + */ + public GunAimCoordinate withCenterYaw(float centerYaw) + { + this.centerYaw = centerYaw; + this.yaw = clampYawToRange(this.yaw); + this.targetYaw = clampYawToRange(this.targetYaw); return this; } + /** + * Sets the yaw limits (relative to {@link #centerYaw}). + * + * @param minYawLimit minimum relative yaw (degrees, in range -180…180) + * @param maxYawLimit maximum relative yaw (degrees, in range -180…180) + * If {@code minYawLimit <= maxYawLimit} the allowed range is the closed interval [min, max]. + * If {@code minYawLimit > maxYawLimit} the allowed range is the complement, + * i.e. [min, 180) ∪ (-180, max]. + */ public GunAimCoordinate withYawLimit(float minYawLimit, float maxYawLimit) { this.yawLimitMin = minYawLimit; this.yawLimitMax = maxYawLimit; + //Re‑clamp current and target values to the new limits + this.targetYaw = clampYawToRange(this.targetYaw); + this.yaw = clampYawToRange(this.yaw); return this; } public GunAimCoordinate withPitchLimit(float minPitchLimit, float maxPitchLimit) { - this.pitchLimitMin = minPitchLimit; - this.pitchLimitMax = maxPitchLimit; + this.pitchLimitMin = Math.min(minPitchLimit, maxPitchLimit); + this.pitchLimitMax = Math.max(minPitchLimit, maxPitchLimit); + this.targetPitch = MathHelper.clamp(this.pitch, this.pitchLimitMin, this.pitchLimitMax); + this.pitch = MathHelper.clamp(this.pitch, this.pitchLimitMin, this.pitchLimitMax); return this; } - //--- Targetting ---// + //--- Targeting --- // /** - * Sets the target angles + * Sets the target absolute yaw and pitch. The target will be rejected if outside limits. * - * @param targetYaw in degrees - * @param targetPitch in degrees - * @return whether the angle is within the limits + * @param targetYaw absolute yaw in degrees + * @param targetPitch absolute pitch in degrees + * @return whether the yaw (relative to {@link #centerYaw}) is within the yaw limits + * and the pitch within its absolute limits. */ public boolean setTarget(float targetYaw, float targetPitch) { - //Normalize targetYaw = MathHelper.wrapDegrees(targetYaw); targetPitch = MathHelper.wrapDegrees(targetPitch); - //Check and only set if within the limits + if(isWithinLimits(targetYaw, targetPitch)) { this.targetYaw = targetYaw; this.targetPitch = targetPitch; this.target = IIMath.offsetPosDirection(1, this.targetYaw, this.targetPitch); + return true; } return false; } + /** + * Sets the target absolute yaw and pitch, clamping the target to allowed limits + * + * @param targetYaw absolute yaw in degrees + * @param targetPitch absolute pitch in degrees + * @return always true (the target is set to the clamped values) + */ + public boolean setTargetClamped(float targetYaw, float targetPitch) + { + return setTarget(clampYawToRange(targetYaw), clampYawToRange(targetPitch)); + } + public boolean setTarget(Vec3d shooterPos, Vec3d shooterMotion, Vec3d targetPos, Vec3d targetMotion) { float[] angles = aimCorrectionFunction.getAnglePrediction(shooterPos, shooterMotion, targetPos, targetMotion); @@ -99,25 +143,36 @@ public boolean setTarget(Vec3d shooterPos, Vec3d shooterMotion, Vec3d targetPos, } /** - * @param yaw in degrees - * @param pitch in degrees - * @return if the given angles are within the limits + * Checks if the given absolute yaw/pitch are within limits. + * Yaw is considered relative to {@link #centerYaw} and tested against the yaw limits + * (normal or wrapped). Pitch uses absolute limits. */ public boolean isWithinLimits(float yaw, float pitch) { - return yaw >= yawLimitMin&&yaw <= yawLimitMax&&pitch >= pitchLimitMin&&pitch <= pitchLimitMax; + if(pitch < pitchLimitMin||pitch > pitchLimitMax) + return false; + + float relYaw = MathHelper.wrapDegrees(yaw-centerYaw); + return isRelativeYawWithinLimits(relYaw); + } + + private boolean isRelativeYawWithinLimits(float relYaw) + { + if(yawLimitMin <= yawLimitMax) //Normal range + return relYaw >= yawLimitMin&&relYaw <= yawLimitMax; + else //Wrapped range: allowed if outside (max, min) + return relYaw >= yawLimitMin||relYaw <= yawLimitMax; } - //--- Update ---// + //--- Update --- // public void update() { - //Lerp towards the target angles this.yaw = getYaw(1f); this.pitch = getPitch(1f); } - //--- NBT ---// + //--- NBT --- // @Override public NBTTagCompound serializeNBT() @@ -127,6 +182,7 @@ public NBTTagCompound serializeNBT() .withFloat("yaw", yaw) .withFloat("target_pitch", targetPitch) .withFloat("target_yaw", targetYaw) + .withFloat("center_yaw", centerYaw) .unwrap(); } @@ -137,33 +193,130 @@ public void deserializeNBT(NBTTagCompound nbt) yaw = nbt.getFloat("yaw"); targetPitch = nbt.getFloat("target_pitch"); targetYaw = nbt.getFloat("target_yaw"); + centerYaw = nbt.getFloat("center_yaw"); } - //--- Utils ---// + //--- Utility methods --- // + /** + * @return absolute yaw (global) at the given partial tick, moving from current towards target + * along the allowed angular path (respecting limits and choosing the correct direction). + */ public float getYaw(float partialTicks) { if(partialTicks==0) return yaw; - if(yaw==targetYaw) - return yaw; - return MathHelper.clamp(yaw+(partialTicks*aimSpeedYaw*Math.signum(targetYaw-yaw)), yawLimitMin, yawLimitMax); + if(Math.abs(yaw-targetYaw) <= MINIMAL) + return targetYaw; + + float step = aimSpeedYaw*partialTicks; + float newYaw = moveYawTowards(yaw, targetYaw, step); + //Snap if very close + if(Math.abs(newYaw-targetYaw) <= MINIMAL) + newYaw = targetYaw; + return clampYawToRange(newYaw); } + /** + * Moves {@code current} towards {@code target} by at most {@code maxStep} degrees, + * staying inside the allowed yaw region defined by {@link #yawLimitMin} and {@link #yawLimitMax} + * (relative to {@link #centerYaw}). Handles both normal and wrapped ranges, and always chooses + * the direction (shortest or longest) that keeps the movement within limits. + * + * @param current current absolute yaw (in -180..180) + * @param target target absolute yaw (in -180..180, guaranteed to be within limits) + * @param maxStep maximum angular change (positive) + * @return new absolute yaw after moving + */ + private float moveYawTowards(float current, float target, float maxStep) + { + if(current==target||maxStep <= 0) + return current; + if(Math.abs(current-target) <= MINIMAL) + return target; + + //Convert to [0,360) for easier circle arithmetic + float curr = (current%360+360)%360; + float targ = (target%360+360)%360; + + //Convert limits to [0,360) + float a = (yawLimitMin%360+360)%360; + float b = (yawLimitMax%360+360)%360; + + //Full circle allowed? (forbidden length == 0) + float forbiddenLen = (a-b+360)%360; + boolean fullCircle = (forbiddenLen==0); + + float newAngle; + if(fullCircle) + { + //Simple shortest path + float diff = (targ-curr+360)%360; + if(diff > 180) diff -= 360; //signed delta + float move = Math.copySign(Math.min(maxStep, Math.abs(diff)), diff); + newAngle = curr+move; + } + else + { + //Map allowed region to a contiguous interval + float currU = curr < a?curr+360: curr; + float targU = targ < a?targ+360: targ; + + //Linear movement in unwrapped space + float diffU = targU-currU; + float moveU = Math.copySign(Math.min(maxStep, Math.abs(diffU)), diffU); + float newU = currU+moveU; + + //Map back to [0,360) + newAngle = newU%360; + if(newAngle < 0) newAngle += 360; + } + + //Convert back to -180..180 range + float result = newAngle; + if(result > 180) result -= 360; + return result; + } + + /** + * @return a value in [0,1] representing how far the current relative yaw is + * between the yaw limits, linearly interpolated even across the wrap point. + * For a wrapped range (min > max), 0 corresponds to {@code yawLimitMin}, + * 1 corresponds to {@code yawLimitMax} (going through +180). + */ public float getYawNormalized(float partialTicks) { - if(yawLimitMin==yawLimitMax) - return 0.5f; - return (getYaw(partialTicks)-yawLimitMin)/(yawLimitMax-yawLimitMin); + float relYaw = MathHelper.wrapDegrees(getYaw(partialTicks)-centerYaw); + + if(yawLimitMin <= yawLimitMax) //Normal range + { + if(yawLimitMin==yawLimitMax) + return 0.5f; + return (relYaw-yawLimitMin)/(yawLimitMax-yawLimitMin); + } + else //Wrapped range: map the arc [min, max+360] linearly + { + float effectiveMin = yawLimitMin; + float effectiveMax = yawLimitMax+360; + float relYaw2 = relYaw; + if(relYaw2 < yawLimitMin) + relYaw2 += 360; + return (relYaw2-effectiveMin)/(effectiveMax-effectiveMin); + } } public float getPitch(float partialTicks) { if(partialTicks==0) return pitch; - if(pitch==targetPitch) - return pitch; - return MathHelper.clamp(pitch+(partialTicks*aimSpeedPitch*Math.signum(targetPitch-pitch)), pitchLimitMin, pitchLimitMax); + if(Math.abs(pitch-targetPitch) <= MINIMAL) + return targetPitch; + float speed = Math.min(aimSpeedPitch, Math.abs(pitch-targetPitch)); + float newPitch = pitch+(partialTicks*speed*Math.signum(targetPitch-pitch)); + newPitch = MathHelper.clamp(newPitch, pitchLimitMin, pitchLimitMax); + if(Math.abs(newPitch-targetPitch) <= MINIMAL) + newPitch = targetPitch; + return newPitch; } public float getPitchNormalized(float partialTicks) @@ -175,50 +328,74 @@ public float getPitchNormalized(float partialTicks) public boolean isAimed() { - return yaw==targetYaw&&pitch==targetPitch; + return isAimed(MINIMAL); } public boolean isAimed(float allowedInaccuracy) { - return Math.abs(MathHelper.wrapDegrees(yaw-targetYaw)) <= allowedInaccuracy - &&Math.abs(MathHelper.wrapDegrees(pitch-targetPitch)) <= allowedInaccuracy; + return Math.abs(yaw-targetYaw) <= allowedInaccuracy&&Math.abs(pitch-targetPitch) <= allowedInaccuracy; } - public float getCurrentYaw() + /** + * Clamps an absolute yaw value to the absolute yaw range defined by + * {@link #centerYaw} and the (possibly wrapped) relative yaw limits. + * + * @param yaw absolute yaw to clamp + * @return clamped absolute yaw (nearest allowed value) + */ + public float clampYawToRange(float yaw) { - return yaw; + float relYaw = MathHelper.wrapDegrees(yaw-centerYaw); + float clampedRel = clampRelativeYaw(relYaw); + return MathHelper.wrapDegrees(centerYaw+clampedRel); } - public float getCurrentPitch() + private float clampRelativeYaw(float relYaw) { - return pitch; + //Normal range + if(yawLimitMin <= yawLimitMax) + return MathHelper.clamp(relYaw, yawLimitMin, yawLimitMax); + //Wrapped range + else + { + float min = yawLimitMin; + float max = yawLimitMax; + //If relYaw is inside forbidden interval (max, min), map to nearest endpoint + if(relYaw > max&&relYaw < min) + { + float distToMin = Math.abs(relYaw-min); + float distToMax = Math.abs(relYaw-max); + return distToMin <= distToMin?min: max; + } + return relYaw; + } } - public float getTargetYaw() + public float clampPitchToRange(float pitch) { - return targetYaw; + return MathHelper.clamp(pitch, pitchLimitMin, pitchLimitMax); } - public float getTargetPitch() + public Vec3d getTarget(float partialTicks) { - return targetPitch; + double yawRad = Math.toRadians(getYaw(partialTicks)); + double pitchRad = Math.toRadians(-getPitch(partialTicks)); + return IIMath.offsetPosDirection(1, -yawRad, pitchRad); } - public float clampYawToRange(float yaw) + public float getCenterYaw() { - return MathHelper.clamp(yaw, yawLimitMin, yawLimitMax); + return centerYaw; } - public float clampPitchToRange(float pitch) + public float getTargetYaw() { - return MathHelper.clamp(pitch, pitchLimitMin, pitchLimitMax); + return targetYaw; } - public Vec3d getTarget(float partialTicks) + public float getTargetPitch() { - float yaw = getYaw(partialTicks); - float pitch = getPitch(partialTicks); - return IIMath.offsetPosDirection(1, yaw, pitch); + return targetPitch; } @FunctionalInterface @@ -229,7 +406,7 @@ public interface AimCorrectionFunction * @param shooterMotion motion of the shooter/gun * @param targetPos position of the target * @param targetMotion motion of the target - * @return array of pitch and yaw in degrees + * @return array of pitch and yaw in degrees (absolute) */ float[] getAnglePrediction(Vec3d shooterPos, Vec3d shooterMotion, Vec3d targetPos, Vec3d targetMotion); } @@ -237,8 +414,8 @@ public interface AimCorrectionFunction private static float[] getTargetLead(Vec3d shooterPos, Vec3d shooterMotion, Vec3d targetPos, Vec3d targetMotion) { Vec3d vv = shooterPos.subtract(targetPos).add(targetMotion).normalize(); - float yy = (float)((Math.atan2(vv.x, vv.z)*180D)/3.1415927410125732D); - float pp = (float)Math.toDegrees((Math.atan2(vv.y, vv.distanceTo(new Vec3d(0, vv.y, 0))))); + float yy = (float)((Math.atan2(vv.x, vv.z)*180D)/Math.PI); + float pp = (float)Math.toDegrees(Math.atan2(vv.y, vv.distanceTo(new Vec3d(0, vv.y, 0)))); return new float[]{yy, pp}; } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/item/IItemEntityPlacer.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/item/IItemEntityPlacer.java new file mode 100644 index 000000000..045ce5dad --- /dev/null +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/item/IItemEntityPlacer.java @@ -0,0 +1,100 @@ +package pl.pabilo8.immersiveintelligence.common.util.item; + + +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemMonsterPlacer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.*; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import pl.pabilo8.immersiveintelligence.common.IISounds; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.List; + +/** + * An interface for items that place entities, i.e. {@link pl.pabilo8.immersiveintelligence.common.item.tools.ItemIITripodPeriscope} + * + * @author Pabilo8 (pabilo@iiteam.net) + * @ii-approved 0.3.1 + * @since 23.05.2026 + */ +public interface IItemEntityPlacer +{ + default EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, + float hitX, float hitY, float hitZ) + { + //Can't place on the same position as player + if(facing==EnumFacing.DOWN) + return EnumActionResult.FAIL; + + //Check if the entity can be placed on, or on top of the clicked block + boolean canBePlaced = world.getBlockState(pos).getBlock().isReplaceable(world, pos); + BlockPos blockpos = canBePlaced?pos: pos.offset(facing); + ItemStack stack = player.getHeldItem(hand); + if(!player.canPlayerEdit(blockpos, facing, stack)) + return EnumActionResult.FAIL; + + //Get taken space and go through blocks + AxisAlignedBB takenSpace = getPlacedSpace(blockpos); + for(int x = (int)Math.floor(takenSpace.minX), xMax = (int)Math.ceil(takenSpace.maxX); x < xMax; x++) + for(int y = (int)Math.floor(takenSpace.minY), yMax = (int)Math.ceil(takenSpace.maxY); y < yMax; y++) + for(int z = (int)Math.floor(takenSpace.minZ), zMax = (int)Math.ceil(takenSpace.maxZ); z < zMax; z++) + { + BlockPos freeSpacePos = new BlockPos(x, y, z); + if(!world.isAirBlock(freeSpacePos)&&!world.getBlockState(freeSpacePos).getBlock().isReplaceable(world, freeSpacePos)) + return EnumActionResult.FAIL; + } + + //Check if there aren't any entities there + List list = world.getEntitiesWithinAABBExcludingEntity(null, takenSpace); + if(!list.isEmpty()) + return EnumActionResult.FAIL; + + //Place the entity + if(!world.isRemote) + { + E placed = getPlacedEntity(world, blockpos.getX()+0.5, blockpos.getY(), blockpos.getZ()+0.5, stack, player.rotationYaw, player.rotationPitch); + //Clean the space + for(int x = (int)Math.floor(takenSpace.minX), xMax = (int)Math.ceil(takenSpace.maxX); x < xMax; x++) + for(int y = (int)Math.floor(takenSpace.minY), yMax = (int)Math.ceil(takenSpace.maxY); y < yMax; y++) + for(int z = (int)Math.floor(takenSpace.minZ), zMax = (int)Math.ceil(takenSpace.maxZ); z < zMax; z++) + world.setBlockToAir(new BlockPos(x, y, z)); + + //Spawn the entity + ItemMonsterPlacer.applyItemEntityDataToEntity(world, player, stack, placed); + world.spawnEntity(placed); + + //Play placing sound + SoundEvent placedSound = getPlacedSound(); + if(placedSound!=null) + world.playSound(null, blockpos, placedSound, SoundCategory.BLOCKS, 0.75f, 1f); + + //Mount the player on the entity + if(shouldPlayerMountAfterPlacing()) + player.startRiding(placed); + } + stack.shrink(1); + return EnumActionResult.SUCCESS; + } + + @Nonnull + AxisAlignedBB getPlacedSpace(BlockPos pos); + + @Nonnull + E getPlacedEntity(World world, double x, double y, double z, ItemStack stack, float playerYaw, float playerPitch); + + @Nullable + default SoundEvent getPlacedSound() + { + return IISounds.weaponPlaced; + } + + default boolean shouldPlayerMountAfterPlacing() + { + return true; + } +} diff --git a/src/main/resources/assets/immersiveintelligence/lang/en_us.lang b/src/main/resources/assets/immersiveintelligence/lang/en_us.lang index 39f99d2c3..0bf8a3705 100644 --- a/src/main/resources/assets/immersiveintelligence/lang/en_us.lang +++ b/src/main/resources/assets/immersiveintelligence/lang/en_us.lang @@ -948,7 +948,8 @@ subtitle.immersiveintelligence.mortar_shot=Mortar Firing subtitle.immersiveintelligence.mortar_load=Mortar Loading subtitle.immersiveintelligence.mine_detector=Mine Detector Beeps -subtitle.immersiveintelligence.construction=Hammer-Assisted Construction +subtitle.immersiveintelligence.construction=Ongoing Construction +subtitle.immersiveintelligence.weapon_placed=Mounted Weapon Deploying subtitle.immersiveintelligence.gate_open=Gate Opening subtitle.immersiveintelligence.gate_close=Gate Closing diff --git a/src/main/resources/assets/immersiveintelligence/models/entity/vehicle/tracked_motorbike/tracked_motorbike.mtl b/src/main/resources/assets/immersiveintelligence/models/entity/vehicle/tracked_motorbike/tracked_motorbike.mtl index f3bdf3cbf..1d49f4f57 100644 --- a/src/main/resources/assets/immersiveintelligence/models/entity/vehicle/tracked_motorbike/tracked_motorbike.mtl +++ b/src/main/resources/assets/immersiveintelligence/models/entity/vehicle/tracked_motorbike/tracked_motorbike.mtl @@ -44,8 +44,8 @@ newmtl v4_diesel2 map_Kd immersiveintelligence:entity/vehicle/engine/v4_diesel2 newmtl engine_4 map_Kd immersiveintelligence:entity/vehicle/engine/engine_4 -newmtl pipe34 -map_Kd immersiveintelligence:blocks/common/structural/pipe34 +newmtl common_cable_and_pipe +map_Kd immersiveintelligence:blocks/common/common_cable_and_pipe newmtl wheel_12_terrain map_Kd immersiveintelligence:entity/vehicle/suspension/wheel_12_terrain newmtl snow diff --git a/src/main/resources/assets/immersiveintelligence/models/entity/vehicle/tracked_motorbike/tracked_motorbike.obj b/src/main/resources/assets/immersiveintelligence/models/entity/vehicle/tracked_motorbike/tracked_motorbike.obj index db49d07d0..5056b9a02 100644 --- a/src/main/resources/assets/immersiveintelligence/models/entity/vehicle/tracked_motorbike/tracked_motorbike.obj +++ b/src/main/resources/assets/immersiveintelligence/models/entity/vehicle/tracked_motorbike/tracked_motorbike.obj @@ -1,554 +1,1319 @@ # Made by Pabilo8 with Blockbench -# Exported with IIToolkit Plugin +# Exported with IIToolkit Plugin on 18/05/2026 mtllib tracked_motorbike.mtl - +o wing +v 0.125 0.8688 -0.75 +v 0.1313 0.8687 -0.875 +v 0.125 0.6188 -0.6875 +v 0.1313 0.6187 -0.8125 +v -0.125 0.8688 -0.75 +v -0.1312 0.8687 -0.875 +v -0.125 0.6188 -0.6875 +v -0.1312 0.6187 -0.8125 +v 0 0.8688 -0.75 +v 0 0.6188 -0.6875 +v 0 0.6187 -0.8125 +v 0 0.8687 -0.875 +v 0.125 0.8688 -0.75 +v 0.125 1.0562 -0.9375 +v 0.1313 0.8687 -0.875 +v 0.1313 0.9313 -0.9375 +v -0.125 0.8688 -0.75 +v -0.125 1.0562 -0.9375 +v -0.1312 0.8687 -0.875 +v -0.1312 0.9313 -0.9375 +v 0 1.0562 -0.9375 +v 0 0.8688 -0.75 +v 0 0.8687 -0.875 +v 0 0.9313 -0.9375 +v 0.125 1.0562 -0.9375 +v 0.125 1.0563 -1.4375 +v 0.1313 0.9313 -0.9375 +v 0.1313 0.9312 -1.4375 +v -0.125 1.0562 -0.9375 +v -0.125 1.0563 -1.4375 +v -0.1312 0.9313 -0.9375 +v -0.1312 0.9312 -1.4375 +v 0 1.0563 -1.4375 +v 0 1.0562 -0.9375 +v 0 0.9313 -0.9375 +v 0 0.9312 -1.4375 +v 0.125 1.0563 -1.4375 +v 0.125 0.8063 -1.8125 +v 0.1313 0.9312 -1.4375 +v 0.1313 0.6812 -1.8125 +v -0.125 1.0563 -1.4375 +v -0.125 0.8063 -1.8125 +v -0.1312 0.9312 -1.4375 +v -0.1312 0.6812 -1.8125 +v 0 0.8063 -1.8125 +v 0 1.0563 -1.4375 +v 0 0.9312 -1.4375 +v 0 0.6812 -1.8125 +vt 0.7188 0.6406 +vt 0.7188 0.7031 +vt 0.75 0.7031 +vt 0.75 0.6406 +vt 0.7496 0.6146 +vt 0.7496 0.5501 +vt 0.7193 0.5426 +vt 0.7193 0.607 +vt 0.125 0.9688 +vt 0.1563 0.9688 +vt 0.1563 1 +vt 0.125 1 +vt 0.75 0.25 +vt 0.7813 0.25 +vt 0.7813 0.3125 +vt 0.75 0.3125 +vt 0.75 0.3125 +vt 0.7188 0.3125 +vt 0.7188 0.25 +vt 0.75 0.25 +vt 0.75 0.3125 +vt 0.7188 0.3125 +vt 0.7188 0.25 +vt 0.75 0.25 +vt 0.1875 1 +vt 0.1563 1 +vt 0.1563 0.9688 +vt 0.1875 0.9688 +vt 0.75 0.25 +vt 0.7813 0.25 +vt 0.7813 0.3125 +vt 0.75 0.3125 +vt 0.556 0.2767 +vt 0.5781 0.2546 +vt 0.5118 0.2546 +vt 0.5339 0.2767 +vt 0.3502 0.2766 +vt 0.3281 0.2544 +vt 0.3944 0.2544 +vt 0.3723 0.2766 +vt 0.75 0.7969 +vt 0.7813 0.7969 +vt 0.7813 0.8594 +vt 0.75 0.8594 +vt 1 0.5938 +vt 0.9688 0.5938 +vt 0.9688 0.5781 +vt 1 0.5781 +vt 1 0.9063 +vt 0.9688 0.9063 +vt 0.9688 0.8438 +vt 1 0.8438 +vt 0.75 0.7344 +vt 0.7813 0.7344 +vt 0.7813 0.75 +vt 0.75 0.75 +vt 0.5137 0.2813 +vt 0.5137 0.25 +vt 0.3887 0.25 +vt 0.3887 0.2813 +vt 0.4688 0.2813 +vt 0.4688 0.25 +vt 0.3438 0.25 +vt 0.3438 0.2813 +vt 1 0.5625 +vt 0.9688 0.5625 +vt 0.9688 0.6875 +vt 1 0.6875 +vt 0.75 0.7344 +vt 0.7813 0.7344 +vt 0.7813 0.8594 +vt 0.75 0.8594 +vt 1 0.875 +vt 0.9688 0.875 +vt 0.9688 0.75 +vt 1 0.75 +vt 1 0.875 +vt 0.9688 0.875 +vt 0.9688 0.75 +vt 1 0.75 +vt 0.2681 0.2786 +vt 0.2508 0.2526 +vt 0.1381 0.2526 +vt 0.1554 0.2786 +vt 0.3091 0.2793 +vt 0.2918 0.2532 +vt 0.4044 0.2532 +vt 0.4218 0.2793 +vt 0.75 0.3594 +vt 0.7188 0.3594 +vt 0.7188 0.25 +vt 0.75 0.25 +vt 0 0.25 +vt 0.0313 0.25 +vt 0.0313 0.3594 +vt 0 0.3594 +vt 0.3281 1 +vt 0.2969 1 +vt 0.2969 0.9688 +vt 0.3281 0.9688 +vt 0.75 0.25 +vt 0.7813 0.25 +vt 0.7813 0.3594 +vt 0.75 0.3594 +vt 1 0.3594 +vt 0.9688 0.3594 +vt 0.9688 0.25 +vt 1 0.25 +vt 0.2656 0.9688 +vt 0.2969 0.9688 +vt 0.2969 1 +vt 0.2656 1 +vn 1 0.01 0.05 +vn -1 0.01 0.05 +vn 0 -1 0 +vn 0 0.24 0.97 +vn 0 -0.24 -0.97 +vn 0 0.24 0.97 +vn 0 -1 0 +vn 0 -0.24 -0.97 +vn 1 0.05 0.05 +vn -1 0.05 0.05 +vn 0 0.71 0.71 +vn 0 -0.71 -0.71 +vn 0 0.71 0.71 +vn 0 -0.71 -0.71 +vn 1 0.05 0 +vn -1 0.05 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 1 0 +vn 0 -1 0 +vn 1 0.05 -0.03 +vn -1 0.05 -0.03 +vn 0 0.83 -0.55 +vn 0 -0.83 0.55 +vn 0 0 -1 +vn 0 0.83 -0.55 +vn 0 -0.83 0.55 +vn 0 0 -1 +usemtl common_steel_painted_norivets +f 4/1/1 2/2/1 1/3/1 3/4/1 +f 7/5/2 5/6/2 6/7/2 8/8/2 +f 8/9/3 11/10/3 10/11/3 7/12/3 +f 7/13/4 10/14/4 9/15/4 5/16/4 +usemtl common_steel_norivets +f 6/17/5 12/18/5 11/19/5 8/20/5 +usemtl common_steel_painted_norivets +f 1/21/6 9/22/6 10/23/6 3/24/6 +f 3/25/7 10/26/7 11/27/7 4/28/7 +usemtl common_steel_norivets +f 4/29/8 11/30/8 12/31/8 2/32/8 +usemtl common_steel_painted_norivets +f 16/33/9 14/34/9 13/35/9 15/36/9 +f 19/37/10 17/38/10 18/39/10 20/40/10 +f 17/41/11 22/42/11 21/43/11 18/44/11 +usemtl common_steel_norivets +f 20/45/12 24/46/12 23/47/12 19/48/12 +usemtl common_steel_painted_norivets +f 14/49/13 21/50/13 22/51/13 13/52/13 +usemtl common_steel_norivets +f 15/53/14 23/54/14 24/55/14 16/56/14 +usemtl common_steel_painted_norivets +f 28/57/15 26/58/15 25/59/15 27/60/15 +f 31/61/16 29/62/16 30/63/16 32/64/16 +f 29/65/17 34/66/17 33/67/17 30/68/17 +usemtl common_steel_norivets +f 32/69/18 36/70/18 35/71/18 31/72/18 +usemtl common_steel_painted_norivets +f 26/73/19 33/74/19 34/75/19 25/76/19 +usemtl common_steel_norivets +f 27/77/20 35/78/20 36/79/20 28/80/20 +usemtl common_steel_painted_norivets +f 40/81/21 38/82/21 37/83/21 39/84/21 +f 43/85/22 41/86/22 42/87/22 44/88/22 +f 41/89/23 46/90/23 45/91/23 42/92/23 +usemtl common_steel_norivets +f 44/93/24 48/94/24 47/95/24 43/96/24 +usemtl common_steel_painted_norivets +f 42/97/25 45/98/25 48/99/25 44/100/25 +f 38/101/26 45/102/26 46/103/26 37/104/26 +usemtl common_steel_norivets +f 39/105/27 47/106/27 48/107/27 40/108/27 +usemtl common_steel_painted_norivets +f 40/109/28 48/110/28 45/111/28 38/112/28 +o wheel +v -0.125 0.8717 -1.0938 +v 0.125 0.8717 -1.0938 +v -0.125 0.6217 -0.8438 +v 0.125 0.6217 -0.8438 +v -0.125 0.8717 -1.4688 +v 0.125 0.8717 -1.4688 +v -0.125 0.6217 -1.7188 +v 0.125 0.6217 -1.7188 +v -0.125 -0.0033 -1.0938 +v 0.125 -0.0033 -1.0938 +v -0.125 0.2467 -0.8438 +v 0.125 0.2467 -0.8438 +v -0.125 -0.0033 -1.4688 +v 0.125 -0.0033 -1.4688 +v -0.125 0.2467 -1.7188 +v 0.125 0.2467 -1.7188 +v -0.125 0.6217 -0.8438 +v 0.125 0.6217 -0.8438 +v -0.125 0.2467 -0.8438 +v 0.125 0.2467 -0.8438 +v -0.125 0.6217 -1.7188 +v 0.125 0.6217 -1.7188 +v -0.125 0.2467 -1.7188 +v 0.125 0.2467 -1.7188 +vt 0.8438 0.5625 +vt 0.8438 0.7188 +vt 0.7188 0.7188 +vt 0.7188 0.5625 +vt 0.2813 0.5625 +vt 0.2813 0.7188 +vt 0.1563 0.7188 +vt 0.1563 0.5625 +vt 0.4063 0.7188 +vt 0.4063 0.8438 +vt 0.5938 0.8438 +vt 0.5938 0.7188 +vt 0.7188 0.5938 +vt 0.5938 0.7188 +vt 0.4063 0.7188 +vt 0.2813 0.5938 +vt 0.2813 0.5938 +vt 0.4063 0.7188 +vt 0.5938 0.7188 +vt 0.7188 0.5938 +vt 0.7188 0.2813 +vt 0.8438 0.2813 +vt 0.8438 0.4375 +vt 0.7188 0.4375 +vt 0.1563 0.2813 +vt 0.2813 0.2813 +vt 0.2813 0.4375 +vt 0.1563 0.4375 +vt 0.4063 0.1563 +vt 0.5938 0.1563 +vt 0.5938 0.2813 +vt 0.4063 0.2813 +vt 0.4063 0.2813 +vt 0.5938 0.2813 +vt 0.7188 0.4063 +vt 0.2813 0.4063 +vt 0.5938 0.2813 +vt 0.4063 0.2813 +vt 0.2813 0.4063 +vt 0.7188 0.4063 +vt 0.8438 0.4063 +vt 0.8438 0.5938 +vt 0.7188 0.5938 +vt 0.7188 0.4063 +vt 0.2813 0.4063 +vt 0.2813 0.5938 +vt 0.1563 0.5938 +vt 0.1563 0.4063 +vt 0.7188 0.4063 +vt 0.7188 0.5938 +vt 0.2813 0.5938 +vt 0.2813 0.4063 +vt 0.2813 0.4063 +vt 0.2813 0.5938 +vt 0.7188 0.5938 +vt 0.7188 0.4063 +vn 0 0.71 0.71 +vn 0 0.71 -0.71 +vn 0 1 0 +vn -1 0 0 +vn 1 0 0 +vn 0 -0.71 0.71 +vn 0 -0.71 -0.71 +vn 0 -1 0 +vn -1 0 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn -1 0 0 +vn 1 0 0 +usemtl wheel_12_terrain +f 52/113/29 50/114/29 49/115/29 51/116/29 +f 55/117/30 53/118/30 54/119/30 56/120/30 +f 49/121/31 50/122/31 54/123/31 53/124/31 +f 51/125/32 49/126/32 53/127/32 55/128/32 +f 56/129/33 54/130/33 50/131/33 52/132/33 +f 57/133/34 58/134/34 60/135/34 59/136/34 +f 62/137/35 61/138/35 63/139/35 64/140/35 +f 62/141/36 58/142/36 57/143/36 61/144/36 +f 61/145/37 57/146/37 59/147/37 63/148/37 +f 58/149/38 62/150/38 64/151/38 60/152/38 +f 68/153/39 66/154/39 65/155/39 67/156/39 +f 71/157/40 69/158/40 70/159/40 72/160/40 +f 67/161/41 65/162/41 69/163/41 71/164/41 +f 72/165/42 70/166/42 66/167/42 68/168/42 +o suspension_wheel +v 0.3125 0.5 -1.225 +v 0.3125 0.5 -1.35 +v 0.3125 0.375 -1.225 +v 0.3125 0.375 -1.35 +v -0.3125 0.5 -1.225 +v -0.3125 0.5 -1.35 +v -0.3125 0.375 -1.225 +v -0.3125 0.375 -1.35 +v -0.1375 0.8593 -1.0228 +v -0.1375 0.9016 -1.1135 +v -0.1375 0.6328 -1.1285 +v -0.1375 0.675 -1.2191 +v -0.2375 0.8593 -1.0228 +v -0.2375 0.9016 -1.1135 +v -0.2375 0.6328 -1.1285 +v -0.2375 0.675 -1.2191 +v 0.2375 0.8593 -1.0228 +v 0.2375 0.9016 -1.1135 +v 0.2375 0.6328 -1.1285 +v 0.2375 0.675 -1.2191 +v 0.1375 0.8593 -1.0228 +v 0.1375 0.9016 -1.1135 +v 0.1375 0.6328 -1.1285 +v 0.1375 0.675 -1.2191 +v 0.25 0.6598 -1.1045 +v 0.25 0.7136 -1.2173 +v 0.25 0.4341 -1.2121 +v 0.25 0.4879 -1.325 +v 0.125 0.6598 -1.1045 +v 0.125 0.7136 -1.2173 +v 0.125 0.4341 -1.2121 +v 0.125 0.4879 -1.325 +v -0.125 0.6598 -1.1045 +v -0.125 0.7136 -1.2173 +v -0.125 0.4341 -1.2121 +v -0.125 0.4879 -1.325 +v -0.25 0.6598 -1.1045 +v -0.25 0.7136 -1.2173 +v -0.25 0.4341 -1.2121 +v -0.25 0.4879 -1.325 +vt 0.875 0.0938 +vt 0.875 0.125 +vt 0.9063 0.125 +vt 0.9063 0.0938 +vt 0.9063 0.0938 +vt 0.875 0.0938 +vt 0.875 0.125 +vt 0.9063 0.125 +vt 0.7969 0.1094 +vt 0.7969 0.1406 +vt 0.9531 0.1406 +vt 0.9531 0.1094 +vt 0.9531 0.1094 +vt 0.9531 0.1406 +vt 0.7969 0.1406 +vt 0.7969 0.1094 +vt 0.9531 0.1406 +vt 0.9531 0.1094 +vt 0.7969 0.1094 +vt 0.7969 0.1406 +vt 0.9531 0.1094 +vt 0.9531 0.1406 +vt 0.7969 0.1406 +vt 0.7969 0.1094 +vt 0.9688 0.0938 +vt 0.9688 0.1563 +vt 0.9375 0.1563 +vt 0.9375 0.0938 +vt 0.9688 0.0938 +vt 0.9688 0.1563 +vt 0.9375 0.1563 +vt 0.9375 0.0938 +vt 0.9375 0.0938 +vt 0.9375 0.1563 +vt 0.9688 0.1563 +vt 0.9688 0.0938 +vt 0.9375 0.0938 +vt 0.9375 0.1563 +vt 0.9688 0.1563 +vt 0.9688 0.0938 +vt 0.9688 0.0938 +vt 0.9688 0.1563 +vt 0.9375 0.1563 +vt 0.9375 0.0938 +vt 0.9688 0.0938 +vt 0.9688 0.1563 +vt 0.9375 0.1563 +vt 0.9375 0.0938 +vt 0.9375 0.0938 +vt 0.9375 0.1563 +vt 0.9688 0.1563 +vt 0.9688 0.0938 +vt 0.9375 0.0938 +vt 0.9375 0.1563 +vt 0.9688 0.1563 +vt 0.9688 0.0938 +vt 0.9688 0.625 +vt 0.9688 0.6875 +vt 1 0.6875 +vt 1 0.625 +vt 0.9531 0.625 +vt 0.9531 0.6875 +vt 0.9844 0.6875 +vt 0.9844 0.625 +vt 0.8125 0.2813 +vt 0.8125 0.3125 +vt 0.8438 0.3125 +vt 0.8438 0.2813 +vt 0.9688 0.6406 +vt 0.9688 0.6719 +vt 0.9375 0.6719 +vt 0.9375 0.6406 +vt 1 0.6406 +vt 1 0.7031 +vt 0.9688 0.7031 +vt 0.9688 0.6406 +vt 0.9844 0.625 +vt 0.9844 0.6875 +vt 0.9531 0.6875 +vt 0.9531 0.625 +vt 0.9688 0.625 +vt 0.9688 0.6875 +vt 1 0.6875 +vt 1 0.625 +vt 0.9531 0.625 +vt 0.9531 0.6875 +vt 0.9844 0.6875 +vt 0.9844 0.625 +vt 0.8125 0.2813 +vt 0.8125 0.3125 +vt 0.8438 0.3125 +vt 0.8438 0.2813 +vt 0.9688 0.6406 +vt 0.9688 0.6719 +vt 0.9375 0.6719 +vt 0.9375 0.6406 +vt 1 0.6406 +vt 1 0.7031 +vt 0.9688 0.7031 +vt 0.9688 0.6406 +vt 0.9844 0.625 +vt 0.9844 0.6875 +vt 0.9531 0.6875 +vt 0.9531 0.625 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 -0.42 0.91 +vn 0 0.42 -0.91 +vn 1 0 0 +vn -1 0 0 +vn 0 -0.42 0.91 +vn 0 0.42 -0.91 +vn 1 0 0 +vn -1 0 0 +vn 0 0.9 0.43 +vn 0 -0.9 -0.43 +vn 0 -0.43 0.9 +vn 0 0.43 -0.9 +vn 1 0 0 +vn -1 0 0 +vn 0 0.9 0.43 +vn 0 -0.9 -0.43 +vn 0 -0.43 0.9 +vn 0 0.43 -0.9 +usemtl common_steel_norivets +f 76/169/43 74/170/43 73/171/43 75/172/43 +f 79/173/44 77/174/44 78/175/44 80/176/44 +f 73/177/45 74/178/45 78/179/45 77/180/45 +f 76/181/46 75/182/46 79/183/46 80/184/46 +f 75/185/47 73/186/47 77/187/47 79/188/47 +f 80/189/48 78/190/48 74/191/48 76/192/48 +f 84/193/49 82/194/49 81/195/49 83/196/49 +f 87/197/50 85/198/50 86/199/50 88/200/50 +f 83/201/51 81/202/51 85/203/51 87/204/51 +f 88/205/52 86/206/52 82/207/52 84/208/52 +f 92/209/53 90/210/53 89/211/53 91/212/53 +f 95/213/54 93/214/54 94/215/54 96/216/54 +f 91/217/55 89/218/55 93/219/55 95/220/55 +f 96/221/56 94/222/56 90/223/56 92/224/56 +usemtl common_steel_painted_norivets +f 100/225/57 98/226/57 97/227/57 99/228/57 +f 103/229/58 101/230/58 102/231/58 104/232/58 +f 97/233/59 98/234/59 102/235/59 101/236/59 +f 100/237/60 99/238/60 103/239/60 104/240/60 +f 99/241/61 97/242/61 101/243/61 103/244/61 +f 104/245/62 102/246/62 98/247/62 100/248/62 +f 108/249/63 106/250/63 105/251/63 107/252/63 +f 111/253/64 109/254/64 110/255/64 112/256/64 +f 105/257/65 106/258/65 110/259/65 109/260/65 +f 108/261/66 107/262/66 111/263/66 112/264/66 +f 107/265/67 105/266/67 109/267/67 111/268/67 +f 112/269/68 110/270/68 106/271/68 108/272/68 +o gas +v 0.6602 1.5529 -0.2551 +v 0.7735 1.5529 -0.3079 +v 0.6602 1.4279 -0.2551 +v 0.7735 1.4279 -0.3079 +v 0.581 1.5529 -0.425 +v 0.6943 1.5529 -0.4779 +v 0.581 1.4279 -0.425 +v 0.6943 1.4279 -0.4779 +vt 0.375 0.75 +vt 0.375 0.8125 +vt 0.3125 0.8125 +vt 0.3125 0.75 +vt 0.375 0.75 +vt 0.375 0.8125 +vt 0.3125 0.8125 +vt 0.3125 0.75 +vt 0.375 0.75 +vt 0.375 0.8125 +vt 0.2813 0.8125 +vt 0.2813 0.75 +vt 0.375 0.75 +vt 0.375 0.8125 +vt 0.2813 0.8125 +vt 0.2813 0.75 +vt 0.375 0.75 +vt 0.375 0.8125 +vt 0.2813 0.8125 +vt 0.2813 0.75 +vt 0.375 0.75 +vt 0.375 0.8125 +vt 0.2813 0.8125 +vt 0.2813 0.75 +vn 0.42 0 0.91 +vn -0.42 0 -0.91 +vn 0 1 0 +vn 0 -1 0 +vn -0.91 0 0.42 +vn 0.91 0 -0.42 +usemtl tracked_motorbike +f 116/273/69 114/274/69 113/275/69 115/276/69 +f 119/277/70 117/278/70 118/279/70 120/280/70 +f 113/281/71 114/282/71 118/283/71 117/284/71 +f 116/285/72 115/286/72 119/287/72 120/288/72 +f 115/289/73 113/290/73 117/291/73 119/292/73 +f 120/293/74 118/294/74 114/295/74 116/296/74 +o cluch +v -0.8271 1.5313 -0.3846 +v -0.5711 1.5313 -0.5639 +v -0.8271 1.4688 -0.3846 +v -0.5711 1.4688 -0.5639 +v -0.8629 1.5313 -0.4358 +v -0.6069 1.5313 -0.6151 +v -0.8629 1.4688 -0.4358 +v -0.6069 1.4688 -0.6151 +vt 0.8438 0.125 +vt 0.8438 0.1406 +vt 0.9219 0.1406 +vt 0.9219 0.125 +vt 0.8438 0.125 +vt 0.8438 0.1406 +vt 0.9219 0.1406 +vt 0.9219 0.125 +vt 0.8438 0.0625 +vt 0.8438 0.1406 +vt 0.8594 0.1406 +vt 0.8594 0.0625 +vt 0.8438 0.0625 +vt 0.8438 0.1406 +vt 0.8594 0.1406 +vt 0.8594 0.0625 +vt 0.8438 0.125 +vt 0.8438 0.1406 +vt 0.8594 0.1406 +vt 0.8594 0.125 +vt 0.8438 0.125 +vt 0.8438 0.1406 +vt 0.8594 0.1406 +vt 0.8594 0.125 +vn 0.57 0 0.82 +vn -0.57 0 -0.82 +vn 0 1 0 +vn 0 -1 0 +vn -0.82 0 0.57 +vn 0.82 0 -0.57 +usemtl common_steel +f 124/297/75 122/298/75 121/299/75 123/300/75 +f 127/301/76 125/302/76 126/303/76 128/304/76 +f 121/305/77 122/306/77 126/307/77 125/308/77 +f 124/309/78 123/310/78 127/311/78 128/312/78 +f 123/313/79 121/314/79 125/315/79 127/316/79 +f 128/317/80 126/318/80 122/319/80 124/320/80 +o brake +v 0.8544 1.5313 -0.4724 +v 0.5984 1.5313 -0.6517 +v 0.8544 1.4688 -0.4724 +v 0.5984 1.4688 -0.6517 +v 0.8185 1.5313 -0.4213 +v 0.5625 1.5313 -0.6005 +v 0.8185 1.4688 -0.4213 +v 0.5625 1.4688 -0.6005 +vt 0.9063 0.1406 +vt 0.9063 0.1563 +vt 0.8281 0.1563 +vt 0.8281 0.1406 +vt 0.9063 0.1406 +vt 0.9063 0.1563 +vt 0.8281 0.1563 +vt 0.8281 0.1406 +vt 0.8438 0.0781 +vt 0.8438 0.1563 +vt 0.8281 0.1563 +vt 0.8281 0.0781 +vt 0.8438 0.0781 +vt 0.8438 0.1563 +vt 0.8281 0.1563 +vt 0.8281 0.0781 +vt 0.8438 0.1406 +vt 0.8438 0.1563 +vt 0.8281 0.1563 +vt 0.8281 0.1406 +vt 0.8438 0.1406 +vt 0.8438 0.1563 +vt 0.8281 0.1563 +vt 0.8281 0.1406 +vn 0.57 0 -0.82 +vn -0.57 0 0.82 +vn 0 1 0 +vn 0 -1 0 +vn 0.82 0 0.57 +vn -0.82 0 -0.57 +usemtl common_steel +f 132/321/81 130/322/81 129/323/81 131/324/81 +f 135/325/82 133/326/82 134/327/82 136/328/82 +f 129/329/83 130/330/83 134/331/83 133/332/83 +f 132/333/84 131/334/84 135/335/84 136/336/84 +f 131/337/85 129/338/85 133/339/85 135/340/85 +f 136/341/86 134/342/86 130/343/86 132/344/86 +o key +v 0.2188 1.5071 -0.6554 +v 0.2188 1.5383 -0.7096 +v 0.2188 1.453 -0.6867 +v 0.2188 1.4842 -0.7408 +v 0.0938 1.5071 -0.6554 +v 0.0938 1.5383 -0.7096 +v 0.0938 1.453 -0.6867 +v 0.0938 1.4842 -0.7408 +v 0.1875 1.5242 -0.7122 +v 0.1875 1.4919 -0.833 +v 0.1875 1.4639 -0.6961 +v 0.1875 1.4315 -0.8168 +v 0.125 1.5242 -0.7122 +v 0.125 1.4919 -0.833 +v 0.125 1.4639 -0.6961 +v 0.125 1.4315 -0.8168 +vt 0.0625 0.9688 +vt 0.0625 1 +vt 0.0313 1 +vt 0.0313 0.9688 +vt 0.0313 0.9688 +vt 0.0313 1 +vt 0 1 +vt 0 0.9688 +vt 0.0625 0.9688 +vt 0.0625 1 +vt 0 1 +vt 0 0.9688 +vt 0.0625 0.9688 +vt 0.0625 1 +vt 0 1 +vt 0 0.9688 +vt 0.0625 0.9688 +vt 0.0625 1 +vt 0 1 +vt 0 0.9688 +vt 0 0.9688 +vt 0 1 +vt 0.0625 1 +vt 0.0625 0.9688 +vt 0.8594 0.1094 +vt 0.8594 0.125 +vt 0.8281 0.125 +vt 0.8281 0.1094 +vt 0.8594 0.1094 +vt 0.8594 0.125 +vt 0.8281 0.125 +vt 0.8281 0.1094 +vt 0.8438 0.0938 +vt 0.8438 0.125 +vt 0.8281 0.125 +vt 0.8281 0.0938 +vt 0.8438 0.0938 +vt 0.8438 0.125 +vt 0.8281 0.125 +vt 0.8281 0.0938 +vt 0.8438 0.1094 +vt 0.8438 0.125 +vt 0.8281 0.125 +vt 0.8281 0.1094 +vn 1 0 0 +vn -1 0 0 +vn 0 0.87 0.5 +vn 0 -0.87 -0.5 +vn 0 -0.5 0.87 +vn 0 0.5 -0.87 +vn 1 0 0 +vn -1 0 0 +vn 0 0.97 -0.26 +vn 0 -0.97 0.26 +vn 0 -0.26 -0.97 +usemtl tracked_motorbike +f 140/345/87 138/346/87 137/347/87 139/348/87 +f 143/349/88 141/350/88 142/351/88 144/352/88 +f 137/353/89 138/354/89 142/355/89 141/356/89 +f 140/357/90 139/358/90 143/359/90 144/360/90 +f 139/361/91 137/362/91 141/363/91 143/364/91 +f 144/365/92 142/366/92 138/367/92 140/368/92 +usemtl common_steel_norivets +f 148/369/93 146/370/93 145/371/93 147/372/93 +f 151/373/94 149/374/94 150/375/94 152/376/94 +f 145/377/95 146/378/95 150/379/95 149/380/95 +f 148/381/96 147/382/96 151/383/96 152/384/96 +f 152/385/97 150/386/97 146/387/97 148/388/97 o steering_wheel -v 0.1875 1.554196367034754 -0.8609108517670448 -v 0.1875 1.5516875913161952 -1.1483996837774764 -v 0.1875 1.6161483595877764 -0.9239539689843581 -v 0.1875 1.6141847841838846 -1.1489454995969892 -v 0.25 1.554196367034754 -0.8609108517670448 -v 0.25 1.5522327916308623 -1.0859023823796758 -v 0.25 1.6161483595877764 -0.9239539689843581 -v 0.25 1.6147300930286628 -1.0864475826943432 -v -0.1875 1.6161483595877764 -0.9239539689843581 -v -0.1875 1.6141847841838846 -1.1489454995969892 -v -0.1875 1.554196367034754 -0.8609108517670448 -v -0.1875 1.5516875913161952 -1.1483996837774764 -v -0.25 1.6161483595877764 -0.9239539689843581 -v -0.25 1.6147300930286628 -1.0864475826943432 -v -0.25 1.554196367034754 -0.8609108517670448 -v -0.25 1.5522327916308623 -1.0859023823796758 -v 0.598644375 1.5391747280752814 -0.43356502823587495 -v 0.67794625 1.5388524737678837 -0.47054271856720153 -v 0.598644375 1.4516780137144845 -0.43280166097125206 -v 0.67794625 1.4513557594070865 -0.46977935130257875 -v 0.577513125 1.5387793777922547 -0.4788791750907476 -v 0.656815 1.5384565079800114 -0.5158567568919632 -v 0.577513125 1.4512827719615686 -0.4781151923212791 -v 0.656815 1.4509599021493251 -0.5150927741224947 -v 0.56052 1.5575979091762269 -0.47111845093374494 -v 0.67380875 1.5571365890657998 -0.5239440074389428 -v 0.56052 1.4326026908757803 -0.4700279417742995 -v 0.67380875 1.4321414792954643 -0.5228528827746516 -v 0.38354875 1.554285845337533 -0.850620683737005 -v 0.49513125 1.5538398939925464 -0.9017538223699932 -v 0.38354875 1.4292907355671973 -0.8495295590727138 -v 0.49513125 1.428844784222211 -0.9006626977057022 -v -0.38354875 1.554285845337533 -0.850620683737005 -v -0.49417625 1.553839357352588 -0.9018000565850568 -v -0.38354875 1.4292907355671973 -0.8495295590727138 -v -0.49417625 1.4288442475822525 -0.9007089319207658 -v -0.374045 1.5542500643798618 -0.8547071784763038 -v -0.374045 1.5531595552204163 -0.9797023967767504 -v -0.374045 1.4292549546095261 -0.8536160538120128 -v -0.374045 1.4281643369199697 -0.9786118876173049 -v 0.38354875 1.554285845337533 -0.850620683737005 -v 0.49513125 1.5538398939925464 -0.9017538223699932 -v 0.38354875 1.4292907355671973 -0.8495295590727138 -v 0.49513125 1.428844784222211 -0.9006626977057022 -v 0.375 1.5542506010198203 -0.8546609442612402 -v 0.375 1.5531600918603747 -0.9796561625616867 -v 0.375 1.4292553827193737 -0.8535704351017948 -v 0.375 1.4281648735599282 -0.9785656534022413 -v 0.375 1.5542506010198203 -0.8546609442612402 -v 0.375 1.5531600918603747 -0.9796561625616867 -v 0.375 1.4292553827193737 -0.8535704351017948 -v 0.375 1.4281648735599282 -0.9785656534022413 -v -0.375 1.5542506010198203 -0.8546609442612402 -v -0.375 1.5531600918603747 -0.9796561625616867 -v -0.375 1.4292553827193737 -0.8535704351017948 -v -0.375 1.4281648735599282 -0.9785656534022413 -v -0.56052 1.5575979091762269 -0.47111845093374494 -v -0.67380875 1.5571365890657998 -0.5239440074389428 -v -0.56052 1.4326026908757803 -0.4700279417742995 -v -0.67380875 1.4321414792954643 -0.5228528827746516 -v -0.38354875 1.554285845337533 -0.850620683737005 -v -0.49417625 1.553839357352588 -0.9018000565850568 -v -0.38354875 1.4292907355671973 -0.8495295590727138 -v -0.49417625 1.4288442475822525 -0.9007089319207658 -v -0.598644375 1.5391747280752814 -0.43356502823587495 -v -0.67794625 1.5388524737678837 -0.47054271856720153 -v -0.598644375 1.4516780137144845 -0.43280166097125206 -v -0.67794625 1.4513557594070865 -0.46977935130257875 -v -0.577513125 1.5387793777922547 -0.4788791750907476 -v -0.656815 1.5384565079800114 -0.5158567568919632 -v -0.577513125 1.4512827719615686 -0.4781151923212791 -v -0.656815 1.4509599021493251 -0.5150927741224947 -v -0.125 0.9434493762165953 -0.9734206514614141 -v -0.125 0.9972629107182049 -1.086243684038254 -v -0.125 0.8306262351096443 -1.0272348014678692 -v -0.125 0.8844397696112538 -1.1400578340447092 -v -0.25 0.9434493762165953 -0.9734206514614141 -v -0.25 0.9972629107182049 -1.086243684038254 -v -0.25 0.8306262351096443 -1.0272348014678692 -v -0.25 0.8844397696112538 -1.1400578340447092 -v 0.25 0.9434493762165953 -0.9734206514614141 -v 0.25 0.9972629107182049 -1.086243684038254 -v 0.25 0.8306262351096443 -1.0272348014678692 -v 0.25 0.8844397696112538 -1.1400578340447092 -v 0.125 0.9434493762165953 -0.9734206514614141 -v 0.125 0.9972629107182049 -1.086243684038254 -v 0.125 0.8306262351096443 -1.0272348014678692 -v 0.125 0.8844397696112538 -1.1400578340447092 -v 0.25 1.0562724087934354 -0.9196071169598045 -v 0.25 1.1100865587998907 -1.0324302580667555 -v 0.25 0.9434493762165953 -0.9734206514614141 -v 0.25 0.9972629107182049 -1.086243684038254 -v -0.25 1.0562724087934354 -0.9196071169598045 -v -0.25 1.1100865587998907 -1.0324302580667555 -v -0.25 0.9434493762165953 -0.9734206514614141 -v -0.25 0.9972629107182049 -1.086243684038254 -v 0 1.1100865587998907 -1.0324302580667555 -v 0 0.9972629107182049 -1.086243684038254 -v 0 0.9434493762165953 -0.9734206514614141 -v 0 1.0562724087934354 -0.9196071169598045 -v 0.0625 1.4282777030533893 -0.8538854485718967 -v 0.0625 1.4293684532956745 -0.9788806889275408 -v 0.0625 1.0538448622869883 -0.921291797008148 -v 0.0625 1.0549356125292735 -1.046287037363792 -v -0.0625 1.4282777030533893 -0.8538854485718967 -v -0.0625 1.4293684532956745 -0.9788806889275408 -v -0.0625 1.0538448622869883 -0.921291797008148 -v -0.0625 1.0549356125292735 -1.046287037363792 -v -0.03125 1.6433702376730395 -0.8906671722694095 -v -0.03125 1.3356178148567246 -0.8364021167484939 -v -0.03125 1.652052646556386 -0.841426784618799 -v -0.03125 1.344300223740071 -0.7871617290978834 -v -0.34375 1.6433702376730395 -0.8906671722694095 -v -0.34375 1.3356178148567246 -0.8364021167484939 -v -0.34375 1.652052646556386 -0.841426784618799 -v -0.34375 1.344300223740071 -0.7871617290978834 -v -0.663231875 1.5571370734250607 -0.2557661167957289 -v -0.776055 1.557136784136433 -0.30957986836648865 -v -0.663231875 1.4321367572630839 -0.255766292353529 -v -0.776055 1.432137083479302 -0.3095801524543996 -v -0.58251125 1.5571366392912245 -0.4250008472328932 -v -0.695334375 1.5571369655074425 -0.47881470733376397 -v -0.58251125 1.4321369386340932 -0.4250011313208043 -v -0.695334375 1.4321366493454657 -0.47881488289156393 -v 0.28125 1.5818197531097766 -0.8798141611652264 -v 0.28125 1.3356178148567246 -0.8364021167484939 -v 0.28125 1.590502161993123 -0.8305737735146159 -v 0.28125 1.344300223740071 -0.7871617290978834 -v 0.03125 1.5818197531097766 -0.8798141611652264 -v 0.03125 1.3356178148567246 -0.8364021167484939 -v 0.03125 1.590502161993123 -0.8305737735146159 -v 0.03125 1.344300223740071 -0.7871617290978834 -v 0.591491875 1.6995006872985623 -0.8136820454982124 -v 0.595114375 1.6988877322512121 -0.8760741075886033 -v 0.621048125 1.6444772203812588 -0.8114255393402244 -v 0.624670625 1.6438642653339088 -0.8738176014306153 -v 0.461493125 1.5545558410151095 -0.812499674202116 -v 0.461493125 1.5545553132891639 -0.8749997237529934 -v 0.507573125 1.5123311818578908 -0.8124999431731318 -v 0.507573125 1.5123312696367908 -0.8750001012541202 -v 0.76863375 1.9066068067551591 -0.8124995560538204 -v 0.76863375 1.9066068945340593 -0.8749997141348088 -v 0.884070625 1.68485403942177 -0.8125001003833675 -v 0.884070625 1.6848542357307812 -0.8749996429595104 -v 0.54688125 1.791169282112213 -0.8124996669499529 -v 0.54688125 1.7911693698911129 -0.8749998250309413 -v 0.662318125 1.5694166233089348 -0.8124995957746544 -v 0.662318125 1.5694167110878348 -0.8749997538556428 -v -0.591491875 1.6995006872985623 -0.8136820454982124 -v -0.595114375 1.6988877322512121 -0.8760741075886033 -v -0.621048125 1.6444772203812588 -0.8114255393402244 -v -0.624670625 1.6438642653339088 -0.8738176014306153 -v -0.461493125 1.5545558410151095 -0.812499674202116 -v -0.461493125 1.5545553132891639 -0.8749997237529934 -v -0.507573125 1.5123311818578908 -0.8124999431731318 -v -0.507573125 1.5123312696367908 -0.8750001012541202 -v -0.76863375 1.9066068067551591 -0.8124995560538204 -v -0.76863375 1.9066068945340593 -0.8749997141348088 -v -0.884070625 1.68485403942177 -0.8125001003833675 -v -0.884070625 1.6848542357307812 -0.8749996429595104 -v -0.54688125 1.791169282112213 -0.8124996669499529 -v -0.54688125 1.7911693698911129 -0.8749998250309413 -v -0.662318125 1.5694166233089348 -0.8124995957746544 -v -0.662318125 1.5694167110878348 -0.8749997538556428 -v 0.09375 1.70790541301535 -1.1604382669637814 -v 0.09375 1.7002883159236861 -1.222471749929429 -v 0.09375 1.521803009073759 -1.1375872656033026 -v 0.09375 1.5141856949218733 -1.1996219795786414 -v -0.09375 1.70790541301535 -1.1604382669637814 -v -0.09375 1.7002883159236861 -1.222471749929429 -v -0.09375 1.521803009073759 -1.1375872656033026 -v -0.09375 1.5141856949218733 -1.1996219795786414 -v 0.125 1.8009556917288767 -1.1718636048488544 -v 0.125 1.7857226200251293 -1.2959314033452172 -v 0.125 1.7389215932583835 -1.1642463992270795 -v 0.125 1.7236884130245251 -1.288314813228288 -v -0.125 1.8009556917288767 -1.1718636048488544 -v -0.125 1.7857226200251293 -1.2959314033452172 -v -0.125 1.7389215932583835 -1.1642463992270795 -v -0.125 1.7236884130245251 -1.288314813228288 -v 0.125 1.7541560045019333 -1.040178202286093 -v 0.1875 1.808572390375917 -1.1098287823434045 -v 0.125 1.5060187780548926 -1.0097105022785737 -v 0.1875 1.4363684879120937 -1.0641288431972056 -v -0.125 1.7541560045019333 -1.040178202286093 -v -0.1875 1.808572390375917 -1.1098287823434045 -v -0.125 1.5060187780548926 -1.0097105022785737 -v -0.1875 1.4363684879120937 -1.0641288431972056 -v 0.125 1.6300876990308357 -1.024944406547389 -v -0.125 1.6300876990308357 -1.024944406547389 -v -0.1875 1.6224711089139066 -1.086978613547993 -v 0.1875 1.6224711089139066 -1.086978613547993 -v 0 1.6300876990308357 -1.024944406547389 -v 0 1.5060187780548926 -1.0097105022785737 -v 0 1.4363684879120937 -1.0641288431972056 -v 0 1.808572390375917 -1.1098287823434045 -v 0 1.7541560045019333 -1.040178202286093 -v 0.1875 1.8009556917288767 -1.1718636048488544 -v 0.1875 1.7857226200251293 -1.2959314033452172 -v 0.1875 1.4287514993505408 -1.1261617106580075 -v 0.1875 1.4135175950817258 -1.2502306316339507 -v 0.125 1.8009556917288767 -1.1718636048488544 -v 0.125 1.7857226200251293 -1.2959314033452172 -v 0.125 1.4287514993505408 -1.1261617106580075 -v 0.125 1.4135175950817258 -1.2502306316339507 -v -0.125 1.8009556917288767 -1.1718636048488544 -v -0.125 1.7857226200251293 -1.2959314033452172 -v -0.125 1.4287514993505408 -1.1261617106580075 -v -0.125 1.4135175950817258 -1.2502306316339507 -v -0.1875 1.8009556917288767 -1.1718636048488544 -v -0.1875 1.7857226200251293 -1.2959314033452172 -v -0.1875 1.4287514993505408 -1.1261617106580075 -v -0.1875 1.4135175950817258 -1.2502306316339507 -v 0.125 1.490785597821034 -1.1337789162797824 -v 0.125 1.4755518020823302 -1.2578472217508798 -v 0.125 1.4287514993505408 -1.1261617106580075 -v 0.125 1.4135175950817258 -1.2502306316339507 -v -0.125 1.490785597821034 -1.1337789162797824 -v -0.125 1.4755518020823302 -1.2578472217508798 -v -0.125 1.4287514993505408 -1.1261617106580075 -v -0.125 1.4135175950817258 -1.2502306316339507 -v 0.1875 1.808572390375917 -1.1098287823434045 -v 0.1875 1.8009556917288767 -1.1718636048488544 -v 0.1875 1.4363684879120937 -1.0641288431972056 -v 0.1875 1.4287514993505408 -1.1261617106580075 -v -0.1875 1.808572390375917 -1.1098287823434045 -v -0.1875 1.8009556917288767 -1.1718636048488544 -v -0.1875 1.4363684879120937 -1.0641288431972056 -v -0.1875 1.4287514993505408 -1.1261617106580075 -v -0.125 1.7277437787227952 -1.255129866179727 -v -0.125 1.4791135334757237 -1.2289986858337931 -v 0.125 1.7277437787227952 -1.255129866179727 -v 0.125 1.4791135334757237 -1.2289986858337931 -vt 0.9 0.609375 +v 0.1875 1.5542 -0.8609 +v 0.1875 1.5517 -1.1484 +v 0.1875 1.6161 -0.924 +v 0.1875 1.6142 -1.1489 +v 0.25 1.5542 -0.8609 +v 0.25 1.5522 -1.0859 +v 0.25 1.6161 -0.924 +v 0.25 1.6147 -1.0864 +v -0.1875 1.6161 -0.924 +v -0.1875 1.6142 -1.1489 +v -0.1875 1.5542 -0.8609 +v -0.1875 1.5517 -1.1484 +v -0.25 1.6161 -0.924 +v -0.25 1.6147 -1.0864 +v -0.25 1.5542 -0.8609 +v -0.25 1.5522 -1.0859 +v 0.5986 1.5392 -0.4336 +v 0.6779 1.5389 -0.4705 +v 0.5986 1.4517 -0.4328 +v 0.6779 1.4514 -0.4698 +v 0.5775 1.5388 -0.4789 +v 0.6568 1.5385 -0.5159 +v 0.5775 1.4513 -0.4781 +v 0.6568 1.451 -0.5151 +v 0.5605 1.5576 -0.4711 +v 0.6738 1.5571 -0.5239 +v 0.5605 1.4326 -0.47 +v 0.6738 1.4321 -0.5229 +v 0.3835 1.5543 -0.8506 +v 0.4951 1.5538 -0.9018 +v 0.3835 1.4293 -0.8495 +v 0.4951 1.4288 -0.9007 +v -0.3835 1.5543 -0.8506 +v -0.4942 1.5538 -0.9018 +v -0.3835 1.4293 -0.8495 +v -0.4942 1.4288 -0.9007 +v -0.374 1.5543 -0.8547 +v -0.374 1.5532 -0.9797 +v -0.374 1.4293 -0.8536 +v -0.374 1.4282 -0.9786 +v 0.3835 1.5543 -0.8506 +v 0.4951 1.5538 -0.9018 +v 0.3835 1.4293 -0.8495 +v 0.4951 1.4288 -0.9007 +v 0.375 1.5543 -0.8547 +v 0.375 1.5532 -0.9797 +v 0.375 1.4293 -0.8536 +v 0.375 1.4282 -0.9786 +v 0.375 1.5543 -0.8547 +v 0.375 1.5532 -0.9797 +v 0.375 1.4293 -0.8536 +v 0.375 1.4282 -0.9786 +v -0.375 1.5543 -0.8547 +v -0.375 1.5532 -0.9797 +v -0.375 1.4293 -0.8536 +v -0.375 1.4282 -0.9786 +v -0.5605 1.5576 -0.4711 +v -0.6738 1.5571 -0.5239 +v -0.5605 1.4326 -0.47 +v -0.6738 1.4321 -0.5229 +v -0.3835 1.5543 -0.8506 +v -0.4942 1.5538 -0.9018 +v -0.3835 1.4293 -0.8495 +v -0.4942 1.4288 -0.9007 +v -0.5986 1.5392 -0.4336 +v -0.6779 1.5389 -0.4705 +v -0.5986 1.4517 -0.4328 +v -0.6779 1.4514 -0.4698 +v -0.5775 1.5388 -0.4789 +v -0.6568 1.5385 -0.5159 +v -0.5775 1.4513 -0.4781 +v -0.6568 1.451 -0.5151 +v -0.125 0.9434 -0.9734 +v -0.125 0.9973 -1.0862 +v -0.125 0.8306 -1.0272 +v -0.125 0.8844 -1.1401 +v -0.25 0.9434 -0.9734 +v -0.25 0.9973 -1.0862 +v -0.25 0.8306 -1.0272 +v -0.25 0.8844 -1.1401 +v 0.25 0.9434 -0.9734 +v 0.25 0.9973 -1.0862 +v 0.25 0.8306 -1.0272 +v 0.25 0.8844 -1.1401 +v 0.125 0.9434 -0.9734 +v 0.125 0.9973 -1.0862 +v 0.125 0.8306 -1.0272 +v 0.125 0.8844 -1.1401 +v 0.25 1.0563 -0.9196 +v 0.25 1.1101 -1.0324 +v 0.25 0.9434 -0.9734 +v 0.25 0.9973 -1.0862 +v -0.25 1.0563 -0.9196 +v -0.25 1.1101 -1.0324 +v -0.25 0.9434 -0.9734 +v -0.25 0.9973 -1.0862 +v 0 1.1101 -1.0324 +v 0 0.9973 -1.0862 +v 0 0.9434 -0.9734 +v 0 1.0563 -0.9196 +v 0.0625 1.4283 -0.8539 +v 0.0625 1.4294 -0.9789 +v 0.0625 1.0538 -0.9213 +v 0.0625 1.0549 -1.0463 +v -0.0625 1.4283 -0.8539 +v -0.0625 1.4294 -0.9789 +v -0.0625 1.0538 -0.9213 +v -0.0625 1.0549 -1.0463 +v -0.0312 1.6434 -0.8907 +v -0.0312 1.3356 -0.8364 +v -0.0312 1.6521 -0.8414 +v -0.0312 1.3443 -0.7872 +v -0.3437 1.6434 -0.8907 +v -0.3437 1.3356 -0.8364 +v -0.3437 1.6521 -0.8414 +v -0.3437 1.3443 -0.7872 +v -0.6632 1.5571 -0.2558 +v -0.7761 1.5571 -0.3096 +v -0.6632 1.4321 -0.2558 +v -0.7761 1.4321 -0.3096 +v -0.5825 1.5571 -0.425 +v -0.6953 1.5571 -0.4788 +v -0.5825 1.4321 -0.425 +v -0.6953 1.4321 -0.4788 +v 0.2813 1.5818 -0.8798 +v 0.2813 1.3356 -0.8364 +v 0.2813 1.5905 -0.8306 +v 0.2813 1.3443 -0.7872 +v 0.0313 1.5818 -0.8798 +v 0.0313 1.3356 -0.8364 +v 0.0313 1.5905 -0.8306 +v 0.0313 1.3443 -0.7872 +v 0.5915 1.6995 -0.8137 +v 0.5951 1.6989 -0.8761 +v 0.621 1.6445 -0.8114 +v 0.6247 1.6439 -0.8738 +v 0.4615 1.5546 -0.8125 +v 0.4615 1.5546 -0.875 +v 0.5076 1.5123 -0.8125 +v 0.5076 1.5123 -0.875 +v 0.7686 1.9066 -0.8125 +v 0.7686 1.9066 -0.875 +v 0.8841 1.6849 -0.8125 +v 0.8841 1.6849 -0.875 +v 0.5469 1.7912 -0.8125 +v 0.5469 1.7912 -0.875 +v 0.6623 1.5694 -0.8125 +v 0.6623 1.5694 -0.875 +v -0.5915 1.6995 -0.8137 +v -0.5951 1.6989 -0.8761 +v -0.621 1.6445 -0.8114 +v -0.6247 1.6439 -0.8738 +v -0.4615 1.5546 -0.8125 +v -0.4615 1.5546 -0.875 +v -0.5076 1.5123 -0.8125 +v -0.5076 1.5123 -0.875 +v -0.7686 1.9066 -0.8125 +v -0.7686 1.9066 -0.875 +v -0.8841 1.6849 -0.8125 +v -0.8841 1.6849 -0.875 +v -0.5469 1.7912 -0.8125 +v -0.5469 1.7912 -0.875 +v -0.6623 1.5694 -0.8125 +v -0.6623 1.5694 -0.875 +v 0.0938 1.7079 -1.1604 +v 0.0938 1.7003 -1.2225 +v 0.0938 1.5218 -1.1376 +v 0.0938 1.5142 -1.1996 +v -0.0937 1.7079 -1.1604 +v -0.0937 1.7003 -1.2225 +v -0.0937 1.5218 -1.1376 +v -0.0937 1.5142 -1.1996 +v 0.125 1.801 -1.1719 +v 0.125 1.7857 -1.2959 +v 0.125 1.7389 -1.1642 +v 0.125 1.7237 -1.2883 +v -0.125 1.801 -1.1719 +v -0.125 1.7857 -1.2959 +v -0.125 1.7389 -1.1642 +v -0.125 1.7237 -1.2883 +v 0.125 1.7542 -1.0402 +v 0.1875 1.8086 -1.1098 +v 0.125 1.506 -1.0097 +v 0.1875 1.4364 -1.0641 +v -0.125 1.7542 -1.0402 +v -0.1875 1.8086 -1.1098 +v -0.125 1.506 -1.0097 +v -0.1875 1.4364 -1.0641 +v 0.125 1.6301 -1.0249 +v -0.125 1.6301 -1.0249 +v -0.1875 1.6225 -1.087 +v 0.1875 1.6225 -1.087 +v 0 1.6301 -1.0249 +v 0 1.506 -1.0097 +v 0 1.4364 -1.0641 +v 0 1.8086 -1.1098 +v 0 1.7542 -1.0402 +v 0.1875 1.801 -1.1719 +v 0.1875 1.7857 -1.2959 +v 0.1875 1.4288 -1.1262 +v 0.1875 1.4135 -1.2502 +v 0.125 1.801 -1.1719 +v 0.125 1.7857 -1.2959 +v 0.125 1.4288 -1.1262 +v 0.125 1.4135 -1.2502 +v -0.125 1.801 -1.1719 +v -0.125 1.7857 -1.2959 +v -0.125 1.4288 -1.1262 +v -0.125 1.4135 -1.2502 +v -0.1875 1.801 -1.1719 +v -0.1875 1.7857 -1.2959 +v -0.1875 1.4288 -1.1262 +v -0.1875 1.4135 -1.2502 +v 0.125 1.4908 -1.1338 +v 0.125 1.4756 -1.2578 +v 0.125 1.4288 -1.1262 +v 0.125 1.4135 -1.2502 +v -0.125 1.4908 -1.1338 +v -0.125 1.4756 -1.2578 +v -0.125 1.4288 -1.1262 +v -0.125 1.4135 -1.2502 +v 0.1875 1.8086 -1.1098 +v 0.1875 1.801 -1.1719 +v 0.1875 1.4364 -1.0641 +v 0.1875 1.4288 -1.1262 +v -0.1875 1.8086 -1.1098 +v -0.1875 1.801 -1.1719 +v -0.1875 1.4364 -1.0641 +v -0.1875 1.4288 -1.1262 +v -0.125 1.7277 -1.2551 +v -0.125 1.4791 -1.229 +v 0.125 1.7277 -1.2551 +v 0.125 1.4791 -1.229 +vt 0.9 0.6094 vt 0.9 0.625 -vt 0.828125 0.625 -vt 0.84375 0.609375 -vt 0.9 0.609375 -vt 0.915625 0.625 -vt 0.859375 0.625 -vt 0.859375 0.609375 -vt 0.84375 0.6 -vt 0.84375 0.671875 -vt 0.828125 0.65625 -vt 0.828125 0.6 -vt 0.859375 0.615625 -vt 0.859375 0.671875 -vt 0.84375 0.671875 -vt 0.84375 0.63125 -vt 0.921875 0.602903125 -vt 0.921875 0.625 -vt 0.90625 0.625 -vt 0.90625 0.602903125 -vt 0.850221875 0.609375 -vt 0.850221875 0.625 -vt 0.828125 0.625 -vt 0.828125 0.609375 -vt 0.9 0.609375 +vt 0.8281 0.625 +vt 0.8438 0.6094 +vt 0.9 0.6094 +vt 0.9156 0.625 +vt 0.8594 0.625 +vt 0.8594 0.6094 +vt 0.8438 0.6 +vt 0.8438 0.6719 +vt 0.8281 0.6563 +vt 0.8281 0.6 +vt 0.8594 0.6156 +vt 0.8594 0.6719 +vt 0.8438 0.6719 +vt 0.8438 0.6313 +vt 0.9219 0.6029 +vt 0.9219 0.625 +vt 0.9063 0.625 +vt 0.9063 0.6029 +vt 0.8502 0.6094 +vt 0.8502 0.625 +vt 0.8281 0.625 +vt 0.8281 0.6094 +vt 0.9 0.6094 vt 0.9 0.625 -vt 0.84375 0.625 -vt 0.828125 0.609375 -vt 0.915625 0.625 -vt 0.9 0.640625 -vt 0.859375 0.640625 -vt 0.859375 0.625 -vt 0.828125 0.615625 -vt 0.828125 0.671875 -vt 0.8125 0.65625 -vt 0.8125 0.615625 -vt 0.84375 0.615625 -vt 0.84375 0.6875 -vt 0.828125 0.6875 -vt 0.828125 0.63125 -vt 0.921875 0.602903125 -vt 0.921875 0.625 -vt 0.90625 0.625 -vt 0.90625 0.602903125 -vt 0.850221875 0.609375 -vt 0.850221875 0.625 -vt 0.828125 0.625 -vt 0.828125 0.609375 -vt 0.709375 0.525 -vt 0.709375 0.546875 -vt 0.6875 0.546875 +vt 0.8438 0.625 +vt 0.8281 0.6094 +vt 0.9156 0.625 +vt 0.9 0.6406 +vt 0.8594 0.6406 +vt 0.8594 0.625 +vt 0.8281 0.6156 +vt 0.8281 0.6719 +vt 0.8125 0.6563 +vt 0.8125 0.6156 +vt 0.8438 0.6156 +vt 0.8438 0.6875 +vt 0.8281 0.6875 +vt 0.8281 0.6313 +vt 0.9219 0.6029 +vt 0.9219 0.625 +vt 0.9063 0.625 +vt 0.9063 0.6029 +vt 0.8502 0.6094 +vt 0.8502 0.625 +vt 0.8281 0.625 +vt 0.8281 0.6094 +vt 0.7094 0.525 +vt 0.7094 0.5469 +vt 0.6875 0.5469 vt 0.6875 0.525 -vt 0.865625 0.571875 -vt 0.865625 0.59375 -vt 0.84375 0.59375 -vt 0.84375 0.571875 -vt 0.85625 0.609375 -vt 0.85625 0.625 -vt 0.84375 0.625 -vt 0.84375 0.609375 -vt 0.6375 0.578125 -vt 0.6375 0.59375 -vt 0.625 0.59375 -vt 0.625 0.578125 -vt 0.66875 0.546875 -vt 0.66875 0.5625 -vt 0.65625 0.5625 -vt 0.65625 0.546875 -vt 0.85625 0.59375 -vt 0.85625 0.609375 -vt 0.84375 0.609375 -vt 0.84375 0.59375 -vt 0.8125 0.28125 +vt 0.8656 0.5719 +vt 0.8656 0.5938 +vt 0.8438 0.5938 +vt 0.8438 0.5719 +vt 0.8563 0.6094 +vt 0.8563 0.625 +vt 0.8438 0.625 +vt 0.8438 0.6094 +vt 0.6375 0.5781 +vt 0.6375 0.5938 +vt 0.625 0.5938 +vt 0.625 0.5781 +vt 0.6688 0.5469 +vt 0.6688 0.5625 +vt 0.6563 0.5625 +vt 0.6563 0.5469 +vt 0.8563 0.5938 +vt 0.8563 0.6094 +vt 0.8438 0.6094 +vt 0.8438 0.5938 +vt 0.8125 0.2813 vt 0.8125 0.3125 -vt 0.84375 0.3125 -vt 0.84375 0.28125 -vt 0.4640625 0.25 -vt 0.4640625 0.28125 -vt 0.359375 0.28125 -vt 0.359375 0.25 -vt 0.2296875 0.25 -vt 0.2296875 0.28125 -vt 0.125 0.28125 +vt 0.8438 0.3125 +vt 0.8438 0.2813 +vt 0.4641 0.25 +vt 0.4641 0.2813 +vt 0.3594 0.2813 +vt 0.3594 0.25 +vt 0.2297 0.25 +vt 0.2297 0.2813 +vt 0.125 0.2813 vt 0.125 0.25 -vt 0.3859375 0.96875 -vt 0.3859375 1 -vt 0.28125 1 -vt 0.28125 0.96875 -vt 0.3390625 0.25 -vt 0.3390625 0.28125 -vt 0.234375 0.28125 -vt 0.234375 0.25 -vt 0.13973359375 0.97194640625 -vt 0.1755284375 0.97194640625 -vt 0.15895171875 0.9984375 -vt 0.15673625 0.99816640625 -vt 0.88984390625 0.96906984375 -vt 0.89177796875 0.96875 -vt 0.90625 1 +vt 0.3859 0.9688 +vt 0.3859 1 +vt 0.2813 1 +vt 0.2813 0.9688 +vt 0.3391 0.25 +vt 0.3391 0.2813 +vt 0.2344 0.2813 +vt 0.2344 0.25 +vt 0.1397 0.9719 +vt 0.1755 0.9719 +vt 0.159 0.9984 +vt 0.1567 0.9982 +vt 0.8898 0.9691 +vt 0.8918 0.9688 +vt 0.9063 1 vt 0.875 1 -vt 0.59598125 1 -vt 0.59375 1 -vt 0.59375 0.96875 -vt 0.59598125 0.96875 -vt 0.21875 0.96875 -vt 0.1875 0.96875 +vt 0.596 1 +vt 0.5938 1 +vt 0.5938 0.9688 +vt 0.596 0.9688 +vt 0.2188 0.9688 +vt 0.1875 0.9688 vt 0.1875 1 -vt 0.21875 1 -vt 0.14706640625 1 -vt 0.1636434375 0.96882125 -vt 0.127848125 0.96882125 -vt 0.14485109375 0.99967953125 -vt 0.890625 1 -vt 0.9050971875 0.96875 -vt 0.90703109375 0.96907109375 -vt 0.921875 1 -vt 0.65848125 0.96875 -vt 0.65848125 1 -vt 0.65625 1 -vt 0.65625 0.96875 -vt 0.28125 1 -vt 0.28125 0.96875 -vt 0.25 0.96875 +vt 0.2188 1 +vt 0.1471 1 +vt 0.1636 0.9688 +vt 0.1278 0.9688 +vt 0.1449 0.9997 +vt 0.8906 1 +vt 0.9051 0.9688 +vt 0.907 0.9691 +vt 0.9219 1 +vt 0.6585 0.9688 +vt 0.6585 1 +vt 0.6563 1 +vt 0.6563 0.9688 +vt 0.2813 1 +vt 0.2813 0.9688 +vt 0.25 0.9688 vt 0.25 1 -vt 0.40625 1 -vt 0.40625 0.96875 -vt 0.21875 0.96875 -vt 0.21875 1 -vt 0.59375 1 -vt 0.59375 0.96875 -vt 0.40625 0.96875 -vt 0.40625 1 -vt 0.375 0.96875 +vt 0.4063 1 +vt 0.4063 0.9688 +vt 0.2188 0.9688 +vt 0.2188 1 +vt 0.5938 1 +vt 0.5938 0.9688 +vt 0.4063 0.9688 +vt 0.4063 1 +vt 0.375 0.9688 vt 0.375 1 vt 0.5625 1 -vt 0.5625 0.96875 -vt 0.171875 1 -vt 0.171875 0.96875 -vt 0.359375 0.96875 -vt 0.359375 1 -vt 0.84375 0.3125 +vt 0.5625 0.9688 +vt 0.1719 1 +vt 0.1719 0.9688 +vt 0.3594 0.9688 +vt 0.3594 1 +vt 0.8438 0.3125 vt 0.8125 0.3125 -vt 0.8125 0.28125 -vt 0.84375 0.28125 -vt 0.3078125 0.96875 -vt 0.203125 0.96875 -vt 0.203125 1 -vt 0.3078125 1 -vt 0.3859375 0.96875 -vt 0.28125 0.96875 -vt 0.28125 1 -vt 0.3859375 1 -vt 0.4171875 1 +vt 0.8125 0.2813 +vt 0.8438 0.2813 +vt 0.3078 0.9688 +vt 0.2031 0.9688 +vt 0.2031 1 +vt 0.3078 1 +vt 0.3859 0.9688 +vt 0.2813 0.9688 +vt 0.2813 1 +vt 0.3859 1 +vt 0.4172 1 vt 0.3125 1 -vt 0.3125 0.96875 -vt 0.4171875 0.96875 -vt 0.4796875 0.96875 -vt 0.375 0.96875 +vt 0.3125 0.9688 +vt 0.4172 0.9688 +vt 0.4797 0.9688 +vt 0.375 0.9688 vt 0.375 1 -vt 0.4796875 1 -vt 0.6625 0.546875 -vt 0.640625 0.546875 -vt 0.640625 0.525 +vt 0.4797 1 +vt 0.6625 0.5469 +vt 0.6406 0.5469 +vt 0.6406 0.525 vt 0.6625 0.525 -vt 0.803125 0.578125 -vt 0.78125 0.578125 -vt 0.78125 0.55625 -vt 0.803125 0.55625 -vt 0.809375 0.59375 -vt 0.796875 0.59375 -vt 0.796875 0.578125 -vt 0.809375 0.578125 -vt 0.79375 0.609375 -vt 0.78125 0.609375 -vt 0.796875 0.59375 -vt 0.79375 0.59375 -vt 0.825 0.578125 -vt 0.8125 0.578125 +vt 0.8031 0.5781 +vt 0.7813 0.5781 +vt 0.7813 0.5563 +vt 0.8031 0.5563 +vt 0.8094 0.5938 +vt 0.7969 0.5938 +vt 0.7969 0.5781 +vt 0.8094 0.5781 +vt 0.7938 0.6094 +vt 0.7813 0.6094 +vt 0.7969 0.5938 +vt 0.7938 0.5938 +vt 0.825 0.5781 +vt 0.8125 0.5781 vt 0.8125 0.5625 vt 0.825 0.5625 -vt 0.809183125 0.59385734375 -vt 0.796685 0.593703125 -vt 0.797066875 0.57823234375 -vt 0.82519 0.57838671875 -vt 0.78125 0.65625 -vt 0.78125 0.6875 +vt 0.8092 0.5939 +vt 0.7967 0.5937 +vt 0.7971 0.5782 +vt 0.8252 0.5784 +vt 0.7813 0.6563 +vt 0.7813 0.6875 vt 0.75 0.6875 -vt 0.75 0.65625 -vt 0.71875 0.65625 -vt 0.71875 0.6875 +vt 0.75 0.6563 +vt 0.7188 0.6563 +vt 0.7188 0.6875 vt 0.75 0.6875 -vt 0.75 0.65625 -vt 0.84375 0.28125 -vt 0.84375 0.3125 +vt 0.75 0.6563 +vt 0.8438 0.2813 +vt 0.8438 0.3125 vt 0.8125 0.3125 -vt 0.8125 0.28125 -vt 0.765625 0.671875 -vt 0.765625 0.703125 -vt 0.734375 0.703125 -vt 0.734375 0.671875 -vt 0.75 0.65625 +vt 0.8125 0.2813 +vt 0.7656 0.6719 +vt 0.7656 0.7031 +vt 0.7344 0.7031 +vt 0.7344 0.6719 +vt 0.75 0.6563 vt 0.75 0.6875 -vt 0.71875 0.6875 -vt 0.71875 0.65625 -vt 0.75 0.65625 +vt 0.7188 0.6875 +vt 0.7188 0.6563 +vt 0.75 0.6563 vt 0.75 0.6875 -vt 0.78125 0.6875 -vt 0.78125 0.65625 -vt 0.75 0.65625 +vt 0.7813 0.6875 +vt 0.7813 0.6563 +vt 0.75 0.6563 vt 0.75 0.6875 -vt 0.71875 0.6875 -vt 0.71875 0.65625 -vt 0.8125 0.28125 +vt 0.7188 0.6875 +vt 0.7188 0.6563 +vt 0.8125 0.2813 vt 0.8125 0.3125 -vt 0.84375 0.3125 -vt 0.84375 0.28125 -vt 0.765625 0.671875 -vt 0.765625 0.703125 -vt 0.734375 0.703125 -vt 0.734375 0.671875 -vt 0.71875 0.65625 -vt 0.71875 0.6875 +vt 0.8438 0.3125 +vt 0.8438 0.2813 +vt 0.7656 0.6719 +vt 0.7656 0.7031 +vt 0.7344 0.7031 +vt 0.7344 0.6719 +vt 0.7188 0.6563 +vt 0.7188 0.6875 vt 0.75 0.6875 -vt 0.75 0.65625 -vt 0 0.671875 -vt 0 0.703125 -vt 0.03125 0.703125 -vt 0.03125 0.671875 -vt 0.03125 0.65625 -vt 0.03125 0.6875 +vt 0.75 0.6563 +vt 0 0.6719 +vt 0 0.7031 +vt 0.0313 0.7031 +vt 0.0313 0.6719 +vt 0.0313 0.6563 +vt 0.0313 0.6875 vt 0 0.6875 -vt 0 0.65625 -vt 0.234375 1 -vt 0.296875 1 -vt 0.296875 0.96875 -vt 0.234375 0.96875 -vt 0.859375 0.09375 -vt 0.796875 0.09375 -vt 0.796875 0.0625 -vt 0.859375 0.0625 +vt 0 0.6563 +vt 0.2344 1 +vt 0.2969 1 +vt 0.2969 0.9688 +vt 0.2344 0.9688 +vt 0.8594 0.0938 +vt 0.7969 0.0938 +vt 0.7969 0.0625 +vt 0.8594 0.0625 vt 0.9375 0.9375 vt 0.875 0.9375 -vt 0.875 0.96875 -vt 0.9375 0.96875 -vt 1 0.96875 -vt 0.9375 0.96875 +vt 0.875 0.9688 +vt 0.9375 0.9688 +vt 1 0.9688 +vt 0.9375 0.9688 vt 0.9375 1 vt 1 1 vt 0 1 vt 0.0625 1 -vt 0.0625 0.96875 -vt 0 0.96875 -vt 0.734375 0.0625 -vt 0.796875 0.0625 -vt 0.796875 0.09375 -vt 0.734375 0.09375 -vt 0.875 0.96875 -vt 0.9375 0.96875 +vt 0.0625 0.9688 +vt 0 0.9688 +vt 0.7344 0.0625 +vt 0.7969 0.0625 +vt 0.7969 0.0938 +vt 0.7344 0.0938 +vt 0.875 0.9688 +vt 0.9375 0.9688 vt 0.9375 0.9375 vt 0.875 0.9375 -vt 0.515625 0.96875 -vt 0.453125 0.96875 -vt 0.453125 1 -vt 0.515625 1 -vt 0.96875 0.65625 -vt 0.84375 0.65625 -vt 0.84375 0.625 -vt 0.96875 0.625 -vt 0.96875 0.65625 -vt 0.84375 0.65625 -vt 0.84375 0.625 -vt 0.96875 0.625 -vt 0.84375 0.65625 -vt 0.8125 0.65625 +vt 0.5156 0.9688 +vt 0.4531 0.9688 +vt 0.4531 1 +vt 0.5156 1 +vt 0.9688 0.6563 +vt 0.8438 0.6563 +vt 0.8438 0.625 +vt 0.9688 0.625 +vt 0.9688 0.6563 +vt 0.8438 0.6563 +vt 0.8438 0.625 +vt 0.9688 0.625 +vt 0.8438 0.6563 +vt 0.8125 0.6563 vt 0.8125 0.625 -vt 0.84375 0.625 -vt 0.859375 0.65625 -vt 0.828125 0.65625 -vt 0.828125 0.625 -vt 0.859375 0.625 -vt 0.84375 0.625 -vt 0.96875 0.625 -vt 0.96875 0.65625 -vt 0.84375 0.65625 -vt 0.84375 0.625 -vt 0.96875 0.625 -vt 0.96875 0.65625 -vt 0.84375 0.65625 -vt 0.309375 0.8125 -vt 0.296875 0.8125 -vt 0.296875 0.734375 -vt 0.309375 0.734375 +vt 0.8438 0.625 +vt 0.8594 0.6563 +vt 0.8281 0.6563 +vt 0.8281 0.625 +vt 0.8594 0.625 +vt 0.8438 0.625 +vt 0.9688 0.625 +vt 0.9688 0.6563 +vt 0.8438 0.6563 +vt 0.8438 0.625 +vt 0.9688 0.625 +vt 0.9688 0.6563 +vt 0.8438 0.6563 +vt 0.3094 0.8125 +vt 0.2969 0.8125 +vt 0.2969 0.7344 +vt 0.3094 0.7344 vt 0.3125 0.8 vt 0.3125 0.8125 -vt 0.234375 0.8125 -vt 0.234375 0.8 +vt 0.2344 0.8125 +vt 0.2344 0.8 vt 0.625 0 -vt 0.625 0.078125 -vt 0.546875 0.078125 -vt 0.546875 0 -vt 0.234375 0.734375 -vt 0.234375 0.8125 +vt 0.625 0.0781 +vt 0.5469 0.0781 +vt 0.5469 0 +vt 0.2344 0.7344 +vt 0.2344 0.8125 vt 0.3125 0.8125 -vt 0.3125 0.734375 -vt 0.3125 0.796875 +vt 0.3125 0.7344 +vt 0.3125 0.7969 vt 0.3125 0.8125 -vt 0.234375 0.8125 -vt 0.234375 0.796875 +vt 0.2344 0.8125 +vt 0.2344 0.7969 vt 0.3125 0.75 -vt 0.3125 0.734375 -vt 0.234375 0.734375 -vt 0.234375 0.75 +vt 0.3125 0.7344 +vt 0.2344 0.7344 +vt 0.2344 0.75 vt 0.25 0.8125 vt 0.1875 0.8125 vt 0.1875 0.75 @@ -558,141 +1323,141 @@ vt 0.1875 0.8125 vt 0.1875 0.75 vt 0.25 0.75 vt 0.25 0.8125 -vt 0.15625 0.8125 -vt 0.15625 0.75 +vt 0.1563 0.8125 +vt 0.1563 0.75 vt 0.25 0.75 vt 0.25 0.8125 -vt 0.15625 0.8125 -vt 0.15625 0.75 +vt 0.1563 0.8125 +vt 0.1563 0.75 vt 0.25 0.75 vt 0.25 0.8125 -vt 0.15625 0.8125 -vt 0.15625 0.75 +vt 0.1563 0.8125 +vt 0.1563 0.75 vt 0.25 0.75 vt 0.25 0.8125 -vt 0.15625 0.8125 -vt 0.15625 0.75 +vt 0.1563 0.8125 +vt 0.1563 0.75 vt 0.25 0.75 -vt 0.40625 0.1875 +vt 0.4063 0.1875 vt 0.375 0.1875 vt 0.375 0.3125 -vt 0.40625 0.3125 +vt 0.4063 0.3125 vt 0.3125 0.3125 -vt 0.28125 0.3125 -vt 0.28125 0.1875 +vt 0.2813 0.3125 +vt 0.2813 0.1875 vt 0.3125 0.1875 -vt 0.40625 0.3125 -vt 0.40625 0.1875 -vt 0.28125 0.1875 -vt 0.28125 0.3125 -vt 0.40625 0.1875 -vt 0.40625 0.3125 -vt 0.28125 0.3125 -vt 0.28125 0.1875 -vt 0.40625 0.28125 -vt 0.40625 0.3125 -vt 0.28125 0.3125 -vt 0.28125 0.28125 -vt 0.40625 0.1875 -vt 0.40625 0.21875 -vt 0.28125 0.21875 -vt 0.28125 0.1875 -vt 0.28125 0.609375 -vt 0.28125 0.625 -vt 0.265625 0.625 -vt 0.265625 0.609375 -vt 0.015625 0.984375 -vt 0.015625 1 +vt 0.4063 0.3125 +vt 0.4063 0.1875 +vt 0.2813 0.1875 +vt 0.2813 0.3125 +vt 0.4063 0.1875 +vt 0.4063 0.3125 +vt 0.2813 0.3125 +vt 0.2813 0.1875 +vt 0.4063 0.2813 +vt 0.4063 0.3125 +vt 0.2813 0.3125 +vt 0.2813 0.2813 +vt 0.4063 0.1875 +vt 0.4063 0.2188 +vt 0.2813 0.2188 +vt 0.2813 0.1875 +vt 0.2813 0.6094 +vt 0.2813 0.625 +vt 0.2656 0.625 +vt 0.2656 0.6094 +vt 0.0156 0.9844 +vt 0.0156 1 vt 0 1 -vt 0 0.984375 -vt 0.546875 0.328125 -vt 0.546875 0.34375 -vt 0.5 0.34375 -vt 0.5 0.328125 -vt 0.546875 0.328125 -vt 0.546875 0.34375 -vt 0.5 0.34375 -vt 0.5 0.328125 -vt 0.546875 0.296875 -vt 0.546875 0.3125 +vt 0 0.9844 +vt 0.5469 0.3281 +vt 0.5469 0.3438 +vt 0.5 0.3438 +vt 0.5 0.3281 +vt 0.5469 0.3281 +vt 0.5469 0.3438 +vt 0.5 0.3438 +vt 0.5 0.3281 +vt 0.5469 0.2969 +vt 0.5469 0.3125 vt 0.5 0.3125 -vt 0.5 0.296875 -vt 0.546875 0.328125 -vt 0.546875 0.34375 -vt 0.5 0.34375 -vt 0.5 0.328125 -vt 0.90625 0.421875 -vt 0.90625 0.484375 -vt 0.890625 0.484375 -vt 0.890625 0.421875 -vt 0.859375 0.421875 -vt 0.859375 0.484375 -vt 0.84375 0.484375 -vt 0.84375 0.421875 -vt 0.90625 0.46875 -vt 0.90625 0.484375 -vt 0.84375 0.484375 -vt 0.84375 0.46875 -vt 0.90625 0.421875 -vt 0.90625 0.4375 -vt 0.84375 0.4375 -vt 0.84375 0.421875 -vt 0.90625 0.421875 -vt 0.90625 0.484375 -vt 0.84375 0.484375 -vt 0.84375 0.421875 -vt 0.9375 0.71875 -vt 0.9375 0.78125 -vt 1 0.78125 -vt 1 0.71875 -vt 0.265625 0.625 -vt 0.28125 0.625 -vt 0.28125 0.609375 -vt 0.265625 0.609375 +vt 0.5 0.2969 +vt 0.5469 0.3281 +vt 0.5469 0.3438 +vt 0.5 0.3438 +vt 0.5 0.3281 +vt 0.9063 0.4219 +vt 0.9063 0.4844 +vt 0.8906 0.4844 +vt 0.8906 0.4219 +vt 0.8594 0.4219 +vt 0.8594 0.4844 +vt 0.8438 0.4844 +vt 0.8438 0.4219 +vt 0.9063 0.4688 +vt 0.9063 0.4844 +vt 0.8438 0.4844 +vt 0.8438 0.4688 +vt 0.9063 0.4219 +vt 0.9063 0.4375 +vt 0.8438 0.4375 +vt 0.8438 0.4219 +vt 0.9063 0.4219 +vt 0.9063 0.4844 +vt 0.8438 0.4844 +vt 0.8438 0.4219 +vt 0.9375 0.7188 +vt 0.9375 0.7813 +vt 1 0.7813 +vt 1 0.7188 +vt 0.2656 0.625 +vt 0.2813 0.625 +vt 0.2813 0.6094 +vt 0.2656 0.6094 vt 0 1 -vt 0.015625 1 -vt 0.015625 0.984375 -vt 0 0.984375 -vt 0.5 0.34375 -vt 0.546875 0.34375 -vt 0.546875 0.328125 -vt 0.5 0.328125 -vt 0.5 0.34375 -vt 0.546875 0.34375 -vt 0.546875 0.328125 -vt 0.5 0.328125 +vt 0.0156 1 +vt 0.0156 0.9844 +vt 0 0.9844 +vt 0.5 0.3438 +vt 0.5469 0.3438 +vt 0.5469 0.3281 +vt 0.5 0.3281 +vt 0.5 0.3438 +vt 0.5469 0.3438 +vt 0.5469 0.3281 +vt 0.5 0.3281 vt 0.5 0.3125 -vt 0.546875 0.3125 -vt 0.546875 0.296875 -vt 0.5 0.296875 -vt 0.5 0.34375 -vt 0.546875 0.34375 -vt 0.546875 0.328125 -vt 0.5 0.328125 -vt 0.890625 0.484375 -vt 0.90625 0.484375 -vt 0.90625 0.421875 -vt 0.890625 0.421875 -vt 0.84375 0.484375 -vt 0.859375 0.484375 -vt 0.859375 0.421875 -vt 0.84375 0.421875 -vt 0.84375 0.484375 -vt 0.90625 0.484375 -vt 0.90625 0.46875 -vt 0.84375 0.46875 -vt 0.84375 0.4375 -vt 0.90625 0.4375 -vt 0.90625 0.421875 -vt 0.84375 0.421875 -vt 0.84375 0.484375 -vt 0.90625 0.484375 -vt 0.90625 0.421875 -vt 0.84375 0.421875 -vt 1 0.78125 -vt 0.9375 0.78125 -vt 0.9375 0.71875 -vt 1 0.71875 +vt 0.5469 0.3125 +vt 0.5469 0.2969 +vt 0.5 0.2969 +vt 0.5 0.3438 +vt 0.5469 0.3438 +vt 0.5469 0.3281 +vt 0.5 0.3281 +vt 0.8906 0.4844 +vt 0.9063 0.4844 +vt 0.9063 0.4219 +vt 0.8906 0.4219 +vt 0.8438 0.4844 +vt 0.8594 0.4844 +vt 0.8594 0.4219 +vt 0.8438 0.4219 +vt 0.8438 0.4844 +vt 0.9063 0.4844 +vt 0.9063 0.4688 +vt 0.8438 0.4688 +vt 0.8438 0.4375 +vt 0.9063 0.4375 +vt 0.9063 0.4219 +vt 0.8438 0.4219 +vt 0.8438 0.4844 +vt 0.9063 0.4844 +vt 0.9063 0.4219 +vt 0.8438 0.4219 +vt 1 0.7813 +vt 0.9375 0.7813 +vt 0.9375 0.7188 +vt 1 0.7188 vt 0.0625 0.5625 vt 0.0625 0.75 vt 0 0.75 @@ -713,7990 +1478,3268 @@ vt 0.1875 0.5625 vt 0.1875 0.75 vt 0 0.75 vt 0 0.5625 -vt 0.921875 0.28125 -vt 0.921875 0.25 -vt 0.859375 0.25 -vt 0.859375 0.28125 -vt 0.859375 0.234375 -vt 0.859375 0.25 -vt 0.921875 0.25 -vt 0.921875 0.234375 -vt 0.90625 0.96875 -vt 0.90625 1 -vt 0.84375 1 -vt 0.84375 0.96875 -vt 0 0.609375 -vt 0 0.578125 -vt 0.015625 0.578125 -vt 0.015625 0.625 -vt 0.71875 0.71875 -vt 0.71875 0.671875 -vt 0.734375 0.671875 -vt 0.734375 0.703125 -vt 0.84375 0.984375 -vt 0.875 0.984375 +vt 0.9219 0.2813 +vt 0.9219 0.25 +vt 0.8594 0.25 +vt 0.8594 0.2813 +vt 0.8594 0.2344 +vt 0.8594 0.25 +vt 0.9219 0.25 +vt 0.9219 0.2344 +vt 0.9063 0.9688 +vt 0.9063 1 +vt 0.8438 1 +vt 0.8438 0.9688 +vt 0 0.6094 +vt 0 0.5781 +vt 0.0156 0.5781 +vt 0.0156 0.625 +vt 0.7188 0.7188 +vt 0.7188 0.6719 +vt 0.7344 0.6719 +vt 0.7344 0.7031 +vt 0.8438 0.9844 +vt 0.875 0.9844 vt 0.875 1 -vt 0.828125 1 -vt 0.4375 0.984375 -vt 0.484375 0.984375 -vt 0.484375 1 -vt 0.453125 1 -vt 0 0.96875 -vt 0.03125 0.96875 -vt 0.03125 1 +vt 0.8281 1 +vt 0.4375 0.9844 +vt 0.4844 0.9844 +vt 0.4844 1 +vt 0.4531 1 +vt 0 0.9688 +vt 0.0313 0.9688 +vt 0.0313 1 vt 0 1 vt 0 0 -vt 0.03125 0 -vt 0.03125 0.03125 -vt 0 0.03125 -vt 0.734375 0.640625 -vt 0.734375 0.671875 -vt 0.71875 0.671875 -vt 0.71875 0.625 -vt 0.015625 0.53125 -vt 0.015625 0.578125 -vt 0 0.578125 -vt 0 0.546875 -vt 0.75 0.03125 -vt 0.71875 0.03125 -vt 0.71875 0 +vt 0.0313 0 +vt 0.0313 0.0313 +vt 0 0.0313 +vt 0.7344 0.6406 +vt 0.7344 0.6719 +vt 0.7188 0.6719 +vt 0.7188 0.625 +vt 0.0156 0.5313 +vt 0.0156 0.5781 +vt 0 0.5781 +vt 0 0.5469 +vt 0.75 0.0313 +vt 0.7188 0.0313 +vt 0.7188 0 vt 0.75 0 -vt 0.515625 1 -vt 0.484375 1 -vt 0.484375 0.984375 -vt 0.53125 0.984375 -vt 0.921875 1 +vt 0.5156 1 +vt 0.4844 1 +vt 0.4844 0.9844 +vt 0.5313 0.9844 +vt 0.9219 1 vt 0.875 1 -vt 0.875 0.984375 -vt 0.90625 0.984375 +vt 0.875 0.9844 +vt 0.9063 0.9844 vt 0.75 1 -vt 0.71875 1 -vt 0.71875 0.96875 -vt 0.75 0.96875 +vt 0.7188 1 +vt 0.7188 0.9688 +vt 0.75 0.9688 vt 1 0.625 -vt 1 0.71875 -vt 0.96875 0.71875 -vt 0.96875 0.625 -vt 0.78125 0.484375 -vt 0.78125 0.578125 -vt 0.75 0.578125 -vt 0.75 0.484375 -vt 0.859375 0.96875 -vt 0.859375 1 -vt 0.84375 1 -vt 0.84375 0.96875 -vt 0.890625 0.25 -vt 0.890625 0.28125 -vt 0.875 0.28125 +vt 1 0.7188 +vt 0.9688 0.7188 +vt 0.9688 0.625 +vt 0.7813 0.4844 +vt 0.7813 0.5781 +vt 0.75 0.5781 +vt 0.75 0.4844 +vt 0.8594 0.9688 +vt 0.8594 1 +vt 0.8438 1 +vt 0.8438 0.9688 +vt 0.8906 0.25 +vt 0.8906 0.2813 +vt 0.875 0.2813 vt 0.875 0.25 vt 1 0.5 -vt 1 0.59375 -vt 0.984375 0.59375 -vt 0.984375 0.5 +vt 1 0.5938 +vt 0.9844 0.5938 +vt 0.9844 0.5 vt 1 0.625 -vt 1 0.71875 -vt 0.96875 0.71875 -vt 0.96875 0.625 -vt 0.78125 0.484375 -vt 0.78125 0.578125 -vt 0.75 0.578125 -vt 0.75 0.484375 -vt 0.859375 0.96875 -vt 0.859375 1 -vt 0.84375 1 -vt 0.84375 0.96875 -vt 0.890625 0.25 -vt 0.890625 0.28125 -vt 0.875 0.28125 +vt 1 0.7188 +vt 0.9688 0.7188 +vt 0.9688 0.625 +vt 0.7813 0.4844 +vt 0.7813 0.5781 +vt 0.75 0.5781 +vt 0.75 0.4844 +vt 0.8594 0.9688 +vt 0.8594 1 +vt 0.8438 1 +vt 0.8438 0.9688 +vt 0.8906 0.25 +vt 0.8906 0.2813 +vt 0.875 0.2813 vt 0.875 0.25 vt 1 0.5 -vt 1 0.59375 -vt 0.984375 0.59375 -vt 0.984375 0.5 -vt 0.921875 0.28125 -vt 0.921875 0.25 -vt 0.859375 0.25 -vt 0.859375 0.28125 -vt 0.90625 1 -vt 0.90625 0.96875 -vt 0.84375 0.96875 -vt 0.84375 1 -vt 0.859375 0.234375 -vt 0.859375 0.25 -vt 0.921875 0.25 -vt 0.921875 0.234375 -vt 0.78125 0.421875 -vt 0.78125 0.515625 -vt 0.765625 0.515625 -vt 0.765625 0.421875 -vt 0.984375 0.625 -vt 0.984375 0.53125 -vt 0.96875 0.53125 -vt 0.96875 0.625 -vt 0.890625 0.265625 -vt 0.890625 0.28125 -vt 0.796875 0.28125 -vt 0.796875 0.265625 -vt 0.90625 0.265625 -vt 0.90625 0.28125 -vt 0.8125 0.28125 -vt 0.8125 0.265625 -vt 0.828125 0.0625 -vt 0.921875 0.0625 -vt 0.921875 0.15625 -vt 0.828125 0.15625 +vt 1 0.5938 +vt 0.9844 0.5938 +vt 0.9844 0.5 +vt 0.9219 0.2813 +vt 0.9219 0.25 +vt 0.8594 0.25 +vt 0.8594 0.2813 +vt 0.9063 1 +vt 0.9063 0.9688 +vt 0.8438 0.9688 +vt 0.8438 1 +vt 0.8594 0.2344 +vt 0.8594 0.25 +vt 0.9219 0.25 +vt 0.9219 0.2344 +vt 0.7813 0.4219 +vt 0.7813 0.5156 +vt 0.7656 0.5156 +vt 0.7656 0.4219 +vt 0.9844 0.625 +vt 0.9844 0.5313 +vt 0.9688 0.5313 +vt 0.9688 0.625 +vt 0.8906 0.2656 +vt 0.8906 0.2813 +vt 0.7969 0.2813 +vt 0.7969 0.2656 +vt 0.9063 0.2656 +vt 0.9063 0.2813 +vt 0.8125 0.2813 +vt 0.8125 0.2656 +vt 0.8281 0.0625 +vt 0.9219 0.0625 +vt 0.9219 0.1563 +vt 0.8281 0.1563 vt 0.25 0.75 vt 0.25 1 vt 0 1 vt 0 0.75 vn -1 0 0 vn 1 0 0 -vn -0.0000029334587844594713 -0.9999619261347629 0.008726183143278972 -vn 0 0.9999619190282091 -0.00872699796159357 -vn 0 0.7132521809888339 0.7009075019677503 -vn 0.7071049676051244 -0.006168284894508382 -0.7070816905065611 -vn 1 0 0 -vn -1 0 0 -vn -0.0000020978324118310634 0.9999619190260086 -0.008726997961574392 -vn 0 -0.9999619261390653 0.0087261831433165 -vn 0 0.7132521809888339 0.7009075019677503 -vn -0.7071084546504284 -0.006168254476147231 -0.707078203594624 -vn 0.4226184765257081 0.00790680308027006 0.9062731959868059 -vn -0.4226175081689291 -0.007913191625929879 -0.9062735917963056 -vn -0.000008972775341338396 0.999961860115445 -0.008733741119862417 -vn 0.0000028906255409270947 -0.9999619739824311 0.008720698412631013 -vn -0.9063069283253697 0.0036870193009698876 0.4226040198082684 -vn 0.9063065598503196 -0.003690003402925607 -0.42260478398518575 -vn 0.42261930713512713 0.007911162079910133 0.9062727706111281 -vn 0.0000027087933019168407 0.9999619211484322 -0.008726754597171956 -vn -0.0000014652536416600657 -0.9999619149188801 0.008727468683382367 -vn -0.9063080493500458 0.0036869485059578136 0.4226016162936788 -vn 0.9040078221067215 -0.0037317890928032366 -0.4274996272747252 -vn 6.357368067885776e-7 0.9999619362426467 -0.00872502524081323 -vn -0.000007113582510285717 -0.9999618139539357 0.008739026453318368 -vn 0.3950309226513587 0.008019057171619605 0.9186328237502156 -vn -0.544104255047455 -0.007319652610111612 -0.8389856866031278 -vn -0.0000013321353867009384 0.9999619456108226 -0.008723951423734196 -vn 0.000006382493003784669 -0.9999618493887663 0.008734971451714231 -vn -0.4273093361208747 0.007891942442577488 0.9040710417375508 -vn 0.5441042550474547 -0.007319652610111584 -0.8389856866031278 -vn 0 0.9999619445335519 -0.008724075004129974 -vn 0 -0.9999619445335519 0.008724075004129863 -vn 0 0.008724075004130085 0.9999619445335519 -vn 0 -0.008724075004130085 -0.9999619445335519 -vn -0.42261930713512713 0.007911162079910161 0.9062727706111281 -vn -0.0000025716871529953373 0.999961918582874 -0.008727048610178508 -vn 0.0000014652536416932065 -0.9999619149188801 0.008727468683382367 -vn 0.9063080493500456 0.00368694850595766 0.42260161629367876 -vn -0.90314403375872 -0.0037476914009301615 -0.42932133547634393 -vn -0.4226184765257081 0.007906803080270032 0.906273195986806 -vn 0.4226175081689292 -0.007913191625929851 -0.9062735917963055 -vn 0.000008972775341338394 0.999961860115445 -0.008733741119862444 -vn -0.0000028906255409270947 -0.9999619739824311 0.008720698412631013 -vn 0.9063069283253697 0.0036870193009699015 0.4226040198082685 -vn -0.9063065598503196 -0.003690003402925579 -0.42260478398518575 -vn 1 0 0 -vn -1 0 0 -vn 0 -0.9025861906958118 -0.4305091966093455 -vn 0 -0.43051287065560717 0.9025844382659545 -vn 0 0.43051287065560717 -0.9025844382659545 -vn 1 0 0 -vn -1 0 0 -vn 0 -0.9025861906958118 -0.4305091966093455 -vn 0 -0.43051287065560717 0.9025844382659545 -vn 0 0.43051287065560717 -0.9025844382659545 -vn 1 0 0 -vn -1 0 0 -vn 0 0.9025844382659544 0.4305128706556072 -vn 0 -0.9025861906958118 -0.4305091966093455 -vn 0 -0.43050919660934517 0.9025861906958119 -vn 0 0.4305065759479856 -0.9025874406757173 -vn 0 0.4305065759479856 -0.9025874406757173 -vn 0 -0.9025861906958118 -0.4305091966093455 -vn 0 -0.43050919660934517 0.9025861906958119 -vn 0 0.9025844382659544 0.4305128706556072 -vn 1 0 0 -vn -1 0 0 -vn 0 0.9999619277199663 0.008726001980821326 -vn 0 -0.9999619277199662 -0.008726001980821798 -vn 0 -0.17717447882697723 0.9841794572395773 -vn 0 0.17717447882697718 -0.9841794572395773 -vn 1 0 0 -vn -1 0 0 -vn 0 -0.1736481776669303 -0.9848077530122081 -vn 0 0.1736481776669303 0.9848077530122081 -vn 0 0.9848077530122081 -0.1736481776669303 -vn 0 -0.9848077530122081 0.1736481776669303 -vn -0.4305103240040838 -0.0000020513142935385535 0.902585652955824 -vn 0.43051103133518565 0.0000020513135276512 -0.902585315576598 -vn -0.000002505301811856958 0.9999999999968543 -1.232519188654191e-7 -vn -0.0000019390673440426235 -0.9999999999961269 -0.000001996596796560724 -vn 0.9025857002800932 -6.046338944382113e-7 0.43051022479091966 -vn -0.9025858075602159 6.046335782466939e-7 -0.430509999872834 -vn 1 0 0 -vn -1 0 0 -vn 0 -0.1736481776669303 -0.9848077530122081 -vn 0 0.1736481776669303 0.9848077530122081 -vn 0 0.9848077530122081 -0.1736481776669303 -vn 0 -0.9848077530122081 0.1736481776669303 -vn 0.8792076452472914 0.47417508626964266 0.046388620370625654 -vn -0.6755912395792244 -0.7372763911621294 0.000006225273155913147 -vn -0.7331040009137605 0.6783325850907347 -0.049228323639531044 -vn 0.7575034614421308 -0.6508846551277842 0.0503753076653246 -vn -0.022893597209255993 0.02868479884771053 0.9993263058290255 -vn -0.0036947147243208173 -0.004023180735606314 -0.9999850814386555 -vn 0.8870112469237625 0.4617478184359204 6.485058090810459e-7 -vn -0.8870112469237624 -0.4617478184359204 -6.48505809067168e-7 -vn -0.4617501231298548 0.88701004717422 0.000001245769109231576 -vn 0.4617497815625764 -0.8870102249800456 -0.0000027860699916837377 -vn 6.119127189140642e-7 -0.000002136127818325174 0.9999999999975314 -vn 5.249253899474288e-7 -4.770879394322415e-8 -0.9999999999998611 -vn -0.8792076452472913 0.4741750862696426 0.04638862037062576 -vn 0.6755912395792244 -0.7372763911621293 0.00000622527315582988 -vn 0.7331040009137606 0.6783325850907346 -0.04922832363953099 -vn -0.7575034614421308 -0.6508846551277842 0.05037530766532479 -vn 0.022893597209256007 0.02868479884771053 0.9993263058290255 -vn 0.003694714724320871 -0.004023180735606286 -0.9999850814386555 -vn -0.8870112469237625 0.4617478184359204 6.485058092614572e-7 -vn 0.8870112469237624 -0.4617478184359204 -6.485058090394125e-7 -vn 0.4617501231298547 0.88701004717422 0.0000012457691093148426 -vn -0.46174978156257646 -0.8870102249800456 -0.0000027860699916282265 -vn -6.119127189140642e-7 -0.000002136127818325174 0.9999999999975314 -vn -5.249253899613066e-7 -4.770879394322415e-8 -0.9999999999998611 -vn 1 0 0 -vn -1 0 0 -vn 0 0.9925454875455191 -0.12187475190960517 -vn 0 -0.9925453599908991 0.12187579070732812 -vn 0 -0.12186535945944617 -0.9925466408002296 -vn 0 0.9925466726924764 -0.12186509970904041 -vn 0 -0.12186535945944618 -0.9925466408002297 -vn 0 -0.9925466408002298 0.12186535945944613 -vn 0.7071070202724187 0.08617529729785552 0.7018357927728447 -vn -0.7071070202752563 0.08617388429491826 0.7018359662648918 -vn 0 0.7880141084102544 0.6156571813488347 -vn 0 -0.6156725075299098 0.7880021341797453 -vn 0 0.12187031538678078 0.9925460322965011 -vn 0 0.12187057510974719 0.992546000406238 -vn -0.7071070202719447 0.08617548094972202 0.7018357702235017 -vn 0.7071070202768261 0.08617179292867806 0.7018362230454377 -vn 0 0.12187057510974719 0.992546000406238 -vn 0 -0.6156725075299098 0.7880021341797453 -vn 0 0.7880141084102544 0.6156571813488347 -vn 0 0.12187031538678078 0.9925460322965011 -vn 1 0 0 -vn -1 0 0 -vn 0 0.9925466726924764 -0.12186509970904041 -vn 0 -0.9925460004062379 0.12187057510974719 -vn 0 -0.12186866341105185 -0.9925462351338622 -vn 1 0 0 -vn -1 0 0 -vn 0 0.9925466726924764 -0.12186509970904041 -vn 0 -0.9925460004062379 0.12187057510974719 -vn 0 -0.12186866341105185 -0.9925462351338622 -vn 0 0.992546032296501 -0.12187031538678052 -vn 0 -0.9925460004062379 0.12187057510974719 -vn 0 -0.12186535945944624 -0.9925466408002297 -vn 1 0 0 -vn -1 0 0 -vn 0 0.9925465770164879 -0.12186587895245127 -vn 0 -0.9925455513243322 0.12187423249513274 -vn 0 -0.12187188079031909 -0.9925458400863056 -vn 0 -0.10452485731807423 -0.994522274362237 +vn 0 -1 0.01 +vn 0 1 -0.01 +vn 0 0.71 0.7 +vn 0.71 -0.01 -0.71 +vn 1 0 0 +vn -1 0 0 +vn 0 1 -0.01 +vn 0 -1 0.01 +vn 0 0.71 0.7 +vn -0.71 -0.01 -0.71 +vn 0.42 0.01 0.91 +vn -0.42 -0.01 -0.91 +vn 0 1 -0.01 +vn 0 -1 0.01 +vn -0.91 0 0.42 +vn 0.91 0 -0.42 +vn 0.42 0.01 0.91 +vn 0 1 -0.01 +vn 0 -1 0.01 +vn -0.91 0 0.42 +vn 0.9 0 -0.43 +vn 0 1 -0.01 +vn 0 -1 0.01 +vn 0.4 0.01 0.92 +vn -0.54 -0.01 -0.84 +vn 0 1 -0.01 +vn 0 -1 0.01 +vn -0.43 0.01 0.9 +vn 0.54 -0.01 -0.84 +vn 0 1 -0.01 +vn 0 -1 0.01 +vn 0 0.01 1 +vn 0 -0.01 -1 +vn -0.42 0.01 0.91 +vn 0 1 -0.01 +vn 0 -1 0.01 +vn 0.91 0 0.42 +vn -0.9 0 -0.43 +vn -0.42 0.01 0.91 +vn 0.42 -0.01 -0.91 +vn 0 1 -0.01 +vn 0 -1 0.01 +vn 0.91 0 0.42 +vn -0.91 0 -0.42 +vn 1 0 0 +vn -1 0 0 +vn 0 -0.9 -0.43 +vn 0 -0.43 0.9 +vn 0 0.43 -0.9 +vn 1 0 0 +vn -1 0 0 +vn 0 -0.9 -0.43 +vn 0 -0.43 0.9 +vn 0 0.43 -0.9 +vn 1 0 0 +vn -1 0 0 +vn 0 0.9 0.43 +vn 0 -0.9 -0.43 +vn 0 -0.43 0.9 +vn 0 0.43 -0.9 +vn 0 0.43 -0.9 +vn 0 -0.9 -0.43 +vn 0 -0.43 0.9 +vn 0 0.9 0.43 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0.01 +vn 0 -1 -0.01 +vn 0 -0.18 0.98 +vn 0 0.18 -0.98 +vn 1 0 0 +vn -1 0 0 +vn 0 -0.17 -0.98 +vn 0 0.17 0.98 +vn 0 0.98 -0.17 +vn 0 -0.98 0.17 +vn -0.43 0 0.9 +vn 0.43 0 -0.9 +vn 0 1 0 +vn 0 -1 0 +vn 0.9 0 0.43 +vn -0.9 0 -0.43 +vn 1 0 0 +vn -1 0 0 +vn 0 -0.17 -0.98 +vn 0 0.17 0.98 +vn 0 0.98 -0.17 +vn 0 -0.98 0.17 +vn 0.88 0.47 0.05 +vn -0.68 -0.74 0 +vn -0.73 0.68 -0.05 +vn 0.76 -0.65 0.05 +vn -0.02 0.03 1 +vn 0 0 -1 +vn 0.89 0.46 0 +vn -0.89 -0.46 0 +vn -0.46 0.89 0 +vn 0.46 -0.89 0 +vn 0 0 1 +vn 0 0 -1 +vn -0.88 0.47 0.05 +vn 0.68 -0.74 0 +vn 0.73 0.68 -0.05 +vn -0.76 -0.65 0.05 +vn 0.02 0.03 1 +vn 0 0 -1 +vn -0.89 0.46 0 +vn 0.89 -0.46 0 +vn 0.46 0.89 0 +vn -0.46 -0.89 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 0.99 -0.12 +vn 0 -0.99 0.12 +vn 0 -0.12 -0.99 +vn 0 0.99 -0.12 +vn 0 -0.12 -0.99 +vn 0 -0.99 0.12 +vn 0.71 0.09 0.7 +vn -0.71 0.09 0.7 +vn 0 0.79 0.62 +vn 0 -0.62 0.79 +vn 0 0.12 0.99 +vn 0 0.12 0.99 +vn -0.71 0.09 0.7 +vn 0.71 0.09 0.7 +vn 0 0.12 0.99 +vn 0 -0.62 0.79 +vn 0 0.79 0.62 +vn 0 0.12 0.99 +vn 1 0 0 +vn -1 0 0 +vn 0 0.99 -0.12 +vn 0 -0.99 0.12 +vn 0 -0.12 -0.99 +vn 1 0 0 +vn -1 0 0 +vn 0 0.99 -0.12 +vn 0 -0.99 0.12 +vn 0 -0.12 -0.99 +vn 0 0.99 -0.12 +vn 0 -0.99 0.12 +vn 0 -0.12 -0.99 +vn 1 0 0 +vn -1 0 0 +vn 0 0.99 -0.12 +vn 0 -0.99 0.12 +vn 0 -0.12 -0.99 +vn 0 -0.1 -0.99 usemtl common_steel_norivets -f 4/1/1 2/2/1 1/3/1 -f 4/1/1 1/3/1 3/4/1 -f 7/5/2 5/6/2 6/7/2 -f 7/5/2 6/7/2 8/8/2 -f 1/9/3 2/10/3 6/11/3 -f 1/9/3 6/11/3 5/12/3 -f 4/13/4 3/14/4 7/15/4 -f 4/13/4 7/15/4 8/16/4 -f 3/17/5 1/18/5 5/19/5 -f 3/17/5 5/19/5 7/20/5 -f 8/21/6 6/22/6 2/23/6 -f 8/21/6 2/23/6 4/24/6 -f 12/25/7 10/26/7 9/27/7 -f 12/25/7 9/27/7 11/28/7 -f 15/29/8 13/30/8 14/31/8 -f 15/29/8 14/31/8 16/32/8 -f 9/33/9 10/34/9 14/35/9 -f 9/33/9 14/35/9 13/36/9 -f 12/37/10 11/38/10 15/39/10 -f 12/37/10 15/39/10 16/40/10 -f 11/41/11 9/42/11 13/43/11 -f 11/41/11 13/43/11 15/44/11 -f 16/45/12 14/46/12 10/47/12 -f 16/45/12 10/47/12 12/48/12 -f 20/49/13 18/50/13 17/51/13 -f 20/49/13 17/51/13 19/52/13 -f 23/53/14 21/54/14 22/55/14 -f 23/53/14 22/55/14 24/56/14 -f 17/57/15 18/58/15 22/59/15 -f 17/57/15 22/59/15 21/60/15 -f 20/61/16 19/62/16 23/63/16 -f 20/61/16 23/63/16 24/64/16 -f 19/65/17 17/66/17 21/67/17 -f 19/65/17 21/67/17 23/68/17 -f 24/69/18 22/70/18 18/71/18 -f 24/69/18 18/71/18 20/72/18 +f 156/389/98 154/390/98 153/391/98 155/392/98 +f 159/393/99 157/394/99 158/395/99 160/396/99 +f 153/397/100 154/398/100 158/399/100 157/400/100 +f 156/401/101 155/402/101 159/403/101 160/404/101 +f 155/405/102 153/406/102 157/407/102 159/408/102 +f 160/409/103 158/410/103 154/411/103 156/412/103 +f 164/413/104 162/414/104 161/415/104 163/416/104 +f 167/417/105 165/418/105 166/419/105 168/420/105 +f 161/421/106 162/422/106 166/423/106 165/424/106 +f 164/425/107 163/426/107 167/427/107 168/428/107 +f 163/429/108 161/430/108 165/431/108 167/432/108 +f 168/433/109 166/434/109 162/435/109 164/436/109 +f 172/437/110 170/438/110 169/439/110 171/440/110 +f 175/441/111 173/442/111 174/443/111 176/444/111 +f 169/445/112 170/446/112 174/447/112 173/448/112 +f 172/449/113 171/450/113 175/451/113 176/452/113 +f 171/453/114 169/454/114 173/455/114 175/456/114 +f 176/457/115 174/458/115 170/459/115 172/460/115 usemtl common_steel_painted_norivets -f 28/73/19 26/74/19 25/75/19 -f 28/73/19 25/75/19 27/76/19 -f 25/77/20 26/78/20 30/79/20 -f 25/77/20 30/79/20 29/80/20 -f 28/81/21 27/82/21 31/83/21 -f 28/81/21 31/83/21 32/84/21 -f 27/85/22 25/86/22 29/87/22 -f 27/85/22 29/87/22 31/88/22 -f 32/89/23 30/90/23 26/91/23 -f 32/89/23 26/91/23 28/92/23 -f 38/93/24 34/94/24 33/95/24 -f 38/93/24 33/95/24 37/96/24 -f 39/97/25 35/98/25 36/99/25 -f 39/97/25 36/99/25 40/100/25 -f 37/101/26 33/102/26 35/103/26 -f 37/101/26 35/103/26 39/104/26 -f 34/105/27 38/106/27 40/107/27 -f 34/105/27 40/107/27 36/108/27 -f 41/109/28 42/110/28 46/111/28 -f 41/109/28 46/111/28 45/112/28 -f 44/113/29 43/114/29 47/115/29 -f 44/113/29 47/115/29 48/116/29 -f 43/117/30 41/118/30 45/119/30 -f 43/117/30 45/119/30 47/120/30 -f 48/121/31 46/122/31 42/123/31 -f 48/121/31 42/123/31 44/124/31 -f 49/125/32 50/126/32 54/127/32 -f 49/125/32 54/127/32 53/128/32 -f 52/129/33 51/130/33 55/131/33 -f 52/129/33 55/131/33 56/132/33 -f 51/133/34 49/134/34 53/135/34 -f 51/133/34 53/135/34 55/136/34 -f 56/137/35 54/138/35 50/139/35 -f 56/137/35 50/139/35 52/140/35 -f 57/141/36 58/142/36 60/143/36 -f 57/141/36 60/143/36 59/144/36 -f 62/145/37 58/146/37 57/147/37 -f 62/145/37 57/147/37 61/148/37 -f 63/149/38 59/150/38 60/151/38 -f 63/149/38 60/151/38 64/152/38 -f 61/153/39 57/154/39 59/155/39 -f 61/153/39 59/155/39 63/156/39 -f 58/157/40 62/158/40 64/159/40 -f 58/157/40 64/159/40 60/160/40 +f 180/461/116 178/462/116 177/463/116 179/464/116 +f 177/465/117 178/466/117 182/467/117 181/468/117 +f 180/469/118 179/470/118 183/471/118 184/472/118 +f 179/473/119 177/474/119 181/475/119 183/476/119 +f 184/477/120 182/478/120 178/479/120 180/480/120 +f 190/481/121 186/482/121 185/483/121 189/484/121 +f 191/485/122 187/486/122 188/487/122 192/488/122 +f 189/489/123 185/490/123 187/491/123 191/492/123 +f 186/493/124 190/494/124 192/495/124 188/496/124 +f 193/497/125 194/498/125 198/499/125 197/500/125 +f 196/501/126 195/502/126 199/503/126 200/504/126 +f 195/505/127 193/506/127 197/507/127 199/508/127 +f 200/509/128 198/510/128 194/511/128 196/512/128 +f 201/513/129 202/514/129 206/515/129 205/516/129 +f 204/517/130 203/518/130 207/519/130 208/520/130 +f 203/521/131 201/522/131 205/523/131 207/524/131 +f 208/525/132 206/526/132 202/527/132 204/528/132 +f 209/529/133 210/530/133 212/531/133 211/532/133 +f 214/533/134 210/534/134 209/535/134 213/536/134 +f 215/537/135 211/538/135 212/539/135 216/540/135 +f 213/541/136 209/542/136 211/543/136 215/544/136 +f 210/545/137 214/546/137 216/547/137 212/548/137 usemtl common_steel_norivets -f 65/161/41 66/162/41 68/163/41 -f 65/161/41 68/163/41 67/164/41 -f 70/165/42 69/166/42 71/167/42 -f 70/165/42 71/167/42 72/168/42 -f 70/169/43 66/170/43 65/171/43 -f 70/169/43 65/171/43 69/172/43 -f 71/173/44 67/174/44 68/175/44 -f 71/173/44 68/175/44 72/176/44 -f 69/177/45 65/178/45 67/179/45 -f 69/177/45 67/179/45 71/180/45 -f 66/181/46 70/182/46 72/183/46 -f 66/181/46 72/183/46 68/184/46 +f 217/549/138 218/550/138 220/551/138 219/552/138 +f 222/553/139 221/554/139 223/555/139 224/556/139 +f 222/557/140 218/558/140 217/559/140 221/560/140 +f 223/561/141 219/562/141 220/563/141 224/564/141 +f 221/565/142 217/566/142 219/567/142 223/568/142 +f 218/569/143 222/570/143 224/571/143 220/572/143 usemtl common_steel_painted_norivets -f 76/185/47 74/186/47 73/187/47 -f 76/185/47 73/187/47 75/188/47 -f 79/189/48 77/190/48 78/191/48 -f 79/189/48 78/191/48 80/192/48 -f 76/193/49 75/194/49 79/195/49 -f 76/193/49 79/195/49 80/196/49 -f 75/197/50 73/198/50 77/199/50 -f 75/197/50 77/199/50 79/200/50 -f 80/201/51 78/202/51 74/203/51 -f 80/201/51 74/203/51 76/204/51 -f 84/205/52 82/206/52 81/207/52 -f 84/205/52 81/207/52 83/208/52 -f 87/209/53 85/210/53 86/211/53 -f 87/209/53 86/211/53 88/212/53 -f 84/213/54 83/214/54 87/215/54 -f 84/213/54 87/215/54 88/216/54 -f 83/217/55 81/218/55 85/219/55 -f 83/217/55 85/219/55 87/220/55 -f 88/221/56 86/222/56 82/223/56 -f 88/221/56 82/223/56 84/224/56 -f 92/225/57 90/226/57 89/227/57 -f 92/225/57 89/227/57 91/228/57 -f 95/229/58 93/230/58 94/231/58 -f 95/229/58 94/231/58 96/232/58 -f 90/233/59 97/234/59 100/235/59 -f 90/233/59 100/235/59 89/236/59 -f 91/237/60 99/238/60 98/239/60 -f 91/237/60 98/239/60 92/240/60 -f 89/241/61 100/242/61 99/243/61 -f 89/241/61 99/243/61 91/244/61 -f 92/245/62 98/246/62 97/247/62 -f 92/245/62 97/247/62 90/248/62 -f 94/249/63 97/250/63 98/251/63 -f 94/249/63 98/251/63 96/252/63 -f 96/253/64 98/254/64 99/255/64 -f 96/253/64 99/255/64 95/256/64 -f 95/257/65 99/258/65 100/259/65 -f 95/257/65 100/259/65 93/260/65 -f 93/261/66 100/262/66 97/263/66 -f 93/261/66 97/263/66 94/264/66 +f 228/573/144 226/574/144 225/575/144 227/576/144 +f 231/577/145 229/578/145 230/579/145 232/580/145 +f 228/581/146 227/582/146 231/583/146 232/584/146 +f 227/585/147 225/586/147 229/587/147 231/588/147 +f 232/589/148 230/590/148 226/591/148 228/592/148 +f 236/593/149 234/594/149 233/595/149 235/596/149 +f 239/597/150 237/598/150 238/599/150 240/600/150 +f 236/601/151 235/602/151 239/603/151 240/604/151 +f 235/605/152 233/606/152 237/607/152 239/608/152 +f 240/609/153 238/610/153 234/611/153 236/612/153 +f 244/613/154 242/614/154 241/615/154 243/616/154 +f 247/617/155 245/618/155 246/619/155 248/620/155 +f 242/621/156 249/622/156 252/623/156 241/624/156 +f 243/625/157 251/626/157 250/627/157 244/628/157 +f 241/629/158 252/630/158 251/631/158 243/632/158 +f 244/633/159 250/634/159 249/635/159 242/636/159 +f 246/637/160 249/638/160 250/639/160 248/640/160 +f 248/641/161 250/642/161 251/643/161 247/644/161 +f 247/645/162 251/646/162 252/647/162 245/648/162 +f 245/649/163 252/650/163 249/651/163 246/652/163 usemtl common_steel_norivets -f 104/265/67 102/266/67 101/267/67 -f 104/265/67 101/267/67 103/268/67 -f 107/269/68 105/270/68 106/271/68 -f 107/269/68 106/271/68 108/272/68 -f 101/273/69 102/274/69 106/275/69 -f 101/273/69 106/275/69 105/276/69 -f 104/277/70 103/278/70 107/279/70 -f 104/277/70 107/279/70 108/280/70 -f 103/281/71 101/282/71 105/283/71 -f 103/281/71 105/283/71 107/284/71 -f 108/285/72 106/286/72 102/287/72 -f 108/285/72 102/287/72 104/288/72 +f 256/653/164 254/654/164 253/655/164 255/656/164 +f 259/657/165 257/658/165 258/659/165 260/660/165 +f 253/661/166 254/662/166 258/663/166 257/664/166 +f 256/665/167 255/666/167 259/667/167 260/668/167 +f 255/669/168 253/670/168 257/671/168 259/672/168 +f 260/673/169 258/674/169 254/675/169 256/676/169 usemtl common_thingies -f 112/289/73 110/290/73 109/291/73 -f 112/289/73 109/291/73 111/292/73 -f 115/293/74 113/294/74 114/295/74 -f 115/293/74 114/295/74 116/296/74 -f 109/297/75 110/298/75 114/299/75 -f 109/297/75 114/299/75 113/300/75 -f 112/301/76 111/302/76 115/303/76 -f 112/301/76 115/303/76 116/304/76 -f 111/305/77 109/306/77 113/307/77 -f 111/305/77 113/307/77 115/308/77 -f 116/309/78 114/310/78 110/311/78 -f 116/309/78 110/311/78 112/312/78 +f 264/677/170 262/678/170 261/679/170 263/680/170 +f 267/681/171 265/682/171 266/683/171 268/684/171 +f 261/685/172 262/686/172 266/687/172 265/688/172 +f 264/689/173 263/690/173 267/691/173 268/692/173 +f 263/693/174 261/694/174 265/695/174 267/696/174 +f 268/697/175 266/698/175 262/699/175 264/700/175 usemtl tracked_motorbike -f 117/313/79 118/314/79 120/315/79 -f 117/313/79 120/315/79 119/316/79 -f 122/317/80 121/318/80 123/319/80 -f 122/317/80 123/319/80 124/320/80 -f 122/321/81 118/322/81 117/323/81 -f 122/321/81 117/323/81 121/324/81 -f 123/325/82 119/326/82 120/327/82 -f 123/325/82 120/327/82 124/328/82 -f 121/329/83 117/330/83 119/331/83 -f 121/329/83 119/331/83 123/332/83 -f 118/333/84 122/334/84 124/335/84 -f 118/333/84 124/335/84 120/336/84 -f 128/337/85 126/338/85 125/339/85 -f 128/337/85 125/339/85 127/340/85 -f 131/341/86 129/342/86 130/343/86 -f 131/341/86 130/343/86 132/344/86 -f 125/345/87 126/346/87 130/347/87 -f 125/345/87 130/347/87 129/348/87 -f 128/349/88 127/350/88 131/351/88 -f 128/349/88 131/351/88 132/352/88 -f 127/353/89 125/354/89 129/355/89 -f 127/353/89 129/355/89 131/356/89 -f 132/357/90 130/358/90 126/359/90 -f 132/357/90 126/359/90 128/360/90 +f 269/701/176 270/702/176 272/703/176 271/704/176 +f 274/705/177 273/706/177 275/707/177 276/708/177 +f 274/709/178 270/710/178 269/711/178 273/712/178 +f 275/713/179 271/714/179 272/715/179 276/716/179 +f 273/717/180 269/718/180 271/719/180 275/720/180 +f 270/721/181 274/722/181 276/723/181 272/724/181 +f 280/725/182 278/726/182 277/727/182 279/728/182 +f 283/729/183 281/730/183 282/731/183 284/732/183 +f 277/733/184 278/734/184 282/735/184 281/736/184 +f 280/737/185 279/738/185 283/739/185 284/740/185 +f 279/741/186 277/742/186 281/743/186 283/744/186 +f 284/745/187 282/746/187 278/747/187 280/748/187 usemtl common_steel_norivets -f 136/361/91 134/362/91 133/363/91 -f 136/361/91 133/363/91 135/364/91 -f 139/365/92 137/366/92 138/367/92 -f 139/365/92 138/367/92 140/368/92 -f 133/369/93 134/370/93 138/371/93 -f 133/369/93 138/371/93 137/372/93 -f 136/373/94 135/374/94 139/375/94 -f 136/373/94 139/375/94 140/376/94 -f 135/377/95 133/378/95 137/379/95 -f 135/377/95 137/379/95 139/380/95 -f 140/381/96 138/382/96 134/383/96 -f 140/381/96 134/383/96 136/384/96 +f 288/749/188 286/750/188 285/751/188 287/752/188 +f 291/753/189 289/754/189 290/755/189 292/756/189 +f 285/757/190 286/758/190 290/759/190 289/760/190 +f 288/761/191 287/762/191 291/763/191 292/764/191 +f 287/765/192 285/766/192 289/767/192 291/768/192 +f 292/769/193 290/770/193 286/771/193 288/772/193 usemtl common_thingies -f 144/385/97 142/386/97 141/387/97 -f 144/385/97 141/387/97 143/388/97 -f 147/389/98 145/390/98 146/391/98 -f 147/389/98 146/391/98 148/392/98 -f 141/393/99 142/394/99 146/395/99 -f 141/393/99 146/395/99 145/396/99 -f 144/397/100 143/398/100 147/399/100 -f 144/397/100 147/399/100 148/400/100 -f 143/401/101 141/402/101 145/403/101 -f 143/401/101 145/403/101 147/404/101 -f 148/405/102 146/406/102 142/407/102 -f 148/405/102 142/407/102 144/408/102 +f 296/773/194 294/774/194 293/775/194 295/776/194 +f 299/777/195 297/778/195 298/779/195 300/780/195 +f 293/781/196 294/782/196 298/783/196 297/784/196 +f 296/785/197 295/786/197 299/787/197 300/788/197 +f 295/789/198 293/790/198 297/791/198 299/792/198 +f 300/793/199 298/794/199 294/795/199 296/796/199 usemtl common_steel_norivets -f 149/409/103 150/410/103 152/411/103 -f 149/409/103 152/411/103 151/412/103 -f 154/413/104 153/414/104 155/415/104 -f 154/413/104 155/415/104 156/416/104 -f 154/417/105 150/418/105 149/419/105 -f 154/417/105 149/419/105 153/420/105 -f 155/421/106 151/422/106 152/423/106 -f 155/421/106 152/423/106 156/424/106 -f 153/425/107 149/426/107 151/427/107 -f 153/425/107 151/427/107 155/428/107 -f 150/429/108 154/430/108 156/431/108 -f 150/429/108 156/431/108 152/432/108 +f 301/797/200 302/798/200 304/799/200 303/800/200 +f 306/801/201 305/802/201 307/803/201 308/804/201 +f 306/805/202 302/806/202 301/807/202 305/808/202 +f 307/809/203 303/810/203 304/811/203 308/812/203 +f 305/813/204 301/814/204 303/815/204 307/816/204 +f 302/817/205 306/818/205 308/819/205 304/820/205 usemtl common_thingies -f 157/433/109 158/434/109 160/435/109 -f 157/433/109 160/435/109 159/436/109 -f 162/437/110 161/438/110 163/439/110 -f 162/437/110 163/439/110 164/440/110 -f 162/441/111 158/442/111 157/443/111 -f 162/441/111 157/443/111 161/444/111 -f 163/445/112 159/446/112 160/447/112 -f 163/445/112 160/447/112 164/448/112 -f 161/449/113 157/450/113 159/451/113 -f 161/449/113 159/451/113 163/452/113 -f 158/453/114 162/454/114 164/455/114 -f 158/453/114 164/455/114 160/456/114 +f 309/821/206 310/822/206 312/823/206 311/824/206 +f 314/825/207 313/826/207 315/827/207 316/828/207 +f 314/829/208 310/830/208 309/831/208 313/832/208 +f 315/833/209 311/834/209 312/835/209 316/836/209 +f 313/837/210 309/838/210 311/839/210 315/840/210 +f 310/841/211 314/842/211 316/843/211 312/844/211 usemtl vehicle_lights -f 168/457/115 166/458/115 165/459/115 -f 168/457/115 165/459/115 167/460/115 -f 171/461/116 169/462/116 170/463/116 -f 171/461/116 170/463/116 172/464/116 -f 165/465/117 166/466/117 170/467/117 -f 165/465/117 170/467/117 169/468/117 -f 168/469/118 167/470/118 171/471/118 -f 168/469/118 171/471/118 172/472/118 -f 172/473/119 170/474/119 166/475/119 -f 172/473/119 166/475/119 168/476/119 +f 320/845/212 318/846/212 317/847/212 319/848/212 +f 323/849/213 321/850/213 322/851/213 324/852/213 +f 317/853/214 318/854/214 322/855/214 321/856/214 +f 320/857/215 319/858/215 323/859/215 324/860/215 +f 324/861/216 322/862/216 318/863/216 320/864/216 usemtl common_steel_painted_norivets -f 173/477/120 174/478/120 178/479/120 -f 173/477/120 178/479/120 177/480/120 -f 180/481/121 178/482/121 174/483/121 -f 180/481/121 174/483/121 176/484/121 -f 176/485/122 175/486/122 179/487/122 -f 176/485/122 179/487/122 180/488/122 -f 181/489/123 189/490/123 192/491/123 -f 181/489/123 192/491/123 182/492/123 -f 186/493/124 191/494/124 190/495/124 -f 186/493/124 190/495/124 185/496/124 -f 185/497/125 197/498/125 196/499/125 -f 185/497/125 196/499/125 186/500/125 -f 188/501/126 195/502/126 194/503/126 -f 188/501/126 194/503/126 187/504/126 -f 190/505/127 193/506/127 197/507/127 -f 190/505/127 197/507/127 185/508/127 -f 187/509/128 194/510/128 193/511/128 -f 187/509/128 193/511/128 190/512/128 -f 187/513/129 190/514/129 191/515/129 -f 187/513/129 191/515/129 188/516/129 -f 184/517/130 192/518/130 189/519/130 -f 184/517/130 189/519/130 183/520/130 -f 189/521/131 193/522/131 194/523/131 -f 189/521/131 194/523/131 183/524/131 -f 183/525/132 194/526/132 195/527/132 -f 183/525/132 195/527/132 184/528/132 -f 182/529/133 196/530/133 197/531/133 -f 182/529/133 197/531/133 181/532/133 -f 181/533/134 197/534/134 193/535/134 -f 181/533/134 193/535/134 189/536/134 -f 201/537/135 199/538/135 198/539/135 -f 201/537/135 198/539/135 200/540/135 -f 204/541/136 202/542/136 203/543/136 -f 204/541/136 203/543/136 205/544/136 -f 198/545/137 199/546/137 203/547/137 -f 198/545/137 203/547/137 202/548/137 -f 201/549/138 200/550/138 204/551/138 -f 201/549/138 204/551/138 205/552/138 -f 205/553/139 203/554/139 199/555/139 -f 205/553/139 199/555/139 201/556/139 -f 209/557/140 207/558/140 206/559/140 -f 209/557/140 206/559/140 208/560/140 -f 212/561/141 210/562/141 211/563/141 -f 212/561/141 211/563/141 213/564/141 -f 206/565/142 207/566/142 211/567/142 -f 206/565/142 211/567/142 210/568/142 -f 209/569/143 208/570/143 212/571/143 -f 209/569/143 212/571/143 213/572/143 -f 213/573/144 211/574/144 207/575/144 -f 213/573/144 207/575/144 209/576/144 -f 214/577/145 215/578/145 219/579/145 -f 214/577/145 219/579/145 218/580/145 -f 217/581/146 216/582/146 220/583/146 -f 217/581/146 220/583/146 221/584/146 -f 221/585/147 219/586/147 215/587/147 -f 221/585/147 215/587/147 217/588/147 -f 225/589/148 223/590/148 222/591/148 -f 225/589/148 222/591/148 224/592/148 -f 228/593/149 226/594/149 227/595/149 -f 228/593/149 227/595/149 229/596/149 -f 222/597/150 223/598/150 227/599/150 -f 222/597/150 227/599/150 226/600/150 -f 225/601/151 224/602/151 228/603/151 -f 225/601/151 228/603/151 229/604/151 -f 227/605/152 223/606/152 225/607/152 -f 227/605/152 225/607/152 229/608/152 +f 325/865/217 326/866/217 330/867/217 329/868/217 +f 332/869/218 330/870/218 326/871/218 328/872/218 +f 328/873/219 327/874/219 331/875/219 332/876/219 +f 333/877/220 341/878/220 344/879/220 334/880/220 +f 338/881/221 343/882/221 342/883/221 337/884/221 +f 337/885/222 349/886/222 348/887/222 338/888/222 +f 340/889/223 347/890/223 346/891/223 339/892/223 +f 342/893/224 345/894/224 349/895/224 337/896/224 +f 339/897/225 346/898/225 345/899/225 342/900/225 +f 339/901/226 342/902/226 343/903/226 340/904/226 +f 336/905/227 344/906/227 341/907/227 335/908/227 +f 341/909/228 345/910/228 346/911/228 335/912/228 +f 335/913/229 346/914/229 347/915/229 336/916/229 +f 334/917/230 348/918/230 349/919/230 333/920/230 +f 333/921/231 349/922/231 345/923/231 341/924/231 +f 353/925/232 351/926/232 350/927/232 352/928/232 +f 356/929/233 354/930/233 355/931/233 357/932/233 +f 350/933/234 351/934/234 355/935/234 354/936/234 +f 353/937/235 352/938/235 356/939/235 357/940/235 +f 357/941/236 355/942/236 351/943/236 353/944/236 +f 361/945/237 359/946/237 358/947/237 360/948/237 +f 364/949/238 362/950/238 363/951/238 365/952/238 +f 358/953/239 359/954/239 363/955/239 362/956/239 +f 361/957/240 360/958/240 364/959/240 365/960/240 +f 365/961/241 363/962/241 359/963/241 361/964/241 +f 366/965/242 367/966/242 371/967/242 370/968/242 +f 369/969/243 368/970/243 372/971/243 373/972/243 +f 373/973/244 371/974/244 367/975/244 369/976/244 +f 377/977/245 375/978/245 374/979/245 376/980/245 +f 380/981/246 378/982/246 379/983/246 381/984/246 +f 374/985/247 375/986/247 379/987/247 378/988/247 +f 377/989/248 376/990/248 380/991/248 381/992/248 +f 379/993/249 375/994/249 377/995/249 381/996/249 usemtl vehicle_lights -f 231/609/153 230/610/153 232/611/153 -f 231/609/153 232/611/153 233/612/153 -o wing -v 0.125 0.86875037714277 -0.7499996542708769 -v 0.13125 0.8687499371957245 -0.8749998619027427 -v 0.125 0.6187502725447619 -0.6874999558355995 -v 0.13125 0.6187499411278273 -0.8124995479626198 -v -0.125 0.86875037714277 -0.7499996542708769 -v -0.13125 0.8687499371957245 -0.8749998619027427 -v -0.125 0.6187502725447619 -0.6874999558355995 -v -0.13125 0.6187499411278273 -0.8124995479626198 -v 0 0.86875037714277 -0.7499996542708769 -v 0 0.6187502725447619 -0.6874999558355995 -v 0 0.6187499411278273 -0.8124995479626198 -v 0 0.8687499371957245 -0.8749998619027427 -v 0.125 0.86875037714277 -0.7499996542708769 -v 0.125 1.056249883712744 -0.93749964811692 -v 0.13125 0.8687499371957245 -0.8749998619027427 -v 0.13125 0.9312501830556129 -0.9374999322048312 -v -0.125 0.86875037714277 -0.7499996542708769 -v -0.125 1.056249883712744 -0.93749964811692 -v -0.13125 0.8687499371957245 -0.8749998619027427 -v -0.13125 0.9312501830556129 -0.9374999322048312 -v 0 1.056249883712744 -0.93749964811692 -v 0 0.86875037714277 -0.7499996542708769 -v 0 0.8687499371957245 -0.8749998619027427 -v 0 0.9312501830556129 -0.9374999322048312 -v 0.125 1.056249883712744 -0.93749964811692 -v 0.125 1.0562501874993209 -1.4374995732250253 -v 0.13125 0.9312501830556129 -0.9374999322048312 -v 0.13125 0.9312498713373439 -1.4374997487828254 -v -0.125 1.056249883712744 -0.93749964811692 -v -0.125 1.0562501874993209 -1.4374995732250253 -v -0.13125 0.9312501830556129 -0.9374999322048312 -v -0.13125 0.9312498713373439 -1.4374997487828254 -v 0 1.0562501874993209 -1.4374995732250253 -v 0 1.056249883712744 -0.93749964811692 -v 0 0.9312501830556129 -0.9374999322048312 -v 0 0.9312498713373439 -1.4374997487828254 -v 0.125 1.0562501874993209 -1.4374995732250253 -v 0.125 0.8062502989089892 -1.8124996418168648 -v 0.13125 0.9312498713373439 -1.4374997487828254 -v 0.13125 0.6812499827470123 -1.8124998173746647 -v -0.125 1.0562501874993209 -1.4374995732250253 -v -0.125 0.8062502989089892 -1.8124996418168648 -v -0.13125 0.9312498713373439 -1.4374997487828254 -v -0.13125 0.6812499827470123 -1.8124998173746647 -v 0 0.8062502989089892 -1.8124996418168648 -v 0 1.0562501874993209 -1.4374995732250253 -v 0 0.9312498713373439 -1.4374997487828254 -v 0 0.6812499827470123 -1.8124998173746647 -vt 0.71875 0.640625 -vt 0.71875 0.703125 -vt 0.75 0.703125 -vt 0.75 0.640625 -vt 0.7496175 0.61457296875 -vt 0.7496175 0.55014875 -vt 0.71926046875 0.54257 -vt 0.71926046875 0.6069942187499999 -vt 0.125 0.96875 -vt 0.15625 0.96875 -vt 0.15625 1 -vt 0.125 1 -vt 0.75 0.25 -vt 0.78125 0.25 -vt 0.78125 0.3125 -vt 0.75 0.3125 -vt 0.75 0.3125 -vt 0.71875 0.3125 -vt 0.71875 0.25 -vt 0.75 0.25 -vt 0.75 0.3125 -vt 0.71875 0.3125 -vt 0.71875 0.25 -vt 0.75 0.25 -vt 0.1875 1 -vt 0.15625 1 -vt 0.15625 0.96875 -vt 0.1875 0.96875 -vt 0.75 0.25 -vt 0.78125 0.25 -vt 0.78125 0.3125 -vt 0.75 0.3125 -vt 0.556026875 0.27671953125000004 -vt 0.578125 0.25456765625 -vt 0.5118334375 0.25456765625 -vt 0.53393 0.27671999999999997 -vt 0.35022140625 0.27656250000000004 -vt 0.328125 0.25441015624999996 -vt 0.3944165625 0.25441015624999996 -vt 0.3723184375 0.27656203125 -vt 0.75 0.796875 -vt 0.78125 0.796875 -vt 0.78125 0.859375 -vt 0.75 0.859375 -vt 1 0.59375 -vt 0.96875 0.59375 -vt 0.96875 0.578125 -vt 1 0.578125 -vt 1 0.90625 -vt 0.96875 0.90625 -vt 0.96875 0.84375 -vt 1 0.84375 -vt 0.75 0.734375 -vt 0.78125 0.734375 -vt 0.78125 0.75 -vt 0.75 0.75 -vt 0.51372875 0.28125 -vt 0.51372875 0.25 -vt 0.38872875 0.25 -vt 0.38872875 0.28125 -vt 0.46875 0.28125 -vt 0.46875 0.25 -vt 0.34375 0.25 -vt 0.34375 0.28125 -vt 1 0.5625 -vt 0.96875 0.5625 -vt 0.96875 0.6875 -vt 1 0.6875 -vt 0.75 0.734375 -vt 0.78125 0.734375 -vt 0.78125 0.859375 -vt 0.75 0.859375 -vt 1 0.875 -vt 0.96875 0.875 -vt 0.96875 0.75 -vt 1 0.75 -vt 1 0.875 -vt 0.96875 0.875 -vt 0.96875 0.75 -vt 1 0.75 -vt 0.26810921875 0.27862296875000003 -vt 0.2507746875 0.25257343750000005 -vt 0.13810109375 0.25257343750000005 -vt 0.155435 0.27862156250000003 -vt 0.30910515625 0.27926937500000004 -vt 0.29177125 0.25322124999999995 -vt 0.40444484375 0.25322124999999995 -vt 0.421779375 0.2792709375 -vt 0.75 0.359375 -vt 0.71875 0.359375 -vt 0.71875 0.25 -vt 0.75 0.25 -vt 0 0.25 -vt 0.03125 0.25 -vt 0.03125 0.359375 -vt 0 0.359375 -vt 0.328125 1 -vt 0.296875 1 -vt 0.296875 0.96875 -vt 0.328125 0.96875 -vt 0.75 0.25 -vt 0.78125 0.25 -vt 0.78125 0.359375 -vt 0.75 0.359375 -vt 1 0.359375 -vt 0.96875 0.359375 -vt 0.96875 0.25 -vt 1 0.25 -vt 0.265625 0.96875 -vt 0.296875 0.96875 -vt 0.296875 1 -vt 0.265625 1 -vn 0.9986745209692505 0.01248346269336394 0.04993359916951139 -vn -0.9986745225694315 0.012483334356717316 0.049933599249972004 -vn 0 -0.9999999999964853 0.0000026513441276077025 -vn 0 0.24253442812523116 0.9701427993723228 -vn 0 -0.24253677523002634 -0.9701422125961843 -vn 0 0.24253442812523116 0.9701427993723228 -vn 0 -0.9999999999964854 0.0000026513441276077025 -vn 0 -0.24253677523002634 -0.9701422125961843 -vn 0.9975093419505361 0.04987547318460728 0.049875343567938935 -vn -0.9975093553690212 0.04987533899924412 0.04987520938292449 -vn 0 0.707107700003742 0.7071058623681591 -vn 0 -0.7071057880834749 -0.7071077742882254 -vn 0 0.707107700003742 0.7071058623681591 -vn 0 -0.7071057880834749 -0.7071077742882254 -vn 0.9987523451774238 0.04993749095214172 3.034068338583773e-8 -vn -0.9987523329133497 0.049937736233640354 3.0340832412462104e-8 -vn 0 0.9999999999998156 6.075732441879201e-7 -vn 0 -0.9999999999998057 6.234367667945496e-7 -vn 0 0.9999999999998156 6.075732441879201e-7 -vn 0 -0.9999999999998057 6.234367667945496e-7 -vn 0.9981993262377148 0.04990988680602817 -0.03327323695677488 -vn -0.998199326237715 0.0499098868060282 -0.033273236956774886 -vn 0 0.8320504552564002 -0.5546999548473186 -vn 0 -0.8320504552564002 0.5546999548473185 -vn 0 0.0000014044588474149135 -0.9999999999990139 -vn 0 0.8320504552564002 -0.5546999548473186 -vn 0 -0.8320504552564002 0.5546999548473185 -vn 0 0.0000014044588474426691 -0.9999999999990138 -usemtl common_steel_painted_norivets -f 237/613/154 235/614/154 234/615/154 -f 237/613/154 234/615/154 236/616/154 -f 240/617/155 238/618/155 239/619/155 -f 240/617/155 239/619/155 241/620/155 -f 241/621/156 244/622/156 243/623/156 -f 241/621/156 243/623/156 240/624/156 -f 240/625/157 243/626/157 242/627/157 -f 240/625/157 242/627/157 238/628/157 -usemtl common_steel_norivets -f 239/629/158 245/630/158 244/631/158 -f 239/629/158 244/631/158 241/632/158 -usemtl common_steel_painted_norivets -f 234/633/159 242/634/159 243/635/159 -f 234/633/159 243/635/159 236/636/159 -f 236/637/160 243/638/160 244/639/160 -f 236/637/160 244/639/160 237/640/160 -usemtl common_steel_norivets -f 237/641/161 244/642/161 245/643/161 -f 237/641/161 245/643/161 235/644/161 -usemtl common_steel_painted_norivets -f 249/645/162 247/646/162 246/647/162 -f 249/645/162 246/647/162 248/648/162 -f 252/649/163 250/650/163 251/651/163 -f 252/649/163 251/651/163 253/652/163 -f 250/653/164 255/654/164 254/655/164 -f 250/653/164 254/655/164 251/656/164 -usemtl common_steel_norivets -f 253/657/165 257/658/165 256/659/165 -f 253/657/165 256/659/165 252/660/165 -usemtl common_steel_painted_norivets -f 247/661/166 254/662/166 255/663/166 -f 247/661/166 255/663/166 246/664/166 -usemtl common_steel_norivets -f 248/665/167 256/666/167 257/667/167 -f 248/665/167 257/667/167 249/668/167 -usemtl common_steel_painted_norivets -f 261/669/168 259/670/168 258/671/168 -f 261/669/168 258/671/168 260/672/168 -f 264/673/169 262/674/169 263/675/169 -f 264/673/169 263/675/169 265/676/169 -f 262/677/170 267/678/170 266/679/170 -f 262/677/170 266/679/170 263/680/170 -usemtl common_steel_norivets -f 265/681/171 269/682/171 268/683/171 -f 265/681/171 268/683/171 264/684/171 -usemtl common_steel_painted_norivets -f 259/685/172 266/686/172 267/687/172 -f 259/685/172 267/687/172 258/688/172 -usemtl common_steel_norivets -f 260/689/173 268/690/173 269/691/173 -f 260/689/173 269/691/173 261/692/173 -usemtl common_steel_painted_norivets -f 273/693/174 271/694/174 270/695/174 -f 273/693/174 270/695/174 272/696/174 -f 276/697/175 274/698/175 275/699/175 -f 276/697/175 275/699/175 277/700/175 -f 274/701/176 279/702/176 278/703/176 -f 274/701/176 278/703/176 275/704/176 -usemtl common_steel_norivets -f 277/705/177 281/706/177 280/707/177 -f 277/705/177 280/707/177 276/708/177 -usemtl common_steel_painted_norivets -f 275/709/178 278/710/178 281/711/178 -f 275/709/178 281/711/178 277/712/178 -f 271/713/179 278/714/179 279/715/179 -f 271/713/179 279/715/179 270/716/179 -usemtl common_steel_norivets -f 272/717/180 280/718/180 281/719/180 -f 272/717/180 281/719/180 273/720/180 -usemtl common_steel_painted_norivets -f 273/721/181 281/722/181 278/723/181 -f 273/721/181 278/723/181 271/724/181 -o suspension_wheel -v 0.3125 0.5000004943447922 -1.2249998647816938 -v 0.3125 0.5000001629278576 -1.349999456908714 -v 0.3125 0.3750002867129263 -1.224999424834648 -v 0.3125 0.37500046227072636 -1.349999740996625 -v -0.3125 0.5000004943447922 -1.2249998647816938 -v -0.3125 0.5000001629278576 -1.349999456908714 -v -0.3125 0.3750002867129263 -1.224999424834648 -v -0.3125 0.37500046227072636 -1.349999740996625 -v -0.1375 0.85934585712926 -1.0228318964747392 -v -0.1375 0.901607577349071 -1.113462448913265 -v -0.1375 0.6327688605280993 -1.1284860884941559 -v -0.1375 0.6750304722177994 -1.2191172564375274 -v -0.2375 0.85934585712926 -1.0228318964747392 -v -0.2375 0.901607577349071 -1.113462448913265 -v -0.2375 0.6327688605280993 -1.1284860884941559 -v -0.2375 0.6750304722177994 -1.2191172564375274 -v 0.2375 0.85934585712926 -1.0228318964747392 -v 0.2375 0.901607577349071 -1.113462448913265 -v 0.2375 0.6327688605280993 -1.1284860884941559 -v 0.2375 0.6750304722177994 -1.2191172564375274 -v 0.1375 0.85934585712926 -1.0228318964747392 -v 0.1375 0.901607577349071 -1.113462448913265 -v 0.1375 0.6327688605280993 -1.1284860884941559 -v 0.1375 0.6750304722177994 -1.2191172564375274 -v 0.25 0.6597624566001373 -1.104502233613679 -v 0.25 0.7135766066065925 -1.21732537472063 -v 0.25 0.4341162829163463 -1.2121299181217435 -v 0.25 0.48793032439269046 -1.3249536747335404 -v 0.125 0.6597624566001373 -1.104502233613679 -v 0.125 0.7135766066065925 -1.21732537472063 -v 0.125 0.4341162829163463 -1.2121299181217435 -v 0.125 0.48793032439269046 -1.3249536747335404 -v -0.125 0.6597624566001373 -1.104502233613679 -v -0.125 0.7135766066065925 -1.21732537472063 -v -0.125 0.4341162829163463 -1.2121299181217435 -v -0.125 0.48793032439269046 -1.3249536747335404 -v -0.25 0.6597624566001373 -1.104502233613679 -v -0.25 0.7135766066065925 -1.21732537472063 -v -0.25 0.4341162829163463 -1.2121299181217435 -v -0.25 0.48793032439269046 -1.3249536747335404 -vt 0.875 0.09375 -vt 0.875 0.125 -vt 0.90625 0.125 -vt 0.90625 0.09375 -vt 0.90625 0.09375 -vt 0.875 0.09375 -vt 0.875 0.125 -vt 0.90625 0.125 -vt 0.796875 0.109375 -vt 0.796875 0.140625 -vt 0.953125 0.140625 -vt 0.953125 0.109375 -vt 0.953125 0.109375 -vt 0.953125 0.140625 -vt 0.796875 0.140625 -vt 0.796875 0.109375 -vt 0.953125 0.140625 -vt 0.953125 0.109375 -vt 0.796875 0.109375 -vt 0.796875 0.140625 -vt 0.953125 0.109375 -vt 0.953125 0.140625 -vt 0.796875 0.140625 -vt 0.796875 0.109375 -vt 0.96875 0.09375 -vt 0.96875 0.15625 -vt 0.9375 0.15625 -vt 0.9375 0.09375 -vt 0.96875 0.09375 -vt 0.96875 0.15625 -vt 0.9375 0.15625 -vt 0.9375 0.09375 -vt 0.9375 0.09375 -vt 0.9375 0.15625 -vt 0.96875 0.15625 -vt 0.96875 0.09375 -vt 0.9375 0.09375 -vt 0.9375 0.15625 -vt 0.96875 0.15625 -vt 0.96875 0.09375 -vt 0.96875 0.09375 -vt 0.96875 0.15625 -vt 0.9375 0.15625 -vt 0.9375 0.09375 -vt 0.96875 0.09375 -vt 0.96875 0.15625 -vt 0.9375 0.15625 -vt 0.9375 0.09375 -vt 0.9375 0.09375 -vt 0.9375 0.15625 -vt 0.96875 0.15625 -vt 0.96875 0.09375 -vt 0.9375 0.09375 -vt 0.9375 0.15625 -vt 0.96875 0.15625 -vt 0.96875 0.09375 -vt 0.96875 0.625 -vt 0.96875 0.6875 -vt 1 0.6875 -vt 1 0.625 -vt 0.953125 0.625 -vt 0.953125 0.6875 -vt 0.984375 0.6875 -vt 0.984375 0.625 -vt 0.8125 0.28125 -vt 0.8125 0.3125 -vt 0.84375 0.3125 -vt 0.84375 0.28125 -vt 0.96875 0.640625 -vt 0.96875 0.671875 -vt 0.9375 0.671875 -vt 0.9375 0.640625 -vt 1 0.640625 -vt 1 0.703125 -vt 0.96875 0.703125 -vt 0.96875 0.640625 -vt 0.984375 0.625 -vt 0.984375 0.6875 -vt 0.953125 0.6875 -vt 0.953125 0.625 -vt 0.96875 0.625 -vt 0.96875 0.6875 -vt 1 0.6875 -vt 1 0.625 -vt 0.953125 0.625 -vt 0.953125 0.6875 -vt 0.984375 0.6875 -vt 0.984375 0.625 -vt 0.8125 0.28125 -vt 0.8125 0.3125 -vt 0.84375 0.3125 -vt 0.84375 0.28125 -vt 0.96875 0.640625 -vt 0.96875 0.671875 -vt 0.9375 0.671875 -vt 0.9375 0.640625 -vt 1 0.640625 -vt 1 0.703125 -vt 0.96875 0.703125 -vt 0.96875 0.640625 -vt 0.984375 0.625 -vt 0.984375 0.6875 -vt 0.953125 0.6875 -vt 0.953125 0.625 +f 383/997/250 382/998/250 384/999/250 385/1000/250 +o shaft +v 0.4375 0.625 1.6875 +v 0.4375 0.625 0.75 +v 0.4375 0.5 1.6875 +v 0.4375 0.5 0.75 +v 0.3125 0.625 1.6875 +v 0.3125 0.625 0.75 +v 0.3125 0.5 1.6875 +v 0.3125 0.5 0.75 +vt 0.7656 0.2344 +vt 0.7969 0.2344 +vt 0.7969 0 +vt 0.7656 0 +vt 0.7969 0 +vt 0.7656 0 +vt 0.7656 0.2344 +vt 0.7969 0.2344 +vt 0.7969 0 +vt 0.7969 0.2344 +vt 0.7656 0.2344 +vt 0.7656 0 +vt 0.7656 0.2344 +vt 0.7656 0 +vt 0.7969 0 +vt 0.7969 0.2344 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl common_cable_and_pipe +f 389/1001/251 387/1002/251 386/1003/251 388/1004/251 +f 392/1005/252 390/1006/252 391/1007/252 393/1008/252 +f 386/1009/253 387/1010/253 391/1011/253 390/1012/253 +f 389/1013/254 388/1014/254 392/1015/254 393/1016/254 +o crip +v 0.0938 1.3525 -0.8338 +v 0.0938 1.3947 -1.0165 +v 0.0938 1.1089 -0.8901 +v 0.0938 1.1511 -1.0728 +v -0.0937 1.3525 -0.8338 +v -0.0937 1.3947 -1.0165 +v -0.0937 1.1089 -0.8901 +v -0.0937 1.1511 -1.0728 +v -0.0937 1.2729 -1.0446 +v 0.0938 1.2729 -1.0446 +v 0.0938 1.2307 -0.8619 +v -0.0937 1.2307 -0.8619 +v 0.2188 1.3125 -0.875 +v 0.1813 1.3125 -0.9625 +v 0.2188 1.1875 -0.875 +v 0.1813 1.1875 -0.9625 +v 0.0938 1.3125 -0.875 +v 0.0938 1.3125 -1 +v 0.0938 1.1875 -0.875 +v 0.0938 1.1875 -1 +v 0.2188 1.3125 -0.5625 +v 0.2188 1.1875 -0.5625 +v 0.0938 1.3125 -0.5625 +v 0.0938 1.1875 -0.5625 +v -0.2187 1.1875 -0.875 +v -0.1813 1.1875 -0.9625 +v -0.2187 1.3125 -0.875 +v -0.1813 1.3125 -0.9625 +v -0.0937 1.1875 -0.875 +v -0.0937 1.1875 -1 +v -0.0937 1.3125 -0.875 +v -0.0937 1.3125 -1 +v -0.2187 1.1875 -0.5625 +v -0.2187 1.3125 -0.5625 +v -0.0937 1.1875 -0.5625 +v -0.0937 1.3125 -0.5625 +v 0.1375 1.4129 -1.1383 +v 0.1375 1.0805 -1.1969 +v 0.1375 1.402 -1.0768 +v 0.1375 1.0697 -1.1354 +v -0.1375 1.4129 -1.1383 +v -0.1375 1.0805 -1.1969 +v -0.1375 1.402 -1.0768 +v -0.1375 1.0697 -1.1354 +v 0.0828 1.3466 -1.0865 +v 0.0828 1.1004 -1.13 +v 0.0828 1.3358 -1.025 +v 0.0828 1.0896 -1.0684 +v -0.0828 1.3466 -1.0865 +v -0.0828 1.1004 -1.13 +v -0.0828 1.3358 -1.025 +v -0.0828 1.0896 -1.0684 +vt 0.9063 1 +vt 0.9063 0.9688 +vt 0.9531 0.9688 +vt 0.9531 1 +vt 0.875 1 +vt 0.875 0.9688 +vt 0.9219 0.9688 +vt 0.9219 1 +vt 0.9063 0.2344 +vt 0.9063 0.2813 +vt 0.8594 0.2813 +vt 0.8594 0.2344 +vt 0.9063 0.2344 +vt 0.9063 0.2813 +vt 0.8594 0.2813 +vt 0.8594 0.2344 +vt 0.875 1 +vt 0.875 0.9688 +vt 0.9219 0.9688 +vt 0.9219 1 +vt 0.875 1 +vt 0.875 0.9688 +vt 0.9219 0.9688 +vt 0.9219 1 +vt 0.8906 0.25 +vt 0.8906 0.2813 +vt 0.8438 0.2813 +vt 0.8438 0.25 +vt 0.9219 0.25 +vt 0.9219 0.2813 +vt 0.875 0.2813 +vt 0.875 0.25 +vt 0.8906 0.25 +vt 0.8906 0.2813 +vt 0.8438 0.2813 +vt 0.8438 0.25 +vt 0.8906 0.25 +vt 0.8906 0.2813 +vt 0.8438 0.2813 +vt 0.8438 0.25 +vt 0.1176 0.2813 +vt 0.1176 0.25 +vt 0.0938 0.25 +vt 0.0938 0.2813 +vt 0.375 0.2188 +vt 0.375 0.25 +vt 0.4063 0.25 +vt 0.4063 0.2188 +vt 0.9688 1 +vt 1 1 +vt 1 0.9688 +vt 0.9688 0.9688 +vt 1 1 +vt 1 0.9688 +vt 0.9688 0.9688 +vt 0.9688 1 +vt 0.0938 0.2813 +vt 0.0938 0.25 +vt 0.125 0.25 +vt 0.125 0.2813 +vt 0.0781 0.2813 +vt 0.0781 0.25 +vt 0.1563 0.25 +vt 0.1563 0.2813 +vt 0.8906 0.4531 +vt 0.8906 0.4844 +vt 0.9688 0.4844 +vt 0.9688 0.4531 +vt 0.875 1 +vt 0.9531 1 +vt 0.9531 0.9688 +vt 0.875 0.9688 +vt 1 0.8594 +vt 1 0.9375 +vt 0.9688 0.9375 +vt 0.9688 0.8594 +vt 0.1176 0.25 +vt 0.1176 0.2813 +vt 0.0938 0.2813 +vt 0.0938 0.25 +vt 0.375 0.2188 +vt 0.375 0.25 +vt 0.4063 0.25 +vt 0.4063 0.2188 +vt 0.9688 1 +vt 1 1 +vt 1 0.9688 +vt 0.9688 0.9688 +vt 1 1 +vt 1 0.9688 +vt 0.9688 0.9688 +vt 0.9688 1 +vt 0.0938 0.25 +vt 0.0938 0.2813 +vt 0.125 0.2813 +vt 0.125 0.25 +vt 0.0781 0.25 +vt 0.0781 0.2813 +vt 0.1563 0.2813 +vt 0.1563 0.25 +vt 0.8906 0.4531 +vt 0.8906 0.4844 +vt 0.9688 0.4844 +vt 0.9688 0.4531 +vt 0.875 1 +vt 0.9531 1 +vt 0.9531 0.9688 +vt 0.875 0.9688 +vt 1 0.8594 +vt 1 0.9375 +vt 0.9688 0.9375 +vt 0.9688 0.8594 +vt 0.7813 0.5156 +vt 0.7656 0.5156 +vt 0.7656 0.4219 +vt 0.7813 0.4219 +vt 0.7813 0.5156 +vt 0.7656 0.5156 +vt 0.7656 0.4219 +vt 0.7813 0.4219 +vt 0.8438 0.5156 +vt 0.8438 0.4219 +vt 0.7656 0.4219 +vt 0.7656 0.5156 +vt 0.8438 0.4219 +vt 0.8438 0.5156 +vt 0.7656 0.5156 +vt 0.7656 0.4219 +vt 0.8438 0.5 +vt 0.8438 0.5156 +vt 0.7656 0.5156 +vt 0.7656 0.5 +vt 0.8438 0.5 +vt 0.8438 0.5156 +vt 0.7656 0.5156 +vt 0.7656 0.5 +vt 0.2656 0.2656 +vt 0.2813 0.2656 +vt 0.2813 0.3281 +vt 0.2656 0.3281 +vt 0.25 0.2656 +vt 0.2656 0.2656 +vt 0.2656 0.3281 +vt 0.25 0.3281 +vt 0.2813 0.2656 +vt 0.2813 0.3281 +vt 0.25 0.3281 +vt 0.25 0.2656 +vt 0.2813 0.3125 +vt 0.2813 0.3281 +vt 0.25 0.3281 +vt 0.25 0.3125 vn 1 0 0 vn -1 0 0 -vn 0 0.9999999999964853 -0.0000026513441289954813 -vn 0 -0.9999999999990139 -0.0000014044588483308475 -vn 0 0.0000035195705187229817 0.9999999999938064 -vn 0 0.0000022727087310714378 -0.9999999999974174 +vn 0 0.97 0.22 +vn 0 -0.97 -0.22 +vn 0 -0.22 0.97 +vn 0 0.22 -0.97 +vn 0 0.22 -0.97 +vn 1 0 0 +vn 0 -0.22 0.97 +vn -1 0 0 +vn 0.92 0 -0.39 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0.39 0 -0.92 vn 1 0 0 vn -1 0 0 -vn 0 -0.42261695849174274 0.9063083947504782 -vn 0 0.42261881450183586 -0.9063075292796937 +vn 0 1 0 +vn 0 -1 0 +vn -0.92 0 -0.39 vn 1 0 0 +vn 0 -1 0 +vn 0 1 0 +vn -0.39 0 -0.92 vn -1 0 0 -vn 0 -0.42261695849174274 0.9063083947504782 -vn 0 0.42261881450183586 -0.9063075292796937 +vn 1 0 0 +vn 0 -1 0 +vn 0 1 0 vn 1 0 0 vn -1 0 0 -vn 0 0.9025844382659545 0.43051287065560717 -vn 0 -0.9025856882600316 -0.4305102499919893 -vn 0 -0.4305110336360348 0.9025853144814806 -vn 0 0.43051287065560717 -0.9025844382659545 +vn 0 0.17 -0.98 +vn 0 -0.17 0.98 +vn 0 0.98 0.17 +vn 0 -0.98 -0.17 vn 1 0 0 vn -1 0 0 -vn 0 0.9025844382659545 0.43051287065560717 -vn 0 -0.9025856882600316 -0.4305102499919893 -vn 0 -0.4305110336360348 0.9025853144814806 -vn 0 0.43051287065560717 -0.9025844382659545 -usemtl common_steel_norivets -f 285/725/182 283/726/182 282/727/182 -f 285/725/182 282/727/182 284/728/182 -f 288/729/183 286/730/183 287/731/183 -f 288/729/183 287/731/183 289/732/183 -f 282/733/184 283/734/184 287/735/184 -f 282/733/184 287/735/184 286/736/184 -f 285/737/185 284/738/185 288/739/185 -f 285/737/185 288/739/185 289/740/185 -f 284/741/186 282/742/186 286/743/186 -f 284/741/186 286/743/186 288/744/186 -f 289/745/187 287/746/187 283/747/187 -f 289/745/187 283/747/187 285/748/187 -f 293/749/188 291/750/188 290/751/188 -f 293/749/188 290/751/188 292/752/188 -f 296/753/189 294/754/189 295/755/189 -f 296/753/189 295/755/189 297/756/189 -f 292/757/190 290/758/190 294/759/190 -f 292/757/190 294/759/190 296/760/190 -f 297/761/191 295/762/191 291/763/191 -f 297/761/191 291/763/191 293/764/191 -f 301/765/192 299/766/192 298/767/192 -f 301/765/192 298/767/192 300/768/192 -f 304/769/193 302/770/193 303/771/193 -f 304/769/193 303/771/193 305/772/193 -f 300/773/194 298/774/194 302/775/194 -f 300/773/194 302/775/194 304/776/194 -f 305/777/195 303/778/195 299/779/195 -f 305/777/195 299/779/195 301/780/195 +vn 0 -0.17 0.98 +vn 0 0.98 0.17 usemtl common_steel_painted_norivets -f 309/781/196 307/782/196 306/783/196 -f 309/781/196 306/783/196 308/784/196 -f 312/785/197 310/786/197 311/787/197 -f 312/785/197 311/787/197 313/788/197 -f 306/789/198 307/790/198 311/791/198 -f 306/789/198 311/791/198 310/792/198 -f 309/793/199 308/794/199 312/795/199 -f 309/793/199 312/795/199 313/796/199 -f 308/797/200 306/798/200 310/799/200 -f 308/797/200 310/799/200 312/800/200 -f 313/801/201 311/802/201 307/803/201 -f 313/801/201 307/803/201 309/804/201 -f 317/805/202 315/806/202 314/807/202 -f 317/805/202 314/807/202 316/808/202 -f 320/809/203 318/810/203 319/811/203 -f 320/809/203 319/811/203 321/812/203 -f 314/813/204 315/814/204 319/815/204 -f 314/813/204 319/815/204 318/816/204 -f 317/817/205 316/818/205 320/819/205 -f 317/817/205 320/819/205 321/820/205 -f 316/821/206 314/822/206 318/823/206 -f 316/821/206 318/823/206 320/824/206 -f 321/825/207 319/826/207 315/827/207 -f 321/825/207 315/827/207 317/828/207 -o wheel -v -0.12499999999999956 0.8716575 -1.0937500000000004 -v 0.12500000000000044 0.8716575 -1.0937500000000004 -v -0.12499999999999956 0.6216575 -0.8437500000000004 -v 0.12500000000000044 0.6216575 -0.8437500000000004 -v -0.12499999999999956 0.8716575 -1.4687500000000004 -v 0.12500000000000044 0.8716575 -1.4687500000000004 -v -0.12499999999999956 0.6216575 -1.7187500000000004 -v 0.12500000000000044 0.6216575 -1.7187500000000004 -v -0.12499999999999956 -0.003342500000000026 -1.0937500000000004 -v 0.12500000000000044 -0.003342500000000026 -1.0937500000000004 -v -0.12499999999999956 0.24665749999999997 -0.8437500000000004 -v 0.12500000000000044 0.24665749999999997 -0.8437500000000004 -v -0.12499999999999956 -0.003342500000000026 -1.4687500000000004 -v 0.12500000000000044 -0.003342500000000026 -1.4687500000000004 -v -0.12499999999999956 0.24665749999999997 -1.7187500000000004 -v 0.12500000000000044 0.24665749999999997 -1.7187500000000004 -v -0.12499999999999956 0.6216575 -0.8437500000000004 -v 0.12500000000000044 0.6216575 -0.8437500000000004 -v -0.12499999999999956 0.24665749999999997 -0.8437500000000004 -v 0.12500000000000044 0.24665749999999997 -0.8437500000000004 -v -0.12499999999999956 0.6216575 -1.7187500000000004 -v 0.12500000000000044 0.6216575 -1.7187500000000004 -v -0.12499999999999956 0.24665749999999997 -1.7187500000000004 -v 0.12500000000000044 0.24665749999999997 -1.7187500000000004 -vt 0.84375 0.5625 -vt 0.84375 0.71875 -vt 0.71875 0.71875 -vt 0.71875 0.5625 -vt 0.28125 0.5625 -vt 0.28125 0.71875 -vt 0.15625 0.71875 -vt 0.15625 0.5625 -vt 0.40625 0.71875 -vt 0.40625 0.84375 -vt 0.59375 0.84375 -vt 0.59375 0.71875 -vt 0.71875 0.59375 -vt 0.59375 0.71875 -vt 0.40625 0.71875 -vt 0.28125 0.59375 -vt 0.28125 0.59375 -vt 0.40625 0.71875 -vt 0.59375 0.71875 -vt 0.71875 0.59375 -vt 0.71875 0.28125 -vt 0.84375 0.28125 -vt 0.84375 0.4375 -vt 0.71875 0.4375 -vt 0.15625 0.28125 -vt 0.28125 0.28125 -vt 0.28125 0.4375 -vt 0.15625 0.4375 -vt 0.40625 0.15625 -vt 0.59375 0.15625 -vt 0.59375 0.28125 -vt 0.40625 0.28125 -vt 0.40625 0.28125 -vt 0.59375 0.28125 -vt 0.71875 0.40625 -vt 0.28125 0.40625 -vt 0.59375 0.28125 -vt 0.40625 0.28125 -vt 0.28125 0.40625 -vt 0.71875 0.40625 -vt 0.84375 0.40625 -vt 0.84375 0.59375 -vt 0.71875 0.59375 -vt 0.71875 0.40625 -vt 0.28125 0.40625 -vt 0.28125 0.59375 -vt 0.15625 0.59375 -vt 0.15625 0.40625 -vt 0.71875 0.40625 -vt 0.71875 0.59375 -vt 0.28125 0.59375 -vt 0.28125 0.40625 -vt 0.28125 0.40625 -vt 0.28125 0.59375 -vt 0.71875 0.59375 -vt 0.71875 0.40625 -vn 1.5700924586837752e-16 0.7071067811865476 0.7071067811865476 -vn -1.5700924586837752e-16 0.7071067811865476 -0.7071067811865476 -vn 0 1 0 -vn -1 0 2.220446049250313e-16 -vn 1 0 -2.220446049250313e-16 -vn 1.5700924586837752e-16 -0.7071067811865476 0.7071067811865476 -vn -1.5700924586837752e-16 -0.7071067811865476 -0.7071067811865476 -vn 0 -1 0 -vn -1 0 2.220446049250313e-16 -vn 1 0 -2.220446049250313e-16 -vn 2.220446049250313e-16 0 1 -vn -2.220446049250313e-16 0 -1 -vn -1 0 2.220446049250313e-16 -vn 1 0 -2.220446049250313e-16 -usemtl wheel_12_terrain -f 325/829/208 323/830/208 322/831/208 -f 325/829/208 322/831/208 324/832/208 -f 328/833/209 326/834/209 327/835/209 -f 328/833/209 327/835/209 329/836/209 -f 322/837/210 323/838/210 327/839/210 -f 322/837/210 327/839/210 326/840/210 -f 324/841/211 322/842/211 326/843/211 -f 324/841/211 326/843/211 328/844/211 -f 329/845/212 327/846/212 323/847/212 -f 329/845/212 323/847/212 325/848/212 -f 330/849/213 331/850/213 333/851/213 -f 330/849/213 333/851/213 332/852/213 -f 335/853/214 334/854/214 336/855/214 -f 335/853/214 336/855/214 337/856/214 -f 335/857/215 331/858/215 330/859/215 -f 335/857/215 330/859/215 334/860/215 -f 334/861/216 330/862/216 332/863/216 -f 334/861/216 332/863/216 336/864/216 -f 331/865/217 335/866/217 337/867/217 -f 331/865/217 337/867/217 333/868/217 -f 341/869/218 339/870/218 338/871/218 -f 341/869/218 338/871/218 340/872/218 -f 344/873/219 342/874/219 343/875/219 -f 344/873/219 343/875/219 345/876/219 -f 340/877/220 338/878/220 342/879/220 -f 340/877/220 342/879/220 344/880/220 -f 345/881/221 343/882/221 339/883/221 -f 345/881/221 339/883/221 341/884/221 -o gas -v 0.6602274753483999 1.552933125 -0.2551081286065204 -v 0.7735159487279812 1.552933125 -0.3079354113241078 -v 0.6602274753483999 1.427933125 -0.2551081286065204 -v 0.7735159487279812 1.427933125 -0.3079354113241078 -v 0.5809865512720188 1.552933125 -0.42504083867589226 -v 0.6942750246516001 1.552933125 -0.4778681213934797 -v 0.5809865512720188 1.427933125 -0.42504083867589226 -v 0.6942750246516001 1.427933125 -0.4778681213934797 -vt 0.375 0.75 -vt 0.375 0.8125 -vt 0.3125 0.8125 -vt 0.3125 0.75 -vt 0.375 0.75 -vt 0.375 0.8125 -vt 0.3125 0.8125 -vt 0.3125 0.75 -vt 0.375 0.75 -vt 0.375 0.8125 -vt 0.28125 0.8125 -vt 0.28125 0.75 -vt 0.375 0.75 -vt 0.375 0.8125 -vt 0.28125 0.8125 -vt 0.28125 0.75 -vt 0.375 0.75 -vt 0.375 0.8125 -vt 0.28125 0.8125 -vt 0.28125 0.75 -vt 0.375 0.75 -vt 0.375 0.8125 -vt 0.28125 0.8125 -vt 0.28125 0.75 -vn 0.4226182617406993 0 0.90630778703665 -vn -0.4226182617406993 0 -0.90630778703665 -vn 0 1 0 +f 394/1017/255 404/1018/255 403/1019/255 395/1020/255 +f 399/1021/256 402/1022/256 405/1023/256 398/1024/256 +f 394/1025/257 395/1026/257 399/1027/257 398/1028/257 +f 397/1029/258 396/1030/258 400/1031/258 401/1032/258 +f 398/1033/259 405/1034/259 404/1035/259 394/1036/259 +f 395/1037/260 403/1038/260 402/1039/260 399/1040/260 +f 401/1041/261 402/1042/261 403/1043/261 397/1044/261 +f 397/1045/262 403/1046/262 404/1047/262 396/1048/262 +f 396/1049/263 404/1050/263 405/1051/263 400/1052/263 +f 400/1053/264 405/1054/264 402/1055/264 401/1056/264 +f 409/1057/265 407/1058/265 406/1059/265 408/1060/265 +f 412/1061/266 410/1062/266 411/1063/266 413/1064/266 +f 406/1065/267 407/1066/267 411/1067/267 410/1068/267 +f 409/1069/268 408/1070/268 412/1071/268 413/1072/268 +f 413/1073/269 411/1074/269 407/1075/269 409/1076/269 +f 408/1077/270 406/1078/270 414/1079/270 415/1080/270 +f 417/1081/271 416/1082/271 410/1083/271 412/1084/271 +f 414/1085/272 406/1086/272 410/1087/272 416/1088/272 +f 408/1089/273 415/1090/273 417/1091/273 412/1092/273 +f 421/1093/274 419/1094/274 418/1095/274 420/1096/274 +f 424/1097/275 422/1098/275 423/1099/275 425/1100/275 +f 418/1101/276 419/1102/276 423/1103/276 422/1104/276 +f 421/1105/277 420/1106/277 424/1107/277 425/1108/277 +f 425/1109/278 423/1110/278 419/1111/278 421/1112/278 +f 420/1113/279 418/1114/279 426/1115/279 427/1116/279 +f 429/1117/280 428/1118/280 422/1119/280 424/1120/280 +f 426/1121/281 418/1122/281 422/1123/281 428/1124/281 +f 420/1125/282 427/1126/282 429/1127/282 424/1128/282 +usemtl tracked_motorbike2_paint +f 433/1129/283 431/1130/283 430/1131/283 432/1132/283 +f 436/1133/284 434/1134/284 435/1135/284 437/1136/284 +f 430/1137/285 431/1138/285 435/1139/285 434/1140/285 +f 433/1141/286 432/1142/286 436/1143/286 437/1144/286 +f 432/1145/287 430/1146/287 434/1147/287 436/1148/287 +f 437/1149/288 435/1150/288 431/1151/288 433/1152/288 +usemtl tracked_motorbike2 +f 441/1153/289 439/1154/289 438/1155/289 440/1156/289 +f 444/1157/290 442/1158/290 443/1159/290 445/1160/290 +f 441/1161/291 440/1162/291 444/1163/291 445/1164/291 +f 440/1165/292 438/1166/292 442/1167/292 444/1168/292 +o rod +v 0.4375 1.3125 1.6875 +v 0.4375 1.3125 1.625 +v -0.25 1.3125 1.6875 +v -0.25 1.3125 1.625 +v 0.4375 1.375 1.6875 +v 0.4375 1.375 1.625 +v -0.25 1.375 1.6875 +v -0.25 1.375 1.625 +vt 0.0313 0.7813 +vt 0.0313 0.9531 +vt 0.0156 0.9531 +vt 0.0156 0.7813 +vt 0.0313 0.7813 +vt 0.0313 0.9531 +vt 0.0156 0.9531 +vt 0.0156 0.7813 +vt 0.0313 0.9375 +vt 0.0313 0.9531 +vt 0.0156 0.9531 +vt 0.0156 0.9375 +vt 0.0313 0.9375 +vt 0.0313 0.9531 +vt 0.0156 0.9531 +vt 0.0156 0.9375 +vt 0.0313 0.7813 +vt 0.0313 0.9531 +vt 0.0156 0.9531 +vt 0.0156 0.7813 +vt 0.0313 0.7813 +vt 0.0313 0.9531 +vt 0.0156 0.9531 +vt 0.0156 0.7813 vn 0 -1 0 -vn -0.90630778703665 0 0.4226182617406993 -vn 0.90630778703665 0 -0.4226182617406993 -usemtl tracked_motorbike -f 349/885/222 347/886/222 346/887/222 -f 349/885/222 346/887/222 348/888/222 -f 352/889/223 350/890/223 351/891/223 -f 352/889/223 351/891/223 353/892/223 -f 346/893/224 347/894/224 351/895/224 -f 346/893/224 351/895/224 350/896/224 -f 349/897/225 348/898/225 352/899/225 -f 349/897/225 352/899/225 353/900/225 -f 348/901/226 346/902/226 350/903/226 -f 348/901/226 350/903/226 352/904/226 -f 353/905/227 351/906/227 347/907/227 -f 353/905/227 347/907/227 349/908/227 -o cluch -v -0.8270722796006491 1.53125 -0.3846144652265723 -v -0.5710872657603392 1.53125 -0.5638571015862742 -v -0.8270722796006491 1.46875 -0.3846144652265723 -v -0.5710872657603392 1.46875 -0.5638571015862742 -v -0.8629208068725894 1.53125 -0.43581146799463427 -v -0.6069357930322796 1.53125 -0.6150541043543362 -v -0.8629208068725894 1.46875 -0.43581146799463427 -v -0.6069357930322796 1.46875 -0.6150541043543362 -vt 0.84375 0.125 -vt 0.84375 0.140625 -vt 0.921875 0.140625 -vt 0.921875 0.125 -vt 0.84375 0.125 -vt 0.84375 0.140625 -vt 0.921875 0.140625 -vt 0.921875 0.125 -vt 0.84375 0.0625 -vt 0.84375 0.140625 -vt 0.859375 0.140625 -vt 0.859375 0.0625 -vt 0.84375 0.0625 -vt 0.84375 0.140625 -vt 0.859375 0.140625 -vt 0.859375 0.0625 -vt 0.84375 0.125 -vt 0.84375 0.140625 -vt 0.859375 0.140625 -vt 0.859375 0.125 -vt 0.84375 0.125 -vt 0.84375 0.140625 -vt 0.859375 0.140625 -vt 0.859375 0.125 -vn 0.5735764363510462 0 0.8191520442889917 -vn -0.5735764363510462 0 -0.8191520442889917 -vn 0 1 0 -vn 0 -1 0 -vn -0.8191520442889917 0 0.5735764363510462 -vn 0.8191520442889917 0 -0.5735764363510462 -usemtl common_steel -f 357/909/228 355/910/228 354/911/228 -f 357/909/228 354/911/228 356/912/228 -f 360/913/229 358/914/229 359/915/229 -f 360/913/229 359/915/229 361/916/229 -f 354/917/230 355/918/230 359/919/230 -f 354/917/230 359/919/230 358/920/230 -f 357/921/231 356/922/231 360/923/231 -f 357/921/231 360/923/231 361/924/231 -f 356/925/232 354/926/232 358/927/232 -f 356/925/232 358/927/232 360/928/232 -f 361/929/233 359/930/233 355/931/233 -f 361/929/233 355/931/233 357/932/233 -o brake -v 0.8543747848067921 1.53125 -0.4724471102082974 -v 0.5983897709664823 1.53125 -0.6516897465679993 -v 0.8543747848067921 1.46875 -0.4724471102082974 -v 0.5983897709664823 1.46875 -0.6516897465679993 -v 0.8185262575348518 1.53125 -0.4212501074402354 -v 0.5625412436945418 1.53125 -0.6004927437999373 -v 0.8185262575348518 1.46875 -0.4212501074402354 -v 0.5625412436945418 1.46875 -0.6004927437999373 -vt 0.90625 0.140625 -vt 0.90625 0.15625 -vt 0.828125 0.15625 -vt 0.828125 0.140625 -vt 0.90625 0.140625 -vt 0.90625 0.15625 -vt 0.828125 0.15625 -vt 0.828125 0.140625 -vt 0.84375 0.078125 -vt 0.84375 0.15625 -vt 0.828125 0.15625 -vt 0.828125 0.078125 -vt 0.84375 0.078125 -vt 0.84375 0.15625 -vt 0.828125 0.15625 -vt 0.828125 0.078125 -vt 0.84375 0.140625 -vt 0.84375 0.15625 -vt 0.828125 0.15625 -vt 0.828125 0.140625 -vt 0.84375 0.140625 -vt 0.84375 0.15625 -vt 0.828125 0.15625 -vt 0.828125 0.140625 -vn 0.5735764363510462 0 -0.8191520442889917 -vn -0.5735764363510462 0 0.8191520442889917 -vn 0 1 0 -vn 0 -1 0 -vn 0.8191520442889917 0 0.5735764363510462 -vn -0.8191520442889917 0 -0.5735764363510462 -usemtl common_steel -f 365/933/234 363/934/234 362/935/234 -f 365/933/234 362/935/234 364/936/234 -f 368/937/235 366/938/235 367/939/235 -f 368/937/235 367/939/235 369/940/235 -f 362/941/236 363/942/236 367/943/236 -f 362/941/236 367/943/236 366/944/236 -f 365/945/237 364/946/237 368/947/237 -f 365/945/237 368/947/237 369/948/237 -f 364/949/238 362/950/238 366/951/238 -f 364/949/238 366/951/238 368/952/238 -f 369/953/239 367/954/239 363/955/239 -f 369/953/239 363/955/239 365/956/239 -o key -v 0.21875 1.5070994840220242 -0.6554274596384494 -v 0.21875 1.5383494840220242 -0.7095540473749767 -v 0.21875 1.4529728962854966 -0.6866774596384494 -v 0.21875 1.4842228962854966 -0.7408040473749767 -v 0.09375 1.5070994840220242 -0.6554274596384494 -v 0.09375 1.5383494840220242 -0.7095540473749767 -v 0.09375 1.4529728962854966 -0.6866774596384494 -v 0.09375 1.4842228962854966 -0.7408040473749767 -v 0.1875 1.5242284792291598 -0.7122407496198122 -v 0.1875 1.4918764925862855 -0.832981715028564 -v 0.1875 1.4638586940406613 -0.6960647144313137 -v 0.1875 1.4315058536319096 -0.8168054510741881 -v 0.125 1.5242284792291598 -0.7122407496198122 -v 0.125 1.4918764925862855 -0.832981715028564 -v 0.125 1.4638586940406613 -0.6960647144313137 -v 0.125 1.4315058536319096 -0.8168054510741881 -vt 0.0625 0.96875 -vt 0.0625 1 -vt 0.03125 1 -vt 0.03125 0.96875 -vt 0.03125 0.96875 -vt 0.03125 1 -vt 0 1 -vt 0 0.96875 -vt 0.0625 0.96875 -vt 0.0625 1 -vt 0 1 -vt 0 0.96875 -vt 0.0625 0.96875 -vt 0.0625 1 -vt 0 1 -vt 0 0.96875 -vt 0.0625 0.96875 -vt 0.0625 1 -vt 0 1 -vt 0 0.96875 -vt 0 0.96875 -vt 0 1 -vt 0.0625 1 -vt 0.0625 0.96875 -vt 0.859375 0.109375 -vt 0.859375 0.125 -vt 0.828125 0.125 -vt 0.828125 0.109375 -vt 0.859375 0.109375 -vt 0.859375 0.125 -vt 0.828125 0.125 -vt 0.828125 0.109375 -vt 0.84375 0.09375 -vt 0.84375 0.125 -vt 0.828125 0.125 -vt 0.828125 0.09375 -vt 0.84375 0.09375 -vt 0.84375 0.125 -vt 0.828125 0.125 -vt 0.828125 0.09375 -vt 0.84375 0.109375 -vt 0.84375 0.125 -vt 0.828125 0.125 -vt 0.828125 0.109375 -vn 1 0 0 -vn -1 0 0 -vn 0 0.8660254037844386 0.5000000000000001 -vn 0 -0.8660254037844386 -0.5000000000000001 -vn 0 -0.5000000000000001 0.8660254037844386 -vn 0 0.5000000000000001 -0.8660254037844386 -vn 1 0 0 -vn -1 0 0 -vn 0 0.9659267413456105 -0.2588156300408653 -vn 0 -0.9659249112204522 0.2588224601609409 -vn 0 -0.25881904510252074 -0.9659258262890684 -usemtl tracked_motorbike -f 373/957/240 371/958/240 370/959/240 -f 373/957/240 370/959/240 372/960/240 -f 376/961/241 374/962/241 375/963/241 -f 376/961/241 375/963/241 377/964/241 -f 370/965/242 371/966/242 375/967/242 -f 370/965/242 375/967/242 374/968/242 -f 373/969/243 372/970/243 376/971/243 -f 373/969/243 376/971/243 377/972/243 -f 372/973/244 370/974/244 374/975/244 -f 372/973/244 374/975/244 376/976/244 -f 377/977/245 375/978/245 371/979/245 -f 377/977/245 371/979/245 373/980/245 +vn 0 1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 0 1 +vn 0 0 -1 usemtl common_steel_norivets -f 381/981/246 379/982/246 378/983/246 -f 381/981/246 378/983/246 380/984/246 -f 384/985/247 382/986/247 383/987/247 -f 384/985/247 383/987/247 385/988/247 -f 378/989/248 379/990/248 383/991/248 -f 378/989/248 383/991/248 382/992/248 -f 381/993/249 380/994/249 384/995/249 -f 381/993/249 384/995/249 385/996/249 -f 385/997/250 383/998/250 379/999/250 -f 385/997/250 379/999/250 381/1000/250 -o hull -v 0.625 1.0625 2.25 -v 0.625 1.0625 1.875 -v 0.625 0.6875 2.25 -v 0.625 0.6875 1.875 -v 0.5625 1.0625 2.25 -v 0.5625 1.0625 1.875 -v 0.5625 0.6875 2.25 -v 0.5625 0.6875 1.875 -v -0.5625 1.0625 2.25 -v -0.5625 1.0625 1.875 -v -0.5625 0.6875 2.25 -v -0.5625 0.6875 1.875 -v -0.625 1.0625 2.25 -v -0.625 1.0625 1.875 -v -0.625 0.6875 2.25 -v -0.625 0.6875 1.875 -v 0.625 1.0625 -0.125 -v 0.625 1.0625 -0.5 -v 0.625 0.6875 -0.125 -v 0.625 0.6875 -0.5 -v 0.5625 1.0625 -0.125 -v 0.5625 1.0625 -0.5 -v 0.5625 0.6875 -0.125 -v 0.5625 0.6875 -0.5 -v 0.5625 0.8687499999999999 1.5625 -v 0.5625 0.8687499999999999 0.1875 -v 0.5625 1.05625 1.5625 -v 0.5625 1.05625 0.1875 -v 1 0.8687499999999999 1.5625 -v 1 0.8687499999999999 0.1875 -v 1 1.05625 1.5625 -v 1 1.05625 0.1875 -v 1 0.9937499999999999 1.5625 -v 1 0.9937499999999999 0.1875 -v 0.5625 0.9937499999999999 0.1875 -v 0.5625 0.9937499999999999 1.5625 -v 1 0.9937499999999999 0.875 -v 1 1.05625 0.875 -v 0.5625 1.05625 0.875 -v 0.5625 0.8687499999999999 0.875 -v 1 0.8687499999999999 0.875 -v 0.75 0.8687499999999999 0.875 -v 0.75 0.8687499999999999 1.5625 -v 0.75 0.9937499999999999 1.5625 -v 0.75 1.05625 1.5625 -v 0.75 1.05625 0.875 -v 0.75 1.05625 0.1875 -v 0.75 0.9937499999999999 0.1875 -v 0.75 0.8687499999999999 0.1875 -v 0.5625 1.11875 1.125 -v 0.5625 1.11875 1.1875 -v 0.5625 1.05625 1.125 -v 0.5625 1.05625 1.1875 -v 1 1.11875 1.125 -v 1 1.11875 1.1875 -v 1 1.05625 1.125 -v 1 1.05625 1.1875 -v 0.5625 1.11875 0.5625 -v 0.5625 1.11875 0.625 -v 0.5625 1.05625 0.5625 -v 0.5625 1.05625 0.625 -v 1 1.11875 0.5625 -v 1 1.11875 0.625 -v 1 1.05625 0.5625 -v 1 1.05625 0.625 -v 0.5625 1.4375 1.8125 -v 0.5625 1.4375 0.625 -v 0.5625 1.375 1.8125 -v 0.5625 1.375 0.625 -v 1.0625 1.375 1.8125 -v 1.0625 1.375 0.625 -v 1.0625 1.3125 1.8125 -v 1.0625 1.3125 0.625 -v 0.5625 1.4375 1.25 -v 1.0625 1.375 1.25 -v 1.0625 1.3125 1.25 -v 0.5625 1.375 1.25 -v 0.6875 1.4375 1.25 -v 0.6875 1.4375 1.8125 -v 0.6875 1.375 1.8125 -v 0.6875 1.375 1.25 -v 0.6875 1.375 0.625 -v 0.6875 1.4375 0.625 -v 0.9375 1.5 0.0625 -v 0.9375 1.5 0 -v 1 1.4375 0.0625 -v 1 1.4375 0 -v 0.6875 1.5 0.0625 -v 0.6875 1.5 0 -v 0.625 1.4375 0.0625 -v 0.625 1.4375 0 -v 1 1.375 0.0625 -v 1 1.375 0 -v 0.9375 1.4375 0.0625 -v 0.9375 1.4375 0 -v 0.9375 1.375 0.0625 -v 0.9375 1.375 0 -v 0.6875 1.4375 0.0625 -v 0.6875 1.4375 0 -v 0.6875 1.375 0.0625 -v 0.6875 1.375 0 -v 0.625 1.375 0.0625 -v 0.625 1.375 0 -v 0.9375 1.48125 2.1875 -v 0.9375 1.48125 2.125 -v 1 1.41875 2.1875 -v 1 1.41875 2.125 -v 0.6875 1.48125 2.1875 -v 0.6875 1.48125 2.125 -v 0.625 1.41875 2.1875 -v 0.625 1.41875 2.125 -v 1 1.35625 2.1875 -v 1 1.35625 2.125 -v 0.9375 1.41875 2.1875 -v 0.9375 1.41875 2.125 -v 0.9375 1.35625 2.1875 -v 0.9375 1.35625 2.125 -v 0.6875 1.41875 2.1875 -v 0.6875 1.41875 2.125 -v 0.6875 1.35625 2.1875 -v 0.6875 1.35625 2.125 -v 0.625 1.35625 2.1875 -v 0.625 1.35625 2.125 -v -0.5625 1.05625 1.5625 -v -0.5625 1.05625 0.1875 -v -0.5625 0.8687499999999999 1.5625 -v -0.5625 0.8687499999999999 0.1875 -v -1 1.05625 1.5625 -v -1 1.05625 0.1875 -v -1 0.8687499999999999 1.5625 -v -1 0.8687499999999999 0.1875 -v -1 0.9312499999999999 1.5625 -v -1 0.9312499999999999 0.1875 -v -0.5625 0.9312499999999999 0.1875 -v -0.5625 0.9312499999999999 1.5625 -v -1 0.9312499999999999 0.875 -v -1 0.8687499999999999 0.875 -v -0.5625 0.8687499999999999 0.875 -v -0.5625 1.05625 0.875 -v -1 1.05625 0.875 -v -0.75 1.05625 0.875 -v -0.75 1.05625 1.5625 -v -0.75 0.9312499999999999 1.5625 -v -0.75 0.8687499999999999 1.5625 -v -0.75 0.8687499999999999 0.875 -v -0.75 0.8687499999999999 0.1875 -v -0.75 0.9312499999999999 0.1875 -v -0.75 1.05625 0.1875 -v -0.5625 1.11875 0.625 -v -0.5625 1.11875 0.5625 -v -0.5625 1.05625 0.625 -v -0.5625 1.05625 0.5625 -v -1 1.11875 0.625 -v -1 1.11875 0.5625 -v -1 1.05625 0.625 -v -1 1.05625 0.5625 -v -0.5625 1.0625 -0.125 -v -0.5625 1.0625 -0.5 -v -0.5625 0.6875 -0.125 -v -0.5625 0.6875 -0.5 -v -0.625 1.0625 -0.125 -v -0.625 1.0625 -0.5 -v -0.625 0.6875 -0.125 -v -0.625 0.6875 -0.5 -v -0.5625 1.4375 1.8125 -v -0.5625 1.4375 0.625 -v -0.5625 1.375 1.8125 -v -0.5625 1.375 0.625 -v -1.0625 1.375 1.8125 -v -1.0625 1.375 0.625 -v -1.0625 1.3125 1.8125 -v -1.0625 1.3125 0.625 -v -0.5625 1.4375 1.25 -v -1.0625 1.375 1.25 -v -1.0625 1.3125 1.25 -v -0.5625 1.375 1.25 -v -0.6875 1.4375 1.25 -v -0.6875 1.4375 1.8125 -v -0.6875 1.375 1.8125 -v -0.6875 1.375 1.25 -v -0.6875 1.375 0.625 -v -0.6875 1.4375 0.625 -v -0.6875 1.5 0.0625 -v -0.6875 1.5 0 -v -0.625 1.4375 0.0625 -v -0.625 1.4375 0 -v -0.9375 1.5 0.0625 -v -0.9375 1.5 0 -v -1 1.4375 0.0625 -v -1 1.4375 0 -v -0.625 1.375 0.0625 -v -0.625 1.375 0 -v -0.6875 1.4375 0.0625 -v -0.6875 1.4375 0 -v -0.6875 1.375 0.0625 -v -0.6875 1.375 0 -v -0.9375 1.4375 0.0625 -v -0.9375 1.4375 0 -v -0.9375 1.375 0.0625 -v -0.9375 1.375 0 -v -1 1.375 0.0625 -v -1 1.375 0 -v -0.6875 1.48125 2.1875 -v -0.6875 1.48125 2.125 -v -0.625 1.41875 2.1875 -v -0.625 1.41875 2.125 -v -0.9375 1.48125 2.1875 -v -0.9375 1.48125 2.125 -v -1 1.41875 2.1875 -v -1 1.41875 2.125 -v -0.625 1.35625 2.1875 -v -0.625 1.35625 2.125 -v -0.6875 1.41875 2.1875 -v -0.6875 1.41875 2.125 -v -0.6875 1.35625 2.1875 -v -0.6875 1.35625 2.125 -v -0.9375 1.41875 2.1875 -v -0.9375 1.41875 2.125 -v -0.9375 1.35625 2.1875 -v -0.9375 1.35625 2.125 -v -1 1.35625 2.1875 -v -1 1.35625 2.125 -v -0.5625 1.11875 1.1875 -v -0.5625 1.11875 1.125 -v -0.5625 1.05625 1.1875 -v -0.5625 1.05625 1.125 -v -1 1.11875 1.1875 -v -1 1.11875 1.125 -v -1 1.05625 1.1875 -v -1 1.05625 1.125 -v 0.25 1.3125 1.75 -v 0.25 1.3125 1.5 -v 0.25 0.4375 1.5 -v -0.5 1.3125 1.75 -v -0.5 1.3125 1.5 -v -0.5 0.4375 1.5 -v 0.25 0.4375 1.75 -v 0.5 1.25 1.125 -v 0.3125 1.25 1.125 -v 0.5 0.8125 1.125 -v 0.3125 0.8125 1.125 -v 0.5 1.25 1.625 -v 0.3125 1.25 1.625 -v 0.5 0.8125 1.625 -v 0.3125 0.8125 1.625 -v 0.4375 1.25 1.125 -v 0.4375 0.8125 1.125 -v 0.4375 0.8125 1.625 -v 0.4375 1.25 1.625 -v 0.3125 1.15625 1.25 -v 0.25 1.15625 1.25 -v 0.3125 0.90625 1.25 -v 0.25 0.90625 1.25 -v 0.3125 1.15625 1.5 -v 0.25 1.15625 1.5 -v 0.3125 0.90625 1.5 -v 0.25 0.90625 1.5 -v 0.25 1.09375 1.4375 -v 0.25 1.09375 1.3125 -v 0.25 0.96875 1.4375 -v 0.25 0.96875 1.3125 -v 0.1875 1.09375 1.4375 -v 0.1875 1.09375 1.3125 -v 0.125 0.96875 1.4375 -v 0.125 0.96875 1.3125 -v 0.4579575 0.9428124999999999 1.125 -v 0.4579575 0.9428124999999999 0.9375 -v 0.299475625 0.602946875 1.125 -v 0.299475625 0.602946875 0.9375 -v 0.288024375 1.022053125 1.125 -v 0.288024375 1.022053125 0.9375 -v 0.1295425 0.6821875 1.125 -v 0.1295425 0.6821875 0.9375 -v -0.40625 0.78125 1.53125 -v -0.40625 0.78125 1.09375 -v -0.40625 0.65625 1.53125 -v -0.40625 0.65625 1.09375 -v -0.53125 0.78125 1.53125 -v -0.53125 0.78125 1.09375 -v -0.53125 0.65625 1.53125 -v -0.53125 0.65625 1.09375 -v -0.40625 0.78125 0.96875 -v -0.40625 0.65625 0.96875 -v -0.46875 0.78125 0.96875 -v -0.46875 0.65625 0.96875 -v 0.5 1.3125 -0.4375 -v 0.5 1.3125 0.5625 -v 0.5 0.4375 -0.4375 -v 0.5 0.4375 0.5625 -v 0.5625 1.3125 -0.4375 -v 0.5625 1.3125 0.5625 -v 0.5625 0.4375 -0.4375 -v 0.5625 0.4375 0.5625 -v 0.0625 0.84375 2.6875 -v 0.0625 0.84375 2.5625 -v 0.0625 0.40625 2.6875 -v 0.0625 0.40625 2.5625 -v -0.0625 0.84375 2.6875 -v -0.0625 0.84375 2.5625 -v -0.0625 0.40625 2.6875 -v -0.0625 0.40625 2.5625 -v 0.0625 0.40625 2.375 -v 0.0625 0.28125 2.625 -v 0.0625 0.28125 2.375 -v -0.0625 0.40625 2.375 -v -0.0625 0.28125 2.625 -v -0.0625 0.28125 2.375 -v 0.5625 0.4375 2.4375 -v 0.5625 0.3125 2.4375 -v 0.5625 0.3125 -0.4375 -v -0.5625 0.4375 2.4375 -v -0.5625 0.4375 -0.4375 -v -0.5625 0.3125 2.4375 -v -0.5625 0.3125 -0.4375 -v 0.5625 0.3125 1 -v -0.5625 0.3125 1 -v -0.5625 0.4375 1 -v 0.5625 0.4375 1 -v 0 0.3125 1 -v 0 0.3125 -0.4375 -v 0 0.4375 -0.4375 -v 0 0.4375 1 -v 0 0.4375 2.4375 -v 0 0.3125 2.4375 -v 0.5 1.25 0.6875 -v 0.5 0.4375 0.6875 -v -0.5 1.25 0.6875 -v -0.5 0.4375 0.6875 -v -0.4375 1.5 1.75 -v -0.4375 1.5 1.625 -v -0.4375 1.4375 1.75 -v -0.4375 1.4375 1.625 -v -0.5625 1.5 1.75 -v -0.5625 1.5 1.625 -v -0.5625 1.4375 1.75 -v -0.5625 1.4375 1.625 -v -0.4375 1.5 0.8125 -v -0.4375 1.5 0.6875 -v -0.4375 1.4375 0.8125 -v -0.4375 1.4375 0.6875 -v -0.5625 1.5 0.8125 -v -0.5625 1.5 0.6875 -v -0.5625 1.4375 0.8125 -v -0.5625 1.4375 0.6875 -v 0.1875 0.61875 0.125 -v 0.1875 0.61875 -0.4375 -v 0.1875 0.43125 0.125 -v 0.1875 0.43125 -0.4375 -v -0.0625 0.61875 0.125 -v -0.0625 0.61875 -0.4375 -v -0.0625 0.43125 0.125 -v -0.0625 0.43125 -0.4375 -v -0.4375 1.125 2.25 -v -0.4375 1.125 1.875 -v -0.4375 0.4375 2.25 -v -0.4375 0.4375 1.875 -v -0.5 1.125 2.25 -v -0.5 1.125 1.875 -v -0.5 0.4375 2.25 -v -0.5 0.4375 1.875 -v -0.4375 0.75 1.875 -v -0.4375 0.75 2.25 -v -0.5 0.75 2.25 -v -0.5 0.75 1.875 -v -0.4375 0.75 2.0625 -v -0.4375 1.125 2.0625 -v -0.5 1.125 2.0625 -v -0.4375 0.4375 2.0625 -v 0.4375 1.125 2.25 -v 0.4375 1.125 1.875 -v 0.4375 0.4375 2.25 -v 0.4375 0.4375 1.875 -v 0.5 1.125 2.25 -v 0.5 1.125 1.875 -v 0.5 0.4375 2.25 -v 0.5 0.4375 1.875 -v 0.4375 0.75 1.875 -v 0.4375 0.75 2.25 -v 0.5 0.75 2.25 -v 0.5 0.75 1.875 -v 0.4375 0.75 2.0625 -v 0.4375 1.125 2.0625 -v 0.5 1.125 2.0625 -v 0.4375 0.4375 2.0625 -v 0.25 0.6875 2.15625 -v 0.25 0.6875 1.90625 -v 0.25 0.4375 2.15625 -v 0.25 0.4375 1.90625 -v -0.25 0.6875 2.15625 -v -0.25 0.6875 1.90625 -v -0.25 0.4375 2.15625 -v -0.25 0.4375 1.90625 -v 0.25 0.5625 2.15625 -v -0.25 0.5625 2.15625 -v -0.25 0.5625 1.90625 -v 0.25 0.5625 1.90625 -v 0 0.5625 2.15625 -v 0 0.4375 2.15625 -v 0 0.6875 2.15625 -v -0.3125 1.375 1.8125 -v -0.5 1.375 1.8125 -v -0.3125 1.1875 1.8125 -v -0.5 1.1875 1.8125 -v -0.3125 1.375 1.875 -v -0.5 1.375 1.875 -v -0.3125 1.1875 1.875 -v -0.5 1.1875 1.875 -v 0.375 0.625 0.5625 -v 0.375 0.625 0.125 -v 0.375 0.4375 0.5625 -v 0.375 0.4375 0.125 -v -0.375 0.625 0.5625 -v -0.375 0.625 0.125 -v -0.375 0.4375 0.5625 -v -0.375 0.4375 0.125 -v 0 0.625 0.125 -v 0 0.4375 0.125 -v 0.375 0.625 0.375 -v 0.375 0.4375 0.375 -v -0.375 0.4375 0.375 -v -0.375 0.625 0.375 -v 0 0.5 0.125 -v 0.375 0.5 0.125 -v 0.375 0.5 0.375 -v 0.375 0.5 0.5625 -v -0.375 0.5 0.5625 -v -0.375 0.5 0.375 -v -0.375 0.5 0.125 -v -0.0625 0.5625 -0.1875 -v -0.0625 0.5625 -0.3125 -v -0.0625 0.4375 -0.1875 -v -0.0625 0.4375 -0.3125 -v -0.125 0.5625 -0.1875 -v -0.125 0.5625 -0.3125 -v -0.125 0.4375 -0.1875 -v -0.125 0.4375 -0.3125 -v -0.1875 0.5625 -0.1875 -v -0.1875 0.5625 -0.3125 -v -0.1875 0.4375 -0.1875 -v -0.1875 0.4375 -0.3125 -v -0.25 0.5625 -0.1875 -v -0.25 0.5625 -0.3125 -v -0.25 0.4375 -0.1875 -v -0.25 0.4375 -0.3125 -v -0.3125 0.5625 0.125 -v -0.3125 0.5625 0 -v -0.3125 0.4375 0.125 -v -0.3125 0.4375 0 -v -0.375 0.5625 0.125 -v -0.375 0.5625 0 -v -0.375 0.4375 0 -v -0.4375 0.5625 0.125 -v -0.4375 0.5625 0 -v -0.4375 0.4375 0.125 -v -0.4375 0.4375 0 -v -0.5 0.5625 0.125 -v -0.5 0.5625 0 -v -0.5 0.4375 0.125 -v -0.5 0.4375 0 -v -0.375 0.53125 0.09375 -v -0.375 0.53125 -0.09375 -v -0.375 0.46875 0.09375 -v -0.375 0.46875 -0.09375 -v -0.4375 0.53125 0.09375 -v -0.4375 0.53125 -0.09375 -v -0.4375 0.46875 0.09375 -v -0.4375 0.46875 -0.09375 -v -0.35624999999999996 0.5499999999999999 -0.09375 -v -0.35624999999999996 0.5499999999999999 -0.28125 -v -0.35624999999999996 0.44999999999999996 -0.09375 -v -0.35624999999999996 0.44999999999999996 -0.28125 -v -0.45625000000000004 0.5499999999999999 -0.09375 -v -0.45625000000000004 0.5499999999999999 -0.28125 -v -0.45625000000000004 0.44999999999999996 -0.09375 -v -0.45625000000000004 0.44999999999999996 -0.28125 -v 0.5625 1.4375 1.75 -v 0.5625 0.4375 1.8125 -v 0.5625 0.4375 1.75 -v -0.5625 0.4375 1.8125 -v -0.5625 0.4375 1.75 -v 0.5625 1.1875 1.8125 -v -0.5625 1.1875 1.8125 -v -0.5625 1.1875 1.75 -v 0.5625 1.1875 1.75 -v 0 1.1875 1.8125 -v 0 0.4375 1.8125 -v 0 0.4375 1.75 -v 0 1.1875 1.75 -v 0 1.4375 1.75 -v 0 1.4375 1.8125 -v 0.5625 1.25 0.5625 -v 0.5625 1.25 0.6875 -v 0.5625 0.4375 0.6875 -v 0.5625 1.1875 0.5625 -v 0.5625 1.1875 0.6875 -v -0.5 0.4375 0.5625 -v 0.5625 1.4375 0.6875 -v -0.5625 1.3125 0.5625 -v -0.5625 1.25 0.6875 -v -0.5625 1.25 0.5625 -v 0 1.3125 0.5625 -v 0 1.4375 0.6875 -v 0 1.25 0.6875 -v 0 1.25 0.5625 -v 0.5 1.4375 0.6875 -v 0.5 1.4375 1.75 -v 0.5 0.4375 1.75 -v 0.5 0.9375 1.75 -v 0.5 0.9375 0.6875 -v 0.5625 0.9375 0.6875 -v 0.5625 0.9375 1.75 -v 0.5 0.9375 1.25 -v 0.5 0.4375 1.25 -v 0.5625 0.4375 1.25 -v 0.5625 0.9375 1.25 -v 0.5 1.4375 1.25 -v 0.5 1.25 0.5625 -v -0.5 1.25 0.5625 -v 0.5625 1.25 2.3125 -v 0.5625 1.25 1.8125 -v 0.5 1.25 2.3125 -v 0.5 1.25 1.8125 -v 0.5 0.4375 2.4375 -v 0.5 0.4375 1.8125 -v -0.5 1.3125 0.5625 -v -0.5 1.3125 -0.4375 -v -0.5 0.4375 -0.4375 -v -0.5625 1.3125 -0.4375 -v -0.5625 0.4375 0.5625 -v -0.5625 0.4375 0.6875 -v -0.5625 1.1875 0.6875 -v -0.5625 1.1875 0.5625 -v -0.5 1.4375 1.75 -v -0.5 1.4375 0.6875 -v -0.5 0.4375 1.75 -v -0.5 0.9375 0.6875 -v -0.5 0.9375 1.75 -v -0.5625 0.9375 1.75 -v -0.5625 0.9375 0.6875 -v -0.5 0.9375 1.1875 -v -0.5 0.4375 1.1875 -v -0.5625 0.4375 1.1875 -v -0.5625 0.9375 1.1875 -v -0.5625 1.4375 1.1875 -v -0.5 1.4375 1.1875 -v -0.5 1.25 2.3125 -v -0.5 1.25 1.8125 -v -0.5 0.4375 2.4375 -v -0.5 0.4375 1.8125 -v -0.5625 1.25 2.3125 -v -0.5625 1.25 1.8125 -v 0.5 0.6875 0.75 -v 0.5 0.6875 0.6875 -v 0.5 0.4375 0.75 -v 0.25 0.6875 0.75 -v 0.25 0.6875 0.6875 -v 0.25 0.4375 0.75 -v 0.25 0.4375 0.6875 -v 0.5 0.6875 1.6875 -v 0.5 0.6875 1.75 -v 0.5 0.4375 1.6875 -v 0.25 0.6875 1.6875 -v 0.25 0.6875 1.75 -v 0.25 0.4375 1.6875 -v 0.5 0.875 0.5625 -v 0.5 0.875 -0.4375 -v -0.5 0.875 -0.4375 -v -0.5 0.875 0.5625 -v 0.5 0.75 0.5625 -v 0.5 0.75 0.125 -v 0.5 0.625 0.5625 -v 0.5 0.625 0.125 -v -0.5 0.75 0.5625 -v -0.5 0.75 0.125 -v -0.5 0.625 0.5625 -v -0.5 0.625 0.125 -v 0.5625 1.3125 -0.5625 -v 0.5625 0.3125 -0.5625 -v -0.5625 1.3125 -0.5625 -v -0.5625 0.3125 -0.5625 -v -0.5625 0.8125 -0.5625 -v 0.5625 0.8125 -0.5625 -v 0.5625 0.8125 -0.4375 -v -0.5625 0.8125 -0.4375 -v 0 0.8125 -0.5625 -v 0 0.3125 -0.5625 -v 0 0.8125 -0.4375 -v 0 1.3125 -0.4375 -v 0 1.3125 -0.5625 -v -0.8125 1.125 -0.75 -v -1.0625 1.375 -0.5 -v -1.0625 1.1875 -0.75 -v -1.0625 1.3125 -0.5 -v -1.0625 1.125 -0.75 -v -0.5625 1.375 -0.5 -v -0.5625 1.1875 -0.75 -v -0.5625 1.3125 -0.5 -v -0.5625 1.125 -0.75 -v -0.8125 1.1875 -0.75 -v -0.8125 1.375 -0.5 -v -0.8125 1.3125 -0.5 -v -0.5625 1.3125 0.625 -v -0.8125 1.375 0.625 -v -0.8125 1.3125 0.625 -v -0.5625 1.35311625 2.302931875 -v -0.5625 1.154889375 2.544515 -v -0.5625 1.290675625 2.3002056250000003 -v -0.5625 1.09244875 2.541789375 -v -1.0625 1.35311625 2.302931875 -v -1.0625 1.154889375 2.544515 -v -1.0625 1.290675625 2.3002056250000003 -v -1.0625 1.09244875 2.541789375 -v -0.8125 1.154889375 2.544515 -v -0.8125 1.35311625 2.302931875 -v -0.8125 1.290675625 2.3002056250000003 -v -0.8125 1.09244875 2.541789375 -v -1.0625 1.312485 1.80068125 -v -1.0625 1.374925625 1.8034075 -v -0.5625 1.312485 1.80068125 -v -0.5625 1.374925625 1.8034075 -v -0.8125 1.312485 1.80068125 -v -0.8125 1.374925625 1.8034075 -v 0.8125 1.125 -0.75 -v 1.0625 1.375 -0.5 -v 1.0625 1.1875 -0.75 -v 1.0625 1.3125 -0.5 -v 1.0625 1.125 -0.75 -v 0.5625 1.375 -0.5 -v 0.5625 1.1875 -0.75 -v 0.5625 1.3125 -0.5 -v 0.5625 1.125 -0.75 -v 0.8125 1.1875 -0.75 -v 0.8125 1.375 -0.5 -v 0.8125 1.3125 -0.5 -v 0.5625 1.3125 0.625 -v 0.8125 1.375 0.625 -v 0.8125 1.3125 0.625 -v 0.5625 1.35311625 2.302931875 -v 0.5625 1.154889375 2.544515 -v 0.5625 1.290675625 2.3002056250000003 -v 0.5625 1.09244875 2.541789375 -v 1.0625 1.35311625 2.302931875 -v 1.0625 1.154889375 2.544515 -v 1.0625 1.290675625 2.3002056250000003 -v 1.0625 1.09244875 2.541789375 -v 0.8125 1.154889375 2.544515 -v 0.8125 1.35311625 2.302931875 -v 0.8125 1.290675625 2.3002056250000003 -v 0.8125 1.09244875 2.541789375 -v 1.0625 1.312485 1.80068125 -v 1.0625 1.374925625 1.8034075 -v 0.5625 1.312485 1.80068125 -v 0.5625 1.374925625 1.8034075 -v 0.8125 1.312485 1.80068125 -v 0.8125 1.374925625 1.8034075 -v 1.0635181249999999 1.424135 0.875 -v 1.0635181249999999 1.424135 0.75 -v 1.052665 1.362584375 0.875 -v 1.052665 1.362584375 0.75 -v 0.6326643750000001 1.50010625 0.875 -v 0.6326643750000001 1.50010625 0.75 -v 0.62181125 1.438555625 0.875 -v 0.62181125 1.438555625 0.75 -v 1.0635181249999999 1.424135 1.6875 -v 1.0635181249999999 1.424135 1.5625 -v 1.052665 1.362584375 1.6875 -v 1.052665 1.362584375 1.5625 -v 0.6326643750000001 1.50010625 1.6875 -v 0.6326643750000001 1.50010625 1.5625 -v 0.62181125 1.438555625 1.6875 -v 0.62181125 1.438555625 1.5625 -v 1.13592125 1.474831875 1.8125 -v 1.13592125 1.474831875 0.625 -v 1.1250681249999999 1.413281875 1.8125 -v 1.1250681249999999 1.413281875 0.625 -v 0.581966875 1.572509375 1.8125 -v 0.581966875 1.572509375 0.625 -v 0.57111375 1.51095875 1.8125 -v 0.57111375 1.51095875 0.625 -v 0.5 0.75 1.8125 -v 0.5 0.75 2.1875 -v 0.5 0.625 1.8125 -v 0.5 0.625 2.1875 -v -0.5 0.75 1.8125 -v -0.5 0.75 2.1875 -v -0.5 0.625 1.8125 -v -0.5 0.625 2.1875 -v 0.275 1.246025 -0.43169187500000006 -v 0.275 0.9382725 -0.37742687500000005 -v 0.275 1.2547074999999999 -0.3824518749999999 -v 0.275 0.946955 -0.3281868749999999 -v -0.03749999999999998 1.246025 -0.43169187500000006 -v -0.03749999999999998 0.9382725 -0.37742687500000005 -v -0.03749999999999998 1.2547074999999999 -0.3824518749999999 -v -0.03749999999999998 0.946955 -0.3281868749999999 -v -0.09999999999999998 1.246025 -0.43169187500000006 -v -0.09999999999999998 0.9382725 -0.37742687500000005 -v -0.09999999999999998 1.2547074999999999 -0.3824518749999999 -v -0.09999999999999998 0.946955 -0.3281868749999999 -v -0.4125000000000001 1.246025 -0.43169187500000006 -v -0.4125000000000001 0.9382725 -0.37742687500000005 -v -0.4125000000000001 1.2547074999999999 -0.3824518749999999 -v -0.4125000000000001 0.946955 -0.3281868749999999 -vt 0.1875 0.390625 -vt 0.1875 0.484375 -vt 0.09375 0.484375 -vt 0.09375 0.390625 -vt 0.109375 0.484375 -vt 0.109375 0.390625 -vt 0.09375 0.390625 -vt 0.09375 0.484375 -vt 0.1875 0.390625 -vt 0.1875 0.484375 -vt 0.171875 0.484375 -vt 0.171875 0.390625 -vt 0.109375 0.390625 -vt 0.109375 0.484375 -vt 0.09375 0.484375 -vt 0.09375 0.390625 -vt 0.1875 0.390625 -vt 0.1875 0.484375 -vt 0.171875 0.484375 -vt 0.171875 0.390625 -vt 0.09375 0.390625 -vt 0.09375 0.484375 -vt 0.1875 0.484375 -vt 0.1875 0.390625 -vt 0.109375 0.484375 -vt 0.109375 0.390625 -vt 0.09375 0.390625 -vt 0.09375 0.484375 -vt 0.1875 0.390625 -vt 0.1875 0.484375 -vt 0.171875 0.484375 -vt 0.171875 0.390625 -vt 0.109375 0.390625 -vt 0.109375 0.484375 -vt 0.09375 0.484375 -vt 0.09375 0.390625 -vt 0.1875 0.390625 -vt 0.1875 0.484375 -vt 0.171875 0.484375 -vt 0.171875 0.390625 -vt 0.1875 0.390625 -vt 0.1875 0.484375 -vt 0.09375 0.484375 -vt 0.09375 0.390625 -vt 0.109375 0.484375 -vt 0.109375 0.390625 -vt 0.09375 0.390625 -vt 0.09375 0.484375 -vt 0.1875 0.390625 -vt 0.1875 0.484375 -vt 0.171875 0.484375 -vt 0.171875 0.390625 -vt 0.109375 0.390625 -vt 0.109375 0.484375 -vt 0.09375 0.484375 -vt 0.09375 0.390625 -vt 0.1875 0.390625 -vt 0.1875 0.484375 -vt 0.171875 0.484375 -vt 0.171875 0.390625 -vt 0.75 0.96875 -vt 0.921875 0.96875 -vt 0.921875 1 -vt 0.75 1 -vt 0.75 0.828125 -vt 0.8125 0.828125 -vt 0.8125 1 -vt 0.75 1 -vt 0.75 0.25 -vt 0.8125 0.25 -vt 0.8125 0.421875 -vt 0.75 0.421875 -vt 0.75 0.96875 -vt 0.8125 0.96875 -vt 0.8125 1 -vt 0.75 1 -vt 1 1 -vt 0.9375 1 -vt 0.9375 0.96875 -vt 1 0.96875 -vt 0.75 0.25 -vt 0.921875 0.25 -vt 0.921875 0.265625 -vt 0.75 0.265625 -vt 0.953125 0.265625 -vt 0.890625 0.265625 -vt 0.890625 0.25 -vt 0.953125 0.25 -vt 0.765625 0.25 -vt 0.828125 0.25 -vt 0.828125 0.265625 -vt 0.765625 0.265625 -vt 1 0.265625 -vt 0.828125 0.265625 -vt 0.828125 0.25 -vt 1 0.25 -vt 0.75 0.828125 -vt 0.8125 0.828125 -vt 0.8125 1 -vt 0.75 1 -vt 0.75 0.25 -vt 0.8125 0.25 -vt 0.8125 0.421875 -vt 0.75 0.421875 -vt 1 1 -vt 0.828125 1 -vt 0.828125 0.96875 -vt 1 0.96875 -vt 1 0.421875 -vt 0.953125 0.421875 -vt 0.953125 0.25 -vt 1 0.25 -vt 1 1 -vt 0.953125 1 -vt 0.953125 0.96875 -vt 1 0.96875 -vt 1 0.265625 -vt 0.953125 0.265625 -vt 0.953125 0.25 -vt 1 0.25 +f 449/1169/293 447/1170/293 446/1171/293 448/1172/293 +f 452/1173/294 450/1174/294 451/1175/294 453/1176/294 +f 446/1177/295 447/1178/295 451/1179/295 450/1180/295 +f 449/1181/296 448/1182/296 452/1183/296 453/1184/296 +f 448/1185/297 446/1186/297 450/1187/297 452/1188/297 +f 453/1189/298 451/1190/298 447/1191/298 449/1192/298 +o radio +v 0.3156 1.4375 0.9344 +v 0.3156 1.6875 0.9344 +v 0.0031 1.4375 0.9357 +v 0.0031 1.6875 0.9357 +v 0.3178 1.4375 1.4344 +v 0.3178 1.6875 1.4344 +v 0.0053 1.4375 1.4357 +v 0.0053 1.6875 1.4357 +v 0.1607 1.6875 1.2476 +v 0.1607 1.75 1.2476 +v -0.0268 1.6875 1.2484 +v -0.0268 1.75 1.2484 +v 0.1613 1.6875 1.3726 +v 0.1613 1.75 1.3726 +v -0.0262 1.6875 1.3734 +v -0.0262 1.75 1.3734 +v 0.0032 1.4375 0.9514 +v 0.0032 1.6719 0.9514 +v -0.0593 1.4375 0.9516 +v -0.0593 1.6719 0.9516 +v 0.0052 1.4375 1.4201 +v 0.0052 1.6719 1.4201 +v -0.0573 1.4375 1.4204 +v -0.0573 1.6719 1.4204 +v -0.0594 1.4375 0.936 +v -0.0594 1.6875 0.936 +v -0.3094 1.4375 0.9371 +v -0.3094 1.6875 0.9371 +v -0.0572 1.4375 1.436 +v -0.0572 1.6875 1.436 +v -0.3072 1.4375 1.4371 +v -0.3072 1.6875 1.4371 +v 0.1596 1.6875 0.9976 +v 0.1596 1.75 0.9976 +v -0.0278 1.6875 0.9984 +v -0.0278 1.75 0.9984 +v 0.1602 1.6875 1.1226 +v 0.1602 1.75 1.1226 +v -0.0273 1.6875 1.1234 +v -0.0273 1.75 1.1234 +v 0.2484 1.6552 1.4327 +v 0.0609 1.6552 1.4327 +v 0.2484 1.4677 1.4311 +v 0.0609 1.4677 1.4311 +v 0.2484 1.6546 1.4952 +v 0.0609 1.6546 1.4952 +v 0.2484 1.4672 1.4936 +v 0.0609 1.4672 1.4936 +v 0.2172 1.7174 1.4645 +v 0.0922 1.7174 1.4645 +v 0.2172 1.4049 1.4618 +v 0.0922 1.4049 1.4618 +v 0.2172 1.7163 1.5895 +v 0.0922 1.7163 1.5895 +v 0.2172 1.4038 1.5868 +v 0.0922 1.4038 1.5868 +v 0.1859 2.7171 1.5045 +v 0.1234 2.7171 1.5045 +v 0.1859 1.7171 1.4958 +v 0.1234 1.7171 1.4958 +v 0.1859 2.7166 1.567 +v 0.1234 2.7166 1.567 +v 0.1859 1.7166 1.5583 +v 0.1234 1.7166 1.5583 +vt 0.375 0.1875 +vt 0.375 0.5 +vt 0.125 0.5 +vt 0.125 0.1875 +vt 0.375 0.1875 +vt 0.375 0.5 +vt 0.125 0.5 +vt 0.125 0.1875 +vt 1 0.5 +vt 0.75 0.5 +vt 0.75 0 +vt 1 0 +vt 1 0.5 +vt 0.75 0.5 +vt 0.75 0 +vt 1 0 vt 1 1 -vt 0.953125 1 -vt 0.953125 0.828125 -vt 1 0.828125 -vt 1 0.421875 -vt 0.953125 0.421875 -vt 0.953125 0.25 -vt 1 0.25 -vt 0.828125 0.25 -vt 0.875 0.25 -vt 0.875 0.265625 -vt 0.828125 0.265625 -vt 0.75 0.96875 -vt 0.796875 0.96875 -vt 0.796875 1 -vt 0.75 1 +vt 0.6875 1 +vt 0.6875 0.5 +vt 1 0.5 vt 1 1 -vt 0.953125 1 -vt 0.953125 0.828125 -vt 1 0.828125 -vt 0.828125 0.140625 -vt 0.828125 0.15625 -vt 0.8125 0.15625 -vt 0.8125 0.140625 -vt 0.921875 0.140625 -vt 0.921875 0.15625 -vt 0.8125 0.15625 -vt 0.8125 0.140625 -vt 0.921875 0.140625 -vt 0.921875 0.15625 -vt 0.8125 0.15625 -vt 0.8125 0.140625 -vt 0.921875 0.140625 -vt 0.921875 0.15625 -vt 0.8125 0.15625 -vt 0.8125 0.140625 -vt 0.828125 0.140625 -vt 0.828125 0.15625 -vt 0.8125 0.15625 -vt 0.8125 0.140625 -vt 0.921875 0.140625 -vt 0.921875 0.15625 -vt 0.8125 0.15625 -vt 0.8125 0.140625 -vt 0.921875 0.140625 -vt 0.921875 0.15625 -vt 0.8125 0.15625 -vt 0.8125 0.140625 -vt 0.921875 0.140625 -vt 0.921875 0.15625 -vt 0.8125 0.15625 -vt 0.8125 0.140625 -vt 0.109375 1 -vt 0.109375 0.84375 -vt 0.015625 0.84375 -vt 0.015625 1 -vt 0.109375 0.40625 -vt 0.109375 0.25 -vt 0.015625 0.25 -vt 0.015625 0.40625 -vt 0.09375 1 -vt 0.09375 0.984375 -vt 0 0.984375 -vt 0 1 -vt 0.03125 0.984375 -vt 0.03125 1 -vt 0.125 1 -vt 0.125 0.984375 -vt 0.109375 0.390625 -vt 0.109375 0.25 -vt 0.015625 0.25 -vt 0.015625 0.390625 -vt 0.109375 1 -vt 0.109375 0.859375 -vt 0.015625 0.859375 -vt 0.015625 1 -vt 0.703125 0.25 -vt 0.703125 0.390625 -vt 0.734375 0.390625 -vt 0.734375 0.25 -vt 0.078125 0.984375 -vt 0.078125 1 -vt 0.109375 1 -vt 0.109375 0.984375 -vt 0.71875 0.859375 -vt 0.71875 1 -vt 0.75 1 -vt 0.75 0.859375 -vt 0.71875 0.25 -vt 0.71875 0.40625 -vt 0.75 0.40625 -vt 0.75 0.25 -vt 0.03125 1 -vt 0.03125 0.984375 -vt 0 0.984375 -vt 0 1 -vt 0.703125 0.84375 -vt 0.703125 1 -vt 0.734375 1 -vt 0.734375 0.84375 -vt 0.03125 0.75 +vt 0.6875 1 +vt 0.6875 0.5 +vt 1 0.5 +vt 0.8125 0.3125 +vt 0.8125 0.5 +vt 0.75 0.5 +vt 0.75 0.3125 +vt 0.875 0.3125 +vt 0.875 0.5 +vt 0.8125 0.5 +vt 0.8125 0.3125 +vt 0.75 0.4375 +vt 0.75 0.5 +vt 0.875 0.5 +vt 0.875 0.4375 +vt 0.75 0.3125 +vt 0.75 0.375 +vt 0.875 0.375 +vt 0.875 0.3125 +vt 0.875 0.3125 +vt 0.875 0.5 +vt 0.75 0.5 +vt 0.75 0.3125 +vt 0.1875 0.625 +vt 0.1875 0.6875 +vt 0 0.6875 +vt 0 0.625 +vt 0.375 0.625 +vt 0.375 0.6875 +vt 0.1875 0.6875 +vt 0.1875 0.625 +vt 0.4375 0.6875 +vt 0.4375 0.75 vt 0 0.75 -vt 0 0.71875 -vt 0.03125 0.71875 -vt 0.03125 0.59375 -vt 0 0.59375 -vt 0 0.5625 -vt 0.03125 0.5625 -vt 0.03125 0.71875 -vt 0 0.71875 -vt 0 0.59375 -vt 0.03125 0.59375 -vt 0.03125 0.75 -vt 0 0.75 -vt 0 0.5625 -vt 0.03125 0.5625 -vt 0.03125 0.75 -vt 0 0.71875 -vt 0 0.59375 -vt 0.03125 0.5625 -vt 0 0.5625 -vt 0.03125 0.59375 -vt 0.03125 0.71875 -vt 0 0.75 -vt 0.0625 0.6875 -vt 0.0625 0.71875 -vt 0.03125 0.71875 -vt 0.03125 0.6875 -vt 0.0625 0.6875 -vt 0.0625 0.71875 -vt 0.03125 0.71875 -vt 0.03125 0.6875 -vt 0.0625 0.6875 -vt 0.0625 0.71875 -vt 0.03125 0.71875 -vt 0.03125 0.6875 -vt 0.0625 0.6875 -vt 0.0625 0.71875 -vt 0.03125 0.71875 -vt 0.03125 0.6875 -vt 0.0625 0.5625 -vt 0.0625 0.59375 -vt 0.03125 0.59375 -vt 0.03125 0.5625 -vt 0.0625 0.5625 -vt 0.0625 0.59375 -vt 0.03125 0.59375 -vt 0.03125 0.5625 -vt 0.0625 0.5625 -vt 0.0625 0.59375 -vt 0.03125 0.59375 -vt 0.03125 0.5625 -vt 0.0625 0.5625 -vt 0.0625 0.59375 -vt 0.03125 0.59375 -vt 0.03125 0.5625 -vt 0.03125 0.75 -vt 0 0.75 -vt 0 0.71875 -vt 0.03125 0.71875 -vt 0.03125 0.59375 -vt 0 0.59375 -vt 0 0.5625 -vt 0.03125 0.5625 -vt 0.03125 0.71875 -vt 0 0.71875 -vt 0 0.59375 -vt 0.03125 0.59375 -vt 0.03125 0.75 -vt 0 0.75 -vt 0 0.5625 -vt 0.03125 0.5625 -vt 0.03125 0.75 -vt 0 0.71875 -vt 0 0.59375 -vt 0.03125 0.5625 +vt 0 0.6875 +vt 0.4375 0.5625 +vt 0.4375 0.625 +vt 0 0.625 vt 0 0.5625 -vt 0.03125 0.59375 -vt 0.03125 0.71875 +vt 0.25 0.75 +vt 0.25 1 +vt 0 1 vt 0 0.75 -vt 0.0625 0.6875 -vt 0.0625 0.71875 -vt 0.03125 0.71875 -vt 0.03125 0.6875 -vt 0.0625 0.6875 -vt 0.0625 0.71875 -vt 0.03125 0.71875 -vt 0.03125 0.6875 -vt 0.0625 0.6875 -vt 0.0625 0.71875 -vt 0.03125 0.71875 -vt 0.03125 0.6875 -vt 0.0625 0.6875 -vt 0.0625 0.71875 -vt 0.03125 0.71875 -vt 0.03125 0.6875 -vt 0.0625 0.5625 -vt 0.0625 0.59375 -vt 0.03125 0.59375 -vt 0.03125 0.5625 -vt 0.0625 0.5625 -vt 0.0625 0.59375 -vt 0.03125 0.59375 -vt 0.03125 0.5625 -vt 0.0625 0.5625 -vt 0.0625 0.59375 -vt 0.03125 0.59375 -vt 0.03125 0.5625 -vt 0.0625 0.5625 -vt 0.0625 0.59375 -vt 0.03125 0.59375 -vt 0.03125 0.5625 -vt 0.75 0.96875 -vt 0.921875 0.96875 -vt 0.921875 1 -vt 0.75 1 -vt 0.75 0.828125 -vt 0.8125 0.828125 -vt 0.8125 1 -vt 0.75 1 -vt 0.75 0.25 -vt 0.8125 0.25 -vt 0.8125 0.421875 -vt 0.75 0.421875 -vt 0.75 0.96875 -vt 0.8125 0.96875 -vt 0.8125 1 -vt 0.75 1 +vt 1 0.75 vt 1 1 -vt 0.9375 1 -vt 0.9375 0.96875 -vt 1 0.96875 -vt 0.75 0.25 -vt 0.921875 0.25 -vt 0.921875 0.265625 -vt 0.75 0.265625 -vt 0.953125 0.265625 -vt 0.890625 0.265625 -vt 0.890625 0.25 -vt 0.953125 0.25 -vt 0.765625 0.25 -vt 0.828125 0.25 -vt 0.828125 0.265625 -vt 0.765625 0.265625 -vt 1 0.265625 -vt 0.828125 0.265625 -vt 0.828125 0.25 -vt 1 0.25 -vt 0.75 0.828125 -vt 0.8125 0.828125 -vt 0.8125 1 vt 0.75 1 -vt 0.75 0.25 -vt 0.8125 0.25 -vt 0.8125 0.421875 -vt 0.75 0.421875 -vt 1 1 -vt 0.828125 1 -vt 0.828125 0.96875 -vt 1 0.96875 -vt 1 0.421875 -vt 0.953125 0.421875 -vt 0.953125 0.25 -vt 1 0.25 -vt 1 1 -vt 0.953125 1 -vt 0.953125 0.96875 -vt 1 0.96875 -vt 1 0.265625 -vt 0.953125 0.265625 -vt 0.953125 0.25 -vt 1 0.25 -vt 1 1 -vt 0.953125 1 -vt 0.953125 0.828125 -vt 1 0.828125 -vt 1 0.421875 -vt 0.953125 0.421875 -vt 0.953125 0.25 -vt 1 0.25 -vt 0.828125 0.25 -vt 0.875 0.25 -vt 0.875 0.265625 -vt 0.828125 0.265625 -vt 0.75 0.96875 -vt 0.796875 0.96875 -vt 0.796875 1 +vt 0.75 0.75 +vt 0.75 0.75 vt 0.75 1 -vt 1 1 -vt 0.953125 1 -vt 0.953125 0.828125 -vt 1 0.828125 -vt 0.828125 0.140625 -vt 0.828125 0.15625 -vt 0.8125 0.15625 -vt 0.8125 0.140625 -vt 0.921875 0.140625 -vt 0.921875 0.15625 -vt 0.8125 0.15625 -vt 0.8125 0.140625 -vt 0.921875 0.140625 -vt 0.921875 0.15625 -vt 0.8125 0.15625 -vt 0.8125 0.140625 -vt 0.921875 0.140625 -vt 0.921875 0.15625 -vt 0.8125 0.15625 -vt 0.8125 0.140625 -vt 0.09375 0.390625 -vt 0.09375 0.484375 -vt 0.1875 0.484375 -vt 0.1875 0.390625 -vt 0.109375 0.484375 -vt 0.109375 0.390625 -vt 0.09375 0.390625 -vt 0.09375 0.484375 -vt 0.1875 0.390625 -vt 0.1875 0.484375 -vt 0.171875 0.484375 -vt 0.171875 0.390625 -vt 0.109375 0.390625 -vt 0.109375 0.484375 -vt 0.09375 0.484375 -vt 0.09375 0.390625 -vt 0.1875 0.390625 -vt 0.1875 0.484375 -vt 0.171875 0.484375 -vt 0.171875 0.390625 -vt 0.015625 0.84375 -vt 0.109375 0.84375 -vt 0.109375 1 -vt 0.015625 1 -vt 0.015625 0.25 -vt 0.109375 0.25 -vt 0.109375 0.40625 -vt 0.015625 0.40625 -vt 0 0.984375 -vt 0.09375 0.984375 -vt 0.09375 1 -vt 0 1 -vt 0.125 1 -vt 0.03125 1 -vt 0.03125 0.984375 -vt 0.125 0.984375 -vt 0.015625 0.25 -vt 0.109375 0.25 -vt 0.109375 0.390625 -vt 0.015625 0.390625 -vt 0.015625 0.859375 -vt 0.109375 0.859375 -vt 0.109375 1 -vt 0.015625 1 -vt 0.734375 0.390625 -vt 0.703125 0.390625 -vt 0.703125 0.25 -vt 0.734375 0.25 -vt 0.109375 1 -vt 0.078125 1 -vt 0.078125 0.984375 -vt 0.109375 0.984375 +vt 0.25 1 +vt 0.25 0.75 +vt 1 0.5 +vt 1 0.75 +vt 0.5 0.75 +vt 0.5 0.5 +vt 0.75 0.75 vt 0.75 1 -vt 0.71875 1 -vt 0.71875 0.859375 -vt 0.75 0.859375 -vt 0.75 0.40625 -vt 0.71875 0.40625 -vt 0.71875 0.25 -vt 0.75 0.25 -vt 0 0.984375 -vt 0.03125 0.984375 -vt 0.03125 1 -vt 0 1 -vt 0.734375 1 -vt 0.703125 1 -vt 0.703125 0.84375 -vt 0.734375 0.84375 -vt 0.03125 0.75 -vt 0 0.75 -vt 0 0.71875 -vt 0.03125 0.71875 -vt 0.03125 0.59375 -vt 0 0.59375 -vt 0 0.5625 -vt 0.03125 0.5625 -vt 0.03125 0.71875 -vt 0 0.71875 -vt 0 0.59375 -vt 0.03125 0.59375 -vt 0.03125 0.75 -vt 0 0.75 -vt 0 0.5625 -vt 0.03125 0.5625 -vt 0.03125 0.75 -vt 0 0.71875 -vt 0 0.59375 -vt 0.03125 0.5625 -vt 0 0.5625 -vt 0.03125 0.59375 -vt 0.03125 0.71875 -vt 0 0.75 -vt 0.0625 0.6875 -vt 0.0625 0.71875 -vt 0.03125 0.71875 -vt 0.03125 0.6875 -vt 0.0625 0.6875 -vt 0.0625 0.71875 -vt 0.03125 0.71875 -vt 0.03125 0.6875 -vt 0.0625 0.6875 -vt 0.0625 0.71875 -vt 0.03125 0.71875 -vt 0.03125 0.6875 -vt 0.0625 0.6875 -vt 0.0625 0.71875 -vt 0.03125 0.71875 -vt 0.03125 0.6875 -vt 0.0625 0.5625 -vt 0.0625 0.59375 -vt 0.03125 0.59375 -vt 0.03125 0.5625 -vt 0.0625 0.5625 -vt 0.0625 0.59375 -vt 0.03125 0.59375 -vt 0.03125 0.5625 -vt 0.0625 0.5625 -vt 0.0625 0.59375 -vt 0.03125 0.59375 -vt 0.03125 0.5625 -vt 0.0625 0.5625 -vt 0.0625 0.59375 -vt 0.03125 0.59375 -vt 0.03125 0.5625 -vt 0.03125 0.75 -vt 0 0.75 -vt 0 0.71875 -vt 0.03125 0.71875 -vt 0.03125 0.59375 -vt 0 0.59375 -vt 0 0.5625 -vt 0.03125 0.5625 -vt 0.03125 0.71875 -vt 0 0.71875 -vt 0 0.59375 -vt 0.03125 0.59375 -vt 0.03125 0.75 -vt 0 0.75 -vt 0 0.5625 -vt 0.03125 0.5625 -vt 0.03125 0.75 -vt 0 0.71875 -vt 0 0.59375 -vt 0.03125 0.5625 -vt 0 0.5625 -vt 0.03125 0.59375 -vt 0.03125 0.71875 -vt 0 0.75 -vt 0.0625 0.6875 -vt 0.0625 0.71875 -vt 0.03125 0.71875 -vt 0.03125 0.6875 -vt 0.0625 0.6875 -vt 0.0625 0.71875 -vt 0.03125 0.71875 -vt 0.03125 0.6875 -vt 0.0625 0.6875 -vt 0.0625 0.71875 -vt 0.03125 0.71875 -vt 0.03125 0.6875 -vt 0.0625 0.6875 -vt 0.0625 0.71875 -vt 0.03125 0.71875 -vt 0.03125 0.6875 -vt 0.0625 0.5625 -vt 0.0625 0.59375 -vt 0.03125 0.59375 -vt 0.03125 0.5625 -vt 0.0625 0.5625 -vt 0.0625 0.59375 -vt 0.03125 0.59375 -vt 0.03125 0.5625 -vt 0.0625 0.5625 -vt 0.0625 0.59375 -vt 0.03125 0.59375 -vt 0.03125 0.5625 -vt 0.0625 0.5625 -vt 0.0625 0.59375 -vt 0.03125 0.59375 -vt 0.03125 0.5625 -vt 0.828125 0.140625 -vt 0.828125 0.15625 -vt 0.8125 0.15625 -vt 0.8125 0.140625 -vt 0.921875 0.140625 -vt 0.921875 0.15625 -vt 0.8125 0.15625 -vt 0.8125 0.140625 -vt 0.921875 0.140625 -vt 0.921875 0.15625 -vt 0.8125 0.15625 -vt 0.8125 0.140625 -vt 0.921875 0.140625 -vt 0.921875 0.15625 -vt 0.8125 0.15625 -vt 0.8125 0.140625 -vt 1 0.53125 -vt 1 0.65625 -vt 0.625 0.65625 -vt 0.625 0.53125 -vt 1 0.5625 -vt 1 1 -vt 0.625 1 -vt 0.625 0.5625 -vt 0.65625 0.5625 -vt 0.65625 1 -vt 0.53125 1 -vt 0.53125 0.5625 -vt 0.96875 0.0625 -vt 0.96875 0.09375 -vt 0.71875 0.09375 -vt 0.71875 0.0625 -vt 0.71875 0.09375 -vt 0.71875 0.0625 -vt 0.96875 0.0625 -vt 0.96875 0.09375 -vt 0.96875 0.0625 -vt 0.96875 0.28125 -vt 0.71875 0.28125 -vt 0.71875 0.0625 -vt 0.96875 0.0625 -vt 0.96875 0.125 -vt 0.71875 0.125 -vt 0.71875 0.0625 -vt 0.71875 0.28125 -vt 0.71875 0.21875 -vt 0.96875 0.21875 -vt 0.96875 0.28125 -vt 0.046875 0.515625 -vt 0.046875 0.578125 -vt 0.03125 0.578125 -vt 0.03125 0.515625 -vt 0.09375 0.515625 -vt 0.09375 0.578125 -vt 0.078125 0.578125 -vt 0.078125 0.515625 -vt 0.03125 0.5625 -vt 0.03125 0.578125 -vt 0.09375 0.578125 -vt 0.09375 0.5625 -vt 0.03125 0.515625 -vt 0.03125 0.53125 -vt 0.09375 0.53125 -vt 0.09375 0.515625 -vt 0.09375 0.515625 -vt 0.09375 0.578125 -vt 0.03125 0.578125 -vt 0.03125 0.515625 -vt 0.78125 0.0625 -vt 0.875 0.0625 -vt 0.875 0.28125 -vt 0.78125 0.28125 -vt 0.8125 0.0625 -vt 0.90625 0.0625 -vt 0.90625 0.28125 -vt 0.8125 0.28125 -vt 0.65625 0.25 -vt 0.65625 0.3125 -vt 0.59375 0.3125 -vt 0.59375 0.25 -vt 0.65625 0.28125 -vt 0.59375 0.28125 -vt 0.59375 0.3125 -vt 0.65625 0.3125 -vt 0.90625 0.4375 -vt 0.90625 0.5 -vt 0.96875 0.5 -vt 0.96875 0.4375 -vt 0.59375 0.28125 -vt 0.59375 0.34375 -vt 0.65625 0.34375 -vt 0.65625 0.28125 -vt 0.4375 0.5 -vt 0.4375 0.6875 -vt 0.34375 0.6875 -vt 0.34375 0.5 -vt 0.4375 0.5 -vt 0.4375 0.6875 -vt 0.34375 0.6875 -vt 0.34375 0.5 -vt 0.34375 0.65625 -vt 0.34375 0.75 -vt 0.4375 0.75 -vt 0.4375 0.65625 -vt 0.34375 0.65625 -vt 0.34375 0.75 +vt 0.25 1 vt 0.25 0.75 -vt 0.25 0.65625 -vt 0.34375 0.5 -vt 0.34375 0.6875 -vt 0.4375 0.6875 -vt 0.4375 0.5 -vt 0.34375 0.5 -vt 0.34375 0.6875 -vt 0.4375 0.6875 -vt 0.4375 0.5 -vt 0.15625 0.875 -vt 0.09375 0.875 -vt 0.09375 0.65625 -vt 0.15625 0.65625 -vt 0.09375 0.65625 -vt 0.15625 0.65625 -vt 0.15625 0.875 -vt 0.09375 0.875 -vt 0.09375 0.65625 -vt 0.09375 0.875 -vt 0.15625 0.875 -vt 0.15625 0.65625 -vt 0.15625 0.875 -vt 0.15625 0.65625 -vt 0.09375 0.65625 -vt 0.09375 0.875 -vt 0.09375 0.875 -vt 0.15625 0.875 -vt 0.15625 0.9375 -vt 0.09375 0.9375 -vt 0.1875 0.8125 -vt 0.1875 0.875 -vt 0.25 0.875 -vt 0.25 0.8125 -vt 0.21875 0.90625 -vt 0.21875 0.84375 -vt 0.28125 0.84375 -vt 0.28125 0.90625 -vt 0 0.90625 -vt 0.0625 0.90625 -vt 0.0625 0.9375 -vt 0 0.9375 -vt 0.015625 1 -vt 0.015625 0.890625 -vt 0.265625 0.890625 -vt 0.265625 1 -vt 0.28125 0.03125 -vt 0.28125 0.25 -vt 0.53125 0.25 -vt 0.53125 0.03125 -vt 0 1 -vt 0 0.75 -vt 0.015625 0.75 -vt 0.015625 1 -vt 0.53125 0.3125 -vt 0.53125 0.53125 -vt 0.59375 0.53125 -vt 0.59375 0.3125 -vt 0.53125 0.3125 -vt 0.53125 0.53125 -vt 0.59375 0.53125 -vt 0.59375 0.3125 -vt 0.65625 0.34375 -vt 0.65625 0.40625 -vt 0.59375 0.40625 -vt 0.59375 0.34375 -vt 0.59375 0.3125 -vt 0.59375 0.53125 -vt 0.53125 0.53125 -vt 0.53125 0.3125 -vt 0.59375 0.3125 -vt 0.59375 0.53125 -vt 0.53125 0.53125 -vt 0.53125 0.3125 -vt 0.59375 0.46875 -vt 0.59375 0.40625 -vt 0.75 0.40625 -vt 0.71875 0.46875 -vt 0.71875 0.46875 -vt 0.75 0.53125 -vt 0.59375 0.53125 -vt 0.59375 0.46875 -vt 0.53125 0.34375 -vt 0.53125 0.1875 -vt 0.59375 0.1875 -vt 0.59375 0.34375 -vt 0.59375 0.1875 -vt 0.59375 0.3125 -vt 0.53125 0.3125 -vt 0.53125 0.1875 -vt 0.59375 0.34375 -vt 0.59375 0.40625 -vt 0.53125 0.40625 -vt 0.53125 0.34375 -vt 1 0 -vt 0.640625 0 -vt 0.640625 0.03125 -vt 1 0.03125 -vt 1 0.03125 -vt 0.640625 0.03125 -vt 0.640625 0 -vt 1 0 -vt 0.75 0.25 -vt 0.890625 0.25 -vt 0.890625 0.609375 -vt 0.75 0.609375 -vt 0.75 0.640625 -vt 0.890625 0.640625 -vt 0.890625 1 +vt 0.75 0.75 vt 0.75 1 -vt 0 0.75 -vt 0.140625 0.75 -vt 0.140625 0.78125 -vt 0 0.78125 -vt 0.75 0.328125 -vt 0.890625 0.328125 -vt 0.890625 0.6875 -vt 0.75 0.6875 -vt 0.28125 0 -vt 0.640625 0 -vt 0.640625 0.03125 -vt 0.28125 0.03125 -vt 0.75 0.609375 -vt 0.890625 0.609375 -vt 0.890625 0.96875 -vt 0.75 0.96875 -vt 0.28125 0.03125 -vt 0.640625 0.03125 -vt 0.640625 0 -vt 0.28125 0 -vt 1 0.6875 -vt 0.859375 0.6875 -vt 0.859375 0.328125 -vt 1 0.328125 -vt 1 0.984375 -vt 0.859375 0.984375 -vt 0.859375 0.625 -vt 1 0.625 -vt 1 0.609375 -vt 0.859375 0.609375 -vt 0.859375 0.25 -vt 1 0.25 -vt 0.28125 0.78125 -vt 0.140625 0.78125 -vt 0.140625 0.75 -vt 0.28125 0.75 -vt 1 1 -vt 0.859375 1 -vt 0.859375 0.640625 -vt 1 0.640625 +vt 0.25 1 +vt 0.25 0.75 +vt 0.9375 0.3125 +vt 0.9375 0.5 +vt 0.875 0.5 +vt 0.875 0.3125 +vt 1 0.3125 +vt 1 0.5 +vt 0.9375 0.5 +vt 0.9375 0.3125 +vt 0.875 0.4375 +vt 0.875 0.5 +vt 1 0.5 +vt 1 0.4375 +vt 0.875 0.3125 +vt 0.875 0.375 +vt 1 0.375 +vt 1 0.3125 +vt 1 0.3125 +vt 1 0.5 +vt 0.875 0.5 +vt 0.875 0.3125 vt 0.75 0 -vt 0.75 0.203125 -vt 0.5 0.203125 -vt 0.5 0 -vt 0.625 0.09375 -vt 0.625 0.125 -vt 0.6875 0.125 -vt 0.6875 0.09375 -vt 0.6875 0.125 -vt 0.6875 0.15625 -vt 0.625 0.15625 -vt 0.625 0.125 -vt 0.6875 0.09375 -vt 0.6875 0.15625 -vt 0.625 0.15625 -vt 0.625 0.09375 -vt 0.6875 0.15625 -vt 0.6875 0.09375 -vt 0.625 0.09375 -vt 0.625 0.15625 -vt 0.6875 0.09375 -vt 0.6875 0.125 -vt 0.625 0.125 -vt 0.625 0.09375 -vt 0.625 0.125 -vt 0.625 0.15625 -vt 0.6875 0.15625 -vt 0.6875 0.125 -vt 0.625 0.09375 -vt 0.625 0.125 -vt 0.6875 0.125 -vt 0.6875 0.09375 -vt 0.6875 0.125 -vt 0.6875 0.15625 -vt 0.625 0.15625 -vt 0.625 0.125 -vt 0.6875 0.09375 -vt 0.6875 0.15625 -vt 0.625 0.15625 -vt 0.625 0.09375 -vt 0.6875 0.15625 -vt 0.6875 0.09375 -vt 0.625 0.09375 -vt 0.625 0.15625 -vt 0.6875 0.09375 -vt 0.6875 0.125 -vt 0.625 0.125 -vt 0.625 0.09375 -vt 0.625 0.125 -vt 0.625 0.15625 -vt 0.6875 0.15625 -vt 0.6875 0.125 -vt 0.40625 1 -vt 0.40625 0.953125 -vt 0.265625 0.953125 -vt 0.265625 1 -vt 0.40625 1 -vt 0.40625 0.953125 -vt 0.265625 0.953125 -vt 0.265625 1 -vt 0.53125 0.1875 -vt 0.53125 0.46875 -vt 0.40625 0.46875 -vt 0.40625 0.1875 -vt 1 1 -vt 0.953125 1 -vt 0.953125 0.90625 -vt 1 0.90625 -vt 0.984375 1 -vt 0.984375 0.953125 -vt 1 0.953125 -vt 1 1 -vt 0.984375 1 -vt 0.984375 0.90625 -vt 1 0.90625 -vt 1 1 -vt 0.984375 1 -vt 0.984375 0.90625 -vt 1 0.90625 -vt 1 1 -vt 1 0.328125 -vt 0.953125 0.328125 -vt 0.953125 0.25 -vt 1 0.25 -vt 1 0.828125 -vt 1 0.90625 -vt 0.984375 0.90625 -vt 0.984375 0.828125 -vt 1 0.828125 -vt 1 0.90625 -vt 0.984375 0.90625 -vt 0.984375 0.828125 -vt 0.75 0.90625 -vt 0.796875 0.90625 -vt 0.796875 1 -vt 0.75 1 -vt 1 0.90625 -vt 1 0.953125 -vt 0.984375 0.953125 -vt 0.984375 0.90625 -vt 0.75 0.25 -vt 0.796875 0.25 -vt 0.796875 0.328125 -vt 0.75 0.328125 -vt 0.953125 0.90625 -vt 0.953125 1 -vt 1 1 -vt 1 0.90625 -vt 1 0.953125 -vt 0.984375 0.953125 -vt 0.984375 1 -vt 1 1 -vt 1 0.90625 -vt 0.984375 0.90625 -vt 0.984375 1 -vt 1 1 -vt 1 0.90625 -vt 0.984375 0.90625 -vt 0.984375 1 -vt 1 1 -vt 0.953125 0.25 -vt 0.953125 0.328125 -vt 1 0.328125 -vt 1 0.25 -vt 0.984375 0.90625 -vt 1 0.90625 -vt 1 0.828125 -vt 0.984375 0.828125 -vt 0.984375 0.90625 -vt 1 0.90625 -vt 1 0.828125 -vt 0.984375 0.828125 -vt 0.796875 1 -vt 0.796875 0.90625 -vt 0.75 0.90625 -vt 0.75 1 -vt 0.984375 0.953125 -vt 1 0.953125 -vt 1 0.90625 -vt 0.984375 0.90625 -vt 0.796875 0.328125 -vt 0.796875 0.25 -vt 0.75 0.25 -vt 0.75 0.328125 -vt 0.28125 0.1875 -vt 0.34375 0.1875 -vt 0.34375 0.3125 -vt 0.28125 0.3125 -vt 0.28125 0.1875 -vt 0.34375 0.1875 -vt 0.34375 0.3125 -vt 0.28125 0.3125 -vt 0.0625 0.1875 -vt 0.0625 0.3125 -vt 0 0.3125 -vt 0 0.1875 -vt 0.1875 0.1875 -vt 0.1875 0.3125 -vt 0.125 0.3125 -vt 0.125 0.1875 -vt 0.40625 0.3125 -vt 0.34375 0.3125 -vt 0.34375 0.1875 -vt 0.40625 0.1875 -vt 0.40625 0.3125 -vt 0.34375 0.3125 -vt 0.34375 0.1875 -vt 0.40625 0.1875 -vt 0.125 0.5625 +vt 0.75 0.1875 +vt 0.5625 0.1875 +vt 0.5625 0 +vt 0.75 0.1875 +vt 0.5625 0.1875 +vt 0.5625 0.125 +vt 0.75 0.125 +vt 0.5625 0.0625 +vt 0.75 0.0625 +vt 0.75 0 +vt 0.5625 0 +vt 0.75 0 +vt 0.75 0.1875 +vt 0.6875 0.1875 +vt 0.6875 0 +vt 0.625 0 +vt 0.625 0.1875 +vt 0.5625 0.1875 +vt 0.5625 0 +vt 0 0.125 +vt 0 0.4375 vt 0.125 0.4375 -vt 0.1875 0.4375 -vt 0.1875 0.5625 +vt 0.125 0.125 +vt 0 0.125 +vt 0 0.4375 +vt 0.125 0.4375 +vt 0.125 0.125 +vt 0.125 0.4375 +vt 0.125 0.5625 vt 0 0.5625 vt 0 0.4375 -vt 0.0625 0.4375 -vt 0.0625 0.5625 -vt 0.734375 0.21875 -vt 0.734375 0.265625 -vt 0.6875 0.265625 -vt 0.6875 0.21875 -vt 0.703125 0.21875 -vt 0.703125 0.265625 -vt 0.6875 0.265625 -vt 0.6875 0.21875 -vt 0.734375 0.21875 -vt 0.734375 0.265625 -vt 0.71875 0.265625 -vt 0.71875 0.21875 -vt 0.734375 0.21875 -vt 0.734375 0.265625 -vt 0.71875 0.265625 -vt 0.71875 0.21875 -vt 0.703125 0.21875 -vt 0.703125 0.265625 -vt 0.6875 0.265625 -vt 0.6875 0.21875 -vt 0 1 -vt 0 0.96875 -vt 0.046875 0.96875 -vt 0.046875 1 -vt 0.953125 1 -vt 0.953125 0.96875 -vt 1 0.96875 -vt 1 1 -vt 0 1 -vt 0 0.96875 -vt 0.0859375 0.96875 -vt 0.0859375 1 -vt 0.9140625 1 -vt 0.9140625 0.96875 -vt 1 0.96875 -vt 1 1 -vt 0.9375 1 -vt 0.9375 0.96875 -vt 1 0.96875 -vt 1 1 -vt 0 1 -vt 0 0.96875 -vt 0.0625 0.96875 -vt 0.0625 1 -vt 0.0859375 0 -vt 0.0859375 0.015625 -vt 0 0.015625 -vt 0 0 -vt 1 0 -vt 1 0.015625 -vt 0.9375 0.015625 -vt 0.9375 0 -vt 0.046875 0 -vt 0.046875 0.015625 -vt 0 0.015625 -vt 0 0 -vt 1 0 -vt 1 0.015625 -vt 0.953125 0.015625 -vt 0.953125 0 -vt 0.0625 0 -vt 0.0625 0.015625 -vt 0 0.015625 +vt 0.125 0 +vt 0.125 0.125 +vt 0 0.125 vt 0 0 -vt 1 0 -vt 1 0.015625 -vt 0.9140625 0.015625 -vt 0.9140625 0 -vt 0.125 0.5 -vt 0.125 0.5625 -vt 0.0625 0.5625 -vt 0.0625 0.5 -vt 0.09375 0.5 -vt 0.09375 0.5625 -vt 0.0625 0.5625 -vt 0.0625 0.5 -vt 0.09375 0.5625 -vt 0.09375 0.5 -vt 0.0625 0.5 -vt 0.0625 0.5625 -vt 0.09375 0.5 -vt 0.09375 0.5625 -vt 0.0625 0.5625 -vt 0.0625 0.5 -vt 0.0625 0.5 -vt 0.0625 0.5625 -vt 0.125 0.5625 -vt 0.125 0.5 -vt 0.125 0.5 -vt 0.125 0.5625 -vt 0.0625 0.5625 -vt 0.0625 0.5 -vt 0.09375 0.5 -vt 0.09375 0.5625 -vt 0.0625 0.5625 -vt 0.0625 0.5 -vt 0.09375 0.5625 -vt 0.09375 0.5 -vt 0.0625 0.5 -vt 0.0625 0.5625 -vt 0.09375 0.5 -vt 0.09375 0.5625 -vt 0.0625 0.5625 -vt 0.0625 0.5 -vt 0.25 0.3125 -vt 0.25 0.375 -vt 0.3125 0.375 -vt 0.3125 0.3125 -vt 0.3125 0.3125 -vt 0.3125 0.375 -vt 0.25 0.375 -vt 0.25 0.3125 -vt 0.28125 0.3125 -vt 0.28125 0.375 -vt 0.25 0.375 -vt 0.25 0.3125 -vt 0.28125 0.375 -vt 0.28125 0.3125 -vt 0.25 0.3125 -vt 0.25 0.375 -vt 0.28125 0.3125 -vt 0.28125 0.375 -vt 0.25 0.375 -vt 0.25 0.3125 -vt 0.25 0.3125 -vt 0.25 0.375 -vt 0.3125 0.375 -vt 0.3125 0.3125 -vt 0.3125 0.3125 -vt 0.3125 0.375 -vt 0.25 0.375 -vt 0.25 0.3125 -vt 0.28125 0.3125 -vt 0.28125 0.375 -vt 0.25 0.375 -vt 0.25 0.3125 -vt 0.28125 0.375 -vt 0.28125 0.3125 -vt 0.25 0.3125 -vt 0.25 0.375 -vt 0.28125 0.3125 -vt 0.28125 0.375 -vt 0.25 0.375 -vt 0.25 0.3125 -vt 0.046875 0.984375 -vt 0.046875 1 -vt 0 1 -vt 0 0.984375 -vt 0.046875 0.984375 -vt 0.046875 1 -vt 0 1 -vt 0 0.984375 -vt 0.015625 0.953125 -vt 0.015625 1 -vt 0 1 -vt 0 0.953125 -vt 0.015625 0.953125 -vt 0.015625 1 -vt 0 1 -vt 0 0.953125 -vt 0.546875 0.046875 -vt 0.578125 0.046875 -vt 0.578125 0 -vt 0.546875 0 -vt 0.578125 0 -vt 0.546875 0 -vt 0.546875 0.046875 -vt 0.578125 0.046875 -vt 0.578125 0 -vt 0.578125 0.046875 -vt 0.546875 0.046875 -vt 0.546875 0 -vt 0.546875 0.046875 -vt 0.546875 0 -vt 0.578125 0 -vt 0.578125 0.046875 -vt 0.59375 0.015625 -vt 0.59375 0.046875 -vt 0.5625 0.046875 -vt 0.5625 0.015625 -vt 0.59375 0.015625 -vt 0.59375 0.046875 -vt 0.5625 0.046875 -vt 0.5625 0.015625 -vt 0.828125 0.28125 -vt 0.828125 0.21875 -vt 0.84375 0.21875 -vt 0.84375 0.28125 -vt 0.828125 0.28125 -vt 0.828125 0.21875 -vt 0.84375 0.21875 -vt 0.84375 0.28125 -vt 0.125 0.984375 -vt 0.265625 0.984375 -vt 0.265625 1 -vt 0.125 1 -vt 0.28125 0.9375 -vt 0.421875 0.9375 -vt 0.421875 1 -vt 0.28125 1 -vt 0.5 0.25 -vt 0.359375 0.25 -vt 0.359375 0.1875 -vt 0.5 0.1875 -vt 0.28125 0.75 -vt 0.421875 0.75 -vt 0.421875 0.9375 -vt 0.28125 0.9375 -vt 0.84375 0.03125 -vt 0.84375 0.21875 -vt 0.828125 0.21875 -vt 0.828125 0.03125 -vt 0.5 0.1875 -vt 0.359375 0.1875 -vt 0.359375 0 -vt 0.5 0 -vt 0.84375 0.03125 -vt 0.84375 0.21875 -vt 0.828125 0.21875 -vt 0.828125 0.03125 -vt 0.5625 0.9375 -vt 0.421875 0.9375 -vt 0.421875 0.75 -vt 0.5625 0.75 -vt 0 0 -vt 0.140625 0 -vt 0.140625 0.1875 -vt 0 0.1875 -vt 0 0.1875 -vt 0.140625 0.1875 -vt 0.140625 0.25 -vt 0 0.25 -vt 0.40625 1 -vt 0.265625 1 -vt 0.265625 0.984375 -vt 0.40625 0.984375 -vt 0.5625 1 -vt 0.421875 1 -vt 0.421875 0.9375 -vt 0.5625 0.9375 -vt 0.5625 0.234375 -vt 0.5625 0.21875 -vt 0.53125 0.21875 -vt 0.53125 0.234375 -vt 0.53125 0.03125 -vt 0.53125 0.21875 -vt 0.5625 0.21875 -vt 0.5625 0.03125 -vt 0.53125 0.234375 -vt 0.53125 0.25 -vt 0.5625 0.28125 -vt 0.5625 0.234375 -vt 0.5625 0.234375 -vt 0.5625 0.28125 -vt 0.53125 0.25 -vt 0.53125 0.234375 -vt 0.5625 1 -vt 0.421875 1 -vt 0.421875 0.953125 -vt 0.5625 0.953125 -vt 0 0.1875 -vt 0.140625 0.1875 -vt 0.140625 0.234375 -vt 0 0.234375 -vt 0.5625 0.953125 -vt 0.421875 0.953125 -vt 0.421875 0.9375 -vt 0.5625 0.9375 -vt 0.28125 0.953125 -vt 0.421875 0.953125 -vt 0.421875 1 -vt 0.28125 1 -vt 0.28125 0.9375 -vt 0.421875 0.9375 -vt 0.421875 0.953125 -vt 0.28125 0.953125 -vt 0.515625 0.234375 -vt 0.375 0.234375 -vt 0.375 0.1875 -vt 0.515625 0.1875 +vt 0.125 0.125 +vt 0.125 0.4375 +vt 0 0.4375 vt 0 0.125 -vt 0.140625 0.125 -vt 0.140625 0.25 -vt 0 0.25 -vt 0.5625 0.28125 -vt 0.703125 0.28125 -vt 0.703125 0.15625 -vt 0.5625 0.15625 -vt 0.015625 0.734375 -vt 0.015625 0.875 -vt 0 0.875 -vt 0 0.734375 -vt 0 0 -vt 0.140625 0 -vt 0.140625 0.125 +vt 0.125 0.125 +vt 0.125 0.4375 +vt 0 0.4375 vt 0 0.125 -vt 0.5625 0.15625 -vt 0.703125 0.15625 -vt 0.703125 0.03125 -vt 0.5625 0.03125 -vt 0.5 0.125 -vt 0.375 0.125 -vt 0.375 0 -vt 0.5 0 -vt 0.828125 0.03125 -vt 0.703125 0.03125 -vt 0.703125 0.15625 -vt 0.828125 0.15625 -vt 0.828125 0.15625 -vt 0.703125 0.15625 -vt 0.703125 0.28125 -vt 0.828125 0.28125 -vt 0 1 -vt 0 0.875 -vt 0.015625 0.875 -vt 0.015625 1 -vt 0.5 0.25 -vt 0.375 0.25 -vt 0.375 0.125 -vt 0.5 0.125 -vt 0.546875 0.734375 -vt 0.546875 0.9375 -vt 0.296875 0.9375 -vt 0.296875 0.734375 -vt 0.84375 0.03125 -vt 0.84375 0.234375 -vt 0.96875 0.234375 -vt 1 0.03125 -vt 1 0.03125 -vt 0.96875 0.234375 -vt 0.84375 0.234375 -vt 0.84375 0.03125 -vt 0.015625 0.875 -vt 0.015625 1 -vt 0 1 -vt 0 0.875 -vt 0.015625 0.794484375 -vt 0.015625 1 -vt 0 1 -vt 0 0.794484375 +vt 0.5625 0 +vt 0.5625 1 vt 0.5 1 -vt 0.5 0.890625 -vt 0.75 0.890625 -vt 0.75 1 -vt 0.53125 0.03125 -vt 0.53125 0.25 -vt 0.28125 0.25 -vt 0.28125 0.03125 -vt 0.015625 0.75 -vt 0.015625 1 -vt 0 1 -vt 0 0.75 -vt 0.53125 0.234375 -vt 0.53125 0.21875 -vt 0.5625 0.21875 -vt 0.5625 0.234375 -vt 0.5625 0.03125 -vt 0.5625 0.21875 -vt 0.53125 0.21875 -vt 0.53125 0.03125 -vt 0 0.125 -vt 0.140625 0.125 -vt 0.140625 0.25 -vt 0 0.25 -vt 0.828125 0.28125 -vt 0.6875 0.28125 -vt 0.6875 0.15625 -vt 0.828125 0.15625 -vt 0.015625 0.734375 -vt 0.015625 0.875 -vt 0 0.875 -vt 0 0.734375 -vt 0 0 -vt 0.140625 0 -vt 0.140625 0.125 -vt 0 0.125 -vt 0.828125 0.15625 -vt 0.6875 0.15625 -vt 0.6875 0.03125 -vt 0.828125 0.03125 -vt 0.5 0.125 -vt 0.375 0.125 -vt 0.375 0 vt 0.5 0 -vt 0.5625 0.03125 -vt 0.6875 0.03125 -vt 0.6875 0.15625 -vt 0.5625 0.15625 -vt 0.5625 0.15625 -vt 0.6875 0.15625 -vt 0.6875 0.28125 -vt 0.5625 0.28125 -vt 0 1 -vt 0 0.875 -vt 0.015625 0.875 -vt 0.015625 1 -vt 0.5 0.25 -vt 0.375 0.25 -vt 0.375 0.125 -vt 0.5 0.125 -vt 0.84375 0.03125 -vt 0.84375 0.234375 -vt 0.96875 0.234375 -vt 1 0.03125 -vt 0.015625 0.875 -vt 0.015625 1 -vt 0 1 -vt 0 0.875 -vt 0.015625 0.794484375 -vt 0.015625 1 -vt 0 1 -vt 0 0.794484375 -vt 1 0.03125 -vt 0.96875 0.234375 -vt 0.84375 0.234375 -vt 0.84375 0.03125 -vt 0.640625 0.203125 -vt 0.640625 0.265625 -vt 0.625 0.265625 -vt 0.625 0.203125 -vt 0.6875 0.25 -vt 0.6875 0.265625 -vt 0.625 0.265625 -vt 0.625 0.25 -vt 0.6875 0.203125 -vt 0.6875 0.265625 -vt 0.625 0.265625 -vt 0.625 0.203125 -vt 0.625 0.265625 -vt 0.6875 0.265625 -vt 0.6875 0.25 -vt 0.625 0.25 -vt 0.625 0.265625 -vt 0.6875 0.265625 -vt 0.6875 0.203125 -vt 0.625 0.203125 -vt 0.265625 0.265625 -vt 0.265625 0.375 -vt 0.015625 0.375 -vt 0.015625 0.265625 -vt 0.734375 0.265625 -vt 0.734375 0.375 -vt 0.484375 0.375 -vt 0.484375 0.265625 +vt 0.5625 0 +vt 0.5625 1 vt 0.5 1 -vt 0.5 0.78125 -vt 0 0.78125 -vt 0 1 -vt 0.5 0.78125 +vt 0.5 0 +vt 0.5625 0.9375 +vt 0.5625 1 vt 0.5 1 -vt 0 1 -vt 0 0.78125 -vt 0.5 0.75 -vt 0.5 0.8125 -vt 0 0.8125 -vt 0 0.75 -vt 0.25 0.25 -vt 0.25 0.125 -vt 0.28125 0.125 -vt 0.28125 0.25 -vt 0 1 -vt 0.140625 1 -vt 0.140625 0.96875 -vt 0 0.96875 -vt 1 0.96875 -vt 0.859375 0.96875 -vt 0.859375 1 -vt 1 1 -vt 0.75 1 -vt 0.609375 1 -vt 0.609375 0.875 -vt 0.75 0.875 -vt 0 0.875 -vt 0.140625 0.875 -vt 0.140625 1 -vt 0 1 -vt 0 0.75 -vt 0.140625 0.75 -vt 0.140625 0.875 -vt 0 0.875 -vt 0.75 0.359375 -vt 0.609375 0.359375 -vt 0.609375 0.234375 -vt 0.75 0.234375 -vt 0.28125 0 -vt 0.28125 0.125 -vt 0.25 0.125 -vt 0.25 0 -vt 0.28125 0.875 -vt 0.140625 0.875 -vt 0.140625 0.75 -vt 0.28125 0.75 -vt 0.75 1 -vt 0.890625 1 -vt 0.890625 0.96875 -vt 0.75 0.96875 -vt 0 0.234375 -vt 0.140625 0.234375 -vt 0.140625 0.359375 -vt 0 0.359375 -vt 0 0.875 -vt 0.140625 0.875 -vt 0.140625 1 -vt 0 1 -vt 0 0.96875 -vt 0.140625 0.96875 -vt 0.140625 1 -vt 0 1 -vt 0.28125 1 -vt 0.140625 1 -vt 0.140625 0.875 -vt 0.28125 0.875 -vt 0.25 0 -vt 0.25 0.125 -vt 0.28125 0.125 -vt 0.28125 0 -vt 0.28125 0.25 -vt 0.28125 0.125 -vt 0.25 0.125 -vt 0.25 0.25 -vt 0.109375 1 -vt 0.171875 1 -vt 0.171875 0.984375 -vt 0.109375 0.984375 -vt 0.171875 1 -vt 0.109375 1 -vt 0.109375 0.984375 -vt 0.171875 0.984375 -vt 0.421875 0.234375 -vt 0.421875 0.15625 -vt 0.484375 0.15625 -vt 0.484375 0.234375 -vt 0.0625 0.328125 -vt 0.0625 0.25 -vt 0 0.25 -vt 0 0.328125 -vt 0.078125 0.984375 -vt 0.078125 1 -vt 0.140625 1 -vt 0.140625 0.984375 -vt 0.0625 0.34375 -vt 0.0625 0.265625 -vt 0 0.265625 -vt 0 0.34375 -vt 0.6875 0.25 -vt 0.6875 0.328125 -vt 0.75 0.328125 -vt 0.75 0.25 -vt 0.078125 1 -vt 0.078125 0.984375 -vt 0.015625 0.984375 -vt 0.015625 1 -vt 0 1 -vt 0.3125 1 -vt 0.3125 0.984375 -vt 0 0.984375 -vt 0 1 -vt 0.3125 1 -vt 0.3125 0.984375 -vt 0 0.984375 -vt 0.109375 0.171875 -vt 0.390625 0.171875 -vt 0.390625 0.234375 -vt 0.109375 0.234375 -vt 0 0.0625 -vt 0.28125 0.0625 -vt 0.28125 0 -vt 0 0 -vt 0.734375 0.3125 -vt 0.453125 0.3125 -vt 0.453125 0.25 -vt 0.734375 0.25 -vt 0.28125 0.9375 -vt 0 0.9375 -vt 0 1 -vt 0.28125 1 -vt 0.109375 1 -vt 0.171875 1 -vt 0.171875 0.984375 -vt 0.109375 0.984375 -vt 0.171875 1 -vt 0.109375 1 -vt 0.109375 0.984375 -vt 0.171875 0.984375 -vt 0.6875 0.25 -vt 0.6875 0.328125 -vt 0.75 0.328125 -vt 0.75 0.25 -vt 0.0625 0.328125 -vt 0.0625 0.25 -vt 0 0.25 -vt 0 0.328125 -vt 0.078125 0.984375 -vt 0.078125 1 -vt 0.140625 1 -vt 0.140625 0.984375 -vt 0.078125 0.078125 -vt 0.078125 0 -vt 0.015625 0 -vt 0.015625 0.078125 -vt 0.6875 0.25 -vt 0.6875 0.328125 -vt 0.75 0.328125 -vt 0.75 0.25 -vt 0.078125 1 -vt 0.078125 0.984375 -vt 0.015625 0.984375 -vt 0.015625 1 -vt 0 0.90624984375 -vt 0 0.78124953125 -vt 0.01562421875 0.7812496875 -vt 0.01562578125 0.90625 -vt 0.09375 0.98437421875 -vt 0.21875015625 0.98437421875 -vt 0.21875046875 1 -vt 0.09375015625 0.9999984375 -vt 0.390625 0.1875 -vt 0.5 0.1875 -vt 0.5 0.25 -vt 0.390625 0.25 -vt 0.015625 0.078125 -vt 0.125 0.078125 -vt 0.125 0.015625 -vt 0.015625 0.015625 -vt 0.75 0.3125 -vt 0.640625 0.3125 -vt 0.640625 0.25 -vt 0.75 0.25 -vt 0.125 0.9375 -vt 0.015625 0.9375 -vt 0.015625 1 -vt 0.125 1 -vt 0.171875 0.984375 -vt 0.171875 1 -vt 0.109375 1 -vt 0.109375 0.984375 -vt 0.109375 0.984375 -vt 0.109375 1 -vt 0.171875 1 -vt 0.171875 0.984375 -vt 0.484375 0.15625 -vt 0.421875 0.15625 -vt 0.421875 0.234375 -vt 0.484375 0.234375 -vt 0 0.25 -vt 0.0625 0.25 -vt 0.0625 0.328125 -vt 0 0.328125 -vt 0.140625 1 -vt 0.078125 1 -vt 0.078125 0.984375 -vt 0.140625 0.984375 -vt 0 0.265625 -vt 0.0625 0.265625 -vt 0.0625 0.34375 -vt 0 0.34375 -vt 0.75 0.328125 -vt 0.6875 0.328125 -vt 0.6875 0.25 -vt 0.75 0.25 -vt 0.015625 0.984375 -vt 0.078125 0.984375 -vt 0.078125 1 -vt 0.015625 1 -vt 0.3125 0.984375 -vt 0.3125 1 -vt 0 1 -vt 0 0.984375 -vt 0.3125 0.984375 -vt 0.3125 1 -vt 0 1 -vt 0 0.984375 -vt 0.390625 0.234375 -vt 0.390625 0.171875 -vt 0.109375 0.171875 -vt 0.109375 0.234375 -vt 0.28125 0 -vt 0.28125 0.0625 -vt 0 0.0625 -vt 0 0 -vt 0.453125 0.25 -vt 0.453125 0.3125 -vt 0.734375 0.3125 -vt 0.734375 0.25 -vt 0 1 -vt 0 0.9375 -vt 0.28125 0.9375 -vt 0.28125 1 -vt 0.171875 0.984375 -vt 0.171875 1 -vt 0.109375 1 -vt 0.109375 0.984375 -vt 0.109375 0.984375 -vt 0.109375 1 -vt 0.171875 1 -vt 0.171875 0.984375 -vt 0.75 0.328125 -vt 0.6875 0.328125 -vt 0.6875 0.25 -vt 0.75 0.25 -vt 0 0.25 -vt 0.0625 0.25 -vt 0.0625 0.328125 -vt 0 0.328125 -vt 0.140625 1 -vt 0.078125 1 -vt 0.078125 0.984375 -vt 0.140625 0.984375 -vt 0.015625 0 -vt 0.078125 0 -vt 0.078125 0.078125 -vt 0.015625 0.078125 -vt 0.75 0.328125 -vt 0.6875 0.328125 -vt 0.6875 0.25 -vt 0.75 0.25 -vt 0.015625 0.984375 -vt 0.078125 0.984375 -vt 0.078125 1 -vt 0.015625 1 -vt 0.09375 0.9999971875 -vt 0.09375 0.98437296875 -vt 0.21875015625 0.98437421875 -vt 0.2187503125 1 -vt 0.0156259375 0.8125 -vt 0 0.8125 -vt 0.000010625 0.68749984375 -vt 0.01563484375 0.68750125 -vt 0.5 0.25 -vt 0.5 0.1875 -vt 0.390625 0.1875 -vt 0.390625 0.25 -vt 0.125 0.015625 -vt 0.125 0.078125 -vt 0.015625 0.078125 -vt 0.015625 0.015625 -vt 0.640625 0.25 -vt 0.640625 0.3125 -vt 0.75 0.3125 -vt 0.75 0.25 -vt 0.015625 1 -vt 0.015625 0.9375 -vt 0.125 0.9375 -vt 0.125 1 -vt 0.265625 0.328125 -vt 0.28125 0.328125 -vt 0.28125 0.359375 -vt 0.265625 0.359375 -vt 0.265625 0.328125 -vt 0.28125 0.328125 -vt 0.28125 0.359375 -vt 0.265625 0.359375 -vt 0.265625 0.25 -vt 0.28125 0.25 -vt 0.28125 0.359375 -vt 0.265625 0.359375 -vt 0.25 0.25 -vt 0.265625 0.25 -vt 0.265625 0.359375 -vt 0.25 0.359375 -vt 0.265625 0.328125 -vt 0.28125 0.328125 -vt 0.28125 0.359375 -vt 0.265625 0.359375 -vt 0.265625 0.328125 -vt 0.28125 0.328125 -vt 0.28125 0.359375 -vt 0.265625 0.359375 -vt 0.265625 0.25 -vt 0.28125 0.25 -vt 0.28125 0.359375 -vt 0.265625 0.359375 -vt 0.25 0.25 -vt 0.265625 0.25 -vt 0.265625 0.359375 -vt 0.25 0.359375 -vt 0.8125 0.40625 -vt 0.8125 0.421875 -vt 0.515625 0.421875 -vt 0.515625 0.40625 -vt 0.8125 0.40625 -vt 0.8125 0.421875 -vt 0.515625 0.421875 -vt 0.515625 0.40625 -vt 0.515625 0.28125 -vt 0.8125 0.28125 -vt 0.8125 0.421875 -vt 0.515625 0.421875 -vt 0.8125 0.421875 -vt 0.515625 0.421875 -vt 0.515625 0.28125 -vt 0.8125 0.28125 -vt 0.796875 0.28125 -vt 0.8125 0.28125 -vt 0.8125 0.421875 -vt 0.796875 0.421875 -vt 0.796875 0.28125 -vt 0.8125 0.28125 -vt 0.8125 0.421875 -vt 0.796875 0.421875 -vt 0 0.75 -vt 0.5 0.75 -vt 0.5 0.9375 -vt 0 0.9375 -vt 0 0.9375 vt 0.5 0.9375 -vt 0.5 0.75 -vt 0 0.75 -vt 0 0.8125 -vt 0.5 0.8125 -vt 0.5 0.75 -vt 0 0.75 -vt 0.078125 0.8 -vt 0.078125 0.8125 -vt 0 0.8125 -vt 0 0.8 -vt 0.078125 0.7375 -vt 0.078125 0.75 -vt 0 0.75 -vt 0 0.7375 -vt 0 0.734375 -vt 0 0.8125 -vt 0.078125 0.8125 -vt 0.078125 0.734375 -vt 0.078125 0.796875 -vt 0.078125 0.8125 -vt 0 0.8125 -vt 0 0.796875 -vt 0.078125 0.75 -vt 0.078125 0.734375 -vt 0 0.734375 -vt 0 0.75 -vt 0.078125 0.8 -vt 0.078125 0.8125 -vt 0 0.8125 -vt 0 0.8 -vt 0.078125 0.7375 -vt 0.078125 0.75 -vt 0 0.75 -vt 0 0.7375 -vt 0 0.734375 -vt 0 0.8125 -vt 0.078125 0.8125 -vt 0.078125 0.734375 -vt 0.078125 0.796875 -vt 0.078125 0.8125 -vt 0 0.8125 -vt 0 0.796875 -vt 0.078125 0.75 -vt 0.078125 0.734375 -vt 0 0.734375 -vt 0 0.75 -vn 1 0 0 -vn 0 1 0 -vn 0 -1 0 -vn 0 0 1 -vn 0 0 -1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -vn 0 0 1 +vt 0.5625 0 +vt 0.5625 1 +vt 0.5 1 +vt 0.5 0 +vt 0.5625 0 +vt 0.5625 1 +vt 0.5 1 +vt 0.5 0 vn 0 0 -1 -vn 1 0 0 -vn 0 1 0 -vn 0 -1 0 vn 0 0 1 -vn 0 0 -1 vn 1 0 0 +vn -1 0 0 vn 0 -1 0 vn 0 1 0 -vn 0 0 1 -vn 0 0 -1 -vn 1 0 0 vn 0 0 -1 vn 0 0 1 vn 1 0 0 -vn 0 1 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 -1 0 -vn 0 0 1 -vn 0 0 1 -vn 0 1 0 +vn -1 0 0 vn 0 1 0 vn 0 0 -1 -vn 0 0 -1 +vn 0 0 1 vn 0 -1 0 -vn 1 0 0 vn 0 1 0 vn 0 0 -1 vn 0 0 1 vn 1 0 0 +vn -1 0 0 +vn 0 -1 0 vn 0 1 0 vn 0 0 -1 vn 0 0 1 -vn 0.1643989873053573 0.9863939238321437 0 -vn -0.1643989873053573 -0.9863939238321437 0 -vn 0 0 1 -vn 0 0 -1 -vn 0.16439898730535732 0.9863939238321439 0 -vn -0.16439898730535732 -0.9863939238321439 0 -vn 0 1 0 -vn 0 0 1 -vn 0 -1 0 -vn 0 -1 0 -vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 vn 0 1 0 -vn 0.7071067811865476 0.7071067811865476 0 -vn -0.7071067811865476 0.7071067811865476 0 -vn 0 1 0 -vn 0 -1 0 -vn 0 0 1 -vn 0 0 -1 +vn 0 -0.01 1 +vn 0 1 0.01 +vn 0 -1 -0.01 vn 1 0 0 vn -1 0 0 -vn 0 0 1 -vn 0 0 -1 +vn 0 0.01 -1 +vn 0 -0.01 1 +vn 0 1 0.01 +vn 0 -1 -0.01 +vn 1 0 0 +vn -1 0 0 +vn 0 0.01 -1 +vn 0 -0.01 1 +vn 0 1 0.01 vn 1 0 0 vn -1 0 0 +usemtl radio_backpack +f 457/1193/299 455/1194/299 454/1195/299 456/1196/299 +f 460/1197/300 458/1198/300 459/1199/300 461/1200/300 +f 454/1201/301 455/1202/301 459/1203/301 458/1204/301 +f 457/1205/302 456/1206/302 460/1207/302 461/1208/302 +f 456/1209/303 454/1210/303 458/1211/303 460/1212/303 +f 461/1213/304 459/1214/304 455/1215/304 457/1216/304 +usemtl radio_backpack2 +f 465/1217/305 463/1218/305 462/1219/305 464/1220/305 +f 468/1221/306 466/1222/306 467/1223/306 469/1224/306 +f 462/1225/307 463/1226/307 467/1227/307 466/1228/307 +f 465/1229/308 464/1230/308 468/1231/308 469/1232/308 +f 469/1233/309 467/1234/309 463/1235/309 465/1236/309 +f 473/1237/310 471/1238/310 470/1239/310 472/1240/310 +f 476/1241/311 474/1242/311 475/1243/311 477/1244/311 +f 472/1245/312 470/1246/312 474/1247/312 476/1248/312 +f 477/1249/313 475/1250/313 471/1251/313 473/1252/313 +f 481/1253/314 479/1254/314 478/1255/314 480/1256/314 +f 484/1257/315 482/1258/315 483/1259/315 485/1260/315 +f 478/1261/316 479/1262/316 483/1263/316 482/1264/316 +f 481/1265/317 480/1266/317 484/1267/317 485/1268/317 +f 480/1269/318 478/1270/318 482/1271/318 484/1272/318 +f 485/1273/319 483/1274/319 479/1275/319 481/1276/319 +f 489/1277/320 487/1278/320 486/1279/320 488/1280/320 +f 492/1281/321 490/1282/321 491/1283/321 493/1284/321 +f 486/1285/322 487/1286/322 491/1287/322 490/1288/322 +f 489/1289/323 488/1290/323 492/1291/323 493/1292/323 +f 493/1293/324 491/1294/324 487/1295/324 489/1296/324 +usemtl radio_backpack +f 500/1297/325 498/1298/325 499/1299/325 501/1300/325 +f 494/1301/326 495/1302/326 499/1303/326 498/1304/326 +f 497/1305/327 496/1306/327 500/1307/327 501/1308/327 +f 496/1309/328 494/1310/328 498/1311/328 500/1312/328 +f 501/1313/329 499/1314/329 495/1315/329 497/1316/329 +f 505/1317/330 503/1318/330 502/1319/330 504/1320/330 +f 508/1321/331 506/1322/331 507/1323/331 509/1324/331 +f 502/1325/332 503/1326/332 507/1327/332 506/1328/332 +f 505/1329/333 504/1330/333 508/1331/333 509/1332/333 +f 504/1333/334 502/1334/334 506/1335/334 508/1336/334 +f 509/1337/335 507/1338/335 503/1339/335 505/1340/335 +f 513/1341/336 511/1342/336 510/1343/336 512/1344/336 +f 516/1345/337 514/1346/337 515/1347/337 517/1348/337 +f 510/1349/338 511/1350/338 515/1351/338 514/1352/338 +f 512/1353/339 510/1354/339 514/1355/339 516/1356/339 +f 517/1357/340 515/1358/340 511/1359/340 513/1360/340 +o hood +v -0.3719 1.625 1.7156 +v -0.3094 1.625 1.7156 +v -0.3719 1.5625 1.7156 +v -0.3094 1.5625 1.7156 +v -0.3719 1.625 0.7156 +v -0.3094 1.625 0.7156 +v -0.3719 1.5625 0.7156 +v -0.3094 1.5625 0.7156 +v 0.3156 1.625 1.7156 +v 0.3781 1.625 1.7156 +v 0.3156 1.5625 1.7156 +v 0.3781 1.5625 1.7156 +v 0.3156 1.625 0.7156 +v 0.3781 1.625 0.7156 +v 0.3156 1.5625 0.7156 +v 0.3781 1.5625 0.7156 +v 0.5 1.4375 1.75 +v 0.5 1.4375 0.6875 +v 0.5 1.375 1.75 +v 0.5 1.375 0.6875 +v -0.5 1.4375 1.75 +v -0.5 1.4375 0.6875 +v -0.5 1.375 1.75 +v -0.5 1.375 0.6875 +v 0.5 1.4375 1.25 +v -0.5 1.4375 1.25 +v -0.5 1.375 1.25 +v 0.5 1.375 1.25 +v 0 1.4375 1.25 +v 0 1.4375 1.75 +v 0 1.375 1.75 +v 0 1.375 1.25 +v 0 1.375 0.6875 +v 0 1.4375 0.6875 +v -0.3719 1.5625 0.7781 +v -0.3094 1.5625 0.7781 +v -0.3719 1.4375 0.7781 +v -0.3094 1.4375 0.7781 +v -0.3719 1.4375 0.7156 +v -0.3094 1.4375 0.7156 +v 0.3156 1.4375 1.7156 +v 0.3781 1.4375 1.7156 +v 0.3156 1.5625 1.6531 +v 0.3781 1.5625 1.6531 +v 0.3156 1.4375 1.6531 +v 0.3781 1.4375 1.6531 +v -0.3719 1.4375 1.7156 +v -0.3094 1.4375 1.7156 +v -0.3719 1.5625 1.6531 +v -0.3094 1.5625 1.6531 +v -0.3719 1.4375 1.6531 +v -0.3094 1.4375 1.6531 +v 0.3156 1.5625 0.7781 +v 0.3781 1.5625 0.7781 +v 0.3156 1.4375 0.7781 +v 0.3781 1.4375 0.7781 +v 0.3156 1.4375 0.7156 +v 0.3781 1.4375 0.7156 +v 0 1.4375 0.875 +v -0.5 1.4375 0.875 +v -0.5 1.375 0.875 +v 0 1.375 0.875 +v 0.5 1.375 0.875 +v 0.5 1.4375 0.875 +v 0 1.4375 1.5625 +v -0.5 1.4375 1.5625 +v -0.5 1.375 1.5625 +v 0 1.375 1.5625 +v 0.5 1.375 1.5625 +v 0.5 1.4375 1.5625 +v -0.3125 1.4375 1.5625 +v -0.3125 1.4375 1.25 +v -0.3125 1.4375 0.875 +v -0.3125 1.4375 0.6875 +v -0.3125 1.375 0.6875 +v -0.3125 1.375 0.875 +v -0.3125 1.375 1.25 +v -0.3125 1.375 1.5625 +v -0.3125 1.375 1.75 +v -0.3125 1.4375 1.75 +v 0 1.4031 1.5625 +v 0 1.4031 0.875 +v -0.3125 1.4031 1.5625 +v -0.3125 1.4031 0.875 +v 0 1.4031 1.1875 +v -0.3125 1.4031 1.1875 +v -0.1875 1.4031 1.1875 +v -0.1875 1.4031 1.5625 +v -0.1875 1.4031 0.875 +vt 0.5 0.5 +vt 0.5313 0.5 +vt 0.5313 0.5313 +vt 0.5 0.5313 +vt 0.5 0.5 +vt 0.5313 0.5 +vt 0.5313 0.5313 +vt 0.5 0.5313 +vt 0.5 0.5 +vt 0.5313 0.5 +vt 0.5313 1 +vt 0.5 1 +vt 0.5 0.5 +vt 0.5313 0.5 +vt 0.5313 1 +vt 0.5 1 +vt 0.5 0.5 +vt 0.5313 0.5 +vt 0.5313 1 +vt 0.5 1 +vt 0.5 0.5 +vt 0.5313 0.5 +vt 0.5313 1 +vt 0.5 1 +vt 0.5 0.5 +vt 0.5313 0.5 +vt 0.5313 0.5313 +vt 0.5 0.5313 +vt 0.5 0.5 +vt 0.5313 0.5 +vt 0.5313 0.5313 +vt 0.5 0.5313 +vt 0.5 0.5 +vt 0.5313 0.5 +vt 0.5313 1 +vt 0.5 1 +vt 0.5 0.5 +vt 0.5313 0.5 +vt 0.5313 1 +vt 0.5 1 +vt 0.5 0.5 +vt 0.5313 0.5 +vt 0.5313 1 +vt 0.5 1 +vt 0.5 0.5 +vt 0.5313 0.5 +vt 0.5313 1 +vt 0.5 1 +vt 0.4063 0.2656 +vt 0.3594 0.2656 +vt 0.3594 0.25 +vt 0.4063 0.25 +vt 0.3281 0.25 +vt 0.375 0.25 +vt 0.375 0.2656 +vt 0.3281 0.2656 +vt 0.625 0.25 +vt 0.5469 0.25 +vt 0.5469 0.2031 +vt 0.625 0.2031 +vt 0.625 0.0469 +vt 0.5469 0.0469 +vt 0.5469 0 +vt 0.625 0 +vt 0.1719 0.2656 +vt 0.0938 0.2656 +vt 0.0938 0.25 +vt 0.1719 0.25 +vt 0.375 0.25 +vt 0.4531 0.25 +vt 0.4531 0.2656 +vt 0.375 0.2656 +vt 0.5156 0.25 +vt 0.5938 0.25 +vt 0.5938 0.2656 +vt 0.5156 0.2656 +vt 0.25 0.2656 +vt 0.1719 0.2656 +vt 0.1719 0.25 +vt 0.25 0.25 +vt 0.625 0.125 +vt 0.625 0.0469 +vt 0.75 0.0469 +vt 0.75 0.125 +vt 0.5469 0.2656 +vt 0.4219 0.2656 +vt 0.4219 0.25 +vt 0.5469 0.25 +vt 0.75 0.125 +vt 0.75 0.2031 +vt 0.625 0.2031 +vt 0.625 0.125 +vt 0.75 0 +vt 0.75 0.0469 +vt 0.625 0.0469 +vt 0.625 0 +vt 0.25 0.25 +vt 0.375 0.25 +vt 0.375 0.2656 +vt 0.25 0.2656 +vt 0.625 0.25 +vt 0.625 0.2031 +vt 0.75 0.2031 +vt 0.75 0.25 +vt 0.5 0.5313 +vt 0.4375 0.5313 +vt 0.4375 0.5 +vt 0.5 0.5 +vt 0.5 0.5313 +vt 0.4375 0.5313 +vt 0.4375 0.5 +vt 0.5 0.5 +vt 0.5 0.5313 +vt 0.4375 0.5313 +vt 0.4375 0.5 +vt 0.5 0.5 +vt 0.5 0.5313 +vt 0.4375 0.5313 +vt 0.4375 0.5 +vt 0.5 0.5 +vt 0.5 0.5313 +vt 0.4375 0.5313 +vt 0.4375 0.5 +vt 0.5 0.5 +vt 0.5 0.5313 +vt 0.4375 0.5313 +vt 0.4375 0.5 +vt 0.5 0.5 +vt 0.5 0.5313 +vt 0.4375 0.5313 +vt 0.4375 0.5 +vt 0.5 0.5 +vt 0.5 0.5313 +vt 0.4375 0.5313 +vt 0.4375 0.5 +vt 0.5 0.5 +vt 0.5 0.5313 +vt 0.4375 0.5313 +vt 0.4375 0.5 +vt 0.5 0.5 +vt 0.5 0.5313 +vt 0.4375 0.5313 +vt 0.4375 0.5 +vt 0.5 0.5 +vt 0.5 0.5313 +vt 0.4375 0.5313 +vt 0.4375 0.5 +vt 0.5 0.5 +vt 0.5 0.5313 +vt 0.4375 0.5313 +vt 0.4375 0.5 +vt 0.5 0.5 +vt 0.5 0.5313 +vt 0.4375 0.5313 +vt 0.4375 0.5 +vt 0.5 0.5 +vt 0.5 0.5313 +vt 0.4375 0.5313 +vt 0.4375 0.5 +vt 0.5 0.5 +vt 0.5 0.5313 +vt 0.4375 0.5313 +vt 0.4375 0.5 +vt 0.5 0.5 +vt 0.5 0.5313 +vt 0.4375 0.5313 +vt 0.4375 0.5 +vt 0.5 0.5 +vt 0.4688 0.2656 +vt 0.375 0.2656 +vt 0.375 0.25 +vt 0.4688 0.25 +vt 0.625 0.1406 +vt 0.625 0.0469 +vt 0.75 0.0469 +vt 0.75 0.1406 +vt 0.2656 0.25 +vt 0.3594 0.25 +vt 0.3594 0.2656 +vt 0.2656 0.2656 +vt 0.75 0.1094 +vt 0.75 0.2031 +vt 0.625 0.2031 +vt 0.625 0.1094 +vt 0.625 0.0469 +vt 0.5469 0.0469 +vt 0.5469 0 +vt 0.625 0 +vt 0.6406 0.2656 +vt 0.5938 0.2656 +vt 0.5938 0.25 +vt 0.6406 0.25 +vt 0.625 0.25 +vt 0.5469 0.25 +vt 0.5469 0.2031 +vt 0.625 0.2031 +vt 0.625 0.25 +vt 0.625 0.2031 +vt 0.75 0.2031 +vt 0.75 0.25 +vt 0.125 0.25 +vt 0.1719 0.25 +vt 0.1719 0.2656 +vt 0.125 0.2656 +vt 0.75 0 +vt 0.75 0.0469 +vt 0.625 0.0469 +vt 0.625 0 +vt 0.5 0.0469 +vt 0.5469 0.0469 +vt 0.5469 0.125 +vt 0.5 0.125 +vt 0.5 0.1094 +vt 0.5469 0.1094 +vt 0.5469 0.2031 +vt 0.5 0.2031 +vt 0.5 0.2031 +vt 0.5469 0.2031 +vt 0.5469 0.25 +vt 0.5 0.25 +vt 0.5 0.2656 +vt 0.4531 0.2656 +vt 0.4531 0.25 +vt 0.5 0.25 +vt 0.5 0 +vt 0.5469 0 +vt 0.5469 0.0469 +vt 0.5 0.0469 +vt 0.5 0.0469 +vt 0.5469 0.0469 +vt 0.5469 0.1406 +vt 0.5 0.1406 +vt 0.5 0.125 +vt 0.5469 0.125 +vt 0.5469 0.2031 +vt 0.5 0.2031 +vt 0.5 0.2031 +vt 0.5469 0.2031 +vt 0.5469 0.25 +vt 0.5 0.25 +vt 0.0469 0.25 +vt 0.0938 0.25 +vt 0.0938 0.2656 +vt 0.0469 0.2656 +vt 0.5 0 +vt 0.5469 0 +vt 0.5469 0.0469 +vt 0.5 0.0469 +vt 0.375 0.2031 +vt 0.375 0.2188 +vt 0.2813 0.2188 +vt 0.2031 0.2188 +vt 0.2031 0.2188 +vt 0.2031 0.2031 +vt 0.2813 0.2031 +vt 0.375 0.2031 +vt 0.2031 0.2188 +vt 0.2031 0.2031 +vt 0.2969 0.2031 +vt 0.375 0.2031 +vt 0.375 0.2031 +vt 0.375 0.2188 +vt 0.2969 0.2188 +vt 0.2031 0.2188 +vt 0.3438 0.2188 +vt 0.3438 0.2031 +vt 0.4219 0.2031 +vt 0.4219 0.2188 +vt 0.3594 0.2188 +vt 0.2813 0.2188 +vt 0.2813 0.2031 +vt 0.3594 0.2031 +vt 0.1875 0.5938 +vt 0.125 0.5938 +vt 0.125 0.75 +vt 0.1875 0.75 +vt 0.1875 0.75 +vt 0.125 0.75 +vt 0.125 0.5625 +vt 0.1875 0.5625 +vt 0.1875 0.5625 +vt 0.0938 0.5625 +vt 0.0938 0.75 +vt 0.1875 0.75 +vt 0.1875 0.75 +vt 0.0938 0.75 +vt 0.0938 0.5938 +vt 0.1875 0.5938 vn 0 0 1 vn 0 0 -1 -vn 0.7071067811865476 0.7071067811865476 0 -vn -0.7071067811865476 0.7071067811865476 0 vn 0 1 0 vn 0 -1 0 -vn 0 0 1 -vn 0 0 -1 -vn 1 0 0 vn -1 0 0 -vn 0 0 1 -vn 0 0 -1 vn 1 0 0 -vn -1 0 0 vn 0 0 1 vn 0 0 -1 -vn -1 0 0 vn 0 1 0 vn 0 -1 0 -vn 0 0 1 -vn 0 0 -1 -vn -1 0 0 -vn 0 0 -1 -vn 0 0 1 vn -1 0 0 -vn 0 -1 0 -vn 0 1 0 +vn 1 0 0 +vn 1 0 0 vn -1 0 0 vn 0 1 0 -vn 0 0 1 -vn 0 0 1 vn 0 -1 0 -vn 0 -1 0 -vn 0 0 -1 -vn 0 0 -1 -vn 0 1 0 -vn -1 0 0 -vn 0 1 0 vn 0 0 1 vn 0 0 -1 vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -vn 0 0 1 -vn 0 0 -1 -vn -0.1643989873053573 0.9863939238321437 0 -vn 0.1643989873053573 -0.9863939238321437 0 -vn 0 0 1 -vn 0 0 -1 -vn -0.16439898730535732 0.9863939238321439 0 -vn 0.16439898730535732 -0.9863939238321439 0 +vn 1 0 0 vn 0 1 0 vn 0 0 1 vn 0 -1 0 vn 0 -1 0 vn 0 0 -1 vn 0 1 0 -vn 0.7071067811865476 0.7071067811865476 0 -vn -0.7071067811865476 0.7071067811865476 0 -vn 0 1 0 -vn 0 -1 0 vn 0 0 1 vn 0 0 -1 -vn 1 0 0 vn -1 0 0 -vn 0 0 1 -vn 0 0 -1 vn 1 0 0 -vn -1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0.7071067811865476 0.7071067811865476 0 -vn -0.7071067811865476 0.7071067811865476 0 -vn 0 1 0 -vn 0 -1 0 vn 0 0 1 vn 0 0 -1 -vn 1 0 0 vn -1 0 0 -vn 0 0 1 -vn 0 0 -1 vn 1 0 0 -vn -1 0 0 vn 0 0 1 vn 0 0 -1 vn -1 0 0 -vn 0 1 0 +vn 1 0 0 vn 0 0 1 vn 0 0 -1 -vn 0 1 0 -vn 0 0 -1 +vn -1 0 0 vn 1 0 0 -vn 0 1 0 -vn 0 -1 0 vn -1 0 0 vn 0 -1 0 +vn 1 0 0 vn 0 1 0 -vn 0 0 -1 -vn 0 0 1 -vn 0 1 0 -vn 0 -1 0 -vn -1 0 0 -vn 0 0 -1 -vn 0 0 1 -vn -0.8944271909999161 0.4472135954999579 0 vn 0 1 0 -vn 0 0 1 -vn 0 0 -1 -vn 0.906307857187003 -0.42261811130274934 0 -vn -0.906307857187003 0.42261811130274934 0 -vn 0.42261610394430743 0.9063087932305051 0 -vn -0.42261610394430726 -0.9063087932305053 0 -vn 0 0 1 -vn 0 0 -1 -vn 1 0 0 vn -1 0 0 -vn 0 1 0 vn 0 -1 0 -vn -0.8944271909999161 0 -0.44721359549995804 -vn 0 1 0 vn 0 -1 0 -vn 0 0 -1 -vn -1 0 0 vn 1 0 0 vn 0 1 0 -vn 1 0 0 -vn -1 0 0 vn 0 1 0 -vn 0 0 1 -vn 0 0 -1 -vn 1 0 0 -vn -1 0 0 vn 0 1 0 -vn 0 -1 0 -vn 0 -0.44721359549995804 0.8944271909999161 -vn 1 0 0 -vn -1 0 0 vn 0 1 0 +vn 0 0 -1 vn 0 -1 0 -vn 0 0 1 vn 0 -1 0 -vn -1 0 0 -vn 0 1 0 -vn 1 0 0 vn 0 -1 0 -vn 0 1 0 -vn 0 1 0 -vn 0 0 1 vn 0 -1 0 vn 0 0 1 -vn 1 0 0 -vn -1 0 0 vn 0 1 0 -vn 0 -1 0 -vn 0 0 1 -vn 0 0 -1 +vn 1 0 0 vn 1 0 0 vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 +vn -1 0 0 vn 0 0 1 vn 0 0 -1 -vn 1 0 0 -vn -1 0 0 vn 0 1 0 +vn 0 1 0 +vn 0 1 0 +vn 0 1 0 +usemtl tracked_motorbike +f 521/1361/341 519/1362/341 518/1363/341 520/1364/341 +f 524/1365/342 522/1366/342 523/1367/342 525/1368/342 +f 518/1369/343 519/1370/343 523/1371/343 522/1372/343 +f 521/1373/344 520/1374/344 524/1375/344 525/1376/344 +f 520/1377/345 518/1378/345 522/1379/345 524/1380/345 +f 525/1381/346 523/1382/346 519/1383/346 521/1384/346 +f 529/1385/347 527/1386/347 526/1387/347 528/1388/347 +f 532/1389/348 530/1390/348 531/1391/348 533/1392/348 +f 526/1393/349 527/1394/349 531/1395/349 530/1396/349 +f 529/1397/350 528/1398/350 532/1399/350 533/1400/350 +f 528/1401/351 526/1402/351 530/1403/351 532/1404/351 +f 533/1405/352 531/1406/352 527/1407/352 529/1408/352 +usemtl common_bottom +f 535/1409/353 581/1410/353 580/1411/353 537/1412/353 +f 541/1413/354 578/1414/354 577/1415/354 539/1416/354 +usemtl common_bottom_painted +f 551/1417/355 591/1418/355 590/1419/355 576/1420/355 +usemtl common_bottom +f 579/1421/356 593/1422/356 592/1423/356 550/1424/356 +f 547/1425/357 597/1426/357 596/1427/357 548/1428/357 +f 550/1429/358 592/1430/358 591/1431/358 551/1432/358 +f 544/1433/359 584/1434/359 583/1435/359 543/1436/359 +f 542/1437/360 587/1438/360 586/1439/360 545/1440/360 +usemtl common_bottom_painted +f 546/1441/361 582/1442/361 587/1443/361 542/1444/361 +usemtl common_bottom +f 534/1445/362 547/1446/362 548/1447/362 536/1448/362 +f 545/1449/363 586/1450/363 585/1451/363 549/1452/363 +f 537/1453/364 580/1454/364 579/1455/364 550/1456/364 +f 537/1457/365 550/1458/365 551/1459/365 535/1460/365 +usemtl common_bottom_painted +f 551/1461/366 576/1462/366 581/1463/366 535/1464/366 +usemtl tracked_motorbike +f 555/1465/367 553/1466/367 552/1467/367 554/1468/367 +f 556/1469/368 524/1470/368 525/1471/368 557/1472/368 +f 554/1473/369 552/1474/369 524/1475/369 556/1476/369 +f 557/1477/370 525/1478/370 553/1479/370 555/1480/370 +f 559/1481/371 529/1482/371 528/1483/371 558/1484/371 +f 562/1485/372 560/1486/372 561/1487/372 563/1488/372 +f 558/1489/373 528/1490/373 560/1491/373 562/1492/373 +f 563/1493/374 561/1494/374 529/1495/374 559/1496/374 +f 565/1497/375 521/1498/375 520/1499/375 564/1500/375 +f 568/1501/376 566/1502/376 567/1503/376 569/1504/376 +f 564/1505/377 520/1506/377 566/1507/377 568/1508/377 +f 569/1509/378 567/1510/378 521/1511/378 565/1512/378 +f 573/1513/379 571/1514/379 570/1515/379 572/1516/379 +f 574/1517/380 532/1518/380 533/1519/380 575/1520/380 +f 572/1521/381 570/1522/381 532/1523/381 574/1524/381 +f 575/1525/382 533/1526/382 571/1527/382 573/1528/382 +usemtl common_bottom +f 543/1529/383 577/1530/383 578/1531/383 544/1532/383 +f 549/1533/384 579/1534/384 580/1535/384 545/1536/384 +f 545/1537/385 580/1538/385 581/1539/385 542/1540/385 +usemtl common_bottom_painted +f 542/1541/386 581/1542/386 576/1543/386 546/1544/386 +f 582/1545/387 588/1546/387 597/1547/387 547/1548/387 +usemtl common_bottom +f 538/1549/388 583/1550/388 584/1551/388 540/1552/388 +f 548/1553/389 596/1554/389 595/1555/389 585/1556/389 +f 548/1557/390 585/1558/390 586/1559/390 536/1560/390 +f 536/1561/391 586/1562/391 587/1563/391 534/1564/391 +usemtl common_bottom_painted +f 534/1565/392 587/1566/392 582/1567/392 547/1568/392 +f 583/1569/393 588/1570/393 589/1571/393 543/1572/393 +f 543/1573/394 589/1574/394 590/1575/394 577/1576/394 +f 577/1577/395 590/1578/395 591/1579/395 539/1580/395 +usemtl common_bottom +f 539/1581/396 591/1582/396 592/1583/396 541/1584/396 +f 541/1585/397 592/1586/397 593/1587/397 578/1588/397 +f 578/1589/398 593/1590/398 594/1591/398 544/1592/398 +f 544/1593/399 594/1594/399 595/1595/399 584/1596/399 +f 584/1597/400 595/1598/400 596/1599/400 540/1600/400 +f 540/1601/401 596/1602/401 597/1603/401 538/1604/401 +usemtl common_bottom_painted +f 538/1605/402 597/1606/402 588/1607/402 583/1608/402 +f 593/1609/403 590/1610/403 589/1611/403 588/1612/403 +f 588/1613/404 595/1614/404 594/1615/404 593/1616/404 +f 576/1617/405 579/1618/405 549/1619/405 585/1620/405 +f 585/1621/406 582/1622/406 546/1623/406 576/1624/406 +f 590/1625/407 593/1626/407 579/1627/407 576/1628/407 +f 588/1629/408 582/1630/408 585/1631/408 595/1632/408 +usemtl tracked_motorbike +f 603/1633/409 604/1634/409 606/1635/409 601/1636/409 +f 600/1637/410 605/1638/410 604/1639/410 603/1640/410 +f 602/1641/411 604/1642/411 605/1643/411 598/1644/411 +f 599/1645/412 606/1646/412 604/1647/412 602/1648/412 +o gear_change +v 0.125 1.2438 -0.0625 +v 0.125 1.2438 -0.125 +v 0.125 0.9313 -0.0625 +v 0.125 0.9313 -0.125 +v 0.0625 1.2438 -0.0625 +v 0.0625 1.2438 -0.125 +v 0.0625 0.9313 -0.0625 +v 0.0625 0.9313 -0.125 +v 0.125 0.6188 -0.0625 +v 0.125 0.6188 -0.125 +v 0.0625 0.6188 -0.0625 +v 0.0625 0.6188 -0.125 +v 0.1563 1.3688 -0.0312 +v 0.1563 1.3688 -0.1562 +v 0.1563 1.2438 -0.0312 +v 0.1563 1.2438 -0.1562 +v 0.0313 1.3688 -0.0312 +v 0.0313 1.3688 -0.1562 +v 0.0313 1.2438 -0.0312 +v 0.0313 1.2438 -0.1562 +vt 0.625 0.0313 +vt 0.625 0.1875 +vt 0.5938 0.1875 +vt 0.5938 0.0313 +vt 0.625 0.0313 +vt 0.625 0.1875 +vt 0.5938 0.1875 +vt 0.5938 0.0313 +vt 0.625 0.1563 +vt 0.625 0.1875 +vt 0.5938 0.1875 +vt 0.5938 0.1563 +vt 0.625 0.0313 +vt 0.625 0.1875 +vt 0.5938 0.1875 +vt 0.5938 0.0313 +vt 0.625 0.0313 +vt 0.625 0.1875 +vt 0.5938 0.1875 +vt 0.5938 0.0313 +vt 0.625 0.0313 +vt 0.625 0.1875 +vt 0.5938 0.1875 +vt 0.5938 0.0313 +vt 0.625 0.0313 +vt 0.625 0.1875 +vt 0.5938 0.1875 +vt 0.5938 0.0313 +vt 0.625 0.1563 +vt 0.625 0.1875 +vt 0.5938 0.1875 +vt 0.5938 0.1563 +vt 0.625 0.0313 +vt 0.625 0.1875 +vt 0.5938 0.1875 +vt 0.5938 0.0313 +vt 0.625 0.0313 +vt 0.625 0.1875 +vt 0.5938 0.1875 +vt 0.5938 0.0313 +vt 0.7188 0.1563 +vt 0.6563 0.1563 +vt 0.6563 0.0938 +vt 0.7188 0.0938 +vt 0.5938 0.0938 +vt 0.6563 0.0938 +vt 0.6563 0.1563 +vt 0.5938 0.1563 +vt 0.6875 0.0938 +vt 0.6875 0.1563 +vt 0.625 0.1563 +vt 0.625 0.0938 +vt 0.6563 0.0625 +vt 0.5938 0.0625 +vt 0.5938 0 +vt 0.6563 0 +vt 0.6875 0.0625 +vt 0.6875 0.125 +vt 0.625 0.125 +vt 0.625 0.0625 +vt 0.625 0.1875 +vt 0.625 0.125 +vt 0.6875 0.125 +vt 0.6875 0.1875 vn 1 0 0 +vn -1 0 0 vn 0 1 0 vn 0 0 1 vn 0 0 -1 vn 1 0 0 +vn -1 0 0 +vn 0 -1 0 vn 0 0 1 vn 0 0 -1 vn 1 0 0 -vn 0 1 0 -vn 1 0 0 -vn -1 0 0 -vn 0 1 0 -vn 0 0 1 -vn 0 0 -1 -vn -1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn -1 0 0 -vn 0 1 0 -vn -1 0 0 -vn 1 0 0 -vn -1 0 0 -vn 0 0 1 -vn 0 0 1 -vn -1 0 0 -vn 1 0 0 -vn 0 0 1 -vn 0 0 1 -vn 0 0 1 -vn 0 1 0 -vn 0 -1 0 -vn 1 0 0 -vn -1 0 0 -vn 1 0 0 -vn -1 0 0 -vn 0 0 -1 -vn 0 0 -1 -vn 1 0 0 -vn -1 0 0 -vn 0 0 -1 -vn 1 0 0 -vn 1 0 0 -vn -1 0 0 -vn -1 0 0 -vn 0 0 -1 vn -1 0 0 vn 0 1 0 +vn 0 -1 0 vn 0 0 1 vn 0 0 -1 +usemtl tracked_motorbike +f 610/1649/413 608/1650/413 607/1651/413 609/1652/413 +f 613/1653/414 611/1654/414 612/1655/414 614/1656/414 +f 607/1657/415 608/1658/415 612/1659/415 611/1660/415 +f 609/1661/416 607/1662/416 611/1663/416 613/1664/416 +f 614/1665/417 612/1666/417 608/1667/417 610/1668/417 +f 616/1669/418 610/1670/418 609/1671/418 615/1672/418 +f 617/1673/419 613/1674/419 614/1675/419 618/1676/419 +f 616/1677/420 615/1678/420 617/1679/420 618/1680/420 +f 615/1681/421 609/1682/421 613/1683/421 617/1684/421 +f 618/1685/422 614/1686/422 610/1687/422 616/1688/422 +f 622/1689/423 620/1690/423 619/1691/423 621/1692/423 +f 625/1693/424 623/1694/424 624/1695/424 626/1696/424 +f 619/1697/425 620/1698/425 624/1699/425 623/1700/425 +f 622/1701/426 621/1702/426 625/1703/426 626/1704/426 +f 621/1705/427 619/1706/427 623/1707/427 625/1708/427 +f 626/1709/428 624/1710/428 620/1711/428 622/1712/428 +o lever +v -0.125 1.1188 -0.2187 +v -0.125 1.1188 -0.2812 +v -0.125 0.8063 -0.2187 +v -0.125 0.8063 -0.2812 +v -0.1875 1.1188 -0.2187 +v -0.1875 1.1188 -0.2812 +v -0.1875 0.8063 -0.2187 +v -0.1875 0.8063 -0.2812 +v -0.125 0.4938 -0.2187 +v -0.125 0.4938 -0.2812 +v -0.1875 0.4938 -0.2187 +v -0.1875 0.4938 -0.2812 +v -0.0937 1.2438 -0.1875 +v -0.0937 1.2438 -0.3125 +v -0.0937 1.1188 -0.1875 +v -0.0937 1.1188 -0.3125 +v -0.2187 1.2438 -0.1875 +v -0.2187 1.2438 -0.3125 +v -0.2187 1.1188 -0.1875 +v -0.2187 1.1188 -0.3125 +vt 0.625 0.0313 +vt 0.625 0.1875 +vt 0.5938 0.1875 +vt 0.5938 0.0313 +vt 0.625 0.0313 +vt 0.625 0.1875 +vt 0.5938 0.1875 +vt 0.5938 0.0313 +vt 0.625 0.0313 +vt 0.625 0.1875 +vt 0.5938 0.1875 +vt 0.5938 0.0313 +vt 0.625 0.0313 +vt 0.625 0.1875 +vt 0.5938 0.1875 +vt 0.5938 0.0313 +vt 0.625 0.0313 +vt 0.625 0.1875 +vt 0.5938 0.1875 +vt 0.5938 0.0313 +vt 0.625 0.0313 +vt 0.625 0.1875 +vt 0.5938 0.1875 +vt 0.5938 0.0313 +vt 0.625 0.1563 +vt 0.625 0.1875 +vt 0.5938 0.1875 +vt 0.5938 0.1563 +vt 0.625 0.0313 +vt 0.625 0.1875 +vt 0.5938 0.1875 +vt 0.5938 0.0313 +vt 0.625 0.0313 +vt 0.625 0.1875 +vt 0.5938 0.1875 +vt 0.5938 0.0313 +vt 0.7188 0.1563 +vt 0.6563 0.1563 +vt 0.6563 0.0938 +vt 0.7188 0.0938 +vt 0.5938 0.0938 +vt 0.6563 0.0938 +vt 0.6563 0.1563 +vt 0.5938 0.1563 +vt 0.6875 0.0938 +vt 0.6875 0.1563 +vt 0.625 0.1563 +vt 0.625 0.0938 +vt 0.6563 0.0625 +vt 0.5938 0.0625 +vt 0.5938 0 +vt 0.6563 0 +vt 0.6875 0.0625 +vt 0.6875 0.125 +vt 0.625 0.125 +vt 0.625 0.0625 +vt 0.625 0.1875 +vt 0.625 0.125 +vt 0.6875 0.125 +vt 0.6875 0.1875 +vt 0.625 0.1563 +vt 0.625 0.1875 +vt 0.5938 0.1875 +vt 0.5938 0.1563 vn 1 0 0 vn -1 0 0 -vn 0 1 0 vn 0 0 1 vn 0 0 -1 vn 1 0 0 vn -1 0 0 -vn 0 1 0 +vn 0 -1 0 vn 0 0 1 vn 0 0 -1 vn 1 0 0 vn -1 0 0 vn 0 1 0 +vn 0 -1 0 vn 0 0 1 vn 0 0 -1 -vn 1 0 0 -vn -1 0 0 vn 0 1 0 -vn 0 -1 0 +usemtl tracked_motorbike +f 630/1713/429 628/1714/429 627/1715/429 629/1716/429 +f 633/1717/430 631/1718/430 632/1719/430 634/1720/430 +f 629/1721/431 627/1722/431 631/1723/431 633/1724/431 +f 634/1725/432 632/1726/432 628/1727/432 630/1728/432 +f 636/1729/433 630/1730/433 629/1731/433 635/1732/433 +f 637/1733/434 633/1734/434 634/1735/434 638/1736/434 +f 636/1737/435 635/1738/435 637/1739/435 638/1740/435 +f 635/1741/436 629/1742/436 633/1743/436 637/1744/436 +f 638/1745/437 634/1746/437 630/1747/437 636/1748/437 +f 642/1749/438 640/1750/438 639/1751/438 641/1752/438 +f 645/1753/439 643/1754/439 644/1755/439 646/1756/439 +f 639/1757/440 640/1758/440 644/1759/440 643/1760/440 +f 642/1761/441 641/1762/441 645/1763/441 646/1764/441 +f 641/1765/442 639/1766/442 643/1767/442 645/1768/442 +f 646/1769/443 644/1770/443 640/1771/443 642/1772/443 +f 627/1773/444 628/1774/444 632/1775/444 631/1776/444 +o cane +v -0.125 0.5313 0.25 +v -0.125 0.5313 -0.25 +v -0.125 0.4688 0.25 +v -0.125 0.4688 -0.25 +v -0.1875 0.5313 0.25 +v -0.1875 0.5313 -0.25 +v -0.1875 0.4688 0.25 +v -0.1875 0.4688 -0.25 +vt 0.1406 0.9688 +vt 0.1406 0.9844 +vt 0.0156 0.9844 +vt 0.0156 0.9688 +vt 0.1406 0.9688 +vt 0.1406 0.9844 +vt 0.0156 0.9844 +vt 0.0156 0.9688 +vt 0.0313 0.8594 +vt 0.0313 0.9844 +vt 0.0156 0.9844 +vt 0.0156 0.8594 +vt 0.0313 0.8594 +vt 0.0313 0.9844 +vt 0.0156 0.9844 +vt 0.0156 0.8594 +vt 0.0156 0.9844 +vt 0.0156 1 +vt 0 1 +vt 0 0.9844 +vt 0.0156 0.9844 +vt 0.0156 1 +vt 0 1 +vt 0 0.9844 vn 1 0 0 vn -1 0 0 vn 0 1 0 vn 0 -1 0 vn 0 0 1 vn 0 0 -1 -vn 1 0 0 -vn -1 0 0 +usemtl common_steel_norivets +f 650/1777/445 648/1778/445 647/1779/445 649/1780/445 +f 653/1781/446 651/1782/446 652/1783/446 654/1784/446 +f 647/1785/447 648/1786/447 652/1787/447 651/1788/447 +f 650/1789/448 649/1790/448 653/1791/448 654/1792/448 +f 649/1793/449 647/1794/449 651/1795/449 653/1796/449 +f 654/1797/450 652/1798/450 648/1799/450 650/1800/450 +o transmission +v -0.25 0.6563 2.125 +v -0.25 0.6563 1.9375 +v -0.25 0.4688 2.125 +v -0.25 0.4688 1.9375 +v -0.4375 0.6563 2.125 +v -0.4375 0.6563 1.9375 +v -0.4375 0.4688 2.125 +v -0.4375 0.4688 1.9375 +v 0.4375 0.6563 2.125 +v 0.4375 0.6563 1.9375 +v 0.4375 0.4688 2.125 +v 0.4375 0.4688 1.9375 +v 0.25 0.6563 2.125 +v 0.25 0.6563 1.9375 +v 0.25 0.4688 2.125 +v 0.25 0.4688 1.9375 +vt 0.5938 0.5 +vt 0.5469 0.5 +vt 0.5469 0.4531 +vt 0.5938 0.4531 +vt 0.5938 0.5 +vt 0.5469 0.5 +vt 0.5469 0.4531 +vt 0.5938 0.4531 +vt 0.5938 0.5 +vt 0.5469 0.5 +vt 0.5469 0.4531 +vt 0.5938 0.4531 +vt 0.5938 0.5 +vt 0.5469 0.5 +vt 0.5469 0.4531 +vt 0.5938 0.4531 +vt 0.5938 0.5 +vt 0.5469 0.5 +vt 0.5469 0.4531 +vt 0.5938 0.4531 +vt 0.5938 0.5 +vt 0.5469 0.5 +vt 0.5469 0.4531 +vt 0.5938 0.4531 +vt 0.5938 0.5 +vt 0.5469 0.5 +vt 0.5469 0.4531 +vt 0.5938 0.4531 +vt 0.5938 0.5 +vt 0.5469 0.5 +vt 0.5469 0.4531 +vt 0.5938 0.4531 vn 0 1 0 +vn 0 -1 0 vn 0 0 1 vn 0 0 -1 -vn 0 0 1 -vn -1 0 0 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 0 -1 vn 0 1 0 +vn 0 -1 0 vn 0 0 1 -vn 1 0 0 -vn 1 0 0 -vn 1 0 0 -vn -1 0 0 -vn 0 0.7071067811865476 -0.7071067811865476 -vn 0 0 1 -vn 0 0 -1 -vn 0 0.7071067811865476 -0.7071067811865476 -vn 0 0 -1 -vn 0 0 1 -vn -1 0 0 -vn 1 0 0 -vn 0 1 0 -vn -1 0 0 -vn 1 0 0 -vn -1 0 0 -vn 1 0 0 -vn 1 0 0 -vn 0 1 0 -vn -1 0 0 vn 0 0 -1 +usemtl common_cable_and_pipe +f 655/1801/451 656/1802/451 660/1803/451 659/1804/451 +f 658/1805/452 657/1806/452 661/1807/452 662/1808/452 +f 657/1809/453 655/1810/453 659/1811/453 661/1812/453 +f 662/1813/454 660/1814/454 656/1815/454 658/1816/454 +f 663/1817/455 664/1818/455 668/1819/455 667/1820/455 +f 666/1821/456 665/1822/456 669/1823/456 670/1824/456 +f 665/1825/457 663/1826/457 667/1827/457 669/1828/457 +f 670/1829/458 668/1830/458 664/1831/458 666/1832/458 +o armor_right +v 1.125 1.375 1.8125 +v 1.125 1.375 0.625 +v 1.0625 1.375 1.8125 +v 1.0625 1.375 0.625 +v 1.125 0.875 1.8125 +v 1.125 0.875 0.625 +v 1.0625 0.875 1.8125 +v 1.0625 0.875 0.625 +v 1.125 1.375 1.25 +v 1.125 0.875 1.25 +v 1.0625 0.875 1.25 +v 1.0625 1.375 1.25 +v 1.125 1.25 1.25 +v 1.125 1.25 1.8125 +v 1.0625 1.25 1.8125 +v 1.0625 1.25 1.25 +v 1.0625 1.25 0.625 +v 1.125 1.25 0.625 +vt 0.1563 1 +vt 0.1563 0.9844 +vt 0 0.9844 +vt 0 1 +vt 0.0938 1 +vt 0.0938 0.8438 +vt 0 0.8438 +vt 0 1 +vt 0.0938 0.4063 +vt 0.0938 0.25 +vt 0 0.25 +vt 0 0.4063 +vt 0.0938 1 +vt 0.0938 0.9844 +vt 0 0.9844 +vt 0 1 +vt 0.0313 0.9844 +vt 0.0313 1 +vt 0.125 1 +vt 0.125 0.9844 +vt 0.0938 0.3906 +vt 0.0938 0.25 +vt 0 0.25 +vt 0 0.3906 +vt 0.1563 0.9844 +vt 0.1563 1 +vt 0.2969 1 +vt 0.2969 0.9844 +vt 0.0938 1 +vt 0.0938 0.8594 +vt 0 0.8594 +vt 0 1 +vt 0.7188 0.25 +vt 0.7188 0.3906 +vt 0.75 0.3906 +vt 0.75 0.25 +vt 0.0781 0.9844 +vt 0.0781 1 +vt 0.1094 1 +vt 0.1094 0.9844 +vt 0.7188 0.8594 +vt 0.7188 1 +vt 0.75 1 +vt 0.75 0.8594 +vt 0.7188 0.25 +vt 0.7188 0.4063 +vt 0.75 0.4063 +vt 0.75 0.25 +vt 0.0313 1 +vt 0.0313 0.9844 +vt 0 0.9844 +vt 0 1 +vt 0.7188 0.8438 +vt 0.7188 1 +vt 0.75 1 +vt 0.75 0.8438 +vt 0.2969 1 +vt 0.2969 0.9844 +vt 0 0.9844 +vt 0 1 +vn 0 -1 0 vn 1 0 0 vn -1 0 0 -vn 0 1 0 -vn 0 0.1520571842539411 0.9883716976506172 -vn 1 0 0 -vn -1 0 0 -vn 0 1 0 -vn -1 0 0 -vn -1 0 0 -vn 1 0 0 -vn -1 0 0 -vn 0 1 0 -vn 1 0 0 -vn -1 0 0 -vn 1 0 0 -vn -1 0 0 -vn -1 0 0 -vn 0 1 0 -vn 1 0 0 -vn 1 0 0 -vn 0 1 0 -vn 0 0.1520571842539411 0.9883716976506172 -vn -1 0 0 -vn -1 0 0 -vn 0 1 0 vn 0 0 1 -vn 0 1 0 vn 0 0 -1 -vn -1 0 0 vn 1 0 0 -vn 0 1 0 vn 0 -1 0 -vn 0 0 -1 vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 0 -1 +vn 1 0 0 vn 0 0 1 vn -1 0 0 -vn 0 0 -1 -vn 0 -1 0 -vn 0 0 1 -vn 0 0 1 -vn 0 1 0 -vn 0 0 -1 -vn 1 0 0 -vn 1 0 0 vn -1 0 0 -vn 1 0 0 -vn 0 0.8 -0.6 -vn 0 -0.8 0.6 -vn 0 0 -1 -vn 0 0.8 -0.6 -vn 0 -0.8 0.6 vn 0 0 -1 -vn -1 0 0 vn 1 0 0 vn 0 1 0 +usemtl common_bottom_painted +f 680/1833/459 681/1834/459 678/1835/459 676/1836/459 +f 688/1837/460 683/1838/460 680/1839/460 676/1840/460 +usemtl common_bottom +f 686/1841/461 687/1842/461 678/1843/461 681/1844/461 +usemtl common_bottom_painted +f 684/1845/462 685/1846/462 677/1847/462 675/1848/462 +f 687/1849/463 688/1850/463 676/1851/463 678/1852/463 +f 683/1853/464 684/1854/464 675/1855/464 680/1856/464 +f 681/1857/465 680/1858/465 675/1859/465 677/1860/465 +usemtl common_bottom +f 685/1861/466 686/1862/466 681/1863/466 677/1864/466 +usemtl common_bottom_painted +f 684/1865/467 683/1866/467 679/1867/467 671/1868/467 +f 685/1869/468 684/1870/468 671/1871/468 673/1872/468 +usemtl common_bottom +f 686/1873/469 685/1874/469 673/1875/469 682/1876/469 +f 687/1877/470 686/1878/470 682/1879/470 674/1880/470 +usemtl common_bottom_painted +f 688/1881/471 687/1882/471 674/1883/471 672/1884/471 +f 683/1885/472 688/1886/472 672/1887/472 679/1888/472 +f 672/1889/473 674/1890/473 673/1891/473 671/1892/473 +o armor_left +v -1.125 1.375 1.8125 +v -1.125 1.375 0.625 +v -1.0625 1.375 1.8125 +v -1.0625 1.375 0.625 +v -1.125 0.875 1.8125 +v -1.125 0.875 0.625 +v -1.0625 0.875 1.8125 +v -1.0625 0.875 0.625 +v -1.125 1.375 1.25 +v -1.125 0.875 1.25 +v -1.0625 0.875 1.25 +v -1.0625 1.375 1.25 +v -1.125 1.25 1.25 +v -1.125 1.25 1.8125 +v -1.0625 1.25 1.8125 +v -1.0625 1.25 1.25 +v -1.0625 1.25 0.625 +v -1.125 1.25 0.625 +vt 0 0.9844 +vt 0.1563 0.9844 +vt 0.1563 1 +vt 0 1 +vt 0 0.8438 +vt 0.0938 0.8438 +vt 0.0938 1 +vt 0 1 +vt 0 0.25 +vt 0.0938 0.25 +vt 0.0938 0.4063 +vt 0 0.4063 +vt 0 0.9844 +vt 0.0938 0.9844 +vt 0.0938 1 +vt 0 1 +vt 0.125 1 +vt 0.0313 1 +vt 0.0313 0.9844 +vt 0.125 0.9844 +vt 0 0.25 +vt 0.0938 0.25 +vt 0.0938 0.3906 +vt 0 0.3906 +vt 0.2969 1 +vt 0.1563 1 +vt 0.1563 0.9844 +vt 0.2969 0.9844 +vt 0 0.8594 +vt 0.0938 0.8594 +vt 0.0938 1 +vt 0 1 +vt 0.75 0.3906 +vt 0.7188 0.3906 +vt 0.7188 0.25 +vt 0.75 0.25 +vt 0.1094 1 +vt 0.0781 1 +vt 0.0781 0.9844 +vt 0.1094 0.9844 +vt 0.75 1 +vt 0.7188 1 +vt 0.7188 0.8594 +vt 0.75 0.8594 +vt 0.75 0.4063 +vt 0.7188 0.4063 +vt 0.7188 0.25 +vt 0.75 0.25 +vt 0 0.9844 +vt 0.0313 0.9844 +vt 0.0313 1 +vt 0 1 +vt 0.75 1 +vt 0.7188 1 +vt 0.7188 0.8438 +vt 0.75 0.8438 +vt 0 0.9844 +vt 0.2969 0.9844 +vt 0.2969 1 +vt 0 1 vn 0 -1 0 -vn 0 1 0 -vn 0 -1 0 -vn 1 0 0 vn -1 0 0 -vn 0 0.773065801077826 0.6343258367778339 -vn 0 -0.7730666058142871 -0.63432485602787 -vn 0 -0.043609940372170336 0.9990486340017367 -vn 0 0.773065801077826 0.6343258367778339 -vn 0 -0.7730666058142871 -0.63432485602787 -vn 0 -0.043609940372170336 0.9990486340017367 -vn -1 0 0 -vn 1 0 0 -vn 0 -0.9990482503620459 -0.0436187281856661 -vn 0 0.9990482503620459 0.04361872818566612 -vn 0 -0.9990482503620459 -0.0436187281856661 -vn 0 0.9990482503620459 0.04361872818566612 vn 1 0 0 -vn -1 0 0 -vn 0 0.8 -0.6 -vn 0 -0.8 0.6 -vn 0 0 -1 -vn 0 0.8 -0.6 -vn 0 -0.8 0.6 +vn 0 0 1 vn 0 0 -1 -vn 1 0 0 vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -vn 0 1 0 vn 0 -1 0 -vn -1 0 0 -vn 1 0 0 -vn 0 0.773065801077826 0.6343258367778339 -vn 0 -0.7730666058142871 -0.63432485602787 -vn 0 -0.043609940372170336 0.9990486340017367 -vn 0 0.773065801077826 0.6343258367778339 -vn 0 -0.7730666058142871 -0.63432485602787 -vn 0 -0.043609940372170336 0.9990486340017367 vn 1 0 0 vn -1 0 0 -vn 0 -0.9990482503620459 -0.0436187281856661 -vn 0 0.9990482503620459 0.04361872818566612 -vn 0 -0.9990482503620459 -0.0436187281856661 -vn 0 0.9990482503620459 0.04361872818566612 -vn 0.9848075091295173 -0.17364956078872126 0 -vn -0.9848075091295173 0.1736495607887212 0 -vn 0 0 1 -vn 0 0 -1 -vn 0.9848075091295174 -0.17364956078872126 0 -vn -0.9848075091295174 0.17364956078872124 0 -vn 0 0 1 -vn 0 0 -1 -vn 0.9848072075841259 -0.1736512709148901 0 -vn -0.9848075091295173 0.17364956078872112 0 -vn 0.17364886320761747 0.9848076321326427 0 -vn -0.1736477856007179 -0.9848078221439791 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn 0 -1 0 vn 0 0 1 vn 1 0 0 -vn -1 0 0 -vn 0 0.17364796311995498 0.9848077908426045 -vn 0 0.984807207584126 -0.17365127091488924 -vn 0 -0.9848072075841259 0.1736512709148899 vn 1 0 0 +vn 0 0 -1 vn -1 0 0 -vn 0 0.17364796311995498 0.9848077908426045 -vn 0 0.984807207584126 -0.17365127091488924 -vn 0 -0.9848072075841259 0.1736512709148899 -usemtl common_thingies -f 389/1001/251 387/1002/251 386/1003/251 -f 389/1001/251 386/1003/251 388/1004/251 -f 386/1005/252 387/1006/252 391/1007/252 -f 386/1005/252 391/1007/252 390/1008/252 -f 389/1009/253 388/1010/253 392/1011/253 -f 389/1009/253 392/1011/253 393/1012/253 -f 388/1013/254 386/1014/254 390/1015/254 -f 388/1013/254 390/1015/254 392/1016/254 -f 393/1017/255 391/1018/255 387/1019/255 -f 393/1017/255 387/1019/255 389/1020/255 -f 400/1021/256 398/1022/256 399/1023/256 -f 400/1021/256 399/1023/256 401/1024/256 -f 394/1025/257 395/1026/257 399/1027/257 -f 394/1025/257 399/1027/257 398/1028/257 -f 397/1029/258 396/1030/258 400/1031/258 -f 397/1029/258 400/1031/258 401/1032/258 -f 396/1033/259 394/1034/259 398/1035/259 -f 396/1033/259 398/1035/259 400/1036/259 -f 401/1037/260 399/1038/260 395/1039/260 -f 401/1037/260 395/1039/260 397/1040/260 -f 405/1041/261 403/1042/261 402/1043/261 -f 405/1041/261 402/1043/261 404/1044/261 -f 402/1045/262 403/1046/262 407/1047/262 -f 402/1045/262 407/1047/262 406/1048/262 -f 405/1049/263 404/1050/263 408/1051/263 -f 405/1049/263 408/1051/263 409/1052/263 -f 404/1053/264 402/1054/264 406/1055/264 -f 404/1053/264 406/1055/264 408/1056/264 -f 409/1057/265 407/1058/265 403/1059/265 -f 409/1057/265 403/1059/265 405/1060/265 -usemtl common_rough_steel_painted -f 419/1061/266 422/1062/266 426/1063/266 -f 419/1061/266 426/1063/266 415/1064/266 -usemtl common_rough_steel -f 426/1065/267 427/1066/267 434/1067/267 -f 426/1065/267 434/1067/267 415/1068/267 -usemtl common_rough_steel_painted -f 417/1069/268 432/1070/268 431/1071/268 -f 417/1069/268 431/1071/268 423/1072/268 -f 418/1073/269 429/1074/269 428/1075/269 -f 418/1073/269 428/1075/269 414/1076/269 -f 415/1077/270 434/1078/270 433/1079/270 -f 415/1077/270 433/1079/270 419/1080/270 -f 417/1081/271 423/1082/271 422/1083/271 -f 417/1081/271 422/1083/271 419/1084/271 -f 419/1085/272 433/1086/272 432/1087/272 -f 419/1085/272 432/1087/272 417/1088/272 -f 416/1089/273 430/1090/273 429/1091/273 -f 416/1089/273 429/1091/273 418/1092/273 -f 418/1093/274 422/1094/274 423/1095/274 -f 418/1093/274 423/1095/274 416/1096/274 -f 423/1097/275 431/1098/275 430/1099/275 -f 423/1097/275 430/1099/275 416/1100/275 -usemtl common_rough_steel -f 414/1101/276 428/1102/276 427/1103/276 -f 414/1101/276 427/1103/276 426/1104/276 -usemtl common_rough_steel_painted -f 414/1105/277 426/1106/277 422/1107/277 -f 414/1105/277 422/1107/277 418/1108/277 -usemtl common_rough_steel -f 425/1109/278 427/1110/278 428/1111/278 -f 425/1109/278 428/1111/278 410/1112/278 -usemtl common_rough_steel_painted -f 410/1113/279 428/1114/279 429/1115/279 -f 410/1113/279 429/1115/279 421/1116/279 -f 421/1117/280 429/1118/280 430/1119/280 -f 421/1117/280 430/1119/280 412/1120/280 -f 412/1121/281 430/1122/281 431/1123/281 -f 412/1121/281 431/1123/281 424/1124/281 -f 424/1125/282 431/1126/282 432/1127/282 -f 424/1125/282 432/1127/282 413/1128/282 -f 413/1129/283 432/1130/283 433/1131/283 -f 413/1129/283 433/1131/283 420/1132/283 -f 420/1133/284 433/1134/284 434/1135/284 -f 420/1133/284 434/1135/284 411/1136/284 -usemtl common_rough_steel -f 411/1137/285 434/1138/285 427/1139/285 -f 411/1137/285 427/1139/285 425/1140/285 -usemtl common_steel_norivets -f 441/1141/286 439/1142/286 440/1143/286 -f 441/1141/286 440/1143/286 442/1144/286 -f 435/1145/287 436/1146/287 440/1147/287 -f 435/1145/287 440/1147/287 439/1148/287 -f 437/1149/288 435/1150/288 439/1151/288 -f 437/1149/288 439/1151/288 441/1152/288 -f 442/1153/289 440/1154/289 436/1155/289 -f 442/1153/289 436/1155/289 438/1156/289 -f 449/1157/290 447/1158/290 448/1159/290 -f 449/1157/290 448/1159/290 450/1160/290 -f 443/1161/291 444/1162/291 448/1163/291 -f 443/1161/291 448/1163/291 447/1164/291 -f 445/1165/292 443/1166/292 447/1167/292 -f 445/1165/292 447/1167/292 449/1168/292 -f 450/1169/293 448/1170/293 444/1171/293 -f 450/1169/293 444/1171/293 446/1172/293 -usemtl common_rough_steel_painted -f 468/1173/294 463/1174/294 460/1175/294 -f 468/1173/294 460/1175/294 456/1176/294 -usemtl common_rough_steel -f 466/1177/295 467/1178/295 458/1179/295 -f 466/1177/295 458/1179/295 461/1180/295 -usemtl common_steel_painted_norivets -f 464/1181/296 465/1182/296 457/1183/296 -f 464/1181/296 457/1183/296 455/1184/296 -f 467/1185/297 468/1186/297 456/1187/297 -f 467/1185/297 456/1187/297 458/1188/297 -usemtl common_rough_steel_painted -f 463/1189/298 464/1190/298 455/1191/298 -f 463/1189/298 455/1191/298 460/1192/298 -usemtl common_rough_steel -f 465/1193/299 466/1194/299 461/1195/299 -f 465/1193/299 461/1195/299 457/1196/299 -usemtl common_steel_painted_norivets -f 464/1197/300 463/1198/300 459/1199/300 -f 464/1197/300 459/1199/300 451/1200/300 -f 465/1201/301 464/1202/301 451/1203/301 -f 465/1201/301 451/1203/301 453/1204/301 -usemtl common_rough_steel -f 466/1205/302 465/1206/302 453/1207/302 -f 466/1205/302 453/1207/302 462/1208/302 -f 467/1209/303 466/1210/303 462/1211/303 -f 467/1209/303 462/1211/303 454/1212/303 -usemtl common_steel_painted_norivets -f 468/1213/304 467/1214/304 454/1215/304 -f 468/1213/304 454/1215/304 452/1216/304 -f 463/1217/305 468/1218/305 452/1219/305 -f 463/1217/305 452/1219/305 459/1220/305 -usemtl tracked_motorbike -f 472/1221/306 470/1222/306 469/1223/306 -f 472/1221/306 469/1223/306 471/1224/306 -f 475/1225/307 473/1226/307 474/1227/307 -f 475/1225/307 474/1227/307 476/1228/307 -f 469/1229/308 470/1230/308 474/1231/308 -f 469/1229/308 474/1231/308 473/1232/308 -f 472/1233/309 471/1234/309 475/1235/309 -f 472/1233/309 475/1235/309 476/1236/309 -f 471/1237/310 469/1238/310 473/1239/310 -f 471/1237/310 473/1239/310 475/1240/310 -f 476/1241/311 474/1242/311 470/1243/311 -f 476/1241/311 470/1243/311 472/1244/311 -f 478/1245/312 472/1246/312 471/1247/312 -f 478/1245/312 471/1247/312 477/1248/312 -f 481/1249/313 479/1250/313 480/1251/313 -f 481/1249/313 480/1251/313 482/1252/313 -f 477/1253/314 471/1254/314 479/1255/314 -f 477/1253/314 479/1255/314 481/1256/314 -f 482/1257/315 480/1258/315 472/1259/315 -f 482/1257/315 472/1259/315 478/1260/315 -f 486/1261/316 484/1262/316 483/1263/316 -f 486/1261/316 483/1263/316 485/1264/316 -f 487/1265/317 475/1266/317 476/1267/317 -f 487/1265/317 476/1267/317 488/1268/317 -f 485/1269/318 483/1270/318 475/1271/318 -f 485/1269/318 475/1271/318 487/1272/318 -f 488/1273/319 476/1274/319 484/1275/319 -f 488/1273/319 484/1275/319 486/1276/319 -f 492/1277/320 490/1278/320 489/1279/320 -f 492/1277/320 489/1279/320 491/1280/320 -f 495/1281/321 493/1282/321 494/1283/321 -f 495/1281/321 494/1283/321 496/1284/321 -f 489/1285/322 490/1286/322 494/1287/322 -f 489/1285/322 494/1287/322 493/1288/322 -f 492/1289/323 491/1290/323 495/1291/323 -f 492/1289/323 495/1291/323 496/1292/323 -f 491/1293/324 489/1294/324 493/1295/324 -f 491/1293/324 493/1295/324 495/1296/324 -f 496/1297/325 494/1298/325 490/1299/325 -f 496/1297/325 490/1299/325 492/1300/325 -f 498/1301/326 492/1302/326 491/1303/326 -f 498/1301/326 491/1303/326 497/1304/326 -f 501/1305/327 499/1306/327 500/1307/327 -f 501/1305/327 500/1307/327 502/1308/327 -f 497/1309/328 491/1310/328 499/1311/328 -f 497/1309/328 499/1311/328 501/1312/328 -f 502/1313/329 500/1314/329 492/1315/329 -f 502/1313/329 492/1315/329 498/1316/329 -f 506/1317/330 504/1318/330 503/1319/330 -f 506/1317/330 503/1319/330 505/1320/330 -f 507/1321/331 495/1322/331 496/1323/331 -f 507/1321/331 496/1323/331 508/1324/331 -f 505/1325/332 503/1326/332 495/1327/332 -f 505/1325/332 495/1327/332 507/1328/332 -f 508/1329/333 496/1330/333 504/1331/333 -f 508/1329/333 504/1331/333 506/1332/333 -usemtl common_rough_steel_painted -f 518/1333/334 521/1334/334 525/1335/334 -f 518/1333/334 525/1335/334 514/1336/334 -f 525/1337/335 526/1338/335 533/1339/335 -f 525/1337/335 533/1339/335 514/1340/335 -usemtl common_rough_steel -f 516/1341/336 531/1342/336 530/1343/336 -f 516/1341/336 530/1343/336 522/1344/336 -usemtl common_rough_steel_painted -f 517/1345/337 528/1346/337 527/1347/337 -f 517/1345/337 527/1347/337 513/1348/337 -f 514/1349/338 533/1350/338 532/1351/338 -f 514/1349/338 532/1351/338 518/1352/338 -f 516/1353/339 522/1354/339 521/1355/339 -f 516/1353/339 521/1355/339 518/1356/339 -f 518/1357/340 532/1358/340 531/1359/340 -f 518/1357/340 531/1359/340 516/1360/340 -f 515/1361/341 529/1362/341 528/1363/341 -f 515/1361/341 528/1363/341 517/1364/341 -f 517/1365/342 521/1366/342 522/1367/342 -f 517/1365/342 522/1367/342 515/1368/342 -usemtl common_rough_steel -f 522/1369/343 530/1370/343 529/1371/343 -f 522/1369/343 529/1371/343 515/1372/343 -usemtl common_rough_steel_painted -f 513/1373/344 527/1374/344 526/1375/344 -f 513/1373/344 526/1375/344 525/1376/344 -f 513/1377/345 525/1378/345 521/1379/345 -f 513/1377/345 521/1379/345 517/1380/345 -f 524/1381/346 526/1382/346 527/1383/346 -f 524/1381/346 527/1383/346 509/1384/346 -f 509/1385/347 527/1386/347 528/1387/347 -f 509/1385/347 528/1387/347 520/1388/347 -f 520/1389/348 528/1390/348 529/1391/348 -f 520/1389/348 529/1391/348 511/1392/348 -usemtl common_rough_steel -f 511/1393/349 529/1394/349 530/1395/349 -f 511/1393/349 530/1395/349 523/1396/349 -f 523/1397/350 530/1398/350 531/1399/350 -f 523/1397/350 531/1399/350 512/1400/350 -usemtl common_rough_steel_painted -f 512/1401/351 531/1402/351 532/1403/351 -f 512/1401/351 532/1403/351 519/1404/351 -f 519/1405/352 532/1406/352 533/1407/352 -f 519/1405/352 533/1407/352 510/1408/352 -f 510/1409/353 533/1410/353 526/1411/353 -f 510/1409/353 526/1411/353 524/1412/353 -usemtl common_steel_norivets -f 540/1413/354 538/1414/354 539/1415/354 -f 540/1413/354 539/1415/354 541/1416/354 -f 534/1417/355 535/1418/355 539/1419/355 -f 534/1417/355 539/1419/355 538/1420/355 -f 536/1421/356 534/1422/356 538/1423/356 -f 536/1421/356 538/1423/356 540/1424/356 -f 541/1425/357 539/1426/357 535/1427/357 -f 541/1425/357 535/1427/357 537/1428/357 -usemtl common_thingies -f 548/1429/358 546/1430/358 547/1431/358 -f 548/1429/358 547/1431/358 549/1432/358 -f 542/1433/359 543/1434/359 547/1435/359 -f 542/1433/359 547/1435/359 546/1436/359 -f 545/1437/360 544/1438/360 548/1439/360 -f 545/1437/360 548/1439/360 549/1440/360 -f 544/1441/361 542/1442/361 546/1443/361 -f 544/1441/361 546/1443/361 548/1444/361 -f 549/1445/362 547/1446/362 543/1447/362 -f 549/1445/362 543/1447/362 545/1448/362 -usemtl common_rough_steel_painted -f 559/1449/363 562/1450/363 567/1451/363 -f 559/1449/363 567/1451/363 555/1452/363 -usemtl common_rough_steel -f 557/1453/364 566/1454/364 565/1455/364 -f 557/1453/364 565/1455/364 560/1456/364 -usemtl common_steel_painted_norivets -f 556/1457/365 564/1458/365 563/1459/365 -f 556/1457/365 563/1459/365 554/1460/365 -f 555/1461/366 567/1462/366 566/1463/366 -f 555/1461/366 566/1463/366 557/1464/366 -usemtl common_rough_steel_painted -f 554/1465/367 563/1466/367 562/1467/367 -f 554/1465/367 562/1467/367 559/1468/367 -usemtl common_rough_steel -f 560/1469/368 565/1470/368 564/1471/368 -f 560/1469/368 564/1471/368 556/1472/368 -usemtl common_steel_painted_norivets -f 558/1473/369 562/1474/369 563/1475/369 -f 558/1473/369 563/1475/369 550/1476/369 -f 550/1477/370 563/1478/370 564/1479/370 -f 550/1477/370 564/1479/370 552/1480/370 -usemtl common_rough_steel -f 552/1481/371 564/1482/371 565/1483/371 -f 552/1481/371 565/1483/371 561/1484/371 -f 561/1485/372 565/1486/372 566/1487/372 -f 561/1485/372 566/1487/372 553/1488/372 -usemtl common_steel_painted_norivets -f 553/1489/373 566/1490/373 567/1491/373 -f 553/1489/373 567/1491/373 551/1492/373 -f 551/1493/374 567/1494/374 562/1495/374 -f 551/1493/374 562/1495/374 558/1496/374 -usemtl tracked_motorbike -f 571/1497/375 569/1498/375 568/1499/375 -f 571/1497/375 568/1499/375 570/1500/375 -f 574/1501/376 572/1502/376 573/1503/376 -f 574/1501/376 573/1503/376 575/1504/376 -f 568/1505/377 569/1506/377 573/1507/377 -f 568/1505/377 573/1507/377 572/1508/377 -f 571/1509/378 570/1510/378 574/1511/378 -f 571/1509/378 574/1511/378 575/1512/378 -f 570/1513/379 568/1514/379 572/1515/379 -f 570/1513/379 572/1515/379 574/1516/379 -f 575/1517/380 573/1518/380 569/1519/380 -f 575/1517/380 569/1519/380 571/1520/380 -f 577/1521/381 571/1522/381 570/1523/381 -f 577/1521/381 570/1523/381 576/1524/381 -f 580/1525/382 578/1526/382 579/1527/382 -f 580/1525/382 579/1527/382 581/1528/382 -f 576/1529/383 570/1530/383 578/1531/383 -f 576/1529/383 578/1531/383 580/1532/383 -f 581/1533/384 579/1534/384 571/1535/384 -f 581/1533/384 571/1535/384 577/1536/384 -f 585/1537/385 583/1538/385 582/1539/385 -f 585/1537/385 582/1539/385 584/1540/385 -f 586/1541/386 574/1542/386 575/1543/386 -f 586/1541/386 575/1543/386 587/1544/386 -f 584/1545/387 582/1546/387 574/1547/387 -f 584/1545/387 574/1547/387 586/1548/387 -f 587/1549/388 575/1550/388 583/1551/388 -f 587/1549/388 583/1551/388 585/1552/388 -f 591/1553/389 589/1554/389 588/1555/389 -f 591/1553/389 588/1555/389 590/1556/389 -f 594/1557/390 592/1558/390 593/1559/390 -f 594/1557/390 593/1559/390 595/1560/390 -f 588/1561/391 589/1562/391 593/1563/391 -f 588/1561/391 593/1563/391 592/1564/391 -f 591/1565/392 590/1566/392 594/1567/392 -f 591/1565/392 594/1567/392 595/1568/392 -f 590/1569/393 588/1570/393 592/1571/393 -f 590/1569/393 592/1571/393 594/1572/393 -f 595/1573/394 593/1574/394 589/1575/394 -f 595/1573/394 589/1575/394 591/1576/394 -f 597/1577/395 591/1578/395 590/1579/395 -f 597/1577/395 590/1579/395 596/1580/395 -f 600/1581/396 598/1582/396 599/1583/396 -f 600/1581/396 599/1583/396 601/1584/396 -f 596/1585/397 590/1586/397 598/1587/397 -f 596/1585/397 598/1587/397 600/1588/397 -f 601/1589/398 599/1590/398 591/1591/398 -f 601/1589/398 591/1591/398 597/1592/398 -f 605/1593/399 603/1594/399 602/1595/399 -f 605/1593/399 602/1595/399 604/1596/399 -f 606/1597/400 594/1598/400 595/1599/400 -f 606/1597/400 595/1599/400 607/1600/400 -f 604/1601/401 602/1602/401 594/1603/401 -f 604/1601/401 594/1603/401 606/1604/401 -f 607/1605/402 595/1606/402 603/1607/402 -f 607/1605/402 603/1607/402 605/1608/402 -usemtl common_steel_norivets -f 614/1609/403 612/1610/403 613/1611/403 -f 614/1609/403 613/1611/403 615/1612/403 -f 608/1613/404 609/1614/404 613/1615/404 -f 608/1613/404 613/1615/404 612/1616/404 -f 610/1617/405 608/1618/405 612/1619/405 -f 610/1617/405 612/1619/405 614/1620/405 -f 615/1621/406 613/1622/406 609/1623/406 -f 615/1621/406 609/1623/406 611/1624/406 -usemtl tracked_motorbike -f 616/1625/407 617/1626/407 620/1627/407 -f 616/1625/407 620/1627/407 619/1628/407 -f 621/1629/408 620/1630/408 617/1631/408 -f 621/1629/408 617/1631/408 618/1632/408 -f 618/1633/409 617/1634/409 616/1635/409 -f 618/1633/409 616/1635/409 622/1636/409 -f 623/1637/410 631/1638/410 634/1639/410 -f 623/1637/410 634/1639/410 627/1640/410 -f 629/1641/411 633/1642/411 632/1643/411 -f 629/1641/411 632/1643/411 625/1644/411 -f 630/1645/412 628/1646/412 624/1647/412 -f 630/1645/412 624/1647/412 626/1648/412 -f 626/1649/413 632/1650/413 633/1651/413 -f 626/1649/413 633/1651/413 630/1652/413 -f 628/1653/414 634/1654/414 631/1655/414 -f 628/1653/414 631/1655/414 624/1656/414 -usemtl common_thingies -f 638/1657/415 636/1658/415 635/1659/415 -f 638/1657/415 635/1659/415 637/1660/415 -f 641/1661/416 639/1662/416 640/1663/416 -f 641/1661/416 640/1663/416 642/1664/416 -f 635/1665/417 636/1666/417 640/1667/417 -f 635/1665/417 640/1667/417 639/1668/417 -f 638/1669/418 637/1670/418 641/1671/418 -f 638/1669/418 641/1671/418 642/1672/418 -f 642/1673/419 640/1674/419 636/1675/419 -f 642/1673/419 636/1675/419 638/1676/419 -usemtl tracked_motorbike -f 625/1677/420 626/1678/420 624/1679/420 -f 625/1677/420 624/1679/420 623/1680/420 -f 630/1681/421 629/1682/421 627/1683/421 -f 630/1681/421 627/1683/421 628/1684/421 -f 649/1685/422 647/1686/422 648/1687/422 -f 649/1685/422 648/1687/422 650/1688/422 -f 643/1689/423 644/1690/423 648/1691/423 -f 643/1689/423 648/1691/423 647/1692/423 -f 645/1693/424 643/1694/424 647/1695/424 -f 645/1693/424 647/1695/424 649/1696/424 -f 650/1697/425 648/1698/425 644/1699/425 -f 650/1697/425 644/1699/425 646/1700/425 -f 654/1701/426 652/1702/426 651/1703/426 -f 654/1701/426 651/1703/426 653/1704/426 -f 657/1705/427 655/1706/427 656/1707/427 -f 657/1705/427 656/1707/427 658/1708/427 -f 651/1709/428 652/1710/428 656/1711/428 -f 651/1709/428 656/1711/428 655/1712/428 -f 654/1713/429 653/1714/429 657/1715/429 -f 654/1713/429 657/1715/429 658/1716/429 -f 653/1717/430 651/1718/430 655/1719/430 -f 653/1717/430 655/1719/430 657/1720/430 -f 658/1721/431 656/1722/431 652/1723/431 -f 658/1721/431 652/1723/431 654/1724/431 -usemtl pipe34 -f 662/1725/432 660/1726/432 659/1727/432 -f 662/1725/432 659/1727/432 661/1728/432 -f 665/1729/433 663/1730/433 664/1731/433 -f 665/1729/433 664/1731/433 666/1732/433 -f 659/1733/434 660/1734/434 664/1735/434 -f 659/1733/434 664/1735/434 663/1736/434 -f 662/1737/435 661/1738/435 665/1739/435 -f 662/1737/435 665/1739/435 666/1740/435 -f 666/1741/436 664/1742/436 669/1743/436 -f 666/1741/436 669/1743/436 670/1744/436 -f 660/1745/437 667/1746/437 669/1747/437 -f 660/1745/437 669/1747/437 664/1748/437 -f 668/1749/438 662/1750/438 666/1751/438 -f 668/1749/438 666/1751/438 670/1752/438 -f 670/1753/439 669/1754/439 667/1755/439 -f 670/1753/439 667/1755/439 668/1756/439 -usemtl common_rough_steel -f 671/1757/440 951/1758/440 950/1759/440 -f 671/1757/440 950/1759/440 672/1760/440 -usemtl tracked_motorbike2_paint -f 677/1761/441 675/1762/441 676/1763/441 -f 677/1761/441 676/1763/441 678/1764/441 -usemtl common_steel_painted_norivets -f 671/1765/442 672/1766/442 676/1767/442 -f 671/1765/442 676/1767/442 675/1768/442 -usemtl tracked_motorbike -f 682/1769/443 680/1770/443 679/1771/443 -f 682/1769/443 679/1771/443 681/1772/443 -f 685/1773/444 683/1774/444 684/1775/444 -f 685/1773/444 684/1775/444 686/1776/444 -f 679/1777/445 680/1778/445 684/1779/445 -f 679/1777/445 684/1779/445 683/1780/445 -f 681/1781/446 679/1782/446 683/1783/446 -f 681/1781/446 683/1783/446 685/1784/446 -f 686/1785/447 684/1786/447 680/1787/447 -f 686/1785/447 680/1787/447 682/1788/447 -f 689/1789/448 687/1790/448 681/1791/448 -f 689/1789/448 681/1791/448 688/1792/448 -f 691/1793/449 685/1794/449 690/1795/449 -f 691/1793/449 690/1795/449 692/1796/449 -f 681/1797/450 687/1798/450 690/1799/450 -f 681/1797/450 690/1799/450 685/1800/450 -f 689/1801/451 688/1802/451 691/1803/451 -f 689/1801/451 691/1803/451 692/1804/451 -f 688/1805/452 681/1806/452 685/1807/452 -f 688/1805/452 685/1807/452 691/1808/452 -usemtl tracked_motorbike2_paint -f 694/1809/453 700/1810/453 703/1811/453 -f 694/1809/453 703/1811/453 693/1812/453 -f 696/1813/454 702/1814/454 701/1815/454 -f 696/1813/454 701/1815/454 698/1816/454 -usemtl common_rough_steel -f 696/1817/455 708/1818/455 707/1819/455 -f 696/1817/455 707/1819/455 702/1820/455 -f 701/1821/456 704/1822/456 709/1823/456 -f 701/1821/456 709/1823/456 698/1824/456 -usemtl tracked_motorbike2_paint -f 698/1825/457 709/1826/457 708/1827/457 -f 698/1825/457 708/1827/457 696/1828/457 -usemtl common_rough_steel -f 699/1829/458 705/1830/458 704/1831/458 -f 699/1829/458 704/1831/458 701/1832/458 -usemtl tracked_motorbike2_paint -f 699/1833/459 701/1834/459 702/1835/459 -f 699/1833/459 702/1835/459 697/1836/459 -usemtl common_rough_steel -f 702/1837/460 707/1838/460 706/1839/460 -f 702/1837/460 706/1839/460 697/1840/460 -usemtl tracked_motorbike2_paint -f 677/1841/461 703/1842/461 700/1843/461 -f 677/1841/461 700/1843/461 695/1844/461 -usemtl common_rough_steel -f 700/1845/462 704/1846/462 705/1847/462 -f 700/1845/462 705/1847/462 695/1848/462 -f 677/1849/463 706/1850/463 707/1851/463 -f 677/1849/463 707/1851/463 703/1852/463 -f 703/1853/464 707/1854/464 708/1855/464 -f 703/1853/464 708/1855/464 693/1856/464 -usemtl tracked_motorbike2_paint -f 693/1857/465 708/1858/465 709/1859/465 -f 693/1857/465 709/1859/465 694/1860/465 -usemtl common_rough_steel -f 694/1861/466 709/1862/466 704/1863/466 -f 694/1861/466 704/1863/466 700/1864/466 -usemtl common_bottom -f 711/1865/467 710/1866/467 712/1867/467 -f 711/1865/467 712/1867/467 713/1868/467 -usemtl tracked_motorbike -f 717/1869/468 715/1870/468 714/1871/468 -f 717/1869/468 714/1871/468 716/1872/468 -f 720/1873/469 718/1874/469 719/1875/469 -f 720/1873/469 719/1875/469 721/1876/469 -f 714/1877/470 715/1878/470 719/1879/470 -f 714/1877/470 719/1879/470 718/1880/470 -f 717/1881/471 716/1882/471 720/1883/471 -f 717/1881/471 720/1883/471 721/1884/471 -f 716/1885/472 714/1886/472 718/1887/472 -f 716/1885/472 718/1887/472 720/1888/472 -f 721/1889/473 719/1890/473 715/1891/473 -f 721/1889/473 715/1891/473 717/1892/473 -f 725/1893/474 723/1894/474 722/1895/474 -f 725/1893/474 722/1895/474 724/1896/474 -f 728/1897/475 726/1898/475 727/1899/475 -f 728/1897/475 727/1899/475 729/1900/475 -f 722/1901/476 723/1902/476 727/1903/476 -f 722/1901/476 727/1903/476 726/1904/476 -f 725/1905/477 724/1906/477 728/1907/477 -f 725/1905/477 728/1907/477 729/1908/477 -f 724/1909/478 722/1910/478 726/1911/478 -f 724/1909/478 726/1911/478 728/1912/478 -f 729/1913/479 727/1914/479 723/1915/479 -f 729/1913/479 723/1915/479 725/1916/479 -usemtl common_steel_norivets -f 733/1917/480 731/1918/480 730/1919/480 -f 733/1917/480 730/1919/480 732/1920/480 -f 736/1921/481 734/1922/481 735/1923/481 -f 736/1921/481 735/1923/481 737/1924/481 -usemtl tracked_motorbike -f 730/1925/482 731/1926/482 735/1927/482 -f 730/1925/482 735/1927/482 734/1928/482 -usemtl common_rough_steel -f 739/1929/483 751/1930/483 750/1931/483 -f 739/1929/483 750/1931/483 746/1932/483 -f 743/1933/484 752/1934/484 751/1935/484 -f 743/1933/484 751/1935/484 739/1936/484 -f 742/1937/485 748/1938/485 747/1939/485 -f 742/1937/485 747/1939/485 738/1940/485 -f 739/1941/486 746/1942/486 749/1943/486 -f 739/1941/486 749/1943/486 743/1944/486 -f 746/1945/487 750/1946/487 753/1947/487 -f 746/1945/487 753/1947/487 741/1948/487 -f 740/1949/488 747/1950/488 748/1951/488 -f 740/1949/488 748/1951/488 744/1952/488 -f 745/1953/489 749/1954/489 746/1955/489 -f 745/1953/489 746/1955/489 741/1956/489 -f 747/1957/490 750/1958/490 751/1959/490 -f 747/1957/490 751/1959/490 738/1960/490 -f 738/1961/491 751/1962/491 752/1963/491 -f 738/1961/491 752/1963/491 742/1964/491 -f 740/1965/492 753/1966/492 750/1967/492 -f 740/1965/492 750/1967/492 747/1968/492 -f 766/1969/493 767/1970/493 755/1971/493 -f 766/1969/493 755/1971/493 762/1972/493 -f 767/1973/494 768/1974/494 759/1975/494 -f 767/1973/494 759/1975/494 755/1976/494 -f 763/1977/495 764/1978/495 758/1979/495 -f 763/1977/495 758/1979/495 754/1980/495 -f 765/1981/496 762/1982/496 755/1983/496 -f 765/1981/496 755/1983/496 759/1984/496 -f 769/1985/497 766/1986/497 762/1987/497 -f 769/1985/497 762/1987/497 757/1988/497 -f 764/1989/498 763/1990/498 756/1991/498 -f 764/1989/498 756/1991/498 760/1992/498 -f 762/1993/499 765/1994/499 761/1995/499 -f 762/1993/499 761/1995/499 757/1996/499 -f 767/1997/500 766/1998/500 763/1999/500 -f 767/1997/500 763/1999/500 754/2000/500 -f 768/2001/501 767/2002/501 754/2003/501 -f 768/2001/501 754/2003/501 758/2004/501 -f 766/2005/502 769/2006/502 756/2007/502 -f 766/2005/502 756/2007/502 763/2008/502 -usemtl tracked_motorbike -f 770/2009/503 778/2010/503 781/2011/503 -f 770/2009/503 781/2011/503 771/2012/503 -f 775/2013/504 780/2014/504 779/2015/504 -f 775/2013/504 779/2015/504 774/2016/504 -f 779/2017/505 782/2018/505 784/2019/505 -f 779/2017/505 784/2019/505 774/2020/505 -f 776/2021/506 783/2022/506 782/2023/506 -f 776/2021/506 782/2023/506 779/2024/506 -f 776/2025/507 779/2026/507 780/2027/507 -f 776/2025/507 780/2027/507 777/2028/507 -f 773/2029/508 781/2030/508 778/2031/508 -f 773/2029/508 778/2031/508 772/2032/508 -f 778/2033/509 782/2034/509 783/2035/509 -f 778/2033/509 783/2035/509 772/2036/509 -f 770/2037/510 784/2038/510 782/2039/510 -f 770/2037/510 782/2039/510 778/2040/510 -usemtl common_thingies -f 791/2041/511 789/2042/511 790/2043/511 -f 791/2041/511 790/2043/511 792/2044/511 -f 785/2045/512 786/2046/512 790/2047/512 -f 785/2045/512 790/2047/512 789/2048/512 -f 788/2049/513 787/2050/513 791/2051/513 -f 788/2049/513 791/2051/513 792/2052/513 -f 787/2053/514 785/2054/514 789/2055/514 -f 787/2053/514 789/2055/514 791/2056/514 -f 792/2057/515 790/2058/515 786/2059/515 -f 792/2057/515 786/2059/515 788/2060/515 -usemtl common_steel_norivets -f 793/2061/516 810/2062/516 809/2063/516 -f 793/2061/516 809/2063/516 803/2064/516 -f 806/2065/517 812/2066/517 811/2067/517 -f 806/2065/517 811/2067/517 797/2068/517 -f 794/2069/518 808/2070/518 807/2071/518 -f 794/2069/518 807/2071/518 801/2072/518 -f 801/2073/519 807/2074/519 813/2075/519 -f 801/2073/519 813/2075/519 798/2076/519 -f 803/2077/520 809/2078/520 808/2079/520 -f 803/2077/520 808/2079/520 794/2080/520 -f 798/2081/521 813/2082/521 812/2083/521 -f 798/2081/521 812/2083/521 806/2084/521 -f 802/2085/522 807/2086/522 808/2087/522 -f 802/2085/522 808/2087/522 796/2088/522 -f 796/2089/523 808/2090/523 809/2091/523 -f 796/2089/523 809/2091/523 804/2092/523 -f 804/2093/524 809/2094/524 810/2095/524 -f 804/2093/524 810/2095/524 795/2096/524 -f 799/2097/525 811/2098/525 812/2099/525 -f 799/2097/525 812/2099/525 805/2100/525 -f 805/2101/526 812/2102/526 813/2103/526 -f 805/2101/526 813/2103/526 800/2104/526 -f 800/2105/527 813/2106/527 807/2107/527 -f 800/2105/527 807/2107/527 802/2108/527 -usemtl tracked_motorbike -f 820/2109/528 818/2110/528 819/2111/528 -f 820/2109/528 819/2111/528 821/2112/528 -f 814/2113/529 815/2114/529 819/2115/529 -f 814/2113/529 819/2115/529 818/2116/529 -f 816/2117/530 814/2118/530 818/2119/530 -f 816/2117/530 818/2119/530 820/2120/530 -f 821/2121/531 819/2122/531 815/2123/531 -f 821/2121/531 815/2123/531 817/2124/531 -f 825/2125/532 823/2126/532 822/2127/532 -f 825/2125/532 822/2127/532 824/2128/532 -f 828/2129/533 826/2130/533 827/2131/533 -f 828/2129/533 827/2131/533 829/2132/533 -f 822/2133/534 823/2134/534 827/2135/534 -f 822/2133/534 827/2135/534 826/2136/534 -f 824/2137/535 822/2138/535 826/2139/535 -f 824/2137/535 826/2139/535 828/2140/535 -f 829/2141/536 827/2142/536 823/2143/536 -f 829/2141/536 823/2143/536 825/2144/536 -f 833/2145/537 831/2146/537 830/2147/537 -f 833/2145/537 830/2147/537 832/2148/537 -f 800/2149/538 834/2150/538 835/2151/538 -f 800/2149/538 835/2151/538 836/2152/538 -f 830/2153/539 831/2154/539 835/2155/539 -f 830/2153/539 835/2155/539 834/2156/539 -f 832/2157/540 830/2158/540 834/2159/540 -f 832/2157/540 834/2159/540 800/2160/540 -f 836/2161/541 835/2162/541 831/2163/541 -f 836/2161/541 831/2163/541 833/2164/541 -f 840/2165/542 838/2166/542 837/2167/542 -f 840/2165/542 837/2167/542 839/2168/542 -f 843/2169/543 841/2170/543 842/2171/543 -f 843/2169/543 842/2171/543 844/2172/543 -f 837/2173/544 838/2174/544 842/2175/544 -f 837/2173/544 842/2175/544 841/2176/544 -f 839/2177/545 837/2178/545 841/2179/545 -f 839/2177/545 841/2179/545 843/2180/545 -f 844/2181/546 842/2182/546 838/2183/546 -f 844/2181/546 838/2183/546 840/2184/546 -usemtl common_steel_norivets -f 848/2185/547 846/2186/547 845/2187/547 -f 848/2185/547 845/2187/547 847/2188/547 -f 851/2189/548 849/2190/548 850/2191/548 -f 851/2189/548 850/2191/548 852/2192/548 -f 845/2193/549 846/2194/549 850/2195/549 -f 845/2193/549 850/2195/549 849/2196/549 -f 848/2197/550 847/2198/550 851/2199/550 -f 848/2197/550 851/2199/550 852/2200/550 -usemtl common_thingies -f 856/2201/551 854/2202/551 853/2203/551 -f 856/2201/551 853/2203/551 855/2204/551 -f 859/2205/552 857/2206/552 858/2207/552 -f 859/2205/552 858/2207/552 860/2208/552 -f 853/2209/553 854/2210/553 858/2211/553 -f 853/2209/553 858/2211/553 857/2212/553 -f 856/2213/554 855/2214/554 859/2215/554 -f 856/2213/554 859/2215/554 860/2216/554 -f 855/2217/555 853/2218/555 857/2219/555 -f 855/2217/555 857/2219/555 859/2220/555 -f 860/2221/556 858/2222/556 854/2223/556 -f 860/2221/556 854/2223/556 856/2224/556 -usemtl tracked_motorbike2_paint -f 451/2225/557 866/2226/557 869/2227/557 -f 451/2225/557 869/2227/557 861/2228/557 -f 720/2229/558 868/2230/558 867/2231/558 -f 720/2229/558 867/2231/558 550/2232/558 -usemtl common_steel_painted_norivets -f 550/2233/559 875/2234/559 874/2235/559 -f 550/2233/559 874/2235/559 720/2236/559 -usemtl tracked_motorbike2_paint -f 867/2237/560 870/2238/560 875/2239/560 -f 867/2237/560 875/2239/560 550/2240/560 -usemtl common_bottom -f 720/2241/561 874/2242/561 873/2243/561 -f 720/2241/561 873/2243/561 868/2244/561 -usemtl tracked_motorbike2_paint -f 864/2245/562 871/2246/562 870/2247/562 -f 864/2245/562 870/2247/562 867/2248/562 -f 864/2249/563 867/2250/563 868/2251/563 -f 864/2249/563 868/2251/563 865/2252/563 -usemtl common_bottom -f 868/2253/564 873/2254/564 872/2255/564 -f 868/2253/564 872/2255/564 865/2256/564 -usemtl tracked_motorbike2_paint -f 863/2257/565 869/2258/565 866/2259/565 -f 863/2257/565 866/2259/565 862/2260/565 -f 866/2261/566 870/2262/566 871/2263/566 -f 866/2261/566 871/2263/566 862/2264/566 -usemtl common_bottom -f 863/2265/567 872/2266/567 873/2267/567 -f 863/2265/567 873/2267/567 869/2268/567 -f 869/2269/568 873/2270/568 874/2271/568 -f 869/2269/568 874/2271/568 861/2272/568 -usemtl common_steel_painted_norivets -f 861/2273/569 874/2274/569 875/2275/569 -f 861/2273/569 875/2275/569 451/2276/569 -usemtl tracked_motorbike2_paint -f 451/2277/570 875/2278/570 870/2279/570 -f 451/2277/570 870/2279/570 866/2280/570 -f 877/2281/571 880/2282/571 879/2283/571 -f 877/2281/571 879/2283/571 876/2284/571 -f 678/2285/572 879/2286/572 880/2287/572 -f 678/2285/572 880/2287/572 878/2288/572 -f 876/2289/573 676/2290/573 882/2291/573 -f 876/2289/573 882/2291/573 877/2292/573 -f 884/2293/574 729/2294/574 883/2295/574 -f 884/2293/574 883/2295/574 885/2296/574 -f 729/2297/575 887/2298/575 886/2299/575 -f 729/2297/575 886/2299/575 883/2300/575 -usemtl common_bottom -f 884/2301/576 888/2302/576 887/2303/576 -f 884/2301/576 887/2303/576 729/2304/576 -usemtl tracked_motorbike2_paint -f 883/2305/577 886/2306/577 889/2307/577 -f 883/2305/577 889/2307/577 885/2308/577 -f 676/2309/578 886/2310/578 887/2311/578 -f 676/2309/578 887/2311/578 882/2312/578 -f 876/2313/579 889/2314/579 886/2315/579 -f 876/2313/579 886/2315/579 676/2316/579 -usemtl common_bottom -f 882/2317/580 887/2318/580 888/2319/580 -f 882/2317/580 888/2319/580 877/2320/580 -f 894/2321/581 897/2322/581 901/2323/581 -f 894/2321/581 901/2323/581 890/2324/581 -usemtl tracked_motorbike2_paint -f 882/2325/582 459/2326/582 900/2327/582 -f 882/2325/582 900/2327/582 895/2328/582 -usemtl common_steel_painted_norivets -f 890/2329/583 901/2330/583 459/2331/583 -f 890/2329/583 459/2331/583 882/2332/583 -usemtl common_bottom -f 711/2333/584 898/2334/584 897/2335/584 -f 711/2333/584 897/2335/584 894/2336/584 -usemtl tracked_motorbike2_paint -f 895/2337/585 900/2338/585 899/2339/585 -f 895/2337/585 899/2339/585 878/2340/585 -usemtl common_bottom -f 893/2341/586 897/2342/586 898/2343/586 -f 893/2341/586 898/2343/586 892/2344/586 -usemtl tracked_motorbike2_paint -f 863/2345/587 899/2346/587 900/2347/587 -f 863/2345/587 900/2347/587 896/2348/587 -f 896/2349/588 900/2350/588 459/2351/588 -f 896/2349/588 459/2351/588 861/2352/588 -usemtl common_steel_painted_norivets -f 861/2353/589 459/2354/589 901/2355/589 -f 861/2353/589 901/2355/589 891/2356/589 -usemtl common_bottom -f 891/2357/590 901/2358/590 897/2359/590 -f 891/2357/590 897/2359/590 893/2360/590 -usemtl tracked_motorbike2_paint -f 881/2361/591 903/2362/591 902/2363/591 -f 881/2361/591 902/2363/591 674/2364/591 -f 862/2365/592 905/2366/592 904/2367/592 -f 862/2365/592 904/2367/592 693/2368/592 -f 908/2369/593 906/2370/593 907/2371/593 -f 908/2369/593 907/2371/593 909/2372/593 -usemtl common_steel_painted_norivets -f 904/2373/594 905/2374/594 907/2375/594 -f 904/2373/594 907/2375/594 906/2376/594 -usemtl tracked_motorbike2_paint -f 693/2377/595 904/2378/595 906/2379/595 -f 693/2377/595 906/2379/595 908/2380/595 -usemtl common_rough_steel -f 910/2381/596 953/2382/596 952/2383/596 -f 910/2381/596 952/2383/596 911/2384/596 -usemtl tracked_motorbike2_paint -f 914/2385/597 883/2386/597 913/2387/597 -f 914/2385/597 913/2387/597 697/2388/597 -usemtl common_steel_painted_norivets -f 910/2389/598 911/2390/598 913/2391/598 -f 910/2389/598 913/2391/598 883/2392/598 -usemtl tracked_motorbike2_paint -f 885/2393/599 917/2394/599 916/2395/599 -f 885/2393/599 916/2395/599 884/2396/599 -f 915/2397/600 916/2398/600 917/2399/600 -f 915/2397/600 917/2399/600 914/2400/600 -usemtl common_bottom -f 922/2401/601 925/2402/601 930/2403/601 -f 922/2401/601 930/2403/601 918/2404/601 -usemtl tracked_motorbike2_paint -f 720/2405/602 929/2406/602 928/2407/602 -f 720/2405/602 928/2407/602 923/2408/602 -usemtl common_steel_painted_norivets -f 918/2409/603 930/2410/603 929/2411/603 -f 918/2409/603 929/2411/603 720/2412/603 +vn 0 1 0 +usemtl common_bottom_painted +f 696/1893/474 699/1894/474 698/1895/474 694/1896/474 +f 698/1897/475 701/1898/475 706/1899/475 694/1900/475 usemtl common_bottom -f 920/2413/604 926/2414/604 925/2415/604 -f 920/2413/604 925/2415/604 922/2416/604 -usemtl tracked_motorbike2_paint -f 923/2417/605 928/2418/605 927/2419/605 -f 923/2417/605 927/2419/605 865/2420/605 +f 696/1901/476 705/1902/476 704/1903/476 699/1904/476 +usemtl common_bottom_painted +f 695/1905/477 703/1906/477 702/1907/477 693/1908/477 +f 694/1909/478 706/1910/478 705/1911/478 696/1912/478 +f 693/1913/479 702/1914/479 701/1915/479 698/1916/479 +f 693/1917/480 698/1918/480 699/1919/480 695/1920/480 usemtl common_bottom -f 921/2421/606 925/2422/606 926/2423/606 -f 921/2421/606 926/2423/606 713/2424/606 -usemtl tracked_motorbike2_paint -f 915/2425/607 927/2426/607 928/2427/607 -f 915/2425/607 928/2427/607 924/2428/607 -f 924/2429/608 928/2430/608 929/2431/608 -f 924/2429/608 929/2431/608 729/2432/608 -usemtl common_steel_painted_norivets -f 729/2433/609 929/2434/609 930/2435/609 -f 729/2433/609 930/2435/609 919/2436/609 +f 699/1921/481 704/1922/481 703/1923/481 695/1924/481 +usemtl common_bottom_painted +f 697/1925/482 701/1926/482 702/1927/482 689/1928/482 +f 689/1929/483 702/1930/483 703/1931/483 691/1932/483 usemtl common_bottom -f 919/2437/610 930/2438/610 925/2439/610 -f 919/2437/610 925/2439/610 921/2440/610 -usemtl tracked_motorbike2_paint -f 934/2441/611 932/2442/611 931/2443/611 -f 934/2441/611 931/2443/611 933/2444/611 -usemtl common_steel_painted_norivets -f 931/2445/612 932/2446/612 936/2447/612 -f 931/2445/612 936/2447/612 935/2448/612 -usemtl tracked_motorbike2_paint -f 933/2449/613 931/2450/613 935/2451/613 -f 933/2449/613 935/2451/613 696/2452/613 -f 696/2453/614 935/2454/614 936/2455/614 -f 696/2453/614 936/2455/614 864/2456/614 -usemtl common_thingies -f 942/2457/615 940/2458/615 941/2459/615 -f 942/2457/615 941/2459/615 943/2460/615 -f 937/2461/616 938/2462/616 941/2463/616 -f 937/2461/616 941/2463/616 940/2464/616 -f 939/2465/617 937/2466/617 940/2467/617 -f 939/2465/617 940/2467/617 942/2468/617 -f 948/2469/618 945/2470/618 944/2471/618 -f 948/2469/618 944/2471/618 947/2472/618 -f 947/2473/619 944/2474/619 946/2475/619 -f 947/2473/619 946/2475/619 949/2476/619 -usemtl common_rough_steel -f 674/2477/620 950/2478/620 951/2479/620 -f 674/2477/620 951/2479/620 673/2480/620 -f 912/2481/621 952/2482/621 953/2483/621 -f 912/2481/621 953/2483/621 881/2484/621 -usemtl tracked_motorbike -f 954/2485/622 955/2486/622 959/2487/622 -f 954/2485/622 959/2487/622 958/2488/622 -f 957/2489/623 956/2490/623 960/2491/623 -f 957/2489/623 960/2491/623 961/2492/623 -f 961/2493/624 959/2494/624 955/2495/624 -f 961/2493/624 955/2495/624 957/2496/624 -usemtl tracked_motorbike2_paint -f 964/2497/625 966/2498/625 969/2499/625 -f 964/2497/625 969/2499/625 913/2500/625 -usemtl common_steel_painted_norivets -f 962/2501/626 974/2502/626 973/2503/626 -f 962/2501/626 973/2503/626 675/2504/626 -usemtl common_rough_steel -f 695/2505/627 705/2506/627 971/2507/627 -f 695/2505/627 971/2507/627 963/2508/627 -f 675/2509/628 973/2510/628 972/2511/628 -f 675/2509/628 972/2511/628 968/2512/628 -usemtl tracked_motorbike2_paint -f 967/2513/629 970/2514/629 974/2515/629 -f 967/2513/629 974/2515/629 962/2516/629 -f 963/2517/630 971/2518/630 970/2519/630 -f 963/2517/630 970/2519/630 967/2520/630 -usemtl common_rough_steel -f 968/2521/631 972/2522/631 705/2523/631 -f 968/2521/631 705/2523/631 695/2524/631 -usemtl tracked_motorbike2_paint -f 699/2525/632 969/2526/632 966/2527/632 -f 699/2525/632 966/2527/632 965/2528/632 -f 966/2529/633 970/2530/633 971/2531/633 -f 966/2529/633 971/2531/633 965/2532/633 -usemtl common_rough_steel -f 965/2533/634 971/2534/634 705/2535/634 -f 965/2533/634 705/2535/634 699/2536/634 -f 699/2537/635 705/2538/635 972/2539/635 -f 699/2537/635 972/2539/635 969/2540/635 -f 969/2541/636 972/2542/636 973/2543/636 -f 969/2541/636 973/2543/636 913/2544/636 -usemtl common_steel_painted_norivets -f 913/2545/637 973/2546/637 974/2547/637 -f 913/2545/637 974/2547/637 964/2548/637 -usemtl tracked_motorbike2_paint -f 964/2549/638 974/2550/638 970/2551/638 -f 964/2549/638 970/2551/638 966/2552/638 -f 963/2553/639 967/2554/639 968/2555/639 -f 963/2553/639 968/2555/639 695/2556/639 -f 675/2557/640 968/2558/640 967/2559/640 -f 675/2557/640 967/2559/640 962/2560/640 -usemtl common_steel_painted_norivets -f 976/2561/641 977/2562/641 979/2563/641 -f 976/2561/641 979/2563/641 978/2564/641 -f 981/2565/642 980/2566/642 982/2567/642 -f 981/2565/642 982/2567/642 983/2568/642 -usemtl common_steel_painted -f 984/2569/643 985/2570/643 980/2571/643 -f 984/2569/643 980/2571/643 981/2572/643 -usemtl common_steel_norivets -f 986/2573/644 975/2574/644 983/2575/644 -f 986/2573/644 983/2575/644 982/2576/644 -usemtl common_steel_painted_norivets -f 975/2577/645 984/2578/645 981/2579/645 -f 975/2577/645 981/2579/645 983/2580/645 -f 985/2581/646 984/2582/646 977/2583/646 -f 985/2581/646 977/2583/646 976/2584/646 -usemtl common_steel_norivets -f 975/2585/647 986/2586/647 978/2587/647 -f 975/2585/647 978/2587/647 979/2588/647 -usemtl common_steel_painted_norivets -f 984/2589/648 975/2590/648 979/2591/648 -f 984/2589/648 979/2591/648 977/2592/648 -f 555/2593/649 976/2594/649 978/2595/649 -f 555/2593/649 978/2595/649 557/2596/649 -f 980/2597/650 553/2598/650 987/2599/650 -f 980/2597/650 987/2599/650 982/2600/650 -usemtl common_steel_painted -f 985/2601/651 988/2602/651 553/2603/651 -f 985/2601/651 553/2603/651 980/2604/651 -usemtl common_steel_norivets -f 989/2605/652 986/2606/652 982/2607/652 -f 989/2605/652 982/2607/652 987/2608/652 -usemtl common_steel_painted_norivets -f 988/2609/653 985/2610/653 976/2611/653 -f 988/2609/653 976/2611/653 555/2612/653 -usemtl common_rough_steel -f 986/2613/654 989/2614/654 557/2615/654 -f 986/2613/654 557/2615/654 978/2616/654 -usemtl common_steel_painted_norivets -f 990/2617/655 991/2618/655 993/2619/655 -f 990/2617/655 993/2619/655 992/2620/655 -usemtl common_steel_painted -f 995/2621/656 994/2622/656 996/2623/656 -f 995/2621/656 996/2623/656 997/2624/656 -usemtl common_steel_painted_norivets -f 998/2625/657 999/2626/657 994/2627/657 -f 998/2625/657 994/2627/657 995/2628/657 -usemtl common_steel_norivets -f 1000/2629/658 1001/2630/658 997/2631/658 -f 1000/2629/658 997/2631/658 996/2632/658 -usemtl common_steel_painted_norivets -f 1001/2633/659 998/2634/659 995/2635/659 -f 1001/2633/659 995/2635/659 997/2636/659 -usemtl common_steel_painted -f 999/2637/660 998/2638/660 991/2639/660 -f 999/2637/660 991/2639/660 990/2640/660 -usemtl common_steel_norivets -f 1001/2641/661 1000/2642/661 992/2643/661 -f 1001/2641/661 992/2643/661 993/2644/661 -usemtl common_steel_painted_norivets -f 998/2645/662 1001/2646/662 993/2647/662 -f 998/2645/662 993/2647/662 991/2648/662 -usemtl common_steel_painted -f 1002/2649/663 996/2650/663 994/2651/663 -f 1002/2649/663 994/2651/663 1003/2652/663 -usemtl common_steel_painted_norivets -f 992/2653/664 1004/2654/664 1005/2655/664 -f 992/2653/664 1005/2655/664 990/2656/664 -usemtl common_steel_norivets -f 1000/2657/665 1006/2658/665 1004/2659/665 -f 1000/2657/665 1004/2659/665 992/2660/665 -usemtl common_steel_painted -f 1007/2661/666 999/2662/666 990/2663/666 -f 1007/2661/666 990/2663/666 1005/2664/666 -usemtl common_rough_steel -f 1006/2665/667 1000/2666/667 996/2667/667 -f 1006/2665/667 996/2667/667 1002/2668/667 -usemtl common_steel_painted_norivets -f 999/2669/668 1007/2670/668 1003/2671/668 -f 999/2669/668 1003/2671/668 994/2672/668 -f 1012/2673/669 1010/2674/669 1009/2675/669 -f 1012/2673/669 1009/2675/669 1011/2676/669 -f 1015/2677/670 1013/2678/670 1014/2679/670 -f 1015/2677/670 1014/2679/670 1016/2680/670 -usemtl common_steel_painted -f 1013/2681/671 1018/2682/671 1017/2683/671 -f 1013/2681/671 1017/2683/671 1014/2684/671 -usemtl common_steel_norivets -f 1016/2685/672 1008/2686/672 1019/2687/672 -f 1016/2685/672 1019/2687/672 1015/2688/672 -usemtl common_steel_painted_norivets -f 1014/2689/673 1017/2690/673 1008/2691/673 -f 1014/2689/673 1008/2691/673 1016/2692/673 -f 1010/2693/674 1017/2694/674 1018/2695/674 -f 1010/2693/674 1018/2695/674 1009/2696/674 -usemtl common_steel_norivets -f 1011/2697/675 1019/2698/675 1008/2699/675 -f 1011/2697/675 1008/2699/675 1012/2700/675 -usemtl common_steel_painted_norivets -f 1012/2701/676 1008/2702/676 1017/2703/676 -f 1012/2701/676 1017/2703/676 1010/2704/676 -f 1011/2705/677 1009/2706/677 456/2707/677 -f 1011/2705/677 456/2707/677 458/2708/677 -f 1020/2709/678 454/2710/678 1013/2711/678 -f 1020/2709/678 1013/2711/678 1015/2712/678 -usemtl common_steel_painted -f 454/2713/679 1021/2714/679 1018/2715/679 -f 454/2713/679 1018/2715/679 1013/2716/679 -usemtl common_steel_norivets -f 1015/2717/680 1019/2718/680 1022/2719/680 -f 1015/2717/680 1022/2719/680 1020/2720/680 -usemtl common_steel_painted_norivets -f 1009/2721/681 1018/2722/681 1021/2723/681 -f 1009/2721/681 1021/2723/681 456/2724/681 -usemtl common_rough_steel -f 458/2725/682 1022/2726/682 1019/2727/682 -f 458/2725/682 1019/2727/682 1011/2728/682 -usemtl common_steel_painted_norivets -f 1026/2729/683 1024/2730/683 1023/2731/683 -f 1026/2729/683 1023/2731/683 1025/2732/683 -f 1029/2733/684 1027/2734/684 1028/2735/684 -f 1029/2733/684 1028/2735/684 1030/2736/684 -f 1027/2737/685 1032/2738/685 1031/2739/685 -f 1027/2737/685 1031/2739/685 1028/2740/685 -usemtl common_steel_norivets -f 1030/2741/686 1034/2742/686 1033/2743/686 -f 1030/2741/686 1033/2743/686 1029/2744/686 -usemtl common_steel_painted_norivets -f 1028/2745/687 1031/2746/687 1034/2747/687 -f 1028/2745/687 1034/2747/687 1030/2748/687 -usemtl common_steel_painted -f 1024/2749/688 1031/2750/688 1032/2751/688 -f 1024/2749/688 1032/2751/688 1023/2752/688 -usemtl common_steel_norivets -f 1025/2753/689 1033/2754/689 1034/2755/689 -f 1025/2753/689 1034/2755/689 1026/2756/689 -usemtl common_steel_painted_norivets -f 1026/2757/690 1034/2758/690 1031/2759/690 -f 1026/2757/690 1031/2759/690 1024/2760/690 -f 1027/2761/691 1029/2762/691 1035/2763/691 -f 1027/2761/691 1035/2763/691 1036/2764/691 -f 1038/2765/692 1037/2766/692 1025/2767/692 -f 1038/2765/692 1025/2767/692 1023/2768/692 -usemtl common_steel_norivets -f 1037/2769/693 1039/2770/693 1033/2771/693 -f 1037/2769/693 1033/2771/693 1025/2772/693 -usemtl common_steel_painted -f 1023/2773/694 1032/2774/694 1040/2775/694 -f 1023/2773/694 1040/2775/694 1038/2776/694 -usemtl common_rough_steel -f 1029/2777/695 1033/2778/695 1039/2779/695 -f 1029/2777/695 1039/2779/695 1035/2780/695 -usemtl common_steel_painted_norivets -f 1036/2781/696 1040/2782/696 1032/2783/696 -f 1036/2781/696 1032/2783/696 1027/2784/696 -usemtl tracked_motorbike2 -f 1044/2785/697 1042/2786/697 1041/2787/697 -f 1044/2785/697 1041/2787/697 1043/2788/697 -f 1047/2789/698 1045/2790/698 1046/2791/698 -f 1047/2789/698 1046/2791/698 1048/2792/698 -f 1043/2793/699 1041/2794/699 1045/2795/699 -f 1043/2793/699 1045/2795/699 1047/2796/699 -f 1048/2797/700 1046/2798/700 1042/2799/700 -f 1048/2797/700 1042/2799/700 1044/2800/700 -f 1052/2801/701 1050/2802/701 1049/2803/701 -f 1052/2801/701 1049/2803/701 1051/2804/701 -f 1055/2805/702 1053/2806/702 1054/2807/702 -f 1055/2805/702 1054/2807/702 1056/2808/702 -f 1051/2809/703 1049/2810/703 1053/2811/703 -f 1051/2809/703 1053/2811/703 1055/2812/703 -f 1056/2813/704 1054/2814/704 1050/2815/704 -f 1056/2813/704 1050/2815/704 1052/2816/704 -usemtl tracked_motorbike2_paint -f 1060/2817/705 1058/2818/705 1057/2819/705 -f 1060/2817/705 1057/2819/705 1059/2820/705 -f 1063/2821/706 1061/2822/706 1062/2823/706 -f 1063/2821/706 1062/2823/706 1064/2824/706 -f 1057/2825/707 1058/2826/707 1062/2827/707 -f 1057/2825/707 1062/2827/707 1061/2828/707 -usemtl tracked_motorbike2 -f 1060/2829/708 1059/2830/708 1063/2831/708 -f 1060/2829/708 1063/2831/708 1064/2832/708 -usemtl tracked_motorbike2_paint -f 1059/2833/709 1057/2834/709 1061/2835/709 -f 1059/2833/709 1061/2835/709 1063/2836/709 -f 1064/2837/710 1062/2838/710 1058/2839/710 -f 1064/2837/710 1058/2839/710 1060/2840/710 -usemtl tracked_motorbike -f 1070/2841/711 1066/2842/711 1065/2843/711 -f 1070/2841/711 1065/2843/711 1069/2844/711 -f 1071/2845/712 1067/2846/712 1068/2847/712 -f 1071/2845/712 1068/2847/712 1072/2848/712 -f 1066/2849/713 1070/2850/713 1072/2851/713 -f 1066/2849/713 1072/2851/713 1068/2852/713 -usemtl common_thingies -f 1076/2853/714 1074/2854/714 1073/2855/714 -f 1076/2853/714 1073/2855/714 1075/2856/714 -f 1079/2857/715 1077/2858/715 1078/2859/715 -f 1079/2857/715 1078/2859/715 1080/2860/715 -f 1076/2861/716 1075/2862/716 1079/2863/716 -f 1076/2861/716 1079/2863/716 1080/2864/716 -f 1075/2865/717 1073/2866/717 1077/2867/717 -f 1075/2865/717 1077/2867/717 1079/2868/717 -f 1080/2869/718 1078/2870/718 1074/2871/718 -f 1080/2869/718 1074/2871/718 1076/2872/718 -f 1084/2873/719 1082/2874/719 1081/2875/719 -f 1084/2873/719 1081/2875/719 1083/2876/719 -f 1087/2877/720 1085/2878/720 1086/2879/720 -f 1087/2877/720 1086/2879/720 1088/2880/720 -f 1084/2881/721 1083/2882/721 1087/2883/721 -f 1084/2881/721 1087/2883/721 1088/2884/721 -f 1083/2885/722 1081/2886/722 1085/2887/722 -f 1083/2885/722 1085/2887/722 1087/2888/722 -f 1088/2889/723 1086/2890/723 1082/2891/723 -f 1088/2889/723 1082/2891/723 1084/2892/723 -o shaft -v 0.4375 0.625 1.6875 -v 0.4375 0.625 0.75 -v 0.4375 0.5 1.6875 -v 0.4375 0.5 0.75 -v 0.3125 0.625 1.6875 -v 0.3125 0.625 0.75 -v 0.3125 0.5 1.6875 -v 0.3125 0.5 0.75 -vt 0.65625 0.5 -vt 0.71875 0.5 -vt 0.71875 0.03125 -vt 0.65625 0.03125 -vt 0.71875 0.03125 -vt 0.65625 0.03125 -vt 0.65625 0.5 -vt 0.71875 0.5 -vt 0.71875 0.03125 -vt 0.71875 0.5 -vt 0.65625 0.5 -vt 0.65625 0.03125 -vt 0.65625 0.5 -vt 0.65625 0.03125 -vt 0.71875 0.03125 -vt 0.71875 0.5 -vn 1 0 0 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl pipe34 -f 1092/2893/724 1090/2894/724 1089/2895/724 -f 1092/2893/724 1089/2895/724 1091/2896/724 -f 1095/2897/725 1093/2898/725 1094/2899/725 -f 1095/2897/725 1094/2899/725 1096/2900/725 -f 1089/2901/726 1090/2902/726 1094/2903/726 -f 1089/2901/726 1094/2903/726 1093/2904/726 -f 1092/2905/727 1091/2906/727 1095/2907/727 -f 1092/2905/727 1095/2907/727 1096/2908/727 -o crip -v 0.09375 1.352523125 -0.833825 -v 0.09375 1.39470125 -1.016519375 -v 0.09375 1.108930625 -0.890063125 -v 0.09375 1.1511087500000001 -1.0727575 -v -0.09375 1.352523125 -0.833825 -v -0.09375 1.39470125 -1.016519375 -v -0.09375 1.108930625 -0.890063125 -v -0.09375 1.1511087500000001 -1.0727575 -v -0.09375 1.272905 -1.044638125 -v 0.09375 1.272905 -1.044638125 -v 0.09375 1.230726875 -0.86194375 -v -0.09375 1.230726875 -0.86194375 -v 0.21875 1.3125 -0.875 -v 0.18125000000000002 1.3125 -0.9624999999999999 -v 0.21875 1.1875 -0.875 -v 0.18125000000000002 1.1875 -0.9624999999999999 -v 0.09375 1.3125 -0.875 -v 0.09375 1.3125 -1 -v 0.09375 1.1875 -0.875 -v 0.09375 1.1875 -1 -v 0.21875 1.3125 -0.5625 -v 0.21875 1.1875 -0.5625 -v 0.09375 1.3125 -0.5625 -v 0.09375 1.1875 -0.5625 -v -0.21875 1.1875 -0.875 -v -0.18125000000000002 1.1875 -0.9624999999999999 -v -0.21875 1.3125 -0.875 -v -0.18125000000000002 1.3125 -0.9624999999999999 -v -0.09375 1.1875 -0.875 -v -0.09375 1.1875 -1 -v -0.09375 1.3125 -0.875 -v -0.09375 1.3125 -1 -v -0.21875 1.1875 -0.5625 -v -0.21875 1.3125 -0.5625 -v -0.09375 1.1875 -0.5625 -v -0.09375 1.3125 -0.5625 -v 0.13749999999999996 1.412884375 -1.138330625 -v 0.13749999999999996 1.080511875 -1.196936875 -v 0.13749999999999996 1.4020312499999998 -1.07678 -v 0.13749999999999996 1.0696587499999999 -1.13538625 -v -0.1375 1.412884375 -1.138330625 -v -0.1375 1.080511875 -1.196936875 -v -0.1375 1.4020312499999998 -1.07678 -v -0.1375 1.0696587499999999 -1.13538625 -v 0.08281249999999996 1.346635625 -1.0865475 -v 0.08281249999999996 1.10043375 -1.12996 -v 0.08281249999999996 1.3357831249999998 -1.0249975 -v 0.08281249999999996 1.089580625 -1.068409375 -v -0.08281250000000001 1.346635625 -1.0865475 -v -0.08281250000000001 1.10043375 -1.12996 -v -0.08281250000000001 1.3357831249999998 -1.0249975 -v -0.08281250000000001 1.089580625 -1.068409375 -vt 0.90625 1 -vt 0.90625 0.96875 -vt 0.953125 0.96875 -vt 0.953125 1 -vt 0.875 1 -vt 0.875 0.96875 -vt 0.921875 0.96875 -vt 0.921875 1 -vt 0.90625 0.234375 -vt 0.90625 0.28125 -vt 0.859375 0.28125 -vt 0.859375 0.234375 -vt 0.90625 0.234375 -vt 0.90625 0.28125 -vt 0.859375 0.28125 -vt 0.859375 0.234375 -vt 0.875 1 -vt 0.875 0.96875 -vt 0.921875 0.96875 -vt 0.921875 1 -vt 0.875 1 -vt 0.875 0.96875 -vt 0.921875 0.96875 -vt 0.921875 1 -vt 0.890625 0.25 -vt 0.890625 0.28125 -vt 0.84375 0.28125 -vt 0.84375 0.25 -vt 0.921875 0.25 -vt 0.921875 0.28125 -vt 0.875 0.28125 -vt 0.875 0.25 -vt 0.890625 0.25 -vt 0.890625 0.28125 -vt 0.84375 0.28125 -vt 0.84375 0.25 -vt 0.890625 0.25 -vt 0.890625 0.28125 -vt 0.84375 0.28125 -vt 0.84375 0.25 -vt 0.11755 0.28125 -vt 0.11755 0.25 -vt 0.09375 0.25 -vt 0.09375 0.28125 -vt 0.375 0.21875 -vt 0.375 0.25 -vt 0.40625 0.25 -vt 0.40625 0.21875 -vt 0.96875 1 -vt 1 1 -vt 1 0.96875 -vt 0.96875 0.96875 -vt 1 1 -vt 1 0.96875 -vt 0.96875 0.96875 -vt 0.96875 1 -vt 0.09375 0.28125 -vt 0.09375 0.25 -vt 0.125 0.25 -vt 0.125 0.28125 -vt 0.078125 0.28125 -vt 0.078125 0.25 -vt 0.15625 0.25 -vt 0.15625 0.28125 -vt 0.890625 0.453125 -vt 0.890625 0.484375 -vt 0.96875 0.484375 -vt 0.96875 0.453125 -vt 0.875 1 -vt 0.953125 1 -vt 0.953125 0.96875 -vt 0.875 0.96875 -vt 1 0.859375 -vt 1 0.9375 -vt 0.96875 0.9375 -vt 0.96875 0.859375 -vt 0.11755 0.25 -vt 0.11755 0.28125 -vt 0.09375 0.28125 -vt 0.09375 0.25 -vt 0.375 0.21875 -vt 0.375 0.25 -vt 0.40625 0.25 -vt 0.40625 0.21875 -vt 0.96875 1 -vt 1 1 -vt 1 0.96875 -vt 0.96875 0.96875 -vt 1 1 -vt 1 0.96875 -vt 0.96875 0.96875 -vt 0.96875 1 -vt 0.09375 0.25 -vt 0.09375 0.28125 -vt 0.125 0.28125 -vt 0.125 0.25 -vt 0.078125 0.25 -vt 0.078125 0.28125 -vt 0.15625 0.28125 -vt 0.15625 0.25 -vt 0.890625 0.453125 -vt 0.890625 0.484375 -vt 0.96875 0.484375 -vt 0.96875 0.453125 -vt 0.875 1 -vt 0.953125 1 -vt 0.953125 0.96875 -vt 0.875 0.96875 -vt 1 0.859375 -vt 1 0.9375 -vt 0.96875 0.9375 -vt 0.96875 0.859375 -vt 0.78125 0.515625 -vt 0.765625 0.515625 -vt 0.765625 0.421875 -vt 0.78125 0.421875 -vt 0.78125 0.515625 -vt 0.765625 0.515625 -vt 0.765625 0.421875 -vt 0.78125 0.421875 -vt 0.84375 0.515625 -vt 0.84375 0.421875 -vt 0.765625 0.421875 -vt 0.765625 0.515625 -vt 0.84375 0.421875 -vt 0.84375 0.515625 -vt 0.765625 0.515625 -vt 0.765625 0.421875 -vt 0.84375 0.5 -vt 0.84375 0.515625 -vt 0.765625 0.515625 -vt 0.765625 0.5 -vt 0.84375 0.5 -vt 0.84375 0.515625 -vt 0.765625 0.515625 -vt 0.765625 0.5 -vt 0.265625 0.265625 -vt 0.28125 0.265625 -vt 0.28125 0.328125 -vt 0.265625 0.328125 -vt 0.25 0.265625 -vt 0.265625 0.265625 -vt 0.265625 0.328125 -vt 0.25 0.328125 -vt 0.28125 0.265625 -vt 0.28125 0.328125 -vt 0.25 0.328125 -vt 0.25 0.265625 -vt 0.28125 0.3125 -vt 0.28125 0.328125 -vt 0.25 0.328125 -vt 0.25 0.3125 -vn 1 0 0 -vn -1 0 0 -vn 0 0.9743702926034429 0.2249500675525154 -vn 0 -0.9743702926034428 -0.22495006755251568 -vn 0 -0.22495006755251512 0.974370292603443 -vn 0 0.2249500675525168 -0.9743702926034425 -vn 0 0.22495481453326738 -0.9743691966694674 -vn 1 0 0 -vn 0 -0.2249548145332672 0.9743691966694675 -vn -1 0 0 -vn 0.919145030018058 0 -0.3939192985791679 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -vn 0.39391929857916846 0 -0.9191450300180577 -vn 1 0 0 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -vn -0.919145030018058 0 -0.3939192985791679 -vn 1 0 0 -vn 0 -1 0 -vn 0 1 0 -vn -0.39391929857916846 0 -0.9191450300180577 -vn -1 0 0 -vn 1 0 0 -vn 0 -1 0 -vn 0 1 0 -vn 1 0 0 -vn -1 0 0 -vn 0 0.1736482081401605 -0.9848077476389551 -vn 0 -0.1736482081401605 0.9848077476389551 -vn 0 0.9848075091295172 0.17364956078872174 -vn 0 -0.9848075091295172 -0.17364956078872174 -vn 1 0 0 -vn -1 0 0 -vn 0 -0.17364713617870034 0.9848079366541154 -vn 0 0.9848089176820872 0.17364157236628583 -usemtl common_steel_painted_norivets -f 1097/2909/728 1107/2910/728 1106/2911/728 -f 1097/2909/728 1106/2911/728 1098/2912/728 -f 1102/2913/729 1105/2914/729 1108/2915/729 -f 1102/2913/729 1108/2915/729 1101/2916/729 -f 1097/2917/730 1098/2918/730 1102/2919/730 -f 1097/2917/730 1102/2919/730 1101/2920/730 -f 1100/2921/731 1099/2922/731 1103/2923/731 -f 1100/2921/731 1103/2923/731 1104/2924/731 -f 1101/2925/732 1108/2926/732 1107/2927/732 -f 1101/2925/732 1107/2927/732 1097/2928/732 -f 1098/2929/733 1106/2930/733 1105/2931/733 -f 1098/2929/733 1105/2931/733 1102/2932/733 -f 1104/2933/734 1105/2934/734 1106/2935/734 -f 1104/2933/734 1106/2935/734 1100/2936/734 -f 1100/2937/735 1106/2938/735 1107/2939/735 -f 1100/2937/735 1107/2939/735 1099/2940/735 -f 1099/2941/736 1107/2942/736 1108/2943/736 -f 1099/2941/736 1108/2943/736 1103/2944/736 -f 1103/2945/737 1108/2946/737 1105/2947/737 -f 1103/2945/737 1105/2947/737 1104/2948/737 -f 1112/2949/738 1110/2950/738 1109/2951/738 -f 1112/2949/738 1109/2951/738 1111/2952/738 -f 1115/2953/739 1113/2954/739 1114/2955/739 -f 1115/2953/739 1114/2955/739 1116/2956/739 -f 1109/2957/740 1110/2958/740 1114/2959/740 -f 1109/2957/740 1114/2959/740 1113/2960/740 -f 1112/2961/741 1111/2962/741 1115/2963/741 -f 1112/2961/741 1115/2963/741 1116/2964/741 -f 1116/2965/742 1114/2966/742 1110/2967/742 -f 1116/2965/742 1110/2967/742 1112/2968/742 -f 1111/2969/743 1109/2970/743 1117/2971/743 -f 1111/2969/743 1117/2971/743 1118/2972/743 -f 1120/2973/744 1119/2974/744 1113/2975/744 -f 1120/2973/744 1113/2975/744 1115/2976/744 -f 1117/2977/745 1109/2978/745 1113/2979/745 -f 1117/2977/745 1113/2979/745 1119/2980/745 -f 1111/2981/746 1118/2982/746 1120/2983/746 -f 1111/2981/746 1120/2983/746 1115/2984/746 -f 1124/2985/747 1122/2986/747 1121/2987/747 -f 1124/2985/747 1121/2987/747 1123/2988/747 -f 1127/2989/748 1125/2990/748 1126/2991/748 -f 1127/2989/748 1126/2991/748 1128/2992/748 -f 1121/2993/749 1122/2994/749 1126/2995/749 -f 1121/2993/749 1126/2995/749 1125/2996/749 -f 1124/2997/750 1123/2998/750 1127/2999/750 -f 1124/2997/750 1127/2999/750 1128/3000/750 -f 1128/3001/751 1126/3002/751 1122/3003/751 -f 1128/3001/751 1122/3003/751 1124/3004/751 -f 1123/3005/752 1121/3006/752 1129/3007/752 -f 1123/3005/752 1129/3007/752 1130/3008/752 -f 1132/3009/753 1131/3010/753 1125/3011/753 -f 1132/3009/753 1125/3011/753 1127/3012/753 -f 1129/3013/754 1121/3014/754 1125/3015/754 -f 1129/3013/754 1125/3015/754 1131/3016/754 -f 1123/3017/755 1130/3018/755 1132/3019/755 -f 1123/3017/755 1132/3019/755 1127/3020/755 -usemtl tracked_motorbike2_paint -f 1136/3021/756 1134/3022/756 1133/3023/756 -f 1136/3021/756 1133/3023/756 1135/3024/756 -f 1139/3025/757 1137/3026/757 1138/3027/757 -f 1139/3025/757 1138/3027/757 1140/3028/757 -f 1133/3029/758 1134/3030/758 1138/3031/758 -f 1133/3029/758 1138/3031/758 1137/3032/758 -f 1136/3033/759 1135/3034/759 1139/3035/759 -f 1136/3033/759 1139/3035/759 1140/3036/759 -f 1135/3037/760 1133/3038/760 1137/3039/760 -f 1135/3037/760 1137/3039/760 1139/3040/760 -f 1140/3041/761 1138/3042/761 1134/3043/761 -f 1140/3041/761 1134/3043/761 1136/3044/761 -usemtl tracked_motorbike2 -f 1144/3045/762 1142/3046/762 1141/3047/762 -f 1144/3045/762 1141/3047/762 1143/3048/762 -f 1147/3049/763 1145/3050/763 1146/3051/763 -f 1147/3049/763 1146/3051/763 1148/3052/763 -f 1144/3053/764 1143/3054/764 1147/3055/764 -f 1144/3053/764 1147/3055/764 1148/3056/764 -f 1143/3057/765 1141/3058/765 1145/3059/765 -f 1143/3057/765 1145/3059/765 1147/3060/765 -o hood -v -0.37187499999999984 1.625 1.715625 -v -0.30937499999999984 1.625 1.715625 -v -0.37187499999999984 1.5625 1.715625 -v -0.30937499999999984 1.5625 1.715625 -v -0.37187500000000007 1.625 0.7156250000000001 -v -0.30937500000000007 1.625 0.7156250000000001 -v -0.37187500000000007 1.5625 0.7156250000000001 -v -0.30937500000000007 1.5625 0.7156250000000001 -v 0.31562500000000016 1.625 1.7156249999999997 -v 0.37812500000000016 1.625 1.7156249999999997 -v 0.31562500000000016 1.5625 1.7156249999999997 -v 0.37812500000000016 1.5625 1.7156249999999997 -v 0.31562499999999993 1.625 0.7156249999999998 -v 0.37812499999999993 1.625 0.7156249999999998 -v 0.31562499999999993 1.5625 0.7156249999999998 -v 0.37812499999999993 1.5625 0.7156249999999998 -v 0.5000000000000001 1.4375 1.7499999999999998 -v 0.4999999999999999 1.4375 0.6874999999999998 -v 0.5000000000000001 1.375 1.7499999999999998 -v 0.4999999999999999 1.375 0.6874999999999998 -v -0.4999999999999999 1.4375 1.75 -v -0.5000000000000001 1.4375 0.6875 -v -0.4999999999999999 1.375 1.75 -v -0.5000000000000001 1.375 0.6875 -v 0.5 1.4375 1.2499999999999998 -v -0.5 1.4375 1.25 -v -0.5 1.375 1.25 -v 0.5 1.375 1.2499999999999998 -v 0 1.4375 1.25 -v 1.1102230246251565e-16 1.4375 1.75 -v 1.1102230246251565e-16 1.375 1.75 -v 0 1.375 1.25 -v -1.1102230246251565e-16 1.375 0.6874999999999999 -v -1.1102230246251565e-16 1.4375 0.6874999999999999 -v -0.37187500000000007 1.5625 0.778125 -v -0.30937500000000007 1.5625 0.778125 -v -0.37187500000000007 1.4375 0.778125 -v -0.30937500000000007 1.4375 0.778125 -v -0.37187500000000007 1.4375 0.7156250000000001 -v -0.30937500000000007 1.4375 0.7156250000000001 -v 0.31562500000000016 1.4375 1.7156249999999997 -v 0.37812500000000016 1.4375 1.7156249999999997 -v 0.31562500000000016 1.5625 1.6531249999999997 -v 0.37812500000000016 1.5625 1.6531249999999997 -v 0.31562500000000016 1.4375 1.6531249999999997 -v 0.37812500000000016 1.4375 1.6531249999999997 -v -0.37187499999999984 1.4375 1.715625 -v -0.30937499999999984 1.4375 1.715625 -v -0.3718749999999999 1.5625 1.653125 -v -0.3093749999999999 1.5625 1.653125 -v -0.3718749999999999 1.4375 1.653125 -v -0.3093749999999999 1.4375 1.653125 -v 0.31562499999999993 1.5625 0.7781249999999998 -v 0.37812499999999993 1.5625 0.7781249999999997 -v 0.31562499999999993 1.4375 0.7781249999999998 -v 0.37812499999999993 1.4375 0.7781249999999997 -v 0.31562499999999993 1.4375 0.7156249999999998 -v 0.37812499999999993 1.4375 0.7156249999999998 -v -5.551115123125783e-17 1.4375 0.875 -v -0.5000000000000001 1.4375 0.875 -v -0.5000000000000001 1.375 0.875 -v -5.551115123125783e-17 1.375 0.875 -v 0.4999999999999999 1.375 0.8749999999999998 -v 0.4999999999999999 1.4375 0.8749999999999998 -v 5.551115123125783e-17 1.4375 1.5625 -v -0.4999999999999999 1.4375 1.5625 -v -0.4999999999999999 1.375 1.5625 -v 5.551115123125783e-17 1.375 1.5625 -v 0.5000000000000001 1.375 1.5624999999999998 -v 0.5000000000000001 1.4375 1.5624999999999998 -v -0.3124999999999999 1.4375 1.5625 -v -0.3125 1.4375 1.25 -v -0.3125000000000001 1.4375 0.875 -v -0.3125000000000001 1.4375 0.6875 -v -0.3125000000000001 1.375 0.6875 -v -0.3125000000000001 1.375 0.875 -v -0.3125 1.375 1.25 -v -0.3124999999999999 1.375 1.5625 -v -0.3124999999999999 1.375 1.75 -v -0.3124999999999999 1.4375 1.75 -v 5.551115123125783e-17 1.4031250000000002 1.5625 -v -5.551115123125783e-17 1.4031250000000002 0.875 -v -0.3124999999999999 1.4031250000000002 1.5625 -v -0.3125000000000001 1.4031250000000002 0.875 -v 0 1.4031250000000002 1.1875 -v -0.3125 1.4031250000000002 1.1875 -v -0.1875 1.4031250000000002 1.1875 -v -0.18749999999999994 1.4031250000000002 1.5625 -v -0.18750000000000006 1.4031250000000002 0.875 -vt 0.5 0.5 -vt 0.53125 0.5 -vt 0.53125 0.53125 -vt 0.5 0.53125 -vt 0.5 0.5 -vt 0.53125 0.5 -vt 0.53125 0.53125 -vt 0.5 0.53125 -vt 0.5 0.5 -vt 0.53125 0.5 -vt 0.53125 1 -vt 0.5 1 -vt 0.5 0.5 -vt 0.53125 0.5 -vt 0.53125 1 -vt 0.5 1 -vt 0.5 0.5 -vt 0.53125 0.5 -vt 0.53125 1 -vt 0.5 1 -vt 0.5 0.5 -vt 0.53125 0.5 -vt 0.53125 1 -vt 0.5 1 -vt 0.5 0.5 -vt 0.53125 0.5 -vt 0.53125 0.53125 -vt 0.5 0.53125 -vt 0.5 0.5 -vt 0.53125 0.5 -vt 0.53125 0.53125 -vt 0.5 0.53125 -vt 0.5 0.5 -vt 0.53125 0.5 -vt 0.53125 1 -vt 0.5 1 -vt 0.5 0.5 -vt 0.53125 0.5 -vt 0.53125 1 -vt 0.5 1 -vt 0.5 0.5 -vt 0.53125 0.5 -vt 0.53125 1 -vt 0.5 1 -vt 0.5 0.5 -vt 0.53125 0.5 -vt 0.53125 1 -vt 0.5 1 -vt 0.40625 0.265625 -vt 0.359375 0.265625 -vt 0.359375 0.25 -vt 0.40625 0.25 -vt 0.328125 0.25 -vt 0.375 0.25 -vt 0.375 0.265625 -vt 0.328125 0.265625 -vt 0.625 0.25 -vt 0.546875 0.25 -vt 0.546875 0.203125 -vt 0.625 0.203125 -vt 0.625 0.046875 -vt 0.546875 0.046875 -vt 0.546875 0 -vt 0.625 0 -vt 0.171875 0.265625 -vt 0.09375 0.265625 -vt 0.09375 0.25 -vt 0.171875 0.25 -vt 0.375 0.25 -vt 0.453125 0.25 -vt 0.453125 0.265625 -vt 0.375 0.265625 -vt 0.515625 0.25 -vt 0.59375 0.25 -vt 0.59375 0.265625 -vt 0.515625 0.265625 -vt 0.25 0.265625 -vt 0.171875 0.265625 -vt 0.171875 0.25 -vt 0.25 0.25 -vt 0.625 0.125 -vt 0.625 0.046875 -vt 0.75 0.046875 -vt 0.75 0.125 -vt 0.546875 0.265625 -vt 0.421875 0.265625 -vt 0.421875 0.25 -vt 0.546875 0.25 -vt 0.75 0.125 -vt 0.75 0.203125 -vt 0.625 0.203125 -vt 0.625 0.125 -vt 0.75 0 -vt 0.75 0.046875 -vt 0.625 0.046875 -vt 0.625 0 -vt 0.25 0.25 -vt 0.375 0.25 -vt 0.375 0.265625 -vt 0.25 0.265625 -vt 0.625 0.25 -vt 0.625 0.203125 -vt 0.75 0.203125 -vt 0.75 0.25 -vt 0.5 0.53125 -vt 0.4375 0.53125 -vt 0.4375 0.5 -vt 0.5 0.5 -vt 0.5 0.53125 -vt 0.4375 0.53125 -vt 0.4375 0.5 -vt 0.5 0.5 -vt 0.5 0.53125 -vt 0.4375 0.53125 -vt 0.4375 0.5 -vt 0.5 0.5 -vt 0.5 0.53125 -vt 0.4375 0.53125 -vt 0.4375 0.5 -vt 0.5 0.5 -vt 0.5 0.53125 -vt 0.4375 0.53125 -vt 0.4375 0.5 -vt 0.5 0.5 -vt 0.5 0.53125 -vt 0.4375 0.53125 -vt 0.4375 0.5 -vt 0.5 0.5 -vt 0.5 0.53125 -vt 0.4375 0.53125 -vt 0.4375 0.5 -vt 0.5 0.5 -vt 0.5 0.53125 -vt 0.4375 0.53125 -vt 0.4375 0.5 -vt 0.5 0.5 -vt 0.5 0.53125 -vt 0.4375 0.53125 -vt 0.4375 0.5 -vt 0.5 0.5 -vt 0.5 0.53125 -vt 0.4375 0.53125 -vt 0.4375 0.5 -vt 0.5 0.5 -vt 0.5 0.53125 -vt 0.4375 0.53125 -vt 0.4375 0.5 -vt 0.5 0.5 -vt 0.5 0.53125 -vt 0.4375 0.53125 -vt 0.4375 0.5 -vt 0.5 0.5 -vt 0.5 0.53125 -vt 0.4375 0.53125 -vt 0.4375 0.5 -vt 0.5 0.5 -vt 0.5 0.53125 -vt 0.4375 0.53125 -vt 0.4375 0.5 -vt 0.5 0.5 -vt 0.5 0.53125 -vt 0.4375 0.53125 -vt 0.4375 0.5 -vt 0.5 0.5 -vt 0.5 0.53125 -vt 0.4375 0.53125 -vt 0.4375 0.5 -vt 0.5 0.5 -vt 0.46875 0.265625 -vt 0.375 0.265625 -vt 0.375 0.25 -vt 0.46875 0.25 -vt 0.625 0.140625 -vt 0.625 0.046875 -vt 0.75 0.046875 -vt 0.75 0.140625 -vt 0.265625 0.25 -vt 0.359375 0.25 -vt 0.359375 0.265625 -vt 0.265625 0.265625 -vt 0.75 0.109375 -vt 0.75 0.203125 -vt 0.625 0.203125 -vt 0.625 0.109375 -vt 0.625 0.046875 -vt 0.546875 0.046875 -vt 0.546875 0 -vt 0.625 0 -vt 0.640625 0.265625 -vt 0.59375 0.265625 -vt 0.59375 0.25 -vt 0.640625 0.25 -vt 0.625 0.25 -vt 0.546875 0.25 -vt 0.546875 0.203125 -vt 0.625 0.203125 -vt 0.625 0.25 -vt 0.625 0.203125 -vt 0.75 0.203125 -vt 0.75 0.25 -vt 0.125 0.25 -vt 0.171875 0.25 -vt 0.171875 0.265625 -vt 0.125 0.265625 -vt 0.75 0 -vt 0.75 0.046875 -vt 0.625 0.046875 -vt 0.625 0 -vt 0.5 0.046875 -vt 0.546875 0.046875 -vt 0.546875 0.125 -vt 0.5 0.125 -vt 0.5 0.109375 -vt 0.546875 0.109375 -vt 0.546875 0.203125 -vt 0.5 0.203125 -vt 0.5 0.203125 -vt 0.546875 0.203125 -vt 0.546875 0.25 -vt 0.5 0.25 -vt 0.5 0.265625 -vt 0.453125 0.265625 -vt 0.453125 0.25 -vt 0.5 0.25 -vt 0.5 0 -vt 0.546875 0 -vt 0.546875 0.046875 -vt 0.5 0.046875 -vt 0.5 0.046875 -vt 0.546875 0.046875 -vt 0.546875 0.140625 -vt 0.5 0.140625 -vt 0.5 0.125 -vt 0.546875 0.125 -vt 0.546875 0.203125 -vt 0.5 0.203125 -vt 0.5 0.203125 -vt 0.546875 0.203125 -vt 0.546875 0.25 -vt 0.5 0.25 -vt 0.046875 0.25 -vt 0.09375 0.25 -vt 0.09375 0.265625 -vt 0.046875 0.265625 -vt 0.5 0 -vt 0.546875 0 -vt 0.546875 0.046875 -vt 0.5 0.046875 -vt 0.375 0.203125 -vt 0.375 0.21875 -vt 0.28125 0.21875 -vt 0.203125 0.21875 -vt 0.203125 0.21875 -vt 0.203125 0.203125 -vt 0.28125 0.203125 -vt 0.375 0.203125 -vt 0.203125 0.21875 -vt 0.203125 0.203125 -vt 0.296875 0.203125 -vt 0.375 0.203125 -vt 0.375 0.203125 -vt 0.375 0.21875 -vt 0.296875 0.21875 -vt 0.203125 0.21875 -vt 0.34375 0.21875 -vt 0.34375 0.203125 -vt 0.421875 0.203125 -vt 0.421875 0.21875 -vt 0.359375 0.21875 -vt 0.28125 0.21875 -vt 0.28125 0.203125 -vt 0.359375 0.203125 -vt 0.1875 0.59375 -vt 0.125 0.59375 -vt 0.125 0.75 -vt 0.1875 0.75 -vt 0.1875 0.75 -vt 0.125 0.75 -vt 0.125 0.5625 -vt 0.1875 0.5625 -vt 0.1875 0.5625 -vt 0.09375 0.5625 -vt 0.09375 0.75 -vt 0.1875 0.75 -vt 0.1875 0.75 -vt 0.09375 0.75 -vt 0.09375 0.59375 -vt 0.1875 0.59375 -vn 2.220446049250313e-16 0 1 -vn -2.220446049250313e-16 0 -1 -vn 0 1 0 -vn 0 -1 0 -vn -1 0 2.220446049250313e-16 -vn 1 0 -2.220446049250313e-16 -vn 2.220446049250313e-16 0 1 -vn -2.220446049250313e-16 0 -1 -vn 0 1 0 -vn 0 -1 0 -vn -1 0 2.220446049250313e-16 -vn 1 0 -2.220446049250313e-16 -vn 1 0 -2.220446049250313e-16 -vn -1 0 2.220446049250313e-16 -vn 0 1 0 -vn 0 -1 0 -vn 2.220446049250313e-16 0 1 -vn -2.220446049250313e-16 0 -1 -vn -1 0 2.220446049250313e-16 -vn 1 0 -2.220446049250313e-16 -vn 0 1 0 -vn 2.220446049250313e-16 0 1 -vn 0 -1 0 -vn 0 -1 0 -vn -2.220446049250313e-16 0 -1 -vn 0 1 0 -vn 2.220446049250313e-16 0 1 -vn -2.220446049250313e-16 0 -1 -vn -1 0 2.220446049250313e-16 -vn 1 0 -2.220446049250313e-16 -vn 2.220446049250313e-16 0 1 -vn -2.220446049250313e-16 0 -1 -vn -1 0 2.220446049250313e-16 -vn 1 0 -2.220446049250313e-16 -vn 2.220446049250313e-16 0 1 -vn -2.220446049250313e-16 0 -1 -vn -1 0 2.220446049250313e-16 -vn 1 0 -2.220446049250313e-16 -vn 2.220446049250313e-16 0 1 -vn -2.220446049250313e-16 0 -1 -vn -1 0 2.220446049250313e-16 -vn 1 0 -2.220446049250313e-16 -vn -1 0 2.220446049250313e-16 -vn 0 -1 0 -vn 1 0 -2.220446049250313e-16 -vn 0 1 0 -vn 0 1 0 -vn -1 0 2.220446049250313e-16 -vn 0 -1 0 -vn 0 -1 0 -vn 1 0 -2.220446049250313e-16 -vn 0 1 0 -vn 0 1 0 -vn 0 1 0 -vn 0 1 0 -vn -2.220446049250313e-16 0 -1 -vn 0 -1 0 -vn 0 -1 0 -vn 0 -1 0 -vn 0 -1 0 -vn 2.220446049250313e-16 0 1 -vn 0 1 0 -vn 1 0 -2.220446049250313e-16 -vn 1 0 -2.220446049250313e-16 -vn -1 0 2.220446049250313e-16 -vn -1 0 2.220446049250313e-16 -vn 2.220446049250313e-16 0 1 -vn -2.220446049250313e-16 0 -1 -vn 0 1 0 -vn 0 1 0 -vn 0 1 0 -vn 0 1 0 -usemtl tracked_motorbike -f 1152/3061/766 1150/3062/766 1149/3063/766 -f 1152/3061/766 1149/3063/766 1151/3064/766 -f 1155/3065/767 1153/3066/767 1154/3067/767 -f 1155/3065/767 1154/3067/767 1156/3068/767 -f 1149/3069/768 1150/3070/768 1154/3071/768 -f 1149/3069/768 1154/3071/768 1153/3072/768 -f 1152/3073/769 1151/3074/769 1155/3075/769 -f 1152/3073/769 1155/3075/769 1156/3076/769 -f 1151/3077/770 1149/3078/770 1153/3079/770 -f 1151/3077/770 1153/3079/770 1155/3080/770 -f 1156/3081/771 1154/3082/771 1150/3083/771 -f 1156/3081/771 1150/3083/771 1152/3084/771 -f 1160/3085/772 1158/3086/772 1157/3087/772 -f 1160/3085/772 1157/3087/772 1159/3088/772 -f 1163/3089/773 1161/3090/773 1162/3091/773 -f 1163/3089/773 1162/3091/773 1164/3092/773 -f 1157/3093/774 1158/3094/774 1162/3095/774 -f 1157/3093/774 1162/3095/774 1161/3096/774 -f 1160/3097/775 1159/3098/775 1163/3099/775 -f 1160/3097/775 1163/3099/775 1164/3100/775 -f 1159/3101/776 1157/3102/776 1161/3103/776 -f 1159/3101/776 1161/3103/776 1163/3104/776 -f 1164/3105/777 1162/3106/777 1158/3107/777 -f 1164/3105/777 1158/3107/777 1160/3108/777 -usemtl common_bottom -f 1166/3109/778 1212/3110/778 1211/3111/778 -f 1166/3109/778 1211/3111/778 1168/3112/778 -f 1172/3113/779 1209/3114/779 1208/3115/779 -f 1172/3113/779 1208/3115/779 1170/3116/779 -usemtl common_bottom_painted -f 1182/3117/780 1222/3118/780 1221/3119/780 -f 1182/3117/780 1221/3119/780 1207/3120/780 -usemtl common_bottom -f 1210/3121/781 1224/3122/781 1223/3123/781 -f 1210/3121/781 1223/3123/781 1181/3124/781 -f 1178/3125/782 1228/3126/782 1227/3127/782 -f 1178/3125/782 1227/3127/782 1179/3128/782 -f 1181/3129/783 1223/3130/783 1222/3131/783 -f 1181/3129/783 1222/3131/783 1182/3132/783 -f 1175/3133/784 1215/3134/784 1214/3135/784 -f 1175/3133/784 1214/3135/784 1174/3136/784 -f 1173/3137/785 1218/3138/785 1217/3139/785 -f 1173/3137/785 1217/3139/785 1176/3140/785 -usemtl common_bottom_painted -f 1177/3141/786 1213/3142/786 1218/3143/786 -f 1177/3141/786 1218/3143/786 1173/3144/786 -usemtl common_bottom -f 1165/3145/787 1178/3146/787 1179/3147/787 -f 1165/3145/787 1179/3147/787 1167/3148/787 -f 1176/3149/788 1217/3150/788 1216/3151/788 -f 1176/3149/788 1216/3151/788 1180/3152/788 -f 1168/3153/789 1211/3154/789 1210/3155/789 -f 1168/3153/789 1210/3155/789 1181/3156/789 -f 1168/3157/790 1181/3158/790 1182/3159/790 -f 1168/3157/790 1182/3159/790 1166/3160/790 -usemtl common_bottom_painted -f 1182/3161/791 1207/3162/791 1212/3163/791 -f 1182/3161/791 1212/3163/791 1166/3164/791 -usemtl tracked_motorbike -f 1186/3165/792 1184/3166/792 1183/3167/792 -f 1186/3165/792 1183/3167/792 1185/3168/792 -f 1187/3169/793 1155/3170/793 1156/3171/793 -f 1187/3169/793 1156/3171/793 1188/3172/793 -f 1185/3173/794 1183/3174/794 1155/3175/794 -f 1185/3173/794 1155/3175/794 1187/3176/794 -f 1188/3177/795 1156/3178/795 1184/3179/795 -f 1188/3177/795 1184/3179/795 1186/3180/795 -f 1190/3181/796 1160/3182/796 1159/3183/796 -f 1190/3181/796 1159/3183/796 1189/3184/796 -f 1193/3185/797 1191/3186/797 1192/3187/797 -f 1193/3185/797 1192/3187/797 1194/3188/797 -f 1189/3189/798 1159/3190/798 1191/3191/798 -f 1189/3189/798 1191/3191/798 1193/3192/798 -f 1194/3193/799 1192/3194/799 1160/3195/799 -f 1194/3193/799 1160/3195/799 1190/3196/799 -f 1196/3197/800 1152/3198/800 1151/3199/800 -f 1196/3197/800 1151/3199/800 1195/3200/800 -f 1199/3201/801 1197/3202/801 1198/3203/801 -f 1199/3201/801 1198/3203/801 1200/3204/801 -f 1195/3205/802 1151/3206/802 1197/3207/802 -f 1195/3205/802 1197/3207/802 1199/3208/802 -f 1200/3209/803 1198/3210/803 1152/3211/803 -f 1200/3209/803 1152/3211/803 1196/3212/803 -f 1204/3213/804 1202/3214/804 1201/3215/804 -f 1204/3213/804 1201/3215/804 1203/3216/804 -f 1205/3217/805 1163/3218/805 1164/3219/805 -f 1205/3217/805 1164/3219/805 1206/3220/805 -f 1203/3221/806 1201/3222/806 1163/3223/806 -f 1203/3221/806 1163/3223/806 1205/3224/806 -f 1206/3225/807 1164/3226/807 1202/3227/807 -f 1206/3225/807 1202/3227/807 1204/3228/807 -usemtl common_bottom -f 1174/3229/808 1208/3230/808 1209/3231/808 -f 1174/3229/808 1209/3231/808 1175/3232/808 -f 1180/3233/809 1210/3234/809 1211/3235/809 -f 1180/3233/809 1211/3235/809 1176/3236/809 -f 1176/3237/810 1211/3238/810 1212/3239/810 -f 1176/3237/810 1212/3239/810 1173/3240/810 -usemtl common_bottom_painted -f 1173/3241/811 1212/3242/811 1207/3243/811 -f 1173/3241/811 1207/3243/811 1177/3244/811 -f 1213/3245/812 1219/3246/812 1228/3247/812 -f 1213/3245/812 1228/3247/812 1178/3248/812 -usemtl common_bottom -f 1169/3249/813 1214/3250/813 1215/3251/813 -f 1169/3249/813 1215/3251/813 1171/3252/813 -f 1179/3253/814 1227/3254/814 1226/3255/814 -f 1179/3253/814 1226/3255/814 1216/3256/814 -f 1179/3257/815 1216/3258/815 1217/3259/815 -f 1179/3257/815 1217/3259/815 1167/3260/815 -f 1167/3261/816 1217/3262/816 1218/3263/816 -f 1167/3261/816 1218/3263/816 1165/3264/816 +f 691/1933/484 703/1934/484 704/1935/484 700/1936/484 +f 700/1937/485 704/1938/485 705/1939/485 692/1940/485 usemtl common_bottom_painted -f 1165/3265/817 1218/3266/817 1213/3267/817 -f 1165/3265/817 1213/3267/817 1178/3268/817 -f 1214/3269/818 1219/3270/818 1220/3271/818 -f 1214/3269/818 1220/3271/818 1174/3272/818 -f 1174/3273/819 1220/3274/819 1221/3275/819 -f 1174/3273/819 1221/3275/819 1208/3276/819 -f 1208/3277/820 1221/3278/820 1222/3279/820 -f 1208/3277/820 1222/3279/820 1170/3280/820 -usemtl common_bottom -f 1170/3281/821 1222/3282/821 1223/3283/821 -f 1170/3281/821 1223/3283/821 1172/3284/821 -f 1172/3285/822 1223/3286/822 1224/3287/822 -f 1172/3285/822 1224/3287/822 1209/3288/822 -f 1209/3289/823 1224/3290/823 1225/3291/823 -f 1209/3289/823 1225/3291/823 1175/3292/823 -f 1175/3293/824 1225/3294/824 1226/3295/824 -f 1175/3293/824 1226/3295/824 1215/3296/824 -f 1215/3297/825 1226/3298/825 1227/3299/825 -f 1215/3297/825 1227/3299/825 1171/3300/825 -f 1171/3301/826 1227/3302/826 1228/3303/826 -f 1171/3301/826 1228/3303/826 1169/3304/826 -usemtl common_bottom_painted -f 1169/3305/827 1228/3306/827 1219/3307/827 -f 1169/3305/827 1219/3307/827 1214/3308/827 -f 1224/3309/828 1221/3310/828 1220/3311/828 -f 1224/3309/828 1220/3311/828 1219/3312/828 -f 1219/3313/829 1226/3314/829 1225/3315/829 -f 1219/3313/829 1225/3315/829 1224/3316/829 -f 1207/3317/830 1210/3318/830 1180/3319/830 -f 1207/3317/830 1180/3319/830 1216/3320/830 -f 1216/3321/831 1213/3322/831 1177/3323/831 -f 1216/3321/831 1177/3323/831 1207/3324/831 -f 1221/3325/832 1224/3326/832 1210/3327/832 -f 1221/3325/832 1210/3327/832 1207/3328/832 -f 1219/3329/833 1213/3330/833 1216/3331/833 -f 1219/3329/833 1216/3331/833 1226/3332/833 -usemtl tracked_motorbike -f 1234/3333/834 1235/3334/834 1237/3335/834 -f 1234/3333/834 1237/3335/834 1232/3336/834 -f 1231/3337/835 1236/3338/835 1235/3339/835 -f 1231/3337/835 1235/3339/835 1234/3340/835 -f 1233/3341/836 1235/3342/836 1236/3343/836 -f 1233/3341/836 1236/3343/836 1229/3344/836 -f 1230/3345/837 1237/3346/837 1235/3347/837 -f 1230/3345/837 1235/3347/837 1233/3348/837 -o rod -v 0.4375 1.3125 1.6875 -v 0.4375 1.3125 1.625 -v -0.25 1.3125 1.6875 -v -0.25 1.3125 1.625 -v 0.4375 1.375 1.6875 -v 0.4375 1.375 1.625 -v -0.25 1.375 1.6875 -v -0.25 1.375 1.625 -vt 0.03125 0.78125 -vt 0.03125 0.953125 -vt 0.015625 0.953125 -vt 0.015625 0.78125 -vt 0.03125 0.78125 -vt 0.03125 0.953125 -vt 0.015625 0.953125 -vt 0.015625 0.78125 -vt 0.03125 0.9375 -vt 0.03125 0.953125 -vt 0.015625 0.953125 -vt 0.015625 0.9375 -vt 0.03125 0.9375 -vt 0.03125 0.953125 -vt 0.015625 0.953125 -vt 0.015625 0.9375 -vt 0.03125 0.78125 -vt 0.03125 0.953125 -vt 0.015625 0.953125 -vt 0.015625 0.78125 -vt 0.03125 0.78125 -vt 0.03125 0.953125 -vt 0.015625 0.953125 -vt 0.015625 0.78125 -vn 2.220446049250313e-16 -1 0 -vn -2.220446049250313e-16 1 0 -vn 1 2.220446049250313e-16 0 -vn -1 -2.220446049250313e-16 0 -vn 0 0 1 -vn 0 0 -1 -usemtl common_steel_norivets -f 1241/3349/838 1239/3350/838 1238/3351/838 -f 1241/3349/838 1238/3351/838 1240/3352/838 -f 1244/3353/839 1242/3354/839 1243/3355/839 -f 1244/3353/839 1243/3355/839 1245/3356/839 -f 1238/3357/840 1239/3358/840 1243/3359/840 -f 1238/3357/840 1243/3359/840 1242/3360/840 -f 1241/3361/841 1240/3362/841 1244/3363/841 -f 1241/3361/841 1244/3363/841 1245/3364/841 -f 1240/3365/842 1238/3366/842 1242/3367/842 -f 1240/3365/842 1242/3367/842 1244/3368/842 -f 1245/3369/843 1243/3370/843 1239/3371/843 -f 1245/3369/843 1239/3371/843 1241/3372/843 -o radio -v 0.3156251349401148 1.4374993750000002 0.9343746516223459 -v 0.31562513494011474 1.6874993750000002 0.9343746516223459 -v 0.0031280878649539434 1.4374993750000002 0.9357383534174403 -v 0.003128087864953888 1.6874993750000002 0.9357383534174403 -v 0.3178069360953737 1.4374993750000002 1.4343701785573846 -v 0.3178069360953737 1.6874993750000002 1.4343701785573846 -v 0.005309889020212871 1.4374993750000002 1.435733880352479 -v 0.005309889020212816 1.6874993750000002 1.435733880352479 -v 0.16074062976135467 1.6874993750000002 1.2475538579777827 -v 0.16074062976135467 1.7499993750000002 1.2475538579777827 -v -0.02675785009852319 1.6874993750000002 1.2483719573379473 -v -0.02675785009852319 1.7499993750000002 1.2483719573379473 -v 0.16128560724982974 1.6874993750000002 1.3725524333740629 -v 0.1612856072498297 1.7499993750000002 1.3725524333740629 -v -0.026212247663593397 1.6874993750000002 1.3733705245532302 -v -0.026212247663593397 1.7499993750000002 1.3733705245532302 -v 0.0031963662876270393 1.4374993750000002 0.9513631732967259 -v 0.003196366287626984 1.6718743750000002 0.9513631732967259 -v -0.059302921410513076 1.4374993750000002 0.9516356620409635 -v -0.05930292141051313 1.6718743750000002 0.9516356620409635 -v 0.005241602416542562 1.4374993750000002 1.4201084355267386 -v 0.005241602416542507 1.6718743750000002 1.4201084355267386 -v -0.05725767710060031 1.4374993750000002 1.4203815492174308 -v -0.05725767710060037 1.6718743750000002 1.4203815492174308 -v -0.05937119983318617 1.4374993750000002 0.9360108421616777 -v -0.05937119983318623 1.6874993750000002 0.9360108421616777 -v -0.30936895921020685 1.437499375 0.9371020552125346 -v -0.3093689592102069 1.687499375 0.9371020552125346 -v -0.057189398677927245 1.4374993750000002 1.4360063690967164 -v -0.0571893986779273 1.6874993750000002 1.4360063690967164 -v -0.3071871662359452 1.437499375 1.4370969572011185 -v -0.3071871662359452 1.687499375 1.4370969572011185 -v 0.15964941671049784 1.6874993750000002 0.9975560986007619 -v 0.15964941671049784 1.7499993750000002 0.9975560986007619 -v -0.027848438202925263 1.6874993750000002 0.9983741897799293 -v -0.027848438202925263 1.7499993750000002 0.9983741897799293 -v 0.16019501914542764 1.6874993750000002 1.122554665816045 -v 0.16019501914542764 1.7499993750000002 1.122554665816045 -v -0.027303460714450223 1.6874993750000002 1.1233727651762095 -v -0.027303460714450223 1.7499993750000002 1.1233727651762095 -v 0.2484485091949628 1.6551937500000002 1.4327479133315781 -v 0.06094806966007442 1.6551937500000002 1.432747843248535 -v 0.24844833952367018 1.4677012500000002 1.4311115253591793 -v 0.060948524935236545 1.4677012500000002 1.431111447095139 -v 0.24844845583695857 1.6546487500000002 1.4952457683728735 -v 0.06094864124852492 1.6546487500000002 1.4952456901088331 -v 0.24844828616566594 1.4671556250000002 1.4936093804004749 -v 0.060948471577232294 1.4671556250000002 1.4936093021364343 -v 0.21719825613825905 1.7174187500000002 1.4645421903984417 -v 0.09219817143048503 1.7174187500000002 1.4645421409494137 -v 0.21719818439525534 1.4049306250000002 1.461815082699596 -v 0.09219809968748133 1.4049306250000002 1.4618150332505682 -v 0.21719814124125333 1.7163281250000002 1.5895372755345778 -v 0.09219805653347932 1.7163281250000002 1.5895372260855498 -v 0.2171980694982496 1.4038400000000002 1.5868101678357323 -v 0.09219860973693034 1.4038400000000002 1.586810110205707 -v 0.18594821831056643 2.717108125 1.5045177905618419 -v 0.1234484884299068 2.717108125 1.5045177617468293 -v 0.1859483604284285 1.7171462500000003 1.4957907910383557 -v 0.12344863054776886 1.71714625 1.495790762223343 -v 0.18594815677156495 2.7165625 1.5670150206566826 -v 0.12344842689090534 2.7165625 1.56701499184167 -v 0.18594830707042426 1.716600625 1.5582886460796512 -v 0.12344857718976461 1.716600625 1.5582886172646386 -vt 0.375 0.1875 -vt 0.375 0.5 -vt 0.125 0.5 -vt 0.125 0.1875 -vt 0.375 0.1875 -vt 0.375 0.5 -vt 0.125 0.5 -vt 0.125 0.1875 -vt 1 0.5 -vt 0.75 0.5 -vt 0.75 0 -vt 1 0 -vt 1 0.5 -vt 0.75 0.5 -vt 0.75 0 -vt 1 0 -vt 1 1 -vt 0.6875 1 -vt 0.6875 0.5 -vt 1 0.5 -vt 1 1 -vt 0.6875 1 -vt 0.6875 0.5 -vt 1 0.5 +f 692/1941/486 705/1942/486 706/1943/486 690/1944/486 +f 690/1945/487 706/1946/487 701/1947/487 697/1948/487 +f 691/1949/488 692/1950/488 690/1951/488 689/1952/488 +o filter +v -0.1562 0.7607 1.4842 +v -0.1562 0.8855 1.4777 +v -0.1562 0.7542 1.3594 +v -0.1562 0.879 1.3529 +v -0.0312 0.7574 1.4218 +v -0.0312 0.8823 1.4153 +v -0.0312 0.7542 1.3594 +v -0.0312 0.879 1.3529 +v -0.375 1.1993 1.4926 +v -0.375 1.1894 1.3053 +v -0.3687 0.9493 1.4994 +v -0.3687 0.9401 1.3246 +v -0.1875 1.1993 1.4926 +v -0.1875 1.1894 1.3053 +v -0.1937 0.9493 1.4994 +v -0.1937 0.9401 1.3246 +v -0.3437 0.9414 1.3496 +v -0.3437 0.948 1.4744 +v -0.3437 0.879 1.3529 +v -0.3437 0.8855 1.4777 +v -0.2187 0.9414 1.3496 +v -0.2187 0.948 1.4744 +v -0.2187 0.879 1.3529 +v -0.2187 0.8855 1.4777 +v -0.2812 0.7607 1.4842 +v -0.2812 0.7542 1.3594 +v -0.2187 0.7607 1.4842 +v -0.2187 0.7542 1.3594 +v -0.0312 0.7476 1.2346 +v -0.1562 0.7476 1.2346 +v -0.0312 0.8725 1.228 +v -0.1562 0.8725 1.228 +v -0.3812 1.2058 1.4985 +v -0.3812 1.1954 1.2987 +v -0.3812 1.1434 1.5017 +v -0.3812 1.1329 1.302 +v -0.1812 1.2058 1.4985 +v -0.1812 1.1954 1.2987 +v -0.1812 1.1434 1.5017 +v -0.1812 1.1329 1.302 +vt 0.75 0.9375 +vt 0.625 0.9375 +vt 0.625 0.875 +vt 0.75 0.875 +vt 0.75 0.8125 +vt 0.75 0.9375 +vt 0.625 0.9375 +vt 0.625 0.8125 +vt 0.625 1 +vt 0.75 1 +vt 0.75 0.875 +vt 0.625 0.875 +vt 0.8125 0.9375 +vt 0.6875 0.9375 +vt 0.6875 0.8125 +vt 0.8125 0.8125 +vt 0.8125 0.5625 +vt 1 0.5625 +vt 1 0.3125 vt 0.8125 0.3125 -vt 0.8125 0.5 -vt 0.75 0.5 -vt 0.75 0.3125 -vt 0.875 0.3125 -vt 0.875 0.5 -vt 0.8125 0.5 +vt 0.8125 0.5625 +vt 1 0.5625 +vt 1 0.3125 vt 0.8125 0.3125 -vt 0.75 0.4375 -vt 0.75 0.5 -vt 0.875 0.5 -vt 0.875 0.4375 +vt 0.8125 0.5625 +vt 1 0.5625 +vt 1 0.375 +vt 0.8125 0.375 +vt 0.8125 0.375 +vt 1 0.375 +vt 1 0.1875 +vt 0.8125 0.1875 +vt 0.8125 0.5625 +vt 1 0.5625 +vt 1 0.3125 +vt 0.8125 0.3125 +vt 0.8125 0.5625 +vt 1 0.5625 +vt 1 0.3125 +vt 0.8125 0.3125 +vt 0.625 0.3125 +vt 0.625 0.375 +vt 0.75 0.375 vt 0.75 0.3125 +vt 0.625 0.3125 +vt 0.625 0.375 vt 0.75 0.375 -vt 0.875 0.375 -vt 0.875 0.3125 -vt 0.875 0.3125 -vt 0.875 0.5 -vt 0.75 0.5 vt 0.75 0.3125 -vt 0.1875 0.625 -vt 0.1875 0.6875 -vt 0 0.6875 -vt 0 0.625 -vt 0.375 0.625 -vt 0.375 0.6875 -vt 0.1875 0.6875 -vt 0.1875 0.625 -vt 0.4375 0.6875 -vt 0.4375 0.75 -vt 0 0.75 -vt 0 0.6875 -vt 0.4375 0.5625 -vt 0.4375 0.625 -vt 0 0.625 -vt 0 0.5625 -vt 0.25 0.75 -vt 0.25 1 -vt 0 1 -vt 0 0.75 -vt 1 0.75 -vt 1 1 +vt 0.75 0.3125 +vt 0.75 0.375 +vt 0.625 0.375 +vt 0.625 0.3125 +vt 0.75 0.3125 +vt 0.75 0.375 +vt 0.625 0.375 +vt 0.625 0.3125 +vt 0.625 0.875 +vt 0.625 0.9375 +vt 0.75 0.9375 +vt 0.75 0.875 +vt 0.625 0.9375 +vt 0.75 0.9375 +vt 0.75 0.8125 +vt 0.625 0.8125 +vt 0.75 0.875 vt 0.75 1 +vt 0.625 1 +vt 0.625 0.875 +vt 0.6875 0.8125 +vt 0.6875 0.9375 +vt 0.8125 0.9375 +vt 0.8125 0.8125 +vt 0.625 0.75 +vt 0.625 0.8125 +vt 0.75 0.8125 vt 0.75 0.75 +vt 0.625 0.75 +vt 0.625 0.8125 +vt 0.75 0.8125 vt 0.75 0.75 -vt 0.75 1 -vt 0.25 1 -vt 0.25 0.75 -vt 1 0.5 -vt 1 0.75 -vt 0.5 0.75 -vt 0.5 0.5 vt 0.75 0.75 -vt 0.75 1 -vt 0.25 1 -vt 0.25 0.75 +vt 0.75 0.8125 +vt 0.625 0.8125 +vt 0.625 0.75 vt 0.75 0.75 -vt 0.75 1 -vt 0.25 1 -vt 0.25 0.75 -vt 0.9375 0.3125 -vt 0.9375 0.5 -vt 0.875 0.5 -vt 0.875 0.3125 -vt 1 0.3125 -vt 1 0.5 -vt 0.9375 0.5 -vt 0.9375 0.3125 -vt 0.875 0.4375 -vt 0.875 0.5 -vt 1 0.5 -vt 1 0.4375 -vt 0.875 0.3125 -vt 0.875 0.375 -vt 1 0.375 -vt 1 0.3125 -vt 1 0.3125 -vt 1 0.5 -vt 0.875 0.5 -vt 0.875 0.3125 -vt 0.75 0 -vt 0.75 0.1875 -vt 0.5625 0.1875 -vt 0.5625 0 -vt 0.75 0.1875 -vt 0.5625 0.1875 -vt 0.5625 0.125 -vt 0.75 0.125 -vt 0.5625 0.0625 -vt 0.75 0.0625 -vt 0.75 0 -vt 0.5625 0 -vt 0.75 0 -vt 0.75 0.1875 -vt 0.6875 0.1875 -vt 0.6875 0 -vt 0.625 0 -vt 0.625 0.1875 -vt 0.5625 0.1875 -vt 0.5625 0 -vt 0 0.125 -vt 0 0.4375 -vt 0.125 0.4375 -vt 0.125 0.125 -vt 0 0.125 -vt 0 0.4375 -vt 0.125 0.4375 -vt 0.125 0.125 -vt 0.125 0.4375 -vt 0.125 0.5625 -vt 0 0.5625 -vt 0 0.4375 -vt 0.125 0 -vt 0.125 0.125 -vt 0 0.125 -vt 0 0 -vt 0.125 0.125 -vt 0.125 0.4375 -vt 0 0.4375 -vt 0 0.125 -vt 0.125 0.125 -vt 0.125 0.4375 -vt 0 0.4375 -vt 0 0.125 -vt 0.5625 0 -vt 0.5625 1 -vt 0.5 1 -vt 0.5 0 -vt 0.5625 0 -vt 0.5625 1 -vt 0.5 1 -vt 0.5 0 -vt 0.5625 0.9375 -vt 0.5625 1 -vt 0.5 1 -vt 0.5 0.9375 -vt 0.5625 0 -vt 0.5625 1 -vt 0.5 1 -vt 0.5 0 -vt 0.5625 0 -vt 0.5625 1 -vt 0.5 1 -vt 0.5 0 -vn -0.004363845428970429 -9.689683342296428e-19 -0.9999904783812054 -vn 0.004363845428970429 9.689683342296428e-19 0.9999904783812054 -vn 0.999990479453055 2.2204249093894623e-16 -0.0043635998039679765 -vn -0.999990479453055 -2.2204249093894623e-16 0.004363599803967921 -vn 2.220446049250313e-16 -1 0 -vn -2.220446049250313e-16 1 0 -vn -0.004363190429511382 -9.688228951335324e-19 -0.9999904812393345 -vn 0.004363161340884496 9.688164361608678e-19 0.9999904813662546 -vn 0.9999904959040442 2.2204249459179963e-16 -0.004359828159873063 -vn -0.9999904740931931 -2.2204248974881781e-16 0.004364827931444711 -vn -2.220446049250313e-16 1 0 -vn -0.004359828159873162 -9.680763213000625e-19 -0.9999904959040442 -vn 0.004369827703343824 9.702966659794363e-19 0.999990452257342 -vn 2.220446049250313e-16 -1 0 -vn -2.220446049250313e-16 1 0 -vn -0.00436484974376687 -9.691913369118387e-19 -0.9999904739979848 -vn 0.004362349864189418 9.686362521387032e-19 0.9999904849065627 -vn 0.999990479453055 2.2204249093894623e-16 -0.0043635998039679765 -vn -0.9999904795006522 -2.2204249094951494e-16 0.004363588896258164 -vn 2.220446049250313e-16 -1 0 -vn -2.220446049250313e-16 1 0 -vn -0.004363161340884496 -9.688164361608678e-19 -0.9999904813662546 -vn 0.0043631904295113435 9.68822895133524e-19 0.9999904812393345 -vn 0.9999904740931931 2.2204248974881781e-16 -0.004364827931444796 -vn -0.9999904959040442 -2.2204249459179963e-16 0.004359828159873162 -vn -2.220446049250313e-16 1 0 -vn -4.173927313950998e-7 -0.00872739014554607 0.9999619156053261 -vn -3.259309675572435e-9 0.9999619803486746 0.008719968873649196 -vn 3.6439637448568203e-9 -0.9999618931126021 -0.008729966933566844 -vn 0.9999999999992263 -9.123317046120878e-7 8.458015628067664e-7 -vn -0.9999999999577717 8.250625515639224e-7 0.000009152925073375659 -vn 3.9557689096927917e-7 0.008726743948913835 -0.9999619212449511 -vn -3.955768911930584e-7 -0.008726743948913837 0.9999619212449511 -vn -3.451544358890014e-9 0.9999619363675173 0.008725010952731748 -vn 3.451544360868683e-9 -0.9999619363675173 -0.008725010952731637 -vn 0.9999999999995512 -2.3759027932750214e-7 9.171391314958392e-7 -vn -0.9999999999980108 -0.0000017621620731271005 -9.345876567749822e-7 -vn 4.6102463642505576e-7 0.008726999907651321 -0.9999619190111187 -vn -4.6102463894213963e-7 -0.008726375008764019 0.9999619244646238 -vn -4.0249235691580416e-9 0.9999618923505356 0.008730054222971845 -vn 0.9999999999995053 1.3351958539827775e-7 9.858333402390507e-7 -vn -0.9999999999995041 -1.4170088734629298e-7 -9.859047661181508e-7 -usemtl radio_backpack -f 1249/3373/844 1247/3374/844 1246/3375/844 -f 1249/3373/844 1246/3375/844 1248/3376/844 -f 1252/3377/845 1250/3378/845 1251/3379/845 -f 1252/3377/845 1251/3379/845 1253/3380/845 -f 1246/3381/846 1247/3382/846 1251/3383/846 -f 1246/3381/846 1251/3383/846 1250/3384/846 -f 1249/3385/847 1248/3386/847 1252/3387/847 -f 1249/3385/847 1252/3387/847 1253/3388/847 -f 1248/3389/848 1246/3390/848 1250/3391/848 -f 1248/3389/848 1250/3391/848 1252/3392/848 -f 1253/3393/849 1251/3394/849 1247/3395/849 -f 1253/3393/849 1247/3395/849 1249/3396/849 -usemtl radio_backpack2 -f 1257/3397/850 1255/3398/850 1254/3399/850 -f 1257/3397/850 1254/3399/850 1256/3400/850 -f 1260/3401/851 1258/3402/851 1259/3403/851 -f 1260/3401/851 1259/3403/851 1261/3404/851 -f 1254/3405/852 1255/3406/852 1259/3407/852 -f 1254/3405/852 1259/3407/852 1258/3408/852 -f 1257/3409/853 1256/3410/853 1260/3411/853 -f 1257/3409/853 1260/3411/853 1261/3412/853 -f 1261/3413/854 1259/3414/854 1255/3415/854 -f 1261/3413/854 1255/3415/854 1257/3416/854 -f 1265/3417/855 1263/3418/855 1262/3419/855 -f 1265/3417/855 1262/3419/855 1264/3420/855 -f 1268/3421/856 1266/3422/856 1267/3423/856 -f 1268/3421/856 1267/3423/856 1269/3424/856 -f 1264/3425/857 1262/3426/857 1266/3427/857 -f 1264/3425/857 1266/3427/857 1268/3428/857 -f 1269/3429/858 1267/3430/858 1263/3431/858 -f 1269/3429/858 1263/3431/858 1265/3432/858 -f 1273/3433/859 1271/3434/859 1270/3435/859 -f 1273/3433/859 1270/3435/859 1272/3436/859 -f 1276/3437/860 1274/3438/860 1275/3439/860 -f 1276/3437/860 1275/3439/860 1277/3440/860 -f 1270/3441/861 1271/3442/861 1275/3443/861 -f 1270/3441/861 1275/3443/861 1274/3444/861 -f 1273/3445/862 1272/3446/862 1276/3447/862 -f 1273/3445/862 1276/3447/862 1277/3448/862 -f 1272/3449/863 1270/3450/863 1274/3451/863 -f 1272/3449/863 1274/3451/863 1276/3452/863 -f 1277/3453/864 1275/3454/864 1271/3455/864 -f 1277/3453/864 1271/3455/864 1273/3456/864 -f 1281/3457/865 1279/3458/865 1278/3459/865 -f 1281/3457/865 1278/3459/865 1280/3460/865 -f 1284/3461/866 1282/3462/866 1283/3463/866 -f 1284/3461/866 1283/3463/866 1285/3464/866 -f 1278/3465/867 1279/3466/867 1283/3467/867 -f 1278/3465/867 1283/3467/867 1282/3468/867 -f 1281/3469/868 1280/3470/868 1284/3471/868 -f 1281/3469/868 1284/3471/868 1285/3472/868 -f 1285/3473/869 1283/3474/869 1279/3475/869 -f 1285/3473/869 1279/3475/869 1281/3476/869 -usemtl radio_backpack -f 1292/3477/870 1290/3478/870 1291/3479/870 -f 1292/3477/870 1291/3479/870 1293/3480/870 -f 1286/3481/871 1287/3482/871 1291/3483/871 -f 1286/3481/871 1291/3483/871 1290/3484/871 -f 1289/3485/872 1288/3486/872 1292/3487/872 -f 1289/3485/872 1292/3487/872 1293/3488/872 -f 1288/3489/873 1286/3490/873 1290/3491/873 -f 1288/3489/873 1290/3491/873 1292/3492/873 -f 1293/3493/874 1291/3494/874 1287/3495/874 -f 1293/3493/874 1287/3495/874 1289/3496/874 -f 1297/3497/875 1295/3498/875 1294/3499/875 -f 1297/3497/875 1294/3499/875 1296/3500/875 -f 1300/3501/876 1298/3502/876 1299/3503/876 -f 1300/3501/876 1299/3503/876 1301/3504/876 -f 1294/3505/877 1295/3506/877 1299/3507/877 -f 1294/3505/877 1299/3507/877 1298/3508/877 -f 1297/3509/878 1296/3510/878 1300/3511/878 -f 1297/3509/878 1300/3511/878 1301/3512/878 -f 1296/3513/879 1294/3514/879 1298/3515/879 -f 1296/3513/879 1298/3515/879 1300/3516/879 -f 1301/3517/880 1299/3518/880 1295/3519/880 -f 1301/3517/880 1295/3519/880 1297/3520/880 -f 1305/3521/881 1303/3522/881 1302/3523/881 -f 1305/3521/881 1302/3523/881 1304/3524/881 -f 1308/3525/882 1306/3526/882 1307/3527/882 -f 1308/3525/882 1307/3527/882 1309/3528/882 -f 1302/3529/883 1303/3530/883 1307/3531/883 -f 1302/3529/883 1307/3531/883 1306/3532/883 -f 1304/3533/884 1302/3534/884 1306/3535/884 -f 1304/3533/884 1306/3535/884 1308/3536/884 -f 1309/3537/885 1307/3538/885 1303/3539/885 -f 1309/3537/885 1303/3539/885 1305/3540/885 -o gear_change -v 0.125 1.24375 -0.0625 -v 0.125 1.24375 -0.125 -v 0.125 0.93125 -0.0625 -v 0.125 0.93125 -0.125 -v 0.0625 1.24375 -0.0625 -v 0.0625 1.24375 -0.125 -v 0.0625 0.93125 -0.0625 -v 0.0625 0.93125 -0.125 -v 0.125 0.61875 -0.0625 -v 0.125 0.61875 -0.125 -v 0.0625 0.61875 -0.0625 -v 0.0625 0.61875 -0.125 -v 0.15625 1.36875 -0.03125 -v 0.15625 1.36875 -0.15625 -v 0.15625 1.24375 -0.03125 -v 0.15625 1.24375 -0.15625 -v 0.03125 1.36875 -0.03125 -v 0.03125 1.36875 -0.15625 -v 0.03125 1.24375 -0.03125 -v 0.03125 1.24375 -0.15625 -vt 0.625 0.03125 -vt 0.625 0.1875 -vt 0.59375 0.1875 -vt 0.59375 0.03125 -vt 0.625 0.03125 -vt 0.625 0.1875 -vt 0.59375 0.1875 -vt 0.59375 0.03125 -vt 0.625 0.15625 -vt 0.625 0.1875 -vt 0.59375 0.1875 -vt 0.59375 0.15625 -vt 0.625 0.03125 -vt 0.625 0.1875 -vt 0.59375 0.1875 -vt 0.59375 0.03125 -vt 0.625 0.03125 -vt 0.625 0.1875 -vt 0.59375 0.1875 -vt 0.59375 0.03125 -vt 0.625 0.03125 -vt 0.625 0.1875 -vt 0.59375 0.1875 -vt 0.59375 0.03125 -vt 0.625 0.03125 -vt 0.625 0.1875 -vt 0.59375 0.1875 -vt 0.59375 0.03125 -vt 0.625 0.15625 -vt 0.625 0.1875 -vt 0.59375 0.1875 -vt 0.59375 0.15625 -vt 0.625 0.03125 -vt 0.625 0.1875 -vt 0.59375 0.1875 -vt 0.59375 0.03125 -vt 0.625 0.03125 -vt 0.625 0.1875 -vt 0.59375 0.1875 -vt 0.59375 0.03125 -vt 0.71875 0.15625 -vt 0.65625 0.15625 -vt 0.65625 0.09375 -vt 0.71875 0.09375 -vt 0.59375 0.09375 -vt 0.65625 0.09375 -vt 0.65625 0.15625 -vt 0.59375 0.15625 -vt 0.6875 0.09375 -vt 0.6875 0.15625 -vt 0.625 0.15625 -vt 0.625 0.09375 -vt 0.65625 0.0625 -vt 0.59375 0.0625 -vt 0.59375 0 -vt 0.65625 0 -vt 0.6875 0.0625 -vt 0.6875 0.125 -vt 0.625 0.125 -vt 0.625 0.0625 -vt 0.625 0.1875 -vt 0.625 0.125 -vt 0.6875 0.125 -vt 0.6875 0.1875 -vn 1 0 0 -vn -1 0 0 -vn 0 1 0 -vn 0 0 1 -vn 0 0 -1 -vn 1 0 0 -vn -1 0 0 -vn 0 -1 0 -vn 0 0 1 -vn 0 0 -1 +vt 0.75 0.8125 +vt 0.625 0.8125 +vt 0.625 0.75 +vt 0.625 0.375 +vt 0.625 0.5 +vt 0.75 0.5 +vt 0.75 0.375 +vt 0.75 0.375 +vt 0.75 0.5 +vt 0.625 0.5 +vt 0.625 0.375 +vt 0.75 0.375 +vt 0.75 0.5 +vt 0.625 0.5 +vt 0.625 0.375 +vt 0.75 0.375 +vt 0.75 0.5 +vt 0.625 0.5 +vt 0.625 0.375 +vt 0.9375 0.5625 +vt 0.9375 0.75 +vt 1 0.75 +vt 1 0.5625 +vt 0.8125 0.75 +vt 1 0.75 +vt 1 0.6875 +vt 0.8125 0.6875 +vt 0.8125 0.75 +vt 1 0.75 +vt 1 0.5625 +vt 0.8125 0.5625 +vt 0.8125 0.75 +vt 1 0.75 +vt 1 0.6875 +vt 0.8125 0.6875 +vt 0.8125 0.75 +vt 1 0.75 +vt 1 0.6875 +vt 0.8125 0.6875 vn 1 0 0 +vn 0.45 0.05 0.89 +vn 0 -1 0.05 +vn 0 1 -0.05 +vn -1 -0.02 0 +vn 1 -0.02 0 +vn 0 1 -0.05 +vn 0 -1 0.05 +vn 0 0.03 1 +vn 0 -0.08 -1 vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -vn 0 0 1 -vn 0 0 -1 -usemtl tracked_motorbike -f 1313/3541/886 1311/3542/886 1310/3543/886 -f 1313/3541/886 1310/3543/886 1312/3544/886 -f 1316/3545/887 1314/3546/887 1315/3547/887 -f 1316/3545/887 1315/3547/887 1317/3548/887 -f 1310/3549/888 1311/3550/888 1315/3551/888 -f 1310/3549/888 1315/3551/888 1314/3552/888 -f 1312/3553/889 1310/3554/889 1314/3555/889 -f 1312/3553/889 1314/3555/889 1316/3556/889 -f 1317/3557/890 1315/3558/890 1311/3559/890 -f 1317/3557/890 1311/3559/890 1313/3560/890 -f 1319/3561/891 1313/3562/891 1312/3563/891 -f 1319/3561/891 1312/3563/891 1318/3564/891 -f 1320/3565/892 1316/3566/892 1317/3567/892 -f 1320/3565/892 1317/3567/892 1321/3568/892 -f 1319/3569/893 1318/3570/893 1320/3571/893 -f 1319/3569/893 1320/3571/893 1321/3572/893 -f 1318/3573/894 1312/3574/894 1316/3575/894 -f 1318/3573/894 1316/3575/894 1320/3576/894 -f 1321/3577/895 1317/3578/895 1313/3579/895 -f 1321/3577/895 1313/3579/895 1319/3580/895 -f 1325/3581/896 1323/3582/896 1322/3583/896 -f 1325/3581/896 1322/3583/896 1324/3584/896 -f 1328/3585/897 1326/3586/897 1327/3587/897 -f 1328/3585/897 1327/3587/897 1329/3588/897 -f 1322/3589/898 1323/3590/898 1327/3591/898 -f 1322/3589/898 1327/3591/898 1326/3592/898 -f 1325/3593/899 1324/3594/899 1328/3595/899 -f 1325/3593/899 1328/3595/899 1329/3596/899 -f 1324/3597/900 1322/3598/900 1326/3599/900 -f 1324/3597/900 1326/3599/900 1328/3600/900 -f 1329/3601/901 1327/3602/901 1323/3603/901 -f 1329/3601/901 1323/3603/901 1325/3604/901 -o lever -v -0.125 1.11875 -0.21875 -v -0.125 1.11875 -0.28125 -v -0.125 0.80625 -0.21875 -v -0.125 0.80625 -0.28125 -v -0.1875 1.11875 -0.21875 -v -0.1875 1.11875 -0.28125 -v -0.1875 0.80625 -0.21875 -v -0.1875 0.80625 -0.28125 -v -0.125 0.49375 -0.21875 -v -0.125 0.49375 -0.28125 -v -0.1875 0.49375 -0.21875 -v -0.1875 0.49375 -0.28125 -v -0.09375 1.24375 -0.1875 -v -0.09375 1.24375 -0.3125 -v -0.09375 1.11875 -0.1875 -v -0.09375 1.11875 -0.3125 -v -0.21875 1.24375 -0.1875 -v -0.21875 1.24375 -0.3125 -v -0.21875 1.11875 -0.1875 -v -0.21875 1.11875 -0.3125 -vt 0.625 0.03125 -vt 0.625 0.1875 -vt 0.59375 0.1875 -vt 0.59375 0.03125 -vt 0.625 0.03125 -vt 0.625 0.1875 -vt 0.59375 0.1875 -vt 0.59375 0.03125 -vt 0.625 0.03125 -vt 0.625 0.1875 -vt 0.59375 0.1875 -vt 0.59375 0.03125 -vt 0.625 0.03125 -vt 0.625 0.1875 -vt 0.59375 0.1875 -vt 0.59375 0.03125 -vt 0.625 0.03125 -vt 0.625 0.1875 -vt 0.59375 0.1875 -vt 0.59375 0.03125 -vt 0.625 0.03125 -vt 0.625 0.1875 -vt 0.59375 0.1875 -vt 0.59375 0.03125 -vt 0.625 0.15625 -vt 0.625 0.1875 -vt 0.59375 0.1875 -vt 0.59375 0.15625 -vt 0.625 0.03125 -vt 0.625 0.1875 -vt 0.59375 0.1875 -vt 0.59375 0.03125 -vt 0.625 0.03125 -vt 0.625 0.1875 -vt 0.59375 0.1875 -vt 0.59375 0.03125 -vt 0.71875 0.15625 -vt 0.65625 0.15625 -vt 0.65625 0.09375 -vt 0.71875 0.09375 -vt 0.59375 0.09375 -vt 0.65625 0.09375 -vt 0.65625 0.15625 -vt 0.59375 0.15625 -vt 0.6875 0.09375 -vt 0.6875 0.15625 -vt 0.625 0.15625 -vt 0.625 0.09375 -vt 0.65625 0.0625 -vt 0.59375 0.0625 -vt 0.59375 0 -vt 0.65625 0 -vt 0.6875 0.0625 -vt 0.6875 0.125 -vt 0.625 0.125 -vt 0.625 0.0625 -vt 0.625 0.1875 -vt 0.625 0.125 -vt 0.6875 0.125 -vt 0.6875 0.1875 -vt 0.625 0.15625 -vt 0.625 0.1875 -vt 0.59375 0.1875 -vt 0.59375 0.15625 vn 1 0 0 -vn -1 0 0 -vn 0 0 1 -vn 0 0 -1 +vn 0 -0.05 -1 +vn 0 0.05 1 +vn 0 -1 0.05 +vn -0.89 -0.45 0.02 +vn 0 0.05 1 +vn 0 -0.05 -1 +vn 0 -1 0.05 +vn 0 1 -0.05 +vn 0 -0.05 -1 +vn 0 0.05 1 +vn 0 -1 0.05 +vn 0 1 -0.05 vn 1 0 0 vn -1 0 0 -vn 0 -1 0 -vn 0 0 1 -vn 0 0 -1 -vn 1 0 0 vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -usemtl tracked_motorbike -f 1333/3605/902 1331/3606/902 1330/3607/902 -f 1333/3605/902 1330/3607/902 1332/3608/902 -f 1336/3609/903 1334/3610/903 1335/3611/903 -f 1336/3609/903 1335/3611/903 1337/3612/903 -f 1332/3613/904 1330/3614/904 1334/3615/904 -f 1332/3613/904 1334/3615/904 1336/3616/904 -f 1337/3617/905 1335/3618/905 1331/3619/905 -f 1337/3617/905 1331/3619/905 1333/3620/905 -f 1339/3621/906 1333/3622/906 1332/3623/906 -f 1339/3621/906 1332/3623/906 1338/3624/906 -f 1340/3625/907 1336/3626/907 1337/3627/907 -f 1340/3625/907 1337/3627/907 1341/3628/907 -f 1339/3629/908 1338/3630/908 1340/3631/908 -f 1339/3629/908 1340/3631/908 1341/3632/908 -f 1338/3633/909 1332/3634/909 1336/3635/909 -f 1338/3633/909 1336/3635/909 1340/3636/909 -f 1341/3637/910 1337/3638/910 1333/3639/910 -f 1341/3637/910 1333/3639/910 1339/3640/910 -f 1345/3641/911 1343/3642/911 1342/3643/911 -f 1345/3641/911 1342/3643/911 1344/3644/911 -f 1348/3645/912 1346/3646/912 1347/3647/912 -f 1348/3645/912 1347/3647/912 1349/3648/912 -f 1342/3649/913 1343/3650/913 1347/3651/913 -f 1342/3649/913 1347/3651/913 1346/3652/913 -f 1345/3653/914 1344/3654/914 1348/3655/914 -f 1345/3653/914 1348/3655/914 1349/3656/914 -f 1344/3657/915 1342/3658/915 1346/3659/915 -f 1344/3657/915 1346/3659/915 1348/3660/915 -f 1349/3661/916 1347/3662/916 1343/3663/916 -f 1349/3661/916 1343/3663/916 1345/3664/916 -f 1330/3665/917 1331/3666/917 1335/3667/917 -f 1330/3665/917 1335/3667/917 1334/3668/917 -o cane -v -0.125 0.53125 0.25 -v -0.125 0.53125 -0.25 -v -0.125 0.46875 0.25 -v -0.125 0.46875 -0.25 -v -0.1875 0.53125 0.25 -v -0.1875 0.53125 -0.25 -v -0.1875 0.46875 0.25 -v -0.1875 0.46875 -0.25 -vt 0.140625 0.96875 -vt 0.140625 0.984375 -vt 0.015625 0.984375 -vt 0.015625 0.96875 -vt 0.140625 0.96875 -vt 0.140625 0.984375 -vt 0.015625 0.984375 -vt 0.015625 0.96875 -vt 0.03125 0.859375 -vt 0.03125 0.984375 -vt 0.015625 0.984375 -vt 0.015625 0.859375 -vt 0.03125 0.859375 -vt 0.03125 0.984375 -vt 0.015625 0.984375 -vt 0.015625 0.859375 -vt 0.015625 0.984375 -vt 0.015625 1 -vt 0 1 -vt 0 0.984375 -vt 0.015625 0.984375 -vt 0.015625 1 -vt 0 1 -vt 0 0.984375 vn 1 0 0 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -vn 0 0 1 -vn 0 0 -1 -usemtl common_steel_norivets -f 1353/3669/918 1351/3670/918 1350/3671/918 -f 1353/3669/918 1350/3671/918 1352/3672/918 -f 1356/3673/919 1354/3674/919 1355/3675/919 -f 1356/3673/919 1355/3675/919 1357/3676/919 -f 1350/3677/920 1351/3678/920 1355/3679/920 -f 1350/3677/920 1355/3679/920 1354/3680/920 -f 1353/3681/921 1352/3682/921 1356/3683/921 -f 1353/3681/921 1356/3683/921 1357/3684/921 -f 1352/3685/922 1350/3686/922 1354/3687/922 -f 1352/3685/922 1354/3687/922 1356/3688/922 -f 1357/3689/923 1355/3690/923 1351/3691/923 -f 1357/3689/923 1351/3691/923 1353/3692/923 -o transmission -v -0.25 0.65625 2.125 -v -0.25 0.65625 1.9375 -v -0.25 0.46875 2.125 -v -0.25 0.46875 1.9375 -v -0.4375 0.65625 2.125 -v -0.4375 0.65625 1.9375 -v -0.4375 0.46875 2.125 -v -0.4375 0.46875 1.9375 -v 0.4375 0.65625 2.125 -v 0.4375 0.65625 1.9375 -v 0.4375 0.46875 2.125 -v 0.4375 0.46875 1.9375 -v 0.25 0.65625 2.125 -v 0.25 0.65625 1.9375 -v 0.25 0.46875 2.125 -v 0.25 0.46875 1.9375 -vt 0.65625 1 -vt 0.5625 1 -vt 0.5625 0.90625 -vt 0.65625 0.90625 -vt 0.65625 1 -vt 0.5625 1 -vt 0.5625 0.90625 -vt 0.65625 0.90625 -vt 0.65625 1 -vt 0.5625 1 -vt 0.5625 0.90625 -vt 0.65625 0.90625 -vt 0.65625 1 -vt 0.5625 1 -vt 0.5625 0.90625 -vt 0.65625 0.90625 -vt 0.65625 1 -vt 0.5625 1 -vt 0.5625 0.90625 -vt 0.65625 0.90625 -vt 0.65625 1 -vt 0.5625 1 -vt 0.5625 0.90625 -vt 0.65625 0.90625 -vt 0.65625 1 +vn 0 1 -0.05 +vn 0 0.05 1 +vn 0 -0.05 -1 +usemtl v4_diesel2 +f 712/1953/489 711/1954/489 713/1955/489 714/1956/489 +f 712/1957/490 708/1958/490 707/1959/490 711/1960/490 +f 711/1961/491 707/1962/491 709/1963/491 713/1964/491 +f 708/1965/492 712/1966/492 714/1967/492 710/1968/492 +usemtl v4_diesel +f 715/1969/493 716/1970/493 718/1971/493 717/1972/493 +f 720/1973/494 719/1974/494 721/1975/494 722/1976/494 +f 720/1977/495 716/1978/495 715/1979/495 719/1980/495 +f 721/1981/496 717/1982/496 718/1983/496 722/1984/496 +f 719/1985/497 715/1986/497 717/1987/497 721/1988/497 +f 716/1989/498 720/1990/498 722/1991/498 718/1992/498 +usemtl v4_diesel2 +f 726/1993/499 724/1994/499 723/1995/499 725/1996/499 +f 729/1997/500 727/1998/500 728/1999/500 730/2000/500 +f 725/2001/501 723/2002/501 727/2003/501 729/2004/501 +f 730/2005/502 728/2006/502 724/2007/502 726/2008/502 +f 733/2009/503 731/2010/503 732/2011/503 734/2012/503 +f 726/2013/504 725/2014/504 732/2015/504 731/2016/504 +f 730/2017/505 726/2018/505 731/2019/505 733/2020/505 +f 734/2021/506 732/2022/506 725/2023/506 729/2024/506 +f 707/2025/507 733/2026/507 734/2027/507 709/2028/507 +f 710/2029/508 729/2030/508 730/2031/508 708/2032/508 +f 709/2033/509 734/2034/509 729/2035/509 710/2036/509 +f 708/2037/510 730/2038/510 733/2039/510 707/2040/510 +f 709/2041/511 736/2042/511 735/2043/511 713/2044/511 +f 714/2045/512 737/2046/512 738/2047/512 710/2048/512 +f 713/2049/513 735/2050/513 737/2051/513 714/2052/513 +f 710/2053/514 738/2054/514 736/2055/514 709/2056/514 +usemtl v4_diesel +f 739/2057/515 740/2058/515 742/2059/515 741/2060/515 +f 744/2061/516 743/2062/516 745/2063/516 746/2064/516 +f 744/2065/517 740/2066/517 739/2067/517 743/2068/517 +f 743/2069/518 739/2070/518 741/2071/518 745/2072/518 +f 740/2073/519 744/2074/519 746/2075/519 742/2076/519 +o engine_cylinder1 +v 0.0252 1.0764 1.05 +v 0.0252 1.0764 1.3 +v -0.1069 0.7932 1.05 +v -0.1069 0.7932 1.3 +v 0.2517 0.9707 1.05 +v 0.2517 0.9707 1.3 +v 0.1197 0.6875 1.05 +v 0.1197 0.6875 1.3 +v 0.0799 1.1198 1.0812 +v 0.0799 1.1198 1.2687 +v 0.0535 1.0632 1.0812 +v 0.0535 1.0632 1.2687 +v 0.2498 1.0406 1.0812 +v 0.2498 1.0406 1.2687 +v 0.2234 0.9839 1.0812 +v 0.2234 0.9839 1.2687 +v 0.078 1.1897 1.05 +v 0.078 1.1897 1.3 +v 0.0516 1.133 1.05 +v 0.0516 1.133 1.3 +v 0.3046 1.084 1.05 +v 0.3046 1.084 1.3 +v 0.2782 1.0274 1.05 +v 0.2782 1.0274 1.3 +v -0.1502 1.0764 0.7687 +v -0.1502 1.0764 1.0187 +v -0.0181 0.7932 0.7687 +v -0.0181 0.7932 1.0187 +v -0.3767 0.9707 0.7687 +v -0.3767 0.9707 1.0187 +v -0.2447 0.6875 0.7687 +v -0.2447 0.6875 1.0187 +v -0.2049 1.1198 0.8 +v -0.2049 1.1198 0.9875 +v -0.1785 1.0632 0.8 +v -0.1785 1.0632 0.9875 +v -0.3748 1.0406 0.8 +v -0.3748 1.0406 0.9875 +v -0.3484 0.9839 0.8 +v -0.3484 0.9839 0.9875 +v -0.203 1.1897 0.7687 +v -0.203 1.1897 1.0187 +v -0.1766 1.133 0.7687 +v -0.1766 1.133 1.0187 +v -0.4296 1.084 0.7687 +v -0.4296 1.084 1.0187 +v -0.4032 1.0274 0.7687 +v -0.4032 1.0274 1.0187 +vt 0.3125 0.4375 +vt 0.3125 0.75 +vt 0.5625 0.75 +vt 0.5625 0.4375 +vt 0.3125 0.4375 +vt 0.3125 0.75 +vt 0.5625 0.75 +vt 0.5625 0.4375 vt 0.5625 1 -vt 0.5625 0.90625 -vt 0.65625 0.90625 -vt 0.65625 1 +vt 0.5625 0.75 +vt 0.3125 0.75 +vt 0.3125 1 +vt 0.3125 1 +vt 0.3125 0.75 +vt 0.5625 0.75 vt 0.5625 1 -vt 0.5625 0.90625 -vt 0.65625 0.90625 -vn 0 1 0 -vn 0 -1 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 1 0 -vn 0 -1 0 -vn 0 0 1 -vn 0 0 -1 -usemtl pipe34 -f 1358/3693/924 1359/3694/924 1363/3695/924 -f 1358/3693/924 1363/3695/924 1362/3696/924 -f 1361/3697/925 1360/3698/925 1364/3699/925 -f 1361/3697/925 1364/3699/925 1365/3700/925 -f 1360/3701/926 1358/3702/926 1362/3703/926 -f 1360/3701/926 1362/3703/926 1364/3704/926 -f 1365/3705/927 1363/3706/927 1359/3707/927 -f 1365/3705/927 1359/3707/927 1361/3708/927 -f 1366/3709/928 1367/3710/928 1371/3711/928 -f 1366/3709/928 1371/3711/928 1370/3712/928 -f 1369/3713/929 1368/3714/929 1372/3715/929 -f 1369/3713/929 1372/3715/929 1373/3716/929 -f 1368/3717/930 1366/3718/930 1370/3719/930 -f 1368/3717/930 1370/3719/930 1372/3720/930 -f 1373/3721/931 1371/3722/931 1367/3723/931 -f 1373/3721/931 1367/3723/931 1369/3724/931 -o armor_right -v 1.125 1.375 1.8125 -v 1.125 1.375 0.625 -v 1.0625 1.375 1.8125 -v 1.0625 1.375 0.625 -v 1.125 0.8750000000000001 1.8125 -v 1.125 0.8750000000000001 0.625 -v 1.0625000000000002 0.8750000000000001 1.8125 -v 1.0625000000000002 0.8750000000000001 0.625 -v 1.125 1.375 1.25 -v 1.125 0.8750000000000001 1.25 -v 1.0625000000000002 0.8750000000000001 1.25 -v 1.0625 1.375 1.25 -v 1.125 1.25 1.25 -v 1.125 1.25 1.8125 -v 1.0625 1.25 1.8125 -v 1.0625 1.25 1.25 -v 1.0625 1.25 0.625 -v 1.125 1.25 0.625 -vt 0.15625 1 -vt 0.15625 0.984375 -vt 0 0.984375 -vt 0 1 -vt 0.09375 1 -vt 0.09375 0.84375 -vt 0 0.84375 -vt 0 1 -vt 0.09375 0.40625 -vt 0.09375 0.25 -vt 0 0.25 -vt 0 0.40625 -vt 0.09375 1 -vt 0.09375 0.984375 -vt 0 0.984375 -vt 0 1 -vt 0.03125 0.984375 -vt 0.03125 1 -vt 0.125 1 -vt 0.125 0.984375 -vt 0.09375 0.390625 -vt 0.09375 0.25 -vt 0 0.25 -vt 0 0.390625 -vt 0.15625 0.984375 -vt 0.15625 1 -vt 0.296875 1 -vt 0.296875 0.984375 -vt 0.09375 1 -vt 0.09375 0.859375 -vt 0 0.859375 -vt 0 1 -vt 0.71875 0.25 -vt 0.71875 0.390625 -vt 0.75 0.390625 -vt 0.75 0.25 -vt 0.078125 0.984375 -vt 0.078125 1 -vt 0.109375 1 -vt 0.109375 0.984375 -vt 0.71875 0.859375 -vt 0.71875 1 -vt 0.75 1 -vt 0.75 0.859375 -vt 0.71875 0.25 -vt 0.71875 0.40625 -vt 0.75 0.40625 -vt 0.75 0.25 -vt 0.03125 1 -vt 0.03125 0.984375 -vt 0 0.984375 -vt 0 1 -vt 0.71875 0.84375 -vt 0.71875 1 -vt 0.75 1 -vt 0.75 0.84375 -vt 0.296875 1 -vt 0.296875 0.984375 -vt 0 0.984375 -vt 0 1 -vn 2.220446049250313e-16 -1 0 -vn 1 2.220446049250313e-16 0 -vn -1 -2.220446049250313e-16 0 -vn 0 0 1 -vn 0 0 -1 -vn 1 2.220446049250313e-16 0 -vn 2.220446049250313e-16 -1 0 -vn -1 -2.220446049250313e-16 0 -vn 1 2.220446049250313e-16 0 -vn 0 0 1 -vn -1 -2.220446049250313e-16 0 -vn -1 -2.220446049250313e-16 0 -vn 0 0 -1 -vn 1 2.220446049250313e-16 0 -vn -2.220446049250313e-16 1 0 -usemtl common_bottom_painted -f 1383/3725/932 1384/3726/932 1381/3727/932 -f 1383/3725/932 1381/3727/932 1379/3728/932 -f 1391/3729/933 1386/3730/933 1383/3731/933 -f 1391/3729/933 1383/3731/933 1379/3732/933 -usemtl common_bottom -f 1389/3733/934 1390/3734/934 1381/3735/934 -f 1389/3733/934 1381/3735/934 1384/3736/934 -usemtl common_bottom_painted -f 1387/3737/935 1388/3738/935 1380/3739/935 -f 1387/3737/935 1380/3739/935 1378/3740/935 -f 1390/3741/936 1391/3742/936 1379/3743/936 -f 1390/3741/936 1379/3743/936 1381/3744/936 -f 1386/3745/937 1387/3746/937 1378/3747/937 -f 1386/3745/937 1378/3747/937 1383/3748/937 -f 1384/3749/938 1383/3750/938 1378/3751/938 -f 1384/3749/938 1378/3751/938 1380/3752/938 -usemtl common_bottom -f 1388/3753/939 1389/3754/939 1384/3755/939 -f 1388/3753/939 1384/3755/939 1380/3756/939 -usemtl common_bottom_painted -f 1387/3757/940 1386/3758/940 1382/3759/940 -f 1387/3757/940 1382/3759/940 1374/3760/940 -f 1388/3761/941 1387/3762/941 1374/3763/941 -f 1388/3761/941 1374/3763/941 1376/3764/941 -usemtl common_bottom -f 1389/3765/942 1388/3766/942 1376/3767/942 -f 1389/3765/942 1376/3767/942 1385/3768/942 -f 1390/3769/943 1389/3770/943 1385/3771/943 -f 1390/3769/943 1385/3771/943 1377/3772/943 -usemtl common_bottom_painted -f 1391/3773/944 1390/3774/944 1377/3775/944 -f 1391/3773/944 1377/3775/944 1375/3776/944 -f 1386/3777/945 1391/3778/945 1375/3779/945 -f 1386/3777/945 1375/3779/945 1382/3780/945 -f 1375/3781/946 1377/3782/946 1376/3783/946 -f 1375/3781/946 1376/3783/946 1374/3784/946 -o armor_left -v -1.125 1.375 1.8125 -v -1.125 1.375 0.625 -v -1.0625 1.375 1.8125 -v -1.0625 1.375 0.625 -v -1.125 0.8750000000000001 1.8125 -v -1.125 0.8750000000000001 0.625 -v -1.0625000000000002 0.8750000000000001 1.8125 -v -1.0625000000000002 0.8750000000000001 0.625 -v -1.125 1.375 1.25 -v -1.125 0.8750000000000001 1.25 -v -1.0625000000000002 0.8750000000000001 1.25 -v -1.0625 1.375 1.25 -v -1.125 1.25 1.25 -v -1.125 1.25 1.8125 -v -1.0625 1.25 1.8125 -v -1.0625 1.25 1.25 -v -1.0625 1.25 0.625 -v -1.125 1.25 0.625 -vt 0 0.984375 -vt 0.15625 0.984375 -vt 0.15625 1 +vt 0.5625 0.4375 +vt 0.5625 0.75 +vt 0.3125 0.75 +vt 0.3125 0.4375 +vt 0.5625 0.4375 +vt 0.5625 0.75 +vt 0.3125 0.75 +vt 0.3125 0.4375 +vt 0.25 0.75 +vt 0.25 0.6875 +vt 0.0625 0.6875 +vt 0.0625 0.75 +vt 0.25 0.75 +vt 0.25 0.6875 +vt 0.0625 0.6875 +vt 0.0625 0.75 +vt 0.0625 0.75 +vt 0.0625 0.6875 +vt 0.25 0.6875 +vt 0.25 0.75 +vt 0.0625 0.6875 +vt 0.0625 0.75 +vt 0.25 0.75 +vt 0.25 0.6875 +vt 0.25 0.8125 +vt 0.25 0.75 +vt 0 0.75 +vt 0 0.8125 vt 0 1 -vt 0 0.84375 -vt 0.09375 0.84375 -vt 0.09375 1 +vt 0.0625 1 +vt 0.0625 0.75 +vt 0 0.75 +vt 0.25 1 +vt 0.25 0.75 +vt 0 0.75 vt 0 1 -vt 0 0.25 -vt 0.09375 0.25 -vt 0.09375 0.40625 -vt 0 0.40625 -vt 0 0.984375 -vt 0.09375 0.984375 -vt 0.09375 1 +vt 0.25 0.75 +vt 0.25 1 vt 0 1 -vt 0.125 1 -vt 0.03125 1 -vt 0.03125 0.984375 -vt 0.125 0.984375 -vt 0 0.25 -vt 0.09375 0.25 -vt 0.09375 0.390625 -vt 0 0.390625 -vt 0.296875 1 -vt 0.15625 1 -vt 0.15625 0.984375 -vt 0.296875 0.984375 -vt 0 0.859375 -vt 0.09375 0.859375 -vt 0.09375 1 +vt 0 0.75 +vt 0.25 1 +vt 0.25 0.9375 +vt 0 0.9375 vt 0 1 -vt 0.75 0.390625 -vt 0.71875 0.390625 -vt 0.71875 0.25 -vt 0.75 0.25 -vt 0.109375 1 -vt 0.078125 1 -vt 0.078125 0.984375 -vt 0.109375 0.984375 -vt 0.75 1 -vt 0.71875 1 -vt 0.71875 0.859375 -vt 0.75 0.859375 -vt 0.75 0.40625 -vt 0.71875 0.40625 -vt 0.71875 0.25 -vt 0.75 0.25 -vt 0 0.984375 -vt 0.03125 0.984375 -vt 0.03125 1 +vt 0 0.8125 +vt 0 0.75 +vt 0.25 0.75 +vt 0.25 0.8125 +vt 0.5625 0.75 +vt 0.3125 0.75 +vt 0.3125 0.4375 +vt 0.5625 0.4375 +vt 0.5625 0.75 +vt 0.3125 0.75 +vt 0.3125 0.4375 +vt 0.5625 0.4375 +vt 0.3125 0.75 +vt 0.5625 0.75 +vt 0.5625 1 +vt 0.3125 1 +vt 0.5625 0.75 +vt 0.3125 0.75 +vt 0.3125 1 +vt 0.5625 1 +vt 0.3125 0.75 +vt 0.5625 0.75 +vt 0.5625 0.4375 +vt 0.3125 0.4375 +vt 0.3125 0.75 +vt 0.5625 0.75 +vt 0.5625 0.4375 +vt 0.3125 0.4375 +vt 0.0625 0.6875 +vt 0.25 0.6875 +vt 0.25 0.75 +vt 0.0625 0.75 +vt 0.0625 0.6875 +vt 0.25 0.6875 +vt 0.25 0.75 +vt 0.0625 0.75 +vt 0.25 0.6875 +vt 0.0625 0.6875 +vt 0.0625 0.75 +vt 0.25 0.75 +vt 0.25 0.75 +vt 0.0625 0.75 +vt 0.0625 0.6875 +vt 0.25 0.6875 +vt 0 0.75 +vt 0.25 0.75 +vt 0.25 0.8125 +vt 0 0.8125 +vt 0.0625 0.75 +vt 0.0625 1 vt 0 1 -vt 0.75 1 -vt 0.71875 1 -vt 0.71875 0.84375 -vt 0.75 0.84375 -vt 0 0.984375 -vt 0.296875 0.984375 -vt 0.296875 1 +vt 0 0.75 +vt 0 0.75 +vt 0.25 0.75 +vt 0.25 1 +vt 0 1 +vt 0 1 +vt 0.25 1 +vt 0.25 0.75 +vt 0 0.75 +vt 0 0.9375 +vt 0.25 0.9375 +vt 0.25 1 vt 0 1 -vn -2.220446049250313e-16 -1 0 -vn -1 2.220446049250313e-16 0 -vn 1 -2.220446049250313e-16 0 +vt 0.25 0.75 +vt 0 0.75 +vt 0 0.8125 +vt 0.25 0.8125 +vn -0.91 0.42 0 +vn 0.91 -0.42 0 +vn 0.42 0.91 0 +vn -0.42 -0.91 0 +vn 0 0 -1 vn 0 0 1 +vn -0.91 0.42 0 +vn 0.91 -0.42 0 vn 0 0 -1 -vn -1 2.220446049250313e-16 0 -vn -2.220446049250313e-16 -1 0 -vn 1 -2.220446049250313e-16 0 -vn -1 2.220446049250313e-16 0 vn 0 0 1 -vn 1 -2.220446049250313e-16 0 -vn 1 -2.220446049250313e-16 0 +vn -0.91 0.42 0 +vn 0.91 -0.42 0 +vn 0.42 0.91 0 +vn -0.42 -0.91 0 vn 0 0 -1 -vn -1 2.220446049250313e-16 0 -vn 2.220446049250313e-16 1 0 -usemtl common_bottom_painted -f 1399/3785/947 1402/3786/947 1401/3787/947 -f 1399/3785/947 1401/3787/947 1397/3788/947 -f 1401/3789/948 1404/3790/948 1409/3791/948 -f 1401/3789/948 1409/3791/948 1397/3792/948 -usemtl common_bottom -f 1399/3793/949 1408/3794/949 1407/3795/949 -f 1399/3793/949 1407/3795/949 1402/3796/949 -usemtl common_bottom_painted -f 1398/3797/950 1406/3798/950 1405/3799/950 -f 1398/3797/950 1405/3799/950 1396/3800/950 -f 1397/3801/951 1409/3802/951 1408/3803/951 -f 1397/3801/951 1408/3803/951 1399/3804/951 -f 1396/3805/952 1405/3806/952 1404/3807/952 -f 1396/3805/952 1404/3807/952 1401/3808/952 -f 1396/3809/953 1401/3810/953 1402/3811/953 -f 1396/3809/953 1402/3811/953 1398/3812/953 -usemtl common_bottom -f 1402/3813/954 1407/3814/954 1406/3815/954 -f 1402/3813/954 1406/3815/954 1398/3816/954 -usemtl common_bottom_painted -f 1400/3817/955 1404/3818/955 1405/3819/955 -f 1400/3817/955 1405/3819/955 1392/3820/955 -f 1392/3821/956 1405/3822/956 1406/3823/956 -f 1392/3821/956 1406/3823/956 1394/3824/956 -usemtl common_bottom -f 1394/3825/957 1406/3826/957 1407/3827/957 -f 1394/3825/957 1407/3827/957 1403/3828/957 -f 1403/3829/958 1407/3830/958 1408/3831/958 -f 1403/3829/958 1408/3831/958 1395/3832/958 -usemtl common_bottom_painted -f 1395/3833/959 1408/3834/959 1409/3835/959 -f 1395/3833/959 1409/3835/959 1393/3836/959 -f 1393/3837/960 1409/3838/960 1404/3839/960 -f 1393/3837/960 1404/3839/960 1400/3840/960 -f 1394/3841/961 1395/3842/961 1393/3843/961 -f 1394/3841/961 1393/3843/961 1392/3844/961 -o engine -v -0.25533125 0.8125 0.874965625 -v -0.25533125 0.8125 0.812465625 -v -0.25533125 0.4375 0.874965625 -v -0.25533125 0.4375 0.812465625 -v 0.11966874999999999 0.8125 0.874965625 -v 0.11966874999999999 0.8125 0.812465625 -v 0.11966874999999999 0.4375 0.874965625 -v 0.11966874999999999 0.4375 0.812465625 -v -0.22408125 0.78125 0.812465625 -v -0.22408125 0.78125 0.749965625 -v -0.22408125 0.46875 0.812465625 -v -0.22408125 0.46875 0.749965625 -v 0.08841874999999999 0.78125 0.812465625 -v 0.08841874999999999 0.78125 0.749965625 -v 0.08841874999999999 0.46875 0.812465625 -v 0.08841874999999999 0.46875 0.749965625 -v -0.25533125 0.8125 0.749965625 -v -0.25533125 0.8125 0.687465625 -v -0.25533125 0.4375 0.749965625 -v -0.25533125 0.4375 0.687465625 -v 0.11966874999999999 0.8125 0.749965625 -v 0.11966874999999999 0.8125 0.687465625 -v 0.11966874999999999 0.4375 0.749965625 -v 0.11966874999999999 0.4375 0.687465625 -v 0.15625 0.9375 0.9375 -v 0.15625 0.9375 0.8125 -v 0.15625 0.8125 0.9375 -v 0.15625 0.8125 0.8125 -v 0.28125 0.875 0.9375 -v 0.28125 0.875 0.8125 -v 0.28125 0.8125 0.9375 -v 0.28125 0.8125 0.8125 -v 0.15625 0.6875 0.875 -v 0.15625 0.6875 0.75 -v 0.28125 0.6875 0.875 -v 0.28125 0.6875 0.75 -v 0.15625 0.5625 0.875 -v 0.28125 0.5625 0.875 -v 0.15625 0.625 0.75 -v 0.28125 0.625 0.75 -v 0.15625 0.6875 1.25 -v 0.15625 0.5625 1.25 -v 0.28125 0.6875 1.25 -v 0.28125 0.5625 1.25 -v 0.15625 0.8125 1.25 -v 0.15625 0.8125 1.125 -v 0.15625 0.6875 1.125 -v 0.28125 0.8125 1.25 -v 0.28125 0.8125 1.125 -v 0.28125 0.6875 1.125 -v 0.15625 0.9375 1.25 -v 0.15625 0.9375 1.125 -v 0.28125 0.875 1.25 -v 0.28125 0.875 1.125 -v 0.28125 0.625 1.375 -v 0.15625 0.625 1.375 -v 0.28125 0.5625 1.375 -v 0.15625 0.5625 1.375 -v 0.15625 0.4375 1.375 -v 0.28125 0.4375 1.375 -v 0.15625 0.5 1.25 -v 0.28125 0.5 1.25 -v 0.15625 0.5625 1.5 -v 0.15625 0.4375 1.5 -v 0.28125 0.5625 1.4375 -v 0.28125 0.4375 1.4375 -v -0.28125 0.625 1.5 -v -0.28125 0.625 1.375 -v -0.28125 0.5 1.5 -v -0.28125 0.5 1.375 -v -0.40625 0.625 1.4375 -v -0.40625 0.5 1.4375 -v -0.40625 0.625 1.375 -v -0.40625 0.5 1.375 -v -0.28125 0.625 0.9375 -v -0.28125 0.5 0.9375 -v -0.40625 0.625 0.9375 -v -0.40625 0.5 0.9375 -v -0.40625 0.6875 1.25 -v -0.40625 0.6875 1.375 -v -0.40625 0.625 1.25 -v -0.28125 0.6875 1.25 -v -0.28125 0.6875 1.375 -v -0.28125 0.625 1.25 -v -0.40625 0.8125 1.25 -v -0.28125 0.8125 1.25 -v -0.40625 0.75 1.375 -v -0.28125 0.75 1.375 -v -0.28125 0.9375 1.25 -v -0.28125 0.9375 1.125 -v -0.28125 0.8125 1.125 -v -0.40625 0.875 1.25 -v -0.40625 0.875 1.125 -v -0.40625 0.8125 1.125 -v -0.28125 0.75 1.125 -v -0.40625 0.75 1.125 -v -0.406249375 0.75 0.96875 -v -0.406249375 0.75 1.09375 -v -0.40625 0.625 0.96875 -v -0.40625 0.625 1.09375 -v -0.28125 0.6875 0.96875 -v -0.28125 0.6875 1.09375 -v -0.28125 0.625 0.96875 -v -0.28125 0.625 1.09375 -v -0.40625 0.8125 0.9375 -v -0.40625 0.625 1.125 -v -0.34375 0.8125 1.125 -v -0.34375 0.8125 0.9375 -v -0.34375 0.625 1.125 -v -0.34375 0.625 0.9375 -v -0.28125 0.9375 0.9375 -v -0.28125 0.9375 0.8125 -v -0.28125 0.8125 0.9375 -v -0.28125 0.8125 0.8125 -v -0.40625 0.875 0.9375 -v -0.40625 0.875 0.8125 -v -0.40625 0.8125 0.8125 -v -0.40625 0.625 0.8125 -v -0.28125 0.625 0.8125 -v -0.28125 0.5625 0.8125 -v -0.40625 0.5625 0.8125 -v -0.03125 0.96875 1.4875 -v -0.03125 0.96875 1.3 -v -0.03125 0.65625 1.4875 -v -0.03125 0.65625 1.3 -v 0.28125 0.96875 1.4875 -v 0.28125 0.96875 1.3 -v 0.28125 0.65625 1.4875 -v 0.28125 0.65625 1.3 -v -0.2134175 0.59994875 1.4375 -v -0.2134175 0.59994875 1.375 -v -0.07517812500000001 0.473275625 1.4375 -v -0.07517812500000001 0.473275625 1.375 -v -0.0022956250000000233 0.830348125 1.4375 -v -0.0022956250000000233 0.830348125 1.375 -v 0.13594374999999997 0.7036743750000001 1.4375 -v 0.13594374999999997 0.7036743750000001 1.375 -v 0.03125 1.1875 1.15 -v 0.03125 1.1875 0.9624999999999999 -v -0.15625 1.1875 1.15 -v -0.15625 1.1875 0.9624999999999999 -v 0.03125 1.125 1.15 -v 0.03125 1.125 0.9624999999999999 -v -0.15625 1.125 1.15 -v -0.15625 1.125 0.9624999999999999 -v -0.125 1.125 1.1125 -v -0.125 1.125 0.9875 -v -0.125 1.0625 1.1125 -v -0.125 1.0625 0.9875 -v 0 1.125 1.1125 -v 0 1.125 0.9875 -v 0 1.0625 1.1125 -v 0 1.0625 0.9875 -v -0.125 0.9375 0.9875 -v 0 0.9375 0.9875 -v -0.125 1 0.8625 -v 0 1 0.8625 -v -0.125 0.9375 0.8625 -v 0 0.9375 0.8625 -v -0.125 0.875 0.9875 -v -0.125 0.875 0.8625 -v 0 0.875 0.9875 -v 0 0.875 0.8625 -v -0.125 1.0625 1.175 -v -0.125 0.9375 1.175 -v 0 1.0625 1.175 -v 0 0.9375 1.175 -v -0.125 1 1.3 -v 0 1 1.3 -v -0.125 0.9375 1.3 -v 0 0.9375 1.3 -v -0.125 0.875 1.175 -v -0.125 0.875 1.3 -v 0 0.875 1.175 -v 0 0.875 1.3 -v -0.25533125 0.8125 1.374965625 -v -0.25533125 0.4375 1.374965625 -v 0.11966874999999999 0.8125 1.374965625 -v 0.11966874999999999 0.4375 1.374965625 -v -0.125 1.1875 1.125 -v 0 1.1875 1.125 -v -0.125 1.1875 1 -v 0 1.1875 1 -v -0.125 1.3125 1.125 -v 0 1.25 1.125 -v -0.125 1.3125 1 -v 0 1.25 1 -v -0.3125 1.1875 1 -v -0.3125 1.3125 1 -v -0.3125 1.1875 1.125 -v -0.3125 1.3125 1.125 -v -0.4375 1.3125 1 -v -0.4375 1.1875 1 -v -0.4375 1.3125 1.0625 -v -0.4375 1.1875 1.0625 -v -0.3125 1.1875 0.6875 -v -0.3125 1.3125 0.6875 -v -0.4375 1.1875 0.6875 -v -0.4375 1.3125 0.6875 -vt 0.375 0.75 -vt 0.4375 0.75 -vt 0.4375 0.375 -vt 0.375 0.375 -vt 0.6875 0.75 -vt 0.75 0.75 -vt 0.75 0.375 -vt 0.6875 0.375 -vt 0.75 0.75 -vt 0.375 0.75 -vt 0.375 0.6875 -vt 0.75 0.6875 -vt 0.75 0.4375 -vt 0.375 0.4375 -vt 0.375 0.375 -vt 0.75 0.375 -vt 0.375 0.75 -vt 0.75 0.75 -vt 0.75 0.375 -vt 0.375 0.375 -vt 0.75 0.6875 -vt 0.8125 0.6875 -vt 0.8125 0.375 -vt 0.75 0.375 -vt 0.75 0.6875 -vt 0.8125 0.6875 -vt 0.8125 0.375 -vt 0.75 0.375 -vt 0.75 0.375 -vt 0.75 0.6875 -vt 0.8125 0.6875 -vt 0.8125 0.375 -vt 0.75 0.375 -vt 0.75 0.6875 -vt 0.8125 0.6875 -vt 0.8125 0.375 -vt 0.375 0.75 -vt 0.4375 0.75 -vt 0.4375 0.375 -vt 0.375 0.375 -vt 0.6875 0.75 -vt 0.75 0.75 -vt 0.75 0.375 -vt 0.6875 0.375 -vt 0.75 0.75 -vt 0.375 0.75 -vt 0.375 0.6875 -vt 0.75 0.6875 -vt 0.75 0.4375 -vt 0.375 0.4375 -vt 0.375 0.375 -vt 0.75 0.375 -vt 0.75 0.75 -vt 0.375 0.75 -vt 0.375 0.375 -vt 0.75 0.375 -vt 0.75 0.9375 -vt 0.625 0.9375 -vt 0.625 0.875 -vt 0.75 0.875 -vt 0.75 0.8125 -vt 0.75 0.9375 -vt 0.625 0.9375 -vt 0.625 0.8125 -vt 0.625 1 -vt 0.75 1 -vt 0.75 0.875 -vt 0.625 0.875 -vt 0.8125 0.9375 -vt 0.6875 0.9375 -vt 0.6875 0.8125 -vt 0.8125 0.8125 -vt 0.75 0.875 -vt 0.625 0.875 -vt 0.625 0.75 +vn 0 0 1 +vn 0.91 0.42 0 +vn -0.91 -0.42 0 +vn -0.42 0.91 0 +vn 0.42 -0.91 0 +vn 0 0 -1 +vn 0 0 1 +vn 0.91 0.42 0 +vn -0.91 -0.42 0 +vn 0 0 -1 +vn 0 0 1 +vn 0.91 0.42 0 +vn -0.91 -0.42 0 +vn -0.42 0.91 0 +vn 0.42 -0.91 0 +vn 0 0 -1 +vn 0 0 1 +usemtl engine_4 +f 750/2077/520 748/2078/520 747/2079/520 749/2080/520 +f 753/2081/521 751/2082/521 752/2083/521 754/2084/521 +f 747/2085/522 748/2086/522 752/2087/522 751/2088/522 +f 750/2089/523 749/2090/523 753/2091/523 754/2092/523 +f 749/2093/524 747/2094/524 751/2095/524 753/2096/524 +f 754/2097/525 752/2098/525 748/2099/525 750/2100/525 +f 758/2101/526 756/2102/526 755/2103/526 757/2104/526 +f 761/2105/527 759/2106/527 760/2107/527 762/2108/527 +f 757/2109/528 755/2110/528 759/2111/528 761/2112/528 +f 762/2113/529 760/2114/529 756/2115/529 758/2116/529 +f 766/2117/530 764/2118/530 763/2119/530 765/2120/530 +f 769/2121/531 767/2122/531 768/2123/531 770/2124/531 +f 763/2125/532 764/2126/532 768/2127/532 767/2128/532 +f 766/2129/533 765/2130/533 769/2131/533 770/2132/533 +f 765/2133/534 763/2134/534 767/2135/534 769/2136/534 +f 770/2137/535 768/2138/535 764/2139/535 766/2140/535 +f 771/2141/536 772/2142/536 774/2143/536 773/2144/536 +f 776/2145/537 775/2146/537 777/2147/537 778/2148/537 +f 776/2149/538 772/2150/538 771/2151/538 775/2152/538 +f 777/2153/539 773/2154/539 774/2155/539 778/2156/539 +f 775/2157/540 771/2158/540 773/2159/540 777/2160/540 +f 772/2161/541 776/2162/541 778/2163/541 774/2164/541 +f 779/2165/542 780/2166/542 782/2167/542 781/2168/542 +f 784/2169/543 783/2170/543 785/2171/543 786/2172/543 +f 783/2173/544 779/2174/544 781/2175/544 785/2176/544 +f 780/2177/545 784/2178/545 786/2179/545 782/2180/545 +f 787/2181/546 788/2182/546 790/2183/546 789/2184/546 +f 792/2185/547 791/2186/547 793/2187/547 794/2188/547 +f 792/2189/548 788/2190/548 787/2191/548 791/2192/548 +f 793/2193/549 789/2194/549 790/2195/549 794/2196/549 +f 791/2197/550 787/2198/550 789/2199/550 793/2200/550 +f 788/2201/551 792/2202/551 794/2203/551 790/2204/551 +o engine_cylinder2 +v -0.1502 1.0764 1.05 +v -0.1502 1.0764 1.3 +v -0.0181 0.7932 1.05 +v -0.0181 0.7932 1.3 +v -0.3767 0.9707 1.05 +v -0.3767 0.9707 1.3 +v -0.2447 0.6875 1.05 +v -0.2447 0.6875 1.3 +v -0.2049 1.1198 1.0812 +v -0.2049 1.1198 1.2687 +v -0.1785 1.0632 1.0812 +v -0.1785 1.0632 1.2687 +v -0.3748 1.0406 1.0812 +v -0.3748 1.0406 1.2687 +v -0.3484 0.9839 1.0812 +v -0.3484 0.9839 1.2687 +v -0.203 1.1897 1.05 +v -0.203 1.1897 1.3 +v -0.1766 1.133 1.05 +v -0.1766 1.133 1.3 +v -0.4296 1.084 1.05 +v -0.4296 1.084 1.3 +v -0.4032 1.0274 1.05 +v -0.4032 1.0274 1.3 +v 0.0252 1.0764 0.7687 +v 0.0252 1.0764 1.0187 +v -0.1069 0.7932 0.7687 +v -0.1069 0.7932 1.0187 +v 0.2517 0.9707 0.7687 +v 0.2517 0.9707 1.0187 +v 0.1197 0.6875 0.7687 +v 0.1197 0.6875 1.0187 +v 0.0799 1.1198 0.8 +v 0.0799 1.1198 0.9875 +v 0.0535 1.0632 0.8 +v 0.0535 1.0632 0.9875 +v 0.2498 1.0406 0.8 +v 0.2498 1.0406 0.9875 +v 0.2234 0.9839 0.8 +v 0.2234 0.9839 0.9875 +v 0.078 1.1897 0.7687 +v 0.078 1.1897 1.0187 +v 0.0516 1.133 0.7687 +v 0.0516 1.133 1.0187 +v 0.3046 1.084 0.7687 +v 0.3046 1.084 1.0187 +v 0.2782 1.0274 0.7687 +v 0.2782 1.0274 1.0187 +vt 0.5625 0.75 +vt 0.3125 0.75 +vt 0.3125 0.4375 +vt 0.5625 0.4375 +vt 0.5625 0.75 +vt 0.3125 0.75 +vt 0.3125 0.4375 +vt 0.5625 0.4375 +vt 0.3125 0.75 +vt 0.5625 0.75 +vt 0.5625 1 +vt 0.3125 1 +vt 0.5625 0.75 +vt 0.3125 0.75 +vt 0.3125 1 +vt 0.5625 1 +vt 0.3125 0.75 +vt 0.5625 0.75 +vt 0.5625 0.4375 +vt 0.3125 0.4375 +vt 0.3125 0.75 +vt 0.5625 0.75 +vt 0.5625 0.4375 +vt 0.3125 0.4375 +vt 0.0625 0.6875 +vt 0.25 0.6875 +vt 0.25 0.75 +vt 0.0625 0.75 +vt 0.0625 0.6875 +vt 0.25 0.6875 +vt 0.25 0.75 +vt 0.0625 0.75 +vt 0.25 0.6875 +vt 0.0625 0.6875 +vt 0.0625 0.75 +vt 0.25 0.75 +vt 0.25 0.75 +vt 0.0625 0.75 +vt 0.0625 0.6875 +vt 0.25 0.6875 +vt 0 0.75 +vt 0.25 0.75 +vt 0.25 0.8125 +vt 0 0.8125 +vt 0.0625 0.75 +vt 0.0625 1 +vt 0 1 +vt 0 0.75 +vt 0 0.75 +vt 0.25 0.75 +vt 0.25 1 +vt 0 1 +vt 0 1 +vt 0.25 1 +vt 0.25 0.75 +vt 0 0.75 +vt 0 0.9375 +vt 0.25 0.9375 +vt 0.25 1 +vt 0 1 +vt 0.25 0.75 +vt 0 0.75 +vt 0 0.8125 +vt 0.25 0.8125 +vt 0.3125 0.4375 +vt 0.3125 0.75 +vt 0.5625 0.75 +vt 0.5625 0.4375 +vt 0.3125 0.4375 +vt 0.3125 0.75 +vt 0.5625 0.75 +vt 0.5625 0.4375 +vt 0.5625 1 +vt 0.5625 0.75 +vt 0.3125 0.75 +vt 0.3125 1 +vt 0.3125 1 +vt 0.3125 0.75 +vt 0.5625 0.75 +vt 0.5625 1 +vt 0.5625 0.4375 +vt 0.5625 0.75 +vt 0.3125 0.75 +vt 0.3125 0.4375 +vt 0.5625 0.4375 +vt 0.5625 0.75 +vt 0.3125 0.75 +vt 0.3125 0.4375 +vt 0.25 0.75 +vt 0.25 0.6875 +vt 0.0625 0.6875 +vt 0.0625 0.75 +vt 0.25 0.75 +vt 0.25 0.6875 +vt 0.0625 0.6875 +vt 0.0625 0.75 +vt 0.0625 0.75 +vt 0.0625 0.6875 +vt 0.25 0.6875 +vt 0.25 0.75 +vt 0.0625 0.6875 +vt 0.0625 0.75 +vt 0.25 0.75 +vt 0.25 0.6875 +vt 0.25 0.8125 +vt 0.25 0.75 +vt 0 0.75 +vt 0 0.8125 +vt 0 1 +vt 0.0625 1 +vt 0.0625 0.75 +vt 0 0.75 +vt 0.25 1 +vt 0.25 0.75 +vt 0 0.75 +vt 0 1 +vt 0.25 0.75 +vt 0.25 1 +vt 0 1 +vt 0 0.75 +vt 0.25 1 +vt 0.25 0.9375 +vt 0 0.9375 +vt 0 1 +vt 0 0.8125 +vt 0 0.75 +vt 0.25 0.75 +vt 0.25 0.8125 +vn 0.91 0.42 0 +vn -0.91 -0.42 0 +vn -0.42 0.91 0 +vn 0.42 -0.91 0 +vn 0 0 -1 +vn 0 0 1 +vn 0.91 0.42 0 +vn -0.91 -0.42 0 +vn 0 0 -1 +vn 0 0 1 +vn 0.91 0.42 0 +vn -0.91 -0.42 0 +vn -0.42 0.91 0 +vn 0.42 -0.91 0 +vn 0 0 -1 +vn 0 0 1 +vn -0.91 0.42 0 +vn 0.91 -0.42 0 +vn 0.42 0.91 0 +vn -0.42 -0.91 0 +vn 0 0 -1 +vn 0 0 1 +vn -0.91 0.42 0 +vn 0.91 -0.42 0 +vn 0 0 -1 +vn 0 0 1 +vn -0.91 0.42 0 +vn 0.91 -0.42 0 +vn 0.42 0.91 0 +vn -0.42 -0.91 0 +vn 0 0 -1 +vn 0 0 1 +usemtl engine_4 +f 795/2205/552 796/2206/552 798/2207/552 797/2208/552 +f 800/2209/553 799/2210/553 801/2211/553 802/2212/553 +f 800/2213/554 796/2214/554 795/2215/554 799/2216/554 +f 801/2217/555 797/2218/555 798/2219/555 802/2220/555 +f 799/2221/556 795/2222/556 797/2223/556 801/2224/556 +f 796/2225/557 800/2226/557 802/2227/557 798/2228/557 +f 803/2229/558 804/2230/558 806/2231/558 805/2232/558 +f 808/2233/559 807/2234/559 809/2235/559 810/2236/559 +f 807/2237/560 803/2238/560 805/2239/560 809/2240/560 +f 804/2241/561 808/2242/561 810/2243/561 806/2244/561 +f 811/2245/562 812/2246/562 814/2247/562 813/2248/562 +f 816/2249/563 815/2250/563 817/2251/563 818/2252/563 +f 816/2253/564 812/2254/564 811/2255/564 815/2256/564 +f 817/2257/565 813/2258/565 814/2259/565 818/2260/565 +f 815/2261/566 811/2262/566 813/2263/566 817/2264/566 +f 812/2265/567 816/2266/567 818/2267/567 814/2268/567 +f 822/2269/568 820/2270/568 819/2271/568 821/2272/568 +f 825/2273/569 823/2274/569 824/2275/569 826/2276/569 +f 819/2277/570 820/2278/570 824/2279/570 823/2280/570 +f 822/2281/571 821/2282/571 825/2283/571 826/2284/571 +f 821/2285/572 819/2286/572 823/2287/572 825/2288/572 +f 826/2289/573 824/2290/573 820/2291/573 822/2292/573 +f 830/2293/574 828/2294/574 827/2295/574 829/2296/574 +f 833/2297/575 831/2298/575 832/2299/575 834/2300/575 +f 829/2301/576 827/2302/576 831/2303/576 833/2304/576 +f 834/2305/577 832/2306/577 828/2307/577 830/2308/577 +f 838/2309/578 836/2310/578 835/2311/578 837/2312/578 +f 841/2313/579 839/2314/579 840/2315/579 842/2316/579 +f 835/2317/580 836/2318/580 840/2319/580 839/2320/580 +f 838/2321/581 837/2322/581 841/2323/581 842/2324/581 +f 837/2325/582 835/2326/582 839/2327/582 841/2328/582 +f 842/2329/583 840/2330/583 836/2331/583 838/2332/583 +o engine +v -0.2553 0.8125 0.875 +v -0.2553 0.8125 0.8125 +v -0.2553 0.4375 0.875 +v -0.2553 0.4375 0.8125 +v 0.1197 0.8125 0.875 +v 0.1197 0.8125 0.8125 +v 0.1197 0.4375 0.875 +v 0.1197 0.4375 0.8125 +v -0.2241 0.7813 0.8125 +v -0.2241 0.7813 0.75 +v -0.2241 0.4688 0.8125 +v -0.2241 0.4688 0.75 +v 0.0884 0.7813 0.8125 +v 0.0884 0.7813 0.75 +v 0.0884 0.4688 0.8125 +v 0.0884 0.4688 0.75 +v -0.2553 0.8125 0.75 +v -0.2553 0.8125 0.6875 +v -0.2553 0.4375 0.75 +v -0.2553 0.4375 0.6875 +v 0.1197 0.8125 0.75 +v 0.1197 0.8125 0.6875 +v 0.1197 0.4375 0.75 +v 0.1197 0.4375 0.6875 +v 0.1563 0.9375 0.9375 +v 0.1563 0.9375 0.8125 +v 0.1563 0.8125 0.9375 +v 0.1563 0.8125 0.8125 +v 0.2813 0.875 0.9375 +v 0.2813 0.875 0.8125 +v 0.2813 0.8125 0.9375 +v 0.2813 0.8125 0.8125 +v 0.1563 0.6875 0.875 +v 0.1563 0.6875 0.75 +v 0.2813 0.6875 0.875 +v 0.2813 0.6875 0.75 +v 0.1563 0.5625 0.875 +v 0.2813 0.5625 0.875 +v 0.1563 0.625 0.75 +v 0.2813 0.625 0.75 +v 0.1563 0.6875 1.25 +v 0.1563 0.5625 1.25 +v 0.2813 0.6875 1.25 +v 0.2813 0.5625 1.25 +v 0.1563 0.8125 1.25 +v 0.1563 0.8125 1.125 +v 0.1563 0.6875 1.125 +v 0.2813 0.8125 1.25 +v 0.2813 0.8125 1.125 +v 0.2813 0.6875 1.125 +v 0.1563 0.9375 1.25 +v 0.1563 0.9375 1.125 +v 0.2813 0.875 1.25 +v 0.2813 0.875 1.125 +v 0.2813 0.625 1.375 +v 0.1563 0.625 1.375 +v 0.2813 0.5625 1.375 +v 0.1563 0.5625 1.375 +v 0.1563 0.4375 1.375 +v 0.2813 0.4375 1.375 +v 0.1563 0.5 1.25 +v 0.2813 0.5 1.25 +v 0.1563 0.5625 1.5 +v 0.1563 0.4375 1.5 +v 0.2813 0.5625 1.4375 +v 0.2813 0.4375 1.4375 +v -0.2812 0.625 1.5 +v -0.2812 0.625 1.375 +v -0.2812 0.5 1.5 +v -0.2812 0.5 1.375 +v -0.4062 0.625 1.4375 +v -0.4062 0.5 1.4375 +v -0.4062 0.625 1.375 +v -0.4062 0.5 1.375 +v -0.2812 0.625 0.9375 +v -0.2812 0.5 0.9375 +v -0.4062 0.625 0.9375 +v -0.4062 0.5 0.9375 +v -0.4062 0.6875 1.25 +v -0.4062 0.6875 1.375 +v -0.4062 0.625 1.25 +v -0.2812 0.6875 1.25 +v -0.2812 0.6875 1.375 +v -0.2812 0.625 1.25 +v -0.4062 0.8125 1.25 +v -0.2812 0.8125 1.25 +v -0.4062 0.75 1.375 +v -0.2812 0.75 1.375 +v -0.2812 0.9375 1.25 +v -0.2812 0.9375 1.125 +v -0.2812 0.8125 1.125 +v -0.4062 0.875 1.25 +v -0.4062 0.875 1.125 +v -0.4062 0.8125 1.125 +v -0.2812 0.75 1.125 +v -0.4062 0.75 1.125 +v -0.4062 0.75 0.9688 +v -0.4062 0.75 1.0938 +v -0.4062 0.625 0.9688 +v -0.4062 0.625 1.0938 +v -0.2812 0.6875 0.9688 +v -0.2812 0.6875 1.0938 +v -0.2812 0.625 0.9688 +v -0.2812 0.625 1.0938 +v -0.4062 0.8125 0.9375 +v -0.4062 0.625 1.125 +v -0.3437 0.8125 1.125 +v -0.3437 0.8125 0.9375 +v -0.3437 0.625 1.125 +v -0.3437 0.625 0.9375 +v -0.2812 0.9375 0.9375 +v -0.2812 0.9375 0.8125 +v -0.2812 0.8125 0.9375 +v -0.2812 0.8125 0.8125 +v -0.4062 0.875 0.9375 +v -0.4062 0.875 0.8125 +v -0.4062 0.8125 0.8125 +v -0.4062 0.625 0.8125 +v -0.2812 0.625 0.8125 +v -0.2812 0.5625 0.8125 +v -0.4062 0.5625 0.8125 +v -0.0312 0.9688 1.4875 +v -0.0312 0.9688 1.3 +v -0.0312 0.6563 1.4875 +v -0.0312 0.6563 1.3 +v 0.2813 0.9688 1.4875 +v 0.2813 0.9688 1.3 +v 0.2813 0.6563 1.4875 +v 0.2813 0.6563 1.3 +v -0.2134 0.5999 1.4375 +v -0.2134 0.5999 1.375 +v -0.0752 0.4733 1.4375 +v -0.0752 0.4733 1.375 +v -0.0023 0.8303 1.4375 +v -0.0023 0.8303 1.375 +v 0.1359 0.7037 1.4375 +v 0.1359 0.7037 1.375 +v 0.0313 1.1875 1.15 +v 0.0313 1.1875 0.9625 +v -0.1562 1.1875 1.15 +v -0.1562 1.1875 0.9625 +v 0.0313 1.125 1.15 +v 0.0313 1.125 0.9625 +v -0.1562 1.125 1.15 +v -0.1562 1.125 0.9625 +v -0.125 1.125 1.1125 +v -0.125 1.125 0.9875 +v -0.125 1.0625 1.1125 +v -0.125 1.0625 0.9875 +v 0 1.125 1.1125 +v 0 1.125 0.9875 +v 0 1.0625 1.1125 +v 0 1.0625 0.9875 +v -0.125 0.9375 0.9875 +v 0 0.9375 0.9875 +v -0.125 1 0.8625 +v 0 1 0.8625 +v -0.125 0.9375 0.8625 +v 0 0.9375 0.8625 +v -0.125 0.875 0.9875 +v -0.125 0.875 0.8625 +v 0 0.875 0.9875 +v 0 0.875 0.8625 +v -0.125 1.0625 1.175 +v -0.125 0.9375 1.175 +v 0 1.0625 1.175 +v 0 0.9375 1.175 +v -0.125 1 1.3 +v 0 1 1.3 +v -0.125 0.9375 1.3 +v 0 0.9375 1.3 +v -0.125 0.875 1.175 +v -0.125 0.875 1.3 +v 0 0.875 1.175 +v 0 0.875 1.3 +v -0.2553 0.8125 1.375 +v -0.2553 0.4375 1.375 +v 0.1197 0.8125 1.375 +v 0.1197 0.4375 1.375 +v -0.125 1.1875 1.125 +v 0 1.1875 1.125 +v -0.125 1.1875 1 +v 0 1.1875 1 +v -0.125 1.3125 1.125 +v 0 1.25 1.125 +v -0.125 1.3125 1 +v 0 1.25 1 +v -0.3125 1.1875 1 +v -0.3125 1.3125 1 +v -0.3125 1.1875 1.125 +v -0.3125 1.3125 1.125 +v -0.4375 1.3125 1 +v -0.4375 1.1875 1 +v -0.4375 1.3125 1.0625 +v -0.4375 1.1875 1.0625 +v -0.3125 1.1875 0.6875 +v -0.3125 1.3125 0.6875 +v -0.4375 1.1875 0.6875 +v -0.4375 1.3125 0.6875 +vt 0.375 0.75 +vt 0.4375 0.75 +vt 0.4375 0.375 +vt 0.375 0.375 +vt 0.6875 0.75 vt 0.75 0.75 -vt 0.75 0.875 -vt 0.625 0.875 -vt 0.625 0.75 +vt 0.75 0.375 +vt 0.6875 0.375 vt 0.75 0.75 -vt 0.625 0.875 -vt 0.75 0.875 +vt 0.375 0.75 +vt 0.375 0.6875 +vt 0.75 0.6875 +vt 0.75 0.4375 +vt 0.375 0.4375 +vt 0.375 0.375 +vt 0.75 0.375 +vt 0.375 0.75 vt 0.75 0.75 -vt 0.625 0.75 -vt 0.625 0.875 -vt 0.75 0.875 +vt 0.75 0.375 +vt 0.375 0.375 +vt 0.75 0.6875 +vt 0.8125 0.6875 +vt 0.8125 0.375 +vt 0.75 0.375 +vt 0.75 0.6875 +vt 0.8125 0.6875 +vt 0.8125 0.375 +vt 0.75 0.375 +vt 0.75 0.375 +vt 0.75 0.6875 +vt 0.8125 0.6875 +vt 0.8125 0.375 +vt 0.75 0.375 +vt 0.75 0.6875 +vt 0.8125 0.6875 +vt 0.8125 0.375 +vt 0.375 0.75 +vt 0.4375 0.75 +vt 0.4375 0.375 +vt 0.375 0.375 +vt 0.6875 0.75 vt 0.75 0.75 -vt 0.625 0.75 -vt 0.75 0.9375 -vt 0.625 0.9375 +vt 0.75 0.375 +vt 0.6875 0.375 +vt 0.75 0.75 +vt 0.375 0.75 +vt 0.375 0.6875 +vt 0.75 0.6875 +vt 0.75 0.4375 +vt 0.375 0.4375 +vt 0.375 0.375 +vt 0.75 0.375 +vt 0.75 0.75 +vt 0.375 0.75 +vt 0.375 0.375 +vt 0.75 0.375 +vt 0.75 0.9375 +vt 0.625 0.9375 +vt 0.625 0.875 +vt 0.75 0.875 +vt 0.75 0.8125 +vt 0.75 0.9375 +vt 0.625 0.9375 +vt 0.625 0.8125 +vt 0.625 1 +vt 0.75 1 +vt 0.75 0.875 +vt 0.625 0.875 +vt 0.8125 0.9375 +vt 0.6875 0.9375 +vt 0.6875 0.8125 +vt 0.8125 0.8125 +vt 0.75 0.875 +vt 0.625 0.875 +vt 0.625 0.75 +vt 0.75 0.75 +vt 0.75 0.875 +vt 0.625 0.875 +vt 0.625 0.75 +vt 0.75 0.75 +vt 0.625 0.875 +vt 0.75 0.875 +vt 0.75 0.75 +vt 0.625 0.75 +vt 0.625 0.875 +vt 0.75 0.875 +vt 0.75 0.75 +vt 0.625 0.75 +vt 0.75 0.9375 +vt 0.625 0.9375 vt 0.625 0.875 vt 0.75 0.875 vt 0.75 0.8125 @@ -9195,70 +5238,70 @@ vt 0.4375 0.375 vt 0.8125 0.375 vt 0.8125 0 vt 0.4375 0 -vt 0.09375 0.875 -vt 0.15625 0.875 -vt 0.15625 0.9375 -vt 0.09375 0.9375 -vt 0.1875 0.8125 -vt 0.1875 0.875 -vt 0.25 0.875 -vt 0.25 0.8125 -vt 0.21875 0.90625 -vt 0.21875 0.84375 -vt 0.28125 0.84375 -vt 0.28125 0.90625 -vt 0 0.90625 -vt 0.0625 0.90625 -vt 0.0625 0.9375 -vt 0 0.9375 -vt 0 0.90625 -vt 0 1 -vt 0.0625 1 -vt 0.0625 0.90625 -vt 0 0.90625 -vt 0 1 -vt 0.0625 1 -vt 0.0625 0.90625 -vt 0.0625 0.90625 -vt 0.0625 1 -vt 0 1 -vt 0 0.90625 -vt 0.0625 0.90625 -vt 0.0625 1 -vt 0 1 -vt 0 0.90625 -vt 0.09375 0.875 -vt 0.15625 0.875 -vt 0.15625 0.9375 -vt 0.09375 0.9375 -vt 0.1875 0.8125 -vt 0.1875 0.875 -vt 0.25 0.875 -vt 0.25 0.8125 -vt 0.21875 0.90625 -vt 0.21875 0.84375 -vt 0.28125 0.84375 -vt 0.28125 0.90625 -vt 0 0.90625 -vt 0.0625 0.90625 -vt 0.0625 0.9375 -vt 0 0.9375 -vt 0 0.84375 -vt 0 1 -vt 0.0625 1 -vt 0.0625 0.84375 -vt 0 0.84375 -vt 0 1 -vt 0.0625 1 -vt 0.0625 0.84375 -vt 0.0625 0.84375 -vt 0.0625 1 -vt 0 1 -vt 0 0.84375 -vt 0.0625 0.84375 -vt 0.0625 1 -vt 0 1 -vt 0 0.84375 +vt 0.5469 0.4375 +vt 0.5781 0.4375 +vt 0.5781 0.4688 +vt 0.5469 0.4688 +vt 0.5938 0.4063 +vt 0.5938 0.4375 +vt 0.625 0.4375 +vt 0.625 0.4063 +vt 0.6094 0.4531 +vt 0.6094 0.4219 +vt 0.6406 0.4219 +vt 0.6406 0.4531 +vt 0.5 0.4531 +vt 0.5313 0.4531 +vt 0.5313 0.4688 +vt 0.5 0.4688 +vt 0.5 0.4531 +vt 0.5 0.5 +vt 0.5313 0.5 +vt 0.5313 0.4531 +vt 0.5 0.4531 +vt 0.5 0.5 +vt 0.5313 0.5 +vt 0.5313 0.4531 +vt 0.5313 0.4531 +vt 0.5313 0.5 +vt 0.5 0.5 +vt 0.5 0.4531 +vt 0.5313 0.4531 +vt 0.5313 0.5 +vt 0.5 0.5 +vt 0.5 0.4531 +vt 0.5469 0.4375 +vt 0.5781 0.4375 +vt 0.5781 0.4688 +vt 0.5469 0.4688 +vt 0.5938 0.4063 +vt 0.5938 0.4375 +vt 0.625 0.4375 +vt 0.625 0.4063 +vt 0.6094 0.4531 +vt 0.6094 0.4219 +vt 0.6406 0.4219 +vt 0.6406 0.4531 +vt 0.5 0.4531 +vt 0.5313 0.4531 +vt 0.5313 0.4688 +vt 0.5 0.4688 +vt 0.5 0.4219 +vt 0.5 0.5 +vt 0.5313 0.5 +vt 0.5313 0.4219 +vt 0.5 0.4219 +vt 0.5 0.5 +vt 0.5313 0.5 +vt 0.5313 0.4219 +vt 0.5313 0.4219 +vt 0.5313 0.5 +vt 0.5 0.5 +vt 0.5 0.4219 +vt 0.5313 0.4219 +vt 0.5313 0.5 +vt 0.5 0.5 +vt 0.5 0.4219 vn -1 0 0 vn 1 0 0 vn 0 1 0 @@ -9274,15 +5317,15 @@ vn 0 1 0 vn 0 -1 0 vn 0 0 1 vn 1 0 0 -vn 0.44721359549995804 0.8944271909999161 0 +vn 0.45 0.89 0 vn 0 0 1 vn 0 0 -1 vn -1 0 0 vn 1 0 0 -vn 0 -0.44721359549995804 0.8944271909999161 -vn 0 0.4472135954999577 -0.8944271909999162 +vn 0 -0.45 0.89 +vn 0 0.45 -0.89 vn 0 0 -1 -vn 0 -0.894427190999916 -0.4472135954999582 +vn 0 -0.89 -0.45 vn -1 0 0 vn 1 0 0 vn -1 0 0 @@ -9294,27 +5337,27 @@ vn 1 0 0 vn 0 0 1 vn 0 0 -1 vn 1 0 0 -vn 0.44721359549995804 0.8944271909999161 0 +vn 0.45 0.89 0 vn 0 0 1 vn 0 0 -1 vn 0 0 1 -vn 0 0.8944271909999161 0.44721359549995804 +vn 0 0.89 0.45 vn 1 0 0 vn -1 0 0 vn 0 0 -1 -vn 0 -0.8944271909999161 -0.44721359549995804 +vn 0 -0.89 -0.45 vn -1 0 0 vn 1 0 0 vn 1 0 0 -vn 0.44721359549995804 0 0.8944271909999161 +vn 0.45 0 0.89 vn 0 1 0 vn 0 -1 0 -vn 0.14142135623730953 0.9899494936611667 0 -vn -0.14142135623730953 -0.9899494936611667 0 +vn 0.14 0.99 0 +vn -0.14 -0.99 0 vn 0 0 1 vn 0 0 -1 vn -1 0 0 -vn -0.447213595499958 0 0.894427190999916 +vn -0.45 0 0.89 vn 0 1 0 vn 0 -1 0 vn 1 0 0 @@ -9326,19 +5369,19 @@ vn 1 0 0 vn 0 0 -1 vn 0 0 1 vn 0 0 1 -vn 0 0.894427190999916 0.447213595499958 +vn 0 0.89 0.45 vn -1 0 0 vn 1 0 0 vn -1 0 0 -vn -0.447213595499958 0.894427190999916 0 +vn -0.45 0.89 0 vn 0 0 1 vn 0 0 -1 vn 0 0 -1 -vn 0 -0.894427190999916 -0.447213595499958 +vn 0 -0.89 -0.45 vn 1 0 0 vn -1 0 0 vn 1 0 0 -vn 0.44721538436060104 0.8944262965673583 0 +vn 0.45 0.89 0 vn 0 0 -1 vn 0 0 1 vn -1 0 0 @@ -9348,7 +5391,7 @@ vn 0 -1 0 vn 0 0 1 vn 0 0 -1 vn -1 0 0 -vn -0.447213595499958 0.894427190999916 0 +vn -0.45 0.89 0 vn 0 0 1 vn 0 0 -1 vn -1 0 0 @@ -9356,7 +5399,7 @@ vn 1 0 0 vn 0 0 -1 vn 0 0 1 vn 0 0 -1 -vn 0 -0.894427190999916 -0.447213595499958 +vn 0 -0.89 -0.45 vn 1 0 0 vn -1 0 0 vn -1 0 0 @@ -9365,10 +5408,10 @@ vn 0 1 0 vn 0 -1 0 vn 0 0 1 vn 0 0 -1 -vn -0.675590428557171 -0.7372771343544692 0 -vn 0.6755922404774425 0.7372754740303447 0 -vn -0.7372777429171942 0.675589764427295 0 -vn 0.7372768300724338 -0.6755907606223931 0 +vn -0.68 -0.74 0 +vn 0.68 0.74 0 +vn -0.74 0.68 0 +vn 0.74 -0.68 0 vn 0 0 1 vn 0 1 0 vn 0 -1 0 @@ -9381,7 +5424,7 @@ vn 1 0 0 vn 0 0 1 vn 0 0 -1 vn 0 0 -1 -vn 0 0.8944271909999161 -0.44721359549995804 +vn 0 0.89 -0.45 vn -1 0 0 vn 1 0 0 vn -1 0 0 @@ -9393,7 +5436,7 @@ vn 1 0 0 vn 0 1 0 vn 0 -1 0 vn 0 0 1 -vn 0 0.8944271909999161 0.44721359549995804 +vn 0 0.89 0.45 vn -1 0 0 vn 1 0 0 vn -1 0 0 @@ -9406,7 +5449,7 @@ vn 0 1 0 vn 0 -1 0 vn 0 0 1 vn 0 0 -1 -vn 0.44721359549995804 0.8944271909999161 0 +vn 0.45 0.89 0 vn 0 0 1 vn 0 0 -1 vn 1 0 0 @@ -9414,7 +5457,7 @@ vn 0 0 -1 vn 0 0 1 vn 0 -1 0 vn 0 1 0 -vn -0.447213595499958 0 0.894427190999916 +vn -0.45 0 0.89 vn 0 1 0 vn 0 -1 0 vn -1 0 0 @@ -9423,1159 +5466,186 @@ vn -1 0 0 vn 0 -1 0 vn 0 1 0 usemtl v4_diesel -f 1410/3845/962 1411/3846/962 1413/3847/962 -f 1410/3845/962 1413/3847/962 1412/3848/962 -f 1415/3849/963 1414/3850/963 1416/3851/963 -f 1415/3849/963 1416/3851/963 1417/3852/963 -f 1415/3853/964 1411/3854/964 1410/3855/964 -f 1415/3853/964 1410/3855/964 1414/3856/964 -f 1416/3857/965 1412/3858/965 1413/3859/965 -f 1416/3857/965 1413/3859/965 1417/3860/965 -f 1411/3861/966 1415/3862/966 1417/3863/966 -f 1411/3861/966 1417/3863/966 1413/3864/966 -f 1418/3865/967 1419/3866/967 1421/3867/967 -f 1418/3865/967 1421/3867/967 1420/3868/967 -f 1423/3869/968 1422/3870/968 1424/3871/968 -f 1423/3869/968 1424/3871/968 1425/3872/968 -f 1423/3873/969 1419/3874/969 1418/3875/969 -f 1423/3873/969 1418/3875/969 1422/3876/969 -f 1424/3877/970 1420/3878/970 1421/3879/970 -f 1424/3877/970 1421/3879/970 1425/3880/970 -f 1426/3881/971 1427/3882/971 1429/3883/971 -f 1426/3881/971 1429/3883/971 1428/3884/971 -f 1431/3885/972 1430/3886/972 1432/3887/972 -f 1431/3885/972 1432/3887/972 1433/3888/972 -f 1431/3889/973 1427/3890/973 1426/3891/973 -f 1431/3889/973 1426/3891/973 1430/3892/973 -f 1432/3893/974 1428/3894/974 1429/3895/974 -f 1432/3893/974 1429/3895/974 1433/3896/974 -f 1430/3897/975 1426/3898/975 1428/3899/975 -f 1430/3897/975 1428/3899/975 1432/3900/975 +f 843/2333/584 844/2334/584 846/2335/584 845/2336/584 +f 848/2337/585 847/2338/585 849/2339/585 850/2340/585 +f 848/2341/586 844/2342/586 843/2343/586 847/2344/586 +f 849/2345/587 845/2346/587 846/2347/587 850/2348/587 +f 844/2349/588 848/2350/588 850/2351/588 846/2352/588 +f 851/2353/589 852/2354/589 854/2355/589 853/2356/589 +f 856/2357/590 855/2358/590 857/2359/590 858/2360/590 +f 856/2361/591 852/2362/591 851/2363/591 855/2364/591 +f 857/2365/592 853/2366/592 854/2367/592 858/2368/592 +f 859/2369/593 860/2370/593 862/2371/593 861/2372/593 +f 864/2373/594 863/2374/594 865/2375/594 866/2376/594 +f 864/2377/595 860/2378/595 859/2379/595 863/2380/595 +f 865/2381/596 861/2382/596 862/2383/596 866/2384/596 +f 863/2385/597 859/2386/597 861/2387/597 865/2388/597 usemtl v4_diesel2 -f 1439/3901/976 1438/3902/976 1440/3903/976 -f 1439/3901/976 1440/3903/976 1441/3904/976 -f 1439/3905/977 1435/3906/977 1434/3907/977 -f 1439/3905/977 1434/3907/977 1438/3908/977 -f 1438/3909/978 1434/3910/978 1436/3911/978 -f 1438/3909/978 1436/3911/978 1440/3912/978 -f 1435/3913/979 1439/3914/979 1441/3915/979 -f 1435/3913/979 1441/3915/979 1437/3916/979 -f 1436/3917/980 1437/3918/980 1443/3919/980 -f 1436/3917/980 1443/3919/980 1442/3920/980 -f 1441/3921/981 1440/3922/981 1444/3923/981 -f 1441/3921/981 1444/3923/981 1445/3924/981 -f 1440/3925/982 1436/3926/982 1442/3927/982 -f 1440/3925/982 1442/3927/982 1444/3928/982 -f 1437/3929/983 1441/3930/983 1445/3931/983 -f 1437/3929/983 1445/3931/983 1443/3932/983 -f 1449/3933/984 1448/3934/984 1443/3935/984 -f 1449/3933/984 1443/3935/984 1445/3936/984 -f 1449/3937/985 1447/3938/985 1446/3939/985 -f 1449/3937/985 1446/3939/985 1448/3940/985 -f 1448/3941/986 1446/3942/986 1442/3943/986 -f 1448/3941/986 1442/3943/986 1443/3944/986 -f 1447/3945/987 1449/3946/987 1445/3947/987 -f 1447/3945/987 1445/3947/987 1444/3948/987 -f 1450/3949/988 1442/3950/988 1446/3951/988 -f 1450/3949/988 1446/3951/988 1451/3952/988 -f 1444/3953/989 1452/3954/989 1453/3955/989 -f 1444/3953/989 1453/3955/989 1447/3956/989 -f 1444/3957/990 1442/3958/990 1450/3959/990 -f 1444/3957/990 1450/3959/990 1452/3960/990 -f 1453/3961/991 1451/3962/991 1446/3963/991 -f 1453/3961/991 1446/3963/991 1447/3964/991 -f 1454/3965/992 1455/3966/992 1456/3967/992 -f 1454/3965/992 1456/3967/992 1450/3968/992 -f 1458/3969/993 1457/3970/993 1452/3971/993 -f 1458/3969/993 1452/3971/993 1459/3972/993 -f 1457/3973/994 1454/3974/994 1450/3975/994 -f 1457/3973/994 1450/3975/994 1452/3976/994 -f 1455/3977/995 1458/3978/995 1459/3979/995 -f 1455/3977/995 1459/3979/995 1456/3980/995 -f 1463/3981/996 1462/3982/996 1457/3983/996 -f 1463/3981/996 1457/3983/996 1458/3984/996 -f 1463/3985/997 1461/3986/997 1460/3987/997 -f 1463/3985/997 1460/3987/997 1462/3988/997 -f 1462/3989/998 1460/3990/998 1454/3991/998 -f 1462/3989/998 1454/3991/998 1457/3992/998 -f 1461/3993/999 1463/3994/999 1458/3995/999 -f 1461/3993/999 1458/3995/999 1455/3996/999 -f 1466/3997/1000 1464/3998/1000 1465/3999/1000 -f 1466/3997/1000 1465/3999/1000 1467/4000/1000 -f 1452/4001/1001 1450/4002/1001 1465/4003/1001 -f 1452/4001/1001 1465/4003/1001 1464/4004/1001 -f 1453/4005/1002 1452/4006/1002 1464/4007/1002 -f 1453/4005/1002 1464/4007/1002 1466/4008/1002 -f 1467/4009/1003 1465/4010/1003 1450/4011/1003 -f 1467/4009/1003 1450/4011/1003 1451/4012/1003 -f 1471/4013/1004 1470/4014/1004 1451/4015/1004 -f 1471/4013/1004 1451/4015/1004 1453/4016/1004 -f 1471/4017/1005 1469/4018/1005 1468/4019/1005 -f 1471/4017/1005 1468/4019/1005 1470/4020/1005 -f 1470/4021/1006 1468/4022/1006 1467/4023/1006 -f 1470/4021/1006 1467/4023/1006 1451/4024/1006 -f 1469/4025/1007 1471/4026/1007 1453/4027/1007 -f 1469/4025/1007 1453/4027/1007 1466/4028/1007 -f 1466/4029/1008 1474/4030/1008 1475/4031/1008 -f 1466/4029/1008 1475/4031/1008 1469/4032/1008 -f 1472/4033/1009 1473/4034/1009 1475/4035/1009 -f 1472/4033/1009 1475/4035/1009 1474/4036/1009 -f 1467/4037/1010 1472/4038/1010 1474/4039/1010 -f 1467/4037/1010 1474/4039/1010 1466/4040/1010 -f 1469/4041/1011 1475/4042/1011 1473/4043/1011 -f 1469/4041/1011 1473/4043/1011 1468/4044/1011 -f 1472/4045/1012 1467/4046/1012 1477/4047/1012 -f 1472/4045/1012 1477/4047/1012 1476/4048/1012 -f 1468/4049/1013 1473/4050/1013 1478/4051/1013 -f 1468/4049/1013 1478/4051/1013 1479/4052/1013 -f 1473/4053/1014 1472/4054/1014 1476/4055/1014 -f 1473/4053/1014 1476/4055/1014 1478/4056/1014 -f 1479/4057/1015 1477/4058/1015 1467/4059/1015 -f 1479/4057/1015 1467/4059/1015 1468/4060/1015 -f 1481/4061/1016 1480/4062/1016 1482/4063/1016 -f 1481/4061/1016 1482/4063/1016 1483/4064/1016 -f 1481/4065/1017 1478/4066/1017 1476/4067/1017 -f 1481/4065/1017 1476/4067/1017 1480/4068/1017 -f 1480/4069/1018 1476/4070/1018 1477/4071/1018 -f 1480/4069/1018 1477/4071/1018 1482/4072/1018 -f 1478/4073/1019 1481/4074/1019 1483/4075/1019 -f 1478/4073/1019 1483/4075/1019 1479/4076/1019 -f 1485/4077/1020 1484/4078/1020 1477/4079/1020 -f 1485/4077/1020 1477/4079/1020 1479/4080/1020 -f 1483/4081/1021 1482/4082/1021 1486/4083/1021 -f 1483/4081/1021 1486/4083/1021 1487/4084/1021 -f 1477/4085/1022 1484/4086/1022 1486/4087/1022 -f 1477/4085/1022 1486/4087/1022 1482/4088/1022 -f 1485/4089/1023 1479/4090/1023 1483/4091/1023 -f 1485/4089/1023 1483/4091/1023 1487/4092/1023 -f 1482/4093/1024 1489/4094/1024 1488/4095/1024 -f 1482/4093/1024 1488/4095/1024 1490/4096/1024 -f 1493/4097/1025 1491/4098/1025 1492/4099/1025 -f 1493/4097/1025 1492/4099/1025 1477/4100/1025 -f 1490/4101/1026 1488/4102/1026 1491/4103/1026 -f 1490/4101/1026 1491/4103/1026 1493/4104/1026 -f 1477/4105/1027 1492/4106/1027 1489/4107/1027 -f 1477/4105/1027 1489/4107/1027 1482/4108/1027 -f 1497/4109/1028 1496/4110/1028 1489/4111/1028 -f 1497/4109/1028 1489/4111/1028 1492/4112/1028 -f 1497/4113/1029 1495/4114/1029 1494/4115/1029 -f 1497/4113/1029 1494/4115/1029 1496/4116/1029 -f 1496/4117/1030 1494/4118/1030 1488/4119/1030 -f 1496/4117/1030 1488/4119/1030 1489/4120/1030 -f 1495/4121/1031 1497/4122/1031 1492/4123/1031 -f 1495/4121/1031 1492/4123/1031 1491/4124/1031 -f 1494/4125/1032 1501/4126/1032 1502/4127/1032 -f 1494/4125/1032 1502/4127/1032 1503/4128/1032 -f 1498/4129/1033 1499/4130/1033 1502/4131/1033 -f 1498/4129/1033 1502/4131/1033 1501/4132/1033 -f 1495/4133/1034 1498/4134/1034 1501/4135/1034 -f 1495/4133/1034 1501/4135/1034 1494/4136/1034 -f 1503/4137/1035 1502/4138/1035 1499/4139/1035 -f 1503/4137/1035 1499/4139/1035 1500/4140/1035 -f 1500/4141/1036 1504/4142/1036 1505/4143/1036 -f 1500/4141/1036 1505/4143/1036 1503/4144/1036 -f 1491/4145/1037 1488/4146/1037 1505/4147/1037 -f 1491/4145/1037 1505/4147/1037 1504/4148/1037 -f 1495/4149/1038 1491/4150/1038 1504/4151/1038 -f 1495/4149/1038 1504/4151/1038 1500/4152/1038 -f 1503/4153/1039 1505/4154/1039 1488/4155/1039 -f 1503/4153/1039 1488/4155/1039 1494/4156/1039 -f 1512/4157/1040 1510/4158/1040 1511/4159/1040 -f 1512/4157/1040 1511/4159/1040 1513/4160/1040 -f 1506/4161/1041 1507/4162/1041 1511/4163/1041 -f 1506/4161/1041 1511/4163/1041 1510/4164/1041 -f 1508/4165/1042 1506/4166/1042 1510/4167/1042 -f 1508/4165/1042 1510/4167/1042 1512/4168/1042 -f 1513/4169/1043 1511/4170/1043 1507/4171/1043 -f 1513/4169/1043 1507/4171/1043 1509/4172/1043 +f 872/2389/598 871/2390/598 873/2391/598 874/2392/598 +f 872/2393/599 868/2394/599 867/2395/599 871/2396/599 +f 871/2397/600 867/2398/600 869/2399/600 873/2400/600 +f 868/2401/601 872/2402/601 874/2403/601 870/2404/601 +f 869/2405/602 870/2406/602 876/2407/602 875/2408/602 +f 874/2409/603 873/2410/603 877/2411/603 878/2412/603 +f 873/2413/604 869/2414/604 875/2415/604 877/2416/604 +f 870/2417/605 874/2418/605 878/2419/605 876/2420/605 +f 882/2421/606 881/2422/606 876/2423/606 878/2424/606 +f 882/2425/607 880/2426/607 879/2427/607 881/2428/607 +f 881/2429/608 879/2430/608 875/2431/608 876/2432/608 +f 880/2433/609 882/2434/609 878/2435/609 877/2436/609 +f 883/2437/610 875/2438/610 879/2439/610 884/2440/610 +f 877/2441/611 885/2442/611 886/2443/611 880/2444/611 +f 877/2445/612 875/2446/612 883/2447/612 885/2448/612 +f 886/2449/613 884/2450/613 879/2451/613 880/2452/613 +f 887/2453/614 888/2454/614 889/2455/614 883/2456/614 +f 891/2457/615 890/2458/615 885/2459/615 892/2460/615 +f 890/2461/616 887/2462/616 883/2463/616 885/2464/616 +f 888/2465/617 891/2466/617 892/2467/617 889/2468/617 +f 896/2469/618 895/2470/618 890/2471/618 891/2472/618 +f 896/2473/619 894/2474/619 893/2475/619 895/2476/619 +f 895/2477/620 893/2478/620 887/2479/620 890/2480/620 +f 894/2481/621 896/2482/621 891/2483/621 888/2484/621 +f 899/2485/622 897/2486/622 898/2487/622 900/2488/622 +f 885/2489/623 883/2490/623 898/2491/623 897/2492/623 +f 886/2493/624 885/2494/624 897/2495/624 899/2496/624 +f 900/2497/625 898/2498/625 883/2499/625 884/2500/625 +f 904/2501/626 903/2502/626 884/2503/626 886/2504/626 +f 904/2505/627 902/2506/627 901/2507/627 903/2508/627 +f 903/2509/628 901/2510/628 900/2511/628 884/2512/628 +f 902/2513/629 904/2514/629 886/2515/629 899/2516/629 +f 899/2517/630 907/2518/630 908/2519/630 902/2520/630 +f 905/2521/631 906/2522/631 908/2523/631 907/2524/631 +f 900/2525/632 905/2526/632 907/2527/632 899/2528/632 +f 902/2529/633 908/2530/633 906/2531/633 901/2532/633 +f 905/2533/634 900/2534/634 910/2535/634 909/2536/634 +f 901/2537/635 906/2538/635 911/2539/635 912/2540/635 +f 906/2541/636 905/2542/636 909/2543/636 911/2544/636 +f 912/2545/637 910/2546/637 900/2547/637 901/2548/637 +f 914/2549/638 913/2550/638 915/2551/638 916/2552/638 +f 914/2553/639 911/2554/639 909/2555/639 913/2556/639 +f 913/2557/640 909/2558/640 910/2559/640 915/2560/640 +f 911/2561/641 914/2562/641 916/2563/641 912/2564/641 +f 918/2565/642 917/2566/642 910/2567/642 912/2568/642 +f 916/2569/643 915/2570/643 919/2571/643 920/2572/643 +f 910/2573/644 917/2574/644 919/2575/644 915/2576/644 +f 918/2577/645 912/2578/645 916/2579/645 920/2580/645 +f 915/2581/646 922/2582/646 921/2583/646 923/2584/646 +f 926/2585/647 924/2586/647 925/2587/647 910/2588/647 +f 923/2589/648 921/2590/648 924/2591/648 926/2592/648 +f 910/2593/649 925/2594/649 922/2595/649 915/2596/649 +f 930/2597/650 929/2598/650 922/2599/650 925/2600/650 +f 930/2601/651 928/2602/651 927/2603/651 929/2604/651 +f 929/2605/652 927/2606/652 921/2607/652 922/2608/652 +f 928/2609/653 930/2610/653 925/2611/653 924/2612/653 +f 927/2613/654 934/2614/654 935/2615/654 936/2616/654 +f 931/2617/655 932/2618/655 935/2619/655 934/2620/655 +f 928/2621/656 931/2622/656 934/2623/656 927/2624/656 +f 936/2625/657 935/2626/657 932/2627/657 933/2628/657 +f 933/2629/658 937/2630/658 938/2631/658 936/2632/658 +f 924/2633/659 921/2634/659 938/2635/659 937/2636/659 +f 928/2637/660 924/2638/660 937/2639/660 933/2640/660 +f 936/2641/661 938/2642/661 921/2643/661 927/2644/661 +f 945/2645/662 943/2646/662 944/2647/662 946/2648/662 +f 939/2649/663 940/2650/663 944/2651/663 943/2652/663 +f 941/2653/664 939/2654/664 943/2655/664 945/2656/664 +f 946/2657/665 944/2658/665 940/2659/665 942/2660/665 usemtl v4_diesel -f 1503/4173/1044 1514/4174/1044 1486/4175/1044 -f 1503/4173/1044 1486/4175/1044 1515/4176/1044 -f 1517/4177/1045 1516/4178/1045 1518/4179/1045 -f 1517/4177/1045 1518/4179/1045 1519/4180/1045 -f 1517/4181/1046 1514/4182/1046 1503/4183/1046 -f 1517/4181/1046 1503/4183/1046 1516/4184/1046 -f 1518/4185/1047 1515/4186/1047 1486/4187/1047 -f 1518/4185/1047 1486/4187/1047 1519/4188/1047 -f 1516/4189/1048 1503/4190/1048 1515/4191/1048 -f 1516/4189/1048 1515/4191/1048 1518/4192/1048 -f 1514/4193/1049 1517/4194/1049 1519/4195/1049 -f 1514/4193/1049 1519/4195/1049 1486/4196/1049 +f 936/2661/666 947/2662/666 919/2663/666 948/2664/666 +f 950/2665/667 949/2666/667 951/2667/667 952/2668/667 +f 950/2669/668 947/2670/668 936/2671/668 949/2672/668 +f 951/2673/669 948/2674/669 919/2675/669 952/2676/669 +f 949/2677/670 936/2678/670 948/2679/670 951/2680/670 +f 947/2681/671 950/2682/671 952/2683/671 919/2684/671 usemtl v4_diesel2 -f 1514/4197/1050 1524/4198/1050 1525/4199/1050 -f 1514/4197/1050 1525/4199/1050 1526/4200/1050 -f 1520/4201/1051 1521/4202/1051 1525/4203/1051 -f 1520/4201/1051 1525/4203/1051 1524/4204/1051 -f 1522/4205/1052 1520/4206/1052 1524/4207/1052 -f 1522/4205/1052 1524/4207/1052 1514/4208/1052 -f 1526/4209/1053 1525/4210/1053 1521/4211/1053 -f 1526/4209/1053 1521/4211/1053 1523/4212/1053 -f 1486/4213/1054 1514/4214/1054 1526/4215/1054 -f 1486/4213/1054 1526/4215/1054 1527/4216/1054 -f 1528/4217/1055 1523/4218/1055 1522/4219/1055 -f 1528/4217/1055 1522/4219/1055 1484/4220/1055 -f 1527/4221/1056 1526/4222/1056 1523/4223/1056 -f 1527/4221/1056 1523/4223/1056 1528/4224/1056 -f 1484/4225/1057 1522/4226/1057 1514/4227/1057 -f 1484/4225/1057 1514/4227/1057 1486/4228/1057 -f 1528/4229/1058 1529/4230/1058 1530/4231/1058 -f 1528/4229/1058 1530/4231/1058 1527/4232/1058 -f 1485/4233/1059 1487/4234/1059 1530/4235/1059 -f 1485/4233/1059 1530/4235/1059 1529/4236/1059 -f 1484/4237/1060 1485/4238/1060 1529/4239/1060 -f 1484/4237/1060 1529/4239/1060 1528/4240/1060 -f 1527/4241/1061 1530/4242/1061 1487/4243/1061 -f 1527/4241/1061 1487/4243/1061 1486/4244/1061 +f 947/2685/672 957/2686/672 958/2687/672 959/2688/672 +f 953/2689/673 954/2690/673 958/2691/673 957/2692/673 +f 955/2693/674 953/2694/674 957/2695/674 947/2696/674 +f 959/2697/675 958/2698/675 954/2699/675 956/2700/675 +f 919/2701/676 947/2702/676 959/2703/676 960/2704/676 +f 961/2705/677 956/2706/677 955/2707/677 917/2708/677 +f 960/2709/678 959/2710/678 956/2711/678 961/2712/678 +f 917/2713/679 955/2714/679 947/2715/679 919/2716/679 +f 961/2717/680 962/2718/680 963/2719/680 960/2720/680 +f 918/2721/681 920/2722/681 963/2723/681 962/2724/681 +f 917/2725/682 918/2726/682 962/2727/682 961/2728/682 +f 960/2729/683 963/2730/683 920/2731/683 919/2732/683 usemtl engine_4 -f 1531/4245/1062 1532/4246/1062 1534/4247/1062 -f 1531/4245/1062 1534/4247/1062 1533/4248/1062 -f 1536/4249/1063 1535/4250/1063 1537/4251/1063 -f 1536/4249/1063 1537/4251/1063 1538/4252/1063 -f 1536/4253/1064 1532/4254/1064 1531/4255/1064 -f 1536/4253/1064 1531/4255/1064 1535/4256/1064 -f 1537/4257/1065 1533/4258/1065 1534/4259/1065 -f 1537/4257/1065 1534/4259/1065 1538/4260/1065 -f 1535/4261/1066 1531/4262/1066 1533/4263/1066 -f 1535/4261/1066 1533/4263/1066 1537/4264/1066 -f 1532/4265/1067 1536/4266/1067 1538/4267/1067 -f 1532/4265/1067 1538/4267/1067 1534/4268/1067 -usemtl v4_diesel -f 1539/4269/1068 1540/4270/1068 1542/4271/1068 -f 1539/4269/1068 1542/4271/1068 1541/4272/1068 -f 1544/4273/1069 1543/4274/1069 1545/4275/1069 -f 1544/4273/1069 1545/4275/1069 1546/4276/1069 -f 1544/4277/1070 1540/4278/1070 1539/4279/1070 -f 1544/4277/1070 1539/4279/1070 1543/4280/1070 -f 1545/4281/1071 1541/4282/1071 1542/4283/1071 -f 1545/4281/1071 1542/4283/1071 1546/4284/1071 -f 1543/4285/1072 1539/4286/1072 1541/4287/1072 -f 1543/4285/1072 1541/4287/1072 1545/4288/1072 -f 1547/4289/1073 1548/4290/1073 1550/4291/1073 -f 1547/4289/1073 1550/4291/1073 1549/4292/1073 -f 1552/4293/1074 1551/4294/1074 1553/4295/1074 -f 1552/4293/1074 1553/4295/1074 1554/4296/1074 -f 1552/4297/1075 1548/4298/1075 1547/4299/1075 -f 1552/4297/1075 1547/4299/1075 1551/4300/1075 -f 1553/4301/1076 1549/4302/1076 1550/4303/1076 -f 1553/4301/1076 1550/4303/1076 1554/4304/1076 -f 1551/4305/1077 1547/4306/1077 1549/4307/1077 -f 1551/4305/1077 1549/4307/1077 1553/4308/1077 -f 1548/4309/1078 1552/4310/1078 1554/4311/1078 -f 1548/4309/1078 1554/4311/1078 1550/4312/1078 -usemtl v4_diesel2 -f 1555/4313/1079 1556/4314/1079 1558/4315/1079 -f 1555/4313/1079 1558/4315/1079 1557/4316/1079 -f 1560/4317/1080 1559/4318/1080 1561/4319/1080 -f 1560/4317/1080 1561/4319/1080 1562/4320/1080 -f 1559/4321/1081 1555/4322/1081 1557/4323/1081 -f 1559/4321/1081 1557/4323/1081 1561/4324/1081 -f 1556/4325/1082 1560/4326/1082 1562/4327/1082 -f 1556/4325/1082 1562/4327/1082 1558/4328/1082 -f 1567/4329/1083 1565/4330/1083 1566/4331/1083 -f 1567/4329/1083 1566/4331/1083 1568/4332/1083 -f 1558/4333/1084 1562/4334/1084 1566/4335/1084 -f 1558/4333/1084 1566/4335/1084 1565/4336/1084 -f 1563/4337/1085 1558/4338/1085 1565/4339/1085 -f 1563/4337/1085 1565/4339/1085 1567/4340/1085 -f 1568/4341/1086 1566/4342/1086 1562/4343/1086 -f 1568/4341/1086 1562/4343/1086 1564/4344/1086 -f 1563/4345/1087 1567/4346/1087 1570/4347/1087 -f 1563/4345/1087 1570/4347/1087 1569/4348/1087 -f 1568/4349/1088 1564/4350/1088 1571/4351/1088 -f 1568/4349/1088 1571/4351/1088 1572/4352/1088 -f 1564/4353/1089 1563/4354/1089 1569/4355/1089 -f 1564/4353/1089 1569/4355/1089 1571/4356/1089 -f 1567/4357/1090 1568/4358/1090 1572/4359/1090 -f 1567/4357/1090 1572/4359/1090 1570/4360/1090 -f 1573/4361/1091 1558/4362/1091 1563/4363/1091 -f 1573/4361/1091 1563/4363/1091 1574/4364/1091 -f 1562/4365/1092 1575/4366/1092 1576/4367/1092 -f 1562/4365/1092 1576/4367/1092 1564/4368/1092 -f 1562/4369/1093 1558/4370/1093 1573/4371/1093 -f 1562/4369/1093 1573/4371/1093 1575/4372/1093 -f 1576/4373/1094 1574/4374/1094 1563/4375/1094 -f 1576/4373/1094 1563/4375/1094 1564/4376/1094 -f 1578/4377/1095 1577/4378/1095 1579/4379/1095 -f 1578/4377/1095 1579/4379/1095 1580/4380/1095 -f 1578/4381/1096 1575/4382/1096 1573/4383/1096 -f 1578/4381/1096 1573/4383/1096 1577/4384/1096 -f 1577/4385/1097 1573/4386/1097 1574/4387/1097 -f 1577/4385/1097 1574/4387/1097 1579/4388/1097 -f 1575/4389/1098 1578/4390/1098 1580/4391/1098 -f 1575/4389/1098 1580/4391/1098 1576/4392/1098 -f 1582/4393/1099 1579/4394/1099 1574/4395/1099 -f 1582/4393/1099 1574/4395/1099 1581/4396/1099 -f 1583/4397/1100 1576/4398/1100 1580/4399/1100 -f 1583/4397/1100 1580/4399/1100 1584/4400/1100 -f 1581/4401/1101 1574/4402/1101 1576/4403/1101 -f 1581/4401/1101 1576/4403/1101 1583/4404/1101 -f 1584/4405/1102 1580/4406/1102 1579/4407/1102 -f 1584/4405/1102 1579/4407/1102 1582/4408/1102 -usemtl v4_diesel -f 1585/4409/1103 1410/4410/1103 1412/4411/1103 -f 1585/4409/1103 1412/4411/1103 1586/4412/1103 -f 1414/4413/1104 1587/4414/1104 1588/4415/1104 -f 1414/4413/1104 1588/4415/1104 1416/4416/1104 -f 1414/4417/1105 1410/4418/1105 1585/4419/1105 -f 1414/4417/1105 1585/4419/1105 1587/4420/1105 -f 1588/4421/1106 1586/4422/1106 1412/4423/1106 -f 1588/4421/1106 1412/4423/1106 1416/4424/1106 -f 1587/4425/1107 1585/4426/1107 1586/4427/1107 -f 1587/4425/1107 1586/4427/1107 1588/4428/1107 -f 1410/4429/1108 1414/4430/1108 1416/4431/1108 -f 1410/4429/1108 1416/4431/1108 1412/4432/1108 -usemtl pipe34 -f 1595/4433/1109 1593/4434/1109 1594/4435/1109 -f 1595/4433/1109 1594/4435/1109 1596/4436/1109 -f 1589/4437/1110 1590/4438/1110 1594/4439/1110 -f 1589/4437/1110 1594/4439/1110 1593/4440/1110 -f 1592/4441/1111 1591/4442/1111 1595/4443/1111 -f 1592/4441/1111 1595/4443/1111 1596/4444/1111 -f 1596/4445/1112 1594/4446/1112 1590/4447/1112 -f 1596/4445/1112 1590/4447/1112 1592/4448/1112 -f 1598/4449/1113 1595/4450/1113 1591/4451/1113 -f 1598/4449/1113 1591/4451/1113 1597/4452/1113 -f 1599/4453/1114 1589/4454/1114 1593/4455/1114 -f 1599/4453/1114 1593/4455/1114 1600/4456/1114 -f 1597/4457/1115 1591/4458/1115 1589/4459/1115 -f 1597/4457/1115 1589/4459/1115 1599/4460/1115 -f 1600/4461/1116 1593/4462/1116 1595/4463/1116 -f 1600/4461/1116 1595/4463/1116 1598/4464/1116 -f 1599/4465/1117 1600/4466/1117 1603/4467/1117 -f 1599/4465/1117 1603/4467/1117 1604/4468/1117 -f 1598/4469/1118 1601/4470/1118 1603/4471/1118 -f 1598/4469/1118 1603/4471/1118 1600/4472/1118 -f 1602/4473/1119 1597/4474/1119 1599/4475/1119 -f 1602/4473/1119 1599/4475/1119 1604/4476/1119 -f 1604/4477/1120 1603/4478/1120 1601/4479/1120 -f 1604/4477/1120 1601/4479/1120 1602/4480/1120 -f 1606/4481/1121 1598/4482/1121 1597/4483/1121 -f 1606/4481/1121 1597/4483/1121 1605/4484/1121 -f 1607/4485/1122 1602/4486/1122 1601/4487/1122 -f 1607/4485/1122 1601/4487/1122 1608/4488/1122 -f 1605/4489/1123 1597/4490/1123 1602/4491/1123 -f 1605/4489/1123 1602/4491/1123 1607/4492/1123 -f 1608/4493/1124 1601/4494/1124 1598/4495/1124 -f 1608/4493/1124 1598/4495/1124 1606/4496/1124 -o filter -v -0.15625 0.7607163951896871 1.4842426215122069 -v -0.15625 0.8855450870340088 1.477700626981839 -v -0.15625 0.7541744006593191 1.359413929667885 -v -0.15625 0.8790030925036408 1.3528719351375171 -v -0.03125 0.757445397924503 1.421828275590046 -v -0.03125 0.8822740897688248 1.415286281059678 -v -0.03125 0.7541744006593191 1.359413929667885 -v -0.03125 0.8790030925036408 1.3528719351375171 -v -0.375 1.199252315277405 1.4925528136169992 -v -0.375 1.1894393234818532 1.3053097758505166 -v -0.36875 0.9492678318622433 1.4993953680855192 -v -0.36875 0.9401090395197281 1.3246351995034686 -v -0.1875 1.199252315277405 1.4925528136169992 -v -0.1875 1.1894393234818532 1.3053097758505166 -v -0.19375 0.9492678318622433 1.4993953680855192 -v -0.19375 0.9401090395197281 1.3246351995034686 -v -0.34375 0.9414174384258017 1.349600937872333 -v -0.34375 0.9479594329561697 1.4744296297166548 -v -0.34375 0.8790030925036408 1.3528719351375171 -v -0.34375 0.8855450870340088 1.477700626981839 -v -0.21875 0.9414174384258017 1.349600937872333 -v -0.21875 0.9479594329561697 1.4744296297166548 -v -0.21875 0.8790030925036408 1.3528719351375171 -v -0.21875 0.8855450870340088 1.477700626981839 -v -0.28125 0.7607163951896871 1.4842426215122069 -v -0.28125 0.7541744006593191 1.359413929667885 -v -0.21875 0.7607163951896871 1.4842426215122069 -v -0.21875 0.7541744006593191 1.359413929667885 -v -0.03125 0.7476324061289511 1.2345852378235633 -v -0.15625 0.7476324061289511 1.2345852378235633 -v -0.03125 0.8724610979732729 1.2280432432931954 -v -0.15625 0.8724610979732729 1.2280432432931954 -v -0.38125 1.2058208495961396 1.498467148482697 -v -0.38125 1.1953536583475508 1.298741241531782 -v -0.38125 1.1434065036739787 1.501738145747881 -v -0.38125 1.13293931242539 1.3020122387969661 -v -0.18125 1.2058208495961396 1.498467148482697 -v -0.18125 1.1953536583475508 1.298741241531782 -v -0.18125 1.1434065036739787 1.501738145747881 -v -0.18125 1.13293931242539 1.3020122387969661 -vt 0.75 0.9375 -vt 0.625 0.9375 -vt 0.625 0.875 -vt 0.75 0.875 -vt 0.75 0.8125 -vt 0.75 0.9375 -vt 0.625 0.9375 -vt 0.625 0.8125 -vt 0.625 1 -vt 0.75 1 -vt 0.75 0.875 -vt 0.625 0.875 -vt 0.8125 0.9375 -vt 0.6875 0.9375 -vt 0.6875 0.8125 -vt 0.8125 0.8125 -vt 0.8125 0.5625 -vt 1 0.5625 -vt 1 0.3125 -vt 0.8125 0.3125 -vt 0.8125 0.5625 -vt 1 0.5625 -vt 1 0.3125 -vt 0.8125 0.3125 -vt 0.8125 0.5625 -vt 1 0.5625 -vt 1 0.375 -vt 0.8125 0.375 -vt 0.8125 0.375 -vt 1 0.375 -vt 1 0.1875 -vt 0.8125 0.1875 -vt 0.8125 0.5625 -vt 1 0.5625 -vt 1 0.3125 -vt 0.8125 0.3125 -vt 0.8125 0.5625 -vt 1 0.5625 -vt 1 0.3125 -vt 0.8125 0.3125 -vt 0.625 0.3125 -vt 0.625 0.375 -vt 0.75 0.375 -vt 0.75 0.3125 -vt 0.625 0.3125 -vt 0.625 0.375 -vt 0.75 0.375 -vt 0.75 0.3125 -vt 0.75 0.3125 -vt 0.75 0.375 -vt 0.625 0.375 -vt 0.625 0.3125 -vt 0.75 0.3125 -vt 0.75 0.375 -vt 0.625 0.375 -vt 0.625 0.3125 -vt 0.625 0.875 -vt 0.625 0.9375 -vt 0.75 0.9375 -vt 0.75 0.875 -vt 0.625 0.9375 -vt 0.75 0.9375 -vt 0.75 0.8125 -vt 0.625 0.8125 -vt 0.75 0.875 -vt 0.75 1 -vt 0.625 1 -vt 0.625 0.875 -vt 0.6875 0.8125 -vt 0.6875 0.9375 -vt 0.8125 0.9375 -vt 0.8125 0.8125 -vt 0.625 0.75 -vt 0.625 0.8125 -vt 0.75 0.8125 -vt 0.75 0.75 -vt 0.625 0.75 -vt 0.625 0.8125 -vt 0.75 0.8125 -vt 0.75 0.75 -vt 0.75 0.75 -vt 0.75 0.8125 -vt 0.625 0.8125 -vt 0.625 0.75 -vt 0.75 0.75 -vt 0.75 0.8125 -vt 0.625 0.8125 -vt 0.625 0.75 -vt 0.625 0.375 -vt 0.625 0.5 -vt 0.75 0.5 -vt 0.75 0.375 -vt 0.75 0.375 -vt 0.75 0.5 -vt 0.625 0.5 -vt 0.625 0.375 -vt 0.75 0.375 -vt 0.75 0.5 -vt 0.625 0.5 -vt 0.625 0.375 -vt 0.75 0.375 -vt 0.75 0.5 -vt 0.625 0.5 -vt 0.625 0.375 -vt 0.9375 0.5625 -vt 0.9375 0.75 -vt 1 0.75 -vt 1 0.5625 -vt 0.8125 0.75 -vt 1 0.75 -vt 1 0.6875 -vt 0.8125 0.6875 -vt 0.8125 0.75 -vt 1 0.75 -vt 1 0.5625 -vt 0.8125 0.5625 -vt 0.8125 0.75 -vt 1 0.75 -vt 1 0.6875 -vt 0.8125 0.6875 -vt 0.8125 0.75 -vt 1 0.75 -vt 1 0.6875 -vt 0.8125 0.6875 -vn 1 0 0 -vn 0.4472135954999578 0.04681070233067096 0.8932014096200863 -vn 0 -0.9986295347545738 0.05233595624294405 -vn 0 0.9986295347545738 -0.05233595624294405 -vn -0.9996876464081229 -0.024957940230810886 0.0013079902229756767 -vn 0.9996876464081229 -0.024957940230810997 0.0013079902229756826 -vn 0 0.9986295347545738 -0.05233595624294405 -vn 0 -0.9986295347545738 0.05233595624294405 -vn 0 0.027361668688216257 0.9996255994554144 -vn 0 -0.07727754914983823 -0.9970096190094628 -vn -1 0 0 -vn 1 0 0 -vn 0 -0.05233595624294405 -0.9986295347545738 -vn 0 0.05233595624294405 0.9986295347545738 -vn 0 -0.9986295347545738 0.05233595624294405 -vn -0.8944271909999159 -0.44660070481004327 0.023405351165335483 -vn 0 0.05233595624294405 0.9986295347545738 -vn 0 -0.05233595624294405 -0.9986295347545738 -vn 0 -0.9986295347545738 0.05233595624294405 -vn 0 0.9986295347545738 -0.05233595624294405 -vn 0 -0.05233595624294405 -0.9986295347545738 -vn 0 0.05233595624294405 0.9986295347545738 -vn 0 -0.9986295347545738 0.05233595624294405 -vn 0 0.9986295347545738 -0.05233595624294405 -vn 1 0 0 -vn -1 0 0 -vn -1 0 0 -vn 1 0 0 -vn 0 0.9986295347545738 -0.05233595624294405 -vn 0 0.05233595624294405 0.9986295347545738 -vn 0 -0.05233595624294405 -0.9986295347545738 -usemtl v4_diesel2 -f 1614/4497/1125 1613/4498/1125 1615/4499/1125 -f 1614/4497/1125 1615/4499/1125 1616/4500/1125 -f 1614/4501/1126 1610/4502/1126 1609/4503/1126 -f 1614/4501/1126 1609/4503/1126 1613/4504/1126 -f 1613/4505/1127 1609/4506/1127 1611/4507/1127 -f 1613/4505/1127 1611/4507/1127 1615/4508/1127 -f 1610/4509/1128 1614/4510/1128 1616/4511/1128 -f 1610/4509/1128 1616/4511/1128 1612/4512/1128 +f 964/2733/684 965/2734/684 967/2735/684 966/2736/684 +f 969/2737/685 968/2738/685 970/2739/685 971/2740/685 +f 969/2741/686 965/2742/686 964/2743/686 968/2744/686 +f 970/2745/687 966/2746/687 967/2747/687 971/2748/687 +f 968/2749/688 964/2750/688 966/2751/688 970/2752/688 +f 965/2753/689 969/2754/689 971/2755/689 967/2756/689 usemtl v4_diesel -f 1617/4513/1129 1618/4514/1129 1620/4515/1129 -f 1617/4513/1129 1620/4515/1129 1619/4516/1129 -f 1622/4517/1130 1621/4518/1130 1623/4519/1130 -f 1622/4517/1130 1623/4519/1130 1624/4520/1130 -f 1622/4521/1131 1618/4522/1131 1617/4523/1131 -f 1622/4521/1131 1617/4523/1131 1621/4524/1131 -f 1623/4525/1132 1619/4526/1132 1620/4527/1132 -f 1623/4525/1132 1620/4527/1132 1624/4528/1132 -f 1621/4529/1133 1617/4530/1133 1619/4531/1133 -f 1621/4529/1133 1619/4531/1133 1623/4532/1133 -f 1618/4533/1134 1622/4534/1134 1624/4535/1134 -f 1618/4533/1134 1624/4535/1134 1620/4536/1134 +f 972/2757/690 973/2758/690 975/2759/690 974/2760/690 +f 977/2761/691 976/2762/691 978/2763/691 979/2764/691 +f 977/2765/692 973/2766/692 972/2767/692 976/2768/692 +f 978/2769/693 974/2770/693 975/2771/693 979/2772/693 +f 976/2773/694 972/2774/694 974/2775/694 978/2776/694 +f 980/2777/695 981/2778/695 983/2779/695 982/2780/695 +f 985/2781/696 984/2782/696 986/2783/696 987/2784/696 +f 985/2785/697 981/2786/697 980/2787/697 984/2788/697 +f 986/2789/698 982/2790/698 983/2791/698 987/2792/698 +f 984/2793/699 980/2794/699 982/2795/699 986/2796/699 +f 981/2797/700 985/2798/700 987/2799/700 983/2800/700 usemtl v4_diesel2 -f 1628/4537/1135 1626/4538/1135 1625/4539/1135 -f 1628/4537/1135 1625/4539/1135 1627/4540/1135 -f 1631/4541/1136 1629/4542/1136 1630/4543/1136 -f 1631/4541/1136 1630/4543/1136 1632/4544/1136 -f 1627/4545/1137 1625/4546/1137 1629/4547/1137 -f 1627/4545/1137 1629/4547/1137 1631/4548/1137 -f 1632/4549/1138 1630/4550/1138 1626/4551/1138 -f 1632/4549/1138 1626/4551/1138 1628/4552/1138 -f 1635/4553/1139 1633/4554/1139 1634/4555/1139 -f 1635/4553/1139 1634/4555/1139 1636/4556/1139 -f 1628/4557/1140 1627/4558/1140 1634/4559/1140 -f 1628/4557/1140 1634/4559/1140 1633/4560/1140 -f 1632/4561/1141 1628/4562/1141 1633/4563/1141 -f 1632/4561/1141 1633/4563/1141 1635/4564/1141 -f 1636/4565/1142 1634/4566/1142 1627/4567/1142 -f 1636/4565/1142 1627/4567/1142 1631/4568/1142 -f 1609/4569/1143 1635/4570/1143 1636/4571/1143 -f 1609/4569/1143 1636/4571/1143 1611/4572/1143 -f 1612/4573/1144 1631/4574/1144 1632/4575/1144 -f 1612/4573/1144 1632/4575/1144 1610/4576/1144 -f 1611/4577/1145 1636/4578/1145 1631/4579/1145 -f 1611/4577/1145 1631/4579/1145 1612/4580/1145 -f 1610/4581/1146 1632/4582/1146 1635/4583/1146 -f 1610/4581/1146 1635/4583/1146 1609/4584/1146 -f 1611/4585/1147 1638/4586/1147 1637/4587/1147 -f 1611/4585/1147 1637/4587/1147 1615/4588/1147 -f 1616/4589/1148 1639/4590/1148 1640/4591/1148 -f 1616/4589/1148 1640/4591/1148 1612/4592/1148 -f 1615/4593/1149 1637/4594/1149 1639/4595/1149 -f 1615/4593/1149 1639/4595/1149 1616/4596/1149 -f 1612/4597/1150 1640/4598/1150 1638/4599/1150 -f 1612/4597/1150 1638/4599/1150 1611/4600/1150 +f 988/2801/701 989/2802/701 991/2803/701 990/2804/701 +f 993/2805/702 992/2806/702 994/2807/702 995/2808/702 +f 992/2809/703 988/2810/703 990/2811/703 994/2812/703 +f 989/2813/704 993/2814/704 995/2815/704 991/2816/704 +f 1000/2817/705 998/2818/705 999/2819/705 1001/2820/705 +f 991/2821/706 995/2822/706 999/2823/706 998/2824/706 +f 996/2825/707 991/2826/707 998/2827/707 1000/2828/707 +f 1001/2829/708 999/2830/708 995/2831/708 997/2832/708 +f 996/2833/709 1000/2834/709 1003/2835/709 1002/2836/709 +f 1001/2837/710 997/2838/710 1004/2839/710 1005/2840/710 +f 997/2841/711 996/2842/711 1002/2843/711 1004/2844/711 +f 1000/2845/712 1001/2846/712 1005/2847/712 1003/2848/712 +f 1006/2849/713 991/2850/713 996/2851/713 1007/2852/713 +f 995/2853/714 1008/2854/714 1009/2855/714 997/2856/714 +f 995/2857/715 991/2858/715 1006/2859/715 1008/2860/715 +f 1009/2861/716 1007/2862/716 996/2863/716 997/2864/716 +f 1011/2865/717 1010/2866/717 1012/2867/717 1013/2868/717 +f 1011/2869/718 1008/2870/718 1006/2871/718 1010/2872/718 +f 1010/2873/719 1006/2874/719 1007/2875/719 1012/2876/719 +f 1008/2877/720 1011/2878/720 1013/2879/720 1009/2880/720 +f 1015/2881/721 1012/2882/721 1007/2883/721 1014/2884/721 +f 1016/2885/722 1009/2886/722 1013/2887/722 1017/2888/722 +f 1014/2889/723 1007/2890/723 1009/2891/723 1016/2892/723 +f 1017/2893/724 1013/2894/724 1012/2895/724 1015/2896/724 usemtl v4_diesel -f 1641/4601/1151 1642/4602/1151 1644/4603/1151 -f 1641/4601/1151 1644/4603/1151 1643/4604/1151 -f 1646/4605/1152 1645/4606/1152 1647/4607/1152 -f 1646/4605/1152 1647/4607/1152 1648/4608/1152 -f 1646/4609/1153 1642/4610/1153 1641/4611/1153 -f 1646/4609/1153 1641/4611/1153 1645/4612/1153 -f 1645/4613/1154 1641/4614/1154 1643/4615/1154 -f 1645/4613/1154 1643/4615/1154 1647/4616/1154 -f 1642/4617/1155 1646/4618/1155 1648/4619/1155 -f 1642/4617/1155 1648/4619/1155 1644/4620/1155 -o engine_cylinder1 -v 0.025159513225688906 1.0763756776466749 1.049965625 -v 0.025159513225688906 1.0763756776466749 1.299965625 -v -0.10690869356827964 0.7931544941977217 1.049965625 -v -0.10690869356827964 0.7931544941977215 1.299965625 -v 0.2517364599848514 0.9707211122114999 1.049965625 -v 0.2517364599848514 0.9707211122114999 1.299965625 -v 0.11966825319088283 0.6874999287625467 1.049965625 -v 0.11966825319088283 0.6874999287625467 1.299965625 -v 0.07989527292937794 1.1198130936570685 1.081215625 -v 0.07989527292937794 1.1198130936570685 1.268715625 -v 0.05348163157058422 1.063168856967278 1.081215625 -v 0.05348163157058422 1.063168856967278 1.268715625 -v 0.2498279829987498 1.0405721695806873 1.081215625 -v 0.2498279829987498 1.0405721695806873 1.268715625 -v 0.22341434163995608 0.9839279328908968 1.081215625 -v 0.22341434163995608 0.9839279328908968 1.268715625 -v 0.07798679594327634 1.189664151026256 1.049965625 -v 0.07798679594327634 1.189664151026256 1.299965625 -v 0.051573154584482625 1.1330199143364654 1.049965625 -v 0.051573154584482625 1.1330199143364654 1.299965625 -v 0.3045637427024388 1.0840095855910812 1.049965625 -v 0.3045637427024388 1.0840095855910812 1.299965625 -v 0.2781501013436451 1.0273653489012906 1.049965625 -v 0.2781501013436451 1.0273653489012906 1.299965625 -v -0.15015967096283528 1.0763756377833427 0.768715625 -v -0.15015967096283528 1.0763756377833427 1.018715625 -v -0.01809164121754689 0.7931544023112781 0.768715625 -v -0.01809164121754689 0.793154402311278 1.018715625 -v -0.37673665170657894 0.9707209345828823 0.768715625 -v -0.37673665170657894 0.9707209345828823 1.018715625 -v -0.24466862196129058 0.6874996991108179 0.768715625 -v -0.24466862196129058 0.6874996991108178 1.018715625 -v -0.20489567222942096 1.1198127948650893 0.799965625 -v -0.20489567222942096 1.1198127948650893 0.987465625 -v -0.1784823456845927 1.0631685401367683 0.799965625 -v -0.1784823456845927 1.0631685401367683 0.987465625 -v -0.37482870055079703 1.0405722487882378 0.799965625 -v -0.37482870055079703 1.0405722487882376 0.987465625 -v -0.34841480756360194 0.9839277299235033 0.799965625 -v -0.34841480756360194 0.9839277299235033 0.987465625 -v -0.2029871546312721 1.189663844934031 0.768715625 -v -0.2029871546312721 1.1896638449340309 1.018715625 -v -0.17657382808644395 1.13301959020571 0.768715625 -v -0.17657382808644395 1.13301959020571 1.018715625 -v -0.42956413537501587 1.0840091417335709 0.768715625 -v -0.42956413537501587 1.0840091417335709 1.018715625 -v -0.40315054469377404 1.0273654534476169 0.768715625 -v -0.40315054469377404 1.0273654534476169 1.018715625 -vt 0.3125 0.4375 -vt 0.3125 0.75 -vt 0.5625 0.75 -vt 0.5625 0.4375 -vt 0.3125 0.4375 -vt 0.3125 0.75 -vt 0.5625 0.75 -vt 0.5625 0.4375 -vt 0.5625 1 -vt 0.5625 0.75 -vt 0.3125 0.75 -vt 0.3125 1 -vt 0.3125 1 -vt 0.3125 0.75 -vt 0.5625 0.75 -vt 0.5625 1 -vt 0.5625 0.4375 -vt 0.5625 0.75 -vt 0.3125 0.75 -vt 0.3125 0.4375 -vt 0.5625 0.4375 -vt 0.5625 0.75 -vt 0.3125 0.75 -vt 0.3125 0.4375 -vt 0.25 0.75 -vt 0.25 0.6875 -vt 0.0625 0.6875 -vt 0.0625 0.75 -vt 0.25 0.75 -vt 0.25 0.6875 -vt 0.0625 0.6875 -vt 0.0625 0.75 -vt 0.0625 0.75 -vt 0.0625 0.6875 -vt 0.25 0.6875 -vt 0.25 0.75 -vt 0.0625 0.6875 -vt 0.0625 0.75 -vt 0.25 0.75 -vt 0.25 0.6875 -vt 0.25 0.8125 -vt 0.25 0.75 -vt 0 0.75 -vt 0 0.8125 -vt 0 1 -vt 0.0625 1 -vt 0.0625 0.75 -vt 0 0.75 -vt 0.25 1 -vt 0.25 0.75 -vt 0 0.75 -vt 0 1 -vt 0.25 0.75 -vt 0.25 1 -vt 0 1 -vt 0 0.75 -vt 0.25 1 -vt 0.25 0.9375 -vt 0 0.9375 -vt 0 1 -vt 0 0.8125 -vt 0 0.75 -vt 0.25 0.75 -vt 0.25 0.8125 -vt 0.5625 0.75 -vt 0.3125 0.75 -vt 0.3125 0.4375 -vt 0.5625 0.4375 -vt 0.5625 0.75 -vt 0.3125 0.75 -vt 0.3125 0.4375 -vt 0.5625 0.4375 -vt 0.3125 0.75 -vt 0.5625 0.75 -vt 0.5625 1 -vt 0.3125 1 -vt 0.5625 0.75 -vt 0.3125 0.75 -vt 0.3125 1 -vt 0.5625 1 -vt 0.3125 0.75 -vt 0.5625 0.75 -vt 0.5625 0.4375 -vt 0.3125 0.4375 -vt 0.3125 0.75 -vt 0.5625 0.75 -vt 0.5625 0.4375 -vt 0.3125 0.4375 -vt 0.0625 0.6875 -vt 0.25 0.6875 -vt 0.25 0.75 -vt 0.0625 0.75 -vt 0.0625 0.6875 -vt 0.25 0.6875 -vt 0.25 0.75 -vt 0.0625 0.75 -vt 0.25 0.6875 -vt 0.0625 0.6875 -vt 0.0625 0.75 -vt 0.25 0.75 -vt 0.25 0.75 -vt 0.0625 0.75 -vt 0.0625 0.6875 -vt 0.25 0.6875 -vt 0 0.75 -vt 0.25 0.75 -vt 0.25 0.8125 -vt 0 0.8125 -vt 0.0625 0.75 -vt 0.0625 1 -vt 0 1 -vt 0 0.75 -vt 0 0.75 -vt 0.25 0.75 -vt 0.25 1 -vt 0 1 -vt 0 1 -vt 0.25 1 -vt 0.25 0.75 -vt 0 0.75 -vt 0 0.9375 -vt 0.25 0.9375 -vt 0.25 1 -vt 0 1 -vt 0.25 0.75 -vt 0 0.75 -vt 0 0.8125 -vt 0.25 0.8125 -vn -0.90630778703665 0.42261826174069944 5.175581015019659e-17 -vn 0.90630778703665 -0.42261826174069944 -5.175581015019659e-17 -vn 0.42261826174069944 0.9063077870366499 1.1099069304367545e-16 -vn -0.42261826174069944 -0.9063077870366499 -1.1099069304367545e-16 -vn 0 1.2246467991473532e-16 -1 -vn 0 -1.2246467991473532e-16 1 -vn -0.90630778703665 0.42261826174069944 5.175581015019659e-17 -vn 0.90630778703665 -0.42261826174069944 -5.175581015019659e-17 -vn 0 1.2246467991473532e-16 -1 -vn 0 -1.2246467991473532e-16 1 -vn -0.90630778703665 0.42261826174069944 5.175581015019659e-17 -vn 0.90630778703665 -0.42261826174069944 -5.175581015019659e-17 -vn 0.42261826174069944 0.9063077870366499 1.1099069304367545e-16 -vn -0.42261826174069944 -0.9063077870366499 -1.1099069304367545e-16 -vn 0 1.2246467991473532e-16 -1 -vn 0 -1.2246467991473532e-16 1 -vn 0.9063080337732496 0.422617732611951 5.175574535061379e-17 -vn -0.9063080337732496 -0.42261773261195085 -5.175574535061377e-17 -vn -0.42261866231132417 0.9063076002473924 1.1099067016858882e-16 -vn 0.42261866231132406 -0.9063076002473925 -1.1099067016858883e-16 -vn 0 1.2246467991473532e-16 -1 -vn 0 -1.2246467991473532e-16 1 -vn 0.9063097678709966 0.4226140138017439 5.17552899277121e-17 -vn -0.9063070513423195 -0.4226198394386975 -5.175600336247693e-17 -vn 0 1.2246467991473532e-16 -1 -vn 0 -1.2246467991473532e-16 1 -vn 0.9063097678709966 0.4226140138017433 5.175528992771202e-17 -vn -0.9063065304191132 -0.4226209565552435 -5.175614016979716e-17 -vn -0.4226186623113238 0.9063076002473925 1.1099067016858883e-16 -vn 0.4226172059010351 -0.9063082793820227 -1.1099075333859393e-16 -vn 0 1.2246467991473532e-16 -1 -vn 0 -1.2246467991473532e-16 1 -usemtl engine_4 -f 1652/4621/1156 1650/4622/1156 1649/4623/1156 -f 1652/4621/1156 1649/4623/1156 1651/4624/1156 -f 1655/4625/1157 1653/4626/1157 1654/4627/1157 -f 1655/4625/1157 1654/4627/1157 1656/4628/1157 -f 1649/4629/1158 1650/4630/1158 1654/4631/1158 -f 1649/4629/1158 1654/4631/1158 1653/4632/1158 -f 1652/4633/1159 1651/4634/1159 1655/4635/1159 -f 1652/4633/1159 1655/4635/1159 1656/4636/1159 -f 1651/4637/1160 1649/4638/1160 1653/4639/1160 -f 1651/4637/1160 1653/4639/1160 1655/4640/1160 -f 1656/4641/1161 1654/4642/1161 1650/4643/1161 -f 1656/4641/1161 1650/4643/1161 1652/4644/1161 -f 1660/4645/1162 1658/4646/1162 1657/4647/1162 -f 1660/4645/1162 1657/4647/1162 1659/4648/1162 -f 1663/4649/1163 1661/4650/1163 1662/4651/1163 -f 1663/4649/1163 1662/4651/1163 1664/4652/1163 -f 1659/4653/1164 1657/4654/1164 1661/4655/1164 -f 1659/4653/1164 1661/4655/1164 1663/4656/1164 -f 1664/4657/1165 1662/4658/1165 1658/4659/1165 -f 1664/4657/1165 1658/4659/1165 1660/4660/1165 -f 1668/4661/1166 1666/4662/1166 1665/4663/1166 -f 1668/4661/1166 1665/4663/1166 1667/4664/1166 -f 1671/4665/1167 1669/4666/1167 1670/4667/1167 -f 1671/4665/1167 1670/4667/1167 1672/4668/1167 -f 1665/4669/1168 1666/4670/1168 1670/4671/1168 -f 1665/4669/1168 1670/4671/1168 1669/4672/1168 -f 1668/4673/1169 1667/4674/1169 1671/4675/1169 -f 1668/4673/1169 1671/4675/1169 1672/4676/1169 -f 1667/4677/1170 1665/4678/1170 1669/4679/1170 -f 1667/4677/1170 1669/4679/1170 1671/4680/1170 -f 1672/4681/1171 1670/4682/1171 1666/4683/1171 -f 1672/4681/1171 1666/4683/1171 1668/4684/1171 -f 1673/4685/1172 1674/4686/1172 1676/4687/1172 -f 1673/4685/1172 1676/4687/1172 1675/4688/1172 -f 1678/4689/1173 1677/4690/1173 1679/4691/1173 -f 1678/4689/1173 1679/4691/1173 1680/4692/1173 -f 1678/4693/1174 1674/4694/1174 1673/4695/1174 -f 1678/4693/1174 1673/4695/1174 1677/4696/1174 -f 1679/4697/1175 1675/4698/1175 1676/4699/1175 -f 1679/4697/1175 1676/4699/1175 1680/4700/1175 -f 1677/4701/1176 1673/4702/1176 1675/4703/1176 -f 1677/4701/1176 1675/4703/1176 1679/4704/1176 -f 1674/4705/1177 1678/4706/1177 1680/4707/1177 -f 1674/4705/1177 1680/4707/1177 1676/4708/1177 -f 1681/4709/1178 1682/4710/1178 1684/4711/1178 -f 1681/4709/1178 1684/4711/1178 1683/4712/1178 -f 1686/4713/1179 1685/4714/1179 1687/4715/1179 -f 1686/4713/1179 1687/4715/1179 1688/4716/1179 -f 1685/4717/1180 1681/4718/1180 1683/4719/1180 -f 1685/4717/1180 1683/4719/1180 1687/4720/1180 -f 1682/4721/1181 1686/4722/1181 1688/4723/1181 -f 1682/4721/1181 1688/4723/1181 1684/4724/1181 -f 1689/4725/1182 1690/4726/1182 1692/4727/1182 -f 1689/4725/1182 1692/4727/1182 1691/4728/1182 -f 1694/4729/1183 1693/4730/1183 1695/4731/1183 -f 1694/4729/1183 1695/4731/1183 1696/4732/1183 -f 1694/4733/1184 1690/4734/1184 1689/4735/1184 -f 1694/4733/1184 1689/4735/1184 1693/4736/1184 -f 1695/4737/1185 1691/4738/1185 1692/4739/1185 -f 1695/4737/1185 1692/4739/1185 1696/4740/1185 -f 1693/4741/1186 1689/4742/1186 1691/4743/1186 -f 1693/4741/1186 1691/4743/1186 1695/4744/1186 -f 1690/4745/1187 1694/4746/1187 1696/4747/1187 -f 1690/4745/1187 1696/4747/1187 1692/4748/1187 -o engine_cylinder2 -v -0.1501595132256889 1.0763756776466749 1.049965625 -v -0.1501595132256889 1.0763756776466749 1.299965625 -v -0.018091306431720355 0.7931544941977217 1.049965625 -v -0.018091306431720355 0.7931544941977215 1.299965625 -v -0.3767364599848514 0.9707211122114999 1.049965625 -v -0.3767364599848514 0.9707211122114999 1.299965625 -v -0.2446682531908828 0.6874999287625467 1.049965625 -v -0.2446682531908828 0.6874999287625467 1.299965625 -v -0.20489527292937793 1.1198130936570685 1.081215625 -v -0.20489527292937793 1.1198130936570685 1.268715625 -v -0.17848163157058422 1.063168856967278 1.081215625 -v -0.17848163157058422 1.063168856967278 1.268715625 -v -0.3748279829987498 1.0405721695806873 1.081215625 -v -0.3748279829987498 1.0405721695806873 1.268715625 -v -0.3484143416399561 0.9839279328908968 1.081215625 -v -0.3484143416399561 0.9839279328908968 1.268715625 -v -0.20298679594327634 1.189664151026256 1.049965625 -v -0.20298679594327634 1.189664151026256 1.299965625 -v -0.17657315458448264 1.1330199143364654 1.049965625 -v -0.17657315458448264 1.1330199143364654 1.299965625 -v -0.4295637427024388 1.0840095855910812 1.049965625 -v -0.4295637427024388 1.0840095855910812 1.299965625 -v -0.4031501013436451 1.0273653489012906 1.049965625 -v -0.4031501013436451 1.0273653489012906 1.299965625 -v 0.02515967096283528 1.0763756377833427 0.768715625 -v 0.02515967096283528 1.0763756377833427 1.018715625 -v -0.10690835878245311 0.7931544023112781 0.768715625 -v -0.10690835878245311 0.793154402311278 1.018715625 -v 0.25173665170657894 0.9707209345828823 0.768715625 -v 0.25173665170657894 0.9707209345828823 1.018715625 -v 0.11966862196129058 0.6874996991108179 0.768715625 -v 0.11966862196129058 0.6874996991108178 1.018715625 -v 0.07989567222942096 1.1198127948650893 0.799965625 -v 0.07989567222942096 1.1198127948650893 0.987465625 -v 0.0534823456845927 1.0631685401367683 0.799965625 -v 0.0534823456845927 1.0631685401367683 0.987465625 -v 0.24982870055079703 1.0405722487882378 0.799965625 -v 0.24982870055079703 1.0405722487882376 0.987465625 -v 0.22341480756360194 0.9839277299235033 0.799965625 -v 0.22341480756360194 0.9839277299235033 0.987465625 -v 0.0779871546312721 1.189663844934031 0.768715625 -v 0.0779871546312721 1.1896638449340309 1.018715625 -v 0.05157382808644395 1.13301959020571 0.768715625 -v 0.05157382808644395 1.13301959020571 1.018715625 -v 0.30456413537501587 1.0840091417335709 0.768715625 -v 0.30456413537501587 1.0840091417335709 1.018715625 -v 0.27815054469377404 1.0273654534476169 0.768715625 -v 0.27815054469377404 1.0273654534476169 1.018715625 -vt 0.5625 0.75 -vt 0.3125 0.75 -vt 0.3125 0.4375 -vt 0.5625 0.4375 -vt 0.5625 0.75 -vt 0.3125 0.75 -vt 0.3125 0.4375 -vt 0.5625 0.4375 -vt 0.3125 0.75 -vt 0.5625 0.75 -vt 0.5625 1 -vt 0.3125 1 -vt 0.5625 0.75 -vt 0.3125 0.75 -vt 0.3125 1 -vt 0.5625 1 -vt 0.3125 0.75 -vt 0.5625 0.75 -vt 0.5625 0.4375 -vt 0.3125 0.4375 -vt 0.3125 0.75 -vt 0.5625 0.75 -vt 0.5625 0.4375 -vt 0.3125 0.4375 -vt 0.0625 0.6875 -vt 0.25 0.6875 -vt 0.25 0.75 -vt 0.0625 0.75 -vt 0.0625 0.6875 -vt 0.25 0.6875 -vt 0.25 0.75 -vt 0.0625 0.75 -vt 0.25 0.6875 -vt 0.0625 0.6875 -vt 0.0625 0.75 -vt 0.25 0.75 -vt 0.25 0.75 -vt 0.0625 0.75 -vt 0.0625 0.6875 -vt 0.25 0.6875 -vt 0 0.75 -vt 0.25 0.75 -vt 0.25 0.8125 -vt 0 0.8125 -vt 0.0625 0.75 -vt 0.0625 1 -vt 0 1 -vt 0 0.75 -vt 0 0.75 -vt 0.25 0.75 -vt 0.25 1 -vt 0 1 -vt 0 1 -vt 0.25 1 -vt 0.25 0.75 -vt 0 0.75 -vt 0 0.9375 -vt 0.25 0.9375 -vt 0.25 1 -vt 0 1 -vt 0.25 0.75 -vt 0 0.75 -vt 0 0.8125 -vt 0.25 0.8125 -vt 0.3125 0.4375 -vt 0.3125 0.75 -vt 0.5625 0.75 -vt 0.5625 0.4375 -vt 0.3125 0.4375 -vt 0.3125 0.75 -vt 0.5625 0.75 -vt 0.5625 0.4375 -vt 0.5625 1 -vt 0.5625 0.75 -vt 0.3125 0.75 -vt 0.3125 1 -vt 0.3125 1 -vt 0.3125 0.75 -vt 0.5625 0.75 -vt 0.5625 1 -vt 0.5625 0.4375 -vt 0.5625 0.75 -vt 0.3125 0.75 -vt 0.3125 0.4375 -vt 0.5625 0.4375 -vt 0.5625 0.75 -vt 0.3125 0.75 -vt 0.3125 0.4375 -vt 0.25 0.75 -vt 0.25 0.6875 -vt 0.0625 0.6875 -vt 0.0625 0.75 -vt 0.25 0.75 -vt 0.25 0.6875 -vt 0.0625 0.6875 -vt 0.0625 0.75 -vt 0.0625 0.75 -vt 0.0625 0.6875 -vt 0.25 0.6875 -vt 0.25 0.75 -vt 0.0625 0.6875 -vt 0.0625 0.75 -vt 0.25 0.75 -vt 0.25 0.6875 -vt 0.25 0.8125 -vt 0.25 0.75 -vt 0 0.75 -vt 0 0.8125 -vt 0 1 -vt 0.0625 1 -vt 0.0625 0.75 -vt 0 0.75 -vt 0.25 1 -vt 0.25 0.75 -vt 0 0.75 -vt 0 1 -vt 0.25 0.75 -vt 0.25 1 -vt 0 1 -vt 0 0.75 -vt 0.25 1 -vt 0.25 0.9375 -vt 0 0.9375 -vt 0 1 -vt 0 0.8125 -vt 0 0.75 -vt 0.25 0.75 -vt 0.25 0.8125 -vn 0.90630778703665 0.42261826174069944 5.175581015019659e-17 -vn -0.90630778703665 -0.42261826174069944 -5.175581015019659e-17 -vn -0.42261826174069944 0.9063077870366499 1.1099069304367545e-16 -vn 0.42261826174069944 -0.9063077870366499 -1.1099069304367545e-16 -vn 0 1.2246467991473532e-16 -1 -vn 0 -1.2246467991473532e-16 1 -vn 0.90630778703665 0.42261826174069944 5.175581015019659e-17 -vn -0.90630778703665 -0.42261826174069944 -5.175581015019659e-17 -vn 0 1.2246467991473532e-16 -1 -vn 0 -1.2246467991473532e-16 1 -vn 0.90630778703665 0.42261826174069944 5.175581015019659e-17 -vn -0.90630778703665 -0.42261826174069944 -5.175581015019659e-17 -vn -0.42261826174069944 0.9063077870366499 1.1099069304367545e-16 -vn 0.42261826174069944 -0.9063077870366499 -1.1099069304367545e-16 -vn 0 1.2246467991473532e-16 -1 -vn 0 -1.2246467991473532e-16 1 -vn -0.9063080337732496 0.422617732611951 5.175574535061379e-17 -vn 0.9063080337732496 -0.42261773261195085 -5.175574535061377e-17 -vn 0.42261866231132417 0.9063076002473924 1.1099067016858882e-16 -vn -0.42261866231132406 -0.9063076002473925 -1.1099067016858883e-16 -vn 0 1.2246467991473532e-16 -1 -vn 0 -1.2246467991473532e-16 1 -vn -0.9063097678709966 0.4226140138017439 5.17552899277121e-17 -vn 0.9063070513423195 -0.4226198394386975 -5.175600336247693e-17 -vn 0 1.2246467991473532e-16 -1 -vn 0 -1.2246467991473532e-16 1 -vn -0.9063097678709966 0.4226140138017433 5.175528992771202e-17 -vn 0.9063065304191132 -0.4226209565552435 -5.175614016979716e-17 -vn 0.4226186623113238 0.9063076002473925 1.1099067016858883e-16 -vn -0.4226172059010351 -0.9063082793820227 -1.1099075333859393e-16 -vn 0 1.2246467991473532e-16 -1 -vn 0 -1.2246467991473532e-16 1 -usemtl engine_4 -f 1697/4749/1188 1698/4750/1188 1700/4751/1188 -f 1697/4749/1188 1700/4751/1188 1699/4752/1188 -f 1702/4753/1189 1701/4754/1189 1703/4755/1189 -f 1702/4753/1189 1703/4755/1189 1704/4756/1189 -f 1702/4757/1190 1698/4758/1190 1697/4759/1190 -f 1702/4757/1190 1697/4759/1190 1701/4760/1190 -f 1703/4761/1191 1699/4762/1191 1700/4763/1191 -f 1703/4761/1191 1700/4763/1191 1704/4764/1191 -f 1701/4765/1192 1697/4766/1192 1699/4767/1192 -f 1701/4765/1192 1699/4767/1192 1703/4768/1192 -f 1698/4769/1193 1702/4770/1193 1704/4771/1193 -f 1698/4769/1193 1704/4771/1193 1700/4772/1193 -f 1705/4773/1194 1706/4774/1194 1708/4775/1194 -f 1705/4773/1194 1708/4775/1194 1707/4776/1194 -f 1710/4777/1195 1709/4778/1195 1711/4779/1195 -f 1710/4777/1195 1711/4779/1195 1712/4780/1195 -f 1709/4781/1196 1705/4782/1196 1707/4783/1196 -f 1709/4781/1196 1707/4783/1196 1711/4784/1196 -f 1706/4785/1197 1710/4786/1197 1712/4787/1197 -f 1706/4785/1197 1712/4787/1197 1708/4788/1197 -f 1713/4789/1198 1714/4790/1198 1716/4791/1198 -f 1713/4789/1198 1716/4791/1198 1715/4792/1198 -f 1718/4793/1199 1717/4794/1199 1719/4795/1199 -f 1718/4793/1199 1719/4795/1199 1720/4796/1199 -f 1718/4797/1200 1714/4798/1200 1713/4799/1200 -f 1718/4797/1200 1713/4799/1200 1717/4800/1200 -f 1719/4801/1201 1715/4802/1201 1716/4803/1201 -f 1719/4801/1201 1716/4803/1201 1720/4804/1201 -f 1717/4805/1202 1713/4806/1202 1715/4807/1202 -f 1717/4805/1202 1715/4807/1202 1719/4808/1202 -f 1714/4809/1203 1718/4810/1203 1720/4811/1203 -f 1714/4809/1203 1720/4811/1203 1716/4812/1203 -f 1724/4813/1204 1722/4814/1204 1721/4815/1204 -f 1724/4813/1204 1721/4815/1204 1723/4816/1204 -f 1727/4817/1205 1725/4818/1205 1726/4819/1205 -f 1727/4817/1205 1726/4819/1205 1728/4820/1205 -f 1721/4821/1206 1722/4822/1206 1726/4823/1206 -f 1721/4821/1206 1726/4823/1206 1725/4824/1206 -f 1724/4825/1207 1723/4826/1207 1727/4827/1207 -f 1724/4825/1207 1727/4827/1207 1728/4828/1207 -f 1723/4829/1208 1721/4830/1208 1725/4831/1208 -f 1723/4829/1208 1725/4831/1208 1727/4832/1208 -f 1728/4833/1209 1726/4834/1209 1722/4835/1209 -f 1728/4833/1209 1722/4835/1209 1724/4836/1209 -f 1732/4837/1210 1730/4838/1210 1729/4839/1210 -f 1732/4837/1210 1729/4839/1210 1731/4840/1210 -f 1735/4841/1211 1733/4842/1211 1734/4843/1211 -f 1735/4841/1211 1734/4843/1211 1736/4844/1211 -f 1731/4845/1212 1729/4846/1212 1733/4847/1212 -f 1731/4845/1212 1733/4847/1212 1735/4848/1212 -f 1736/4849/1213 1734/4850/1213 1730/4851/1213 -f 1736/4849/1213 1730/4851/1213 1732/4852/1213 -f 1740/4853/1214 1738/4854/1214 1737/4855/1214 -f 1740/4853/1214 1737/4855/1214 1739/4856/1214 -f 1743/4857/1215 1741/4858/1215 1742/4859/1215 -f 1743/4857/1215 1742/4859/1215 1744/4860/1215 -f 1737/4861/1216 1738/4862/1216 1742/4863/1216 -f 1737/4861/1216 1742/4863/1216 1741/4864/1216 -f 1740/4865/1217 1739/4866/1217 1743/4867/1217 -f 1740/4865/1217 1743/4867/1217 1744/4868/1217 -f 1739/4869/1218 1737/4870/1218 1741/4871/1218 -f 1739/4869/1218 1741/4871/1218 1743/4872/1218 -f 1744/4873/1219 1742/4874/1219 1738/4875/1219 -f 1744/4873/1219 1738/4875/1219 1740/4876/1219 +f 1018/2897/725 843/2898/725 845/2899/725 1019/2900/725 +f 847/2901/726 1020/2902/726 1021/2903/726 849/2904/726 +f 847/2905/727 843/2906/727 1018/2907/727 1020/2908/727 +f 1021/2909/728 1019/2910/728 845/2911/728 849/2912/728 +f 1020/2913/729 1018/2914/729 1019/2915/729 1021/2916/729 +f 843/2917/730 847/2918/730 849/2919/730 845/2920/730 +usemtl common_cable_and_pipe +f 1028/2921/731 1026/2922/731 1027/2923/731 1029/2924/731 +f 1022/2925/732 1023/2926/732 1027/2927/732 1026/2928/732 +f 1025/2929/733 1024/2930/733 1028/2931/733 1029/2932/733 +f 1029/2933/734 1027/2934/734 1023/2935/734 1025/2936/734 +f 1031/2937/735 1028/2938/735 1024/2939/735 1030/2940/735 +f 1032/2941/736 1022/2942/736 1026/2943/736 1033/2944/736 +f 1030/2945/737 1024/2946/737 1022/2947/737 1032/2948/737 +f 1033/2949/738 1026/2950/738 1028/2951/738 1031/2952/738 +f 1032/2953/739 1033/2954/739 1036/2955/739 1037/2956/739 +f 1031/2957/740 1034/2958/740 1036/2959/740 1033/2960/740 +f 1035/2961/741 1030/2962/741 1032/2963/741 1037/2964/741 +f 1037/2965/742 1036/2966/742 1034/2967/742 1035/2968/742 +f 1039/2969/743 1031/2970/743 1030/2971/743 1038/2972/743 +f 1040/2973/744 1035/2974/744 1034/2975/744 1041/2976/744 +f 1038/2977/745 1030/2978/745 1035/2979/745 1040/2980/745 +f 1041/2981/746 1034/2982/746 1031/2983/746 1039/2984/746 o pipe v -0.4375 1.5625 0.375 -v -0.5625 1.589181875 0.3683775 -v -0.375 1.4023949999999998 0.384719375 -v -0.5625 1.4023949999999998 0.384719375 +v -0.5625 1.5892 0.3684 +v -0.375 1.4024 0.3847 +v -0.5625 1.4024 0.3847 v -0.4375 1.5625 0.5625 -v -0.5625 1.60552375 0.55516375 -v -0.375 1.418736875 0.571505625 -v -0.5625 1.418736875 0.571505625 +v -0.5625 1.6055 0.5552 +v -0.375 1.4187 0.5715 +v -0.5625 1.4187 0.5715 v -0.5 1.1875 0.375 v -0.5 1.3125 0.375 v -0.5 1.125 0.5625 @@ -10584,437 +5654,4110 @@ v -0.3125 1.1875 0.375 v -0.3125 1.3125 0.375 v -0.3125 1.125 0.5625 v -0.3125 1.3125 0.5625 -v -0.75 1.418736875 0.571505625 -v -0.75 1.60552375 0.55516375 -v -0.75 1.473209375 1.1941275 -v -0.75 1.659995625 1.177785625 -v -0.5625 1.473209375 1.1941275 -v -0.5625 1.659995625 1.177785625 -v -0.75 1.4078425 0.44698125 -v -0.75 1.59462875 0.43064 -v -0.55625 1.65097 1.0029068749999999 -v -0.55625 1.622644375 0.6791437499999999 -v -0.55625 1.451730625 1.0203381249999999 -v -0.55625 1.423405 0.6965749999999999 -v -0.75625 1.65097 1.0029068749999999 -v -0.75625 1.622644375 0.6791437499999999 -v -0.75625 1.451730625 1.0203381249999999 -v -0.75625 1.423405 0.6965749999999999 -v -0.65625 1.622644375 0.6791437499999999 -v -0.65625 1.65097 1.0029068749999999 -v -0.65625 1.451730625 1.0203381249999999 -v -0.65625 1.423405 0.6965749999999999 -v -0.75625 1.55135 1.0116225 -v -0.75625 1.523024375 0.6878593749999999 -v -0.55625 1.523024375 0.6878593749999999 -v -0.55625 1.55135 1.0116225 -v -0.65625 1.636806875 0.8410249999999999 -v -0.75625 1.636806875 0.8410249999999999 -v -0.75625 1.5371875 0.8497406249999999 -v -0.75625 1.437568125 0.8584562499999999 -v -0.65625 1.437568125 0.8584562499999999 -v -0.55625 1.437568125 0.8584562499999999 -v -0.55625 1.5371875 0.8497406249999999 -v -0.55625 1.636806875 0.8410249999999999 -vt 0.28125 0.8125 -vt 0.28125 0.90625 -vt 0.375 0.90625 -vt 0.375 0.8125 -vt 0.375 0.8125 -vt 0.375 0.90625 -vt 0.28125 0.90625 -vt 0.28125 0.8125 -vt 0.09375 0.9375 -vt 0.09375 1 -vt 0 1 -vt 0 0.9375 -vt 0.09375 0.90625 -vt 0.09375 1 -vt 0 1 -vt 0 0.90625 -vt 0.28125 0.8125 -vt 0.28125 0.90625 -vt 0.375 0.90625 -vt 0.375 0.8125 -vt 0.375 0.8125 -vt 0.375 0.90625 -vt 0.28125 0.90625 -vt 0.28125 0.8125 -vt 0.09375 0.9375 -vt 0.09375 1 -vt 0 1 -vt 0 0.9375 -vt 0.09375 0.90625 -vt 0.09375 1 -vt 0 1 -vt 0 0.90625 -vt 0.1875 0.53125 -vt 0.1875 0.84375 -vt 0.09375 0.84375 -vt 0.09375 0.53125 -vt 0.1875 0.53125 -vt 0.1875 0.84375 -vt 0.09375 0.84375 -vt 0.09375 0.53125 -vt 0.1875 0.53125 -vt 0.1875 0.84375 -vt 0.09375 0.84375 -vt 0.09375 0.53125 -vt 0.1875 0.53125 -vt 0.1875 0.84375 -vt 0.09375 0.84375 -vt 0.09375 0.53125 -vt 0.9375 1 -vt 0.84375 1 -vt 0.84375 0.90625 -vt 0.9375 0.90625 -vt 0.28125 0.8125 -vt 0.28125 0.90625 -vt 0.375 0.90625 -vt 0.375 0.8125 -vt 0.375 0.8125 -vt 0.375 0.90625 -vt 0.28125 0.90625 -vt 0.28125 0.8125 -vt 0.09375 0.9375 -vt 0.09375 1 -vt 0 1 -vt 0 0.9375 -vt 0.09375 0.90625 -vt 0.09375 1 -vt 0 1 -vt 0 0.90625 -vt 0.40625 0.5 -vt 0.40625 0.40625 -vt 0.34375 0.40625 -vt 0.34375 0.5 -vt 0.34375 0.5 -vt 0.34375 0.40625 -vt 0.40625 0.40625 -vt 0.40625 0.5 +v -0.75 1.4187 0.5715 +v -0.75 1.6055 0.5552 +v -0.75 1.4732 1.1941 +v -0.75 1.66 1.1778 +v -0.5625 1.4732 1.1941 +v -0.5625 1.66 1.1778 +v -0.75 1.4078 0.447 +v -0.75 1.5946 0.4306 +v -0.5562 1.651 1.0029 +v -0.5562 1.6226 0.6791 +v -0.5562 1.4517 1.0203 +v -0.5562 1.4234 0.6966 +v -0.7562 1.651 1.0029 +v -0.7562 1.6226 0.6791 +v -0.7562 1.4517 1.0203 +v -0.7562 1.4234 0.6966 +v -0.6562 1.6226 0.6791 +v -0.6562 1.651 1.0029 +v -0.6562 1.4517 1.0203 +v -0.6562 1.4234 0.6966 +v -0.7562 1.5514 1.0116 +v -0.7562 1.523 0.6879 +v -0.5562 1.523 0.6879 +v -0.5562 1.5514 1.0116 +v -0.6562 1.6368 0.841 +v -0.7562 1.6368 0.841 +v -0.7562 1.5372 0.8497 +v -0.7562 1.4376 0.8585 +v -0.6562 1.4376 0.8585 +v -0.5562 1.4376 0.8585 +v -0.5562 1.5372 0.8497 +v -0.5562 1.6368 0.841 +vt 0.6406 0.4063 +vt 0.6406 0.4531 +vt 0.6875 0.4531 +vt 0.6875 0.4063 +vt 0.6875 0.4063 +vt 0.6875 0.4531 +vt 0.6406 0.4531 +vt 0.6406 0.4063 +vt 0.5469 0.4688 +vt 0.5469 0.5 +vt 0.5 0.5 +vt 0.5 0.4688 +vt 0.5469 0.4531 +vt 0.5469 0.5 +vt 0.5 0.5 +vt 0.5 0.4531 +vt 0.6406 0.4063 +vt 0.6406 0.4531 +vt 0.6875 0.4531 +vt 0.6875 0.4063 +vt 0.6875 0.4063 +vt 0.6875 0.4531 +vt 0.6406 0.4531 +vt 0.6406 0.4063 +vt 0.5469 0.4688 +vt 0.5469 0.5 +vt 0.5 0.5 +vt 0.5 0.4688 +vt 0.5469 0.4531 +vt 0.5469 0.5 +vt 0.5 0.5 +vt 0.5 0.4531 +vt 0.5938 0.2656 +vt 0.5938 0.4219 +vt 0.5469 0.4219 +vt 0.5469 0.2656 +vt 0.5938 0.2656 +vt 0.5938 0.4219 +vt 0.5469 0.4219 +vt 0.5469 0.2656 +vt 0.5938 0.2656 +vt 0.5938 0.4219 +vt 0.5469 0.4219 +vt 0.5469 0.2656 +vt 0.5938 0.2656 +vt 0.5938 0.4219 +vt 0.5469 0.4219 +vt 0.5469 0.2656 +vt 0.9688 0.5 +vt 0.9219 0.5 +vt 0.9219 0.4531 +vt 0.9688 0.4531 +vt 0.6406 0.4063 +vt 0.6406 0.4531 +vt 0.6875 0.4531 +vt 0.6875 0.4063 +vt 0.6875 0.4063 +vt 0.6875 0.4531 +vt 0.6406 0.4531 +vt 0.6406 0.4063 +vt 0.5469 0.4688 +vt 0.5469 0.5 +vt 0.5 0.5 +vt 0.5 0.4688 +vt 0.5469 0.4531 +vt 0.5469 0.5 +vt 0.5 0.5 +vt 0.5 0.4531 +vt 0.4063 0.5 +vt 0.4063 0.4063 +vt 0.3438 0.4063 +vt 0.3438 0.5 +vt 0.3438 0.5 +vt 0.3438 0.4063 +vt 0.4063 0.4063 +vt 0.4063 0.5 vt 0.5 0.75 -vt 0.5 0.65625 -vt 0.4375 0.65625 +vt 0.5 0.6563 +vt 0.4375 0.6563 vt 0.4375 0.75 -vt 0.34375 0.3125 -vt 0.34375 0.40625 -vt 0.40625 0.40625 -vt 0.40625 0.3125 -vt 0.34375 0.5 -vt 0.34375 0.40625 -vt 0.40625 0.40625 -vt 0.40625 0.5 +vt 0.3438 0.3125 +vt 0.3438 0.4063 +vt 0.4063 0.4063 +vt 0.4063 0.3125 +vt 0.3438 0.5 +vt 0.3438 0.4063 +vt 0.4063 0.4063 +vt 0.4063 0.5 vt 0.5 0.5625 -vt 0.5 0.65625 -vt 0.4375 0.65625 +vt 0.5 0.6563 +vt 0.4375 0.6563 vt 0.4375 0.5625 vt 0.5 0.75 -vt 0.5 0.65625 -vt 0.4375 0.65625 +vt 0.5 0.6563 +vt 0.4375 0.6563 vt 0.4375 0.75 vt 0.4375 0.75 -vt 0.4375 0.65625 -vt 0.5 0.65625 +vt 0.4375 0.6563 +vt 0.5 0.6563 vt 0.5 0.75 vt 0.4375 0.5625 -vt 0.4375 0.65625 -vt 0.5 0.65625 +vt 0.4375 0.6563 +vt 0.5 0.6563 vt 0.5 0.5625 -vt 0.40625 0.3125 -vt 0.40625 0.40625 -vt 0.34375 0.40625 -vt 0.34375 0.3125 +vt 0.4063 0.3125 +vt 0.4063 0.4063 +vt 0.3438 0.4063 +vt 0.3438 0.3125 vt 0.4375 0.5625 -vt 0.4375 0.65625 -vt 0.5 0.65625 +vt 0.4375 0.6563 +vt 0.5 0.6563 vt 0.5 0.5625 -vt 0.40625 0.5 -vt 0.40625 0.40625 -vt 0.34375 0.40625 -vt 0.34375 0.5 +vt 0.4063 0.5 +vt 0.4063 0.4063 +vt 0.3438 0.4063 +vt 0.3438 0.5 vt 0.4375 0.75 -vt 0.4375 0.65625 -vt 0.5 0.65625 +vt 0.4375 0.6563 +vt 0.5 0.6563 vt 0.5 0.75 vt 0.5 0.5625 -vt 0.5 0.65625 -vt 0.4375 0.65625 +vt 0.5 0.6563 +vt 0.4375 0.6563 vt 0.4375 0.5625 -vt 0.34375 0.3125 -vt 0.34375 0.40625 -vt 0.40625 0.40625 -vt 0.40625 0.3125 -vt 0.40625 0.3125 -vt 0.40625 0.40625 -vt 0.34375 0.40625 -vt 0.34375 0.3125 -vt 0.1875 0.71875 -vt 0.1875 0.78125 -vt 0.09375 0.78125 -vt 0.09375 0.71875 -vt 0.1875 0.71875 -vt 0.1875 0.78125 -vt 0.09375 0.78125 -vt 0.09375 0.71875 -vt 0.1875 0.71875 -vt 0.1875 0.78125 -vt 0.09375 0.78125 -vt 0.09375 0.71875 -vt 0.1875 0.71875 -vt 0.1875 0.78125 -vt 0.09375 0.78125 -vt 0.09375 0.71875 -vn 0.03415446483938489 -0.0871056386742915 -0.9956134190752349 -vn -0.043579637793221396 0.04357709266649024 0.9980991194087628 -vn 0.2123073887978959 0.9734842924963198 -0.08516985925055112 -vn 0.9315382045961843 0.3636434701431029 0 -vn -1 0 0 -vn 1 0 0 -vn 0 0 -1 -vn 0 -0.948683298050514 -0.316227766016838 -vn -1 0 0 -vn 1 0 0 -vn 0 -0.9961946780493579 0.08715597183289389 -vn 0 0.9961947648731585 -0.0871549794292487 -vn 0 0.08715677814364653 0.9961946075057923 -vn 0 -0.9961947648731584 0.08715497942924849 -vn -0.0000036111822270999023 0.9961942927533904 -0.08716037558737247 -vn -1 0 0 -vn -0.31622653960097513 -0.0826810771040748 -0.9450738675579297 -vn 1 0 0 -vn -1 0 0 -vn 0 0.9961948446029714 -0.08715406810047276 -vn 0 -0.9961945106624848 0.08715788504738291 -vn 0 0.9961948446029714 -0.08715406810047276 -vn 0 -0.9961945106624848 0.08715788504738291 -vn -1 0 0 -vn 1 0 0 -vn 0 0.9961945398796772 -0.08715755110097043 -vn -1 0 0 -vn -1 0 0 -vn 0 -0.9961948738176148 0.08715373416845973 -vn 0 -0.9961948738176148 0.08715373416845973 -vn 1 0 0 -vn 1 0 0 -vn 0 0.9961945398796772 -0.08715755110097043 -vn 0.8174705944683781 0.5737785421384987 -0.050199718733630584 -vn -0.8593949601058594 -0.5093665895353195 0.04456433562621729 -vn 0 -0.08446635768445766 0.996426331657048 -vn 0 0.10749273791170305 -0.9942058696750115 -usemtl pipe34 -f 1748/4877/1220 1746/4878/1220 1745/4879/1220 -f 1748/4877/1220 1745/4879/1220 1747/4880/1220 -f 1751/4881/1221 1749/4882/1221 1750/4883/1221 -f 1751/4881/1221 1750/4883/1221 1752/4884/1221 -f 1745/4885/1222 1746/4886/1222 1750/4887/1222 -f 1745/4885/1222 1750/4887/1222 1749/4888/1222 -f 1747/4889/1223 1745/4890/1223 1749/4891/1223 -f 1747/4889/1223 1749/4891/1223 1751/4892/1223 -f 1756/4893/1224 1754/4894/1224 1753/4895/1224 -f 1756/4893/1224 1753/4895/1224 1755/4896/1224 -f 1759/4897/1225 1757/4898/1225 1758/4899/1225 -f 1759/4897/1225 1758/4899/1225 1760/4900/1225 -f 1753/4901/1226 1754/4902/1226 1758/4903/1226 -f 1753/4901/1226 1758/4903/1226 1757/4904/1226 -f 1755/4905/1227 1753/4906/1227 1757/4907/1227 -f 1755/4905/1227 1757/4907/1227 1759/4908/1227 -f 1764/4909/1228 1762/4910/1228 1761/4911/1228 -f 1764/4909/1228 1761/4911/1228 1763/4912/1228 -f 1765/4913/1229 1752/4914/1229 1750/4915/1229 -f 1765/4913/1229 1750/4915/1229 1766/4916/1229 -f 1763/4917/1230 1761/4918/1230 1752/4919/1230 -f 1763/4917/1230 1752/4919/1230 1765/4920/1230 -f 1766/4921/1231 1750/4922/1231 1762/4923/1231 -f 1766/4921/1231 1762/4923/1231 1764/4924/1231 -f 1763/4925/1232 1765/4926/1232 1766/4927/1232 -f 1763/4925/1232 1766/4927/1232 1764/4928/1232 -f 1752/4929/1233 1761/4930/1233 1767/4931/1233 -f 1752/4929/1233 1767/4931/1233 1748/4932/1233 -f 1746/4933/1234 1768/4934/1234 1762/4935/1234 -f 1746/4933/1234 1762/4935/1234 1750/4936/1234 -f 1767/4937/1235 1761/4938/1235 1762/4939/1235 -f 1767/4937/1235 1762/4939/1235 1768/4940/1235 -f 1748/4941/1236 1767/4942/1236 1768/4943/1236 -f 1748/4941/1236 1768/4943/1236 1746/4944/1236 +vt 0.3438 0.3125 +vt 0.3438 0.4063 +vt 0.4063 0.4063 +vt 0.4063 0.3125 +vt 0.4063 0.3125 +vt 0.4063 0.4063 +vt 0.3438 0.4063 +vt 0.3438 0.3125 +vt 0.5938 0.3594 +vt 0.5938 0.3906 +vt 0.5469 0.3906 +vt 0.5469 0.3594 +vt 0.5938 0.3594 +vt 0.5938 0.3906 +vt 0.5469 0.3906 +vt 0.5469 0.3594 +vt 0.5938 0.3594 +vt 0.5938 0.3906 +vt 0.5469 0.3906 +vt 0.5469 0.3594 +vt 0.5938 0.3594 +vt 0.5938 0.3906 +vt 0.5469 0.3906 +vt 0.5469 0.3594 +vn 0.03 -0.09 -1 +vn -0.04 0.04 1 +vn 0.21 0.97 -0.09 +vn 0.93 0.36 0 +vn -1 0 0 +vn 1 0 0 +vn 0 0 -1 +vn 0 -0.95 -0.32 +vn -1 0 0 +vn 1 0 0 +vn 0 -1 0.09 +vn 0 1 -0.09 +vn 0 0.09 1 +vn 0 -1 0.09 +vn 0 1 -0.09 +vn -1 0 0 +vn -0.32 -0.08 -0.95 +vn 1 0 0 +vn -1 0 0 +vn 0 1 -0.09 +vn 0 -1 0.09 +vn 0 1 -0.09 +vn 0 -1 0.09 +vn -1 0 0 +vn 1 0 0 +vn 0 1 -0.09 +vn -1 0 0 +vn -1 0 0 +vn 0 -1 0.09 +vn 0 -1 0.09 +vn 1 0 0 +vn 1 0 0 +vn 0 1 -0.09 +vn 0.82 0.57 -0.05 +vn -0.86 -0.51 0.04 +vn 0 -0.08 1 +vn 0 0.11 -0.99 +usemtl common_cable_and_pipe +f 1045/2985/747 1043/2986/747 1042/2987/747 1044/2988/747 +f 1048/2989/748 1046/2990/748 1047/2991/748 1049/2992/748 +f 1042/2993/749 1043/2994/749 1047/2995/749 1046/2996/749 +f 1044/2997/750 1042/2998/750 1046/2999/750 1048/3000/750 +f 1053/3001/751 1051/3002/751 1050/3003/751 1052/3004/751 +f 1056/3005/752 1054/3006/752 1055/3007/752 1057/3008/752 +f 1050/3009/753 1051/3010/753 1055/3011/753 1054/3012/753 +f 1052/3013/754 1050/3014/754 1054/3015/754 1056/3016/754 +f 1061/3017/755 1059/3018/755 1058/3019/755 1060/3020/755 +f 1062/3021/756 1049/3022/756 1047/3023/756 1063/3024/756 +f 1060/3025/757 1058/3026/757 1049/3027/757 1062/3028/757 +f 1063/3029/758 1047/3030/758 1059/3031/758 1061/3032/758 +f 1060/3033/759 1062/3034/759 1063/3035/759 1061/3036/759 +f 1049/3037/760 1058/3038/760 1064/3039/760 1045/3040/760 +f 1043/3041/761 1065/3042/761 1059/3043/761 1047/3044/761 +f 1064/3045/762 1058/3046/762 1059/3047/762 1065/3048/762 +f 1045/3049/763 1064/3050/763 1065/3051/763 1043/3052/763 +usemtl tracked_motorbike +f 1067/3053/764 1089/3054/764 1088/3055/764 1080/3056/764 +f 1079/3057/765 1084/3058/765 1083/3059/765 1071/3060/765 +f 1071/3061/766 1083/3062/766 1082/3063/766 1074/3064/766 +f 1077/3065/767 1086/3066/767 1085/3067/767 1073/3068/767 +f 1074/3069/768 1082/3070/768 1089/3071/768 1067/3072/768 +f 1069/3073/769 1087/3074/769 1086/3075/769 1077/3076/769 +f 1073/3077/770 1085/3078/770 1084/3079/770 1079/3080/770 +f 1080/3081/771 1088/3082/771 1087/3083/771 1069/3084/771 +f 1075/3085/772 1082/3086/772 1083/3087/772 1070/3088/772 +f 1070/3089/773 1083/3090/773 1084/3091/773 1078/3092/773 +f 1078/3093/774 1084/3094/774 1085/3095/774 1072/3096/774 +f 1072/3097/775 1085/3098/775 1086/3099/775 1076/3100/775 +f 1076/3101/776 1086/3102/776 1087/3103/776 1068/3104/776 +f 1068/3105/777 1087/3106/777 1088/3107/777 1081/3108/777 +f 1081/3109/778 1088/3110/778 1089/3111/778 1066/3112/778 +f 1066/3113/779 1089/3114/779 1082/3115/779 1075/3116/779 +usemtl common_cable_and_pipe +f 1055/3117/780 1044/3118/780 1048/3119/780 1057/3120/780 +f 1053/3121/781 1049/3122/781 1045/3123/781 1051/3124/781 +f 1057/3125/782 1048/3126/782 1049/3127/782 1053/3128/782 +f 1051/3129/783 1045/3130/783 1044/3131/783 1055/3132/783 +o hull +v 0.625 1.0625 2.25 +v 0.625 1.0625 1.875 +v 0.625 0.6875 2.25 +v 0.625 0.6875 1.875 +v 0.5625 1.0625 2.25 +v 0.5625 1.0625 1.875 +v 0.5625 0.6875 2.25 +v 0.5625 0.6875 1.875 +v -0.5625 1.0625 2.25 +v -0.5625 1.0625 1.875 +v -0.5625 0.6875 2.25 +v -0.5625 0.6875 1.875 +v -0.625 1.0625 2.25 +v -0.625 1.0625 1.875 +v -0.625 0.6875 2.25 +v -0.625 0.6875 1.875 +v 0.625 1.0625 -0.125 +v 0.625 1.0625 -0.5 +v 0.625 0.6875 -0.125 +v 0.625 0.6875 -0.5 +v 0.5625 1.0625 -0.125 +v 0.5625 1.0625 -0.5 +v 0.5625 0.6875 -0.125 +v 0.5625 0.6875 -0.5 +v 0.5625 0.8688 1.5625 +v 0.5625 0.8688 0.1875 +v 0.5625 1.0563 1.5625 +v 0.5625 1.0563 0.1875 +v 1 0.8688 1.5625 +v 1 0.8688 0.1875 +v 1 1.0563 1.5625 +v 1 1.0563 0.1875 +v 1 0.9938 1.5625 +v 1 0.9938 0.1875 +v 0.5625 0.9938 0.1875 +v 0.5625 0.9938 1.5625 +v 1 0.9938 0.875 +v 1 1.0563 0.875 +v 0.5625 1.0563 0.875 +v 0.5625 0.8688 0.875 +v 1 0.8688 0.875 +v 0.75 0.8688 0.875 +v 0.75 0.8688 1.5625 +v 0.75 0.9938 1.5625 +v 0.75 1.0563 1.5625 +v 0.75 1.0563 0.875 +v 0.75 1.0563 0.1875 +v 0.75 0.9938 0.1875 +v 0.75 0.8688 0.1875 +v 0.5625 1.1188 1.125 +v 0.5625 1.1188 1.1875 +v 0.5625 1.0563 1.125 +v 0.5625 1.0563 1.1875 +v 1 1.1188 1.125 +v 1 1.1188 1.1875 +v 1 1.0563 1.125 +v 1 1.0563 1.1875 +v 0.5625 1.1188 0.5625 +v 0.5625 1.1188 0.625 +v 0.5625 1.0563 0.5625 +v 0.5625 1.0563 0.625 +v 1 1.1188 0.5625 +v 1 1.1188 0.625 +v 1 1.0563 0.5625 +v 1 1.0563 0.625 +v 0.5625 1.4375 1.8125 +v 0.5625 1.4375 0.625 +v 0.5625 1.375 1.8125 +v 0.5625 1.375 0.625 +v 1.0625 1.375 1.8125 +v 1.0625 1.375 0.625 +v 1.0625 1.3125 1.8125 +v 1.0625 1.3125 0.625 +v 0.5625 1.4375 1.25 +v 1.0625 1.375 1.25 +v 1.0625 1.3125 1.25 +v 0.5625 1.375 1.25 +v 0.6875 1.4375 1.25 +v 0.6875 1.4375 1.8125 +v 0.6875 1.375 1.8125 +v 0.6875 1.375 1.25 +v 0.6875 1.375 0.625 +v 0.6875 1.4375 0.625 +v 0.9375 1.5 0.0625 +v 0.9375 1.5 0 +v 1 1.4375 0.0625 +v 1 1.4375 0 +v 0.6875 1.5 0.0625 +v 0.6875 1.5 0 +v 0.625 1.4375 0.0625 +v 0.625 1.4375 0 +v 1 1.375 0.0625 +v 1 1.375 0 +v 0.9375 1.4375 0.0625 +v 0.9375 1.4375 0 +v 0.9375 1.375 0.0625 +v 0.9375 1.375 0 +v 0.6875 1.4375 0.0625 +v 0.6875 1.4375 0 +v 0.6875 1.375 0.0625 +v 0.6875 1.375 0 +v 0.625 1.375 0.0625 +v 0.625 1.375 0 +v 0.9375 1.4813 2.1875 +v 0.9375 1.4813 2.125 +v 1 1.4188 2.1875 +v 1 1.4188 2.125 +v 0.6875 1.4813 2.1875 +v 0.6875 1.4813 2.125 +v 0.625 1.4188 2.1875 +v 0.625 1.4188 2.125 +v 1 1.3563 2.1875 +v 1 1.3563 2.125 +v 0.9375 1.4188 2.1875 +v 0.9375 1.4188 2.125 +v 0.9375 1.3563 2.1875 +v 0.9375 1.3563 2.125 +v 0.6875 1.4188 2.1875 +v 0.6875 1.4188 2.125 +v 0.6875 1.3563 2.1875 +v 0.6875 1.3563 2.125 +v 0.625 1.3563 2.1875 +v 0.625 1.3563 2.125 +v -0.5625 1.0563 1.5625 +v -0.5625 1.0563 0.1875 +v -0.5625 0.8688 1.5625 +v -0.5625 0.8688 0.1875 +v -1 1.0563 1.5625 +v -1 1.0563 0.1875 +v -1 0.8688 1.5625 +v -1 0.8688 0.1875 +v -1 0.9313 1.5625 +v -1 0.9313 0.1875 +v -0.5625 0.9313 0.1875 +v -0.5625 0.9313 1.5625 +v -1 0.9313 0.875 +v -1 0.8688 0.875 +v -0.5625 0.8688 0.875 +v -0.5625 1.0563 0.875 +v -1 1.0563 0.875 +v -0.75 1.0563 0.875 +v -0.75 1.0563 1.5625 +v -0.75 0.9313 1.5625 +v -0.75 0.8688 1.5625 +v -0.75 0.8688 0.875 +v -0.75 0.8688 0.1875 +v -0.75 0.9313 0.1875 +v -0.75 1.0563 0.1875 +v -0.5625 1.1188 0.625 +v -0.5625 1.1188 0.5625 +v -0.5625 1.0563 0.625 +v -0.5625 1.0563 0.5625 +v -1 1.1188 0.625 +v -1 1.1188 0.5625 +v -1 1.0563 0.625 +v -1 1.0563 0.5625 +v -0.5625 1.0625 -0.125 +v -0.5625 1.0625 -0.5 +v -0.5625 0.6875 -0.125 +v -0.5625 0.6875 -0.5 +v -0.625 1.0625 -0.125 +v -0.625 1.0625 -0.5 +v -0.625 0.6875 -0.125 +v -0.625 0.6875 -0.5 +v -0.5625 1.4375 1.8125 +v -0.5625 1.4375 0.625 +v -0.5625 1.375 1.8125 +v -0.5625 1.375 0.625 +v -1.0625 1.375 1.8125 +v -1.0625 1.375 0.625 +v -1.0625 1.3125 1.8125 +v -1.0625 1.3125 0.625 +v -0.5625 1.4375 1.25 +v -1.0625 1.375 1.25 +v -1.0625 1.3125 1.25 +v -0.5625 1.375 1.25 +v -0.6875 1.4375 1.25 +v -0.6875 1.4375 1.8125 +v -0.6875 1.375 1.8125 +v -0.6875 1.375 1.25 +v -0.6875 1.375 0.625 +v -0.6875 1.4375 0.625 +v -0.6875 1.5 0.0625 +v -0.6875 1.5 0 +v -0.625 1.4375 0.0625 +v -0.625 1.4375 0 +v -0.9375 1.5 0.0625 +v -0.9375 1.5 0 +v -1 1.4375 0.0625 +v -1 1.4375 0 +v -0.625 1.375 0.0625 +v -0.625 1.375 0 +v -0.6875 1.4375 0.0625 +v -0.6875 1.4375 0 +v -0.6875 1.375 0.0625 +v -0.6875 1.375 0 +v -0.9375 1.4375 0.0625 +v -0.9375 1.4375 0 +v -0.9375 1.375 0.0625 +v -0.9375 1.375 0 +v -1 1.375 0.0625 +v -1 1.375 0 +v -0.6875 1.4813 2.1875 +v -0.6875 1.4813 2.125 +v -0.625 1.4188 2.1875 +v -0.625 1.4188 2.125 +v -0.9375 1.4813 2.1875 +v -0.9375 1.4813 2.125 +v -1 1.4188 2.1875 +v -1 1.4188 2.125 +v -0.625 1.3563 2.1875 +v -0.625 1.3563 2.125 +v -0.6875 1.4188 2.1875 +v -0.6875 1.4188 2.125 +v -0.6875 1.3563 2.1875 +v -0.6875 1.3563 2.125 +v -0.9375 1.4188 2.1875 +v -0.9375 1.4188 2.125 +v -0.9375 1.3563 2.1875 +v -0.9375 1.3563 2.125 +v -1 1.3563 2.1875 +v -1 1.3563 2.125 +v -0.5625 1.1188 1.1875 +v -0.5625 1.1188 1.125 +v -0.5625 1.0563 1.1875 +v -0.5625 1.0563 1.125 +v -1 1.1188 1.1875 +v -1 1.1188 1.125 +v -1 1.0563 1.1875 +v -1 1.0563 1.125 +v 0.25 1.3125 1.75 +v 0.25 1.3125 1.5 +v 0.25 0.4375 1.5 +v -0.5 1.3125 1.75 +v -0.5 1.3125 1.5 +v -0.5 0.4375 1.5 +v 0.25 0.4375 1.75 +v 0.5 1.25 1.125 +v 0.3125 1.25 1.125 +v 0.5 0.8125 1.125 +v 0.3125 0.8125 1.125 +v 0.5 1.25 1.625 +v 0.3125 1.25 1.625 +v 0.5 0.8125 1.625 +v 0.3125 0.8125 1.625 +v 0.4375 1.25 1.125 +v 0.4375 0.8125 1.125 +v 0.4375 0.8125 1.625 +v 0.4375 1.25 1.625 +v 0.3125 1.1563 1.25 +v 0.25 1.1563 1.25 +v 0.3125 0.9063 1.25 +v 0.25 0.9063 1.25 +v 0.3125 1.1563 1.5 +v 0.25 1.1563 1.5 +v 0.3125 0.9063 1.5 +v 0.25 0.9063 1.5 +v 0.25 1.0938 1.4375 +v 0.25 1.0938 1.3125 +v 0.25 0.9688 1.4375 +v 0.25 0.9688 1.3125 +v 0.1875 1.0938 1.4375 +v 0.1875 1.0938 1.3125 +v 0.125 0.9688 1.4375 +v 0.125 0.9688 1.3125 +v 0.458 0.9428 1.125 +v 0.458 0.9428 0.9375 +v 0.2995 0.6029 1.125 +v 0.2995 0.6029 0.9375 +v 0.288 1.0221 1.125 +v 0.288 1.0221 0.9375 +v 0.1295 0.6822 1.125 +v 0.1295 0.6822 0.9375 +v -0.4062 0.7813 1.5313 +v -0.4062 0.7813 1.0938 +v -0.4062 0.6563 1.5313 +v -0.4062 0.6563 1.0938 +v -0.5312 0.7813 1.5313 +v -0.5312 0.7813 1.0938 +v -0.5312 0.6563 1.5313 +v -0.5312 0.6563 1.0938 +v -0.4062 0.7813 0.9688 +v -0.4062 0.6563 0.9688 +v -0.4687 0.7813 0.9688 +v -0.4687 0.6563 0.9688 +v 0.5 1.3125 -0.4375 +v 0.5 1.3125 0.5625 +v 0.5 0.4375 -0.4375 +v 0.5 0.4375 0.5625 +v 0.5625 1.3125 -0.4375 +v 0.5625 1.3125 0.5625 +v 0.5625 0.4375 -0.4375 +v 0.5625 0.4375 0.5625 +v 0.0625 0.8438 2.6875 +v 0.0625 0.8438 2.5625 +v 0.0625 0.4063 2.6875 +v 0.0625 0.4063 2.5625 +v -0.0625 0.8438 2.6875 +v -0.0625 0.8438 2.5625 +v -0.0625 0.4063 2.6875 +v -0.0625 0.4063 2.5625 +v 0.0625 0.4063 2.375 +v 0.0625 0.2813 2.625 +v 0.0625 0.2813 2.375 +v -0.0625 0.4063 2.375 +v -0.0625 0.2813 2.625 +v -0.0625 0.2813 2.375 +v 0.5625 0.4375 2.4375 +v 0.5625 0.3125 2.4375 +v 0.5625 0.3125 -0.4375 +v -0.5625 0.4375 2.4375 +v -0.5625 0.4375 -0.4375 +v -0.5625 0.3125 2.4375 +v -0.5625 0.3125 -0.4375 +v 0.5625 0.3125 1 +v -0.5625 0.3125 1 +v -0.5625 0.4375 1 +v 0.5625 0.4375 1 +v 0 0.3125 1 +v 0 0.3125 -0.4375 +v 0 0.4375 -0.4375 +v 0 0.4375 1 +v 0 0.4375 2.4375 +v 0 0.3125 2.4375 +v 0.5 1.25 0.6875 +v 0.5 0.4375 0.6875 +v -0.5 1.25 0.6875 +v -0.5 0.4375 0.6875 +v -0.4375 1.5 1.75 +v -0.4375 1.5 1.625 +v -0.4375 1.4375 1.75 +v -0.4375 1.4375 1.625 +v -0.5625 1.5 1.75 +v -0.5625 1.5 1.625 +v -0.5625 1.4375 1.75 +v -0.5625 1.4375 1.625 +v -0.4375 1.5 0.8125 +v -0.4375 1.5 0.6875 +v -0.4375 1.4375 0.8125 +v -0.4375 1.4375 0.6875 +v -0.5625 1.5 0.8125 +v -0.5625 1.5 0.6875 +v -0.5625 1.4375 0.8125 +v -0.5625 1.4375 0.6875 +v 0.1875 0.6188 0.125 +v 0.1875 0.6188 -0.4375 +v 0.1875 0.4313 0.125 +v 0.1875 0.4313 -0.4375 +v -0.0625 0.6188 0.125 +v -0.0625 0.6188 -0.4375 +v -0.0625 0.4313 0.125 +v -0.0625 0.4313 -0.4375 +v -0.4375 1.125 2.25 +v -0.4375 1.125 1.875 +v -0.4375 0.4375 2.25 +v -0.4375 0.4375 1.875 +v -0.5 1.125 2.25 +v -0.5 1.125 1.875 +v -0.5 0.4375 2.25 +v -0.5 0.4375 1.875 +v -0.4375 0.75 1.875 +v -0.4375 0.75 2.25 +v -0.5 0.75 2.25 +v -0.5 0.75 1.875 +v -0.4375 0.75 2.0625 +v -0.4375 1.125 2.0625 +v -0.5 1.125 2.0625 +v -0.4375 0.4375 2.0625 +v 0.4375 1.125 2.25 +v 0.4375 1.125 1.875 +v 0.4375 0.4375 2.25 +v 0.4375 0.4375 1.875 +v 0.5 1.125 2.25 +v 0.5 1.125 1.875 +v 0.5 0.4375 2.25 +v 0.5 0.4375 1.875 +v 0.4375 0.75 1.875 +v 0.4375 0.75 2.25 +v 0.5 0.75 2.25 +v 0.5 0.75 1.875 +v 0.4375 0.75 2.0625 +v 0.4375 1.125 2.0625 +v 0.5 1.125 2.0625 +v 0.4375 0.4375 2.0625 +v 0.25 0.6875 2.1563 +v 0.25 0.6875 1.9063 +v 0.25 0.4375 2.1563 +v 0.25 0.4375 1.9063 +v -0.25 0.6875 2.1563 +v -0.25 0.6875 1.9063 +v -0.25 0.4375 2.1563 +v -0.25 0.4375 1.9063 +v 0.25 0.5625 2.1563 +v -0.25 0.5625 2.1563 +v -0.25 0.5625 1.9063 +v 0.25 0.5625 1.9063 +v 0 0.5625 2.1563 +v 0 0.4375 2.1563 +v 0 0.6875 2.1563 +v -0.3125 1.375 1.8125 +v -0.5 1.375 1.8125 +v -0.3125 1.1875 1.8125 +v -0.5 1.1875 1.8125 +v -0.3125 1.375 1.875 +v -0.5 1.375 1.875 +v -0.3125 1.1875 1.875 +v -0.5 1.1875 1.875 +v 0.375 0.625 0.5625 +v 0.375 0.625 0.125 +v 0.375 0.4375 0.5625 +v 0.375 0.4375 0.125 +v -0.375 0.625 0.5625 +v -0.375 0.625 0.125 +v -0.375 0.4375 0.5625 +v -0.375 0.4375 0.125 +v 0 0.625 0.125 +v 0 0.4375 0.125 +v 0.375 0.625 0.375 +v 0.375 0.4375 0.375 +v -0.375 0.4375 0.375 +v -0.375 0.625 0.375 +v 0 0.5 0.125 +v 0.375 0.5 0.125 +v 0.375 0.5 0.375 +v 0.375 0.5 0.5625 +v -0.375 0.5 0.5625 +v -0.375 0.5 0.375 +v -0.375 0.5 0.125 +v -0.0625 0.5625 -0.1875 +v -0.0625 0.5625 -0.3125 +v -0.0625 0.4375 -0.1875 +v -0.0625 0.4375 -0.3125 +v -0.125 0.5625 -0.1875 +v -0.125 0.5625 -0.3125 +v -0.125 0.4375 -0.1875 +v -0.125 0.4375 -0.3125 +v -0.1875 0.5625 -0.1875 +v -0.1875 0.5625 -0.3125 +v -0.1875 0.4375 -0.1875 +v -0.1875 0.4375 -0.3125 +v -0.25 0.5625 -0.1875 +v -0.25 0.5625 -0.3125 +v -0.25 0.4375 -0.1875 +v -0.25 0.4375 -0.3125 +v -0.3125 0.5625 0.125 +v -0.3125 0.5625 0 +v -0.3125 0.4375 0.125 +v -0.3125 0.4375 0 +v -0.375 0.5625 0.125 +v -0.375 0.5625 0 +v -0.375 0.4375 0 +v -0.4375 0.5625 0.125 +v -0.4375 0.5625 0 +v -0.4375 0.4375 0.125 +v -0.4375 0.4375 0 +v -0.5 0.5625 0.125 +v -0.5 0.5625 0 +v -0.5 0.4375 0.125 +v -0.5 0.4375 0 +v -0.375 0.5313 0.0938 +v -0.375 0.5313 -0.0937 +v -0.375 0.4688 0.0938 +v -0.375 0.4688 -0.0937 +v -0.4375 0.5313 0.0938 +v -0.4375 0.5313 -0.0937 +v -0.4375 0.4688 0.0938 +v -0.4375 0.4688 -0.0937 +v -0.3562 0.55 -0.0937 +v -0.3562 0.55 -0.2812 +v -0.3562 0.45 -0.0937 +v -0.3562 0.45 -0.2812 +v -0.4562 0.55 -0.0937 +v -0.4562 0.55 -0.2812 +v -0.4562 0.45 -0.0937 +v -0.4562 0.45 -0.2812 +v 0.5625 1.4375 1.75 +v 0.5625 0.4375 1.8125 +v 0.5625 0.4375 1.75 +v -0.5625 0.4375 1.8125 +v -0.5625 0.4375 1.75 +v 0.5625 1.1875 1.8125 +v -0.5625 1.1875 1.8125 +v -0.5625 1.1875 1.75 +v 0.5625 1.1875 1.75 +v 0 1.1875 1.8125 +v 0 0.4375 1.8125 +v 0 0.4375 1.75 +v 0 1.1875 1.75 +v 0 1.4375 1.75 +v 0 1.4375 1.8125 +v 0.5625 1.25 0.5625 +v 0.5625 1.25 0.6875 +v 0.5625 0.4375 0.6875 +v 0.5625 1.1875 0.5625 +v 0.5625 1.1875 0.6875 +v -0.5 0.4375 0.5625 +v 0.5625 1.4375 0.6875 +v -0.5625 1.3125 0.5625 +v -0.5625 1.25 0.6875 +v -0.5625 1.25 0.5625 +v 0 1.3125 0.5625 +v 0 1.4375 0.6875 +v 0 1.25 0.6875 +v 0 1.25 0.5625 +v 0.5 1.4375 0.6875 +v 0.5 1.4375 1.75 +v 0.5 0.4375 1.75 +v 0.5 0.9375 1.75 +v 0.5 0.9375 0.6875 +v 0.5625 0.9375 0.6875 +v 0.5625 0.9375 1.75 +v 0.5 0.9375 1.25 +v 0.5 0.4375 1.25 +v 0.5625 0.4375 1.25 +v 0.5625 0.9375 1.25 +v 0.5 1.4375 1.25 +v 0.5 1.25 0.5625 +v -0.5 1.25 0.5625 +v 0.5625 1.25 2.3125 +v 0.5625 1.25 1.8125 +v 0.5 1.25 2.3125 +v 0.5 1.25 1.8125 +v 0.5 0.4375 2.4375 +v 0.5 0.4375 1.8125 +v -0.5 1.3125 0.5625 +v -0.5 1.3125 -0.4375 +v -0.5 0.4375 -0.4375 +v -0.5625 1.3125 -0.4375 +v -0.5625 0.4375 0.5625 +v -0.5625 0.4375 0.6875 +v -0.5625 1.1875 0.6875 +v -0.5625 1.1875 0.5625 +v -0.5 1.4375 1.75 +v -0.5 1.4375 0.6875 +v -0.5 0.4375 1.75 +v -0.5 0.9375 0.6875 +v -0.5 0.9375 1.75 +v -0.5625 0.9375 1.75 +v -0.5625 0.9375 0.6875 +v -0.5 0.9375 1.1875 +v -0.5 0.4375 1.1875 +v -0.5625 0.4375 1.1875 +v -0.5625 0.9375 1.1875 +v -0.5625 1.4375 1.1875 +v -0.5 1.4375 1.1875 +v -0.5 1.25 2.3125 +v -0.5 1.25 1.8125 +v -0.5 0.4375 2.4375 +v -0.5 0.4375 1.8125 +v -0.5625 1.25 2.3125 +v -0.5625 1.25 1.8125 +v 0.5 0.6875 0.75 +v 0.5 0.6875 0.6875 +v 0.5 0.4375 0.75 +v 0.25 0.6875 0.75 +v 0.25 0.6875 0.6875 +v 0.25 0.4375 0.75 +v 0.25 0.4375 0.6875 +v 0.5 0.6875 1.6875 +v 0.5 0.6875 1.75 +v 0.5 0.4375 1.6875 +v 0.25 0.6875 1.6875 +v 0.25 0.6875 1.75 +v 0.25 0.4375 1.6875 +v 0.5 0.875 0.5625 +v 0.5 0.875 -0.4375 +v -0.5 0.875 -0.4375 +v -0.5 0.875 0.5625 +v 0.5 0.75 0.5625 +v 0.5 0.75 0.125 +v 0.5 0.625 0.5625 +v 0.5 0.625 0.125 +v -0.5 0.75 0.5625 +v -0.5 0.75 0.125 +v -0.5 0.625 0.5625 +v -0.5 0.625 0.125 +v 0.5625 1.3125 -0.5625 +v 0.5625 0.3125 -0.5625 +v -0.5625 1.3125 -0.5625 +v -0.5625 0.3125 -0.5625 +v -0.5625 0.8125 -0.5625 +v 0.5625 0.8125 -0.5625 +v 0.5625 0.8125 -0.4375 +v -0.5625 0.8125 -0.4375 +v 0 0.8125 -0.5625 +v 0 0.3125 -0.5625 +v 0 0.8125 -0.4375 +v 0 1.3125 -0.4375 +v 0 1.3125 -0.5625 +v -0.8125 1.125 -0.75 +v -1.0625 1.375 -0.5 +v -1.0625 1.1875 -0.75 +v -1.0625 1.3125 -0.5 +v -1.0625 1.125 -0.75 +v -0.5625 1.375 -0.5 +v -0.5625 1.1875 -0.75 +v -0.5625 1.3125 -0.5 +v -0.5625 1.125 -0.75 +v -0.8125 1.1875 -0.75 +v -0.8125 1.375 -0.5 +v -0.8125 1.3125 -0.5 +v -0.5625 1.3125 0.625 +v -0.8125 1.375 0.625 +v -0.8125 1.3125 0.625 +v -0.5625 1.3531 2.3029 +v -0.5625 1.1549 2.5445 +v -0.5625 1.2907 2.3002 +v -0.5625 1.0924 2.5418 +v -1.0625 1.3531 2.3029 +v -1.0625 1.1549 2.5445 +v -1.0625 1.2907 2.3002 +v -1.0625 1.0924 2.5418 +v -0.8125 1.1549 2.5445 +v -0.8125 1.3531 2.3029 +v -0.8125 1.2907 2.3002 +v -0.8125 1.0924 2.5418 +v -1.0625 1.3125 1.8007 +v -1.0625 1.3749 1.8034 +v -0.5625 1.3125 1.8007 +v -0.5625 1.3749 1.8034 +v -0.8125 1.3125 1.8007 +v -0.8125 1.3749 1.8034 +v 0.8125 1.125 -0.75 +v 1.0625 1.375 -0.5 +v 1.0625 1.1875 -0.75 +v 1.0625 1.3125 -0.5 +v 1.0625 1.125 -0.75 +v 0.5625 1.375 -0.5 +v 0.5625 1.1875 -0.75 +v 0.5625 1.3125 -0.5 +v 0.5625 1.125 -0.75 +v 0.8125 1.1875 -0.75 +v 0.8125 1.375 -0.5 +v 0.8125 1.3125 -0.5 +v 0.5625 1.3125 0.625 +v 0.8125 1.375 0.625 +v 0.8125 1.3125 0.625 +v 0.5625 1.3531 2.3029 +v 0.5625 1.1549 2.5445 +v 0.5625 1.2907 2.3002 +v 0.5625 1.0924 2.5418 +v 1.0625 1.3531 2.3029 +v 1.0625 1.1549 2.5445 +v 1.0625 1.2907 2.3002 +v 1.0625 1.0924 2.5418 +v 0.8125 1.1549 2.5445 +v 0.8125 1.3531 2.3029 +v 0.8125 1.2907 2.3002 +v 0.8125 1.0924 2.5418 +v 1.0625 1.3125 1.8007 +v 1.0625 1.3749 1.8034 +v 0.5625 1.3125 1.8007 +v 0.5625 1.3749 1.8034 +v 0.8125 1.3125 1.8007 +v 0.8125 1.3749 1.8034 +v 1.0635 1.4241 0.875 +v 1.0635 1.4241 0.75 +v 1.0527 1.3626 0.875 +v 1.0527 1.3626 0.75 +v 0.6327 1.5001 0.875 +v 0.6327 1.5001 0.75 +v 0.6218 1.4386 0.875 +v 0.6218 1.4386 0.75 +v 1.0635 1.4241 1.6875 +v 1.0635 1.4241 1.5625 +v 1.0527 1.3626 1.6875 +v 1.0527 1.3626 1.5625 +v 0.6327 1.5001 1.6875 +v 0.6327 1.5001 1.5625 +v 0.6218 1.4386 1.6875 +v 0.6218 1.4386 1.5625 +v 1.1359 1.4748 1.8125 +v 1.1359 1.4748 0.625 +v 1.1251 1.4133 1.8125 +v 1.1251 1.4133 0.625 +v 0.582 1.5725 1.8125 +v 0.582 1.5725 0.625 +v 0.5711 1.511 1.8125 +v 0.5711 1.511 0.625 +v 0.5 0.75 1.8125 +v 0.5 0.75 2.1875 +v 0.5 0.625 1.8125 +v 0.5 0.625 2.1875 +v -0.5 0.75 1.8125 +v -0.5 0.75 2.1875 +v -0.5 0.625 1.8125 +v -0.5 0.625 2.1875 +v 0.275 1.246 -0.4317 +v 0.275 0.9383 -0.3774 +v 0.275 1.2547 -0.3825 +v 0.275 0.947 -0.3282 +v -0.0375 1.246 -0.4317 +v -0.0375 0.9383 -0.3774 +v -0.0375 1.2547 -0.3825 +v -0.0375 0.947 -0.3282 +v -0.1 1.246 -0.4317 +v -0.1 0.9383 -0.3774 +v -0.1 1.2547 -0.3825 +v -0.1 0.947 -0.3282 +v -0.4125 1.246 -0.4317 +v -0.4125 0.9383 -0.3774 +v -0.4125 1.2547 -0.3825 +v -0.4125 0.947 -0.3282 +vt 0.1875 0.3906 +vt 0.1875 0.4844 +vt 0.0938 0.4844 +vt 0.0938 0.3906 +vt 0.1094 0.4844 +vt 0.1094 0.3906 +vt 0.0938 0.3906 +vt 0.0938 0.4844 +vt 0.1875 0.3906 +vt 0.1875 0.4844 +vt 0.1719 0.4844 +vt 0.1719 0.3906 +vt 0.1094 0.3906 +vt 0.1094 0.4844 +vt 0.0938 0.4844 +vt 0.0938 0.3906 +vt 0.1875 0.3906 +vt 0.1875 0.4844 +vt 0.1719 0.4844 +vt 0.1719 0.3906 +vt 0.0938 0.3906 +vt 0.0938 0.4844 +vt 0.1875 0.4844 +vt 0.1875 0.3906 +vt 0.1094 0.4844 +vt 0.1094 0.3906 +vt 0.0938 0.3906 +vt 0.0938 0.4844 +vt 0.1875 0.3906 +vt 0.1875 0.4844 +vt 0.1719 0.4844 +vt 0.1719 0.3906 +vt 0.1094 0.3906 +vt 0.1094 0.4844 +vt 0.0938 0.4844 +vt 0.0938 0.3906 +vt 0.1875 0.3906 +vt 0.1875 0.4844 +vt 0.1719 0.4844 +vt 0.1719 0.3906 +vt 0.1875 0.3906 +vt 0.1875 0.4844 +vt 0.0938 0.4844 +vt 0.0938 0.3906 +vt 0.1094 0.4844 +vt 0.1094 0.3906 +vt 0.0938 0.3906 +vt 0.0938 0.4844 +vt 0.1875 0.3906 +vt 0.1875 0.4844 +vt 0.1719 0.4844 +vt 0.1719 0.3906 +vt 0.1094 0.3906 +vt 0.1094 0.4844 +vt 0.0938 0.4844 +vt 0.0938 0.3906 +vt 0.1875 0.3906 +vt 0.1875 0.4844 +vt 0.1719 0.4844 +vt 0.1719 0.3906 +vt 0.75 0.9688 +vt 0.9219 0.9688 +vt 0.9219 1 +vt 0.75 1 +vt 0.75 0.8281 +vt 0.8125 0.8281 +vt 0.8125 1 +vt 0.75 1 +vt 0.75 0.25 +vt 0.8125 0.25 +vt 0.8125 0.4219 +vt 0.75 0.4219 +vt 0.75 0.9688 +vt 0.8125 0.9688 +vt 0.8125 1 +vt 0.75 1 +vt 1 1 +vt 0.9375 1 +vt 0.9375 0.9688 +vt 1 0.9688 +vt 0.75 0.25 +vt 0.9219 0.25 +vt 0.9219 0.2656 +vt 0.75 0.2656 +vt 0.9531 0.2656 +vt 0.8906 0.2656 +vt 0.8906 0.25 +vt 0.9531 0.25 +vt 0.7656 0.25 +vt 0.8281 0.25 +vt 0.8281 0.2656 +vt 0.7656 0.2656 +vt 1 0.2656 +vt 0.8281 0.2656 +vt 0.8281 0.25 +vt 1 0.25 +vt 0.75 0.8281 +vt 0.8125 0.8281 +vt 0.8125 1 +vt 0.75 1 +vt 0.75 0.25 +vt 0.8125 0.25 +vt 0.8125 0.4219 +vt 0.75 0.4219 +vt 1 1 +vt 0.8281 1 +vt 0.8281 0.9688 +vt 1 0.9688 +vt 1 0.4219 +vt 0.9531 0.4219 +vt 0.9531 0.25 +vt 1 0.25 +vt 1 1 +vt 0.9531 1 +vt 0.9531 0.9688 +vt 1 0.9688 +vt 1 0.2656 +vt 0.9531 0.2656 +vt 0.9531 0.25 +vt 1 0.25 +vt 1 1 +vt 0.9531 1 +vt 0.9531 0.8281 +vt 1 0.8281 +vt 1 0.4219 +vt 0.9531 0.4219 +vt 0.9531 0.25 +vt 1 0.25 +vt 0.8281 0.25 +vt 0.875 0.25 +vt 0.875 0.2656 +vt 0.8281 0.2656 +vt 0.75 0.9688 +vt 0.7969 0.9688 +vt 0.7969 1 +vt 0.75 1 +vt 1 1 +vt 0.9531 1 +vt 0.9531 0.8281 +vt 1 0.8281 +vt 0.8281 0.1406 +vt 0.8281 0.1563 +vt 0.8125 0.1563 +vt 0.8125 0.1406 +vt 0.9219 0.1406 +vt 0.9219 0.1563 +vt 0.8125 0.1563 +vt 0.8125 0.1406 +vt 0.9219 0.1406 +vt 0.9219 0.1563 +vt 0.8125 0.1563 +vt 0.8125 0.1406 +vt 0.9219 0.1406 +vt 0.9219 0.1563 +vt 0.8125 0.1563 +vt 0.8125 0.1406 +vt 0.8281 0.1406 +vt 0.8281 0.1563 +vt 0.8125 0.1563 +vt 0.8125 0.1406 +vt 0.9219 0.1406 +vt 0.9219 0.1563 +vt 0.8125 0.1563 +vt 0.8125 0.1406 +vt 0.9219 0.1406 +vt 0.9219 0.1563 +vt 0.8125 0.1563 +vt 0.8125 0.1406 +vt 0.9219 0.1406 +vt 0.9219 0.1563 +vt 0.8125 0.1563 +vt 0.8125 0.1406 +vt 0.1094 1 +vt 0.1094 0.8438 +vt 0.0156 0.8438 +vt 0.0156 1 +vt 0.1094 0.4063 +vt 0.1094 0.25 +vt 0.0156 0.25 +vt 0.0156 0.4063 +vt 0.0938 1 +vt 0.0938 0.9844 +vt 0 0.9844 +vt 0 1 +vt 0.0313 0.9844 +vt 0.0313 1 +vt 0.125 1 +vt 0.125 0.9844 +vt 0.1094 0.3906 +vt 0.1094 0.25 +vt 0.0156 0.25 +vt 0.0156 0.3906 +vt 0.1094 1 +vt 0.1094 0.8594 +vt 0.0156 0.8594 +vt 0.0156 1 +vt 0.7031 0.25 +vt 0.7031 0.3906 +vt 0.7344 0.3906 +vt 0.7344 0.25 +vt 0.0781 0.9844 +vt 0.0781 1 +vt 0.1094 1 +vt 0.1094 0.9844 +vt 0.7188 0.8594 +vt 0.7188 1 +vt 0.75 1 +vt 0.75 0.8594 +vt 0.7188 0.25 +vt 0.7188 0.4063 +vt 0.75 0.4063 +vt 0.75 0.25 +vt 0.0313 1 +vt 0.0313 0.9844 +vt 0 0.9844 +vt 0 1 +vt 0.7031 0.8438 +vt 0.7031 1 +vt 0.7344 1 +vt 0.7344 0.8438 +vt 0.0313 0.75 +vt 0 0.75 +vt 0 0.7188 +vt 0.0313 0.7188 +vt 0.0313 0.5938 +vt 0 0.5938 +vt 0 0.5625 +vt 0.0313 0.5625 +vt 0.0313 0.7188 +vt 0 0.7188 +vt 0 0.5938 +vt 0.0313 0.5938 +vt 0.0313 0.75 +vt 0 0.75 +vt 0 0.5625 +vt 0.0313 0.5625 +vt 0.0313 0.75 +vt 0 0.7188 +vt 0 0.5938 +vt 0.0313 0.5625 +vt 0 0.5625 +vt 0.0313 0.5938 +vt 0.0313 0.7188 +vt 0 0.75 +vt 0.0625 0.6875 +vt 0.0625 0.7188 +vt 0.0313 0.7188 +vt 0.0313 0.6875 +vt 0.0625 0.6875 +vt 0.0625 0.7188 +vt 0.0313 0.7188 +vt 0.0313 0.6875 +vt 0.0625 0.6875 +vt 0.0625 0.7188 +vt 0.0313 0.7188 +vt 0.0313 0.6875 +vt 0.0625 0.6875 +vt 0.0625 0.7188 +vt 0.0313 0.7188 +vt 0.0313 0.6875 +vt 0.0625 0.5625 +vt 0.0625 0.5938 +vt 0.0313 0.5938 +vt 0.0313 0.5625 +vt 0.0625 0.5625 +vt 0.0625 0.5938 +vt 0.0313 0.5938 +vt 0.0313 0.5625 +vt 0.0625 0.5625 +vt 0.0625 0.5938 +vt 0.0313 0.5938 +vt 0.0313 0.5625 +vt 0.0625 0.5625 +vt 0.0625 0.5938 +vt 0.0313 0.5938 +vt 0.0313 0.5625 +vt 0.0313 0.75 +vt 0 0.75 +vt 0 0.7188 +vt 0.0313 0.7188 +vt 0.0313 0.5938 +vt 0 0.5938 +vt 0 0.5625 +vt 0.0313 0.5625 +vt 0.0313 0.7188 +vt 0 0.7188 +vt 0 0.5938 +vt 0.0313 0.5938 +vt 0.0313 0.75 +vt 0 0.75 +vt 0 0.5625 +vt 0.0313 0.5625 +vt 0.0313 0.75 +vt 0 0.7188 +vt 0 0.5938 +vt 0.0313 0.5625 +vt 0 0.5625 +vt 0.0313 0.5938 +vt 0.0313 0.7188 +vt 0 0.75 +vt 0.0625 0.6875 +vt 0.0625 0.7188 +vt 0.0313 0.7188 +vt 0.0313 0.6875 +vt 0.0625 0.6875 +vt 0.0625 0.7188 +vt 0.0313 0.7188 +vt 0.0313 0.6875 +vt 0.0625 0.6875 +vt 0.0625 0.7188 +vt 0.0313 0.7188 +vt 0.0313 0.6875 +vt 0.0625 0.6875 +vt 0.0625 0.7188 +vt 0.0313 0.7188 +vt 0.0313 0.6875 +vt 0.0625 0.5625 +vt 0.0625 0.5938 +vt 0.0313 0.5938 +vt 0.0313 0.5625 +vt 0.0625 0.5625 +vt 0.0625 0.5938 +vt 0.0313 0.5938 +vt 0.0313 0.5625 +vt 0.0625 0.5625 +vt 0.0625 0.5938 +vt 0.0313 0.5938 +vt 0.0313 0.5625 +vt 0.0625 0.5625 +vt 0.0625 0.5938 +vt 0.0313 0.5938 +vt 0.0313 0.5625 +vt 0.75 0.9688 +vt 0.9219 0.9688 +vt 0.9219 1 +vt 0.75 1 +vt 0.75 0.8281 +vt 0.8125 0.8281 +vt 0.8125 1 +vt 0.75 1 +vt 0.75 0.25 +vt 0.8125 0.25 +vt 0.8125 0.4219 +vt 0.75 0.4219 +vt 0.75 0.9688 +vt 0.8125 0.9688 +vt 0.8125 1 +vt 0.75 1 +vt 1 1 +vt 0.9375 1 +vt 0.9375 0.9688 +vt 1 0.9688 +vt 0.75 0.25 +vt 0.9219 0.25 +vt 0.9219 0.2656 +vt 0.75 0.2656 +vt 0.9531 0.2656 +vt 0.8906 0.2656 +vt 0.8906 0.25 +vt 0.9531 0.25 +vt 0.7656 0.25 +vt 0.8281 0.25 +vt 0.8281 0.2656 +vt 0.7656 0.2656 +vt 1 0.2656 +vt 0.8281 0.2656 +vt 0.8281 0.25 +vt 1 0.25 +vt 0.75 0.8281 +vt 0.8125 0.8281 +vt 0.8125 1 +vt 0.75 1 +vt 0.75 0.25 +vt 0.8125 0.25 +vt 0.8125 0.4219 +vt 0.75 0.4219 +vt 1 1 +vt 0.8281 1 +vt 0.8281 0.9688 +vt 1 0.9688 +vt 1 0.4219 +vt 0.9531 0.4219 +vt 0.9531 0.25 +vt 1 0.25 +vt 1 1 +vt 0.9531 1 +vt 0.9531 0.9688 +vt 1 0.9688 +vt 1 0.2656 +vt 0.9531 0.2656 +vt 0.9531 0.25 +vt 1 0.25 +vt 1 1 +vt 0.9531 1 +vt 0.9531 0.8281 +vt 1 0.8281 +vt 1 0.4219 +vt 0.9531 0.4219 +vt 0.9531 0.25 +vt 1 0.25 +vt 0.8281 0.25 +vt 0.875 0.25 +vt 0.875 0.2656 +vt 0.8281 0.2656 +vt 0.75 0.9688 +vt 0.7969 0.9688 +vt 0.7969 1 +vt 0.75 1 +vt 1 1 +vt 0.9531 1 +vt 0.9531 0.8281 +vt 1 0.8281 +vt 0.8281 0.1406 +vt 0.8281 0.1563 +vt 0.8125 0.1563 +vt 0.8125 0.1406 +vt 0.9219 0.1406 +vt 0.9219 0.1563 +vt 0.8125 0.1563 +vt 0.8125 0.1406 +vt 0.9219 0.1406 +vt 0.9219 0.1563 +vt 0.8125 0.1563 +vt 0.8125 0.1406 +vt 0.9219 0.1406 +vt 0.9219 0.1563 +vt 0.8125 0.1563 +vt 0.8125 0.1406 +vt 0.0938 0.3906 +vt 0.0938 0.4844 +vt 0.1875 0.4844 +vt 0.1875 0.3906 +vt 0.1094 0.4844 +vt 0.1094 0.3906 +vt 0.0938 0.3906 +vt 0.0938 0.4844 +vt 0.1875 0.3906 +vt 0.1875 0.4844 +vt 0.1719 0.4844 +vt 0.1719 0.3906 +vt 0.1094 0.3906 +vt 0.1094 0.4844 +vt 0.0938 0.4844 +vt 0.0938 0.3906 +vt 0.1875 0.3906 +vt 0.1875 0.4844 +vt 0.1719 0.4844 +vt 0.1719 0.3906 +vt 0.0156 0.8438 +vt 0.1094 0.8438 +vt 0.1094 1 +vt 0.0156 1 +vt 0.0156 0.25 +vt 0.1094 0.25 +vt 0.1094 0.4063 +vt 0.0156 0.4063 +vt 0 0.9844 +vt 0.0938 0.9844 +vt 0.0938 1 +vt 0 1 +vt 0.125 1 +vt 0.0313 1 +vt 0.0313 0.9844 +vt 0.125 0.9844 +vt 0.0156 0.25 +vt 0.1094 0.25 +vt 0.1094 0.3906 +vt 0.0156 0.3906 +vt 0.0156 0.8594 +vt 0.1094 0.8594 +vt 0.1094 1 +vt 0.0156 1 +vt 0.7344 0.3906 +vt 0.7031 0.3906 +vt 0.7031 0.25 +vt 0.7344 0.25 +vt 0.1094 1 +vt 0.0781 1 +vt 0.0781 0.9844 +vt 0.1094 0.9844 +vt 0.75 1 +vt 0.7188 1 +vt 0.7188 0.8594 +vt 0.75 0.8594 +vt 0.75 0.4063 +vt 0.7188 0.4063 +vt 0.7188 0.25 +vt 0.75 0.25 +vt 0 0.9844 +vt 0.0313 0.9844 +vt 0.0313 1 +vt 0 1 +vt 0.7344 1 +vt 0.7031 1 +vt 0.7031 0.8438 +vt 0.7344 0.8438 +vt 0.0313 0.75 +vt 0 0.75 +vt 0 0.7188 +vt 0.0313 0.7188 +vt 0.0313 0.5938 +vt 0 0.5938 +vt 0 0.5625 +vt 0.0313 0.5625 +vt 0.0313 0.7188 +vt 0 0.7188 +vt 0 0.5938 +vt 0.0313 0.5938 +vt 0.0313 0.75 +vt 0 0.75 +vt 0 0.5625 +vt 0.0313 0.5625 +vt 0.0313 0.75 +vt 0 0.7188 +vt 0 0.5938 +vt 0.0313 0.5625 +vt 0 0.5625 +vt 0.0313 0.5938 +vt 0.0313 0.7188 +vt 0 0.75 +vt 0.0625 0.6875 +vt 0.0625 0.7188 +vt 0.0313 0.7188 +vt 0.0313 0.6875 +vt 0.0625 0.6875 +vt 0.0625 0.7188 +vt 0.0313 0.7188 +vt 0.0313 0.6875 +vt 0.0625 0.6875 +vt 0.0625 0.7188 +vt 0.0313 0.7188 +vt 0.0313 0.6875 +vt 0.0625 0.6875 +vt 0.0625 0.7188 +vt 0.0313 0.7188 +vt 0.0313 0.6875 +vt 0.0625 0.5625 +vt 0.0625 0.5938 +vt 0.0313 0.5938 +vt 0.0313 0.5625 +vt 0.0625 0.5625 +vt 0.0625 0.5938 +vt 0.0313 0.5938 +vt 0.0313 0.5625 +vt 0.0625 0.5625 +vt 0.0625 0.5938 +vt 0.0313 0.5938 +vt 0.0313 0.5625 +vt 0.0625 0.5625 +vt 0.0625 0.5938 +vt 0.0313 0.5938 +vt 0.0313 0.5625 +vt 0.0313 0.75 +vt 0 0.75 +vt 0 0.7188 +vt 0.0313 0.7188 +vt 0.0313 0.5938 +vt 0 0.5938 +vt 0 0.5625 +vt 0.0313 0.5625 +vt 0.0313 0.7188 +vt 0 0.7188 +vt 0 0.5938 +vt 0.0313 0.5938 +vt 0.0313 0.75 +vt 0 0.75 +vt 0 0.5625 +vt 0.0313 0.5625 +vt 0.0313 0.75 +vt 0 0.7188 +vt 0 0.5938 +vt 0.0313 0.5625 +vt 0 0.5625 +vt 0.0313 0.5938 +vt 0.0313 0.7188 +vt 0 0.75 +vt 0.0625 0.6875 +vt 0.0625 0.7188 +vt 0.0313 0.7188 +vt 0.0313 0.6875 +vt 0.0625 0.6875 +vt 0.0625 0.7188 +vt 0.0313 0.7188 +vt 0.0313 0.6875 +vt 0.0625 0.6875 +vt 0.0625 0.7188 +vt 0.0313 0.7188 +vt 0.0313 0.6875 +vt 0.0625 0.6875 +vt 0.0625 0.7188 +vt 0.0313 0.7188 +vt 0.0313 0.6875 +vt 0.0625 0.5625 +vt 0.0625 0.5938 +vt 0.0313 0.5938 +vt 0.0313 0.5625 +vt 0.0625 0.5625 +vt 0.0625 0.5938 +vt 0.0313 0.5938 +vt 0.0313 0.5625 +vt 0.0625 0.5625 +vt 0.0625 0.5938 +vt 0.0313 0.5938 +vt 0.0313 0.5625 +vt 0.0625 0.5625 +vt 0.0625 0.5938 +vt 0.0313 0.5938 +vt 0.0313 0.5625 +vt 0.8281 0.1406 +vt 0.8281 0.1563 +vt 0.8125 0.1563 +vt 0.8125 0.1406 +vt 0.9219 0.1406 +vt 0.9219 0.1563 +vt 0.8125 0.1563 +vt 0.8125 0.1406 +vt 0.9219 0.1406 +vt 0.9219 0.1563 +vt 0.8125 0.1563 +vt 0.8125 0.1406 +vt 0.9219 0.1406 +vt 0.9219 0.1563 +vt 0.8125 0.1563 +vt 0.8125 0.1406 +vt 1 0.5313 +vt 1 0.6563 +vt 0.625 0.6563 +vt 0.625 0.5313 +vt 1 0.5625 +vt 1 1 +vt 0.625 1 +vt 0.625 0.5625 +vt 0.6563 0.5625 +vt 0.6563 1 +vt 0.5313 1 +vt 0.5313 0.5625 +vt 0.9688 0.0625 +vt 0.9688 0.0938 +vt 0.7188 0.0938 +vt 0.7188 0.0625 +vt 0.7188 0.0938 +vt 0.7188 0.0625 +vt 0.9688 0.0625 +vt 0.9688 0.0938 +vt 0.9688 0.0625 +vt 0.9688 0.2813 +vt 0.7188 0.2813 +vt 0.7188 0.0625 +vt 0.9688 0.0625 +vt 0.9688 0.125 +vt 0.7188 0.125 +vt 0.7188 0.0625 +vt 0.7188 0.2813 +vt 0.7188 0.2188 +vt 0.9688 0.2188 +vt 0.9688 0.2813 +vt 0.0469 0.5156 +vt 0.0469 0.5781 +vt 0.0313 0.5781 +vt 0.0313 0.5156 +vt 0.0938 0.5156 +vt 0.0938 0.5781 +vt 0.0781 0.5781 +vt 0.0781 0.5156 +vt 0.0313 0.5625 +vt 0.0313 0.5781 +vt 0.0938 0.5781 +vt 0.0938 0.5625 +vt 0.0313 0.5156 +vt 0.0313 0.5313 +vt 0.0938 0.5313 +vt 0.0938 0.5156 +vt 0.0938 0.5156 +vt 0.0938 0.5781 +vt 0.0313 0.5781 +vt 0.0313 0.5156 +vt 0.7813 0.0625 +vt 0.875 0.0625 +vt 0.875 0.2813 +vt 0.7813 0.2813 +vt 0.8125 0.0625 +vt 0.9063 0.0625 +vt 0.9063 0.2813 +vt 0.8125 0.2813 +vt 0.6563 0.25 +vt 0.6563 0.3125 +vt 0.5938 0.3125 +vt 0.5938 0.25 +vt 0.6563 0.2813 +vt 0.5938 0.2813 +vt 0.5938 0.3125 +vt 0.6563 0.3125 +vt 0.9063 0.4375 +vt 0.9063 0.5 +vt 0.9688 0.5 +vt 0.9688 0.4375 +vt 0.5938 0.2813 +vt 0.5938 0.3438 +vt 0.6563 0.3438 +vt 0.6563 0.2813 +vt 0.4375 0.5 +vt 0.4375 0.6875 +vt 0.3438 0.6875 +vt 0.3438 0.5 +vt 0.4375 0.5 +vt 0.4375 0.6875 +vt 0.3438 0.6875 +vt 0.3438 0.5 +vt 0.3438 0.6563 +vt 0.3438 0.75 +vt 0.4375 0.75 +vt 0.4375 0.6563 +vt 0.3438 0.6563 +vt 0.3438 0.75 +vt 0.25 0.75 +vt 0.25 0.6563 +vt 0.3438 0.5 +vt 0.3438 0.6875 +vt 0.4375 0.6875 +vt 0.4375 0.5 +vt 0.3438 0.5 +vt 0.3438 0.6875 +vt 0.4375 0.6875 +vt 0.4375 0.5 +vt 0.5938 0.4688 +vt 0.5625 0.4688 +vt 0.5625 0.3594 +vt 0.5938 0.3594 +vt 0.5625 0.3594 +vt 0.5938 0.3594 +vt 0.5938 0.4688 +vt 0.5625 0.4688 +vt 0.5625 0.3594 +vt 0.5625 0.4688 +vt 0.5938 0.4688 +vt 0.5938 0.3594 +vt 0.5938 0.4688 +vt 0.5938 0.3594 +vt 0.5625 0.3594 +vt 0.5625 0.4688 +vt 0.5625 0.4688 +vt 0.5938 0.4688 +vt 0.5938 0.5 +vt 0.5625 0.5 +vt 0.6094 0.4375 +vt 0.6094 0.4688 +vt 0.6406 0.4688 +vt 0.6406 0.4375 +vt 0.625 0.4844 +vt 0.625 0.4531 +vt 0.6563 0.4531 +vt 0.6563 0.4844 +vt 0.5156 0.4844 +vt 0.5469 0.4844 +vt 0.5469 0.5 +vt 0.5156 0.5 +vt 0.0156 1 +vt 0.0156 0.8906 +vt 0.2656 0.8906 +vt 0.2656 1 +vt 0.2813 0.0313 +vt 0.2813 0.25 +vt 0.5313 0.25 +vt 0.5313 0.0313 +vt 0 1 +vt 0 0.75 +vt 0.0156 0.75 +vt 0.0156 1 +vt 0.5313 0.3125 +vt 0.5313 0.5313 +vt 0.5938 0.5313 +vt 0.5938 0.3125 +vt 0.5313 0.3125 +vt 0.5313 0.5313 +vt 0.5938 0.5313 +vt 0.5938 0.3125 +vt 0.6563 0.3438 +vt 0.6563 0.4063 +vt 0.5938 0.4063 +vt 0.5938 0.3438 +vt 0.5938 0.3125 +vt 0.5938 0.5313 +vt 0.5313 0.5313 +vt 0.5313 0.3125 +vt 0.5938 0.3125 +vt 0.5938 0.5313 +vt 0.5313 0.5313 +vt 0.5313 0.3125 +vt 0.5938 0.4688 +vt 0.5938 0.4063 +vt 0.75 0.4063 +vt 0.7188 0.4688 +vt 0.7188 0.4688 +vt 0.75 0.5313 +vt 0.5938 0.5313 +vt 0.5938 0.4688 +vt 0.5313 0.3438 +vt 0.5313 0.1875 +vt 0.5938 0.1875 +vt 0.5938 0.3438 +vt 0.5938 0.1875 +vt 0.5938 0.3125 +vt 0.5313 0.3125 +vt 0.5313 0.1875 +vt 0.5938 0.3438 +vt 0.5938 0.4063 +vt 0.5313 0.4063 +vt 0.5313 0.3438 +vt 1 0 +vt 0.6406 0 +vt 0.6406 0.0313 +vt 1 0.0313 +vt 1 0.0313 +vt 0.6406 0.0313 +vt 0.6406 0 +vt 1 0 +vt 0.75 0.25 +vt 0.8906 0.25 +vt 0.8906 0.6094 +vt 0.75 0.6094 +vt 0.75 0.6406 +vt 0.8906 0.6406 +vt 0.8906 1 +vt 0.75 1 +vt 0 0.75 +vt 0.1406 0.75 +vt 0.1406 0.7813 +vt 0 0.7813 +vt 0.75 0.3281 +vt 0.8906 0.3281 +vt 0.8906 0.6875 +vt 0.75 0.6875 +vt 0.2813 0 +vt 0.6406 0 +vt 0.6406 0.0313 +vt 0.2813 0.0313 +vt 0.75 0.6094 +vt 0.8906 0.6094 +vt 0.8906 0.9688 +vt 0.75 0.9688 +vt 0.2813 0.0313 +vt 0.6406 0.0313 +vt 0.6406 0 +vt 0.2813 0 +vt 1 0.6875 +vt 0.8594 0.6875 +vt 0.8594 0.3281 +vt 1 0.3281 +vt 1 0.9844 +vt 0.8594 0.9844 +vt 0.8594 0.625 +vt 1 0.625 +vt 1 0.6094 +vt 0.8594 0.6094 +vt 0.8594 0.25 +vt 1 0.25 +vt 0.2813 0.7813 +vt 0.1406 0.7813 +vt 0.1406 0.75 +vt 0.2813 0.75 +vt 1 1 +vt 0.8594 1 +vt 0.8594 0.6406 +vt 1 0.6406 +vt 0.75 0 +vt 0.75 0.2031 +vt 0.5 0.2031 +vt 0.5 0 +vt 0.625 0.0938 +vt 0.625 0.125 +vt 0.6875 0.125 +vt 0.6875 0.0938 +vt 0.6875 0.125 +vt 0.6875 0.1563 +vt 0.625 0.1563 +vt 0.625 0.125 +vt 0.6875 0.0938 +vt 0.6875 0.1563 +vt 0.625 0.1563 +vt 0.625 0.0938 +vt 0.6875 0.1563 +vt 0.6875 0.0938 +vt 0.625 0.0938 +vt 0.625 0.1563 +vt 0.6875 0.0938 +vt 0.6875 0.125 +vt 0.625 0.125 +vt 0.625 0.0938 +vt 0.625 0.125 +vt 0.625 0.1563 +vt 0.6875 0.1563 +vt 0.6875 0.125 +vt 0.625 0.0938 +vt 0.625 0.125 +vt 0.6875 0.125 +vt 0.6875 0.0938 +vt 0.6875 0.125 +vt 0.6875 0.1563 +vt 0.625 0.1563 +vt 0.625 0.125 +vt 0.6875 0.0938 +vt 0.6875 0.1563 +vt 0.625 0.1563 +vt 0.625 0.0938 +vt 0.6875 0.1563 +vt 0.6875 0.0938 +vt 0.625 0.0938 +vt 0.625 0.1563 +vt 0.6875 0.0938 +vt 0.6875 0.125 +vt 0.625 0.125 +vt 0.625 0.0938 +vt 0.625 0.125 +vt 0.625 0.1563 +vt 0.6875 0.1563 +vt 0.6875 0.125 +vt 0.4063 1 +vt 0.4063 0.9531 +vt 0.2656 0.9531 +vt 0.2656 1 +vt 0.4063 1 +vt 0.4063 0.9531 +vt 0.2656 0.9531 +vt 0.2656 1 +vt 0.5313 0.1875 +vt 0.5313 0.4688 +vt 0.4063 0.4688 +vt 0.4063 0.1875 +vt 1 1 +vt 0.9531 1 +vt 0.9531 0.9063 +vt 1 0.9063 +vt 0.9844 1 +vt 0.9844 0.9531 +vt 1 0.9531 +vt 1 1 +vt 0.9844 1 +vt 0.9844 0.9063 +vt 1 0.9063 +vt 1 1 +vt 0.9844 1 +vt 0.9844 0.9063 +vt 1 0.9063 +vt 1 1 +vt 1 0.3281 +vt 0.9531 0.3281 +vt 0.9531 0.25 +vt 1 0.25 +vt 1 0.8281 +vt 1 0.9063 +vt 0.9844 0.9063 +vt 0.9844 0.8281 +vt 1 0.8281 +vt 1 0.9063 +vt 0.9844 0.9063 +vt 0.9844 0.8281 +vt 0.75 0.9063 +vt 0.7969 0.9063 +vt 0.7969 1 +vt 0.75 1 +vt 1 0.9063 +vt 1 0.9531 +vt 0.9844 0.9531 +vt 0.9844 0.9063 +vt 0.75 0.25 +vt 0.7969 0.25 +vt 0.7969 0.3281 +vt 0.75 0.3281 +vt 0.9531 0.9063 +vt 0.9531 1 +vt 1 1 +vt 1 0.9063 +vt 1 0.9531 +vt 0.9844 0.9531 +vt 0.9844 1 +vt 1 1 +vt 1 0.9063 +vt 0.9844 0.9063 +vt 0.9844 1 +vt 1 1 +vt 1 0.9063 +vt 0.9844 0.9063 +vt 0.9844 1 +vt 1 1 +vt 0.9531 0.25 +vt 0.9531 0.3281 +vt 1 0.3281 +vt 1 0.25 +vt 0.9844 0.9063 +vt 1 0.9063 +vt 1 0.8281 +vt 0.9844 0.8281 +vt 0.9844 0.9063 +vt 1 0.9063 +vt 1 0.8281 +vt 0.9844 0.8281 +vt 0.7969 1 +vt 0.7969 0.9063 +vt 0.75 0.9063 +vt 0.75 1 +vt 0.9844 0.9531 +vt 1 0.9531 +vt 1 0.9063 +vt 0.9844 0.9063 +vt 0.7969 0.3281 +vt 0.7969 0.25 +vt 0.75 0.25 +vt 0.75 0.3281 +vt 0.2813 0.1875 +vt 0.3438 0.1875 +vt 0.3438 0.3125 +vt 0.2813 0.3125 +vt 0.2813 0.1875 +vt 0.3438 0.1875 +vt 0.3438 0.3125 +vt 0.2813 0.3125 +vt 0.0625 0.1875 +vt 0.0625 0.3125 +vt 0 0.3125 +vt 0 0.1875 +vt 0.1875 0.1875 +vt 0.1875 0.3125 +vt 0.125 0.3125 +vt 0.125 0.1875 +vt 0.4063 0.3125 +vt 0.3438 0.3125 +vt 0.3438 0.1875 +vt 0.4063 0.1875 +vt 0.4063 0.3125 +vt 0.3438 0.3125 +vt 0.3438 0.1875 +vt 0.4063 0.1875 +vt 0.125 0.5625 +vt 0.125 0.4375 +vt 0.1875 0.4375 +vt 0.1875 0.5625 +vt 0 0.5625 +vt 0 0.4375 +vt 0.0625 0.4375 +vt 0.0625 0.5625 +vt 0.7344 0.2188 +vt 0.7344 0.2656 +vt 0.6875 0.2656 +vt 0.6875 0.2188 +vt 0.7031 0.2188 +vt 0.7031 0.2656 +vt 0.6875 0.2656 +vt 0.6875 0.2188 +vt 0.7344 0.2188 +vt 0.7344 0.2656 +vt 0.7188 0.2656 +vt 0.7188 0.2188 +vt 0.7344 0.2188 +vt 0.7344 0.2656 +vt 0.7188 0.2656 +vt 0.7188 0.2188 +vt 0.7031 0.2188 +vt 0.7031 0.2656 +vt 0.6875 0.2656 +vt 0.6875 0.2188 +vt 0 1 +vt 0 0.9688 +vt 0.0469 0.9688 +vt 0.0469 1 +vt 0.9531 1 +vt 0.9531 0.9688 +vt 1 0.9688 +vt 1 1 +vt 0 1 +vt 0 0.9688 +vt 0.0859 0.9688 +vt 0.0859 1 +vt 0.9141 1 +vt 0.9141 0.9688 +vt 1 0.9688 +vt 1 1 +vt 0.9375 1 +vt 0.9375 0.9688 +vt 1 0.9688 +vt 1 1 +vt 0 1 +vt 0 0.9688 +vt 0.0625 0.9688 +vt 0.0625 1 +vt 0.0859 0 +vt 0.0859 0.0156 +vt 0 0.0156 +vt 0 0 +vt 1 0 +vt 1 0.0156 +vt 0.9375 0.0156 +vt 0.9375 0 +vt 0.0469 0 +vt 0.0469 0.0156 +vt 0 0.0156 +vt 0 0 +vt 1 0 +vt 1 0.0156 +vt 0.9531 0.0156 +vt 0.9531 0 +vt 0.0625 0 +vt 0.0625 0.0156 +vt 0 0.0156 +vt 0 0 +vt 1 0 +vt 1 0.0156 +vt 0.9141 0.0156 +vt 0.9141 0 +vt 0.125 0.5 +vt 0.125 0.5625 +vt 0.0625 0.5625 +vt 0.0625 0.5 +vt 0.0938 0.5 +vt 0.0938 0.5625 +vt 0.0625 0.5625 +vt 0.0625 0.5 +vt 0.0938 0.5625 +vt 0.0938 0.5 +vt 0.0625 0.5 +vt 0.0625 0.5625 +vt 0.0938 0.5 +vt 0.0938 0.5625 +vt 0.0625 0.5625 +vt 0.0625 0.5 +vt 0.0625 0.5 +vt 0.0625 0.5625 +vt 0.125 0.5625 +vt 0.125 0.5 +vt 0.125 0.5 +vt 0.125 0.5625 +vt 0.0625 0.5625 +vt 0.0625 0.5 +vt 0.0938 0.5 +vt 0.0938 0.5625 +vt 0.0625 0.5625 +vt 0.0625 0.5 +vt 0.0938 0.5625 +vt 0.0938 0.5 +vt 0.0625 0.5 +vt 0.0625 0.5625 +vt 0.0938 0.5 +vt 0.0938 0.5625 +vt 0.0625 0.5625 +vt 0.0625 0.5 +vt 0.25 0.3125 +vt 0.25 0.375 +vt 0.3125 0.375 +vt 0.3125 0.3125 +vt 0.3125 0.3125 +vt 0.3125 0.375 +vt 0.25 0.375 +vt 0.25 0.3125 +vt 0.2813 0.3125 +vt 0.2813 0.375 +vt 0.25 0.375 +vt 0.25 0.3125 +vt 0.2813 0.375 +vt 0.2813 0.3125 +vt 0.25 0.3125 +vt 0.25 0.375 +vt 0.2813 0.3125 +vt 0.2813 0.375 +vt 0.25 0.375 +vt 0.25 0.3125 +vt 0.25 0.3125 +vt 0.25 0.375 +vt 0.3125 0.375 +vt 0.3125 0.3125 +vt 0.3125 0.3125 +vt 0.3125 0.375 +vt 0.25 0.375 +vt 0.25 0.3125 +vt 0.2813 0.3125 +vt 0.2813 0.375 +vt 0.25 0.375 +vt 0.25 0.3125 +vt 0.2813 0.375 +vt 0.2813 0.3125 +vt 0.25 0.3125 +vt 0.25 0.375 +vt 0.2813 0.3125 +vt 0.2813 0.375 +vt 0.25 0.375 +vt 0.25 0.3125 +vt 0.0469 0.9844 +vt 0.0469 1 +vt 0 1 +vt 0 0.9844 +vt 0.0469 0.9844 +vt 0.0469 1 +vt 0 1 +vt 0 0.9844 +vt 0.0156 0.9531 +vt 0.0156 1 +vt 0 1 +vt 0 0.9531 +vt 0.0156 0.9531 +vt 0.0156 1 +vt 0 1 +vt 0 0.9531 +vt 0.5469 0.0469 +vt 0.5781 0.0469 +vt 0.5781 0 +vt 0.5469 0 +vt 0.5781 0 +vt 0.5469 0 +vt 0.5469 0.0469 +vt 0.5781 0.0469 +vt 0.5781 0 +vt 0.5781 0.0469 +vt 0.5469 0.0469 +vt 0.5469 0 +vt 0.5469 0.0469 +vt 0.5469 0 +vt 0.5781 0 +vt 0.5781 0.0469 +vt 0.5938 0.0156 +vt 0.5938 0.0469 +vt 0.5625 0.0469 +vt 0.5625 0.0156 +vt 0.5938 0.0156 +vt 0.5938 0.0469 +vt 0.5625 0.0469 +vt 0.5625 0.0156 +vt 0.8281 0.2813 +vt 0.8281 0.2188 +vt 0.8438 0.2188 +vt 0.8438 0.2813 +vt 0.8281 0.2813 +vt 0.8281 0.2188 +vt 0.8438 0.2188 +vt 0.8438 0.2813 +vt 0.125 0.9844 +vt 0.2656 0.9844 +vt 0.2656 1 +vt 0.125 1 +vt 0.2813 0.9375 +vt 0.4219 0.9375 +vt 0.4219 1 +vt 0.2813 1 +vt 0.5 0.25 +vt 0.3594 0.25 +vt 0.3594 0.1875 +vt 0.5 0.1875 +vt 0.2813 0.75 +vt 0.4219 0.75 +vt 0.4219 0.9375 +vt 0.2813 0.9375 +vt 0.8438 0.0313 +vt 0.8438 0.2188 +vt 0.8281 0.2188 +vt 0.8281 0.0313 +vt 0.5 0.1875 +vt 0.3594 0.1875 +vt 0.3594 0 +vt 0.5 0 +vt 0.8438 0.0313 +vt 0.8438 0.2188 +vt 0.8281 0.2188 +vt 0.8281 0.0313 +vt 0.5625 0.9375 +vt 0.4219 0.9375 +vt 0.4219 0.75 +vt 0.5625 0.75 +vt 0 0 +vt 0.1406 0 +vt 0.1406 0.1875 +vt 0 0.1875 +vt 0 0.1875 +vt 0.1406 0.1875 +vt 0.1406 0.25 +vt 0 0.25 +vt 0.4063 1 +vt 0.2656 1 +vt 0.2656 0.9844 +vt 0.4063 0.9844 +vt 0.5625 1 +vt 0.4219 1 +vt 0.4219 0.9375 +vt 0.5625 0.9375 +vt 0.5625 0.2344 +vt 0.5625 0.2188 +vt 0.5313 0.2188 +vt 0.5313 0.2344 +vt 0.5313 0.0313 +vt 0.5313 0.2188 +vt 0.5625 0.2188 +vt 0.5625 0.0313 +vt 0.5313 0.2344 +vt 0.5313 0.25 +vt 0.5625 0.2813 +vt 0.5625 0.2344 +vt 0.5625 0.2344 +vt 0.5625 0.2813 +vt 0.5313 0.25 +vt 0.5313 0.2344 +vt 0.5625 1 +vt 0.4219 1 +vt 0.4219 0.9531 +vt 0.5625 0.9531 +vt 0 0.1875 +vt 0.1406 0.1875 +vt 0.1406 0.2344 +vt 0 0.2344 +vt 0.5625 0.9531 +vt 0.4219 0.9531 +vt 0.4219 0.9375 +vt 0.5625 0.9375 +vt 0.2813 0.9531 +vt 0.4219 0.9531 +vt 0.4219 1 +vt 0.2813 1 +vt 0.2813 0.9375 +vt 0.4219 0.9375 +vt 0.4219 0.9531 +vt 0.2813 0.9531 +vt 0.5156 0.2344 +vt 0.375 0.2344 +vt 0.375 0.1875 +vt 0.5156 0.1875 +vt 0 0.125 +vt 0.1406 0.125 +vt 0.1406 0.25 +vt 0 0.25 +vt 0.5625 0.2813 +vt 0.7031 0.2813 +vt 0.7031 0.1563 +vt 0.5625 0.1563 +vt 0.0156 0.7344 +vt 0.0156 0.875 +vt 0 0.875 +vt 0 0.7344 +vt 0 0 +vt 0.1406 0 +vt 0.1406 0.125 +vt 0 0.125 +vt 0.5625 0.1563 +vt 0.7031 0.1563 +vt 0.7031 0.0313 +vt 0.5625 0.0313 +vt 0.5 0.125 +vt 0.375 0.125 +vt 0.375 0 +vt 0.5 0 +vt 0.8281 0.0313 +vt 0.7031 0.0313 +vt 0.7031 0.1563 +vt 0.8281 0.1563 +vt 0.8281 0.1563 +vt 0.7031 0.1563 +vt 0.7031 0.2813 +vt 0.8281 0.2813 +vt 0 1 +vt 0 0.875 +vt 0.0156 0.875 +vt 0.0156 1 +vt 0.5 0.25 +vt 0.375 0.25 +vt 0.375 0.125 +vt 0.5 0.125 +vt 0.5469 0.7344 +vt 0.5469 0.9375 +vt 0.2969 0.9375 +vt 0.2969 0.7344 +vt 0.8438 0.0313 +vt 0.8438 0.2344 +vt 0.9688 0.2344 +vt 1 0.0313 +vt 1 0.0313 +vt 0.9688 0.2344 +vt 0.8438 0.2344 +vt 0.8438 0.0313 +vt 0.0156 0.875 +vt 0.0156 1 +vt 0 1 +vt 0 0.875 +vt 0.0156 0.7945 +vt 0.0156 1 +vt 0 1 +vt 0 0.7945 +vt 0.5 1 +vt 0.5 0.8906 +vt 0.75 0.8906 +vt 0.75 1 +vt 0.5313 0.0313 +vt 0.5313 0.25 +vt 0.2813 0.25 +vt 0.2813 0.0313 +vt 0.0156 0.75 +vt 0.0156 1 +vt 0 1 +vt 0 0.75 +vt 0.5313 0.2344 +vt 0.5313 0.2188 +vt 0.5625 0.2188 +vt 0.5625 0.2344 +vt 0.5625 0.0313 +vt 0.5625 0.2188 +vt 0.5313 0.2188 +vt 0.5313 0.0313 +vt 0 0.125 +vt 0.1406 0.125 +vt 0.1406 0.25 +vt 0 0.25 +vt 0.8281 0.2813 +vt 0.6875 0.2813 +vt 0.6875 0.1563 +vt 0.8281 0.1563 +vt 0.0156 0.7344 +vt 0.0156 0.875 +vt 0 0.875 +vt 0 0.7344 +vt 0 0 +vt 0.1406 0 +vt 0.1406 0.125 +vt 0 0.125 +vt 0.8281 0.1563 +vt 0.6875 0.1563 +vt 0.6875 0.0313 +vt 0.8281 0.0313 +vt 0.5 0.125 +vt 0.375 0.125 +vt 0.375 0 +vt 0.5 0 +vt 0.5625 0.0313 +vt 0.6875 0.0313 +vt 0.6875 0.1563 +vt 0.5625 0.1563 +vt 0.5625 0.1563 +vt 0.6875 0.1563 +vt 0.6875 0.2813 +vt 0.5625 0.2813 +vt 0 1 +vt 0 0.875 +vt 0.0156 0.875 +vt 0.0156 1 +vt 0.5 0.25 +vt 0.375 0.25 +vt 0.375 0.125 +vt 0.5 0.125 +vt 0.8438 0.0313 +vt 0.8438 0.2344 +vt 0.9688 0.2344 +vt 1 0.0313 +vt 0.0156 0.875 +vt 0.0156 1 +vt 0 1 +vt 0 0.875 +vt 0.0156 0.7945 +vt 0.0156 1 +vt 0 1 +vt 0 0.7945 +vt 1 0.0313 +vt 0.9688 0.2344 +vt 0.8438 0.2344 +vt 0.8438 0.0313 +vt 0.6406 0.2031 +vt 0.6406 0.2656 +vt 0.625 0.2656 +vt 0.625 0.2031 +vt 0.6875 0.25 +vt 0.6875 0.2656 +vt 0.625 0.2656 +vt 0.625 0.25 +vt 0.6875 0.2031 +vt 0.6875 0.2656 +vt 0.625 0.2656 +vt 0.625 0.2031 +vt 0.625 0.2656 +vt 0.6875 0.2656 +vt 0.6875 0.25 +vt 0.625 0.25 +vt 0.625 0.2656 +vt 0.6875 0.2656 +vt 0.6875 0.2031 +vt 0.625 0.2031 +vt 0.2656 0.2656 +vt 0.2656 0.375 +vt 0.0156 0.375 +vt 0.0156 0.2656 +vt 0.7344 0.2656 +vt 0.7344 0.375 +vt 0.4844 0.375 +vt 0.4844 0.2656 +vt 0.5 1 +vt 0.5 0.7813 +vt 0 0.7813 +vt 0 1 +vt 0.5 0.7813 +vt 0.5 1 +vt 0 1 +vt 0 0.7813 +vt 0.5 0.75 +vt 0.5 0.8125 +vt 0 0.8125 +vt 0 0.75 +vt 0.25 0.25 +vt 0.25 0.125 +vt 0.2813 0.125 +vt 0.2813 0.25 +vt 0 1 +vt 0.1406 1 +vt 0.1406 0.9688 +vt 0 0.9688 +vt 1 0.9688 +vt 0.8594 0.9688 +vt 0.8594 1 +vt 1 1 +vt 0.75 1 +vt 0.6094 1 +vt 0.6094 0.875 +vt 0.75 0.875 +vt 0 0.875 +vt 0.1406 0.875 +vt 0.1406 1 +vt 0 1 +vt 0 0.75 +vt 0.1406 0.75 +vt 0.1406 0.875 +vt 0 0.875 +vt 0.75 0.3594 +vt 0.6094 0.3594 +vt 0.6094 0.2344 +vt 0.75 0.2344 +vt 0.2813 0 +vt 0.2813 0.125 +vt 0.25 0.125 +vt 0.25 0 +vt 0.2813 0.875 +vt 0.1406 0.875 +vt 0.1406 0.75 +vt 0.2813 0.75 +vt 0.75 1 +vt 0.8906 1 +vt 0.8906 0.9688 +vt 0.75 0.9688 +vt 0 0.2344 +vt 0.1406 0.2344 +vt 0.1406 0.3594 +vt 0 0.3594 +vt 0 0.875 +vt 0.1406 0.875 +vt 0.1406 1 +vt 0 1 +vt 0 0.9688 +vt 0.1406 0.9688 +vt 0.1406 1 +vt 0 1 +vt 0.2813 1 +vt 0.1406 1 +vt 0.1406 0.875 +vt 0.2813 0.875 +vt 0.25 0 +vt 0.25 0.125 +vt 0.2813 0.125 +vt 0.2813 0 +vt 0.2813 0.25 +vt 0.2813 0.125 +vt 0.25 0.125 +vt 0.25 0.25 +vt 0.1094 1 +vt 0.1719 1 +vt 0.1719 0.9844 +vt 0.1094 0.9844 +vt 0.1719 1 +vt 0.1094 1 +vt 0.1094 0.9844 +vt 0.1719 0.9844 +vt 0.4219 0.2344 +vt 0.4219 0.1563 +vt 0.4844 0.1563 +vt 0.4844 0.2344 +vt 0.0625 0.3281 +vt 0.0625 0.25 +vt 0 0.25 +vt 0 0.3281 +vt 0.0781 0.9844 +vt 0.0781 1 +vt 0.1406 1 +vt 0.1406 0.9844 +vt 0.0625 0.3438 +vt 0.0625 0.2656 +vt 0 0.2656 +vt 0 0.3438 +vt 0.6875 0.25 +vt 0.6875 0.3281 +vt 0.75 0.3281 +vt 0.75 0.25 +vt 0.0781 1 +vt 0.0781 0.9844 +vt 0.0156 0.9844 +vt 0.0156 1 +vt 0 1 +vt 0.3125 1 +vt 0.3125 0.9844 +vt 0 0.9844 +vt 0 1 +vt 0.3125 1 +vt 0.3125 0.9844 +vt 0 0.9844 +vt 0.1094 0.1719 +vt 0.3906 0.1719 +vt 0.3906 0.2344 +vt 0.1094 0.2344 +vt 0 0.0625 +vt 0.2813 0.0625 +vt 0.2813 0 +vt 0 0 +vt 0.7344 0.3125 +vt 0.4531 0.3125 +vt 0.4531 0.25 +vt 0.7344 0.25 +vt 0.2813 0.9375 +vt 0 0.9375 +vt 0 1 +vt 0.2813 1 +vt 0.1094 1 +vt 0.1719 1 +vt 0.1719 0.9844 +vt 0.1094 0.9844 +vt 0.1719 1 +vt 0.1094 1 +vt 0.1094 0.9844 +vt 0.1719 0.9844 +vt 0.6875 0.25 +vt 0.6875 0.3281 +vt 0.75 0.3281 +vt 0.75 0.25 +vt 0.0625 0.3281 +vt 0.0625 0.25 +vt 0 0.25 +vt 0 0.3281 +vt 0.0781 0.9844 +vt 0.0781 1 +vt 0.1406 1 +vt 0.1406 0.9844 +vt 0.0781 0.0781 +vt 0.0781 0 +vt 0.0156 0 +vt 0.0156 0.0781 +vt 0.6875 0.25 +vt 0.6875 0.3281 +vt 0.75 0.3281 +vt 0.75 0.25 +vt 0.0781 1 +vt 0.0781 0.9844 +vt 0.0156 0.9844 +vt 0.0156 1 +vt 0 0.9062 +vt 0 0.7812 +vt 0.0156 0.7812 +vt 0.0156 0.9063 +vt 0.0938 0.9844 +vt 0.2188 0.9844 +vt 0.2188 1 +vt 0.0938 1 +vt 0.3906 0.1875 +vt 0.5 0.1875 +vt 0.5 0.25 +vt 0.3906 0.25 +vt 0.0156 0.0781 +vt 0.125 0.0781 +vt 0.125 0.0156 +vt 0.0156 0.0156 +vt 0.75 0.3125 +vt 0.6406 0.3125 +vt 0.6406 0.25 +vt 0.75 0.25 +vt 0.125 0.9375 +vt 0.0156 0.9375 +vt 0.0156 1 +vt 0.125 1 +vt 0.1719 0.9844 +vt 0.1719 1 +vt 0.1094 1 +vt 0.1094 0.9844 +vt 0.1094 0.9844 +vt 0.1094 1 +vt 0.1719 1 +vt 0.1719 0.9844 +vt 0.4844 0.1563 +vt 0.4219 0.1563 +vt 0.4219 0.2344 +vt 0.4844 0.2344 +vt 0 0.25 +vt 0.0625 0.25 +vt 0.0625 0.3281 +vt 0 0.3281 +vt 0.1406 1 +vt 0.0781 1 +vt 0.0781 0.9844 +vt 0.1406 0.9844 +vt 0 0.2656 +vt 0.0625 0.2656 +vt 0.0625 0.3438 +vt 0 0.3438 +vt 0.75 0.3281 +vt 0.6875 0.3281 +vt 0.6875 0.25 +vt 0.75 0.25 +vt 0.0156 0.9844 +vt 0.0781 0.9844 +vt 0.0781 1 +vt 0.0156 1 +vt 0.3125 0.9844 +vt 0.3125 1 +vt 0 1 +vt 0 0.9844 +vt 0.3125 0.9844 +vt 0.3125 1 +vt 0 1 +vt 0 0.9844 +vt 0.3906 0.2344 +vt 0.3906 0.1719 +vt 0.1094 0.1719 +vt 0.1094 0.2344 +vt 0.2813 0 +vt 0.2813 0.0625 +vt 0 0.0625 +vt 0 0 +vt 0.4531 0.25 +vt 0.4531 0.3125 +vt 0.7344 0.3125 +vt 0.7344 0.25 +vt 0 1 +vt 0 0.9375 +vt 0.2813 0.9375 +vt 0.2813 1 +vt 0.1719 0.9844 +vt 0.1719 1 +vt 0.1094 1 +vt 0.1094 0.9844 +vt 0.1094 0.9844 +vt 0.1094 1 +vt 0.1719 1 +vt 0.1719 0.9844 +vt 0.75 0.3281 +vt 0.6875 0.3281 +vt 0.6875 0.25 +vt 0.75 0.25 +vt 0 0.25 +vt 0.0625 0.25 +vt 0.0625 0.3281 +vt 0 0.3281 +vt 0.1406 1 +vt 0.0781 1 +vt 0.0781 0.9844 +vt 0.1406 0.9844 +vt 0.0156 0 +vt 0.0781 0 +vt 0.0781 0.0781 +vt 0.0156 0.0781 +vt 0.75 0.3281 +vt 0.6875 0.3281 +vt 0.6875 0.25 +vt 0.75 0.25 +vt 0.0156 0.9844 +vt 0.0781 0.9844 +vt 0.0781 1 +vt 0.0156 1 +vt 0.0938 1 +vt 0.0938 0.9844 +vt 0.2188 0.9844 +vt 0.2188 1 +vt 0.0156 0.8125 +vt 0 0.8125 +vt 0 0.6875 +vt 0.0156 0.6875 +vt 0.5 0.25 +vt 0.5 0.1875 +vt 0.3906 0.1875 +vt 0.3906 0.25 +vt 0.125 0.0156 +vt 0.125 0.0781 +vt 0.0156 0.0781 +vt 0.0156 0.0156 +vt 0.6406 0.25 +vt 0.6406 0.3125 +vt 0.75 0.3125 +vt 0.75 0.25 +vt 0.0156 1 +vt 0.0156 0.9375 +vt 0.125 0.9375 +vt 0.125 1 +vt 0.2656 0.3281 +vt 0.2813 0.3281 +vt 0.2813 0.3594 +vt 0.2656 0.3594 +vt 0.2656 0.3281 +vt 0.2813 0.3281 +vt 0.2813 0.3594 +vt 0.2656 0.3594 +vt 0.2656 0.25 +vt 0.2813 0.25 +vt 0.2813 0.3594 +vt 0.2656 0.3594 +vt 0.25 0.25 +vt 0.2656 0.25 +vt 0.2656 0.3594 +vt 0.25 0.3594 +vt 0.2656 0.3281 +vt 0.2813 0.3281 +vt 0.2813 0.3594 +vt 0.2656 0.3594 +vt 0.2656 0.3281 +vt 0.2813 0.3281 +vt 0.2813 0.3594 +vt 0.2656 0.3594 +vt 0.2656 0.25 +vt 0.2813 0.25 +vt 0.2813 0.3594 +vt 0.2656 0.3594 +vt 0.25 0.25 +vt 0.2656 0.25 +vt 0.2656 0.3594 +vt 0.25 0.3594 +vt 0.8125 0.4063 +vt 0.8125 0.4219 +vt 0.5156 0.4219 +vt 0.5156 0.4063 +vt 0.8125 0.4063 +vt 0.8125 0.4219 +vt 0.5156 0.4219 +vt 0.5156 0.4063 +vt 0.5156 0.2813 +vt 0.8125 0.2813 +vt 0.8125 0.4219 +vt 0.5156 0.4219 +vt 0.8125 0.4219 +vt 0.5156 0.4219 +vt 0.5156 0.2813 +vt 0.8125 0.2813 +vt 0.7969 0.2813 +vt 0.8125 0.2813 +vt 0.8125 0.4219 +vt 0.7969 0.4219 +vt 0.7969 0.2813 +vt 0.8125 0.2813 +vt 0.8125 0.4219 +vt 0.7969 0.4219 +vt 0 0.75 +vt 0.5 0.75 +vt 0.5 0.9375 +vt 0 0.9375 +vt 0 0.9375 +vt 0.5 0.9375 +vt 0.5 0.75 +vt 0 0.75 +vt 0 0.8125 +vt 0.5 0.8125 +vt 0.5 0.75 +vt 0 0.75 +vt 0.0781 0.8 +vt 0.0781 0.8125 +vt 0 0.8125 +vt 0 0.8 +vt 0.0781 0.7375 +vt 0.0781 0.75 +vt 0 0.75 +vt 0 0.7375 +vt 0 0.7344 +vt 0 0.8125 +vt 0.0781 0.8125 +vt 0.0781 0.7344 +vt 0.0781 0.7969 +vt 0.0781 0.8125 +vt 0 0.8125 +vt 0 0.7969 +vt 0.0781 0.75 +vt 0.0781 0.7344 +vt 0 0.7344 +vt 0 0.75 +vt 0.0781 0.8 +vt 0.0781 0.8125 +vt 0 0.8125 +vt 0 0.8 +vt 0.0781 0.7375 +vt 0.0781 0.75 +vt 0 0.75 +vt 0 0.7375 +vt 0 0.7344 +vt 0 0.8125 +vt 0.0781 0.8125 +vt 0.0781 0.7344 +vt 0.0781 0.7969 +vt 0.0781 0.8125 +vt 0 0.8125 +vt 0 0.7969 +vt 0.0781 0.75 +vt 0.0781 0.7344 +vt 0 0.7344 +vt 0 0.75 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn 0 -1 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 -1 +vn 0 0 1 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 1 +vn 0 1 0 +vn 0 1 0 +vn 0 0 -1 +vn 0 0 -1 +vn 0 -1 0 +vn 1 0 0 +vn 0 1 0 +vn 0 0 -1 +vn 0 0 1 +vn 1 0 0 +vn 0 1 0 +vn 0 0 -1 +vn 0 0 1 +vn 0.16 0.99 0 +vn -0.16 -0.99 0 +vn 0 0 1 +vn 0 0 -1 +vn 0.16 0.99 0 +vn -0.16 -0.99 0 +vn 0 1 0 +vn 0 0 1 +vn 0 -1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 1 0 +vn 0.71 0.71 0 +vn -0.71 0.71 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0.71 0.71 0 +vn -0.71 0.71 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn -1 0 0 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 0 -1 0 +vn 0 1 0 +vn -1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 1 +vn 0 -1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn -0.16 0.99 0 +vn 0.16 -0.99 0 +vn 0 0 1 +vn 0 0 -1 +vn -0.16 0.99 0 +vn 0.16 -0.99 0 +vn 0 1 0 +vn 0 0 1 +vn 0 -1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 1 0 +vn 0.71 0.71 0 +vn -0.71 0.71 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0.71 0.71 0 +vn -0.71 0.71 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn -1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn 0 0 -1 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn -1 0 0 +vn 0 -1 0 +vn 0 1 0 +vn 0 0 -1 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 +vn -1 0 0 +vn 0 0 -1 +vn 0 0 1 +vn -0.89 0.45 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0.91 -0.42 0 +vn -0.91 0.42 0 +vn 0.42 0.91 0 +vn -0.42 -0.91 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn -0.89 0 -0.45 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 -0.45 0.89 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 -1 0 +vn -1 0 0 +vn 0 1 0 +vn 1 0 0 +vn 0 -1 0 +vn 0 1 0 +vn 0 1 0 +vn 0 0 1 +vn 0 -1 0 +vn 0 0 1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn 0 1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn -1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn -1 0 0 +vn 0 1 0 +vn -1 0 0 +vn 1 0 0 +vn -1 0 0 +vn 0 0 1 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 1 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 +vn 1 0 0 +vn -1 0 0 +vn 1 0 0 +vn -1 0 0 +vn 0 0 -1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 0 -1 +vn 1 0 0 +vn 1 0 0 +vn -1 0 0 +vn -1 0 0 +vn 0 0 -1 +vn -1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 0 -1 +vn 0 1 0 +vn 0 0 1 +vn 1 0 0 +vn 1 0 0 +vn 1 0 0 +vn -1 0 0 +vn 0 0.71 -0.71 +vn 0 0 1 +vn 0 0 -1 +vn 0 0.71 -0.71 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn -1 0 0 +vn 1 0 0 +vn -1 0 0 +vn 1 0 0 +vn 1 0 0 +vn 0 1 0 +vn -1 0 0 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 0.15 0.99 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn -1 0 0 +vn -1 0 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 1 0 0 +vn -1 0 0 +vn 1 0 0 +vn -1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 0.15 0.99 +vn -1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 1 0 +vn 0 0 -1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 0 0 -1 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 1 +vn 0 1 0 +vn 0 0 -1 +vn 1 0 0 +vn 1 0 0 +vn -1 0 0 +vn 1 0 0 +vn 0 0.8 -0.6 +vn 0 -0.8 0.6 +vn 0 0 -1 +vn 0 0.8 -0.6 +vn 0 -0.8 0.6 +vn 0 0 -1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 1 0 +vn 0 -1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 0.77 0.63 +vn 0 -0.77 -0.63 +vn 0 -0.04 1 +vn 0 0.77 0.63 +vn 0 -0.77 -0.63 +vn 0 -0.04 1 +vn -1 0 0 +vn 1 0 0 +vn 0 -1 -0.04 +vn 0 1 0.04 +vn 0 -1 -0.04 +vn 0 1 0.04 +vn 1 0 0 +vn -1 0 0 +vn 0 0.8 -0.6 +vn 0 -0.8 0.6 +vn 0 0 -1 +vn 0 0.8 -0.6 +vn 0 -0.8 0.6 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 1 0 +vn 0 -1 0 +vn -1 0 0 +vn 1 0 0 +vn 0 0.77 0.63 +vn 0 -0.77 -0.63 +vn 0 -0.04 1 +vn 0 0.77 0.63 +vn 0 -0.77 -0.63 +vn 0 -0.04 1 +vn 1 0 0 +vn -1 0 0 +vn 0 -1 -0.04 +vn 0 1 0.04 +vn 0 -1 -0.04 +vn 0 1 0.04 +vn 0.98 -0.17 0 +vn -0.98 0.17 0 +vn 0 0 1 +vn 0 0 -1 +vn 0.98 -0.17 0 +vn -0.98 0.17 0 +vn 0 0 1 +vn 0 0 -1 +vn 0.98 -0.17 0 +vn -0.98 0.17 0 +vn 0.17 0.98 0 +vn -0.17 -0.98 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 1 0 0 +vn -1 0 0 +vn 0 0.17 0.98 +vn 0 0.98 -0.17 +vn 0 -0.98 0.17 +vn 1 0 0 +vn -1 0 0 +vn 0 0.17 0.98 +vn 0 0.98 -0.17 +vn 0 -0.98 0.17 +usemtl common_thingies +f 1093/3133/784 1091/3134/784 1090/3135/784 1092/3136/784 +f 1090/3137/785 1091/3138/785 1095/3139/785 1094/3140/785 +f 1093/3141/786 1092/3142/786 1096/3143/786 1097/3144/786 +f 1092/3145/787 1090/3146/787 1094/3147/787 1096/3148/787 +f 1097/3149/788 1095/3150/788 1091/3151/788 1093/3152/788 +f 1104/3153/789 1102/3154/789 1103/3155/789 1105/3156/789 +f 1098/3157/790 1099/3158/790 1103/3159/790 1102/3160/790 +f 1101/3161/791 1100/3162/791 1104/3163/791 1105/3164/791 +f 1100/3165/792 1098/3166/792 1102/3167/792 1104/3168/792 +f 1105/3169/793 1103/3170/793 1099/3171/793 1101/3172/793 +f 1109/3173/794 1107/3174/794 1106/3175/794 1108/3176/794 +f 1106/3177/795 1107/3178/795 1111/3179/795 1110/3180/795 +f 1109/3181/796 1108/3182/796 1112/3183/796 1113/3184/796 +f 1108/3185/797 1106/3186/797 1110/3187/797 1112/3188/797 +f 1113/3189/798 1111/3190/798 1107/3191/798 1109/3192/798 +usemtl common_rough_steel_painted +f 1123/3193/799 1126/3194/799 1130/3195/799 1119/3196/799 +usemtl common_rough_steel +f 1130/3197/800 1131/3198/800 1138/3199/800 1119/3200/800 +usemtl common_rough_steel_painted +f 1121/3201/801 1136/3202/801 1135/3203/801 1127/3204/801 +f 1122/3205/802 1133/3206/802 1132/3207/802 1118/3208/802 +f 1119/3209/803 1138/3210/803 1137/3211/803 1123/3212/803 +f 1121/3213/804 1127/3214/804 1126/3215/804 1123/3216/804 +f 1123/3217/805 1137/3218/805 1136/3219/805 1121/3220/805 +f 1120/3221/806 1134/3222/806 1133/3223/806 1122/3224/806 +f 1122/3225/807 1126/3226/807 1127/3227/807 1120/3228/807 +f 1127/3229/808 1135/3230/808 1134/3231/808 1120/3232/808 +usemtl common_rough_steel +f 1118/3233/809 1132/3234/809 1131/3235/809 1130/3236/809 +usemtl common_rough_steel_painted +f 1118/3237/810 1130/3238/810 1126/3239/810 1122/3240/810 +usemtl common_rough_steel +f 1129/3241/811 1131/3242/811 1132/3243/811 1114/3244/811 +usemtl common_rough_steel_painted +f 1114/3245/812 1132/3246/812 1133/3247/812 1125/3248/812 +f 1125/3249/813 1133/3250/813 1134/3251/813 1116/3252/813 +f 1116/3253/814 1134/3254/814 1135/3255/814 1128/3256/814 +f 1128/3257/815 1135/3258/815 1136/3259/815 1117/3260/815 +f 1117/3261/816 1136/3262/816 1137/3263/816 1124/3264/816 +f 1124/3265/817 1137/3266/817 1138/3267/817 1115/3268/817 +usemtl common_rough_steel +f 1115/3269/818 1138/3270/818 1131/3271/818 1129/3272/818 +usemtl common_steel_norivets +f 1145/3273/819 1143/3274/819 1144/3275/819 1146/3276/819 +f 1139/3277/820 1140/3278/820 1144/3279/820 1143/3280/820 +f 1141/3281/821 1139/3282/821 1143/3283/821 1145/3284/821 +f 1146/3285/822 1144/3286/822 1140/3287/822 1142/3288/822 +f 1153/3289/823 1151/3290/823 1152/3291/823 1154/3292/823 +f 1147/3293/824 1148/3294/824 1152/3295/824 1151/3296/824 +f 1149/3297/825 1147/3298/825 1151/3299/825 1153/3300/825 +f 1154/3301/826 1152/3302/826 1148/3303/826 1150/3304/826 +usemtl common_rough_steel_painted +f 1172/3305/827 1167/3306/827 1164/3307/827 1160/3308/827 +usemtl common_rough_steel +f 1170/3309/828 1171/3310/828 1162/3311/828 1165/3312/828 +usemtl common_steel_painted_norivets +f 1168/3313/829 1169/3314/829 1161/3315/829 1159/3316/829 +f 1171/3317/830 1172/3318/830 1160/3319/830 1162/3320/830 +usemtl common_rough_steel_painted +f 1167/3321/831 1168/3322/831 1159/3323/831 1164/3324/831 +usemtl common_rough_steel +f 1169/3325/832 1170/3326/832 1165/3327/832 1161/3328/832 +usemtl common_steel_painted_norivets +f 1168/3329/833 1167/3330/833 1163/3331/833 1155/3332/833 +f 1169/3333/834 1168/3334/834 1155/3335/834 1157/3336/834 +usemtl common_rough_steel +f 1170/3337/835 1169/3338/835 1157/3339/835 1166/3340/835 +f 1171/3341/836 1170/3342/836 1166/3343/836 1158/3344/836 +usemtl common_steel_painted_norivets +f 1172/3345/837 1171/3346/837 1158/3347/837 1156/3348/837 +f 1167/3349/838 1172/3350/838 1156/3351/838 1163/3352/838 +usemtl tracked_motorbike +f 1176/3353/839 1174/3354/839 1173/3355/839 1175/3356/839 +f 1179/3357/840 1177/3358/840 1178/3359/840 1180/3360/840 +f 1173/3361/841 1174/3362/841 1178/3363/841 1177/3364/841 +f 1176/3365/842 1175/3366/842 1179/3367/842 1180/3368/842 +f 1175/3369/843 1173/3370/843 1177/3371/843 1179/3372/843 +f 1180/3373/844 1178/3374/844 1174/3375/844 1176/3376/844 +f 1182/3377/845 1176/3378/845 1175/3379/845 1181/3380/845 +f 1185/3381/846 1183/3382/846 1184/3383/846 1186/3384/846 +f 1181/3385/847 1175/3386/847 1183/3387/847 1185/3388/847 +f 1186/3389/848 1184/3390/848 1176/3391/848 1182/3392/848 +f 1190/3393/849 1188/3394/849 1187/3395/849 1189/3396/849 +f 1191/3397/850 1179/3398/850 1180/3399/850 1192/3400/850 +f 1189/3401/851 1187/3402/851 1179/3403/851 1191/3404/851 +f 1192/3405/852 1180/3406/852 1188/3407/852 1190/3408/852 +f 1196/3409/853 1194/3410/853 1193/3411/853 1195/3412/853 +f 1199/3413/854 1197/3414/854 1198/3415/854 1200/3416/854 +f 1193/3417/855 1194/3418/855 1198/3419/855 1197/3420/855 +f 1196/3421/856 1195/3422/856 1199/3423/856 1200/3424/856 +f 1195/3425/857 1193/3426/857 1197/3427/857 1199/3428/857 +f 1200/3429/858 1198/3430/858 1194/3431/858 1196/3432/858 +f 1202/3433/859 1196/3434/859 1195/3435/859 1201/3436/859 +f 1205/3437/860 1203/3438/860 1204/3439/860 1206/3440/860 +f 1201/3441/861 1195/3442/861 1203/3443/861 1205/3444/861 +f 1206/3445/862 1204/3446/862 1196/3447/862 1202/3448/862 +f 1210/3449/863 1208/3450/863 1207/3451/863 1209/3452/863 +f 1211/3453/864 1199/3454/864 1200/3455/864 1212/3456/864 +f 1209/3457/865 1207/3458/865 1199/3459/865 1211/3460/865 +f 1212/3461/866 1200/3462/866 1208/3463/866 1210/3464/866 +usemtl common_rough_steel_painted +f 1222/3465/867 1225/3466/867 1229/3467/867 1218/3468/867 +f 1229/3469/868 1230/3470/868 1237/3471/868 1218/3472/868 +usemtl common_rough_steel +f 1220/3473/869 1235/3474/869 1234/3475/869 1226/3476/869 +usemtl common_rough_steel_painted +f 1221/3477/870 1232/3478/870 1231/3479/870 1217/3480/870 +f 1218/3481/871 1237/3482/871 1236/3483/871 1222/3484/871 +f 1220/3485/872 1226/3486/872 1225/3487/872 1222/3488/872 +f 1222/3489/873 1236/3490/873 1235/3491/873 1220/3492/873 +f 1219/3493/874 1233/3494/874 1232/3495/874 1221/3496/874 +f 1221/3497/875 1225/3498/875 1226/3499/875 1219/3500/875 +usemtl common_rough_steel +f 1226/3501/876 1234/3502/876 1233/3503/876 1219/3504/876 +usemtl common_rough_steel_painted +f 1217/3505/877 1231/3506/877 1230/3507/877 1229/3508/877 +f 1217/3509/878 1229/3510/878 1225/3511/878 1221/3512/878 +f 1228/3513/879 1230/3514/879 1231/3515/879 1213/3516/879 +f 1213/3517/880 1231/3518/880 1232/3519/880 1224/3520/880 +f 1224/3521/881 1232/3522/881 1233/3523/881 1215/3524/881 +usemtl common_rough_steel +f 1215/3525/882 1233/3526/882 1234/3527/882 1227/3528/882 +f 1227/3529/883 1234/3530/883 1235/3531/883 1216/3532/883 +usemtl common_rough_steel_painted +f 1216/3533/884 1235/3534/884 1236/3535/884 1223/3536/884 +f 1223/3537/885 1236/3538/885 1237/3539/885 1214/3540/885 +f 1214/3541/886 1237/3542/886 1230/3543/886 1228/3544/886 +usemtl common_steel_norivets +f 1244/3545/887 1242/3546/887 1243/3547/887 1245/3548/887 +f 1238/3549/888 1239/3550/888 1243/3551/888 1242/3552/888 +f 1240/3553/889 1238/3554/889 1242/3555/889 1244/3556/889 +f 1245/3557/890 1243/3558/890 1239/3559/890 1241/3560/890 +usemtl common_thingies +f 1252/3561/891 1250/3562/891 1251/3563/891 1253/3564/891 +f 1246/3565/892 1247/3566/892 1251/3567/892 1250/3568/892 +f 1249/3569/893 1248/3570/893 1252/3571/893 1253/3572/893 +f 1248/3573/894 1246/3574/894 1250/3575/894 1252/3576/894 +f 1253/3577/895 1251/3578/895 1247/3579/895 1249/3580/895 +usemtl common_rough_steel_painted +f 1263/3581/896 1266/3582/896 1271/3583/896 1259/3584/896 +usemtl common_rough_steel +f 1261/3585/897 1270/3586/897 1269/3587/897 1264/3588/897 +usemtl common_steel_painted_norivets +f 1260/3589/898 1268/3590/898 1267/3591/898 1258/3592/898 +f 1259/3593/899 1271/3594/899 1270/3595/899 1261/3596/899 +usemtl common_rough_steel_painted +f 1258/3597/900 1267/3598/900 1266/3599/900 1263/3600/900 +usemtl common_rough_steel +f 1264/3601/901 1269/3602/901 1268/3603/901 1260/3604/901 +usemtl common_steel_painted_norivets +f 1262/3605/902 1266/3606/902 1267/3607/902 1254/3608/902 +f 1254/3609/903 1267/3610/903 1268/3611/903 1256/3612/903 +usemtl common_rough_steel +f 1256/3613/904 1268/3614/904 1269/3615/904 1265/3616/904 +f 1265/3617/905 1269/3618/905 1270/3619/905 1257/3620/905 +usemtl common_steel_painted_norivets +f 1257/3621/906 1270/3622/906 1271/3623/906 1255/3624/906 +f 1255/3625/907 1271/3626/907 1266/3627/907 1262/3628/907 +usemtl tracked_motorbike +f 1275/3629/908 1273/3630/908 1272/3631/908 1274/3632/908 +f 1278/3633/909 1276/3634/909 1277/3635/909 1279/3636/909 +f 1272/3637/910 1273/3638/910 1277/3639/910 1276/3640/910 +f 1275/3641/911 1274/3642/911 1278/3643/911 1279/3644/911 +f 1274/3645/912 1272/3646/912 1276/3647/912 1278/3648/912 +f 1279/3649/913 1277/3650/913 1273/3651/913 1275/3652/913 +f 1281/3653/914 1275/3654/914 1274/3655/914 1280/3656/914 +f 1284/3657/915 1282/3658/915 1283/3659/915 1285/3660/915 +f 1280/3661/916 1274/3662/916 1282/3663/916 1284/3664/916 +f 1285/3665/917 1283/3666/917 1275/3667/917 1281/3668/917 +f 1289/3669/918 1287/3670/918 1286/3671/918 1288/3672/918 +f 1290/3673/919 1278/3674/919 1279/3675/919 1291/3676/919 +f 1288/3677/920 1286/3678/920 1278/3679/920 1290/3680/920 +f 1291/3681/921 1279/3682/921 1287/3683/921 1289/3684/921 +f 1295/3685/922 1293/3686/922 1292/3687/922 1294/3688/922 +f 1298/3689/923 1296/3690/923 1297/3691/923 1299/3692/923 +f 1292/3693/924 1293/3694/924 1297/3695/924 1296/3696/924 +f 1295/3697/925 1294/3698/925 1298/3699/925 1299/3700/925 +f 1294/3701/926 1292/3702/926 1296/3703/926 1298/3704/926 +f 1299/3705/927 1297/3706/927 1293/3707/927 1295/3708/927 +f 1301/3709/928 1295/3710/928 1294/3711/928 1300/3712/928 +f 1304/3713/929 1302/3714/929 1303/3715/929 1305/3716/929 +f 1300/3717/930 1294/3718/930 1302/3719/930 1304/3720/930 +f 1305/3721/931 1303/3722/931 1295/3723/931 1301/3724/931 +f 1309/3725/932 1307/3726/932 1306/3727/932 1308/3728/932 +f 1310/3729/933 1298/3730/933 1299/3731/933 1311/3732/933 +f 1308/3733/934 1306/3734/934 1298/3735/934 1310/3736/934 +f 1311/3737/935 1299/3738/935 1307/3739/935 1309/3740/935 +usemtl common_steel_norivets +f 1318/3741/936 1316/3742/936 1317/3743/936 1319/3744/936 +f 1312/3745/937 1313/3746/937 1317/3747/937 1316/3748/937 +f 1314/3749/938 1312/3750/938 1316/3751/938 1318/3752/938 +f 1319/3753/939 1317/3754/939 1313/3755/939 1315/3756/939 +usemtl tracked_motorbike +f 1320/3757/940 1321/3758/940 1324/3759/940 1323/3760/940 +f 1325/3761/941 1324/3762/941 1321/3763/941 1322/3764/941 +f 1322/3765/942 1321/3766/942 1320/3767/942 1326/3768/942 +f 1327/3769/943 1335/3770/943 1338/3771/943 1331/3772/943 +f 1333/3773/944 1337/3774/944 1336/3775/944 1329/3776/944 +f 1334/3777/945 1332/3778/945 1328/3779/945 1330/3780/945 +f 1330/3781/946 1336/3782/946 1337/3783/946 1334/3784/946 +f 1332/3785/947 1338/3786/947 1335/3787/947 1328/3788/947 +usemtl common_thingies +f 1342/3789/948 1340/3790/948 1339/3791/948 1341/3792/948 +f 1345/3793/949 1343/3794/949 1344/3795/949 1346/3796/949 +f 1339/3797/950 1340/3798/950 1344/3799/950 1343/3800/950 +f 1342/3801/951 1341/3802/951 1345/3803/951 1346/3804/951 +f 1346/3805/952 1344/3806/952 1340/3807/952 1342/3808/952 +usemtl tracked_motorbike +f 1329/3809/953 1330/3810/953 1328/3811/953 1327/3812/953 +f 1334/3813/954 1333/3814/954 1331/3815/954 1332/3816/954 +f 1353/3817/955 1351/3818/955 1352/3819/955 1354/3820/955 +f 1347/3821/956 1348/3822/956 1352/3823/956 1351/3824/956 +f 1349/3825/957 1347/3826/957 1351/3827/957 1353/3828/957 +f 1354/3829/958 1352/3830/958 1348/3831/958 1350/3832/958 +f 1358/3833/959 1356/3834/959 1355/3835/959 1357/3836/959 +f 1361/3837/960 1359/3838/960 1360/3839/960 1362/3840/960 +f 1355/3841/961 1356/3842/961 1360/3843/961 1359/3844/961 +f 1358/3845/962 1357/3846/962 1361/3847/962 1362/3848/962 +f 1357/3849/963 1355/3850/963 1359/3851/963 1361/3852/963 +f 1362/3853/964 1360/3854/964 1356/3855/964 1358/3856/964 +usemtl common_cable_and_pipe +f 1366/3857/965 1364/3858/965 1363/3859/965 1365/3860/965 +f 1369/3861/966 1367/3862/966 1368/3863/966 1370/3864/966 +f 1363/3865/967 1364/3866/967 1368/3867/967 1367/3868/967 +f 1366/3869/968 1365/3870/968 1369/3871/968 1370/3872/968 +f 1370/3873/969 1368/3874/969 1373/3875/969 1374/3876/969 +f 1364/3877/970 1371/3878/970 1373/3879/970 1368/3880/970 +f 1372/3881/971 1366/3882/971 1370/3883/971 1374/3884/971 +f 1374/3885/972 1373/3886/972 1371/3887/972 1372/3888/972 +usemtl common_rough_steel +f 1375/3889/973 1655/3890/973 1654/3891/973 1376/3892/973 +usemtl tracked_motorbike2_paint +f 1381/3893/974 1379/3894/974 1380/3895/974 1382/3896/974 +usemtl common_steel_painted_norivets +f 1375/3897/975 1376/3898/975 1380/3899/975 1379/3900/975 +usemtl tracked_motorbike +f 1386/3901/976 1384/3902/976 1383/3903/976 1385/3904/976 +f 1389/3905/977 1387/3906/977 1388/3907/977 1390/3908/977 +f 1383/3909/978 1384/3910/978 1388/3911/978 1387/3912/978 +f 1385/3913/979 1383/3914/979 1387/3915/979 1389/3916/979 +f 1390/3917/980 1388/3918/980 1384/3919/980 1386/3920/980 +f 1393/3921/981 1391/3922/981 1385/3923/981 1392/3924/981 +f 1395/3925/982 1389/3926/982 1394/3927/982 1396/3928/982 +f 1385/3929/983 1391/3930/983 1394/3931/983 1389/3932/983 +f 1393/3933/984 1392/3934/984 1395/3935/984 1396/3936/984 +f 1392/3937/985 1385/3938/985 1389/3939/985 1395/3940/985 +usemtl tracked_motorbike2_paint +f 1398/3941/986 1404/3942/986 1407/3943/986 1397/3944/986 +f 1400/3945/987 1406/3946/987 1405/3947/987 1402/3948/987 +usemtl common_rough_steel +f 1400/3949/988 1412/3950/988 1411/3951/988 1406/3952/988 +f 1405/3953/989 1408/3954/989 1413/3955/989 1402/3956/989 +usemtl tracked_motorbike2_paint +f 1402/3957/990 1413/3958/990 1412/3959/990 1400/3960/990 +usemtl common_rough_steel +f 1403/3961/991 1409/3962/991 1408/3963/991 1405/3964/991 +usemtl tracked_motorbike2_paint +f 1403/3965/992 1405/3966/992 1406/3967/992 1401/3968/992 +usemtl common_rough_steel +f 1406/3969/993 1411/3970/993 1410/3971/993 1401/3972/993 +usemtl tracked_motorbike2_paint +f 1381/3973/994 1407/3974/994 1404/3975/994 1399/3976/994 +usemtl common_rough_steel +f 1404/3977/995 1408/3978/995 1409/3979/995 1399/3980/995 +f 1381/3981/996 1410/3982/996 1411/3983/996 1407/3984/996 +f 1407/3985/997 1411/3986/997 1412/3987/997 1397/3988/997 +usemtl tracked_motorbike2_paint +f 1397/3989/998 1412/3990/998 1413/3991/998 1398/3992/998 +usemtl common_rough_steel +f 1398/3993/999 1413/3994/999 1408/3995/999 1404/3996/999 +usemtl common_bottom +f 1415/3997/1000 1414/3998/1000 1416/3999/1000 1417/4000/1000 +usemtl tracked_motorbike +f 1421/4001/1001 1419/4002/1001 1418/4003/1001 1420/4004/1001 +f 1424/4005/1002 1422/4006/1002 1423/4007/1002 1425/4008/1002 +f 1418/4009/1003 1419/4010/1003 1423/4011/1003 1422/4012/1003 +f 1421/4013/1004 1420/4014/1004 1424/4015/1004 1425/4016/1004 +f 1420/4017/1005 1418/4018/1005 1422/4019/1005 1424/4020/1005 +f 1425/4021/1006 1423/4022/1006 1419/4023/1006 1421/4024/1006 +f 1429/4025/1007 1427/4026/1007 1426/4027/1007 1428/4028/1007 +f 1432/4029/1008 1430/4030/1008 1431/4031/1008 1433/4032/1008 +f 1426/4033/1009 1427/4034/1009 1431/4035/1009 1430/4036/1009 +f 1429/4037/1010 1428/4038/1010 1432/4039/1010 1433/4040/1010 +f 1428/4041/1011 1426/4042/1011 1430/4043/1011 1432/4044/1011 +f 1433/4045/1012 1431/4046/1012 1427/4047/1012 1429/4048/1012 +usemtl common_steel_norivets +f 1437/4049/1013 1435/4050/1013 1434/4051/1013 1436/4052/1013 +f 1440/4053/1014 1438/4054/1014 1439/4055/1014 1441/4056/1014 +usemtl tracked_motorbike +f 1434/4057/1015 1435/4058/1015 1439/4059/1015 1438/4060/1015 +usemtl common_rough_steel +f 1443/4061/1016 1455/4062/1016 1454/4063/1016 1450/4064/1016 +f 1447/4065/1017 1456/4066/1017 1455/4067/1017 1443/4068/1017 +f 1446/4069/1018 1452/4070/1018 1451/4071/1018 1442/4072/1018 +f 1443/4073/1019 1450/4074/1019 1453/4075/1019 1447/4076/1019 +f 1450/4077/1020 1454/4078/1020 1457/4079/1020 1445/4080/1020 +f 1444/4081/1021 1451/4082/1021 1452/4083/1021 1448/4084/1021 +f 1449/4085/1022 1453/4086/1022 1450/4087/1022 1445/4088/1022 +f 1451/4089/1023 1454/4090/1023 1455/4091/1023 1442/4092/1023 +f 1442/4093/1024 1455/4094/1024 1456/4095/1024 1446/4096/1024 +f 1444/4097/1025 1457/4098/1025 1454/4099/1025 1451/4100/1025 +f 1470/4101/1026 1471/4102/1026 1459/4103/1026 1466/4104/1026 +f 1471/4105/1027 1472/4106/1027 1463/4107/1027 1459/4108/1027 +f 1467/4109/1028 1468/4110/1028 1462/4111/1028 1458/4112/1028 +f 1469/4113/1029 1466/4114/1029 1459/4115/1029 1463/4116/1029 +f 1473/4117/1030 1470/4118/1030 1466/4119/1030 1461/4120/1030 +f 1468/4121/1031 1467/4122/1031 1460/4123/1031 1464/4124/1031 +f 1466/4125/1032 1469/4126/1032 1465/4127/1032 1461/4128/1032 +f 1471/4129/1033 1470/4130/1033 1467/4131/1033 1458/4132/1033 +f 1472/4133/1034 1471/4134/1034 1458/4135/1034 1462/4136/1034 +f 1470/4137/1035 1473/4138/1035 1460/4139/1035 1467/4140/1035 +usemtl tracked_motorbike +f 1474/4141/1036 1482/4142/1036 1485/4143/1036 1475/4144/1036 +f 1479/4145/1037 1484/4146/1037 1483/4147/1037 1478/4148/1037 +f 1483/4149/1038 1486/4150/1038 1488/4151/1038 1478/4152/1038 +f 1480/4153/1039 1487/4154/1039 1486/4155/1039 1483/4156/1039 +f 1480/4157/1040 1483/4158/1040 1484/4159/1040 1481/4160/1040 +f 1477/4161/1041 1485/4162/1041 1482/4163/1041 1476/4164/1041 +f 1482/4165/1042 1486/4166/1042 1487/4167/1042 1476/4168/1042 +f 1474/4169/1043 1488/4170/1043 1486/4171/1043 1482/4172/1043 +usemtl common_thingies +f 1495/4173/1044 1493/4174/1044 1494/4175/1044 1496/4176/1044 +f 1489/4177/1045 1490/4178/1045 1494/4179/1045 1493/4180/1045 +f 1492/4181/1046 1491/4182/1046 1495/4183/1046 1496/4184/1046 +f 1491/4185/1047 1489/4186/1047 1493/4187/1047 1495/4188/1047 +f 1496/4189/1048 1494/4190/1048 1490/4191/1048 1492/4192/1048 +usemtl common_steel_norivets +f 1497/4193/1049 1514/4194/1049 1513/4195/1049 1507/4196/1049 +f 1510/4197/1050 1516/4198/1050 1515/4199/1050 1501/4200/1050 +f 1498/4201/1051 1512/4202/1051 1511/4203/1051 1505/4204/1051 +f 1505/4205/1052 1511/4206/1052 1517/4207/1052 1502/4208/1052 +f 1507/4209/1053 1513/4210/1053 1512/4211/1053 1498/4212/1053 +f 1502/4213/1054 1517/4214/1054 1516/4215/1054 1510/4216/1054 +f 1506/4217/1055 1511/4218/1055 1512/4219/1055 1500/4220/1055 +f 1500/4221/1056 1512/4222/1056 1513/4223/1056 1508/4224/1056 +f 1508/4225/1057 1513/4226/1057 1514/4227/1057 1499/4228/1057 +f 1503/4229/1058 1515/4230/1058 1516/4231/1058 1509/4232/1058 +f 1509/4233/1059 1516/4234/1059 1517/4235/1059 1504/4236/1059 +f 1504/4237/1060 1517/4238/1060 1511/4239/1060 1506/4240/1060 +usemtl tracked_motorbike +f 1524/4241/1061 1522/4242/1061 1523/4243/1061 1525/4244/1061 +f 1518/4245/1062 1519/4246/1062 1523/4247/1062 1522/4248/1062 +f 1520/4249/1063 1518/4250/1063 1522/4251/1063 1524/4252/1063 +f 1525/4253/1064 1523/4254/1064 1519/4255/1064 1521/4256/1064 +f 1529/4257/1065 1527/4258/1065 1526/4259/1065 1528/4260/1065 +f 1532/4261/1066 1530/4262/1066 1531/4263/1066 1533/4264/1066 +f 1526/4265/1067 1527/4266/1067 1531/4267/1067 1530/4268/1067 +f 1528/4269/1068 1526/4270/1068 1530/4271/1068 1532/4272/1068 +f 1533/4273/1069 1531/4274/1069 1527/4275/1069 1529/4276/1069 +f 1537/4277/1070 1535/4278/1070 1534/4279/1070 1536/4280/1070 +f 1504/4281/1071 1538/4282/1071 1539/4283/1071 1540/4284/1071 +f 1534/4285/1072 1535/4286/1072 1539/4287/1072 1538/4288/1072 +f 1536/4289/1073 1534/4290/1073 1538/4291/1073 1504/4292/1073 +f 1540/4293/1074 1539/4294/1074 1535/4295/1074 1537/4296/1074 +f 1544/4297/1075 1542/4298/1075 1541/4299/1075 1543/4300/1075 +f 1547/4301/1076 1545/4302/1076 1546/4303/1076 1548/4304/1076 +f 1541/4305/1077 1542/4306/1077 1546/4307/1077 1545/4308/1077 +f 1543/4309/1078 1541/4310/1078 1545/4311/1078 1547/4312/1078 +f 1548/4313/1079 1546/4314/1079 1542/4315/1079 1544/4316/1079 +usemtl common_steel_norivets +f 1552/4317/1080 1550/4318/1080 1549/4319/1080 1551/4320/1080 +f 1555/4321/1081 1553/4322/1081 1554/4323/1081 1556/4324/1081 +f 1549/4325/1082 1550/4326/1082 1554/4327/1082 1553/4328/1082 +f 1552/4329/1083 1551/4330/1083 1555/4331/1083 1556/4332/1083 +usemtl common_thingies +f 1560/4333/1084 1558/4334/1084 1557/4335/1084 1559/4336/1084 +f 1563/4337/1085 1561/4338/1085 1562/4339/1085 1564/4340/1085 +f 1557/4341/1086 1558/4342/1086 1562/4343/1086 1561/4344/1086 +f 1560/4345/1087 1559/4346/1087 1563/4347/1087 1564/4348/1087 +f 1559/4349/1088 1557/4350/1088 1561/4351/1088 1563/4352/1088 +f 1564/4353/1089 1562/4354/1089 1558/4355/1089 1560/4356/1089 +usemtl tracked_motorbike2_paint +f 1155/4357/1090 1570/4358/1090 1573/4359/1090 1565/4360/1090 +f 1424/4361/1091 1572/4362/1091 1571/4363/1091 1254/4364/1091 +usemtl common_steel_painted_norivets +f 1254/4365/1092 1579/4366/1092 1578/4367/1092 1424/4368/1092 +usemtl tracked_motorbike2_paint +f 1571/4369/1093 1574/4370/1093 1579/4371/1093 1254/4372/1093 +usemtl common_bottom +f 1424/4373/1094 1578/4374/1094 1577/4375/1094 1572/4376/1094 +usemtl tracked_motorbike2_paint +f 1568/4377/1095 1575/4378/1095 1574/4379/1095 1571/4380/1095 +f 1568/4381/1096 1571/4382/1096 1572/4383/1096 1569/4384/1096 +usemtl common_bottom +f 1572/4385/1097 1577/4386/1097 1576/4387/1097 1569/4388/1097 +usemtl tracked_motorbike2_paint +f 1567/4389/1098 1573/4390/1098 1570/4391/1098 1566/4392/1098 +f 1570/4393/1099 1574/4394/1099 1575/4395/1099 1566/4396/1099 +usemtl common_bottom +f 1567/4397/1100 1576/4398/1100 1577/4399/1100 1573/4400/1100 +f 1573/4401/1101 1577/4402/1101 1578/4403/1101 1565/4404/1101 +usemtl common_steel_painted_norivets +f 1565/4405/1102 1578/4406/1102 1579/4407/1102 1155/4408/1102 +usemtl tracked_motorbike2_paint +f 1155/4409/1103 1579/4410/1103 1574/4411/1103 1570/4412/1103 +f 1581/4413/1104 1584/4414/1104 1583/4415/1104 1580/4416/1104 +f 1382/4417/1105 1583/4418/1105 1584/4419/1105 1582/4420/1105 +f 1580/4421/1106 1380/4422/1106 1586/4423/1106 1581/4424/1106 +f 1588/4425/1107 1433/4426/1107 1587/4427/1107 1589/4428/1107 +f 1433/4429/1108 1591/4430/1108 1590/4431/1108 1587/4432/1108 +usemtl common_bottom +f 1588/4433/1109 1592/4434/1109 1591/4435/1109 1433/4436/1109 +usemtl tracked_motorbike2_paint +f 1587/4437/1110 1590/4438/1110 1593/4439/1110 1589/4440/1110 +f 1380/4441/1111 1590/4442/1111 1591/4443/1111 1586/4444/1111 +f 1580/4445/1112 1593/4446/1112 1590/4447/1112 1380/4448/1112 +usemtl common_bottom +f 1586/4449/1113 1591/4450/1113 1592/4451/1113 1581/4452/1113 +f 1598/4453/1114 1601/4454/1114 1605/4455/1114 1594/4456/1114 +usemtl tracked_motorbike2_paint +f 1586/4457/1115 1163/4458/1115 1604/4459/1115 1599/4460/1115 +usemtl common_steel_painted_norivets +f 1594/4461/1116 1605/4462/1116 1163/4463/1116 1586/4464/1116 +usemtl common_bottom +f 1415/4465/1117 1602/4466/1117 1601/4467/1117 1598/4468/1117 +usemtl tracked_motorbike2_paint +f 1599/4469/1118 1604/4470/1118 1603/4471/1118 1582/4472/1118 +usemtl common_bottom +f 1597/4473/1119 1601/4474/1119 1602/4475/1119 1596/4476/1119 +usemtl tracked_motorbike2_paint +f 1567/4477/1120 1603/4478/1120 1604/4479/1120 1600/4480/1120 +f 1600/4481/1121 1604/4482/1121 1163/4483/1121 1565/4484/1121 +usemtl common_steel_painted_norivets +f 1565/4485/1122 1163/4486/1122 1605/4487/1122 1595/4488/1122 +usemtl common_bottom +f 1595/4489/1123 1605/4490/1123 1601/4491/1123 1597/4492/1123 +usemtl tracked_motorbike2_paint +f 1585/4493/1124 1607/4494/1124 1606/4495/1124 1378/4496/1124 +f 1566/4497/1125 1609/4498/1125 1608/4499/1125 1397/4500/1125 +f 1612/4501/1126 1610/4502/1126 1611/4503/1126 1613/4504/1126 +usemtl common_steel_painted_norivets +f 1608/4505/1127 1609/4506/1127 1611/4507/1127 1610/4508/1127 +usemtl tracked_motorbike2_paint +f 1397/4509/1128 1608/4510/1128 1610/4511/1128 1612/4512/1128 +usemtl common_rough_steel +f 1614/4513/1129 1657/4514/1129 1656/4515/1129 1615/4516/1129 +usemtl tracked_motorbike2_paint +f 1618/4517/1130 1587/4518/1130 1617/4519/1130 1401/4520/1130 +usemtl common_steel_painted_norivets +f 1614/4521/1131 1615/4522/1131 1617/4523/1131 1587/4524/1131 +usemtl tracked_motorbike2_paint +f 1589/4525/1132 1621/4526/1132 1620/4527/1132 1588/4528/1132 +f 1619/4529/1133 1620/4530/1133 1621/4531/1133 1618/4532/1133 +usemtl common_bottom +f 1626/4533/1134 1629/4534/1134 1634/4535/1134 1622/4536/1134 +usemtl tracked_motorbike2_paint +f 1424/4537/1135 1633/4538/1135 1632/4539/1135 1627/4540/1135 +usemtl common_steel_painted_norivets +f 1622/4541/1136 1634/4542/1136 1633/4543/1136 1424/4544/1136 +usemtl common_bottom +f 1624/4545/1137 1630/4546/1137 1629/4547/1137 1626/4548/1137 +usemtl tracked_motorbike2_paint +f 1627/4549/1138 1632/4550/1138 1631/4551/1138 1569/4552/1138 +usemtl common_bottom +f 1625/4553/1139 1629/4554/1139 1630/4555/1139 1417/4556/1139 +usemtl tracked_motorbike2_paint +f 1619/4557/1140 1631/4558/1140 1632/4559/1140 1628/4560/1140 +f 1628/4561/1141 1632/4562/1141 1633/4563/1141 1433/4564/1141 +usemtl common_steel_painted_norivets +f 1433/4565/1142 1633/4566/1142 1634/4567/1142 1623/4568/1142 +usemtl common_bottom +f 1623/4569/1143 1634/4570/1143 1629/4571/1143 1625/4572/1143 +usemtl tracked_motorbike2_paint +f 1638/4573/1144 1636/4574/1144 1635/4575/1144 1637/4576/1144 +usemtl common_steel_painted_norivets +f 1635/4577/1145 1636/4578/1145 1640/4579/1145 1639/4580/1145 +usemtl tracked_motorbike2_paint +f 1637/4581/1146 1635/4582/1146 1639/4583/1146 1400/4584/1146 +f 1400/4585/1147 1639/4586/1147 1640/4587/1147 1568/4588/1147 +usemtl common_thingies +f 1646/4589/1148 1644/4590/1148 1645/4591/1148 1647/4592/1148 +f 1641/4593/1149 1642/4594/1149 1645/4595/1149 1644/4596/1149 +f 1643/4597/1150 1641/4598/1150 1644/4599/1150 1646/4600/1150 +f 1652/4601/1151 1649/4602/1151 1648/4603/1151 1651/4604/1151 +f 1651/4605/1152 1648/4606/1152 1650/4607/1152 1653/4608/1152 +usemtl common_rough_steel +f 1378/4609/1153 1654/4610/1153 1655/4611/1153 1377/4612/1153 +f 1616/4613/1154 1656/4614/1154 1657/4615/1154 1585/4616/1154 +usemtl tracked_motorbike +f 1658/4617/1155 1659/4618/1155 1663/4619/1155 1662/4620/1155 +f 1661/4621/1156 1660/4622/1156 1664/4623/1156 1665/4624/1156 +f 1665/4625/1157 1663/4626/1157 1659/4627/1157 1661/4628/1157 +usemtl tracked_motorbike2_paint +f 1668/4629/1158 1670/4630/1158 1673/4631/1158 1617/4632/1158 +usemtl common_steel_painted_norivets +f 1666/4633/1159 1678/4634/1159 1677/4635/1159 1379/4636/1159 +usemtl common_rough_steel +f 1399/4637/1160 1409/4638/1160 1675/4639/1160 1667/4640/1160 +f 1379/4641/1161 1677/4642/1161 1676/4643/1161 1672/4644/1161 +usemtl tracked_motorbike2_paint +f 1671/4645/1162 1674/4646/1162 1678/4647/1162 1666/4648/1162 +f 1667/4649/1163 1675/4650/1163 1674/4651/1163 1671/4652/1163 +usemtl common_rough_steel +f 1672/4653/1164 1676/4654/1164 1409/4655/1164 1399/4656/1164 +usemtl tracked_motorbike2_paint +f 1403/4657/1165 1673/4658/1165 1670/4659/1165 1669/4660/1165 +f 1670/4661/1166 1674/4662/1166 1675/4663/1166 1669/4664/1166 +usemtl common_rough_steel +f 1669/4665/1167 1675/4666/1167 1409/4667/1167 1403/4668/1167 +f 1403/4669/1168 1409/4670/1168 1676/4671/1168 1673/4672/1168 +f 1673/4673/1169 1676/4674/1169 1677/4675/1169 1617/4676/1169 +usemtl common_steel_painted_norivets +f 1617/4677/1170 1677/4678/1170 1678/4679/1170 1668/4680/1170 +usemtl tracked_motorbike2_paint +f 1668/4681/1171 1678/4682/1171 1674/4683/1171 1670/4684/1171 +f 1667/4685/1172 1671/4686/1172 1672/4687/1172 1399/4688/1172 +f 1379/4689/1173 1672/4690/1173 1671/4691/1173 1666/4692/1173 +usemtl common_steel_painted_norivets +f 1680/4693/1174 1681/4694/1174 1683/4695/1174 1682/4696/1174 +f 1685/4697/1175 1684/4698/1175 1686/4699/1175 1687/4700/1175 +usemtl common_steel_painted +f 1688/4701/1176 1689/4702/1176 1684/4703/1176 1685/4704/1176 +usemtl common_steel_norivets +f 1690/4705/1177 1679/4706/1177 1687/4707/1177 1686/4708/1177 +usemtl common_steel_painted_norivets +f 1679/4709/1178 1688/4710/1178 1685/4711/1178 1687/4712/1178 +f 1689/4713/1179 1688/4714/1179 1681/4715/1179 1680/4716/1179 +usemtl common_steel_norivets +f 1679/4717/1180 1690/4718/1180 1682/4719/1180 1683/4720/1180 +usemtl common_steel_painted_norivets +f 1688/4721/1181 1679/4722/1181 1683/4723/1181 1681/4724/1181 +f 1259/4725/1182 1680/4726/1182 1682/4727/1182 1261/4728/1182 +f 1684/4729/1183 1257/4730/1183 1691/4731/1183 1686/4732/1183 +usemtl common_steel_painted +f 1689/4733/1184 1692/4734/1184 1257/4735/1184 1684/4736/1184 +usemtl common_steel_norivets +f 1693/4737/1185 1690/4738/1185 1686/4739/1185 1691/4740/1185 +usemtl common_steel_painted_norivets +f 1692/4741/1186 1689/4742/1186 1680/4743/1186 1259/4744/1186 +usemtl common_rough_steel +f 1690/4745/1187 1693/4746/1187 1261/4747/1187 1682/4748/1187 +usemtl common_steel_painted_norivets +f 1694/4749/1188 1695/4750/1188 1697/4751/1188 1696/4752/1188 +usemtl common_steel_painted +f 1699/4753/1189 1698/4754/1189 1700/4755/1189 1701/4756/1189 +usemtl common_steel_painted_norivets +f 1702/4757/1190 1703/4758/1190 1698/4759/1190 1699/4760/1190 +usemtl common_steel_norivets +f 1704/4761/1191 1705/4762/1191 1701/4763/1191 1700/4764/1191 +usemtl common_steel_painted_norivets +f 1705/4765/1192 1702/4766/1192 1699/4767/1192 1701/4768/1192 +usemtl common_steel_painted +f 1703/4769/1193 1702/4770/1193 1695/4771/1193 1694/4772/1193 +usemtl common_steel_norivets +f 1705/4773/1194 1704/4774/1194 1696/4775/1194 1697/4776/1194 +usemtl common_steel_painted_norivets +f 1702/4777/1195 1705/4778/1195 1697/4779/1195 1695/4780/1195 +usemtl common_steel_painted +f 1706/4781/1196 1700/4782/1196 1698/4783/1196 1707/4784/1196 +usemtl common_steel_painted_norivets +f 1696/4785/1197 1708/4786/1197 1709/4787/1197 1694/4788/1197 +usemtl common_steel_norivets +f 1704/4789/1198 1710/4790/1198 1708/4791/1198 1696/4792/1198 +usemtl common_steel_painted +f 1711/4793/1199 1703/4794/1199 1694/4795/1199 1709/4796/1199 +usemtl common_rough_steel +f 1710/4797/1200 1704/4798/1200 1700/4799/1200 1706/4800/1200 +usemtl common_steel_painted_norivets +f 1703/4801/1201 1711/4802/1201 1707/4803/1201 1698/4804/1201 +f 1716/4805/1202 1714/4806/1202 1713/4807/1202 1715/4808/1202 +f 1719/4809/1203 1717/4810/1203 1718/4811/1203 1720/4812/1203 +usemtl common_steel_painted +f 1717/4813/1204 1722/4814/1204 1721/4815/1204 1718/4816/1204 +usemtl common_steel_norivets +f 1720/4817/1205 1712/4818/1205 1723/4819/1205 1719/4820/1205 +usemtl common_steel_painted_norivets +f 1718/4821/1206 1721/4822/1206 1712/4823/1206 1720/4824/1206 +f 1714/4825/1207 1721/4826/1207 1722/4827/1207 1713/4828/1207 +usemtl common_steel_norivets +f 1715/4829/1208 1723/4830/1208 1712/4831/1208 1716/4832/1208 +usemtl common_steel_painted_norivets +f 1716/4833/1209 1712/4834/1209 1721/4835/1209 1714/4836/1209 +f 1715/4837/1210 1713/4838/1210 1160/4839/1210 1162/4840/1210 +f 1724/4841/1211 1158/4842/1211 1717/4843/1211 1719/4844/1211 +usemtl common_steel_painted +f 1158/4845/1212 1725/4846/1212 1722/4847/1212 1717/4848/1212 +usemtl common_steel_norivets +f 1719/4849/1213 1723/4850/1213 1726/4851/1213 1724/4852/1213 +usemtl common_steel_painted_norivets +f 1713/4853/1214 1722/4854/1214 1725/4855/1214 1160/4856/1214 +usemtl common_rough_steel +f 1162/4857/1215 1726/4858/1215 1723/4859/1215 1715/4860/1215 +usemtl common_steel_painted_norivets +f 1730/4861/1216 1728/4862/1216 1727/4863/1216 1729/4864/1216 +f 1733/4865/1217 1731/4866/1217 1732/4867/1217 1734/4868/1217 +f 1731/4869/1218 1736/4870/1218 1735/4871/1218 1732/4872/1218 +usemtl common_steel_norivets +f 1734/4873/1219 1738/4874/1219 1737/4875/1219 1733/4876/1219 +usemtl common_steel_painted_norivets +f 1732/4877/1220 1735/4878/1220 1738/4879/1220 1734/4880/1220 +usemtl common_steel_painted +f 1728/4881/1221 1735/4882/1221 1736/4883/1221 1727/4884/1221 +usemtl common_steel_norivets +f 1729/4885/1222 1737/4886/1222 1738/4887/1222 1730/4888/1222 +usemtl common_steel_painted_norivets +f 1730/4889/1223 1738/4890/1223 1735/4891/1223 1728/4892/1223 +f 1731/4893/1224 1733/4894/1224 1739/4895/1224 1740/4896/1224 +f 1742/4897/1225 1741/4898/1225 1729/4899/1225 1727/4900/1225 +usemtl common_steel_norivets +f 1741/4901/1226 1743/4902/1226 1737/4903/1226 1729/4904/1226 +usemtl common_steel_painted +f 1727/4905/1227 1736/4906/1227 1744/4907/1227 1742/4908/1227 +usemtl common_rough_steel +f 1733/4909/1228 1737/4910/1228 1743/4911/1228 1739/4912/1228 +usemtl common_steel_painted_norivets +f 1740/4913/1229 1744/4914/1229 1736/4915/1229 1731/4916/1229 +usemtl tracked_motorbike2 +f 1748/4917/1230 1746/4918/1230 1745/4919/1230 1747/4920/1230 +f 1751/4921/1231 1749/4922/1231 1750/4923/1231 1752/4924/1231 +f 1747/4925/1232 1745/4926/1232 1749/4927/1232 1751/4928/1232 +f 1752/4929/1233 1750/4930/1233 1746/4931/1233 1748/4932/1233 +f 1756/4933/1234 1754/4934/1234 1753/4935/1234 1755/4936/1234 +f 1759/4937/1235 1757/4938/1235 1758/4939/1235 1760/4940/1235 +f 1755/4941/1236 1753/4942/1236 1757/4943/1236 1759/4944/1236 +f 1760/4945/1237 1758/4946/1237 1754/4947/1237 1756/4948/1237 +usemtl tracked_motorbike2_paint +f 1764/4949/1238 1762/4950/1238 1761/4951/1238 1763/4952/1238 +f 1767/4953/1239 1765/4954/1239 1766/4955/1239 1768/4956/1239 +f 1761/4957/1240 1762/4958/1240 1766/4959/1240 1765/4960/1240 +usemtl tracked_motorbike2 +f 1764/4961/1241 1763/4962/1241 1767/4963/1241 1768/4964/1241 +usemtl tracked_motorbike2_paint +f 1763/4965/1242 1761/4966/1242 1765/4967/1242 1767/4968/1242 +f 1768/4969/1243 1766/4970/1243 1762/4971/1243 1764/4972/1243 usemtl tracked_motorbike -f 1770/4945/1237 1792/4946/1237 1791/4947/1237 -f 1770/4945/1237 1791/4947/1237 1783/4948/1237 -f 1782/4949/1238 1787/4950/1238 1786/4951/1238 -f 1782/4949/1238 1786/4951/1238 1774/4952/1238 -f 1774/4953/1239 1786/4954/1239 1785/4955/1239 -f 1774/4953/1239 1785/4955/1239 1777/4956/1239 -f 1780/4957/1240 1789/4958/1240 1788/4959/1240 -f 1780/4957/1240 1788/4959/1240 1776/4960/1240 -f 1777/4961/1241 1785/4962/1241 1792/4963/1241 -f 1777/4961/1241 1792/4963/1241 1770/4964/1241 -f 1772/4965/1242 1790/4966/1242 1789/4967/1242 -f 1772/4965/1242 1789/4967/1242 1780/4968/1242 -f 1776/4969/1243 1788/4970/1243 1787/4971/1243 -f 1776/4969/1243 1787/4971/1243 1782/4972/1243 -f 1783/4973/1244 1791/4974/1244 1790/4975/1244 -f 1783/4973/1244 1790/4975/1244 1772/4976/1244 -f 1778/4977/1245 1785/4978/1245 1786/4979/1245 -f 1778/4977/1245 1786/4979/1245 1773/4980/1245 -f 1773/4981/1246 1786/4982/1246 1787/4983/1246 -f 1773/4981/1246 1787/4983/1246 1781/4984/1246 -f 1781/4985/1247 1787/4986/1247 1788/4987/1247 -f 1781/4985/1247 1788/4987/1247 1775/4988/1247 -f 1775/4989/1248 1788/4990/1248 1789/4991/1248 -f 1775/4989/1248 1789/4991/1248 1779/4992/1248 -f 1779/4993/1249 1789/4994/1249 1790/4995/1249 -f 1779/4993/1249 1790/4995/1249 1771/4996/1249 -f 1771/4997/1250 1790/4998/1250 1791/4999/1250 -f 1771/4997/1250 1791/4999/1250 1784/5000/1250 -f 1784/5001/1251 1791/5002/1251 1792/5003/1251 -f 1784/5001/1251 1792/5003/1251 1769/5004/1251 -f 1769/5005/1252 1792/5006/1252 1785/5007/1252 -f 1769/5005/1252 1785/5007/1252 1778/5008/1252 -usemtl pipe34 -f 1758/5009/1253 1747/5010/1253 1751/5011/1253 -f 1758/5009/1253 1751/5011/1253 1760/5012/1253 -f 1756/5013/1254 1752/5014/1254 1748/5015/1254 -f 1756/5013/1254 1748/5015/1254 1754/5016/1254 -f 1760/5017/1255 1751/5018/1255 1752/5019/1255 -f 1760/5017/1255 1752/5019/1255 1756/5020/1255 -f 1754/5021/1256 1748/5022/1256 1747/5023/1256 -f 1754/5021/1256 1747/5023/1256 1758/5024/1256 +f 1774/4973/1244 1770/4974/1244 1769/4975/1244 1773/4976/1244 +f 1775/4977/1245 1771/4978/1245 1772/4979/1245 1776/4980/1245 +f 1770/4981/1246 1774/4982/1246 1776/4983/1246 1772/4984/1246 +usemtl common_thingies +f 1780/4985/1247 1778/4986/1247 1777/4987/1247 1779/4988/1247 +f 1783/4989/1248 1781/4990/1248 1782/4991/1248 1784/4992/1248 +f 1780/4993/1249 1779/4994/1249 1783/4995/1249 1784/4996/1249 +f 1779/4997/1250 1777/4998/1250 1781/4999/1250 1783/5000/1250 +f 1784/5001/1251 1782/5002/1251 1778/5003/1251 1780/5004/1251 +f 1788/5005/1252 1786/5006/1252 1785/5007/1252 1787/5008/1252 +f 1791/5009/1253 1789/5010/1253 1790/5011/1253 1792/5012/1253 +f 1788/5013/1254 1787/5014/1254 1791/5015/1254 1792/5016/1254 +f 1787/5017/1255 1785/5018/1255 1789/5019/1255 1791/5020/1255 +f 1792/5021/1256 1790/5022/1256 1786/5023/1256 1788/5024/1256 o RightWheelRear2 -v 0.875 1.0624999696333308 -0.12500003036666912 -v 0.875 1.0624999696333308 -0.4999999696333308 -v 0.875 0.6875000303666692 -0.12500003036666915 -v 0.875 0.6875000303666692 -0.4999999696333309 -v 0.75 1.0624999696333308 -0.12500003036666912 -v 0.75 1.0624999696333308 -0.4999999696333308 -v 0.75 0.6875000303666692 -0.12500003036666915 -v 0.75 0.6875000303666692 -0.4999999696333309 -v 1 1.162262129857035 -0.15782039161544276 -v 1 1.0296796083845572 -0.02523787014296508 -v 1 1.2064563036811942 -0.11362621779128346 -v 1 1.0738737822087165 0.018956303681194164 -v 0.625 1.162262129857035 -0.1578203916154427 -v 0.625 1.0296796083845572 -0.025237870142965024 -v 0.625 1.2064563036811942 -0.11362621779128346 -v 0.625 1.0738737822087165 0.018956303681194164 -v 1 0.5877378701429651 -0.15782039161544276 -v 1 0.7203203916154427 -0.02523787014296508 -v 1 0.5435436963188058 -0.11362621779128357 -v 1 0.6761262177912835 0.01895630368119411 -v 0.625 0.5877378701429651 -0.15782039161544276 -v 0.625 0.7203203916154427 -0.02523787014296508 -v 0.625 0.5435436963188058 -0.11362621779128351 -v 0.625 0.6761262177912835 0.018956303681194164 -v 1 0.5877378701429651 -0.4671796083845573 -v 1 0.7203203916154427 -0.599762129857035 -v 1 0.5435436963188058 -0.5113737822087165 -v 1 0.6761262177912836 -0.6439563036811942 -v 0.625 0.5877378701429651 -0.46717960838455724 -v 0.625 0.7203203916154428 -0.5997621298570349 -v 0.625 0.5435436963188058 -0.5113737822087165 -v 0.625 0.6761262177912836 -0.6439563036811942 -v 1 1.162262129857035 -0.46717960838455724 -v 1 1.0296796083845572 -0.5997621298570349 -v 1 1.2064563036811942 -0.5113737822087165 -v 1 1.0738737822087165 -0.6439563036811942 -v 0.625 1.162262129857035 -0.46717960838455724 -v 0.625 1.0296796083845572 -0.5997621298570349 -v 0.625 1.2064563036811942 -0.5113737822087164 -v 0.625 1.0738737822087165 -0.6439563036811942 -v 1 0.9687499848166654 -3.45238940713255e-7 -v 1 0.7812500151833346 -3.45238940713255e-7 -v 1 0.9687499848166654 0.06249993926666175 -v 1 0.7812500151833345 0.0624999392666617 -v 0.625 0.9687499848166654 -3.4523894065774385e-7 -v 0.625 0.7812500151833346 -3.45238940713255e-7 -v 0.625 0.9687499848166654 0.06249993926666175 -v 0.625 0.7812500151833346 0.06249993926666175 -v 1 0.5625003452389407 -0.40624998481666547 -v 1 0.5625003452389407 -0.2187500151833346 -v 1 0.5000000607333382 -0.4062499848166655 -v 1 0.5000000607333382 -0.2187500151833346 -v 0.625 0.5625003452389408 -0.4062499848166654 -v 0.625 0.5625003452389408 -0.2187500151833346 -v 0.625 0.5000000607333384 -0.4062499848166654 -v 0.625 0.5000000607333382 -0.21875001518333453 -v 1 0.7812500151833346 -0.6249996547610593 -v 1 0.9687499848166654 -0.6249996547610592 -v 1 0.7812500151833346 -0.6874999392666618 -v 1 0.9687499848166654 -0.6874999392666618 -v 0.625 0.7812500151833346 -0.6249996547610592 -v 0.625 0.9687499848166654 -0.6249996547610592 -v 0.625 0.7812500151833346 -0.6874999392666618 -v 0.625 0.9687499848166655 -0.6874999392666616 -v 1 1.1874996547610592 -0.2187500151833346 -v 1 1.1874996547610592 -0.4062499848166654 -v 1 1.2499999392666616 -0.21875001518333456 -v 1 1.2499999392666616 -0.40624998481666547 -v 0.625 1.1874996547610595 -0.21875001518333453 -v 0.625 1.1874996547610595 -0.4062499848166654 -v 0.625 1.2499999392666616 -0.2187500151833345 -v 0.625 1.2499999392666616 -0.4062499848166654 -v 0.875 1.0000001270694667 -0.6250000967027975 -v 0.875 1.1875000967027975 -0.4375001270694666 -v 0.875 0.7499998729305334 -0.6250000967027975 -v 0.875 0.5624999032972025 -0.43750012706946667 -v 0.9375 1.0000001270694667 -0.6250000967027975 -v 0.9375 1.1875000967027975 -0.43750012706946667 -v 0.9375 0.7499998729305334 -0.6250000967027975 -v 0.9375 0.5624999032972025 -0.43750012706946667 -v 0.9375 1.1875000967027975 -0.18749987293053333 -v 0.9375 1.1875000967027975 -0.43750012706946667 -v 0.9375 0.5624999032972025 -0.18749987293053338 -v 0.9375 0.5624999032972025 -0.43750012706946667 -v 0.875 1.1875000967027975 -0.18749987293053333 -v 0.875 1.1875000967027975 -0.4375001270694666 -v 0.875 0.5624999032972025 -0.18749987293053336 -v 0.875 0.5624999032972025 -0.43750012706946667 -v 0.9375 1.0000001270694667 9.670279754736555e-8 -v 0.9375 1.1875000967027975 -0.18749987293053333 -v 0.9375 0.7499998729305333 9.67027974918544e-8 -v 0.9375 0.5624999032972025 -0.18749987293053338 -v 0.875 1.0000001270694667 9.670279754736555e-8 -v 0.875 1.1875000967027975 -0.18749987293053333 -v 0.875 0.7499998729305333 9.670279754736555e-8 -v 0.875 0.5624999032972025 -0.18749987293053336 -v 0.6875 1.0000001270694667 -0.6250000967027975 -v 0.6875 1.1875000967027975 -0.4375001270694666 -v 0.6875 0.7499998729305334 -0.6250000967027975 -v 0.6875 0.5624999032972025 -0.43750012706946667 -v 0.75 1.0000001270694667 -0.6250000967027975 -v 0.75 1.1875000967027975 -0.4375001270694666 -v 0.75 0.7499998729305334 -0.6250000967027975 -v 0.75 0.5624999032972025 -0.43750012706946667 -v 0.75 1.1875000967027975 -0.18749987293053333 -v 0.75 1.1875000967027975 -0.4375001270694666 -v 0.75 0.5624999032972025 -0.18749987293053336 -v 0.75 0.5624999032972025 -0.43750012706946667 -v 0.6875 1.1875000967027975 -0.18749987293053333 -v 0.6875 1.1875000967027975 -0.4375001270694666 -v 0.6875 0.5624999032972025 -0.18749987293053333 -v 0.6875 0.5624999032972025 -0.43750012706946667 -v 0.75 1.0000001270694667 9.670279754736555e-8 -v 0.75 1.1875000967027975 -0.18749987293053333 -v 0.75 0.7499998729305333 9.670279754736555e-8 -v 0.75 0.5624999032972025 -0.18749987293053336 -v 0.6875 1.0000001270694667 9.670279754736555e-8 -v 0.6875 1.1875000967027975 -0.18749987293053333 -v 0.6875 0.7499998729305333 9.670279754736555e-8 -v 0.6875 0.5624999032972025 -0.18749987293053333 -v 1 1.0624999696333308 -0.12500003036666915 -v 1 1.0624999696333308 -0.4999999696333309 -v 1 0.6875000303666691 -0.12500003036666918 -v 1 0.6875000303666692 -0.49999996963333093 -v 0.9375 1.0624999696333308 -0.12500003036666912 -v 0.9375 1.0624999696333308 -0.4999999696333308 -v 0.9375 0.6875000303666692 -0.12500003036666915 -v 0.9375 0.6875000303666692 -0.4999999696333309 -v 0.625 1.0624999696333308 -0.1250000303666691 -v 0.625 1.0624999696333308 -0.4999999696333308 -v 0.625 0.6875000303666692 -0.12500003036666912 -v 0.625 0.6875000303666692 -0.4999999696333308 -v 0.6875 1.0624999696333308 -0.12500003036666912 -v 0.6875 1.0624999696333308 -0.4999999696333308 -v 0.6875 0.6875000303666692 -0.12500003036666915 -v 0.6875 0.6875000303666692 -0.4999999696333309 +v 0.875 1.0625 -0.125 +v 0.875 1.0625 -0.5 +v 0.875 0.6875 -0.125 +v 0.875 0.6875 -0.5 +v 0.75 1.0625 -0.125 +v 0.75 1.0625 -0.5 +v 0.75 0.6875 -0.125 +v 0.75 0.6875 -0.5 +v 1 1.1623 -0.1578 +v 1 1.0297 -0.0252 +v 1 1.2065 -0.1136 +v 1 1.0739 0.019 +v 0.625 1.1623 -0.1578 +v 0.625 1.0297 -0.0252 +v 0.625 1.2065 -0.1136 +v 0.625 1.0739 0.019 +v 1 0.5877 -0.1578 +v 1 0.7203 -0.0252 +v 1 0.5435 -0.1136 +v 1 0.6761 0.019 +v 0.625 0.5877 -0.1578 +v 0.625 0.7203 -0.0252 +v 0.625 0.5435 -0.1136 +v 0.625 0.6761 0.019 +v 1 0.5877 -0.4672 +v 1 0.7203 -0.5998 +v 1 0.5435 -0.5114 +v 1 0.6761 -0.644 +v 0.625 0.5877 -0.4672 +v 0.625 0.7203 -0.5998 +v 0.625 0.5435 -0.5114 +v 0.625 0.6761 -0.644 +v 1 1.1623 -0.4672 +v 1 1.0297 -0.5998 +v 1 1.2065 -0.5114 +v 1 1.0739 -0.644 +v 0.625 1.1623 -0.4672 +v 0.625 1.0297 -0.5998 +v 0.625 1.2065 -0.5114 +v 0.625 1.0739 -0.644 +v 1 0.9687 0 +v 1 0.7813 0 +v 1 0.9687 0.0625 +v 1 0.7813 0.0625 +v 0.625 0.9687 0 +v 0.625 0.7813 0 +v 0.625 0.9687 0.0625 +v 0.625 0.7813 0.0625 +v 1 0.5625 -0.4062 +v 1 0.5625 -0.2188 +v 1 0.5 -0.4062 +v 1 0.5 -0.2188 +v 0.625 0.5625 -0.4062 +v 0.625 0.5625 -0.2188 +v 0.625 0.5 -0.4062 +v 0.625 0.5 -0.2188 +v 1 0.7813 -0.625 +v 1 0.9687 -0.625 +v 1 0.7813 -0.6875 +v 1 0.9687 -0.6875 +v 0.625 0.7813 -0.625 +v 0.625 0.9687 -0.625 +v 0.625 0.7813 -0.6875 +v 0.625 0.9687 -0.6875 +v 1 1.1875 -0.2188 +v 1 1.1875 -0.4062 +v 1 1.25 -0.2188 +v 1 1.25 -0.4062 +v 0.625 1.1875 -0.2188 +v 0.625 1.1875 -0.4062 +v 0.625 1.25 -0.2188 +v 0.625 1.25 -0.4062 +v 0.875 1 -0.625 +v 0.875 1.1875 -0.4375 +v 0.875 0.75 -0.625 +v 0.875 0.5625 -0.4375 +v 0.9375 1 -0.625 +v 0.9375 1.1875 -0.4375 +v 0.9375 0.75 -0.625 +v 0.9375 0.5625 -0.4375 +v 0.9375 1.1875 -0.1875 +v 0.9375 1.1875 -0.4375 +v 0.9375 0.5625 -0.1875 +v 0.9375 0.5625 -0.4375 +v 0.875 1.1875 -0.1875 +v 0.875 1.1875 -0.4375 +v 0.875 0.5625 -0.1875 +v 0.875 0.5625 -0.4375 +v 0.9375 1 0 +v 0.9375 1.1875 -0.1875 +v 0.9375 0.75 0 +v 0.9375 0.5625 -0.1875 +v 0.875 1 0 +v 0.875 1.1875 -0.1875 +v 0.875 0.75 0 +v 0.875 0.5625 -0.1875 +v 0.6875 1 -0.625 +v 0.6875 1.1875 -0.4375 +v 0.6875 0.75 -0.625 +v 0.6875 0.5625 -0.4375 +v 0.75 1 -0.625 +v 0.75 1.1875 -0.4375 +v 0.75 0.75 -0.625 +v 0.75 0.5625 -0.4375 +v 0.75 1.1875 -0.1875 +v 0.75 1.1875 -0.4375 +v 0.75 0.5625 -0.1875 +v 0.75 0.5625 -0.4375 +v 0.6875 1.1875 -0.1875 +v 0.6875 1.1875 -0.4375 +v 0.6875 0.5625 -0.1875 +v 0.6875 0.5625 -0.4375 +v 0.75 1 0 +v 0.75 1.1875 -0.1875 +v 0.75 0.75 0 +v 0.75 0.5625 -0.1875 +v 0.6875 1 0 +v 0.6875 1.1875 -0.1875 +v 0.6875 0.75 0 +v 0.6875 0.5625 -0.1875 +v 1 1.0625 -0.125 +v 1 1.0625 -0.5 +v 1 0.6875 -0.125 +v 1 0.6875 -0.5 +v 0.9375 1.0625 -0.125 +v 0.9375 1.0625 -0.5 +v 0.9375 0.6875 -0.125 +v 0.9375 0.6875 -0.5 +v 0.625 1.0625 -0.125 +v 0.625 1.0625 -0.5 +v 0.625 0.6875 -0.125 +v 0.625 0.6875 -0.5 +v 0.6875 1.0625 -0.125 +v 0.6875 1.0625 -0.5 +v 0.6875 0.6875 -0.125 +v 0.6875 0.6875 -0.5 vt 0.0625 0.6875 vt 0.0625 0.5 vt 0 0.5 @@ -11032,13 +9775,13 @@ vt 0.0625 0.5 vt 0 0.5 vt 0 0.6875 vt 0.8125 0.6875 -vt 0.8125 0.71875 -vt 0.9375 0.71875 +vt 0.8125 0.7188 +vt 0.9375 0.7188 vt 0.9375 0.6875 -vt 0.9375 0.90625 +vt 0.9375 0.9063 vt 0.9375 0.9375 vt 0.8125 0.9375 -vt 0.8125 0.90625 +vt 0.8125 0.9063 vt 0.9375 0.6875 vt 0.8125 0.6875 vt 0.8125 0.9375 @@ -11048,21 +9791,21 @@ vt 0.9375 0.6875 vt 0.9375 0.9375 vt 0.8125 0.9375 vt 0.9375 0.6875 -vt 0.90625 0.6875 -vt 0.90625 0.9375 +vt 0.9063 0.6875 +vt 0.9063 0.9375 vt 0.9375 0.9375 vt 0.8125 0.9375 -vt 0.84375 0.9375 -vt 0.84375 0.6875 +vt 0.8438 0.9375 +vt 0.8438 0.6875 vt 0.8125 0.6875 -vt 0.9375 0.71875 -vt 0.8125 0.71875 +vt 0.9375 0.7188 +vt 0.8125 0.7188 vt 0.8125 0.6875 vt 0.9375 0.6875 vt 0.8125 0.9375 vt 0.9375 0.9375 -vt 0.9375 0.90625 -vt 0.8125 0.90625 +vt 0.9375 0.9063 +vt 0.8125 0.9063 vt 0.8125 0.9375 vt 0.8125 0.6875 vt 0.9375 0.6875 @@ -11071,22 +9814,22 @@ vt 0.9375 0.9375 vt 0.9375 0.6875 vt 0.8125 0.6875 vt 0.8125 0.9375 -vt 0.90625 0.9375 -vt 0.90625 0.6875 +vt 0.9063 0.9375 +vt 0.9063 0.6875 vt 0.9375 0.6875 vt 0.9375 0.9375 -vt 0.84375 0.6875 -vt 0.84375 0.9375 +vt 0.8438 0.6875 +vt 0.8438 0.9375 vt 0.8125 0.9375 vt 0.8125 0.6875 vt 0.8125 0.6875 -vt 0.8125 0.71875 -vt 0.9375 0.71875 +vt 0.8125 0.7188 +vt 0.9375 0.7188 vt 0.9375 0.6875 -vt 0.9375 0.90625 +vt 0.9375 0.9063 vt 0.9375 0.9375 vt 0.8125 0.9375 -vt 0.8125 0.90625 +vt 0.8125 0.9063 vt 0.9375 0.6875 vt 0.8125 0.6875 vt 0.8125 0.9375 @@ -11096,21 +9839,21 @@ vt 0.9375 0.6875 vt 0.9375 0.9375 vt 0.8125 0.9375 vt 0.9375 0.6875 -vt 0.90625 0.6875 -vt 0.90625 0.9375 +vt 0.9063 0.6875 +vt 0.9063 0.9375 vt 0.9375 0.9375 vt 0.8125 0.9375 -vt 0.84375 0.9375 -vt 0.84375 0.6875 +vt 0.8438 0.9375 +vt 0.8438 0.6875 vt 0.8125 0.6875 -vt 0.9375 0.71875 -vt 0.8125 0.71875 +vt 0.9375 0.7188 +vt 0.8125 0.7188 vt 0.8125 0.6875 vt 0.9375 0.6875 vt 0.8125 0.9375 vt 0.9375 0.9375 -vt 0.9375 0.90625 -vt 0.8125 0.90625 +vt 0.9375 0.9063 +vt 0.8125 0.9063 vt 0.8125 0.9375 vt 0.8125 0.6875 vt 0.9375 0.6875 @@ -11119,22 +9862,22 @@ vt 0.9375 0.9375 vt 0.9375 0.6875 vt 0.8125 0.6875 vt 0.8125 0.9375 -vt 0.90625 0.9375 -vt 0.90625 0.6875 +vt 0.9063 0.9375 +vt 0.9063 0.6875 vt 0.9375 0.6875 vt 0.9375 0.9375 -vt 0.84375 0.6875 -vt 0.84375 0.9375 +vt 0.8438 0.6875 +vt 0.8438 0.9375 vt 0.8125 0.9375 vt 0.8125 0.6875 vt 0.8125 0.6875 -vt 0.8125 0.71875 -vt 0.9375 0.71875 +vt 0.8125 0.7188 +vt 0.9375 0.7188 vt 0.9375 0.6875 -vt 0.9375 0.90625 +vt 0.9375 0.9063 vt 0.9375 0.9375 vt 0.8125 0.9375 -vt 0.8125 0.90625 +vt 0.8125 0.9063 vt 0.9375 0.6875 vt 0.8125 0.6875 vt 0.8125 0.9375 @@ -11144,21 +9887,21 @@ vt 0.9375 0.6875 vt 0.9375 0.9375 vt 0.8125 0.9375 vt 0.9375 0.6875 -vt 0.90625 0.6875 -vt 0.90625 0.9375 +vt 0.9063 0.6875 +vt 0.9063 0.9375 vt 0.9375 0.9375 vt 0.8125 0.9375 -vt 0.84375 0.9375 -vt 0.84375 0.6875 +vt 0.8438 0.9375 +vt 0.8438 0.6875 vt 0.8125 0.6875 -vt 0.9375 0.71875 -vt 0.8125 0.71875 +vt 0.9375 0.7188 +vt 0.8125 0.7188 vt 0.8125 0.6875 vt 0.9375 0.6875 vt 0.8125 0.9375 vt 0.9375 0.9375 -vt 0.9375 0.90625 -vt 0.8125 0.90625 +vt 0.9375 0.9063 +vt 0.8125 0.9063 vt 0.8125 0.9375 vt 0.8125 0.6875 vt 0.9375 0.6875 @@ -11167,22 +9910,22 @@ vt 0.9375 0.9375 vt 0.9375 0.6875 vt 0.8125 0.6875 vt 0.8125 0.9375 -vt 0.90625 0.9375 -vt 0.90625 0.6875 +vt 0.9063 0.9375 +vt 0.9063 0.6875 vt 0.9375 0.6875 vt 0.9375 0.9375 -vt 0.84375 0.6875 -vt 0.84375 0.9375 +vt 0.8438 0.6875 +vt 0.8438 0.9375 vt 0.8125 0.9375 vt 0.8125 0.6875 vt 0.8125 0.6875 -vt 0.8125 0.71875 -vt 0.9375 0.71875 +vt 0.8125 0.7188 +vt 0.9375 0.7188 vt 0.9375 0.6875 -vt 0.9375 0.90625 +vt 0.9375 0.9063 vt 0.9375 0.9375 vt 0.8125 0.9375 -vt 0.8125 0.90625 +vt 0.8125 0.9063 vt 0.9375 0.6875 vt 0.8125 0.6875 vt 0.8125 0.9375 @@ -11192,21 +9935,21 @@ vt 0.9375 0.6875 vt 0.9375 0.9375 vt 0.8125 0.9375 vt 0.9375 0.6875 -vt 0.90625 0.6875 -vt 0.90625 0.9375 +vt 0.9063 0.6875 +vt 0.9063 0.9375 vt 0.9375 0.9375 vt 0.8125 0.9375 -vt 0.84375 0.9375 -vt 0.84375 0.6875 +vt 0.8438 0.9375 +vt 0.8438 0.6875 vt 0.8125 0.6875 -vt 0.9375 0.71875 -vt 0.8125 0.71875 +vt 0.9375 0.7188 +vt 0.8125 0.7188 vt 0.8125 0.6875 vt 0.9375 0.6875 vt 0.8125 0.9375 vt 0.9375 0.9375 -vt 0.9375 0.90625 -vt 0.8125 0.90625 +vt 0.9375 0.9063 +vt 0.8125 0.9063 vt 0.8125 0.9375 vt 0.8125 0.6875 vt 0.9375 0.6875 @@ -11215,574 +9958,484 @@ vt 0.9375 0.9375 vt 0.9375 0.6875 vt 0.8125 0.6875 vt 0.8125 0.9375 -vt 0.90625 0.9375 -vt 0.90625 0.6875 +vt 0.9063 0.9375 +vt 0.9063 0.6875 vt 0.9375 0.6875 vt 0.9375 0.9375 -vt 0.84375 0.6875 -vt 0.84375 0.9375 +vt 0.8438 0.6875 +vt 0.8438 0.9375 vt 0.8125 0.9375 vt 0.8125 0.6875 vt 0.175 0.5625 vt 0.175 0.9375 vt 0.0625 0.825 vt 0.0625 0.675 -vt 0.0625025 0.8249984375 -vt 0.0625 0.6749974999999999 -vt 0.1749990625 0.5624984375 -vt 0.1749990625 0.9375 -vt 0.09375 0.6875 -vt 0.09375 0.8125 +vt 0.0625 0.825 +vt 0.0625 0.675 +vt 0.175 0.5625 +vt 0.175 0.9375 +vt 0.0938 0.6875 +vt 0.0938 0.8125 vt 0.0625 0.8125 vt 0.0625 0.6875 -vt 0.09375 0.6875 -vt 0.09375 0.8125 +vt 0.0938 0.6875 +vt 0.0938 0.8125 vt 0.0625 0.8125 vt 0.0625 0.6875 -vt 0.09375 0.6875 -vt 0.09375 0.8125 +vt 0.0938 0.6875 +vt 0.0938 0.8125 vt 0.0625 0.8125 vt 0.0625 0.6875 vt 0.175 0.9375 -vt 0.175 0.5624984375 -vt 0.3250040625 0.5624984375 -vt 0.3250040625 0.9375 +vt 0.175 0.5625 +vt 0.325 0.5625 +vt 0.325 0.9375 vt 0.325 0.5625 vt 0.325 0.9375 vt 0.175 0.9375 vt 0.175 0.5625 -vt 0.09375 0.6875 -vt 0.09375 0.8125 +vt 0.0938 0.6875 +vt 0.0938 0.8125 vt 0.0625 0.8125 vt 0.0625 0.6875 -vt 0.09375 0.6875 -vt 0.09375 0.8125 +vt 0.0938 0.6875 +vt 0.0938 0.8125 vt 0.0625 0.8125 vt 0.0625 0.6875 vt 0.325 0.9375 -vt 0.325 0.5624984375 -vt 0.4374990625 0.6749974999999999 -vt 0.4374990625 0.82500125 +vt 0.325 0.5625 +vt 0.4375 0.675 +vt 0.4375 0.825 vt 0.4375 0.675 vt 0.4375 0.825 vt 0.325 0.9375 vt 0.325 0.5625 -vt 0.09375 0.6875 -vt 0.09375 0.8125 +vt 0.0938 0.6875 +vt 0.0938 0.8125 vt 0.0625 0.8125 vt 0.0625 0.6875 -vt 0.09375 0.6875 -vt 0.09375 0.8125 +vt 0.0938 0.6875 +vt 0.0938 0.8125 vt 0.0625 0.8125 vt 0.0625 0.6875 -vt 0.09375 0.6875 -vt 0.09375 0.8125 +vt 0.0938 0.6875 +vt 0.0938 0.8125 vt 0.0625 0.8125 vt 0.0625 0.6875 vt 0.175 0.5625 vt 0.175 0.9375 vt 0.0625 0.825 vt 0.0625 0.675 -vt 0.0625025 0.8249984375 -vt 0.0625 0.6749974999999999 -vt 0.1749990625 0.5624984375 -vt 0.1749990625 0.9375 -vt 0.09375 0.6875 -vt 0.09375 0.8125 +vt 0.0625 0.825 +vt 0.0625 0.675 +vt 0.175 0.5625 +vt 0.175 0.9375 +vt 0.0938 0.6875 +vt 0.0938 0.8125 vt 0.0625 0.8125 vt 0.0625 0.6875 -vt 0.09375 0.6875 -vt 0.09375 0.8125 +vt 0.0938 0.6875 +vt 0.0938 0.8125 vt 0.0625 0.8125 vt 0.0625 0.6875 -vt 0.09375 0.6875 -vt 0.09375 0.8125 +vt 0.0938 0.6875 +vt 0.0938 0.8125 vt 0.0625 0.8125 vt 0.0625 0.6875 vt 0.175 0.9375 -vt 0.175 0.5624984375 -vt 0.3250040625 0.5624984375 -vt 0.3250040625 0.9375 +vt 0.175 0.5625 +vt 0.325 0.5625 +vt 0.325 0.9375 vt 0.325 0.5625 vt 0.325 0.9375 vt 0.175 0.9375 vt 0.175 0.5625 -vt 0.09375 0.6875 -vt 0.09375 0.8125 +vt 0.0938 0.6875 +vt 0.0938 0.8125 vt 0.0625 0.8125 vt 0.0625 0.6875 -vt 0.09375 0.6875 -vt 0.09375 0.8125 +vt 0.0938 0.6875 +vt 0.0938 0.8125 vt 0.0625 0.8125 vt 0.0625 0.6875 vt 0.325 0.9375 -vt 0.325 0.5624984375 -vt 0.4374990625 0.6749974999999999 -vt 0.4374990625 0.82500125 +vt 0.325 0.5625 +vt 0.4375 0.675 +vt 0.4375 0.825 vt 0.4375 0.675 vt 0.4375 0.825 vt 0.325 0.9375 vt 0.325 0.5625 -vt 0.09375 0.6875 -vt 0.09375 0.8125 +vt 0.0938 0.6875 +vt 0.0938 0.8125 vt 0.0625 0.8125 vt 0.0625 0.6875 -vt 0.09375 0.6875 -vt 0.09375 0.8125 +vt 0.0938 0.6875 +vt 0.0938 0.8125 vt 0.0625 0.8125 vt 0.0625 0.6875 -vt 0.09375 0.6875 -vt 0.09375 0.8125 +vt 0.0938 0.6875 +vt 0.0938 0.8125 vt 0.0625 0.8125 vt 0.0625 0.6875 -vt 0.71875 0.75 -vt 0.71875 0.9375 -vt 0.53125 0.9375 -vt 0.53125 0.75 -vt 0.53125 0.9375 -vt 0.53125 0.75 +vt 0.7188 0.75 +vt 0.7188 0.9375 +vt 0.5313 0.9375 +vt 0.5313 0.75 +vt 0.5313 0.9375 +vt 0.5313 0.75 vt 0.5625 0.75 vt 0.5625 0.9375 -vt 0.71875 0.75 -vt 0.71875 0.9375 +vt 0.7188 0.75 +vt 0.7188 0.9375 vt 0.6875 0.9375 vt 0.6875 0.75 vt 0.5625 0.75 vt 0.5625 0.9375 -vt 0.53125 0.9375 -vt 0.53125 0.75 -vt 0.71875 0.75 -vt 0.71875 0.9375 +vt 0.5313 0.9375 +vt 0.5313 0.75 +vt 0.7188 0.75 +vt 0.7188 0.9375 vt 0.6875 0.9375 vt 0.6875 0.75 -vt 0.53125 0.9375 -vt 0.71875 0.9375 -vt 0.71875 0.75 -vt 0.53125 0.75 +vt 0.5313 0.9375 +vt 0.7188 0.9375 +vt 0.7188 0.75 +vt 0.5313 0.75 vt 0.5625 0.75 -vt 0.53125 0.75 -vt 0.53125 0.9375 +vt 0.5313 0.75 +vt 0.5313 0.9375 vt 0.5625 0.9375 vt 0.6875 0.9375 -vt 0.71875 0.9375 -vt 0.71875 0.75 +vt 0.7188 0.9375 +vt 0.7188 0.75 vt 0.6875 0.75 -vt 0.53125 0.9375 +vt 0.5313 0.9375 vt 0.5625 0.9375 vt 0.5625 0.75 -vt 0.53125 0.75 +vt 0.5313 0.75 vt 0.6875 0.9375 -vt 0.71875 0.9375 -vt 0.71875 0.75 +vt 0.7188 0.9375 +vt 0.7188 0.75 vt 0.6875 0.75 -vn 8.659560562354933e-17 1 1.1102230246251565e-16 -vn -8.659560562354933e-17 -1 -1.1102230246251565e-16 -vn 8.65956056235493e-17 -1.1102230246251565e-16 1 -vn -8.65956056235493e-17 1.1102230246251565e-16 -1 -vn 1 -8.65956056235493e-17 -8.659560562354932e-17 -vn -1 8.65956056235493e-17 8.659560562354932e-17 -vn -1.224646799147353e-16 -0.7071067811865475 -0.7071067811865476 -vn 1.224646799147353e-16 0.7071067811865475 0.7071067811865476 -vn 1.232595164407831e-32 0.7071067811865476 -0.7071067811865475 -vn -1.232595164407831e-32 -0.7071067811865476 0.7071067811865475 -vn 1 -8.65956056235493e-17 -8.659560562354932e-17 -vn -1 8.65956056235493e-17 8.659560562354932e-17 -vn 1.232595164407831e-32 0.7071067811865476 -0.7071067811865475 -vn -1.232595164407831e-32 -0.7071067811865476 0.7071067811865475 -vn -1.224646799147353e-16 -0.7071067811865475 -0.7071067811865476 -vn 1.224646799147353e-16 0.7071067811865475 0.7071067811865476 -vn 1 -8.65956056235493e-17 -8.659560562354932e-17 -vn -1 8.65956056235493e-17 8.659560562354932e-17 -vn 1.224646799147353e-16 0.7071067811865475 0.7071067811865476 -vn -1.224646799147353e-16 -0.7071067811865475 -0.7071067811865476 -vn -1.232595164407831e-32 -0.7071067811865476 0.7071067811865475 -vn 1.232595164407831e-32 0.7071067811865476 -0.7071067811865475 -vn 1 -8.65956056235493e-17 -8.659560562354932e-17 -vn -1 8.65956056235493e-17 8.659560562354932e-17 -vn -1.232595164407831e-32 -0.7071067811865476 0.7071067811865475 -vn 1.232595164407831e-32 0.7071067811865476 -0.7071067811865475 -vn 1.224646799147353e-16 0.7071067811865475 0.7071067811865476 -vn -1.224646799147353e-16 -0.7071067811865475 -0.7071067811865476 -vn 1 -8.65956056235493e-17 -8.659560562354932e-17 -vn -1 8.65956056235493e-17 8.659560562354932e-17 -vn -8.65956056235493e-17 1.1102230246251565e-16 -1 -vn 8.659560562354932e-17 -1.1102230246251568e-16 1 -vn 8.659560562354932e-17 1 -2.775557561562892e-16 -vn -8.659560562354934e-17 -1 -3.3306690738754696e-16 -vn 1 -8.65956056235493e-17 -8.659560562354932e-17 -vn -1 8.65956056235493e-17 8.659560562354932e-17 -vn 8.659560562354933e-17 1 1.1102230246251565e-16 -vn -8.659560562354934e-17 -1 -1.1102230246251568e-16 -vn -8.659560562354927e-17 3.3306690738754696e-16 -1 -vn 8.659560562354934e-17 2.775557561562892e-16 1 -vn 1 -8.65956056235493e-17 -8.659560562354932e-17 -vn -1 8.65956056235493e-17 8.659560562354932e-17 -vn 8.65956056235493e-17 -1.1102230246251565e-16 1 -vn -8.659560562354932e-17 1.1102230246251568e-16 -1 -vn -8.659560562354932e-17 -1 2.775557561562892e-16 -vn 8.659560562354934e-17 1 3.3306690738754696e-16 -vn 1 -8.65956056235493e-17 -8.659560562354932e-17 -vn -1 8.65956056235493e-17 8.659560562354932e-17 -vn -8.659560562354933e-17 -1 -1.1102230246251565e-16 -vn 8.659560562354934e-17 1 1.1102230246251568e-16 -vn 8.659560562354927e-17 -3.3306690738754696e-16 1 -vn -8.659560562354934e-17 -2.775557561562892e-16 -1 -vn -1 8.65956056235493e-17 8.659560562354932e-17 -vn 1 -8.65956056235493e-17 -8.659560562354932e-17 -vn 1.232595164407831e-32 0.7071067811865476 -0.7071067811865475 -vn -1.224646799147353e-16 -0.7071067811865475 -0.7071067811865476 -vn -8.659560562354932e-17 1.1102230246251568e-16 -1 -vn 1 -8.65956056235493e-17 -8.659560562354932e-17 -vn -1 8.65956056235493e-17 8.659560562354932e-17 -vn 8.659560562354934e-17 1 1.1102230246251568e-16 -vn -8.659560562354934e-17 -1 -1.1102230246251568e-16 -vn 1 -8.65956056235493e-17 -8.659560562354932e-17 -vn -1 8.65956056235493e-17 8.659560562354932e-17 -vn 1.224646799147353e-16 0.7071067811865475 0.7071067811865476 -vn -1.232595164407831e-32 -0.7071067811865476 0.7071067811865475 -vn 8.659560562354932e-17 -1.1102230246251568e-16 1 -vn -1 8.65956056235493e-17 8.659560562354932e-17 -vn 1 -8.65956056235493e-17 -8.659560562354932e-17 -vn 1.232595164407831e-32 0.7071067811865476 -0.7071067811865475 -vn -1.224646799147353e-16 -0.7071067811865475 -0.7071067811865476 -vn -8.659560562354932e-17 1.1102230246251568e-16 -1 -vn 1 -8.65956056235493e-17 -8.659560562354932e-17 -vn -1 8.65956056235493e-17 8.659560562354932e-17 -vn 8.659560562354934e-17 1 1.1102230246251568e-16 -vn -8.659560562354934e-17 -1 -1.1102230246251568e-16 -vn 1 -8.65956056235493e-17 -8.659560562354932e-17 -vn -1 8.65956056235493e-17 8.659560562354932e-17 -vn 1.224646799147353e-16 0.7071067811865475 0.7071067811865476 -vn -1.232595164407831e-32 -0.7071067811865476 0.7071067811865475 -vn 8.659560562354932e-17 -1.1102230246251568e-16 1 -vn 1 -8.65956056235493e-17 -8.659560562354932e-17 -vn 8.659560562354933e-17 1 1.1102230246251565e-16 -vn -8.659560562354933e-17 -1 -1.1102230246251565e-16 -vn 8.65956056235493e-17 -1.1102230246251565e-16 1 -vn -8.65956056235493e-17 1.1102230246251565e-16 -1 -vn -1 8.65956056235493e-17 8.659560562354932e-17 -vn 8.659560562354933e-17 1 1.1102230246251565e-16 -vn -8.659560562354933e-17 -1 -1.1102230246251565e-16 -vn 8.65956056235493e-17 -1.1102230246251565e-16 1 -vn -8.65956056235493e-17 1.1102230246251565e-16 -1 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 -0.71 -0.71 +vn 0 0.71 0.71 +vn 0 0.71 -0.71 +vn 0 -0.71 0.71 +vn 1 0 0 +vn -1 0 0 +vn 0 0.71 -0.71 +vn 0 -0.71 0.71 +vn 0 -0.71 -0.71 +vn 0 0.71 0.71 +vn 1 0 0 +vn -1 0 0 +vn 0 0.71 0.71 +vn 0 -0.71 -0.71 +vn 0 -0.71 0.71 +vn 0 0.71 -0.71 +vn 1 0 0 +vn -1 0 0 +vn 0 -0.71 0.71 +vn 0 0.71 -0.71 +vn 0 0.71 0.71 +vn 0 -0.71 -0.71 +vn 1 0 0 +vn -1 0 0 +vn 0 0 -1 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn 1 0 0 +vn -1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 -1 0 +vn 0 1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 -1 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn -1 0 0 +vn 1 0 0 +vn 0 0.71 -0.71 +vn 0 -0.71 -0.71 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 0.71 0.71 +vn 0 -0.71 0.71 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 0.71 -0.71 +vn 0 -0.71 -0.71 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 0.71 0.71 +vn 0 -0.71 0.71 +vn 0 0 1 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 usemtl tracks14_12 -f 1793/5025/1257 1794/5026/1257 1798/5027/1257 -f 1793/5025/1257 1798/5027/1257 1797/5028/1257 -f 1796/5029/1258 1795/5030/1258 1799/5031/1258 -f 1796/5029/1258 1799/5031/1258 1800/5032/1258 -f 1795/5033/1259 1793/5034/1259 1797/5035/1259 -f 1795/5033/1259 1797/5035/1259 1799/5036/1259 -f 1800/5037/1260 1798/5038/1260 1794/5039/1260 -f 1800/5037/1260 1794/5039/1260 1796/5040/1260 -f 1804/5041/1261 1802/5042/1261 1801/5043/1261 -f 1804/5041/1261 1801/5043/1261 1803/5044/1261 -f 1807/5045/1262 1805/5046/1262 1806/5047/1262 -f 1807/5045/1262 1806/5047/1262 1808/5048/1262 -f 1801/5049/1263 1802/5050/1263 1806/5051/1263 -f 1801/5049/1263 1806/5051/1263 1805/5052/1263 -f 1804/5053/1264 1803/5054/1264 1807/5055/1264 -f 1804/5053/1264 1807/5055/1264 1808/5056/1264 -f 1803/5057/1265 1801/5058/1265 1805/5059/1265 -f 1803/5057/1265 1805/5059/1265 1807/5060/1265 -f 1808/5061/1266 1806/5062/1266 1802/5063/1266 -f 1808/5061/1266 1802/5063/1266 1804/5064/1266 -f 1809/5065/1267 1810/5066/1267 1812/5067/1267 -f 1809/5065/1267 1812/5067/1267 1811/5068/1267 -f 1814/5069/1268 1813/5070/1268 1815/5071/1268 -f 1814/5069/1268 1815/5071/1268 1816/5072/1268 -f 1814/5073/1269 1810/5074/1269 1809/5075/1269 -f 1814/5073/1269 1809/5075/1269 1813/5076/1269 -f 1815/5077/1270 1811/5078/1270 1812/5079/1270 -f 1815/5077/1270 1812/5079/1270 1816/5080/1270 -f 1813/5081/1271 1809/5082/1271 1811/5083/1271 -f 1813/5081/1271 1811/5083/1271 1815/5084/1271 -f 1810/5085/1272 1814/5086/1272 1816/5087/1272 -f 1810/5085/1272 1816/5087/1272 1812/5088/1272 -f 1820/5089/1273 1818/5090/1273 1817/5091/1273 -f 1820/5089/1273 1817/5091/1273 1819/5092/1273 -f 1823/5093/1274 1821/5094/1274 1822/5095/1274 -f 1823/5093/1274 1822/5095/1274 1824/5096/1274 -f 1817/5097/1275 1818/5098/1275 1822/5099/1275 -f 1817/5097/1275 1822/5099/1275 1821/5100/1275 -f 1820/5101/1276 1819/5102/1276 1823/5103/1276 -f 1820/5101/1276 1823/5103/1276 1824/5104/1276 -f 1819/5105/1277 1817/5106/1277 1821/5107/1277 -f 1819/5105/1277 1821/5107/1277 1823/5108/1277 -f 1824/5109/1278 1822/5110/1278 1818/5111/1278 -f 1824/5109/1278 1818/5111/1278 1820/5112/1278 -f 1825/5113/1279 1826/5114/1279 1828/5115/1279 -f 1825/5113/1279 1828/5115/1279 1827/5116/1279 -f 1830/5117/1280 1829/5118/1280 1831/5119/1280 -f 1830/5117/1280 1831/5119/1280 1832/5120/1280 -f 1830/5121/1281 1826/5122/1281 1825/5123/1281 -f 1830/5121/1281 1825/5123/1281 1829/5124/1281 -f 1831/5125/1282 1827/5126/1282 1828/5127/1282 -f 1831/5125/1282 1828/5127/1282 1832/5128/1282 -f 1829/5129/1283 1825/5130/1283 1827/5131/1283 -f 1829/5129/1283 1827/5131/1283 1831/5132/1283 -f 1826/5133/1284 1830/5134/1284 1832/5135/1284 -f 1826/5133/1284 1832/5135/1284 1828/5136/1284 -f 1836/5137/1285 1834/5138/1285 1833/5139/1285 -f 1836/5137/1285 1833/5139/1285 1835/5140/1285 -f 1839/5141/1286 1837/5142/1286 1838/5143/1286 -f 1839/5141/1286 1838/5143/1286 1840/5144/1286 -f 1833/5145/1287 1834/5146/1287 1838/5147/1287 -f 1833/5145/1287 1838/5147/1287 1837/5148/1287 -f 1836/5149/1288 1835/5150/1288 1839/5151/1288 -f 1836/5149/1288 1839/5151/1288 1840/5152/1288 -f 1835/5153/1289 1833/5154/1289 1837/5155/1289 -f 1835/5153/1289 1837/5155/1289 1839/5156/1289 -f 1840/5157/1290 1838/5158/1290 1834/5159/1290 -f 1840/5157/1290 1834/5159/1290 1836/5160/1290 -f 1841/5161/1291 1842/5162/1291 1844/5163/1291 -f 1841/5161/1291 1844/5163/1291 1843/5164/1291 -f 1846/5165/1292 1845/5166/1292 1847/5167/1292 -f 1846/5165/1292 1847/5167/1292 1848/5168/1292 -f 1846/5169/1293 1842/5170/1293 1841/5171/1293 -f 1846/5169/1293 1841/5171/1293 1845/5172/1293 -f 1847/5173/1294 1843/5174/1294 1844/5175/1294 -f 1847/5173/1294 1844/5175/1294 1848/5176/1294 -f 1845/5177/1295 1841/5178/1295 1843/5179/1295 -f 1845/5177/1295 1843/5179/1295 1847/5180/1295 -f 1842/5181/1296 1846/5182/1296 1848/5183/1296 -f 1842/5181/1296 1848/5183/1296 1844/5184/1296 -f 1852/5185/1297 1850/5186/1297 1849/5187/1297 -f 1852/5185/1297 1849/5187/1297 1851/5188/1297 -f 1855/5189/1298 1853/5190/1298 1854/5191/1298 -f 1855/5189/1298 1854/5191/1298 1856/5192/1298 -f 1849/5193/1299 1850/5194/1299 1854/5195/1299 -f 1849/5193/1299 1854/5195/1299 1853/5196/1299 -f 1852/5197/1300 1851/5198/1300 1855/5199/1300 -f 1852/5197/1300 1855/5199/1300 1856/5200/1300 -f 1851/5201/1301 1849/5202/1301 1853/5203/1301 -f 1851/5201/1301 1853/5203/1301 1855/5204/1301 -f 1856/5205/1302 1854/5206/1302 1850/5207/1302 -f 1856/5205/1302 1850/5207/1302 1852/5208/1302 -f 1857/5209/1303 1858/5210/1303 1860/5211/1303 -f 1857/5209/1303 1860/5211/1303 1859/5212/1303 -f 1862/5213/1304 1861/5214/1304 1863/5215/1304 -f 1862/5213/1304 1863/5215/1304 1864/5216/1304 -f 1862/5217/1305 1858/5218/1305 1857/5219/1305 -f 1862/5217/1305 1857/5219/1305 1861/5220/1305 -f 1863/5221/1306 1859/5222/1306 1860/5223/1306 -f 1863/5221/1306 1860/5223/1306 1864/5224/1306 -f 1861/5225/1307 1857/5226/1307 1859/5227/1307 -f 1861/5225/1307 1859/5227/1307 1863/5228/1307 -f 1858/5229/1308 1862/5230/1308 1864/5231/1308 -f 1858/5229/1308 1864/5231/1308 1860/5232/1308 -f 1868/5233/1309 1866/5234/1309 1865/5235/1309 -f 1868/5233/1309 1865/5235/1309 1867/5236/1309 -f 1871/5237/1310 1869/5238/1310 1870/5239/1310 -f 1871/5237/1310 1870/5239/1310 1872/5240/1310 -f 1865/5241/1311 1866/5242/1311 1870/5243/1311 -f 1865/5241/1311 1870/5243/1311 1869/5244/1311 -f 1868/5245/1312 1867/5246/1312 1871/5247/1312 -f 1868/5245/1312 1871/5247/1312 1872/5248/1312 -f 1867/5249/1313 1865/5250/1313 1869/5251/1313 -f 1867/5249/1313 1869/5251/1313 1871/5252/1313 -f 1876/5253/1314 1874/5254/1314 1873/5255/1314 -f 1876/5253/1314 1873/5255/1314 1875/5256/1314 -f 1879/5257/1315 1877/5258/1315 1878/5259/1315 -f 1879/5257/1315 1878/5259/1315 1880/5260/1315 -f 1873/5261/1316 1874/5262/1316 1878/5263/1316 -f 1873/5261/1316 1878/5263/1316 1877/5264/1316 -f 1876/5265/1317 1875/5266/1317 1879/5267/1317 -f 1876/5265/1317 1879/5267/1317 1880/5268/1317 -f 1884/5269/1318 1882/5270/1318 1881/5271/1318 -f 1884/5269/1318 1881/5271/1318 1883/5272/1318 -f 1887/5273/1319 1885/5274/1319 1886/5275/1319 -f 1887/5273/1319 1886/5275/1319 1888/5276/1319 -f 1881/5277/1320 1882/5278/1320 1886/5279/1320 -f 1881/5277/1320 1886/5279/1320 1885/5280/1320 -f 1884/5281/1321 1883/5282/1321 1887/5283/1321 -f 1884/5281/1321 1887/5283/1321 1888/5284/1321 -f 1883/5285/1322 1881/5286/1322 1885/5287/1322 -f 1883/5285/1322 1885/5287/1322 1887/5288/1322 -f 1892/5289/1323 1890/5290/1323 1889/5291/1323 -f 1892/5289/1323 1889/5291/1323 1891/5292/1323 -f 1895/5293/1324 1893/5294/1324 1894/5295/1324 -f 1895/5293/1324 1894/5295/1324 1896/5296/1324 -f 1889/5297/1325 1890/5298/1325 1894/5299/1325 -f 1889/5297/1325 1894/5299/1325 1893/5300/1325 -f 1892/5301/1326 1891/5302/1326 1895/5303/1326 -f 1892/5301/1326 1895/5303/1326 1896/5304/1326 -f 1891/5305/1327 1889/5306/1327 1893/5307/1327 -f 1891/5305/1327 1893/5307/1327 1895/5308/1327 -f 1900/5309/1328 1898/5310/1328 1897/5311/1328 -f 1900/5309/1328 1897/5311/1328 1899/5312/1328 -f 1903/5313/1329 1901/5314/1329 1902/5315/1329 -f 1903/5313/1329 1902/5315/1329 1904/5316/1329 -f 1897/5317/1330 1898/5318/1330 1902/5319/1330 -f 1897/5317/1330 1902/5319/1330 1901/5320/1330 -f 1900/5321/1331 1899/5322/1331 1903/5323/1331 -f 1900/5321/1331 1903/5323/1331 1904/5324/1331 -f 1908/5325/1332 1906/5326/1332 1905/5327/1332 -f 1908/5325/1332 1905/5327/1332 1907/5328/1332 -f 1911/5329/1333 1909/5330/1333 1910/5331/1333 -f 1911/5329/1333 1910/5331/1333 1912/5332/1333 -f 1905/5333/1334 1906/5334/1334 1910/5335/1334 -f 1905/5333/1334 1910/5335/1334 1909/5336/1334 -f 1908/5337/1335 1907/5338/1335 1911/5339/1335 -f 1908/5337/1335 1911/5339/1335 1912/5340/1335 -f 1907/5341/1336 1905/5342/1336 1909/5343/1336 -f 1907/5341/1336 1909/5343/1336 1911/5344/1336 -f 1916/5345/1337 1914/5346/1337 1913/5347/1337 -f 1916/5345/1337 1913/5347/1337 1915/5348/1337 -f 1913/5349/1338 1914/5350/1338 1918/5351/1338 -f 1913/5349/1338 1918/5351/1338 1917/5352/1338 -f 1916/5353/1339 1915/5354/1339 1919/5355/1339 -f 1916/5353/1339 1919/5355/1339 1920/5356/1339 -f 1915/5357/1340 1913/5358/1340 1917/5359/1340 -f 1915/5357/1340 1917/5359/1340 1919/5360/1340 -f 1920/5361/1341 1918/5362/1341 1914/5363/1341 -f 1920/5361/1341 1914/5363/1341 1916/5364/1341 -f 1921/5365/1342 1922/5366/1342 1924/5367/1342 -f 1921/5365/1342 1924/5367/1342 1923/5368/1342 -f 1926/5369/1343 1922/5370/1343 1921/5371/1343 -f 1926/5369/1343 1921/5371/1343 1925/5372/1343 -f 1927/5373/1344 1923/5374/1344 1924/5375/1344 -f 1927/5373/1344 1924/5375/1344 1928/5376/1344 -f 1925/5377/1345 1921/5378/1345 1923/5379/1345 -f 1925/5377/1345 1923/5379/1345 1927/5380/1345 -f 1922/5381/1346 1926/5382/1346 1928/5383/1346 -f 1922/5381/1346 1928/5383/1346 1924/5384/1346 +f 1793/5025/1257 1794/5026/1257 1798/5027/1257 1797/5028/1257 +f 1796/5029/1258 1795/5030/1258 1799/5031/1258 1800/5032/1258 +f 1795/5033/1259 1793/5034/1259 1797/5035/1259 1799/5036/1259 +f 1800/5037/1260 1798/5038/1260 1794/5039/1260 1796/5040/1260 +f 1804/5041/1261 1802/5042/1261 1801/5043/1261 1803/5044/1261 +f 1807/5045/1262 1805/5046/1262 1806/5047/1262 1808/5048/1262 +f 1801/5049/1263 1802/5050/1263 1806/5051/1263 1805/5052/1263 +f 1804/5053/1264 1803/5054/1264 1807/5055/1264 1808/5056/1264 +f 1803/5057/1265 1801/5058/1265 1805/5059/1265 1807/5060/1265 +f 1808/5061/1266 1806/5062/1266 1802/5063/1266 1804/5064/1266 +f 1809/5065/1267 1810/5066/1267 1812/5067/1267 1811/5068/1267 +f 1814/5069/1268 1813/5070/1268 1815/5071/1268 1816/5072/1268 +f 1814/5073/1269 1810/5074/1269 1809/5075/1269 1813/5076/1269 +f 1815/5077/1270 1811/5078/1270 1812/5079/1270 1816/5080/1270 +f 1813/5081/1271 1809/5082/1271 1811/5083/1271 1815/5084/1271 +f 1810/5085/1272 1814/5086/1272 1816/5087/1272 1812/5088/1272 +f 1820/5089/1273 1818/5090/1273 1817/5091/1273 1819/5092/1273 +f 1823/5093/1274 1821/5094/1274 1822/5095/1274 1824/5096/1274 +f 1817/5097/1275 1818/5098/1275 1822/5099/1275 1821/5100/1275 +f 1820/5101/1276 1819/5102/1276 1823/5103/1276 1824/5104/1276 +f 1819/5105/1277 1817/5106/1277 1821/5107/1277 1823/5108/1277 +f 1824/5109/1278 1822/5110/1278 1818/5111/1278 1820/5112/1278 +f 1825/5113/1279 1826/5114/1279 1828/5115/1279 1827/5116/1279 +f 1830/5117/1280 1829/5118/1280 1831/5119/1280 1832/5120/1280 +f 1830/5121/1281 1826/5122/1281 1825/5123/1281 1829/5124/1281 +f 1831/5125/1282 1827/5126/1282 1828/5127/1282 1832/5128/1282 +f 1829/5129/1283 1825/5130/1283 1827/5131/1283 1831/5132/1283 +f 1826/5133/1284 1830/5134/1284 1832/5135/1284 1828/5136/1284 +f 1836/5137/1285 1834/5138/1285 1833/5139/1285 1835/5140/1285 +f 1839/5141/1286 1837/5142/1286 1838/5143/1286 1840/5144/1286 +f 1833/5145/1287 1834/5146/1287 1838/5147/1287 1837/5148/1287 +f 1836/5149/1288 1835/5150/1288 1839/5151/1288 1840/5152/1288 +f 1835/5153/1289 1833/5154/1289 1837/5155/1289 1839/5156/1289 +f 1840/5157/1290 1838/5158/1290 1834/5159/1290 1836/5160/1290 +f 1841/5161/1291 1842/5162/1291 1844/5163/1291 1843/5164/1291 +f 1846/5165/1292 1845/5166/1292 1847/5167/1292 1848/5168/1292 +f 1846/5169/1293 1842/5170/1293 1841/5171/1293 1845/5172/1293 +f 1847/5173/1294 1843/5174/1294 1844/5175/1294 1848/5176/1294 +f 1845/5177/1295 1841/5178/1295 1843/5179/1295 1847/5180/1295 +f 1842/5181/1296 1846/5182/1296 1848/5183/1296 1844/5184/1296 +f 1852/5185/1297 1850/5186/1297 1849/5187/1297 1851/5188/1297 +f 1855/5189/1298 1853/5190/1298 1854/5191/1298 1856/5192/1298 +f 1849/5193/1299 1850/5194/1299 1854/5195/1299 1853/5196/1299 +f 1852/5197/1300 1851/5198/1300 1855/5199/1300 1856/5200/1300 +f 1851/5201/1301 1849/5202/1301 1853/5203/1301 1855/5204/1301 +f 1856/5205/1302 1854/5206/1302 1850/5207/1302 1852/5208/1302 +f 1857/5209/1303 1858/5210/1303 1860/5211/1303 1859/5212/1303 +f 1862/5213/1304 1861/5214/1304 1863/5215/1304 1864/5216/1304 +f 1862/5217/1305 1858/5218/1305 1857/5219/1305 1861/5220/1305 +f 1863/5221/1306 1859/5222/1306 1860/5223/1306 1864/5224/1306 +f 1861/5225/1307 1857/5226/1307 1859/5227/1307 1863/5228/1307 +f 1858/5229/1308 1862/5230/1308 1864/5231/1308 1860/5232/1308 +f 1868/5233/1309 1866/5234/1309 1865/5235/1309 1867/5236/1309 +f 1871/5237/1310 1869/5238/1310 1870/5239/1310 1872/5240/1310 +f 1865/5241/1311 1866/5242/1311 1870/5243/1311 1869/5244/1311 +f 1868/5245/1312 1867/5246/1312 1871/5247/1312 1872/5248/1312 +f 1867/5249/1313 1865/5250/1313 1869/5251/1313 1871/5252/1313 +f 1876/5253/1314 1874/5254/1314 1873/5255/1314 1875/5256/1314 +f 1879/5257/1315 1877/5258/1315 1878/5259/1315 1880/5260/1315 +f 1873/5261/1316 1874/5262/1316 1878/5263/1316 1877/5264/1316 +f 1876/5265/1317 1875/5266/1317 1879/5267/1317 1880/5268/1317 +f 1884/5269/1318 1882/5270/1318 1881/5271/1318 1883/5272/1318 +f 1887/5273/1319 1885/5274/1319 1886/5275/1319 1888/5276/1319 +f 1881/5277/1320 1882/5278/1320 1886/5279/1320 1885/5280/1320 +f 1884/5281/1321 1883/5282/1321 1887/5283/1321 1888/5284/1321 +f 1883/5285/1322 1881/5286/1322 1885/5287/1322 1887/5288/1322 +f 1892/5289/1323 1890/5290/1323 1889/5291/1323 1891/5292/1323 +f 1895/5293/1324 1893/5294/1324 1894/5295/1324 1896/5296/1324 +f 1889/5297/1325 1890/5298/1325 1894/5299/1325 1893/5300/1325 +f 1892/5301/1326 1891/5302/1326 1895/5303/1326 1896/5304/1326 +f 1891/5305/1327 1889/5306/1327 1893/5307/1327 1895/5308/1327 +f 1900/5309/1328 1898/5310/1328 1897/5311/1328 1899/5312/1328 +f 1903/5313/1329 1901/5314/1329 1902/5315/1329 1904/5316/1329 +f 1897/5317/1330 1898/5318/1330 1902/5319/1330 1901/5320/1330 +f 1900/5321/1331 1899/5322/1331 1903/5323/1331 1904/5324/1331 +f 1908/5325/1332 1906/5326/1332 1905/5327/1332 1907/5328/1332 +f 1911/5329/1333 1909/5330/1333 1910/5331/1333 1912/5332/1333 +f 1905/5333/1334 1906/5334/1334 1910/5335/1334 1909/5336/1334 +f 1908/5337/1335 1907/5338/1335 1911/5339/1335 1912/5340/1335 +f 1907/5341/1336 1905/5342/1336 1909/5343/1336 1911/5344/1336 +f 1916/5345/1337 1914/5346/1337 1913/5347/1337 1915/5348/1337 +f 1913/5349/1338 1914/5350/1338 1918/5351/1338 1917/5352/1338 +f 1916/5353/1339 1915/5354/1339 1919/5355/1339 1920/5356/1339 +f 1915/5357/1340 1913/5358/1340 1917/5359/1340 1919/5360/1340 +f 1920/5361/1341 1918/5362/1341 1914/5363/1341 1916/5364/1341 +f 1921/5365/1342 1922/5366/1342 1924/5367/1342 1923/5368/1342 +f 1926/5369/1343 1922/5370/1343 1921/5371/1343 1925/5372/1343 +f 1927/5373/1344 1923/5374/1344 1924/5375/1344 1928/5376/1344 +f 1925/5377/1345 1921/5378/1345 1923/5379/1345 1927/5380/1345 +f 1922/5381/1346 1926/5382/1346 1928/5383/1346 1924/5384/1346 o RightWheelRear1 -v 0.875 1.0624999696333308 2.249999969633331 -v 0.875 1.0624999696333308 1.8750000303666692 -v 0.875 0.6875000303666692 2.249999969633331 -v 0.875 0.6875000303666692 1.8750000303666692 -v 0.75 1.0624999696333308 2.249999969633331 -v 0.75 1.0624999696333308 1.8750000303666692 -v 0.75 0.6875000303666692 2.249999969633331 -v 0.75 0.6875000303666692 1.8750000303666692 -v 1 1.162262129857035 2.217179608384557 -v 1 1.0296796083845572 2.349762129857035 -v 1 1.2064563036811942 2.2613737822087163 -v 1 1.0738737822087165 2.393956303681194 -v 0.625 1.162262129857035 2.217179608384557 -v 0.625 1.0296796083845572 2.349762129857035 -v 0.625 1.2064563036811942 2.2613737822087163 -v 0.625 1.0738737822087165 2.393956303681194 -v 1 0.5877378701429651 2.217179608384557 -v 1 0.7203203916154427 2.349762129857035 -v 1 0.5435436963188058 2.2613737822087163 -v 1 0.6761262177912835 2.393956303681194 -v 0.625 0.5877378701429651 2.217179608384557 -v 0.625 0.7203203916154427 2.349762129857035 -v 0.625 0.5435436963188058 2.2613737822087163 -v 0.625 0.6761262177912835 2.393956303681194 -v 1 0.5877378701429651 1.9078203916154428 -v 1 0.7203203916154427 1.775237870142965 -v 1 0.5435436963188058 1.8636262177912835 -v 1 0.6761262177912836 1.7310436963188058 -v 0.625 0.5877378701429651 1.9078203916154428 -v 0.625 0.7203203916154428 1.775237870142965 -v 0.625 0.5435436963188058 1.8636262177912835 -v 0.625 0.6761262177912836 1.7310436963188058 -v 1 1.162262129857035 1.9078203916154428 -v 1 1.0296796083845572 1.775237870142965 -v 1 1.2064563036811942 1.8636262177912835 -v 1 1.0738737822087165 1.7310436963188058 -v 0.625 1.162262129857035 1.9078203916154428 -v 0.625 1.0296796083845572 1.775237870142965 -v 0.625 1.2064563036811942 1.8636262177912837 -v 0.625 1.0738737822087165 1.7310436963188058 -v 1 0.9687499848166654 2.3749996547610595 -v 1 0.7812500151833346 2.3749996547610595 -v 1 0.9687499848166654 2.4374999392666616 -v 1 0.7812500151833345 2.4374999392666616 -v 0.625 0.9687499848166654 2.3749996547610595 -v 0.625 0.7812500151833346 2.3749996547610595 -v 0.625 0.9687499848166654 2.4374999392666616 -v 0.625 0.7812500151833346 2.4374999392666616 -v 1 0.5625003452389407 1.9687500151833346 -v 1 0.5625003452389407 2.1562499848166654 -v 1 0.5000000607333382 1.9687500151833346 -v 1 0.5000000607333382 2.1562499848166654 -v 0.625 0.5625003452389408 1.9687500151833346 -v 0.625 0.5625003452389408 2.1562499848166654 -v 0.625 0.5000000607333384 1.9687500151833346 -v 0.625 0.5000000607333382 2.1562499848166654 -v 1 0.7812500151833346 1.7500003452389405 -v 1 0.9687499848166654 1.7500003452389408 -v 1 0.7812500151833346 1.6875000607333384 -v 1 0.9687499848166654 1.6875000607333384 -v 0.625 0.7812500151833346 1.7500003452389408 -v 0.625 0.9687499848166654 1.7500003452389408 -v 0.625 0.7812500151833346 1.6875000607333384 -v 0.625 0.9687499848166655 1.6875000607333384 -v 1 1.1874996547610592 2.1562499848166654 -v 1 1.1874996547610592 1.9687500151833346 -v 1 1.2499999392666616 2.1562499848166654 -v 1 1.2499999392666616 1.9687500151833346 -v 0.625 1.1874996547610595 2.1562499848166654 -v 0.625 1.1874996547610595 1.9687500151833346 -v 0.625 1.2499999392666616 2.1562499848166654 -v 0.625 1.2499999392666616 1.9687500151833346 -v 0.875 1.0000001270694667 1.7499999032972025 -v 0.875 1.1875000967027975 1.9374998729305333 -v 0.875 0.7499998729305334 1.7499999032972025 -v 0.875 0.5624999032972025 1.9374998729305333 -v 0.9375 1.0000001270694667 1.7499999032972025 -v 0.9375 1.1875000967027975 1.9374998729305333 -v 0.9375 0.7499998729305334 1.7499999032972025 -v 0.9375 0.5624999032972025 1.9374998729305333 -v 0.9375 1.1875000967027975 2.1875001270694665 -v 0.9375 1.1875000967027975 1.9374998729305333 -v 0.9375 0.5624999032972025 2.1875001270694665 -v 0.9375 0.5624999032972025 1.9374998729305333 -v 0.875 1.1875000967027975 2.1875001270694665 -v 0.875 1.1875000967027975 1.9374998729305333 -v 0.875 0.5624999032972025 2.1875001270694665 -v 0.875 0.5624999032972025 1.9374998729305333 -v 0.9375 1.0000001270694667 2.3750000967027978 -v 0.9375 1.1875000967027975 2.1875001270694665 -v 0.9375 0.7499998729305333 2.3750000967027973 -v 0.9375 0.5624999032972025 2.1875001270694665 -v 0.875 1.0000001270694667 2.3750000967027978 -v 0.875 1.1875000967027975 2.1875001270694665 -v 0.875 0.7499998729305333 2.3750000967027978 -v 0.875 0.5624999032972025 2.1875001270694665 -v 0.6875 1.0000001270694667 1.7499999032972025 -v 0.6875 1.1875000967027975 1.9374998729305335 -v 0.6875 0.7499998729305334 1.7499999032972025 -v 0.6875 0.5624999032972025 1.9374998729305333 -v 0.75 1.0000001270694667 1.7499999032972025 -v 0.75 1.1875000967027975 1.9374998729305333 -v 0.75 0.7499998729305334 1.7499999032972025 -v 0.75 0.5624999032972025 1.9374998729305333 -v 0.75 1.1875000967027975 2.1875001270694665 -v 0.75 1.1875000967027975 1.9374998729305333 -v 0.75 0.5624999032972025 2.1875001270694665 -v 0.75 0.5624999032972025 1.9374998729305333 -v 0.6875 1.1875000967027975 2.1875001270694665 -v 0.6875 1.1875000967027975 1.9374998729305335 -v 0.6875 0.5624999032972025 2.1875001270694665 -v 0.6875 0.5624999032972025 1.9374998729305333 -v 0.75 1.0000001270694667 2.3750000967027978 -v 0.75 1.1875000967027975 2.1875001270694665 -v 0.75 0.7499998729305333 2.3750000967027978 -v 0.75 0.5624999032972025 2.1875001270694665 -v 0.6875 1.0000001270694667 2.3750000967027978 -v 0.6875 1.1875000967027975 2.1875001270694665 -v 0.6875 0.7499998729305333 2.3750000967027978 -v 0.6875 0.5624999032972025 2.1875001270694665 -v 1 1.0624999696333308 2.249999969633331 -v 1 1.0624999696333308 1.8750000303666692 -v 1 0.6875000303666691 2.249999969633331 -v 1 0.6875000303666692 1.8750000303666692 -v 0.9375 1.0624999696333308 2.249999969633331 -v 0.9375 1.0624999696333308 1.8750000303666692 -v 0.9375 0.6875000303666692 2.249999969633331 -v 0.9375 0.6875000303666692 1.8750000303666692 -v 0.625 1.0624999696333308 2.249999969633331 -v 0.625 1.0624999696333308 1.8750000303666692 -v 0.625 0.6875000303666692 2.249999969633331 -v 0.625 0.6875000303666692 1.8750000303666692 -v 0.6875 1.0624999696333308 2.249999969633331 -v 0.6875 1.0624999696333308 1.8750000303666692 -v 0.6875 0.6875000303666692 2.249999969633331 -v 0.6875 0.6875000303666692 1.8750000303666692 +v 0.875 1.0625 2.25 +v 0.875 1.0625 1.875 +v 0.875 0.6875 2.25 +v 0.875 0.6875 1.875 +v 0.75 1.0625 2.25 +v 0.75 1.0625 1.875 +v 0.75 0.6875 2.25 +v 0.75 0.6875 1.875 +v 1 1.1623 2.2172 +v 1 1.0297 2.3498 +v 1 1.2065 2.2614 +v 1 1.0739 2.394 +v 0.625 1.1623 2.2172 +v 0.625 1.0297 2.3498 +v 0.625 1.2065 2.2614 +v 0.625 1.0739 2.394 +v 1 0.5877 2.2172 +v 1 0.7203 2.3498 +v 1 0.5435 2.2614 +v 1 0.6761 2.394 +v 0.625 0.5877 2.2172 +v 0.625 0.7203 2.3498 +v 0.625 0.5435 2.2614 +v 0.625 0.6761 2.394 +v 1 0.5877 1.9078 +v 1 0.7203 1.7752 +v 1 0.5435 1.8636 +v 1 0.6761 1.731 +v 0.625 0.5877 1.9078 +v 0.625 0.7203 1.7752 +v 0.625 0.5435 1.8636 +v 0.625 0.6761 1.731 +v 1 1.1623 1.9078 +v 1 1.0297 1.7752 +v 1 1.2065 1.8636 +v 1 1.0739 1.731 +v 0.625 1.1623 1.9078 +v 0.625 1.0297 1.7752 +v 0.625 1.2065 1.8636 +v 0.625 1.0739 1.731 +v 1 0.9687 2.375 +v 1 0.7813 2.375 +v 1 0.9687 2.4375 +v 1 0.7813 2.4375 +v 0.625 0.9687 2.375 +v 0.625 0.7813 2.375 +v 0.625 0.9687 2.4375 +v 0.625 0.7813 2.4375 +v 1 0.5625 1.9688 +v 1 0.5625 2.1562 +v 1 0.5 1.9688 +v 1 0.5 2.1562 +v 0.625 0.5625 1.9688 +v 0.625 0.5625 2.1562 +v 0.625 0.5 1.9688 +v 0.625 0.5 2.1562 +v 1 0.7813 1.75 +v 1 0.9687 1.75 +v 1 0.7813 1.6875 +v 1 0.9687 1.6875 +v 0.625 0.7813 1.75 +v 0.625 0.9687 1.75 +v 0.625 0.7813 1.6875 +v 0.625 0.9687 1.6875 +v 1 1.1875 2.1562 +v 1 1.1875 1.9688 +v 1 1.25 2.1562 +v 1 1.25 1.9688 +v 0.625 1.1875 2.1562 +v 0.625 1.1875 1.9688 +v 0.625 1.25 2.1562 +v 0.625 1.25 1.9688 +v 0.875 1 1.75 +v 0.875 1.1875 1.9375 +v 0.875 0.75 1.75 +v 0.875 0.5625 1.9375 +v 0.9375 1 1.75 +v 0.9375 1.1875 1.9375 +v 0.9375 0.75 1.75 +v 0.9375 0.5625 1.9375 +v 0.9375 1.1875 2.1875 +v 0.9375 1.1875 1.9375 +v 0.9375 0.5625 2.1875 +v 0.9375 0.5625 1.9375 +v 0.875 1.1875 2.1875 +v 0.875 1.1875 1.9375 +v 0.875 0.5625 2.1875 +v 0.875 0.5625 1.9375 +v 0.9375 1 2.375 +v 0.9375 1.1875 2.1875 +v 0.9375 0.75 2.375 +v 0.9375 0.5625 2.1875 +v 0.875 1 2.375 +v 0.875 1.1875 2.1875 +v 0.875 0.75 2.375 +v 0.875 0.5625 2.1875 +v 0.6875 1 1.75 +v 0.6875 1.1875 1.9375 +v 0.6875 0.75 1.75 +v 0.6875 0.5625 1.9375 +v 0.75 1 1.75 +v 0.75 1.1875 1.9375 +v 0.75 0.75 1.75 +v 0.75 0.5625 1.9375 +v 0.75 1.1875 2.1875 +v 0.75 1.1875 1.9375 +v 0.75 0.5625 2.1875 +v 0.75 0.5625 1.9375 +v 0.6875 1.1875 2.1875 +v 0.6875 1.1875 1.9375 +v 0.6875 0.5625 2.1875 +v 0.6875 0.5625 1.9375 +v 0.75 1 2.375 +v 0.75 1.1875 2.1875 +v 0.75 0.75 2.375 +v 0.75 0.5625 2.1875 +v 0.6875 1 2.375 +v 0.6875 1.1875 2.1875 +v 0.6875 0.75 2.375 +v 0.6875 0.5625 2.1875 +v 1 1.0625 2.25 +v 1 1.0625 1.875 +v 1 0.6875 2.25 +v 1 0.6875 1.875 +v 0.9375 1.0625 2.25 +v 0.9375 1.0625 1.875 +v 0.9375 0.6875 2.25 +v 0.9375 0.6875 1.875 +v 0.625 1.0625 2.25 +v 0.625 1.0625 1.875 +v 0.625 0.6875 2.25 +v 0.625 0.6875 1.875 +v 0.6875 1.0625 2.25 +v 0.6875 1.0625 1.875 +v 0.6875 0.6875 2.25 +v 0.6875 0.6875 1.875 vt 0.0625 0.6875 vt 0.0625 0.5 vt 0 0.5 @@ -11800,13 +10453,13 @@ vt 0.0625 0.5 vt 0 0.5 vt 0 0.6875 vt 0.8125 0.6875 -vt 0.8125 0.71875 -vt 0.9375 0.71875 +vt 0.8125 0.7188 +vt 0.9375 0.7188 vt 0.9375 0.6875 -vt 0.9375 0.90625 +vt 0.9375 0.9063 vt 0.9375 0.9375 vt 0.8125 0.9375 -vt 0.8125 0.90625 +vt 0.8125 0.9063 vt 0.9375 0.6875 vt 0.8125 0.6875 vt 0.8125 0.9375 @@ -11816,21 +10469,21 @@ vt 0.9375 0.6875 vt 0.9375 0.9375 vt 0.8125 0.9375 vt 0.9375 0.6875 -vt 0.90625 0.6875 -vt 0.90625 0.9375 +vt 0.9063 0.6875 +vt 0.9063 0.9375 vt 0.9375 0.9375 vt 0.8125 0.9375 -vt 0.84375 0.9375 -vt 0.84375 0.6875 +vt 0.8438 0.9375 +vt 0.8438 0.6875 vt 0.8125 0.6875 -vt 0.9375 0.71875 -vt 0.8125 0.71875 +vt 0.9375 0.7188 +vt 0.8125 0.7188 vt 0.8125 0.6875 vt 0.9375 0.6875 vt 0.8125 0.9375 vt 0.9375 0.9375 -vt 0.9375 0.90625 -vt 0.8125 0.90625 +vt 0.9375 0.9063 +vt 0.8125 0.9063 vt 0.8125 0.9375 vt 0.8125 0.6875 vt 0.9375 0.6875 @@ -11839,22 +10492,22 @@ vt 0.9375 0.9375 vt 0.9375 0.6875 vt 0.8125 0.6875 vt 0.8125 0.9375 -vt 0.90625 0.9375 -vt 0.90625 0.6875 +vt 0.9063 0.9375 +vt 0.9063 0.6875 vt 0.9375 0.6875 vt 0.9375 0.9375 -vt 0.84375 0.6875 -vt 0.84375 0.9375 +vt 0.8438 0.6875 +vt 0.8438 0.9375 vt 0.8125 0.9375 vt 0.8125 0.6875 vt 0.8125 0.6875 -vt 0.8125 0.71875 -vt 0.9375 0.71875 +vt 0.8125 0.7188 +vt 0.9375 0.7188 vt 0.9375 0.6875 -vt 0.9375 0.90625 +vt 0.9375 0.9063 vt 0.9375 0.9375 vt 0.8125 0.9375 -vt 0.8125 0.90625 +vt 0.8125 0.9063 vt 0.9375 0.6875 vt 0.8125 0.6875 vt 0.8125 0.9375 @@ -11864,21 +10517,21 @@ vt 0.9375 0.6875 vt 0.9375 0.9375 vt 0.8125 0.9375 vt 0.9375 0.6875 -vt 0.90625 0.6875 -vt 0.90625 0.9375 +vt 0.9063 0.6875 +vt 0.9063 0.9375 vt 0.9375 0.9375 vt 0.8125 0.9375 -vt 0.84375 0.9375 -vt 0.84375 0.6875 +vt 0.8438 0.9375 +vt 0.8438 0.6875 vt 0.8125 0.6875 -vt 0.9375 0.71875 -vt 0.8125 0.71875 +vt 0.9375 0.7188 +vt 0.8125 0.7188 vt 0.8125 0.6875 vt 0.9375 0.6875 vt 0.8125 0.9375 vt 0.9375 0.9375 -vt 0.9375 0.90625 -vt 0.8125 0.90625 +vt 0.9375 0.9063 +vt 0.8125 0.9063 vt 0.8125 0.9375 vt 0.8125 0.6875 vt 0.9375 0.6875 @@ -11887,22 +10540,22 @@ vt 0.9375 0.9375 vt 0.9375 0.6875 vt 0.8125 0.6875 vt 0.8125 0.9375 -vt 0.90625 0.9375 -vt 0.90625 0.6875 +vt 0.9063 0.9375 +vt 0.9063 0.6875 vt 0.9375 0.6875 vt 0.9375 0.9375 -vt 0.84375 0.6875 -vt 0.84375 0.9375 +vt 0.8438 0.6875 +vt 0.8438 0.9375 vt 0.8125 0.9375 vt 0.8125 0.6875 vt 0.8125 0.6875 -vt 0.8125 0.71875 -vt 0.9375 0.71875 +vt 0.8125 0.7188 +vt 0.9375 0.7188 vt 0.9375 0.6875 -vt 0.9375 0.90625 +vt 0.9375 0.9063 vt 0.9375 0.9375 vt 0.8125 0.9375 -vt 0.8125 0.90625 +vt 0.8125 0.9063 vt 0.9375 0.6875 vt 0.8125 0.6875 vt 0.8125 0.9375 @@ -11912,21 +10565,21 @@ vt 0.9375 0.6875 vt 0.9375 0.9375 vt 0.8125 0.9375 vt 0.9375 0.6875 -vt 0.90625 0.6875 -vt 0.90625 0.9375 +vt 0.9063 0.6875 +vt 0.9063 0.9375 vt 0.9375 0.9375 vt 0.8125 0.9375 -vt 0.84375 0.9375 -vt 0.84375 0.6875 +vt 0.8438 0.9375 +vt 0.8438 0.6875 vt 0.8125 0.6875 -vt 0.9375 0.71875 -vt 0.8125 0.71875 +vt 0.9375 0.7188 +vt 0.8125 0.7188 vt 0.8125 0.6875 vt 0.9375 0.6875 vt 0.8125 0.9375 vt 0.9375 0.9375 -vt 0.9375 0.90625 -vt 0.8125 0.90625 +vt 0.9375 0.9063 +vt 0.8125 0.9063 vt 0.8125 0.9375 vt 0.8125 0.6875 vt 0.9375 0.6875 @@ -11935,22 +10588,22 @@ vt 0.9375 0.9375 vt 0.9375 0.6875 vt 0.8125 0.6875 vt 0.8125 0.9375 -vt 0.90625 0.9375 -vt 0.90625 0.6875 +vt 0.9063 0.9375 +vt 0.9063 0.6875 vt 0.9375 0.6875 vt 0.9375 0.9375 -vt 0.84375 0.6875 -vt 0.84375 0.9375 +vt 0.8438 0.6875 +vt 0.8438 0.9375 vt 0.8125 0.9375 vt 0.8125 0.6875 vt 0.8125 0.6875 -vt 0.8125 0.71875 -vt 0.9375 0.71875 +vt 0.8125 0.7188 +vt 0.9375 0.7188 vt 0.9375 0.6875 -vt 0.9375 0.90625 +vt 0.9375 0.9063 vt 0.9375 0.9375 vt 0.8125 0.9375 -vt 0.8125 0.90625 +vt 0.8125 0.9063 vt 0.9375 0.6875 vt 0.8125 0.6875 vt 0.8125 0.9375 @@ -11960,21 +10613,21 @@ vt 0.9375 0.6875 vt 0.9375 0.9375 vt 0.8125 0.9375 vt 0.9375 0.6875 -vt 0.90625 0.6875 -vt 0.90625 0.9375 +vt 0.9063 0.6875 +vt 0.9063 0.9375 vt 0.9375 0.9375 vt 0.8125 0.9375 -vt 0.84375 0.9375 -vt 0.84375 0.6875 +vt 0.8438 0.9375 +vt 0.8438 0.6875 vt 0.8125 0.6875 -vt 0.9375 0.71875 -vt 0.8125 0.71875 +vt 0.9375 0.7188 +vt 0.8125 0.7188 vt 0.8125 0.6875 vt 0.9375 0.6875 vt 0.8125 0.9375 vt 0.9375 0.9375 -vt 0.9375 0.90625 -vt 0.8125 0.90625 +vt 0.9375 0.9063 +vt 0.8125 0.9063 vt 0.8125 0.9375 vt 0.8125 0.6875 vt 0.9375 0.6875 @@ -11983,574 +10636,484 @@ vt 0.9375 0.9375 vt 0.9375 0.6875 vt 0.8125 0.6875 vt 0.8125 0.9375 -vt 0.90625 0.9375 -vt 0.90625 0.6875 +vt 0.9063 0.9375 +vt 0.9063 0.6875 vt 0.9375 0.6875 vt 0.9375 0.9375 -vt 0.84375 0.6875 -vt 0.84375 0.9375 +vt 0.8438 0.6875 +vt 0.8438 0.9375 vt 0.8125 0.9375 vt 0.8125 0.6875 vt 0.175 0.5625 vt 0.175 0.9375 vt 0.0625 0.825 vt 0.0625 0.675 -vt 0.0625025 0.8249984375 -vt 0.0625 0.6749974999999999 -vt 0.1749990625 0.5624984375 -vt 0.1749990625 0.9375 -vt 0.09375 0.6875 -vt 0.09375 0.8125 +vt 0.0625 0.825 +vt 0.0625 0.675 +vt 0.175 0.5625 +vt 0.175 0.9375 +vt 0.0938 0.6875 +vt 0.0938 0.8125 vt 0.0625 0.8125 vt 0.0625 0.6875 -vt 0.09375 0.6875 -vt 0.09375 0.8125 +vt 0.0938 0.6875 +vt 0.0938 0.8125 vt 0.0625 0.8125 vt 0.0625 0.6875 -vt 0.09375 0.6875 -vt 0.09375 0.8125 +vt 0.0938 0.6875 +vt 0.0938 0.8125 vt 0.0625 0.8125 vt 0.0625 0.6875 vt 0.175 0.9375 -vt 0.175 0.5624984375 -vt 0.3250040625 0.5624984375 -vt 0.3250040625 0.9375 +vt 0.175 0.5625 +vt 0.325 0.5625 +vt 0.325 0.9375 vt 0.325 0.5625 vt 0.325 0.9375 vt 0.175 0.9375 vt 0.175 0.5625 -vt 0.09375 0.6875 -vt 0.09375 0.8125 +vt 0.0938 0.6875 +vt 0.0938 0.8125 vt 0.0625 0.8125 vt 0.0625 0.6875 -vt 0.09375 0.6875 -vt 0.09375 0.8125 +vt 0.0938 0.6875 +vt 0.0938 0.8125 vt 0.0625 0.8125 vt 0.0625 0.6875 vt 0.325 0.9375 -vt 0.325 0.5624984375 -vt 0.4374990625 0.6749974999999999 -vt 0.4374990625 0.82500125 +vt 0.325 0.5625 +vt 0.4375 0.675 +vt 0.4375 0.825 vt 0.4375 0.675 vt 0.4375 0.825 vt 0.325 0.9375 vt 0.325 0.5625 -vt 0.09375 0.6875 -vt 0.09375 0.8125 +vt 0.0938 0.6875 +vt 0.0938 0.8125 vt 0.0625 0.8125 vt 0.0625 0.6875 -vt 0.09375 0.6875 -vt 0.09375 0.8125 +vt 0.0938 0.6875 +vt 0.0938 0.8125 vt 0.0625 0.8125 vt 0.0625 0.6875 -vt 0.09375 0.6875 -vt 0.09375 0.8125 +vt 0.0938 0.6875 +vt 0.0938 0.8125 vt 0.0625 0.8125 vt 0.0625 0.6875 vt 0.175 0.5625 vt 0.175 0.9375 vt 0.0625 0.825 vt 0.0625 0.675 -vt 0.0625025 0.8249984375 -vt 0.0625 0.6749974999999999 -vt 0.1749990625 0.5624984375 -vt 0.1749990625 0.9375 -vt 0.09375 0.6875 -vt 0.09375 0.8125 +vt 0.0625 0.825 +vt 0.0625 0.675 +vt 0.175 0.5625 +vt 0.175 0.9375 +vt 0.0938 0.6875 +vt 0.0938 0.8125 vt 0.0625 0.8125 vt 0.0625 0.6875 -vt 0.09375 0.6875 -vt 0.09375 0.8125 +vt 0.0938 0.6875 +vt 0.0938 0.8125 vt 0.0625 0.8125 vt 0.0625 0.6875 -vt 0.09375 0.6875 -vt 0.09375 0.8125 +vt 0.0938 0.6875 +vt 0.0938 0.8125 vt 0.0625 0.8125 vt 0.0625 0.6875 vt 0.175 0.9375 -vt 0.175 0.5624984375 -vt 0.3250040625 0.5624984375 -vt 0.3250040625 0.9375 +vt 0.175 0.5625 +vt 0.325 0.5625 +vt 0.325 0.9375 vt 0.325 0.5625 vt 0.325 0.9375 vt 0.175 0.9375 vt 0.175 0.5625 -vt 0.09375 0.6875 -vt 0.09375 0.8125 +vt 0.0938 0.6875 +vt 0.0938 0.8125 vt 0.0625 0.8125 vt 0.0625 0.6875 -vt 0.09375 0.6875 -vt 0.09375 0.8125 +vt 0.0938 0.6875 +vt 0.0938 0.8125 vt 0.0625 0.8125 vt 0.0625 0.6875 vt 0.325 0.9375 -vt 0.325 0.5624984375 -vt 0.4374990625 0.6749974999999999 -vt 0.4374990625 0.82500125 +vt 0.325 0.5625 +vt 0.4375 0.675 +vt 0.4375 0.825 vt 0.4375 0.675 vt 0.4375 0.825 vt 0.325 0.9375 vt 0.325 0.5625 -vt 0.09375 0.6875 -vt 0.09375 0.8125 +vt 0.0938 0.6875 +vt 0.0938 0.8125 vt 0.0625 0.8125 vt 0.0625 0.6875 -vt 0.09375 0.6875 -vt 0.09375 0.8125 +vt 0.0938 0.6875 +vt 0.0938 0.8125 vt 0.0625 0.8125 vt 0.0625 0.6875 -vt 0.09375 0.6875 -vt 0.09375 0.8125 +vt 0.0938 0.6875 +vt 0.0938 0.8125 vt 0.0625 0.8125 vt 0.0625 0.6875 -vt 0.71875 0.75 -vt 0.71875 0.9375 -vt 0.53125 0.9375 -vt 0.53125 0.75 -vt 0.53125 0.9375 -vt 0.53125 0.75 +vt 0.7188 0.75 +vt 0.7188 0.9375 +vt 0.5313 0.9375 +vt 0.5313 0.75 +vt 0.5313 0.9375 +vt 0.5313 0.75 vt 0.5625 0.75 vt 0.5625 0.9375 -vt 0.71875 0.75 -vt 0.71875 0.9375 +vt 0.7188 0.75 +vt 0.7188 0.9375 vt 0.6875 0.9375 vt 0.6875 0.75 vt 0.5625 0.75 vt 0.5625 0.9375 -vt 0.53125 0.9375 -vt 0.53125 0.75 -vt 0.71875 0.75 -vt 0.71875 0.9375 +vt 0.5313 0.9375 +vt 0.5313 0.75 +vt 0.7188 0.75 +vt 0.7188 0.9375 vt 0.6875 0.9375 vt 0.6875 0.75 -vt 0.53125 0.9375 -vt 0.71875 0.9375 -vt 0.71875 0.75 -vt 0.53125 0.75 +vt 0.5313 0.9375 +vt 0.7188 0.9375 +vt 0.7188 0.75 +vt 0.5313 0.75 vt 0.5625 0.75 -vt 0.53125 0.75 -vt 0.53125 0.9375 +vt 0.5313 0.75 +vt 0.5313 0.9375 vt 0.5625 0.9375 vt 0.6875 0.9375 -vt 0.71875 0.9375 -vt 0.71875 0.75 +vt 0.7188 0.9375 +vt 0.7188 0.75 vt 0.6875 0.75 -vt 0.53125 0.9375 +vt 0.5313 0.9375 vt 0.5625 0.9375 vt 0.5625 0.75 -vt 0.53125 0.75 +vt 0.5313 0.75 vt 0.6875 0.9375 -vt 0.71875 0.9375 -vt 0.71875 0.75 +vt 0.7188 0.9375 +vt 0.7188 0.75 vt 0.6875 0.75 -vn 8.659560562354933e-17 1 1.1102230246251565e-16 -vn -8.659560562354933e-17 -1 -1.1102230246251565e-16 -vn 8.65956056235493e-17 -1.1102230246251565e-16 1 -vn -8.65956056235493e-17 1.1102230246251565e-16 -1 -vn 1 -8.65956056235493e-17 -8.659560562354932e-17 -vn -1 8.65956056235493e-17 8.659560562354932e-17 -vn -1.224646799147353e-16 -0.7071067811865475 -0.7071067811865476 -vn 1.224646799147353e-16 0.7071067811865475 0.7071067811865476 -vn 1.232595164407831e-32 0.7071067811865476 -0.7071067811865475 -vn -1.232595164407831e-32 -0.7071067811865476 0.7071067811865475 -vn 1 -8.65956056235493e-17 -8.659560562354932e-17 -vn -1 8.65956056235493e-17 8.659560562354932e-17 -vn 1.232595164407831e-32 0.7071067811865476 -0.7071067811865475 -vn -1.232595164407831e-32 -0.7071067811865476 0.7071067811865475 -vn -1.224646799147353e-16 -0.7071067811865475 -0.7071067811865476 -vn 1.224646799147353e-16 0.7071067811865475 0.7071067811865476 -vn 1 -8.65956056235493e-17 -8.659560562354932e-17 -vn -1 8.65956056235493e-17 8.659560562354932e-17 -vn 1.224646799147353e-16 0.7071067811865475 0.7071067811865476 -vn -1.224646799147353e-16 -0.7071067811865475 -0.7071067811865476 -vn -1.232595164407831e-32 -0.7071067811865476 0.7071067811865475 -vn 1.232595164407831e-32 0.7071067811865476 -0.7071067811865475 -vn 1 -8.65956056235493e-17 -8.659560562354932e-17 -vn -1 8.65956056235493e-17 8.659560562354932e-17 -vn -1.232595164407831e-32 -0.7071067811865476 0.7071067811865475 -vn 1.232595164407831e-32 0.7071067811865476 -0.7071067811865475 -vn 1.224646799147353e-16 0.7071067811865475 0.7071067811865476 -vn -1.224646799147353e-16 -0.7071067811865475 -0.7071067811865476 -vn 1 -8.65956056235493e-17 -8.659560562354932e-17 -vn -1 8.65956056235493e-17 8.659560562354932e-17 -vn -8.65956056235493e-17 1.1102230246251565e-16 -1 -vn 8.659560562354932e-17 -1.1102230246251568e-16 1 -vn 8.659560562354932e-17 1 -2.775557561562892e-16 -vn -8.659560562354934e-17 -1 -3.3306690738754696e-16 -vn 1 -8.65956056235493e-17 -8.659560562354932e-17 -vn -1 8.65956056235493e-17 8.659560562354932e-17 -vn 8.659560562354933e-17 1 1.1102230246251565e-16 -vn -8.659560562354934e-17 -1 -1.1102230246251568e-16 -vn -8.659560562354927e-17 3.3306690738754696e-16 -1 -vn 8.659560562354934e-17 2.775557561562892e-16 1 -vn 1 -8.65956056235493e-17 -8.659560562354932e-17 -vn -1 8.65956056235493e-17 8.659560562354932e-17 -vn 8.65956056235493e-17 -1.1102230246251565e-16 1 -vn -8.659560562354932e-17 1.1102230246251568e-16 -1 -vn -8.659560562354932e-17 -1 2.775557561562892e-16 -vn 8.659560562354934e-17 1 3.3306690738754696e-16 -vn 1 -8.65956056235493e-17 -8.659560562354932e-17 -vn -1 8.65956056235493e-17 8.659560562354932e-17 -vn -8.659560562354933e-17 -1 -1.1102230246251565e-16 -vn 8.659560562354934e-17 1 1.1102230246251568e-16 -vn 8.659560562354927e-17 -3.3306690738754696e-16 1 -vn -8.659560562354934e-17 -2.775557561562892e-16 -1 -vn -1 8.65956056235493e-17 8.659560562354932e-17 -vn 1 -8.65956056235493e-17 -8.659560562354932e-17 -vn 1.232595164407831e-32 0.7071067811865476 -0.7071067811865475 -vn -1.224646799147353e-16 -0.7071067811865475 -0.7071067811865476 -vn -8.659560562354932e-17 1.1102230246251568e-16 -1 -vn 1 -8.65956056235493e-17 -8.659560562354932e-17 -vn -1 8.65956056235493e-17 8.659560562354932e-17 -vn 8.659560562354934e-17 1 1.1102230246251568e-16 -vn -8.659560562354934e-17 -1 -1.1102230246251568e-16 -vn 1 -8.65956056235493e-17 -8.659560562354932e-17 -vn -1 8.65956056235493e-17 8.659560562354932e-17 -vn 1.224646799147353e-16 0.7071067811865475 0.7071067811865476 -vn -1.232595164407831e-32 -0.7071067811865476 0.7071067811865475 -vn 8.659560562354932e-17 -1.1102230246251568e-16 1 -vn -1 8.65956056235493e-17 8.659560562354932e-17 -vn 1 -8.65956056235493e-17 -8.659560562354932e-17 -vn 1.232595164407831e-32 0.7071067811865476 -0.7071067811865475 -vn -1.224646799147353e-16 -0.7071067811865475 -0.7071067811865476 -vn -8.659560562354932e-17 1.1102230246251568e-16 -1 -vn 1 -8.65956056235493e-17 -8.659560562354932e-17 -vn -1 8.65956056235493e-17 8.659560562354932e-17 -vn 8.659560562354934e-17 1 1.1102230246251568e-16 -vn -8.659560562354934e-17 -1 -1.1102230246251568e-16 -vn 1 -8.65956056235493e-17 -8.659560562354932e-17 -vn -1 8.65956056235493e-17 8.659560562354932e-17 -vn 1.224646799147353e-16 0.7071067811865475 0.7071067811865476 -vn -1.232595164407831e-32 -0.7071067811865476 0.7071067811865475 -vn 8.659560562354932e-17 -1.1102230246251568e-16 1 -vn 1 -8.65956056235493e-17 -8.659560562354932e-17 -vn 8.659560562354933e-17 1 1.1102230246251565e-16 -vn -8.659560562354933e-17 -1 -1.1102230246251565e-16 -vn 8.65956056235493e-17 -1.1102230246251565e-16 1 -vn -8.65956056235493e-17 1.1102230246251565e-16 -1 -vn -1 8.65956056235493e-17 8.659560562354932e-17 -vn 8.659560562354933e-17 1 1.1102230246251565e-16 -vn -8.659560562354933e-17 -1 -1.1102230246251565e-16 -vn 8.65956056235493e-17 -1.1102230246251565e-16 1 -vn -8.65956056235493e-17 1.1102230246251565e-16 -1 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 -0.71 -0.71 +vn 0 0.71 0.71 +vn 0 0.71 -0.71 +vn 0 -0.71 0.71 +vn 1 0 0 +vn -1 0 0 +vn 0 0.71 -0.71 +vn 0 -0.71 0.71 +vn 0 -0.71 -0.71 +vn 0 0.71 0.71 +vn 1 0 0 +vn -1 0 0 +vn 0 0.71 0.71 +vn 0 -0.71 -0.71 +vn 0 -0.71 0.71 +vn 0 0.71 -0.71 +vn 1 0 0 +vn -1 0 0 +vn 0 -0.71 0.71 +vn 0 0.71 -0.71 +vn 0 0.71 0.71 +vn 0 -0.71 -0.71 +vn 1 0 0 +vn -1 0 0 +vn 0 0 -1 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn 1 0 0 +vn -1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 -1 0 +vn 0 1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 -1 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn -1 0 0 +vn 1 0 0 +vn 0 0.71 -0.71 +vn 0 -0.71 -0.71 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 0.71 0.71 +vn 0 -0.71 0.71 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 0.71 -0.71 +vn 0 -0.71 -0.71 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 0.71 0.71 +vn 0 -0.71 0.71 +vn 0 0 1 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 usemtl tracks14_12 -f 1929/5385/1347 1930/5386/1347 1934/5387/1347 -f 1929/5385/1347 1934/5387/1347 1933/5388/1347 -f 1932/5389/1348 1931/5390/1348 1935/5391/1348 -f 1932/5389/1348 1935/5391/1348 1936/5392/1348 -f 1931/5393/1349 1929/5394/1349 1933/5395/1349 -f 1931/5393/1349 1933/5395/1349 1935/5396/1349 -f 1936/5397/1350 1934/5398/1350 1930/5399/1350 -f 1936/5397/1350 1930/5399/1350 1932/5400/1350 -f 1940/5401/1351 1938/5402/1351 1937/5403/1351 -f 1940/5401/1351 1937/5403/1351 1939/5404/1351 -f 1943/5405/1352 1941/5406/1352 1942/5407/1352 -f 1943/5405/1352 1942/5407/1352 1944/5408/1352 -f 1937/5409/1353 1938/5410/1353 1942/5411/1353 -f 1937/5409/1353 1942/5411/1353 1941/5412/1353 -f 1940/5413/1354 1939/5414/1354 1943/5415/1354 -f 1940/5413/1354 1943/5415/1354 1944/5416/1354 -f 1939/5417/1355 1937/5418/1355 1941/5419/1355 -f 1939/5417/1355 1941/5419/1355 1943/5420/1355 -f 1944/5421/1356 1942/5422/1356 1938/5423/1356 -f 1944/5421/1356 1938/5423/1356 1940/5424/1356 -f 1945/5425/1357 1946/5426/1357 1948/5427/1357 -f 1945/5425/1357 1948/5427/1357 1947/5428/1357 -f 1950/5429/1358 1949/5430/1358 1951/5431/1358 -f 1950/5429/1358 1951/5431/1358 1952/5432/1358 -f 1950/5433/1359 1946/5434/1359 1945/5435/1359 -f 1950/5433/1359 1945/5435/1359 1949/5436/1359 -f 1951/5437/1360 1947/5438/1360 1948/5439/1360 -f 1951/5437/1360 1948/5439/1360 1952/5440/1360 -f 1949/5441/1361 1945/5442/1361 1947/5443/1361 -f 1949/5441/1361 1947/5443/1361 1951/5444/1361 -f 1946/5445/1362 1950/5446/1362 1952/5447/1362 -f 1946/5445/1362 1952/5447/1362 1948/5448/1362 -f 1956/5449/1363 1954/5450/1363 1953/5451/1363 -f 1956/5449/1363 1953/5451/1363 1955/5452/1363 -f 1959/5453/1364 1957/5454/1364 1958/5455/1364 -f 1959/5453/1364 1958/5455/1364 1960/5456/1364 -f 1953/5457/1365 1954/5458/1365 1958/5459/1365 -f 1953/5457/1365 1958/5459/1365 1957/5460/1365 -f 1956/5461/1366 1955/5462/1366 1959/5463/1366 -f 1956/5461/1366 1959/5463/1366 1960/5464/1366 -f 1955/5465/1367 1953/5466/1367 1957/5467/1367 -f 1955/5465/1367 1957/5467/1367 1959/5468/1367 -f 1960/5469/1368 1958/5470/1368 1954/5471/1368 -f 1960/5469/1368 1954/5471/1368 1956/5472/1368 -f 1961/5473/1369 1962/5474/1369 1964/5475/1369 -f 1961/5473/1369 1964/5475/1369 1963/5476/1369 -f 1966/5477/1370 1965/5478/1370 1967/5479/1370 -f 1966/5477/1370 1967/5479/1370 1968/5480/1370 -f 1966/5481/1371 1962/5482/1371 1961/5483/1371 -f 1966/5481/1371 1961/5483/1371 1965/5484/1371 -f 1967/5485/1372 1963/5486/1372 1964/5487/1372 -f 1967/5485/1372 1964/5487/1372 1968/5488/1372 -f 1965/5489/1373 1961/5490/1373 1963/5491/1373 -f 1965/5489/1373 1963/5491/1373 1967/5492/1373 -f 1962/5493/1374 1966/5494/1374 1968/5495/1374 -f 1962/5493/1374 1968/5495/1374 1964/5496/1374 -f 1972/5497/1375 1970/5498/1375 1969/5499/1375 -f 1972/5497/1375 1969/5499/1375 1971/5500/1375 -f 1975/5501/1376 1973/5502/1376 1974/5503/1376 -f 1975/5501/1376 1974/5503/1376 1976/5504/1376 -f 1969/5505/1377 1970/5506/1377 1974/5507/1377 -f 1969/5505/1377 1974/5507/1377 1973/5508/1377 -f 1972/5509/1378 1971/5510/1378 1975/5511/1378 -f 1972/5509/1378 1975/5511/1378 1976/5512/1378 -f 1971/5513/1379 1969/5514/1379 1973/5515/1379 -f 1971/5513/1379 1973/5515/1379 1975/5516/1379 -f 1976/5517/1380 1974/5518/1380 1970/5519/1380 -f 1976/5517/1380 1970/5519/1380 1972/5520/1380 -f 1977/5521/1381 1978/5522/1381 1980/5523/1381 -f 1977/5521/1381 1980/5523/1381 1979/5524/1381 -f 1982/5525/1382 1981/5526/1382 1983/5527/1382 -f 1982/5525/1382 1983/5527/1382 1984/5528/1382 -f 1982/5529/1383 1978/5530/1383 1977/5531/1383 -f 1982/5529/1383 1977/5531/1383 1981/5532/1383 -f 1983/5533/1384 1979/5534/1384 1980/5535/1384 -f 1983/5533/1384 1980/5535/1384 1984/5536/1384 -f 1981/5537/1385 1977/5538/1385 1979/5539/1385 -f 1981/5537/1385 1979/5539/1385 1983/5540/1385 -f 1978/5541/1386 1982/5542/1386 1984/5543/1386 -f 1978/5541/1386 1984/5543/1386 1980/5544/1386 -f 1988/5545/1387 1986/5546/1387 1985/5547/1387 -f 1988/5545/1387 1985/5547/1387 1987/5548/1387 -f 1991/5549/1388 1989/5550/1388 1990/5551/1388 -f 1991/5549/1388 1990/5551/1388 1992/5552/1388 -f 1985/5553/1389 1986/5554/1389 1990/5555/1389 -f 1985/5553/1389 1990/5555/1389 1989/5556/1389 -f 1988/5557/1390 1987/5558/1390 1991/5559/1390 -f 1988/5557/1390 1991/5559/1390 1992/5560/1390 -f 1987/5561/1391 1985/5562/1391 1989/5563/1391 -f 1987/5561/1391 1989/5563/1391 1991/5564/1391 -f 1992/5565/1392 1990/5566/1392 1986/5567/1392 -f 1992/5565/1392 1986/5567/1392 1988/5568/1392 -f 1993/5569/1393 1994/5570/1393 1996/5571/1393 -f 1993/5569/1393 1996/5571/1393 1995/5572/1393 -f 1998/5573/1394 1997/5574/1394 1999/5575/1394 -f 1998/5573/1394 1999/5575/1394 2000/5576/1394 -f 1998/5577/1395 1994/5578/1395 1993/5579/1395 -f 1998/5577/1395 1993/5579/1395 1997/5580/1395 -f 1999/5581/1396 1995/5582/1396 1996/5583/1396 -f 1999/5581/1396 1996/5583/1396 2000/5584/1396 -f 1997/5585/1397 1993/5586/1397 1995/5587/1397 -f 1997/5585/1397 1995/5587/1397 1999/5588/1397 -f 1994/5589/1398 1998/5590/1398 2000/5591/1398 -f 1994/5589/1398 2000/5591/1398 1996/5592/1398 -f 2004/5593/1399 2002/5594/1399 2001/5595/1399 -f 2004/5593/1399 2001/5595/1399 2003/5596/1399 -f 2007/5597/1400 2005/5598/1400 2006/5599/1400 -f 2007/5597/1400 2006/5599/1400 2008/5600/1400 -f 2001/5601/1401 2002/5602/1401 2006/5603/1401 -f 2001/5601/1401 2006/5603/1401 2005/5604/1401 -f 2004/5605/1402 2003/5606/1402 2007/5607/1402 -f 2004/5605/1402 2007/5607/1402 2008/5608/1402 -f 2003/5609/1403 2001/5610/1403 2005/5611/1403 -f 2003/5609/1403 2005/5611/1403 2007/5612/1403 -f 2012/5613/1404 2010/5614/1404 2009/5615/1404 -f 2012/5613/1404 2009/5615/1404 2011/5616/1404 -f 2015/5617/1405 2013/5618/1405 2014/5619/1405 -f 2015/5617/1405 2014/5619/1405 2016/5620/1405 -f 2009/5621/1406 2010/5622/1406 2014/5623/1406 -f 2009/5621/1406 2014/5623/1406 2013/5624/1406 -f 2012/5625/1407 2011/5626/1407 2015/5627/1407 -f 2012/5625/1407 2015/5627/1407 2016/5628/1407 -f 2020/5629/1408 2018/5630/1408 2017/5631/1408 -f 2020/5629/1408 2017/5631/1408 2019/5632/1408 -f 2023/5633/1409 2021/5634/1409 2022/5635/1409 -f 2023/5633/1409 2022/5635/1409 2024/5636/1409 -f 2017/5637/1410 2018/5638/1410 2022/5639/1410 -f 2017/5637/1410 2022/5639/1410 2021/5640/1410 -f 2020/5641/1411 2019/5642/1411 2023/5643/1411 -f 2020/5641/1411 2023/5643/1411 2024/5644/1411 -f 2019/5645/1412 2017/5646/1412 2021/5647/1412 -f 2019/5645/1412 2021/5647/1412 2023/5648/1412 -f 2028/5649/1413 2026/5650/1413 2025/5651/1413 -f 2028/5649/1413 2025/5651/1413 2027/5652/1413 -f 2031/5653/1414 2029/5654/1414 2030/5655/1414 -f 2031/5653/1414 2030/5655/1414 2032/5656/1414 -f 2025/5657/1415 2026/5658/1415 2030/5659/1415 -f 2025/5657/1415 2030/5659/1415 2029/5660/1415 -f 2028/5661/1416 2027/5662/1416 2031/5663/1416 -f 2028/5661/1416 2031/5663/1416 2032/5664/1416 -f 2027/5665/1417 2025/5666/1417 2029/5667/1417 -f 2027/5665/1417 2029/5667/1417 2031/5668/1417 -f 2036/5669/1418 2034/5670/1418 2033/5671/1418 -f 2036/5669/1418 2033/5671/1418 2035/5672/1418 -f 2039/5673/1419 2037/5674/1419 2038/5675/1419 -f 2039/5673/1419 2038/5675/1419 2040/5676/1419 -f 2033/5677/1420 2034/5678/1420 2038/5679/1420 -f 2033/5677/1420 2038/5679/1420 2037/5680/1420 -f 2036/5681/1421 2035/5682/1421 2039/5683/1421 -f 2036/5681/1421 2039/5683/1421 2040/5684/1421 -f 2044/5685/1422 2042/5686/1422 2041/5687/1422 -f 2044/5685/1422 2041/5687/1422 2043/5688/1422 -f 2047/5689/1423 2045/5690/1423 2046/5691/1423 -f 2047/5689/1423 2046/5691/1423 2048/5692/1423 -f 2041/5693/1424 2042/5694/1424 2046/5695/1424 -f 2041/5693/1424 2046/5695/1424 2045/5696/1424 -f 2044/5697/1425 2043/5698/1425 2047/5699/1425 -f 2044/5697/1425 2047/5699/1425 2048/5700/1425 -f 2043/5701/1426 2041/5702/1426 2045/5703/1426 -f 2043/5701/1426 2045/5703/1426 2047/5704/1426 -f 2052/5705/1427 2050/5706/1427 2049/5707/1427 -f 2052/5705/1427 2049/5707/1427 2051/5708/1427 -f 2049/5709/1428 2050/5710/1428 2054/5711/1428 -f 2049/5709/1428 2054/5711/1428 2053/5712/1428 -f 2052/5713/1429 2051/5714/1429 2055/5715/1429 -f 2052/5713/1429 2055/5715/1429 2056/5716/1429 -f 2051/5717/1430 2049/5718/1430 2053/5719/1430 -f 2051/5717/1430 2053/5719/1430 2055/5720/1430 -f 2056/5721/1431 2054/5722/1431 2050/5723/1431 -f 2056/5721/1431 2050/5723/1431 2052/5724/1431 -f 2057/5725/1432 2058/5726/1432 2060/5727/1432 -f 2057/5725/1432 2060/5727/1432 2059/5728/1432 -f 2062/5729/1433 2058/5730/1433 2057/5731/1433 -f 2062/5729/1433 2057/5731/1433 2061/5732/1433 -f 2063/5733/1434 2059/5734/1434 2060/5735/1434 -f 2063/5733/1434 2060/5735/1434 2064/5736/1434 -f 2061/5737/1435 2057/5738/1435 2059/5739/1435 -f 2061/5737/1435 2059/5739/1435 2063/5740/1435 -f 2058/5741/1436 2062/5742/1436 2064/5743/1436 -f 2058/5741/1436 2064/5743/1436 2060/5744/1436 +f 1929/5385/1347 1930/5386/1347 1934/5387/1347 1933/5388/1347 +f 1932/5389/1348 1931/5390/1348 1935/5391/1348 1936/5392/1348 +f 1931/5393/1349 1929/5394/1349 1933/5395/1349 1935/5396/1349 +f 1936/5397/1350 1934/5398/1350 1930/5399/1350 1932/5400/1350 +f 1940/5401/1351 1938/5402/1351 1937/5403/1351 1939/5404/1351 +f 1943/5405/1352 1941/5406/1352 1942/5407/1352 1944/5408/1352 +f 1937/5409/1353 1938/5410/1353 1942/5411/1353 1941/5412/1353 +f 1940/5413/1354 1939/5414/1354 1943/5415/1354 1944/5416/1354 +f 1939/5417/1355 1937/5418/1355 1941/5419/1355 1943/5420/1355 +f 1944/5421/1356 1942/5422/1356 1938/5423/1356 1940/5424/1356 +f 1945/5425/1357 1946/5426/1357 1948/5427/1357 1947/5428/1357 +f 1950/5429/1358 1949/5430/1358 1951/5431/1358 1952/5432/1358 +f 1950/5433/1359 1946/5434/1359 1945/5435/1359 1949/5436/1359 +f 1951/5437/1360 1947/5438/1360 1948/5439/1360 1952/5440/1360 +f 1949/5441/1361 1945/5442/1361 1947/5443/1361 1951/5444/1361 +f 1946/5445/1362 1950/5446/1362 1952/5447/1362 1948/5448/1362 +f 1956/5449/1363 1954/5450/1363 1953/5451/1363 1955/5452/1363 +f 1959/5453/1364 1957/5454/1364 1958/5455/1364 1960/5456/1364 +f 1953/5457/1365 1954/5458/1365 1958/5459/1365 1957/5460/1365 +f 1956/5461/1366 1955/5462/1366 1959/5463/1366 1960/5464/1366 +f 1955/5465/1367 1953/5466/1367 1957/5467/1367 1959/5468/1367 +f 1960/5469/1368 1958/5470/1368 1954/5471/1368 1956/5472/1368 +f 1961/5473/1369 1962/5474/1369 1964/5475/1369 1963/5476/1369 +f 1966/5477/1370 1965/5478/1370 1967/5479/1370 1968/5480/1370 +f 1966/5481/1371 1962/5482/1371 1961/5483/1371 1965/5484/1371 +f 1967/5485/1372 1963/5486/1372 1964/5487/1372 1968/5488/1372 +f 1965/5489/1373 1961/5490/1373 1963/5491/1373 1967/5492/1373 +f 1962/5493/1374 1966/5494/1374 1968/5495/1374 1964/5496/1374 +f 1972/5497/1375 1970/5498/1375 1969/5499/1375 1971/5500/1375 +f 1975/5501/1376 1973/5502/1376 1974/5503/1376 1976/5504/1376 +f 1969/5505/1377 1970/5506/1377 1974/5507/1377 1973/5508/1377 +f 1972/5509/1378 1971/5510/1378 1975/5511/1378 1976/5512/1378 +f 1971/5513/1379 1969/5514/1379 1973/5515/1379 1975/5516/1379 +f 1976/5517/1380 1974/5518/1380 1970/5519/1380 1972/5520/1380 +f 1977/5521/1381 1978/5522/1381 1980/5523/1381 1979/5524/1381 +f 1982/5525/1382 1981/5526/1382 1983/5527/1382 1984/5528/1382 +f 1982/5529/1383 1978/5530/1383 1977/5531/1383 1981/5532/1383 +f 1983/5533/1384 1979/5534/1384 1980/5535/1384 1984/5536/1384 +f 1981/5537/1385 1977/5538/1385 1979/5539/1385 1983/5540/1385 +f 1978/5541/1386 1982/5542/1386 1984/5543/1386 1980/5544/1386 +f 1988/5545/1387 1986/5546/1387 1985/5547/1387 1987/5548/1387 +f 1991/5549/1388 1989/5550/1388 1990/5551/1388 1992/5552/1388 +f 1985/5553/1389 1986/5554/1389 1990/5555/1389 1989/5556/1389 +f 1988/5557/1390 1987/5558/1390 1991/5559/1390 1992/5560/1390 +f 1987/5561/1391 1985/5562/1391 1989/5563/1391 1991/5564/1391 +f 1992/5565/1392 1990/5566/1392 1986/5567/1392 1988/5568/1392 +f 1993/5569/1393 1994/5570/1393 1996/5571/1393 1995/5572/1393 +f 1998/5573/1394 1997/5574/1394 1999/5575/1394 2000/5576/1394 +f 1998/5577/1395 1994/5578/1395 1993/5579/1395 1997/5580/1395 +f 1999/5581/1396 1995/5582/1396 1996/5583/1396 2000/5584/1396 +f 1997/5585/1397 1993/5586/1397 1995/5587/1397 1999/5588/1397 +f 1994/5589/1398 1998/5590/1398 2000/5591/1398 1996/5592/1398 +f 2004/5593/1399 2002/5594/1399 2001/5595/1399 2003/5596/1399 +f 2007/5597/1400 2005/5598/1400 2006/5599/1400 2008/5600/1400 +f 2001/5601/1401 2002/5602/1401 2006/5603/1401 2005/5604/1401 +f 2004/5605/1402 2003/5606/1402 2007/5607/1402 2008/5608/1402 +f 2003/5609/1403 2001/5610/1403 2005/5611/1403 2007/5612/1403 +f 2012/5613/1404 2010/5614/1404 2009/5615/1404 2011/5616/1404 +f 2015/5617/1405 2013/5618/1405 2014/5619/1405 2016/5620/1405 +f 2009/5621/1406 2010/5622/1406 2014/5623/1406 2013/5624/1406 +f 2012/5625/1407 2011/5626/1407 2015/5627/1407 2016/5628/1407 +f 2020/5629/1408 2018/5630/1408 2017/5631/1408 2019/5632/1408 +f 2023/5633/1409 2021/5634/1409 2022/5635/1409 2024/5636/1409 +f 2017/5637/1410 2018/5638/1410 2022/5639/1410 2021/5640/1410 +f 2020/5641/1411 2019/5642/1411 2023/5643/1411 2024/5644/1411 +f 2019/5645/1412 2017/5646/1412 2021/5647/1412 2023/5648/1412 +f 2028/5649/1413 2026/5650/1413 2025/5651/1413 2027/5652/1413 +f 2031/5653/1414 2029/5654/1414 2030/5655/1414 2032/5656/1414 +f 2025/5657/1415 2026/5658/1415 2030/5659/1415 2029/5660/1415 +f 2028/5661/1416 2027/5662/1416 2031/5663/1416 2032/5664/1416 +f 2027/5665/1417 2025/5666/1417 2029/5667/1417 2031/5668/1417 +f 2036/5669/1418 2034/5670/1418 2033/5671/1418 2035/5672/1418 +f 2039/5673/1419 2037/5674/1419 2038/5675/1419 2040/5676/1419 +f 2033/5677/1420 2034/5678/1420 2038/5679/1420 2037/5680/1420 +f 2036/5681/1421 2035/5682/1421 2039/5683/1421 2040/5684/1421 +f 2044/5685/1422 2042/5686/1422 2041/5687/1422 2043/5688/1422 +f 2047/5689/1423 2045/5690/1423 2046/5691/1423 2048/5692/1423 +f 2041/5693/1424 2042/5694/1424 2046/5695/1424 2045/5696/1424 +f 2044/5697/1425 2043/5698/1425 2047/5699/1425 2048/5700/1425 +f 2043/5701/1426 2041/5702/1426 2045/5703/1426 2047/5704/1426 +f 2052/5705/1427 2050/5706/1427 2049/5707/1427 2051/5708/1427 +f 2049/5709/1428 2050/5710/1428 2054/5711/1428 2053/5712/1428 +f 2052/5713/1429 2051/5714/1429 2055/5715/1429 2056/5716/1429 +f 2051/5717/1430 2049/5718/1430 2053/5719/1430 2055/5720/1430 +f 2056/5721/1431 2054/5722/1431 2050/5723/1431 2052/5724/1431 +f 2057/5725/1432 2058/5726/1432 2060/5727/1432 2059/5728/1432 +f 2062/5729/1433 2058/5730/1433 2057/5731/1433 2061/5732/1433 +f 2063/5733/1434 2059/5734/1434 2060/5735/1434 2064/5736/1434 +f 2061/5737/1435 2057/5738/1435 2059/5739/1435 2063/5740/1435 +f 2058/5741/1436 2062/5742/1436 2064/5743/1436 2060/5744/1436 o LeftWheelLead1 -v -0.875 1.0624999696333308 -0.12500003036666912 -v -0.875 1.0624999696333308 -0.4999999696333308 -v -0.875 0.6875000303666692 -0.12500003036666915 -v -0.875 0.6875000303666692 -0.4999999696333309 -v -0.75 1.0624999696333308 -0.12500003036666912 -v -0.75 1.0624999696333308 -0.4999999696333308 -v -0.75 0.6875000303666692 -0.12500003036666915 -v -0.75 0.6875000303666692 -0.4999999696333309 -v -1 1.162262129857035 -0.15782039161544276 -v -1 1.0296796083845572 -0.02523787014296508 -v -1 1.2064563036811942 -0.11362621779128346 -v -1 1.0738737822087165 0.018956303681194164 -v -0.625 1.162262129857035 -0.1578203916154427 -v -0.625 1.0296796083845572 -0.025237870142965024 -v -0.625 1.2064563036811942 -0.11362621779128346 -v -0.625 1.0738737822087165 0.018956303681194164 -v -1 0.5877378701429651 -0.15782039161544276 -v -1 0.7203203916154427 -0.02523787014296508 -v -1 0.5435436963188058 -0.11362621779128357 -v -1 0.6761262177912835 0.01895630368119411 -v -0.625 0.5877378701429651 -0.15782039161544276 -v -0.625 0.7203203916154427 -0.02523787014296508 -v -0.625 0.5435436963188058 -0.11362621779128351 -v -0.625 0.6761262177912835 0.018956303681194164 -v -1 0.5877378701429651 -0.4671796083845573 -v -1 0.7203203916154427 -0.599762129857035 -v -1 0.5435436963188058 -0.5113737822087165 -v -1 0.6761262177912836 -0.6439563036811942 -v -0.625 0.5877378701429651 -0.46717960838455724 -v -0.625 0.7203203916154428 -0.5997621298570349 -v -0.625 0.5435436963188058 -0.5113737822087165 -v -0.625 0.6761262177912836 -0.6439563036811942 -v -1 1.162262129857035 -0.46717960838455724 -v -1 1.0296796083845572 -0.5997621298570349 -v -1 1.2064563036811942 -0.5113737822087165 -v -1 1.0738737822087165 -0.6439563036811942 -v -0.625 1.162262129857035 -0.46717960838455724 -v -0.625 1.0296796083845572 -0.5997621298570349 -v -0.625 1.2064563036811942 -0.5113737822087164 -v -0.625 1.0738737822087165 -0.6439563036811942 -v -1 0.9687499848166654 -3.45238940713255e-7 -v -1 0.7812500151833346 -3.45238940713255e-7 -v -1 0.9687499848166654 0.06249993926666175 -v -1 0.7812500151833345 0.0624999392666617 -v -0.625 0.9687499848166654 -3.4523894065774385e-7 -v -0.625 0.7812500151833346 -3.45238940713255e-7 -v -0.625 0.9687499848166654 0.06249993926666175 -v -0.625 0.7812500151833346 0.06249993926666175 -v -1 0.5625003452389407 -0.40624998481666547 -v -1 0.5625003452389407 -0.2187500151833346 -v -1 0.5000000607333382 -0.4062499848166655 -v -1 0.5000000607333382 -0.2187500151833346 -v -0.625 0.5625003452389408 -0.4062499848166654 -v -0.625 0.5625003452389408 -0.2187500151833346 -v -0.625 0.5000000607333384 -0.4062499848166654 -v -0.625 0.5000000607333382 -0.21875001518333453 -v -1 0.7812500151833346 -0.6249996547610593 -v -1 0.9687499848166654 -0.6249996547610592 -v -1 0.7812500151833346 -0.6874999392666618 -v -1 0.9687499848166654 -0.6874999392666618 -v -0.625 0.7812500151833346 -0.6249996547610592 -v -0.625 0.9687499848166654 -0.6249996547610592 -v -0.625 0.7812500151833346 -0.6874999392666618 -v -0.625 0.9687499848166655 -0.6874999392666616 -v -1 1.1874996547610592 -0.2187500151833346 -v -1 1.1874996547610592 -0.4062499848166654 -v -1 1.2499999392666616 -0.21875001518333456 -v -1 1.2499999392666616 -0.40624998481666547 -v -0.625 1.1874996547610595 -0.21875001518333453 -v -0.625 1.1874996547610595 -0.4062499848166654 -v -0.625 1.2499999392666616 -0.2187500151833345 -v -0.625 1.2499999392666616 -0.4062499848166654 -v -0.875 1.0000001270694667 -0.6250000967027975 -v -0.875 1.1875000967027975 -0.4375001270694666 -v -0.875 0.7499998729305334 -0.6250000967027975 -v -0.875 0.5624999032972025 -0.43750012706946667 -v -0.9375 1.0000001270694667 -0.6250000967027975 -v -0.9375 1.1875000967027975 -0.43750012706946667 -v -0.9375 0.7499998729305334 -0.6250000967027975 -v -0.9375 0.5624999032972025 -0.43750012706946667 -v -0.9375 1.1875000967027975 -0.18749987293053333 -v -0.9375 1.1875000967027975 -0.43750012706946667 -v -0.9375 0.5624999032972025 -0.18749987293053338 -v -0.9375 0.5624999032972025 -0.43750012706946667 -v -0.875 1.1875000967027975 -0.18749987293053333 -v -0.875 1.1875000967027975 -0.4375001270694666 -v -0.875 0.5624999032972025 -0.18749987293053336 -v -0.875 0.5624999032972025 -0.43750012706946667 -v -0.9375 1.0000001270694667 9.670279754736555e-8 -v -0.9375 1.1875000967027975 -0.18749987293053333 -v -0.9375 0.7499998729305333 9.67027974918544e-8 -v -0.9375 0.5624999032972025 -0.18749987293053338 -v -0.875 1.0000001270694667 9.670279754736555e-8 -v -0.875 1.1875000967027975 -0.18749987293053333 -v -0.875 0.7499998729305333 9.670279754736555e-8 -v -0.875 0.5624999032972025 -0.18749987293053336 -v -0.6875 1.0000001270694667 -0.6250000967027975 -v -0.6875 1.1875000967027975 -0.4375001270694666 -v -0.6875 0.7499998729305334 -0.6250000967027975 -v -0.6875 0.5624999032972025 -0.43750012706946667 -v -0.75 1.0000001270694667 -0.6250000967027975 -v -0.75 1.1875000967027975 -0.4375001270694666 -v -0.75 0.7499998729305334 -0.6250000967027975 -v -0.75 0.5624999032972025 -0.43750012706946667 -v -0.75 1.1875000967027975 -0.18749987293053333 -v -0.75 1.1875000967027975 -0.4375001270694666 -v -0.75 0.5624999032972025 -0.18749987293053336 -v -0.75 0.5624999032972025 -0.43750012706946667 -v -0.6875 1.1875000967027975 -0.18749987293053333 -v -0.6875 1.1875000967027975 -0.4375001270694666 -v -0.6875 0.5624999032972025 -0.18749987293053333 -v -0.6875 0.5624999032972025 -0.43750012706946667 -v -0.75 1.0000001270694667 9.670279754736555e-8 -v -0.75 1.1875000967027975 -0.18749987293053333 -v -0.75 0.7499998729305333 9.670279754736555e-8 -v -0.75 0.5624999032972025 -0.18749987293053336 -v -0.6875 1.0000001270694667 9.670279754736555e-8 -v -0.6875 1.1875000967027975 -0.18749987293053333 -v -0.6875 0.7499998729305333 9.670279754736555e-8 -v -0.6875 0.5624999032972025 -0.18749987293053333 -v -1 1.0624999696333308 -0.12500003036666915 -v -1 1.0624999696333308 -0.4999999696333309 -v -1 0.6875000303666691 -0.12500003036666918 -v -1 0.6875000303666692 -0.49999996963333093 -v -0.9375 1.0624999696333308 -0.12500003036666912 -v -0.9375 1.0624999696333308 -0.4999999696333308 -v -0.9375 0.6875000303666692 -0.12500003036666915 -v -0.9375 0.6875000303666692 -0.4999999696333309 -v -0.625 1.0624999696333308 -0.1250000303666691 -v -0.625 1.0624999696333308 -0.4999999696333308 -v -0.625 0.6875000303666692 -0.12500003036666912 -v -0.625 0.6875000303666692 -0.4999999696333308 -v -0.6875 1.0624999696333308 -0.12500003036666912 -v -0.6875 1.0624999696333308 -0.4999999696333308 -v -0.6875 0.6875000303666692 -0.12500003036666915 -v -0.6875 0.6875000303666692 -0.4999999696333309 +v -0.875 1.0625 -0.125 +v -0.875 1.0625 -0.5 +v -0.875 0.6875 -0.125 +v -0.875 0.6875 -0.5 +v -0.75 1.0625 -0.125 +v -0.75 1.0625 -0.5 +v -0.75 0.6875 -0.125 +v -0.75 0.6875 -0.5 +v -1 1.1623 -0.1578 +v -1 1.0297 -0.0252 +v -1 1.2065 -0.1136 +v -1 1.0739 0.019 +v -0.625 1.1623 -0.1578 +v -0.625 1.0297 -0.0252 +v -0.625 1.2065 -0.1136 +v -0.625 1.0739 0.019 +v -1 0.5877 -0.1578 +v -1 0.7203 -0.0252 +v -1 0.5435 -0.1136 +v -1 0.6761 0.019 +v -0.625 0.5877 -0.1578 +v -0.625 0.7203 -0.0252 +v -0.625 0.5435 -0.1136 +v -0.625 0.6761 0.019 +v -1 0.5877 -0.4672 +v -1 0.7203 -0.5998 +v -1 0.5435 -0.5114 +v -1 0.6761 -0.644 +v -0.625 0.5877 -0.4672 +v -0.625 0.7203 -0.5998 +v -0.625 0.5435 -0.5114 +v -0.625 0.6761 -0.644 +v -1 1.1623 -0.4672 +v -1 1.0297 -0.5998 +v -1 1.2065 -0.5114 +v -1 1.0739 -0.644 +v -0.625 1.1623 -0.4672 +v -0.625 1.0297 -0.5998 +v -0.625 1.2065 -0.5114 +v -0.625 1.0739 -0.644 +v -1 0.9687 0 +v -1 0.7813 0 +v -1 0.9687 0.0625 +v -1 0.7813 0.0625 +v -0.625 0.9687 0 +v -0.625 0.7813 0 +v -0.625 0.9687 0.0625 +v -0.625 0.7813 0.0625 +v -1 0.5625 -0.4062 +v -1 0.5625 -0.2188 +v -1 0.5 -0.4062 +v -1 0.5 -0.2188 +v -0.625 0.5625 -0.4062 +v -0.625 0.5625 -0.2188 +v -0.625 0.5 -0.4062 +v -0.625 0.5 -0.2188 +v -1 0.7813 -0.625 +v -1 0.9687 -0.625 +v -1 0.7813 -0.6875 +v -1 0.9687 -0.6875 +v -0.625 0.7813 -0.625 +v -0.625 0.9687 -0.625 +v -0.625 0.7813 -0.6875 +v -0.625 0.9687 -0.6875 +v -1 1.1875 -0.2188 +v -1 1.1875 -0.4062 +v -1 1.25 -0.2188 +v -1 1.25 -0.4062 +v -0.625 1.1875 -0.2188 +v -0.625 1.1875 -0.4062 +v -0.625 1.25 -0.2188 +v -0.625 1.25 -0.4062 +v -0.875 1 -0.625 +v -0.875 1.1875 -0.4375 +v -0.875 0.75 -0.625 +v -0.875 0.5625 -0.4375 +v -0.9375 1 -0.625 +v -0.9375 1.1875 -0.4375 +v -0.9375 0.75 -0.625 +v -0.9375 0.5625 -0.4375 +v -0.9375 1.1875 -0.1875 +v -0.9375 1.1875 -0.4375 +v -0.9375 0.5625 -0.1875 +v -0.9375 0.5625 -0.4375 +v -0.875 1.1875 -0.1875 +v -0.875 1.1875 -0.4375 +v -0.875 0.5625 -0.1875 +v -0.875 0.5625 -0.4375 +v -0.9375 1 0 +v -0.9375 1.1875 -0.1875 +v -0.9375 0.75 0 +v -0.9375 0.5625 -0.1875 +v -0.875 1 0 +v -0.875 1.1875 -0.1875 +v -0.875 0.75 0 +v -0.875 0.5625 -0.1875 +v -0.6875 1 -0.625 +v -0.6875 1.1875 -0.4375 +v -0.6875 0.75 -0.625 +v -0.6875 0.5625 -0.4375 +v -0.75 1 -0.625 +v -0.75 1.1875 -0.4375 +v -0.75 0.75 -0.625 +v -0.75 0.5625 -0.4375 +v -0.75 1.1875 -0.1875 +v -0.75 1.1875 -0.4375 +v -0.75 0.5625 -0.1875 +v -0.75 0.5625 -0.4375 +v -0.6875 1.1875 -0.1875 +v -0.6875 1.1875 -0.4375 +v -0.6875 0.5625 -0.1875 +v -0.6875 0.5625 -0.4375 +v -0.75 1 0 +v -0.75 1.1875 -0.1875 +v -0.75 0.75 0 +v -0.75 0.5625 -0.1875 +v -0.6875 1 0 +v -0.6875 1.1875 -0.1875 +v -0.6875 0.75 0 +v -0.6875 0.5625 -0.1875 +v -1 1.0625 -0.125 +v -1 1.0625 -0.5 +v -1 0.6875 -0.125 +v -1 0.6875 -0.5 +v -0.9375 1.0625 -0.125 +v -0.9375 1.0625 -0.5 +v -0.9375 0.6875 -0.125 +v -0.9375 0.6875 -0.5 +v -0.625 1.0625 -0.125 +v -0.625 1.0625 -0.5 +v -0.625 0.6875 -0.125 +v -0.625 0.6875 -0.5 +v -0.6875 1.0625 -0.125 +v -0.6875 1.0625 -0.5 +v -0.6875 0.6875 -0.125 +v -0.6875 0.6875 -0.5 vt 0 0.5 vt 0.0625 0.5 vt 0.0625 0.6875 @@ -12567,14 +11130,14 @@ vt 0 0.5 vt 0.0625 0.5 vt 0.0625 0.6875 vt 0 0.6875 -vt 0.9375 0.71875 -vt 0.8125 0.71875 +vt 0.9375 0.7188 +vt 0.8125 0.7188 vt 0.8125 0.6875 vt 0.9375 0.6875 vt 0.8125 0.9375 vt 0.9375 0.9375 -vt 0.9375 0.90625 -vt 0.8125 0.90625 +vt 0.9375 0.9063 +vt 0.8125 0.9063 vt 0.8125 0.9375 vt 0.8125 0.6875 vt 0.9375 0.6875 @@ -12583,22 +11146,22 @@ vt 0.9375 0.9375 vt 0.9375 0.6875 vt 0.8125 0.6875 vt 0.8125 0.9375 -vt 0.90625 0.9375 -vt 0.90625 0.6875 +vt 0.9063 0.9375 +vt 0.9063 0.6875 vt 0.9375 0.6875 vt 0.9375 0.9375 -vt 0.84375 0.6875 -vt 0.84375 0.9375 +vt 0.8438 0.6875 +vt 0.8438 0.9375 vt 0.8125 0.9375 vt 0.8125 0.6875 vt 0.8125 0.6875 -vt 0.8125 0.71875 -vt 0.9375 0.71875 +vt 0.8125 0.7188 +vt 0.9375 0.7188 vt 0.9375 0.6875 -vt 0.9375 0.90625 +vt 0.9375 0.9063 vt 0.9375 0.9375 vt 0.8125 0.9375 -vt 0.8125 0.90625 +vt 0.8125 0.9063 vt 0.9375 0.6875 vt 0.8125 0.6875 vt 0.8125 0.9375 @@ -12608,21 +11171,21 @@ vt 0.9375 0.6875 vt 0.9375 0.9375 vt 0.8125 0.9375 vt 0.9375 0.6875 -vt 0.90625 0.6875 -vt 0.90625 0.9375 +vt 0.9063 0.6875 +vt 0.9063 0.9375 vt 0.9375 0.9375 vt 0.8125 0.9375 -vt 0.84375 0.9375 -vt 0.84375 0.6875 +vt 0.8438 0.9375 +vt 0.8438 0.6875 vt 0.8125 0.6875 -vt 0.9375 0.71875 -vt 0.8125 0.71875 +vt 0.9375 0.7188 +vt 0.8125 0.7188 vt 0.8125 0.6875 vt 0.9375 0.6875 vt 0.8125 0.9375 vt 0.9375 0.9375 -vt 0.9375 0.90625 -vt 0.8125 0.90625 +vt 0.9375 0.9063 +vt 0.8125 0.9063 vt 0.8125 0.9375 vt 0.8125 0.6875 vt 0.9375 0.6875 @@ -12631,22 +11194,22 @@ vt 0.9375 0.9375 vt 0.9375 0.6875 vt 0.8125 0.6875 vt 0.8125 0.9375 -vt 0.90625 0.9375 -vt 0.90625 0.6875 +vt 0.9063 0.9375 +vt 0.9063 0.6875 vt 0.9375 0.6875 vt 0.9375 0.9375 -vt 0.84375 0.6875 -vt 0.84375 0.9375 +vt 0.8438 0.6875 +vt 0.8438 0.9375 vt 0.8125 0.9375 vt 0.8125 0.6875 vt 0.8125 0.6875 -vt 0.8125 0.71875 -vt 0.9375 0.71875 +vt 0.8125 0.7188 +vt 0.9375 0.7188 vt 0.9375 0.6875 -vt 0.9375 0.90625 +vt 0.9375 0.9063 vt 0.9375 0.9375 vt 0.8125 0.9375 -vt 0.8125 0.90625 +vt 0.8125 0.9063 vt 0.9375 0.6875 vt 0.8125 0.6875 vt 0.8125 0.9375 @@ -12656,21 +11219,21 @@ vt 0.9375 0.6875 vt 0.9375 0.9375 vt 0.8125 0.9375 vt 0.9375 0.6875 -vt 0.90625 0.6875 -vt 0.90625 0.9375 +vt 0.9063 0.6875 +vt 0.9063 0.9375 vt 0.9375 0.9375 vt 0.8125 0.9375 -vt 0.84375 0.9375 -vt 0.84375 0.6875 +vt 0.8438 0.9375 +vt 0.8438 0.6875 vt 0.8125 0.6875 -vt 0.9375 0.71875 -vt 0.8125 0.71875 +vt 0.9375 0.7188 +vt 0.8125 0.7188 vt 0.8125 0.6875 vt 0.9375 0.6875 vt 0.8125 0.9375 vt 0.9375 0.9375 -vt 0.9375 0.90625 -vt 0.8125 0.90625 +vt 0.9375 0.9063 +vt 0.8125 0.9063 vt 0.8125 0.9375 vt 0.8125 0.6875 vt 0.9375 0.6875 @@ -12679,22 +11242,22 @@ vt 0.9375 0.9375 vt 0.9375 0.6875 vt 0.8125 0.6875 vt 0.8125 0.9375 -vt 0.90625 0.9375 -vt 0.90625 0.6875 +vt 0.9063 0.9375 +vt 0.9063 0.6875 vt 0.9375 0.6875 vt 0.9375 0.9375 -vt 0.84375 0.6875 -vt 0.84375 0.9375 +vt 0.8438 0.6875 +vt 0.8438 0.9375 vt 0.8125 0.9375 vt 0.8125 0.6875 vt 0.8125 0.6875 -vt 0.8125 0.71875 -vt 0.9375 0.71875 +vt 0.8125 0.7188 +vt 0.9375 0.7188 vt 0.9375 0.6875 -vt 0.9375 0.90625 +vt 0.9375 0.9063 vt 0.9375 0.9375 vt 0.8125 0.9375 -vt 0.8125 0.90625 +vt 0.8125 0.9063 vt 0.9375 0.6875 vt 0.8125 0.6875 vt 0.8125 0.9375 @@ -12704,21 +11267,21 @@ vt 0.9375 0.6875 vt 0.9375 0.9375 vt 0.8125 0.9375 vt 0.9375 0.6875 -vt 0.90625 0.6875 -vt 0.90625 0.9375 +vt 0.9063 0.6875 +vt 0.9063 0.9375 vt 0.9375 0.9375 vt 0.8125 0.9375 -vt 0.84375 0.9375 -vt 0.84375 0.6875 +vt 0.8438 0.9375 +vt 0.8438 0.6875 vt 0.8125 0.6875 -vt 0.9375 0.71875 -vt 0.8125 0.71875 +vt 0.9375 0.7188 +vt 0.8125 0.7188 vt 0.8125 0.6875 vt 0.9375 0.6875 vt 0.8125 0.9375 vt 0.9375 0.9375 -vt 0.9375 0.90625 -vt 0.8125 0.90625 +vt 0.9375 0.9063 +vt 0.8125 0.9063 vt 0.8125 0.9375 vt 0.8125 0.6875 vt 0.9375 0.6875 @@ -12727,22 +11290,22 @@ vt 0.9375 0.9375 vt 0.9375 0.6875 vt 0.8125 0.6875 vt 0.8125 0.9375 -vt 0.90625 0.9375 -vt 0.90625 0.6875 +vt 0.9063 0.9375 +vt 0.9063 0.6875 vt 0.9375 0.6875 vt 0.9375 0.9375 -vt 0.84375 0.6875 -vt 0.84375 0.9375 +vt 0.8438 0.6875 +vt 0.8438 0.9375 vt 0.8125 0.9375 vt 0.8125 0.6875 vt 0.8125 0.6875 -vt 0.8125 0.71875 -vt 0.9375 0.71875 +vt 0.8125 0.7188 +vt 0.9375 0.7188 vt 0.9375 0.6875 -vt 0.9375 0.90625 +vt 0.9375 0.9063 vt 0.9375 0.9375 vt 0.8125 0.9375 -vt 0.8125 0.90625 +vt 0.8125 0.9063 vt 0.9375 0.6875 vt 0.8125 0.6875 vt 0.8125 0.9375 @@ -12752,573 +11315,483 @@ vt 0.9375 0.6875 vt 0.9375 0.9375 vt 0.8125 0.9375 vt 0.9375 0.6875 -vt 0.90625 0.6875 -vt 0.90625 0.9375 +vt 0.9063 0.6875 +vt 0.9063 0.9375 vt 0.9375 0.9375 vt 0.8125 0.9375 -vt 0.84375 0.9375 -vt 0.84375 0.6875 +vt 0.8438 0.9375 +vt 0.8438 0.6875 vt 0.8125 0.6875 vt 0.0625 0.825 vt 0.175 0.9375 vt 0.175 0.5625 vt 0.0625 0.675 -vt 0.1749990625 0.5624984375 -vt 0.0625 0.6749974999999999 -vt 0.0625025 0.8249984375 -vt 0.1749990625 0.9375 +vt 0.175 0.5625 +vt 0.0625 0.675 +vt 0.0625 0.825 +vt 0.175 0.9375 vt 0.0625 0.8125 -vt 0.09375 0.8125 -vt 0.09375 0.6875 +vt 0.0938 0.8125 +vt 0.0938 0.6875 vt 0.0625 0.6875 vt 0.0625 0.8125 -vt 0.09375 0.8125 -vt 0.09375 0.6875 +vt 0.0938 0.8125 +vt 0.0938 0.6875 vt 0.0625 0.6875 vt 0.0625 0.8125 -vt 0.09375 0.8125 -vt 0.09375 0.6875 +vt 0.0938 0.8125 +vt 0.0938 0.6875 vt 0.0625 0.6875 -vt 0.3250040625 0.5624984375 -vt 0.175 0.5624984375 +vt 0.325 0.5625 +vt 0.175 0.5625 vt 0.175 0.9375 -vt 0.3250040625 0.9375 +vt 0.325 0.9375 vt 0.175 0.9375 vt 0.325 0.9375 vt 0.325 0.5625 vt 0.175 0.5625 vt 0.0625 0.8125 -vt 0.09375 0.8125 -vt 0.09375 0.6875 +vt 0.0938 0.8125 +vt 0.0938 0.6875 vt 0.0625 0.6875 vt 0.0625 0.8125 -vt 0.09375 0.8125 -vt 0.09375 0.6875 +vt 0.0938 0.8125 +vt 0.0938 0.6875 vt 0.0625 0.6875 -vt 0.4374990625 0.6749974999999999 -vt 0.325 0.5624984375 +vt 0.4375 0.675 +vt 0.325 0.5625 vt 0.325 0.9375 -vt 0.4374990625 0.82500125 +vt 0.4375 0.825 vt 0.325 0.9375 vt 0.4375 0.825 vt 0.4375 0.675 vt 0.325 0.5625 vt 0.0625 0.8125 -vt 0.09375 0.8125 -vt 0.09375 0.6875 +vt 0.0938 0.8125 +vt 0.0938 0.6875 vt 0.0625 0.6875 vt 0.0625 0.8125 -vt 0.09375 0.8125 -vt 0.09375 0.6875 +vt 0.0938 0.8125 +vt 0.0938 0.6875 vt 0.0625 0.6875 vt 0.0625 0.8125 -vt 0.09375 0.8125 -vt 0.09375 0.6875 +vt 0.0938 0.8125 +vt 0.0938 0.6875 vt 0.0625 0.6875 vt 0.0625 0.825 vt 0.175 0.9375 vt 0.175 0.5625 vt 0.0625 0.675 -vt 0.1749990625 0.5624984375 -vt 0.0625 0.6749974999999999 -vt 0.0625025 0.8249984375 -vt 0.1749990625 0.9375 +vt 0.175 0.5625 +vt 0.0625 0.675 +vt 0.0625 0.825 +vt 0.175 0.9375 vt 0.0625 0.8125 -vt 0.09375 0.8125 -vt 0.09375 0.6875 +vt 0.0938 0.8125 +vt 0.0938 0.6875 vt 0.0625 0.6875 vt 0.0625 0.8125 -vt 0.09375 0.8125 -vt 0.09375 0.6875 +vt 0.0938 0.8125 +vt 0.0938 0.6875 vt 0.0625 0.6875 vt 0.0625 0.8125 -vt 0.09375 0.8125 -vt 0.09375 0.6875 +vt 0.0938 0.8125 +vt 0.0938 0.6875 vt 0.0625 0.6875 -vt 0.3250040625 0.5624984375 -vt 0.175 0.5624984375 +vt 0.325 0.5625 +vt 0.175 0.5625 vt 0.175 0.9375 -vt 0.3250040625 0.9375 +vt 0.325 0.9375 vt 0.175 0.9375 vt 0.325 0.9375 vt 0.325 0.5625 vt 0.175 0.5625 vt 0.0625 0.8125 -vt 0.09375 0.8125 -vt 0.09375 0.6875 +vt 0.0938 0.8125 +vt 0.0938 0.6875 vt 0.0625 0.6875 vt 0.0625 0.8125 -vt 0.09375 0.8125 -vt 0.09375 0.6875 +vt 0.0938 0.8125 +vt 0.0938 0.6875 vt 0.0625 0.6875 -vt 0.4374990625 0.6749974999999999 -vt 0.325 0.5624984375 +vt 0.4375 0.675 +vt 0.325 0.5625 vt 0.325 0.9375 -vt 0.4374990625 0.82500125 +vt 0.4375 0.825 vt 0.325 0.9375 vt 0.4375 0.825 vt 0.4375 0.675 vt 0.325 0.5625 vt 0.0625 0.8125 -vt 0.09375 0.8125 -vt 0.09375 0.6875 +vt 0.0938 0.8125 +vt 0.0938 0.6875 vt 0.0625 0.6875 vt 0.0625 0.8125 -vt 0.09375 0.8125 -vt 0.09375 0.6875 +vt 0.0938 0.8125 +vt 0.0938 0.6875 vt 0.0625 0.6875 vt 0.0625 0.8125 -vt 0.09375 0.8125 -vt 0.09375 0.6875 +vt 0.0938 0.8125 +vt 0.0938 0.6875 vt 0.0625 0.6875 -vt 0.53125 0.9375 -vt 0.71875 0.9375 -vt 0.71875 0.75 -vt 0.53125 0.75 +vt 0.5313 0.9375 +vt 0.7188 0.9375 +vt 0.7188 0.75 +vt 0.5313 0.75 vt 0.5625 0.75 -vt 0.53125 0.75 -vt 0.53125 0.9375 +vt 0.5313 0.75 +vt 0.5313 0.9375 vt 0.5625 0.9375 vt 0.6875 0.9375 -vt 0.71875 0.9375 -vt 0.71875 0.75 +vt 0.7188 0.9375 +vt 0.7188 0.75 vt 0.6875 0.75 -vt 0.53125 0.9375 +vt 0.5313 0.9375 vt 0.5625 0.9375 vt 0.5625 0.75 -vt 0.53125 0.75 +vt 0.5313 0.75 vt 0.6875 0.9375 -vt 0.71875 0.9375 -vt 0.71875 0.75 +vt 0.7188 0.9375 +vt 0.7188 0.75 vt 0.6875 0.75 -vt 0.71875 0.75 -vt 0.71875 0.9375 -vt 0.53125 0.9375 -vt 0.53125 0.75 -vt 0.53125 0.9375 -vt 0.53125 0.75 +vt 0.7188 0.75 +vt 0.7188 0.9375 +vt 0.5313 0.9375 +vt 0.5313 0.75 +vt 0.5313 0.9375 +vt 0.5313 0.75 vt 0.5625 0.75 vt 0.5625 0.9375 -vt 0.71875 0.75 -vt 0.71875 0.9375 +vt 0.7188 0.75 +vt 0.7188 0.9375 vt 0.6875 0.9375 vt 0.6875 0.75 vt 0.5625 0.75 vt 0.5625 0.9375 -vt 0.53125 0.9375 -vt 0.53125 0.75 -vt 0.71875 0.75 -vt 0.71875 0.9375 +vt 0.5313 0.9375 +vt 0.5313 0.75 +vt 0.7188 0.75 +vt 0.7188 0.9375 vt 0.6875 0.9375 vt 0.6875 0.75 -vn -8.659560562354933e-17 1 1.1102230246251565e-16 -vn 8.659560562354933e-17 -1 -1.1102230246251565e-16 -vn -8.65956056235493e-17 -1.1102230246251565e-16 1 -vn 8.65956056235493e-17 1.1102230246251565e-16 -1 -vn -1 -8.65956056235493e-17 -8.659560562354932e-17 -vn 1 8.65956056235493e-17 8.659560562354932e-17 -vn 1.224646799147353e-16 -0.7071067811865475 -0.7071067811865476 -vn -1.224646799147353e-16 0.7071067811865475 0.7071067811865476 -vn -1.232595164407831e-32 0.7071067811865476 -0.7071067811865475 -vn 1.232595164407831e-32 -0.7071067811865476 0.7071067811865475 -vn -1 -8.65956056235493e-17 -8.659560562354932e-17 -vn 1 8.65956056235493e-17 8.659560562354932e-17 -vn -1.232595164407831e-32 0.7071067811865476 -0.7071067811865475 -vn 1.232595164407831e-32 -0.7071067811865476 0.7071067811865475 -vn 1.224646799147353e-16 -0.7071067811865475 -0.7071067811865476 -vn -1.224646799147353e-16 0.7071067811865475 0.7071067811865476 -vn -1 -8.65956056235493e-17 -8.659560562354932e-17 -vn 1 8.65956056235493e-17 8.659560562354932e-17 -vn -1.224646799147353e-16 0.7071067811865475 0.7071067811865476 -vn 1.224646799147353e-16 -0.7071067811865475 -0.7071067811865476 -vn 1.232595164407831e-32 -0.7071067811865476 0.7071067811865475 -vn -1.232595164407831e-32 0.7071067811865476 -0.7071067811865475 -vn -1 -8.65956056235493e-17 -8.659560562354932e-17 -vn 1 8.65956056235493e-17 8.659560562354932e-17 -vn 1.232595164407831e-32 -0.7071067811865476 0.7071067811865475 -vn -1.232595164407831e-32 0.7071067811865476 -0.7071067811865475 -vn -1.224646799147353e-16 0.7071067811865475 0.7071067811865476 -vn 1.224646799147353e-16 -0.7071067811865475 -0.7071067811865476 -vn -1 -8.65956056235493e-17 -8.659560562354932e-17 -vn 1 8.65956056235493e-17 8.659560562354932e-17 -vn 8.65956056235493e-17 1.1102230246251565e-16 -1 -vn -8.659560562354932e-17 -1.1102230246251568e-16 1 -vn -8.659560562354932e-17 1 -2.775557561562892e-16 -vn 8.659560562354934e-17 -1 -3.3306690738754696e-16 -vn -1 -8.65956056235493e-17 -8.659560562354932e-17 -vn 1 8.65956056235493e-17 8.659560562354932e-17 -vn -8.659560562354933e-17 1 1.1102230246251565e-16 -vn 8.659560562354934e-17 -1 -1.1102230246251568e-16 -vn 8.659560562354927e-17 3.3306690738754696e-16 -1 -vn -8.659560562354934e-17 2.775557561562892e-16 1 -vn -1 -8.65956056235493e-17 -8.659560562354932e-17 -vn 1 8.65956056235493e-17 8.659560562354932e-17 -vn -8.65956056235493e-17 -1.1102230246251565e-16 1 -vn 8.659560562354932e-17 1.1102230246251568e-16 -1 -vn 8.659560562354932e-17 -1 2.775557561562892e-16 -vn -8.659560562354934e-17 1 3.3306690738754696e-16 -vn -1 -8.65956056235493e-17 -8.659560562354932e-17 -vn 1 8.65956056235493e-17 8.659560562354932e-17 -vn 8.659560562354933e-17 -1 -1.1102230246251565e-16 -vn -8.659560562354934e-17 1 1.1102230246251568e-16 -vn -8.659560562354927e-17 -3.3306690738754696e-16 1 -vn 8.659560562354934e-17 -2.775557561562892e-16 -1 -vn 1 8.65956056235493e-17 8.659560562354932e-17 -vn -1 -8.65956056235493e-17 -8.659560562354932e-17 -vn -1.232595164407831e-32 0.7071067811865476 -0.7071067811865475 -vn 1.224646799147353e-16 -0.7071067811865475 -0.7071067811865476 -vn 8.659560562354932e-17 1.1102230246251568e-16 -1 -vn -1 -8.65956056235493e-17 -8.659560562354932e-17 -vn 1 8.65956056235493e-17 8.659560562354932e-17 -vn -8.659560562354934e-17 1 1.1102230246251568e-16 -vn 8.659560562354934e-17 -1 -1.1102230246251568e-16 -vn -1 -8.65956056235493e-17 -8.659560562354932e-17 -vn 1 8.65956056235493e-17 8.659560562354932e-17 -vn -1.224646799147353e-16 0.7071067811865475 0.7071067811865476 -vn 1.232595164407831e-32 -0.7071067811865476 0.7071067811865475 -vn -8.659560562354932e-17 -1.1102230246251568e-16 1 -vn 1 8.65956056235493e-17 8.659560562354932e-17 -vn -1 -8.65956056235493e-17 -8.659560562354932e-17 -vn -1.232595164407831e-32 0.7071067811865476 -0.7071067811865475 -vn 1.224646799147353e-16 -0.7071067811865475 -0.7071067811865476 -vn 8.659560562354932e-17 1.1102230246251568e-16 -1 -vn -1 -8.65956056235493e-17 -8.659560562354932e-17 -vn 1 8.65956056235493e-17 8.659560562354932e-17 -vn -8.659560562354934e-17 1 1.1102230246251568e-16 -vn 8.659560562354934e-17 -1 -1.1102230246251568e-16 -vn -1 -8.65956056235493e-17 -8.659560562354932e-17 -vn 1 8.65956056235493e-17 8.659560562354932e-17 -vn -1.224646799147353e-16 0.7071067811865475 0.7071067811865476 -vn 1.232595164407831e-32 -0.7071067811865476 0.7071067811865475 -vn -8.659560562354932e-17 -1.1102230246251568e-16 1 -vn -1 -8.65956056235493e-17 -8.659560562354932e-17 -vn -8.659560562354933e-17 1 1.1102230246251565e-16 -vn 8.659560562354933e-17 -1 -1.1102230246251565e-16 -vn -8.65956056235493e-17 -1.1102230246251565e-16 1 -vn 8.65956056235493e-17 1.1102230246251565e-16 -1 -vn 1 8.65956056235493e-17 8.659560562354932e-17 -vn -8.659560562354933e-17 1 1.1102230246251565e-16 -vn 8.659560562354933e-17 -1 -1.1102230246251565e-16 -vn -8.65956056235493e-17 -1.1102230246251565e-16 1 -vn 8.65956056235493e-17 1.1102230246251565e-16 -1 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn -1 0 0 +vn 1 0 0 +vn 0 -0.71 -0.71 +vn 0 0.71 0.71 +vn 0 0.71 -0.71 +vn 0 -0.71 0.71 +vn -1 0 0 +vn 1 0 0 +vn 0 0.71 -0.71 +vn 0 -0.71 0.71 +vn 0 -0.71 -0.71 +vn 0 0.71 0.71 +vn -1 0 0 +vn 1 0 0 +vn 0 0.71 0.71 +vn 0 -0.71 -0.71 +vn 0 -0.71 0.71 +vn 0 0.71 -0.71 +vn -1 0 0 +vn 1 0 0 +vn 0 -0.71 0.71 +vn 0 0.71 -0.71 +vn 0 0.71 0.71 +vn 0 -0.71 -0.71 +vn -1 0 0 +vn 1 0 0 +vn 0 0 -1 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 -1 0 +vn 0 1 0 +vn -1 0 0 +vn 1 0 0 +vn 0 -1 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 0.71 -0.71 +vn 0 -0.71 -0.71 +vn 0 0 -1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn -1 0 0 +vn 1 0 0 +vn 0 0.71 0.71 +vn 0 -0.71 0.71 +vn 0 0 1 +vn 1 0 0 +vn -1 0 0 +vn 0 0.71 -0.71 +vn 0 -0.71 -0.71 +vn 0 0 -1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn -1 0 0 +vn 1 0 0 +vn 0 0.71 0.71 +vn 0 -0.71 0.71 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 usemtl tracks14_12 -f 2070/5745/1437 2066/5746/1437 2065/5747/1437 -f 2070/5745/1437 2065/5747/1437 2069/5748/1437 -f 2071/5749/1438 2067/5750/1438 2068/5751/1438 -f 2071/5749/1438 2068/5751/1438 2072/5752/1438 -f 2069/5753/1439 2065/5754/1439 2067/5755/1439 -f 2069/5753/1439 2067/5755/1439 2071/5756/1439 -f 2066/5757/1440 2070/5758/1440 2072/5759/1440 -f 2066/5757/1440 2072/5759/1440 2068/5760/1440 -f 2073/5761/1441 2074/5762/1441 2076/5763/1441 -f 2073/5761/1441 2076/5763/1441 2075/5764/1441 -f 2078/5765/1442 2077/5766/1442 2079/5767/1442 -f 2078/5765/1442 2079/5767/1442 2080/5768/1442 -f 2078/5769/1443 2074/5770/1443 2073/5771/1443 -f 2078/5769/1443 2073/5771/1443 2077/5772/1443 -f 2079/5773/1444 2075/5774/1444 2076/5775/1444 -f 2079/5773/1444 2076/5775/1444 2080/5776/1444 -f 2077/5777/1445 2073/5778/1445 2075/5779/1445 -f 2077/5777/1445 2075/5779/1445 2079/5780/1445 -f 2074/5781/1446 2078/5782/1446 2080/5783/1446 -f 2074/5781/1446 2080/5783/1446 2076/5784/1446 -f 2084/5785/1447 2082/5786/1447 2081/5787/1447 -f 2084/5785/1447 2081/5787/1447 2083/5788/1447 -f 2087/5789/1448 2085/5790/1448 2086/5791/1448 -f 2087/5789/1448 2086/5791/1448 2088/5792/1448 -f 2081/5793/1449 2082/5794/1449 2086/5795/1449 -f 2081/5793/1449 2086/5795/1449 2085/5796/1449 -f 2084/5797/1450 2083/5798/1450 2087/5799/1450 -f 2084/5797/1450 2087/5799/1450 2088/5800/1450 -f 2083/5801/1451 2081/5802/1451 2085/5803/1451 -f 2083/5801/1451 2085/5803/1451 2087/5804/1451 -f 2088/5805/1452 2086/5806/1452 2082/5807/1452 -f 2088/5805/1452 2082/5807/1452 2084/5808/1452 -f 2089/5809/1453 2090/5810/1453 2092/5811/1453 -f 2089/5809/1453 2092/5811/1453 2091/5812/1453 -f 2094/5813/1454 2093/5814/1454 2095/5815/1454 -f 2094/5813/1454 2095/5815/1454 2096/5816/1454 -f 2094/5817/1455 2090/5818/1455 2089/5819/1455 -f 2094/5817/1455 2089/5819/1455 2093/5820/1455 -f 2095/5821/1456 2091/5822/1456 2092/5823/1456 -f 2095/5821/1456 2092/5823/1456 2096/5824/1456 -f 2093/5825/1457 2089/5826/1457 2091/5827/1457 -f 2093/5825/1457 2091/5827/1457 2095/5828/1457 -f 2090/5829/1458 2094/5830/1458 2096/5831/1458 -f 2090/5829/1458 2096/5831/1458 2092/5832/1458 -f 2100/5833/1459 2098/5834/1459 2097/5835/1459 -f 2100/5833/1459 2097/5835/1459 2099/5836/1459 -f 2103/5837/1460 2101/5838/1460 2102/5839/1460 -f 2103/5837/1460 2102/5839/1460 2104/5840/1460 -f 2097/5841/1461 2098/5842/1461 2102/5843/1461 -f 2097/5841/1461 2102/5843/1461 2101/5844/1461 -f 2100/5845/1462 2099/5846/1462 2103/5847/1462 -f 2100/5845/1462 2103/5847/1462 2104/5848/1462 -f 2099/5849/1463 2097/5850/1463 2101/5851/1463 -f 2099/5849/1463 2101/5851/1463 2103/5852/1463 -f 2104/5853/1464 2102/5854/1464 2098/5855/1464 -f 2104/5853/1464 2098/5855/1464 2100/5856/1464 -f 2105/5857/1465 2106/5858/1465 2108/5859/1465 -f 2105/5857/1465 2108/5859/1465 2107/5860/1465 -f 2110/5861/1466 2109/5862/1466 2111/5863/1466 -f 2110/5861/1466 2111/5863/1466 2112/5864/1466 -f 2110/5865/1467 2106/5866/1467 2105/5867/1467 -f 2110/5865/1467 2105/5867/1467 2109/5868/1467 -f 2111/5869/1468 2107/5870/1468 2108/5871/1468 -f 2111/5869/1468 2108/5871/1468 2112/5872/1468 -f 2109/5873/1469 2105/5874/1469 2107/5875/1469 -f 2109/5873/1469 2107/5875/1469 2111/5876/1469 -f 2106/5877/1470 2110/5878/1470 2112/5879/1470 -f 2106/5877/1470 2112/5879/1470 2108/5880/1470 -f 2116/5881/1471 2114/5882/1471 2113/5883/1471 -f 2116/5881/1471 2113/5883/1471 2115/5884/1471 -f 2119/5885/1472 2117/5886/1472 2118/5887/1472 -f 2119/5885/1472 2118/5887/1472 2120/5888/1472 -f 2113/5889/1473 2114/5890/1473 2118/5891/1473 -f 2113/5889/1473 2118/5891/1473 2117/5892/1473 -f 2116/5893/1474 2115/5894/1474 2119/5895/1474 -f 2116/5893/1474 2119/5895/1474 2120/5896/1474 -f 2115/5897/1475 2113/5898/1475 2117/5899/1475 -f 2115/5897/1475 2117/5899/1475 2119/5900/1475 -f 2120/5901/1476 2118/5902/1476 2114/5903/1476 -f 2120/5901/1476 2114/5903/1476 2116/5904/1476 -f 2121/5905/1477 2122/5906/1477 2124/5907/1477 -f 2121/5905/1477 2124/5907/1477 2123/5908/1477 -f 2126/5909/1478 2125/5910/1478 2127/5911/1478 -f 2126/5909/1478 2127/5911/1478 2128/5912/1478 -f 2126/5913/1479 2122/5914/1479 2121/5915/1479 -f 2126/5913/1479 2121/5915/1479 2125/5916/1479 -f 2127/5917/1480 2123/5918/1480 2124/5919/1480 -f 2127/5917/1480 2124/5919/1480 2128/5920/1480 -f 2125/5921/1481 2121/5922/1481 2123/5923/1481 -f 2125/5921/1481 2123/5923/1481 2127/5924/1481 -f 2122/5925/1482 2126/5926/1482 2128/5927/1482 -f 2122/5925/1482 2128/5927/1482 2124/5928/1482 -f 2132/5929/1483 2130/5930/1483 2129/5931/1483 -f 2132/5929/1483 2129/5931/1483 2131/5932/1483 -f 2135/5933/1484 2133/5934/1484 2134/5935/1484 -f 2135/5933/1484 2134/5935/1484 2136/5936/1484 -f 2129/5937/1485 2130/5938/1485 2134/5939/1485 -f 2129/5937/1485 2134/5939/1485 2133/5940/1485 -f 2132/5941/1486 2131/5942/1486 2135/5943/1486 -f 2132/5941/1486 2135/5943/1486 2136/5944/1486 -f 2131/5945/1487 2129/5946/1487 2133/5947/1487 -f 2131/5945/1487 2133/5947/1487 2135/5948/1487 -f 2136/5949/1488 2134/5950/1488 2130/5951/1488 -f 2136/5949/1488 2130/5951/1488 2132/5952/1488 -f 2137/5953/1489 2138/5954/1489 2140/5955/1489 -f 2137/5953/1489 2140/5955/1489 2139/5956/1489 -f 2142/5957/1490 2141/5958/1490 2143/5959/1490 -f 2142/5957/1490 2143/5959/1490 2144/5960/1490 -f 2142/5961/1491 2138/5962/1491 2137/5963/1491 -f 2142/5961/1491 2137/5963/1491 2141/5964/1491 -f 2143/5965/1492 2139/5966/1492 2140/5967/1492 -f 2143/5965/1492 2140/5967/1492 2144/5968/1492 -f 2141/5969/1493 2137/5970/1493 2139/5971/1493 -f 2141/5969/1493 2139/5971/1493 2143/5972/1493 -f 2145/5973/1494 2146/5974/1494 2148/5975/1494 -f 2145/5973/1494 2148/5975/1494 2147/5976/1494 -f 2150/5977/1495 2149/5978/1495 2151/5979/1495 -f 2150/5977/1495 2151/5979/1495 2152/5980/1495 -f 2150/5981/1496 2146/5982/1496 2145/5983/1496 -f 2150/5981/1496 2145/5983/1496 2149/5984/1496 -f 2151/5985/1497 2147/5986/1497 2148/5987/1497 -f 2151/5985/1497 2148/5987/1497 2152/5988/1497 -f 2153/5989/1498 2154/5990/1498 2156/5991/1498 -f 2153/5989/1498 2156/5991/1498 2155/5992/1498 -f 2158/5993/1499 2157/5994/1499 2159/5995/1499 -f 2158/5993/1499 2159/5995/1499 2160/5996/1499 -f 2158/5997/1500 2154/5998/1500 2153/5999/1500 -f 2158/5997/1500 2153/5999/1500 2157/6000/1500 -f 2159/6001/1501 2155/6002/1501 2156/6003/1501 -f 2159/6001/1501 2156/6003/1501 2160/6004/1501 -f 2157/6005/1502 2153/6006/1502 2155/6007/1502 -f 2157/6005/1502 2155/6007/1502 2159/6008/1502 -f 2161/6009/1503 2162/6010/1503 2164/6011/1503 -f 2161/6009/1503 2164/6011/1503 2163/6012/1503 -f 2166/6013/1504 2165/6014/1504 2167/6015/1504 -f 2166/6013/1504 2167/6015/1504 2168/6016/1504 -f 2166/6017/1505 2162/6018/1505 2161/6019/1505 -f 2166/6017/1505 2161/6019/1505 2165/6020/1505 -f 2167/6021/1506 2163/6022/1506 2164/6023/1506 -f 2167/6021/1506 2164/6023/1506 2168/6024/1506 -f 2165/6025/1507 2161/6026/1507 2163/6027/1507 -f 2165/6025/1507 2163/6027/1507 2167/6028/1507 -f 2169/6029/1508 2170/6030/1508 2172/6031/1508 -f 2169/6029/1508 2172/6031/1508 2171/6032/1508 -f 2174/6033/1509 2173/6034/1509 2175/6035/1509 -f 2174/6033/1509 2175/6035/1509 2176/6036/1509 -f 2174/6037/1510 2170/6038/1510 2169/6039/1510 -f 2174/6037/1510 2169/6039/1510 2173/6040/1510 -f 2175/6041/1511 2171/6042/1511 2172/6043/1511 -f 2175/6041/1511 2172/6043/1511 2176/6044/1511 -f 2177/6045/1512 2178/6046/1512 2180/6047/1512 -f 2177/6045/1512 2180/6047/1512 2179/6048/1512 -f 2182/6049/1513 2181/6050/1513 2183/6051/1513 -f 2182/6049/1513 2183/6051/1513 2184/6052/1513 -f 2182/6053/1514 2178/6054/1514 2177/6055/1514 -f 2182/6053/1514 2177/6055/1514 2181/6056/1514 -f 2183/6057/1515 2179/6058/1515 2180/6059/1515 -f 2183/6057/1515 2180/6059/1515 2184/6060/1515 -f 2181/6061/1516 2177/6062/1516 2179/6063/1516 -f 2181/6061/1516 2179/6063/1516 2183/6064/1516 -f 2185/6065/1517 2186/6066/1517 2188/6067/1517 -f 2185/6065/1517 2188/6067/1517 2187/6068/1517 -f 2190/6069/1518 2186/6070/1518 2185/6071/1518 -f 2190/6069/1518 2185/6071/1518 2189/6072/1518 -f 2191/6073/1519 2187/6074/1519 2188/6075/1519 -f 2191/6073/1519 2188/6075/1519 2192/6076/1519 -f 2189/6077/1520 2185/6078/1520 2187/6079/1520 -f 2189/6077/1520 2187/6079/1520 2191/6080/1520 -f 2186/6081/1521 2190/6082/1521 2192/6083/1521 -f 2186/6081/1521 2192/6083/1521 2188/6084/1521 -f 2196/6085/1522 2194/6086/1522 2193/6087/1522 -f 2196/6085/1522 2193/6087/1522 2195/6088/1522 -f 2193/6089/1523 2194/6090/1523 2198/6091/1523 -f 2193/6089/1523 2198/6091/1523 2197/6092/1523 -f 2196/6093/1524 2195/6094/1524 2199/6095/1524 -f 2196/6093/1524 2199/6095/1524 2200/6096/1524 -f 2195/6097/1525 2193/6098/1525 2197/6099/1525 -f 2195/6097/1525 2197/6099/1525 2199/6100/1525 -f 2200/6101/1526 2198/6102/1526 2194/6103/1526 -f 2200/6101/1526 2194/6103/1526 2196/6104/1526 +f 2070/5745/1437 2066/5746/1437 2065/5747/1437 2069/5748/1437 +f 2071/5749/1438 2067/5750/1438 2068/5751/1438 2072/5752/1438 +f 2069/5753/1439 2065/5754/1439 2067/5755/1439 2071/5756/1439 +f 2066/5757/1440 2070/5758/1440 2072/5759/1440 2068/5760/1440 +f 2073/5761/1441 2074/5762/1441 2076/5763/1441 2075/5764/1441 +f 2078/5765/1442 2077/5766/1442 2079/5767/1442 2080/5768/1442 +f 2078/5769/1443 2074/5770/1443 2073/5771/1443 2077/5772/1443 +f 2079/5773/1444 2075/5774/1444 2076/5775/1444 2080/5776/1444 +f 2077/5777/1445 2073/5778/1445 2075/5779/1445 2079/5780/1445 +f 2074/5781/1446 2078/5782/1446 2080/5783/1446 2076/5784/1446 +f 2084/5785/1447 2082/5786/1447 2081/5787/1447 2083/5788/1447 +f 2087/5789/1448 2085/5790/1448 2086/5791/1448 2088/5792/1448 +f 2081/5793/1449 2082/5794/1449 2086/5795/1449 2085/5796/1449 +f 2084/5797/1450 2083/5798/1450 2087/5799/1450 2088/5800/1450 +f 2083/5801/1451 2081/5802/1451 2085/5803/1451 2087/5804/1451 +f 2088/5805/1452 2086/5806/1452 2082/5807/1452 2084/5808/1452 +f 2089/5809/1453 2090/5810/1453 2092/5811/1453 2091/5812/1453 +f 2094/5813/1454 2093/5814/1454 2095/5815/1454 2096/5816/1454 +f 2094/5817/1455 2090/5818/1455 2089/5819/1455 2093/5820/1455 +f 2095/5821/1456 2091/5822/1456 2092/5823/1456 2096/5824/1456 +f 2093/5825/1457 2089/5826/1457 2091/5827/1457 2095/5828/1457 +f 2090/5829/1458 2094/5830/1458 2096/5831/1458 2092/5832/1458 +f 2100/5833/1459 2098/5834/1459 2097/5835/1459 2099/5836/1459 +f 2103/5837/1460 2101/5838/1460 2102/5839/1460 2104/5840/1460 +f 2097/5841/1461 2098/5842/1461 2102/5843/1461 2101/5844/1461 +f 2100/5845/1462 2099/5846/1462 2103/5847/1462 2104/5848/1462 +f 2099/5849/1463 2097/5850/1463 2101/5851/1463 2103/5852/1463 +f 2104/5853/1464 2102/5854/1464 2098/5855/1464 2100/5856/1464 +f 2105/5857/1465 2106/5858/1465 2108/5859/1465 2107/5860/1465 +f 2110/5861/1466 2109/5862/1466 2111/5863/1466 2112/5864/1466 +f 2110/5865/1467 2106/5866/1467 2105/5867/1467 2109/5868/1467 +f 2111/5869/1468 2107/5870/1468 2108/5871/1468 2112/5872/1468 +f 2109/5873/1469 2105/5874/1469 2107/5875/1469 2111/5876/1469 +f 2106/5877/1470 2110/5878/1470 2112/5879/1470 2108/5880/1470 +f 2116/5881/1471 2114/5882/1471 2113/5883/1471 2115/5884/1471 +f 2119/5885/1472 2117/5886/1472 2118/5887/1472 2120/5888/1472 +f 2113/5889/1473 2114/5890/1473 2118/5891/1473 2117/5892/1473 +f 2116/5893/1474 2115/5894/1474 2119/5895/1474 2120/5896/1474 +f 2115/5897/1475 2113/5898/1475 2117/5899/1475 2119/5900/1475 +f 2120/5901/1476 2118/5902/1476 2114/5903/1476 2116/5904/1476 +f 2121/5905/1477 2122/5906/1477 2124/5907/1477 2123/5908/1477 +f 2126/5909/1478 2125/5910/1478 2127/5911/1478 2128/5912/1478 +f 2126/5913/1479 2122/5914/1479 2121/5915/1479 2125/5916/1479 +f 2127/5917/1480 2123/5918/1480 2124/5919/1480 2128/5920/1480 +f 2125/5921/1481 2121/5922/1481 2123/5923/1481 2127/5924/1481 +f 2122/5925/1482 2126/5926/1482 2128/5927/1482 2124/5928/1482 +f 2132/5929/1483 2130/5930/1483 2129/5931/1483 2131/5932/1483 +f 2135/5933/1484 2133/5934/1484 2134/5935/1484 2136/5936/1484 +f 2129/5937/1485 2130/5938/1485 2134/5939/1485 2133/5940/1485 +f 2132/5941/1486 2131/5942/1486 2135/5943/1486 2136/5944/1486 +f 2131/5945/1487 2129/5946/1487 2133/5947/1487 2135/5948/1487 +f 2136/5949/1488 2134/5950/1488 2130/5951/1488 2132/5952/1488 +f 2137/5953/1489 2138/5954/1489 2140/5955/1489 2139/5956/1489 +f 2142/5957/1490 2141/5958/1490 2143/5959/1490 2144/5960/1490 +f 2142/5961/1491 2138/5962/1491 2137/5963/1491 2141/5964/1491 +f 2143/5965/1492 2139/5966/1492 2140/5967/1492 2144/5968/1492 +f 2141/5969/1493 2137/5970/1493 2139/5971/1493 2143/5972/1493 +f 2145/5973/1494 2146/5974/1494 2148/5975/1494 2147/5976/1494 +f 2150/5977/1495 2149/5978/1495 2151/5979/1495 2152/5980/1495 +f 2150/5981/1496 2146/5982/1496 2145/5983/1496 2149/5984/1496 +f 2151/5985/1497 2147/5986/1497 2148/5987/1497 2152/5988/1497 +f 2153/5989/1498 2154/5990/1498 2156/5991/1498 2155/5992/1498 +f 2158/5993/1499 2157/5994/1499 2159/5995/1499 2160/5996/1499 +f 2158/5997/1500 2154/5998/1500 2153/5999/1500 2157/6000/1500 +f 2159/6001/1501 2155/6002/1501 2156/6003/1501 2160/6004/1501 +f 2157/6005/1502 2153/6006/1502 2155/6007/1502 2159/6008/1502 +f 2161/6009/1503 2162/6010/1503 2164/6011/1503 2163/6012/1503 +f 2166/6013/1504 2165/6014/1504 2167/6015/1504 2168/6016/1504 +f 2166/6017/1505 2162/6018/1505 2161/6019/1505 2165/6020/1505 +f 2167/6021/1506 2163/6022/1506 2164/6023/1506 2168/6024/1506 +f 2165/6025/1507 2161/6026/1507 2163/6027/1507 2167/6028/1507 +f 2169/6029/1508 2170/6030/1508 2172/6031/1508 2171/6032/1508 +f 2174/6033/1509 2173/6034/1509 2175/6035/1509 2176/6036/1509 +f 2174/6037/1510 2170/6038/1510 2169/6039/1510 2173/6040/1510 +f 2175/6041/1511 2171/6042/1511 2172/6043/1511 2176/6044/1511 +f 2177/6045/1512 2178/6046/1512 2180/6047/1512 2179/6048/1512 +f 2182/6049/1513 2181/6050/1513 2183/6051/1513 2184/6052/1513 +f 2182/6053/1514 2178/6054/1514 2177/6055/1514 2181/6056/1514 +f 2183/6057/1515 2179/6058/1515 2180/6059/1515 2184/6060/1515 +f 2181/6061/1516 2177/6062/1516 2179/6063/1516 2183/6064/1516 +f 2185/6065/1517 2186/6066/1517 2188/6067/1517 2187/6068/1517 +f 2190/6069/1518 2186/6070/1518 2185/6071/1518 2189/6072/1518 +f 2191/6073/1519 2187/6074/1519 2188/6075/1519 2192/6076/1519 +f 2189/6077/1520 2185/6078/1520 2187/6079/1520 2191/6080/1520 +f 2186/6081/1521 2190/6082/1521 2192/6083/1521 2188/6084/1521 +f 2196/6085/1522 2194/6086/1522 2193/6087/1522 2195/6088/1522 +f 2193/6089/1523 2194/6090/1523 2198/6091/1523 2197/6092/1523 +f 2196/6093/1524 2195/6094/1524 2199/6095/1524 2200/6096/1524 +f 2195/6097/1525 2193/6098/1525 2197/6099/1525 2199/6100/1525 +f 2200/6101/1526 2198/6102/1526 2194/6103/1526 2196/6104/1526 o LeftWheelLead2 -v -0.875 1.0624999696333308 2.249999969633331 -v -0.875 1.0624999696333308 1.8750000303666692 -v -0.875 0.6875000303666692 2.249999969633331 -v -0.875 0.6875000303666692 1.8750000303666692 -v -0.75 1.0624999696333308 2.249999969633331 -v -0.75 1.0624999696333308 1.8750000303666692 -v -0.75 0.6875000303666692 2.249999969633331 -v -0.75 0.6875000303666692 1.8750000303666692 -v -1 1.162262129857035 2.217179608384557 -v -1 1.0296796083845572 2.349762129857035 -v -1 1.2064563036811942 2.2613737822087163 -v -1 1.0738737822087165 2.393956303681194 -v -0.625 1.162262129857035 2.217179608384557 -v -0.625 1.0296796083845572 2.349762129857035 -v -0.625 1.2064563036811942 2.2613737822087163 -v -0.625 1.0738737822087165 2.393956303681194 -v -1 0.5877378701429651 2.217179608384557 -v -1 0.7203203916154427 2.349762129857035 -v -1 0.5435436963188058 2.2613737822087163 -v -1 0.6761262177912835 2.393956303681194 -v -0.625 0.5877378701429651 2.217179608384557 -v -0.625 0.7203203916154427 2.349762129857035 -v -0.625 0.5435436963188058 2.2613737822087163 -v -0.625 0.6761262177912835 2.393956303681194 -v -1 0.5877378701429651 1.9078203916154428 -v -1 0.7203203916154427 1.775237870142965 -v -1 0.5435436963188058 1.8636262177912835 -v -1 0.6761262177912836 1.7310436963188058 -v -0.625 0.5877378701429651 1.9078203916154428 -v -0.625 0.7203203916154428 1.775237870142965 -v -0.625 0.5435436963188058 1.8636262177912835 -v -0.625 0.6761262177912836 1.7310436963188058 -v -1 1.162262129857035 1.9078203916154428 -v -1 1.0296796083845572 1.775237870142965 -v -1 1.2064563036811942 1.8636262177912835 -v -1 1.0738737822087165 1.7310436963188058 -v -0.625 1.162262129857035 1.9078203916154428 -v -0.625 1.0296796083845572 1.775237870142965 -v -0.625 1.2064563036811942 1.8636262177912837 -v -0.625 1.0738737822087165 1.7310436963188058 -v -1 0.9687499848166654 2.3749996547610595 -v -1 0.7812500151833346 2.3749996547610595 -v -1 0.9687499848166654 2.4374999392666616 -v -1 0.7812500151833345 2.4374999392666616 -v -0.625 0.9687499848166654 2.3749996547610595 -v -0.625 0.7812500151833346 2.3749996547610595 -v -0.625 0.9687499848166654 2.4374999392666616 -v -0.625 0.7812500151833346 2.4374999392666616 -v -1 0.5625003452389407 1.9687500151833346 -v -1 0.5625003452389407 2.1562499848166654 -v -1 0.5000000607333382 1.9687500151833346 -v -1 0.5000000607333382 2.1562499848166654 -v -0.625 0.5625003452389408 1.9687500151833346 -v -0.625 0.5625003452389408 2.1562499848166654 -v -0.625 0.5000000607333384 1.9687500151833346 -v -0.625 0.5000000607333382 2.1562499848166654 -v -1 0.7812500151833346 1.7500003452389405 -v -1 0.9687499848166654 1.7500003452389408 -v -1 0.7812500151833346 1.6875000607333384 -v -1 0.9687499848166654 1.6875000607333384 -v -0.625 0.7812500151833346 1.7500003452389408 -v -0.625 0.9687499848166654 1.7500003452389408 -v -0.625 0.7812500151833346 1.6875000607333384 -v -0.625 0.9687499848166655 1.6875000607333384 -v -1 1.1874996547610592 2.1562499848166654 -v -1 1.1874996547610592 1.9687500151833346 -v -1 1.2499999392666616 2.1562499848166654 -v -1 1.2499999392666616 1.9687500151833346 -v -0.625 1.1874996547610595 2.1562499848166654 -v -0.625 1.1874996547610595 1.9687500151833346 -v -0.625 1.2499999392666616 2.1562499848166654 -v -0.625 1.2499999392666616 1.9687500151833346 -v -0.875 1.0000001270694667 1.7499999032972025 -v -0.875 1.1875000967027975 1.9374998729305333 -v -0.875 0.7499998729305334 1.7499999032972025 -v -0.875 0.5624999032972025 1.9374998729305333 -v -0.9375 1.0000001270694667 1.7499999032972025 -v -0.9375 1.1875000967027975 1.9374998729305333 -v -0.9375 0.7499998729305334 1.7499999032972025 -v -0.9375 0.5624999032972025 1.9374998729305333 -v -0.9375 1.1875000967027975 2.1875001270694665 -v -0.9375 1.1875000967027975 1.9374998729305333 -v -0.9375 0.5624999032972025 2.1875001270694665 -v -0.9375 0.5624999032972025 1.9374998729305333 -v -0.875 1.1875000967027975 2.1875001270694665 -v -0.875 1.1875000967027975 1.9374998729305333 -v -0.875 0.5624999032972025 2.1875001270694665 -v -0.875 0.5624999032972025 1.9374998729305333 -v -0.9375 1.0000001270694667 2.3750000967027978 -v -0.9375 1.1875000967027975 2.1875001270694665 -v -0.9375 0.7499998729305333 2.3750000967027973 -v -0.9375 0.5624999032972025 2.1875001270694665 -v -0.875 1.0000001270694667 2.3750000967027978 -v -0.875 1.1875000967027975 2.1875001270694665 -v -0.875 0.7499998729305333 2.3750000967027978 -v -0.875 0.5624999032972025 2.1875001270694665 -v -0.6875 1.0000001270694667 1.7499999032972025 -v -0.6875 1.1875000967027975 1.9374998729305335 -v -0.6875 0.7499998729305334 1.7499999032972025 -v -0.6875 0.5624999032972025 1.9374998729305333 -v -0.75 1.0000001270694667 1.7499999032972025 -v -0.75 1.1875000967027975 1.9374998729305333 -v -0.75 0.7499998729305334 1.7499999032972025 -v -0.75 0.5624999032972025 1.9374998729305333 -v -0.75 1.1875000967027975 2.1875001270694665 -v -0.75 1.1875000967027975 1.9374998729305333 -v -0.75 0.5624999032972025 2.1875001270694665 -v -0.75 0.5624999032972025 1.9374998729305333 -v -0.6875 1.1875000967027975 2.1875001270694665 -v -0.6875 1.1875000967027975 1.9374998729305335 -v -0.6875 0.5624999032972025 2.1875001270694665 -v -0.6875 0.5624999032972025 1.9374998729305333 -v -0.75 1.0000001270694667 2.3750000967027978 -v -0.75 1.1875000967027975 2.1875001270694665 -v -0.75 0.7499998729305333 2.3750000967027978 -v -0.75 0.5624999032972025 2.1875001270694665 -v -0.6875 1.0000001270694667 2.3750000967027978 -v -0.6875 1.1875000967027975 2.1875001270694665 -v -0.6875 0.7499998729305333 2.3750000967027978 -v -0.6875 0.5624999032972025 2.1875001270694665 -v -1 1.0624999696333308 2.249999969633331 -v -1 1.0624999696333308 1.8750000303666692 -v -1 0.6875000303666691 2.249999969633331 -v -1 0.6875000303666692 1.8750000303666692 -v -0.9375 1.0624999696333308 2.249999969633331 -v -0.9375 1.0624999696333308 1.8750000303666692 -v -0.9375 0.6875000303666692 2.249999969633331 -v -0.9375 0.6875000303666692 1.8750000303666692 -v -0.625 1.0624999696333308 2.249999969633331 -v -0.625 1.0624999696333308 1.8750000303666692 -v -0.625 0.6875000303666692 2.249999969633331 -v -0.625 0.6875000303666692 1.8750000303666692 -v -0.6875 1.0624999696333308 2.249999969633331 -v -0.6875 1.0624999696333308 1.8750000303666692 -v -0.6875 0.6875000303666692 2.249999969633331 -v -0.6875 0.6875000303666692 1.8750000303666692 +v -0.875 1.0625 2.25 +v -0.875 1.0625 1.875 +v -0.875 0.6875 2.25 +v -0.875 0.6875 1.875 +v -0.75 1.0625 2.25 +v -0.75 1.0625 1.875 +v -0.75 0.6875 2.25 +v -0.75 0.6875 1.875 +v -1 1.1623 2.2172 +v -1 1.0297 2.3498 +v -1 1.2065 2.2614 +v -1 1.0739 2.394 +v -0.625 1.1623 2.2172 +v -0.625 1.0297 2.3498 +v -0.625 1.2065 2.2614 +v -0.625 1.0739 2.394 +v -1 0.5877 2.2172 +v -1 0.7203 2.3498 +v -1 0.5435 2.2614 +v -1 0.6761 2.394 +v -0.625 0.5877 2.2172 +v -0.625 0.7203 2.3498 +v -0.625 0.5435 2.2614 +v -0.625 0.6761 2.394 +v -1 0.5877 1.9078 +v -1 0.7203 1.7752 +v -1 0.5435 1.8636 +v -1 0.6761 1.731 +v -0.625 0.5877 1.9078 +v -0.625 0.7203 1.7752 +v -0.625 0.5435 1.8636 +v -0.625 0.6761 1.731 +v -1 1.1623 1.9078 +v -1 1.0297 1.7752 +v -1 1.2065 1.8636 +v -1 1.0739 1.731 +v -0.625 1.1623 1.9078 +v -0.625 1.0297 1.7752 +v -0.625 1.2065 1.8636 +v -0.625 1.0739 1.731 +v -1 0.9687 2.375 +v -1 0.7813 2.375 +v -1 0.9687 2.4375 +v -1 0.7813 2.4375 +v -0.625 0.9687 2.375 +v -0.625 0.7813 2.375 +v -0.625 0.9687 2.4375 +v -0.625 0.7813 2.4375 +v -1 0.5625 1.9688 +v -1 0.5625 2.1562 +v -1 0.5 1.9688 +v -1 0.5 2.1562 +v -0.625 0.5625 1.9688 +v -0.625 0.5625 2.1562 +v -0.625 0.5 1.9688 +v -0.625 0.5 2.1562 +v -1 0.7813 1.75 +v -1 0.9687 1.75 +v -1 0.7813 1.6875 +v -1 0.9687 1.6875 +v -0.625 0.7813 1.75 +v -0.625 0.9687 1.75 +v -0.625 0.7813 1.6875 +v -0.625 0.9687 1.6875 +v -1 1.1875 2.1562 +v -1 1.1875 1.9688 +v -1 1.25 2.1562 +v -1 1.25 1.9688 +v -0.625 1.1875 2.1562 +v -0.625 1.1875 1.9688 +v -0.625 1.25 2.1562 +v -0.625 1.25 1.9688 +v -0.875 1 1.75 +v -0.875 1.1875 1.9375 +v -0.875 0.75 1.75 +v -0.875 0.5625 1.9375 +v -0.9375 1 1.75 +v -0.9375 1.1875 1.9375 +v -0.9375 0.75 1.75 +v -0.9375 0.5625 1.9375 +v -0.9375 1.1875 2.1875 +v -0.9375 1.1875 1.9375 +v -0.9375 0.5625 2.1875 +v -0.9375 0.5625 1.9375 +v -0.875 1.1875 2.1875 +v -0.875 1.1875 1.9375 +v -0.875 0.5625 2.1875 +v -0.875 0.5625 1.9375 +v -0.9375 1 2.375 +v -0.9375 1.1875 2.1875 +v -0.9375 0.75 2.375 +v -0.9375 0.5625 2.1875 +v -0.875 1 2.375 +v -0.875 1.1875 2.1875 +v -0.875 0.75 2.375 +v -0.875 0.5625 2.1875 +v -0.6875 1 1.75 +v -0.6875 1.1875 1.9375 +v -0.6875 0.75 1.75 +v -0.6875 0.5625 1.9375 +v -0.75 1 1.75 +v -0.75 1.1875 1.9375 +v -0.75 0.75 1.75 +v -0.75 0.5625 1.9375 +v -0.75 1.1875 2.1875 +v -0.75 1.1875 1.9375 +v -0.75 0.5625 2.1875 +v -0.75 0.5625 1.9375 +v -0.6875 1.1875 2.1875 +v -0.6875 1.1875 1.9375 +v -0.6875 0.5625 2.1875 +v -0.6875 0.5625 1.9375 +v -0.75 1 2.375 +v -0.75 1.1875 2.1875 +v -0.75 0.75 2.375 +v -0.75 0.5625 2.1875 +v -0.6875 1 2.375 +v -0.6875 1.1875 2.1875 +v -0.6875 0.75 2.375 +v -0.6875 0.5625 2.1875 +v -1 1.0625 2.25 +v -1 1.0625 1.875 +v -1 0.6875 2.25 +v -1 0.6875 1.875 +v -0.9375 1.0625 2.25 +v -0.9375 1.0625 1.875 +v -0.9375 0.6875 2.25 +v -0.9375 0.6875 1.875 +v -0.625 1.0625 2.25 +v -0.625 1.0625 1.875 +v -0.625 0.6875 2.25 +v -0.625 0.6875 1.875 +v -0.6875 1.0625 2.25 +v -0.6875 1.0625 1.875 +v -0.6875 0.6875 2.25 +v -0.6875 0.6875 1.875 vt 0 0.5 vt 0.0625 0.5 vt 0.0625 0.6875 @@ -13335,14 +11808,14 @@ vt 0 0.5 vt 0.0625 0.5 vt 0.0625 0.6875 vt 0 0.6875 -vt 0.9375 0.71875 -vt 0.8125 0.71875 +vt 0.9375 0.7188 +vt 0.8125 0.7188 vt 0.8125 0.6875 vt 0.9375 0.6875 vt 0.8125 0.9375 vt 0.9375 0.9375 -vt 0.9375 0.90625 -vt 0.8125 0.90625 +vt 0.9375 0.9063 +vt 0.8125 0.9063 vt 0.8125 0.9375 vt 0.8125 0.6875 vt 0.9375 0.6875 @@ -13351,22 +11824,22 @@ vt 0.9375 0.9375 vt 0.9375 0.6875 vt 0.8125 0.6875 vt 0.8125 0.9375 -vt 0.90625 0.9375 -vt 0.90625 0.6875 +vt 0.9063 0.9375 +vt 0.9063 0.6875 vt 0.9375 0.6875 vt 0.9375 0.9375 -vt 0.84375 0.6875 -vt 0.84375 0.9375 +vt 0.8438 0.6875 +vt 0.8438 0.9375 vt 0.8125 0.9375 vt 0.8125 0.6875 vt 0.8125 0.6875 -vt 0.8125 0.71875 -vt 0.9375 0.71875 +vt 0.8125 0.7188 +vt 0.9375 0.7188 vt 0.9375 0.6875 -vt 0.9375 0.90625 +vt 0.9375 0.9063 vt 0.9375 0.9375 vt 0.8125 0.9375 -vt 0.8125 0.90625 +vt 0.8125 0.9063 vt 0.9375 0.6875 vt 0.8125 0.6875 vt 0.8125 0.9375 @@ -13376,21 +11849,21 @@ vt 0.9375 0.6875 vt 0.9375 0.9375 vt 0.8125 0.9375 vt 0.9375 0.6875 -vt 0.90625 0.6875 -vt 0.90625 0.9375 +vt 0.9063 0.6875 +vt 0.9063 0.9375 vt 0.9375 0.9375 vt 0.8125 0.9375 -vt 0.84375 0.9375 -vt 0.84375 0.6875 +vt 0.8438 0.9375 +vt 0.8438 0.6875 vt 0.8125 0.6875 -vt 0.9375 0.71875 -vt 0.8125 0.71875 +vt 0.9375 0.7188 +vt 0.8125 0.7188 vt 0.8125 0.6875 vt 0.9375 0.6875 vt 0.8125 0.9375 vt 0.9375 0.9375 -vt 0.9375 0.90625 -vt 0.8125 0.90625 +vt 0.9375 0.9063 +vt 0.8125 0.9063 vt 0.8125 0.9375 vt 0.8125 0.6875 vt 0.9375 0.6875 @@ -13399,22 +11872,22 @@ vt 0.9375 0.9375 vt 0.9375 0.6875 vt 0.8125 0.6875 vt 0.8125 0.9375 -vt 0.90625 0.9375 -vt 0.90625 0.6875 +vt 0.9063 0.9375 +vt 0.9063 0.6875 vt 0.9375 0.6875 vt 0.9375 0.9375 -vt 0.84375 0.6875 -vt 0.84375 0.9375 +vt 0.8438 0.6875 +vt 0.8438 0.9375 vt 0.8125 0.9375 vt 0.8125 0.6875 vt 0.8125 0.6875 -vt 0.8125 0.71875 -vt 0.9375 0.71875 +vt 0.8125 0.7188 +vt 0.9375 0.7188 vt 0.9375 0.6875 -vt 0.9375 0.90625 +vt 0.9375 0.9063 vt 0.9375 0.9375 vt 0.8125 0.9375 -vt 0.8125 0.90625 +vt 0.8125 0.9063 vt 0.9375 0.6875 vt 0.8125 0.6875 vt 0.8125 0.9375 @@ -13424,21 +11897,21 @@ vt 0.9375 0.6875 vt 0.9375 0.9375 vt 0.8125 0.9375 vt 0.9375 0.6875 -vt 0.90625 0.6875 -vt 0.90625 0.9375 +vt 0.9063 0.6875 +vt 0.9063 0.9375 vt 0.9375 0.9375 vt 0.8125 0.9375 -vt 0.84375 0.9375 -vt 0.84375 0.6875 +vt 0.8438 0.9375 +vt 0.8438 0.6875 vt 0.8125 0.6875 -vt 0.9375 0.71875 -vt 0.8125 0.71875 +vt 0.9375 0.7188 +vt 0.8125 0.7188 vt 0.8125 0.6875 vt 0.9375 0.6875 vt 0.8125 0.9375 vt 0.9375 0.9375 -vt 0.9375 0.90625 -vt 0.8125 0.90625 +vt 0.9375 0.9063 +vt 0.8125 0.9063 vt 0.8125 0.9375 vt 0.8125 0.6875 vt 0.9375 0.6875 @@ -13447,22 +11920,22 @@ vt 0.9375 0.9375 vt 0.9375 0.6875 vt 0.8125 0.6875 vt 0.8125 0.9375 -vt 0.90625 0.9375 -vt 0.90625 0.6875 +vt 0.9063 0.9375 +vt 0.9063 0.6875 vt 0.9375 0.6875 vt 0.9375 0.9375 -vt 0.84375 0.6875 -vt 0.84375 0.9375 +vt 0.8438 0.6875 +vt 0.8438 0.9375 vt 0.8125 0.9375 vt 0.8125 0.6875 vt 0.8125 0.6875 -vt 0.8125 0.71875 -vt 0.9375 0.71875 +vt 0.8125 0.7188 +vt 0.9375 0.7188 vt 0.9375 0.6875 -vt 0.9375 0.90625 +vt 0.9375 0.9063 vt 0.9375 0.9375 vt 0.8125 0.9375 -vt 0.8125 0.90625 +vt 0.8125 0.9063 vt 0.9375 0.6875 vt 0.8125 0.6875 vt 0.8125 0.9375 @@ -13472,21 +11945,21 @@ vt 0.9375 0.6875 vt 0.9375 0.9375 vt 0.8125 0.9375 vt 0.9375 0.6875 -vt 0.90625 0.6875 -vt 0.90625 0.9375 +vt 0.9063 0.6875 +vt 0.9063 0.9375 vt 0.9375 0.9375 vt 0.8125 0.9375 -vt 0.84375 0.9375 -vt 0.84375 0.6875 +vt 0.8438 0.9375 +vt 0.8438 0.6875 vt 0.8125 0.6875 -vt 0.9375 0.71875 -vt 0.8125 0.71875 +vt 0.9375 0.7188 +vt 0.8125 0.7188 vt 0.8125 0.6875 vt 0.9375 0.6875 vt 0.8125 0.9375 vt 0.9375 0.9375 -vt 0.9375 0.90625 -vt 0.8125 0.90625 +vt 0.9375 0.9063 +vt 0.8125 0.9063 vt 0.8125 0.9375 vt 0.8125 0.6875 vt 0.9375 0.6875 @@ -13495,22 +11968,22 @@ vt 0.9375 0.9375 vt 0.9375 0.6875 vt 0.8125 0.6875 vt 0.8125 0.9375 -vt 0.90625 0.9375 -vt 0.90625 0.6875 +vt 0.9063 0.9375 +vt 0.9063 0.6875 vt 0.9375 0.6875 vt 0.9375 0.9375 -vt 0.84375 0.6875 -vt 0.84375 0.9375 +vt 0.8438 0.6875 +vt 0.8438 0.9375 vt 0.8125 0.9375 vt 0.8125 0.6875 vt 0.8125 0.6875 -vt 0.8125 0.71875 -vt 0.9375 0.71875 +vt 0.8125 0.7188 +vt 0.9375 0.7188 vt 0.9375 0.6875 -vt 0.9375 0.90625 +vt 0.9375 0.9063 vt 0.9375 0.9375 vt 0.8125 0.9375 -vt 0.8125 0.90625 +vt 0.8125 0.9063 vt 0.9375 0.6875 vt 0.8125 0.6875 vt 0.8125 0.9375 @@ -13520,519 +11993,569 @@ vt 0.9375 0.6875 vt 0.9375 0.9375 vt 0.8125 0.9375 vt 0.9375 0.6875 -vt 0.90625 0.6875 -vt 0.90625 0.9375 +vt 0.9063 0.6875 +vt 0.9063 0.9375 vt 0.9375 0.9375 vt 0.8125 0.9375 -vt 0.84375 0.9375 -vt 0.84375 0.6875 +vt 0.8438 0.9375 +vt 0.8438 0.6875 vt 0.8125 0.6875 vt 0.0625 0.825 vt 0.175 0.9375 vt 0.175 0.5625 vt 0.0625 0.675 -vt 0.1749990625 0.5624984375 -vt 0.0625 0.6749974999999999 -vt 0.0625025 0.8249984375 -vt 0.1749990625 0.9375 +vt 0.175 0.5625 +vt 0.0625 0.675 +vt 0.0625 0.825 +vt 0.175 0.9375 vt 0.0625 0.8125 -vt 0.09375 0.8125 -vt 0.09375 0.6875 +vt 0.0938 0.8125 +vt 0.0938 0.6875 vt 0.0625 0.6875 vt 0.0625 0.8125 -vt 0.09375 0.8125 -vt 0.09375 0.6875 +vt 0.0938 0.8125 +vt 0.0938 0.6875 vt 0.0625 0.6875 vt 0.0625 0.8125 -vt 0.09375 0.8125 -vt 0.09375 0.6875 +vt 0.0938 0.8125 +vt 0.0938 0.6875 vt 0.0625 0.6875 -vt 0.3250040625 0.5624984375 -vt 0.175 0.5624984375 +vt 0.325 0.5625 +vt 0.175 0.5625 vt 0.175 0.9375 -vt 0.3250040625 0.9375 +vt 0.325 0.9375 vt 0.175 0.9375 vt 0.325 0.9375 vt 0.325 0.5625 vt 0.175 0.5625 vt 0.0625 0.8125 -vt 0.09375 0.8125 -vt 0.09375 0.6875 +vt 0.0938 0.8125 +vt 0.0938 0.6875 vt 0.0625 0.6875 vt 0.0625 0.8125 -vt 0.09375 0.8125 -vt 0.09375 0.6875 +vt 0.0938 0.8125 +vt 0.0938 0.6875 vt 0.0625 0.6875 -vt 0.4374990625 0.6749974999999999 -vt 0.325 0.5624984375 +vt 0.4375 0.675 +vt 0.325 0.5625 vt 0.325 0.9375 -vt 0.4374990625 0.82500125 +vt 0.4375 0.825 vt 0.325 0.9375 vt 0.4375 0.825 vt 0.4375 0.675 vt 0.325 0.5625 vt 0.0625 0.8125 -vt 0.09375 0.8125 -vt 0.09375 0.6875 +vt 0.0938 0.8125 +vt 0.0938 0.6875 vt 0.0625 0.6875 vt 0.0625 0.8125 -vt 0.09375 0.8125 -vt 0.09375 0.6875 +vt 0.0938 0.8125 +vt 0.0938 0.6875 vt 0.0625 0.6875 vt 0.0625 0.8125 -vt 0.09375 0.8125 -vt 0.09375 0.6875 +vt 0.0938 0.8125 +vt 0.0938 0.6875 vt 0.0625 0.6875 vt 0.0625 0.825 vt 0.175 0.9375 vt 0.175 0.5625 vt 0.0625 0.675 -vt 0.1749990625 0.5624984375 -vt 0.0625 0.6749974999999999 -vt 0.0625025 0.8249984375 -vt 0.1749990625 0.9375 +vt 0.175 0.5625 +vt 0.0625 0.675 +vt 0.0625 0.825 +vt 0.175 0.9375 vt 0.0625 0.8125 -vt 0.09375 0.8125 -vt 0.09375 0.6875 +vt 0.0938 0.8125 +vt 0.0938 0.6875 vt 0.0625 0.6875 vt 0.0625 0.8125 -vt 0.09375 0.8125 -vt 0.09375 0.6875 +vt 0.0938 0.8125 +vt 0.0938 0.6875 vt 0.0625 0.6875 vt 0.0625 0.8125 -vt 0.09375 0.8125 -vt 0.09375 0.6875 +vt 0.0938 0.8125 +vt 0.0938 0.6875 vt 0.0625 0.6875 -vt 0.3250040625 0.5624984375 -vt 0.175 0.5624984375 +vt 0.325 0.5625 +vt 0.175 0.5625 vt 0.175 0.9375 -vt 0.3250040625 0.9375 +vt 0.325 0.9375 vt 0.175 0.9375 vt 0.325 0.9375 vt 0.325 0.5625 vt 0.175 0.5625 vt 0.0625 0.8125 -vt 0.09375 0.8125 -vt 0.09375 0.6875 +vt 0.0938 0.8125 +vt 0.0938 0.6875 vt 0.0625 0.6875 vt 0.0625 0.8125 -vt 0.09375 0.8125 -vt 0.09375 0.6875 +vt 0.0938 0.8125 +vt 0.0938 0.6875 vt 0.0625 0.6875 -vt 0.4374990625 0.6749974999999999 -vt 0.325 0.5624984375 +vt 0.4375 0.675 +vt 0.325 0.5625 vt 0.325 0.9375 -vt 0.4374990625 0.82500125 +vt 0.4375 0.825 vt 0.325 0.9375 vt 0.4375 0.825 vt 0.4375 0.675 vt 0.325 0.5625 vt 0.0625 0.8125 -vt 0.09375 0.8125 -vt 0.09375 0.6875 +vt 0.0938 0.8125 +vt 0.0938 0.6875 vt 0.0625 0.6875 vt 0.0625 0.8125 -vt 0.09375 0.8125 -vt 0.09375 0.6875 +vt 0.0938 0.8125 +vt 0.0938 0.6875 vt 0.0625 0.6875 vt 0.0625 0.8125 -vt 0.09375 0.8125 -vt 0.09375 0.6875 +vt 0.0938 0.8125 +vt 0.0938 0.6875 vt 0.0625 0.6875 -vt 0.53125 0.9375 -vt 0.71875 0.9375 -vt 0.71875 0.75 -vt 0.53125 0.75 +vt 0.5313 0.9375 +vt 0.7188 0.9375 +vt 0.7188 0.75 +vt 0.5313 0.75 vt 0.5625 0.75 -vt 0.53125 0.75 -vt 0.53125 0.9375 +vt 0.5313 0.75 +vt 0.5313 0.9375 vt 0.5625 0.9375 vt 0.6875 0.9375 -vt 0.71875 0.9375 -vt 0.71875 0.75 +vt 0.7188 0.9375 +vt 0.7188 0.75 vt 0.6875 0.75 -vt 0.53125 0.9375 +vt 0.5313 0.9375 vt 0.5625 0.9375 vt 0.5625 0.75 -vt 0.53125 0.75 +vt 0.5313 0.75 vt 0.6875 0.9375 -vt 0.71875 0.9375 -vt 0.71875 0.75 +vt 0.7188 0.9375 +vt 0.7188 0.75 vt 0.6875 0.75 -vt 0.71875 0.75 -vt 0.71875 0.9375 -vt 0.53125 0.9375 -vt 0.53125 0.75 -vt 0.53125 0.9375 -vt 0.53125 0.75 +vt 0.7188 0.75 +vt 0.7188 0.9375 +vt 0.5313 0.9375 +vt 0.5313 0.75 +vt 0.5313 0.9375 +vt 0.5313 0.75 vt 0.5625 0.75 vt 0.5625 0.9375 -vt 0.71875 0.75 -vt 0.71875 0.9375 +vt 0.7188 0.75 +vt 0.7188 0.9375 vt 0.6875 0.9375 vt 0.6875 0.75 vt 0.5625 0.75 vt 0.5625 0.9375 -vt 0.53125 0.9375 -vt 0.53125 0.75 -vt 0.71875 0.75 -vt 0.71875 0.9375 +vt 0.5313 0.9375 +vt 0.5313 0.75 +vt 0.7188 0.75 +vt 0.7188 0.9375 vt 0.6875 0.9375 vt 0.6875 0.75 -vn -8.659560562354933e-17 1 1.1102230246251565e-16 -vn 8.659560562354933e-17 -1 -1.1102230246251565e-16 -vn -8.65956056235493e-17 -1.1102230246251565e-16 1 -vn 8.65956056235493e-17 1.1102230246251565e-16 -1 -vn -1 -8.65956056235493e-17 -8.659560562354932e-17 -vn 1 8.65956056235493e-17 8.659560562354932e-17 -vn 1.224646799147353e-16 -0.7071067811865475 -0.7071067811865476 -vn -1.224646799147353e-16 0.7071067811865475 0.7071067811865476 -vn -1.232595164407831e-32 0.7071067811865476 -0.7071067811865475 -vn 1.232595164407831e-32 -0.7071067811865476 0.7071067811865475 -vn -1 -8.65956056235493e-17 -8.659560562354932e-17 -vn 1 8.65956056235493e-17 8.659560562354932e-17 -vn -1.232595164407831e-32 0.7071067811865476 -0.7071067811865475 -vn 1.232595164407831e-32 -0.7071067811865476 0.7071067811865475 -vn 1.224646799147353e-16 -0.7071067811865475 -0.7071067811865476 -vn -1.224646799147353e-16 0.7071067811865475 0.7071067811865476 -vn -1 -8.65956056235493e-17 -8.659560562354932e-17 -vn 1 8.65956056235493e-17 8.659560562354932e-17 -vn -1.224646799147353e-16 0.7071067811865475 0.7071067811865476 -vn 1.224646799147353e-16 -0.7071067811865475 -0.7071067811865476 -vn 1.232595164407831e-32 -0.7071067811865476 0.7071067811865475 -vn -1.232595164407831e-32 0.7071067811865476 -0.7071067811865475 -vn -1 -8.65956056235493e-17 -8.659560562354932e-17 -vn 1 8.65956056235493e-17 8.659560562354932e-17 -vn 1.232595164407831e-32 -0.7071067811865476 0.7071067811865475 -vn -1.232595164407831e-32 0.7071067811865476 -0.7071067811865475 -vn -1.224646799147353e-16 0.7071067811865475 0.7071067811865476 -vn 1.224646799147353e-16 -0.7071067811865475 -0.7071067811865476 -vn -1 -8.65956056235493e-17 -8.659560562354932e-17 -vn 1 8.65956056235493e-17 8.659560562354932e-17 -vn 8.65956056235493e-17 1.1102230246251565e-16 -1 -vn -8.659560562354932e-17 -1.1102230246251568e-16 1 -vn -8.659560562354932e-17 1 -2.775557561562892e-16 -vn 8.659560562354934e-17 -1 -3.3306690738754696e-16 -vn -1 -8.65956056235493e-17 -8.659560562354932e-17 -vn 1 8.65956056235493e-17 8.659560562354932e-17 -vn -8.659560562354933e-17 1 1.1102230246251565e-16 -vn 8.659560562354934e-17 -1 -1.1102230246251568e-16 -vn 8.659560562354927e-17 3.3306690738754696e-16 -1 -vn -8.659560562354934e-17 2.775557561562892e-16 1 -vn -1 -8.65956056235493e-17 -8.659560562354932e-17 -vn 1 8.65956056235493e-17 8.659560562354932e-17 -vn -8.65956056235493e-17 -1.1102230246251565e-16 1 -vn 8.659560562354932e-17 1.1102230246251568e-16 -1 -vn 8.659560562354932e-17 -1 2.775557561562892e-16 -vn -8.659560562354934e-17 1 3.3306690738754696e-16 -vn -1 -8.65956056235493e-17 -8.659560562354932e-17 -vn 1 8.65956056235493e-17 8.659560562354932e-17 -vn 8.659560562354933e-17 -1 -1.1102230246251565e-16 -vn -8.659560562354934e-17 1 1.1102230246251568e-16 -vn -8.659560562354927e-17 -3.3306690738754696e-16 1 -vn 8.659560562354934e-17 -2.775557561562892e-16 -1 -vn 1 8.65956056235493e-17 8.659560562354932e-17 -vn -1 -8.65956056235493e-17 -8.659560562354932e-17 -vn -1.232595164407831e-32 0.7071067811865476 -0.7071067811865475 -vn 1.224646799147353e-16 -0.7071067811865475 -0.7071067811865476 -vn 8.659560562354932e-17 1.1102230246251568e-16 -1 -vn -1 -8.65956056235493e-17 -8.659560562354932e-17 -vn 1 8.65956056235493e-17 8.659560562354932e-17 -vn -8.659560562354934e-17 1 1.1102230246251568e-16 -vn 8.659560562354934e-17 -1 -1.1102230246251568e-16 -vn -1 -8.65956056235493e-17 -8.659560562354932e-17 -vn 1 8.65956056235493e-17 8.659560562354932e-17 -vn -1.224646799147353e-16 0.7071067811865475 0.7071067811865476 -vn 1.232595164407831e-32 -0.7071067811865476 0.7071067811865475 -vn -8.659560562354932e-17 -1.1102230246251568e-16 1 -vn 1 8.65956056235493e-17 8.659560562354932e-17 -vn -1 -8.65956056235493e-17 -8.659560562354932e-17 -vn -1.232595164407831e-32 0.7071067811865476 -0.7071067811865475 -vn 1.224646799147353e-16 -0.7071067811865475 -0.7071067811865476 -vn 8.659560562354932e-17 1.1102230246251568e-16 -1 -vn -1 -8.65956056235493e-17 -8.659560562354932e-17 -vn 1 8.65956056235493e-17 8.659560562354932e-17 -vn -8.659560562354934e-17 1 1.1102230246251568e-16 -vn 8.659560562354934e-17 -1 -1.1102230246251568e-16 -vn -1 -8.65956056235493e-17 -8.659560562354932e-17 -vn 1 8.65956056235493e-17 8.659560562354932e-17 -vn -1.224646799147353e-16 0.7071067811865475 0.7071067811865476 -vn 1.232595164407831e-32 -0.7071067811865476 0.7071067811865475 -vn -8.659560562354932e-17 -1.1102230246251568e-16 1 -vn -1 -8.65956056235493e-17 -8.659560562354932e-17 -vn -8.659560562354933e-17 1 1.1102230246251565e-16 -vn 8.659560562354933e-17 -1 -1.1102230246251565e-16 -vn -8.65956056235493e-17 -1.1102230246251565e-16 1 -vn 8.65956056235493e-17 1.1102230246251565e-16 -1 -vn 1 8.65956056235493e-17 8.659560562354932e-17 -vn -8.659560562354933e-17 1 1.1102230246251565e-16 -vn 8.659560562354933e-17 -1 -1.1102230246251565e-16 -vn -8.65956056235493e-17 -1.1102230246251565e-16 1 -vn 8.65956056235493e-17 1.1102230246251565e-16 -1 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn -1 0 0 +vn 1 0 0 +vn 0 -0.71 -0.71 +vn 0 0.71 0.71 +vn 0 0.71 -0.71 +vn 0 -0.71 0.71 +vn -1 0 0 +vn 1 0 0 +vn 0 0.71 -0.71 +vn 0 -0.71 0.71 +vn 0 -0.71 -0.71 +vn 0 0.71 0.71 +vn -1 0 0 +vn 1 0 0 +vn 0 0.71 0.71 +vn 0 -0.71 -0.71 +vn 0 -0.71 0.71 +vn 0 0.71 -0.71 +vn -1 0 0 +vn 1 0 0 +vn 0 -0.71 0.71 +vn 0 0.71 -0.71 +vn 0 0.71 0.71 +vn 0 -0.71 -0.71 +vn -1 0 0 +vn 1 0 0 +vn 0 0 -1 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 -1 0 +vn 0 1 0 +vn -1 0 0 +vn 1 0 0 +vn 0 -1 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 0.71 -0.71 +vn 0 -0.71 -0.71 +vn 0 0 -1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn -1 0 0 +vn 1 0 0 +vn 0 0.71 0.71 +vn 0 -0.71 0.71 +vn 0 0 1 +vn 1 0 0 +vn -1 0 0 +vn 0 0.71 -0.71 +vn 0 -0.71 -0.71 +vn 0 0 -1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn -1 0 0 +vn 1 0 0 +vn 0 0.71 0.71 +vn 0 -0.71 0.71 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 usemtl tracks14_12 -f 2206/6105/1527 2202/6106/1527 2201/6107/1527 -f 2206/6105/1527 2201/6107/1527 2205/6108/1527 -f 2207/6109/1528 2203/6110/1528 2204/6111/1528 -f 2207/6109/1528 2204/6111/1528 2208/6112/1528 -f 2205/6113/1529 2201/6114/1529 2203/6115/1529 -f 2205/6113/1529 2203/6115/1529 2207/6116/1529 -f 2202/6117/1530 2206/6118/1530 2208/6119/1530 -f 2202/6117/1530 2208/6119/1530 2204/6120/1530 -f 2209/6121/1531 2210/6122/1531 2212/6123/1531 -f 2209/6121/1531 2212/6123/1531 2211/6124/1531 -f 2214/6125/1532 2213/6126/1532 2215/6127/1532 -f 2214/6125/1532 2215/6127/1532 2216/6128/1532 -f 2214/6129/1533 2210/6130/1533 2209/6131/1533 -f 2214/6129/1533 2209/6131/1533 2213/6132/1533 -f 2215/6133/1534 2211/6134/1534 2212/6135/1534 -f 2215/6133/1534 2212/6135/1534 2216/6136/1534 -f 2213/6137/1535 2209/6138/1535 2211/6139/1535 -f 2213/6137/1535 2211/6139/1535 2215/6140/1535 -f 2210/6141/1536 2214/6142/1536 2216/6143/1536 -f 2210/6141/1536 2216/6143/1536 2212/6144/1536 -f 2220/6145/1537 2218/6146/1537 2217/6147/1537 -f 2220/6145/1537 2217/6147/1537 2219/6148/1537 -f 2223/6149/1538 2221/6150/1538 2222/6151/1538 -f 2223/6149/1538 2222/6151/1538 2224/6152/1538 -f 2217/6153/1539 2218/6154/1539 2222/6155/1539 -f 2217/6153/1539 2222/6155/1539 2221/6156/1539 -f 2220/6157/1540 2219/6158/1540 2223/6159/1540 -f 2220/6157/1540 2223/6159/1540 2224/6160/1540 -f 2219/6161/1541 2217/6162/1541 2221/6163/1541 -f 2219/6161/1541 2221/6163/1541 2223/6164/1541 -f 2224/6165/1542 2222/6166/1542 2218/6167/1542 -f 2224/6165/1542 2218/6167/1542 2220/6168/1542 -f 2225/6169/1543 2226/6170/1543 2228/6171/1543 -f 2225/6169/1543 2228/6171/1543 2227/6172/1543 -f 2230/6173/1544 2229/6174/1544 2231/6175/1544 -f 2230/6173/1544 2231/6175/1544 2232/6176/1544 -f 2230/6177/1545 2226/6178/1545 2225/6179/1545 -f 2230/6177/1545 2225/6179/1545 2229/6180/1545 -f 2231/6181/1546 2227/6182/1546 2228/6183/1546 -f 2231/6181/1546 2228/6183/1546 2232/6184/1546 -f 2229/6185/1547 2225/6186/1547 2227/6187/1547 -f 2229/6185/1547 2227/6187/1547 2231/6188/1547 -f 2226/6189/1548 2230/6190/1548 2232/6191/1548 -f 2226/6189/1548 2232/6191/1548 2228/6192/1548 -f 2236/6193/1549 2234/6194/1549 2233/6195/1549 -f 2236/6193/1549 2233/6195/1549 2235/6196/1549 -f 2239/6197/1550 2237/6198/1550 2238/6199/1550 -f 2239/6197/1550 2238/6199/1550 2240/6200/1550 -f 2233/6201/1551 2234/6202/1551 2238/6203/1551 -f 2233/6201/1551 2238/6203/1551 2237/6204/1551 -f 2236/6205/1552 2235/6206/1552 2239/6207/1552 -f 2236/6205/1552 2239/6207/1552 2240/6208/1552 -f 2235/6209/1553 2233/6210/1553 2237/6211/1553 -f 2235/6209/1553 2237/6211/1553 2239/6212/1553 -f 2240/6213/1554 2238/6214/1554 2234/6215/1554 -f 2240/6213/1554 2234/6215/1554 2236/6216/1554 -f 2241/6217/1555 2242/6218/1555 2244/6219/1555 -f 2241/6217/1555 2244/6219/1555 2243/6220/1555 -f 2246/6221/1556 2245/6222/1556 2247/6223/1556 -f 2246/6221/1556 2247/6223/1556 2248/6224/1556 -f 2246/6225/1557 2242/6226/1557 2241/6227/1557 -f 2246/6225/1557 2241/6227/1557 2245/6228/1557 -f 2247/6229/1558 2243/6230/1558 2244/6231/1558 -f 2247/6229/1558 2244/6231/1558 2248/6232/1558 -f 2245/6233/1559 2241/6234/1559 2243/6235/1559 -f 2245/6233/1559 2243/6235/1559 2247/6236/1559 -f 2242/6237/1560 2246/6238/1560 2248/6239/1560 -f 2242/6237/1560 2248/6239/1560 2244/6240/1560 -f 2252/6241/1561 2250/6242/1561 2249/6243/1561 -f 2252/6241/1561 2249/6243/1561 2251/6244/1561 -f 2255/6245/1562 2253/6246/1562 2254/6247/1562 -f 2255/6245/1562 2254/6247/1562 2256/6248/1562 -f 2249/6249/1563 2250/6250/1563 2254/6251/1563 -f 2249/6249/1563 2254/6251/1563 2253/6252/1563 -f 2252/6253/1564 2251/6254/1564 2255/6255/1564 -f 2252/6253/1564 2255/6255/1564 2256/6256/1564 -f 2251/6257/1565 2249/6258/1565 2253/6259/1565 -f 2251/6257/1565 2253/6259/1565 2255/6260/1565 -f 2256/6261/1566 2254/6262/1566 2250/6263/1566 -f 2256/6261/1566 2250/6263/1566 2252/6264/1566 -f 2257/6265/1567 2258/6266/1567 2260/6267/1567 -f 2257/6265/1567 2260/6267/1567 2259/6268/1567 -f 2262/6269/1568 2261/6270/1568 2263/6271/1568 -f 2262/6269/1568 2263/6271/1568 2264/6272/1568 -f 2262/6273/1569 2258/6274/1569 2257/6275/1569 -f 2262/6273/1569 2257/6275/1569 2261/6276/1569 -f 2263/6277/1570 2259/6278/1570 2260/6279/1570 -f 2263/6277/1570 2260/6279/1570 2264/6280/1570 -f 2261/6281/1571 2257/6282/1571 2259/6283/1571 -f 2261/6281/1571 2259/6283/1571 2263/6284/1571 -f 2258/6285/1572 2262/6286/1572 2264/6287/1572 -f 2258/6285/1572 2264/6287/1572 2260/6288/1572 -f 2268/6289/1573 2266/6290/1573 2265/6291/1573 -f 2268/6289/1573 2265/6291/1573 2267/6292/1573 -f 2271/6293/1574 2269/6294/1574 2270/6295/1574 -f 2271/6293/1574 2270/6295/1574 2272/6296/1574 -f 2265/6297/1575 2266/6298/1575 2270/6299/1575 -f 2265/6297/1575 2270/6299/1575 2269/6300/1575 -f 2268/6301/1576 2267/6302/1576 2271/6303/1576 -f 2268/6301/1576 2271/6303/1576 2272/6304/1576 -f 2267/6305/1577 2265/6306/1577 2269/6307/1577 -f 2267/6305/1577 2269/6307/1577 2271/6308/1577 -f 2272/6309/1578 2270/6310/1578 2266/6311/1578 -f 2272/6309/1578 2266/6311/1578 2268/6312/1578 -f 2273/6313/1579 2274/6314/1579 2276/6315/1579 -f 2273/6313/1579 2276/6315/1579 2275/6316/1579 -f 2278/6317/1580 2277/6318/1580 2279/6319/1580 -f 2278/6317/1580 2279/6319/1580 2280/6320/1580 -f 2278/6321/1581 2274/6322/1581 2273/6323/1581 -f 2278/6321/1581 2273/6323/1581 2277/6324/1581 -f 2279/6325/1582 2275/6326/1582 2276/6327/1582 -f 2279/6325/1582 2276/6327/1582 2280/6328/1582 -f 2277/6329/1583 2273/6330/1583 2275/6331/1583 -f 2277/6329/1583 2275/6331/1583 2279/6332/1583 -f 2281/6333/1584 2282/6334/1584 2284/6335/1584 -f 2281/6333/1584 2284/6335/1584 2283/6336/1584 -f 2286/6337/1585 2285/6338/1585 2287/6339/1585 -f 2286/6337/1585 2287/6339/1585 2288/6340/1585 -f 2286/6341/1586 2282/6342/1586 2281/6343/1586 -f 2286/6341/1586 2281/6343/1586 2285/6344/1586 -f 2287/6345/1587 2283/6346/1587 2284/6347/1587 -f 2287/6345/1587 2284/6347/1587 2288/6348/1587 -f 2289/6349/1588 2290/6350/1588 2292/6351/1588 -f 2289/6349/1588 2292/6351/1588 2291/6352/1588 -f 2294/6353/1589 2293/6354/1589 2295/6355/1589 -f 2294/6353/1589 2295/6355/1589 2296/6356/1589 -f 2294/6357/1590 2290/6358/1590 2289/6359/1590 -f 2294/6357/1590 2289/6359/1590 2293/6360/1590 -f 2295/6361/1591 2291/6362/1591 2292/6363/1591 -f 2295/6361/1591 2292/6363/1591 2296/6364/1591 -f 2293/6365/1592 2289/6366/1592 2291/6367/1592 -f 2293/6365/1592 2291/6367/1592 2295/6368/1592 -f 2297/6369/1593 2298/6370/1593 2300/6371/1593 -f 2297/6369/1593 2300/6371/1593 2299/6372/1593 -f 2302/6373/1594 2301/6374/1594 2303/6375/1594 -f 2302/6373/1594 2303/6375/1594 2304/6376/1594 -f 2302/6377/1595 2298/6378/1595 2297/6379/1595 -f 2302/6377/1595 2297/6379/1595 2301/6380/1595 -f 2303/6381/1596 2299/6382/1596 2300/6383/1596 -f 2303/6381/1596 2300/6383/1596 2304/6384/1596 -f 2301/6385/1597 2297/6386/1597 2299/6387/1597 -f 2301/6385/1597 2299/6387/1597 2303/6388/1597 -f 2305/6389/1598 2306/6390/1598 2308/6391/1598 -f 2305/6389/1598 2308/6391/1598 2307/6392/1598 -f 2310/6393/1599 2309/6394/1599 2311/6395/1599 -f 2310/6393/1599 2311/6395/1599 2312/6396/1599 -f 2310/6397/1600 2306/6398/1600 2305/6399/1600 -f 2310/6397/1600 2305/6399/1600 2309/6400/1600 -f 2311/6401/1601 2307/6402/1601 2308/6403/1601 -f 2311/6401/1601 2308/6403/1601 2312/6404/1601 -f 2313/6405/1602 2314/6406/1602 2316/6407/1602 -f 2313/6405/1602 2316/6407/1602 2315/6408/1602 -f 2318/6409/1603 2317/6410/1603 2319/6411/1603 -f 2318/6409/1603 2319/6411/1603 2320/6412/1603 -f 2318/6413/1604 2314/6414/1604 2313/6415/1604 -f 2318/6413/1604 2313/6415/1604 2317/6416/1604 -f 2319/6417/1605 2315/6418/1605 2316/6419/1605 -f 2319/6417/1605 2316/6419/1605 2320/6420/1605 -f 2317/6421/1606 2313/6422/1606 2315/6423/1606 -f 2317/6421/1606 2315/6423/1606 2319/6424/1606 -f 2321/6425/1607 2322/6426/1607 2324/6427/1607 -f 2321/6425/1607 2324/6427/1607 2323/6428/1607 -f 2326/6429/1608 2322/6430/1608 2321/6431/1608 -f 2326/6429/1608 2321/6431/1608 2325/6432/1608 -f 2327/6433/1609 2323/6434/1609 2324/6435/1609 -f 2327/6433/1609 2324/6435/1609 2328/6436/1609 -f 2325/6437/1610 2321/6438/1610 2323/6439/1610 -f 2325/6437/1610 2323/6439/1610 2327/6440/1610 -f 2322/6441/1611 2326/6442/1611 2328/6443/1611 -f 2322/6441/1611 2328/6443/1611 2324/6444/1611 -f 2332/6445/1612 2330/6446/1612 2329/6447/1612 -f 2332/6445/1612 2329/6447/1612 2331/6448/1612 -f 2329/6449/1613 2330/6450/1613 2334/6451/1613 -f 2329/6449/1613 2334/6451/1613 2333/6452/1613 -f 2332/6453/1614 2331/6454/1614 2335/6455/1614 -f 2332/6453/1614 2335/6455/1614 2336/6456/1614 -f 2331/6457/1615 2329/6458/1615 2333/6459/1615 -f 2331/6457/1615 2333/6459/1615 2335/6460/1615 -f 2336/6461/1616 2334/6462/1616 2330/6463/1616 -f 2336/6461/1616 2330/6463/1616 2332/6464/1616 +f 2206/6105/1527 2202/6106/1527 2201/6107/1527 2205/6108/1527 +f 2207/6109/1528 2203/6110/1528 2204/6111/1528 2208/6112/1528 +f 2205/6113/1529 2201/6114/1529 2203/6115/1529 2207/6116/1529 +f 2202/6117/1530 2206/6118/1530 2208/6119/1530 2204/6120/1530 +f 2209/6121/1531 2210/6122/1531 2212/6123/1531 2211/6124/1531 +f 2214/6125/1532 2213/6126/1532 2215/6127/1532 2216/6128/1532 +f 2214/6129/1533 2210/6130/1533 2209/6131/1533 2213/6132/1533 +f 2215/6133/1534 2211/6134/1534 2212/6135/1534 2216/6136/1534 +f 2213/6137/1535 2209/6138/1535 2211/6139/1535 2215/6140/1535 +f 2210/6141/1536 2214/6142/1536 2216/6143/1536 2212/6144/1536 +f 2220/6145/1537 2218/6146/1537 2217/6147/1537 2219/6148/1537 +f 2223/6149/1538 2221/6150/1538 2222/6151/1538 2224/6152/1538 +f 2217/6153/1539 2218/6154/1539 2222/6155/1539 2221/6156/1539 +f 2220/6157/1540 2219/6158/1540 2223/6159/1540 2224/6160/1540 +f 2219/6161/1541 2217/6162/1541 2221/6163/1541 2223/6164/1541 +f 2224/6165/1542 2222/6166/1542 2218/6167/1542 2220/6168/1542 +f 2225/6169/1543 2226/6170/1543 2228/6171/1543 2227/6172/1543 +f 2230/6173/1544 2229/6174/1544 2231/6175/1544 2232/6176/1544 +f 2230/6177/1545 2226/6178/1545 2225/6179/1545 2229/6180/1545 +f 2231/6181/1546 2227/6182/1546 2228/6183/1546 2232/6184/1546 +f 2229/6185/1547 2225/6186/1547 2227/6187/1547 2231/6188/1547 +f 2226/6189/1548 2230/6190/1548 2232/6191/1548 2228/6192/1548 +f 2236/6193/1549 2234/6194/1549 2233/6195/1549 2235/6196/1549 +f 2239/6197/1550 2237/6198/1550 2238/6199/1550 2240/6200/1550 +f 2233/6201/1551 2234/6202/1551 2238/6203/1551 2237/6204/1551 +f 2236/6205/1552 2235/6206/1552 2239/6207/1552 2240/6208/1552 +f 2235/6209/1553 2233/6210/1553 2237/6211/1553 2239/6212/1553 +f 2240/6213/1554 2238/6214/1554 2234/6215/1554 2236/6216/1554 +f 2241/6217/1555 2242/6218/1555 2244/6219/1555 2243/6220/1555 +f 2246/6221/1556 2245/6222/1556 2247/6223/1556 2248/6224/1556 +f 2246/6225/1557 2242/6226/1557 2241/6227/1557 2245/6228/1557 +f 2247/6229/1558 2243/6230/1558 2244/6231/1558 2248/6232/1558 +f 2245/6233/1559 2241/6234/1559 2243/6235/1559 2247/6236/1559 +f 2242/6237/1560 2246/6238/1560 2248/6239/1560 2244/6240/1560 +f 2252/6241/1561 2250/6242/1561 2249/6243/1561 2251/6244/1561 +f 2255/6245/1562 2253/6246/1562 2254/6247/1562 2256/6248/1562 +f 2249/6249/1563 2250/6250/1563 2254/6251/1563 2253/6252/1563 +f 2252/6253/1564 2251/6254/1564 2255/6255/1564 2256/6256/1564 +f 2251/6257/1565 2249/6258/1565 2253/6259/1565 2255/6260/1565 +f 2256/6261/1566 2254/6262/1566 2250/6263/1566 2252/6264/1566 +f 2257/6265/1567 2258/6266/1567 2260/6267/1567 2259/6268/1567 +f 2262/6269/1568 2261/6270/1568 2263/6271/1568 2264/6272/1568 +f 2262/6273/1569 2258/6274/1569 2257/6275/1569 2261/6276/1569 +f 2263/6277/1570 2259/6278/1570 2260/6279/1570 2264/6280/1570 +f 2261/6281/1571 2257/6282/1571 2259/6283/1571 2263/6284/1571 +f 2258/6285/1572 2262/6286/1572 2264/6287/1572 2260/6288/1572 +f 2268/6289/1573 2266/6290/1573 2265/6291/1573 2267/6292/1573 +f 2271/6293/1574 2269/6294/1574 2270/6295/1574 2272/6296/1574 +f 2265/6297/1575 2266/6298/1575 2270/6299/1575 2269/6300/1575 +f 2268/6301/1576 2267/6302/1576 2271/6303/1576 2272/6304/1576 +f 2267/6305/1577 2265/6306/1577 2269/6307/1577 2271/6308/1577 +f 2272/6309/1578 2270/6310/1578 2266/6311/1578 2268/6312/1578 +f 2273/6313/1579 2274/6314/1579 2276/6315/1579 2275/6316/1579 +f 2278/6317/1580 2277/6318/1580 2279/6319/1580 2280/6320/1580 +f 2278/6321/1581 2274/6322/1581 2273/6323/1581 2277/6324/1581 +f 2279/6325/1582 2275/6326/1582 2276/6327/1582 2280/6328/1582 +f 2277/6329/1583 2273/6330/1583 2275/6331/1583 2279/6332/1583 +f 2281/6333/1584 2282/6334/1584 2284/6335/1584 2283/6336/1584 +f 2286/6337/1585 2285/6338/1585 2287/6339/1585 2288/6340/1585 +f 2286/6341/1586 2282/6342/1586 2281/6343/1586 2285/6344/1586 +f 2287/6345/1587 2283/6346/1587 2284/6347/1587 2288/6348/1587 +f 2289/6349/1588 2290/6350/1588 2292/6351/1588 2291/6352/1588 +f 2294/6353/1589 2293/6354/1589 2295/6355/1589 2296/6356/1589 +f 2294/6357/1590 2290/6358/1590 2289/6359/1590 2293/6360/1590 +f 2295/6361/1591 2291/6362/1591 2292/6363/1591 2296/6364/1591 +f 2293/6365/1592 2289/6366/1592 2291/6367/1592 2295/6368/1592 +f 2297/6369/1593 2298/6370/1593 2300/6371/1593 2299/6372/1593 +f 2302/6373/1594 2301/6374/1594 2303/6375/1594 2304/6376/1594 +f 2302/6377/1595 2298/6378/1595 2297/6379/1595 2301/6380/1595 +f 2303/6381/1596 2299/6382/1596 2300/6383/1596 2304/6384/1596 +f 2301/6385/1597 2297/6386/1597 2299/6387/1597 2303/6388/1597 +f 2305/6389/1598 2306/6390/1598 2308/6391/1598 2307/6392/1598 +f 2310/6393/1599 2309/6394/1599 2311/6395/1599 2312/6396/1599 +f 2310/6397/1600 2306/6398/1600 2305/6399/1600 2309/6400/1600 +f 2311/6401/1601 2307/6402/1601 2308/6403/1601 2312/6404/1601 +f 2313/6405/1602 2314/6406/1602 2316/6407/1602 2315/6408/1602 +f 2318/6409/1603 2317/6410/1603 2319/6411/1603 2320/6412/1603 +f 2318/6413/1604 2314/6414/1604 2313/6415/1604 2317/6416/1604 +f 2319/6417/1605 2315/6418/1605 2316/6419/1605 2320/6420/1605 +f 2317/6421/1606 2313/6422/1606 2315/6423/1606 2319/6424/1606 +f 2321/6425/1607 2322/6426/1607 2324/6427/1607 2323/6428/1607 +f 2326/6429/1608 2322/6430/1608 2321/6431/1608 2325/6432/1608 +f 2327/6433/1609 2323/6434/1609 2324/6435/1609 2328/6436/1609 +f 2325/6437/1610 2321/6438/1610 2323/6439/1610 2327/6440/1610 +f 2322/6441/1611 2326/6442/1611 2328/6443/1611 2324/6444/1611 +f 2332/6445/1612 2330/6446/1612 2329/6447/1612 2331/6448/1612 +f 2329/6449/1613 2330/6450/1613 2334/6451/1613 2333/6452/1613 +f 2332/6453/1614 2331/6454/1614 2335/6455/1614 2336/6456/1614 +f 2331/6457/1615 2329/6458/1615 2333/6459/1615 2335/6460/1615 +f 2336/6461/1616 2334/6462/1616 2330/6463/1616 2332/6464/1616 +o wheel_right1 +v 1 0.6246 0.6542 +v 1 0.6246 0.2801 +v 1 0.2504 0.6542 +v 1 0.2504 0.2801 +v 0.9583 0.6246 0.6542 +v 0.9583 0.6246 0.2801 +v 0.9583 0.2504 0.6542 +v 0.9583 0.2504 0.2801 +v 0.9583 0.2836 0.8341 +v 0.625 0.2836 0.8341 +v 0.9583 0.5914 0.8341 +v 0.625 0.5914 0.8341 +v 0.9583 0.8091 0.6164 +v 0.625 0.8091 0.6164 +v 0.9583 0.8091 0.3086 +v 0.625 0.8091 0.3086 +v 0.9583 0.5914 0.0909 +v 0.625 0.5914 0.0909 +v 0.9583 0.2836 0.0909 +v 0.625 0.2836 0.0909 +v 0.9583 0.0659 0.3086 +v 0.625 0.0659 0.3086 +v 0.9583 0.0659 0.6164 +v 0.625 0.0659 0.6164 +vt 0.2813 0.2188 +vt 0.2813 0.4063 +vt 0.4688 0.4063 +vt 0.4688 0.2188 +vt 0.4688 0.4063 +vt 0.2813 0.4063 +vt 0.2813 0.375 +vt 0.4688 0.375 +vt 0.4688 0.25 +vt 0.2813 0.25 +vt 0.2813 0.2188 +vt 0.4688 0.2188 +vt 0.2813 0.2188 +vt 0.2813 0.4063 +vt 0.3125 0.4063 +vt 0.3125 0.2188 +vt 0.4375 0.2188 +vt 0.4375 0.4063 +vt 0.4688 0.4063 +vt 0.4688 0.2188 +vt 0 0.2188 +vt 0.1875 0.2188 +vt 0.1875 0.4063 +vt 0 0.4063 +vt 0 0.2188 +vt 0.1875 0.2188 +vt 0.1875 0.4063 +vt 0 0.4063 +vt 0 0.2188 +vt 0.1875 0.2188 +vt 0.1875 0.4063 +vt 0 0.4063 +vt 0 0.2188 +vt 0.1875 0.2188 +vt 0.1875 0.4063 +vt 0 0.4063 +vt 0 0.2188 +vt 0.1875 0.2188 +vt 0.1875 0.4063 +vt 0 0.4063 +vt 0 0.2188 +vt 0.1875 0.2188 +vt 0.1875 0.4063 +vt 0 0.4063 +vt 0 0.2188 +vt 0.1875 0.2188 +vt 0.1875 0.4063 +vt 0 0.4063 +vt 0 0.2188 +vt 0.1875 0.2188 +vt 0.1875 0.4063 +vt 0 0.4063 +vt 0.8438 0.5313 +vt 0.6563 0.5313 +vt 0.5313 0.4063 +vt 0.9688 0.4063 +vt 0.5313 0.4063 +vt 0.5313 0.2188 +vt 0.9688 0.2188 +vt 0.9688 0.4063 +vt 0.5313 0.2188 +vt 0.6563 0.0938 +vt 0.8438 0.0938 +vt 0.9688 0.2188 +vt 0.5313 0.4063 +vt 0.9688 0.4063 +vt 0.8438 0.5313 +vt 0.6563 0.5313 +vt 0.5313 0.4063 +vt 0.5313 0.2188 +vt 0.9688 0.2188 +vt 0.9688 0.4063 +vt 0.8438 0.0938 +vt 0.9688 0.2188 +vt 0.5313 0.2188 +vt 0.6563 0.0938 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 0 1 +vn 0 0.71 0.71 +vn 0 1 0 +vn 0 0.71 -0.71 +vn 0 0 -1 +vn 0 -0.71 -0.71 +vn 0 -1 0 +vn 0 -0.71 0.71 +vn 1 0 0 +vn 1 0 0 +vn 1 0 0 +vn -1 0 0 +vn -1 0 0 +vn -1 0 0 +usemtl tracks16_14 +f 2340/6465/1617 2338/6466/1617 2337/6467/1617 2339/6468/1617 +f 2337/6469/1618 2338/6470/1618 2342/6471/1618 2341/6472/1618 +f 2340/6473/1619 2339/6474/1619 2343/6475/1619 2344/6476/1619 +f 2339/6477/1620 2337/6478/1620 2341/6479/1620 2343/6480/1620 +f 2344/6481/1621 2342/6482/1621 2338/6483/1621 2340/6484/1621 +f 2345/6485/1622 2347/6486/1622 2348/6487/1622 2346/6488/1622 +f 2347/6489/1623 2349/6490/1623 2350/6491/1623 2348/6492/1623 +f 2349/6493/1624 2351/6494/1624 2352/6495/1624 2350/6496/1624 +f 2351/6497/1625 2353/6498/1625 2354/6499/1625 2352/6500/1625 +f 2353/6501/1626 2355/6502/1626 2356/6503/1626 2354/6504/1626 +f 2355/6505/1627 2357/6506/1627 2358/6507/1627 2356/6508/1627 +f 2357/6509/1628 2359/6510/1628 2360/6511/1628 2358/6512/1628 +f 2359/6513/1629 2345/6514/1629 2346/6515/1629 2360/6516/1629 +f 2351/6517/1630 2349/6518/1630 2347/6519/1630 2353/6520/1630 +f 2355/6521/1631 2353/6522/1631 2347/6523/1631 2345/6524/1631 +f 2345/6525/1632 2359/6526/1632 2357/6527/1632 2355/6528/1632 +f 2354/6529/1633 2348/6530/1633 2350/6531/1633 2352/6532/1633 +f 2354/6533/1634 2356/6534/1634 2346/6535/1634 2348/6536/1634 +f 2360/6537/1635 2346/6538/1635 2356/6539/1635 2358/6540/1635 o sspension1 -v 0.625 0.9375 0.59375 -v 0.625 0.9375 0.34375 -v 0.625 0.3125 0.59375 -v 0.625 0.3125 0.34375 -v 0.5625 0.9375 0.59375 -v 0.5625 0.9375 0.34375 -v 0.5625 0.3125 0.59375 -v 0.5625 0.3125 0.34375 -v 0.625 0.9375 0.46875 -v 0.625 0.3125 0.46875 -v 0.5625 0.3125 0.46875 -v 0.5625 0.9375 0.46875 -v 0.625 0.625 0.46875 -v 0.625 0.625 0.34375 -v 0.5625 0.625 0.34375 -v 0.5625 0.625 0.46875 -v 0.5625 0.625 0.59375 -v 0.625 0.625 0.59375 -vt 0.796875 0.25 -vt 0.796875 0.328125 -vt 0.765625 0.328125 -vt 0.765625 0.25 +v 0.625 0.9375 0.5938 +v 0.625 0.9375 0.3438 +v 0.625 0.3125 0.5938 +v 0.625 0.3125 0.3438 +v 0.5625 0.9375 0.5938 +v 0.5625 0.9375 0.3438 +v 0.5625 0.3125 0.5938 +v 0.5625 0.3125 0.3438 +v 0.625 0.9375 0.4688 +v 0.625 0.3125 0.4688 +v 0.5625 0.3125 0.4688 +v 0.5625 0.9375 0.4688 +v 0.625 0.625 0.4688 +v 0.625 0.625 0.3438 +v 0.5625 0.625 0.3438 +v 0.5625 0.625 0.4688 +v 0.5625 0.625 0.5938 +v 0.625 0.625 0.5938 +vt 0.7969 0.25 +vt 0.7969 0.3281 +vt 0.7656 0.3281 +vt 0.7656 0.25 vt 1 0.25 -vt 1 0.328125 -vt 0.96875 0.328125 -vt 0.96875 0.25 -vt 0.015625 0.9375 -vt 0.015625 0.96875 -vt 0 0.96875 +vt 1 0.3281 +vt 0.9688 0.3281 +vt 0.9688 0.25 +vt 0.0156 0.9375 +vt 0.0156 0.9688 +vt 0 0.9688 vt 0 0.9375 vt 0 1 -vt 0 0.96875 -vt 0.015625 0.96875 -vt 0.015625 1 -vt 0.015625 0.84375 -vt 0.015625 0.921875 -vt 0 0.921875 -vt 0 0.84375 -vt 0.015625 0.84375 -vt 0.015625 0.921875 -vt 0 0.921875 -vt 0 0.84375 +vt 0 0.9688 +vt 0.0156 0.9688 +vt 0.0156 1 +vt 0.0156 0.8438 +vt 0.0156 0.9219 +vt 0 0.9219 +vt 0 0.8438 +vt 0.0156 0.8438 +vt 0.0156 0.9219 +vt 0 0.9219 +vt 0 0.8438 vt 1 0.25 -vt 1 0.328125 -vt 0.96875 0.328125 -vt 0.96875 0.25 -vt 0.015625 0.9375 -vt 0.015625 0.96875 -vt 0 0.96875 +vt 1 0.3281 +vt 0.9688 0.3281 +vt 0.9688 0.25 +vt 0.0156 0.9375 +vt 0.0156 0.9688 +vt 0 0.9688 vt 0 0.9375 -vt 0.796875 0.25 -vt 0.796875 0.328125 -vt 0.765625 0.328125 -vt 0.765625 0.25 +vt 0.7969 0.25 +vt 0.7969 0.3281 +vt 0.7656 0.3281 +vt 0.7656 0.25 vt 0 1 -vt 0 0.96875 -vt 0.015625 0.96875 -vt 0.015625 1 -vt 0.96875 1 -vt 0.96875 0.921875 -vt 1 0.921875 +vt 0 0.9688 +vt 0.0156 0.9688 +vt 0.0156 1 +vt 0.9688 1 +vt 0.9688 0.9219 +vt 1 0.9219 vt 1 1 vt 0 1 -vt 0 0.921875 -vt 0.015625 0.921875 -vt 0.015625 1 -vt 0.765625 1 -vt 0.765625 0.921875 -vt 0.796875 0.921875 -vt 0.796875 1 -vt 0.96875 1 -vt 0.96875 0.921875 -vt 1 0.921875 +vt 0 0.9219 +vt 0.0156 0.9219 +vt 0.0156 1 +vt 0.7656 1 +vt 0.7656 0.9219 +vt 0.7969 0.9219 +vt 0.7969 1 +vt 0.9688 1 +vt 0.9688 0.9219 +vt 1 0.9219 vt 1 1 vt 0 1 -vt 0 0.921875 -vt 0.015625 0.921875 -vt 0.015625 1 -vt 0.765625 1 -vt 0.765625 0.921875 -vt 0.796875 0.921875 -vt 0.796875 1 +vt 0 0.9219 +vt 0.0156 0.9219 +vt 0.0156 1 +vt 0.7656 1 +vt 0.7656 0.9219 +vt 0.7969 0.9219 +vt 0.7969 1 vn 1 0 0 vn -1 0 0 vn 0 1 0 @@ -14050,152 +12573,136 @@ vn -1 0 0 vn 0 0 1 vn 1 0 0 usemtl common_rough_steel -f 2346/6465/1617 2349/6466/1617 2354/6467/1617 -f 2346/6465/1617 2354/6467/1617 2339/6468/1617 -f 2343/6469/1618 2353/6470/1618 2352/6471/1618 -f 2343/6469/1618 2352/6471/1618 2347/6472/1618 -f 2337/6473/1619 2345/6474/1619 2348/6475/1619 -f 2337/6473/1619 2348/6475/1619 2341/6476/1619 -f 2343/6477/1620 2347/6478/1620 2346/6479/1620 -f 2343/6477/1620 2346/6479/1620 2339/6480/1620 -f 2339/6481/1621 2354/6482/1621 2353/6483/1621 -f 2339/6481/1621 2353/6483/1621 2343/6484/1621 -f 2344/6485/1622 2351/6486/1622 2350/6487/1622 -f 2344/6485/1622 2350/6487/1622 2340/6488/1622 -f 2340/6489/1623 2350/6490/1623 2349/6491/1623 -f 2340/6489/1623 2349/6491/1623 2346/6492/1623 -f 2340/6493/1624 2346/6494/1624 2347/6495/1624 -f 2340/6493/1624 2347/6495/1624 2344/6496/1624 -f 2347/6497/1625 2352/6498/1625 2351/6499/1625 -f 2347/6497/1625 2351/6499/1625 2344/6500/1625 -f 2342/6501/1626 2348/6502/1626 2345/6503/1626 -f 2342/6501/1626 2345/6503/1626 2338/6504/1626 -f 2345/6505/1627 2349/6506/1627 2350/6507/1627 -f 2345/6505/1627 2350/6507/1627 2338/6508/1627 -f 2338/6509/1628 2350/6510/1628 2351/6511/1628 -f 2338/6509/1628 2351/6511/1628 2342/6512/1628 -f 2342/6513/1629 2351/6514/1629 2352/6515/1629 -f 2342/6513/1629 2352/6515/1629 2348/6516/1629 -f 2348/6517/1630 2352/6518/1630 2353/6519/1630 -f 2348/6517/1630 2353/6519/1630 2341/6520/1630 -f 2341/6521/1631 2353/6522/1631 2354/6523/1631 -f 2341/6521/1631 2354/6523/1631 2337/6524/1631 -f 2337/6525/1632 2354/6526/1632 2349/6527/1632 -f 2337/6525/1632 2349/6527/1632 2345/6528/1632 -o wheel_right1 -v 1 0.62457 0.654246875 -v 1 0.62457 0.28010625 -v 1 0.25043000000000004 0.654246875 -v 1 0.25043000000000004 0.28010625 -v 0.95833375 0.62457 0.654246875 -v 0.95833375 0.62457 0.28010625 -v 0.95833375 0.25043000000000004 0.654246875 -v 0.95833375 0.25043000000000004 0.28010625 -v 0.95833375 0.283584375 0.834085 -v 0.625 0.283584375 0.834085 -v 0.95833375 0.591415625 0.834085 -v 0.625 0.591415625 0.834085 -v 0.95833375 0.809085 0.616415625 -v 0.625 0.809085 0.616415625 -v 0.95833375 0.809085 0.308584375 -v 0.625 0.809085 0.308584375 -v 0.95833375 0.591415625 0.09091437500000005 -v 0.625 0.591415625 0.09091437500000005 -v 0.95833375 0.283584375 0.09091437500000005 -v 0.625 0.283584375 0.09091437500000005 -v 0.95833375 0.065915 0.308584375 -v 0.625 0.065915 0.308584375 -v 0.95833375 0.065915 0.616415625 -v 0.625 0.065915 0.616415625 -vt 0.28125 0.21875 -vt 0.28125 0.40625 -vt 0.46875 0.40625 -vt 0.46875 0.21875 -vt 0.46875 0.40625 -vt 0.28125 0.40625 -vt 0.28125 0.375 -vt 0.46875 0.375 -vt 0.46875 0.25 -vt 0.28125 0.25 -vt 0.28125 0.21875 -vt 0.46875 0.21875 -vt 0.28125 0.21875 -vt 0.28125 0.40625 -vt 0.3125 0.40625 -vt 0.3125 0.21875 -vt 0.4375 0.21875 -vt 0.4375 0.40625 -vt 0.46875 0.40625 -vt 0.46875 0.21875 -vt 0 0.21875 -vt 0.1875 0.21875 -vt 0.1875 0.40625 -vt 0 0.40625 -vt 0 0.21875 -vt 0.1875 0.21875 -vt 0.1875 0.40625 -vt 0 0.40625 -vt 0 0.21875 -vt 0.1875 0.21875 -vt 0.1875 0.40625 -vt 0 0.40625 -vt 0 0.21875 -vt 0.1875 0.21875 -vt 0.1875 0.40625 -vt 0 0.40625 -vt 0 0.21875 -vt 0.1875 0.21875 -vt 0.1875 0.40625 -vt 0 0.40625 -vt 0 0.21875 -vt 0.1875 0.21875 -vt 0.1875 0.40625 -vt 0 0.40625 -vt 0 0.21875 -vt 0.1875 0.21875 -vt 0.1875 0.40625 -vt 0 0.40625 -vt 0 0.21875 -vt 0.1875 0.21875 -vt 0.1875 0.40625 -vt 0 0.40625 -vt 0.84375 0.53125 -vt 0.65625 0.53125 -vt 0.53125 0.40625 -vt 0.96875 0.40625 -vt 0.53125 0.40625 -vt 0.53125 0.21875 -vt 0.96875 0.21875 -vt 0.96875 0.40625 -vt 0.53125 0.21875 -vt 0.65625 0.09375 -vt 0.84375 0.09375 -vt 0.96875 0.21875 -vt 0.53125 0.40625 -vt 0.96875 0.40625 -vt 0.84375 0.53125 -vt 0.65625 0.53125 -vt 0.53125 0.40625 -vt 0.53125 0.21875 -vt 0.96875 0.21875 -vt 0.96875 0.40625 -vt 0.84375 0.09375 -vt 0.96875 0.21875 -vt 0.53125 0.21875 -vt 0.65625 0.09375 -vn 1 0 0 -vn 0 1 0 -vn 0 -1 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 0 1 -vn 0 0.7071067811865476 0.7071067811865476 -vn 0 1 0 -vn 0 0.7071077963518332 -0.7071057660198045 -vn 0 0 -1 -vn 0 -0.7071077963518332 -0.7071057660198045 -vn 0 -1 0 -vn 0 -0.7071067811865476 0.7071067811865476 +f 2370/6541/1636 2373/6542/1636 2378/6543/1636 2363/6544/1636 +f 2367/6545/1637 2377/6546/1637 2376/6547/1637 2371/6548/1637 +f 2361/6549/1638 2369/6550/1638 2372/6551/1638 2365/6552/1638 +f 2367/6553/1639 2371/6554/1639 2370/6555/1639 2363/6556/1639 +f 2363/6557/1640 2378/6558/1640 2377/6559/1640 2367/6560/1640 +f 2368/6561/1641 2375/6562/1641 2374/6563/1641 2364/6564/1641 +f 2364/6565/1642 2374/6566/1642 2373/6567/1642 2370/6568/1642 +f 2364/6569/1643 2370/6570/1643 2371/6571/1643 2368/6572/1643 +f 2371/6573/1644 2376/6574/1644 2375/6575/1644 2368/6576/1644 +f 2366/6577/1645 2372/6578/1645 2369/6579/1645 2362/6580/1645 +f 2369/6581/1646 2373/6582/1646 2374/6583/1646 2362/6584/1646 +f 2362/6585/1647 2374/6586/1647 2375/6587/1647 2366/6588/1647 +f 2366/6589/1648 2375/6590/1648 2376/6591/1648 2372/6592/1648 +f 2372/6593/1649 2376/6594/1649 2377/6595/1649 2365/6596/1649 +f 2365/6597/1650 2377/6598/1650 2378/6599/1650 2361/6600/1650 +f 2361/6601/1651 2378/6602/1651 2373/6603/1651 2369/6604/1651 +o wheel_right2 +v 1 0.6246 1.4667 +v 1 0.6246 1.0926 +v 1 0.2504 1.4667 +v 1 0.2504 1.0926 +v 0.9583 0.6246 1.4667 +v 0.9583 0.6246 1.0926 +v 0.9583 0.2504 1.4667 +v 0.9583 0.2504 1.0926 +v 0.9583 0.2836 1.6466 +v 0.625 0.2836 1.6466 +v 0.9583 0.5914 1.6466 +v 0.625 0.5914 1.6466 +v 0.9583 0.8091 1.4289 +v 0.625 0.8091 1.4289 +v 0.9583 0.8091 1.1211 +v 0.625 0.8091 1.1211 +v 0.9583 0.5914 0.9034 +v 0.625 0.5914 0.9034 +v 0.9583 0.2836 0.9034 +v 0.625 0.2836 0.9034 +v 0.9583 0.0659 1.1211 +v 0.625 0.0659 1.1211 +v 0.9583 0.0659 1.4289 +v 0.625 0.0659 1.4289 +vt 0.2813 0.2188 +vt 0.2813 0.4063 +vt 0.4688 0.4063 +vt 0.4688 0.2188 +vt 0.4688 0.4063 +vt 0.2813 0.4063 +vt 0.2813 0.375 +vt 0.4688 0.375 +vt 0.4688 0.25 +vt 0.2813 0.25 +vt 0.2813 0.2188 +vt 0.4688 0.2188 +vt 0.2813 0.2188 +vt 0.2813 0.4063 +vt 0.3125 0.4063 +vt 0.3125 0.2188 +vt 0.4375 0.2188 +vt 0.4375 0.4063 +vt 0.4688 0.4063 +vt 0.4688 0.2188 +vt 0 0.2188 +vt 0.1875 0.2188 +vt 0.1875 0.4063 +vt 0 0.4063 +vt 0 0.2188 +vt 0.1875 0.2188 +vt 0.1875 0.4063 +vt 0 0.4063 +vt 0 0.2188 +vt 0.1875 0.2188 +vt 0.1875 0.4063 +vt 0 0.4063 +vt 0 0.2188 +vt 0.1875 0.2188 +vt 0.1875 0.4063 +vt 0 0.4063 +vt 0 0.2188 +vt 0.1875 0.2188 +vt 0.1875 0.4063 +vt 0 0.4063 +vt 0 0.2188 +vt 0.1875 0.2188 +vt 0.1875 0.4063 +vt 0 0.4063 +vt 0 0.2188 +vt 0.1875 0.2188 +vt 0.1875 0.4063 +vt 0 0.4063 +vt 0 0.2188 +vt 0.1875 0.2188 +vt 0.1875 0.4063 +vt 0 0.4063 +vt 0.8438 0.5313 +vt 0.6563 0.5313 +vt 0.5313 0.4063 +vt 0.9688 0.4063 +vt 0.5313 0.4063 +vt 0.5313 0.2188 +vt 0.9688 0.2188 +vt 0.9688 0.4063 +vt 0.5313 0.2188 +vt 0.6563 0.0938 +vt 0.8438 0.0938 +vt 0.9688 0.2188 +vt 0.5313 0.4063 +vt 0.9688 0.4063 +vt 0.8438 0.5313 +vt 0.6563 0.5313 +vt 0.5313 0.4063 +vt 0.5313 0.2188 +vt 0.9688 0.2188 +vt 0.9688 0.4063 +vt 0.8438 0.0938 +vt 0.9688 0.2188 +vt 0.5313 0.2188 +vt 0.6563 0.0938 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 0 1 +vn 0 0.71 0.71 +vn 0 1 0 +vn 0 0.71 -0.71 +vn 0 0 -1 +vn 0 -0.71 -0.71 +vn 0 -1 0 +vn 0 -0.71 0.71 vn 1 0 0 vn 1 0 0 vn 1 0 0 @@ -14203,127 +12710,108 @@ vn -1 0 0 vn -1 0 0 vn -1 0 0 usemtl tracks16_14 -f 2358/6529/1633 2356/6530/1633 2355/6531/1633 -f 2358/6529/1633 2355/6531/1633 2357/6532/1633 -f 2355/6533/1634 2356/6534/1634 2360/6535/1634 -f 2355/6533/1634 2360/6535/1634 2359/6536/1634 -f 2358/6537/1635 2357/6538/1635 2361/6539/1635 -f 2358/6537/1635 2361/6539/1635 2362/6540/1635 -f 2357/6541/1636 2355/6542/1636 2359/6543/1636 -f 2357/6541/1636 2359/6543/1636 2361/6544/1636 -f 2362/6545/1637 2360/6546/1637 2356/6547/1637 -f 2362/6545/1637 2356/6547/1637 2358/6548/1637 -f 2363/6549/1638 2365/6550/1638 2366/6551/1638 -f 2363/6549/1638 2366/6551/1638 2364/6552/1638 -f 2365/6553/1639 2367/6554/1639 2368/6555/1639 -f 2365/6553/1639 2368/6555/1639 2366/6556/1639 -f 2367/6557/1640 2369/6558/1640 2370/6559/1640 -f 2367/6557/1640 2370/6559/1640 2368/6560/1640 -f 2369/6561/1641 2371/6562/1641 2372/6563/1641 -f 2369/6561/1641 2372/6563/1641 2370/6564/1641 -f 2371/6565/1642 2373/6566/1642 2374/6567/1642 -f 2371/6565/1642 2374/6567/1642 2372/6568/1642 -f 2373/6569/1643 2375/6570/1643 2376/6571/1643 -f 2373/6569/1643 2376/6571/1643 2374/6572/1643 -f 2375/6573/1644 2377/6574/1644 2378/6575/1644 -f 2375/6573/1644 2378/6575/1644 2376/6576/1644 -f 2377/6577/1645 2363/6578/1645 2364/6579/1645 -f 2377/6577/1645 2364/6579/1645 2378/6580/1645 -f 2369/6581/1646 2367/6582/1646 2365/6583/1646 -f 2369/6581/1646 2365/6583/1646 2371/6584/1646 -f 2373/6585/1647 2371/6586/1647 2365/6587/1647 -f 2373/6585/1647 2365/6587/1647 2363/6588/1647 -f 2363/6589/1648 2377/6590/1648 2375/6591/1648 -f 2363/6589/1648 2375/6591/1648 2373/6592/1648 -f 2372/6593/1649 2366/6594/1649 2368/6595/1649 -f 2372/6593/1649 2368/6595/1649 2370/6596/1649 -f 2372/6597/1650 2374/6598/1650 2364/6599/1650 -f 2372/6597/1650 2364/6599/1650 2366/6600/1650 -f 2378/6601/1651 2364/6602/1651 2374/6603/1651 -f 2378/6601/1651 2374/6603/1651 2376/6604/1651 +f 2382/6605/1652 2380/6606/1652 2379/6607/1652 2381/6608/1652 +f 2379/6609/1653 2380/6610/1653 2384/6611/1653 2383/6612/1653 +f 2382/6613/1654 2381/6614/1654 2385/6615/1654 2386/6616/1654 +f 2381/6617/1655 2379/6618/1655 2383/6619/1655 2385/6620/1655 +f 2386/6621/1656 2384/6622/1656 2380/6623/1656 2382/6624/1656 +f 2387/6625/1657 2389/6626/1657 2390/6627/1657 2388/6628/1657 +f 2389/6629/1658 2391/6630/1658 2392/6631/1658 2390/6632/1658 +f 2391/6633/1659 2393/6634/1659 2394/6635/1659 2392/6636/1659 +f 2393/6637/1660 2395/6638/1660 2396/6639/1660 2394/6640/1660 +f 2395/6641/1661 2397/6642/1661 2398/6643/1661 2396/6644/1661 +f 2397/6645/1662 2399/6646/1662 2400/6647/1662 2398/6648/1662 +f 2399/6649/1663 2401/6650/1663 2402/6651/1663 2400/6652/1663 +f 2401/6653/1664 2387/6654/1664 2388/6655/1664 2402/6656/1664 +f 2393/6657/1665 2391/6658/1665 2389/6659/1665 2395/6660/1665 +f 2397/6661/1666 2395/6662/1666 2389/6663/1666 2387/6664/1666 +f 2387/6665/1667 2401/6666/1667 2399/6667/1667 2397/6668/1667 +f 2396/6669/1668 2390/6670/1668 2392/6671/1668 2394/6672/1668 +f 2396/6673/1669 2398/6674/1669 2388/6675/1669 2390/6676/1669 +f 2402/6677/1670 2388/6678/1670 2398/6679/1670 2400/6680/1670 o sspension2 -v 0.625 0.9375 1.40625 -v 0.625 0.9375 1.15625 -v 0.625 0.3125 1.40625 -v 0.625 0.3125 1.15625 -v 0.5625 0.9375 1.40625 -v 0.5625 0.9375 1.15625 -v 0.5625 0.3125 1.40625 -v 0.5625 0.3125 1.15625 -v 0.625 0.9375 1.28125 -v 0.625 0.3125 1.28125 -v 0.5625 0.3125 1.28125 -v 0.5625 0.9375 1.28125 -v 0.625 0.625 1.28125 -v 0.625 0.625 1.15625 -v 0.5625 0.625 1.15625 -v 0.5625 0.625 1.28125 -v 0.5625 0.625 1.40625 -v 0.625 0.625 1.40625 -vt 0.796875 0.25 -vt 0.796875 0.328125 -vt 0.765625 0.328125 -vt 0.765625 0.25 +v 0.625 0.9375 1.4063 +v 0.625 0.9375 1.1563 +v 0.625 0.3125 1.4063 +v 0.625 0.3125 1.1563 +v 0.5625 0.9375 1.4063 +v 0.5625 0.9375 1.1563 +v 0.5625 0.3125 1.4063 +v 0.5625 0.3125 1.1563 +v 0.625 0.9375 1.2813 +v 0.625 0.3125 1.2813 +v 0.5625 0.3125 1.2813 +v 0.5625 0.9375 1.2813 +v 0.625 0.625 1.2813 +v 0.625 0.625 1.1563 +v 0.5625 0.625 1.1563 +v 0.5625 0.625 1.2813 +v 0.5625 0.625 1.4063 +v 0.625 0.625 1.4063 +vt 0.7969 0.25 +vt 0.7969 0.3281 +vt 0.7656 0.3281 +vt 0.7656 0.25 vt 1 0.25 -vt 1 0.328125 -vt 0.96875 0.328125 -vt 0.96875 0.25 -vt 0.015625 0.9375 -vt 0.015625 0.96875 -vt 0 0.96875 +vt 1 0.3281 +vt 0.9688 0.3281 +vt 0.9688 0.25 +vt 0.0156 0.9375 +vt 0.0156 0.9688 +vt 0 0.9688 vt 0 0.9375 vt 0 1 -vt 0 0.96875 -vt 0.015625 0.96875 -vt 0.015625 1 -vt 0.015625 0.84375 -vt 0.015625 0.921875 -vt 0 0.921875 -vt 0 0.84375 -vt 0.015625 0.84375 -vt 0.015625 0.921875 -vt 0 0.921875 -vt 0 0.84375 +vt 0 0.9688 +vt 0.0156 0.9688 +vt 0.0156 1 +vt 0.0156 0.8438 +vt 0.0156 0.9219 +vt 0 0.9219 +vt 0 0.8438 +vt 0.0156 0.8438 +vt 0.0156 0.9219 +vt 0 0.9219 +vt 0 0.8438 vt 1 0.25 -vt 1 0.328125 -vt 0.96875 0.328125 -vt 0.96875 0.25 -vt 0.015625 0.9375 -vt 0.015625 0.96875 -vt 0 0.96875 +vt 1 0.3281 +vt 0.9688 0.3281 +vt 0.9688 0.25 +vt 0.0156 0.9375 +vt 0.0156 0.9688 +vt 0 0.9688 vt 0 0.9375 -vt 0.796875 0.25 -vt 0.796875 0.328125 -vt 0.765625 0.328125 -vt 0.765625 0.25 +vt 0.7969 0.25 +vt 0.7969 0.3281 +vt 0.7656 0.3281 +vt 0.7656 0.25 vt 0 1 -vt 0 0.96875 -vt 0.015625 0.96875 -vt 0.015625 1 -vt 0.96875 1 -vt 0.96875 0.921875 -vt 1 0.921875 +vt 0 0.9688 +vt 0.0156 0.9688 +vt 0.0156 1 +vt 0.9688 1 +vt 0.9688 0.9219 +vt 1 0.9219 vt 1 1 vt 0 1 -vt 0 0.921875 -vt 0.015625 0.921875 -vt 0.015625 1 -vt 0.765625 1 -vt 0.765625 0.921875 -vt 0.796875 0.921875 -vt 0.796875 1 -vt 0.96875 1 -vt 0.96875 0.921875 -vt 1 0.921875 +vt 0 0.9219 +vt 0.0156 0.9219 +vt 0.0156 1 +vt 0.7656 1 +vt 0.7656 0.9219 +vt 0.7969 0.9219 +vt 0.7969 1 +vt 0.9688 1 +vt 0.9688 0.9219 +vt 1 0.9219 vt 1 1 vt 0 1 -vt 0 0.921875 -vt 0.015625 0.921875 -vt 0.015625 1 -vt 0.765625 1 -vt 0.765625 0.921875 -vt 0.796875 0.921875 -vt 0.796875 1 +vt 0 0.9219 +vt 0.0156 0.9219 +vt 0.0156 1 +vt 0.7656 1 +vt 0.7656 0.9219 +vt 0.7969 0.9219 +vt 0.7969 1 vn 1 0 0 vn -1 0 0 vn 0 1 0 @@ -14341,280 +12829,245 @@ vn -1 0 0 vn 0 0 1 vn 1 0 0 usemtl common_rough_steel -f 2388/6605/1652 2391/6606/1652 2396/6607/1652 -f 2388/6605/1652 2396/6607/1652 2381/6608/1652 -f 2385/6609/1653 2395/6610/1653 2394/6611/1653 -f 2385/6609/1653 2394/6611/1653 2389/6612/1653 -f 2379/6613/1654 2387/6614/1654 2390/6615/1654 -f 2379/6613/1654 2390/6615/1654 2383/6616/1654 -f 2385/6617/1655 2389/6618/1655 2388/6619/1655 -f 2385/6617/1655 2388/6619/1655 2381/6620/1655 -f 2381/6621/1656 2396/6622/1656 2395/6623/1656 -f 2381/6621/1656 2395/6623/1656 2385/6624/1656 -f 2386/6625/1657 2393/6626/1657 2392/6627/1657 -f 2386/6625/1657 2392/6627/1657 2382/6628/1657 -f 2382/6629/1658 2392/6630/1658 2391/6631/1658 -f 2382/6629/1658 2391/6631/1658 2388/6632/1658 -f 2382/6633/1659 2388/6634/1659 2389/6635/1659 -f 2382/6633/1659 2389/6635/1659 2386/6636/1659 -f 2389/6637/1660 2394/6638/1660 2393/6639/1660 -f 2389/6637/1660 2393/6639/1660 2386/6640/1660 -f 2384/6641/1661 2390/6642/1661 2387/6643/1661 -f 2384/6641/1661 2387/6643/1661 2380/6644/1661 -f 2387/6645/1662 2391/6646/1662 2392/6647/1662 -f 2387/6645/1662 2392/6647/1662 2380/6648/1662 -f 2380/6649/1663 2392/6650/1663 2393/6651/1663 -f 2380/6649/1663 2393/6651/1663 2384/6652/1663 -f 2384/6653/1664 2393/6654/1664 2394/6655/1664 -f 2384/6653/1664 2394/6655/1664 2390/6656/1664 -f 2390/6657/1665 2394/6658/1665 2395/6659/1665 -f 2390/6657/1665 2395/6659/1665 2383/6660/1665 -f 2383/6661/1666 2395/6662/1666 2396/6663/1666 -f 2383/6661/1666 2396/6663/1666 2379/6664/1666 -f 2379/6665/1667 2396/6666/1667 2391/6667/1667 -f 2379/6665/1667 2391/6667/1667 2387/6668/1667 -o wheel_right2 -v 1 0.62457 1.466746875 -v 1 0.62457 1.09260625 -v 1 0.25043000000000004 1.466746875 -v 1 0.25043000000000004 1.09260625 -v 0.95833375 0.62457 1.466746875 -v 0.95833375 0.62457 1.09260625 -v 0.95833375 0.25043000000000004 1.466746875 -v 0.95833375 0.25043000000000004 1.09260625 -v 0.95833375 0.283584375 1.646585 -v 0.625 0.283584375 1.646585 -v 0.95833375 0.591415625 1.646585 -v 0.625 0.591415625 1.646585 -v 0.95833375 0.809085 1.428915625 -v 0.625 0.809085 1.428915625 -v 0.95833375 0.809085 1.121084375 -v 0.625 0.809085 1.121084375 -v 0.95833375 0.591415625 0.903414375 -v 0.625 0.591415625 0.903414375 -v 0.95833375 0.283584375 0.903414375 -v 0.625 0.283584375 0.903414375 -v 0.95833375 0.065915 1.121084375 -v 0.625 0.065915 1.121084375 -v 0.95833375 0.065915 1.428915625 -v 0.625 0.065915 1.428915625 -vt 0.28125 0.21875 -vt 0.28125 0.40625 -vt 0.46875 0.40625 -vt 0.46875 0.21875 -vt 0.46875 0.40625 -vt 0.28125 0.40625 -vt 0.28125 0.375 -vt 0.46875 0.375 -vt 0.46875 0.25 -vt 0.28125 0.25 -vt 0.28125 0.21875 -vt 0.46875 0.21875 -vt 0.28125 0.21875 -vt 0.28125 0.40625 -vt 0.3125 0.40625 -vt 0.3125 0.21875 -vt 0.4375 0.21875 -vt 0.4375 0.40625 -vt 0.46875 0.40625 -vt 0.46875 0.21875 -vt 0 0.21875 -vt 0.1875 0.21875 -vt 0.1875 0.40625 -vt 0 0.40625 -vt 0 0.21875 -vt 0.1875 0.21875 -vt 0.1875 0.40625 -vt 0 0.40625 -vt 0 0.21875 -vt 0.1875 0.21875 -vt 0.1875 0.40625 -vt 0 0.40625 -vt 0 0.21875 -vt 0.1875 0.21875 -vt 0.1875 0.40625 -vt 0 0.40625 -vt 0 0.21875 -vt 0.1875 0.21875 -vt 0.1875 0.40625 -vt 0 0.40625 -vt 0 0.21875 -vt 0.1875 0.21875 -vt 0.1875 0.40625 -vt 0 0.40625 -vt 0 0.21875 -vt 0.1875 0.21875 -vt 0.1875 0.40625 -vt 0 0.40625 -vt 0 0.21875 -vt 0.1875 0.21875 -vt 0.1875 0.40625 -vt 0 0.40625 -vt 0.84375 0.53125 -vt 0.65625 0.53125 -vt 0.53125 0.40625 -vt 0.96875 0.40625 -vt 0.53125 0.40625 -vt 0.53125 0.21875 -vt 0.96875 0.21875 -vt 0.96875 0.40625 -vt 0.53125 0.21875 -vt 0.65625 0.09375 -vt 0.84375 0.09375 -vt 0.96875 0.21875 -vt 0.53125 0.40625 -vt 0.96875 0.40625 -vt 0.84375 0.53125 -vt 0.65625 0.53125 -vt 0.53125 0.40625 -vt 0.53125 0.21875 -vt 0.96875 0.21875 -vt 0.96875 0.40625 -vt 0.84375 0.09375 -vt 0.96875 0.21875 -vt 0.53125 0.21875 -vt 0.65625 0.09375 -vn 1 0 0 -vn 0 1 0 -vn 0 -1 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 0 1 -vn 0 0.7071067811865476 0.7071067811865476 -vn 0 1 0 -vn 0 0.7071077963518332 -0.7071057660198045 -vn 0 0 -1 -vn 0 -0.7071077963518332 -0.7071057660198045 -vn 0 -1 0 -vn 0 -0.7071067811865476 0.7071067811865476 -vn 1 0 0 -vn 1 0 0 -vn 1 0 0 +f 2412/6681/1671 2415/6682/1671 2420/6683/1671 2405/6684/1671 +f 2409/6685/1672 2419/6686/1672 2418/6687/1672 2413/6688/1672 +f 2403/6689/1673 2411/6690/1673 2414/6691/1673 2407/6692/1673 +f 2409/6693/1674 2413/6694/1674 2412/6695/1674 2405/6696/1674 +f 2405/6697/1675 2420/6698/1675 2419/6699/1675 2409/6700/1675 +f 2410/6701/1676 2417/6702/1676 2416/6703/1676 2406/6704/1676 +f 2406/6705/1677 2416/6706/1677 2415/6707/1677 2412/6708/1677 +f 2406/6709/1678 2412/6710/1678 2413/6711/1678 2410/6712/1678 +f 2413/6713/1679 2418/6714/1679 2417/6715/1679 2410/6716/1679 +f 2408/6717/1680 2414/6718/1680 2411/6719/1680 2404/6720/1680 +f 2411/6721/1681 2415/6722/1681 2416/6723/1681 2404/6724/1681 +f 2404/6725/1682 2416/6726/1682 2417/6727/1682 2408/6728/1682 +f 2408/6729/1683 2417/6730/1683 2418/6731/1683 2414/6732/1683 +f 2414/6733/1684 2418/6734/1684 2419/6735/1684 2407/6736/1684 +f 2407/6737/1685 2419/6738/1685 2420/6739/1685 2403/6740/1685 +f 2403/6741/1686 2420/6742/1686 2415/6743/1686 2411/6744/1686 +o wheel_left1 +v -1 0.6246 0.6542 +v -1 0.6246 0.2801 +v -1 0.2504 0.6542 +v -1 0.2504 0.2801 +v -0.9583 0.6246 0.6542 +v -0.9583 0.6246 0.2801 +v -0.9583 0.2504 0.6542 +v -0.9583 0.2504 0.2801 +v -0.9583 0.2836 0.8341 +v -0.625 0.2836 0.8341 +v -0.9583 0.5914 0.8341 +v -0.625 0.5914 0.8341 +v -0.9583 0.8091 0.6164 +v -0.625 0.8091 0.6164 +v -0.9583 0.8091 0.3086 +v -0.625 0.8091 0.3086 +v -0.9583 0.5914 0.0909 +v -0.625 0.5914 0.0909 +v -0.9583 0.2836 0.0909 +v -0.625 0.2836 0.0909 +v -0.9583 0.0659 0.3086 +v -0.625 0.0659 0.3086 +v -0.9583 0.0659 0.6164 +v -0.625 0.0659 0.6164 +vt 0.4688 0.4063 +vt 0.2813 0.4063 +vt 0.2813 0.2188 +vt 0.4688 0.2188 +vt 0.2813 0.375 +vt 0.2813 0.4063 +vt 0.4688 0.4063 +vt 0.4688 0.375 +vt 0.2813 0.2188 +vt 0.2813 0.25 +vt 0.4688 0.25 +vt 0.4688 0.2188 +vt 0.3125 0.4063 +vt 0.2813 0.4063 +vt 0.2813 0.2188 +vt 0.3125 0.2188 +vt 0.4688 0.4063 +vt 0.4375 0.4063 +vt 0.4375 0.2188 +vt 0.4688 0.2188 +vt 0.1875 0.4063 +vt 0.1875 0.2188 +vt 0 0.2188 +vt 0 0.4063 +vt 0.1875 0.4063 +vt 0.1875 0.2188 +vt 0 0.2188 +vt 0 0.4063 +vt 0.1875 0.4063 +vt 0.1875 0.2188 +vt 0 0.2188 +vt 0 0.4063 +vt 0.1875 0.4063 +vt 0.1875 0.2188 +vt 0 0.2188 +vt 0 0.4063 +vt 0.1875 0.4063 +vt 0.1875 0.2188 +vt 0 0.2188 +vt 0 0.4063 +vt 0.1875 0.4063 +vt 0.1875 0.2188 +vt 0 0.2188 +vt 0 0.4063 +vt 0.1875 0.4063 +vt 0.1875 0.2188 +vt 0 0.2188 +vt 0 0.4063 +vt 0.1875 0.4063 +vt 0.1875 0.2188 +vt 0 0.2188 +vt 0 0.4063 +vt 0.5313 0.4063 +vt 0.6563 0.5313 +vt 0.8438 0.5313 +vt 0.9688 0.4063 +vt 0.9688 0.2188 +vt 0.5313 0.2188 +vt 0.5313 0.4063 +vt 0.9688 0.4063 +vt 0.8438 0.0938 +vt 0.6563 0.0938 +vt 0.5313 0.2188 +vt 0.9688 0.2188 +vt 0.8438 0.5313 +vt 0.9688 0.4063 +vt 0.5313 0.4063 +vt 0.6563 0.5313 +vt 0.9688 0.2188 +vt 0.5313 0.2188 +vt 0.5313 0.4063 +vt 0.9688 0.4063 +vt 0.5313 0.2188 +vt 0.9688 0.2188 +vt 0.8438 0.0938 +vt 0.6563 0.0938 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 0 1 +vn 0 0.71 0.71 +vn 0 1 0 +vn 0 0.71 -0.71 +vn 0 0 -1 +vn 0 -0.71 -0.71 +vn 0 -1 0 +vn 0 -0.71 0.71 vn -1 0 0 vn -1 0 0 vn -1 0 0 +vn 1 0 0 +vn 1 0 0 +vn 1 0 0 usemtl tracks16_14 -f 2400/6669/1668 2398/6670/1668 2397/6671/1668 -f 2400/6669/1668 2397/6671/1668 2399/6672/1668 -f 2397/6673/1669 2398/6674/1669 2402/6675/1669 -f 2397/6673/1669 2402/6675/1669 2401/6676/1669 -f 2400/6677/1670 2399/6678/1670 2403/6679/1670 -f 2400/6677/1670 2403/6679/1670 2404/6680/1670 -f 2399/6681/1671 2397/6682/1671 2401/6683/1671 -f 2399/6681/1671 2401/6683/1671 2403/6684/1671 -f 2404/6685/1672 2402/6686/1672 2398/6687/1672 -f 2404/6685/1672 2398/6687/1672 2400/6688/1672 -f 2405/6689/1673 2407/6690/1673 2408/6691/1673 -f 2405/6689/1673 2408/6691/1673 2406/6692/1673 -f 2407/6693/1674 2409/6694/1674 2410/6695/1674 -f 2407/6693/1674 2410/6695/1674 2408/6696/1674 -f 2409/6697/1675 2411/6698/1675 2412/6699/1675 -f 2409/6697/1675 2412/6699/1675 2410/6700/1675 -f 2411/6701/1676 2413/6702/1676 2414/6703/1676 -f 2411/6701/1676 2414/6703/1676 2412/6704/1676 -f 2413/6705/1677 2415/6706/1677 2416/6707/1677 -f 2413/6705/1677 2416/6707/1677 2414/6708/1677 -f 2415/6709/1678 2417/6710/1678 2418/6711/1678 -f 2415/6709/1678 2418/6711/1678 2416/6712/1678 -f 2417/6713/1679 2419/6714/1679 2420/6715/1679 -f 2417/6713/1679 2420/6715/1679 2418/6716/1679 -f 2419/6717/1680 2405/6718/1680 2406/6719/1680 -f 2419/6717/1680 2406/6719/1680 2420/6720/1680 -f 2411/6721/1681 2409/6722/1681 2407/6723/1681 -f 2411/6721/1681 2407/6723/1681 2413/6724/1681 -f 2415/6725/1682 2413/6726/1682 2407/6727/1682 -f 2415/6725/1682 2407/6727/1682 2405/6728/1682 -f 2405/6729/1683 2419/6730/1683 2417/6731/1683 -f 2405/6729/1683 2417/6731/1683 2415/6732/1683 -f 2414/6733/1684 2408/6734/1684 2410/6735/1684 -f 2414/6733/1684 2410/6735/1684 2412/6736/1684 -f 2414/6737/1685 2416/6738/1685 2406/6739/1685 -f 2414/6737/1685 2406/6739/1685 2408/6740/1685 -f 2420/6741/1686 2406/6742/1686 2416/6743/1686 -f 2420/6741/1686 2416/6743/1686 2418/6744/1686 +f 2421/6745/1687 2422/6746/1687 2424/6747/1687 2423/6748/1687 +f 2426/6749/1688 2422/6750/1688 2421/6751/1688 2425/6752/1688 +f 2427/6753/1689 2423/6754/1689 2424/6755/1689 2428/6756/1689 +f 2425/6757/1690 2421/6758/1690 2423/6759/1690 2427/6760/1690 +f 2422/6761/1691 2426/6762/1691 2428/6763/1691 2424/6764/1691 +f 2432/6765/1692 2431/6766/1692 2429/6767/1692 2430/6768/1692 +f 2434/6769/1693 2433/6770/1693 2431/6771/1693 2432/6772/1693 +f 2436/6773/1694 2435/6774/1694 2433/6775/1694 2434/6776/1694 +f 2438/6777/1695 2437/6778/1695 2435/6779/1695 2436/6780/1695 +f 2440/6781/1696 2439/6782/1696 2437/6783/1696 2438/6784/1696 +f 2442/6785/1697 2441/6786/1697 2439/6787/1697 2440/6788/1697 +f 2444/6789/1698 2443/6790/1698 2441/6791/1698 2442/6792/1698 +f 2430/6793/1699 2429/6794/1699 2443/6795/1699 2444/6796/1699 +f 2431/6797/1700 2433/6798/1700 2435/6799/1700 2437/6800/1700 +f 2431/6801/1701 2437/6802/1701 2439/6803/1701 2429/6804/1701 +f 2441/6805/1702 2443/6806/1702 2429/6807/1702 2439/6808/1702 +f 2434/6809/1703 2432/6810/1703 2438/6811/1703 2436/6812/1703 +f 2430/6813/1704 2440/6814/1704 2438/6815/1704 2432/6816/1704 +f 2440/6817/1705 2430/6818/1705 2444/6819/1705 2442/6820/1705 o sspension3 -v -0.5625 0.9375 0.59375 -v -0.5625 0.9375 0.34375 -v -0.5625 0.3125 0.59375 -v -0.5625 0.3125 0.34375 -v -0.625 0.9375 0.59375 -v -0.625 0.9375 0.34375 -v -0.625 0.3125 0.59375 -v -0.625 0.3125 0.34375 -v -0.5625 0.9375 0.46875 -v -0.5625 0.3125 0.46875 -v -0.625 0.3125 0.46875 -v -0.625 0.9375 0.46875 -v -0.5625 0.625 0.46875 -v -0.5625 0.625 0.34375 -v -0.625 0.625 0.34375 -v -0.625 0.625 0.46875 -v -0.625 0.625 0.59375 -v -0.5625 0.625 0.59375 -vt 0.796875 0.25 -vt 0.796875 0.328125 -vt 0.765625 0.328125 -vt 0.765625 0.25 +v -0.5625 0.9375 0.5938 +v -0.5625 0.9375 0.3438 +v -0.5625 0.3125 0.5938 +v -0.5625 0.3125 0.3438 +v -0.625 0.9375 0.5938 +v -0.625 0.9375 0.3438 +v -0.625 0.3125 0.5938 +v -0.625 0.3125 0.3438 +v -0.5625 0.9375 0.4688 +v -0.5625 0.3125 0.4688 +v -0.625 0.3125 0.4688 +v -0.625 0.9375 0.4688 +v -0.5625 0.625 0.4688 +v -0.5625 0.625 0.3438 +v -0.625 0.625 0.3438 +v -0.625 0.625 0.4688 +v -0.625 0.625 0.5938 +v -0.5625 0.625 0.5938 +vt 0.7969 0.25 +vt 0.7969 0.3281 +vt 0.7656 0.3281 +vt 0.7656 0.25 vt 1 0.25 -vt 1 0.328125 -vt 0.96875 0.328125 -vt 0.96875 0.25 -vt 0.015625 0.9375 -vt 0.015625 0.96875 -vt 0 0.96875 +vt 1 0.3281 +vt 0.9688 0.3281 +vt 0.9688 0.25 +vt 0.0156 0.9375 +vt 0.0156 0.9688 +vt 0 0.9688 vt 0 0.9375 vt 0 1 -vt 0 0.96875 -vt 0.015625 0.96875 -vt 0.015625 1 -vt 0.015625 0.84375 -vt 0.015625 0.921875 -vt 0 0.921875 -vt 0 0.84375 -vt 0.015625 0.84375 -vt 0.015625 0.921875 -vt 0 0.921875 -vt 0 0.84375 +vt 0 0.9688 +vt 0.0156 0.9688 +vt 0.0156 1 +vt 0.0156 0.8438 +vt 0.0156 0.9219 +vt 0 0.9219 +vt 0 0.8438 +vt 0.0156 0.8438 +vt 0.0156 0.9219 +vt 0 0.9219 +vt 0 0.8438 vt 1 0.25 -vt 1 0.328125 -vt 0.96875 0.328125 -vt 0.96875 0.25 -vt 0.015625 0.9375 -vt 0.015625 0.96875 -vt 0 0.96875 +vt 1 0.3281 +vt 0.9688 0.3281 +vt 0.9688 0.25 +vt 0.0156 0.9375 +vt 0.0156 0.9688 +vt 0 0.9688 vt 0 0.9375 -vt 0.796875 0.25 -vt 0.796875 0.328125 -vt 0.765625 0.328125 -vt 0.765625 0.25 +vt 0.7969 0.25 +vt 0.7969 0.3281 +vt 0.7656 0.3281 +vt 0.7656 0.25 vt 0 1 -vt 0 0.96875 -vt 0.015625 0.96875 -vt 0.015625 1 -vt 0.96875 1 -vt 0.96875 0.921875 -vt 1 0.921875 +vt 0 0.9688 +vt 0.0156 0.9688 +vt 0.0156 1 +vt 0.9688 1 +vt 0.9688 0.9219 +vt 1 0.9219 vt 1 1 vt 0 1 -vt 0 0.921875 -vt 0.015625 0.921875 -vt 0.015625 1 -vt 0.765625 1 -vt 0.765625 0.921875 -vt 0.796875 0.921875 -vt 0.796875 1 -vt 0.96875 1 -vt 0.96875 0.921875 -vt 1 0.921875 +vt 0 0.9219 +vt 0.0156 0.9219 +vt 0.0156 1 +vt 0.7656 1 +vt 0.7656 0.9219 +vt 0.7969 0.9219 +vt 0.7969 1 +vt 0.9688 1 +vt 0.9688 0.9219 +vt 1 0.9219 vt 1 1 vt 0 1 -vt 0 0.921875 -vt 0.015625 0.921875 -vt 0.015625 1 -vt 0.765625 1 -vt 0.765625 0.921875 -vt 0.796875 0.921875 -vt 0.796875 1 +vt 0 0.9219 +vt 0.0156 0.9219 +vt 0.0156 1 +vt 0.7656 1 +vt 0.7656 0.9219 +vt 0.7969 0.9219 +vt 0.7969 1 vn 1 0 0 vn -1 0 0 vn 0 1 0 @@ -14632,152 +13085,136 @@ vn -1 0 0 vn 0 0 1 vn 1 0 0 usemtl common_rough_steel -f 2430/6745/1687 2433/6746/1687 2438/6747/1687 -f 2430/6745/1687 2438/6747/1687 2423/6748/1687 -f 2427/6749/1688 2437/6750/1688 2436/6751/1688 -f 2427/6749/1688 2436/6751/1688 2431/6752/1688 -f 2421/6753/1689 2429/6754/1689 2432/6755/1689 -f 2421/6753/1689 2432/6755/1689 2425/6756/1689 -f 2427/6757/1690 2431/6758/1690 2430/6759/1690 -f 2427/6757/1690 2430/6759/1690 2423/6760/1690 -f 2423/6761/1691 2438/6762/1691 2437/6763/1691 -f 2423/6761/1691 2437/6763/1691 2427/6764/1691 -f 2428/6765/1692 2435/6766/1692 2434/6767/1692 -f 2428/6765/1692 2434/6767/1692 2424/6768/1692 -f 2424/6769/1693 2434/6770/1693 2433/6771/1693 -f 2424/6769/1693 2433/6771/1693 2430/6772/1693 -f 2424/6773/1694 2430/6774/1694 2431/6775/1694 -f 2424/6773/1694 2431/6775/1694 2428/6776/1694 -f 2431/6777/1695 2436/6778/1695 2435/6779/1695 -f 2431/6777/1695 2435/6779/1695 2428/6780/1695 -f 2426/6781/1696 2432/6782/1696 2429/6783/1696 -f 2426/6781/1696 2429/6783/1696 2422/6784/1696 -f 2429/6785/1697 2433/6786/1697 2434/6787/1697 -f 2429/6785/1697 2434/6787/1697 2422/6788/1697 -f 2422/6789/1698 2434/6790/1698 2435/6791/1698 -f 2422/6789/1698 2435/6791/1698 2426/6792/1698 -f 2426/6793/1699 2435/6794/1699 2436/6795/1699 -f 2426/6793/1699 2436/6795/1699 2432/6796/1699 -f 2432/6797/1700 2436/6798/1700 2437/6799/1700 -f 2432/6797/1700 2437/6799/1700 2425/6800/1700 -f 2425/6801/1701 2437/6802/1701 2438/6803/1701 -f 2425/6801/1701 2438/6803/1701 2421/6804/1701 -f 2421/6805/1702 2438/6806/1702 2433/6807/1702 -f 2421/6805/1702 2433/6807/1702 2429/6808/1702 -o wheel_left1 -v -1 0.6245700000000001 0.6542468749999997 -v -1 0.6245700000000001 0.2801062499999998 -v -1 0.25043000000000004 0.6542468749999997 -v -1 0.25043000000000004 0.2801062499999998 -v -0.958333125 0.6245700000000001 0.6542468749999997 -v -0.958333125 0.6245700000000001 0.2801062499999998 -v -0.958333125 0.25043000000000004 0.6542468749999997 -v -0.958333125 0.25043000000000004 0.2801062499999998 -v -0.958333125 0.283584375 0.834085 -v -0.625 0.283584375 0.834085 -v -0.958333125 0.591415625 0.834085 -v -0.625 0.591415625 0.834085 -v -0.958333125 0.809085 0.6164156249999997 -v -0.625 0.809085 0.6164156249999997 -v -0.958333125 0.809085 0.3085843749999997 -v -0.625 0.809085 0.3085843749999997 -v -0.958333125 0.591415625 0.09091437499999966 -v -0.625 0.591415625 0.09091437499999966 -v -0.958333125 0.283584375 0.09091437499999966 -v -0.625 0.283584375 0.09091437499999966 -v -0.958333125 0.06591499999999995 0.3085843749999997 -v -0.625 0.06591499999999995 0.3085843749999997 -v -0.958333125 0.06591499999999995 0.6164156249999997 -v -0.625 0.06591499999999995 0.6164156249999997 -vt 0.46875 0.40625 -vt 0.28125 0.40625 -vt 0.28125 0.21875 -vt 0.46875 0.21875 -vt 0.28125 0.375 -vt 0.28125 0.40625 -vt 0.46875 0.40625 -vt 0.46875 0.375 -vt 0.28125 0.21875 -vt 0.28125 0.25 -vt 0.46875 0.25 -vt 0.46875 0.21875 -vt 0.3125 0.40625 -vt 0.28125 0.40625 -vt 0.28125 0.21875 -vt 0.3125 0.21875 -vt 0.46875 0.40625 -vt 0.4375 0.40625 -vt 0.4375 0.21875 -vt 0.46875 0.21875 -vt 0.1875 0.40625 -vt 0.1875 0.21875 -vt 0 0.21875 -vt 0 0.40625 -vt 0.1875 0.40625 -vt 0.1875 0.21875 -vt 0 0.21875 -vt 0 0.40625 -vt 0.1875 0.40625 -vt 0.1875 0.21875 -vt 0 0.21875 -vt 0 0.40625 -vt 0.1875 0.40625 -vt 0.1875 0.21875 -vt 0 0.21875 -vt 0 0.40625 -vt 0.1875 0.40625 -vt 0.1875 0.21875 -vt 0 0.21875 -vt 0 0.40625 -vt 0.1875 0.40625 -vt 0.1875 0.21875 -vt 0 0.21875 -vt 0 0.40625 -vt 0.1875 0.40625 -vt 0.1875 0.21875 -vt 0 0.21875 -vt 0 0.40625 -vt 0.1875 0.40625 -vt 0.1875 0.21875 -vt 0 0.21875 -vt 0 0.40625 -vt 0.53125 0.40625 -vt 0.65625 0.53125 -vt 0.84375 0.53125 -vt 0.96875 0.40625 -vt 0.96875 0.21875 -vt 0.53125 0.21875 -vt 0.53125 0.40625 -vt 0.96875 0.40625 -vt 0.84375 0.09375 -vt 0.65625 0.09375 -vt 0.53125 0.21875 -vt 0.96875 0.21875 -vt 0.84375 0.53125 -vt 0.96875 0.40625 -vt 0.53125 0.40625 -vt 0.65625 0.53125 -vt 0.96875 0.21875 -vt 0.53125 0.21875 -vt 0.53125 0.40625 -vt 0.96875 0.40625 -vt 0.53125 0.21875 -vt 0.96875 0.21875 -vt 0.84375 0.09375 -vt 0.65625 0.09375 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 0 1 -vn 0 0.7071067811865479 0.7071067811865471 -vn 0 1 0 -vn 0 0.7071077963518333 -0.7071057660198043 -vn 0 0 -1 -vn 0 -0.7071077963518332 -0.7071057660198045 -vn 0 -1 0 -vn 0 -0.7071067811865479 0.7071067811865472 +f 2454/6821/1706 2457/6822/1706 2462/6823/1706 2447/6824/1706 +f 2451/6825/1707 2461/6826/1707 2460/6827/1707 2455/6828/1707 +f 2445/6829/1708 2453/6830/1708 2456/6831/1708 2449/6832/1708 +f 2451/6833/1709 2455/6834/1709 2454/6835/1709 2447/6836/1709 +f 2447/6837/1710 2462/6838/1710 2461/6839/1710 2451/6840/1710 +f 2452/6841/1711 2459/6842/1711 2458/6843/1711 2448/6844/1711 +f 2448/6845/1712 2458/6846/1712 2457/6847/1712 2454/6848/1712 +f 2448/6849/1713 2454/6850/1713 2455/6851/1713 2452/6852/1713 +f 2455/6853/1714 2460/6854/1714 2459/6855/1714 2452/6856/1714 +f 2450/6857/1715 2456/6858/1715 2453/6859/1715 2446/6860/1715 +f 2453/6861/1716 2457/6862/1716 2458/6863/1716 2446/6864/1716 +f 2446/6865/1717 2458/6866/1717 2459/6867/1717 2450/6868/1717 +f 2450/6869/1718 2459/6870/1718 2460/6871/1718 2456/6872/1718 +f 2456/6873/1719 2460/6874/1719 2461/6875/1719 2449/6876/1719 +f 2449/6877/1720 2461/6878/1720 2462/6879/1720 2445/6880/1720 +f 2445/6881/1721 2462/6882/1721 2457/6883/1721 2453/6884/1721 +o wheel_left2 +v -1 0.6246 1.4667 +v -1 0.6246 1.0926 +v -1 0.2504 1.4667 +v -1 0.2504 1.0926 +v -0.9583 0.6246 1.4667 +v -0.9583 0.6246 1.0926 +v -0.9583 0.2504 1.4667 +v -0.9583 0.2504 1.0926 +v -0.9583 0.2836 1.6466 +v -0.625 0.2836 1.6466 +v -0.9583 0.5914 1.6466 +v -0.625 0.5914 1.6466 +v -0.9583 0.8091 1.4289 +v -0.625 0.8091 1.4289 +v -0.9583 0.8091 1.1211 +v -0.625 0.8091 1.1211 +v -0.9583 0.5914 0.9034 +v -0.625 0.5914 0.9034 +v -0.9583 0.2836 0.9034 +v -0.625 0.2836 0.9034 +v -0.9583 0.0659 1.1211 +v -0.625 0.0659 1.1211 +v -0.9583 0.0659 1.4289 +v -0.625 0.0659 1.4289 +vt 0.4688 0.4063 +vt 0.2813 0.4063 +vt 0.2813 0.2188 +vt 0.4688 0.2188 +vt 0.2813 0.375 +vt 0.2813 0.4063 +vt 0.4688 0.4063 +vt 0.4688 0.375 +vt 0.2813 0.2188 +vt 0.2813 0.25 +vt 0.4688 0.25 +vt 0.4688 0.2188 +vt 0.3125 0.4063 +vt 0.2813 0.4063 +vt 0.2813 0.2188 +vt 0.3125 0.2188 +vt 0.4688 0.4063 +vt 0.4375 0.4063 +vt 0.4375 0.2188 +vt 0.4688 0.2188 +vt 0.1875 0.4063 +vt 0.1875 0.2188 +vt 0 0.2188 +vt 0 0.4063 +vt 0.1875 0.4063 +vt 0.1875 0.2188 +vt 0 0.2188 +vt 0 0.4063 +vt 0.1875 0.4063 +vt 0.1875 0.2188 +vt 0 0.2188 +vt 0 0.4063 +vt 0.1875 0.4063 +vt 0.1875 0.2188 +vt 0 0.2188 +vt 0 0.4063 +vt 0.1875 0.4063 +vt 0.1875 0.2188 +vt 0 0.2188 +vt 0 0.4063 +vt 0.1875 0.4063 +vt 0.1875 0.2188 +vt 0 0.2188 +vt 0 0.4063 +vt 0.1875 0.4063 +vt 0.1875 0.2188 +vt 0 0.2188 +vt 0 0.4063 +vt 0.1875 0.4063 +vt 0.1875 0.2188 +vt 0 0.2188 +vt 0 0.4063 +vt 0.5313 0.4063 +vt 0.6563 0.5313 +vt 0.8438 0.5313 +vt 0.9688 0.4063 +vt 0.9688 0.2188 +vt 0.5313 0.2188 +vt 0.5313 0.4063 +vt 0.9688 0.4063 +vt 0.8438 0.0938 +vt 0.6563 0.0938 +vt 0.5313 0.2188 +vt 0.9688 0.2188 +vt 0.8438 0.5313 +vt 0.9688 0.4063 +vt 0.5313 0.4063 +vt 0.6563 0.5313 +vt 0.9688 0.2188 +vt 0.5313 0.2188 +vt 0.5313 0.4063 +vt 0.9688 0.4063 +vt 0.5313 0.2188 +vt 0.9688 0.2188 +vt 0.8438 0.0938 +vt 0.6563 0.0938 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 0 1 +vn 0 0.71 0.71 +vn 0 1 0 +vn 0 0.71 -0.71 +vn 0 0 -1 +vn 0 -0.71 -0.71 +vn 0 -1 0 +vn 0 -0.71 0.71 vn -1 0 0 vn -1 0 0 vn -1 0 0 @@ -14785,127 +13222,108 @@ vn 1 0 0 vn 1 0 0 vn 1 0 0 usemtl tracks16_14 -f 2439/6809/1703 2440/6810/1703 2442/6811/1703 -f 2439/6809/1703 2442/6811/1703 2441/6812/1703 -f 2444/6813/1704 2440/6814/1704 2439/6815/1704 -f 2444/6813/1704 2439/6815/1704 2443/6816/1704 -f 2445/6817/1705 2441/6818/1705 2442/6819/1705 -f 2445/6817/1705 2442/6819/1705 2446/6820/1705 -f 2443/6821/1706 2439/6822/1706 2441/6823/1706 -f 2443/6821/1706 2441/6823/1706 2445/6824/1706 -f 2440/6825/1707 2444/6826/1707 2446/6827/1707 -f 2440/6825/1707 2446/6827/1707 2442/6828/1707 -f 2450/6829/1708 2449/6830/1708 2447/6831/1708 -f 2450/6829/1708 2447/6831/1708 2448/6832/1708 -f 2452/6833/1709 2451/6834/1709 2449/6835/1709 -f 2452/6833/1709 2449/6835/1709 2450/6836/1709 -f 2454/6837/1710 2453/6838/1710 2451/6839/1710 -f 2454/6837/1710 2451/6839/1710 2452/6840/1710 -f 2456/6841/1711 2455/6842/1711 2453/6843/1711 -f 2456/6841/1711 2453/6843/1711 2454/6844/1711 -f 2458/6845/1712 2457/6846/1712 2455/6847/1712 -f 2458/6845/1712 2455/6847/1712 2456/6848/1712 -f 2460/6849/1713 2459/6850/1713 2457/6851/1713 -f 2460/6849/1713 2457/6851/1713 2458/6852/1713 -f 2462/6853/1714 2461/6854/1714 2459/6855/1714 -f 2462/6853/1714 2459/6855/1714 2460/6856/1714 -f 2448/6857/1715 2447/6858/1715 2461/6859/1715 -f 2448/6857/1715 2461/6859/1715 2462/6860/1715 -f 2449/6861/1716 2451/6862/1716 2453/6863/1716 -f 2449/6861/1716 2453/6863/1716 2455/6864/1716 -f 2449/6865/1717 2455/6866/1717 2457/6867/1717 -f 2449/6865/1717 2457/6867/1717 2447/6868/1717 -f 2459/6869/1718 2461/6870/1718 2447/6871/1718 -f 2459/6869/1718 2447/6871/1718 2457/6872/1718 -f 2452/6873/1719 2450/6874/1719 2456/6875/1719 -f 2452/6873/1719 2456/6875/1719 2454/6876/1719 -f 2448/6877/1720 2458/6878/1720 2456/6879/1720 -f 2448/6877/1720 2456/6879/1720 2450/6880/1720 -f 2458/6881/1721 2448/6882/1721 2462/6883/1721 -f 2458/6881/1721 2462/6883/1721 2460/6884/1721 +f 2463/6885/1722 2464/6886/1722 2466/6887/1722 2465/6888/1722 +f 2468/6889/1723 2464/6890/1723 2463/6891/1723 2467/6892/1723 +f 2469/6893/1724 2465/6894/1724 2466/6895/1724 2470/6896/1724 +f 2467/6897/1725 2463/6898/1725 2465/6899/1725 2469/6900/1725 +f 2464/6901/1726 2468/6902/1726 2470/6903/1726 2466/6904/1726 +f 2474/6905/1727 2473/6906/1727 2471/6907/1727 2472/6908/1727 +f 2476/6909/1728 2475/6910/1728 2473/6911/1728 2474/6912/1728 +f 2478/6913/1729 2477/6914/1729 2475/6915/1729 2476/6916/1729 +f 2480/6917/1730 2479/6918/1730 2477/6919/1730 2478/6920/1730 +f 2482/6921/1731 2481/6922/1731 2479/6923/1731 2480/6924/1731 +f 2484/6925/1732 2483/6926/1732 2481/6927/1732 2482/6928/1732 +f 2486/6929/1733 2485/6930/1733 2483/6931/1733 2484/6932/1733 +f 2472/6933/1734 2471/6934/1734 2485/6935/1734 2486/6936/1734 +f 2473/6937/1735 2475/6938/1735 2477/6939/1735 2479/6940/1735 +f 2473/6941/1736 2479/6942/1736 2481/6943/1736 2471/6944/1736 +f 2483/6945/1737 2485/6946/1737 2471/6947/1737 2481/6948/1737 +f 2476/6949/1738 2474/6950/1738 2480/6951/1738 2478/6952/1738 +f 2472/6953/1739 2482/6954/1739 2480/6955/1739 2474/6956/1739 +f 2482/6957/1740 2472/6958/1740 2486/6959/1740 2484/6960/1740 o sspension4 -v -0.5625 0.9375 1.40625 -v -0.5625 0.9375 1.15625 -v -0.5625 0.3125 1.40625 -v -0.5625 0.3125 1.15625 -v -0.625 0.9375 1.40625 -v -0.625 0.9375 1.15625 -v -0.625 0.3125 1.40625 -v -0.625 0.3125 1.15625 -v -0.5625 0.9375 1.28125 -v -0.5625 0.3125 1.28125 -v -0.625 0.3125 1.28125 -v -0.625 0.9375 1.28125 -v -0.5625 0.625 1.28125 -v -0.5625 0.625 1.15625 -v -0.625 0.625 1.15625 -v -0.625 0.625 1.28125 -v -0.625 0.625 1.40625 -v -0.5625 0.625 1.40625 -vt 0.796875 0.25 -vt 0.796875 0.328125 -vt 0.765625 0.328125 -vt 0.765625 0.25 +v -0.5625 0.9375 1.4063 +v -0.5625 0.9375 1.1563 +v -0.5625 0.3125 1.4063 +v -0.5625 0.3125 1.1563 +v -0.625 0.9375 1.4063 +v -0.625 0.9375 1.1563 +v -0.625 0.3125 1.4063 +v -0.625 0.3125 1.1563 +v -0.5625 0.9375 1.2813 +v -0.5625 0.3125 1.2813 +v -0.625 0.3125 1.2813 +v -0.625 0.9375 1.2813 +v -0.5625 0.625 1.2813 +v -0.5625 0.625 1.1563 +v -0.625 0.625 1.1563 +v -0.625 0.625 1.2813 +v -0.625 0.625 1.4063 +v -0.5625 0.625 1.4063 +vt 0.7969 0.25 +vt 0.7969 0.3281 +vt 0.7656 0.3281 +vt 0.7656 0.25 vt 1 0.25 -vt 1 0.328125 -vt 0.96875 0.328125 -vt 0.96875 0.25 -vt 0.015625 0.9375 -vt 0.015625 0.96875 -vt 0 0.96875 +vt 1 0.3281 +vt 0.9688 0.3281 +vt 0.9688 0.25 +vt 0.0156 0.9375 +vt 0.0156 0.9688 +vt 0 0.9688 vt 0 0.9375 vt 0 1 -vt 0 0.96875 -vt 0.015625 0.96875 -vt 0.015625 1 -vt 0.015625 0.84375 -vt 0.015625 0.921875 -vt 0 0.921875 -vt 0 0.84375 -vt 0.015625 0.84375 -vt 0.015625 0.921875 -vt 0 0.921875 -vt 0 0.84375 +vt 0 0.9688 +vt 0.0156 0.9688 +vt 0.0156 1 +vt 0.0156 0.8438 +vt 0.0156 0.9219 +vt 0 0.9219 +vt 0 0.8438 +vt 0.0156 0.8438 +vt 0.0156 0.9219 +vt 0 0.9219 +vt 0 0.8438 vt 1 0.25 -vt 1 0.328125 -vt 0.96875 0.328125 -vt 0.96875 0.25 -vt 0.015625 0.9375 -vt 0.015625 0.96875 -vt 0 0.96875 +vt 1 0.3281 +vt 0.9688 0.3281 +vt 0.9688 0.25 +vt 0.0156 0.9375 +vt 0.0156 0.9688 +vt 0 0.9688 vt 0 0.9375 -vt 0.796875 0.25 -vt 0.796875 0.328125 -vt 0.765625 0.328125 -vt 0.765625 0.25 +vt 0.7969 0.25 +vt 0.7969 0.3281 +vt 0.7656 0.3281 +vt 0.7656 0.25 vt 0 1 -vt 0 0.96875 -vt 0.015625 0.96875 -vt 0.015625 1 -vt 0.96875 1 -vt 0.96875 0.921875 -vt 1 0.921875 +vt 0 0.9688 +vt 0.0156 0.9688 +vt 0.0156 1 +vt 0.9688 1 +vt 0.9688 0.9219 +vt 1 0.9219 vt 1 1 vt 0 1 -vt 0 0.921875 -vt 0.015625 0.921875 -vt 0.015625 1 -vt 0.765625 1 -vt 0.765625 0.921875 -vt 0.796875 0.921875 -vt 0.796875 1 -vt 0.96875 1 -vt 0.96875 0.921875 -vt 1 0.921875 +vt 0 0.9219 +vt 0.0156 0.9219 +vt 0.0156 1 +vt 0.7656 1 +vt 0.7656 0.9219 +vt 0.7969 0.9219 +vt 0.7969 1 +vt 0.9688 1 +vt 0.9688 0.9219 +vt 1 0.9219 vt 1 1 vt 0 1 -vt 0 0.921875 -vt 0.015625 0.921875 -vt 0.015625 1 -vt 0.765625 1 -vt 0.765625 0.921875 -vt 0.796875 0.921875 -vt 0.796875 1 +vt 0 0.9219 +vt 0.0156 0.9219 +vt 0.0156 1 +vt 0.7656 1 +vt 0.7656 0.9219 +vt 0.7969 0.9219 +vt 0.7969 1 vn 1 0 0 vn -1 0 0 vn 0 1 0 @@ -14923,311 +13341,136 @@ vn -1 0 0 vn 0 0 1 vn 1 0 0 usemtl common_rough_steel -f 2472/6885/1722 2475/6886/1722 2480/6887/1722 -f 2472/6885/1722 2480/6887/1722 2465/6888/1722 -f 2469/6889/1723 2479/6890/1723 2478/6891/1723 -f 2469/6889/1723 2478/6891/1723 2473/6892/1723 -f 2463/6893/1724 2471/6894/1724 2474/6895/1724 -f 2463/6893/1724 2474/6895/1724 2467/6896/1724 -f 2469/6897/1725 2473/6898/1725 2472/6899/1725 -f 2469/6897/1725 2472/6899/1725 2465/6900/1725 -f 2465/6901/1726 2480/6902/1726 2479/6903/1726 -f 2465/6901/1726 2479/6903/1726 2469/6904/1726 -f 2470/6905/1727 2477/6906/1727 2476/6907/1727 -f 2470/6905/1727 2476/6907/1727 2466/6908/1727 -f 2466/6909/1728 2476/6910/1728 2475/6911/1728 -f 2466/6909/1728 2475/6911/1728 2472/6912/1728 -f 2466/6913/1729 2472/6914/1729 2473/6915/1729 -f 2466/6913/1729 2473/6915/1729 2470/6916/1729 -f 2473/6917/1730 2478/6918/1730 2477/6919/1730 -f 2473/6917/1730 2477/6919/1730 2470/6920/1730 -f 2468/6921/1731 2474/6922/1731 2471/6923/1731 -f 2468/6921/1731 2471/6923/1731 2464/6924/1731 -f 2471/6925/1732 2475/6926/1732 2476/6927/1732 -f 2471/6925/1732 2476/6927/1732 2464/6928/1732 -f 2464/6929/1733 2476/6930/1733 2477/6931/1733 -f 2464/6929/1733 2477/6931/1733 2468/6932/1733 -f 2468/6933/1734 2477/6934/1734 2478/6935/1734 -f 2468/6933/1734 2478/6935/1734 2474/6936/1734 -f 2474/6937/1735 2478/6938/1735 2479/6939/1735 -f 2474/6937/1735 2479/6939/1735 2467/6940/1735 -f 2467/6941/1736 2479/6942/1736 2480/6943/1736 -f 2467/6941/1736 2480/6943/1736 2463/6944/1736 -f 2463/6945/1737 2480/6946/1737 2475/6947/1737 -f 2463/6945/1737 2475/6947/1737 2471/6948/1737 -o wheel_left2 -v -1 0.6245700000000001 1.4667468749999997 -v -1 0.6245700000000001 1.0926062499999998 -v -1 0.25043000000000004 1.4667468749999997 -v -1 0.25043000000000004 1.0926062499999998 -v -0.958333125 0.6245700000000001 1.4667468749999997 -v -0.958333125 0.6245700000000001 1.0926062499999998 -v -0.958333125 0.25043000000000004 1.4667468749999997 -v -0.958333125 0.25043000000000004 1.0926062499999998 -v -0.958333125 0.283584375 1.6465849999999995 -v -0.625 0.283584375 1.6465849999999995 -v -0.958333125 0.591415625 1.6465849999999995 -v -0.625 0.591415625 1.6465849999999995 -v -0.958333125 0.809085 1.4289156249999997 -v -0.625 0.809085 1.4289156249999997 -v -0.958333125 0.809085 1.1210843749999992 -v -0.625 0.809085 1.1210843749999992 -v -0.958333125 0.591415625 0.9034143749999992 -v -0.625 0.591415625 0.9034143749999992 -v -0.958333125 0.283584375 0.9034143749999992 -v -0.625 0.283584375 0.9034143749999992 -v -0.958333125 0.06591499999999995 1.1210843749999992 -v -0.625 0.06591499999999995 1.1210843749999992 -v -0.958333125 0.06591499999999995 1.4289156249999997 -v -0.625 0.06591499999999995 1.4289156249999997 -vt 0.46875 0.40625 -vt 0.28125 0.40625 -vt 0.28125 0.21875 -vt 0.46875 0.21875 -vt 0.28125 0.375 -vt 0.28125 0.40625 -vt 0.46875 0.40625 -vt 0.46875 0.375 -vt 0.28125 0.21875 -vt 0.28125 0.25 -vt 0.46875 0.25 -vt 0.46875 0.21875 -vt 0.3125 0.40625 -vt 0.28125 0.40625 -vt 0.28125 0.21875 -vt 0.3125 0.21875 -vt 0.46875 0.40625 -vt 0.4375 0.40625 -vt 0.4375 0.21875 -vt 0.46875 0.21875 -vt 0.1875 0.40625 -vt 0.1875 0.21875 -vt 0 0.21875 -vt 0 0.40625 -vt 0.1875 0.40625 -vt 0.1875 0.21875 -vt 0 0.21875 -vt 0 0.40625 -vt 0.1875 0.40625 -vt 0.1875 0.21875 -vt 0 0.21875 -vt 0 0.40625 -vt 0.1875 0.40625 -vt 0.1875 0.21875 -vt 0 0.21875 -vt 0 0.40625 -vt 0.1875 0.40625 -vt 0.1875 0.21875 -vt 0 0.21875 -vt 0 0.40625 -vt 0.1875 0.40625 -vt 0.1875 0.21875 -vt 0 0.21875 -vt 0 0.40625 -vt 0.1875 0.40625 -vt 0.1875 0.21875 -vt 0 0.21875 -vt 0 0.40625 -vt 0.1875 0.40625 -vt 0.1875 0.21875 -vt 0 0.21875 -vt 0 0.40625 -vt 0.53125 0.40625 -vt 0.65625 0.53125 -vt 0.84375 0.53125 -vt 0.96875 0.40625 -vt 0.96875 0.21875 -vt 0.53125 0.21875 -vt 0.53125 0.40625 -vt 0.96875 0.40625 -vt 0.84375 0.09375 -vt 0.65625 0.09375 -vt 0.53125 0.21875 -vt 0.96875 0.21875 -vt 0.84375 0.53125 -vt 0.96875 0.40625 -vt 0.53125 0.40625 -vt 0.65625 0.53125 -vt 0.96875 0.21875 -vt 0.53125 0.21875 -vt 0.53125 0.40625 -vt 0.96875 0.40625 -vt 0.53125 0.21875 -vt 0.96875 0.21875 -vt 0.84375 0.09375 -vt 0.65625 0.09375 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -vn 0 0 1 -vn 0 0 -1 -vn 0 0 1 -vn 0 0.7071067811865472 0.7071067811865478 -vn 0 1 0 -vn 0 0.7071077963518333 -0.7071057660198043 -vn 0 0 -1 -vn 0 -0.7071077963518332 -0.7071057660198045 -vn 0 -1 0 -vn 0 -0.7071067811865472 0.7071067811865479 -vn -1 0 0 -vn -1 0 0 -vn -1 0 0 -vn 1 0 0 -vn 1 0 0 -vn 1 0 0 -usemtl tracks16_14 -f 2481/6949/1738 2482/6950/1738 2484/6951/1738 -f 2481/6949/1738 2484/6951/1738 2483/6952/1738 -f 2486/6953/1739 2482/6954/1739 2481/6955/1739 -f 2486/6953/1739 2481/6955/1739 2485/6956/1739 -f 2487/6957/1740 2483/6958/1740 2484/6959/1740 -f 2487/6957/1740 2484/6959/1740 2488/6960/1740 -f 2485/6961/1741 2481/6962/1741 2483/6963/1741 -f 2485/6961/1741 2483/6963/1741 2487/6964/1741 -f 2482/6965/1742 2486/6966/1742 2488/6967/1742 -f 2482/6965/1742 2488/6967/1742 2484/6968/1742 -f 2492/6969/1743 2491/6970/1743 2489/6971/1743 -f 2492/6969/1743 2489/6971/1743 2490/6972/1743 -f 2494/6973/1744 2493/6974/1744 2491/6975/1744 -f 2494/6973/1744 2491/6975/1744 2492/6976/1744 -f 2496/6977/1745 2495/6978/1745 2493/6979/1745 -f 2496/6977/1745 2493/6979/1745 2494/6980/1745 -f 2498/6981/1746 2497/6982/1746 2495/6983/1746 -f 2498/6981/1746 2495/6983/1746 2496/6984/1746 -f 2500/6985/1747 2499/6986/1747 2497/6987/1747 -f 2500/6985/1747 2497/6987/1747 2498/6988/1747 -f 2502/6989/1748 2501/6990/1748 2499/6991/1748 -f 2502/6989/1748 2499/6991/1748 2500/6992/1748 -f 2504/6993/1749 2503/6994/1749 2501/6995/1749 -f 2504/6993/1749 2501/6995/1749 2502/6996/1749 -f 2490/6997/1750 2489/6998/1750 2503/6999/1750 -f 2490/6997/1750 2503/6999/1750 2504/7000/1750 -f 2491/7001/1751 2493/7002/1751 2495/7003/1751 -f 2491/7001/1751 2495/7003/1751 2497/7004/1751 -f 2491/7005/1752 2497/7006/1752 2499/7007/1752 -f 2491/7005/1752 2499/7007/1752 2489/7008/1752 -f 2501/7009/1753 2503/7010/1753 2489/7011/1753 -f 2501/7009/1753 2489/7011/1753 2499/7012/1753 -f 2494/7013/1754 2492/7014/1754 2498/7015/1754 -f 2494/7013/1754 2498/7015/1754 2496/7016/1754 -f 2490/7017/1755 2500/7018/1755 2498/7019/1755 -f 2490/7017/1755 2498/7019/1755 2492/7020/1755 -f 2500/7021/1756 2490/7022/1756 2504/7023/1756 -f 2500/7021/1756 2504/7023/1756 2502/7024/1756 +f 2496/6961/1741 2499/6962/1741 2504/6963/1741 2489/6964/1741 +f 2493/6965/1742 2503/6966/1742 2502/6967/1742 2497/6968/1742 +f 2487/6969/1743 2495/6970/1743 2498/6971/1743 2491/6972/1743 +f 2493/6973/1744 2497/6974/1744 2496/6975/1744 2489/6976/1744 +f 2489/6977/1745 2504/6978/1745 2503/6979/1745 2493/6980/1745 +f 2494/6981/1746 2501/6982/1746 2500/6983/1746 2490/6984/1746 +f 2490/6985/1747 2500/6986/1747 2499/6987/1747 2496/6988/1747 +f 2490/6989/1748 2496/6990/1748 2497/6991/1748 2494/6992/1748 +f 2497/6993/1749 2502/6994/1749 2501/6995/1749 2494/6996/1749 +f 2492/6997/1750 2498/6998/1750 2495/6999/1750 2488/7000/1750 +f 2495/7001/1751 2499/7002/1751 2500/7003/1751 2488/7004/1751 +f 2488/7005/1752 2500/7006/1752 2501/7007/1752 2492/7008/1752 +f 2492/7009/1753 2501/7010/1753 2502/7011/1753 2498/7012/1753 +f 2498/7013/1754 2502/7014/1754 2503/7015/1754 2491/7016/1754 +f 2491/7017/1755 2503/7018/1755 2504/7019/1755 2487/7020/1755 +f 2487/7021/1756 2504/7022/1756 2499/7023/1756 2495/7024/1756 o smoll_whell -v -0.65625 1.24375 1.3125 -v -0.65625 1.24375 1 -v -0.65625 0.9312499999999999 1.3125 -v -0.65625 0.9312499999999999 1 -v -0.90625 1.24375 1.3125 -v -0.90625 1.24375 1 -v -0.90625 0.9312499999999999 1.3125 -v -0.90625 0.9312499999999999 1 -v -0.90625 1.05625 1.3125 -v -0.90625 1.05625 1 -v -0.65625 1.05625 1 -v -0.65625 1.05625 1.3125 -v -0.90625 0.9312499999999999 1.1875 -v -0.65625 0.9312499999999999 1.1875 -v -0.65625 1.24375 1.1875 -v -0.90625 1.24375 1.1875 -v -0.71875 1.05625 1 -v -0.71875 1.24375 1 -v -0.71875 1.24375 1.1875 -v -0.71875 1.24375 1.3125 -v -0.71875 1.05625 1.3125 -v -0.71875 0.9312499999999999 1.3125 -v -0.71875 0.9312499999999999 1.1875 -v -0.71875 0.9312499999999999 1 -v -0.90625 1.24375 1.3125 -v -0.90625 1.24375 1 -v -0.90625 0.9312499999999999 1.3125 -v -0.90625 0.9312499999999999 1 -v -0.90625 1.05625 1.3125 -v -0.90625 1.05625 1 -v -0.90625 1.05625 1.1875 -v -0.90625 0.9312499999999999 1.1875 -v -0.90625 1.24375 1.1875 -v -0.65625 1.24375 1 -v -0.65625 1.24375 1.3125 -v -0.65625 0.9312499999999999 1 -v -0.65625 0.9312499999999999 1.3125 -v -0.65625 1.05625 1 -v -0.65625 1.05625 1.3125 -v -0.65625 1.05625 1.125 -v -0.65625 0.9312499999999999 1.125 -v -0.65625 1.24375 1.125 -vt 0.75 0.53125 -vt 0.84375 0.53125 -vt 0.84375 0.625 +v -0.6562 1.2438 1.3125 +v -0.6562 1.2438 1 +v -0.6562 0.9313 1.3125 +v -0.6562 0.9313 1 +v -0.9062 1.2438 1.3125 +v -0.9062 1.2438 1 +v -0.9062 0.9313 1.3125 +v -0.9062 0.9313 1 +v -0.9062 1.0563 1.3125 +v -0.9062 1.0563 1 +v -0.6562 1.0563 1 +v -0.6562 1.0563 1.3125 +v -0.9062 0.9313 1.1875 +v -0.6562 0.9313 1.1875 +v -0.6562 1.2438 1.1875 +v -0.9062 1.2438 1.1875 +v -0.7187 1.0563 1 +v -0.7187 1.2438 1 +v -0.7187 1.2438 1.1875 +v -0.7187 1.2438 1.3125 +v -0.7187 1.0563 1.3125 +v -0.7187 0.9313 1.3125 +v -0.7187 0.9313 1.1875 +v -0.7187 0.9313 1 +v -0.9062 1.2438 1.3125 +v -0.9062 1.2438 1 +v -0.9062 0.9313 1.3125 +v -0.9062 0.9313 1 +v -0.9062 1.0563 1.3125 +v -0.9062 1.0563 1 +v -0.9062 1.0563 1.1875 +v -0.9062 0.9313 1.1875 +v -0.9062 1.2438 1.1875 +v -0.6562 1.2438 1 +v -0.6562 1.2438 1.3125 +v -0.6562 0.9313 1 +v -0.6562 0.9313 1.3125 +v -0.6562 1.0563 1 +v -0.6562 1.0563 1.3125 +v -0.6562 1.0563 1.125 +v -0.6562 0.9313 1.125 +v -0.6562 1.2438 1.125 +vt 0.75 0.5313 +vt 0.8438 0.5313 +vt 0.8438 0.625 vt 0.75 0.625 vt 0.75 0.5 -vt 0.84375 0.5 -vt 0.84375 0.59375 -vt 0.75 0.59375 -vt 0.75 0.53125 -vt 0.84375 0.53125 -vt 0.84375 0.625 +vt 0.8438 0.5 +vt 0.8438 0.5938 +vt 0.75 0.5938 +vt 0.75 0.5313 +vt 0.8438 0.5313 +vt 0.8438 0.625 vt 0.75 0.625 vt 1 0.625 -vt 0.90625 0.625 -vt 0.90625 0.53125 -vt 1 0.53125 +vt 0.9063 0.625 +vt 0.9063 0.5313 +vt 1 0.5313 vt 0.75 0.5625 -vt 0.84375 0.5625 -vt 0.84375 0.5 +vt 0.8438 0.5625 +vt 0.8438 0.5 vt 0.75 0.5 vt 1 0.5 -vt 0.90625 0.5 -vt 0.90625 0.5625 +vt 0.9063 0.5 +vt 0.9063 0.5625 vt 1 0.5625 vt 0.75 0.5625 -vt 0.84375 0.5625 -vt 0.84375 0.5 +vt 0.8438 0.5625 +vt 0.8438 0.5 vt 0.75 0.5 -vt 0.78125 0.5 +vt 0.7813 0.5 vt 0.875 0.5 vt 0.875 0.5625 -vt 0.78125 0.5625 -vt 0.96875 0.53125 -vt 1 0.53125 +vt 0.7813 0.5625 +vt 0.9688 0.5313 +vt 1 0.5313 vt 1 0.625 -vt 0.96875 0.625 +vt 0.9688 0.625 vt 1 0.5 -vt 0.96875 0.5 -vt 0.96875 0.59375 -vt 1 0.59375 +vt 0.9688 0.5 +vt 0.9688 0.5938 +vt 1 0.5938 vt 1 0.5625 -vt 0.96875 0.5625 -vt 0.96875 0.625 +vt 0.9688 0.5625 +vt 0.9688 0.625 vt 1 0.625 vt 1 0.625 -vt 0.96875 0.625 -vt 0.96875 0.53125 -vt 1 0.53125 +vt 0.9688 0.625 +vt 0.9688 0.5313 +vt 1 0.5313 vt 1 0.5625 -vt 0.96875 0.5625 -vt 0.96875 0.5 +vt 0.9688 0.5625 +vt 0.9688 0.5 vt 1 0.5 vt 1 0.625 -vt 0.96875 0.625 -vt 0.96875 0.5625 +vt 0.9688 0.625 +vt 0.9688 0.5625 vt 1 0.5625 -vt 1 0.59375 -vt 0.96875 0.59375 -vt 0.96875 0.5 +vt 1 0.5938 +vt 0.9688 0.5938 +vt 0.9688 0.5 vt 1 0.5 -vt 0.96875 0.5 +vt 0.9688 0.5 vt 1 0.5 vt 1 0.5625 -vt 0.96875 0.5625 -vt 0.75 0.53125 -vt 0.84375 0.53125 -vt 0.84375 0.625 +vt 0.9688 0.5625 +vt 0.75 0.5313 +vt 0.8438 0.5313 +vt 0.8438 0.625 vt 0.75 0.625 vt 1 0.5 -vt 0.90625 0.5 -vt 0.90625 0.5625 +vt 0.9063 0.5 +vt 0.9063 0.5625 vt 1 0.5625 vt 1 0.5625 vt 0.9375 0.5625 @@ -15235,15 +13478,15 @@ vt 0.9375 0.5 vt 1 0.5 vt 0.75 0.625 vt 0.8125 0.625 -vt 0.8125 0.53125 -vt 0.75 0.53125 -vt 0.75 0.53125 -vt 0.84375 0.53125 -vt 0.84375 0.625 +vt 0.8125 0.5313 +vt 0.75 0.5313 +vt 0.75 0.5313 +vt 0.8438 0.5313 +vt 0.8438 0.625 vt 0.75 0.625 vt 1 0.5 -vt 0.90625 0.5 -vt 0.90625 0.5625 +vt 0.9063 0.5 +vt 0.9063 0.5625 vt 1 0.5625 vt 1 0.5625 vt 0.9375 0.5625 @@ -15251,8 +13494,8 @@ vt 0.9375 0.5 vt 1 0.5 vt 0.75 0.625 vt 0.8125 0.625 -vt 0.8125 0.53125 -vt 0.75 0.53125 +vt 0.8125 0.5313 +vt 0.75 0.5313 vn 0 1 0 vn 0 -1 0 vn 0 0 1 @@ -15278,168 +13521,144 @@ vn 1 0 0 vn 1 0 0 vn 1 0 0 usemtl tracks14_12 -f 2520/7025/1757 2523/7026/1757 2522/7027/1757 -f 2520/7025/1757 2522/7027/1757 2510/7028/1757 -f 2512/7029/1758 2528/7030/1758 2527/7031/1758 -f 2512/7029/1758 2527/7031/1758 2517/7032/1758 -f 2513/7033/1759 2525/7034/1759 2524/7035/1759 -f 2513/7033/1759 2524/7035/1759 2509/7036/1759 -f 2510/7037/1760 2522/7038/1760 2521/7039/1760 -f 2510/7037/1760 2521/7039/1760 2514/7040/1760 -f 2514/7041/1761 2521/7042/1761 2528/7043/1761 -f 2514/7041/1761 2528/7043/1761 2512/7044/1761 -f 2511/7045/1762 2526/7046/1762 2525/7047/1762 -f 2511/7045/1762 2525/7047/1762 2513/7048/1762 -f 2517/7049/1763 2527/7050/1763 2526/7051/1763 -f 2517/7049/1763 2526/7051/1763 2511/7052/1763 -f 2509/7053/1764 2524/7054/1764 2523/7055/1764 -f 2509/7053/1764 2523/7055/1764 2520/7056/1764 -f 2515/7057/1765 2521/7058/1765 2522/7059/1765 -f 2515/7057/1765 2522/7059/1765 2506/7060/1765 -f 2506/7061/1766 2522/7062/1766 2523/7063/1766 -f 2506/7061/1766 2523/7063/1766 2519/7064/1766 -f 2519/7065/1767 2523/7066/1767 2524/7067/1767 -f 2519/7065/1767 2524/7067/1767 2505/7068/1767 -f 2505/7069/1768 2524/7070/1768 2525/7071/1768 -f 2505/7069/1768 2525/7071/1768 2516/7072/1768 -f 2516/7073/1769 2525/7074/1769 2526/7075/1769 -f 2516/7073/1769 2526/7075/1769 2507/7076/1769 -f 2507/7077/1770 2526/7078/1770 2527/7079/1770 -f 2507/7077/1770 2527/7079/1770 2518/7080/1770 -f 2518/7081/1771 2527/7082/1771 2528/7083/1771 -f 2518/7081/1771 2528/7083/1771 2508/7084/1771 -f 2508/7085/1772 2528/7086/1772 2521/7087/1772 -f 2508/7085/1772 2521/7087/1772 2515/7088/1772 -f 2534/7089/1773 2535/7090/1773 2537/7091/1773 -f 2534/7089/1773 2537/7091/1773 2530/7092/1773 -f 2532/7093/1774 2536/7094/1774 2535/7095/1774 -f 2532/7093/1774 2535/7095/1774 2534/7096/1774 -f 2533/7097/1775 2535/7098/1775 2536/7099/1775 -f 2533/7097/1775 2536/7099/1775 2531/7100/1775 -f 2529/7101/1776 2537/7102/1776 2535/7103/1776 -f 2529/7101/1776 2535/7103/1776 2533/7104/1776 -f 2543/7105/1777 2544/7106/1777 2546/7107/1777 -f 2543/7105/1777 2546/7107/1777 2539/7108/1777 -f 2541/7109/1778 2545/7110/1778 2544/7111/1778 -f 2541/7109/1778 2544/7111/1778 2543/7112/1778 -f 2542/7113/1779 2544/7114/1779 2545/7115/1779 -f 2542/7113/1779 2545/7115/1779 2540/7116/1779 -f 2538/7117/1780 2546/7118/1780 2544/7119/1780 -f 2538/7117/1780 2544/7119/1780 2542/7120/1780 +f 2520/7025/1757 2523/7026/1757 2522/7027/1757 2510/7028/1757 +f 2512/7029/1758 2528/7030/1758 2527/7031/1758 2517/7032/1758 +f 2513/7033/1759 2525/7034/1759 2524/7035/1759 2509/7036/1759 +f 2510/7037/1760 2522/7038/1760 2521/7039/1760 2514/7040/1760 +f 2514/7041/1761 2521/7042/1761 2528/7043/1761 2512/7044/1761 +f 2511/7045/1762 2526/7046/1762 2525/7047/1762 2513/7048/1762 +f 2517/7049/1763 2527/7050/1763 2526/7051/1763 2511/7052/1763 +f 2509/7053/1764 2524/7054/1764 2523/7055/1764 2520/7056/1764 +f 2515/7057/1765 2521/7058/1765 2522/7059/1765 2506/7060/1765 +f 2506/7061/1766 2522/7062/1766 2523/7063/1766 2519/7064/1766 +f 2519/7065/1767 2523/7066/1767 2524/7067/1767 2505/7068/1767 +f 2505/7069/1768 2524/7070/1768 2525/7071/1768 2516/7072/1768 +f 2516/7073/1769 2525/7074/1769 2526/7075/1769 2507/7076/1769 +f 2507/7077/1770 2526/7078/1770 2527/7079/1770 2518/7080/1770 +f 2518/7081/1771 2527/7082/1771 2528/7083/1771 2508/7084/1771 +f 2508/7085/1772 2528/7086/1772 2521/7087/1772 2515/7088/1772 +f 2534/7089/1773 2535/7090/1773 2537/7091/1773 2530/7092/1773 +f 2532/7093/1774 2536/7094/1774 2535/7095/1774 2534/7096/1774 +f 2533/7097/1775 2535/7098/1775 2536/7099/1775 2531/7100/1775 +f 2529/7101/1776 2537/7102/1776 2535/7103/1776 2533/7104/1776 +f 2543/7105/1777 2544/7106/1777 2546/7107/1777 2539/7108/1777 +f 2541/7109/1778 2545/7110/1778 2544/7111/1778 2543/7112/1778 +f 2542/7113/1779 2544/7114/1779 2545/7115/1779 2540/7116/1779 +f 2538/7117/1780 2546/7118/1780 2544/7119/1780 2542/7120/1780 o smoll_whell2 -v -0.65625 1.24375 0.75 -v -0.65625 1.24375 0.4375 -v -0.65625 0.9312499999999999 0.75 -v -0.65625 0.9312499999999999 0.4375 -v -0.90625 1.24375 0.75 -v -0.90625 1.24375 0.4375 -v -0.90625 0.9312499999999999 0.75 -v -0.90625 0.9312499999999999 0.4375 -v -0.90625 1.05625 0.75 -v -0.90625 1.05625 0.4375 -v -0.65625 1.05625 0.4375 -v -0.65625 1.05625 0.75 -v -0.90625 0.9312499999999999 0.625 -v -0.65625 0.9312499999999999 0.625 -v -0.65625 1.24375 0.625 -v -0.90625 1.24375 0.625 -v -0.71875 1.05625 0.4375 -v -0.71875 1.24375 0.4375 -v -0.71875 1.24375 0.625 -v -0.71875 1.24375 0.75 -v -0.71875 1.05625 0.75 -v -0.71875 0.9312499999999999 0.75 -v -0.71875 0.9312499999999999 0.625 -v -0.71875 0.9312499999999999 0.4375 -v -0.90625 1.24375 0.75 -v -0.90625 1.24375 0.4375 -v -0.90625 0.9312499999999999 0.75 -v -0.90625 0.9312499999999999 0.4375 -v -0.90625 1.05625 0.75 -v -0.90625 1.05625 0.4375 -v -0.90625 1.05625 0.625 -v -0.90625 0.9312499999999999 0.625 -v -0.90625 1.24375 0.625 -v -0.65625 1.24375 0.4375 -v -0.65625 1.24375 0.75 -v -0.65625 0.9312499999999999 0.4375 -v -0.65625 0.9312499999999999 0.75 -v -0.65625 1.05625 0.4375 -v -0.65625 1.05625 0.75 -v -0.65625 1.05625 0.5625 -v -0.65625 0.9312499999999999 0.5625 -v -0.65625 1.24375 0.5625 -vt 0.75 0.53125 -vt 0.84375 0.53125 -vt 0.84375 0.625 +v -0.6562 1.2438 0.75 +v -0.6562 1.2438 0.4375 +v -0.6562 0.9313 0.75 +v -0.6562 0.9313 0.4375 +v -0.9062 1.2438 0.75 +v -0.9062 1.2438 0.4375 +v -0.9062 0.9313 0.75 +v -0.9062 0.9313 0.4375 +v -0.9062 1.0563 0.75 +v -0.9062 1.0563 0.4375 +v -0.6562 1.0563 0.4375 +v -0.6562 1.0563 0.75 +v -0.9062 0.9313 0.625 +v -0.6562 0.9313 0.625 +v -0.6562 1.2438 0.625 +v -0.9062 1.2438 0.625 +v -0.7187 1.0563 0.4375 +v -0.7187 1.2438 0.4375 +v -0.7187 1.2438 0.625 +v -0.7187 1.2438 0.75 +v -0.7187 1.0563 0.75 +v -0.7187 0.9313 0.75 +v -0.7187 0.9313 0.625 +v -0.7187 0.9313 0.4375 +v -0.9062 1.2438 0.75 +v -0.9062 1.2438 0.4375 +v -0.9062 0.9313 0.75 +v -0.9062 0.9313 0.4375 +v -0.9062 1.0563 0.75 +v -0.9062 1.0563 0.4375 +v -0.9062 1.0563 0.625 +v -0.9062 0.9313 0.625 +v -0.9062 1.2438 0.625 +v -0.6562 1.2438 0.4375 +v -0.6562 1.2438 0.75 +v -0.6562 0.9313 0.4375 +v -0.6562 0.9313 0.75 +v -0.6562 1.0563 0.4375 +v -0.6562 1.0563 0.75 +v -0.6562 1.0563 0.5625 +v -0.6562 0.9313 0.5625 +v -0.6562 1.2438 0.5625 +vt 0.75 0.5313 +vt 0.8438 0.5313 +vt 0.8438 0.625 vt 0.75 0.625 vt 0.75 0.5 -vt 0.84375 0.5 -vt 0.84375 0.59375 -vt 0.75 0.59375 -vt 0.75 0.53125 -vt 0.84375 0.53125 -vt 0.84375 0.625 +vt 0.8438 0.5 +vt 0.8438 0.5938 +vt 0.75 0.5938 +vt 0.75 0.5313 +vt 0.8438 0.5313 +vt 0.8438 0.625 vt 0.75 0.625 vt 1 0.625 -vt 0.90625 0.625 -vt 0.90625 0.53125 -vt 1 0.53125 +vt 0.9063 0.625 +vt 0.9063 0.5313 +vt 1 0.5313 vt 0.75 0.5625 -vt 0.84375 0.5625 -vt 0.84375 0.5 +vt 0.8438 0.5625 +vt 0.8438 0.5 vt 0.75 0.5 vt 1 0.5 -vt 0.90625 0.5 -vt 0.90625 0.5625 +vt 0.9063 0.5 +vt 0.9063 0.5625 vt 1 0.5625 vt 0.75 0.5625 -vt 0.84375 0.5625 -vt 0.84375 0.5 +vt 0.8438 0.5625 +vt 0.8438 0.5 vt 0.75 0.5 -vt 0.78125 0.5 +vt 0.7813 0.5 vt 0.875 0.5 vt 0.875 0.5625 -vt 0.78125 0.5625 -vt 0.96875 0.53125 -vt 1 0.53125 +vt 0.7813 0.5625 +vt 0.9688 0.5313 +vt 1 0.5313 vt 1 0.625 -vt 0.96875 0.625 +vt 0.9688 0.625 vt 1 0.5 -vt 0.96875 0.5 -vt 0.96875 0.59375 -vt 1 0.59375 +vt 0.9688 0.5 +vt 0.9688 0.5938 +vt 1 0.5938 vt 1 0.5625 -vt 0.96875 0.5625 -vt 0.96875 0.625 +vt 0.9688 0.5625 +vt 0.9688 0.625 vt 1 0.625 vt 1 0.625 -vt 0.96875 0.625 -vt 0.96875 0.53125 -vt 1 0.53125 +vt 0.9688 0.625 +vt 0.9688 0.5313 +vt 1 0.5313 vt 1 0.5625 -vt 0.96875 0.5625 -vt 0.96875 0.5 +vt 0.9688 0.5625 +vt 0.9688 0.5 vt 1 0.5 vt 1 0.625 -vt 0.96875 0.625 -vt 0.96875 0.5625 +vt 0.9688 0.625 +vt 0.9688 0.5625 vt 1 0.5625 -vt 1 0.59375 -vt 0.96875 0.59375 -vt 0.96875 0.5 +vt 1 0.5938 +vt 0.9688 0.5938 +vt 0.9688 0.5 vt 1 0.5 -vt 0.96875 0.5 +vt 0.9688 0.5 vt 1 0.5 vt 1 0.5625 -vt 0.96875 0.5625 -vt 0.75 0.53125 -vt 0.84375 0.53125 -vt 0.84375 0.625 +vt 0.9688 0.5625 +vt 0.75 0.5313 +vt 0.8438 0.5313 +vt 0.8438 0.625 vt 0.75 0.625 vt 1 0.5 -vt 0.90625 0.5 -vt 0.90625 0.5625 +vt 0.9063 0.5 +vt 0.9063 0.5625 vt 1 0.5625 vt 1 0.5625 vt 0.9375 0.5625 @@ -15447,15 +13666,15 @@ vt 0.9375 0.5 vt 1 0.5 vt 0.75 0.625 vt 0.8125 0.625 -vt 0.8125 0.53125 -vt 0.75 0.53125 -vt 0.75 0.53125 -vt 0.84375 0.53125 -vt 0.84375 0.625 +vt 0.8125 0.5313 +vt 0.75 0.5313 +vt 0.75 0.5313 +vt 0.8438 0.5313 +vt 0.8438 0.625 vt 0.75 0.625 vt 1 0.5 -vt 0.90625 0.5 -vt 0.90625 0.5625 +vt 0.9063 0.5 +vt 0.9063 0.5625 vt 1 0.5625 vt 1 0.5625 vt 0.9375 0.5625 @@ -15463,8 +13682,8 @@ vt 0.9375 0.5 vt 1 0.5 vt 0.75 0.625 vt 0.8125 0.625 -vt 0.8125 0.53125 -vt 0.75 0.53125 +vt 0.8125 0.5313 +vt 0.75 0.5313 vn 0 1 0 vn 0 -1 0 vn 0 0 1 @@ -15490,168 +13709,144 @@ vn 1 0 0 vn 1 0 0 vn 1 0 0 usemtl tracks14_12 -f 2562/7121/1781 2565/7122/1781 2564/7123/1781 -f 2562/7121/1781 2564/7123/1781 2552/7124/1781 -f 2554/7125/1782 2570/7126/1782 2569/7127/1782 -f 2554/7125/1782 2569/7127/1782 2559/7128/1782 -f 2555/7129/1783 2567/7130/1783 2566/7131/1783 -f 2555/7129/1783 2566/7131/1783 2551/7132/1783 -f 2552/7133/1784 2564/7134/1784 2563/7135/1784 -f 2552/7133/1784 2563/7135/1784 2556/7136/1784 -f 2556/7137/1785 2563/7138/1785 2570/7139/1785 -f 2556/7137/1785 2570/7139/1785 2554/7140/1785 -f 2553/7141/1786 2568/7142/1786 2567/7143/1786 -f 2553/7141/1786 2567/7143/1786 2555/7144/1786 -f 2559/7145/1787 2569/7146/1787 2568/7147/1787 -f 2559/7145/1787 2568/7147/1787 2553/7148/1787 -f 2551/7149/1788 2566/7150/1788 2565/7151/1788 -f 2551/7149/1788 2565/7151/1788 2562/7152/1788 -f 2557/7153/1789 2563/7154/1789 2564/7155/1789 -f 2557/7153/1789 2564/7155/1789 2548/7156/1789 -f 2548/7157/1790 2564/7158/1790 2565/7159/1790 -f 2548/7157/1790 2565/7159/1790 2561/7160/1790 -f 2561/7161/1791 2565/7162/1791 2566/7163/1791 -f 2561/7161/1791 2566/7163/1791 2547/7164/1791 -f 2547/7165/1792 2566/7166/1792 2567/7167/1792 -f 2547/7165/1792 2567/7167/1792 2558/7168/1792 -f 2558/7169/1793 2567/7170/1793 2568/7171/1793 -f 2558/7169/1793 2568/7171/1793 2549/7172/1793 -f 2549/7173/1794 2568/7174/1794 2569/7175/1794 -f 2549/7173/1794 2569/7175/1794 2560/7176/1794 -f 2560/7177/1795 2569/7178/1795 2570/7179/1795 -f 2560/7177/1795 2570/7179/1795 2550/7180/1795 -f 2550/7181/1796 2570/7182/1796 2563/7183/1796 -f 2550/7181/1796 2563/7183/1796 2557/7184/1796 -f 2576/7185/1797 2577/7186/1797 2579/7187/1797 -f 2576/7185/1797 2579/7187/1797 2572/7188/1797 -f 2574/7189/1798 2578/7190/1798 2577/7191/1798 -f 2574/7189/1798 2577/7191/1798 2576/7192/1798 -f 2575/7193/1799 2577/7194/1799 2578/7195/1799 -f 2575/7193/1799 2578/7195/1799 2573/7196/1799 -f 2571/7197/1800 2579/7198/1800 2577/7199/1800 -f 2571/7197/1800 2577/7199/1800 2575/7200/1800 -f 2585/7201/1801 2586/7202/1801 2588/7203/1801 -f 2585/7201/1801 2588/7203/1801 2581/7204/1801 -f 2583/7205/1802 2587/7206/1802 2586/7207/1802 -f 2583/7205/1802 2586/7207/1802 2585/7208/1802 -f 2584/7209/1803 2586/7210/1803 2587/7211/1803 -f 2584/7209/1803 2587/7211/1803 2582/7212/1803 -f 2580/7213/1804 2588/7214/1804 2586/7215/1804 -f 2580/7213/1804 2586/7215/1804 2584/7216/1804 +f 2562/7121/1781 2565/7122/1781 2564/7123/1781 2552/7124/1781 +f 2554/7125/1782 2570/7126/1782 2569/7127/1782 2559/7128/1782 +f 2555/7129/1783 2567/7130/1783 2566/7131/1783 2551/7132/1783 +f 2552/7133/1784 2564/7134/1784 2563/7135/1784 2556/7136/1784 +f 2556/7137/1785 2563/7138/1785 2570/7139/1785 2554/7140/1785 +f 2553/7141/1786 2568/7142/1786 2567/7143/1786 2555/7144/1786 +f 2559/7145/1787 2569/7146/1787 2568/7147/1787 2553/7148/1787 +f 2551/7149/1788 2566/7150/1788 2565/7151/1788 2562/7152/1788 +f 2557/7153/1789 2563/7154/1789 2564/7155/1789 2548/7156/1789 +f 2548/7157/1790 2564/7158/1790 2565/7159/1790 2561/7160/1790 +f 2561/7161/1791 2565/7162/1791 2566/7163/1791 2547/7164/1791 +f 2547/7165/1792 2566/7166/1792 2567/7167/1792 2558/7168/1792 +f 2558/7169/1793 2567/7170/1793 2568/7171/1793 2549/7172/1793 +f 2549/7173/1794 2568/7174/1794 2569/7175/1794 2560/7176/1794 +f 2560/7177/1795 2569/7178/1795 2570/7179/1795 2550/7180/1795 +f 2550/7181/1796 2570/7182/1796 2563/7183/1796 2557/7184/1796 +f 2576/7185/1797 2577/7186/1797 2579/7187/1797 2572/7188/1797 +f 2574/7189/1798 2578/7190/1798 2577/7191/1798 2576/7192/1798 +f 2575/7193/1799 2577/7194/1799 2578/7195/1799 2573/7196/1799 +f 2571/7197/1800 2579/7198/1800 2577/7199/1800 2575/7200/1800 +f 2585/7201/1801 2586/7202/1801 2588/7203/1801 2581/7204/1801 +f 2583/7205/1802 2587/7206/1802 2586/7207/1802 2585/7208/1802 +f 2584/7209/1803 2586/7210/1803 2587/7211/1803 2582/7212/1803 +f 2580/7213/1804 2588/7214/1804 2586/7215/1804 2584/7216/1804 o smoll_whell3 -v 0.90625 1.24375 0.75 -v 0.90625 1.24375 0.4375 -v 0.90625 0.9312499999999999 0.75 -v 0.90625 0.9312499999999999 0.4375 -v 0.65625 1.24375 0.75 -v 0.65625 1.24375 0.4375 -v 0.65625 0.9312499999999999 0.75 -v 0.65625 0.9312499999999999 0.4375 -v 0.65625 1.05625 0.75 -v 0.65625 1.05625 0.4375 -v 0.90625 1.05625 0.4375 -v 0.90625 1.05625 0.75 -v 0.65625 0.9312499999999999 0.625 -v 0.90625 0.9312499999999999 0.625 -v 0.90625 1.24375 0.625 -v 0.65625 1.24375 0.625 -v 0.84375 1.05625 0.4375 -v 0.84375 1.24375 0.4375 -v 0.84375 1.24375 0.625 -v 0.84375 1.24375 0.75 -v 0.84375 1.05625 0.75 -v 0.84375 0.9312499999999999 0.75 -v 0.84375 0.9312499999999999 0.625 -v 0.84375 0.9312499999999999 0.4375 -v 0.65625 1.24375 0.75 -v 0.65625 1.24375 0.4375 -v 0.65625 0.9312499999999999 0.75 -v 0.65625 0.9312499999999999 0.4375 -v 0.65625 1.05625 0.75 -v 0.65625 1.05625 0.4375 -v 0.65625 1.05625 0.625 -v 0.65625 0.9312499999999999 0.625 -v 0.65625 1.24375 0.625 -v 0.90625 1.24375 0.4375 -v 0.90625 1.24375 0.75 -v 0.90625 0.9312499999999999 0.4375 -v 0.90625 0.9312499999999999 0.75 -v 0.90625 1.05625 0.4375 -v 0.90625 1.05625 0.75 -v 0.90625 1.05625 0.5625 -v 0.90625 0.9312499999999999 0.5625 -v 0.90625 1.24375 0.5625 -vt 0.75 0.53125 -vt 0.84375 0.53125 -vt 0.84375 0.625 +v 0.9063 1.2438 0.75 +v 0.9063 1.2438 0.4375 +v 0.9063 0.9313 0.75 +v 0.9063 0.9313 0.4375 +v 0.6563 1.2438 0.75 +v 0.6563 1.2438 0.4375 +v 0.6563 0.9313 0.75 +v 0.6563 0.9313 0.4375 +v 0.6563 1.0563 0.75 +v 0.6563 1.0563 0.4375 +v 0.9063 1.0563 0.4375 +v 0.9063 1.0563 0.75 +v 0.6563 0.9313 0.625 +v 0.9063 0.9313 0.625 +v 0.9063 1.2438 0.625 +v 0.6563 1.2438 0.625 +v 0.8438 1.0563 0.4375 +v 0.8438 1.2438 0.4375 +v 0.8438 1.2438 0.625 +v 0.8438 1.2438 0.75 +v 0.8438 1.0563 0.75 +v 0.8438 0.9313 0.75 +v 0.8438 0.9313 0.625 +v 0.8438 0.9313 0.4375 +v 0.6563 1.2438 0.75 +v 0.6563 1.2438 0.4375 +v 0.6563 0.9313 0.75 +v 0.6563 0.9313 0.4375 +v 0.6563 1.0563 0.75 +v 0.6563 1.0563 0.4375 +v 0.6563 1.0563 0.625 +v 0.6563 0.9313 0.625 +v 0.6563 1.2438 0.625 +v 0.9063 1.2438 0.4375 +v 0.9063 1.2438 0.75 +v 0.9063 0.9313 0.4375 +v 0.9063 0.9313 0.75 +v 0.9063 1.0563 0.4375 +v 0.9063 1.0563 0.75 +v 0.9063 1.0563 0.5625 +v 0.9063 0.9313 0.5625 +v 0.9063 1.2438 0.5625 +vt 0.75 0.5313 +vt 0.8438 0.5313 +vt 0.8438 0.625 vt 0.75 0.625 vt 0.75 0.5 -vt 0.84375 0.5 -vt 0.84375 0.59375 -vt 0.75 0.59375 -vt 0.75 0.53125 -vt 0.84375 0.53125 -vt 0.84375 0.625 +vt 0.8438 0.5 +vt 0.8438 0.5938 +vt 0.75 0.5938 +vt 0.75 0.5313 +vt 0.8438 0.5313 +vt 0.8438 0.625 vt 0.75 0.625 vt 1 0.625 -vt 0.90625 0.625 -vt 0.90625 0.53125 -vt 1 0.53125 +vt 0.9063 0.625 +vt 0.9063 0.5313 +vt 1 0.5313 vt 0.75 0.5625 -vt 0.84375 0.5625 -vt 0.84375 0.5 +vt 0.8438 0.5625 +vt 0.8438 0.5 vt 0.75 0.5 vt 1 0.5 -vt 0.90625 0.5 -vt 0.90625 0.5625 +vt 0.9063 0.5 +vt 0.9063 0.5625 vt 1 0.5625 vt 0.75 0.5625 -vt 0.84375 0.5625 -vt 0.84375 0.5 +vt 0.8438 0.5625 +vt 0.8438 0.5 vt 0.75 0.5 -vt 0.78125 0.5 +vt 0.7813 0.5 vt 0.875 0.5 vt 0.875 0.5625 -vt 0.78125 0.5625 -vt 0.96875 0.53125 -vt 1 0.53125 +vt 0.7813 0.5625 +vt 0.9688 0.5313 +vt 1 0.5313 vt 1 0.625 -vt 0.96875 0.625 +vt 0.9688 0.625 vt 1 0.5 -vt 0.96875 0.5 -vt 0.96875 0.59375 -vt 1 0.59375 +vt 0.9688 0.5 +vt 0.9688 0.5938 +vt 1 0.5938 vt 1 0.5625 -vt 0.96875 0.5625 -vt 0.96875 0.625 +vt 0.9688 0.5625 +vt 0.9688 0.625 vt 1 0.625 vt 1 0.625 -vt 0.96875 0.625 -vt 0.96875 0.53125 -vt 1 0.53125 +vt 0.9688 0.625 +vt 0.9688 0.5313 +vt 1 0.5313 vt 1 0.5625 -vt 0.96875 0.5625 -vt 0.96875 0.5 +vt 0.9688 0.5625 +vt 0.9688 0.5 vt 1 0.5 vt 1 0.625 -vt 0.96875 0.625 -vt 0.96875 0.5625 +vt 0.9688 0.625 +vt 0.9688 0.5625 vt 1 0.5625 -vt 1 0.59375 -vt 0.96875 0.59375 -vt 0.96875 0.5 +vt 1 0.5938 +vt 0.9688 0.5938 +vt 0.9688 0.5 vt 1 0.5 -vt 0.96875 0.5 +vt 0.9688 0.5 vt 1 0.5 vt 1 0.5625 -vt 0.96875 0.5625 -vt 0.75 0.53125 -vt 0.84375 0.53125 -vt 0.84375 0.625 +vt 0.9688 0.5625 +vt 0.75 0.5313 +vt 0.8438 0.5313 +vt 0.8438 0.625 vt 0.75 0.625 vt 1 0.5 -vt 0.90625 0.5 -vt 0.90625 0.5625 +vt 0.9063 0.5 +vt 0.9063 0.5625 vt 1 0.5625 vt 1 0.5625 vt 0.9375 0.5625 @@ -15659,15 +13854,15 @@ vt 0.9375 0.5 vt 1 0.5 vt 0.75 0.625 vt 0.8125 0.625 -vt 0.8125 0.53125 -vt 0.75 0.53125 -vt 0.75 0.53125 -vt 0.84375 0.53125 -vt 0.84375 0.625 +vt 0.8125 0.5313 +vt 0.75 0.5313 +vt 0.75 0.5313 +vt 0.8438 0.5313 +vt 0.8438 0.625 vt 0.75 0.625 vt 1 0.5 -vt 0.90625 0.5 -vt 0.90625 0.5625 +vt 0.9063 0.5 +vt 0.9063 0.5625 vt 1 0.5625 vt 1 0.5625 vt 0.9375 0.5625 @@ -15675,8 +13870,8 @@ vt 0.9375 0.5 vt 1 0.5 vt 0.75 0.625 vt 0.8125 0.625 -vt 0.8125 0.53125 -vt 0.75 0.53125 +vt 0.8125 0.5313 +vt 0.75 0.5313 vn 0 1 0 vn 0 -1 0 vn 0 0 1 @@ -15702,168 +13897,144 @@ vn 1 0 0 vn 1 0 0 vn 1 0 0 usemtl tracks14_12 -f 2604/7217/1805 2607/7218/1805 2606/7219/1805 -f 2604/7217/1805 2606/7219/1805 2594/7220/1805 -f 2596/7221/1806 2612/7222/1806 2611/7223/1806 -f 2596/7221/1806 2611/7223/1806 2601/7224/1806 -f 2597/7225/1807 2609/7226/1807 2608/7227/1807 -f 2597/7225/1807 2608/7227/1807 2593/7228/1807 -f 2594/7229/1808 2606/7230/1808 2605/7231/1808 -f 2594/7229/1808 2605/7231/1808 2598/7232/1808 -f 2598/7233/1809 2605/7234/1809 2612/7235/1809 -f 2598/7233/1809 2612/7235/1809 2596/7236/1809 -f 2595/7237/1810 2610/7238/1810 2609/7239/1810 -f 2595/7237/1810 2609/7239/1810 2597/7240/1810 -f 2601/7241/1811 2611/7242/1811 2610/7243/1811 -f 2601/7241/1811 2610/7243/1811 2595/7244/1811 -f 2593/7245/1812 2608/7246/1812 2607/7247/1812 -f 2593/7245/1812 2607/7247/1812 2604/7248/1812 -f 2599/7249/1813 2605/7250/1813 2606/7251/1813 -f 2599/7249/1813 2606/7251/1813 2590/7252/1813 -f 2590/7253/1814 2606/7254/1814 2607/7255/1814 -f 2590/7253/1814 2607/7255/1814 2603/7256/1814 -f 2603/7257/1815 2607/7258/1815 2608/7259/1815 -f 2603/7257/1815 2608/7259/1815 2589/7260/1815 -f 2589/7261/1816 2608/7262/1816 2609/7263/1816 -f 2589/7261/1816 2609/7263/1816 2600/7264/1816 -f 2600/7265/1817 2609/7266/1817 2610/7267/1817 -f 2600/7265/1817 2610/7267/1817 2591/7268/1817 -f 2591/7269/1818 2610/7270/1818 2611/7271/1818 -f 2591/7269/1818 2611/7271/1818 2602/7272/1818 -f 2602/7273/1819 2611/7274/1819 2612/7275/1819 -f 2602/7273/1819 2612/7275/1819 2592/7276/1819 -f 2592/7277/1820 2612/7278/1820 2605/7279/1820 -f 2592/7277/1820 2605/7279/1820 2599/7280/1820 -f 2618/7281/1821 2619/7282/1821 2621/7283/1821 -f 2618/7281/1821 2621/7283/1821 2614/7284/1821 -f 2616/7285/1822 2620/7286/1822 2619/7287/1822 -f 2616/7285/1822 2619/7287/1822 2618/7288/1822 -f 2617/7289/1823 2619/7290/1823 2620/7291/1823 -f 2617/7289/1823 2620/7291/1823 2615/7292/1823 -f 2613/7293/1824 2621/7294/1824 2619/7295/1824 -f 2613/7293/1824 2619/7295/1824 2617/7296/1824 -f 2627/7297/1825 2628/7298/1825 2630/7299/1825 -f 2627/7297/1825 2630/7299/1825 2623/7300/1825 -f 2625/7301/1826 2629/7302/1826 2628/7303/1826 -f 2625/7301/1826 2628/7303/1826 2627/7304/1826 -f 2626/7305/1827 2628/7306/1827 2629/7307/1827 -f 2626/7305/1827 2629/7307/1827 2624/7308/1827 -f 2622/7309/1828 2630/7310/1828 2628/7311/1828 -f 2622/7309/1828 2628/7311/1828 2626/7312/1828 +f 2604/7217/1805 2607/7218/1805 2606/7219/1805 2594/7220/1805 +f 2596/7221/1806 2612/7222/1806 2611/7223/1806 2601/7224/1806 +f 2597/7225/1807 2609/7226/1807 2608/7227/1807 2593/7228/1807 +f 2594/7229/1808 2606/7230/1808 2605/7231/1808 2598/7232/1808 +f 2598/7233/1809 2605/7234/1809 2612/7235/1809 2596/7236/1809 +f 2595/7237/1810 2610/7238/1810 2609/7239/1810 2597/7240/1810 +f 2601/7241/1811 2611/7242/1811 2610/7243/1811 2595/7244/1811 +f 2593/7245/1812 2608/7246/1812 2607/7247/1812 2604/7248/1812 +f 2599/7249/1813 2605/7250/1813 2606/7251/1813 2590/7252/1813 +f 2590/7253/1814 2606/7254/1814 2607/7255/1814 2603/7256/1814 +f 2603/7257/1815 2607/7258/1815 2608/7259/1815 2589/7260/1815 +f 2589/7261/1816 2608/7262/1816 2609/7263/1816 2600/7264/1816 +f 2600/7265/1817 2609/7266/1817 2610/7267/1817 2591/7268/1817 +f 2591/7269/1818 2610/7270/1818 2611/7271/1818 2602/7272/1818 +f 2602/7273/1819 2611/7274/1819 2612/7275/1819 2592/7276/1819 +f 2592/7277/1820 2612/7278/1820 2605/7279/1820 2599/7280/1820 +f 2618/7281/1821 2619/7282/1821 2621/7283/1821 2614/7284/1821 +f 2616/7285/1822 2620/7286/1822 2619/7287/1822 2618/7288/1822 +f 2617/7289/1823 2619/7290/1823 2620/7291/1823 2615/7292/1823 +f 2613/7293/1824 2621/7294/1824 2619/7295/1824 2617/7296/1824 +f 2627/7297/1825 2628/7298/1825 2630/7299/1825 2623/7300/1825 +f 2625/7301/1826 2629/7302/1826 2628/7303/1826 2627/7304/1826 +f 2626/7305/1827 2628/7306/1827 2629/7307/1827 2624/7308/1827 +f 2622/7309/1828 2630/7310/1828 2628/7311/1828 2626/7312/1828 o smoll_whell4 -v 0.90625 1.24375 1.3125 -v 0.90625 1.24375 1 -v 0.90625 0.9312499999999999 1.3125 -v 0.90625 0.9312499999999999 1 -v 0.65625 1.24375 1.3125 -v 0.65625 1.24375 1 -v 0.65625 0.9312499999999999 1.3125 -v 0.65625 0.9312499999999999 1 -v 0.65625 1.05625 1.3125 -v 0.65625 1.05625 1 -v 0.90625 1.05625 1 -v 0.90625 1.05625 1.3125 -v 0.65625 0.9312499999999999 1.1875 -v 0.90625 0.9312499999999999 1.1875 -v 0.90625 1.24375 1.1875 -v 0.65625 1.24375 1.1875 -v 0.84375 1.05625 1 -v 0.84375 1.24375 1 -v 0.84375 1.24375 1.1875 -v 0.84375 1.24375 1.3125 -v 0.84375 1.05625 1.3125 -v 0.84375 0.9312499999999999 1.3125 -v 0.84375 0.9312499999999999 1.1875 -v 0.84375 0.9312499999999999 1 -v 0.65625 1.24375 1.3125 -v 0.65625 1.24375 1 -v 0.65625 0.9312499999999999 1.3125 -v 0.65625 0.9312499999999999 1 -v 0.65625 1.05625 1.3125 -v 0.65625 1.05625 1 -v 0.65625 1.05625 1.1875 -v 0.65625 0.9312499999999999 1.1875 -v 0.65625 1.24375 1.1875 -v 0.90625 1.24375 1 -v 0.90625 1.24375 1.3125 -v 0.90625 0.9312499999999999 1 -v 0.90625 0.9312499999999999 1.3125 -v 0.90625 1.05625 1 -v 0.90625 1.05625 1.3125 -v 0.90625 1.05625 1.125 -v 0.90625 0.9312499999999999 1.125 -v 0.90625 1.24375 1.125 -vt 0.75 0.53125 -vt 0.84375 0.53125 -vt 0.84375 0.625 +v 0.9063 1.2438 1.3125 +v 0.9063 1.2438 1 +v 0.9063 0.9313 1.3125 +v 0.9063 0.9313 1 +v 0.6563 1.2438 1.3125 +v 0.6563 1.2438 1 +v 0.6563 0.9313 1.3125 +v 0.6563 0.9313 1 +v 0.6563 1.0563 1.3125 +v 0.6563 1.0563 1 +v 0.9063 1.0563 1 +v 0.9063 1.0563 1.3125 +v 0.6563 0.9313 1.1875 +v 0.9063 0.9313 1.1875 +v 0.9063 1.2438 1.1875 +v 0.6563 1.2438 1.1875 +v 0.8438 1.0563 1 +v 0.8438 1.2438 1 +v 0.8438 1.2438 1.1875 +v 0.8438 1.2438 1.3125 +v 0.8438 1.0563 1.3125 +v 0.8438 0.9313 1.3125 +v 0.8438 0.9313 1.1875 +v 0.8438 0.9313 1 +v 0.6563 1.2438 1.3125 +v 0.6563 1.2438 1 +v 0.6563 0.9313 1.3125 +v 0.6563 0.9313 1 +v 0.6563 1.0563 1.3125 +v 0.6563 1.0563 1 +v 0.6563 1.0563 1.1875 +v 0.6563 0.9313 1.1875 +v 0.6563 1.2438 1.1875 +v 0.9063 1.2438 1 +v 0.9063 1.2438 1.3125 +v 0.9063 0.9313 1 +v 0.9063 0.9313 1.3125 +v 0.9063 1.0563 1 +v 0.9063 1.0563 1.3125 +v 0.9063 1.0563 1.125 +v 0.9063 0.9313 1.125 +v 0.9063 1.2438 1.125 +vt 0.75 0.5313 +vt 0.8438 0.5313 +vt 0.8438 0.625 vt 0.75 0.625 vt 0.75 0.5 -vt 0.84375 0.5 -vt 0.84375 0.59375 -vt 0.75 0.59375 -vt 0.75 0.53125 -vt 0.84375 0.53125 -vt 0.84375 0.625 +vt 0.8438 0.5 +vt 0.8438 0.5938 +vt 0.75 0.5938 +vt 0.75 0.5313 +vt 0.8438 0.5313 +vt 0.8438 0.625 vt 0.75 0.625 vt 1 0.625 -vt 0.90625 0.625 -vt 0.90625 0.53125 -vt 1 0.53125 +vt 0.9063 0.625 +vt 0.9063 0.5313 +vt 1 0.5313 vt 0.75 0.5625 -vt 0.84375 0.5625 -vt 0.84375 0.5 +vt 0.8438 0.5625 +vt 0.8438 0.5 vt 0.75 0.5 vt 1 0.5 -vt 0.90625 0.5 -vt 0.90625 0.5625 +vt 0.9063 0.5 +vt 0.9063 0.5625 vt 1 0.5625 vt 0.75 0.5625 -vt 0.84375 0.5625 -vt 0.84375 0.5 +vt 0.8438 0.5625 +vt 0.8438 0.5 vt 0.75 0.5 -vt 0.78125 0.5 +vt 0.7813 0.5 vt 0.875 0.5 vt 0.875 0.5625 -vt 0.78125 0.5625 -vt 0.96875 0.53125 -vt 1 0.53125 +vt 0.7813 0.5625 +vt 0.9688 0.5313 +vt 1 0.5313 vt 1 0.625 -vt 0.96875 0.625 +vt 0.9688 0.625 vt 1 0.5 -vt 0.96875 0.5 -vt 0.96875 0.59375 -vt 1 0.59375 +vt 0.9688 0.5 +vt 0.9688 0.5938 +vt 1 0.5938 vt 1 0.5625 -vt 0.96875 0.5625 -vt 0.96875 0.625 +vt 0.9688 0.5625 +vt 0.9688 0.625 vt 1 0.625 vt 1 0.625 -vt 0.96875 0.625 -vt 0.96875 0.53125 -vt 1 0.53125 +vt 0.9688 0.625 +vt 0.9688 0.5313 +vt 1 0.5313 vt 1 0.5625 -vt 0.96875 0.5625 -vt 0.96875 0.5 +vt 0.9688 0.5625 +vt 0.9688 0.5 vt 1 0.5 vt 1 0.625 -vt 0.96875 0.625 -vt 0.96875 0.5625 +vt 0.9688 0.625 +vt 0.9688 0.5625 vt 1 0.5625 -vt 1 0.59375 -vt 0.96875 0.59375 -vt 0.96875 0.5 +vt 1 0.5938 +vt 0.9688 0.5938 +vt 0.9688 0.5 vt 1 0.5 -vt 0.96875 0.5 +vt 0.9688 0.5 vt 1 0.5 vt 1 0.5625 -vt 0.96875 0.5625 -vt 0.75 0.53125 -vt 0.84375 0.53125 -vt 0.84375 0.625 +vt 0.9688 0.5625 +vt 0.75 0.5313 +vt 0.8438 0.5313 +vt 0.8438 0.625 vt 0.75 0.625 vt 1 0.5 -vt 0.90625 0.5 -vt 0.90625 0.5625 +vt 0.9063 0.5 +vt 0.9063 0.5625 vt 1 0.5625 vt 1 0.5625 vt 0.9375 0.5625 @@ -15871,15 +14042,15 @@ vt 0.9375 0.5 vt 1 0.5 vt 0.75 0.625 vt 0.8125 0.625 -vt 0.8125 0.53125 -vt 0.75 0.53125 -vt 0.75 0.53125 -vt 0.84375 0.53125 -vt 0.84375 0.625 +vt 0.8125 0.5313 +vt 0.75 0.5313 +vt 0.75 0.5313 +vt 0.8438 0.5313 +vt 0.8438 0.625 vt 0.75 0.625 vt 1 0.5 -vt 0.90625 0.5 -vt 0.90625 0.5625 +vt 0.9063 0.5 +vt 0.9063 0.5625 vt 1 0.5625 vt 1 0.5625 vt 0.9375 0.5625 @@ -15887,8 +14058,8 @@ vt 0.9375 0.5 vt 1 0.5 vt 0.75 0.625 vt 0.8125 0.625 -vt 0.8125 0.53125 -vt 0.75 0.53125 +vt 0.8125 0.5313 +vt 0.75 0.5313 vn 0 1 0 vn 0 -1 0 vn 0 0 1 @@ -15914,51 +14085,27 @@ vn 1 0 0 vn 1 0 0 vn 1 0 0 usemtl tracks14_12 -f 2646/7313/1829 2649/7314/1829 2648/7315/1829 -f 2646/7313/1829 2648/7315/1829 2636/7316/1829 -f 2638/7317/1830 2654/7318/1830 2653/7319/1830 -f 2638/7317/1830 2653/7319/1830 2643/7320/1830 -f 2639/7321/1831 2651/7322/1831 2650/7323/1831 -f 2639/7321/1831 2650/7323/1831 2635/7324/1831 -f 2636/7325/1832 2648/7326/1832 2647/7327/1832 -f 2636/7325/1832 2647/7327/1832 2640/7328/1832 -f 2640/7329/1833 2647/7330/1833 2654/7331/1833 -f 2640/7329/1833 2654/7331/1833 2638/7332/1833 -f 2637/7333/1834 2652/7334/1834 2651/7335/1834 -f 2637/7333/1834 2651/7335/1834 2639/7336/1834 -f 2643/7337/1835 2653/7338/1835 2652/7339/1835 -f 2643/7337/1835 2652/7339/1835 2637/7340/1835 -f 2635/7341/1836 2650/7342/1836 2649/7343/1836 -f 2635/7341/1836 2649/7343/1836 2646/7344/1836 -f 2641/7345/1837 2647/7346/1837 2648/7347/1837 -f 2641/7345/1837 2648/7347/1837 2632/7348/1837 -f 2632/7349/1838 2648/7350/1838 2649/7351/1838 -f 2632/7349/1838 2649/7351/1838 2645/7352/1838 -f 2645/7353/1839 2649/7354/1839 2650/7355/1839 -f 2645/7353/1839 2650/7355/1839 2631/7356/1839 -f 2631/7357/1840 2650/7358/1840 2651/7359/1840 -f 2631/7357/1840 2651/7359/1840 2642/7360/1840 -f 2642/7361/1841 2651/7362/1841 2652/7363/1841 -f 2642/7361/1841 2652/7363/1841 2633/7364/1841 -f 2633/7365/1842 2652/7366/1842 2653/7367/1842 -f 2633/7365/1842 2653/7367/1842 2644/7368/1842 -f 2644/7369/1843 2653/7370/1843 2654/7371/1843 -f 2644/7369/1843 2654/7371/1843 2634/7372/1843 -f 2634/7373/1844 2654/7374/1844 2647/7375/1844 -f 2634/7373/1844 2647/7375/1844 2641/7376/1844 -f 2660/7377/1845 2661/7378/1845 2663/7379/1845 -f 2660/7377/1845 2663/7379/1845 2656/7380/1845 -f 2658/7381/1846 2662/7382/1846 2661/7383/1846 -f 2658/7381/1846 2661/7383/1846 2660/7384/1846 -f 2659/7385/1847 2661/7386/1847 2662/7387/1847 -f 2659/7385/1847 2662/7387/1847 2657/7388/1847 -f 2655/7389/1848 2663/7390/1848 2661/7391/1848 -f 2655/7389/1848 2661/7391/1848 2659/7392/1848 -f 2669/7393/1849 2670/7394/1849 2672/7395/1849 -f 2669/7393/1849 2672/7395/1849 2665/7396/1849 -f 2667/7397/1850 2671/7398/1850 2670/7399/1850 -f 2667/7397/1850 2670/7399/1850 2669/7400/1850 -f 2668/7401/1851 2670/7402/1851 2671/7403/1851 -f 2668/7401/1851 2671/7403/1851 2666/7404/1851 -f 2664/7405/1852 2672/7406/1852 2670/7407/1852 -f 2664/7405/1852 2670/7407/1852 2668/7408/1852 \ No newline at end of file +f 2646/7313/1829 2649/7314/1829 2648/7315/1829 2636/7316/1829 +f 2638/7317/1830 2654/7318/1830 2653/7319/1830 2643/7320/1830 +f 2639/7321/1831 2651/7322/1831 2650/7323/1831 2635/7324/1831 +f 2636/7325/1832 2648/7326/1832 2647/7327/1832 2640/7328/1832 +f 2640/7329/1833 2647/7330/1833 2654/7331/1833 2638/7332/1833 +f 2637/7333/1834 2652/7334/1834 2651/7335/1834 2639/7336/1834 +f 2643/7337/1835 2653/7338/1835 2652/7339/1835 2637/7340/1835 +f 2635/7341/1836 2650/7342/1836 2649/7343/1836 2646/7344/1836 +f 2641/7345/1837 2647/7346/1837 2648/7347/1837 2632/7348/1837 +f 2632/7349/1838 2648/7350/1838 2649/7351/1838 2645/7352/1838 +f 2645/7353/1839 2649/7354/1839 2650/7355/1839 2631/7356/1839 +f 2631/7357/1840 2650/7358/1840 2651/7359/1840 2642/7360/1840 +f 2642/7361/1841 2651/7362/1841 2652/7363/1841 2633/7364/1841 +f 2633/7365/1842 2652/7366/1842 2653/7367/1842 2644/7368/1842 +f 2644/7369/1843 2653/7370/1843 2654/7371/1843 2634/7372/1843 +f 2634/7373/1844 2654/7374/1844 2647/7375/1844 2641/7376/1844 +f 2660/7377/1845 2661/7378/1845 2663/7379/1845 2656/7380/1845 +f 2658/7381/1846 2662/7382/1846 2661/7383/1846 2660/7384/1846 +f 2659/7385/1847 2661/7386/1847 2662/7387/1847 2657/7388/1847 +f 2655/7389/1848 2663/7390/1848 2661/7391/1848 2659/7392/1848 +f 2669/7393/1849 2670/7394/1849 2672/7395/1849 2665/7396/1849 +f 2667/7397/1850 2671/7398/1850 2670/7399/1850 2669/7400/1850 +f 2668/7401/1851 2670/7402/1851 2671/7403/1851 2666/7404/1851 +f 2664/7405/1852 2672/7406/1852 2670/7407/1852 2668/7408/1852 \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/sounds/weapons/weapon_placed/weapon_placed0.ogg b/src/main/resources/assets/immersiveintelligence/sounds/weapons/weapon_placed/weapon_placed0.ogg new file mode 100644 index 0000000000000000000000000000000000000000..fb5234c17adc1de8af1802b56a65f14e3628e7d9 GIT binary patch literal 126730 zcmce;dt6#qx;MVLii#Ex2pW?D-ViYb6^q7p5W%QH0}2F9(g8F^iOHxjPLgTQ4^a^T zjT*H`OpaHAs3|03ZtV;z7<02p)WkZIsnOh<%p`5vX?teQdADghXWsMseBSr-`{%bl zo3+=o*JbbZeV%8nXFY4_wmp0D04VTt!214_xD`=Bf^39T|E5w^dSLAlRCDR4oP9k$ zZxZJr+tzCSGpyBwfK=&+t0P$cfBo+v5B5__319(vX?e+}ZIye-Wu+?FoA$|>%y_a^_+@7(P@-iFE?Tubip@}v9OGHj6A^-p!(9nFF`yXYhXOs4j zqM9pvl1g(pr^r4A@p6*ykWvz58dQBTxbP2(bSEH-l1-&s~dDdWwz&Mh&5r zGn7-^m40+vkJc}4hFmL*dpd9|C;6$Zzd89CZR{q`KX&YPmXNg|D?I%fa@U6kW|JOw z{~YOeHw|&hJ2eEI( z3-Tn{QZO9cwY_@x-RgsPt3S#&*Y7z0QU3Y*9gFq5{#LIf>3+Vx|LDuVtzB=rPKE$I zVM(2<(S6jAzLlgtSe%Md;;ShPN_d%YlT; z2U5UmOBMf0yYR+q;ak5jVU6toz-5JcD?+b;XynGuRkF7qc<=6k?7JWoYl!@xL(Lm` z0XsrDQQWE4pyFGUZ(z}Y&60XiY3QHc1QyWuJ|J6eTE4lF6li(aGlV}rH_<3L9(7^J zeEbau%VvXDL0(2*?eg|?-LxE-%|u%Ue@Y$39rqa>x(z-He%u{69jpY)mEN}a41FO7 z>*n9IJhENDgQ>>$<58{)lAqf9SuBP==$@TOx)0W9Tspq@g6}Rc^+QqjUvBuWJ^P>H z!v*=KTqI4O(2_rDMyl`>E9Kb6s-uC&dRQ~j0~?!~)3b(ZMY+LIgH_r$JtqS|9p;S` z{}R0s<)5T@pv^$PN;`W!?iyn)8kw3+{>m|hNkg+hDQ2)iDQv&=)s>f3S=s|s3jE{{6Y-agJ0hL=*zoJzh0;NpMv#I%>h8Ase7Z7?J5)Na(8VG&-W(= z|Drh+_{*)KS6aijo(a#s&A9P(!nSV`ZUqU%3E6psUAG7a=ZL%W5_iq9ch5<8FI4aT zVtn_Gb06i8|Ew@Ssm+&n5B`hhtf>e!sd+V{4gTMn(?e@s;WUS3wuR@nMIP?l(`Xs$ zI{9>{&+mU|PKn`^*>Fm4c&u-xHFlOZTI?74%C4UN>f-sSF1%P;&&8;s2sJ zZdPa-s7+@W+28!s$M@du(zoR`|-gdk8dS_vkD{-{1JJ*lo+Un0|AWThc{+^ozezY$i`C)oz}*Up9cv} zMjH5Y3B8t1>tQNLTA~a>F`V>;lQ6?VXfspxQIG z#b;ZJ4GA|A8v9Bo6Jl?GWTfR6@;$L+t*$Undg1g}lLz0sC6V_1Hwk`Q#>wKf!ljmI zoM5i5w7|0GC$i)XdBpm}E}WBg_1SZG-L3!XNZ-&!u&G9?y;2I2;JkZNcW_Fu^D9Uut+8i)^|0fMe_K?orl8UPqU0p5Lh<7H4azDWTk*YfCa z_?0stoXUJlq~T@)2w;ijaU*qY<^%jf!CTqQc6n&enh^__q?Wk3Gm} zvmQSA7=+JG&s-D16tMc7MA})D54PJ^VzJvVI@TV8dI!!}B^GOAAI)O5U)+?C{S9A? z&(4$XTK99wXBW?)Q?|W%bobzzLGix@a9j@MfMXshH7Zz2RQCI>+o<_PpfoH!%WGEp zWkp9M7*eAn+EKiWp@H_yj9Ay5I9fC~U_}g$$qKFx4BW}x+tof_uy+&y955g7=imFL zUmF3Swk3DXSP*1HPm>NbQwQ*crlc*{Tm$QIcYizGOFA$s&gxK^k{;6rvslyS1MRt> zWpO$oB;Xpa3WIGKljW*vE*= zP6h}R2+Fkz#E54Z4b>2fJ(Aa`)cI%}R=j7`$VN4z3ktWsR~s;*h=V?FD;h8!^1B zQSV}R5T&lY!01ehDvXYHkqQswOy}mRS<{cY^G>^ng*QM0Z0FwC=>mU%TT%`Hn;pu7 zb;tUgZjfD2;4lERwYo?jCeGPYWUKWTui03H~ch;lsH-_7R**Df((&INK z95@NCk>E_YMuOJVS~bupfvySodO>0o$(O#?M+`V*kfz!XfSroy@S{wVtJZoUMS;-N zf!`Sm8h$8BJJ``%U=h?>&y4nZ5hy!@cM7Uvt8%k4hg_uoc4{5?oue+&39z?qU^TFN zron;v0uw9oaS;P7tTH*lNqO%m*yYh1Nso8#jUFfM-8Y+b>UU+VJMz8Yl>P5JjH7EX zFb|glnk+|!u4CZr zel8aQz6dm~2m`(dY>)OPW32&@#PQx_ti5QB{ON6PQeadk0vr7$ zgBDSTTYJ%3xi=Xly^V^#1>23bKe;AE>z%l#a{Y6D$ja_C{Qg__1n}0g6rqp#Utm%-wvljr(pHM!4 z2NC8wbQT@cbp90_jm_w#3N?7F$)G1a0s+55;gjg;zyk1l=rzjetJfh zFh`Ut0VhE)V1V}lpp8JLTDp>&1CPGdf@#IJ;f@8h<3Tfx`(`Z;V7LGj3Mvd3)}~S@ z^rtnu8-#8xtgYGCa@l`~>c%_A*VgP@@OK;hU05UDuX|ODIP>De^5@Jyk8l%DzFpyJ zS~zW0PS|wIW#YEyJZQs+yhJ0mIbw(IC@levrw2xHhnLcl*Kr`U^h2{@bIFl)JgT?G4;kgj|0; z?0%!6=JJE!fvf(!zn*Np7T=gc{ruxgSDr>4|4YNh2>9iS_r6m%qH@0D>vAG!Eg;*ySK6QK!Wr=!kj2*>+tUOJKFgm(e0anmWtxl zF%Lnv@c!=Nga*8ZTTHKVe?M{vlivU155l+pqloruPod#8voG4v-%&zT0xKzdelr>K z?@iZCkYAnHF&qVD@3{9gVL38$)YFry^rd#N-@919l@ERKu5SqATzO+g&p#*=n$_d# zbtxd{JX$yRTBj2l4zAI&ByI2xtcHX9R@>Qs~wJUgn z|En9%;n6D^<@PC$Iz%@21EA`$DGjlP8%!ZTRuwOH#j6fNXM60ChF+ant7Hqj_~%J= z8?M&vY`Zewq%vFc0}EsU%vfz!V*r|s5WW2w^P~BZd}vWo*S%Z2(XgCogr?p}B{tOh zV*DU{;}%GrN&yX2U^O*>0Vif?AP_G=tN23S0BR(YgBzN6-)m z2j39&>Bo^ z2*nS2NRxunV}%Hh+0N*-r^7`&1oUJ#9io&@wFjFcmq}tQil#MaTCq*Uh~-1_k-Fu^ zL+5R%qiDKBF}ocvz-s0o={=K;%+?;=yc$R=fb`u)VSSe=qy`9zhlE@7T=}vm7_+*w z7DyuR`Mvz$&fuUk{h`!#R0V{%z+ytS_Dm`{kqf!Vgj#Gt=6NPHS(LSfYUKKJNM}w= zpXH=&5d?p13iUm32z~YPBI50%b*rt}edCGmxNP}(r7tJPwk`iioE67K<8Mz4(d~+_ z>u!s+7NK2|yKa~Q$s@Tx7XS4l-q|mH3{!ny6|#Ak5)J|%?n;ymn$P4q@keH6MS#)jm**Ke9b~sq$>lc%qU5|~C ztulIiL+TM`M1pUT#cwFOh8kv_aK|EQT0=T0uW4A1x+?5;BvTEY_>tTh)DoEuX1bmfJP_FM138c6A zFSw~pJpQ;eVCpn^MIw#u@99&sBxTrQ1qVQ%$K-2|CC-Mh%n+=a^Df zz;G|Umf%SUz&@w`Lu74{;dht$UBZZh&CLc8{z2GI; z`xq?2J|xL%yT^QPD-h-}v~-(Eseq(1r4!AiB&3-*qE42Z*11Atc_Yc>ScU00%pK$NPZD_#SJ2kgotVSZ5NsDYiu3-N%mcw61Jg<}%4fY#pxbl|zC6$~9RSUUbJ2k7mkTDhWAuZ2l)~ivD6YW zk>$Ak#mE^$DkS8@)!potCc|j4^URP$_QkQ&kwcmesTYc)$ulV!M>LR;S_nB7z11($ z`_1Xl@5`rs2mFxCGN`%AVwfOzga@3BYd4o))1`LgKP?Kc;q}JRw5bv1P_vofJflI7 zhB1OUM-OGWn;cw;XuirxoBgcFt%+am&?nG`F8bxS*{QBS@f*e%@+=yhi&AmvDb%2$ zwghueB<2|>CjFkbC?PdR*>kZ!9>ohA#KqS@0jE_~&%=$iDlFAvnA7$}WNwu_dy5+{9bTBA$LYYw1ayo} z8KTac>$8#)W9W<1pcMc?J1r|u$koFkR#f7giY=(}7_`yPJalWRjbhbGg;V<{`b-Ov z#Niu;0HabN#a{BNC&tJIc@f&fL|{`LVVr^qiQ9uI5>BambW2PCKJVVo0)2%1=>*Xw z#JoCQfF}6UiI-Fb^IB!Il7*havqw~UUT`QN8cQcO`RQs+(fXQu4r8`>m=al?#$pLm z=gW>K%^l>H<;1ELXNN6Rn3~0qOC;G-n-YhWFsTnqtN>UJy<$=72w4mWVo3s~9P1yM zb@wFye71!H_d!iJR;0TdE6|7>t+@R1E+DVSgnemu zLt2L)h*Aol9BZXO51fHE_;rW%D<(2)NLRJK=p6lO45N%Y_w6O+8)wwm0sK5A8m=F`|fhi2u>^`;? za~pOFib$&HG?7r9=>$x0c*R@D+N>-*T{JXc%qzuZ-j3FL28_ODO7|weOe$Te*-sK8 zn+Bq5GPj>|9>3r7NAzvjJy8|hy@3nQS}cZi@DpnTg>7T(!hj^yYf?wpp6jgUjs9Vm z{h^pj<`vT4MCbP?X!@Kq20#2nkv+a!ay5l6jJ)3KE!sD@YL9x zo0=5fX-7z(S!XYedUSlePbHocu|^CFzbGF+EM+r`oGuaEs>DijU^; zSWy3?6IJ#m)v$E|vqQ+=_jcKWwz1TvfOu4TluqiAu+J&XI!m9-Sl|tm64%kMp21|M zKRBZ>tMyBuXm{xZToHd%&00vm<-U&&+$CtFZ4C*`U_YA#-(OGC33OUMUn-% z?EU?!cSS7WRO3x&uueW|wP+hv@i&yyD(od`_TK#KXCl?HSoYRhsDkvUT`DFV7YKc5 zg?Uq=2?wc~9UZF*W@Cp7K!wiB{$2iXjT|mLJK}q%nJ{dt0fn@6hVx*gxmV>{ogW%{ zXeh`p8>4>OnO0E$9%f7v$HxQ1ib7tEKpll( z0`w%3j!833(qu8E<#Ns4`sBKi$rgJ*E(n7W^^IkHN)=arYcj>}_nmR13m8~pIhh~i zr}xXbO?3o5S{8){4!-`kL*0Q>2AZrMj(r~~tN7NA3ZsxHEg8UWzRNbng#!wp5rdp| zGjp~z9-&f~r+`i^~Y2^xK7EOrK<$Rnvzy^4n48z zEq@xLJWsCKj!K3gFHeN21FlU}I#jU)yua`1jhqTyUBm>8n)P|nk5@4)(w;w^_i3(^ znS#r=;g32?M>}VvJLtNM@~wLr$N5=BJOm5(=sd;?zslohCCDNKy8CLXxZOqFZ-}BiAH=MZfZ>Pea6q8>E z$JblW#N|KPTvTrk>A2t4+9nY{HK)T0pz%9L0z7Hq6S%ltsZm{3?`#magiQ93HPZ@5 zfYd*v7FyNBx>Cg4DTHFf>pgg0aU2bW;sey6Ka+>A?b|5I^i=KXNV~1BXzgnb+%Xiq478J^tuR-lrv=&OhQ>fF5qi zYx2*BD7a+M3j>BVhYSq7ANyPKuR{jUIoF&psmDJ){fW~)VqYUfYY|cSLjJCttBD&d zyrFJ#bpl(sIx1S?t z30@>lsm^lr1*2tsej0TH1K^W}9|ifMwd+=#q-Xvi#DIxDKC_zl+r+68o`Xf=K|bN|UEw4*f_s5H13-#SeBR>!eizUJTt1cY z=TVP{O1s$>7%~4b!GMOE{?S+H%ih+v0hWFlrxv~(pHs7+ON^v(b%R3x8?2M0YMn8( zT@Of$wVqI|TR(?4dfTT(Hb2zDmd@xtRiU19u!^})SLz(ykAOJjNo)eZmytCDDB3uM zb*3P+Gbqz#OhxAq=07>qWE6U?c9gX5?Ymenre^-oe-6xRe*i~z6Kui$1Oe4fQBks{ zI8*Fwc5+Bec5h2bFf`6*WwNEFCA5W-70DdV3Zmcch;e9kzT;cMyZO&ldC=815zWpG z_Dc<>?5>a;a)N-mhBZoYkhshnm^z9ivi6-%FCNN(YsZXaq)2VJEv^{UzEB&$VNYEwnYoRCvi7;$c5=qY)nVg+cNw$$ntu~B$`OJAdXnQ`xPKoAK3cVdM=OA$^svN^N)JqKOw^DeJc*>zwO7SB| zq|UyeK10A_1@ly-A+xBLk~!W9%oeQJCoQ&Fj(M#Cr#bwb8#5eD z9JUjt90ku8W3Pz_<>g~E)dUlcWqa=Qk?209a2lT~-hHl% zR*Cbn(ObkpY5N}879=qCysygMqe6gIw$Jfo{-l{$_bMw!52#f5qr z%I264m;0%6)vC~w-J#Mnxa3gEMl6((>T`vY!mATQO{$luKqMS4n8|3*u$7c+T3*7? zgqs*FnjQz2*Ir)6kWyKpjFbA6m#EZUO1EX;F=T}JiK3j@rJsOOF%)*@7Ew?Ikmkmg zV?KB*j86&2>NQ*3%Obzaepo0Uj;TS#a6Y%;;&MJcGR>hJ;a{G6MovkuZ-ci4Zk^AR zBVc5WcS`;qwxJ)K%}OZLoCXTa#pi8w#f3}i$@cGQ;Ra^bM5rFPAI`8BvN^GVZz3o50o>ODyqpRA(pRBBSyP6$a+i8mJNQSLBO zuWqY{tAWEab_Rda9EHVU_h?y{Ybrwh?pGDy5g3EFA6SpO0!!n4Bl?jB@yh z#*NL4AO=1l(~0G1Jqkkl_&%j^`*P?l$m&e%x(BA1EvbC168d9vm1AjH1XMRfQuQegd!*Tl4wF$MeB4|BCsLfG|qN@_?QwwhnftD^b&!*WAZev3-?U;dg32l1(9iJly z2O@*uEIHH7$cR8wxmp4yBjP-@E3V2HNA`teo@T~D0N8-mtOp{YPO?m{?H3WW;V3EQ zik||R-jA(IrhIoZ2>9@eA|UkuSNONx$B0FI?xWuwJkt{w271b)GZY6^9Kl^n-&g3b zp5wmo4Z$nApmwVV1#f9Dfb#+6MJ2&FDcws7cPi|dE{SDa=E4)qQ(D(^GHGxD?!k{$? zcw1wsA+iABQ+ZL-wF;#2{lUUk_NK3c2QGXI5NOv-*>jFXed%75bt$?G^rorw(PZM> zA|_~9RY;~MQcIILE<+wGR-uqHo{d%I+>yVij-maSAqk5{sSsI0evTj=kfhk3ocu>4 zze9xkjNgpu%+HuI9*`4#zG4-@fsHp0L=d!!oABc&F@7tqgj#%oJP+~8tlV0MoRFlZ6o0}< zqx9WQXCTLUg@P8bPBO&(xZcL#M=SQ83YoTogQ?hPNmQRww%Z9}R`*gjM>+-i^X@GX z8w_UcK`xhXOuLd1eMJvUtR&EQn@rsWwBYEIZ6?&#>{K*-Y+xsTFtV1(325e$aeCVF zYGV-!;|oveoL&}d+<OO!g6yEf;_<>tzA3{EZbIxF0 z=D+zriEy_z*}R{Ameoqbc@4@!XX^AF{M;QGX1#ES(mNfvxs0JxDp(Bq`#PmuD8*v? z`pU{A`}SpnvyL8;n1}T-A~xwL@VXF(ghSXkO@^D`%9n6LAcd!w>8B=1P_2SY%`vV6 zpl-k2P)Gy?JgssJL&4LMmY?b249HY4i%Ont^zqpge57%}fD~X2JkOtfe>D%JZ3RAj zk+7+7#_|Am0sDulkYlW(>?iQbu>GgJcN~TjvI*6&Iq{DLZg-Ax0W&2N7P6gA*93lt zF+in1N*Py^s94E+8pK&RM*t@SR8%s?tY zDQuK;xy%m%lqO>tisY3uPoDJKD#(t^#kV>5&?z2jj$1EHu(@kkfk+e&ab<=fnb683 zhHM@WIS(lM77k19B6vnlD!5T+wdXpMmwQwlvDls;qPH#Pa6-V zh^;IX(jUc4r{3jO?sngW5P`=w9EMr2i&!utTUYxS4bvx1&R`CEW#z|<`4X5q@ z4y6Q(2JBpdA0R>lOC8^6px;6f&rf&z;BD(@ia*HFn_q}FJB><$6t;Q6Gd4w6EfIz- zU(4q3Q)Bifn$D{_)g*9>j24}8iLkm)fSwQq&EZ`kYSk&bEkq_1c5)20wJ;*=(!yUn zw^U08xz}K*@lIbo^M$vHxiE3-R+R^09PK6R6neUPlkxsMXiQtfXsWZ~Igcn0!Qy}W zLIfIaaE6@V62N2n=nBFIf(0sFhG$qu5iy{@&)Rbao#$1Z3$8{-Rj*g~5T!9Hg49_0 z>5!jxNgx(ZZIZ2@Q^hROi1-I`AxnrA8tn!PXr>oqx8!+?v1vEPcMX4j=R51YV!41p z#1e+h*Bn$$PYyxM9??ZY9x7ejr;|EB)APG9J6)q-2@qS1@)yJ@(A1o&V(u=hHcI)~#s&4em^pWq zV^v{`?$b9b$hrk?s6gnoT5U?#B7r4v4Vw+1JA$qfH!YIR5-R(@N?zai+-6gnb^W!` zYOYUbqbajapU=sJ=+|6xCxKK{jXo_2JWcje&d}B4N`CzNxLK0VBPK?}#9;l0S%)-UU^)p~4lj}bxNRN)e^lWFMHAyI4<$~*&{!V_ zU$eU63)l3uY&-gfc<-;C}sCQ6aPo#A4+(9H0ah)=T`5FC>B6(^-W0z%Kqjpde{%m|}T=k;w5 zyv`{{a_i*5(>N!_fUDqBa_S#;oB7ik)~clOcZH$Y8dlNtVJakePiQbC3Rv!FiH{~F zD?CY+(|Uc44|%qy4?YWrK=y>r*{Y!OnR%{O(KeIW8-(UlTKT!m%-%416G9S#D1m2+ zg3$_-W~*){_>*pIzy+4bU0({Ad#G)h<=m>si7Ew7%v@jS2W@NCC<^^<*82%ED2Qmw zh{KwGEkt{|j3>@L-q!cb?;{DMc`hL2&a*8S4I2aQ`nKx-^JbVOV2XEZ;n`H#!EalW ze~hZn#Yf{aq!4-k69RnDpq{uJDZ?bi)IXR7nd)l718i~+fcPU+i0;a zQvBX+`u++BpKEsDn1lxn35S78xM!^+|S&#T2K~4>MjU<5tvxUSri)YSrhYwQrC`H;&5rf z$ZzbWdXjz7Oq`kqor!F>XrAaHozg3@!@Gn&sR1sd)B_(O4%hZ4n3H9!h5ZJlS+z8hc*#aG=- zG(=6xQ~W5HjS#*c)Q_Pv=`Hw%j+fzhc_rNsmy!e_oU|af)r3Xe^)Dx(jxLv@px9Tm zjmto@ehV9Ah=KyEdOj)@bqHSnibEwYQ}h`gC=fJ{LI7kMewGx|5wGBD(juTAAe7`- z6F@~`(!wt{lD^pqRVg+7C;+#z0ME$qgu(0ex4yw{5_&Kwxh8`nuS22I-vS_My@$F` z;2Zo!c&(GSkvKyO>>=^%efWsuH()rP2gM&>Ztbjt@=) zAdhk3$NE_0$keAc3^Z=#vwhSgJ`4F>2 zNDyQTfDTW1c3+%)gFBoyQf10$o9xLeHK!_XcF8jbLoPNLuViZZ43B=cC6gbO5lMzd z`x=Vv2Y9^;bO)pU_cdcT(-fa|7B$;E^h}~wa=ShpJX1hs!q8f%Ol!Ib`|Hc9ysoZB z0OOze8S%Yt+HZR=?M&T&{{W@vg6+?1Qp1Ux1 z-Z?Zdc4qpV^W2%UXF5-OeB#8|7$in97GM33FG}|P!H@J}r0f6LKXy_~xymbWm=~9# zcL=16MC&3|S6c9H_V9vTO-dvhy-d>>hqK6^-|up{KzA2gI8046*7WCX$qVg11mM!t<1PC?-p()Ba`OPWGM7}JaXsynDM{sW5vd)RXu8BzfM6)f5k*A%Q0c9`p^l| zNZ@4YOH{83Th2p41tMxz3ril6dJIL8b4A$U+)N-dDmw0CiNVx#H`~noV7CSh48-OE zGF;{o4Fffg3nB7Md1*fvb-P-;e*OB*;wi)EsNMUna0i;OH+3*0i=noAL5p>zXvRS+`Kk9{ETw@(BXOWipQ)?%+_lVz`?F zntb0gi4mo*NM>?YJs~w+$ZOsLXz!DctaQ})rUEo1ucni$;l4G?t?0QUNP5w@Qdcx2 zoZzVZCgI0&n9~>_$!EF|G8InsU5~XZ0HB+Ved=xcWc9TtWiR!1)B0aue%knj6yGPJ z%MqKMtQ%guQHq`$o7zOo3y4L}QLEXpYFB=Cl$FI7AnSF^Q zLrV{?m#uFm8VSc2S$MJhqg|Knc3c00GcYE6Lzd@>o@rRY!Y3(w{6s%3%cH2mG{-{) z)H;2?1AxlWtuuEEmy1j+zNX>`zD5DfOcRm;|6Dt_p0sMJNWXdf{QJ4XOmHRR`xH5H zN9xyk)AkPKo@U`<))X$pRnxQq+`^HHjB@YF4yR4tBO1t^84J$Y5IPcQ9bFVG^wEzI zT$|0-px}Jlcu1+GdhRrxUM*#V-mX;)xT~yiS#q|$t@k6|?w3<MXokzvbXdsoyQc=K0NJ5=54$TON9ugf%8OMBMs?g0nor&WCLgWcNykmk?7)shx zV`XJ(4KxY8rYk|z*w}>ux_@Xve)H^l1HT;lv7hBF*Fug{ziY&*lxI8T38Ng= zh7F}(l16po5+MUOc>GOGsTAMOM&6;{Tg-!)o}zqc+x4dS%T;`6`yT~c zhAS`G7seL#%6@C78S4U` zq)G!jXAu4b!?)M}B+zXMQig6!)0C3}apaPq^3ssDRB~tntr7qO+w-QJO@WN_{y+x5-VcVP1eKKg&x}NzJLm!3}rMQZOx}* zn4&4X-<6`CR<^(qIt|cJ=Dh5|L}`m2l+zFx_8VOeGF4 zm6C=*iFHnKvz_d0@t4d1o{h+B@|>-^};9R@9j5Ye0C zNT5c~lmfYm6o|Lbmjf5yui%7koFtQ=1G>gT=msu7H4NgL#AfrtS>X1eH|Ur>EKQon zgkI0;ZVnCf3}7?d;c2L|=k5{+XjFBuws&+C4wT&opnd6|g+93XX*~?35BavTC2dZ& zgHgR0owyjHHjE}kRxf#TVC;P(cHNIem%>oszp!pbq{fO}i=1T5f@A4wAUKkk6$SgO zX6ji9HOnI|0SfNE0@!eJxP8(>3*s4q@Oyt&^h19x-0f$NQ4 zRiRTqbbQ=e>au_=KQ&6o^Pf_yj3;tV$Tz@`AM>X3y<@`*cR;ZyxWRPF8N}m3KF4pU zoFw8NCkZKAs4dM;S}Y@`0n30PLM1{Sy{yVdPE#?a%lAc$>5nhIOKr<<2k_93Pp#9& zue1Qh31xY5s7a{=PbLub=nv-&PlJEB%HaSj3CPCa@Z%F*zEI?dUEOyT-5z@w-m-P@ zsd)F+jSxBg#3mWB6;!#0`+#K$%yc!vE`?0^YzlJxB zk&*!BYsnZ_z~lBOZ#a20Vk^#PI2CaA6r)~t$45p`I_p*x@OoBLPkd5lWzI|^A@<*m zwScKr6E58j{2k5qG*kc4-M{BWPp^I{<9*jx6Q)FSD%+53DoGw1>agIVpH%Tv zSC||#AITI2vEr~)D&WN(yD0sd^!f7!Ptx(Q%;u@wQZ!YfwZDDwRwf)jStv4te!3X` zroN~d<_f(su=~LDp@+>%NEx7NV>q2@?-z##zhaj zd+Pahe&Et~2eJlQ{%pD0l^S?ax&2q@iNN*j5jrR+M@iOF0bUwgB#I&!5P!>OZU&E^{e21vOkdChS0z4FRI8_lGF)*aaI=?x1 zNbe3MwCWLX__mBx!Idp!&1q!tnNSY1t19_;$<(hp$aqO)M@OGx_=@>ym1rm&JS07t zu{iU<^ryw~KeV{Xj=oR!_xu$uSs>rSm`@0^)9mV&Qd&|>m!+X>-FlbdM75Jp<_H-# z{irO+Hrht@UcAhxEG)=&7G%R(rfKv6#%y~RVFJdA)n2cDDh#Sn$H)G0vdR}(i#5-9 zmrL@|xAG{T>QMjmP6lfnQ0OTI(`LJy@?ncK4_33Hq_@`t@@lIfj zz&ciX{iADjmLHZ3<}2t2A6?T~ei)xpEfwqocY722RF>bD?ll_Ze)R^u!l;B#~3cRlptK&mER(g)`*de#=u_@}(0*K(j)w1JY>e;GP@m6mCZc2h#UMgpQ33 zpv1;PDI6+sx<8rg31ZQ5`Y9?WrWK`pB@Z1z@S&owoR}=7N}HWlB|0G5$A<`|dyc`$ zvdKv~YAa|lWsPv(1_lBe$4ulXcxiD+#TIU6O3<4F-ewEe zZ;mad(F4m0m>%$ejYFJzaL49(Cf^O8yE7IRDm;DLLQxZSgESpuvL) zGaPJTpd1qyo;%$x%`Dt)!z6~=Csrx&qc|+~t0)WT@`d}frx-aOy}A2aKiCkw8*iA$ zvz?3R#KnRDf8uiocCaCrewrz964JIi@}B!yOXY(0SgXDOF-P}P<&8tFzMz+HJ3IEI zsz9PiazFe2Q=tg67fEzgja03V?JmdF?Wo?+pa z`|CafBQ4*N79c^NmEc_jv5RxiQRq9RS{I7m9H?DFe`OGil29tWG+>XbkS@FD!Qn5_ zaL6l%=;8vkUkY(zRY~gMlc0ytb%Mwi816tFx0?c_!2vnE2E}KHYY}pGCrUrV?Gk3_ z8%sD4PSi4-0GX@`-9+!{j|p*IB=1Ljcq1W9^Sys%$mdn-F4bPu34lBZc*sF?gN0Jq zTqmZo=vRNgbzjZoxtBS^-4K8brG`Mk!|0(ouau;nVm?SaaQz65X`*(k?gz z4z$Rx9qB*9*PP}Zq4Fl{((ZkRs=86Kx<0%$7PTvW>3d|_Sw!#l^kBqsr1>YPRe5|=bw5b;g<4dw&VpAoGgrHkma=KH%aL#_J@8|3=}=EhQ;s5=<;^A$;~Ezf7z z-es-1hj$f-1-Gi~vP;o)yA`5d4b4uI22{Q~_O$KV1kTAZ>n9ZAP$GpF2Nb$BBupHC zwztv;{0pf6bliC>tDVxH)a?v-5U;^sS4bq>|s| z^{3HcEa=D$22xiXeXe+4F^ie7^$UwkP*K#5RdJkubSKM#QnSS_EYl}%?R0=ak1BPA z}FLI@!@5fC&YIuH><0-7k; zT5V5&1d)oBODt0DAUdsD?a_|T^mNY5JiF&S^E`RMUN3l&&)z$0{nzjR`+XM@xegP} z;-CWRI?w>8hMpC@Ai@D*$P_l5vxV)9L!b8Dzn)Ut$QMrdh$i4M2-oAlxX}APdRvI? zV_^3*tVw><$06q}9?NH~Jp|uXb=&<2)nbNS#j^LcwQRc&wES}&cHw(vBO$6U?b8Lw znV92Q$Ow2`>WiX9t;-UCY}O;)xP{w(5A@!)HF#rhL%BFPWP_g42NjWMW>%IXi6D?% z87k^s!gyUp?z49)N*}O+(|ndPPDj>5jR0bzukj0m3JgEO9W%F*;xk}j$RZ3Lvp&(` zL9Z!}^ofaWxw!3k>vOOzVz)|gvNrdp>$X==@C7Drau%TPnD%wOru1Xwslu9${nwD zte(iyDy8U>?Put3$ewC?7@tfj&5kH^m$R7+*MYr&3Pgo8zEQAPj*SaN1;eR?rnAyf zBK6cbPY7HmhKxH*V#5pK7Rng6L=&WnDHy|aW1O)N-h6%Fh&}|whC@3icr>vj26{S` zqEdn0egfV5g7v^U8WbY%a(`Sp=JkDrT4Ro&nLWe;Ru6qq$pxWcEMPLe~JsW}K-4z6J)a<$r*LV^#G?FovOEn1Iui-K-tNLyFK>1~GtPs|vjm`8Udam(N> zeVzP1SWC*DdMFm;1GdFN32dIVOFB3#?I!MwY5u<3k&qL00G()ObkwEfZL7ysugd z-R%vlCUse_TC)_gx8kj`ix-*~L+)+pKd)8Aza3djoWQlfkx3f*p2vM>gefV(t{Vxe zUxXNf^_nj&stROc#);JRD=FdQ2SUwp;l)%yP77O4J3Zg~#9n&~L@@mW7j#Yeoj&5@ z820DUop7yFCJF`XPsdfxf`jaP0)R#%?*RMbY6U-h4ON*QAPr?_VPZLMz z6~%92rxIAlbO0f&T&}F>ClPh37x2_^&{t5-dgL?XF6&SD?D?lFM>)A|xV<;mjdZ0^ zHi`K&s*x{0ltB~o=qu8#k-h1H)vWIpQmhy;)h4Tk; z{a|9+3g2UZn&{}TN1O-iQDwqBBpo}Utz{Jo$;|bGmA#}vAy=W^gKi!td$JF)sZq8g zru^L{;?Vq0#o5gT36GKEklg=I4+f5?xyM2j-Ibp^RsN$fws!U0d#|1zIxZdR>ZVfD zK5_SJvDOs#b@1b{F=tRuNOR(=17^+=#%&^I4enZk-0(X1pm|wpY6`NjDX+tgvzqPA zu5cJO#Ym*|-x3S*O=r(cs9~W~D`sU+r!MYrN#}t^2g&20B636e2l@llWS-b0Qd6;_ zUy!NR02j%;)v1oOy)5V?J##YVhCAt7Uo8=TUY7RKsDg)f0?8?1SYj6~jAOu*SNnE{0=uA#-ArtlC$hfG8=XC7z;FdVY?pL_A zO%xPD*E5lTd{ci-MYkgiwsupmQb*@ZIq7Tg)7PU<6rZ|YmYmevV z<~9@}G1Ir8*BBOF)l+$np?>SlP@28^=w+ATjsI#GEA?wytIPaoZTX!Hk#`c_FxI2Q zltW3Pphqy$u;g6o`_kSZFO^W!D(Zrx-_|Is&AWUGsi0SsY6<9{eY1Hiwoey80j+sv zp!pgWGQYzgctF@;fmhj;%PPY}HId_NIIl9*kT}7ChYEZTOjKdMxg9stL);(?X)h+O zu9ESqx)5DTJ}`*2&sg#lXjTdXJr2~YX(s>!A;&WxPrc5f?JsNJd}RN}@q(ZCdzYXu zhq3l+TAPBOn^LspQty}-yLk7u2Ia^yrkX@!Y{o@SLZXFHV%{YxE@f&sP^@@1qcEbu z-y@O&C>%@26|$9Gz;mQ-+{fZxW{}>hpy6A2lw4;&tAaPD)T!TI(^}P**)egYdbZ2N z+R|2ZAD_`q7rto318IjbC=}3<=orVD03#GHD%pS+;id= zu$r1tK-YiO$JM`mc7PZ1A2-fE==)1{Vx;SrH(Z5M6V408xT~3v1PG-^va+;gg$LY0 zykNv~G70j!{Ca5+m4r)+XkoNmAW|JBCzLf!-`A#)Vcg2iC_vS7J)h-Fql`hNC>*An zQ`ZSihc#+c^NQ-tqks~Z+2Bb}TRn&^rZQ*%^|C_>Fkdr|N#p-#6fpc43>oNYdAK?L{J%$Ge{;1^u`TnO4VO&IzYN+5 zUKgZ99et=7V?Sj{cjWAg94i}TZyu%>bP57tL3*?sMGS3IOlB}cq{+sKc8GlgGPH0^ zD35H=@k~OD|JtMwNpVbot6~o-O2sC16Ote&*+CnsmZ)UK&VKm6+?IjUSO%zZ)B@qj3vR|vP@p3`Bu zCR<(9Gqs-V=*hD!8YMoE^3%3+3=DjBJBv!O+PORi{^S^mmzl#OrBCkGs zS(4f5PWf2<_e%>~gW_|8&s+8#<|`^xd&?~(#f!pqZjn5bak0I_OEi)Q!vw@avGwte z#f_>B3d`3!pASx4(v{o`gxX;(fST{eZh_=m>ydhEKjVUzf-z}HYV+&HAk&d#or zrS4eN>=hNBIQ^Jx6gYdbPU!6}W#L{TBTLG|$^$nOSJd#_!?-%o0*Ep`GJ*iqB9?v}iQ60yDb3Q? z5mQidBJyleB(&wtNQEzV$F$tQ@D`(TBq=)yuG8Lq{brh# z!77Bl>EfmlhzBxK(nmtiIJ8nIizxEXfysp9!-~8y>yosp^7y)}EPb`yO-{1RLdKcR zBzxs6qq8jaP+DSUYAUt~in^Uo(!4OOH<}k4*QX*mmE(ZEj!vHFJ-|02ZP>cDMT4@1 z9@54YzF-kVEch2EN$(>AI!GY~b_eSLf*=iut1M4pDeAc-&?I@v%PEb~*d-jU>BBuCN)hM9)!Y-#jD zt%Hzl)RT7&}PLNC?hxPUKgNdilO!X;| zhXt8B)MgN;Ukx$Y#?d|;cxx%SJtEIYj&8@oUKD&Ef-9dkwM(T_iD6V!QcN5%LXPut z*VJ5RP2>_Uv>*2*PC`o1G{1`fx+1r$n`zf3XwsLILVqq~2;kj-G?3Q7?Wke9v6}rc zLJ(948M4>TKmZd?S$rz70nJd5pY*x(g8XwfkWztcMDbLZ;d!zUe;B||!EqQA7}|WT zA5&oPBI61`%9izd>D4yLR;oUxO%)!Sw{bI@iWNZC9_o8ju>eBgaq;++OTYf;Bso8P z+4N@LAgu-2(*RtZ9Y&E#VgLB{hNX`kbL-tDNIG8%L|FsWEY<$yo+GtEO{5O%rMiR_$bi&0jQR_R z$E}({U$hFYZ>{6NkR@k4LV#v)HAfQyM4xCSANY_Uttd={~;GIjtZ zqFajbB8qtEIpos)O3dFK3NJ}J%fw$_ zyeMh0(2OyY4#J-{Dn}YzLue{~?OFvi!La=JG4x>YoC7MnOhS8-kGX!UKY?46+oXco z1b|`Bbgd!7PZQE_wI3-hkwU*%rLMIW-ErOs0)n2g_5xDKt)E+^GFdTHp+w2z&3{f< zz{7gE>jrH4@rlfg8 zAJks#IaCP?R)~Yw^^ays6krzwGx5wNC67wDO>mkD{)cS?k@`P7|X}nF0}Kh11s? z#o?e~9&m5_zA63YW-#rhX{N8-S5M3Dknr{WY zARK-6i_Z$C=@G)e zhXMF}FS11!R6{!PR)4;~>n0o32E<}%8&q%Q$ckib!2RqRt^Y*lG-teP! zsN$|!6dWH@JyVjEfGU<%bXAVYb0m{d{wQfF#wsaFt-4$pFG-ftZx(3WbmPd#h~~70 zRCTsEGr>&JmUX0sth=%-lFLt$lZsLY)!BAxlfUT&Diky+<0L)`C$7zXciXPO{h{l^ z0)v4oeC{DYK>})lk4*0-@!9->T)t2Zm0gqk>@5VoyuG3=8Zm`rcls(wFddj?Xvy>a z`lwTpw{0%(9eH8wE{HHPr%!6Xu<_>iw(m3Ax(?Q5o%p@O81Qe@o+WB}6o1mPF~iCs zI-Y;7!2#v>*fBZ7w=Oa_3TfjW><)U&Vw80kL{z!5OSB~*WP(Q~4}5hn>Nv1S#ZtlN zja}qPNMiI7|fgxKfPdnH#Ccbz(y<|IIDy0{~M5d?-7Vc)t;DWMgd! zSTDp;+~|1E#X1DvU%~ru`xC9pr7A3p{3Pa!xUXiu1npM>}HS3^fdt`#_*-}7zu?)Wuo;D~dmP=t?%bmxM))?AP0?m^h z(VA(NNi0TkuTLxg9LGoqm6_{QeopeW*p=%@_`vNIGaXqDTTe!J56q{a5b@=tlSb5y zDH{0sfXkKpTK~HWk?;>8!-sJ7@)E;88SVigaCZ*w`sjdbYu!)rsePYsI{P{PhokWg zu3a?{`pKMP6lLzq%JW;Qo$*F0j5<$FJkTV?CH(U+uXGqeW~jfZfjd9 z3hTYmJBwtd!dvDWBwXBy$hmJC8jQ(_(kKfjyYiWBnv0H<%F3gi`wrdQf=rwNLj&a| zq!76>4VjcM_LR5sXA)Ttb*I`na2WXvB1-0`k1%i~C~b8X)_pFwI9@`SKQ7zX-1asv z`_~PYw-wTknOhX$UUW)^IdLzY&#FWCgSdqpN!CO6wSN!(Hsi1{Z{kWN*0QBs48m<% zT3W6~T@Z~xU-*)dlr;!TGvCvEs>;hH$Y)XRT~7(_z<$Uu5gJ+qx!j68vt-T$Hmx9T ztSk=J{|jgMsBRUzh3n-I!@^C(SnQr!R)J4t0$%4ryQdI1BcWZ&9Kwa=QFS@|3KJB+ zI3HEPliU)M*=^DTh36fV_>lr2;!)?(@JFz_nUT?W1R|>}ZDQ8~i#PX>+){lV^+lRs zdzJl?ViH{VT=^7~W3D{YwDv0&?v9ofLJe6(K!eR4xpZmJ)uY(4!;OQot?$>5y3_|W z(eBf;L%SkRG|#U1MhEDd6R{x_{WW!MV`Nm~ij>4p`?~b%qi^<$GP0?J!=)ycu?4Ra z?AemrJiY7+W_cR7(8*LmxUbV=A}!Kot1Q!`b>u1VFdeCrZLE;wXIJ1%UXNw=#lluL@? zFZ-A5MpA5tNP4_dSG}}sCy0tCHy#j#)Ie(?5DhA&r-j%lK4>W}!y}&4k)DUH>*3Wy zEIm>ktKGsr)dzW&fM%(QY7?M@nld%r3-EDF!~-@mbtAEEMfuVLcT?cwZ*I{~y<6E2 zXVUO;F)Y*;9QZn4G_#|wF6{7~fp4H;IW){9$PMk=yG=~|eAWA-Ib)mvs|IQrgglc{ zBf7H~gZ-w1=O-*A(dBB&K^b1AO}VbjVTvO3Rgg+6^08i}810DOoSA(21mbt~18@IBCW`pA zh}c~7@_yI)_9xi1+zn~Ss|W<^|6XfT4Xe(qG~v;Xry6-cFA5eRBBsXp!sA%%@fqeN zD_XITD@Sf1z6+H+P^x)2YtUS6CyezGFd>K!Fr}%A93jgakbx3jAv=|E=~oD*GkB;P zYLnQF7I|c;L?Fj!E;jD4QW;uHnT#b0iBP7Z?SrpirL3CB1<$ft&P>uYLpH=img=QP zQW#9a-Y0_qJJ7DiI~34L*+gMLA1{%`?Q;#@mld-lg23qLGqYb4lNT1V;QPs6?^!p7 z{bcy}i0PwGfBh2n?K*oXgv$XJ21|A|ob;sRd}YsaJDvR+i^bwl2Ij{1FQqaDUqES? z%$jE&G{oQW#7q|Pq&!~Yp`j?3(WyeSG^9bgDP<{DIZSvO)n>fspjzySx{Nf_lAJ4o z3{k{e2kUJGf5z;N#W@M+G?GDw3Xo+o2#CS+01+xU-*>+@o7r)+2Ncm`=vY{aQD{bw zQ!_K*B?L22K}1CXTOyTWq+?T7xdp@mqZbOstwwWEdV)iv^1mB(Ygl zi3iEhzdWZ4Ws|I^K?>6PNX@idTYbTYb5(FcbHa)mIZ@7@jt%2ag}|xD#KK-B>?V_q18W}!&e$+7jJP2yNUnxE~Uz&k0dP?OD2*Qb%31~H6iC%#Wg#C$Hd1#K4`GhxasGznw8J5JF zRtZ1TZM+hN-Rs14w$NBUbaX_OjsjG(A{|ZpNn*t0&Zs!}J>YcpisvH4`S|eGcwh9U z%#ewl8{sE$KvQ=x} zm3+U)8Q4GW&}t5JYI~?f;{=~&P~D>`l?Y{l+qZ2BW93la6QMl6mW+o4aTpZqLV+n` z5m3ZPUHkz6XREG0_uv18bqaOAkF?vz2@Pd6VVkBh&?g@|SoukOBu}8~hQXSK>{aP( zQ?zYx5MJ0H9>Q<+ZJvg_De%O1LzTk$Kg6caYr;H;`F{|syF|l-qQy<*s-qjvbd_Tl zWWQtDHAYp8Rms}N(S8tZ-7HLYIU4MQ2dq{v=96#Whj}2OHBn^(ht~G3tX-QT%`m4o zUxv4R&4&NbSzC_3do}DbCSvT!01-9OM>l}^#b;SgJ1>D93ZG+F0Y`Y$K_4*CoU}?T z5Hf~Mxda#GJ0kMs?|;+sz4TweD^mZAwa&aHr`OBDWoh;B??>4fxck6&N8}Cfxm5 zzMh{wBug54B0s~VjUDQ=!*bD3FLD5&VR2VI$MHHEy!O*EsFiCP32FnHW&7=5C|e%6 z144g>UT}s)=hS$W!xr@nZFLddkSM66Ow4JBMUfB})tx|amlKVV>lzkdEKKQ1k~TeL z5`$}=W}VW_t?DeT0YM|?H6JiB&T=Fo`pD>l#RphjrJ7l=!X;9p#9X1_zh{rUzbSQM zfYnmDwNqa{dmP6OIp+T$txDJntL61CqfjMB61Qp$pCA0UJW=|aIPt&oL>P44bYK}u z8ahr4e|p|^;>5`01;?l7kDVI(Y-nuMd0}|&!uQKtFGT$JKS`;3&wW9=;``xm!*o1) zAZV!$jQ*$z@kcFA-Oh~+reR{-Bx7^wqQ>$@4YbN6Wt|wZw-pti{c!<8pPrD%PYg9{ z%4#*H*^J^E#Zv;e8)!S)NjNj;2q35ivJj3F0g7*$q*U1ast0w{G&wHJ z;%*^IhG*v|1zXrGp(0-JT=yj~_yFKehtwH`^Z5ft-QqhQabMZ>{BRK1Ia}OC+Upv= z^E8MN4UG+c)iZkuVXE$7C>J1~{Jr8~Wubr;$BLZMaHPlu&0txL0&#%?`s$!}E)R%SQ|{!NZ9s!vNeEE>XuR>7h> zl=10Kwor-Z++qGWn?EdsX2MZD@gcvu}64nfo714Q<_?R6z z*o$c&vP*8g5TZ3|Dr^Phyj3YZ&aTkWz@`IJ#n5>zajb_>&LFPcRBHlPVhLwpE#0{# zGKnHP1UwOL)HmfKa3$!Gw|7x|W${&^$P`Tf_;8Bl1QFJIhY>kkWUPN*u@^4Rj-7u- z$a#je?n3^~4+<*Ql?G+($aRx4*2GZtHtd3?^aRN@Krt?*W}TpFc{f;vlf1aVP+)W& zy)8>1OeN%GooF(XFT?_I`fHazLjJOOYLZ<-cdV#&$t%y5R6XRHW2sDrQyf->Et>R$ zua*Os_*TYt)}AXi{bj{R{L6K0w+hH3*VY`r_?WA?{jFp*yZr@N60D`2I}D5lS##2F zrG1UxT_PoAYje=}udnQibf08sA-ldc;Mh?J{pF5af;fIl(kv~5YBViFlS9IIEjadV z%;eO@1}}SYi5Oi6vL;O(7 zbs@rf&o{@ol-1WBmF1=?PFSj&gWUJ;4U{5tG=F73cxrMu9##H*eH3K~WoVU!@GsLP zd^Ss8ngH;_S+K*~)Zw-|Rh(JOtwX{A?sXlaxvnvC@){Y_$-jnj_QsJoM_Se{#9ZhR z?(Vy(W>BkT-M(SC6os+8{YJ^@yclm-S8&*PVf4qe_PZB)g2hK0c7=9c*|nI9$r0@v zhAgbZZ%{AN_39;i7Nb#HZndbVX7FKoIgTWUQO@MV9Sg;*LHe*`J7MXGH5aY8X(6vrWxAJUq~Rkv&; z!do;hhsdKvbK;(M zX+jF2KVlZXU)f{Vyk$KNv$%p>31!?&)H|VgRShP3UDF)qgHJ&U0PEPQ!@luWF0!i^ zn|!mwRBDEcr^CM|BdNo=;hY4n{J9W_T^+^Wpf&M`jF^Pb4egRnq-(ZsgIIE=I99nP zI?nZG6g<*Jg@K!}6+xR*8oBkg@*h=-SraM9dd1FK^DCoac`2yho@;Q@YhX1`S>QS^ zJ-e)@txb^wzXXtvR4-#Of+}I<0Ex=R3r`wjtg}xRJ)E*sy5r}zhwZQ?E*Hg$ndgY9Qm{Te>n9z$}oO_3_oSM9~Vw!!_oH#;A|n1COA1$fs>JqT%WUX zibz_hfJiq{XJ@Vt6cgd!e|}J=P{LtdbGj)vX=D2fOJxT6XV+9j#nsaD#RPmewE7GY zPGH>>XYh7WPLMlW7&F|k40+YAJoEJR7zMG`YRhb~`y>>bNQCBly!1*nr%UQiQD3wd z6?%1=CI9}+U2*fH{Oev)iupR57~@mJ2v#ixNx?zyXM*Z_MJCT30!lJwc7+_h_!A>- z%U08axbnMP6Zp%A7d^yH)wd1iuXP79ziiK++Kfn>qG#owP3z{)v!lTXU@nz`*h0iv zbX}O8bKn{%=kxpL^&-I*Ze-~%e1E4O~| zbhK0oql*?5#j<@2S5}PRq}}AF<(}sqKe`ivEui%&MxPv@chtTVn>UXe2WE}z{$37-h$8{H$UKwibK0AaHBbwcV?K>fsXiywoRx0j-tWbp#4CWuC!4TUUiMUgAq$}NU*h&}2| zegsb1X}CJb_R)NL(4JED`>~$PghrH#&4>$w@S$nX4Oid8z@KL$n4#wA+LD{t?ZEEH z!V;uF%u|V+FG#zF_6${P_HNx;+6wHPLn66vH*Gvq^)G2gWQXo5d{@EjKXY1E1t~Sc z8m6Y_c2j(oQAPI+#t50lWtUQz2`M8n9v2akf6f|bjT*bA>=`ji({t`mxBJH=U-{Mg z{jkP=RBZea(0^%0TUKAB6#(@06Xjir00qfY5&<|SK}q?Ifov8@uacT>35B@zSW{TC zknGe)4OsgU`qJ;nl8%Hcd7VUXuoK^Deq<+4r|12&n9*VuH8XVBRliWFd*tOH zp)>W?V4K>vk%uuH!BPG%dXx`ObYJJhASue0iY5yM6_Hz zV{PMoYOcM>Zs(;{6V;ZwBN*s>op<*1B^eJ6(E5KDhT^{ds&H#fh+)pwXZSN!)_j-M zU_L#r||f? zBk4)Es&UOJKrdl1df=4so`&Lw(cN&}J4)^4aa5ddf-HLv4Ay@s$gEP5r zVe-a0bB{uLI44p+D?ZVl^&kV4m9P(L?j4naj!Sj|;!j#vb=kg=d{I9*rC~#JZ1vs^ zgoTX4c};roC%gbJknGsIJ#yWZC6%>#wvDKXgo^IdLk2{) zs>MOvqL@uXVg*7JSk~1^9KUZC#uv5vgb+3W?3z9R#j_&|1~SrwDWIi*$h^$Q#3pN6 zFq=U^n-J4+;Ni~JSLpcLc?mDYI{6Toj)h&lb0Kf)jlyff=@Y3RRop$DlcfJpM7b#Q z7mtxNUlE}uWGVr>V?kzZgYdOdL`*Mz)TM_#4y+tyT7aq7==2L{4%)pcGg8Isydvx4C$qz z3kr<8Us*GD48?$M?6|NXm@9-RlafjN*=qgc6@P|s+_MxEFN`{)7qk~i8c~N&>oxUL zjq0%;ZTTi)VB;YD4b?CSN^ep_Td%FCFkJDTJwxKg6ps*3Ew3O&Bmjq7xFMkiUpu^0 z_nZS?FG{SD0}tU+yI#e-MR_k2W8PNCe^1p05RV1(vzvuAyH0NySj-Dbj_7wehvzVr z_e&Jj+Hdw4FVv>EGseEG9&-mn7fR@8{I`ry&63(#_Eh6aY3XTLq9}yDJyFK8$)PgI z6_*8FluA9L-Agi=%l!M<;TUKqpQQD=NQ3u>HDwrsx*`N6^gnn3yj8eW($~}jXXW@oAJ3wYjCR$3RAB&0yXvE%_HL@56?8O=-4Uh|FDV2V4TEsf8;wO71CV7v6nVnA46U|NyTJT>(_`}Zg8JyA^uAC(g|KE^XhS2^ z0CFz~!8>t@aEPo6F>fZ*h&Rn^B}HMv@)EkNs3k0!+&0D8fFahYBqvp@9LJbTwcm*|2J%Yti%Sfc<-M!_` z5S!jo-0Ni+(Ta#Ar@3r&iU(%ylciSu9oQk0ootqiQU?s7K=0EVA73<`(&z~ z@_e7>F_MhFdFL(`Q=Bc%Fp|M5CNiAezeW$?S$ z!7r!A#!mH|_Y8T4&z>9XIq&+T$8of`*U>eH2}KpMj{fiEoTl}pvAWeY!WayEUWTzA z8q&H(4(*c9W=PzR7d=WS%BP3oxF?9e<=UO$Y9H02Uao0~SzrtfRDMRp1I(zF;;Rxr z3IE)OZ);u0kU|IT>#@aCOp;nG5hJhD)0;1&;AEi^^SedG)rZ| znwnwDa`ioh9OL~hrozlJ4)nBXERccCMPO&dpDatwvcfIZJ(r+9EgniISceqp!wiM{ z-W=X4l3bAoAFoL<&Qe_y0w8gT%DY)zct$duMvHG5`_)D3bKxL!&po=O ztn#DRQ3Dsd|NrpSFg2nwEz(^U$$TRrf)SBo2|5V7Sg8zxn{p}3Va&vMtue_^i#R3g ztm0AtA0x$1j@q>b%~HI?-CXM3T;}VZTR>H^>%$Dv{z3y)C=*(ag*$Tr)D+Ifq&{sa&ESzq(r4S0tQCB#@sxA!6CZgX(d zrQCN$GKSa@sMl<&(`2SrF9)=mZB~~mxxo-P*Y?EE8yO5%Nrzo`kiubY#6msjrf4CI z@T@EAUNn*`up}qYxGa?KzL%wMf}sz*5W*!$lF4}u1hLj1;KlcC#0UN^VnRVtwHm9Qa3 z6{6)3Ew}!`l@!{}QqP>pC5yNE$AuWnibtor7G2kF0@Zk9v976@cy{su$V7w4(}@qf zLZJy$*T^+UnT|GeGR5CT10cdbU)hu&(u^chLnvo*U#}k>Rv%&veEI96APj&Tt`~Py zCI4q_$g>dik$%!_(RY-C`(vEj-0gvm6yvgzU7y2RybVC%PeCd}4INr+Y>EkU2YoMN zt}MAyxQauPg?d&T7DDe0(!nT35e$=Saz3W@`>=2>jf`sJ4wzU3BO4SVAuIa7uI5c4 z3-DdxDeATFBeA*Hu^LQl$SK8pQ|9zGL2Vkh7Oa~xQE9LZ}%W=b9A)$rOomh z@w7Cf-QHw*t!Bj4Vq#V-GmXuGq=Dt9QA^_ttsGm3y<%zZQPjxs`^-+D_-5&TY1{Rp z{jD*K@5`iOhn7@=OVhw-d(&^WQ_5}WRJah;I>|-B!;VT3J6lXa9>`8TnBBF_Q@J1U zx6jfJaqUyJ271i3#ml(>rGZRxZyR{4Vwo3OME7 z`NJ!Q2-}Z=W`$+f<)!65mvI-AqIA11mqBl$7K$fhumddx<{pLnbaQlaWw{C(Rri?G zOPJkWRKt~_R=j??1Rk|DpJ$ukV8iZ*H$vP61e|B3Kqw*o4^$x>I%Y`&(4GMLYu*Bk zg~zf{(!vLh730Fk$@V?;@DI*RbVYZsk`oyx7vIVYyQ4n8n)){_04Q=`nlrUK$LXH=a#tYL^IYU(N^HzM;45DBU|0S7V-E!Ztlt$_ADhQ?P)Wrb2S zQY69IH*sWzJxVW5pd%B68HNl!FZFjo0{?0omyF~hk${*?7Ka9_KBFVM`BaRU{;PH% zcU#kLUkn#?XteB_pyttF_1?W_M^cQIT_dVr z2!cZ4zKdx>QiSXX?75y%_LVPCyNKr$XrN?eB92UjvvBLdIwER{ z#~^*(M3EsO?)~Wje@REldxdG_O^mWLP) zi*aHg9oya6?y36fyY+XECFs|k0m~EzWi6=}*LTegoI2L`<3ujy-Ppn>AB3;&T%!A* zb#G@V2#feJwjnU(_nog+ZG%v31JMhf9IV?p(!`jq$gX?h_n5HQehc+ppcbWyHXl7Y zyOAIS7Ho->Gh}||Di+gb;sW#Ko5NStQ!64LKR?mi!Q zMDv{$o=F?3XXGM(;*?8{pDPN;TrbJk4*ZbT9upsFI`ejF$b)$^@bMff(r_tl;9uuS z{Y|$N#+QF`bq4Uq9{bIO@sY_z^Yz+;qnpQec)gRLJIG{0!NuCuJ*HXTP@t;bRBeZ{ zn7cV;aUo+JpokBUDF2 zsoxxZMXFW7VyuCrLB>;k^`^p@6T$s1I1!CPVGq01C;$oSqQ)QmLN^4!lFo9}o)@7z zkqi)~*RoL3hzD%eslNL+5S!p|Z1ZGvEed35PNf4=Femi~c>CjZXS1H1$7Xk07Tv+E zp-5UP1rBu|3I__N9Ab5PE_9rampXwcWer<$<4@77gteVeIA@@KfGOFI&=uy9yX z|KT@t1!S0QmNt_=U9eVMo}OQayD%S8;&zCKAi@{KnGJM8U{N_nP`E>YOnB;4%Oi>) z_EBWBU-|B#UGYe~yD57tR_mOJ;=cx`wvqCf4*VAq8)oQ*MKI#ykbIM$3zNY5rF};@FIlow!J~wHO47)=A_ma(W!Tl( z&OKT7Bi44zyBBFak>5Y0(gd%c>#7vzEEZeUPoUhgLm4?aH3eoytivGP!CHpmO3zRh zn^i28Jk6K|-J+VJnk*|MI5oKQW20K@vM`e@;Zw@y3~s)@eGYwX5}-b)izBY_I0=U* zxyU$z3X5;aXK}$O{|4ZI4wIioZA0}Vw^(cmwML(bT_L`O#hLO|*@yJ3BiEZaICx0u zE>nKz=a?k?cUaq>iO3@j?}xH$nb*kn(bjZR)3?sx6r&-A4Y8um1~P4UBo+D%%DAJ)I1f&xKimmW>$thjWqL?Bu10-QMBV>sI)!&M)|9VKKc2xz7WX-b z_!gLs)g-or_5gy?Jq4xcWyIBg;6e*t8RM4!`jxH*{FNW|jn&eH4XZk_fF1vov;#V6 zN!cNF=_zi}V)4@q4|YMw{QMaqhFv2%xs+PAaSz6}yA=kY7E@9Q{^30dx)# zMhA#{ju;j}wB3&4(=Zbu1Cf!4+e7ks3A`&S1EV~v$WIS1J`c7qi=g)OWG-RBrI2EG zK&qYfxZ=)GqhbtGZ)IfzKsSr;1HWb#cwT4 z@JCB^;}kHe`-QUC0Ft`^3h`klbQb}Xq&;x}#49=;n1yjRlagvlREgr(guKUB)t?Rc zwOOLpgjF@(njB6FSqO)hT$mZYQ0$CF0euz7*kD~arP%wSut;-EPWpU zs6~2Qfr#58c;O7)u+#p{eU(ggqIl|0Ouzp6<)pP%$jovI!4B=kZlaw-#_`zpW7AE< z#M%lSP~?*dH+`0cZ2}Azmg!u~I8&*mjRCzu5Aqle&2g*4HzwjeqGuWVFzaA!4=LBu z|AcJpUuvQZIzM^8Z?HL9k_jdEVgii5O9ap6vPDqZ{ORU8Egit--7bHH)CE+OEw(&t z5k{9@{3FD{Jr7y5wE-pv>sB!H2R{)(m?tk3*4+E9^_ zk1dgN0p#N+?+m0hE7uHPN6lH?+cLS5z3Kdyt51TFV5!?dMz@H=CeJAZnNJ6+mkYfl zf?F+3cCH&)@7)p1sKickN8q{<&F4@5em7D5@;=akc}}AZD4AfwPq7`;G!>HTH?2F_ zBI}%~m?wgHNZP8D$X8KA^SPWqjPaI+r_a>`ibr9W_c5wBOfIsM(wUFFHgACV7D~i)8^e7)mzYtK=GW1 zR3slC)hOddv;I+zrbn+|cJ|z`+r|Akzp=ra090{hZ)u|cV690%{(`sGyc>~b2Kqrt zGL!4?IN+a%MV8m?q(%j@qRYAUHu|NoL*)FQ4t)tU#>MrCz4(u%8Qy@35h~Lev@%6Ge6!0QS`J3Y3qpg;u(R zDpVU$iG!8*b~Uf{wI{GuXmf9hfI35l=)Bznnr^h6=9rJI521p({v*iJQZ-sd__zO| z=Ko6;P(lO9pKm)D>pXkv{2!0?jSZZ39PRt^)1l*z3ulM=j-CHpc1O5TXKE`d{Fgkd zBZB+Wqs5p15q}9fHpN;dnS|#1AJ;8WEdjL!Rk>Fu8d2`!jOBQhCD4&}V-Y$fxyJrP zR~RxJ^@Kk7<1>;%lPLpktZBZsY68OUKSv#fTw;6{iBf0X+;OR?whL(HnLsWW$C?sn zR~TA2RN(+bTfT;%KA67VUe{NE8SKnY25+S>)=m%8d-_RE~KN_7{OnK)&m#lJGQtrjFAS?1!;kpHfl8#?{W+2h*WG?wN!(Q}F2s_{& zx^i7jGWKYWd_p{ubY}h_D2>YuX)8;;l(SxhMK!l>J+uBzmNevKk2xQ!WfF9`(N!wq z?qkd0^s)Eu>X2rzn|B6cV-AZq<$hZf7F~MMSz9{f(}W@xcMZQx+j`IR(P#a0e0_{Y z)D4IL!#xaO{3hysVnaGWd^_jv2j^{?%Gi`F!Z3A;fY{-7L8iV98g}%F?96~)A@@6+ zAJ~QXWTpR+BYM6{TFNANr~eKNlKXfluTuMleiDjN;wh^tcy23B4e$6rM7@7l()ZrS z{{cY}(LjOF$N{1vX#;;WwA$gPilGAqLahd9rKBA#>v-CB4xkbun!iV7JBmgK*rc?z z)pnzT{aAT2rDL|vF{`aw?XI2LcJIE=xxVjxzxVgLyDsB%m4D!MA$;D?*X#LsaIsI0 zQ@zE6W9ARJeCQfvoQ4ad*Gxa^5T`rk$ssbfxKB)^Ag>e_T)D2SsK{Br;Zyau31NsoaWEltFe)*LSkGOt0M!REsY+xwW=2-7=Ro|6+Edi!&6R~_Db6cu|g84db zq4mp#>>AfGn?nW7DAPTtkwbY-j?Kqe8xb? z+vga(C!Z!9n#BE0j@*_XjrDKDLzQ%pfy7&_ zhBsfSN5p|0L_LjziRZthMZuFI(sRw+%-gis=D&aN;|^FSCjmZ}{qq1Qy@bq;*U^SY zzmWj(6qSYQC3FhL?|s7B1n%DHkn!gF>AQckh78vHfSvn-vElmF2`w8xKe0^4C>Hkf z7V#wutU%~t`~uYGJUXCIl+==v9DijEUAZ-eC^*YBKf|3`T2t=-pZ{642t(m>-7p_F zhiqAiAWGx)D{2xFAw0#~-EEtO)B_wK*c^6ZwNRi*o&FSooW~L}SneBxQfyTp;m-Sv z=Q23zi*h{Vxy!_=O5$n5ar*xqBI)aY;ysfCS&h1H?Z znpZxgxGX^=+}U~Tk^btd%3=d2j$%xo)!z^xS5mD<)#MP&ap*76`iA;$Q!SxsMBhG) zzcDgO4oB1kDKzSRe%&V*bl9%W{Z!6-JMrjq=>cMdmi2Nx3XDP7LBn|Si9PJ8jNh4 zzCPL*&|p)$%xX3wd-^AdWg6eDz+M!8nd%UXO5=QHY8Dw~# zv?BDP)3PdNO6pKp94PoU4Gpo@v7yD_p2c(eONg)OA>>Xgw!H!G0SSyDFi+q}f(UVbJK5qQTp^CgGA>eic4ozK;fRA~;g;2^}*s6~tqnz|@Z3K3$==9!BMAoFyl433w0(J7ImzJQz86D0I#nzx+(CEDFN*vB^-K^ z8OqyxdT3>U9Xj|V?8_X_XFL|$?J~!K*XGSD`afZh?7L9#Pxjzj&AZ%k9Nto+tFLoK z73DtnO~es5FgI!0Uu%aM+Lfv@zjQ{B8ak*w&%%OPt6CM{kxfg5p7ht(!Dc+OEd3Co znTf)X1k!~@JqQh(A<~8zLnt37Y`GHh&La?xvs4(1h}A0R65`X1N3oVgRH!LCOd@W6j@=M-nC#Kz zF9&2VOv9rt!0?FN<9hS)*Mh zN0tLAymtFSCi2q#TXmLdi(zNlCbCpeJJ~?2=hhx(pFH4yhA0+^4D-!HeqJN3aHT}} zVcJ<^u&?kJln+Y>pTm%x4@H-rDAK$eG^B3dSEWmUCA%S+u9P~5TwTi_%I>n_DckqYt zc3TplV=Y&^O}6qvMPS^lFROj=`uW7dojZ42H3essd6%lo3d_1gBE38IZJXWNCEP&gU{_x3sk7Gg0y?o-`&-VRIfxT{cLVuuD zhxRcAMcjt&j;EP%fb&^gg{p{anjM7S2`YB}R`-Zszct5#MO?mbJ%$~A{j2f651;?j zxcJkzFWytsf=2M9Kt8Uj6}R0S4gBE$VbBCLEKAq4MkG#A4mxU;Gf^cHoLs_AbBqi( z5%Od>cRPhS2hK;;Q_ugKbh2r^0;^m@ZPvmdR_N?Mf3>drK2}WOZ!sn~kq{gU!|}0e z^D9G-@v%`6Fk`1lq;GnO7k2MhNMT3qqG4tF?X$7zKW0i2VF~52>7kFXExbe)y#LpH zA~RF2gehSk1~2Am&g>$*lkk4l53;4v?SY$1+M`R=OTe|Gc8Oj{k`FI{Sv%RYNx9Br zDy1``A8Vq(WBXjET85Ty35C@gVQj( zlBO%+9cBsww?dsIB_I}cnk`)XmM;BF3>9unjQ$*qVsD9C3zGE^LyJ2umH3lOa zVaAP=-zpbNMi<@(!w&HCZp>d^!cd?G#*s-T-hKn#R-F+!c|zliiE!NCUl!1wx8;UA zL?YG;Q&Y99v@l{20zImUBuAMCy2OBMw=n6d0Y{4CaaqvzSfQdnKo%&gR=uCKXCw)+dN)hKh%bf2kD(<7S_a}jJ zJJ|HS8k?8e1LP20868Uzr30n0r>i$8+eVj3rSv{@sSJzWt%_tLOF$|NHdeQ>B@kPx;XfokjFV5g_fp`t>t@C>nW=qV=oX{ELmP42=P1{c{4`K&BKla?Y~(|c2j z%m3-cV&;aELp1J@%~>~(C@uCISa)@WYOKa~LFJz~p{+QItZY*SC$fG+OIVzTHjk0) zN`eHio%b$jDk!0`)1&G`4Vk-3zI*N%)vxNq69+}%S;a6T$TiZn=_w_5jCCAzbiH0b zk9#G=L;=)37A;lzqd}ddqM2d6G7ly55pbB1y2Zq!rqFq3LU2@LPZb7@j3F7YvFTR* zECq{By0IwS2f{+enyaP{G!OQG3+L<*iK6WqQVS1udZ4;>Dh`5|0+X-OY{_%1XVtIiJxHuPxK-%EnVDnF9b_6 zPyx4+HEv9#v50PkKC}zLFgQgFJ2vkY&R|ZUu8wme!`o(9Rdk3K?ME4U>;P_%e(gx& zw$Tj~bF=c;90D)}f?vcl<}>#GckcH`28Dm+@3|MTJNESTad%k&-xXOtIdw-1p0LhY z>QJz2YdujNT0)j}TC0L$6j=l4c+@7Qtwe3CGIJ!KG*(T9xWylt%y2M*GNd?+b4 z48(?9?kOr#5X01+mh|5pwF>NmL%RML{LHt|Z=LkMNyP|}s??*l75r z*bxby7A7sTwOX^o9a~lvy)eCWo!O(`*KlB9D+_LR~i`xAzk}Fo^!GQV%cKE(_51^HuS(XuYC%`ay~pe*$0x;ru{s3Wv-%C<4Eh^3IfCV>?SR;>qYy=%)n zT5oxpiX2%#ep0tZ3-C4THowpU#T(aSVw%F44prKn$Nr73)x~cYS+$2JOQk>&>~NMdPQ3&cGg6#^3C=PL zUyznumiKe3BFFA7V0oK0pm*|}|O?Xpb)8+sVE6L#!dC{hwX*9I+!hHf91vzfwOV)ob=}Ir|CD5i@ zmoX;;Q{%1X*6PdJN$>Jf3X=rbJX*U`6-jVY8z#$NI7oIH$x%S|^z~&l?0i=0?o_Xx zUZ?y?yl>4@EbTVKWGHDHHkkFY-HdR+<{u-bamuWcfn@I;#-Xg+(FE_{5f3we$&HOkwg7*!n0RxYfugq9%o+>^za*O8q>$_(vb<5?8U+95!2S#mAP3BkyUdiOwEJAbWVr`yoVpIZsXkDij$3E3 zk(f-I^ArzzNi{~4iFkMgdrHT2+*Fy6JUI?XW^^Gs22sXiJ#prc?BJ+JO*(PmKQn&a zk2X`yhQfe7YIE$D!*-G*fDbT}078+yI7L%#P^K!6dN-TPFm5$l=1+1oReR0mU}hxl z3-HN-)|IWt(aUEwXZDmwRo~!|%XY5+6?s*E<)`T=yVf|i9=auZ{n2~Z-aXXQM7;On znSV;lD_q1*?cf&OJOAO;qT=psHL@pL^q-v%C1vt7UD3tnugq?6DPRWN7B$Q4=- zf-ryam8~uy>qGWpAW{W^nQK-9 z%4_BB7+V22%u!+`Ijv4f4sR%0IDo7RCmWzx%7Og@)VwGlv9#h2yc_`jtQahTyGK6& zX%JyAA>PX)T*@E=A+*AvR zxC>7iwee^|{gsC}yjmmYk7Ef7xR&b<*%LXlsY7pK_3bY26U(}Jzw34u;YACbQdO69qmNeVZ8JzZa0R48f4)BGOK$q zJ-mB*AjuS= zhJwS}&mi*G|Le_@XWaa;cYoz?@5=Ew3XvkDbYVO9W5q{PaZmDxJ{}C_uTRM@ZVq=* zxC(h>N1L}t*%@EGwF-zfoqFp8>%L$6&o;>O^LU}hh*ts5@WrE}FOu^ZnRhQY?v zkY0Ygm1OqshNd4pI=&Px=Hk#9qpac&axXpL3TnzK_C8s>wGi@CUySNZHsS-%faB8v zU(QWx>sDpaLRLaTUl)OPJ-zmYf5J&pJqMp`3qQr#X?8lHc*M0_ZM(3^5ztyt$4;3v zXIvWfi6j$@ret9jiZ;-WEFu(He&DN$5)`^ql)zK$Z`I`F{BcHi0*LasAWsGizW}Sy zZ4SuWhJK%wMr^AFMLcEdVSS3pc37)o5grf(EF>8BM0zb_?aRwfk;G#ftjGcSO-)Q* zOtNv*q0UMT)uNPH_g;tLj!d!E7ltfOz^#f%0nY0L5t&(0qw|&pq;l(F?7A^QnY=d1 zT#fTLZ*;m~p_}q9!H)JuSyKj`cCAVjbeLU~Bs;Mu?wa=eTH)FSyKd6yJV6wUb%nt; z=nYz@&3N;xa*rJjLEX?p+H}aKb`U~7U}#;8{JMS^S0sQn%i~@lR9Y<`9k+$(Ls5Jz zlXTP71D8Lje_D32YI^$t@}E1@8!+KiV$!NtND8CaxRffewOQAQ0`+}`SqMgGF%+_K zY6U|AZxCIOORw+?97=!W%h2g}Y!XcJK|4N0pbMPe#_t&O3&d|1_)Kp)L7qBX6 zjnvQppOeb>t;)=LIBf(*vSWb@2^Il#wbQs(4u;zbe$l=M+mSE<7u#z-ip??|gyu+w z?@(~PYVaW$#))2QrV3y{+`JE9K7?KP80SZey5A%yyHfDNb3qBw#M3@6N9P@-Pj z#5>cIS=??QVZssDTFoC4z|I6MbT%9Q5XGIs7gEEMkn<$OE!N&h_&eT%bn-;tK*y1~`x1XMwPiDLRKKK{q{5e-%*yxQBjQDm-MoUbZ96CVvfl66Gv*4*hD zNf<(nCf#zQOl5i9Fxr#dDXR1s_QeOG>wC{}FuiPZTx-bM@bm&0eF{P}L8oxJ_fgUR z{U_F~kdb+8cyn;=*?y&fj@|QqW1%~}Edh--EqU)1W)xluV%hRBm4r2L6LQ}lwcH)g zDSM$5iTn*(#mOJ`%92NT>bNDEO?^Vnag+c$wp)u1 zEsa6ILC{L>FA_9tB4mVzI;a4egS;jOK=1&@(k?!s7I)^m+Ck%!f^Hs)KwUl;D>Seg zkoOcR85yzKNf7X*D%(=*7Xa&oFvHqZQ#d7+W_b=XM~PrsKQXHCkPfR}FdbCoc&j>x zgJa;p23x{{aoC81cdeNrMKxbpmC?HL7qP&vVM2`yftOl~i|U6SvOAy=G%WVzm!#t3 z+kT4MdiWTG{qA{VG9{>~aY z{!J3lg5Im1^a2J>(5TsG)855LxHcUY`J&t@yU%E{un<_gDklr1sYUF?{oZ?vqk#-j z;MsQEbQ0Qe6FLU&vMJcQ@wh}L%9yyyV)g5T;IqpogzG_(Dn5~tGhN_;(mSN_y^PXx z{rOnMvu8sXD!hWf@N|p5G4b|$ZudgX?Kbq>RldC2Y}3U`*R4r-TDi!Clu0Nl$At;i*y zniwO{PvdbBF}w9E;|M$BcVBIXruI?Uod;eDFO#z1I5s~%9v)5H1~GcB4?4R@JLI&- zm^Cl4K7l@rO;P%g4@V@UmDD{9Znrjnj|lfGQZt3=<3V6zN6tIc`Sr^?x-JUzIpWjj zOn_}ZT;|o4&ZM@LI`mFauNHZn07j3 ziw7skyGyq44j=iM5@R54i1-fv)rUVhKS7V5+jnP+zNOPRD!CzSSha4UCg;at0d=E_ zj^ws)d({5c9G;8SKc3D!H}xzW+nvaUpoY6jfZmpqf3*P6I4hEn_#1#Zw>_boH#GGdZL^g*G18s@3++Vt@YS;9%5>s^;JQ zFQO!bH7hP?V$wp zeNt;_&F7R6+(Di8N|J6FWQ~e|G=ey=6nTh)HU$S4e%>Tl%zUn7$0&UXyWzS&eH-^~ z^nK^q+emARQtLN-ASUCosi1_=N@A-~`6x0unY2GT*0%%igvc3pxgS^K9TyUd4FmmM z(r3&vKl5}{PB$S^f3f0kYntzl!xhhte|z-qI1D`YzZ?TjpCRnwGbZ!Sn;=6dtg!$M zj7|I5??X@~rvlk#S$?)Bs4HWqR2*1poli41cMowWiAkcZu(+^LV+?h1Wzf3iCBt)L z2HwBjZobv|I2^fFUc|h+Xo`qxFVK1hZ^z0B5MNU1M$t1CU(R?miA z9<0R2oq7tzQ9?zOoc3!MA4bJgnfHtrU+ldQjiWn8`CnA7&B^T((lg-$K|10(Z1((# zW^T6cVgQhx$FvGSo7Mqw7Y5X2JQs8>Gp?w{w0tV3tZ+tqkmcQcsZ5l*sp7MJr>AczXt|CcW ztZu4xdF+{b5};0oC-c1g-SS@B(h}_%*`qyC5PPSd$1sdyiZde+jk%??pH1D3pSmZ?XK{I2teJb1s_C#j`BQT2v$E9WEN7y!g!# zNeXK|PLClW4kSn_REQ8KU93r`bpwxj>gh$nkuSJOtI&zQHob`kQ8uiFMT#I_)_J?G zeuUq99i8eJ)0l&JU>jQmDIaKKrYe8K25KhFJ8NodBHe1UMw@L~O3^mKbnNHjWn;v) zrofb6`v+}?_lbA;1jqs9UYprvRv+R50H))nuC!xQ7U7a2a)D;LuT?8}g%~96BeopF zD$EKLm59b%x_w%=jxhD%0@J1B`Db$_GuRMTtrQeL`YW6yqh6!MDZ;|S1i%1(Vzp|y z@SlTDnz^h-jz~3$aBOK?WFZ>I{r-6W&?c{INglv1?DtxM)2OhmERqnz#`B)*K<+2Y#jrg~ z(kv-k$R&H6D}yG~Lw(azbzISUAvhOJs#UU(n6MdEVFgQ3OEMV>F_Xu&G_h@OrhO)9Fhvd*0Df~m@R}iAFV_oG4D-V zFi`A6E+%OZg_z;!f#C(y1(9PB3A5P>XwHD`40)&r0mi4z)`N*)?m%VDbq=p!IB?2C z^2O)_CVx1GMms>EX|F~k(B{HP=?8qBJ*gwb;c9rRVWcZA8(X0V`C+c!56Y;YQ0ovT zf2+B3-4O`d*hP)rTQ(lerqk7g*m`Ie_*RpCAm*ho6hY=tXCA?P*>DQP=LzZE9!g2? zAUL*>>X^-7Hx*1k$ZUEkDe-{zn}e&-*%i=LT#Cm>5x4!oyUjp^l(23wMsAMW?lKnM zipAUcSM|2&Hcm#&*%5AMioZ=7Ps`ia^BA~ri(q6pZotPJ@?`F?-vAML+ z8`(b&{8zy&M{HEn&@DQg?WRLkli1{wzq1FLML{vCb;Y%C{YdulhNKux`7rvUH(&|i z$>W@lqURUo^Tp|gEJ`dIZj*Cm_Gx;vM+r;P`)+h2eOPsPBrFsW)730R#TFY+7|P)6 zZYci%4OF|?QZ09|qRRi3JA#iO_V1I2Q6TL9_wdrF89q!g1vUaIi_o|6g3TDr^e``{ z=qB3??bT-hMW2;M&d6omqn>c;8|06 zwKkm-i9^aZ`>&T{vLZ_s<^BnaMkP;mw2xU_gTHFET62&EFaYh&Rw-buA!6_Z1jK%BHt!68c5+r2NGC{2w?@mZJq$v63n42g&qnDj zkXf{d$9RFrEM_vtdQ(OoM>~)+TAtrXIV|uC{j4i25zl*~BT6@z1O#;pS|)R8R;LbN zvlbmX*YYAZOQDFI8DF>O9Z_K$p+v&tzPZc0H?pSHpb0yfqCGTzuOU@yaW%ODXH6nZ z7OO@D8iOI$DL?pi70Ko6r87Rf!cATBU~HR!GR9}unKg0HVFivI?DT5NQnhvys)IJD zJrN2x?j>nAAHgu9+9Y+D7d?DfuxJmpGf7(ZxVFS?W)j=jc0gi8ve`9EWqpGk{6uXi z=83USx{&$b$+M9x4&210P*6C5zru_q=BmlQhYgMSym}$v6o#nG`4l_rEi5iI>gdcv zHY)Vk6qjKH__U)dW)AAi)HDiq6oR6|5Gw=qYFZI@ahL_X!>?$C56!HoJUSLfGGb|b zZhfOi(yRevhL}Gx;16+#fL6|dizpNpkxx~j9#UHJxf3Wg6^_Pfw)iyl3>fw$7kVHf zM^UwG6)6n&>V_0%hPq;~0s~QH#PVf+=Ykdb{3ZRTFxp%j<~nuN1BJ!}m{>uU|sKZMMTY_hzq2;M5{e#4S?_<@>+9lB?T=7h&$!Z237Q9zj?A2v+~FP%f-qki zo_q~4NBbj`XYg@^cghT5(cfLw>tpI>_1puqIM9WGS}t=}D5S7C^Fd)QSw&&v@hStU z!Wx6i2pGw**!K$5s2vApv#(sgO2zFRAkjDIG3Zme*w8*P4}TlUHBI5dyAE>Svno~x zIASe1dL$(NoAcAZHNRszKPVbl_aomgq`~VjaFc#x4zIgG9paE3m*iZimcyO4!D1{d z(^zFqgOB{j#tk_+7P|As7qpG`HBTM4@`n`b&eH}_Y2V{@#0Xj>Jfk|F78zc;=Jtlu zn|5&-{u?!&%!tq~OFpKBN-}1eN2Exxn6gK~ya{dSwxRS0Gm0J#ryn1Juo`Qfnibc6 zO9SHT?eE28qJ$&Ck>KevDYsxjcl%j!nh+*_QK}SDn<8}#M>DCzMQjU<4{i!ci4oSY z(`-ObPzR_2i`?1QrtF5X$9T+wgDzk{AZ7Jt(p7Qc5kn|LYCY`$7lVtX2{!t9;4WcO&KT7lbAi8l+)xVsT3!QHJK8v)9dA5ILA+e$`3DVDwe8&tz^mL7}liu0dsVp=9J3&Z5e=}F0#Bf-ID&@sy9W2 z$gs(8$#<%{Ry3*YfdqIek(t-M16rDWC=>0vc4O1vKc%f791AAkDbZBPaK=^^0lYaM zjLJ{QX(>wP-ooweZZPtwJ8VTl`^bOT-`UcKz%v2;3)GABvW9^$1 zQ@Zn`lq4Dp(T4SMdas)6wH*K^8mm}kAUN+A9QXm7{l_1W2XgESV&Mv+(zjJz7*?6_ zRD67ZzPW|XUx`agQ4Z~Soe38Y)rFp+=q^0=BF4h~_gz`Mx!Cek_&>PsAhOdhJPWqj zrNw?$DnRR>SEcIIZjcPivP$m6lt{4S$iVRqr6MbB-PlIfqW!S2aA9=i$%uT4=q5P; z1mM&ar`a5i+m#Cc&BSMIk{aVpW`sEWU;pF%m8I`8TSL|)Ii?t?8MB6rS#i;D52+V5 z&?(*(+jL`EA+$Dkwd#ZqK6-U~$oyK!AQ@G%*HkCGwA~j=T3$G z=TQCM+t9J{UYd3v&l>3t+@YC*QbHRt4GU87$jwD$(RfSiav?kNklo=-A$|nenY!=C z)syAxTQLQDr*y6PxO8v2aT*J28g%wY0NW2O46K3Hv#fR@1~*@^gjCh zpxy_!w1K@sElL>gSEE-hmKWya*vG$Qp6Hpbm7eR`Q)oKx!gVM()(0cVoy0I^6(%|D z34e`Ty8UWFOJ$s?Oj7chx!PG)gLGFbO2TmEIGm`K?N>dd1ZSdVSalOig?j-Nq?do` zPbKkThF@SQQF;30W-Nj?&T8(dJWl!PUFXa1g@U&$=z~eTRIUgUg;NO4BQocSl!a=E zqg%6COvkne&!rg-w&Jg${*_|Q-QD?3Kn~p#4PS3yR(uk=K!E*k%wYS!m;nPW-?%9( zlH;_)`SGx0^c08~f@jX2?myo5ac|$~@W_K5!3D(Rbg${4;=PzfbjjNrg!Opa1yhQS zP22#MS=s(si^W^Em@8691d-(!a0*x|yfpvw7zPkeMq6FgIj&@twB*|Ul$ek%yKn+O zeO0_0ELdrpXU`*G@k!4N=(ksK;@nrduCQ?qzA5mu9^nx>tW931w>vIEr9R^;z8qGR zlDWZ)PihV_Zj96J7j~j*N}o>AWk&n}vADDbvOaJju0_X|t*f}mKqYl5Bmt6rn-GUmd_v&RZiVNZDmZ=GAcm1p$jgsSeI?)81?yk+e_vEs zYVPRF(Yga?mqs0mTEE>fTD}5MLJ6-q>ztFs8+ zQfb0}D-Un`?Dl~{Xhp%0JUIQ!bUds&V?g43>$4@|hX=wsINK4*&u6Aov|Vk@E!3~k zk9b3xceb4>HEsBLJops9E;E?4Gb*v@{o__QJ1gPKPHxT9OPO-$@_i!XSoc4ZkAHR# z{&>FbRr2xpzTL$Pb6^6!RAVzCvpg!WyI7WFUUpe1QA89jOtJ9HuXCCMgMNRe%pGS} zx>qnbcR>I5_+A(vyp>khJrXve-fK2LDG{Cj>QSJl@7KfRx>w`-k~%dXPR*qMbth6R zyqu4i+fX0nkKI^$vkIAcz>{U>2#zvN#qs)jQ!8(w*4owZyGGS+Dx(3u_}GLj`7!1A zvw=gOYo>}nEO6xPt=Qe$BF)FiioG!Hq@WO2B1*fX@FbbX)J;wW|AlINvyI6106TJZ zzz^nYc9mq{rVc=MNSbR2@8CLbO9xL}3%@Gn#VEJF`zLYR47|WtJwR;g)SFN!5`vFn zbYUK_5N6V+9xlpst>@sbE&>(bbl@dT>g^=H)uPc+BjQ?&dgFLgu87jO_a6%A@&o43 zQ{Uz2i^l)>?TU7DgJHujhuJlS}IFo~kA9>8<39lmt`JcVhF?fF`uNrmMCWI*1^!L}BoNkfff(H}K8 zgE8_H7Zn9j;6DTL7;Qs?SUg0%;k5p9M3^w6phH=F;ReI`mZ4r8~JC#iXss z<8a=@U)mYGg5NCDXv6nutMlHm4r1g}jQLJ;_|GNgM+C6&F7#&uDzpR;#z zk%uNWYh9W{ixo0fnuWlU2hSD-U0~C6tmsr(%|kUi%~a;MXu!>a1<2mD1kCf?1+W=+ty>Fj2mti(I zoDkFaQPfEZkSJgwDD6ql)Qzg0tg>o7Ln~9rd?6d!gMO*Izb~CAO8xvaL8@uFyL0+= zQwlKzN5BR~ohMY0xOJ4!-DL;Wv~sVqy1i!oxxZkNzNn62Ay^*f6EkV_+-EWK&(dPi zWe50g9i{dT;URWn?(AyaBB!7XeL!bT@7GgT!&T&td>@VFgCpDtaMJ8EFEr((A|g;E z6g3*VwO>E8nus_`Rks3Aot=~#c6*A12biix46cdy5}WHAM8IJ*E@Rg*9tujLsAy}i zz*LtlkibuWc6E0#JQ6>`Z5j&P!Vcb;z8D6rUV|(%3mDwdARpNMV!#X7isd{+SYzNJ zAQ11A+S8o_+>~D2Lkx*9r>aAQS~Irb!bV>)I-msv>6p4JA(>T_k2y}KSqT(7aTaWX zOzSk=M%*b=7R>W39%0wOlqM;uDNiaq+Qd%pL$u9~baJVzQx=pCV@>uUNW3}(jhOfp zOhMzs$!W%dy;3$4Z$dSqj!r#*nxDw~2iZ=%QJhal$_yhF2z)55GO;8a|3!BSw1A~4 z&|~U?b0Kuv#wlseoPmDVJU7xaC=Kz$kLw)+3)2yK>#vE>HST#rbS~P+hx$e`*mZ@c z&&SqGOBZp1c349vjR4h0F>#oBMH}JT>`M4ydmEu>fY2xzc0xVG{v>X z(p#uvL@TQ&+*d#eg>^^opu^}7=uaDR#C2E|Uk;z4&?($pt7bI6O1SGq+ z!B~(?0vJf~>CZ=*aetUkkt=5+@7F%T_lo=2f{MaoTjuS6bhs1aXd6v27l|^PV@`AE zNhZlOINYkKL8m;rz<*E+`{+%bw&g3{cDntFGEOueuNdt;(fr9Ck6a#kT*80<%atRw za-(>Aem|wy%s}7XriqteHtH!$?JXI_zklvHvnKM?3G6XA^>7w;s2berU>+QfJ~C5> zIYW9c;z)_<%Ns5{nrhvn9qx}m9!uV%URkavagLghxEa~vC{V@*wUcG6;C@`*ivoU1OW-iR(7eS<3WKSgQxFnZ^zJq_LBi$Ri^MnaWvg?AS_hgATN zX$$EK=Y6ibF-vwzP}db-(!RFZQC_n}vv0p_W}?iGcP~+C-|7e@K`qG<#Cqqk>@mBY zxUe7Ww8U$j)n$@AOi12jl{3hCZV5cAI>ds`dw~pBD6n=H-@c8;VfytlTq~`g0QKk7 zb*&gvF2sGK+5)G%+dPQ+1WeHLR`c^aF&r-~HjF-(U1z+WN-bP z_7i!u>w|Z;PCV|8J{|q1mAQL$*DS?T%^!So=PcmNsmoH0RN|%m#_Hu(o27bX``R~d zmp$}?g&OymVRD(lf=!WUkJ`J=;T&~poC%Y)`e^8#9w1uXY;==?iSj1D7wR75s zklfma-%P98;>>UR=Rb<*TdnzJwXNSCyKT+9YFM#cEk=ao8ui8Lm|RS2k1sDba5eU0 z#Xm?{>{e6~N@>>LnN#k#J6LiwoOt)Q$9v5?Di^M!k-Hra7F(;G!4q2Va_y!=2sx{E z_%g|Sf1<(_%p?czrV-hMD}T2>%_twU{@tP5p5-4jD@P{TSjV%)WAlLvr07vQWtcKJa@v2pl4dPv%zT|s=Y*G%U%mWvJo?bb z)7#FCu;hpy*8$phn9l{pH(RRmpRN?4#b<8sAR59qh0LEkJuG|u>G`rqZDVob(a^qDc3sa>f+g7+oa9&G`0A zszj_)0c@LQ`wNZa%=e*dTYYZo5N&M&clLprU=)a8@dVlA>&w5WuePpZ!#j5zA&RZ_ zl>J+}Lf(D~D`7;hpT{O8qIr7tEkh-Pmd6}?T5Q6MLN@D{@z&q~qP0O0dEa}YhthS{ z_4%b!p#C|wev{U`KFQb|+^;w}r2B(z37a+T>M&6qH-QLjyO%SWqrln!tgOr-YQvkGIeNtTPG)9iL#Xv`dPw1T)t(#u*;Phy#%}iW37OZ+ z@s_44ar>46`vIO71QL_BTxWIts=hi-o3(z(S~A&(E7^T;VU((zY}M9ADW{~J$%CE7 z77ci5?i$0pr^VaxGj$YCa((Wh)bmfsjk8p8_<-OE6ospHjx!QQZQF=nuRqqZTaioc+WsD?G}pJZb`W+&fV}j_>XoaEFULOV+KzuIv3acP5jf*%=pr*`8(12502u}CqZuNZKM0s#Z8*mk^ zuT|Eg&Mf(LYJuhS8>wbV%MRpvF1Uy> z2d6^Yh8!AIklW7kbeJ?E-Wc)HsK(M-5@FW3mTR>WQU6jYwLByqmIj-OfsAS>Gy=8- z(WpulB2W|{c6&E8T1<-HM(4t5&4F&I2a49iqqkAvvxemFW^HVo@HVzulLKEv;HfeT zcKf3ZUM9hW@B80!1=sn1X+$Kr?Ec+eD9%3g+o}Vy_gJ@k^8YPbz+Gq0{Ps_Ay?4Lx zVf4t+@;%?fGa%x~{!eqg=2g5~feG1M;2)p#DmIf-!H<#ke6B%0(-F9RTcj~+DsYM{ zG8uD7xml~8ObR>ntKhp8bKh-VOp!97hmKgxPX|Vb3%31RkTHT}4 z-b`bZgb5+8G7wa=6~~@y#Ta@9Y3K(@*uJ?DT*D?ijV6Z1bx9@b>*`=3{I@`-iSx{S z^5UPcdQC=0&g$%&Cg^#e#g0c#y4IWGzF0Z|gkW#$*kkGy|3n-oi+<@Yd|f#&D6H); z#eHIF4cf`SMs96A-K2?wQ)p!eXobz31E>HWig-zepRIlJ=kC=@esl!oP0RpKJ~IEr zR)9q75kfdl1mQcm;p72xj2LrZNh1B?NqToM79W0)JJ*_@Fd=-pS=9)eGt0&ng$0x+NMs)Dhfh zStdCKFKAy9y$c&b&4}gzRS3->(c>CaH7-cYasFJnyl{$JgNy;@IQApif>JaNrZ1r` z7s^p>OZaz=^_Snr#`0J~4@wKgw%q7_e6_1yzV*;Ymvp31{d=uy(qmF0?Q~nTpIlI| z`C}RTRAFEA6zl7hG?Vmt>_Fsj!_$=7-d>8y1*g&Y$I~B^92yc+wJpaXyWlC#m9$ak zw5-n;a>#GJMIb0-Na4V?0$`9)%DCrVB=7#m^B>6FLq^Me9ve)LFMZSi2_uEIIQig@ zo#N&ABMI8osuRQwQOeXLXE5ApBPu3UHML*t`suzUkO>Cd9R`go2oQ>+t>#fvwO;Sq znM!gnoz^8FJjaB|6j?mv!hQ=SN!hoNWI`@t7x6PE&JVT$<@IEl$2nxYzxDY<0a>~2 z<5~Jw?>#U2%+KEhSC^r-B=erzrJ$DND+4^eL)*VLKk{huUncIln1c^u@ewu2+{$SKH$u3fIzWT zmPd_J!Fv}a@=W*AZXkM zdB`!@r7@cW3!=f8^Ng>jJ8F!>8E?p&FU6O~$OYkc9ri;v>xF|Z`Rzv^luEuOa1ngp zuVodQ2m6nQr;g3jJ3=={*BHQ$Rs2cy<#aJlZKk{er?y(R-r&AEMD2W2+%#__o)=(g z^1l2FN#gT?e3IH~3w+cU$8xmFYe!7KkA^l>89&oc2OKCs?|+PbbaMfrWWhK)5_rkl(O1^jl;f>>*)(g9q_=#KtK0O zxtB-iliD1bzE9-JHnp4zC#cULyen<*B`MA;4)IEFoa85copVUO+aS@3ZIJLxyih|P zntgiVwapjyzncZCO5|H>ARZCG6G#r|pKq11Ao%||ux6(2n)z_Uco@*`&yJQK3E7U@ zKE5;JYx_C8C|OwyWfx2zy&4StEkc+HM-HBP(7pt7s5IKB%+X|k_b`$Qs0ztEX#cx8 z?HQJJb9(VyM;EM(X4mb5i(!G&VgX0I+;d#&z+#Ybk#2~IN60+GroEH76XzZI1v^f- zyqfm*-KF~YXXUr*F6}5vnfyq+J@r6G)H$n6K^$IPyjDIUV`fDZB~*jc9pqrG zuk3fnY7%zY@ge0Qub``?l3jS_SA?u&s1~KpMWGe)CP~cPcIe?BEMvRj_Z|?*N)R`% zh-Ul*^g`p_7n6^cerHHolk#|ZkvQg za^L>*58R#^o^3p@=$ntqN&%s^E#0)kjlD*lwmGbCmXC1Hgzy;~O(mJR#yWri8@s#V z)+DeLxv!cd2hC|`EsPOIdZ{Bf<SJf89Icob%Usyi#&jRBgbv^3hR|5XLtcMG;H z?m3=!>CV+2dD_IK51*vp8>Tk}xv|r>;Xv6LDMr?pT@B{oEnlJ19sI^4n8~5J&|};#@M~pWd$n zU8d=2vtwq??C`_*fx1Viqkt=yh`F{Hb6mph2Q-)~<5NXlPz<6vB=Pk&L|67DUCbqo zMt4Kvs7ke~`E~2JaQ!MbRCDjzgu*mBOg1!qSv0CH`{+OMNnCI_&MLN5MePr@n7Of!>h*pGqj88 z&xzS((iQS}F!TqLPFK1k;k8}VU4Iv@kNSlC6TY%-x_5{7Gij68*jzUT=y!Yy*PZ&= zwMog04R^AGn;<%Rcg9A)UaA`5v{X|D2C`3#w^Y9wx@E@`RS|v5tCD#h1Ug>x8Imd|L?A{IG$8 zTdtlO#(T3{oFRhp&6u2#F%Os@3xJ?U>4AtHUmeZCJtEKvY|b0oWsc2~9QoS(477fz zX?DY;Bo-dOvtvyXd-Lq+qjyGo%%ixow`>frSB<#JO;HBv;gOfGEWeT{BraDU`Ip6y z%bxu_NT1HsZxP#F>|2Mwv>ypJ^Abt{;ig{lX8Gx|k4I{Kt37O%7fYC-j-37Kw+H{i zh~|Dxjd6Ip)kJ3D*!E(sgew8Kxp60&S62AeJA}(?~Q1+u~nx61@(n(ZtW66Jd+1U%{jd z4Li0phTNC*$~>-Z;~-*F>mb)^Tm8UYVlFk{T;B^XXEcBS~LZMn5PVi z)6sl5_bLd~dQp6rb|_ym+EBT~65Q{f9W?YDeO6N{?N>fEx>j_JG@f*bD(qHMZuS%_ zlV5|m;sG1^{0$43=LKG~C&_u=olkwwjr0`lAjm7FiGfD?#ILaQI$I`8hYZ{8Im0vFN!!MfcrL zgB5c-onIe%X^R5Ave)syPK=KQ_tS>+)RE%x`+S@4qd>JmrMo=qwq$|s{ODc0mkpRH zOwex7Pmcnv^oeDK^e`yBk2TKJ44lYX0ZtnBz}$%pKZd*qoxxLxX|VM>XbVpr>#+Fz zW&3{8?ul!%a^jNx2;qT86sNtBL0$KnDGxiX4-iMxCml(DnKZ`+3cVR0#?1j)B&%Y1 zHMjC5AgsiZ58*HQpB~8MyS7ih%J_Jn*dyw6TPvjM9j}G2nWSk6hP3RGKr`>7k3K4E z!LrZwzBXbvr`hh77cF1wZM2owj^Yc4u?tVR$c-v55${H)U`F&L z@C~YBM4%ZQZhHDO_F~L`FTLiA(QPTvbElxw8xE++K=`0`*3t8W7mX@Vt|xDo+Pn*T z`Gw%v#6*a{5Zt#_$veya5&X2?Ki`eD5I(QUf9pAU6#65dVi1WEhMiW=krz6e(t+R(ZOTF|#XGu~5{ElQc=uS<6cE1rz zKMr#QjZ=ASirHQTMc4wY6&-?l&wk@T3N3()`SrEeqt$w1lH`%(EfbKrgjPLkq3W#h zw3Y#sme(W-fk^pl+ot)!8DPs>Glxg7rtdv)uy)mWcIH1uJOm$rsszo?B*3WzFsb~3 zg4F@Cn~*SUtH5M<1E5E5IAmjMZPmRVlP;2fSUnlSp2=hmbIYQ~gQA0l<9Cku$!n7H7=DK5VGL#lWVuKX=bp$@ zb4+m7s(xj{2w1?+F=5%3Y=V>_ea2ui?-_13$tU zynl*b(n06Km6b?`u#Rur4Z1%n6jp)9brjhFrLtmkvS`U4xEsCYPCk<0M$G)U$@SWk z*lBq?tbpEIM_?SULLe8)kt5LJ#`hv(tsC%D#5MUCCvIvQrp8UJ1N?&%+fK#XkHv*$ z?wNI38u^t7gq#K+_Cqyh0P5*zF5lU~Rnw3e9yok(IWM;GHS!2dq*chnz{B&HBTG7} zReO0n-lbKgs<2S2Qa0ofM^@mLdub%bdmxh0WY#oIp{@!J z3zEFiwM}}UF^yFbL1hIy(N~>Qv^`Qc9>#ff^8g*ot&*2iXLkB+xlmKg8Ao5n#+)q0 zF9lngq5;VsB;Eiycm-|V&~_6NTq z#+83bR;>ei6uxy%O?s_!~r4@Kn51_VuyWx@zeFHtDpVcaber8vKBUw_wuvp;~17b zyaq;~u@;Bu}pK0wU*hv+^ScP%s8Wsp%>o|9=I_o*bZY!OZqTkHq^W`He7G{sQ2ZVj7%*Vii6}moE*~ z=XMu~SCc@f9wJzsFZN!Z|A4Ko_i-!9!trXTADTyismsD^fIK$!Ju9 z={%Qa3(^L4dUQIl%t8otNy!QnK1792a@~!OItr)jh58PQgZ+Nrcr8ern06#Rb@ zp2(mY@?3io6Qf!zYQ2Cm0ALzgJ*IPgUP)9;!Zsp-(HPTNd?};aC?@eYng|tPjK(AF z%psuL<=r%wip=TA$k$YGU9L@}G{(P#@?&ZUe2gl-&G3GeNqnMNbA?huJw-3V0bm4f)h=Zn`s1nO%~A5HUf$n+S~mQ&IQ&-WyRSz7 z@?^2q@G4R@_{PwI8|<@#t9wK3>1A~brZt}zZ=M`Tnu+&rXS?*Jr`qA52J0>k>-~EK8ihzJ{_8({OyV=Z z%{Pj?Nqqzj-`-fE8C0>VM7Uu#|B*Fz1@KE-tTrhoEh3$>&a_>~D>@gI7O>7-!|zLU zSI@Nx0VZ>wdc`%C_{;eZ-Khx#6({jn-es`&9xSDzHf;Hu7Ag;n!Hti`TQHP7DI*w5?D)TfC6jlCMo_fMqG-Ed#BkN3c`4Xa1lMa6KrRPYG zCvO$7A;!KCfqZ7_MOV4#z<5ufn&J;o3KgBvr>^{K=bHJkOhrgjHxiN?tqg*QN<(u{ zX|Y$vMfEZ2k|*%_Ndekj%yp!=8~f-5m2-GTrI%1wIftn#9n^NTgCHd;VI}a^@Yn=- zIzon+h&qYvJqGjF<&BwS?IF~6!(XbQ3>ciX7HT`Mmh1)ZMWS?`2j$R9s{}U&t?Yv~ zb~o3JfR1)NuV$T!zLTti`Q#?)JOYkP6=5S+-Kq0uU<}jx(BvQ;!cRwvzmg){X9P#=6~*qoD?#OmFkur9X!>R2cn z;)L2i@5b_-Qj+AHD_Q;i6REfxel2;i3UF(5$z?D(5KoP=jfOh#Zz4l|SMi#KR@r<}7z1Wph>^-Wi*oOUAw` z){BmrE&ezq_s6kjb~x(4-hU10qs;j$8{hfc7dznMsB{s_`av{Znz$+^iwArsmXG4i zp8YGvZ-TvUip$q#v%EAjD$bsktiav3cX86MXFgA$AGUe!Mm@>SqAd$uA)gzx(Bo3C zSDO@^sFsHP($>U@b;#pO7&9zKBKGpI8|X!ca_vppW(Mop+>skGEe+Mu!*+JDx=2#~ zV>Zb!jJapfOE%Gol#z2c|Mb@JK>t@cU6T44N zDNXG}NR4?R2ul}K&N*o{040S=hyt}>)+vLM_?9^^qao9y0Gq*O-{8{dix~9Sn=$Vo zkmP^oOBF|C{6(KmZRJw}w$5An6ihNNlc?QZk}5O0h~UWV)^;XzxwsgIw&h{eNnpc8 zB?uT%PAQ(t;dU2;_WwdbLBRqN!P3bQ%ms1tFMv7*dCKVWchnOhR#F_^Mj%#XO(B-N)V@m&26~bn1wU)dB^v zX^_}0B^LD2AL3q5t?;}mT`7h%sN+?LA=W3e>C)K3$PyMO;Vx$q2+(v-Ep*^!YNtnXjmySVWwH>Js#Q+#-Tln*jn$ z)_9a1^TrFbMlaeL&U6*E8Y`=jzQ_GEWvOmf7qa*I3-PPjZ01Kaf%#SX1nkTH}7-x5bxr`>3aGiGyM&Utv@NM zk(;+w`Fk|^X=f8TY(X=$%v&H*&ItE5W}eTASZqSFuBk9`Gu~p8kkWdZO*TK`{fEd} z{HY&N!k6xH)ij} zOGzpdkjzJHQK~$%D->MSw=@iKDK?J-1gPx1BVtF8_f#bMd5@qv48hYL|H8r3nc0Tv zOli?Ldm#I-BH!BKK;Eir27If$!+c-%n2(=(f_^>K54hujgv;5~U2#Nn>^FG7J&3r6 z)~kTptQq%U?$oERT|GToh{(N9fL*y{9*f)m(n`ceBT2)V;k(cGemr)X6j8kSSwJWb zVPcWXpG}V*_LHmf{!OYJ{$}6dqFw>(kvHfJm7Z&evFGI(N@KS;D3x^uy4w|JKaR$) zT%-EmlXUV3mcAqvSg3e=?K}${A|+rEJ_eARHYCzcsI8>7(+@$MW}b>jMj{>b_=gC` znFOU+z>!m05YFMIfc5-1oI~T+&38aRW>cGn5N_bd;yA2$S^>B6^#N6WSc)Y%_`4wm%{Dp~UaA#%w zsM<z~Vn9E#_5h|ixg}ira zsjO4~fi#9OXA1bJOIPPJa+}(q(qO%~>BDQAnYoGAQE;F(hDHV@;J{&nAYcNm7Z30$ zmiQ`em$B$dIzk~Jba{$T&@?$XR_6S(aIhd@=pU+o`tp^6FCr5Y%}?z=?aTUQgw57#h$VknHY4wABP6gm-02-!ujZe|mo# zt1Wks!2HjN|Nkx*prTUOMm%ghDy58WQWNj z5*Sj`$ceNv>hc&KT8|GQfWEjp_PpB^Q1J#Zp@`;Ma3x#P6sZ=+7mufIZ z8Re6sHR8ON%+nD#_Ri-psXok@;LnA0m`ZVFfk5^BthOcf5m}tw_ETQts z9*TWzm&Zv7af4B)+yV%DKxSYYAa7LBvc`G5_%2GWJA`;P zgA}}aJhUmY`?%ur`_{7^d)G7-mb(%~gt0vrk1^|XEtn9u;nrMV93VUlHk1>#*dZ=y z+kxB9uHBscT0KK9`xoco1FWlvNkN1l7C~CvM}r_R=UDS7ob!;{eC&~z_ZXHt8Vn4- zdH0Jgr>%TK9@&BS5g;_Ft?!+GZO)i)*Up3aNi4qB9d16xpT&bUp#J2LNg(p;H5RXh z7g!Pj;2fSGF9(C*?Xq|kSi&vQaGGmMM9z~y(~vqS9Rh857$?F{I(SKdocHkcntV>X zEZK1gRp)cD7akC3lMhgNJb>&ab+k6nAFCaeyAkUqag^K^gH?I6$3uJF77oKIxPliesrZBEECl+GQVA z$gFgIm~Ts9zLW0mOCrRl(x95Sxt!lSER!AB!#G*Nt61$$XNFve$`mu}VWZ1p5i3eG zl*!7BCqB8riQ(=JM=iD3A#apNuzfM2cG;n@^H`iZ%=#e$fL}RiIy|3Kk*%E++>p!l zPXJL2iUPCvQ;oL{F7&Jm9NqRshw=iwH@`qY?wqQGn&$m~FG#NDJ=Qf!y9S+?ZTwL) zP1{~CBs|qk743tTuC%Qb{Q9=(c+YwK$Hk6`Q!BZDy!>>y#wh;()eG$%w7*R zl!<>CJo?jWh_Ype;)_$J&YP`+o&1KCGu+X=F}x^&oO(-BVvpaeg%2VnJ!G60mRpMW z2^RN2A#@W$cD#Fd@k!GEF#yRI{-?(E0=RvPUAO-C8rK)#8UfcNxIPBg=o|09i50+7 z!p-BKx@*-aJ)G%ruG-2?v5HCkvw=X2yVty<0!)bDexI%2d7xoNE{Ua)(&|aWx2{## zWNcq{PtK$Ici()LZ92zn0U>0c3zVN`+)S$U7Lc2G5@}KieDCvdFyMahrL^oB@c>@! z@`yur#RM4f30MJ0VqDU=^7eResLT`&GoDX8KbB2iW)#%QV}~(t6t`s^aSw?tcXh{d zYK<*-sS;hwY9!9?;ARJhY;D2&!oW;K0x)=SLIh}an6$;SiJwZbvSl=^mrAY)^WOhs z&b7n;@>=c}JMqO+Pa4g6`f(fcvRjfZNi-U0jOk3%3Y;Z17PZ`&SV?EODR$40FMGOi z>>en&Wk)g(2YT(3j5PaQDn0LF{*T*;U+~!c<1u#W>Os$t8=pCR`}zL<%iI`A8wZj_gE|-j2Ci#nbLuQ! zG>5<^5;U_AKw{>A9jhaQ3{g9zkdjDIq(5mqr%jO@w8=O6GPp{?Y%`(G1~3otJd__D z$8n%6z8)%d6f1POOp>yGw*8nz-baeBkmuKc_|pt`^n(}rMf@b?BX2*Ld(b9V*EbS& zRb>jB`oR=b%^SF^X1&iTog7@Orc$&AB#1Zc;<= z4{+FFvGQq?7R$VY^pF~ZsWe161V+lkgqYlbvLTONTGIAAp#$KXr z_J@7EL*SPppKF%Ywau|qYA`zvL9?$u$ei%ZM~v}SVTq*rN%OXNaO8+4-@x}-5J*0U zW9b{--^{j?fN9yIRlhB%s(0%ab_X+Eilr**&A|+`s~MpzY-YL&7oPNe2)PKKiDNoQ zk3UFi`n*t4FOD@}Ix_g2h_LF`HF|G9tP>^|s4c){qBx|7wh#FV7lPF6fl`4>aE%nK zXHOAJ(XM&F{s}|epq!z&J8MrjdJWbO7&`+qa)y|+Ji7OO!%n>M=zy|d+iHRRqOf>x z?x`M4_i+IWzP(TRYb0Sp`Rmrg%Y}b4id)-3=5Tv@HMI;=iXb(ZMDN!8MJJ}wt=Hme zU(RYbmPAr{n9foL2_+4fH=oh}mQD4-pWlBitEF}p0E#xh80nmmWdvyJH!b*spsgIH zPky~_Tos2X30M8tmouy#BL|y@)>cNFtsV=GS2GuB(=OAfE#q?bu!%8aKX$Fc(;xDJ zl%FTnKFw%J6_=@`Me4(NPM~_SCUbPiV>PMdE14W{z8*-M$pjnh`(HcOX4FjBU|25B zdgAGIIm%-VtAiP1dl}5(O$KC$*u-EX5QHkEN9$UOw+XHm)j?1uMsd$IaNOv0@(VLny-i1Ron}_}yt?4{GE-n)Pg9GU!6+8kw z<>Ef6V7>z^_ZU`%rknIQBIDJr_wiH~j;zA%C0JlX-F!}xKp^;*Ra%pV)szvCc4>{* zA$>!ZGT%&6Ag%}NhCMnO!r#iPvrrMlkuksBQsxTpB%?mtG6933zODRuMdG28NI}>S z?OpMsvmKm!h=7oyyA(Df_0bYkka0JxrmGXI3?F-%>9owQ?>d`f7;0?fqxg3$9k3m}x zt(k4crUO>?`9f8_u=Pgef`&|zj(LypuaPpT+81urK1OJor70PSn>;N0yIUA z%*q~nb0`uPma&|H3`95 z;H4n%(P$7o0T*ay$R)kNMWVpr_zhO5q*x^--T#2CP~M3qeqP;Rmjdy z#7^upC(^B%^_wf8V%zB7{^LmWg8VW3r?Y$I?t>PA0N4aAK?ZR8WtM)jE;{t(_O<`Ux>!|@YEE0PF++fIff*Rromg(svYJuKDfOw+(( zlo!#r9|gWgv(bc(4OLHQMqU-;U`U6J-#W+yvwvys>Iz3am;o;^sq^yMZwHbm96Y;e zSAb`Ga`g9GcX?v$9yTSxprb7l6I3S0NBJ_nJW6rcW@uS_o=`f5*?fNCRQeyK&l93` zkV;N%u>$+1Ef_41tsZ+*({h&?2_+OT710I5xnrSf*|?3qZG$m=lo`=8mY)R%0uEVpgE0;L<`(Z%Pj&j`vKwa_uyen8;xbXA zKyJM#jeqt1Wy%fI5WgOgJ?_g`?`&s86JCs4Cv-q&jUzdoNNyulh?|p%Rrd3dtWNz9544!4MR5&I ztJwjxL=I%H(-_ky!VY0R9IY|$2CGSqC%o71k62?gbJe2nE2rj~Qyp8^=W@`|&#}eb zRSa(spR`DvQSkQYh@}Z?&)~Yfqg<$2U8ze@o^>E$rz$ziRmc}7mTGbX@$h*9q!Ft* zh@THLUUAU)w5IQ5oP+}aGKxt-A9nGHPV7Xd7`feAEBXN;1(eriwHAhJ9%5UBBy?5S z=Osv#f_a2hL*_aO>GLp88ZXt57h;6kWXEi!L;%hgvpJ9DeeI~M(*oYO`BCZxnikS; z>d4btO_KxaIA&{%$D{v~<3xti#g-`TrDX*6P5M)1TJj^xp&1#mG;YZ>`+9mY)fCe% zsGarI&jLeT?JTilJ69s0G!;UzgijEhHv+sfe zM4wp&v!A>G5eK`lu1sNTTh=sDy)>jtX;5Ay)s;LE984eU)bbGFt)|%S5092gEXVKM zkTWP<%6{HFB#YnjuPvfYr{$Be+^!v^)$&u4)Ki*!f;e`+0W2l+p7J9NvsX%1PPHz) zK-6D>jJF>NG6knAxR!MHmMZ^);J0^_CBK`f8rV6aMqdAFXJLJ>5MIcm@j#ODUhEcy z+_C*PpWYuuVOW+S3as+o)~zj3)6lY*>`8Uw)}5*}JC;yu^UQdfJu_txB(eDJuYId!sB6^vhO;wC|6z*sFFA^p}!%yt?I8t$Es!epZsoFrN(JzU>=q^Bo zn2aMyZ4}2Xh`@j&Vf)%@DA$Dr`t4h%hj=0T+71_>%CSSA`x2HtslhzzWpj~KN0W?M zeeUFoK_1^F5?i()LmHOM=fU`PM;@ca)9k=P3C!#Nezl_DoLN(9pcClB4M?(dOWDD1 zCT{rl8)-~KWVGe(#OhILlxf+RRpgu=#E$}s?7jq&nu(vW%C9m zy6^q!7Y1vNpR0?aok(g2u@p5jviNzh6{TON-#b^fE&Dag-Blyhf@8g3+ME77G{}J9 z^*LFAK%N%Ck0~qhIq*ur0MHzRqSwuw4;;}asmkyalCaQ(<7mzyuT;K12Vn$K{*6~5 zsnOO5Flz>1u@GuWvM)$R> zqMYmC)k5o$s0u3J081XqwNaQlLywj`h-tp@{UAu3Tyk-JT!Do^Aj#6zZC)9TmXzC- zzu@!vJ7E0~QYGjbEJ1BcR08AC*AA_mL(8j~*Ld6S+BlY{ zst-L<X)jf7ncft)npn4E}UQ0kC(Kj$nSYU>C0$}AXQz`^1t<~ihiV*q+=A7 zD6|tEqr{e6)K5~be$H>_hfzo(e`b+eYZ&oV2X9jBWH}tgR0%x69$2gTQGvwLK7s!1 ze$zqti4

zkjYi1%8x`h}eT^zP!u4!zM{r4vqzJ=gg>iHDH!XA{5(e_JSD?+nvWr zb7K~tovDW=tiZ^S8i)%)xC5+kFC&onp`IeYPBhA?TYf-wEDC3NTNvqx-_o+`Lw2SN?JJc=BN1Ef9 zS$RdKEaQ&bZ60o*!E8EWFMpxd*Zh2Ve2@Q&ow_?OKU>(G=s&gB!vAaJD&fHCmnXXU z!Y#UwxX0h!Hz_IF!uObGG^h4|jT8N3qCI0q&4^rU7P~8dxgmXUrqr=dnLh^+n&~vb zdBp`9+?Ah>(n}qr$9*^rWG#|ZnO`G0(U7fAMoXHN0oLI6k^~nNrvC_-g>rfPV~*q4 zqdvl892NY`O|5@PVGT;Yrk=EVEBH{YAir@bW45(+mUP-_B@*5%KqO&=CvS|wrC6LNtf$-fNn&tb?u~RT{}%;;UK+0OD0- zxtD~dYBuH;usV710hu-;K!~5BTEb0KmJaeJ;EX<)@m0NR*1tq6A*pBVb2v@v{oISu=i6d*Nuqj6S2I>mzSSflRpjaqw?vG}Kqq{@9+h_* zJB!k_6eU#%Y|5G8dhyS4U$LISpbDClwp_5|?Wy-fL$OJIDF@QAALeVk1Rig=5#?jP zc_q2az0$*=)F{>5Sys*Z4VFZpSN1?*XB=$m@+pW~{duGNOv$hNhky4c;xAj6rv?X_ z63Ulof*(V_6q**3eq7wQB{A`j3&X$5A0BX>J)Q*z*-KkNS=-H2lqZhxe<}%$7Al`E zrdK!r7-gOwG}%%0nWlgekW~l>k>oN($vfad2y*ik7LD7GvU5*6@eCY|M#!;O;Qx=l z6n^+W^(z3Zfd289r8NxHt7gIVA-Mh<>+TBtu4CZuV~-nPealZrDG2WD*Gai)2t~r7 zwZw8MVmx=e<-SD9(9qds?DQPzrwNgeM^DCO*M zH@5-eMyMz+uZWr#wgL4#e%JW60oAXNO>2jLdbjd!UhlW<7$owfeq^g}F-7TzS82

HOArs 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 OTee&CKF|N_GWlQWw_FYY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/immersiveintelligence/sounds/weapons/weapon_placed/weapon_placed1.ogg b/src/main/resources/assets/immersiveintelligence/sounds/weapons/weapon_placed/weapon_placed1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..968b04a959c542f4bf69c67e35fe892f09da4c9f GIT binary patch literal 128145 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 Uh=k^jUpn`1uMfqS|KCga-_HEwW&i*H literal 0 HcmV?d00001 From 3679ead4efe4061bbefa0f395c9e97cd3592503d Mon Sep 17 00:00:00 2001 From: Pabilo8 Date: Tue, 26 May 2026 19:01:08 +0200 Subject: [PATCH 06/23] Added nightvision shader, mostly finished machinegun re-implementation --- .../api/ammo/utils/AmmoFactory.java | 21 +- .../client/ClientEventHandler.java | 42 ++- .../inworld_overlay/VehicleDebugOverlay.java | 4 +- .../gui/overlay/gun/GuiOverlayGunBase.java | 14 +- .../gui/overlay/gun/GuiOverlayMachinegun.java | 16 +- .../gui/overlay/gun/GuiOverlayRifle.java | 2 +- .../entity/weapon/MachinegunRenderer.java | 24 +- .../common/IIConfigHandler.java | 2 +- .../immersiveintelligence/common/IIUtils.java | 33 +- .../mounted_weapon/EntityMachinegun.java | 129 ++++++-- .../entity/mounted_weapon/EntityMortar.java | 5 +- .../mounted_weapon/EntityMountedWeapon.java | 33 +- .../mounted_weapon/EntityTripodPeriscope.java | 7 +- .../common/entity/vehicle/EntityDrone.java | 24 +- .../entity/vehicle/EntityMotorbike.java | 16 +- .../vehicle/EntityTrackedMotorbike.java | 16 +- .../entity/vehicle/EntityVehicleBase.java | 6 +- .../towable/gun/EntityFieldHowitzer.java | 12 +- .../entity/vehicle/utils/VehicleFuelTank.java | 7 +- .../vehicle/utils/part/EntityVehiclePart.java | 10 +- .../utils/part/EntityVehicleWheel.java | 4 +- .../vehicle/utils/part/IVehicleComponent.java | 4 +- .../utils/propulsion/VehicleEngineBase.java | 8 +- .../utils/propulsion/VehicleTransmission.java | 8 +- .../item/ammo/gun/ItemIIAmmoMachinegun.java | 2 +- .../ammo/gun/ItemIIAmmoSubmachinegun.java | 2 +- .../common/item/tools/ItemIIBinoculars.java | 27 +- .../item/weapons/ItemIIAssaultRifle.java | 6 +- .../item/weapons/ItemIIWeaponUpgrade.java | 6 +- .../entity/SyncedDurability.java} | 10 +- .../common/util/gun/GunAmmoProvider.java | 209 +++++++++++++ .../common/util/gun/GunRecoil.java | 16 +- .../common/util/gun/GunShootingHandler.java | 118 +++++++- .../GunAmmoProviderAmmoCrate.java | 55 ++++ .../ammoprovider/GunAmmoProviderMagazine.java | 282 ++++++++++++++++++ .../ammoprovider/GunAmmoProviderSingle.java | 131 ++++++++ .../common/util/item/IItemEntityPlacer.java | 6 +- .../shaders/post/nightvision.json | 61 ++++ 38 files changed, 1190 insertions(+), 188 deletions(-) rename src/main/java/pl/pabilo8/immersiveintelligence/common/{entity/vehicle/utils/VehicleDurability.java => util/entity/SyncedDurability.java} (82%) create mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunAmmoProvider.java create mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/ammoprovider/GunAmmoProviderAmmoCrate.java create mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/ammoprovider/GunAmmoProviderMagazine.java create mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/ammoprovider/GunAmmoProviderSingle.java create mode 100644 src/main/resources/assets/immersiveintelligence/shaders/post/nightvision.json diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/api/ammo/utils/AmmoFactory.java b/src/main/java/pl/pabilo8/immersiveintelligence/api/ammo/utils/AmmoFactory.java index d7aa8eb40..20e541e6d 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/api/ammo/utils/AmmoFactory.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/api/ammo/utils/AmmoFactory.java @@ -116,7 +116,7 @@ public AmmoFactory(World world) public AmmoFactory setStack(ItemStack stack) { this.stack = stack; - this.ammo = ((IAmmoType)stack.getItem()); + this.ammo = this.stack.isEmpty()?null: ((IAmmoType)stack.getItem()); return this; } @@ -259,6 +259,8 @@ public AmmoFactory setUseArtilleryAngles(boolean useArtilleryAngles) return this; } + //--- Ammo Entity Creation ---// + /** * Builds the ammo based on passed data and spawns it in the world. * @@ -363,4 +365,21 @@ public boolean isValidAmmo(ItemStack stack) return false; return stack.getItem()==ammo&&!((IAmmoTypeItem)ammo).isBulletCore(stack); } + + //--- Getters ---// + + public World getWorld() + { + return world.get(); + } + + public Vec3d getPos() + { + return pos; + } + + public Vec3d getDirection() + { + return dir; + } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/ClientEventHandler.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/ClientEventHandler.java index 90f2bda49..64cd5ca7c 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/ClientEventHandler.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/ClientEventHandler.java @@ -22,6 +22,7 @@ import net.minecraft.client.multiplayer.WorldClient; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.GlStateManager.FogMode; +import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.entity.Render; import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.IResourceManager; @@ -56,6 +57,7 @@ import net.minecraftforge.event.GameRuleChangeEvent; import net.minecraftforge.event.entity.player.ItemTooltipEvent; import net.minecraftforge.event.world.WorldEvent.Load; +import net.minecraftforge.fml.client.registry.ClientRegistry; import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent.ClientTickEvent; @@ -99,6 +101,7 @@ import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Graphics; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons; +import pl.pabilo8.immersiveintelligence.common.entity.EntityCamera; import pl.pabilo8.immersiveintelligence.common.entity.ammo.types.EntityAmmoProjectile; import pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon.EntityMountedWeapon; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.EntityVehicleSeat; @@ -139,7 +142,7 @@ public class ClientEventHandler implements ISelectiveResourceReloadListener private static final ArrayList SCREEN_SHAKE_EFFECTS = new ArrayList<>(); public static GuiScreen lastGui = null; //Whether the Light Engineer Armor is worn - public static boolean gotTheDrip; + public static boolean gotTheDrip = false, nightVisionActive = false; static { @@ -989,16 +992,17 @@ public void onGameRuleChange(GameRuleChangeEvent event) @SubscribeEvent public void onPostClientTick(ClientTickEvent event) { - if(event.phase==Phase.END) - { - if(ParticleSystem.INSTANCE!=null) - ParticleSystem.INSTANCE.updateParticles(); + if(event.phase!=Phase.END) + return; + Minecraft mc = ClientUtils.mc(); + + if(ParticleSystem.INSTANCE!=null) + ParticleSystem.INSTANCE.updateParticles(); - if(!Weapons.bulletsWhistleSound) - return; + if(mc.world!=null&&mc.player!=null) + { //Make close bullets produce a whistling sound - Minecraft mc = ClientUtils.mc(); - if(mc.world!=null&&mc.player!=null) + if(Weapons.bulletsWhistleSound) { List bullets = mc.world.getEntitiesWithinAABB(EntityAmmoProjectile.class, mc.player.getEntityBoundingBox().grow(3)); for(EntityAmmoProjectile bullet : bullets) @@ -1006,8 +1010,24 @@ public void onPostClientTick(ClientTickEvent event) //higher the velocity (howitzers), lower the tone bullet.playSound(IISounds.bulletFlyby, 0.6f, 1.75f-MathHelper.clamp(bullet.getVelocity()/6f, 0.5f, 1.75f)); } + + //Handle nightvision effect + if(OpenGlHelper.shadersSupported) + { + PotionEffect effect = mc.player.getActivePotionEffect(IIPotions.infraredVision); + if(effect!=null&&!nightVisionActive) + { + mc.entityRenderer.loadShader(IIReference.RES_II.with("shaders/post/nightvision.json")); + ClientRegistry.registerEntityShader(EntityCamera.class, IIReference.RES_II.with("shaders/post/nightvision.json")); + nightVisionActive = true; + } + else if(effect==null&&nightVisionActive) + { + mc.entityRenderer.stopUseShader(); + ClientRegistry.registerEntityShader(EntityCamera.class, null); + nightVisionActive = false; + } + } } } - - } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/inworld_overlay/VehicleDebugOverlay.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/inworld_overlay/VehicleDebugOverlay.java index e76e13825..afe25c0f1 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/inworld_overlay/VehicleDebugOverlay.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/inworld_overlay/VehicleDebugOverlay.java @@ -15,12 +15,12 @@ import pl.pabilo8.immersiveintelligence.client.IIClientUtils; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Graphics; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.EntityVehicleBase; -import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleDurability; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.EntityVehiclePart; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.EntityVehicleWheel; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.VerticalForces; import pl.pabilo8.immersiveintelligence.common.util.IIColor; import pl.pabilo8.immersiveintelligence.common.util.entity.IIEntityUtils; +import pl.pabilo8.immersiveintelligence.common.util.entity.SyncedDurability; import javax.annotation.Nonnull; import java.util.List; @@ -115,7 +115,7 @@ else if(part.durability!=vehicle.durabilityMain) GlStateManager.rotate(-player.rotationPitch, 1, 0, 0); GlStateManager.scale(0.0625f/2, -0.0625f/2, 0.0625f/2); - VehicleDurability durability = part.getDurability(); + SyncedDurability durability = part.getDurability(); String[] lines; if(durability!=null) lines = new String[]{ diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/overlay/gun/GuiOverlayGunBase.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/overlay/gun/GuiOverlayGunBase.java index c946cd3e2..8bf51f647 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/overlay/gun/GuiOverlayGunBase.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/overlay/gun/GuiOverlayGunBase.java @@ -9,6 +9,7 @@ import pl.pabilo8.immersiveintelligence.client.util.IIDrawUtils; import pl.pabilo8.immersiveintelligence.common.IIContent; import pl.pabilo8.immersiveintelligence.common.util.IIColor; +import pl.pabilo8.immersiveintelligence.common.util.gun.GunAmmoProvider; /** * @author Pabilo8 (pabilo@iiteam.net) @@ -16,14 +17,17 @@ */ public abstract class GuiOverlayGunBase extends GuiOverlayBase { - void drawMagazine(ItemStack magazine, int width, int height) + protected void drawMagazine(GunAmmoProvider provider, int width, int height) { - drawMagazine(width, height, - IIContent.itemBulletMagazine.readInventory(magazine) - ); + drawMagazine(provider.getAmmoList(), width, height); + } + + protected void drawMagazine(ItemStack magazine, int width, int height) + { + drawMagazine(IIContent.itemBulletMagazine.readInventory(magazine), width, height); } - public void drawMagazine(int width, int height, NonNullList ammo) + protected void drawMagazine(NonNullList ammo, int width, int height) { IIDrawUtils draw = IIDrawUtils.startTexturedColored(); draw.drawTexColorRect(width-38, height-27, 36, 25, IIColor.WHITE, 15/256f, (15+36)/256f, 29/256f, (29+25)/256f); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/overlay/gun/GuiOverlayMachinegun.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/overlay/gun/GuiOverlayMachinegun.java index 587e0e06f..a46ced272 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/overlay/gun/GuiOverlayMachinegun.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/overlay/gun/GuiOverlayMachinegun.java @@ -34,12 +34,18 @@ public void draw(@Nonnull EntityPlayer player, @Nullable RayTraceResult mouseOve final EntityMachinegun mg = (EntityMachinegun)player.getRidingEntity(); assert mg!=null; - if(mg.upgrades.contains(WeaponUpgrade.SECOND_MAGAZINE)) - drawMagazine(mg.magazine2, width, height); - - drawMagazine(mg.magazine1, width, height); - + //Draw loaded ammo + if(mg.upgrades.contains(WeaponUpgrade.BELT_FED_LOADER)) + drawMagazine(mg.loadingCrate, width, height); + else + { + if(mg.upgrades.contains(WeaponUpgrade.SECOND_MAGAZINE)) + drawMagazine(mg.loadingMagazine2, width, height); + drawMagazine(mg.loadingMagazine1, width, height); + } bindHUDTexture(); + + //Draw Overheat IIDrawUtils draw = IIDrawUtils.startTexturedColored() .setOffset(width-38-24, height) .drawTexColorRect(0, -20, 22, 18, IIColor.WHITE, 0/256f, 22/256f, 62/256f, 80/256f) diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/overlay/gun/GuiOverlayRifle.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/overlay/gun/GuiOverlayRifle.java index ebc88dd4d..31c5f0785 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/overlay/gun/GuiOverlayRifle.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/overlay/gun/GuiOverlayRifle.java @@ -40,7 +40,7 @@ public void draw(@Nonnull EntityPlayer player, @Nullable RayTraceResult mouseOve NonNullList ammo = NonNullList.create(); for(NBTBase nbtBase : IIContent.itemRifle.getAmmoList(stack)) ammo.add(new ItemStack(((NBTTagCompound)nbtBase))); - drawMagazine(width, height, ammo); + drawMagazine(ammo, width, height); } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/weapon/MachinegunRenderer.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/weapon/MachinegunRenderer.java index 8aa64a95b..c0ddf3259 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/weapon/MachinegunRenderer.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/weapon/MachinegunRenderer.java @@ -150,15 +150,8 @@ public static void renderMachinegun(ItemStack stack, @Nullable EntityMachinegun { case "ammo": { - boolean should_render = false; -// if(entity.currentlyLoaded==1) - { - GlStateManager.translate(0f, 0.375f*entity.shooting.getLoadingProgress(partialTicks), 0f); - should_render = true; - } -// else if(!entity.magazine1.isEmpty()) -// should_render = true; - + boolean should_render = entity.loadingMagazine1.getLoadingProgress(partialTicks) > 0; + GlStateManager.translate(0f, 0.375f*(1f-entity.loadingMagazine1.getLoadingProgress(partialTicks)), 0f); if(should_render) nmod.render(0.0625f); break; @@ -234,15 +227,8 @@ public static void renderMachinegun(ItemStack stack, @Nullable EntityMachinegun break; case "second_magazine_mag": { - boolean should_render = false; - //if(entity.currentlyLoaded==2) - { - GlStateManager.translate(0f, 0.375f*entity.shooting.getLoadingProgress(partialTicks), 0f); - should_render = true; - } -// else if(!entity.magazine2.isEmpty()) -// should_render = true; - + boolean should_render = entity.loadingMagazine2.getLoadingProgress(partialTicks) > 0; + GlStateManager.translate(0f, 0.375f*(entity.loadingMagazine2.getLoadingProgress(partialTicks)), 0f); if(should_render) nmod.render(0.0625f); break; @@ -250,7 +236,7 @@ public static void renderMachinegun(ItemStack stack, @Nullable EntityMachinegun case "slide": //if(entity.currentlyLoaded==1) { - float curr = (entity.shooting.getLoadingProgress(partialTicks)-0.5f)/0.5f; + float curr = (entity.gunHandler.getLoadingProgress(partialTicks)-0.5f)/0.5f; float progress; if(curr > 0.65) progress = 1f-(curr-0.65f)/0.35f; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/IIConfigHandler.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/IIConfigHandler.java index a1f2d2ddf..087a133e1 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/IIConfigHandler.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/IIConfigHandler.java @@ -1883,7 +1883,7 @@ public static class Machinegun @Comment({"Max zoom of a machinegun with a scope mounted (in Blu's Unit of Distance Measurement™)."}) @RequiresMcRestart - public static float[] machinegunScopeMaxZoom = new float[]{0.55f, 0.35f, 0.15f}; + public static float[] machinegunScopeZoom = new float[]{0.15f, 0.35f, 0.55f}; @Comment({"Shield's initial strength (resistance vs attacks)."}) public static int shieldStrengthInitial = 45; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/IIUtils.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/IIUtils.java index 4fc3cf628..b77d7d207 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/IIUtils.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/IIUtils.java @@ -16,9 +16,12 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.client.resources.I18n; import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.init.MobEffects; import net.minecraft.item.ItemStack; +import net.minecraft.potion.PotionEffect; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.NonNullList; @@ -52,11 +55,7 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; +import java.util.*; import java.util.function.Function; import java.util.function.Predicate; @@ -400,6 +399,30 @@ public static void giveOrDropStack(@Nonnull Entity entity, ItemStack stack) Utils.dropStackAtPos(entity.world, entity.getPosition(), stack); } + /** + * Applies infrared vision to the entity if it's dark enough, otherwise blinds it. + * + * @return true if infrared vision was applied, false if the entity was blinded + */ + public static boolean applyInfraredVision(Entity entity, int duration) + { + //Entity does not support potion effects + if(!(entity instanceof EntityLivingBase)||entity.world.isRemote) + return false; + + //Apply infrared in darkness or blind the entity + if(entity.world.getLightBrightness(entity.getPosition()) <= 0.5f) + { + ((EntityLivingBase)entity).addPotionEffect(new PotionEffect(IIPotions.infraredVision, duration, 1, true, false)); + return true; + } + else + { + ((EntityLivingBase)entity).addPotionEffect(new PotionEffect(MobEffects.BLINDNESS, 240, 1, false, false)); + return false; + } + } + @Nullable public static T requireMaster(@Nullable T object, @Nonnull Function master) { diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMachinegun.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMachinegun.java index 194c2803a..c8077d216 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMachinegun.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMachinegun.java @@ -1,5 +1,7 @@ package pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon; +import blusunrize.immersiveengineering.api.energy.immersiveflux.FluxStorage; +import blusunrize.immersiveengineering.common.util.ItemNBTHelper; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -9,6 +11,8 @@ import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; +import net.minecraftforge.energy.CapabilityEnergy; +import net.minecraftforge.energy.IEnergyStorage; import net.minecraftforge.fluids.FluidUtil; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -22,17 +26,24 @@ import pl.pabilo8.immersiveintelligence.client.ClientProxy; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons.Machinegun; import pl.pabilo8.immersiveintelligence.common.IIContent; +import pl.pabilo8.immersiveintelligence.common.IISounds; +import pl.pabilo8.immersiveintelligence.common.IIUtils; import pl.pabilo8.immersiveintelligence.common.entity.ammo.types.EntityAmmoProjectile; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleControls; -import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleDurability; +import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleControls.MouseBinding; +import pl.pabilo8.immersiveintelligence.common.item.ammo.ItemIIBulletMagazine.Magazines; import pl.pabilo8.immersiveintelligence.common.item.weapons.ItemIIWeaponUpgrade.WeaponUpgrade; import pl.pabilo8.immersiveintelligence.common.util.FilteredFluidTank; import pl.pabilo8.immersiveintelligence.common.util.IIMath; import pl.pabilo8.immersiveintelligence.common.util.IIReference; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.EasyNBT; import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT; import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT.SyncEvents; +import pl.pabilo8.immersiveintelligence.common.util.entity.SyncedDurability; import pl.pabilo8.immersiveintelligence.common.util.gun.GunRecoil; import pl.pabilo8.immersiveintelligence.common.util.gun.GunShootingHandler; +import pl.pabilo8.immersiveintelligence.common.util.gun.ammoprovider.GunAmmoProviderAmmoCrate; +import pl.pabilo8.immersiveintelligence.common.util.gun.ammoprovider.GunAmmoProviderMagazine; import javax.annotation.Nonnull; import java.util.EnumSet; @@ -45,30 +56,36 @@ */ public class EntityMachinegun extends EntityMountedWeapon implements IAdvancedTextOverlay, IEntitySpecialRepairable, ICameraEntity { - private final static ZoomSettings SCOPE = new ZoomSettings(Machinegun.machinegunScopeMaxZoom, + private final static ZoomSettings SCOPE = new ZoomSettings(Machinegun.machinegunScopeZoom, IIReference.RES_TEXTURES_GUI.with("item/machinegun/scope.png")); - private final static ZoomSettings SCOPE_IR = new ZoomSettings(Machinegun.machinegunScopeMaxZoom, - IIReference.RES_TEXTURES_GUI.with("item/machinegun/scope_ir.png")); + private final static ZoomSettings SCOPE_IR = new ZoomSettings(Machinegun.machinegunScopeZoom, + IIReference.RES_TEXTURES_GUI.with("item/machinegun/scope_infrared.png")); private final AmmoFactory ammoFactory = new AmmoFactory<>(this); public EnumSet upgrades = EnumSet.noneOf(WeaponUpgrade.class); + @SyncNBT(events = {SyncEvents.ENTITY_CUSTOM1, SyncEvents.ENTITY_CUSTOM2}) + public GunShootingHandler gunHandler = new GunShootingHandler(); @SyncNBT(events = {SyncEvents.ENTITY_CUSTOM1, SyncEvents.ENTITY_CUSTOM2}) public GunRecoil recoil = new GunRecoil(); + @SyncNBT(events = {SyncEvents.ENTITY_CUSTOM1, SyncEvents.ENTITY_CUSTOM2}) - public GunShootingHandler shooting = new GunShootingHandler(); + public GunAmmoProviderMagazine loadingMagazine1 = new GunAmmoProviderMagazine(this, this::getUser, + Magazines.MACHINEGUN, Machinegun.clipReloadTime); - //Second magazine is an upgrade - @SyncNBT(events = SyncEvents.ENTITY_CUSTOM1) - public ItemStack magazine1 = ItemStack.EMPTY, magazine2 = ItemStack.EMPTY; + @SyncNBT(events = {SyncEvents.ENTITY_CUSTOM1, SyncEvents.ENTITY_CUSTOM2}) + public GunAmmoProviderMagazine loadingMagazine2 = new GunAmmoProviderMagazine(this, this::getUser, + Magazines.MACHINEGUN, Machinegun.clipReloadTime); + + @SyncNBT(events = {SyncEvents.ENTITY_CUSTOM1, SyncEvents.ENTITY_CUSTOM2}) + public GunAmmoProviderAmmoCrate loadingCrate = new GunAmmoProviderAmmoCrate(this, this::getUser); - @SyncNBT(events = SyncEvents.ENTITY_CUSTOM1) - public boolean aiming = false; - @SyncNBT(events = SyncEvents.ENTITY_CUSTOM1) - public VehicleDurability shield = new VehicleDurability(Machinegun.shieldStrengthInitial, 2); + @SyncNBT(events = SyncEvents.ENTITY_DAMAGED) + public SyncedDurability shield = new SyncedDurability(Machinegun.shieldStrengthInitial, 2); @SyncNBT(events = SyncEvents.ENTITY_INTERACT) public FilteredFluidTank tank = new FilteredFluidTank(0) .withInputFilter(MachinegunCoolantHandler::isValidCoolant); + public FluxStorage infraredFluxStorage = new FluxStorage(0, 16000); public EntityMachinegun(World world) { @@ -76,6 +93,7 @@ public EntityMachinegun(World world) this.controls = new VehicleControls().withStates("fire", "reload", "aim"); if(world.isRemote) this.controls + .withMouseBinding(MouseBinding.MOUSE_RIGHT, "fire") .withKeyBinding(ClientProxy.keybindManualReload, "reload") .withKeyBinding(ClientProxy.keybindZoom, "aim"); @@ -104,9 +122,22 @@ protected void setOriginStack(ItemStack stack) .withAimSpeed(3.5f, 3f); this.recoil.withRecoilLimits(22.5f, 22.5f) .withRecoilStrength(Machinegun.recoilVertical, Machinegun.recoilHorizontal, 0.5f, 0.05f) - .withOverheating(Machinegun.maxOverheat, 0.75f, () -> tank); + .withOverheating(Machinegun.maxOverheat, 0.75f) + .withCoolantTank(() -> tank, Integer.MAX_VALUE); + this.gunHandler.withMaxShotDelay(Machinegun.fireDelay) + .withRecoilHandler(recoil) + .withAmmoFactory(ammoFactory) + .withAmmoProvider(this.loadingMagazine1) + .withShootSound(IISounds.machinegunShot, 70) + .withDryFireSound(IISounds.machinegunShotDry); + this.loadingMagazine1.withSounds(IISounds.machinegunReload, IISounds.machinegunUnload); + this.loadingMagazine2.withSounds(IISounds.machinegunReload, IISounds.machinegunUnload); + this.loadingCrate.withSounds(IISounds.machinegunReload, IISounds.machinegunUnload); + this.infraredFluxStorage.setCapacity(0); this.setSize(0.77f, 0.65f); + this.loadingMagazine1.setLoadedStack(ItemNBTHelper.getItemStack(stack, "magazine1")); + //Set upgrade parameters assert stack.getItem()==IIContent.itemMachinegun; this.upgrades = IIContent.itemMachinegun.listUpgrades(stack, WeaponUpgrade.class); @@ -114,13 +145,17 @@ protected void setOriginStack(ItemStack stack) switch(upgrade) { case HEAVY_BARREL: - this.shooting.withMaxShotDelay(Machinegun.heavyBarrelFireDelay); + this.gunHandler.withMaxShotDelay(Machinegun.heavyBarrelFireDelay) + .withShootSound(IISounds.machinegunShotHeavyBarrel, 70); this.recoil.withRecoilStrength(Machinegun.recoilHBVertical, Machinegun.recoilHBHorizontal, 0.5f, 0.05f); break; case WATER_COOLING: - this.shooting.withMaxShotDelay(Machinegun.heavyBarrelFireDelay); + this.gunHandler.withShootSound(IISounds.machinegunShotWaterCooled, 70); + this.recoil.withCoolantTank(() -> tank, Machinegun.waterCoolingFluidUsage); break; case SECOND_MAGAZINE: + this.gunHandler.withAmmoProvider(loadingMagazine2); + this.loadingMagazine2.setLoadedStack(ItemNBTHelper.getItemStack(stack, "magazine2")); break; case HASTY_BIPOD: this.maxSetupTime = (int)(this.maxSetupTime*Machinegun.hastyBipodSetupTimeMultiplier); @@ -128,14 +163,11 @@ protected void setOriginStack(ItemStack stack) case PRECISE_BIPOD: this.maxSetupTime = (int)(this.maxSetupTime*Machinegun.preciseBipodSetupTimeMultiplier); break; - case SCOPE: - break; - case INFRARED_SCOPE: - break; case SHIELD: this.maxSetupTime = (int)(this.maxSetupTime*Machinegun.shieldSetupTimeMultiplier); break; case BELT_FED_LOADER: + this.gunHandler.withAmmoProvider(loadingCrate); this.maxSetupTime = (int)(this.maxSetupTime*Machinegun.beltFedLoaderSetupTimeMultiplier); break; case TRIPOD: @@ -143,11 +175,26 @@ protected void setOriginStack(ItemStack stack) this.aim.withYawLimit(-180, 180f); this.setSize(0.77f, 1.65f); break; + case SCOPE: + break; + case INFRARED_SCOPE: + this.infraredFluxStorage.setCapacity(16000); + break; default: break; } } + @Override + public ItemStack getOriginStack() + { + ItemStack stack = super.getOriginStack(); + EasyNBT.wrapNBT(stack) + .withItemStack("magazine1", loadingMagazine1.getLoadedStack()) + .withItemStack("magazine2", loadingMagazine2.getLoadedStack()); + return stack; + } + @Override @Nonnull protected Vec3d getPassengerPosition(Entity passenger) @@ -162,21 +209,43 @@ public void onEntityUpdate() super.onEntityUpdate(); //Update components - recoil.update(); - shooting.update(); + this.gunHandler.update(); //Apply controls if(isBeingRidden()) { -// Entity operator = getPassengers().get(0); - aiming = controls.getKey("aim"); Entity user = getPassengers().get(0); - aim.setTarget(aim.clampYawToRange(user.getRotationYawHead()), aim.clampPitchToRange(user.rotationPitch)); + //Aim to where the user is pointing + this.aim.setTarget(aim.clampYawToRange(user.getRotationYawHead()), aim.clampPitchToRange(user.rotationPitch)); + //Set shooter and gun info + this.ammoFactory.setShooterAndGun(user, this) + .setPositionAndVelocity(this.getPositionVector().addVector(0, 0.5f, 0), this.aim, 0.25f, 1f); + + //Drain energy from user + for(ItemStack equipmentStack : user.getEquipmentAndArmor()) + if(equipmentStack.hasCapability(CapabilityEnergy.ENERGY, null)) + { + IEnergyStorage userStorage = equipmentStack.getCapability(CapabilityEnergy.ENERGY, null); + assert userStorage!=null; + int received = infraredFluxStorage.receiveEnergy(userStorage.extractEnergy(Machinegun.infraredScopeEnergyUsage*20, true), false); + userStorage.extractEnergy(received, false); + } + + //Apply infrared effect + if(controls.getKey("aim")&&infraredFluxStorage.extractEnergy(Machinegun.infraredScopeEnergyUsage, false)==Machinegun.infraredScopeEnergyUsage) + IIUtils.applyInfraredVision(user, 10); + + //Check for buttons pressed + if(controls.getKey("reload")) + this.gunHandler.startReloading(); + else if(controls.getKey("fire")) + this.gunHandler.fire(); } else { - aim.setTarget(aim.getTargetYaw(), aim.clampPitchToRange(-10f)); - aim.update(); + this.ammoFactory.setOwner(null); + this.aim.setTarget(aim.getTargetYaw(), aim.clampPitchToRange(-10f)); + this.aim.update(); } } @@ -257,6 +326,7 @@ public String[] getOverlayText(EntityPlayer player, RayTraceResult mop) @Override public boolean isCameraEnabled(EntityPlayer player) { + boolean aiming = isSetupComplete()&&controls.getKey("aim"); SCOPE.withZoomEnabled(aiming); SCOPE_IR.withZoomEnabled(aiming); return aiming; @@ -265,13 +335,13 @@ public boolean isCameraEnabled(EntityPlayer player) @Override public float getCameraPitch(EntityPlayer cameraPlayer, float partialTicks) { - return aim.getPitch(partialTicks); + return aim.getPitch(partialTicks)+recoil.getRecoilPitch(partialTicks); } @Override public float getCameraYaw(EntityPlayer cameraPlayer, float partialTicks) { - return aim.getYaw(partialTicks); + return aim.getYaw(partialTicks)+recoil.getRecoilYaw(partialTicks); } @Override @@ -281,7 +351,8 @@ public Vec3d getCameraPos(EntityPlayer cameraPlayer, float partialTicks) float cameraPitch = getCameraPitch(cameraPlayer, partialTicks); return getPositionVector() .addVector(0, (0.34375+0.0625)*0.85-1.75f+0.5+(upgrades.contains(WeaponUpgrade.TRIPOD)?1f: 0f), 0) - .add(IIMath.offsetPosDirectionXYZ(new Vec3d(-1.5, 0.0625, 0), cameraYaw, -cameraPitch, 0)); + .add(IIMath.offsetPosDirectionXYZ(new Vec3d(-1.5+(upgrades.contains(WeaponUpgrade.SCOPE)||upgrades.contains(WeaponUpgrade.INFRARED_SCOPE)?1f: 0f), + 0.0625, 0), cameraYaw, -cameraPitch, 0)); } //--- IEntityZoomProvider ---// diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMortar.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMortar.java index 7121e67f1..da0f7ef39 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMortar.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMortar.java @@ -214,11 +214,10 @@ public Vec3d getCameraPos(EntityPlayer cameraPlayer, float partialTicks) return getPositionVector().addVector(0, 1, 0); } + @Override public boolean isCameraEnabled(EntityPlayer player) { - boolean aiming = controls.getKey("aim"); - SIGHTS.withZoomEnabled(aiming); - return aiming; + return isSetupComplete()&&controls.getKey("aim"); } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMountedWeapon.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMountedWeapon.java index 885ead881..1a887a232 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMountedWeapon.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMountedWeapon.java @@ -8,6 +8,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.DamageSource; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.AxisAlignedBB; @@ -28,6 +29,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.util.List; /** * Common class for mounted weapons @@ -44,8 +46,10 @@ public abstract class EntityMountedWeapon extends Entity implements IEntityAddit public GunAimCoordinate aim = new GunAimCoordinate(); @SyncNBT(events = SyncEvents.ENTITY_CUSTOM1) public int setupTime = 0, maxSetupTime = 1; + //DO NOT modify directly outside of here, it's only public because of SyncNBT limitations @SyncNBT(events = SyncEvents.ENTITY_INTERACT) - private ItemStack originStack = ItemStack.EMPTY; + public ItemStack originStack = ItemStack.EMPTY; + private AxisAlignedBB baseAabb; public EntityMountedWeapon(World world) @@ -139,10 +143,12 @@ private void handleClientControls() */ protected void setOriginStack(ItemStack stack) { - this.originStack = stack; + this.originStack = stack.copy(); + if(!world.isRemote) + updateEntityForEvent(SyncEvents.ENTITY_CUSTOM1); } - public final ItemStack getOriginStack() + public ItemStack getOriginStack() { return originStack; } @@ -232,7 +238,7 @@ public boolean processInitialInteract(EntityPlayer player, EnumHand hand) { setDead(); if(!world.isRemote) - entityDropItem(originStack, 0f); + entityDropItem(getOriginStack(), 0f); return true; } //Enter as passenger @@ -246,6 +252,20 @@ else if(isSetupComplete()&&player.getRidingEntity()!=this&&getPassengers().isEmp return true; } + @Override + public boolean attackEntityFrom(DamageSource source, float amount) + { + updateEntityForEvent(SyncEvents.ENTITY_DAMAGED); + return super.attackEntityFrom(source, amount); + } + + @Nullable + protected Entity getUser() + { + List passengers = getPassengers(); + return passengers.isEmpty()?null: passengers.get(0); + } + //--- NBT ---// @Override @@ -254,7 +274,6 @@ public final void writeSpawnData(ByteBuf buffer) NBTTagCompound tag = new NBTTagCompound(); writeEntityToNBT(tag); ByteBufUtils.writeTag(buffer, tag); - ByteBufUtils.writeItemStack(buffer, originStack); } @Override @@ -262,8 +281,10 @@ public final void readSpawnData(ByteBuf additionalData) { NBTTagCompound tag = ByteBufUtils.readTag(additionalData); if(tag!=null) + { readEntityFromNBT(tag); - setOriginStack(ByteBufUtils.readItemStack(additionalData)); + setOriginStack(this.originStack); + } } @Override diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityTripodPeriscope.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityTripodPeriscope.java index 48b753ed1..9a883f385 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityTripodPeriscope.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityTripodPeriscope.java @@ -8,6 +8,7 @@ import pl.pabilo8.immersiveintelligence.api.utils.camera.ICameraEntity; import pl.pabilo8.immersiveintelligence.api.utils.camera.ZoomSettings; import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedZoom; +import pl.pabilo8.immersiveintelligence.client.ClientProxy; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Tools.TripodPeriscope; import pl.pabilo8.immersiveintelligence.common.IIContent; import pl.pabilo8.immersiveintelligence.common.util.IIMath; @@ -32,6 +33,10 @@ public EntityTripodPeriscope(World world) { super(world); this.setSize(0.77f, 2.4375f); + this.controls.withStates("aim"); + if(world.isRemote) + this.controls.withKeyBinding(ClientProxy.keybindZoom, "aim"); + this.aim.withYawLimit(-180.0f, 180f) .withPitchLimit(22.5f, -22.5f) .withAimSpeed(TripodPeriscope.turnSpeed, 1f); @@ -71,7 +76,7 @@ public void applyOrientationToEntity(Entity entityToUpdate) @Override public boolean isCameraEnabled(EntityPlayer player) { - return true; + return isSetupComplete()&&controls.getKey("aim"); } @Override diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/EntityDrone.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/EntityDrone.java index 49ec6ce16..3a7fa2eb3 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/EntityDrone.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/EntityDrone.java @@ -28,11 +28,11 @@ import pl.pabilo8.immersiveintelligence.common.entity.ammo.types.EntityAmmoArtilleryProjectile; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.drone.AIDroneTarget; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleBlueprint; -import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleDurability; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.EntityVehiclePart; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.EntityVehicleSeat.SeatInfo; import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT; import pl.pabilo8.immersiveintelligence.common.util.entity.ISyncNBTEntity; +import pl.pabilo8.immersiveintelligence.common.util.entity.SyncedDurability; import javax.annotation.Nullable; import java.util.List; @@ -55,9 +55,9 @@ public class EntityDrone extends EntityFlying implements ISyncNBTEntity public SeatInfo seatRider, seatPassenger, seatTowed; @SyncNBT(events = SyncEvents.ENTITY_DAMAGED) - public VehicleDurability frontWheelDurability, backWheelDurability, engineDurability, fuelTankDurability; + public SyncedDurability frontWheelDurability, backWheelDurability, engineDurability, fuelTankDurability; @SyncNBT(events = SyncEvents.ENTITY_VEHICLE_FUEL, time = 40) public VehicleFuelTank fuelTank; @@ -91,11 +95,11 @@ public EntityMotorbike(World worldIn) protected EntityVehiclePart[] vehicleInit() { //Hitboxes - this.frontWheelDurability = new VehicleDurability(Motorbike.wheelDurability, 0); - this.backWheelDurability = new VehicleDurability(Motorbike.wheelDurability, 0); - this.engineDurability = new VehicleDurability(Motorbike.engineDurability, 7) + this.frontWheelDurability = new SyncedDurability(Motorbike.wheelDurability, 0); + this.backWheelDurability = new SyncedDurability(Motorbike.wheelDurability, 0); + this.engineDurability = new SyncedDurability(Motorbike.engineDurability, 7) .withParent(this.durabilityMain); - this.fuelTankDurability = new VehicleDurability(Motorbike.fuelTankDurability, 4) + this.fuelTankDurability = new SyncedDurability(Motorbike.fuelTankDurability, 4) .withParent(this.durabilityMain); //Controls diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/EntityTrackedMotorbike.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/EntityTrackedMotorbike.java index 96640fb5f..4e3643f80 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/EntityTrackedMotorbike.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/EntityTrackedMotorbike.java @@ -19,7 +19,10 @@ import pl.pabilo8.immersiveintelligence.api.upgrade.UpgradeTechTree; import pl.pabilo8.immersiveintelligence.client.ClientProxy; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Vehicles.Motorbike; -import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.*; +import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleBlueprint; +import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleControls; +import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleFuelTank; +import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleType; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.*; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.EntityVehicleSeat.SeatInfo; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.propulsion.VehicleEngineFuelBased; @@ -29,6 +32,7 @@ import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT; import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT.SyncEvents; import pl.pabilo8.immersiveintelligence.common.util.entity.IIEntityUtils; +import pl.pabilo8.immersiveintelligence.common.util.entity.SyncedDurability; /** * @author Pabilo8 (pabilo@iiteam.net) @@ -51,7 +55,7 @@ public class EntityTrackedMotorbike extends EntityVehicleBase seatDriver, seatPassenger, seatTowed; @SyncNBT(events = SyncEvents.ENTITY_DAMAGED) - public VehicleDurability frontWheelDurability, backWheelDurability, engineDurability, fuelTankDurability; + public SyncedDurability frontWheelDurability, backWheelDurability, engineDurability, fuelTankDurability; @SyncNBT(events = SyncEvents.ENTITY_VEHICLE_FUEL, time = 40) public VehicleFuelTank fuelTank; @@ -72,11 +76,11 @@ public EntityTrackedMotorbike(World worldIn) protected EntityVehiclePart[] vehicleInit() { //Hitboxes - this.frontWheelDurability = new VehicleDurability(Motorbike.wheelDurability, 0); - this.backWheelDurability = new VehicleDurability(Motorbike.wheelDurability, 0); - this.engineDurability = new VehicleDurability(Motorbike.engineDurability, 7) + this.frontWheelDurability = new SyncedDurability(Motorbike.wheelDurability, 0); + this.backWheelDurability = new SyncedDurability(Motorbike.wheelDurability, 0); + this.engineDurability = new SyncedDurability(Motorbike.engineDurability, 7) .withParent(this.durabilityMain); - this.fuelTankDurability = new VehicleDurability(Motorbike.fuelTankDurability, 4) + this.fuelTankDurability = new SyncedDurability(Motorbike.fuelTankDurability, 4) .withParent(this.durabilityMain); //Controls diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/EntityVehicleBase.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/EntityVehicleBase.java index e00ffba1d..af08b1002 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/EntityVehicleBase.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/EntityVehicleBase.java @@ -25,7 +25,6 @@ import pl.pabilo8.immersiveintelligence.api.utils.vehicles.IVehicleMultiPart; import pl.pabilo8.immersiveintelligence.common.IIUtils; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleBlueprint; -import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleDurability; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.*; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.EntityVehicleSeat.SeatInfo; import pl.pabilo8.immersiveintelligence.common.util.IIColor; @@ -34,6 +33,7 @@ import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT; import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT.SyncEvents; import pl.pabilo8.immersiveintelligence.common.util.entity.ISyncNBTEntity; +import pl.pabilo8.immersiveintelligence.common.util.entity.SyncedDurability; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -72,7 +72,7 @@ public abstract class EntityVehicleBase> extends //--- Motion & Orientation ---// @SyncNBT(events = SyncEvents.ENTITY_DAMAGED) - public VehicleDurability durabilityMain; + public SyncedDurability durabilityMain; @SyncNBT public Vec3d velocity = Vec3d.ZERO; @SyncNBT(events = {SyncEvents.ENTITY_VEHICLE_CONTROLS, SyncEvents.ENTITY_PASSENGER, SyncEvents.ENTITY_COLLISION}) @@ -106,7 +106,7 @@ protected final void entityInit() this.blueprint = meta; //Set main durability - this.durabilityMain = new VehicleDurability(blueprint.baseDurability(), blueprint.baseArmor()); + this.durabilityMain = new SyncedDurability(blueprint.baseDurability(), blueprint.baseArmor()); //noinspection unchecked this.upgradeManager = ((UpgradeManager)new UpgradeManager<>(this)); this.style = new StyleCustomization(getVehicleStyleConstraints()); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldHowitzer.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldHowitzer.java index 355979cb7..99a76e991 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldHowitzer.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldHowitzer.java @@ -22,7 +22,6 @@ import pl.pabilo8.immersiveintelligence.common.entity.vehicle.towable.EntityVehicleTowable; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleBlueprint; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleControls; -import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleDurability; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleType; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.EntityVehiclePart; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.EntityVehicleSeat; @@ -32,6 +31,7 @@ import pl.pabilo8.immersiveintelligence.common.util.IIMath; import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT; import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT.SyncEvents; +import pl.pabilo8.immersiveintelligence.common.util.entity.SyncedDurability; /** * @author Pabilo8 (pabilo@iiteam.net) @@ -51,7 +51,7 @@ public class EntityFieldHowitzer extends EntityVehicleTowable seatCommander, seatGunner; @SyncNBT(events = SyncEvents.ENTITY_DAMAGED) - public VehicleDurability durabilityRightWheel, durabilityLeftWheel, durabilityGun, durabilityShield; + public SyncedDurability durabilityRightWheel, durabilityLeftWheel, durabilityGun, durabilityShield; @SyncNBT(events = SyncEvents.ENTITY_VEHICLE_CONTROLS) public VehicleControls commanderControls, gunnerControls; @@ -83,11 +83,11 @@ protected EntityVehiclePart[] vehicleInit() this.ammoFactory = new AmmoFactory<>(this); //Hitboxes - this.durabilityRightWheel = new VehicleDurability(FieldHowitzer.wheelDurability, 4); - this.durabilityLeftWheel = new VehicleDurability(FieldHowitzer.wheelDurability, 4); - this.durabilityGun = new VehicleDurability(FieldHowitzer.gunDurability, 14) + this.durabilityRightWheel = new SyncedDurability(FieldHowitzer.wheelDurability, 4); + this.durabilityLeftWheel = new SyncedDurability(FieldHowitzer.wheelDurability, 4); + this.durabilityGun = new SyncedDurability(FieldHowitzer.gunDurability, 14) .withParent(this.durabilityMain); - this.durabilityShield = new VehicleDurability(FieldHowitzer.shieldDurability, 32) + this.durabilityShield = new SyncedDurability(FieldHowitzer.shieldDurability, 32) .withParent(this.durabilityMain); //Controls diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/VehicleFuelTank.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/VehicleFuelTank.java index 9f9d9fbe5..795b68e65 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/VehicleFuelTank.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/VehicleFuelTank.java @@ -10,6 +10,7 @@ import pl.pabilo8.immersiveintelligence.common.entity.vehicle.EntityVehicleBase; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.IVehicleComponent; import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT.SyncEvents; +import pl.pabilo8.immersiveintelligence.common.util.entity.SyncedDurability; import javax.annotation.Nullable; @@ -20,7 +21,7 @@ */ public class VehicleFuelTank> implements IFluidHandler, INBTSerializable, IVehicleComponent { - private VehicleDurability durability; + private SyncedDurability durability; private final T vehicle; private final FluidTank tank; @@ -30,7 +31,7 @@ public VehicleFuelTank(T vehicle, int capacity) this.tank = new FluidTank(capacity); } - public VehicleFuelTank withDurability(VehicleDurability durability) + public VehicleFuelTank withDurability(SyncedDurability durability) { this.durability = durability; return this; @@ -109,7 +110,7 @@ public void deserializeNBT(NBTTagCompound nbt) @Nullable @Override - public VehicleDurability getDurability() + public SyncedDurability getDurability() { return null; } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/part/EntityVehiclePart.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/part/EntityVehiclePart.java index af0d78be0..964b488af 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/part/EntityVehiclePart.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/part/EntityVehiclePart.java @@ -13,11 +13,11 @@ import pl.pabilo8.immersiveintelligence.api.utils.IEntitySpecialRepairable; import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedTextOverlay; import pl.pabilo8.immersiveintelligence.api.utils.vehicles.IVehicleMultiPart; -import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleDurability; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.EntityVehicleSeat.SeatInfo; import pl.pabilo8.immersiveintelligence.common.util.IIMath; import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT.SyncEvents; import pl.pabilo8.immersiveintelligence.common.util.entity.ISyncNBTEntity; +import pl.pabilo8.immersiveintelligence.common.util.entity.SyncedDurability; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -45,7 +45,7 @@ public class EntityVehiclePart> extends * The health storage and damage for this part */ @Nullable - public VehicleDurability durability; + public SyncedDurability durability; @Nullable public SeatInfo assignedSeat; protected boolean collidable = true; @@ -68,12 +68,12 @@ public EntityVehiclePart(T parent, String partName, Vec3d offset, double radius) this(parent, partName, offset, radius, radius); } - public EntityVehiclePart withHitbox(@Nonnull VehicleDurability hitbox) + public EntityVehiclePart withHitbox(@Nonnull SyncedDurability hitbox) { return withHitbox(hitbox, true); } - public EntityVehiclePart withHitbox(@Nonnull VehicleDurability hitbox, boolean collidable) + public EntityVehiclePart withHitbox(@Nonnull SyncedDurability hitbox, boolean collidable) { this.durability = hitbox; this.collidable = collidable; @@ -162,7 +162,7 @@ protected Vec3d getWorldPos() @Nullable @Override - public VehicleDurability getDurability() + public SyncedDurability getDurability() { return durability; } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/part/EntityVehicleWheel.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/part/EntityVehicleWheel.java index c2c792ad3..d6f1a5cb2 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/part/EntityVehicleWheel.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/part/EntityVehicleWheel.java @@ -10,8 +10,8 @@ import pl.pabilo8.immersiveintelligence.api.utils.vehicles.IVehicleMultiPart; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.EntityVehicleBase; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleBlueprint; -import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleDurability; import pl.pabilo8.immersiveintelligence.common.util.IIMath; +import pl.pabilo8.immersiveintelligence.common.util.entity.SyncedDurability; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -157,7 +157,7 @@ public EntityVehicleWheel withWeightShare(double weightShare) } @Override - public EntityVehicleWheel withHitbox(@Nonnull VehicleDurability hitbox) + public EntityVehicleWheel withHitbox(@Nonnull SyncedDurability hitbox) { super.withHitbox(hitbox); return this; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/part/IVehicleComponent.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/part/IVehicleComponent.java index c2cc7b771..d0e77cca5 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/part/IVehicleComponent.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/part/IVehicleComponent.java @@ -1,7 +1,7 @@ package pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part; -import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleDurability; +import pl.pabilo8.immersiveintelligence.common.util.entity.SyncedDurability; import javax.annotation.Nullable; @@ -13,7 +13,7 @@ public interface IVehicleComponent { @Nullable - VehicleDurability getDurability(); + SyncedDurability getDurability(); void onUpdate(); } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/propulsion/VehicleEngineBase.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/propulsion/VehicleEngineBase.java index 5e26f87db..dbce1c175 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/propulsion/VehicleEngineBase.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/propulsion/VehicleEngineBase.java @@ -6,8 +6,8 @@ import net.minecraftforge.common.util.INBTSerializable; import pl.pabilo8.immersiveintelligence.api.rotary.IRotaryEnergy; import pl.pabilo8.immersiveintelligence.api.rotary.RotaryStorage; -import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleDurability; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.IVehicleComponent; +import pl.pabilo8.immersiveintelligence.common.util.entity.SyncedDurability; import javax.annotation.Nullable; @@ -21,7 +21,7 @@ public abstract class VehicleEngineBase> implements IVehicleComponent, INBTSerializable, IRotaryEnergy { @Nullable - protected VehicleDurability durability; + protected SyncedDurability durability; protected boolean nextState, active; protected int activeTicks, activationTicks = 40, animationTicks = 8; protected float acceleration = 0f; @@ -69,7 +69,7 @@ public void onUpdate() //--- Setters ---// @SuppressWarnings("unchecked") - public T withDurability(@Nullable VehicleDurability durability) + public T withDurability(@Nullable SyncedDurability durability) { this.durability = durability; return (T)this; @@ -136,7 +136,7 @@ public RotationSide getSide(@Nullable EnumFacing facing) @Nullable @Override - public VehicleDurability getDurability() + public SyncedDurability getDurability() { return durability; } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/propulsion/VehicleTransmission.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/propulsion/VehicleTransmission.java index d9e287e34..b7caeac94 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/propulsion/VehicleTransmission.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/propulsion/VehicleTransmission.java @@ -8,9 +8,9 @@ import pl.pabilo8.immersiveintelligence.api.rotary.IRotaryEnergy; import pl.pabilo8.immersiveintelligence.api.rotary.RotaryStorage; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.EntityVehicleBase; -import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleDurability; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.EntityVehicleWheel; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.IVehicleComponent; +import pl.pabilo8.immersiveintelligence.common.util.entity.SyncedDurability; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -30,7 +30,7 @@ public class VehicleTransmission> implements IVeh @Nonnull protected IRotaryEnergy[] receivers = new IRotaryEnergy[0]; - private VehicleDurability durability; + private SyncedDurability durability; private double[] ratios = new double[0]; private int maxGearShiftTime = 20; private int currentGear = 0, nextGear = 0, gearShiftDelay = 0; @@ -54,7 +54,7 @@ public VehicleTransmission withReceivers(@Nonnull IRotaryEnergy... receivers) return this; } - public VehicleTransmission withDurability(VehicleDurability durability) + public VehicleTransmission withDurability(SyncedDurability durability) { this.durability = durability; return this; @@ -202,7 +202,7 @@ public void deserializeNBT(NBTTagCompound nbt) @Nullable @Override - public VehicleDurability getDurability() + public SyncedDurability getDurability() { return durability; } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/item/ammo/gun/ItemIIAmmoMachinegun.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/item/ammo/gun/ItemIIAmmoMachinegun.java index d0106a834..e1c3e0e26 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/item/ammo/gun/ItemIIAmmoMachinegun.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/item/ammo/gun/ItemIIAmmoMachinegun.java @@ -64,7 +64,7 @@ public int getCoreMaterialNeeded() @Override public float getCasingMass() { - return 0.046875f; + return 0.030468749f; } @Override diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/item/ammo/gun/ItemIIAmmoSubmachinegun.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/item/ammo/gun/ItemIIAmmoSubmachinegun.java index 516626011..9b0d1c766 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/item/ammo/gun/ItemIIAmmoSubmachinegun.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/item/ammo/gun/ItemIIAmmoSubmachinegun.java @@ -63,7 +63,7 @@ public int getCoreMaterialNeeded() @Override public float getCasingMass() { - return 0.03125f; + return 0.024375f; } @Override diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/item/tools/ItemIIBinoculars.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/item/tools/ItemIIBinoculars.java index d6014195f..d699add3b 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/item/tools/ItemIIBinoculars.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/item/tools/ItemIIBinoculars.java @@ -17,11 +17,9 @@ import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.init.MobEffects; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.potion.PotionEffect; import net.minecraft.util.ActionResult; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; @@ -37,6 +35,8 @@ import pl.pabilo8.immersiveintelligence.ImmersiveIntelligence; import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedZoom; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Tools; +import pl.pabilo8.immersiveintelligence.common.IIPotions; +import pl.pabilo8.immersiveintelligence.common.IIUtils; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.towable.gun.EntityFieldHowitzer; import pl.pabilo8.immersiveintelligence.common.item.tools.ItemIIBinoculars.Binoculars; import pl.pabilo8.immersiveintelligence.common.network.IIPacketHandler; @@ -88,18 +88,18 @@ public void addInformation(ItemStack stack, @Nullable World world, List } @Override - public void onUpdate(ItemStack stack, World worldIn, Entity entityIn, int itemSlot, boolean isSelected) + public void onUpdate(ItemStack stack, World worldIn, Entity entity, int itemSlot, boolean isSelected) { - super.onUpdate(stack, worldIn, entityIn, itemSlot, isSelected); + super.onUpdate(stack, worldIn, entity, itemSlot, isSelected); boolean do_tick = worldIn.getTotalWorldTime()%20==0; if(worldIn.isRemote) - ItemNBTHelper.setBoolean(stack, "sneaking", entityIn.isSneaking()&&isSelected); + ItemNBTHelper.setBoolean(stack, "sneaking", entity.isSneaking()&&isSelected); - if(!worldIn.isRemote&&entityIn instanceof EntityLivingBase) + if(!worldIn.isRemote&&entity instanceof EntityLivingBase) { - if(!isSelected||!(entityIn.isSneaking()||entityIn.getLowestRidingEntity() instanceof EntityFieldHowitzer)&&do_tick) + if(!isSelected||!(entity.isSneaking()||entity.getLowestRidingEntity() instanceof EntityFieldHowitzer)&&do_tick) { if(isAdvanced(stack)) { @@ -107,24 +107,21 @@ public void onUpdate(ItemStack stack, World worldIn, Entity entityIn, int itemSl if(ItemNBTHelper.getBoolean(stack, "wasUsed")) { ItemNBTHelper.setBoolean(stack, "wasUsed", false); - ((EntityLivingBase)entityIn).removePotionEffect(MobEffects.NIGHT_VISION); + ((EntityLivingBase)entity).removePotionEffect(IIPotions.infraredVision); } } } else { - if(entityIn instanceof EntityPlayerMP&&worldIn.getTotalWorldTime()%5==0&&(entityIn.isSneaking()||entityIn.getLowestRidingEntity() instanceof EntityFieldHowitzer)) + if(entity instanceof EntityPlayerMP&&worldIn.getTotalWorldTime()%5==0&&(entity.isSneaking()||entity.getLowestRidingEntity() instanceof EntityFieldHowitzer)) { - float yaw = (360+((EntityLivingBase)entityIn).rotationYawHead)%360; - IIPacketHandler.sendChatTranslation(((EntityPlayerMP)entityIn), IIReference.INFO_KEY+"yaw", yaw); + float yaw = (360+((EntityLivingBase)entity).rotationYawHead)%360; + IIPacketHandler.sendChatTranslation(((EntityPlayerMP)entity), IIReference.INFO_KEY+"yaw", yaw); } if(do_tick&&isEnabled(stack)&&isAdvanced(stack)) { - if(worldIn.getLightBrightness(entityIn.getPosition()) <= 0.5f) - ((EntityLivingBase)entityIn).addPotionEffect(new PotionEffect(MobEffects.NIGHT_VISION, 240, 1, true, false)); - else - ((EntityLivingBase)entityIn).addPotionEffect(new PotionEffect(MobEffects.BLINDNESS, 240, 1, false, false)); + IIUtils.applyInfraredVision(entity, 10); ItemNBTHelper.setBoolean(stack, "wasUsed", true); extractEnergy(stack, Tools.advancedBinocularsEnergyUsage, false); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/item/weapons/ItemIIAssaultRifle.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/item/weapons/ItemIIAssaultRifle.java index f5f41d0e6..8fc590a35 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/item/weapons/ItemIIAssaultRifle.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/item/weapons/ItemIIAssaultRifle.java @@ -10,9 +10,7 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.init.MobEffects; import net.minecraft.item.ItemStack; -import net.minecraft.potion.PotionEffect; import net.minecraft.util.ResourceLocation; import net.minecraft.util.SoundCategory; import net.minecraft.util.SoundEvent; @@ -56,7 +54,7 @@ public class ItemIIAssaultRifle extends ItemIIGunBase implements IItemScrollable public static final String LAST_FIRE_MODE = "last_mode"; public static final String FIRE_MODE_TIMER = "mode_switch"; public static final String LOADED_GRENADE = "grenade"; - public static final String ENERGY_UPGRADED = "energy"; + public static final String ENERGY_UPGRADED = "energy_upgraded"; //--- Scope Overlay Textures ---// public static final ResourceLocation OVERLAY_SCOPE = new ResourceLocation(ImmersiveIntelligence.MODID, @@ -126,7 +124,7 @@ public void onUpdate(ItemStack stack, World world, Entity entity, int itemSlot, if(entity instanceof EntityLivingBase&&isAimed(stack)&&hasIIUpgrade(stack, WeaponUpgrade.INFRARED_SCOPE)) { if(extractEnergy(stack, AssaultRifle.upgradeIRScopeEnergy, false) > 0) - ((EntityLivingBase)entity).addPotionEffect(new PotionEffect(MobEffects.NIGHT_VISION, 4, 1, true, false)); + IIUtils.applyInfraredVision(entity, 10); } } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/item/weapons/ItemIIWeaponUpgrade.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/item/weapons/ItemIIWeaponUpgrade.java index 7d669d612..84ef3bf17 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/item/weapons/ItemIIWeaponUpgrade.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/item/weapons/ItemIIWeaponUpgrade.java @@ -254,11 +254,7 @@ public enum WeaponUpgrade implements IIItemEnum SCOPE(new WeaponType[]{WeaponType.MACHINEGUN, WeaponType.AUTOREVOLVER, WeaponType.ASSAULT_RIFLE, WeaponType.RIFLE}, "infrared_scope"), //Allows nightvision + 2 x magnification, uses energy from player's backpack INFRARED_SCOPE(new WeaponType[]{WeaponType.MACHINEGUN, WeaponType.ASSAULT_RIFLE}, - (stack, nbt) -> { - //Assault Rifle - if(stack.getItem() instanceof ItemIIGunBase) - nbt.setBoolean("energy", true); - }, + (stack, nbt) -> nbt.setBoolean("energy_upgraded", true), "scope"), //Deflects projectiles SHIELD(WeaponType.MACHINEGUN), diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/VehicleDurability.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/entity/SyncedDurability.java similarity index 82% rename from src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/VehicleDurability.java rename to src/main/java/pl/pabilo8/immersiveintelligence/common/util/entity/SyncedDurability.java index 05427d55f..c4c180a1e 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/VehicleDurability.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/entity/SyncedDurability.java @@ -1,4 +1,4 @@ -package pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils; +package pl.pabilo8.immersiveintelligence.common.util.entity; import net.minecraft.nbt.NBTTagInt; import net.minecraft.util.DamageSource; @@ -11,21 +11,21 @@ * @author Pabilo8 (pabilo@iiteam.net) * @since 23.12.2022 */ -public class VehicleDurability implements INBTSerializable +public class SyncedDurability implements INBTSerializable { @Nullable - private VehicleDurability parent; + private SyncedDurability parent; public final int maxDurability, armor; private int durability; - public VehicleDurability(int maxDurability, int armor) + public SyncedDurability(int maxDurability, int armor) { this.maxDurability = maxDurability; this.durability = maxDurability; this.armor = armor; } - public VehicleDurability withParent(VehicleDurability parent) + public SyncedDurability withParent(SyncedDurability parent) { this.parent = parent; return this; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunAmmoProvider.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunAmmoProvider.java new file mode 100644 index 000000000..da44f697d --- /dev/null +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunAmmoProvider.java @@ -0,0 +1,209 @@ +package pl.pabilo8.immersiveintelligence.common.util.gun; + +import blusunrize.immersiveengineering.common.util.Utils; +import net.minecraft.entity.Entity; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.NonNullList; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvent; +import net.minecraftforge.common.util.INBTSerializable; +import pl.pabilo8.immersiveintelligence.common.IIUtils; +import pl.pabilo8.immersiveintelligence.common.util.ISerializableEnum; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.EasyNBT; + +import javax.annotation.Nonnull; +import java.util.function.Supplier; + +/** + * Abstract ammunition provider for mounted weapons. + * Handles loading/unloading from player inventory or external sources. + * + * @author Pabilo8 (pabilo@iiteam.net) + * @ii-approved 0.3.1 + * @since 23.05.2026 + */ +public abstract class GunAmmoProvider implements INBTSerializable +{ + //Context + protected final Entity gun; + protected final Supplier operatorSupplier; + + //State + protected GunLoadingState loadingState = GunLoadingState.EMPTY; + protected float reload = 0, maxReload = 0; + protected GunAmmoProvider other = null; + + //Sounds + protected SoundEvent loadSound = null; + protected SoundEvent unloadSound = null; + + protected GunAmmoProvider(Entity gun, Supplier operatorSupplier) + { + this.gun = gun; + this.operatorSupplier = operatorSupplier; + } + + public void update() + { + if(loadingState==GunLoadingState.EMPTY||loadingState==GunLoadingState.LOADED) + return; + + if(++reload >= maxReload) + { + switch(loadingState) + { + case LOAD: + onLoadFinished(); + loadingState = GunLoadingState.LOADED; + break; + case UNLOAD: + onUnloadFinished(); + loadingState = GunLoadingState.EMPTY; + break; + default: + break; + } + reload = 0; + } + } + + /** + * Starts the reload sequence. + */ + public final boolean startReloading() + { + if(loadingState==GunLoadingState.EMPTY) + { + if(canFindAmmo()) + { + loadingState = GunLoadingState.LOAD; + reload = 0; + if(loadSound!=null) + gun.world.playSound(null, gun.getPosition(), loadSound, SoundCategory.BLOCKS, 1f, 1f); + return true; + } + } + else if(loadingState==GunLoadingState.LOADED) + { + loadingState = GunLoadingState.UNLOAD; + reload = 0; + if(loadSound!=null) + gun.world.playSound(null, gun.getPosition(), unloadSound, SoundCategory.BLOCKS, 1f, 1f); + return true; + } + return false; + } + + //--- Sounds ---// + + public GunAmmoProvider withLoadingSound(SoundEvent sound) + { + this.loadSound = sound; + return this; + } + + public GunAmmoProvider withUnloadingSound(SoundEvent sound) + { + this.unloadSound = sound; + return this; + } + + public GunAmmoProvider withSounds(SoundEvent load, SoundEvent unload) + { + this.loadSound = load; + this.unloadSound = unload; + return this; + } + + public GunAmmoProvider withSecondaryProvider(GunAmmoProvider other) + { + this.other = other; + return this; + } + + //--- Core methods ---// + + protected abstract void onLoadFinished(); + + protected abstract void onUnloadFinished(); + + protected abstract boolean canFindAmmo(); + + @Nonnull + protected abstract ItemStack provideNextBullet(); + + @Nonnull + public abstract NonNullList getAmmoList(); + + @Nonnull + public final ItemStack provideAmmo() + { + if(loadingState!=GunLoadingState.LOADED) + return ItemStack.EMPTY; + ItemStack bullet = provideNextBullet(); + if(bullet.isEmpty()&&other!=null) + return other.provideAmmo(); + return bullet; + } + + protected final void giveOrDrop(ItemStack ammoStack) + { + Entity entity = operatorSupplier.get(); + //No operator, drop at gun position + if(entity==null) + Utils.dropStackAtPos(gun.world, gun.getPosition(), ammoStack); + else + //Try to give the item to the operator, preferably into their ammo pouch, drop when that's not possible + IIUtils.giveOrDropCasingStack(entity, ammoStack); + } + + //--- Getters ---// + + public boolean isReloading() + { + return loadingState==GunLoadingState.LOAD||loadingState==GunLoadingState.UNLOAD; + } + + public float getLoadingProgress(float partialTicks) + { + switch(loadingState) + { + case LOADED: + return 1f; + case LOAD: + return (reload+partialTicks)/Math.max(1, maxReload); + case UNLOAD: + return 1f-((reload+partialTicks)/Math.max(1, maxReload)); + case EMPTY: + default: + return 0f; + } + } + + //--- NBT ---// + @Override + public NBTTagCompound serializeNBT() + { + return EasyNBT.newNBT() + .withFloat("reload", reload) + .withInt("state", loadingState.ordinal()) + .unwrap(); + } + + @Override + public void deserializeNBT(NBTTagCompound nbt) + { + this.reload = nbt.getFloat("reload"); + this.loadingState = GunLoadingState.values()[nbt.getInteger("state")%GunLoadingState.values().length]; + } + + public enum GunLoadingState implements ISerializableEnum + { + EMPTY, + LOAD, + LOADED, + UNLOAD + } + +} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunRecoil.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunRecoil.java index 599ecf679..348b3d763 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunRecoil.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunRecoil.java @@ -3,6 +3,7 @@ import blusunrize.immersiveengineering.common.util.Utils; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.util.INBTSerializable; +import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTank; import pl.pabilo8.immersiveintelligence.api.MachinegunCoolantHandler; import pl.pabilo8.immersiveintelligence.common.util.IIMath; @@ -29,6 +30,7 @@ public class GunRecoil implements INBTSerializable private float overheat = 0, maxOverheat = 0, overheatDecrease = 1; @Nullable private Supplier coolantTank = null; + private int coolantPerTick = 10; public GunRecoil() { @@ -50,7 +52,11 @@ public void update() if(overheat > 0) overheat -= overheatDecrease; if(coolantTank!=null&&MachinegunCoolantHandler.isValidCoolant(coolantTank.get().getFluid())) - overheat -= MachinegunCoolantHandler.getCoolAmount(coolantTank.get().getFluid()); + { + FluidStack drained = coolantTank.get().drain(coolantPerTick, true); + assert drained!=null; + overheat -= MachinegunCoolantHandler.getCoolAmount(coolantTank.get().getFluid())*((float)drained.amount/coolantPerTick); + } } //--- With ---// @@ -71,11 +77,17 @@ public GunRecoil withRecoilStrength(float recoilStrengthVertical, float recoilSt return this; } - public GunRecoil withOverheating(float maxOverheat, float overheatDecrease, @Nullable Supplier coolantTank) + public GunRecoil withOverheating(float maxOverheat, float overheatDecrease) { this.maxOverheat = maxOverheat; this.overheatDecrease = overheatDecrease; + return this; + } + + public GunRecoil withCoolantTank(@Nullable Supplier coolantTank, int coolantPerTick) + { this.coolantTank = coolantTank; + this.coolantPerTick = coolantPerTick; return this; } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunShootingHandler.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunShootingHandler.java index 84a9f7ae6..14dedfae0 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunShootingHandler.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunShootingHandler.java @@ -1,7 +1,17 @@ package pl.pabilo8.immersiveintelligence.common.util.gun; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagFloat; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvent; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; import net.minecraftforge.common.util.INBTSerializable; +import pl.pabilo8.immersiveintelligence.api.ammo.utils.AmmoFactory; +import pl.pabilo8.immersiveintelligence.common.entity.ammo.types.EntityAmmoProjectile; +import pl.pabilo8.immersiveintelligence.common.network.IIPacketHandler; +import pl.pabilo8.immersiveintelligence.common.network.messages.MessagePlayIISound; +import pl.pabilo8.immersiveintelligence.common.util.sound.AdvancedSounds; /** * Used to store and calculate gun recoil and overheating. @@ -10,11 +20,16 @@ * @ii-approved 0.3.1 * @since 15.05.2026 */ -public class GunShootingHandler implements INBTSerializable +public class GunShootingHandler implements INBTSerializable { private float shotDelay, maxShotDelay; - private float loadingProgress, maxLoadingProgress; - private boolean startLoading = false; + private GunRecoil recoil = null; + private AmmoFactory ammoFactory = null; + private GunAmmoProvider ammoProvider = null; + //Sounds + private AdvancedSounds.RangedSound sound = null; + private SoundEvent soundDryFire = null; + private int shootSoundRange = 1; public GunShootingHandler() { @@ -23,7 +38,52 @@ public GunShootingHandler() public void update() { + //Decrease shot delay shotDelay = Math.max(0, shotDelay-1); + //Update recoil and ammo provider + if(this.recoil!=null) + this.recoil.update(); + if(this.ammoProvider!=null) + this.ammoProvider.update(); + } + + public void fire() + { + //Check basic conditions + if(!canShoot()||ammoProvider==null||ammoFactory==null) + return; + World world = ammoFactory.getWorld(); + + //Cannot fire when the provider is still reloading + if(ammoProvider.isReloading()) + return; + + //Load ammo from provider + ItemStack firedStack = ammoProvider.provideAmmo(); + if(!world.isRemote) + { + if(!firedStack.isEmpty()) + { + ammoFactory.setStack(firedStack); + EntityAmmoProjectile projectile = ammoFactory.create(); + if(projectile!=null&&sound!=null) + IIPacketHandler.sendToAllClients(new MessagePlayIISound(sound, SoundCategory.BLOCKS, shootSoundRange, ammoFactory.getPos(), 1f, 1f)); + } + else + world.playSound(null, new BlockPos(ammoFactory.getPos()), soundDryFire, SoundCategory.BLOCKS, 1f, 1f); + + } + //Reset shot delay + this.shotDelay = maxShotDelay; + //Add recoil and gun overheat + if(recoil!=null&&!firedStack.isEmpty()) + recoil.addRecoil(); + } + + public void startReloading() + { + if(ammoProvider!=null) + ammoProvider.startReloading(); } //--- With ---// @@ -34,6 +94,37 @@ public GunShootingHandler withMaxShotDelay(float maxShotDelay) return this; } + public GunShootingHandler withRecoilHandler(GunRecoil recoil) + { + this.recoil = recoil; + return this; + } + + public GunShootingHandler withAmmoFactory(AmmoFactory ammoFactory) + { + this.ammoFactory = ammoFactory; + return this; + } + + public GunShootingHandler withAmmoProvider(GunAmmoProvider provider) + { + this.ammoProvider = provider; + return this; + } + + public GunShootingHandler withShootSound(AdvancedSounds.RangedSound sound, int range) + { + this.sound = sound; + this.shootSoundRange = range; + return this; + } + + public GunShootingHandler withDryFireSound(SoundEvent soundDryFire) + { + this.soundDryFire = soundDryFire; + return this; + } + //--- Getters ---// public float getShotDelay(float partialTicks) @@ -41,24 +132,29 @@ public float getShotDelay(float partialTicks) return Math.max(0, shotDelay-partialTicks); } + public boolean canShoot() + { + return shotDelay <= 0; + } + public float getLoadingProgress(float partialTicks) { - return startLoading?Math.min(maxLoadingProgress, loadingProgress+partialTicks): 0; + if(ammoProvider==null) + return 0; + return ammoProvider.getLoadingProgress(partialTicks); } //--- NBT ---// @Override - public NBTTagCompound serializeNBT() + public NBTTagFloat serializeNBT() { - NBTTagCompound nbt = new NBTTagCompound(); - nbt.setFloat("shot_delay", shotDelay); - return nbt; + return new NBTTagFloat(shotDelay); } @Override - public void deserializeNBT(NBTTagCompound nbt) + public void deserializeNBT(NBTTagFloat nbt) { - shotDelay = nbt.getFloat("shot_delay"); + this.shotDelay = nbt.getFloat(); } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/ammoprovider/GunAmmoProviderAmmoCrate.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/ammoprovider/GunAmmoProviderAmmoCrate.java new file mode 100644 index 000000000..80ce71959 --- /dev/null +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/ammoprovider/GunAmmoProviderAmmoCrate.java @@ -0,0 +1,55 @@ +package pl.pabilo8.immersiveintelligence.common.util.gun.ammoprovider; + +import net.minecraft.entity.Entity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.NonNullList; +import pl.pabilo8.immersiveintelligence.common.util.gun.GunAmmoProvider; + +import javax.annotation.Nonnull; +import java.util.function.Supplier; + +/** + * @author Pabilo8 (pabilo@iiteam.net) + * @ii-approved 0.3.1 + * @since 26.05.2026 + */ +public class GunAmmoProviderAmmoCrate extends GunAmmoProvider +{ + public GunAmmoProviderAmmoCrate(Entity gun, Supplier operatorSupplier) + { + super(gun, operatorSupplier); + } + // For belt‑fed, no loading/unloading; always returns a bullet if crate has any. + // This is a placeholder – implement according to your crate logic. + + @Override + protected void onLoadFinished() + { + } + + @Override + protected void onUnloadFinished() + { + } + + @Nonnull + @Override + protected ItemStack provideNextBullet() + { + // TODO: Query the crate inventory at gunPosition.down() + return ItemStack.EMPTY; + } + + @Nonnull + @Override + public NonNullList getAmmoList() + { + return NonNullList.create(); + } + + @Override + protected boolean canFindAmmo() + { + return false; + } +} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/ammoprovider/GunAmmoProviderMagazine.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/ammoprovider/GunAmmoProviderMagazine.java new file mode 100644 index 000000000..b215d8f0a --- /dev/null +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/ammoprovider/GunAmmoProviderMagazine.java @@ -0,0 +1,282 @@ +package pl.pabilo8.immersiveintelligence.common.util.gun.ammoprovider; + +import net.minecraft.entity.Entity; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.NonNullList; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.IItemHandler; +import pl.pabilo8.immersiveintelligence.common.IIContent; +import pl.pabilo8.immersiveintelligence.common.item.ammo.ItemIIBulletMagazine.Magazines; +import pl.pabilo8.immersiveintelligence.common.util.gun.GunAmmoProvider; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.Collections; +import java.util.function.Supplier; + +/** + * Magazine-fed ammunition provider. + * Stores bullets internally as a list for fast access, and keeps a magazine ItemStack + * for simple persistence and external representation. + * + * @author Pabilo8 (pabilo@iiteam.net) + * @ii-approved 0.3.1 + * @since 26.05.2026 + */ +public class GunAmmoProviderMagazine extends GunAmmoProvider +{ + private final Magazines magazineType; + private final NonNullList bullets; + private ItemStack magazineStack = ItemStack.EMPTY; + + public GunAmmoProviderMagazine(Entity gun, Supplier operatorSupplier, Magazines type, float loadTime) + { + super(gun, operatorSupplier); + this.magazineType = type; + this.bullets = NonNullList.withSize(type.capacity, ItemStack.EMPTY); + this.maxReload = loadTime; + } + + //--- Bullet list and Magazine stack sync ---// + + /** + * Rebuilds the magazine ItemStack from the current bullet list. + * Should be called after any modification to the bullet list. + */ + private void rebuildMagazineFromBullets() + { + if(isEmpty()) + { + magazineStack = ItemStack.EMPTY; + return; + } + + //Build a list of only non‑empty bullets (up to capacity) + NonNullList bulletList = NonNullList.create(); + for(ItemStack b : bullets) + if(!b.isEmpty()) + bulletList.add(b); + + magazineStack = IIContent.itemBulletMagazine.getMagazine(magazineType, bulletList.toArray(new ItemStack[0])); + } + + /** + * Rebuilds the bullet list from the given magazine stack. + * Clears the current bullets and refills from the magazine. + * + * @param stack the magazine ItemStack to load from + */ + private void rebuildBulletsFromMagazine(@Nonnull ItemStack stack) + { + clear(); + if(stack.isEmpty()||stack.getItem()!=IIContent.itemBulletMagazine) + return; + + Magazines type = IIContent.itemBulletMagazine.stackToSub(stack); + if(type!=magazineType) + return; + + NonNullList magazineBullets = IIContent.itemBulletMagazine.readInventory(stack); + int copyLimit = Math.min(magazineType.capacity, magazineBullets.size()); + for(int i = 0; i < copyLimit; i++) + bullets.set(i, magazineBullets.get(i).copy()); + } + + //--- Implementation ---// + + @Override + protected void onLoadFinished() + { + //Bullets have already been added during canFindAmmo(). + //Create the magazine stack from the bullets. + rebuildMagazineFromBullets(); + } + + @Override + protected void onUnloadFinished() + { + if(!isEmpty()) + { + //Drop or give the magazine stack (which reflects the current bullets) + giveOrDrop(magazineStack); + clear(); + magazineStack = ItemStack.EMPTY; + } + } + + @Nonnull + @Override + protected ItemStack provideNextBullet() + { + if(isEmpty()) + return ItemStack.EMPTY; + + //Find the first non‑empty bullet + for(int i = 0; i < bullets.size(); i++) + { + ItemStack bullet = bullets.get(i); + if(!bullet.isEmpty()) + { + bullets.set(i, ItemStack.EMPTY); + rebuildMagazineFromBullets(); //Keep magazine stack in sync + return bullet.copy(); + } + } + return ItemStack.EMPTY; + } + + @Nonnull + @Override + public NonNullList getAmmoList() + { + return bullets; + } + + @Override + protected boolean canFindAmmo() + { + //Check if full + if(getBulletCount() >= magazineType.capacity) + return false; + + //Try to find a matching magazine in the operator's hotbar + ItemStack foundMagazine = findMagazineInHotbar(magazineType); + if(!foundMagazine.isEmpty()) + { + int needed = magazineType.capacity-getBulletCount(); + NonNullList magazineBullets = IIContent.itemBulletMagazine.readInventory(foundMagazine); + int taken = 0; + + //Transfer bullets from the found magazine into our internal list + for(int i = 0; i < magazineBullets.size()&&taken < needed; i++) + { + ItemStack bullet = magazineBullets.get(i); + if(!bullet.isEmpty()) + { + for(int j = 0; j < bullets.size(); j++) + { + if(bullets.get(j).isEmpty()) + { + bullets.set(j, bullet.copy()); + taken++; + break; + } + } + } + } + + if(taken > 0) + { + //Update the found magazine (remove transferred bullets) + IIContent.itemBulletMagazine.writeInventory(foundMagazine, magazineBullets); + + //If the magazine becomes empty, remove it from the operator's inventory + if(IIContent.itemBulletMagazine.hasNoBullets(foundMagazine)) + consumeMagazineFromHotbar(foundMagazine); + + return true; + } + } + return false; + } + + //--- Utils ---// + + private void clear() + { + Collections.fill(bullets, ItemStack.EMPTY); + } + + private boolean isEmpty() + { + return getBulletCount()==0; + } + + private int getBulletCount() + { + int count = 0; + for(ItemStack b : bullets) + if(!b.isEmpty()) + count++; + return count; + } + + //--- Persistence (for saving/loading to originStack) ---// + + @Nonnull + public ItemStack getLoadedStack() + { + return magazineStack; + } + + public void setLoadedStack(@Nonnull ItemStack stack) + { + clear(); + magazineStack = stack.isEmpty()?ItemStack.EMPTY: stack.copy(); + rebuildBulletsFromMagazine(magazineStack); + } + + //--- NBT ---// + + @Override + public NBTTagCompound serializeNBT() + { + NBTTagCompound nbt = super.serializeNBT(); + if(!magazineStack.isEmpty()) + nbt.setTag("magazine", magazineStack.serializeNBT()); + return nbt; + } + + @Override + public void deserializeNBT(NBTTagCompound nbt) + { + super.deserializeNBT(nbt); + if(nbt.hasKey("magazine")) + setLoadedStack(new ItemStack(nbt.getCompoundTag("magazine"))); + else + setLoadedStack(ItemStack.EMPTY); + } + + //--- Hotbar interaction helpers (copied from your existing code) ---// + + @Nullable + protected ItemStack findMagazineInHotbar(Magazines expectedType) + { + Entity player = operatorSupplier.get(); + if(player==null) + return null; + + IItemHandler inv = player.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null); + if(inv==null) + return null; + + for(int i = 0; i < 9; i++) + { + ItemStack stack = inv.getStackInSlot(i); + if(stack.getItem()==IIContent.itemBulletMagazine&& + IIContent.itemBulletMagazine.stackToSub(stack)==expectedType) + return stack; + } + return null; + } + + protected boolean consumeMagazineFromHotbar(ItemStack magazine) + { + Entity player = operatorSupplier.get(); + if(player==null) + return false; + + IItemHandler inv = player.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null); + if(inv==null) + return false; + + for(int i = 0; i < 9; i++) + if(inv.getStackInSlot(i)==magazine) + { + ItemStack extracted = inv.extractItem(i, 1, false); + return !extracted.isEmpty(); + } + return false; + } +} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/ammoprovider/GunAmmoProviderSingle.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/ammoprovider/GunAmmoProviderSingle.java new file mode 100644 index 000000000..73b6fb9b9 --- /dev/null +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/ammoprovider/GunAmmoProviderSingle.java @@ -0,0 +1,131 @@ +package pl.pabilo8.immersiveintelligence.common.util.gun.ammoprovider; + +import net.minecraft.entity.Entity; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.NonNullList; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.IItemHandler; +import pl.pabilo8.immersiveintelligence.api.ammo.parts.IAmmoTypeItem; +import pl.pabilo8.immersiveintelligence.common.IIUtils; +import pl.pabilo8.immersiveintelligence.common.entity.ammo.EntityAmmoBase; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.EasyNBT; +import pl.pabilo8.immersiveintelligence.common.util.gun.GunAmmoProvider; + +import javax.annotation.Nonnull; +import java.util.function.Supplier; + +/** + * @author Pabilo8 (pabilo@iiteam.net) + * @ii-approved 0.3.1 + * @since 26.05.2026 + */ +public class GunAmmoProviderSingle, E extends EntityAmmoBase> extends GunAmmoProvider +{ + private final IAmmoTypeItem acceptedAmmo; + private ItemStack loadedBullet = ItemStack.EMPTY; + private ItemStack pendingBullet = ItemStack.EMPTY; + + public GunAmmoProviderSingle(Entity gun, Supplier operatorSupplier, IAmmoTypeItem acceptedAmmo, float loadTime) + { + super(gun, operatorSupplier); + this.acceptedAmmo = acceptedAmmo; + this.maxReload = loadTime; + } + + @Override + protected void onLoadFinished() + { + if(!pendingBullet.isEmpty()) + { + loadedBullet = pendingBullet.copy(); + pendingBullet = ItemStack.EMPTY; + } + } + + @Override + protected void onUnloadFinished() + { + if(!loadedBullet.isEmpty()) + { + IIUtils.giveOrDropStack(this.operatorSupplier.get(), loadedBullet); + giveOrDrop(loadedBullet); + loadedBullet = ItemStack.EMPTY; + } + } + + @Nonnull + @Override + protected ItemStack provideNextBullet() + { + if(loadedBullet.isEmpty()) + return ItemStack.EMPTY; + ItemStack bullet = loadedBullet.copy(); + loadedBullet = ItemStack.EMPTY; + loadingState = GunLoadingState.EMPTY; + return bullet; + } + + @Nonnull + @Override + public NonNullList getAmmoList() + { + return NonNullList.withSize(loadedBullet.isEmpty()?0: 1, loadedBullet); + } + + @Override + protected boolean canFindAmmo() + { + Entity player = operatorSupplier.get(); + if(player==null) + return false; + + IItemHandler inv = player.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null); + if(inv==null) + return false; + + for(int i = 0; i < inv.getSlots(); i++) + { + ItemStack stack = inv.getStackInSlot(i); + if(!stack.isEmpty()&&stack.getItem()==acceptedAmmo) + { + pendingBullet = stack.copy(); + return true; + } + } + return false; + } + + //--- Persistence ---// + + @Nonnull + public ItemStack getLoadedStack() + { + return loadedBullet.isEmpty()?ItemStack.EMPTY: loadedBullet.copy(); + } + + public void setLoadedStack(@Nonnull ItemStack stack) + { + if(stack.isEmpty()||stack.getItem()!=acceptedAmmo) + loadedBullet = ItemStack.EMPTY; + else + loadedBullet = stack.copy(); + } + + //--- NBT ---// + + @Override + public NBTTagCompound serializeNBT() + { + return EasyNBT.wrapNBT(super.serializeNBT()) + .withItemStack("loaded_bullet", this.loadedBullet) + .unwrap(); + } + + @Override + public void deserializeNBT(NBTTagCompound nbt) + { + super.deserializeNBT(nbt); + this.loadedBullet = new ItemStack(nbt.getCompoundTag("loaded_bullet")); + } +} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/item/IItemEntityPlacer.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/item/IItemEntityPlacer.java index 045ce5dad..576573797 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/item/IItemEntityPlacer.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/item/IItemEntityPlacer.java @@ -9,6 +9,7 @@ import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import net.minecraftforge.items.ItemHandlerHelper; import pl.pabilo8.immersiveintelligence.common.IISounds; import javax.annotation.Nonnull; @@ -57,7 +58,8 @@ default EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos po //Place the entity if(!world.isRemote) { - E placed = getPlacedEntity(world, blockpos.getX()+0.5, blockpos.getY(), blockpos.getZ()+0.5, stack, player.rotationYaw, player.rotationPitch); + ItemStack placedStack = ItemHandlerHelper.copyStackWithSize(stack, 1); + E placed = getPlacedEntity(world, blockpos.getX()+0.5, blockpos.getY(), blockpos.getZ()+0.5, placedStack, player.rotationYaw, player.rotationPitch); //Clean the space for(int x = (int)Math.floor(takenSpace.minX), xMax = (int)Math.ceil(takenSpace.maxX); x < xMax; x++) for(int y = (int)Math.floor(takenSpace.minY), yMax = (int)Math.ceil(takenSpace.maxY); y < yMax; y++) @@ -65,7 +67,7 @@ default EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos po world.setBlockToAir(new BlockPos(x, y, z)); //Spawn the entity - ItemMonsterPlacer.applyItemEntityDataToEntity(world, player, stack, placed); + ItemMonsterPlacer.applyItemEntityDataToEntity(world, player, placedStack, placed); world.spawnEntity(placed); //Play placing sound diff --git a/src/main/resources/assets/immersiveintelligence/shaders/post/nightvision.json b/src/main/resources/assets/immersiveintelligence/shaders/post/nightvision.json new file mode 100644 index 000000000..2621e9770 --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/shaders/post/nightvision.json @@ -0,0 +1,61 @@ +{ + "targets": [ + "swap", + "temp" + ], + "passes": [ + { + "name": "color_convolve", + "intarget": "minecraft:main", + "outtarget": "swap", + "uniforms": [ + { + "name": "RedMatrix", + "values": [0.27, 0.81, 0.44] + }, + { + "name": "GreenMatrix", + "values": [0.0, 0.0, 0.0] + }, + { + "name": "BlueMatrix", + "values": [0.0, 0.0, 0.0] + } + ] + }, + { + "name": "bits", + "intarget": "swap", + "outtarget": "temp", + "uniforms": [ + { + "name": "Resolution", + "values": [16.0] + }, + { + "name": "MosaicSize", + "values": [4.0] + } + ] + }, + { + "name": "blur", + "intarget": "temp", + "outtarget": "minecraft:main", + "uniforms": [ + { + "name": "BlurDir", + "values": [0.0, 1.0] + }, + { + "name": "OutSize", + "values": [1.0, 1.0] + }, + { + "name": "Radius", + "values": [5.0] + } + ] + } + ] +} From f57ac02591649d728ea3bb97d32fe766ba9696a5 Mon Sep 17 00:00:00 2001 From: Pabilo8 Date: Wed, 27 May 2026 14:20:47 +0200 Subject: [PATCH 07/23] Improved the visuals and logic behind EntityGasCloud, II gas fluid buckets now deploy the entity instead of placing a fluid block --- .../client/fx/utils/ParticleRegistry.java | 91 +---- .../TileEntityArtilleryHowitzer.java | 5 +- .../entity/ammo/component/EntityGasCloud.java | 318 ++++++++++++++---- .../common/util/block/BlockIIFluid.java | 20 +- .../common/util/easynbt/NBTSerialisation.java | 6 + .../particles/smoke/gas_cloud.fx.amt | 13 + .../particle/tracer/air_cone.png.mcmeta | 5 + 7 files changed, 321 insertions(+), 137 deletions(-) create mode 100644 src/main/resources/assets/immersiveintelligence/particles/smoke/gas_cloud.fx.amt create mode 100644 src/main/resources/assets/immersiveintelligence/textures/particle/tracer/air_cone.png.mcmeta diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/fx/utils/ParticleRegistry.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/fx/utils/ParticleRegistry.java index bb825de57..9c8228079 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/fx/utils/ParticleRegistry.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/fx/utils/ParticleRegistry.java @@ -2,10 +2,7 @@ import blusunrize.immersiveengineering.client.ClientUtils; import com.google.gson.JsonObject; -import net.minecraft.client.particle.Particle; -import net.minecraft.client.particle.ParticleCloud; import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumParticleTypes; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; @@ -16,17 +13,20 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import pl.pabilo8.immersiveintelligence.api.ammo.PenetrationRegistry; +import pl.pabilo8.immersiveintelligence.client.IIClientUtils; import pl.pabilo8.immersiveintelligence.client.fx.factories.ParticleFactory; import pl.pabilo8.immersiveintelligence.client.fx.particles.AbstractParticle; import pl.pabilo8.immersiveintelligence.client.render.IReloadableModelContainer; -import pl.pabilo8.immersiveintelligence.client.util.tmt.ModelRendererTurbo; import pl.pabilo8.immersiveintelligence.common.IILogger; import pl.pabilo8.immersiveintelligence.common.util.*; import pl.pabilo8.immersiveintelligence.common.util.easynbt.EasyNBT; import javax.annotation.Nullable; import javax.vecmath.Vector2f; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Set; import java.util.function.Supplier; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -395,90 +395,25 @@ debrisMotion, new Vector2f(IIParticleUtils.randFloat.get()*4, IIParticleUtils.ra } } - - } - - public static void spawnGunfireFX(Vec3d pos, Vec3d direction, float size) - { - ParticleRegistry.spawnParticle("ammo/gunfire", pos, Vec3d.ZERO, IIParticleUtils.toVector2f(direction)) - .withProperty(ParticleProperties.SIZE, size*0.25f); - /*ParticleGunfire particle = new ParticleGunfire(getWorld(), pos, motion, size); - ParticleSystem.addEffect(particle);*/ - } - - //TODO: 04.05.2024 replace with AMT models - public static void spawnTMTModelFX(Vec3d pos, Vec3d motion, float size, ModelRendererTurbo model, ResourceLocation texture) - { - /*Particle particle = new ParticleTMTModel(getWorld(), pos, motion, size, model, texture); - Minecraft.getMinecraft().effectRenderer.addEffect(particle);*/ - } - - public static void spawnFlameFX(Vec3d pos, Vec3d motion, float size, int lifeTime) - { - /*ParticleFlame particle = new ParticleFlame(getWorld(), pos, motion, size, lifeTime); - ParticleSystem.addEffect(particle);*/ - } - - public static void spawnFlameExplosion(Vec3d pos, float size, Random rand) - { - - for(int i = 0; i < 20*size; i += 1) - { - Vec3d v = new Vec3d(1, 0, 0).rotateYaw(i/20f*360f); - - ParticleCloud particle = (ParticleCloud)spawnVanillaParticle(EnumParticleTypes.CLOUD, pos, IIParticleUtils.withY(v.scale(0.25), 0.125)); - if(particle!=null) - { - particle.setRBGColorF(rand.nextFloat()*0.125f, rand.nextFloat()*0.125f, 0); - particle.multipleParticleScaleBy(2.5f); - particle.setMaxAge(10); - } - - } - - } public static void spawnGasCloud(Vec3d pos, float size, Fluid fluid) { //Check if fluid is not null - if(fluid==null) return; - - //Get the color of the fluid - int color = fluid.getColor(); //Assuming the Fluid class has this method - float red = ((color>>16)&255)/255.0F; - float green = ((color>>8)&255)/255.0F; - float blue = (color&255)/255.0F; - - //Spawn multiple particles for the gas cloud effect - for(int i = 0; i < 40*size; i++) - { - //Randomly distribute particles in a larger spherical area - double offsetX = (Math.random()-0.5)*size*3.5; //Increased spread - double offsetY = (Math.random()-0.5)*size*2; //Increased vertical spread - double offsetZ = (Math.random()-0.5)*size*3.5; //Increased spread + if(fluid==null) + return; - Vec3d particlePos = pos.add(new Vec3d(offsetX, offsetY-1.0, offsetZ)); //Lower spawn point by 1 block + IIColor color = IIClientUtils.getFluidTextureColor(fluid); - ParticleCloud particle = (ParticleCloud)spawnVanillaParticle(EnumParticleTypes.CLOUD, particlePos, Vec3d.ZERO); - if(particle!=null) - { - particle.setRBGColorF(red, green, blue); //Set the color of the particle - particle.setMaxAge(160); //Adjust lifespan as needed - particle.multipleParticleScaleBy(5f); //Adjust scale if necessary - } - } + for(int i = 0; i < 10; i++) + spawnParticle("smoke/gas_cloud", pos.add(IIParticleUtils.getRandXZ().scale(size/2)), Vec3d.ZERO, new Vector2f(0, 0)) + .withProperty(ParticleProperties.SIZE, size*1.5f) + .withProperty(ParticleProperties.MAX_LIFETIME, (int)size*55) + .withProperty(ParticleProperties.COLOR, color); } //--- Utils ---// - private static Particle spawnVanillaParticle(EnumParticleTypes particle, Vec3d pos, Vec3d motion) - { - return ClientUtils.mc().effectRenderer.spawnEffectParticle(particle.getParticleID(), - pos.x, pos.y, pos.z, - motion.x, motion.y, motion.z); - } - private static class ParticleFileEntry { ResLoc path; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock0/tileentity/TileEntityArtilleryHowitzer.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock0/tileentity/TileEntityArtilleryHowitzer.java index 6210bc3ec..cbc8f51ff 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock0/tileentity/TileEntityArtilleryHowitzer.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock0/tileentity/TileEntityArtilleryHowitzer.java @@ -27,6 +27,8 @@ import pl.pabilo8.immersiveintelligence.api.data.IIDataHandlingUtils; import pl.pabilo8.immersiveintelligence.api.data.types.*; import pl.pabilo8.immersiveintelligence.api.utils.IBooleanAnimatedPartsBlock; +import pl.pabilo8.immersiveintelligence.client.fx.utils.IIParticleUtils; +import pl.pabilo8.immersiveintelligence.client.fx.utils.ParticleProperties; import pl.pabilo8.immersiveintelligence.client.fx.utils.ParticleRegistry; import pl.pabilo8.immersiveintelligence.client.util.carversound.ConditionCompoundSound; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Machines.ArtilleryHowitzer; @@ -350,7 +352,8 @@ private void fireGun(int i) if(world.isRemote) { Vec3d gun_end_particle = gunVec.scale(4.5); - ParticleRegistry.spawnGunfireFX(getGunPosition().add(gun_end_particle), gunVec, 8f); + ParticleRegistry.spawnParticle("ammo/gunfire", getGunPosition().add(gun_end_particle), Vec3d.ZERO, IIParticleUtils.toVector2f(gunVec)) + .withProperty(ParticleProperties.SIZE, 4f); } IIPacketHandler.playRangedSound(world, gunEnd, diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/component/EntityGasCloud.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/component/EntityGasCloud.java index 83c74131e..3b5675764 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/component/EntityGasCloud.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/component/EntityGasCloud.java @@ -2,128 +2,332 @@ import blusunrize.immersiveengineering.api.tool.ChemthrowerHandler; import blusunrize.immersiveengineering.api.tool.ChemthrowerHandler.ChemthrowerEffect; -import blusunrize.immersiveengineering.common.util.IEFluid; -import com.google.common.base.Optional; +import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.MoverType; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.datasync.DataParameter; -import net.minecraft.network.datasync.DataSerializers; -import net.minecraft.network.datasync.EntityDataManager; +import net.minecraft.util.EnumFacing; import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import net.minecraftforge.fluids.FluidStack; import pl.pabilo8.immersiveintelligence.api.utils.armor.IGasmask; import pl.pabilo8.immersiveintelligence.client.fx.utils.ParticleRegistry; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT.SyncEvents; +import pl.pabilo8.immersiveintelligence.common.util.entity.ISyncNBTEntity; +import javax.annotation.Nonnull; import java.util.List; /** + * Gas cloud entity that expands over time. + * * @author Pabilo8 (pabilo@iiteam.net) + * @updated 26.05.2026 + * @ii-approved 0.3.1 * @since 22.12.2020 + * */ -public class EntityGasCloud extends Entity +public class EntityGasCloud extends Entity implements ISyncNBTEntity { - private static final DataParameter> dataMarker_fluid = EntityDataManager.createKey(EntityGasCloud.class, IEFluid.OPTIONAL_FLUID_STACK); - private static final DataParameter dataMarker_radius = EntityDataManager.createKey(EntityGasCloud.class, DataSerializers.FLOAT); - int duration, maxDuration; - float radius; - private FluidStack fluid; + @SyncNBT(events = {SyncEvents.ENTITY_CUSTOM1}) + public FluidStack fluidStack = null; + @SyncNBT(events = {SyncEvents.ENTITY_CUSTOM1}) + public float currentRadius = 1.0f; + @SyncNBT(events = {SyncEvents.ENTITY_CUSTOM1}) + public float maxRadius; + @SyncNBT(events = {SyncEvents.ENTITY_CUSTOM1}) + public int duration = 40; - public EntityGasCloud(World worldIn) + public EntityGasCloud(World world) { - super(worldIn); - this.duration = 600; - this.maxDuration = duration; + super(world); + setSize(1.0f, 1.0f); this.noClip = true; this.isImmuneToFire = true; - this.radius = 3F; } - public EntityGasCloud(World worldIn, double x, double y, double z, FluidStack fs) + /** + * Creates a new gas cloud with given position, fluid, and total amount (in mb). + * Max radius is derived from the fluid's expansion properties and total amount. + */ + public EntityGasCloud(World world, double x, double y, double z, @Nonnull FluidStack fluid) { - this(worldIn); + this(world); this.setPosition(x, y, z); - this.fluid = fs; - duration = (int)((fluid.amount)*0.65f); - this.maxDuration = duration; - this.dataManager.set(dataMarker_fluid, Optional.of(fluid)); - this.dataManager.set(dataMarker_radius, radius); + this.fluidStack = fluid.copy(); + this.maxRadius = calculateMaxRadiusFromAmount(); + this.currentRadius = 0.5f; + this.duration = this.fluidStack.amount*2; } @Override protected void entityInit() { - this.dataManager.register(dataMarker_fluid, Optional.absent()); - this.dataManager.register(dataMarker_radius, radius); + } @Override public void onUpdate() { - move(MoverType.SELF, 0.01f, 0, 0.01f); - super.onUpdate(); - if(this.fluid==null&&this.world.isRemote) + this.prevPosX = posX; + this.prevPosY = posY; + this.prevPosZ = posZ; + + if(world.isRemote) { - this.fluid = this.dataManager.get(dataMarker_fluid).orNull(); - this.radius = this.dataManager.get(dataMarker_radius); + if(fluidStack!=null&&duration > 0) + { + //Particle effect every second + if(ticksExisted%20==0) + ParticleRegistry.spawnGasCloud(getPositionVector().addVector(0, 1, 0), currentRadius, fluidStack.getFluid()); + + //Expand radius locally using the same growth rate, up to maxRadius + if(currentRadius < maxRadius) + { + float newRadius = currentRadius+getGasGrowthRate(); + currentRadius = Math.min(newRadius, maxRadius); + updateBoundingBox(); + } + + //Decrease lifetime + duration--; + } + return; } - if(!world.isRemote) + //Remove the entity when out of time + if(fluidStack==null||duration <= 0) { - if(duration > 0&&fluid!=null) + setDead(); + return; + } + + duration--; + + //Apply effect to entities within the bounding box + List entities = world.getEntitiesWithinAABB(EntityLivingBase.class, getEntityBoundingBox()); + ChemthrowerEffect effect = ChemthrowerHandler.getEffect(fluidStack.getFluid()); + if(effect!=null) + for(EntityLivingBase entity : entities) { - duration -= 1; - ChemthrowerEffect effect = ChemthrowerHandler.getEffect(fluid.getFluid()); - if(effect!=null) + boolean isProtected = false; + for(EntityEquipmentSlot slot : EntityEquipmentSlot.values()) { - List entitiesWithinAABB = world.getEntitiesWithinAABB(EntityLivingBase.class, - new AxisAlignedBB(posX, posY, posZ, posX, posY, posZ).grow(radius)); - for(EntityLivingBase entityLivingBase : entitiesWithinAABB) - { - boolean apply = true; - for(EntityEquipmentSlot slot : EntityEquipmentSlot.values()) - { - ItemStack s = entityLivingBase.getItemStackFromSlot(slot); - if(!s.isEmpty()&&s.getItem() instanceof IGasmask) - if(apply) - apply = !((IGasmask)s.getItem()).protectsFromGasses(s); - } - if(apply) - effect.applyToEntity(entityLivingBase, null, ItemStack.EMPTY, fluid); - } + ItemStack stack = entity.getItemStackFromSlot(slot); + if(!stack.isEmpty()&&stack.getItem() instanceof IGasmask) + if(((IGasmask)stack.getItem()).protectsFromGasses(stack)) + isProtected = true; } + if(!isProtected) + effect.applyToEntity(entity, null, ItemStack.EMPTY, fluidStack); + } + //Expansion logic + if(currentRadius < maxRadius) + { + float oldRadius = currentRadius; + float newRadius = currentRadius+getGasGrowthRate(); + if(canExpandToRadius(newRadius)) + { + currentRadius = Math.min(newRadius, maxRadius); + updateBoundingBox(); } else - setDead(); + attemptSpawnChildren(); + if(oldRadius!=currentRadius) + sendServerUpdateForEvent(SyncEvents.ENTITY_CUSTOM1); } - else if(ticksExisted%20==0) - ParticleRegistry.spawnGasCloud(getPositionVector().addVector(0, 1, 0), radius, fluid.getFluid()); + + //Lifetime end + if(duration <= 0&¤tRadius <= 0.1f) + setDead(); + + //Periodic full sync (corrects client drift) + if(ticksExisted%10==0) + updateEntityForEvent(SyncEvents.ENTITY_CUSTOM1); + + //Try to move down + if(!this.world.collidesWithAnyBlock(getEntityBoundingBox().expand(0, -0.005f, 0))) + this.posY -= 0.005f; } - @Override - protected void readEntityFromNBT(NBTTagCompound compound) + //--- Utils ---// + + private float calculateMaxRadiusFromAmount() + { + float baseRadius = (float)Math.cbrt(this.fluidStack.amount/200.0); + float fluidFactor = getGasExpansionFactor(); + return baseRadius*fluidFactor; + } + + private float getSpreadTreshold() + { + return 0.2f; + } + + private float getGasExpansionFactor() + { + return 1.25f; + } + + private float getGasGrowthRate() { + return 0.01f; + } + /** + * Checks whether the cloud can expand to the given radius without intersecting solid blocks. + * Uses a sphere-like expansion: checks blocks within a cube of side 2*radius around center. + */ + private boolean canExpandToRadius(float radius) + { + BlockPos center = getPosition().up(); + int r = (int)Math.ceil(radius); + for(int x = -r; x <= r; x++) + for(int y = 0; y <= 2*r; y++) + for(int z = -r; z <= r; z++) + { + double distSq = x*x+y*y+z*z; + if(distSq <= radius*radius) + { + BlockPos pos = center.add(x, y, z); + IBlockState state = world.getBlockState(pos); + if(!state.getBlock().isAir(state, world, pos)&&state.isFullBlock()) + return false; + } + } + return true; } + /** + * Attempts to spawn child clouds in directions where expansion is possible. + * Each child inherits a portion of totalGasAmount, and the parent reduces its own amount. + */ + private void attemptSpawnChildren() + { + final int directions = 6; + EnumFacing[] faces = EnumFacing.values(); + float freeSpaceRatio = 0.0f; + + //Check how many directions are free for expansion + for(EnumFacing face : faces) + if(isDirectionFree(face)) + freeSpaceRatio += 1.0f/directions; + + if(freeSpaceRatio > getSpreadTreshold()) + { + //Transfer a fraction of gas to children + int amountPerChild = fluidStack.amount/(directions*2); + if(amountPerChild < 10) + return; //too little to expand + + for(EnumFacing face : faces) + if(isDirectionFree(face)) + { + //Calculate child position slightly offset in the direction of the face + double childX = posX+face.getFrontOffsetX()*(currentRadius+1); + double childY = posY+face.getFrontOffsetY()*(currentRadius+1); + double childZ = posZ+face.getFrontOffsetZ()*(currentRadius+1); + + //Spawn child gas cloud + FluidStack childFluid = fluidStack.copy(); + childFluid.amount = amountPerChild; + EntityGasCloud child = new EntityGasCloud(world, childX, childY, childZ, childFluid); + child.currentRadius = 0.5f; + world.spawnEntity(child); + + //Reduce parent amount + if((fluidStack.amount -= amountPerChild) <= 0) + { + setDead(); + return; + } + } + //Recalculate maxRadius based on new totalGasAmount + this.maxRadius = calculateMaxRadiusFromAmount(); + updateBoundingBox(); + } + } + + /** + * @return true if the gas cloud can expand freely in given direction + */ + private boolean isDirectionFree(EnumFacing face) + { + Vec3d expansionVector = new Vec3d(face.getDirectionVec()); + AxisAlignedBB checked = new AxisAlignedBB(this.getPosition()) + .grow(currentRadius) + .expand(0, -currentRadius, 0) + .expand(expansionVector.x*(currentRadius+1), expansionVector.y*(currentRadius+1), expansionVector.z*(currentRadius+1)) + .contract(-expansionVector.x*(currentRadius)*2, -expansionVector.y*(currentRadius)*2, -expansionVector.z*(currentRadius)*2); + + for(int x = (int)checked.minX; x <= checked.maxX; x++) + for(int y = (int)checked.minY; y <= checked.maxY; y++) + for(int z = (int)checked.minZ; z <= checked.maxZ; z++) + { + BlockPos pos = new BlockPos(x, y, z); + IBlockState state = world.getBlockState(pos); + if(!state.getBlock().isAir(state, world, pos)&&state.isFullBlock()) + return false; + } + return true; + } + + private void updateBoundingBox() + { + this.width = currentRadius*2; + this.height = currentRadius*2; + setEntityBoundingBox(new AxisAlignedBB(this.getPosition()) + .expand(currentRadius, currentRadius, currentRadius) + .expand(-currentRadius, 0, -currentRadius) + ); + } + + //--- NBT ---// + @Override - protected void writeEntityToNBT(NBTTagCompound compound) + public void readEntityFromNBT(NBTTagCompound compound) { + ISyncNBTEntity.super.readEntityFromNBT(compound); + //Update the radius + if(fluidStack!=null) + maxRadius = calculateMaxRadiusFromAmount(); + updateBoundingBox(); + } + @Override + public void writeEntityToNBT(NBTTagCompound compound) + { + ISyncNBTEntity.super.writeEntityToNBT(compound); } + //--- Overrides ---// + @Override public void setFire(int seconds) { - if(ChemthrowerHandler.isFlammable(fluid.getFluid())) + if(fluidStack!=null&&ChemthrowerHandler.isFlammable(fluidStack.getFluid())) { duration -= seconds*10; super.setFire(seconds); } } + + @Override + public boolean shouldRenderInPass(int pass) + { + return pass==0; + } + + @Override + public void move(MoverType type, double x, double y, double z) + { + + } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/block/BlockIIFluid.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/block/BlockIIFluid.java index d60c8ffdd..05b7e611f 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/block/BlockIIFluid.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/block/BlockIIFluid.java @@ -16,10 +16,14 @@ import net.minecraft.world.World; import net.minecraftforge.fluids.BlockFluidClassic; import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidUtil; import pl.pabilo8.immersiveintelligence.ImmersiveIntelligence; import pl.pabilo8.immersiveintelligence.api.CorrosionHandler.IAcidProtectionEquipment; import pl.pabilo8.immersiveintelligence.common.IIContent; +import pl.pabilo8.immersiveintelligence.common.entity.ammo.component.EntityGasCloud; +import javax.annotation.Nonnull; import javax.annotation.Nullable; /** @@ -30,7 +34,7 @@ */ public class BlockIIFluid extends BlockFluidClassic { - public boolean isAcid; + public boolean isAcid, isGasseous; private int flammability = 0; private int fireSpread = 0; private PotionEffect[] potionEffects; @@ -42,6 +46,7 @@ public BlockIIFluid(String name, Fluid fluid, Material material) this.setCreativeTab(IIContent.II_CREATIVE_TAB); IIContent.BLOCKS.add(this); isAcid = name.endsWith("acid"); + isGasseous = fluid.isGaseous(); } public BlockIIFluid setFlammability(int flammability, int fireSpread) @@ -57,6 +62,19 @@ public BlockIIFluid setPotionEffects(PotionEffect... potionEffects) return this; } + @Override + public int place(World world, BlockPos pos, @Nonnull FluidStack fluidStack, boolean doPlace) + { + if(isGasseous&&doPlace&&fluidStack.amount > 0) + { + FluidUtil.destroyBlockOnFluidPlacement(world, pos); + world.spawnEntity(new EntityGasCloud(world, pos.getX(), pos.getY(), pos.getZ(), fluidStack)); + return fluidStack.amount; + } + + return super.place(world, pos, fluidStack, doPlace); + } + @Override public int getFlammability(IBlockAccess world, BlockPos pos, EnumFacing face) { diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/easynbt/NBTSerialisation.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/easynbt/NBTSerialisation.java index da1773e68..3e60e5ba0 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/easynbt/NBTSerialisation.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/easynbt/NBTSerialisation.java @@ -7,6 +7,7 @@ import net.minecraft.util.NonNullList; import net.minecraft.util.math.Vec3d; import net.minecraftforge.common.util.INBTSerializable; +import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTank; import pl.pabilo8.immersiveintelligence.api.data.DataVariable; import pl.pabilo8.immersiveintelligence.api.data.IIDataTypeUtils; @@ -149,6 +150,11 @@ public static void preInit() ); registerSerializer(ItemStack.class, NBTTagCompound.class, ItemStack::serializeNBT, nbt -> new ItemStack(nbt)); + registerSerializer(FluidStack.class, NBTTagCompound.class, fluidStack -> { + NBTTagCompound nbt = new NBTTagCompound(); + fluidStack.writeToNBT(nbt); + return nbt; + }, FluidStack::loadFluidStackFromNBT); registerSerializer(UUID.class, NBTTagString.class, uuid -> new NBTTagString(uuid.toString()), diff --git a/src/main/resources/assets/immersiveintelligence/particles/smoke/gas_cloud.fx.amt b/src/main/resources/assets/immersiveintelligence/particles/smoke/gas_cloud.fx.amt new file mode 100644 index 000000000..c9cbdbf59 --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/particles/smoke/gas_cloud.fx.amt @@ -0,0 +1,13 @@ +{ + "type": "ParticleVanilla", + "textures": ["immersiveintelligence:particle/gas"], + "max_lifetime": 55, + "draw_stage": "custom_smoke_noise_shader", + "aabb": 0.3, + "color": "474747", + "programs": [ + "smoke_transition", + "gravity(1.0,-0.002)" + ], + "size": 1.0 +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/textures/particle/tracer/air_cone.png.mcmeta b/src/main/resources/assets/immersiveintelligence/textures/particle/tracer/air_cone.png.mcmeta new file mode 100644 index 000000000..c5d457f93 --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/textures/particle/tracer/air_cone.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 1 + } +} \ No newline at end of file From 438c993a2c13fcb2b18fb6ac5839385f898753e0 Mon Sep 17 00:00:00 2001 From: Pabilo8 Date: Wed, 27 May 2026 23:22:23 +0200 Subject: [PATCH 08/23] Improved white phosphorus particle effects --- .../common/IICreativeTab.java | 2 +- .../AmmoComponentWhitePhosphorus.java | 144 ++++++++---------- .../ammo/component/EntityWhitePhosphorus.java | 61 ++++---- .../particles/phosphorus/ember.fx.amt | 9 ++ .../particles/phosphorus/glow.fx.amt | 20 +++ .../particles/phosphorus/glow_big.fx.amt | 11 ++ .../particles/phosphorus/orb.fx.amt | 25 +++ .../phosphorus/smoke_graceful.fx.amt | 24 +++ .../particles/phosphorus/smoke_main.fx.amt | 12 ++ .../particles/phosphorus/smoke_trace.fx.amt | 12 ++ 10 files changed, 206 insertions(+), 114 deletions(-) create mode 100644 src/main/resources/assets/immersiveintelligence/particles/phosphorus/ember.fx.amt create mode 100644 src/main/resources/assets/immersiveintelligence/particles/phosphorus/glow.fx.amt create mode 100644 src/main/resources/assets/immersiveintelligence/particles/phosphorus/glow_big.fx.amt create mode 100644 src/main/resources/assets/immersiveintelligence/particles/phosphorus/orb.fx.amt create mode 100644 src/main/resources/assets/immersiveintelligence/particles/phosphorus/smoke_graceful.fx.amt create mode 100644 src/main/resources/assets/immersiveintelligence/particles/phosphorus/smoke_main.fx.amt create mode 100644 src/main/resources/assets/immersiveintelligence/particles/phosphorus/smoke_trace.fx.amt diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/IICreativeTab.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/IICreativeTab.java index 1b5051675..40cdfc284 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/IICreativeTab.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/IICreativeTab.java @@ -623,7 +623,7 @@ public void addExampleAmmo(NonNullList list) ItemStack stackP2 = addAmmo(list, item, name+"/P2 Spitzkopfgeschoss", IIContent.ammoCoreSteel, CoreType.PIERCING, FuseType.CONTACT); ItemStack stackP5 = addAmmo(list, item, name+"/P5 Phosphorpatrone", - IIContent.ammoCoreBrass, CoreType.PIERCING, FuseType.CONTACT, IIContent.ammoComponentHMX); + IIContent.ammoCoreBrass, CoreType.PIERCING, FuseType.CONTACT, IIContent.ammoComponentWhitePhosphorus); ItemStack stackW1 = addAmmo(list, item, name+"/W1 Flakpatrone", IIContent.ammoCoreBrass, CoreType.CANISTER, FuseType.PROXIMITY, IIContent.ammoComponentWhitePhosphorus, AmmoRegistry.getComponent("shrapnel_steel"), IIContent.ammoComponentTracerPowder); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/ammo/components/incendiary/AmmoComponentWhitePhosphorus.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/ammo/components/incendiary/AmmoComponentWhitePhosphorus.java index 841c14902..6ac826052 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/ammo/components/incendiary/AmmoComponentWhitePhosphorus.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/ammo/components/incendiary/AmmoComponentWhitePhosphorus.java @@ -2,26 +2,31 @@ import blusunrize.immersiveengineering.api.crafting.IngredientStack; import blusunrize.immersiveengineering.common.util.IEPotions; -import blusunrize.immersiveengineering.common.util.Utils; import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityAreaEffectCloud; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.init.Blocks; +import net.minecraft.init.SoundEvents; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.PotionEffect; -import net.minecraft.util.EnumParticleTypes; +import net.minecraft.util.DamageSource; import net.minecraft.util.SoundCategory; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import pl.pabilo8.immersiveintelligence.api.ammo.enums.ComponentEffectShape; import pl.pabilo8.immersiveintelligence.api.ammo.enums.ComponentRole; import pl.pabilo8.immersiveintelligence.api.ammo.parts.AmmoComponent; -import pl.pabilo8.immersiveintelligence.common.IIPotions; +import pl.pabilo8.immersiveintelligence.common.IILogger; import pl.pabilo8.immersiveintelligence.common.IISounds; +import pl.pabilo8.immersiveintelligence.common.IIUtils; import pl.pabilo8.immersiveintelligence.common.entity.ammo.component.EntityWhitePhosphorus; import pl.pabilo8.immersiveintelligence.common.network.IIPacketHandler; import pl.pabilo8.immersiveintelligence.common.network.messages.MessageParticleEffect; import pl.pabilo8.immersiveintelligence.common.util.IIColor; import javax.annotation.Nullable; +import java.util.Set; /** * @author Pabilo8 (pabilo@iiteam.net) @@ -46,87 +51,68 @@ public IngredientStack getMaterial() @Override public void onEffect(World world, Vec3d pos, Vec3d dir, ComponentEffectShape shape, NBTTagCompound tag, float size, float multiplier, @Nullable Entity owner) { - // CLOUD shape: similar to what you implemented earlier - if(shape==ComponentEffectShape.ORB) - { - // Effect logic for cloud shape (similar to your original implementation) - if(world.isRemote) - return; - - Vec3d v = dir.scale(-1); // Reverse direction for effect shaping + BlockPos blockPos = new BlockPos(pos); + if(size > 0.2) IIPacketHandler.playRangedSound(world, pos, IISounds.explosionIncendiary, SoundCategory.NEUTRAL, (int)(40*multiplier), 1f, 1f); + else + world.playSound(null, blockPos, SoundEvents.BLOCK_LAVA_EXTINGUISH, SoundCategory.BLOCKS, 1f, 1f); - // Spawn phosphorus fragments - for(int i = 0; i < 30*multiplier; i++) - { - Vec3d vecDir = new Vec3d(1, 0, 0).rotateYaw(i/(30f*multiplier)*360f).add(v); - EntityWhitePhosphorus shrap = new EntityWhitePhosphorus(world, pos.x+vecDir.x, pos.y+v.y+1f, pos.z+vecDir.z, 0, 0, 0); - - shrap.motionX = vecDir.x*0.35f; - shrap.motionY = 0.1f+(Utils.RAND.nextDouble()*0.2f); - shrap.motionZ = vecDir.z*0.35f; - - world.spawnEntity(shrap); - } + //Spawn main phosphorus entity, shared between all modes + EntityWhitePhosphorus main = new EntityWhitePhosphorus(world, pos.x-dir.x, pos.y-dir.y, pos.z-dir.z, 0, 0, 0); + main.motionX = -dir.x*0.75; + main.motionY = -dir.y*0.75; + main.motionZ = -dir.z*0.75; - // Send particle effect message to nearby clients - IIPacketHandler.sendToClient(new MessageParticleEffect("white_phosphorus", world, - pos.addVector(0, 1, 0), - Vec3d.ZERO, 0, 0, null - )); - - // Area of effect cloud (applies potion effects) - EntityAreaEffectCloud cloud = new EntityAreaEffectCloud(world, pos.x+v.x, pos.y+v.y+1f, pos.z+v.z); - cloud.addEffect(new PotionEffect(IIPotions.brokenArmor, Math.round(240), 2)); - cloud.addEffect(new PotionEffect(IEPotions.flammable, Math.round(240), 4)); - cloud.addEffect(new PotionEffect(IEPotions.stunned, Math.round(160), 2)); - cloud.addEffect(new PotionEffect(IEPotions.flashed, Math.round(270), 1)); - cloud.setRadius(3f*multiplier); - cloud.setDuration(Math.round(20f+(10f*Utils.RAND.nextFloat()))); - cloud.setParticle(EnumParticleTypes.CLOUD); - world.spawnEntity(cloud); - } - // BURST shape: a more explosive spread of shrapnel and effects - else if(shape==ComponentEffectShape.STAR) + if(size > 0.2f) { - if(world.isRemote) - return; - - // Play a more intense sound for burst explosion - IIPacketHandler.playRangedSound(world, pos, IISounds.explosionIncendiary, SoundCategory.NEUTRAL, (int)(60*multiplier), 1.2f, 1.2f); - - // Spawn shrapnel in a wider, explosive pattern - for(int i = 0; i < 50*multiplier; i++) - { - // Adjust angles to spread more widely for burst effect - Vec3d vecDir = new Vec3d(1, 0, 0).rotateYaw(i/(50f*multiplier)*360f).add(dir); - EntityWhitePhosphorus shrap = new EntityWhitePhosphorus(world, pos.x+vecDir.x, pos.y+dir.y+1f, pos.z+vecDir.z, 0, 0, 0); - - // Burst fragments have higher speed and randomness - shrap.motionX = vecDir.x*0.6f; - shrap.motionY = 0.2f+(Utils.RAND.nextDouble()*0.3f); - shrap.motionZ = vecDir.z*0.6f; - - world.spawnEntity(shrap); - } - - // Send particle effect with burst ID - IIPacketHandler.sendToClient(new MessageParticleEffect("white_phosphorus_burst", world, - pos.addVector(0, 1, 0), - Vec3d.ZERO, 0, 0, null - )); + //Set fire to surrounding blocks in a radius + Set blocks = IIUtils.getBlocksInOrb(world, blockPos, size*4f); + for(BlockPos block : blocks) + if(world.isAirBlock(block)) + world.setBlockState(block, Blocks.FIRE.getDefaultState()); + } + //Deal fire damage to all entities around + for(Entity entity : world.getEntitiesWithinAABB(Entity.class, new AxisAlignedBB(blockPos).grow(4f))) + { + if(entity instanceof EntityLivingBase) + ((EntityLivingBase)entity).addPotionEffect(new PotionEffect(IEPotions.flammable, 80, 1)); + entity.attackEntityFrom(DamageSource.IN_FIRE, 10f*multiplier); + entity.setFire(40); + } - // A larger, faster dissipating cloud - EntityAreaEffectCloud cloud = new EntityAreaEffectCloud(world, pos.x+dir.x, pos.y+dir.y+1f, pos.z+dir.z); - cloud.addEffect(new PotionEffect(IIPotions.brokenArmor, Math.round(180), 3)); - cloud.addEffect(new PotionEffect(IEPotions.flammable, Math.round(180), 5)); - cloud.addEffect(new PotionEffect(IEPotions.stunned, Math.round(120), 3)); - cloud.addEffect(new PotionEffect(IEPotions.flashed, Math.round(220), 2)); - cloud.setRadius(4.5f*multiplier); // Burst shape has a larger radius - cloud.setDuration(Math.round(15f+(8f*Utils.RAND.nextFloat()))); // Burst effect lasts a bit shorter - cloud.setParticle(EnumParticleTypes.EXPLOSION_LARGE); - world.spawnEntity(cloud); + switch(shape) + { + case ORB: + case STAR: + case CONE: + IIPacketHandler.sendToClient(new MessageParticleEffect("phosphorus/orb", world, pos, Vec3d.ZERO, 0, 0, null)); + main.motionX = 0; + main.motionY = 0.4; + main.motionZ = 0; + + float particlesInLayer = 10f*size; + // Spawn shrapnel in a wider, explosive pattern + for(int i = 0; i < 2*particlesInLayer; i++) + { + Vec3d vecDir = dir.scale(i < size*10?-1: -2).rotateYaw(i/(particlesInLayer)*360f); + EntityWhitePhosphorus shrap = new EntityWhitePhosphorus(world, pos.x+vecDir.x, pos.y-dir.y, pos.z+vecDir.z, 0, 0, 0); + + vecDir = vecDir.scale(2); + shrap.motionX = vecDir.x*0.125f; + shrap.motionY = (vecDir.y+(i < size*10?2: 0.5))*0.125f*2; + shrap.motionZ = vecDir.z*0.125f; + world.spawnEntity(shrap); + } + break; + case LINE: + IILogger.info("Line!"); + Set blocks = IIUtils.getBlocksInOrb(world, blockPos, 1f); + for(BlockPos block : blocks) + if(world.isAirBlock(block)) + world.setBlockState(block, Blocks.FIRE.getDefaultState()); + break; } + world.spawnEntity(main); } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/component/EntityWhitePhosphorus.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/component/EntityWhitePhosphorus.java index 878201962..53b5404d8 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/component/EntityWhitePhosphorus.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/component/EntityWhitePhosphorus.java @@ -1,31 +1,26 @@ package pl.pabilo8.immersiveintelligence.common.entity.ammo.component; import blusunrize.immersiveengineering.common.entities.EntityIEProjectile; -import blusunrize.immersiveengineering.common.util.IEPotions; -import blusunrize.immersiveengineering.common.util.Utils; import com.elytradev.mirage.event.GatherLightsEvent; import com.elytradev.mirage.lighting.ILightEventConsumer; import com.elytradev.mirage.lighting.Light; -import net.minecraft.entity.EntityAreaEffectCloud; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.SoundEvents; -import net.minecraft.potion.PotionEffect; -import net.minecraft.util.EnumParticleTypes; import net.minecraft.util.SoundCategory; import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.RayTraceResult.Type; -import net.minecraft.world.Explosion; +import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import net.minecraftforge.fml.common.Optional; import net.minecraftforge.fml.common.Optional.Interface; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +import pl.pabilo8.immersiveintelligence.client.fx.utils.IIParticleUtils; import pl.pabilo8.immersiveintelligence.client.fx.utils.ParticleProperties; import pl.pabilo8.immersiveintelligence.client.fx.utils.ParticleRegistry; -import pl.pabilo8.immersiveintelligence.common.IIPotions; -import pl.pabilo8.immersiveintelligence.common.util.IIColor; import pl.pabilo8.immersiveintelligence.common.util.entity.IIEntityUtils; import javax.vecmath.Vector2f; @@ -40,6 +35,7 @@ public class EntityWhitePhosphorus extends EntityIEProjectile implements ILightE public EntityWhitePhosphorus(World world) { super(world); + setTickLimit(8); } public EntityWhitePhosphorus(World world, double x, double y, double z, double ax, double ay, double az) @@ -56,7 +52,7 @@ protected void entityInit() @Override public double getGravity() { - return 0.07F; + return 0.004F; } /** @@ -66,17 +62,24 @@ public double getGravity() public void onEntityUpdate() { super.onEntityUpdate(); - if(getEntityWorld().isRemote) + if(world.isRemote) spawnTracerParticles(); } @SideOnly(Side.CLIENT) private void spawnTracerParticles() { - ParticleRegistry.spawnParticle("ammo/tracer", getPositionVector(), IIEntityUtils.getEntityMotion(this), new Vector2f(0, 0)) - .withProperty(ParticleProperties.COLOR, IIColor.WHITE) - .withProperty(ParticleProperties.SIZE, 0.4f) - .withProperty(ParticleProperties.MAX_LIFETIME, 20); + ParticleRegistry.spawnParticle("phosphorus/ember", getPositionVector(), IIEntityUtils.getEntityMotion(this), new Vector2f(0, 0)) + .withProperty(ParticleProperties.SIZE, 0.25f-(0.07f*(ticksExisted/7f))); + ParticleRegistry.spawnParticle("phosphorus/smoke_trace", getPositionVector(), Vec3d.ZERO, new Vector2f(0, 0)) + .withProperty(ParticleProperties.SIZE, 0.8f-(0.5f*(ticksExisted/7f))); + if(ticksExisted < 7) + for(int i = 0; i < IIParticleUtils.randInt.get()%3; i++) + ParticleRegistry.spawnParticle("phosphorus/smoke_graceful", getPositionVector() + .addVector(0, 0.5, 0) + .add(IIParticleUtils.getRandXZ().scale(0.5f)), + Vec3d.ZERO, new Vector2f(0, 0)); + } /** @@ -85,32 +88,22 @@ private void spawnTracerParticles() @Override public void setFire(int seconds) { - super.setFire(seconds); + } @Override public void onImpact(RayTraceResult mop) { - if(!this.world.isRemote&&mop.typeOfHit!=Type.MISS&&world!=null&&mop.getBlockPos()!=null) + if(!this.world.isRemote&&mop.typeOfHit!=Type.MISS) { - Explosion explosion = new Explosion(world, this, posX, posY, posZ, 1, true, false); - explosion.doExplosionA(); - explosion.doExplosionB(false); - - world.playSound(null, mop.getBlockPos(), SoundEvents.BLOCK_LAVA_EXTINGUISH, SoundCategory.BLOCKS, 0.125f, 1f); - - EntityAreaEffectCloud cloud = new EntityAreaEffectCloud(world, mop.getBlockPos().getX(), mop.getBlockPos().getY()+1f, mop.getBlockPos().getZ()); - cloud.addEffect(new PotionEffect(IIPotions.brokenArmor, Math.round(180), 1)); - cloud.addEffect(new PotionEffect(IEPotions.flammable, Math.round(180), 2)); - cloud.addEffect(new PotionEffect(IEPotions.stunned, Math.round(80), 1)); - cloud.addEffect(new PotionEffect(IEPotions.flashed, Math.round(120), 1)); - cloud.setRadius(6f); - cloud.setDuration(Math.round(30f+(10f*Utils.RAND.nextFloat()))); - cloud.setParticle(EnumParticleTypes.CLOUD); - world.spawnEntity(cloud); - - world.getEntitiesWithinAABB(EntityLivingBase.class, new AxisAlignedBB(getPosition()).grow(0.5f)).forEach(entityLivingBase -> entityLivingBase.setFire(40)); - + //Ignore other white phosphorus + if(mop.typeOfHit==Type.ENTITY&&mop.entityHit instanceof EntityWhitePhosphorus) + return; + //Set hit entity to fire + BlockPos hitPos = new BlockPos(mop.hitVec); + world.playSound(null, hitPos, SoundEvents.BLOCK_LAVA_EXTINGUISH, SoundCategory.BLOCKS, 0.125f, 1f); + world.getEntitiesWithinAABB(EntityLivingBase.class, new AxisAlignedBB(hitPos).grow(0.5f)) + .forEach(entityLivingBase -> entityLivingBase.setFire(40)); setDead(); } } diff --git a/src/main/resources/assets/immersiveintelligence/particles/phosphorus/ember.fx.amt b/src/main/resources/assets/immersiveintelligence/particles/phosphorus/ember.fx.amt new file mode 100644 index 000000000..7c3c3011c --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/particles/phosphorus/ember.fx.amt @@ -0,0 +1,9 @@ +{ + "type": "ParticleVanilla", + "textures": ["immersiveintelligence:particle/paint"], + "max_lifetime": 4, + "draw_stage": "custom_additive", + "aabb": 0.3, + "color": "ffde7b", + "size": 0.25 +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/particles/phosphorus/glow.fx.amt b/src/main/resources/assets/immersiveintelligence/particles/phosphorus/glow.fx.amt new file mode 100644 index 000000000..6af12599a --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/particles/phosphorus/glow.fx.amt @@ -0,0 +1,20 @@ +{ + "type": "ParticleVanilla", + "textures": ["immersiveintelligence:particle/round"], + "color": "ab7810", + "max_lifetime": 6, + "draw_stage": "custom_additive", + "size": 1.65, + "programs": [ + "shockwave_transition" + ], + "scheduled": [ + { + "time": 1, + "generator": "same", + "distance": 0.5, + "amount": 1, + "type": "phosphorus/glow_big" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/particles/phosphorus/glow_big.fx.amt b/src/main/resources/assets/immersiveintelligence/particles/phosphorus/glow_big.fx.amt new file mode 100644 index 000000000..d78978dfa --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/particles/phosphorus/glow_big.fx.amt @@ -0,0 +1,11 @@ +{ + "type": "ParticleVanilla", + "textures": ["immersiveintelligence:particle/round"], + "color": "ab9f17", + "max_lifetime": 6, + "draw_stage": "custom_additive", + "size": 5.0, + "programs": [ + "shockwave_transition" + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/particles/phosphorus/orb.fx.amt b/src/main/resources/assets/immersiveintelligence/particles/phosphorus/orb.fx.amt new file mode 100644 index 000000000..c46136e14 --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/particles/phosphorus/orb.fx.amt @@ -0,0 +1,25 @@ +{ + "type": "ParticleModel", + "models": ["smoke/smoke_trace.obj"], + "max_lifetime": 25, + "draw_stage": "custom_smoke_noise_shader", + "programs": [ + "smoke_transition" + ], + "scheduled": [ + { + "time": 0, + "generator": "same", + "distance": -0.5, + "amount": 1, + "type": "phosphorus/glow" + }, + { + "time": 20, + "generator": "rand_xz", + "distance": 2.0, + "amount": 4, + "type": "phosphorus/smoke_main" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/particles/phosphorus/smoke_graceful.fx.amt b/src/main/resources/assets/immersiveintelligence/particles/phosphorus/smoke_graceful.fx.amt new file mode 100644 index 000000000..799278244 --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/particles/phosphorus/smoke_graceful.fx.amt @@ -0,0 +1,24 @@ +{ + "type": "ParticleVanilla", + "textures": [ + "immersiveintelligence:particle/rough/smoke1", + "immersiveintelligence:particle/rough/smoke2", + "immersiveintelligence:particle/rough/smoke3", + "immersiveintelligence:particle/rough/smoke2", + "immersiveintelligence:particle/rough/smoke3", + "immersiveintelligence:particle/rough/smoke4", + "immersiveintelligence:particle/rough/smoke2", + "immersiveintelligence:particle/rough/smoke1", + "immersiveintelligence:particle/rough/smoke0" + ], + "max_lifetime": 45, + "draw_stage": "custom_additive", + "aabb": 0.4, + "color": "9c6724", + "programs": [ + "smoke_transition", + "lifetime_retexture", + "gravity(0.3,0.03)" + ], + "size": 0.4 +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/particles/phosphorus/smoke_main.fx.amt b/src/main/resources/assets/immersiveintelligence/particles/phosphorus/smoke_main.fx.amt new file mode 100644 index 000000000..9681e2c26 --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/particles/phosphorus/smoke_main.fx.amt @@ -0,0 +1,12 @@ +{ + "type": "ParticleVanilla", + "textures": ["immersiveintelligence:particle/gas"], + "max_lifetime": 120, + "draw_stage": "custom_smoke_noise_shader", + "aabb": 1.0, + "color": "ffffff", + "programs": [ + "smoke_transition" + ], + "size": 4.5 +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/particles/phosphorus/smoke_trace.fx.amt b/src/main/resources/assets/immersiveintelligence/particles/phosphorus/smoke_trace.fx.amt new file mode 100644 index 000000000..c6618ce41 --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/particles/phosphorus/smoke_trace.fx.amt @@ -0,0 +1,12 @@ +{ + "type": "ParticleVanilla", + "textures": ["immersiveintelligence:particle/smoke/smoke"], + "max_lifetime": 80, + "draw_stage": "custom_smoke_noise_shader", + "aabb": 0.3, + "color": "ffffff", + "programs": [ + "smoke_transition" + ], + "size": 0.8 +} \ No newline at end of file From bb17e1a40ec0459bc397adf7cd3862f8c2145842 Mon Sep 17 00:00:00 2001 From: Pabilo8 Date: Thu, 28 May 2026 23:16:17 +0200 Subject: [PATCH 09/23] Fixed seats bug in vehicles, added propeller sound loop for drones, and engine sounds for ground vehicles --- .../entity/vehicle/IIVehicleRenderer.java | 6 +- .../util/carversound/CompoundSound.java | 8 ++ .../common/IISounds.java | 22 +++-- .../common/entity/ammo/EntityAmmoBase.java | 22 +---- .../mounted_weapon/EntityMountedWeapon.java | 22 +---- .../common/entity/vehicle/EntityDrone.java | 57 +++++++------ .../entity/vehicle/EntityMotorbike.java | 23 +++--- .../vehicle/EntityTrackedMotorbike.java | 15 ++-- .../vehicle/utils/part/EntityVehicleSeat.java | 17 +++- .../utils/propulsion/VehicleEngineBase.java | 10 ++- .../propulsion/VehicleEngineElectric.java | 9 ++- .../propulsion/VehicleEngineFuelBased.java | 75 ++++++++++++++++-- .../utils/propulsion/VehicleEngineManual.java | 9 ++- .../utils/propulsion/VehicleEngineSteam.java | 9 ++- .../utils/propulsion/VehicleTransmission.java | 10 +-- .../common/util/entity/ISyncNBTEntity.java | 29 ++++++- .../immersiveintelligence/lang/en_us.lang | 8 +- .../particles/vehicle/exhaust_light.fx.amt | 13 +++ .../sounds/vehicle/drone/drone_propeller.ogg | Bin 0 -> 323893 bytes .../engine_light}/engine.ogg | Bin .../engine_light}/start.ogg | Bin .../engine_light}/start_no_fuel.ogg | Bin .../sounds/{motorbike => vehicle}/horn.ogg | Bin 23 files changed, 251 insertions(+), 113 deletions(-) create mode 100644 src/main/resources/assets/immersiveintelligence/particles/vehicle/exhaust_light.fx.amt create mode 100644 src/main/resources/assets/immersiveintelligence/sounds/vehicle/drone/drone_propeller.ogg rename src/main/resources/assets/immersiveintelligence/sounds/{motorbike => vehicle/engine_light}/engine.ogg (100%) rename src/main/resources/assets/immersiveintelligence/sounds/{motorbike => vehicle/engine_light}/start.ogg (100%) rename src/main/resources/assets/immersiveintelligence/sounds/{motorbike => vehicle/engine_light}/start_no_fuel.ogg (100%) rename src/main/resources/assets/immersiveintelligence/sounds/{motorbike => vehicle}/horn.ogg (100%) diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/vehicle/IIVehicleRenderer.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/vehicle/IIVehicleRenderer.java index 7c4eba858..2143e0ed4 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/vehicle/IIVehicleRenderer.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/vehicle/IIVehicleRenderer.java @@ -153,9 +153,9 @@ protected void applyGearboxAnimation(VehicleTransmission transmission, IIAnim } - protected > void applyEngineAnimation(T engineBase, - IIAnimationCachedMap startingAnimation, IIAnimationCachedMap runningAnimation, - float partialTicks) + protected > void applyEngineAnimation(T engineBase, + IIAnimationCachedMap startingAnimation, IIAnimationCachedMap runningAnimation, + float partialTicks) { if(engineBase.isStarting()) startingAnimation.apply(engineBase.getStartingProgress(partialTicks)); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/util/carversound/CompoundSound.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/util/carversound/CompoundSound.java index 7042c73cb..70ac3c630 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/util/carversound/CompoundSound.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/util/carversound/CompoundSound.java @@ -64,8 +64,16 @@ public void setVolume(float volume) this.volume = volume; } + public void setPosition(Vec3d position) + { + this.xPosF = (float)position.x; + this.yPosF = (float)position.y; + this.zPosF = (float)position.z; + } + public void start() { Minecraft.getMinecraft().getSoundHandler().playSound(this); } + } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/IISounds.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/IISounds.java index a639b5ed4..e4f6dc474 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/IISounds.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/IISounds.java @@ -519,14 +519,20 @@ public class IISounds public static SoundEvent impactFlesh = registerSound("impact_flesh"); //--- Vehicle ---// - @ModSound(sounds = {"motorbike/start"}, subtitle = "*") - public static SoundEvent motorbikeStart = registerSound("motorbike_start"); - @ModSound(sounds = {"motorbike/start_no_fuel"}, subtitle = "motorbike_start") - public static SoundEvent motorbikeStartNoFuel = registerSound("motorbike_start_no_fuel"); - @ModSound(sounds = {"motorbike/engine"}, subtitle = "*") - public static SoundEvent motorbikeEngine = registerSound("motorbike_engine"); - @ModSound(sounds = {"motorbike/horn"}, subtitle = "*") - public static SoundEvent motorbikeHorn = registerSound("motorbike_horn"); + @ModSound(sounds = {"vehicle/horn"}, subtitle = "*") + public static SoundEvent vehicleHorn = registerSound("vehicle_horn"); + @ModSound(sounds = {"vehicle/engine_light/start"}, subtitle = "*") + public static SoundEvent engineLightStart = registerSound("light_engine_start"); + @ModSound(sounds = {"vehicle/engine_light/start_no_fuel"}, subtitle = "light_engine_start") + public static SoundEvent engineLightStartNoFuel = registerSound("light_engine_start_no_fuel"); + @ModSound(sounds = {"vehicle/engine_light/engine"}, subtitle = "*") + public static SoundEvent engineLight = registerSound("light_engine"); + public static MultiSound engineLightLoop = new MultiSound(engineLight); + + //--- Aircraft ---// + @ModSound(sounds = {"vehicle/drone/drone_propeller"}, subtitle = "*") + public static SoundEvent dronePropeller = registerSound("drone_propeller"); + public static MultiSound dronePropellerLoop = new MultiSound(dronePropeller); //--- Hans ---// //public static SoundEvent hans_test_pl = registerSound("hans_test_pl"); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/EntityAmmoBase.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/EntityAmmoBase.java index 7ddac6660..207a67f3c 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/EntityAmmoBase.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/EntityAmmoBase.java @@ -3,7 +3,6 @@ import com.elytradev.mirage.event.GatherLightsEvent; import com.elytradev.mirage.lighting.IEntityLightEventConsumer; import com.elytradev.mirage.lighting.Light; -import io.netty.buffer.ByteBuf; import net.minecraft.entity.Entity; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -12,8 +11,6 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import net.minecraftforge.fml.common.Optional; -import net.minecraftforge.fml.common.network.ByteBufUtils; -import net.minecraftforge.fml.common.registry.IEntityAdditionalSpawnData; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import pl.pabilo8.immersiveintelligence.api.ammo.AmmoRegistry; @@ -41,8 +38,7 @@ * @since 30.01.2024 */ @Optional.Interface(iface = "com.elytradev.mirage.lighting.IEntityLightEventConsumer", modid = "mirage") -public abstract class EntityAmmoBase> extends Entity implements IEntityAdditionalSpawnData, IEntityLightEventConsumer, - ISyncNBTEntity> +public abstract class EntityAmmoBase> extends Entity implements IEntityLightEventConsumer, ISyncNBTEntity> { //--- Properties ---// /** @@ -225,22 +221,6 @@ public void writeEntityToNBT(NBTTagCompound compound) } - @Override - public void writeSpawnData(ByteBuf buffer) - { - NBTTagCompound compound = new NBTTagCompound(); - writeEntityToNBT(compound); - ByteBufUtils.writeTag(buffer, compound); - } - - @Override - public void readSpawnData(ByteBuf additionalData) - { - NBTTagCompound compound = ByteBufUtils.readTag(additionalData); - if(compound!=null) - readEntityFromNBT(compound); - } - //--- Abstract ---// protected abstract boolean shouldDecay(); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMountedWeapon.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMountedWeapon.java index 1a887a232..bfabb987e 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMountedWeapon.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMountedWeapon.java @@ -1,7 +1,6 @@ package pl.pabilo8.immersiveintelligence.common.entity.mounted_weapon; import blusunrize.immersiveengineering.api.tool.ZoomHandler; -import io.netty.buffer.ByteBuf; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.entity.Entity; @@ -16,8 +15,6 @@ import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; -import net.minecraftforge.fml.common.network.ByteBufUtils; -import net.minecraftforge.fml.common.registry.IEntityAdditionalSpawnData; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import pl.pabilo8.immersiveintelligence.client.util.CameraHandler; @@ -38,7 +35,7 @@ * @ii-approved 0.3.1 * @since 15.05.2026 */ -public abstract class EntityMountedWeapon extends Entity implements IEntityAdditionalSpawnData, ISyncNBTEntity +public abstract class EntityMountedWeapon extends Entity implements ISyncNBTEntity { @SyncNBT(events = SyncEvents.ENTITY_VEHICLE_CONTROLS) public VehicleControls controls = new VehicleControls(); @@ -269,22 +266,9 @@ protected Entity getUser() //--- NBT ---// @Override - public final void writeSpawnData(ByteBuf buffer) + public void doPostWorldLoadSetup(NBTTagCompound tag) { - NBTTagCompound tag = new NBTTagCompound(); - writeEntityToNBT(tag); - ByteBufUtils.writeTag(buffer, tag); - } - - @Override - public final void readSpawnData(ByteBuf additionalData) - { - NBTTagCompound tag = ByteBufUtils.readTag(additionalData); - if(tag!=null) - { - readEntityFromNBT(tag); - setOriginStack(this.originStack); - } + setOriginStack(this.originStack); } @Override diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/EntityDrone.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/EntityDrone.java index 3a7fa2eb3..bbbcf56eb 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/EntityDrone.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/EntityDrone.java @@ -11,7 +11,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.EnumHand; import net.minecraft.util.EnumHandSide; -import net.minecraft.util.EnumParticleTypes; import net.minecraft.util.NonNullList; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.Vec3d; @@ -23,7 +22,10 @@ import pl.pabilo8.immersiveintelligence.api.ammo.utils.AmmoFactory; import pl.pabilo8.immersiveintelligence.api.utils.IEntitySpecialRepairable; import pl.pabilo8.immersiveintelligence.api.utils.vehicles.IVehicleMultiPart; +import pl.pabilo8.immersiveintelligence.client.fx.utils.ParticleRegistry; +import pl.pabilo8.immersiveintelligence.client.util.carversound.ConditionCompoundSound; import pl.pabilo8.immersiveintelligence.common.IIContent; +import pl.pabilo8.immersiveintelligence.common.IISounds; import pl.pabilo8.immersiveintelligence.common.entity.EntityHans; import pl.pabilo8.immersiveintelligence.common.entity.ammo.types.EntityAmmoArtilleryProjectile; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.drone.AIDroneTarget; @@ -31,10 +33,12 @@ import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.EntityVehiclePart; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.EntityVehicleSeat.SeatInfo; import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT; +import pl.pabilo8.immersiveintelligence.common.util.entity.IIEntityUtils; import pl.pabilo8.immersiveintelligence.common.util.entity.ISyncNBTEntity; import pl.pabilo8.immersiveintelligence.common.util.entity.SyncedDurability; import javax.annotation.Nullable; +import javax.vecmath.Vector2f; import java.util.List; /** @@ -47,6 +51,8 @@ public class EntityDrone extends EntityFlying implements ISyncNBTEntity[] partArray; + @SideOnly(Side.CLIENT) + private ConditionCompoundSound engineNoise; //Sub-entities for colision and hitboxes private EntityVehiclePart partMain, partTankRight1, partTankRight2, partTankLeft1, partTankLeft2, partEngine; @@ -66,21 +72,21 @@ public EntityDrone(World world) //Set ammo factory (bomb dropping) this.ammoFactory = new AmmoFactory<>(this); - ammoFactory.setStack(IIContent.itemAmmoGuidedMissile.getAmmoStack(IIContent.ammoCoreIron, CoreType.CANISTER, FuseType.CONTACT, IIContent.ammoComponentRDX)); + this.ammoFactory.setStack(IIContent.itemAmmoGuidedMissile.getAmmoStack(IIContent.ammoCoreIron, CoreType.CANISTER, FuseType.CONTACT, IIContent.ammoComponentRDX)); //Set durability and armor - durabilityMain = new SyncedDurability(100, 4); - durabilityTankLeft = new SyncedDurability(45, 6); - durabilityTankRight = new SyncedDurability(45, 6); - durabilityEngine = new SyncedDurability(40, 2); + this.durabilityMain = new SyncedDurability(100, 4); + this.durabilityTankLeft = new SyncedDurability(45, 6); + this.durabilityTankRight = new SyncedDurability(45, 6); + this.durabilityEngine = new SyncedDurability(40, 2); - durabilityRotorFrontRight = new SyncedDurability(20, 24); - durabilityRotorFrontLeft = new SyncedDurability(20, 24); - durabilityRotorBackRight = new SyncedDurability(20, 24); - durabilityRotorBackLeft = new SyncedDurability(20, 24); + this.durabilityRotorFrontRight = new SyncedDurability(20, 24); + this.durabilityRotorFrontLeft = new SyncedDurability(20, 24); + this.durabilityRotorBackRight = new SyncedDurability(20, 24); + this.durabilityRotorBackLeft = new SyncedDurability(20, 24); //Set parts - partArray = new EntityVehiclePart[]{ + this.partArray = new EntityVehiclePart[]{ partMain = new EntityVehiclePart<>(this, "main", Vec3d.ZERO, 0.65, 0.4) .withHitbox(durabilityMain), @@ -216,23 +222,22 @@ public void onEntityUpdate() } } - if(world.isRemote)//&&world.getTotalWorldTime()%2==0 + if(world.isRemote) { - Vec3d smokeDir = this.getVectorForRotation(0, this.rotationYaw).scale(-0.25); - spawnExhaustParticle(exhaust1.getPositionVector(), smokeDir); - spawnExhaustParticle(exhaust2.getPositionVector(), smokeDir); + //Create and sustain engine noise + if(engineNoise==null) + this.engineNoise = new ConditionCompoundSound<>(IISounds.dronePropellerLoop, this.getPositionVector(), this, drone -> !drone.isDead); + this.engineNoise.setPosition(getPositionVector()); + this.engineNoise.setVolume(1f); + this.engineNoise.setPitch((float)IIEntityUtils.getEntityMotion(this).lengthSquared()*0.1f+0.95f); + + if(ticksExisted%2==0) + { + Vec3d smokeDir = this.getVectorForRotation(0, this.rotationYaw).scale(-0.25); + ParticleRegistry.spawnParticle("vehicle/exhaust_light", exhaust1.getPositionVector(), smokeDir, new Vector2f(0, 0)); + ParticleRegistry.spawnParticle("vehicle/exhaust_light", exhaust2.getPositionVector(), smokeDir, new Vector2f(0, 0)); + } } - - } - - @SideOnly(Side.CLIENT) - private void spawnExhaustParticle(Vec3d position, Vec3d smokeDir) - { - float exhaustRandom = (world.getTotalWorldTime()%20/20f)*0.2f; - world.spawnParticle(EnumParticleTypes.SMOKE_LARGE, - position.x, position.y, position.z, - 0+smokeDir.x, 0.015625*3, smokeDir.z - ); } @Override diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/EntityMotorbike.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/EntityMotorbike.java index dfe167fd1..e2a67f6be 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/EntityMotorbike.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/EntityMotorbike.java @@ -23,6 +23,7 @@ import pl.pabilo8.immersiveintelligence.client.ClientProxy; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Vehicles.Motorbike; import pl.pabilo8.immersiveintelligence.common.IIContent; +import pl.pabilo8.immersiveintelligence.common.IISounds; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleBlueprint; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleControls; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleFuelTank; @@ -73,21 +74,22 @@ public class EntityMotorbike extends EntityVehicleBase public EntityVehiclePart partSeat, partUpgradeSeat, partUpgradeCargo; public SeatInfo seatRider, seatPassenger, seatTowed; + @SyncNBT(events = SyncEvents.ENTITY_VEHICLE_CONTROLS) + public VehicleControls driverControls; + @SyncNBT(events = SyncEvents.ENTITY_DAMAGED) public SyncedDurability frontWheelDurability, backWheelDurability, engineDurability, fuelTankDurability; @SyncNBT(events = SyncEvents.ENTITY_VEHICLE_FUEL, time = 40) public VehicleFuelTank fuelTank; - @SyncNBT(events = SyncEvents.ENTITY_VEHICLE_CONTROLS) - public VehicleControls driverControls; @SyncNBT(events = SyncEvents.ENTITY_VEHICLE_FUEL) - public VehicleEngineFuelBased engine; + public VehicleEngineFuelBased engine; @SyncNBT(events = SyncEvents.ENTITY_VEHICLE_FUEL) public VehicleTransmission transmission; - public EntityMotorbike(World worldIn) + public EntityMotorbike(World world) { - super(worldIn); + super(world); } @SuppressWarnings("unchecked") @@ -142,8 +144,11 @@ protected EntityVehiclePart[] vehicleInit() .withWeightShare(0.4); this.fuelTank = new VehicleFuelTank<>(this, 12000) .withDurability(fuelTankDurability); - this.engine = new VehicleEngineFuelBased(fuelTank) - .withDurability(engineDurability); + this.engine = new VehicleEngineFuelBased<>(this, fuelTank) + .withDurability(engineDurability) + .withEngineSound(IISounds.engineLightLoop, 0.95f, 1.25f) + .withSpeedTorque(200, 40) + .withFuelUsage(4, 32); this.transmission = new VehicleTransmission(this.engine) .withDurability(engineDurability) .withRatios(20, -0.25, 0.5, 1) @@ -246,9 +251,9 @@ public boolean onInteractWithPart(EntityVehiclePart part, EntityPlayer player, E else if(!world.isRemote) { if(part==partSeat) - return player.startRiding(EntityVehicleSeat.getOrCreateSeat(seatRider)); + return EntityVehicleSeat.enterSeat(player, seatRider); else if(part==partUpgradeSeat) - return player.startRiding(EntityVehicleSeat.getOrCreateSeat(seatPassenger)); + return EntityVehicleSeat.enterSeat(player, seatPassenger); } return false; } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/EntityTrackedMotorbike.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/EntityTrackedMotorbike.java index 4e3643f80..acf48f094 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/EntityTrackedMotorbike.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/EntityTrackedMotorbike.java @@ -19,6 +19,7 @@ import pl.pabilo8.immersiveintelligence.api.upgrade.UpgradeTechTree; import pl.pabilo8.immersiveintelligence.client.ClientProxy; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Vehicles.Motorbike; +import pl.pabilo8.immersiveintelligence.common.IISounds; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleBlueprint; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleControls; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleFuelTank; @@ -54,15 +55,16 @@ public class EntityTrackedMotorbike extends EntityVehicleBase partDriverSeat, partPassengerSeat; public SeatInfo seatDriver, seatPassenger, seatTowed; + @SyncNBT(events = SyncEvents.ENTITY_VEHICLE_CONTROLS) + public VehicleControls driverControls; + @SyncNBT(events = SyncEvents.ENTITY_DAMAGED) public SyncedDurability frontWheelDurability, backWheelDurability, engineDurability, fuelTankDurability; @SyncNBT(events = SyncEvents.ENTITY_VEHICLE_FUEL, time = 40) public VehicleFuelTank fuelTank; - @SyncNBT(events = SyncEvents.ENTITY_VEHICLE_CONTROLS) - public VehicleControls driverControls; @SyncNBT(events = SyncEvents.ENTITY_VEHICLE_FUEL) - public VehicleEngineFuelBased engine; + public VehicleEngineFuelBased engine; @SyncNBT(events = SyncEvents.ENTITY_VEHICLE_FUEL) public VehicleTransmission transmission1, transmission2; @@ -159,8 +161,11 @@ protected EntityVehiclePart[] vehicleInit() //Components this.fuelTank = new VehicleFuelTank<>(this, 12000) .withDurability(fuelTankDurability); - this.engine = new VehicleEngineFuelBased(fuelTank) - .withDurability(engineDurability); + this.engine = new VehicleEngineFuelBased<>(this, fuelTank) + .withDurability(engineDurability) + .withEngineSound(IISounds.engineLightLoop, 0.95f, 1.25f) + .withSpeedTorque(360, 80) + .withFuelUsage(4, 40); this.transmission1 = new VehicleTransmission(this.engine) .withDurability(engineDurability) .withRatios(20, 0.5, 1) diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/part/EntityVehicleSeat.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/part/EntityVehicleSeat.java index 24f728808..0c480a377 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/part/EntityVehicleSeat.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/part/EntityVehicleSeat.java @@ -110,6 +110,18 @@ protected void entityInit() @Override public void onUpdate() { + //Update seatInfo when not present + if(this.info==null&&!seatID.isEmpty()&&this.isRiding()) + { + Entity vehicle = this.getRidingEntity(); + if(vehicle instanceof IVehicleMultiPart) + { + this.info = ((IVehicleMultiPart)vehicle).getSeatInfo(seatID); + if(!world.isRemote) + updateEntityForEvent(SyncEvents.ENTITY_PASSENGER); + } + } + if(world.isRemote) { //Try to find seat info on client @@ -125,7 +137,8 @@ else if(info!=null) this.info.vehicle.sendServerUpdateForEvent(SyncEvents.ENTITY_VEHICLE_CONTROLS); } } - else if(this.ticksExisted > 20&&!this.isRiding()) + //Remove entity when data is invalid + else if(this.ticksExisted > 20&&(!this.isRiding()||seatID.isEmpty())) setDead(); super.onUpdate(); @@ -192,7 +205,7 @@ public void updatePassenger(@Nonnull Entity passenger) @Override public void dismountRidingEntity() { - this.setDead(); + super.dismountRidingEntity(); } @Override diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/propulsion/VehicleEngineBase.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/propulsion/VehicleEngineBase.java index dbce1c175..769d85f39 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/propulsion/VehicleEngineBase.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/propulsion/VehicleEngineBase.java @@ -6,6 +6,7 @@ import net.minecraftforge.common.util.INBTSerializable; import pl.pabilo8.immersiveintelligence.api.rotary.IRotaryEnergy; import pl.pabilo8.immersiveintelligence.api.rotary.RotaryStorage; +import pl.pabilo8.immersiveintelligence.common.entity.vehicle.EntityVehicleBase; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.IVehicleComponent; import pl.pabilo8.immersiveintelligence.common.util.entity.SyncedDurability; @@ -18,7 +19,8 @@ * @ii-approved 0.3.1 * @since 01.10.2025 */ -public abstract class VehicleEngineBase> implements IVehicleComponent, INBTSerializable, IRotaryEnergy +public abstract class VehicleEngineBase, V extends EntityVehicleBase> + implements IVehicleComponent, INBTSerializable, IRotaryEnergy { @Nullable protected SyncedDurability durability; @@ -26,6 +28,12 @@ public abstract class VehicleEngineBase> implemen protected int activeTicks, activationTicks = 40, animationTicks = 8; protected float acceleration = 0f; protected RotaryStorage rotaryStorage = new RotaryStorage(0, 0); + protected V vehicle; + + public VehicleEngineBase(V vehicle) + { + this.vehicle = vehicle; + } public boolean start() { diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/propulsion/VehicleEngineElectric.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/propulsion/VehicleEngineElectric.java index fea9d7e0b..72dd278d7 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/propulsion/VehicleEngineElectric.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/propulsion/VehicleEngineElectric.java @@ -1,12 +1,19 @@ package pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.propulsion; +import pl.pabilo8.immersiveintelligence.common.entity.vehicle.EntityVehicleBase; + /** * @author Pabilo8 (pabilo@iiteam.net) * @ii-approved 0.3.1 * @since 01.10.2025 */ -public class VehicleEngineElectric extends VehicleEngineBase +public class VehicleEngineElectric> extends VehicleEngineBase, V> { + public VehicleEngineElectric(V vehicle) + { + super(vehicle); + } + @Override protected boolean canBeStarted() { diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/propulsion/VehicleEngineFuelBased.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/propulsion/VehicleEngineFuelBased.java index f4ce21ac4..0b7c80f64 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/propulsion/VehicleEngineFuelBased.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/propulsion/VehicleEngineFuelBased.java @@ -1,34 +1,95 @@ package pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.propulsion; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import pl.pabilo8.immersiveintelligence.client.util.carversound.ConditionCompoundSound; +import pl.pabilo8.immersiveintelligence.common.entity.vehicle.EntityVehicleBase; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleFuelTank; +import pl.pabilo8.immersiveintelligence.common.util.sound.AdvancedSounds.MultiSound; /** * @author Pabilo8 (pabilo@iiteam.net) * @ii-approved 0.3.1 * @since 01.10.2025 */ -public class VehicleEngineFuelBased extends VehicleEngineBase +public class VehicleEngineFuelBased> extends VehicleEngineBase, V> { + protected int idleUsage = 4, maxUsage = 40; + protected int outputSpeed = 200, outputTorque = 50; protected VehicleFuelTank fuelTank; - public VehicleEngineFuelBased(VehicleFuelTank fuelTank) + @SideOnly(Side.CLIENT) + private ConditionCompoundSound> engineNoise; + protected MultiSound engineSound = null; + protected float pitchIdle = 0.95f, pitchMax = 1.25f; + + public VehicleEngineFuelBased(V vehicle, VehicleFuelTank fuelTank) { + super(vehicle); this.fuelTank = fuelTank; } + //--- Setters ---// + + public VehicleEngineFuelBased withFuelUsage(int idleUsage, int maxUsage) + { + this.idleUsage = idleUsage; + this.maxUsage = maxUsage; + return this; + } + + public VehicleEngineFuelBased withSpeedTorque(int outputSpeed, int outputTorque) + { + this.outputSpeed = outputSpeed; + this.outputTorque = outputTorque; + return this; + } + + public VehicleEngineFuelBased withEngineSound(MultiSound engineSound, float pitchIdle, float pitchMax) + { + this.engineSound = engineSound; + this.pitchIdle = pitchIdle; + this.pitchMax = pitchMax; + return this; + } + + //--- Update ---// + @Override protected boolean canBeStarted() { - //TODO: 02.12.2025 fuel condition - return true; + return fuelTank.getFuelPercentage() > 0; } @Override public void onUpdate() { super.onUpdate(); - float newSpeed = acceleration*200; - float newTorque = acceleration*50f; - this.rotaryStorage.grow(newSpeed, newTorque, 0.15f); + + //Play engine noise on client + if(vehicle.world.isRemote&&engineSound!=null&&isActive()) + { + if(engineNoise==null) + this.engineNoise = new ConditionCompoundSound<>(engineSound, vehicle.getPositionVector(), this, VehicleEngineBase::isActive); + this.engineNoise.setPosition(vehicle.getPositionVector()); + this.engineNoise.setVolume(2f); + this.engineNoise.setPitch(pitchIdle+(pitchMax-pitchIdle)*acceleration); + } + + if(isActive()) + { + FluidStack drained = fuelTank.drain((int)(idleUsage+acceleration*maxUsage), true); + if(drained==null) + { + //Out of fuel, stop the engine + this.active = this.nextState = false; + this.activeTicks = this.activationTicks = 0; + return; + } + this.rotaryStorage.grow(acceleration*outputSpeed, acceleration*outputTorque, 0.15f); + } + else + this.rotaryStorage.grow(0, 0, 0.15f); } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/propulsion/VehicleEngineManual.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/propulsion/VehicleEngineManual.java index f21ad998d..3ed3dc67f 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/propulsion/VehicleEngineManual.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/propulsion/VehicleEngineManual.java @@ -1,12 +1,19 @@ package pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.propulsion; +import pl.pabilo8.immersiveintelligence.common.entity.vehicle.EntityVehicleBase; + /** * @author Pabilo8 (pabilo@iiteam.net) * @ii-approved 0.3.1 * @since 01.10.2025 */ -public class VehicleEngineManual extends VehicleEngineBase +public class VehicleEngineManual> extends VehicleEngineBase, V> { + public VehicleEngineManual(V vehicle) + { + super(vehicle); + } + @Override protected boolean canBeStarted() { diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/propulsion/VehicleEngineSteam.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/propulsion/VehicleEngineSteam.java index 3a1580cea..2bdc29150 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/propulsion/VehicleEngineSteam.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/propulsion/VehicleEngineSteam.java @@ -1,12 +1,19 @@ package pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.propulsion; +import pl.pabilo8.immersiveintelligence.common.entity.vehicle.EntityVehicleBase; + /** * @author Pabilo8 (pabilo@iiteam.net) * @ii-approved 0.3.1 * @since 01.10.2025 */ -public class VehicleEngineSteam extends VehicleEngineBase +public class VehicleEngineSteam> extends VehicleEngineBase, V> { + public VehicleEngineSteam(V vehicle) + { + super(vehicle); + } + @Override protected boolean canBeStarted() { diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/propulsion/VehicleTransmission.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/propulsion/VehicleTransmission.java index b7caeac94..2795ddb36 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/propulsion/VehicleTransmission.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/propulsion/VehicleTransmission.java @@ -23,7 +23,7 @@ * @ii-approved 0.3.1 * @since 01.10.2025 */ -public class VehicleTransmission> implements IVehicleComponent, INBTSerializable, IRotaryEnergy +public class VehicleTransmission> implements IVehicleComponent, INBTSerializable, IRotaryEnergy { @Nonnull protected final IRotaryEnergy[] sources; @@ -48,19 +48,19 @@ public VehicleTransmission(IRotaryEnergy source) this.sources = new IRotaryEnergy[]{source}; } - public VehicleTransmission withReceivers(@Nonnull IRotaryEnergy... receivers) + public VehicleTransmission withReceivers(@Nonnull IRotaryEnergy... receivers) { this.receivers = receivers; return this; } - public VehicleTransmission withDurability(SyncedDurability durability) + public VehicleTransmission withDurability(SyncedDurability durability) { this.durability = durability; return this; } - public VehicleTransmission withRatios(int shiftTime, double... ratios) + public VehicleTransmission withRatios(int shiftTime, double... ratios) { this.ratios = ratios; this.maxGearShiftTime = shiftTime; @@ -69,7 +69,7 @@ public VehicleTransmission withRatios(int shiftTime, double... ratios) return this; } - public VehicleTransmission withCurrentGear(int currentGear) + public VehicleTransmission withCurrentGear(int currentGear) { this.nextGear = this.currentGear = MathHelper.clamp(currentGear, 0, ratios.length-1); return this; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/entity/ISyncNBTEntity.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/entity/ISyncNBTEntity.java index 86ae34205..277fce3d9 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/entity/ISyncNBTEntity.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/entity/ISyncNBTEntity.java @@ -1,8 +1,11 @@ package pl.pabilo8.immersiveintelligence.common.util.entity; +import io.netty.buffer.ByteBuf; import net.minecraft.entity.Entity; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.math.Vec3d; +import net.minecraftforge.fml.common.network.ByteBufUtils; +import net.minecraftforge.fml.common.registry.IEntityAdditionalSpawnData; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import pl.pabilo8.immersiveintelligence.common.network.IIPacketHandler; @@ -15,7 +18,7 @@ * @author Pabilo8 (pabilo@iiteam.net) * @since 23.12.2022 */ -public interface ISyncNBTEntity> +public interface ISyncNBTEntity> extends IEntityAdditionalSpawnData { @SuppressWarnings({"unchecked"}) default void receiveNBTMessageServer(NBTTagCompound nbt) @@ -114,4 +117,28 @@ default void receivePositionMotionUpdate(NBTTagCompound nbt) tis.rotationYaw = tis.prevRotationYaw = enbt.getFloat("rotationYaw"); tis.rotationPitch = tis.prevRotationPitch = enbt.getFloat("rotationPitch"); } + + @Override + default void writeSpawnData(ByteBuf buffer) + { + NBTTagCompound tag = new NBTTagCompound(); + writeEntityToNBT(tag); + ByteBufUtils.writeTag(buffer, tag); + } + + @Override + default void readSpawnData(ByteBuf additionalData) + { + NBTTagCompound tag = ByteBufUtils.readTag(additionalData); + if(tag!=null) + { + readEntityFromNBT(tag); + doPostWorldLoadSetup(tag); + } + } + + default void doPostWorldLoadSetup(NBTTagCompound tag) + { + + } } diff --git a/src/main/resources/assets/immersiveintelligence/lang/en_us.lang b/src/main/resources/assets/immersiveintelligence/lang/en_us.lang index 0bf8a3705..eb9547ac4 100644 --- a/src/main/resources/assets/immersiveintelligence/lang/en_us.lang +++ b/src/main/resources/assets/immersiveintelligence/lang/en_us.lang @@ -914,9 +914,11 @@ subtitle.immersiveintelligence.bullet_flyby=Bullet Flying subtitle.immersiveintelligence.bullet_impact=Projectile Impact subtitle.immersiveintelligence.bullet_ricochet=Projectile Ricochets Off -subtitle.immersiveintelligence.motorbike_start=Starting a Motorbike -subtitle.immersiveintelligence.motorbike_engine=Motorbike Engine Noise -subtitle.immersiveintelligence.motorbike_horn=Motorbike Horn +subtitle.immersiveintelligence.light_engine_start=Light Vehicle Starting +subtitle.immersiveintelligence.light_engine=Light Vehicle Engine Noise +subtitle.immersiveintelligence.vehicle_horn=Vehicle Horn + +subtitle.immersiveintelligence.drone_propeller=Propellers Rotating subtitle.immersiveintelligence.fuel_station=Fuel pumping subtitle.immersiveintelligence.welding=Welding diff --git a/src/main/resources/assets/immersiveintelligence/particles/vehicle/exhaust_light.fx.amt b/src/main/resources/assets/immersiveintelligence/particles/vehicle/exhaust_light.fx.amt new file mode 100644 index 000000000..059e98eec --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/particles/vehicle/exhaust_light.fx.amt @@ -0,0 +1,13 @@ +{ + "type": "ParticleVanilla", + "textures": ["immersiveintelligence:particle/smoke/smoke"], + "max_lifetime": 35, + "draw_stage": "custom_smoke_noise_shader", + "aabb": 0.3, + "color": "2a2a2a", + "programs": [ + "smoke_transition", + "gravity(1.0,-0.005)" + ], + "size": 0.385 +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/sounds/vehicle/drone/drone_propeller.ogg b/src/main/resources/assets/immersiveintelligence/sounds/vehicle/drone/drone_propeller.ogg new file mode 100644 index 0000000000000000000000000000000000000000..e0b00fc5f9c39e6f0978b9b16588c781175c6a97 GIT binary patch literal 323893 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�*0mtTYWj%_ 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

i(u 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


`7a^E7aT%qW*-qoYQOaesKvobE^F#hn4KF+ zH`>JtaIhjWj7oK3Odb=o1#-9PSATsw_$9>n(8_)lF4CmMv zi;}kr{+uRVS^PTfx`7D}&}CcCcUs#L6F@MdWnTz#%bED7HMeFuP4 z@!a`oTzF=R?agn0_7mTJ^=cSIG2kQK{HRVqKZBqqt4M(YLhCHC(6xrST(wyI=E^V@ z1hgy#1z=xRnk?Aa;Yzy;J$IY41}u^0COF&<%r|w45v~2l7P^?z{4DD{>O}xxcf_9G z7&SpX(cc}jPW&DnZ(<)kBg;A5y+5^l$_800i9-Xjkl{M(qO5dj!qpUhp*kV>Xjnt%Hq1 zs2rLW#B-&_0ENQ| z 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⪙;yU7i`?s@(^^ho-G)0N@wgb9LWaQ8ghb~UHWG7$N069NlC~h_M5@0G9LwwyCr&X@+lf3N05H>gPr ziAg2;@mZ2jldFL_N<~_bA})rRu(k$$LUGc(^=2ar6f^uu#^X)uqD2Wk zxH!#iJAY5;G8C)=IWCuet(X=34>NG+>O!@7D}>sITRU_=O<)wOl@KAUuaz^yKHbn) zTkKO_P_U_x{#G1>8>DBewXU*f#gOM8GS&rORTHqGyV{!2v-*d5gw9e_1{IYvUZ>4t zy8UtRXkmsu*8jznmpvgZ`_t%2=bN!U>6#MSu2-@(5*W$lkkF`8&Kmi)l)ZHMG7abr zEXIV#X7EbA-BQOnt3D^oMvF@BV1@f_ z^3>nly*V@$H2V3|hsOd4gO`{U8zJGvMwmyrmkP^X)I#|>GwtCrSgwr~Nqh^8oM4Zo zimBB3`&=qNo=46Xk~W#lFJ>eBxXuW0X&jGNGrQDSw44O}2Z5rm5e4*wm#R7RB3OF1 zBVwv(Q-_K<>jI!z2A@iuyB`J26NoZcaTMH9@!g8;CKYoYqee1RfOmp!p-mVZ9|AZU zW*~801Ydy=G6@h{tvu!|O3qT4T=4@c%$*DU5?QqoEO-Od&7*wR#q^A^u9s4rM#U*3 zq{$FPCBbw>>+p*M3=k{1tw`K3EEZ*O&WnO}P74L0ya3l01_W~*9Sz`{A_?e!eJO~; z6x0rzSiz0gnIP$B+F)SzIp`WJ^h+@+SX3~psklYE9ql5hok6~sHlNy#@l#8v_$#~{ zPB!2i5>#R}4E_wdOtt-tDR>{A$3D2fh2z!0`GDaTJF)kUWLDRg_Q)dRkP-yxCF$uA zc!4})D6LB#Nu4Jdlv_x*!~m#8ut*j{Bn5zXdmU)2!Z6I>9+vfnP-!Wj=0GFkOdO;; zXMI@8i{x)mO>|^P>AZsy31y1-qtQewu!0Y-Q|USs5Ylk#!LUv8%(PP_Bl>hSw?KzU z$}v4ul$AM%Psa>Y6LFz1d;BPd_T?6^7CU-}NXZa&KY^qbDsPV6c|tc=U1Fr2rcq<{ zuqM^UQsAF#(xEG*;M__ z&RttBmi%JZDDUo$Xzi(?G&s1{_NtbJo^#0QROU>yH{J9N5>8b26%MaeLYs=JCt~T1 zOyjZI3`2437SnOPy<@d1DT5uOnb5DQuzYtE&6JXdoefSvh$h{&c`jA3Ridy4q($qN zP)BRYupUm*4^-Iu_^h}C8LD;Q1zj@PJOcsP=!r3&33~J}9uRgJqc!E&B2f-^&;|o8 zkZf9bA^29ZLr!JElL(MvgZzKnHULLJ?IroLHR7w%^DjA(kEeABw1`^c4lHGQrzt6aXLn3krfC8Apd?9M+1 z!0QGxIh;8HrXyB5!^C61rlKpjP%!bpQN?RInx2ps)Lz>#qbLp2fv0|Bp_`0rTMi{?9z7b6156ZGhz$v8aQG3ZuaNS>gW>8Tepm)O@_1&t1l-NRDLXsmCDk7tCyfqLC?M&H>jEHa)|hbUfH`TsNzDy-ycS zm*@zg!NjF9X*fVZC{V4GP-HE0BoGZCd=S}ur#f+{eDqGYi9|1n#ryA|34XDeD=5q$ zI%#QFk5?gOkHycduOV;S1@k*LhgD+rZ<%VxFDmRKI@fO?>N|CTUGv=NXM_iRsZ}fP zwxwM9G2&?4xT`NoBJMMycWb#J&^baT%}s5PiocLoZ_;O?sgyL z09C<@isz+Q*3_^jWsAQARrMcsiT}pnI}fiMs$;(g*XH&oW#q4Zb@js!W~OI+)BcZU zF8QyHySyJvk$D%Q3sKtX?g(5LfEY3WO2^1I11iu!gmyED{xC{TPoHc4{$&ZFfMl^{_rZ5<1Bl9fH=}WmD=rBfBJkqHxL%%)$+?*hkWN@GZQ4Th-9$hx+jAhA1h* zYmf~efyW=o;9-{Vx(~8cjYnx;$w0yBeKO=!k)pcF*g83ZynU4!+n1FsTiv%~5&42o zvHZPlP2Vu;K5?RA@U&)|WW~2SBybRv?g%Q z=e&QsUeDK_NN>YSt^nE^^x>6^E%ue+)oGKdFZn^;8X~u0WOeVnCIv}LC=VGEq+rGe zVV3YMq@Hg>!pnK%ZQIhhIh=UJ?oc&Ba4AH&z?8C*f#LO~VCs1QN{}1fxR@X-O`l>@S)-92n{?-SYIa{!|3xg z_Ao&23j%`^M1jy>t4sN-hp=Dp>w{rUxmJ5r9jtdJ7u1l0pb0rNTZlp8$DxBSY1CC| zq>+o6{Am3LU<0(-2H72uF#zGTg7rur6YVrGTwfrNhv;mVNM#n7J!|l;F6b`_@~&*d zVqYJCaF+fLU<^egCJoC0EOMFaLqW`1FOwNdJv3>pc zqs3gd2~95^VZmmBFY9Pc5HCEfT#s}dC;fJA70%Q^>|FPpM}j* z1!Jjqbb5zU-^|3+5wm|kqac?SP(HA=u{U5S1d_l?jkK`#6`q?6(nuTuJEgNrBjfRe zy=ak=9ZhlQE!V@sUWrnE@O64?Uj94Df+2=K3KtB{&g z(240}%H`UW=q)A)pjVtu|J^_7pWt3RYhz|AKTfhWpO4LvfR{|hyXHrbdC-7MdOJ~A zv0cB%iHqMe!LX{wjLK5}Na#0B#^<@=?T8ccJi8 zr#>({&s;X^!h2)4z*KNo{Y8$yp!VR^eY$`Cb;I^53(|9Gu3y7i4@MeK2)$ zQ-e` z>$x~D-BZn^RHdmyNa44_@z@!%YasVdLQU`Otb>CGf|c%Lg9SPJPq3>l&x<1NVCeYQD@1;O9BIM0;wFBU;>eT>}PsyW6B^Nah0F6-qcMR&&kxMQf~Bqdvh_=PeCj zl(>YXvw-rIcY{EMA`Br^130M!a;YpbFT^?#XBWu@zEI~pvWtYc9oPBzE-JoFE(fnI zi-Z9R|Ez;l2^&|@Ng6e^rYwsF|A#wt(xw@^=u1)2m8d-J+dG0pgGx4QZ z9Uotl#CWBVp&R^Q{taitB`7QeOZPoOd1MqVSGNz;uu@Ve_1pxw=PfLftO?IOTWa}= z2_KW}>VgqKSdTzntp={2uh6$X7{7^SiAj7`0Oj?yWSunJETi2NUuee*r+#s>bFj|z zFt+Ds6_#YkBq6VN9XGZ=(y^J}A5KhE|N63!UVd@^a&n?qBQmEh+z;r7&I3ZPEl+sO0#b27?rIEimH66zVOWgkyz~8R=kpPevA4N}T*P z9-|it<9H_qx*w0wrm8|W@K72WT5IQ%OXLSY(tVigIBp-79wXc+;$mU6ljVffc@AZE z9Jt-0kD*7t&Q7?k(tsXGUT9#w%k=1J*e4n!!N1hr@?D4C+IlM`P3a&2H% zulZ2BQ@w9#p-KGYF<2lc^?^w!L?JJ(Ci)B{BEBQvjLD8p(M&bkW!aHGSma`xL8637 zM?4B4Brs;U9!83q^~70+0v3hQu}FdgflxD4Pt9Bl;&@MZ1epFsd~Td&Zk$Z9qDnH4 zi7|KFSC$}-O6IqTe0I*>Sl`>PPAC770>ZMNyg{BWXfX1lKl`6IFC7{!)mgzEJ@ zl$}b(&IkWvqR?Qrh>?=L+PBqFv;uMt?P)z{~x>} zjC{0z_uzmgrnhlNF?e4$^fUtf;|VBU_I?{7lwAQ?lao4Y-I~9 zks*1n5@qbb;@51FGdD(zbsE_Vb&qyZplNALI`^Y0+N1S@-E(*Pe*D70z8Al_{Hnx+8xYf64XFE%0m0@2?`BqIjb3adpCO=E8Oj?`j<@lZFGNC^MSqgBp6Vtt|l7j zCLgNL^~R#3XRxsqzXQKo;2qU(@~&*IGBlXI+NOcyv`yL(b!b!|>_%izl? z?MB6I_#6RHr>AY?^2qvELf1TroWRaHU3S=z<=Kw2vuxKvoQJQWNPK-jC^0Q2G^o>Q zk#X?vNX1}_!{PP|{c6AiLjKB6nCBf*2fl8|pQ?Rr)O&ITH?QXUj6ZEYB*c0MA$82( z?^enoMPbL`VR+gh?2*&omYv>NFPD?us>+*c&E+g%is8DXNynAXra1HL zPcL+2TM4~lYA9$l)Tt>oS4bMN-1Zf2uCtL}k(D`JDcNh>ehP(WFC7NLAL!&Ma_S8n zgS=mqN>$6C8qgy1XmUsABlib_1X_{!Av-JU(J&4qfsmzr90OVz@{`vcBkLR*>kq$4 z!nB{y$>yHydt%*m)iLW)f5@&?e2JS+%t)KH=RaWqO)oqV3+(&Sy!tUSXpk_@n)kmp=9MsdM!4)OOiayFCp_}c9hGsfG+{6+!Qh& zl9Uhu(OYV;(pv`XYoz2223zsrn~&IZ3Uh&>WTgubOLyj#tl*0<7yXGDU1zI{BNx^G zlx~&AoyMATPXEK6YtCt7dhy==b7^xkdn@A4$ISkUirI4gus(KcMnC1fYd&ti0_-B9 z*XfJ3nDP}{lf9$fQ9vTAo>*20B9|1HETURa4fidELp*+9P)J#atp}wNx=J$7fC3}j zZb5*b!~+oy1(qS(D!G;-Cakr^a|q&)b)h^N{ZQ#9h=<%XIvHD(AqPykX3tMne!eoq zyb*zs*uMw98_ef_uE(NL(F8cE<^RT+a!%u-i{-z+YF1IN`A)V^Xj)ObV*;`aA)wlL z+^laj&Ekd>Nz!XP)2!b3L4|$b>{+(LlHs{X6gzT`kg^bnN12BeKJ|cB00nL)IoBDT zgO)e}^sa3HyTEoZ$>5!l96%r=Gz88ePBcXA3?p>U5iyQX20CdIR#Lz-5g*|(|7&)E zFeq^C{@3i{d+>T<^E;b-Zui|<^1uEscY@$Ko03CY;H=6pR58G>U!P;~;iuhY)ei+9gd+XNdBtNq zDl$Tv2v>K&0|bA(`fk398GU7gV*kE(?3ia|%a-l(y|4$=NAhxeVl!1WvD#?>i%fY_ zdm7T6D#pCowaIS8O}yI4Ax^@q?-OReD&UXJya8x*^TT_VlzFH^7x$;XEJ;gxYhV~w zA0~{A5FvyekMSW$!69XL@X1_SCYcS6Rb#F-3cBRC9P=#1l@StB4sdr!9t>k7Yo;mK z#=dR<6_B&R<&Y3GhkQ&TWM`3ZpL+aMIq)vLf}1HngN-eJ<*Ut5DK0EaMj zmuIH+7+=%py8W$^Xl?Gk7zn7D`)aBJU&EcMip$Lr4IXShn7c$xNk0Z@{SH@HO*tA9{iNCv%a%yJqSjF>qb6+&J<6@n<*r;gA5it28}X`k|-D|cFqB< zC;-ZnFa{u9c>rfKQHS)o`$>v4RVrN>_ajL6IonU)NL6K~e%!a;fec>GrQEI_m)tAg zdzRFYbKBkYC1Ng0nrwI-1AM=z6?(edRpP@bb)~vy+Nb!<<;#O~0XFaC^p@JQmhf~?xE56I za)z0_T-u0`d>^sPs5qI7;;14*;fCO(lp$hLmchv2#4+2!2|(rc%OXsumw>&bETwYe z$EYwtkU&I$6jnk+T$EeNAG>&|>!3HH^om80e> z6OWF(wDh7Bx5xYrtA23tkuc$dBNGl^KuCT1oRw#Ua3=oGVe54=yMxgPf= zEdC^cfyekMHxvCFc~!$}{!OOUZC5#rodI8ip}yk+rFFJP7YC3DkzHM|_O!BoGc0KZCJEYODntNMz#jgz)V2ItCF5KuQgj=V0p&^}ZknIegH^>U&kdCbj} zlx|cBT`aXH9!OOgkhGhEQRBl@!ZnA;n-~^}tanURR$A&?tfG>HA(-FTu2a~2*siim zB0Op?#I;i4DR#UVg%ymraAbD~`v#~JkU6+SWZ0)2x`<|@Zb?5? zU^VKut{7jN)t`j3T_WZtrS2=5z9;mmKn((Ym~%Bz-Glp#j{S_zzPsJ&9ufVsNhPU` z-BF}L!}k+F<($Ze(_N;_wT>`Bgv|(zpwEr{vdB}^S@aa51HJ&$84{9aSi;Dl<2rIo z0F!A}iGj^vu(l@%%N}6`yQJYMS*qVlOF@vSH$;SO^oht2tHJn;gL_CPojt^rYM;it zvcOa@Frepbbr=6UE%jWkDZ`{c7>Gi<(pm>PL;v5X=i5`cxi>%_R&z~NZ~bj|Knc;O z?CNs4jjB-Ywu})M5q4Ks0Ja-)pM$4l4Hw7v)8bu^G`-n1MMr6}$%*dR?Om!ajR06kJ{L57`@p-dJ)l`07X6QO%p@ z{0G<{hB*5sO|yubcFO69%dbeC92Ii%mzC7{TE@!-EBde!y7gH|%>&Iys#>v0`@^8q z;q)6*71*R+y>XvntJm@uPKtKQWXe;#wwLjPs^VlbReD4aB?qI@ziL9_-(^PF@DPCd*?3xiUrgb~5f z)O(hvwh!(ZkG=8T<8?*$Zk||HVadoC%^Klf${ZOT4==%!+sW(}a!zHeNpP912|3m7 z0C7T8K}DGu!N3|S zW@bEKShgPkesjb^qS(P-3|jsS@mUn18N^f@ocK&E6W-zSZs9Qmp@AyHf~eCkgiu^v zSS(18$-rLTFF^={7~LGsP*SsGZM$q4AgQ2%RXzk33=&>Km_qFmft-5423Rl?P@uLg zkkS+j?MxWvZZBT!wt&o=A~r2z{XW^@zC87qMy#1Y#i_8HA7QZpu}AI3sV8|4sc{mY zqtcLdviR`r2ARf9+q*jNjb)B#F`7aY%tDKjk?d(o4&`<>{AV#rRzgyP?xDi}>h$~H z3a4Uwj_9U6@o(r(GFekU&*b5ZGnu;&!I0!R#_ROS{_9EmPrUyh%&d(Wr#8O(`18bA z%`AD}#zgPvc+Kp2FF@*;VPTCXf4Ww;1RVW=6-E`n>T1+g;zM;Ll3dRbx%Wf@=%b;3O55qq+aGCvA$SrH-OJsgWy7`mUy?(MgHBM%DM z^itd_^mO0c zer_43n^@efY0e@^TdrD$Ec9V^OXeI>61p#LL&GcsgHvQ=ze0ruv{)=Y+1`%bces|& zfw}RU4gSv_H@4`CuqrEssr>pK$|gde4TAui+_A*1nFAZ7({f>iwT1RCGUk z@AU_t;kEM%oUw1^g1t0*gYNv8sv@|$DWb+EAAyZ~pDsc+N*Lit)de88@6&zq$T!sM zZEy4Y8ln%A?LQ(L+}|Ly;;*DQWl6)j-<{xafWADQSRgqdlj1O{Ecx(pOAC(CwZK+uy7A%v(hH-6U7_IFHtHbsPDM zDknQ)xlvoZ_8w&44smLZJ~5{TWo}OV((6G}>Lt50e@59zn$$nxKw3!>1Xx`^q+9Bq za6VcN6xKE3T~DqLIp_rhtDha6W7;SvIRy;M<+Al*goGcKf#R`;fU_ozc^H;ypflg5 zRN5Cw(n}=DX(+=l9`s8w(W{IG=q~llNshgl`<|LOo#iHH@CvwR0EI|r|yC+dgw}yn{L>C zGEitZ0jdHs1zGvBRwetfDEF;C+koXPzT1{LLS)GUNEby+>POQg=myNdwHCqo3&e(Q z{P5zA5`znG0`Uve;n;3>9p@<#2nsu9a_Nqo(CycaO^!W&Y}}s&)mzIO);;LhXT;HQ z^QG*zPVu{2Zx{Q&ZCxGmUa0L~H)98FF_AY#6F-0GiavL|u+Zm!qy%nTRaw#U>u$f$ zJ{@f_orr`2k#FvIH~3bD4$02H|8vP!17t|t=j}?!Oe(jPG+@&BHPnT)qwN;p-)-Qx zaXB=yTp$=>I_JcZ?(LOSN9A?FnQ<~6RS3!8xDPo5r2~d)RILFOHIik0^=#jND<#tY zZ`$yE`1l>f+OE`Vzkc`1ufo@!j~bNE|H$)APye!IfY*91=RgDfwd@4b&(F!vdIR4~ zRWn5^4J)Ij$ve}K++4uf$le)Q0RKulzB19OqK+|oR^h?{Ds=QuS{IZRes7E&?R9fr zQ5~(graxG>kj3fgwsMk}ar3UTkXB-Vql*>}fjEM!jD(m@z``W=AiFj{m;cihh}Fm? z8JG?}nN`0iZCYEjNQxuPdUCtWhC13C@@O6+gIcW2KGLE*sL`MLyOTQp_c|Khiq^du(S}r(~TCtiyO-_$LmRtojOySycd#pG~vejvX z*uhWpg1!b{dtJrGjk{`&iYpYYSx2pRoekHs%slTW#l35#!Mrvbt)$X6&m2X`M&7Qo zj``<^23N*9$#z|)H(6{U&{mR|PB}{I>3Rx@SK&1cN|;ET@ERX}X^?nZei37+#cmh& zMTpr?DdGKX@1DuAQ-6Q=ztYaUY*OVXi0#e)e%-r)d8X{_ulV+y+DPrut$?HZN1Mk} zO;Rj_^h7sr_JJ{0T{X)xzcU%dBoS*$Pic;*!0VsDVNCqV>$7QI%b9k!d3ENhg#k*< z>S~jy93peukf$h&t#BA(kLg7=2Rkw4DZa~IYBQ1{fZ~nPYr?&v$MxjB$>Okiis%^_U|jeVGZKh#ZX1_vl= zAgC!Ye^Y+dMp*d7F}utnrH=APBBnI)fk;9MfN{n%ly<}hyn$v78!rFB%hKd`9+`1j zPS5?O^KaWpGZg)oBFG20t?+9`Jdoe0*bPuJNb^oDxz_N~JLz_nW{XdMl<``3%)Fvf zF0}2fQr;}WDuB^hCAs{lyl>u zhE?Nu!|bZ6v9hs3-4iXoI=gB#ftmv1*iC@0tGggg?NOA5yNAptG|I5^w~Bw^k4Fy3 zN@d+qBbM7MQ$n$8$uwy!*Vl~%4;&dvi-DWGur8tIHp!GS{CP!AW?JA0Iobv?T?tO@ z!<(rC3j&|O3(9&#rX*XTCa9SZBvmzh%R-PDI~!T}^_J4OvORSQI&%NFspHo1E$=s6 zIyt=>^QfvyGvALb1QZfMVwx_fYMeGXV%mMm=;y^>YL+xLVy(I-t@V<9Kk)3_e$z|C zD^AACo{4#=hhHRrk4q1;z2EYW>8N(HG)&gsI$|! z%Su5p3J)bQH%FNo8uY#jnhQZYq06`N(>?WBh^ab|}!tBbVdge3wAtwc05kZ_SJa;=D9eH7L?Dt7Ms-#4} z&p3-k0(3L3KN=CMeurR7nyQ`#pTTD_8cgvX@B2A^&TJLr(PvqVvzBSoB_HW8B5y;~ z97THEoD^Wb`CEA+^NWfL`lBMR5v+M8Hx2%iFmaV!qHSCj$Az^Tg?1{rc5>4aVW-ru zB$cGrB&ALQlE7`3u5v4~dn=#VCq8nbwFsrB1Lz-BRYkxx(Yi8yI43wU>TQp`nB^%j zJ7ONfU0-#=yb==wP{dsTsZ}pc*`tAte*F(Cg1V|i;Lkw>YO3Vu6Ky`G{P{hf-IB7j zz6Pp7r_rg3ODr(Q)l<1gTZ0oib-#Y_;pHKQS!o?&GLr3_l8Ou7zma$Yku zjpPRrDUl%{C!;b~GhzorH$R&o!@thpkqJ%-DCU@?wJPA!XRkYuVdN_%!wL``Yep^Ws-N`tF`dfI8Z!4ro=YU?;*6+Cp5Uw4pjcb=6h z$~u=P+O$+AL!OHzWqT%XWjxd6zk4%r|KG|;ua#RpbQ+E%^!23=iBeKJ!p?F-(iM76 z>fdy4&Nyquj?r?!)-l9^s7{pi+t7D`p z!M_DWzDR=_B%-vHz(%{-~G0<&%hDc?1LYVPn4oL7wzMl zOZV$eEsu4zoJgx}z{uIjJf2>=lPcOOUxP;gwa45Q(h(mD*-p_%>)WszPaeIXrv2k*zWq^6N^}N}7hq5*B1{VDqtD!&`Ql|$NB0V#b8s^_Zp7j#_j_*rvT4M$ z;^t^ox@oV`ebp4iUUnERIe|T{T8;$P9zL{0Z%yn!n*5&0;)oLFY{IMu<;RR(4S(_X zTEQGDyr_-hnM;RW>sv5oS+!lsOOcZo5AB4?RA8L`D5vNlA0IMKwmueHSD3)}d1(wH#CjVGGhwghD&pS&fOr@2<4nyRhAMhA^*WeG_f(JYyV{=nbRRV&l8m^CBR zWdXWbVat>)<_I+?B?Uux>5%;Xax zNO{O4m^PUdNeLo7a_~ax$=HATHWTMzJSF4FsUWaZSWrIIqT-<{K1c_fVerKxoTeuH z`8lQ81_nGTP|1owz9jBy59M8pHg!}+w zM>e3B>O=Up2aD|~*~$eA<(L6=K!7oI*a0L|m$YQvbsV6G5}th#fiuToDwNAEk-KxK zXGR9JytEck3P1hyjRTq^4zeKYp_b+`6qcz39;P7fRzeodB_$}pT$A1(rm&DNsNBBo zJZsTteb$9J!8ta~Q|0)2sr1dS|K%h9;2ULQw{Br_@#MP$U&lI^Wn{)}W;#Q~PgM@7 zk&d!<`;kY4{7BtKGLQPK;)vm9#lsh+lE?LzUc7$vrD28f$452svziQe7jSdAJ4jpk)(p9T zxM6W1?NYG$l7T{}SRdYgquV$z7t$I`=?j9??Ghl>%G%szypP9;!nl5|=tBA9$K}M! zf)gh?J(HOy39y2?th}MLZNfGQ-FoEE;>eon7gGfXgVtE`&ML_J%ZD{$RCDcalW9e< z=|W*}2Z-!N9Ljkx<7AnnQfyLJ(I4k4D>nMOVbHS*-fEL z^N0<@6UqQE9LUwDsL%DK)>m&7zrM`NJ;8o7dd^DGRo4qkew_iDLmO4IJ zQM4HK7l!PQ43v$@-m%O`0M5W1vs9my|FW_%CfoPs@8~H@6R`;rVMkjp-2JB9o$PBM zl~{|OKSzt0cp8OlP_t@KItAo57^E&FyAZtTz+#`2w9V4-R8NpG0n(o4V760A)*}7e zi;LJ0$F?dyxBj*(Z=N;O`u%rE$C^05LEF|`|%lHH-vg0 z%pkymb)Aw!f?!iI_6kqNY%jGTBx1cPmqV%N@3LN3=&2pqp*HeaivegdQ8|duU$K3K zVo?8}9U&>Ta|elXqZ=Yd4*8?8RD;LTq5nN^XAq)A=HaX5N%K zo8}aLswk_hP$?DV@-ju7@`0Y^KQD$h&Inhz98I#zZ2*>u`IGD}^Q3Qm&0vY|5&;>vfCFlU8^LXzF}p(vVDSVgE57m) zEOxUzkh9$G=ww=oBmhT3Iw}tmYNp^q`9+DajV;%3>3w||x%ozdBP_cyWOr@+hh1;L zuj37Hl9Bt{UsbjK_{_gZU*WoBys$4Q%0*RXWHOVr}vrNu9)vL>9irwKc*Mkq&PmEZ7s^2ZV-RgFe zy*^{QH!f9|A6TK=KS+fruFIMqXt_>fA`e(0@B5%)F${U^gcE*L@F5_ZDfnhl(CKR* z^{Of$(kcs{>V9ADk_S>H8)}}cMW6>U5}+?K!nW$V*=ICKl8V?`?om##ZuxcTi9ntD zuMz-r1@%YSl&VJk*5p=2YRWbD!sUJHc{Vmn_l~V5O}01Gzt%M!H?LLvPFB=dRi&-a zq@?Zx2|ww>4!@C3paf^hLk3v+YxT~6I5oT1e)kVB)*$>MjwCu$RV6ui&TfQN{;E>l z`HJW&13htX@%B`3dNKa z3K(@Ty;Z5&3Q+0VZw`E?b}CO5AsDrFRg;_IC-1%pmrD-xgsB=5vf;JcS3djK{#Sq3 zLEGPYp&^(qg0MQDuXn^_cc#Nn>ik^|ba&MJC!FINiAoinS=mZ=7hD6OYm~jDndd5> z6igx_H|JW^e7q%)=(p=M7%qD%c17=La)Iv2{7PzKm2abVnM#k8`5Y4g*dNtvc2Vy? z1!MhvF|y%4_*r{pybu&2>pV6Mq}|5*?Dd|401aFKWSPO0Q385i)PUj+%RFF5da_MHhig07 zd!Zr4OK8I+jE5YCGD!|2y#>t3rS+^eGp*O>z(U=G$Tb9M0TztAEf`A1aqwj4sw4Fv z*P)$?7xyD@?}jm8#IO>;Odu`}CG=soFqwGE!UsNDt_4Q8peRL2{o5Jf;3lx$p|ybC z4Wpq!OH=`f5oSa5}YhD-uA(dDGb(7YDbag5stH|veD|&fwHlhQso## zSe*=y+;$K1#fPL z$y2YsT$dV2Ka-F?z4>onFKx-o*9wQM;Yb9jJ$Gw!$AvvI!=XKgX098)NM*V|{Sjyt zYQbjl+GK5`dgsUQtTaf1CdrrPl?jX6BxyXlOstqz7iYD?D^uPP>7a`4Z5Xo0ZA_V0 zMx~%$7QymH4V=HNwLP)$>%sFTY(D1~oXJ#%gi%wGSX;F*;%twT#Jwp|M)IDpAyB+V zwQPzyqu|nQHMu$pp+q%A#Z!8f>PhRhn&zgamdDG7-Wx?~0al+UK04*`in6ktvE)A% zO>rPpPgk`BdfH1;i07-QX{_abM>5T+B1J-ChPYy*LZVVu{J2M#M2VW6#xak*u1HLc zGj!Lf0}!=4zrLKs$)ECA>a^3Ij~+i1dJN4by$(KSt|=@dNxqJwq^9N{Ez&BB#A>x< ztLfI5*GD2aLBj5)_j*arm571M=yB?DtrH?WJ755dN5Glh5x2#wQui1Ps7arS)l}4k z3eA`LV(TFBt6 z&^3`plrWF+$>@?s^UounWHya4i<7uARvP)WjLd`5;oUT zG86{MT!^d+F}q33Z8Qf&pOrwm5-}UQZVw74T!~pF#6f# zlonc_qjL0idl7}!nM|eNYEUnLSb?Gd1Znnq6~m??IXj`cEK0~KswUwK`suL2Fi_63 z-Vl^oZ^&fvS!XK4f=x>~3c&VGC3M3M9F&hHf#R#)lxv)=+p ze$V%7^AQSs~Vgk z@`jWb&y!U~P)LEf(FgK3I%T`iL5Ex&*LIW30U>ls7X`d@VlWzrV8=x(^?$6ajy*P# z$8Q=rZ@8buZvF6#`q=mj`qN3b7X&45wC8`yJNoRy+%pIFn!3_W@mKe$1E~s#G7Ho^ zIpWd?wWFm659PcdR?lKPryU|&gKEm0qDzJO?j3c_^2|K@)r3zynU{E@R1pggBfDUk z(cQ*KE()O5@ckxnzsu>Oo$@?j&qN+9=S7y=(0GI_mNIyA;3F8^$mGq+c+!H@2YKS^hNl{LC2aunQOP{{FU8o)GPs|v9^`qM~Fs2O*Xdon_ zD#awR>FaoeJpjoy9W0I8B7=|LWdZ|p)*49k6M5v&Je5HnlRo!;JyrI~hS4&*S964I zJ!^A;=`KnF+-7A)gW~|Rh0HHZslnZHYH3JHL8f~BC2@wLy_d{Mvhur3xeC5jB?vbTZdWRhor!m$-JC2Q$FD!&wymI&v9~c^sFKv%It3Le<$q9r^FUwTz zi!K%;pA8mufaiWBW~dv1PY^pKq?&lh78mtPuKu6j^> zFs`~UL)j+Zh2_&|Xul;MOc)g4-{BDUahS^OMwn?liiwfNw^XrDMb{z3D%nC(qNg%O zS_)5Bic78Iroxo^5uQs-Vvn%2>E5O9jQ>Z&FRyqG%Sg~ay)CGnsOBkz`^%=PFUstO zmu1bm{{od%GBIY4BZjN6u z1}9gdx5QnIQE_4YWuhOZ0Pa3U$;sc#;4orSGV}z{l|bs0e%ks-KtcORd>BS6hmSw7 zQ5iUk$bbnODPAKG$kx~c#Vp1^@lA|!>qv+<0X)`{BuVz$%C_{ZXCQz?hTkUUc3ZUM z&mM`0_o$_rf&Aiw?8~yza+_g30D-yQ3s-?Cz__cW0LLwN#i>)@HG_g~*$-QB?QL@F zvIx~9mym*F%}(IKOz*8k||;(6uW$u*n*}cKw=xy zVF}k)?b?h`qqPMnq=Erd-aXUX{yPp2@G+zG-W3?R;RB z9bPcu4JY!{@!BbUShhQ4&W}AFv9E;wAck_z^qUWU3%1LWiT-UV^tN3jQht7Fx$2~* zid7GcuK0V%W&=hr>bsSe>pUc$+wGu${JxDr&tPR7aKUn)T@ngE2mRt9Q2GjZ21Wui zuBL&?Ttw0&|M8c5A(Siqf5kt9Gw;6*6WifPhJT*J9*W>Ket=8iJf9<6@J@`5dB^|h z^3|*F&0m{(|JqfSXj?IoZxP1NpvRhgi#TZ+@o;Yvi{U*Ng>0gx`Al_M>uOYqC4$GQ z_L}~80fI9-KjT1QslL(x#4NL=LG}Bg@`=l`55e1^Pnw_6Cv91*cdi^R#FvVQ=;seWi#U4uP!ApmX)cBODokB zfs_sVC$ZfTkANal%BIwlY(-TT0A#IoOUdQDwI&?h9l}u5db6+Irvd7_TvRO+w~^&C zi4YP&gyqU^)D^y8l}mOgQ8Fq+T%ApND&YaOPj0;uMW`Xzfbr1G^#GFxC0tfWj{xl8 z`g6~C_?~7ENnvtn(K#ryLTgR1-Ae!=sT?H9*+l)K1r(GxPl1H$dAW8=n9Od6!f!;G z%V`fH;S^N7nM{Ry!UzU)lZ0s{vqywhLW*xFg8d=|wU<)yT_L%i`~0pUJFk<7WHOlc zP{=XqM6B}&J_p)KDq)B?NOGPBNo3{%m0H&J00kfs8Q2!PEmbHV7!9`e1m;`P5`jS3 z8<7HNq&tNiuY7=RhLs^F5wV5GfU5Wf*8#*;6a^k3g>qvDi||x8 zTTMSxbXao^tznj3+y(~eGs*68li{YN=sJX46zzbLQP@du zvE{UkEahlfOF}J-`X9E8U|RZ3rlzd0y`e>PIxKiZJ=2{ay4mi02pZI)v26*3C*?O! zKy;u%0&AO1MfJ<&Q@BUYd9etpBn=_C+96hIhGg-m(5<0Pv@Ew{um7(m2ShQtfq%?FgZ zjQXcyjssK3))w(*0~dl-z~CWgJ!GdtT#UQ&pcq#dFIrG2)sH2!tyam+ujRk+e^>CV z>s6@2Ob+0S8awaB{olK1xi9Xn;xvL1LY*hmkHylI%qP~MLpis z*+kcYHnoBQ#PXwKM%OSk#^dFCA zd@Z|q&Zw+-`<;`^l%ntUBwlvSNWLT-ISqB7ZVJ>@%~tiXmO>^=%w&lEVU67gK=|(~ zTW&aGW~}GLOY<*!>?g_8U)h!)EJMttaC2v%jZGp7ml2xhsN4}SzRhzN}PyQz0TV*I>vRH3-&C-NF zef864%=v{pJ_L@KO(H6vR{fkcK%u0cksHNF*pPb9Cl8_&E|#bSuMUrjKoStI*meB> zGxhFqP2G9^|4DKPhZyh#LVCd9D*gR(<7%J@gf!wflLSObu?0oe=}vc( z5W*ou1iWlS>~a%B0xhv%XKJS#NP=k9RRM?6afYJP+K$dcXFIdIGyDDhesA~to!#Fb z)q{PYD9PvZzPw(~mr3raA1Jw;cQ~C1Wg%Fl&X(NGCjN}q)lPz<`uMQb_~Y6)KWva7 zZEmLE^H=iA?p5_G8vesU&tCuBeM_n6U*mIB;;&uy+NU!;(pThtcMPRMKJmoCQ9CG^tJuovAupKfF5oyfiO zP9^fY+CQ#hCk1*coI?ZS2~Hm6(CPH!JTy-B3u{V$=M_`e^rWTs+hlbke|qAi*}Ha7 z2f?Ci=2tYqumm8v`e=UhcZZMTJ*$)ZjLfO4IfYq-n|~*NHS+rvsj$3p>p74jkdxyl z>ICc&eo6NUM1gHDEvZlym+y7(M3hXtTaBLDXqAa8A{LVvfl&t(tQLlHc1}@B~~Uvs75C6OUFWa#Q%pQe3D8h^L&eb+i&i6$qh}>#Fl|xQsDL zFGee(?+uxCclxkhhn!0(R8PlqluO?#=VH4$N=EX|xAjd0YCBzR-ydclNPF-57*Fru z*N4CQQu1m-NonP=+2==yS7IMbS~&+fJCNobSB*1U3c+5f`QtQXh7ySfJK3MGlShYL zZt|qd+iQhX@=1GiW-a=GA*`h=|LsnV(F`6s^k{W8D6Ypn)Qn+?rwb5KCUzHicNp~; z07p-Ph}#oS{StT-l!J+p&~RI_rxpi6nuz+%WrP2iJUgawzHD{nCmJo zekM^Gguk_}H5EJ?HSHic`_lph0eJPMbuaNHu~u6<1&xjSgh96qr0gA;D<4>sb0FRe=}|LIO~^>ZjGzwg zz}cz@2=*6ngcX&eXjdYI`PB@vaIcJhdeM|PB+GN5Tp5J|Vu+SsGsXu6&vMS^6wCeD z_dghztVZ(6?PPtND zO>_Q^j@9mmi56Du@=W)7^8~ruo18cHX7wqX!^15tsft1MPNRS!P5`H?LMKj$%1;o* zt*8y>2^=B!pP$)iQr{&2xO}pL zDzQ!EAxLC^>mTT@_?y2~if@eMocDcyG%KHTkiVrr=Ir_NPT3%+{Mu&0Abl^dR^D8k zYk7?sbaoFKN&~4AG|T!Cv-BA;Au?WEi;TW+@ve1CFX~<)n_|LMKU-VT>JDpDc?*35 z^-Z>OXPkqBd>$|H8#(FWBBQ%AtMQ$>BV~Zy`#XoSbOd0r9Ji+or6> zP}Q>AZNBbruUnl_9AQaUu^zACTFtdJZZoG~y3S?P>zJ)n_sE}mOzYFV?SZq=MkCS^ z5wYSbO58%Kl`UF=DA0O7lhY-aF)16cLIV0UApktT7j$+ISxPwg^3Z|}gZd%Tmjq&F z#{3EJlwsfpOY|x%^cWT)G}!=@6#$#jr-RJcfxndSFMYe(AnW_pYmDs5Usy+OUD3~k z7bVk%w&e%;>M3i$Li!K97S$Itiwz){{BnJLZ4DSh`vIc7I=f534FCSHZ<;|b95R{0 zZ9f0tMCFbf`&$WypopI#b?b3olq!Evu`*vO0(G?c+UD?O6lSz<~(ttNTdq<`<96{kj@)H9Gz-zWa@WQ`8_ zFl+JPBRxA*=sLjMAJ$)6v+QtPnT}Ca?g2F!1is&WrU%Pn>O@qZyr)2HIIiYKH-|ZM zUrgQkdZopxyY{egH}irlxPNww-Xj|Sl1q^{ zz%T8zn{1^Nps_qh_2wLhO9}AgIw`HgNK)+wY@g;4_r?qW;VYC^KKG8|zv7smvBb*vtsZ=7jBV%)!>wg+pMp-+;o z%s7CR2cg4tx5oTdq1$AP<``QxpG2%iY4mMh6BqbA0b_iURL{Bw(2F5Lc06Jw_D_MU z7+8hOq=G43$-xnE&K70*Bedr>9=nIU-DX)|Y4nY))oOaudJde5YUiSmATC2W1OJH-Q+bEQ(|D{&2k>R{%ZS{iKsSfbGS+~HPIc7=xNf&BxX?0GYW^R zRvPPyHBULESqZ&D*Vx1P#`S4;-Rk_T*|D0F0E~gZmC*O(WEyiFsR{1euNIbq;Cto^ zO}&P_V)fN&^>7@7^CJmvqQ34a>2(!9E8LS{sMSdokgoN1>k~t8FaZPusg~s8u|1lS zRC#<-fxhxWt^O%T!4g}d+8aH;@_vmMBFU24n4X7{lW!MPN`a=|icrFfj>MaDiuN=u zI_I^dW^(>+i#NW8-P3JO^^cC`W*$e974d9wdq?JdZe4fN&f?q&H~g={ZCAJP7~ohW zPyr8PA|92gi1LO@$S;m-!bI9cbZ zRK|^?ckxvuoW2WcxI*epAPSBnis*JNz{s3f7;QN7_zcFUI?tS_JDOurRSPumLq@Jp@0g<(mlVjPfLoju)6yh{!{< zEDMljEJz4QkhFP`W8O^uR~1K~dwC%v;b3toZ^)Vbu;D(0BJ&Gsu_t3#T|`&3V)Urx zg%Mj!#L=EGB@srH%v}P(BW7Q#X(;KN5N6*ALrX|GTEtT%>6=TktX_Epu}kSME%SF| zttdTWhh-c{y;!X!9#)>q>5)I=GHqh+G2`e;vUhKN$V#S6m^D(o!S9{LPz;!ofpBtW3(vaACF9 z6{XC?)ACE&CbUFPPu@u|sX|Sx2|0Gk4A(C>o{F2a< zLRQ2M>+F4`47AZ)icgQ~9m+793b}3Y*-oY{34a8{4jQVIQ?<1~vH9oiPcHKh#Bp+@ zh{b{@dG#aZ1H`Sq>Y9^(mM?T|INKO&K|xMdKD4%u31N8agK ztqL@OPasK!(kKcx7!W>PH|xRzmtBx!@ew&j1Vqetu3Ov}uNrn33N$qlM?7a+&q;F- z%lR~UTQEqP3-l~V5{Mc!%>6T_Pt9)NNYBq=7E)k^?D`)6`ucZYP8w)0X-8p8Jz)v* z$nM%_`NiKGC2&}+`VGqu9z3wtRYo0r@J(99^OpJ9LBOv7a?Vz}I_tL?OPUQTz)vSH zzx{Eb>CGCjN6pXAcPDj$_)zQu>*b&VZIK+t*z;?Vo5`zYfuUgNVR_8I~QXgsY>2Y&yJWrfW%F zxvXEFNugU=P0Q9OH{q>XrYa&)SF$b~6uWNE3krMepbi+FXaY0vL#t(Ou=hc$b$zva zcU^RH1hS8lX~nu=ij|O^(;Co$Z0XKx7n(~x9)r~0juBrfZ`9|{UaQ=};fw9+n~d|6 z;u+jy(z1a}?4YM-o(csASJe*B+ekLRvVb?1qq7?)uWPte`4zl#2%Z$Yfvwh5nybSpkv75 z*a=vN6BHxDD`HVlu28L}B8zb(j`z1By#VFsbWy1khnDDwZfKcV4G|m`W&lP^q3|CK zwI-C2%zhRh-divxm7Y<>Wrm44-ZrsJMLJN0^lfOcr9t@o&+SjMkqhcODJoRi08p}HY7m>o^3;!QfT0Qja`h34l1nTkMO&70HoXb$C?AnvIYK%_ z5p0AgvW}8Vee(PG#9fIp-xZ<|u)h;N8j?|jkS2hXTHuT!Y4vavd;@Mku$(II#M%2= zEfJY;z%4Cl%Ph~Z@!~WG`!oZ+US?*Rt_h{Iq3HrR$*Y^v{;Gy~x4t zoPGEBAD2tV%rGWI#P9xR{u5=w+RT#|%fnlCnN)jhsqJoelhgjK8gj9%(2ti)4m#E# z?!_MEEt2?u%@g{mJ zgrw_#bzXK%czxKO@YeD4u2`hab!PaHx=Bslt*W@&I+`z_ynZEbhkCNmm2FuC!H#ua z&}$_oZqFXs!Jw1V1ex7wddr2Zgb zGBK8ZAub! zN7Q7TkHXYa=_M&r-UfGZ0i&O~E}$U1dVp>W0f-8Z$28S83S9Na(vhkqaQh&U4;;sq z?oLyJfemh6+gtK_-M+?2nV!Q?o2BX_@nBw=iQ>nk&-Bf?6Ukvm{FPk))robun3!Vo zZjhwrvo3Rj_1RNCbHH7xDP30R>+qgbPSSteq9kX;?Q-?G7^gL1HoBuy^iy6pF(zgy2<#SaA@jD$7IU!__`-l^Kz^ zhKP&fJF}UoVHAm6X$;xN)3c?Ee|`9q|6s|!M$?ffLX3|jxe%Zkk!Eewl`BUNCC#%rY7{awvp3>lwUb~YEPFT!2SMrB9Y z9TXXt!D=~ClwjfmRF+lb?f~ud8{kx;wUH zhzNs|Y#|Z9(wTo#X+hAYJek)4?3qn3fS#6dUl$t<=EG|T#aXtsJyBa5=G&#K5sel5< zJS>$13e#eoZRepSQv9euxe2>5ngy7io|j_-wQ{lVbQ}G2!@#X7hXk&fJ`|xjjYIECDC(1^}ekKgdTk|7|ryFG{#^&5%qcpeh za<$KWKrxLKE?eHL-!sZ7y|5O)H#vL{-(hs3r9CQ~ojGj8V$B!|SQ!+gV~Nyrn1kZn z#EVk0dtC!w_Cb(+Doq|~FBeR@uDBBo5u%>C6?tju;|qB%z4|_pKTOTzB`o#fB#(#W z?aq!r^AnoG!^>Ti{r{d%ob6QZD;eLkF8xf@F^#Q_ z6nb6BVZ(=ln|WJ`;r)T_sRXo8KAtouz13k)?isZDW0nm}o$kT`F0)iR)%&Tv+v|wY zsp2E~5q2~(Qx}>2%uGRnzuN>nB(jN&&JJ>PzpKZ5#mND|gt?d%L9Q8V)xXiw6e}~9 z;X9j4L!D|I`!1z1vdsB^cmmCXpYP0&Yl=7 zy!wu@ct%Qz!E4ye0_L2%X(707^7@AbE*n_Q+-s}sr%T=h!k}V8c{)=+=t4$&Csy(B zZueJ*rBh_nN2!H93>kRl0!?)*GdD#O=GP=MU&?dc9o=a?b*uT6tdBbCDucdJo4NZ& zU*?Aw3yMr|^hxk67he!+5nR6KM8qbyJ3A9%Kp1rwrU~xA44Z}!!*cvgs;KEk8HsG= zQA727gfBsbK792lQ7UCf;tw0$` zYQeVm2sfTfP;)C(VOnOw)+8y!TktF_xjOCy%7+w39pT*>IFge33*wMZBR+Irpu`%80fMyVbF@wQG~@~@p21u+rZik_jA;8wK=ZISfEYj6{b@$K*h$6qmC&qULf;FJR~;!+E@V zNXxk+!@qHca3Tw_IDxH_*BjbJvjE|_!E?+K>IUGmEHM$x6f9Cm!KKJ1`4R#>w6iL* z>k)hh1h?eg5^YM`fN}&1HAzZaViKv=J3(MZRS2;GMNB4*f7B!=m+Uf1j4*Se-l4qv zM9)AHj|$L|GBU(cWR=UAfEMCSl2v9&Hc>;QD>9y7D5dVegL{XG>hQZ6r|F5}@e=dv za+ z%p-TVAS0*bze)b9w@3RwGcgrhq@*YR{bb+7KaHLr4gMEUlycSlMlex^P$Gt8DCnac@1*jWxATynYH-ie}15d z=$Oma*7hD*o&1>P2(*H`{qt)Y+6n`v2`ULorN+SQm`)X1A{19pO=UpcvPkZ1fPh%~ z=rXHZE5nb1oPiK3Bk6c|3e$y!WW3VNp^k(Qiu9$Yzf~sq#qQnj{_zQnvD@6Ty9bS7 zZA;6ZV(yc?DYHoSvy=N+2Sv3x>XHW1Y&^ngMN2`&DS}_r2*z{T(g_HyR&?2-)^m!J-Hg#Dny3d%)949 zrq7>GE+H4=m{*y9x!OKQ7Ed)A+_&)do~Dlmt=E5lcuhUmtd4}V;rYm{dCRriNU%P& zJ+`I7TL@H5pU7mF%;0|CsL=6pSm!4^!KYisL1plds)A{?~^& zMy=@PRExh#vpm`4s%f^=2G=Szfz_5o0DVk0r5eQTs%L!5+%B(SkE>~&$tpPbjxl~d z=R5mg`(VY}f#}W}6;(V9+eSdKZ-^}W;XYT(=!$^y?LN*kKggYaqRfHgBnWI#K(&8jsGJf_qveLv>Gk z30_1C=L_gbM0G zLa!;toXBn|1+5n#>UR&LPVUK}yyCw;9D$nuKyws=G;1}r_gOu+^*yygzfY2B?MfE= z1}Ey2@iTx94VZQlqvl!-We*4pzZ&NsG@MI0(;?h|bOI8O1Ip&!$g#~OBI^uU+>N^x zEub||(sEG>6J_m+ee4n9R7y+LQpzI_nbf+Ge}a99Cm5;yzTQGd;#|~oet&jc-FxL- ziag|p@A5XU{C<0hwe7R-<&lFAU-zs$`IYg9to|6*sty}DM7ka5HFCsypmN#I*{_Z) z;%)l_O+3uHo-^_8#JWF6GrRi@z2=&+5A;%seiPYUe#5uKQVx$~ES}bmrK_E@PEi5f z(IT^5$7hgCIRs@Q34pkRLQVxXWFC%-JvfX;DSV~mv>T(|lPFOMeQ{WBQYT{k0fs*0 zy`#1v7zS)rwg5r$|6WA7vSrsw=ES{!A3>L1eXPCUb^Q^!qU0}d!ujm|$>3tIZ0MIA}O5Wf!vKW0Z*dA(|MM&is;;w5sV z(~Zc$;*3!c+oj(wENuP!AAdk~%)aX!{m}4(vu*jG4CbW1-c@nC;PtZ4tCCN?ue$X0 z;P&x@zY*24Z(b39E;_T%O=ZL^<$Zqht<}xyGY2`N9>F|&*>CMyt=bl_1Qsu}udg@F z)v6+NNyPe=FIlQ-PF8u|!mC?bv*-0RI92@uOZ`vK{eks$zmciZR~APgHT_6sP%YG%+7=r&95zLv{jp>u;1B!&%J$TU}7us10@v!*FMJ{wq-M7}1YErNEg zIH3y4zpgiTglZH2$r{{guc{yJmklF%iAz2zNNLa|9+RDj{XGIA-~-5MpDj(vWqKkjYxD zujwwt7X-gF76x);x}?i4`=C43HtAYl=XqqCHs9^Z_-j7zDDdtk3B%kYb#r~)v>}+? zUZd&ZuTA+@<XY6Wl*gS?H1Aui_4 z%dX<+2NsY?Sp;nXq#xP(Nqic@rUY|bevEK5IZVN}KrQ5D)Z)wXCC{CCk029n#CufC zYD~@=g{2G8rlai`bvNydN&52R=JS>OE60~weQ|k(0sYtBO<5FB`hJauC zLYAs@+MG`3pxZIvOg&Xxo*j1>0fIgz1F0jcM~P87q7-(Fy6Amdm&tZrg>B!;vt^lr zC%j~-9WB!d>JsaUSe)V+LhR-vpf&{TbBRgJ+TgJl9%;GCh(%ZA*z875DPS_#F^a^h z)V4%~u56WXI$|UVJlsx36ERqM7{L<9UgV)vR^}#!wJ67+u0h1x`J1>YvWqIET9`7` zoqk)Aa3dsh#Hg{YV>tR8G&wlBkVJ9L%kf?k_PabKjNl%lwv88Rl%f`+U_=b%DIvQT zNkRA&Nr?^8$Sfc!l-^0J6+vJQM$Fv^&u9wS z5sIC_B^Ivi5Xh2~t}8I5lZQpeuqN52TmKCDQU@wrPMk%^pyvFA_<_X>t+S-EpG|C_{ARd~ zCEP%V6qotCC(MjA-M4ymUV2H0!s_eew+gBdP{#B4Lh2^GTteOGK*^<=l=K_p_n&C! zX)x1V49UlMIpsoWIc-=6ahsVP%1b+?K^yM?g&rrrVxnXw+YqGI>_D0r@_TPQv8BH( z2@U@27+Pz5U;nZ3>dI__e9Pt;623l>wpKeeG1xwD395nx%qh;cJ=$%};&-QgQ=%<5 z$F)D~GrzUY2j`p*CN2fyUuxNYLruxS{-s2^HCd%!#rLazuw&FU$cgAfky)>M#GSgf zE-u}|32OsMm#ZTAnr%KG#R5DK*X;|ANlU>>WR$dceIsi|@Dx9}VhW}v^g^%gU(dBl zSp|~X=6JRE!%WwtL041DtcggbGa;P|l0TLk_c6im=O-a7q>;F4fsF%ZO{pcgz zTStYel6Mjm0ND!~ZJnS9*qCNUk9iV)#0vO_Yk$Zh8foYz&T z(}sF>D$_T(-5_HGvkpgzqjnr7*4=7>2H0UP@`OzRxh18ML=(VHOf03EN5>$oWC8j< zDralU38x%|-!eRJ6u5;J6QV+5Y3L$s7b=WH3K86&qMQV$^ENMcH!3uA(CHUwNHs5hVwo);x7Bnc#s)iA>qs9h1T z1AAyfVm=WUxHCZVz#Os3LuS}`mfC=yvO(d5)J)12GkmH5H&=!Fj+sc0Oenb1eQZ-6 zLWo$j0s6$yE_hoOv0~?C>xNtaCE@~m&+Q|xx1^VK%WgMhsB$ysLcDR!i9s_bN+a-i3?;sdf0 zvhkd7j7XH1li%BFkp#7!={C`QL4=W`7Ve1 zjElgllYUOIx}i6Rvn}aIRZPCN-_qSG zimxCc+fvs`z0+soQ%g%=(M<(=wXF1Uh}BQ-Tuc$VP|PEgSeU!Ol@6|l{;Gk{cpmSk zrLW~-{)Pj!HOYhi92ylVa!aVn-)xnqy%@uUyzl=Pvcme92Dl`aO7(Pt;D85Yx38ng zxvq%~OX34*m#df;ydB-&{zd=Mp0){^%lu||uvQOi$FeJ*d>e=vPdCM(n5#8}ki<7b zJJAFi379ar7A2s~7h(*GX28@3R&nICVhqB&q*bU2$;7pSn8W&1(@l4LOh)N;?mkMq z1QC3)qsWE(O%Ubvf9yR6{%4|~hHv}X<&>wKQQu`Cl>U7B!(V*%$#A>!UM!;+Pj;w=>9D zcCCKLTxMUG+^DI#&^2o<15O8@WrcL zvgmk1VcF4sewB2xBYxml?W};g%P4M_M*JKjd#<*Cm9#us?K&`R)q%UHd195aQK zps9I@SdTq@^vDOds`xpl&y4^2mijr!^=v|F5xwJjqL#g|@d9OrXt3~n4yLPl3wa{_ zaj07;sE^1JkKRc+bXRh^Vq~YZgb61DrYhfCrEuKGoHmE8;jR}Bko?dsp3Te7eErWm zp+j7}i zFg%@U$B#Rd%b&CYxRutCdF+6PR&8=P89S zDYXYLUwba9v2`c%#kubn)$(D1svr1i{wPE9T+?2cMf4apA|9WW%`78ry8D%a-W zSFSbrl44`8nG<2*UkQ->Ccr@(&gVAhD{j;stbFtIlDwq&B!7XG^r!{2ogtL#+>{^- zVeB0C9NJSzuxD@WlVu^jA^1u+hms!2F}WHLrXG*WHsl%K*`x`P6=un|-jd(Rp8xjF z#rXFVNAQmGDYrf`O5c*X5oBaOl3 zGgp>Dg9ef01#su*cAgvr8K=3mZ8osBEIDEb?$gVsjnjGi8x_UX-Jwxe(?{!RuI$Z- z64|TNxH2*pXhl%EBP@xC6NND^O#Zpd=Wrp~VFw=z9w9ZG_Ens$0b}E)5H^_g%aZ=?otxUc+x|}iYwA_gfg-mhZ2-lL|pDe1Ck6M9c{engWFf6-VNiAs(SS z?Lx=th5VTCtKUT?o1~QuVXKf~6&VVo&%B0Zt9Pcy-ZAL@{lxD~TuPS(mSOz&&mcXB z8Wp+2N+UbE*@}wa$5;?p4QJs7Y7}txB192YWdZeXsSP}1U9A#|65%Y=V-l3rN>z^c zw`FG9?+lce>hk~GG3Wl#L z%PY!=0qC5o*7X(3R@wz~s-a-W^3nQ~^Q*(b!NP6snk^Hzw{w;oz4Qqf0$Rxf?ETI1 zrLTWKz!J>r)j&oF&r3q4=MqSAB8nU2>JUakvtlEpa(VC2PS8++va1yZQA9VZv=vwL zYcw()0m$iKG-*NLl! zes@`CpIIm6PFrf1=PllZ5+f*bb{pf-@WeS#?<_agwz`X-x?Yc8wy>5#*_ph*C%X8m zMc7Vo^j})fTRt*2`$20`+$vIz0~2N>v;npnLCKH|D3Y-yWonpEenUD@sHU>$5o}le z&~tSWgg^k6suY!MZ?p{aGaFm(?4qU1$7=sLGdlKW!7? zwpu2$XPY!?5e2y0WINhqk?=G$?Uu9|aqn>FRt`&}-Y|i9MSpxs9J% zU6ewJ+1|+$tDQ5jq-YT_OmuEvl4S<=y~^hzIY_A;GX%jqA?Qt#@*0L(t0JIM=?!IL zI-iEF`Viijx2_7T1KCI;Gy*r+$S>BF`$S`!{re#>KHS&?g5~auhA4g8=dRSN)&kZx z5FOo`*;Dt-uskb^PVTNdQu2j)jcDf?u03?u#5QMeo=T43l)%GLf}1(|+ZA@RWfe_^ z$kusCy=HeL^2AJu3=tC41UlrEgVDGcc98P|WZwLOs9FMD4RaTtLT$kT3&V#b0@N&( zXw!h8G&@QQ5V}VoU%qWk(_nz{8g%0nybeP}t3$3=lxZg5X z2rtoBB9_ZdYkt!!0gIR@oS61^1Csl63m6H$UXcLSZjX#%Pm2}%3zJo=Z*OUxA-j2G zQ;q)Y>)~170cQ3~FYHoeqf2++^`>hv#1!c>L))={)4Sm-*Zh6{Xv>$~bnky2 zR)2LhDSpO%GOhh(TGq-8w6l{Fw{>Y3f$-pl{h`pZ186FiI(2hlJTq7T{VF@)^o`_z zrbJc{nmyqa6bdXm*P`y!-h}qoFT|o9u`;d(_IX82TIgkI_X4MPQH<2>rRgSJk;l{x zEmtN0(YuC4ZiS8wb+wwBo`87zc1A2((v~G)C*mCy_gPrKaLk-jp2sSFb8IZIT6%AF z3@)FawtJ8(roNH%|Mv?ib;+S{4gB<9a&$}DQNuE9Cjzyh2M_T1#Rty#x$w;Vq5&e< zRC7~?EYRA56Rl`x}q0ms&;$gK2sOkkJLNT&?hFTZ9 zDTg9N?7Z^LF-JO&otDkU0S(~kN)S1Te9=z;Y$@**dk(DRdAz35eJNz^+l&2@E8yM5;M)T_T#8rY@#4D2^Wy?Nm( z=CZ{S#kZ|Ijz?KcX)}wZXZK9o?Z$Y?uXC<)Rzkq$nJ88$Dpg0A%$nxkNSbx?cu%ri z)3Yk@`%(=(Ba1J=Je;thHio7WPo#~y)|vuV@8580m^zg@GPA5t4w#c!kf3&Q@*V2L z-~?vS^wcr~F_LMMKlRfbL)bF6HfX4c*%l-W$u(1%Id1WC{?w?~(Br?&iec^#CaX2k z{E}&a3hI`vWZiW8g+bSD-|g%wcA#Uo$Mo?e)G=!j|5|WQU9&6ORd=LabwaPtb^8Z- z^vtVno6oec7HP50?K|SOXB*~0B_4j8XYmylUjLJIEvgN_9dwTrE)%SXz!Dw>B|xC~ z$i!fd+e^r1Ms*0FR++ReD< z`DYqLbRe5=KgC}FELW`1DXTt1ax*eUqo-N@n?T(0Y~X-Itbc)f>^djHVe<}-~!5La`-AGU_6G)1%OgEy7o0RQ6I3`0V>>mE+3mGcF zwP+Z^k#8j4u+5w(a(BVX{giM)Eq6*qnh;Mdpp>djkU#ViC5t;ZNf{TA zN1!8eTvs4b3X>Jf$8Eqt?@&r8jyTK-(Qzyul_>;nqlIO|pF;v3NMIy%Cjz@ON)a_| zq*Bc=Pf>@C0b^{@CKD!jl3Gks@ozkEmRh*oG#qEODAiPXerkuDO+Q;zZ(*1gVK`ZOr=Q@rT9C-D);qf- zf&?Z6rKF$DY8%U;D%b>CKAn$Ngcb%|2mN2X)L^_gdH zq_Y|k3C4reA%&z#UR^%SV$yN>L6b=<${(hjt|-<+=bqZBpq|EdQFwWqBr_W=3CY>1 zi~0zfO5Y8mlFpL*(v!n1$NBtxq}Uv1`(yuhfT4+jlUi9bh zVt$wL-to@AuN%4d#+YutE_<#nP4J}evp;7mKm7aMcUR%4{%1e-`tEc-0_UFEEskN% zlNsj!ewd}10IN(n&%{MAD?>Z?ZF!R zF!#OAqluVE&D$`ev_~^1fEJ=6fL2H4CUihI0|vWv`69d?!D>sYxhYvCAWKg?osV_N zPsnZfNrg&(YlbLnesUuCmE%Wrr{M=ERX<4?sE{G*qnN4c4@XqHez#5`ALF5+$6vaR zKA5B3{U}xUL(b(%!?K?+zxI?|gYC!h979}I;W8TND1HV;_S&8Me|NZmsS}s{?(WTR z|8DDwEwc>oTu7f}s(%Y=j1sS1 zicI9$N-p8vUjBm3wyBkS(bSV*Gg96s(y5;ybYqfx0*>VWJw~uK{m&So7=D$Z-g=C4 z`O4MLKAj2%{`vZ6|NL@>pdK6ZUmE}6yG-8A4R6}XhnKD+qs-nf?yVg^tGlUOUo-pc z=F{XuXcS`A^9lUQ*w}(+meEm8ZG1sQf7}65B2M;>VS&xObE@}G%80vmrkfAW!0oDX zl0Sipo#Dh8XQV);cRsDHy3_?TOEa`27|N19Q+3C`(66NJx@BE81|0m6t4?K&^ zkSCiirx`UPQxi?b2Uw4$M0PBt^0Bzjr-}S#bq}K>tB1;e$6aOgoW1b9J=2( z+52F{@GKua_yrGcL$EyaAlDEq8m9o_h?q$aFUY@t(-IVcrr9y%SDL(9sM*07BBWB{(snG~? zDeLDU=-1WyicS!XMW9hMGNUE00V0m@rCIAVHR4MXtN9VXD=Ez8-kR-s_-dh!5-0{# zpJfN9Afv7sDQvagX0Q{L8c)VVBr!>HqNpFCVZ%6Uue=2hg$RuH=()t12*ctY1?apZ z-2@^{h@|jN5M4BpT`tE#o@A58>*8`^m5Y?EXN*7k75N|iw8q;AG&vFST>ZUo%_gb`X#0OSq!*|bsV&9dl;;wOLWc{ck5vhnkW-gi}fsz`k zI~N?(UGqtN0SA`do=zOjX_-LY0$9x$l=?myBccBbV1HPLU~QC0$^`wS5XU51Ry;r! z8-T$iFu{D(Mtu*Ry-O(?w9&78Qeb*FpAz42{H@T6Fh}^2c0Jpms_Y4_%9|qzGtwi> z=$+z~+2~9%EGbEy<*mA0!;Eprl=_{7#|bp~R!1Sx;Uk5nC%H1$8S;}4?=^bCNRhy) zvodmuva<^kdP-qn&WQoqoym;UYY`#JP1tIpCWJ(cM^d1az^sq!KDvn8j{!DPfNaD8 z2rL%vzE~B(&Zw4Ltf)S(r@wTRB9E84DU`}$)sN?al5lP~wxK_M=HUPN`Hxppbvfhq zk*nSk!gSnXs~jRY1t${&j;2^nv^zSQ%v$BOLu1yrf~xq0 z@n@g#xuswLsbm&Vlxlai8Rk3N7c918RoD=}wTjykxhiri({;OThAfV9B+n&5|ABt8i1_5& zn$N3`WLCvY;%+q8)i*#_RnVA73g5HAqq<80K?r!j8C(wMwkDm5R55GpB_lN{9{x8T ztTY|RVW|mA%k5qK>bTtt-r;_9kvXiJBo!m~zGVZ$d*f+z+o?YY8~66aAw!>xA_J1L z`oI4C{dZ?7bX-GlnLW?EVD`Eor%Yy&`JDE#+w3fBaI$hm^0{_?#*ro-Zd}u_vU)Aj znAn==cF>s<3GGbHg}T-8^mcJnp^jHk_I6*obZNdGLF;)`3PF2}s3UOz6I>!?tk~Wm z^9u=Q{!wtq29eO*ltdmc&lO7fW~q<(2Js+=k^F&jB*v>x9UTbmqGU0CfPDH{UdzuJ zhkttFy@MM^lkfif%=GF9SA7?)Z_UlsOi6G?%n*j8;FLIlqnb8C=dFQ~$PtAu z#bp!7z}6b20%=F$0l-cOXX4!m`ADLs!dT%1n;$~9fJ24_HU1`3mItCqvXcVan+R#6 zNzZ$`ztw0wI3XN?t7hu6^fuhDZp@7TpQo2MIp1Qu6}8U!h;|(u)CJFe zn39~$FQEJ^{0l|Q&QeDUH?8+($nS&xu7X|Z#LuzWC zX^6BPYhbdvlfeE8a|aA7Q#0v}iR@dS)@UEC@jqSC>EW+2 zCC}tfwTk0C4)fe{s6=;Wb}e#m@}aeMKYRz=mzd3Zn9wh0wqIMj$S_D(TZp29_Ysw* ziaZF_@-7I`^u(UPN}dzgB5>3l3)uUZ1g8K;oZta1vmSP&TNJR(Pt00uMZI!0qDddd znPDT{1ABLMug&9<*u9!hR_?9tRUT%;C6qXrz5SP7xqO!QzG`RmQEC!Kaw7j)%c*sX zCPg`8&S;LSJDPBhWRTRae?XTKhWK>ZWpj*s~?tDM&76+{7Y?Dt^Bz zs#X1DTWvT$e!mn}$W&Xl#Scm3&+4TR60|-t%Bf+6-M&=`3p%V{KR{vvF~w}0&06*s zW?Ifp16qtQT&vUQ?xp9PbzBkc{4ugTD{5bB>M_FQW(9AsWi9%^diLW2^=icOCX+?e z=dO(w8dA3sbiLgTXHzTgCjr76BN71*(qP`&|uX?;5kP0d!*78L8i+_l!CYATre1oM^_EHnnX9R30diSDcyGHyb#MB;`jzH0$v zMFH#=#-D?JY)ma+ViL&u4t)iAK?!z*!^fo<=uQBSJ&y=b2~MZ+5Xc&tPsC6x!$k3f z6-M^f5hK^bSITSyHM-ONCY#Fxa9vXwrJtOq6gf)cP6$}EBp#Kcd;y3vu8mJDs8C{& z%G?f8878AW8wtcS`KD*S;lAW#`Fwt+;0!SZFXYl4~aQsnpcu8ZS9q z&yc8*MHngD!2Wv&Pbn?Im{@9uok+*YlFNKk^A0p)A{J$wCq_tu@5cY(H)a5_LjfdrLQJu?_#!*jMx9HLXoycHj;Mm^y#hV_v~cY zdavBL(RJ%f2jswLv2_E3?tvj-4dnffU`~fpOf^nMDX;5h8-36A?R{j1a&k3U;c~*$E_gXzQpz zhtl0Wh|W~4&Sz)Z*?Z5o=ez!o`@avpdNt|kGAvi#^}f%2-@jV~7eHA=hhZXRfKKxPAfimT$;K$HgY;5(k888&M&KhCDcXywW8}w)&3TPK+tH7D+0fG#CBwu z&9o)gdY4kR87FF=`Fnq6VQnNY3e#>Z^dt^C`uZNB(|tkeW!N54w%rtqJak7{bO#LJ zDz_rdd9#=vr7Rc=fB;B<#M(#(+5G+bZCpon_C#=18|6{(-M){qeKs7 z&jJg=NVdGhQbB0C2NdqdInqK8sYY7ObT~lK2a#JsvioIY*w7Utxk1GH=ot22CWMy% zogNgzUg*yoI$i-2!nKdCeQ@>q^$$Pz;6K|-a>g%sha679g*Hj*88kkAOKG&BP!_W? zF*WE`j~$<)JfolH0MKt^jc!ssRvZ4)WAhEDQg3<31CjcWe+xC@O7{J=RSeUG*1HpJN1{+pOv+H)M^M+43b#kSeH0s& z{`GP??KWD%DKvM($SG)iVfhMl@&&jPpF!D@w)3t$kXokRp(WB7pB>v6ssPwB6C_YVgXz~ z{ShkY1v6YyG}=9Yy`joTXu6^rIGhRK3>-K>G#MIJ>eFwX|DSg=45B3&a^}na zWnX7R%1>P1cv!Pvw={3%Ok{bN)5Cc6b5j^UXS%@BDE61Jn*GV_yz5u;3*bobDJo)d zXMCUfDR}nkgebow!Q6)lp^_M;dR&cAh0HU!9U%)YV^sk5pC%FmU7+>Qs-P`Bc$BpE zaKxERM_75#?#v=NO?RloB6Bf(FgX;y14A-*h`83wJ0{wk{&8Fd+XRaM%4W_aQpz78>tJx0EZsTOl zjQ!K6VgEVtRpP4e^M9#Ki83f+#$uYWO}um-FMb0yhNE#nQ0OKRnY#$b)`^sa?wh0A zf{7fgNGL{5+!!8UG^>RwFdZhQ&XYm`r@#!MERQQmPp1&7wY!^4<4umdUwEP?dm9oy zlU(}d?g&#BxZu2BwIe{={=V#vq`o;2sa8DC(f?lT9JiUo;t|`5kBSuTFPkw0%+AE? zZ6j@;zGNAn&tGO-kKh4IJ{5m`DNv!GQN*twlt4hDdS*-RWX;9$vdsnBf^sUfYS`w$ zIbypS37WRiA4;%dL#@Cpl5yffIEvwp4h~Wd&+vJqGZB`?Er`4vy1*=*CKl%gB&tBB zsSmc&Qk~k1bqLZU%We0KO?m}UTyEH!`v=M3ppbt&VyqvkI1{-%n%tRqE^#4rFEnq3 z;-3jwp7%V_Vk%Qa${Vq{d!Yl7wJ>1(4M(O=o2l`u&bG+CKdo|a<5l~$OH82||ET_u zwYDr;kaDvD&xUl8gQcM|ML~l&dtNCA)Ho7S5!+x8kE3Rw1DuH9VurSSAT@Qq32K)g z(0akp_egGsrrKZvjP{xnHsdLlj0}$1jy$3OkC_51%YaLkmZ<$)o_+qm-yA>hTrn(@@*=B>d_!cd=sYq<1X3rYpv+Ip%CIY<(VP z6@U2mGnmIblZD{l;QX#4gM+-msbB%mOCjfXrDmqnlEK2#OCSkOYA%Q|x2p!AZ-(xM z!k$=;0%f5Z)ktOQtPldCYn_tr))*8~jR4#~6XO;J2(gOBL6Bg0bixRc)Cy+xt8WIc zV(O%d54X|2aPHa<8m@I_#$;?P+k9S`zr3luF)u)+j721znXwg*lTq%sY*akgZdz`r zZMJ@(OnwG1yJf}V=ElYHx#47a@#lwZrm}^5d*W1DNNm^n32unfq@)h9-J+lgh4;{V z58x4$hJe#a0H-8&2W>uv6h))+G&pdiue~tEzI>V^)L;U|Wa%Rm{pOaYdQYJlL3SD6 zdi-(ax=~khUhnj_cTk~m(cd}xhaIWNM`DKSueHx)>C2qznOn7NjmSpi1N1 zo4dnXzM=*;*Td#2nMFr_mGotrb07QLedPAqUl7Av?vBu2ZP*27t>;o-9yow_p~7bs z8*Aq9uUkAmD9MVi3CvwuMr#(Q*Td{1XK9bODs!+rK3A)la@JmP`Iaq4s7Mc5Kd@Ls ze&tk~jM9c5aG(iDM6|*pVaCNlD~_Frh%kG4f&yv7(|gsh_=ndP{S%hg zQdkrH-}ee#Q_z!aF#Kmm2~q6-Hhw~6&7B$?=Ci7z{I$I6<}uv|PB7)=wFJ7dGF-Sp z@^R@7ivFRh3=;f7?!uqU1h9+5{DR1}$(rkyAN!TmmmzDj^{qK;V5Q-m0O&~Ll8^m6 z%euaVMM!_WYLbLu;5(FAIB!sB75lXTi8mh{Mpe}*fN5XP{A;s(=_xh#snx0&Fc|>W z{M-f)f?0|4%Pju6FUNJyYoepi86(rRtm{>*%$j=viz&W3kZ)i_!!*&?&z6ie+{SD! zs(~h#Kks(d>SX{cj-R-2&Q4j13=!|1$>rleli8M|0zx0t>x zJ8PktY%5V-HsOzHD*Z5d9sBBq^EEBw5S_Z>f&wADwLs+%$zl^zmPLK#3(5eOM*icLnB4PY@r%*PxoVz&!hQF z?e4qsVR0Q$hYnfMVps%TjzVw7V9D_o?fopOq=K`D&M=%+A>N9HYG&JPlEMnX_2xUR zDip~WPdgpvLT%@LMIl*h=Q+F$+pbgjMS zdr`+?{?>5BX!KS7C?(}xlkbyS-sp)-Z@Atb`a#y;-YI@-qT{fM@zJp%Xkv7XbU*Yq zT^|<>7DQv$?p{cz_QgyOUeJxUqOZQzOpUB}U)xock)^7nZ5OK&9Ho_p&fJ_5Y5!zw z!6%gl?ip9<-`*L0qjKcqYx&nk-+v?jm?;X&uk;sw|J%!Nm(}EslC$<0lupmF`wK^Y zrOWzSd0aSoPjbL;JHLD@**VqPklb)(@aevpaiPr+U$u0}IbtfyEC-u4T|WcWe&#uD zmvMLPn%Ptxf4#%(o0{6QZX`U-zK|`ZxB77em1&$|QUg9E9VTI{!7^snlEA<(XCYe{ zg>DojOEQp5@#;|)3vO3IB3WS0_c99V%*l%TgXkr}@;8pOE3-a2dG@=fBUv<<9Gp@5 zMlz86?SdskB68eNU07J(Y|s{JO^_Uf#rS&UUiX(t-QDFWo4hk$Us(smJD*P5q0`vY zO0*a?&su|G&hH zFS%x8d1H%0zx3s2aMnUL%Kx17Vzhpms}u*W_|`IbmsW36 zuA-aYD46XVe?TUF@^5I&Le0+WFJrBy@NmsUa`M=x2OyGa+1w(BJCk*Xsz;-e1K5l%R>9#fsCA3vP>P(o2A*^ckgKg> z3V$I1i|;pNVqLHmSAL}m5}LJ}7*Xe@$}12=c$kh%4wdvA`!*rCOQHS$M+QOolE3`p zWi3e&y#D&;<_6yMuRj{|eR%c5Y46NSzrkBC|I+?bTgK}LMV}m6{rjT+*dw*)tKfA2 z|M#~90-W`8(4Ns4aKWR`W^4@Cd<>=HyQX|>XW|4=__;|Qo;F_e)Xa>HTCTWSW1%$E zzn@=O(j>I64r{_Am^Q9YTpdyaq&Q;hF-N#2w(ulf(`jLLkM}jm=5; z6g(8z#Vq26S&pJKtisS+N#CI9VGRnUF*hlWq6QFP$ml+Nq91*U_!`_7|BK^)@0r$j zZIIN??XLSl+NP?y-GOYb>#}b&`zox+!``V~{{H2|yZ3NiRnLNc#>6GBD-yOAOi3%G z%TlVpW=?G1OSH`J;#eUz){?tl>T5v(WT`GMD0lQ!RN;8#T{HZ~oDj-eiydZkzPGZs zhxT57!ifTmg#IIN=gVR%u((tpJ_xM}g2n!r)5M;rW){FzVkzb@!>!EZs#AOu^t_GU!pxD zEd@Itp>}~CE>dBvQut%K5@B3315#pF!^~L=6|vO{stp^T?kh>;O)_gjQen&DbRzeR z;?H*ur=_9wWcvJ|yqhd&!f-qRceUYMH5P>D4e$uWv}|^ z6;95XX@+r+I<=uX_LeHg`~TE7)5N`3(u5|S7hDtlefvZ|iR!Uc4!1wzskS2C+5m4B zkDknHuI}P>S!SG1s3nj)S^7+0A!Q8j;Z49k?#p|&GMQ89aZ(MnDDT`zYb2)J@(T1s z>jT-wO?iEl;%pp!Q;49y?WH)`=HQkhHbiRYdz%5M*(pMb3RNst4rA>YG+RVz@dgKI{h9UTdYb=po5letyGlc3{k{(P>6KC+Fp{b=;WvmpDeGC1i{Vg z6Eg2tDj!ruDSFP##ym&7t-PIE_rJ0T#(8^#D>8k#leg9H0%I+a_l3`r%i?r3=!{2l zH&NzyYL{&N;&fBk?`u%_mnX%0iW};mKd9Jvt4|`tDU6T6%+4S_Ll!CI+Av3fu@VtJ zjUd~h(T)D_1x90V%oL>y5CS&*BW~Lq16*bD4Fw80%{sskHN~DPIEgWOFpIvjB>#A! zrE;Hhebo1A6J&Q8eJ6!XcfQcq9?{dU% z0Klle>e=*Z&iaM0KQ!!h)s_aVfm;2`w%XyE>qAZ*%eYi5vni(XCN7i>4BL`T;_OP> zwoQEDQQ*loD+w5uA`D7NVK^CCL-?BDL$kOvJS3-y5t1fH5il!es-P&gYuG{E#AD>a zK@`nsP+gSAB-2Exsx@ptxlr_@q3F9lxT70?hBpdx_6M*2dx5|8?lf)Z`{h|KSL$Mp zzH9u+#mhIfwlo`V%hK)Pc)Zr~hp&QgJ?ky5e=KSQl4v|`RG&b`seNbLsOUS#zf zd~cAzQ_YxL)Pq$uI6lvCj1$YgY6yqT_u%VX=WbRHL335cF4`^A8r z{-72$K5JR929lg(BW*guP0l44h;E*^2K*2uUDF+eVi%fHTy*C{`e#c;3EN5DcrjgZYJ(@AyAL`1Gt7TK^VUb`?kE3& zn=ib1@*iVvLor?bj^4iY&}bvMYJ-4v*^id2%i~TTR}{B1{27O+ve%rN&CW$q6g5 zbRjCB#XU4^V+V@|lo}@j;i2qpQBinLPo;+{zaZxvM3L_IGAo+vKXtc?+I^SbM#$f| z%HxoH-`QC7Z@E2R+mD{GdFib`i+^-Y_%A0Uc>t}O0HXTnaj(OeY? zyZ-&^)fTBU!kz#FS522Ip3mXQ8z=LwH9B2co^J1&8Tb{sxLzL!S%VYAuoQ+AeyP(` z!3z*hD)wsJoPWX?3XLbubbTu4=;u_E;^EKWvki}pRb`ex@2=4=_*W)v02$&>Y?upz z_rq^$RNz%*0F>YAeIoH@=P@?s$;-liWk2}%$~M-VYpsn+0>?NwhP;;CG9x}=+GI5k zn-=$N{iD1viWS%iT?@&FwVaLK)-uk-r%&(w_*|9`0JpkG{bS96dw-}ecOC!yH|wPY zWtr&|#s1y0@ALa#St~EsUT-z(6RTuqo@}a{8{L%<=nXk9hwdkB8UNg)IROrvI58RV zE%)p|Ou)p$X&MJ*qQ6%hRH55gFJpe7Hg~K^8aQfJw=?<8?Z-!k!uRf0Rz0|ND+`l9 za^&X+KkxO1qI9sV`h`tp0wX6-ZLamI+gaXWm z0H@h-qD_ITEaV!_WexzR2xSX6#D)lcTQEehU`2Y+gaFlxDW(fJg?=p}mvFjX>fS6; zag<9Wa8mCmqYE)kg}9XjJ2(c639v09?Af4F#(EfoyB$=xwMRtXi*M-CmRx?pm7;3^E3NU5%s`e&<)D19bMUTS7 z!+{=JlQW29Km)|_lDm(&8Fcnbmq4fTU>X~2UI)|42UH&QNM%EH^6^-`v=e1fn^B>7 z9zPY#36Cy}S8E|D%-gIGC$ZdF0O1}zl}0;!vVfLcF;3Ns5j^hf=91(TkN%{y#GJrl($HCq zF`pCLUJ{~a%~m}<5twROgyISI_^?^1x1KB+q7}@kGLu;5Y)B)EQwvczpr=0O+Jo53 z4gF(IIOeNm&UvC5-_?*Kx7)dG7Eh!xGKe-Di20 zx{h&MmyuVco%-EveVReq*M8sCz|&RZbJJbFh78v`D`wyMjGCPb6+Hdc0Aj5@e#6=k zWvE)h1BR$MG*Lg1>|FZk&W+A7N5dm&ck50%3cH|BJG(JvL$th$0QSDP>w&UI_Fm{oPkH zoF3QG;p)JS$%jpzF9p20Pys-Hd?F}h4byF6=Dw@p^7>^4{6Ym{xC};_jhB0(-(wvE zf~B=>2?`v$MNadW+K$kc8K&=G-{UXo`gC8yRJxAcbMh(F%Ht!)m;jN>||(B zC zYBF55p7$gSj{y)j0(kB*$LP zK7d@xS|WBJy##L7??u{2?KPP9wS4+M39ts zJGr96)9QVpzkU7wFW+!=FB%Vj%ei*VS9;BrM$#&)+e4FIGb=Lh?p7(UA0rQ32UX!h zpPuadgse{A=n@ALaHQ2SjJJ7`(j48wO4?Ad@kbvChgvU5bJXv@x-maL|JvW4ZgVZUjNUbh2p*U-uuNbJ!9`r&jiMPdWI-P2W6h$ zCTKd5zNiJZxeg$wJ$Y3ru*Zc>eFIUb^fg$2Y~w(%H(CK$9&_T%*q2u8ky>l5ip83P zrjE>E(^5$A#l(jJ=`zmw$p_wqN|eU%E4lND5DCIJXo6kJHgnqLhpl+W$n08xpwobU-0VKI#@Zr&2;W~Q>bXfH zt(@=LWJPsdg-h_pQhT4oSN;4MZbRf{=~g~Jl&7} z{_XF~aN+yTD0lxv1qC1f^$K}}%b!g8$tlx4Ff)d510%44^C!K&vPLT*_0H&ba^{$f zNvUl)7N3AN!{#-i_ky3w64vORi*Mid2otJ?u$M?FNS3gph1j4RpgMr!0{0zjFKiv4 z?>MttgQG$T!p2xJ9U=%HbLL`t7z_ceD(rDbXKhYDB88AI7-f~ zA&~6=Xpcc9#J`bm(7gb^8G>zrIZCSn&>{@M77k-I*pv7bOad|ov(J(eRW^RyE^oJE z$;SupKlwr4;l*E5J4_3VQ756v9XKD&2KlLO%z5Q6LE7DsvA)yL7s%?;9htC%s%6e4 zo1#(wBzCBB2!q`J@VxXY(`v2D^hTxo$Ch#gDdF+9SmiOZxhq6K3!ce1HOcmln6yo4 z+OTq4jEET$0*qrF!UioCrQ2`dFbi@HK+kpoizMmXbg`0v{xax+iahWirL$wOPDOc; z;H-kf9Lk_hvUBv6W7y43#zE&mGqNjm>^o`xC`@Wcf5y7_r~W@}WLN&cS@q+xf8|B5 zZ-Ksf=XtAZSJ*1u2|Cs=ziY`qL$&YMa{@lQWyQnKn(^2S>yOA&^j&3mTK4<{d}OK51vk~EVJ9!Zn**To=^H`cFh7o3!gKWju}jRa zco_LiEb+ojNymz-;YL(`SN}g4j0^MJLZdJwW+ zOtHa#_);t^1Ath>WeJSAm9UU3FCK^-mh%Eh-UgqkT0db~N|jn&R$aieYE~E$jpv}v z1P~dg6``Q^ zxi=!$O}Q;MV2@|uU35zLGx=kYrl;oIFrCFeXIYL{AnefkOK3z4RIC- zgG5pRKbjz9xr$z(GUjTGlI{wn%4zE!29$jmY$*h^c9F~-0gEv-64TPxnt@A!#0j}Y z4t$$C9e9E|j6m&_#7U;(kRo!=tu-lGXOJPl1irvs9U@4{bQ1IpFn@qdqY!*^6?8RN zS?G0;^=AN{o))n{%ytkJfX^7lL>+W7-OOT#XaqEYwG9HQP>eA%tPp`kF2{h%v_mN9n8t+ovMyyYO+l~Ps#e$HvP9JOB}p* zpO8Dnt$p_}5AhBEU^8N`_7wZ*J=Z=-NXxlKI@02WCDO@uDed&xBcnpT{$wrzM<3Pi zlO8|OxN`#k=h-uEiX(Xy?;ud4q0=Lz*<+8#o=h9{br=iOZ_Q2a8&ahYJ$=ke{wTTR zWN~c99^FK57(aRBTcf9)Ssl+Cjp>1AUmi$*2nc45n*M(o-O@6em&L7ZICkof%e^b3 z6(?>}*<2Y^p<$EG<5m+70^kyVWZvE{wno5eHbW>)ORw4jW0u@K>$bkW)eD*s)%q3w zuu0XKnHr*@>og?d*OKiODhKSK*CopF4Zyb)e??L5&CGBN)=DLEO7`COV4^Un9;Z>2 z5aeFg;j~s&{qM~1!&Y3l1jX~hy!gYl18>!<&Nea5^S|OHRb>3L>bIql9aJoIk!>ye zDjb|nuDNo0s;096z!l8(Ekz31kgr_Zv}QJQCQ8Q!Yi5M}Dn;NZX<0FTie#-%neHO8hZ?!4KWNUtMVSkDm501*L` z!F1ylG?AN@Rt$C<$Gzyo2QI(;y+p$olDOCJ-u>{_v3K>_{Ufq(Rdd!?wk{O{SH)?; zyy^b_yujI(iL5-qrfiQFj;DBIXzSVAwcjY| z!C6#H6G1-xt75GR?po3!W1m0-b}@lLdmbm6T@2_9y7X=XRWg#mN;b!Wu@YqXf4Fuy zc1*f?aOr#bARXE9WORm+{tvaNCyAcdY*gQnuIbtizm zlhZ{lWr!QDB;^_BV)$I+0A&tz9zGU7>f;pC>D(f%T2mZVfOBR!G+bjv;G4BZ&ca9q zYF9YXX~IWtrW|shn)Cc+IjcC>J`z zc%44G;cx~*e^`vc`2uUIJ_>VkQ3lPDaeB13nvM+S(m|U2X@A1=^zGhzC+9C_-Fy3T zee$M;Zzp9^U5(izzM7H6R*o&pSv+0i?6eu;crvQt$7_QYU1LjP;A~CNf;^IB;>;~- z%JbUXE-urWI;1to%ncSnsj69vVq2oYv7j-b>o%7U!1@zIDG~XdPJD}IzB3V+rASGo z;(V-UfK|}!Fxm3&Lfg>Vr3^g(Z;xrvYK!dFy%xCX`Qyei^78OGQ@#E#U(`OcS(m}8 zKWz*sl222viW+T2H?&QPY_}>VPtSlOT zds-0I;Z?;^BBJ3+;=8FHfli^)>r3o&h>VnDq=D`V0)n*ziEWaL@j4i1X%X>!Cy^=@ zsLM-rZRwnLs9~egbbg<$6fgDGzAFBTek(eGfqTeT_Q_=^fqRQ4W~sv=~xu2!fUU=Z6$prD*+hg1jv5>yC-!IFcOfQ*5` zVI(0*s1Pz45W;6@Pj*Vu=Bea4x_Zgy>b?YuGNSGO)rn$W+UkG5e(Oux-OIYZV)0mW zC+kL941xaPtNbq0{(o$);qrd5!(|zZSeGIdjr!bpO|@2*?zH4?vPoMeEP>+BC46A3 zo=frf)3>~J*|1=4coDA0fY>mIu||%f8lf2?x*OtP#_00&o%Hmxy3|KW(JUq$hVh|B zg}7BpB18kT?gQvD-13#13X;XDW`N-d@5y-zBBxX`^6)VU0?C;^;j2$>=Gm|AsI>oT zH1!Lt_WM5Z$7?X-foRx+ozRi7bV=$^w_lpPIk*gdZ1ywrj8M$igtdVg=St&KZM(mc$B3AF*SCMK;I0Cn!4Q#AXhYZr>`~v!R;mo>FG@?VMvFcJbhaFuH)`o-@{?K zoFx<+a~5uDizRN(74_!hddD<_fVSeTefwp$WTK|3ald}zu??JkR-R%Ju6`{9<<8g4 z-ILY?#+8{q{`D_I8>VgyV9$h5~Y95k;4%gSZgwNS}ov>Z}PMIH98eSPx*` z#bFMR7&Q3HI2Wz$;5OKLC};>-VbFV4t&C2PUD?24NBFlEdlwRIR9xf21)MN=@$ z?Air|wR3+MQ zJ~1bh_o_hW)nEjf(1|mJ5{6c-wGI$_$s1M+DxM`3Fr3Yx%lL64@~C})ne?c74l@BO z?0~!Bzh(*N|96&90{6AxwK3i+V`DFU51RM9zZ@C3aN+W`UtjxhVr(kV_Zv6uuAjXB z3k8zQzsr7ES6Z|4o&1?(cFV%OEa!0@dgZM>Qi=RIH;y0Zi}%LZ@@s((o~~`4UMZWi zQk3P;4^{g0J2k-mvm1~8Dp{AtEsQ}JiLFW~Q)V(kIIT5+B_T0<7?-hVcBnQche?Xj z9qtr86vVWqis3~Q6f0S9ILFxS&Hu*ZtaAjr9P3;)Ki7SnhS;6Mk_-@xeS(bHnS)4b?gj1`<&B%#_0I2Wa*s;SQJ)!|6 z6CyU<4#oNMk^2Pdm6s$J67*mY^h*Y8ZG?S;cd_Jof~?4e0_^X>wXR&r>TGq#f6Ud^ zzj@*ON#f?RUtgg8>$j$eH8A0uioeR=X!Cfdmd%Fs>(@`5=RfR^(#1w}5yOsZL8VTi zh+4ljkX-ZbqJPf%PF-Ey@)%Vc53Wl4u6UU@>*nR1iv@7_b;T}kGW!~6RiFYz{J$}> zW=v6Codn-7F=+FUwTsg$e^|sjC zRm5{9T8H?#ONIKXU=BB6GP2$+;Ar=QUkms?_69RGWvxs8Z1?7rsl2&yT}2o5gfdOR zPtpJc%{reTC=ZEE-0)`^{3Ahm#LD1p$v~i%am3EkYg4pS6k)qfSpw&3iUK=92)EQe z=g%P%ZR0j&v-CzzsJe?7rVrO>WG!=-#N|fCVPNv;16IXzXDtilwR5{Rc}E(|i{($R z=3YNFb$o|6rD}>@1JQn$@%bPnwM(cY0{>Z?%NXgbeYOgQ>Sg`8ekyjCK6)b)EVg9p zKgWMmi#^+u@RLJHpYtaAp?%&tLX-<+n<(CpPy5dpv?n90a_zQO1b~1dsBILH2#c

O}Y_LaWUs~;^a$V<9@dk}nL8^jl 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 X{1)eL*Q&ktOF6Q=mn6mj^78)yyY;mp literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/immersiveintelligence/sounds/motorbike/engine.ogg b/src/main/resources/assets/immersiveintelligence/sounds/vehicle/engine_light/engine.ogg similarity index 100% rename from src/main/resources/assets/immersiveintelligence/sounds/motorbike/engine.ogg rename to src/main/resources/assets/immersiveintelligence/sounds/vehicle/engine_light/engine.ogg diff --git a/src/main/resources/assets/immersiveintelligence/sounds/motorbike/start.ogg b/src/main/resources/assets/immersiveintelligence/sounds/vehicle/engine_light/start.ogg similarity index 100% rename from src/main/resources/assets/immersiveintelligence/sounds/motorbike/start.ogg rename to src/main/resources/assets/immersiveintelligence/sounds/vehicle/engine_light/start.ogg diff --git a/src/main/resources/assets/immersiveintelligence/sounds/motorbike/start_no_fuel.ogg b/src/main/resources/assets/immersiveintelligence/sounds/vehicle/engine_light/start_no_fuel.ogg similarity index 100% rename from src/main/resources/assets/immersiveintelligence/sounds/motorbike/start_no_fuel.ogg rename to src/main/resources/assets/immersiveintelligence/sounds/vehicle/engine_light/start_no_fuel.ogg diff --git a/src/main/resources/assets/immersiveintelligence/sounds/motorbike/horn.ogg b/src/main/resources/assets/immersiveintelligence/sounds/vehicle/horn.ogg similarity index 100% rename from src/main/resources/assets/immersiveintelligence/sounds/motorbike/horn.ogg rename to src/main/resources/assets/immersiveintelligence/sounds/vehicle/horn.ogg From 85764f7ba827c9197a036a3e5a9972f48330125d Mon Sep 17 00:00:00 2001 From: Pabilo8 Date: Fri, 29 May 2026 23:29:08 +0200 Subject: [PATCH 10/23] Added Field Anti-Air Gun model and basic functionality, added Field Howitzer model --- .../client/ClientProxy.java | 7 +- .../inworld_overlay/VehicleDebugOverlay.java | 2 +- .../entity/vehicle/FieldFlakRenderer.java | 128 + .../entity/vehicle/FieldHowitzerRenderer.java | 86 +- .../entity/vehicle/IIVehicleRenderer.java | 2 +- .../vehicle/TrackedMotorbikeRenderer.java | 4 +- .../common/CommonProxy.java | 2 + .../common/IISounds.java | 6 +- .../explosives/AmmoComponentHMX.java | 2 +- .../explosives/AmmoComponentRDX.java | 2 +- .../entity/vehicle/EntityVehicleBase.java | 29 +- .../towable/gun/EntityFieldAntiAir.java | 9 - .../vehicle/towable/gun/EntityFieldFlak.java | 258 ++ .../towable/gun/EntityFieldHowitzer.java | 129 +- .../gun/EntityFieldMissileLauncher.java | 9 - .../gun/EntityFieldRocketLauncher.java | 9 - .../towable/gun/EntityFieldSiegeMortar.java | 9 - .../entity/vehicle/utils/VehicleAction.java | 61 + .../entity/vehicle/utils/VehicleControls.java | 5 + .../vehicle/utils/part/EntityVehicleSeat.java | 16 + .../utils/part/EntityVehicleWheel.java | 6 +- .../propulsion/VehicleEngineFuelBased.java | 14 +- .../common/util/gun/GunAimCoordinate.java | 2 +- .../common/util/gun/GunShootingHandler.java | 4 +- .../vehicle/field_flak/aim_pitch.json | 219 + .../vehicle/field_flak/aim_yaw.json | 281 ++ .../vehicle/field_flak/backward.json | 677 +++ .../vehicle/field_flak/combat_position.json | 589 +++ .../animations/vehicle/field_flak/fire1.json | 165 + .../animations/vehicle/field_flak/fire2.json | 165 + .../vehicle/field_flak/fire_pedal.json | 43 + .../vehicle/field_flak/forward.json | 677 +++ .../animations/vehicle/field_flak/hook.json | 527 +++ .../vehicle/field_flak/infantry_position.json | 797 ++++ .../animations/vehicle/field_flak/left.json | 677 +++ .../animations/vehicle/field_flak/load1.json | 197 + .../animations/vehicle/field_flak/load2.json | 205 + .../animations/vehicle/field_flak/right.json | 677 +++ .../animations/vehicle/field_flak/unhook.json | 527 +++ .../vehicle/field_flak/unload1.json | 197 + .../vehicle/field_flak/unload2.json | 205 + .../vehicle/field_howitzer/aim_pitch.json | 85 + .../field_howitzer/aim_pitch_hans.json | 107 + .../vehicle/field_howitzer/backward.json | 353 ++ .../vehicle/field_howitzer/fire.json | 691 +++ .../vehicle/field_howitzer/forward.json | 353 ++ .../vehicle/field_howitzer/left.json | 353 ++ .../vehicle/field_howitzer/load.json | 889 ++++ .../vehicle/field_howitzer/right.json | 353 ++ .../vehicle/field_howitzer/setup.json | 217 + .../vehicle/tracked_motorbike/engine.json | 24 + .../tracked_motorbike/transmission.json | 29 - .../entity/vehicle/field_flak/field_flak.mtl | 12 + .../entity/vehicle/field_flak/field_flak.obj | 3724 +++++++++++++++++ .../vehicle/field_flak/field_flak.obj.amt | 85 + .../vehicle/field_howitzer/field_howitzer.mtl | 20 + .../vehicle/field_howitzer/field_howitzer.obj | 2833 +++++++++++++ .../field_howitzer/field_howitzer.obj.amt | 77 + .../common/camo_net/common_camo_net.png | Bin 0 -> 770 bytes .../vehicle/field_gun/anti_aircraft_gun.png | Bin 4269 -> 4775 bytes .../field_gun/anti_aircraft_gun_painted.png | Bin 5404 -> 6816 bytes .../vehicle/field_gun/artillery_scope.png | Bin 0 -> 489 bytes .../vehicle/field_gun/field_howitzer.png | Bin 3841 -> 4770 bytes .../field_gun/field_howitzer_painted.png | Bin 4932 -> 6434 bytes 64 files changed, 17643 insertions(+), 188 deletions(-) create mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/vehicle/FieldFlakRenderer.java delete mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldAntiAir.java create mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldFlak.java delete mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldMissileLauncher.java delete mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldRocketLauncher.java delete mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldSiegeMortar.java create mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/VehicleAction.java create mode 100644 src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/aim_pitch.json create mode 100644 src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/aim_yaw.json create mode 100644 src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/backward.json create mode 100644 src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/combat_position.json create mode 100644 src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/fire1.json create mode 100644 src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/fire2.json create mode 100644 src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/fire_pedal.json create mode 100644 src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/forward.json create mode 100644 src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/hook.json create mode 100644 src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/infantry_position.json create mode 100644 src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/left.json create mode 100644 src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/load1.json create mode 100644 src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/load2.json create mode 100644 src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/right.json create mode 100644 src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/unhook.json create mode 100644 src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/unload1.json create mode 100644 src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/unload2.json create mode 100644 src/main/resources/assets/immersiveintelligence/animations/vehicle/field_howitzer/aim_pitch.json create mode 100644 src/main/resources/assets/immersiveintelligence/animations/vehicle/field_howitzer/aim_pitch_hans.json create mode 100644 src/main/resources/assets/immersiveintelligence/animations/vehicle/field_howitzer/backward.json create mode 100644 src/main/resources/assets/immersiveintelligence/animations/vehicle/field_howitzer/fire.json create mode 100644 src/main/resources/assets/immersiveintelligence/animations/vehicle/field_howitzer/forward.json create mode 100644 src/main/resources/assets/immersiveintelligence/animations/vehicle/field_howitzer/left.json create mode 100644 src/main/resources/assets/immersiveintelligence/animations/vehicle/field_howitzer/load.json create mode 100644 src/main/resources/assets/immersiveintelligence/animations/vehicle/field_howitzer/right.json create mode 100644 src/main/resources/assets/immersiveintelligence/animations/vehicle/field_howitzer/setup.json delete mode 100644 src/main/resources/assets/immersiveintelligence/animations/vehicle/tracked_motorbike/transmission.json create mode 100644 src/main/resources/assets/immersiveintelligence/models/entity/vehicle/field_flak/field_flak.mtl create mode 100644 src/main/resources/assets/immersiveintelligence/models/entity/vehicle/field_flak/field_flak.obj create mode 100644 src/main/resources/assets/immersiveintelligence/models/entity/vehicle/field_flak/field_flak.obj.amt create mode 100644 src/main/resources/assets/immersiveintelligence/models/entity/vehicle/field_howitzer/field_howitzer.mtl create mode 100644 src/main/resources/assets/immersiveintelligence/models/entity/vehicle/field_howitzer/field_howitzer.obj create mode 100644 src/main/resources/assets/immersiveintelligence/models/entity/vehicle/field_howitzer/field_howitzer.obj.amt create mode 100644 src/main/resources/assets/immersiveintelligence/textures/blocks/common/camo_net/common_camo_net.png create mode 100644 src/main/resources/assets/immersiveintelligence/textures/entity/vehicle/field_gun/artillery_scope.png diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/ClientProxy.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/ClientProxy.java index d3d437eb2..dc6985874 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/ClientProxy.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/ClientProxy.java @@ -80,10 +80,7 @@ import pl.pabilo8.immersiveintelligence.client.render.ammunition.NavalMineRenderer.NavalMineItemstackRenderer; import pl.pabilo8.immersiveintelligence.client.render.entity.*; import pl.pabilo8.immersiveintelligence.client.render.entity.hans.HansRenderer; -import pl.pabilo8.immersiveintelligence.client.render.entity.vehicle.FieldGunRenderer; -import pl.pabilo8.immersiveintelligence.client.render.entity.vehicle.FieldHowitzerRenderer; -import pl.pabilo8.immersiveintelligence.client.render.entity.vehicle.MotorbikeRenderer; -import pl.pabilo8.immersiveintelligence.client.render.entity.vehicle.TrackedMotorbikeRenderer; +import pl.pabilo8.immersiveintelligence.client.render.entity.vehicle.*; import pl.pabilo8.immersiveintelligence.client.render.entity.weapon.MachinegunRenderer; import pl.pabilo8.immersiveintelligence.client.render.entity.weapon.MortarRenderer; import pl.pabilo8.immersiveintelligence.client.render.entity.weapon.TripodPeriscopeRenderer; @@ -144,6 +141,7 @@ import pl.pabilo8.immersiveintelligence.common.entity.vehicle.EntityDrone; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.EntityMotorbike; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.EntityTrackedMotorbike; +import pl.pabilo8.immersiveintelligence.common.entity.vehicle.towable.gun.EntityFieldFlak; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.towable.gun.EntityFieldGun; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.towable.gun.EntityFieldHowitzer; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.EntityVehicleSeat; @@ -390,6 +388,7 @@ public void preInit(FMLPreInitializationEvent event) registerEntityRenderer(EntityDrone.class, DroneRenderer::new); //Towables registerEntityRenderer(EntityFieldHowitzer.class, FieldHowitzerRenderer::new); + registerEntityRenderer(EntityFieldFlak.class, FieldFlakRenderer::new); registerEntityRenderer(EntityFieldGun.class, FieldGunRenderer::new); registerEntityRenderer(EntityTripodPeriscope.class, TripodPeriscopeRenderer::new); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/inworld_overlay/VehicleDebugOverlay.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/inworld_overlay/VehicleDebugOverlay.java index afe25c0f1..f404778d5 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/inworld_overlay/VehicleDebugOverlay.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/inworld_overlay/VehicleDebugOverlay.java @@ -42,7 +42,7 @@ public void draw(@Nonnull EntityPlayer player, @Nonnull World world, RayTraceRes double posY = player.lastTickPosY+(player.posY-player.lastTickPosY)*(double)partialTicks; double posZ = player.lastTickPosZ+(player.posZ-player.lastTickPosZ)*(double)partialTicks; boolean displayWheelBoxes = true; - boolean displayNames = true; + boolean displayNames = false; if(!Graphics.vehicleDebugOverlay) return; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/vehicle/FieldFlakRenderer.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/vehicle/FieldFlakRenderer.java new file mode 100644 index 000000000..0ad268462 --- /dev/null +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/vehicle/FieldFlakRenderer.java @@ -0,0 +1,128 @@ +package pl.pabilo8.immersiveintelligence.client.render.entity.vehicle; + +import net.minecraft.client.model.ModelBiped; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.util.math.MathHelper; +import pl.pabilo8.immersiveintelligence.client.util.amt.AMTUtils; +import pl.pabilo8.immersiveintelligence.client.util.amt.animation.IIAnimationCachedMap; +import pl.pabilo8.immersiveintelligence.client.util.amt.models.AMTCachedModelBuilder; +import pl.pabilo8.immersiveintelligence.client.util.amt.models.AMTCrossVariantReference; +import pl.pabilo8.immersiveintelligence.client.util.amt.parts.AMT; +import pl.pabilo8.immersiveintelligence.client.util.amt.parts.AMTBipedAdapter; +import pl.pabilo8.immersiveintelligence.client.util.amt.parts.AMTLocator; +import pl.pabilo8.immersiveintelligence.client.util.amt.parts.AMTParticle; +import pl.pabilo8.immersiveintelligence.client.util.amt.renderer.IIEntityRenderer.RegisteredEntityRenderer; +import pl.pabilo8.immersiveintelligence.common.entity.vehicle.towable.gun.EntityFieldFlak; +import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.EntityVehicleSeat; + +@RegisteredEntityRenderer(clazz = EntityFieldFlak.class, name = "vehicle/field_flak") +public class FieldFlakRenderer extends IIVehicleRenderer +{ + private IIAnimationCachedMap aimYaw, aimPitch, load1, load2, unload1, unload2, fire1, fire2; + private IIAnimationCachedMap forward, backward, left, right; + private AMTCrossVariantReference bipedGunner, bipedCommander; + + public FieldFlakRenderer(RenderManager renderManager) + { + super(renderManager); + } + + @Override + public void draw(EntityFieldFlak entity, BufferBuilder buf, float partialTicks, Tessellator tes) + { + //Apply vehicle transforms + double rotYaw = MathHelper.clampedLerp(entity.prevRotationYaw, entity.rotationYaw, partialTicks); + GlStateManager.rotate((float)(rotYaw-90), 0, 1, 0); + //TODO: 29.05.2026 proper rotations after Trej fixes the model + + model.getVariant(entity, entity.getStyle()); + + //Animate wheels + applyWheelAnimations(entity, partialTicks); + + //General animations + aimPitch.apply(1f-entity.aim.getPitchNormalized(partialTicks)); + aimYaw.apply(1f-entity.aim.getYawNormalized(partialTicks)); + + if(entity.ammoProviderMagazine1.isReloading()) + load1.apply(entity.ammoProviderMagazine1.getLoadingProgress(partialTicks)); + if(entity.ammoProviderMagazine2.isReloading()) + load2.apply(entity.ammoProviderMagazine2.getLoadingProgress(partialTicks)); + + //Finally, render + model.render(tes, buf); + } + + @Override + public void compileModels() + { + //Assemble main model + model = AMTCachedModelBuilder.startEntityModel(EntityFieldFlak.class) + .withModel(modelFile) + .withHeader(headerFile) + .withTextureProvider(this::replaceVehicleTextures) + .withModelProvider((entity, header) -> new AMT[]{ + new AMTBipedAdapter("hans_gunner", header), + new AMTBipedAdapter("hans_commander", header), + new AMTLocator("turret_base", header), + new AMTParticle("cannon1_fire", header), + new AMTParticle("cannon2_fire", header) + }) + .build(); + + //Passenger display references + this.bipedGunner = new AMTCrossVariantReference<>("hans_gunner", model); + this.bipedCommander = new AMTCrossVariantReference<>("hans_commander", model); + + //General animations + load1 = IIAnimationCachedMap.create(model, animationsDirectory.with("load1")); + load2 = IIAnimationCachedMap.create(model, animationsDirectory.with("load2")); + unload1 = IIAnimationCachedMap.create(model, animationsDirectory.with("unload1")); + unload2 = IIAnimationCachedMap.create(model, animationsDirectory.with("unload2")); + fire1 = IIAnimationCachedMap.create(model, animationsDirectory.with("fire1")); + fire2 = IIAnimationCachedMap.create(model, animationsDirectory.with("fire2")); + + aimYaw = IIAnimationCachedMap.create(model, animationsDirectory.with("aim_yaw")); + aimPitch = IIAnimationCachedMap.create(model, animationsDirectory.with("aim_pitch")); + + forward = IIAnimationCachedMap.create(model, animationsDirectory.with("forward")); + backward = IIAnimationCachedMap.create(model, animationsDirectory.with("backward")); + left = IIAnimationCachedMap.create(model, animationsDirectory.with("left")); + right = IIAnimationCachedMap.create(model, animationsDirectory.with("right")); + + wheelAnimations = new WheelAnimationBuilder() + .withWheel(e -> e.partWheelRight, "wheel1") + .withWheel(e -> e.partWheelLeft, "wheel2") + .build(); + } + + @Override + protected void nullifyModels() + { + AMTUtils.disposeOf(model); + } + + @Override + public boolean handleBipedRotations(ModelBiped model, EntityFieldFlak entity, EntityLivingBase passenger, float partialTicks) + { + EntityVehicleSeat seat = (EntityVehicleSeat)passenger.getRidingEntity(); + if(seat==null) + return false; + //Select animation adapter based on seat + switch(seat.info.getSeatID()) + { + case "gunner": + bipedGunner.get().applyAnimationStateTo(model); + return true; + case "commander": + bipedCommander.get().applyAnimationStateTo(model); + return true; + default: + return false; + } + } +} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/vehicle/FieldHowitzerRenderer.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/vehicle/FieldHowitzerRenderer.java index c68a813f2..14f7dc7ea 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/vehicle/FieldHowitzerRenderer.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/vehicle/FieldHowitzerRenderer.java @@ -4,20 +4,24 @@ import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.entity.RenderManager; -import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.entity.EntityLivingBase; -import pl.pabilo8.immersiveintelligence.client.util.amt.AMTLoader; import pl.pabilo8.immersiveintelligence.client.util.amt.AMTUtils; -import pl.pabilo8.immersiveintelligence.client.util.amt.models.AMTCachedModel; +import pl.pabilo8.immersiveintelligence.client.util.amt.animation.IIAnimationCachedMap; +import pl.pabilo8.immersiveintelligence.client.util.amt.models.AMTCachedModelBuilder; +import pl.pabilo8.immersiveintelligence.client.util.amt.models.AMTCrossVariantReference; +import pl.pabilo8.immersiveintelligence.client.util.amt.parts.AMT; +import pl.pabilo8.immersiveintelligence.client.util.amt.parts.AMTBipedAdapter; +import pl.pabilo8.immersiveintelligence.client.util.amt.parts.AMTParticle; import pl.pabilo8.immersiveintelligence.client.util.amt.renderer.IIEntityRenderer.RegisteredEntityRenderer; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.towable.gun.EntityFieldHowitzer; -import pl.pabilo8.immersiveintelligence.common.util.IIReference; -import pl.pabilo8.immersiveintelligence.common.util.ResLoc; +import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.EntityVehicleSeat; @RegisteredEntityRenderer(clazz = EntityFieldHowitzer.class, name = "vehicle/field_howitzer") public class FieldHowitzerRenderer extends IIVehicleRenderer { - private static AMTCachedModel model; + private IIAnimationCachedMap load, fire, aimPitch; + private IIAnimationCachedMap forward, backward, left, right; + private AMTCrossVariantReference bipedGunner, bipedCommander; public FieldHowitzerRenderer(RenderManager renderManager) { @@ -27,19 +31,63 @@ public FieldHowitzerRenderer(RenderManager renderManager) @Override public void draw(EntityFieldHowitzer entity, BufferBuilder buf, float partialTicks, Tessellator tes) { + //Apply vehicle transforms + applyVehicleTransforms(entity, partialTicks); + model.getVariant(entity, entity.getStyle()); + model.defaultize(); + //Animate wheels + applyWheelAnimations(entity, partialTicks); + + //General animations + aimPitch.apply(1f-entity.aim.getPitchNormalized(partialTicks)); + + if(entity.ammoProvider.isReloading()) + load.apply(entity.ammoProvider.getLoadingProgress(partialTicks)); + if(entity.commanderControls.getKey("forward")) + forward.apply(1f); + else if(entity.commanderControls.getKey("backwards")) + backward.apply(1f); + else if(entity.commanderControls.getKey("turnLeft")) + left.apply(1f); + else if(entity.commanderControls.getKey("turnRight")) + right.apply(1f); + + //Finally, render + model.render(tes, buf); } @Override public void compileModels() { + //Assemble main model + model = AMTCachedModelBuilder.startEntityModel(EntityFieldHowitzer.class) + .withModel(modelFile) + .withHeader(headerFile) + .withTextureProvider(this::replaceVehicleTextures) + .withModelProvider((entity, header) -> new AMT[]{ + new AMTBipedAdapter("hans_gunner", header), + new AMTBipedAdapter("hans_commander", header), + new AMTParticle("fire", header) + }) + .build(); - } + //Passenger display references + this.bipedGunner = new AMTCrossVariantReference<>("hans_gunner", model); + this.bipedCommander = new AMTCrossVariantReference<>("hans_commander", model); - @Override - public void registerSprites(TextureMap map) - { - AMTLoader.preloadTexturesFromMTL(ResLoc.of(IIReference.RES_ENTITY_MODEL, "vehicle/field_howitzer/field_howitzer.obj").withExtension(ResLoc.EXT_MTL), map); + //General animations + load = IIAnimationCachedMap.create(model, animationsDirectory.with("load")); + fire = IIAnimationCachedMap.create(model, animationsDirectory.with("fire")); + aimPitch = IIAnimationCachedMap.create(model, animationsDirectory.with("aim_pitch")); + forward = IIAnimationCachedMap.create(model, animationsDirectory.with("forward")); + backward = IIAnimationCachedMap.create(model, animationsDirectory.with("backward")); + left = IIAnimationCachedMap.create(model, animationsDirectory.with("left")); + right = IIAnimationCachedMap.create(model, animationsDirectory.with("right")); + wheelAnimations = new WheelAnimationBuilder() + .withWheel(e -> e.partWheelRight, "wheel1") + .withWheel(e -> e.partWheelLeft, "wheel2") + .build(); } @Override @@ -51,6 +99,20 @@ protected void nullifyModels() @Override public boolean handleBipedRotations(ModelBiped model, EntityFieldHowitzer entity, EntityLivingBase passenger, float partialTicks) { - return false; + EntityVehicleSeat seat = (EntityVehicleSeat)passenger.getRidingEntity(); + if(seat==null) + return false; + //Select animation adapter based on seat + switch(seat.info.getSeatID()) + { + case "gunner": + bipedGunner.get().applyAnimationStateTo(model); + return true; + case "commander": + bipedCommander.get().applyAnimationStateTo(model); + return true; + default: + return false; + } } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/vehicle/IIVehicleRenderer.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/vehicle/IIVehicleRenderer.java index 2143e0ed4..378512e5e 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/vehicle/IIVehicleRenderer.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/vehicle/IIVehicleRenderer.java @@ -51,7 +51,7 @@ public abstract class IIVehicleRenderer> extends protected ResLoc modelDirectory, animationsDirectory; protected ResLoc modelFile, headerFile, mtlFile; - protected IIVehicleRenderer(RenderManager render) + public IIVehicleRenderer(RenderManager render) { super(render); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/vehicle/TrackedMotorbikeRenderer.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/vehicle/TrackedMotorbikeRenderer.java index 5f2cf652a..b559dae48 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/vehicle/TrackedMotorbikeRenderer.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/vehicle/TrackedMotorbikeRenderer.java @@ -23,7 +23,7 @@ @RegisteredEntityRenderer(clazz = EntityFieldHowitzer.class, name = "vehicle/tracked_motorbike") public class TrackedMotorbikeRenderer extends IIVehicleRenderer { - private IIAnimationCachedMap engine, engineStarting, transmission, turn, passengerDefault; + private IIAnimationCachedMap engine, engineStarting, turn, passengerDefault; private IIAnimationCachedMap gearPrimary, gearSecondary; private IIAnimationCachedMap gearPrimaryReverse, gearPrimary1, gearPrimary2, gearSecondaryOverdrive, gearSecondaryReduction; private AMTCrossVariantReference trackLeft, trackRight; @@ -51,7 +51,6 @@ public void draw(EntityTrackedMotorbike entity, BufferBuilder buf, float partial //General animations passengerDefault.apply(0); turn.apply((entity.partWheelFront.getSteeringAngle()/45f)*-0.5f+0.5f); - transmission.apply(AMTUtils.getDebugProgress(8, partialTicks)); //Gearbox animations applyGearboxAnimation(entity.transmission1, gearSecondary, partialTicks, gearSecondaryOverdrive); @@ -105,7 +104,6 @@ public void compileModels() //General animations engine = IIAnimationCachedMap.create(model, animationsDirectory.with("engine")); engineStarting = IIAnimationCachedMap.create(model, animationsDirectory.with("start_engine")); - transmission = IIAnimationCachedMap.create(model, animationsDirectory.with("transmission")); turn = IIAnimationCachedMap.create(model, animationsDirectory.with("turn")); passengerDefault = IIAnimationCachedMap.create(model, animationsDirectory.with("hans_default")); wheelAnimations = new WheelAnimationBuilder() diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/CommonProxy.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/CommonProxy.java index 8c740785c..83c21f4ff 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/CommonProxy.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/CommonProxy.java @@ -109,6 +109,7 @@ import pl.pabilo8.immersiveintelligence.common.entity.vehicle.EntityDrone; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.EntityMotorbike; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.EntityTrackedMotorbike; +import pl.pabilo8.immersiveintelligence.common.entity.vehicle.towable.gun.EntityFieldFlak; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.towable.gun.EntityFieldGun; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.towable.gun.EntityFieldHowitzer; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.EntityVehicleSeat; @@ -730,6 +731,7 @@ public void init(FMLInitializationEvent event) registerEntity(i++, EntityMotorbike.class, "motorbike", 64, 1, false); registerEntity(i++, EntityTrackedMotorbike.class, "tracked_motorbike", 64, 1, false); registerEntity(i++, EntityFieldHowitzer.class, "field_howitzer", 64, 1, false); + registerEntity(i++, EntityFieldFlak.class, "field_flak", 64, 1, false); registerEntity(i++, EntityFieldGun.class, "field_gun", 64, 1, false); registerEntity(i++, EntityTripodPeriscope.class, "tripod_periscope", 64, 1, true); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/IISounds.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/IISounds.java index e4f6dc474..2c0d33009 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/IISounds.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/IISounds.java @@ -522,11 +522,11 @@ public class IISounds @ModSound(sounds = {"vehicle/horn"}, subtitle = "*") public static SoundEvent vehicleHorn = registerSound("vehicle_horn"); @ModSound(sounds = {"vehicle/engine_light/start"}, subtitle = "*") - public static SoundEvent engineLightStart = registerSound("light_engine_start"); + public static SoundEvent engineLightStart = registerSound("engine_light_start"); @ModSound(sounds = {"vehicle/engine_light/start_no_fuel"}, subtitle = "light_engine_start") - public static SoundEvent engineLightStartNoFuel = registerSound("light_engine_start_no_fuel"); + public static SoundEvent engineLightStartNoFuel = registerSound("engine_light_start_no_fuel"); @ModSound(sounds = {"vehicle/engine_light/engine"}, subtitle = "*") - public static SoundEvent engineLight = registerSound("light_engine"); + public static SoundEvent engineLight = registerSound("engine_light"); public static MultiSound engineLightLoop = new MultiSound(engineLight); //--- Aircraft ---// diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/ammo/components/explosives/AmmoComponentHMX.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/ammo/components/explosives/AmmoComponentHMX.java index 0f3efcf67..dfa355456 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/ammo/components/explosives/AmmoComponentHMX.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/ammo/components/explosives/AmmoComponentHMX.java @@ -34,7 +34,7 @@ public IngredientStack getMaterial() public void onEffect(World world, Vec3d pos, Vec3d dir, ComponentEffectShape shape, NBTTagCompound tag, float componentSize, float multiplier, Entity owner) { new IIExplosion(world, owner, pos, dir, - 12*componentSize, 18*multiplier, shape, false, componentSize > 0.125f, false) + 10*componentSize, 16*multiplier, shape, false, componentSize > 0.125f, false) .doExplosion(); } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/ammo/components/explosives/AmmoComponentRDX.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/ammo/components/explosives/AmmoComponentRDX.java index 20d77a1ca..fa4783b12 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/ammo/components/explosives/AmmoComponentRDX.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/ammo/components/explosives/AmmoComponentRDX.java @@ -34,7 +34,7 @@ public IngredientStack getMaterial() public void onEffect(World world, Vec3d pos, Vec3d dir, ComponentEffectShape shape, NBTTagCompound tag, float componentSize, float multiplier, Entity owner) { new IIExplosion(world, owner, pos, dir, - 9*componentSize, 10*multiplier, shape, false, componentSize > 0.125f, false) + 8*componentSize, 8*multiplier, shape, false, componentSize > 0.125f, false) .doExplosion(); } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/EntityVehicleBase.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/EntityVehicleBase.java index af08b1002..060276f36 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/EntityVehicleBase.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/EntityVehicleBase.java @@ -1,5 +1,6 @@ package pl.pabilo8.immersiveintelligence.common.entity.vehicle; +import blusunrize.immersiveengineering.common.util.Utils; import com.google.common.collect.Sets; import net.minecraft.entity.Entity; import net.minecraft.entity.IEntityMultiPart; @@ -66,9 +67,9 @@ public abstract class EntityVehicleBase> extends //--- Systems ---// @SyncNBT(events = SyncEvents.TILE_UPGRADES_MODIFIED) - protected StyleCustomization style; + public StyleCustomization style; @SyncNBT(events = SyncEvents.TILE_UPGRADES_MODIFIED) - protected UpgradeManager upgradeManager; + public UpgradeManager upgradeManager; //--- Motion & Orientation ---// @SyncNBT(events = SyncEvents.ENTITY_DAMAGED) @@ -110,7 +111,7 @@ protected final void entityInit() //noinspection unchecked this.upgradeManager = ((UpgradeManager)new UpgradeManager<>(this)); this.style = new StyleCustomization(getVehicleStyleConstraints()); - this.style.withColor(IIColor.fromHSV(14/64f, 0.35f, 0.85f)); + this.style.withColor(IIColor.fromHSV(Utils.RAND.nextInt(64)/64f, 0.35f, 0.85f)); //Calculate vehicle size and collect wheels double minX = Integer.MAX_VALUE, minY = Integer.MAX_VALUE, minZ = Integer.MAX_VALUE; @@ -211,11 +212,9 @@ public final void onUpdate() updateParts(); //Send an update to the clients after a collision, client has some errors in collision handling + //hasCollidedBefore = true; if(!this.world.isRemote&&!hasCollidedBefore&&collidedHorizontally) - { - //hasCollidedBefore = true; sendServerPositionMotionUpdate(); - } } /** @@ -345,24 +344,24 @@ private void calculateForceBasedOrientation() double verticalForce = wheel.getVerticalForceBalance(); //Front/Rear classification - if(wheel.offset.x > 0) + if(wheel.offset.x >= 0) { frontForce += verticalForce; frontWheels++; } - else + if(wheel.offset.x <= 0) { rearForce += verticalForce; rearWheels++; } //Left/Right classification - if(wheel.offset.z > 0) + if(wheel.offset.z >= 0) { rightForce += verticalForce; rightWheels++; } - else + if(wheel.offset.z <= 0) { leftForce += verticalForce; leftWheels++; @@ -544,17 +543,13 @@ private Vec3d handleCollisions(Vec3d currentPos, Vec3d attemptedMove) //First pass: Find the most restrictive Y movement from ALL collision boxes for(AxisAlignedBB collisionBox : collisions) - { if(mostRestrictiveY!=0) { double yOffset = collisionBox.calculateYOffset(tempBB, mostRestrictiveY); //Take the most restrictive (smallest absolute value) Y movement if(Math.abs(yOffset) < Math.abs(mostRestrictiveY)) - { mostRestrictiveY = yOffset; - } } - } //Apply the Y movement first if(mostRestrictiveY!=partAdjustedMove.y) @@ -569,7 +564,6 @@ private Vec3d handleCollisions(Vec3d currentPos, Vec3d attemptedMove) //Second pass: Find the most restrictive X movement for(AxisAlignedBB collisionBox : collisions) - { if(mostRestrictiveX!=0) { double xOffset = collisionBox.calculateXOffset(tempBB, mostRestrictiveX); @@ -579,17 +573,13 @@ private Vec3d handleCollisions(Vec3d currentPos, Vec3d attemptedMove) collided = collidedHorizontally = true; } } - } //Apply X movement if(mostRestrictiveX!=partAdjustedMove.x) - { tempBB = tempBB.offset(mostRestrictiveX, 0.0D, 0.0D); - } //Third pass: Find the most restrictive Z movement for(AxisAlignedBB collisionBox : collisions) - { if(mostRestrictiveZ!=0) { double zOffset = collisionBox.calculateZOffset(tempBB, mostRestrictiveZ); @@ -599,7 +589,6 @@ private Vec3d handleCollisions(Vec3d currentPos, Vec3d attemptedMove) collided = collidedHorizontally = true; } } - } partAdjustedMove = new Vec3d(mostRestrictiveX, mostRestrictiveY, mostRestrictiveZ); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldAntiAir.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldAntiAir.java deleted file mode 100644 index 19982bca7..000000000 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldAntiAir.java +++ /dev/null @@ -1,9 +0,0 @@ -package pl.pabilo8.immersiveintelligence.common.entity.vehicle.towable.gun; - -/** - * @author Pabilo8 (pabilo@iiteam.net) - * @since 29.09.2025 - */ -public class EntityFieldAntiAir -{ -} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldFlak.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldFlak.java new file mode 100644 index 000000000..1b5428397 --- /dev/null +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldFlak.java @@ -0,0 +1,258 @@ +package pl.pabilo8.immersiveintelligence.common.entity.vehicle.towable.gun; + +import blusunrize.immersiveengineering.client.ClientUtils; +import net.minecraft.client.settings.GameSettings; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.EnumHand; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; +import pl.pabilo8.immersiveintelligence.api.ammo.utils.AmmoFactory; +import pl.pabilo8.immersiveintelligence.api.utils.camera.ICameraEntity; +import pl.pabilo8.immersiveintelligence.client.ClientProxy; +import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Vehicles.FieldHowitzer; +import pl.pabilo8.immersiveintelligence.common.IISounds; +import pl.pabilo8.immersiveintelligence.common.entity.ammo.types.EntityAmmoProjectile; +import pl.pabilo8.immersiveintelligence.common.entity.vehicle.towable.EntityVehicleTowable; +import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleBlueprint; +import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleControls; +import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleControls.MouseBinding; +import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleType; +import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.EntityVehiclePart; +import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.EntityVehicleSeat; +import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.EntityVehicleSeat.SeatInfo; +import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.EntityVehicleWheel; +import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.WheelType; +import pl.pabilo8.immersiveintelligence.common.item.ammo.ItemIIBulletMagazine.Magazines; +import pl.pabilo8.immersiveintelligence.common.util.IIMath; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT.SyncEvents; +import pl.pabilo8.immersiveintelligence.common.util.entity.SyncedDurability; +import pl.pabilo8.immersiveintelligence.common.util.gun.GunAimCoordinate; +import pl.pabilo8.immersiveintelligence.common.util.gun.GunAmmoProvider; +import pl.pabilo8.immersiveintelligence.common.util.gun.GunShootingHandler; +import pl.pabilo8.immersiveintelligence.common.util.gun.ammoprovider.GunAmmoProviderMagazine; + +/** + * @author Pabilo8 (pabilo@iiteam.net) + * @since 29.09.2025 + */ +@VehicleBlueprint(id = "immersiveintelligence:towed/field_flak", mass = 4, type = VehicleType.TOWED_WEAPON) +public class EntityFieldFlak extends EntityVehicleTowable implements ICameraEntity +{ + //--- AABBs ---// + static final AxisAlignedBB AABB_WHEEL = new AxisAlignedBB(-0.25, 0d, 0.25, 0.25, 1d, -0.25); + static final AxisAlignedBB AABB_MAIN = new AxisAlignedBB(-0.5, 0.125d, -0.5, 0.5, 0.625, 0.5); + static final AxisAlignedBB AABB_GUN = new AxisAlignedBB(-0.35, 0.25d, 0.35, 0.35, 1d, -0.35); + static final AxisAlignedBB AABB_SHIELD = new AxisAlignedBB(-0.35, 0d, -0.35, 0.35, 1.25d, 0.35); + + //--- Entity Variables ---// + private AmmoFactory ammoFactory; + public SeatInfo seatCommander, seatGunner; + public EntityVehicleWheel partWheelRight; + public EntityVehicleWheel partWheelLeft; + + @SyncNBT(events = SyncEvents.ENTITY_DAMAGED) + public SyncedDurability durabilityRightWheel, durabilityLeftWheel, durabilityGun, durabilityShield; + @SyncNBT(events = SyncEvents.ENTITY_VEHICLE_CONTROLS) + public VehicleControls commanderControls, gunnerControls; + + @SyncNBT(events = SyncEvents.ENTITY_CUSTOM1) + public GunAimCoordinate aim; + @SyncNBT(events = SyncEvents.ENTITY_CUSTOM1) + public GunShootingHandler shootingHandler1, shootingHandler2; + @SyncNBT(events = SyncEvents.ENTITY_CUSTOM1) + public GunAmmoProvider ammoProviderMagazine1, ammoProviderMagazine2; + private EntityVehiclePart partGun; + + public EntityFieldFlak(World world) + { + super(world); + } + + @SuppressWarnings("unchecked") + @Override + protected EntityVehiclePart[] vehicleInit() + { + //Gun internals + this.ammoFactory = new AmmoFactory<>(this); + this.aim = new GunAimCoordinate() + .withPitchLimit(-89, 13.5f) + .withYawLimit(-180, 180) + .withCenterYaw(this.rotationYaw); + //Gun 1 + this.shootingHandler1 = new GunShootingHandler() + .withAmmoFactory(this.ammoFactory) + .withMaxShotDelay(3) + .withAmmoProvider(this.ammoProviderMagazine1 = new GunAmmoProviderMagazine(this, () -> EntityVehicleSeat.getPassengerOnSeat(seatGunner), + Magazines.AUTOCANNON, FieldHowitzer.reloadTime + )) + .withShootSound(IISounds.autocannonShot, 40); + //Gun 2 + this.shootingHandler2 = new GunShootingHandler() + .withAmmoFactory(this.ammoFactory) + .withMaxShotDelay(3) + .withAmmoProvider(this.ammoProviderMagazine2 = new GunAmmoProviderMagazine(this, () -> EntityVehicleSeat.getPassengerOnSeat(seatGunner), + Magazines.AUTOCANNON, FieldHowitzer.reloadTime + )) + .withShootSound(IISounds.autocannonShot, 40); + + //Hitboxes + this.durabilityRightWheel = new SyncedDurability(FieldHowitzer.wheelDurability, 4); + this.durabilityLeftWheel = new SyncedDurability(FieldHowitzer.wheelDurability, 4); + this.durabilityGun = new SyncedDurability(FieldHowitzer.gunDurability, 14) + .withParent(this.durabilityMain); + this.durabilityShield = new SyncedDurability(FieldHowitzer.shieldDurability, 32) + .withParent(this.durabilityMain); + + //Controls + this.commanderControls = new VehicleControls().withStates("forward", "backwards", "turnLeft", "turnRight"); + this.gunnerControls = new VehicleControls().withStates("up", "down", "fire", "reload"); + if(world.isRemote) + { + GameSettings settings = ClientUtils.mc().gameSettings; + this.commanderControls + .withKeyBinding(settings.keyBindForward, "forward") + .withKeyBinding(settings.keyBindBack, "backwards") + .withKeyBinding(settings.keyBindLeft, "turnLeft") + .withKeyBinding(settings.keyBindRight, "turnRight"); + this.gunnerControls + .withMouseBinding(MouseBinding.MOUSE_RIGHT, "fire") + .withKeyBinding(ClientProxy.keybindZoom, "scope") + .withKeyBinding(ClientProxy.keybindManualReload, "reload"); + } + + //Seats + this.seatCommander = new SeatInfo<>(this, "commander") + .withSettings(false, new Vec3d(-0.25, 0, 0.75)) + .withControls(this.commanderControls); + this.seatGunner = new SeatInfo<>(this, "gunner") + .withSettings(false, new Vec3d(-0.25, 0, -0.75)) + .withControls(this.gunnerControls); + + //Parts + return new EntityVehiclePart[]{ + partWheelRight = new EntityVehicleWheel<>(this, "wheel_right", new Vec3d(0, 0, 0.75), AABB_WHEEL) + .withHitbox(durabilityRightWheel) + .withType(WheelType.STEERABLE_DRIVE), + partWheelLeft = new EntityVehicleWheel<>(this, "wheel_left", new Vec3d(0, 0, -0.75), AABB_WHEEL) + .withHitbox(durabilityLeftWheel) + .withType(WheelType.STEERABLE_DRIVE), + new EntityVehiclePart<>(this, "main", new Vec3d(0, 0.5, 0), + new AxisAlignedBB(-0.5, -0.25, -0.5, 0.5, 0.25, 0.5)) + .withHitbox(durabilityMain) + .withSeat(seatCommander), + new EntityVehiclePart<>(this, "main2", new Vec3d(-0.75, 0.5, 0), + new AxisAlignedBB(-0.5, -0.125, -0.5, 0.5, 0.125, 0.5)) + .withHitbox(durabilityMain) + .withSeat(seatGunner), + this.partGun = new EntityVehiclePart<>(this, "gun", new Vec3d(0.5, 0.65, 0), AABB_GUN) + .withHitbox(durabilityGun), + new EntityVehiclePart<>(this, "shield_right", new Vec3d(0.5, 0.385+0.125, 0.75), AABB_SHIELD) + .withHitbox(durabilityShield), + new EntityVehiclePart<>(this, "shield_left", new Vec3d(0.5, 0.385+0.125, -0.75), AABB_SHIELD) + .withHitbox(durabilityShield), + }; + } + + //--- Main ---// + + @Override + protected void onVehicleUpdate() + { + this.aim.update(); + this.shootingHandler1.update(); + this.shootingHandler2.update(); + Entity gunner = EntityVehicleSeat.getPassengerOnSeat(seatGunner); + this.ammoFactory.setShooterAndGun(gunner, this) + .setPositionAndVelocity(partGun.getPositionVector(), this.aim, 3f, 1f); + + //Intentionally swapped, because it's a push-gun, and that's how pushing works + float right = this.commanderControls.getKey("turnLeft")?0.5f: 0; + float left = this.commanderControls.getKey("turnRight")?0.5f: 0; + boolean backwards = this.commanderControls.getKey("backwards"); + if(backwards||this.commanderControls.getKey("forward")) + { + left = Math.max(0.5f, left+0.25f)*(backwards?-1: 1); + right = Math.max(0.5f, right+0.25f)*(backwards?-1: 1); + } + + partWheelLeft.setRotationSpeed(360f*left); + partWheelLeft.setTorque(5f*left); + partWheelRight.setRotationSpeed(360f*right); + partWheelRight.setTorque(5f*right); + + //Gunner controls + if(gunner!=null) + { + //Gun aiming + this.aim.setTarget(aim.clampYawToRange(gunner.getRotationYawHead()), aim.clampPitchToRange(gunner.rotationPitch)); + + //Gun reloading + if(this.gunnerControls.getKey("reload")) + { + this.shootingHandler1.startReloading(); + this.shootingHandler2.startReloading(); + } + + //Gun firing + if(this.gunnerControls.getKey("fire")) + { + if(!this.shootingHandler1.canShoot()) + this.shootingHandler2.fire(); + else + this.shootingHandler1.fire(); + } + } + } + + + //--- Parts Handling ---// + + @Override + public void onSeatDismount(String seatID, Entity passenger) + { + + } + + @Override + public boolean onInteractWithPart(EntityVehiclePart part, EntityPlayer player, EnumHand hand) + { + if(!world.isRemote&&!towingOperation) + { + if(part.partName.contains("right")) + EntityVehicleSeat.enterSeat(player, seatCommander); + else if(part.partName.contains("left")) + EntityVehicleSeat.enterSeat(player, seatGunner); + return true; + } + return false; + } + + //--- ICameraEntity ---// + + @Override + public float getCameraPitch(EntityPlayer cameraPlayer, float partialTicks) + { + return (float)IIMath.clampedLerp(cameraPlayer.prevCameraYaw, cameraPlayer.cameraYaw, partialTicks); + } + + @Override + public float getCameraYaw(EntityPlayer cameraPlayer, float partialTicks) + { + return (float)IIMath.clampedLerp(cameraPlayer.prevCameraYaw, cameraPlayer.cameraYaw, partialTicks); + } + + @Override + public Vec3d getCameraPos(EntityPlayer cameraPlayer, float partialTicks) + { + return cameraPlayer.getLook(partialTicks); + } + + @Override + public boolean isCameraEnabled(EntityPlayer player) + { + return false; + } +} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldHowitzer.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldHowitzer.java index 99a76e991..ede338be6 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldHowitzer.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldHowitzer.java @@ -1,27 +1,24 @@ package pl.pabilo8.immersiveintelligence.common.entity.vehicle.towable.gun; import blusunrize.immersiveengineering.client.ClientUtils; -import net.minecraft.client.Minecraft; import net.minecraft.client.settings.GameSettings; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; import net.minecraft.util.EnumHand; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; import pl.pabilo8.immersiveintelligence.api.ammo.utils.AmmoFactory; import pl.pabilo8.immersiveintelligence.api.utils.camera.ICameraEntity; -import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedZoom; import pl.pabilo8.immersiveintelligence.client.ClientProxy; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Vehicles.FieldHowitzer; import pl.pabilo8.immersiveintelligence.common.IIContent; +import pl.pabilo8.immersiveintelligence.common.IISounds; import pl.pabilo8.immersiveintelligence.common.entity.ammo.types.EntityAmmoArtilleryProjectile; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.towable.EntityVehicleTowable; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleBlueprint; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleControls; +import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleControls.MouseBinding; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleType; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.EntityVehiclePart; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.EntityVehicleSeat; @@ -32,6 +29,10 @@ import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT; import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT.SyncEvents; import pl.pabilo8.immersiveintelligence.common.util.entity.SyncedDurability; +import pl.pabilo8.immersiveintelligence.common.util.gun.GunAimCoordinate; +import pl.pabilo8.immersiveintelligence.common.util.gun.GunAmmoProvider; +import pl.pabilo8.immersiveintelligence.common.util.gun.GunShootingHandler; +import pl.pabilo8.immersiveintelligence.common.util.gun.ammoprovider.GunAmmoProviderSingle; /** * @author Pabilo8 (pabilo@iiteam.net) @@ -49,26 +50,21 @@ public class EntityFieldHowitzer extends EntityVehicleTowable ammoFactory; public SeatInfo seatCommander, seatGunner; + public EntityVehicleWheel partWheelRight; + public EntityVehicleWheel partWheelLeft; @SyncNBT(events = SyncEvents.ENTITY_DAMAGED) public SyncedDurability durabilityRightWheel, durabilityLeftWheel, durabilityGun, durabilityShield; @SyncNBT(events = SyncEvents.ENTITY_VEHICLE_CONTROLS) public VehicleControls commanderControls, gunnerControls; - @SyncNBT - public boolean alreadyShot = false; - @SyncNBT - public ItemStack shell = ItemStack.EMPTY; - @SyncNBT - public float shootingProgress = 0f, reloadProgress = 0f, gunPitch = 0f; - - public EntityVehicleWheel partWheelRight; - public EntityVehicleWheel partWheelLeft; - public EntityVehiclePart partMain; - public EntityVehiclePart partMain2; - public EntityVehiclePart partGun; - public EntityVehiclePart partShieldRight; - public EntityVehiclePart partShieldLeft; + @SyncNBT(events = SyncEvents.ENTITY_CUSTOM1) + public GunAimCoordinate aim; + @SyncNBT(events = SyncEvents.ENTITY_CUSTOM1) + public GunShootingHandler shootingHandler; + @SyncNBT(events = SyncEvents.ENTITY_CUSTOM1) + public GunAmmoProvider ammoProvider; + private EntityVehiclePart partGun; public EntityFieldHowitzer(World worldIn) { @@ -79,8 +75,18 @@ public EntityFieldHowitzer(World worldIn) @Override protected EntityVehiclePart[] vehicleInit() { - //Projectile entity spawner + //Gun internals this.ammoFactory = new AmmoFactory<>(this); + this.aim = new GunAimCoordinate() + .withPitchLimit(-75, 15); + this.ammoProvider = new GunAmmoProviderSingle<>(this, + () -> EntityVehicleSeat.getPassengerOnSeat(seatGunner), + IIContent.itemAmmoLightArtillery, FieldHowitzer.reloadTime + ); + this.shootingHandler = new GunShootingHandler() + .withAmmoFactory(this.ammoFactory) + .withAmmoProvider(this.ammoProvider) + .withShootSound(IISounds.howitzerShot, 50); //Hitboxes this.durabilityRightWheel = new SyncedDurability(FieldHowitzer.wheelDurability, 4); @@ -102,9 +108,9 @@ protected EntityVehiclePart[] vehicleInit() .withKeyBinding(settings.keyBindLeft, "turnLeft") .withKeyBinding(settings.keyBindRight, "turnRight"); this.gunnerControls - .withKeyBinding(ClientProxy.keybindVehicleGunUp, "up") - .withKeyBinding(ClientProxy.keybindVehicleGunDown, "down") - .withKeyBinding(settings.keyBindJump, "fire") + .withKeyBinding(settings.keyBindForward, "up") + .withKeyBinding(settings.keyBindBack, "down") + .withMouseBinding(MouseBinding.MOUSE_RIGHT, "fire") .withKeyBinding(ClientProxy.keybindZoom, "scope") .withKeyBinding(ClientProxy.keybindManualReload, "reload"); } @@ -125,19 +131,19 @@ protected EntityVehiclePart[] vehicleInit() partWheelLeft = new EntityVehicleWheel<>(this, "wheel_left", new Vec3d(0, 0, -0.75), AABB_WHEEL) .withHitbox(durabilityLeftWheel) .withType(WheelType.STEERABLE_DRIVE), - partMain = new EntityVehiclePart<>(this, "main", new Vec3d(0, 0.5, 0), + new EntityVehiclePart<>(this, "main", new Vec3d(0, 0.5, 0), new AxisAlignedBB(-0.5, -0.25, -0.5, 0.5, 0.25, 0.5)) .withHitbox(durabilityMain) .withSeat(seatCommander), - partMain2 = new EntityVehiclePart<>(this, "main2", new Vec3d(-0.75, 0.5, 0), + new EntityVehiclePart<>(this, "main2", new Vec3d(-0.75, 0.5, 0), new AxisAlignedBB(-0.5, -0.125, -0.5, 0.5, 0.125, 0.5)) .withHitbox(durabilityMain) .withSeat(seatGunner), - partGun = new EntityVehiclePart<>(this, "gun", new Vec3d(0.5, 0.65, 0), AABB_GUN) + this.partGun = new EntityVehiclePart<>(this, "gun", new Vec3d(0.5, 0.65, 0), AABB_GUN) .withHitbox(durabilityGun), - partShieldRight = new EntityVehiclePart<>(this, "shield_right", new Vec3d(0.5, 0.385+0.125, 0.75), AABB_SHIELD) + new EntityVehiclePart<>(this, "shield_right", new Vec3d(0.5, 0.385+0.125, 0.75), AABB_SHIELD) .withHitbox(durabilityShield), - partShieldLeft = new EntityVehiclePart<>(this, "shield_left", new Vec3d(0.5, 0.385+0.125, -0.75), AABB_SHIELD) + new EntityVehiclePart<>(this, "shield_left", new Vec3d(0.5, 0.385+0.125, -0.75), AABB_SHIELD) .withHitbox(durabilityShield), }; } @@ -147,34 +153,38 @@ protected EntityVehiclePart[] vehicleInit() @Override protected void onVehicleUpdate() { + this.aim.update(); + this.shootingHandler.update(); + this.ammoFactory.setShooterAndGun(EntityVehicleSeat.getPassengerOnSeat(seatGunner), this) + .setPositionAndVelocity(partGun.getPositionVector(), this.aim, 1f, 1f); + + //Intentionally swapped, because it's a push-gun, and that's how pushing works + float right = this.commanderControls.getKey("turnLeft")?0.5f: 0; + float left = this.commanderControls.getKey("turnRight")?0.5f: 0; boolean backwards = this.commanderControls.getKey("backwards"); - float right = 0, left = 0; - - // - if(this.commanderControls.getKey("turnLeft")) - right += 0.25f; - else if(this.commanderControls.getKey("turnRight")) - left += 0.25f; - if(this.commanderControls.getKey("forward")||backwards) + if(backwards||this.commanderControls.getKey("forward")) { - left = 0.25f; - right = 0.25f; - if(backwards) - { - left *= -1; - right *= -1; - } + left = Math.max(0.5f, left+0.25f)*(backwards?-1: 1); + right = Math.max(0.5f, right+0.25f)*(backwards?-1: 1); } + partWheelLeft.setRotationSpeed(360f*left); + partWheelLeft.setTorque(5f*left); + partWheelRight.setRotationSpeed(360f*right); + partWheelRight.setTorque(5f*right); + + //Gun elevation + this.aim.withCenterYaw(this.rotationYaw); if(this.gunnerControls.getKey("up")) - gunPitch = Math.min(gunPitch+1f, 76.5f); + this.aim.setTarget(0, this.aim.getTargetPitch()-0.5f); else if(this.gunnerControls.getKey("down")) - gunPitch = Math.max(gunPitch-1f, -12.5f-12.5f); + this.aim.setTarget(0, this.aim.getTargetPitch()+0.5f); - //TODO: 03.12.2025 moving - /*partWheelLeft.setMovementFactors(left, 0); - partWheelRight.setMovementFactors(right, 0);*/ + if(this.gunnerControls.getKey("reload")) + this.shootingHandler.startReloading(); + else if(this.gunnerControls.getKey("fire")) + this.shootingHandler.fire(); } @@ -191,10 +201,10 @@ public boolean onInteractWithPart(EntityVehiclePart part, E { if(!world.isRemote&&!towingOperation) { - if(part==partShieldRight||part==partWheelRight) - player.startRiding(EntityVehicleSeat.getOrCreateSeat(seatCommander)); - else if(part==partShieldLeft||part==partWheelLeft) - player.startRiding(EntityVehicleSeat.getOrCreateSeat(seatGunner)); + if(part.partName.contains("right")) + EntityVehicleSeat.enterSeat(player, seatCommander); + else if(part.partName.contains("left")) + EntityVehicleSeat.enterSeat(player, seatGunner); return true; } return false; @@ -223,19 +233,6 @@ public Vec3d getCameraPos(EntityPlayer cameraPlayer, float partialTicks) @Override public boolean isCameraEnabled(EntityPlayer player) { - return seatGunner!=null&&seatGunner.isClientPlayerOnSeat(); - } - - @Override - public IAdvancedZoom getZoom() - { - return Minecraft.getMinecraft().player.getHeldItem(EnumHand.MAIN_HAND).getItem()==IIContent.itemBinoculars?IIContent.itemBinoculars: null; - } - - @SideOnly(Side.CLIENT) - @Override - public ItemStack getZoomStack() - { - return Minecraft.getMinecraft().player.getHeldItem(EnumHand.MAIN_HAND); + return false;//seatGunner!=null&&seatGunner.isClientPlayerOnSeat(); } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldMissileLauncher.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldMissileLauncher.java deleted file mode 100644 index f87151e2e..000000000 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldMissileLauncher.java +++ /dev/null @@ -1,9 +0,0 @@ -package pl.pabilo8.immersiveintelligence.common.entity.vehicle.towable.gun; - -/** - * @author Pabilo8 (pabilo@iiteam.net) - * @since 29.09.2025 - */ -public class EntityFieldMissileLauncher -{ -} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldRocketLauncher.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldRocketLauncher.java deleted file mode 100644 index ca6969d23..000000000 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldRocketLauncher.java +++ /dev/null @@ -1,9 +0,0 @@ -package pl.pabilo8.immersiveintelligence.common.entity.vehicle.towable.gun; - -/** - * @author Pabilo8 (pabilo@iiteam.net) - * @since 29.09.2025 - */ -public class EntityFieldRocketLauncher -{ -} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldSiegeMortar.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldSiegeMortar.java deleted file mode 100644 index e6da713c2..000000000 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldSiegeMortar.java +++ /dev/null @@ -1,9 +0,0 @@ -package pl.pabilo8.immersiveintelligence.common.entity.vehicle.towable.gun; - -/** - * @author Pabilo8 (pabilo@iiteam.net) - * @since 29.09.2025 - */ -public class EntityFieldSiegeMortar -{ -} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/VehicleAction.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/VehicleAction.java new file mode 100644 index 000000000..e4597b120 --- /dev/null +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/VehicleAction.java @@ -0,0 +1,61 @@ +package pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils; + +import net.minecraft.client.settings.KeyBinding; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.VehicleControls.MouseBinding; +import pl.pabilo8.immersiveintelligence.common.util.ResLoc; + +/** + * Represents an action for a vehicle, like shooting a gun or opening a hatch or door. + * + * @author Pabilo8 (pabilo@iiteam.net) + * @ii-approved 0.3.1 + * @since 29.05.2026 + */ +@SideOnly(Side.CLIENT) +public class VehicleAction +{ + private final String name; + private final ResLoc icon; + private final KeyBinding keyBinding; + private final MouseBinding mouseBinding; + + public VehicleAction(String name, ResLoc icon, KeyBinding keyBinding) + { + this.name = name; + this.icon = icon; + this.keyBinding = keyBinding; + this.mouseBinding = null; + } + + public VehicleAction(String name, ResLoc icon, MouseBinding mouseBinding) + { + this.name = name; + this.icon = icon; + this.keyBinding = null; + this.mouseBinding = mouseBinding; + } + + //--- Getters ---// + + public String getName() + { + return name; + } + + public ResLoc getIcon() + { + return icon; + } + + public KeyBinding getKeyBinding() + { + return keyBinding; + } + + public MouseBinding getMouseBinding() + { + return mouseBinding; + } +} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/VehicleControls.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/VehicleControls.java index c49641278..78ae6ae5f 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/VehicleControls.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/VehicleControls.java @@ -8,6 +8,7 @@ import net.minecraftforge.fml.relauncher.SideOnly; import javax.annotation.Nonnull; +import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; @@ -22,7 +23,11 @@ public class VehicleControls implements INBTSerializable private final Map states = new HashMap<>(); @SideOnly(Side.CLIENT) private Map keybinds; + @SideOnly(Side.CLIENT) private Map mousebinds; + @SideOnly(Side.CLIENT) + private ArrayList displayedActions; + private boolean dirty = false; public VehicleControls() diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/part/EntityVehicleSeat.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/part/EntityVehicleSeat.java index 0c480a377..9f7bf5ee1 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/part/EntityVehicleSeat.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/part/EntityVehicleSeat.java @@ -24,6 +24,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; +import java.util.List; import java.util.Optional; /** @@ -101,6 +102,21 @@ public static EntityVehicleSeat getOrCreateSeat(SeatInfo seatInfo) } } + public static Entity getPassengerOnSeat(SeatInfo seatInfo) + { + //Try to find the seat + Optional probableSeat = seatInfo.vehicle.getPassengers().stream() + .filter(entity -> entity instanceof EntityVehicleSeat&&((EntityVehicleSeat)entity).seatID.equals(seatInfo.seatID)) + .findFirst(); + //Return passenger on seat if present + if(probableSeat.isPresent()) + { + List passengers = probableSeat.get().getPassengers(); + return passengers.isEmpty()?null: passengers.get(0); + } + return null; + } + @Override protected void entityInit() { diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/part/EntityVehicleWheel.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/part/EntityVehicleWheel.java index d6f1a5cb2..a2a9efb95 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/part/EntityVehicleWheel.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/part/EntityVehicleWheel.java @@ -220,8 +220,8 @@ public WheelForces calculateForces() double latFriction = -vLat*latFrictionCoef; //Total force in wheel's local axes - double fx = driveForce*sinA+latFriction*cosA; - double fz = driveForce*cosA-latFriction*sinA; + double fx = driveForce*Math.signum(speedValue)*sinA+latFriction*cosA; + double fz = driveForce*Math.signum(speedValue)*cosA-latFriction*sinA; //Compile and return forces Vec3d force = new Vec3d(fx*blueprint.forceFactor(), verticalForces.verticalSum, fz*blueprint.forceFactor()); @@ -256,7 +256,7 @@ private VerticalForces calculateVerticalForces() } //Gravity else if(!isGrounded) - targetForce = -0.04*weightShare; //*parentExt.getVehicleBlueprint().mass() + targetForce = -0.04*weightShare; //Integration: gradually approach target force double forceChangeRate; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/propulsion/VehicleEngineFuelBased.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/propulsion/VehicleEngineFuelBased.java index 0b7c80f64..666355185 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/propulsion/VehicleEngineFuelBased.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/utils/propulsion/VehicleEngineFuelBased.java @@ -70,16 +70,17 @@ public void onUpdate() //Play engine noise on client if(vehicle.world.isRemote&&engineSound!=null&&isActive()) { - if(engineNoise==null) - this.engineNoise = new ConditionCompoundSound<>(engineSound, vehicle.getPositionVector(), this, VehicleEngineBase::isActive); + if(engineNoise==null||engineNoise.isDonePlaying()) + this.engineNoise = new ConditionCompoundSound<>(engineSound, vehicle.getPositionVector(), this, + engine -> engine.isActive()&&!engine.vehicle.isDead); this.engineNoise.setPosition(vehicle.getPositionVector()); - this.engineNoise.setVolume(2f); + this.engineNoise.setVolume(1f); this.engineNoise.setPitch(pitchIdle+(pitchMax-pitchIdle)*acceleration); } if(isActive()) { - FluidStack drained = fuelTank.drain((int)(idleUsage+acceleration*maxUsage), true); + FluidStack drained = fuelTank.drain((int)(idleUsage+acceleration*maxUsage), false); if(drained==null) { //Out of fuel, stop the engine @@ -90,6 +91,9 @@ public void onUpdate() this.rotaryStorage.grow(acceleration*outputSpeed, acceleration*outputTorque, 0.15f); } else - this.rotaryStorage.grow(0, 0, 0.15f); + { + this.rotaryStorage.setTorque(0); + this.rotaryStorage.setRotationSpeed(0); + } } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunAimCoordinate.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunAimCoordinate.java index 1b6393380..ab2917669 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunAimCoordinate.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunAimCoordinate.java @@ -378,7 +378,7 @@ public float clampPitchToRange(float pitch) public Vec3d getTarget(float partialTicks) { - double yawRad = Math.toRadians(getYaw(partialTicks)); + double yawRad = Math.toRadians(MathHelper.wrapDegrees(getYaw(partialTicks)+centerYaw)); double pitchRad = Math.toRadians(-getPitch(partialTicks)); return IIMath.offsetPosDirection(1, -yawRad, pitchRad); } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunShootingHandler.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunShootingHandler.java index 14dedfae0..9cd5c1734 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunShootingHandler.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunShootingHandler.java @@ -24,7 +24,7 @@ public class GunShootingHandler implements INBTSerializable { private float shotDelay, maxShotDelay; private GunRecoil recoil = null; - private AmmoFactory ammoFactory = null; + private AmmoFactory ammoFactory = null; private GunAmmoProvider ammoProvider = null; //Sounds private AdvancedSounds.RangedSound sound = null; @@ -100,7 +100,7 @@ public GunShootingHandler withRecoilHandler(GunRecoil recoil) return this; } - public GunShootingHandler withAmmoFactory(AmmoFactory ammoFactory) + public GunShootingHandler withAmmoFactory(AmmoFactory ammoFactory) { this.ammoFactory = ammoFactory; return this; diff --git a/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/aim_pitch.json b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/aim_pitch.json new file mode 100644 index 000000000..99a84d607 --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/aim_pitch.json @@ -0,0 +1,219 @@ +{ + "comment": "Made by Pabilo8 with Blockbench", + "groups": { + "gun": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 13.5] + }, + { + "time": 1, + "transform": [0, 0, -89] + } + ] + }, + "vertical_drive_guida_mechanismnce": { + "rotation": [ + { + "time": 0, + "transform": [90, 0, 0] + }, + { + "time": 1, + "transform": [-180, 0, 0] + } + ] + }, + "hans_gunner": { + "position": [ + { + "time": 0, + "transform": [-5, 2, 8] + } + ] + }, + "hans_gunner_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [-75, 0, 0] + }, + { + "time": 0.1, + "transform": [-65, 0, 0] + }, + { + "time": 0.2, + "transform": [-75, 0, 0] + }, + { + "time": 0.3, + "transform": [-65, 0, 0] + }, + { + "time": 0.4, + "transform": [-75, 0, 0] + }, + { + "time": 0.5, + "transform": [-65, 0, 0] + }, + { + "time": 0.6, + "transform": [-75, 0, 0] + }, + { + "time": 0.7, + "transform": [-65, 0, 0] + }, + { + "time": 0.8, + "transform": [-75, 0, 0] + }, + { + "time": 0.9, + "transform": [-65, 0, 0] + }, + { + "time": 1, + "transform": [-75, 0, 0] + } + ] + }, + "hans_gunner_right_leg": { + "rotation": [ + { + "time": 0.4, + "transform": [-90, 0, 0] + } + ] + }, + "hans_gunner_left_leg": { + "rotation": [ + { + "time": 0.4, + "transform": [-90, 15, 0] + } + ], + "position": [ + { + "time": 0.4, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander": { + "rotation": [ + { + "time": 0.4, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.4, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_right_arm": { + "rotation": [ + { + "time": 0.4, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.4, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_right_leg": { + "rotation": [ + { + "time": 0.4, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.4, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_left_leg": { + "rotation": [ + { + "time": 0.4, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.4, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_body": { + "rotation": [ + { + "time": 0.4, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.4, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_left_arm": { + "rotation": [ + { + "time": 0.4, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.4, + "transform": [0, 0, 0] + } + ] + }, + "wheel2": { + "rotation": [ + { + "time": 0.4, + "transform": [-65, 0, 0] + } + ], + "position": [ + { + "time": 0.4, + "transform": [0, 0, 0] + } + ] + }, + "wheel1": { + "rotation": [ + { + "time": 0.4, + "transform": [-65, 0, 0] + } + ], + "position": [ + { + "time": 0.4, + "transform": [0, 0, 0] + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/aim_yaw.json b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/aim_yaw.json new file mode 100644 index 000000000..54f9ee080 --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/aim_yaw.json @@ -0,0 +1,281 @@ +{ + "comment": "Made by Pabilo8 with Blockbench", + "groups": { + "turret": { + "rotation": [ + { + "time": 1, + "transform": [0, -360, 0] + } + ] + }, + "hans_gunner": { + "position": [ + { + "time": 0, + "transform": [-5, 2, 8] + } + ] + }, + "hans_gunner_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, -52.5] + }, + { + "time": 0.05, + "transform": [-17.5, 0, -52.5] + }, + { + "time": 0.1, + "transform": [17.5, 0, -52.5] + }, + { + "time": 0.15, + "transform": [-17.5, 0, -52.5] + }, + { + "time": 0.2, + "transform": [17.5, 0, -52.5] + }, + { + "time": 0.25, + "transform": [-17.5, 0, -52.5] + }, + { + "time": 0.3, + "transform": [17.5, 0, -52.5] + }, + { + "time": 0.35, + "transform": [-17.5, 0, -52.5] + }, + { + "time": 0.4, + "transform": [17.5, 0, -52.5] + }, + { + "time": 0.45, + "transform": [-17.5, 0, -52.5] + }, + { + "time": 0.5, + "transform": [17.5, 0, -52.5] + }, + { + "time": 0.55, + "transform": [-17.5, 0, -52.5] + }, + { + "time": 0.6, + "transform": [17.5, 0, -52.5] + }, + { + "time": 0.65, + "transform": [-17.5, 0, -52.5] + }, + { + "time": 0.7, + "transform": [17.5, 0, -52.5] + }, + { + "time": 0.75, + "transform": [-17.5, 0, -52.5] + }, + { + "time": 0.8, + "transform": [17.5, 0, -52.5] + }, + { + "time": 0.85, + "transform": [-17.5, 0, -52.5] + }, + { + "time": 0.9, + "transform": [17.5, 0, -52.5] + }, + { + "time": 0.95, + "transform": [-17.5, 0, -52.5] + }, + { + "time": 1, + "transform": [0, 0, -52.5] + } + ] + }, + "hans_gunner_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [-75, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, -2] + } + ] + }, + "hans_gunner_right_leg": { + "rotation": [ + { + "time": 0, + "transform": [-90, 0, 0] + } + ] + }, + "hans_gunner_left_leg": { + "rotation": [ + { + "time": 0, + "transform": [-90, 15, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_right_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_left_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "horizontal_drive_guida_mechanismnce": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [0, -720, 0] + } + ] + }, + "hans_commander_body": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "wheel2": { + "rotation": [ + { + "time": 0, + "transform": [-65, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "wheel1": { + "rotation": [ + { + "time": 0, + "transform": [-65, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "turret_base": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [0, 360, 0] + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/backward.json b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/backward.json new file mode 100644 index 000000000..99404e66a --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/backward.json @@ -0,0 +1,677 @@ +{ + "comment": "Made by Pabilo8 with Blockbench", + "groups": { + "weapon": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, -7.5] + }, + { + "time": 0.13636, + "transform": [0, 0, 0] + }, + { + "time": 0.86364, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, -7.5] + } + ], + "position": [ + { + "time": 0.13636, + "transform": [0, 3, 0] + }, + { + "time": 0.86364, + "transform": [0, 3, 0] + } + ] + }, + "wheel2": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 7.5] + }, + { + "time": 0.13636, + "transform": [0, 0, 0] + }, + { + "time": 0.86364, + "transform": [0, 0, -360] + }, + { + "time": 1, + "transform": [0, 0, -352.5] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.13636, + "transform": [0, 0, 0] + }, + { + "time": 0.86364, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "wheel1": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 7.5] + }, + { + "time": 0.13636, + "transform": [0, 0, 0] + }, + { + "time": 0.86364, + "transform": [0, 0, -360] + }, + { + "time": 1, + "transform": [0, 0, -352.5] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander": { + "rotation": [ + { + "time": 0, + "transform": [0, 360, 0] + }, + { + "time": 0.09091, + "transform": [0, 320, 0] + }, + { + "time": 0.90909, + "transform": [0, 320, 0] + }, + { + "time": 1, + "transform": [0, 360, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [3, 0, 0] + }, + { + "time": 1, + "transform": [3, 0, 0] + } + ] + }, + "hans_commander_body": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.13636, + "transform": [2.5, 0, 0] + }, + { + "time": 0.86364, + "transform": [2.5, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.13636, + "transform": [0, 0, 0] + }, + { + "time": 0.86364, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.09091, + "transform": [-61.52, -11.44, 9.77] + }, + { + "time": 0.13636, + "transform": [-61.52, -11.44, 9.77] + }, + { + "time": 0.86364, + "transform": [-61.52, -11.44, 9.77] + }, + { + "time": 0.90909, + "transform": [-61.52, -11.44, 9.77] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.09091, + "transform": [0, -2, -3] + }, + { + "time": 0.90909, + "transform": [0, -2, -3] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.09091, + "transform": [-97.5, 0, 0] + }, + { + "time": 0.13636, + "transform": [-97.52832, 4.95712, 0.65426] + }, + { + "time": 0.86364, + "transform": [-97.52832, 4.95712, 0.65426] + }, + { + "time": 0.90909, + "transform": [-97.5, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.09091, + "transform": [0, 0, 0] + }, + { + "time": 0.90909, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_right_leg": { + "rotation": [ + { + "time": 0.13636, + "transform": [0, 0, 0] + }, + { + "time": 0.18182, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.22727, + "transform": [0, 0, 0] + }, + { + "time": 0.27273, + "transform": [10, 0, 0] + }, + { + "time": 0.31818, + "transform": [0, 0, 0] + }, + { + "time": 0.36364, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.40909, + "transform": [0, 0, 0] + }, + { + "time": 0.45455, + "transform": [10, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.54545, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.59091, + "transform": [0, 0, 0] + }, + { + "time": 0.63636, + "transform": [10, 0, 0] + }, + { + "time": 0.68182, + "transform": [0, 0, 0] + }, + { + "time": 0.72727, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.77273, + "transform": [0, 0, 0] + }, + { + "time": 0.81818, + "transform": [10, 0, 0] + }, + { + "time": 0.86364, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_left_leg": { + "rotation": [ + { + "time": 0.13636, + "transform": [0, 0, 0] + }, + { + "time": 0.18182, + "transform": [10, 0, 0] + }, + { + "time": 0.22727, + "transform": [0, 0, 0] + }, + { + "time": 0.27273, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.31818, + "transform": [0, 0, 0] + }, + { + "time": 0.36364, + "transform": [10, 0, 0] + }, + { + "time": 0.40909, + "transform": [0, 0, 0] + }, + { + "time": 0.45455, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.54545, + "transform": [10, 0, 0] + }, + { + "time": 0.59091, + "transform": [0, 0, 0] + }, + { + "time": 0.63636, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.68182, + "transform": [0, 0, 0] + }, + { + "time": 0.72727, + "transform": [10, 0, 0] + }, + { + "time": 0.77273, + "transform": [0, 0, 0] + }, + { + "time": 0.81818, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.86364, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.09091, + "transform": [0, 30, 0] + }, + { + "time": 0.90909, + "transform": [0, 30, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [3, 0, 0] + }, + { + "time": 1, + "transform": [3, 0, 0] + } + ] + }, + "hans_gunner_body": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.09091, + "transform": [22.5, 0, 0] + }, + { + "time": 0.13636, + "transform": [10, 0, 0] + }, + { + "time": 0.86364, + "transform": [10, 0, 0] + }, + { + "time": 0.90909, + "transform": [22.5, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.13636, + "transform": [-109.8, 3.46, -6.66] + }, + { + "time": 0.86364, + "transform": [-109.8, 3.46, -6.66] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.00758, + "transform": [0, 0, 0] + }, + { + "time": 0.13636, + "transform": [0.01711, -0.34304, 0.93917] + }, + { + "time": 0.86364, + "transform": [0.01711, -0.34304, 0.93917] + }, + { + "time": 0.99242, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.13636, + "transform": [-44.20344, 15.85078, -18.12598] + }, + { + "time": 0.86364, + "transform": [-44.20344, 15.85078, -18.12598] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.13636, + "transform": [-1, 0, -2] + }, + { + "time": 0.86364, + "transform": [-1, 0, -2] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_right_leg": { + "rotation": [ + { + "time": 0.13636, + "transform": [0, 0, 0] + }, + { + "time": 0.18182, + "transform": [10, 0, 0] + }, + { + "time": 0.22727, + "transform": [0, 0, 0] + }, + { + "time": 0.27273, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.31818, + "transform": [0, 0, 0] + }, + { + "time": 0.36364, + "transform": [10, 0, 0] + }, + { + "time": 0.40909, + "transform": [0, 0, 0] + }, + { + "time": 0.45455, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.54545, + "transform": [10, 0, 0] + }, + { + "time": 0.59091, + "transform": [0, 0, 0] + }, + { + "time": 0.63636, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.68182, + "transform": [0, 0, 0] + }, + { + "time": 0.72727, + "transform": [10, 0, 0] + }, + { + "time": 0.77273, + "transform": [0, 0, 0] + }, + { + "time": 0.81818, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.86364, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_left_leg": { + "rotation": [ + { + "time": 0.13636, + "transform": [0, 0, 0] + }, + { + "time": 0.18182, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.22727, + "transform": [0, 0, 0] + }, + { + "time": 0.27273, + "transform": [10, 0, 0] + }, + { + "time": 0.31818, + "transform": [0, 0, 0] + }, + { + "time": 0.36364, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.40909, + "transform": [0, 0, 0] + }, + { + "time": 0.45455, + "transform": [10, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.54545, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.59091, + "transform": [0, 0, 0] + }, + { + "time": 0.63636, + "transform": [10, 0, 0] + }, + { + "time": 0.68182, + "transform": [0, 0, 0] + }, + { + "time": 0.72727, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.77273, + "transform": [0, 0, 0] + }, + { + "time": 0.81818, + "transform": [10, 0, 0] + }, + { + "time": 0.86364, + "transform": [0, 0, 0] + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/combat_position.json b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/combat_position.json new file mode 100644 index 000000000..1cd15b083 --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/combat_position.json @@ -0,0 +1,589 @@ +{ + "comment": "Made by Pabilo8 with Blockbench", + "groups": { + "wheel1": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 7.5] + }, + { + "time": 0.14286, + "transform": [0, 0, 0] + }, + { + "time": 0.21429, + "transform": [12.5, 0, 0] + }, + { + "time": 0.42857, + "transform": [-65, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.14286, + "transform": [0, 0, 0] + }, + { + "time": 0.42857, + "transform": [0, 0, 0] + } + ] + }, + "wheel2": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 7.5] + }, + { + "time": 0.14286, + "transform": [0, 0, 0] + }, + { + "time": 0.21429, + "transform": [12.5, 0, 0] + }, + { + "time": 0.42857, + "transform": [-65, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.14286, + "transform": [0, 0, 0] + }, + { + "time": 0.42857, + "transform": [0, 0, 0] + } + ] + }, + "weapon": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, -7.5] + }, + { + "time": 0.14286, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.14286, + "transform": [0, 3, 0] + }, + { + "time": 0.21429, + "transform": [0, 4, 0] + }, + { + "time": 0.42857, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.14286, + "transform": [0, 30, 0] + }, + { + "time": 0.57143, + "transform": [0, 30, 0] + }, + { + "time": 0.85714, + "transform": [0, 10, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [3, 0, 0] + }, + { + "time": 0.57143, + "transform": [0, 0, 0] + }, + { + "time": 0.85714, + "transform": [-12.8025, 5, 2.25743] + }, + { + "time": 1, + "transform": [-5, 2, 8] + } + ] + }, + "hans_gunner_body": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.14286, + "transform": [22.5, 0, 0] + }, + { + "time": 0.21429, + "transform": [17.5, 0, 0] + }, + { + "time": 0.42857, + "transform": [27.5, 0, 0] + }, + { + "time": 0.57143, + "transform": [0, 0, 0] + }, + { + "time": 0.71429, + "transform": [17.5, 0, 0] + }, + { + "time": 0.85714, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.14286, + "transform": [-42.3, 3.46, -6.66] + }, + { + "time": 0.21429, + "transform": [-64.79972, 3.45883, -6.66017] + }, + { + "time": 0.42857, + "transform": [-42.29887, 3.45533, -6.66067] + }, + { + "time": 0.57143, + "transform": [-105.69284, 16.88547, 4.6653] + }, + { + "time": 0.71429, + "transform": [25.06034, -14.20241, -45.95225] + }, + { + "time": 0.85714, + "transform": [60.87796, -3.35075, -20.82326] + }, + { + "time": 1, + "transform": [0, 0, -52.5] + } + ], + "position": [ + { + "time": 0.01191, + "transform": [0, 0, 0] + }, + { + "time": 0.14286, + "transform": [0, 0, 1] + }, + { + "time": 0.21429, + "transform": [-0.20721, -0.83316, -0.80635] + }, + { + "time": 0.42857, + "transform": [0, 0, 1] + }, + { + "time": 0.57143, + "transform": [0, 0, 0] + }, + { + "time": 0.71429, + "transform": [2.6198, 0.87726, -1.36785] + }, + { + "time": 0.85714, + "transform": [0.74092, -1.22624, 1.07666] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.21429, + "transform": [-57.9927, 7.92542, -11.8883] + }, + { + "time": 0.42857, + "transform": [-102.9927, 7.92542, -11.8883] + }, + { + "time": 0.57143, + "transform": [0, 0, 0] + }, + { + "time": 0.71429, + "transform": [-88.7663, 27.48416, 0.2556] + }, + { + "time": 0.85714, + "transform": [-41.96754, 35.36828, -15.17956] + }, + { + "time": 1, + "transform": [-75, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.21429, + "transform": [-1, 0, -2] + }, + { + "time": 0.42857, + "transform": [0, 0, -1] + }, + { + "time": 0.57143, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, -2] + } + ] + }, + "hans_gunner_right_leg": { + "rotation": [ + { + "time": 0.57143, + "transform": [0, 0, 0] + }, + { + "time": 0.71429, + "transform": [35, 0, 0] + }, + { + "time": 0.85714, + "transform": [-2.5, 0, 0] + }, + { + "time": 1, + "transform": [-90, 0, 0] + } + ] + }, + "hans_gunner_left_leg": { + "rotation": [ + { + "time": 0.57143, + "transform": [0, 0, 0] + }, + { + "time": 0.71429, + "transform": [-27.5, 0, 0] + }, + { + "time": 0.85714, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [-90, 15, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.57143, + "transform": [0, 0, 0] + }, + { + "time": 0.71429, + "transform": [0, 3.29117, -1.19848] + }, + { + "time": 0.85714, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander": { + "rotation": [ + { + "time": 0, + "transform": [0, 360, 0] + }, + { + "time": 0.14286, + "transform": [0, 320, 0] + }, + { + "time": 0.42857, + "transform": [0, 320, 0] + }, + { + "time": 0.64286, + "transform": [0, 320, 0] + }, + { + "time": 0.78571, + "transform": [0, 360, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [3, 0, 0] + }, + { + "time": 0.42857, + "transform": [3, 0, 0] + }, + { + "time": 0.64286, + "transform": [-13.63297, 8, -3.51346] + }, + { + "time": 0.78571, + "transform": [-5, 2, -8] + } + ] + }, + "hans_commander_body": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.21429, + "transform": [2.5, 0, 0] + }, + { + "time": 0.42857, + "transform": [12.5, 0, 0] + }, + { + "time": 0.5, + "transform": [12.5, 0, 0] + }, + { + "time": 0.64286, + "transform": [-7.5, 0, 0] + }, + { + "time": 0.78571, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.21429, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.14286, + "transform": [-61.52, -11.44, 9.77] + }, + { + "time": 0.21429, + "transform": [-61.52, -11.44, 9.77] + }, + { + "time": 0.42857, + "transform": [-49.02, -11.44, 9.77] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.64286, + "transform": [-36.19714, 10.54794, -14.04397] + }, + { + "time": 0.78571, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.14286, + "transform": [0, -2, -3] + }, + { + "time": 0.42857, + "transform": [0, -2, -3] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.14286, + "transform": [-97.5, 0, 0] + }, + { + "time": 0.21429, + "transform": [-97.5, 0, 0] + }, + { + "time": 0.42857, + "transform": [-75, 0, 0] + }, + { + "time": 0.5, + "transform": [-75, 0, 0] + }, + { + "time": 0.64286, + "transform": [21.40051, 28.53623, 32.94098] + }, + { + "time": 0.78571, + "transform": [-28.93305, 27.81706, 2.04579] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.14286, + "transform": [0, 0, 0] + }, + { + "time": 0.64286, + "transform": [1.30514, -1.37316, 0.64111] + }, + { + "time": 0.78571, + "transform": [0, 0, -1] + } + ] + }, + "hans_commander_right_leg": { + "rotation": [ + { + "time": 0.42857, + "transform": [0, 0, 0] + }, + { + "time": 0.5, + "transform": [32.5, 0, 0] + }, + { + "time": 0.64286, + "transform": [5, 0, 0] + }, + { + "time": 0.78571, + "transform": [-90, 0, 0] + } + ] + }, + "hans_commander_left_leg": { + "rotation": [ + { + "time": 0.42857, + "transform": [0, 0, 0] + }, + { + "time": 0.5, + "transform": [-22.5, 0, 0] + }, + { + "time": 0.64286, + "transform": [0, 0, 0] + }, + { + "time": 0.78571, + "transform": [-90, 0, 0] + } + ], + "position": [ + { + "time": 0.42857, + "transform": [0, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 4.84357, -1.2409] + }, + { + "time": 0.64286, + "transform": [0, 0, 0] + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/fire1.json b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/fire1.json new file mode 100644 index 000000000..ed81c01b6 --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/fire1.json @@ -0,0 +1,165 @@ +{ + "comment": "Made by Pabilo8 with Blockbench", + "groups": { + "turret": { + "rotation": [ + { + "time": 0.3332, + "transform": [0, 0, 0] + }, + { + "time": 0.6668, + "transform": [0, 0, -1] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "cannon1": { + "position": [ + { + "time": 0.1668, + "transform": [0, 0, 0] + }, + { + "time": 0.6668, + "transform": [5, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner": { + "position": [ + { + "time": 0, + "transform": [-5, 2, 8] + } + ] + }, + "hans_gunner_head": { + "rotation": [ + { + "time": 0.3332, + "transform": [0, 0, 0] + }, + { + "time": 0.6668, + "transform": [3, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, -52.5] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [-75, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, -2] + } + ] + }, + "hans_gunner_right_leg": { + "rotation": [ + { + "time": 0, + "transform": [-90, 0, 0] + } + ] + }, + "hans_gunner_left_leg": { + "rotation": [ + { + "time": 0, + "transform": [-90, 15, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander": { + "position": [ + { + "time": 0, + "transform": [-5, 2, -8] + } + ] + }, + "hans_commander_head": { + "rotation": [ + { + "time": 0.3332, + "transform": [0, 0, 0] + }, + { + "time": 0.6668, + "transform": [4, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [-28.93305, 27.81706, 2.04579] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, -1] + } + ] + }, + "hans_commander_right_leg": { + "rotation": [ + { + "time": 0, + "transform": [-90, 0, 0] + } + ] + }, + "hans_commander_left_leg": { + "rotation": [ + { + "time": 0, + "transform": [-90, 0, 0] + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/fire2.json b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/fire2.json new file mode 100644 index 000000000..c911b90e4 --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/fire2.json @@ -0,0 +1,165 @@ +{ + "comment": "Made by Pabilo8 with Blockbench", + "groups": { + "turret": { + "rotation": [ + { + "time": 0.3332, + "transform": [0, 0, 0] + }, + { + "time": 0.6668, + "transform": [0, 0, -1] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "cannon2": { + "position": [ + { + "time": 0.1668, + "transform": [0, 0, 0] + }, + { + "time": 0.6668, + "transform": [5, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner": { + "position": [ + { + "time": 0, + "transform": [-5, 2, 8] + } + ] + }, + "hans_gunner_head": { + "rotation": [ + { + "time": 0.3332, + "transform": [0, 0, 0] + }, + { + "time": 0.6668, + "transform": [3, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, -52.5] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [-75, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, -2] + } + ] + }, + "hans_gunner_right_leg": { + "rotation": [ + { + "time": 0, + "transform": [-90, 0, 0] + } + ] + }, + "hans_gunner_left_leg": { + "rotation": [ + { + "time": 0, + "transform": [-90, 15, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander": { + "position": [ + { + "time": 0, + "transform": [-5, 2, -8] + } + ] + }, + "hans_commander_head": { + "rotation": [ + { + "time": 0.3332, + "transform": [0, 0, 0] + }, + { + "time": 0.6668, + "transform": [4, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [-28.93305, 27.81706, 2.04579] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, -1] + } + ] + }, + "hans_commander_right_leg": { + "rotation": [ + { + "time": 0, + "transform": [-90, 0, 0] + } + ] + }, + "hans_commander_left_leg": { + "rotation": [ + { + "time": 0, + "transform": [-90, 0, 0] + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/fire_pedal.json b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/fire_pedal.json new file mode 100644 index 000000000..030c86e43 --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/fire_pedal.json @@ -0,0 +1,43 @@ +{ + "comment": "Made by Pabilo8 with Blockbench", + "groups": { + "hans_gunner_left_leg": { + "rotation": [ + { + "time": 0, + "transform": [-90, 15, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.5, + "transform": [-0.25882, 0, -1.96593] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "firing_pedal": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 25] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/forward.json b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/forward.json new file mode 100644 index 000000000..db149f73c --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/forward.json @@ -0,0 +1,677 @@ +{ + "comment": "Made by Pabilo8 with Blockbench", + "groups": { + "weapon": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, -7.5] + }, + { + "time": 0.13636, + "transform": [0, 0, 0] + }, + { + "time": 0.86364, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, -7.5] + } + ], + "position": [ + { + "time": 0.13636, + "transform": [0, 3, 0] + }, + { + "time": 0.86364, + "transform": [0, 3, 0] + } + ] + }, + "wheel2": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 7.5] + }, + { + "time": 0.13636, + "transform": [0, 0, 0] + }, + { + "time": 0.86364, + "transform": [0, 0, 360] + }, + { + "time": 1, + "transform": [0, 0, 367.5] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.13636, + "transform": [0, 0, 0] + }, + { + "time": 0.86364, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "wheel1": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 7.5] + }, + { + "time": 0.13636, + "transform": [0, 0, 0] + }, + { + "time": 0.86364, + "transform": [0, 0, 360] + }, + { + "time": 1, + "transform": [0, 0, 367.5] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander": { + "rotation": [ + { + "time": 0, + "transform": [0, 360, 0] + }, + { + "time": 0.09091, + "transform": [0, 320, 0] + }, + { + "time": 0.90909, + "transform": [0, 320, 0] + }, + { + "time": 1, + "transform": [0, 360, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [3, 0, 0] + }, + { + "time": 1, + "transform": [3, 0, 0] + } + ] + }, + "hans_commander_body": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.13636, + "transform": [2.5, 0, 0] + }, + { + "time": 0.86364, + "transform": [2.5, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.13636, + "transform": [0, 0, 0] + }, + { + "time": 0.86364, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.09091, + "transform": [-61.52, -11.44, 9.77] + }, + { + "time": 0.13636, + "transform": [-61.52, -11.44, 9.77] + }, + { + "time": 0.86364, + "transform": [-61.52, -11.44, 9.77] + }, + { + "time": 0.90909, + "transform": [-61.52, -11.44, 9.77] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.09091, + "transform": [0, -2, -3] + }, + { + "time": 0.90909, + "transform": [0, -2, -3] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.09091, + "transform": [-97.5, 0, 0] + }, + { + "time": 0.13636, + "transform": [-97.52832, 4.95712, 0.65426] + }, + { + "time": 0.86364, + "transform": [-97.52832, 4.95712, 0.65426] + }, + { + "time": 0.90909, + "transform": [-97.5, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.09091, + "transform": [0, 0, 0] + }, + { + "time": 0.90909, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_right_leg": { + "rotation": [ + { + "time": 0.13636, + "transform": [0, 0, 0] + }, + { + "time": 0.18182, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.22727, + "transform": [0, 0, 0] + }, + { + "time": 0.27273, + "transform": [10, 0, 0] + }, + { + "time": 0.31818, + "transform": [0, 0, 0] + }, + { + "time": 0.36364, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.40909, + "transform": [0, 0, 0] + }, + { + "time": 0.45455, + "transform": [10, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.54545, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.59091, + "transform": [0, 0, 0] + }, + { + "time": 0.63636, + "transform": [10, 0, 0] + }, + { + "time": 0.68182, + "transform": [0, 0, 0] + }, + { + "time": 0.72727, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.77273, + "transform": [0, 0, 0] + }, + { + "time": 0.81818, + "transform": [10, 0, 0] + }, + { + "time": 0.86364, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_left_leg": { + "rotation": [ + { + "time": 0.13636, + "transform": [0, 0, 0] + }, + { + "time": 0.18182, + "transform": [10, 0, 0] + }, + { + "time": 0.22727, + "transform": [0, 0, 0] + }, + { + "time": 0.27273, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.31818, + "transform": [0, 0, 0] + }, + { + "time": 0.36364, + "transform": [10, 0, 0] + }, + { + "time": 0.40909, + "transform": [0, 0, 0] + }, + { + "time": 0.45455, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.54545, + "transform": [10, 0, 0] + }, + { + "time": 0.59091, + "transform": [0, 0, 0] + }, + { + "time": 0.63636, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.68182, + "transform": [0, 0, 0] + }, + { + "time": 0.72727, + "transform": [10, 0, 0] + }, + { + "time": 0.77273, + "transform": [0, 0, 0] + }, + { + "time": 0.81818, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.86364, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.09091, + "transform": [0, 30, 0] + }, + { + "time": 0.90909, + "transform": [0, 30, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [3, 0, 0] + }, + { + "time": 1, + "transform": [3, 0, 0] + } + ] + }, + "hans_gunner_body": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.09091, + "transform": [22.5, 0, 0] + }, + { + "time": 0.13636, + "transform": [10, 0, 0] + }, + { + "time": 0.86364, + "transform": [10, 0, 0] + }, + { + "time": 0.90909, + "transform": [22.5, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.13636, + "transform": [-109.8, 3.46, -6.66] + }, + { + "time": 0.86364, + "transform": [-109.8, 3.46, -6.66] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.00758, + "transform": [0, 0, 0] + }, + { + "time": 0.13636, + "transform": [0.01711, -0.34304, 0.93917] + }, + { + "time": 0.86364, + "transform": [0.01711, -0.34304, 0.93917] + }, + { + "time": 0.99242, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.13636, + "transform": [-44.20344, 15.85078, -18.12598] + }, + { + "time": 0.86364, + "transform": [-44.20344, 15.85078, -18.12598] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.13636, + "transform": [-1, 0, -2] + }, + { + "time": 0.86364, + "transform": [-1, 0, -2] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_right_leg": { + "rotation": [ + { + "time": 0.13636, + "transform": [0, 0, 0] + }, + { + "time": 0.18182, + "transform": [10, 0, 0] + }, + { + "time": 0.22727, + "transform": [0, 0, 0] + }, + { + "time": 0.27273, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.31818, + "transform": [0, 0, 0] + }, + { + "time": 0.36364, + "transform": [10, 0, 0] + }, + { + "time": 0.40909, + "transform": [0, 0, 0] + }, + { + "time": 0.45455, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.54545, + "transform": [10, 0, 0] + }, + { + "time": 0.59091, + "transform": [0, 0, 0] + }, + { + "time": 0.63636, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.68182, + "transform": [0, 0, 0] + }, + { + "time": 0.72727, + "transform": [10, 0, 0] + }, + { + "time": 0.77273, + "transform": [0, 0, 0] + }, + { + "time": 0.81818, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.86364, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_left_leg": { + "rotation": [ + { + "time": 0.13636, + "transform": [0, 0, 0] + }, + { + "time": 0.18182, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.22727, + "transform": [0, 0, 0] + }, + { + "time": 0.27273, + "transform": [10, 0, 0] + }, + { + "time": 0.31818, + "transform": [0, 0, 0] + }, + { + "time": 0.36364, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.40909, + "transform": [0, 0, 0] + }, + { + "time": 0.45455, + "transform": [10, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.54545, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.59091, + "transform": [0, 0, 0] + }, + { + "time": 0.63636, + "transform": [10, 0, 0] + }, + { + "time": 0.68182, + "transform": [0, 0, 0] + }, + { + "time": 0.72727, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.77273, + "transform": [0, 0, 0] + }, + { + "time": 0.81818, + "transform": [10, 0, 0] + }, + { + "time": 0.86364, + "transform": [0, 0, 0] + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/hook.json b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/hook.json new file mode 100644 index 000000000..fc459a07b --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/hook.json @@ -0,0 +1,527 @@ +{ + "comment": "Made by Pabilo8 with Blockbench", + "groups": { + "weapon": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, -7.5] + }, + { + "time": 0.33333, + "transform": [0, 0, 12.5] + }, + { + "time": 0.66667, + "transform": [0, 0, 12.5] + }, + { + "time": 0.75924, + "transform": [0, 0, 5] + } + ], + "position": [ + { + "time": 0.33333, + "transform": [0, 3, 0] + }, + { + "time": 0.66667, + "transform": [5, 3, 0] + } + ] + }, + "wheel2": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 7.5] + }, + { + "time": 0.33333, + "transform": [0, 0, -12.5] + }, + { + "time": 0.66667, + "transform": [0, 0, -62.5] + }, + { + "time": 0.75924, + "transform": [0, 0, -55] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.33333, + "transform": [0, 0, 0] + } + ] + }, + "wheel1": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 7.5] + }, + { + "time": 0.33333, + "transform": [0, 0, -12.5] + }, + { + "time": 0.66667, + "transform": [0, 0, -62.5] + }, + { + "time": 0.75924, + "transform": [0, 0, -55] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander": { + "rotation": [ + { + "time": 0, + "transform": [0, 360, 0] + }, + { + "time": 0.22222, + "transform": [0, 320, 0] + }, + { + "time": 0.75924, + "transform": [0, 320, 0] + }, + { + "time": 1, + "transform": [0, 360, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [3, 0, 0] + }, + { + "time": 0.33333, + "transform": [3, 0, 0] + }, + { + "time": 0.66667, + "transform": [8, 0, 0] + }, + { + "time": 0.75924, + "transform": [8, 0, 0] + }, + { + "time": 1, + "transform": [8, 0, 0] + } + ] + }, + "hans_commander_body": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.33333, + "transform": [10, 0, 0] + }, + { + "time": 0.66667, + "transform": [10, 0, 0] + }, + { + "time": 0.75924, + "transform": [15, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.33333, + "transform": [0, 0, 0] + }, + { + "time": 0.75924, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.22222, + "transform": [-61.52, -11.44, 9.77] + }, + { + "time": 0.33333, + "transform": [-64.02, -11.44, 9.77] + }, + { + "time": 0.75924, + "transform": [-64.02, -11.44, 9.77] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.22222, + "transform": [0, -2, -3] + }, + { + "time": 0.75924, + "transform": [0, -2, -3] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.22222, + "transform": [-97.5, 0, 0] + }, + { + "time": 0.33333, + "transform": [-97.7614, 14.8687, 2.00307] + }, + { + "time": 0.75924, + "transform": [-97.76, 14.87, 2] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.22222, + "transform": [0, 0, 0] + }, + { + "time": 0.33333, + "transform": [-0.26147, 0.39009, -2.96302] + }, + { + "time": 0.75924, + "transform": [0.25764, 0.13784, -1.04468] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_right_leg": { + "rotation": [ + { + "time": 0.33333, + "transform": [0, 0, 0] + }, + { + "time": 0.46298, + "transform": [-16.25, 0, 0] + }, + { + "time": 0.51853, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.66667, + "transform": [0, 0, 0] + }, + { + "time": 0.75924, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.75924, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_left_leg": { + "rotation": [ + { + "time": 0.33333, + "transform": [0, 0, 0] + }, + { + "time": 0.46298, + "transform": [21.25, 0, 0] + }, + { + "time": 0.51853, + "transform": [12.5, 0, 0] + }, + { + "time": 0.66667, + "transform": [0, 0, 0] + }, + { + "time": 0.75924, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.75924, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.22222, + "transform": [0, 30, 0] + }, + { + "time": 0.33333, + "transform": [0, 30, 0] + }, + { + "time": 0.75924, + "transform": [0, 30, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [3, 0, 0] + }, + { + "time": 0.33333, + "transform": [3, 0, 0] + }, + { + "time": 0.66667, + "transform": [8, 0, 0] + }, + { + "time": 0.75924, + "transform": [8, 0, 0] + }, + { + "time": 1, + "transform": [8, 0, 0] + } + ] + }, + "hans_gunner_body": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.22222, + "transform": [22.5, 0, 0] + }, + { + "time": 0.33333, + "transform": [12.5, 0, 0] + }, + { + "time": 0.75924, + "transform": [17.5, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.75924, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.33333, + "transform": [-109.8, 3.46, -6.66] + }, + { + "time": 0.75924, + "transform": [-109.8, 3.46, -6.66] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.33333, + "transform": [-0.03423, 0.68608, -1.87833] + }, + { + "time": 0.75924, + "transform": [0.00423, 0.00392, -0.00167] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.33333, + "transform": [-53.05629, 19.30209, -21.92176] + }, + { + "time": 0.75924, + "transform": [-53.06, 19.3, -21.92] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.33333, + "transform": [-1, 0, -2] + }, + { + "time": 0.75924, + "transform": [-1, 0, -2] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_right_leg": { + "rotation": [ + { + "time": 0.33333, + "transform": [0, 0, 0] + }, + { + "time": 0.46298, + "transform": [21.25, 0, 0] + }, + { + "time": 0.51853, + "transform": [12.5, 0, 0] + }, + { + "time": 0.66667, + "transform": [0, 0, 0] + }, + { + "time": 0.75924, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.75924, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_left_leg": { + "rotation": [ + { + "time": 0.33333, + "transform": [0, 0, 0] + }, + { + "time": 0.46298, + "transform": [-16.25, 0, 0] + }, + { + "time": 0.51853, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.66667, + "transform": [0, 0, 0] + }, + { + "time": 0.75924, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.75924, + "transform": [0, 0, 0] + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/infantry_position.json b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/infantry_position.json new file mode 100644 index 000000000..938cec55f --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/infantry_position.json @@ -0,0 +1,797 @@ +{ + "comment": "Made by Pabilo8 with Blockbench", + "groups": { + "wheel1": { + "rotation": [ + { + "time": 0, + "transform": [-65, 0, 0] + }, + { + "time": 0.66667, + "transform": [-65, 0, 0] + }, + { + "time": 0.83333, + "transform": [12.5, 0, 0] + }, + { + "time": 0.88889, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 7.5] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.66667, + "transform": [0, 0, 0] + }, + { + "time": 0.88889, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "wheel2": { + "rotation": [ + { + "time": 0, + "transform": [-65, 0, 0] + }, + { + "time": 0.66667, + "transform": [-65, 0, 0] + }, + { + "time": 0.83333, + "transform": [12.5, 0, 0] + }, + { + "time": 0.88889, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 7.5] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.66667, + "transform": [0, 0, 0] + }, + { + "time": 0.88889, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "weapon": { + "rotation": [ + { + "time": 0.88889, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, -7.5] + } + ], + "position": [ + { + "time": 0.66667, + "transform": [0, 0, 0] + }, + { + "time": 0.83333, + "transform": [0, 4, 0] + }, + { + "time": 0.88889, + "transform": [0, 3, 0] + } + ] + }, + "vertical_drive_guida_mechanismnce": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner": { + "rotation": [ + { + "time": 0.11111, + "transform": [0, 0, 0] + }, + { + "time": 0.22222, + "transform": [0, -30, 0] + }, + { + "time": 0.27778, + "transform": [0, -49.17, 0] + }, + { + "time": 0.38889, + "transform": [0, -122.5, 0] + }, + { + "time": 0.55556, + "transform": [0, 30, 0] + }, + { + "time": 0.88889, + "transform": [0, 30, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.11111, + "transform": [-5, 2, 8] + }, + { + "time": 0.22222, + "transform": [-8, 7, 8] + }, + { + "time": 0.27778, + "transform": [-8, 7, 8] + }, + { + "time": 0.38889, + "transform": [-2, -1, -3] + }, + { + "time": 0.55556, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [3, 0, 0] + } + ] + }, + "hans_gunner_body": { + "rotation": [ + { + "time": 0.22222, + "transform": [0, 0, 0] + }, + { + "time": 0.27778, + "transform": [0, -45, 0] + }, + { + "time": 0.38889, + "transform": [0, 0, 0] + }, + { + "time": 0.55556, + "transform": [0, 0, 0] + }, + { + "time": 0.66667, + "transform": [27.5, 0, 0] + }, + { + "time": 0.83333, + "transform": [17.5, 0, 0] + }, + { + "time": 0.88889, + "transform": [22.5, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_head": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.11111, + "transform": [0, -65, 0] + }, + { + "time": 0.22222, + "transform": [0, -65, 0] + }, + { + "time": 0.27778, + "transform": [0, -30, 0] + }, + { + "time": 0.44444, + "transform": [0, -30, 0] + }, + { + "time": 0.55556, + "transform": [20, 30, 0] + }, + { + "time": 0.66667, + "transform": [5, 30, 0] + }, + { + "time": 0.88889, + "transform": [5, 30, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, -52.5] + }, + { + "time": 0.05556, + "transform": [-60.16243, -19.20748, -82.33757] + }, + { + "time": 0.22222, + "transform": [7.77162, -24.29075, -42.19892] + }, + { + "time": 0.27778, + "transform": [7.77, -24.29, -42.2] + }, + { + "time": 0.33333, + "transform": [-54.73, -24.29, -42.2] + }, + { + "time": 0.38889, + "transform": [0, 0, 0] + }, + { + "time": 0.55556, + "transform": [0, 0, 0] + }, + { + "time": 0.66667, + "transform": [-42.29887, 3.45533, -6.66067] + }, + { + "time": 0.88889, + "transform": [-42.3, 3.46, -6.66] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.38889, + "transform": [0, 0, 0] + }, + { + "time": 0.55556, + "transform": [0, 0, 0] + }, + { + "time": 0.66667, + "transform": [0, 0, 1] + }, + { + "time": 0.88889, + "transform": [0, 0, 1] + }, + { + "time": 0.99073, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [-75, 0, 0] + }, + { + "time": 0.22222, + "transform": [0, 0, 0] + }, + { + "time": 0.38889, + "transform": [80, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.55556, + "transform": [0, 0, 0] + }, + { + "time": 0.66667, + "transform": [-102.9927, 7.92542, -11.8883] + }, + { + "time": 0.83333, + "transform": [-115.4927, 7.92542, -11.8883] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, -2] + }, + { + "time": 0.22222, + "transform": [0, 0, 0] + }, + { + "time": 0.27778, + "transform": [0, 1, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.55556, + "transform": [0, 0, 0] + }, + { + "time": 0.66667, + "transform": [0, 0, -1] + }, + { + "time": 0.83333, + "transform": [-1, 0, -2] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_right_leg": { + "rotation": [ + { + "time": 0, + "transform": [-90, 0, 0] + }, + { + "time": 0.11111, + "transform": [-47.61943, -67.78684, 16.81776] + }, + { + "time": 0.22222, + "transform": [-24.1603, -65.61623, -14.67299] + }, + { + "time": 0.27778, + "transform": [-46.6603, -65.61623, -14.67299] + }, + { + "time": 0.33333, + "transform": [3.3397, -65.61623, -14.67299] + }, + { + "time": 0.38889, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.38889, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_left_leg": { + "rotation": [ + { + "time": 0, + "transform": [-90, 15, 0] + }, + { + "time": 0.22222, + "transform": [-35, 0, 0] + }, + { + "time": 0.33333, + "transform": [-41.5783, -43.25892, 0.69981] + }, + { + "time": 0.38889, + "transform": [0, 0, 0] + }, + { + "time": 0.46296, + "transform": [32.5, 0, 0] + }, + { + "time": 0.55556, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.22222, + "transform": [0, 0, 0] + }, + { + "time": 0.33333, + "transform": [1, 0, -2] + }, + { + "time": 0.38889, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.11111, + "transform": [0, 47.5, 0] + }, + { + "time": 0.22222, + "transform": [0, 47.5, 0] + }, + { + "time": 0.27778, + "transform": [0, 75, 0] + }, + { + "time": 0.38889, + "transform": [0, 127.5, 0] + }, + { + "time": 0.5, + "transform": [0, 320, 0] + }, + { + "time": 0.88889, + "transform": [0, 320, 0] + }, + { + "time": 1, + "transform": [0, 360, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [-5, 2, -8] + }, + { + "time": 0.11111, + "transform": [-8, 2, -8] + }, + { + "time": 0.22222, + "transform": [-8, 2, -8] + }, + { + "time": 0.27778, + "transform": [-8, 6, -8] + }, + { + "time": 0.38889, + "transform": [-3, 0, -2] + }, + { + "time": 0.5, + "transform": [3, 0, 0] + }, + { + "time": 0.66667, + "transform": [3, 0, 0] + }, + { + "time": 1, + "transform": [3, 0, 0] + } + ] + }, + "hans_commander_body": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.61111, + "transform": [12.5, 0, 0] + }, + { + "time": 0.66667, + "transform": [12.5, 0, 0] + }, + { + "time": 0.83333, + "transform": [2.5, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.83333, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_head": { + "rotation": [ + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.55556, + "transform": [17.5, 0, 0] + }, + { + "time": 0.88889, + "transform": [17.5, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_left_arm": { + "rotation": [ + { + "time": 0.27778, + "transform": [0, 0, 0] + }, + { + "time": 0.38889, + "transform": [35, 0, 0] + }, + { + "time": 0.43518, + "transform": [0, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.61111, + "transform": [-49.01916, -11.43563, 9.77243] + }, + { + "time": 0.66667, + "transform": [-49.02, -11.44, 9.77] + }, + { + "time": 0.83333, + "transform": [-61.52, -11.44, 9.77] + }, + { + "time": 0.88889, + "transform": [-61.52, -11.44, 9.77] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.22222, + "transform": [0, 0, 0] + }, + { + "time": 0.27778, + "transform": [0, 2, 0] + }, + { + "time": 0.38889, + "transform": [0, 0, 0] + }, + { + "time": 0.61111, + "transform": [0, -2, -3] + }, + { + "time": 0.88889, + "transform": [0, -2, -3] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [-28.93305, 27.81706, 2.04579] + }, + { + "time": 0.11111, + "transform": [-34.2538, -1.59415, 44.16618] + }, + { + "time": 0.27778, + "transform": [20.7462, -1.59415, 44.16618] + }, + { + "time": 0.38889, + "transform": [0, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.61111, + "transform": [-75, 0, 0] + }, + { + "time": 0.66667, + "transform": [-75, 0, 0] + }, + { + "time": 0.83333, + "transform": [-97.5, 0, 0] + }, + { + "time": 0.88889, + "transform": [-97.5, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, -1] + }, + { + "time": 0.27778, + "transform": [0, 0, 0] + }, + { + "time": 0.38889, + "transform": [0, 0, 0] + }, + { + "time": 0.88889, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_right_leg": { + "rotation": [ + { + "time": 0, + "transform": [-90, 0, 0] + }, + { + "time": 0.22222, + "transform": [-75, 0, 0] + }, + { + "time": 0.27778, + "transform": [-40, 0, 0] + }, + { + "time": 0.38889, + "transform": [0, 0, 0] + }, + { + "time": 0.43518, + "transform": [-25, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_left_leg": { + "rotation": [ + { + "time": 0, + "transform": [-90, 0, 0] + }, + { + "time": 0.11111, + "transform": [-90, 0, 0] + }, + { + "time": 0.22222, + "transform": [-62.5, 37.5, 0] + }, + { + "time": 0.27778, + "transform": [-50, 37.5, 0] + }, + { + "time": 0.33333, + "transform": [12.5, 37.5, 0] + }, + { + "time": 0.38889, + "transform": [30, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/left.json b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/left.json new file mode 100644 index 000000000..d0fe905e2 --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/left.json @@ -0,0 +1,677 @@ +{ + "comment": "Made by Pabilo8 with Blockbench", + "groups": { + "weapon": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, -7.5] + }, + { + "time": 0.13636, + "transform": [0, 0, 0] + }, + { + "time": 0.86364, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, -7.5] + } + ], + "position": [ + { + "time": 0.13636, + "transform": [0, 3, 0] + }, + { + "time": 0.86364, + "transform": [0, 3, 0] + } + ] + }, + "wheel2": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 7.5] + }, + { + "time": 0.13636, + "transform": [0, 0, 0] + }, + { + "time": 0.86364, + "transform": [0, 0, -360] + }, + { + "time": 1, + "transform": [0, 0, -352.5] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.13636, + "transform": [0, 0, 0] + }, + { + "time": 0.86364, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "wheel1": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 7.5] + }, + { + "time": 0.13636, + "transform": [0, 0, 0] + }, + { + "time": 0.86364, + "transform": [0, 0, 360] + }, + { + "time": 1, + "transform": [0, 0, 367.5] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander": { + "rotation": [ + { + "time": 0, + "transform": [0, 360, 0] + }, + { + "time": 0.09091, + "transform": [0, 320, 0] + }, + { + "time": 0.90909, + "transform": [0, 320, 0] + }, + { + "time": 1, + "transform": [0, 360, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [3, 0, 0] + }, + { + "time": 1, + "transform": [3, 0, 0] + } + ] + }, + "hans_commander_body": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.13636, + "transform": [2.5, 0, 0] + }, + { + "time": 0.86364, + "transform": [2.5, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.13636, + "transform": [0, 0, 0] + }, + { + "time": 0.86364, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.09091, + "transform": [-61.52, -11.44, 9.77] + }, + { + "time": 0.13636, + "transform": [-61.52, -11.44, 9.77] + }, + { + "time": 0.86364, + "transform": [-61.52, -11.44, 9.77] + }, + { + "time": 0.90909, + "transform": [-61.52, -11.44, 9.77] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.09091, + "transform": [0, -2, -3] + }, + { + "time": 0.90909, + "transform": [0, -2, -3] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.09091, + "transform": [-97.5, 0, 0] + }, + { + "time": 0.13636, + "transform": [-97.52832, 4.95712, 0.65426] + }, + { + "time": 0.86364, + "transform": [-97.52832, 4.95712, 0.65426] + }, + { + "time": 0.90909, + "transform": [-97.5, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.09091, + "transform": [0, 0, 0] + }, + { + "time": 0.90909, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_right_leg": { + "rotation": [ + { + "time": 0.13636, + "transform": [0, 0, 0] + }, + { + "time": 0.18182, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.22727, + "transform": [0, 0, 0] + }, + { + "time": 0.27273, + "transform": [10, 0, 0] + }, + { + "time": 0.31818, + "transform": [0, 0, 0] + }, + { + "time": 0.36364, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.40909, + "transform": [0, 0, 0] + }, + { + "time": 0.45455, + "transform": [10, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.54545, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.59091, + "transform": [0, 0, 0] + }, + { + "time": 0.63636, + "transform": [10, 0, 0] + }, + { + "time": 0.68182, + "transform": [0, 0, 0] + }, + { + "time": 0.72727, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.77273, + "transform": [0, 0, 0] + }, + { + "time": 0.81818, + "transform": [10, 0, 0] + }, + { + "time": 0.86364, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_left_leg": { + "rotation": [ + { + "time": 0.13636, + "transform": [0, 0, 0] + }, + { + "time": 0.18182, + "transform": [10, 0, 0] + }, + { + "time": 0.22727, + "transform": [0, 0, 0] + }, + { + "time": 0.27273, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.31818, + "transform": [0, 0, 0] + }, + { + "time": 0.36364, + "transform": [10, 0, 0] + }, + { + "time": 0.40909, + "transform": [0, 0, 0] + }, + { + "time": 0.45455, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.54545, + "transform": [10, 0, 0] + }, + { + "time": 0.59091, + "transform": [0, 0, 0] + }, + { + "time": 0.63636, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.68182, + "transform": [0, 0, 0] + }, + { + "time": 0.72727, + "transform": [10, 0, 0] + }, + { + "time": 0.77273, + "transform": [0, 0, 0] + }, + { + "time": 0.81818, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.86364, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.09091, + "transform": [0, 30, 0] + }, + { + "time": 0.90909, + "transform": [0, 30, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [3, 0, 0] + }, + { + "time": 1, + "transform": [3, 0, 0] + } + ] + }, + "hans_gunner_body": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.09091, + "transform": [22.5, 0, 0] + }, + { + "time": 0.13636, + "transform": [10, 0, 0] + }, + { + "time": 0.86364, + "transform": [10, 0, 0] + }, + { + "time": 0.90909, + "transform": [22.5, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.13636, + "transform": [-109.8, 3.46, -6.66] + }, + { + "time": 0.86364, + "transform": [-109.8, 3.46, -6.66] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.00758, + "transform": [0, 0, 0] + }, + { + "time": 0.13636, + "transform": [0.01711, -0.34304, 0.93917] + }, + { + "time": 0.86364, + "transform": [0.01711, -0.34304, 0.93917] + }, + { + "time": 0.99242, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.13636, + "transform": [-44.20344, 15.85078, -18.12598] + }, + { + "time": 0.86364, + "transform": [-44.20344, 15.85078, -18.12598] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.13636, + "transform": [-1, 0, -2] + }, + { + "time": 0.86364, + "transform": [-1, 0, -2] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_right_leg": { + "rotation": [ + { + "time": 0.13636, + "transform": [0, 0, 0] + }, + { + "time": 0.18182, + "transform": [10, 0, 0] + }, + { + "time": 0.22727, + "transform": [0, 0, 0] + }, + { + "time": 0.27273, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.31818, + "transform": [0, 0, 0] + }, + { + "time": 0.36364, + "transform": [10, 0, 0] + }, + { + "time": 0.40909, + "transform": [0, 0, 0] + }, + { + "time": 0.45455, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.54545, + "transform": [10, 0, 0] + }, + { + "time": 0.59091, + "transform": [0, 0, 0] + }, + { + "time": 0.63636, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.68182, + "transform": [0, 0, 0] + }, + { + "time": 0.72727, + "transform": [10, 0, 0] + }, + { + "time": 0.77273, + "transform": [0, 0, 0] + }, + { + "time": 0.81818, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.86364, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_left_leg": { + "rotation": [ + { + "time": 0.13636, + "transform": [0, 0, 0] + }, + { + "time": 0.18182, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.22727, + "transform": [0, 0, 0] + }, + { + "time": 0.27273, + "transform": [10, 0, 0] + }, + { + "time": 0.31818, + "transform": [0, 0, 0] + }, + { + "time": 0.36364, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.40909, + "transform": [0, 0, 0] + }, + { + "time": 0.45455, + "transform": [10, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.54545, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.59091, + "transform": [0, 0, 0] + }, + { + "time": 0.63636, + "transform": [10, 0, 0] + }, + { + "time": 0.68182, + "transform": [0, 0, 0] + }, + { + "time": 0.72727, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.77273, + "transform": [0, 0, 0] + }, + { + "time": 0.81818, + "transform": [10, 0, 0] + }, + { + "time": 0.86364, + "transform": [0, 0, 0] + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/load1.json b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/load1.json new file mode 100644 index 000000000..06e19666e --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/load1.json @@ -0,0 +1,197 @@ +{ + "comment": "Made by Pabilo8 with Blockbench", + "groups": { + "magazine": { + "position": [ + { + "time": 0.25, + "transform": [0, 6, 0] + }, + { + "time": 0.38887, + "transform": [0, 6, 0] + }, + { + "time": 0.58333, + "transform": [0, 0, 0] + }, + { + "time": 0.75, + "transform": [0, 0, 0] + } + ], + "scale": [ + { + "time": 0.25, + "transform": [0, 0, 0] + }, + { + "time": 0.38887, + "transform": [1, 1, 1] + } + ] + }, + "hans_gunner": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_right_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_left_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander": { + "position": [ + { + "time": 0, + "transform": [-5, 2, -8] + } + ] + }, + "hans_commander_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [-28.93305, 27.81706, 2.04579] + }, + { + "time": 0.25, + "transform": [-124.51834, -3.56781, -6.71413] + }, + { + "time": 0.38887, + "transform": [-124.51834, -3.56781, -6.71413] + }, + { + "time": 0.58333, + "transform": [-87.01834, -3.56781, -6.71413] + }, + { + "time": 0.75, + "transform": [-87.01834, -3.56781, -6.71413] + }, + { + "time": 1, + "transform": [-28.93305, 27.81706, 2.04579] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, -1] + }, + { + "time": 0.25, + "transform": [0, 0, -4] + }, + { + "time": 0.38887, + "transform": [0, 0, -4] + }, + { + "time": 0.58333, + "transform": [0, 0, -3] + }, + { + "time": 0.75, + "transform": [0, 0, -3] + }, + { + "time": 1, + "transform": [0, 0, -1] + } + ] + }, + "hans_commander_right_leg": { + "rotation": [ + { + "time": 0, + "transform": [-90, 0, 0] + } + ] + }, + "hans_commander_left_leg": { + "rotation": [ + { + "time": 0, + "transform": [-90, 0, 0] + } + ] + }, + "hans_gunner_body": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/load2.json b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/load2.json new file mode 100644 index 000000000..5f6906c7d --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/load2.json @@ -0,0 +1,205 @@ +{ + "comment": "Made by Pabilo8 with Blockbench", + "groups": { + "hans_gunner": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_right_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_left_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander": { + "position": [ + { + "time": 0, + "transform": [-5, 2, -8] + } + ] + }, + "hans_commander_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [-28.93305, 27.81706, 2.04579] + }, + { + "time": 0.14286, + "transform": [-87.01834, -3.56781, -6.71413] + }, + { + "time": 0.28571, + "transform": [-130.5888, -29.62566, -27.21733] + }, + { + "time": 0.40474, + "transform": [-130.5888, -29.62566, -27.21733] + }, + { + "time": 0.57143, + "transform": [-101.19583, -38.51104, -4.52898] + }, + { + "time": 0.71429, + "transform": [-87.01834, -3.56781, -6.71413] + }, + { + "time": 1, + "transform": [-28.93305, 27.81706, 2.04579] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, -1] + }, + { + "time": 0.14286, + "transform": [0, 0, 0] + }, + { + "time": 0.28571, + "transform": [0, 0, -5] + }, + { + "time": 0.40474, + "transform": [0, 0, -5] + }, + { + "time": 0.57143, + "transform": [0, 0, -4] + }, + { + "time": 0.71429, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, -1] + } + ] + }, + "hans_commander_right_leg": { + "rotation": [ + { + "time": 0, + "transform": [-90, 0, 0] + } + ] + }, + "hans_commander_left_leg": { + "rotation": [ + { + "time": 0, + "transform": [-90, 0, 0] + } + ] + }, + "magazine2": { + "position": [ + { + "time": 0.28571, + "transform": [0, 6, 0] + }, + { + "time": 0.40474, + "transform": [0, 6, 0] + }, + { + "time": 0.57143, + "transform": [0, 0, 0] + }, + { + "time": 0.71429, + "transform": [0, 0, 0] + } + ], + "scale": [ + { + "time": 0.28571, + "transform": [0, 0, 0] + }, + { + "time": 0.40474, + "transform": [1, 1, 1] + } + ] + }, + "hans_gunner_body": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/right.json b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/right.json new file mode 100644 index 000000000..c7bf1b2bb --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/right.json @@ -0,0 +1,677 @@ +{ + "comment": "Made by Pabilo8 with Blockbench", + "groups": { + "weapon": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, -7.5] + }, + { + "time": 0.13636, + "transform": [0, 0, 0] + }, + { + "time": 0.86364, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, -7.5] + } + ], + "position": [ + { + "time": 0.13636, + "transform": [0, 3, 0] + }, + { + "time": 0.86364, + "transform": [0, 3, 0] + } + ] + }, + "wheel2": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 7.5] + }, + { + "time": 0.13636, + "transform": [0, 0, 0] + }, + { + "time": 0.86364, + "transform": [0, 0, 360] + }, + { + "time": 1, + "transform": [0, 0, 367.5] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.13636, + "transform": [0, 0, 0] + }, + { + "time": 0.86364, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "wheel1": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 7.5] + }, + { + "time": 0.13636, + "transform": [0, 0, 0] + }, + { + "time": 0.86364, + "transform": [0, 0, -360] + }, + { + "time": 1, + "transform": [0, 0, -352.5] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander": { + "rotation": [ + { + "time": 0, + "transform": [0, 360, 0] + }, + { + "time": 0.09091, + "transform": [0, 320, 0] + }, + { + "time": 0.90909, + "transform": [0, 320, 0] + }, + { + "time": 1, + "transform": [0, 360, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [3, 0, 0] + }, + { + "time": 1, + "transform": [3, 0, 0] + } + ] + }, + "hans_commander_body": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.13636, + "transform": [2.5, 0, 0] + }, + { + "time": 0.86364, + "transform": [2.5, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.13636, + "transform": [0, 0, 0] + }, + { + "time": 0.86364, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.09091, + "transform": [-61.52, -11.44, 9.77] + }, + { + "time": 0.13636, + "transform": [-61.52, -11.44, 9.77] + }, + { + "time": 0.86364, + "transform": [-61.52, -11.44, 9.77] + }, + { + "time": 0.90909, + "transform": [-61.52, -11.44, 9.77] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.09091, + "transform": [0, -2, -3] + }, + { + "time": 0.90909, + "transform": [0, -2, -3] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.09091, + "transform": [-97.5, 0, 0] + }, + { + "time": 0.13636, + "transform": [-97.52832, 4.95712, 0.65426] + }, + { + "time": 0.86364, + "transform": [-97.52832, 4.95712, 0.65426] + }, + { + "time": 0.90909, + "transform": [-97.5, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.09091, + "transform": [0, 0, 0] + }, + { + "time": 0.90909, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_right_leg": { + "rotation": [ + { + "time": 0.13636, + "transform": [0, 0, 0] + }, + { + "time": 0.18182, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.22727, + "transform": [0, 0, 0] + }, + { + "time": 0.27273, + "transform": [10, 0, 0] + }, + { + "time": 0.31818, + "transform": [0, 0, 0] + }, + { + "time": 0.36364, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.40909, + "transform": [0, 0, 0] + }, + { + "time": 0.45455, + "transform": [10, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.54545, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.59091, + "transform": [0, 0, 0] + }, + { + "time": 0.63636, + "transform": [10, 0, 0] + }, + { + "time": 0.68182, + "transform": [0, 0, 0] + }, + { + "time": 0.72727, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.77273, + "transform": [0, 0, 0] + }, + { + "time": 0.81818, + "transform": [10, 0, 0] + }, + { + "time": 0.86364, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_left_leg": { + "rotation": [ + { + "time": 0.13636, + "transform": [0, 0, 0] + }, + { + "time": 0.18182, + "transform": [10, 0, 0] + }, + { + "time": 0.22727, + "transform": [0, 0, 0] + }, + { + "time": 0.27273, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.31818, + "transform": [0, 0, 0] + }, + { + "time": 0.36364, + "transform": [10, 0, 0] + }, + { + "time": 0.40909, + "transform": [0, 0, 0] + }, + { + "time": 0.45455, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.54545, + "transform": [10, 0, 0] + }, + { + "time": 0.59091, + "transform": [0, 0, 0] + }, + { + "time": 0.63636, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.68182, + "transform": [0, 0, 0] + }, + { + "time": 0.72727, + "transform": [10, 0, 0] + }, + { + "time": 0.77273, + "transform": [0, 0, 0] + }, + { + "time": 0.81818, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.86364, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.09091, + "transform": [0, 30, 0] + }, + { + "time": 0.90909, + "transform": [0, 30, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [3, 0, 0] + }, + { + "time": 1, + "transform": [3, 0, 0] + } + ] + }, + "hans_gunner_body": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.09091, + "transform": [22.5, 0, 0] + }, + { + "time": 0.13636, + "transform": [10, 0, 0] + }, + { + "time": 0.86364, + "transform": [10, 0, 0] + }, + { + "time": 0.90909, + "transform": [22.5, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.13636, + "transform": [-109.8, 3.46, -6.66] + }, + { + "time": 0.86364, + "transform": [-109.8, 3.46, -6.66] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.00758, + "transform": [0, 0, 0] + }, + { + "time": 0.13636, + "transform": [0.01711, -0.34304, 0.93917] + }, + { + "time": 0.86364, + "transform": [0.01711, -0.34304, 0.93917] + }, + { + "time": 0.99242, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.13636, + "transform": [-44.20344, 15.85078, -18.12598] + }, + { + "time": 0.86364, + "transform": [-44.20344, 15.85078, -18.12598] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.13636, + "transform": [-1, 0, -2] + }, + { + "time": 0.86364, + "transform": [-1, 0, -2] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_right_leg": { + "rotation": [ + { + "time": 0.13636, + "transform": [0, 0, 0] + }, + { + "time": 0.18182, + "transform": [10, 0, 0] + }, + { + "time": 0.22727, + "transform": [0, 0, 0] + }, + { + "time": 0.27273, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.31818, + "transform": [0, 0, 0] + }, + { + "time": 0.36364, + "transform": [10, 0, 0] + }, + { + "time": 0.40909, + "transform": [0, 0, 0] + }, + { + "time": 0.45455, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.54545, + "transform": [10, 0, 0] + }, + { + "time": 0.59091, + "transform": [0, 0, 0] + }, + { + "time": 0.63636, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.68182, + "transform": [0, 0, 0] + }, + { + "time": 0.72727, + "transform": [10, 0, 0] + }, + { + "time": 0.77273, + "transform": [0, 0, 0] + }, + { + "time": 0.81818, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.86364, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_left_leg": { + "rotation": [ + { + "time": 0.13636, + "transform": [0, 0, 0] + }, + { + "time": 0.18182, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.22727, + "transform": [0, 0, 0] + }, + { + "time": 0.27273, + "transform": [10, 0, 0] + }, + { + "time": 0.31818, + "transform": [0, 0, 0] + }, + { + "time": 0.36364, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.40909, + "transform": [0, 0, 0] + }, + { + "time": 0.45455, + "transform": [10, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.54545, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.59091, + "transform": [0, 0, 0] + }, + { + "time": 0.63636, + "transform": [10, 0, 0] + }, + { + "time": 0.68182, + "transform": [0, 0, 0] + }, + { + "time": 0.72727, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.77273, + "transform": [0, 0, 0] + }, + { + "time": 0.81818, + "transform": [10, 0, 0] + }, + { + "time": 0.86364, + "transform": [0, 0, 0] + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/unhook.json b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/unhook.json new file mode 100644 index 000000000..653ac54b6 --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/unhook.json @@ -0,0 +1,527 @@ +{ + "comment": "Made by Pabilo8 with Blockbench", + "groups": { + "weapon": { + "rotation": [ + { + "time": 0.24076, + "transform": [0, 0, 5] + }, + { + "time": 0.33333, + "transform": [0, 0, 12.5] + }, + { + "time": 0.66667, + "transform": [0, 0, 12.5] + }, + { + "time": 1, + "transform": [0, 0, -7.5] + } + ], + "position": [ + { + "time": 0.33333, + "transform": [5, 3, 0] + }, + { + "time": 0.66667, + "transform": [0, 3, 0] + } + ] + }, + "wheel2": { + "rotation": [ + { + "time": 0.24076, + "transform": [0, 0, -55] + }, + { + "time": 0.33333, + "transform": [0, 0, -62.5] + }, + { + "time": 0.66667, + "transform": [0, 0, -12.5] + }, + { + "time": 1, + "transform": [0, 0, 7.5] + } + ], + "position": [ + { + "time": 0.66667, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "wheel1": { + "rotation": [ + { + "time": 0.24076, + "transform": [0, 0, -55] + }, + { + "time": 0.33333, + "transform": [0, 0, -62.5] + }, + { + "time": 0.66667, + "transform": [0, 0, -12.5] + }, + { + "time": 1, + "transform": [0, 0, 7.5] + } + ], + "position": [ + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander": { + "rotation": [ + { + "time": 0, + "transform": [0, 360, 0] + }, + { + "time": 0.24076, + "transform": [0, 320, 0] + }, + { + "time": 0.77778, + "transform": [0, 320, 0] + }, + { + "time": 1, + "transform": [0, 360, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [8, 0, 0] + }, + { + "time": 0.24076, + "transform": [8, 0, 0] + }, + { + "time": 0.33333, + "transform": [8, 0, 0] + }, + { + "time": 0.66667, + "transform": [3, 0, 0] + }, + { + "time": 1, + "transform": [3, 0, 0] + } + ] + }, + "hans_commander_body": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.24076, + "transform": [15, 0, 0] + }, + { + "time": 0.33333, + "transform": [10, 0, 0] + }, + { + "time": 0.66667, + "transform": [10, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.24076, + "transform": [0, 0, 0] + }, + { + "time": 0.66667, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.24076, + "transform": [-64.02, -11.44, 9.77] + }, + { + "time": 0.66667, + "transform": [-64.02, -11.44, 9.77] + }, + { + "time": 0.77778, + "transform": [-61.52, -11.44, 9.77] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.24076, + "transform": [0, -2, -3] + }, + { + "time": 0.77778, + "transform": [0, -2, -3] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.24076, + "transform": [-97.76, 14.87, 2] + }, + { + "time": 0.66667, + "transform": [-97.7614, 14.8687, 2.00307] + }, + { + "time": 0.77778, + "transform": [-97.5, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.24076, + "transform": [0.25764, 0.13784, -1.04468] + }, + { + "time": 0.66667, + "transform": [-0.26147, 0.39009, -2.96302] + }, + { + "time": 0.77778, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_right_leg": { + "rotation": [ + { + "time": 0.24076, + "transform": [0, 0, 0] + }, + { + "time": 0.33333, + "transform": [0, 0, 0] + }, + { + "time": 0.48147, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.53702, + "transform": [-16.25, 0, 0] + }, + { + "time": 0.66667, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.24076, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_left_leg": { + "rotation": [ + { + "time": 0.24076, + "transform": [0, 0, 0] + }, + { + "time": 0.33333, + "transform": [0, 0, 0] + }, + { + "time": 0.48147, + "transform": [12.5, 0, 0] + }, + { + "time": 0.53702, + "transform": [21.25, 0, 0] + }, + { + "time": 0.66667, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.24076, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.24076, + "transform": [0, 30, 0] + }, + { + "time": 0.66667, + "transform": [0, 30, 0] + }, + { + "time": 0.77778, + "transform": [0, 30, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [8, 0, 0] + }, + { + "time": 0.24076, + "transform": [8, 0, 0] + }, + { + "time": 0.33333, + "transform": [8, 0, 0] + }, + { + "time": 0.66667, + "transform": [3, 0, 0] + }, + { + "time": 1, + "transform": [3, 0, 0] + } + ] + }, + "hans_gunner_body": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.24076, + "transform": [17.5, 0, 0] + }, + { + "time": 0.66667, + "transform": [12.5, 0, 0] + }, + { + "time": 0.77778, + "transform": [22.5, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.24076, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.24076, + "transform": [-109.8, 3.46, -6.66] + }, + { + "time": 0.66667, + "transform": [-109.8, 3.46, -6.66] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.24076, + "transform": [0.00423, 0.00392, -0.00167] + }, + { + "time": 0.66667, + "transform": [-0.03423, 0.68608, -1.87833] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.24076, + "transform": [-53.06, 19.3, -21.92] + }, + { + "time": 0.66667, + "transform": [-53.05629, 19.30209, -21.92176] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.24076, + "transform": [-1, 0, -2] + }, + { + "time": 0.66667, + "transform": [-1, 0, -2] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_right_leg": { + "rotation": [ + { + "time": 0.24076, + "transform": [0, 0, 0] + }, + { + "time": 0.33333, + "transform": [0, 0, 0] + }, + { + "time": 0.48147, + "transform": [12.5, 0, 0] + }, + { + "time": 0.53702, + "transform": [21.25, 0, 0] + }, + { + "time": 0.66667, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.24076, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_left_leg": { + "rotation": [ + { + "time": 0.24076, + "transform": [0, 0, 0] + }, + { + "time": 0.33333, + "transform": [0, 0, 0] + }, + { + "time": 0.48147, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.53702, + "transform": [-16.25, 0, 0] + }, + { + "time": 0.66667, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.24076, + "transform": [0, 0, 0] + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/unload1.json b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/unload1.json new file mode 100644 index 000000000..26b8b013b --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/unload1.json @@ -0,0 +1,197 @@ +{ + "comment": "Made by Pabilo8 with Blockbench", + "groups": { + "magazine": { + "position": [ + { + "time": 0.16667, + "transform": [0, 0, 0] + }, + { + "time": 0.33333, + "transform": [0, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 6, 0] + }, + { + "time": 0.66667, + "transform": [0, 6, 0] + } + ], + "scale": [ + { + "time": 0.5, + "transform": [1, 1, 1] + }, + { + "time": 0.66667, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_right_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_left_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander": { + "position": [ + { + "time": 0, + "transform": [-5, 2, -8] + } + ] + }, + "hans_commander_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [-28.93305, 27.81706, 2.04579] + }, + { + "time": 0.16667, + "transform": [-87.01834, -3.56781, -6.71413] + }, + { + "time": 0.33333, + "transform": [-87.01834, -3.56781, -6.71413] + }, + { + "time": 0.5, + "transform": [-124.51834, -3.56781, -6.71413] + }, + { + "time": 0.66667, + "transform": [-124.51834, -3.56781, -6.71413] + }, + { + "time": 1, + "transform": [-28.93305, 27.81706, 2.04579] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, -1] + }, + { + "time": 0.16667, + "transform": [0, 0, -3] + }, + { + "time": 0.33333, + "transform": [0, 0, -3] + }, + { + "time": 0.5, + "transform": [0, 0, -4] + }, + { + "time": 0.66667, + "transform": [0, 0, -4] + }, + { + "time": 1, + "transform": [0, 0, -1] + } + ] + }, + "hans_commander_right_leg": { + "rotation": [ + { + "time": 0, + "transform": [-90, 0, 0] + } + ] + }, + "hans_commander_left_leg": { + "rotation": [ + { + "time": 0, + "transform": [-90, 0, 0] + } + ] + }, + "hans_gunner_body": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/unload2.json b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/unload2.json new file mode 100644 index 000000000..ea5d23b7f --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_flak/unload2.json @@ -0,0 +1,205 @@ +{ + "comment": "Made by Pabilo8 with Blockbench", + "groups": { + "hans_gunner": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_right_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_left_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander": { + "position": [ + { + "time": 0, + "transform": [-5, 2, -8] + } + ] + }, + "hans_commander_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [-28.93305, 27.81706, 2.04579] + }, + { + "time": 0.16667, + "transform": [-87.01834, -3.56781, -6.71413] + }, + { + "time": 0.33333, + "transform": [-101.19583, -38.51104, -4.52898] + }, + { + "time": 0.5, + "transform": [-130.5888, -29.62566, -27.21733] + }, + { + "time": 0.66667, + "transform": [-130.5888, -29.62566, -27.21733] + }, + { + "time": 0.83333, + "transform": [-87.01834, -3.56781, -6.71413] + }, + { + "time": 1, + "transform": [-28.93305, 27.81706, 2.04579] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, -1] + }, + { + "time": 0.16667, + "transform": [0, 0, 0] + }, + { + "time": 0.33333, + "transform": [0, 0, -4] + }, + { + "time": 0.5, + "transform": [0, 0, -5] + }, + { + "time": 0.66667, + "transform": [0, 0, -5] + }, + { + "time": 0.83333, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, -1] + } + ] + }, + "hans_commander_right_leg": { + "rotation": [ + { + "time": 0, + "transform": [-90, 0, 0] + } + ] + }, + "hans_commander_left_leg": { + "rotation": [ + { + "time": 0, + "transform": [-90, 0, 0] + } + ] + }, + "magazine2": { + "position": [ + { + "time": 0.16667, + "transform": [0, 0, 0] + }, + { + "time": 0.33333, + "transform": [0, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 6, 0] + }, + { + "time": 0.66667, + "transform": [0, 6, 0] + } + ], + "scale": [ + { + "time": 0.5, + "transform": [1, 1, 1] + }, + { + "time": 0.66667, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_body": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_howitzer/aim_pitch.json b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_howitzer/aim_pitch.json new file mode 100644 index 000000000..4cc0ddd20 --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_howitzer/aim_pitch.json @@ -0,0 +1,85 @@ +{ + "comment": "Made by Pabilo8 with Blockbench", + "groups": { + "hans_gunner": { + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_body": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_right_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_left_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "weapon": { + "rotation": [ + { + "time": 0, + "transform": [-13.5, 0, 0] + } + ] + }, + "howi": { + "rotation": [ + { + "time": 0, + "transform": [13.5, 0, 0] + }, + { + "time": 1, + "transform": [-76.5, 0, 0] + } + ] + }, + "vertical_drive_guida_mechanismnce": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [0, -500, 0] + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_howitzer/aim_pitch_hans.json b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_howitzer/aim_pitch_hans.json new file mode 100644 index 000000000..19bbfe9ac --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_howitzer/aim_pitch_hans.json @@ -0,0 +1,107 @@ +{ + "comment": "Made by Pabilo8 with Blockbench", + "groups": { + "hans_gunner": { + "position": [ + { + "time": 0, + "transform": [0, -1, 0] + } + ] + }, + "hans_gunner_body": { + "rotation": [ + { + "time": 0, + "transform": [25, 0, 0] + }, + { + "time": 0.5, + "transform": [26, 0, 0] + }, + { + "time": 1, + "transform": [25, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, -1, 0] + }, + { + "time": 1, + "transform": [0, -1, 0] + } + ] + }, + "hans_gunner_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [-24.28915, -22.33076, 27.6048] + }, + { + "time": 0.5, + "transform": [-25.32585, -23.3401, 30.08658] + }, + { + "time": 1, + "transform": [-24.28915, -22.33076, 27.6048] + } + ], + "position": [ + { + "time": 0, + "transform": [1.05105, -1.13014, -1.32887] + }, + { + "time": 1, + "transform": [1.05105, -1.13014, -1.32887] + } + ] + }, + "hans_gunner_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [-32.10382, 5.35355, -8.45862] + }, + { + "time": 0.5, + "transform": [-31.95268, -1.00741, -12.43697] + }, + { + "time": 1, + "transform": [-32.10382, 5.35355, -8.45862] + } + ], + "position": [ + { + "time": 0, + "transform": [0.17365, -0.01281, -0.00816] + }, + { + "time": 1, + "transform": [0.17365, -0.01281, -0.00816] + } + ] + }, + "hans_gunner_right_leg": { + "rotation": [ + { + "time": 0, + "transform": [-5, 0, 0] + } + ] + }, + "hans_gunner_left_leg": { + "rotation": [ + { + "time": 0, + "transform": [7.5, 0, 0] + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_howitzer/backward.json b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_howitzer/backward.json new file mode 100644 index 000000000..90468c3d2 --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_howitzer/backward.json @@ -0,0 +1,353 @@ +{ + "comment": "Made by Pabilo8 with Blockbench", + "groups": { + "hans_gunner": { + "rotation": [ + { + "time": 1, + "transform": [0, -10, 0] + } + ], + "position": [ + { + "time": 1, + "transform": [0.12155, 0, -0.68937] + } + ] + }, + "hans_gunner_body": { + "rotation": [ + { + "time": 0, + "transform": [32.5, 0, 0] + }, + { + "time": 0.25, + "transform": [35, 0, 0] + }, + { + "time": 0.5, + "transform": [32.5, 0, 0] + }, + { + "time": 0.75, + "transform": [35, 0, 0] + }, + { + "time": 1, + "transform": [32.5, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, -0.78217, 0.26116] + }, + { + "time": 0.5, + "transform": [0, -0.78217, 0.26116] + }, + { + "time": 1, + "transform": [0, -0.78217, 0.26116] + } + ] + }, + "hans_gunner_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [-89.00441, -0.49836, 7.34523] + }, + { + "time": 0.15, + "transform": [-104.00441, -0.49836, 7.34523] + }, + { + "time": 0.25, + "transform": [-99.00441, -0.49836, 7.34523] + }, + { + "time": 0.5, + "transform": [-89.00441, -0.49836, 7.34523] + }, + { + "time": 0.65, + "transform": [-104.00441, -0.49836, 7.34523] + }, + { + "time": 0.75, + "transform": [-99.00441, -0.49836, 7.34523] + }, + { + "time": 1, + "transform": [-89.00441, -0.49836, 7.34523] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.25, + "transform": [0.03281, -0.11872, -1.9962] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.75, + "transform": [0.03281, -0.11872, -1.9962] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [-34.6381, -2.70295, 12.28118] + }, + { + "time": 0.5, + "transform": [-34.6381, -2.70295, 12.28118] + }, + { + "time": 1, + "transform": [-34.6381, -2.70295, 12.28118] + } + ], + "position": [ + { + "time": 0, + "transform": [0.36397, -1.3655, -0.47781] + }, + { + "time": 0.25, + "transform": [0.21916, -0.81124, -0.08257] + }, + { + "time": 0.5, + "transform": [0.36397, -1.3655, -0.47781] + }, + { + "time": 0.75, + "transform": [0.21916, -0.81124, -0.08257] + }, + { + "time": 1, + "transform": [0.36397, -1.3655, -0.47781] + } + ] + }, + "hans_gunner_right_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.25, + "transform": [15, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.75, + "transform": [-15, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_left_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.25, + "transform": [-17.5, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.75, + "transform": [17.5, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander": { + "rotation": [ + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_body": { + "rotation": [ + { + "time": 0, + "transform": [25, 0, 0] + }, + { + "time": 0.25, + "transform": [27.5, 0, 0] + }, + { + "time": 0.5, + "transform": [25, 0, 0] + }, + { + "time": 0.75, + "transform": [27.5, 0, 0] + }, + { + "time": 1, + "transform": [25, 0, 0] + } + ] + }, + "hans_commander_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [-23.28442, -6.53984, -10.23906] + }, + { + "time": 0.5, + "transform": [-23.28442, -6.53984, -10.23906] + }, + { + "time": 1, + "transform": [-23.28442, -6.53984, -10.23906] + } + ], + "position": [ + { + "time": 0, + "transform": [-0.11784, -2.40648, -0.62182] + }, + { + "time": 0.25, + "transform": [-0.02482, -1.68046, -0.30582] + }, + { + "time": 0.5, + "transform": [-0.11784, -2.40648, -0.62182] + }, + { + "time": 0.75, + "transform": [-0.02482, -1.68046, -0.30582] + }, + { + "time": 1, + "transform": [-0.11784, -2.40648, -0.62182] + } + ] + }, + "hans_commander_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [-69.77591, 7.51926, -6.86185] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_right_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.25, + "transform": [15, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.75, + "transform": [-15, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_left_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.25, + "transform": [-15, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.75, + "transform": [15, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "weapon": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.25, + "transform": [2.5, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.75, + "transform": [2.5, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_howitzer/fire.json b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_howitzer/fire.json new file mode 100644 index 000000000..982f6840d --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_howitzer/fire.json @@ -0,0 +1,691 @@ +{ + "comment": "Made by Pabilo8 with Blockbench", + "groups": { + "6bcal_light_artillery": { + "scale": [ + { + "time": 0.25, + "transform": [0, 0, 0] + } + ] + }, + "weapon": { + "rotation": [ + { + "time": 0.25, + "transform": [-13.5, 0, 0] + } + ] + }, + "howi": { + "rotation": [ + { + "time": 0.25, + "transform": [0, 0, 0] + }, + { + "time": 0.33333, + "transform": [-5.5, 0, 0] + }, + { + "time": 0.4722, + "transform": [1, 0, 0] + }, + { + "time": 0.61113, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.25, + "transform": [0, 0, 0] + }, + { + "time": 0.33333, + "transform": [0, 0.07676, 1.15792] + }, + { + "time": 0.58333, + "transform": [0, 0, 0] + } + ] + }, + "gun": { + "position": [ + { + "time": 0.25, + "transform": [0, 0, 0] + }, + { + "time": 0.33333, + "transform": [0, 0, 3] + }, + { + "time": 0.55553, + "transform": [0, 0, 0] + } + ] + }, + "bolt": { + "position": [ + { + "time": 0.25, + "transform": [0, 0, 0] + }, + { + "time": 0.33333, + "transform": [0, 0, -2] + }, + { + "time": 0.38887, + "transform": [0, 0, -1.2] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + } + ], + "scale": [ + { + "time": 0.25, + "transform": [1, 1, 1] + }, + { + "time": 0.33333, + "transform": [1, 1, 2] + }, + { + "time": 0.38887, + "transform": [1, 1, 1.6] + }, + { + "time": 0.5, + "transform": [1, 1, 1] + } + ] + }, + "wheel2": { + "rotation": [ + { + "time": 0.25, + "transform": [0, 0, 0] + }, + { + "time": 0.33333, + "transform": [-15, 0, 0] + }, + { + "time": 0.44447, + "transform": [-10, 0, 0] + }, + { + "time": 0.5278, + "transform": [2.5, 0, 0] + }, + { + "time": 0.61113, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.25, + "transform": [0, 0, 0] + }, + { + "time": 0.33333, + "transform": [0, -0.49497, -0.85732] + }, + { + "time": 0.44447, + "transform": [0, 0.60513, -0.02584] + }, + { + "time": 0.5278, + "transform": [0, -0.09962, 0.00745] + }, + { + "time": 0.61113, + "transform": [0, 0, 0] + } + ] + }, + "wheel1": { + "rotation": [ + { + "time": 0.25, + "transform": [0, 0, 0] + }, + { + "time": 0.33333, + "transform": [-15, 0, 0] + }, + { + "time": 0.44447, + "transform": [-10, 0, 0] + }, + { + "time": 0.5278, + "transform": [2.5, 0, 0] + }, + { + "time": 0.61113, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.25, + "transform": [0, 0, 0] + }, + { + "time": 0.33333, + "transform": [0, -0.49497, -0.85732] + }, + { + "time": 0.44447, + "transform": [0, 0.60513, -0.02584] + }, + { + "time": 0.5278, + "transform": [0, -0.09962, 0.00745] + }, + { + "time": 0.61113, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.16667, + "transform": [0, 12.5, 0] + }, + { + "time": 0.83333, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.2222, + "transform": [0.28986, 0, 1.97888] + }, + { + "time": 0.36113, + "transform": [0.28986, 0, 1.97888] + }, + { + "time": 0.44447, + "transform": [0.28986, 0, 1.97888] + }, + { + "time": 0.83333, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_body": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.16667, + "transform": [0, 0, 0] + }, + { + "time": 0.25, + "transform": [0, 0, 0] + }, + { + "time": 0.30553, + "transform": [-7.5, 0, 0] + }, + { + "time": 0.44447, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_head": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.16667, + "transform": [22.5, 27.5, 0] + }, + { + "time": 0.38887, + "transform": [22.5, 27.5, 0] + }, + { + "time": 0.4722, + "transform": [22.5, 27.5, 0] + }, + { + "time": 0.83333, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.16667, + "transform": [24.97911, -1.05627, -2.26603] + }, + { + "time": 0.36113, + "transform": [-5.97118, -0.48751, -1.04586] + }, + { + "time": 0.5278, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.16667, + "transform": [-74.23188, 14.13311, -5.14056] + }, + { + "time": 0.36113, + "transform": [-112.93162, 26.12797, -8.89674] + }, + { + "time": 0.44447, + "transform": [-112.93162, 26.12797, -8.89674] + }, + { + "time": 0.83333, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.16667, + "transform": [-1.37078, -1.08145, -2.42005] + }, + { + "time": 0.83333, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_right_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.16667, + "transform": [-4.99762, -0.10901, 2.49762] + }, + { + "time": 0.44447, + "transform": [-4.99762, -0.10901, 2.49762] + }, + { + "time": 0.83333, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_left_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.16667, + "transform": [12.45392, -1.08089, -4.88206] + }, + { + "time": 0.44447, + "transform": [12.45392, -1.08089, -4.88206] + }, + { + "time": 0.83333, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.2222, + "transform": [0, 46.67, 0] + }, + { + "time": 0.2778, + "transform": [-1.62084, 58.32085, 1.90443] + }, + { + "time": 0.33333, + "transform": [0, 70, 0] + }, + { + "time": 0.44447, + "transform": [0, 70, 0] + }, + { + "time": 0.55553, + "transform": [0, 70, 0] + }, + { + "time": 0.83333, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.2222, + "transform": [0, 0, 0] + }, + { + "time": 0.2778, + "transform": [-0.10497, -0.00349, 0.1702] + }, + { + "time": 0.33333, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_body": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.2222, + "transform": [5, 0, 0] + }, + { + "time": 0.2778, + "transform": [7.5, 0, 0] + }, + { + "time": 0.33333, + "transform": [2.5, 0, 0] + }, + { + "time": 0.4722, + "transform": [10, 0, 0] + }, + { + "time": 0.55553, + "transform": [10, 0, 0] + }, + { + "time": 0.83333, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_head": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.33333, + "transform": [23.29858, 24.60651, -2.10233] + }, + { + "time": 0.5, + "transform": [23.29858, 24.60651, -2.10233] + }, + { + "time": 0.83333, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.2778, + "transform": [-172.5, 0, -2.5] + }, + { + "time": 0.33333, + "transform": [-175, 0, -2.5] + }, + { + "time": 0.44447, + "transform": [-172.5, 0, -2.5] + }, + { + "time": 0.55553, + "transform": [-172.5, 0, -2.5] + }, + { + "time": 0.7778, + "transform": [-86.06812, -17.46132, -0.0685] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.2778, + "transform": [0, -1, 1] + }, + { + "time": 0.44447, + "transform": [0, -1, 1] + }, + { + "time": 0.55553, + "transform": [0, -1, 1] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.2778, + "transform": [-153.65745, 22.00476, 1.65038] + }, + { + "time": 0.33333, + "transform": [-156.15745, 22.00476, 1.65038] + }, + { + "time": 0.44447, + "transform": [-153.65745, 22.00476, 1.65038] + }, + { + "time": 0.55553, + "transform": [-153.65745, 22.00476, 1.65038] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.2778, + "transform": [0, -0.99905, 0.04362] + }, + { + "time": 0.44447, + "transform": [0, -0.99905, 0.04362] + }, + { + "time": 0.55553, + "transform": [0, -0.99905, 0.04362] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_right_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.33333, + "transform": [14.87739, 1.93597, 7.24721] + }, + { + "time": 0.44447, + "transform": [14.88, 1.94, 7.25] + }, + { + "time": 0.55553, + "transform": [14.88, 1.94, 7.25] + }, + { + "time": 0.83333, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_left_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.33333, + "transform": [-12.48848, 0.54094, -2.44081] + }, + { + "time": 0.44447, + "transform": [-12.49, 0.54, -2.44] + }, + { + "time": 0.55553, + "transform": [-12.49, 0.54, -2.44] + }, + { + "time": 0.83333, + "transform": [0, 0, 0] + } + ] + }, + "vertical_drive_guida_mechanismnce": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.25, + "transform": [0, 0, 0] + }, + { + "time": 0.36113, + "transform": [0, -37.5, 0] + }, + { + "time": 0.55553, + "transform": [0, 0, 0] + } + ] + }, + "lever": { + "rotation": [ + { + "time": 0.16667, + "transform": [0, 0, 0] + }, + { + "time": 0.30553, + "transform": [70, 0, 0] + }, + { + "time": 0.38887, + "transform": [55, 0, 0] + }, + { + "time": 0.5, + "transform": [-17.49762, 0, 0] + }, + { + "time": 0.61113, + "transform": [0, 0, 0] + } + ] + }, + "6bcal_light_artillery_case": { + "scale": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_howitzer/forward.json b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_howitzer/forward.json new file mode 100644 index 000000000..1d7750907 --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_howitzer/forward.json @@ -0,0 +1,353 @@ +{ + "comment": "Made by Pabilo8 with Blockbench", + "groups": { + "hans_gunner": { + "rotation": [ + { + "time": 0, + "transform": [0, -10, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0.12155, 0, -0.68937] + } + ] + }, + "hans_gunner_body": { + "rotation": [ + { + "time": 0, + "transform": [32.5, 0, 0] + }, + { + "time": 0.25, + "transform": [35, 0, 0] + }, + { + "time": 0.5, + "transform": [32.5, 0, 0] + }, + { + "time": 0.75, + "transform": [35, 0, 0] + }, + { + "time": 1, + "transform": [32.5, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, -0.78217, 0.26116] + }, + { + "time": 0.5, + "transform": [0, -0.78217, 0.26116] + }, + { + "time": 1, + "transform": [0, -0.78217, 0.26116] + } + ] + }, + "hans_gunner_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [-89.00441, -0.49836, 7.34523] + }, + { + "time": 0.25, + "transform": [-99.00441, -0.49836, 7.34523] + }, + { + "time": 0.4, + "transform": [-104.00441, -0.49836, 7.34523] + }, + { + "time": 0.5, + "transform": [-89.00441, -0.49836, 7.34523] + }, + { + "time": 0.75, + "transform": [-99.00441, -0.49836, 7.34523] + }, + { + "time": 0.9, + "transform": [-104.00441, -0.49836, 7.34523] + }, + { + "time": 1, + "transform": [-89.00441, -0.49836, 7.34523] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.25, + "transform": [0.03281, -0.11872, -1.9962] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.75, + "transform": [0.03281, -0.11872, -1.9962] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [-34.6381, -2.70295, 12.28118] + }, + { + "time": 0.5, + "transform": [-34.6381, -2.70295, 12.28118] + }, + { + "time": 1, + "transform": [-34.6381, -2.70295, 12.28118] + } + ], + "position": [ + { + "time": 0, + "transform": [0.36397, -1.3655, -0.47781] + }, + { + "time": 0.25, + "transform": [0.21916, -0.81124, -0.08257] + }, + { + "time": 0.5, + "transform": [0.36397, -1.3655, -0.47781] + }, + { + "time": 0.75, + "transform": [0.21916, -0.81124, -0.08257] + }, + { + "time": 1, + "transform": [0.36397, -1.3655, -0.47781] + } + ] + }, + "hans_gunner_right_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.25, + "transform": [-15, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.75, + "transform": [15, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_left_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.25, + "transform": [17.5, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.75, + "transform": [-17.5, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_body": { + "rotation": [ + { + "time": 0, + "transform": [25, 0, 0] + }, + { + "time": 0.25, + "transform": [27.5, 0, 0] + }, + { + "time": 0.5, + "transform": [25, 0, 0] + }, + { + "time": 0.75, + "transform": [27.5, 0, 0] + }, + { + "time": 1, + "transform": [25, 0, 0] + } + ] + }, + "hans_commander_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [-23.28442, -6.53984, -10.23906] + }, + { + "time": 0.5, + "transform": [-23.28442, -6.53984, -10.23906] + }, + { + "time": 1, + "transform": [-23.28442, -6.53984, -10.23906] + } + ], + "position": [ + { + "time": 0, + "transform": [-0.11784, -2.40648, -0.62182] + }, + { + "time": 0.25, + "transform": [-0.02482, -1.68046, -0.30582] + }, + { + "time": 0.5, + "transform": [-0.11784, -2.40648, -0.62182] + }, + { + "time": 0.75, + "transform": [-0.02482, -1.68046, -0.30582] + }, + { + "time": 1, + "transform": [-0.11784, -2.40648, -0.62182] + } + ] + }, + "hans_commander_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [-72.27591, 7.51926, -6.86185] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_right_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.25, + "transform": [-15, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.75, + "transform": [15, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_left_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.25, + "transform": [15, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.75, + "transform": [-15, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "weapon": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.25, + "transform": [2.5, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.75, + "transform": [2.5, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_howitzer/left.json b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_howitzer/left.json new file mode 100644 index 000000000..c5a1218d6 --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_howitzer/left.json @@ -0,0 +1,353 @@ +{ + "comment": "Made by Pabilo8 with Blockbench", + "groups": { + "hans_gunner": { + "rotation": [ + { + "time": 1, + "transform": [0, -10, 0] + } + ], + "position": [ + { + "time": 1, + "transform": [0.12155, 0, -0.68937] + } + ] + }, + "hans_gunner_body": { + "rotation": [ + { + "time": 0, + "transform": [32.5, 0, 0] + }, + { + "time": 0.25, + "transform": [35, 0, 0] + }, + { + "time": 0.5, + "transform": [32.5, 0, 0] + }, + { + "time": 0.75, + "transform": [35, 0, 0] + }, + { + "time": 1, + "transform": [32.5, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, -0.78217, 0.26116] + }, + { + "time": 0.5, + "transform": [0, -0.78217, 0.26116] + }, + { + "time": 1, + "transform": [0, -0.78217, 0.26116] + } + ] + }, + "hans_gunner_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [-89.00441, -0.49836, 7.34523] + }, + { + "time": 0.15, + "transform": [-104.00441, -0.49836, 7.34523] + }, + { + "time": 0.25, + "transform": [-99.00441, -0.49836, 7.34523] + }, + { + "time": 0.5, + "transform": [-89.00441, -0.49836, 7.34523] + }, + { + "time": 0.65, + "transform": [-104.00441, -0.49836, 7.34523] + }, + { + "time": 0.75, + "transform": [-99.00441, -0.49836, 7.34523] + }, + { + "time": 1, + "transform": [-89.00441, -0.49836, 7.34523] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.25, + "transform": [0.03281, -0.11872, -1.9962] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.75, + "transform": [0.03281, -0.11872, -1.9962] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [-34.6381, -2.70295, 12.28118] + }, + { + "time": 0.5, + "transform": [-34.6381, -2.70295, 12.28118] + }, + { + "time": 1, + "transform": [-34.6381, -2.70295, 12.28118] + } + ], + "position": [ + { + "time": 0, + "transform": [0.36397, -1.3655, -0.47781] + }, + { + "time": 0.25, + "transform": [0.21916, -0.81124, -0.08257] + }, + { + "time": 0.5, + "transform": [0.36397, -1.3655, -0.47781] + }, + { + "time": 0.75, + "transform": [0.21916, -0.81124, -0.08257] + }, + { + "time": 1, + "transform": [0.36397, -1.3655, -0.47781] + } + ] + }, + "hans_gunner_right_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.25, + "transform": [15, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.75, + "transform": [-15, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_left_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.25, + "transform": [-17.5, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.75, + "transform": [17.5, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander": { + "rotation": [ + { + "time": 0, + "transform": [0, 27.5, 0] + } + ] + }, + "hans_commander_body": { + "rotation": [ + { + "time": 0, + "transform": [25, 0, 0] + }, + { + "time": 0.25, + "transform": [27.5, 0, 0] + }, + { + "time": 0.5, + "transform": [25, 0, 0] + }, + { + "time": 0.75, + "transform": [27.5, 0, 0] + }, + { + "time": 1, + "transform": [25, 0, 0] + } + ] + }, + "hans_commander_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [-23.28442, -6.53984, -10.23906] + }, + { + "time": 0.5, + "transform": [-23.28442, -6.53984, -10.23906] + }, + { + "time": 1, + "transform": [-23.28442, -6.53984, -10.23906] + } + ], + "position": [ + { + "time": 0, + "transform": [-0.11784, -2.40648, -0.62182] + }, + { + "time": 0.25, + "transform": [-0.02482, -1.68046, -0.30582] + }, + { + "time": 0.5, + "transform": [-0.11784, -2.40648, -0.62182] + }, + { + "time": 0.75, + "transform": [-0.02482, -1.68046, -0.30582] + }, + { + "time": 1, + "transform": [-0.11784, -2.40648, -0.62182] + } + ] + }, + "hans_commander_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [-107.27591, 7.51926, -6.86185] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_right_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.25, + "transform": [-15, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.75, + "transform": [15, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_left_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.25, + "transform": [15, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.75, + "transform": [-15, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "weapon": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.25, + "transform": [2.5, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.75, + "transform": [2.5, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_howitzer/load.json b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_howitzer/load.json new file mode 100644 index 000000000..19a95aac4 --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_howitzer/load.json @@ -0,0 +1,889 @@ +{ + "comment": "Made by Pabilo8 with Blockbench", + "groups": { + "hans_gunner": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.0625, + "transform": [0, -12.5, 0] + }, + { + "time": 0.40625, + "transform": [0, -12.5, 0] + }, + { + "time": 0.5625, + "transform": [0, -67.5, 0] + }, + { + "time": 0.75, + "transform": [0, -47.5, 0] + }, + { + "time": 0.8125, + "transform": [0, -47.5, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_body": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.0625, + "transform": [12.5, 0, 0] + }, + { + "time": 0.10418, + "transform": [15, 0, 0] + }, + { + "time": 0.17708, + "transform": [17.5, 0, 0] + }, + { + "time": 0.22918, + "transform": [15, 0, 0] + }, + { + "time": 0.30208, + "transform": [27.5, 0, 0] + }, + { + "time": 0.40625, + "transform": [27.5, 0, 0] + }, + { + "time": 0.5625, + "transform": [0, 0, 0] + }, + { + "time": 0.65625, + "transform": [0, 0, 0] + }, + { + "time": 0.75, + "transform": [7.5, 0, 0] + }, + { + "time": 0.8125, + "transform": [10, 0, 0] + }, + { + "time": 0.86458, + "transform": [10, 0, 0] + }, + { + "time": 0.94793, + "transform": [3.85, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.0625, + "transform": [-73.99034, -24.59477, 4.62934] + }, + { + "time": 0.10418, + "transform": [-68.99034, -24.59477, 4.62934] + }, + { + "time": 0.17708, + "transform": [-73.99034, -24.59477, 4.62934] + }, + { + "time": 0.22918, + "transform": [-76.49034, -24.59477, 4.62934] + }, + { + "time": 0.30208, + "transform": [-76.9583, -19.72818, 3.38994] + }, + { + "time": 0.40625, + "transform": [-76.9583, -19.72818, 3.38994] + }, + { + "time": 0.48958, + "transform": [-34.9836, -18.12007, 7.1952] + }, + { + "time": 0.5625, + "transform": [-84.13436, -27.19119, 4.2019] + }, + { + "time": 0.65625, + "transform": [-84.13436, -27.19119, 4.2019] + }, + { + "time": 0.75, + "transform": [-106.63436, -27.19119, 4.2019] + }, + { + "time": 0.8125, + "transform": [-112.79679, -15.16893, 7.88255] + }, + { + "time": 0.86458, + "transform": [-91.85276, -25.50368, 11.69596] + }, + { + "time": 0.90625, + "transform": [-63.59, -17.66, 8.1] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.0625, + "transform": [0.4162, -0.326, -0.84883] + }, + { + "time": 0.30208, + "transform": [0.84222, -0.53019, -1.73412] + }, + { + "time": 0.40625, + "transform": [0.84222, -0.53019, -1.73412] + }, + { + "time": 0.8125, + "transform": [1.02581, -0.11311, -2.61977] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.0625, + "transform": [-19.85158, 4.53202, -6.13812] + }, + { + "time": 0.10418, + "transform": [-19.85, 4.53, -6.14] + }, + { + "time": 0.15625, + "transform": [-66.07738, 36.87497, -9.59654] + }, + { + "time": 0.22918, + "transform": [-68.57738, 36.87497, -9.59654] + }, + { + "time": 0.40625, + "transform": [-71.07738, 36.87497, -9.59654] + }, + { + "time": 0.45833, + "transform": [-37.07954, 16.00377, -4.84765] + }, + { + "time": 0.5625, + "transform": [-93.89393, -2.25854, -0.69237] + }, + { + "time": 0.65625, + "transform": [-118.02346, -26.66738, 5.64022] + }, + { + "time": 0.75, + "transform": [-114.14699, 16.07057, 8.93913] + }, + { + "time": 0.8125, + "transform": [-114.14699, 16.07057, 8.93913] + }, + { + "time": 0.88543, + "transform": [-94.75649, 9.8209, 5.4628] + }, + { + "time": 0.90625, + "transform": [-98.77804, 8.03528, 4.46957] + }, + { + "time": 0.92708, + "transform": [-77.79959, 6.24967, 3.47633] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.30208, + "transform": [-1.22881, -0.28029, -1.55289] + }, + { + "time": 0.40625, + "transform": [-1.22881, -0.28029, -1.55289] + }, + { + "time": 0.5625, + "transform": [-1.71, 0.27, -2.91] + }, + { + "time": 0.65625, + "transform": [0, 0, 0] + }, + { + "time": 0.8125, + "transform": [-2.48078, 1.13901, -5.07367] + }, + { + "time": 0.88543, + "transform": [-1.51, 0.69, -3.1] + }, + { + "time": 0.92708, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_right_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.0625, + "transform": [-7.5, 0, 0] + }, + { + "time": 0.22918, + "transform": [-7.5, 0, 0] + }, + { + "time": 0.30208, + "transform": [-10, 0, 0] + }, + { + "time": 0.40625, + "transform": [-10, 0, 0] + }, + { + "time": 0.5625, + "transform": [7.5, 0, 0] + }, + { + "time": 0.8125, + "transform": [7.5, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_left_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.0625, + "transform": [10, 0, 0] + }, + { + "time": 0.22918, + "transform": [10, 0, 0] + }, + { + "time": 0.30208, + "transform": [12.5, 0, 0] + }, + { + "time": 0.40625, + "transform": [12.5, 0, 0] + }, + { + "time": 0.5625, + "transform": [-12.5, 0, 0] + }, + { + "time": 0.8125, + "transform": [-12.5, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander": { + "rotation": [ + { + "time": 0.08333, + "transform": [0, 0, 0] + }, + { + "time": 0.1875, + "transform": [0, 27.5, 0] + }, + { + "time": 0.375, + "transform": [0, 27.5, 0] + }, + { + "time": 0.4375, + "transform": [0, 70, 0] + }, + { + "time": 0.46875, + "transform": [0, 85, 0] + }, + { + "time": 0.47918, + "transform": [0, 85, 0] + }, + { + "time": 0.6875, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_body": { + "rotation": [ + { + "time": 0.08333, + "transform": [0, 0, 0] + }, + { + "time": 0.23958, + "transform": [2.5, 7.5, 0] + }, + { + "time": 0.3125, + "transform": [7.5, 7.5, 0] + }, + { + "time": 0.375, + "transform": [7.5, 7.5, 0] + }, + { + "time": 0.4375, + "transform": [-2.68267, 22.48485, 0.70008] + }, + { + "time": 0.47918, + "transform": [-2.68, 22.48, 0.7] + }, + { + "time": 0.6875, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_left_arm": { + "rotation": [ + { + "time": 0.08333, + "transform": [0, 0, 0] + }, + { + "time": 0.23958, + "transform": [10, 0, 0] + }, + { + "time": 0.375, + "transform": [10, 0, 0] + }, + { + "time": 0.47918, + "transform": [-29.9055, 2.49762, -4.33287] + }, + { + "time": 0.6875, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_right_arm": { + "rotation": [ + { + "time": 0.08333, + "transform": [0, 0, 0] + }, + { + "time": 0.27083, + "transform": [-111.88023, 23.39896, 9.06159] + }, + { + "time": 0.3125, + "transform": [-106.88023, 23.39896, 9.06159] + }, + { + "time": 0.375, + "transform": [-106.88023, 23.39896, 9.06159] + }, + { + "time": 0.40625, + "transform": [-118.77227, 32.93964, 12.56516] + }, + { + "time": 0.42708, + "transform": [-108.78342, 34.58362, 12.82257] + }, + { + "time": 0.4375, + "transform": [-105.66432, 42.48032, 16.06872] + }, + { + "time": 0.46875, + "transform": [-103.66336, 54.70598, 20.04385] + }, + { + "time": 0.47918, + "transform": [-103.66, 54.71, 20.04] + }, + { + "time": 0.5625, + "transform": [-88.88274, -0.38564, 13.75489] + }, + { + "time": 0.6875, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.08333, + "transform": [0, 0, 0] + }, + { + "time": 0.27083, + "transform": [-1.69047, 1.2399, -3.4066] + }, + { + "time": 0.3125, + "transform": [-1.69, 1.24, -3.41] + }, + { + "time": 0.375, + "transform": [-1.69, 1.24, -3.41] + }, + { + "time": 0.40625, + "transform": [-1.35274, 0.85253, -2.47488] + }, + { + "time": 0.4375, + "transform": [-1.44862, 0.62749, -2.46105] + }, + { + "time": 0.47918, + "transform": [-2.15, 0.71, -3.17] + }, + { + "time": 0.5625, + "transform": [-1.44108, 0.9623, -0.65425] + }, + { + "time": 0.6875, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_right_leg": { + "rotation": [ + { + "time": 0.08333, + "transform": [0, 0, 0] + }, + { + "time": 0.23958, + "transform": [12.49067, 0.43399, 2.46207] + }, + { + "time": 0.375, + "transform": [12.49, 0.43, 2.46] + }, + { + "time": 0.47918, + "transform": [-10.01, 0.43, 2.46] + }, + { + "time": 0.6875, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.47918, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_left_leg": { + "rotation": [ + { + "time": 0.08333, + "transform": [0, 0, 0] + }, + { + "time": 0.23958, + "transform": [-9.96271, 0.86717, -4.92442] + }, + { + "time": 0.375, + "transform": [-9.96, 0.87, -4.92] + }, + { + "time": 0.47918, + "transform": [15.04, 0.87, -4.92] + }, + { + "time": 0.6875, + "transform": [0, 0, 0] + } + ] + }, + "weapon": { + "rotation": [ + { + "time": 0.0625, + "transform": [-13.5, 0, 0] + } + ] + }, + "breech": { + "rotation": [ + { + "time": 0.0625, + "transform": [0, 0, 0] + }, + { + "time": 0.10418, + "transform": [2.5, 0, 0] + }, + { + "time": 0.17708, + "transform": [2.5, 0, 0] + }, + { + "time": 0.23958, + "transform": [0, 0, 0] + }, + { + "time": 0.3125, + "transform": [50, 0, 0] + }, + { + "time": 0.41668, + "transform": [50, 0, 0] + }, + { + "time": 0.46875, + "transform": [20, 0, 0] + }, + { + "time": 0.64583, + "transform": [20, 0, 0] + }, + { + "time": 0.66668, + "transform": [30, 0, 0] + }, + { + "time": 0.69793, + "transform": [33.13, 0, 0] + }, + { + "time": 0.72918, + "transform": [37.75, 0, 0] + }, + { + "time": 0.75, + "transform": [45, 0, 0] + }, + { + "time": 0.86458, + "transform": [20, 0, 0] + }, + { + "time": 0.90625, + "transform": [20, 0, 0] + }, + { + "time": 0.94793, + "transform": [0, 0, 0] + } + ] + }, + "6bcal_light_artillery": { + "rotation": [ + { + "time": 0.5625, + "transform": [24.71783, 3.15049, -0.89256] + }, + { + "time": 0.65625, + "transform": [24.72, 3.15, -0.89] + }, + { + "time": 0.75, + "transform": [49.72, 0, 0] + }, + { + "time": 0.875, + "transform": [0, 0, 0] + } + ], + "position": [ + { + "time": 0.5625, + "transform": [0.06593, 9.38653, 13.37126] + }, + { + "time": 0.65625, + "transform": [0.07, 9.39, 13.37] + }, + { + "time": 0.75, + "transform": [0, 5.21642, 4.3001] + }, + { + "time": 0.875, + "transform": [0, 0, 0] + } + ], + "scale": [ + { + "time": 0.5625, + "transform": [0, 0, 0] + }, + { + "time": 0.65625, + "transform": [1, 1, 1] + } + ] + }, + "lever": { + "rotation": [ + { + "time": 0.0625, + "transform": [0, 0, 0] + }, + { + "time": 0.10418, + "transform": [-16.67, 0, 0] + }, + { + "time": 0.17708, + "transform": [-16.67, 0, 0] + }, + { + "time": 0.22918, + "transform": [0, 0, 0] + }, + { + "time": 0.30208, + "transform": [-67.5, 0, 0] + }, + { + "time": 0.41668, + "transform": [-67.5, 0, 0] + }, + { + "time": 0.46875, + "transform": [-37.5, 0, 0] + }, + { + "time": 0.64583, + "transform": [-37.5, 0, 0] + }, + { + "time": 0.86458, + "transform": [-37.5, 0, 0] + }, + { + "time": 0.90625, + "transform": [-37.5, 0, 0] + }, + { + "time": 0.94793, + "transform": [20, 0, 0] + }, + { + "time": 0.96875, + "transform": [0, 0, 0] + } + ] + }, + "wheel1": { + "rotation": [ + { + "time": 0.375, + "transform": [0, 0, 0] + } + ] + }, + "6bcal_light_artillery_case": { + "rotation": [ + { + "time": 0.22918, + "transform": [0, 0, 0] + }, + { + "time": 0.30208, + "transform": [47.5, 0, 0] + }, + { + "time": 0.375, + "transform": [47.5, 0, 0] + }, + { + "time": 0.41668, + "transform": [37.5, 0, 0] + }, + { + "time": 0.45833, + "transform": [-30, 0, 0] + }, + { + "time": 0.5, + "transform": [-90, 0, 0] + }, + { + "time": 0.53125, + "transform": [-145, 0, 0] + }, + { + "time": 0.5625, + "transform": [-220, 0, 0] + }, + { + "time": 0.59375, + "transform": [-295, 0, 0] + }, + { + "time": 0.64583, + "transform": [-347.5, 0, 0] + }, + { + "time": 0.67708, + "transform": [-355, 0, 0] + }, + { + "time": 0.70833, + "transform": [-347.5, 0, 0] + } + ], + "position": [ + { + "time": 0.22918, + "transform": [0, 0, 0] + }, + { + "time": 0.28125, + "transform": [0, 1.58184, 0.10027] + }, + { + "time": 0.30208, + "transform": [0, 3, 1.3] + }, + { + "time": 0.375, + "transform": [0, 3, 1.3] + }, + { + "time": 0.41668, + "transform": [0, 10.07869, 9.52288] + }, + { + "time": 0.45833, + "transform": [0, 11.51579, 20.42589] + }, + { + "time": 0.5, + "transform": [0, 7.37614, 25.20791] + }, + { + "time": 0.53125, + "transform": [0, 2.79309, 30.86334] + }, + { + "time": 0.5625, + "transform": [0, -6.52207, 34.6723] + }, + { + "time": 0.59375, + "transform": [0, -5.11933, 40.50422] + }, + { + "time": 0.64583, + "transform": [0, -5.35607, 46.17891] + }, + { + "time": 0.67708, + "transform": [0, -4.34866, 46.96561] + }, + { + "time": 0.70833, + "transform": [0, -5.1279, 47.15676] + }, + { + "time": 0.8125, + "transform": [0, -7.07474, 47.62689] + } + ], + "scale": [ + { + "time": 0.67708, + "transform": [1, 1, 1] + }, + { + "time": 0.8125, + "transform": [0, 0, 0] + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_howitzer/right.json b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_howitzer/right.json new file mode 100644 index 000000000..c5a1218d6 --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_howitzer/right.json @@ -0,0 +1,353 @@ +{ + "comment": "Made by Pabilo8 with Blockbench", + "groups": { + "hans_gunner": { + "rotation": [ + { + "time": 1, + "transform": [0, -10, 0] + } + ], + "position": [ + { + "time": 1, + "transform": [0.12155, 0, -0.68937] + } + ] + }, + "hans_gunner_body": { + "rotation": [ + { + "time": 0, + "transform": [32.5, 0, 0] + }, + { + "time": 0.25, + "transform": [35, 0, 0] + }, + { + "time": 0.5, + "transform": [32.5, 0, 0] + }, + { + "time": 0.75, + "transform": [35, 0, 0] + }, + { + "time": 1, + "transform": [32.5, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, -0.78217, 0.26116] + }, + { + "time": 0.5, + "transform": [0, -0.78217, 0.26116] + }, + { + "time": 1, + "transform": [0, -0.78217, 0.26116] + } + ] + }, + "hans_gunner_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [-89.00441, -0.49836, 7.34523] + }, + { + "time": 0.15, + "transform": [-104.00441, -0.49836, 7.34523] + }, + { + "time": 0.25, + "transform": [-99.00441, -0.49836, 7.34523] + }, + { + "time": 0.5, + "transform": [-89.00441, -0.49836, 7.34523] + }, + { + "time": 0.65, + "transform": [-104.00441, -0.49836, 7.34523] + }, + { + "time": 0.75, + "transform": [-99.00441, -0.49836, 7.34523] + }, + { + "time": 1, + "transform": [-89.00441, -0.49836, 7.34523] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.25, + "transform": [0.03281, -0.11872, -1.9962] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.75, + "transform": [0.03281, -0.11872, -1.9962] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [-34.6381, -2.70295, 12.28118] + }, + { + "time": 0.5, + "transform": [-34.6381, -2.70295, 12.28118] + }, + { + "time": 1, + "transform": [-34.6381, -2.70295, 12.28118] + } + ], + "position": [ + { + "time": 0, + "transform": [0.36397, -1.3655, -0.47781] + }, + { + "time": 0.25, + "transform": [0.21916, -0.81124, -0.08257] + }, + { + "time": 0.5, + "transform": [0.36397, -1.3655, -0.47781] + }, + { + "time": 0.75, + "transform": [0.21916, -0.81124, -0.08257] + }, + { + "time": 1, + "transform": [0.36397, -1.3655, -0.47781] + } + ] + }, + "hans_gunner_right_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.25, + "transform": [15, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.75, + "transform": [-15, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_left_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.25, + "transform": [-17.5, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.75, + "transform": [17.5, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander": { + "rotation": [ + { + "time": 0, + "transform": [0, 27.5, 0] + } + ] + }, + "hans_commander_body": { + "rotation": [ + { + "time": 0, + "transform": [25, 0, 0] + }, + { + "time": 0.25, + "transform": [27.5, 0, 0] + }, + { + "time": 0.5, + "transform": [25, 0, 0] + }, + { + "time": 0.75, + "transform": [27.5, 0, 0] + }, + { + "time": 1, + "transform": [25, 0, 0] + } + ] + }, + "hans_commander_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [-23.28442, -6.53984, -10.23906] + }, + { + "time": 0.5, + "transform": [-23.28442, -6.53984, -10.23906] + }, + { + "time": 1, + "transform": [-23.28442, -6.53984, -10.23906] + } + ], + "position": [ + { + "time": 0, + "transform": [-0.11784, -2.40648, -0.62182] + }, + { + "time": 0.25, + "transform": [-0.02482, -1.68046, -0.30582] + }, + { + "time": 0.5, + "transform": [-0.11784, -2.40648, -0.62182] + }, + { + "time": 0.75, + "transform": [-0.02482, -1.68046, -0.30582] + }, + { + "time": 1, + "transform": [-0.11784, -2.40648, -0.62182] + } + ] + }, + "hans_commander_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [-107.27591, 7.51926, -6.86185] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_right_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.25, + "transform": [-15, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.75, + "transform": [15, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_left_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.25, + "transform": [15, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.75, + "transform": [-15, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + }, + "weapon": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.25, + "transform": [2.5, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + }, + { + "time": 0.75, + "transform": [2.5, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, 0] + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_howitzer/setup.json b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_howitzer/setup.json new file mode 100644 index 000000000..a6d3aeb6e --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/animations/vehicle/field_howitzer/setup.json @@ -0,0 +1,217 @@ +{ + "comment": "Made by Pabilo8 with Blockbench", + "groups": { + "weapon": { + "rotation": [ + { + "time": 0.125, + "transform": [-13.5, 0, 0] + }, + { + "time": 0.625, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.5, + "transform": [0, -10, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.5, + "transform": [0.12155, 0, -0.68937] + } + ] + }, + "hans_gunner_body": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.5, + "transform": [32.5, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.5, + "transform": [0, -0.78217, 0.26116] + } + ] + }, + "hans_gunner_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.5, + "transform": [-89.00441, -0.49836, 7.34523] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.5, + "transform": [-34.6381, -2.70295, 12.28118] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.5, + "transform": [0.36397, -1.3655, -0.47781] + } + ] + }, + "hans_gunner_right_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_gunner_left_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 27.5, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_body": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.5, + "transform": [25, 0, 0] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_left_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.5, + "transform": [-23.28442, -6.53984, -10.23906] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.5, + "transform": [-0.11784, -2.40648, -0.62182] + } + ] + }, + "hans_commander_right_arm": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.5, + "transform": [-54.38641, -10.89614, 6.12775] + } + ], + "position": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 0.5, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_right_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + }, + "hans_commander_left_leg": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/animations/vehicle/tracked_motorbike/engine.json b/src/main/resources/assets/immersiveintelligence/animations/vehicle/tracked_motorbike/engine.json index e299d2ca8..9e044d2fa 100644 --- a/src/main/resources/assets/immersiveintelligence/animations/vehicle/tracked_motorbike/engine.json +++ b/src/main/resources/assets/immersiveintelligence/animations/vehicle/tracked_motorbike/engine.json @@ -278,6 +278,30 @@ "transform": [0, 0, 0] } ] + }, + "shaft": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [0, 0, -360] + } + ] + }, + "transmission": { + "rotation": [ + { + "time": 0, + "transform": [0, 0, 0] + }, + { + "time": 1, + "transform": [-360, 0, 0] + } + ] } } } \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/animations/vehicle/tracked_motorbike/transmission.json b/src/main/resources/assets/immersiveintelligence/animations/vehicle/tracked_motorbike/transmission.json deleted file mode 100644 index 8f8c7093d..000000000 --- a/src/main/resources/assets/immersiveintelligence/animations/vehicle/tracked_motorbike/transmission.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "comment": "Made by Pabilo8 with Blockbench", - "groups": { - "shaft": { - "rotation": [ - { - "time": 0, - "transform": [0, 0, 0] - }, - { - "time": 1, - "transform": [0, 0, -360] - } - ] - }, - "transmission": { - "rotation": [ - { - "time": 0, - "transform": [0, 0, 0] - }, - { - "time": 1, - "transform": [-360, 0, 0] - } - ] - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/models/entity/vehicle/field_flak/field_flak.mtl b/src/main/resources/assets/immersiveintelligence/models/entity/vehicle/field_flak/field_flak.mtl new file mode 100644 index 000000000..8a809901b --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/models/entity/vehicle/field_flak/field_flak.mtl @@ -0,0 +1,12 @@ +# Made by Pabilo8 with Blockbench + +newmtl hans +map_Kd immersiveintelligence:entity/hans +newmtl wheel_12 +map_Kd immersiveintelligence:entity/vehicle/suspension/wheel_12 +newmtl anti_aircraft_gun_painted +map_Kd immersiveintelligence:entity/vehicle/field_gun/anti_aircraft_gun_painted +newmtl anti_aircraft_gun +map_Kd immersiveintelligence:entity/vehicle/field_gun/anti_aircraft_gun +newmtl common_camo_net +map_Kd immersiveintelligence:blocks/common/camo_net/common_camo_net \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/models/entity/vehicle/field_flak/field_flak.obj b/src/main/resources/assets/immersiveintelligence/models/entity/vehicle/field_flak/field_flak.obj new file mode 100644 index 000000000..f4c011873 --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/models/entity/vehicle/field_flak/field_flak.obj @@ -0,0 +1,3724 @@ +# Made by Pabilo8 with Blockbench +# Exported with IIToolkit Plugin on 29/05/2026 +mtllib field_flak.mtl + +o weapon +v 0.0625 0.3125 -1 +v -0.0625 0.3125 -1 +v 0.0625 0.1875 -1 +v -0.0625 0.1875 -1 +v 0.0625 0.3125 1 +v -0.0625 0.3125 1 +v 0.0625 0.1875 1 +v -0.0625 0.1875 1 +v 1.75 0.4375 -0.1625 +v 1.625 0.4375 -0.1625 +v 1.75 0.3125 -0.1625 +v 1.625 0.3125 -0.1625 +v 1.75 0.4375 0.2125 +v 1.625 0.4375 0.2125 +v 1.75 0.3125 0.2125 +v 1.625 0.3125 0.2125 +v 1.625 0.3125 -0.0375 +v 1.5 0.3125 -0.0375 +v 1.625 0.4375 -0.0375 +v 1.5 0.4375 -0.0375 +v 1.625 0.3125 -0.1625 +v 1.5 0.3125 -0.1625 +v 1.625 0.4375 -0.1625 +v 1.5 0.4375 -0.1625 +v 1.5 0.4375 -0.1625 +v 1.25 0.4375 -0.1625 +v 1.5 0.3125 -0.1625 +v 1.25 0.3125 -0.1625 +v 1.5 0.4375 0.2125 +v 1.25 0.4375 0.2125 +v 1.5 0.3125 0.2125 +v 1.25 0.3125 0.2125 +v 1.625 0.4375 0.0875 +v 1.5 0.4375 0.0875 +v 1.625 0.3125 0.0875 +v 1.5 0.3125 0.0875 +v 1.625 0.4375 0.2125 +v 1.5 0.4375 0.2125 +v 1.625 0.3125 0.2125 +v 1.5 0.3125 0.2125 +v 1.25 0.4375 0.1875 +v 1.25 0.4375 -0.125 +v 1.25 0.3125 0.1875 +v 1.25 0.3125 -0.125 +v 0.75 0.4375 0.3125 +v 0.75 0.4375 -0.25 +v 0.75 0.3125 0.3125 +v 0.75 0.3125 -0.25 +v 0.75 0.4375 0.3125 +v 0.75 0.4375 -0.25 +v 0.75 0.3125 0.3125 +v 0.75 0.3125 -0.25 +v -0.0625 0.4375 0.3125 +v -0.0625 0.4375 -0.25 +v -0.0625 0.3125 0.3125 +v -0.0625 0.3125 -0.25 +v 0.0981 0.4375 0.2845 +v -0.0751 0.4375 -0.0481 +v 0.0981 0.3125 0.2845 +v -0.0751 0.3125 -0.0481 +v -1.1504 0.4375 0.864 +v -1.2658 0.4375 0.6422 +v -1.1504 0.3125 0.864 +v -1.2658 0.3125 0.6422 +v -0.0732 0.4375 0.0737 +v 0.0999 0.4375 -0.2589 +v -0.0732 0.3125 0.0737 +v 0.0999 0.3125 -0.2589 +v -1.264 0.4375 -0.6166 +v -1.1486 0.4375 -0.8384 +v -1.264 0.3125 -0.6166 +v -1.1486 0.3125 -0.8384 +v 0.625 0.5 -0.375 +v 0.4141 0.5 -0.625 +v 0.625 0.4375 -0.375 +v 0.4141 0.4375 -0.625 +v -0.625 0.5 -0.375 +v -0.4141 0.5 -0.625 +v -0.625 0.4375 -0.375 +v -0.4141 0.4375 -0.625 +v 0.625 0.5 0.375 +v 0.625 0.5 -0.375 +v 0.625 0.4375 0.375 +v 0.625 0.4375 -0.375 +v -0.625 0.5 0.375 +v -0.625 0.5 -0.375 +v -0.625 0.4375 0.375 +v -0.625 0.4375 -0.375 +v -0.625 0.5 0.375 +v -0.4141 0.5 0.625 +v -0.625 0.4375 0.375 +v -0.4141 0.4375 0.625 +v 0.625 0.5 0.375 +v 0.4141 0.5 0.625 +v 0.625 0.4375 0.375 +v 0.4141 0.4375 0.625 +v 0.9566 0.5627 -0.0142 +v 0.9566 0.5622 0.1108 +v 0.9578 0.0627 -0.0161 +v 0.9578 0.0622 0.1089 +v 1.0816 0.563 -0.0142 +v 1.0816 0.5625 0.1108 +v 1.0828 0.063 -0.0161 +v 1.0828 0.0625 0.1089 +v 1.2079 0.0378 0.2366 +v 1.2079 0.0378 -0.1384 +v 1.1997 -0.0242 0.2366 +v 1.1997 -0.0242 -0.1384 +v 0.8361 0.0867 0.2366 +v 0.8361 0.0867 -0.1384 +v 0.8279 0.0247 0.2366 +v 0.8279 0.0247 -0.1384 +v -1.07 0.5628 -0.7236 +v -1.1277 0.5624 -0.6128 +v -1.0689 0.0628 -0.725 +v -1.1266 0.0624 -0.6141 +v -0.9591 0.5629 -0.6659 +v -1.0168 0.5624 -0.555 +v -0.958 0.0629 -0.6673 +v -1.0157 0.0624 -0.5564 +v -0.9603 0.0625 -0.388 +v -0.7871 0.0625 -0.7206 +v -0.9603 0 -0.388 +v -0.7871 0 -0.7206 +v -1.2929 0.0625 -0.5612 +v -1.1197 0.0625 -0.8938 +v -1.2929 0 -0.5612 +v -1.1197 0 -0.8938 +v -1.1287 0.5625 0.6381 +v -1.0662 0.5621 0.7464 +v -1.1277 0.0626 0.6357 +v -1.0652 0.0621 0.7439 +v -1.0205 0.5631 0.5756 +v -0.958 0.5627 0.6839 +v -1.0195 0.0631 0.5732 +v -0.957 0.0627 0.6814 +v -0.7875 0.0625 0.7273 +v -0.975 0.0625 0.4025 +v -0.7875 0 0.7273 +v -0.975 0 0.4025 +v -1.1123 0.0625 0.9148 +v -1.2998 0.0625 0.59 +v -1.1123 0 0.9148 +v -1.2998 0 0.59 +vt 0.0313 0.2188 +vt 0.0313 0.25 +vt 0 0.25 +vt 0 0.2188 +vt 0.0313 0.2188 +vt 0.0313 0.25 +vt 0 0.25 +vt 0 0.2188 +vt 0.7656 0.3438 +vt 0.7656 0.375 +vt 0.2656 0.375 +vt 0.2656 0.3438 +vt 0.75 0.3438 +vt 0.75 0.375 +vt 0.25 0.375 +vt 0.25 0.3438 +vt 0.75 0.375 +vt 0.75 0.3438 +vt 0.25 0.3438 +vt 0.25 0.375 +vt 0.75 0.3438 +vt 0.75 0.375 +vt 0.25 0.375 +vt 0.25 0.3438 +vt 0.7344 0.2188 +vt 0.7344 0.25 +vt 0.7656 0.25 +vt 0.7656 0.2188 +vt 0.7969 0.2188 +vt 0.7969 0.25 +vt 0.7656 0.25 +vt 0.7656 0.2188 +vt 0.7813 0.25 +vt 0.7813 0.2813 +vt 0.6875 0.2813 +vt 0.6875 0.25 +vt 0.7813 0.2813 +vt 0.7813 0.25 +vt 0.6875 0.25 +vt 0.6875 0.2813 +vt 0.7031 0.2188 +vt 0.7031 0.25 +vt 0.7969 0.25 +vt 0.7969 0.2188 +vt 0.7656 0.5625 +vt 0.7656 0.5938 +vt 0.8594 0.5938 +vt 0.8594 0.5625 +vt 0.8438 0.6094 +vt 0.8438 0.6406 +vt 0.875 0.6406 +vt 0.875 0.6094 +vt 0.7656 0.25 +vt 0.7656 0.2188 +vt 0.7344 0.2188 +vt 0.7344 0.25 +vt 0.7656 0.2813 +vt 0.7344 0.2813 +vt 0.7344 0.25 +vt 0.7656 0.25 +vt 0.75 0.2813 +vt 0.7188 0.2813 +vt 0.7188 0.25 +vt 0.75 0.25 +vt 0.6719 0.2188 +vt 0.6719 0.25 +vt 0.6094 0.25 +vt 0.6094 0.2188 +vt 0.5938 0.2188 +vt 0.5938 0.25 +vt 0.6563 0.25 +vt 0.6563 0.2188 +vt 0.9063 0.25 +vt 0.9063 0.1875 +vt 0.8125 0.1875 +vt 0.8125 0.25 +vt 1 0.25 +vt 1 0.1875 +vt 0.9063 0.1875 +vt 0.9063 0.25 +vt 0.8125 0.625 +vt 0.8125 0.6563 +vt 0.9063 0.6563 +vt 0.9063 0.625 +vt 0.9063 0.2188 +vt 0.9063 0.25 +vt 1 0.25 +vt 1 0.2188 +vt 0.8438 0.6094 +vt 0.8438 0.6406 +vt 0.875 0.6406 +vt 0.875 0.6094 +vt 0.7656 0.2188 +vt 0.7656 0.25 +vt 0.7344 0.25 +vt 0.7344 0.2188 +vt 0.7656 0.2813 +vt 0.7344 0.2813 +vt 0.7344 0.25 +vt 0.7656 0.25 +vt 0.75 0.2813 +vt 0.7188 0.2813 +vt 0.7188 0.25 +vt 0.75 0.25 +vt 0.5 0.6563 +vt 0.5 0.6875 +vt 0.4219 0.6875 +vt 0.4219 0.6563 +vt 0.1406 0.9688 +vt 0.1406 1 +vt 0 1 +vt 0 0.9688 +vt 0.6406 0.5625 +vt 0.6406 0.6406 +vt 0.5156 0.6719 +vt 0.5156 0.5313 +vt 0.6406 0.5625 +vt 0.6406 0.6406 +vt 0.5156 0.6719 +vt 0.5156 0.5313 +vt 0.4726 0.6563 +vt 0.4726 0.6875 +vt 0.3438 0.6875 +vt 0.3438 0.6563 +vt 0.5156 0.6563 +vt 0.5156 0.6875 +vt 0.3906 0.6875 +vt 0.3906 0.6563 +vt 0.1406 0.9688 +vt 0.1406 1 +vt 0 1 +vt 0 0.9688 +vt 0.5313 0.5313 +vt 0.5313 0.6719 +vt 0.3281 0.6719 +vt 0.3281 0.5313 +vt 0.5156 0.5313 +vt 0.5156 0.6719 +vt 0.3125 0.6719 +vt 0.3125 0.5313 +vt 0.5313 0.5156 +vt 0.5313 0.5469 +vt 0.3281 0.5469 +vt 0.3281 0.5156 +vt 0.5156 0.6563 +vt 0.5156 0.6875 +vt 0.3125 0.6875 +vt 0.3125 0.6563 +vt 0.5156 0.3906 +vt 0.5156 0.4219 +vt 0.4531 0.4219 +vt 0.4531 0.3906 +vt 0.3125 0.4063 +vt 0.6563 0.4063 +vt 0.6563 0.5 +vt 0.3125 0.5 +vt 0.6563 0.4063 +vt 0.6563 0.5 +vt 0.3125 0.5 +vt 0.3125 0.4063 +vt 0.6563 0.3906 +vt 0.6563 0.4219 +vt 0.3125 0.4219 +vt 0.3125 0.3906 +vt 0.6563 0.4219 +vt 0.3125 0.4219 +vt 0.3125 0.3906 +vt 0.6563 0.3906 +vt 0.5156 0.3906 +vt 0.5156 0.4219 +vt 0.4531 0.4219 +vt 0.4531 0.3906 +vt 0.6563 0.4063 +vt 0.6563 0.5 +vt 0.3125 0.5 +vt 0.3125 0.4063 +vt 0.6563 0.3906 +vt 0.6563 0.4219 +vt 0.3125 0.4219 +vt 0.3125 0.3906 +vt 0.6563 0.4219 +vt 0.3125 0.4219 +vt 0.3125 0.3906 +vt 0.6563 0.3906 +vt 0.3125 0.4063 +vt 0.6563 0.4063 +vt 0.6563 0.5 +vt 0.3125 0.5 +vt 0.8787 0.6719 +vt 0.7969 0.6719 +vt 0.7969 0.6563 +vt 0.8787 0.6563 +vt 0.9255 0.6563 +vt 0.9255 0.6719 +vt 0.8438 0.6719 +vt 0.8438 0.6563 +vt 0.6875 0.625 +vt 1 0.625 +vt 0.9473 0.6875 +vt 0.7402 0.6875 +vt 0.9473 0.6875 +vt 1 0.625 +vt 0.6875 0.625 +vt 0.7402 0.6875 +vt 0.3125 0.9219 +vt 0.3125 0.9375 +vt 0 0.9375 +vt 0 0.9219 +vt 0.957 0.3906 +vt 0.75 0.3906 +vt 0.75 0.375 +vt 0.957 0.375 +vt 0.9375 0.6719 +vt 0.9375 0.6875 +vt 0.75 0.6875 +vt 0.75 0.6719 +vt 0.9375 0.6563 +vt 0.9375 0.6719 +vt 0.75 0.6719 +vt 0.75 0.6563 +vt 1 0.4375 +vt 1 0.625 +vt 0.6875 0.625 +vt 0.6875 0.4375 +vt 1 0.625 +vt 1 0.4375 +vt 0.6875 0.4375 +vt 0.6875 0.625 +vt 0.5469 0.9844 +vt 0.5469 1 +vt 0.2344 1 +vt 0.2344 0.9844 +vt 0.5469 0.9844 +vt 0.5469 1 +vt 0.2344 1 +vt 0.2344 0.9844 +vt 0.9568 0.6875 +vt 0.875 0.6875 +vt 0.875 0.6719 +vt 0.9568 0.6719 +vt 0.8943 0.6719 +vt 0.8943 0.6875 +vt 0.8125 0.6875 +vt 0.8125 0.6719 +vt 0.6875 0.4375 +vt 1 0.4375 +vt 0.9473 0.375 +vt 0.7402 0.375 +vt 0.7402 0.375 +vt 0.6875 0.4375 +vt 1 0.4375 +vt 0.9473 0.375 +vt 0.3125 0.9063 +vt 0.3125 0.9219 +vt 0 0.9219 +vt 0 0.9063 +vt 0.9414 0.6875 +vt 0.7344 0.6875 +vt 0.7344 0.6719 +vt 0.9414 0.6719 +vt 0.4063 0.8125 +vt 0.375 0.8125 +vt 0.375 0.6875 +vt 0.4063 0.6875 +vt 0.4063 0.6875 +vt 0.4063 0.8125 +vt 0.375 0.8125 +vt 0.375 0.6875 +vt 0.4063 0.8125 +vt 0.4063 0.8438 +vt 0.375 0.8438 +vt 0.375 0.8125 +vt 0.0938 0.9219 +vt 0.0938 0.9375 +vt 0.0781 0.9375 +vt 0.0781 0.9219 +vt 0.375 0.6875 +vt 0.375 0.8125 +vt 0.4063 0.8125 +vt 0.4063 0.6875 +vt 0.375 0.8281 +vt 0.4063 0.8281 +vt 0.4063 0.6875 +vt 0.375 0.6875 +vt 0.5313 0.0938 +vt 0.4375 0.0938 +vt 0.4375 0.0781 +vt 0.5313 0.0781 +vt 0.4375 0.0156 +vt 0.4375 0 +vt 0.5313 0 +vt 0.5313 0.0156 +vt 0.4375 0 +vt 0.5313 0 +vt 0.5313 0.0938 +vt 0.4375 0.0938 +vt 0.5313 0.0938 +vt 0.4375 0.0938 +vt 0.4375 0 +vt 0.5313 0 +vt 0.5313 0 +vt 0.5313 0.0156 +vt 0.4375 0.0156 +vt 0.4375 0 +vt 0.4375 0.0781 +vt 0.5313 0.0781 +vt 0.5313 0.0938 +vt 0.4375 0.0938 +vt 0.4063 0.8125 +vt 0.375 0.8125 +vt 0.375 0.6875 +vt 0.4063 0.6875 +vt 0.4063 0.6875 +vt 0.4063 0.8125 +vt 0.375 0.8125 +vt 0.375 0.6875 +vt 0.4063 0.8125 +vt 0.4063 0.8438 +vt 0.375 0.8438 +vt 0.375 0.8125 +vt 0.375 0.6875 +vt 0.375 0.8125 +vt 0.4063 0.8125 +vt 0.4063 0.6875 +vt 0.375 0.8281 +vt 0.4063 0.8281 +vt 0.4063 0.6875 +vt 0.375 0.6875 +vt 0.5313 0.0938 +vt 0.4375 0.0938 +vt 0.4375 0.0781 +vt 0.5313 0.0781 +vt 0.4375 0.0156 +vt 0.4375 0 +vt 0.5313 0 +vt 0.5313 0.0156 +vt 0.4375 0 +vt 0.5313 0 +vt 0.5313 0.0938 +vt 0.4375 0.0938 +vt 0.5313 0.0938 +vt 0.4375 0.0938 +vt 0.4375 0 +vt 0.5313 0 +vt 0.5313 0 +vt 0.5313 0.0156 +vt 0.4375 0.0156 +vt 0.4375 0 +vt 0.4375 0.0781 +vt 0.5313 0.0781 +vt 0.5313 0.0938 +vt 0.4375 0.0938 +vt 0.4063 0.8125 +vt 0.375 0.8125 +vt 0.375 0.6875 +vt 0.4063 0.6875 +vt 0.4063 0.6875 +vt 0.4063 0.8125 +vt 0.375 0.8125 +vt 0.375 0.6875 +vt 0.4063 0.8125 +vt 0.4063 0.8438 +vt 0.375 0.8438 +vt 0.375 0.8125 +vt 0.375 0.6875 +vt 0.375 0.8125 +vt 0.4063 0.8125 +vt 0.4063 0.6875 +vt 0.375 0.8125 +vt 0.4063 0.8125 +vt 0.4063 0.6875 +vt 0.375 0.6875 +vt 0.5313 0.0938 +vt 0.4375 0.0938 +vt 0.4375 0.0781 +vt 0.5313 0.0781 +vt 0.4375 0.0156 +vt 0.4375 0 +vt 0.5313 0 +vt 0.5313 0.0156 +vt 0.4375 0 +vt 0.5313 0 +vt 0.5313 0.0938 +vt 0.4375 0.0938 +vt 0.5313 0.0938 +vt 0.4375 0.0938 +vt 0.4375 0 +vt 0.5313 0 +vt 0.5313 0 +vt 0.5313 0.0156 +vt 0.4375 0.0156 +vt 0.4375 0 +vt 0.4375 0.0781 +vt 0.5313 0.0781 +vt 0.5313 0.0938 +vt 0.4375 0.0938 +vn 0 0 -1 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 0 -1 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 -1 0 +vn 0 1 0 +vn 0 0 -1 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 0 -1 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0.24 0 0.97 +vn 0.24 0 -0.97 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn -0.89 0 0.46 +vn 0 1 0 +vn 0 -1 0 +vn 0.42 0 0.91 +vn -0.5 0 -0.87 +vn -0.89 0 -0.46 +vn 0 -1 0 +vn -0.5 0 0.87 +vn 0.42 0 -0.91 +vn 0 1 0 +vn 0.76 0 -0.64 +vn -0.76 0 -0.64 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn -0.76 0 0.64 +vn 0.76 0 0.64 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn 0.99 -0.13 0 +vn -0.99 0.13 0 +vn 0.13 0.99 0 +vn -0.13 -0.99 0 +vn 0 0 1 +vn 0 0 -1 +vn -0.89 0 -0.46 +vn 0.89 0 0.46 +vn 0 1 0 +vn 0.46 0 -0.89 +vn -0.46 0 0.89 +vn 0.89 0 0.46 +vn -0.89 0 -0.46 +vn 0 1 0 +vn 0 -1 0 +vn -0.46 0 0.89 +vn 0.46 0 -0.89 +vn -0.87 0 0.5 +vn 0.87 0 -0.5 +vn 0 1 0 +vn -0.5 0 -0.87 +vn 0.5 0 0.87 +vn 0.87 0 -0.5 +vn -0.87 0 0.5 +vn 0 1 0 +vn 0 -1 0 +vn 0.5 0 0.87 +vn -0.5 0 -0.87 +usemtl anti_aircraft_gun_painted +f 4/1/1 2/2/1 1/3/1 3/4/1 +f 7/5/2 5/6/2 6/7/2 8/8/2 +f 1/9/3 2/10/3 6/11/3 5/12/3 +f 4/13/4 3/14/4 7/15/4 8/16/4 +f 3/17/5 1/18/5 5/19/5 7/20/5 +f 8/21/6 6/22/6 2/23/6 4/24/6 +f 12/25/7 10/26/7 9/27/7 11/28/7 +f 15/29/8 13/30/8 14/31/8 16/32/8 +f 9/33/9 10/34/9 14/35/9 13/36/9 +usemtl anti_aircraft_gun +f 12/37/10 11/38/10 15/39/10 16/40/10 +usemtl anti_aircraft_gun_painted +f 11/41/11 9/42/11 13/43/11 15/44/11 +f 16/45/12 14/46/12 10/47/12 12/48/12 +f 20/49/13 18/50/13 17/51/13 19/52/13 +f 23/53/14 21/54/14 22/55/14 24/56/14 +usemtl anti_aircraft_gun +f 17/57/15 18/58/15 22/59/15 21/60/15 +usemtl anti_aircraft_gun_painted +f 20/61/16 19/62/16 23/63/16 24/64/16 +f 28/65/17 26/66/17 25/67/17 27/68/17 +f 31/69/18 29/70/18 30/71/18 32/72/18 +f 25/73/19 26/74/19 30/75/19 29/76/19 +usemtl anti_aircraft_gun +f 28/77/20 27/78/20 31/79/20 32/80/20 +usemtl anti_aircraft_gun_painted +f 27/81/21 25/82/21 29/83/21 31/84/21 +f 32/85/22 30/86/22 26/87/22 28/88/22 +f 36/89/23 34/90/23 33/91/23 35/92/23 +f 39/93/24 37/94/24 38/95/24 40/96/24 +f 33/97/25 34/98/25 38/99/25 37/100/25 +usemtl anti_aircraft_gun +f 36/101/26 35/102/26 39/103/26 40/104/26 +usemtl anti_aircraft_gun_painted +f 44/105/27 42/106/27 41/107/27 43/108/27 +f 47/109/28 45/110/28 46/111/28 48/112/28 +f 41/113/29 42/114/29 46/115/29 45/116/29 +usemtl anti_aircraft_gun +f 44/117/30 43/118/30 47/119/30 48/120/30 +usemtl anti_aircraft_gun_painted +f 43/121/31 41/122/31 45/123/31 47/124/31 +f 48/125/32 46/126/32 42/127/32 44/128/32 +f 52/129/33 50/130/33 49/131/33 51/132/33 +f 49/133/34 50/134/34 54/135/34 53/136/34 +usemtl anti_aircraft_gun +f 52/137/35 51/138/35 55/139/35 56/140/35 +usemtl anti_aircraft_gun_painted +f 51/141/36 49/142/36 53/143/36 55/144/36 +f 56/145/37 54/146/37 50/147/37 52/148/37 +f 63/149/38 61/150/38 62/151/38 64/152/38 +f 61/153/39 57/154/39 58/155/39 62/156/39 +usemtl anti_aircraft_gun +f 60/157/40 59/158/40 63/159/40 64/160/40 +usemtl anti_aircraft_gun_painted +f 59/161/41 57/162/41 61/163/41 63/164/41 +f 62/165/42 58/166/42 60/167/42 64/168/42 +f 71/169/43 69/170/43 70/171/43 72/172/43 +usemtl anti_aircraft_gun +f 68/173/44 67/174/44 71/175/44 72/176/44 +usemtl anti_aircraft_gun_painted +f 67/177/45 65/178/45 69/179/45 71/180/45 +f 70/181/46 66/182/46 68/183/46 72/184/46 +f 69/185/47 65/186/47 66/187/47 70/188/47 +f 74/189/48 73/190/48 75/191/48 76/192/48 +f 79/193/49 77/194/49 78/195/49 80/196/49 +f 77/197/50 73/198/50 74/199/50 78/200/50 +usemtl anti_aircraft_gun +f 76/201/51 75/202/51 79/203/51 80/204/51 +usemtl anti_aircraft_gun_painted +f 75/205/52 73/206/52 77/207/52 79/208/52 +f 78/209/53 74/210/53 76/211/53 80/212/53 +f 84/213/54 82/214/54 81/215/54 83/216/54 +f 87/217/55 85/218/55 86/219/55 88/220/55 +f 81/221/56 82/222/56 86/223/56 85/224/56 +usemtl anti_aircraft_gun +f 84/225/57 83/226/57 87/227/57 88/228/57 +usemtl anti_aircraft_gun_painted +f 83/229/58 81/230/58 85/231/58 87/232/58 +f 88/233/59 86/234/59 82/235/59 84/236/59 +f 90/237/60 89/238/60 91/239/60 92/240/60 +f 95/241/61 93/242/61 94/243/61 96/244/61 +f 93/245/62 89/246/62 90/247/62 94/248/62 +usemtl anti_aircraft_gun +f 92/249/63 91/250/63 95/251/63 96/252/63 +usemtl anti_aircraft_gun_painted +f 91/253/64 89/254/64 93/255/64 95/256/64 +f 94/257/65 90/258/65 92/259/65 96/260/65 +f 98/261/66 97/262/66 99/263/66 100/264/66 +f 103/265/67 101/266/67 102/267/67 104/268/67 +f 101/269/68 97/270/68 98/271/68 102/272/68 +f 100/273/69 99/274/69 103/275/69 104/276/69 +f 99/277/70 97/278/70 101/279/70 103/280/70 +f 102/281/71 98/282/71 100/283/71 104/284/71 +f 106/285/72 105/286/72 107/287/72 108/288/72 +f 111/289/73 109/290/73 110/291/73 112/292/73 +f 109/293/74 105/294/74 106/295/74 110/296/74 +f 108/297/75 107/298/75 111/299/75 112/300/75 +f 107/301/76 105/302/76 109/303/76 111/304/76 +f 110/305/77 106/306/77 108/307/77 112/308/77 +f 114/309/78 113/310/78 115/311/78 116/312/78 +f 119/313/79 117/314/79 118/315/79 120/316/79 +f 117/317/80 113/318/80 114/319/80 118/320/80 +f 115/321/81 113/322/81 117/323/81 119/324/81 +f 118/325/82 114/326/82 116/327/82 120/328/82 +f 122/329/83 121/330/83 123/331/83 124/332/83 +f 127/333/84 125/334/84 126/335/84 128/336/84 +f 125/337/85 121/338/85 122/339/85 126/340/85 +f 124/341/86 123/342/86 127/343/86 128/344/86 +f 123/345/87 121/346/87 125/347/87 127/348/87 +f 126/349/88 122/350/88 124/351/88 128/352/88 +f 130/353/89 129/354/89 131/355/89 132/356/89 +f 135/357/90 133/358/90 134/359/90 136/360/90 +f 133/361/91 129/362/91 130/363/91 134/364/91 +f 131/365/92 129/366/92 133/367/92 135/368/92 +f 134/369/93 130/370/93 132/371/93 136/372/93 +f 138/373/94 137/374/94 139/375/94 140/376/94 +f 143/377/95 141/378/95 142/379/95 144/380/95 +f 141/381/96 137/382/96 138/383/96 142/384/96 +f 140/385/97 139/386/97 143/387/97 144/388/97 +f 139/389/98 137/390/98 141/391/98 143/392/98 +f 142/393/99 138/394/99 140/395/99 144/396/99 +o wheel2 +v -0.1875 0.4339 1.0561 +v 0.1875 0.4339 1.0561 +v -0.1875 0.0589 1.0561 +v 0.1875 0.0589 1.0561 +v -0.1875 0.4339 0.9936 +v 0.1875 0.4339 0.9936 +v -0.1875 0.0589 0.9936 +v 0.1875 0.0589 0.9936 +v 0.1875 0.6793 1.3085 +v 0.1875 0.6793 1.0585 +v 0.4375 0.4293 1.3085 +v 0.4375 0.4293 1.0585 +v -0.1875 0.6793 1.3085 +v -0.1875 0.6793 1.0585 +v -0.4375 0.4293 1.3085 +v -0.4375 0.4293 1.0585 +v 0.1875 -0.1957 1.3085 +v 0.1875 -0.1957 1.0585 +v 0.4375 0.0543 1.3085 +v 0.4375 0.0543 1.0585 +v -0.1875 -0.1957 1.3085 +v -0.1875 -0.1957 1.0585 +v -0.4375 0.0543 1.3085 +v -0.4375 0.0543 1.0585 +v 0.4375 0.4293 1.3085 +v 0.4375 0.4293 1.0585 +v 0.4375 0.0543 1.3085 +v 0.4375 0.0543 1.0585 +v -0.4375 0.4293 1.3085 +v -0.4375 0.4293 1.0585 +v -0.4375 0.0543 1.3085 +v -0.4375 0.0543 1.0585 +vt 0.5313 0.0938 +vt 0.5313 0 +vt 0.625 0 +vt 0.625 0.0938 +vt 0.5391 0 +vt 0.5391 0.0938 +vt 0.5313 0.0938 +vt 0.5313 0 +vt 0.6172 0.0938 +vt 0.6172 0 +vt 0.6094 0 +vt 0.6094 0.0938 +vt 0.5313 0.0938 +vt 0.5313 0 +vt 0.5469 0 +vt 0.5469 0.0938 +vt 0.6094 0.0938 +vt 0.6094 0 +vt 0.6172 0 +vt 0.6172 0.0938 +vt 0.8438 0.542 +vt 0.8438 0.7188 +vt 0.7188 0.7188 +vt 0.7188 0.542 +vt 0.1563 0.7188 +vt 0.1563 0.542 +vt 0.2813 0.542 +vt 0.2813 0.7188 +vt 0.4063 0.8438 +vt 0.4063 0.7188 +vt 0.5938 0.7188 +vt 0.5938 0.8438 +vt 0.7188 0.5938 +vt 0.5938 0.7188 +vt 0.4063 0.7188 +vt 0.2813 0.5938 +vt 0.7188 0.5938 +vt 0.5938 0.7188 +vt 0.4063 0.7188 +vt 0.2813 0.5938 +vt 0.7188 0.292 +vt 0.8438 0.292 +vt 0.8438 0.4688 +vt 0.7188 0.4688 +vt 0.2813 0.4688 +vt 0.1563 0.4688 +vt 0.1563 0.292 +vt 0.2813 0.292 +vt 0.4063 0.1563 +vt 0.5938 0.1563 +vt 0.5938 0.2813 +vt 0.4063 0.2813 +vt 0.4063 0.2813 +vt 0.5938 0.2813 +vt 0.7188 0.4063 +vt 0.2813 0.4063 +vt 0.4063 0.2813 +vt 0.5938 0.2813 +vt 0.7188 0.4063 +vt 0.2813 0.4063 +vt 0.8438 0.4063 +vt 0.8438 0.5938 +vt 0.7188 0.5938 +vt 0.7188 0.4063 +vt 0.1563 0.5938 +vt 0.1563 0.4063 +vt 0.2813 0.4063 +vt 0.2813 0.5938 +vt 0.7188 0.4063 +vt 0.7188 0.5938 +vt 0.2813 0.5938 +vt 0.2813 0.4063 +vt 0.7188 0.4063 +vt 0.7188 0.5938 +vt 0.2813 0.5938 +vt 0.2813 0.4063 +vn 0 0 -1 +vn 0 1 0 +vn 0 -1 0 +vn -1 0 0 +vn 1 0 0 +vn 0.71 0.71 0 +vn -0.71 0.71 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0.71 -0.71 0 +vn -0.71 -0.71 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 0 1 +vn 0 0 -1 +usemtl anti_aircraft_gun_painted +f 151/397/100 149/398/100 150/399/100 152/400/100 +f 145/401/101 146/402/101 150/403/101 149/404/101 +f 148/405/102 147/406/102 151/407/102 152/408/102 +f 147/409/103 145/410/103 149/411/103 151/412/103 +f 152/413/104 150/414/104 146/415/104 148/416/104 +usemtl wheel_12 +f 156/417/105 154/418/105 153/419/105 155/420/105 +f 159/421/106 157/422/106 158/423/106 160/424/106 +f 153/425/107 154/426/107 158/427/107 157/428/107 +f 155/429/108 153/430/108 157/431/108 159/432/108 +f 160/433/109 158/434/109 154/435/109 156/436/109 +f 161/437/110 162/438/110 164/439/110 163/440/110 +f 166/441/111 165/442/111 167/443/111 168/444/111 +f 166/445/112 162/446/112 161/447/112 165/448/112 +f 165/449/113 161/450/113 163/451/113 167/452/113 +f 162/453/114 166/454/114 168/455/114 164/456/114 +f 172/457/115 170/458/115 169/459/115 171/460/115 +f 175/461/116 173/462/116 174/463/116 176/464/116 +f 171/465/117 169/466/117 173/467/117 175/468/117 +f 176/469/118 174/470/118 170/471/118 172/472/118 +o wheel1 +v 0.1875 0.4293 -1.0376 +v -0.1875 0.4293 -1.0376 +v 0.1875 0.0543 -1.0376 +v -0.1875 0.0543 -1.0376 +v 0.1875 0.4293 -0.9751 +v -0.1875 0.4293 -0.9751 +v 0.1875 0.0543 -0.9751 +v -0.1875 0.0543 -0.9751 +v -0.1875 0.6793 -1.2876 +v -0.1875 0.6793 -1.0376 +v -0.4375 0.4293 -1.2876 +v -0.4375 0.4293 -1.0376 +v 0.1875 0.6793 -1.2876 +v 0.1875 0.6793 -1.0376 +v 0.4375 0.4293 -1.2876 +v 0.4375 0.4293 -1.0376 +v -0.1875 -0.1957 -1.2876 +v -0.1875 -0.1957 -1.0376 +v -0.4375 0.0543 -1.2876 +v -0.4375 0.0543 -1.0376 +v 0.1875 -0.1957 -1.2876 +v 0.1875 -0.1957 -1.0376 +v 0.4375 0.0543 -1.2876 +v 0.4375 0.0543 -1.0376 +v -0.4375 0.4293 -1.2876 +v -0.4375 0.4293 -1.0376 +v -0.4375 0.0543 -1.2876 +v -0.4375 0.0543 -1.0376 +v 0.4375 0.4293 -1.2876 +v 0.4375 0.4293 -1.0376 +v 0.4375 0.0543 -1.2876 +v 0.4375 0.0543 -1.0376 +vt 0.5313 0.0938 +vt 0.5313 0 +vt 0.625 0 +vt 0.625 0.0938 +vt 0.5391 0 +vt 0.5391 0.0938 +vt 0.5313 0.0938 +vt 0.5313 0 +vt 0.6172 0.0938 +vt 0.6172 0 +vt 0.6094 0 +vt 0.6094 0.0938 +vt 0.5313 0.0938 +vt 0.5313 0 +vt 0.5469 0 +vt 0.5469 0.0938 +vt 0.6094 0.0938 +vt 0.6094 0 +vt 0.6172 0 +vt 0.6172 0.0938 +vt 0.8438 0.542 +vt 0.8438 0.7188 +vt 0.7188 0.7188 +vt 0.7188 0.542 +vt 0.1563 0.7188 +vt 0.1563 0.542 +vt 0.2813 0.542 +vt 0.2813 0.7188 +vt 0.4063 0.8438 +vt 0.4063 0.7188 +vt 0.5938 0.7188 +vt 0.5938 0.8438 +vt 0.7188 0.5938 +vt 0.5938 0.7188 +vt 0.4063 0.7188 +vt 0.2813 0.5938 +vt 0.7188 0.5938 +vt 0.5938 0.7188 +vt 0.4063 0.7188 +vt 0.2813 0.5938 +vt 0.7188 0.292 +vt 0.8438 0.292 +vt 0.8438 0.4688 +vt 0.7188 0.4688 +vt 0.2813 0.4688 +vt 0.1563 0.4688 +vt 0.1563 0.292 +vt 0.2813 0.292 +vt 0.4063 0.1563 +vt 0.5938 0.1563 +vt 0.5938 0.2813 +vt 0.4063 0.2813 +vt 0.4063 0.2813 +vt 0.5938 0.2813 +vt 0.7188 0.4063 +vt 0.2813 0.4063 +vt 0.4063 0.2813 +vt 0.5938 0.2813 +vt 0.7188 0.4063 +vt 0.2813 0.4063 +vt 0.8438 0.4063 +vt 0.8438 0.5938 +vt 0.7188 0.5938 +vt 0.7188 0.4063 +vt 0.1563 0.5938 +vt 0.1563 0.4063 +vt 0.2813 0.4063 +vt 0.2813 0.5938 +vt 0.7188 0.4063 +vt 0.7188 0.5938 +vt 0.2813 0.5938 +vt 0.2813 0.4063 +vt 0.7188 0.4063 +vt 0.7188 0.5938 +vt 0.2813 0.5938 +vt 0.2813 0.4063 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 +vn 1 0 0 +vn -1 0 0 +vn -0.71 0.71 0 +vn 0.71 0.71 0 +vn 0 1 0 +vn 0 0 -1 +vn 0 0 1 +vn -0.71 -0.71 0 +vn 0.71 -0.71 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 0 -1 +vn 0 0 1 +usemtl anti_aircraft_gun_painted +f 183/473/119 181/474/119 182/475/119 184/476/119 +f 177/477/120 178/478/120 182/479/120 181/480/120 +f 180/481/121 179/482/121 183/483/121 184/484/121 +f 179/485/122 177/486/122 181/487/122 183/488/122 +f 184/489/123 182/490/123 178/491/123 180/492/123 +usemtl wheel_12 +f 188/493/124 186/494/124 185/495/124 187/496/124 +f 191/497/125 189/498/125 190/499/125 192/500/125 +f 185/501/126 186/502/126 190/503/126 189/504/126 +f 187/505/127 185/506/127 189/507/127 191/508/127 +f 192/509/128 190/510/128 186/511/128 188/512/128 +f 193/513/129 194/514/129 196/515/129 195/516/129 +f 198/517/130 197/518/130 199/519/130 200/520/130 +f 198/521/131 194/522/131 193/523/131 197/524/131 +f 197/525/132 193/526/132 195/527/132 199/528/132 +f 194/529/133 198/530/133 200/531/133 196/532/133 +f 204/533/134 202/534/134 201/535/134 203/536/134 +f 207/537/135 205/538/135 206/539/135 208/540/135 +f 203/541/136 201/542/136 205/543/136 207/544/136 +f 208/545/137 206/546/137 202/547/137 204/548/137 +o weapon_net +v -0.6037 0.4438 0.2566 +v -0.4537 0.4438 0.5449 +v -0.6037 0.2563 0.2566 +v -0.4537 0.2563 0.5449 +v -1.2546 0.4438 0.6306 +v -1.1333 0.4438 0.8635 +v -1.2546 0.2563 0.6306 +v -1.1333 0.2563 0.8635 +v -0.6153 0.4438 -0.2344 +v -0.4652 0.4438 -0.5227 +v -0.6153 0.2563 -0.2344 +v -0.4652 0.2563 -0.5227 +v -1.2661 0.4438 -0.6084 +v -1.1449 0.4438 -0.8413 +v -1.2661 0.2563 -0.6084 +v -1.1449 0.2563 -0.8413 +vt 0.8125 0.7266 +vt 1 0.7344 +vt 1 0.6531 +vt 0.8125 0.6609 +vt 0.1563 0.9531 +vt 0.3439 0.9531 +vt 0.3439 0.9063 +vt 0.1563 0.9063 +vt 0.1875 0.6094 +vt 0.3752 0.6094 +vt 0.3752 0.5625 +vt 0.1875 0.5625 +vt 1 0.6531 +vt 1 0.7344 +vt 0.8125 0.7266 +vt 0.8125 0.6609 +vt 0.3439 0.9063 +vt 0.3439 0.9531 +vt 0.1563 0.9531 +vt 0.1563 0.9063 +vt 0.3752 0.5625 +vt 0.3752 0.6094 +vt 0.1875 0.6094 +vt 0.1875 0.5625 +vn 0 1 0 +vn -0.5 0 -0.87 +vn 0.42 0 0.91 +vn 0 1 0 +vn -0.5 0 0.87 +vn 0.42 0 -0.91 +usemtl common_camo_net +f 214/549/138 210/550/138 209/551/138 213/552/138 +f 213/553/139 209/554/139 211/555/139 215/556/139 +f 210/557/140 214/558/140 216/559/140 212/560/140 +f 217/561/141 218/562/141 222/563/141 221/564/141 +f 219/565/142 217/566/142 221/567/142 223/568/142 +f 224/569/143 222/570/143 218/571/143 220/572/143 +o turret +v 0.75 1.375 -0.4375 +v 0.75 1.375 -0.9375 +v 0.75 0.875 -0.4375 +v 0.75 0.875 -0.9375 +v 0.6875 1.375 -0.4375 +v 0.6875 1.375 -0.9375 +v 0.6875 0.875 -0.4375 +v 0.6875 0.875 -0.9375 +v 0.6875 0.6875 -0.4375 +v 0.6875 0.6875 -0.9375 +v 0.6875 0.625 -0.4375 +v 0.6875 0.625 -0.9375 +v 0.1875 0.6875 -0.4375 +v 0.1875 0.6875 -0.9375 +v 0.1875 0.625 -0.4375 +v 0.1875 0.625 -0.9375 +v 0.7501 0.875 -0.6291 +v 0.7501 0.875 -0.7541 +v 0.7501 0.625 -0.6291 +v 0.7501 0.625 -0.7541 +v 0.6876 0.875 -0.6291 +v 0.6876 0.875 -0.7541 +v 0.6876 0.625 -0.6291 +v 0.6876 0.625 -0.7541 +v 0.75 1.375 0.875 +v 0.75 1.375 0.375 +v 0.75 0.875 0.875 +v 0.75 0.875 0.375 +v 0.6875 1.375 0.875 +v 0.6875 1.375 0.375 +v 0.6875 0.875 0.875 +v 0.6875 0.875 0.375 +v 0.6875 0.6875 0.875 +v 0.6875 0.6875 0.375 +v 0.6875 0.625 0.875 +v 0.6875 0.625 0.375 +v 0.1875 0.6875 0.875 +v 0.1875 0.6875 0.375 +v 0.1875 0.625 0.875 +v 0.1875 0.625 0.375 +v 0.7501 0.875 0.6834 +v 0.7501 0.875 0.5584 +v 0.7501 0.625 0.6834 +v 0.7501 0.625 0.5584 +v 0.6876 0.875 0.6834 +v 0.6876 0.875 0.5584 +v 0.6876 0.625 0.6834 +v 0.6876 0.625 0.5584 +v -0.4375 1.875 1.125 +v -0.4375 1.875 0.375 +v -0.6875 1.3125 1.125 +v -0.6875 1.3125 0.375 +v -0.5 1.875 1.125 +v -0.5 1.875 0.375 +v -0.75 1.3125 1.125 +v -0.75 1.3125 0.375 +v -0.6875 1.3125 1.125 +v -0.6875 1.3125 0.375 +v -0.5 0.875 1.125 +v -0.5 0.875 0.375 +v -0.75 1.3125 1.125 +v -0.75 1.3125 0.375 +v -0.5625 0.875 1.125 +v -0.5625 0.875 0.375 +v -0.5 0.875 1.125 +v -0.5 0.875 0.375 +v -0.375 0.625 1.125 +v -0.375 0.625 0.375 +v -0.5625 0.875 1.125 +v -0.5625 0.875 0.375 +v -0.4375 0.625 1.125 +v -0.4375 0.625 0.375 +v -0.6875 1.3125 -0.375 +v -0.6875 1.3125 -1.125 +v -0.5 0.875 -0.375 +v -0.5 0.875 -1.125 +v -0.75 1.3125 -0.375 +v -0.75 1.3125 -1.125 +v -0.5625 0.875 -0.375 +v -0.5625 0.875 -1.125 +v -0.5 0.875 -0.375 +v -0.5 0.875 -1.125 +v -0.375 0.625 -0.375 +v -0.375 0.625 -0.9375 +v -0.5625 0.875 -0.375 +v -0.5625 0.875 -1.125 +v -0.4375 0.625 -0.375 +v -0.4375 0.625 -0.9375 +v -0.4375 1.875 -0.375 +v -0.4375 1.875 -1.125 +v -0.6875 1.3125 -0.375 +v -0.6875 1.3125 -1.125 +v -0.5 1.875 -0.375 +v -0.5 1.875 -1.125 +v -0.75 1.3125 -0.375 +v -0.75 1.3125 -1.125 +v 0.1876 1.375 0.0272 +v 0.1876 1.375 -0.0353 +v 0.1876 0.625 0.0272 +v 0.1876 0.625 -0.0353 +v -0.5624 1.375 0.0272 +v -0.5624 1.375 -0.0353 +v -0.5624 0.625 0.0272 +v -0.5624 0.625 -0.0353 +v 0.5626 1 0.1834 +v 0.5626 1 -0.1916 +v 0.5626 0.625 0.1834 +v 0.5626 0.625 -0.1916 +v 0.3126 1 0.1834 +v 0.3126 1 -0.1916 +v 0.3126 0.625 0.1834 +v 0.3126 0.625 -0.1916 +v 0.5626 0.625 0.3084 +v 0.5626 0.625 -0.3166 +v 0.5626 0.5 0.3084 +v 0.5626 0.5 -0.3166 +v -0.5624 0.625 0.3084 +v -0.5624 0.625 -0.3166 +v -0.5624 0.5 0.3084 +v -0.5624 0.5 -0.3166 +v 0.0001 0.625 -0.3166 +v 0.0001 0.625 0.3084 +v 0.0001 0.5 0.3084 +v 0.0001 0.5 -0.3166 +v -0.3515 0.625 -0.5666 +v -0.5624 0.625 -0.3166 +v -0.3515 0.5 -0.5666 +v -0.5624 0.5 -0.3166 +v 0.3517 0.625 -0.5666 +v 0.5626 0.625 -0.3166 +v 0.3517 0.5 -0.5666 +v 0.5626 0.5 -0.3166 +v 0.3517 0.625 0.5584 +v 0.5626 0.625 0.3084 +v 0.3517 0.5 0.5584 +v 0.5626 0.5 0.3084 +v -0.3515 0.625 0.5584 +v -0.5624 0.625 0.3084 +v -0.3515 0.5 0.5584 +v -0.5624 0.5 0.3084 +vt 0.4219 0.2188 +vt 0.4219 0.3438 +vt 0.2969 0.3438 +vt 0.2969 0.2188 +vt 0.4219 0.2188 +vt 0.4219 0.3438 +vt 0.2969 0.3438 +vt 0.2969 0.2188 +vt 0.3125 0.2188 +vt 0.3125 0.3438 +vt 0.2969 0.3438 +vt 0.2969 0.2188 +vt 0.3125 0.2188 +vt 0.3125 0.3438 +vt 0.2969 0.3438 +vt 0.2969 0.2188 +vt 0.3125 0.2188 +vt 0.3125 0.3438 +vt 0.2969 0.3438 +vt 0.2969 0.2188 +vt 0.3125 0.2188 +vt 0.3125 0.3438 +vt 0.2969 0.3438 +vt 0.2969 0.2188 +vt 0.4219 0.3281 +vt 0.4219 0.3438 +vt 0.2969 0.3438 +vt 0.2969 0.3281 +vt 0.4219 0.3281 +vt 0.4219 0.3438 +vt 0.2969 0.3438 +vt 0.2969 0.3281 +vt 0.4219 0.2188 +vt 0.4219 0.3438 +vt 0.2969 0.3438 +vt 0.2969 0.2188 +vt 0.4219 0.2188 +vt 0.4219 0.3438 +vt 0.2969 0.3438 +vt 0.2969 0.2188 +vt 0.4219 0.3281 +vt 0.4219 0.3438 +vt 0.2969 0.3438 +vt 0.2969 0.3281 +vt 0.4219 0.3281 +vt 0.4219 0.3438 +vt 0.2969 0.3438 +vt 0.2969 0.3281 +vt 0.5938 0.375 +vt 0.5313 0.375 +vt 0.5313 0.3438 +vt 0.5938 0.3438 +vt 0.5313 0.3438 +vt 0.5938 0.3438 +vt 0.5938 0.375 +vt 0.5313 0.375 +vt 0.5938 0.3594 +vt 0.5313 0.3594 +vt 0.5313 0.3438 +vt 0.5938 0.3438 +vt 0.5938 0.375 +vt 0.5313 0.375 +vt 0.5313 0.3594 +vt 0.5938 0.3594 +vt 0.5625 0.3594 +vt 0.5313 0.3594 +vt 0.5313 0.3438 +vt 0.5625 0.3438 +vt 0.4219 0.2188 +vt 0.4219 0.3438 +vt 0.2969 0.3438 +vt 0.2969 0.2188 +vt 0.4219 0.2188 +vt 0.4219 0.3438 +vt 0.2969 0.3438 +vt 0.2969 0.2188 +vt 0.3125 0.2188 +vt 0.3125 0.3438 +vt 0.2969 0.3438 +vt 0.2969 0.2188 +vt 0.3125 0.2188 +vt 0.3125 0.3438 +vt 0.2969 0.3438 +vt 0.2969 0.2188 +vt 0.3125 0.2188 +vt 0.3125 0.3438 +vt 0.2969 0.3438 +vt 0.2969 0.2188 +vt 0.3125 0.2188 +vt 0.3125 0.3438 +vt 0.2969 0.3438 +vt 0.2969 0.2188 +vt 0.4219 0.3281 +vt 0.4219 0.3438 +vt 0.2969 0.3438 +vt 0.2969 0.3281 +vt 0.4219 0.3281 +vt 0.4219 0.3438 +vt 0.2969 0.3438 +vt 0.2969 0.3281 +vt 0.4219 0.2188 +vt 0.4219 0.3438 +vt 0.2969 0.3438 +vt 0.2969 0.2188 +vt 0.4219 0.2188 +vt 0.4219 0.3438 +vt 0.2969 0.3438 +vt 0.2969 0.2188 +vt 0.4219 0.3281 +vt 0.4219 0.3438 +vt 0.2969 0.3438 +vt 0.2969 0.3281 +vt 0.4219 0.3281 +vt 0.4219 0.3438 +vt 0.2969 0.3438 +vt 0.2969 0.3281 +vt 0.5938 0.375 +vt 0.5313 0.375 +vt 0.5313 0.3438 +vt 0.5938 0.3438 +vt 0.5313 0.3438 +vt 0.5938 0.3438 +vt 0.5938 0.375 +vt 0.5313 0.375 +vt 0.5938 0.3594 +vt 0.5313 0.3594 +vt 0.5313 0.3438 +vt 0.5938 0.3438 +vt 0.5938 0.375 +vt 0.5313 0.375 +vt 0.5313 0.3594 +vt 0.5938 0.3594 +vt 0.5625 0.3594 +vt 0.5313 0.3594 +vt 0.5313 0.3438 +vt 0.5625 0.3438 +vt 0 0.8594 +vt 0 1 +vt 0.1875 1 +vt 0.1875 0.8594 +vt 0.375 0.8594 +vt 0.375 1 +vt 0.1875 1 +vt 0.1875 0.8594 +vt 0.1875 1 +vt 0 1 +vt 0 0.9844 +vt 0.1875 0.9844 +vt 0.375 0.8594 +vt 0.375 1 +vt 0.3594 1 +vt 0.3594 0.8594 +vt 0.2031 0.8594 +vt 0.2031 1 +vt 0.1875 1 +vt 0.1875 0.8594 +vt 0 0.8125 +vt 0 0.9219 +vt 0.1875 0.9219 +vt 0.1875 0.8125 +vt 0.375 0.7656 +vt 0.375 0.875 +vt 0.1875 0.875 +vt 0.1875 0.7656 +vt 0.0156 0.8125 +vt 0.0156 1 +vt 0 1 +vt 0 0.8125 +vt 0.375 0.75 +vt 0.375 0.8594 +vt 0.3594 0.8594 +vt 0.3594 0.75 +vt 0.2031 0.7656 +vt 0.2031 0.875 +vt 0.1875 0.875 +vt 0.1875 0.7656 +vt 0.1875 0.6957 +vt 0.1875 0.7656 +vt 0.375 0.7656 +vt 0.375 0.6957 +vt 0.375 0.6957 +vt 0.375 0.7656 +vt 0.1875 0.7656 +vt 0.1875 0.6957 +vt 0.375 0.7031 +vt 0.1875 0.7031 +vt 0.1875 0.6875 +vt 0.375 0.6875 +vt 0.375 0.6875 +vt 0.375 0.75 +vt 0.3594 0.75 +vt 0.3594 0.6875 +vt 0.2031 0.6875 +vt 0.2031 0.7656 +vt 0.1875 0.7656 +vt 0.1875 0.6875 +vt 0 0.8125 +vt 0 0.9219 +vt 0.1875 0.9219 +vt 0.1875 0.8125 +vt 0.1875 0.7656 +vt 0.1875 0.875 +vt 0 0.875 +vt 0 0.7656 +vt 0.0156 0.8125 +vt 0.0156 1 +vt 0 1 +vt 0 0.8125 +vt 0.1875 0.75 +vt 0.1875 0.8594 +vt 0.1719 0.8594 +vt 0.1719 0.75 +vt 0.0156 0.7188 +vt 0.0156 0.8281 +vt 0 0.8281 +vt 0 0.7188 +vt 0.0469 0.6957 +vt 0 0.7656 +vt 0.1875 0.7656 +vt 0.1875 0.6957 +vt 0.1875 0.6957 +vt 0.1875 0.7656 +vt 0 0.7656 +vt 0.0469 0.6957 +vt 0.0156 0.8438 +vt 0.0156 0.9688 +vt 0 0.9688 +vt 0 0.8438 +vt 0.1875 0.6875 +vt 0.1875 0.75 +vt 0.1719 0.75 +vt 0.1719 0.6875 +vt 0.0156 0.7188 +vt 0.0156 0.8125 +vt 0 0.8125 +vt 0 0.7188 +vt 0 0.8594 +vt 0 1 +vt 0.1875 1 +vt 0.1875 0.8594 +vt 0.1875 0.8594 +vt 0.1875 1 +vt 0 1 +vt 0 0.8594 +vt 0.1875 1 +vt 0 1 +vt 0 0.9844 +vt 0.1875 0.9844 +vt 0.1875 0.8594 +vt 0.1875 1 +vt 0.1719 1 +vt 0.1719 0.8594 +vt 0.0156 0.8594 +vt 0.0156 1 +vt 0 1 +vt 0 0.8594 +vt 0.0156 0.8125 +vt 0.0156 1 +vt 0 1 +vt 0 0.8125 +vt 0.0156 0.8125 +vt 0.0156 1 +vt 0 1 +vt 0 0.8125 +vt 0.1875 0.9844 +vt 0.1875 1 +vt 0 1 +vt 0 0.9844 +vt 0.4375 0 +vt 0.4375 0.1875 +vt 0.25 0.1875 +vt 0.25 0 +vt 0.4375 0 +vt 0.4375 0.1875 +vt 0.25 0.1875 +vt 0.25 0 +vt 0.7031 0.8125 +vt 0.7031 0.9063 +vt 0.6094 0.9063 +vt 0.6094 0.8125 +vt 0.7031 0.8125 +vt 0.7031 0.9063 +vt 0.6094 0.9063 +vt 0.6094 0.8125 +vt 0.6875 0.9063 +vt 0.6875 1 +vt 0.625 1 +vt 0.625 0.9063 +vt 0.6875 0.9063 +vt 0.6875 1 +vt 0.625 1 +vt 0.625 0.9063 +vt 0.6875 0.9063 +vt 0.6875 1 +vt 0.625 1 +vt 0.625 0.9063 +vt 0.9531 0.9688 +vt 0.9531 1 +vt 0.7969 1 +vt 0.7969 0.9688 +vt 0.9531 0.9688 +vt 0.9531 1 +vt 0.7969 1 +vt 0.7969 0.9688 +vt 0.7188 0.7656 +vt 0.8594 0.7656 +vt 0.8594 0.9219 +vt 0.7188 0.9219 +vt 0.7188 0.9219 +vt 0.8594 0.9219 +vt 0.8594 0.7656 +vt 0.7188 0.7656 +vt 0 0.9688 +vt 0.1406 0.9688 +vt 0.1406 1 +vt 0 1 +vt 0.2813 1 +vt 0.1406 1 +vt 0.1406 0.9688 +vt 0.2813 0.9688 +vt 1 0.9219 +vt 0.8594 0.9219 +vt 0.8594 0.7656 +vt 1 0.7656 +vt 0.2813 1 +vt 0.1406 1 +vt 0.1406 0.9688 +vt 0.2813 0.9688 +vt 1 0.7656 +vt 0.8594 0.7656 +vt 0.8594 0.9219 +vt 1 0.9219 +vt 0 0.9688 +vt 0.1406 0.9688 +vt 0.1406 1 +vt 0 1 +vt 0.875 1 +vt 0.7969 1 +vt 0.7969 0.9688 +vt 0.875 0.9688 +vt 0.8906 0.9688 +vt 0.8906 1 +vt 0.8125 1 +vt 0.8125 0.9688 +vt 0.7715 0.9688 +vt 0.9473 0.9688 +vt 1 0.9063 +vt 0.7188 0.9063 +vt 1 0.9063 +vt 0.9473 0.9688 +vt 0.7715 0.9688 +vt 0.7188 0.9063 +vt 0.9844 0.9688 +vt 0.9844 1 +vt 0.8125 1 +vt 0.8125 0.9688 +vt 0.25 1 +vt 0 1 +vt 0 0.875 +vt 0.25 0.875 +vt 0.8594 1 +vt 0.7813 1 +vt 0.7813 0.9688 +vt 0.8594 0.9688 +vt 1 0.9688 +vt 1 1 +vt 0.9219 1 +vt 0.9219 0.9688 +vt 0.7715 0.6875 +vt 0.9473 0.6875 +vt 1 0.75 +vt 0.7188 0.75 +vt 1 0.75 +vt 0.9473 0.6875 +vt 0.7715 0.6875 +vt 0.7188 0.75 +vt 0.9531 0.9688 +vt 0.9531 1 +vt 0.7813 1 +vt 0.7813 0.9688 +vt 0.25 1 +vt 0 1 +vt 0 0.875 +vt 0.25 0.875 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 -1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 -1 0 +vn 0.91 -0.41 0 +vn -0.91 0.41 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0.92 0.39 0 +vn -0.92 -0.39 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0.89 0.45 0 +vn -0.89 -0.45 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0.92 0.39 0 +vn -0.92 -0.39 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0.89 0.45 0 +vn -0.89 -0.45 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 -0.6 -0.8 +vn 0.91 -0.41 0 +vn -0.91 0.41 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn 0 0 1 +vn 0 -1 0 +vn 0 0 -1 +vn -0.76 0 -0.64 +vn 0.76 0 -0.64 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn 0.76 0 0.64 +vn -0.76 0 0.64 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +usemtl anti_aircraft_gun_painted +f 228/573/144 226/574/144 225/575/144 227/576/144 +f 231/577/145 229/578/145 230/579/145 232/580/145 +f 225/581/146 226/582/146 230/583/146 229/584/146 +f 228/585/147 227/586/147 231/587/147 232/588/147 +f 227/589/148 225/590/148 229/591/148 231/592/148 +f 232/593/149 230/594/149 226/595/149 228/596/149 +f 236/597/150 234/598/150 233/599/150 235/600/150 +f 239/601/151 237/602/151 238/603/151 240/604/151 +f 233/605/152 234/606/152 238/607/152 237/608/152 +f 236/609/153 235/610/153 239/611/153 240/612/153 +f 235/613/154 233/614/154 237/615/154 239/616/154 +f 240/617/155 238/618/155 234/619/155 236/620/155 +f 244/621/156 242/622/156 241/623/156 243/624/156 +f 247/625/157 245/626/157 246/627/157 248/628/157 +f 243/629/158 241/630/158 245/631/158 247/632/158 +f 248/633/159 246/634/159 242/635/159 244/636/159 +f 244/637/160 243/638/160 247/639/160 248/640/160 +f 252/641/161 250/642/161 249/643/161 251/644/161 +f 255/645/162 253/646/162 254/647/162 256/648/162 +f 249/649/163 250/650/163 254/651/163 253/652/163 +f 252/653/164 251/654/164 255/655/164 256/656/164 +f 251/657/165 249/658/165 253/659/165 255/660/165 +f 256/661/166 254/662/166 250/663/166 252/664/166 +f 260/665/167 258/666/167 257/667/167 259/668/167 +f 263/669/168 261/670/168 262/671/168 264/672/168 +f 257/673/169 258/674/169 262/675/169 261/676/169 +f 260/677/170 259/678/170 263/679/170 264/680/170 +f 259/681/171 257/682/171 261/683/171 263/684/171 +f 264/685/172 262/686/172 258/687/172 260/688/172 +f 268/689/173 266/690/173 265/691/173 267/692/173 +f 271/693/174 269/694/174 270/695/174 272/696/174 +f 267/697/175 265/698/175 269/699/175 271/700/175 +f 272/701/176 270/702/176 266/703/176 268/704/176 +f 268/705/177 267/706/177 271/707/177 272/708/177 +usemtl anti_aircraft_gun +f 276/709/178 274/710/178 273/711/178 275/712/178 +usemtl anti_aircraft_gun_painted +f 279/713/179 277/714/179 278/715/179 280/716/179 +f 273/717/180 274/718/180 278/719/180 277/720/180 +f 275/721/181 273/722/181 277/723/181 279/724/181 +f 280/725/182 278/726/182 274/727/182 276/728/182 +usemtl anti_aircraft_gun +f 284/729/183 282/730/183 281/731/183 283/732/183 +usemtl anti_aircraft_gun_painted +f 287/733/184 285/734/184 286/735/184 288/736/184 +f 284/737/185 283/738/185 287/739/185 288/740/185 +f 283/741/186 281/742/186 285/743/186 287/744/186 +f 288/745/187 286/746/187 282/747/187 284/748/187 +usemtl anti_aircraft_gun +f 292/749/188 290/750/188 289/751/188 291/752/188 +usemtl anti_aircraft_gun_painted +f 295/753/189 293/754/189 294/755/189 296/756/189 +f 292/757/190 291/758/190 295/759/190 296/760/190 +f 291/761/191 289/762/191 293/763/191 295/764/191 +f 296/765/192 294/766/192 290/767/192 292/768/192 +usemtl anti_aircraft_gun +f 300/769/193 298/770/193 297/771/193 299/772/193 +usemtl anti_aircraft_gun_painted +f 303/773/194 301/774/194 302/775/194 304/776/194 +f 300/777/195 299/778/195 303/779/195 304/780/195 +f 299/781/196 297/782/196 301/783/196 303/784/196 +f 304/785/197 302/786/197 298/787/197 300/788/197 +usemtl anti_aircraft_gun +f 308/789/198 306/790/198 305/791/198 307/792/198 +usemtl anti_aircraft_gun_painted +f 311/793/199 309/794/199 310/795/199 312/796/199 +f 308/797/200 307/798/200 311/799/200 312/800/200 +f 307/801/201 305/802/201 309/803/201 311/804/201 +f 312/805/202 310/806/202 306/807/202 308/808/202 +usemtl anti_aircraft_gun +f 316/809/203 314/810/203 313/811/203 315/812/203 +usemtl anti_aircraft_gun_painted +f 319/813/204 317/814/204 318/815/204 320/816/204 +f 313/817/205 314/818/205 318/819/205 317/820/205 +f 315/821/206 313/822/206 317/823/206 319/824/206 +f 320/825/207 318/826/207 314/827/207 316/828/207 +usemtl anti_aircraft_gun +f 324/829/208 322/830/208 321/831/208 323/832/208 +usemtl anti_aircraft_gun_painted +f 327/833/209 325/834/209 326/835/209 328/836/209 +usemtl anti_aircraft_gun +f 321/837/210 322/838/210 326/839/210 325/840/210 +f 323/841/211 321/842/211 325/843/211 327/844/211 +f 328/845/212 326/846/212 322/847/212 324/848/212 +f 332/849/213 330/850/213 329/851/213 331/852/213 +f 335/853/214 333/854/214 334/855/214 336/856/214 +f 329/857/215 330/858/215 334/859/215 333/860/215 +f 331/861/216 329/862/216 333/863/216 335/864/216 +f 336/865/217 334/866/217 330/867/217 332/868/217 +usemtl anti_aircraft_gun_painted +f 340/869/218 338/870/218 337/871/218 339/872/218 +f 343/873/219 341/874/219 342/875/219 344/876/219 +usemtl anti_aircraft_gun +f 341/877/220 346/878/220 345/879/220 342/880/220 +usemtl anti_aircraft_gun_painted +f 344/881/221 348/882/221 347/883/221 343/884/221 +f 343/885/222 347/886/222 346/887/222 341/888/222 +f 342/889/223 345/890/223 348/891/223 344/892/223 +usemtl anti_aircraft_gun +f 338/893/224 345/894/224 346/895/224 337/896/224 +usemtl anti_aircraft_gun_painted +f 337/897/225 346/898/225 347/899/225 339/900/225 +f 339/901/226 347/902/226 348/903/226 340/904/226 +f 340/905/227 348/906/227 345/907/227 338/908/227 +f 350/909/228 349/910/228 351/911/228 352/912/228 +f 355/913/229 353/914/229 354/915/229 356/916/229 +usemtl anti_aircraft_gun +f 353/917/230 349/918/230 350/919/230 354/920/230 +usemtl anti_aircraft_gun_painted +f 352/921/231 351/922/231 355/923/231 356/924/231 +f 351/925/232 349/926/232 353/927/232 355/928/232 +f 354/929/233 350/930/233 352/931/233 356/932/233 +f 358/933/234 357/934/234 359/935/234 360/936/234 +f 363/937/235 361/938/235 362/939/235 364/940/235 +usemtl anti_aircraft_gun +f 361/941/236 357/942/236 358/943/236 362/944/236 +usemtl anti_aircraft_gun_painted +f 360/945/237 359/946/237 363/947/237 364/948/237 +f 359/949/238 357/950/238 361/951/238 363/952/238 +f 362/953/239 358/954/239 360/955/239 364/956/239 +o gun +v -0.8437 1.1875 0.0272 +v -0.9687 1.1875 0.0272 +v -0.6562 0.6875 0.0272 +v -0.7812 0.6875 0.0272 +v -0.8437 1.1875 0.3397 +v -0.9687 1.1875 0.3397 +v -0.6562 0.6875 0.3397 +v -0.7812 0.6875 0.3397 +v -0.8437 1.1875 -0.3478 +v -0.9687 1.1875 -0.3478 +v -0.6562 0.6875 -0.3478 +v -0.7812 0.6875 -0.3478 +v -0.8437 1.1875 -0.0353 +v -0.9687 1.1875 -0.0353 +v -0.6562 0.6875 -0.0353 +v -0.7812 0.6875 -0.0353 +v -0.5937 1.6875 -0.3478 +v -0.7187 1.6875 -0.3478 +v -0.8437 1.1875 -0.3478 +v -0.9687 1.1875 -0.3478 +v -0.5937 1.6875 -0.0353 +v -0.7187 1.6875 -0.0353 +v -0.8437 1.1875 -0.0353 +v -0.9687 1.1875 -0.0353 +v -0.5937 1.6875 0.0272 +v -0.7187 1.6875 0.0272 +v -0.8437 1.1875 0.0272 +v -0.9687 1.1875 0.0272 +v -0.5937 1.6875 0.3397 +v -0.7187 1.6875 0.3397 +v -0.8437 1.1875 0.3397 +v -0.9687 1.1875 0.3397 +v -0.1812 1.3125 -0.0666 +v -0.1812 1.3125 -0.3166 +v -0.1812 1.25 -0.0666 +v -0.1812 1.25 -0.3166 +v -0.6812 1.3125 -0.0666 +v -0.6812 1.3125 -0.3166 +v -0.6812 1.25 -0.0666 +v -0.6812 1.25 -0.3166 +v -0.4312 1.3125 -0.3166 +v -0.4312 1.3125 -0.0666 +v -0.4312 1.25 -0.0666 +v -0.4312 1.25 -0.3166 +v -0.1406 1.25 -0.3469 +v -0.7656 1.25 -0.3469 +v -0.1406 1 -0.3469 +v -0.7656 1 -0.3469 +v -0.1406 1.25 -0.0344 +v -0.7656 1.25 -0.0344 +v -0.1406 1 -0.0344 +v -0.7656 1 -0.0344 +v -0.1406 1.25 -0.2219 +v -0.1406 1 -0.2219 +v -0.7656 1 -0.2219 +v -0.7656 1.25 -0.2219 +v -0.7656 1.2188 -0.2844 +v -1.2656 1.2188 -0.2844 +v -0.7656 1.0313 -0.2844 +v -1.2656 1.0313 -0.2844 +v -0.7656 1.2188 -0.0969 +v -1.2656 1.2188 -0.0969 +v -0.7656 1.0313 -0.0969 +v -1.2656 1.0313 -0.0969 +v -1.3281 1.1875 -0.1281 +v -1.2656 1.2188 -0.0969 +v -1.3281 1.0625 -0.1281 +v -1.2656 1.0313 -0.0969 +v -1.3281 1.1875 -0.2531 +v -1.2656 1.2188 -0.2844 +v -1.3281 1.0625 -0.2531 +v -1.2656 1.0313 -0.2844 +v -0.1812 1.3125 0.3084 +v -0.1812 1.3125 0.0584 +v -0.1812 1.25 0.3084 +v -0.1812 1.25 0.0584 +v -0.6812 1.3125 0.3084 +v -0.6812 1.3125 0.0584 +v -0.6812 1.25 0.3084 +v -0.6812 1.25 0.0584 +v -0.4312 1.3125 0.0584 +v -0.4312 1.3125 0.3084 +v -0.4312 1.25 0.3084 +v -0.4312 1.25 0.0584 +v -0.1406 1.25 0.0281 +v -0.7656 1.25 0.0281 +v -0.1406 1 0.0281 +v -0.7656 1 0.0281 +v -0.1406 1.25 0.3406 +v -0.7656 1.25 0.3406 +v -0.1406 1 0.3406 +v -0.7656 1 0.3406 +v -0.1406 1.25 0.1531 +v -0.1406 1 0.1531 +v -0.7656 1 0.1531 +v -0.7656 1.25 0.1531 +v -0.7656 1.2188 0.0906 +v -1.2656 1.2188 0.0906 +v -0.7656 1.0313 0.0906 +v -1.2656 1.0313 0.0906 +v -0.7656 1.2188 0.2781 +v -1.2656 1.2188 0.2781 +v -0.7656 1.0313 0.2781 +v -1.2656 1.0313 0.2781 +v -1.3281 1.1875 0.2469 +v -1.2656 1.2188 0.2781 +v -1.3281 1.0625 0.2469 +v -1.2656 1.0313 0.2781 +v -1.3281 1.1875 0.1219 +v -1.2656 1.2188 0.0906 +v -1.3281 1.0625 0.1219 +v -1.2656 1.0313 0.0906 +vt 0.5938 1 +vt 0.5625 1 +vt 0.5625 0.8594 +vt 0.5938 0.8594 +vt 0.5625 1 +vt 0.5625 0.8594 +vt 0.5313 0.8594 +vt 0.5313 1 +vt 0.4531 0.9688 +vt 0.4531 1 +vt 0.5313 1 +vt 0.5313 0.9688 +vt 0.375 1 +vt 0.375 0.8602 +vt 0.4531 0.8602 +vt 0.4531 1 +vt 0.4531 0.8602 +vt 0.375 0.8602 +vt 0.375 1 +vt 0.4531 1 +vt 0.5938 0.8594 +vt 0.5625 0.8594 +vt 0.5625 1 +vt 0.5938 1 +vt 0.5625 1 +vt 0.5625 0.8594 +vt 0.5313 0.8594 +vt 0.5313 1 +vt 0.4531 0.9688 +vt 0.4531 1 +vt 0.5313 1 +vt 0.5313 0.9688 +vt 0.375 1 +vt 0.375 0.8602 +vt 0.4531 0.8602 +vt 0.4531 1 +vt 0.4531 0.8602 +vt 0.375 0.8602 +vt 0.375 1 +vt 0.4531 1 +vt 0.5938 1 +vt 0.5625 1 +vt 0.5625 0.8594 +vt 0.5938 0.8594 +vt 0.5625 0.8594 +vt 0.5625 1 +vt 0.5313 1 +vt 0.5313 0.8594 +vt 0.5313 0.9688 +vt 0.4531 0.9688 +vt 0.4531 1 +vt 0.5313 1 +vt 0.375 0.8602 +vt 0.375 1 +vt 0.4531 1 +vt 0.4531 0.8602 +vt 0.4531 1 +vt 0.375 1 +vt 0.375 0.8602 +vt 0.4531 0.8602 +vt 0.5938 1 +vt 0.5625 1 +vt 0.5625 0.8594 +vt 0.5938 0.8594 +vt 0.5625 0.8594 +vt 0.5625 1 +vt 0.5313 1 +vt 0.5313 0.8594 +vt 0.5313 0.9688 +vt 0.4531 0.9688 +vt 0.4531 1 +vt 0.5313 1 +vt 0.375 0.8602 +vt 0.375 1 +vt 0.4531 1 +vt 0.4531 0.8602 +vt 0.4531 1 +vt 0.375 1 +vt 0.375 0.8602 +vt 0.4531 0.8602 +vt 0.6094 0.0938 +vt 0.6094 0.125 +vt 0.5469 0.125 +vt 0.5469 0.0938 +vt 0.5625 0.0938 +vt 0.5625 0.125 +vt 0.5 0.125 +vt 0.5 0.0938 +vt 0.4531 0.1094 +vt 0.5156 0.1094 +vt 0.5156 0.1719 +vt 0.4531 0.1719 +vt 0.4531 0.0938 +vt 0.5156 0.0938 +vt 0.5156 0.125 +vt 0.4531 0.125 +vt 0.5625 0.125 +vt 0.5 0.125 +vt 0.5 0.0938 +vt 0.5625 0.0938 +vt 0.6094 0.1719 +vt 0.5469 0.1719 +vt 0.5469 0.1094 +vt 0.6094 0.1094 +vt 0.6094 0.125 +vt 0.5469 0.125 +vt 0.5469 0.0938 +vt 0.6094 0.0938 +vt 0.5156 0.0938 +vt 0.5781 0.0938 +vt 0.5781 0.125 +vt 0.5156 0.125 +vt 0.0781 0.6875 +vt 0.0156 0.6875 +vt 0.0156 0.5313 +vt 0.0781 0.5313 +vt 0.0781 0.6875 +vt 0.0156 0.6875 +vt 0.0156 0.5313 +vt 0.0781 0.5313 +vt 0.0156 0.5313 +vt 0.0625 0.5313 +vt 0.0625 0.6875 +vt 0.0156 0.6875 +vt 0 0.5313 +vt 0.0469 0.5313 +vt 0.0469 0.6875 +vt 0 0.6875 +vt 0 0.4688 +vt 0.0469 0.4688 +vt 0.0469 0.5313 +vt 0 0.5313 +vt 0.125 0.5313 +vt 0.0781 0.5313 +vt 0.0781 0.4688 +vt 0.125 0.4688 +vt 0.125 0.5313 +vt 0.0938 0.5313 +vt 0.0938 0.4688 +vt 0.125 0.4688 +vt 0.0781 0.6875 +vt 0.0469 0.6875 +vt 0.0469 0.5313 +vt 0.0781 0.5313 +vt 0 0.4688 +vt 0.0313 0.4688 +vt 0.0313 0.5313 +vt 0 0.5313 +vt 0.0938 0.6875 +vt 0.0625 0.6875 +vt 0.0625 0.5313 +vt 0.0938 0.5313 +vt 0.1563 0.5469 +vt 0.2031 0.5469 +vt 0.2031 0.6719 +vt 0.1563 0.6719 +vt 0.2031 0.6719 +vt 0.1563 0.6719 +vt 0.1563 0.5469 +vt 0.2031 0.5469 +vt 0.2031 0.5469 +vt 0.2031 0.6719 +vt 0.1563 0.6719 +vt 0.1563 0.5469 +vt 0.1563 0.6719 +vt 0.1563 0.5469 +vt 0.2031 0.5469 +vt 0.2031 0.6719 +vt 0.9219 0.1875 +vt 0.9219 0.2344 +vt 0.875 0.2344 +vt 0.875 0.1875 +vt 0.875 0.1875 +vt 0.875 0.2344 +vt 0.8281 0.2344 +vt 0.8281 0.1875 +vt 0.1563 0.5938 +vt 0.1641 0.5781 +vt 0.1953 0.5781 +vt 0.2031 0.5938 +vt 0.1641 0.6094 +vt 0.1953 0.6094 +vt 0.2031 0.625 +vt 0.1563 0.625 +vt 0.1953 0.625 +vt 0.1641 0.625 +vt 0.1563 0.6094 +vt 0.2031 0.6094 +vt 0.2031 0.6075 +vt 0.1953 0.625 +vt 0.1641 0.625 +vt 0.1563 0.6075 +vt 0.1875 0.5938 +vt 0.1875 0.625 +vt 0.1563 0.625 +vt 0.1563 0.5938 +vt 0.2031 0.6406 +vt 0.1563 0.6406 +vt 0.1563 0.5938 +vt 0.2031 0.5938 +vt 0.6094 0.0938 +vt 0.6094 0.125 +vt 0.5469 0.125 +vt 0.5469 0.0938 +vt 0.5625 0.0938 +vt 0.5625 0.125 +vt 0.5 0.125 +vt 0.5 0.0938 +vt 0.4531 0.1094 +vt 0.5156 0.1094 +vt 0.5156 0.1719 +vt 0.4531 0.1719 +vt 0.4531 0.0938 +vt 0.5156 0.0938 +vt 0.5156 0.125 +vt 0.4531 0.125 +vt 0.5625 0.125 +vt 0.5 0.125 +vt 0.5 0.0938 +vt 0.5625 0.0938 +vt 0.6094 0.1719 +vt 0.5469 0.1719 +vt 0.5469 0.1094 +vt 0.6094 0.1094 +vt 0.6094 0.125 +vt 0.5469 0.125 +vt 0.5469 0.0938 +vt 0.6094 0.0938 +vt 0.5156 0.0938 +vt 0.5781 0.0938 +vt 0.5781 0.125 +vt 0.5156 0.125 +vt 0.0781 0.6875 +vt 0.0156 0.6875 +vt 0.0156 0.5313 +vt 0.0781 0.5313 +vt 0.0781 0.6875 +vt 0.0156 0.6875 +vt 0.0156 0.5313 +vt 0.0781 0.5313 +vt 0.0156 0.5313 +vt 0.0625 0.5313 +vt 0.0625 0.6875 +vt 0.0156 0.6875 +vt 0 0.5313 +vt 0.0469 0.5313 +vt 0.0469 0.6875 +vt 0 0.6875 +vt 0 0.4688 +vt 0.0469 0.4688 +vt 0.0469 0.5313 +vt 0 0.5313 +vt 0.125 0.5313 +vt 0.0781 0.5313 +vt 0.0781 0.4688 +vt 0.125 0.4688 +vt 0.125 0.5313 +vt 0.0938 0.5313 +vt 0.0938 0.4688 +vt 0.125 0.4688 +vt 0.0781 0.6875 +vt 0.0469 0.6875 +vt 0.0469 0.5313 +vt 0.0781 0.5313 +vt 0 0.4688 +vt 0.0313 0.4688 +vt 0.0313 0.5313 +vt 0 0.5313 +vt 0.0938 0.6875 +vt 0.0625 0.6875 +vt 0.0625 0.5313 +vt 0.0938 0.5313 +vt 0.1563 0.5469 +vt 0.2031 0.5469 +vt 0.2031 0.6719 +vt 0.1563 0.6719 +vt 0.2031 0.6719 +vt 0.1563 0.6719 +vt 0.1563 0.5469 +vt 0.2031 0.5469 +vt 0.2031 0.5469 +vt 0.2031 0.6719 +vt 0.1563 0.6719 +vt 0.1563 0.5469 +vt 0.1563 0.6719 +vt 0.1563 0.5469 +vt 0.2031 0.5469 +vt 0.2031 0.6719 +vt 0.9219 0.1875 +vt 0.9219 0.2344 +vt 0.875 0.2344 +vt 0.875 0.1875 +vt 0.875 0.1875 +vt 0.875 0.2344 +vt 0.8281 0.2344 +vt 0.8281 0.1875 +vt 0.1563 0.5938 +vt 0.1641 0.5781 +vt 0.1953 0.5781 +vt 0.2031 0.5938 +vt 0.1641 0.6094 +vt 0.1953 0.6094 +vt 0.2031 0.625 +vt 0.1563 0.625 +vt 0.1953 0.625 +vt 0.1641 0.625 +vt 0.1563 0.6094 +vt 0.2031 0.6094 +vt 0.2031 0.6075 +vt 0.1953 0.625 +vt 0.1641 0.625 +vt 0.1563 0.6075 +vt 0.1875 0.5938 +vt 0.1875 0.625 +vt 0.1563 0.625 +vt 0.1563 0.5938 +vt 0.2031 0.6406 +vt 0.1563 0.6406 +vt 0.1563 0.5938 +vt 0.2031 0.5938 +vn 0 0 -1 +vn 0 0 1 +vn 0 -1 0 +vn 0.94 0.35 0 +vn -0.94 -0.35 0 +vn 0 0 -1 +vn 0 0 1 +vn 0 -1 0 +vn 0.94 0.35 0 +vn -0.94 -0.35 0 +vn 0 0 -1 +vn 0 0 1 +vn 0 1 0 +vn 0.89 -0.45 0 +vn -0.89 0.45 0 +vn 0 0 -1 +vn 0 0 1 +vn 0 1 0 +vn 0.89 -0.45 0 +vn -0.89 0.45 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 0 -1 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 +vn 1 0 0 +vn -1 0 0 +vn 1 0 0 +vn 0 -1 0 +vn -1 0 0 +vn 0 1 0 +vn 0 0 -1 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 +vn 1 0 0 +vn -1 0 0 +vn -0.45 0 0.89 +vn -0.45 0 -0.89 +vn -0.45 0.89 0 +vn -0.45 -0.89 0 +vn -1 0 0 +vn 1 0 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 0 -1 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 +vn 1 0 0 +vn -1 0 0 +vn 1 0 0 +vn 0 -1 0 +vn -1 0 0 +vn 0 1 0 +vn 0 0 -1 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 +vn 1 0 0 +vn -1 0 0 +vn -0.45 0 0.89 +vn -0.45 0 -0.89 +vn -0.45 0.89 0 +vn -0.45 -0.89 0 +vn -1 0 0 +vn 1 0 0 +usemtl anti_aircraft_gun_painted +f 366/957/240 365/958/240 367/959/240 368/960/240 +f 371/961/241 369/962/241 370/963/241 372/964/241 +f 368/965/242 367/966/242 371/967/242 372/968/242 +usemtl anti_aircraft_gun +f 367/969/243 365/970/243 369/971/243 371/972/243 +usemtl anti_aircraft_gun_painted +f 370/973/244 366/974/244 368/975/244 372/976/244 +f 374/977/245 373/978/245 375/979/245 376/980/245 +f 379/981/246 377/982/246 378/983/246 380/984/246 +f 376/985/247 375/986/247 379/987/247 380/988/247 +usemtl anti_aircraft_gun +f 375/989/248 373/990/248 377/991/248 379/992/248 +usemtl anti_aircraft_gun_painted +f 378/993/249 374/994/249 376/995/249 380/996/249 +f 382/997/250 381/998/250 383/999/250 384/1000/250 +f 387/1001/251 385/1002/251 386/1003/251 388/1004/251 +f 385/1005/252 381/1006/252 382/1007/252 386/1008/252 +usemtl anti_aircraft_gun +f 383/1009/253 381/1010/253 385/1011/253 387/1012/253 +usemtl anti_aircraft_gun_painted +f 386/1013/254 382/1014/254 384/1015/254 388/1016/254 +f 390/1017/255 389/1018/255 391/1019/255 392/1020/255 +f 395/1021/256 393/1022/256 394/1023/256 396/1024/256 +f 393/1025/257 389/1026/257 390/1027/257 394/1028/257 +usemtl anti_aircraft_gun +f 391/1029/258 389/1030/258 393/1031/258 395/1032/258 +usemtl anti_aircraft_gun_painted +f 394/1033/259 390/1034/259 392/1035/259 396/1036/259 +f 400/1037/260 398/1038/260 397/1039/260 399/1040/260 +f 403/1041/261 401/1042/261 402/1043/261 404/1044/261 +f 401/1045/262 406/1046/262 405/1047/262 402/1048/262 +f 403/1049/263 407/1050/263 406/1051/263 401/1052/263 +f 402/1053/264 405/1054/264 408/1055/264 404/1056/264 +f 398/1057/265 405/1058/265 406/1059/265 397/1060/265 +f 397/1061/266 406/1062/266 407/1063/266 399/1064/266 +f 400/1065/267 408/1066/267 405/1067/267 398/1068/267 +f 412/1069/268 410/1070/268 409/1071/268 411/1072/268 +f 415/1073/269 413/1074/269 414/1075/269 416/1076/269 +f 413/1077/270 417/1078/270 420/1079/270 414/1080/270 +f 416/1081/271 419/1082/271 418/1083/271 415/1084/271 +f 415/1085/272 418/1086/272 417/1087/272 413/1088/272 +f 414/1089/273 420/1090/273 419/1091/273 416/1092/273 +f 409/1093/274 417/1094/274 418/1095/274 411/1096/274 +f 411/1097/275 418/1098/275 419/1099/275 412/1100/275 +f 412/1101/276 419/1102/276 420/1103/276 410/1104/276 +f 410/1105/277 420/1106/277 417/1107/277 409/1108/277 +f 424/1109/278 422/1110/278 421/1111/278 423/1112/278 +f 427/1113/279 425/1114/279 426/1115/279 428/1116/279 +f 421/1117/280 422/1118/280 426/1119/280 425/1120/280 +f 424/1121/281 423/1122/281 427/1123/281 428/1124/281 +f 423/1125/282 421/1126/282 425/1127/282 427/1128/282 +f 428/1129/283 426/1130/283 422/1131/283 424/1132/283 +f 430/1133/284 429/1134/284 431/1135/284 432/1136/284 +f 435/1137/285 433/1138/285 434/1139/285 436/1140/285 +f 433/1141/286 429/1142/286 430/1143/286 434/1144/286 +f 432/1145/287 431/1146/287 435/1147/287 436/1148/287 +f 431/1149/288 429/1150/288 433/1151/288 435/1152/288 +f 434/1153/289 430/1154/289 432/1155/289 436/1156/289 +f 440/1157/290 438/1158/290 437/1159/290 439/1160/290 +f 443/1161/291 441/1162/291 442/1163/291 444/1164/291 +f 441/1165/292 446/1166/292 445/1167/292 442/1168/292 +f 443/1169/293 447/1170/293 446/1171/293 441/1172/293 +f 442/1173/294 445/1174/294 448/1175/294 444/1176/294 +f 438/1177/295 445/1178/295 446/1179/295 437/1180/295 +f 437/1181/296 446/1182/296 447/1183/296 439/1184/296 +f 440/1185/297 448/1186/297 445/1187/297 438/1188/297 +f 452/1189/298 450/1190/298 449/1191/298 451/1192/298 +f 455/1193/299 453/1194/299 454/1195/299 456/1196/299 +f 453/1197/300 457/1198/300 460/1199/300 454/1200/300 +f 456/1201/301 459/1202/301 458/1203/301 455/1204/301 +f 455/1205/302 458/1206/302 457/1207/302 453/1208/302 +f 454/1209/303 460/1210/303 459/1211/303 456/1212/303 +f 449/1213/304 457/1214/304 458/1215/304 451/1216/304 +f 451/1217/305 458/1218/305 459/1219/305 452/1220/305 +f 452/1221/306 459/1222/306 460/1223/306 450/1224/306 +f 450/1225/307 460/1226/307 457/1227/307 449/1228/307 +f 464/1229/308 462/1230/308 461/1231/308 463/1232/308 +f 467/1233/309 465/1234/309 466/1235/309 468/1236/309 +f 461/1237/310 462/1238/310 466/1239/310 465/1240/310 +f 464/1241/311 463/1242/311 467/1243/311 468/1244/311 +f 463/1245/312 461/1246/312 465/1247/312 467/1248/312 +f 468/1249/313 466/1250/313 462/1251/313 464/1252/313 +f 470/1253/314 469/1254/314 471/1255/314 472/1256/314 +f 475/1257/315 473/1258/315 474/1259/315 476/1260/315 +f 473/1261/316 469/1262/316 470/1263/316 474/1264/316 +f 472/1265/317 471/1266/317 475/1267/317 476/1268/317 +f 471/1269/318 469/1270/318 473/1271/318 475/1272/318 +f 474/1273/319 470/1274/319 472/1275/319 476/1276/319 +o cannon2 +v -1.3281 1.1875 -0.2531 +v -2.3281 1.1875 -0.2531 +v -1.3281 1.0625 -0.2531 +v -2.3281 1.0625 -0.2531 +v -1.3281 1.1875 -0.1281 +v -2.3281 1.1875 -0.1281 +v -1.3281 1.0625 -0.1281 +v -2.3281 1.0625 -0.1281 +v -2.3906 1.0313 -0.0969 +v -2.5156 1.0313 -0.0969 +v -2.3906 1.2188 -0.0969 +v -2.5156 1.2188 -0.0969 +v -2.3906 1.0313 -0.2844 +v -2.5156 1.0313 -0.2844 +v -2.3906 1.2188 -0.2844 +v -2.5156 1.2188 -0.2844 +v -2.3281 1.0625 -0.1281 +v -2.3906 1.0313 -0.0969 +v -2.3281 1.1875 -0.1281 +v -2.3906 1.2188 -0.0969 +v -2.3281 1.0625 -0.2531 +v -2.3906 1.0313 -0.2844 +v -2.3281 1.1875 -0.2531 +v -2.3906 1.2188 -0.2844 +vt 0.25 0.4375 +vt 0.25 0.4688 +vt 0 0.4688 +vt 0 0.4375 +vt 0 0.4688 +vt 0 0.4375 +vt 0.25 0.4375 +vt 0.25 0.4688 +vt 0 0.4375 +vt 0.25 0.4375 +vt 0.25 0.4688 +vt 0 0.4688 +vt 0.25 0.4688 +vt 0 0.4688 +vt 0 0.4375 +vt 0.25 0.4375 +vt 0.6563 0.125 +vt 0.6563 0.1563 +vt 0.625 0.1563 +vt 0.625 0.125 +vt 0.2969 0.4375 +vt 0.2969 0.4688 +vt 0.2656 0.4688 +vt 0.2656 0.4375 +vt 0.2031 0.5938 +vt 0.1563 0.5938 +vt 0.1563 0.5625 +vt 0.2031 0.5625 +vt 0.1563 0.5625 +vt 0.2031 0.5625 +vt 0.2031 0.5938 +vt 0.1563 0.5938 +vt 0.1563 0.5938 +vt 0.1563 0.5625 +vt 0.2031 0.5625 +vt 0.2031 0.5938 +vt 0.2031 0.5625 +vt 0.2031 0.5938 +vt 0.1563 0.5938 +vt 0.1563 0.5625 +vt 0.25 0.5313 +vt 0.25 0.5781 +vt 0.2031 0.5781 +vt 0.2031 0.5313 +vt 0.2031 0.5156 +vt 0.2031 0.5625 +vt 0.1563 0.5625 +vt 0.1563 0.5156 +vt 0.1563 0.6094 +vt 0.1641 0.5938 +vt 0.1953 0.5938 +vt 0.2031 0.6094 +vt 0.1641 0.625 +vt 0.1953 0.625 +vt 0.2031 0.6406 +vt 0.1563 0.6406 +vt 0.1953 0.6406 +vt 0.1641 0.6406 +vt 0.1563 0.625 +vt 0.2031 0.625 +vt 0.2031 0.6232 +vt 0.1953 0.6406 +vt 0.1641 0.6406 +vt 0.1563 0.6232 +vt 0.1875 0.6094 +vt 0.1875 0.6406 +vt 0.1563 0.6406 +vt 0.1563 0.6094 +vt 0.2031 0.6563 +vt 0.1563 0.6563 +vt 0.1563 0.6094 +vt 0.2031 0.6094 +vn 0 0 -1 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 -1 0 +vn 0 1 0 +vn 1 0 0 +vn -1 0 0 +vn 0.45 0 0.89 +vn 0.45 0 -0.89 +vn 0.45 -0.89 0 +vn 0.45 0.89 0 +vn 1 0 0 +vn -1 0 0 +usemtl anti_aircraft_gun_painted +f 480/1277/320 478/1278/320 477/1279/320 479/1280/320 +f 483/1281/321 481/1282/321 482/1283/321 484/1284/321 +f 477/1285/322 478/1286/322 482/1287/322 481/1288/322 +f 480/1289/323 479/1290/323 483/1291/323 484/1292/323 +f 479/1293/324 477/1294/324 481/1295/324 483/1296/324 +f 484/1297/325 482/1298/325 478/1299/325 480/1300/325 +f 488/1301/326 486/1302/326 485/1303/326 487/1304/326 +f 491/1305/327 489/1306/327 490/1307/327 492/1308/327 +f 485/1309/328 486/1310/328 490/1311/328 489/1312/328 +f 488/1313/329 487/1314/329 491/1315/329 492/1316/329 +f 487/1317/330 485/1318/330 489/1319/330 491/1320/330 +f 492/1321/331 490/1322/331 486/1323/331 488/1324/331 +f 494/1325/332 493/1326/332 495/1327/332 496/1328/332 +f 499/1329/333 497/1330/333 498/1331/333 500/1332/333 +f 497/1333/334 493/1334/334 494/1335/334 498/1336/334 +f 496/1337/335 495/1338/335 499/1339/335 500/1340/335 +f 495/1341/336 493/1342/336 497/1343/336 499/1344/336 +f 498/1345/337 494/1346/337 496/1347/337 500/1348/337 +o cannon1 +v -1.3281 1.1875 0.1219 +v -2.3281 1.1875 0.1219 +v -1.3281 1.0625 0.1219 +v -2.3281 1.0625 0.1219 +v -1.3281 1.1875 0.2469 +v -2.3281 1.1875 0.2469 +v -1.3281 1.0625 0.2469 +v -2.3281 1.0625 0.2469 +v -2.3906 1.0313 0.2781 +v -2.5156 1.0313 0.2781 +v -2.3906 1.2188 0.2781 +v -2.5156 1.2188 0.2781 +v -2.3906 1.0313 0.0906 +v -2.5156 1.0313 0.0906 +v -2.3906 1.2188 0.0906 +v -2.5156 1.2188 0.0906 +v -2.3281 1.0625 0.2469 +v -2.3906 1.0313 0.2781 +v -2.3281 1.1875 0.2469 +v -2.3906 1.2188 0.2781 +v -2.3281 1.0625 0.1219 +v -2.3906 1.0313 0.0906 +v -2.3281 1.1875 0.1219 +v -2.3906 1.2188 0.0906 +vt 0.25 0.4375 +vt 0.25 0.4688 +vt 0 0.4688 +vt 0 0.4375 +vt 0 0.4688 +vt 0 0.4375 +vt 0.25 0.4375 +vt 0.25 0.4688 +vt 0 0.4375 +vt 0.25 0.4375 +vt 0.25 0.4688 +vt 0 0.4688 +vt 0.25 0.4688 +vt 0 0.4688 +vt 0 0.4375 +vt 0.25 0.4375 +vt 0.6563 0.125 +vt 0.6563 0.1563 +vt 0.625 0.1563 +vt 0.625 0.125 +vt 0.2969 0.4375 +vt 0.2969 0.4688 +vt 0.2656 0.4688 +vt 0.2656 0.4375 +vt 0.2031 0.5938 +vt 0.1563 0.5938 +vt 0.1563 0.5625 +vt 0.2031 0.5625 +vt 0.1563 0.5625 +vt 0.2031 0.5625 +vt 0.2031 0.5938 +vt 0.1563 0.5938 +vt 0.1563 0.5938 +vt 0.1563 0.5625 +vt 0.2031 0.5625 +vt 0.2031 0.5938 +vt 0.2031 0.5625 +vt 0.2031 0.5938 +vt 0.1563 0.5938 +vt 0.1563 0.5625 +vt 0.25 0.5313 +vt 0.25 0.5781 +vt 0.2031 0.5781 +vt 0.2031 0.5313 +vt 0.2031 0.5156 +vt 0.2031 0.5625 +vt 0.1563 0.5625 +vt 0.1563 0.5156 +vt 0.1563 0.6094 +vt 0.1641 0.5938 +vt 0.1953 0.5938 +vt 0.2031 0.6094 +vt 0.1641 0.625 +vt 0.1953 0.625 +vt 0.2031 0.6406 +vt 0.1563 0.6406 +vt 0.1953 0.6406 +vt 0.1641 0.6406 +vt 0.1563 0.625 +vt 0.2031 0.625 +vt 0.2031 0.6232 +vt 0.1953 0.6406 +vt 0.1641 0.6406 +vt 0.1563 0.6232 +vt 0.1875 0.6094 +vt 0.1875 0.6406 +vt 0.1563 0.6406 +vt 0.1563 0.6094 +vt 0.2031 0.6563 +vt 0.1563 0.6563 +vt 0.1563 0.6094 +vt 0.2031 0.6094 +vn 0 0 -1 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 -1 0 +vn 0 1 0 +vn 1 0 0 +vn -1 0 0 +vn 0.45 0 0.89 +vn 0.45 0 -0.89 +vn 0.45 -0.89 0 +vn 0.45 0.89 0 +vn 1 0 0 +vn -1 0 0 +usemtl anti_aircraft_gun_painted +f 504/1349/338 502/1350/338 501/1351/338 503/1352/338 +f 507/1353/339 505/1354/339 506/1355/339 508/1356/339 +f 501/1357/340 502/1358/340 506/1359/340 505/1360/340 +f 504/1361/341 503/1362/341 507/1363/341 508/1364/341 +f 503/1365/342 501/1366/342 505/1367/342 507/1368/342 +f 508/1369/343 506/1370/343 502/1371/343 504/1372/343 +f 512/1373/344 510/1374/344 509/1375/344 511/1376/344 +f 515/1377/345 513/1378/345 514/1379/345 516/1380/345 +f 509/1381/346 510/1382/346 514/1383/346 513/1384/346 +f 512/1385/347 511/1386/347 515/1387/347 516/1388/347 +f 511/1389/348 509/1390/348 513/1391/348 515/1392/348 +f 516/1393/349 514/1394/349 510/1395/349 512/1396/349 +f 518/1397/350 517/1398/350 519/1399/350 520/1400/350 +f 523/1401/351 521/1402/351 522/1403/351 524/1404/351 +f 521/1405/352 517/1406/352 518/1407/352 522/1408/352 +f 520/1409/353 519/1410/353 523/1411/353 524/1412/353 +f 519/1413/354 517/1414/354 521/1415/354 523/1416/354 +f 522/1417/355 518/1418/355 520/1419/355 524/1420/355 +o magazine +v -0.2437 1.749 0.2448 +v -0.4937 1.749 0.2448 +v -0.2437 1.749 0.1198 +v -0.4937 1.749 0.1198 +v -0.2437 1.3115 0.2448 +v -0.4937 1.3115 0.2448 +v -0.2437 1.3115 0.1198 +v -0.4937 1.3115 0.1198 +v -0.1187 1.749 0.2448 +v -0.2437 1.749 0.2448 +v -0.1187 1.749 0.1198 +v -0.2437 1.749 0.1198 +v -0.1187 1.5615 0.2448 +v -0.2437 1.3115 0.2448 +v -0.1187 1.5615 0.1198 +v -0.2437 1.3115 0.1198 +v -0.4937 1.749 0.2448 +v -0.6187 1.4365 0.2448 +v -0.4937 1.749 0.1198 +v -0.6187 1.4365 0.1198 +v -0.4937 1.3115 0.2448 +v -0.6187 1.3115 0.2448 +v -0.4937 1.3115 0.1198 +v -0.6187 1.3115 0.1198 +vt 0.3125 0.5625 +vt 0.3125 0.5938 +vt 0.25 0.5938 +vt 0.25 0.5625 +vt 0.5625 0.125 +vt 0.5625 0.1563 +vt 0.5 0.1563 +vt 0.5 0.125 +vt 0.3125 0.5938 +vt 0.3125 0.6563 +vt 0.2031 0.6563 +vt 0.2031 0.5938 +vt 0.3125 0.6094 +vt 0.3125 0.6719 +vt 0.2031 0.6719 +vt 0.2031 0.6094 +vt 0.3125 0.5938 +vt 0.3125 0.625 +vt 0.2031 0.625 +vt 0.2031 0.5938 +vt 0.3125 0.5938 +vt 0.3125 0.625 +vt 0.2031 0.625 +vt 0.2031 0.5938 +vt 0.2656 0.5938 +vt 0.2344 0.5938 +vt 0.2344 0.5625 +vt 0.2656 0.5625 +vt 0.273 0.5625 +vt 0.273 0.5938 +vt 0.2031 0.5938 +vt 0.2031 0.5625 +vt 0.2656 0.5625 +vt 0.3125 0.5625 +vt 0.3125 0.5938 +vt 0.2031 0.5938 +vt 0.3125 0.5625 +vt 0.3125 0.5938 +vt 0.2656 0.5938 +vt 0.2031 0.5625 +vt 0.25 0.5625 +vt 0.25 0.5938 +vt 0.2031 0.5938 +vt 0.2031 0.5625 +vt 0.3281 0.6094 +vt 0.2188 0.6094 +vt 0.2188 0.5781 +vt 0.3281 0.5781 +vt 0.3029 0.5938 +vt 0.2188 0.5938 +vt 0.2188 0.5625 +vt 0.3029 0.5625 +vt 0.5469 0.125 +vt 0.5469 0.1563 +vt 0.5156 0.1563 +vt 0.5156 0.125 +vt 0.2031 0.6563 +vt 0.3125 0.6563 +vt 0.2344 0.6875 +vt 0.2031 0.6875 +vt 0.2344 0.5781 +vt 0.3125 0.6094 +vt 0.2031 0.6094 +vt 0.2031 0.5781 +vt 0.3125 0.6406 +vt 0.3125 0.6719 +vt 0.2031 0.6719 +vt 0.2031 0.6406 +vt 0.2969 0.5938 +vt 0.2656 0.5938 +vt 0.2656 0.5625 +vt 0.2969 0.5625 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0.89 -0.45 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn -0.93 0.37 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +usemtl anti_aircraft_gun_painted +f 528/1421/356 526/1422/356 525/1423/356 527/1424/356 +f 531/1425/357 529/1426/357 530/1427/357 532/1428/357 +f 525/1429/358 526/1430/358 530/1431/358 529/1432/358 +f 528/1433/359 527/1434/359 531/1435/359 532/1436/359 +f 527/1437/360 525/1438/360 529/1439/360 531/1440/360 +f 532/1441/361 530/1442/361 526/1443/361 528/1444/361 +f 534/1445/362 533/1446/362 535/1447/362 536/1448/362 +f 539/1449/363 537/1450/363 538/1451/363 540/1452/363 +f 537/1453/364 533/1454/364 534/1455/364 538/1456/364 +f 536/1457/365 535/1458/365 539/1459/365 540/1460/365 +f 535/1461/366 533/1462/366 537/1463/366 539/1464/366 +f 538/1465/367 534/1466/367 536/1467/367 540/1468/367 +f 542/1469/368 541/1470/368 543/1471/368 544/1472/368 +f 547/1473/369 545/1474/369 546/1475/369 548/1476/369 +f 545/1477/370 541/1478/370 542/1479/370 546/1480/370 +f 544/1481/371 543/1482/371 547/1483/371 548/1484/371 +f 543/1485/372 541/1486/372 545/1487/372 547/1488/372 +f 546/1489/373 542/1490/373 544/1491/373 548/1492/373 +o magazine2 +v -0.2437 1.749 -0.1302 +v -0.4937 1.749 -0.1302 +v -0.2437 1.749 -0.2552 +v -0.4937 1.749 -0.2552 +v -0.2437 1.3115 -0.1302 +v -0.4937 1.3115 -0.1302 +v -0.2437 1.3115 -0.2552 +v -0.4937 1.3115 -0.2552 +v -0.1187 1.749 -0.1302 +v -0.2437 1.749 -0.1302 +v -0.1187 1.749 -0.2552 +v -0.2437 1.749 -0.2552 +v -0.1187 1.5615 -0.1302 +v -0.2437 1.3115 -0.1302 +v -0.1187 1.5615 -0.2552 +v -0.2437 1.3115 -0.2552 +v -0.4937 1.749 -0.1302 +v -0.6187 1.4365 -0.1302 +v -0.4937 1.749 -0.2552 +v -0.6187 1.4365 -0.2552 +v -0.4937 1.3115 -0.1302 +v -0.6187 1.3115 -0.1302 +v -0.4937 1.3115 -0.2552 +v -0.6187 1.3115 -0.2552 +vt 0.3125 0.5625 +vt 0.3125 0.5938 +vt 0.25 0.5938 +vt 0.25 0.5625 +vt 0.5625 0.125 +vt 0.5625 0.1563 +vt 0.5 0.1563 +vt 0.5 0.125 +vt 0.3125 0.5938 +vt 0.3125 0.6563 +vt 0.2031 0.6563 +vt 0.2031 0.5938 +vt 0.3125 0.6094 +vt 0.3125 0.6719 +vt 0.2031 0.6719 +vt 0.2031 0.6094 +vt 0.3125 0.5938 +vt 0.3125 0.625 +vt 0.2031 0.625 +vt 0.2031 0.5938 +vt 0.3125 0.5938 +vt 0.3125 0.625 +vt 0.2031 0.625 +vt 0.2031 0.5938 +vt 0.2656 0.5938 +vt 0.2344 0.5938 +vt 0.2344 0.5625 +vt 0.2656 0.5625 +vt 0.273 0.5625 +vt 0.273 0.5938 +vt 0.2031 0.5938 +vt 0.2031 0.5625 +vt 0.2656 0.5625 +vt 0.3125 0.5625 +vt 0.3125 0.5938 +vt 0.2031 0.5938 +vt 0.3125 0.5625 +vt 0.3125 0.5938 +vt 0.2656 0.5938 +vt 0.2031 0.5625 +vt 0.25 0.5625 +vt 0.25 0.5938 +vt 0.2031 0.5938 +vt 0.2031 0.5625 +vt 0.3281 0.6094 +vt 0.2188 0.6094 +vt 0.2188 0.5781 +vt 0.3281 0.5781 +vt 0.3029 0.5938 +vt 0.2188 0.5938 +vt 0.2188 0.5625 +vt 0.3029 0.5625 +vt 0.5469 0.125 +vt 0.5469 0.1563 +vt 0.5156 0.1563 +vt 0.5156 0.125 +vt 0.2031 0.6563 +vt 0.3125 0.6563 +vt 0.2344 0.6875 +vt 0.2031 0.6875 +vt 0.2344 0.5781 +vt 0.3125 0.6094 +vt 0.2031 0.6094 +vt 0.2031 0.5781 +vt 0.3125 0.6406 +vt 0.3125 0.6719 +vt 0.2031 0.6719 +vt 0.2031 0.6406 +vt 0.2969 0.5938 +vt 0.2656 0.5938 +vt 0.2656 0.5625 +vt 0.2969 0.5625 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0.89 -0.45 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn -0.93 0.37 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +usemtl anti_aircraft_gun_painted +f 552/1493/374 550/1494/374 549/1495/374 551/1496/374 +f 555/1497/375 553/1498/375 554/1499/375 556/1500/375 +f 549/1501/376 550/1502/376 554/1503/376 553/1504/376 +f 552/1505/377 551/1506/377 555/1507/377 556/1508/377 +f 551/1509/378 549/1510/378 553/1511/378 555/1512/378 +f 556/1513/379 554/1514/379 550/1515/379 552/1516/379 +f 558/1517/380 557/1518/380 559/1519/380 560/1520/380 +f 563/1521/381 561/1522/381 562/1523/381 564/1524/381 +f 561/1525/382 557/1526/382 558/1527/382 562/1528/382 +f 560/1529/383 559/1530/383 563/1531/383 564/1532/383 +f 559/1533/384 557/1534/384 561/1535/384 563/1536/384 +f 562/1537/385 558/1538/385 560/1539/385 564/1540/385 +f 566/1541/386 565/1542/386 567/1543/386 568/1544/386 +f 571/1545/387 569/1546/387 570/1547/387 572/1548/387 +f 569/1549/388 565/1550/388 566/1551/388 570/1552/388 +f 568/1553/389 567/1554/389 571/1555/389 572/1556/389 +f 567/1557/390 565/1558/390 569/1559/390 571/1560/390 +f 570/1561/391 566/1562/391 568/1563/391 572/1564/391 +o horizontal_drive_guida_mechanismnce +v 0.3438 1.1816 0.2153 +v 0.3438 1.1816 -0.2847 +v 0.3438 1.1191 0.2153 +v 0.3438 1.1191 -0.2847 +v 0.2813 1.1816 0.1528 +v 0.2813 1.1816 -0.2222 +v 0.2813 1.1191 0.1528 +v 0.2813 1.1191 -0.2222 +v 0.7813 1.1816 0.1528 +v 0.7813 1.1816 -0.2222 +v 0.7813 1.1191 0.1528 +v 0.7813 1.1191 -0.2222 +v 0.7188 1.1816 0.2153 +v 0.7188 1.1816 -0.2847 +v 0.7188 1.1191 0.2153 +v 0.7188 1.1191 -0.2847 +v 0.7188 1.1816 0.1528 +v 0.7188 1.1191 0.1528 +v 0.3438 1.1816 0.1528 +v 0.3438 1.1191 0.1528 +v 0.7188 1.1816 -0.2222 +v 0.7188 1.1191 -0.2222 +v 0.3438 1.1816 -0.2222 +v 0.3438 1.1191 -0.2222 +v 0.5398 1.1784 -0.0661 +v 0.3791 1.1784 -0.2577 +v 0.5398 1.1159 -0.0661 +v 0.3791 1.1159 -0.2577 +v 0.4919 1.1784 -0.026 +v 0.3312 1.1784 -0.2175 +v 0.4919 1.1159 -0.026 +v 0.3312 1.1159 -0.2175 +v 0.5704 1.1784 -0.02 +v 0.7311 1.1784 -0.2115 +v 0.5704 1.1159 -0.02 +v 0.7311 1.1159 -0.2115 +v 0.5225 1.1784 -0.0601 +v 0.6832 1.1784 -0.2516 +v 0.5225 1.1159 -0.0601 +v 0.6832 1.1159 -0.2516 +v 0.5625 1.1784 0.1528 +v 0.5625 1.1784 -0.0347 +v 0.5625 1.1159 0.1528 +v 0.5625 1.1159 -0.0347 +v 0.5 1.1784 0.1528 +v 0.5 1.1784 -0.0347 +v 0.5 1.1159 0.1528 +v 0.5 1.1159 -0.0347 +v 0.5938 1.2441 0.0278 +v 0.5938 1.2441 -0.0972 +v 0.5938 1.1191 0.0278 +v 0.5938 1.1191 -0.0972 +v 0.4688 1.2441 0.0278 +v 0.4688 1.2441 -0.0972 +v 0.4688 1.1191 0.0278 +v 0.4688 1.1191 -0.0972 +v 0.5613 1.1222 -0.0677 +v 0.4988 1.1222 -0.0677 +v 0.5613 1.0597 -0.0677 +v 0.4988 1.0597 -0.0677 +v 0.5613 1.1222 -0.0052 +v 0.4988 1.1222 -0.0052 +v 0.5613 1.0597 -0.0052 +v 0.4988 1.0597 -0.0052 +v 0.5613 1.0597 -0.0677 +v 0.4988 1.0597 -0.0677 +v 0.5613 0.9972 -0.0677 +v 0.4988 0.9972 -0.0677 +v 0.5613 1.0597 -0.0052 +v 0.4988 1.0597 -0.0052 +v 0.5613 0.9972 -0.0052 +v 0.4988 0.9972 -0.0052 +vt 0.0156 0.375 +vt 0 0.375 +vt 0 0.25 +vt 0.0156 0.25 +vt 0.0156 0.2656 +vt 0 0.2656 +vt 0 0.3594 +vt 0.0156 0.3594 +vt 0.0156 0.25 +vt 0.0156 0.375 +vt 0 0.3594 +vt 0 0.2656 +vt 0.0156 0.375 +vt 0.0156 0.25 +vt 0 0.2656 +vt 0 0.3594 +vt 0.0156 0.25 +vt 0.0156 0.2656 +vt 0 0.2656 +vt 0 0.25 +vt 0.0156 0.3594 +vt 0.0156 0.375 +vt 0 0.375 +vt 0 0.3594 +vt 0.125 0.3594 +vt 0.1094 0.3594 +vt 0.1094 0.2656 +vt 0.125 0.2656 +vt 0.125 0.375 +vt 0.1094 0.375 +vt 0.1094 0.25 +vt 0.125 0.25 +vt 0.125 0.2656 +vt 0.125 0.3594 +vt 0.1094 0.375 +vt 0.1094 0.25 +vt 0.125 0.3594 +vt 0.125 0.2656 +vt 0.1094 0.25 +vt 0.1094 0.375 +vt 0.125 0.25 +vt 0.125 0.2656 +vt 0.1094 0.2656 +vt 0.1094 0.25 +vt 0.125 0.3594 +vt 0.125 0.375 +vt 0.1094 0.375 +vt 0.1094 0.3594 +vt 0.1094 0.25 +vt 0.1094 0.2656 +vt 0.0156 0.2656 +vt 0.0156 0.25 +vt 0.1094 0.25 +vt 0.1094 0.2656 +vt 0.0156 0.2656 +vt 0.0156 0.25 +vt 0.1094 0.25 +vt 0.1094 0.2656 +vt 0.0156 0.2656 +vt 0.0156 0.25 +vt 0.1094 0.25 +vt 0.1094 0.2656 +vt 0.0156 0.2656 +vt 0.0156 0.25 +vt 0.1094 0.3594 +vt 0.1094 0.375 +vt 0.0156 0.375 +vt 0.0156 0.3594 +vt 0.1094 0.3594 +vt 0.1094 0.375 +vt 0.0156 0.375 +vt 0.0156 0.3594 +vt 0.0156 0.375 +vt 0.0156 0.3594 +vt 0.1094 0.3594 +vt 0.1094 0.375 +vt 0.0156 0.3594 +vt 0.0156 0.375 +vt 0.1094 0.375 +vt 0.1094 0.3594 +vt 0.0313 0.3594 +vt 0.0156 0.3594 +vt 0.0156 0.2969 +vt 0.0313 0.2969 +vt 0.0313 0.3594 +vt 0.0156 0.3594 +vt 0.0156 0.2969 +vt 0.0313 0.2969 +vt 0.0313 0.2969 +vt 0.0313 0.3594 +vt 0.0156 0.3594 +vt 0.0156 0.2969 +vt 0.0313 0.2969 +vt 0.0313 0.3594 +vt 0.0156 0.3594 +vt 0.0156 0.2969 +vt 0.0469 0.3281 +vt 0.0469 0.3438 +vt 0.1094 0.3438 +vt 0.1094 0.3281 +vt 0.1094 0.3281 +vt 0.1094 0.3438 +vt 0.0469 0.3438 +vt 0.0469 0.3281 +vt 0.1094 0.3438 +vt 0.0469 0.3438 +vt 0.0469 0.3281 +vt 0.1094 0.3281 +vt 0.0469 0.3438 +vt 0.1094 0.3438 +vt 0.1094 0.3281 +vt 0.0469 0.3281 +vt 0.0469 0.3438 +vt 0.0313 0.3438 +vt 0.0313 0.2969 +vt 0.0469 0.2969 +vt 0.0469 0.3438 +vt 0.0313 0.3438 +vt 0.0313 0.2969 +vt 0.0469 0.2969 +vt 0.0469 0.2969 +vt 0.0469 0.3438 +vt 0.0313 0.3438 +vt 0.0313 0.2969 +vt 0.0469 0.2969 +vt 0.0469 0.3438 +vt 0.0313 0.3438 +vt 0.0313 0.2969 +vt 0.1094 0.3125 +vt 0.0781 0.3125 +vt 0.0781 0.2813 +vt 0.1094 0.2813 +vt 0.0469 0.2813 +vt 0.0781 0.2813 +vt 0.0781 0.3125 +vt 0.0469 0.3125 +vt 0.0938 0.2813 +vt 0.0938 0.3125 +vt 0.0625 0.3125 +vt 0.0625 0.2813 +vt 0.0469 0.2656 +vt 0.0469 0.2969 +vt 0.0156 0.2969 +vt 0.0156 0.2656 +vt 0.0938 0.2656 +vt 0.0938 0.2969 +vt 0.0625 0.2969 +vt 0.0625 0.2656 +vt 0.0625 0.3281 +vt 0.0625 0.2969 +vt 0.0938 0.2969 +vt 0.0938 0.3281 +vt 0.2031 0.2031 +vt 0.2031 0.2188 +vt 0.2188 0.2188 +vt 0.2188 0.2031 +vt 0.1875 0.2031 +vt 0.1875 0.2188 +vt 0.2031 0.2188 +vt 0.2031 0.2031 +vt 0.2031 0.2031 +vt 0.2031 0.2188 +vt 0.2188 0.2188 +vt 0.2188 0.2031 +vt 0.2188 0.2031 +vt 0.2188 0.2188 +vt 0.2344 0.2188 +vt 0.2344 0.2031 +vt 0.1875 0.1875 +vt 0.1875 0.2031 +vt 0.2031 0.2031 +vt 0.2031 0.1875 +vt 0.1719 0.1875 +vt 0.1719 0.2031 +vt 0.1875 0.2031 +vt 0.1875 0.1875 +vt 0.1875 0.1875 +vt 0.1875 0.2031 +vt 0.2031 0.2031 +vt 0.2031 0.1875 +vt 0.2031 0.1875 +vt 0.2031 0.2031 +vt 0.2188 0.2031 +vt 0.2188 0.1875 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn -0.71 0 0.71 +vn -0.71 0 -0.71 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0.71 0 0.71 +vn 0.71 0 -0.71 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0.77 0 -0.64 +vn -0.77 0 0.64 +vn 0 1 0 +vn 0 -1 0 +vn 0.77 0 0.64 +vn -0.77 0 -0.64 +vn 0 1 0 +vn 0 -1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 0 -1 +vn 0 0 1 +vn 1 0 0 +vn -1 0 0 +vn 0 0 -1 +vn 0 0 1 +vn 1 0 0 +vn -1 0 0 +usemtl anti_aircraft_gun_painted +f 576/1565/392 574/1566/392 573/1567/392 575/1568/392 +f 579/1569/393 577/1570/393 578/1571/393 580/1572/393 +f 573/1573/394 574/1574/394 578/1575/394 577/1576/394 +f 576/1577/395 575/1578/395 579/1579/395 580/1580/395 +f 575/1581/396 573/1582/396 577/1583/396 579/1584/396 +f 580/1585/397 578/1586/397 574/1587/397 576/1588/397 +f 584/1589/398 582/1590/398 581/1591/398 583/1592/398 +f 587/1593/399 585/1594/399 586/1595/399 588/1596/399 +f 581/1597/400 582/1598/400 586/1599/400 585/1600/400 +f 584/1601/401 583/1602/401 587/1603/401 588/1604/401 +f 583/1605/402 581/1606/402 585/1607/402 587/1608/402 +f 588/1609/403 586/1610/403 582/1611/403 584/1612/403 +f 585/1613/404 589/1614/404 591/1615/404 573/1616/404 +f 590/1617/405 587/1618/405 575/1619/405 592/1620/405 +f 587/1621/406 585/1622/406 573/1623/406 575/1624/406 +f 592/1625/407 591/1626/407 589/1627/407 590/1628/407 +f 593/1629/408 586/1630/408 574/1631/408 595/1632/408 +f 588/1633/409 594/1634/409 596/1635/409 576/1636/409 +f 594/1637/410 593/1638/410 595/1639/410 596/1640/410 +f 576/1641/411 574/1642/411 586/1643/411 588/1644/411 +f 600/1645/412 598/1646/412 597/1647/412 599/1648/412 +f 603/1649/413 601/1650/413 602/1651/413 604/1652/413 +f 597/1653/414 598/1654/414 602/1655/414 601/1656/414 +f 600/1657/415 599/1658/415 603/1659/415 604/1660/415 +f 608/1661/416 606/1662/416 605/1663/416 607/1664/416 +f 611/1665/417 609/1666/417 610/1667/417 612/1668/417 +f 605/1669/418 606/1670/418 610/1671/418 609/1672/418 +f 608/1673/419 607/1674/419 611/1675/419 612/1676/419 +f 616/1677/420 614/1678/420 613/1679/420 615/1680/420 +f 619/1681/421 617/1682/421 618/1683/421 620/1684/421 +f 613/1685/422 614/1686/422 618/1687/422 617/1688/422 +f 616/1689/423 615/1690/423 619/1691/423 620/1692/423 +f 624/1693/424 622/1694/424 621/1695/424 623/1696/424 +f 627/1697/425 625/1698/425 626/1699/425 628/1700/425 +f 621/1701/426 622/1702/426 626/1703/426 625/1704/426 +f 624/1705/427 623/1706/427 627/1707/427 628/1708/427 +f 623/1709/428 621/1710/428 625/1711/428 627/1712/428 +f 628/1713/429 626/1714/429 622/1715/429 624/1716/429 +f 632/1717/430 630/1718/430 629/1719/430 631/1720/430 +f 635/1721/431 633/1722/431 634/1723/431 636/1724/431 +f 631/1725/432 629/1726/432 633/1727/432 635/1728/432 +f 636/1729/433 634/1730/433 630/1731/433 632/1732/433 +f 640/1733/434 638/1734/434 637/1735/434 639/1736/434 +f 643/1737/435 641/1738/435 642/1739/435 644/1740/435 +f 639/1741/436 637/1742/436 641/1743/436 643/1744/436 +f 644/1745/437 642/1746/437 638/1747/437 640/1748/437 +o firing_pedal +v -0.0023 0.6156 -0.25 +v -0.0023 0.6156 -0.4375 +v -0.0425 0.5678 -0.25 +v -0.0425 0.5678 -0.4375 +v -0.2896 0.8567 -0.25 +v -0.2896 0.8567 -0.4375 +v -0.3297 0.8088 -0.25 +v -0.3297 0.8088 -0.4375 +vt 0.2031 0.2188 +vt 0.2031 0.2344 +vt 0.1563 0.2344 +vt 0.1563 0.2188 +vt 0.2031 0.2188 +vt 0.2031 0.2344 +vt 0.1563 0.2344 +vt 0.1563 0.2188 +vt 0.25 0.1875 +vt 0.25 0.2344 +vt 0.1563 0.2344 +vt 0.1563 0.1875 +vt 0.25 0.1875 +vt 0.25 0.2344 +vt 0.1563 0.2344 +vt 0.1563 0.1875 +vt 0.25 0.2188 +vt 0.25 0.2344 +vt 0.1563 0.2344 +vt 0.1563 0.2188 +vt 0.25 0.2188 +vt 0.25 0.2344 +vt 0.1563 0.2344 +vt 0.1563 0.2188 +vn 0.77 -0.64 0 +vn -0.77 0.64 0 +vn 0.64 0.77 0 +vn -0.64 -0.77 0 +vn 0 0 1 +vn 0 0 -1 +usemtl anti_aircraft_gun_painted +f 648/1749/438 646/1750/438 645/1751/438 647/1752/438 +f 651/1753/439 649/1754/439 650/1755/439 652/1756/439 +f 645/1757/440 646/1758/440 650/1759/440 649/1760/440 +f 648/1761/441 647/1762/441 651/1763/441 652/1764/441 +f 647/1765/442 645/1766/442 649/1767/442 651/1768/442 +f 652/1769/443 650/1770/443 646/1771/443 648/1772/443 +o vertical_drive_guida_mechanismnce +v -0.1282 1.0319 -0.6937 +v -0.1282 1.5319 -0.6937 +v -0.1907 1.0319 -0.6937 +v -0.1907 1.5319 -0.6937 +v -0.1282 1.0944 -0.6312 +v -0.1282 1.4694 -0.6312 +v -0.1907 1.0944 -0.6312 +v -0.1907 1.4694 -0.6312 +v -0.1282 1.0944 -1.1312 +v -0.1282 1.4694 -1.1312 +v -0.1907 1.0944 -1.1312 +v -0.1907 1.4694 -1.1312 +v -0.1282 1.0319 -1.0687 +v -0.1282 1.5319 -1.0687 +v -0.1907 1.0319 -1.0687 +v -0.1907 1.5319 -1.0687 +v -0.1282 1.0944 -1.0687 +v -0.1907 1.0944 -1.0687 +v -0.1282 1.0944 -0.6937 +v -0.1907 1.0944 -0.6937 +v -0.1282 1.4694 -1.0687 +v -0.1907 1.4694 -1.0687 +v -0.1282 1.4694 -0.6937 +v -0.1907 1.4694 -0.6937 +v -0.1313 1.3133 -0.8898 +v -0.1313 1.5048 -0.7291 +v -0.1938 1.3133 -0.8898 +v -0.1938 1.5048 -0.7291 +v -0.1313 1.2732 -0.8419 +v -0.1313 1.4647 -0.6812 +v -0.1938 1.2732 -0.8419 +v -0.1938 1.4647 -0.6812 +v -0.1313 1.2672 -0.9204 +v -0.1313 1.4587 -1.0811 +v -0.1938 1.2672 -0.9204 +v -0.1938 1.4587 -1.0811 +v -0.1313 1.3073 -0.8725 +v -0.1313 1.4988 -1.0332 +v -0.1938 1.3073 -0.8725 +v -0.1938 1.4988 -1.0332 +v -0.1313 1.0944 -0.9125 +v -0.1313 1.2819 -0.9125 +v -0.1938 1.0944 -0.9125 +v -0.1938 1.2819 -0.9125 +v -0.1313 1.0944 -0.85 +v -0.1313 1.2819 -0.85 +v -0.1938 1.0944 -0.85 +v -0.1938 1.2819 -0.85 +v -0.0657 1.2194 -0.9437 +v -0.0657 1.3444 -0.9437 +v -0.1907 1.2194 -0.9437 +v -0.1907 1.3444 -0.9437 +v -0.0657 1.2194 -0.8187 +v -0.0657 1.3444 -0.8187 +v -0.1907 1.2194 -0.8187 +v -0.1907 1.3444 -0.8187 +v -0.1875 1.3125 -0.8437 +v -0.1875 1.3125 -0.9062 +v -0.1875 1.25 -0.8437 +v -0.1875 1.25 -0.9062 +v -0.6875 1.3125 -0.8437 +v -0.6875 1.3125 -0.9062 +v -0.6875 1.25 -0.8437 +v -0.6875 1.25 -0.9062 +vt 0.0156 0.375 +vt 0 0.375 +vt 0 0.25 +vt 0.0156 0.25 +vt 0.0156 0.2656 +vt 0 0.2656 +vt 0 0.3594 +vt 0.0156 0.3594 +vt 0.0156 0.25 +vt 0.0156 0.375 +vt 0 0.3594 +vt 0 0.2656 +vt 0.0156 0.375 +vt 0.0156 0.25 +vt 0 0.2656 +vt 0 0.3594 +vt 0.0156 0.25 +vt 0.0156 0.2656 +vt 0 0.2656 +vt 0 0.25 +vt 0.0156 0.3594 +vt 0.0156 0.375 +vt 0 0.375 +vt 0 0.3594 +vt 0.125 0.3594 +vt 0.1094 0.3594 +vt 0.1094 0.2656 +vt 0.125 0.2656 +vt 0.125 0.375 +vt 0.1094 0.375 +vt 0.1094 0.25 +vt 0.125 0.25 +vt 0.125 0.2656 +vt 0.125 0.3594 +vt 0.1094 0.375 +vt 0.1094 0.25 +vt 0.125 0.3594 +vt 0.125 0.2656 +vt 0.1094 0.25 +vt 0.1094 0.375 +vt 0.125 0.25 +vt 0.125 0.2656 +vt 0.1094 0.2656 +vt 0.1094 0.25 +vt 0.125 0.3594 +vt 0.125 0.375 +vt 0.1094 0.375 +vt 0.1094 0.3594 +vt 0.1094 0.25 +vt 0.1094 0.2656 +vt 0.0156 0.2656 +vt 0.0156 0.25 +vt 0.1094 0.25 +vt 0.1094 0.2656 +vt 0.0156 0.2656 +vt 0.0156 0.25 +vt 0.1094 0.25 +vt 0.1094 0.2656 +vt 0.0156 0.2656 +vt 0.0156 0.25 +vt 0.1094 0.25 +vt 0.1094 0.2656 +vt 0.0156 0.2656 +vt 0.0156 0.25 +vt 0.1094 0.3594 +vt 0.1094 0.375 +vt 0.0156 0.375 +vt 0.0156 0.3594 +vt 0.1094 0.3594 +vt 0.1094 0.375 +vt 0.0156 0.375 +vt 0.0156 0.3594 +vt 0.0156 0.375 +vt 0.0156 0.3594 +vt 0.1094 0.3594 +vt 0.1094 0.375 +vt 0.0156 0.3594 +vt 0.0156 0.375 +vt 0.1094 0.375 +vt 0.1094 0.3594 +vt 0.0313 0.3594 +vt 0.0156 0.3594 +vt 0.0156 0.2969 +vt 0.0313 0.2969 +vt 0.0313 0.3594 +vt 0.0156 0.3594 +vt 0.0156 0.2969 +vt 0.0313 0.2969 +vt 0.0313 0.2969 +vt 0.0313 0.3594 +vt 0.0156 0.3594 +vt 0.0156 0.2969 +vt 0.0313 0.2969 +vt 0.0313 0.3594 +vt 0.0156 0.3594 +vt 0.0156 0.2969 +vt 0.0469 0.3281 +vt 0.0469 0.3438 +vt 0.1094 0.3438 +vt 0.1094 0.3281 +vt 0.1094 0.3281 +vt 0.1094 0.3438 +vt 0.0469 0.3438 +vt 0.0469 0.3281 +vt 0.1094 0.3438 +vt 0.0469 0.3438 +vt 0.0469 0.3281 +vt 0.1094 0.3281 +vt 0.0469 0.3438 +vt 0.1094 0.3438 +vt 0.1094 0.3281 +vt 0.0469 0.3281 +vt 0.0469 0.3438 +vt 0.0313 0.3438 +vt 0.0313 0.2969 +vt 0.0469 0.2969 +vt 0.0469 0.3438 +vt 0.0313 0.3438 +vt 0.0313 0.2969 +vt 0.0469 0.2969 +vt 0.0469 0.2969 +vt 0.0469 0.3438 +vt 0.0313 0.3438 +vt 0.0313 0.2969 +vt 0.0469 0.2969 +vt 0.0469 0.3438 +vt 0.0313 0.3438 +vt 0.0313 0.2969 +vt 0.1094 0.3125 +vt 0.0781 0.3125 +vt 0.0781 0.2813 +vt 0.1094 0.2813 +vt 0.0469 0.2813 +vt 0.0781 0.2813 +vt 0.0781 0.3125 +vt 0.0469 0.3125 +vt 0.0938 0.2813 +vt 0.0938 0.3125 +vt 0.0625 0.3125 +vt 0.0625 0.2813 +vt 0.0469 0.2656 +vt 0.0469 0.2969 +vt 0.0156 0.2969 +vt 0.0156 0.2656 +vt 0.0938 0.2656 +vt 0.0938 0.2969 +vt 0.0625 0.2969 +vt 0.0625 0.2656 +vt 0.0625 0.3281 +vt 0.0625 0.2969 +vt 0.0938 0.2969 +vt 0.0938 0.3281 +vt 0.125 0.2031 +vt 0.125 0.2188 +vt 0.1094 0.2188 +vt 0.1094 0.2031 +vt 0.125 0.2031 +vt 0.125 0.2188 +vt 0.1094 0.2188 +vt 0.1094 0.2031 +vt 0.2344 0.2031 +vt 0.2344 0.2188 +vt 0.1094 0.2188 +vt 0.1094 0.2031 +vt 0.2344 0.2031 +vt 0.2344 0.2188 +vt 0.1094 0.2188 +vt 0.1094 0.2031 +vt 0.2344 0.2031 +vt 0.2344 0.2188 +vt 0.1094 0.2188 +vt 0.1094 0.2031 +vt 0.2344 0.2031 +vt 0.2344 0.2188 +vt 0.1094 0.2188 +vt 0.1094 0.2031 +vn 0 0 -1 +vn 0 0 1 +vn 1 0 0 +vn -1 0 0 +vn 0 -0.71 0.71 +vn 0 0.71 0.71 +vn 0 0 -1 +vn 0 0 1 +vn 1 0 0 +vn -1 0 0 +vn 0 -0.71 -0.71 +vn 0 0.71 -0.71 +vn 1 0 0 +vn -1 0 0 +vn 0 -1 0 +vn 0 1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 -1 0 +vn 0 1 0 +vn 0 0.64 -0.77 +vn 0 -0.64 0.77 +vn 1 0 0 +vn -1 0 0 +vn 0 -0.64 -0.77 +vn 0 0.64 0.77 +vn 1 0 0 +vn -1 0 0 +vn 0 0 -1 +vn 0 0 1 +vn 1 0 0 +vn -1 0 0 +vn 0 0 -1 +vn 0 0 1 +vn 1 0 0 +vn -1 0 0 +vn 0 -1 0 +vn 0 1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +usemtl anti_aircraft_gun_painted +f 656/1773/444 654/1774/444 653/1775/444 655/1776/444 +f 659/1777/445 657/1778/445 658/1779/445 660/1780/445 +f 653/1781/446 654/1782/446 658/1783/446 657/1784/446 +f 656/1785/447 655/1786/447 659/1787/447 660/1788/447 +f 655/1789/448 653/1790/448 657/1791/448 659/1792/448 +f 660/1793/449 658/1794/449 654/1795/449 656/1796/449 +f 664/1797/450 662/1798/450 661/1799/450 663/1800/450 +f 667/1801/451 665/1802/451 666/1803/451 668/1804/451 +f 661/1805/452 662/1806/452 666/1807/452 665/1808/452 +f 664/1809/453 663/1810/453 667/1811/453 668/1812/453 +f 663/1813/454 661/1814/454 665/1815/454 667/1816/454 +f 668/1817/455 666/1818/455 662/1819/455 664/1820/455 +f 665/1821/456 669/1822/456 671/1823/456 653/1824/456 +f 670/1825/457 667/1826/457 655/1827/457 672/1828/457 +f 667/1829/458 665/1830/458 653/1831/458 655/1832/458 +f 672/1833/459 671/1834/459 669/1835/459 670/1836/459 +f 673/1837/460 666/1838/460 654/1839/460 675/1840/460 +f 668/1841/461 674/1842/461 676/1843/461 656/1844/461 +f 674/1845/462 673/1846/462 675/1847/462 676/1848/462 +f 656/1849/463 654/1850/463 666/1851/463 668/1852/463 +f 680/1853/464 678/1854/464 677/1855/464 679/1856/464 +f 683/1857/465 681/1858/465 682/1859/465 684/1860/465 +f 677/1861/466 678/1862/466 682/1863/466 681/1864/466 +f 680/1865/467 679/1866/467 683/1867/467 684/1868/467 +f 688/1869/468 686/1870/468 685/1871/468 687/1872/468 +f 691/1873/469 689/1874/469 690/1875/469 692/1876/469 +f 685/1877/470 686/1878/470 690/1879/470 689/1880/470 +f 688/1881/471 687/1882/471 691/1883/471 692/1884/471 +f 696/1885/472 694/1886/472 693/1887/472 695/1888/472 +f 699/1889/473 697/1890/473 698/1891/473 700/1892/473 +f 693/1893/474 694/1894/474 698/1895/474 697/1896/474 +f 696/1897/475 695/1898/475 699/1899/475 700/1900/475 +f 704/1901/476 702/1902/476 701/1903/476 703/1904/476 +f 707/1905/477 705/1906/477 706/1907/477 708/1908/477 +f 701/1909/478 702/1910/478 706/1911/478 705/1912/478 +f 704/1913/479 703/1914/479 707/1915/479 708/1916/479 +f 703/1917/480 701/1918/480 705/1919/480 707/1920/480 +f 708/1921/481 706/1922/481 702/1923/481 704/1924/481 +f 712/1925/482 710/1926/482 709/1927/482 711/1928/482 +f 715/1929/483 713/1930/483 714/1931/483 716/1932/483 +f 709/1933/484 710/1934/484 714/1935/484 713/1936/484 +f 712/1937/485 711/1938/485 715/1939/485 716/1940/485 +f 711/1941/486 709/1942/486 713/1943/486 715/1944/486 +f 716/1945/487 714/1946/487 710/1947/487 712/1948/487 \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/models/entity/vehicle/field_flak/field_flak.obj.amt b/src/main/resources/assets/immersiveintelligence/models/entity/vehicle/field_flak/field_flak.obj.amt new file mode 100644 index 000000000..264af81d2 --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/models/entity/vehicle/field_flak/field_flak.obj.amt @@ -0,0 +1,85 @@ +{ + "origins": { + "weapon": [0, 4, 0], + "turret": [0.65286, 14.82609, 0.03393], + "gun": [-5.49657, 18.475, -0.08503], + "cannon2": [-35.41667, 18, -3.05], + "cannon2_net": [-31.91667, 17.01667, -3.05], + "cannon1": [-35.41667, 18, 2.95], + "cannon1_net": [-0.25, -1, -0.05], + "magazine": [-5.89857, 24.40124, 2.91667], + "magazine2": [-5.89857, 24.40124, -3.08333], + "gun_net": [-13.85227, 18.95276, -0.06543], + "horizontal_drive_guida_mechanismnce": [8.49527, 18.1216, -0.76452], + "firing_pedal": [-0.5, 10, -5.5], + "vertical_drive_guida_mechanismnce": [-3.06296, 20.73755, -14.08691], + "turret_net": [-11.40416, 19.90014, 0], + "wheel2": [0, 3.90621, 17.66739], + "wheel1": [0, 3.90621, -17.33261], + "weapon_net": [-15.71564, 6, 8.49793], + "hans_commander": [14, 15.66667, 18], + "hans_commander_body": [14, 12, 18], + "hans_commander_head": [14, 24, 18], + "hans_commander_left_arm": [8, 22, 18], + "hans_commander_right_arm": [20, 21.97429, 18.21228], + "hans_commander_right_leg": [16, 11, 18], + "hans_commander_left_leg": [12, 11, 18], + "hans_gunner": [14, 15.66667, -19], + "hans_gunner_body": [14, 12, -19], + "hans_gunner_head": [14, 24, -19], + "hans_gunner_left_arm": [8, 22, -19], + "hans_gunner_right_arm": [21, 21.97429, -18.78772], + "hans_gunner_right_leg": [16, 11, -19], + "hans_gunner_left_leg": [12, 11, -19], + "turret_base": [0.65286, 8.82609, 0.03393], + "cannon2_fire": [-40.25, 18, -3.05], + "cannon1_fire": [-40.25, 18, 2.95] + }, + "hierarchy": { + "turret": "turret_base", + "gun": "turret", + "cannon2": "gun", + "cannon2_net": "cannon2", + "cannon1": "gun", + "cannon1_net": "cannon1", + "magazine": "gun", + "magazine2": "gun", + "gun_net": "gun", + "horizontal_drive_guida_mechanismnce": "turret", + "firing_pedal": "turret", + "vertical_drive_guida_mechanismnce": "turret", + "turret_net": "turret", + "wheel2": "weapon", + "wheel1": "weapon", + "weapon_net": "weapon", + "hans_commander": "turret_base", + "hans_commander_body": "hans_commander", + "hans_commander_head": "hans_commander_body", + "hans_commander_left_arm": "hans_commander_body", + "hans_commander_right_arm": "hans_commander_body", + "hans_commander_right_leg": "hans_commander", + "hans_commander_left_leg": "hans_commander", + "hans_gunner": "turret_base", + "hans_gunner_body": "hans_gunner", + "hans_gunner_head": "hans_gunner_body", + "hans_gunner_left_arm": "hans_gunner_body", + "hans_gunner_right_arm": "hans_gunner_body", + "hans_gunner_right_leg": "hans_gunner", + "hans_gunner_left_leg": "hans_gunner", + "turret_base": "weapon", + "cannon2_fire": "cannon2", + "cannon1_fire": "cannon1" + }, + "properties": { + "cannon1_fire": { + "particle": "ammo/gunfire", + "rotation": [180.0, 90.0, 0.0], + "position": [0.425, 0.0, 0.0] + }, + "cannon2_fire": { + "particle": "ammo/gunfire", + "rotation": [180.0, 90.0, 0.0], + "position": [0.425, 0.0, 0.0] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/models/entity/vehicle/field_howitzer/field_howitzer.mtl b/src/main/resources/assets/immersiveintelligence/models/entity/vehicle/field_howitzer/field_howitzer.mtl new file mode 100644 index 000000000..9460749e0 --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/models/entity/vehicle/field_howitzer/field_howitzer.mtl @@ -0,0 +1,20 @@ +# Made by Pabilo8 with Blockbench + +newmtl field_howitzer +map_Kd immersiveintelligence:entity/vehicle/field_gun/field_howitzer +newmtl field_howitzer_paint +map_Kd immersiveintelligence:entity/vehicle/field_gun/field_howitzer_painted +newmtl hans +map_Kd immersiveintelligence:entity/hans +newmtl wheel_12_terrain +map_Kd immersiveintelligence:entity/vehicle/suspension/wheel_12_terrain +newmtl artillery_scope +map_Kd immersiveintelligence:entity/vehicle/field_gun/artillery_scope +newmtl common_camo_net +map_Kd immersiveintelligence:blocks/common/camo_net/common_camo_net +newmtl radio_backpack +map_Kd immersiveintelligence:armor/radio_backpack +newmtl radio_backpack2 +map_Kd immersiveintelligence:armor/radio_backpack2 +newmtl snow_vehicle +map_Kd immersiveintelligence:entity/vehicle/environment_effects/snow \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/models/entity/vehicle/field_howitzer/field_howitzer.obj b/src/main/resources/assets/immersiveintelligence/models/entity/vehicle/field_howitzer/field_howitzer.obj new file mode 100644 index 000000000..0abcbc782 --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/models/entity/vehicle/field_howitzer/field_howitzer.obj @@ -0,0 +1,2833 @@ +# Made by Pabilo8 with Blockbench +# Exported with IIToolkit Plugin on 29/05/2026 +mtllib field_howitzer.mtl + +o howizer +v -0.4375 0.3125 0.4375 +v -0.4375 0.3125 0.375 +v -0.4375 0.5625 0.4375 +v -0.4375 0.5625 0.375 +v -0.1875 0.3125 0.6875 +v -0.1875 0.3125 0.375 +v -0.1875 0.5625 0.6875 +v -0.1875 0.5625 0.375 +v -0.1875 0.5625 0.375 +v -0.1875 0.5625 -0.3125 +v -0.1875 0.3125 0.375 +v -0.1875 0.3125 -0.3125 +v -0.4375 0.5625 0.375 +v -0.4375 0.5625 -0.3125 +v -0.4375 0.3125 0.375 +v -0.4375 0.3125 -0.3125 +v 0.3125 0.5625 0.6875 +v 0.3125 0.5625 0.4375 +v 0.3125 0.3125 0.6875 +v 0.3125 0.3125 0.4375 +v -0.1875 0.5625 0.6875 +v -0.1875 0.5625 0.4375 +v -0.1875 0.3125 0.6875 +v -0.1875 0.3125 0.4375 +v 0.5625 0.5625 0.4375 +v 0.5625 0.5625 0.375 +v 0.5625 0.3125 0.4375 +v 0.5625 0.3125 0.375 +v 0.3125 0.5625 0.6875 +v 0.3125 0.5625 0.375 +v 0.3125 0.3125 0.6875 +v 0.3125 0.3125 0.375 +v 0.5625 0.5625 0.375 +v 0.5625 0.5625 -0.3125 +v 0.5625 0.3125 0.375 +v 0.5625 0.3125 -0.3125 +v 0.3125 0.5625 0.375 +v 0.3125 0.5625 -0.3125 +v 0.3125 0.3125 0.375 +v 0.3125 0.3125 -0.3125 +v 0.25 0.5625 0.9375 +v 0.25 0.5625 0.6875 +v 0.25 0.3125 0.9375 +v 0.25 0.3125 0.6875 +v -0.125 0.5625 0.9375 +v -0.125 0.5625 0.6875 +v -0.125 0.3125 0.9375 +v -0.125 0.3125 0.6875 +v 0.25 0.5625 1.0625 +v 0.25 0.5625 0.9375 +v 0.25 0.3125 1.0625 +v 0.25 0.3125 0.9375 +v 0.125 0.5625 1.0625 +v 0.125 0.5625 0.9375 +v 0.125 0.3125 1.0625 +v 0.125 0.3125 0.9375 +v 0 0.5625 1.0625 +v 0 0.5625 0.9375 +v 0 0.3125 1.0625 +v 0 0.3125 0.9375 +v -0.125 0.5625 1.0625 +v -0.125 0.5625 0.9375 +v -0.125 0.3125 1.0625 +v -0.125 0.3125 0.9375 +v 0.25 0.5625 1.1875 +v 0.25 0.5625 1.0625 +v 0.25 0.3125 1.1875 +v 0.25 0.3125 1.0625 +v -0.125 0.5625 1.1875 +v -0.125 0.5625 1.0625 +v -0.125 0.3125 1.1875 +v -0.125 0.3125 1.0625 +v 0.5625 0.5625 -0.3125 +v 0.5625 0.5625 -0.5625 +v 0.5625 0.1875 -0.3125 +v 0.5625 0.1875 -0.5625 +v -0.4375 0.5625 -0.3125 +v -0.4375 0.5625 -0.5625 +v -0.4375 0.1875 -0.3125 +v -0.4375 0.1875 -0.5625 +v 0.375 1.1974 -0.3243 +v 0.375 1.1757 -0.4474 +v 0.375 1.0743 -0.3026 +v 0.375 1.0526 -0.4257 +v 0.3125 1.1974 -0.3243 +v 0.3125 1.1757 -0.4474 +v 0.3125 1.0743 -0.3026 +v 0.3125 1.0526 -0.4257 +v -0.1875 1.1974 -0.3243 +v -0.1875 1.1757 -0.4474 +v -0.1875 1.0743 -0.3026 +v -0.1875 1.0526 -0.4257 +v -0.25 1.1974 -0.3243 +v -0.25 1.1757 -0.4474 +v -0.25 1.0743 -0.3026 +v -0.25 1.0526 -0.4257 +v 0.625 0.5 -0.125 +v 0.625 0.5 -0.25 +v 0.625 0.375 -0.125 +v 0.625 0.375 -0.25 +v -0.5 0.5 -0.125 +v -0.5 0.5 -0.25 +v -0.5 0.375 -0.125 +v -0.5 0.375 -0.25 +v 0.6875 0.625 0 +v 0.6875 0.625 -0.375 +v 0.6875 0.25 0 +v 0.6875 0.25 -0.375 +v 0.625 0.625 0 +v 0.625 0.625 -0.375 +v 0.625 0.25 0 +v 0.625 0.25 -0.375 +v -0.5 0.625 0 +v -0.5 0.625 -0.375 +v -0.5 0.25 0 +v -0.5 0.25 -0.375 +v -0.5625 0.625 0 +v -0.5625 0.625 -0.375 +v -0.5625 0.25 0 +v -0.5625 0.25 -0.375 +v -0.25 0.9375 -0.3125 +v -0.25 0.9375 -0.5562 +v -0.25 0.5625 -0.3125 +v -0.25 0.5625 -0.5625 +v -0.375 0.9375 -0.3125 +v -0.375 0.9375 -0.5562 +v -0.375 0.5625 -0.3125 +v -0.375 0.5625 -0.5625 +v 0.5 0.9375 -0.3125 +v 0.5 0.9375 -0.5562 +v 0.5 0.5625 -0.3125 +v 0.5 0.5625 -0.5625 +v 0.375 0.9375 -0.3125 +v 0.375 0.9375 -0.5562 +v 0.375 0.5625 -0.3125 +v 0.375 0.5625 -0.5625 +v 0.375 1.2516 -0.2441 +v 0.375 1.2537 -0.5566 +v 0.375 1.0016 -0.2463 +v 0.375 1.0038 -0.5588 +v 0.5 1.2516 -0.2441 +v 0.5 1.2537 -0.5566 +v 0.5 1.0016 -0.2463 +v 0.5 1.0038 -0.5588 +v -0.25 1.2516 -0.2441 +v -0.25 1.2537 -0.5566 +v -0.25 1.0016 -0.2463 +v -0.25 1.0038 -0.5588 +v -0.375 1.2516 -0.2441 +v -0.375 1.2537 -0.5566 +v -0.375 1.0016 -0.2463 +v -0.375 1.0038 -0.5588 +v -0.25 1.6662 -0.5533 +v -0.25 1.6673 -0.6783 +v -0.25 0.4163 -0.5642 +v -0.25 0.4174 -0.6892 +v -0.375 1.6662 -0.5533 +v -0.375 1.6673 -0.6783 +v -0.375 0.4163 -0.5642 +v -0.375 0.4174 -0.6892 +v -0.25 1.6673 -0.6783 +v -0.25 1.6679 -0.7408 +v -0.25 0.4174 -0.6892 +v -0.25 0.4179 -0.7517 +v -0.875 1.6673 -0.6783 +v -0.875 1.6679 -0.7408 +v -1 0.4174 -0.6892 +v -1 0.4179 -0.7517 +v -1 1.4804 -0.7424 +v -0.25 1.4804 -0.7424 +v -0.25 1.4798 -0.6799 +v -1 1.4798 -0.6799 +v 0.5 1.6662 -0.5533 +v 0.5 1.6673 -0.6783 +v 0.5 0.4163 -0.5642 +v 0.5 0.4174 -0.6892 +v 0.375 1.6662 -0.5533 +v 0.375 1.6673 -0.6783 +v 0.375 0.4163 -0.5642 +v 0.375 0.4174 -0.6892 +v 1 1.6673 -0.6783 +v 1 1.6679 -0.7408 +v 1.125 0.4174 -0.6892 +v 1.125 0.4179 -0.7517 +v 0.375 1.6673 -0.6783 +v 0.375 1.6679 -0.7408 +v 0.375 0.4174 -0.6892 +v 0.375 0.4179 -0.7517 +v 0.375 1.4804 -0.7424 +v 1.125 1.4804 -0.7424 +v 1.125 1.4798 -0.6799 +v 0.375 1.4798 -0.6799 +v 1.0625 1.2939 -0.621 +v 1.0625 1.2944 -0.6835 +v 1.0625 0.9189 -0.6242 +v 1.0625 0.9194 -0.6867 +v 0.5 1.2939 -0.621 +v 0.5 1.2944 -0.6835 +v 0.5 0.9189 -0.6242 +v 0.5 0.9194 -0.6867 +vt 0.4688 0.4688 +vt 0.4688 0.5313 +vt 0.4531 0.5313 +vt 0.4531 0.4688 +vt 0.3125 0.4688 +vt 0.3125 0.5313 +vt 0.2344 0.5313 +vt 0.2344 0.4688 +vt 0.4844 0.5938 +vt 0.4844 0.6094 +vt 0.4219 0.6094 +vt 0.4219 0.5313 +vt 0.4531 0.6094 +vt 0.4531 0.5938 +vt 0.5156 0.5313 +vt 0.5156 0.6094 +vt 0.604 0.4688 +vt 0.604 0.5313 +vt 0.5156 0.5313 +vt 0.5156 0.4688 +vt 0.3906 0.4688 +vt 0.3906 0.5313 +vt 0.3281 0.5313 +vt 0.3281 0.4688 +vt 0.1875 0.0625 +vt 0.1875 0 +vt 0.0156 0 +vt 0.0156 0.0625 +vt 0.0156 0.0625 +vt 0.0156 0 +vt 0.1875 0 +vt 0.1875 0.0625 +vt 0 0.125 +vt 0.1719 0.125 +vt 0.1719 0.0625 +vt 0 0.0625 +vt 0.1719 0.125 +vt 0 0.125 +vt 0 0.0625 +vt 0.1719 0.0625 +vt 0.4219 0.5313 +vt 0.4219 0.5938 +vt 0.2969 0.5938 +vt 0.2969 0.5313 +vt 0.4219 0.5938 +vt 0.4219 0.5313 +vt 0.2969 0.5313 +vt 0.2969 0.5938 +vt 0.4844 0.4688 +vt 0.4844 0.5313 +vt 0.6094 0.5313 +vt 0.6094 0.4688 +vt 0.2969 0.4688 +vt 0.2969 0.5313 +vt 0.4219 0.5313 +vt 0.4219 0.4688 +vt 0.4688 0.4688 +vt 0.4688 0.5313 +vt 0.4531 0.5313 +vt 0.4531 0.4688 +vt 0.3125 0.4688 +vt 0.3125 0.5313 +vt 0.2344 0.5313 +vt 0.2344 0.4688 +vt 0.4844 0.5938 +vt 0.4844 0.6094 +vt 0.4219 0.6094 +vt 0.4219 0.5313 +vt 0.4844 0.6094 +vt 0.4844 0.5938 +vt 0.4219 0.5313 +vt 0.4219 0.6094 +vt 0.604 0.4688 +vt 0.604 0.5313 +vt 0.5156 0.5313 +vt 0.5156 0.4688 +vt 0.3906 0.4688 +vt 0.3906 0.5313 +vt 0.3281 0.5313 +vt 0.3281 0.4688 +vt 0.1875 0.0625 +vt 0.1875 0 +vt 0.0156 0 +vt 0.0156 0.0625 +vt 0.0156 0.0625 +vt 0.0156 0 +vt 0.1875 0 +vt 0.1875 0.0625 +vt 0 0.125 +vt 0.1719 0.125 +vt 0.1719 0.0625 +vt 0 0.0625 +vt 0.1719 0.125 +vt 0 0.125 +vt 0 0.0625 +vt 0.1719 0.0625 +vt 0.2188 0.125 +vt 0.2188 0.1875 +vt 0.1563 0.1875 +vt 0.1563 0.125 +vt 0 0.125 +vt 0 0.1875 +vt 0.0625 0.1875 +vt 0.0625 0.125 +vt 0.1563 0.25 +vt 0.1563 0.1875 +vt 0.0625 0.1875 +vt 0.0625 0.25 +vt 0.25 0.25 +vt 0.25 0.1875 +vt 0.1563 0.1875 +vt 0.1563 0.25 +vt 0.2188 0.125 +vt 0.2188 0.1875 +vt 0.3125 0.1875 +vt 0.3125 0.125 +vt 0.0625 0.125 +vt 0.0625 0.1875 +vt 0.1563 0.1875 +vt 0.1563 0.125 +vt 0.25 0 +vt 0.25 0.0625 +vt 0.2813 0.0625 +vt 0.2813 0 +vt 0.3125 0 +vt 0.3125 0.0625 +vt 0.2813 0.0625 +vt 0.2813 0 +vt 0.2813 0.0938 +vt 0.2813 0.0625 +vt 0.3125 0.0625 +vt 0.3125 0.0938 +vt 0.2813 0.0625 +vt 0.2813 0.0938 +vt 0.3125 0.0938 +vt 0.3125 0.0625 +vt 0.2813 0 +vt 0.2813 0.0625 +vt 0.3125 0.0625 +vt 0.3125 0 +vt 0.2813 0 +vt 0.2813 0.0625 +vt 0.25 0.0625 +vt 0.25 0 +vt 0.3125 0.0938 +vt 0.3125 0.0625 +vt 0.2813 0.0625 +vt 0.2813 0.0938 +vt 0.3125 0.0625 +vt 0.3125 0.0938 +vt 0.2813 0.0938 +vt 0.2813 0.0625 +vt 0.4063 0 +vt 0.4063 0.0625 +vt 0.4375 0.0625 +vt 0.4375 0 +vt 0.4375 0 +vt 0.4375 0.0625 +vt 0.4063 0.0625 +vt 0.4063 0 +vt 0.5 0.0625 +vt 0.5 0.0938 +vt 0.4063 0.0938 +vt 0.4063 0.0625 +vt 0.5 0.0938 +vt 0.5 0.0625 +vt 0.4063 0.0625 +vt 0.4063 0.0938 +vt 0.4375 0 +vt 0.4375 0.0625 +vt 0.5313 0.0625 +vt 0.5313 0 +vt 0.3125 0 +vt 0.3125 0.0625 +vt 0.4063 0.0625 +vt 0.4063 0 +vt 0.25 0.9063 +vt 0.25 1 +vt 0.3125 1 +vt 0.3125 0.9063 +vt 0.25 0.9063 +vt 0.25 1 +vt 0.3125 1 +vt 0.3125 0.9063 +vt 0.8125 1 +vt 0.8125 0.9375 +vt 0.5625 0.9375 +vt 0.5625 1 +vt 0.5625 0.9375 +vt 0.5625 1 +vt 0.8125 1 +vt 0.8125 0.9375 +vt 0.3125 0.9063 +vt 0.3125 1 +vt 0.5625 1 +vt 0.5625 0.9063 +vt 0.3125 0.9063 +vt 0.3125 1 +vt 0.5625 1 +vt 0.5625 0.9063 +vt 0.0781 0.9844 +vt 0.0781 0.9531 +vt 0.0625 0.9531 +vt 0.0625 0.9844 +vt 0.0781 0.9531 +vt 0.0781 0.9844 +vt 0.0625 0.9844 +vt 0.0625 0.9531 +vt 0.0469 0.9531 +vt 0.0469 0.9844 +vt 0.0625 0.9844 +vt 0.0625 0.9531 +vt 0.0469 0.9844 +vt 0.0469 0.9531 +vt 0.0625 0.9531 +vt 0.0625 0.9844 +vt 0.0781 0.9844 +vt 0.0781 0.9531 +vt 0.0625 0.9531 +vt 0.0625 0.9844 +vt 0.0781 0.9531 +vt 0.0781 0.9844 +vt 0.0625 0.9844 +vt 0.0625 0.9531 +vt 0.0469 0.9531 +vt 0.0469 0.9844 +vt 0.0625 0.9844 +vt 0.0625 0.9531 +vt 0.0469 0.9844 +vt 0.0469 0.9531 +vt 0.0625 0.9531 +vt 0.0625 0.9844 +vt 0.0313 0.2969 +vt 0.0313 0.2656 +vt 0.3125 0.2656 +vt 0.3125 0.2969 +vt 0.0313 0.2969 +vt 0.0313 0.2656 +vt 0.3125 0.2656 +vt 0.3125 0.2969 +vt 0.0313 0.2656 +vt 0.0313 0.2969 +vt 0.3125 0.2969 +vt 0.3125 0.2656 +vt 0.3125 0.2969 +vt 0.3125 0.2656 +vt 0.0313 0.2656 +vt 0.0313 0.2969 +vt 0.2188 0.4531 +vt 0.2188 0.3594 +vt 0.3125 0.3594 +vt 0.3125 0.4531 +vt 0.2344 0.3594 +vt 0.2344 0.4531 +vt 0.2188 0.4531 +vt 0.2188 0.3594 +vt 0.3125 0.4531 +vt 0.3125 0.3594 +vt 0.2969 0.3594 +vt 0.2969 0.4531 +vt 0.2188 0.4531 +vt 0.2188 0.3594 +vt 0.2344 0.3594 +vt 0.2344 0.4531 +vt 0.2969 0.4531 +vt 0.2969 0.3594 +vt 0.3125 0.3594 +vt 0.3125 0.4531 +vt 0.3125 0.4531 +vt 0.3125 0.3594 +vt 0.2188 0.3594 +vt 0.2188 0.4531 +vt 0.2344 0.3594 +vt 0.2344 0.4531 +vt 0.2188 0.4531 +vt 0.2188 0.3594 +vt 0.3125 0.4531 +vt 0.3125 0.3594 +vt 0.2969 0.3594 +vt 0.2969 0.4531 +vt 0.2188 0.4531 +vt 0.2188 0.3594 +vt 0.2344 0.3594 +vt 0.2344 0.4531 +vt 0.2969 0.4531 +vt 0.2969 0.3594 +vt 0.3125 0.3594 +vt 0.3125 0.4531 +vt 0.6547 0.8906 +vt 0.5938 0.8906 +vt 0.5938 0.7969 +vt 0.6563 0.7969 +vt 0.6563 0.7969 +vt 0.6563 0.8906 +vt 0.5953 0.8906 +vt 0.5938 0.7969 +vt 0.6563 0.8906 +vt 0.6563 0.9219 +vt 0.5938 0.9219 +vt 0.5938 0.8906 +vt 0.5938 0.7969 +vt 0.5938 0.8906 +vt 0.5625 0.8906 +vt 0.5625 0.7969 +vt 0.6547 0.8906 +vt 0.5938 0.8906 +vt 0.5938 0.7969 +vt 0.6563 0.7969 +vt 0.6563 0.7969 +vt 0.6563 0.8906 +vt 0.5953 0.8906 +vt 0.5938 0.7969 +vt 0.6563 0.8906 +vt 0.6563 0.9219 +vt 0.5938 0.9219 +vt 0.5938 0.8906 +vt 0.5938 0.7969 +vt 0.5938 0.8906 +vt 0.5625 0.8906 +vt 0.5625 0.7969 +vt 0.1094 0.9219 +vt 0.0313 0.9217 +vt 0.0313 0.8594 +vt 0.1094 0.8595 +vt 0.0469 0.9217 +vt 0.125 0.9219 +vt 0.125 0.8595 +vt 0.0469 0.8594 +vt 0.1563 0.8594 +vt 0.1563 0.8906 +vt 0.2344 0.8906 +vt 0.2344 0.8594 +vt 0.2344 0.9219 +vt 0.2344 0.8906 +vt 0.1563 0.8906 +vt 0.1563 0.9219 +vt 0.25 0.9219 +vt 0.2188 0.9219 +vt 0.2188 0.8594 +vt 0.25 0.8594 +vt 0.0313 0.8594 +vt 0.0313 0.9217 +vt 0.1094 0.9219 +vt 0.1094 0.8595 +vt 0.125 0.8595 +vt 0.125 0.9219 +vt 0.0469 0.9217 +vt 0.0469 0.8594 +vt 0.2344 0.8906 +vt 0.1563 0.8906 +vt 0.1563 0.8594 +vt 0.2344 0.8594 +vt 0.1563 0.8906 +vt 0.2344 0.8906 +vt 0.2344 0.9219 +vt 0.1563 0.9219 +vt 0.2188 0.8594 +vt 0.2188 0.9219 +vt 0.25 0.9219 +vt 0.25 0.8594 +vt 0.3125 0.125 +vt 0.3125 0.4375 +vt 0.3438 0.4375 +vt 0.3438 0.125 +vt 0.3125 0.125 +vt 0.3125 0.4375 +vt 0.3438 0.4375 +vt 0.3438 0.125 +vt 0.3125 0.4688 +vt 0.3125 0.4375 +vt 0.3438 0.4375 +vt 0.3438 0.4688 +vt 0.3438 0.4688 +vt 0.3438 0.4375 +vt 0.3125 0.4375 +vt 0.3125 0.4688 +vt 0.3438 0.125 +vt 0.3438 0.4375 +vt 0.3125 0.4375 +vt 0.3125 0.125 +vt 0.3594 0.4688 +vt 0.3594 0.4219 +vt 0.3438 0.4219 +vt 0.3438 0.4688 +vt 0.5313 0.4688 +vt 0.5313 0.4219 +vt 0.5156 0.4219 +vt 0.5156 0.4688 +vt 0.3438 0.4688 +vt 0.3438 0.4531 +vt 0.5313 0.4531 +vt 0.5313 0.4688 +vt 0.3438 0.1563 +vt 0.3438 0.1719 +vt 0.5313 0.1719 +vt 0.5313 0.1563 +vt 0.375 0.4688 +vt 0.3438 0.4219 +vt 0.5313 0.4219 +vt 0.5313 0.4688 +vt 0.3438 0.4688 +vt 0.3438 0.4219 +vt 0.5313 0.4219 +vt 0.5 0.4688 +vt 0.5313 0.1563 +vt 0.5313 0.4219 +vt 0.3438 0.4219 +vt 0.3438 0.1563 +vt 0.3438 0.1563 +vt 0.3438 0.4219 +vt 0.3594 0.4219 +vt 0.3594 0.1563 +vt 0.3438 0.1563 +vt 0.3438 0.4219 +vt 0.5313 0.4219 +vt 0.5313 0.1563 +vt 0.5156 0.1563 +vt 0.5156 0.4219 +vt 0.5313 0.4219 +vt 0.5313 0.1563 +vt 0.3125 0.125 +vt 0.3125 0.4375 +vt 0.3438 0.4375 +vt 0.3438 0.125 +vt 0.3125 0.125 +vt 0.3125 0.4375 +vt 0.3438 0.4375 +vt 0.3438 0.125 +vt 0.3125 0.4688 +vt 0.3125 0.4375 +vt 0.3438 0.4375 +vt 0.3438 0.4688 +vt 0.3438 0.4688 +vt 0.3438 0.4375 +vt 0.3125 0.4375 +vt 0.3125 0.4688 +vt 0.3438 0.125 +vt 0.3438 0.4375 +vt 0.3125 0.4375 +vt 0.3125 0.125 +vt 0.3594 0.4688 +vt 0.3594 0.4219 +vt 0.3438 0.4219 +vt 0.3438 0.4688 +vt 0.5313 0.4688 +vt 0.5313 0.4219 +vt 0.5156 0.4219 +vt 0.5156 0.4688 +vt 0.3438 0.4688 +vt 0.3438 0.4531 +vt 0.5313 0.4531 +vt 0.5313 0.4688 +vt 0.3438 0.1563 +vt 0.3438 0.1719 +vt 0.5313 0.1719 +vt 0.5313 0.1563 +vt 0.5313 0.4688 +vt 0.5313 0.4219 +vt 0.3438 0.4219 +vt 0.375 0.4688 +vt 0.375 0.4688 +vt 0.3438 0.4219 +vt 0.5313 0.4219 +vt 0.5313 0.4688 +vt 0.5313 0.1563 +vt 0.5313 0.4219 +vt 0.3438 0.4219 +vt 0.3438 0.1563 +vt 0.3438 0.1563 +vt 0.3438 0.4219 +vt 0.3594 0.4219 +vt 0.3594 0.1563 +vt 0.3438 0.1563 +vt 0.3438 0.4219 +vt 0.5313 0.4219 +vt 0.5313 0.1563 +vt 0.5156 0.1563 +vt 0.5156 0.4219 +vt 0.5313 0.4219 +vt 0.5313 0.1563 +vt 0 0.7656 +vt 0 0.8594 +vt 0.0156 0.8594 +vt 0.0156 0.7656 +vt 0 0.7656 +vt 0 0.8594 +vt 0.0156 0.8594 +vt 0.0156 0.7656 +vt 0.1406 0.8594 +vt 0.1406 0.8438 +vt 0 0.8438 +vt 0 0.8594 +vt 0.1406 0.8438 +vt 0.1406 0.8594 +vt 0 0.8594 +vt 0 0.8438 +vt 0 0.7656 +vt 0 0.8594 +vt 0.1406 0.8594 +vt 0.1406 0.7656 +vn -1 0 0 +vn 1 0 0 +vn 0 -1 0 +vn 0 1 0 +vn -0.71 0 0.71 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0.71 0 0.71 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 0.98 -0.17 +vn 0 -0.98 0.17 +vn 0 0.17 0.98 +vn 0 -0.17 -0.98 +vn 0 0.98 -0.17 +vn 0 -0.98 0.17 +vn 0 0.17 0.98 +vn 0 -0.17 -0.98 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0.01 +vn 0 -1 -0.01 +vn 0 -0.01 1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0.01 +vn 0 -1 -0.01 +vn 0 -0.01 1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0.01 +vn 0 -1 -0.01 +vn 0 -0.01 1 +vn 1 0 0 +vn -0.83 0.55 0 +vn 0 1 0.01 +vn 0 -1 -0.01 +vn 0 -0.01 1 +vn 0 0.01 -1 +vn 0 0.01 -1 +vn 1 0 0 +vn 0 -0.01 1 +vn -1 0 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0.01 +vn 0 -1 -0.01 +vn 0 -0.01 1 +vn 0.83 0.55 0 +vn -1 0 0 +vn 0 1 0.01 +vn 0 -1 -0.01 +vn 0 -0.01 1 +vn 0 0.01 -1 +vn 0 0.01 -1 +vn 1 0 0 +vn 0 -0.01 1 +vn -1 0 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0.01 +vn 0 -1 -0.01 +vn 0 -0.01 1 +usemtl field_howitzer_paint +f 4/1/1 2/2/1 1/3/1 3/4/1 +f 7/5/2 5/6/2 6/7/2 8/8/2 +f 1/9/3 2/10/3 6/11/3 5/12/3 +f 4/13/4 3/14/4 7/15/4 8/16/4 +f 3/17/5 1/18/5 5/19/5 7/20/5 +f 8/21/6 6/22/6 2/23/6 4/24/6 +f 12/25/7 10/26/7 9/27/7 11/28/7 +f 15/29/8 13/30/8 14/31/8 16/32/8 +f 9/33/9 10/34/9 14/35/9 13/36/9 +f 12/37/10 11/38/10 15/39/10 16/40/10 +f 17/41/11 18/42/11 22/43/11 21/44/11 +f 20/45/12 19/46/12 23/47/12 24/48/12 +f 19/49/13 17/50/13 21/51/13 23/52/13 +f 24/53/14 22/54/14 18/55/14 20/56/14 +f 28/57/15 26/58/15 25/59/15 27/60/15 +f 31/61/16 29/62/16 30/63/16 32/64/16 +f 25/65/17 26/66/17 30/67/17 29/68/17 +f 28/69/18 27/70/18 31/71/18 32/72/18 +f 27/73/19 25/74/19 29/75/19 31/76/19 +f 32/77/20 30/78/20 26/79/20 28/80/20 +f 36/81/21 34/82/21 33/83/21 35/84/21 +f 39/85/22 37/86/22 38/87/22 40/88/22 +f 33/89/23 34/90/23 38/91/23 37/92/23 +f 36/93/24 35/94/24 39/95/24 40/96/24 +f 44/97/25 42/98/25 41/99/25 43/100/25 +f 47/101/26 45/102/26 46/103/26 48/104/26 +f 41/105/27 42/106/27 46/107/27 45/108/27 +f 44/109/28 43/110/28 47/111/28 48/112/28 +f 43/113/29 41/114/29 45/115/29 47/116/29 +f 48/117/30 46/118/30 42/119/30 44/120/30 +f 52/121/31 50/122/31 49/123/31 51/124/31 +f 55/125/32 53/126/32 54/127/32 56/128/32 +f 49/129/33 50/130/33 54/131/33 53/132/33 +f 52/133/34 51/134/34 55/135/34 56/136/34 +f 60/137/35 58/138/35 57/139/35 59/140/35 +f 63/141/36 61/142/36 62/143/36 64/144/36 +f 57/145/37 58/146/37 62/147/37 61/148/37 +f 60/149/38 59/150/38 63/151/38 64/152/38 +f 68/153/39 66/154/39 65/155/39 67/156/39 +f 71/157/40 69/158/40 70/159/40 72/160/40 +f 65/161/41 66/162/41 70/163/41 69/164/41 +f 68/165/42 67/166/42 71/167/42 72/168/42 +f 67/169/43 65/170/43 69/171/43 71/172/43 +f 72/173/44 70/174/44 66/175/44 68/176/44 +usemtl field_howitzer +f 76/177/45 74/178/45 73/179/45 75/180/45 +f 79/181/46 77/182/46 78/183/46 80/184/46 +f 73/185/47 74/186/47 78/187/47 77/188/47 +f 76/189/48 75/190/48 79/191/48 80/192/48 +f 75/193/49 73/194/49 77/195/49 79/196/49 +f 80/197/50 78/198/50 74/199/50 76/200/50 +f 81/201/51 82/202/51 86/203/51 85/204/51 +f 84/205/52 83/206/52 87/207/52 88/208/52 +f 83/209/53 81/210/53 85/211/53 87/212/53 +f 88/213/54 86/214/54 82/215/54 84/216/54 +f 89/217/55 90/218/55 94/219/55 93/220/55 +f 92/221/56 91/222/56 95/223/56 96/224/56 +f 91/225/57 89/226/57 93/227/57 95/228/57 +f 96/229/58 94/230/58 90/231/58 92/232/58 +f 97/233/59 98/234/59 102/235/59 101/236/59 +f 100/237/60 99/238/60 103/239/60 104/240/60 +f 99/241/61 97/242/61 101/243/61 103/244/61 +f 104/245/62 102/246/62 98/247/62 100/248/62 +f 111/249/63 109/250/63 110/251/63 112/252/63 +f 105/253/64 106/254/64 110/255/64 109/256/64 +f 108/257/65 107/258/65 111/259/65 112/260/65 +f 107/261/66 105/262/66 109/263/66 111/264/66 +f 112/265/67 110/266/67 106/267/67 108/268/67 +f 116/269/68 114/270/68 113/271/68 115/272/68 +f 113/273/69 114/274/69 118/275/69 117/276/69 +f 116/277/70 115/278/70 119/279/70 120/280/70 +f 115/281/71 113/282/71 117/283/71 119/284/71 +f 120/285/72 118/286/72 114/287/72 116/288/72 +f 122/289/73 121/290/73 123/291/73 124/292/73 +f 127/293/74 125/294/74 126/295/74 128/296/74 +f 125/297/75 121/298/75 122/299/75 126/300/75 +f 123/301/76 121/302/76 125/303/76 127/304/76 +f 130/305/77 129/306/77 131/307/77 132/308/77 +f 135/309/78 133/310/78 134/311/78 136/312/78 +f 133/313/79 129/314/79 130/315/79 134/316/79 +f 131/317/80 129/318/80 133/319/80 135/320/80 +f 137/321/81 138/322/81 140/323/81 139/324/81 +f 142/325/82 141/326/82 143/327/82 144/328/82 +f 142/329/83 138/330/83 137/331/83 141/332/83 +f 143/333/84 139/334/84 140/335/84 144/336/84 +f 141/337/85 137/338/85 139/339/85 143/340/85 +f 148/341/86 146/342/86 145/343/86 147/344/86 +f 151/345/87 149/346/87 150/347/87 152/348/87 +f 145/349/88 146/350/88 150/351/88 149/352/88 +f 148/353/89 147/354/89 151/355/89 152/356/89 +f 147/357/90 145/358/90 149/359/90 151/360/90 +usemtl field_howitzer_paint +f 156/361/91 154/362/91 153/363/91 155/364/91 +f 159/365/92 157/366/92 158/367/92 160/368/92 +f 153/369/93 154/370/93 158/371/93 157/372/93 +f 156/373/94 155/374/94 159/375/94 160/376/94 +f 155/377/95 153/378/95 157/379/95 159/380/95 +f 161/381/96 171/382/96 170/383/96 162/384/96 +f 166/385/97 169/386/97 172/387/97 165/388/97 +f 161/389/98 162/390/98 166/391/98 165/392/98 +f 164/393/99 163/394/99 167/395/99 168/396/99 +f 165/397/100 172/398/100 171/399/100 161/400/100 +f 162/401/101 170/402/101 169/403/101 166/404/101 +f 168/405/102 169/406/102 170/407/102 164/408/102 +f 164/409/103 170/410/103 171/411/103 163/412/103 +f 163/413/104 171/414/104 172/415/104 167/416/104 +f 167/417/105 172/418/105 169/419/105 168/420/105 +f 176/421/106 174/422/106 173/423/106 175/424/106 +f 179/425/107 177/426/107 178/427/107 180/428/107 +f 173/429/108 174/430/108 178/431/108 177/432/108 +f 176/433/109 175/434/109 179/435/109 180/436/109 +f 175/437/110 173/438/110 177/439/110 179/440/110 +f 181/441/111 191/442/111 190/443/111 182/444/111 +f 186/445/112 189/446/112 192/447/112 185/448/112 +f 181/449/113 182/450/113 186/451/113 185/452/113 +f 184/453/114 183/454/114 187/455/114 188/456/114 +f 185/457/115 192/458/115 191/459/115 181/460/115 +f 182/461/116 190/462/116 189/463/116 186/464/116 +f 188/465/117 189/466/117 190/467/117 184/468/117 +f 184/469/118 190/470/118 191/471/118 183/472/118 +f 183/473/119 191/474/119 192/475/119 187/476/119 +f 187/477/120 192/478/120 189/479/120 188/480/120 +usemtl field_howitzer +f 196/481/121 194/482/121 193/483/121 195/484/121 +f 199/485/122 197/486/122 198/487/122 200/488/122 +f 193/489/123 194/490/123 198/491/123 197/492/123 +f 196/493/124 195/494/124 199/495/124 200/496/124 +f 195/497/125 193/498/125 197/499/125 199/500/125 +o howi +v 0.25 1.3757 -0.7532 +v 0.25 1.3757 -1.2532 +v 0.25 1.3132 -0.7532 +v 0.25 1.3132 -1.2532 +v -0.125 1.3757 -0.7532 +v -0.125 1.3757 -1.2532 +v -0.125 1.3132 -0.7532 +v -0.125 1.3132 -1.2532 +v 0.3125 1.3757 -0.1282 +v 0.3125 1.3757 -1.2532 +v 0.3125 0.9382 -0.1282 +v 0.3125 0.9382 -1.2532 +v 0.25 1.3757 -0.1282 +v 0.25 1.3757 -1.2532 +v 0.25 0.9382 -0.1282 +v 0.25 0.9382 -1.2532 +v 0.3125 1.3757 -0.6907 +v 0.3125 0.9382 -0.6907 +v 0.25 0.9382 -0.6907 +v 0.25 1.3757 -0.6907 +v 0.3125 0.9382 -0.1282 +v 0.3125 0.9382 -1.2532 +v 0.3125 0.8757 -0.1282 +v 0.3125 0.8757 -1.2532 +v -0.1875 0.9382 -0.1282 +v -0.1875 0.9382 -1.2532 +v -0.1875 0.8757 -0.1282 +v -0.1875 0.8757 -1.2532 +v 0.3125 0.8757 -0.6907 +v -0.1875 0.8757 -0.6907 +v -0.1875 0.9382 -0.6907 +v 0.3125 0.9382 -0.6907 +v -0.125 1.3757 -0.1282 +v -0.125 1.3757 -1.2532 +v -0.125 0.9382 -0.1282 +v -0.125 0.9382 -1.2532 +v -0.1875 1.3757 -0.1282 +v -0.1875 1.3757 -1.2532 +v -0.1875 0.9382 -0.1282 +v -0.1875 0.9382 -1.2532 +v -0.125 1.3757 -0.6907 +v -0.125 0.9382 -0.6907 +v -0.1875 0.9382 -0.6907 +v -0.1875 1.3757 -0.6907 +v 0.1875 0.875 -0.0625 +v 0.1875 0.875 -1.3125 +v 0.1875 0.75 -0.0625 +v 0.1875 0.75 -1.3125 +v -0.0625 0.875 -0.0625 +v -0.0625 0.875 -1.3125 +v -0.0625 0.75 -0.0625 +v -0.0625 0.75 -1.3125 +vt 0.5313 0.7344 +vt 0.6563 0.7344 +vt 0.6563 0.6406 +vt 0.5313 0.6406 +vt 0.6563 0.7188 +vt 0.5313 0.7188 +vt 0.5313 0.625 +vt 0.6563 0.625 +vt 0.8281 0.4375 +vt 0.8125 0.4375 +vt 0.8125 0.3438 +vt 0.8281 0.3438 +vt 0.6719 0.625 +vt 0.6563 0.625 +vt 0.6563 0.7188 +vt 0.6719 0.7188 +vt 0.5156 0.6406 +vt 0.6563 0.6406 +vt 0.6563 0.75 +vt 0.5156 0.75 +vt 0.875 0.4688 +vt 0.7344 0.4688 +vt 0.7344 0.3594 +vt 0.875 0.3594 +vt 0.6719 0.75 +vt 0.5313 0.75 +vt 0.5313 0.7344 +vt 0.6719 0.7344 +vt 0.625 0.6406 +vt 0.625 0.75 +vt 0.6094 0.75 +vt 0.6094 0.6406 +vt 0.6406 0.6406 +vt 0.6406 0.75 +vt 0.625 0.75 +vt 0.625 0.6406 +vt 0.6719 0.75 +vt 0.5313 0.75 +vt 0.5313 0.6406 +vt 0.6719 0.6406 +vt 0.7188 0.3438 +vt 0.8594 0.3438 +vt 0.8594 0.4531 +vt 0.7188 0.4531 +vt 0.5156 0.7344 +vt 0.6563 0.7344 +vt 0.6563 0.75 +vt 0.5156 0.75 +vt 0.5156 0.625 +vt 0.6563 0.625 +vt 0.6563 0.6406 +vt 0.5156 0.6406 +vt 0.6563 0.75 +vt 0.5156 0.75 +vt 0.5156 0.7344 +vt 0.6563 0.7344 +vt 0.8594 0.3438 +vt 0.7188 0.3438 +vt 0.7188 0.4688 +vt 0.8594 0.4688 +vt 0.6563 0.75 +vt 0.5156 0.75 +vt 0.5156 0.625 +vt 0.6563 0.625 +vt 0.6094 0.625 +vt 0.5938 0.625 +vt 0.5938 0.75 +vt 0.6094 0.75 +vt 0.5938 0.75 +vt 0.5781 0.75 +vt 0.5781 0.625 +vt 0.5938 0.625 +vt 0.6563 0.625 +vt 0.5156 0.625 +vt 0.5156 0.75 +vt 0.6563 0.75 +vt 0.5313 0.7344 +vt 0.6719 0.7344 +vt 0.6719 0.75 +vt 0.5313 0.75 +vt 0.7188 0.4688 +vt 0.8594 0.4688 +vt 0.8594 0.3438 +vt 0.7188 0.3438 +vt 0.6719 0.6406 +vt 0.5313 0.6406 +vt 0.5313 0.625 +vt 0.6719 0.625 +vt 0.7188 0.4531 +vt 0.8594 0.4531 +vt 0.8594 0.3438 +vt 0.7188 0.3438 +vt 0.6719 0.625 +vt 0.5313 0.625 +vt 0.5313 0.7344 +vt 0.6719 0.7344 +vt 0.6719 0.6406 +vt 0.5313 0.6406 +vt 0.5313 0.625 +vt 0.6719 0.625 +vt 0.625 0.75 +vt 0.625 0.6406 +vt 0.6094 0.6406 +vt 0.6094 0.75 +vt 0.6406 0.75 +vt 0.6406 0.6406 +vt 0.625 0.6406 +vt 0.625 0.75 +vt 0.875 0.3438 +vt 0.7344 0.3438 +vt 0.7344 0.4531 +vt 0.875 0.4531 +vt 0.5313 0.7344 +vt 0.6719 0.7344 +vt 0.6719 0.625 +vt 0.5313 0.625 +vt 0.5156 0.625 +vt 0.6563 0.625 +vt 0.6563 0.6406 +vt 0.5156 0.6406 +vt 0.5625 0.4688 +vt 0.5313 0.4688 +vt 0.5313 0.1563 +vt 0.5625 0.1563 +vt 0.7188 0.1563 +vt 0.6875 0.1563 +vt 0.6875 0.4688 +vt 0.7188 0.4688 +vt 0.625 0.4688 +vt 0.625 0.1563 +vt 0.5625 0.1563 +vt 0.5625 0.4688 +vt 0.6875 0.1563 +vt 0.6875 0.4688 +vt 0.625 0.4688 +vt 0.625 0.1563 +vt 0.6875 0.125 +vt 0.6875 0.1563 +vt 0.625 0.1563 +vt 0.625 0.125 +vt 0.625 0.125 +vt 0.625 0.1563 +vt 0.6875 0.1563 +vt 0.6875 0.125 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 -1 0 +vn -1 0 0 +vn 0 1 0 +vn 1 0 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +usemtl field_howitzer +f 201/501/126 202/502/126 206/503/126 205/504/126 +f 204/505/127 203/506/127 207/507/127 208/508/127 +f 203/509/128 201/510/128 205/511/128 207/512/128 +f 208/513/129 206/514/129 202/515/129 204/516/129 +f 211/517/130 218/518/130 217/519/130 209/520/130 +f 213/521/131 220/522/131 219/523/131 215/524/131 +f 209/525/132 217/526/132 220/527/132 213/528/132 +f 211/529/133 209/530/133 213/531/133 215/532/133 +f 216/533/134 214/534/134 210/535/134 212/536/134 +f 210/537/135 217/538/135 218/539/135 212/540/135 +f 216/541/136 219/542/136 220/543/136 214/544/136 +f 214/545/137 220/546/137 217/547/137 210/548/137 +f 223/549/138 229/550/138 232/551/138 221/552/138 +f 225/553/139 231/554/139 230/555/139 227/556/139 +f 221/557/140 232/558/140 231/559/140 225/560/140 +f 227/561/141 230/562/141 229/563/141 223/564/141 +f 223/565/142 221/566/142 225/567/142 227/568/142 +f 228/569/143 226/570/143 222/571/143 224/572/143 +f 224/573/144 229/574/144 230/575/144 228/576/144 +f 228/577/145 230/578/145 231/579/145 226/580/145 +f 226/581/146 231/582/146 232/583/146 222/584/146 +f 222/585/147 232/586/147 229/587/147 224/588/147 +f 235/589/148 242/590/148 241/591/148 233/592/148 +f 237/593/149 244/594/149 243/595/149 239/596/149 +f 233/597/150 241/598/150 244/599/150 237/600/150 +f 235/601/151 233/602/151 237/603/151 239/604/151 +f 240/605/152 238/606/152 234/607/152 236/608/152 +f 234/609/153 241/610/153 242/611/153 236/612/153 +f 240/613/154 243/614/154 244/615/154 238/616/154 +f 238/617/155 244/618/155 241/619/155 234/620/155 +f 248/621/156 246/622/156 245/623/156 247/624/156 +f 251/625/157 249/626/157 250/627/157 252/628/157 +f 245/629/158 246/630/158 250/631/158 249/632/158 +f 248/633/159 247/634/159 251/635/159 252/636/159 +f 247/637/160 245/638/160 249/639/160 251/640/160 +f 252/641/161 250/642/161 246/643/161 248/644/161 +o breech +v 0.25 1.3757 -0.1282 +v 0.25 1.3757 -0.7532 +v 0.25 1.3132 -0.1282 +v 0.25 1.3132 -0.7532 +v -0.125 1.3757 -0.1282 +v -0.125 1.3757 -0.7532 +v -0.125 1.3132 -0.1282 +v -0.125 1.3132 -0.7532 +vt 0.9688 0.625 +vt 0.9531 0.625 +vt 0.9531 0.4688 +vt 0.9688 0.4688 +vt 0.875 0.4688 +vt 0.8906 0.4688 +vt 0.8906 0.625 +vt 0.875 0.625 +vt 0.4063 0.7813 +vt 0.4063 0.625 +vt 0.3125 0.625 +vt 0.3125 0.7813 +vt 0.9688 0.4688 +vt 0.9688 0.625 +vt 0.875 0.625 +vt 0.875 0.4688 +vt 0.9688 0.625 +vt 0.9688 0.6094 +vt 0.875 0.6094 +vt 0.875 0.625 +vt 0.875 0.4688 +vt 0.875 0.4844 +vt 0.9688 0.4844 +vt 0.9688 0.4688 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +usemtl field_howitzer +f 256/645/162 254/646/162 253/647/162 255/648/162 +f 259/649/163 257/650/163 258/651/163 260/652/163 +f 253/653/164 254/654/164 258/655/164 257/656/164 +f 256/657/165 255/658/165 259/659/165 260/660/165 +f 255/661/166 253/662/166 257/663/166 259/664/166 +f 260/665/167 258/666/167 254/667/167 256/668/167 +o gun +v 0.25 1.3132 -0.8157 +v 0.25 1.3132 -1.3782 +v 0.25 1.2507 -0.8157 +v 0.25 1.2507 -1.3782 +v -0.125 1.3132 -0.8157 +v -0.125 1.3132 -1.3782 +v -0.125 1.2507 -0.8157 +v -0.125 1.2507 -1.3782 +v 0.25 1.3132 -1.1907 +v -0.125 1.3132 -1.1907 +v -0.125 1.2507 -1.1907 +v 0.25 1.2507 -1.1907 +v 0.25 1.2507 -0.8157 +v 0.25 1.2507 -1.3782 +v 0.25 1.0007 -0.8157 +v 0.25 1.0007 -1.3782 +v 0.1875 1.2507 -0.8157 +v 0.1875 1.2507 -1.3782 +v 0.1875 1.0007 -0.8157 +v 0.1875 1.0007 -1.3782 +v 0.25 1.2507 -1.1907 +v 0.25 1.0007 -1.1907 +v 0.1875 1.0007 -1.1907 +v 0.1875 1.2507 -1.1907 +v -0.125 0.9382 -0.8157 +v -0.125 0.9382 -1.3782 +v -0.125 1.0007 -0.8157 +v -0.125 1.0007 -1.3782 +v 0.25 0.9382 -0.8157 +v 0.25 0.9382 -1.3782 +v 0.25 1.0007 -0.8157 +v 0.25 1.0007 -1.3782 +v -0.125 0.9382 -1.1907 +v 0.25 0.9382 -1.1907 +v 0.25 1.0007 -1.1907 +v -0.125 1.0007 -1.1907 +v -0.125 1.0007 -0.8157 +v -0.125 1.0007 -1.3782 +v -0.125 1.2507 -0.8157 +v -0.125 1.2507 -1.3782 +v -0.0625 1.0007 -0.8157 +v -0.0625 1.0007 -1.3782 +v -0.0625 1.2507 -0.8157 +v -0.0625 1.2507 -1.3782 +v -0.125 1.0007 -1.1907 +v -0.125 1.2507 -1.1907 +v -0.0625 1.2507 -1.1907 +v -0.0625 1.0007 -1.1907 +v 0.25 1.3132 -0.7532 +v 0.25 1.3132 -0.8157 +v 0.25 0.9382 -0.7532 +v 0.25 0.9382 -0.8157 +v -0.125 1.3132 -0.7532 +v -0.125 1.3132 -0.8157 +v -0.125 0.9382 -0.7532 +v -0.125 0.9382 -0.8157 +v 0.3125 1.3757 0.1218 +v 0.3125 1.3757 -0.1282 +v 0.3125 0.8757 0.1218 +v 0.3125 0.8757 -0.1282 +v -0.1875 1.3757 0.1218 +v -0.1875 1.3757 -0.1282 +v -0.1875 0.8757 0.1218 +v -0.1875 0.8757 -0.1282 +v -0.125 1.3132 -1.0032 +v 0.25 1.3132 -1.0032 +v -0.125 0.9382 -1.0032 +v 0.25 0.9382 -1.0032 +vt 0.7031 0.8438 +vt 0.6563 0.8438 +vt 0.6563 0.8281 +vt 0.7031 0.8281 +vt 0.6563 0.75 +vt 0.7031 0.75 +vt 0.7031 0.7656 +vt 0.6563 0.7656 +vt 0.6563 0.75 +vt 0.7031 0.75 +vt 0.7031 0.8438 +vt 0.6563 0.8438 +vt 0.1406 0.5469 +vt 0.0938 0.5469 +vt 0.0938 0.6406 +vt 0.1406 0.6406 +vt 0.7813 0.75 +vt 0.7813 0.7656 +vt 0.6875 0.7656 +vt 0.6875 0.75 +vt 0.7813 0.8281 +vt 0.7813 0.8438 +vt 0.6875 0.8438 +vt 0.6875 0.8281 +vt 0.6719 0.6563 +vt 0.5781 0.6563 +vt 0.5781 0.75 +vt 0.6719 0.75 +vt 0.6719 0.7188 +vt 0.5781 0.7188 +vt 0.5781 0.7031 +vt 0.6719 0.7031 +vt 0 0.6406 +vt 0.0938 0.6406 +vt 0.0938 0.5469 +vt 0 0.5469 +vt 0.5469 0.6563 +vt 0.6406 0.6563 +vt 0.6406 0.6719 +vt 0.5469 0.6719 +vt 0.5469 0.7344 +vt 0.6406 0.7344 +vt 0.6406 0.6719 +vt 0.5469 0.6719 +vt 0.7031 0.7656 +vt 0.7031 0.8281 +vt 0.6875 0.8281 +vt 0.6875 0.7656 +vt 0.7031 0.8281 +vt 0.6563 0.8281 +vt 0.6563 0.7656 +vt 0.7031 0.7656 +vt 0.0781 0.625 +vt 0.125 0.625 +vt 0.125 0.5625 +vt 0.0781 0.5625 +vt 0.7031 0.8438 +vt 0.6563 0.8438 +vt 0.6563 0.8281 +vt 0.7031 0.8281 +vt 0.6563 0.75 +vt 0.7031 0.75 +vt 0.7031 0.7656 +vt 0.6563 0.7656 +vt 0.6563 0.75 +vt 0.7031 0.75 +vt 0.7031 0.8438 +vt 0.6563 0.8438 +vt 0.1406 0.5469 +vt 0.0938 0.5469 +vt 0.0938 0.6406 +vt 0.1406 0.6406 +vt 0.5625 0.6563 +vt 0.5781 0.6563 +vt 0.5781 0.75 +vt 0.5625 0.75 +vt 0.7813 0.8281 +vt 0.7813 0.8438 +vt 0.6875 0.8438 +vt 0.6875 0.8281 +vt 0.6719 0.6563 +vt 0.5781 0.6563 +vt 0.5781 0.75 +vt 0.6719 0.75 +vt 0.6719 0.7188 +vt 0.5781 0.7188 +vt 0.5781 0.7031 +vt 0.6719 0.7031 +vt 0 0.6406 +vt 0.0938 0.6406 +vt 0.0938 0.5469 +vt 0 0.5469 +vt 0.5469 0.6563 +vt 0.6406 0.6563 +vt 0.6406 0.6719 +vt 0.5469 0.6719 +vt 0.5469 0.7344 +vt 0.6406 0.7344 +vt 0.6406 0.6719 +vt 0.5469 0.6719 +vt 0.7031 0.7656 +vt 0.7031 0.8281 +vt 0.6875 0.8281 +vt 0.6875 0.7656 +vt 0.7031 0.8281 +vt 0.6563 0.8281 +vt 0.6563 0.7656 +vt 0.7031 0.7656 +vt 0.0938 0.625 +vt 0.1406 0.625 +vt 0.1406 0.5625 +vt 0.0938 0.5625 +vt 0.7031 0.75 +vt 0.7031 0.8438 +vt 0.6875 0.8438 +vt 0.6875 0.75 +vt 0.7813 0.75 +vt 0.7813 0.8438 +vt 0.7656 0.8438 +vt 0.7656 0.75 +vt 0.9688 0.625 +vt 0.9688 0.7188 +vt 0.875 0.7188 +vt 0.875 0.625 +vt 0.7813 0.8281 +vt 0.7813 0.8438 +vt 0.6875 0.8438 +vt 0.6875 0.8281 +vt 0.375 0.7813 +vt 0.375 0.9063 +vt 0.4375 0.9063 +vt 0.4375 0.7813 +vt 0.4375 0.7813 +vt 0.4375 0.9063 +vt 0.375 0.9063 +vt 0.375 0.7813 +vt 0.4375 0.9063 +vt 0.375 0.9063 +vt 0.375 0.7813 +vt 0.4375 0.7813 +vt 0.375 0.7813 +vt 0.4375 0.7813 +vt 0.4375 0.9063 +vt 0.375 0.9063 +vt 0.4375 0.7813 +vt 0.4375 0.9063 +vt 0.5625 0.9063 +vt 0.5625 0.7813 +vt 0.25 0.7813 +vt 0.25 0.9063 +vt 0.375 0.9063 +vt 0.375 0.7813 +vt 0.6875 0.75 +vt 0.6875 0.8438 +vt 0.7813 0.8438 +vt 0.7813 0.75 +vt 0.0938 0.5625 +vt 0 0.5625 +vt 0 0.625 +vt 0.0938 0.625 +vt 0.6406 0.7188 +vt 0.6406 0.6563 +vt 0.625 0.6563 +vt 0.625 0.7188 +vt 0.0938 0.5625 +vt 0 0.5625 +vt 0 0.625 +vt 0.0938 0.625 +vt 0.7031 0.7656 +vt 0.7031 0.8281 +vt 0.6875 0.8281 +vt 0.6875 0.7656 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 -1 0 +vn 1 0 0 +vn 1 0 0 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn -1 0 0 +vn 1 0 0 +vn 0 -1 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 -1 0 +vn 1 0 0 +vn 0 1 0 +vn -1 0 0 +vn -1 0 0 +vn 0 0 -1 +vn -1 0 0 +vn 1 0 0 +vn 1 0 0 +vn -1 0 0 +vn 0 0 1 +vn 0 1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 0 -1 +vn -1 0 0 +vn 0 0 1 +vn 1 0 0 +vn 0 0 1 +usemtl field_howitzer +f 262/669/168 269/670/168 272/671/168 264/672/168 +f 268/673/169 271/674/169 270/675/169 266/676/169 +f 266/677/170 270/678/170 269/679/170 262/680/170 +f 264/681/171 272/682/171 271/683/171 268/684/171 +f 263/685/172 261/686/172 265/687/172 267/688/172 +f 268/689/173 266/690/173 262/691/173 264/692/173 +f 261/693/174 269/694/174 270/695/174 265/696/174 +f 265/697/175 270/698/175 271/699/175 267/700/175 +f 267/701/176 271/702/176 272/703/176 263/704/176 +f 263/705/177 272/706/177 269/707/177 261/708/177 +f 275/709/178 282/710/178 281/711/178 273/712/178 +f 280/713/179 278/714/179 274/715/179 276/716/179 +f 274/717/180 281/718/180 282/719/180 276/720/180 +f 280/721/181 283/722/181 284/723/181 278/724/181 +f 286/725/182 293/726/182 296/727/182 288/728/182 +f 292/729/183 295/730/183 294/731/183 290/732/183 +f 290/733/184 294/734/184 293/735/184 286/736/184 +f 288/737/185 296/738/185 295/739/185 292/740/185 +f 287/741/186 285/742/186 289/743/186 291/744/186 +f 292/745/187 290/746/187 286/747/187 288/748/187 +f 285/749/188 293/750/188 294/751/188 289/752/188 +f 289/753/189 294/754/189 295/755/189 291/756/189 +f 291/757/190 295/758/190 296/759/190 287/760/190 +f 287/761/191 296/762/191 293/763/191 285/764/191 +f 299/765/192 306/766/192 305/767/192 297/768/192 +f 304/769/193 302/770/193 298/771/193 300/772/193 +f 298/773/194 305/774/194 306/775/194 300/776/194 +f 304/777/195 307/778/195 308/779/195 302/780/195 +f 312/781/196 310/782/196 309/783/196 311/784/196 +f 315/785/197 313/786/197 314/787/197 316/788/197 +f 311/789/198 309/790/198 313/791/198 315/792/198 +f 309/793/199 310/794/199 314/795/199 313/796/199 +f 320/797/200 318/798/200 317/799/200 319/800/200 +f 323/801/201 321/802/201 322/803/201 324/804/201 +f 317/805/202 318/806/202 322/807/202 321/808/202 +f 320/809/203 319/810/203 323/811/203 324/812/203 +f 319/813/204 317/814/204 321/815/204 323/816/204 +f 324/817/205 322/818/205 318/819/205 320/820/205 +f 327/821/206 325/822/206 326/823/206 328/824/206 +f 277/825/207 284/826/207 283/827/207 279/828/207 +f 275/829/208 273/830/208 277/831/208 279/832/208 +f 301/833/209 308/834/209 307/835/209 303/836/209 +f 299/837/210 297/838/210 301/839/210 303/840/210 +o bolt +v -0.125 1.0007 -0.0657 +v -0.125 1.0007 -0.1907 +v -0.125 1.2507 -0.0657 +v -0.125 1.2507 -0.1907 +v -0.0625 1.0007 -0.0657 +v -0.0625 1.0007 -0.1907 +v -0.0625 1.2507 -0.0657 +v -0.0625 1.2507 -0.1907 +v -0.125 0.9382 -0.0657 +v -0.125 0.9382 -0.1907 +v -0.125 1.0007 -0.0657 +v -0.125 1.0007 -0.1907 +v 0.25 0.9382 -0.0657 +v 0.25 0.9382 -0.1907 +v 0.25 1.0007 -0.0657 +v 0.25 1.0007 -0.1907 +v 0.25 1.3132 -0.0657 +v 0.25 1.3132 -0.1907 +v 0.25 1.2507 -0.0657 +v 0.25 1.2507 -0.1907 +v -0.125 1.3132 -0.0657 +v -0.125 1.3132 -0.1907 +v -0.125 1.2507 -0.0657 +v -0.125 1.2507 -0.1907 +v 0.25 1.2507 -0.0657 +v 0.25 1.2507 -0.1907 +v 0.25 1.0007 -0.0657 +v 0.25 1.0007 -0.1907 +v 0.1875 1.2507 -0.0657 +v 0.1875 1.2507 -0.1907 +v 0.1875 1.0007 -0.0657 +v 0.1875 1.0007 -0.1907 +vt 0.8125 0.4063 +vt 0.8125 0.3438 +vt 0.7813 0.3438 +vt 0.7813 0.4063 +vt 0.8125 0.4063 +vt 0.8125 0.3438 +vt 0.7813 0.3438 +vt 0.7813 0.4063 +vt 0.8281 0.4063 +vt 0.8281 0.3438 +vt 0.8125 0.3438 +vt 0.8125 0.4063 +vt 0.8125 0.4063 +vt 0.8125 0.3438 +vt 0.7969 0.3438 +vt 0.7969 0.4063 +vt 0.9063 0.5469 +vt 0.9063 0.5625 +vt 0.875 0.5625 +vt 0.875 0.5469 +vt 0.8281 0.5469 +vt 0.8281 0.5625 +vt 0.7969 0.5625 +vt 0.7969 0.5469 +vt 0.8906 0.5313 +vt 0.8906 0.5625 +vt 0.7969 0.5625 +vt 0.7969 0.5313 +vt 0.8906 0.5313 +vt 0.8906 0.5625 +vt 0.7969 0.5625 +vt 0.7969 0.5313 +vt 0.8906 0.5469 +vt 0.8906 0.5625 +vt 0.7969 0.5625 +vt 0.7969 0.5469 +vt 0.7969 0.5469 +vt 0.7969 0.5625 +vt 0.8906 0.5625 +vt 0.8906 0.5469 +vt 0.9063 0.5469 +vt 0.9063 0.5625 +vt 0.875 0.5625 +vt 0.875 0.5469 +vt 0.8281 0.5469 +vt 0.8281 0.5625 +vt 0.7969 0.5625 +vt 0.7969 0.5469 +vt 0.8906 0.5313 +vt 0.8906 0.5625 +vt 0.7969 0.5625 +vt 0.7969 0.5313 +vt 0.8906 0.5313 +vt 0.8906 0.5625 +vt 0.7969 0.5625 +vt 0.7969 0.5313 +vt 0.8906 0.5469 +vt 0.8906 0.5625 +vt 0.7969 0.5625 +vt 0.7969 0.5469 +vt 0.7969 0.5469 +vt 0.7969 0.5625 +vt 0.8906 0.5625 +vt 0.8906 0.5469 +vt 0.8125 0.4063 +vt 0.8125 0.3438 +vt 0.7813 0.3438 +vt 0.7813 0.4063 +vt 0.8125 0.4063 +vt 0.8125 0.3438 +vt 0.7813 0.3438 +vt 0.7813 0.4063 +vt 0.8281 0.4063 +vt 0.8281 0.3438 +vt 0.8125 0.3438 +vt 0.8125 0.4063 +vt 0.8125 0.4063 +vt 0.8125 0.3438 +vt 0.7969 0.3438 +vt 0.7969 0.4063 +vn -1 0 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn -1 0 0 +vn 1 0 0 +vn 0 -1 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 0 1 +vn 0 0 -1 +usemtl field_howitzer +f 332/841/211 330/842/211 329/843/211 331/844/211 +f 335/845/212 333/846/212 334/847/212 336/848/212 +f 331/849/213 329/850/213 333/851/213 335/852/213 +f 336/853/214 334/854/214 330/855/214 332/856/214 +f 340/857/215 338/858/215 337/859/215 339/860/215 +f 343/861/216 341/862/216 342/863/216 344/864/216 +f 337/865/217 338/866/217 342/867/217 341/868/217 +f 340/869/218 339/870/218 343/871/218 344/872/218 +f 339/873/219 337/874/219 341/875/219 343/876/219 +f 344/877/220 342/878/220 338/879/220 340/880/220 +f 348/881/221 346/882/221 345/883/221 347/884/221 +f 351/885/222 349/886/222 350/887/222 352/888/222 +f 345/889/223 346/890/223 350/891/223 349/892/223 +f 348/893/224 347/894/224 351/895/224 352/896/224 +f 347/897/225 345/898/225 349/899/225 351/900/225 +f 352/901/226 350/902/226 346/903/226 348/904/226 +f 356/905/227 354/906/227 353/907/227 355/908/227 +f 359/909/228 357/910/228 358/911/228 360/912/228 +f 355/913/229 353/914/229 357/915/229 359/916/229 +f 360/917/230 358/918/230 354/919/230 356/920/230 +o vertical_drive_guida_mechanismnce +v -0.2812 0.625 0.4063 +v -0.2812 0.625 0.3438 +v -0.2812 0.5625 0.4063 +v -0.2812 0.5625 0.3438 +v -0.3437 0.625 0.4063 +v -0.3437 0.625 0.3438 +v -0.3437 0.5625 0.4063 +v -0.3437 0.5625 0.3438 +v -0.2187 0.6875 0.4688 +v -0.2187 0.6875 0.2813 +v -0.2187 0.625 0.4688 +v -0.2187 0.625 0.2813 +v -0.4062 0.6875 0.4688 +v -0.4062 0.6875 0.2813 +v -0.4062 0.625 0.4688 +v -0.4062 0.625 0.2813 +vt 0.0625 0.9844 +vt 0.0625 1 +vt 0.0781 1 +vt 0.0781 0.9844 +vt 0.0469 0.9844 +vt 0.0469 1 +vt 0.0625 1 +vt 0.0625 0.9844 +vt 0.0625 1 +vt 0.0625 0.9844 +vt 0.0469 0.9844 +vt 0.0469 1 +vt 0.0625 0.9844 +vt 0.0625 1 +vt 0.0469 1 +vt 0.0469 0.9844 +vt 0.0625 0.9844 +vt 0.0625 1 +vt 0.0781 1 +vt 0.0781 0.9844 +vt 0.0625 0.9844 +vt 0.0625 1 +vt 0.0781 1 +vt 0.0781 0.9844 +vt 0.0469 0.9375 +vt 0.0469 0.9531 +vt 0 0.9531 +vt 0 0.9375 +vt 0.0469 0.9375 +vt 0.0469 0.9531 +vt 0 0.9531 +vt 0 0.9375 +vt 0.0469 0.9844 +vt 0.0469 0.9375 +vt 0 0.9375 +vt 0 0.9844 +vt 0.0469 0.9375 +vt 0.0469 0.9844 +vt 0 0.9844 +vt 0 0.9375 +vt 0.0469 0.9688 +vt 0.0469 0.9844 +vt 0 0.9844 +vt 0 0.9688 +vt 0 0.9375 +vt 0 0.9531 +vt 0.0469 0.9531 +vt 0.0469 0.9375 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +usemtl field_howitzer +f 364/921/231 362/922/231 361/923/231 363/924/231 +f 367/925/232 365/926/232 366/927/232 368/928/232 +f 361/929/233 362/930/233 366/931/233 365/932/233 +f 364/933/234 363/934/234 367/935/234 368/936/234 +f 363/937/235 361/938/235 365/939/235 367/940/235 +f 368/941/236 366/942/236 362/943/236 364/944/236 +f 372/945/237 370/946/237 369/947/237 371/948/237 +f 375/949/238 373/950/238 374/951/238 376/952/238 +f 369/953/239 370/954/239 374/955/239 373/956/239 +f 372/957/240 371/958/240 375/959/240 376/960/240 +f 371/961/241 369/962/241 373/963/241 375/964/241 +f 376/965/242 374/966/242 370/967/242 372/968/242 +o lever +v -0.5 1.1813 -0.0563 +v -0.5 1.1813 -0.1813 +v -0.5 1.0563 -0.0563 +v -0.5 1.0563 -0.1813 +v -0.5625 1.1813 -0.0563 +v -0.5625 1.1813 -0.1813 +v -0.5625 1.0563 -0.0563 +v -0.5625 1.0563 -0.1813 +v -0.375 1.1813 -0.3062 +v -0.375 1.1813 -0.4312 +v -0.375 1.0563 -0.3062 +v -0.375 1.0563 -0.4312 +v -0.4375 1.1813 -0.3062 +v -0.4375 1.1813 -0.4312 +v -0.4375 1.0563 -0.3062 +v -0.4375 1.0563 -0.4312 +v -0.4375 1.1813 -0.0563 +v -0.4375 1.1813 -0.4312 +v -0.4375 1.0563 -0.0563 +v -0.4375 1.0563 -0.4312 +v -0.5 1.1813 -0.0563 +v -0.5 1.1813 -0.4312 +v -0.5 1.0563 -0.0563 +v -0.5 1.0563 -0.4312 +vt 0.0469 0.9219 +vt 0.0469 0.9531 +vt 0.0781 0.9531 +vt 0.0781 0.9219 +vt 0.0781 0.9219 +vt 0.0781 0.9531 +vt 0.0625 0.9531 +vt 0.0625 0.9219 +vt 0.0469 0.9531 +vt 0.0469 0.9219 +vt 0.0625 0.9219 +vt 0.0625 0.9531 +vt 0.0469 0.9219 +vt 0.0469 0.9531 +vt 0.0625 0.9531 +vt 0.0625 0.9219 +vt 0.0625 0.9219 +vt 0.0625 0.9531 +vt 0.0781 0.9531 +vt 0.0781 0.9219 +vt 0.0625 0.9844 +vt 0.0625 0.9531 +vt 0.0469 0.9531 +vt 0.0469 0.9844 +vt 0.0625 0.9531 +vt 0.0625 0.9844 +vt 0.0469 0.9844 +vt 0.0469 0.9531 +vt 0.0625 0.9531 +vt 0.0625 0.9844 +vt 0.0781 0.9844 +vt 0.0781 0.9531 +vt 0.0625 0.9531 +vt 0.0625 0.9844 +vt 0.0781 0.9844 +vt 0.0781 0.9531 +vt 0.0781 0.9688 +vt 0.0781 1 +vt 0.1719 1 +vt 0.1719 0.9688 +vt 0.0781 0.9688 +vt 0.0781 1 +vt 0.1719 1 +vt 0.1719 0.9688 +vt 0.1719 1 +vt 0.0781 1 +vt 0.0781 0.9844 +vt 0.1719 0.9844 +vt 0.1719 0.9844 +vt 0.0781 0.9844 +vt 0.0781 0.9688 +vt 0.1719 0.9688 +vt 0.1719 0.9688 +vt 0.1719 1 +vt 0.1875 1 +vt 0.1875 0.9688 +vt 0.1719 0.9688 +vt 0.1719 1 +vt 0.1875 1 +vt 0.1875 0.9688 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +usemtl field_howitzer +f 383/969/243 381/970/243 382/971/243 384/972/243 +f 377/973/244 378/974/244 382/975/244 381/976/244 +f 380/977/245 379/978/245 383/979/245 384/980/245 +f 379/981/246 377/982/246 381/983/246 383/984/246 +f 384/985/247 382/986/247 378/987/247 380/988/247 +f 385/989/248 386/990/248 390/991/248 389/992/248 +f 388/993/249 387/994/249 391/995/249 392/996/249 +f 387/997/250 385/998/250 389/999/250 391/1000/250 +f 392/1001/251 390/1002/251 386/1003/251 388/1004/251 +f 396/1005/252 394/1006/252 393/1007/252 395/1008/252 +f 399/1009/253 397/1010/253 398/1011/253 400/1012/253 +f 393/1013/254 394/1014/254 398/1015/254 397/1016/254 +f 396/1017/255 395/1018/255 399/1019/255 400/1020/255 +f 395/1021/256 393/1022/256 397/1023/256 399/1024/256 +f 400/1025/257 398/1026/257 394/1027/257 396/1028/257 +o scope +v -0.625 1.6185 -0.522 +v -0.625 1.5893 -0.6436 +v -0.625 1.497 -0.4928 +v -0.625 1.4678 -0.6144 +v -0.75 1.6185 -0.522 +v -0.75 1.5893 -0.6436 +v -0.75 1.497 -0.4928 +v -0.75 1.4678 -0.6144 +v -0.6312 1.6474 -0.5354 +v -0.6312 1.6212 -0.6448 +v -0.6312 1.5867 -0.5208 +v -0.6312 1.5604 -0.6302 +v -0.7437 1.6474 -0.5354 +v -0.7437 1.6212 -0.6448 +v -0.7437 1.5867 -0.5208 +v -0.7437 1.5604 -0.6302 +v -0.5937 1.8385 -0.5427 +v -0.5937 1.7947 -0.725 +v -0.5937 1.6562 -0.4989 +v -0.5937 1.6124 -0.6812 +v -0.7812 1.8385 -0.5427 +v -0.7812 1.7947 -0.725 +v -0.7812 1.6562 -0.4989 +v -0.7812 1.6124 -0.6812 +v -0.875 1.7935 -0.5962 +v -0.75 1.7935 -0.5962 +v -0.875 1.672 -0.567 +v -0.75 1.672 -0.567 +v -0.875 1.779 -0.6569 +v -0.75 1.779 -0.6569 +v -0.875 1.6574 -0.6278 +v -0.75 1.6574 -0.6278 +v -0.6437 1.5874 -0.5487 +v -0.7312 1.5874 -0.5487 +v -0.6437 1.5144 -0.5004 +v -0.7312 1.5144 -0.5004 +v -0.625 1.7065 -0.4027 +v -0.75 1.7065 -0.4027 +v -0.625 1.6023 -0.3337 +v -0.75 1.6023 -0.3337 +v -0.65 1.6632 -0.4228 +v -0.725 1.6632 -0.4228 +v -0.65 1.6007 -0.3814 +v -0.725 1.6007 -0.3814 +v -0.65 1.6908 -0.3811 +v -0.725 1.6908 -0.3811 +v -0.65 1.6283 -0.3397 +v -0.725 1.6283 -0.3397 +v -0.5312 1.8008 -0.5658 +v -0.5312 1.7717 -0.6873 +v -0.5312 1.6793 -0.5366 +v -0.5312 1.6501 -0.6582 +v -0.5937 1.8008 -0.5658 +v -0.5937 1.7717 -0.6873 +v -0.5937 1.6793 -0.5366 +v -0.5937 1.6501 -0.6582 +v -0.5937 1.9905 -0.5792 +v -0.5937 2.022 -0.7153 +v -0.5937 1.8689 -0.55 +v -0.5937 1.8397 -0.6715 +v -0.7812 1.9905 -0.5792 +v -0.7812 2.022 -0.7153 +v -0.7812 1.8689 -0.55 +v -0.7812 1.8397 -0.6715 +v -0.5937 2.0075 -0.7761 +v -0.5937 1.8251 -0.7323 +v -0.7812 2.0075 -0.7761 +v -0.7812 1.8251 -0.7323 +v -0.625 1.999 -0.6776 +v -0.625 1.9698 -0.7992 +v -0.625 1.8774 -0.6484 +v -0.625 1.8482 -0.77 +v -0.75 1.999 -0.6776 +v -0.75 1.9698 -0.7992 +v -0.75 1.8774 -0.6484 +v -0.75 1.8482 -0.77 +v -0.6312 1.8905 -0.5938 +v -0.6312 1.8643 -0.7031 +v -0.6312 1.8298 -0.5792 +v -0.6312 1.8035 -0.6886 +v -0.7437 1.8905 -0.5938 +v -0.7437 1.8643 -0.7031 +v -0.7437 1.8298 -0.5792 +v -0.7437 1.8035 -0.6886 +v -0.5312 1.6246 -0.3628 +v -0.5312 1.5662 -0.6059 +v -0.5312 1.5638 -0.3482 +v -0.5312 1.5055 -0.5913 +v -0.5937 1.6246 -0.3628 +v -0.5937 1.5662 -0.6059 +v -0.5937 1.5638 -0.3482 +v -0.5937 1.5055 -0.5913 +v -0.5937 1.5808 -0.5451 +v -0.5937 1.5201 -0.5305 +v -0.625 1.5808 -0.5451 +v -0.625 1.5662 -0.6059 +v -0.625 1.5201 -0.5305 +v -0.625 1.5055 -0.5913 +vt 0.125 0.75 +vt 0.125 0.875 +vt 0 0.875 +vt 0 0.75 +vt 0.125 0.75 +vt 0.125 0.875 +vt 0 0.875 +vt 0 0.75 +vt 0.125 0.75 +vt 0.125 0.875 +vt 0.25 0.875 +vt 0.25 0.75 +vt 0.25 0.75 +vt 0.25 0.875 +vt 0.125 0.875 +vt 0.125 0.75 +vt 0 0.75 +vt 0 0.875 +vt 0.125 0.875 +vt 0.125 0.75 +vt 0 0.75 +vt 0 0.875 +vt 0.125 0.875 +vt 0.125 0.75 +vt 0.5625 0.9375 +vt 0.5625 1 +vt 0.675 1 +vt 0.675 0.9375 +vt 0.5625 0.9375 +vt 0.5625 1 +vt 0.675 1 +vt 0.675 0.9375 +vt 0.675 0.9375 +vt 0.675 1 +vt 0.5625 1 +vt 0.5625 0.9375 +vt 0.675 0.9375 +vt 0.675 1 +vt 0.5625 1 +vt 0.5625 0.9375 +vt 0.1875 0.5625 +vt 0.1875 0.75 +vt 0 0.75 +vt 0 0.5625 +vt 0.1875 0.5625 +vt 0.1875 0.75 +vt 0 0.75 +vt 0 0.5625 +vt 0 0.375 +vt 0 0.5625 +vt 0.1875 0.5625 +vt 0.1875 0.375 +vt 0.1875 0.375 +vt 0.1875 0.5625 +vt 0 0.5625 +vt 0 0.375 +vt 0 0.5625 +vt 0 0.75 +vt 0.1875 0.75 +vt 0.1875 0.5625 +vt 0 0.5625 +vt 0 0.75 +vt 0.1875 0.75 +vt 0.1875 0.5625 +vt 0.25 0.75 +vt 0.25 0.875 +vt 0.125 0.875 +vt 0.125 0.75 +vt 0.125 0.75 +vt 0.125 0.875 +vt 0.25 0.875 +vt 0.25 0.75 +vt 0.125 0.8125 +vt 0.25 0.8125 +vt 0.25 0.875 +vt 0.125 0.875 +vt 0.1875 0.8125 +vt 0.0625 0.8125 +vt 0.0625 0.75 +vt 0.1875 0.75 +vt 0.1875 0.75 +vt 0.1875 0.875 +vt 0.125 0.875 +vt 0.125 0.75 +vt 0.5625 0.875 +vt 0.5625 1 +vt 0.4375 1 +vt 0.4375 0.875 +vt 0.4375 0.875 +vt 0.2495 0.8933 +vt 0.2495 0.9808 +vt 0.4375 1 +vt 0.2495 0.8935 +vt 0.2495 0.981 +vt 0.438 0.9998 +vt 0.4375 0.8743 +vt 0.25 0.9813 +vt 0.25 0.8938 +vt 0.4384 0.875 +vt 0.4384 1 +vt 0.4384 1 +vt 0.25 0.9813 +vt 0.25 0.8938 +vt 0.4384 0.875 +vt 0 0.875 +vt 0 1 +vt 0.125 1 +vt 0.125 0.875 +vt 0.0625 1 +vt 0.0625 0.875 +vt 0 0.875 +vt 0 1 +vt 0.0625 0.875 +vt 0.0625 1 +vt 0.0625 1 +vt 0.0625 0.875 +vt 0.0625 0.875 +vt 0.0625 1 +vt 0 1 +vt 0 0.875 +vt 0.125 0.875 +vt 0.125 1 +vt 0.0625 1 +vt 0.0625 0.875 +vt 0.3125 0.625 +vt 0.3125 0.75 +vt 0.1875 0.75 +vt 0.1875 0.625 +vt 0.1875 0.75 +vt 0.3125 0.75 +vt 0.3125 0.6875 +vt 0.1875 0.6875 +vt 0.3125 0.625 +vt 0.1875 0.625 +vt 0.1875 0.6875 +vt 0.3125 0.6875 +vt 0.25 0.625 +vt 0.25 0.75 +vt 0.1875 0.75 +vt 0.1875 0.625 +vt 0.3125 0.625 +vt 0.3125 0.75 +vt 0.25 0.75 +vt 0.25 0.625 +vt 0.5625 0.6875 +vt 0.5625 0.875 +vt 0.4375 0.8125 +vt 0.4375 0.6875 +vt 0.4375 0.6875 +vt 0.4375 0.8125 +vt 0.5625 0.875 +vt 0.5625 0.6875 +vt 0.8125 0.5 +vt 0.8125 0.625 +vt 0.625 0.625 +vt 0.625 0.5 +vt 0.625 0.625 +vt 0.625 0.5 +vt 0.8125 0.5 +vt 0.8125 0.625 +vt 0.625 0.6875 +vt 0.625 0.5625 +vt 0.8125 0.5625 +vt 0.8125 0.6875 +vt 0.6875 0.6875 +vt 0.6875 0.875 +vt 0.625 0.875 +vt 0.625 0.6875 +vt 0.8125 0.6875 +vt 0.8125 0.875 +vt 0.75 0.875 +vt 0.75 0.6875 +vt 0.625 0.8125 +vt 0.625 0.875 +vt 0.8125 0.875 +vt 0.8125 0.8125 +vt 0.625 0.6875 +vt 0.625 0.75 +vt 0.8125 0.75 +vt 0.8125 0.6875 +vt 0.8125 0.6875 +vt 0.8125 0.875 +vt 0.625 0.875 +vt 0.625 0.6875 +vt 0 0.875 +vt 0 1 +vt 0.125 1 +vt 0.125 0.875 +vt 0 0.875 +vt 0 1 +vt 0.125 1 +vt 0.125 0.875 +vt 0.125 1 +vt 0 1 +vt 0 0.875 +vt 0.125 0.875 +vt 0 1 +vt 0 0.875 +vt 0.125 0.875 +vt 0.125 1 +vt 0.125 0.875 +vt 0.125 1 +vt 0 1 +vt 0 0.875 +vt 0.5625 0.9375 +vt 0.5625 1 +vt 0.675 1 +vt 0.675 0.9375 +vt 0.5625 0.9375 +vt 0.5625 1 +vt 0.675 1 +vt 0.675 0.9375 +vt 0.675 0.9375 +vt 0.675 1 +vt 0.5625 1 +vt 0.5625 0.9375 +vt 0.675 0.9375 +vt 0.675 1 +vt 0.5625 1 +vt 0.5625 0.9375 +vt 0 0.3125 +vt 0 0.375 +vt 0.25 0.375 +vt 0.25 0.3125 +vt 0.25 0.3125 +vt 0.25 0.375 +vt 0 0.375 +vt 0 0.3125 +vt 0.25 0.3125 +vt 0 0.3125 +vt 0 0.375 +vt 0.25 0.375 +vt 0 0.375 +vt 0.25 0.375 +vt 0.25 0.3125 +vt 0 0.3125 +vt 0.1875 0.3125 +vt 0.1875 0.375 +vt 0.25 0.375 +vt 0.25 0.3125 +vt 0 0.3125 +vt 0 0.375 +vt 0.0625 0.375 +vt 0.0625 0.3125 +vt 0.25 0.4375 +vt 0.25 0.375 +vt 0.1875 0.375 +vt 0.1875 0.4375 +vt 0.25 0.375 +vt 0.25 0.4375 +vt 0.1875 0.4375 +vt 0.1875 0.375 +vt 0.1875 0.375 +vt 0.1875 0.4375 +vt 0.25 0.4375 +vt 0.25 0.375 +vt 0.25 0.375 +vt 0.25 0.4375 +vt 0.1875 0.4375 +vt 0.1875 0.375 +vn 1 0 0 +vn -1 0 0 +vn 0 0.97 -0.23 +vn 0 -0.97 0.23 +vn 0 0.23 0.97 +vn 0 -0.23 -0.97 +vn 1 0 0 +vn -1 0 0 +vn 0 0.23 0.97 +vn 0 -0.23 -0.97 +vn 1 0 0 +vn -1 0 0 +vn 0 0.97 -0.23 +vn 0 -0.97 0.23 +vn 0 0.23 0.97 +vn 0 -0.23 -0.97 +vn 0 0.23 0.97 +vn 0 -0.23 -0.97 +vn 0 0.97 -0.23 +vn 0 -0.97 0.23 +vn -1 0 0 +vn 0 0.55 0.83 +vn 0 0.77 -0.63 +vn 0 -0.88 0.47 +vn 1 -0.05 -0.08 +vn -1 -0.05 -0.08 +vn 0 0.55 0.83 +vn 0 0.83 -0.55 +vn 0 -0.83 0.55 +vn 1 0 0 +vn -1 0 0 +vn 1 0 0 +vn 0 0.97 -0.23 +vn 0 -0.97 0.23 +vn 0 0.23 0.97 +vn 0 -0.23 -0.97 +vn 1 0 0 +vn -1 0 0 +vn 0 0.97 0.23 +vn 0 -0.97 0.23 +vn 0 0.23 0.97 +vn 1 0 0 +vn -1 0 0 +vn 0 0.97 -0.23 +vn 0 -0.97 0.23 +vn 0 -0.23 -0.97 +vn 1 0 0 +vn -1 0 0 +vn 0 0.97 -0.23 +vn 0 -0.97 0.23 +vn 0 -0.23 -0.97 +vn 1 0 0 +vn -1 0 0 +vn 0 0.23 0.97 +vn 0 -0.23 -0.97 +vn 1 0 0 +vn -1 0 0 +vn 0 0.97 -0.23 +vn 0 -0.97 0.23 +vn 0 0.23 0.97 +vn 0 -0.23 -0.97 +vn 0 0.97 -0.23 +vn 0 -0.97 0.23 +vn 0 0.23 0.97 +vn 0 -0.23 -0.97 +usemtl artillery_scope +f 404/1029/258 402/1030/258 401/1031/258 403/1032/258 +f 407/1033/259 405/1034/259 406/1035/259 408/1036/259 +f 401/1037/260 402/1038/260 406/1039/260 405/1040/260 +f 404/1041/261 403/1042/261 407/1043/261 408/1044/261 +f 403/1045/262 401/1046/262 405/1047/262 407/1048/262 +f 408/1049/263 406/1050/263 402/1051/263 404/1052/263 +f 412/1053/264 410/1054/264 409/1055/264 411/1056/264 +f 415/1057/265 413/1058/265 414/1059/265 416/1060/265 +f 411/1061/266 409/1062/266 413/1063/266 415/1064/266 +f 416/1065/267 414/1066/267 410/1067/267 412/1068/267 +f 420/1069/268 418/1070/268 417/1071/268 419/1072/268 +f 423/1073/269 421/1074/269 422/1075/269 424/1076/269 +f 417/1077/270 418/1078/270 422/1079/270 421/1080/270 +f 420/1081/271 419/1082/271 423/1083/271 424/1084/271 +f 419/1085/272 417/1086/272 421/1087/272 423/1088/272 +f 424/1089/273 422/1090/273 418/1091/273 420/1092/273 +f 428/1093/274 426/1094/274 425/1095/274 427/1096/274 +f 431/1097/275 429/1098/275 430/1099/275 432/1100/275 +f 425/1101/276 426/1102/276 430/1103/276 429/1104/276 +f 428/1105/277 427/1106/277 431/1107/277 432/1108/277 +f 427/1109/278 425/1110/278 429/1111/278 431/1112/278 +f 439/1113/279 437/1114/279 438/1115/279 440/1116/279 +f 437/1117/280 433/1118/280 434/1119/280 438/1120/280 +f 436/1121/281 435/1122/281 439/1123/281 440/1124/281 +f 435/1125/282 433/1126/282 437/1127/282 439/1128/282 +f 438/1129/283 434/1130/283 436/1131/283 440/1132/283 +f 447/1133/284 445/1134/284 446/1135/284 448/1136/284 +f 441/1137/285 442/1138/285 446/1139/285 445/1140/285 +f 444/1141/286 443/1142/286 447/1143/286 448/1144/286 +f 443/1145/287 441/1146/287 445/1147/287 447/1148/287 +f 448/1149/288 446/1150/288 442/1151/288 444/1152/288 +f 452/1153/289 450/1154/289 449/1155/289 451/1156/289 +f 449/1157/290 450/1158/290 454/1159/290 453/1160/290 +f 452/1161/291 451/1162/291 455/1163/291 456/1164/291 +f 451/1165/292 449/1166/292 453/1167/292 455/1168/292 +f 456/1169/293 454/1170/293 450/1171/293 452/1172/293 +f 460/1173/294 458/1174/294 457/1175/294 459/1176/294 +f 463/1177/295 461/1178/295 462/1179/295 464/1180/295 +f 457/1181/296 458/1182/296 462/1183/296 461/1184/296 +f 460/1185/297 459/1186/297 463/1187/297 464/1188/297 +f 459/1189/298 457/1190/298 461/1191/298 463/1192/298 +f 466/1193/299 465/1194/299 458/1195/299 460/1196/299 +f 464/1197/300 462/1198/300 467/1199/300 468/1200/300 +f 458/1201/301 465/1202/301 467/1203/301 462/1204/301 +f 466/1205/302 460/1206/302 464/1207/302 468/1208/302 +f 468/1209/303 467/1210/303 465/1211/303 466/1212/303 +f 472/1213/304 470/1214/304 469/1215/304 471/1216/304 +f 475/1217/305 473/1218/305 474/1219/305 476/1220/305 +f 469/1221/306 470/1222/306 474/1223/306 473/1224/306 +f 472/1225/307 471/1226/307 475/1227/307 476/1228/307 +f 476/1229/308 474/1230/308 470/1231/308 472/1232/308 +f 480/1233/309 478/1234/309 477/1235/309 479/1236/309 +f 483/1237/310 481/1238/310 482/1239/310 484/1240/310 +f 479/1241/311 477/1242/311 481/1243/311 483/1244/311 +f 484/1245/312 482/1246/312 478/1247/312 480/1248/312 +f 488/1249/313 486/1250/313 485/1251/313 487/1252/313 +f 491/1253/314 489/1254/314 490/1255/314 492/1256/314 +f 485/1257/315 486/1258/315 490/1259/315 489/1260/315 +f 488/1261/316 487/1262/316 491/1263/316 492/1264/316 +f 487/1265/317 485/1266/317 489/1267/317 491/1268/317 +f 492/1269/318 490/1270/318 486/1271/318 488/1272/318 +f 493/1273/319 490/1274/319 496/1275/319 495/1276/319 +f 492/1277/320 494/1278/320 497/1279/320 498/1280/320 +f 494/1281/321 493/1282/321 495/1283/321 497/1284/321 +f 498/1285/322 496/1286/322 490/1287/322 492/1288/322 +o range +v -0.8437 1.7777 -0.5281 +v -0.7812 1.7777 -0.5281 +v -0.8437 1.717 -0.5135 +v -0.7812 1.717 -0.5135 +v -0.8437 1.734 -0.7104 +v -0.7812 1.734 -0.7104 +v -0.8437 1.6732 -0.6958 +v -0.7812 1.6732 -0.6958 +v -0.875 1.8227 -0.4746 +v -0.75 1.8227 -0.4746 +v -0.875 1.7012 -0.4454 +v -0.75 1.7012 -0.4454 +v -0.875 1.8081 -0.5354 +v -0.75 1.8081 -0.5354 +v -0.875 1.6866 -0.5062 +v -0.75 1.6866 -0.5062 +vt 0.25 0.8125 +vt 0.25 0.875 +vt 0.1875 0.875 +vt 0.1875 0.8125 +vt 0.375 0.8125 +vt 0.375 0.875 +vt 0.1875 0.875 +vt 0.1875 0.8125 +vt 0.375 0.8125 +vt 0.375 0.875 +vt 0.1875 0.875 +vt 0.1875 0.8125 +vt 0.375 0.8125 +vt 0.375 0.875 +vt 0.1875 0.875 +vt 0.1875 0.8125 +vt 0.1875 0.8125 +vt 0.1875 0.875 +vt 0.375 0.875 +vt 0.375 0.8125 +vt 0.3125 0.625 +vt 0.3125 0.75 +vt 0.1875 0.75 +vt 0.1875 0.625 +vt 0.1875 0.625 +vt 0.1875 0.75 +vt 0.3125 0.75 +vt 0.3125 0.625 +vt 0.1875 0.75 +vt 0.3125 0.75 +vt 0.3125 0.6875 +vt 0.1875 0.6875 +vt 0.3125 0.625 +vt 0.1875 0.625 +vt 0.1875 0.6875 +vt 0.3125 0.6875 +vt 0.25 0.625 +vt 0.25 0.75 +vt 0.1875 0.75 +vt 0.1875 0.625 +vt 0.3125 0.625 +vt 0.3125 0.75 +vt 0.25 0.75 +vt 0.25 0.625 +vn 0 -0.23 -0.97 +vn 0 0.97 -0.23 +vn 0 -0.97 0.23 +vn -1 0 0 +vn 1 0 0 +vn 0 0.23 0.97 +vn 0 -0.23 -0.97 +vn 0 0.97 -0.23 +vn 0 -0.97 0.23 +vn -1 0 0 +vn 1 0 0 +usemtl artillery_scope +f 505/1289/323 503/1290/323 504/1291/323 506/1292/323 +f 499/1293/324 500/1294/324 504/1295/324 503/1296/324 +f 502/1297/325 501/1298/325 505/1299/325 506/1300/325 +f 501/1301/326 499/1302/326 503/1303/326 505/1304/326 +f 506/1305/327 504/1306/327 500/1307/327 502/1308/327 +f 510/1309/328 508/1310/328 507/1311/328 509/1312/328 +f 513/1313/329 511/1314/329 512/1315/329 514/1316/329 +f 507/1317/330 508/1318/330 512/1319/330 511/1320/330 +f 510/1321/331 509/1322/331 513/1323/331 514/1324/331 +f 509/1325/332 507/1326/332 511/1327/332 513/1328/332 +f 514/1329/333 512/1330/333 508/1331/333 510/1332/333 +o wheel2 +v -0.8125 0.8717 0 +v -0.5625 0.8717 0 +v -0.8125 0.6217 0.25 +v -0.5625 0.6217 0.25 +v -0.8125 0.8717 -0.375 +v -0.5625 0.8717 -0.375 +v -0.8125 0.6217 -0.625 +v -0.5625 0.6217 -0.625 +v -0.8125 -0.0033 0 +v -0.5625 -0.0033 0 +v -0.8125 0.2467 0.25 +v -0.5625 0.2467 0.25 +v -0.8125 -0.0033 -0.375 +v -0.5625 -0.0033 -0.375 +v -0.8125 0.2467 -0.625 +v -0.5625 0.2467 -0.625 +v -0.8125 0.6217 0.25 +v -0.5625 0.6217 0.25 +v -0.8125 0.2467 0.25 +v -0.5625 0.2467 0.25 +v -0.8125 0.6217 -0.625 +v -0.5625 0.6217 -0.625 +v -0.8125 0.2467 -0.625 +v -0.5625 0.2467 -0.625 +v -0.8125 0.625 0 +v -0.8125 0.625 -0.375 +v -0.8125 0.25 0 +v -0.8125 0.25 -0.375 +v -0.875 0.625 0 +v -0.875 0.625 -0.375 +v -0.875 0.25 0 +v -0.875 0.25 -0.375 +vt 0.8438 0.5625 +vt 0.8438 0.7188 +vt 0.7188 0.7188 +vt 0.7188 0.5625 +vt 0.2813 0.5625 +vt 0.2813 0.7188 +vt 0.1563 0.7188 +vt 0.1563 0.5625 +vt 0.4063 0.7188 +vt 0.4063 0.8438 +vt 0.5938 0.8438 +vt 0.5938 0.7188 +vt 0.7188 0.5938 +vt 0.5938 0.7188 +vt 0.4063 0.7188 +vt 0.2813 0.5938 +vt 0.2813 0.5938 +vt 0.4063 0.7188 +vt 0.5938 0.7188 +vt 0.7188 0.5938 +vt 0.7188 0.2813 +vt 0.8438 0.2813 +vt 0.8438 0.4375 +vt 0.7188 0.4375 +vt 0.1563 0.2813 +vt 0.2813 0.2813 +vt 0.2813 0.4375 +vt 0.1563 0.4375 +vt 0.4063 0.1563 +vt 0.5938 0.1563 +vt 0.5938 0.2813 +vt 0.4063 0.2813 +vt 0.4063 0.2813 +vt 0.5938 0.2813 +vt 0.7188 0.4063 +vt 0.2813 0.4063 +vt 0.5938 0.2813 +vt 0.4063 0.2813 +vt 0.2813 0.4063 +vt 0.7188 0.4063 +vt 0.8438 0.4063 +vt 0.8438 0.5938 +vt 0.7188 0.5938 +vt 0.7188 0.4063 +vt 0.2813 0.4063 +vt 0.2813 0.5938 +vt 0.1563 0.5938 +vt 0.1563 0.4063 +vt 0.7188 0.4063 +vt 0.7188 0.5938 +vt 0.2813 0.5938 +vt 0.2813 0.4063 +vt 0.2813 0.4063 +vt 0.2813 0.5938 +vt 0.7188 0.5938 +vt 0.7188 0.4063 +vt 0.5938 0.4063 +vt 0.5938 0.5938 +vt 0.4063 0.5938 +vt 0.4063 0.4063 +vt 0.5938 0.5938 +vt 0.4063 0.5938 +vt 0.4063 0.5625 +vt 0.5938 0.5625 +vt 0.4063 0.4063 +vt 0.5938 0.4063 +vt 0.5938 0.4375 +vt 0.4063 0.4375 +vt 0.5938 0.4063 +vt 0.5938 0.5938 +vt 0.5625 0.5938 +vt 0.5625 0.4063 +vt 0.4375 0.4063 +vt 0.4375 0.5938 +vt 0.4063 0.5938 +vt 0.4063 0.4063 +vn 0 0.71 0.71 +vn 0 0.71 -0.71 +vn 0 1 0 +vn -1 0 0 +vn 1 0 0 +vn 0 -0.71 0.71 +vn 0 -0.71 -0.71 +vn 0 -1 0 +vn -1 0 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn -1 0 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +usemtl wheel_12_terrain +f 518/1333/334 516/1334/334 515/1335/334 517/1336/334 +f 521/1337/335 519/1338/335 520/1339/335 522/1340/335 +f 515/1341/336 516/1342/336 520/1343/336 519/1344/336 +f 517/1345/337 515/1346/337 519/1347/337 521/1348/337 +f 522/1349/338 520/1350/338 516/1351/338 518/1352/338 +f 523/1353/339 524/1354/339 526/1355/339 525/1356/339 +f 528/1357/340 527/1358/340 529/1359/340 530/1360/340 +f 528/1361/341 524/1362/341 523/1363/341 527/1364/341 +f 527/1365/342 523/1366/342 525/1367/342 529/1368/342 +f 524/1369/343 528/1370/343 530/1371/343 526/1372/343 +f 534/1373/344 532/1374/344 531/1375/344 533/1376/344 +f 537/1377/345 535/1378/345 536/1379/345 538/1380/345 +f 533/1381/346 531/1382/346 535/1383/346 537/1384/346 +f 538/1385/347 536/1386/347 532/1387/347 534/1388/347 +f 545/1389/348 543/1390/348 544/1391/348 546/1392/348 +f 539/1393/349 540/1394/349 544/1395/349 543/1396/349 +f 542/1397/350 541/1398/350 545/1399/350 546/1400/350 +f 541/1401/351 539/1402/351 543/1403/351 545/1404/351 +f 546/1405/352 544/1406/352 540/1407/352 542/1408/352 +o wheel1 +v 0.9375 0.8717 0 +v 0.6875 0.8717 0 +v 0.9375 0.6217 0.25 +v 0.6875 0.6217 0.25 +v 0.9375 0.8717 -0.375 +v 0.6875 0.8717 -0.375 +v 0.9375 0.6217 -0.625 +v 0.6875 0.6217 -0.625 +v 0.9375 -0.0033 0 +v 0.6875 -0.0033 0 +v 0.9375 0.2467 0.25 +v 0.6875 0.2467 0.25 +v 0.9375 -0.0033 -0.375 +v 0.6875 -0.0033 -0.375 +v 0.9375 0.2467 -0.625 +v 0.6875 0.2467 -0.625 +v 0.9375 0.6217 0.25 +v 0.6875 0.6217 0.25 +v 0.9375 0.2467 0.25 +v 0.6875 0.2467 0.25 +v 0.9375 0.6217 -0.625 +v 0.6875 0.6217 -0.625 +v 0.9375 0.2467 -0.625 +v 0.6875 0.2467 -0.625 +v 0.9375 0.625 0 +v 0.9375 0.625 -0.375 +v 0.9375 0.25 0 +v 0.9375 0.25 -0.375 +v 1 0.625 0 +v 1 0.625 -0.375 +v 1 0.25 0 +v 1 0.25 -0.375 +vt 0.7188 0.7188 +vt 0.8438 0.7188 +vt 0.8438 0.5625 +vt 0.7188 0.5625 +vt 0.1563 0.7188 +vt 0.2813 0.7188 +vt 0.2813 0.5625 +vt 0.1563 0.5625 +vt 0.5938 0.8438 +vt 0.4063 0.8438 +vt 0.4063 0.7188 +vt 0.5938 0.7188 +vt 0.4063 0.7188 +vt 0.5938 0.7188 +vt 0.7188 0.5938 +vt 0.2813 0.5938 +vt 0.5938 0.7188 +vt 0.4063 0.7188 +vt 0.2813 0.5938 +vt 0.7188 0.5938 +vt 0.8438 0.4375 +vt 0.8438 0.2813 +vt 0.7188 0.2813 +vt 0.7188 0.4375 +vt 0.2813 0.4375 +vt 0.2813 0.2813 +vt 0.1563 0.2813 +vt 0.1563 0.4375 +vt 0.5938 0.2813 +vt 0.5938 0.1563 +vt 0.4063 0.1563 +vt 0.4063 0.2813 +vt 0.7188 0.4063 +vt 0.5938 0.2813 +vt 0.4063 0.2813 +vt 0.2813 0.4063 +vt 0.2813 0.4063 +vt 0.4063 0.2813 +vt 0.5938 0.2813 +vt 0.7188 0.4063 +vt 0.7188 0.5938 +vt 0.8438 0.5938 +vt 0.8438 0.4063 +vt 0.7188 0.4063 +vt 0.1563 0.5938 +vt 0.2813 0.5938 +vt 0.2813 0.4063 +vt 0.1563 0.4063 +vt 0.2813 0.5938 +vt 0.7188 0.5938 +vt 0.7188 0.4063 +vt 0.2813 0.4063 +vt 0.7188 0.5938 +vt 0.2813 0.5938 +vt 0.2813 0.4063 +vt 0.7188 0.4063 +vt 0.4063 0.5938 +vt 0.5938 0.5938 +vt 0.5938 0.4063 +vt 0.4063 0.4063 +vt 0.4063 0.5625 +vt 0.4063 0.5938 +vt 0.5938 0.5938 +vt 0.5938 0.5625 +vt 0.5938 0.4375 +vt 0.5938 0.4063 +vt 0.4063 0.4063 +vt 0.4063 0.4375 +vt 0.5625 0.5938 +vt 0.5938 0.5938 +vt 0.5938 0.4063 +vt 0.5625 0.4063 +vt 0.4063 0.5938 +vt 0.4375 0.5938 +vt 0.4375 0.4063 +vt 0.4063 0.4063 +vn 0 0.71 0.71 +vn 0 0.71 -0.71 +vn 0 1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 -0.71 0.71 +vn 0 -0.71 -0.71 +vn 0 -1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +usemtl wheel_12_terrain +f 547/1409/353 548/1410/353 550/1411/353 549/1412/353 +f 552/1413/354 551/1414/354 553/1415/354 554/1416/354 +f 552/1417/355 548/1418/355 547/1419/355 551/1420/355 +f 551/1421/356 547/1422/356 549/1423/356 553/1424/356 +f 548/1425/357 552/1426/357 554/1427/357 550/1428/357 +f 558/1429/358 556/1430/358 555/1431/358 557/1432/358 +f 561/1433/359 559/1434/359 560/1435/359 562/1436/359 +f 555/1437/360 556/1438/360 560/1439/360 559/1440/360 +f 557/1441/361 555/1442/361 559/1443/361 561/1444/361 +f 562/1445/362 560/1446/362 556/1447/362 558/1448/362 +f 563/1449/363 564/1450/363 566/1451/363 565/1452/363 +f 568/1453/364 567/1454/364 569/1455/364 570/1456/364 +f 567/1457/365 563/1458/365 565/1459/365 569/1460/365 +f 564/1461/366 568/1462/366 570/1463/366 566/1464/366 +f 576/1465/367 575/1466/367 577/1467/367 578/1468/367 +f 576/1469/368 572/1470/368 571/1471/368 575/1472/368 +f 577/1473/369 573/1474/369 574/1475/369 578/1476/369 +f 575/1477/370 571/1478/370 573/1479/370 577/1480/370 +f 572/1481/371 576/1482/371 578/1483/371 574/1484/371 \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/models/entity/vehicle/field_howitzer/field_howitzer.obj.amt b/src/main/resources/assets/immersiveintelligence/models/entity/vehicle/field_howitzer/field_howitzer.obj.amt new file mode 100644 index 000000000..85cdca0c1 --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/models/entity/vehicle/field_howitzer/field_howitzer.obj.amt @@ -0,0 +1,77 @@ +{ + "origins": { + "hans_gunner": [-9, 15.66667, 12], + "hans_gunner_body": [-9, 12, 12], + "hans_gunner_head": [-9, 24, 12], + "hans_gunner_left_arm": [-15, 22, 12], + "hans_gunner_right_arm": [-3, 21.97429, 12.21228], + "hans_gunner_right_leg": [-7, 11, 12], + "hans_gunner_left_leg": [-11, 11, 12], + "hans_commander": [11, 15.66667, 12], + "hans_commander_body": [11, 12, 12], + "hans_commander_head": [11, 24, 12], + "hans_commander_left_arm": [5, 22, 12], + "hans_commander_right_arm": [17, 21.97429, 12.21228], + "hans_commander_right_leg": [13, 11, 12], + "hans_commander_left_leg": [9, 11, 12], + "weapon": [-11, 7, -3], + "howi": [5, 18, -6], + "breech": [4, 22, -12], + "gun": [1, 18.01143, -15.1696], + "bolt": [1, 18.01143, -2.05195], + "6bcal_light_artillery": [1, 18.01143, -8.95195], + "6bcal_light_artillery_case": [1, 18.01143, -8.95195], + "net_gun": [0.5, 20.1, -18], + "vertical_drive_guida_mechanismnce": [-5, 10, 6], + "lever": [-6, 17.9, -6], + "scope": [-7.5, 21.77647, -8.48073], + "range": [-13, 27.84104, -8.81916], + "net_armor": [-6, 7.1, 4.9], + "radio": [-12.07672, 20.09639, -8.09004], + "wheel2": [-11, 6.94652, -3], + "wheel1": [13, 6.94652, -3], + "particle_vehicle_wheel1": [13, 6.9, -3], + "particle_vehicle_wheel2": [-11, 6.9, -3], + "particle_vehicle_howitzer": [0, 0, 0], + "particle_vehicle_howi": [1, 20.06, -16], + "particle_vehicle_gun": [0, 0, 0], + "fire": [1, 18, -22] + }, + "hierarchy": { + "hans_gunner_body": "hans_gunner", + "hans_gunner_head": "hans_gunner_body", + "hans_gunner_left_arm": "hans_gunner_body", + "hans_gunner_right_arm": "hans_gunner_body", + "hans_gunner_right_leg": "hans_gunner", + "hans_gunner_left_leg": "hans_gunner", + "hans_commander_body": "hans_commander", + "hans_commander_head": "hans_commander_body", + "hans_commander_left_arm": "hans_commander_body", + "hans_commander_right_arm": "hans_commander_body", + "hans_commander_right_leg": "hans_commander", + "hans_commander_left_leg": "hans_commander", + "howi": "weapon", + "breech": "howi", + "gun": "howi", + "bolt": "gun", + "6bcal_light_artillery": "gun", + "6bcal_light_artillery_case": "gun", + "net_gun": "howi", + "vertical_drive_guida_mechanismnce": "weapon", + "lever": "weapon", + "scope": "weapon", + "range": "scope", + "net_armor": "weapon", + "radio": "weapon", + "particle_vehicle_wheel1": "wheel1", + "particle_vehicle_wheel2": "wheel2", + "particle_vehicle_howitzer": "weapon", + "particle_vehicle_howi": "howi", + "particle_vehicle_gun": "gun", + "fire": "gun" + }, + "properties": { + "fire": { + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/textures/blocks/common/camo_net/common_camo_net.png b/src/main/resources/assets/immersiveintelligence/textures/blocks/common/camo_net/common_camo_net.png new file mode 100644 index 0000000000000000000000000000000000000000..ead14ee4e29cc1fe8ada0611bb1a8b0b9c77e663 GIT binary patch literal 770 zcmV+d1O5DoP)Q({3{;)Bub7pVbYE9EX5T1s8_0{~dA7RZa#ELRIi=CMC)%yzdnWtABW zQC6AR?$&01*cj>;IN?4kows`cRgL;c_ZM3&0NC!<_GMkCZB9BrqrSn=A9PPW17P$b z_nCP-d-|Ca9+)f%>Z3$E*Z(UM7$KX`xpQjZvke1u^%P;}joT}tjUI~~so&PZ{`iD2LwML_yNHW@Zp0W0B$|b&2#H#PabMmy#QOoh1rYBCyd=2w_)GM>Z%EbizQ0?%AK*I$euW?472JB< zm-mfd;RpB>;8*woUcs%$U#90@Q3wds^S;0PFM+3yJ@=z|e*gdg07*qoM6N<$f-I_b A9smFU literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/immersiveintelligence/textures/entity/vehicle/field_gun/anti_aircraft_gun.png b/src/main/resources/assets/immersiveintelligence/textures/entity/vehicle/field_gun/anti_aircraft_gun.png index 21934ac915bbad645ed93d9fc10a5d58fe537e20..732a10bd1e8768152b3c0add2586820632f85092 100644 GIT binary patch literal 4775 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 literal 3841 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 diff --git a/src/main/resources/assets/immersiveintelligence/textures/entity/vehicle/field_gun/field_howitzer_painted.png b/src/main/resources/assets/immersiveintelligence/textures/entity/vehicle/field_gun/field_howitzer_painted.png index eac0cfe30f5232f8d9c05fad1b23dd51e384c7fa..d66ef1b1789361c7d464b02e53a1f5c9bd916d87 100644 GIT binary patch literal 6434 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 literal 4932 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 Date: Sun, 31 May 2026 17:45:46 +0200 Subject: [PATCH 11/23] Expanded Deco GUI system to allow item and entity GUIs, moved Casing Pouch to Deco --- .../api/style/StyleConstraints.java | 17 +- .../api/style/StyleCustomization.java | 3 + .../client/ClientProxy.java | 15 +- .../client/gui/block/GuiAmmunitionCrate.java | 6 +- .../client/gui/block/GuiChemicalBath.java | 4 +- .../client/gui/block/GuiChemicalPainter.java | 4 +- .../client/gui/block/GuiCoagulator.java | 4 +- .../gui/block/GuiDataRedstoneInterface.java | 6 +- .../client/gui/block/GuiElectrolyzer.java | 4 +- .../client/gui/block/GuiFiller.java | 4 +- .../client/gui/block/GuiFuelStation.java | 4 +- .../client/gui/block/GuiGearbox.java | 4 +- .../client/gui/block/GuiMedicalCrate.java | 4 +- .../client/gui/block/GuiMetalCrate.java | 4 +- .../gui/block/GuiPrecisionAssembler.java | 4 +- .../client/gui/block/GuiPrintingPress.java | 4 +- .../gui/block/GuiProjectileWorkshop.java | 4 +- .../client/gui/block/GuiRepairCrate.java | 4 +- .../client/gui/block/GuiSawmill.java | 4 +- .../client/gui/block/GuiSkycartStation.java | 4 +- .../client/gui/block/GuiSkycrateStation.java | 4 +- .../client/gui/block/GuiSmallCrate.java | 4 +- .../{GuiUpgrade.java => GuiTileUpgrade.java} | 12 +- .../client/gui/block/GuiVulcanizer.java | 4 +- .../GuiAmmunitionAssembler.java | 4 +- .../GuiArithmeticLogicMachine.java | 4 +- .../GuiArithmeticLogicMachineEdit.java | 4 +- .../GuiDataInputMachine.java | 4 +- .../GuiDataInputMachineEdit.java | 4 +- .../gui/block/emplacement/GuiEmplacement.java | 4 +- .../gui/block/flagpole/GuiFlagpole.java | 4 +- .../block/flagpole/GuiFlagpoleFaction.java | 4 +- .../gui/block/inserter/GuiInserter.java | 4 +- .../client/gui/block/packer/GuiPacker.java | 4 +- .../gui/block/packer/GuiPackerLabeler.java | 4 +- .../client/gui/block/radar/GuiRadar.java | 4 +- .../gui/block/radar/GuiRadarConfig.java | 4 +- .../gui/block/radar/GuiRadarTargets.java | 4 +- .../client/gui/deco/DecoEntityGui.java | 68 ++++ .../client/gui/deco/DecoGui.java | 235 ++++++------- .../client/gui/deco/DecoHelpBox.java | 51 --- .../client/gui/deco/DecoItemGui.java | 66 ++++ .../client/gui/deco/DecoTileGui.java | 121 +++++++ .../gui/deco/component/DecoComponent.java | 6 +- .../gui/deco/component/panel/DecoPanel.java | 6 +- .../component/widget/DecoStyleWidget.java | 43 ++- .../gui/deco/util/DecoBackgroundBuilder.java | 39 ++- .../client/gui/deco/util/DecoGuiCategory.java | 4 +- .../client/gui/entity/GuiEntityUpgrade.java | 256 ++++++++++++++ .../client/gui/item/GuiCasingPouch.java | 68 ++-- .../model/TextureRecoloringRegistry.java | 2 +- .../entity/vehicle/FieldFlakRenderer.java | 5 + .../entity/vehicle/FieldHowitzerRenderer.java | 5 + .../vehicle/TrackedMotorbikeRenderer.java | 5 + .../common/CommonProxy.java | 17 +- .../common/EventHandler.java | 33 ++ .../immersiveintelligence/common/IIGUI.java | 155 +++++---- .../multiblock/MultiblockEmplacement.java | 3 +- .../multiblock/MultiblockFlagpole.java | 3 +- .../multiblock/MultiblockFuelStation.java | 3 +- .../common/compat/jei/DecoGuiJEIHandler.java | 4 +- .../entity/vehicle/EntityVehicleBase.java | 49 ++- .../gui/ContainerAmmunitionAssembler.java | 4 +- .../common/gui/ContainerAmmunitionCrate.java | 4 +- .../gui/ContainerArithmeticLogicMachine.java | 4 +- .../common/gui/ContainerCasingPouch.java | 21 +- .../common/gui/ContainerChemicalBath.java | 4 +- .../common/gui/ContainerChemicalPainter.java | 4 +- .../common/gui/ContainerCoagulator.java | 4 +- .../common/gui/ContainerDataInputMachine.java | 4 +- .../gui/ContainerDataInputMachineEditing.java | 4 +- .../common/gui/ContainerElectrolyzer.java | 4 +- .../common/gui/ContainerEmplacement.java | 4 +- .../common/gui/ContainerEntityUpgrade.java | 22 ++ .../common/gui/ContainerFiller.java | 4 +- .../common/gui/ContainerFlagpole.java | 4 +- .../common/gui/ContainerFuelStation.java | 4 +- .../common/gui/ContainerGearbox.java | 6 +- .../common/gui/ContainerIICrate.java | 4 +- .../common/gui/ContainerInserter.java | 4 +- .../common/gui/ContainerMedicalCrate.java | 4 +- .../common/gui/ContainerPacker.java | 4 +- .../gui/ContainerPrecisionAssembler.java | 4 +- .../common/gui/ContainerPrintingPress.java | 4 +- .../gui/ContainerProjectileWorkshop.java | 4 +- .../common/gui/ContainerRadar.java | 4 +- .../gui/ContainerRedstoneDataInterface.java | 4 +- .../common/gui/ContainerRepairCrate.java | 4 +- .../common/gui/ContainerSawmill.java | 4 +- .../common/gui/ContainerSkycartStation.java | 8 +- .../common/gui/ContainerSkycrateStation.java | 7 +- ...Upgrade.java => ContainerTileUpgrade.java} | 6 +- .../common/gui/ContainerVulcanizer.java | 4 +- .../common/item/tools/ItemIIBinoculars.java | 2 +- .../messages/MessageBeginMachineUpgrade.java | 48 ++- .../common/util/IIColor.java | 28 ++ .../util/block/BlockIITileProvider.java | 2 +- .../common/util/gui/ContainerIIBase.java | 323 +++++++++++++++++- .../util/gui/ContainerIIEntityBase.java | 47 +++ .../common/util/gui/ContainerIIItemBase.java | 210 ++++++++++++ .../common/util/gui/ContainerIITileBase.java | 56 +++ .../ammoprovider/GunAmmoProviderMagazine.java | 2 +- .../textures/gui/ammunition_crate.png | Bin 188442 -> 0 bytes .../textures/gui/casing_pouch.png | Bin 143434 -> 0 bytes 104 files changed, 1829 insertions(+), 493 deletions(-) rename src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/{GuiUpgrade.java => GuiTileUpgrade.java} (95%) create mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/DecoEntityGui.java delete mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/DecoHelpBox.java create mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/DecoItemGui.java create mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/DecoTileGui.java create mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/client/gui/entity/GuiEntityUpgrade.java create mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerEntityUpgrade.java rename src/main/java/pl/pabilo8/immersiveintelligence/common/gui/{ContainerUpgrade.java => ContainerTileUpgrade.java} (74%) create mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/common/util/gui/ContainerIIEntityBase.java create mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/common/util/gui/ContainerIIItemBase.java create mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/common/util/gui/ContainerIITileBase.java delete mode 100644 src/main/resources/assets/immersiveintelligence/textures/gui/ammunition_crate.png delete mode 100644 src/main/resources/assets/immersiveintelligence/textures/gui/casing_pouch.png diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/api/style/StyleConstraints.java b/src/main/java/pl/pabilo8/immersiveintelligence/api/style/StyleConstraints.java index d2d741a34..4d99d174c 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/api/style/StyleConstraints.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/api/style/StyleConstraints.java @@ -10,14 +10,14 @@ public class StyleConstraints { private final String defaultStyle; - private final boolean allowColorCustomization; + private final PaintStyleConstraint colorCustomization; private final Set styles; private final Set decorations; - public StyleConstraints(String defaultStyle, boolean allowColorCustomization, Set styles, Set decorations) + public StyleConstraints(String defaultStyle, PaintStyleConstraint colorCustomization, Set styles, Set decorations) { this.defaultStyle = defaultStyle; - this.allowColorCustomization = allowColorCustomization; + this.colorCustomization = colorCustomization; this.styles = styles; this.decorations = decorations; } @@ -27,9 +27,9 @@ public String getDefaultStyle() return defaultStyle; } - public boolean allowsColorCustomization() + public PaintStyleConstraint getColorCustomization() { - return allowColorCustomization; + return colorCustomization; } public Set getStyles() @@ -41,4 +41,11 @@ public Set getDecorations() { return decorations; } + + public enum PaintStyleConstraint + { + NOT_APPLICABLE, + ANY_COLOR, + PAINTS_COLOR_ONLY + } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/api/style/StyleCustomization.java b/src/main/java/pl/pabilo8/immersiveintelligence/api/style/StyleCustomization.java index e09c4a84f..4765324ba 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/api/style/StyleCustomization.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/api/style/StyleCustomization.java @@ -3,6 +3,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagString; import net.minecraftforge.common.util.INBTSerializable; +import pl.pabilo8.immersiveintelligence.api.style.StyleConstraints.PaintStyleConstraint; import pl.pabilo8.immersiveintelligence.common.util.IIColor; import pl.pabilo8.immersiveintelligence.common.util.easynbt.EasyNBT; @@ -62,6 +63,8 @@ public StyleCustomization withStyle(String style) public StyleCustomization withColor(IIColor color) { + if(constraints.getColorCustomization()==PaintStyleConstraint.PAINTS_COLOR_ONLY) + color = color.constraintToPaintSystem(); this.color = color; return this; } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/ClientProxy.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/ClientProxy.java index dc6985874..2a9f08123 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/ClientProxy.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/ClientProxy.java @@ -66,8 +66,9 @@ import pl.pabilo8.immersiveintelligence.client.fx.IIParticles; import pl.pabilo8.immersiveintelligence.client.fx.utils.ParticleRegistry; import pl.pabilo8.immersiveintelligence.client.fx.utils.ParticleSystem; -import pl.pabilo8.immersiveintelligence.client.gui.block.GuiUpgrade; +import pl.pabilo8.immersiveintelligence.client.gui.block.GuiTileUpgrade; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoTextures; +import pl.pabilo8.immersiveintelligence.client.gui.entity.GuiEntityUpgrade; import pl.pabilo8.immersiveintelligence.client.manual.IIManualCategory; import pl.pabilo8.immersiveintelligence.client.manual.categories.*; import pl.pabilo8.immersiveintelligence.client.model.IIModelRegistry; @@ -333,13 +334,21 @@ public Object getClientGuiElement(int ID, EntityPlayer player, World world, int EnumHand hand; TileEntity te = world.getTileEntity(new BlockPos(x, y, z)); ItemStack stack = player.getHeldItem(hand = (player.getHeldItem(EnumHand.MAIN_HAND).getItem() instanceof IGuiItem?EnumHand.MAIN_HAND: EnumHand.OFF_HAND)); + Entity entity = y==Integer.MIN_VALUE?world.getEntityByID(x): null; - if(ID==IIGUI.UPGRADE.ordinal()&&te instanceof IUpgradableDevice) + if(ID==IIGUI.UPGRADE_TILE.ordinal()&&te instanceof IUpgradableDevice) { IUpgradableDevice upgradeMaster = ((IUpgradableDevice)te).master(); if(upgradeMaster!=null) //noinspection rawtypes,unchecked - return new GuiUpgrade(player, ((TileEntityIEBase)upgradeMaster)); + return new GuiTileUpgrade(player, ((TileEntityIEBase)upgradeMaster)); + } + if(ID==IIGUI.UPGRADE_ENTITY.ordinal()&&entity instanceof IUpgradableDevice) + { + IUpgradableDevice upgradeMaster = ((IUpgradableDevice)entity).master(); + if(upgradeMaster!=null) + //noinspection rawtypes,unchecked + return new GuiEntityUpgrade(player, ((Entity)upgradeMaster)); } GuiScreen gui = null; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiAmmunitionCrate.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiAmmunitionCrate.java index b290a61bf..583e83e5c 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiAmmunitionCrate.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiAmmunitionCrate.java @@ -2,7 +2,7 @@ import net.minecraft.entity.player.EntityPlayer; -import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoBackgroundBuilder.SlotStyle; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoGuiCategory; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoTemplate; @@ -18,7 +18,7 @@ * @since 17.05.2019 */ @DecoTemplate(name = "ammunition_crate", category = DecoGuiCategory.GENERIC_TILE) -public class GuiAmmunitionCrate extends DecoGui +public class GuiAmmunitionCrate extends DecoTileGui { public GuiAmmunitionCrate(EntityPlayer player, TileEntityAmmunitionCrate tile) { @@ -46,6 +46,8 @@ public void onInit() .withInventoryTitleBar() .build(); + + /*addComponents( new DecoImage(0, -45) diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiChemicalBath.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiChemicalBath.java index e45e62457..9a8d77b21 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiChemicalBath.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiChemicalBath.java @@ -2,7 +2,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraftforge.fml.common.Optional.Method; -import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoBar; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoFluidTank; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.visual.DecoImage; @@ -21,7 +21,7 @@ * @since 10.07.2019 */ @DecoTemplate(name = "chemical_bath", category = DecoGuiCategory.PRODUCTION_TILE) -public class GuiChemicalBath extends DecoGui +public class GuiChemicalBath extends DecoTileGui { @DecoResource public static ResLoc TEXTURE = IIReference.RES_II.with("gui/chemical_bath"); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiChemicalPainter.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiChemicalPainter.java index 28fbed2b1..c6d6aa689 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiChemicalPainter.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiChemicalPainter.java @@ -3,7 +3,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.common.Optional.Method; -import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoColorPickerPanel; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoBar; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoFluidTank; @@ -27,7 +27,7 @@ * @since 10.07.2019 */ @DecoTemplate(name = "chemical_painter", category = DecoGuiCategory.PRODUCTION_TILE) -public class GuiChemicalPainter extends DecoGui +public class GuiChemicalPainter extends DecoTileGui { @DecoResource public static final ResourceLocation TEXTURE = IIReference.RES_II.with("gui/chemical_painter"); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiCoagulator.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiCoagulator.java index 16b3d32e5..8a1ad49af 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiCoagulator.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiCoagulator.java @@ -2,7 +2,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ResourceLocation; -import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoBar; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoFluidTank; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoItemStackDisplay; @@ -21,7 +21,7 @@ * @since 12.12.2025 */ @DecoTemplate(name = "coagulator", category = DecoGuiCategory.PRODUCTION_TILE) -public class GuiCoagulator extends DecoGui +public class GuiCoagulator extends DecoTileGui { @DecoResource public static final ResourceLocation TEXTURE = IIReference.RES_II.with("gui/coagulator"); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiDataRedstoneInterface.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiDataRedstoneInterface.java index 65e73500d..f349c06eb 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiDataRedstoneInterface.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiDataRedstoneInterface.java @@ -7,7 +7,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ResourceLocation; import pl.pabilo8.immersiveintelligence.client.IIClientUtils; -import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.DecoComponent.MouseButton; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoArrows; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoButton; @@ -38,7 +38,7 @@ * @since 09.02.2020 */ @DecoTemplate(name = "data_redstone_interface", category = DecoGuiCategory.DATA_TILE) -public class GuiDataRedstoneInterface extends DecoGui +public class GuiDataRedstoneInterface extends DecoTileGui { @DecoResource public static ResourceLocation PROGRESS_IMAGE = ResLoc.of(IIReference.RES_II, "gui/data_input_machine"); @@ -116,7 +116,7 @@ public void onInit() new DecoList(32, 8) .withSize(136+24+8+2, 120) - .withEntries(redstoneToData ? dataSettings : redstoneSettings) + .withEntries(redstoneToData?dataSettings: redstoneSettings) .withCreateAction(ConversionSetting::new) .withScroll(scroll) .withGuiSaveAction(gui -> this.scroll = gui.getScroll()) diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiElectrolyzer.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiElectrolyzer.java index a413163f9..d591a1c1e 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiElectrolyzer.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiElectrolyzer.java @@ -3,7 +3,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.common.Optional.Method; -import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoBar; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoFluidTank; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.visual.DecoImage; @@ -22,7 +22,7 @@ * @since 10.07.2019 */ @DecoTemplate(name = "electrolyzer", category = DecoGuiCategory.PRODUCTION_TILE) -public class GuiElectrolyzer extends DecoGui +public class GuiElectrolyzer extends DecoTileGui { @DecoResource public static final ResourceLocation TEXTURE = ResLoc.of(IIReference.RES_II, "gui/electrolyzer"); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiFiller.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiFiller.java index 8d8c70ce5..f31821d98 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiFiller.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiFiller.java @@ -3,7 +3,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.common.Optional.Method; -import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoBar; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoDustTank; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.visual.DecoImage; @@ -23,7 +23,7 @@ * @since 10.07.2019 */ @DecoTemplate(name = "filler", category = DecoGuiCategory.PRODUCTION_TILE) -public class GuiFiller extends DecoGui +public class GuiFiller extends DecoTileGui { @DecoResource public static final ResourceLocation TEXTURE = IIReference.RES_II.with("gui/filler"); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiFuelStation.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiFuelStation.java index f286bc239..aaf86a32a 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiFuelStation.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiFuelStation.java @@ -2,7 +2,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ResourceLocation; -import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoBar; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoFluidTank; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.visual.DecoImage; @@ -18,7 +18,7 @@ * @since 10.07.2019 */ @DecoTemplate(name = "fuel_station", category = DecoGuiCategory.PRODUCTION_TILE) -public class GuiFuelStation extends DecoGui +public class GuiFuelStation extends DecoTileGui { @DecoResource public static final ResourceLocation TEXTURE = IIReference.RES_II.with("gui/fuel_station"); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiGearbox.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiGearbox.java index 5b6ce9416..77a952cb0 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiGearbox.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiGearbox.java @@ -3,7 +3,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.text.TextFormatting; import pl.pabilo8.immersiveintelligence.api.rotary.IIRotaryUtils; -import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoBarGroup; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.*; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoBackgroundBuilder.SlotStyle; @@ -17,7 +17,7 @@ * @since 10.07.2019 */ @DecoTemplate(name = "wooden_gearbox", category = DecoGuiCategory.PRODUCTION_TILE) -public class GuiGearbox extends DecoGui +public class GuiGearbox extends DecoTileGui { public GuiGearbox(EntityPlayer player, TileEntityGearbox tile) { diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiMedicalCrate.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiMedicalCrate.java index d496cf09c..c553be1e3 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiMedicalCrate.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiMedicalCrate.java @@ -2,7 +2,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ResourceLocation; -import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoButton; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoFluidTank; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.visual.DecoImage; @@ -23,7 +23,7 @@ */ @DecoTemplate(name = "medicalcrate", category = DecoGuiCategory.GENERIC_TILE) -public class GuiMedicalCrate extends DecoGui +public class GuiMedicalCrate extends DecoTileGui { @DecoResource diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiMetalCrate.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiMetalCrate.java index ab7c75331..906c2aaa0 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiMetalCrate.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiMetalCrate.java @@ -1,7 +1,7 @@ package pl.pabilo8.immersiveintelligence.client.gui.block; import net.minecraft.entity.player.EntityPlayer; -import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoBackgroundBuilder.SlotStyle; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoGuiCategory; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoTemplate; @@ -15,7 +15,7 @@ * @since 17.05.2019 */ @DecoTemplate(name = "metal_crate", category = DecoGuiCategory.GENERIC_TILE) -public class GuiMetalCrate extends DecoGui> +public class GuiMetalCrate extends DecoTileGui> { public GuiMetalCrate(EntityPlayer player, TileEntityMetalCrate tile) { diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiPrecisionAssembler.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiPrecisionAssembler.java index 239d7bc06..c9a9a7f36 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiPrecisionAssembler.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiPrecisionAssembler.java @@ -3,7 +3,7 @@ import blusunrize.immersiveengineering.common.util.Utils; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ResourceLocation; -import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoBar; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.visual.DecoImage; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.visual.DecoImage.ImageAnimationDirection; @@ -25,7 +25,7 @@ */ @DecoTemplate(name = "precision_assembler", category = DecoGuiCategory.PRODUCTION_TILE) -public class GuiPrecisionAssembler extends DecoGui +public class GuiPrecisionAssembler extends DecoTileGui { @DecoResource public static final ResourceLocation TEXTURE_PRE = IIReference.RES_II.with("gui/precision_assembler"); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiPrintingPress.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiPrintingPress.java index d77478639..9495a41a8 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiPrintingPress.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiPrintingPress.java @@ -2,7 +2,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ResourceLocation; -import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoBar; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoFluidTank; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.visual.DecoImage; @@ -23,7 +23,7 @@ * @since 10.07.2019 */ @DecoTemplate(name = "printing_press", category = DecoGuiCategory.PRODUCTION_TILE) -public class GuiPrintingPress extends DecoGui +public class GuiPrintingPress extends DecoTileGui { @DecoResource public static ResourceLocation TEXTURE = ResLoc.of(IIReference.RES_II, "gui/printing_press"); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiProjectileWorkshop.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiProjectileWorkshop.java index 01b54e7dc..3f57a6dc9 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiProjectileWorkshop.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiProjectileWorkshop.java @@ -18,7 +18,7 @@ import pl.pabilo8.immersiveintelligence.api.ammo.utils.AmmoBallisticsCache; import pl.pabilo8.immersiveintelligence.api.ammo.utils.AmmoBallisticsCache.CachedBallisticStats; import pl.pabilo8.immersiveintelligence.api.ammo.utils.IIAmmoUtils; -import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.collection.DecoDropdown; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.label.DecoLabel; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoEntryPanelBuilder; @@ -52,7 +52,7 @@ * @since 10.07.2019 */ @DecoTemplate(name = "projectile_workshop", category = DecoGuiCategory.PRODUCTION_TILE) -public class GuiProjectileWorkshop extends DecoGui +public class GuiProjectileWorkshop extends DecoTileGui { @DecoResource public static ResourceLocation PROGRESS_BAR = IIReference.RES_II.with("gui/projectile_workshop"); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiRepairCrate.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiRepairCrate.java index 7b9c69847..980e6684a 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiRepairCrate.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiRepairCrate.java @@ -2,7 +2,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ResourceLocation; -import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.visual.DecoImage; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoBackgroundBuilder.SlotStyle; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoGuiCategory; @@ -21,7 +21,7 @@ * @since 24.10.2025 */ @DecoTemplate(name = "repaircrate", category = DecoGuiCategory.GENERIC_TILE) -public class GuiRepairCrate extends DecoGui +public class GuiRepairCrate extends DecoTileGui { @DecoResource diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiSawmill.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiSawmill.java index 66bb2f178..73c4c6d49 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiSawmill.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiSawmill.java @@ -2,7 +2,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ResourceLocation; -import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoBarGroup; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.visual.DecoImage; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.visual.DecoImage.ImageAnimationDirection; @@ -21,7 +21,7 @@ * @since 10.07.2019 */ @DecoTemplate(name = "wooden_gearbox", category = DecoGuiCategory.PRODUCTION_TILE) -public class GuiSawmill extends DecoGui +public class GuiSawmill extends DecoTileGui { @DecoResource public static final ResourceLocation PROGRESS_ARROW = ResLoc.of(IIReference.RES_II, "gui/sawmill"); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiSkycartStation.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiSkycartStation.java index 35dba9928..f653afc51 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiSkycartStation.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiSkycartStation.java @@ -3,7 +3,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.text.TextFormatting; import pl.pabilo8.immersiveintelligence.api.rotary.IIRotaryUtils; -import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoBarGroup; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.*; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoBackgroundBuilder.SlotStyle; @@ -20,7 +20,7 @@ * @since 10.07.2019 */ @DecoTemplate(name = "skycart_station", category = DecoGuiCategory.PRODUCTION_TILE) -public class GuiSkycartStation extends DecoGui +public class GuiSkycartStation extends DecoTileGui { public GuiSkycartStation(EntityPlayer player, TileEntitySkyCartStation tile) { diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiSkycrateStation.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiSkycrateStation.java index 8ba8f7c2c..c95d84044 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiSkycrateStation.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiSkycrateStation.java @@ -3,7 +3,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.text.TextFormatting; import pl.pabilo8.immersiveintelligence.api.rotary.IIRotaryUtils; -import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoBarGroup; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.*; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoBackgroundBuilder.SlotStyle; @@ -20,7 +20,7 @@ * @since 10.07.2019 */ @DecoTemplate(name = "skycrate_station", category = DecoGuiCategory.PRODUCTION_TILE) -public class GuiSkycrateStation extends DecoGui +public class GuiSkycrateStation extends DecoTileGui { public GuiSkycrateStation(EntityPlayer player, TileEntitySkyCrateStation tile) { diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiSmallCrate.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiSmallCrate.java index 86f9277a5..ba27b1a29 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiSmallCrate.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiSmallCrate.java @@ -1,7 +1,7 @@ package pl.pabilo8.immersiveintelligence.client.gui.block; import net.minecraft.entity.player.EntityPlayer; -import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoBackgroundBuilder.SlotStyle; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoGuiCategory; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoTemplate; @@ -15,7 +15,7 @@ * @since 17.05.2019 */ @DecoTemplate(name = "small_crate", category = DecoGuiCategory.GENERIC_TILE) -public class GuiSmallCrate extends DecoGui> +public class GuiSmallCrate extends DecoTileGui> { public GuiSmallCrate(EntityPlayer player, TileEntitySmallCrate tile) { diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiUpgrade.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiTileUpgrade.java similarity index 95% rename from src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiUpgrade.java rename to src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiTileUpgrade.java index 6af64d921..3dba60d5e 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiUpgrade.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiTileUpgrade.java @@ -12,7 +12,7 @@ import pl.pabilo8.immersiveintelligence.api.upgrade.Upgrade; import pl.pabilo8.immersiveintelligence.api.upgrade.UpgradeTechTree; import pl.pabilo8.immersiveintelligence.api.upgrade.UpgradeUtils.UpgradeOperation; -import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoButton; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.collection.DecoTreeDisplay; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.label.DecoLabel; @@ -28,7 +28,7 @@ import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoBackgroundBuilder.SlotStyle; import pl.pabilo8.immersiveintelligence.client.util.amt.models.AMTModel; import pl.pabilo8.immersiveintelligence.common.IIGUI; -import pl.pabilo8.immersiveintelligence.common.gui.ContainerUpgrade; +import pl.pabilo8.immersiveintelligence.common.gui.ContainerTileUpgrade; import pl.pabilo8.immersiveintelligence.common.network.IIPacketHandler; import pl.pabilo8.immersiveintelligence.common.network.messages.MessageBeginMachineUpgrade; import pl.pabilo8.immersiveintelligence.common.util.IIColor; @@ -45,8 +45,8 @@ * @author Pabilo8 (pabilo@iiteam.net) * @since 10.07.2019 */ -@DecoTemplate(name = "upgrade", category = DecoGuiCategory.PRODUCTION_TILE) -public class GuiUpgrade extends DecoGui> +@DecoTemplate(name = "upgrade_tile", category = DecoGuiCategory.PRODUCTION_TILE) +public class GuiTileUpgrade extends DecoTileGui> { private final UpgradeTechTree techTree; private DecoTreeDisplay techTreeDisplay; @@ -56,9 +56,9 @@ public class GuiUpgrade +public class GuiVulcanizer extends DecoTileGui { @DecoResource public static final ResourceLocation TEXTURE = IIReference.RES_II.with("gui/vulcanizer"); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/ammunition_production/GuiAmmunitionAssembler.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/ammunition_production/GuiAmmunitionAssembler.java index c4987e454..69f4f1029 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/ammunition_production/GuiAmmunitionAssembler.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/ammunition_production/GuiAmmunitionAssembler.java @@ -2,7 +2,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ResourceLocation; -import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoButton; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoBar; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.text.DecoTextField; @@ -25,7 +25,7 @@ */ @DecoTemplate(name = "ammunition_assembler", category = DecoGuiCategory.PRODUCTION_TILE) -public class GuiAmmunitionAssembler extends DecoGui +public class GuiAmmunitionAssembler extends DecoTileGui { @DecoResource diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/arithmetic_logic_machine/GuiArithmeticLogicMachine.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/arithmetic_logic_machine/GuiArithmeticLogicMachine.java index a33fdf447..7e8fb5fd0 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/arithmetic_logic_machine/GuiArithmeticLogicMachine.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/arithmetic_logic_machine/GuiArithmeticLogicMachine.java @@ -14,7 +14,7 @@ import pl.pabilo8.immersiveintelligence.api.data.types.DataTypeNull; import pl.pabilo8.immersiveintelligence.api.data.types.generic.DataType; import pl.pabilo8.immersiveintelligence.api.data.types.generic.DataType.TypeMetaInfo; -import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoButton; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoTab; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.collection.DecoList; @@ -45,7 +45,7 @@ * @since 30.06.2019 */ @DecoTemplate(name = "arithmetic_logic_machine", category = DecoGuiCategory.DATA_TILE) -public class GuiArithmeticLogicMachine extends DecoGui implements IDataMachineGui +public class GuiArithmeticLogicMachine extends DecoTileGui implements IDataMachineGui { @SyncNBT public int editedCircuit = 0; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/arithmetic_logic_machine/GuiArithmeticLogicMachineEdit.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/arithmetic_logic_machine/GuiArithmeticLogicMachineEdit.java index 913f5abcb..22e165755 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/arithmetic_logic_machine/GuiArithmeticLogicMachineEdit.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/arithmetic_logic_machine/GuiArithmeticLogicMachineEdit.java @@ -11,7 +11,7 @@ import pl.pabilo8.immersiveintelligence.api.data.types.DataTypeExpression; import pl.pabilo8.immersiveintelligence.api.data.types.generic.DataType; import pl.pabilo8.immersiveintelligence.api.data.types.generic.DataType.TypeMetaInfo; -import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoArrows; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoButton; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoDropdownDataLetters; @@ -44,7 +44,7 @@ * @since 30.06.2019 */ @DecoTemplate(name = "arithmetic_logic_machine_edit", category = DecoGuiCategory.DATA_TILE) -public class GuiArithmeticLogicMachineEdit extends DecoGui +public class GuiArithmeticLogicMachineEdit extends DecoTileGui { @SyncNBT public DataVariable variableToEdit; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_input_machine/GuiDataInputMachine.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_input_machine/GuiDataInputMachine.java index 358986636..189af4cc4 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_input_machine/GuiDataInputMachine.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_input_machine/GuiDataInputMachine.java @@ -9,7 +9,7 @@ import pl.pabilo8.immersiveintelligence.api.data.types.DataTypeNull; import pl.pabilo8.immersiveintelligence.api.data.types.generic.DataType; import pl.pabilo8.immersiveintelligence.api.data.types.generic.DataType.TypeMetaInfo; -import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.DecoComponent; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.DecoComponent.MouseButton; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoButton; @@ -42,7 +42,7 @@ * @since 30.06.2019 */ @DecoTemplate(name = "data_input_machine", category = DecoGuiCategory.DATA_TILE) -public class GuiDataInputMachine extends DecoGui implements IDataMachineGui +public class GuiDataInputMachine extends DecoTileGui implements IDataMachineGui { @DecoResource public static ResourceLocation ICON_SEND_PACKET = ResLoc.of(IIReference.RES_II, "gui/tab_icons/send_packet"); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_input_machine/GuiDataInputMachineEdit.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_input_machine/GuiDataInputMachineEdit.java index ee719ec4f..be1bb3547 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_input_machine/GuiDataInputMachineEdit.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_input_machine/GuiDataInputMachineEdit.java @@ -6,7 +6,7 @@ import pl.pabilo8.immersiveintelligence.api.data.IDataMachineGui; import pl.pabilo8.immersiveintelligence.api.data.types.generic.DataType; import pl.pabilo8.immersiveintelligence.api.data.types.generic.DataType.TypeMetaInfo; -import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoArrows; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoButton; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoDropdownDataLetters; @@ -35,7 +35,7 @@ * @since 30.06.2019 */ @DecoTemplate(name = "data_input_machine_edit", category = DecoGuiCategory.DATA_TILE) -public class GuiDataInputMachineEdit extends DecoGui implements IDataMachineGui +public class GuiDataInputMachineEdit extends DecoTileGui implements IDataMachineGui { @SyncNBT public DataVariable variableToEdit; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/emplacement/GuiEmplacement.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/emplacement/GuiEmplacement.java index 362240386..0d0c016f3 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/emplacement/GuiEmplacement.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/emplacement/GuiEmplacement.java @@ -1,7 +1,7 @@ package pl.pabilo8.immersiveintelligence.client.gui.block.emplacement; import net.minecraft.entity.player.EntityPlayer; -import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoBackgroundBuilder.SlotStyle; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoTextures; import pl.pabilo8.immersiveintelligence.common.IIGUI; @@ -12,7 +12,7 @@ * @author Pabilo8 (pabilo@iiteam.net) * @since 16.07.2021 */ -public abstract class GuiEmplacement extends DecoGui +public abstract class GuiEmplacement extends DecoTileGui { public GuiEmplacement(EntityPlayer player, TileEntityEmplacement tile, IIGUI gui) { diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/flagpole/GuiFlagpole.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/flagpole/GuiFlagpole.java index 8ad0bfec7..33ede1c38 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/flagpole/GuiFlagpole.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/flagpole/GuiFlagpole.java @@ -2,7 +2,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.math.BlockPos; -import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoCheckbox; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoSwitch; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.collection.DecoDropdown; @@ -32,7 +32,7 @@ * @since 27.12.2025 */ @DecoTemplate(name = "flagpole", category = DecoGuiCategory.TERRITORY_CONTROL_TILE) -public class GuiFlagpole extends DecoGui +public class GuiFlagpole extends DecoTileGui { @SyncNBT public boolean filterFlagpoles = true, filterWeapons = true, filterLogistics = true, filterIntelligence = true, filterWireNetworks = true; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/flagpole/GuiFlagpoleFaction.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/flagpole/GuiFlagpoleFaction.java index 8a3526515..91fc6ebd4 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/flagpole/GuiFlagpoleFaction.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/flagpole/GuiFlagpoleFaction.java @@ -5,7 +5,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemBanner; import net.minecraft.item.ItemStack; -import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoButton; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoSwitch; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.collection.DecoDropdown; @@ -43,7 +43,7 @@ * @since 27.12.2025 */ @DecoTemplate(name = "flagpole_faction", category = DecoGuiCategory.TERRITORY_CONTROL_TILE) -public class GuiFlagpoleFaction extends DecoGui +public class GuiFlagpoleFaction extends DecoTileGui { private String factionName = null; private IIColor factionColor = null; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/inserter/GuiInserter.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/inserter/GuiInserter.java index 0ac030ba7..7a42359dc 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/inserter/GuiInserter.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/inserter/GuiInserter.java @@ -5,7 +5,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; -import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.collection.DecoDropdown; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.collection.DecoElementDisplays; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.label.DecoLabel; @@ -41,7 +41,7 @@ * @since 20.01.2026 */ @DecoTemplate(name = "inserter", category = DecoGuiCategory.DATA_TILE) -public class GuiInserter extends DecoGui +public class GuiInserter extends DecoTileGui { private static final String INSERTER_KEY = IIReference.GUI_LABEL_KEY+"inserter."; private ListMode mode = ListMode.TASKS; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/packer/GuiPacker.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/packer/GuiPacker.java index 442cae8ad..618a5df60 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/packer/GuiPacker.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/packer/GuiPacker.java @@ -8,7 +8,7 @@ import pl.pabilo8.immersiveintelligence.api.PackerHandler; import pl.pabilo8.immersiveintelligence.api.PackerHandler.PackerActionType; import pl.pabilo8.immersiveintelligence.api.PackerHandler.PackerTask; -import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoButton; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoCheckbox; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.collection.DecoDropdown; @@ -53,7 +53,7 @@ * @since 25.08.2022 */ @DecoTemplate(name = "packer", category = DecoGuiCategory.DATA_TILE) -public class GuiPacker extends DecoGui +public class GuiPacker extends DecoTileGui { @DecoResource public static ResourceLocation ICON_LABELER = ResLoc.of(RES_II, "gui/upgrade/packer_naming"); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/packer/GuiPackerLabeler.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/packer/GuiPackerLabeler.java index 1a308e572..c23bd49b1 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/packer/GuiPackerLabeler.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/packer/GuiPackerLabeler.java @@ -6,7 +6,7 @@ import net.minecraft.nbt.NBTTagCompound; import pl.pabilo8.immersiveintelligence.api.LogisticTag; import pl.pabilo8.immersiveintelligence.api.PackerHandler.LabelingTask; -import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoButton; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoCheckbox; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.label.DecoLabel; @@ -45,7 +45,7 @@ * @since 25.08.2022 */ @DecoTemplate(name = "packer_labeler", category = DecoGuiCategory.DATA_TILE) -public class GuiPackerLabeler extends DecoGui +public class GuiPackerLabeler extends DecoTileGui { @SyncNBT(events = SyncEvents.TILE_CLIENT_MESSAGE) public EasyCollection labels; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/radar/GuiRadar.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/radar/GuiRadar.java index e69893f19..f21ab26a2 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/radar/GuiRadar.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/radar/GuiRadar.java @@ -7,7 +7,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; -import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoCheckbox; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoBar; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.visual.DecoMapDisplay; @@ -34,7 +34,7 @@ * @since 28.04.2023 */ @DecoTemplate(name = "radar", category = DecoGuiCategory.TERRITORY_CONTROL_TILE) -public class GuiRadar extends DecoGui +public class GuiRadar extends DecoTileGui { @DecoResource public static ResourceLocation ICON_RADAR = ResLoc.of(IIReference.RES_II, "gui/tab_icons/radar"); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/radar/GuiRadarConfig.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/radar/GuiRadarConfig.java index 0e01b00b5..6afff2b45 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/radar/GuiRadarConfig.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/radar/GuiRadarConfig.java @@ -1,7 +1,7 @@ package pl.pabilo8.immersiveintelligence.client.gui.block.radar; import net.minecraft.entity.player.EntityPlayer; -import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoBackgroundBuilder.SlotStyle; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoGuiCategory; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoTemplate; @@ -15,7 +15,7 @@ * @since 28.04.2023 */ @DecoTemplate(name = "radar_config", category = DecoGuiCategory.TERRITORY_CONTROL_TILE) -public class GuiRadarConfig extends DecoGui +public class GuiRadarConfig extends DecoTileGui { public GuiRadarConfig(EntityPlayer player, TileEntityRadar tile) { diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/radar/GuiRadarTargets.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/radar/GuiRadarTargets.java index d33aa0f9c..82b3b62c5 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/radar/GuiRadarTargets.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/radar/GuiRadarTargets.java @@ -1,7 +1,7 @@ package pl.pabilo8.immersiveintelligence.client.gui.block.radar; import net.minecraft.entity.player.EntityPlayer; -import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoBackgroundBuilder.SlotStyle; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoGuiCategory; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoTemplate; @@ -15,7 +15,7 @@ * @since 28.04.2023 */ @DecoTemplate(name = "radar_targets", category = DecoGuiCategory.TERRITORY_CONTROL_TILE) -public class GuiRadarTargets extends DecoGui +public class GuiRadarTargets extends DecoTileGui { public GuiRadarTargets(EntityPlayer player, TileEntityRadar tile) { diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/DecoEntityGui.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/DecoEntityGui.java new file mode 100644 index 000000000..f1d6c69bb --- /dev/null +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/DecoEntityGui.java @@ -0,0 +1,68 @@ +package pl.pabilo8.immersiveintelligence.client.gui.deco; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import pl.pabilo8.immersiveintelligence.api.style.IStyleCustomizable; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.widget.DecoManualWidget; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.widget.DecoStyleWidget; +import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoGuiCategory; +import pl.pabilo8.immersiveintelligence.common.IIGUI; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.EasyNBT; + +/** + * Deco GUI backed by an Entity. + *

+ * The concrete entity GUI supplies its container directly, because IIGUI currently has tile and item factories only. + * Entity sync is intentionally left to concrete subclasses until a project-wide entity GUI packet exists. + *

+ */ +public abstract class DecoEntityGui extends DecoGui +{ + protected final E entity; + + public DecoEntityGui(EntityPlayer player, E entity, IIGUI iigui) + { + //noinspection unchecked + super(player, (C)iigui.containerFromEntity.apply(player, entity), entity, iigui); + this.entity = entity; + } + + @Override + protected void onInitStandardAddons() + { + if(category==DecoGuiCategory.VEHICLE_ENTITY) + addWidget(new DecoManualWidget()); + if(entity instanceof IStyleCustomizable) + addWidget(new DecoStyleWidget(((IStyleCustomizable)entity))); + } + + @Override + protected boolean isStoredGuiDataValid(EasyNBT nbt) + { + if(!super.isStoredGuiDataValid(nbt)||entity==null) + return false; + final boolean[] valid = {false}; + nbt.checkSetString("entity", s -> valid[0] = getEntityGuiKey().equals(s)); + return valid[0]; + } + + @Override + protected EasyNBT createGuiDataTag() + { + EasyNBT nbt = super.createGuiDataTag(); + if(entity!=null) + nbt.withString("entity", getEntityGuiKey()); + return nbt; + } + + protected String getEntityGuiKey() + { + return entity.dimension+":"+entity.getEntityId(); + } + + public E getEntity() + { + return entity; + } +} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/DecoGui.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/DecoGui.java index 8dd429838..3b9054521 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/DecoGui.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/DecoGui.java @@ -1,10 +1,7 @@ package pl.pabilo8.immersiveintelligence.client.gui.deco; import blusunrize.immersiveengineering.api.ApiUtils; -import blusunrize.immersiveengineering.api.DimensionBlockPos; import blusunrize.immersiveengineering.client.ClientUtils; -import blusunrize.immersiveengineering.common.blocks.TileEntityIEBase; -import blusunrize.immersiveengineering.common.util.inventory.IIEInventory; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiLabel; @@ -16,6 +13,7 @@ import net.minecraft.client.shader.Framebuffer; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; import net.minecraft.util.text.ITextComponent; @@ -33,7 +31,6 @@ import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; import pl.pabilo8.immersiveintelligence.ImmersiveIntelligence; -import pl.pabilo8.immersiveintelligence.api.style.IStyleCustomizable; import pl.pabilo8.immersiveintelligence.client.ClientProxy; import pl.pabilo8.immersiveintelligence.client.IIClientUtils; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.DecoComponent; @@ -42,26 +39,17 @@ import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoTab; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.label.DecoLabel; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.widget.DecoComponentWidgetBase; -import pl.pabilo8.immersiveintelligence.client.gui.deco.component.widget.DecoManualWidget; -import pl.pabilo8.immersiveintelligence.client.gui.deco.component.widget.DecoOwnershipWidget; -import pl.pabilo8.immersiveintelligence.client.gui.deco.component.widget.DecoStyleWidget; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.*; import pl.pabilo8.immersiveintelligence.client.render.IReloadableModelContainer; import pl.pabilo8.immersiveintelligence.client.util.amt.AMTUtils; import pl.pabilo8.immersiveintelligence.common.IIGUI; import pl.pabilo8.immersiveintelligence.common.IILogger; import pl.pabilo8.immersiveintelligence.common.network.IIPacketHandler; -import pl.pabilo8.immersiveintelligence.common.network.messages.MessageBooleanAnimatedPartsSync; import pl.pabilo8.immersiveintelligence.common.network.messages.MessageGuiNBT; -import pl.pabilo8.immersiveintelligence.common.network.messages.MessageIITileSync; import pl.pabilo8.immersiveintelligence.common.util.IIReference; import pl.pabilo8.immersiveintelligence.common.util.ResLoc; -import pl.pabilo8.immersiveintelligence.common.util.diplomacy.property.IOwnableProperty; import pl.pabilo8.immersiveintelligence.common.util.easynbt.EasyNBT; import pl.pabilo8.immersiveintelligence.common.util.easynbt.NBTSerialisation; -import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT.SyncEvents; -import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIBase; -import pl.pabilo8.immersiveintelligence.common.util.multiblock.util.MultiblockInteractablePart; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -78,47 +66,43 @@ import java.util.function.Supplier; /** + * Common base for Deco GUIs. *

- * Introducing Deco, Immersive Intelligence's new GUI framework designed to be - *

    - *
  • Dynamic
  • - *
  • Elegant
  • - *
  • Compact
  • - *
  • Optimized
  • - *
- * Offering a variety of {@link pl.pabilo8.immersiveintelligence.client.gui.deco.component components}, - * {@link pl.pabilo8.immersiveintelligence.client.gui.deco.component.widget widgets} and a tile-based - * {@link DecoBackgroundBuilder} to make GUI creation easier and more efficient + * This class owns the reusable GUI mechanics: component lifecycle, widgets, labels, tooltips, + * value listeners, background drawing, JEI taken-space data and GUI screenshot export. + * Context-specific behaviour is supplied by subclasses such as {@link DecoTileGui}, + * {@link DecoEntityGui} and {@link DecoItemGui}. *

- * Class for advanced GUIs that store data in the client proxy NBT and use components for their display
- * Use annotation {@link DecoTemplate} to specify traits + * Use annotation {@link DecoTemplate} to specify traits. * * @author Pabilo8 (pabilo@iiteam.net) * @since 04.01.2025 */ -public abstract class DecoGui> extends GuiContainer +@SuppressWarnings({"rawtypes", "unchecked"}) +public abstract class DecoGui extends GuiContainer { private static final int MAX_WIDGET_TIME = 40; + private static final String NBT_GUI_NAME = "decoGui"; //Gui basics protected final String name; - protected final T tile; + protected final T context; protected final C container; protected final DecoGuiCategory category; protected final InventoryPlayer playerContainer; + protected final IIGUI gui; //Components protected final List tabList = new ArrayList<>(); protected final List widgetTabList = new ArrayList<>(); private final List> widgetList = new ArrayList<>(); private final List> valueListeners = new ArrayList<>(); - private final IIGUI gui; /** - * if true, the GUI won't perform saving to NBT during {@link #onGuiClosed()}, used for transitions between GUIs + * if true, the GUI won't perform default closing cleanup during {@link #onGuiClosed()}, used for transitions between GUIs */ protected boolean changeGUIFlag = false, refreshGUIFlag = false; //Background - private DecoBackgroundBuilder backgroundBuilder; + private DecoBackgroundBuilder backgroundBuilder; private List takenSpace; private DecoComponent focusedElement; private DecoComponent hoveredElement; @@ -130,26 +114,15 @@ public abstract class DecoGui)button).setParentGUI(this); for(DecoComponentWidgetBase widget : widgetList) widget.setParentGUI(this); - - } /** @@ -246,12 +217,15 @@ public final void initGui() */ protected void onInitStandardAddons() { - if(category==DecoGuiCategory.DATA_TILE||category==DecoGuiCategory.PRODUCTION_TILE||category==DecoGuiCategory.TERRITORY_CONTROL_TILE) - addWidget(new DecoManualWidget()); - if(tile instanceof IOwnableProperty) - addWidget(new DecoOwnershipWidget(((IOwnableProperty)tile))); - if(tile instanceof IStyleCustomizable) - addWidget(new DecoStyleWidget(((IStyleCustomizable)tile))); + + } + + /** + * Called when no {@link DecoBackgroundBuilder} was supplied. + */ + protected void onNoBackgroundBuilder() + { + xSize = ySize = 64; } /** @@ -427,7 +401,7 @@ protected final DecoLabel addLabel(DecoLabel label) */ protected DecoBackgroundBuilder startBackground() { - return this.backgroundBuilder = new DecoBackgroundBuilder<>(this); + return this.backgroundBuilder = new DecoBackgroundBuilder(this); } //--- GUI Rendering Methods ---// @@ -460,15 +434,7 @@ public void drawScreen(int mouseX, int mouseY, float partialTicks) { if(refreshGUIFlag) { - if(backgroundBuilder!=null) - backgroundBuilder.cleanup(); - //Cleanup components - for(GuiButton b : buttonList) - if(b instanceof DecoComponent) - ((DecoComponent)b).cleanup(); - //Cleanup widgets - for(DecoComponentWidgetBase widget : widgetList) - widget.cleanup(); + cleanupDecoGui(); initGui(); refreshGUIFlag = false; } @@ -690,27 +656,26 @@ protected final void mouseClickMove(int mouseX, int mouseY, int clickedMouseButt } /** - * Triggered upon closing the GUI. Saves the GUI data to {@link ClientProxy} and (optionally) sends a sync message to the tile entity. + * Triggered upon closing the GUI. Saves the GUI data to {@link ClientProxy} and delegates context-specific sync to subclasses. */ @Override public void onGuiClosed() { super.onGuiClosed(); - //Save GUI data if(!changeGUIFlag) { - //Send an NBT sync message to the tile entity - EasyNBT nbt = onSaveTileData(); - if(!nbt.isEmpty()) - IIPacketHandler.sendToServer(new MessageIITileSync(tile, nbt)); - //Clean stored data - ((ClientProxy)ImmersiveIntelligence.proxy).setStoredGuiData(); + onGuiClosedWithoutTransition(); + clearStoredGuiData(); } else saveGuiData(); - //Perform background and component cleanup + cleanupDecoGui(); + } + + protected void cleanupDecoGui() + { if(backgroundBuilder!=null) backgroundBuilder.cleanup(); for(GuiButton b : buttonList) @@ -721,6 +686,14 @@ public void onGuiClosed() widget.cleanup(); } + /** + * Called when the GUI is closed normally, not when it is changing to another GUI. + */ + protected void onGuiClosedWithoutTransition() + { + + } + //--- Component Events ---// protected List getTooltip() @@ -763,19 +736,16 @@ public void requestFocus(DecoComponent component) //--- NBT ---// /** - * Called upon start and synchronisation, loads the data from the client proxy + * Called upon start and synchronisation, loads the data from the client proxy. * * @return The NBT compound containing the data */ - private EasyNBT loadGuiData() + protected EasyNBT loadGuiData() { - //Load GUI data from the proxy - assert ImmersiveIntelligence.proxy instanceof ClientProxy; - ClientProxy proxy = (ClientProxy)ImmersiveIntelligence.proxy; + ClientProxy proxy = getClientProxy(); EasyNBT nbt = proxy.getStoredGuiData(); - //Return a valid compound or an empty one if location mismatch - if(!nbt.hasKey("pos")||!new DimensionBlockPos(tile).equals(nbt.getDimPos("pos"))) + if(!isStoredGuiDataValid(nbt)) return proxy.setStoredGuiData(); //Deserialize all SyncNBT fields @@ -784,17 +754,24 @@ private EasyNBT loadGuiData() return nbt; } + /** + * Checks whether stored GUI NBT belongs to this GUI instance. + */ + protected boolean isStoredGuiDataValid(EasyNBT nbt) + { + final boolean[] valid = {false}; + nbt.checkSetString(NBT_GUI_NAME, s -> valid[0] = s.equals(name)); + return valid[0]; + } + /** * Called upon closing the GUI, gathers and saves the data to the client proxy. * * @return The NBT compound containing the data */ - private EasyNBT saveGuiData() + protected EasyNBT saveGuiData() { - //Save basic identification - assert ImmersiveIntelligence.proxy instanceof ClientProxy; - EasyNBT nbt = ((ClientProxy)ImmersiveIntelligence.proxy).setStoredGuiData() - .withDimPos("pos", new DimensionBlockPos(tile)); + EasyNBT nbt = createGuiDataTag(); //Save component data for(GuiButton button : buttonList) @@ -812,15 +789,23 @@ private EasyNBT saveGuiData() } /** - * Called upon closing the GUI, collects data to be passed in a {@link MessageIITileSync} to the tile entity. - * - * @return The NBT compound containing the data + * Creates the client-side GUI persistence tag. Subclasses add their own identity keys here. */ - protected EasyNBT onSaveTileData() + protected EasyNBT createGuiDataTag() { - EasyNBT nbt = EasyNBT.newNBT(); - NBTSerialisation.synchroniseFor(this, (tag, gui) -> tag.serializeForEvent(gui, nbt.unwrap(), SyncEvents.TILE_CLIENT_MESSAGE)); - return nbt; + return getClientProxy().setStoredGuiData() + .withString(NBT_GUI_NAME, name); + } + + protected final void clearStoredGuiData() + { + getClientProxy().setStoredGuiData(); + } + + protected final ClientProxy getClientProxy() + { + assert ImmersiveIntelligence.proxy instanceof ClientProxy; + return (ClientProxy)ImmersiveIntelligence.proxy; } @Nullable @@ -867,8 +852,11 @@ public final List getTakenSpace() List takenSpace = new ArrayList<>(); //Add rectangles from the background builder if(backgroundBuilder!=null) - for(DecoBackgroundTile rect : backgroundBuilder.getTakenSpace()) + for(Object object : backgroundBuilder.getTakenSpace()) + { + DecoBackgroundTile rect = (DecoBackgroundTile)object; takenSpace.add(new Rectangle(guiLeft+rect.x, guiTop+rect.y, rect.width, rect.height)); + } //Add rectangles for each tab for(DecoTab tab : tabList) @@ -880,27 +868,14 @@ public final List getTakenSpace() //Previous widget takenSpace.add(new Rectangle(0, 0, 0, 0)); - //Current wigdet + //Current widget takenSpace.add(new Rectangle(0, 0, 0, 0)); return this.takenSpace = takenSpace; } - /** - * @return the tile entity associated with this GUI - */ - public T getTile() - { - return tile; - } - //--- Utilities ---// - public void syncAnimatedParts(MultiblockInteractablePart part, boolean state) - { - IIPacketHandler.sendToServer(new MessageBooleanAnimatedPartsSync(part.getID(), state, tile)); - } - public final boolean refreshGUI() { return changeGUI(this.gui); @@ -925,32 +900,45 @@ public final boolean changeGUI(@Nullable IIGUI newGUI) } /** - * Changes the GUI to the specified one, ensuring data is saved and sent to the server + * Changes the GUI to the specified one, ensuring data is saved and sent to the server. * - * @param newGUI the new GUI to change to, null will close the current GUI - * @param guiData additional data to save for the GUI - * @param tileData additional data to save for the tile entity + * @param newGUI the new GUI to change to, null will close the current GUI + * @param guiData additional data to save for the GUI + * @param contextData additional data to save for the backing object */ - public final boolean changeGUI(@Nullable IIGUI newGUI, @Nullable EasyNBT guiData, @Nullable EasyNBT tileData) + public final boolean changeGUI(@Nullable IIGUI newGUI, @Nullable EasyNBT guiData, @Nullable EasyNBT contextData) { //Switch the Change GUI flag to prevent double saving this.changeGUIFlag = true; - //Save Tile Entity data - EasyNBT nbt = onSaveTileData().conditionally(tileData!=null, e -> e.mergeWith(tileData)); - if(!nbt.isEmpty()) - IIPacketHandler.sendToServer(new MessageIITileSync(tile, nbt)); + //Save context-specific data first + onBeforeGuiChange(contextData); //Save GUI data saveGuiData().conditionally(guiData!=null, e -> e.mergeWith(guiData)); - //Send change GUI message + return sendGuiChangeMessage(newGUI); + } + + /** + * Gives subclasses a chance to sync their backing object before a GUI transition. + */ + protected void onBeforeGuiChange(@Nullable EasyNBT contextData) + { + + } + + /** + * Sends the actual GUI transition message. + */ + protected boolean sendGuiChangeMessage(@Nullable IIGUI newGUI) + { if(newGUI==null) IIPacketHandler.sendToServer(MessageGuiNBT.closeGuiMessage()); - else if(newGUI!=gui) - IIPacketHandler.sendToServer(new MessageGuiNBT(newGUI, tile)); - else + else if(newGUI==gui) refreshGUIFlag = true; + else + return false; return true; } @@ -1056,8 +1044,9 @@ private void exportCurrentGui() //Draw widgets drawWidgets(0, 0, 0); - //Draw tiled background, - backgroundBuilder.draw(); + //Draw tiled background, if present + if(backgroundBuilder!=null) + backgroundBuilder.draw(); GlStateManager.color(1f, 1f, 1f, 1f); GlStateManager.enableAlpha(); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/DecoHelpBox.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/DecoHelpBox.java deleted file mode 100644 index be907af4d..000000000 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/DecoHelpBox.java +++ /dev/null @@ -1,51 +0,0 @@ -package pl.pabilo8.immersiveintelligence.client.gui.deco; - -import net.minecraft.client.gui.GuiButton; -import net.minecraft.client.resources.I18n; - -/** - * A class for displaying help information when hovering over a part of the gui - * - * @author Pabilo8 (pabilo@iiteam.net) - * @since 19.01.2024 - */ -public class DecoHelpBox -{ - /** - * The x position of the box - */ - public int x; - /** - * The y position of the box - */ - public int y; - /** - * The width of the box - */ - public int width; - /** - * The height of the box - */ - public int height; - /** - * The translated text to display in the box - */ - public String text; - - public DecoHelpBox(int x, int y, int width, int height, String helpText) - { - this.x = x; - this.y = y; - this.width = width; - this.height = height; - this.text = I18n.format(helpText); - } - - /** - * @param gui component this box is attached to - */ - public DecoHelpBox(GuiButton gui, String helpText) - { - this(gui.x, gui.y, gui.width, gui.height, helpText); - } -} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/DecoItemGui.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/DecoItemGui.java new file mode 100644 index 000000000..3a67620ef --- /dev/null +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/DecoItemGui.java @@ -0,0 +1,66 @@ +package pl.pabilo8.immersiveintelligence.client.gui.deco; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumHand; +import pl.pabilo8.immersiveintelligence.common.IIGUI; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.EasyNBT; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIItemBase; + +/** + * Deco GUI backed by an ItemStack and a {@link ContainerIIItemBase}. + */ +public abstract class DecoItemGui extends DecoGui +{ + protected final ItemStack itemStack; + protected final EnumHand hand; + + public DecoItemGui(EntityPlayer player, ItemStack heldStack, EnumHand hand, IIGUI iigui) + { + super(player, createContainer(player, heldStack, hand, iigui), heldStack==null?ItemStack.EMPTY: heldStack, iigui); + this.itemStack = heldStack==null?ItemStack.EMPTY: heldStack; + this.hand = hand; + } + + @SuppressWarnings("unchecked") + private static C createContainer(EntityPlayer player, ItemStack heldStack, EnumHand hand, IIGUI iigui) + { + return player==null||heldStack==null||hand==null||iigui.containerFromStack==null?null: + (C)iigui.containerFromStack.apply(player, heldStack, hand); + } + + @Override + protected void onNoBackgroundBuilder() + { + // Item GUIs often use a hand-drawn texture and set xSize/ySize in onInit(). + } + + @Override + protected boolean isStoredGuiDataValid(EasyNBT nbt) + { + if(!super.isStoredGuiDataValid(nbt)||hand==null) + return false; + final boolean[] valid = {false}; + nbt.checkSetString("hand", s -> valid[0] = hand.name().equals(s)); + return valid[0]; + } + + @Override + protected EasyNBT createGuiDataTag() + { + EasyNBT nbt = super.createGuiDataTag(); + if(hand!=null) + nbt.withString("hand", hand.name()); + return nbt; + } + + public ItemStack getItemStack() + { + return itemStack; + } + + public EnumHand getHand() + { + return hand; + } +} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/DecoTileGui.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/DecoTileGui.java new file mode 100644 index 000000000..328010e25 --- /dev/null +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/DecoTileGui.java @@ -0,0 +1,121 @@ +package pl.pabilo8.immersiveintelligence.client.gui.deco; + +import blusunrize.immersiveengineering.api.DimensionBlockPos; +import blusunrize.immersiveengineering.common.blocks.TileEntityIEBase; +import blusunrize.immersiveengineering.common.util.inventory.IIEInventory; +import net.minecraft.entity.player.EntityPlayer; +import pl.pabilo8.immersiveintelligence.api.style.IStyleCustomizable; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.widget.DecoManualWidget; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.widget.DecoOwnershipWidget; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.widget.DecoStyleWidget; +import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoGuiCategory; +import pl.pabilo8.immersiveintelligence.common.IIGUI; +import pl.pabilo8.immersiveintelligence.common.network.IIPacketHandler; +import pl.pabilo8.immersiveintelligence.common.network.messages.MessageBooleanAnimatedPartsSync; +import pl.pabilo8.immersiveintelligence.common.network.messages.MessageGuiNBT; +import pl.pabilo8.immersiveintelligence.common.network.messages.MessageIITileSync; +import pl.pabilo8.immersiveintelligence.common.util.diplomacy.property.IOwnableProperty; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.EasyNBT; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.NBTSerialisation; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT.SyncEvents; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; +import pl.pabilo8.immersiveintelligence.common.util.multiblock.util.MultiblockInteractablePart; + +import javax.annotation.Nullable; + +/** + * Deco GUI backed by a TileEntity. + */ +public abstract class DecoTileGui> extends DecoGui +{ + protected final T tile; + + public DecoTileGui(EntityPlayer player, T tile, IIGUI iigui) + { + super(player, createContainer(player, tile, iigui), tile, iigui); + this.tile = tile; + } + + @SuppressWarnings("unchecked") + private static > C createContainer(EntityPlayer player, T tile, IIGUI iigui) + { + return player==null?null: (C)iigui.containerFromTile.apply(player, tile); + } + + @Override + protected void onInitStandardAddons() + { + if(category==DecoGuiCategory.DATA_TILE||category==DecoGuiCategory.PRODUCTION_TILE||category==DecoGuiCategory.TERRITORY_CONTROL_TILE) + addWidget(new DecoManualWidget()); + if(tile instanceof IOwnableProperty) + addWidget(new DecoOwnershipWidget(((IOwnableProperty)tile))); + if(tile instanceof IStyleCustomizable) + addWidget(new DecoStyleWidget(((IStyleCustomizable)tile))); + } + + @Override + protected boolean isStoredGuiDataValid(EasyNBT nbt) + { + return tile!=null&&nbt.hasKey("pos")&&new DimensionBlockPos(tile).equals(nbt.getDimPos("pos")); + } + + @Override + protected EasyNBT createGuiDataTag() + { + return super.createGuiDataTag() + .withDimPos("pos", new DimensionBlockPos(tile)); + } + + @Override + protected void onGuiClosedWithoutTransition() + { + EasyNBT nbt = onSaveTileData(); + if(!nbt.isEmpty()) + IIPacketHandler.sendToServer(new MessageIITileSync(tile, nbt)); + } + + @Override + protected void onBeforeGuiChange(@Nullable EasyNBT tileData) + { + EasyNBT nbt = onSaveTileData().conditionally(tileData!=null, e -> e.mergeWith(tileData)); + if(!nbt.isEmpty()) + IIPacketHandler.sendToServer(new MessageIITileSync(tile, nbt)); + } + + @Override + protected boolean sendGuiChangeMessage(@Nullable IIGUI newGUI) + { + if(newGUI==null) + IIPacketHandler.sendToServer(MessageGuiNBT.closeGuiMessage()); + else if(newGUI!=gui) + IIPacketHandler.sendToServer(new MessageGuiNBT(newGUI, tile)); + else + refreshGUIFlag = true; + return true; + } + + /** + * Called upon closing or changing the GUI, collects data to be passed in a {@link MessageIITileSync} to the tile entity. + * + * @return The NBT compound containing the data + */ + protected EasyNBT onSaveTileData() + { + EasyNBT nbt = EasyNBT.newNBT(); + NBTSerialisation.synchroniseFor(this, (tag, gui) -> tag.serializeForEvent(gui, nbt.unwrap(), SyncEvents.TILE_CLIENT_MESSAGE)); + return nbt; + } + + /** + * @return the tile entity associated with this GUI + */ + public T getTile() + { + return tile; + } + + public void syncAnimatedParts(MultiblockInteractablePart part, boolean state) + { + IIPacketHandler.sendToServer(new MessageBooleanAnimatedPartsSync(part.getID(), state, tile)); + } +} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/DecoComponent.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/DecoComponent.java index 80b383bbb..a1e19079d 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/DecoComponent.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/DecoComponent.java @@ -1,14 +1,12 @@ package pl.pabilo8.immersiveintelligence.client.gui.deco.component; import blusunrize.immersiveengineering.client.ClientUtils; -import blusunrize.immersiveengineering.common.blocks.TileEntityIEBase; -import blusunrize.immersiveengineering.common.util.inventory.IIEInventory; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.resources.I18n; +import net.minecraft.inventory.Container; import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; import pl.pabilo8.immersiveintelligence.common.util.IIMath; -import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIBase; import javax.annotation.Nullable; import java.util.*; @@ -80,7 +78,7 @@ public List getTooltip() //--- Property Setters ---// - public > void setParentGUI(DecoGui parent) + public void setParentGUI(DecoGui parent) { this.parentGui = parent; this.x += parent.guiLeft; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/panel/DecoPanel.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/panel/DecoPanel.java index af53cd5a0..a4aa203df 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/panel/DecoPanel.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/panel/DecoPanel.java @@ -1,13 +1,12 @@ package pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel; import blusunrize.immersiveengineering.client.ClientUtils; -import blusunrize.immersiveengineering.common.blocks.TileEntityIEBase; -import blusunrize.immersiveengineering.common.util.inventory.IIEInventory; 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.texture.TextureAtlasSprite; import net.minecraft.client.resources.I18n; +import net.minecraft.inventory.Container; import org.lwjgl.opengl.GL11; import pl.pabilo8.immersiveintelligence.client.IIClientUtils; import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; @@ -20,7 +19,6 @@ import pl.pabilo8.immersiveintelligence.client.util.IIDrawUtils; import pl.pabilo8.immersiveintelligence.common.util.IIColor; import pl.pabilo8.immersiveintelligence.common.util.ResLoc; -import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIBase; import javax.annotation.Nullable; import java.util.ArrayList; @@ -50,7 +48,7 @@ public DecoPanel(int x, int y) } @Override - public > void setParentGUI(DecoGui parent) + public void setParentGUI(DecoGui parent) { super.setParentGUI(parent); for(DecoLabel label : labels) diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/widget/DecoStyleWidget.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/widget/DecoStyleWidget.java index ba0592c0a..40c02db62 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/widget/DecoStyleWidget.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/widget/DecoStyleWidget.java @@ -2,15 +2,19 @@ import blusunrize.immersiveengineering.common.blocks.TileEntityIEBase; import net.minecraft.client.resources.I18n; +import net.minecraft.entity.Entity; import net.minecraft.util.text.TextFormatting; import pl.pabilo8.immersiveintelligence.api.style.IStyleCustomizable; +import pl.pabilo8.immersiveintelligence.api.style.StyleConstraints.PaintStyleConstraint; import pl.pabilo8.immersiveintelligence.api.style.StyleCustomization; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoColorPicker; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoTab; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.collection.DecoDropdown; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.label.DecoLabel; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoAlignment; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoTextures; import pl.pabilo8.immersiveintelligence.common.network.IIPacketHandler; +import pl.pabilo8.immersiveintelligence.common.network.messages.MessageEntityNBTSync; import pl.pabilo8.immersiveintelligence.common.network.messages.MessageIITileSync; import pl.pabilo8.immersiveintelligence.common.util.IIColor; import pl.pabilo8.immersiveintelligence.common.util.IIReference; @@ -23,14 +27,14 @@ */ public class DecoStyleWidget extends DecoComponentWidgetBase { - private final IStyleCustomizable tile; + private final IStyleCustomizable customizable; private final StyleCustomization style; - public DecoStyleWidget(IStyleCustomizable tile) + public DecoStyleWidget(IStyleCustomizable customizable) { super(); - this.tile = tile; - this.style = tile.getStyle(); + this.customizable = customizable; + this.style = customizable.getStyle(); withSize(128, 128+32); withBackground(DecoTextures.BG_PAPER); withBackgroundMask(DecoTextures.TEMPLATE_PAPER); @@ -57,12 +61,35 @@ protected boolean initialize() .withBackground(DecoTextures.COMPONENT_BUTTON_PAPER) .withDropdownSymbol(DecoTextures.COMPONENT_DROPDOWN_SYMBOL_PAPER) .withOnSelectedEntry((oldStyle, newStyle) -> { - tile.getStyle().withStyle(newStyle); - IIPacketHandler.sendToServer(new MessageIITileSync((TileEntityIEBase)tile, EasyNBT.newNBT() - .withTag("style", tile.getStyle().serializeNBT()).unwrap() - )); + customizable.getStyle().withStyle(newStyle); + //Notify the server side of the new style + if(customizable instanceof TileEntityIEBase) + IIPacketHandler.sendToServer(new MessageIITileSync((TileEntityIEBase)customizable, EasyNBT.newNBT() + .withTag("style", customizable.getStyle().serializeNBT()).unwrap() + )); + else if(customizable instanceof Entity) + IIPacketHandler.sendToServer(new MessageEntityNBTSync((Entity)customizable, EasyNBT.newNBT() + .withTag("style", customizable.getStyle().serializeNBT()).unwrap() + )); }) ); + if(style.getConstraints().getColorCustomization()!=PaintStyleConstraint.NOT_APPLICABLE) + addComponent(new DecoColorPicker(32, 10+16+headInfo.getTotalHeight()) + .withWidth(width-32-4) + .withColor(style.getColor()) + .withOnColorChanged(newColor -> { + customizable.getStyle().withColor(newColor); + //Notify the server side of the new color + if(customizable instanceof TileEntityIEBase) + IIPacketHandler.sendToServer(new MessageIITileSync((TileEntityIEBase)customizable, EasyNBT.newNBT() + .withTag("style", customizable.getStyle().serializeNBT()).unwrap() + )); + else if(customizable instanceof Entity) + IIPacketHandler.sendToServer(new MessageEntityNBTSync((Entity)customizable, EasyNBT.newNBT() + .withTag("style", customizable.getStyle().serializeNBT()).unwrap() + )); + }) + ); return true; } return false; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/util/DecoBackgroundBuilder.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/util/DecoBackgroundBuilder.java index 5a094bdc1..cf3f54a13 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/util/DecoBackgroundBuilder.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/util/DecoBackgroundBuilder.java @@ -2,13 +2,14 @@ import blusunrize.immersiveengineering.client.ClientUtils; import blusunrize.immersiveengineering.common.blocks.TileEntityIEBase; -import blusunrize.immersiveengineering.common.util.inventory.IIEInventory; import net.minecraft.block.state.IBlockState; 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.texture.TextureAtlasSprite; import net.minecraft.client.resources.I18n; +import net.minecraft.entity.Entity; +import net.minecraft.inventory.Container; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; @@ -23,7 +24,6 @@ import pl.pabilo8.immersiveintelligence.client.util.IIDrawUtils; import pl.pabilo8.immersiveintelligence.common.util.IIColor; import pl.pabilo8.immersiveintelligence.common.util.ResLoc; -import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIBase; import javax.annotation.Nonnull; import java.util.ArrayList; @@ -38,7 +38,7 @@ * @ii-approved 0.3.1 * @since 07.01.2025 **/ -public class DecoBackgroundBuilder> +public class DecoBackgroundBuilder { private final List> backgroundTiles = new ArrayList<>(); private final List backgroundFrames = new ArrayList<>(); @@ -241,23 +241,34 @@ public DecoBackgroundBuilder withTitleBar(String title) /** * Adds a title bar component to the GUI * - * @param tile tile to get the title from + * @param type type to get the title from */ - public DecoBackgroundBuilder withTitleBar(T tile) + public DecoBackgroundBuilder withTitleBar(T type) { - ITextComponent displayName = tile.getDisplayName(); - if(displayName==null&&tile.hasWorld()) + ITextComponent displayName = null; + if(type instanceof TileEntityIEBase) { - World world = tile.getWorld(); - BlockPos pos = tile.getPos(); - if(world.isBlockLoaded(pos)) + TileEntityIEBase tile = (TileEntityIEBase)type; + displayName = tile.getDisplayName(); + if(displayName==null&&tile.hasWorld()) { - IBlockState state = world.getBlockState(tile.getPos()); - displayName = new TextComponentString(new ItemStack(state.getBlock(), 1, state.getBlock().getMetaFromState(state)).getDisplayName()); + World world = tile.getWorld(); + BlockPos pos = tile.getPos(); + if(world.isBlockLoaded(pos)) + { + IBlockState state = world.getBlockState(tile.getPos()); + displayName = new TextComponentString(new ItemStack(state.getBlock(), 1, state.getBlock().getMetaFromState(state)).getDisplayName()); + } } - } - return withTitleBar(displayName.getUnformattedText(), DecoAlignment.TOP); + else if(type instanceof ItemStack) + displayName = new TextComponentString(((ItemStack)type).getDisplayName()); + else if(type instanceof Entity) + displayName = ((Entity)type).getDisplayName(); + + if(displayName!=null) + return withTitleBar(displayName.getUnformattedText(), DecoAlignment.TOP); + return this; } /** diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/util/DecoGuiCategory.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/util/DecoGuiCategory.java index 4ad7e46b0..210595821 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/util/DecoGuiCategory.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/util/DecoGuiCategory.java @@ -12,7 +12,9 @@ public enum DecoGuiCategory { GENERIC_TILE, GENERIC_ITEM, + GENERIC_ENTITY, PRODUCTION_TILE, TERRITORY_CONTROL_TILE, - DATA_TILE + DATA_TILE, + VEHICLE_ENTITY } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/entity/GuiEntityUpgrade.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/entity/GuiEntityUpgrade.java new file mode 100644 index 000000000..2d67789e2 --- /dev/null +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/entity/GuiEntityUpgrade.java @@ -0,0 +1,256 @@ +package pl.pabilo8.immersiveintelligence.client.gui.entity; + +import blusunrize.immersiveengineering.api.crafting.IngredientStack; +import blusunrize.immersiveengineering.common.util.inventory.IIEInventory; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.text.TextFormatting; +import pl.pabilo8.immersiveintelligence.api.upgrade.IUpgradableDevice; +import pl.pabilo8.immersiveintelligence.api.upgrade.Upgrade; +import pl.pabilo8.immersiveintelligence.api.upgrade.UpgradeTechTree; +import pl.pabilo8.immersiveintelligence.api.upgrade.UpgradeUtils.UpgradeOperation; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoEntityGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoButton; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.collection.DecoTreeDisplay; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.label.DecoLabel; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoPanel; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoBar; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoItemStackDisplay; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoScenarioDisplay; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.visual.DecoImage; +import pl.pabilo8.immersiveintelligence.client.gui.deco.tree.IDecoTreeNode; +import pl.pabilo8.immersiveintelligence.client.gui.deco.tree.upgrade.UpgradeTechTreeWrapper; +import pl.pabilo8.immersiveintelligence.client.gui.deco.tree.upgrade.UpgradeTreeNodeRenderer; +import pl.pabilo8.immersiveintelligence.client.gui.deco.util.*; +import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoBackgroundBuilder.SlotStyle; +import pl.pabilo8.immersiveintelligence.client.util.amt.models.AMTModel; +import pl.pabilo8.immersiveintelligence.common.IIGUI; +import pl.pabilo8.immersiveintelligence.common.gui.ContainerEntityUpgrade; +import pl.pabilo8.immersiveintelligence.common.network.IIPacketHandler; +import pl.pabilo8.immersiveintelligence.common.network.messages.MessageBeginMachineUpgrade; +import pl.pabilo8.immersiveintelligence.common.util.IIColor; +import pl.pabilo8.immersiveintelligence.common.util.IIReference; +import pl.pabilo8.immersiveintelligence.common.util.ResLoc; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT; + +import javax.annotation.Nonnull; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @author Pabilo8 (pabilo@iiteam.net) + * @since 10.07.2019 + */ +@DecoTemplate(name = "upgrade_tile", category = DecoGuiCategory.GENERIC_ENTITY) +public class GuiEntityUpgrade extends DecoEntityGui> +{ + private final UpgradeTechTree techTree; + private DecoTreeDisplay techTreeDisplay; + private DecoPanel panelInfo; + + @SyncNBT(nullable = true) + public String lastUpgrade; + private DecoScenarioDisplay scenario; + + public GuiEntityUpgrade(EntityPlayer player, T tile) + { + super(player, tile, IIGUI.UPGRADE_ENTITY); + this.techTree = tile!=null?UpgradeTechTree.getTreeFor(tile): null; + } + + @Override + public void onInit() + { + ResLoc style = DecoTextures.BG_STEEL; + switch(entity.getUpgradableMachineStyle()) + { + case WOODEN: + style = DecoTextures.BG_WOODEN; + break; + case BRICKS: + style = DecoTextures.BG_BRICKS; + break; + case CONCRETE: + style = DecoTextures.BG_CONCRETE; + break; + case SANDBAGS: + style = DecoTextures.BG_SANDBAGS; + break; + case STEEL: + default: + break; + } + + startBackground() + .withBox(style, 0, 0, 256, 152+8+8) + .withTitleBar("desc.immersiveintelligence.upgrade_gui.title") + .withNextLayer() + .withBox(DecoTextures.BG_WOODEN, DecoTextures.TEMPLATE_ROUND_WOODEN, 40, 136+24+8, 176, 92) + .withFrame(DecoTextures.FRAME_WOODEN_THIN, 4, false, new boolean[]{true, false, false, false}) + .withInventorySlots(SlotStyle.VANILLA, container.inventorySlots) + .withInventoryTitleBar() + .build(); + + //Upgrade + addComponents( + new DecoPanel(4, 4+8) + .withSize(108, 152) + .withBackground(DecoTextures.BG_PAPER) + .withBackgroundMask(DecoTextures.TEMPLATE_SQUARE), + scenario = new DecoScenarioDisplay(4+2, 4+2+8) + .withSize(108-4, 96) + .withBackgroundColor(IIColor.BLACK.withAlpha(32)) + .withScale(0.125f) + .withRotation(-12.5f, 5) + .withRotationAnimation(240, 0) + .withInteractionAllowed(true), + new DecoButton(118-4, 16-8-4+14-14+8) + .withSize(69, 14) + .withBackground(DecoTextures.COMPONENT_TAB_VERTICAL) + .withText(IIReference.DESCRIPTION_KEY+"upgrade_gui.tech_tree") + .withOnLMBPressed(() -> { + panelInfo.visible = panelInfo.enabled = false; + techTreeDisplay.visible = techTreeDisplay.enabled = true; + refreshModelPreview(null); + }), + new DecoButton(118-4+69, 16-8-4+14-14+8) + .withSize(69, 14) + .withBackground(DecoTextures.COMPONENT_TAB_VERTICAL) + .withText(IIReference.DESCRIPTION_KEY+"upgrade_gui.info") + .withOnLMBPressed(() -> { + panelInfo.visible = panelInfo.enabled = true; + techTreeDisplay.visible = techTreeDisplay.enabled = false; + if(lastUpgrade!=null&&!lastUpgrade.isEmpty()) + refreshModelPreview(Upgrade.getUpgradeByID(ResLoc.of(lastUpgrade))); + }), + panelInfo = new DecoPanel(118-4, 16-8-4+14+8) + .withSize(146-8, 146-8) + .withBackground(DecoTextures.BG_STEEL) + .withBackgroundMask(DecoTextures.TEMPLATE_SQUARE), + techTreeDisplay = new DecoTreeDisplay(118-4, 16-8-4+14+8) + .withTree(new UpgradeTechTreeWrapper(techTree, entity) + { + @Override + public void onNodeClicked(@Nonnull IDecoTreeNode node) + { + panelInfo.visible = panelInfo.enabled = true; + techTreeDisplay.visible = techTreeDisplay.enabled = false; + showUpgrade(node.getUserData()); + refreshModelPreview(node.getUserData()); + } + }) + .withNodeRenderer(new UpgradeTreeNodeRenderer()) + .withSize(146-8, 146-8) + .withBackground(DecoSprite.atlasSprite(DecoTextures.BG_DARK, 64)) + ); + + if(lastUpgrade==null) + { + showUpgrade(null); + refreshModelPreview(null); + } + else + { + Upgrade current = Upgrade.getUpgradeByID(ResLoc.of(lastUpgrade)); + showUpgrade(current); + refreshModelPreview(current); + } + } + + private void showUpgrade(Upgrade upgrade) + { + panelInfo.cleanup(); + if(upgrade!=null) + { + //Name and descriptionm + panelInfo.addLabel(upgrade.getLocalizedName(), 2+20, 2) + .withSize(panelInfo.width-4-20, 20) + .withWrapping(true) + .withAlign(DecoAlignment.CENTER); + DecoLabel descLabel = panelInfo.addLabel(TextFormatting.ITALIC+I18n.format(String.format("machineupgrade.%s.%s.desc", + upgrade.getId().getResourceDomain(), + upgrade.getId().getResourcePath().replace("/", "."))), + 4, 22) + .withSize(panelInfo.width-8, 20) + .withWrapping(true) + .withAlign(DecoAlignment.TOP_LEFT); + + //Icon + panelInfo.addComponent(new DecoImage(4, 4)) + .withSize(16, 16) + .withImageLocation(upgrade.getIcon(), true); + //Required stacks + List requiredStacks = upgrade.getRequiredStacks(); + for(int i = 0; i < requiredStacks.size(); i++) + { + panelInfo.addComponent(new DecoItemStackDisplay(2+(i%7*20), 22+2+descLabel.getTotalHeight()+(i/7))) + .withSize(18, 18) + .withStack(requiredStacks.get(i)); + } + + //Required energy + int energyRequired = (int)(upgrade.getProgressRequired()*0.75f); + panelInfo.addComponent(new DecoBar(4, 22+64+28-16)) + .withTemplate(DecoTemplates.BAR_ELECTRIC_ENERGY_INPUT) + .withLimits(0, energyRequired, upgrade::getProgressRequired) + .withSize(panelInfo.width-4-4, 12) + .withHorizontalMode(true); + + //Install button + final boolean shouldInstall = !entity.isUpgradeInstalled(upgrade); + final boolean canInstall = entity.addUpgrade(upgrade, UpgradeOperation.PROBE); + DecoButton button = panelInfo.addComponent(new DecoButton(4, 22+64+28)) + .withWidth(panelInfo.width-8) + .withText(IIReference.DESCRIPTION_KEY+(shouldInstall?"upgrade_gui.install": "upgrade_gui.remove")) + .withOnLMBPressed(() -> { + IIPacketHandler.sendToServer(new MessageBeginMachineUpgrade(entity, upgrade, this.mc.player, shouldInstall)); + closeGUI(); + }); + + if(shouldInstall&&!canInstall) + button.enabled = false; + } + } + + private void refreshModelPreview(Upgrade upgrade) + { + ArrayList builder = new ArrayList<>(); + + //Add base model + ResLoc baseRes = techTree.getModelLocation(); + if(baseRes!=null) + builder.add(new AMTModel(DefaultVertexFormats.ITEM, baseRes)); + + //Collect all installed upgrades + ArrayList upgrades = new ArrayList<>(entity.getAllInstalledUpgrades()); + //Remove incompatible from preview and add requirements + if(upgrade!=null) + { + upgrades.removeAll(techTree.getAllIncompatibleUpgrades(upgrade)); + upgrades.addAll(techTree.getAllRequiredUpgrades(upgrade.getPurpose())); + upgrades.add(upgrade); + } + + //Add all installed upgrades + upgrades.stream().distinct() + .map(techTree::getUpgradeModelLocation) + .filter(Objects::nonNull) + .map(upgradeRes -> new AMTModel(DefaultVertexFormats.ITEM, upgradeRes)) + .forEach(builder::add); + + //Build + AMTModel built = new AMTModel(builder.toArray(new AMTModel[0])); + Vec3d center = built.findActualModelCenter(); + Vec3d size = built.findModelSize(); + float maxEdge = (float)Math.max(size.x, Math.max(size.y, size.z)); + + scenario.withModel(false, built); + scenario.withOrigin(center.x, center.y, center.z); + scenario.withTranslation(-center.x, -center.y, -center.z); + scenario.withScale(Math.min(maxEdge==0?0.125f: (0.125f/(maxEdge/6f)), 0.325f)); + } +} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/item/GuiCasingPouch.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/item/GuiCasingPouch.java index a6672b99d..deceefd8d 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/item/GuiCasingPouch.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/item/GuiCasingPouch.java @@ -1,46 +1,64 @@ package pl.pabilo8.immersiveintelligence.client.gui.item; -import blusunrize.immersiveengineering.client.gui.GuiIEContainerBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumHand; -import pl.pabilo8.immersiveintelligence.client.IIClientUtils; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoItemGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoPanel; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoItemStackDisplay; +import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoBackgroundBuilder.SlotStyle; +import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoGuiCategory; +import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoTemplate; +import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoTextures; +import pl.pabilo8.immersiveintelligence.common.IIContent; +import pl.pabilo8.immersiveintelligence.common.IIGUI; import pl.pabilo8.immersiveintelligence.common.gui.ContainerCasingPouch; -import pl.pabilo8.immersiveintelligence.common.util.IIReference; -import pl.pabilo8.immersiveintelligence.common.util.ResLoc; +import pl.pabilo8.immersiveintelligence.common.item.ammo.ItemIIAmmoCasing.Casing; +import pl.pabilo8.immersiveintelligence.common.item.ammo.ItemIIBulletMagazine.Magazines; +import pl.pabilo8.immersiveintelligence.common.util.IIColor; /** * @author Pabilo8 (pabilo@iiteam.net) * @since 25.09.2023 */ -public class GuiCasingPouch extends GuiIEContainerBase +@DecoTemplate(name = "casing_pouch", category = DecoGuiCategory.GENERIC_TILE) +public class GuiCasingPouch extends DecoItemGui { - private static final ResLoc texture = IIReference.RES_TEXTURES_GUI.with("casing_pouch").withExtension(ResLoc.EXT_PNG); - private final ItemStack pouch; - public GuiCasingPouch(EntityPlayer player, ItemStack heldStack, EnumHand hand) { - super(new ContainerCasingPouch(player, heldStack, hand)); - this.pouch = heldStack; - xSize = 176; - ySize = 173; - } - - /** - * Draw the foreground layer for the GuiContainer (everything in front of the items) - */ - @Override - protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) - { - IIClientUtils.drawStringCentered(this.fontRenderer, this.pouch.getDisplayName(), 0, 6, xSize, 0, 0xffc596); -// this.fontRenderer.drawString(this.pouch.getDisplayName(), 8, 6, 0xffc596); + super(player, heldStack, hand, IIGUI.CASING_POUCH); } @Override - protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) + public void onInit() { - IIClientUtils.bindTexture(texture); - this.drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + startBackground() + .withBox(DecoTextures.BG_STEEL_ROUGH, DecoTextures.TEMPLATE_ROUND, 0, 0, 176, 5*16, IIColor.fromPackedRGB(0x8dae77)) + .withStandaloneFrame(6, 4, 176-12, 5*16-10, DecoTextures.FRAME_CORNERS_BRASS, 4, true) + .withTitleBar(itemStack) + .withInventorySlots(SlotStyle.VANILLA, container.slotsCasing) + .withInventorySlots(SlotStyle.VANILLA, container.slotsMagazine) + .withBox(DecoTextures.BG_WOODEN, DecoTextures.TEMPLATE_ROUND_WOODEN, 0, 5*16, 176, 92) + .withInventorySlots(SlotStyle.VANILLA, container.playerInventory) + .withInventoryTitleBar() + .build(); + DecoPanel infoPanel = addComponent(new DecoPanel(64*2+8-2, 14) + .withSize(20, 16*4-6) + .withBackground(DecoTextures.BG_PAPER) + .withBackgroundMask(DecoTextures.TEMPLATE_PAPER) + ); + infoPanel.addComponent(new DecoItemStackDisplay(2, 2) + .withStack(IIContent.itemAmmoCasing.getStack(Casing.MG_2BCAL)) + .withOnTooltip(null) + ); + infoPanel.addComponent(new DecoItemStackDisplay(2, 20) + .withStack(IIContent.itemAmmoCasing.getStack(Casing.MG_2BCAL)) + .withOnTooltip(null) + ); + infoPanel.addComponent(new DecoItemStackDisplay(2, 19+19+1) + .withStack(IIContent.itemBulletMagazine.getStack(Magazines.MACHINEGUN)) + .withOnTooltip(null) + ); } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/model/TextureRecoloringRegistry.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/model/TextureRecoloringRegistry.java index f4acbcd5c..f29877e3a 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/model/TextureRecoloringRegistry.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/model/TextureRecoloringRegistry.java @@ -66,7 +66,7 @@ public static SpriteRecolored getRecoloredTextureSprite(ResourceLocation base, I RecolorableTexture texture = RECOLORABLE_TEXTURES.get(base); if(texture==null) return null; - return texture.recoloredVariants.get(color); + return texture.recoloredVariants.get(color.constraintToPaintSystem()); } private static class RecolorableTexture diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/vehicle/FieldFlakRenderer.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/vehicle/FieldFlakRenderer.java index 0ad268462..5e362f448 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/vehicle/FieldFlakRenderer.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/vehicle/FieldFlakRenderer.java @@ -7,6 +7,7 @@ import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.entity.EntityLivingBase; import net.minecraft.util.math.MathHelper; +import pl.pabilo8.immersiveintelligence.api.upgrade.UpgradeTechTree; import pl.pabilo8.immersiveintelligence.client.util.amt.AMTUtils; import pl.pabilo8.immersiveintelligence.client.util.amt.animation.IIAnimationCachedMap; import pl.pabilo8.immersiveintelligence.client.util.amt.models.AMTCachedModelBuilder; @@ -98,6 +99,10 @@ public void compileModels() .withWheel(e -> e.partWheelRight, "wheel1") .withWheel(e -> e.partWheelLeft, "wheel2") .build(); + + //Upgrade system + UpgradeTechTree.getTreeFor(EntityFieldFlak.class) + .withBaseModelLocation(modelFile); } @Override diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/vehicle/FieldHowitzerRenderer.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/vehicle/FieldHowitzerRenderer.java index 14f7dc7ea..67110b54f 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/vehicle/FieldHowitzerRenderer.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/vehicle/FieldHowitzerRenderer.java @@ -5,6 +5,7 @@ import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.entity.EntityLivingBase; +import pl.pabilo8.immersiveintelligence.api.upgrade.UpgradeTechTree; import pl.pabilo8.immersiveintelligence.client.util.amt.AMTUtils; import pl.pabilo8.immersiveintelligence.client.util.amt.animation.IIAnimationCachedMap; import pl.pabilo8.immersiveintelligence.client.util.amt.models.AMTCachedModelBuilder; @@ -88,6 +89,10 @@ public void compileModels() .withWheel(e -> e.partWheelRight, "wheel1") .withWheel(e -> e.partWheelLeft, "wheel2") .build(); + + //Upgrade system + UpgradeTechTree.getTreeFor(EntityFieldHowitzer.class) + .withBaseModelLocation(modelFile); } @Override diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/vehicle/TrackedMotorbikeRenderer.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/vehicle/TrackedMotorbikeRenderer.java index b559dae48..85a427e37 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/vehicle/TrackedMotorbikeRenderer.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/vehicle/TrackedMotorbikeRenderer.java @@ -7,6 +7,7 @@ import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.entity.EntityLivingBase; +import pl.pabilo8.immersiveintelligence.api.upgrade.UpgradeTechTree; import pl.pabilo8.immersiveintelligence.client.util.amt.AMTLoader; import pl.pabilo8.immersiveintelligence.client.util.amt.AMTUtils; import pl.pabilo8.immersiveintelligence.client.util.amt.animation.IIAnimationCachedMap; @@ -127,6 +128,10 @@ public void compileModels() gearSecondary = IIAnimationCachedMap.create(model, animationsDirectory.with("gearbox_secondary")); gearSecondaryOverdrive = IIAnimationCachedMap.create(model, animationsDirectory.with("gear_secondary_overdrive")); gearSecondaryReduction = IIAnimationCachedMap.create(model, animationsDirectory.with("gear_secondary_reduction")); + + //Upgrade system + UpgradeTechTree.getTreeFor(EntityTrackedMotorbike.class) + .withBaseModelLocation(modelFile); } @Override diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/CommonProxy.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/CommonProxy.java index 83c21f4ff..c95583910 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/CommonProxy.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/CommonProxy.java @@ -22,6 +22,7 @@ import blusunrize.immersiveengineering.common.items.IEItemInterfaces.IGuiItem; import blusunrize.immersiveengineering.common.util.ChatUtils; import blusunrize.immersiveengineering.common.util.IEPotions; +import blusunrize.immersiveengineering.common.util.inventory.IIEInventory; import net.minecraft.block.Block; import net.minecraft.block.BlockTNT; import net.minecraft.block.state.IBlockState; @@ -113,7 +114,8 @@ import pl.pabilo8.immersiveintelligence.common.entity.vehicle.towable.gun.EntityFieldGun; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.towable.gun.EntityFieldHowitzer; import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.EntityVehicleSeat; -import pl.pabilo8.immersiveintelligence.common.gui.ContainerUpgrade; +import pl.pabilo8.immersiveintelligence.common.gui.ContainerEntityUpgrade; +import pl.pabilo8.immersiveintelligence.common.gui.ContainerTileUpgrade; import pl.pabilo8.immersiveintelligence.common.item.ItemIIMinecart.Minecarts; import pl.pabilo8.immersiveintelligence.common.item.crafting.material.ItemIIMaterialDust.MaterialsDust; import pl.pabilo8.immersiveintelligence.common.network.IIPacketHandler; @@ -798,12 +800,21 @@ public Object getServerGuiElement(int ID, EntityPlayer player, World world, int EnumHand hand; TileEntity te = world.getTileEntity(new BlockPos(x, y, z)); ItemStack stack = player.getHeldItem(hand = (player.getHeldItem(EnumHand.MAIN_HAND).getItem() instanceof IGuiItem?EnumHand.MAIN_HAND: EnumHand.OFF_HAND)); + Entity entity = y==Integer.MIN_VALUE?world.getEntityByID(x): null; - if(ID==IIGUI.UPGRADE.ordinal()&&te instanceof IUpgradableDevice) + if(ID==IIGUI.UPGRADE_TILE.ordinal()&&te instanceof IUpgradableDevice) { IUpgradableDevice upgradeMaster = ((IUpgradableDevice)te).master(); if(upgradeMaster!=null) - return new ContainerUpgrade(player, (TileEntityIEBase & IUpgradableDevice)upgradeMaster); + //noinspection rawtypes,unchecked + return new ContainerTileUpgrade(player, (TileEntityIEBase & IUpgradableDevice)upgradeMaster); + } + if(ID==IIGUI.UPGRADE_ENTITY.ordinal()&&entity instanceof IUpgradableDevice) + { + IUpgradableDevice upgradeMaster = ((IUpgradableDevice)entity).master(); + if(upgradeMaster!=null) + //noinspection rawtypes,unchecked + return new ContainerEntityUpgrade<>(player, (Entity & IUpgradableDevice & IIEInventory)upgradeMaster); } if(IIGUI.values().length > ID) diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/EventHandler.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/EventHandler.java index bc067b7fc..77e506160 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/EventHandler.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/EventHandler.java @@ -2,8 +2,10 @@ import blusunrize.immersiveengineering.api.MultiblockHandler.MultiblockFormEvent.Post; import blusunrize.immersiveengineering.common.util.ItemNBTHelper; +import blusunrize.immersiveengineering.common.util.inventory.IIEInventory; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.MultiPartEntityPart; import net.minecraft.entity.ai.EntityAINearestAttackableTarget; import net.minecraft.entity.monster.EntityMob; import net.minecraft.entity.player.EntityPlayer; @@ -14,6 +16,7 @@ import net.minecraft.potion.PotionEffect; import net.minecraft.util.DamageSource; import net.minecraft.util.EntityDamageSourceIndirect; +import net.minecraft.util.EnumHand; import net.minecraft.util.SoundCategory; import net.minecraft.world.GameRules; import net.minecraft.world.GameRules.ValueType; @@ -28,6 +31,7 @@ import net.minecraftforge.event.entity.living.LivingFallEvent; import net.minecraftforge.event.entity.living.LivingHurtEvent; import net.minecraftforge.event.entity.player.EntityItemPickupEvent; +import net.minecraftforge.event.entity.player.PlayerInteractEvent.EntityInteract; import net.minecraftforge.event.entity.player.PlayerInteractEvent.RightClickBlock; import net.minecraftforge.event.entity.player.PlayerInteractEvent.RightClickEmpty; import net.minecraftforge.event.entity.player.PlayerInteractEvent.RightClickItem; @@ -43,9 +47,11 @@ import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.ItemHandlerHelper; +import pl.pabilo8.immersiveintelligence.ImmersiveIntelligence; import pl.pabilo8.immersiveintelligence.api.ammo.penetration.DamageBlockPos; import pl.pabilo8.immersiveintelligence.api.ammo.utils.IIAmmoUtils; import pl.pabilo8.immersiveintelligence.api.ammo.utils.PenetrationCache; +import pl.pabilo8.immersiveintelligence.api.upgrade.IUpgradableDevice; import pl.pabilo8.immersiveintelligence.api.utils.IAdvancedMultiblock; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Ammunition; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons; @@ -304,6 +310,33 @@ public void onBreakBlock(BreakEvent event) } } + @SubscribeEvent + public void onPlayerInteractEntityInteract(EntityInteract event) + { + EntityPlayer player = event.getEntityPlayer(); + + //Display upgrade GUI for compatible entities when using a wrench + if(IIItemUtils.isWrench(player.getHeldItem(EnumHand.MAIN_HAND))||IIItemUtils.isWrench(player.getHeldItem(EnumHand.OFF_HAND))) + { + Entity interacted = event.getTarget(); + if(interacted instanceof MultiPartEntityPart) + interacted = (Entity)((MultiPartEntityPart)interacted).parent; + if(interacted instanceof IUpgradableDevice) + { + if(!(interacted instanceof IIEInventory)) + { + IILogger.error("Cannot open upgrade GUI for "+interacted+", it does not implement IIEInventory!"); + return; + } + //Open entity GUI + player.openGui(ImmersiveIntelligence.INSTANCE, IIGUI.UPGRADE_ENTITY.ordinal(), + interacted.world, interacted.getEntityId(), Integer.MIN_VALUE, 0); + } + } + + } + + //--- Hanses ---// @SubscribeEvent(priority = EventPriority.LOW) diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/IIGUI.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/IIGUI.java index dbb740523..a70890dbe 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/IIGUI.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/IIGUI.java @@ -4,6 +4,7 @@ import blusunrize.immersiveengineering.common.util.inventory.IIEInventory; import mezz.jei.api.IModRegistry; import net.minecraft.client.gui.GuiScreen; +import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; @@ -35,6 +36,7 @@ import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui.DecoResourcesLoader; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoResource; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoTemplate; +import pl.pabilo8.immersiveintelligence.client.gui.entity.GuiEntityUpgrade; import pl.pabilo8.immersiveintelligence.client.gui.item.GuiCasingPouch; import pl.pabilo8.immersiveintelligence.client.gui.item.GuiPrintedPage; import pl.pabilo8.immersiveintelligence.common.block.data_device.tileentity.TileEntityDataMerger; @@ -55,7 +57,8 @@ import pl.pabilo8.immersiveintelligence.common.gui.*; import pl.pabilo8.immersiveintelligence.common.util.ISerializableEnum; import pl.pabilo8.immersiveintelligence.common.util.ResLoc; -import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIBase; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIEntityBase; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; import pl.pabilo8.immersiveintelligence.common.util.lambda.TriFunction; import javax.annotation.Nonnull; @@ -129,8 +132,12 @@ public enum IIGUI implements ISerializableEnum SAWMILL(TileEntitySawmill.class, ContainerSawmill::new), @SuppressWarnings({"rawtypes", "unchecked"}) - UPGRADE(TileEntityIEBase.class, - (player, te) -> new ContainerUpgrade(player, te) + UPGRADE_TILE(TileEntityIEBase.class, + (player, te) -> new ContainerTileUpgrade(player, te) + ), + @SuppressWarnings({"rawtypes", "unchecked"}) + UPGRADE_ENTITY(Entity.class, + (player, entity) -> new ContainerEntityUpgrade(player, entity) ), VULCANIZER(TileEntityVulcanizer.class, ContainerVulcanizer::new), @@ -153,13 +160,18 @@ public enum IIGUI implements ISerializableEnum RADAR_TARGETS(TileEntityRadar.class, ContainerRadar::new); public final Class teClass; + public final Class entityClass; public final BiFunction containerFromTile; + public final BiFunction containerFromEntity; public final TriFunction containerFromStack; public boolean item; + @SideOnly(Side.CLIENT) public BiFunction guiFromTile; @SideOnly(Side.CLIENT) public TriFunction guiFromStack; + @SideOnly(Side.CLIENT) + private BiFunction guiFromEntity; //Required for JEI @SideOnly(Side.CLIENT) public Class> guiClass; @@ -167,11 +179,27 @@ public enum IIGUI implements ISerializableEnum /** * TileEntity GUI constructor */ - IIGUI(@Nonnull Class teClass, BiFunction containerFromTile) + IIGUI(@Nonnull Class teClass, @Nonnull BiFunction containerFunction) { - this.teClass = teClass; - //noinspection unchecked - this.containerFromTile = (player, tileEntity) -> containerFromTile.apply(player, (T)tileEntity); + if(TileEntity.class.isAssignableFrom(teClass)) + { + //noinspection unchecked + this.teClass = (Class)teClass; + this.entityClass = null; + //noinspection unchecked + this.containerFromTile = (player, tileEntity) -> containerFunction.apply(player, (T)tileEntity); + this.containerFromEntity = null; + } + else if(Entity.class.isAssignableFrom(teClass)) + { + this.teClass = null; + //noinspection unchecked + this.entityClass = (Class)teClass; + this.containerFromTile = null; + this.containerFromEntity = (player, entity) -> containerFunction.apply(player, (T)entity); + } + else + throw new IllegalArgumentException("Invalid GUI subject class: "+teClass); this.containerFromStack = null; this.item = false; } @@ -179,10 +207,12 @@ IIGUI(@Nonnull Class teClass, BiFunction containerFromStack) + IIGUI(@Nonnull TriFunction containerFromStack) { this.teClass = null; + this.entityClass = null; this.containerFromTile = null; + this.containerFromEntity = null; this.containerFromStack = containerFromStack; this.item = true; } @@ -193,7 +223,9 @@ IIGUI(@Nonnull Class teClass, BiFunction IIGUI(@Nonnull Class teClass, BiFunction new GuiUpgrade(player, tile)); - - IIGUI.FLAGPOLE.setClientDecoGui(GuiFlagpole::new); - IIGUI.FLAGPOLE_FACTION.setClientDecoGui(GuiFlagpoleFaction::new); - IIGUI.EMPLACEMENT_STORAGE.setClientDecoGui(GuiEmplacementPageStorage::new); - IIGUI.EMPLACEMENT_CONFIG.setClientDecoGui(GuiEmplacementPageConfig::new); - IIGUI.EMPLACEMENT_TARGET_FILTERS.setClientDecoGui(GuiEmplacementPageTargetFilters::new); - IIGUI.EMPLACEMENT_FIRE_MISSIONS.setClientDecoGui(GuiEmplacementPageFireMissions::new); - - IIGUI.FILLER.setClientDecoGui(GuiFiller::new); - IIGUI.CHEMICAL_PAINTER.setClientDecoGui(GuiChemicalPainter::new); - - IIGUI.AMMUNITION_ASSEMBLER.setClientDecoGui(GuiAmmunitionAssembler::new); - IIGUI.PROJECTILE_WORKSHOP.setClientDecoGui(GuiProjectileWorkshop::new); - - IIGUI.RADAR.setClientDecoGui(GuiRadar::new); - IIGUI.RADAR_CONFIG.setClientDecoGui(GuiRadarConfig::new); - IIGUI.RADAR_TARGETS.setClientDecoGui(GuiRadarTargets::new); - IIGUI.COAGULATOR.setClientDecoGui(GuiCoagulator::new); - IIGUI.VULCANIZER.setClientDecoGui(GuiVulcanizer::new); + IIGUI.UPGRADE_TILE.setClientTileGui((player, tile) -> new GuiTileUpgrade(player, tile)); + //noinspection rawtypes,unchecked + IIGUI.UPGRADE_ENTITY.setClientEntityGui((player, tile) -> new GuiEntityUpgrade(player, tile)); + + IIGUI.FLAGPOLE.setClientTileGui(GuiFlagpole::new); + IIGUI.FLAGPOLE_FACTION.setClientTileGui(GuiFlagpoleFaction::new); + IIGUI.EMPLACEMENT_STORAGE.setClientTileGui(GuiEmplacementPageStorage::new); + IIGUI.EMPLACEMENT_CONFIG.setClientTileGui(GuiEmplacementPageConfig::new); + IIGUI.EMPLACEMENT_TARGET_FILTERS.setClientTileGui(GuiEmplacementPageTargetFilters::new); + IIGUI.EMPLACEMENT_FIRE_MISSIONS.setClientTileGui(GuiEmplacementPageFireMissions::new); + + IIGUI.FILLER.setClientTileGui(GuiFiller::new); + IIGUI.CHEMICAL_PAINTER.setClientTileGui(GuiChemicalPainter::new); + + IIGUI.AMMUNITION_ASSEMBLER.setClientTileGui(GuiAmmunitionAssembler::new); + IIGUI.PROJECTILE_WORKSHOP.setClientTileGui(GuiProjectileWorkshop::new); + + IIGUI.RADAR.setClientTileGui(GuiRadar::new); + IIGUI.RADAR_CONFIG.setClientTileGui(GuiRadarConfig::new); + IIGUI.RADAR_TARGETS.setClientTileGui(GuiRadarTargets::new); + IIGUI.COAGULATOR.setClientTileGui(GuiCoagulator::new); + IIGUI.VULCANIZER.setClientTileGui(GuiVulcanizer::new); } @SideOnly(Side.CLIENT) @@ -289,7 +323,7 @@ public void setClientGui(BiFunction> void setClientDecoGui(BiFunction> guiFromTile) + public > void setClientTileGui(BiFunction> guiFromTile) { Class> klass = (Class>)guiFromTile.apply(null, null).getClass(); this.guiFromTile = (player, tileEntity) -> guiFromTile.apply(player, (T)tileEntity); @@ -303,9 +337,7 @@ public > List resources = new ArrayList<>(); for(Field field : klass.getFields()) - { if(field.isAnnotationPresent(DecoResource.class)&&Modifier.isStatic(field.getModifiers())) - { try { Object value = field.get(null); @@ -319,8 +351,6 @@ else if(value instanceof String) { IILogger.error("Failed to access field "+field.getName()+" in class "+klass.getName(), e); } - } - } if(!resources.isEmpty()) new DecoResourcesLoader(this.getName().replace("gui_", ""), resources); @@ -330,6 +360,13 @@ else if(value instanceof String) public void setClientStackGui(TriFunction guiFromStack) { this.guiFromStack = guiFromStack; - item = true; + this.item = true; + } + + @SideOnly(Side.CLIENT) + public > void setClientEntityGui(BiFunction> guiFromEntity) + { + this.guiFromEntity = (player, entity) -> guiFromEntity.apply(player, (T)entity); + this.item = false; } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/multiblock/MultiblockEmplacement.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/multiblock/MultiblockEmplacement.java index 2939ee1bc..dc7a2a214 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/multiblock/MultiblockEmplacement.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/multiblock/MultiblockEmplacement.java @@ -5,6 +5,7 @@ import net.minecraft.util.math.Vec3i; import pl.pabilo8.immersiveintelligence.ImmersiveIntelligence; import pl.pabilo8.immersiveintelligence.api.style.StyleConstraints; +import pl.pabilo8.immersiveintelligence.api.style.StyleConstraints.PaintStyleConstraint; import pl.pabilo8.immersiveintelligence.api.upgrade.UpgradeTechTree; import pl.pabilo8.immersiveintelligence.api.upgrade.UpgradeUtils.UpgradePurpose; import pl.pabilo8.immersiveintelligence.api.upgrade.UpgradeUtils.UpgradeTier; @@ -29,7 +30,7 @@ public MultiblockEmplacement() super(new ResourceLocation(ImmersiveIntelligence.MODID, "multiblocks/emplacement")); offset = new Vec3i(1, 4, 0); INSTANCE = this; - STYLE_CONSTRAINTS = new StyleConstraints("sandbags", false, + STYLE_CONSTRAINTS = new StyleConstraints("sandbags", PaintStyleConstraint.NOT_APPLICABLE, Sets.newHashSet("sandbags", "wooden", "steel", "bricks", "concrete"), Collections.emptySet() ); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/multiblock/MultiblockFlagpole.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/multiblock/MultiblockFlagpole.java index b7b4e34b2..e09d7ac82 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/multiblock/MultiblockFlagpole.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/multiblock/MultiblockFlagpole.java @@ -5,6 +5,7 @@ import net.minecraft.util.math.Vec3i; import pl.pabilo8.immersiveintelligence.ImmersiveIntelligence; import pl.pabilo8.immersiveintelligence.api.style.StyleConstraints; +import pl.pabilo8.immersiveintelligence.api.style.StyleConstraints.PaintStyleConstraint; import pl.pabilo8.immersiveintelligence.api.upgrade.UpgradeTechTree; import pl.pabilo8.immersiveintelligence.api.upgrade.UpgradeUtils.UpgradeTier; import pl.pabilo8.immersiveintelligence.common.IIContent; @@ -25,7 +26,7 @@ public MultiblockFlagpole() super(new ResourceLocation(ImmersiveIntelligence.MODID, "multiblocks/flagpole")); offset = new Vec3i(1, 3, 0); INSTANCE = this; - STYLE_CONSTRAINTS = new StyleConstraints("sandbags", false, + STYLE_CONSTRAINTS = new StyleConstraints("sandbags", PaintStyleConstraint.NOT_APPLICABLE, Sets.newHashSet("sandbags", "wooden", "steel", "bricks", "concrete"), Collections.emptySet() ); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/multiblock/MultiblockFuelStation.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/multiblock/MultiblockFuelStation.java index 7e0d7f5c8..925bea8d8 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/multiblock/MultiblockFuelStation.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/multiblock/MultiblockFuelStation.java @@ -5,6 +5,7 @@ import net.minecraft.util.math.Vec3i; import pl.pabilo8.immersiveintelligence.ImmersiveIntelligence; import pl.pabilo8.immersiveintelligence.api.style.StyleConstraints; +import pl.pabilo8.immersiveintelligence.api.style.StyleConstraints.PaintStyleConstraint; import pl.pabilo8.immersiveintelligence.common.IIContent; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.BlockIIMetalMultiblock1.MetalMultiblocks1; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.TileEntityFuelStation; @@ -27,7 +28,7 @@ public MultiblockFuelStation() super(new ResourceLocation(ImmersiveIntelligence.MODID, "multiblocks/fuel_station")); offset = new Vec3i(0, 1, 0); INSTANCE = this; - STYLE_CONSTRAINTS = new StyleConstraints("wooden", false, + STYLE_CONSTRAINTS = new StyleConstraints("wooden", PaintStyleConstraint.NOT_APPLICABLE, Sets.newHashSet("wooden", "naval", "steel"), Collections.emptySet() ); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/compat/jei/DecoGuiJEIHandler.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/compat/jei/DecoGuiJEIHandler.java index 532fdb9ff..be90ad04a 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/compat/jei/DecoGuiJEIHandler.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/compat/jei/DecoGuiJEIHandler.java @@ -5,7 +5,7 @@ import mezz.jei.api.gui.IAdvancedGuiHandler; import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoGui; import pl.pabilo8.immersiveintelligence.common.IIGUI; -import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIBase; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; import javax.annotation.Nullable; import java.awt.*; @@ -15,7 +15,7 @@ * @author Pabilo8 (pabilo@iiteam.net) * @since 24.03.2021 */ -public class DecoGuiJEIHandler, T extends TileEntityIEBase & IIEInventory, C extends ContainerIIBase> implements IAdvancedGuiHandler +public class DecoGuiJEIHandler, T extends TileEntityIEBase & IIEInventory, C extends ContainerIITileBase> implements IAdvancedGuiHandler { Class wrappedClass; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/EntityVehicleBase.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/EntityVehicleBase.java index 060276f36..5dc26af1c 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/EntityVehicleBase.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/EntityVehicleBase.java @@ -1,12 +1,15 @@ package pl.pabilo8.immersiveintelligence.common.entity.vehicle; import blusunrize.immersiveengineering.common.util.Utils; +import blusunrize.immersiveengineering.common.util.inventory.IIEInventory; import com.google.common.collect.Sets; import net.minecraft.entity.Entity; import net.minecraft.entity.IEntityMultiPart; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.DamageSource; import net.minecraft.util.EnumFacing; +import net.minecraft.util.NonNullList; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; @@ -19,9 +22,11 @@ import net.minecraftforge.fml.relauncher.SideOnly; import pl.pabilo8.immersiveintelligence.api.style.IStyleCustomizable; import pl.pabilo8.immersiveintelligence.api.style.StyleConstraints; +import pl.pabilo8.immersiveintelligence.api.style.StyleConstraints.PaintStyleConstraint; import pl.pabilo8.immersiveintelligence.api.style.StyleCustomization; import pl.pabilo8.immersiveintelligence.api.upgrade.IManagedUpgradableDevice; import pl.pabilo8.immersiveintelligence.api.upgrade.UpgradeManager; +import pl.pabilo8.immersiveintelligence.api.upgrade.UpgradeUtils.MachineStyle; import pl.pabilo8.immersiveintelligence.api.utils.IEntitySpecialRepairable; import pl.pabilo8.immersiveintelligence.api.utils.vehicles.IVehicleMultiPart; import pl.pabilo8.immersiveintelligence.common.IIUtils; @@ -51,11 +56,11 @@ * @since 29.09.2025 */ public abstract class EntityVehicleBase> extends Entity implements ISyncNBTEntity, IVehicleMultiPart, - IEntitySpecialRepairable, IManagedUpgradableDevice, IStyleCustomizable + IEntitySpecialRepairable, IManagedUpgradableDevice, IStyleCustomizable, IIEInventory { //--- Constants ---// private static final StyleConstraints DEFAULT_STYLE_CONSTRAINTS = new StyleConstraints("steel", - true, Sets.newHashSet("steel"), Collections.emptySet()); + PaintStyleConstraint.PAINTS_COLOR_ONLY, Sets.newHashSet("steel"), Collections.emptySet()); //--- Parts ---// private AxisAlignedBB AABB; @@ -92,10 +97,10 @@ public abstract class EntityVehicleBase> extends public EntityVehicleBase(World world) { super(world); + internalVehicleInit(); } - @Override - protected final void entityInit() + protected final void internalVehicleInit() { //Initialize part collections ArrayList> wheelsList = new ArrayList<>(); @@ -111,7 +116,7 @@ protected final void entityInit() //noinspection unchecked this.upgradeManager = ((UpgradeManager)new UpgradeManager<>(this)); this.style = new StyleCustomization(getVehicleStyleConstraints()); - this.style.withColor(IIColor.fromHSV(Utils.RAND.nextInt(64)/64f, 0.35f, 0.85f)); + this.style.withColor(IIColor.getPaintSystemColor(Utils.RAND.nextInt(64))); //Calculate vehicle size and collect wheels double minX = Integer.MAX_VALUE, minY = Integer.MAX_VALUE, minZ = Integer.MAX_VALUE; @@ -166,6 +171,12 @@ else if(part.offset.z+part.aabb.maxZ > maxZ) updateParts(); } + @Override + protected final void entityInit() + { + //Do not initialize here, as it is called before the constructor + } + /** * Initializes the vehicle with hitboxes and parts. * Implemented by subclasses to define vehicle-specific parts. @@ -1093,6 +1104,12 @@ public UpgradeManager getUpgradeManager() return this.upgradeManager; } + @Override + public MachineStyle getUpgradableMachineStyle() + { + return MachineStyle.STEEL; + } + @Override public T master() { @@ -1136,4 +1153,26 @@ public T getCapability(Capability capability, @Nullable EnumFacing facing return (T)component; return super.getCapability(capability, facing); } + + //--- IIEInventory ---// + + public NonNullList getInventory() + { + return NonNullList.create(); + } + + public boolean isStackValid(int slot, ItemStack stack) + { + return true; + } + + public int getSlotLimit(int slot) + { + return 64; + } + + public void doGraphicalUpdates(int slot) + { + updateEntityForEvent(SyncEvents.ENTITY_INTERACT); + } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerAmmunitionAssembler.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerAmmunitionAssembler.java index e6c465d9a..5fb13f954 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerAmmunitionAssembler.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerAmmunitionAssembler.java @@ -3,7 +3,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Slot; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.TileEntityAmmunitionAssembler; -import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIBase; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; /** * @author Pabilo8 (pabilo@iiteam.net) @@ -11,7 +11,7 @@ * @since 10.07.2019 * @since 08.13.2025 */ -public class ContainerAmmunitionAssembler extends ContainerIIBase +public class ContainerAmmunitionAssembler extends ContainerIITileBase { public Slot inputSlot, outputSlot; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerAmmunitionCrate.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerAmmunitionCrate.java index ac2a155a1..90a3ea8eb 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerAmmunitionCrate.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerAmmunitionCrate.java @@ -11,7 +11,7 @@ import pl.pabilo8.immersiveintelligence.common.IIContent; import pl.pabilo8.immersiveintelligence.common.block.metal_device.tileentity.effect_crate.TileEntityAmmunitionCrate; import pl.pabilo8.immersiveintelligence.common.item.ammo.gun.ItemIIAmmoMachinegun; -import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIBase; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; /** * @author Pabilo8 (pabilo@iiteam.net) @@ -19,7 +19,7 @@ * @since 17.05.2019 * @since 08.18.2025 */ -public class ContainerAmmunitionCrate extends ContainerIIBase +public class ContainerAmmunitionCrate extends ContainerIITileBase { public Slot[] inputBullet, inputShell, inputRevolver, inputMG; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerArithmeticLogicMachine.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerArithmeticLogicMachine.java index 210ac262b..198f08367 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerArithmeticLogicMachine.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerArithmeticLogicMachine.java @@ -10,7 +10,7 @@ import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock0.multiblock.MultiblockArithmeticLogicMachine; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock0.tileentity.TileEntityArithmeticLogicMachine; import pl.pabilo8.immersiveintelligence.common.item.data.ItemIIFunctionalCircuit; -import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIBase; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; /** * @author Pabilo8 (pabilo@iiteam.net) @@ -18,7 +18,7 @@ * @ii-approved 0.3.1 * @since 30.06.2019 */ -public class ContainerArithmeticLogicMachine extends ContainerIIBase +public class ContainerArithmeticLogicMachine extends ContainerIITileBase { public final boolean storage; public final Slot[] circuitSlots; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerCasingPouch.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerCasingPouch.java index 887014d20..886340689 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerCasingPouch.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerCasingPouch.java @@ -1,6 +1,5 @@ package pl.pabilo8.immersiveintelligence.common.gui; -import blusunrize.immersiveengineering.common.gui.IESlot; import blusunrize.immersiveengineering.common.util.ItemNBTHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Slot; @@ -8,14 +7,15 @@ import net.minecraft.util.EnumHand; import pl.pabilo8.immersiveintelligence.common.crafting.IIRecipes; import pl.pabilo8.immersiveintelligence.common.item.ammo.ItemIIBulletMagazine; -import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIItem; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIItemBase; /** * @author Pabilo8 (pabilo@iiteam.net) * @since 23.09.2023 */ -public class ContainerCasingPouch extends ContainerIIItem +public class ContainerCasingPouch extends ContainerIIItemBase { + public Slot[] slotsCasing, slotsMagazine; public ContainerCasingPouch(EntityPlayer player, ItemStack heldStack, EnumHand hand) { @@ -27,14 +27,9 @@ public ContainerCasingPouch(EntityPlayer player, ItemStack heldStack, EnumHand h public int addSlots(int i) { //Casing Slots - for(int y = 0; y < 2; y++) - for(int x = 0; x < 6; x++) - this.addSlotToContainer(new IESlot.ContainerCallback(this, this.inv, i++, 26+x*18, 21+y*18)); - + this.slotsCasing = addSlotArray(26, 21-5, i, 12, 6); //Magazine Slots - for(int x = 0; x < 6; x++) - this.addSlotToContainer(new IESlot.ContainerCallback(this, this.inv, i++, 26+x*18, 59)); - + this.slotsMagazine = addSlotArray(26, 59-5, i+12, 6, 6); addPlayerInventory(inventoryPlayer, 8, 92); return i; } @@ -47,12 +42,6 @@ public boolean canInsert(ItemStack stack, int slotNumer, Slot slotObject) return stack.getItem() instanceof ItemIIBulletMagazine; } - @Override - public boolean canTake(ItemStack stack, int slotNumer, Slot slotObject) - { - return true; - } - @Override protected void updatePlayerItem(boolean closing) { diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerChemicalBath.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerChemicalBath.java index 7f88f5db2..11f9ffcaa 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerChemicalBath.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerChemicalBath.java @@ -6,7 +6,7 @@ import net.minecraft.inventory.Slot; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock0.multiblock.MultiblockChemicalBath; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock0.tileentity.TileEntityChemicalBath; -import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIBase; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; /** * @author Pabilo8 (pabilo@iiteam.net) @@ -14,7 +14,7 @@ * @ii-approved 0.3.1 * @since 10.07.2019 */ -public class ContainerChemicalBath extends ContainerIIBase +public class ContainerChemicalBath extends ContainerIITileBase { public final Slot slotInput, slotOutput; public final Slot slotBucketInput, slotBucketOutput; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerChemicalPainter.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerChemicalPainter.java index 87d9ad43e..d8c2c54f9 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerChemicalPainter.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerChemicalPainter.java @@ -6,7 +6,7 @@ import net.minecraft.inventory.Slot; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.multiblock.MultiblockChemicalPainter; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.TileEntityChemicalPainter; -import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIBase; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; /** * @author Pabilo8 (pabilo@iiteam.net) @@ -14,7 +14,7 @@ * @since 10.07.2019 * @since 08.13.2025 */ -public class ContainerChemicalPainter extends ContainerIIBase +public class ContainerChemicalPainter extends ContainerIITileBase { public Slot inputSlot, outputSlot, inputFluidSlot, outputFluidSlot; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerCoagulator.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerCoagulator.java index f1321505b..006bc759e 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerCoagulator.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerCoagulator.java @@ -5,7 +5,7 @@ import net.minecraft.inventory.Slot; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.multiblock.MultiblockCoagulator; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.TileEntityCoagulator; -import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIBase; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; /** * @author Pabilo8 (pabilo@iiteam.net) @@ -13,7 +13,7 @@ * @since 10.07.2019 * @since 12.12.2025 */ -public class ContainerCoagulator extends ContainerIIBase +public class ContainerCoagulator extends ContainerIITileBase { public Slot[] slotBucketIn, slotBucketOut; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerDataInputMachine.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerDataInputMachine.java index f0e1c571a..166f9d536 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerDataInputMachine.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerDataInputMachine.java @@ -4,7 +4,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Slot; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock0.tileentity.TileEntityDataInputMachine; -import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIBase; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; /** * @author Pabilo8 (pabilo@iiteam.net) @@ -12,7 +12,7 @@ * @ii-approved 0.3.1 * @since 30.06.2019 */ -public class ContainerDataInputMachine extends ContainerIIBase +public class ContainerDataInputMachine extends ContainerIITileBase { public final Slot dataInput, dataOutput; public final Slot[] punchtapeStorage; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerDataInputMachineEditing.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerDataInputMachineEditing.java index 6ba089535..a67ff1516 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerDataInputMachineEditing.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerDataInputMachineEditing.java @@ -4,7 +4,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Slot; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock0.tileentity.TileEntityDataInputMachine; -import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIBase; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; /** * @author Pabilo8 (pabilo@iiteam.net) @@ -12,7 +12,7 @@ * @ii-approved 0.3.1 * @since 30.06.2019 */ -public class ContainerDataInputMachineEditing extends ContainerIIBase +public class ContainerDataInputMachineEditing extends ContainerIITileBase { public Slot dataInput, dataOutput; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerElectrolyzer.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerElectrolyzer.java index 5df823ea6..42d7c3ce2 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerElectrolyzer.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerElectrolyzer.java @@ -4,7 +4,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Slot; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock0.tileentity.TileEntityElectrolyzer; -import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIBase; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; /** * @author Pabilo8 (pabilo@iiteam.net) @@ -12,7 +12,7 @@ * @ii-approved 0.3.1 * @since 10.07.2019 */ -public class ContainerElectrolyzer extends ContainerIIBase +public class ContainerElectrolyzer extends ContainerIITileBase { public final Slot[] slotsInput, slotsOutput; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerEmplacement.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerEmplacement.java index f1f3e9b7b..41926936a 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerEmplacement.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerEmplacement.java @@ -6,13 +6,13 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.items.IItemHandler; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement.TileEntityEmplacement; -import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIBase; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; /** * @author Pabilo8 (pabilo@iiteam.net) * @since 16.07.2021 */ -public class ContainerEmplacement extends ContainerIIBase +public class ContainerEmplacement extends ContainerIITileBase { public Slot[] slotsEmplacementStorage; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerEntityUpgrade.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerEntityUpgrade.java new file mode 100644 index 000000000..5122674b9 --- /dev/null +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerEntityUpgrade.java @@ -0,0 +1,22 @@ +package pl.pabilo8.immersiveintelligence.common.gui; + +import blusunrize.immersiveengineering.common.util.inventory.IIEInventory; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import pl.pabilo8.immersiveintelligence.api.upgrade.IUpgradableDevice; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIEntityBase; + +/** + * @author Pabilo8 (pabilo@iiteam.net) + * @since 10.07.2019 + */ +public class ContainerEntityUpgrade extends ContainerIIEntityBase +{ + public ContainerEntityUpgrade(EntityPlayer player, E tile) + { + super(player, tile); + //Input/Output Slots + + addPlayerInventory(player.inventory, 9+32+16-8, 18+32+32+8-4+76-16+4+24+8); + } +} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerFiller.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerFiller.java index 11efbf7f3..3f2a37ae9 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerFiller.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerFiller.java @@ -4,7 +4,7 @@ import net.minecraft.inventory.Slot; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.multiblock.MultiblockFiller; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.TileEntityFiller; -import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIBase; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; /** * @author Pabilo8 (pabilo@iiteam.net) @@ -12,7 +12,7 @@ * @since 10.07.2019 * @since 08.12.2025 */ -public class ContainerFiller extends ContainerIIBase +public class ContainerFiller extends ContainerIITileBase { public Slot inputSlot; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerFlagpole.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerFlagpole.java index 479fd1961..5bf9e94c3 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerFlagpole.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerFlagpole.java @@ -3,14 +3,14 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.TileEntityFlagpole; -import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIBase; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; /** * @author Pabilo8 (pabilo@iiteam.net) * @ii-approved 0.3.1 * @since 27.12.2025 */ -public class ContainerFlagpole extends ContainerIIBase +public class ContainerFlagpole extends ContainerIITileBase { private ContainerFlagpole(EntityPlayer player, TileEntityFlagpole tile, boolean faction) { diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerFuelStation.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerFuelStation.java index 36a3101f8..f0a9d3b45 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerFuelStation.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerFuelStation.java @@ -4,7 +4,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Slot; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.TileEntityFuelStation; -import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIBase; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; /** * @author Pabilo8 (pabilo@iiteam.net) @@ -12,7 +12,7 @@ * @since 10.07.2019 * @since 08.14.2025 */ -public class ContainerFuelStation extends ContainerIIBase +public class ContainerFuelStation extends ContainerIITileBase { public Slot inputFluidSlot, outputFluidSlot; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerGearbox.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerGearbox.java index a2a08647f..6ebdbf55c 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerGearbox.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerGearbox.java @@ -2,13 +2,13 @@ import net.minecraft.entity.player.EntityPlayer; import pl.pabilo8.immersiveintelligence.common.block.rotary_device.tileentity.TileEntityGearbox; -import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIBase; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; /** * @author Pabilo8 (pabilo@iiteam.net) * @since 17.05.2019 */ -public class ContainerGearbox extends ContainerIIBase +public class ContainerGearbox extends ContainerIITileBase { public ContainerGearbox(EntityPlayer player, TileEntityGearbox tile) { @@ -17,4 +17,4 @@ public ContainerGearbox(EntityPlayer player, TileEntityGearbox tile) this.addPlayerInventory(player.inventory, 8, 87); } -} \ No newline at end of file +} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerIICrate.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerIICrate.java index 170677474..985fdd29e 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerIICrate.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerIICrate.java @@ -3,14 +3,14 @@ import blusunrize.immersiveengineering.common.blocks.wooden.TileEntityWoodenCrate; import invtweaks.api.container.ChestContainer; import net.minecraft.entity.player.EntityPlayer; -import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIBase; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; /** * @author Pabilo8 (pabilo@iiteam.net) * @since 17.05.2019 */ @ChestContainer -public class ContainerIICrate extends ContainerIIBase +public class ContainerIICrate extends ContainerIITileBase { public ContainerIICrate(EntityPlayer player, T tile) { diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerInserter.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerInserter.java index 2da454fc1..0392fad3a 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerInserter.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerInserter.java @@ -2,14 +2,14 @@ import net.minecraft.entity.player.EntityPlayer; import pl.pabilo8.immersiveintelligence.common.block.metal_device.tileentity.inserter.TileEntityInserterBase; -import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIBase; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; /** * @author Pabilo8 (pabilo@iiteam.net) * @ii-approved 0.3.1 * @since 20.01.2026 */ -public class ContainerInserter extends ContainerIIBase +public class ContainerInserter extends ContainerIITileBase { public ContainerInserter(EntityPlayer player, TileEntityInserterBase tile) { diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerMedicalCrate.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerMedicalCrate.java index 678f13f64..e5cac4826 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerMedicalCrate.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerMedicalCrate.java @@ -6,7 +6,7 @@ import net.minecraft.item.ItemStack; import pl.pabilo8.immersiveintelligence.common.IIContent; import pl.pabilo8.immersiveintelligence.common.block.metal_device.tileentity.effect_crate.TileEntityMedicalCrate; -import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIBase; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; /** * @author Pabilo8 (pabilo@iiteam.net) @@ -14,7 +14,7 @@ * @since 17.05.2019 * @since 08.14.2025 */ -public class ContainerMedicalCrate extends ContainerIIBase +public class ContainerMedicalCrate extends ContainerIITileBase { public Slot inputSlot, inputFluidSlot, outputSlot, outputSlot2; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerPacker.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerPacker.java index e8116d708..f47afce57 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerPacker.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerPacker.java @@ -5,7 +5,7 @@ import net.minecraft.inventory.Slot; import pl.pabilo8.immersiveintelligence.common.IIContent; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock0.tileentity.TileEntityPacker; -import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIBase; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; /** * @author Pabilo8 (pabilo@iiteam.net) @@ -15,7 +15,7 @@ * @ii-approved 0.3.1 * @since 17.05.2019 */ -public class ContainerPacker extends ContainerIIBase +public class ContainerPacker extends ContainerIITileBase { //Used by fluid and energy containers public Slot[] slotsInput, slotsOutput; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerPrecisionAssembler.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerPrecisionAssembler.java index 9634f933d..5b8703a2f 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerPrecisionAssembler.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerPrecisionAssembler.java @@ -5,7 +5,7 @@ import net.minecraft.inventory.Slot; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock0.multiblock.MultiblockPrecisionAssembler; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock0.tileentity.TileEntityPrecisionAssembler; -import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIBase; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; /** * @author Pabilo8 (pabilo@iiteam.net) @@ -13,7 +13,7 @@ * @updated 30.08.2025 * @since 17.05.2019 */ -public class ContainerPrecisionAssembler extends ContainerIIBase +public class ContainerPrecisionAssembler extends ContainerIITileBase { public Slot[] ingredientSlots, outputSlots, toolSlots; public Slot schemeSlot; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerPrintingPress.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerPrintingPress.java index eff250273..375d62d0d 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerPrintingPress.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerPrintingPress.java @@ -7,7 +7,7 @@ import net.minecraft.item.ItemStack; import pl.pabilo8.immersiveintelligence.api.crafting.PrintingRecipe; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock0.tileentity.TileEntityPrintingPress; -import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIBase; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; import javax.annotation.Nonnull; @@ -16,7 +16,7 @@ * @updated 14.06.2025 * @since 10.07.2019 */ -public class ContainerPrintingPress extends ContainerIIBase +public class ContainerPrintingPress extends ContainerIITileBase { public Slot slotInput, slotOutput; public Slot slotBucketIn, slotBucketOut; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerProjectileWorkshop.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerProjectileWorkshop.java index 92de01af6..f3972465e 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerProjectileWorkshop.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerProjectileWorkshop.java @@ -5,7 +5,7 @@ import net.minecraft.item.ItemStack; import pl.pabilo8.immersiveintelligence.common.IIContent; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.TileEntityProjectileWorkshop; -import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIBase; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; /** * @author Pabilo8 (pabilo@iiteam.net) @@ -13,7 +13,7 @@ * @since 10.07.2019 * @since 08.13.2025 */ -public class ContainerProjectileWorkshop extends ContainerIIBase +public class ContainerProjectileWorkshop extends ContainerIITileBase { public Slot inputSlot, outputSlot; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerRadar.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerRadar.java index 2ed014f00..7ea329266 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerRadar.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerRadar.java @@ -2,13 +2,13 @@ import net.minecraft.entity.player.EntityPlayer; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.TileEntityRadar; -import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIBase; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; /** * @author Pabilo8 (pabilo@iiteam.net) * @since 10.07.2019 */ -public class ContainerRadar extends ContainerIIBase +public class ContainerRadar extends ContainerIITileBase { public ContainerRadar(EntityPlayer player, TileEntityRadar tile) { diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerRedstoneDataInterface.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerRedstoneDataInterface.java index b7c49ef64..d8f14efb4 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerRedstoneDataInterface.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerRedstoneDataInterface.java @@ -5,13 +5,13 @@ import net.minecraft.inventory.Slot; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.multiblock.MultiblockRedstoneInterface; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.TileEntityRedstoneDataInterface; -import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIBase; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; /** * @author Pabilo8 (pabilo@iiteam.net) * @since 30.06.2019 */ -public class ContainerRedstoneDataInterface extends ContainerIIBase +public class ContainerRedstoneDataInterface extends ContainerIITileBase { public Slot punchtapeInput, punchtapeOutput; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerRepairCrate.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerRepairCrate.java index c5cb9925e..a3a95fa0a 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerRepairCrate.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerRepairCrate.java @@ -6,7 +6,7 @@ import net.minecraft.item.ItemStack; import pl.pabilo8.immersiveintelligence.common.IIContent; import pl.pabilo8.immersiveintelligence.common.block.metal_device.tileentity.effect_crate.TileEntityRepairCrate; -import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIBase; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; /** * @author Pabilo8 (pabilo@iiteam.net) @@ -14,7 +14,7 @@ * @since 17.05.2019 * @since 08.15.2025 */ -public class ContainerRepairCrate extends ContainerIIBase +public class ContainerRepairCrate extends ContainerIITileBase { public Slot inputSlot; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerSawmill.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerSawmill.java index 176018f32..0d2632886 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerSawmill.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerSawmill.java @@ -11,7 +11,7 @@ import pl.pabilo8.immersiveintelligence.common.block.multiblock.wooden_multiblock.multiblock.MultiblockSawmill; import pl.pabilo8.immersiveintelligence.common.block.multiblock.wooden_multiblock.tileentity.TileEntitySawmill; import pl.pabilo8.immersiveintelligence.common.util.IIDamageSources; -import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIBase; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; /** * @author Pabilo8 (pabilo@iiteam.net) @@ -19,7 +19,7 @@ * @ii-approved 0.3.1 * @since 10.07.2019 */ -public class ContainerSawmill extends ContainerIIBase +public class ContainerSawmill extends ContainerIITileBase { public final Slot slotInput, slotSaw, slotOutput, slotOutputTrash; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerSkycartStation.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerSkycartStation.java index 7ea043350..11d54c14c 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerSkycartStation.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerSkycartStation.java @@ -1,13 +1,9 @@ package pl.pabilo8.immersiveintelligence.common.gui; -import blusunrize.immersiveengineering.common.gui.ContainerIEBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Slot; -import net.minecraft.item.ItemStack; -import pl.pabilo8.immersiveintelligence.api.rotary.IMotorGear; import pl.pabilo8.immersiveintelligence.common.block.multiblock.wooden_multiblock.tileentity.TileEntitySkyCartStation; -import pl.pabilo8.immersiveintelligence.common.block.rotary_device.tileentity.TileEntityGearbox; -import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIBase; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; /** * @author Pabilo8 (pabilo@iiteam.net) @@ -15,7 +11,7 @@ * @since 17.05.2019 * @since 08.14.2025 */ -public class ContainerSkycartStation extends ContainerIIBase +public class ContainerSkycartStation extends ContainerIITileBase { public Slot inputSlot; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerSkycrateStation.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerSkycrateStation.java index 4e5fb11a5..d202a06d4 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerSkycrateStation.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerSkycrateStation.java @@ -1,13 +1,10 @@ package pl.pabilo8.immersiveintelligence.common.gui; -import blusunrize.immersiveengineering.common.gui.ContainerIEBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Slot; -import net.minecraft.item.ItemStack; -import pl.pabilo8.immersiveintelligence.api.rotary.IMotorGear; import pl.pabilo8.immersiveintelligence.common.block.multiblock.wooden_multiblock.tileentity.TileEntitySkyCartStation; import pl.pabilo8.immersiveintelligence.common.block.multiblock.wooden_multiblock.tileentity.TileEntitySkyCrateStation; -import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIBase; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; /** * @author Pabilo8 (pabilo@iiteam.net) @@ -15,7 +12,7 @@ * @since 17.05.2019 * @since 08.14.2025 */ -public class ContainerSkycrateStation extends ContainerIIBase +public class ContainerSkycrateStation extends ContainerIITileBase { public Slot inputSlot; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerUpgrade.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerTileUpgrade.java similarity index 74% rename from src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerUpgrade.java rename to src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerTileUpgrade.java index e17b20868..2ea5ebaf5 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerUpgrade.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerTileUpgrade.java @@ -4,15 +4,15 @@ import blusunrize.immersiveengineering.common.util.inventory.IIEInventory; import net.minecraft.entity.player.EntityPlayer; import pl.pabilo8.immersiveintelligence.api.upgrade.IUpgradableDevice; -import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIBase; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; /** * @author Pabilo8 (pabilo@iiteam.net) * @since 10.07.2019 */ -public class ContainerUpgrade extends ContainerIIBase +public class ContainerTileUpgrade extends ContainerIITileBase { - public ContainerUpgrade(EntityPlayer player, T tile) + public ContainerTileUpgrade(EntityPlayer player, T tile) { super(player, tile); //Input/Output Slots diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerVulcanizer.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerVulcanizer.java index 40673c184..154f27d66 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerVulcanizer.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerVulcanizer.java @@ -3,7 +3,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Slot; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.TileEntityVulcanizer; -import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIIBase; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; /** * @author Pabilo8 (pabilo@iiteam.net) @@ -11,7 +11,7 @@ * @since 10.07.2019 * @since 08.12.2025 */ -public class ContainerVulcanizer extends ContainerIIBase +public class ContainerVulcanizer extends ContainerIITileBase { public Slot[] slotInput; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/item/tools/ItemIIBinoculars.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/item/tools/ItemIIBinoculars.java index d699add3b..789c0fc57 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/item/tools/ItemIIBinoculars.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/item/tools/ItemIIBinoculars.java @@ -121,7 +121,7 @@ public void onUpdate(ItemStack stack, World worldIn, Entity entity, int itemSlot if(do_tick&&isEnabled(stack)&&isAdvanced(stack)) { - IIUtils.applyInfraredVision(entity, 10); + IIUtils.applyInfraredVision(entity, 25); ItemNBTHelper.setBoolean(stack, "wasUsed", true); extractEnergy(stack, Tools.advancedBinocularsEnergyUsage, false); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/network/messages/MessageBeginMachineUpgrade.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/network/messages/MessageBeginMachineUpgrade.java index e9731e06a..bc2f9c382 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/network/messages/MessageBeginMachineUpgrade.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/network/messages/MessageBeginMachineUpgrade.java @@ -24,10 +24,12 @@ import pl.pabilo8.immersiveintelligence.common.network.IIMessage; import pl.pabilo8.immersiveintelligence.common.util.ResLoc; +import javax.annotation.Nullable; + public class MessageBeginMachineUpgrade extends IIMessage implements IPositionBoundMessage { private Upgrade upgrade; - private int installingUserID; + private int installingUserID, upgradedEntityID = -1; private World world; private BlockPos pos; private boolean install; @@ -35,8 +37,19 @@ public class MessageBeginMachineUpgrade extends IIMessage implements IPositionBo public MessageBeginMachineUpgrade(TileEntity tile, Upgrade upgrade, Entity user, boolean install) { this.installingUserID = user.getEntityId(); + this.install = install; this.pos = tile.getPos(); + this.world = tile.getWorld(); + this.upgrade = upgrade; + } + + public MessageBeginMachineUpgrade(Entity upgradedEntity, Upgrade upgrade, Entity user, boolean install) + { + this.installingUserID = user.getEntityId(); + this.upgradedEntityID = upgradedEntity.getEntityId(); this.install = install; + this.pos = upgradedEntity.getPosition(); + this.world = upgradedEntity.getEntityWorld(); this.upgrade = upgrade; } @@ -52,11 +65,10 @@ protected void onServerReceive(WorldServer world, NetHandlerPlayServer handler) if(!(entity instanceof EntityLivingBase)||!world.isBlockLoaded(this.pos)) return; - TileEntity tile = world.getTileEntity(this.pos); - if(!(tile instanceof IUpgradableDevice)) + IUpgradableDevice machine = getDevice(world); + if(machine==null) return; - IUpgradableDevice machine = (IUpgradableDevice)tile; if(!this.install) machine.removeUpgrade(upgrade); else if(machine.addUpgrade(upgrade, UpgradeOperation.PROBE)) @@ -65,7 +77,7 @@ else if(machine.addUpgrade(upgrade, UpgradeOperation.PROBE)) if(capability==null) return; - //check if ingredients are sufficient + //check if player has the necessary items to install the upgrade if(!(entity instanceof EntityPlayer&&((EntityPlayer)entity).isCreative())) for(IngredientStack requiredStack : upgrade.getRequiredStacks()) { @@ -94,11 +106,9 @@ protected void onClientReceive(WorldClient world, NetHandlerPlayClient handler) { if(world!=null) // This can happen if the task is scheduled right before leaving the world { - TileEntity tile = world.getTileEntity(this.pos); - if(!(tile instanceof IUpgradableDevice)) + IUpgradableDevice machine = getDevice(world); + if(machine==null) return; - IUpgradableDevice machine = (IUpgradableDevice)tile; - if(!install) machine.removeUpgrade(upgrade); else @@ -106,10 +116,29 @@ protected void onClientReceive(WorldClient world, NetHandlerPlayClient handler) } } + private @Nullable IUpgradableDevice getDevice(World world) + { + if(this.upgradedEntityID!=-1) + { + Entity entity = world.getEntityByID(this.upgradedEntityID); + if(!(entity instanceof IUpgradableDevice)) + return null; + return (IUpgradableDevice)entity; + } + else + { + TileEntity tile = world.getTileEntity(this.pos); + if(!(tile instanceof IUpgradableDevice)) + return null; + return (IUpgradableDevice)tile; + } + } + @Override public void fromBytes(ByteBuf buf) { this.installingUserID = buf.readInt(); + this.upgradedEntityID = buf.readInt(); this.pos = readPos(buf); this.install = buf.readBoolean(); this.upgrade = Upgrade.getUpgradeByID(ResLoc.of(readString(buf))); @@ -119,6 +148,7 @@ public void fromBytes(ByteBuf buf) public void toBytes(ByteBuf buf) { buf.writeInt(installingUserID); + buf.writeInt(upgradedEntityID); writePos(buf, pos); buf.writeBoolean(install); writeString(buf, upgrade.getId().toString()); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/IIColor.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/IIColor.java index d5c51989a..c77a78d24 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/IIColor.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/IIColor.java @@ -6,6 +6,7 @@ import net.minecraft.util.text.TextFormatting; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Graphics; import javax.annotation.Nullable; import java.util.Arrays; @@ -444,6 +445,33 @@ public EnumDyeColor getDyeColor() return min.orElse(EnumDyeColor.BLACK); } + //--- II Paint Textures ---// + + /** + * @param hue a hue value from 0 up to {@link Graphics#dynamiclyColoredTextureVariants} + * @return A color from the paint system palette based on the hue value, with fixed saturation and brightness. + * @implNote The hue value is wrapped around the number of available variants, so it can be any integer. + */ + public static IIColor getPaintSystemColor(int hue) + { + //White is a special case, meaning an unpainted object + if(hue < 0) + return WHITE; + return IIColor.fromHSV((hue%Graphics.dynamiclyColoredTextureVariants)/((float)Graphics.dynamiclyColoredTextureVariants), 0.35f, 0.85f); + } + + /** + * @return A color from the paint system palette based on this color's hue, with fixed saturation and brightness. + */ + public IIColor constraintToPaintSystem() + { + //White is a special case, meaning an unpainted object + if(this.equals(WHITE)) + return WHITE; + float[] hsv = getHSV(); + return IIColor.fromHSV(Math.round(hsv[0]*64)/64f, 0.35f, 0.85f); + } + //--- "With" Type Methods ---// /** diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/block/BlockIITileProvider.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/block/BlockIITileProvider.java index 1a10b4cd4..7e9fbbbad 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/block/BlockIITileProvider.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/block/BlockIITileProvider.java @@ -529,7 +529,7 @@ else if(limit==2||limit==5) if(u!=null&&u.getUpgradeInstallProgress(false)==0&&!player.isSneaking()) { TileEntity master = (TileEntity)u; - player.openGui(ImmersiveIntelligence.INSTANCE, IIGUI.UPGRADE.ordinal(), master.getWorld(), master.getPos().getX(), + player.openGui(ImmersiveIntelligence.INSTANCE, IIGUI.UPGRADE_TILE.ordinal(), master.getWorld(), master.getPos().getX(), master.getPos().getY(), master.getPos().getZ()); return true; } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gui/ContainerIIBase.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gui/ContainerIIBase.java index 7331096ee..83e064c3d 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gui/ContainerIIBase.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gui/ContainerIIBase.java @@ -2,37 +2,54 @@ import blusunrize.immersiveengineering.api.IEApi; import blusunrize.immersiveengineering.api.IEEnums.SideConfig; -import blusunrize.immersiveengineering.common.blocks.TileEntityIEBase; -import blusunrize.immersiveengineering.common.gui.ContainerIEBase; import blusunrize.immersiveengineering.common.gui.IESlot; import blusunrize.immersiveengineering.common.gui.IESlot.FluidContainer; +import blusunrize.immersiveengineering.common.gui.IESlot.ICallbackContainer; +import blusunrize.immersiveengineering.common.util.Utils; import blusunrize.immersiveengineering.common.util.inventory.IIEInventory; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.inventory.Container; -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.Slot; +import net.minecraft.inventory.*; import net.minecraft.item.ItemStack; +import net.minecraft.util.NonNullList; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TextComponentString; import pl.pabilo8.immersiveintelligence.api.crafting.DataProgrammingRecipe; import pl.pabilo8.immersiveintelligence.api.rotary.IMotorGear; +import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.function.Predicate; +import java.util.function.Supplier; /** + * Common Immersive Intelligence container base for TileEntity, Entity and ItemStack backed GUIs. + *
@@ -33,20 +33,20 @@ * @ii-approved 0.3.1 * @implSpec Callers must provide:
    *
  • entries (full list)
  • - *
  • predicate telling whether entry is a "job"
  • + *
  • predicate telling whether entry is a "job"; non-job entries are shown as requests
  • *
  • entry renderer + click callback
  • *
  • button actions (usually implemented by the GUI owning the data)
  • *
* @since 08.02.2026 */ -public class DecoTaskJobList> extends DecoPanel +public class DecoTaskList> extends DecoPanel { private static final int TAB_H = 18; private static final int BTN_W = 25, BTN_H = 14, BTN_GAP = 1; private static final int LIST_Y_OFF = 8+TAB_H-4; private int listWidth, listHeight; - private ListMode mode = ListMode.TASKS; + private ListMode mode = ListMode.JOBS; private EasyCollection allEntries; private Predicate isJobPredicate = t -> false; private DecoList list; @@ -66,7 +66,7 @@ public class DecoTaskJobList> extends @Nullable private Consumer onSelectedChanged; - public DecoTaskJobList(int x, int y) + public DecoTaskList(int x, int y) { super(x, y); withBackground(null); @@ -76,29 +76,29 @@ public DecoTaskJobList(int x, int y) //--- Setters ---// @Override - public DecoTaskJobList withSize(int width, int height) + public DecoTaskList withSize(int width, int height) { this.listWidth = width; this.listHeight = height; //noinspection unchecked - return (DecoTaskJobList)super.withSize(listWidth, LIST_Y_OFF+listHeight+4+BTN_H+4); + return (DecoTaskList)super.withSize(listWidth, LIST_Y_OFF+listHeight+4+BTN_H+4); } - public DecoTaskJobList withEntries(EasyCollection entries) + public DecoTaskList withEntries(EasyCollection entries) { this.allEntries = entries; refreshListEntries(); return this; } - public DecoTaskJobList withIsJobPredicate(Predicate predicate) + public DecoTaskList withIsJobPredicate(Predicate predicate) { this.isJobPredicate = predicate!=null?predicate: (t -> false); refreshListEntries(); return this; } - public DecoTaskJobList withDisplayFunction(DecoEntryPanelBuilder builder) + public DecoTaskList withDisplayFunction(DecoEntryPanelBuilder builder) { this.displayFunction = builder; if(list!=null) @@ -106,9 +106,9 @@ public DecoTaskJobList withDisplayFunction(DecoEntryPanelBuilder builder) return this; } - public DecoTaskJobList withModeHandling(@Nullable ListMode initialMode, Consumer onModeChanged) + public DecoTaskList withModeHandling(@Nullable ListMode initialMode, Consumer onModeChanged) { - this.mode = mode==null?ListMode.TASKS: mode; + this.mode = normalizeMode(initialMode); this.onModeChanged = onModeChanged; return this; } @@ -116,7 +116,7 @@ public DecoTaskJobList withModeHandling(@Nullable ListMode initialMode, Consu /** * Fired whenever selection changes (including becoming null due to filtering/mode change). */ - public DecoTaskJobList withOnSelectedChanged(@Nullable Consumer onSelectedChanged) + public DecoTaskList withOnSelectedChanged(@Nullable Consumer onSelectedChanged) { this.onSelectedChanged = onSelectedChanged; return this; @@ -125,7 +125,7 @@ public DecoTaskJobList withOnSelectedChanged(@Nullable Consumer onSelected /** * Supplies a new blank task for the Add button. */ - public DecoTaskJobList withBlankTaskSupplier(@Nullable Supplier blankTaskSupplier) + public DecoTaskList withBlankTaskSupplier(@Nullable Supplier blankTaskSupplier) { this.blankTaskSupplier = blankTaskSupplier; return this; @@ -134,7 +134,7 @@ public DecoTaskJobList withBlankTaskSupplier(@Nullable Supplier blankTaskS /** * For GUIs that only have a single list type but still want standardized list + buttons. */ - public DecoTaskJobList withShowJobsTab(boolean showJobsTab) + public DecoTaskList withShowJobsTab(boolean showJobsTab) { this.showJobsTab = showJobsTab; return this; @@ -147,12 +147,17 @@ public ListMode getMode() public void setMode(ListMode mode) { - this.mode = mode==null?ListMode.TASKS: mode; + this.mode = normalizeMode(mode); if(onModeChanged!=null) onModeChanged.accept(this.mode); refreshListEntries(); } + private static ListMode normalizeMode(@Nullable ListMode mode) + { + return mode==null||mode==ListMode.TASKS?ListMode.REQUESTS: mode; + } + @Nullable public T getSelected() { @@ -160,7 +165,7 @@ public T getSelected() } /** - * @return entries visible in the current tab (after applying TASKS/JOBS filter). + * @return entries visible in the current tab (after applying REQUESTS/JOBS filter). */ public List getFilteredEntries() { @@ -181,7 +186,7 @@ private void refreshListEntries() //Drop selection if it moved out of current view if(selected!=null&&((mode==ListMode.JOBS)!=isJobPredicate.test(selected))) - setSelected(selected); + setSelected(null); } @Override @@ -191,29 +196,29 @@ protected boolean initialize() return false; //Mode tabs - DecoButton tabTasks = new DecoButton(0, 4) - .withSize(listWidth/2, TAB_H) - .withBackground(DecoTextures.COMPONENT_TAB_VERTICAL) - .withText(GUI_LABEL_KEY+"task_editor.tasks") - .withTranslatedTooltip(GUI_LABEL_KEY+"task_editor.tasks.tooltip") - .withOnLMBPressed(() -> setMode(ListMode.TASKS)); - - DecoButton tabJobs = new DecoButton(listWidth/2, 4) + DecoButton tabJobs = new DecoButton(0, 4) .withSize(listWidth/2, TAB_H) .withBackground(DecoTextures.COMPONENT_TAB_VERTICAL) .withText(GUI_LABEL_KEY+"task_editor.jobs") .withTranslatedTooltip(GUI_LABEL_KEY+"task_editor.jobs.tooltip") .withOnLMBPressed(() -> setMode(ListMode.JOBS)); - addComponent(tabTasks); + DecoButton tabRequests = new DecoButton(listWidth/2, 4) + .withSize(listWidth/2, TAB_H) + .withBackground(DecoTextures.COMPONENT_TAB_VERTICAL) + .withText(GUI_LABEL_KEY+"task_editor.requests") + .withTranslatedTooltip(GUI_LABEL_KEY+"task_editor.requests.tooltip") + .withOnLMBPressed(() -> setMode(ListMode.REQUESTS)); + addComponent(tabJobs); + addComponent(tabRequests); if(!showJobsTab) { - //stretch tasks tab; hide jobs tab - tabTasks.withSize(listWidth, TAB_H); + //stretch requests tab; hide jobs tab + tabRequests.withSize(listWidth, TAB_H); tabJobs.visible = tabJobs.enabled = false; - this.mode = ListMode.TASKS; + this.mode = ListMode.REQUESTS; } //List @@ -292,7 +297,7 @@ private void onDuplicatePressed() //Create a new blank task and copy data from selected into it. T created = allEntries.copyEntry(selected); //Ensure duplicate is visible in current mode, otherwise switch mode to match it - setMode(isJobPredicate.test(created)?ListMode.JOBS: ListMode.TASKS); + setMode(isJobPredicate.test(created)?ListMode.JOBS: ListMode.REQUESTS); refreshListEntries(); } @@ -302,7 +307,7 @@ private void onClearPressed() if(allEntries==null) return; //Clear only current mode - allEntries.removeIf(t -> isJobPredicate.test(t)^this.mode!=ListMode.JOBS); + allEntries.removeIf(t -> isJobPredicate.test(t)!=(this.mode==ListMode.JOBS)); selected = null; refreshListEntries(); } @@ -318,7 +323,12 @@ private void setSelected(@Nullable T selected) public enum ListMode implements ISerializableEnum { - TASKS, - JOBS + REQUESTS, + JOBS, + /** + * @deprecated Use REQUESTS. Kept only so older GUI-sync data and external references do not hard-fail. + */ + @Deprecated + TASKS } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/metal_device/tileentity/inserter/TileEntityInserterBase.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/metal_device/tileentity/inserter/TileEntityInserterBase.java index 7028fece9..1472bd1f7 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/metal_device/tileentity/inserter/TileEntityInserterBase.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/metal_device/tileentity/inserter/TileEntityInserterBase.java @@ -25,6 +25,7 @@ import net.minecraft.util.ITickable; import net.minecraft.util.NonNullList; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3i; import net.minecraft.world.World; @@ -706,17 +707,13 @@ public NBTTagCompound serializeNBT() NBTTagCompound nbt = new NBTTagCompound(); nbt.setString("name", getName()); if(facingIn!=null) - { nbt.setInteger("facingIn", facingIn.getIndex()); - if(distanceIn!=-1) - nbt.setInteger("distanceIn", distanceIn); - } + if(distanceIn!=-1) + nbt.setInteger("distanceIn", MathHelper.clamp(distanceIn, -1, 2)); if(facingOut!=null) - { nbt.setInteger("facingOut", facingOut.getIndex()); - if(distanceOut!=-1) - nbt.setInteger("distanceOut", distanceOut); - } + if(distanceOut!=-1) + nbt.setInteger("distanceOut", MathHelper.clamp(distanceOut, -1, 2)); nbt.setTag("stack", stack.writeToNBT(new NBTTagCompound())); nbt.setBoolean("isJob", isJob); @@ -731,17 +728,13 @@ public NBTTagCompound serializeNBT() public void deserializeNBT(NBTTagCompound nbt) { if(nbt.hasKey("facingIn")) - { facingIn = EnumFacing.getFront(nbt.getInteger("facingIn")); - if(nbt.hasKey("distanceIn")) - distanceIn = nbt.getInteger("distanceIn"); - } + if(nbt.hasKey("distanceIn")) + distanceIn = MathHelper.clamp(nbt.getInteger("distanceIn"), -1, 2); if(nbt.hasKey("facingOut")) - { facingOut = EnumFacing.getFront(nbt.getInteger("facingOut")); - if(nbt.hasKey("distanceOut")) - distanceOut = nbt.getInteger("distanceOut"); - } + if(nbt.hasKey("distanceOut")) + distanceOut = MathHelper.clamp(nbt.getInteger("distanceOut"), -1, 2); if(nbt.hasKey("stack")) { stack = IngredientStack.readFromNBT(nbt.getCompoundTag("stack")); diff --git a/src/main/resources/assets/immersiveintelligence/lang/en_us.lang b/src/main/resources/assets/immersiveintelligence/lang/en_us.lang index 3323e88bb..6900e7069 100644 --- a/src/main/resources/assets/immersiveintelligence/lang/en_us.lang +++ b/src/main/resources/assets/immersiveintelligence/lang/en_us.lang @@ -3188,10 +3188,10 @@ ii.config.Light_Engineer_Armor=Light Engineer Armor #GUI Labels ii.gui.editor.editor_style=Visual/POL Editor -ii.gui.task_editor.tasks=Tasks -ii.gui.task_editor.tasks.tooltip=Tasks are assignments, that are repeated indefinitely. ii.gui.task_editor.jobs=Jobs -ii.gui.task_editor.jobs.tooltip=Jobs are assignments, that are discarded from memory, after a set amount of resource is transfered. +ii.gui.task_editor.jobs.tooltip=Jobs are assignments, that are repeated indefinitely. +ii.gui.task_editor.requests=Requests +ii.gui.task_editor.requests.tooltip=Requests are assignments, that are discarded from memory, after a set amount of resource is transfered. ii.gui.inserter.task_editor=Task Editor ii.gui.inserter.type=Type: From 2b5d4c435be5421a4ac0e1d596e9f1106d771018 Mon Sep 17 00:00:00 2001 From: Pabilo8 Date: Tue, 2 Jun 2026 01:49:32 +0200 Subject: [PATCH 14/23] Changed canister shells to trigger on contact with non-fragile materials --- .../common/entity/ammo/types/EntityAmmoProjectile.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/types/EntityAmmoProjectile.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/types/EntityAmmoProjectile.java index 8446a5b5d..6d8fe2d5d 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/types/EntityAmmoProjectile.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/types/EntityAmmoProjectile.java @@ -344,6 +344,13 @@ protected boolean handleBlockDamage(RayTraceResult hit) PenetrationHardness blockHardness = penHandler.getPenetrationHardness(); boolean canPenetrate = penetrationHardness.compareTo(blockHardness) > 0; + //Explode when canister core contacts a non-fragile block + if(coreType==CoreType.CANISTER&&blockHardness.compareTo(PenetrationHardness.FRAGILE) > 0) + { + detonate(); + return true; + } + //ricochet if the block is unbreakable or the projectile can't penetrate it if(blockHardness!=PenetrationHardness.BEDROCK&&penHandler.canRicochet()&&!canPenetrate) { From ecb38dae9bbc0f2c97a93f361d455253d4562139 Mon Sep 17 00:00:00 2001 From: Pabilo8 Date: Tue, 2 Jun 2026 14:17:28 +0200 Subject: [PATCH 15/23] Finished Arithmetic-Logic Machine GUI --- .../api/data/types/DataTypeExpression.java | 3 +- .../GuiArithmeticLogicMachineEdit.java | 143 +++++++- .../GuiDataInputMachineEdit.java | 30 +- .../component/data_editor/DecoCodeEditor.java | 3 +- .../data_editor/DecoDataEditorExpression.java | 308 +++++++++++++++--- .../client/gui/deco/util/DecoTemplates.java | 27 ++ .../TileEntityArithmeticLogicMachine.java | 38 ++- .../multiblock/arithmetic_logic_machine.json | 8 +- .../immersiveintelligence/lang/en_us.lang | 10 + 9 files changed, 453 insertions(+), 117 deletions(-) diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/api/data/types/DataTypeExpression.java b/src/main/java/pl/pabilo8/immersiveintelligence/api/data/types/DataTypeExpression.java index 4c914bf44..9edc4ef24 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/api/data/types/DataTypeExpression.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/api/data/types/DataTypeExpression.java @@ -100,7 +100,8 @@ public void valueFromNBT(NBTTagCompound nbt) { this.operation = IIDataOperationUtils.getOperationInstance(nbt.getString("Operation")); this.meta = this.operation.getMeta(); - this.requiredVariable = nbt.getString("requiredVariable").charAt(0); + String required = nbt.getString("requiredVariable"); + this.requiredVariable = required.isEmpty()?' ': required.charAt(0); this.data = new DataType[meta.allowedTypes().length]; for(int i = 0; i < meta.allowedTypes().length; i++) diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/arithmetic_logic_machine/GuiArithmeticLogicMachineEdit.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/arithmetic_logic_machine/GuiArithmeticLogicMachineEdit.java index 22e165755..92c916985 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/arithmetic_logic_machine/GuiArithmeticLogicMachineEdit.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/arithmetic_logic_machine/GuiArithmeticLogicMachineEdit.java @@ -2,6 +2,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import pl.pabilo8.immersiveintelligence.api.data.DataPacket; import pl.pabilo8.immersiveintelligence.api.data.DataVariable; import pl.pabilo8.immersiveintelligence.api.data.IIDataOperationUtils; @@ -28,13 +29,17 @@ import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoBackgroundBuilder.SlotStyle; import pl.pabilo8.immersiveintelligence.common.IIContent; import pl.pabilo8.immersiveintelligence.common.IIGUI; +import pl.pabilo8.immersiveintelligence.common.IIUtils; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock0.tileentity.TileEntityArithmeticLogicMachine; import pl.pabilo8.immersiveintelligence.common.gui.ContainerArithmeticLogicMachine; +import pl.pabilo8.immersiveintelligence.common.item.data.ItemIIFunctionalCircuit; import pl.pabilo8.immersiveintelligence.common.util.IIColor; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.EasyNBT; import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT; import javax.annotation.Nullable; import java.util.Collection; +import java.util.Objects; import java.util.stream.Collectors; /** @@ -52,6 +57,7 @@ public class GuiArithmeticLogicMachineEdit extends DecoTileGui circuitOperations; + private DataPacket packet; private DataTypeExpression edited; private ItemStack circuitStack; private boolean cancel = false; @@ -74,18 +80,27 @@ public void onInit() syncAnimatedParts(tile.keyboard, true); //Get circuit and list of all allowed operations - this.circuitStack = tile.getInventory().get(editedCircuit); + this.circuitStack = editedCircuit >= 0&&editedCircuit < tile.getInventory().size()?tile.getInventory().get(editedCircuit): ItemStack.EMPTY; + this.packet = this.packet==null?getCircuitPacket().clone(): this.packet; this.circuitOperations = IIContent.itemCircuit.getOperationsList(this.circuitStack).stream() .map(IIDataOperationUtils::getOperationMeta) + .filter(Objects::nonNull) .collect(Collectors.toList()); //Get currently edited operation DataType value = variableToEdit.getValue(); - this.edited = value instanceof DataTypeExpression?(DataTypeExpression)value: new DataTypeExpression(); + this.edited = value instanceof DataTypeExpression?(DataTypeExpression)value.clone(): new DataTypeExpression(); //If the current operation is not valid for this circuit, set it to the first valid one - if(this.edited.getMeta()==DataOperationNull.INSTANCE_META) - this.edited.setOperation(IIDataOperationUtils.getOperationInstance(circuitOperations.iterator().next().name())); + if(!isOperationAllowed(this.edited.getMeta())) + { + DataOperationMeta firstOperation = circuitOperations.isEmpty()?DataOperationNull.INSTANCE_META: circuitOperations.iterator().next(); + this.edited.setOperation(IIDataOperationUtils.getOperationInstance(firstOperation.name())); + } + + //A cloned packet without the currently edited variable is required, so the selector knows which variable names are unavailable + DataPacket constraints = packet.clone(); + constraints.remove(variableToEdit.getName()); //Build background startBackground() @@ -108,11 +123,10 @@ public void onInit() addComponents( //Variable name selector new DecoDropdownDataLetters(32+4+6+1-32, 4+8+2+1) - .withConstraints(new DataPacket()) //TODO: 23.09.2025 replace with actual packet + .withConstraints(constraints) .withSelectedEntry((Character)variableToEdit.getName()) .withTranslatedTooltip("desc.immersiveintelligence.variable_properties") - .withOnSelectedEntry((oldChar, newChar) -> { - })//changeVariableName(newChar)) + .withOnSelectedEntry((oldChar, newChar) -> changeVariableName(newChar)) .withTextColor(DecoColors.H1, IIColor.fromPackedRGB(0x35322c)) .withBackground(DecoTextures.COMPONENT_DROPDOWN_DATA_LETTER_PAPER) .withDropdownSymbol(DecoTextures.COMPONENT_DROPDOWN_SYMBOL_PAPER), @@ -121,8 +135,8 @@ public void onInit() .withSize(8, 14) .withBackground(DecoTextures.COMPONENT_ARROWS_PAPER) .withOnArrow(arrow -> { - //char cycled = IIUtils.cycleDataPacketCharsAvoiding(variableToEdit.getName(), arrow, false, cloned); - //changeVariableName(cycled); + char cycled = IIUtils.cycleDataPacketCharsAvoiding(variableToEdit.getName(), arrow, false, constraints); + changeVariableName(cycled); }), //Operation selector @@ -139,6 +153,7 @@ public void onInit() .withDisplayFunction(getOperationDropdownDisplayFunction()) .withOnSelectedEntry((oldMeta, newMeta) -> { cancel = true; + storeEditorOutput(); edited.setOperation(IIDataOperationUtils.getOperationInstance(newMeta.name())); variableToEdit = new DataVariable(variableToEdit.getName(), edited); refreshGUI(); @@ -146,10 +161,28 @@ public void onInit() new DecoButton(162+16-4, 2+8+4+1) .withTemplate(DecoTemplates.ACTION_BUTTON_DUPLICATE) - .withSize(18, 18), + .withSize(18, 18) + .withOnLMBPressed(() -> { + char name = findNextFreeVariableName(); + if(name=='\0') + return; + cancel = true; + storeEditorOutput(); + packet.with(variableToEdit); + variableToEdit = new DataVariable(name, edited.clone()); + refreshGUI(); + }), new DecoButton(162+16-4+1+18, 2+8+4+1) .withTemplate(DecoTemplates.ACTION_BUTTON_CLEAR) .withSize(18, 18) + .withOnLMBPressed(() -> { + cancel = true; + edited = new DataTypeExpression(); + if(!circuitOperations.isEmpty()) + edited.setOperation(IIDataOperationUtils.getOperationInstance(circuitOperations.iterator().next().name())); + variableToEdit = new DataVariable(variableToEdit.getName(), edited); + refreshGUI(); + }) ); //Add editor @@ -160,6 +193,8 @@ public void onInit() .withText("ii.gui.editor.editor_style") .withCurrentState(this.codeEditMode) .withOnToggle(result -> { + cancel = true; + storeEditorOutput(); this.codeEditMode = result; refreshGUI(); }) @@ -170,18 +205,100 @@ public void onInit() .withBackground(DecoTextures.COMPONENT_BUTTON_ROUND) .withText("desc.immersiveintelligence.variable_apply") .withSize(48, 12) - .withOnPressed((gui, button, mouseX, mouseY) -> changeGUI(IIGUI.ARITHMETIC_LOGIC_MACHINE_VARIABLES)), + .withOnPressed((gui, button, mouseX, mouseY) -> { + cancel = false; + return changeGUI(IIGUI.ARITHMETIC_LOGIC_MACHINE_VARIABLES); + }), new DecoButton(xSize-48*2-4-4-4-2, 128+8+32-16-2+3+16+2+4) .withBackground(DecoTextures.COMPONENT_BUTTON_ROUND) .withText("Cancel") .withSize(48, 12) .withOnPressed((gui, button, mouseX, mouseY) -> { - //cancel = true; + cancel = true; return changeGUI(IIGUI.ARITHMETIC_LOGIC_MACHINE_VARIABLES); }) ); } + private void changeVariableName(Character newName) + { + //Do nothing if the name remains the same + if(newName==null||newName==variableToEdit.getName()) + return; + + cancel = true; + storeEditorOutput(); + + //Remove existing variable and place it in the packet with the new name + packet.remove(variableToEdit.getName()); + variableToEdit = new DataVariable(newName, edited); + refreshGUI(); + } + + private char findNextFreeVariableName() + { + DataPacket currentPacket = packet.clone(); + currentPacket.remove(variableToEdit.getName()); + for(char c : DataPacket.VARIABLE_NAMES) + if(!currentPacket.has(c)) + return c; + return '\0'; + } + + private boolean isOperationAllowed(DataOperationMeta meta) + { + return meta!=null&&circuitOperations.stream().anyMatch(m -> m.name().equals(meta.name())); + } + + private DataPacket getCircuitPacket() + { + if(tile.getInventory().size() <= editedCircuit) + return new DataPacket(); + ItemStack stack = tile.getInventory().get(editedCircuit); + if(stack.isEmpty()||!(stack.getItem() instanceof ItemIIFunctionalCircuit)) + return new DataPacket(); + return ((ItemIIFunctionalCircuit)stack.getItem()).getStoredData(stack); + } + + private void storeEditorOutput() + { + if(editor==null) + return; + DataType output = editor.outputType(); + if(output instanceof DataTypeExpression) + edited = (DataTypeExpression)output; + variableToEdit = new DataVariable(variableToEdit.getName(), edited); + } + + private void updateLocalCircuitStack(DataPacket packet) + { + if(tile.getInventory().size() <= editedCircuit) + return; + ItemStack stack = tile.getInventory().get(editedCircuit); + if(stack.isEmpty()||!(stack.getItem() instanceof ItemIIFunctionalCircuit)) + return; + ((ItemIIFunctionalCircuit)stack.getItem()).writeDataToItem(stack, packet); + tile.getInventory().set(editedCircuit, stack); + } + + @Override + protected EasyNBT onSaveTileData() + { + EasyNBT nbt = super.onSaveTileData(); + if(editor==null||cancel) + return nbt; + + storeEditorOutput(); + DataPacket updatedPacket = packet.with(variableToEdit); + updateLocalCircuitStack(updatedPacket); + + NBTTagCompound expressions = EasyNBT.newNBT() + .withInt("page", editedCircuit) + .withSerializable("list", updatedPacket) + .unwrap(); + return nbt.withTag("expressions", expressions); + } + private DecoElementDisplay getOperationDropdownDisplayFunction() { return new DecoEntryPanelBuilder() @@ -208,6 +325,6 @@ private DecoElementDisplay getOperationDropdownDisplayFunctio panel.component("image", DecoImage.class) .withImageLocation(metaInfo.getTextureLocation(), true); }) - .withElementTooltip(operation -> "datasystem.immersiveintelligence.function"+operation.name()+".desc"); + .withElementTooltip(operation -> "datasystem.immersiveintelligence.function."+operation.name()+".desc"); } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_input_machine/GuiDataInputMachineEdit.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_input_machine/GuiDataInputMachineEdit.java index be1bb3547..7fb2dee1c 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_input_machine/GuiDataInputMachineEdit.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_input_machine/GuiDataInputMachineEdit.java @@ -12,11 +12,8 @@ import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoDropdownDataLetters; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.collection.DecoDropdown; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.data_editor.DecoDataEditor; -import pl.pabilo8.immersiveintelligence.client.gui.deco.component.label.DecoLabel; -import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoEntryPanelBuilder; -import pl.pabilo8.immersiveintelligence.client.gui.deco.component.visual.DecoImage; -import pl.pabilo8.immersiveintelligence.client.gui.deco.util.*; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoBackgroundBuilder.SlotStyle; +import pl.pabilo8.immersiveintelligence.client.gui.deco.util.*; import pl.pabilo8.immersiveintelligence.common.IIGUI; import pl.pabilo8.immersiveintelligence.common.IIUtils; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock0.tileentity.TileEntityDataInputMachine; @@ -122,30 +119,7 @@ public void onInit() .withMaxDisplayedEntries(5) .withEntries(DecoDataEditor.getEditorTypes(false)) .withSelectedEntry(variableToEdit.getValue().getTypeMeta()) - .withDisplayFunction(new DecoEntryPanelBuilder>() - .withHeight(18) - .withBackground(DecoTextures.BG_PAPER) - .withBackgroundMask(DecoTextures.TEMPLATE_PAPER) - //Type Icon, Label, and Letter - .withComponent("image", new DecoImage(3, 1) - .withSize(16, 16)) - .withLabel("typeLabel", - new DecoLabel(fontRenderer, 20, 1) - .withSize(48, 18) - .withAlign(DecoAlignment.LEFT) - .withText("Integer") - ) - .withElementApplyMethod((typeMeta, panel) -> { - //type label (f.e. integer) - panel.label("typeLabel") - .withText(typeMeta.getTranslatedName()) - .withTextColor(typeMeta.color.withBrightness(0.4f)); - //type icon - panel.component("image", DecoImage.class) - .withImageLocation(typeMeta.getTextureLocation(), true); - }) - .withElementTooltip(typeMeta -> "a") - ) + .withDisplayFunction(DecoTemplates.getDataTypeEntryDisplay()) .withOnSelectedEntry((typeMetaInfo, typeMetaInfo2) -> { cancel = true; variableToEdit = new DataVariable(variableToEdit.getName(), typeMetaInfo2.supplier.get()); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/data_editor/DecoCodeEditor.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/data_editor/DecoCodeEditor.java index 46c2def9b..784ed7f95 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/data_editor/DecoCodeEditor.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/data_editor/DecoCodeEditor.java @@ -42,6 +42,7 @@ protected boolean initialize() @Override public DataType outputType() { - return null; + // The code view is currently a read-only preview; never return null, or applying the editor would erase the variable. + return dataType; } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/data_editor/DecoDataEditorExpression.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/data_editor/DecoDataEditorExpression.java index a0d907093..7a6a7536f 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/data_editor/DecoDataEditorExpression.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/data_editor/DecoDataEditorExpression.java @@ -1,29 +1,42 @@ package pl.pabilo8.immersiveintelligence.client.gui.deco.component.data_editor; -import net.minecraft.util.text.TextFormatting; +import pl.pabilo8.immersiveintelligence.api.data.DataPacket; import pl.pabilo8.immersiveintelligence.api.data.IIDataTypeUtils; import pl.pabilo8.immersiveintelligence.api.data.operations.DataOperation.DataOperationMeta; import pl.pabilo8.immersiveintelligence.api.data.types.DataTypeAccessor; import pl.pabilo8.immersiveintelligence.api.data.types.DataTypeExpression; import pl.pabilo8.immersiveintelligence.api.data.types.generic.DataType; import pl.pabilo8.immersiveintelligence.api.data.types.generic.DataType.TypeMetaInfo; -import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoButton; -import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoTab; -import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoTabGroup; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.*; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.collection.DecoDropdown; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoPanel; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoAlignment; +import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoColors; +import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoTemplates; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoTextures; -import pl.pabilo8.immersiveintelligence.common.util.IIStringUtil; +import pl.pabilo8.immersiveintelligence.common.util.IIColor; +import pl.pabilo8.immersiveintelligence.common.util.IIReference; + +import javax.annotation.Nullable; /** + * Visual editor for {@link DataTypeExpression} used by the Arithmetic-Logic Machine. + * * @author Pabilo8 (pabilo@iiteam.net) * @since 07.09.2021 */ public class DecoDataEditorExpression extends DecoDataEditor { private int page = 0; + @Nullable private DecoPanel editor; + @Nullable + private DecoDataEditor argumentEditor; + @Nullable + private DecoDropdownDataLetters argumentAccessorDropdown; + @Nullable + private DecoDropdownDataLetters conditionDropdown; + private boolean conditionEnabled; public DecoDataEditorExpression(int x, int y, DataTypeExpression dataType) { @@ -36,90 +49,277 @@ protected boolean initialize() cleanup(); if(!super.initialize()) return false; + DataOperationMeta meta = dataType.getMeta(); + ensureArgumentArray(meta); + if(page < 0||page > meta.params().length) + page = 0; + + addComponent(buildTabs(meta)); + + if(page==0) + initializePropertiesPage(); + else + initializeArgumentPage(meta, page-1); + + return true; + } - //Initialize tabs - DecoTabGroup groups = new DecoTabGroup(0, 4) + private DecoTabGroup buildTabs(DataOperationMeta meta) + { + DecoTabGroup group = new DecoTabGroup(0, 4) .withSize(width, 12) .withHorizontalAlignment(true) .withTab((DecoTab)new DecoTab() - .withText("Properties") + .withText(IIReference.DESCRIPTION_KEY+"variable_properties") .withPadding(4, 2, 4, 2) .withOnPressed((gui, button, mouseX, mouseY) -> setPage(0)) - .withTranslatedTooltip("Properties", IIStringUtil.getItalicString(TextFormatting.GRAY+"Edit expression properties, like conditional variables.")) + .withTranslatedTooltip(IIReference.DESCRIPTION_KEY+"variable_properties.tooltip") ); + String[] params = meta.params(); for(int paramID = 0; paramID < params.length; paramID++) { int finalParamID = paramID+1; - groups.withTab((DecoTab)new DecoTab() + group.withTab((DecoTab)new DecoTab() .withText("datasystem.immersiveintelligence.function."+meta.name()+".param."+params[paramID]) .withPadding(4, 2, 4, 2) .withOnPressed((gui, button, mouseX, mouseY) -> setPage(finalParamID)) ); } - addComponents(groups); + return group; + } - //Initialize editor - removeComponent(this.editor); - if(page==0) - { - this.editor = addComponent(new DecoPanel(0, 16)) - .withSize(width, height-16) - .withBackground(null); - this.editor.addLabel("Here be parameters", 2, 2); - } - else - { - DataType argument = dataType.getArgument(page-1); + private void initializePropertiesPage() + { + this.editor = addComponent(new DecoPanel(0, 16)) + .withSize(width, height-16) + .withBackground(null) + .withBackgroundMask(null); - DecoPanel typePanel = addComponent(new DecoPanel(0, 16) - .withSize(width, 20) - .withBackground(DecoTextures.BG_PAPER) - .withBackgroundMask(DecoTextures.TEMPLATE_PAPER) - ); + assert editor!=null; - typePanel.addLabel("Type", 4, 2) - .withSize(30, 16) - .withAlign(DecoAlignment.LEFT); - typePanel.addComponents(new DecoDropdown>(34, 2) - .withSize(width-32-2-16-2-2, 16) - .withDropdownWidth(width-16) - .withBackground(DecoTextures.COMPONENT_BUTTON_PAPER) - .withDropdownSymbol(DecoTextures.COMPONENT_DROPDOWN_SYMBOL_PAPER) - .withEntries(IIDataTypeUtils.metaTypesByClass.get(DataTypeAccessor.class), - IIDataTypeUtils.metaTypesByClass.get(meta.allowedTypes()[page-1]) - ), - new DecoButton(width-17-2, 2) - .withText("@") - .withSize(16, 16) - .withBackground(DecoTextures.COMPONENT_BUTTON_PAPER) - ); + conditionEnabled = dataType.getRequiredVariable()!=' '; - //Get editor - this.editor = DecoDataEditor.getEditorFor(argument, 0, 36); - if(editor!=null) - addComponent(editor.withSize(this.width, this.height-36) - .withBackground(DecoTextures.BG_STEEL) - .withBackgroundMask(DecoTextures.TEMPLATE_PAPER) - ); - } - return true; + DecoPanel basePanel = editor.addComponent(new DecoPanel(0, 0) + .withSize(width, 36) + .withBackground(DecoTextures.BG_PAPER) + .withBackgroundMask(DecoTextures.TEMPLATE_PAPER) + ); + + basePanel.addLabel(IIReference.DESCRIPTION_KEY+"conditional_variable", 4, 5) + .withSize(width-8, 10) + .withAlign(DecoAlignment.LEFT) + .withTranslatedTooltip(IIReference.DESCRIPTION_KEY+"conditional_variable.enabled.tooltip"); + + editor.addComponent(new DecoSwitch(6, 18) + .withText(IIReference.DESCRIPTION_KEY+"conditional_variable.enabled") + .withCurrentState(conditionEnabled) + .withOnToggle(state -> { + conditionEnabled = state; + if(conditionDropdown!=null) + conditionDropdown.visible = conditionDropdown.enabled = state; + }) + ).withSize(72, 12) + .withTranslatedTooltip(IIReference.DESCRIPTION_KEY+"conditional_variable.enabled.tooltip"); + + editor.addComponent((conditionDropdown = new DecoDropdownDataLetters(width-26, 16-4)) + .withConstraints(new DataPacket()) + .withSelectedEntry((Character)(conditionEnabled?dataType.getRequiredVariable(): 'a')) + .withTranslatedTooltip(IIReference.DESCRIPTION_KEY+"conditional_variable.tooltip") + .withTextColor(DecoColors.H1, IIColor.fromPackedRGB(0x35322c)) + .withBackground(DecoTextures.COMPONENT_DROPDOWN_DATA_LETTER_PAPER) + .withDropdownSymbol(DecoTextures.COMPONENT_DROPDOWN_SYMBOL_PAPER) + ); + conditionDropdown.withSize(18, 18); + conditionDropdown.visible = conditionDropdown.enabled = conditionEnabled; + } + + private void initializeArgumentPage(DataOperationMeta meta, int argumentID) + { + Class expectedType = meta.allowedTypes()[argumentID]; + DataType argument = getArgument(argumentID, expectedType); + boolean accessor = argument instanceof DataTypeAccessor; + + this.editor = addComponent(new DecoPanel(0, 16)) + .withSize(width, height-16) + .withBackground(null) + .withBackgroundMask(null); + + TypeMetaInfo accessorMeta = IIDataTypeUtils.metaTypesByClass.get(DataTypeAccessor.class); + TypeMetaInfo expectedMeta = IIDataTypeUtils.metaTypesByClass.get(expectedType); + + DecoPanel paperPanel; + editor.addComponents( + paperPanel = new DecoPanel(0, 0) + .withSize(width, 24) + .withBackground(DecoTextures.BG_PAPER) + .withBackgroundMask(DecoTextures.TEMPLATE_PAPER), + new DecoDropdown>(34, 3) + .withSize(width-34-22, 16) + .withDropdownWidth(width-16) + .withMaxDisplayedEntries(4) + .withScrollBarBackground(DecoTextures.COMPONENT_SLIDER_PAPER) + .withBackground(DecoTextures.COMPONENT_BUTTON_PAPER) + .withListBackground(DecoTextures.COMPONENT_TEXT_FIELD) + .withDropdownSymbol(DecoTextures.COMPONENT_DROPDOWN_SYMBOL_PAPER) + .withEntries(accessorMeta, expectedMeta) + .withSelectedEntry(accessor?accessorMeta: expectedMeta) + .withDisplayFunction(DecoTemplates.getDataTypeEntryDisplay()) + .withOnSelectedEntry((oldType, newType) -> { + storeCurrentPageOutput(); + if(newType!=null&&newType.type==DataTypeAccessor.class) + setArgument(argumentID, new DataTypeAccessor(getCurrentAccessorVariable(argument))); + else + setArgument(argumentID, normalizeArgument(argument, expectedType)); + refreshPage(); + }), + new DecoButton(width-20, 3) + .withText("@") + .withSize(16, 16) + .withBackground(DecoTextures.COMPONENT_BUTTON_PAPER) + .withTranslatedTooltip(IIReference.DESCRIPTION_KEY+"expression.accessor.tooltip") + .withOnLMBPressed(() -> { + storeCurrentPageOutput(); + DataType current = getArgument(argumentID, expectedType); + if(current instanceof DataTypeAccessor) + setArgument(argumentID, normalizeArgument(current, expectedType)); + else + setArgument(argumentID, new DataTypeAccessor('a')); + refreshPage(); + }) + ); + paperPanel.addLabel(IIReference.DESCRIPTION_KEY+"variable_type", 4, 5) + .withSize(30, 16) + .withAlign(DecoAlignment.LEFT); + + if(accessor) + initializeAccessorArgument(argument); + else + initializeLiteralArgument(argument, expectedType); + } + + private void initializeAccessorArgument(DataType argument) + { + assert editor!=null; + editor.addLabel("datasystem.immersiveintelligence.datatype.accessor", 4, 30) + .withSize(60, 16) + .withAlign(DecoAlignment.LEFT); + editor.addComponent( + (argumentAccessorDropdown = new DecoDropdownDataLetters(64, 27)) + .withConstraints(new DataPacket()) + .withSelectedEntry((Character)getCurrentAccessorVariable(argument)) + .withTranslatedTooltip(IIReference.DESCRIPTION_KEY+"expression.accessor.tooltip") + .withTextColor(IIColor.fromPackedRGB(0x161c26), IIColor.fromPackedRGB(0x35322c)) + .withBackground(DecoTextures.COMPONENT_DROPDOWN_DATA_LETTER_PAPER) + .withDropdownSymbol(DecoTextures.COMPONENT_DROPDOWN_SYMBOL_PAPER) + ); + argumentAccessorDropdown.withSize(18, 18); + } + + private void initializeLiteralArgument(DataType argument, Class expectedType) + { + argumentEditor = DecoDataEditor.getEditorFor(argument, 4, 27); + assert editor!=null; + if(argumentEditor!=null) + editor.addComponent(argumentEditor) + .withSize(width-8, height-43); + else + editor.addLabel(IIReference.DESCRIPTION_KEY+"no_editor", 4, 30) + .withSize(width-8, 16) + .withAlign(DecoAlignment.LEFT) + .withTextColor(IIDataTypeUtils.metaTypesByClass.get(expectedType).color.withBrightness(0.4f)); } + //--- Utils ---// + private boolean setPage(int page) { if(page==this.page) return false; + storeCurrentPageOutput(); this.page = page; - this.initialized = false; + refreshPage(); return true; } + private void refreshPage() + { + this.argumentEditor = null; + this.argumentAccessorDropdown = null; + this.conditionDropdown = null; + this.initialized = false; + } + + private void storeCurrentPageOutput() + { + if(page==0) + { + if(conditionDropdown!=null) + { + Character selected = conditionDropdown.getSelectedEntry(); + dataType.setRequiredVariable(conditionEnabled?(selected==null?'a': selected): ' '); + } + else if(!conditionEnabled) + dataType.setRequiredVariable(' '); + return; + } + + int argumentID = page-1; + if(dataType.data==null||argumentID < 0||argumentID >= dataType.data.length) + return; + + DataType current = dataType.data[argumentID]; + if(current instanceof DataTypeAccessor) + { + Character selected = argumentAccessorDropdown==null?null: argumentAccessorDropdown.getSelectedEntry(); + setArgument(argumentID, new DataTypeAccessor(selected==null?'a': selected)); + } + else if(argumentEditor!=null) + setArgument(argumentID, argumentEditor.outputType()); + } + + private void ensureArgumentArray(DataOperationMeta meta) + { + if(dataType.data==null||dataType.data.length!=meta.allowedTypes().length) + dataType.setOperation(dataType.getOperation()); + } + + private DataType getArgument(int index, Class expectedType) + { + ensureArgumentArray(dataType.getMeta()); + if(index < 0||index >= dataType.data.length) + return IIDataTypeUtils.getVarInstance(expectedType); + DataType argument = dataType.data[index]; + if(argument instanceof DataTypeAccessor) + return argument; + return normalizeArgument(argument, expectedType); + } + + private DataType normalizeArgument(@Nullable DataType argument, Class expectedType) + { + if(argument!=null&&expectedType.isAssignableFrom(argument.getClass())) + return argument.clone(); + return IIDataTypeUtils.getVarInstance(expectedType); + } + + private void setArgument(int index, DataType value) + { + if(dataType.data==null||index < 0||index >= dataType.data.length) + return; + dataType.data[index] = value; + } + + private char getCurrentAccessorVariable(DataType argument) + { + return argument instanceof DataTypeAccessor?((DataTypeAccessor)argument).variable: 'a'; + } + @Override public DataTypeExpression outputType() { + storeCurrentPageOutput(); return dataType; } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/util/DecoTemplates.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/util/DecoTemplates.java index 7afac319f..68fed6684 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/util/DecoTemplates.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/util/DecoTemplates.java @@ -5,6 +5,7 @@ import net.minecraft.util.text.TextFormatting; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +import pl.pabilo8.immersiveintelligence.api.data.types.generic.DataType.TypeMetaInfo; import pl.pabilo8.immersiveintelligence.api.rotary.IRotaryEnergy; import pl.pabilo8.immersiveintelligence.client.IIClientUtils; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.DecoComponent.DecoComponentTemplate; @@ -165,4 +166,30 @@ public class DecoTemplates }) ); + public static DecoEntryPanelBuilder> getDataTypeEntryDisplay() + { + return new DecoEntryPanelBuilder>() + .withHeight(18) + .withBackground(DecoTextures.BG_PAPER) + .withBackgroundMask(DecoTextures.TEMPLATE_PAPER) + //Type Icon, Label, and Letter + .withComponent("image", new DecoImage(3, 1) + .withSize(16, 16)) + .withLabel("typeLabel", + new DecoLabel(IIClientUtils.fontRegular, 20, 1) + .withSize(48, 18) + .withAlign(DecoAlignment.LEFT) + .withText("Integer") + ) + .withElementApplyMethod((typeMeta, panel) -> { + //type label (f.e. integer) + panel.label("typeLabel") + .withText(typeMeta.getTranslatedName()) + .withTextColor(typeMeta.color.withBrightness(0.4f)); + //type icon + panel.component("image", DecoImage.class) + .withImageLocation(typeMeta.getTextureLocation(), true); + }) + .withElementTooltip(typeMeta -> "a"); + } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock0/tileentity/TileEntityArithmeticLogicMachine.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock0/tileentity/TileEntityArithmeticLogicMachine.java index 68d3c6dac..91e2098e7 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock0/tileentity/TileEntityArithmeticLogicMachine.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock0/tileentity/TileEntityArithmeticLogicMachine.java @@ -2,15 +2,12 @@ import blusunrize.immersiveengineering.api.energy.immersiveflux.FluxStorageAdvanced; import blusunrize.immersiveengineering.common.util.Utils; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.NonNullList; import net.minecraft.util.SoundCategory; -import org.apache.commons.lang3.ArrayUtils; -import net.minecraft.entity.player.EntityPlayer; -import javax.annotation.Nullable; import pl.pabilo8.immersiveintelligence.api.data.DataPacket; -import pl.pabilo8.immersiveintelligence.api.data.IIDataHandlingUtils; import pl.pabilo8.immersiveintelligence.api.data.types.DataTypeExpression; import pl.pabilo8.immersiveintelligence.api.data.types.generic.DataType; import pl.pabilo8.immersiveintelligence.api.upgrade.IManagedUpgradableDevice; @@ -34,14 +31,15 @@ import pl.pabilo8.immersiveintelligence.common.util.multiblock.util.MultiblockPOI; import javax.annotation.Nonnull; +import javax.annotation.Nullable; /** * @author Pabilo8 (pabilo@iiteam.net) * @author Avalon (avalon@iiteam.net) * @updated 08.01.2024 * @ii-approved 0.3.1 - * @since 28.06.2019 * @updated 03.30.2026 + * @since 28.06.2019 */ public class TileEntityArithmeticLogicMachine extends TileEntityMultiblockIIGeneric implements IIIGuiMultiblockTile, IBooleanAnimatedPartsBlock, IManagedUpgradableDevice @@ -85,18 +83,25 @@ protected void dummyCleanup() public void receiveMessageFromClient(@Nonnull NBTTagCompound message) { super.receiveMessageFromClient(message); - //Receive edits from GUI + //Receive expression edits from the circuit editor GUI if(message.hasKey("expressions")) { - //Get updated expressions NBTTagCompound expressions = message.getCompoundTag("expressions"); int page = expressions.getInteger("page"); + if(page < 0||page >= inventory.size()) + return; + //Update circuit stack ItemStack stack = inventory.get(page); + if(stack.isEmpty()||!(stack.getItem() instanceof ItemIIFunctionalCircuit)) + return; + DataPacket packet = new DataPacket(expressions.getCompoundTag("list")); ((ItemIIFunctionalCircuit)stack.getItem()).writeDataToItem(stack, packet); inventory.set(page, stack); + markDirty(); + forceTileUpdate(); } } @@ -116,8 +121,10 @@ protected int[] listAllPOI(MultiblockPOI poi) { case ENERGY_INPUT: return getPOI("energy"); - case DATA: - return getPOI("data"); + case DATA_INPUT: + return getPOI("data_in"); + case DATA_OUTPUT: + return getPOI("data_out"); case MISC_CONTROL_PANEL: return getPOI("front_panel"); case MISC_CRATE: @@ -132,11 +139,11 @@ protected int[] listAllPOI(MultiblockPOI poi) public void receiveData(DataPacket packet, int pos) { //Prepare reply packet - boolean fromLeft = ArrayUtils.contains(getPOI("data_left"), pos); DataPacket newPacket = packet.clone(); //Process received packet with circuits - int circuitsAmount = isUpgradeInstalled(IIContent.UPGRADE_CIRCUIT_RACKS)?MultiblockArithmeticLogicMachine.CIRCUITS_UPGRADED: MultiblockArithmeticLogicMachine.CIRCUITS_BASE; + int circuitsAmount = isUpgradeInstalled(IIContent.UPGRADE_CIRCUIT_RACKS)?MultiblockArithmeticLogicMachine.CIRCUITS_UPGRADED: + MultiblockArithmeticLogicMachine.CIRCUITS_BASE; boolean[] circuit = new boolean[circuitsAmount]; DataPacket[] cPacket = new DataPacket[circuitsAmount]; @@ -168,17 +175,14 @@ public void receiveData(DataPacket packet, int pos) DataTypeExpression exp = ((DataTypeExpression)var); char condition = exp.getRequiredVariable(); - //Respect condition, if set - if(condition==' '||IIDataHandlingUtils.asBoolean(condition, packet)) + //Respect condition, if set: expressions with a required variable only run when that variable is present in the input packet. + if(condition==' '||packet.has(condition)) newPacket.set(c, exp.getValue(newPacket)); } } //Send reply to opposite side - sendData(newPacket, - fromLeft?facing.rotateY(): facing.rotateYCCW(), - (fromLeft?getPOI("data_right"): getPOI("data_left"))[0] - ); + sendData(newPacket, getDirection("data_out"), getPOI("data_out")[0]); } @Override diff --git a/src/main/resources/assets/immersiveintelligence/aabb/multiblock/arithmetic_logic_machine.json b/src/main/resources/assets/immersiveintelligence/aabb/multiblock/arithmetic_logic_machine.json index 13d60af81..22b86b9cb 100644 --- a/src/main/resources/assets/immersiveintelligence/aabb/multiblock/arithmetic_logic_machine.json +++ b/src/main/resources/assets/immersiveintelligence/aabb/multiblock/arithmetic_logic_machine.json @@ -5,11 +5,13 @@ }, "poi": { "energy": 16, - "data": [2, 3], - "data_left": 2, - "data_right": 3, + "data_in": 2, + "data_out": 3, "front_panel": [], "crates": [], "door": [] + }, + "rotations": { + "data_out": "clockwise_90" } } \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/lang/en_us.lang b/src/main/resources/assets/immersiveintelligence/lang/en_us.lang index 6900e7069..6703926b3 100644 --- a/src/main/resources/assets/immersiveintelligence/lang/en_us.lang +++ b/src/main/resources/assets/immersiveintelligence/lang/en_us.lang @@ -1270,13 +1270,23 @@ desc.immersiveintelligence.variable_send_packet=Send Packet desc.immersiveintelligence.variable_send_packet_desc=Sends the current packet to data network desc.immersiveintelligence.variable_remove_desc=Remove a variable desc.immersiveintelligence.variable_properties=Properties +desc.immersiveintelligence.variable_properties.tooltip=Edit expression properties, like conditional variables. desc.immersiveintelligence.variable_value=Value: desc.immersiveintelligence.operation=Operation: + desc.immersiveintelligence.conditional_variable=Conditional Variable: +desc.immersiveintelligence.conditional_variable.enabled=Use condition +desc.immersiveintelligence.conditional_variable.enabled.tooltip=When enabled, the expression will not run, unless the selected variable is present in the packet operated on +desc.immersiveintelligence.conditional_variable.tooltip=Variable required for this expression to run + +desc.immersiveintelligence.expression.accessor.tooltip=Use a variable from the received packet instead of a literal value +desc.immersiveintelligence.expression.condition.info=When enabled, this expression only runs if the selected variable exists in the received packet. + desc.immersiveintelligence.no_variable=None desc.immersiveintelligence.variable=Variable: desc.immersiveintelligence.variable_apply=Apply desc.immersiveintelligence.variable_remove=Remove +desc.immersiveintelligence.no_editor=No editor available. desc.immersiveintelligence.diplomacy.ownedby=Property of %s desc.immersiveintelligence.diplomacy.noowner=Abandoned Property From 14507f7bf0a076d18c878553e4cbc448c5bcd148 Mon Sep 17 00:00:00 2001 From: Pabilo8 Date: Tue, 2 Jun 2026 17:54:28 +0200 Subject: [PATCH 16/23] Reworked Data Router to use a list of rules to manage data flow and added a GUI for it --- .../api/LogisticTag.java | 2 +- .../GuiArithmeticLogicMachineEdit.java | 4 +- .../GuiDataInputMachineEdit.java | 4 +- .../gui/block/data_router/GuiDataRouter.java | 119 ++++++ .../block/data_router/GuiDataRouterEdit.java | 276 ++++++++++++++ .../immersiveintelligence/common/IIGUI.java | 7 + .../tileentity/TileEntityDataRouter.java | 357 +++++++++++++++--- .../common/gui/ContainerDataMerger.java | 18 +- .../common/gui/ContainerDataRouter.java | 28 ++ .../immersiveintelligence/lang/en_us.lang | 29 +- 10 files changed, 771 insertions(+), 73 deletions(-) create mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_router/GuiDataRouter.java create mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_router/GuiDataRouterEdit.java create mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerDataRouter.java diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/api/LogisticTag.java b/src/main/java/pl/pabilo8/immersiveintelligence/api/LogisticTag.java index de45699b0..693584d61 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/api/LogisticTag.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/api/LogisticTag.java @@ -211,7 +211,7 @@ public NBTTagCompound serializeNBT() .withString("origin", origin) .withString("destination", destination) .withColor("color", IIColor.fromDye(color)) - .withUUID("owner", owner) + .conditionally(owner!=null, tis -> tis.withUUID("owner", owner)) .withInt("batch_number", batchNumber) .unwrap(); } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/arithmetic_logic_machine/GuiArithmeticLogicMachineEdit.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/arithmetic_logic_machine/GuiArithmeticLogicMachineEdit.java index 92c916985..28827904e 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/arithmetic_logic_machine/GuiArithmeticLogicMachineEdit.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/arithmetic_logic_machine/GuiArithmeticLogicMachineEdit.java @@ -203,7 +203,7 @@ public void onInit() addComponents( new DecoButton(xSize-48-4-4-4-2, 128+8-16+32-2+3+16+2+4) .withBackground(DecoTextures.COMPONENT_BUTTON_ROUND) - .withText("desc.immersiveintelligence.variable_apply") + .withText("ii.gui.button.apply") .withSize(48, 12) .withOnPressed((gui, button, mouseX, mouseY) -> { cancel = false; @@ -211,7 +211,7 @@ public void onInit() }), new DecoButton(xSize-48*2-4-4-4-2, 128+8+32-16-2+3+16+2+4) .withBackground(DecoTextures.COMPONENT_BUTTON_ROUND) - .withText("Cancel") + .withText("ii.gui.button.cancel") .withSize(48, 12) .withOnPressed((gui, button, mouseX, mouseY) -> { cancel = true; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_input_machine/GuiDataInputMachineEdit.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_input_machine/GuiDataInputMachineEdit.java index 7fb2dee1c..032556802 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_input_machine/GuiDataInputMachineEdit.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_input_machine/GuiDataInputMachineEdit.java @@ -128,7 +128,7 @@ public void onInit() new DecoButton(xSize-48-4-4-4-2, 153) .withBackground(DecoTextures.COMPONENT_BUTTON_ROUND) - .withText("Apply") + .withText("ii.gui.button.apply") .withSize(48, 12) .withOnPressed((gui, button, mouseX, mouseY) -> { cancel = false; @@ -136,7 +136,7 @@ public void onInit() }), new DecoButton(xSize-96-4-4-4-2, 153) .withBackground(DecoTextures.COMPONENT_BUTTON_ROUND) - .withText("Cancel") + .withText("ii.gui.button.cancel") .withSize(48, 12) .withOnPressed((gui, button, mouseX, mouseY) -> { cancel = true; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_router/GuiDataRouter.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_router/GuiDataRouter.java new file mode 100644 index 000000000..9004dfff7 --- /dev/null +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_router/GuiDataRouter.java @@ -0,0 +1,119 @@ +package pl.pabilo8.immersiveintelligence.client.gui.block.data_router; + +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoButton; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.label.DecoLabel; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoEntryPanelBuilder; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoTaskList; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoTaskList.ListMode; +import pl.pabilo8.immersiveintelligence.client.gui.deco.util.*; +import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoBackgroundBuilder.SlotStyle; +import pl.pabilo8.immersiveintelligence.common.IIGUI; +import pl.pabilo8.immersiveintelligence.common.block.data_device.tileentity.TileEntityDataRouter; +import pl.pabilo8.immersiveintelligence.common.block.data_device.tileentity.TileEntityDataRouter.DataRoutingRule; +import pl.pabilo8.immersiveintelligence.common.block.data_device.tileentity.TileEntityDataRouter.RoutingAction; +import pl.pabilo8.immersiveintelligence.common.gui.ContainerDataRouter; +import pl.pabilo8.immersiveintelligence.common.util.IIColor; +import pl.pabilo8.immersiveintelligence.common.util.IIReference; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.EasyCollection; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.EasyNBT; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT.SyncEvents; + +/** + * Main Data Router GUI: list of request/job routing rules. + * + * @author Pabilo8 (pabilo@iiteam.net) + * @updated 02.06.2026 + */ +@DecoTemplate(name = "data_router", category = DecoGuiCategory.DATA_TILE) +public class GuiDataRouter extends DecoTileGui +{ + private static final String KEY = IIReference.GUI_LABEL_KEY+"data_router."; + + @SyncNBT(events = SyncEvents.TILE_CLIENT_MESSAGE) + public EasyCollection rules; + @SyncNBT + public int editedRule = -1; + @SyncNBT + public ListMode mode = ListMode.JOBS; + + public GuiDataRouter(EntityPlayer player, TileEntityDataRouter tile) + { + super(player, tile, IIGUI.DATA_ROUTER); + if(tile!=null) + rules = tile.routingRules.clone(); + } + + @Override + public void onInit() + { + if(rules==null) + rules = new EasyCollection<>(DataRoutingRule::new); + + startBackground() + .withBox(DecoTextures.BG_STEEL, 0, 0, 176, 168-8) + .withTitleBar(tile) + .withNextLayer() + .withBox(DecoTextures.BG_WOODEN, DecoTextures.TEMPLATE_ROUND_WOODEN, 0, 168-8, 176, 92) + .withInventorySlots(SlotStyle.VANILLA, container.playerInventory) + .withInventoryTitleBar() + .withFrame(DecoTextures.FRAME_WOODEN_THIN, 4, false, new boolean[]{true, false, false, false}) + .withNextLayer() + .withBox(DecoTextures.BG_STEEL, DecoTextures.TEMPLATE_SQUARE, 0, 168-8-20, 176, 20) + .build(); + + DecoTaskList ruleList; + addComponent((ruleList = new DecoTaskList<>(2, 4)) + .withSize(176-4, 116) + .withEntries(rules) + .withIsJobPredicate(DataRoutingRule::isJob) + .withModeHandling(mode, m -> mode = m) + .withBlankTaskSupplier(() -> { + DataRoutingRule rule = new DataRoutingRule(); + rule.usageLimit = ruleList.getMode()==ListMode.REQUESTS?1: -1; + return rule; + }) + .withDisplayFunction(new DecoEntryPanelBuilder() + .withBackground(DecoTextures.BG_PAPER) + .withBackgroundMask(DecoTextures.TEMPLATE_TICKET) + .withComponent("action", new DecoButton(3, 2) + .withSize(36, 16) + .withDisabled(true) + .withTextDisabledColor(IIColor.fromPackedRGB(0xafafaf)) + ) + .withLabel("route", new DecoLabel(fontRenderer, 3+36+2, 5) + .withSize(58, 12) + .withAlign(DecoAlignment.LEFT) + ) + .withComponent(p -> new DecoButton(p.width-17+1, 2) + .withTemplate(DecoTemplates.ACTION_BUTTON_EDIT) + .withOnLMBPressed(() -> { + editedRule = rules.indexOf(p.getCurrentElement()); + if(editedRule >= 0) + changeGUI(IIGUI.DATA_ROUTER_EDIT); + }) + ) + .withElementApplyMethod((rule, panel) -> { + panel.component("action", DecoButton.class) + .withRawText(rule.action.getLocalizedName()) + .withBackground(DecoTextures.COMPONENT_BUTTON_PAPER) + .withBackgroundColor(rule.action==RoutingAction.ALLOW?DecoColors.ACTION_ADD: DecoColors.ACTION_REMOVE); + panel.label("route").withRawText(I18n.format(KEY+"into", + I18n.format(IIReference.DESCRIPTION_KEY+"side."+rule.outgoingSide.getName()) + )); + }) + ) + ); + } + + @Override + protected EasyNBT onSaveTileData() + { + return super.onSaveTileData() + .withSerializable("rules", rules); + } +} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_router/GuiDataRouterEdit.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_router/GuiDataRouterEdit.java new file mode 100644 index 000000000..70f3ed855 --- /dev/null +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_router/GuiDataRouterEdit.java @@ -0,0 +1,276 @@ +package pl.pabilo8.immersiveintelligence.client.gui.block.data_router; + +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumDyeColor; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumFacing; +import pl.pabilo8.immersiveintelligence.api.data.DataPacket; +import pl.pabilo8.immersiveintelligence.api.data.types.DataTypeNull; +import pl.pabilo8.immersiveintelligence.api.data.types.generic.DataType; +import pl.pabilo8.immersiveintelligence.api.data.types.generic.DataType.TypeMetaInfo; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoButton; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoCheckbox; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoDropdownDataLetters; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.collection.DecoDropdown; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.collection.DecoElementDisplays; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.data_editor.DecoDataEditor; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoPanel; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoTaskList.ListMode; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.text.DecoTextField; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.text.util.TextFilter; +import pl.pabilo8.immersiveintelligence.client.gui.deco.util.*; +import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoBackgroundBuilder.SlotStyle; +import pl.pabilo8.immersiveintelligence.common.IIGUI; +import pl.pabilo8.immersiveintelligence.common.block.data_device.tileentity.TileEntityDataRouter; +import pl.pabilo8.immersiveintelligence.common.block.data_device.tileentity.TileEntityDataRouter.DataRoutingRule; +import pl.pabilo8.immersiveintelligence.common.block.data_device.tileentity.TileEntityDataRouter.RoutingAction; +import pl.pabilo8.immersiveintelligence.common.gui.ContainerDataRouter; +import pl.pabilo8.immersiveintelligence.common.util.IIColor; +import pl.pabilo8.immersiveintelligence.common.util.IIReference; +import pl.pabilo8.immersiveintelligence.common.util.IIStringUtil; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.EasyCollection; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.EasyNBT; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT.SyncEvents; + +import javax.annotation.Nullable; + +/** + * Data Router rule editor. + * + * @author Pabilo8 (pabilo@iiteam.net) + * @updated 02.06.2026 + */ +@DecoTemplate(name = "data_router_edit", category = DecoGuiCategory.DATA_TILE) +public class GuiDataRouterEdit extends DecoTileGui +{ + private static final String KEY = IIReference.GUI_LABEL_KEY+"data_router."; + + @SyncNBT(events = SyncEvents.TILE_CLIENT_MESSAGE) + public EasyCollection rules; + @SyncNBT + public int editedRule = -1; + @SyncNBT + public ListMode mode = ListMode.JOBS; + @SyncNBT + public DataRoutingRule edited = new DataRoutingRule(); + @Nullable + private DecoDataEditor valueEditor; + private boolean cancel = true, loaded = false; + + public GuiDataRouterEdit(EntityPlayer player, TileEntityDataRouter tile) + { + super(player, tile, IIGUI.DATA_ROUTER_EDIT); + if(tile!=null) + rules = tile.routingRules.clone(); + } + + @Override + public void onInit() + { + if(rules==null) + rules = new EasyCollection<>(DataRoutingRule::new); + if(editedRule < 0||editedRule >= rules.size()) + { + cancel = true; + changeGUI(IIGUI.DATA_ROUTER); + return; + } + if(!loaded) + { + edited = rules.get(editedRule).copy(); + loaded = true; + } + + startBackground() + .withBox(DecoTextures.BG_STEEL, 0, 0, 240, 184+12) + .withTitleBar(KEY+"rule_properties") + .withBox(DecoTextures.BG_WOODEN, DecoTextures.TEMPLATE_ROUND_WOODEN, 32, 184+12, 176, 92) + .withInventorySlots(SlotStyle.VANILLA, container.playerInventory) + .withInventoryTitleBar() + .withNextLayer() + + .withBox(DecoTextures.BG_STEEL, DecoTextures.TEMPLATE_ROUND, 4, 8+4, 224+8, 48-8) + .withTitleBar(KEY+"routing", DecoAlignment.TOP_LEFT) + .withNextLayer() + + .withBox(DecoTextures.BG_STEEL, DecoTextures.TEMPLATE_ROUND, 4, 8+4+48-4, 224+8, 128+12) + .withTitleBar(KEY+"packet_filters", DecoAlignment.TOP_LEFT) + .withNextLayer() + .build(); + + DecoPanel panel = addComponent(new DecoPanel(12, 16)) + .withSize(216, 8+4+48-4+128+4) + .withBackground(null); + + int yy = 0; + addRoutingSection(panel, yy); + yy += 48; + addPacketFilterSection(panel, yy); + yy += 14; + addValueFilterSection(panel, yy); + + addComponents( + new DecoButton(xSize-48-4-4-4-2+2, 180+8-8-4+16) + .withBackground(DecoTextures.COMPONENT_BUTTON_ROUND) + .withText("ii.gui.button.apply") + .withSize(48, 12) + .withOnPressed((gui, button, mouseX, mouseY) -> { + storeEditorValue(); + rules.set(editedRule, edited.copy()); + cancel = false; + return changeGUI(IIGUI.DATA_ROUTER); + }), + new DecoButton(xSize-48*2-4-4-4-2+2, 180+8-8-4+16) + .withBackground(DecoTextures.COMPONENT_BUTTON_ROUND) + .withText("ii.gui.button.cancel") + .withSize(48, 12) + .withOnPressed((gui, button, mouseX, mouseY) -> { + cancel = true; + return changeGUI(IIGUI.DATA_ROUTER); + }) + ); + } + + private void addRoutingSection(DecoPanel panel, int yy) + { + panel.addLabel(KEY+"incoming", 0, yy+5) + .withSize(46, 9) + .withAlign(DecoAlignment.LEFT); + for(int i = 0; i < EnumFacing.VALUES.length; i++) + { + EnumFacing side = EnumFacing.VALUES[i]; + int x = 48+(i%3)*24; + int y = yy+(i/3)*12+4; + panel.addComponent(new DecoCheckbox(x, y) + .withSize(24, 10) + .withRawText(String.valueOf(side.getName().toUpperCase().charAt(0))) + .withTranslatedTooltip(IIReference.DESCRIPTION_KEY+"side."+side.getName()) + .withChecked(edited.receivingSides[side.ordinal()]) + .withOnToggle(checked -> edited.receivingSides[side.ordinal()] = checked) + ); + } + + panel.addLabel(KEY+"outgoing", 132, yy+3) + .withSize(40, 9) + .withAlign(DecoAlignment.LEFT); + panel.addComponent(new DecoDropdown(172, yy) + .withSize(42, 16) + .withDropdownWidth(70) + .withEntries(EnumFacing.VALUES) + .withSelectedEntry(edited.outgoingSide) + .withOnSelectedEntry((oldSide, newSide) -> edited.outgoingSide = newSide) + .withDisplayFunction(DecoElementDisplays.getSimpleTextDisplay(side -> + I18n.format(IIReference.DESCRIPTION_KEY+"side."+side.getName()) + )) + ); + + panel.addLabel(KEY+"action", 132, yy+18) + .withSize(40, 9) + .withAlign(DecoAlignment.LEFT); + panel.addComponent(new DecoDropdown(172, yy+15) + .withSize(42, 16) + .withDropdownWidth(70) + .withEntries(RoutingAction.values()) + .withSelectedEntry(edited.action) + .withOnSelectedEntry((oldAction, newAction) -> edited.action = newAction) + ); + } + + private void addPacketFilterSection(DecoPanel panel, int yy) + { + panel.addComponent(new DecoCheckbox(0, yy) + .withSize(56, 12) + .withText(KEY+"filter.color") + .withChecked(edited.useColorFilter) + .withOnToggle(checked -> edited.useColorFilter = checked) + ); + panel.addComponent(new DecoDropdown(58-8, yy) + .withTemplate(DecoTemplates.DYE_COLOR_DROPDOWN) + .withSize(56+8, 12) + .withDropdownWidth(80) + .withSelectedEntry(edited.packetColor) + .withOnSelectedEntry((oldColor, newColor) -> edited.packetColor = newColor) + ); + + panel.addComponent(new DecoCheckbox(120, yy) + .withSize(56, 12) + .withText(KEY+"filter.address") + .withChecked(edited.useAddressFilter) + .withOnToggle(checked -> edited.useAddressFilter = checked) + ); + panel.addComponent(new DecoTextField(178, yy-2) + .withSize(36, 16) + .withFilter(TextFilter.DECIMAL) + .withText(edited.packetAddress < 0?"": String.valueOf(edited.packetAddress)) + .withOnTextChanged(text -> edited.packetAddress = text==null||text.trim().isEmpty()?-1: IIStringUtil.parseInt(text.trim())) + ); + } + + private void addValueFilterSection(DecoPanel panel, int yy) + { + valueEditor = null; + panel.addComponent(new DecoCheckbox(0, yy+2) + .withSize(92, 12) + .withText(KEY+"filter.value") + .withChecked(edited.useValueFilter) + .withOnToggle(checked -> { + storeEditorValue(); + edited.useValueFilter = checked; + refreshGUI(); + }) + ); + + if(edited.useValueFilter) + { + panel.addComponent(new DecoDropdownDataLetters(96, yy) + .withConstraints(new DataPacket()) + .withSelectedEntry((Character)edited.valueVariable) + .withTextColor(DecoColors.H1, IIColor.fromPackedRGB(0x35322c)) + .withOnSelectedEntry((oldChar, newChar) -> edited.valueVariable = newChar) + ); + panel.addComponent(new DecoDropdown>(96+18, yy) + .withSize(128-24, 18) + .withDropdownWidth(116) + .withMaxDisplayedEntries(5) + .withEntries(DecoDataEditor.getEditorTypes(false)) + .withSelectedEntry(edited.expectedValue.getTypeMeta()) + .withDisplayFunction(DecoTemplates.getDataTypeEntryDisplay()) + .withOnSelectedEntry((oldType, newType) -> { + storeEditorValue(); + edited.expectedValue = newType==null?new DataTypeNull(): newType.supplier.get(); + refreshGUI(); + }) + ); + + yy += 32; + panel.addComponent(new DecoCheckbox(63, yy-16+1) + .withSize(102, 12) + .withText(KEY+"remove_control_variable") + .withChecked(edited.removeControlVariable) + .withOnToggle(checked -> edited.removeControlVariable = checked) + ); + + valueEditor = DecoDataEditor.getEditorFor(edited.expectedValue, 8, yy); + int editorHeight = panel.height-yy; + if(valueEditor!=null) + addComponent(valueEditor) + .withSize(214+12, editorHeight); + } + } + + private void storeEditorValue() + { + if(valueEditor!=null&&edited!=null&&edited.useValueFilter) + edited.expectedValue = valueEditor.outputType(); + } + + @Override + protected EasyNBT onSaveTileData() + { + return super.onSaveTileData() + .conditionally(!cancel&&rules!=null, easyNBT -> easyNBT.withSerializable("rules", rules)); + } +} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/IIGUI.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/IIGUI.java index a70890dbe..addf98481 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/IIGUI.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/IIGUI.java @@ -20,6 +20,8 @@ import pl.pabilo8.immersiveintelligence.client.gui.block.arithmetic_logic_machine.GuiArithmeticLogicMachineEdit; import pl.pabilo8.immersiveintelligence.client.gui.block.data_input_machine.GuiDataInputMachine; import pl.pabilo8.immersiveintelligence.client.gui.block.data_input_machine.GuiDataInputMachineEdit; +import pl.pabilo8.immersiveintelligence.client.gui.block.data_router.GuiDataRouter; +import pl.pabilo8.immersiveintelligence.client.gui.block.data_router.GuiDataRouterEdit; import pl.pabilo8.immersiveintelligence.client.gui.block.emplacement.GuiEmplacementPageConfig; import pl.pabilo8.immersiveintelligence.client.gui.block.emplacement.GuiEmplacementPageFireMissions; import pl.pabilo8.immersiveintelligence.client.gui.block.emplacement.GuiEmplacementPageStorage; @@ -40,6 +42,7 @@ import pl.pabilo8.immersiveintelligence.client.gui.item.GuiCasingPouch; import pl.pabilo8.immersiveintelligence.client.gui.item.GuiPrintedPage; import pl.pabilo8.immersiveintelligence.common.block.data_device.tileentity.TileEntityDataMerger; +import pl.pabilo8.immersiveintelligence.common.block.data_device.tileentity.TileEntityDataRouter; import pl.pabilo8.immersiveintelligence.common.block.metal_device.tileentity.TileEntityMetalCrate; import pl.pabilo8.immersiveintelligence.common.block.metal_device.tileentity.effect_crate.TileEntityAmmunitionCrate; import pl.pabilo8.immersiveintelligence.common.block.metal_device.tileentity.effect_crate.TileEntityMedicalCrate; @@ -124,6 +127,8 @@ public enum IIGUI implements ISerializableEnum FUEL_STATION(TileEntityFuelStation.class, ContainerFuelStation::new), DATA_MERGER(TileEntityDataMerger.class, ContainerDataMerger::new), + DATA_ROUTER(TileEntityDataRouter.class, ContainerDataRouter::getMainGui), + DATA_ROUTER_EDIT(TileEntityDataRouter.class, ContainerDataRouter::getEditGui), INSERTER(TileEntityInserterBase.class, ContainerInserter::new), GEARBOX(TileEntityGearbox.class, ContainerGearbox::new), @@ -249,6 +254,8 @@ public static void initClientGUIs() IIGUI.PRECISION_ASSEMBLER.setClientTileGui(GuiPrecisionAssembler::new); IIGUI.FUEL_STATION.setClientTileGui(GuiFuelStation::new); IIGUI.DATA_MERGER.setClientGui(GuiDataMerger::new); + IIGUI.DATA_ROUTER.setClientTileGui(GuiDataRouter::new); + IIGUI.DATA_ROUTER_EDIT.setClientTileGui(GuiDataRouterEdit::new); IIGUI.INSERTER.setClientTileGui(GuiInserter::new); //Crates IIGUI.METAL_CRATE.setClientTileGui(GuiMetalCrate::new); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/data_device/tileentity/TileEntityDataRouter.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/data_device/tileentity/TileEntityDataRouter.java index 4490df61f..4903ed519 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/data_device/tileentity/TileEntityDataRouter.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/data_device/tileentity/TileEntityDataRouter.java @@ -1,128 +1,377 @@ package pl.pabilo8.immersiveintelligence.common.block.data_device.tileentity; -import blusunrize.immersiveengineering.common.blocks.IEBlockInterfaces.IBlockBounds; -import blusunrize.immersiveengineering.common.blocks.IEBlockInterfaces.IDirectionalTile; -import blusunrize.immersiveengineering.common.blocks.IEBlockInterfaces.IHammerInteraction; -import blusunrize.immersiveengineering.common.blocks.IEBlockInterfaces.IPlayerInteraction; import blusunrize.immersiveengineering.common.blocks.TileEntityIEBase; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumDyeColor; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; -import net.minecraft.util.ITickable; +import net.minecraft.util.NonNullList; +import net.minecraftforge.common.util.INBTSerializable; import pl.pabilo8.immersiveintelligence.api.data.DataPacket; -import pl.pabilo8.immersiveintelligence.api.data.device.IDataConnector; +import pl.pabilo8.immersiveintelligence.api.data.IIDataHandlingUtils; +import pl.pabilo8.immersiveintelligence.api.data.IIDataTypeUtils; import pl.pabilo8.immersiveintelligence.api.data.device.IDataDevice; import pl.pabilo8.immersiveintelligence.api.data.types.DataTypeInteger; -import pl.pabilo8.immersiveintelligence.common.IIUtils; -import pl.pabilo8.immersiveintelligence.common.network.IIPacketHandler; +import pl.pabilo8.immersiveintelligence.api.data.types.DataTypeNull; +import pl.pabilo8.immersiveintelligence.api.data.types.generic.DataType; +import pl.pabilo8.immersiveintelligence.common.IIGUI; +import pl.pabilo8.immersiveintelligence.common.util.IIReference; +import pl.pabilo8.immersiveintelligence.common.util.ILocalizedEnum; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.EasyCollection; +import pl.pabilo8.immersiveintelligence.common.util.multiblock.IIMultiblockInterfaces.IIIGuiMultiblockTile; +import pl.pabilo8.immersiveintelligence.common.util.multiblock.IIMultiblockInterfaces.IIIInventory; import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.Arrays; /** + * A device that routes incoming {@link DataPacket DataPackets} according to an ordered rule list. + * * @author Pabilo8 (pabilo@iiteam.net) + * @updated 02.06.2026 * @since 17.05.2019 */ -public class TileEntityDataRouter extends TileEntityIEBase implements IPlayerInteraction, IHammerInteraction, ITickable, IBlockBounds, IDirectionalTile, IDataDevice +public class TileEntityDataRouter extends TileEntityIEBase implements IDataDevice, IIIGuiMultiblockTile, IIIInventory { - public EnumFacing facing = EnumFacing.NORTH; - char variable = '0'; + public EasyCollection routingRules; - @Override - public void readCustomNBT(NBTTagCompound nbt, boolean descPacket) + public TileEntityDataRouter() { - variable = nbt.getString("variable").charAt(0); - + super(); + this.routingRules = new EasyCollection<>(DataRoutingRule::new); + migrateLegacyVariableRouter("0"); } @Override - public void writeCustomNBT(NBTTagCompound nbt, boolean descPacket) + public void readCustomNBT(NBTTagCompound nbt, boolean descPacket) { - nbt.setString("variable", String.valueOf(variable)); + if(nbt.hasKey("rules")) + routingRules.deserializeNBT(nbt.getTagList("rules", 10)); + else if(nbt.hasKey("variable")) + migrateLegacyVariableRouter(nbt.getString("variable")); } @Override - public boolean interact(EnumFacing side, EntityPlayer player, EnumHand hand, ItemStack heldItem, float hitX, float hitY, float hitZ) + public void writeCustomNBT(NBTTagCompound nbt, boolean descPacket) { - return false; + nbt.setTag("rules", routingRules.serializeNBT()); } @Override - public void receiveMessageFromServer(NBTTagCompound message) + public void receiveMessageFromClient(@Nonnull NBTTagCompound message) { - super.receiveMessageFromServer(message); + super.receiveMessageFromClient(message); + if(message.hasKey("rules")) + { + routingRules.deserializeNBT(message.getTagList("rules", 10)); + markDirty(); + if(world!=null) + world.notifyBlockUpdate(pos, world.getBlockState(pos), world.getBlockState(pos), 3); + } } @Override - public void update() + public void onReceive(DataPacket packet, EnumFacing side) { + if(world==null||world.isRemote||packet==null||side==null) + return; + + boolean changed = false; + for(DataRoutingRule rule : routingRules) + { + if(!rule.matches(packet, side)) + continue; + + rule.consumeUse(); + changed = true; + if(rule.action==RoutingAction.DENY) + break; + + DataPacket outgoingPacket = rule.getOutgoingPacket(packet); + IIDataHandlingUtils.sendPacketAdjacently(outgoingPacket, world, pos, rule.outgoingSide); + } + + if(changed) + { + routingRules.removeIf(DataRoutingRule::isExpired); + markDirty(); + if(world!=null) + world.notifyBlockUpdate(pos, world.getBlockState(pos), world.getBlockState(pos), 3); + } } + //--- IIIGuiMultiblockTile ---// + @Override - public float[] getBlockBounds() + public boolean canOpenGui() { - return new float[]{0f, 0f, 0f, 1f, 1f, 1f}; + return true; } @Override - public EnumFacing getFacing() + public TileEntity master() { - return facing; + return this; } @Override - public void setFacing(EnumFacing facing) + public IIGUI getGUI() { - this.facing = facing; + return IIGUI.DATA_ROUTER; } + //--- IIEInventory ---// + @Override - public int getFacingLimitation() + public NonNullList getInventory() { - return 2; + return NonNullList.create(); } @Override - public boolean mirrorFacingOnPlacement(EntityLivingBase placer) + public boolean isStackValid(int slot, ItemStack stack) { return false; } - @Override - public boolean canHammerRotate(EnumFacing side, float hitX, float hitY, float hitZ, EntityLivingBase entity) + public enum RoutingAction implements ILocalizedEnum { - return !entity.isSneaking(); - } + ALLOW, + DENY; - @Override - public boolean canRotate(EnumFacing axis) - { - return !axis.getAxis().isVertical(); + @Override + public String geLocaleKey() + { + return IIReference.GUI_LABEL_KEY+"data_router.action."; + } } - @Override - public void onReceive(DataPacket packet, EnumFacing side) + public static class DataRoutingRule implements INBTSerializable { - if(packet.get(variable) instanceof DataTypeInteger) + public final boolean[] receivingSides = new boolean[6]; + public EnumFacing outgoingSide = EnumFacing.NORTH; + + public boolean useColorFilter = false; + public EnumDyeColor packetColor = EnumDyeColor.WHITE; + public boolean useAddressFilter = false; + public int packetAddress = -1; + + public String requiredVariables = ""; + public boolean useValueFilter = false; + public char valueVariable = 'a'; + public DataType expectedValue = new DataTypeNull(); + + /** + * -1 means infinite, any positive number means request-style finite use count. + */ + public int usageLimit = -1; + public RoutingAction action = RoutingAction.ALLOW; + public boolean removeControlVariable = false; + + public DataRoutingRule() + { + Arrays.fill(receivingSides, true); + } + + public boolean isJob() + { + return usageLimit < 0; + } + + public boolean isExpired() { - int c = ((DataTypeInteger)packet.get(variable)).value; - if(world.isBlockLoaded(this.pos.offset(EnumFacing.getFront(c)))&&world.getTileEntity(this.pos.offset(EnumFacing.getFront(c))) instanceof IDataConnector) + return usageLimit==0; + } + + public void consumeUse() + { + if(usageLimit > 0) + usageLimit--; + } + + public boolean matches(@Nonnull DataPacket packet, @Nonnull EnumFacing receivedFrom) + { + if(isExpired()||!receivingSides[receivedFrom.ordinal()]) + return false; + + NBTTagCompound packetNBT = null; + if(useColorFilter||useAddressFilter) + packetNBT = packet.serializeNBT(); + + if(useColorFilter) + { + int color = packetNBT.hasKey("color")?packetNBT.getInteger("color"): EnumDyeColor.WHITE.getMetadata(); + if(color!=packetColor.getMetadata()) + return false; + } + + if(useAddressFilter) { - IDataConnector d = (IDataConnector)world.getTileEntity(this.pos.offset(EnumFacing.getFront(c))); - d.sendPacket(packet); + int address = packetNBT.hasKey("address")?packetNBT.getInteger("address"): -1; + if(address!=packetAddress) + return false; } + + for(char variable : requiredVariables.toCharArray()) + if(DataPacket.isValidVariable(variable)&&!packet.has(variable)) + return false; + + if(useValueFilter) + { + if(!DataPacket.isValidVariable(valueVariable)||!packet.has(valueVariable)) + return false; + + DataType actual = packet.get(valueVariable); + if(actual==null||actual.getClass()!=expectedValue.getClass()) + return false; + + return actual.valueToNBT().equals(expectedValue.valueToNBT()); + } + + return true; + } + + public DataPacket getOutgoingPacket(@Nonnull DataPacket source) + { + DataPacket outgoing = source.clone(); + if(removeControlVariable) + { + if(useValueFilter&&DataPacket.isValidVariable(valueVariable)) + outgoing.remove(valueVariable); + else + for(char variable : requiredVariables.toCharArray()) + if(DataPacket.isValidVariable(variable)) + outgoing.remove(variable); + } + return outgoing; + } + + @Nonnull + public DataRoutingRule copy() + { + DataRoutingRule rule = new DataRoutingRule(); + rule.deserializeNBT(this.serializeNBT()); + return rule; + } + + //--- NBT ---// + + @Override + public NBTTagCompound serializeNBT() + { + NBTTagCompound nbt = new NBTTagCompound(); + int[] receiving = new int[receivingSides.length]; + for(int i = 0; i < receivingSides.length; i++) + receiving[i] = receivingSides[i]?1: 0; + + nbt.setIntArray("receivingSides", receiving); + nbt.setInteger("outgoingSide", outgoingSide.ordinal()); + + nbt.setBoolean("useColorFilter", useColorFilter); + nbt.setInteger("packetColor", packetColor.getMetadata()); + nbt.setBoolean("useAddressFilter", useAddressFilter); + nbt.setInteger("packetAddress", packetAddress); + + nbt.setString("requiredVariables", sanitizeVariables(requiredVariables, true)); + nbt.setBoolean("useValueFilter", useValueFilter); + nbt.setString("valueVariable", String.valueOf(valueVariable)); + nbt.setTag("expectedValue", expectedValue.valueToNBT()); + + nbt.setInteger("usageLimit", usageLimit); + nbt.setString("action", action.name()); + nbt.setBoolean("removeControlVariable", removeControlVariable); + return nbt; + } + + @Override + public void deserializeNBT(NBTTagCompound nbt) + { + Arrays.fill(receivingSides, true); + int[] receiving = nbt.getIntArray("receivingSides"); + for(int i = 0; i < Math.min(receiving.length, receivingSides.length); i++) + receivingSides[i] = receiving[i]!=0; + + outgoingSide = getFacingSafe(nbt.getInteger("outgoingSide")); + + useColorFilter = nbt.getBoolean("useColorFilter"); + packetColor = EnumDyeColor.byMetadata(nbt.getInteger("packetColor")); + useAddressFilter = nbt.getBoolean("useAddressFilter"); + packetAddress = nbt.hasKey("packetAddress")?nbt.getInteger("packetAddress"): -1; + + requiredVariables = sanitizeVariables(nbt.getString("requiredVariables"), true); + useValueFilter = nbt.getBoolean("useValueFilter"); + String valueVariableString = nbt.getString("valueVariable"); + valueVariable = sanitizeVariable(valueVariableString.isEmpty()?'a': valueVariableString.charAt(0), 'a'); + expectedValue = nbt.hasKey("expectedValue")?IIDataTypeUtils.getVarFromNBT(nbt.getCompoundTag("expectedValue")): new DataTypeNull(); + + usageLimit = nbt.hasKey("usageLimit")?nbt.getInteger("usageLimit"): -1; + try + { + action = RoutingAction.valueOf(nbt.getString("action")); + } catch(IllegalArgumentException exception) + { + action = RoutingAction.ALLOW; + } + removeControlVariable = nbt.getBoolean("removeControlVariable"); } + //--- Utilities ---// + + public static String sanitizeVariables(@Nullable String variables, boolean keepUnique) + { + if(variables==null||variables.isEmpty()) + return ""; + + StringBuilder builder = new StringBuilder(); + for(char c : variables.toCharArray()) + if(DataPacket.isValidVariable(c)&&(!keepUnique||builder.indexOf(String.valueOf(c)) < 0)) + builder.append(c); + return builder.toString(); + } + + public static char sanitizeVariable(char variable, char fallback) + { + return DataPacket.isValidVariable(variable)?variable: fallback; + } + + private static EnumFacing getFacingSafe(int ordinal) + { + return ordinal >= 0&&ordinal < EnumFacing.VALUES.length?EnumFacing.VALUES[ordinal]: EnumFacing.NORTH; + } } - @Override - public boolean hammerUseSide(@Nonnull EnumFacing side, @Nonnull EntityPlayer player, float hitX, float hitY, float hitZ) + /** + * Migrates the old router rules based around a single control variable + * + * @param variableName old control variable + */ + private void migrateLegacyVariableRouter(String variableName) { - variable = IIUtils.cycleDataPacketChars(variable, hitY >= 0.5f, false); - IIPacketHandler.sendChatString(player, String.valueOf(variable)); - return true; + if(variableName==null||variableName.isEmpty()) + return; + migrateLegacyVariableRouter(variableName.charAt(0)); + } + + private void migrateLegacyVariableRouter(char variable) + { + if(!DataPacket.isValidVariable(variable)) + return; + + routingRules.clear(); + for(EnumFacing side : EnumFacing.VALUES) + { + DataRoutingRule rule = new DataRoutingRule(); + rule.outgoingSide = side; + rule.useValueFilter = true; + rule.valueVariable = variable; + rule.expectedValue = new DataTypeInteger(side.ordinal()); + rule.action = RoutingAction.ALLOW; + rule.removeControlVariable = false; + rule.usageLimit = -1; + routingRules.add(rule); + } } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerDataMerger.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerDataMerger.java index 2db846a0f..8c2bacd75 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerDataMerger.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerDataMerger.java @@ -1,28 +1,20 @@ package pl.pabilo8.immersiveintelligence.common.gui; -import blusunrize.immersiveengineering.common.gui.ContainerIEBase; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.Slot; import pl.pabilo8.immersiveintelligence.common.block.data_device.tileentity.TileEntityDataMerger; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; /** * @author Pabilo8 (pabilo@iiteam.net) + * @updated 02.06.2026 * @since 30.06.2019 */ -public class ContainerDataMerger extends ContainerIEBase +public class ContainerDataMerger extends ContainerIITileBase { public ContainerDataMerger(EntityPlayer player, TileEntityDataMerger tile) { - super(player.inventory, tile); - - this.slotCount = tile.getInventory().size(); - this.tile = tile; - - for(int i = 0; i < 3; i++) - for(int j = 0; j < 9; j++) - addSlotToContainer(new Slot(player.inventory, j+i*9+9, 8+j*18, 141+i*18)); - for(int i = 0; i < 9; i++) - addSlotToContainer(new Slot(player.inventory, i, 8+i*18, 199)); + super(player, tile); + this.addPlayerInventory(player.inventory, 8, 86); } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerDataRouter.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerDataRouter.java new file mode 100644 index 000000000..f76e10fb7 --- /dev/null +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerDataRouter.java @@ -0,0 +1,28 @@ +package pl.pabilo8.immersiveintelligence.common.gui; + +import net.minecraft.entity.player.EntityPlayer; +import pl.pabilo8.immersiveintelligence.common.block.data_device.tileentity.TileEntityDataRouter; +import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; + +/** + * @author Pabilo8 (pabilo@iiteam.net) + * @updated 02.06.2026 + */ +public class ContainerDataRouter extends ContainerIITileBase +{ + private ContainerDataRouter(EntityPlayer player, TileEntityDataRouter tile, boolean isEditMode) + { + super(player, tile); + this.addPlayerInventory(player.inventory, isEditMode?40: 8, isEditMode?184+16-2+12-2: 176-2); + } + + public static ContainerDataRouter getMainGui(EntityPlayer player, TileEntityDataRouter tile) + { + return new ContainerDataRouter(player, tile, false); + } + + public static ContainerDataRouter getEditGui(EntityPlayer player, TileEntityDataRouter tile) + { + return new ContainerDataRouter(player, tile, true); + } +} diff --git a/src/main/resources/assets/immersiveintelligence/lang/en_us.lang b/src/main/resources/assets/immersiveintelligence/lang/en_us.lang index 6703926b3..2f770d0ac 100644 --- a/src/main/resources/assets/immersiveintelligence/lang/en_us.lang +++ b/src/main/resources/assets/immersiveintelligence/lang/en_us.lang @@ -1423,8 +1423,15 @@ desc.immersiveintelligence.diplomacy.permission_level.allies_allow=Allies desc.immersiveintelligence.diplomacy.permission_level.others_allow=Others desc.immersiveintelligence.diplomacy.permission_level.enemy_allow=Enemies -#Bullets +#Directions +desc.immersiveintelligence.side.down=Down +desc.immersiveintelligence.side.up=Up +desc.immersiveintelligence.side.north=North +desc.immersiveintelligence.side.south=South +desc.immersiveintelligence.side.west=West +desc.immersiveintelligence.side.east=East +#Bullets desc.immersiveintelligence.bullet_type.general_purpose=General Purpose desc.immersiveintelligence.bullet_type.shrapnel=Shrapnel desc.immersiveintelligence.bullet_type.piercing=Armor Piercing @@ -3409,6 +3416,26 @@ ii.gui.ammunition_assembler.fuse_config.timed.tooltip=Time before fuse triggers ii.gui.ammunition_assembler.fuse_config.proximity=Distance: ii.gui.ammunition_assembler.fuse_config.proximity.tooltip=Required distance to a solid object to trigger the fuse (in blocks) +ii.gui.data_router.into=Into side: %s +ii.gui.data_router.rule_editor=Data Routing Rule +ii.gui.data_router.rule_properties=Rule Properties +ii.gui.data_router.routing=Routing +ii.gui.data_router.packet_filters=Packet Filters +ii.gui.data_router.incoming=Inputs: +ii.gui.data_router.incoming.tooltip=Direction of the inbound packet for this rule to apply. +ii.gui.data_router.outgoing=Output: +ii.gui.data_router.outgoing.tooltip=Direction the outbound packet will be sent to under this rule. +ii.gui.data_router.action=Action: +ii.gui.data_router.action.tooltip=Determines what happens to packets matching this rule. +ii.gui.data_router.filter.color=Color +ii.gui.data_router.filter.address=Address +ii.gui.data_router.required_variables=Required Variables +ii.gui.data_router.filter.value=Match Value +ii.gui.data_router.remove_control_variable=Remove Control Variable +ii.gui.data_router.remove_control_variable.tooltip=When enabled, the control variable will be omitted in the outgoing packet +ii.gui.data_router.action.allow=Allow +ii.gui.data_router.action.deny=Deny + #GUI HelpBoxes ii.gui_help.data_input_machine.programming=These slots allow reading a punchtape into the DIM's memory or writing its contents into an empty one. ii.gui_help.data_input_machine.storage=These slots allow storing empty or programmed punchtapes for convenience. From f8877d59d891113f1601331659e09ec68f901a43 Mon Sep 17 00:00:00 2001 From: Pabilo8 Date: Tue, 2 Jun 2026 19:06:21 +0200 Subject: [PATCH 17/23] Reworked Data Merger to use a rule list based approach, added new GUIs, removed remaining non-Deco GUI registration for TileEntities --- .../client/gui/block/GuiDataMerger.java | 173 ---------- .../gui/block/data_merger/GuiDataMerger.java | 144 +++++++++ .../block/data_merger/GuiDataMergerEdit.java | 196 ++++++++++++ .../gui/block/data_router/GuiDataRouter.java | 13 +- .../immersiveintelligence/common/IIGUI.java | 13 +- .../tileentity/TileEntityDataMerger.java | 296 ++++++++++++++---- .../common/gui/ContainerDataMerger.java | 4 +- .../immersiveintelligence/lang/en_us.lang | 27 +- .../textures/gui/data_merger.png | Bin 130740 -> 0 bytes 9 files changed, 607 insertions(+), 259 deletions(-) delete mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiDataMerger.java create mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_merger/GuiDataMerger.java create mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_merger/GuiDataMergerEdit.java delete mode 100644 src/main/resources/assets/immersiveintelligence/textures/gui/data_merger.png diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiDataMerger.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiDataMerger.java deleted file mode 100644 index dcf5c83b1..000000000 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiDataMerger.java +++ /dev/null @@ -1,173 +0,0 @@ -package pl.pabilo8.immersiveintelligence.client.gui.block; - -import blusunrize.immersiveengineering.client.ClientUtils; -import blusunrize.immersiveengineering.client.gui.GuiIEContainerBase; -import blusunrize.immersiveengineering.client.gui.elements.GuiButtonIE; -import net.minecraft.client.gui.GuiButton; -import net.minecraft.client.resources.I18n; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.util.math.MathHelper; -import org.lwjgl.input.Keyboard; -import org.lwjgl.opengl.GL11; -import pl.pabilo8.immersiveintelligence.ImmersiveIntelligence; -import pl.pabilo8.immersiveintelligence.api.data.DataPacket; -import pl.pabilo8.immersiveintelligence.api.data.types.DataTypeInteger; -import pl.pabilo8.immersiveintelligence.api.data.types.generic.DataType; -import pl.pabilo8.immersiveintelligence.client.gui.ITabbedGui; -import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoColors; -import pl.pabilo8.immersiveintelligence.common.IIUtils; -import pl.pabilo8.immersiveintelligence.common.block.data_device.tileentity.TileEntityDataMerger; -import pl.pabilo8.immersiveintelligence.common.block.data_device.tileentity.TileEntityDataMerger.DataMergerSendMode; -import pl.pabilo8.immersiveintelligence.common.gui.ContainerDataMerger; -import pl.pabilo8.immersiveintelligence.common.network.IIPacketHandler; -import pl.pabilo8.immersiveintelligence.common.network.messages.MessageIITileSync; -import pl.pabilo8.immersiveintelligence.common.util.IIReference; -import pl.pabilo8.immersiveintelligence.common.util.easynbt.EasyNBT; - -import java.io.IOException; -import java.util.ArrayList; - -/** - * @author Pabilo8 (pabilo@iiteam.net) - * @since 30.06.2019 - */ -public class GuiDataMerger extends GuiIEContainerBase implements ITabbedGui -{ - public static final String texture = ImmersiveIntelligence.MODID+":textures/gui/data_merger.png"; - - public TileEntityDataMerger tile; - public InventoryPlayer playerInv; - public DataPacket settingsPacket; - public GuiButtonIE buttonForward, buttonBackward; - - public GuiDataMerger(EntityPlayer player, TileEntityDataMerger tile) - { - super(new ContainerDataMerger(player, tile)); - this.ySize = 222; - this.playerInv = player.inventory; - this.tile = tile; - this.settingsPacket = tile.settingsPacket; - } - - @Override - public void initGui() - { - super.initGui(); - - this.buttonList.clear(); - addButton(buttonForward = new GuiButtonIE(0, guiLeft+4, guiTop+16, 8, 6, "", texture, 128, 222).setHoverOffset(8, 0)); - addButton(buttonBackward = new GuiButtonIE(1, guiLeft+4, guiTop+24, 8, 6, "", texture, 128, 228).setHoverOffset(8, 0)); - - } - - @Override - public void updateScreen() - { - super.updateScreen(); - } - - @Override - protected void actionPerformed(GuiButton button) - { - if(button==buttonForward||button==buttonBackward) - { - //cycle the mode depending on button - tile.mode = IIUtils.cycleEnum(button==buttonForward, DataMergerSendMode.class, tile.mode); - //send update to server side - IIPacketHandler.sendToServer(new MessageIITileSync(tile, EasyNBT.newNBT().withByte("mode", tile.mode.ordinal()))); - } - } - - @Override - public void drawScreen(int mx, int my, float partial) - { - super.drawScreen(mx, my, partial); - this.fontRenderer.drawString(I18n.format(IIReference.DESCRIPTION_KEY+"data_merger."+tile.mode), guiLeft+14, guiTop+19, DecoColors.H1.getPackedRGB()); - - ArrayList tooltip = new ArrayList<>(); - - int i = 0; - for(char c : DataPacket.VARIABLE_NAMES) - { - int xoff = (int)Math.floor(i/6f), yoff = i%6; - int col = 0xefefef; - if(settingsPacket.get(c) instanceof DataTypeInteger) - { - int o = ((DataTypeInteger)settingsPacket.get(c)).value; - switch(o) - { - case -2: - col = 0x26732e; - break; - case -1: - col = 0x7c9d4b; - break; - case 1: - col = 0xe5a64d; - break; - case 2: - col = 0x922020; - break; - } - } - this.fontRenderer.drawString(String.valueOf(c), guiLeft+54+(xoff*20)+6-(int)(fontRenderer.getCharWidth(c)/2f), guiTop+16+(yoff*20)+2, col); - i += 1; - } - - } - - @Override - public void onGuiClosed() - { - IIPacketHandler.sendToServer(new MessageIITileSync(tile, EasyNBT.newNBT().withTag("packet", settingsPacket.serializeNBT()))); - super.onGuiClosed(); - } - - @Override - protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException - { - super.mouseClicked(mouseX, mouseY, mouseButton); - if(mouseX >= guiLeft+54&&mouseX <= guiLeft+166&&mouseY >= guiTop+16&&mouseY <= guiTop+128) - { - boolean fw; - if(mouseButton==0&&!Keyboard.isKeyDown(Keyboard.KEY_RSHIFT)) - fw = true; - else if(mouseButton==1||Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) - fw = false; - else - return; - - int i_pos_x = (int)Math.floor((mouseX-guiLeft-54)/20f); - int i_pos_y = (int)Math.floor((mouseY-guiTop-16)/20f); - - if(mouseX <= guiLeft+(i_pos_x*20)+12+54&&mouseY <= guiTop+(i_pos_y*20)+12+16) - switchMode(DataPacket.VARIABLE_NAMES[i_pos_y+(i_pos_x*6)], fw); - } - } - - /** - * Draws the background layer of this container (behind the items). - */ - @Override - protected void drawGuiContainerBackgroundLayer(float f, int mx, int my) - { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - ClientUtils.bindTexture(texture); - this.drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); - } - - void switchMode(char c, boolean forward) - { - DataType p = settingsPacket.get(c); - //increment or decrement the number, clamp it between -2 and 2 - if(p instanceof DataTypeInteger) - settingsPacket.set(c, new DataTypeInteger( - MathHelper.clamp(((DataTypeInteger)p).value+(forward?1: -1), -2, 2) - )); - else - //if there's no such variable, set it to -1 or 1, as 0 is the default state - settingsPacket.set(c, new DataTypeInteger(forward?1: -1)); - } - -} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_merger/GuiDataMerger.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_merger/GuiDataMerger.java new file mode 100644 index 000000000..bc16e0d9d --- /dev/null +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_merger/GuiDataMerger.java @@ -0,0 +1,144 @@ +package pl.pabilo8.immersiveintelligence.client.gui.block.data_merger; + +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoButton; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.label.DecoLabel; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoEntryPanelBuilder; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoTaskList; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoTaskList.ListMode; +import pl.pabilo8.immersiveintelligence.client.gui.deco.util.*; +import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoBackgroundBuilder.SlotStyle; +import pl.pabilo8.immersiveintelligence.common.IIGUI; +import pl.pabilo8.immersiveintelligence.common.block.data_device.tileentity.TileEntityDataMerger; +import pl.pabilo8.immersiveintelligence.common.block.data_device.tileentity.TileEntityDataMerger.DataMergeRule; +import pl.pabilo8.immersiveintelligence.common.gui.ContainerDataMerger; +import pl.pabilo8.immersiveintelligence.common.util.IIColor; +import pl.pabilo8.immersiveintelligence.common.util.IIReference; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.EasyCollection; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.EasyNBT; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT.SyncEvents; + +/** + * Main Data Merger GUI: list of request/job merge rules. + * + * @author Pabilo8 (pabilo@iiteam.net) + * @updated 02.06.2026 + */ +@DecoTemplate(name = "data_merger", category = DecoGuiCategory.DATA_TILE) +public class GuiDataMerger extends DecoTileGui +{ + private static final String KEY = IIReference.GUI_LABEL_KEY+"data_merger."; + + @SyncNBT(events = SyncEvents.TILE_CLIENT_MESSAGE) + public EasyCollection rules; + @SyncNBT + public int editedRule = -1; + @SyncNBT + public ListMode mode = ListMode.JOBS; + + public GuiDataMerger(EntityPlayer player, TileEntityDataMerger tile) + { + super(player, tile, IIGUI.DATA_MERGER); + if(tile!=null) + rules = tile.mergeRules.clone(); + } + + @Override + public void onInit() + { + if(rules==null) + rules = new EasyCollection<>(DataMergeRule::new); + + startBackground() + .withBox(DecoTextures.BG_STEEL, 0, 0, 176, 168-8) + .withTitleBar(tile) + .withNextLayer() + .withBox(DecoTextures.BG_WOODEN, DecoTextures.TEMPLATE_ROUND_WOODEN, 0, 168-8, 176, 92) + .withInventorySlots(SlotStyle.VANILLA, container.playerInventory) + .withInventoryTitleBar() + .withFrame(DecoTextures.FRAME_WOODEN_THIN, 4, false, new boolean[]{true, false, false, false}) + .withNextLayer() + .withBox(DecoTextures.BG_STEEL, DecoTextures.TEMPLATE_SQUARE, 0, 168-8-20, 176, 20) + .build(); + + DecoTaskList ruleList; + addComponent((ruleList = new DecoTaskList<>(2, 4)) + .withSize(176-4, 116) + .withEntries(rules) + .withIsJobPredicate(DataMergeRule::isJob) + .withModeHandling(mode, m -> mode = m) + .withBlankTaskSupplier(() -> { + DataMergeRule rule = new DataMergeRule(); + rule.usageLimit = ruleList.getMode()==ListMode.REQUESTS?1: -1; + return rule; + }) + .withDisplayFunction(new DecoEntryPanelBuilder() + .withBackground(DecoTextures.BG_PAPER) + .withBackgroundMask(DecoTextures.TEMPLATE_TICKET) + .withComponent("variable", new DecoButton(3, 2) + .withSize(20, 16) + .withDisabled(true) + .withTextDisabledColor(IIColor.fromPackedRGB(0xafafaf)) + ) + .withLabel("route", new DecoLabel(fontRenderer, 26, 5) + .withSize(116, 12) + .withAlign(DecoAlignment.LEFT) + ) + .withComponent(p -> new DecoButton(p.width-17+1-14, 3) + .withTemplate(DecoTemplates.ACTION_BUTTON_EDIT) + .withOnLMBPressed(() -> { + editedRule = rules.indexOf(p.getCurrentElement()); + if(editedRule >= 0) + changeGUI(IIGUI.DATA_MERGER_EDIT); + }) + ) + .withComponent(p -> new DecoButton(p.width-17+1, 3) + .withTemplate(DecoTemplates.ACTION_BUTTON_REMOVE) + .withOnLMBPressed(() -> { + int index = rules.indexOf(p.getCurrentElement()); + if(index >= 0) + { + rules.remove(index); + refreshGUI(); + } + }) + ) + .withElementApplyMethod((rule, panel) -> { + panel.component("variable", DecoButton.class) + .withRawText(String.valueOf(rule.variable)) + .withBackground(DecoTextures.COMPONENT_BUTTON_PAPER) + .withBackgroundColor(rule.triggerForwarding?DecoColors.ACTION_ADD: DecoColors.ACTION_REMOVE); + + StringBuilder sb = new StringBuilder(); + if(rule.acceptLeft) + sb.append(I18n.format(KEY+"left")); + if(rule.acceptRight) + { + if(sb.length() > 0) + sb.append(", "); + sb.append(I18n.format(KEY+"right")); + } + if(rule.triggerForwarding) + { + if(sb.length() > 0) + sb.append(" -> "); + sb.append(I18n.format(KEY+"send")); + } + + panel.label("route").withRawText(sb.toString()); + }) + ) + ); + } + + @Override + protected EasyNBT onSaveTileData() + { + return super.onSaveTileData() + .withSerializable("rules", rules); + } +} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_merger/GuiDataMergerEdit.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_merger/GuiDataMergerEdit.java new file mode 100644 index 000000000..42180bb7d --- /dev/null +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_merger/GuiDataMergerEdit.java @@ -0,0 +1,196 @@ +package pl.pabilo8.immersiveintelligence.client.gui.block.data_merger; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import pl.pabilo8.immersiveintelligence.api.data.DataPacket; +import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoButton; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoCheckbox; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoDropdownDataLetters; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoPanel; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoTaskList.ListMode; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.text.DecoTextField; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.text.util.TextFilter; +import pl.pabilo8.immersiveintelligence.client.gui.deco.util.*; +import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoBackgroundBuilder.SlotStyle; +import pl.pabilo8.immersiveintelligence.common.IIGUI; +import pl.pabilo8.immersiveintelligence.common.block.data_device.tileentity.TileEntityDataMerger; +import pl.pabilo8.immersiveintelligence.common.block.data_device.tileentity.TileEntityDataMerger.DataMergeRule; +import pl.pabilo8.immersiveintelligence.common.gui.ContainerDataMerger; +import pl.pabilo8.immersiveintelligence.common.util.IIColor; +import pl.pabilo8.immersiveintelligence.common.util.IIReference; +import pl.pabilo8.immersiveintelligence.common.util.IIStringUtil; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.EasyCollection; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.EasyNBT; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT.SyncEvents; + +/** + * Data Merger rule editor. + * + * @author Pabilo8 (pabilo@iiteam.net) + * @updated 02.06.2026 + */ +@DecoTemplate(name = "data_merger_edit", category = DecoGuiCategory.DATA_TILE) +public class GuiDataMergerEdit extends DecoTileGui +{ + private static final String KEY = IIReference.GUI_LABEL_KEY+"data_merger."; + + @SyncNBT(events = SyncEvents.TILE_CLIENT_MESSAGE) + public EasyCollection rules; + @SyncNBT + public int editedRule = -1; + @SyncNBT + public ListMode mode = ListMode.JOBS; + @SyncNBT + public DataMergeRule edited = new DataMergeRule(); + + private boolean cancel = true, loaded = false; + + public GuiDataMergerEdit(EntityPlayer player, TileEntityDataMerger tile) + { + super(player, tile, IIGUI.DATA_MERGER_EDIT); + if(tile!=null) + rules = tile.mergeRules.clone(); + } + + @Override + public void onInit() + { + if(rules==null) + rules = new EasyCollection<>(DataMergeRule::new); + if(editedRule < 0||editedRule >= rules.size()) + { + cancel = true; + changeGUI(IIGUI.DATA_MERGER); + return; + } + if(!loaded) + { + edited = rules.get(editedRule).copy(); + loaded = true; + } + + startBackground() + .withBox(DecoTextures.BG_STEEL, 0, 0, 176, 168-8) + .withTitleBar(KEY+"rule_properties") + .withNextLayer() + .withBox(DecoTextures.BG_WOODEN, DecoTextures.TEMPLATE_ROUND_WOODEN, 0, 168-8, 176, 92) + .withInventorySlots(SlotStyle.VANILLA, container.playerInventory) + .withInventoryTitleBar() + .withFrame(DecoTextures.FRAME_WOODEN_THIN, 4, false, new boolean[]{true, false, false, false}) + .withNextLayer() + .withBox(DecoTextures.BG_STEEL, DecoTextures.TEMPLATE_ROUND, 4, 8+4, 168-4, 72+8) + .withTitleBar(KEY+"inputs", DecoAlignment.TOP_LEFT) + .withNextLayer() + .withBox(DecoTextures.BG_STEEL, DecoTextures.TEMPLATE_ROUND, 4, 8+4+72-4+16, 168-4, 84-16-8-8) + .withTitleBar(KEY+"override_policy", DecoAlignment.TOP_LEFT) + .build(); + + DecoPanel panel = addComponent(new DecoPanel(12, 16)) + .withSize(216, 128) + .withBackground(null); + + addInputSection(panel, 0); + addPolicySection(panel, 96-4); + + addComponents( + new DecoButton(xSize-48-4, 156+8-8-2) + .withBackground(DecoTextures.COMPONENT_BUTTON_ROUND) + .withText("ii.gui.button.apply") + .withSize(48, 12) + .withOnPressed((gui, button, mouseX, mouseY) -> { + rules.set(editedRule, edited.copy()); + cancel = false; + return changeGUI(IIGUI.DATA_MERGER); + }), + new DecoButton(xSize-48*2-4, 156+8-8-2) + .withBackground(DecoTextures.COMPONENT_BUTTON_ROUND) + .withText("ii.gui.button.cancel") + .withSize(48, 12) + .withOnPressed((gui, button, mouseX, mouseY) -> { + cancel = true; + return changeGUI(IIGUI.DATA_MERGER); + }) + ); + } + + private void addInputSection(DecoPanel panel, int yy) + { + DecoPanel panelPaper = panel.addComponent(new DecoPanel(-4, yy+4) + .withBackground(DecoTextures.BG_PAPER) + .withBackgroundMask(DecoTextures.TEMPLATE_PAPER) + .withSize(176-8-12+4, 18) + ); + panelPaper.addLabel(KEY+"variable", 4, 6) + .withSize(48, 9) + .withAlign(DecoAlignment.LEFT); + panelPaper.addComponent(new DecoDropdownDataLetters(176-8-12+4-18, 0) + .withConstraints(new DataPacket()) + .withSelectedEntry((Character)edited.variable) + .withTextColor(DecoColors.H1, IIColor.fromPackedRGB(0x35322c)) + .withBackground(DecoTextures.COMPONENT_DROPDOWN_DATA_LETTER_PAPER) + .withDropdownSymbol(DecoTextures.COMPONENT_DROPDOWN_SYMBOL_PAPER) + .withOnSelectedEntry((oldChar, newChar) -> edited.variable = newChar) + ); + + panel.addComponent(new DecoCheckbox(0, yy+22) + .withSize(84, 12) + .withText(KEY+"accept_left") + .withChecked(edited.acceptLeft) + .withOnToggle(checked -> edited.acceptLeft = checked) + .withTranslatedTooltip(KEY+"accept_left.tooltip") + ); + panel.addComponent(new DecoCheckbox(0, yy+22+12) + .withSize(84, 12) + .withText(KEY+"accept_right") + .withChecked(edited.acceptRight) + .withOnToggle(checked -> edited.acceptRight = checked) + .withTranslatedTooltip(KEY+"accept_right.tooltip") + ); + panel.addComponent(new DecoCheckbox(0, yy+22+12+12) + .withSize(120, 12) + .withText(KEY+"trigger_forwarding") + .withChecked(edited.triggerForwarding) + .withOnToggle(checked -> edited.triggerForwarding = checked) + .withTranslatedTooltip(KEY+"trigger_forwarding.tooltip") + ); + + panel.addLabel(KEY+"usage_limit", 0, yy+22+12+12+8+4+3) + .withSize(74, 9) + .withAlign(DecoAlignment.LEFT) + .withTranslatedTooltip(KEY+"usage_limit.tooltip"); + panel.addComponent(new DecoTextField(78, yy+22+12+12+8+4-1) + .withSize(42, 16) + .withFilter(TextFilter.DECIMAL) + .withText(edited.usageLimit < 0?"": String.valueOf(edited.usageLimit)) + .withOnTextChanged(text -> edited.usageLimit = text==null||text.trim().isEmpty()?-1: IIStringUtil.parseInt(text.trim())) + .withTranslatedTooltip(KEY+"usage_limit.tooltip") + ); + } + + private void addPolicySection(DecoPanel panel, int yy) + { + panel.addComponent(new DecoCheckbox(0, yy) + .withSize(164, 12) + .withText(KEY+"right_overrides_cached") + .withTranslatedTooltip(KEY+"right_overrides_cached.tooltip") + .withChecked(edited.rightOverridesCachedValue) + .withOnToggle(checked -> edited.rightOverridesCachedValue = checked) + ); + panel.addComponent(new DecoCheckbox(0, yy+16) + .withSize(164, 12) + .withText(KEY+"right_overrides_value") + .withTranslatedTooltip(KEY+"right_overrides_value.tooltip") + .withChecked(edited.rightOverridesValue) + .withOnToggle(checked -> edited.rightOverridesValue = checked) + ); + } + + @Override + protected EasyNBT onSaveTileData() + { + return super.onSaveTileData() + .conditionally(!cancel&&rules!=null, easyNBT -> easyNBT.withSerializable("rules", rules)); + } +} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_router/GuiDataRouter.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_router/GuiDataRouter.java index 9004dfff7..2395e7878 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_router/GuiDataRouter.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_router/GuiDataRouter.java @@ -89,7 +89,7 @@ public void onInit() .withSize(58, 12) .withAlign(DecoAlignment.LEFT) ) - .withComponent(p -> new DecoButton(p.width-17+1, 2) + .withComponent(p -> new DecoButton(p.width-17+1-14, 2) .withTemplate(DecoTemplates.ACTION_BUTTON_EDIT) .withOnLMBPressed(() -> { editedRule = rules.indexOf(p.getCurrentElement()); @@ -97,6 +97,17 @@ public void onInit() changeGUI(IIGUI.DATA_ROUTER_EDIT); }) ) + .withComponent(p -> new DecoButton(p.width-17+1, 2) + .withTemplate(DecoTemplates.ACTION_BUTTON_REMOVE) + .withOnLMBPressed(() -> { + int index = rules.indexOf(p.getCurrentElement()); + if(index >= 0) + { + rules.remove(index); + refreshGUI(); + } + }) + ) .withElementApplyMethod((rule, panel) -> { panel.component("action", DecoButton.class) .withRawText(rule.action.getLocalizedName()) diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/IIGUI.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/IIGUI.java index addf98481..bc097ed1c 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/IIGUI.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/IIGUI.java @@ -20,6 +20,8 @@ import pl.pabilo8.immersiveintelligence.client.gui.block.arithmetic_logic_machine.GuiArithmeticLogicMachineEdit; import pl.pabilo8.immersiveintelligence.client.gui.block.data_input_machine.GuiDataInputMachine; import pl.pabilo8.immersiveintelligence.client.gui.block.data_input_machine.GuiDataInputMachineEdit; +import pl.pabilo8.immersiveintelligence.client.gui.block.data_merger.GuiDataMerger; +import pl.pabilo8.immersiveintelligence.client.gui.block.data_merger.GuiDataMergerEdit; import pl.pabilo8.immersiveintelligence.client.gui.block.data_router.GuiDataRouter; import pl.pabilo8.immersiveintelligence.client.gui.block.data_router.GuiDataRouterEdit; import pl.pabilo8.immersiveintelligence.client.gui.block.emplacement.GuiEmplacementPageConfig; @@ -127,6 +129,7 @@ public enum IIGUI implements ISerializableEnum FUEL_STATION(TileEntityFuelStation.class, ContainerFuelStation::new), DATA_MERGER(TileEntityDataMerger.class, ContainerDataMerger::new), + DATA_MERGER_EDIT(TileEntityDataMerger.class, ContainerDataMerger::new), DATA_ROUTER(TileEntityDataRouter.class, ContainerDataRouter::getMainGui), DATA_ROUTER_EDIT(TileEntityDataRouter.class, ContainerDataRouter::getEditGui), INSERTER(TileEntityInserterBase.class, ContainerInserter::new), @@ -253,7 +256,8 @@ public static void initClientGUIs() IIGUI.ELECTROLYZER.setClientTileGui(GuiElectrolyzer::new); IIGUI.PRECISION_ASSEMBLER.setClientTileGui(GuiPrecisionAssembler::new); IIGUI.FUEL_STATION.setClientTileGui(GuiFuelStation::new); - IIGUI.DATA_MERGER.setClientGui(GuiDataMerger::new); + IIGUI.DATA_MERGER.setClientTileGui(GuiDataMerger::new); + IIGUI.DATA_MERGER_EDIT.setClientTileGui(GuiDataMergerEdit::new); IIGUI.DATA_ROUTER.setClientTileGui(GuiDataRouter::new); IIGUI.DATA_ROUTER_EDIT.setClientTileGui(GuiDataRouterEdit::new); IIGUI.INSERTER.setClientTileGui(GuiInserter::new); @@ -321,13 +325,6 @@ public static void registerDecoJEICompat(IModRegistry registry) registry.addAdvancedGuiHandlers(new DecoGuiJEIHandler<>(gui)); } - @SideOnly(Side.CLIENT) - @Deprecated - public void setClientGui(BiFunction guiFromTile) - { - this.guiFromTile = (player, tileEntity) -> guiFromTile.apply(player, (T)tileEntity); - } - @SideOnly(Side.CLIENT) @SuppressWarnings("unchecked") public > void setClientTileGui(BiFunction> guiFromTile) diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/data_device/tileentity/TileEntityDataMerger.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/data_device/tileentity/TileEntityDataMerger.java index 3fe0746e5..052bc47f3 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/data_device/tileentity/TileEntityDataMerger.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/data_device/tileentity/TileEntityDataMerger.java @@ -2,10 +2,8 @@ import blusunrize.immersiveengineering.common.blocks.IEBlockInterfaces.IBlockBounds; import blusunrize.immersiveengineering.common.blocks.IEBlockInterfaces.IDirectionalTile; -import blusunrize.immersiveengineering.common.blocks.IEBlockInterfaces.IGuiTile; import blusunrize.immersiveengineering.common.blocks.IEBlockInterfaces.IPlayerInteraction; import blusunrize.immersiveengineering.common.blocks.TileEntityIEBase; -import blusunrize.immersiveengineering.common.util.inventory.IIEInventory; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -15,49 +13,107 @@ import net.minecraft.util.EnumHand; import net.minecraft.util.ITickable; import net.minecraft.util.NonNullList; +import net.minecraftforge.common.util.Constants; +import net.minecraftforge.common.util.INBTSerializable; import pl.pabilo8.immersiveintelligence.api.data.DataPacket; import pl.pabilo8.immersiveintelligence.api.data.IIDataHandlingUtils; import pl.pabilo8.immersiveintelligence.api.data.device.IDataDevice; +import pl.pabilo8.immersiveintelligence.api.data.types.generic.DataType; import pl.pabilo8.immersiveintelligence.common.IIGUI; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.EasyCollection; +import pl.pabilo8.immersiveintelligence.common.util.multiblock.IIMultiblockInterfaces.IIIGuiMultiblockTile; +import pl.pabilo8.immersiveintelligence.common.util.multiblock.IIMultiblockInterfaces.IIIInventory; -import javax.annotation.Nullable; +import javax.annotation.Nonnull; +import java.util.ArrayList; +import java.util.List; /** * @author Pabilo8 (pabilo@iiteam.net) - * @updated 24.06.2025 + * @updated 02.06.2026 * @since 17.05.2019 */ -public class TileEntityDataMerger extends TileEntityIEBase implements IPlayerInteraction, ITickable, IBlockBounds, IDirectionalTile, IDataDevice, IGuiTile, IIEInventory +public class TileEntityDataMerger extends TileEntityIEBase implements IPlayerInteraction, ITickable, IBlockBounds, IDirectionalTile, IDataDevice, IIIGuiMultiblockTile, IIIInventory { public EnumFacing facing = EnumFacing.NORTH; - public DataPacket settingsPacket = new DataPacket(); - public DataMergerSendMode mode = DataMergerSendMode.SEND_ON_BOTH; - DataPacket packetLeft = new DataPacket(); - DataPacket packetRight = new DataPacket(); + + public EasyCollection mergeRules = new EasyCollection<>(DataMergeRule::new); + public DataPacket packetLeft = new DataPacket(); + public DataPacket packetRight = new DataPacket(); @Override public void readCustomNBT(NBTTagCompound nbt, boolean descPacket) { - mode = DataMergerSendMode.values()[nbt.getByte("mode")]; facing = EnumFacing.getFront(nbt.getInteger("facing")); - settingsPacket = new DataPacket(nbt.getCompoundTag("packet")); + if(nbt.hasKey("rules", Constants.NBT.TAG_LIST)) + mergeRules.deserializeNBT(nbt.getTagList("rules", Constants.NBT.TAG_COMPOUND)); + else if(nbt.hasKey("packet", Constants.NBT.TAG_COMPOUND)) + migrateLegacySettings(new DataPacket(nbt.getCompoundTag("packet"))); + packetLeft = new DataPacket(nbt.getCompoundTag("packetLeft")); packetRight = new DataPacket(nbt.getCompoundTag("packetRight")); - } @Override public void writeCustomNBT(NBTTagCompound nbt, boolean descPacket) { - nbt.setByte("mode", (byte)mode.ordinal()); nbt.setInteger("facing", facing.ordinal()); - - nbt.setTag("packet", settingsPacket.serializeNBT()); + nbt.setTag("rules", mergeRules.serializeNBT()); nbt.setTag("packetLeft", packetLeft.serializeNBT()); nbt.setTag("packetRight", packetRight.serializeNBT()); } + private void migrateLegacySettings(DataPacket settingsPacket) + { + mergeRules.clear(); + + for(char c : DataPacket.VARIABLE_NAMES) + IIDataHandlingUtils.optionalInt(c, settingsPacket).ifPresent(integer -> { + int mode = integer+2; + if(mode < 0||mode >= VariableMergeMode.values().length) + return; + + VariableMergeMode legacy = VariableMergeMode.values()[mode]; + if(legacy==VariableMergeMode.RETAIN_ORIGINAL) + return; + + DataMergeRule rule = new DataMergeRule(); + rule.variable = c; + rule.triggerForwarding = true; + rule.usageLimit = -1; + + switch(legacy) + { + case PREFER_RIGHT: + rule.acceptLeft = true; + rule.acceptRight = true; + rule.rightOverridesCachedValue = true; + rule.rightOverridesValue = true; + break; + case FORCE_RIGHT: + rule.acceptLeft = false; + rule.acceptRight = true; + rule.rightOverridesCachedValue = true; + rule.rightOverridesValue = true; + break; + case PREFER_LEFT: + rule.acceptLeft = true; + rule.acceptRight = true; + rule.rightOverridesCachedValue = false; + rule.rightOverridesValue = true; + break; + case FORCE_LEFT: + rule.acceptLeft = true; + rule.acceptRight = false; + rule.rightOverridesCachedValue = false; + rule.rightOverridesValue = true; + break; + } + mergeRules.add(rule); + }); + } + @Override public boolean interact(EnumFacing side, EntityPlayer player, EnumHand hand, ItemStack heldItem, float hitX, float hitY, float hitZ) { @@ -74,10 +130,13 @@ public void receiveMessageFromServer(NBTTagCompound message) public void receiveMessageFromClient(NBTTagCompound message) { super.receiveMessageFromClient(message); - if(message.hasKey("mode")) - mode = DataMergerSendMode.values()[message.getByte("mode")]; - if(message.hasKey("packet")) - settingsPacket.deserializeNBT(message.getCompoundTag("packet")); + if(message.hasKey("rules", Constants.NBT.TAG_LIST)) + { + mergeRules.deserializeNBT(message.getTagList("rules", Constants.NBT.TAG_COMPOUND)); + markDirty(); + if(world!=null) + world.notifyBlockUpdate(pos, world.getBlockState(pos), world.getBlockState(pos), 3); + } } @Override @@ -131,53 +190,52 @@ public boolean canRotate(EnumFacing axis) @Override public void onReceive(DataPacket packet, EnumFacing side) { - boolean send = mode==DataMergerSendMode.SEND_ON_BOTH; + boolean fromLeft = side==facing.rotateYCCW(); + boolean fromRight = side==facing.rotateY(); - //Incoming packet on the left - if(side==facing.rotateYCCW()) - { - packetLeft = packet.clone(); - send = send||mode==DataMergerSendMode.SEND_LEFT_ONLY; - } + //The merger only listens to its two input sides. + if(!fromLeft&&!fromRight) + return; - //Incoming packet on the right - if(side==facing.rotateY()) + DataPacket incoming = packet.clone(); + DataPacket cache = fromLeft?packetLeft: packetRight; + boolean shouldForward = false; + List expiredRules = new ArrayList<>(); + + //Accept variables into the side cache and check if this packet should trigger output. + for(DataMergeRule rule : mergeRules) + if(rule.acceptsSide(fromLeft, fromRight)&&incoming.has(rule.variable)) + { + cache.set(rule.variable, incoming.get(rule.variable).clone()); + if(rule.triggerForwarding) + shouldForward = true; + + rule.consumeUse(); + if(rule.isExpired()) + expiredRules.add(rule); + } + + if(!shouldForward) { - packetRight = packet.clone(); - send = send||mode==DataMergerSendMode.SEND_RIGHT_ONLY; + if(!expiredRules.isEmpty()) + { + mergeRules.removeAll(expiredRules); + markDirty(); + } + return; } - if(!send) - return; + DataPacket outgoing = incoming.clone(); + for(DataMergeRule rule : mergeRules) + rule.applyTo(outgoing, incoming, packetLeft, packetRight); - for(char c : DataPacket.VARIABLE_NAMES) - IIDataHandlingUtils.optionalInt(c, packet).ifPresent(integer -> { - switch(VariableMergeMode.values()[integer+2]) - { - //Original - case RETAIN_ORIGINAL: - break; - //Left - case FORCE_LEFT: - packet.set(c, packetLeft.get(c)); - break; - case PREFER_LEFT: - if(packetLeft.has(c)) - packet.set(c, packetLeft.get(c)); - break; - //Right - case FORCE_RIGHT: - packet.set(c, packetRight.get(c)); - break; - case PREFER_RIGHT: - if(packetRight.has(c)) - packet.set(c, packetRight.get(c)); - break; - } - }); + if(!expiredRules.isEmpty()) + { + mergeRules.removeAll(expiredRules); + markDirty(); + } - //Send packet - IIDataHandlingUtils.sendPacketAdjacently(packet, world, this.pos, facing); + IIDataHandlingUtils.sendPacketAdjacently(outgoing, world, this.pos, facing); } @Override @@ -187,16 +245,15 @@ public boolean canOpenGui() } @Override - public int getGuiID() + public TileEntity master() { - return IIGUI.DATA_MERGER.ordinal(); + return this; } - @Nullable @Override - public TileEntity getGuiMaster() + public IIGUI getGUI() { - return this; + return IIGUI.DATA_MERGER; } @Override @@ -223,14 +280,115 @@ public void doGraphicalUpdates(int slot) } - public enum DataMergerSendMode + public static class DataMergeRule implements INBTSerializable { - SEND_ON_BOTH, - SEND_LEFT_ONLY, - SEND_RIGHT_ONLY, + public char variable = 'a'; + public boolean acceptLeft = true; + public boolean acceptRight = true; + public boolean triggerForwarding = true; + + /** + * When both side caches hold the variable, true gives priority to right; false gives priority to left. + */ + public boolean rightOverridesCachedValue = true; + + /** + * When true, the selected cached value can replace the variable already present in the outgoing packet. + * When false, the incoming packet's value is preserved and the cache only fills missing variables. + */ + public boolean rightOverridesValue = true; + + /** + * -1 means infinite Job. Non-negative values are Requests and are decremented when the rule accepts a variable. + */ + public int usageLimit = -1; + + public boolean isJob() + { + return usageLimit < 0; + } + + public boolean acceptsSide(boolean fromLeft, boolean fromRight) + { + return (fromLeft&&acceptLeft)||(fromRight&&acceptRight); + } + + public void consumeUse() + { + if(usageLimit > 0) + usageLimit--; + } + + public boolean isExpired() + { + return usageLimit==0; + } + + public DataMergeRule copy() + { + DataMergeRule copy = new DataMergeRule(); + copy.deserializeNBT(serializeNBT()); + return copy; + } + + public void applyTo(DataPacket outgoing, DataPacket incoming, DataPacket leftCache, DataPacket rightCache) + { + DataType cached = getSelectedCachedValue(leftCache, rightCache); + if(cached==null) + return; + + //Preserve the incoming packet value unless this rule is allowed to override it. + if(incoming.has(variable)&&!rightOverridesValue) + return; + + outgoing.set(variable, cached.clone()); + } + + private DataType getSelectedCachedValue(DataPacket leftCache, DataPacket rightCache) + { + boolean hasLeft = acceptLeft&&leftCache.has(variable); + boolean hasRight = acceptRight&&rightCache.has(variable); + + if(hasLeft&&hasRight) + return rightOverridesCachedValue?rightCache.get(variable): leftCache.get(variable); + else if(hasRight) + return rightCache.get(variable); + else if(hasLeft) + return leftCache.get(variable); + return null; + } + + @Nonnull + @Override + public NBTTagCompound serializeNBT() + { + NBTTagCompound nbt = new NBTTagCompound(); + nbt.setString("variable", String.valueOf(variable)); + nbt.setBoolean("accept_left", acceptLeft); + nbt.setBoolean("accept_right", acceptRight); + nbt.setBoolean("trigger_forwarding", triggerForwarding); + nbt.setBoolean("right_overrides_cached", rightOverridesCachedValue); + nbt.setBoolean("right_overrides_value", rightOverridesValue); + nbt.setInteger("usage_limit", usageLimit); + return nbt; + } + + @Override + public void deserializeNBT(NBTTagCompound nbt) + { + String variableString = nbt.getString("variable"); + variable = variableString.isEmpty()?'a': variableString.charAt(0); + + acceptLeft = !nbt.hasKey("accept_left")||nbt.getBoolean("accept_left"); + acceptRight = !nbt.hasKey("accept_right")||nbt.getBoolean("accept_right"); + triggerForwarding = !nbt.hasKey("trigger_forwarding")||nbt.getBoolean("trigger_forwarding"); + rightOverridesCachedValue = !nbt.hasKey("right_overrides_cached")||nbt.getBoolean("right_overrides_cached"); + rightOverridesValue = !nbt.hasKey("right_overrides_value")||nbt.getBoolean("right_overrides_value"); + usageLimit = nbt.hasKey("usage_limit")?nbt.getInteger("usage_limit"): -1; + } } - enum VariableMergeMode + private enum VariableMergeMode { PREFER_RIGHT, FORCE_RIGHT, diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerDataMerger.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerDataMerger.java index 8c2bacd75..1476793a3 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerDataMerger.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerDataMerger.java @@ -7,14 +7,12 @@ /** * @author Pabilo8 (pabilo@iiteam.net) * @updated 02.06.2026 - * @since 30.06.2019 */ public class ContainerDataMerger extends ContainerIITileBase { public ContainerDataMerger(EntityPlayer player, TileEntityDataMerger tile) { super(player, tile); - this.addPlayerInventory(player.inventory, 8, 86); + this.addPlayerInventory(player.inventory, 8, 176); } - } diff --git a/src/main/resources/assets/immersiveintelligence/lang/en_us.lang b/src/main/resources/assets/immersiveintelligence/lang/en_us.lang index 2f770d0ac..4b24ede41 100644 --- a/src/main/resources/assets/immersiveintelligence/lang/en_us.lang +++ b/src/main/resources/assets/immersiveintelligence/lang/en_us.lang @@ -629,7 +629,7 @@ tile.immersiveintelligence.metal_device.timed_buffer.name=Timed Buffer tile.immersiveintelligence.metal_device.redstone_buffer.name=Redstone Buffer tile.immersiveintelligence.metal_device.punchtape_reader.name=Punchtape Reader tile.immersiveintelligence.metal_device.data_router.name=Data Router -tile.immersiveintelligence.metal_device.data_merger.name=Data Combiner +tile.immersiveintelligence.metal_device.data_merger.name=Data Merger tile.immersiveintelligence.metal_device.ammunition_crate.name=Ammunition Crate tile.immersiveintelligence.metal_device.medic_crate.name=Medical Crate @@ -1501,10 +1501,6 @@ desc.immersiveintelligence.bullets.armor_penetration=Armor Penetration: desc.immersiveintelligence.bullet_magazine.remaining=Remaining Bullets: %s desc.immersiveintelligence.bullet_magazine.empty=Empty -desc.immersiveintelligence.data_merger.0=Both -desc.immersiveintelligence.data_merger.1=Left -desc.immersiveintelligence.data_merger.2=Right - desc.immersiveintelligence.medical_crate.heal=Heal Wounded Entities desc.immersiveintelligence.medical_crate.boost=Apply Effects to Entities @@ -3436,6 +3432,27 @@ ii.gui.data_router.remove_control_variable.tooltip=When enabled, the control var ii.gui.data_router.action.allow=Allow ii.gui.data_router.action.deny=Deny +ii.gui.data_merger.rule_properties=Merge Rule +ii.gui.data_merger.inputs=Inputs +ii.gui.data_merger.override_policy=Overwrite Policy +ii.gui.data_merger.variable=Variable +ii.gui.data_merger.accept_left=Accept Left +ii.gui.data_merger.accept_left.tooltip=Packets coming to the left side of the device will be accepted. +ii.gui.data_merger.accept_right=Accept Right +ii.gui.data_merger.accept_right.tooltip=Packets coming to the right side of the device will be accepted. +ii.gui.data_merger.trigger_forwarding=Mark for sending +ii.gui.data_merger.trigger_forwarding.tooltip=When this variable is present in a packet, the machine will send the merged data. +ii.gui.data_merger.usage_limit=Uses left: +ii.gui.data_merger.usage_limit.tooltip=Empty means this rule is a repeating Job. A number makes it an expiring Request. +ii.gui.data_merger.right_overrides_cached=Right Overrides Cache +ii.gui.data_merger.right_overrides_cached.tooltip=When both side caches contain this variable, the right-side cached value wins. +ii.gui.data_merger.right_overrides_value=Right Overrides Output +ii.gui.data_merger.right_overrides_value.tooltip=When enabled, the selected cached value may replace the value already present in the outgoing packet. +ii.gui.data_merger.left=Left +ii.gui.data_merger.right=Right +ii.gui.data_merger.send=Send + + #GUI HelpBoxes ii.gui_help.data_input_machine.programming=These slots allow reading a punchtape into the DIM's memory or writing its contents into an empty one. ii.gui_help.data_input_machine.storage=These slots allow storing empty or programmed punchtapes for convenience. diff --git a/src/main/resources/assets/immersiveintelligence/textures/gui/data_merger.png b/src/main/resources/assets/immersiveintelligence/textures/gui/data_merger.png deleted file mode 100644 index 561aab163f862ff762657b9af2a20f19e78853a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 130740 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ྰWU{#!`QEqFnGI!|Uw68dM&-p)|@ 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/immersiveintelligence/textures/gui/upgrade/printing_press/batching_mechanism.png b/src/main/resources/assets/immersiveintelligence/textures/gui/upgrade/printing_press/batching.png similarity index 100% rename from src/main/resources/assets/immersiveintelligence/textures/gui/upgrade/printing_press/batching_mechanism.png rename to src/main/resources/assets/immersiveintelligence/textures/gui/upgrade/printing_press/batching.png diff --git a/src/main/resources/assets/immersiveintelligence/textures/gui/upgrade/printing_press/punchtape_processor.png b/src/main/resources/assets/immersiveintelligence/textures/gui/upgrade/printing_press/punchtapes.png similarity index 100% rename from src/main/resources/assets/immersiveintelligence/textures/gui/upgrade/printing_press/punchtape_processor.png rename to src/main/resources/assets/immersiveintelligence/textures/gui/upgrade/printing_press/punchtapes.png From 70a07eed4aca2db1a3f3d865bbfbf37713476d3d Mon Sep 17 00:00:00 2001 From: Pabilo8 Date: Wed, 3 Jun 2026 03:17:09 +0200 Subject: [PATCH 19/23] Added basic inventory handling to Emplacement weapons --- .../gui/block/emplacement/GuiEmplacement.java | 14 ++- .../GuiEmplacementPageStorage.java | 27 ++-- .../emplacement/TileEntityEmplacement.java | 76 +++++++++++- .../emplacement/weapon/EmplacementWeapon.java | 10 +- .../weapon/EmplacementWeaponAutocannon.java | 14 +-- .../weapon/EmplacementWeaponCPDS.java | 12 +- ...mplacementWeaponGuidedMissileLauncher.java | 11 +- .../weapon/EmplacementWeaponGunBase.java | 117 +++++++++++------- .../weapon/EmplacementWeaponHeavyRailgun.java | 11 +- .../EmplacementWeaponLightHowitzer.java | 11 +- .../weapon/EmplacementWeaponMachinegun.java | 11 +- .../weapon/EmplacementWeaponMortar.java | 11 +- .../EmplacementWeaponRocketLauncher.java | 11 +- .../common/gui/ContainerEmplacement.java | 52 ++++---- .../multiblock/IIMultiblockInterfaces.java | 1 - 15 files changed, 254 insertions(+), 135 deletions(-) diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/emplacement/GuiEmplacement.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/emplacement/GuiEmplacement.java index 0d0c016f3..2ee33876b 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/emplacement/GuiEmplacement.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/emplacement/GuiEmplacement.java @@ -2,11 +2,13 @@ import net.minecraft.entity.player.EntityPlayer; import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoAlignment; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoBackgroundBuilder.SlotStyle; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoTextures; import pl.pabilo8.immersiveintelligence.common.IIGUI; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement.TileEntityEmplacement; import pl.pabilo8.immersiveintelligence.common.gui.ContainerEmplacement; +import pl.pabilo8.immersiveintelligence.common.util.IIReference; /** * @author Pabilo8 (pabilo@iiteam.net) @@ -26,9 +28,19 @@ public void onInit() .withBox(DecoTextures.BG_STEEL_ROUGH, 0, 0, 152+96, 152+8) .withTitleBar(tile) .withNextLayer() + //Bad practicle, I know, but it was a must + .conditionally(this instanceof GuiEmplacementPageStorage, builder -> builder + .withBox(DecoTextures.BG_STEEL, DecoTextures.TEMPLATE_SQUARE, 4, 8+8, 152+96-8, 76-8-8) + .withTitleBar(IIReference.GUI_LABEL_KEY+"emplacement.platform_inventory", DecoAlignment.TOP_LEFT) + .withInventorySlots(SlotStyle.VANILLA, container.slotsBaseInventory) + .withNextLayer() + .withBox(DecoTextures.BG_STEEL, DecoTextures.TEMPLATE_SQUARE, 4, 76+4+8, 152+96-8, 76-8-8) + .withTitleBar(IIReference.GUI_LABEL_KEY+"emplacement.base_inventory", DecoAlignment.TOP_LEFT) + .withInventorySlots(SlotStyle.VANILLA, container.slotsPlatformInventory)) + .withNextLayer() .withBox(DecoTextures.BG_WOODEN, DecoTextures.TEMPLATE_ROUND_WOODEN, 32, 152+8, 176, 92) .withFrame(DecoTextures.FRAME_WOODEN_THIN, 4, false, new boolean[]{true, false, false, false}) - .withInventorySlots(SlotStyle.VANILLA, container.inventorySlots) + .withInventorySlots(SlotStyle.VANILLA, container.playerInventory) .withInventoryTitleBar() .build(); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/emplacement/GuiEmplacementPageStorage.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/emplacement/GuiEmplacementPageStorage.java index abb80079c..81f41b455 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/emplacement/GuiEmplacementPageStorage.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/emplacement/GuiEmplacementPageStorage.java @@ -12,11 +12,14 @@ /** * @author Pabilo8 (pabilo@iiteam.net) + * @updated 02.06.2026 * @since 16.07.2021 */ @DecoTemplate(name = "emplacement_storage", category = DecoGuiCategory.TERRITORY_CONTROL_TILE) public class GuiEmplacementPageStorage extends GuiEmplacement { + private static final String KEY = IIReference.GUI_LABEL_KEY+"emplacement."; + public GuiEmplacementPageStorage(EntityPlayer player, TileEntityEmplacement tile) { super(player, tile, IIGUI.EMPLACEMENT_STORAGE); @@ -28,17 +31,12 @@ public void onInit() super.onInit(); DecoPanel panelPlatform, panelBase; addComponents( - panelPlatform = new DecoPanel(4, 8+8) + panelPlatform = new DecoPanel(4, 8+8-4) .withSize(152+96-8, 76-8) - .withBackground(DecoTextures.BG_STEEL) - .withBackgroundMask(DecoTextures.TEMPLATE_SQUARE) - .withTitleLabel(IIReference.GUI_LABEL_KEY+"emplacement.platform_inventory", DecoAlignment.TOP_LEFT), - - panelBase = new DecoPanel(4, 76+4+8) + .withBackground(null), + panelBase = new DecoPanel(4, 76+4+8-4) .withSize(152+96-8, 76-8) - .withBackground(DecoTextures.BG_STEEL) - .withBackgroundMask(DecoTextures.TEMPLATE_SQUARE) - .withTitleLabel(IIReference.GUI_LABEL_KEY+"emplacement.base_inventory", DecoAlignment.TOP_LEFT) + .withBackground(null) ); panelBase.addComponents( @@ -64,6 +62,17 @@ public void onInit() ); tile.currentWeapon.initializeGUI(panelBase, panelPlatform); } + else + { + panelPlatform.addLabel(KEY+"no_weapon", 8, 18) + .withSize(panelPlatform.width-16, 12) + .withAlign(DecoAlignment.CENTER) + .withTextColor(DecoColors.H2); + panelBase.addLabel(KEY+"no_weapon", 8, 18) + .withSize(panelBase.width-16, 12) + .withAlign(DecoAlignment.CENTER) + .withTextColor(DecoColors.H2); + } } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/TileEntityEmplacement.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/TileEntityEmplacement.java index e40c83e69..e1813404f 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/TileEntityEmplacement.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/TileEntityEmplacement.java @@ -1,6 +1,7 @@ package pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement; import blusunrize.immersiveengineering.api.energy.immersiveflux.FluxStorageAdvanced; +import blusunrize.immersiveengineering.common.util.inventory.IEInventoryHandler; import com.elytradev.mirage.event.GatherLightsEvent; import com.elytradev.mirage.lighting.ILightEventConsumer; import net.minecraft.entity.Entity; @@ -8,12 +9,17 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.DamageSource; import net.minecraft.util.EnumHand; +import net.minecraft.util.NonNullList; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fml.common.Optional.Interface; import net.minecraftforge.fml.common.Optional.Method; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraftforge.items.CapabilityItemHandler; import pl.pabilo8.immersiveintelligence.ImmersiveIntelligence; import pl.pabilo8.immersiveintelligence.api.data.DataPacket; import pl.pabilo8.immersiveintelligence.api.data.IIDataHandlingUtils; @@ -94,6 +100,7 @@ public TileEntityEmplacement() { super(MultiblockEmplacement.INSTANCE); this.energyStorage = new FluxStorageAdvanced(Emplacement.energyCapacity); + this.inventory = NonNullList.withSize(32, ItemStack.EMPTY); this.door = new MultiblockInteractablePart(Emplacement.lidTime); this.upgradeManager = new UpgradeManager<>(this); this.style = new StyleCustomization(MultiblockFlagpole.STYLE_CONSTRAINTS); @@ -420,10 +427,77 @@ public Vec3d getWeaponCenter() } + //--- Weapon Inventory ---// + + public int getBaseInventorySlots() + { + IEInventoryHandler handler = getBaseItemHandler(); + return handler==null?0: handler.getSlots(); + } + + public int getPlatformInventorySlots() + { + IEInventoryHandler handler = getPlatformItemHandler(); + return handler==null?0: handler.getSlots(); + } + + public int getWeaponInventorySlots() + { + return getBaseInventorySlots()+getPlatformInventorySlots(); + } + + @Nullable + public IEInventoryHandler getBaseItemHandler() + { + return currentWeapon==null?null: currentWeapon.getBaseItemHandler(); + } + + @Nullable + public IEInventoryHandler getPlatformItemHandler() + { + return currentWeapon==null?null: currentWeapon.getPlatformItemHandler(); + } + @Override public boolean isStackValid(int slot, ItemStack stack) { - return false; + return currentWeapon!=null&&!stack.isEmpty()&&slot >= 0&&slot < getWeaponInventorySlots(); + } + + //--- Capabilities ---// + + @Override + public boolean hasCapability(@Nonnull Capability capability, @Nullable net.minecraft.util.EnumFacing facing) + { + TileEntityEmplacement master = master(); + if(master!=null&&master.currentWeapon!=null) + { + if(capability==CapabilityItemHandler.ITEM_HANDLER_CAPABILITY&&(isPOI("input")||isPOI("output"))) + return master.getWeaponInventorySlots() > 0; + if(capability==CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY&&(isPOI("input")||isPOI("output"))) + return master.currentWeapon.getBaseFluidHandler()!=null; + } + return super.hasCapability(capability, facing); + } + + @Nullable + @Override + @SuppressWarnings("unchecked") + public T getCapability(@Nonnull Capability capability, @Nullable net.minecraft.util.EnumFacing facing) + { + TileEntityEmplacement master = master(); + if(master!=null&&master.currentWeapon!=null&&(isPOI("input")||isPOI("output"))) + { + if(capability==CapabilityItemHandler.ITEM_HANDLER_CAPABILITY&&master.getWeaponInventorySlots() > 0) + return (T)master.getBaseItemHandler(); + if(capability==CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) + { + IFluidHandler handler = master.currentWeapon.getBaseFluidHandler(); + if(handler!=null) + return (T)handler; + } + } + return super.getCapability(capability, facing); } //--- IOwnableProperty ---// diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeapon.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeapon.java index ea7b10329..cc0687623 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeapon.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeapon.java @@ -2,6 +2,7 @@ import blusunrize.immersiveengineering.common.util.IEDamageSources; import blusunrize.immersiveengineering.common.util.IEDamageSources.ElectricDamageSource; +import blusunrize.immersiveengineering.common.util.inventory.IEInventoryHandler; import com.elytradev.mirage.event.GatherLightsEvent; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; @@ -15,7 +16,6 @@ import net.minecraftforge.fml.common.Optional; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import net.minecraftforge.items.IItemHandler; import pl.pabilo8.immersiveintelligence.api.data.DataPacket; import pl.pabilo8.immersiveintelligence.api.data.types.DataTypeNull; import pl.pabilo8.immersiveintelligence.api.data.types.generic.DataType; @@ -117,7 +117,13 @@ public DataType getDataCallback(String string) //--- Inventory ---// @Nullable - public IItemHandler getBaseItemHandler() + public IEInventoryHandler getBaseItemHandler() + { + return null; + } + + @Nullable + public IEInventoryHandler getPlatformItemHandler() { return null; } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponAutocannon.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponAutocannon.java index cebb1b9fe..e1efd9665 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponAutocannon.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponAutocannon.java @@ -1,22 +1,17 @@ package pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement.weapon; -import net.minecraft.item.ItemStack; -import net.minecraft.util.NonNullList; import net.minecraftforge.oredict.OreDictionary; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons.EmplacementWeapons.Autocannon; import pl.pabilo8.immersiveintelligence.common.IIContent; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement.TileEntityEmplacement; import pl.pabilo8.immersiveintelligence.common.entity.ammo.types.EntityAmmoProjectile; import pl.pabilo8.immersiveintelligence.common.item.ammo.ItemIIBulletMagazine.Magazines; -import pl.pabilo8.immersiveintelligence.common.util.multiblock.FilteredItemHandler; public class EmplacementWeaponAutocannon extends EmplacementWeaponGunBase { public EmplacementWeaponAutocannon() { super(); - this.inventoryBase = NonNullList.withSize(18, ItemStack.EMPTY); - this.inventoryPlatform = NonNullList.withSize(8, ItemStack.EMPTY); } @Override @@ -25,11 +20,14 @@ protected void onInit(TileEntityEmplacement te) super.onInit(te); this.visionAABB = this.visionAABB.grow(Autocannon.detectionRadius); this.attackAABB = this.attackAABB.grow(Autocannon.attackRadius); - this.aim.withAimSpeed(Autocannon.yawRotateSpeed, Autocannon.pitchRotateSpeed); - this.inventoryBaseHandler = new FilteredItemHandler(inventoryBase) - .withFilter(stack -> OreDictionary.itemMatches(stack, + setupItemHandlers(te, 18, 8, + stack -> OreDictionary.itemMatches(stack, + IIContent.itemBulletMagazine.getMagazine(Magazines.AUTOCANNON), false), + stack -> OreDictionary.itemMatches(stack, IIContent.itemBulletMagazine.getMagazine(Magazines.AUTOCANNON), false)); + this.aim.withAimSpeed(Autocannon.yawRotateSpeed, Autocannon.pitchRotateSpeed); + } @Override diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponCPDS.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponCPDS.java index bb2797cce..f145b090c 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponCPDS.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponCPDS.java @@ -1,14 +1,11 @@ package pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement.weapon; -import net.minecraft.item.ItemStack; -import net.minecraft.util.NonNullList; import net.minecraftforge.oredict.OreDictionary; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons.EmplacementWeapons.CPDS; import pl.pabilo8.immersiveintelligence.common.IIContent; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement.TileEntityEmplacement; import pl.pabilo8.immersiveintelligence.common.entity.ammo.types.EntityAmmoProjectile; import pl.pabilo8.immersiveintelligence.common.item.ammo.ItemIIBulletMagazine.Magazines; -import pl.pabilo8.immersiveintelligence.common.util.multiblock.FilteredItemHandler; /** * CPDS Q&A @@ -32,8 +29,6 @@ public class EmplacementWeaponCPDS extends EmplacementWeaponGunBase OreDictionary.itemMatches(stack, + + setupItemHandlers(te, 8, 3, + stack -> OreDictionary.itemMatches(stack, + IIContent.itemBulletMagazine.getMagazine(Magazines.CPDS_DRUM), false), + stack -> OreDictionary.itemMatches(stack, IIContent.itemBulletMagazine.getMagazine(Magazines.CPDS_DRUM), false)); this.aim.withAimSpeed(CPDS.yawRotateSpeed, CPDS.pitchRotateSpeed); } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponGuidedMissileLauncher.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponGuidedMissileLauncher.java index b9b4b07e4..6bada35fe 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponGuidedMissileLauncher.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponGuidedMissileLauncher.java @@ -1,19 +1,14 @@ package pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement.weapon; -import net.minecraft.item.ItemStack; -import net.minecraft.util.NonNullList; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons.EmplacementWeapons.Autocannon; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons.EmplacementWeapons.CPDS; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement.TileEntityEmplacement; import pl.pabilo8.immersiveintelligence.common.entity.ammo.types.EntityAmmoProjectile; -import pl.pabilo8.immersiveintelligence.common.util.multiblock.FilteredItemHandler; public class EmplacementWeaponGuidedMissileLauncher extends EmplacementWeaponGunBase { public EmplacementWeaponGuidedMissileLauncher() { - this.inventoryBase = NonNullList.withSize(12, ItemStack.EMPTY); - this.inventoryPlatform = NonNullList.withSize(6, ItemStack.EMPTY); } @Override @@ -23,8 +18,10 @@ protected void onInit(TileEntityEmplacement te) this.visionAABB = this.visionAABB.grow(Autocannon.detectionRadius); this.attackAABB = this.attackAABB.grow(Autocannon.attackRadius); - this.inventoryBaseHandler = new FilteredItemHandler(inventoryBase) - .withFilter(this.ammoFactory::isValidAmmo); + setupItemHandlers(te, 12, 6, + stack -> this.ammoFactory!=null&&this.ammoFactory.isValidAmmo(stack), + stack -> this.ammoFactory!=null&&this.ammoFactory.isValidAmmo(stack)); + this.aim.withAimSpeed(CPDS.yawRotateSpeed, CPDS.pitchRotateSpeed); } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponGunBase.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponGunBase.java index ba8f19f7b..284604358 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponGunBase.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponGunBase.java @@ -1,13 +1,9 @@ package pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement.weapon; -import blusunrize.immersiveengineering.common.util.Utils; +import blusunrize.immersiveengineering.common.util.inventory.IEInventoryHandler; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.NonNullList; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.ItemStackHandler; import pl.pabilo8.immersiveintelligence.api.ammo.utils.AmmoFactory; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoPanel; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement.TileEntityEmplacement; @@ -15,8 +11,10 @@ import pl.pabilo8.immersiveintelligence.common.entity.ammo.EntityAmmoBase; import pl.pabilo8.immersiveintelligence.common.util.easynbt.TargetCoordinateReference; +import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.Collections; +import java.util.function.Predicate; /** * @author Pabilo8 (pabilo@iiteam.net) @@ -30,18 +28,10 @@ public abstract class EmplacementWeaponGunBase> exte * Used to fire ammo for the weapon */ protected AmmoFactory ammoFactory; - /** - * Inventory inside the weapons platform - */ - protected NonNullList inventoryPlatform; - /** - * Inventory inside the multiblock base - */ - protected NonNullList inventoryBase; @Nullable - protected ItemStackHandler inventoryPlatformHandler; + protected IEInventoryHandler inventoryBaseHandler; @Nullable - protected ItemStackHandler inventoryBaseHandler; + protected IEInventoryHandler inventoryPlatformHandler; /** * Called after the weapon is installed or loaded from NBT @@ -67,18 +57,11 @@ public EmplacementStateNeeds onUpdate(TileEntityEmplacement te, EmplacementState return super.onUpdate(te, baseNeeds, currentTarget); } - @Nullable - @Override - public IItemHandler getBaseItemHandler() - { - return inventoryBaseHandler; - } - @SideOnly(Side.CLIENT) @Override public void initializeGUI(DecoPanel panelBase, DecoPanel panelPlatform) { - //panelBase.addComponent(new DecoItemStackListDisplay()); + } @Override @@ -96,32 +79,82 @@ public void setDead() .setIgnoredEntities(Collections.emptyList()); } - //--- NBT ---// + @Nullable + @Override + public IEInventoryHandler getBaseItemHandler() + { + return inventoryBaseHandler; + } + @Nullable @Override - public void deserializeNBT(NBTTagCompound nbt) + public IEInventoryHandler getPlatformItemHandler() + { + return inventoryPlatformHandler; + } + + /** + * Creates tile-backed IE inventory handlers for weapons that do not require item filtering. + */ + protected final void setupItemHandlers(TileEntityEmplacement te, int baseSlots, int platformSlots) { - super.deserializeNBT(nbt); - if(nbt.hasKey("inventory_platform")) + setupItemHandlers(te, baseSlots, platformSlots, stack -> true, stack -> true); + } + + /** + * Creates tile-backed IE inventory handlers for this weapon. + * + * @param te Emplacement tile entity + * @param baseSlots slots reserved at the start of the tile inventory + * @param platformSlots slots reserved directly after the base section + * @param baseFilter filter for base-section insertion + * @param platformFilter filter for platform-section insertion + */ + protected final void setupItemHandlers(TileEntityEmplacement te, int baseSlots, int platformSlots, + Predicate baseFilter, Predicate platformFilter) + { + baseSlots = Math.max(0, Math.min(baseSlots, te.inventory.size())); + platformSlots = Math.max(0, Math.min(platformSlots, te.inventory.size()-baseSlots)); + + this.inventoryBaseHandler = baseSlots > 0? + new FilteredEmplacementInventoryHandler(baseSlots, te, 0, baseFilter): null; + this.inventoryPlatformHandler = platformSlots > 0? + new FilteredEmplacementInventoryHandler(platformSlots, te, baseSlots, platformFilter): null; + } + + /** + * IE's inventory handler already performs the normal tile inventory write/read logic; + * this small extension only adds a per-weapon stack filter before delegating to it. + */ + protected static class FilteredEmplacementInventoryHandler extends IEInventoryHandler + { + private final Predicate filter; + + public FilteredEmplacementInventoryHandler(int slots, TileEntityEmplacement inventory, int slotOffset, Predicate filter) { - NonNullList stacks = Utils.readInventory(nbt.getTagList("inventory_platform", 10), inventoryPlatform.size()); - for(int i = 0; i < stacks.size(); i++) - inventoryPlatform.set(i, stacks.get(i)); + super(slots, inventory, slotOffset, true, true); + this.filter = filter==null?stack -> true: filter; } - if(nbt.hasKey("inventory_base")) + + @Override + public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { - NonNullList stacks = Utils.readInventory(nbt.getTagList("inventory_base", 10), inventoryBase.size()); - for(int i = 0; i < stacks.size(); i++) - inventoryBase.set(i, stacks.get(i)); + if(!accepts(stack)) + return stack; + return super.insertItem(slot, stack, simulate); } - } - @Override - public NBTTagCompound serializeNBT() - { - NBTTagCompound nbt = super.serializeNBT(); - nbt.setTag("inventory_platform", Utils.writeInventory(inventoryPlatform)); - nbt.setTag("inventory_base", Utils.writeInventory(inventoryBase)); - return nbt; + @Override + public void setStackInSlot(int slot, @Nonnull ItemStack stack) + { + if(!stack.isEmpty()&&!filter.test(stack)) + return; + super.setStackInSlot(slot, stack); + } + + public boolean accepts(ItemStack stack) + { + return !stack.isEmpty()&&filter.test(stack); + } } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponHeavyRailgun.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponHeavyRailgun.java index 1377960e4..8c96d1b70 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponHeavyRailgun.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponHeavyRailgun.java @@ -1,12 +1,9 @@ package pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement.weapon; -import net.minecraft.item.ItemStack; -import net.minecraft.util.NonNullList; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons.EmplacementWeapons.HeavyRailgun; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement.TileEntityEmplacement; import pl.pabilo8.immersiveintelligence.common.entity.ammo.types.EntityAmmoProjectile; import pl.pabilo8.immersiveintelligence.common.item.weapons.ItemIIRailgunOverride; -import pl.pabilo8.immersiveintelligence.common.util.multiblock.FilteredItemHandler; import pl.pabilo8.immersiveintelligence.common.util.multiblock.util.MultiblockInteractablePart; /** @@ -18,8 +15,6 @@ public class EmplacementWeaponHeavyRailgun extends EmplacementWeaponGunBase { public EmplacementWeaponLightHowitzer() { - this.inventoryBase = NonNullList.withSize(12, ItemStack.EMPTY); - this.inventoryPlatform = NonNullList.withSize(6, ItemStack.EMPTY); } @Override @@ -23,8 +18,10 @@ protected void onInit(TileEntityEmplacement te) this.visionAABB = this.visionAABB.grow(Autocannon.detectionRadius); this.attackAABB = this.attackAABB.grow(Autocannon.attackRadius); - this.inventoryBaseHandler = new FilteredItemHandler(inventoryBase) - .withFilter(this.ammoFactory::isValidAmmo); + setupItemHandlers(te, 12, 6, + stack -> this.ammoFactory!=null&&this.ammoFactory.isValidAmmo(stack), + stack -> this.ammoFactory!=null&&this.ammoFactory.isValidAmmo(stack)); + this.aim.withAimSpeed(CPDS.yawRotateSpeed, CPDS.pitchRotateSpeed); this.ammoFactory.setUseArtilleryAngles(true); } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponMachinegun.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponMachinegun.java index 68e67a858..ca6a387c0 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponMachinegun.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponMachinegun.java @@ -1,11 +1,8 @@ package pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement.weapon; -import net.minecraft.item.ItemStack; -import net.minecraft.util.NonNullList; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons.EmplacementWeapons.Machinegun; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement.TileEntityEmplacement; import pl.pabilo8.immersiveintelligence.common.entity.ammo.types.EntityAmmoProjectile; -import pl.pabilo8.immersiveintelligence.common.util.multiblock.FilteredItemHandler; import pl.pabilo8.immersiveintelligence.common.util.multiblock.util.MultiblockInteractablePart; /** @@ -17,8 +14,6 @@ public class EmplacementWeaponMachinegun extends EmplacementWeaponGunBase this.ammoFactory!=null&&this.ammoFactory.isValidAmmo(stack), + stack -> this.ammoFactory!=null&&this.ammoFactory.isValidAmmo(stack)); + this.aim.withAimSpeed(Machinegun.yawRotateSpeed, Machinegun.pitchRotateSpeed) .withPitchLimit(-35, 65); } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponMortar.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponMortar.java index ca34ede39..758c6435a 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponMortar.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponMortar.java @@ -1,19 +1,14 @@ package pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement.weapon; -import net.minecraft.item.ItemStack; -import net.minecraft.util.NonNullList; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons.EmplacementWeapons.Autocannon; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons.EmplacementWeapons.CPDS; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement.TileEntityEmplacement; import pl.pabilo8.immersiveintelligence.common.entity.ammo.types.EntityAmmoProjectile; -import pl.pabilo8.immersiveintelligence.common.util.multiblock.FilteredItemHandler; public class EmplacementWeaponMortar extends EmplacementWeaponGunBase { public EmplacementWeaponMortar() { - this.inventoryBase = NonNullList.withSize(12, ItemStack.EMPTY); - this.inventoryPlatform = NonNullList.withSize(6, ItemStack.EMPTY); } @Override @@ -23,8 +18,10 @@ protected void onInit(TileEntityEmplacement te) this.visionAABB = this.visionAABB.grow(Autocannon.detectionRadius); this.attackAABB = this.attackAABB.grow(Autocannon.attackRadius); - this.inventoryBaseHandler = new FilteredItemHandler(inventoryBase) - .withFilter(this.ammoFactory::isValidAmmo); + setupItemHandlers(te, 12, 6, + stack -> this.ammoFactory!=null&&this.ammoFactory.isValidAmmo(stack), + stack -> this.ammoFactory!=null&&this.ammoFactory.isValidAmmo(stack)); + this.aim.withAimSpeed(CPDS.yawRotateSpeed, CPDS.pitchRotateSpeed); this.ammoFactory.setUseArtilleryAngles(true); } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponRocketLauncher.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponRocketLauncher.java index 856c4563e..1bbcca7bf 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponRocketLauncher.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponRocketLauncher.java @@ -1,19 +1,14 @@ package pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement.weapon; -import net.minecraft.item.ItemStack; -import net.minecraft.util.NonNullList; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons.EmplacementWeapons.Autocannon; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons.EmplacementWeapons.CPDS; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement.TileEntityEmplacement; import pl.pabilo8.immersiveintelligence.common.entity.ammo.types.EntityAmmoProjectile; -import pl.pabilo8.immersiveintelligence.common.util.multiblock.FilteredItemHandler; public class EmplacementWeaponRocketLauncher extends EmplacementWeaponGunBase { public EmplacementWeaponRocketLauncher() { - this.inventoryBase = NonNullList.withSize(12, ItemStack.EMPTY); - this.inventoryPlatform = NonNullList.withSize(6, ItemStack.EMPTY); } @Override @@ -23,8 +18,10 @@ protected void onInit(TileEntityEmplacement te) this.visionAABB = this.visionAABB.grow(Autocannon.detectionRadius); this.attackAABB = this.attackAABB.grow(Autocannon.attackRadius); - this.inventoryBaseHandler = new FilteredItemHandler(inventoryBase) - .withFilter(this.ammoFactory::isValidAmmo); + setupItemHandlers(te, 12, 6, + stack -> this.ammoFactory!=null&&this.ammoFactory.isValidAmmo(stack), + stack -> this.ammoFactory!=null&&this.ammoFactory.isValidAmmo(stack)); + this.aim.withAimSpeed(CPDS.yawRotateSpeed, CPDS.pitchRotateSpeed); this.ammoFactory.setUseArtilleryAngles(true); } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerEmplacement.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerEmplacement.java index 41926936a..a0a87853e 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerEmplacement.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerEmplacement.java @@ -1,20 +1,24 @@ package pl.pabilo8.immersiveintelligence.common.gui; +import blusunrize.immersiveengineering.common.util.inventory.IEInventoryHandler; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; -import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.SlotItemHandler; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement.TileEntityEmplacement; import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; +import javax.annotation.Nonnull; + /** * @author Pabilo8 (pabilo@iiteam.net) + * @updated 02.06.2026 * @since 16.07.2021 */ public class ContainerEmplacement extends ContainerIITileBase { - public Slot[] slotsEmplacementStorage; + public Slot[] slotsBaseInventory = new Slot[0]; + public Slot[] slotsPlatformInventory = new Slot[0]; public ContainerEmplacement(EntityPlayer player, TileEntityEmplacement tile) { @@ -25,30 +29,34 @@ public ContainerEmplacement(EntityPlayer player, TileEntityEmplacement tile) public static ContainerEmplacement getContainerForStoragePage(EntityPlayer player, TileEntityEmplacement tile) { ContainerEmplacement container = new ContainerEmplacement(player, tile); + if(tile.currentWeapon!=null) { - final IItemHandler handler = tile.currentWeapon.getBaseItemHandler(); - container.slotsEmplacementStorage = new Slot[0]; - /*this.slotsEmplacementStorage = addSlotArray(8,32, 0, handler.getSlots(), 9, - (container, inv1, id, x, y) -> new FilteredEmplacementSlot());*/ - } - return container; - } + tile.currentWeapon.init(tile); + IEInventoryHandler platformHandler = tile.getPlatformItemHandler(); + IEInventoryHandler baseHandler = tile.getBaseItemHandler(); - public static class FilteredEmplacementSlot extends Slot - { - final IItemHandler handler; + if(platformHandler!=null) + container.slotsPlatformInventory = container.addSlotArray(8, 24, 0, platformHandler.getSlots(), 9, + (container1, inv1, id, x, y) -> new SlotItemHandler(platformHandler, id, x, y) + { + @Override + public boolean canTakeStack(EntityPlayer playerIn) + { + return false; + } - public FilteredEmplacementSlot(IInventory inventoryIn, IItemHandler handler, int index, int xPosition, int yPosition) - { - super(inventoryIn, index, xPosition, yPosition); - this.handler = handler; - } + @Override + public boolean isItemValid(@Nonnull ItemStack stack) + { + return false; + } + }); - @Override - public boolean isItemValid(ItemStack itemStack) - { - return handler.isItemValid(getSlotIndex(), itemStack); + if(baseHandler!=null) + container.slotsBaseInventory = container.addSlotArray(8, 80+16, 0, baseHandler.getSlots(), 9, + (container1, inv1, id, x, y) -> new SlotItemHandler(baseHandler, id, x, y)); } + return container; } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/multiblock/IIMultiblockInterfaces.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/multiblock/IIMultiblockInterfaces.java index e23f27347..aae7527d5 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/multiblock/IIMultiblockInterfaces.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/multiblock/IIMultiblockInterfaces.java @@ -219,7 +219,6 @@ default int getConstructionCost() } /** - * @param client Whether to get the client or server progress * @return Current construction progress in IF */ default int getCurrentConstruction(float partialTicks) From fdb9cc9ff576adec8b54fe17e5a2279e28af1a9a Mon Sep 17 00:00:00 2001 From: Pabilo8 Date: Wed, 3 Jun 2026 04:53:54 +0200 Subject: [PATCH 20/23] Finished Config GUI page for Emplacement multiblock --- .../emplacement/GuiEmplacementPageConfig.java | 70 +++++++++- .../deco/component/panel/DecoTaskList.java | 1 + .../emplacement/TileEntityEmplacement.java | 128 +++++++++++------- .../emplacement/weapon/EmplacementWeapon.java | 54 +++++++- .../weapon/EmplacementWeaponAutocannon.java | 9 +- .../weapon/EmplacementWeaponCPDS.java | 9 +- ...mplacementWeaponGuidedMissileLauncher.java | 5 +- .../weapon/EmplacementWeaponGunBase.java | 55 +++++++- .../weapon/EmplacementWeaponHeavyRailgun.java | 5 +- .../EmplacementWeaponLightHowitzer.java | 5 +- .../weapon/EmplacementWeaponMachinegun.java | 5 +- .../weapon/EmplacementWeaponMortar.java | 5 +- .../EmplacementWeaponRocketLauncher.java | 5 +- .../common/gui/ContainerEmplacement.java | 9 +- .../immersiveintelligence/lang/en_us.lang | 17 ++- 15 files changed, 287 insertions(+), 95 deletions(-) diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/emplacement/GuiEmplacementPageConfig.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/emplacement/GuiEmplacementPageConfig.java index 2ab5deb5e..da76683bc 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/emplacement/GuiEmplacementPageConfig.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/emplacement/GuiEmplacementPageConfig.java @@ -1,20 +1,24 @@ package pl.pabilo8.immersiveintelligence.client.gui.block.emplacement; +import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoSlider; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoSwitch; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoPanel; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.visual.DecoMapDisplay; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.visual.map.DecoMapDefaultColorMapper; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.visual.map.scanners.BlockTypeScanner; -import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoGuiCategory; -import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoTemplate; -import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoTextures; +import pl.pabilo8.immersiveintelligence.client.gui.deco.util.*; import pl.pabilo8.immersiveintelligence.common.IIGUI; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock0.tileentity.TileEntityArtilleryHowitzer; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.TileEntityFlagpole; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement.TileEntityEmplacement; import pl.pabilo8.immersiveintelligence.common.util.IIColor; +import pl.pabilo8.immersiveintelligence.common.util.IIReference; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT.SyncEvents; /** * @author Pabilo8 (pabilo@iiteam.net) @@ -23,6 +27,12 @@ @DecoTemplate(name = "emplacement_config", category = DecoGuiCategory.TERRITORY_CONTROL_TILE) public class GuiEmplacementPageConfig extends GuiEmplacement { + private static final String KEY = IIReference.GUI_LABEL_KEY+"emplacement.config."; + @SyncNBT(events = {SyncEvents.TILE_CLIENT_MESSAGE}) + public boolean redstoneControlEnabled, dataControlEnabled; + @SyncNBT(events = {SyncEvents.TILE_CLIENT_MESSAGE}) + public float weaponHideHealthThreshold, weaponRepairSatisfactoryThreshold; + public GuiEmplacementPageConfig(EntityPlayer player, TileEntityEmplacement tile) { super(player, tile, IIGUI.EMPLACEMENT_CONFIG); @@ -86,5 +96,59 @@ public void onInit() .withBackground(DecoTextures.BG_PAPER) .withBackgroundMask(DecoTextures.TEMPLATE_PAPER) ); + + addLabel(I18n.format(KEY+"vision_range", calculateRange(sightRange, pos)), 4, 132+8-1) + .withSize(120, 10) + .withAlign(DecoAlignment.LEFT); + addLabel(I18n.format(KEY+"attack_range", calculateRange(fireRange, pos)), 4, 142+8-1) + .withSize(120, 10) + .withAlign(DecoAlignment.LEFT); + + addComponent(new DecoSwitch(136-4-2, 16-2) + .withText(KEY+"reacts_redstone") + .withSize(22, 14) + .withCurrentState(this.redstoneControlEnabled = tile.redstoneControlEnabled) + .withOnToggle(value -> this.redstoneControlEnabled = value) + .withTranslatedTooltip(KEY+"reacts_redstone.tooltip")); + addComponent(new DecoSwitch(136-4-2, 34-2-8+2) + .withText(KEY+"reacts_data") + .withSize(22, 14) + .withCurrentState(this.dataControlEnabled = tile.dataControlEnabled) + .withOnToggle(value -> this.dataControlEnabled = value) + .withTranslatedTooltip(KEY+"reacts_data.tooltip")); + + addLabel(KEY+"hide_health", 136-4-2, 60-20-2) + .withSize(110, 24) + .withWrapping(true) + .withAlign(DecoAlignment.LEFT); + addComponent(new DecoSlider(136-4-2+1, 72-20+8) + .withSize(110, 12) + .withRange(0f, 1f) + .withValue(this.weaponHideHealthThreshold = tile.weaponHideHealthThreshold) + .withOnValueChanged(value -> this.weaponHideHealthThreshold = value) + .withBarColors(DecoColors.ARMOR_INTEGRITY_1, DecoColors.ARMOR_INTEGRITY_2) + .withTranslatedTooltip(KEY+"hide_health.tooltip")); + + addLabel(KEY+"resurface_health", 136-4-2, 60-20+32-2) + .withSize(110, 24) + .withWrapping(true) + .withAlign(DecoAlignment.LEFT); + addComponent(new DecoSlider(136-4-2+1, 72-20+8+32) + .withSize(110, 12) + .withRange(0f, 1f) + .withValue(this.weaponRepairSatisfactoryThreshold = tile.weaponRepairSatisfactoryThreshold) + .withOnValueChanged(value -> this.weaponRepairSatisfactoryThreshold = Math.max(tile.weaponHideHealthThreshold, value)) + .withBarColors(DecoColors.ARMOR_INTEGRITY_1, DecoColors.ARMOR_INTEGRITY_2) + .withTranslatedTooltip(KEY+"resurface_health.tooltip")); + + } + + private String calculateRange(AxisAlignedBB range, BlockPos center) + { + double value = Math.max( + Math.max(Math.abs(range.minX-center.getX()), Math.abs(range.maxX-center.getX())), + Math.max(Math.abs(range.minZ-center.getZ()), Math.abs(range.maxZ-center.getZ())) + ); + return String.valueOf((int)Math.ceil(value)); } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/panel/DecoTaskList.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/panel/DecoTaskList.java index 641c686f4..e1317ede1 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/panel/DecoTaskList.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/panel/DecoTaskList.java @@ -217,6 +217,7 @@ protected boolean initialize() { //stretch requests tab; hide jobs tab tabRequests.withSize(listWidth, TAB_H); + tabRequests.x = tabJobs.x; tabJobs.visible = tabJobs.enabled = false; this.mode = ListMode.REQUESTS; } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/TileEntityEmplacement.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/TileEntityEmplacement.java index e1813404f..88719908c 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/TileEntityEmplacement.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/TileEntityEmplacement.java @@ -1,7 +1,6 @@ package pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement; import blusunrize.immersiveengineering.api.energy.immersiveflux.FluxStorageAdvanced; -import blusunrize.immersiveengineering.common.util.inventory.IEInventoryHandler; import com.elytradev.mirage.event.GatherLightsEvent; import com.elytradev.mirage.lighting.ILightEventConsumer; import net.minecraft.entity.Entity; @@ -11,6 +10,7 @@ import net.minecraft.util.EnumHand; import net.minecraft.util.NonNullList; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; @@ -91,8 +91,16 @@ public class TileEntityEmplacement extends TileEntityMultiblockIIGeneric= WEAPON_REPAIR_INTERVAL) + { + weaponRepairTicker = 0; + if(energyStorage.extractEnergy(WEAPON_REPAIR_ENERGY_COST, true)==WEAPON_REPAIR_ENERGY_COST) + changed |= currentWeapon.repair(WEAPON_REPAIR_AMOUNT); + } + } + else + weaponRepairTicker = 0; + + if(changed) + updateTileForEvent(SyncEvents.TILE_CUSTOM2); + } + @Override public void disassemble() { @@ -427,41 +492,10 @@ public Vec3d getWeaponCenter() } - //--- Weapon Inventory ---// - - public int getBaseInventorySlots() - { - IEInventoryHandler handler = getBaseItemHandler(); - return handler==null?0: handler.getSlots(); - } - - public int getPlatformInventorySlots() - { - IEInventoryHandler handler = getPlatformItemHandler(); - return handler==null?0: handler.getSlots(); - } - - public int getWeaponInventorySlots() - { - return getBaseInventorySlots()+getPlatformInventorySlots(); - } - - @Nullable - public IEInventoryHandler getBaseItemHandler() - { - return currentWeapon==null?null: currentWeapon.getBaseItemHandler(); - } - - @Nullable - public IEInventoryHandler getPlatformItemHandler() - { - return currentWeapon==null?null: currentWeapon.getPlatformItemHandler(); - } - @Override public boolean isStackValid(int slot, ItemStack stack) { - return currentWeapon!=null&&!stack.isEmpty()&&slot >= 0&&slot < getWeaponInventorySlots(); + return currentWeapon!=null; } //--- Capabilities ---// @@ -473,7 +507,7 @@ public boolean hasCapability(@Nonnull Capability capability, @Nullable net.mi if(master!=null&&master.currentWeapon!=null) { if(capability==CapabilityItemHandler.ITEM_HANDLER_CAPABILITY&&(isPOI("input")||isPOI("output"))) - return master.getWeaponInventorySlots() > 0; + return master.currentWeapon.getBaseItemHandler()!=null; if(capability==CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY&&(isPOI("input")||isPOI("output"))) return master.currentWeapon.getBaseFluidHandler()!=null; } @@ -488,8 +522,8 @@ public T getCapability(@Nonnull Capability capability, @Nullable net.mine TileEntityEmplacement master = master(); if(master!=null&&master.currentWeapon!=null&&(isPOI("input")||isPOI("output"))) { - if(capability==CapabilityItemHandler.ITEM_HANDLER_CAPABILITY&&master.getWeaponInventorySlots() > 0) - return (T)master.getBaseItemHandler(); + if(capability==CapabilityItemHandler.ITEM_HANDLER_CAPABILITY&&master.currentWeapon.getBaseItemHandler()!=null) + return (T)master.currentWeapon.getBaseItemHandler(); if(capability==CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) { IFluidHandler handler = master.currentWeapon.getBaseFluidHandler(); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeapon.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeapon.java index cc0687623..ad5f9b0ef 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeapon.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeapon.java @@ -11,6 +11,7 @@ import net.minecraft.util.SoundCategory; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fml.common.Optional; @@ -52,7 +53,7 @@ public abstract class EmplacementWeapon implements ITypeNBTSerializable protected void onInit(TileEntityEmplacement te) { this.initialized = true; - this.health = getMaxHealth(); + this.health = MathHelper.clamp(this.health, 0, getMaxHealth()); this.visionAABB = new AxisAlignedBB(new BlockPos(te.getWeaponCenter())); this.attackAABB = new AxisAlignedBB(new BlockPos(te.getWeaponCenter())); @@ -134,6 +135,57 @@ public IFluidHandler getBaseFluidHandler() return null; } + + /** + * @return true when the weapon cannot operate because its ready stock is empty. + */ + public boolean needsSupply(TileEntityEmplacement te) + { + return false; + } + + /** + * @return true when the weapon should keep the platform hidden until it can restock its ready inventory. + */ + public boolean needsRestock(TileEntityEmplacement te) + { + return false; + } + + /** + * Called by the Emplacement while the platform is fully hidden. + * Implementations should move supplies from base storage into weapon/platform storage. + * + * @return true if any stock was moved + */ + public boolean restockFromBase(TileEntityEmplacement te) + { + return false; + } + + public boolean isBelowHealthThreshold(float threshold) + { + return getHealthPercentage() < threshold; + } + + public boolean isRepairedTo(float threshold) + { + return getHealthPercentage() >= threshold; + } + + public float getHealthPercentage() + { + return getMaxHealth() <= 0?1f: MathHelper.clamp(health/(float)getMaxHealth(), 0f, 1f); + } + + public boolean repair(float amount) + { + if(amount <= 0||health >= getMaxHealth()) + return false; + health = Math.min(getMaxHealth(), health+amount); + return true; + } + public abstract int getEnergyUpkeepCost(); //--- GUI ---// diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponAutocannon.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponAutocannon.java index e1efd9665..ecec15b64 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponAutocannon.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponAutocannon.java @@ -20,14 +20,11 @@ protected void onInit(TileEntityEmplacement te) super.onInit(te); this.visionAABB = this.visionAABB.grow(Autocannon.detectionRadius); this.attackAABB = this.attackAABB.grow(Autocannon.attackRadius); - - setupItemHandlers(te, 18, 8, - stack -> OreDictionary.itemMatches(stack, - IIContent.itemBulletMagazine.getMagazine(Magazines.AUTOCANNON), false), - stack -> OreDictionary.itemMatches(stack, - IIContent.itemBulletMagazine.getMagazine(Magazines.AUTOCANNON), false)); this.aim.withAimSpeed(Autocannon.yawRotateSpeed, Autocannon.pitchRotateSpeed); + setupItemHandlers(te, 18, 8, stack -> OreDictionary.itemMatches(stack, + IIContent.itemBulletMagazine.getMagazine(Magazines.AUTOCANNON), false), stack -> OreDictionary.itemMatches(stack, + IIContent.itemBulletMagazine.getMagazine(Magazines.AUTOCANNON), false)); } @Override diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponCPDS.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponCPDS.java index f145b090c..d53022ba5 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponCPDS.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponCPDS.java @@ -37,12 +37,9 @@ protected void onInit(TileEntityEmplacement te) super.onInit(te); this.visionAABB = this.visionAABB.grow(CPDS.detectionRadius); this.attackAABB = this.attackAABB.grow(CPDS.attackRadius); - - setupItemHandlers(te, 8, 3, - stack -> OreDictionary.itemMatches(stack, - IIContent.itemBulletMagazine.getMagazine(Magazines.CPDS_DRUM), false), - stack -> OreDictionary.itemMatches(stack, - IIContent.itemBulletMagazine.getMagazine(Magazines.CPDS_DRUM), false)); + setupItemHandlers(te, 8, 3, stack -> OreDictionary.itemMatches(stack, + IIContent.itemBulletMagazine.getMagazine(Magazines.CPDS_DRUM), false), stack -> OreDictionary.itemMatches(stack, + IIContent.itemBulletMagazine.getMagazine(Magazines.CPDS_DRUM), false)); this.aim.withAimSpeed(CPDS.yawRotateSpeed, CPDS.pitchRotateSpeed); } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponGuidedMissileLauncher.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponGuidedMissileLauncher.java index 6bada35fe..1edc30d11 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponGuidedMissileLauncher.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponGuidedMissileLauncher.java @@ -18,10 +18,7 @@ protected void onInit(TileEntityEmplacement te) this.visionAABB = this.visionAABB.grow(Autocannon.detectionRadius); this.attackAABB = this.attackAABB.grow(Autocannon.attackRadius); - setupItemHandlers(te, 12, 6, - stack -> this.ammoFactory!=null&&this.ammoFactory.isValidAmmo(stack), - stack -> this.ammoFactory!=null&&this.ammoFactory.isValidAmmo(stack)); - + setupItemHandlers(te, 12, 6, this.ammoFactory::isValidAmmo, this.ammoFactory::isValidAmmo); this.aim.withAimSpeed(CPDS.yawRotateSpeed, CPDS.pitchRotateSpeed); } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponGunBase.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponGunBase.java index 284604358..665a7b938 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponGunBase.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponGunBase.java @@ -64,10 +64,63 @@ public void initializeGUI(DecoPanel panelBase, DecoPanel panelPlatform) } + @Override public boolean canShoot(TileEntityEmplacement te) { - return false; + return inventoryPlatformHandler==null||!isHandlerEmpty(inventoryPlatformHandler); + } + + @Override + public boolean needsSupply(TileEntityEmplacement te) + { + return inventoryPlatformHandler!=null&&isHandlerEmpty(inventoryPlatformHandler); + } + + @Override + public boolean needsRestock(TileEntityEmplacement te) + { + return inventoryBaseHandler!=null&&inventoryPlatformHandler!=null + &&isHandlerEmpty(inventoryPlatformHandler) + &&!isHandlerEmpty(inventoryBaseHandler); + } + + @Override + public boolean restockFromBase(TileEntityEmplacement te) + { + if(inventoryBaseHandler==null||inventoryPlatformHandler==null) + return false; + + boolean changed = false; + for(int baseSlot = 0; baseSlot < inventoryBaseHandler.getSlots(); baseSlot++) + { + ItemStack available = inventoryBaseHandler.getStackInSlot(baseSlot); + if(available.isEmpty()) + continue; + + ItemStack moving = available.copy(); + for(int platformSlot = 0; platformSlot < inventoryPlatformHandler.getSlots()&&!moving.isEmpty(); platformSlot++) + moving = inventoryPlatformHandler.insertItem(platformSlot, moving, false); + + int moved = available.getCount()-moving.getCount(); + if(moved > 0) + { + inventoryBaseHandler.extractItem(baseSlot, moved, false); + changed = true; + } + + if(!isHandlerEmpty(inventoryPlatformHandler)) + break; + } + return changed; + } + + protected boolean isHandlerEmpty(IEInventoryHandler handler) + { + for(int i = 0; i < handler.getSlots(); i++) + if(!handler.getStackInSlot(i).isEmpty()) + return false; + return true; } @Override diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponHeavyRailgun.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponHeavyRailgun.java index 8c96d1b70..2cd1c6eb9 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponHeavyRailgun.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponHeavyRailgun.java @@ -24,10 +24,7 @@ protected void onInit(TileEntityEmplacement te) super.onInit(te); this.visionAABB = this.visionAABB.grow(HeavyRailgun.detectionRadius); this.attackAABB = this.attackAABB.grow(HeavyRailgun.attackRadius); - - setupItemHandlers(te, 18, 6, - ItemIIRailgunOverride::isAmmo, - ItemIIRailgunOverride::isAmmo); + setupItemHandlers(te, 18, 6, ItemIIRailgunOverride::isAmmo, ItemIIRailgunOverride::isAmmo); this.aim.withAimSpeed(HeavyRailgun.yawRotateSpeed, HeavyRailgun.pitchRotateSpeed); } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponLightHowitzer.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponLightHowitzer.java index c3353157e..55ac4bef1 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponLightHowitzer.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponLightHowitzer.java @@ -18,10 +18,7 @@ protected void onInit(TileEntityEmplacement te) this.visionAABB = this.visionAABB.grow(Autocannon.detectionRadius); this.attackAABB = this.attackAABB.grow(Autocannon.attackRadius); - setupItemHandlers(te, 12, 6, - stack -> this.ammoFactory!=null&&this.ammoFactory.isValidAmmo(stack), - stack -> this.ammoFactory!=null&&this.ammoFactory.isValidAmmo(stack)); - + setupItemHandlers(te, 12, 6, this.ammoFactory::isValidAmmo, this.ammoFactory::isValidAmmo); this.aim.withAimSpeed(CPDS.yawRotateSpeed, CPDS.pitchRotateSpeed); this.ammoFactory.setUseArtilleryAngles(true); } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponMachinegun.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponMachinegun.java index ca6a387c0..27def73d6 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponMachinegun.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponMachinegun.java @@ -24,10 +24,7 @@ protected void onInit(TileEntityEmplacement te) this.visionAABB = this.visionAABB.grow(Machinegun.detectionRadius); this.attackAABB = this.attackAABB.grow(Machinegun.attackRadius); - setupItemHandlers(te, 20, 12, - stack -> this.ammoFactory!=null&&this.ammoFactory.isValidAmmo(stack), - stack -> this.ammoFactory!=null&&this.ammoFactory.isValidAmmo(stack)); - + setupItemHandlers(te, 20, 12, this.ammoFactory::isValidAmmo, this.ammoFactory::isValidAmmo); this.aim.withAimSpeed(Machinegun.yawRotateSpeed, Machinegun.pitchRotateSpeed) .withPitchLimit(-35, 65); } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponMortar.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponMortar.java index 758c6435a..8edbb6514 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponMortar.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponMortar.java @@ -18,10 +18,7 @@ protected void onInit(TileEntityEmplacement te) this.visionAABB = this.visionAABB.grow(Autocannon.detectionRadius); this.attackAABB = this.attackAABB.grow(Autocannon.attackRadius); - setupItemHandlers(te, 12, 6, - stack -> this.ammoFactory!=null&&this.ammoFactory.isValidAmmo(stack), - stack -> this.ammoFactory!=null&&this.ammoFactory.isValidAmmo(stack)); - + setupItemHandlers(te, 12, 6, this.ammoFactory::isValidAmmo, this.ammoFactory::isValidAmmo); this.aim.withAimSpeed(CPDS.yawRotateSpeed, CPDS.pitchRotateSpeed); this.ammoFactory.setUseArtilleryAngles(true); } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponRocketLauncher.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponRocketLauncher.java index 1bbcca7bf..638b6d3b9 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponRocketLauncher.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponRocketLauncher.java @@ -18,10 +18,7 @@ protected void onInit(TileEntityEmplacement te) this.visionAABB = this.visionAABB.grow(Autocannon.detectionRadius); this.attackAABB = this.attackAABB.grow(Autocannon.attackRadius); - setupItemHandlers(te, 12, 6, - stack -> this.ammoFactory!=null&&this.ammoFactory.isValidAmmo(stack), - stack -> this.ammoFactory!=null&&this.ammoFactory.isValidAmmo(stack)); - + setupItemHandlers(te, 12, 6, this.ammoFactory::isValidAmmo, this.ammoFactory::isValidAmmo); this.aim.withAimSpeed(CPDS.yawRotateSpeed, CPDS.pitchRotateSpeed); this.ammoFactory.setUseArtilleryAngles(true); } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerEmplacement.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerEmplacement.java index a0a87853e..718bdcc0e 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerEmplacement.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerEmplacement.java @@ -32,10 +32,14 @@ public static ContainerEmplacement getContainerForStoragePage(EntityPlayer playe if(tile.currentWeapon!=null) { + //Ensure initialization tile.currentWeapon.init(tile); - IEInventoryHandler platformHandler = tile.getPlatformItemHandler(); - IEInventoryHandler baseHandler = tile.getBaseItemHandler(); + //Get inventory handlers + IEInventoryHandler platformHandler = tile.currentWeapon.getPlatformItemHandler(); + IEInventoryHandler baseHandler = tile.currentWeapon.getBaseItemHandler(); + + //Add slots if(platformHandler!=null) container.slotsPlatformInventory = container.addSlotArray(8, 24, 0, platformHandler.getSlots(), 9, (container1, inv1, id, x, y) -> new SlotItemHandler(platformHandler, id, x, y) @@ -52,7 +56,6 @@ public boolean isItemValid(@Nonnull ItemStack stack) return false; } }); - if(baseHandler!=null) container.slotsBaseInventory = container.addSlotArray(8, 80+16, 0, baseHandler.getSlots(), 9, (container1, inv1, id, x, y) -> new SlotItemHandler(baseHandler, id, x, y)); diff --git a/src/main/resources/assets/immersiveintelligence/lang/en_us.lang b/src/main/resources/assets/immersiveintelligence/lang/en_us.lang index d8ae94f19..421984dc1 100644 --- a/src/main/resources/assets/immersiveintelligence/lang/en_us.lang +++ b/src/main/resources/assets/immersiveintelligence/lang/en_us.lang @@ -3319,6 +3319,19 @@ ii.gui.radar.targets=Targets ii.gui.emplacement.platform_inventory=Platform Inventory ii.gui.emplacement.base_inventory=Base Inventory +ii.gui.emplacement.no_weapon=No weapon installed. + +ii.gui.emplacement.config.reacts_redstone=React to Redstone +ii.gui.emplacement.config.reacts_redstone.tooltip=When enabled, the weapon surfaces only while the Emplacement receives redstone. +ii.gui.emplacement.config.reacts_data=React to Data +ii.gui.emplacement.config.reacts_data.tooltip=When disabled, the Emplacement will not react to data input. +ii.gui.emplacement.config.hide_health=Hide when health is below: +ii.gui.emplacement.config.hide_health.tooltip=Minimum weapon health percentage. Below this value, the platform hides for repairs. +ii.gui.emplacement.config.resurface_health=Repair until health reaches: +ii.gui.emplacement.config.resurface_health.tooltip=Weapon health percentage considered sufficient to surface again after repairs. + +ii.gui.emplacement.config.vision_range=Vision Range: %s b +ii.gui.emplacement.config.attack_range=Attack Range: %s b ii.gui.emplacement.weapon=Mounted: %s ii.gui.emplacement.weapon_none=None @@ -3332,10 +3345,6 @@ ii.gui.emplacement.selector_preset=Selector Preset ii.gui.emplacement.filter=Filter ii.gui.emplacement.task_enabled=Enabled ii.gui.emplacement.task_negation=Negation -ii.gui.emplacement.add=Add Task -ii.gui.emplacement.remove=Remove Task -ii.gui.emplacement.duplicate=Duplicate Task -ii.gui.emplacement.clear=Clear ALL Tasks (Caution!) ii.gui.emplacement.target.mobs=Mobs ii.gui.emplacement.target.animals=Animals From 72631a475c0bf47bc96eebd5ca554ac9153693d0 Mon Sep 17 00:00:00 2001 From: Pabilo8 Date: Wed, 3 Jun 2026 13:32:52 +0200 Subject: [PATCH 21/23] More Emplacement works --- .../api/ammo/utils/AmmoFactory.java | 18 +- .../emplacement/TileEntityEmplacement.java | 37 +-- .../task/EmplacementTargetManager.java | 216 +++++++++++++++++- .../emplacement/weapon/EmplacementWeapon.java | 30 +-- .../weapon/EmplacementWeaponAutocannon.java | 1 + .../weapon/EmplacementWeaponCPDS.java | 1 + ...mplacementWeaponGuidedMissileLauncher.java | 2 + .../weapon/EmplacementWeaponGunBase.java | 93 +++++++- .../weapon/EmplacementWeaponHeavyRailgun.java | 2 + .../EmplacementWeaponLightHowitzer.java | 2 + .../weapon/EmplacementWeaponMachinegun.java | 2 + .../weapon/EmplacementWeaponMortar.java | 2 + .../EmplacementWeaponRocketLauncher.java | 2 + .../weapon/EmplacementWeaponTurretBase.java | 41 +++- .../common/gui/ContainerEmplacement.java | 6 +- .../easynbt/TargetCoordinateReference.java | 98 +++++++- .../common/util/gun/GunAmmoProvider.java | 10 + .../common/util/gun/GunShootingHandler.java | 27 ++- .../GunAmmoProviderItemHandler.java | 159 +++++++++++++ .../ammoprovider/GunAmmoProviderMagazine.java | 11 +- .../immersiveintelligence/lang/en_us.lang | 19 +- 21 files changed, 684 insertions(+), 95 deletions(-) create mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/ammoprovider/GunAmmoProviderItemHandler.java diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/api/ammo/utils/AmmoFactory.java b/src/main/java/pl/pabilo8/immersiveintelligence/api/ammo/utils/AmmoFactory.java index 20e541e6d..c44ac8d9b 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/api/ammo/utils/AmmoFactory.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/api/ammo/utils/AmmoFactory.java @@ -116,7 +116,21 @@ public AmmoFactory(World world) public AmmoFactory setStack(ItemStack stack) { this.stack = stack; - this.ammo = this.stack.isEmpty()?null: ((IAmmoType)stack.getItem()); + this.ammo = this.ammo==null?((IAmmoType)stack.getItem()): this.ammo; + return this; + } + + /** + * Sets the ammo to create, used when the ammo type can't be determined directly from the stack, f.e. in turrets + * + * @param ammo The ammo to create + * @return The factory + */ + @SuppressWarnings("rawtypes") + public AmmoFactory setAmmo(@Nonnull IAmmoType ammo) + { + //noinspection unchecked + this.ammo = (IAmmoType)ammo; return this; } @@ -281,7 +295,7 @@ public E create() public E create(@Nullable Consumer action) { //Invalid ammo type - if(ammo==null) + if(ammo==null||stack==null||stack.isEmpty()) return null; //No position or direction passed diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/TileEntityEmplacement.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/TileEntityEmplacement.java index 88719908c..aac599871 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/TileEntityEmplacement.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/TileEntityEmplacement.java @@ -45,6 +45,7 @@ import pl.pabilo8.immersiveintelligence.common.entity.tactile.TactileManager.ITactileListener; import pl.pabilo8.immersiveintelligence.common.network.IIPacketHandler; import pl.pabilo8.immersiveintelligence.common.network.messages.MessageBooleanAnimatedPartsSync; +import pl.pabilo8.immersiveintelligence.common.util.IIMath; import pl.pabilo8.immersiveintelligence.common.util.diplomacy.DiplomacyHandler; import pl.pabilo8.immersiveintelligence.common.util.diplomacy.OwnerIdentity; import pl.pabilo8.immersiveintelligence.common.util.diplomacy.property.IOwnableProperty; @@ -73,6 +74,10 @@ public class TileEntityEmplacement extends TileEntityMultiblockIIGeneric implements IBooleanAnimatedPartsBlock, IManagedUpgradableDevice, IOwnableProperty, IStyleCustomizable, IIIGuiMultiblockTile, IManagedDamageResistantMultiblock, ITactileListener, ILightEventConsumer { + private static final int WEAPON_REPAIR_INTERVAL = 20; + private static final int WEAPON_REPAIR_ENERGY_COST = 80; + private static final float WEAPON_REPAIR_AMOUNT = 1.0f; + @SyncNBT(events = SyncEvents.TILE_OWNERSHIP_MODIFIED) public OwnerIdentity ownerIdentity; @SyncNBT(name = "upgrades", events = SyncEvents.TILE_UPGRADES_MODIFIED) @@ -91,16 +96,11 @@ public class TileEntityEmplacement extends TileEntityMultiblockIIGeneric e = IIDataHandlingUtils.optionalEntity('e', packet); - /*if(e.isPresent()) + if(e.isPresent()) { Entity entityByID = world.getEntityByID(e.get().entityID); if(entityByID!=null) - this.taskManager.addTask(new EmplacementFireMissionEntity(entityByID)); + this.taskManager.addEntityMission(entityByID, IIDataHandlingUtils.optionalInt('a', packet).orElse(1)); updateTileForEvent(SyncEvents.TILE_CUSTOM1); } else @@ -370,7 +375,7 @@ public void receiveData(DataPacket packet, int pos) int amount = IIDataHandlingUtils.optionalInt('a', packet).orElse(1); IIDataHandlingUtils.expectingVectorParam(packet, vec -> { //Block/Vector based - this.taskManager.addTask(new EmplacementFireMissionPosition(new BlockPos(vec).add(getPOIPos("weapon")), amount)); + this.taskManager.addPositionMission(new BlockPos(vec).add(getPOIPos("weapon")), amount); }, angle -> { //Yaw+Pitch based @@ -378,10 +383,10 @@ public void receiveData(DataPacket packet, int pos) double true_angle2 = Math.toRadians(angle.y); int distance = IIDataHandlingUtils.optionalInt('d', packet).orElse(40); - this.taskManager.addTask(new EmplacementFireMissionPosition(new BlockPos(IIMath.offsetPosDirection(distance, - true_angle, true_angle2)).add(getPOIPos("weapon")), amount)); + this.taskManager.addPositionMission(new BlockPos(IIMath.offsetPosDirection(distance, + true_angle, true_angle2)).add(getPOIPos("weapon")), amount); }); - }*/ + } //Synchronize the task updateTileForEvent(SyncEvents.TILE_CUSTOM1); break; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/task/EmplacementTargetManager.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/task/EmplacementTargetManager.java index c733a9b0b..fc04af1c5 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/task/EmplacementTargetManager.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/task/EmplacementTargetManager.java @@ -1,21 +1,83 @@ package pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement.task; +import net.minecraft.entity.Entity; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; import net.minecraftforge.common.util.INBTSerializable; +import pl.pabilo8.immersiveintelligence.common.util.ISerializableEnum; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.EasyCollection; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.EasyNBT; import pl.pabilo8.immersiveintelligence.common.util.easynbt.TargetCoordinateReference; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.Iterator; +import java.util.function.Supplier; + /** + * Stores emplacement requests. Fire Missions are requests, not jobs: they expire when the target is gone + * or when the finite shot counter reaches zero. + * * @author Pabilo8 (pabilo@iiteam.net) * @ii-approved 0.3.1 * @since 14.09.2025 */ -public class EmplacementTargetManager implements INBTSerializable +public class EmplacementTargetManager implements INBTSerializable, Cloneable { + private Supplier worldSupplier = () -> null; public boolean paused = false; + public EasyCollection fireMissions = new EasyCollection<>(() -> new EmplacementFireMission(worldSupplier)); + + public EmplacementTargetManager() + { + + } + + public EmplacementTargetManager(Supplier worldSupplier) + { + setWorldSupplier(worldSupplier); + } + + public EmplacementTargetManager setWorldSupplier(Supplier worldSupplier) + { + this.worldSupplier = worldSupplier==null?() -> null: worldSupplier; + for(EmplacementFireMission mission : fireMissions) + mission.setWorldSupplier(this.worldSupplier); + return this; + } + + public EasyCollection getFireMissions() + { + return fireMissions; + } + + public void addEntityMission(Entity entity, int shots) + { + EmplacementFireMission mission = new EmplacementFireMission(worldSupplier) + .withEntity(entity); + if(shots > 0) + mission.withShotLimit(shots); + fireMissions.add(mission); + } + + public void addPositionMission(BlockPos position, int shots) + { + EmplacementFireMission mission = new EmplacementFireMission(worldSupplier) + .withPosition(position); + if(shots > 0) + mission.withShotLimit(shots); + fireMissions.add(mission); + } public void skipTask(int taskID) { paused = false; + if(taskID > 0&&taskID < fireMissions.size()) + { + EmplacementFireMission mission = fireMissions.remove(taskID); + fireMissions.add(0, mission); + } } public void stopTask(boolean switchToDefault) @@ -28,20 +90,170 @@ public void resumeTask(boolean switchToDefault) paused = false; } + @Nullable public TargetCoordinateReference provideNextTask() { + if(paused) + return null; + + World world = worldSupplier.get(); + for(Iterator iterator = fireMissions.iterator(); iterator.hasNext(); ) + { + EmplacementFireMission mission = iterator.next(); + mission.setWorldSupplier(worldSupplier); + if(!mission.shouldRemain(world)) + { + iterator.remove(); + continue; + } + return mission.target; + } return null; } + public void pruneFinishedMissions() + { + World world = worldSupplier.get(); + fireMissions.removeIf(mission -> !mission.shouldRemain(world)); + } + @Override public NBTTagCompound serializeNBT() { - return new NBTTagCompound(); + return EasyNBT.newNBT() + .withBoolean("paused", paused) + .withSerializable("fire_missions", fireMissions) + .unwrap(); } @Override public void deserializeNBT(NBTTagCompound nbt) { + EasyNBT easyNBT = EasyNBT.wrapNBT(nbt); + this.paused = easyNBT.getBoolean("paused"); + this.fireMissions.deserializeNBT(easyNBT.getList("fire_missions", EasyNBT.TAG_COMPOUND)); + setWorldSupplier(worldSupplier); + } + + @Override + public EmplacementTargetManager clone() + { + EmplacementTargetManager manager = new EmplacementTargetManager(worldSupplier); + manager.deserializeNBT(this.serializeNBT()); + return manager; + } + + public static class EmplacementFireMission implements INBTSerializable + { + public FireMissionTargetType type = FireMissionTargetType.POSITION; + public String name = ""; + public TargetCoordinateReference target; + private Supplier worldSupplier; + + public EmplacementFireMission() + { + this(() -> null); + } + + public EmplacementFireMission(Supplier worldSupplier) + { + this.worldSupplier = worldSupplier==null?() -> null: worldSupplier; + this.target = new TargetCoordinateReference(this.worldSupplier) + .withPosition(BlockPos.ORIGIN) + .withShotLimit(1); + } + + public EmplacementFireMission setWorldSupplier(Supplier worldSupplier) + { + this.worldSupplier = worldSupplier==null?() -> null: worldSupplier; + this.target.withWorldSupplier(this.worldSupplier); + return this; + } + + public EmplacementFireMission withEntity(Entity entity) + { + this.type = FireMissionTargetType.ENTITY; + this.target.withEntity(entity); + return this; + } + + public EmplacementFireMission withEntityID(int entityID) + { + this.type = FireMissionTargetType.ENTITY; + this.target.withEntityID(entityID); + return this; + } + + public EmplacementFireMission withPosition(BlockPos position) + { + this.type = FireMissionTargetType.POSITION; + this.target.withPosition(position); + return this; + } + + public EmplacementFireMission withShotLimit(int shots) + { + this.target.withShotLimit(shots); + return this; + } + + public EmplacementFireMission withInfiniteShots() + { + this.target.withInfiniteShots(); + return this; + } + + public boolean isJob() + { + return false; + } + + public boolean shouldRemain(@Nullable World world) + { + return target.shouldBeExecuted(world); + } + + @Nonnull + public String getDisplayName() + { + if(name!=null&&!name.isEmpty()) + return name; + if(type==FireMissionTargetType.ENTITY) + return "Entity #"+target.getEntityID(); + BlockPos pos = target.getPosition(); + return pos==null?"Position": pos.getX()+", "+pos.getY()+", "+pos.getZ(); + } + + @Override + public NBTTagCompound serializeNBT() + { + return EasyNBT.newNBT() + .withEnum("type", type) + .withString("name", name==null?"": name) + .withSerializable("target", target) + .unwrap(); + } + + @Override + public void deserializeNBT(NBTTagCompound nbt) + { + EasyNBT easyNBT = EasyNBT.wrapNBT(nbt); + this.type = easyNBT.hasKey("type")?easyNBT.getEnum("type", FireMissionTargetType.class): FireMissionTargetType.POSITION; + this.name = easyNBT.getString("name"); + this.target = new TargetCoordinateReference(worldSupplier); + this.target.deserializeNBT(easyNBT.getCompound("target")); + } + } + + public enum FireMissionTargetType implements ISerializableEnum + { + POSITION, + ENTITY; + @Override + public String getName() + { + return name().toLowerCase(); + } } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeapon.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeapon.java index ad5f9b0ef..348299d61 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeapon.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeapon.java @@ -2,7 +2,6 @@ import blusunrize.immersiveengineering.common.util.IEDamageSources; import blusunrize.immersiveengineering.common.util.IEDamageSources.ElectricDamageSource; -import blusunrize.immersiveengineering.common.util.inventory.IEInventoryHandler; import com.elytradev.mirage.event.GatherLightsEvent; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; @@ -11,12 +10,12 @@ import net.minecraft.util.SoundCategory; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fml.common.Optional; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraftforge.items.IItemHandler; import pl.pabilo8.immersiveintelligence.api.data.DataPacket; import pl.pabilo8.immersiveintelligence.api.data.types.DataTypeNull; import pl.pabilo8.immersiveintelligence.api.data.types.generic.DataType; @@ -53,7 +52,7 @@ public abstract class EmplacementWeapon implements ITypeNBTSerializable protected void onInit(TileEntityEmplacement te) { this.initialized = true; - this.health = MathHelper.clamp(this.health, 0, getMaxHealth()); + this.health = getMaxHealth(); this.visionAABB = new AxisAlignedBB(new BlockPos(te.getWeaponCenter())); this.attackAABB = new AxisAlignedBB(new BlockPos(te.getWeaponCenter())); @@ -118,13 +117,13 @@ public DataType getDataCallback(String string) //--- Inventory ---// @Nullable - public IEInventoryHandler getBaseItemHandler() + public IItemHandler getBaseItemHandler() { return null; } @Nullable - public IEInventoryHandler getPlatformItemHandler() + public IItemHandler getPlatformItemHandler() { return null; } @@ -135,29 +134,19 @@ public IFluidHandler getBaseFluidHandler() return null; } - /** - * @return true when the weapon cannot operate because its ready stock is empty. + * @return true when this weapon cannot operate until the platform is lowered and serviced. */ public boolean needsSupply(TileEntityEmplacement te) { return false; } - /** - * @return true when the weapon should keep the platform hidden until it can restock its ready inventory. - */ public boolean needsRestock(TileEntityEmplacement te) { return false; } - /** - * Called by the Emplacement while the platform is fully hidden. - * Implementations should move supplies from base storage into weapon/platform storage. - * - * @return true if any stock was moved - */ public boolean restockFromBase(TileEntityEmplacement te) { return false; @@ -165,17 +154,12 @@ public boolean restockFromBase(TileEntityEmplacement te) public boolean isBelowHealthThreshold(float threshold) { - return getHealthPercentage() < threshold; + return getMaxHealth() > 0&&getHealth()/getMaxHealth() < threshold; } public boolean isRepairedTo(float threshold) { - return getHealthPercentage() >= threshold; - } - - public float getHealthPercentage() - { - return getMaxHealth() <= 0?1f: MathHelper.clamp(health/(float)getMaxHealth(), 0f, 1f); + return getMaxHealth() <= 0||getHealth()/getMaxHealth() >= threshold; } public boolean repair(float amount) diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponAutocannon.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponAutocannon.java index ecec15b64..11f4bb8cb 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponAutocannon.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponAutocannon.java @@ -18,6 +18,7 @@ public EmplacementWeaponAutocannon() protected void onInit(TileEntityEmplacement te) { super.onInit(te); + this.ammoFactory.setAmmo(IIContent.itemAmmoAutocannon); this.visionAABB = this.visionAABB.grow(Autocannon.detectionRadius); this.attackAABB = this.attackAABB.grow(Autocannon.attackRadius); this.aim.withAimSpeed(Autocannon.yawRotateSpeed, Autocannon.pitchRotateSpeed); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponCPDS.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponCPDS.java index d53022ba5..23dfd6a1b 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponCPDS.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponCPDS.java @@ -35,6 +35,7 @@ public EmplacementWeaponCPDS() protected void onInit(TileEntityEmplacement te) { super.onInit(te); + this.ammoFactory.setAmmo(IIContent.itemAmmoMachinegun); this.visionAABB = this.visionAABB.grow(CPDS.detectionRadius); this.attackAABB = this.attackAABB.grow(CPDS.attackRadius); setupItemHandlers(te, 8, 3, stack -> OreDictionary.itemMatches(stack, diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponGuidedMissileLauncher.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponGuidedMissileLauncher.java index 1edc30d11..8200847fc 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponGuidedMissileLauncher.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponGuidedMissileLauncher.java @@ -2,6 +2,7 @@ import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons.EmplacementWeapons.Autocannon; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons.EmplacementWeapons.CPDS; +import pl.pabilo8.immersiveintelligence.common.IIContent; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement.TileEntityEmplacement; import pl.pabilo8.immersiveintelligence.common.entity.ammo.types.EntityAmmoProjectile; @@ -15,6 +16,7 @@ public EmplacementWeaponGuidedMissileLauncher() protected void onInit(TileEntityEmplacement te) { super.onInit(te); + this.ammoFactory.setAmmo(IIContent.itemAmmoGuidedMissile); this.visionAABB = this.visionAABB.grow(Autocannon.detectionRadius); this.attackAABB = this.attackAABB.grow(Autocannon.attackRadius); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponGunBase.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponGunBase.java index 665a7b938..4c263fe54 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponGunBase.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponGunBase.java @@ -2,6 +2,7 @@ import blusunrize.immersiveengineering.common.util.inventory.IEInventoryHandler; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import pl.pabilo8.immersiveintelligence.api.ammo.utils.AmmoFactory; @@ -9,7 +10,11 @@ import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement.TileEntityEmplacement; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement.TileEntityEmplacement.EmplacementStateNeeds; import pl.pabilo8.immersiveintelligence.common.entity.ammo.EntityAmmoBase; +import pl.pabilo8.immersiveintelligence.common.entity.ammo.types.EntityAmmoProjectile; import pl.pabilo8.immersiveintelligence.common.util.easynbt.TargetCoordinateReference; +import pl.pabilo8.immersiveintelligence.common.util.gun.GunRecoil; +import pl.pabilo8.immersiveintelligence.common.util.gun.GunShootingHandler; +import pl.pabilo8.immersiveintelligence.common.util.gun.ammoprovider.GunAmmoProviderItemHandler; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -19,13 +24,13 @@ /** * @author Pabilo8 (pabilo@iiteam.net) * @ii-approved 0.3.1 - * @updated 30.12.2025 + * @updated 03.06.2026 * @since 04.09.2025 */ public abstract class EmplacementWeaponGunBase> extends EmplacementWeaponTurretBase { /** - * Used to fire ammo for the weapon + * Used to fire ammo for the weapon. */ protected AmmoFactory ammoFactory; @Nullable @@ -33,9 +38,14 @@ public abstract class EmplacementWeaponGunBase> exte @Nullable protected IEInventoryHandler inventoryPlatformHandler; + protected GunShootingHandler gunHandler = new GunShootingHandler(); + protected GunRecoil recoil = new GunRecoil(); + @Nullable + protected GunAmmoProviderItemHandler platformAmmoProvider; + /** - * Called after the weapon is installed or loaded from NBT - * Initialize sight AABB here + * Called after the weapon is installed or loaded from NBT. + * Initialize sight AABB here. */ protected void onInit(TileEntityEmplacement te) { @@ -54,9 +64,28 @@ public EmplacementStateNeeds onUpdate(TileEntityEmplacement te, EmplacementState { if(!te.getWorld().isRemote&&te.getOwnerIdentity()!=null) ammoFactory.setOwner(te.getOwnerIdentity().getFirstResponsibleMember(te.getWorld())); + + ensureShootingComponents(); + if(gunHandler!=null) + gunHandler.update(); + return super.onUpdate(te, baseNeeds, currentTarget); } + protected void ensureShootingComponents() + { + if(platformAmmoProvider==null&&inventoryPlatformHandler!=null) + { + platformAmmoProvider = new GunAmmoProviderItemHandler(null, () -> null, inventoryPlatformHandler, + ammoFactory::isValidAmmo, getReloadDelay()); + //noinspection unchecked + gunHandler.withAmmoProvider(platformAmmoProvider) + .withAmmoFactory((AmmoFactory)ammoFactory) + .withRecoilHandler(recoil) + .withMaxShotDelay(getShotDelay()); + } + } + @SideOnly(Side.CLIENT) @Override public void initializeGUI(DecoPanel panelBase, DecoPanel panelPlatform) @@ -64,17 +93,40 @@ public void initializeGUI(DecoPanel panelBase, DecoPanel panelPlatform) } - @Override public boolean canShoot(TileEntityEmplacement te) { - return inventoryPlatformHandler==null||!isHandlerEmpty(inventoryPlatformHandler); + ensureShootingComponents(); + return platformAmmoProvider!=null&&(platformAmmoProvider.isLoaded()||platformAmmoProvider.hasAvailableAmmo()); } + @Override + protected boolean shoot(TileEntityEmplacement te, TargetCoordinateReference target) + { + ensureShootingComponents(); + if(te.getWorld().isRemote||platformAmmoProvider==null||gunHandler==null) + return false; + + if(platformAmmoProvider.isEmpty()&&platformAmmoProvider.hasAvailableAmmo()) + gunHandler.startReloading(); + if(!platformAmmoProvider.isLoaded()) + return false; + + if(baseEntity!=null) + blusunrize.immersiveengineering.common.util.Utils.attractEnemies(baseEntity, 24); + + ammoFactory.setPositionAndVelocity(te.getWeaponCenter(), this.aim, 0.25f, 1f); + return gunHandler.fire(); + } + + /** + * The weapon should be brought down when the platform has no available shot. + */ @Override public boolean needsSupply(TileEntityEmplacement te) { - return inventoryPlatformHandler!=null&&isHandlerEmpty(inventoryPlatformHandler); + ensureShootingComponents(); + return platformAmmoProvider!=null&&!platformAmmoProvider.isLoaded()&&!platformAmmoProvider.hasAvailableAmmo(); } @Override @@ -127,9 +179,10 @@ protected boolean isHandlerEmpty(IEInventoryHandler handler) public void setDead() { super.setDead(); - this.ammoFactory - .setShooterAndGun(null, null) - .setIgnoredEntities(Collections.emptyList()); + if(this.ammoFactory!=null) + this.ammoFactory + .setShooterAndGun(null, null) + .setIgnoredEntities(Collections.emptyList()); } @Nullable @@ -173,6 +226,7 @@ protected final void setupItemHandlers(TileEntityEmplacement te, int baseSlots, new FilteredEmplacementInventoryHandler(baseSlots, te, 0, baseFilter): null; this.inventoryPlatformHandler = platformSlots > 0? new FilteredEmplacementInventoryHandler(platformSlots, te, baseSlots, platformFilter): null; + this.platformAmmoProvider = null; } /** @@ -210,4 +264,23 @@ public boolean accepts(ItemStack stack) return !stack.isEmpty()&&filter.test(stack); } } + + @Override + public NBTTagCompound serializeNBT() + { + NBTTagCompound nbt = super.serializeNBT(); + nbt.setTag("gunHandler", gunHandler.serializeNBT()); + nbt.setTag("recoil", recoil.serializeNBT()); + return nbt; + } + + @Override + public void deserializeNBT(NBTTagCompound nbt) + { + super.deserializeNBT(nbt); + if(nbt.hasKey("gunHandler")) + gunHandler.deserializeNBT((net.minecraft.nbt.NBTTagFloat)nbt.getTag("gunHandler")); + if(nbt.hasKey("recoil")) + recoil.deserializeNBT(nbt.getCompoundTag("recoil")); + } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponHeavyRailgun.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponHeavyRailgun.java index 2cd1c6eb9..44d5e5cf3 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponHeavyRailgun.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponHeavyRailgun.java @@ -1,6 +1,7 @@ package pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement.weapon; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons.EmplacementWeapons.HeavyRailgun; +import pl.pabilo8.immersiveintelligence.common.IIContent; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement.TileEntityEmplacement; import pl.pabilo8.immersiveintelligence.common.entity.ammo.types.EntityAmmoProjectile; import pl.pabilo8.immersiveintelligence.common.item.weapons.ItemIIRailgunOverride; @@ -22,6 +23,7 @@ public EmplacementWeaponHeavyRailgun() protected void onInit(TileEntityEmplacement te) { super.onInit(te); + this.ammoFactory.setAmmo(IIContent.itemRailgunGrenade); this.visionAABB = this.visionAABB.grow(HeavyRailgun.detectionRadius); this.attackAABB = this.attackAABB.grow(HeavyRailgun.attackRadius); setupItemHandlers(te, 18, 6, ItemIIRailgunOverride::isAmmo, ItemIIRailgunOverride::isAmmo); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponLightHowitzer.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponLightHowitzer.java index 55ac4bef1..1f22a66d8 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponLightHowitzer.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponLightHowitzer.java @@ -2,6 +2,7 @@ import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons.EmplacementWeapons.Autocannon; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons.EmplacementWeapons.CPDS; +import pl.pabilo8.immersiveintelligence.common.IIContent; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement.TileEntityEmplacement; import pl.pabilo8.immersiveintelligence.common.entity.ammo.types.EntityAmmoProjectile; @@ -15,6 +16,7 @@ public EmplacementWeaponLightHowitzer() protected void onInit(TileEntityEmplacement te) { super.onInit(te); + this.ammoFactory.setAmmo(IIContent.itemAmmoLightArtillery); this.visionAABB = this.visionAABB.grow(Autocannon.detectionRadius); this.attackAABB = this.attackAABB.grow(Autocannon.attackRadius); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponMachinegun.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponMachinegun.java index 27def73d6..eecc95e71 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponMachinegun.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponMachinegun.java @@ -1,6 +1,7 @@ package pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement.weapon; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons.EmplacementWeapons.Machinegun; +import pl.pabilo8.immersiveintelligence.common.IIContent; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement.TileEntityEmplacement; import pl.pabilo8.immersiveintelligence.common.entity.ammo.types.EntityAmmoProjectile; import pl.pabilo8.immersiveintelligence.common.util.multiblock.util.MultiblockInteractablePart; @@ -21,6 +22,7 @@ public EmplacementWeaponMachinegun() protected void onInit(TileEntityEmplacement te) { super.onInit(te); + this.ammoFactory.setAmmo(IIContent.itemAmmoMachinegun); this.visionAABB = this.visionAABB.grow(Machinegun.detectionRadius); this.attackAABB = this.attackAABB.grow(Machinegun.attackRadius); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponMortar.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponMortar.java index 8edbb6514..540f93c62 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponMortar.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponMortar.java @@ -2,6 +2,7 @@ import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons.EmplacementWeapons.Autocannon; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons.EmplacementWeapons.CPDS; +import pl.pabilo8.immersiveintelligence.common.IIContent; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement.TileEntityEmplacement; import pl.pabilo8.immersiveintelligence.common.entity.ammo.types.EntityAmmoProjectile; @@ -15,6 +16,7 @@ public EmplacementWeaponMortar() protected void onInit(TileEntityEmplacement te) { super.onInit(te); + this.ammoFactory.setAmmo(IIContent.itemAmmoMortar); this.visionAABB = this.visionAABB.grow(Autocannon.detectionRadius); this.attackAABB = this.attackAABB.grow(Autocannon.attackRadius); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponRocketLauncher.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponRocketLauncher.java index 638b6d3b9..1b8fc15f6 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponRocketLauncher.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponRocketLauncher.java @@ -2,6 +2,7 @@ import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons.EmplacementWeapons.Autocannon; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons.EmplacementWeapons.CPDS; +import pl.pabilo8.immersiveintelligence.common.IIContent; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement.TileEntityEmplacement; import pl.pabilo8.immersiveintelligence.common.entity.ammo.types.EntityAmmoProjectile; @@ -15,6 +16,7 @@ public EmplacementWeaponRocketLauncher() protected void onInit(TileEntityEmplacement te) { super.onInit(te); + this.ammoFactory.setAmmo(IIContent.itemAmmoRocketLight); this.visionAABB = this.visionAABB.grow(Autocannon.detectionRadius); this.attackAABB = this.attackAABB.grow(Autocannon.attackRadius); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponTurretBase.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponTurretBase.java index dcfdf46be..ef3f01488 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponTurretBase.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponTurretBase.java @@ -36,10 +36,22 @@ protected void onInit(TileEntityEmplacement te) @Override public EmplacementStateNeeds onUpdate(TileEntityEmplacement te, EmplacementStateNeeds baseNeeds, TargetCoordinateReference currentTarget) { + if(shootDelay > 0) + shootDelay--; + + if(currentTarget==null||!currentTarget.shouldBeExecuted(te.getWorld())) + { + if(this.setup!=null) + { + this.setup.setState(false); + this.setup.update(); + } + return super.onUpdate(te, baseNeeds, currentTarget); + } + Vec3d target = currentTarget.supplyCoordinates(); if(target!=null) - this.aim.setTarget(te.getWeaponCenter(), Vec3d.ZERO, - target, Vec3d.ZERO); + this.aim.setTarget(te.getWeaponCenter(), Vec3d.ZERO, target, getTargetMotion(currentTarget)); this.aim.update(); if(this.setup!=null) @@ -48,19 +60,36 @@ public EmplacementStateNeeds onUpdate(TileEntityEmplacement te, EmplacementState this.setup.update(); } - return super.onUpdate(te, baseNeeds, currentTarget); + if(isReadyToShoot(te)&&shoot(te, currentTarget)) + currentTarget.notifyAfterShot(); + + return EmplacementStateNeeds.WANTS_SURFACE; + } + + protected Vec3d getTargetMotion(TargetCoordinateReference target) + { + if(target.getEntity()!=null) + return new Vec3d(target.getEntity().motionX, target.getEntity().motionY, target.getEntity().motionZ); + return Vec3d.ZERO; + } + + protected boolean isReadyToShoot(TileEntityEmplacement te) + { + return shootDelay <= 0&&te.door.isFullyOpened()&&(setup==null||setup.isFullyOpened())&&aim.isAimed(1.5f)&&canShoot(te); } public abstract boolean canShoot(TileEntityEmplacement te); /** - * Used for shooting action + * Used for shooting action. Base turret logic only handles attract/noise bookkeeping; + * concrete weapons should return true only after actually spawning a projectile/effect. */ - public void shoot(TileEntityEmplacement te) + protected boolean shoot(TileEntityEmplacement te, TargetCoordinateReference target) { if(baseEntity!=null) Utils.attractEnemies(baseEntity, 24); this.shootDelay = getShotDelay(); + return false; } public boolean requiresZeroingBeforeReload() @@ -79,6 +108,7 @@ public NBTTagCompound serializeNBT() nbt.setTag("aim", aim.serializeNBT()); if(setup!=null) nbt.setTag("setup", setup.serializeNBT()); + nbt.setInteger("shootDelay", shootDelay); return nbt; } @@ -89,5 +119,6 @@ public void deserializeNBT(NBTTagCompound nbt) aim.deserializeNBT(nbt.getCompoundTag("aim")); if(setup!=null) setup.deserializeNBT(nbt.getCompoundTag("setup")); + shootDelay = nbt.getInteger("shootDelay"); } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerEmplacement.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerEmplacement.java index 718bdcc0e..9b67ddd5f 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerEmplacement.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerEmplacement.java @@ -1,9 +1,9 @@ package pl.pabilo8.immersiveintelligence.common.gui; -import blusunrize.immersiveengineering.common.util.inventory.IEInventoryHandler; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; +import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.SlotItemHandler; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.emplacement.TileEntityEmplacement; import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; @@ -36,8 +36,8 @@ public static ContainerEmplacement getContainerForStoragePage(EntityPlayer playe tile.currentWeapon.init(tile); //Get inventory handlers - IEInventoryHandler platformHandler = tile.currentWeapon.getPlatformItemHandler(); - IEInventoryHandler baseHandler = tile.currentWeapon.getBaseItemHandler(); + IItemHandler platformHandler = tile.currentWeapon.getPlatformItemHandler(); + IItemHandler baseHandler = tile.currentWeapon.getBaseItemHandler(); //Add slots if(platformHandler!=null) diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/easynbt/TargetCoordinateReference.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/easynbt/TargetCoordinateReference.java index 6abbae5a7..7be9af58b 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/easynbt/TargetCoordinateReference.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/easynbt/TargetCoordinateReference.java @@ -12,6 +12,9 @@ import java.util.function.Supplier; /** + * Reference to either an entity or a block position target. + * Also stores optional shot limits for request-style fire missions. + * * @author Pabilo8 (pabilo@iiteam.net) * @ii-approved 0.3.1 * @since 22.02.2026 @@ -21,16 +24,24 @@ public class TargetCoordinateReference implements INBTSerializable entityReference; + private Supplier worldSupplier; private boolean shotsAreFinite = false; private int shotsRemaining = 0; public TargetCoordinateReference(Supplier worldSupplier) { + this.worldSupplier = worldSupplier; this.position = null; this.entityReference = new EntityReference<>(worldSupplier); } + public TargetCoordinateReference withWorldSupplier(Supplier worldSupplier) + { + this.worldSupplier = worldSupplier; + return this; + } + public TargetCoordinateReference withEntity(Entity entity) { this.position = null; @@ -38,6 +49,13 @@ public TargetCoordinateReference withEntity(Entity entity) return this; } + public TargetCoordinateReference withEntityID(int entityID) + { + this.position = null; + this.entityReference.deserializeNBT(new NBTTagInt(entityID)); + return this; + } + public TargetCoordinateReference withPosition(BlockPos position) { this.position = position; @@ -48,7 +66,14 @@ public TargetCoordinateReference withPosition(BlockPos position) public TargetCoordinateReference withShotLimit(int shotsRemaining) { this.shotsAreFinite = true; - this.shotsRemaining = shotsRemaining; + this.shotsRemaining = Math.max(0, shotsRemaining); + return this; + } + + public TargetCoordinateReference withInfiniteShots() + { + this.shotsAreFinite = false; + this.shotsRemaining = 0; return this; } @@ -57,7 +82,30 @@ public TargetCoordinateReference withShotLimit(int shotsRemaining) */ public boolean shouldBeExecuted() { - return !shotsAreFinite||shotsRemaining > 0; + return shouldBeExecuted(worldSupplier==null?null: worldSupplier.get()); + } + + /** + * @return whether the task should be executed or removed from memory + */ + public boolean shouldBeExecuted(@Nullable World world) + { + if(shotsAreFinite&&shotsRemaining <= 0) + return false; + + Entity entity = this.entityReference.get(); + if(entity!=null) + return !entity.isDead; + + if(position!=null) + { + //Unloaded chunks are inconclusive, not a completed mission. + if(world==null||!world.isBlockLoaded(position)) + return true; + return !world.isAirBlock(position); + } + + return false; } @Nullable @@ -65,24 +113,54 @@ public Vec3d supplyCoordinates() { Entity entity = this.entityReference.get(); if(entity!=null) - return new Vec3d(entity.posX, entity.posY, entity.posZ); - return position!=null?new Vec3d(position): null; + return new Vec3d(entity.posX, entity.posY+entity.height*0.5, entity.posZ); + return position!=null?new Vec3d(position).addVector(0.5, 0.5, 0.5): null; + } + + @Nullable + public Entity getEntity() + { + return entityReference.get(); + } + + public int getEntityID() + { + return entityReference.serializeNBT().getInt(); + } + + @Nullable + public BlockPos getPosition() + { + return position; + } + + public boolean hasFiniteShots() + { + return shotsAreFinite; + } + + public int getShotsRemaining() + { + return shotsRemaining; } /** - * Called by the weapon after a shot has been made to lower the counter + * Called by the weapon after a shot has been made to lower the counter. */ public void notifyAfterShot() { - if(shotsAreFinite) + if(shotsAreFinite&&shotsRemaining > 0) shotsRemaining--; } @Override public NBTTagCompound serializeNBT() { - EasyNBT nbt = EasyNBT.newNBT(); - if(entityReference.get()!=null) + EasyNBT nbt = EasyNBT.newNBT() + .withBoolean("shotsAreFinite", shotsAreFinite) + .withInt("shotsRemaining", shotsRemaining); + + if(entityReference.get()!=null||getEntityID()!=0) nbt.withSerializable("entity", entityReference); else if(position!=null) nbt.withPos("pos", position); @@ -93,10 +171,14 @@ else if(position!=null) public void deserializeNBT(NBTTagCompound nbt) { EasyNBT enbt = EasyNBT.wrapNBT(nbt); + this.shotsAreFinite = enbt.getBoolean("shotsAreFinite"); + this.shotsRemaining = enbt.getInt("shotsRemaining"); + if(nbt.hasKey("entity")) entityReference.deserializeNBT((NBTTagInt)nbt.getTag("entity")); else entityReference.set(null); + position = null; if(enbt.hasKey("pos")) position = enbt.getPos("pos"); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunAmmoProvider.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunAmmoProvider.java index da44f697d..f38cb7149 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunAmmoProvider.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunAmmoProvider.java @@ -165,6 +165,16 @@ public boolean isReloading() return loadingState==GunLoadingState.LOAD||loadingState==GunLoadingState.UNLOAD; } + public boolean isLoaded() + { + return loadingState==GunLoadingState.LOADED; + } + + public boolean isEmpty() + { + return loadingState==GunLoadingState.EMPTY; + } + public float getLoadingProgress(float partialTicks) { switch(loadingState) diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunShootingHandler.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunShootingHandler.java index 9cd5c1734..5f1244a8d 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunShootingHandler.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/GunShootingHandler.java @@ -47,43 +47,50 @@ public void update() this.ammoProvider.update(); } - public void fire() + public boolean fire() { //Check basic conditions if(!canShoot()||ammoProvider==null||ammoFactory==null) - return; + return false; World world = ammoFactory.getWorld(); //Cannot fire when the provider is still reloading if(ammoProvider.isReloading()) - return; + return false; //Load ammo from provider ItemStack firedStack = ammoProvider.provideAmmo(); + boolean fired = false; if(!world.isRemote) { if(!firedStack.isEmpty()) { ammoFactory.setStack(firedStack); EntityAmmoProjectile projectile = ammoFactory.create(); - if(projectile!=null&&sound!=null) + fired = projectile!=null; + if(fired&&sound!=null) IIPacketHandler.sendToAllClients(new MessagePlayIISound(sound, SoundCategory.BLOCKS, shootSoundRange, ammoFactory.getPos(), 1f, 1f)); } - else + else if(soundDryFire!=null) world.playSound(null, new BlockPos(ammoFactory.getPos()), soundDryFire, SoundCategory.BLOCKS, 1f, 1f); - } + else + fired = !firedStack.isEmpty(); + + if(!fired) + return false; + //Reset shot delay this.shotDelay = maxShotDelay; //Add recoil and gun overheat - if(recoil!=null&&!firedStack.isEmpty()) + if(recoil!=null) recoil.addRecoil(); + return true; } - public void startReloading() + public boolean startReloading() { - if(ammoProvider!=null) - ammoProvider.startReloading(); + return ammoProvider!=null&&ammoProvider.startReloading(); } //--- With ---// diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/ammoprovider/GunAmmoProviderItemHandler.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/ammoprovider/GunAmmoProviderItemHandler.java new file mode 100644 index 000000000..ec8252d88 --- /dev/null +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/ammoprovider/GunAmmoProviderItemHandler.java @@ -0,0 +1,159 @@ +package pl.pabilo8.immersiveintelligence.common.util.gun.ammoprovider; + +import net.minecraft.entity.Entity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.NonNullList; +import net.minecraftforge.items.IItemHandlerModifiable; +import pl.pabilo8.immersiveintelligence.common.IIContent; +import pl.pabilo8.immersiveintelligence.common.item.ammo.ItemIIBulletMagazine.Magazines; +import pl.pabilo8.immersiveintelligence.common.util.gun.GunAmmoProvider; + +import javax.annotation.Nonnull; +import java.util.function.Predicate; +import java.util.function.Supplier; + +/** + * Ammunition provider that consumes bullets from an item handler instead of a player's inventory. + * Intended for emplacement platform inventories. It supports both direct bullet stacks and II bullet magazines. + * + * @author Pabilo8 (pabilo@iiteam.net) + * @ii-approved 0.3.1 + * @since 03.06.2026 + */ +public class GunAmmoProviderItemHandler extends GunAmmoProvider +{ + private final IItemHandlerModifiable inventory; + private final Predicate acceptedAmmo; + + public GunAmmoProviderItemHandler(Entity gun, Supplier operatorSupplier, IItemHandlerModifiable inventory, + Predicate acceptedAmmo, float loadTime) + { + super(gun, operatorSupplier); + this.inventory = inventory; + this.acceptedAmmo = acceptedAmmo==null?stack -> true: acceptedAmmo; + this.maxReload = loadTime; + } + + @Override + protected void onLoadFinished() + { + //No internal cache. The platform inventory itself is the loaded source. + } + + @Override + protected void onUnloadFinished() + { + //No unload behaviour: the ammo remains in the platform inventory. + } + + @Override + protected boolean canFindAmmo() + { + return hasAvailableAmmo(); + } + + public boolean hasAvailableAmmo() + { + return findDirectAmmoSlot() >= 0||findMagazineAmmoSlot() >= 0; + } + + @Nonnull + @Override + protected ItemStack provideNextBullet() + { + int magazineSlot = findMagazineAmmoSlot(); + if(magazineSlot >= 0) + { + ItemStack magazine = inventory.getStackInSlot(magazineSlot).copy(); + NonNullList bullets = IIContent.itemBulletMagazine.readInventory(magazine); + + for(int i = 0; i < bullets.size(); i++) + { + ItemStack bullet = bullets.get(i); + if(!bullet.isEmpty()&&acceptedAmmo.test(bullet)) + { + ItemStack provided = bullet.copy(); + provided.setCount(1); + + bullet.shrink(1); + if(bullet.getCount() <= 0) + bullets.set(i, ItemStack.EMPTY); + + IIContent.itemBulletMagazine.writeInventory(magazine, bullets); + inventory.setStackInSlot(magazineSlot, + IIContent.itemBulletMagazine.hasNoBullets(magazine)?ItemStack.EMPTY: magazine); + + if(!hasAvailableAmmo()) + loadingState = GunLoadingState.EMPTY; + return provided; + } + } + } + + int directSlot = findDirectAmmoSlot(); + if(directSlot >= 0) + { + ItemStack provided = inventory.extractItem(directSlot, 1, false); + if(!hasAvailableAmmo()) + loadingState = GunLoadingState.EMPTY; + return provided; + } + + loadingState = GunLoadingState.EMPTY; + return ItemStack.EMPTY; + } + + @Nonnull + @Override + public NonNullList getAmmoList() + { + NonNullList list = NonNullList.create(); + for(int i = 0; i < inventory.getSlots(); i++) + { + ItemStack stack = inventory.getStackInSlot(i); + if(stack.isEmpty()) + continue; + if(isMagazineWithAmmo(stack)||acceptedAmmo.test(stack)) + list.add(stack.copy()); + } + return list; + } + + private int findDirectAmmoSlot() + { + for(int i = 0; i < inventory.getSlots(); i++) + { + ItemStack stack = inventory.getStackInSlot(i); + if(!stack.isEmpty()&&acceptedAmmo.test(stack)) + return i; + } + return -1; + } + + private int findMagazineAmmoSlot() + { + for(int i = 0; i < inventory.getSlots(); i++) + { + ItemStack stack = inventory.getStackInSlot(i); + if(isMagazineWithAmmo(stack)) + return i; + } + return -1; + } + + private boolean isMagazineWithAmmo(ItemStack stack) + { + if(stack.isEmpty()||stack.getItem()!=IIContent.itemBulletMagazine) + return false; + + Magazines type = IIContent.itemBulletMagazine.stackToSub(stack); + if(type==null) + return false; + + NonNullList bullets = IIContent.itemBulletMagazine.readInventory(stack); + for(ItemStack bullet : bullets) + if(!bullet.isEmpty()&&acceptedAmmo.test(bullet)) + return true; + return false; + } +} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/ammoprovider/GunAmmoProviderMagazine.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/ammoprovider/GunAmmoProviderMagazine.java index 68532f10c..22a1efced 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/ammoprovider/GunAmmoProviderMagazine.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/ammoprovider/GunAmmoProviderMagazine.java @@ -46,7 +46,7 @@ public GunAmmoProviderMagazine(Entity gun, Supplier operatorSupplier, Ma */ private void rebuildMagazineFromBullets() { - if(isEmpty()) + if(getBulletCount()==0) { magazineStack = ItemStack.EMPTY; return; @@ -96,7 +96,7 @@ protected void onLoadFinished() @Override protected void onUnloadFinished() { - if(!isEmpty()) + if(getBulletCount() > 0) { //Drop or give the magazine stack (which reflects the current bullets) giveOrDrop(magazineStack); @@ -109,7 +109,7 @@ protected void onUnloadFinished() @Override protected ItemStack provideNextBullet() { - if(isEmpty()) + if(getBulletCount()==0) return ItemStack.EMPTY; //Find the first non‑empty bullet @@ -188,11 +188,6 @@ private void clear() Collections.fill(bullets, ItemStack.EMPTY); } - private boolean isEmpty() - { - return getBulletCount()==0; - } - private int getBulletCount() { int count = 0; diff --git a/src/main/resources/assets/immersiveintelligence/lang/en_us.lang b/src/main/resources/assets/immersiveintelligence/lang/en_us.lang index 421984dc1..b7f64c7cd 100644 --- a/src/main/resources/assets/immersiveintelligence/lang/en_us.lang +++ b/src/main/resources/assets/immersiveintelligence/lang/en_us.lang @@ -3333,14 +3333,17 @@ ii.gui.emplacement.config.resurface_health.tooltip=Weapon health percentage cons ii.gui.emplacement.config.vision_range=Vision Range: %s b ii.gui.emplacement.config.attack_range=Attack Range: %s b -ii.gui.emplacement.weapon=Mounted: %s -ii.gui.emplacement.weapon_none=None -ii.gui.emplacement.upgrades=Installed Upgrades -ii.gui.emplacement.settings=Settings -ii.gui.emplacement.redstone_control=Redstone Controlled -ii.gui.emplacement.data_control=Data Controlled -ii.gui.emplacement.send_attack_signal=Output target(s) trough data -ii.gui.emplacement.auto_repair_threshold=Repair when health is below: +ii.gui.emplacement.fire_missions.editor=Fire Mission +ii.gui.emplacement.fire_missions.type=Type +ii.gui.emplacement.fire_missions.type.position=Position +ii.gui.emplacement.fire_missions.type.entity=Entity +ii.gui.emplacement.fire_missions.position=Target Position +ii.gui.emplacement.fire_missions.entity_id=Entity ID +ii.gui.emplacement.fire_missions.finite_shots=Limit Shots +ii.gui.emplacement.fire_missions.shots=Shots +ii.gui.emplacement.fire_missions.shots_left=%s shots +ii.gui.emplacement.fire_missions.until_done=until done + ii.gui.emplacement.selector_preset=Selector Preset ii.gui.emplacement.filter=Filter ii.gui.emplacement.task_enabled=Enabled From f3e7e84a5362201b374d5565f45220c0411aa1cb Mon Sep 17 00:00:00 2001 From: Pabilo8 Date: Wed, 3 Jun 2026 13:42:33 +0200 Subject: [PATCH 22/23] Bumped up version, added more miscellaneous client-server sync fixes (thanks Trej) --- .github/ISSUE_TEMPLATE/bug_report.yml | 1 + gradle.properties | 2 +- .../GuiAmmunitionAssembler.java | 2 +- .../block/flagpole/GuiFlagpoleFaction.java | 56 ++++++++++--------- .../entity/vehicle/FieldFlakRenderer.java | 4 +- .../entity/weapon/MachinegunRenderer.java | 3 + .../render/item/MineDetectorRenderer.java | 10 ++-- .../factory/AmmoComponentShrapnel.java | 2 +- .../simple/BlockIIAdvancedExplosives.java | 5 +- .../common/entity/ammo/EntityAmmoBase.java | 26 ++++++++- .../entity/ammo/component/EntityShrapnel.java | 5 +- .../ammo/component/EntityWhitePhosphorus.java | 26 ++++++++- .../types/EntityAmmoArtilleryProjectile.java | 2 + .../entity/ammo/types/EntityAmmoGrenade.java | 3 + .../ammo/types/EntityAmmoProjectile.java | 5 +- .../mounted_weapon/EntityMachinegun.java | 2 + .../vehicle/towable/gun/EntityFieldFlak.java | 15 +++-- .../towable/gun/EntityFieldHowitzer.java | 20 ++++--- .../common/util/easynbt/EasyNBT.java | 8 ++- .../ammoprovider/GunAmmoProviderMagazine.java | 3 +- .../common/util/raytracer/FactoryTracer.java | 2 +- 21 files changed, 139 insertions(+), 63 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 1db6be7ea..5f2612681 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -120,6 +120,7 @@ body: description: Select Immersive Intelligence version. options: - 0.3.1 + - 0.3.1-dev4 - 0.3.1-dev3-test1 - 0.3.1-dev2 - 0.3.1-dev1 diff --git a/gradle.properties b/gradle.properties index a03e347ea..9b69a0c16 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,7 +15,7 @@ mcmod_Contributors=Pabilo8,Carver,Sch modForge=1.12.2-14.23.5.2847 modMappings=snapshot_20171003 #Project Data -modVersion=0.3.1-dev3-test1 +modVersion=0.3.1-dev4 modGroup=pl.pabilo8 modName=immersiveintelligence # Private Team II Maven diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/ammunition_production/GuiAmmunitionAssembler.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/ammunition_production/GuiAmmunitionAssembler.java index 2994ca83b..b9e5c88bc 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/ammunition_production/GuiAmmunitionAssembler.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/ammunition_production/GuiAmmunitionAssembler.java @@ -107,7 +107,7 @@ public void onInit() //Contact fuse has no config value if(this.fuseType==FuseType.CONTACT) textField.withText(newValue = "0"); - this.fuseConfig = Integer.parseInt(newValue); + this.fuseConfig = newValue.isEmpty()?0: Integer.parseInt(newValue); }), new DecoDropdown(4, 2) .withEntries(FuseType.values()) diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/flagpole/GuiFlagpoleFaction.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/flagpole/GuiFlagpoleFaction.java index 91fc6ebd4..ed0d734d7 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/flagpole/GuiFlagpoleFaction.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/flagpole/GuiFlagpoleFaction.java @@ -202,32 +202,36 @@ protected boolean initialize() .withTitleLabel("Permissions", DecoAlignment.TOP) ); - panelPerms.addLabel("Role:", 4, 8+2-1) - .withSize(panelPerms.width-72-2, 14) - .withAlign(DecoAlignment.LEFT); - panelPerms.addComponents( - new DecoDropdown(panelPerms.width-72, 8+2-2) - .withSize(72-4, 14) - .withEntries(identity.getAvailableRoles().values()) - .withDisplayFunction(DecoElementDisplays.getSimpleTextDisplay(PermissionRole::getDisplayName)) - .withSelectedEntry(selectedRole = identity.getRoleOf(playerContainer.player.getUniqueID())) - .withOnSelectedEntry((oldRole, newRole) -> selectedRole = newRole), - new DecoList(2, 12+8+2+1) - .withSize(panelPerms.width-4-2, panelPerms.height-32+8-2) - .withEntries(PermissionCategory.values()) - .withDisplayFunction(new DecoEntryPanelBuilder() - .withHeight(18) - .withComponent("toggle", p -> new DecoSwitch(2, 2) - .withOnToggle(change -> IIPacketHandler.sendToServer(MessageDiplomacyAction.changePermission(selectedRole, - p.getCurrentElement(), change))) - ) - .withElementApplyMethod((permission, panel) -> { - panel.component("toggle", DecoSwitch.class) - .withCurrentState(selectedRole.isAllowed(permission)) - .withText(permission.getFullLocaleKey()); - }) - ) - ); + selectedRole = identity.getRoleOf(playerContainer.player.getUniqueID()); + if(selectedRole!=null) + { + panelPerms.addLabel("Role:", 4, 8+2-1) + .withSize(panelPerms.width-72-2, 14) + .withAlign(DecoAlignment.LEFT); + panelPerms.addComponents( + new DecoDropdown(panelPerms.width-72, 8+2-2) + .withSize(72-4, 14) + .withEntries(identity.getAvailableRoles().values()) + .withDisplayFunction(DecoElementDisplays.getSimpleTextDisplay(PermissionRole::getDisplayName)) + .withSelectedEntry(selectedRole) + .withOnSelectedEntry((oldRole, newRole) -> selectedRole = newRole), + new DecoList(2, 12+8+2+1) + .withSize(panelPerms.width-4-2, panelPerms.height-32+8-2) + .withEntries(PermissionCategory.values()) + .withDisplayFunction(new DecoEntryPanelBuilder() + .withHeight(18) + .withComponent("toggle", p -> new DecoSwitch(2, 2) + .withOnToggle(change -> IIPacketHandler.sendToServer(MessageDiplomacyAction.changePermission(selectedRole, + p.getCurrentElement(), change))) + ) + .withElementApplyMethod((permission, panel) -> { + panel.component("toggle", DecoSwitch.class) + .withCurrentState(selectedRole.isAllowed(permission)) + .withText(permission.getFullLocaleKey()); + }) + ) + ); + } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/vehicle/FieldFlakRenderer.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/vehicle/FieldFlakRenderer.java index 5e362f448..9e803b45f 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/vehicle/FieldFlakRenderer.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/vehicle/FieldFlakRenderer.java @@ -121,10 +121,10 @@ public boolean handleBipedRotations(ModelBiped model, EntityFieldFlak entity, En switch(seat.info.getSeatID()) { case "gunner": - bipedGunner.get().applyAnimationStateTo(model); + //bipedGunner.get().applyAnimationStateTo(model); return true; case "commander": - bipedCommander.get().applyAnimationStateTo(model); + //bipedCommander.get().applyAnimationStateTo(model); return true; default: return false; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/weapon/MachinegunRenderer.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/weapon/MachinegunRenderer.java index c0ddf3259..d79591032 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/weapon/MachinegunRenderer.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/entity/weapon/MachinegunRenderer.java @@ -98,6 +98,9 @@ public static void renderMachinegun(ItemStack stack, @Nullable EntityMachinegun { float yaw = entity.aim.getYaw(partialTicks)-entity.aim.getCenterYaw(), pitch = entity.aim.getPitch(partialTicks); boolean tripod = entity.upgrades.contains(WeaponUpgrade.TRIPOD); + if(tripod) + GlStateManager.translate(0f, 0.5, 0f); + GlStateManager.translate(0f, -0.34375, 0f); float setup = AMTUtils.getAnimationProgress(entity.setupTime, entity.maxSetupTime, true, partialTicks); GlStateManager.rotate(-25f*setup, 1, 0, 0); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/item/MineDetectorRenderer.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/item/MineDetectorRenderer.java index a7fef8c4a..0531c037f 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/item/MineDetectorRenderer.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/item/MineDetectorRenderer.java @@ -75,15 +75,15 @@ public float renderBase(EntityLivingBase player, float distance, boolean flipY) v *= 1.125f; } - //v=distance; - //v=distance-(((player.world.getTotalWorldTime()%100)/100f)*distance); + v = distance; + v = distance-(((player.world.getTotalWorldTime()%100)/100f)*distance); - //GlStateManager.rotate(player.cameraPitch,1,0,0); + GlStateManager.rotate(player.cameraPitch, 1, 0, 0); GlStateManager.translate(0, 1, -v); GlStateManager.rotate(90, 0, 1, 0); GlStateManager.scale(-1, -1, 1); - //GlStateManager.rotate(player.rotationYawHead,0,1,0); - //GlStateManager.rotate(180,0,1,0); + GlStateManager.rotate(player.rotationYawHead, 0, 1, 0); + GlStateManager.rotate(180, 0, 1, 0); for(ModelRendererTurbo mod : model.baseModel) mod.render(); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/ammo/components/factory/AmmoComponentShrapnel.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/ammo/components/factory/AmmoComponentShrapnel.java index 07f2514a5..8ea4e3b7f 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/ammo/components/factory/AmmoComponentShrapnel.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/ammo/components/factory/AmmoComponentShrapnel.java @@ -50,7 +50,7 @@ public void onEffect(World world, Vec3d pos, Vec3d dir, ComponentEffectShape sha { Vec3d v = new Vec3d(0, -1, 0); Vec3d throwerPos = pos.addVector(0, 3, 0); - for(int i = 0; i < 50*multiplier; i++) + for(int i = 0; i < 20*size; i++) { Vec3d vecDir = v.addVector(Utils.RAND.nextGaussian()*.25f, Utils.RAND.nextGaussian()*.25f, Utils.RAND.nextGaussian()*.25f); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/simple/BlockIIAdvancedExplosives.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/simple/BlockIIAdvancedExplosives.java index 31f6ec293..165bb60f6 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/simple/BlockIIAdvancedExplosives.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/simple/BlockIIAdvancedExplosives.java @@ -16,8 +16,6 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; - -import java.util.Random; import pl.pabilo8.immersiveintelligence.api.ammo.enums.ComponentEffectShape; import pl.pabilo8.immersiveintelligence.api.ammo.parts.AmmoComponent; import pl.pabilo8.immersiveintelligence.common.IIContent; @@ -29,6 +27,7 @@ import pl.pabilo8.immersiveintelligence.common.util.item.IICategory; import javax.annotation.Nullable; +import java.util.Random; /** * @author Pabilo8 (pabilo@iiteam.net) @@ -153,7 +152,7 @@ public void explode(World world, BlockPos pos, IBlockState state, @Nullable Enti default: return; //Nie wolno, nie można, nie potrzeba nam tego } - component.onEffect(world, new Vec3d(pos), Vec3d.ZERO, ComponentEffectShape.ORB, new NBTTagCompound(), 1.0f, 1.0f, igniter); + component.onEffect(world, new Vec3d(pos), new Vec3d(0, -1, 0), ComponentEffectShape.ORB, new NBTTagCompound(), 1.0f, 1.0f, igniter); } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/EntityAmmoBase.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/EntityAmmoBase.java index 207a67f3c..1f693a22e 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/EntityAmmoBase.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/EntityAmmoBase.java @@ -3,6 +3,7 @@ import com.elytradev.mirage.event.GatherLightsEvent; import com.elytradev.mirage.lighting.IEntityLightEventConsumer; import com.elytradev.mirage.lighting.Light; +import io.netty.buffer.ByteBuf; import net.minecraft.entity.Entity; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -11,6 +12,7 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import net.minecraftforge.fml.common.Optional; +import net.minecraftforge.fml.common.network.ByteBufUtils; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import pl.pabilo8.immersiveintelligence.api.ammo.AmmoRegistry; @@ -78,12 +80,12 @@ public abstract class EntityAmmoBase> extend * Axis alligned bounding box of the bullet, because fuck minecraft's bloody AABB (de)sync wankfest. */ protected AxisAlignedBB aabb; + protected boolean clientLoaded = false; //--- Initialization ---// public EntityAmmoBase(World world) { - super(world); ammoType = null; } @@ -139,6 +141,9 @@ public void setFromParameters(IAmmoType ammoType, AmmoCore core, CoreType @Override public void onUpdate() { + if(world.isRemote&&!clientLoaded) + return; + this.prevDistanceWalkedModified = this.distanceWalkedModified; this.prevPosX = this.posX; this.prevPosY = this.posY; @@ -221,6 +226,25 @@ public void writeEntityToNBT(NBTTagCompound compound) } + @Override + public void writeSpawnData(ByteBuf buffer) + { + NBTTagCompound tag = new NBTTagCompound(); + writeEntityToNBT(tag); + ByteBufUtils.writeTag(buffer, tag); + } + + @Override + public void readSpawnData(ByteBuf additionalData) + { + NBTTagCompound tag = ByteBufUtils.readTag(additionalData); + if(tag!=null) + { + readEntityFromNBT(tag); + this.clientLoaded = true; + } + } + //--- Abstract ---// protected abstract boolean shouldDecay(); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/component/EntityShrapnel.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/component/EntityShrapnel.java index 83acf3b77..4d1faf473 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/component/EntityShrapnel.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/component/EntityShrapnel.java @@ -96,12 +96,11 @@ public void setFire(int seconds) @Override public void onImpact(RayTraceResult mop) { - if(!this.world.isRemote&&ShrapnelHandler.registry.get(shrapnel)!=null) + if(!this.world.isRemote&&shrapnel!=null) { - Shrapnel s = ShrapnelHandler.registry.get(shrapnel); if(mop.entityHit!=null) { - mop.entityHit.attackEntityFrom(causeShrapnelDamage(this, shootingEntity, mop.entityHit), s.damage); + mop.entityHit.attackEntityFrom(causeShrapnelDamage(this, shootingEntity, mop.entityHit), shrapnel.damage); mop.entityHit.hurtResistantTime *= .5; if(this.isBurning()) { diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/component/EntityWhitePhosphorus.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/component/EntityWhitePhosphorus.java index 53b5404d8..35d5d29a5 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/component/EntityWhitePhosphorus.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/component/EntityWhitePhosphorus.java @@ -4,6 +4,7 @@ import com.elytradev.mirage.event.GatherLightsEvent; import com.elytradev.mirage.lighting.ILightEventConsumer; import com.elytradev.mirage.lighting.Light; +import io.netty.buffer.ByteBuf; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.SoundEvents; @@ -16,6 +17,7 @@ import net.minecraft.world.World; import net.minecraftforge.fml.common.Optional; import net.minecraftforge.fml.common.Optional.Interface; +import net.minecraftforge.fml.common.registry.IEntityAdditionalSpawnData; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import pl.pabilo8.immersiveintelligence.client.fx.utils.IIParticleUtils; @@ -30,7 +32,7 @@ * @since 26.10.2019 */ @Interface(iface = "com.elytradev.mirage.lighting.ILightEventConsumer", modid = "mirage") -public class EntityWhitePhosphorus extends EntityIEProjectile implements ILightEventConsumer +public class EntityWhitePhosphorus extends EntityIEProjectile implements ILightEventConsumer, IEntityAdditionalSpawnData { public EntityWhitePhosphorus(World world) { @@ -141,4 +143,26 @@ public void gatherLights(GatherLightsEvent evt) .radius(.05f) .build()); } + + @Override + public void writeSpawnData(ByteBuf buffer) + { + buffer.writeDouble(posX); + buffer.writeDouble(posY); + buffer.writeDouble(posZ); + buffer.writeDouble(motionX); + buffer.writeDouble(motionY); + buffer.writeDouble(motionZ); + } + + @Override + public void readSpawnData(ByteBuf additionalData) + { + posX = additionalData.readDouble(); + posY = additionalData.readDouble(); + posZ = additionalData.readDouble(); + motionX = additionalData.readDouble(); + motionY = additionalData.readDouble(); + motionZ = additionalData.readDouble(); + } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/types/EntityAmmoArtilleryProjectile.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/types/EntityAmmoArtilleryProjectile.java index cb2064dc8..77d5ec82e 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/types/EntityAmmoArtilleryProjectile.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/types/EntityAmmoArtilleryProjectile.java @@ -47,6 +47,8 @@ protected void entityInit() public void onUpdate() { super.onUpdate(); + if(world.isRemote&&!clientLoaded) + return; //Play artillery shell impact sound if(Weapons.artilleryImpactSound&&!flybySound&&ticksExisted > 5) diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/types/EntityAmmoGrenade.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/types/EntityAmmoGrenade.java index d99f574db..8e4fa2c33 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/types/EntityAmmoGrenade.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/types/EntityAmmoGrenade.java @@ -59,6 +59,9 @@ protected void updatePhysics() public void onUpdate() { super.onUpdate(); + if(world.isRemote&&!clientLoaded) + return; + spinTicks = Math.max(0, spinTicks-1); if(onGround) spin = (spin > 180?Math.min(360, spin+SPIN_DEGREES): Math.max(0, spin-SPIN_DEGREES))%360; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/types/EntityAmmoProjectile.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/types/EntityAmmoProjectile.java index 6d8fe2d5d..e6b5276c7 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/types/EntityAmmoProjectile.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/ammo/types/EntityAmmoProjectile.java @@ -123,7 +123,7 @@ public class EntityAmmoProjectile extends EntityAmmoBase * Raytracer used for the projectile */ @Nonnull - protected FactoryTracer flightTracer; + protected FactoryTracer flightTracer = FactoryTracer.create(null); /** * Once true, the bullet will detonate at the end of the tick @@ -181,6 +181,9 @@ public void onUpdate() { super.onUpdate(); + if(world.isRemote&&!clientLoaded) + return; + //Yep, that's it, that's the entire motion code updatePhysics(); updateVisibleMotion(); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMachinegun.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMachinegun.java index c8077d216..5e6a60de8 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMachinegun.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/mounted_weapon/EntityMachinegun.java @@ -106,6 +106,8 @@ public EntityMachinegun(World world, BlockPos pos, float yaw, ItemStack stack) this.setPosition(pos.getX(), pos.getY(), pos.getZ()); this.aim.withCenterYaw(yaw); setOriginStack(stack); + if(upgrades.contains(WeaponUpgrade.TRIPOD)) + this.posY += 0.385f; } @Override diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldFlak.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldFlak.java index 1b5428397..bed083d21 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldFlak.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldFlak.java @@ -168,20 +168,27 @@ protected void onVehicleUpdate() this.ammoFactory.setShooterAndGun(gunner, this) .setPositionAndVelocity(partGun.getPositionVector(), this.aim, 3f, 1f); + //Intentionally swapped, because it's a push-gun, and that's how pushing works - float right = this.commanderControls.getKey("turnLeft")?0.5f: 0; + /*float right = this.commanderControls.getKey("turnLeft")?0.5f: 0; float left = this.commanderControls.getKey("turnRight")?0.5f: 0; boolean backwards = this.commanderControls.getKey("backwards"); if(backwards||this.commanderControls.getKey("forward")) { left = Math.max(0.5f, left+0.25f)*(backwards?-1: 1); right = Math.max(0.5f, right+0.25f)*(backwards?-1: 1); - } + }*/ - partWheelLeft.setRotationSpeed(360f*left); + /*partWheelLeft.setRotationSpeed(360f*left); partWheelLeft.setTorque(5f*left); partWheelRight.setRotationSpeed(360f*right); - partWheelRight.setTorque(5f*right); + partWheelRight.setTorque(5f*right);*/ + + //Seats rotation + this.seatGunner.withSettings(false, IIMath.offsetPosDirectionXYZ(new Vec3d(0.5, 0, 0.125), + aim.getYaw(0), 0, 0)); + this.seatCommander.withSettings(false, IIMath.offsetPosDirectionXYZ(new Vec3d(-0.5, 0, 0.125), + aim.getYaw(0), 0, 0)); //Gunner controls if(gunner!=null) diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldHowitzer.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldHowitzer.java index ede338be6..a5fcf20de 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldHowitzer.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/entity/vehicle/towable/gun/EntityFieldHowitzer.java @@ -158,22 +158,24 @@ protected void onVehicleUpdate() this.ammoFactory.setShooterAndGun(EntityVehicleSeat.getPassengerOnSeat(seatGunner), this) .setPositionAndVelocity(partGun.getPositionVector(), this.aim, 1f, 1f); - //Intentionally swapped, because it's a push-gun, and that's how pushing works - float right = this.commanderControls.getKey("turnLeft")?0.5f: 0; - float left = this.commanderControls.getKey("turnRight")?0.5f: 0; - boolean backwards = this.commanderControls.getKey("backwards"); - if(backwards||this.commanderControls.getKey("forward")) + float left = 0, right = 0; + if(EntityVehicleSeat.getPassengerOnSeat(seatCommander)!=null) { - left = Math.max(0.5f, left+0.25f)*(backwards?-1: 1); - right = Math.max(0.5f, right+0.25f)*(backwards?-1: 1); + //Intentionally swapped, because it's a push-gun, and that's how pushing works + right = this.commanderControls.getKey("turnLeft")?0.5f: 0; + left = this.commanderControls.getKey("turnRight")?0.5f: 0; + boolean backwards = this.commanderControls.getKey("backwards"); + if(backwards||this.commanderControls.getKey("forward")) + { + left = Math.max(0.5f, left+0.25f)*(backwards?-1: 1); + right = Math.max(0.5f, right+0.25f)*(backwards?-1: 1); + } } - partWheelLeft.setRotationSpeed(360f*left); partWheelLeft.setTorque(5f*left); partWheelRight.setRotationSpeed(360f*right); partWheelRight.setTorque(5f*right); - //Gun elevation this.aim.withCenterYaw(this.rotationYaw); if(this.gunnerControls.getKey("up")) diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/easynbt/EasyNBT.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/easynbt/EasyNBT.java index 74ea2f2dd..cf75259ae 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/easynbt/EasyNBT.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/easynbt/EasyNBT.java @@ -15,7 +15,6 @@ import net.minecraftforge.common.util.INBTSerializable; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fml.common.network.ByteBufUtils; -import net.minecraftforge.fml.relauncher.ReflectionHelper; import pl.pabilo8.immersiveintelligence.common.IILogger; import pl.pabilo8.immersiveintelligence.common.IIUtils; import pl.pabilo8.immersiveintelligence.common.util.IIColor; @@ -1283,10 +1282,13 @@ public NBTTagCompound unwrap() /** * @return the NBT Compound as Map */ - @SuppressWarnings("deprecation") public Map asMap() { - return ReflectionHelper.getPrivateValue(NBTTagCompound.class, wrapped.copy(), "tagMap"); + Set keySet = wrapped.getKeySet(); + HashMap map = new HashMap<>(); + for(String key : keySet) + map.put(key, wrapped.getTag(key)); + return map; } /** diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/ammoprovider/GunAmmoProviderMagazine.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/ammoprovider/GunAmmoProviderMagazine.java index 22a1efced..8376f96a7 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/ammoprovider/GunAmmoProviderMagazine.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/ammoprovider/GunAmmoProviderMagazine.java @@ -58,7 +58,8 @@ private void rebuildMagazineFromBullets() if(!b.isEmpty()) bulletList.add(b); - magazineStack = IIContent.itemBulletMagazine.getMagazine(magazineType, bulletList.toArray(new ItemStack[0])); + magazineStack = IIContent.itemBulletMagazine.getMagazine(magazineType); + IIContent.itemBulletMagazine.writeInventory(magazineStack, bulletList); } /** diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/raytracer/FactoryTracer.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/raytracer/FactoryTracer.java index 940dee474..daacf0222 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/raytracer/FactoryTracer.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/raytracer/FactoryTracer.java @@ -44,7 +44,7 @@ private FactoryTracer(@Nullable AxisAlignedBB aabb) this.precision = Math.abs(this.aabb.getAverageEdgeLength()); } - public static FactoryTracer create(@Nonnull AxisAlignedBB aabb) + public static FactoryTracer create(@Nullable AxisAlignedBB aabb) { return new FactoryTracer(aabb); } From 54bafa5e05d30da96690093ab251675b7ded2278 Mon Sep 17 00:00:00 2001 From: Pabilo8 Date: Wed, 3 Jun 2026 13:49:52 +0200 Subject: [PATCH 23/23] Fixed camera entity registering --- .../immersiveintelligence/api/utils/camera/ICameraEntity.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/api/utils/camera/ICameraEntity.java b/src/main/java/pl/pabilo8/immersiveintelligence/api/utils/camera/ICameraEntity.java index 74f4192ec..b90b3f7ca 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/api/utils/camera/ICameraEntity.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/api/utils/camera/ICameraEntity.java @@ -3,8 +3,6 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.math.Vec3d; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedZoom; import javax.annotation.Nonnull; @@ -14,7 +12,6 @@ * @author Pabilo8 (pabilo@iiteam.net) * @since 14.02.2023 */ -@SideOnly(Side.CLIENT) public interface ICameraEntity { /**

<~w9B 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 b))Gak_kPDd_mvkN9`4cCHqxroaESRoSc5(S From 733ad60a6bb413bb07624ea3368e6e2a71c949ef Mon Sep 17 00:00:00 2001 From: Pabilo8 Date: Wed, 3 Jun 2026 01:47:40 +0200 Subject: [PATCH 18/23] Added missing upgrade 3D models and aicons --- .../api/data/IIDataTypeUtils.java | 2 +- .../api/upgrade/Upgrade.java | 33 + .../GuiDataInputMachineEdit.java | 3 +- .../client/gui/block/radar/GuiRadar.java | 2 +- .../gui/block/radar/GuiRadarConfig.java | 2 +- .../gui/block/radar/GuiRadarTargets.java | 2 +- .../component/data_editor/DecoDataEditor.java | 2 +- .../tree/upgrade/UpgradeTreeNodeRenderer.java | 6 + .../metal/ArithmeticLogicMachineRenderer.java | 6 + .../metal/DataInputMachineRenderer.java | 47 +- .../metal/PrintingPressRenderer.java | 9 +- .../metal/ProjectileWorkshopRenderer.java | 2 +- .../client/util/amt/AMTLoader.java | 2 +- .../common/IIContent.java | 24 +- .../multiblock/MultiblockPacker.java | 5 +- .../multiblock/MultiblockPrintingPress.java | 11 + .../tileentity/TileEntityPrintingPress.java | 54 +- .../multiblock/MultiblockFlagpole.java | 3 +- .../tileentity/TileEntityFlagpole.java | 11 +- .../common/crafting/IIRecipes.java | 2 +- .../en_us/ii_data/data_input_machine.md | 3 + .../en_us/ii_warfare/armortools/flagpole.md | 1 + .../ii_warfare/staticdefense/emplacement.md | 1 + .../staticdefense/emplacement_weapons.md | 6 +- .../immersiveintelligence/lang/en_us.lang | 11 + .../arithmetic_logic_machine_preview.obj | 3503 +++++++ .../data_input_machine_preview.obj | 3864 +++++++ .../upgrades/advanced_data.obj | 1052 ++ .../upgrades/data_input_machine.mtl | 20 + .../projectile_workshop_inv.obj | 9205 ++++++++++------- .../textures/gui/upgrade/advanced_data.png | Bin 0 -> 2632 bytes .../textures/gui/upgrade/circuit_racks.png | Bin 0 -> 2491 bytes .../gui/upgrade/flagpole/capture_defiance.png | Bin 264 -> 2549 bytes .../gui/upgrade/flagpole/distress_signal.png | Bin 264 -> 2264 bytes .../gui/upgrade/flagpole/taser_locks.png | Bin 264 -> 2326 bytes .../gui/upgrade/flagpole/unit_post.png | Bin 264 -> 2569 bytes .../textures/gui/upgrade/memory.png | Bin 0 -> 2476 bytes .../{batching_mechanism.png => batching.png} | Bin ...punchtape_processor.png => punchtapes.png} | Bin 39 files changed, 14073 insertions(+), 3821 deletions(-) create mode 100644 src/main/resources/assets/immersiveintelligence/models/block/multiblock/arithmetic_logic_machine/arithmetic_logic_machine_preview.obj create mode 100644 src/main/resources/assets/immersiveintelligence/models/block/multiblock/data_input_machine/data_input_machine_preview.obj create mode 100644 src/main/resources/assets/immersiveintelligence/models/block/multiblock/data_input_machine/upgrades/advanced_data.obj create mode 100644 src/main/resources/assets/immersiveintelligence/models/block/multiblock/data_input_machine/upgrades/data_input_machine.mtl create mode 100644 src/main/resources/assets/immersiveintelligence/textures/gui/upgrade/advanced_data.png create mode 100644 src/main/resources/assets/immersiveintelligence/textures/gui/upgrade/circuit_racks.png create mode 100644 src/main/resources/assets/immersiveintelligence/textures/gui/upgrade/memory.png rename src/main/resources/assets/immersiveintelligence/textures/gui/upgrade/printing_press/{batching_mechanism.png => batching.png} (100%) rename src/main/resources/assets/immersiveintelligence/textures/gui/upgrade/printing_press/{punchtape_processor.png => punchtapes.png} (100%) diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/api/data/IIDataTypeUtils.java b/src/main/java/pl/pabilo8/immersiveintelligence/api/data/IIDataTypeUtils.java index 0aa392ef2..d5203bffc 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/api/data/IIDataTypeUtils.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/api/data/IIDataTypeUtils.java @@ -38,7 +38,7 @@ public static void registerDataTypes() //number types registerType("integer", DataTypeInteger.class, DataTypeInteger::new, IIColor.fromPackedRGB(0x26732e), false); registerType("float", DataTypeFloat.class, DataTypeFloat::new, IIColor.fromPackedRGB(0x0d6b68), false); - registerType("vector", DataTypeVector.class, DataTypeVector::new, IIColor.fromPackedRGB(0x9d8900), false); + registerType("vector", DataTypeVector.class, DataTypeVector::new, IIColor.fromPackedRGB(0x9d8900), true); registerGenericType("number", NumericDataType.class); //text types diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/api/upgrade/Upgrade.java b/src/main/java/pl/pabilo8/immersiveintelligence/api/upgrade/Upgrade.java index 13e1b4333..03911d364 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/api/upgrade/Upgrade.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/api/upgrade/Upgrade.java @@ -30,6 +30,7 @@ public class Upgrade private final ResLoc id, icon; private int progressRequired, progressStages; private UpgradePurpose purpose; + private boolean isWorkInProgress = false; public Upgrade(String name) { @@ -70,24 +71,51 @@ public Upgrade withProgressStages(int progressRequired) } + /** + * Sets the required progress, used for calculating the time it takes to install the upgrade. Adjusted by the amount of animated components drawn during the upgrade install.* + * + * @return this + */ public Upgrade withRequiredProgress(int progress) { this.progressRequired = progress; return this; } + /** + * Sets the upgrade purpose, used for categorizing upgrades in the tech tree and applying special rules to them. + * + * @return this + */ public Upgrade withType(UpgradePurpose type) { this.purpose = type; return this; } + /** + * Adds information about a benefit that this upgrade provides, shown in the upgrade tooltip. + * Benefits are purely informational and do not have to be applied in any way. + * + * @return this + */ public Upgrade withBenefit(UpgradeBenefit benefit) { this.benefits.add(benefit); return this; } + /** + * Marks the upgrade as Work-In-Progress and does not allow players to install it. + * + * @return this + */ + public Upgrade withWIPStatus() + { + this.isWorkInProgress = true; + return this; + } + //--- Getters ---// public ResourceLocation getId() @@ -101,6 +129,11 @@ public String getName() return id.getResourcePath(); } + public boolean isWorkInProgress() + { + return this.isWorkInProgress; + } + public UpgradePurpose getPurpose() { return purpose; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_input_machine/GuiDataInputMachineEdit.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_input_machine/GuiDataInputMachineEdit.java index 032556802..13df45f3b 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_input_machine/GuiDataInputMachineEdit.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/data_input_machine/GuiDataInputMachineEdit.java @@ -14,6 +14,7 @@ import pl.pabilo8.immersiveintelligence.client.gui.deco.component.data_editor.DecoDataEditor; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoBackgroundBuilder.SlotStyle; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.*; +import pl.pabilo8.immersiveintelligence.common.IIContent; import pl.pabilo8.immersiveintelligence.common.IIGUI; import pl.pabilo8.immersiveintelligence.common.IIUtils; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock0.tileentity.TileEntityDataInputMachine; @@ -117,7 +118,7 @@ public void onInit() .withSize(116, 18) .withDropdownWidth(116) .withMaxDisplayedEntries(5) - .withEntries(DecoDataEditor.getEditorTypes(false)) + .withEntries(DecoDataEditor.getEditorTypes(tile.isUpgradeInstalled(IIContent.UPGRADE_ADVANCED_DATA))) .withSelectedEntry(variableToEdit.getValue().getTypeMeta()) .withDisplayFunction(DecoTemplates.getDataTypeEntryDisplay()) .withOnSelectedEntry((typeMetaInfo, typeMetaInfo2) -> { diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/radar/GuiRadar.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/radar/GuiRadar.java index f21ab26a2..0ef65986f 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/radar/GuiRadar.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/radar/GuiRadar.java @@ -64,7 +64,7 @@ public void onInit() //Tabs addLinkTab(IIGUI.RADAR, GuiRadar.ICON_RADAR, "radar_module"); - addLinkTab(IIGUI.RADAR_CONFIG, DecoTextures.ICON_CONFIG, "config_module"); + addLinkTab(IIGUI.RADAR_CONFIG, DecoTextures.ICON_CONFIG, "configuration_module"); addLinkTab(IIGUI.RADAR_TARGETS, DecoTextures.ICON_TARGETS, "targets_module"); BlockPos pos = tile.getPos(); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/radar/GuiRadarConfig.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/radar/GuiRadarConfig.java index 6afff2b45..9e826f480 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/radar/GuiRadarConfig.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/radar/GuiRadarConfig.java @@ -35,7 +35,7 @@ public void onInit() //Tabs addLinkTab(IIGUI.RADAR, GuiRadar.ICON_RADAR, "radar_module"); - addLinkTab(IIGUI.RADAR_CONFIG, DecoTextures.ICON_CONFIG, "config_module"); + addLinkTab(IIGUI.RADAR_CONFIG, DecoTextures.ICON_CONFIG, "configuration_module"); addLinkTab(IIGUI.RADAR_TARGETS, DecoTextures.ICON_TARGETS, "targets_module"); } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/radar/GuiRadarTargets.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/radar/GuiRadarTargets.java index 82b3b62c5..0038be262 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/radar/GuiRadarTargets.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/radar/GuiRadarTargets.java @@ -37,7 +37,7 @@ public void onInit() //Tabs addLinkTab(IIGUI.RADAR, GuiRadar.ICON_RADAR, "radar_module"); - addLinkTab(IIGUI.RADAR_CONFIG, DecoTextures.ICON_CONFIG, "config_module"); + addLinkTab(IIGUI.RADAR_CONFIG, DecoTextures.ICON_CONFIG, "configuration_module"); addLinkTab(IIGUI.RADAR_TARGETS, DecoTextures.ICON_TARGETS, "targets_module"); } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/data_editor/DecoDataEditor.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/data_editor/DecoDataEditor.java index 336e0d8ff..765f99994 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/data_editor/DecoDataEditor.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/data_editor/DecoDataEditor.java @@ -75,7 +75,7 @@ public static List> getEditorTypes(boolean advanced) { return EDITORS.keySet().stream() .map(IIDataTypeUtils.metaTypesByClass::get) - //.filter(typeMetaInfo -> !advanced||typeMetaInfo.isAdvancedType()) + .filter(typeMetaInfo -> advanced||!typeMetaInfo.isAdvancedType()) .collect(Collectors.toList()); } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/tree/upgrade/UpgradeTreeNodeRenderer.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/tree/upgrade/UpgradeTreeNodeRenderer.java index 5bd67492a..57a2169c2 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/tree/upgrade/UpgradeTreeNodeRenderer.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/tree/upgrade/UpgradeTreeNodeRenderer.java @@ -73,6 +73,12 @@ public Collection getTooltip(@Nonnull IDecoTreeNode node) List tooltip = new ArrayList<>(); tooltip.add(upgrade.getLocalizedName()); + if(upgrade.isWorkInProgress()) + { + tooltip.add(IIColor.MC_YELLOW.getHexCol(I18n.format("ie.manual.entry.wip_warning0"))); + tooltip.add(IIColor.MC_YELLOW.getHexCol(I18n.format("ie.manual.entry.wip_warning.upgrade"))); + } + List description = IIClientUtils.fontRegular.listFormattedStringToWidth( I18n.format(String.format("machineupgrade.%s.%s.desc", upgrade.getId().getResourceDomain(), diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/multiblock/metal/ArithmeticLogicMachineRenderer.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/multiblock/metal/ArithmeticLogicMachineRenderer.java index c67440a71..1ff8e1a48 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/multiblock/metal/ArithmeticLogicMachineRenderer.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/multiblock/metal/ArithmeticLogicMachineRenderer.java @@ -7,6 +7,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.math.MathHelper; import net.minecraftforge.client.model.obj.OBJModel; +import pl.pabilo8.immersiveintelligence.api.upgrade.UpgradeTechTree; import pl.pabilo8.immersiveintelligence.client.util.amt.AMTUtils; import pl.pabilo8.immersiveintelligence.client.util.amt.animation.IIAnimationCachedMap; import pl.pabilo8.immersiveintelligence.client.util.amt.models.AMTCachedModel; @@ -125,6 +126,11 @@ public void compileModels(IBlockState state, OBJModel model) this.animationDrawer = IIAnimationCachedMap.create(this.model, ResLoc.of(IIReference.RES_II, "arithmetic_logic_machine/open_drawer")); this.animationDoor = IIAnimationCachedMap.create(this.model, ResLoc.of(IIReference.RES_II, "arithmetic_logic_machine/open_door")); this.animationKeyboard = IIAnimationCachedMap.create(this.model, ResLoc.of(IIReference.RES_II, "arithmetic_logic_machine/open_keyboard")); + + UpgradeTechTree.getTreeFor(TileEntityArithmeticLogicMachine.class) + .withBaseModelLocation(IIReference.RES_BLOCK_MODEL.with("multiblock/arithmetic_logic_machine/arithmetic_logic_machine_preview.obj")) + .withUpgradeModelLocation(IIContent.UPGRADE_MEMORY, resFolder.with("upgrades/circuit_racks.obj")) + .withUpgradeModelLocation(IIContent.UPGRADE_CIRCUIT_RACKS, resFolder.with("upgrades/memory.obj")); } @Override diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/multiblock/metal/DataInputMachineRenderer.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/multiblock/metal/DataInputMachineRenderer.java index d7452f67f..532df4cf6 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/multiblock/metal/DataInputMachineRenderer.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/multiblock/metal/DataInputMachineRenderer.java @@ -6,10 +6,14 @@ import net.minecraftforge.client.model.obj.OBJModel; import pl.pabilo8.immersiveintelligence.api.upgrade.UpgradeTechTree; import pl.pabilo8.immersiveintelligence.client.util.amt.AMTUtils; -import pl.pabilo8.immersiveintelligence.client.util.amt.animation.IIAnimationCompiledMap; -import pl.pabilo8.immersiveintelligence.client.util.amt.models.AMTModel; +import pl.pabilo8.immersiveintelligence.client.util.amt.animation.IIAnimationCachedMap; +import pl.pabilo8.immersiveintelligence.client.util.amt.models.AMTCachedModel; +import pl.pabilo8.immersiveintelligence.client.util.amt.models.AMTCachedModelBuilder; +import pl.pabilo8.immersiveintelligence.client.util.amt.models.AMTUpgradeCachedModel; +import pl.pabilo8.immersiveintelligence.client.util.amt.models.AMTUpgradeCachedModel.MachineCachedUpgradeModelBuilder; import pl.pabilo8.immersiveintelligence.client.util.amt.renderer.IIMultiblockRenderer; import pl.pabilo8.immersiveintelligence.client.util.amt.renderer.IITileRenderer.RegisteredTileRenderer; +import pl.pabilo8.immersiveintelligence.common.IIContent; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock0.tileentity.TileEntityDataInputMachine; import pl.pabilo8.immersiveintelligence.common.util.IIReference; import pl.pabilo8.immersiveintelligence.common.util.ResLoc; @@ -23,14 +27,16 @@ @RegisteredTileRenderer(name = "multiblock/data_input_machine", clazz = TileEntityDataInputMachine.class) public class DataInputMachineRenderer extends IIMultiblockRenderer { - private AMTModel model; - private IIAnimationCompiledMap animationDrawer, animationHatch, animationProgrammingStart; + private AMTCachedModel model; + private AMTUpgradeCachedModel upgradeAdvancedData; + private IIAnimationCachedMap animationDrawer, animationHatch, animationProgrammingStart; @Override public void drawAnimated(TileEntityDataInputMachine te, BufferBuilder buf, float partialTicks, Tessellator tes) { //Reset model to default state - model.defaultize(); + this.model.getVariant(te, te.upgradeManager); + this.model.defaultize(); animationDrawer.apply(te.drawer.getProgress(partialTicks)); animationHatch.apply(te.hatch.getProgress(partialTicks)); @@ -42,6 +48,10 @@ public void drawAnimated(TileEntityDataInputMachine te, BufferBuilder buf, float //Draw applyStandardMirroring(te, true); + + //Display upgrade construction + upgradeAdvancedData.apply(te, tes, buf, partialTicks); + //Render model.render(tes, buf); applyStandardMirroring(te, false); @@ -51,6 +61,7 @@ public void drawAnimated(TileEntityDataInputMachine te, BufferBuilder buf, float public void drawSimple(BufferBuilder buf, float partialTicks, Tessellator tes) { //Reset model to default state + model.getBase(); model.defaultize(); //Render model.render(tes, buf); @@ -60,15 +71,31 @@ public void drawSimple(BufferBuilder buf, float partialTicks, Tessellator tes) public void compileModels(IBlockState state, OBJModel model) { //model loading - this.model = new AMTModel(state, model); + ResLoc resFolder = IIReference.RES_II.with("models/block/multiblock/data_input_machine/"); + AMTCachedModelBuilder modelBuilder = + AMTCachedModelBuilder.startTileEntityModel(TileEntityDataInputMachine.class) + .withModel(model) + .withHeader(resFolder.with("data_input_machine.obj.amt")); + + //upgrade models + this.upgradeAdvancedData = new MachineCachedUpgradeModelBuilder<>(modelBuilder) + .withUpgrade(IIContent.UPGRADE_ADVANCED_DATA) + .withConstructionModel(resFolder.with("upgrades/advanced_data.obj")) + .withAnimation(ResLoc.of(IIReference.RES_II, "data_input_machine/upgrade_advanced_data")) + .build(); + + //finish main model + this.model = modelBuilder.build(); //animations - animationDrawer = IIAnimationCompiledMap.create(this.model, ResLoc.of(IIReference.RES_II, "data_input_machine/drawer")); - animationHatch = IIAnimationCompiledMap.create(this.model, ResLoc.of(IIReference.RES_II, "data_input_machine/hatch")); - animationProgrammingStart = IIAnimationCompiledMap.create(this.model, ResLoc.of(IIReference.RES_II, "data_input_machine/programming_start")); + animationDrawer = IIAnimationCachedMap.create(this.model, ResLoc.of(IIReference.RES_II, "data_input_machine/drawer")); + animationHatch = IIAnimationCachedMap.create(this.model, ResLoc.of(IIReference.RES_II, "data_input_machine/hatch")); + animationProgrammingStart = IIAnimationCachedMap.create(this.model, ResLoc.of(IIReference.RES_II, "data_input_machine/programming_start")); UpgradeTechTree.getTreeFor(TileEntityDataInputMachine.class) - .withBaseModelLocation(IIReference.RES_BLOCK_MODEL.with("multiblock/data_input_machine/data_input_machine.obj")); + .withBaseModelLocation(IIReference.RES_BLOCK_MODEL.with("multiblock/data_input_machine/data_input_machine_preview.obj")) + .withUpgradeModelLocation(IIContent.UPGRADE_ADVANCED_DATA, IIReference.RES_BLOCK_MODEL.with( + "multiblock/data_input_machine/upgrades/advanced_data.obj")); } @Override diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/multiblock/metal/PrintingPressRenderer.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/multiblock/metal/PrintingPressRenderer.java index 7b19203ed..f508bb91d 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/multiblock/metal/PrintingPressRenderer.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/multiblock/metal/PrintingPressRenderer.java @@ -5,6 +5,7 @@ import net.minecraft.client.renderer.Tessellator; import net.minecraft.item.ItemStack; import net.minecraftforge.client.model.obj.OBJModel; +import pl.pabilo8.immersiveintelligence.api.upgrade.UpgradeTechTree; import pl.pabilo8.immersiveintelligence.client.util.amt.AMTUtils; import pl.pabilo8.immersiveintelligence.client.util.amt.animation.IIAnimationCompiledMap; import pl.pabilo8.immersiveintelligence.client.util.amt.models.AMTModel; @@ -12,6 +13,7 @@ import pl.pabilo8.immersiveintelligence.client.util.amt.parts.AMTItem; import pl.pabilo8.immersiveintelligence.client.util.amt.renderer.IIMultiblockRenderer; import pl.pabilo8.immersiveintelligence.client.util.amt.renderer.IITileRenderer.RegisteredTileRenderer; +import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock0.multiblock.MultiblockPrintingPress; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock0.tileentity.TileEntityPrintingPress; import pl.pabilo8.immersiveintelligence.common.util.IIReference; import pl.pabilo8.immersiveintelligence.common.util.ResLoc; @@ -36,8 +38,8 @@ public void drawAnimated(TileEntityPrintingPress te, BufferBuilder buf, float pa model.defaultize(); animationDefault.apply(0); - itemModel.setStack(te.inventory.get(TileEntityPrintingPress.SLOT_PAPER)); - stackModel.setStack(te.inventory.get(TileEntityPrintingPress.SLOT_OUTPUT)); + itemModel.setStack(te.inventory.get(MultiblockPrintingPress.SLOT_PAPER)); + stackModel.setStack(te.inventory.get(MultiblockPrintingPress.SLOT_OUTPUT)); if(!te.processQueue.isEmpty()) { @@ -82,6 +84,9 @@ public void compileModels(IBlockState state, OBJModel model) //animations animationDefault = IIAnimationCompiledMap.create(this.model, ResLoc.of(IIReference.RES_II, "printing_press/default")); animationWork = IIAnimationCompiledMap.create(this.model, ResLoc.of(IIReference.RES_II, "printing_press/work")); + + UpgradeTechTree.getTreeFor(TileEntityPrintingPress.class) + .withBaseModelLocation(IIReference.RES_BLOCK_MODEL.with("multiblock/printing_press/printing_press_inv.obj")); } @Override diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/multiblock/metal/ProjectileWorkshopRenderer.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/multiblock/metal/ProjectileWorkshopRenderer.java index d447a85b9..3d4e6b3eb 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/multiblock/metal/ProjectileWorkshopRenderer.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/multiblock/metal/ProjectileWorkshopRenderer.java @@ -99,6 +99,6 @@ public void compileModels(IBlockState state, OBJModel model) coreFiller = IIAnimationCompiledMap.create(this.model, ResLoc.of(IIReference.RES_II, "projectile_workshop/production_filling")); UpgradeTechTree.getTreeFor(TileEntityProjectileWorkshop.class) - .withBaseModelLocation(IIReference.RES_BLOCK_MODEL.with("multiblock/projectile_workshop/projectile_workshop.obj")); + .withBaseModelLocation(IIReference.RES_BLOCK_MODEL.with("multiblock/projectile_workshop/projectile_workshop_inv.obj")); } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/util/amt/AMTLoader.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/util/amt/AMTLoader.java index 877157e13..a57889ba3 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/util/amt/AMTLoader.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/util/amt/AMTLoader.java @@ -88,7 +88,7 @@ public static JsonObject readServerFileToJson(@Nonnull ResourceLocation res, Str public static IIAnimation loadAnimation(@Nonnull ResourceLocation res) { ResourceLocation fullRes = new ResourceLocation(res.getResourceDomain(), "animations/"+res.getResourcePath()+".json"); - return new IIAnimation(res, readFileToJSON(fullRes, "model header")); + return new IIAnimation(res, readFileToJSON(fullRes, "animation")); } public static IIAnimation loadAnimationServer(@Nonnull ResourceLocation res) diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/IIContent.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/IIContent.java index e18ccadbf..9193851a8 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/IIContent.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/IIContent.java @@ -134,10 +134,12 @@ public class IIContent .withType(UpgradePurpose.SPECIAL); //allows printing bound pages, books and newspapers public static final Upgrade UPGRADE_PRESS_BATCHING = new Upgrade("printing_press/batching") - .withType(UpgradePurpose.SPECIAL); + .withType(UpgradePurpose.SPECIAL) + .withWIPStatus(); //allows printing envelopes public static final Upgrade UPGRADE_PRESS_ENVELOPER = new Upgrade("printing_press/enveloper") - .withType(UpgradePurpose.SPECIAL); + .withType(UpgradePurpose.SPECIAL) + .withWIPStatus(); //allows the radar to detect radio signal emitters and send their positions public static final Upgrade UPGRADE_RADIO_LOCATORS = new Upgrade("radio_locators"); @@ -158,7 +160,8 @@ public class IIContent .withType(UpgradePurpose.DATA); //arithemtic logic machine upgrade public static final Upgrade UPGRADE_MEMORY = new Upgrade("memory") - .withType(UpgradePurpose.DATA); + .withType(UpgradePurpose.DATA) + .withWIPStatus(); public static final Upgrade UPGRADE_CIRCUIT_RACKS = new Upgrade("circuit_racks") .withType(UpgradePurpose.CAPACITY); @@ -190,7 +193,8 @@ public class IIContent new UpgradeEmplacementWeapon<>("guided_missile_launcher", EmplacementWeaponGuidedMissileLauncher::new); public static final Upgrade UPGRADE_SOVEREIGNTY = new Upgrade("sovereignty") - .withType(UpgradePurpose.DEFENSE_SYSTEM); + .withType(UpgradePurpose.DEFENSE_SYSTEM) + .withWIPStatus(); public static final Upgrade UPGRADE_EMPLACEMENT_FALLBACK_GRENADES = new Upgrade("emplacement/emergency_smoke") .withType(UpgradePurpose.DEFENSE_SYSTEM); @@ -202,16 +206,20 @@ public class IIContent public static final Upgrade UPGRADE_EMPLACEMENT_MACHINEGUN_WATERCOOLED = new Upgrade("emplacement/machinegun/watercooled") .withType(UpgradePurpose.EFFICIENCY); public static final Upgrade UPGRADE_EMPLACEMENT_MACHINEGUN_BUNKER = new Upgrade("emplacement/machinegun/additional_fortifications") - .withType(UpgradePurpose.ARMOR); + .withType(UpgradePurpose.ARMOR) + .withWIPStatus(); public static final Upgrade UPGRADE_FLAGPOLE_CAPTURE_DEFIANCE = new Upgrade("flagpole/capture_defiance") .withType(UpgradePurpose.DEFENSE_SYSTEM); public static final Upgrade UPGRADE_FLAGPOLE_TASER_LOCKS = new Upgrade("flagpole/taser_locks") - .withType(UpgradePurpose.DEFENSE_SYSTEM); + .withType(UpgradePurpose.DEFENSE_SYSTEM) + .withWIPStatus(); public static final Upgrade UPGRADE_FLAGPOLE_DISTRESS_SIGNAL = new Upgrade("flagpole/distress_signal") - .withType(UpgradePurpose.DEFENSE_SYSTEM); + .withType(UpgradePurpose.DEFENSE_SYSTEM) + .withWIPStatus(); public static final Upgrade UPGRADE_FLAGPOLE_UNIT_POST = new Upgrade("flagpole/unit_post") - .withType(UpgradePurpose.FULL_CONVERSION); + .withType(UpgradePurpose.FULL_CONVERSION) + .withWIPStatus(); public static final Upgrade UPGRADE_VEHICLE_SMALL_STORAGE = new Upgrade("vehicle/small/storage") .withType(UpgradePurpose.CAPACITY); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock0/multiblock/MultiblockPacker.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock0/multiblock/MultiblockPacker.java index 3f23aece5..10b98823d 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock0/multiblock/MultiblockPacker.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock0/multiblock/MultiblockPacker.java @@ -28,8 +28,9 @@ public MultiblockPacker() .withUpgrade(IIContent.UPGRADE_PACKER_FLUID, UpgradeTier.TIER_1) .withUpgrade(IIContent.UPGRADE_PACKER_ENERGY, UpgradeTier.TIER_1) .withLockOut(IIContent.UPGRADE_PACKER_FLUID, IIContent.UPGRADE_PACKER_ENERGY) - .withUpgrade(IIContent.UPGRADE_PACKER_NAMING, UpgradeTier.TIER_1) - .withUpgrade(IIContent.UPGRADE_PACKER_RAILWAY, UpgradeTier.TIER_1); + .withUpgrade(IIContent.UPGRADE_PACKER_NAMING, UpgradeTier.TIER_1); + //TODO: 02.06.2026 actually implement + //.withUpgrade(IIContent.UPGRADE_PACKER_RAILWAY, UpgradeTier.TIER_1); } @Override diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock0/multiblock/MultiblockPrintingPress.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock0/multiblock/MultiblockPrintingPress.java index f4ea15066..b78944754 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock0/multiblock/MultiblockPrintingPress.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock0/multiblock/MultiblockPrintingPress.java @@ -3,6 +3,8 @@ import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.Vec3i; import pl.pabilo8.immersiveintelligence.ImmersiveIntelligence; +import pl.pabilo8.immersiveintelligence.api.upgrade.UpgradeTechTree; +import pl.pabilo8.immersiveintelligence.api.upgrade.UpgradeUtils.UpgradeTier; import pl.pabilo8.immersiveintelligence.common.IIContent; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock0.BlockIIMetalMultiblock0.MetalMultiblocks0; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock0.tileentity.TileEntityPrintingPress; @@ -15,6 +17,10 @@ */ public class MultiblockPrintingPress extends MultiblockStuctureBase { + public static final int SLOT_PAPER = 0; + public static final int SLOT_OUTPUT = 1; + public static final int SLOT_BUCKET_IN = 2; + public static final int SLOT_BUCKET_OUT = 3; public static MultiblockPrintingPress INSTANCE; public MultiblockPrintingPress() @@ -22,6 +28,11 @@ public MultiblockPrintingPress() super(new ResourceLocation(ImmersiveIntelligence.MODID, "multiblocks/printing_press")); offset = new Vec3i(1, 1, 0); INSTANCE = this; + + UpgradeTechTree.getTreeFor(TileEntityPrintingPress.class) + .withUpgrade(IIContent.UPGRADE_PRESS_PUNCHTAPES, UpgradeTier.TIER_1) + .withUpgrade(IIContent.UPGRADE_PRESS_BATCHING, UpgradeTier.TIER_1) + .withUpgrade(IIContent.UPGRADE_PRESS_ENVELOPER, UpgradeTier.TIER_1); } @Override diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock0/tileentity/TileEntityPrintingPress.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock0/tileentity/TileEntityPrintingPress.java index 2ac9ce51a..9fa4e34ff 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock0/tileentity/TileEntityPrintingPress.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock0/tileentity/TileEntityPrintingPress.java @@ -29,6 +29,9 @@ import pl.pabilo8.immersiveintelligence.api.data.DataPacket; import pl.pabilo8.immersiveintelligence.api.data.IIDataHandlingUtils; import pl.pabilo8.immersiveintelligence.api.data.types.DataTypeInteger; +import pl.pabilo8.immersiveintelligence.api.upgrade.IManagedUpgradableDevice; +import pl.pabilo8.immersiveintelligence.api.upgrade.Upgrade; +import pl.pabilo8.immersiveintelligence.api.upgrade.UpgradeManager; import pl.pabilo8.immersiveintelligence.api.utils.tools.IAdvancedTextOverlay; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Machines.PrintingPress; import pl.pabilo8.immersiveintelligence.common.IIContent; @@ -46,6 +49,7 @@ import pl.pabilo8.immersiveintelligence.common.util.multiblock.production.TileEntityMultiblockProductionMulti; import pl.pabilo8.immersiveintelligence.common.util.multiblock.util.MultiblockPOI; +import javax.annotation.Nonnull; import javax.annotation.Nullable; /** @@ -53,18 +57,16 @@ * @updated 13.12.2023 * @since 28.06.2019 */ -public class TileEntityPrintingPress extends TileEntityMultiblockProductionMulti implements ITactileListener, IPlayerInteraction, IAdvancedTextOverlay +public class TileEntityPrintingPress extends TileEntityMultiblockProductionMulti + implements ITactileListener, IPlayerInteraction, IAdvancedTextOverlay, IManagedUpgradableDevice { - /** - * Inventory slots IDs - */ - public static final int SLOT_PAPER = 0, SLOT_OUTPUT = 1, SLOT_BUCKET_IN = 2, SLOT_BUCKET_OUT = 3; - @SyncNBT(time = 40, events = {SyncEvents.TILE_GUI_OPENED, SyncEvents.TILE_RECIPE_CHANGED}) public MultiFluidTank tank; + @SyncNBT(name = "upgrades", events = SyncEvents.TILE_UPGRADES_MODIFIED) + public UpgradeManager upgradeManager; - private IItemHandler inputHandler = getSingleInventoryHandler(SLOT_PAPER, true, true); - private IItemHandler outputHandler = getSingleInventoryHandler(SLOT_OUTPUT, true, true); + private IItemHandler inputHandler = getSingleInventoryHandler(MultiblockPrintingPress.SLOT_PAPER, true, true); + private IItemHandler outputHandler = getSingleInventoryHandler(MultiblockPrintingPress.SLOT_OUTPUT, true, true); private TactileManager tactileManager = null; private EasyCollection printRequestsQueue; @@ -76,6 +78,7 @@ public TileEntityPrintingPress() this.energyStorage = new FluxStorageAdvanced(PrintingPress.energyCapacity); this.inventory = NonNullList.withSize(4, ItemStack.EMPTY); this.printRequestsQueue = new EasyCollection<>(PrintingRequest::new); + this.upgradeManager = new UpgradeManager<>(this); } @Override @@ -94,6 +97,7 @@ protected void dummyCleanup() this.inputHandler = null; this.outputHandler = null; this.tactileManager = null; + this.upgradeManager = null; } @Override @@ -104,7 +108,7 @@ protected void onUpdate() if(!world.isRemote) tactileManager.defaultize(); - if(IIUtils.handleBucketTankInteraction(tank, inventory, SLOT_BUCKET_IN, SLOT_BUCKET_OUT, true, + if(IIUtils.handleBucketTankInteraction(tank, inventory, MultiblockPrintingPress.SLOT_BUCKET_IN, MultiblockPrintingPress.SLOT_BUCKET_OUT, true, fs -> IIContent.fluidInkBlack.equals(fs.getFluid())|| IIContent.fluidInkCyan.equals(fs.getFluid())|| IIContent.fluidInkMagenta.equals(fs.getFluid())|| @@ -171,7 +175,7 @@ public void receiveData(DataPacket packet, int pos) String printingMode = IIDataHandlingUtils.asString('m', packet); PrintingRecipe.streamRecipes(PrintingRecipe.class) - .filter(recipe -> recipe.getInput().matchesItemStack(inventory.get(SLOT_PAPER))) + .filter(recipe -> recipe.getInput().matchesItemStack(inventory.get(MultiblockPrintingPress.SLOT_PAPER))) .filter(recipe -> recipe.getCategoryName().equals(printingMode)) .findFirst() .ifPresent(printingRecipe -> { @@ -193,12 +197,12 @@ public boolean isStackValid(int slot, ItemStack stack) { switch(slot) { - case SLOT_PAPER: + case MultiblockPrintingPress.SLOT_PAPER: return Utils.compareToOreName(stack, "pageEmpty"); - case SLOT_OUTPUT: + case MultiblockPrintingPress.SLOT_OUTPUT: return Utils.compareToOreName(stack, "pageWritten")||Utils.compareToOreName(stack, "pageEmpty"); - case SLOT_BUCKET_IN: - case SLOT_BUCKET_OUT: + case MultiblockPrintingPress.SLOT_BUCKET_IN: + case MultiblockPrintingPress.SLOT_BUCKET_OUT: return stack.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null); default: return false; @@ -221,12 +225,12 @@ public int getMaxProductionQueue() @Override protected IIMultiblockProcess findNewProductionProcess() { - // Check for queued orders + //Check for queued orders if(printRequestsQueue.isEmpty()) return null; PrintingRequest found = printRequestsQueue.get(0); - ItemStack input = inputHandler.extractItem(SLOT_PAPER, 1, true); + ItemStack input = inputHandler.extractItem(MultiblockPrintingPress.SLOT_PAPER, 1, true); if(!found.recipe.getInput().matchesItemStack(input)) return null; @@ -235,6 +239,11 @@ protected IIMultiblockProcess findNewProductionProcess() ItemStack result = function.apply(input, found.data); int[] inkCost = function.getInkTypesRequired(found.data); + //Check if the required upgrade is installed + Upgrade requiredUpgrade = function.getUpgradeRequired(); + if(requiredUpgrade!=null&&!isUpgradeInstalled(requiredUpgrade)) + return null; + //Check if there's enough ink FluidStack[] fs = { new FluidStack(IIContent.fluidInkCyan, inkCost[0]), @@ -247,7 +256,7 @@ protected IIMultiblockProcess findNewProductionProcess() return null; //Use resources - inputHandler.extractItem(SLOT_PAPER, 1, false); + inputHandler.extractItem(MultiblockPrintingPress.SLOT_PAPER, 1, false); for(FluidStack f : fs) tank.drain(f, true); @@ -336,7 +345,7 @@ protected boolean isTankAvailable(int pos, int tank) @Override public int getSlotLimit(int slot) { - return slot==SLOT_OUTPUT?12: super.getSlotLimit(slot); + return slot==MultiblockPrintingPress.SLOT_OUTPUT?12: super.getSlotLimit(slot); } @Override @@ -392,6 +401,15 @@ public String[] getOverlayText(EntityPlayer player, RayTraceResult mop) return new String[0]; } + //--- IManagedUpgradableDevice ---// + + @Nonnull + @Override + public UpgradeManager getUpgradeManager() + { + return upgradeManager; + } + //--- Utilities ---// public static class PrintingRequest implements INBTSerializable diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/multiblock/MultiblockFlagpole.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/multiblock/MultiblockFlagpole.java index e09d7ac82..bbcadaac1 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/multiblock/MultiblockFlagpole.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/multiblock/MultiblockFlagpole.java @@ -34,9 +34,10 @@ public MultiblockFlagpole() UpgradeTechTree.getTreeFor(TileEntityFlagpole.class) .reset() .withUpgrade(IIContent.UPGRADE_FLAGPOLE_CAPTURE_DEFIANCE, UpgradeTier.TIER_1) - .withUpgrade(IIContent.UPGRADE_FLAGPOLE_TASER_LOCKS, UpgradeTier.TIER_1) + .withUpgrade(IIContent.UPGRADE_FLAGPOLE_TASER_LOCKS, UpgradeTier.TIER_2) .withUpgrade(IIContent.UPGRADE_FLAGPOLE_UNIT_POST, UpgradeTier.TIER_1) .withUpgrade(IIContent.UPGRADE_FLAGPOLE_DISTRESS_SIGNAL, UpgradeTier.TIER_1) + .withDependency(IIContent.UPGRADE_FLAGPOLE_CAPTURE_DEFIANCE, IIContent.UPGRADE_FLAGPOLE_TASER_LOCKS) .withLockOut(IIContent.UPGRADE_FLAGPOLE_UNIT_POST, IIContent.UPGRADE_FLAGPOLE_TASER_LOCKS); } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/TileEntityFlagpole.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/TileEntityFlagpole.java index c61367d4f..1c4a05dfe 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/TileEntityFlagpole.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/TileEntityFlagpole.java @@ -13,6 +13,7 @@ import pl.pabilo8.immersiveintelligence.api.upgrade.UpgradeManager; import pl.pabilo8.immersiveintelligence.api.upgrade.UpgradeUtils.MachineStyle; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Machines.Flagpole; +import pl.pabilo8.immersiveintelligence.common.IIContent; import pl.pabilo8.immersiveintelligence.common.IIGUI; import pl.pabilo8.immersiveintelligence.common.IILogger; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.multiblock.MultiblockFlagpole; @@ -223,10 +224,18 @@ public MultiblockHealth getHealthManager() return health; } + @Override + public boolean damageHealth(float damage) + { + if(isUpgradeInstalled(IIContent.UPGRADE_FLAGPOLE_CAPTURE_DEFIANCE)) + damage /= 2; + return IManagedDamageResistantMultiblock.super.damageHealth(damage); + } + @Override public float getExplosionResistance() { - return 3; + return isUpgradeInstalled(IIContent.UPGRADE_FLAGPOLE_CAPTURE_DEFIANCE)?6: 3; } //--- IIIGuiMultiblockTile ---// diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/crafting/IIRecipes.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/crafting/IIRecipes.java index 34bb68272..1643980c1 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/crafting/IIRecipes.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/crafting/IIRecipes.java @@ -293,7 +293,7 @@ public int[] getInkTypesRequired(DataPacket data) @Override public ItemStack apply(ItemStack input, DataPacket data) { - return IIContent.itemPrintedPage.getStack(PageType.TEXT, + return IIContent.itemPrintedPage.getStack(PageType.CODE, nbt -> nbt.withString("text", data.get('t').toString()) ); } diff --git a/src/main/resources/assets/immersiveintelligence/ie_manual/en_us/ii_data/data_input_machine.md b/src/main/resources/assets/immersiveintelligence/ie_manual/en_us/ii_data/data_input_machine.md index 0bcd204cc..dbd893474 100644 --- a/src/main/resources/assets/immersiveintelligence/ie_manual/en_us/ii_data/data_input_machine.md +++ b/src/main/resources/assets/immersiveintelligence/ie_manual/en_us/ii_data/data_input_machine.md @@ -19,4 +19,7 @@ When editing a variable, you can change its letter by using the up and down arro # punchtapes The **Data Input Machine** is capable of reading a **Packet** from a [written punchtape] and writing the currently stored **Packet** to [a blank one]. Both operations can be performed by inserting a [Punchtape] into the *upper slot*. After processing, the [Punchtape] will be outputted into the *lower slot*. +# punchtapes +The **DIM** can be upgraded with a specialized control panel to allow input of advanced data types like [Vector], [Map] and [Array]. + diff --git a/src/main/resources/assets/immersiveintelligence/ie_manual/en_us/ii_warfare/armortools/flagpole.md b/src/main/resources/assets/immersiveintelligence/ie_manual/en_us/ii_warfare/armortools/flagpole.md index 57b65c0dc..2e22257dc 100644 --- a/src/main/resources/assets/immersiveintelligence/ie_manual/en_us/ii_warfare/armortools/flagpole.md +++ b/src/main/resources/assets/immersiveintelligence/ie_manual/en_us/ii_warfare/armortools/flagpole.md @@ -2,6 +2,7 @@ Flagpole Stand for anthem! # 0 +@hammer;upgradeable;repairable;paintable |[multiblock]{mb:"II:Flagpole"}| The [flagpole] is a multiblock that allows marking of nearby territory, keeping it loaded and under control, while also displaying a [stylish banner] for friends and foes to recognise. To form it, use a [hammer](introduction#introductionHammer) on the middle razor wire block. diff --git a/src/main/resources/assets/immersiveintelligence/ie_manual/en_us/ii_warfare/staticdefense/emplacement.md b/src/main/resources/assets/immersiveintelligence/ie_manual/en_us/ii_warfare/staticdefense/emplacement.md index 598f65639..7d2b6f4cc 100644 --- a/src/main/resources/assets/immersiveintelligence/ie_manual/en_us/ii_warfare/staticdefense/emplacement.md +++ b/src/main/resources/assets/immersiveintelligence/ie_manual/en_us/ii_warfare/staticdefense/emplacement.md @@ -2,6 +2,7 @@ Emplacement Locked and Loaded! # 0 +@hammer;level_circuits;upgradeable;repairable;paintable |[multiblock]{mb:"II:Emplacement"}| **The Emplacement** is a heavy defensive structure used for protecting the perimeter of your factory. To form it, use a [hammer](introduction#introductionHammer) on the upper middle sandbag block. # 1 diff --git a/src/main/resources/assets/immersiveintelligence/ie_manual/en_us/ii_warfare/staticdefense/emplacement_weapons.md b/src/main/resources/assets/immersiveintelligence/ie_manual/en_us/ii_warfare/staticdefense/emplacement_weapons.md index 7892f1672..c3eb189d6 100644 --- a/src/main/resources/assets/immersiveintelligence/ie_manual/en_us/ii_warfare/staticdefense/emplacement_weapons.md +++ b/src/main/resources/assets/immersiveintelligence/ie_manual/en_us/ii_warfare/staticdefense/emplacement_weapons.md @@ -13,7 +13,7 @@ Take note, this weapon does not use [magazines](magazines.md). [Loose bullets ha # mg1 The **Machinegun** Emplacement comes in 3 variants: [Default], [Heavy Barreled], and [Water-Cooled], which are identical in function to those present in the [infantry version](machinegun.md).
|[upgrade_display]{upgrade:"immersiveintelligence:emplacement/machinegun/heavy_barrel"}| -|[upgrade_display]{upgrade:"immersiveintelligence:emplacement/machinegun/water_cooled_barrel"}| +|[upgrade_display]{upgrade:"immersiveintelligence:emplacement/machinegun/watercooled"}| # mg2 The **Machinegun** Emplacement can also be [fortified] to increase survivability in the field. |[upgrade_display]{upgrade:"immersiveintelligence:emplacement/machinegun/additional_fortifications"}| @@ -62,11 +62,11 @@ A beefed-up [Field Mortar](mortar.md), the [Mortar] emplacement provides powerfu A scaled-down version of the [Artillery Howitzer](artillery_howitzer.md), the [Light Howitzer] provides medium-range support and its mobility allows for quick and precise barrage of enemy positions. # mlrs **Rocket Launcher (MLRS)** -|[upgrade_display]{upgrade:"immersiveintelligence:emplacement/mlrs"}| +|[upgrade_display]{upgrade:"immersiveintelligence:emplacement/rocket_launcher"}| The [Multiple Launch Rocket System (MLRS)], or simply, the [Rocket Launcher], launches multiple unguided [rockets](bullet_production.md#heavy_ammuniton_assembler) at a specified target. Rockets are slow compared to bullets, so complex targeting in conjunction with the [Infrared Observer](#ir_observer0) may be required for maximum efficiency on moving targets. # guided_launcher0 **Guided Rocket Launcher** -|[upgrade_display]{upgrade:"immersiveintelligence:emplacement/guided_launcher"}| +|[upgrade_display]{upgrade:"immersiveintelligence:emplacement/guided_missile_launcher"}| Instead of multiple dumbfire rockets, the [Guided Rocket Launcher] fires a single, smart rocket that is steered toward the target. It is easier to hit moving targets compared to the dumbfire MLRS. # ir_observer0 **Infrared Observer** diff --git a/src/main/resources/assets/immersiveintelligence/lang/en_us.lang b/src/main/resources/assets/immersiveintelligence/lang/en_us.lang index 4b24ede41..d8ae94f19 100644 --- a/src/main/resources/assets/immersiveintelligence/lang/en_us.lang +++ b/src/main/resources/assets/immersiveintelligence/lang/en_us.lang @@ -1137,6 +1137,16 @@ machineupgrade.immersiveintelligence.emplacement.guided_missile_launcher.desc=Th machineupgrade.immersiveintelligence.emplacement.tesla=Tesla Tower machineupgrade.immersiveintelligence.emplacement.tesla.desc=The Tesla Tower uses high voltage to decimate enemies in its radius, it's especially effective against electronics +#Data Input Machine +machineupgrade.immersiveintelligence.advanced_data=Advanced Input Device +machineupgrade.immersiveintelligence.advanced_data.desc=Replaces the converted typewriter with a proper, fully electronic control panel, allowing the user to enter in advanced data types like Vector, Map and Array. + +#Arithmetic-Logic Machine +machineupgrade.immersiveintelligence.memory=Built-in Memory +machineupgrade.immersiveintelligence.memory.desc=Adds a page of built in memory to load and save the data operation results. +machineupgrade.immersiveintelligence.circuit_racks=Additional Circuit Racks +machineupgrade.immersiveintelligence.circuit_racks.desc=Adds racks that allow mounting two more circuit inside the machine. + #Other upgrades machineupgrade.immersiveintelligence.core_filler=Projectile Filler machineupgrade.immersiveintelligence.core_filler.desc=Equipping the Projectile Workshop with an inserter allows precise filling of the projectiles with desired components. @@ -2937,6 +2947,7 @@ ie.manual.entry.traits.paintable=Paintable ie.manual.entry.wip_warning0=Warning! Work-in-Progress Content. ie.manual.entry.wip_warning1=The Engineering Department is working hard to bring it to the front! +ie.manual.entry.wip_warning.upgrade=The feature may lack visuals or have no functionality, no not report this. ie.manual.entry.data_operation.inputs=Inputs ie.manual.entry.data_operation.output=Output diff --git a/src/main/resources/assets/immersiveintelligence/models/block/multiblock/arithmetic_logic_machine/arithmetic_logic_machine_preview.obj b/src/main/resources/assets/immersiveintelligence/models/block/multiblock/arithmetic_logic_machine/arithmetic_logic_machine_preview.obj new file mode 100644 index 000000000..75bef662c --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/models/block/multiblock/arithmetic_logic_machine/arithmetic_logic_machine_preview.obj @@ -0,0 +1,3503 @@ +# Made by Pabilo8 with Blockbench +# Exported with IIToolkit Plugin on 03/06/2026 +mtllib arithmetic_logic_machine.mtl + +o keyboard_door +v 0.8125 0.3141 0.0625 +v 0.8125 0.3141 0 +v 0.8125 -0.0062 0.0625 +v 0.8125 -0.0062 0 +v -0.1875 0.3141 0.0625 +v -0.1875 0.3141 0 +v -0.1875 -0.0062 0.0625 +v -0.1875 -0.0062 0 +vt 0.0469 0.6875 +vt 0.0469 0.7656 +vt 0.0313 0.7656 +vt 0.0313 0.6875 +vt 0.2813 0.6875 +vt 0.2813 0.7656 +vt 0.2656 0.7656 +vt 0.2656 0.6875 +vt 0.2813 0.75 +vt 0.2813 0.7656 +vt 0.0313 0.7656 +vt 0.0313 0.75 +vt 0.2813 0.6875 +vt 0.2813 0.7031 +vt 0.0313 0.7031 +vt 0.0313 0.6875 +vt 0.2813 0.6875 +vt 0.2813 0.7656 +vt 0.0313 0.7656 +vt 0.0313 0.6875 +vt 0.0313 0.6875 +vt 0.0313 0.7656 +vt 0.2813 0.7656 +vt 0.2813 0.6875 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +usemtl arithmetic_logic_machine +f 4/1/1 2/2/1 1/3/1 3/4/1 +f 7/5/2 5/6/2 6/7/2 8/8/2 +f 1/9/3 2/10/3 6/11/3 5/12/3 +f 4/13/4 3/14/4 7/15/4 8/16/4 +f 3/17/5 1/18/5 5/19/5 7/20/5 +f 8/21/6 6/22/6 2/23/6 4/24/6 +o keyboard +v 0.7188 0.2656 0.7813 +v 0.7188 0.2656 0.4688 +v 0.7188 0.2031 0.7813 +v 0.7188 0.2031 0.4688 +v 0.1563 0.2656 0.7813 +v 0.1563 0.2656 0.4688 +v 0.1563 0.2031 0.7813 +v 0.1563 0.2031 0.4688 +v 0.4375 0.2188 0.875 +v 0.4375 0.2188 0.8125 +v 0.4375 0.0313 0.875 +v 0.4375 0.0313 0.8125 +v 0.25 0.2188 0.875 +v 0.25 0.2188 0.8125 +v 0.25 0.0313 0.875 +v 0.25 0.0313 0.8125 +v 0.4063 0.1875 1.4375 +v 0.4063 0.1875 0.875 +v 0.4063 0.0625 1.4375 +v 0.4063 0.0625 0.875 +v 0.2813 0.1875 1.4375 +v 0.2813 0.1875 0.875 +v 0.2813 0.0625 1.4375 +v 0.2813 0.0625 0.875 +v 0.6875 0.2188 0.875 +v 0.6875 0.2188 0.8125 +v 0.6875 0.0313 0.875 +v 0.6875 0.0313 0.8125 +v 0.5 0.2188 0.875 +v 0.5 0.2188 0.8125 +v 0.5 0.0313 0.875 +v 0.5 0.0313 0.8125 +v 0.6563 0.1875 1.4375 +v 0.6563 0.1875 0.875 +v 0.6563 0.0625 1.4375 +v 0.6563 0.0625 0.875 +v 0.5313 0.1875 1.4375 +v 0.5313 0.1875 0.875 +v 0.5313 0.0625 1.4375 +v 0.5313 0.0625 0.875 +v 0.75 0.2789 0.4209 +v 0.75 0.137 0.1425 +v 0.75 0.2232 0.4493 +v -0.125 0.2789 0.4209 +v -0.125 0.137 0.1425 +v -0.125 0.2232 0.4493 +v -0.125 0.0813 0.1709 +v 0.0625 0.137 0.1425 +v 0.0625 0.0813 0.1709 +v -0.125 0.137 0.1425 +v -0.125 0.0813 0.1709 +v 0.75 0.137 0.1425 +v 0.75 0.1086 0.0868 +v 0.75 0.0529 0.1152 +v 0.0625 0.137 0.1425 +v 0.0625 0.1086 0.0868 +v 0.0625 0.0813 0.1709 +v 0.0625 0.0529 0.1152 +v 0.0625 0.1086 0.0868 +v 0.0625 0.0803 0.0311 +v 0.0625 0.0529 0.1152 +v 0.0625 0.0246 0.0595 +v -0.125 0.1086 0.0868 +v -0.125 0.0803 0.0311 +v -0.125 0.0529 0.1152 +v -0.125 0.0246 0.0595 +v 0 0.137 0.1425 +v 0 0.1086 0.0868 +v 0 0.0813 0.1709 +v 0 0.0529 0.1152 +v -0.0625 0.137 0.1425 +v -0.0625 0.1086 0.0868 +v -0.0625 0.0813 0.1709 +v -0.0625 0.0529 0.1152 +v 0.75 0.2188 0.8125 +v 0.75 0.2188 0.4375 +v 0.75 0.0313 0.8125 +v 0.75 0.0313 0.0625 +v -0.125 0.2188 0.8125 +v -0.125 0.2188 0.4375 +v -0.125 0.0313 0.8125 +v -0.125 0.0313 0.0625 +v 0.8125 0.1875 1.4375 +v 0.8125 0.1875 0.4375 +v 0.8125 0.0625 1.4375 +v 0.8125 0.0625 0.4375 +v 0.75 0.1875 1.4375 +v 0.75 0.1875 0.4375 +v 0.75 0.0625 1.4375 +v 0.75 0.0625 0.4375 +v -0.125 0.1875 1.4375 +v -0.125 0.1875 0.4375 +v -0.125 0.0625 1.4375 +v -0.125 0.0625 0.4375 +v -0.1875 0.1875 1.4375 +v -0.1875 0.1875 0.4375 +v -0.1875 0.0625 1.4375 +v -0.1875 0.0625 0.4375 +vt 0.5625 0.8438 +vt 0.5938 0.8438 +vt 0.5938 1 +vt 0.5625 1 +vt 0.8125 0.8438 +vt 0.8438 0.8438 +vt 0.8438 1 +vt 0.8125 1 +vt 0.8438 0.8438 +vt 0.8438 1 +vt 0.5625 1 +vt 0.5625 0.8438 +vt 0.8438 0.9688 +vt 0.8438 1 +vt 0.5625 1 +vt 0.5625 0.9688 +vt 0.8438 0.8438 +vt 0.8438 0.875 +vt 0.5625 0.875 +vt 0.5625 0.8438 +vt 0.5156 0.7188 +vt 0.5156 0.7656 +vt 0.5 0.7656 +vt 0.5 0.7188 +vt 0.4844 0.7188 +vt 0.4844 0.7656 +vt 0.4688 0.7656 +vt 0.4688 0.7188 +vt 0.5156 0.75 +vt 0.5156 0.7656 +vt 0.4688 0.7656 +vt 0.4688 0.75 +vt 0.5156 0.7188 +vt 0.5156 0.7344 +vt 0.4688 0.7344 +vt 0.4688 0.7188 +vt 0.5156 0.7188 +vt 0.5156 0.7656 +vt 0.4688 0.7656 +vt 0.4688 0.7188 +vt 0.5625 1 +vt 0.6875 1 +vt 0.6875 0.4375 +vt 0.5625 0.4375 +vt 0.6875 0.4375 +vt 0.5625 0.4375 +vt 0.5625 1 +vt 0.6875 1 +vt 0.6875 0.4375 +vt 0.6875 1 +vt 0.5625 1 +vt 0.5625 0.4375 +vt 0.5625 1 +vt 0.5625 0.4375 +vt 0.6875 0.4375 +vt 0.6875 1 +vt 0.5156 0.7188 +vt 0.5156 0.7656 +vt 0.5 0.7656 +vt 0.5 0.7188 +vt 0.4844 0.7188 +vt 0.4844 0.7656 +vt 0.4688 0.7656 +vt 0.4688 0.7188 +vt 0.5156 0.75 +vt 0.5156 0.7656 +vt 0.4688 0.7656 +vt 0.4688 0.75 +vt 0.5156 0.7188 +vt 0.5156 0.7344 +vt 0.4688 0.7344 +vt 0.4688 0.7188 +vt 0.5156 0.7188 +vt 0.5156 0.7656 +vt 0.4688 0.7656 +vt 0.4688 0.7188 +vt 0.5625 1 +vt 0.6875 1 +vt 0.6875 0.4375 +vt 0.5625 0.4375 +vt 0.6875 0.4375 +vt 0.5625 0.4375 +vt 0.5625 1 +vt 0.6875 1 +vt 0.6875 0.4375 +vt 0.6875 1 +vt 0.5625 1 +vt 0.5625 0.4375 +vt 0.5625 1 +vt 0.5625 0.4375 +vt 0.6875 0.4375 +vt 0.6875 1 +vt 0.7813 0.7188 +vt 0.7813 0.6406 +vt 1 0.6406 +vt 1 0.7188 +vt 0.7813 0.7031 +vt 0.7813 0.7188 +vt 1 0.7188 +vt 1 0.7031 +vt 1 0.7188 +vt 0.9844 0.7188 +vt 0.9844 0.6406 +vt 1 0.6406 +vt 1 0.6406 +vt 1 0.6563 +vt 0.9531 0.6563 +vt 0.9531 0.6406 +vt 0.9531 0.625 +vt 0.9531 0.6406 +vt 0.9375 0.6406 +vt 0.9375 0.625 +vt 0.7813 0.625 +vt 0.7813 0.6406 +vt 0.9531 0.6406 +vt 0.9531 0.625 +vt 0.9531 0.625 +vt 0.9531 0.6406 +vt 0.7813 0.6406 +vt 0.7813 0.625 +vt 0.9688 0.6094 +vt 0.9688 0.625 +vt 0.9531 0.625 +vt 0.9531 0.6094 +vt 1 0.6094 +vt 1 0.625 +vt 0.9531 0.625 +vt 0.9531 0.6094 +vt 1 0.6094 +vt 1 0.625 +vt 0.9531 0.625 +vt 0.9531 0.6094 +vt 1 0.6094 +vt 1 0.625 +vt 0.9531 0.625 +vt 0.9531 0.6094 +vt 1 0.625 +vt 0.9844 0.625 +vt 0.9844 0.6094 +vt 1 0.6094 +vt 0.9844 0.625 +vt 0.9844 0.6406 +vt 0.9688 0.6406 +vt 0.9688 0.625 +vt 0.9844 0.625 +vt 0.9844 0.6406 +vt 0.9688 0.6406 +vt 0.9688 0.625 +vt 0.9844 0.625 +vt 0.9844 0.6406 +vt 0.9688 0.6406 +vt 0.9688 0.625 +vt 0.7813 0.625 +vt 0.7813 0.7188 +vt 0.7969 0.7188 +vt 0.7969 0.625 +vt 0.4375 0.625 +vt 0.5313 0.8125 +vt 0.5313 1 +vt 0.4375 1 +vt 0.4375 1 +vt 0.5313 1 +vt 0.5313 0.8125 +vt 0.4375 0.625 +vt 0.4375 0.8125 +vt 0.4375 1 +vt 0 1 +vt 0 0.8125 +vt 0.4375 0.625 +vt 0.4375 1 +vt 0 1 +vt 0 0.625 +vt 0.4688 0.0313 +vt 0.4688 0.125 +vt 0.0313 0.125 +vt 0.0313 0.0313 +vt 0.4375 0.625 +vt 0.4375 0.8438 +vt 0 0.8438 +vt 0 0.625 +vt 0.875 0.5 +vt 0.9375 0.5 +vt 0.9375 1 +vt 0.875 1 +vt 0.875 0.5 +vt 0.9375 0.5 +vt 0.9375 1 +vt 0.875 1 +vt 0.9375 0.5 +vt 0.9375 1 +vt 0.9063 1 +vt 0.9063 0.5 +vt 0.9063 0.5 +vt 0.9063 1 +vt 0.875 1 +vt 0.875 0.5 +vt 0.875 0.9688 +vt 0.9375 0.9688 +vt 0.9375 1 +vt 0.875 1 +vt 0.875 0.9688 +vt 0.9375 0.9688 +vt 0.9375 1 +vt 0.875 1 +vt 0.875 0.5 +vt 0.9375 0.5 +vt 0.9375 1 +vt 0.875 1 +vt 0.875 0.5 +vt 0.9375 0.5 +vt 0.9375 1 +vt 0.875 1 +vt 0.9375 0.5 +vt 0.9375 1 +vt 0.9063 1 +vt 0.9063 0.5 +vt 0.9063 0.5 +vt 0.9063 1 +vt 0.875 1 +vt 0.875 0.5 +vt 0.875 0.5313 +vt 0.9375 0.5313 +vt 0.9375 0.5625 +vt 0.875 0.5625 +vt 0.875 0.9375 +vt 0.9375 0.9375 +vt 0.9375 0.9688 +vt 0.875 0.9688 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0.89 -0.45 +vn 0 0.45 0.89 +vn -1 0 0 +vn 0 -0.45 -0.89 +vn -1 0 0 +vn 0 0.89 -0.45 +vn 0 -0.45 -0.89 +vn 1 0 0 +vn 0 0.89 -0.45 +vn 0 0.45 0.89 +vn 0 -0.45 -0.89 +vn -1 0 0 +vn 1 0 0 +vn -1 0 0 +vn 0 0.89 -0.45 +vn 1 0 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0.89 -0.45 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +usemtl typewriter_red +f 12/25/7 10/26/7 9/27/7 11/28/7 +f 15/29/8 13/30/8 14/31/8 16/32/8 +f 9/33/9 10/34/9 14/35/9 13/36/9 +f 11/37/10 9/38/10 13/39/10 15/40/10 +f 16/41/11 14/42/11 10/43/11 12/44/11 +usemtl arithmetic_logic_machine +f 20/45/12 18/46/12 17/47/12 19/48/12 +f 23/49/13 21/50/13 22/51/13 24/52/13 +f 17/53/14 18/54/14 22/55/14 21/56/14 +f 20/57/15 19/58/15 23/59/15 24/60/15 +f 19/61/16 17/62/16 21/63/16 23/64/16 +usemtl common_copper_cable +f 28/65/17 26/66/17 25/67/17 27/68/17 +f 31/69/18 29/70/18 30/71/18 32/72/18 +f 25/73/19 26/74/19 30/75/19 29/76/19 +f 28/77/20 27/78/20 31/79/20 32/80/20 +usemtl arithmetic_logic_machine +f 36/81/21 34/82/21 33/83/21 35/84/21 +f 39/85/22 37/86/22 38/87/22 40/88/22 +f 33/89/23 34/90/23 38/91/23 37/92/23 +f 36/93/24 35/94/24 39/95/24 40/96/24 +f 35/97/25 33/98/25 37/99/25 39/100/25 +usemtl common_copper_cable +f 44/101/26 42/102/26 41/103/26 43/104/26 +f 47/105/27 45/106/27 46/107/27 48/108/27 +f 41/109/28 42/110/28 46/111/28 45/112/28 +f 44/113/29 43/114/29 47/115/29 48/116/29 +usemtl common_thingies +f 49/117/30 50/118/30 53/119/30 52/120/30 +f 51/121/31 49/122/31 52/123/31 54/124/31 +f 54/125/32 52/126/32 53/127/32 55/128/32 +f 59/129/33 58/130/33 56/131/33 57/132/33 +f 65/133/34 63/134/34 64/135/34 66/136/34 +f 60/137/35 61/138/35 64/139/35 63/140/35 +f 66/141/36 64/142/36 61/143/36 62/144/36 +f 70/145/37 68/146/37 67/147/37 69/148/37 +f 67/149/38 68/150/38 72/151/38 71/152/38 +f 69/153/39 67/154/39 71/155/39 73/156/39 +f 74/157/40 72/158/40 68/159/40 70/160/40 +f 71/161/41 72/162/41 74/163/41 73/164/41 +f 78/165/42 76/166/42 75/167/42 77/168/42 +f 81/169/43 79/170/43 80/171/43 82/172/43 +f 75/173/44 76/174/44 80/175/44 79/176/44 +f 61/177/45 49/178/45 51/179/45 62/180/45 +usemtl typewriter_red +f 86/181/46 84/182/46 83/183/46 85/184/46 +f 89/185/47 87/186/47 88/187/47 90/188/47 +f 83/189/48 84/190/48 88/191/48 87/192/48 +f 86/193/49 85/194/49 89/195/49 90/196/49 +f 85/197/50 83/198/50 87/199/50 89/200/50 +f 90/201/51 88/202/51 84/203/51 86/204/51 +f 94/205/52 92/206/52 91/207/52 93/208/52 +f 97/209/53 95/210/53 96/211/53 98/212/53 +f 91/213/54 92/214/54 96/215/54 95/216/54 +f 94/217/55 93/218/55 97/219/55 98/220/55 +f 93/221/56 91/222/56 95/223/56 97/224/56 +f 98/225/57 96/226/57 92/227/57 94/228/57 +f 102/229/58 100/230/58 99/231/58 101/232/58 +f 105/233/59 103/234/59 104/235/59 106/236/59 +f 99/237/60 100/238/60 104/239/60 103/240/60 +f 102/241/61 101/242/61 105/243/61 106/244/61 +f 101/245/62 99/246/62 103/247/62 105/248/62 +f 106/249/63 104/250/63 100/251/63 102/252/63 +o keyboard_button +v -0.5625 0.2344 0 +v -0.5625 0.2344 -0.0625 +v -0.5625 0.1094 0 +v -0.5625 0.1094 -0.0625 +v -0.6875 0.2344 0 +v -0.6875 0.2344 -0.0625 +v -0.6875 0.1094 0 +v -0.6875 0.1094 -0.0625 +vt 0.7344 0.6094 +vt 0.7344 0.6406 +vt 0.75 0.6406 +vt 0.75 0.6094 +vt 0.7188 0.6094 +vt 0.7188 0.6406 +vt 0.7344 0.6406 +vt 0.7344 0.6094 +vt 0.75 0.6406 +vt 0.75 0.625 +vt 0.7188 0.625 +vt 0.7188 0.6406 +vt 0.75 0.6094 +vt 0.75 0.625 +vt 0.7188 0.625 +vt 0.7188 0.6094 +vt 0.7188 0.6094 +vt 0.7188 0.6406 +vt 0.75 0.6406 +vt 0.75 0.6094 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +usemtl arithmetic_logic_machine +f 110/253/64 108/254/64 107/255/64 109/256/64 +f 113/257/65 111/258/65 112/259/65 114/260/65 +f 107/261/66 108/262/66 112/263/66 111/264/66 +f 110/265/67 109/266/67 113/267/67 114/268/67 +f 114/269/68 112/270/68 108/271/68 110/272/68 +o drawer +v 0.4375 -0.25 -0.9375 +v 0.4375 -0.25 -1 +v 0.4375 -0.375 -0.9375 +v 0.4375 -0.375 -1 +v 0.3125 -0.25 -0.9375 +v 0.3125 -0.25 -1 +v 0.3125 -0.375 -0.9375 +v 0.3125 -0.375 -1 +v 0.75 -0.1875 -0.875 +v 0.75 -0.1875 -0.9375 +v 0.75 -0.4375 -0.875 +v 0.75 -0.4375 -0.9375 +v 0 -0.1875 -0.875 +v 0 -0.1875 -0.9375 +v 0 -0.4375 -0.875 +v 0 -0.4375 -0.9375 +v 0.7188 -0.3437 -0.375 +v 0.7188 -0.3437 -0.875 +v 0.7188 -0.4062 -0.375 +v 0.7188 -0.4062 -0.875 +v 0.0313 -0.3437 -0.375 +v 0.0313 -0.3437 -0.875 +v 0.0313 -0.4062 -0.375 +v 0.0313 -0.4062 -0.875 +v 0.0938 -0.2187 -0.375 +v 0.0938 -0.2187 -0.875 +v 0.0938 -0.3437 -0.375 +v 0.0938 -0.3437 -0.875 +v 0.0313 -0.2187 -0.375 +v 0.0313 -0.2187 -0.875 +v 0.0313 -0.3437 -0.375 +v 0.0313 -0.3437 -0.875 +v 0.7188 -0.2187 -0.375 +v 0.7188 -0.2187 -0.875 +v 0.7188 -0.3437 -0.375 +v 0.7188 -0.3437 -0.875 +v 0.6563 -0.2187 -0.375 +v 0.6563 -0.2187 -0.875 +v 0.6563 -0.3437 -0.375 +v 0.6563 -0.3437 -0.875 +vt 0.9844 0.2813 +vt 0.9844 0.3125 +vt 1 0.3125 +vt 1 0.2813 +vt 0.9688 0.2813 +vt 0.9688 0.3125 +vt 0.9844 0.3125 +vt 0.9844 0.2813 +vt 1 0.3125 +vt 1 0.2969 +vt 0.9688 0.2969 +vt 0.9688 0.3125 +vt 1 0.2813 +vt 1 0.2969 +vt 0.9688 0.2969 +vt 0.9688 0.2813 +vt 0.9688 0.2813 +vt 0.9688 0.3125 +vt 1 0.3125 +vt 1 0.2813 +vt 0.8125 0.3906 +vt 0.8125 0.4531 +vt 0.7969 0.4531 +vt 0.7969 0.3906 +vt 0.9844 0.3906 +vt 0.9844 0.4531 +vt 0.9688 0.4531 +vt 0.9688 0.3906 +vt 0.7813 0.25 +vt 0.7656 0.25 +vt 0.7656 0.0625 +vt 0.7813 0.0625 +vt 1 0.25 +vt 0.9844 0.25 +vt 0.9844 0.0625 +vt 1 0.0625 +vt 0.9844 0.3906 +vt 0.9844 0.4531 +vt 0.7969 0.4531 +vt 0.7969 0.3906 +vt 0.9844 0.3906 +vt 0.9844 0.4531 +vt 0.7969 0.4531 +vt 0.7969 0.3906 +vt 0.9688 0.25 +vt 0.9531 0.25 +vt 0.9531 0.125 +vt 0.9688 0.125 +vt 0.8125 0.125 +vt 0.7969 0.125 +vt 0.7969 0.25 +vt 0.8125 0.25 +vt 0.9688 0.25 +vt 0.9688 0.375 +vt 0.7969 0.375 +vt 0.7969 0.25 +vt 0.9688 0.25 +vt 0.9688 0.125 +vt 0.7969 0.125 +vt 0.7969 0.25 +vt 0.9375 0.0781 +vt 0.9375 0.0938 +vt 0.7656 0.0938 +vt 0.7656 0.0781 +vt 0.8281 0.375 +vt 0.7969 0.375 +vt 0.7969 0.25 +vt 0.8281 0.25 +vt 0.8281 0.375 +vt 0.7969 0.375 +vt 0.7969 0.25 +vt 0.8281 0.25 +vt 0.7969 0.375 +vt 0.7969 0.25 +vt 0.8125 0.25 +vt 0.8125 0.375 +vt 0.9375 0.375 +vt 0.9688 0.375 +vt 0.9688 0.25 +vt 0.9375 0.25 +vt 0.9375 0.375 +vt 0.9688 0.375 +vt 0.9688 0.25 +vt 0.9375 0.25 +vt 0.9531 0.375 +vt 0.9531 0.25 +vt 0.9375 0.25 +vt 0.9375 0.375 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +usemtl common_table +f 118/273/69 116/274/69 115/275/69 117/276/69 +f 121/277/70 119/278/70 120/279/70 122/280/70 +f 115/281/71 116/282/71 120/283/71 119/284/71 +f 118/285/72 117/286/72 121/287/72 122/288/72 +f 122/289/73 120/290/73 116/291/73 118/292/73 +f 126/293/74 124/294/74 123/295/74 125/296/74 +f 129/297/75 127/298/75 128/299/75 130/300/75 +f 123/301/76 124/302/76 128/303/76 127/304/76 +f 126/305/77 125/306/77 129/307/77 130/308/77 +f 125/309/78 123/310/78 127/311/78 129/312/78 +f 130/313/79 128/314/79 124/315/79 126/316/79 +f 134/317/80 132/318/80 131/319/80 133/320/80 +f 137/321/81 135/322/81 136/323/81 138/324/81 +f 131/325/82 132/326/82 136/327/82 135/328/82 +f 134/329/83 133/330/83 137/331/83 138/332/83 +f 138/333/84 136/334/84 132/335/84 134/336/84 +f 142/337/85 140/338/85 139/339/85 141/340/85 +f 145/341/86 143/342/86 144/343/86 146/344/86 +f 139/345/87 140/346/87 144/347/87 143/348/87 +f 150/349/88 148/350/88 147/351/88 149/352/88 +f 153/353/89 151/354/89 152/355/89 154/356/89 +f 147/357/90 148/358/90 152/359/90 151/360/90 +o activity_lamp +v -0.5094 1.85 0.1281 +v -0.5094 1.85 0.0219 +v -0.5094 1.7125 0.1281 +v -0.5094 1.7125 0.0219 +v -0.6469 1.85 0.1281 +v -0.6469 1.85 0.0219 +v -0.6469 1.7125 0.1281 +v -0.6469 1.7125 0.0219 +vt 0.6797 0.7813 +vt 0.6797 0.8125 +vt 0.6563 0.8125 +vt 0.6563 0.7813 +vt 0.6875 0.7813 +vt 0.6875 0.8125 +vt 0.6641 0.8125 +vt 0.6641 0.7813 +vt 0.6875 0.7891 +vt 0.6875 0.8125 +vt 0.6563 0.8125 +vt 0.6563 0.7891 +vt 0.6875 0.7813 +vt 0.6875 0.8047 +vt 0.6563 0.8047 +vt 0.6563 0.7813 +vt 0.6875 0.7813 +vt 0.6875 0.8125 +vt 0.6563 0.8125 +vt 0.6563 0.7813 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +usemtl arithmetic_logic_machine +f 158/361/91 156/362/91 155/363/91 157/364/91 +f 161/365/92 159/366/92 160/367/92 162/368/92 +f 155/369/93 156/370/93 160/371/93 159/372/93 +f 158/373/94 157/374/94 161/375/94 162/376/94 +f 162/377/95 160/378/95 156/379/95 158/380/95 +o preview +v -1.3217 1.9375 -0.8711 +v -1.1782 1.9375 -0.5246 +v -1.3217 1.625 -0.8711 +v -1.1782 1.625 -0.5246 +v -1.3756 0.25 -0.9171 +v -0.9929 0.25 0.0067 +v -1.3178 1.625 -0.9411 +v -0.9351 1.625 -0.0172 +v -1.3178 0.25 -0.9411 +v -0.9351 0.25 -0.0172 +v -1.2081 2 -0.5129 +v -0.9929 2 0.0067 +v -1.2081 1.625 -0.5129 +v -0.9929 1.625 0.0067 +v -1.1504 2 -0.5369 +v -0.9351 2 -0.0172 +v -1.1504 1.625 -0.5369 +v -1.3756 2 -0.9171 +v -1.3517 2 -0.8594 +v -1.3756 1.625 -0.9171 +v -1.3517 1.625 -0.8594 +v -1.3178 2 -0.9411 +v -1.2939 2 -0.8833 +v -1.2939 1.625 -0.8833 +v -1.3517 1.9375 -0.8594 +v -1.2081 1.9375 -0.5129 +v -1.2939 1.9375 -0.8833 +v -1.1504 1.9375 -0.5369 +v -0.9929 0.9375 0.0067 +v -1.3756 0.9375 -0.9171 +v 0.9732 2 0.0128 +v 1.4349 2 -0.8743 +v 0.9732 0.25 0.0128 +v 1.4349 0.25 -0.8743 +v 0.9178 2 -0.0161 +v 1.3795 2 -0.9031 +v 0.9178 0.25 -0.0161 +v 1.3795 0.25 -0.9031 +v 1.4349 1.125 -0.8743 +v 0.9732 1.125 0.0128 +v 0.9178 1.125 -0.0161 +v 1.3795 1.125 -0.9031 +vt 0.6719 0 +vt 0.5938 0 +vt 0.5938 0.0938 +vt 0.6719 0.0938 +vt 0.6719 0.0938 +vt 0.5938 0.0938 +vt 0.5938 0 +vt 0.6719 0 +vt 1 0.25 +vt 1 0.5938 +vt 0.75 0.5938 +vt 0.75 0.25 +vt 1 0.9063 +vt 1 1 +vt 0.8594 1 +vt 0.8594 0.9063 +vt 0.8594 0.9063 +vt 0.8594 1 +vt 1 1 +vt 1 0.9063 +vt 0.875 0.9063 +vt 0.875 1 +vt 0.8594 1 +vt 0.8594 0.9063 +vt 0.7656 0.8438 +vt 0.7656 0.9375 +vt 0.75 0.9375 +vt 0.75 0.8438 +vt 0.7656 0.9063 +vt 0.7656 1 +vt 0.75 1 +vt 0.75 0.9063 +vt 0.7656 0.9063 +vt 0.7656 1 +vt 0.75 1 +vt 0.75 0.9063 +vt 0.8594 0.9844 +vt 0.8594 1 +vt 0.7656 1 +vt 0.7656 0.9844 +vt 0.8594 0.9844 +vt 0.8594 1 +vt 0.7656 1 +vt 0.7656 0.9844 +vt 0.7656 1 +vt 0.8594 1 +vt 0.8594 0.9844 +vt 0.7656 0.9844 +vt 0.875 0.9031 +vt 0.875 0.9188 +vt 0.8594 0.9188 +vt 0.8594 0.9031 +vt 0.7656 0.5 +vt 0.7656 0.9375 +vt 0.75 0.9375 +vt 0.75 0.5 +vt 0.8594 0.9219 +vt 0.7656 0.9219 +vt 0.7656 0.9063 +vt 0.8594 0.9063 +vt 1 0.5 +vt 1 0.9375 +vt 0.9844 0.9375 +vt 0.9844 0.5 +vt 0.75 1 +vt 1 1 +vt 1 0.9844 +vt 0.75 0.9844 +vt 1 0.5156 +vt 0.75 0.5156 +vt 0.75 0.5 +vt 1 0.5 +vt 0.75 0.6094 +vt 0.75 0.4375 +vt 1 0.4375 +vt 1 0.6094 +vt 1 0.25 +vt 1 0.4219 +vt 0.75 0.4219 +vt 0.75 0.25 +vt 0.75 1 +vt 0.75 0.7813 +vt 1 0.7813 +vt 1 1 +vt 0.75 1 +vt 0.75 0.7813 +vt 1 0.7813 +vt 1 1 +vt 1 1 +vt 0.75 1 +vt 0.75 0.9844 +vt 1 0.9844 +vt 1 0.2656 +vt 0.75 0.2656 +vt 0.75 0.25 +vt 1 0.25 +vt 0.75 1 +vt 0.75 0.7813 +vt 0.7656 0.7813 +vt 0.7656 1 +vt 0.9844 1 +vt 0.9844 0.7813 +vt 1 0.7813 +vt 1 1 +vt 1 0.25 +vt 1 0.4688 +vt 0.75 0.4688 +vt 0.75 0.25 +vt 0.7656 0.25 +vt 0.7656 0.4688 +vt 0.75 0.4688 +vt 0.75 0.25 +vt 1 0.25 +vt 1 0.4688 +vt 0.75 0.4688 +vt 0.75 0.25 +vt 1 0.25 +vt 1 0.4688 +vt 0.9844 0.4688 +vt 0.9844 0.25 +vn -0.92 0 0.38 +vn 0.92 0 -0.38 +vn 0.92 0 -0.38 +vn -0.92 0 0.38 +vn 0.92 0 -0.38 +vn -0.38 0 -0.92 +vn -0.92 0 0.38 +vn 0.92 0 -0.38 +vn 0.38 0 0.92 +vn -0.92 0 0.38 +vn 0.92 0 -0.38 +vn 0 -1 0 +vn 0.38 0 0.92 +vn -0.38 0 -0.92 +vn 0 1 0 +vn 0.38 0 0.92 +vn 0 1 0 +vn 0 -1 0 +vn -0.92 0 0.38 +vn -0.92 0 0.38 +vn 0.89 0 0.46 +vn -0.89 0 -0.46 +vn 0 1 0 +vn 0 -1 0 +vn -0.46 0 0.89 +vn 0.46 0 -0.89 +vn 0.89 0 0.46 +vn -0.46 0 0.89 +vn -0.89 0 -0.46 +vn 0.46 0 -0.89 +usemtl arithmetic_logic_machine +f 166/381/96 164/382/96 163/383/96 165/384/96 +f 165/385/97 163/386/97 164/387/97 166/388/97 +usemtl common_steel +f 171/389/98 169/390/98 170/391/98 172/392/98 +f 176/393/99 174/394/99 173/395/99 175/396/99 +f 179/397/100 177/398/100 178/399/100 170/400/100 +f 175/401/101 173/402/101 177/403/101 179/404/101 +f 183/405/102 181/406/102 180/407/102 182/408/102 +f 169/409/103 184/410/103 185/411/103 186/412/103 +f 186/413/104 185/414/104 181/415/104 183/416/104 +f 188/417/105 173/418/105 181/419/105 187/420/105 +f 189/421/106 185/422/106 177/423/106 190/424/106 +f 188/425/107 187/426/107 189/427/107 190/428/107 +f 190/429/108 177/430/108 173/431/108 188/432/108 +f 167/433/109 180/434/109 184/435/109 171/436/109 +f 183/437/110 175/438/110 179/439/110 186/440/110 +f 172/441/111 178/442/111 174/443/111 168/444/111 +f 180/445/112 174/446/112 178/447/112 184/448/112 +f 168/449/113 167/450/113 171/451/113 172/452/113 +f 182/453/114 192/454/114 191/455/114 176/456/114 +f 168/457/115 191/458/115 192/459/115 167/460/115 +f 193/461/116 202/462/116 201/463/116 194/464/116 +f 198/465/117 204/466/117 203/467/117 197/468/117 +f 193/469/118 194/470/118 198/471/118 197/472/118 +f 196/473/119 195/474/119 199/475/119 200/476/119 +f 197/477/120 203/478/120 202/479/120 193/480/120 +f 194/481/121 201/482/121 204/483/121 198/484/121 +f 196/485/122 201/486/122 202/487/122 195/488/122 +f 195/489/123 202/490/123 203/491/123 199/492/123 +f 199/493/124 203/494/124 204/495/124 200/496/124 +f 200/497/125 204/498/125 201/499/125 196/500/125 +o flipped +v 0.1917 -0.375 -0.1594 +v 0.0142 -0.375 -0.7587 +v 0.1917 -0.6875 -0.1594 +v 0.0142 -0.6875 -0.7587 +v -0.6473 -0.375 0.0891 +v -0.8248 -0.375 -0.5102 +v -0.6473 -0.6875 0.0891 +v -0.8248 -0.6875 -0.5102 +v -0.75 0.2344 0 +v -0.75 0.2344 -0.0625 +v -0.75 0.1094 0 +v -0.75 0.1094 -0.0625 +v -0.875 0.2344 0 +v -0.875 0.2344 -0.0625 +v -0.875 0.1094 0 +v -0.875 0.1094 -0.0625 +v 1 2 1 +v 1 2 0 +v -1 2 1 +v -1 2 0 +v 1 1.9375 0 +v 1 0 0 +v 0.9375 1.9375 0.9375 +v 0.9375 1.9375 0 +v 0.9375 0 0.9375 +v 0.9375 0 0 +v -0.9375 1.9375 0.9375 +v -0.9375 1.9375 0 +v -0.9375 0 0 +v -1 1.9375 0 +v -1 0 0 +v 1 0 1 +v -1 0 1 +v -0.9375 0 0.9375 +v -0.9375 0.9688 0.9375 +v 0.9375 0.9688 0.9375 +v 1 1.375 2 +v 1 1.375 1 +v 1 -0.375 2 +v 1 -0.375 1 +v 0 1.375 2 +v 0 -0.375 2 +v 1 1.9375 2 +v 1 1.9375 1.875 +v 1 1.375 1.875 +v 0.875 1.9375 2 +v 0.9375 1.9375 1.9375 +v 0.875 1.375 2 +v 0.9375 1.375 1.9375 +v 0.125 1.9375 2 +v 0.125 1.9375 1.9375 +v 0.125 1.375 2 +v 0.125 1.375 1.9375 +v 0 1.9375 2 +v 1 1.9375 1.125 +v 1 1.9375 1 +v 1 1.375 1.125 +v 0.9375 1.9375 1.125 +v 0.9375 1.375 1.125 +v 1 -0.375 1.125 +v 1 -0.6875 1.125 +v 1 -0.6875 1 +v 0.9375 -0.375 1.125 +v 0.9375 -0.6875 1.125 +v 1 -0.375 1.875 +v 1 -0.6875 2 +v 1 -0.6875 1.875 +v 0.875 -0.375 2 +v 0.9375 -0.375 1.9375 +v 0.875 -0.6875 2 +v 0.9375 -0.6875 1.9375 +v 0.125 -0.375 2 +v 0.125 -0.375 1.9375 +v 0.125 -0.6875 2 +v 0.125 -0.6875 1.9375 +v 0 -0.6875 2 +v 1 2 2 +v 0 2 2 +v 0 2 1 +v 1 -1 2 +v 1 -1 1 +v 0 -1 2 +v 0 -1 1 +v 0 1 2 +v 0 1 1 +v -1 1 2 +v -1 1 1 +v -1 -1 2 +v -1 -1 1 +v 0.9375 0.25 0.9375 +v -0.9375 0.25 0.9375 +v 1 -1 0 +v -1 -1 0 +v 0 -1 0 +v 0 0 0 +v 1 -0.125 0.125 +v 1 -0.125 0.875 +v 1 -0.875 0.125 +v 1 -0.875 0.875 +v 0.9375 -0.125 0.125 +v 0.9375 -0.125 0.875 +v 0.9375 -0.875 0.125 +v 0.9375 -0.875 0.875 +v -0.9375 -0.125 0.125 +v -0.9375 -0.125 0.875 +v -0.9375 -0.875 0.125 +v -0.9375 -0.875 0.875 +v -1 -0.125 0.125 +v -1 -0.125 0.875 +v -1 -0.875 0.875 +v -1 -0.875 0.125 +v 0.9375 0.3125 0 +v -0.9375 0.3125 0 +v -0.1875 0.3125 0 +v -0.1875 0 0 +v 0.8129 0 0 +v 0.8131 0.3125 0 +v 0.9375 0.3125 1 +v -0.9375 0.3125 1 +v 0.8902 0.4375 0.8693 +v 0.6785 0.4375 0.0203 +v 0.8902 0.3125 0.8693 +v 0.6785 0.3125 0.0203 +v 0.7689 0.4375 0.8995 +v 0.5572 0.4375 0.0505 +v 0.7689 0.3125 0.8995 +v 0.5572 0.3125 0.0505 +v 0.6969 0.4375 0.8692 +v 0.4852 0.4375 0.0202 +v 0.6969 0.3125 0.8692 +v 0.4852 0.3125 0.0202 +v 0.5756 0.4375 0.8994 +v 0.364 0.4375 0.0504 +v 0.5756 0.3125 0.8994 +v 0.364 0.3125 0.0504 +v 0.5188 0.4375 0.8653 +v 0.3071 0.4375 0.0163 +v 0.5188 0.3125 0.8653 +v 0.3071 0.3125 0.0163 +v 0.3975 0.4375 0.8955 +v 0.1859 0.4375 0.0465 +v 0.3975 0.3125 0.8955 +v 0.1859 0.3125 0.0465 +v 0.3293 0.4375 0.8803 +v 0.1176 0.4375 0.0313 +v 0.3293 0.3125 0.8803 +v 0.1176 0.3125 0.0313 +v 0.208 0.4375 0.9106 +v -0.0036 0.4375 0.0615 +v 0.208 0.3125 0.9106 +v -0.0036 0.3125 0.0615 +v -0.0625 0.8125 0.9375 +v -0.0625 0.8125 0.125 +v -0.0625 0.3125 0.9375 +v -0.0625 0.3125 0.125 +v -0.8125 0.8125 0.9375 +v -0.8125 0.8125 0.125 +v -0.8125 0.3125 0.9375 +v -0.8125 0.3125 0.125 +v -0.0625 1.625 0.9375 +v -0.0625 1.625 0.125 +v -0.0625 1.9375 0.9375 +v -0.0625 1.9375 0.125 +v -0.8125 1.625 0.9375 +v -0.8125 1.625 0.125 +v -0.8125 1.9375 0.9375 +v -0.8125 1.9375 0.125 +v -0.125 0.75 0.125 +v -0.125 0.75 0.0625 +v -0.125 0.4375 0.125 +v -0.125 0.4375 0.0625 +v -0.4375 0.75 0.125 +v -0.4375 0.75 0.0625 +v -0.4375 0.4375 0.125 +v -0.4375 0.4375 0.0625 +v -0.5 0.125 -0.25 +v -0.5 0.125 -0.4375 +v -0.5 0.0625 -0.25 +v -0.5 0.0625 -0.4375 +v -0.8125 0.125 -0.25 +v -0.8125 0.125 -0.4375 +v -0.8125 0.0625 -0.25 +v -0.8125 0.0625 -0.4375 +v -0.5156 0.1875 -0.2656 +v -0.5156 0.1875 -0.4219 +v -0.5156 0.125 -0.2656 +v -0.5156 0.125 -0.4219 +v -0.7969 0.1875 -0.2656 +v -0.7969 0.1875 -0.4219 +v -0.7969 0.125 -0.2656 +v -0.7969 0.125 -0.4219 +v -0.9835 0.0625 -0.2521 +v -0.3619 0.0625 -0.1868 +v -0.9835 0 -0.2521 +v -0.3619 0 -0.1868 +v -0.9182 0.0625 -0.8737 +v -0.2966 0.0625 -0.8084 +v -0.9182 0 -0.8737 +v -0.2966 0 -0.8084 +v -0.1813 0.0313 0.0082 +v 0.9375 0.0313 -0.1094 +v -0.1813 -0.0312 0.0082 +v 0.9375 -0.0312 -0.1094 +v -0.2728 0.0313 -0.862 +v 0.846 0.0313 -0.9796 +v -0.2728 -0.0312 -0.862 +v 0.846 -0.0312 -0.9796 +v -0.9063 1.7609 0.7499 +v -0.9063 1.75 0.125 +v -0.9063 1.011 0.763 +v -0.9063 1.0001 0.1381 +v -0.9688 1.7609 0.7499 +v -0.9687 1.75 0.125 +v -0.9688 1.011 0.763 +v -0.9688 1.0001 0.1381 +v -0.1875 1.5 0.8437 +v -0.1875 1.5 0.2187 +v -0.1875 0.875 0.8437 +v -0.1875 0.875 0.2187 +v -0.25 1.5 0.8437 +v -0.25 1.5 0.2188 +v -0.25 0.875 0.8437 +v -0.25 0.875 0.2188 +v -0.125 1.3125 0.7187 +v -0.125 1.3125 0.5312 +v -0.125 1.125 0.7187 +v -0.125 1.125 0.5312 +v -0.1875 1.3125 0.7187 +v -0.1875 1.3125 0.5312 +v -0.1875 1.125 0.7187 +v -0.1875 1.125 0.5312 +v -0.125 0.875 0.875 +v -0.125 0.875 0.1875 +v -0.125 0.8125 0.875 +v -0.125 0.8125 0.1875 +v -0.3125 0.875 0.875 +v -0.3125 0.875 0.1875 +v -0.3125 0.8125 0.875 +v -0.3125 0.8125 0.1875 +v -0.4375 1.5 0.8437 +v -0.4375 1.5 0.2187 +v -0.4375 0.875 0.8437 +v -0.4375 0.875 0.2187 +v -0.5 1.5 0.8437 +v -0.5 1.5 0.2187 +v -0.5 0.875 0.8437 +v -0.5 0.875 0.2187 +v -0.375 1.3125 0.7187 +v -0.375 1.3125 0.5312 +v -0.375 1.125 0.7187 +v -0.375 1.125 0.5312 +v -0.4375 1.3125 0.7187 +v -0.4375 1.3125 0.5312 +v -0.4375 1.125 0.7187 +v -0.4375 1.125 0.5312 +v -0.375 0.875 0.875 +v -0.375 0.875 0.1875 +v -0.375 0.8125 0.875 +v -0.375 0.8125 0.1875 +v -0.5625 0.875 0.875 +v -0.5625 0.875 0.1875 +v -0.5625 0.8125 0.875 +v -0.5625 0.8125 0.1875 +v -0.5938 1.625 0.875 +v -0.5937 1.625 0.6875 +v -0.5938 1.5625 0.875 +v -0.5937 1.5625 0.6875 +v -0.7813 1.625 0.875 +v -0.7813 1.625 0.6875 +v -0.7813 1.5625 0.875 +v -0.7813 1.5625 0.6875 +v -0.5938 0.875 0.875 +v -0.5937 0.875 0.6875 +v -0.5938 0.8125 0.875 +v -0.5937 0.8125 0.6875 +v -0.7813 0.875 0.875 +v -0.7813 0.875 0.6875 +v -0.7813 0.8125 0.875 +v -0.7813 0.8125 0.6875 +v 0 1.9375 0.9375 +v 0 1.9375 0.3125 +v 0 1.8125 0.9375 +v 0 1.8125 0.3125 +v -0.0625 1.9375 0.3125 +v -0.0625 1.8125 0.9375 +v -0.0625 1.8125 0.3125 +v 0.9375 0.375 0.9375 +v 0.9375 0.375 0.3125 +v 0.8125 0.375 0.9375 +v 0.8125 0.375 0.3125 +v 0.9375 0.3125 0.9375 +v 0.9375 0.3125 0.3125 +v 0.8125 0.3125 0.9375 +v 0.8125 0.3125 0.3125 +v 0.9375 -0.1875 -0.0625 +v 0.9375 -0.1875 -0.25 +v 0.9375 -1 -0.0625 +v 0.9375 -1 -0.25 +v 0.75 -0.1875 -0.0625 +v 0.75 -0.1875 -0.25 +v 0.75 -1 -0.0625 +v 0.75 -1 -0.25 +v 0.9375 -0.1875 -0.75 +v 0.9375 -0.1875 -0.9375 +v 0.9375 -1 -0.75 +v 0.9375 -1 -0.9375 +v 0.75 -0.1875 -0.75 +v 0.75 -0.1875 -0.9375 +v 0.75 -1 -0.75 +v 0.75 -1 -0.9375 +v -0.75 -0.1875 -0.75 +v -0.75 -0.1875 -0.9375 +v -0.75 -1 -0.75 +v -0.75 -1 -0.9375 +v -0.9375 -0.1875 -0.75 +v -0.9375 -0.1875 -0.9375 +v -0.9375 -1 -0.75 +v -0.9375 -1 -0.9375 +v -0.75 -0.1875 -0.0625 +v -0.75 -0.1875 -0.25 +v -0.75 -1 -0.0625 +v -0.75 -1 -0.25 +v -0.9375 -0.1875 -0.0625 +v -0.9375 -0.1875 -0.25 +v -0.9375 -1 -0.0625 +v -0.9375 -1 -0.25 +v 1 0 -1 +v 1 -0.1875 0 +v 1 -0.1875 -1 +v -1 0 -1 +v -1 -0.1875 0 +v -1 -0.1875 -1 +v -0.0594 1.9375 0.4406 +v -0.0594 1.9375 0.1187 +v -0.5 1.9375 0.4406 +v -0.5 1.9375 0.1187 +v -0.125 1.875 0.1219 +v -0.125 1.875 0.0281 +v -0.125 1.8125 0.1219 +v -0.125 1.8125 0.0281 +v -0.1875 1.875 0.1219 +v -0.1875 1.875 0.0281 +v -0.1875 1.8125 0.1219 +v -0.1875 1.8125 0.0281 +v -0.2188 1.875 0.1219 +v -0.2188 1.875 0.0281 +v -0.2188 1.8125 0.1219 +v -0.2188 1.8125 0.0281 +v -0.2813 1.875 0.1219 +v -0.2813 1.875 0.0281 +v -0.2813 1.8125 0.1219 +v -0.2813 1.8125 0.0281 +v -0.3125 1.875 0.1219 +v -0.3125 1.875 0.0281 +v -0.3125 1.8125 0.1219 +v -0.3125 1.8125 0.0281 +v -0.375 1.875 0.1219 +v -0.375 1.875 0.0281 +v -0.375 1.8125 0.1219 +v -0.375 1.8125 0.0281 +v -0.4063 1.875 0.1219 +v -0.4063 1.875 0.0281 +v -0.4063 1.8125 0.1219 +v -0.4063 1.8125 0.0281 +v -0.4688 1.875 0.1219 +v -0.4688 1.875 0.0281 +v -0.4688 1.8125 0.1219 +v -0.4688 1.8125 0.0281 +v -0.5156 1.8438 0.1219 +v -0.5156 1.8438 0.0281 +v -0.5156 1.7188 0.1219 +v -0.5156 1.7188 0.0281 +v -0.6406 1.8438 0.1219 +v -0.6406 1.8438 0.0281 +v -0.6406 1.7188 0.1219 +v -0.6406 1.7188 0.0281 +v 0.8125 0 1 +v -0.1875 0 1 +v -0.1875 0.3125 1 +v 0.8125 0.3125 1 +v 0 1.75 1.0625 +v 0 1.75 1 +v 0 1.125 1.0625 +v 0 1.125 1 +v -0.875 1.75 1.0625 +v -0.875 1.75 1 +v -0.875 1.125 1.0625 +v -0.875 1.125 1 +v -1.0016 -0.25 0.25 +v -1.0016 -0.25 0.75 +v -1.0016 -0.75 0.25 +v -1.0016 -0.75 0.75 +v -0.9375 -0.25 0.25 +v -0.9375 -0.25 0.75 +v -0.9375 -0.75 0.25 +v -0.9375 -0.75 0.75 +v -1.0016 -0.0625 0.375 +v -1.0016 -0.0625 0.625 +v -1.0016 -0.25 0.375 +v -1.0016 -0.25 0.625 +v -0.9375 -0.0625 0.375 +v -0.9375 -0.0625 0.625 +v -0.9375 -0.25 0.375 +v -0.9375 -0.25 0.625 +v 1.0016 -0.25 0.75 +v 1.0016 -0.25 0.25 +v 1.0016 -0.75 0.75 +v 1.0016 -0.75 0.25 +v 0.9375 -0.25 0.75 +v 0.9375 -0.25 0.25 +v 0.9375 -0.75 0.75 +v 0.9375 -0.75 0.25 +v 1.0016 -0.0625 0.625 +v 1.0016 -0.0625 0.375 +v 1.0016 -0.25 0.625 +v 1.0016 -0.25 0.375 +v 0.9375 -0.0625 0.625 +v 0.9375 -0.0625 0.375 +v 0.9375 -0.25 0.625 +v 0.9375 -0.25 0.375 +v -0.625 1.5625 0.8125 +v -0.625 1.5625 0.75 +v -0.625 0.8125 0.8125 +v -0.625 0.8125 0.75 +v -0.75 1.5625 0.8125 +v -0.75 1.5625 0.75 +v -0.75 0.8125 0.8125 +v -0.75 0.8125 0.75 +v -0.9069 -0.6875 -0.2556 +v -0.3125 -0.6875 -0.0625 +v -0.9069 -1 -0.2556 +v -0.3125 -1 -0.0625 +v -0.6365 -0.6875 -1.0878 +v -0.0421 -0.6875 -0.8947 +v -0.6365 -1 -1.0878 +v -0.0421 -1 -0.8947 +v 0.5875 -0.6875 0.0058 +v 0.8615 -0.6875 -0.556 +v 0.5875 -1 0.0058 +v 0.8615 -1 -0.556 +v -0.1989 -0.6875 -0.3778 +v 0.075 -0.6875 -0.9396 +v -0.1989 -1 -0.3778 +v 0.075 -1 -0.9396 +v 0 0.9688 0.9375 +v 0 1.9375 0.9375 +v 0 1.9375 0 +v 0 0.25 0.9375 +v -0.5156 0.1875 -0.2656 +v -0.7969 0.1875 -0.2656 +v -0.5156 0.125 -0.2656 +v -0.7969 0.125 -0.2656 +v -0.7969 0.1875 -0.4219 +v -0.7969 0.125 -0.4219 +v -0.5156 0.1875 -0.4219 +v -0.5156 0.125 -0.4219 +v 0.9375 1.9375 0.5625 +v 0.9375 1.9375 0.375 +v 0.9375 1.875 0.5625 +v 0.9375 1.875 0.375 +v 0 1.9375 0.5625 +v 0 1.9375 0.375 +v 0 1.875 0.5625 +v 0 1.875 0.375 +v 0.9375 0.875 0.5625 +v 0.9375 0.875 0.375 +v 0.875 0.875 0.5625 +v 0.875 0.875 0.375 +v 0.875 1.875 0.5625 +v 0.875 1.875 0.375 +v 0.9375 0.3125 0.5625 +v 0.9375 0.3125 0.375 +v 0.875 0.3125 0.5625 +v 0.875 0.3125 0.375 +v 0.9375 1.9375 0.75 +v 0.9375 1.875 0.9375 +v 0.9375 1.875 0.75 +v 0 1.9375 0.75 +v 0 1.875 0.9375 +v 0 1.875 0.75 +v 0.9375 0.875 0.75 +v 0.875 0.875 0.9375 +v 0.875 0.875 0.75 +v 0.875 1.875 0.9375 +v 0.875 1.875 0.75 +v 0.9375 0.3125 0.75 +v 0.875 0.3125 0.9375 +v 0.875 0.3125 0.75 +v 0.75 -0.1875 0 +v 0.75 -0.1875 -0.875 +v 0.75 -0.4375 0 +v 0.75 -0.4375 -0.875 +v 0 -0.1875 0 +v 0 -0.1875 -0.875 +v 0 -0.4375 0 +v 0 -0.4375 -0.875 +v 0 2 2 +v 0 2 1 +v 0.125 1.9375 1.125 +v 0.125 1.9375 1.875 +v 0.875 1.9375 1.125 +v 0.875 1.9375 1.875 +v 0.125 2 1.875 +v 0.125 2 1.125 +v 0.875 2 1.125 +v 1 2 1 +v 0.875 2 1.875 +v 1 2 2 +v 0.75 2.0063 1.75 +v 0.75 2.0063 1.25 +v 0.75 1.9438 1.75 +v 0.75 1.9438 1.25 +v 0.25 2.0063 1.75 +v 0.25 2.0063 1.25 +v 0.25 1.9438 1.75 +v 0.25 1.9438 1.25 +vt 0 0.0938 +vt 0 0.25 +vt 0.3125 0.25 +vt 0.3125 0.0938 +vt 0 0.0938 +vt 0 0.25 +vt 0.3125 0.25 +vt 0.3125 0.0938 +vt 0.875 1 +vt 0.875 0.6875 +vt 0.4375 0.6875 +vt 0.4375 1 +vt 0.875 1 +vt 0.875 0.6875 +vt 0.4375 0.6875 +vt 0.4375 1 +vt 0.4375 0.5313 +vt 0.4375 0.6875 +vt 0.875 0.6875 +vt 0.875 0.5313 +vt 0.4375 0.375 +vt 0.4375 0.5313 +vt 0.875 0.5313 +vt 0.875 0.375 +vt 0.7344 0.6094 +vt 0.7344 0.6406 +vt 0.75 0.6406 +vt 0.75 0.6094 +vt 0.7188 0.6094 +vt 0.7188 0.6406 +vt 0.7344 0.6406 +vt 0.7344 0.6094 +vt 0.75 0.6406 +vt 0.75 0.625 +vt 0.7188 0.625 +vt 0.7188 0.6406 +vt 0.75 0.6094 +vt 0.75 0.625 +vt 0.7188 0.625 +vt 0.7188 0.6094 +vt 0.7188 0.6094 +vt 0.7188 0.6406 +vt 0.75 0.6406 +vt 0.75 0.6094 +vt 0 0.25 +vt 0 0 +vt 0.5 0 +vt 0.5 0.25 +vt 0.7656 0.5156 +vt 0.7656 1 +vt 1 1 +vt 1 0.5156 +vt 1 0 +vt 1 0.4844 +vt 0.9844 0.4844 +vt 0.9844 0 +vt 0.9844 0 +vt 0.9844 0.4844 +vt 1 0.4844 +vt 1 0 +vt 0 0 +vt 0 0.0156 +vt 0.5 0.0156 +vt 0.5 0 +vt 0.6563 0.6875 +vt 0.6563 0.1875 +vt 0.4063 0.1875 +vt 0.4063 0.6875 +vt 0.4063 0.6875 +vt 0.6563 0.6875 +vt 0.6563 0.1875 +vt 0.4063 0.1875 +vt 0.9844 0.5156 +vt 0.9844 1 +vt 0.75 1 +vt 0.75 0.5156 +vt 0.0156 0.0156 +vt 0.25 0.0156 +vt 0.25 0.25 +vt 0.0156 0.25 +vt 0.75 1 +vt 0.5156 1 +vt 0.5156 0.75 +vt 0.75 0.75 +vt 1 0.1875 +vt 1 0.625 +vt 0.75 0.625 +vt 0.75 0.1875 +vt 1 0.1875 +vt 1 0.625 +vt 0.75 0.625 +vt 0.75 0.1875 +vt 0.7813 0.625 +vt 0.7813 0.7656 +vt 0.75 0.7656 +vt 0.75 0.625 +vt 1 0.625 +vt 1 0.7656 +vt 0.9688 0.7656 +vt 0.9688 0.625 +vt 0.75 0.625 +vt 0.75 0.7656 +vt 0.7813 0.7656 +vt 0.7813 0.625 +vt 0.7813 0.625 +vt 0.7813 0.7656 +vt 0.75 0.7656 +vt 0.75 0.625 +vt 0.75 0.625 +vt 0.75 0.7656 +vt 0.7813 0.7656 +vt 0.7813 0.625 +vt 1 0.625 +vt 1 0.7656 +vt 0.9688 0.7656 +vt 0.9688 0.625 +vt 0.9688 0.625 +vt 0.9688 0.7656 +vt 1 0.7656 +vt 1 0.625 +vt 1 0.1094 +vt 1 0.1875 +vt 0.9688 0.1875 +vt 0.9688 0.1094 +vt 0.9688 0.1094 +vt 0.9688 0.1875 +vt 1 0.1875 +vt 1 0.1094 +vt 0.7813 0.1094 +vt 0.7813 0.1875 +vt 0.75 0.1875 +vt 0.75 0.1094 +vt 0.9688 0.1094 +vt 0.9688 0.1875 +vt 1 0.1875 +vt 1 0.1094 +vt 1 0.1094 +vt 1 0.1875 +vt 0.9688 0.1875 +vt 0.9688 0.1094 +vt 0.75 0.1094 +vt 0.75 0.1875 +vt 0.7813 0.1875 +vt 0.7813 0.1094 +vt 0.75 0.1094 +vt 0.75 0.1875 +vt 0.7813 0.1875 +vt 0.7813 0.1094 +vt 0.7813 0.1094 +vt 0.7813 0.1875 +vt 0.75 0.1875 +vt 0.75 0.1094 +vt 1 0.7656 +vt 1 0.7813 +vt 0.75 0.7813 +vt 0.75 0.7656 +vt 1 0.7656 +vt 1 0.7813 +vt 0.75 0.7813 +vt 0.75 0.7656 +vt 1 0.0313 +vt 1 0.1094 +vt 0.75 0.1094 +vt 0.75 0.0313 +vt 0 0.75 +vt 0 1 +vt 0.25 1 +vt 0.25 0.75 +vt 1 0.0313 +vt 1 0.1094 +vt 0.75 0.1094 +vt 0.75 0.0313 +vt 0.9688 0.7656 +vt 0.7813 0.7656 +vt 0.7813 0.625 +vt 0.9688 0.625 +vt 0.9688 0.7656 +vt 0.9688 0.625 +vt 0.7813 0.625 +vt 0.7813 0.7656 +vt 0.7813 0.6094 +vt 0.9688 0.6094 +vt 0.9688 0.625 +vt 0.7813 0.625 +vt 0.9688 0.7813 +vt 0.7813 0.7813 +vt 0.7813 0.7656 +vt 0.9688 0.7656 +vt 0.9688 0.7656 +vt 0.7813 0.7656 +vt 0.7813 0.7813 +vt 0.9688 0.7813 +vt 0.9688 0.625 +vt 0.9688 0.7656 +vt 1 0.7656 +vt 1 0.625 +vt 0.9688 0.6406 +vt 0.7813 0.6406 +vt 0.7813 0.625 +vt 0.9688 0.625 +vt 0.9688 0.1875 +vt 0.7813 0.1875 +vt 0.7813 0.1094 +vt 0.9688 0.1094 +vt 0.7813 0.1094 +vt 0.9688 0.1094 +vt 0.9688 0.1875 +vt 0.7813 0.1875 +vt 0.7813 0.1875 +vt 0.9688 0.1875 +vt 0.9688 0.2031 +vt 0.7813 0.2031 +vt 0.9688 0.2031 +vt 0.7813 0.2031 +vt 0.7813 0.1875 +vt 0.9688 0.1875 +vt 0.9688 0.1094 +vt 0.7813 0.1094 +vt 0.7813 0.0938 +vt 0.9688 0.0938 +vt 0.7813 0.0938 +vt 0.9688 0.0938 +vt 0.9688 0.1094 +vt 0.7813 0.1094 +vt 0.25 0.1875 +vt 0.25 0.6875 +vt 0 0.6875 +vt 0 0.1875 +vt 0.75 0 +vt 0.75 0.25 +vt 0.5 0.25 +vt 0.5 0 +vt 0.25 0.5 +vt 0 0.5 +vt 0 0.25 +vt 0.25 0.25 +vt 0.25 0.1875 +vt 0.25 0.6875 +vt 0 0.6875 +vt 0 0.1875 +vt 0.75 0.75 +vt 0.75 1 +vt 1 1 +vt 1 0.75 +vt 0 1 +vt 0 0.75 +vt 0.25 0.75 +vt 0.25 1 +vt 0.75 0.4688 +vt 0.5156 0.4688 +vt 0.5156 0.2813 +vt 0.75 0.2813 +vt 0.9688 0.0313 +vt 0.9688 0.2188 +vt 0.7813 0.2188 +vt 0.7813 0.0313 +vt 0.75 0.25 +vt 0.75 0.5 +vt 0.5 0.5 +vt 0.5 0.25 +vt 0.5 0.25 +vt 0.25 0.25 +vt 0.25 0 +vt 0.5 0 +vt 0 0 +vt 0.25 0 +vt 0.25 0.25 +vt 0 0.25 +vt 0.5 1 +vt 0.5 0.75 +vt 0.75 0.75 +vt 0.75 1 +vt 0.9688 0.2188 +vt 0.9688 0.0313 +vt 1 0 +vt 1 0.25 +vt 0.7813 0.2188 +vt 0.9688 0.2188 +vt 1 0.25 +vt 0.75 0.25 +vt 0.7813 0.0313 +vt 0.7813 0.2188 +vt 0.75 0.25 +vt 0.75 0 +vt 0.9688 0.0313 +vt 0.7813 0.0313 +vt 0.75 0 +vt 1 0 +vt 0.9844 0.0313 +vt 0.9844 0.2188 +vt 0.9688 0.2188 +vt 0.9688 0.0313 +vt 0.7813 0.2188 +vt 0.9688 0.2188 +vt 0.9688 0.2344 +vt 0.7813 0.2344 +vt 0.7813 0.0313 +vt 0.7813 0.2188 +vt 0.7656 0.2188 +vt 0.7656 0.0313 +vt 0.9688 0.0156 +vt 0.7813 0.0156 +vt 0.7813 0.0313 +vt 0.9688 0.0313 +vt 0.7813 0.2188 +vt 0.9688 0.2188 +vt 0.9688 0.0313 +vt 0.7813 0.0313 +vt 1 0 +vt 0.9688 0.0313 +vt 0.9688 0.2188 +vt 1 0.25 +vt 1 0.25 +vt 0.9688 0.2188 +vt 0.7813 0.2188 +vt 0.75 0.25 +vt 0.75 0.25 +vt 0.7813 0.2188 +vt 0.7813 0.0313 +vt 0.75 0 +vt 0.75 0 +vt 0.7813 0.0313 +vt 0.9688 0.0313 +vt 1 0 +vt 0.9688 0.2188 +vt 0.9844 0.2188 +vt 0.9844 0.0313 +vt 0.9688 0.0313 +vt 0.9688 0.2344 +vt 0.9688 0.2188 +vt 0.7813 0.2188 +vt 0.7813 0.2344 +vt 0.7656 0.2188 +vt 0.7813 0.2188 +vt 0.7813 0.0313 +vt 0.7656 0.0313 +vt 0.7813 0.0313 +vt 0.7813 0.0156 +vt 0.9688 0.0156 +vt 0.9688 0.0313 +vt 0.4688 0.7656 +vt 0.2813 0.7656 +vt 0.2813 0.6875 +vt 0.4688 0.6875 +vt 0 0.6875 +vt 0.0309 0.6875 +vt 0.0309 0.7656 +vt 0 0.7656 +vt 0 1 +vt 0 0.75 +vt 0.4688 0.75 +vt 0.4688 1 +vt 0.4688 0.7813 +vt 0.5 0.7813 +vt 0.5 1 +vt 0.4688 1 +vt 0.5313 1 +vt 0.5 1 +vt 0.5 0.7813 +vt 0.5313 0.7813 +vt 0.5156 0.7813 +vt 0.5156 1 +vt 0.4844 1 +vt 0.4844 0.7813 +vt 0.5156 0.7656 +vt 0.5156 0.7969 +vt 0.4844 0.7969 +vt 0.4844 0.7656 +vt 0.5156 0.7656 +vt 0.5156 0.7969 +vt 0.4844 0.7969 +vt 0.4844 0.7656 +vt 0.4688 0.7813 +vt 0.5 0.7813 +vt 0.5 1 +vt 0.4688 1 +vt 0.5313 1 +vt 0.5 1 +vt 0.5 0.7813 +vt 0.5313 0.7813 +vt 0.5156 0.7813 +vt 0.5156 1 +vt 0.4844 1 +vt 0.4844 0.7813 +vt 0.5156 0.7656 +vt 0.5156 0.7969 +vt 0.4844 0.7969 +vt 0.4844 0.7656 +vt 0.5156 0.7656 +vt 0.5156 0.7969 +vt 0.4844 0.7969 +vt 0.4844 0.7656 +vt 0.4688 0.7813 +vt 0.5 0.7813 +vt 0.5 1 +vt 0.4688 1 +vt 0.5313 1 +vt 0.5 1 +vt 0.5 0.7813 +vt 0.5313 0.7813 +vt 0.5156 0.7813 +vt 0.5156 1 +vt 0.4844 1 +vt 0.4844 0.7813 +vt 0.5156 0.7656 +vt 0.5156 0.7969 +vt 0.4844 0.7969 +vt 0.4844 0.7656 +vt 0.5156 0.7656 +vt 0.5156 0.7969 +vt 0.4844 0.7969 +vt 0.4844 0.7656 +vt 0.4688 0.7813 +vt 0.5 0.7813 +vt 0.5 1 +vt 0.4688 1 +vt 0.5313 1 +vt 0.5 1 +vt 0.5 0.7813 +vt 0.5313 0.7813 +vt 0.5156 0.7813 +vt 0.5156 1 +vt 0.4844 1 +vt 0.4844 0.7813 +vt 0.5156 0.7656 +vt 0.5156 0.7969 +vt 0.4844 0.7969 +vt 0.4844 0.7656 +vt 0.5156 0.7656 +vt 0.5156 0.7969 +vt 0.4844 0.7969 +vt 0.4844 0.7656 +vt 0.5938 0.0625 +vt 0.5938 0.1875 +vt 0.3906 0.1875 +vt 0.3906 0.0625 +vt 0.5938 0.0625 +vt 0.5938 0.1875 +vt 0.3906 0.1875 +vt 0.3906 0.0625 +vt 0.5938 0.1875 +vt 0.3906 0.1875 +vt 0.3906 0 +vt 0.5938 0 +vt 0.1875 0.0625 +vt 0.1875 0.1875 +vt 0 0.1875 +vt 0 0.0625 +vt 0.7188 0.7031 +vt 0.5156 0.7031 +vt 0.5156 0.7813 +vt 0.7188 0.7813 +vt 0.7188 0.7031 +vt 0.5156 0.7031 +vt 0.5156 0.7813 +vt 0.7188 0.7813 +vt 0.1875 0 +vt 0.1875 0.1875 +vt 0.3906 0.1875 +vt 0.3906 0 +vt 0.7344 0.2031 +vt 0.7344 0.3906 +vt 0.6563 0.3906 +vt 0.6563 0.2031 +vt 0.0938 0.7344 +vt 0.0938 0.8125 +vt 0.0781 0.8125 +vt 0.0781 0.7344 +vt 0.1563 0.7344 +vt 0.1563 0.8125 +vt 0.1406 0.8125 +vt 0.1406 0.7344 +vt 0.1563 0.7969 +vt 0.1563 0.8125 +vt 0.0781 0.8125 +vt 0.0781 0.7969 +vt 0.1563 0.7344 +vt 0.1563 0.75 +vt 0.0781 0.75 +vt 0.0781 0.7344 +vt 0.1563 0.7344 +vt 0.1563 0.8125 +vt 0.0781 0.8125 +vt 0.0781 0.7344 +vt 0.7344 0.7031 +vt 0.7188 0.7031 +vt 0.7188 0.6563 +vt 0.7344 0.6563 +vt 0.6719 0.6563 +vt 0.6563 0.6563 +vt 0.6563 0.7031 +vt 0.6719 0.7031 +vt 0.7344 0.6563 +vt 0.7344 0.7031 +vt 0.6563 0.7031 +vt 0.6563 0.6563 +vt 0.7344 0.6563 +vt 0.7344 0.6719 +vt 0.6563 0.6719 +vt 0.6563 0.6563 +vt 0.6563 0.6875 +vt 0.6563 0.7031 +vt 0.7344 0.7031 +vt 0.7344 0.6875 +vt 0.75 0.7031 +vt 0.7344 0.7031 +vt 0.7344 0.6563 +vt 0.75 0.6563 +vt 0.75 0.7031 +vt 0.7344 0.7031 +vt 0.7344 0.6563 +vt 0.75 0.6563 +vt 0.7344 0.6406 +vt 0.7344 0.6563 +vt 0.6563 0.6563 +vt 0.6563 0.6406 +vt 0.7344 0.6406 +vt 0.7344 0.6563 +vt 0.6563 0.6563 +vt 0.6563 0.6406 +vt 0.0625 0.3125 +vt 0.125 0.3125 +vt 0.125 0.9375 +vt 0.0625 0.9375 +vt 0.75 0.9375 +vt 0.75 1 +vt 0.125 1 +vt 0.125 0.9375 +vt 0.125 1 +vt 0.125 0.375 +vt 0.75 0.375 +vt 0.75 1 +vt 0.6875 0.375 +vt 0.75 0.375 +vt 0.75 1 +vt 0.6875 1 +vt 0.0625 0.9375 +vt 0.0625 0.875 +vt 0.6875 0.875 +vt 0.6875 0.9375 +vt 0.7188 0.9844 +vt 0.7188 1 +vt 1 1 +vt 1 0.9844 +vt 1 0.7813 +vt 1 0.7969 +vt 0.7188 0.7969 +vt 0.7188 0.7813 +vt 1 1 +vt 0.7188 1 +vt 0.7188 0.7813 +vt 1 0.7813 +vt 1 1 +vt 0.9844 1 +vt 0.9844 0.7813 +vt 1 0.7813 +vt 0.7344 0.7813 +vt 0.7188 0.7813 +vt 0.7188 1 +vt 0.7344 1 +vt 0.4063 0.5 +vt 0.4063 0.6875 +vt 0.25 0.6875 +vt 0.25 0.5 +vt 0.4063 0.6875 +vt 0.25 0.6875 +vt 0.25 0.6719 +vt 0.4063 0.6719 +vt 0.4063 0.5156 +vt 0.25 0.5156 +vt 0.25 0.5 +vt 0.4063 0.5 +vt 0.2656 0.5 +vt 0.2656 0.6875 +vt 0.25 0.6875 +vt 0.25 0.5 +vt 0.4063 0.5 +vt 0.4063 0.6875 +vt 0.3906 0.6875 +vt 0.3906 0.5 +vt 0.4063 0.3438 +vt 0.4063 0.5 +vt 0.25 0.5 +vt 0.25 0.3438 +vt 0.4063 0.1875 +vt 0.4063 0.3438 +vt 0.25 0.3438 +vt 0.25 0.1875 +vt 0.25 0.5 +vt 0.4063 0.5 +vt 0.4063 0.4844 +vt 0.25 0.4844 +vt 0.2656 0.3438 +vt 0.2656 0.5 +vt 0.25 0.5 +vt 0.25 0.3438 +vt 0.4063 0.3438 +vt 0.4063 0.5 +vt 0.3906 0.5 +vt 0.3906 0.3438 +vt 0.3281 0.4063 +vt 0.3281 0.4531 +vt 0.2813 0.4531 +vt 0.2813 0.4063 +vt 0.2813 0.4531 +vt 0.3281 0.4531 +vt 0.3281 0.4375 +vt 0.2813 0.4375 +vt 0.2969 0.4063 +vt 0.2969 0.4531 +vt 0.2813 0.4531 +vt 0.2813 0.4063 +vt 0.3281 0.4063 +vt 0.3281 0.4531 +vt 0.3125 0.4531 +vt 0.3125 0.4063 +vt 0.2813 0.4063 +vt 0.3281 0.4063 +vt 0.3281 0.4219 +vt 0.2813 0.4219 +vt 0.7188 0.6094 +vt 0.7031 0.6094 +vt 0.7031 0.4375 +vt 0.7188 0.4375 +vt 0.75 0.6094 +vt 0.7344 0.6094 +vt 0.7344 0.4375 +vt 0.75 0.4375 +vt 0.7031 0.4375 +vt 0.7031 0.6094 +vt 0.75 0.6094 +vt 0.75 0.4375 +vt 0.75 0.5938 +vt 0.75 0.6094 +vt 0.7031 0.6094 +vt 0.7031 0.5938 +vt 0.75 0.4375 +vt 0.75 0.4531 +vt 0.7031 0.4531 +vt 0.7031 0.4375 +vt 0.4063 0.3438 +vt 0.4063 0.5 +vt 0.25 0.5 +vt 0.25 0.3438 +vt 0.4063 0.1875 +vt 0.4063 0.3438 +vt 0.25 0.3438 +vt 0.25 0.1875 +vt 0.25 0.5 +vt 0.4063 0.5 +vt 0.4063 0.4844 +vt 0.25 0.4844 +vt 0.2656 0.3438 +vt 0.2656 0.5 +vt 0.25 0.5 +vt 0.25 0.3438 +vt 0.4063 0.3438 +vt 0.4063 0.5 +vt 0.3906 0.5 +vt 0.3906 0.3438 +vt 0.3281 0.4063 +vt 0.3281 0.4531 +vt 0.2813 0.4531 +vt 0.2813 0.4063 +vt 0.2813 0.4531 +vt 0.3281 0.4531 +vt 0.3281 0.4375 +vt 0.2813 0.4375 +vt 0.2969 0.4063 +vt 0.2969 0.4531 +vt 0.2813 0.4531 +vt 0.2813 0.4063 +vt 0.3281 0.4063 +vt 0.3281 0.4531 +vt 0.3125 0.4531 +vt 0.3125 0.4063 +vt 0.2813 0.4063 +vt 0.3281 0.4063 +vt 0.3281 0.4219 +vt 0.2813 0.4219 +vt 0.7188 0.6094 +vt 0.7031 0.6094 +vt 0.7031 0.4375 +vt 0.7188 0.4375 +vt 0.75 0.6094 +vt 0.7344 0.6094 +vt 0.7344 0.4375 +vt 0.75 0.4375 +vt 0.7031 0.4375 +vt 0.7031 0.6094 +vt 0.75 0.6094 +vt 0.75 0.4375 +vt 0.75 0.5938 +vt 0.75 0.6094 +vt 0.7031 0.6094 +vt 0.7031 0.5938 +vt 0.75 0.4375 +vt 0.75 0.4531 +vt 0.7031 0.4531 +vt 0.7031 0.4375 +vt 0.5156 0.7656 +vt 0.5 0.7656 +vt 0.5 0.7188 +vt 0.5156 0.7188 +vt 0.4844 0.7656 +vt 0.4688 0.7656 +vt 0.4688 0.7188 +vt 0.4844 0.7188 +vt 0.5156 0.7656 +vt 0.5156 0.7188 +vt 0.4688 0.7188 +vt 0.4688 0.7656 +vt 0.5156 0.7188 +vt 0.5156 0.7344 +vt 0.4688 0.7344 +vt 0.4688 0.7188 +vt 0.4688 0.7656 +vt 0.4688 0.75 +vt 0.5156 0.75 +vt 0.5156 0.7656 +vt 0.5156 0.7656 +vt 0.5 0.7656 +vt 0.5 0.7188 +vt 0.5156 0.7188 +vt 0.4844 0.7656 +vt 0.4688 0.7656 +vt 0.4688 0.7188 +vt 0.4844 0.7188 +vt 0.5156 0.7188 +vt 0.5156 0.7344 +vt 0.4688 0.7344 +vt 0.4688 0.7188 +vt 0.4688 0.7656 +vt 0.4688 0.75 +vt 0.5156 0.75 +vt 0.5156 0.7656 +vt 0.5156 0.7188 +vt 0.5156 0.7656 +vt 0.4688 0.7656 +vt 0.4688 0.7188 +vt 0.5156 1 +vt 0.4844 1 +vt 0.4844 0.8438 +vt 0.5156 0.8438 +vt 0.5 0.8438 +vt 0.5 1 +vt 0.4844 1 +vt 0.4844 0.8438 +vt 0.5156 0.8594 +vt 0.4844 0.8594 +vt 0.4844 0.8438 +vt 0.5156 0.8438 +vt 0.5156 1 +vt 0.4844 1 +vt 0.4844 0.9844 +vt 0.5156 0.9844 +vt 0.4844 0.8438 +vt 0.4844 1 +vt 0.5156 1 +vt 0.5156 0.8438 +vt 0.4844 1 +vt 0.5 1 +vt 0.5 0.8438 +vt 0.4844 0.8438 +vt 0.4844 0.8438 +vt 0.4844 0.8594 +vt 0.5156 0.8594 +vt 0.5156 0.8438 +vt 0.4844 0.9844 +vt 0.4844 1 +vt 0.5156 1 +vt 0.5156 0.9844 +vt 0.8906 0.5 +vt 0.8906 0.7031 +vt 0.8438 0.7031 +vt 0.8438 0.5 +vt 0.8906 0.5 +vt 0.8906 0.7031 +vt 0.8438 0.7031 +vt 0.8438 0.5 +vt 0.8906 0.7031 +vt 0.8906 0.75 +vt 0.8438 0.75 +vt 0.8438 0.7031 +vt 0.8906 0.5 +vt 0.8906 0.7031 +vt 0.8438 0.7031 +vt 0.8438 0.5 +vt 0.8906 0.5 +vt 0.8906 0.7031 +vt 0.8438 0.7031 +vt 0.8438 0.5 +vt 0.8906 0.5 +vt 0.8906 0.7031 +vt 0.8438 0.7031 +vt 0.8438 0.5 +vt 0.8906 0.5 +vt 0.8906 0.7031 +vt 0.8438 0.7031 +vt 0.8438 0.5 +vt 0.8906 0.7031 +vt 0.8906 0.75 +vt 0.8438 0.75 +vt 0.8438 0.7031 +vt 0.8906 0.5 +vt 0.8906 0.7031 +vt 0.8438 0.7031 +vt 0.8438 0.5 +vt 0.8906 0.5 +vt 0.8906 0.7031 +vt 0.8438 0.7031 +vt 0.8438 0.5 +vt 0.8906 0.5 +vt 0.8906 0.7031 +vt 0.8438 0.7031 +vt 0.8438 0.5 +vt 0.8906 0.5 +vt 0.8906 0.7031 +vt 0.8438 0.7031 +vt 0.8438 0.5 +vt 0.8906 0.7031 +vt 0.8906 0.75 +vt 0.8438 0.75 +vt 0.8438 0.7031 +vt 0.8906 0.5 +vt 0.8906 0.7031 +vt 0.8438 0.7031 +vt 0.8438 0.5 +vt 0.8906 0.5 +vt 0.8906 0.7031 +vt 0.8438 0.7031 +vt 0.8438 0.5 +vt 0.8906 0.5 +vt 0.8906 0.7031 +vt 0.8438 0.7031 +vt 0.8438 0.5 +vt 0.8906 0.5 +vt 0.8906 0.7031 +vt 0.8438 0.7031 +vt 0.8438 0.5 +vt 0.8906 0.7031 +vt 0.8906 0.75 +vt 0.8438 0.75 +vt 0.8438 0.7031 +vt 0.8906 0.5 +vt 0.8906 0.7031 +vt 0.8438 0.7031 +vt 0.8438 0.5 +vt 0.8906 0.5 +vt 0.8906 0.7031 +vt 0.8438 0.7031 +vt 0.8438 0.5 +vt 0.8438 0.5 +vt 0.7969 0.5 +vt 0.7969 0.75 +vt 0.8438 0.75 +vt 0.8438 0.5 +vt 0.7969 0.5 +vt 0.7969 0.75 +vt 0.8438 0.75 +vt 0.7969 0.25 +vt 0.75 0.25 +vt 0.75 0.75 +vt 0.7969 0.75 +vt 0.7969 0.25 +vt 0.75 0.25 +vt 0.75 0.75 +vt 0.7969 0.75 +vt 0 0 +vt 0.5 0 +vt 0.5 0.25 +vt 0 0.25 +vt 0 0 +vt 0.5 0 +vt 0.5 0.25 +vt 0 0.25 +vt 0.75 0.0938 +vt 0.75 0.1719 +vt 0.6406 0.1719 +vt 0.6406 0.0938 +vt 0.6719 0.8125 +vt 0.6719 0.8359 +vt 0.6563 0.8359 +vt 0.6563 0.8125 +vt 0.6719 0.8125 +vt 0.6719 0.8359 +vt 0.6563 0.8359 +vt 0.6563 0.8125 +vt 0.6719 0.8125 +vt 0.6719 0.8359 +vt 0.6563 0.8359 +vt 0.6563 0.8125 +vt 0.6719 0.8125 +vt 0.6719 0.8359 +vt 0.6563 0.8359 +vt 0.6563 0.8125 +vt 0.6719 0.8125 +vt 0.6719 0.8281 +vt 0.6563 0.8281 +vt 0.6563 0.8125 +vt 0.6719 0.8125 +vt 0.6719 0.8359 +vt 0.6563 0.8359 +vt 0.6563 0.8125 +vt 0.6719 0.8125 +vt 0.6719 0.8359 +vt 0.6563 0.8359 +vt 0.6563 0.8125 +vt 0.6719 0.8125 +vt 0.6719 0.8359 +vt 0.6563 0.8359 +vt 0.6563 0.8125 +vt 0.6719 0.8125 +vt 0.6719 0.8359 +vt 0.6563 0.8359 +vt 0.6563 0.8125 +vt 0.6719 0.8125 +vt 0.6719 0.8281 +vt 0.6563 0.8281 +vt 0.6563 0.8125 +vt 0.6719 0.8125 +vt 0.6719 0.8359 +vt 0.6563 0.8359 +vt 0.6563 0.8125 +vt 0.6719 0.8125 +vt 0.6719 0.8359 +vt 0.6563 0.8359 +vt 0.6563 0.8125 +vt 0.6719 0.8125 +vt 0.6719 0.8359 +vt 0.6563 0.8359 +vt 0.6563 0.8125 +vt 0.6719 0.8125 +vt 0.6719 0.8359 +vt 0.6563 0.8359 +vt 0.6563 0.8125 +vt 0.6719 0.8125 +vt 0.6719 0.8281 +vt 0.6563 0.8281 +vt 0.6563 0.8125 +vt 0.6719 0.8125 +vt 0.6719 0.8359 +vt 0.6563 0.8359 +vt 0.6563 0.8125 +vt 0.6719 0.8125 +vt 0.6719 0.8359 +vt 0.6563 0.8359 +vt 0.6563 0.8125 +vt 0.6719 0.8125 +vt 0.6719 0.8359 +vt 0.6563 0.8359 +vt 0.6563 0.8125 +vt 0.6719 0.8125 +vt 0.6719 0.8359 +vt 0.6563 0.8359 +vt 0.6563 0.8125 +vt 0.6719 0.8125 +vt 0.6719 0.8281 +vt 0.6563 0.8281 +vt 0.6563 0.8125 +vt 0.7109 0.7813 +vt 0.7109 0.8125 +vt 0.6875 0.8125 +vt 0.6875 0.7813 +vt 0.7188 0.7813 +vt 0.7188 0.8125 +vt 0.6953 0.8125 +vt 0.6953 0.7813 +vt 0.7188 0.7891 +vt 0.7188 0.8125 +vt 0.6875 0.8125 +vt 0.6875 0.7891 +vt 0.7188 0.7813 +vt 0.7188 0.8047 +vt 0.6875 0.8047 +vt 0.6875 0.7813 +vt 0.7188 0.7813 +vt 0.7188 0.8125 +vt 0.6875 0.8125 +vt 0.6875 0.7813 +vt 0.75 0 +vt 0.75 0.25 +vt 0.5 0.25 +vt 0.5 0 +vt 0.75 0.25 +vt 0.6719 0.25 +vt 0.6719 0 +vt 0.75 0 +vt 0.75 0 +vt 0.75 0.0781 +vt 0.5 0.0781 +vt 0.5 0 +vt 0.5781 0.25 +vt 0.5 0.25 +vt 0.5 0 +vt 0.5781 0 +vt 1 0.7188 +vt 1 0.875 +vt 0.9844 0.875 +vt 0.9844 0.7188 +vt 0.7969 0.7188 +vt 0.7969 0.875 +vt 0.7813 0.875 +vt 0.7813 0.7188 +vt 1 0.8594 +vt 1 0.875 +vt 0.7813 0.875 +vt 0.7813 0.8594 +vt 1 0.7188 +vt 1 0.7344 +vt 0.7813 0.7344 +vt 0.7813 0.7188 +vt 1 0.7188 +vt 1 0.875 +vt 0.7813 0.875 +vt 0.7813 0.7188 +vt 0.875 0.4844 +vt 0.875 0.6094 +vt 0.75 0.6094 +vt 0.75 0.4844 +vt 0.75 0.6094 +vt 0.875 0.6094 +vt 0.875 0.5938 +vt 0.75 0.5938 +vt 0.875 0.5 +vt 0.75 0.5 +vt 0.75 0.4844 +vt 0.875 0.4844 +vt 0.766 0.4844 +vt 0.766 0.6094 +vt 0.75 0.6094 +vt 0.75 0.4844 +vt 0.8754 0.4844 +vt 0.8754 0.6094 +vt 0.8594 0.6094 +vt 0.8594 0.4844 +vt 0.125 0.6875 +vt 0.125 0.7344 +vt 0.0625 0.7344 +vt 0.0625 0.6875 +vt 0.0785 0.6875 +vt 0.0785 0.7344 +vt 0.0625 0.7344 +vt 0.0625 0.6875 +vt 0.1254 0.6875 +vt 0.1254 0.7344 +vt 0.1094 0.7344 +vt 0.1094 0.6875 +vt 0.75 0.6094 +vt 0.875 0.6094 +vt 0.875 0.5938 +vt 0.75 0.5938 +vt 0.875 0.5 +vt 0.75 0.5 +vt 0.75 0.4844 +vt 0.875 0.4844 +vt 0.766 0.4844 +vt 0.766 0.6094 +vt 0.75 0.6094 +vt 0.75 0.4844 +vt 0.8754 0.4844 +vt 0.8754 0.6094 +vt 0.8594 0.6094 +vt 0.8594 0.4844 +vt 0.0625 0.6875 +vt 0.0625 0.7344 +vt 0 0.7344 +vt 0 0.6875 +vt 0.016 0.6875 +vt 0.016 0.7344 +vt 0 0.7344 +vt 0 0.6875 +vt 0.0629 0.6875 +vt 0.0629 0.7344 +vt 0.0469 0.7344 +vt 0.0469 0.6875 +vt 0.625 0.25 +vt 0.625 1 +vt 0.5625 1 +vt 0.5625 0.25 +vt 0.6875 0.25 +vt 0.6875 1 +vt 0.625 1 +vt 0.625 0.25 +vt 0.6875 0.25 +vt 0.6875 1 +vt 0.5625 1 +vt 0.5625 0.25 +vt 0 0.0938 +vt 0 0.25 +vt 0.3125 0.25 +vt 0.3125 0.0938 +vt 0 0.0938 +vt 0 0.25 +vt 0.3125 0.25 +vt 0.3125 0.0938 +vt 0.875 1 +vt 0.875 0.6875 +vt 0.4375 0.6875 +vt 0.4375 1 +vt 0.875 1 +vt 0.875 0.6875 +vt 0.4375 0.6875 +vt 0.4375 1 +vt 0.4375 0.375 +vt 0.4375 0.5313 +vt 0.875 0.5313 +vt 0.875 0.375 +vt 0.4375 0.5313 +vt 0.4375 0.6875 +vt 0.875 0.6875 +vt 0.875 0.5313 +vt 0 0.0938 +vt 0 0.25 +vt 0.3125 0.25 +vt 0.3125 0.0938 +vt 0 0.0938 +vt 0 0.25 +vt 0.3125 0.25 +vt 0.3125 0.0938 +vt 0.875 1 +vt 0.875 0.6875 +vt 0.4375 0.6875 +vt 0.4375 1 +vt 0.875 1 +vt 0.875 0.6875 +vt 0.4375 0.6875 +vt 0.4375 1 +vt 0.4375 0.5313 +vt 0.4375 0.6875 +vt 0.875 0.6875 +vt 0.875 0.5313 +vt 0.4375 0.375 +vt 0.4375 0.5313 +vt 0.875 0.5313 +vt 0.875 0.375 +vt 0.875 0.4844 +vt 0.875 0.6094 +vt 0.75 0.6094 +vt 0.75 0.4844 +vt 0 0.75 +vt 0.2344 0.75 +vt 0.2344 1 +vt 0 1 +vt 0.4844 0.25 +vt 0.25 0.25 +vt 0.25 0.0156 +vt 0.4844 0.0156 +vt 0 0.2813 +vt 0.2344 0.2813 +vt 0.2344 0.4688 +vt 0 0.4688 +vt 0.7344 0.6563 +vt 0.7344 0.7031 +vt 0.75 0.7031 +vt 0.75 0.6563 +vt 0.7344 0.6563 +vt 0.7344 0.7031 +vt 0.75 0.7031 +vt 0.75 0.6563 +vt 0.6563 0.6563 +vt 0.7344 0.6563 +vt 0.7344 0.6406 +vt 0.6563 0.6406 +vt 0.6563 0.6563 +vt 0.7344 0.6563 +vt 0.7344 0.6406 +vt 0.6563 0.6406 +vt 0.3125 1 +vt 0.5 1 +vt 0.5 0.0625 +vt 0.3125 0.0625 +vt 0.5 1 +vt 0.3125 1 +vt 0.3125 0.0625 +vt 0.5 0.0625 +vt 0.5 1 +vt 0.4375 1 +vt 0.4375 0.0625 +vt 0.5 0.0625 +vt 0.375 0.0625 +vt 0.3125 0.0625 +vt 0.3125 1 +vt 0.375 1 +vt 0.3125 1 +vt 0.5 1 +vt 0.5 0 +vt 0.3125 0 +vt 0.5 1 +vt 0.3125 1 +vt 0.3125 0 +vt 0.5 0 +vt 0.5 1 +vt 0.4375 1 +vt 0.4375 0 +vt 0.5 0 +vt 0.375 0 +vt 0.3125 0 +vt 0.3125 1 +vt 0.375 1 +vt 0.3125 0.4375 +vt 0.5 0.4375 +vt 0.5 1 +vt 0.3125 1 +vt 0.5 0.4375 +vt 0.3125 0.4375 +vt 0.3125 1 +vt 0.5 1 +vt 0.5 0.4375 +vt 0.4375 0.4375 +vt 0.4375 1 +vt 0.5 1 +vt 0.375 1 +vt 0.3125 1 +vt 0.3125 0.4375 +vt 0.375 0.4375 +vt 0.5 1 +vt 0.3125 1 +vt 0.3125 0.0625 +vt 0.5 0.0625 +vt 0.375 0.0625 +vt 0.3125 0.0625 +vt 0.3125 1 +vt 0.375 1 +vt 0.5 1 +vt 0.3125 1 +vt 0.3125 0 +vt 0.5 0 +vt 0.375 0 +vt 0.3125 0 +vt 0.3125 1 +vt 0.375 1 +vt 0.5 0.4375 +vt 0.3125 0.4375 +vt 0.3125 1 +vt 0.5 1 +vt 0.375 1 +vt 0.3125 1 +vt 0.3125 0.4375 +vt 0.375 0.4375 +vt 0.9844 0 +vt 0.9844 0.0625 +vt 0.7656 0.0625 +vt 0.7656 0 +vt 1 0 +vt 1 0.0625 +vt 0.7813 0.0625 +vt 0.7813 0 +vt 0.9844 0.25 +vt 0.7656 0.25 +vt 0.7656 0.0625 +vt 0.9844 0.0625 +vt 0.9844 0.3906 +vt 0.9844 0.4531 +vt 0.7969 0.4531 +vt 0.7969 0.3906 +vt 0.9688 0.0313 +vt 0.9688 0.2188 +vt 0.7813 0.2188 +vt 0.7813 0.0313 +vt 0.7188 0.2188 +vt 0.7188 0.0313 +vt 0.75 0 +vt 0.75 0.25 +vt 0.5313 0.2188 +vt 0.7188 0.2188 +vt 0.75 0.25 +vt 0.5 0.25 +vt 0.5313 0.0313 +vt 0.5313 0.2188 +vt 0.5 0.25 +vt 0.5 0 +vt 0.7188 0.0313 +vt 0.5313 0.0313 +vt 0.5 0 +vt 0.75 0 +vt 0.1094 0.6094 +vt 0.1094 0.4844 +vt 0.125 0.4844 +vt 0.125 0.6094 +vt 0.0156 0.4844 +vt 0 0.4844 +vt 0 0.6094 +vt 0.0156 0.6094 +vt 0 0.4844 +vt 0.125 0.4844 +vt 0.125 0.6094 +vt 0 0.6094 +vt 0.125 0.4844 +vt 0.125 0.5 +vt 0 0.5 +vt 0 0.4844 +vt 0 0.6094 +vt 0.125 0.6094 +vt 0.125 0.5938 +vt 0 0.5938 +vt 0.0781 1 +vt 0.0781 0.9844 +vt 0.2656 0.9844 +vt 0.2656 1 +vt 0.25 1 +vt 0.25 0.9844 +vt 0.4375 0.9844 +vt 0.4375 1 +vt 0.1406 1 +vt 0.1406 0.9844 +vt 0.3281 0.9844 +vt 0.3281 1 +vt 0.1719 1 +vt 0.1719 0.9844 +vt 0.3594 0.9844 +vt 0.3594 1 +vn 0.96 0 -0.28 +vn -0.96 0 0.28 +vn 0 1 0 +vn 0 -1 0 +vn 0.28 0 0.96 +vn -0.28 0 -0.96 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 0 -1 +vn 0 0 -1 +vn 0 0 -1 +vn -1 0 0 +vn 1 0 0 +vn 1 0 0 +vn 0 -1 0 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn 1 0 0 +vn 0 0 1 +vn -0.71 0 -0.71 +vn 0 0 1 +vn 1 0 0 +vn 1 0 0 +vn 0 0 1 +vn 1 0 0 +vn 0 0 1 +vn 1 0 0 +vn -0.71 0 -0.71 +vn 0 0 1 +vn -0.71 0 -0.71 +vn 1 0 0 +vn 0 0 1 +vn 1 0 0 +vn 0 0 1 +vn 1 0 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 1 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 -1 0 +vn -0.71 0 -0.71 +vn 0 1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 -1 0 +vn 0 -1 0 +vn 0 1 0 +vn 0 1 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn -1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 -1 +vn 0 -1 0 +vn 1 0 0 +vn 1 0 0 +vn 1 0 0 +vn 1 0 0 +vn 0 0 1 +vn 0 -1 0 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn -1 0 0 +vn -1 0 0 +vn -1 0 0 +vn -1 0 0 +vn 0 0 1 +vn 0 -1 0 +vn 0 0 -1 +vn 0 1 0 +vn 0 0 -1 +vn 0 0 -1 +vn 0 1 0 +vn 0.97 0 -0.24 +vn -0.97 0 0.24 +vn 0 1 0 +vn 0.24 0 0.97 +vn -0.24 0 -0.97 +vn 0.97 0 -0.24 +vn -0.97 0 0.24 +vn 0 1 0 +vn 0.24 0 0.97 +vn -0.24 0 -0.97 +vn 0.97 0 -0.24 +vn -0.97 0 0.24 +vn 0 1 0 +vn 0.24 0 0.97 +vn -0.24 0 -0.97 +vn 0.97 0 -0.24 +vn -0.97 0 0.24 +vn 0 1 0 +vn 0.24 0 0.97 +vn -0.24 0 -0.97 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 -1 0 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn -0.1 0 0.99 +vn 0.1 0 -0.99 +vn 0 1 0 +vn -0.99 0 -0.1 +vn 0.99 0 0.1 +vn 0.1 0 0.99 +vn -0.1 0 -0.99 +vn 0 1 0 +vn -0.99 0 0.1 +vn 0.99 0 -0.1 +vn 1 0 0 +vn 0 1 -0.02 +vn 0 -1 0.02 +vn 0 0.02 1 +vn 0 -0.02 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 -1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 -1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn 1 0 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn -1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 1 0 +vn 0 -1 0 +vn 0 1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 1 0 +vn 1 0 0 +vn 0 0 -1 +vn -1 0 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 0 0 -1 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 0 -1 +vn -0.31 0 0.95 +vn 0.31 0 -0.95 +vn 0 1 0 +vn 0 -1 0 +vn -0.95 0 -0.31 +vn 0.95 0 0.31 +vn 0.9 0 0.44 +vn -0.9 0 -0.44 +vn 0 1 0 +vn 0 -1 0 +vn -0.44 0 0.9 +vn 0.44 0 -0.9 +vn 1 0 0 +vn 0 0 -1 +vn 0 -1 0 +vn 0 0 -1 +vn -1 0 0 +vn 1 0 0 +vn 0 0 -1 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 -1 0 +vn 0 0 -1 +vn -1 0 0 +vn 0 0 -1 +vn -1 0 0 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 1 0 +vn 0 1 0 +vn 0 1 0 +vn 0 1 0 +vn 0 1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn -1 0 0 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +usemtl metal +f 208/501/126 206/502/126 205/503/126 207/504/126 +f 211/505/127 209/506/127 210/507/127 212/508/127 +f 205/509/128 206/510/128 210/511/128 209/512/128 +f 208/513/129 207/514/129 211/515/129 212/516/129 +f 207/517/130 205/518/130 209/519/130 211/520/130 +f 212/521/131 210/522/131 206/523/131 208/524/131 +usemtl arithmetic_logic_machine +f 216/525/132 214/526/132 213/527/132 215/528/132 +f 219/529/133 217/530/133 218/531/133 220/532/133 +f 213/533/134 214/534/134 218/535/134 217/536/134 +f 216/537/135 215/538/135 219/539/135 220/540/135 +f 220/541/136 218/542/136 214/543/136 216/544/136 +usemtl common_steel +f 221/545/137 222/546/137 224/547/137 223/548/137 +f 229/549/138 227/550/138 228/551/138 230/552/138 +f 230/553/139 228/554/139 225/555/139 226/556/139 +f 235/557/140 234/558/140 232/559/140 233/560/140 +f 234/561/141 224/562/141 222/563/141 225/564/141 +usemtl arithmetic_logic_machine +f 224/565/142 235/566/142 237/567/142 223/568/142 +f 222/569/143 221/570/143 236/571/143 226/572/143 +usemtl common_steel +f 233/573/144 232/574/144 231/575/144 238/576/144 +f 232/577/145 651/578/145 650/579/145 231/580/145 +usemtl common_table +f 231/581/146 650/582/146 649/583/146 239/584/146 +usemtl arithmetic_logic_machine +f 244/585/147 242/586/147 241/587/147 243/588/147 +f 243/589/148 241/590/148 245/591/148 246/592/148 +f 249/593/149 248/594/149 247/595/149 241/596/149 +f 241/597/150 247/598/150 250/599/150 252/600/150 +f 253/601/151 251/602/151 248/603/151 249/604/151 +f 256/605/152 254/606/152 258/607/152 245/608/152 +f 257/609/153 255/610/153 254/611/153 256/612/153 +f 242/613/154 260/614/154 259/615/154 261/616/154 +f 261/617/155 259/618/155 262/619/155 263/620/155 +f 266/621/156 244/622/156 264/623/156 265/624/156 +f 265/625/157 264/626/157 267/627/157 268/628/157 +f 271/629/158 269/630/158 243/631/158 270/632/158 +f 274/633/159 272/634/159 273/635/159 275/636/159 +f 270/637/160 243/638/160 272/639/160 274/640/160 +f 275/641/161 273/642/161 269/643/161 271/644/161 +f 279/645/162 277/646/162 276/647/162 278/648/162 +f 278/649/163 276/650/163 246/651/163 280/652/163 +f 260/653/164 221/654/164 281/655/164 247/656/164 +f 247/657/165 281/658/165 282/659/165 258/660/165 +f 285/661/166 266/662/166 270/663/166 284/664/166 +usemtl common_bottom +f 285/665/167 284/666/167 286/667/167 287/668/167 +usemtl arithmetic_logic_machine +f 284/669/168 270/670/168 280/671/168 286/672/168 +f 251/673/169 255/674/169 257/675/169 253/676/169 +f 251/677/170 253/678/170 263/679/170 262/680/170 +f 256/681/171 252/682/171 253/683/171 257/684/171 +f 259/685/172 248/686/172 251/687/172 262/688/172 +f 255/689/173 251/690/173 250/691/173 254/692/173 +f 252/693/174 250/694/174 251/695/174 253/696/174 +f 263/697/175 253/698/175 249/699/175 261/700/175 +f 267/701/176 273/702/176 275/703/176 268/704/176 +f 279/705/177 275/706/177 273/707/177 277/708/177 +f 277/709/178 273/710/178 272/711/178 276/712/178 +f 264/713/179 269/714/179 273/715/179 267/716/179 +f 268/717/180 275/718/180 271/719/180 265/720/180 +f 278/721/181 274/722/181 275/723/181 279/724/181 +f 292/725/182 290/726/182 291/727/182 293/728/182 +usemtl common_steel +f 288/729/183 289/730/183 291/731/183 290/732/183 +usemtl common_bottom +f 287/733/184 286/734/184 292/735/184 293/736/184 +usemtl arithmetic_logic_machine +f 286/737/185 288/738/185 290/739/185 292/740/185 +usemtl common_steel +f 288/741/186 282/742/186 283/743/186 289/744/186 +f 223/745/187 291/746/187 289/747/187 283/748/187 +usemtl common_table +f 239/749/188 649/750/188 652/751/188 295/752/188 +usemtl common_steel +f 306/753/189 304/754/189 305/755/189 307/756/189 +usemtl common_bottom +f 297/757/190 298/758/190 287/759/190 293/760/190 +usemtl common_steel +f 235/761/191 299/762/191 298/763/191 297/764/191 +f 296/765/192 298/766/192 299/767/192 226/768/192 +usemtl common_bottom +f 285/769/193 287/770/193 298/771/193 296/772/193 +usemtl common_steel +f 300/773/194 302/774/194 296/775/194 226/776/194 +f 301/777/195 300/778/195 226/779/195 236/780/195 +f 303/781/196 301/782/196 236/783/196 285/784/196 +f 302/785/197 303/786/197 285/787/197 296/788/197 +f 304/789/198 306/790/198 302/791/198 300/792/198 +f 305/793/199 304/794/199 300/795/199 301/796/199 +f 307/797/200 305/798/200 301/799/200 303/800/200 +f 306/801/201 307/802/201 303/803/201 302/804/201 +f 309/805/202 308/806/202 310/807/202 311/808/202 +f 297/809/203 315/810/203 312/811/203 235/812/203 +f 235/813/204 312/814/204 313/815/204 237/816/204 +f 237/817/205 313/818/205 314/819/205 293/820/205 +f 293/821/206 314/822/206 315/823/206 297/824/206 +f 315/825/207 310/826/207 308/827/207 312/828/207 +f 312/829/208 308/830/208 309/831/208 313/832/208 +f 313/833/209 309/834/209 311/835/209 314/836/209 +f 314/837/210 311/838/210 310/839/210 315/840/210 +usemtl arithmetic_logic_machine +f 317/841/211 318/842/211 319/843/211 233/844/211 +f 230/845/212 320/846/212 321/847/212 316/848/212 +f 322/849/213 316/850/213 317/851/213 323/852/213 +f 327/853/214 325/854/214 324/855/214 326/856/214 +f 330/857/215 328/858/215 329/859/215 331/860/215 +f 324/861/216 325/862/216 329/863/216 328/864/216 +f 326/865/217 324/866/217 328/867/217 330/868/217 +f 331/869/218 329/870/218 325/871/218 327/872/218 +f 335/873/219 333/874/219 332/875/219 334/876/219 +f 338/877/220 336/878/220 337/879/220 339/880/220 +f 332/881/221 333/882/221 337/883/221 336/884/221 +f 334/885/222 332/886/222 336/887/222 338/888/222 +f 339/889/223 337/890/223 333/891/223 335/892/223 +f 343/893/224 341/894/224 340/895/224 342/896/224 +f 346/897/225 344/898/225 345/899/225 347/900/225 +f 340/901/226 341/902/226 345/903/226 344/904/226 +f 342/905/227 340/906/227 344/907/227 346/908/227 +f 347/909/228 345/910/228 341/911/228 343/912/228 +f 351/913/229 349/914/229 348/915/229 350/916/229 +f 354/917/230 352/918/230 353/919/230 355/920/230 +f 348/921/231 349/922/231 353/923/231 352/924/231 +f 350/925/232 348/926/232 352/927/232 354/928/232 +f 355/929/233 353/930/233 349/931/233 351/932/233 +f 359/933/234 357/934/234 356/935/234 358/936/234 +f 362/937/235 360/938/235 361/939/235 363/940/235 +f 356/941/236 357/942/236 361/943/236 360/944/236 +f 363/945/237 361/946/237 357/947/237 359/948/237 +f 364/949/238 365/950/238 367/951/238 366/952/238 +f 369/953/239 368/954/239 370/955/239 371/956/239 +f 369/957/240 365/958/240 364/959/240 368/960/240 +f 365/961/241 369/962/241 371/963/241 367/964/241 +usemtl common_thingies +f 375/965/242 373/966/242 372/967/242 374/968/242 +f 378/969/243 376/970/243 377/971/243 379/972/243 +f 372/973/244 373/974/244 377/975/244 376/976/244 +f 375/977/245 374/978/245 378/979/245 379/980/245 +f 379/981/246 377/982/246 373/983/246 375/984/246 +usemtl arithmetic_logic_machine +f 383/985/247 381/986/247 380/987/247 382/988/247 +f 386/989/248 384/990/248 385/991/248 387/992/248 +f 380/993/249 381/994/249 385/995/249 384/996/249 +f 382/997/250 380/998/250 384/999/250 386/1000/250 +f 387/1001/251 385/1002/251 381/1003/251 383/1004/251 +f 391/1005/252 389/1006/252 388/1007/252 390/1008/252 +f 394/1009/253 392/1010/253 393/1011/253 395/1012/253 +f 390/1013/254 388/1014/254 392/1015/254 394/1016/254 +f 395/1017/255 393/1018/255 389/1019/255 391/1020/255 +usemtl circuit_basic +f 399/1021/256 397/1022/256 396/1023/256 398/1024/256 +f 402/1025/257 400/1026/257 401/1027/257 403/1028/257 +f 396/1029/258 397/1030/258 401/1031/258 400/1032/258 +f 398/1033/259 396/1034/259 400/1035/259 402/1036/259 +f 403/1037/260 401/1038/260 397/1039/260 399/1040/260 +usemtl arithmetic_logic_machine +f 407/1041/261 405/1042/261 404/1043/261 406/1044/261 +f 410/1045/262 408/1046/262 409/1047/262 411/1048/262 +f 404/1049/263 405/1050/263 409/1051/263 408/1052/263 +f 406/1053/264 404/1054/264 408/1055/264 410/1056/264 +f 411/1057/265 409/1058/265 405/1059/265 407/1060/265 +f 415/1061/266 413/1062/266 412/1063/266 414/1064/266 +f 412/1065/267 413/1066/267 417/1067/267 416/1068/267 +f 415/1069/268 414/1070/268 418/1071/268 419/1072/268 +f 414/1073/269 412/1074/269 416/1075/269 418/1076/269 +f 419/1077/270 417/1078/270 413/1079/270 415/1080/270 +f 423/1081/271 421/1082/271 420/1083/271 422/1084/271 +f 426/1085/272 424/1086/272 425/1087/272 427/1088/272 +f 420/1089/273 421/1090/273 425/1091/273 424/1092/273 +f 422/1093/274 420/1094/274 424/1095/274 426/1096/274 +f 427/1097/275 425/1098/275 421/1099/275 423/1100/275 +f 431/1101/276 429/1102/276 428/1103/276 430/1104/276 +f 428/1105/277 429/1106/277 433/1107/277 432/1108/277 +f 430/1109/278 428/1110/278 432/1111/278 434/1112/278 +f 435/1113/279 433/1114/279 429/1115/279 431/1116/279 +f 434/1117/280 435/1118/280 431/1119/280 430/1120/280 +f 439/1121/281 437/1122/281 436/1123/281 438/1124/281 +f 442/1125/282 440/1126/282 441/1127/282 443/1128/282 +f 436/1129/283 437/1130/283 441/1131/283 440/1132/283 +f 438/1133/284 436/1134/284 440/1135/284 442/1136/284 +f 443/1137/285 441/1138/285 437/1139/285 439/1140/285 +f 447/1141/286 445/1142/286 444/1143/286 446/1144/286 +f 450/1145/287 448/1146/287 449/1147/287 451/1148/287 +f 444/1149/288 445/1150/288 449/1151/288 448/1152/288 +f 446/1153/289 444/1154/289 448/1155/289 450/1156/289 +f 451/1157/290 449/1158/290 445/1159/290 447/1160/290 +f 455/1161/291 453/1162/291 452/1163/291 454/1164/291 +f 452/1165/292 453/1166/292 457/1167/292 456/1168/292 +f 454/1169/293 452/1170/293 456/1171/293 458/1172/293 +f 459/1173/294 457/1174/294 453/1175/294 455/1176/294 +f 458/1177/295 459/1178/295 455/1179/295 454/1180/295 +f 463/1181/296 461/1182/296 460/1183/296 462/1184/296 +f 466/1185/297 464/1186/297 465/1187/297 467/1188/297 +f 460/1189/298 461/1190/298 465/1191/298 464/1192/298 +f 462/1193/299 460/1194/299 464/1195/299 466/1196/299 +f 467/1197/300 465/1198/300 461/1199/300 463/1200/300 +f 471/1201/301 469/1202/301 468/1203/301 470/1204/301 +f 474/1205/302 472/1206/302 473/1207/302 475/1208/302 +f 471/1209/303 470/1210/303 474/1211/303 475/1212/303 +f 470/1213/304 468/1214/304 472/1215/304 474/1216/304 +f 475/1217/305 473/1218/305 469/1219/305 471/1220/305 +f 479/1221/306 477/1222/306 476/1223/306 478/1224/306 +f 482/1225/307 480/1226/307 481/1227/307 483/1228/307 +f 478/1229/308 476/1230/308 480/1231/308 482/1232/308 +f 483/1233/309 481/1234/309 477/1235/309 479/1236/309 +f 476/1237/310 477/1238/310 481/1239/310 480/1240/310 +f 487/1241/311 485/1242/311 484/1243/311 486/1244/311 +f 487/1245/312 486/1246/312 489/1247/312 490/1248/312 +f 486/1249/313 484/1250/313 366/1251/313 489/1252/313 +f 490/1253/314 488/1254/314 485/1255/314 487/1256/314 +f 491/1257/315 492/1258/315 494/1259/315 493/1260/315 +f 497/1261/316 493/1262/316 494/1263/316 498/1264/316 +f 495/1265/317 491/1266/317 493/1267/317 497/1268/317 +f 492/1269/318 496/1270/318 498/1271/318 494/1272/318 +usemtl common_table +f 502/1273/319 500/1274/319 499/1275/319 501/1276/319 +f 505/1277/320 503/1278/320 504/1279/320 506/1280/320 +f 502/1281/321 501/1282/321 505/1283/321 506/1284/321 +f 501/1285/322 499/1286/322 503/1287/322 505/1288/322 +f 506/1289/323 504/1290/323 500/1291/323 502/1292/323 +f 510/1293/324 508/1294/324 507/1295/324 509/1296/324 +f 513/1297/325 511/1298/325 512/1299/325 514/1300/325 +f 510/1301/326 509/1302/326 513/1303/326 514/1304/326 +f 509/1305/327 507/1306/327 511/1307/327 513/1308/327 +f 514/1309/328 512/1310/328 508/1311/328 510/1312/328 +f 518/1313/329 516/1314/329 515/1315/329 517/1316/329 +f 521/1317/330 519/1318/330 520/1319/330 522/1320/330 +f 518/1321/331 517/1322/331 521/1323/331 522/1324/331 +f 517/1325/332 515/1326/332 519/1327/332 521/1328/332 +f 522/1329/333 520/1330/333 516/1331/333 518/1332/333 +f 526/1333/334 524/1334/334 523/1335/334 525/1336/334 +f 529/1337/335 527/1338/335 528/1339/335 530/1340/335 +f 526/1341/336 525/1342/336 529/1343/336 530/1344/336 +f 525/1345/337 523/1346/337 527/1347/337 529/1348/337 +f 530/1349/338 528/1350/338 524/1351/338 526/1352/338 +f 533/1353/339 531/1354/339 226/1355/339 532/1356/339 +f 535/1357/340 235/1358/340 534/1359/340 536/1360/340 +f 532/1361/341 226/1362/341 235/1363/341 535/1364/341 +f 536/1365/342 534/1366/342 531/1367/342 533/1368/342 +f 235/1369/343 226/1370/343 531/1371/343 534/1372/343 +f 536/1373/344 533/1374/344 532/1375/344 535/1376/344 +usemtl arithmetic_logic_machine +f 537/1377/345 538/1378/345 540/1379/345 539/1380/345 +f 544/1381/346 542/1382/346 541/1383/346 543/1384/346 +f 547/1385/347 545/1386/347 546/1387/347 548/1388/347 +f 541/1389/348 542/1390/348 546/1391/348 545/1392/348 +f 544/1393/349 543/1394/349 547/1395/349 548/1396/349 +f 548/1397/350 546/1398/350 542/1399/350 544/1400/350 +f 552/1401/351 550/1402/351 549/1403/351 551/1404/351 +f 555/1405/352 553/1406/352 554/1407/352 556/1408/352 +f 549/1409/353 550/1410/353 554/1411/353 553/1412/353 +f 552/1413/354 551/1414/354 555/1415/354 556/1416/354 +f 556/1417/355 554/1418/355 550/1419/355 552/1420/355 +f 560/1421/356 558/1422/356 557/1423/356 559/1424/356 +f 563/1425/357 561/1426/357 562/1427/357 564/1428/357 +f 557/1429/358 558/1430/358 562/1431/358 561/1432/358 +f 560/1433/359 559/1434/359 563/1435/359 564/1436/359 +f 564/1437/360 562/1438/360 558/1439/360 560/1440/360 +f 568/1441/361 566/1442/361 565/1443/361 567/1444/361 +f 571/1445/362 569/1446/362 570/1447/362 572/1448/362 +f 565/1449/363 566/1450/363 570/1451/363 569/1452/363 +f 568/1453/364 567/1454/364 571/1455/364 572/1456/364 +f 572/1457/365 570/1458/365 566/1459/365 568/1460/365 +f 576/1461/366 574/1462/366 573/1463/366 575/1464/366 +f 579/1465/367 577/1466/367 578/1467/367 580/1468/367 +f 573/1469/368 574/1470/368 578/1471/368 577/1472/368 +f 576/1473/369 575/1474/369 579/1475/369 580/1476/369 +f 580/1477/370 578/1478/370 574/1479/370 576/1480/370 +usemtl common_steel +f 581/1481/371 320/1482/371 319/1483/371 582/1484/371 +f 319/1485/372 318/1486/372 583/1487/372 582/1488/372 +f 582/1489/373 583/1490/373 584/1491/373 581/1492/373 +f 581/1493/374 584/1494/374 321/1495/374 320/1496/374 +usemtl common_thingies +f 588/1497/375 586/1498/375 585/1499/375 587/1500/375 +f 591/1501/376 589/1502/376 590/1503/376 592/1504/376 +f 585/1505/377 586/1506/377 590/1507/377 589/1508/377 +f 588/1509/378 587/1510/378 591/1511/378 592/1512/378 +f 587/1513/379 585/1514/379 589/1515/379 591/1516/379 +f 596/1517/380 594/1518/380 593/1519/380 595/1520/380 +f 593/1521/381 594/1522/381 598/1523/381 597/1524/381 +f 596/1525/382 595/1526/382 599/1527/382 600/1528/382 +f 595/1529/383 593/1530/383 597/1531/383 599/1532/383 +f 600/1533/384 598/1534/384 594/1535/384 596/1536/384 +f 604/1537/385 602/1538/385 601/1539/385 603/1540/385 +f 603/1541/386 601/1542/386 605/1543/386 607/1544/386 +f 608/1545/387 606/1546/387 602/1547/387 604/1548/387 +f 609/1549/388 610/1550/388 614/1551/388 613/1552/388 +f 612/1553/389 611/1554/389 615/1555/389 616/1556/389 +f 611/1557/390 609/1558/390 613/1559/390 615/1560/390 +f 616/1561/391 614/1562/391 610/1563/391 612/1564/391 +f 620/1565/392 618/1566/392 617/1567/392 619/1568/392 +f 619/1569/393 617/1570/393 621/1571/393 623/1572/393 +f 624/1573/394 622/1574/394 618/1575/394 620/1576/394 +usemtl common_copper_cable +f 628/1577/395 626/1578/395 625/1579/395 627/1580/395 +f 631/1581/396 629/1582/396 630/1583/396 632/1584/396 +f 632/1585/397 630/1586/397 626/1587/397 628/1588/397 +usemtl metal +f 636/1589/398 634/1590/398 633/1591/398 635/1592/398 +f 639/1593/399 637/1594/399 638/1595/399 640/1596/399 +f 633/1597/400 634/1598/400 638/1599/400 637/1600/400 +f 636/1601/401 635/1602/401 639/1603/401 640/1604/401 +f 635/1605/402 633/1606/402 637/1607/402 639/1608/402 +f 640/1609/403 638/1610/403 634/1611/403 636/1612/403 +usemtl wooden +f 644/1613/404 642/1614/404 641/1615/404 643/1616/404 +f 647/1617/405 645/1618/405 646/1619/405 648/1620/405 +f 641/1621/406 642/1622/406 646/1623/406 645/1624/406 +f 644/1625/407 643/1626/407 647/1627/407 648/1628/407 +f 643/1629/408 641/1630/408 645/1631/408 647/1632/408 +f 648/1633/409 646/1634/409 642/1635/409 644/1636/409 +usemtl common_thingies +f 612/1637/410 610/1638/410 609/1639/410 611/1640/410 +usemtl common_table +f 240/1641/411 649/1642/411 650/1643/411 227/1644/411 +usemtl common_steel +f 227/1645/412 650/1646/412 651/1647/412 228/1648/412 +usemtl common_table +f 294/1649/413 652/1650/413 649/1651/413 240/1652/413 +usemtl arithmetic_logic_machine +f 653/1653/414 659/1654/414 660/1655/414 655/1656/414 +f 657/1657/415 654/1658/415 656/1659/415 658/1660/415 +f 654/1661/416 653/1662/416 655/1663/416 656/1664/416 +f 659/1665/417 657/1666/417 658/1667/417 660/1668/417 +usemtl common_copper_cable +f 661/1669/418 662/1670/418 666/1671/418 665/1672/418 +f 664/1673/419 663/1674/419 667/1675/419 668/1676/419 +f 663/1677/420 661/1678/420 665/1679/420 667/1680/420 +f 668/1681/421 666/1682/421 662/1683/421 664/1684/421 +f 669/1685/422 670/1686/422 664/1687/422 663/1688/422 +f 672/1689/423 671/1690/423 673/1691/423 674/1692/423 +f 671/1693/424 669/1694/424 663/1695/424 673/1696/424 +f 674/1697/425 664/1698/425 670/1699/425 672/1700/425 +f 675/1701/426 676/1702/426 670/1703/426 669/1704/426 +f 678/1705/427 677/1706/427 671/1707/427 672/1708/427 +f 677/1709/428 675/1710/428 669/1711/428 671/1712/428 +f 672/1713/429 670/1714/429 676/1715/429 678/1716/429 +f 681/1717/430 680/1718/430 683/1719/430 684/1720/430 +f 684/1721/431 682/1722/431 679/1723/431 681/1724/431 +f 687/1725/432 686/1726/432 688/1727/432 689/1728/432 +f 689/1729/433 681/1730/433 685/1731/433 687/1732/433 +f 692/1733/434 691/1734/434 686/1735/434 687/1736/434 +f 687/1737/435 685/1738/435 690/1739/435 692/1740/435 +usemtl common_table +f 696/1741/436 694/1742/436 693/1743/436 695/1744/436 +f 699/1745/437 697/1746/437 698/1747/437 700/1748/437 +f 696/1749/438 695/1750/438 699/1751/438 700/1752/438 +f 700/1753/439 698/1754/439 694/1755/439 696/1756/439 +usemtl common_steel +f 705/1757/440 703/1758/440 704/1759/440 706/1760/440 +f 708/1761/441 709/1762/441 710/1763/441 702/1764/441 +f 707/1765/442 708/1766/442 702/1767/442 701/1768/442 +f 711/1769/443 707/1770/443 701/1771/443 712/1772/443 +f 709/1773/444 711/1774/444 712/1775/444 710/1776/444 +usemtl common_thingies +f 714/1777/445 713/1778/445 715/1779/445 716/1780/445 +f 719/1781/446 717/1782/446 718/1783/446 720/1784/446 +f 717/1785/447 713/1786/447 714/1787/447 718/1788/447 +f 715/1789/448 713/1790/448 717/1791/448 719/1792/448 +f 718/1793/449 714/1794/449 716/1795/449 720/1796/449 +usemtl common_steel +f 709/1797/450 705/1798/450 706/1799/450 711/1800/450 +f 711/1801/451 706/1802/451 704/1803/451 707/1804/451 +f 707/1805/452 704/1806/452 703/1807/452 708/1808/452 +f 708/1809/453 703/1810/453 705/1811/453 709/1812/453 \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/models/block/multiblock/data_input_machine/data_input_machine_preview.obj b/src/main/resources/assets/immersiveintelligence/models/block/multiblock/data_input_machine/data_input_machine_preview.obj new file mode 100644 index 000000000..cdae5a737 --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/models/block/multiblock/data_input_machine/data_input_machine_preview.obj @@ -0,0 +1,3864 @@ +# Made by Pabilo8 with Blockbench +# Exported with IIToolkit Plugin on 03/06/2026 +mtllib data_input_machine.mtl + +o main +v 0 -0.1875 0.125 +v 0 -0.1875 1 +v 0 -0.4375 0.125 +v 0 -0.4375 1 +v -0.75 -0.1875 0.125 +v -0.75 -0.1875 1 +v -0.75 -0.4375 0.125 +v -0.75 -0.4375 1 +v 1 0 1 +v -1 0 1 +v 1 1 1 +v 1 1 2 +v 1 0 2 +v -1 1 1 +v -1 1 2 +v -1 0 2 +v 1 -1 1 +v 1 -1 2 +v -1 -1 1 +v -1 -1 2 +v 0 1 2 +v 0 0 2 +v 0 1 1 +v 0 0 1 +v 0 -1 1 +v 0 -1 2 +v 0.0625 2 1 +v 0.0625 2 2 +v 0.0625 1 1 +v 0.0625 1 2 +v -1 2 1 +v -1 2 2 +v 1 -0.125 1.125 +v 1 -0.125 1.875 +v 1 -0.875 1.125 +v 1 -0.875 1.875 +v 0.9375 -0.875 1.875 +v 0.9375 -0.875 1.125 +v 0.9375 -0.125 1.125 +v 0.9375 -0.125 1.875 +v -0.9375 -0.125 1.875 +v -0.9375 -0.125 1.125 +v -0.9375 -0.875 1.875 +v -0.9375 -0.875 1.125 +v -1 -0.125 1.125 +v -1 -0.125 1.875 +v -1 -0.875 1.875 +v -1 -0.875 1.125 +v -0.875 1.9375 1.875 +v -0.875 1.9375 1.125 +v -0.125 1.9375 1.875 +v -0.125 1.9375 1.125 +v -0.875 2 1.125 +v -0.875 2 1.875 +v -0.125 2 1.875 +v 0 2 2 +v -0.125 2 1.125 +v 0 2 1 +v 0.9375 2 1 +v 0.9375 1.9375 1 +v 0.9375 1.9375 2 +v 0.0625 1.9375 1 +v 0.0625 1.9375 2 +v 0.9375 1.9375 1.9375 +v 0.9375 1 1.9375 +v 0.0625 1.9375 1.9375 +v 0.0625 1 1.9375 +v 1 2 1 +v 1 2 2 +v 0.9375 2 2 +v 0.9375 1 1 +v 0.9375 1 2 +v -1 1.5 1.2188 +v -1 1.5 1.7813 +v -1 1.125 1.2188 +v -1 1.125 1.7813 +v -1.0625 1.5 1.2188 +v -1.0625 1.5 1.7813 +v -1.0625 1.125 1.2188 +v -1.0625 1.125 1.7813 +v 0.4375 0.625 0.9375 +v 0.4375 0.5625 0.9375 +v 0.4375 0.5625 1 +v -0.0625 0.625 0.9375 +v -0.0625 0.5625 0.9375 +v -0.0625 0.5625 1 +v 0.375 0.75 0.9375 +v 0.375 0.75 1 +v 0.4375 0.6875 0.9375 +v 0.4375 0.6875 1 +v 0 0.75 0.9375 +v 0 0.75 1 +v -0.0625 0.6875 0.9375 +v -0.0625 0.6875 1 +v 0 0.6875 0.9375 +v 0 0.6875 1 +v 0 0.625 0.9375 +v 0 0.625 1 +v 0.375 0.6875 0.9375 +v 0.375 0.6875 1 +v 0.375 0.625 0.9375 +v 0.375 0.625 1 +v 0.4375 0.625 0.9922 +v -0.0625 0.625 0.9922 +v 0.4375 0.6875 0.9922 +v -0.0625 0.6875 0.9922 +v 0.4375 0.375 0.9375 +v 0.4375 0.3125 0.9375 +v 0.4375 0.3125 1 +v -0.0625 0.375 0.9375 +v -0.0625 0.3125 0.9375 +v -0.0625 0.3125 1 +v 0.375 0.5 0.9375 +v 0.375 0.5 1 +v 0.4375 0.4375 0.9375 +v 0.4375 0.4375 1 +v 0 0.5 0.9375 +v 0 0.5 1 +v -0.0625 0.4375 0.9375 +v -0.0625 0.4375 1 +v 0 0.4375 0.9375 +v 0 0.4375 1 +v 0 0.375 0.9375 +v 0 0.375 1 +v 0.375 0.4375 0.9375 +v 0.375 0.4375 1 +v 0.375 0.375 0.9375 +v 0.375 0.375 1 +v 0.4375 0.375 0.9922 +v -0.0625 0.375 0.9922 +v 0.4375 0.4375 0.9922 +v -0.0625 0.4375 0.9922 +v 0.9375 0.9076 0.9688 +v 0.9375 0.9049 1.0312 +v 0.9375 0.1583 0.9361 +v 0.9375 0.1556 0.9985 +v 0.4375 0.9076 0.9688 +v 0.4375 0.9049 1.0312 +v 0.4375 0.1583 0.9361 +v 0.4375 0.1556 0.9985 +v 0.5938 1.8438 1.9375 +v 0.625 1.8125 1.8125 +v 0.5938 1.0313 1.9375 +v 0.625 1.0625 1.8125 +v 0.7188 1.8438 1.9375 +v 0.6875 1.8125 1.8125 +v 0.7188 1.0313 1.9375 +v 0.6875 1.0625 1.8125 +v 0.7813 1.8438 1.9375 +v 0.8125 1.8125 1.8125 +v 0.7813 1.0313 1.9375 +v 0.8125 1.0625 1.8125 +v 0.9063 1.8438 1.9375 +v 0.875 1.8125 1.8125 +v 0.9063 1.0313 1.9375 +v 0.875 1.0625 1.8125 +v 0.4063 1.8438 1.9375 +v 0.4375 1.8125 1.8125 +v 0.4063 1.0313 1.9375 +v 0.4375 1.0625 1.8125 +v 0.5313 1.8438 1.9375 +v 0.5 1.8125 1.8125 +v 0.5313 1.0313 1.9375 +v 0.5 1.0625 1.8125 +v 0.3755 1.7539 1.6964 +v 0.42 1.065 1.1339 +v 0.4396 1.8148 1.1339 +v 0.42 1.065 1.8839 +v 0.4396 1.8148 1.8839 +v 0.4824 1.0634 1.1339 +v 0.5021 1.8131 1.1339 +v 0.4824 1.0634 1.8839 +v 0.5021 1.8131 1.8839 +v 0.3657 1.3791 1.1964 +v 0.3755 1.7539 1.1964 +v 0.3657 1.3791 1.4151 +v 0.3755 1.7539 1.4151 +v 0.4281 1.3774 1.1964 +v 0.438 1.7523 1.1964 +v 0.4281 1.3774 1.4151 +v 0.438 1.7523 1.4151 +v 0.3657 1.3791 1.4464 +v 0.3755 1.7539 1.4464 +v 0.3657 1.3791 1.6651 +v 0.3755 1.7539 1.6651 +v 0.4281 1.3774 1.4464 +v 0.438 1.7523 1.4464 +v 0.4281 1.3774 1.6651 +v 0.438 1.7523 1.6651 +v 0.3624 1.2541 1.6964 +v 0.3657 1.3791 1.6964 +v 0.3624 1.2541 1.8214 +v 0.3657 1.3791 1.8214 +v 0.4249 1.2525 1.6964 +v 0.4281 1.3774 1.6964 +v 0.4249 1.2525 1.8214 +v 0.4281 1.3774 1.8214 +v 0.3673 1.4415 1.6964 +v 0.3706 1.5665 1.6964 +v 0.3673 1.4415 1.8214 +v 0.3706 1.5665 1.8214 +v 0.4298 1.4399 1.6964 +v 0.433 1.5649 1.6964 +v 0.4298 1.4399 1.8214 +v 0.433 1.5649 1.8214 +v 0.3722 1.629 1.6964 +v 0.3722 1.629 1.8214 +v 0.3755 1.7539 1.8214 +v 0.4347 1.6273 1.6964 +v 0.438 1.7523 1.6964 +v 0.4347 1.6273 1.8214 +v 0.438 1.7523 1.8214 +v 0.5628 1.7458 1.6964 +v 0.6073 1.0569 1.1339 +v 0.6269 1.8066 1.1339 +v 0.6073 1.0569 1.8839 +v 0.6269 1.8066 1.8839 +v 0.6698 1.0552 1.1339 +v 0.6894 1.805 1.1339 +v 0.6698 1.0552 1.8839 +v 0.6894 1.805 1.8839 +v 0.5421 1.1211 1.1964 +v 0.5519 1.496 1.1964 +v 0.5421 1.1211 1.4151 +v 0.5519 1.496 1.4151 +v 0.6046 1.1195 1.1964 +v 0.6144 1.4944 1.1964 +v 0.6046 1.1195 1.4151 +v 0.6144 1.4944 1.4151 +v 0.5421 1.1211 1.4464 +v 0.5519 1.496 1.4464 +v 0.5421 1.1211 1.6651 +v 0.5519 1.496 1.6651 +v 0.6046 1.1195 1.4464 +v 0.6144 1.4944 1.4464 +v 0.6046 1.1195 1.6651 +v 0.6144 1.4944 1.6651 +v 0.5497 1.2459 1.6964 +v 0.553 1.3709 1.6964 +v 0.5497 1.2459 1.8214 +v 0.553 1.3709 1.8214 +v 0.6122 1.2443 1.6964 +v 0.6155 1.3693 1.6964 +v 0.6122 1.2443 1.8214 +v 0.6155 1.3693 1.8214 +v 0.5546 1.4334 1.6964 +v 0.5579 1.5583 1.6964 +v 0.5546 1.4334 1.8214 +v 0.5579 1.5583 1.8214 +v 0.6171 1.4317 1.6964 +v 0.6204 1.5567 1.6964 +v 0.6171 1.4317 1.8214 +v 0.6204 1.5567 1.8214 +v 0.5595 1.6208 1.6964 +v 0.5595 1.6208 1.8214 +v 0.5628 1.7458 1.8214 +v 0.622 1.6192 1.6964 +v 0.6253 1.7441 1.6964 +v 0.622 1.6192 1.8214 +v 0.6253 1.7441 1.8214 +v 0.7501 1.7532 1.6964 +v 0.7946 1.0643 1.1339 +v 0.8142 1.814 1.1339 +v 0.7946 1.0643 1.8839 +v 0.8142 1.814 1.8839 +v 0.8571 1.0627 1.1339 +v 0.8767 1.8124 1.1339 +v 0.8571 1.0627 1.8839 +v 0.8767 1.8124 1.8839 +v 0.7403 1.3783 1.1964 +v 0.7501 1.7532 1.1964 +v 0.7403 1.3783 1.4151 +v 0.7501 1.7532 1.4151 +v 0.8028 1.3767 1.1964 +v 0.8126 1.7516 1.1964 +v 0.8028 1.3767 1.4151 +v 0.8126 1.7516 1.4151 +v 0.7321 1.191 1.4464 +v 0.7419 1.5659 1.4464 +v 0.7321 1.191 1.6651 +v 0.7419 1.5659 1.6651 +v 0.7946 1.1894 1.4464 +v 0.8044 1.5642 1.4464 +v 0.7946 1.1894 1.6651 +v 0.8044 1.5642 1.6651 +v 0.737 1.2534 1.6964 +v 0.7403 1.3783 1.6964 +v 0.737 1.2534 1.8214 +v 0.7403 1.3783 1.8214 +v 0.7995 1.2517 1.6964 +v 0.8028 1.3767 1.6964 +v 0.7995 1.2517 1.8214 +v 0.8028 1.3767 1.8214 +v 0.7419 1.4408 1.6964 +v 0.7452 1.5658 1.6964 +v 0.7419 1.4408 1.8214 +v 0.7452 1.5658 1.8214 +v 0.8044 1.4392 1.6964 +v 0.8077 1.5641 1.6964 +v 0.8044 1.4392 1.8214 +v 0.8077 1.5641 1.8214 +v 0.7468 1.6283 1.6964 +v 0.7468 1.6283 1.8214 +v 0.7501 1.7532 1.8214 +v 0.8093 1.6266 1.6964 +v 0.8126 1.7516 1.6964 +v 0.8093 1.6266 1.8214 +v 0.8126 1.7516 1.8214 +v 0.125 1.8125 1.375 +v 0.125 1.8125 1.875 +v 0.125 1.6875 1.375 +v 0.125 1.6875 1.875 +v 0.0625 1.8125 1.375 +v 0.0625 1.8125 1.875 +v 0.0625 1.6875 1.375 +v 0.0625 1.6875 1.875 +v 0.4375 1.8125 1.875 +v 0.4375 1.8125 1.9375 +v 0.4375 1.6875 1.875 +v 0.4375 1.6875 1.9375 +v 0.0625 1.8125 1.9375 +v 0.0625 1.6875 1.9375 +v 0.125 1.625 1.375 +v 0.125 1.625 1.875 +v 0.125 1.5 1.375 +v 0.125 1.5 1.875 +v 0.0625 1.625 1.375 +v 0.0625 1.625 1.875 +v 0.0625 1.5 1.375 +v 0.0625 1.5 1.875 +v 0.4375 1.625 1.875 +v 0.4375 1.625 1.9375 +v 0.4375 1.5 1.875 +v 0.4375 1.5 1.9375 +v 0.0625 1.625 1.9375 +v 0.0625 1.5 1.9375 +v 0.125 1.4375 1.375 +v 0.125 1.4375 1.875 +v 0.125 1.3125 1.375 +v 0.125 1.3125 1.875 +v 0.0625 1.4375 1.375 +v 0.0625 1.4375 1.875 +v 0.0625 1.3125 1.375 +v 0.0625 1.3125 1.875 +v 0.4375 1.4375 1.875 +v 0.4375 1.4375 1.9375 +v 0.4375 1.3125 1.875 +v 0.4375 1.3125 1.9375 +v 0.0625 1.4375 1.9375 +v 0.0625 1.3125 1.9375 +v 0.0313 1.875 0.9406 +v 0.0313 1.875 1.0031 +v 0.0313 1.75 0.9406 +v 0.0313 1.75 1.0031 +v -0.0312 1.875 0.9406 +v -0.0312 1.875 1.0031 +v -0.0312 1.75 0.9406 +v -0.0312 1.75 1.0031 +v 0.9375 -0.1875 0.75 +v 0.9375 -0.1875 0.9375 +v 0.9375 -1 0.75 +v 0.9375 -1 0.9375 +v 0.75 -0.1875 0.75 +v 0.75 -0.1875 0.9375 +v 0.75 -1 0.75 +v 0.75 -1 0.9375 +v 0.9375 -0.1875 0.125 +v 0.9375 -0.1875 0.3125 +v 0.9375 -1 0.125 +v 0.9375 -1 0.3125 +v 0.75 -0.1875 0.125 +v 0.75 -0.1875 0.3125 +v 0.75 -1 0.125 +v 0.75 -1 0.3125 +v -0.75 -0.1875 0.75 +v -0.75 -0.1875 0.9375 +v -0.75 -1 0.75 +v -0.75 -1 0.9375 +v -0.9375 -0.1875 0.75 +v -0.9375 -0.1875 0.9375 +v -0.9375 -1 0.75 +v -0.9375 -1 0.9375 +v -0.75 -0.1875 0.0625 +v -0.75 -0.1875 0.25 +v -0.75 -1 0.0625 +v -0.75 -1 0.25 +v -0.9375 -0.1875 0.0625 +v -0.9375 -0.1875 0.25 +v -0.9375 -1 0.0625 +v -0.9375 -1 0.25 +v 1 0 0 +v 1 -0.1875 0 +v 1 -0.1875 1 +v -1 0 0 +v -1 -0.1875 0 +v -1 -0.1875 1 +v -0.0312 1.25 0.9406 +v -0.0312 1.25 1.0031 +v -0.0312 1.125 0.9406 +v -0.0312 1.125 1.0031 +v 0.0313 1.25 1.0031 +v 0.0313 1.25 0.9406 +v 0.0313 1.125 1.0031 +v 0.0313 1.125 0.9406 +v -0.7187 1 0.8781 +v -0.7187 1 1.0031 +v -0.7187 0.875 0.8781 +v -0.7187 0.875 1.0031 +v -0.6562 1 1.0031 +v -0.6562 1 0.8781 +v -0.6562 0.875 1.0031 +v -0.6562 0.875 0.8781 +v -0.4687 1 0.8781 +v -0.4687 1 1.0031 +v -0.4687 0.875 0.8781 +v -0.4687 0.875 1.0031 +v -0.4062 1 1.0031 +v -0.4062 1 0.8781 +v -0.4062 0.875 1.0031 +v -0.4062 0.875 0.8781 +v -0.4531 1.2031 0.9375 +v -0.4531 1.2031 1 +v -0.4531 1.0156 0.9375 +v -0.4531 1.0156 1 +v -0.6406 1.2031 0.9375 +v -0.6406 1.2031 1 +v -0.6406 1.0156 0.9375 +v -0.6406 1.0156 1 +v -0.6123 1.043 0.769 +v -0.6123 1.168 0.8003 +v -0.4873 1.043 0.769 +v -0.4873 1.168 0.8003 +v -0.4869 1.1674 0.894 +v -0.6119 1.1674 0.894 +v -0.6119 1.0424 0.894 +v -0.4869 1.0424 0.894 +v -0.6115 1.0418 0.9565 +v -0.4865 1.1668 0.9565 +v -0.6115 1.1668 0.9565 +v -0.4865 1.0418 0.9565 +v -0.375 0.9792 0.9465 +v -0.375 0.7962 0.9059 +v -0.375 1.0604 0.5804 +v -0.375 0.8773 0.5398 +v -0.75 0.9792 0.9465 +v -0.75 0.7962 0.9059 +v -0.75 1.0604 0.5804 +v -0.75 0.8773 0.5398 +v -0.6875 0.8097 0.8449 +v -0.4375 0.8097 0.8449 +v -0.6875 0.8638 0.6008 +v -0.4375 0.8638 0.6008 +v -0.6875 0.8707 0.8584 +v -0.4375 0.8707 0.8584 +v -0.6875 0.9248 0.6144 +v -0.4375 0.9248 0.6144 +v -0.4375 1.0538 0.899 +v -0.4375 1.1079 0.6549 +v -0.6875 1.0538 0.899 +v -0.6875 1.1079 0.6549 +v -0.6875 0.8402 0.8517 +v -0.4375 0.8402 0.8517 +v -0.6875 0.8943 0.6076 +v -0.4375 0.8943 0.6076 +v -1 2 1 +v -1 2 2 +v -0.875 1.9375 1.875 +v -0.875 1.9375 1.125 +v -0.125 1.9375 1.875 +v -0.125 1.9375 1.125 +v -0.875 2 1.125 +v -0.875 2 1.875 +v -0.125 2 1.875 +v 0 2 2 +v -0.125 2 1.125 +v 0 2 1 +v -0.25 2.0062 1.25 +v -0.25 2.0062 1.75 +v -0.25 1.9437 1.25 +v -0.25 1.9437 1.75 +v -0.75 2.0062 1.25 +v -0.75 2.0062 1.75 +v -0.75 1.9437 1.25 +v -0.75 1.9437 1.75 +v -0.0625 1 1 +v -0.0625 2 1 +v 0.125 0.25 0.9375 +v 0.125 0.25 1 +v 0.125 0.0625 0.9375 +v 0.125 0.0625 1 +v -0.0625 0.25 0.9375 +v -0.0625 0.25 1 +v -0.0625 0.0625 0.9375 +v -0.0625 0.0625 1 +v 0.125 0.25 0.6875 +v 0.125 0.25 0.9375 +v 0.125 0.0625 0.6875 +v 0.125 0.0625 0.9375 +v -0.0625 0.25 0.6875 +v -0.0625 0.25 0.9375 +v -0.0625 0.0625 0.6875 +v -0.0625 0.0625 0.9375 +v 0.125 0.1875 0.6875 +v -0.0625 0.1875 0.6875 +v 0 0.0625 0.6875 +v 0 0.1875 0.6875 +v -1.0062 -0.75 1.25 +v -1.0062 -0.75 1.75 +v -0.9437 -0.75 1.25 +v -0.9437 -0.75 1.75 +v -1.0062 -0.25 1.25 +v -0.9437 -0.25 1.25 +v -1.0062 -0.25 1.75 +v -0.9437 -0.25 1.75 +v 0.9438 -0.25 1.25 +v 0.9438 -0.25 1.75 +v 0.9438 -0.75 1.25 +v 0.9438 -0.75 1.75 +v 1.0063 -0.25 1.25 +v 1.0063 -0.25 1.75 +v 1.0063 -0.75 1.25 +v 1.0063 -0.75 1.75 +v -1.0047 -0.0625 1.375 +v -0.9406 -0.0625 1.375 +v -1.0047 -0.25 1.375 +v -0.9406 -0.25 1.375 +v -1.0047 -0.0625 1.625 +v -1.0047 -0.25 1.625 +v -0.9406 -0.0625 1.625 +v -0.9406 -0.25 1.625 +v 1.0047 -0.0625 1.375 +v 0.9406 -0.0625 1.375 +v 1.0047 -0.25 1.375 +v 0.9406 -0.25 1.375 +v 1.0047 -0.0625 1.625 +v 1.0047 -0.25 1.625 +v 0.9406 -0.0625 1.625 +v 0.9406 -0.25 1.625 +vt 0.7656 0.0625 +vt 0.9844 0.0625 +vt 0.9844 0 +vt 0.7656 0 +vt 0.7813 0.0625 +vt 1 0.0625 +vt 1 0 +vt 0.7813 0 +vt 0.7656 0.0625 +vt 0.7656 0.25 +vt 0.9844 0.25 +vt 0.9844 0.0625 +vt 0.7969 0.4531 +vt 0.9844 0.4531 +vt 0.9844 0.3906 +vt 0.7969 0.3906 +vt 0.75 0.5 +vt 1 0.5 +vt 1 0.25 +vt 0.75 0.25 +vt 0.75 0.5 +vt 1 0.5 +vt 1 0.25 +vt 0.75 0.25 +vt 0.25 0.5 +vt 0.25 0.25 +vt 0 0.25 +vt 0 0.5 +vt 0.75 0.25 +vt 0.5 0.25 +vt 0.5 0.5 +vt 0.75 0.5 +vt 1 0.5 +vt 0.75 0.5 +vt 0.75 0.25 +vt 1 0.25 +vt 0.5 0 +vt 0.25 0 +vt 0.25 0.25 +vt 0.5 0.25 +vt 0.25 0.25 +vt 0.25 0 +vt 0 0 +vt 0 0.25 +vt 0 0.5 +vt 0.25 0.5 +vt 0.25 0.25 +vt 0 0.25 +vt 1 0.25 +vt 1 0 +vt 0.75 0 +vt 0.75 0.25 +vt 0.5 0.25 +vt 0.5 0.5 +vt 0.75 0.5 +vt 0.75 0.25 +vt 0 0.25 +vt 0.25 0.25 +vt 0.25 0 +vt 0 0 +vt 0.75 0.75 +vt 1 0.75 +vt 1 1 +vt 0.75 1 +vt 0.25 0 +vt 0.25 0.25 +vt 0.5 0.25 +vt 0.5 0 +vt 0.75 0.25 +vt 1 0.25 +vt 1 0 +vt 0.75 0 +vt 0.75 1 +vt 1 1 +vt 1 0.75 +vt 0.75 0.75 +vt 0.4844 1 +vt 0.75 1 +vt 0.75 0.75 +vt 0.4844 0.75 +vt 0.7813 0.2188 +vt 0.9688 0.2188 +vt 0.9688 0.0313 +vt 0.7813 0.0313 +vt 1 0 +vt 0.9688 0.0313 +vt 0.9688 0.2188 +vt 1 0.25 +vt 1 0.25 +vt 0.9688 0.2188 +vt 0.7813 0.2188 +vt 0.75 0.25 +vt 0.75 0.25 +vt 0.7813 0.2188 +vt 0.7813 0.0313 +vt 0.75 0 +vt 0.75 0 +vt 0.7813 0.0313 +vt 0.9688 0.0313 +vt 1 0 +vt 0.9688 0.2188 +vt 0.9844 0.2188 +vt 0.9844 0.0313 +vt 0.9688 0.0313 +vt 0.9688 0.2344 +vt 0.9688 0.2188 +vt 0.7813 0.2188 +vt 0.7813 0.2344 +vt 0.7656 0.2188 +vt 0.7813 0.2188 +vt 0.7813 0.0313 +vt 0.7656 0.0313 +vt 0.7813 0.0313 +vt 0.7813 0.0156 +vt 0.9688 0.0156 +vt 0.9688 0.0313 +vt 0.9688 0.0313 +vt 0.9688 0.2188 +vt 0.7813 0.2188 +vt 0.7813 0.0313 +vt 0.9688 0.2188 +vt 0.9688 0.0313 +vt 1 0 +vt 1 0.25 +vt 0.7813 0.2188 +vt 0.9688 0.2188 +vt 1 0.25 +vt 0.75 0.25 +vt 0.7813 0.0313 +vt 0.7813 0.2188 +vt 0.75 0.25 +vt 0.75 0 +vt 0.9688 0.0313 +vt 0.7813 0.0313 +vt 0.75 0 +vt 1 0 +vt 0.9844 0.0313 +vt 0.9844 0.2188 +vt 0.9688 0.2188 +vt 0.9688 0.0313 +vt 0.7813 0.2188 +vt 0.9688 0.2188 +vt 0.9688 0.2344 +vt 0.7813 0.2344 +vt 0.7813 0.0313 +vt 0.7813 0.2188 +vt 0.7656 0.2188 +vt 0.7656 0.0313 +vt 0.9688 0.0156 +vt 0.7813 0.0156 +vt 0.7813 0.0313 +vt 0.9688 0.0313 +vt 0.7188 0.2188 +vt 0.7344 0.2188 +vt 0.7344 0.0313 +vt 0.7188 0.0313 +vt 0.7188 0.2344 +vt 0.7188 0.2188 +vt 0.5313 0.2188 +vt 0.5313 0.2344 +vt 0.5156 0.2188 +vt 0.5313 0.2188 +vt 0.5313 0.0313 +vt 0.5156 0.0313 +vt 0.5313 0.0313 +vt 0.5313 0.0156 +vt 0.7188 0.0156 +vt 0.7188 0.0313 +vt 0.75 0.25 +vt 1 0.25 +vt 1 0 +vt 0.75 0 +vt 0.7813 1 +vt 1 1 +vt 1 0.9844 +vt 0.7813 0.9844 +vt 0.75 0.25 +vt 1 0.25 +vt 1 0 +vt 0.75 0 +vt 0.75 1 +vt 1 1 +vt 1 0.75 +vt 0.75 0.75 +vt 0.9844 1 +vt 1 1 +vt 1 0.75 +vt 0.9844 0.75 +vt 0.75 0.25 +vt 1 0.25 +vt 1 0 +vt 0.75 0 +vt 0.2344 1 +vt 0.2344 0.75 +vt 0 0.75 +vt 0 1 +vt 0 0 +vt 0 0.25 +vt 0.25 0.25 +vt 0.25 0 +vt 0 0.3438 +vt 0 0.375 +vt 0.2813 0.375 +vt 0.2813 0.3438 +vt 0 0.1875 +vt 0 0.2188 +vt 0.2813 0.2188 +vt 0.2813 0.1875 +vt 0.25 0.375 +vt 0.2813 0.375 +vt 0.2813 0.1875 +vt 0.25 0.1875 +vt 0 0.375 +vt 0.0313 0.375 +vt 0.0313 0.1875 +vt 0 0.1875 +vt 0.625 0.0938 +vt 0.75 0.0938 +vt 0.75 0.0781 +vt 0.625 0.0781 +vt 0.625 0.0938 +vt 0.75 0.0938 +vt 0.75 0.0781 +vt 0.625 0.0781 +vt 0.7344 0.125 +vt 0.75 0.125 +vt 0.75 0.1094 +vt 0.7344 0.1094 +vt 0.625 0.125 +vt 0.6406 0.125 +vt 0.6406 0.1094 +vt 0.625 0.1094 +vt 0.6406 0.125 +vt 0.7344 0.125 +vt 0.7344 0.1094 +vt 0.6406 0.1094 +vt 0.6406 0.125 +vt 0.7344 0.125 +vt 0.75 0.1094 +vt 0.625 0.1094 +vt 0.625 0.125 +vt 0.6406 0.125 +vt 0.6406 0.1094 +vt 0.625 0.1094 +vt 0.625 0.1094 +vt 0.6406 0.1094 +vt 0.6406 0.0938 +vt 0.625 0.0938 +vt 0.625 0.125 +vt 0.6406 0.125 +vt 0.6406 0.1094 +vt 0.625 0.1094 +vt 0.7344 0.1094 +vt 0.75 0.1094 +vt 0.75 0.0938 +vt 0.7344 0.0938 +vt 0.625 0.1094 +vt 0.6406 0.1094 +vt 0.6406 0.0781 +vt 0.625 0.0781 +vt 0.625 0.125 +vt 0.6406 0.125 +vt 0.6406 0.0938 +vt 0.625 0.0938 +vt 0.6406 0.0781 +vt 0.6406 0.0938 +vt 0.7344 0.0938 +vt 0.7344 0.0781 +vt 0.7344 0.125 +vt 0.7344 0.1094 +vt 0.6406 0.1094 +vt 0.6406 0.125 +vt 0.625 0.0938 +vt 0.625 0.1094 +vt 0.75 0.1094 +vt 0.75 0.0938 +vt 0.5 0.0938 +vt 0.625 0.0938 +vt 0.625 0.0781 +vt 0.5 0.0781 +vt 0.5 0.0938 +vt 0.625 0.0938 +vt 0.625 0.0781 +vt 0.5 0.0781 +vt 0.6094 0.125 +vt 0.625 0.125 +vt 0.625 0.1094 +vt 0.6094 0.1094 +vt 0.5 0.125 +vt 0.5156 0.125 +vt 0.5156 0.1094 +vt 0.5 0.1094 +vt 0.5156 0.125 +vt 0.6094 0.125 +vt 0.6094 0.1094 +vt 0.5156 0.1094 +vt 0.5156 0.125 +vt 0.6094 0.125 +vt 0.625 0.1094 +vt 0.5 0.1094 +vt 0.5 0.125 +vt 0.5156 0.125 +vt 0.5156 0.1094 +vt 0.5 0.1094 +vt 0.5 0.1094 +vt 0.5156 0.1094 +vt 0.5156 0.0938 +vt 0.5 0.0938 +vt 0.5 0.125 +vt 0.5156 0.125 +vt 0.5156 0.1094 +vt 0.5 0.1094 +vt 0.6094 0.1094 +vt 0.625 0.1094 +vt 0.625 0.0938 +vt 0.6094 0.0938 +vt 0.5 0.1094 +vt 0.5156 0.1094 +vt 0.5156 0.0781 +vt 0.5 0.0781 +vt 0.5 0.125 +vt 0.5156 0.125 +vt 0.5156 0.0938 +vt 0.5 0.0938 +vt 0.5156 0.0781 +vt 0.5156 0.0938 +vt 0.6094 0.0938 +vt 0.6094 0.0781 +vt 0.6094 0.125 +vt 0.6094 0.1094 +vt 0.5156 0.1094 +vt 0.5156 0.125 +vt 0.5 0.0938 +vt 0.5 0.1094 +vt 0.625 0.1094 +vt 0.625 0.0938 +vt 0 1 +vt 0.0313 1 +vt 0.0313 0.625 +vt 0 0.625 +vt 0.2813 1 +vt 0.3125 1 +vt 0.3125 0.625 +vt 0.2813 0.625 +vt 0.0313 1 +vt 0.2813 1 +vt 0.2813 0.9688 +vt 0.0313 0.9688 +vt 0.0313 0.6563 +vt 0.2813 0.6563 +vt 0.2813 0.625 +vt 0.0313 0.625 +vt 0 1 +vt 0.3125 1 +vt 0.3125 0.625 +vt 0 0.625 +vt 0.0313 1 +vt 0.2813 1 +vt 0.2813 0.625 +vt 0.0313 0.625 +vt 0.75 1 +vt 0.8125 1 +vt 0.8125 0.8125 +vt 0.75 0.8125 +vt 0.75 1 +vt 0.8125 1 +vt 0.8125 0.8125 +vt 0.75 0.8125 +vt 0.75 0.9375 +vt 0.75 0.9375 +vt 0.75 1 +vt 0.8125 1 +vt 0.8125 0.9375 +vt 0.75 0.9375 +vt 0.75 1 +vt 0.75 1 +vt 0.75 1 +vt 0.8125 1 +vt 0.8125 0.8125 +vt 0.75 0.8125 +vt 0.75 1 +vt 0.8125 1 +vt 0.8125 0.8125 +vt 0.75 0.8125 +vt 0.75 0.9375 +vt 0.75 0.9375 +vt 0.75 1 +vt 0.8125 1 +vt 0.8125 0.9375 +vt 0.75 0.9375 +vt 0.75 1 +vt 0.75 1 +vt 0.75 1 +vt 0.8125 1 +vt 0.8125 0.8125 +vt 0.75 0.8125 +vt 0.75 1 +vt 0.8125 1 +vt 0.8125 0.8125 +vt 0.75 0.8125 +vt 0.75 0.9375 +vt 0.75 0.9375 +vt 0.75 1 +vt 0.8125 1 +vt 0.8125 0.9375 +vt 0.75 0.9375 +vt 0.75 1 +vt 0.75 1 +vt 0.75 0.25 +vt 0.75 1 +vt 0 1 +vt 0 0.25 +vt 0 0.25 +vt 0 1 +vt 0.75 1 +vt 0.75 0.25 +vt 0 1 +vt 0.75 1 +vt 0.75 0.9375 +vt 0 0.9375 +vt 0.75 0.3125 +vt 0 0.3125 +vt 0 0.25 +vt 0.75 0.25 +vt 0.0625 0.25 +vt 0.0625 1 +vt 0 1 +vt 0 0.25 +vt 0.75 0.25 +vt 0.75 1 +vt 0.6875 1 +vt 0.6875 0.25 +vt 1 0.625 +vt 0.75 0.625 +vt 0.75 1 +vt 1 1 +vt 0.75 1 +vt 0.75 0.625 +vt 0.8125 0.625 +vt 0.8125 1 +vt 1 0.625 +vt 1 1 +vt 0.9375 1 +vt 0.9375 0.625 +vt 1 0.9375 +vt 0.75 0.9375 +vt 0.75 1 +vt 1 1 +vt 1 0.625 +vt 0.75 0.625 +vt 0.75 0.6875 +vt 1 0.6875 +vt 1 0.25 +vt 0.75 0.25 +vt 0.75 0.625 +vt 1 0.625 +vt 0.8125 0.625 +vt 0.8125 0.25 +vt 0.75 0.25 +vt 0.75 0.625 +vt 1 0.25 +vt 1 0.625 +vt 0.9375 0.625 +vt 0.9375 0.25 +vt 1 0.5625 +vt 0.75 0.5625 +vt 0.75 0.625 +vt 1 0.625 +vt 1 0.25 +vt 0.75 0.25 +vt 0.75 0.3125 +vt 1 0.3125 +vt 0.75 0.125 +vt 0.75 0.25 +vt 0.625 0.25 +vt 0.625 0.125 +vt 0.625 0.25 +vt 0.75 0.25 +vt 0.75 0.1875 +vt 0.625 0.1875 +vt 0.75 0.1875 +vt 0.625 0.1875 +vt 0.625 0.125 +vt 0.75 0.125 +vt 0.625 0.125 +vt 0.625 0.25 +vt 0.6875 0.25 +vt 0.6875 0.125 +vt 0.6875 0.125 +vt 0.6875 0.25 +vt 0.75 0.25 +vt 0.75 0.125 +vt 0.875 0.125 +vt 0.875 0.25 +vt 0.75 0.25 +vt 0.75 0.125 +vt 0.75 0.25 +vt 0.875 0.25 +vt 0.875 0.1875 +vt 0.75 0.1875 +vt 0.875 0.1875 +vt 0.75 0.1875 +vt 0.75 0.125 +vt 0.875 0.125 +vt 0.75 0.125 +vt 0.75 0.25 +vt 0.8125 0.25 +vt 0.8125 0.125 +vt 0.8125 0.125 +vt 0.8125 0.25 +vt 0.875 0.25 +vt 0.875 0.125 +vt 1 0.125 +vt 1 0.25 +vt 0.875 0.25 +vt 0.875 0.125 +vt 0.875 0.25 +vt 1 0.25 +vt 1 0.1875 +vt 0.875 0.1875 +vt 1 0.1875 +vt 0.875 0.1875 +vt 0.875 0.125 +vt 1 0.125 +vt 0.875 0.125 +vt 0.875 0.25 +vt 0.9375 0.25 +vt 0.9375 0.125 +vt 0.9375 0.125 +vt 0.9375 0.25 +vt 1 0.25 +vt 1 0.125 +vt 0.75 0.25 +vt 0.75 1 +vt 0 1 +vt 0 0.25 +vt 0 0.25 +vt 0 1 +vt 0.75 1 +vt 0.75 0.25 +vt 0 1 +vt 0.75 1 +vt 0.75 0.9375 +vt 0 0.9375 +vt 0.75 0.3125 +vt 0 0.3125 +vt 0 0.25 +vt 0.75 0.25 +vt 0.0625 0.25 +vt 0.0625 1 +vt 0 1 +vt 0 0.25 +vt 0.75 0.25 +vt 0.75 1 +vt 0.6875 1 +vt 0.6875 0.25 +vt 1 0.625 +vt 0.75 0.625 +vt 0.75 1 +vt 1 1 +vt 0.75 1 +vt 0.75 0.625 +vt 0.8125 0.625 +vt 0.8125 1 +vt 1 0.625 +vt 1 1 +vt 0.9375 1 +vt 0.9375 0.625 +vt 1 0.9375 +vt 0.75 0.9375 +vt 0.75 1 +vt 1 1 +vt 1 0.625 +vt 0.75 0.625 +vt 0.75 0.6875 +vt 1 0.6875 +vt 1 0.25 +vt 0.75 0.25 +vt 0.75 0.625 +vt 1 0.625 +vt 0.8125 0.625 +vt 0.8125 0.25 +vt 0.75 0.25 +vt 0.75 0.625 +vt 1 0.25 +vt 1 0.625 +vt 0.9375 0.625 +vt 0.9375 0.25 +vt 1 0.5625 +vt 0.75 0.5625 +vt 0.75 0.625 +vt 1 0.625 +vt 1 0.25 +vt 0.75 0.25 +vt 0.75 0.3125 +vt 1 0.3125 +vt 0.75 0.125 +vt 0.75 0.25 +vt 0.625 0.25 +vt 0.625 0.125 +vt 0.625 0.25 +vt 0.75 0.25 +vt 0.75 0.1875 +vt 0.625 0.1875 +vt 0.75 0.1875 +vt 0.625 0.1875 +vt 0.625 0.125 +vt 0.75 0.125 +vt 0.625 0.125 +vt 0.625 0.25 +vt 0.6875 0.25 +vt 0.6875 0.125 +vt 0.6875 0.125 +vt 0.6875 0.25 +vt 0.75 0.25 +vt 0.75 0.125 +vt 0.875 0.125 +vt 0.875 0.25 +vt 0.75 0.25 +vt 0.75 0.125 +vt 0.75 0.25 +vt 0.875 0.25 +vt 0.875 0.1875 +vt 0.75 0.1875 +vt 0.875 0.1875 +vt 0.75 0.1875 +vt 0.75 0.125 +vt 0.875 0.125 +vt 0.75 0.125 +vt 0.75 0.25 +vt 0.8125 0.25 +vt 0.8125 0.125 +vt 0.8125 0.125 +vt 0.8125 0.25 +vt 0.875 0.25 +vt 0.875 0.125 +vt 1 0.125 +vt 1 0.25 +vt 0.875 0.25 +vt 0.875 0.125 +vt 0.875 0.25 +vt 1 0.25 +vt 1 0.1875 +vt 0.875 0.1875 +vt 1 0.1875 +vt 0.875 0.1875 +vt 0.875 0.125 +vt 1 0.125 +vt 0.875 0.125 +vt 0.875 0.25 +vt 0.9375 0.25 +vt 0.9375 0.125 +vt 0.9375 0.125 +vt 0.9375 0.25 +vt 1 0.25 +vt 1 0.125 +vt 0.75 0.25 +vt 0.75 1 +vt 0 1 +vt 0 0.25 +vt 0 0.25 +vt 0 1 +vt 0.75 1 +vt 0.75 0.25 +vt 0 1 +vt 0.75 1 +vt 0.75 0.9375 +vt 0 0.9375 +vt 0.75 0.3125 +vt 0 0.3125 +vt 0 0.25 +vt 0.75 0.25 +vt 0.0625 0.25 +vt 0.0625 1 +vt 0 1 +vt 0 0.25 +vt 0.75 0.25 +vt 0.75 1 +vt 0.6875 1 +vt 0.6875 0.25 +vt 1 0.625 +vt 0.75 0.625 +vt 0.75 1 +vt 1 1 +vt 0.75 1 +vt 0.75 0.625 +vt 0.8125 0.625 +vt 0.8125 1 +vt 1 0.625 +vt 1 1 +vt 0.9375 1 +vt 0.9375 0.625 +vt 1 0.9375 +vt 0.75 0.9375 +vt 0.75 1 +vt 1 1 +vt 1 0.625 +vt 0.75 0.625 +vt 0.75 0.6875 +vt 1 0.6875 +vt 1 0.25 +vt 0.75 0.25 +vt 0.75 0.625 +vt 1 0.625 +vt 0.8125 0.625 +vt 0.8125 0.25 +vt 0.75 0.25 +vt 0.75 0.625 +vt 1 0.25 +vt 1 0.625 +vt 0.9375 0.625 +vt 0.9375 0.25 +vt 1 0.5625 +vt 0.75 0.5625 +vt 0.75 0.625 +vt 1 0.625 +vt 1 0.25 +vt 0.75 0.25 +vt 0.75 0.3125 +vt 1 0.3125 +vt 0.75 0.125 +vt 0.75 0.25 +vt 0.625 0.25 +vt 0.625 0.125 +vt 0.625 0.25 +vt 0.75 0.25 +vt 0.75 0.1875 +vt 0.625 0.1875 +vt 0.75 0.1875 +vt 0.625 0.1875 +vt 0.625 0.125 +vt 0.75 0.125 +vt 0.625 0.125 +vt 0.625 0.25 +vt 0.6875 0.25 +vt 0.6875 0.125 +vt 0.6875 0.125 +vt 0.6875 0.25 +vt 0.75 0.25 +vt 0.75 0.125 +vt 0.875 0.125 +vt 0.875 0.25 +vt 0.75 0.25 +vt 0.75 0.125 +vt 0.75 0.25 +vt 0.875 0.25 +vt 0.875 0.1875 +vt 0.75 0.1875 +vt 0.875 0.1875 +vt 0.75 0.1875 +vt 0.75 0.125 +vt 0.875 0.125 +vt 0.75 0.125 +vt 0.75 0.25 +vt 0.8125 0.25 +vt 0.8125 0.125 +vt 0.8125 0.125 +vt 0.8125 0.25 +vt 0.875 0.25 +vt 0.875 0.125 +vt 1 0.125 +vt 1 0.25 +vt 0.875 0.25 +vt 0.875 0.125 +vt 0.875 0.25 +vt 1 0.25 +vt 1 0.1875 +vt 0.875 0.1875 +vt 1 0.1875 +vt 0.875 0.1875 +vt 0.875 0.125 +vt 1 0.125 +vt 0.875 0.125 +vt 0.875 0.25 +vt 0.9375 0.25 +vt 0.9375 0.125 +vt 0.9375 0.125 +vt 0.9375 0.25 +vt 1 0.25 +vt 1 0.125 +vt 0.5625 0.0625 +vt 0.5625 0.5625 +vt 0.6875 0.5625 +vt 0.6875 0.0625 +vt 0.5625 0.5625 +vt 0.625 0.5625 +vt 0.625 0.0625 +vt 0.5625 0.0625 +vt 0.5625 0.0625 +vt 0.625 0.0625 +vt 0.625 0.5625 +vt 0.5625 0.5625 +vt 0.5625 0.0625 +vt 0.5625 0.125 +vt 0.6875 0.125 +vt 0.6875 0.0625 +vt 0.5625 0.875 +vt 0.5625 0.9375 +vt 0.6875 0.9375 +vt 0.6875 0.875 +vt 0.5625 0.5625 +vt 0.5625 0.9375 +vt 0.625 0.9375 +vt 0.625 0.5625 +vt 0.5625 0.5625 +vt 0.5625 0.9375 +vt 0.625 0.9375 +vt 0.625 0.5625 +vt 0.5625 0.5625 +vt 0.5625 0.9375 +vt 0.6875 0.9375 +vt 0.6875 0.5625 +vt 0.5625 0.0625 +vt 0.5625 0.5625 +vt 0.6875 0.5625 +vt 0.6875 0.0625 +vt 0.5625 0.5625 +vt 0.625 0.5625 +vt 0.625 0.0625 +vt 0.5625 0.0625 +vt 0.5625 0.0625 +vt 0.625 0.0625 +vt 0.625 0.5625 +vt 0.5625 0.5625 +vt 0.5625 0.0625 +vt 0.5625 0.125 +vt 0.6875 0.125 +vt 0.6875 0.0625 +vt 0.5625 0.875 +vt 0.5625 0.9375 +vt 0.6875 0.9375 +vt 0.6875 0.875 +vt 0.5625 0.5625 +vt 0.5625 0.9375 +vt 0.625 0.9375 +vt 0.625 0.5625 +vt 0.5625 0.5625 +vt 0.5625 0.9375 +vt 0.625 0.9375 +vt 0.625 0.5625 +vt 0.5625 0.5625 +vt 0.5625 0.9375 +vt 0.6875 0.9375 +vt 0.6875 0.5625 +vt 0.5625 0.0625 +vt 0.5625 0.5625 +vt 0.6875 0.5625 +vt 0.6875 0.0625 +vt 0.5625 0.5625 +vt 0.625 0.5625 +vt 0.625 0.0625 +vt 0.5625 0.0625 +vt 0.5625 0.0625 +vt 0.625 0.0625 +vt 0.625 0.5625 +vt 0.5625 0.5625 +vt 0.5625 0.0625 +vt 0.5625 0.125 +vt 0.6875 0.125 +vt 0.6875 0.0625 +vt 0.5625 0.875 +vt 0.5625 0.9375 +vt 0.6875 0.9375 +vt 0.6875 0.875 +vt 0.5625 0.5625 +vt 0.5625 0.9375 +vt 0.625 0.9375 +vt 0.625 0.5625 +vt 0.5625 0.5625 +vt 0.5625 0.9375 +vt 0.625 0.9375 +vt 0.625 0.5625 +vt 0.5625 0.5625 +vt 0.5625 0.9375 +vt 0.6875 0.9375 +vt 0.6875 0.5625 +vt 0.6875 0.2188 +vt 0.7031 0.2188 +vt 0.7031 0.1875 +vt 0.6875 0.1875 +vt 0.6875 0.2188 +vt 0.7031 0.2188 +vt 0.7031 0.1875 +vt 0.6875 0.1875 +vt 0.6875 0.2188 +vt 0.7031 0.2188 +vt 0.7031 0.2031 +vt 0.6875 0.2031 +vt 0.6875 0.2031 +vt 0.7031 0.2031 +vt 0.7031 0.1875 +vt 0.6875 0.1875 +vt 0.6875 0.2188 +vt 0.7031 0.2188 +vt 0.7031 0.1875 +vt 0.6875 0.1875 +vt 0.7969 0.7031 +vt 0.8438 0.7031 +vt 0.8438 0.5 +vt 0.7969 0.5 +vt 0.7969 0.7031 +vt 0.8438 0.7031 +vt 0.8438 0.5 +vt 0.7969 0.5 +vt 0.8438 0.75 +vt 0.8906 0.75 +vt 0.8906 0.7031 +vt 0.8438 0.7031 +vt 0.8438 0.7031 +vt 0.8906 0.7031 +vt 0.8906 0.5 +vt 0.8438 0.5 +vt 0.8438 0.7031 +vt 0.8906 0.7031 +vt 0.8906 0.5 +vt 0.8438 0.5 +vt 0.8438 0.7031 +vt 0.8906 0.7031 +vt 0.8906 0.5 +vt 0.8438 0.5 +vt 0.8438 0.7031 +vt 0.8906 0.7031 +vt 0.8906 0.5 +vt 0.8438 0.5 +vt 0.8438 0.75 +vt 0.8906 0.75 +vt 0.8906 0.7031 +vt 0.8438 0.7031 +vt 0.7969 0.7031 +vt 0.8438 0.7031 +vt 0.8438 0.5 +vt 0.7969 0.5 +vt 0.7969 0.7031 +vt 0.8438 0.7031 +vt 0.8438 0.5 +vt 0.7969 0.5 +vt 0.7969 0.7031 +vt 0.8438 0.7031 +vt 0.8438 0.5 +vt 0.7969 0.5 +vt 0.7969 0.7031 +vt 0.8438 0.7031 +vt 0.8438 0.5 +vt 0.7969 0.5 +vt 0.8438 0.75 +vt 0.8906 0.75 +vt 0.8906 0.7031 +vt 0.8438 0.7031 +vt 0.8438 0.7031 +vt 0.8906 0.7031 +vt 0.8906 0.5 +vt 0.8438 0.5 +vt 0.8438 0.7031 +vt 0.8906 0.7031 +vt 0.8906 0.5 +vt 0.8438 0.5 +vt 0.7969 0.7031 +vt 0.8438 0.7031 +vt 0.8438 0.5 +vt 0.7969 0.5 +vt 0.7969 0.7031 +vt 0.8438 0.7031 +vt 0.8438 0.5 +vt 0.7969 0.5 +vt 0.8438 0.75 +vt 0.8906 0.75 +vt 0.8906 0.7031 +vt 0.8438 0.7031 +vt 0.8438 0.7031 +vt 0.8906 0.7031 +vt 0.8906 0.5 +vt 0.8438 0.5 +vt 0.8438 0.7031 +vt 0.8906 0.7031 +vt 0.8906 0.5 +vt 0.8438 0.5 +vt 0.7969 0.5 +vt 0.7969 0.75 +vt 0.8438 0.75 +vt 0.8438 0.5 +vt 0.7969 0.5 +vt 0.7969 0.75 +vt 0.8438 0.75 +vt 0.8438 0.5 +vt 0.5 0 +vt 0 0 +vt 0 0.25 +vt 0.5 0.25 +vt 0.5 0.25 +vt 0 0.25 +vt 0 0 +vt 0.5 0 +vt 0.75 0.25 +vt 0.75 0.75 +vt 0.7969 0.75 +vt 0.7969 0.25 +vt 0 0.1875 +vt 0 0.375 +vt 0.2813 0.375 +vt 0.2813 0.1875 +vt 0.6875 0.2188 +vt 0.7031 0.2188 +vt 0.7031 0.1875 +vt 0.6875 0.1875 +vt 0.6875 0.2188 +vt 0.7031 0.2188 +vt 0.7031 0.1875 +vt 0.6875 0.1875 +vt 0.6875 0.2188 +vt 0.7031 0.2188 +vt 0.7031 0.2031 +vt 0.6875 0.2031 +vt 0.6875 0.2031 +vt 0.7031 0.2031 +vt 0.7031 0.1875 +vt 0.6875 0.1875 +vt 0.6875 0.2188 +vt 0.7031 0.2188 +vt 0.7031 0.1875 +vt 0.6875 0.1875 +vt 0.6875 0.2188 +vt 0.7031 0.2188 +vt 0.7031 0.1875 +vt 0.6875 0.1875 +vt 0.6875 0.2188 +vt 0.7031 0.2188 +vt 0.7031 0.1875 +vt 0.6875 0.1875 +vt 0.6875 0.2188 +vt 0.7031 0.2188 +vt 0.7031 0.2031 +vt 0.6875 0.2031 +vt 0.6875 0.2031 +vt 0.7031 0.2031 +vt 0.7031 0.1875 +vt 0.6875 0.1875 +vt 0.6875 0.2188 +vt 0.7031 0.2188 +vt 0.7031 0.1875 +vt 0.6875 0.1875 +vt 0.6875 0.2188 +vt 0.7031 0.2188 +vt 0.7031 0.1875 +vt 0.6875 0.1875 +vt 0.6875 0.2188 +vt 0.7031 0.2188 +vt 0.7031 0.1875 +vt 0.6875 0.1875 +vt 0.6875 0.2188 +vt 0.7031 0.2188 +vt 0.7031 0.2031 +vt 0.6875 0.2031 +vt 0.6875 0.2031 +vt 0.7031 0.2031 +vt 0.7031 0.1875 +vt 0.6875 0.1875 +vt 0.6875 0.2188 +vt 0.7031 0.2188 +vt 0.7031 0.1875 +vt 0.6875 0.1875 +vt 0.7188 0.2656 +vt 0.7344 0.2656 +vt 0.7344 0.2188 +vt 0.7188 0.2188 +vt 0.6875 0.2656 +vt 0.7031 0.2656 +vt 0.7031 0.2188 +vt 0.6875 0.2188 +vt 0.6875 0.2656 +vt 0.7344 0.2656 +vt 0.7344 0.25 +vt 0.6875 0.25 +vt 0.6875 0.2344 +vt 0.7344 0.2344 +vt 0.7344 0.2188 +vt 0.6875 0.2188 +vt 0.6875 0.2656 +vt 0.7344 0.2656 +vt 0.7344 0.2188 +vt 0.6875 0.2188 +vt 0.6875 0.875 +vt 0.6875 1 +vt 0.5625 1 +vt 0.5625 0.875 +vt 0.6875 1 +vt 0.5625 1 +vt 0.5625 0.875 +vt 0.6875 0.875 +vt 1 0.125 +vt 1 0.25 +vt 0.875 0.25 +vt 0.875 0.125 +vt 0.875 0.125 +vt 0.75 0.125 +vt 0.75 0 +vt 0.875 0 +vt 0.6875 0.6875 +vt 0.5625 0.6875 +vt 0.5625 0.625 +vt 0.6875 0.625 +vt 0.6875 0.6875 +vt 0.5625 0.6875 +vt 0.5625 0.625 +vt 0.6875 0.625 +vt 0.5625 0.6875 +vt 0.6875 0.6875 +vt 0.6875 0.625 +vt 0.5625 0.625 +vt 0.5625 0.6875 +vt 0.6875 0.6875 +vt 0.6875 0.625 +vt 0.5625 0.625 +vt 0.6875 0.4688 +vt 0.6875 0.375 +vt 0.875 0.375 +vt 0.875 0.4688 +vt 0.375 0.375 +vt 0.375 0.4688 +vt 0.5625 0.4688 +vt 0.5625 0.375 +vt 0.5313 0.375 +vt 0.7188 0.375 +vt 0.7188 0.4688 +vt 0.5313 0.4688 +vt 0.5313 0.4688 +vt 0.7188 0.4688 +vt 0.7188 0.375 +vt 0.5313 0.375 +vt 0.7188 0.375 +vt 0.8438 0.375 +vt 0.8438 0.25 +vt 0.7188 0.25 +vt 0.7188 0.1875 +vt 0.6875 0.2188 +vt 0.6875 0.3438 +vt 0.7188 0.375 +vt 0.7188 0.375 +vt 0.6875 0.3438 +vt 0.5625 0.3438 +vt 0.5313 0.375 +vt 0.5313 0.375 +vt 0.5625 0.3438 +vt 0.5625 0.2188 +vt 0.5313 0.1875 +vt 0.5313 0.1875 +vt 0.5625 0.2188 +vt 0.6875 0.2188 +vt 0.7188 0.1875 +vt 0.6875 0.2188 +vt 0.6563 0.2188 +vt 0.6563 0.3438 +vt 0.6875 0.3438 +vt 0.5625 0.3125 +vt 0.5625 0.3438 +vt 0.6875 0.3438 +vt 0.6875 0.3125 +vt 0.5625 0.3438 +vt 0.5938 0.3438 +vt 0.5938 0.2188 +vt 0.5625 0.2188 +vt 0.6875 0.25 +vt 0.6875 0.2188 +vt 0.5625 0.2188 +vt 0.5625 0.25 +vt 0.7188 0.5 +vt 0.6875 0.4688 +vt 0.875 0.4688 +vt 0.8438 0.5 +vt 0.375 0.4688 +vt 0.4063 0.5 +vt 0.5313 0.5 +vt 0.5625 0.4688 +vt 0.5313 0.4688 +vt 0.7188 0.4688 +vt 0.6875 0.5 +vt 0.5625 0.5 +vt 0.5625 0.5 +vt 0.6875 0.5 +vt 0.7188 0.4688 +vt 0.5313 0.4688 +vt 0.5625 0.3438 +vt 0.6875 0.3438 +vt 0.6875 0.2188 +vt 0.5625 0.2188 +vt 0.7188 0.25 +vt 0.8438 0.25 +vt 0.8438 0.125 +vt 0.7188 0.125 +vt 0.5313 0.2188 +vt 0.7188 0.2188 +vt 0.7188 0.0313 +vt 0.5313 0.0313 +vt 0.75 0 +vt 0.7188 0.0313 +vt 0.7188 0.2188 +vt 0.75 0.25 +vt 0.75 0.25 +vt 0.7188 0.2188 +vt 0.5313 0.2188 +vt 0.5 0.25 +vt 0.5 0.25 +vt 0.5313 0.2188 +vt 0.5313 0.0313 +vt 0.5 0 +vt 0.5 0 +vt 0.5313 0.0313 +vt 0.7188 0.0313 +vt 0.75 0 +vt 0.125 0.4844 +vt 0.1094 0.4844 +vt 0.1094 0.6094 +vt 0.125 0.6094 +vt 0 0.6094 +vt 0 0.4844 +vt 0.0156 0.4844 +vt 0.0156 0.6094 +vt 0.125 0.6094 +vt 0.125 0.4844 +vt 0 0.4844 +vt 0 0.6094 +vt 0 0.5 +vt 0.125 0.5 +vt 0.125 0.4844 +vt 0 0.4844 +vt 0.125 0.5938 +vt 0.125 0.6094 +vt 0 0.6094 +vt 0 0.5938 +vt 0.7188 1 +vt 0.75 1 +vt 0.75 0.75 +vt 0.7188 0.75 +vt 0 0.75 +vt 0 1 +vt 0.2344 1 +vt 0.2344 0.75 +vt 0.8281 0.3594 +vt 0.8281 0.3438 +vt 0.7813 0.3438 +vt 0.7813 0.3594 +vt 0.8281 0.3594 +vt 0.8281 0.3438 +vt 0.7813 0.3438 +vt 0.7813 0.3594 +vt 0.7813 0.3594 +vt 0.8281 0.3594 +vt 0.8281 0.3438 +vt 0.7813 0.3438 +vt 0.7813 0.3594 +vt 0.8281 0.3594 +vt 0.8281 0.3438 +vt 0.7813 0.3438 +vt 0.7813 0.2813 +vt 0.8281 0.2813 +vt 0.8281 0.2344 +vt 0.7813 0.2344 +vt 0.7813 0.2813 +vt 0.8281 0.2813 +vt 0.8281 0.2344 +vt 0.7813 0.2344 +vt 0.875 0.875 +vt 0.875 1 +vt 0.9688 1 +vt 0.9688 0.875 +vt 0.875 0.875 +vt 0.875 1 +vt 0.9688 1 +vt 0.9688 0.875 +vt 0.875 1 +vt 0.9688 1 +vt 0.9688 0.875 +vt 0.875 0.875 +vt 0.875 1 +vt 0.9688 1 +vt 0.9688 0.875 +vt 0.875 0.875 +vt 0.875 0.875 +vt 0.9688 0.875 +vt 0.9688 0.7813 +vt 0.875 0.7813 +vt 0.5938 0.4688 +vt 0.6406 0.4688 +vt 0.6406 0.4531 +vt 0.5938 0.4531 +vt 0.6406 0.4375 +vt 0.6406 0.4063 +vt 0.6094 0.4063 +vt 0.6094 0.4375 +vt 0.5938 0.4063 +vt 0.5781 0.4063 +vt 0.5781 0.4375 +vt 0.5938 0.4375 +vt 0.75 0.4844 +vt 0.75 0.6094 +vt 0.7344 0.6094 +vt 0.7344 0.4844 +vt 0.75 0.4844 +vt 0.75 0.6094 +vt 0.7344 0.6094 +vt 0.7344 0.4844 +vt 0.625 0.4844 +vt 0.6406 0.4844 +vt 0.6406 0.6094 +vt 0.625 0.6094 +vt 0.6406 0.6094 +vt 0.625 0.6094 +vt 0.625 0.4844 +vt 0.6406 0.4844 +vt 0.875 0.6094 +vt 0.75 0.6094 +vt 0.75 0.4844 +vt 0.875 0.4844 +vt 0.75 0.4844 +vt 0.75 0.6094 +vt 0.625 0.6094 +vt 0.625 0.4844 +vt 0.75 0.4844 +vt 0.7656 0.4844 +vt 0.7656 0.6094 +vt 0.75 0.6094 +vt 0.7656 0.4844 +vt 0.7656 0.6094 +vt 0.75 0.6094 +vt 0.75 0.4844 +vt 0.7656 0.4844 +vt 0.7656 0.6094 +vt 0.75 0.6094 +vt 0.75 0.4844 +vt 0.7656 0.6094 +vt 0.75 0.6094 +vt 0.75 0.4844 +vt 0.7656 0.4844 +vt 0.125 0.6875 +vt 0.125 0.7344 +vt 0.0625 0.7344 +vt 0.0625 0.6875 +vt 0.0781 0.6875 +vt 0.0781 0.7344 +vt 0.0625 0.7344 +vt 0.0625 0.6875 +vt 0.125 0.6875 +vt 0.125 0.7344 +vt 0.1094 0.7344 +vt 0.1094 0.6875 +vt 0 0.7344 +vt 0.0625 0.7344 +vt 0.0625 0.6875 +vt 0 0.6875 +vt 0 0.7344 +vt 0.0156 0.7344 +vt 0.0156 0.6875 +vt 0 0.6875 +vt 0.0469 0.7344 +vt 0.0625 0.7344 +vt 0.0625 0.6875 +vt 0.0469 0.6875 +vn 1 0 0 +vn -1 0 0 +vn 0 -1 0 +vn 0 0 1 +vn 1 0 0 +vn -1 0 0 +vn 0 0 -1 +vn 0 0 1 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn 0 0 1 +vn 0 1 0 +vn 0 0 -1 +vn 0 0 -1 +vn 0 -1 0 +vn 0 0 1 +vn 1 0 0 +vn -1 0 0 +vn 0 0 1 +vn 1 0 0 +vn 1 0 0 +vn 1 0 0 +vn 1 0 0 +vn 1 0 0 +vn 0 0 -1 +vn 0 -1 0 +vn 0 0 1 +vn 0 1 0 +vn -1 0 0 +vn -1 0 0 +vn -1 0 0 +vn -1 0 0 +vn -1 0 0 +vn 0 0 -1 +vn 0 -1 0 +vn 0 0 1 +vn 0 1 0 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 -1 +vn -1 0 0 +vn 0 0 1 +vn 0 1 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn 0 -1 0 +vn 0 0 -1 +vn 0.71 0.71 0 +vn -0.71 0.71 0 +vn 0 1 0 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 -1 +vn -1 0 0 +vn 0 0 -1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 -1 0 +vn 0 0 -1 +vn 0.71 0.71 0 +vn -0.71 0.71 0 +vn 0 1 0 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 -1 +vn -1 0 0 +vn 0 0 -1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0.04 +vn 0 -1 -0.04 +vn 0 0.04 -1 +vn 0 -0.04 1 +vn -0.97 0 -0.24 +vn 0.97 0 -0.24 +vn 0 0.97 -0.24 +vn 0 -0.97 -0.24 +vn -0.97 0 -0.24 +vn 0.97 0 -0.24 +vn 0 0.97 -0.24 +vn 0 -0.97 -0.24 +vn -0.97 0 -0.24 +vn 0.97 0 -0.24 +vn 0 0.97 -0.24 +vn 0 -0.97 -0.24 +vn -1 0.03 0 +vn 1 -0.03 0 +vn 0 0 -1 +vn 0 0 1 +vn -0.03 -1 0 +vn 0.03 1 0 +vn -1 0.03 0 +vn 0 0 -1 +vn 0 0 1 +vn -0.03 -1 0 +vn 0.03 1 0 +vn -1 0.03 0 +vn 0 0 -1 +vn 0 0 1 +vn -0.03 -1 0 +vn 0.03 1 0 +vn -1 0.03 0 +vn 0 0 -1 +vn 0 0 1 +vn -0.03 -1 0 +vn 0.03 1 0 +vn -1 0.03 0 +vn 0 0 -1 +vn 0 0 1 +vn -0.03 -1 0 +vn 0.03 1 0 +vn -1 0.03 0 +vn 0 0 -1 +vn 0 0 1 +vn -0.03 -1 0 +vn 0.03 1 0 +vn -1 0.03 0 +vn 1 -0.03 0 +vn 0 0 -1 +vn 0 0 1 +vn -0.03 -1 0 +vn 0.03 1 0 +vn -1 0.03 0 +vn 0 0 -1 +vn 0 0 1 +vn -0.03 -1 0 +vn 0.03 1 0 +vn -1 0.03 0 +vn 0 0 -1 +vn 0 0 1 +vn -0.03 -1 0 +vn 0.03 1 0 +vn -1 0.03 0 +vn 0 0 -1 +vn 0 0 1 +vn -0.03 -1 0 +vn 0.03 1 0 +vn -1 0.03 0 +vn 0 0 -1 +vn 0 0 1 +vn -0.03 -1 0 +vn 0.03 1 0 +vn -1 0.03 0 +vn 0 0 -1 +vn 0 0 1 +vn -0.03 -1 0 +vn 0.03 1 0 +vn -1 0.03 0 +vn 1 -0.03 0 +vn 0 0 -1 +vn 0 0 1 +vn -0.03 -1 0 +vn 0.03 1 0 +vn -1 0.03 0 +vn 0 0 -1 +vn 0 0 1 +vn -0.03 -1 0 +vn 0.03 1 0 +vn -1 0.03 0 +vn 0 0 -1 +vn 0 0 1 +vn -0.03 -1 0 +vn 0.03 1 0 +vn -1 0.03 0 +vn 0 0 -1 +vn 0 0 1 +vn -0.03 -1 0 +vn 0.03 1 0 +vn -1 0.03 0 +vn 0 0 -1 +vn 0 0 1 +vn -0.03 -1 0 +vn 0.03 1 0 +vn -1 0.03 0 +vn 0 0 -1 +vn 0 0 1 +vn -0.03 -1 0 +vn 0.03 1 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn 1 0 0 +vn -1 0 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn 1 0 0 +vn -1 0 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn 1 0 0 +vn -1 0 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn -1 0 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 1 0.01 +vn 0 0.24 -0.97 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0.01 +vn 0 -1 -0.01 +vn 1 0 -0.01 +vn -1 0 0.01 +vn 1 0 0 +vn -1 0 0 +vn 0 -0.22 0.98 +vn 0 0.22 -0.98 +vn 0 -0.98 -0.22 +vn 0 -0.98 -0.22 +vn 0 -0.98 -0.22 +vn 0 -0.98 -0.22 +vn 0 -0.98 -0.22 +vn 1 0 0 +vn 0 0.22 -0.98 +vn -1 0 0 +vn 0 -0.22 0.98 +vn 0.71 0.69 0.15 +vn -0.71 0.69 0.15 +vn 0 0.54 0.84 +vn 0 0.84 -0.54 +vn 0 0.98 0.22 +vn 0 -0.98 -0.22 +vn 0 1 0 +vn 0 1 0 +vn 0 1 0 +vn 0 1 0 +vn 0 1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 0 -1 +vn 0 0 1 +vn 0 0 -1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 0 -1 +vn 0 0 -1 +vn 0 -1 0 +vn 0 0 -1 +vn 0 1 0 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 0 0 -1 +vn 0 0 1 +vn 1 0 0 +vn 0 0 -1 +vn 0 0 1 +usemtl common_table +f 1/1/1 2/2/1 4/3/1 3/4/1 +f 6/5/2 5/6/2 7/7/2 8/8/2 +f 7/9/3 3/10/3 4/11/3 8/12/3 +f 2/13/4 6/14/4 8/15/4 4/16/4 +usemtl common_steel +f 11/17/5 12/18/5 13/19/5 9/20/5 +f 15/21/6 14/22/6 10/23/6 16/24/6 +f 23/25/7 24/26/7 10/27/7 14/28/7 +f 16/29/8 22/30/8 21/31/8 15/32/8 +usemtl common_bottom +f 25/33/9 26/34/9 20/35/9 19/36/9 +usemtl common_steel +f 17/37/10 25/38/10 24/39/10 9/40/10 +f 26/41/11 22/42/11 16/43/11 20/44/11 +f 12/45/12 21/46/12 22/47/12 13/48/12 +usemtl common_wooden_base_light +f 23/49/13 21/50/13 12/51/13 11/52/13 +usemtl common_steel +f 24/53/14 23/54/14 11/55/14 9/56/14 +f 10/57/15 24/58/15 25/59/15 19/60/15 +usemtl common_bottom +f 26/61/16 25/62/16 17/63/16 18/64/16 +usemtl common_steel +f 22/65/17 26/66/17 18/67/17 13/68/17 +f 27/69/18 28/70/18 30/71/18 29/72/18 +f 32/73/19 31/74/19 14/75/19 15/76/19 +f 28/77/20 32/78/20 15/79/20 30/80/20 +f 39/81/21 40/82/21 37/83/21 38/84/21 +f 18/85/22 36/86/22 34/87/22 13/88/22 +f 13/89/23 34/90/23 33/91/23 9/92/23 +f 9/93/24 33/94/24 35/95/24 17/96/24 +f 17/97/25 35/98/25 36/99/25 18/100/25 +f 36/101/26 37/102/26 40/103/26 34/104/26 +f 34/105/27 40/106/27 39/107/27 33/108/27 +f 33/109/28 39/110/28 38/111/28 35/112/28 +f 35/113/29 38/114/29 37/115/29 36/116/29 +f 43/117/30 41/118/30 42/119/30 44/120/30 +f 46/121/31 47/122/31 20/123/31 16/124/31 +f 45/125/32 46/126/32 16/127/32 10/128/32 +f 48/129/33 45/130/33 10/131/33 19/132/33 +f 47/133/34 48/134/34 19/135/34 20/136/34 +f 41/137/35 43/138/35 47/139/35 46/140/35 +f 42/141/36 41/142/36 46/143/36 45/144/36 +f 44/145/37 42/146/37 45/147/37 48/148/37 +f 43/149/38 44/150/38 48/151/38 47/152/38 +usemtl common_bottom +f 55/153/39 51/154/39 49/155/39 54/156/39 +f 54/157/40 49/158/40 50/159/40 53/160/40 +f 53/161/41 50/162/41 52/163/41 57/164/41 +f 57/165/42 52/166/42 51/167/42 55/168/42 +usemtl common_wooden_base_light +f 62/169/43 60/170/43 61/171/43 63/172/43 +usemtl common_steel +f 27/173/44 59/174/44 60/175/44 62/176/44 +f 66/177/45 64/178/45 65/179/45 67/180/45 +f 68/181/46 69/182/46 12/183/46 11/184/46 +f 59/185/47 68/186/47 11/187/47 71/188/47 +usemtl common_wooden_base_light +f 70/189/48 59/190/48 71/191/48 72/192/48 +usemtl common_steel +f 28/193/49 30/194/49 12/195/49 69/196/49 +f 69/197/50 68/198/50 58/199/50 56/200/50 +usemtl data_input_machine +f 78/201/51 74/202/51 73/203/51 77/204/51 +f 79/205/52 75/206/52 76/207/52 80/208/52 +f 77/209/53 73/210/53 75/211/53 79/212/53 +f 74/213/54 78/214/54 80/215/54 76/216/54 +usemtl common_thingies +f 85/217/55 82/218/55 83/219/55 86/220/55 +f 84/221/56 81/222/56 82/223/56 85/224/56 +f 87/225/57 88/226/57 90/227/57 89/228/57 +f 92/229/58 91/230/58 93/231/58 94/232/58 +f 92/233/59 88/234/59 87/235/59 91/236/59 +f 91/237/60 87/238/60 89/239/60 93/240/60 +f 95/241/61 96/242/61 98/243/61 97/244/61 +f 93/245/62 95/246/62 97/247/62 84/248/62 +f 100/249/63 99/250/63 101/251/63 102/252/63 +f 99/253/64 89/254/64 81/255/64 101/256/64 +f 94/257/65 93/258/65 85/259/65 86/260/65 +f 89/261/66 90/262/66 83/263/66 82/264/66 +f 97/265/67 98/266/67 102/267/67 101/268/67 +f 99/269/68 100/270/68 96/271/68 95/272/68 +f 104/273/69 106/274/69 105/275/69 103/276/69 +f 111/277/70 108/278/70 109/279/70 112/280/70 +f 110/281/71 107/282/71 108/283/71 111/284/71 +f 113/285/72 114/286/72 116/287/72 115/288/72 +f 118/289/73 117/290/73 119/291/73 120/292/73 +f 118/293/74 114/294/74 113/295/74 117/296/74 +f 117/297/75 113/298/75 115/299/75 119/300/75 +f 121/301/76 122/302/76 124/303/76 123/304/76 +f 119/305/77 121/306/77 123/307/77 110/308/77 +f 126/309/78 125/310/78 127/311/78 128/312/78 +f 125/313/79 115/314/79 107/315/79 127/316/79 +f 120/317/80 119/318/80 111/319/80 112/320/80 +f 115/321/81 116/322/81 109/323/81 108/324/81 +f 123/325/82 124/326/82 128/327/82 127/328/82 +f 125/329/83 126/330/83 122/331/83 121/332/83 +f 130/333/84 132/334/84 131/335/84 129/336/84 +usemtl data_input_machine +f 133/337/85 134/338/85 136/339/85 135/340/85 +f 138/341/86 137/342/86 139/343/86 140/344/86 +f 138/345/87 134/346/87 133/347/87 137/348/87 +f 139/349/88 135/350/88 136/351/88 140/352/88 +f 137/353/89 133/354/89 135/355/89 139/356/89 +f 134/357/90 138/358/90 140/359/90 136/360/90 +usemtl circuit_basic +f 141/361/91 142/362/91 144/363/91 143/364/91 +f 146/365/92 145/366/92 147/367/92 148/368/92 +f 146/369/93 142/370/93 141/371/93 145/372/93 +f 147/373/94 143/374/94 144/375/94 148/376/94 +f 149/377/95 150/378/95 152/379/95 151/380/95 +f 154/381/96 153/382/96 155/383/96 156/384/96 +f 154/385/97 150/386/97 149/387/97 153/388/97 +f 155/389/98 151/390/98 152/391/98 156/392/98 +f 157/393/99 158/394/99 160/395/99 159/396/99 +f 162/397/100 161/398/100 163/399/100 164/400/100 +f 162/401/101 158/402/101 157/403/101 161/404/101 +f 163/405/102 159/406/102 160/407/102 164/408/102 +f 169/409/103 167/410/103 166/411/103 168/412/103 +f 172/413/104 170/414/104 171/415/104 173/416/104 +f 166/417/105 167/418/105 171/419/105 170/420/105 +f 169/421/106 168/422/106 172/423/106 173/424/106 +f 168/425/107 166/426/107 170/427/107 172/428/107 +f 173/429/108 171/430/108 167/431/108 169/432/108 +f 177/433/109 175/434/109 174/435/109 176/436/109 +f 174/437/110 175/438/110 179/439/110 178/440/110 +f 177/441/111 176/442/111 180/443/111 181/444/111 +f 176/445/112 174/446/112 178/447/112 180/448/112 +f 181/449/113 179/450/113 175/451/113 177/452/113 +f 185/453/114 183/454/114 182/455/114 184/456/114 +f 182/457/115 183/458/115 187/459/115 186/460/115 +f 185/461/116 184/462/116 188/463/116 189/464/116 +f 184/465/117 182/466/117 186/467/117 188/468/117 +f 189/469/118 187/470/118 183/471/118 185/472/118 +f 193/473/119 191/474/119 190/475/119 192/476/119 +f 190/477/120 191/478/120 195/479/120 194/480/120 +f 193/481/121 192/482/121 196/483/121 197/484/121 +f 192/485/122 190/486/122 194/487/122 196/488/122 +f 197/489/123 195/490/123 191/491/123 193/492/123 +f 201/493/124 199/494/124 198/495/124 200/496/124 +f 198/497/125 199/498/125 203/499/125 202/500/125 +f 201/501/126 200/502/126 204/503/126 205/504/126 +f 200/505/127 198/506/127 202/507/127 204/508/127 +f 205/509/128 203/510/128 199/511/128 201/512/128 +f 208/513/129 165/514/129 206/515/129 207/516/129 +f 206/517/130 165/518/130 210/519/130 209/520/130 +f 208/521/131 207/522/131 211/523/131 212/524/131 +f 207/525/132 206/526/132 209/527/132 211/528/132 +f 212/529/133 210/530/133 165/531/133 208/532/133 +f 217/533/134 215/534/134 214/535/134 216/536/134 +f 220/537/135 218/538/135 219/539/135 221/540/135 +f 214/541/136 215/542/136 219/543/136 218/544/136 +f 217/545/137 216/546/137 220/547/137 221/548/137 +f 216/549/138 214/550/138 218/551/138 220/552/138 +f 221/553/139 219/554/139 215/555/139 217/556/139 +f 225/557/140 223/558/140 222/559/140 224/560/140 +f 222/561/141 223/562/141 227/563/141 226/564/141 +f 225/565/142 224/566/142 228/567/142 229/568/142 +f 224/569/143 222/570/143 226/571/143 228/572/143 +f 229/573/144 227/574/144 223/575/144 225/576/144 +f 233/577/145 231/578/145 230/579/145 232/580/145 +f 230/581/146 231/582/146 235/583/146 234/584/146 +f 233/585/147 232/586/147 236/587/147 237/588/147 +f 232/589/148 230/590/148 234/591/148 236/592/148 +f 237/593/149 235/594/149 231/595/149 233/596/149 +f 241/597/150 239/598/150 238/599/150 240/600/150 +f 238/601/151 239/602/151 243/603/151 242/604/151 +f 241/605/152 240/606/152 244/607/152 245/608/152 +f 240/609/153 238/610/153 242/611/153 244/612/153 +f 245/613/154 243/614/154 239/615/154 241/616/154 +f 249/617/155 247/618/155 246/619/155 248/620/155 +f 246/621/156 247/622/156 251/623/156 250/624/156 +f 249/625/157 248/626/157 252/627/157 253/628/157 +f 248/629/158 246/630/158 250/631/158 252/632/158 +f 253/633/159 251/634/159 247/635/159 249/636/159 +f 256/637/160 213/638/160 254/639/160 255/640/160 +f 254/641/161 213/642/161 258/643/161 257/644/161 +f 256/645/162 255/646/162 259/647/162 260/648/162 +f 255/649/163 254/650/163 257/651/163 259/652/163 +f 260/653/164 258/654/164 213/655/164 256/656/164 +f 265/657/165 263/658/165 262/659/165 264/660/165 +f 268/661/166 266/662/166 267/663/166 269/664/166 +f 262/665/167 263/666/167 267/667/167 266/668/167 +f 265/669/168 264/670/168 268/671/168 269/672/168 +f 264/673/169 262/674/169 266/675/169 268/676/169 +f 269/677/170 267/678/170 263/679/170 265/680/170 +f 273/681/171 271/682/171 270/683/171 272/684/171 +f 270/685/172 271/686/172 275/687/172 274/688/172 +f 273/689/173 272/690/173 276/691/173 277/692/173 +f 272/693/174 270/694/174 274/695/174 276/696/174 +f 277/697/175 275/698/175 271/699/175 273/700/175 +f 281/701/176 279/702/176 278/703/176 280/704/176 +f 278/705/177 279/706/177 283/707/177 282/708/177 +f 281/709/178 280/710/178 284/711/178 285/712/178 +f 280/713/179 278/714/179 282/715/179 284/716/179 +f 285/717/180 283/718/180 279/719/180 281/720/180 +f 289/721/181 287/722/181 286/723/181 288/724/181 +f 286/725/182 287/726/182 291/727/182 290/728/182 +f 289/729/183 288/730/183 292/731/183 293/732/183 +f 288/733/184 286/734/184 290/735/184 292/736/184 +f 293/737/185 291/738/185 287/739/185 289/740/185 +f 297/741/186 295/742/186 294/743/186 296/744/186 +f 294/745/187 295/746/187 299/747/187 298/748/187 +f 297/749/188 296/750/188 300/751/188 301/752/188 +f 296/753/189 294/754/189 298/755/189 300/756/189 +f 301/757/190 299/758/190 295/759/190 297/760/190 +f 304/761/191 261/762/191 302/763/191 303/764/191 +f 302/765/192 261/766/192 306/767/192 305/768/192 +f 304/769/193 303/770/193 307/771/193 308/772/193 +f 303/773/194 302/774/194 305/775/194 307/776/194 +f 308/777/195 306/778/195 261/779/195 304/780/195 +usemtl common_copper_cable +f 309/781/196 310/782/196 312/783/196 311/784/196 +f 314/785/197 310/786/197 309/787/197 313/788/197 +f 315/789/198 311/790/198 312/791/198 316/792/198 +f 313/793/199 309/794/199 311/795/199 315/796/199 +f 317/797/200 318/798/200 320/799/200 319/800/200 +f 321/801/201 318/802/201 317/803/201 314/804/201 +f 316/805/202 319/806/202 320/807/202 322/808/202 +f 314/809/203 317/810/203 319/811/203 316/812/203 +f 323/813/204 324/814/204 326/815/204 325/816/204 +f 328/817/205 324/818/205 323/819/205 327/820/205 +f 329/821/206 325/822/206 326/823/206 330/824/206 +f 327/825/207 323/826/207 325/827/207 329/828/207 +f 331/829/208 332/830/208 334/831/208 333/832/208 +f 335/833/209 332/834/209 331/835/209 328/836/209 +f 330/837/210 333/838/210 334/839/210 336/840/210 +f 328/841/211 331/842/211 333/843/211 330/844/211 +f 337/845/212 338/846/212 340/847/212 339/848/212 +f 342/849/213 338/850/213 337/851/213 341/852/213 +f 343/853/214 339/854/214 340/855/214 344/856/214 +f 341/857/215 337/858/215 339/859/215 343/860/215 +f 345/861/216 346/862/216 348/863/216 347/864/216 +f 349/865/217 346/866/217 345/867/217 342/868/217 +f 344/869/218 347/870/218 348/871/218 350/872/218 +f 342/873/219 345/874/219 347/875/219 344/876/219 +usemtl common_steel +f 351/877/220 352/878/220 354/879/220 353/880/220 +f 356/881/221 355/882/221 357/883/221 358/884/221 +f 356/885/222 352/886/222 351/887/222 355/888/222 +f 357/889/223 353/890/223 354/891/223 358/892/223 +f 355/893/224 351/894/224 353/895/224 357/896/224 +usemtl common_table +f 359/897/225 360/898/225 362/899/225 361/900/225 +f 364/901/226 363/902/226 365/903/226 366/904/226 +f 365/905/227 361/906/227 362/907/227 366/908/227 +f 363/909/228 359/910/228 361/911/228 365/912/228 +f 360/913/229 364/914/229 366/915/229 362/916/229 +f 367/917/230 368/918/230 370/919/230 369/920/230 +f 372/921/231 371/922/231 373/923/231 374/924/231 +f 373/925/232 369/926/232 370/927/232 374/928/232 +f 371/929/233 367/930/233 369/931/233 373/932/233 +f 368/933/234 372/934/234 374/935/234 370/936/234 +f 375/937/235 376/938/235 378/939/235 377/940/235 +f 380/941/236 379/942/236 381/943/236 382/944/236 +f 381/945/237 377/946/237 378/947/237 382/948/237 +f 379/949/238 375/950/238 377/951/238 381/952/238 +f 376/953/239 380/954/239 382/955/239 378/956/239 +f 383/957/240 384/958/240 386/959/240 385/960/240 +f 388/961/241 387/962/241 389/963/241 390/964/241 +f 389/965/242 385/966/242 386/967/242 390/968/242 +f 387/969/243 383/970/243 385/971/243 389/972/243 +f 384/973/244 388/974/244 390/975/244 386/976/244 +f 391/977/245 9/978/245 393/979/245 392/980/245 +f 10/981/246 394/982/246 395/983/246 396/984/246 +f 10/985/247 9/986/247 391/987/247 394/988/247 +f 395/989/248 392/990/248 393/991/248 396/992/248 +f 394/993/249 391/994/249 392/995/249 395/996/249 +usemtl data_input_machine +f 80/997/250 78/998/250 77/999/250 79/1000/250 +usemtl common_steel +f 402/1001/251 401/1002/251 403/1003/251 404/1004/251 +f 398/1005/252 397/1006/252 399/1007/252 400/1008/252 +f 398/1009/253 401/1010/253 402/1011/253 397/1012/253 +f 399/1013/254 404/1014/254 403/1015/254 400/1016/254 +f 397/1017/255 402/1018/255 404/1019/255 399/1020/255 +f 410/1021/256 409/1022/256 411/1023/256 412/1024/256 +f 406/1025/257 405/1026/257 407/1027/257 408/1028/257 +f 406/1029/258 409/1030/258 410/1031/258 405/1032/258 +f 407/1033/259 412/1034/259 411/1035/259 408/1036/259 +f 405/1037/260 410/1038/260 412/1039/260 407/1040/260 +f 418/1041/261 417/1042/261 419/1043/261 420/1044/261 +f 414/1045/262 413/1046/262 415/1047/262 416/1048/262 +f 414/1049/263 417/1050/263 418/1051/263 413/1052/263 +f 415/1053/264 420/1054/264 419/1055/264 416/1056/264 +f 413/1057/265 418/1058/265 420/1059/265 415/1060/265 +usemtl common_thingies +f 421/1061/266 422/1062/266 424/1063/266 423/1064/266 +f 426/1065/267 425/1066/267 427/1067/267 428/1068/267 +f 426/1069/268 422/1070/268 421/1071/268 425/1072/268 +f 427/1073/269 423/1074/269 424/1075/269 428/1076/269 +f 425/1077/270 421/1078/270 423/1079/270 427/1080/270 +usemtl common_copper_cable +f 433/1081/271 432/1082/271 430/1083/271 434/1084/271 +f 431/1085/272 429/1086/272 430/1087/272 432/1088/272 +f 436/1089/273 431/1090/273 432/1091/273 433/1092/273 +f 434/1093/274 430/1094/274 429/1095/274 435/1096/274 +f 433/1097/275 434/1098/275 439/1099/275 438/1100/275 +f 435/1101/276 436/1102/276 440/1103/276 437/1104/276 +f 436/1105/277 433/1106/277 438/1107/277 440/1108/277 +f 434/1109/278 435/1110/278 437/1111/278 439/1112/278 +usemtl data_input_machine +f 441/1113/279 442/1114/279 444/1115/279 443/1116/279 +f 446/1117/280 445/1118/280 447/1119/280 448/1120/280 +f 446/1121/281 442/1122/281 441/1123/281 445/1124/281 +f 447/1125/282 443/1126/282 444/1127/282 448/1128/282 +f 454/1129/283 453/1130/283 455/1131/283 456/1132/283 +f 448/1133/284 451/1134/284 449/1135/284 446/1136/284 +f 446/1137/285 449/1138/285 450/1139/285 442/1140/285 +f 442/1141/286 450/1142/286 452/1143/286 444/1144/286 +f 444/1145/287 452/1146/287 451/1147/287 448/1148/287 +f 451/1149/288 455/1150/288 453/1151/288 449/1152/288 +f 449/1153/289 453/1154/289 454/1155/289 450/1156/289 +f 450/1157/290 454/1158/290 456/1159/290 452/1160/290 +f 452/1161/291 456/1162/291 455/1163/291 451/1164/291 +f 457/1165/292 441/1166/292 443/1167/292 458/1168/292 +f 445/1169/293 459/1170/293 460/1171/293 447/1172/293 +f 445/1173/294 441/1174/294 457/1175/294 459/1176/294 +f 460/1177/295 458/1178/295 443/1179/295 447/1180/295 +f 459/1181/296 457/1182/296 458/1183/296 460/1184/296 +f 462/1185/297 461/1186/297 463/1187/297 464/1188/297 +usemtl common_bottom +f 468/1189/298 467/1190/298 469/1191/298 470/1192/298 +f 474/1193/299 473/1194/299 472/1195/299 466/1196/299 +f 466/1197/300 472/1198/300 471/1199/300 465/1200/300 +f 465/1201/301 471/1202/301 475/1203/301 476/1204/301 +f 476/1205/302 475/1206/302 473/1207/302 474/1208/302 +usemtl common_thingies +f 479/1209/303 477/1210/303 478/1211/303 480/1212/303 +f 482/1213/304 481/1214/304 483/1215/304 484/1216/304 +f 478/1217/305 477/1218/305 481/1219/305 482/1220/305 +f 481/1221/306 477/1222/306 479/1223/306 483/1224/306 +f 480/1225/307 478/1226/307 482/1227/307 484/1228/307 +usemtl common_steel +f 486/1229/308 27/1230/308 29/1231/308 485/1232/308 +f 14/1233/309 31/1234/309 486/1235/309 485/1236/309 +usemtl common_thingies +f 487/1237/310 488/1238/310 490/1239/310 489/1240/310 +f 492/1241/311 491/1242/311 493/1243/311 494/1244/311 +f 492/1245/312 488/1246/312 487/1247/312 491/1248/312 +f 493/1249/313 489/1250/313 490/1251/313 494/1252/313 +f 491/1253/314 487/1254/314 489/1255/314 493/1256/314 +f 488/1257/315 492/1258/315 494/1259/315 490/1260/315 +usemtl data_input_machine +f 495/1261/316 496/1262/316 498/1263/316 497/1264/316 +f 500/1265/317 499/1266/317 501/1267/317 502/1268/317 +f 500/1269/318 496/1270/318 495/1271/318 499/1272/318 +f 501/1273/319 497/1274/319 498/1275/319 502/1276/319 +f 496/1277/320 500/1278/320 502/1279/320 498/1280/320 +usemtl common_thingies +f 499/1281/321 495/1282/321 503/1283/321 504/1284/321 +f 503/1285/322 497/1286/322 505/1287/322 506/1288/322 +f 505/1289/323 501/1290/323 504/1291/323 506/1292/323 +f 508/1293/324 507/1294/324 509/1295/324 510/1296/324 +f 507/1297/325 511/1298/325 512/1299/325 509/1300/325 +f 512/1301/326 511/1302/326 513/1303/326 514/1304/326 +f 514/1305/327 513/1306/327 508/1307/327 510/1308/327 +f 513/1309/328 511/1310/328 507/1311/328 508/1312/328 +f 521/1313/329 519/1314/329 520/1315/329 522/1316/329 +f 519/1317/330 515/1318/330 516/1319/330 520/1320/330 +f 518/1321/331 517/1322/331 521/1323/331 522/1324/331 +f 517/1325/332 515/1326/332 519/1327/332 521/1328/332 +f 520/1329/333 516/1330/333 518/1331/333 522/1332/333 +f 528/1333/334 527/1334/334 523/1335/334 525/1336/334 +f 525/1337/335 523/1338/335 524/1339/335 526/1340/335 +f 530/1341/336 529/1342/336 527/1343/336 528/1344/336 +f 531/1345/337 535/1346/337 536/1347/337 533/1348/337 +f 532/1349/338 531/1350/338 533/1351/338 534/1352/338 +f 535/1353/339 537/1354/339 538/1355/339 536/1356/339 +o mess_basic +v -0.1562 0.1875 1 +v -0.1562 0.1875 0.9375 +v -0.1562 0 1 +v -0.1562 0 0.9375 +v -0.3437 0.1875 1 +v -0.3437 0.1875 0.9375 +v -0.3437 0 1 +v -0.3437 0 0.9375 +v -0.4062 0.1875 1 +v -0.4062 0.1875 0.9375 +v -0.4062 0 1 +v -0.4062 0 0.9375 +v -0.5937 0.1875 1 +v -0.5937 0.1875 0.9375 +v -0.5937 0 1 +v -0.5937 0 0.9375 +v -0.9687 0.2476 0.5459 +v -0.9687 0.1057 0.2675 +v -0.9687 0.1919 0.5743 +v -0.0937 0.2476 0.5459 +v -0.0937 0.1057 0.2675 +v -0.0937 0.1919 0.5743 +v -0.0937 0.0501 0.2959 +v -0.2812 0.1057 0.2675 +v -0.2812 0.0501 0.2959 +v -0.0937 0.1057 0.2675 +v -0.0937 0.0501 0.2959 +v -0.9687 0.1057 0.2675 +v -0.9687 0.0774 0.2118 +v -0.9687 0.0217 0.2402 +v -0.2812 0.1057 0.2675 +v -0.2812 0.0774 0.2118 +v -0.2812 0.0501 0.2959 +v -0.2812 0.0217 0.2402 +v -0.2812 0.0774 0.2118 +v -0.2812 0.049 0.1561 +v -0.2812 0.0217 0.2402 +v -0.2812 -0.0067 0.1845 +v -0.0937 0.0774 0.2118 +v -0.0937 0.049 0.1561 +v -0.0937 0.0217 0.2402 +v -0.0937 -0.0067 0.1845 +v -0.2187 0.1057 0.2675 +v -0.2187 0.0774 0.2118 +v -0.2187 0.0501 0.2959 +v -0.2187 0.0217 0.2402 +v -0.1562 0.1057 0.2675 +v -0.1562 0.0774 0.2118 +v -0.1562 0.0501 0.2959 +v -0.1562 0.0217 0.2402 +v -0.0937 0.1875 0.9375 +v -0.0937 0.1875 0.5625 +v -0.0937 0 0.9375 +v -0.0937 0 0.1875 +v -0.9687 0.1875 0.9375 +v -0.9687 0.1875 0.5625 +v -0.9687 0 0.9375 +v -0.9687 0 0.1875 +v -0.1562 0.25 0.625 +v -0.1562 0.25 0.8125 +v -0.1562 0.1875 0.625 +v -0.1562 0.1875 0.8125 +v -0.9062 0.25 0.625 +v -0.9062 0.25 0.8125 +v -0.9062 0.1875 0.625 +v -0.9062 0.1875 0.8125 +vt 0.0156 0.9531 +vt 0.0156 1 +vt 0 1 +vt 0 0.9531 +vt 0.0156 0.9531 +vt 0.0156 1 +vt 0 1 +vt 0 0.9531 +vt 0.0469 0.9844 +vt 0.0469 1 +vt 0 1 +vt 0 0.9844 +vt 0.5156 0.7188 +vt 0.5156 0.7344 +vt 0.4688 0.7344 +vt 0.4688 0.7188 +vt 0.5156 0.7188 +vt 0.5156 0.7656 +vt 0.4688 0.7656 +vt 0.4688 0.7188 +vt 0.0156 0.9531 +vt 0.0156 1 +vt 0 1 +vt 0 0.9531 +vt 0.0156 0.9531 +vt 0.0156 1 +vt 0 1 +vt 0 0.9531 +vt 0.0469 0.9844 +vt 0.0469 1 +vt 0 1 +vt 0 0.9844 +vt 0.5156 0.7188 +vt 0.5156 0.7344 +vt 0.4688 0.7344 +vt 0.4688 0.7188 +vt 0.5156 0.7188 +vt 0.5156 0.7656 +vt 0.4688 0.7656 +vt 0.4688 0.7188 +vt 1 0.6406 +vt 0.7813 0.6406 +vt 0.7813 0.7188 +vt 1 0.7188 +vt 1 0.7188 +vt 0.7813 0.7188 +vt 0.7813 0.7031 +vt 1 0.7031 +vt 0.9844 0.6406 +vt 0.9844 0.7188 +vt 1 0.7188 +vt 1 0.6406 +vt 0.9531 0.6563 +vt 1 0.6563 +vt 1 0.6406 +vt 0.9531 0.6406 +vt 0.9375 0.6406 +vt 0.9531 0.6406 +vt 0.9531 0.625 +vt 0.9375 0.625 +vt 0.9531 0.6406 +vt 0.7813 0.6406 +vt 0.7813 0.625 +vt 0.9531 0.625 +vt 0.7813 0.6406 +vt 0.9531 0.6406 +vt 0.9531 0.625 +vt 0.7813 0.625 +vt 0.9531 0.625 +vt 0.9688 0.625 +vt 0.9688 0.6094 +vt 0.9531 0.6094 +vt 0.9531 0.625 +vt 1 0.625 +vt 1 0.6094 +vt 0.9531 0.6094 +vt 0.9531 0.625 +vt 1 0.625 +vt 1 0.6094 +vt 0.9531 0.6094 +vt 0.9531 0.625 +vt 1 0.625 +vt 1 0.6094 +vt 0.9531 0.6094 +vt 0.9844 0.6094 +vt 0.9844 0.625 +vt 1 0.625 +vt 1 0.6094 +vt 0.9688 0.6406 +vt 0.9844 0.6406 +vt 0.9844 0.625 +vt 0.9688 0.625 +vt 0.9688 0.6406 +vt 0.9844 0.6406 +vt 0.9844 0.625 +vt 0.9688 0.625 +vt 0.9688 0.6406 +vt 0.9844 0.6406 +vt 0.9844 0.625 +vt 0.9688 0.625 +vt 0.7969 0.7188 +vt 0.7813 0.7188 +vt 0.7813 0.625 +vt 0.7969 0.625 +vt 0.4375 0.625 +vt 0.5313 0.8125 +vt 0.5313 1 +vt 0.4375 1 +vt 0.4375 1 +vt 0.5313 1 +vt 0.5313 0.8125 +vt 0.4375 0.625 +vt 0.4375 1 +vt 0.4375 0.8125 +vt 0 0.8125 +vt 0 1 +vt 0 0.5 +vt 0 0.5938 +vt 0.4375 0.5938 +vt 0.4375 0.5 +vt 0 0.5938 +vt 0 0.8125 +vt 0.4375 0.8125 +vt 0.4375 0.5938 +vt 0.6094 0.2188 +vt 0.6094 0.2656 +vt 0.625 0.2656 +vt 0.625 0.2188 +vt 0.4375 0.2188 +vt 0.4375 0.2656 +vt 0.4531 0.2656 +vt 0.4531 0.2188 +vt 0.4375 0.2656 +vt 0.625 0.2656 +vt 0.625 0.2188 +vt 0.4375 0.2188 +vt 0.4375 0.2344 +vt 0.625 0.2344 +vt 0.625 0.2188 +vt 0.4375 0.2188 +vt 0.625 0.2656 +vt 0.4375 0.2656 +vt 0.4375 0.25 +vt 0.625 0.25 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0.89 -0.45 +vn 0 0.45 0.89 +vn 1 0 0 +vn 0 -0.45 -0.89 +vn 1 0 0 +vn 0 0.89 -0.45 +vn 0 -0.45 -0.89 +vn -1 0 0 +vn 0 0.89 -0.45 +vn 0 0.45 0.89 +vn 0 -0.45 -0.89 +vn 1 0 0 +vn -1 0 0 +vn 1 0 0 +vn 0 0.89 -0.45 +vn -1 0 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0.89 -0.45 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 0 -1 +vn 0 0 1 +usemtl common_thingies +f 542/1357/340 540/1358/340 539/1359/340 541/1360/340 +f 545/1361/341 543/1362/341 544/1363/341 546/1364/341 +f 539/1365/342 540/1366/342 544/1367/342 543/1368/342 +usemtl common_copper_cable +f 542/1369/343 541/1370/343 545/1371/343 546/1372/343 +f 541/1373/344 539/1374/344 543/1375/344 545/1376/344 +usemtl common_thingies +f 550/1377/345 548/1378/345 547/1379/345 549/1380/345 +f 553/1381/346 551/1382/346 552/1383/346 554/1384/346 +f 547/1385/347 548/1386/347 552/1387/347 551/1388/347 +usemtl common_copper_cable +f 550/1389/348 549/1390/348 553/1391/348 554/1392/348 +f 549/1393/349 547/1394/349 551/1395/349 553/1396/349 +usemtl common_thingies +f 559/1397/350 556/1398/350 555/1399/350 558/1400/350 +f 558/1401/351 555/1402/351 557/1403/351 560/1404/351 +f 559/1405/352 558/1406/352 560/1407/352 561/1408/352 +f 562/1409/353 564/1410/353 565/1411/353 563/1412/353 +f 570/1413/354 569/1414/354 571/1415/354 572/1416/354 +f 570/1417/355 567/1418/355 566/1419/355 569/1420/355 +f 567/1421/356 570/1422/356 572/1423/356 568/1424/356 +f 573/1425/357 574/1426/357 576/1427/357 575/1428/357 +f 578/1429/358 574/1430/358 573/1431/358 577/1432/358 +f 577/1433/359 573/1434/359 575/1435/359 579/1436/359 +f 574/1437/360 578/1438/360 580/1439/360 576/1440/360 +f 580/1441/361 578/1442/361 577/1443/361 579/1444/361 +f 581/1445/362 582/1446/362 584/1447/362 583/1448/362 +f 586/1449/363 585/1450/363 587/1451/363 588/1452/363 +f 586/1453/364 582/1454/364 581/1455/364 585/1456/364 +f 557/1457/365 555/1458/365 567/1459/365 568/1460/365 +usemtl typewriter_red +f 592/1461/366 590/1462/366 589/1463/366 591/1464/366 +f 595/1465/367 593/1466/367 594/1467/367 596/1468/367 +f 589/1469/368 590/1470/368 594/1471/368 593/1472/368 +f 591/1473/369 589/1474/369 593/1475/369 595/1476/369 +f 596/1477/370 594/1478/370 590/1479/370 592/1480/370 +usemtl common_thingies +f 597/1481/371 598/1482/371 600/1483/371 599/1484/371 +f 602/1485/372 601/1486/372 603/1487/372 604/1488/372 +f 602/1489/373 598/1490/373 597/1491/373 601/1492/373 +f 601/1493/374 597/1494/374 599/1495/374 603/1496/374 +f 598/1497/375 602/1498/375 604/1499/375 600/1500/375 +o mb_book_holder +v -0.4687 0.3125 0.75 +v -0.4687 0.3125 1.1875 +v -0.4687 0.25 0.75 +v -0.4687 0.25 1.1875 +v -0.5937 0.3125 0.75 +v -0.5937 0.3125 1.1875 +v -0.5937 0.25 0.75 +v -0.5937 0.25 1.1875 +v -0.4687 0.4375 0.6875 +v -0.4687 0.4375 0.75 +v -0.4687 0.25 0.6875 +v -0.4687 0.25 0.75 +v -0.5937 0.4375 0.6875 +v -0.5937 0.4375 0.75 +v -0.5937 0.25 0.6875 +v -0.5937 0.25 0.75 +vt 0.9063 0.7813 +vt 0.9063 1 +vt 0.9375 1 +vt 0.9375 0.7813 +vt 0.875 0.7813 +vt 0.875 1 +vt 0.9063 1 +vt 0.9063 0.7813 +vt 0.875 1 +vt 0.9375 1 +vt 0.9375 0.7813 +vt 0.875 0.7813 +vt 0.875 1 +vt 0.9375 1 +vt 0.9375 0.7813 +vt 0.875 0.7813 +vt 0.875 1 +vt 0.9375 1 +vt 0.9375 0.9688 +vt 0.875 0.9688 +vt 0.9063 1 +vt 0.9375 1 +vt 0.9375 0.9063 +vt 0.9063 0.9063 +vt 0.875 1 +vt 0.9063 1 +vt 0.9063 0.9063 +vt 0.875 0.9063 +vt 0.875 1 +vt 0.9375 1 +vt 0.9375 0.9688 +vt 0.875 0.9688 +vt 0.875 1 +vt 0.9375 1 +vt 0.9375 0.9063 +vt 0.875 0.9063 +vt 0.9375 1 +vt 0.875 1 +vt 0.875 0.9063 +vt 0.9375 0.9063 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 0 -1 +vn 0 0 1 +usemtl typewriter_red +f 605/1501/376 606/1502/376 608/1503/376 607/1504/376 +f 610/1505/377 609/1506/377 611/1507/377 612/1508/377 +f 610/1509/378 606/1510/378 605/1511/378 609/1512/378 +f 611/1513/379 607/1514/379 608/1515/379 612/1516/379 +f 606/1517/380 610/1518/380 612/1519/380 608/1520/380 +f 613/1521/381 614/1522/381 616/1523/381 615/1524/381 +f 618/1525/382 617/1526/382 619/1527/382 620/1528/382 +f 618/1529/383 614/1530/383 613/1531/383 617/1532/383 +f 617/1533/384 613/1534/384 615/1535/384 619/1536/384 +f 614/1537/385 618/1538/385 620/1539/385 616/1540/385 +o mb_book_left +v -0.5312 0.375 0.75 +v -0.5312 0.375 1.25 +v -0.5312 0.3125 0.75 +v -0.5312 0.3125 1.25 +v -0.9062 0.375 0.75 +v -0.9062 0.375 1.25 +v -0.9062 0.3125 0.75 +v -0.9062 0.3125 1.25 +vt 0.9688 0.0313 +vt 0.7188 0.0313 +vt 0.7188 0.0625 +vt 0.9688 0.0625 +vt 0.625 0.75 +vt 0.625 1 +vt 0.6563 1 +vt 0.6563 0.75 +vt 0.625 1 +vt 0.8125 1 +vt 0.8125 0.75 +vt 0.625 0.75 +vt 0.0313 0.1875 +vt 0.0313 0 +vt 0.2813 0 +vt 0.2813 0.1875 +vt 0.625 0.7813 +vt 0.8125 0.7813 +vt 0.8125 0.75 +vt 0.625 0.75 +vt 0.625 1 +vt 0.8125 1 +vt 0.8125 0.9688 +vt 0.625 0.9688 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +usemtl data_input_machine +f 621/1541/386 622/1542/386 624/1543/386 623/1544/386 +f 626/1545/387 625/1546/387 627/1547/387 628/1548/387 +f 626/1549/388 622/1550/388 621/1551/388 625/1552/388 +f 627/1553/389 623/1554/389 624/1555/389 628/1556/389 +f 625/1557/390 621/1558/390 623/1559/390 627/1560/390 +f 622/1561/391 626/1562/391 628/1563/391 624/1564/391 +o mb_book_right +v -0.5312 0.375 0.75 +v -0.5312 0.375 1.25 +v -0.5312 0.3125 0.75 +v -0.5312 0.3125 1.25 +v -0.1562 0.375 0.75 +v -0.1562 0.375 1.25 +v -0.1562 0.3125 0.75 +v -0.1562 0.3125 1.25 +v -0.2812 0.286 0.6391 +v -0.2812 0.3438 0.75 +v -0.2812 0.286 0.6391 +v -0.2812 0.3438 0.75 +v -0.4062 0.286 0.6391 +v -0.4062 0.3438 0.75 +v -0.4062 0.286 0.6391 +v -0.4062 0.3438 0.75 +vt 0.7188 0.0625 +vt 0.7188 0.0313 +vt 0.9688 0.0313 +vt 0.9688 0.0625 +vt 0.7813 0.75 +vt 0.8125 0.75 +vt 0.8125 1 +vt 0.7813 1 +vt 0.625 1 +vt 0.625 0.75 +vt 0.8125 0.75 +vt 0.8125 1 +vt 0.7188 0 +vt 0.4688 0 +vt 0.4688 0.1875 +vt 0.7188 0.1875 +vt 0.625 1 +vt 0.625 0.9688 +vt 0.8125 0.9688 +vt 0.8125 1 +vt 0.625 0.7813 +vt 0.625 0.75 +vt 0.8125 0.75 +vt 0.8125 0.7813 +vt 0.8438 0.1875 +vt 0.9063 0.1875 +vt 0.9063 0.1875 +vt 0.8438 0.1875 +vt 0.8438 0.1875 +vt 0.9063 0.1875 +vt 0.9063 0.1875 +vt 0.8438 0.1875 +vt 0.8438 0.1875 +vt 0.9063 0.1875 +vt 0.9063 0.125 +vt 0.8438 0.125 +vt 0.8438 0.1875 +vt 0.9063 0.1875 +vt 0.9063 0.125 +vt 0.8438 0.125 +vt 0.8438 0.1875 +vt 0.9063 0.1875 +vt 0.9063 0.1875 +vt 0.8438 0.1875 +vt 0.8438 0.1875 +vt 0.9063 0.1875 +vt 0.9063 0.1875 +vt 0.8438 0.1875 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn 0 0 0 +vn 0 0 0 +vn 0 0.89 -0.46 +vn 0 -0.89 0.46 +vn 0 0 0 +vn 0 0 0 +usemtl data_input_machine +f 632/1565/392 630/1566/392 629/1567/392 631/1568/392 +f 635/1569/393 633/1570/393 634/1571/393 636/1572/393 +f 629/1573/394 630/1574/394 634/1575/394 633/1576/394 +f 632/1577/395 631/1578/395 635/1579/395 636/1580/395 +f 631/1581/396 629/1582/396 633/1583/396 635/1584/396 +f 636/1585/397 634/1586/397 630/1587/397 632/1588/397 +f 637/1589/398 638/1590/398 640/1591/398 639/1592/398 +f 642/1593/399 641/1594/399 643/1595/399 644/1596/399 +f 642/1597/400 638/1598/400 637/1599/400 641/1600/400 +f 643/1601/401 639/1602/401 640/1603/401 644/1604/401 +f 641/1605/402 637/1606/402 639/1607/402 643/1608/402 +f 638/1609/403 642/1610/403 644/1611/403 640/1612/403 +o mb_cup +v 0.202 0.3125 0.1184 +v 0.3454 0.3125 0.3232 +v 0.202 0.0625 0.1184 +v 0.3454 0.0625 0.3232 +v 0.1508 0.3125 0.1543 +v 0.2942 0.3125 0.3591 +v 0.2584 0.3125 0.3079 +v 0.2584 0.0625 0.3079 +v 0.156 0.3125 0.3796 +v 0.1918 0.3125 0.4308 +v 0.156 0.0625 0.3796 +v 0.0485 0.3125 0.226 +v -0.0027 0.3125 0.2618 +v 0.1407 0.3125 0.4666 +v -0.0027 0.0625 0.2618 +v 0.1407 0.0625 0.4666 +v 0.1867 0.3125 0.2055 +v 0.0843 0.3125 0.2772 +v 0.1867 0.0625 0.2055 +v 0.0843 0.0625 0.2772 +v 0.202 0 0.1184 +v 0.3454 0 0.3232 +v -0.0027 0 0.2618 +v 0.1407 0 0.4666 +v 0.051 0.2813 0.3386 +v 0.0869 0.2813 0.3898 +v 0.051 0.2188 0.3386 +v 0.0869 0.2188 0.3898 +v -0.0002 0.2813 0.3745 +v 0.0357 0.2813 0.4257 +v -0.0002 0.2188 0.3745 +v 0.0357 0.2188 0.4257 +v -0.0514 0.2188 0.4103 +v -0.0155 0.2188 0.4615 +v -0.0002 0.0938 0.3745 +v 0.0357 0.0938 0.4257 +v -0.0514 0.0938 0.4103 +v -0.0155 0.0938 0.4615 +v -0.0002 0.0313 0.3745 +v 0.0357 0.0313 0.4257 +v 0.051 0.0938 0.3386 +v 0.0869 0.0938 0.3898 +v 0.051 0.0313 0.3386 +v 0.0869 0.0313 0.3898 +vt 0 0.625 +vt 0.125 0.625 +vt 0.125 0.5 +vt 0 0.5 +vt 0 0.5313 +vt 0 0.5625 +vt 0.125 0.5625 +vt 0.125 0.5313 +vt 0.0313 0.625 +vt 0.0938 0.625 +vt 0.0938 0.5937 +vt 0.0313 0.5938 +vt 0.0313 0.625 +vt 0.0938 0.625 +vt 0.0938 0.5 +vt 0.0313 0.5 +vt 0 0.625 +vt 0.125 0.625 +vt 0.125 0.5 +vt 0 0.5 +vt 0.0313 0.625 +vt 0.0625 0.625 +vt 0.0625 0.5 +vt 0.0313 0.5 +vt 0.0625 0.5938 +vt 0 0.5938 +vt 0 0.625 +vt 0.0625 0.625 +vt 0 0.625 +vt 0.125 0.625 +vt 0.125 0.5 +vt 0 0.5 +vt 0 0.625 +vt 0.125 0.625 +vt 0.125 0.5 +vt 0 0.5 +vt 0 0.625 +vt 0.0625 0.625 +vt 0.0625 0.5 +vt 0 0.5 +vt 0.0625 0.5 +vt 0 0.5 +vt 0 0.625 +vt 0.0625 0.625 +vt 0.0313 0.5 +vt 0.0313 0.625 +vt 0.0938 0.625 +vt 0.0938 0.5 +vt 0 0.5938 +vt 0.125 0.5938 +vt 0.125 0.5625 +vt 0 0.5625 +vt 0 0.5938 +vt 0.125 0.5938 +vt 0.125 0.5625 +vt 0 0.5625 +vt 0 0.5 +vt 0 0.625 +vt 0.125 0.625 +vt 0.125 0.5 +vt 0 0.5938 +vt 0.125 0.5938 +vt 0.125 0.5625 +vt 0 0.5625 +vt 0 0.625 +vt 0.125 0.625 +vt 0.125 0.5938 +vt 0 0.5938 +vt 0.125 0.5938 +vt 0.125 0.625 +vt 0.1563 0.625 +vt 0.1563 0.5938 +vt 0.0313 0.5938 +vt 0.0313 0.625 +vt 0.0625 0.625 +vt 0.0625 0.5938 +vt 0.125 0.625 +vt 0.1563 0.625 +vt 0.1563 0.5938 +vt 0.125 0.5938 +vt 0.125 0.625 +vt 0.1563 0.625 +vt 0.1563 0.5938 +vt 0.125 0.5938 +vt 0.1563 0.5938 +vt 0.1563 0.625 +vt 0.1875 0.625 +vt 0.1875 0.5938 +vt 0.1563 0.5938 +vt 0.1875 0.5938 +vt 0.1875 0.5313 +vt 0.1563 0.5313 +vt 0.1563 0.5938 +vt 0.1875 0.5938 +vt 0.1875 0.5313 +vt 0.1563 0.5313 +vt 0.1563 0.5938 +vt 0.1875 0.5938 +vt 0.1875 0.5313 +vt 0.1563 0.5313 +vt 0.1563 0.5938 +vt 0.1875 0.5938 +vt 0.1875 0.5313 +vt 0.1563 0.5313 +vt 0.1875 0.5313 +vt 0.1875 0.5027 +vt 0.1563 0.5027 +vt 0.1563 0.5313 +vt 0.125 0.5313 +vt 0.1563 0.5313 +vt 0.1563 0.5 +vt 0.125 0.5 +vt 0.125 0.5313 +vt 0.1563 0.5313 +vt 0.1563 0.5 +vt 0.125 0.5 +vt 0.125 0.5313 +vt 0.1563 0.5313 +vt 0.1563 0.5 +vt 0.125 0.5 +vt 0.125 0.5313 +vt 0.1563 0.5313 +vt 0.1563 0.5 +vt 0.125 0.5 +vt 0.1875 0.625 +vt 0.1875 0.5938 +vt 0.1563 0.5938 +vt 0.1563 0.5313 +vt 0.1875 0.5313 +vt 0.1875 0.5 +vt 0.1875 0.5938 +vt 0.1563 0.5938 +vt 0.1563 0.625 +vt 0.0313 0.5625 +vt 0.0625 0.5625 +vt 0.0313 0.5313 +vn 0.82 0 -0.57 +vn 0 1 0 +vn 0 1 0 +vn -0.57 0 -0.82 +vn -0.82 0 0.57 +vn 0 1 0 +vn 0 1 0 +vn 0.57 0 0.82 +vn -0.57 0 -0.82 +vn 0.57 0 0.82 +vn -0.82 0 0.57 +vn 0.82 0 -0.57 +vn 0.82 0 -0.57 +vn -0.82 0 0.57 +vn 0 1 0 +vn -0.57 0 -0.82 +vn 0.57 0 0.82 +vn 0 1 0 +vn 0 -1 0 +vn -0.57 0 -0.82 +vn 0.57 0 0.82 +vn -0.58 0.71 0.41 +vn 0.82 0 -0.57 +vn -0.82 0 0.57 +vn -0.57 0 -0.82 +vn 0.57 0 0.82 +vn -0.58 -0.71 0.41 +vn 0 1 0 +vn 0 -1 0 +vn -0.57 0 -0.82 +vn 0.57 0 0.82 +vn -0.57 0 -0.82 +vn -0.57 0 -0.82 +vn 0.57 0 0.82 +vn 0.57 0 0.82 +usemtl data_input_machine +f 645/1613/404 646/1614/404 648/1615/404 647/1616/404 +f 650/1617/405 646/1618/405 645/1619/405 649/1620/405 +f 654/1621/406 650/1622/406 651/1623/406 653/1624/406 +f 653/1625/407 651/1626/407 652/1627/407 655/1628/407 +f 658/1629/408 657/1630/408 659/1631/408 660/1632/408 +f 658/1633/409 654/1634/409 656/1635/409 657/1636/409 +f 662/1637/410 661/1638/410 649/1639/410 656/1640/410 +f 660/1641/411 648/1642/411 646/1643/411 658/1644/411 +f 657/1645/412 645/1646/412 647/1647/412 659/1648/412 +f 661/1649/413 662/1650/413 664/1651/413 663/1652/413 +f 663/1653/414 652/1654/414 651/1655/414 661/1656/414 +f 664/1657/415 662/1658/415 653/1659/415 655/1660/415 +f 647/1661/416 648/1662/416 666/1663/416 665/1664/416 +f 660/1665/417 659/1666/417 667/1667/417 668/1668/417 +f 660/1669/418 648/1670/418 647/1671/418 659/1672/418 +f 659/1673/419 647/1674/419 665/1675/419 667/1676/419 +f 648/1677/420 660/1678/420 668/1679/420 666/1680/420 +f 674/1681/421 670/1682/421 669/1683/421 673/1684/421 +f 675/1685/422 671/1686/422 672/1687/422 676/1688/422 +f 673/1689/423 669/1690/423 671/1691/423 675/1692/423 +f 670/1693/424 674/1694/424 676/1695/424 672/1696/424 +f 678/1697/425 674/1698/425 673/1699/425 677/1700/425 +f 675/1701/426 676/1702/426 680/1703/426 679/1704/426 +f 678/1705/427 677/1706/427 681/1707/427 682/1708/427 +f 677/1709/428 675/1710/428 679/1711/428 681/1712/428 +f 676/1713/429 678/1714/429 682/1715/429 680/1716/429 +f 681/1717/430 683/1718/430 684/1719/430 682/1720/430 +f 680/1721/431 686/1722/431 685/1723/431 679/1724/431 +f 683/1725/432 687/1726/432 688/1727/432 684/1728/432 +f 679/1729/433 685/1730/433 687/1731/433 683/1732/433 +f 686/1733/434 680/1734/434 684/1735/434 688/1736/434 +f 673/1736/435 675/1737/435 677/1738/435 673/1739/435 +f 681/1739/436 679/1740/436 683/1741/436 681/1742/436 +f 678/1742/437 676/1743/437 674/1744/437 678/1745/437 +f 680/1745/438 682/1746/438 684/1747/438 680/1748/438 +o mb_pen +v 0.3028 0.0625 0.5674 +v 0.3163 0.0625 0.6285 +v 0.3028 0 0.5674 +v 0.3163 0 0.6285 +v 0.0587 0.0625 0.6215 +v 0.0722 0.0625 0.6826 +v 0.0587 0 0.6215 +v 0.0722 0 0.6826 +vt 0.25 0.5625 +vt 0.2813 0.5625 +vt 0.2813 0.5313 +vt 0.25 0.5313 +vt 0.25 0.5625 +vt 0.2813 0.5625 +vt 0.2813 0.5313 +vt 0.25 0.5313 +vt 0.1875 0.5625 +vt 0.3125 0.5625 +vt 0.3125 0.5313 +vt 0.1875 0.5313 +vt 0.1875 0.5625 +vt 0.3125 0.5625 +vt 0.3125 0.5313 +vt 0.1875 0.5313 +vt 0.1875 0.5625 +vt 0.3125 0.5625 +vt 0.3125 0.5313 +vt 0.1875 0.5313 +vt 0.1875 0.5625 +vt 0.3125 0.5625 +vt 0.3125 0.5313 +vt 0.1875 0.5313 +vn 0.98 0 -0.22 +vn -0.98 0 0.22 +vn 0 1 0 +vn 0 -1 0 +vn -0.22 0 -0.98 +vn 0.22 0 0.98 +usemtl data_input_machine +f 689/1749/439 690/1750/439 692/1751/439 691/1752/439 +f 694/1753/440 693/1754/440 695/1755/440 696/1756/440 +f 694/1757/441 690/1758/441 689/1759/441 693/1760/441 +f 695/1761/442 691/1762/442 692/1763/442 696/1764/442 +f 693/1765/443 689/1766/443 691/1767/443 695/1768/443 +f 690/1769/444 694/1770/444 696/1771/444 692/1772/444 +o mb_penholder +v 0.4531 0.1875 0.6259 +v 0.5249 0.1875 0.7991 +v 0.4531 0 0.6259 +v 0.5249 0 0.7991 +v 0.2799 0.1875 0.6976 +v 0.3517 0.1875 0.8708 +v 0.2799 0 0.6976 +v 0.3517 0 0.8708 +vt 0.2813 0.5 +vt 0.375 0.5 +vt 0.375 0.4063 +vt 0.2813 0.4063 +vt 0.2813 0.5 +vt 0.375 0.5 +vt 0.375 0.4063 +vt 0.2813 0.4063 +vt 0.1875 0.5 +vt 0.2813 0.5 +vt 0.2813 0.4063 +vt 0.1875 0.4063 +vt 0.2813 0.5 +vt 0.375 0.5 +vt 0.375 0.4063 +vt 0.2813 0.4063 +vt 0.2813 0.5 +vt 0.375 0.5 +vt 0.375 0.4063 +vt 0.2813 0.4063 +vt 0.0938 0.4062 +vt 0.0938 0.5 +vt 0.1875 0.5 +vt 0.1875 0.4062 +vn 0.92 0 -0.38 +vn -0.92 0 0.38 +vn 0 1 0 +vn -0.38 0 -0.92 +vn 0.38 0 0.92 +vn 0 -1 0 +usemtl data_input_machine +f 697/1773/445 698/1774/445 700/1775/445 699/1776/445 +f 702/1777/446 701/1778/446 703/1779/446 704/1780/446 +f 702/1781/447 698/1782/447 697/1783/447 701/1784/447 +f 701/1785/448 697/1786/448 699/1787/448 703/1788/448 +f 698/1789/449 702/1790/449 704/1791/449 700/1792/449 +f 704/1793/450 703/1794/450 699/1795/450 700/1796/450 +o mb_holder_pens +v 0.4172 0.0937 0.7192 +v 0.4349 0.1119 0.7763 +v 0.3586 0.0863 0.7397 +v 0.3763 0.1045 0.7968 +v 0.3663 0.3309 0.6591 +v 0.384 0.3492 0.7162 +v 0.3077 0.3235 0.6797 +v 0.3254 0.3418 0.7368 +v 0.4543 0.1004 0.7369 +v 0.4816 0.0976 0.793 +v 0.3984 0.0929 0.7638 +v 0.4257 0.0902 0.8199 +v 0.4324 0.3484 0.7596 +v 0.4597 0.3456 0.8157 +v 0.3764 0.3409 0.7865 +v 0.4038 0.3382 0.8426 +vt 0.2813 0.5938 +vt 0.3125 0.5938 +vt 0.3125 0.5625 +vt 0.2813 0.5625 +vt 0.1875 0.5938 +vt 0.2188 0.5938 +vt 0.2188 0.5625 +vt 0.1875 0.5625 +vt 0.1875 0.5938 +vt 0.3125 0.5938 +vt 0.3125 0.5625 +vt 0.1875 0.5625 +vt 0.1875 0.5938 +vt 0.3125 0.5938 +vt 0.3125 0.5625 +vt 0.1875 0.5625 +vt 0.1875 0.5938 +vt 0.3125 0.5938 +vt 0.3125 0.5625 +vt 0.1875 0.5625 +vt 0.3125 0.5938 +vt 0.1875 0.5938 +vt 0.1875 0.5625 +vt 0.3125 0.5625 +vt 0.2813 0.625 +vt 0.3125 0.625 +vt 0.3125 0.5938 +vt 0.2813 0.5938 +vt 0.1875 0.625 +vt 0.2188 0.625 +vt 0.2188 0.5938 +vt 0.1875 0.5938 +vt 0.1875 0.625 +vt 0.3125 0.625 +vt 0.3125 0.5938 +vt 0.1875 0.5938 +vt 0.1875 0.625 +vt 0.3125 0.625 +vt 0.3125 0.5938 +vt 0.1875 0.5938 +vt 0.1875 0.625 +vt 0.3125 0.625 +vt 0.3125 0.5938 +vt 0.1875 0.5938 +vt 0.3125 0.625 +vt 0.1875 0.625 +vt 0.1875 0.5938 +vt 0.3125 0.5938 +vn 0.2 -0.95 0.24 +vn -0.2 0.95 -0.24 +vn 0.94 0.12 -0.33 +vn -0.94 -0.12 0.33 +vn -0.28 -0.29 -0.91 +vn 0.28 0.29 0.91 +vn 0.09 -0.99 -0.09 +vn -0.09 0.99 0.09 +vn 0.9 0.12 -0.43 +vn -0.9 -0.12 0.43 +vn -0.44 0.04 -0.9 +vn 0.44 -0.04 0.9 +usemtl data_input_machine +f 705/1797/451 706/1798/451 708/1799/451 707/1800/451 +f 710/1801/452 709/1802/452 711/1803/452 712/1804/452 +f 710/1805/453 706/1806/453 705/1807/453 709/1808/453 +f 711/1809/454 707/1810/454 708/1811/454 712/1812/454 +f 709/1813/455 705/1814/455 707/1815/455 711/1816/455 +f 706/1817/456 710/1818/456 712/1819/456 708/1820/456 +f 713/1821/457 714/1822/457 716/1823/457 715/1824/457 +f 718/1825/458 717/1826/458 719/1827/458 720/1828/458 +f 718/1829/459 714/1830/459 713/1831/459 717/1832/459 +f 719/1833/460 715/1834/460 716/1835/460 720/1836/460 +f 717/1837/461 713/1838/461 715/1839/461 719/1840/461 +f 714/1841/462 718/1842/462 720/1843/462 716/1844/462 +o mb_book1 +v 0.7951 0.125 0.0505 +v 0.9076 0.125 0.5376 +v 0.7951 0 0.0505 +v 0.9076 0 0.5376 +v 0.4297 0.125 0.1348 +v 0.5422 0.125 0.622 +v 0.4297 0 0.1348 +v 0.5422 0 0.622 +vt 0.8125 0.75 +vt 0.8125 1 +vt 0.875 1 +vt 0.875 0.75 +vt 0.625 0.5 +vt 0.625 0.75 +vt 0.6875 0.75 +vt 0.6875 0.5 +vt 0.4375 0.75 +vt 0.625 0.75 +vt 0.625 0.5 +vt 0.4375 0.5 +vt 0.6875 0.75 +vt 0.875 0.75 +vt 0.875 0.5 +vt 0.6875 0.5 +vt 0.3125 0.5 +vt 0.3125 0.6875 +vt 0.375 0.6875 +vt 0.375 0.5 +vt 0.3125 0.6875 +vt 0.3125 0.5 +vt 0.375 0.5 +vt 0.375 0.6875 +vn 0.97 0 -0.22 +vn -0.97 0 0.22 +vn 0 1 0 +vn 0 -1 0 +vn -0.22 0 -0.97 +vn 0.22 0 0.97 +usemtl data_input_machine +f 721/1845/463 722/1846/463 724/1847/463 723/1848/463 +f 726/1849/464 725/1850/464 727/1851/464 728/1852/464 +f 726/1853/465 722/1854/465 721/1855/465 725/1856/465 +f 727/1857/466 723/1858/466 724/1859/466 728/1860/466 +f 725/1861/467 721/1862/467 723/1863/467 727/1864/467 +f 722/1865/468 726/1866/468 728/1867/468 724/1868/468 +o mb_book2 +v 0.9041 0.25 0.1307 +v 0.8001 0.25 0.6198 +v 0.9041 0.125 0.1307 +v 0.8001 0.125 0.6198 +v 0.5373 0.25 0.0527 +v 0.4333 0.25 0.5418 +v 0.5373 0.125 0.0527 +v 0.4333 0.125 0.5418 +vt 0.8125 0.75 +vt 0.8125 1 +vt 0.875 1 +vt 0.875 0.75 +vt 0.375 0.75 +vt 0.375 1 +vt 0.4375 1 +vt 0.4375 0.75 +vt 0.4375 1 +vt 0.625 1 +vt 0.625 0.75 +vt 0.4375 0.75 +vt 0.2813 0.375 +vt 0.4688 0.375 +vt 0.4688 0.125 +vt 0.2813 0.125 +vt 0.3125 0.75 +vt 0.3125 0.9375 +vt 0.375 0.9375 +vt 0.375 0.75 +vt 0.3125 0.9375 +vt 0.3125 0.75 +vt 0.375 0.75 +vt 0.375 0.9375 +vn 0.98 0 0.21 +vn -0.98 0 -0.21 +vn 0 1 0 +vn 0 -1 0 +vn 0.21 0 -0.98 +vn -0.21 0 0.98 +usemtl data_input_machine +f 729/1869/469 730/1870/469 732/1871/469 731/1872/469 +f 734/1873/470 733/1874/470 735/1875/470 736/1876/470 +f 734/1877/471 730/1878/471 729/1879/471 733/1880/471 +f 735/1881/472 731/1882/472 732/1883/472 736/1884/472 +f 733/1885/473 729/1886/473 731/1887/473 735/1888/473 +f 730/1889/474 734/1890/474 736/1891/474 732/1892/474 +o drawer +v -0.3125 -0.25 0.0625 +v -0.3125 -0.25 0 +v -0.3125 -0.375 0.0625 +v -0.3125 -0.375 0 +v -0.4375 -0.25 0.0625 +v -0.4375 -0.25 0 +v -0.4375 -0.375 0.0625 +v -0.4375 -0.375 0 +v 0 -0.1875 0.125 +v 0 -0.1875 0.0625 +v 0 -0.4375 0.125 +v 0 -0.4375 0.0625 +v -0.75 -0.1875 0.125 +v -0.75 -0.1875 0.0625 +v -0.75 -0.4375 0.125 +v -0.75 -0.4375 0.0625 +v -0.0312 -0.3437 0.625 +v -0.0312 -0.3437 0.125 +v -0.0312 -0.4062 0.625 +v -0.0312 -0.4062 0.125 +v -0.7187 -0.3437 0.625 +v -0.7187 -0.3437 0.125 +v -0.7187 -0.4062 0.625 +v -0.7187 -0.4062 0.125 +v -0.6562 -0.2187 0.625 +v -0.6562 -0.2187 0.125 +v -0.6562 -0.3437 0.625 +v -0.6562 -0.3437 0.125 +v -0.7187 -0.2187 0.625 +v -0.7187 -0.2187 0.125 +v -0.7187 -0.3437 0.625 +v -0.7187 -0.3437 0.125 +v -0.0312 -0.2187 0.625 +v -0.0312 -0.2187 0.125 +v -0.0312 -0.3437 0.625 +v -0.0312 -0.3437 0.125 +v -0.0937 -0.2187 0.625 +v -0.0937 -0.2187 0.125 +v -0.0937 -0.3437 0.625 +v -0.0937 -0.3437 0.125 +vt 0.9844 0.2813 +vt 0.9844 0.3125 +vt 1 0.3125 +vt 1 0.2813 +vt 0.9688 0.2813 +vt 0.9688 0.3125 +vt 0.9844 0.3125 +vt 0.9844 0.2813 +vt 1 0.3125 +vt 1 0.2969 +vt 0.9688 0.2969 +vt 0.9688 0.3125 +vt 1 0.2813 +vt 1 0.2969 +vt 0.9688 0.2969 +vt 0.9688 0.2813 +vt 0.9688 0.2813 +vt 0.9688 0.3125 +vt 1 0.3125 +vt 1 0.2813 +vt 0.8125 0.3906 +vt 0.8125 0.4531 +vt 0.7969 0.4531 +vt 0.7969 0.3906 +vt 0.9844 0.3906 +vt 0.9844 0.4531 +vt 0.9688 0.4531 +vt 0.9688 0.3906 +vt 0.7813 0.25 +vt 0.7656 0.25 +vt 0.7656 0.0625 +vt 0.7813 0.0625 +vt 1 0.25 +vt 0.9844 0.25 +vt 0.9844 0.0625 +vt 1 0.0625 +vt 0.9844 0.3906 +vt 0.9844 0.4531 +vt 0.7969 0.4531 +vt 0.7969 0.3906 +vt 0.9844 0.3906 +vt 0.9844 0.4531 +vt 0.7969 0.4531 +vt 0.7969 0.3906 +vt 0.9688 0.25 +vt 0.9531 0.25 +vt 0.9531 0.125 +vt 0.9688 0.125 +vt 0.8125 0.125 +vt 0.7969 0.125 +vt 0.7969 0.25 +vt 0.8125 0.25 +vt 0.9688 0.25 +vt 0.9688 0.375 +vt 0.7969 0.375 +vt 0.7969 0.25 +vt 0.9688 0.25 +vt 0.9688 0.125 +vt 0.7969 0.125 +vt 0.7969 0.25 +vt 0.9375 0.0781 +vt 0.9375 0.0938 +vt 0.7656 0.0938 +vt 0.7656 0.0781 +vt 0.8281 0.375 +vt 0.7969 0.375 +vt 0.7969 0.25 +vt 0.8281 0.25 +vt 0.8281 0.375 +vt 0.7969 0.375 +vt 0.7969 0.25 +vt 0.8281 0.25 +vt 0.7969 0.375 +vt 0.7969 0.25 +vt 0.8125 0.25 +vt 0.8125 0.375 +vt 0.9375 0.375 +vt 0.9688 0.375 +vt 0.9688 0.25 +vt 0.9375 0.25 +vt 0.9375 0.375 +vt 0.9688 0.375 +vt 0.9688 0.25 +vt 0.9375 0.25 +vt 0.9531 0.375 +vt 0.9531 0.25 +vt 0.9375 0.25 +vt 0.9375 0.375 +vt 0.9531 0.3906 +vt 0.9531 0.3594 +vt 0.8125 0.3594 +vt 0.8125 0.3906 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 0 -1 +usemtl common_table +f 740/1893/475 738/1894/475 737/1895/475 739/1896/475 +f 743/1897/476 741/1898/476 742/1899/476 744/1900/476 +f 737/1901/477 738/1902/477 742/1903/477 741/1904/477 +f 740/1905/478 739/1906/478 743/1907/478 744/1908/478 +f 744/1909/479 742/1910/479 738/1911/479 740/1912/479 +f 748/1913/480 746/1914/480 745/1915/480 747/1916/480 +f 751/1917/481 749/1918/481 750/1919/481 752/1920/481 +f 745/1921/482 746/1922/482 750/1923/482 749/1924/482 +f 748/1925/483 747/1926/483 751/1927/483 752/1928/483 +f 747/1929/484 745/1930/484 749/1931/484 751/1932/484 +f 752/1933/485 750/1934/485 746/1935/485 748/1936/485 +f 756/1937/486 754/1938/486 753/1939/486 755/1940/486 +f 759/1941/487 757/1942/487 758/1943/487 760/1944/487 +f 753/1945/488 754/1946/488 758/1947/488 757/1948/488 +f 756/1949/489 755/1950/489 759/1951/489 760/1952/489 +f 760/1953/490 758/1954/490 754/1955/490 756/1956/490 +f 764/1957/491 762/1958/491 761/1959/491 763/1960/491 +f 767/1961/492 765/1962/492 766/1963/492 768/1964/492 +f 761/1965/493 762/1966/493 766/1967/493 765/1968/493 +f 772/1969/494 770/1970/494 769/1971/494 771/1972/494 +f 775/1973/495 773/1974/495 774/1975/495 776/1976/495 +f 769/1977/496 770/1978/496 774/1979/496 773/1980/496 +f 773/1981/497 775/1982/497 763/1983/497 761/1984/497 +o door +v 0 2 0.9375 +v 1 2 0.9375 +v 0 1 0.9375 +v 1 1 0.9375 +v 0 2 1 +v 1 2 1 +v 0 1 1 +v 1 1 1 +vt 0.5 0.25 +vt 0.75 0.25 +vt 0.75 0 +vt 0.5 0 +vt 0.5 0.25 +vt 0.75 0.25 +vt 0.75 0 +vt 0.5 0 +vt 0.5 0.2344 +vt 0.5 0.25 +vt 0.75 0.25 +vt 0.75 0.2344 +vt 0.5 0 +vt 0.5 0.0156 +vt 0.75 0.0156 +vt 0.75 0 +vt 0.5 0.25 +vt 0.5156 0.25 +vt 0.5156 0 +vt 0.5 0 +vt 0.7344 0.25 +vt 0.75 0.25 +vt 0.75 0 +vt 0.7344 0 +vn 0 0 -1 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 +vn -1 0 0 +vn 1 0 0 +usemtl common_steel +f 777/1985/498 778/1986/498 780/1987/498 779/1988/498 +f 782/1989/499 781/1990/499 783/1991/499 784/1992/499 +f 782/1993/500 778/1994/500 777/1995/500 781/1996/500 +f 783/1997/501 779/1998/501 780/1999/501 784/2000/501 +f 781/2001/502 777/2002/502 779/2003/502 783/2004/502 +f 778/2005/503 782/2006/503 784/2007/503 780/2008/503 \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/models/block/multiblock/data_input_machine/upgrades/advanced_data.obj b/src/main/resources/assets/immersiveintelligence/models/block/multiblock/data_input_machine/upgrades/advanced_data.obj new file mode 100644 index 000000000..48bfdb2e0 --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/models/block/multiblock/data_input_machine/upgrades/advanced_data.obj @@ -0,0 +1,1052 @@ +# Made by Pabilo8 with Blockbench +# Exported with IIToolkit Plugin on 03/06/2026 +mtllib data_input_machine.mtl + +o mess_upgraded +v -0.9687 0.2476 0.4678 +v -0.9687 0.1057 0.1894 +v -0.9687 0.1919 0.4962 +v -0.0937 0.2476 0.4678 +v -0.0937 0.1057 0.1894 +v -0.0937 0.1919 0.4962 +v -0.0937 0.0501 0.2177 +v -0.2812 0.1057 0.1894 +v -0.2812 0.0501 0.2177 +v -0.0937 0.1057 0.1894 +v -0.0937 0.0501 0.2177 +v -0.9687 0.1057 0.1894 +v -0.9687 0.0774 0.1337 +v -0.9687 0.0217 0.1621 +v -0.2812 0.1057 0.1894 +v -0.2812 0.0774 0.1337 +v -0.2812 0.0501 0.2177 +v -0.2812 0.0217 0.1621 +v -0.2812 0.0774 0.1337 +v -0.2812 0.049 0.078 +v -0.2812 0.0217 0.1621 +v -0.2812 -0.0067 0.1064 +v -0.0937 0.0774 0.1337 +v -0.0937 0.049 0.078 +v -0.0937 0.0217 0.1621 +v -0.0937 -0.0067 0.1064 +v -0.2187 0.1057 0.1894 +v -0.2187 0.0774 0.1337 +v -0.2187 0.0501 0.2177 +v -0.2187 0.0217 0.1621 +v -0.1562 0.1057 0.1894 +v -0.1562 0.0774 0.1337 +v -0.1562 0.0501 0.2177 +v -0.1562 0.0217 0.1621 +v -0.0937 0.1875 1 +v -0.0937 0.1875 0.4844 +v -0.0937 0 1 +v -0.0937 0 0.1094 +v -0.9687 0.1875 1 +v -0.9687 0.1875 0.4844 +v -0.9687 0 1 +v -0.9687 0 0.1094 +v -0.1875 0.5901 0.8672 +v -0.375 0.5901 0.8672 +v -0.1875 0.5305 0.8484 +v -0.375 0.5305 0.8484 +v -0.1875 0.5713 0.9269 +v -0.1875 0.5117 0.9081 +v -0.375 0.5713 0.9269 +v -0.375 0.5117 0.9081 +v -0.25 0.5305 0.8484 +v -0.3125 0.5305 0.8484 +v -0.25 0.4113 0.8109 +v -0.3125 0.4113 0.8109 +v -0.25 0.5117 0.9081 +v -0.25 0.3925 0.8705 +v -0.3125 0.5117 0.9081 +v -0.3125 0.3925 0.8705 +v -0.4375 0.5799 0.7858 +v -0.625 0.5799 0.7858 +v -0.4375 0.5183 0.7966 +v -0.625 0.5183 0.7966 +v -0.4375 0.5907 0.8473 +v -0.4375 0.5292 0.8582 +v -0.625 0.5907 0.8473 +v -0.625 0.5292 0.8582 +v -0.5 0.5183 0.7966 +v -0.5625 0.5183 0.7966 +v -0.5 0.3952 0.8183 +v -0.5625 0.3952 0.8183 +v -0.5 0.5292 0.8582 +v -0.5 0.4061 0.8799 +v -0.5625 0.5292 0.8582 +v -0.5625 0.4061 0.8799 +v -0.1875 0.5469 0.5625 +v -0.375 0.5469 0.5625 +v -0.1875 0.4844 0.5625 +v -0.375 0.4844 0.5625 +v -0.1875 0.5469 0.625 +v -0.1875 0.4844 0.625 +v -0.375 0.5469 0.625 +v -0.375 0.4844 0.625 +v -0.25 0.4844 0.5625 +v -0.3125 0.4844 0.5625 +v -0.25 0.3594 0.5625 +v -0.3125 0.3594 0.5625 +v -0.25 0.4844 0.625 +v -0.25 0.3594 0.625 +v -0.3125 0.4844 0.625 +v -0.3125 0.3594 0.625 +v -0.7187 0.5278 0.7633 +v -0.7187 0.5441 0.8872 +v -0.8437 0.5278 0.7633 +v -0.8437 0.5441 0.8872 +v -0.7187 0.4658 0.7714 +v -0.8437 0.4658 0.7714 +v -0.8437 0.4822 0.8954 +v -0.7187 0.4822 0.8954 +v -0.6875 0.4332 0.5236 +v -0.6875 0.4903 0.9573 +v -0.875 0.4332 0.5236 +v -0.875 0.4903 0.9573 +v -0.6875 0.3712 0.5317 +v -0.875 0.3712 0.5317 +v -0.875 0.4283 0.9655 +v -0.6875 0.4283 0.9655 +v -0.7187 0.5033 0.5774 +v -0.7187 0.5196 0.7013 +v -0.8437 0.5033 0.5774 +v -0.8437 0.5196 0.7013 +v -0.7187 0.4414 0.5855 +v -0.8437 0.4414 0.5855 +v -0.8437 0.4577 0.7095 +v -0.7187 0.4577 0.7095 +v -0.125 0.4375 1 +v -0.9375 0.4375 1 +v -0.125 0.1875 1 +v -0.9375 0.1875 1 +v -0.125 0.3655 0.4962 +v -0.125 0.1875 0.4962 +v -0.9375 0.3655 0.4962 +v -0.9375 0.1875 0.4962 +v -0.5 0.5183 0.6091 +v -0.5625 0.5183 0.6091 +v -0.5 0.3952 0.6308 +v -0.5625 0.3952 0.6308 +v -0.5 0.5292 0.6707 +v -0.5 0.4061 0.6924 +v -0.5625 0.5292 0.6707 +v -0.5625 0.4061 0.6924 +v -0.4375 0.5799 0.5983 +v -0.625 0.5799 0.5983 +v -0.4375 0.5183 0.6091 +v -0.625 0.5183 0.6091 +v -0.4375 0.5907 0.6598 +v -0.4375 0.5292 0.6707 +v -0.625 0.5907 0.6598 +v -0.625 0.5292 0.6707 +v -0.5 0.4375 1 +v -0.5 0.3655 0.4962 +v -0.5 0.1875 0.4962 +v -0.5 0.3655 0.4962 +v -0.5 0.4015 0.7481 +v -0.9375 0.4015 0.7481 +v -0.5 0.4015 0.7481 +v -0.125 0.4015 0.7481 +v 0.6875 -0.1875 0.0625 +v 0.6875 -0.1875 1 +v 0.6875 -1 0.0625 +v 0.6875 -1 1 +v 0.0625 -0.1875 0.0625 +v 0.0625 -0.1875 1 +v 0.0625 -1 0.0625 +v 0.0625 -1 1 +v 0.375 -1 0.0625 +v 0.375 -1 1 +v 0.375 -0.1875 1 +v 0.375 -0.1875 0.0625 +v 0.375 -0.625 0.0625 +v 0.0625 -0.625 0.0625 +v 0.6875 -0.625 0.0625 +v 0.375 -0.625 0.0625 +v 0.6875 -0.625 1 +v 0.6875 -0.625 0.0625 +v 0.0625 -0.625 1 +v 0.0625 -0.625 0.0625 +v 0.375 -0.625 1 +v 0.6875 -0.625 1 +v 0.0625 -0.625 1 +v 0.375 -0.625 1 +v 0.6875 -0.625 0.5625 +v 0.6875 -0.1875 0.5625 +v 0.6875 -1 0.5625 +v 0.6875 -0.625 0.5625 +v 0.0625 -1 0.5625 +v 0.0625 -0.625 0.5625 +v 0.0625 -0.1875 0.5625 +v 0.0625 -0.625 0.5625 +v 0.0625 -1 0.5625 +v 0.375 -1 0.5625 +v 0.6875 -1 0.5625 +v 0.375 -1 0.5625 +v -1.0959 0.6161 0.5922 +v -1.0959 0.6161 0.9672 +v -0.9665 0.1331 0.5922 +v -0.9665 0.1331 0.9672 +v -1.2167 0.5837 0.5922 +v -1.2167 0.5837 0.9672 +v -1.0873 0.1008 0.5922 +v -1.0873 0.1008 0.9672 +v -1.1439 0.3183 0.6297 +v -1.1439 0.3183 0.7484 +v -1.0792 0.0768 0.6297 +v -1.0792 0.0768 0.7484 +v -1.2043 0.3021 0.6297 +v -1.2043 0.3021 0.7484 +v -1.1396 0.0607 0.6297 +v -1.1396 0.0607 0.7484 +v -0.9687 0.125 0.625 +v -0.9687 0.125 0.75 +v -0.9687 0.0625 0.625 +v -0.9687 0.0625 0.75 +v -1.1375 0.125 0.625 +v -1.1375 0.125 0.75 +v -1.1375 0.0625 0.625 +v -1.1375 0.0625 0.75 +v -1.1439 0.3183 0.8172 +v -1.1439 0.3183 0.9359 +v -1.0792 0.0768 0.8172 +v -1.0792 0.0768 0.9359 +v -1.2043 0.3021 0.8172 +v -1.2043 0.3021 0.9359 +v -1.1396 0.0607 0.8172 +v -1.1396 0.0607 0.9359 +v -0.9687 0.125 0.8125 +v -0.9687 0.125 0.9375 +v -0.9687 0.0625 0.8125 +v -0.9687 0.0625 0.9375 +v -1.1375 0.125 0.8125 +v -1.1375 0.125 0.9375 +v -1.1375 0.0625 0.8125 +v -1.1375 0.0625 0.9375 +vt 1 0.6406 +vt 0.7813 0.6406 +vt 0.7813 0.7188 +vt 1 0.7188 +vt 1 0.7188 +vt 0.7813 0.7188 +vt 0.7813 0.7031 +vt 1 0.7031 +vt 0.9844 0.6406 +vt 0.9844 0.7188 +vt 1 0.7188 +vt 1 0.6406 +vt 0.9531 0.6563 +vt 1 0.6563 +vt 1 0.6406 +vt 0.9531 0.6406 +vt 0.9375 0.6406 +vt 0.9531 0.6406 +vt 0.9531 0.625 +vt 0.9375 0.625 +vt 0.9531 0.6406 +vt 0.7813 0.6406 +vt 0.7813 0.625 +vt 0.9531 0.625 +vt 0.7813 0.6406 +vt 0.9531 0.6406 +vt 0.9531 0.625 +vt 0.7813 0.625 +vt 0.9531 0.625 +vt 0.9688 0.625 +vt 0.9688 0.6094 +vt 0.9531 0.6094 +vt 0.9531 0.625 +vt 1 0.625 +vt 1 0.6094 +vt 0.9531 0.6094 +vt 0.9531 0.625 +vt 1 0.625 +vt 1 0.6094 +vt 0.9531 0.6094 +vt 0.9531 0.625 +vt 1 0.625 +vt 1 0.6094 +vt 0.9531 0.6094 +vt 0.9844 0.6094 +vt 0.9844 0.625 +vt 1 0.625 +vt 1 0.6094 +vt 0.9688 0.6406 +vt 0.9844 0.6406 +vt 0.9844 0.625 +vt 0.9688 0.625 +vt 0.9688 0.6406 +vt 0.9844 0.6406 +vt 0.9844 0.625 +vt 0.9688 0.625 +vt 0.9688 0.6406 +vt 0.9844 0.6406 +vt 0.9844 0.625 +vt 0.9688 0.625 +vt 0.7969 0.7188 +vt 0.7813 0.7188 +vt 0.7813 0.625 +vt 0.7969 0.625 +vt 0.4375 0.625 +vt 0.5313 0.8125 +vt 0.5313 1 +vt 0.4375 1 +vt 0.4375 1 +vt 0.5313 1 +vt 0.5313 0.8125 +vt 0.4375 0.625 +vt 0.4375 1 +vt 0.4375 0.8125 +vt 0 0.8125 +vt 0 1 +vt 0 0.5 +vt 0 0.5938 +vt 0.4375 0.5938 +vt 0.4375 0.5 +vt 0 0.5938 +vt 0 0.8125 +vt 0.4375 0.8125 +vt 0.4375 0.5938 +vt 0 0.8828 +vt 0.0938 0.8828 +vt 0.0938 0.8672 +vt 0 0.8672 +vt 0.2031 0.2031 +vt 0.25 0.2031 +vt 0.25 0.1875 +vt 0.2031 0.1875 +vt 0.2031 0.3281 +vt 0.25 0.3281 +vt 0.25 0.3125 +vt 0.2031 0.3125 +vt 0.25 0.3125 +vt 0.25 0.2031 +vt 0.2031 0.2031 +vt 0.2031 0.3125 +vt 0.2188 0.3125 +vt 0.2187 0.2031 +vt 0.2031 0.2031 +vt 0.2031 0.3125 +vt 0.25 0.3125 +vt 0.25 0.2031 +vt 0.2344 0.2031 +vt 0.2344 0.3125 +vt 0.7813 0.9219 +vt 0.8125 0.9219 +vt 0.8125 0.9063 +vt 0.7813 0.9063 +vt 0.8125 0.9375 +vt 0.7813 0.9375 +vt 0.7813 0.9219 +vt 0.8125 0.9219 +vt 0.8125 0.9375 +vt 0.8125 0.9063 +vt 0.7813 0.9063 +vt 0.7813 0.9375 +vt 0.7969 0.9375 +vt 0.7969 0.9062 +vt 0.7813 0.9062 +vt 0.7813 0.9375 +vt 0.8125 0.9219 +vt 0.7813 0.9219 +vt 0.7813 0.9062 +vt 0.8125 0.9062 +vt 0.75 0.9219 +vt 0.7813 0.9219 +vt 0.7813 0.9063 +vt 0.75 0.9063 +vt 0.7813 0.9375 +vt 0.75 0.9375 +vt 0.75 0.9219 +vt 0.7813 0.9219 +vt 0.7813 0.9375 +vt 0.7813 0.9063 +vt 0.75 0.9063 +vt 0.75 0.9375 +vt 0.7656 0.9375 +vt 0.7656 0.9062 +vt 0.75 0.9062 +vt 0.75 0.9375 +vt 0.7813 0.9219 +vt 0.75 0.9219 +vt 0.75 0.9063 +vt 0.7813 0.9062 +vt 0.7813 0.3906 +vt 0.7969 0.3906 +vt 0.7969 0.375 +vt 0.7813 0.375 +vt 0.7813 0.3906 +vt 0.7969 0.3906 +vt 0.7969 0.375 +vt 0.7813 0.375 +vt 0.7813 0.3906 +vt 0.8281 0.3906 +vt 0.8281 0.375 +vt 0.7813 0.375 +vt 0.7813 0.3906 +vt 0.8281 0.3906 +vt 0.8281 0.375 +vt 0.7813 0.375 +vt 0.7813 0.3906 +vt 0.8281 0.3906 +vt 0.8281 0.375 +vt 0.7813 0.375 +vt 0.7813 0.3906 +vt 0.8281 0.3906 +vt 0.8281 0.375 +vt 0.7813 0.375 +vt 0.8281 0.3906 +vt 0.8438 0.3906 +vt 0.8438 0.3594 +vt 0.8281 0.3594 +vt 0.8281 0.3906 +vt 0.8438 0.3906 +vt 0.8438 0.3594 +vt 0.8281 0.3594 +vt 0.8281 0.3906 +vt 0.8438 0.3906 +vt 0.8438 0.3594 +vt 0.8281 0.3594 +vt 0.8281 0.3906 +vt 0.8438 0.3906 +vt 0.8438 0.3594 +vt 0.8281 0.3594 +vt 0.7813 0.375 +vt 0.7969 0.375 +vt 0.7969 0.3594 +vt 0.7813 0.3594 +vt 0.7969 0.375 +vt 0.7969 0.3594 +vt 0.7813 0.3594 +vt 0.7813 0.375 +vt 0.7813 0.375 +vt 0.8281 0.375 +vt 0.8281 0.3594 +vt 0.7813 0.3594 +vt 0.8281 0.3594 +vt 0.7813 0.3594 +vt 0.7813 0.375 +vt 0.8281 0.375 +vt 0.7813 0.375 +vt 0.8281 0.375 +vt 0.8281 0.3594 +vt 0.7813 0.3594 +vt 0.7813 0.375 +vt 0.8281 0.375 +vt 0.8281 0.3594 +vt 0.7813 0.3594 +vt 0.8281 0.3906 +vt 0.8438 0.3906 +vt 0.8438 0.3594 +vt 0.8281 0.3594 +vt 0.8281 0.3125 +vt 0.8281 0.3281 +vt 0.7969 0.3281 +vt 0.7969 0.3125 +vt 0.8281 0.3906 +vt 0.8438 0.3906 +vt 0.8438 0.3594 +vt 0.8281 0.3594 +vt 0.8281 0.3906 +vt 0.8438 0.3906 +vt 0.8438 0.3594 +vt 0.8281 0.3594 +vt 0.7969 0.3594 +vt 0.7969 0.3438 +vt 0.7813 0.3438 +vt 0.7813 0.3594 +vt 0.7813 0.3594 +vt 0.7969 0.3594 +vt 0.7969 0.3437 +vt 0.7813 0.3437 +vt 0.8281 0.3438 +vt 0.7813 0.3438 +vt 0.7813 0.3594 +vt 0.8281 0.3594 +vt 0.7813 0.375 +vt 0.8281 0.375 +vt 0.8281 0.3594 +vt 0.7813 0.3594 +vt 0.7813 0.3594 +vt 0.8281 0.3594 +vt 0.8281 0.3438 +vt 0.7813 0.3438 +vt 0.7813 0.3594 +vt 0.8281 0.3594 +vt 0.8281 0.3438 +vt 0.7813 0.3438 +vt 0.8281 0.3125 +vt 0.8281 0.3281 +vt 0.7969 0.3281 +vt 0.7969 0.3125 +vt 0.8281 0.3906 +vt 0.8437 0.3906 +vt 0.8437 0.3594 +vt 0.8281 0.3594 +vt 0.8281 0.3906 +vt 0.8438 0.3906 +vt 0.8438 0.3594 +vt 0.8281 0.3594 +vt 0.8281 0.3906 +vt 0.8438 0.3906 +vt 0.8438 0.3594 +vt 0.8281 0.3594 +vt 0.7969 0.375 +vt 0.7969 0.4195 +vt 0.9219 0.4375 +vt 0.9219 0.375 +vt 0.9844 0.4195 +vt 0.9844 0.375 +vt 0.8594 0.375 +vt 0.8594 0.4375 +vt 0.7813 0.3437 +vt 0.7969 0.3438 +vt 0.7969 0.3281 +vt 0.7813 0.3281 +vt 0.7969 0.3438 +vt 0.7969 0.3281 +vt 0.7813 0.3281 +vt 0.7813 0.3438 +vt 0.7813 0.3438 +vt 0.8281 0.3438 +vt 0.8281 0.3281 +vt 0.7813 0.3281 +vt 0.8281 0.3281 +vt 0.7813 0.3281 +vt 0.7813 0.3438 +vt 0.8281 0.3438 +vt 0.7813 0.3438 +vt 0.8281 0.3438 +vt 0.8281 0.3281 +vt 0.7813 0.3281 +vt 0.7813 0.3438 +vt 0.8281 0.3438 +vt 0.8281 0.3281 +vt 0.7813 0.3281 +vt 0.8281 0.3906 +vt 0.8438 0.3906 +vt 0.8438 0.3594 +vt 0.8281 0.3594 +vt 0.8438 0.3906 +vt 0.8281 0.3906 +vt 0.8281 0.3594 +vt 0.8437 0.3594 +vt 0.8281 0.3906 +vt 0.8438 0.3906 +vt 0.8438 0.3594 +vt 0.8281 0.3594 +vt 0.8281 0.3906 +vt 0.8438 0.3906 +vt 0.8438 0.3594 +vt 0.8281 0.3594 +vt 0.2031 1 +vt 0.2031 0.8741 +vt 0 0.8741 +vt 0 1 +vt 1 0.25 +vt 1 0.2031 +vt 0.9063 0.2031 +vt 0.9063 0.25 +vt 0.875 0.2031 +vt 0.7656 0.2031 +vt 0.7656 0.25 +vt 0.875 0.25 +vt 0.7656 0.25 +vt 0.875 0.25 +vt 0.875 0.1875 +vt 0.7656 0.1875 +vt 0.875 0.125 +vt 0.875 0.0625 +vt 0.7656 0.0625 +vt 0.7656 0.125 +vt 0.9063 0.25 +vt 1 0.25 +vt 1 0.1875 +vt 0.9063 0.1875 +vt 1 0.0625 +vt 0.9063 0.0625 +vt 0.9063 0.125 +vt 1 0.125 +vt 0.6563 0.1875 +vt 0.6563 0 +vt 0.5 0 +vt 0.5 0.1875 +vt 0.5 0.5 +vt 0.6563 0.5 +vt 0.6563 0.2813 +vt 0.5 0.2813 +vt 0.8438 0.5 +vt 1 0.5 +vt 1 0.2813 +vt 0.8438 0.2813 +vt 1 0.1875 +vt 1 0 +vt 0.8438 0 +vt 0.8438 0.1875 +vt 0.6563 0.1875 +vt 0.6563 0 +vt 0.5 0 +vt 0.5 0.1875 +vt 0.5 0.5 +vt 0.6563 0.5 +vt 0.6563 0.2813 +vt 0.5 0.2813 +vt 0.8438 0.5 +vt 1 0.5 +vt 1 0.2813 +vt 0.8438 0.2813 +vt 1 0.1875 +vt 1 0 +vt 0.8438 0 +vt 0.8438 0.1875 +vt 1 0.5 +vt 1 0.2813 +vt 0.7813 0.2813 +vt 0.7813 0.5 +vt 0.75 0.2813 +vt 0.5 0.2813 +vt 0.5 0.5 +vt 0.75 0.5 +vt 1 0.1875 +vt 1 0 +vt 0.7813 0 +vt 0.7813 0.1875 +vt 0.75 0 +vt 0.5 0 +vt 0.5 0.1875 +vt 0.75 0.1875 +vt 0.7188 0 +vt 0.5 0 +vt 0.5 0.1875 +vt 0.7188 0.1875 +vt 1 0.1875 +vt 1 0 +vt 0.75 0 +vt 0.75 0.1875 +vt 0.5 0.2813 +vt 0.5 0.5 +vt 0.7188 0.5 +vt 0.7188 0.2813 +vt 0.75 0.5 +vt 1 0.5 +vt 1 0.2813 +vt 0.75 0.2813 +vt 0.5 0.3438 +vt 0.5 0.5 +vt 0.7188 0.5 +vt 0.7188 0.3438 +vt 0.75 0.5 +vt 1 0.5 +vt 1 0.3438 +vt 0.75 0.3438 +vt 1 0.1563 +vt 1 0 +vt 0.75 0 +vt 0.75 0.1563 +vt 0.7188 0 +vt 0.5 0 +vt 0.5 0.1563 +vt 0.7188 0.1563 +vt 0.4063 0.75 +vt 0.625 0.75 +vt 0.625 0.5 +vt 0.4063 0.5 +vt 0.625 0.75 +vt 0.4063 0.75 +vt 0.4063 0.5 +vt 0.625 0.5 +vt 0.375 0.7188 +vt 0.3125 0.7188 +vt 0.3125 0.5 +vt 0.375 0.5 +vt 0.375 0.5 +vt 0.3125 0.5 +vt 0.3125 0.7188 +vt 0.375 0.7188 +vt 0.4063 0.75 +vt 0.4688 0.75 +vt 0.4688 0.5 +vt 0.4063 0.5 +vt 0.3125 0.75 +vt 0.375 0.75 +vt 0.375 0.5313 +vt 0.3125 0.5313 +vt 0.0313 0.2969 +vt 0 0.2969 +vt 0 0.2344 +vt 0.0313 0.2344 +vt 0 0.2969 +vt 0.0313 0.2969 +vt 0.0313 0.2344 +vt 0 0.2344 +vt 0 0.2969 +vt 0 0.2813 +vt 0.0313 0.2813 +vt 0.0313 0.2969 +vt 0.0313 0.25 +vt 0.0313 0.2344 +vt 0 0.2344 +vt 0 0.25 +vt 0.0156 0.2969 +vt 0.0313 0.2969 +vt 0.0313 0.2344 +vt 0.0156 0.2344 +vt 0 0.2969 +vt 0.0156 0.2969 +vt 0.0156 0.2344 +vt 0 0.2344 +vt 0 0.2813 +vt 0.0313 0.2813 +vt 0.0313 0.2656 +vt 0 0.2656 +vt 0 0.2813 +vt 0.0313 0.2813 +vt 0.0313 0.2656 +vt 0 0.2656 +vt 0.0313 0.3234 +vt 0.0313 0.2813 +vt 0 0.2813 +vt 0 0.3234 +vt 0.0313 0.3234 +vt 0.0313 0.2813 +vt 0 0.2813 +vt 0 0.3234 +vt 0.0156 0.2609 +vt 0.0156 0.2188 +vt 0 0.2188 +vt 0 0.2609 +vt 0.0156 0.2609 +vt 0.0156 0.2188 +vt 0 0.2188 +vt 0 0.2609 +vt 0.0313 0.2969 +vt 0 0.2969 +vt 0 0.2344 +vt 0.0313 0.2344 +vt 0 0.2969 +vt 0.0313 0.2969 +vt 0.0313 0.2344 +vt 0 0.2344 +vt 0 0.2969 +vt 0 0.2813 +vt 0.0313 0.2813 +vt 0.0313 0.2969 +vt 0.0313 0.25 +vt 0.0313 0.2344 +vt 0 0.2344 +vt 0 0.25 +vt 0.0156 0.2969 +vt 0.0313 0.2969 +vt 0.0313 0.2344 +vt 0.0156 0.2344 +vt 0 0.2969 +vt 0.0156 0.2969 +vt 0.0156 0.2344 +vt 0 0.2344 +vt 0 0.2813 +vt 0.0313 0.2813 +vt 0.0313 0.2656 +vt 0 0.2656 +vt 0 0.2813 +vt 0.0313 0.2813 +vt 0.0313 0.2656 +vt 0 0.2656 +vt 0.0313 0.3234 +vt 0.0313 0.2813 +vt 0 0.2813 +vt 0 0.3234 +vt 0.0313 0.3234 +vt 0.0313 0.2813 +vt 0 0.2813 +vt 0 0.3234 +vt 0.0156 0.2609 +vt 0.0156 0.2188 +vt 0 0.2188 +vt 0 0.2609 +vt 0.0156 0.2609 +vt 0.0156 0.2188 +vt 0 0.2188 +vt 0 0.2609 +vn 0 0.89 -0.45 +vn 0 0.45 0.89 +vn 1 0 0 +vn 0 -0.45 -0.89 +vn 1 0 0 +vn 0 0.89 -0.45 +vn 0 -0.45 -0.89 +vn -1 0 0 +vn 0 0.89 -0.45 +vn 0 0.45 0.89 +vn 0 -0.45 -0.89 +vn 1 0 0 +vn -1 0 0 +vn 1 0 0 +vn 0 0.89 -0.45 +vn -1 0 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0.89 -0.45 +vn 0 0 1 +vn 0 -0.13 -0.99 +vn 0 0.13 0.99 +vn 0 0.99 -0.13 +vn -1 0 0 +vn 1 0 0 +vn 0 -0.13 -0.99 +vn 0 0.13 0.99 +vn 0 0.99 -0.13 +vn -1 0 0 +vn 1 0 0 +vn 0 -0.13 -0.99 +vn 0 0.13 0.99 +vn 0 0.99 -0.13 +vn -1 0 0 +vn 1 0 0 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn 1 0 0 +vn -1 0 0 +vn 0 0 -1 +vn 0 0 1 +vn 1 0 0 +vn -1 0 0 +vn 0 0.98 -0.17 +vn 0 -0.98 0.17 +vn 0 -0.17 -0.98 +vn 0 0.17 0.98 +vn 1 0 0 +vn -1 0 0 +vn 0 -0.17 -0.98 +vn 0 0.17 0.98 +vn 1 0 0 +vn -1 0 0 +vn 0 0.95 0.3 +vn 0 -0.95 -0.3 +vn 0 0.3 -0.95 +vn 0 -0.3 0.95 +vn 1 0 0 +vn -1 0 0 +vn 0 0.3 -0.95 +vn 0 -0.3 0.95 +vn 1 0 0 +vn -1 0 0 +vn 1 0 0 +vn -1 0 0 +vn 0 0.98 -0.17 +vn 0 -0.98 0.17 +vn 0 -0.17 -0.98 +vn 0 0.17 0.98 +vn 1 0 0 +vn -1 0 0 +vn 0 -0.17 -0.98 +vn 0 0.17 0.98 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 -1 +vn 0 0.99 -0.14 +vn 0 0.99 -0.14 +vn 0 0.99 -0.14 +vn 0 0.99 -0.14 +vn 0 0 -1 +vn 0 0 -1 +vn 0 0 -1 +vn 0 0 -1 +vn 0 0 1 +vn 0 0 1 +vn 0 0 1 +vn 0 0 1 +vn 1 0 0 +vn 1 0 0 +vn 1 0 0 +vn 1 0 0 +vn -1 0 0 +vn -1 0 0 +vn -1 0 0 +vn -1 0 0 +vn 0 -1 0 +vn 0 -1 0 +vn 0 -1 0 +vn 0 -1 0 +vn 0.97 0.26 0 +vn -0.97 -0.26 0 +vn -0.26 0.97 0 +vn 0.26 -0.97 0 +vn 0 0 -1 +vn 0 0 1 +vn 0.97 0.26 0 +vn -0.97 -0.26 0 +vn -0.26 0.97 0 +vn 0.26 -0.97 0 +vn 0 0 -1 +vn 0 0 1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn 0.97 0.26 0 +vn -0.97 -0.26 0 +vn -0.26 0.97 0 +vn 0.26 -0.97 0 +vn 0 0 -1 +vn 0 0 1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +usemtl common_thingies +f 5/1/1 2/2/1 1/3/1 4/4/1 +f 4/5/2 1/6/2 3/7/2 6/8/2 +f 5/9/3 4/10/3 6/11/3 7/12/3 +f 8/13/4 10/14/4 11/15/4 9/16/4 +f 16/17/5 15/18/5 17/19/5 18/20/5 +f 16/21/6 13/22/6 12/23/6 15/24/6 +f 13/25/7 16/26/7 18/27/7 14/28/7 +f 19/29/8 20/30/8 22/31/8 21/32/8 +f 24/33/9 20/34/9 19/35/9 23/36/9 +f 23/37/10 19/38/10 21/39/10 25/40/10 +f 20/41/11 24/42/11 26/43/11 22/44/11 +f 26/45/12 24/46/12 23/47/12 25/48/12 +f 27/49/13 28/50/13 30/51/13 29/52/13 +f 32/53/14 31/54/14 33/55/14 34/56/14 +f 32/57/15 28/58/15 27/59/15 31/60/15 +f 3/61/16 1/62/16 13/63/16 14/64/16 +usemtl typewriter_red +f 38/65/17 36/66/17 35/67/17 37/68/17 +f 41/69/18 39/70/18 40/71/18 42/72/18 +f 35/73/19 36/74/19 40/75/19 39/76/19 +f 37/77/20 35/78/20 39/79/20 41/80/20 +f 42/81/21 40/82/21 36/83/21 38/84/21 +usemtl common_thingies +f 115/85/22 116/86/22 118/87/22 117/88/22 +f 101/89/23 99/90/23 103/91/23 104/92/23 +f 100/93/24 102/94/24 105/95/24 106/96/24 +f 100/97/25 99/98/25 101/99/25 102/100/25 +f 102/101/26 101/102/26 104/103/26 105/104/26 +f 99/105/27 100/106/27 106/107/27 103/108/27 +f 93/109/28 91/110/28 95/111/28 96/112/28 +f 92/113/29 94/114/29 97/115/29 98/116/29 +f 92/117/30 91/118/30 93/119/30 94/120/30 +f 94/121/31 93/122/31 96/123/31 97/124/31 +f 91/125/32 92/126/32 98/127/32 95/128/32 +f 109/129/33 107/130/33 111/131/33 112/132/33 +f 108/133/34 110/134/34 113/135/34 114/136/34 +f 108/137/35 107/138/35 109/139/35 110/140/35 +f 110/141/36 109/142/36 112/143/36 113/144/36 +f 107/145/37 108/146/37 114/147/37 111/148/37 +f 75/149/38 79/150/38 80/151/38 77/152/38 +f 81/153/39 76/154/39 78/155/39 82/156/39 +f 81/157/40 79/158/40 75/159/40 76/160/40 +f 78/161/41 77/162/41 80/163/41 82/164/41 +f 76/165/42 75/166/42 77/167/42 78/168/42 +f 79/169/43 81/170/43 82/171/43 80/172/43 +f 83/173/44 87/174/44 88/175/44 85/176/44 +f 89/177/45 84/178/45 86/179/45 90/180/45 +f 84/181/46 83/182/46 85/183/46 86/184/46 +f 87/185/47 89/186/47 90/187/47 88/188/47 +f 59/189/48 63/190/48 64/191/48 61/192/48 +f 65/193/49 60/194/49 62/195/49 66/196/49 +f 65/197/50 63/198/50 59/199/50 60/200/50 +f 62/201/51 61/202/51 64/203/51 66/204/51 +f 60/205/52 59/206/52 61/207/52 62/208/52 +f 63/209/53 65/210/53 66/211/53 64/212/53 +f 67/213/54 71/214/54 72/215/54 69/216/54 +f 73/217/55 68/218/55 70/219/55 74/220/55 +f 68/221/56 67/222/56 69/223/56 70/224/56 +f 71/225/57 73/226/57 74/227/57 72/228/57 +f 43/229/58 47/230/58 48/231/58 45/232/58 +f 49/233/59 44/234/59 46/235/59 50/236/59 +f 49/237/60 47/238/60 43/239/60 44/240/60 +f 46/241/61 45/242/61 48/243/61 50/244/61 +f 44/245/62 43/246/62 45/247/62 46/248/62 +f 47/249/63 49/250/63 50/251/63 48/252/63 +f 51/253/64 55/254/64 56/255/64 53/256/64 +f 57/257/65 52/258/65 54/259/65 58/260/65 +f 52/261/66 51/262/66 53/263/66 54/264/66 +f 55/265/67 57/266/67 58/267/67 56/268/67 +usemtl common_table +f 120/269/68 119/270/68 115/271/68 117/272/68 +f 121/273/69 122/274/69 118/275/69 116/276/69 +usemtl common_thingies +f 131/277/70 135/278/70 136/279/70 133/280/70 +f 137/281/71 132/282/71 134/283/71 138/284/71 +f 137/285/72 135/286/72 131/287/72 132/288/72 +f 134/289/73 133/290/73 136/291/73 138/292/73 +f 132/293/74 131/294/74 133/295/74 134/296/74 +f 135/297/75 137/298/75 138/299/75 136/300/75 +f 123/301/76 127/302/76 128/303/76 125/304/76 +f 129/305/77 124/306/77 126/307/77 130/308/77 +f 124/309/78 123/310/78 125/311/78 126/312/78 +f 127/313/79 129/314/79 130/315/79 128/316/79 +f 120/317/80 117/318/80 118/319/80 122/320/80 +usemtl common_table +f 119/321/81 120/322/81 141/323/81 142/324/81 +f 141/325/82 122/326/82 121/327/82 142/328/82 +f 116/329/83 139/330/83 143/331/83 144/332/83 +f 143/333/84 140/334/84 121/335/84 144/336/84 +f 139/337/85 115/338/85 146/339/85 145/340/85 +f 119/341/86 140/342/86 145/343/86 146/344/86 +usemtl typewriter_red +f 159/345/87 155/346/87 153/347/87 160/348/87 +f 151/349/88 158/350/88 159/351/88 160/352/88 +f 158/353/89 147/354/89 161/355/89 162/356/89 +f 161/357/90 149/358/90 155/359/90 162/360/90 +f 167/361/91 156/362/91 150/363/91 168/364/91 +f 148/365/92 157/366/92 167/367/92 168/368/92 +f 157/369/93 152/370/93 169/371/93 170/372/93 +f 169/373/94 154/374/94 156/375/94 170/376/94 +f 148/377/95 163/378/95 171/379/95 172/380/95 +f 171/381/96 164/382/96 147/383/96 172/384/96 +f 163/385/97 150/386/97 173/387/97 174/388/97 +f 173/389/98 149/390/98 164/391/98 174/392/98 +f 175/393/99 154/394/99 165/395/99 176/396/99 +f 166/397/100 153/398/100 175/399/100 176/400/100 +f 165/401/101 152/402/101 177/403/101 178/404/101 +f 177/405/102 151/406/102 166/407/102 178/408/102 +f 156/409/103 154/410/103 179/411/103 180/412/103 +f 179/413/104 153/414/104 155/415/104 180/416/104 +f 155/417/105 149/418/105 181/419/105 182/420/105 +f 181/421/106 150/422/106 156/423/106 182/424/106 +usemtl data_input_machine +f 183/425/107 184/426/107 186/427/107 185/428/107 +f 188/429/108 187/430/108 189/431/108 190/432/108 +f 188/433/109 184/434/109 183/435/109 187/436/109 +f 189/437/110 185/438/110 186/439/110 190/440/110 +f 187/441/111 183/442/111 185/443/111 189/444/111 +f 184/445/112 188/446/112 190/447/112 186/448/112 +usemtl common_thingies +f 191/449/113 192/450/113 194/451/113 193/452/113 +f 196/453/114 195/454/114 197/455/114 198/456/114 +f 196/457/115 192/458/115 191/459/115 195/460/115 +f 197/461/116 193/462/116 194/463/116 198/464/116 +f 195/465/117 191/466/117 193/467/117 197/468/117 +f 192/469/118 196/470/118 198/471/118 194/472/118 +f 199/473/119 200/474/119 202/475/119 201/476/119 +f 204/477/120 203/478/120 205/479/120 206/480/120 +f 204/481/121 200/482/121 199/483/121 203/484/121 +f 205/485/122 201/486/122 202/487/122 206/488/122 +f 203/489/123 199/490/123 201/491/123 205/492/123 +f 200/493/124 204/494/124 206/495/124 202/496/124 +f 207/497/125 208/498/125 210/499/125 209/500/125 +f 212/501/126 211/502/126 213/503/126 214/504/126 +f 212/505/127 208/506/127 207/507/127 211/508/127 +f 213/509/128 209/510/128 210/511/128 214/512/128 +f 211/513/129 207/514/129 209/515/129 213/516/129 +f 208/517/130 212/518/130 214/519/130 210/520/130 +f 215/521/131 216/522/131 218/523/131 217/524/131 +f 220/525/132 219/526/132 221/527/132 222/528/132 +f 220/529/133 216/530/133 215/531/133 219/532/133 +f 221/533/134 217/534/134 218/535/134 222/536/134 +f 219/537/135 215/538/135 217/539/135 221/540/135 +f 216/541/136 220/542/136 222/543/136 218/544/136 \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/models/block/multiblock/data_input_machine/upgrades/data_input_machine.mtl b/src/main/resources/assets/immersiveintelligence/models/block/multiblock/data_input_machine/upgrades/data_input_machine.mtl new file mode 100644 index 000000000..67f69eb55 --- /dev/null +++ b/src/main/resources/assets/immersiveintelligence/models/block/multiblock/data_input_machine/upgrades/data_input_machine.mtl @@ -0,0 +1,20 @@ +# Made by Pabilo8 with Blockbench + +newmtl data_input_machine +map_Kd immersiveintelligence:blocks/multiblock/data_input_machine +newmtl circuit_basic +map_Kd immersiveintelligence:blocks/multiblock/circuits/circuit_basic +newmtl common_thingies +map_Kd immersiveintelligence:blocks/common/common_thingies +newmtl common_table +map_Kd immersiveintelligence:blocks/common/common_table +newmtl common_bottom +map_Kd immersiveintelligence:blocks/common/common_bottom +newmtl common_steel +map_Kd immersiveintelligence:blocks/common/common_steel +newmtl common_wooden_base_light +map_Kd immersiveintelligence:blocks/common/common_wooden_base_light +newmtl common_copper_cable +map_Kd immersiveintelligence:blocks/common/common_copper_cable +newmtl typewriter_red +map_Kd immersiveintelligence:blocks/metal_device/typewriter_red \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/models/block/multiblock/projectile_workshop/projectile_workshop_inv.obj b/src/main/resources/assets/immersiveintelligence/models/block/multiblock/projectile_workshop/projectile_workshop_inv.obj index 7b5683294..1820204f5 100644 --- a/src/main/resources/assets/immersiveintelligence/models/block/multiblock/projectile_workshop/projectile_workshop_inv.obj +++ b/src/main/resources/assets/immersiveintelligence/models/block/multiblock/projectile_workshop/projectile_workshop_inv.obj @@ -1,4411 +1,6082 @@ # Made by Pabilo8 with Blockbench -# Exported with IIToolkit Plugin +# Exported with IIToolkit Plugin on 03/06/2026 mtllib projectile_workshop.mtl - o main -v -1.0000000034054226 1.5 1.0624999997996811 -v -1.3125 1.6875000008012755 0.24999999519234484 -v -2.0249999984976066 1.75 0.4687500092146717 -v -2.0874999984976066 1.75 0.4687500092146717 -v -2.0249999984976066 1.5625 0.4687500092146717 -v -2.0874999984976066 1.5625 0.4687500092146717 -v -2.0249999984976066 1.75 0.6562500092146717 -v -2.0874999984976066 1.75 0.6562500092146717 -v -2.0249999984976066 1.5625 0.6562500092146717 -v -2.0874999984976066 1.5625 0.6562500092146717 -v -1.0625 2.440625 1.003125 -v -1.0625 1.5031249999999998 1.003125 -v -2 2.440625 1.003125 -v -2 1.5031249999999998 1.003125 -v -2.9375 2.440625 1.003125 -v -2.9375 1.5031249999999998 1.003125 -v -0.9375 1.625 0.0625 -v -0.9375 1.625 0.9375 -v -0.9375 1.5 0.0625 -v -0.0625 1.625 0.0625 -v -0.0625 1.625 0.9375 -v -0.0625 1.5 0.0625 -v -1.25 2.3125 3 -v -1.25 2.3125 2.9375 -v -1.25 1.8125 3 -v -1.25 1.8125 2.9375 -v -1.75 2.3125 3 -v -1.75 2.3125 2.9375 -v -1.75 1.8125 3 -v -1.75 1.8125 2.9375 -v -1.375 2.5 3 -v -1.375 2.5 2.9375 -v -1.375 2.3125 3 -v -1.375 2.3125 2.9375 -v -1.625 2.5 3 -v -1.625 2.5 2.9375 -v -1.625 2.3125 3 -v -1.625 2.3125 2.9375 -v -1.9984374999999996 2.188868931746468 0.0016814376983114165 -v -3.374999999999999 2.25 1.8125 -v 0 1.6875 0.75 -v 0 1.6875 0.0625 -v -6.310047595547985e-9 1.5 0.7500000030047844 -v 0 1.5 0.0625 -v -0.0625 1.6875 0.75 -v -0.0625 1.6875 0.0625 -v -0.0625000063100476 1.5 0.7500000030047844 -v -0.9375 1.6875000000000002 0.75 -v -0.9375 1.6875 0.0625 -v -0.9375000063100476 1.5000000000000002 0.7500000030047844 -v -1 1.6875000000000002 0.75 -v -1 1.6875 0.0625 -v -1.0000000063100476 1.5000000000000002 0.7500000030047844 -v -1 1.5 0.0625 -v -3 1.6875 1 -v -3 1.6875 0.125 -v -3 1.5 1 -v -3 1.5 0.125 -v -3.0625 1.6875 1 -v -3.0625 1.6875 0.125 -v -3.0625 1.5 1 -v -3.0625 1.5 0.125 -v -3 1.6875 1.6875 -v -3.0000000063100476 1.5 1.6875000030047844 -v -3.0625 1.6875 1.6875 -v -3.0625000063100476 1.5 1.6875000030047844 -v -3 1.6875 0.0625 -v -3 1.5 0.0625 -v -3.9375 1.6875 0.125 -v -3.9375 1.6875 0.0625 -v -3.937500000000001 1.5000000015357786 0.12500000013354606 -v -3.9375 1.5 0.0625 -v -3.9375 1.6875 1.6875 -v -3.9375 1.6874999999999998 1 -v -3.9375000063100476 1.5 1.6875000030047844 -v -3.9375 1.4999999999999998 1 -v -4 1.6875 1.6875 -v -4 1.6874999999999998 1 -v -4.000000006310048 1.5 1.6875000030047844 -v -4 1.4999999999999998 1 -v -2 2.434375001001595 1.068749992197576 -v -3.374999999999999 2.4375 1.875 -v -3.374999999999999 2.4375 1.8125 -v -3.374999999999999 2.25 1.875 -v -3.624999999999999 2.4375 1.875 -v -3.624999999999999 2.4375 1.8125 -v -3.624999999999999 2.25 1.875 -v -3.624999999999999 2.25 1.8125 -v -4.000000014122487 2.1875000035055825 1.8749999994992033 -v -3.9375000126200943 2.1875 1.8750000060095693 -v -4.000000012720254 1.5000000040063797 1.8750000030047846 -v -3.937500012620095 1.5 1.8750000060095693 -v -4.000000014122487 2.1875000035055825 1.6874999994992028 -v -3.9375000126200943 2.1875 1.6875000060095688 -v -4.000000012620095 1.8125 1.8750000060095693 -v -4.000000012620095 1.8125 1.6875000060095688 -v -3.937500012620095 1.8125 1.6875000060095688 -v -3.937500012620095 1.8125 1.8750000060095693 -v -3.00000001562488 2.250000007011165 1.8749999929888368 -v -3.000000014122487 2.1875000035055825 1.8749999994992028 -v -4.000000015624879 2.250000007011165 1.8749999929888372 -v -3.00000001562488 2.250000007011165 1.6874999929888368 -v -3.000000014122487 2.1875000035055825 1.6874999994992028 -v -4.000000015624879 2.250000007011165 1.6874999929888368 -v -3.0625000126200943 2.1875 1.8750000060095688 -v -3.062500012620095 1.5 1.8750000060095688 -v -3.000000012720254 1.5000000040063792 1.8750000030047844 -v -3.0625000126200943 2.1875 1.6875000060095688 -v -3.062500012620095 1.8125 1.8750000060095688 -v -3.062500012620095 1.8125 1.6875000060095688 -v -3.000000012620095 1.8125 1.6875000060095688 -v -3.000000012620095 1.8125 1.8750000060095688 -v -1.5593749999999993 2.0625 0 -v -4.000000012820414 2.500000008012759 2.875 -v -4.000000012820414 2.5000000080127585 1.8749999999999998 -v -2.9375000042734705 2.5000000026709195 2.875 -v -2.937500012820414 2.500000008012759 1.8749999999999998 -v -4.000000005475384 1.5000000057424767 2.8750000022702817 -v -2.9375000042734714 1.5000000026709188 2.875 -v -2.937500012820414 1.5000000080127585 1.875 -v -3.000000012820414 2.500000008012759 1.8749999999999998 -v -3.000000012820414 1.5000000080127585 2.875 -v -3.000000012820414 2.500000008012759 2.875 -v -2 3.25 1.0562500000000001 -v -2 2.6875 1.05625 -v -2.624999999999999 3.25 1.0562500000000001 -v -2.624999999999999 2.6875 1.05625 -v -0.375 2.4375 0.9375 -v -0.375 2.4375 0.875 -v -0.375 2.25 0.9375 -v -0.375 2.25 0.875 -v -0.625 2.4375 0.9375 -v -0.625 2.4375 0.875 -v -0.625 2.25 0.9375 -v -0.625 2.25 0.875 -v -1.5624880056464008e-8 2.250000007011165 0.9374999929888368 -v -1.4122487179690779e-8 2.1875000035055825 0.9374999994992028 -v -1.00000001562488 2.250000007011165 0.9374999929888368 -v -1.0000000141224872 2.1875000035055825 0.937499999499203 -v -1.5624880056464008e-8 2.250000007011165 0.7499999929888368 -v -1.4122487179690779e-8 2.1875000035055825 0.7499999994992028 -v -1.00000001562488 2.250000007011165 0.7499999929888368 -v -1.0000000141224872 2.1875000035055825 0.7499999994992028 -v -0.06250001262009475 2.1875 0.9375000060095688 -v -0.06250001262009519 1.5 0.9375000060095688 -v -6.310047595547985e-9 1.5 0.9375000030047844 -v -0.06250001262009475 2.1875 0.7500000060095688 -v -0.06250001262009519 1.8125 0.9375000060095688 -v -0.06250001262009519 1.8125 0.7500000060095688 -v -1.262009519109597e-8 1.8125 0.7500000060095688 -v -1.262009519109597e-8 1.8125 0.9375000060095688 -v -0.9375000126200952 2.1875 0.9375000060095693 -v -1.0000000126200952 1.5 0.9375000060095693 -v -0.9375000063100476 1.5 0.9375000030047846 -v -0.9375000126200952 2.1875 0.7500000060095688 -v -1.0000000126200952 1.8125 0.9375000060095693 -v -1.0000000126200952 1.8125000000000002 0.7500000060095688 -v -0.9375000126200952 1.8125000000000002 0.7500000060095688 -v -0.9375000126200952 1.8125 0.9375000060095693 -v -0.06249999999999911 1.4375000032050993 1.5000000002003155 -v -0.9375 3.375 1.0625 -v -0.9375 3.375 0.9375 -v -0.9375 2.4375 1.0625 -v -0.9375 2.4375 0.9375 -v -1.9375 3.4999999999999996 2 -v -1.9375 3.5 1.0625 -v -1.9375 1.5 1.0625 -v -2.9375 3.5 2 -v -2.9375 3.5 1.0625 -v -2.9375000008513563 1.4999999999999991 1.0609374999499204 -v -2.93750000170271 2.5 1.0624999998998406 -v -1.9375 2.5000000000000004 1.0625 -v -2.937499999999999 2.5 2 -v -2.9375 1.4999999999999991 1.9999999999999998 -v -1.9375 3.4999999999999996 2.9374999999999996 -v -2.9375 3.5 2.9374999999999996 -v -2.9374999999999982 2.5 2.9375 -v -2.9375 1.4999999999999991 2.9375 -v -1.9375 1.5 2.9375 -v -1.9375 2.5 2.9375 -v -0.9375 3.5 2 -v -0.9375 3.5 1.0625 -v -0.9375 1.5000000000000002 1.9999999999999998 -v -0.9375 1.5 1.0625 -v -0.9375 2.5 1.0625 -v -0.9375 2.5 2 -v -0.9375 3.5 2.9374999999999996 -v -0.9375 2.5 2.9375 -v -1.687499994951854 4.4375 2.2500000030288874 -v -1.687499994951854 4.4375 2.8750000030288874 -v -1.6874999899037082 3.9999999999999987 2.250000006057775 -v -1.6874999899037082 3.999999999999999 2.875000006057775 -v -1.062499994951854 4.4375 2.2500000030288874 -v -1.062499994951854 4.4375 2.8750000030288874 -v -1.0624999899037082 3.9999999999999987 2.250000006057775 -v -1.0624999899037082 3.999999999999999 2.875000006057775 -v -1.0000000122194557 4.000000011217862 2.9374999887821382 -v -1.0000000122194557 3.5000000112178613 2.9374999887821382 -v -1.8750000122194557 4.000000011217862 2.9374999887821382 -v -1.8750000122194557 3.5000000112178613 2.9374999887821382 -v -1.0000000122194557 4.000000011217862 2.1249999887821387 -v -1.0000000122194557 3.5000000112178613 2.1249999887821387 -v -1.8750000122194557 4.000000011217862 2.1249999887821387 -v -1.8750000122194557 3.5000000112178618 2.1249999887821387 -v -1.4375000122194557 4.000000011217862 2.1249999887821387 -v -1.4375000122194557 3.5000000112178613 2.1249999887821387 -v -1.4375000122194557 3.500000011217861 2.9374999887821382 -v -1.4375000122194557 4.000000011217862 2.9374999887821382 -v -1.4375000122194557 3.7500000112178613 2.1249999887821387 -v -1.8750000122194557 3.7500000112178618 2.1249999887821387 -v -1.8750000122194557 3.7500000112178618 2.9374999887821382 -v -1.4375000122194557 3.7500000112178613 2.9374999887821382 -v -1.0000000122194557 3.7500000112178613 2.9374999887821382 -v -1.0000000122194557 3.7500000112178613 2.1249999887821387 -v -1.8750000122194557 3.750000011217862 2.5624999887821382 -v -1.8750000122194557 3.5000000112178618 2.5624999887821382 -v -1.0000000122194557 3.5000000112178613 2.5624999887821382 -v -1.0000000122194557 3.7500000112178618 2.5624999887821382 -v -1.0000000122194557 4.000000011217862 2.5624999887821382 -v -1.4375000122194557 4.000000011217862 2.5624999887821382 -v -1.8750000122194557 4.000000011217862 2.5624999887821382 -v -1.125 4.5 2.8124999999999996 -v -1.125 4.5 2.3125 -v -1.625 4.5 2.8124999999999996 -v -1.625 4.5 2.3125 -v -2.625000002804464 3.1250000035389682 3.125 -v -2.625000004206697 3.125000005308453 2.9375 -v -2.624999999999999 1.999999999999999 3.125 -v -2.624999999999999 1.999999999999999 2.9375 -v -2.812499999999999 3.125 3.125 -v -2.812499999999999 3.125 2.9375 -v -2.812499999999999 1.9999999999999991 3.125 -v -2.812499999999999 1.9999999999999991 2.9375 -v -2.624999999999999 2.5625 3.125 -v -2.812499999999999 2.5625 3.125 -v -2.812499999999999 2.5625 2.9375 -v -2.624999999999999 2.5625 2.9375 -v -2.624999999999999 1.937499999999999 3.125 -v -2.625 1.812499999999999 2.9375 -v -2.812499999999999 1.9374999999999991 3.125 -v -2.8125 1.8124999999999991 2.9375 -v -2.625000004206697 3.312500005308453 3.125 -v -2.625000004206697 3.312500005308453 2.9375 -v -1.687500002804466 3.312500003538967 3.125 -v -1.687500004206698 3.3125000053084515 2.9375 -v -1.687500004206698 3.1250000053084515 3.125 -v -1.687500004206698 3.1250000053084515 2.9375 -v -1.6875000066186807 3.6874999969711117 3.1249999999999996 -v -1.6875000066186807 3.6874999969711117 2.9374999999999996 -v -1.6875000132373614 3.812499993942224 3.1249999999999996 -v -1.6875000132373614 3.874999993942224 2.9374999999999996 -v -1.5000000066186807 3.687499996971112 3.1249999999999996 -v -1.5000000066186807 3.687499996971112 2.9374999999999996 -v -1.5000000132373614 3.812499993942225 3.1249999999999996 -v -1.5000000132373614 3.874999993942225 2.9374999999999996 -v -1.5 3.312499999999999 3.125 -v -1.5 3.312499999999999 2.9375 -v -1.0625000066186807 3.687499996971112 3.1249999999999996 -v -1.0625000066186807 3.687499996971112 2.9374999999999996 -v -1.0625 2.874999999999999 3.125 -v -1.0625 2.874999999999999 2.9375 -v -1.2500000066186807 3.6874999969711117 3.1249999999999996 -v -1.2500000066186807 3.6874999969711117 2.9374999999999996 -v -1.2500000024038274 2.875000003071557 3.125 -v -1.2500000036057415 2.8750000046073354 2.9375 -v -2.2500000036057406 2.875000004607336 3.125 -v -2.2500000036057406 2.875000004607336 2.9375 -v -2.2500000024038274 2.6875000030715572 3.125 -v -2.2500000036057415 2.687500004607336 2.9375 -v -1.2500000036057415 2.6875000046073354 3.125 -v -1.2500000036057415 2.6875000046073354 2.9375 -v -2.25 2 3.125 -v -2.25 2 2.9375 -v -2.4375 2.6874999999999996 3.125 -v -2.4375 2.6874999999999996 2.9375 -v -2.4375 2 3.125 -v -2.4375 2 2.9375 -v -2.437499999999999 2.8124999999999996 3.125 -v -2.437499999999999 2.8124999999999996 2.9375 -v -2.25 1.9375 3.125 -v -2.25 1.8124999999999998 2.9375 -v -2.4375 1.9375 3.125 -v -2.4375 1.8124999999999998 2.9375 -v -2.812499999999999 3.25 3.125 -v -2.812499999999999 3.25 2.9375 -v -1.5 3.187499999999999 3.125 -v -1.5 3.187499999999999 2.9375 -v -1.0625 2.749999999999999 3.125 -v -1.0625 2.749999999999999 2.9375 -v -1.2500000132373614 3.812499993942224 3.1249999999999996 -v -1.2500000132373614 3.874999993942224 2.9374999999999996 -v -1.0625000132373614 3.812499993942225 3.1249999999999996 -v -1.0625000132373614 3.874999993942225 2.9374999999999996 -v -2.8750000036057415 1.437500004607335 2.9375 -v -2.8750000036057415 1.437500004607335 2.875 -v -4.0000000036057415 1.4375000046073356 2.9375 -v -4.00000000180287 1.4375000046073356 2.8750000034054226 -v -2.8750000036057415 1.500000004607335 2.9375 -v -2.8750000036057415 1.500000004607335 2.875 -v -4.00000000180287 1.5000000023036681 2.9375 -v 4.440892098500626e-16 1.000781250400638 0 -v 0 0.5000000016025519 -8.881784197001252e-16 -v 4.440892098500626e-16 1.0000000016025514 1.4999999999999967 -v 0 0.5000000016025514 1.499999999999996 -v -2 1.000000001602551 -4.440892098500626e-16 -v -2 0.500000001602551 -8.881784197001252e-16 -v -2 0.5000000016025512 1.499999999999996 -v -2 0.7500000016025509 -8.881784197001252e-16 -v 0 0.7500000016025514 1.4999999999999962 -v 0 0.7500000016025519 -8.881784197001252e-16 -v -3.999999999999999 1.000781250400638 0 -v -3.999999999999999 0.5000000016025519 -8.881784197001252e-16 -v -3.999999999999999 1.0000000016025519 1.4999999999999971 -v -3.999999999999999 0.5000000016025519 1.4999999999999962 -v -3.999999999999999 0.7500000016025518 -8.881784197001252e-16 -v -3.999999999999999 0.7500000016025518 1.4999999999999964 -v -2 1.0000000005341825 2.999999999999998 -v -2 0.5000000008012732 2.9999999999999964 -v 8.881784197001252e-16 1.000781250400637 2.9999999999999982 -v 4.440892098500626e-16 0.5000000016025472 2.999999999999992 -v 4.440892098500626e-16 0.7500000016025475 2.999999999999993 -v -2 0.7500000016025465 2.999999999999994 -v -3.9999999999999982 1.0000000005341838 2.937499999999998 -v -3.999999999999999 0.5000000008012739 2.9374999999999964 -v -1.9999999999999991 1.0000000012019115 2.9375000012019106 -v -2 0.5000000008012742 2.937499999999996 -v -2 0.7500000016025483 2.937499999999994 -v -3.999999999999999 0.7500000016025483 2.937499999999994 -v -3 0.7500000016025483 2.937499999999994 -v -3 0.5000000005341825 2.937499999999998 -v -3 0.5000000016025519 1.4999999999999933 -v -2.9999999999999982 1.0000000024038234 2.9375000024038234 -v 0 1 0.062499999999999556 -v -3.999999999999999 1 0.062499999999999556 -v 4.440892098500626e-16 1 2.9374999999999996 -v -0.062499999999999556 1 2.937499999999999 -v -0.0625 1 0.06249999999999911 -v -3.9375 1.0000000010683676 2.937500001602551 -v -3.937499999999999 1 0.06249999999999911 -v -3.125000008413397 1.4375000046073354 0 -v 0 1.5015625023036687 0.12500000020031887 -v 0 1.5031250000000007 0 -v 8.881784197001252e-16 1.0031249999999998 0.125 -v -0.125 1.5031249999999998 0.125 -v -0.12500000020031887 1.5015625023036678 0 -v -0.125 1.0031249999999998 0.125 -v -0.125 1.0031249999999998 0 -v 0 1.5031250000000007 3 -v 0 1.5015625023036687 2.8750000034054226 -v 8.881784197001252e-16 1.0031250000000007 2.875 -v -0.12500000020031887 1.5015625023036678 3 -v -0.125 1.5031249999999998 2.875 -v -0.125 1.0031250000000007 3 -v -0.125 1.0031250000000007 2.875 -v 0 1.5000000046073367 2.1250000052082934 -v 0 1.4375000046073367 2.1250000052082934 -v 0 1.4375000046073367 2.875000006810845 -v -0.0625 1.5000000046073367 2.1250000052082934 -v -0.0625 1.4375000046073367 2.1250000052082934 -v -0.0625 1.5000000046073367 2.875000006810845 -v -0.0625 1.4375000046073367 2.875000006810845 -v 0 1.4375000046073367 0.12500000040063775 -v 0 1.5000000046073363 1.1250000020031896 -v 0 1.4375000046073363 1.12500000200319 -v -0.0625 1.5000000046073367 0.12500000040063775 -v -0.0625 1.4375000046073367 0.12500000040063775 -v -0.0625 1.5000000046073363 1.1250000020031896 -v -0.0625 1.4375000046073363 1.12500000200319 -v -0.12500000040063775 1.4375000046073358 0.0625 -v -0.12500000040063775 1.4375000046073358 0 -v -1.1250000020031896 1.4375000046073358 0.0625 -v -1.1250000020031896 1.4375000046073358 0 -v -0.12500000040063775 1.5000000046073358 0.0625 -v -1.1250000020031896 1.5000000046073358 0.0625 -v -1.1250000020031896 1.5000000046073358 0 -v -3.125000008413397 1.4375000046073354 0.0625 -v -3.87500001001595 1.4375000046073358 0.0625 -v -3.87500001001595 1.4375000046073358 0 -v -3.125000008413397 1.5000000046073354 0.0625 -v -3.125000008413397 1.5000000046073354 0 -v -3.87500001001595 1.5000000046073358 0.0625 -v -3.8750000050079754 1.5015625023036678 0 -v -2.1250000052082934 1.4375000046073354 0.0625 -v -2.1250000052082934 1.4375000046073354 0 -v -2.1250000052082934 1.5000000046073358 0.0625 -v -2.1250000052082934 1.5000000046073358 0 -v -3.937500000000001 1.4375000046073358 0.12500000040063775 -v -3.937500000000001 1.5000000046073356 1.1250000020031896 -v -3.937500000000001 1.4375000046073363 1.12500000200319 -v -3.999999999999999 1.5015625023036678 0.12500000020031887 -v -3.999999999999999 1.4375000046073358 0.12500000040063775 -v -3.999999999999999 1.5000000046073356 1.1250000020031896 -v -3.999999999999999 1.437500004607336 1.12500000200319 -v -3.937500000000001 1.5000000046073358 2.1250000052082934 -v -3.937500000000001 1.4375000046073358 2.1250000052082934 -v -3.999999999999999 1.5000000046073358 2.1250000052082934 -v -3.999999999999999 1.4375000046073358 2.1250000052082934 -v -3.937500000000001 1.5000000046073356 2.875000006810845 -v -3.937500000000001 1.4375000046073356 2.875000006810845 -v -0.12500000040063775 1.4375000046073358 3 -v -0.12500000040063775 1.4375000046073358 2.9375 -v -1.1250000020031896 1.4375000046073358 3 -v -1.1250000020031896 1.4375000046073358 2.9375 -v -0.12500000040063775 1.5000000046073367 2.9375 -v -1.1250000020031896 1.5000000046073358 3 -v -1.1250000020031896 1.5000000046073358 2.9375 -v -2.0000000036057415 1.4375000046073358 3 -v -2.0000000012019097 1.4375000036725156 2.9375000016693247 -v -2.0000000018028707 1.500000002303668 3 -v -2.0000000018028707 1.5000000023036684 2.9375 -v -3.937500000000001 1.0000000032050993 1.5000000048076547 -v -3.937499999999999 1.4375000032051037 1.5000000025039901 -v -3.9374999999999956 1.437500003205101 2.937500004807654 -v -2.9999999999999956 1.4375000032050984 2.937500004807651 -v -3.937500000000001 1.2500000032050993 1.5000000048076547 -v -3.9374999999999956 1.2500000032051009 2.9375000048076547 -v -2.9999999999999956 1.2500000032050984 2.937500004807652 -v -1.9999999999999964 1.2500000032050966 2.9375000048076494 -v -3.937500000000006 0.9375000032051028 0.06250000020032775 -v -3.937500000000006 1.4375000032051028 0.06250000020032553 -v -3.937500000000001 0.937500003205109 1.5000000002003278 -v -2.0000000000000053 0.937500003205098 0.06250000020031932 -v -2.0000000000000044 1.4375000032050975 0.06250000020031798 -v -3.937500000000006 1.1875000032051028 0.06250000020032687 -v -2.0000000000000044 1.1875000032050975 0.06250000020031887 -v -3.937500000000001 1.1875000032051082 1.5000000002003269 -v -0.06250000000000444 0.9375000032050957 0.06250000020031354 -v -0.06250000000000355 1.4375000032050957 0.0625000002003131 -v -0.06250000000000089 0.9375000032050992 1.5000000002003162 -v -0.06250000000000311 1.1875000032050957 0.0625000002003131 -v -0.06249999999999911 1.1875000032050993 1.500000000200316 -v -1.9999999999999947 0.9375000032051144 2.9375000002003278 -v -0.06249999999999467 0.9375000032051082 2.937500000200319 -v -0.062499999999992895 1.4375000032051073 2.937500000200317 -v -1.9999999999999938 1.1875000032051144 2.937500000200327 -v -0.06249999999999334 1.1875000032051073 2.937500000200318 -v -3.875 1.5031249999999998 0.125 -v -3.875000000000001 1.0031249999999998 0.125 -v -3.875000000000001 1.0031249999999998 0 -v -3.999999999999999 1.5031249999999998 0 -v -3.999999999999999 1.0031249999999998 0.125 -v -3.999999999999999 0.4999999999999998 3 -v -3.999999999999999 0.625 3 -v -3.999999999999999 0.625 2.9375 -v -3 0.49999999999999956 3 -v -3 0.6249999999999998 3 -v -3 0.6249999999999996 2.9375 -v -2.875 1.375 3 -v -2.875 1.375 2.9375 -v -2.875 0.625 3 -v -2.875 0.625 2.9375 -v -3 1.375 3 -v -3.125 1.375 3 -v -3.125 1.375 2.9375 -v -3.125 0.6249999999999991 3 -v -3.125 0.6249999999999991 2.9375 -v -2 0.625 3 -v -2 0.625 2.9375 -v -2 1.375 3 -v -2 1.375 2.9375 -v -2.125 1.375 3 -v -2.125 1.375 2.9375 -v -2.125 0.625 3 -v -2.125 0.625 2.9375 -v -3 1.5 3 -v -3 1.5 2.9375 -v -3 1.375 2.9375 -v -3.999999999999999 1.5000000000000007 3 -v -3.999999999999999 1.3750000000000009 3 -v -3.999999999999999 1.3750000000000009 2.9375 -v -3.875000000000001 1.3750000000000009 3 -v -3.875000000000001 1.3750000000000009 2.9375 -v -3.874999999999999 0.6250000000000009 3 -v -3.874999999999999 0.6250000000000009 2.9375 -v -3.25 1.25 3.0125 -v -3.25 1.25 2.95 -v -3.25 0.7500000000000001 3.0125 -v -3.25 0.7500000000000001 2.95 -v -3.750000000000001 1.2500000000000009 3.0125 -v -3.750000000000001 1.2500000000000009 2.95 -v -3.749999999999999 0.7500000000000009 3.0125 -v -3.749999999999999 0.7500000000000009 2.95 -v -2.25 1.25 3.0125 -v -2.25 1.2499999999999998 2.95 -v -2.25 0.75 3.0125 -v -2.25 0.75 2.95 -v -2.75 1.25 3.0125 -v -2.75 1.25 2.95 -v -2.75 0.7500000000000001 3.0125 -v -2.75 0.7500000000000001 2.95 -v -1.0625 2.4968750010015945 0.31874999219757605 -v -1.0625 2.4343750010015945 0.31874999219757605 -v -1.0625 2.4968750010015945 1.068749992197576 -v -1.0625 2.4343750010015945 1.068749992197576 -v -2 2.4968750010015945 0.31874999219757605 -v -2 2.4343750010015945 0.31874999219757605 -v -2 2.496875001001595 1.068749992197576 -v -1.5 2.4968750010015945 0.31874999219757605 -v -1.5 2.4968750010015945 1.068749992197576 -v -1.5 2.4343750010015945 1.068749992197576 -v -1.5 2.4343750010015945 0.31874999219757605 -v -1.0625 2.4554029064378895 0.3569162659898968 -v -1.0625000017027117 2.4997985401310245 0.3126110459827096 -v -1.0625 2.146043689668776 0.04755704922078241 -v -1.0617187517027116 2.188184465873234 0.000840718748996494 -v -2 2.4554029064378895 0.3569162659898968 -v -2 2.499597080262049 0.31272209216573765 -v -2 2.146043689668776 0.04755704922078241 -v -1.5625 2.499597080262049 0.31272209216573765 -v -1.5609374999999996 2.188868931746468 0.0016814376983114165 -v -1.5625 2.146043689668776 0.04755704922078241 -v -1.5625 2.4554029064378895 0.3569162659898968 -v -2.937499999999999 2.4968750010015945 0.31874999219757605 -v -2.937499999999999 2.4343750010015945 0.31874999219757605 -v -2.937499999999999 2.4968750010015945 1.068749992197576 -v -2.937499999999999 2.4343750010015945 1.068749992197576 -v -2.4375 2.4968750010015945 0.31874999219757605 -v -2.4375 2.496875001001595 1.068749992197576 -v -2.4375 2.434375001001595 1.068749992197576 -v -2.4375 2.4343750010015945 0.31874999219757605 -v -2.937499999999999 2.4554029064378895 0.3569162659898968 -v -2.93750000170271 2.4997985401310245 0.3126110459827096 -v -2.937499999999999 2.146043689668776 0.04755704922078241 -v -2.9367187517027107 2.188184465873234 0.000840718748996494 -v -2.5 2.499597080262049 0.31272209216573765 -v -2.4984374999999996 2.188868931746468 0.0016814376983114165 -v -2.5 2.146043689668776 0.04755704922078241 -v -2.5 2.4554029064378895 0.3569162659898968 -v -2.125 2.3750000000000004 1 -v -1.9968750000000002 2.0625 0.0625 -v -1.9968750000000002 2.0625 0 -v -2.934375 2.0625 0.0625 -v -2.934375 2.0625 0 -v -1.9968750000000002 2.1875 0.0625 -v -2.934375 2.1875 0.0625 -v -2.4968749999999993 2.0625 0 -v -2.4968749999999993 2.0625 0.0625 -v -2.4968749999999993 2.1875 0.0625 -v -1.0593750000000002 2.0625 0.0625 -v -1.0593750000000002 2.0625 0 -v -1.0593750000000002 2.1875 0.0625 -v -1.5593749999999993 2.0625 0.0625 -v -1.5593749999999993 2.1875 0.0625 -v -1.0249999999999995 1.6875 1 -v -1.0249999999999995 1.6875000000000002 0.875 -v -1.9624999999999995 1.6874999999999998 1 -v -1.9624999999999995 1.6875 0.875 -v -1.0249999999999995 1.8125 1 -v -1.0249999999999995 1.8125000000000002 0.875 -v -1.9624999999999995 1.8125 1 -v -1.9624999999999995 1.8125 0.875 -v -1.8999999984976066 1.84375 0.8437500092146717 -v -1.9624999984976066 1.84375 0.8437500092146717 -v -1.8999999984976066 1.65625 0.8437500092146717 -v -1.9624999984976066 1.65625 0.8437500092146717 -v -1.8999999984976066 1.84375 1.0312500092146717 -v -1.9624999984976066 1.84375 1.0312500092146717 -v -1.8999999984976066 1.65625 1.0312500092146717 -v -1.9624999984976066 1.65625 1.0312500092146717 -v -1.0499999984976052 1.8437500000000002 0.8437500092146717 -v -1.1124999984976052 1.8437500000000002 0.8437500092146717 -v -1.0499999984976052 1.6562500000000002 0.8437500092146717 -v -1.1124999984976052 1.6562500000000002 0.8437500092146717 -v -1.0499999984976052 1.84375 1.0312500092146717 -v -1.1124999984976052 1.84375 1.0312500092146717 -v -1.0499999984976052 1.65625 1.0312500092146717 -v -1.1124999984976052 1.65625 1.0312500092146717 -v -1.0625 1.6875000008012757 0.24999999519234484 -v -1.0625 1.5000000008012757 0.24999999519234484 -v -1.0625 1.6875000008012757 0.8124999951923448 -v -1.0625 1.5000000008012757 0.8124999951923448 -v -1.5625 1.6875000008012755 0.24999999519234484 -v -1.5625 1.5000000008012755 0.24999999519234484 -v -1.5625 1.6875000008012755 0.8124999951923448 -v -1.5625 1.5000000008012757 0.8124999951923448 -v -1.0625 1.6875000008012757 0.5624999951923448 -v -1.5625 1.6875000008012755 0.5624999951923448 -v -1.5625 1.5000000008012755 0.5624999951923448 -v -1.0625 1.5000000008012757 0.5624999951923448 -v -1.3125 1.6875000008012755 0.5624999951923448 -v -1.3125 1.5000000008012755 0.24999999519234484 -v -1.3125 1.5000000008012757 0.8124999951923448 -v -1.3125 1.6875000008012757 0.8124999951923448 -v -1.625 2.3125 0.9375 -v -1.625 2.3125 0.875 -v -1.625 2.0625 0.9375 -v -1.625 2.0625 0.875 -v -1.875 2.3125 0.9375 -v -1.875 2.3125 0.875 -v -1.875 2.0625 0.9375 -v -1.875 2.0625 0.875 -v -1.1875 2.3125 0.9375 -v -1.1875 2.3125 0.875 -v -1.1875 1.9375 0.9375 -v -1.1875 1.9375000000000002 0.875 -v -1.5625 2.3125 0.9375 -v -1.5625 2.3125 0.875 -v -1.5625 1.9375 0.9375 -v -1.5625 1.9375000000000002 0.875 -v -1.125 2.375 1.0625 -v -1.125 2.375 0.9375 -v -1.125 1.875 1.0625 -v -1.125 1.875 0.9375 -v -1.875 2.3750000000000004 1.0625 -v -1.875 2.375 0.9375 -v -1.875 1.875 1.0625 -v -1.875 1.875 0.9375 -v -1.875 2.125 0.9375 -v -1.125 2.125 0.9375 -v -1.125 2.125 1.0625 -v -1.875 2.1250000000000004 1.0625 -v -1.5 2.125 0.9375 -v -1.5 1.875 0.9375 -v -1.5 1.875 1.0625 -v -1.5 2.375 1.0625 -v -1.5 2.375 0.9375 -v -1.6875 1.656250000701116 0.4374999975460927 -v -1.6875 1.531250000701116 0.4374999975460927 -v -1.6875 1.656250001402232 1.0624999950921854 -v -1.6875 1.531250001402232 1.0624999950921854 -v -1.8124999983640615 1.6562500024038274 0.43749999836406195 -v -1.8124999983640615 1.5312500024038274 0.43749999836406195 -v -1.8125 1.656250001402232 1.0624999950921854 -v -1.8125 1.531250001402232 1.0624999950921854 -v -1.8999999984976066 1.6875 0.2812500092146717 -v -1.9624999984976066 1.6875 0.2812500092146717 -v -1.8999999984976066 1.5 0.2812500092146717 -v -1.9624999984976066 1.5 0.2812500092146717 -v -1.8999999984976066 1.6875 0.4687500092146717 -v -1.9624999984976066 1.6875 0.4687500092146717 -v -1.8999999984976066 1.5 0.4687500092146717 -v -1.9624999984976066 1.5 0.4687500092146717 -v -1.8124999975460927 1.531250002904625 0.3125 -v -1.9999999950921854 1.53125000580925 0.4375 -v -1.9999999950921854 1.53125000580925 0.3125 -v -1.8124999975460927 1.656250002904625 0.3125 -v -1.9999999950921854 1.65625000580925 0.4375 -v -1.9999999950921854 1.65625000580925 0.3125 -v -1.75 1.65625 0.3125 -v -1.75 1.53125 0.3125 -v -1.8374999984976066 1.6875 0.9687500092146717 -v -1.8374999984976066 1.6875 1.0312500092146717 -v -1.8374999984976066 1.5 0.9687500092146717 -v -1.8374999984976066 1.5 1.0312500092146717 -v -1.6499999984976066 1.6875 0.9687500092146717 -v -1.6499999984976066 1.6875 1.0312500092146717 -v -1.6499999984976066 1.5 0.9687500092146717 -v -1.6499999984976066 1.5 1.0312500092146717 -v -1.9641801768540965 2.328228081796288 0.7037948700657086 -v -1.9329301768540965 2.328228081796288 0.7037948700657086 -v -1.9641801768540965 1.7705403472735197 0.7772158531894875 -v -1.9329301768540965 1.7705403472735197 0.7772158531894875 -v -1.9641801768540965 2.2711228727000154 0.27003774321466656 -v -1.9329301768540965 2.2711228727000154 0.27003774321466656 -v -1.9641801768540965 1.713435138177248 0.34345872633844543 -v -1.9329301768540965 1.713435138177248 0.34345872633844543 -v -1.9625000034054212 2.5000000000000004 1.0624999997996811 -v -2.025000003405421 2.5000000000000004 1.0624999997996811 -v -1.9625000034054212 2.1875000000000004 1.0624999997996811 -v -2.025000003405421 2.1875000000000004 1.0624999997996811 -v -1.9625000034054212 2.5 0.3124999997996811 -v -2.025000003405421 2.5 0.3124999997996811 -v -1.9625000034054212 2.1875 -2.0031887260074654e-10 -v -2.025000003405421 2.1875 -2.0031887260074654e-10 -v -1.9625000034054212 1.5 1.0624999997996811 -v -2.025000003405422 1.5 1.0624999997996811 -v -1.9625000034054212 1.5 -2.0031887260074654e-10 -v -2.025000003405422 1.5 -2.0031887260074654e-10 -v -3.000000003405421 2.499999999999999 1.0624999997996811 -v -2.937500003405421 2.1875 1.0624999997996811 -v -3.000000003405421 2.187499999999999 1.0624999997996811 -v -3.000000003405421 2.499999999999999 0.3124999997996811 -v -3.000000003405421 2.187499999999999 -2.0031887260074654e-10 -v -3.0000000034054226 1.4999999999999991 1.0624999997996811 -v -2.9375000034054226 1.4999999999999991 -2.0031887260074654e-10 -v -3.0000000034054226 1.4999999999999991 -2.0031887260074654e-10 -v -2.562499999999999 2.3750000000000004 1 -v -2.562499999999999 2.375 0.8125 -v -2.562499999999999 1.874999999999999 1 -v -2.562499999999999 1.8749999999999991 0.8125 -v -2.937499999999999 2.375 1 -v -2.937499999999999 2.375 0.8125 -v -2.937499999999999 1.8749999999999991 1 -v -2.937499999999999 1.8749999999999993 0.8125 -v -2.125 2.375 0.8125 -v -2.125 1.8749999999999998 1 -v -2.125 1.875 0.8125 -v -2.5 2.3750000000000004 1 -v -2.5 2.375 0.8125 -v -2.5 1.8749999999999998 1 -v -2.5 1.875 0.8125 -v -2 1.7499999999999998 1 -v -2 1.75 0.875 -v -2.9375 1.7499999999999991 1 -v -2.9375 1.7499999999999993 0.875 -v -2 1.875 1 -v -2 1.875 0.875 -v -2.937499999999999 1.8749999999999993 0.875 -v -2.0249999984976066 1.90625 0.8437500092146717 -v -2.0874999984976066 1.90625 0.8437500092146717 -v -2.0249999984976066 1.71875 0.8437500092146717 -v -2.0874999984976066 1.71875 0.8437500092146717 -v -2.0249999984976066 1.90625 1.0312500092146717 -v -2.0874999984976066 1.9062499999999998 1.0312500092146717 -v -2.0249999984976066 1.7187499999999998 1.0312500092146717 -v -2.0874999984976066 1.7187499999999998 1.0312500092146717 -v -2.874999998497608 1.9062499999999993 0.8437500092146717 -v -2.937499998497608 1.9062499999999993 0.8437500092146717 -v -2.874999998497608 1.7187499999999998 0.8437500092146717 -v -2.937499998497608 1.7187499999999998 0.8437500092146717 -v -2.874999998497608 1.9062499999999991 1.0312500092146717 -v -2.937499998497608 1.9062499999999991 1.0312500092146717 -v -2.874999998497608 1.7187499999999991 1.0312500092146717 -v -2.937499998497608 1.7187499999999991 1.0312500092146717 -v -2.874999998497608 1.7187500000000002 0.6562500092146717 -v -2.937499998497608 1.7187500000000002 0.6562500092146717 -v -2.874999998497608 1.5312500000000002 0.6562500092146717 -v -2.937499998497608 1.5312500000000002 0.6562500092146717 -v -2.874999998497608 1.5312500000000002 0.8437500092146717 -v -2.937499998497608 1.5312500000000002 0.8437500092146717 -v -2.874999998497608 1.6874999999999993 0.2812500092146717 -v -2.937499998497608 1.6874999999999991 0.2812500092146717 -v -2.874999998497608 1.4999999999999993 0.2812500092146717 -v -2.937499998497608 1.4999999999999991 0.2812500092146717 -v -2.874999998497608 1.6874999999999993 0.4687500092146717 -v -2.937499998497608 1.6874999999999993 0.4687500092146717 -v -2.874999998497608 1.4999999999999993 0.4687500092146717 -v -2.937499998497608 1.4999999999999993 0.4687500092146717 -v -2.8750000049078146 1.656249993189155 0.4375 -v -2.8750000049078146 1.656249993189155 0.3125 -v -2.087500004907814 1.6562499931891548 0.4375 -v -2.087500004907814 1.6562499931891548 0.3125 -v -2.8750000049078146 1.531249993189155 0.4375 -v -2.8750000049078146 1.531249993189155 0.3125 -v -2.087500004907814 1.5312499931891548 0.4375 -v -2.087500004907814 1.5312499931891548 0.3125 -v -2.0249999984976066 1.6875 0.2812500092146717 -v -2.0874999984976066 1.6875 0.2812500092146717 -v -2.0249999984976066 1.5 0.2812500092146717 -v -2.0874999984976066 1.5 0.2812500092146717 -v -2.0249999984976066 1.6875 0.4687500092146717 -v -2.0874999984976066 1.6875 0.4687500092146717 -v -2.0249999984976066 1.5 0.4687500092146717 -v -2.0874999984976066 1.5 0.4687500092146717 -v -2.6874999974960128 1.5625000043068566 0.8125 -v -2.6874999983306758 1.5625000028712375 0.6875 -v -2.8749999949920246 1.5625000086137144 0.8125 -v -2.8749999949920246 1.5625000086137144 0.6875 -v -2.6874999974960128 1.6875000043068566 0.8125 -v -2.6874999983306758 1.6875000028712375 0.6875 -v -2.8749999949920246 1.6875000086137144 0.8125 -v -2.8749999949920246 1.6875000086137144 0.6875 -v -2.5625 1.6874999999999991 0.5 -v -2.5625 1.5624999999999991 0.5 -v -2.5625 1.6874999999999991 0.625 -v -2.5625 1.5624999999999991 0.625 -v -2.625 1.6874999999999991 0.5 -v -2.625 1.5624999999999991 0.5 -v -2.6875 1.6874999999999991 0.625 -v -2.6875 1.5624999999999991 0.625 -v -2 1.5625 0.625 -v -2 1.5625 0.5 -v -2 1.6875 0.625 -v -2 1.6875 0.5 -v -2.625 1.6874999999999991 0.8125 -v -2.625 1.5624999999999991 0.8125 -v -2.5625 1.6874999999999991 0.6875 -v -2.5625 1.5624999999999991 0.6875 -v -2 1.5031249999999998 0.05937500000000018 -v -2 1.4968749999999993 0.05937500000000018 -v -2 1.5031249999999998 1.0593750000000002 -v -2 1.4968749999999993 1.0593750000000002 -v -2.9375 1.4999999999999991 0.05937500000000018 -v -1.0625 1.5031249999999998 0.05937500000000018 -v -1.0625 1.4968749999999993 0.05937500000000018 -v -1.0625000017027117 1.5015625 1.0609374998998407 -v -1.0625 1.4968749999999993 1.0593750000000002 -v -1.0000000034054226 2.5 1.0624999997996811 -v -1.0625000034054226 2.5 1.0624999997996811 -v -1.0000000034054226 2.1875 1.0624999997996811 -v -1.0625000034054226 2.1875 1.0624999997996811 -v -1.0000000034054226 2.5 0.3124999997996811 -v -1.0000000034054226 2.1875 -2.0031887260074654e-10 -v -1.0000000034054226 1.5 -2.0031887260074654e-10 -v -1.0625000034054226 1.5 -2.0031887260074654e-10 -v -3.0625 1.625 1.875 -v -3.0625 1.625 1 -v -3.9375 1.625 1.875 -v -3.9375 1.6249999999999998 1 -v -3.0625 1.625 0.125 -v -3.9375 1.625 0.125 -v -0.9375 1.5 2.9375 -v 0 1.5 1.9375 -v 0 1.5 2.9375 -v 0 2.4375 2.9375 -v 0 2.4375 1.9375 -v -0.9375 2.4375 2.9375 -v 0 2.4375 0.9375 -v 0 3.374999999999999 1.9375 -v 0 3.3749999999999996 0.9375 -v -0.9375 3.375 1.9375 -v 0 3.374999999999999 2.9375 -v -0.9375 3.375 2.9375 -vt 0.734375 0.21875 -vt 0.734375 0.265625 -vt 0.71875 0.265625 -vt 0.71875 0.21875 -vt 0.734375 0.21875 -vt 0.734375 0.265625 -vt 0.71875 0.265625 -vt 0.71875 0.21875 -vt 0.6875 0.265625 -vt 0.703125 0.265625 -vt 0.703125 0.21875 -vt 0.6875 0.21875 -vt 0.734375 0.21875 -vt 0.71875 0.21875 -vt 0.71875 0.265625 -vt 0.734375 0.265625 -vt 0.734375 0.21875 -vt 0.734375 0.265625 -vt 0.6875 0.265625 -vt 0.6875 0.21875 -vt 0.234375 0 -vt 0.234375 0.234375 -vt 0 0.234375 +v -0.0625 0 -1 +v -0.9375 0 -1 +v -1 0.1875 -0.25 +v -1 0.1875 -1 +v -1 0 -0.25 +v -1 0.0016 -1 +v -0.9375 0.1875 -0.25 +v -0.9375 0.1875 -1 +v -0.9375 0 -0.25 +v -0.0625 0.1875 -0.25 +v -0.0625 0.1875 -1 +v -0.0625 0 -0.25 +v 0 0.1875 -0.25 +v 0 0.1875 -1 +v 0 0 -1 +v 0 0 0.0625 +v 0.3125 0.1875 -0.75 +v 1.025 0.25 -0.5312 +v 1.0875 0.25 -0.5312 +v 1.025 0.0625 -0.5312 +v 1.0875 0.0625 -0.5312 +v 1.025 0.25 -0.3437 +v 1.0875 0.25 -0.3437 +v 1.025 0.0625 -0.3437 +v 1.0875 0.0625 -0.3437 +v 0.0625 0.9406 0.0031 +v 0.0625 0.0031 0.0031 +v 1 0.9406 0.0031 +v 1 0.0031 0.0031 +v 1.9375 0.9406 0.0031 +v 1.9375 0.0031 0.0031 +v -0.0625 0.125 -1 +v -0.0625 0.125 -0.0625 +v -0.9375 0.125 -1 +v -0.9375 0.125 -0.0625 +v 0.25 0.8125 2 +v 0.25 0.8125 1.9375 +v 0.25 0.3125 2 +v 0.25 0.3125 1.9375 +v 0.75 0.8125 2 +v 0.75 0.8125 1.9375 +v 0.75 0.3125 2 +v 0.75 0.3125 1.9375 +v 0.375 1 2 +v 0.375 1 1.9375 +v 0.375 0.8125 2 +v 0.375 0.8125 1.9375 +v 0.625 1 2 +v 0.625 1 1.9375 +v 0.625 0.8125 2 +v 0.625 0.8125 1.9375 +v 0.9984 0.6889 -0.9983 +v 2.375 0.75 0.8125 +v 0 0.1875 -0.9375 +v 0 0 -0.25 +v 0 0 -0.9375 +v 2 0.1875 0 +v 2 0 0 +v 2.0625 0.1875 0 +v 2.0625 0.1875 -0.9375 +v 2.0625 0 0 +v 2.0625 0 -0.9375 +v 2 0.1875 0.6875 +v 2 0 0.6875 +v 2.0625 0.1875 0.6875 +v 2.0625 0 0.6875 +v 2.9375 0.1875 -0.9375 +v 2.9375 0 -0.9375 +v 2.9375 0.1875 0.6875 +v 2.9375 0.1875 0 +v 2.9375 0 0.6875 +v 2.9375 0 0 +v 3 0.1875 0.6875 +v 3 0.1875 0 +v 3 0 0.6875 +v 3 0 0 +v 1 0.9344 0.0687 +v 2.375 0.9375 0.875 +v 2.375 0.9375 0.8125 +v 2.375 0.75 0.875 +v 2.625 0.9375 0.875 +v 2.625 0.9375 0.8125 +v 2.625 0.75 0.875 +v 2.625 0.75 0.8125 +v 3 0.6875 0.875 +v 2.9375 0.6875 0.875 +v 3 0 0.875 +v 2.9375 0 0.875 +v 3 0.6875 0.6875 +v 2.9375 0.6875 0.6875 +v 3 0.3125 0.875 +v 3 0.3125 0.6875 +v 2.9375 0.3125 0.6875 +v 2.9375 0.3125 0.875 +v 2 0.75 0.875 +v 2 0.6875 0.875 +v 3 0.75 0.875 +v 2 0.75 0.6875 +v 2 0.6875 0.6875 +v 3 0.75 0.6875 +v 2.0625 0.6875 0.875 +v 2.0625 0 0.875 +v 2 0 0.875 +v 2.0625 0.6875 0.6875 +v 2.0625 0.3125 0.875 +v 2.0625 0.3125 0.6875 +v 2 0.3125 0.6875 +v 2 0.3125 0.875 +v 0.5594 0.5625 -1 +v 3 1 1.875 +v 3 1 0.875 +v 1.9406 1 1.875 +v 1.9406 1 0.875 +v 3 0 1.875 +v 1.9375 0 1.875 +v 1.9375 0 0.875 +v 2 1 0.875 +v 2 0 1.875 +v 2 1 1.875 +v -0.625 0.9375 -0.0625 +v -0.625 0.9375 -0.125 +v -0.625 0.75 -0.0625 +v -0.625 0.75 -0.125 +v -0.375 0.9375 -0.0625 +v -0.375 0.9375 -0.125 +v -0.375 0.75 -0.0625 +v -0.375 0.75 -0.125 +v -1 0.75 -0.0625 +v -1 0.6875 -0.0625 +v 0 0.75 -0.0625 +v 0 0.6875 -0.0625 +v -1 0.75 -0.25 +v -1 0.6875 -0.25 +v 0 0.75 -0.25 +v 0 0.6875 -0.25 +v -0.9375 0.6875 -0.0625 +v -0.9375 0 -0.0625 +v -1 0 -0.0625 +v -0.9375 0.6875 -0.25 +v -0.9375 0.3125 -0.0625 +v -0.9375 0.3125 -0.25 +v -1 0.3125 -0.25 +v -1 0.3125 -0.0625 +v -0.0625 0.6875 -0.0625 +v 0 0 -0.0625 +v -0.0625 0 -0.0625 +v -0.0625 0.6875 -0.25 +v 0 0.3125 -0.0625 +v 0 0.3125 -0.25 +v -0.0625 0.3125 -0.25 +v -0.0625 0.3125 -0.0625 +v -0.9375 -0.0625 0.5 +v -0.0625 1.875 -0.0625 +v -0.0625 0.9375 -0.0625 +v 0.9375 2 1 +v 0.9375 2 0.0625 +v 0.9375 -0.0625 0.0625 +v 1.9375 2 1 +v 1.9375 2 0.0625 +v 1.9375 -0.0625 0.0609 +v 1.9375 1 0.0625 +v 0.9375 1 0.0625 +v 1.9375 1 1 +v 1.9375 -0.0625 1 +v 0.9375 2 1.9375 +v 1.9375 2 1.9375 +v 1.9375 1 1.9375 +v 1.9375 0 1.9375 +v 0.9375 0 1.9375 +v 0.9375 1 1.9375 +v -0.0625 2 1 +v -0.0625 2 0.0625 +v -0.0625 -0.0625 1 +v -0.0625 -0.0625 0.0625 +v -0.0625 1 0.0625 +v -0.0625 1 1 +v -0.0625 2 1.9375 +v -0.0625 1 1.9375 +v 1.625 1.625 2.125 +v 1.625 1.625 1.9375 +v 1.625 0.5 2.125 +v 1.625 0.5 1.9375 +v 1.8125 1.625 2.125 +v 1.8125 1.625 1.9375 +v 1.8125 0.5 2.125 +v 1.8125 0.5 1.9375 +v 1.625 1.0625 2.125 +v 1.8125 1.0625 2.125 +v 1.8125 1.0625 1.9375 +v 1.625 1.0625 1.9375 +v 1.625 0.4375 2.125 +v 1.625 0.3125 1.9375 +v 1.8125 0.4375 2.125 +v 1.8125 0.3125 1.9375 +v 1.625 1.8125 2.125 +v 1.625 1.8125 1.9375 +v 0.6875 1.8125 2.125 +v 0.6875 1.8125 1.9375 +v 0.6875 1.625 2.125 +v 0.6875 1.625 1.9375 +v 0.6875 2.1875 2.125 +v 0.6875 2.1875 1.9375 +v 0.6875 2.3125 2.125 +v 0.6875 2.375 1.9375 +v 0.5 2.1875 2.125 +v 0.5 2.1875 1.9375 +v 0.5 2.3125 2.125 +v 0.5 2.375 1.9375 +v 0.5 1.8125 2.125 +v 0.5 1.8125 1.9375 +v 0.0625 2.1875 2.125 +v 0.0625 2.1875 1.9375 +v 0.0625 1.375 2.125 +v 0.0625 1.375 1.9375 +v 0.25 2.1875 2.125 +v 0.25 2.1875 1.9375 +v 0.25 1.375 2.125 +v 0.25 1.375 1.9375 +v 1.25 1.375 2.125 +v 1.25 1.375 1.9375 +v 1.25 1.1875 2.125 +v 1.25 1.1875 1.9375 +v 0.25 1.1875 2.125 +v 0.25 1.1875 1.9375 +v 1.25 0.5 2.125 +v 1.25 0.5 1.9375 +v 1.4375 1.1875 2.125 +v 1.4375 1.1875 1.9375 +v 1.4375 0.5 2.125 +v 1.4375 0.5 1.9375 +v 1.4375 1.3125 2.125 +v 1.4375 1.3125 1.9375 +v 1.25 0.4375 2.125 +v 1.25 0.3125 1.9375 +v 1.4375 0.4375 2.125 +v 1.4375 0.3125 1.9375 +v 1.8125 1.75 2.125 +v 1.8125 1.75 1.9375 +v 0.5 1.6875 2.125 +v 0.5 1.6875 1.9375 +v 0.0625 1.25 2.125 +v 0.0625 1.25 1.9375 +v 0.25 2.3125 2.125 +v 0.25 2.375 1.9375 +v 0.0625 2.3125 2.125 +v 0.0625 2.375 1.9375 +v 1.875 -0.0625 1.9375 +v 1.875 -0.0625 1.875 +v 3 -0.0625 1.9375 +v 3 -0.0625 1.875 +v 1.875 0 1.9375 +v 1.875 0 1.875 +v -1 -0.4992 -1 +v -1 -1 -1 +v -1 -0.5 0.5 +v -1 -1 0.5 +v 1 -0.5 -1 +v 1 -1 -1 +v 1 -1 0.5 +v 3 -0.4992 -1 +v 3 -1 -1 +v 3 -0.5 0.5 +v 3 -1 0.5 +v 1 -0.5 2 +v 1 -1 2 +v -1 -0.4992 2 +v -1 -1 2 +v 3 -0.5 1.9375 +v 3 -1 1.9375 +v 1 -0.5 1.9375 +v 1 -1 1.9375 +v 1 -0.75 1.9375 +v 3 -0.75 1.9375 +v 2 -0.75 1.9375 +v 2 -1 1.9375 +v 2 -1 0.5 +v 2 -0.5 1.9375 +v -1 -0.5 -0.9375 +v 3 -0.5 -0.9375 +v -1 -0.5 1.9375 +v -0.9375 -0.5 1.9375 +v -0.9375 -0.5 -0.9375 +v 2.9375 -0.5 1.9375 +v 2.9375 -0.5 -0.9375 +v 2.125 -0.0625 -1 +v -1 0.0016 -0.875 +v -1 -0.4969 -0.875 +v -0.875 0.0031 -0.875 +v -0.875 0.0016 -1 +v -0.875 -0.4969 -0.875 +v -0.875 -0.4969 -1 +v -1 0.0031 2 +v -1 0.0016 1.875 +v -1 -0.4969 1.875 +v -0.875 0.0016 2 +v -0.875 0.0031 1.875 +v -0.875 -0.4969 2 +v -0.875 -0.4969 1.875 +v -1 0 1.125 +v -1 -0.0625 1.125 +v -1 -0.0625 1.875 +v -0.9375 0 1.125 +v -0.9375 -0.0625 1.125 +v -0.9375 0 1.875 +v -0.9375 -0.0625 1.875 +v -1 -0.0625 -0.875 +v -1 0 0.125 +v -1 -0.0625 0.125 +v -0.9375 0 -0.875 +v -0.9375 -0.0625 -0.875 +v -0.9375 0 0.125 +v -0.9375 -0.0625 0.125 +v -0.875 -0.0625 -0.9375 +v -0.875 -0.0625 -1 +v 0.125 -0.0625 -0.9375 +v 0.125 -0.0625 -1 +v -0.875 0 -0.9375 +v 0.125 0 -0.9375 +v 0.125 0 -1 +v 2.125 -0.0625 -0.9375 +v 2.875 -0.0625 -0.9375 +v 2.875 -0.0625 -1 +v 2.125 0 -0.9375 +v 2.125 0 -1 +v 2.875 0 -0.9375 +v 2.875 0.0016 -1 +v 1.125 -0.0625 -0.9375 +v 1.125 -0.0625 -1 +v 1.125 0 -0.9375 +v 1.125 0 -1 +v 2.9375 -0.0625 -0.875 +v 2.9375 0 0.125 +v 2.9375 -0.0625 0.125 +v 3 0.0016 -0.875 +v 3 -0.0625 -0.875 +v 3 0 0.125 +v 3 -0.0625 0.125 +v 2.9375 0 1.125 +v 2.9375 -0.0625 1.125 +v 3 0 1.125 +v 3 -0.0625 1.125 +v 2.9375 0 1.875 +v 2.9375 -0.0625 1.875 +v -0.875 -0.0625 2 +v -0.875 -0.0625 1.9375 +v 0.125 -0.0625 2 +v 0.125 -0.0625 1.9375 +v -0.875 0 1.9375 +v 0.125 0 2 +v 0.125 0 1.9375 +v 1 -0.0625 2 +v 1 -0.0625 1.9375 +v 1 0 2 +v 1 0 1.9375 +v 2.9375 -0.5 0.5 +v 2.9375 -0.0625 0.5 +v 2.9375 -0.0625 1.9375 +v 2 -0.0625 1.9375 +v 2.9375 -0.25 0.5 +v 2.9375 -0.25 1.9375 +v 2 -0.25 1.9375 +v 1 -0.25 1.9375 +v 2.9375 -0.5625 -0.9375 +v 2.9375 -0.0625 -0.9375 +v 2.9375 -0.5625 0.5 +v 1 -0.5625 -0.9375 +v 1 -0.0625 -0.9375 +v 2.9375 -0.3125 -0.9375 +v 1 -0.3125 -0.9375 +v 2.9375 -0.3125 0.5 +v -0.9375 -0.5625 -0.9375 +v -0.9375 -0.0625 -0.9375 +v -0.9375 -0.5625 0.5 +v -0.9375 -0.3125 -0.9375 +v -0.9375 -0.3125 0.5 +v 1 -0.5625 1.9375 +v -0.9375 -0.5625 1.9375 +v -0.9375 -0.0625 1.9375 +v 1 -0.3125 1.9375 +v -0.9375 -0.3125 1.9375 +v 2.875 0.0031 -0.875 +v 2.875 -0.4969 -0.875 +v 2.875 -0.4969 -1 +v 3 0.0016 -1 +v 3 -0.4969 -0.875 +v 3 -1 2 +v 3 -0.875 2 +v 2 -1 2 +v 2 -0.875 2 +v 2 -0.875 1.9375 +v 1.875 -0.125 2 +v 1.875 -0.125 1.9375 +v 1.875 -0.875 2 +v 1.875 -0.875 1.9375 +v 2 -0.125 2 +v 2.125 -0.125 2 +v 2.125 -0.125 1.9375 +v 2.125 -0.875 2 +v 2.125 -0.875 1.9375 +v 1 -0.875 2 +v 1 -0.875 1.9375 +v 1 -0.125 2 +v 1 -0.125 1.9375 +v 1.125 -0.125 2 +v 1.125 -0.125 1.9375 +v 1.125 -0.875 2 +v 1.125 -0.875 1.9375 +v 2 0 2 +v 3 0 2 +v 3 -0.125 2 +v 2.875 -0.125 2 +v 2.875 -0.875 2 +v 2.25 -0.25 2.0125 +v 2.25 -0.25 1.95 +v 2.25 -0.75 2.0125 +v 2.25 -0.75 1.95 +v 2.75 -0.25 2.0125 +v 2.75 -0.25 1.95 +v 2.75 -0.75 2.0125 +v 2.75 -0.75 1.95 +v 1.25 -0.25 2.0125 +v 1.25 -0.25 1.95 +v 1.25 -0.75 2.0125 +v 1.25 -0.75 1.95 +v 1.75 -0.25 2.0125 +v 1.75 -0.25 1.95 +v 1.75 -0.75 2.0125 +v 1.75 -0.75 1.95 +v 0.0625 0.9969 -0.6812 +v 0.0625 0.9344 -0.6812 +v 0.0625 0.9969 0.0687 +v 0.0625 0.9344 0.0687 +v 1 0.9969 -0.6812 +v 1 0.9344 -0.6812 +v 1 0.9969 0.0687 +v 0.5 0.9969 -0.6812 +v 0.5 0.9969 0.0687 +v 0.5 0.9344 0.0687 +v 0.5 0.9344 -0.6812 +v 0.0625 0.9554 -0.6431 +v 0.0625 0.9998 -0.6874 +v 0.0625 0.646 -0.9524 +v 0.0617 0.6882 -0.9992 +v 1 0.9554 -0.6431 +v 1 0.9996 -0.6873 +v 1 0.646 -0.9524 +v 0.5625 0.9996 -0.6873 +v 0.5609 0.6889 -0.9983 +v 0.5625 0.646 -0.9524 +v 0.5625 0.9554 -0.6431 +v 1.9375 0.9969 -0.6812 +v 1.9375 0.9344 -0.6812 +v 1.9375 0.9969 0.0687 +v 1.9375 0.9344 0.0687 +v 1.4375 0.9969 -0.6812 +v 1.4375 0.9969 0.0687 +v 1.4375 0.9344 0.0687 +v 1.4375 0.9344 -0.6812 +v 1.9375 0.9554 -0.6431 +v 1.9375 0.9998 -0.6874 +v 1.9375 0.646 -0.9524 +v 1.9367 0.6882 -0.9992 +v 1.5 0.9996 -0.6873 +v 1.4984 0.6889 -0.9983 +v 1.5 0.646 -0.9524 +v 1.5 0.9554 -0.6431 +v 1.125 0.875 0 +v 0.9969 0.5625 -0.9375 +v 0.9969 0.5625 -1 +v 1.9344 0.5625 -0.9375 +v 1.9344 0.5625 -1 +v 0.9969 0.6875 -0.9375 +v 1.9344 0.6875 -0.9375 +v 1.4969 0.5625 -1 +v 1.4969 0.5625 -0.9375 +v 1.4969 0.6875 -0.9375 +v 0.0594 0.5625 -0.9375 +v 0.0594 0.5625 -1 +v 0.0594 0.6875 -0.9375 +v 0.5594 0.5625 -0.9375 +v 0.5594 0.6875 -0.9375 +v 0.025 0.1875 0 +v 0.025 0.1875 -0.125 +v 0.9625 0.1875 0 +v 0.9625 0.1875 -0.125 +v 0.025 0.3125 0 +v 0.025 0.3125 -0.125 +v 0.9625 0.3125 0 +v 0.9625 0.3125 -0.125 +v 0.9 0.3438 -0.1562 +v 0.9625 0.3438 -0.1562 +v 0.9 0.1563 -0.1562 +v 0.9625 0.1563 -0.1562 +v 0.9 0.3438 0.0313 +v 0.9625 0.3438 0.0313 +v 0.9 0.1563 0.0313 +v 0.9625 0.1563 0.0313 +v 0.05 0.3438 -0.1562 +v 0.1125 0.3438 -0.1562 +v 0.05 0.1563 -0.1562 +v 0.1125 0.1563 -0.1562 +v 0.05 0.3438 0.0313 +v 0.1125 0.3438 0.0313 +v 0.05 0.1563 0.0313 +v 0.1125 0.1563 0.0313 +v 0.0625 0.1875 -0.75 +v 0.0625 0 -0.75 +v 0.0625 0.1875 -0.1875 +v 0.0625 0 -0.1875 +v 0.5625 0.1875 -0.75 +v 0.5625 0 -0.75 +v 0.5625 0.1875 -0.1875 +v 0.5625 0 -0.1875 +v 0.0625 0.1875 -0.4375 +v 0.5625 0.1875 -0.4375 +v 0.5625 0 -0.4375 +v 0.0625 0 -0.4375 +v 0.3125 0.1875 -0.4375 +v 0.3125 0 -0.75 +v 0.3125 0 -0.1875 +v 0.3125 0.1875 -0.1875 +v 0.625 0.8125 -0.0625 +v 0.625 0.8125 -0.125 +v 0.625 0.5625 -0.0625 +v 0.625 0.5625 -0.125 +v 0.875 0.8125 -0.0625 +v 0.875 0.8125 -0.125 +v 0.875 0.5625 -0.0625 +v 0.875 0.5625 -0.125 +v 0.1875 0.8125 -0.0625 +v 0.1875 0.8125 -0.125 +v 0.1875 0.4375 -0.0625 +v 0.1875 0.4375 -0.125 +v 0.5625 0.8125 -0.0625 +v 0.5625 0.8125 -0.125 +v 0.5625 0.4375 -0.0625 +v 0.5625 0.4375 -0.125 +v 0.125 0.875 0.0625 +v 0.125 0.875 -0.0625 +v 0.125 0.375 0.0625 +v 0.125 0.375 -0.0625 +v 0.875 0.875 0.0625 +v 0.875 0.875 -0.0625 +v 0.875 0.375 0.0625 +v 0.875 0.375 -0.0625 +v 0.875 0.625 -0.0625 +v 0.125 0.625 -0.0625 +v 0.125 0.625 0.0625 +v 0.875 0.625 0.0625 +v 0.5 0.625 -0.0625 +v 0.5 0.375 -0.0625 +v 0.5 0.375 0.0625 +v 0.5 0.875 0.0625 +v 0.5 0.875 -0.0625 +v 0.6875 0.1563 -0.5625 +v 0.6875 0.0313 -0.5625 +v 0.6875 0.1563 0.0625 +v 0.6875 0.0313 0.0625 +v 0.8125 0.1563 -0.5625 +v 0.8125 0.0313 -0.5625 +v 0.8125 0.1563 0.0625 +v 0.8125 0.0313 0.0625 +v 0.9 0.1875 -0.7187 +v 0.9625 0.1875 -0.7187 +v 0.9 0 -0.7187 +v 0.9625 0 -0.7187 +v 0.9 0.1875 -0.5312 +v 0.9625 0.1875 -0.5312 +v 0.9 0 -0.5312 +v 0.9625 0 -0.5312 +v 0.8125 0.0313 -0.6875 +v 1 0.0313 -0.5625 +v 1 0.0313 -0.6875 +v 0.8125 0.1563 -0.6875 +v 1 0.1563 -0.5625 +v 1 0.1563 -0.6875 +v 0.75 0.1563 -0.6875 +v 0.75 0.0313 -0.6875 +v 0.8375 0.1875 -0.0312 +v 0.8375 0.1875 0.0313 +v 0.8375 0 -0.0312 +v 0.8375 0 0.0313 +v 0.65 0.1875 -0.0312 +v 0.65 0.1875 0.0313 +v 0.65 0 -0.0312 +v 0.65 0 0.0313 +v 0.9642 0.8282 -0.2962 +v 0.9329 0.8282 -0.2962 +v 0.9642 0.2705 -0.2228 +v 0.9329 0.2705 -0.2228 +v 0.9642 0.7711 -0.73 +v 0.9329 0.7711 -0.73 +v 0.9642 0.2134 -0.6565 +v 0.9329 0.2134 -0.6565 +v 0.9625 1 0.0625 +v 1.025 1 0.0625 +v 0.9625 0.6875 0.0625 +v 1.025 0.6875 0.0625 +v 0.9625 1 -0.6875 +v 1.025 1 -0.6875 +v 0.9625 0.6875 -1 +v 1.025 0.6875 -1 +v 0.9625 0 0.0625 +v 1.025 0 0.0625 +v 0.9625 0 -1 +v 1.025 0 -1 +v 2 1 0.0625 +v 1.9375 0.6875 0.0625 +v 2 0.6875 0.0625 +v 2 1 -0.6875 +v 2 0.6875 -1 +v 2 0 0.0625 +v 1.9375 0 -1 +v 2 0 -1 +v 1.5625 0.875 0 +v 1.5625 0.875 -0.1875 +v 1.5625 0.375 0 +v 1.5625 0.375 -0.1875 +v 1.9375 0.875 0 +v 1.9375 0.875 -0.1875 +v 1.9375 0.375 0 +v 1.9375 0.375 -0.1875 +v 1.125 0.875 -0.1875 +v 1.125 0.375 0 +v 1.125 0.375 -0.1875 +v 1.5 0.875 0 +v 1.5 0.875 -0.1875 +v 1.5 0.375 0 +v 1.5 0.375 -0.1875 +v 1 0.25 0 +v 1 0.25 -0.125 +v 1.9375 0.25 0 +v 1.9375 0.25 -0.125 +v 1 0.375 0 +v 1 0.375 -0.125 +v 1.9375 0.375 -0.125 +v 1.025 0.4063 -0.1562 +v 1.0875 0.4063 -0.1562 +v 1.025 0.2188 -0.1562 +v 1.0875 0.2188 -0.1562 +v 1.025 0.4063 0.0313 +v 1.0875 0.4063 0.0313 +v 1.025 0.2188 0.0313 +v 1.0875 0.2188 0.0313 +v 1.875 0.4063 -0.1562 +v 1.9375 0.4063 -0.1562 +v 1.875 0.2188 -0.1562 +v 1.9375 0.2188 -0.1562 +v 1.875 0.4063 0.0313 +v 1.9375 0.4063 0.0313 +v 1.875 0.2188 0.0313 +v 1.9375 0.2188 0.0313 +v 1.875 0.2188 -0.3437 +v 1.9375 0.2188 -0.3437 +v 1.875 0.0313 -0.3437 +v 1.9375 0.0313 -0.3437 +v 1.875 0.0313 -0.1562 +v 1.9375 0.0313 -0.1562 +v 1.875 0.1875 -0.7187 +v 1.9375 0.1875 -0.7187 +v 1.875 0 -0.7187 +v 1.9375 0 -0.7187 +v 1.875 0.1875 -0.5312 +v 1.9375 0.1875 -0.5312 +v 1.875 0 -0.5312 +v 1.9375 0 -0.5312 +v 1.875 0.1563 -0.5625 +v 1.875 0.1563 -0.6875 +v 1.0875 0.1563 -0.5625 +v 1.0875 0.1563 -0.6875 +v 1.875 0.0313 -0.5625 +v 1.875 0.0313 -0.6875 +v 1.0875 0.0313 -0.5625 +v 1.0875 0.0313 -0.6875 +v 1.025 0.1875 -0.7187 +v 1.0875 0.1875 -0.7187 +v 1.025 0 -0.7187 +v 1.0875 0 -0.7187 +v 1.025 0.1875 -0.5312 +v 1.0875 0.1875 -0.5312 +v 1.025 0 -0.5312 +v 1.0875 0 -0.5312 +v 1.6875 0.0625 -0.1875 +v 1.6875 0.0625 -0.3125 +v 1.875 0.0625 -0.1875 +v 1.875 0.0625 -0.3125 +v 1.6875 0.1875 -0.1875 +v 1.6875 0.1875 -0.3125 +v 1.875 0.1875 -0.1875 +v 1.875 0.1875 -0.3125 +v 1.5625 0.1875 -0.5 +v 1.5625 0.0625 -0.5 +v 1.5625 0.1875 -0.375 +v 1.5625 0.0625 -0.375 +v 1.625 0.1875 -0.5 +v 1.625 0.0625 -0.5 +v 1.6875 0.1875 -0.375 +v 1.6875 0.0625 -0.375 +v 1 0.0625 -0.375 +v 1 0.0625 -0.5 +v 1 0.1875 -0.375 +v 1 0.1875 -0.5 +v 1.625 0.1875 -0.1875 +v 1.625 0.0625 -0.1875 +v 1.5625 0.1875 -0.3125 +v 1.5625 0.0625 -0.3125 +v 1 0.0031 -0.9406 +v 1 -0.0031 -0.9406 +v 1 0.0031 0.0594 +v 1 -0.0031 0.0594 +v 1.9375 0 -0.9406 +v 0.0625 0.0031 -0.9406 +v 0.0625 -0.0031 -0.9406 +v 0.0625 -0.0008 0.0602 +v 0 1 0.0625 +v 0.0625 1 0.0625 +v 0 0.6875 0.0625 +v 0.0625 0.6875 0.0625 +v 0 1 -0.6875 +v 0 0.6875 -1 +v 0.0625 0 -1 +v 2.0625 0.125 0.875 +v 2.0625 0.125 0 +v 2.9375 0.125 0.875 +v 2.9375 0.125 0 +v -0.0625 0 1.9375 +v -1 0 0.9375 +v -1 0 1.9375 +v -1 0.9375 1.9375 +v -1 0.9375 0.9375 +v -0.0625 0.9375 1.9375 +v -1 0.9375 -0.0625 +v -1 1.875 0.9375 +v -1 1.875 -0.0625 +v -0.0625 1.875 0.9375 +v -1 1.875 1.9375 +v -0.0625 1.875 1.9375 +v 2.875 -0.125 1.9375 +v 3 -0.125 1.9375 +v 2.875 -0.875 1.9375 +v 3 -0.875 1.9375 +v 2 0 1.9375 +v 3 0 1.9375 +v 2 -0.125 1.9375 +v 3 0 -0.9375 +v 3 0.125 0 +v 2.0625 0.125 -0.9375 +v 3 0.125 -0.9375 +v 2 0.1875 -1 +v 3 0.1875 -1 +v 1.9438 -0.0625 1.875 +v 1.9438 -0.0625 0.875 +v 1.625 1 0.0625 +v 1.625 2 0.0625 +v 1.625 2 1 +v 1.625 2 1.9375 +v 1.625 1 1.9375 +v 1.625 0 1.9375 +v 1.625 -0.0625 0.0614 +v 1.625 1.75 0.0625 +v 0.9375 1.75 0.0625 +v -0.0625 1.75 0.0625 +v -0.0625 1.75 1 +v -0.0625 1.75 1.9375 +v 0.9375 1.75 1.9375 +v 1.625 1.75 1.9375 +v 1.9375 1.75 1.9375 +v 1.9375 1.75 0.0625 +v 0.9375 1.1875 0.0625 +v 1.625 1.1875 0.0625 +v 1.9375 1.1875 0.0625 +v 1.9375 1.1875 1.9375 +v 1.625 1.1875 1.9375 +v 0.9375 1.1875 1.9375 +v -0.0625 1.1875 1.9375 +v -0.0625 1.1875 1 +v -0.0625 1.1875 0.0625 +v 1 1.1875 0.0625 +v 1 1.75 0.0625 +v 1 2 0.0625 +v 1 2 1 +v 1 2 1.9375 +v 1 1.75 1.9375 +v 1 1.1875 1.9375 +v 1 1 1.9375 +v 1 1 0.0625 +v 1 -0.0625 0.0624 +v 2 -0.125 0.0313 +v -0.125 -0.125 0.0313 +v 2 -0.125 0.9688 +v -0.125 -0.125 0.9688 +v 0.9375 -0.125 0.9688 +v 0.9375 -0.125 0.0313 +v 1.75 0.0625 0.875 +v 1.75 0.0625 0.8125 +v 1.75 -0.125 0.875 +v 1.75 -0.125 0.8125 +v 0.125 0.0625 0.875 +v 0.125 0.0625 0.8125 +v 0.125 -0.125 0.875 +v 0.125 -0.125 0.8125 +v 0.9375 0 1.75 +v 0.9375 0 0.875 +v 0.9375 -0.125 0.875 +v -0.0625 0 1.75 +v -0.0625 0 0.875 +v -0.0625 -0.125 0.875 +v 1.9375 0 1.75 +v 1.9375 -0.125 0.875 +v 0.125 0.9375 1.75 +v 0.125 0.4375 1.75 +v -0.0625 0.9375 1.75 +v -0.0625 0.4375 1.75 +v 0.125 0.9375 1.8125 +v 0.125 0.4375 1.8125 +v -0.0625 0.9375 1.8125 +v -0.0625 0.4375 1.8125 +v 0.125 0.9375 0.875 +v 0.125 0.9375 0.8125 +v 0.125 0.4375 0.875 +v 0.125 0.4375 0.8125 +v -0.0625 0.9375 0.875 +v -0.0625 0.4375 0.875 +v 0.125 1 0.8125 +v -0.0625 1 0.8125 +v -0.0625 0.9375 0.8125 +v 0.0625 0.9375 1.7688 +v 0.0625 0.9375 1.6063 +v 0.0625 0.4375 1.7688 +v 0.0625 0.4375 1.6063 +v 0 0.9375 1.7688 +v 0 0.9375 1.6063 +v 0 0.4375 1.7688 +v 0 0.4375 1.6063 +v 0.0625 0.9375 1.5813 +v 0.0625 0.9375 1.4188 +v 0.0625 0.4375 1.5813 +v 0.0625 0.4375 1.4188 +v 0 0.9375 1.5813 +v 0 0.9375 1.4188 +v 0 0.4375 1.5813 +v 0 0.4375 1.4188 +v 0.0625 0.9375 1.3938 +v 0.0625 0.9375 1.2313 +v 0.0625 0.4375 1.3938 +v 0.0625 0.4375 1.2313 +v 0 0.9375 1.3938 +v 0 0.9375 1.2313 +v 0 0.4375 1.3938 +v 0 0.4375 1.2313 +v 0.0625 0.9375 1.2063 +v 0.0625 0.9375 1.0438 +v 0.0625 0.4375 1.2063 +v 0.0625 0.4375 1.0438 +v 0 0.9375 1.2063 +v 0 0.9375 1.0438 +v 0 0.4375 1.2063 +v 0 0.4375 1.0438 +v 0.0625 0.9375 1.0188 +v 0.0625 0.9375 0.8563 +v 0.0625 0.4375 1.0188 +v 0.0625 0.4375 0.8563 +v 0 0.9375 1.0188 +v 0 0.9375 0.8563 +v 0 0.4375 1.0188 +v 0 0.4375 0.8563 +v 0.125 1 1.8125 +v -0.0625 1 1.8125 +v -0.0625 0.4375 0.8125 +v 0.125 -0.0625 0.875 +v -0.0625 -0.0625 0.875 +v 0.125 -0.0625 0.8125 +v -0.0625 -0.0625 0.8125 +v 0.125 -0.0625 1.75 +v 0.125 -0.0625 1.8125 +v -0.0625 -0.0625 1.75 +v 0.125 -0.125 1.8125 +v -0.0625 -0.125 1.8125 +v -0.0625 -0.0625 1.8125 +v 0.0625 -0.0625 0.8563 +v 0.0625 -0.0625 1.0188 +v 0 -0.0625 0.8563 +v 0 -0.0625 1.0188 +v 0.0625 -0.0625 1.0438 +v 0.0625 -0.0625 1.2063 +v 0 -0.0625 1.0438 +v 0 -0.0625 1.2063 +v 0.0625 -0.0625 1.2313 +v 0.0625 -0.0625 1.3938 +v 0 -0.0625 1.2313 +v 0 -0.0625 1.3938 +v 0.0625 -0.0625 1.4188 +v 0.0625 -0.0625 1.5813 +v 0 -0.0625 1.4188 +v 0 -0.0625 1.5813 +v 0.0625 -0.0625 1.6063 +v 0.0625 -0.0625 1.7688 +v 0 -0.0625 1.6063 +v 0 -0.0625 1.7688 +v -0.0625 -0.125 0.8125 +v 1.75 0.9375 0.875 +v 1.75 0.4375 0.875 +v 1.9375 0.9375 0.875 +v 1.9375 0.4375 0.875 +v 1.75 0.9375 0.8125 +v 1.75 0.4375 0.8125 +v 1.9375 0.9375 0.8125 +v 1.9375 0.4375 0.8125 +v 1.75 0.9375 1.75 +v 1.75 0.9375 1.8125 +v 1.75 0.4375 1.75 +v 1.75 0.4375 1.8125 +v 1.9375 0.9375 1.75 +v 1.9375 0.4375 1.75 +v 1.75 1 1.8125 +v 1.9375 1 1.8125 +v 1.9375 0.9375 1.8125 +v 1.8125 0.9375 0.8563 +v 1.8125 0.9375 1.0188 +v 1.8125 0.4375 0.8563 +v 1.8125 0.4375 1.0188 +v 1.875 0.9375 0.8563 +v 1.875 0.9375 1.0188 +v 1.875 0.4375 0.8563 +v 1.875 0.4375 1.0188 +v 1.8125 0.9375 1.0438 +v 1.8125 0.9375 1.2063 +v 1.8125 0.4375 1.0438 +v 1.8125 0.4375 1.2063 +v 1.875 0.9375 1.0438 +v 1.875 0.9375 1.2063 +v 1.875 0.4375 1.0438 +v 1.875 0.4375 1.2063 +v 1.8125 0.9375 1.2313 +v 1.8125 0.9375 1.3938 +v 1.8125 0.4375 1.2313 +v 1.8125 0.4375 1.3938 +v 1.875 0.9375 1.2313 +v 1.875 0.9375 1.3938 +v 1.875 0.4375 1.2313 +v 1.875 0.4375 1.3938 +v 1.8125 0.9375 1.4188 +v 1.8125 0.9375 1.5813 +v 1.8125 0.4375 1.4188 +v 1.8125 0.4375 1.5813 +v 1.875 0.9375 1.4188 +v 1.875 0.9375 1.5813 +v 1.875 0.4375 1.4188 +v 1.875 0.4375 1.5813 +v 1.8125 0.9375 1.6063 +v 1.8125 0.9375 1.7688 +v 1.8125 0.4375 1.6063 +v 1.8125 0.4375 1.7688 +v 1.875 0.9375 1.6063 +v 1.875 0.9375 1.7688 +v 1.875 0.4375 1.6063 +v 1.875 0.4375 1.7688 +v 1.75 1 0.8125 +v 1.9375 1 0.8125 +v 1.9375 0.4375 1.8125 +v 1.75 -0.0625 1.75 +v 1.9375 -0.0625 1.75 +v 1.75 -0.0625 1.8125 +v 1.9375 -0.0625 1.8125 +v 1.75 -0.0625 0.875 +v 1.75 -0.0625 0.8125 +v 1.9375 -0.0625 0.875 +v 1.9375 -0.125 0.8125 +v 1.9375 -0.0625 0.8125 +v 1.8125 -0.0625 1.7688 +v 1.8125 -0.0625 1.6063 +v 1.875 -0.0625 1.7688 +v 1.875 -0.0625 1.6063 +v 1.8125 -0.0625 1.5813 +v 1.8125 -0.0625 1.4188 +v 1.875 -0.0625 1.5813 +v 1.875 -0.0625 1.4188 +v 1.8125 -0.0625 1.3938 +v 1.8125 -0.0625 1.2313 +v 1.875 -0.0625 1.3938 +v 1.875 -0.0625 1.2313 +v 1.8125 -0.0625 1.2063 +v 1.8125 -0.0625 1.0438 +v 1.875 -0.0625 1.2063 +v 1.875 -0.0625 1.0438 +v 1.8125 -0.0625 1.0188 +v 1.8125 -0.0625 0.8563 +v 1.875 -0.0625 1.0188 +v 1.875 -0.0625 0.8563 +v 1.75 -0.125 1.8125 +v 1.9375 -0.125 1.8125 +v 1.75 0.125 1.8125 +v 1.75 0.125 1.75 +v 1.75 -0.125 1.75 +v 1.125 0.125 1.8125 +v 1.125 0.125 1.75 +v 1.125 -0.125 1.8125 +v 1.125 -0.125 1.75 +v -0.0625 0.9375 0.0625 +v -0.0625 0 0.0625 +v -0.0625 1.875 0.0625 +v 0 0.75 0.0625 +v -0.0625 0.75 0.0625 +v -0.0625 0.75 -0.0625 +v 0.8125 2.9375 1.1875 +v 0.8125 2.9375 1.8125 +v 0.8125 2.5 1.1875 +v 0.8125 2.5 1.8125 +v 0.1875 2.9375 1.1875 +v 0.1875 2.9375 1.8125 +v 0.1875 2.5 1.1875 +v 0.1875 2.5 1.8125 +v 0.25 3 1.75 +v 0.25 3 1.25 +v 0.75 3 1.75 +v 0.75 3 1.25 +v 0.0625 2.5 1.9375 +v 0.0625 2 1.9375 +v 0.9375 2.5 1.9375 +v 0.0625 2.5 1.125 +v 0.0625 2 1.125 +v 0.9375 2.5 1.125 +v 0.9375 2 1.125 +v 0.5 2.5 1.125 +v 0.5 2 1.125 +v 0.5 2 1.9375 +v 0.5 2.5 1.9375 +v 0.5 2.25 1.125 +v 0.9375 2.25 1.125 +v 0.9375 2.25 1.9375 +v 0.5 2.25 1.9375 +v 0.0625 2.25 1.9375 +v 0.0625 2.25 1.125 +v 0.9375 2.25 1.5625 +v 0.9375 2 1.5625 +v 0.0625 2 1.5625 +v 0.0625 2.25 1.5625 +v 0.0625 2.5 1.5625 +v 0.5 2.5 1.5625 +v 0.9375 2.5 1.5625 +v 0.1875 2.1875 1.125 +v 0.1875 2.1875 0.9375 +v 0.375 2.1875 0.9375 +v 0.375 2.1875 1.125 +v 0.1875 2.3125 0.9375 +v 0.375 2.3125 0.9375 +v 0.375 2.375 1.125 +v 0.1875 2.375 1.125 +v 0.375 2 1.125 +v 0.375 2 0.9375 +v 0.1875 2 0.9375 +v 0.1875 2 1.125 +v 0.625 2.1875 0.9375 +v 0.625 2 0.9375 +v 0.4375 2 0.9375 +v 0.4375 2.1875 0.9375 +v 0.625 2.1875 1.125 +v 0.625 2 1.125 +v 0.625 2.3125 0.9375 +v 0.625 2.375 1.125 +v 0.4375 2.3125 0.9375 +v 0.4375 2.375 1.125 +v 0.4375 2.1875 1.125 +v 0.4375 2 1.125 +v 1.9187 1.9813 1.9156 +v 1.9187 1.9813 0.0844 +v 1.9187 -0.1062 1.9156 +v 1.9187 -0.1062 0.0844 +v -0.0438 1.9813 1.9156 +v -0.0438 1.9813 0.0844 +v -0.0438 -0.1062 1.9156 +v -0.0438 -0.1062 0.0844 +v 1.9187 1.9813 1 +v 1.9187 -0.1062 1 +v -0.0438 1.9813 1 +v -0.0438 -0.1062 1 +v 0.9375 1.9813 1.9156 +v 0.9375 -0.1062 1.9156 +v 0.9375 1.9813 1 +v 0.9375 1.9813 0.0844 +v 0.9375 -0.1062 0.0844 +v -0.0438 -0.0812 1 +v 0.9375 -0.0812 1 +v 0.9375 -0.0812 1.9156 +v -0.0438 -0.0812 1.9156 +v 1.9187 -0.0812 1.9156 +v 1.9187 -0.0812 1 +v 2 0.1875 -0.9375 +v 3 0.1875 -0.9375 +v 3 0.0016 -0.9375 +v 2 0 -0.9375 +vt 0.1094 1 +vt 0.2813 1 +vt 0.2813 0.9531 +vt 0.1094 0.9531 +vt 0.1094 1 +vt 0.2813 1 +vt 0.2813 0.9531 +vt 0.1094 0.9531 +vt 0 1 +vt 0.0156 1 +vt 0.0156 0.8281 +vt 0 0.8281 +vt 0.1094 1 +vt 0.125 1 +vt 0.125 0.9531 +vt 0.1094 0.9531 +vt 0.1094 1 +vt 0.2813 1 +vt 0.2813 0.9531 +vt 0.1094 0.9531 +vt 0 1 +vt 0.0156 1 +vt 0.0156 0.8281 +vt 0 0.8281 +vt 0.1094 1 +vt 0.125 1 +vt 0.125 0.9531 +vt 0.1094 0.9531 +vt 0.7188 0.2656 +vt 0.7344 0.2656 +vt 0.7344 0.2188 +vt 0.7188 0.2188 +vt 0.7188 0.2656 +vt 0.7344 0.2656 +vt 0.7344 0.2188 +vt 0.7188 0.2188 +vt 0.7031 0.2188 +vt 0.7031 0.2656 +vt 0.6875 0.2656 +vt 0.6875 0.2188 +vt 0.7188 0.2656 +vt 0.7188 0.2188 +vt 0.7344 0.2188 +vt 0.7344 0.2656 +vt 0.6875 0.2656 +vt 0.7344 0.2656 +vt 0.7344 0.2188 +vt 0.6875 0.2188 +vt 0 0.2344 +vt 0.2344 0.2344 +vt 0.2344 0 vt 0 0 -vt 0.46875 0 -vt 0.46875 0.234375 -vt 0.234375 0.234375 -vt 0.234375 0 -vt 0.0625 0.9375 -vt 0.0625 0.0625 +vt 0.2344 0.2344 +vt 0.4688 0.2344 +vt 0.4688 0 +vt 0.2344 0 vt 0.9375 0.0625 +vt 0.0625 0.0625 +vt 0.0625 0.9375 vt 0.9375 0.9375 +vt 0.0625 0.875 vt 0.9375 0.875 vt 0.9375 1 vt 0.0625 1 -vt 0.0625 0.875 -vt 0.875 0.484375 -vt 0.875 0.609375 -vt 0.859375 0.609375 -vt 0.859375 0.484375 -vt 0.859375 0.484375 -vt 0.859375 0.609375 -vt 0.84375 0.609375 -vt 0.84375 0.484375 -vt 0.875 0.59375 -vt 0.875 0.609375 -vt 0.75 0.609375 -vt 0.75 0.59375 -vt 0.875 0.484375 -vt 0.875 0.5 +vt 0.8594 0.6094 +vt 0.875 0.6094 +vt 0.875 0.4844 +vt 0.8594 0.4844 +vt 0.8438 0.6094 +vt 0.8594 0.6094 +vt 0.8594 0.4844 +vt 0.8438 0.4844 +vt 0.75 0.6094 +vt 0.875 0.6094 +vt 0.875 0.5938 +vt 0.75 0.5938 vt 0.75 0.5 -vt 0.75 0.484375 -vt 0.5 0.484375 -vt 0.5 0.609375 -vt 0.375 0.609375 -vt 0.375 0.484375 +vt 0.875 0.5 +vt 0.875 0.4844 +vt 0.75 0.4844 +vt 0.375 0.6094 +vt 0.5 0.6094 +vt 0.5 0.4844 +vt 0.375 0.4844 +vt 0.0781 0.7344 +vt 0.0625 0.7344 vt 0.0625 0.6875 -vt 0.0625 0.734375 -vt 0.078125 0.734375 -vt 0.078125 0.6875 +vt 0.0781 0.6875 +vt 0.0156 0.7344 +vt 0 0.7344 vt 0 0.6875 -vt 0 0.734375 -vt 0.015625 0.734375 -vt 0.015625 0.6875 +vt 0.0156 0.6875 +vt 0 0.7344 +vt 0.0625 0.7344 vt 0.0625 0.75 -vt 0.0625 0.734375 -vt 0 0.734375 vt 0 0.75 +vt 0.0625 0.7344 +vt 0 0.7344 vt 0 0.6875 -vt 0 0.734375 -vt 0.0625 0.734375 vt 0.0625 0.6875 -vt 0.28125 0.953125 -vt 0.28125 1 -vt 0.109375 1 -vt 0.109375 0.953125 -vt 0.28125 0.953125 -vt 0.28125 1 -vt 0.109375 1 -vt 0.109375 0.953125 -vt 0.015625 0.828125 -vt 0.015625 1 -vt 0 1 -vt 0 0.828125 -vt 0.125 0.953125 -vt 0.125 1 -vt 0.109375 1 -vt 0.109375 0.953125 -vt 0.28125 0.953125 -vt 0.28125 1 -vt 0.109375 1 -vt 0.109375 0.953125 -vt 0.28125 0.953125 -vt 0.28125 1 -vt 0.109375 1 -vt 0.109375 0.953125 -vt 0.015625 0.828125 -vt 0.015625 1 -vt 0 1 -vt 0 0.828125 -vt 0.125 0.953125 -vt 0.125 1 -vt 0.109375 1 -vt 0.109375 0.953125 -vt 0.40625 0.953125 -vt 0.40625 1 +vt 0.1094 1 +vt 0.2813 1 +vt 0.2813 0.9531 +vt 0.1094 0.9531 vt 0.1875 1 -vt 0.1875 0.953125 -vt 0.40625 0.953125 -vt 0.40625 1 +vt 0.4063 1 +vt 0.4063 0.9531 +vt 0.1875 0.9531 vt 0.1875 1 -vt 0.1875 0.953125 -vt 0.015625 0.78125 -vt 0.015625 1 +vt 0.4063 1 +vt 0.4063 0.9531 +vt 0.1875 0.9531 vt 0 1 -vt 0 0.78125 -vt 0.28125 0.953125 -vt 0.28125 1 -vt 0.109375 1 -vt 0.109375 0.953125 -vt 0.28125 0.953125 -vt 0.28125 1 -vt 0.109375 1 -vt 0.109375 0.953125 -vt 0.015625 0.828125 -vt 0.015625 1 +vt 0.0156 1 +vt 0.0156 0.7813 +vt 0 0.7813 +vt 0.1094 1 +vt 0.2813 1 +vt 0.2813 0.9531 +vt 0.1094 0.9531 +vt 0.1094 1 +vt 0.2813 1 +vt 0.2813 0.9531 +vt 0.1094 0.9531 vt 0 1 -vt 0 0.828125 -vt 0.15625 0.953125 -vt 0.15625 1 -vt 0.140625 1 -vt 0.140625 0.953125 -vt 0.15625 0.953125 -vt 0.15625 1 -vt 0.140625 1 -vt 0.140625 0.953125 -vt 0.375 0.984375 -vt 0.375 1 -vt 0.140625 1 -vt 0.140625 0.984375 -vt 0.375 0.953125 +vt 0.0156 1 +vt 0.0156 0.8281 +vt 0 0.8281 +vt 0.1406 1 vt 0.375 1 -vt 0.140625 1 -vt 0.140625 0.953125 -vt 0.375 0.953125 -vt 0.375 1 -vt 0.140625 1 -vt 0.140625 0.953125 -vt 0.28125 0.953125 -vt 0.28125 1 -vt 0.109375 1 -vt 0.109375 0.953125 -vt 0.28125 0.953125 -vt 0.28125 1 -vt 0.109375 1 -vt 0.109375 0.953125 -vt 0.015625 0.828125 -vt 0.015625 1 +vt 0.375 0.9531 +vt 0.1406 0.9531 +vt 0.1094 1 +vt 0.2813 1 +vt 0.2813 0.9531 +vt 0.1094 0.9531 +vt 0.1094 1 +vt 0.2813 1 +vt 0.2813 0.9531 +vt 0.1094 0.9531 vt 0 1 -vt 0 0.828125 -vt 0.125 0.953125 +vt 0.0156 1 +vt 0.0156 0.8281 +vt 0 0.8281 +vt 0.1094 1 vt 0.125 1 -vt 0.109375 1 -vt 0.109375 0.953125 +vt 0.125 0.9531 +vt 0.1094 0.9531 +vt 0.0781 0.7344 +vt 0.0625 0.7344 vt 0.0625 0.6875 -vt 0.0625 0.734375 -vt 0.078125 0.734375 -vt 0.078125 0.6875 +vt 0.0781 0.6875 +vt 0.0156 0.7344 +vt 0 0.7344 vt 0 0.6875 -vt 0 0.734375 -vt 0.015625 0.734375 -vt 0.015625 0.6875 -vt 0.078125 0.75 -vt 0.078125 0.734375 -vt 0.015625 0.734375 -vt 0.015625 0.75 +vt 0.0156 0.6875 +vt 0.0156 0.7344 +vt 0.0781 0.7344 +vt 0.0781 0.75 +vt 0.0156 0.75 +vt 0.125 0.7344 +vt 0.0625 0.7344 vt 0.0625 0.6875 -vt 0.0625 0.734375 -vt 0.125 0.734375 vt 0.125 0.6875 +vt 0.5781 0.9063 +vt 0.5625 0.9063 vt 0.5625 1 -vt 0.5625 0.90625 -vt 0.578125 0.90625 -vt 0.578125 1 +vt 0.5781 1 +vt 0.6094 0.9063 +vt 0.5625 0.9063 vt 0.5625 1 -vt 0.5625 0.90625 -vt 0.609375 0.90625 -vt 0.609375 1 +vt 0.6094 1 +vt 0.5469 0.9063 +vt 0.5 0.9063 vt 0.5 1 -vt 0.5 0.90625 -vt 0.546875 0.90625 -vt 0.546875 1 -vt 0.609375 0.75 -vt 0.609375 0.828125 -vt 0.5625 0.828125 +vt 0.5469 1 +vt 0.5625 0.8281 +vt 0.6094 0.8281 +vt 0.6094 0.75 vt 0.5625 0.75 -vt 0.578125 0.828125 -vt 0.578125 0.90625 -vt 0.5625 0.90625 -vt 0.5625 0.828125 -vt 0.546875 0.75 -vt 0.546875 0.828125 -vt 0.5 0.828125 +vt 0.5625 0.9063 +vt 0.5781 0.9063 +vt 0.5781 0.8281 +vt 0.5625 0.8281 +vt 0.5 0.8281 +vt 0.5469 0.8281 +vt 0.5469 0.75 vt 0.5 0.75 -vt 0.578125 0.75 -vt 0.578125 1 vt 0.5625 1 +vt 0.5781 1 +vt 0.5781 0.75 vt 0.5625 0.75 -vt 0.609375 0.984375 -vt 0.609375 1 vt 0.5625 1 -vt 0.5625 0.984375 -vt 0.609375 0.984375 -vt 0.609375 1 +vt 0.6094 1 +vt 0.6094 0.9844 +vt 0.5625 0.9844 vt 0.5625 1 -vt 0.5625 0.984375 -vt 0.609375 0.75 -vt 0.609375 1 +vt 0.6094 1 +vt 0.6094 0.9844 +vt 0.5625 0.9844 vt 0.5625 1 +vt 0.6094 1 +vt 0.6094 0.75 vt 0.5625 0.75 -vt 0.546875 0.75 -vt 0.546875 1 vt 0.5 1 +vt 0.5469 1 +vt 0.5469 0.75 vt 0.5 0.75 +vt 0.5781 0.9063 +vt 0.5625 0.9063 vt 0.5625 1 -vt 0.5625 0.90625 -vt 0.578125 0.90625 -vt 0.578125 1 +vt 0.5781 1 +vt 0.6094 0.9063 +vt 0.5625 0.9063 vt 0.5625 1 -vt 0.5625 0.90625 -vt 0.609375 0.90625 -vt 0.609375 1 -vt 0.609375 0.75 -vt 0.609375 0.828125 -vt 0.5625 0.828125 +vt 0.6094 1 +vt 0.5625 0.8281 +vt 0.6094 0.8281 +vt 0.6094 0.75 vt 0.5625 0.75 -vt 0.578125 0.828125 -vt 0.578125 0.90625 -vt 0.5625 0.90625 -vt 0.5625 0.828125 -vt 0.546875 0.75 -vt 0.546875 0.828125 -vt 0.5 0.828125 +vt 0.5625 0.9063 +vt 0.5781 0.9063 +vt 0.5781 0.8281 +vt 0.5625 0.8281 +vt 0.5 0.8281 +vt 0.5469 0.8281 +vt 0.5469 0.75 vt 0.5 0.75 +vt 0.5469 0.9063 +vt 0.5 0.9063 vt 0.5 1 -vt 0.5 0.90625 -vt 0.546875 0.90625 -vt 0.546875 1 +vt 0.5469 1 +vt 0.5 0.0156 +vt 0.75 0.0156 vt 0.75 0 -vt 0.75 0.015625 -vt 0.5 0.015625 vt 0.5 0 -vt 0.75 0 -vt 0.75 0.25 vt 0.5 0.25 +vt 0.75 0.25 +vt 0.75 0 vt 0.5 0 +vt 0.5 0.0156 +vt 0.75 0.0156 vt 0.75 0 -vt 0.75 0.015625 -vt 0.5 0.015625 vt 0.5 0 -vt 0.2500000000000001 0.2499999999999999 -vt 0.2500000000000001 0.2656249999999999 -vt 5.224578939412501e-17 0.2656249999999999 -vt 5.551115123125783e-17 0.2499999999999999 +vt 0 0.2656 +vt 0.25 0.2656 +vt 0.25 0.25 +vt 0 0.25 +vt 0.25 0.25 +vt 0 0.25 vt 0 0.5 -vt 5.224578939412501e-17 0.2499999999999999 -vt 0.2500000000000001 0.2499999999999999 -vt 0.2500000000000001 0.5 -vt 0.5 0.265625 -vt 0.5 0.015625 -vt 0.75 0.015625 -vt 0.75 0.265625 -vt 0.5 0.265625 -vt 0.5 0.015625 -vt 0.75 0.015625 -vt 0.75 0.265625 +vt 0.25 0.5 +vt 0.75 0.0156 +vt 0.5 0.0156 +vt 0.5 0.2656 +vt 0.75 0.2656 +vt 0.75 0.0156 +vt 0.5 0.0156 +vt 0.5 0.2656 +vt 0.75 0.2656 +vt 0.0781 0.7344 +vt 0.0625 0.7344 vt 0.0625 0.6875 -vt 0.0625 0.734375 -vt 0.078125 0.734375 -vt 0.078125 0.6875 +vt 0.0781 0.6875 +vt 0.0156 0.7344 +vt 0 0.7344 vt 0 0.6875 -vt 0 0.734375 -vt 0.015625 0.734375 -vt 0.015625 0.6875 -vt 0.078125 0.75 -vt 0.078125 0.734375 -vt 0.015625 0.734375 -vt 0.015625 0.75 +vt 0.0156 0.6875 +vt 0.0156 0.7344 +vt 0.0781 0.7344 +vt 0.0781 0.75 +vt 0.0156 0.75 +vt 0.0625 0.7344 +vt 0 0.7344 vt 0 0.6875 -vt 0 0.734375 -vt 0.0625 0.734375 vt 0.0625 0.6875 -vt 0.578125 0.75 -vt 0.578125 1 vt 0.5625 1 +vt 0.5781 1 +vt 0.5781 0.75 vt 0.5625 0.75 -vt 0.609375 0.984375 -vt 0.609375 1 vt 0.5625 1 -vt 0.5625 0.984375 -vt 0.609375 0.984375 -vt 0.609375 1 +vt 0.6094 1 +vt 0.6094 0.9844 +vt 0.5625 0.9844 vt 0.5625 1 -vt 0.5625 0.984375 -vt 0.609375 0.75 -vt 0.609375 1 +vt 0.6094 1 +vt 0.6094 0.9844 +vt 0.5625 0.9844 vt 0.5625 1 +vt 0.6094 1 +vt 0.6094 0.75 vt 0.5625 0.75 -vt 0.546875 0.75 -vt 0.546875 1 vt 0.5 1 +vt 0.5469 1 +vt 0.5469 0.75 vt 0.5 0.75 +vt 0.5781 0.9063 +vt 0.5625 0.9063 vt 0.5625 1 -vt 0.5625 0.90625 -vt 0.578125 0.90625 -vt 0.578125 1 -vt 0.609375 0.984375 -vt 0.609375 1 +vt 0.5781 1 vt 0.5625 1 -vt 0.5625 0.984375 +vt 0.6094 1 +vt 0.6094 0.9844 +vt 0.5625 0.9844 +vt 0.6094 0.9063 +vt 0.5625 0.9063 vt 0.5625 1 -vt 0.5625 0.90625 -vt 0.609375 0.90625 -vt 0.609375 1 +vt 0.6094 1 +vt 0.5469 0.9063 +vt 0.5 0.9063 vt 0.5 1 -vt 0.5 0.90625 -vt 0.546875 0.90625 -vt 0.546875 1 -vt 0.609375 0.75 -vt 0.609375 0.828125 -vt 0.5625 0.828125 +vt 0.5469 1 +vt 0.5625 0.8281 +vt 0.6094 0.8281 +vt 0.6094 0.75 vt 0.5625 0.75 -vt 0.578125 0.828125 -vt 0.578125 0.90625 -vt 0.5625 0.90625 -vt 0.5625 0.828125 -vt 0.546875 0.75 -vt 0.546875 0.828125 -vt 0.5 0.828125 +vt 0.5625 0.9063 +vt 0.5781 0.9063 +vt 0.5781 0.8281 +vt 0.5625 0.8281 +vt 0.5 0.8281 +vt 0.5469 0.8281 +vt 0.5469 0.75 vt 0.5 0.75 +vt 0.5781 0.9063 +vt 0.5625 0.9063 vt 0.5625 1 -vt 0.5625 0.90625 -vt 0.578125 0.90625 -vt 0.578125 1 -vt 0.609375 0.984375 -vt 0.609375 1 +vt 0.5781 1 vt 0.5625 1 -vt 0.5625 0.984375 -vt 0.609375 0.984375 -vt 0.609375 1 +vt 0.6094 1 +vt 0.6094 0.9844 +vt 0.5625 0.9844 vt 0.5625 1 -vt 0.5625 0.984375 +vt 0.6094 1 +vt 0.6094 0.9844 +vt 0.5625 0.9844 +vt 0.6094 0.9063 +vt 0.5625 0.9063 vt 0.5625 1 -vt 0.5625 0.90625 -vt 0.609375 0.90625 -vt 0.609375 1 +vt 0.6094 1 +vt 0.5469 0.9063 +vt 0.5 0.9063 vt 0.5 1 -vt 0.5 0.90625 -vt 0.546875 0.90625 -vt 0.546875 1 -vt 0.609375 0.75 -vt 0.609375 0.828125 -vt 0.5625 0.828125 +vt 0.5469 1 +vt 0.5625 0.8281 +vt 0.6094 0.8281 +vt 0.6094 0.75 vt 0.5625 0.75 -vt 0.578125 0.828125 -vt 0.578125 0.90625 -vt 0.5625 0.90625 -vt 0.5625 0.828125 -vt 0.546875 0.75 -vt 0.546875 0.828125 -vt 0.5 0.828125 +vt 0.5625 0.9063 +vt 0.5781 0.9063 +vt 0.5781 0.8281 +vt 0.5625 0.8281 +vt 0.5 0.8281 +vt 0.5469 0.8281 +vt 0.5469 0.75 vt 0.5 0.75 -vt 0.03125 0.765625 -vt 0.03125 1 -vt 0 1 -vt 0 0.765625 -vt 0.75 1 -vt 0.75 0.75 -vt 0.515625 0.75 -vt 0.515625 1 -vt 0.25 0.484375 +vt 0.25 0.4844 +vt 0.2344 0.4844 +vt 0.2344 0.25 vt 0.25 0.25 -vt 0 0.25 -vt 0 0.484375 -vt 0.25 1 -vt 0.25 0.75 -vt 0 0.75 -vt 0 1 -vt 0.5 0 -vt 0.5 0.25 +vt 0.25 0.9375 +vt 0.2344 0.9375 +vt 0.2344 0.7969 +vt 0.25 0.7969 vt 0.75 0.25 +vt 0.7344 0.25 +vt 0.7344 0 vt 0.75 0 -vt 0.515625 0.25 -vt 0.515625 0.5 vt 0.75 0.5 +vt 0.5156 0.5 +vt 0.5156 0.25 vt 0.75 0.25 vt 0.25 1 -vt 0.25 0.765625 -vt 0 0.765625 -vt 0 1 -vt 0.015625 0.75 -vt 0.015625 1 -vt 0 1 -vt 0 0.75 -vt 0.234375 1 -vt 0.234375 0.75 -vt 0 0.75 +vt 0.2344 1 +vt 0.2344 0.7656 +vt 0.25 0.7656 vt 0 1 -vt 0.75 1 -vt 0.75 0.75 -vt 0.5 0.75 -vt 0.5 1 -vt 0.484375 0.25 -vt 0.484375 0.5 -vt 0.734375 0.5 -vt 0.734375 0.25 -vt 0.234375 1 -vt 0.234375 0.75 +vt 0.0156 1 +vt 0.0156 0.75 vt 0 0.75 -vt 0 1 -vt 0.75 0.484375 -vt 0.75 0.25 +vt 0.5 0.7969 +vt 0.5156 0.7969 +vt 0.5156 0.9375 +vt 0.5 0.9375 +vt 0 0.9375 +vt 0 0.7969 +vt 0.2344 0.7969 +vt 0.2344 0.9375 vt 0.5 0.25 -vt 0.5 0.484375 -vt 0.75 1 -vt 0.75 0.75 -vt 0.5 0.75 -vt 0.5 1 -vt 0.515625 0 -vt 0.515625 0.25 -vt 0.765625 0.25 -vt 0.765625 0 -vt 0 0.5 +vt 0.75 0.25 +vt 0.75 0.4844 +vt 0.5 0.4844 +vt 0.5 0.9375 +vt 0.5 0.7969 +vt 0.75 0.7969 +vt 0.75 0.9375 +vt 0.7656 0.25 +vt 0.5156 0.25 +vt 0.5156 0 +vt 0.7656 0 +vt 0.2344 0.75 vt 0 0.75 -vt 0.234375 0.75 -vt 0.234375 0.5 +vt 0 0.5 +vt 0.2344 0.5 +vt 0.5 0.7656 +vt 0.75 0.7656 vt 0.75 1 -vt 0.75 0.765625 -vt 0.5 0.765625 vt 0.5 1 -vt 0.75 1 -vt 0.75 0.75 -vt 0.515625 0.75 -vt 0.515625 1 -vt 0.25 1 -vt 0.25 0.75 -vt 0 0.75 -vt 0 1 -vt 0 0.25 -vt 0 0.5 +vt 0.5156 0.9375 +vt 0.5156 0.7969 +vt 0.75 0.7969 +vt 0.75 0.9375 +vt 0 0.9375 +vt 0 0.7969 +vt 0.25 0.7969 +vt 0.25 0.9375 vt 0.25 0.5 +vt 0 0.5 +vt 0 0.25 vt 0.25 0.25 -vt 0.515625 0.5 -vt 0.515625 0.75 vt 0.75 0.75 +vt 0.5156 0.75 +vt 0.5156 0.5 vt 0.75 0.5 -vt 0.40625 0.3125 -vt 0.40625 0.421875 -vt 0.25 0.421875 -vt 0.25 0.3125 -vt 0.40625 0.3125 -vt 0.40625 0.421875 -vt 0.25 0.421875 -vt 0.25 0.3125 -vt 0.40625 0.3125 -vt 0.40625 0.421875 -vt 0.25 0.421875 -vt 0.25 0.3125 -vt 0.40625 0.3125 -vt 0.40625 0.421875 -vt 0.25 0.421875 -vt 0.25 0.3125 -vt 1 1 -vt 0.9375 1 -vt 0.9375 0.890625 -vt 1 0.890625 -vt 0.75 0.890625 -vt 0.8125 0.890625 -vt 0.8125 1 -vt 0.75 1 -vt 0.75 0.9375 -vt 0.859375 0.9375 -vt 0.859375 1 -vt 0.75 1 -vt 0.75 0.25 -vt 0.859375 0.25 -vt 0.859375 0.3125 -vt 0.75 0.3125 -vt 0.75 0.890625 -vt 0.859375 0.890625 -vt 0.859375 1 -vt 0.75 1 -vt 0.75 0.25 -vt 0.8125 0.25 -vt 0.8125 0.359375 -vt 0.75 0.359375 -vt 1 0.359375 -vt 0.9375 0.359375 -vt 0.9375 0.25 -vt 1 0.25 -vt 0.75 0.25 -vt 0.859375 0.25 -vt 0.859375 0.359375 -vt 0.75 0.359375 -vt 1 0.359375 -vt 0.9375 0.359375 -vt 0.9375 0.25 -vt 1 0.25 -vt 0.75 0.9375 -vt 0.859375 0.9375 -vt 0.859375 1 -vt 0.75 1 -vt 0.75 0.25 -vt 0.8125 0.25 -vt 0.8125 0.359375 -vt 0.75 0.359375 -vt 0.75 0.890625 -vt 0.8125 0.890625 -vt 0.8125 1 -vt 0.75 1 -vt 0.75 0.25 -vt 0.859375 0.25 -vt 0.859375 0.3125 -vt 0.75 0.3125 -vt 1 1 -vt 0.9375 1 -vt 0.9375 0.890625 -vt 1 0.890625 -vt 1 0.3125 -vt 0.90625 0.3125 -vt 0.90625 0.25 -vt 1 0.25 -vt 1 1 -vt 0.90625 1 -vt 0.90625 0.9375 -vt 1 0.9375 -vt 1 0.3125 -vt 0.90625 0.3125 -vt 0.90625 0.25 -vt 1 0.25 -vt 1 1 -vt 0.90625 1 -vt 0.90625 0.890625 -vt 1 0.890625 -vt 1 0.359375 -vt 0.90625 0.359375 -vt 0.90625 0.25 -vt 1 0.25 -vt 1 1 -vt 0.90625 1 -vt 0.90625 0.9375 -vt 1 0.9375 -vt 0.40625 0.328125 -vt 0.390625 0.34375 -vt 0.265625 0.34375 -vt 0.25 0.328125 -vt 0.40625 0.328125 -vt 0.390625 0.34375 -vt 0.265625 0.34375 -vt 0.25 0.328125 -vt 0.125 0.484375 -vt 0.125 0.609375 -vt 0 0.609375 -vt 0 0.484375 -vt 0.40625 0.328125 -vt 0.390625 0.34375 -vt 0.265625 0.34375 -vt 0.25 0.328125 -vt 0.40625 0.3125 -vt 0.390625 0.328125 -vt 0.265625 0.328125 -vt 0.25 0.3125 -vt 0.3125 1 -vt 0.3125 0.4375 vt 0.5 0.4375 -vt 0.5 1 -vt 0.3125 1 vt 0.3125 0.4375 -vt 0.5 0.4375 -vt 0.5 1 vt 0.3125 1 +vt 0.5 1 +vt 0.5 0.4375 vt 0.3125 0.4375 +vt 0.3125 1 +vt 0.5 1 vt 0.5 0.4375 +vt 0.3125 0.4375 +vt 0.3125 1 vt 0.5 1 -vt 0.5 0 -vt 0.5 0.5625 vt 0.3125 0.5625 -vt 0.3125 0 -vt 0.5 0 vt 0.5 0.5625 -vt 0.3125 0.5625 -vt 0.3125 0 vt 0.5 0 +vt 0.3125 0 +vt 0.3125 0.5625 vt 0.5 0.5625 +vt 0.5 0 +vt 0.3125 0 vt 0.3125 0.5625 +vt 0.5 0.5625 +vt 0.5 0 vt 0.3125 0 -vt 0.9991855820223742 0.31330740369829624 -vt 1 0.12581441797762583 -vt 0.8133144179776258 0.12419259630170376 -vt 0.8116925963017038 0.3116855820223742 -vt 0.8116925963017038 0.3116855820223742 -vt 0.9991855820223742 0.31330740369829624 -vt 1 0.12581441797762583 -vt 0.8133144179776258 0.12419259630170376 -vt 0.5 0.3125 -vt 0.5 0.5 +vt 0.8133 0.1242 +vt 1 0.1258 +vt 0.9992 0.3133 +vt 0.8117 0.3117 +vt 1 0.1258 +vt 0.9992 0.3133 +vt 0.8117 0.3117 +vt 0.8133 0.1242 vt 0.3125 0.5 -vt 0.3125 0.3125 -vt 0.5 0.4375 vt 0.5 0.5 +vt 0.5 0.3125 +vt 0.3125 0.3125 vt 0.3125 0.5 +vt 0.5 0.5 +vt 0.5 0.4375 vt 0.3125 0.4375 -vt 0.5 0 -vt 0.5 0.9375 vt 0.3125 0.9375 -vt 0.3125 0 -vt 0.5 0 vt 0.5 0.9375 -vt 0.3125 0.9375 -vt 0.3125 0 vt 0.5 0 +vt 0.3125 0 +vt 0.3125 0.9375 vt 0.5 0.9375 +vt 0.5 0 +vt 0.3125 0 vt 0.3125 0.9375 +vt 0.5 0.9375 +vt 0.5 0 vt 0.3125 0 -vt 0.8133144179776258 0.12419259630170376 -vt 1 0.12581441797762583 -vt 0.9991855820223742 0.31330740369829624 -vt 0.8116925963017038 0.3116855820223742 -vt 0.8133144179776258 0.3133074036982961 -vt 0.8116925963017039 0.12581441797762583 -vt 0.9991855820223742 0.12419259630170387 -vt 1 0.3116855820223742 -vt 0.5 0.375 -vt 0.5 0.5625 +vt 0.9992 0.3133 +vt 1 0.1258 +vt 0.8133 0.1242 +vt 0.8117 0.3117 +vt 0.9992 0.1242 +vt 0.8117 0.1258 +vt 0.8133 0.3133 +vt 1 0.3117 vt 0.3125 0.5625 -vt 0.3125 0.375 +vt 0.5 0.5625 vt 0.5 0.375 -vt 0.5 0.5 +vt 0.3125 0.375 vt 0.3125 0.5 +vt 0.5 0.5 +vt 0.5 0.375 vt 0.3125 0.375 -vt 0.5 0.4375 -vt 0.5 0.8125 vt 0.3125 0.8125 -vt 0.3125 0.4375 -vt 0.5 0.4375 vt 0.5 0.8125 -vt 0.3125 0.8125 +vt 0.5 0.4375 vt 0.3125 0.4375 +vt 0.3125 0.8125 +vt 0.5 0.8125 vt 0.5 0.4375 -vt 0.5 0.625 -vt 0.3125 0.625 vt 0.3125 0.4375 +vt 0.3125 0.625 +vt 0.5 0.625 vt 0.5 0.4375 -vt 0.5 0.8125 -vt 0.3125 0.8125 vt 0.3125 0.4375 -vt 0.5 0 -vt 0.5 0.8125 vt 0.3125 0.8125 -vt 0.3125 0 -vt 0.5 0 vt 0.5 0.8125 +vt 0.5 0.4375 +vt 0.3125 0.4375 vt 0.3125 0.8125 -vt 0.3125 0 +vt 0.5 0.8125 vt 0.5 0 -vt 0.5 0.1875 -vt 0.3125 0.1875 vt 0.3125 0 -vt 0.5 0 -vt 0.5 0.8125 vt 0.3125 0.8125 -vt 0.3125 0 +vt 0.5 0.8125 vt 0.5 0 -vt 0.5 1 -vt 0.3125 1 vt 0.3125 0 +vt 0.3125 0.1875 +vt 0.5 0.1875 vt 0.5 0 -vt 0.5 1 -vt 0.3125 1 vt 0.3125 0 +vt 0.3125 0.8125 +vt 0.5 0.8125 vt 0.5 0 -vt 0.5 1 +vt 0.3125 0 vt 0.3125 1 +vt 0.5 1 +vt 0.5 0 vt 0.3125 0 -vt 0.5 0.3125 +vt 0.3125 1 vt 0.5 1 +vt 0.5 0 +vt 0.3125 0 vt 0.3125 1 -vt 0.3125 0.3125 -vt 0.5 0.3125 vt 0.5 1 +vt 0.5 0 +vt 0.3125 0 vt 0.3125 1 -vt 0.3125 0.3125 -vt 0.5 0.3125 vt 0.5 1 +vt 0.5 0.3125 +vt 0.3125 0.3125 vt 0.3125 1 +vt 0.5 1 +vt 0.5 0.3125 vt 0.3125 0.3125 +vt 0.3125 1 +vt 0.5 1 vt 0.5 0.3125 -vt 0.5 0.4375 +vt 0.3125 0.3125 vt 0.3125 0.4375 +vt 0.5 0.4375 +vt 0.5 0.3125 vt 0.3125 0.3125 -vt 0.5 0.5 -vt 0.3125 0.5 vt 0.3125 0.3125 +vt 0.3125 0.5 +vt 0.5 0.5 vt 0.5 0.3125 -vt 1 0.125 -vt 1 0.3125 vt 0.8125 0.3125 +vt 1 0.3125 +vt 1 0.125 vt 0.8125 0.125 -vt 0.9991855820223742 0.31330740369829624 -vt 1 0.12581441797762583 -vt 0.8133144179776258 0.12419259630170376 -vt 0.8116925963017038 0.3116855820223742 -vt 0.8116925963017038 0.3116855820223742 -vt 0.9991855820223742 0.31330740369829624 -vt 1 0.12581441797762583 -vt 0.8133144179776258 0.12419259630170376 -vt 0.5 0.3125 -vt 0.5 0.5 +vt 0.8133 0.1242 +vt 1 0.1258 +vt 0.9992 0.3133 +vt 0.8117 0.3117 +vt 1 0.1258 +vt 0.9992 0.3133 +vt 0.8117 0.3117 +vt 0.8133 0.1242 vt 0.3125 0.5 -vt 0.3125 0.3125 -vt 0.5 0.4375 vt 0.5 0.5 -vt 0.3125 0.5 -vt 0.3125 0.4375 vt 0.5 0.3125 +vt 0.3125 0.3125 +vt 0.3125 0.5 +vt 0.5 0.5 vt 0.5 0.4375 vt 0.3125 0.4375 +vt 0.3125 0.4375 +vt 0.5 0.4375 +vt 0.5 0.3125 vt 0.3125 0.3125 -vt 0.5 0.5 -vt 0.3125 0.5 vt 0.3125 0.3125 +vt 0.3125 0.5 +vt 0.5 0.5 vt 0.5 0.3125 -vt 1 0.125 -vt 1 0.3125 vt 0.8125 0.3125 +vt 1 0.3125 +vt 1 0.125 vt 0.8125 0.125 -vt 0.5 0.3125 -vt 0.5 0.4375 vt 0.3125 0.4375 +vt 0.5 0.4375 +vt 0.5 0.3125 vt 0.3125 0.3125 -vt 0.5 0.5 -vt 0.3125 0.5 vt 0.3125 0.3125 +vt 0.3125 0.5 +vt 0.5 0.5 vt 0.5 0.3125 -vt 1 0.125 -vt 1 0.3125 vt 0.8125 0.3125 +vt 1 0.3125 +vt 1 0.125 vt 0.8125 0.125 -vt 0.5 0.3125 -vt 0.5 0.4375 vt 0.3125 0.4375 +vt 0.5 0.4375 +vt 0.5 0.3125 vt 0.3125 0.3125 -vt 0.5 0.5 -vt 0.3125 0.5 vt 0.3125 0.3125 +vt 0.3125 0.5 +vt 0.5 0.5 vt 0.5 0.3125 -vt 1 0.125 -vt 1 0.3125 vt 0.8125 0.3125 +vt 1 0.3125 +vt 1 0.125 vt 0.8125 0.125 -vt 0.8133144179776258 0.12419259630170376 -vt 1 0.12581441797762583 -vt 0.9991855820223742 0.31330740369829624 -vt 0.8116925963017038 0.3116855820223742 -vt 0.8133144179776258 0.3133074036982961 -vt 0.8116925963017039 0.12581441797762583 -vt 0.9991855820223742 0.12419259630170387 -vt 1 0.3116855820223742 -vt 0.5 0.375 -vt 0.5 0.5625 +vt 0.9992 0.3133 +vt 1 0.1258 +vt 0.8133 0.1242 +vt 0.8117 0.3117 +vt 0.9992 0.1242 +vt 0.8117 0.1258 +vt 0.8133 0.3133 +vt 1 0.3117 vt 0.3125 0.5625 -vt 0.3125 0.375 +vt 0.5 0.5625 vt 0.5 0.375 -vt 0.5 0.5 +vt 0.3125 0.375 vt 0.3125 0.5 +vt 0.5 0.5 +vt 0.5 0.375 vt 0.3125 0.375 -vt 1 0.21875 +vt 0.9844 0.5 vt 1 0.5 -vt 0.984375 0.5 -vt 0.984375 0.21875 -vt 1 0.21875 +vt 1 0.2188 +vt 0.9844 0.2188 +vt 0.9844 0.5 vt 1 0.5 -vt 0.984375 0.5 -vt 0.984375 0.21875 -vt 1 0.46875 -vt 1 0.484375 -vt 0.984375 0.484375 -vt 0.984375 0.46875 -vt 1 0.46875 -vt 1 0.484375 -vt 0.984375 0.484375 -vt 0.984375 0.46875 -vt 1 0.21875 +vt 1 0.2188 +vt 0.9844 0.2188 +vt 0.9844 0.4844 +vt 1 0.4844 +vt 1 0.4688 +vt 0.9844 0.4688 +vt 0.9844 0.4844 +vt 1 0.4844 +vt 1 0.4688 +vt 0.9844 0.4688 +vt 0.9844 0.5 vt 1 0.5 -vt 0.984375 0.5 -vt 0.984375 0.21875 -vt 1 0.21875 +vt 1 0.2188 +vt 0.9844 0.2188 +vt 0.9844 0.5 vt 1 0.5 -vt 0.984375 0.5 -vt 0.984375 0.21875 +vt 1 0.2188 +vt 0.9844 0.2188 vt 0 1 -vt 0 0.9375 -vt 0.375 0.9375 -vt 0.375 1 vt 0.5 1 -vt 0.5 0.9375 -vt 1 0.9375 -vt 1 1 vt 0.5 0.625 -vt 0.5 1 -vt 0 1 vt 0 0.625 vt 0.375 0.875 -vt 0.375 0.9375 -vt 0 0.9375 vt 0 0.875 +vt 0 1 +vt 0.375 1 vt 1 0.875 -vt 1 0.9375 -vt 0.5 0.9375 vt 0.5 0.875 -vt 0.625 1 -vt 0.625 0.9375 -vt 1 0.9375 -vt 1 1 -vt 0 1 -vt 0 0.9375 -vt 0.5 0.9375 vt 0.5 1 -vt 0.75 0.625 -vt 0.75 1 +vt 1 1 vt 0.25 1 +vt 0.75 1 +vt 0.75 0.625 vt 0.25 0.625 vt 1 0.875 -vt 1 0.9375 -vt 0.625 0.9375 vt 0.625 0.875 -vt 0.5 0.875 -vt 0.5 0.9375 -vt 0 0.9375 -vt 0 0.875 vt 0.625 1 -vt 0.625 0.9375 -vt 1 0.9375 vt 1 1 +vt 0.5 0.875 +vt 0 0.875 vt 0 1 -vt 0 0.9375 -vt 0.5 0.9375 vt 0.5 1 -vt 0.75 0.625 -vt 0.75 1 vt 0.25 1 +vt 0.75 1 +vt 0.75 0.625 vt 0.25 0.625 vt 1 0.875 -vt 1 0.9375 -vt 0.625 0.9375 vt 0.625 0.875 +vt 0.625 1 +vt 1 1 vt 0.5 0.875 -vt 0.5 0.9375 -vt 0 0.9375 vt 0 0.875 vt 0 1 -vt 0 0.9375 -vt 0.359375 0.9375 -vt 0.359375 1 -vt 0.75 0 -vt 1 0 +vt 0.5 1 vt 1 0.0625 +vt 1 0 +vt 0.75 0 vt 0.75 0.0625 -vt 0 0.625 -vt 0.25 0.625 vt 0.25 1 +vt 0.25 0.625 +vt 0 0.625 vt 0 1 -vt 0.359375 0.875 -vt 0.359375 0.9375 -vt 0 0.9375 +vt 0.3594 0.875 vt 0 0.875 -vt 0.75 0.09375 -vt 1 0.09375 -vt 1 0.15625 -vt 0.75 0.15625 -vt 1 0.0625 -vt 0.75 0.0625 +vt 0 1 +vt 0.3594 1 +vt 1 0.1563 +vt 1 0.0938 +vt 0.75 0.0938 +vt 0.75 0.1563 vt 0.75 0 +vt 0.75 0.0625 +vt 1 0.0625 vt 1 0 -vt 0.5 1 -vt 0.25 1 vt 0.25 0.625 +vt 0.25 1 +vt 0.5 1 vt 0.5 0.625 -vt 1 0.15625 -vt 0.75 0.15625 -vt 0.75 0.09375 -vt 1 0.09375 +vt 0.75 0.0938 +vt 0.75 0.1563 +vt 1 0.1563 +vt 1 0.0938 vt 1 0.25 -vt 1 0.265625 -vt 0 0.265625 +vt 1 0.2656 +vt 0 0.2656 vt 0 0.25 vt 0.75 0.25 -vt 0.75 0.265625 -vt 0.25 0.265625 +vt 0.75 0.2656 +vt 0.25 0.2656 vt 0.25 0.25 -vt 0.71875 0.25 -vt 0.71875 0.265625 -vt 0 0.265625 +vt 0.7188 0.25 +vt 0.7188 0.2656 +vt 0 0.2656 vt 0 0.25 -vt 0.71875 0.25 -vt 0.71875 0.265625 -vt 0 0.265625 +vt 0.7188 0.25 +vt 0.7188 0.2656 +vt 0 0.2656 vt 0 0.25 -vt 0.734375 0.421875 -vt 0.734375 0.546875 -vt 0.765625 0.546875 -vt 0.765625 0.421875 -vt 0.734375 0.4375 -vt 0.734375 0.5625 -vt 0.765625 0.5625 -vt 0.765625 0.4375 -vt 0.765625 0.59375 -vt 0.765625 0.5625 -vt 0.734375 0.5625 -vt 0.734375 0.59375 -vt 0.734375 0.546875 -vt 0.734375 0.578125 -vt 0.703125 0.578125 -vt 0.703125 0.546875 -vt 0.734375 0.421875 -vt 0.734375 0.546875 -vt 0.765625 0.546875 -vt 0.765625 0.421875 -vt 0.734375 0.4375 -vt 0.734375 0.5625 -vt 0.765625 0.5625 -vt 0.765625 0.4375 -vt 0.734375 0.421875 -vt 0.734375 0.546875 -vt 0.765625 0.546875 -vt 0.765625 0.421875 -vt 0.734375 0.4375 -vt 0.734375 0.5625 -vt 0.765625 0.5625 -vt 0.765625 0.4375 -vt 0.703125 0.578125 -vt 0.703125 0.546875 -vt 0.671875 0.546875 -vt 0.671875 0.578125 -vt 0.734375 0.546875 -vt 0.734375 0.578125 -vt 0.703125 0.578125 -vt 0.703125 0.546875 -vt 0.734375 0.421875 -vt 0.734375 0.546875 -vt 0.765625 0.546875 -vt 0.765625 0.421875 -vt 0.734375 0.4375 -vt 0.734375 0.5625 -vt 0.765625 0.5625 -vt 0.765625 0.4375 -vt 1 0.28125 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.28125 -vt 1 0.28125 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.28125 -vt 1 0.46875 -vt 1 0.484375 -vt 0.984375 0.484375 -vt 0.984375 0.46875 -vt 1 0.28125 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.28125 -vt 1 0.28125 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.28125 -vt 1 0.21875 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.21875 -vt 1 0.21875 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.21875 -vt 1 0.46875 -vt 1 0.484375 -vt 0.984375 0.484375 -vt 0.984375 0.46875 -vt 1 0.21875 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.21875 -vt 1 0.21875 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.21875 -vt 1 0.21875 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.21875 -vt 1 0.21875 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.21875 -vt 1 0.21875 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.21875 -vt 1 0.21875 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.21875 -vt 1 0.46875 -vt 1 0.71875 -vt 0.984375 0.71875 -vt 0.984375 0.46875 -vt 1 0.46875 -vt 1 0.71875 -vt 0.984375 0.71875 -vt 0.984375 0.46875 -vt 1 0.71875 -vt 1 0.734375 -vt 0.984375 0.734375 -vt 0.984375 0.71875 -vt 1 0.46875 -vt 1 0.71875 -vt 0.984375 0.71875 -vt 0.984375 0.46875 -vt 1 0.46875 -vt 1 0.71875 -vt 0.984375 0.71875 -vt 0.984375 0.46875 -vt 1 0.28125 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.28125 -vt 1 0.28125 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.28125 -vt 1 0.46875 -vt 1 0.484375 -vt 0.984375 0.484375 -vt 0.984375 0.46875 -vt 1 0.28125 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.28125 -vt 1 0.28125 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.28125 -vt 1 0.21875 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.21875 -vt 1 0.21875 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.21875 -vt 1 0.21875 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.21875 -vt 1 0.21875 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.21875 -vt 1 0.21875 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.21875 -vt 1 0.21875 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.21875 -vt 1 0.46875 -vt 1 0.484375 -vt 0.984375 0.484375 -vt 0.984375 0.46875 -vt 1 0.21875 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.21875 -vt 1 0.21875 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.21875 -vt 1 0.21875 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.21875 -vt 1 0.21875 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.21875 -vt 1 0.21875 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.21875 -vt 1 0.21875 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.21875 -vt 1 0.28125 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.28125 -vt 1 0.28125 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.28125 -vt 1 0.46875 -vt 1 0.484375 -vt 0.984375 0.484375 -vt 0.984375 0.46875 -vt 1 0.28125 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.28125 -vt 1 0.28125 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.28125 -vt 1 0.21875 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.21875 -vt 1 0.21875 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.21875 -vt 1 0.21875 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.21875 -vt 1 0.21875 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.21875 -vt 1 0.21875 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.21875 -vt 1 0.21875 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.21875 -vt 1 0.46875 -vt 1 0.484375 -vt 0.984375 0.484375 -vt 0.984375 0.46875 -vt 1 0.21875 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.21875 -vt 1 0.21875 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.21875 +vt 0.7656 0.5469 +vt 0.7344 0.5469 +vt 0.7344 0.4219 +vt 0.7656 0.4219 +vt 0.7656 0.5625 +vt 0.7344 0.5625 +vt 0.7344 0.4375 +vt 0.7656 0.4375 +vt 0.7344 0.5625 +vt 0.7656 0.5625 +vt 0.7656 0.5938 +vt 0.7344 0.5938 +vt 0.7031 0.5781 +vt 0.7344 0.5781 +vt 0.7344 0.5469 +vt 0.7031 0.5469 +vt 0.7656 0.5469 +vt 0.7344 0.5469 +vt 0.7344 0.4219 +vt 0.7656 0.4219 +vt 0.7656 0.5625 +vt 0.7344 0.5625 +vt 0.7344 0.4375 +vt 0.7656 0.4375 +vt 0.7656 0.5469 +vt 0.7344 0.5469 +vt 0.7344 0.4219 +vt 0.7656 0.4219 +vt 0.7656 0.5625 +vt 0.7344 0.5625 +vt 0.7344 0.4375 +vt 0.7656 0.4375 +vt 0.6719 0.5469 +vt 0.7031 0.5469 +vt 0.7031 0.5781 +vt 0.6719 0.5781 +vt 0.7031 0.5781 +vt 0.7344 0.5781 +vt 0.7344 0.5469 +vt 0.7031 0.5469 +vt 0.7656 0.5469 +vt 0.7344 0.5469 +vt 0.7344 0.4219 +vt 0.7656 0.4219 +vt 0.7656 0.5625 +vt 0.7344 0.5625 +vt 0.7344 0.4375 +vt 0.7656 0.4375 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2813 +vt 0.9844 0.2813 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2813 +vt 0.9844 0.2813 +vt 0.9844 0.4844 +vt 1 0.4844 +vt 1 0.4688 +vt 0.9844 0.4688 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2813 +vt 0.9844 0.2813 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2813 +vt 0.9844 0.2813 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2188 +vt 0.9844 0.2188 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2188 +vt 0.9844 0.2188 +vt 0.9844 0.4844 +vt 1 0.4844 +vt 1 0.4688 +vt 0.9844 0.4688 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2188 +vt 0.9844 0.2188 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2188 +vt 0.9844 0.2188 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2188 +vt 0.9844 0.2188 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2188 +vt 0.9844 0.2188 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2188 +vt 0.9844 0.2188 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2188 +vt 0.9844 0.2188 +vt 0.9844 0.7188 +vt 1 0.7188 +vt 1 0.4688 +vt 0.9844 0.4688 +vt 0.9844 0.7188 +vt 1 0.7188 +vt 1 0.4688 +vt 0.9844 0.4688 +vt 0.9844 0.7344 +vt 1 0.7344 +vt 1 0.7188 +vt 0.9844 0.7188 +vt 0.9844 0.7188 +vt 1 0.7188 +vt 1 0.4688 +vt 0.9844 0.4688 +vt 0.9844 0.7188 +vt 1 0.7188 +vt 1 0.4688 +vt 0.9844 0.4688 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2813 +vt 0.9844 0.2813 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2813 +vt 0.9844 0.2813 +vt 0.9844 0.4844 +vt 1 0.4844 +vt 1 0.4688 +vt 0.9844 0.4688 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2813 +vt 0.9844 0.2813 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2813 +vt 0.9844 0.2813 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2188 +vt 0.9844 0.2188 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2188 +vt 0.9844 0.2188 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2188 +vt 0.9844 0.2188 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2188 +vt 0.9844 0.2188 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2188 +vt 0.9844 0.2188 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2188 +vt 0.9844 0.2188 +vt 0.9844 0.4844 +vt 1 0.4844 +vt 1 0.4688 +vt 0.9844 0.4688 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2188 +vt 0.9844 0.2188 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2188 +vt 0.9844 0.2188 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2188 +vt 0.9844 0.2188 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2188 +vt 0.9844 0.2188 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2188 +vt 0.9844 0.2188 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2188 +vt 0.9844 0.2188 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2813 +vt 0.9844 0.2813 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2813 +vt 0.9844 0.2813 +vt 0.9844 0.4844 +vt 1 0.4844 +vt 1 0.4688 +vt 0.9844 0.4688 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2813 +vt 0.9844 0.2813 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2813 +vt 0.9844 0.2813 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2188 +vt 0.9844 0.2188 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2188 +vt 0.9844 0.2188 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2188 +vt 0.9844 0.2188 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2188 +vt 0.9844 0.2188 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2188 +vt 0.9844 0.2188 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2188 +vt 0.9844 0.2188 +vt 0.9844 0.4844 +vt 1 0.4844 +vt 1 0.4688 +vt 0.9844 0.4688 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2188 +vt 0.9844 0.2188 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.2188 +vt 0.9844 0.2188 +vt 0.9844 0.4688 +vt 1 0.4688 vt 1 0.25 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.25 +vt 0.9844 0.25 +vt 0.9844 0.4688 +vt 1 0.4688 vt 1 0.25 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.25 +vt 0.9844 0.25 +vt 0.9844 0.4688 +vt 1 0.4688 vt 1 0.25 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.25 +vt 0.9844 0.25 +vt 0.9844 0.4688 +vt 1 0.4688 vt 1 0.25 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.25 +vt 0.9844 0.25 +vt 1 0.0536 +vt 0.75 0.0536 vt 0.75 0.125 -vt 0.75 0.0535714285714286 -vt 1 0.0535714285714286 vt 1 0.125 -vt 0.765625 0.125 -vt 0.765625 0.0535714285714286 -vt 1 0.0535714285714286 +vt 1 0.0536 +vt 0.7656 0.0536 +vt 0.7656 0.125 vt 1 0.125 -vt 0.578125 0.25 -vt 0.578125 0.296875 -vt 0.21875 0.296875 -vt 0.21875 0.25 +vt 0.2188 0.2969 +vt 0.5781 0.2969 +vt 0.5781 0.25 +vt 0.2188 0.25 +vt 0.75 0.0536 +vt 1 0.0536 vt 1 0 -vt 1 0.0535714285714286 -vt 0.75 0.0535714285714286 vt 0.75 0 -vt 0.328125 1 -vt 0.328125 0.9375 vt 0.6875 0.9375 +vt 0.3281 0.9375 +vt 0.3281 1 vt 0.6875 1 +vt 0.7656 0.0536 +vt 1 0.0536 vt 1 0 -vt 1 0.0535714285714286 -vt 0.765625 0.0535714285714286 -vt 0.765625 0 -vt 0.46875 0.25 -vt 0.46875 0.3125 -vt 0.109375 0.3125 -vt 0.109375 0.25 -vt 0.578125 0.25 -vt 0.578125 0.3125 -vt 0.09375 0.3125 -vt 0.09375 0.25 -vt 0.171875 1 -vt 0.171875 0.9375 -vt 0.65625 0.9375 -vt 0.65625 1 -vt 0.15625 1 -vt 0.15625 0.9375 -vt 0.515625 0.9375 -vt 0.515625 1 -vt 0.546875 0.25 -vt 0.546875 0.3125 +vt 0.7656 0 +vt 0.1094 0.3125 +vt 0.4688 0.3125 +vt 0.4688 0.25 +vt 0.1094 0.25 +vt 0.0938 0.3125 +vt 0.5781 0.3125 +vt 0.5781 0.25 +vt 0.0938 0.25 +vt 0.6563 0.9375 +vt 0.1719 0.9375 +vt 0.1719 1 +vt 0.6563 1 +vt 0.5156 0.9375 +vt 0.1563 0.9375 +vt 0.1563 1 +vt 0.5156 1 vt 0.1875 0.3125 +vt 0.5469 0.3125 +vt 0.5469 0.25 vt 0.1875 0.25 -vt 0.59375 0.25 -vt 0.59375 0.3125 -vt 0.109375 0.3125 -vt 0.109375 0.25 -vt 0.1875 1 +vt 0.1094 0.3125 +vt 0.5938 0.3125 +vt 0.5938 0.25 +vt 0.1094 0.25 +vt 0.5469 0.9375 vt 0.1875 0.9375 -vt 0.546875 0.9375 -vt 0.546875 1 -vt 0.140625 1 -vt 0.140625 0.9375 +vt 0.1875 1 +vt 0.5469 1 vt 0.625 0.9375 +vt 0.1406 0.9375 +vt 0.1406 1 vt 0.625 1 -vt 0.15625 1 -vt 0.15625 0.9375 -vt 0.515625 0.9375 -vt 0.515625 1 -vt 0.15625 1 -vt 0.15625 0.9375 -vt 0.640625 0.9375 -vt 0.640625 1 -vt 0.578125 0.25 -vt 0.578125 0.3125 -vt 0.09375 0.3125 -vt 0.09375 0.25 -vt 0.5 0.25 +vt 0.5156 0.9375 +vt 0.1563 0.9375 +vt 0.1563 1 +vt 0.5156 1 +vt 0.6406 0.9375 +vt 0.1563 0.9375 +vt 0.1563 1 +vt 0.6406 1 +vt 0.0938 0.3125 +vt 0.5781 0.3125 +vt 0.5781 0.25 +vt 0.0938 0.25 +vt 0.1406 0.3125 vt 0.5 0.3125 -vt 0.140625 0.3125 -vt 0.140625 0.25 -vt 0.734375 0.421875 -vt 0.734375 0.546875 -vt 0.765625 0.546875 -vt 0.765625 0.421875 -vt 0.734375 0.4375 -vt 0.734375 0.5625 -vt 0.765625 0.5625 -vt 0.765625 0.4375 -vt 0.765625 0.59375 -vt 0.765625 0.5625 -vt 0.734375 0.5625 -vt 0.734375 0.59375 -vt 0.734375 0.546875 -vt 0.734375 0.578125 -vt 0.703125 0.578125 -vt 0.703125 0.546875 -vt 0.734375 0.421875 -vt 0.734375 0.546875 -vt 0.765625 0.546875 -vt 0.765625 0.421875 -vt 0.734375 0.4375 -vt 0.734375 0.5625 -vt 0.765625 0.5625 -vt 0.765625 0.4375 -vt 0.015625 0.96875 -vt 0.015625 1 +vt 0.5 0.25 +vt 0.1406 0.25 +vt 0.7656 0.5469 +vt 0.7344 0.5469 +vt 0.7344 0.4219 +vt 0.7656 0.4219 +vt 0.7656 0.5625 +vt 0.7344 0.5625 +vt 0.7344 0.4375 +vt 0.7656 0.4375 +vt 0.7344 0.5625 +vt 0.7656 0.5625 +vt 0.7656 0.5938 +vt 0.7344 0.5938 +vt 0.7031 0.5781 +vt 0.7344 0.5781 +vt 0.7344 0.5469 +vt 0.7031 0.5469 +vt 0.7656 0.5469 +vt 0.7344 0.5469 +vt 0.7344 0.4219 +vt 0.7656 0.4219 +vt 0.7656 0.5625 +vt 0.7344 0.5625 +vt 0.7344 0.4375 +vt 0.7656 0.4375 vt 0 1 -vt 0 0.96875 -vt 0.25 0.984375 -vt 0.25 1 +vt 0.0156 1 +vt 0.0156 0.9688 +vt 0 0.9688 vt 0 1 -vt 0 0.984375 -vt 0.40625 0.890625 -vt 0.40625 0.90625 -vt 0.15625 0.90625 -vt 0.15625 0.890625 -vt 0.75 0.234375 -vt 0.75 0.265625 -vt 0.5 0.265625 -vt 0.5 0.234375 -vt 0.140625 0.6875 -vt 0.140625 0.875 +vt 0.25 1 +vt 0.25 0.9844 +vt 0 0.9844 +vt 0.1563 0.9063 +vt 0.4063 0.9063 +vt 0.4063 0.8906 +vt 0.1563 0.8906 +vt 0.5 0.2656 +vt 0.75 0.2656 +vt 0.75 0.2344 +vt 0.5 0.2344 vt 0.125 0.875 +vt 0.1406 0.875 +vt 0.1406 0.6875 vt 0.125 0.6875 -vt 0.03125 0.734375 -vt 0.03125 0.921875 -vt 0 0.921875 -vt 0 0.734375 -vt 0.921875 0.546875 -vt 0.921875 0.734375 -vt 0.90625 0.734375 -vt 0.90625 0.546875 -vt 1 0.625 +vt 0 0.9219 +vt 0.0313 0.9219 +vt 0.0313 0.7344 +vt 0 0.7344 +vt 0.9063 0.7344 +vt 0.9219 0.7344 +vt 0.9219 0.5469 +vt 0.9063 0.5469 +vt 0.9688 0.8125 vt 1 0.8125 -vt 0.96875 0.8125 -vt 0.96875 0.625 -vt 0.015625 0.96875 -vt 0.015625 1 +vt 1 0.625 +vt 0.9688 0.625 vt 0 1 -vt 0 0.96875 -vt 0.25 0.984375 -vt 0.25 1 +vt 0.0156 1 +vt 0.0156 0.9688 +vt 0 0.9688 vt 0 1 -vt 0 0.984375 -vt 0.40625 0.890625 -vt 0.40625 0.90625 -vt 0.15625 0.90625 -vt 0.15625 0.890625 -vt 0.75 0.234375 -vt 0.75 0.265625 -vt 0.5 0.265625 -vt 0.5 0.234375 -vt 0.015625 0.8125 -vt 0.015625 1 +vt 0.25 1 +vt 0.25 0.9844 +vt 0 0.9844 +vt 0.1563 0.9063 +vt 0.4063 0.9063 +vt 0.4063 0.8906 +vt 0.1563 0.8906 +vt 0.5 0.2656 +vt 0.75 0.2656 +vt 0.75 0.2344 +vt 0.5 0.2344 vt 0 1 +vt 0.0156 1 +vt 0.0156 0.8125 vt 0 0.8125 -vt 0.921875 0.546875 -vt 0.921875 0.734375 -vt 0.90625 0.734375 -vt 0.90625 0.546875 -vt 0.03125 0.984375 -vt 0.03125 1 +vt 0.9063 0.7344 +vt 0.9219 0.7344 +vt 0.9219 0.5469 +vt 0.9063 0.5469 vt 0 1 -vt 0 0.984375 -vt 1 0.625 +vt 0.0313 1 +vt 0.0313 0.9844 +vt 0 0.9844 +vt 0.9688 0.8125 vt 1 0.8125 -vt 0.96875 0.8125 -vt 0.96875 0.625 -vt 0.015625 0.96875 -vt 0.015625 1 +vt 1 0.625 +vt 0.9688 0.625 +vt 0 1 +vt 0.0156 1 +vt 0.0156 0.9688 +vt 0 0.9688 vt 0 1 -vt 0 0.96875 -vt 0.25 0.984375 vt 0.25 1 +vt 0.25 0.9844 +vt 0 0.9844 +vt 0.1563 0.9063 +vt 0.4063 0.9063 +vt 0.4063 0.8906 +vt 0.1563 0.8906 +vt 0.5 0.2656 +vt 0.75 0.2656 +vt 0.75 0.2344 +vt 0.5 0.2344 vt 0 1 -vt 0 0.984375 -vt 0.40625 0.890625 -vt 0.40625 0.90625 -vt 0.15625 0.90625 -vt 0.15625 0.890625 -vt 0.75 0.234375 -vt 0.75 0.265625 -vt 0.5 0.265625 -vt 0.5 0.234375 -vt 0.015625 0.96875 -vt 0.015625 1 +vt 0.0156 1 +vt 0.0156 0.9688 +vt 0 0.9688 vt 0 1 -vt 0 0.96875 -vt 0.25 0.984375 vt 0.25 1 -vt 0 1 -vt 0 0.984375 -vt 0.40625 0.890625 -vt 0.40625 0.90625 -vt 0.15625 0.90625 -vt 0.15625 0.890625 -vt 0.75 0.234375 -vt 0.75 0.265625 -vt 0.5 0.265625 -vt 0.5 0.234375 -vt 0.140625 0.6875 -vt 0.140625 0.875 +vt 0.25 0.9844 +vt 0 0.9844 +vt 0.1563 0.9063 +vt 0.4063 0.9063 +vt 0.4063 0.8906 +vt 0.1563 0.8906 +vt 0.5 0.2656 +vt 0.75 0.2656 +vt 0.75 0.2344 +vt 0.5 0.2344 vt 0.125 0.875 +vt 0.1406 0.875 +vt 0.1406 0.6875 vt 0.125 0.6875 -vt 0.015625 0.8125 -vt 0.015625 1 vt 0 1 +vt 0.0156 1 +vt 0.0156 0.8125 vt 0 0.8125 -vt 0.03125 0.984375 -vt 0.03125 1 vt 0 1 -vt 0 0.984375 -vt 0.03125 0.984375 -vt 0.03125 1 +vt 0.0313 1 +vt 0.0313 0.9844 +vt 0 0.9844 vt 0 1 -vt 0 0.984375 -vt 0.03125 0.734375 -vt 0.03125 0.921875 -vt 0 0.921875 -vt 0 0.734375 -vt 0.875 0.484375 -vt 0.875 0.609375 -vt 0.859375 0.609375 -vt 0.859375 0.484375 -vt 0.859375 0.484375 -vt 0.859375 0.609375 -vt 0.84375 0.609375 -vt 0.84375 0.484375 -vt 0.875 0.59375 -vt 0.875 0.609375 -vt 0.75 0.609375 -vt 0.75 0.59375 -vt 0.875 0.484375 -vt 0.875 0.5 +vt 0.0313 1 +vt 0.0313 0.9844 +vt 0 0.9844 +vt 0 0.9219 +vt 0.0313 0.9219 +vt 0.0313 0.7344 +vt 0 0.7344 +vt 0.8594 0.6094 +vt 0.875 0.6094 +vt 0.875 0.4844 +vt 0.8594 0.4844 +vt 0.8438 0.6094 +vt 0.8594 0.6094 +vt 0.8594 0.4844 +vt 0.8438 0.4844 +vt 0.75 0.6094 +vt 0.875 0.6094 +vt 0.875 0.5938 +vt 0.75 0.5938 vt 0.75 0.5 -vt 0.75 0.484375 -vt 0.875 0.484375 -vt 0.875 0.609375 -vt 0.75 0.609375 -vt 0.75 0.484375 -vt 0.875 0.484375 -vt 0.875 0.609375 -vt 0.859375 0.609375 -vt 0.859375 0.484375 -vt 0.859375 0.484375 -vt 0.859375 0.609375 -vt 0.84375 0.609375 -vt 0.84375 0.484375 -vt 0.875 0.59375 -vt 0.875 0.609375 -vt 0.75 0.609375 -vt 0.75 0.59375 -vt 0.875 0.484375 vt 0.875 0.5 +vt 0.875 0.4844 +vt 0.75 0.4844 +vt 0.75 0.6094 +vt 0.875 0.6094 +vt 0.875 0.4844 +vt 0.75 0.4844 +vt 0.8594 0.6094 +vt 0.875 0.6094 +vt 0.875 0.4844 +vt 0.8594 0.4844 +vt 0.8438 0.6094 +vt 0.8594 0.6094 +vt 0.8594 0.4844 +vt 0.8438 0.4844 +vt 0.75 0.6094 +vt 0.875 0.6094 +vt 0.875 0.5938 +vt 0.75 0.5938 vt 0.75 0.5 -vt 0.75 0.484375 -vt 0.75 0.484375 -vt 0.75 0.609375 -vt 0.625 0.609375 -vt 0.625 0.484375 -vt 0.75 0.25 -vt 0.875 0.25 +vt 0.875 0.5 +vt 0.875 0.4844 +vt 0.75 0.4844 +vt 0.625 0.6094 +vt 0.75 0.6094 +vt 0.75 0.4844 +vt 0.625 0.4844 vt 0.875 0.4375 +vt 0.875 0.25 +vt 0.75 0.25 vt 0.75 0.4375 -vt 0.75 0.8125 -vt 0.875 0.8125 vt 0.875 1 +vt 0.875 0.8125 +vt 0.75 0.8125 vt 0.75 1 +vt 0.8906 0.25 +vt 0.8906 0.4375 vt 1 0.4375 -vt 0.890625 0.4375 -vt 0.890625 0.25 vt 1 0.25 +vt 0.8906 0.8125 +vt 0.8906 1 vt 1 1 -vt 0.890625 1 -vt 0.890625 0.8125 vt 1 0.8125 -vt 0.25 0.015625 -vt 0.125 0.015625 vt 0.125 0 +vt 0.125 0.0156 +vt 0.25 0.0156 vt 0.25 0 -vt 0.484375 0.015625 -vt 0.359375 0.015625 -vt 0.359375 0 -vt 0.484375 0 -vt 1 0.734375 -vt 0.875 0.734375 +vt 0.3594 0 +vt 0.3594 0.0156 +vt 0.4844 0.0156 +vt 0.4844 0 vt 0.875 0.625 +vt 0.875 0.7344 +vt 1 0.7344 vt 1 0.625 -vt 0 0.0625 +vt 0.125 0.1719 vt 0.125 0.0625 -vt 0.125 0.171875 -vt 0 0.171875 -vt 1 0.640625 -vt 0.890625 0.640625 -vt 0.890625 0.53125 -vt 1 0.53125 +vt 0 0.0625 +vt 0 0.1719 +vt 0.8906 0.5313 +vt 0.8906 0.6406 +vt 1 0.6406 +vt 1 0.5313 +vt 0.3594 0.0156 +vt 0.3594 0 vt 0.25 0 -vt 0.359375 0 -vt 0.359375 0.015625 -vt 0.25 0.015625 -vt 0 0.578125 -vt 0.109375 0.578125 -vt 0.109375 0.6875 +vt 0.25 0.0156 +vt 0.1094 0.6875 +vt 0.1094 0.5781 +vt 0 0.5781 vt 0 0.6875 -vt 0.015625 0 +vt 0.125 0.0156 vt 0.125 0 -vt 0.125 0.015625 -vt 0.015625 0.015625 -vt 0.75 0.25 -vt 0.875 0.25 +vt 0.0156 0 +vt 0.0156 0.0156 vt 0.875 0.4375 +vt 0.875 0.25 +vt 0.75 0.25 vt 0.75 0.4375 -vt 0.75 0.8125 -vt 0.875 0.8125 vt 0.875 1 +vt 0.875 0.8125 +vt 0.75 0.8125 vt 0.75 1 +vt 0.8906 0.25 +vt 0.8906 0.4375 vt 1 0.4375 -vt 0.890625 0.4375 -vt 0.890625 0.25 vt 1 0.25 +vt 0.8906 0.8125 +vt 0.8906 1 vt 1 1 -vt 0.890625 1 -vt 0.890625 0.8125 vt 1 0.8125 -vt 0.25 0.015625 -vt 0.125 0.015625 vt 0.125 0 +vt 0.125 0.0156 +vt 0.25 0.0156 vt 0.25 0 -vt 0.484375 0.015625 -vt 0.359375 0.015625 -vt 0.359375 0 -vt 0.484375 0 -vt 1 0.734375 -vt 0.875 0.734375 +vt 0.3594 0 +vt 0.3594 0.0156 +vt 0.4844 0.0156 +vt 0.4844 0 vt 0.875 0.625 +vt 0.875 0.7344 +vt 1 0.7344 vt 1 0.625 -vt 0 0.0625 +vt 0.125 0.1719 vt 0.125 0.0625 -vt 0.125 0.171875 -vt 0 0.171875 -vt 1 0.640625 -vt 0.890625 0.640625 -vt 0.890625 0.53125 -vt 1 0.53125 +vt 0 0.0625 +vt 0 0.1719 +vt 0.8906 0.5313 +vt 0.8906 0.6406 +vt 1 0.6406 +vt 1 0.5313 +vt 0.3594 0.0156 +vt 0.3594 0 vt 0.25 0 -vt 0.359375 0 -vt 0.359375 0.015625 -vt 0.25 0.015625 -vt 0 0.578125 -vt 0.109375 0.578125 -vt 0.109375 0.6875 +vt 0.25 0.0156 +vt 0.1094 0.6875 +vt 0.1094 0.5781 +vt 0 0.5781 vt 0 0.6875 -vt 0.015625 0 +vt 0.125 0.0156 vt 0.125 0 -vt 0.125 0.015625 -vt 0.015625 0.015625 -vt 0.359375 0.015625 -vt 0.23437500000000006 0.015625 -vt 0.23437500000000006 0 -vt 0.359375 0 -vt 0.3125 0.015625 -vt 0.18750000000000006 0.015625 -vt 0.18750000000000006 0 +vt 0.0156 0 +vt 0.0156 0.0156 +vt 0.2344 0 +vt 0.2344 0.0156 +vt 0.3594 0.0156 +vt 0.3594 0 +vt 0.1875 0 +vt 0.1875 0.0156 +vt 0.3125 0.0156 vt 0.3125 0 -vt 0.5 0.03125 -vt 0.37500000000000006 0.03125 -vt 0.37500000000000006 0 +vt 0.375 0 +vt 0.375 0.0313 +vt 0.5 0.0313 vt 0.5 0 +vt 0.125 0.0313 +vt 0.125 0 vt 0 0 -vt 0.12499999999999994 0 -vt 0.12499999999999994 0.03125 -vt 0 0.03125 -vt 0.5 0.03125 -vt 0.39062499999999994 0.03125 -vt 0.39062499999999994 0 +vt 0 0.0313 +vt 0.3906 0 +vt 0.3906 0.0313 +vt 0.5 0.0313 vt 0.5 0 +vt 0.2344 0.0156 +vt 0.2344 0 vt 0.125 0 -vt 0.23437500000000006 0 -vt 0.23437500000000006 0.015625 -vt 0.125 0.015625 +vt 0.125 0.0156 +vt 0.1094 0.0313 +vt 0.1094 0 vt 0 0 -vt 0.10937500000000006 0 -vt 0.10937500000000006 0.03125 -vt 0 0.03125 -vt 0.078125 0 -vt 0.18750000000000006 0 -vt 0.18750000000000006 0.015625 -vt 0.078125 0.015625 -vt 0.359375 0.015625 -vt 0.23437500000000006 0.015625 -vt 0.23437500000000006 0 -vt 0.359375 0 -vt 0.3125 0.015625 -vt 0.18750000000000006 0.015625 -vt 0.18750000000000006 0 +vt 0 0.0313 +vt 0.1875 0.0156 +vt 0.1875 0 +vt 0.0781 0 +vt 0.0781 0.0156 +vt 0.2344 0 +vt 0.2344 0.0156 +vt 0.3594 0.0156 +vt 0.3594 0 +vt 0.1875 0 +vt 0.1875 0.0156 +vt 0.3125 0.0156 vt 0.3125 0 -vt 0.5 0.03125 -vt 0.37500000000000006 0.03125 -vt 0.37500000000000006 0 +vt 0.375 0 +vt 0.375 0.0313 +vt 0.5 0.0313 vt 0.5 0 +vt 0.125 0.0313 +vt 0.125 0 vt 0 0 -vt 0.12499999999999994 0 -vt 0.12499999999999994 0.03125 -vt 0 0.03125 -vt 0.5 0.03125 -vt 0.39062499999999994 0.03125 -vt 0.39062499999999994 0 +vt 0 0.0313 +vt 0.3906 0 +vt 0.3906 0.0313 +vt 0.5 0.0313 vt 0.5 0 +vt 0.2344 0.0156 +vt 0.2344 0 vt 0.125 0 -vt 0.23437500000000006 0 -vt 0.23437500000000006 0.015625 -vt 0.125 0.015625 +vt 0.125 0.0156 +vt 0.1094 0.0313 +vt 0.1094 0 vt 0 0 -vt 0.10937500000000006 0 -vt 0.10937500000000006 0.03125 -vt 0 0.03125 -vt 0.078125 0 -vt 0.18750000000000006 0 -vt 0.18750000000000006 0.015625 -vt 0.078125 0.015625 -vt 0.5625 0.9375000000000001 +vt 0 0.0313 +vt 0.1875 0.0156 +vt 0.1875 0 +vt 0.0781 0 +vt 0.0781 0.0156 +vt 0.6875 0 +vt 0.5625 0 +vt 0.5625 0.9375 +vt 0.6875 0.9375 vt 0.5625 0 vt 0.6875 0 -vt 0.6875 0.9375000000000001 -vt 0.6874999999999999 0.9375000000000001 -vt 0.6874999999999999 2.220446049250313e-16 -vt 0.5624999999999999 2.220446049250313e-16 -vt 0.5624999999999999 0.9375000000000001 -vt 0.5625000000000001 0.9375 -vt 0.5625000000000001 0 -vt 0.6875000000000001 0 -vt 0.6875000000000001 0.9375 -vt 0.703125 0.21875 -vt 0.703125 0.265625 -vt 0.6875 0.265625 -vt 0.6875 0.21875 -vt 0.6875 0.21875 -vt 0.703125 0.21875 -vt 0.703125 0.265625 -vt 0.6875 0.265625 -vt 0.71875 0.21875 -vt 0.734375 0.21875 -vt 0.734375 0.265625 -vt 0.71875 0.265625 -vt 0.734375 0.21875 -vt 0.734375 0.265625 -vt 0.6875 0.265625 -vt 0.6875 0.21875 -vt 0.734375 0.21875 -vt 0.734375 0.265625 -vt 0.71875 0.265625 -vt 0.71875 0.21875 -vt 0.734375 0.21875 -vt 0.734375 0.265625 -vt 0.71875 0.265625 -vt 0.71875 0.21875 -vt 0.734375 0.21875 -vt 0.734375 0.265625 -vt 0.71875 0.265625 -vt 0.71875 0.21875 -vt 0.6875 0.265625 -vt 0.703125 0.265625 -vt 0.703125 0.21875 -vt 0.6875 0.21875 -vt 0.734375 0.21875 -vt 0.71875 0.21875 -vt 0.71875 0.265625 -vt 0.734375 0.265625 -vt 0.734375 0.21875 -vt 0.734375 0.265625 -vt 0.6875 0.265625 -vt 0.6875 0.21875 -vt 0.734375 0.046875 -vt 0.65625 0.046875 -vt 0.65625 0 -vt 0.734375 0 -vt 0.265625 0.25 -vt 0.34375 0.25 -vt 0.34375 0.296875 -vt 0.265625 0.296875 -vt 0.265625 0.25 -vt 0.328125 0.25 -vt 0.328125 0.296875 -vt 0.265625 0.296875 -vt 0.34375 0.296875 -vt 0.28125 0.296875 -vt 0.28125 0.25 -vt 0.34375 0.25 -vt 1 0.984375 -vt 0.9375 0.984375 -vt 0.9375 0.90625 -vt 1 0.90625 -vt 1 0.921875 -vt 0.9375 0.921875 -vt 0.9375 0.859375 -vt 1 0.859375 -vt 0.34375 0.296875 -vt 0.28125 0.296875 -vt 0.28125 0.25 -vt 0.34375 0.25 -vt 0.59375 0 -vt 0.65625 0 -vt 0.65625 0.046875 -vt 0.59375 0.046875 -vt 0.90625 0.90625 -vt 0.96875 0.90625 -vt 0.96875 0.984375 -vt 0.90625 0.984375 -vt 0.34375 0.296875 -vt 0.28125 0.296875 -vt 0.28125 0.25 -vt 0.34375 0.25 -vt 0.25 0.25 +vt 0.6875 0.9375 +vt 0.5625 0.9375 +vt 0.6875 0 +vt 0.5625 0 +vt 0.5625 0.9375 +vt 0.6875 0.9375 +vt 0.6875 0.2656 +vt 0.7031 0.2656 +vt 0.7031 0.2188 +vt 0.6875 0.2188 +vt 0.7031 0.2656 +vt 0.7031 0.2188 +vt 0.6875 0.2188 +vt 0.6875 0.2656 +vt 0.7344 0.2656 +vt 0.7344 0.2188 +vt 0.7188 0.2188 +vt 0.7188 0.2656 +vt 0.6875 0.2656 +vt 0.7344 0.2656 +vt 0.7344 0.2188 +vt 0.6875 0.2188 +vt 0.7188 0.2656 +vt 0.7344 0.2656 +vt 0.7344 0.2188 +vt 0.7188 0.2188 +vt 0.7188 0.2656 +vt 0.7344 0.2656 +vt 0.7344 0.2188 +vt 0.7188 0.2188 +vt 0.7188 0.2656 +vt 0.7344 0.2656 +vt 0.7344 0.2188 +vt 0.7188 0.2188 +vt 0.7031 0.2188 +vt 0.7031 0.2656 +vt 0.6875 0.2656 +vt 0.6875 0.2188 +vt 0.7188 0.2656 +vt 0.7188 0.2188 +vt 0.7344 0.2188 +vt 0.7344 0.2656 +vt 0.6875 0.2656 +vt 0.7344 0.2656 +vt 0.7344 0.2188 +vt 0.6875 0.2188 +vt 0.6563 0 +vt 0.6563 0.0469 +vt 0.7344 0.0469 +vt 0.7344 0 +vt 0.3438 0.2969 +vt 0.3438 0.25 +vt 0.2656 0.25 +vt 0.2656 0.2969 +vt 0.3281 0.2969 +vt 0.3281 0.25 +vt 0.2656 0.25 +vt 0.2656 0.2969 +vt 0.2813 0.25 +vt 0.2813 0.2969 +vt 0.3438 0.2969 +vt 0.3438 0.25 +vt 0.9375 0.9063 +vt 0.9375 0.9844 +vt 1 0.9844 +vt 1 0.9063 +vt 0.9375 0.8594 +vt 0.9375 0.9219 +vt 1 0.9219 +vt 1 0.8594 +vt 0.2813 0.25 +vt 0.2813 0.2969 +vt 0.3438 0.2969 +vt 0.3438 0.25 +vt 0.6563 0.0469 +vt 0.6563 0 +vt 0.5938 0 +vt 0.5938 0.0469 +vt 0.9688 0.9844 +vt 0.9688 0.9063 +vt 0.9063 0.9063 +vt 0.9063 0.9844 +vt 0.2813 0.25 +vt 0.2813 0.2969 +vt 0.3438 0.2969 +vt 0.3438 0.25 +vt 0.3125 0.2969 vt 0.3125 0.25 -vt 0.3125 0.296875 -vt 0.25 0.296875 -vt 0.90625 0.859375 -vt 0.96875 0.859375 -vt 0.96875 0.921875 -vt 0.90625 0.921875 -vt 0.453125 0.609375 -vt 0.453125 0.671875 -vt 0.4375 0.671875 -vt 0.4375 0.609375 -vt 0.375 0.609375 -vt 0.375 0.671875 -vt 0.359375 0.671875 -vt 0.359375 0.609375 -vt 0.4375 0.609375 -vt 0.4375 0.625 +vt 0.25 0.25 +vt 0.25 0.2969 +vt 0.9688 0.9219 +vt 0.9688 0.8594 +vt 0.9063 0.8594 +vt 0.9063 0.9219 +vt 0.4375 0.6719 +vt 0.4531 0.6719 +vt 0.4531 0.6094 +vt 0.4375 0.6094 +vt 0.3594 0.6719 +vt 0.375 0.6719 +vt 0.375 0.6094 +vt 0.3594 0.6094 vt 0.375 0.625 -vt 0.375 0.609375 -vt 0.5 0.609375 -vt 0.5 0.625 vt 0.4375 0.625 -vt 0.4375 0.609375 -vt 0.5 0.609375 -vt 0.5 0.671875 -vt 0.4375 0.671875 -vt 0.4375 0.609375 +vt 0.4375 0.6094 +vt 0.375 0.6094 +vt 0.4375 0.625 +vt 0.5 0.625 +vt 0.5 0.6094 +vt 0.4375 0.6094 +vt 0.4375 0.6719 +vt 0.5 0.6719 +vt 0.5 0.6094 +vt 0.4375 0.6094 +vt 0.0156 0.9063 +vt 0 0.9063 vt 0 0.8125 -vt 0 0.90625 -vt 0.015625 0.90625 -vt 0.015625 0.8125 +vt 0.0156 0.8125 +vt 0.0156 0.9063 +vt 0 0.9063 vt 0 0.8125 -vt 0 0.90625 -vt 0.015625 0.90625 -vt 0.015625 0.8125 -vt 0.09375 0.90625 -vt 0.09375 0.890625 -vt 0 0.890625 -vt 0 0.90625 -vt 0.09375 0.8125 -vt 0.09375 0.828125 -vt 0 0.828125 +vt 0.0156 0.8125 +vt 0 0.8906 +vt 0.0938 0.8906 +vt 0.0938 0.9063 +vt 0 0.9063 +vt 0 0.8281 +vt 0.0938 0.8281 +vt 0.0938 0.8125 vt 0 0.8125 +vt 0.0938 0.9063 +vt 0 0.9063 vt 0 0.8125 -vt 0 0.90625 -vt 0.09375 0.90625 -vt 0.09375 0.8125 -vt 0.21875 0.125 -vt 0.21875 0.0625 +vt 0.0938 0.8125 vt 0.25 0.0625 +vt 0.2188 0.0625 +vt 0.2188 0.125 vt 0.25 0.125 -vt 0 0.125 +vt 0.0313 0.0625 vt 0 0.0625 -vt 0.03125 0.0625 -vt 0.03125 0.125 -vt 0.21875 0.03125 -vt 0.125 0.03125 +vt 0 0.125 +vt 0.0313 0.125 vt 0.125 0 -vt 0.21875 0 -vt 0.40625 0.03125 -vt 0.3125 0.03125 +vt 0.125 0.0313 +vt 0.2188 0.0313 +vt 0.2188 0 vt 0.3125 0 -vt 0.40625 0 +vt 0.3125 0.0313 +vt 0.4063 0.0313 +vt 0.4063 0 +vt 0.8438 1 +vt 0.8438 0.9375 vt 0.75 0.9375 -vt 0.84375 0.9375 -vt 0.84375 1 vt 0.75 1 +vt 0.8438 0.3125 +vt 0.8438 0.25 vt 0.75 0.25 -vt 0.84375 0.25 -vt 0.84375 0.3125 vt 0.75 0.3125 -vt 0.25 0 +vt 0.2188 0.0625 vt 0.25 0.0625 -vt 0.21875 0.0625 -vt 0.21875 0 -vt 0.03125 0 -vt 0.03125 0.0625 +vt 0.25 0 +vt 0.2188 0 vt 0 0.0625 +vt 0.0313 0.0625 +vt 0.0313 0 vt 0 0 +vt 0.9063 0.25 +vt 0.9063 0.3125 vt 1 0.3125 -vt 0.90625 0.3125 -vt 0.90625 0.25 vt 1 0.25 -vt 0.21875 0 +vt 0.3125 0.0313 vt 0.3125 0 -vt 0.3125 0.03125 -vt 0.21875 0.03125 -vt 0.03125 0 +vt 0.2188 0 +vt 0.2188 0.0313 +vt 0.125 0.0313 vt 0.125 0 -vt 0.125 0.03125 -vt 0.03125 0.03125 +vt 0.0313 0 +vt 0.0313 0.0313 +vt 0.9063 0.9375 +vt 0.9063 1 vt 1 1 -vt 0.90625 1 -vt 0.90625 0.9375 vt 1 0.9375 -vt 0.6875 0.3125 -vt 0.6875 0.9375 -vt 0.5625 0.9375 -vt 0.5625 0.3125 vt 0.5625 0.9375 +vt 0.6875 0.9375 +vt 0.6875 0.3125 vt 0.5625 0.3125 vt 0.6875 0.3125 +vt 0.5625 0.3125 +vt 0.5625 0.9375 vt 0.6875 0.9375 -vt 0.6875 0 -vt 0.6875 0.625 vt 0.5625 0.625 +vt 0.6875 0.625 +vt 0.6875 0 vt 0.5625 0 -vt 0.5625 0.9375 -vt 0.5625 0.3125 vt 0.6875 0.3125 +vt 0.5625 0.3125 +vt 0.5625 0.9375 vt 0.6875 0.9375 -vt 0.734375 0.21875 -vt 0.734375 0.265625 -vt 0.71875 0.265625 -vt 0.71875 0.21875 -vt 0.703125 0.21875 -vt 0.703125 0.265625 -vt 0.6875 0.265625 -vt 0.6875 0.21875 -vt 0.6875 0.21875 -vt 0.703125 0.21875 -vt 0.703125 0.265625 -vt 0.6875 0.265625 -vt 0.734375 0.21875 -vt 0.734375 0.265625 -vt 0.6875 0.265625 -vt 0.6875 0.21875 -vt 0.734375 0.21875 -vt 0.734375 0.265625 -vt 0.6875 0.265625 -vt 0.6875 0.21875 -vt 0.6874999999999999 0.6875000000000001 -vt 0.6874999999999999 0.8750000000000001 -vt 0.5624999999999999 0.8750000000000001 -vt 0.5624999999999999 0.6875000000000001 -vt 0.6874999999999999 0.6875000000000001 -vt 0.6874999999999999 0.8750000000000001 -vt 0.5624999999999999 0.8750000000000001 -vt 0.5624999999999999 0.6875000000000001 -vt 0.6874999999999999 0.7500000000000001 -vt 0.6874999999999999 0.8750000000000001 -vt 0.5624999999999999 0.8750000000000001 -vt 0.5624999999999999 0.7500000000000001 -vt 0.6874999999999999 0.6875000000000001 -vt 0.6874999999999999 0.8750000000000001 -vt 0.5624999999999999 0.8750000000000001 -vt 0.5624999999999999 0.6875000000000001 -vt 0.5624999999999999 0.8750000000000001 -vt 0.5624999999999999 0.6875000000000001 -vt 0.6874999999999999 0.6875000000000001 -vt 0.6874999999999999 0.8750000000000001 -vt 0.6875 0.25 -vt 0.6875 0.375 +vt 0.7188 0.2656 +vt 0.7344 0.2656 +vt 0.7344 0.2188 +vt 0.7188 0.2188 +vt 0.6875 0.2656 +vt 0.7031 0.2656 +vt 0.7031 0.2188 +vt 0.6875 0.2188 +vt 0.7031 0.2656 +vt 0.7031 0.2188 +vt 0.6875 0.2188 +vt 0.6875 0.2656 +vt 0.6875 0.2656 +vt 0.7344 0.2656 +vt 0.7344 0.2188 +vt 0.6875 0.2188 +vt 0.6875 0.2656 +vt 0.7344 0.2656 +vt 0.7344 0.2188 +vt 0.6875 0.2188 +vt 0.5625 0.875 +vt 0.6875 0.875 +vt 0.6875 0.6875 +vt 0.5625 0.6875 +vt 0.5625 0.875 +vt 0.6875 0.875 +vt 0.6875 0.6875 +vt 0.5625 0.6875 +vt 0.5625 0.875 +vt 0.6875 0.875 +vt 0.6875 0.75 +vt 0.5625 0.75 +vt 0.5625 0.875 +vt 0.6875 0.875 +vt 0.6875 0.6875 +vt 0.5625 0.6875 +vt 0.6875 0.6875 +vt 0.5625 0.6875 +vt 0.5625 0.875 +vt 0.6875 0.875 vt 0.5625 0.375 +vt 0.6875 0.375 +vt 0.6875 0.25 vt 0.5625 0.25 -vt 0.875 0.125 -vt 0.75 0.125 vt 0.75 0 +vt 0.75 0.125 +vt 0.875 0.125 vt 0.875 0 -vt 0.7505429453184171 0.12553826913219746 -vt 0.7494617308678025 0.0005429453184171429 -vt 0.8744570546815829 0 -vt 0.8755382691321975 0.12445705468158286 -vt 0.6874999999999999 0.3125000000000001 -vt 0.5624999999999999 0.3125000000000001 -vt 0.5624999999999999 0.2500000000000001 -vt 0.6874999999999999 0.2500000000000001 -vt 0.734375 0.21875 -vt 0.734375 0.265625 -vt 0.71875 0.265625 -vt 0.71875 0.21875 -vt 0.703125 0.21875 -vt 0.703125 0.265625 -vt 0.6875 0.265625 -vt 0.6875 0.21875 -vt 0.6875 0.21875 -vt 0.703125 0.21875 -vt 0.703125 0.265625 -vt 0.6875 0.265625 -vt 0.734375 0.21875 -vt 0.734375 0.265625 -vt 0.6875 0.265625 -vt 0.6875 0.21875 -vt 0.84375 0.71875 -vt 0.84375 0.859375 -vt 0.828125 0.859375 -vt 0.828125 0.71875 -vt 0.84375 0.71875 -vt 0.84375 0.859375 -vt 0.828125 0.859375 -vt 0.828125 0.71875 -vt 0.828125 0.734375 -vt 0.84375 0.734375 -vt 0.84375 0.84375 -vt 0.828125 0.84375 -vt 0.84375 0.859375 -vt 0.828125 0.859375 -vt 0.828125 0.75 -vt 0.84375 0.75 -vt 0.84375 0.71875 -vt 0.84375 0.859375 -vt 0.734375 0.859375 -vt 0.734375 0.71875 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.3582640625 -vt 1 0.3582640625 -vt 0.984375 0.515625 -vt 0.984375 0.328125 -vt 1 0.328125 -vt 1 0.515625 -vt 0.546875 0.25 -vt 0.734375 0.25 -vt 0.734375 0.328125 -vt 0.46875 0.328125 -vt 0.734375 0.265625 -vt 0.921875 0.265625 -vt 1 0.34375 -vt 0.734375 0.34375 +vt 0.8745 0 +vt 0.7495 0.0005 +vt 0.7505 0.1255 +vt 0.8755 0.1245 +vt 0.5625 0.25 +vt 0.5625 0.3125 +vt 0.6875 0.3125 +vt 0.6875 0.25 +vt 0.7188 0.2656 +vt 0.7344 0.2656 +vt 0.7344 0.2188 +vt 0.7188 0.2188 +vt 0.6875 0.2656 +vt 0.7031 0.2656 +vt 0.7031 0.2188 +vt 0.6875 0.2188 +vt 0.7031 0.2656 +vt 0.7031 0.2188 +vt 0.6875 0.2188 +vt 0.6875 0.2656 +vt 0.6875 0.2656 +vt 0.7344 0.2656 +vt 0.7344 0.2188 +vt 0.6875 0.2188 +vt 0.8281 0.8594 +vt 0.8438 0.8594 +vt 0.8438 0.7188 +vt 0.8281 0.7188 +vt 0.8281 0.8594 +vt 0.8438 0.8594 +vt 0.8438 0.7188 +vt 0.8281 0.7188 +vt 0.8438 0.8438 +vt 0.8438 0.7344 +vt 0.8281 0.7344 +vt 0.8281 0.8438 +vt 0.8281 0.75 +vt 0.8281 0.8594 +vt 0.8438 0.8594 +vt 0.8438 0.75 +vt 0.7344 0.8594 +vt 0.8438 0.8594 +vt 0.8438 0.7188 +vt 0.7344 0.7188 +vt 0.9844 0.3583 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.3583 +vt 1 0.3281 +vt 0.9844 0.3281 +vt 0.9844 0.5156 +vt 1 0.5156 +vt 0.7344 0.3281 +vt 0.7344 0.25 +vt 0.5469 0.25 +vt 0.4688 0.3281 +vt 1 0.3438 +vt 0.9219 0.2656 +vt 0.7344 0.2656 +vt 0.7344 0.3438 +vt 0.9844 0.3281 +vt 0.9844 0.5 vt 1 0.5 -vt 0.984375 0.5 -vt 0.984375 0.328125 -vt 1 0.328125 -vt 0.734375 0.34375 -vt 1 0.34375 -vt 1 0.515625 -vt 0.734375 0.515625 -vt 0.734375 0.34375 -vt 1 0.34375 -vt 1 0.515625 -vt 0.734375 0.515625 +vt 1 0.3281 +vt 1 0.5156 +vt 1 0.3438 +vt 0.7344 0.3438 +vt 0.7344 0.5156 +vt 1 0.5156 +vt 1 0.3438 +vt 0.7344 0.3438 +vt 0.7344 0.5156 +vt 0.9844 0.3594 +vt 0.9844 0.4375 vt 1 0.4375 -vt 0.984375 0.4375 -vt 0.984375 0.359375 -vt 1 0.359375 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.3582640625 -vt 1 0.3582640625 -vt 0.984375 0.515625 -vt 0.984375 0.328125 -vt 1 0.328125 -vt 1 0.515625 -vt 0.546875 0.25 -vt 0.734375 0.25 -vt 0.734375 0.328125 -vt 0.46875 0.328125 -vt 0.734375 0.265625 -vt 0.921875 0.265625 -vt 1 0.34375 -vt 0.734375 0.34375 +vt 1 0.3594 +vt 0.9844 0.3583 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.3583 +vt 1 0.3281 +vt 0.9844 0.3281 +vt 0.9844 0.5156 +vt 1 0.5156 +vt 0.7344 0.3281 +vt 0.7344 0.25 +vt 0.5469 0.25 +vt 0.4688 0.3281 +vt 1 0.3438 +vt 0.9219 0.2656 +vt 0.7344 0.2656 +vt 0.7344 0.3438 +vt 0.9844 0.3281 +vt 0.9844 0.5 vt 1 0.5 -vt 0.984375 0.5 -vt 0.984375 0.328125 -vt 1 0.328125 +vt 1 0.3281 +vt 0.9844 0.3281 +vt 0.9844 0.5 vt 1 0.5 -vt 0.984375 0.5 -vt 0.984375 0.328125 -vt 1 0.328125 -vt 0.59375 0.140625 -vt 0.59375 0.40625 -vt 0.578125 0.40625 -vt 0.578125 0.140625 -vt 0.734375 0.34375 -vt 1 0.34375 -vt 1 0.515625 -vt 0.734375 0.515625 -vt 0.734375 0.34375 -vt 1 0.34375 -vt 1 0.515625 -vt 0.734375 0.515625 -vt 0.90625 0.859375 -vt 0.90625 0.984375 -vt 0.859375 0.984375 -vt 0.859375 0.859375 -vt 0.59375 0 -vt 0.59375 0.125 -vt 0.546875 0.125 -vt 0.546875 0 -vt 0.34375 0.25 -vt 0.34375 0.296875 -vt 0.25 0.296875 +vt 1 0.3281 +vt 0.5781 0.4063 +vt 0.5938 0.4063 +vt 0.5938 0.1406 +vt 0.5781 0.1406 +vt 1 0.5156 +vt 1 0.3438 +vt 0.7344 0.3438 +vt 0.7344 0.5156 +vt 1 0.5156 +vt 1 0.3438 +vt 0.7344 0.3438 +vt 0.7344 0.5156 +vt 0.8594 0.9844 +vt 0.9063 0.9844 +vt 0.9063 0.8594 +vt 0.8594 0.8594 +vt 0.5469 0.125 +vt 0.5938 0.125 +vt 0.5938 0 +vt 0.5469 0 +vt 0.25 0.2969 +vt 0.3438 0.2969 +vt 0.3438 0.25 vt 0.25 0.25 -vt 0.34375 0.25 -vt 0.34375 0.296875 -vt 0.25 0.296875 +vt 0.25 0.2969 +vt 0.3438 0.2969 +vt 0.3438 0.25 vt 0.25 0.25 -vt 1 0.859375 -vt 1 0.984375 -vt 0.90625 0.984375 -vt 0.90625 0.859375 -vt 0.90625 0.859375 -vt 0.90625 0.984375 -vt 0.859375 0.984375 -vt 0.859375 0.859375 -vt 0.90625 0.859375 -vt 0.90625 0.984375 -vt 0.859375 0.984375 -vt 0.859375 0.859375 -vt 0.34375 0.25 -vt 0.34375 0.296875 -vt 0.25 0.296875 +vt 0.9063 0.9844 +vt 1 0.9844 +vt 1 0.8594 +vt 0.9063 0.8594 +vt 0.8594 0.9844 +vt 0.9063 0.9844 +vt 0.9063 0.8594 +vt 0.8594 0.8594 +vt 0.8594 0.9844 +vt 0.9063 0.9844 +vt 0.9063 0.8594 +vt 0.8594 0.8594 +vt 0.25 0.2969 +vt 0.3438 0.2969 +vt 0.3438 0.25 vt 0.25 0.25 -vt 0.34375 0.25 -vt 0.34375 0.296875 -vt 0.25 0.296875 +vt 0.25 0.2969 +vt 0.3438 0.2969 +vt 0.3438 0.25 vt 0.25 0.25 -vt 1 0.859375 -vt 1 0.984375 -vt 0.90625 0.984375 -vt 0.90625 0.859375 -vt 0.5625 0.9375000000000001 +vt 0.9063 0.9844 +vt 1 0.9844 +vt 1 0.8594 +vt 0.9063 0.8594 +vt 0.6875 0 +vt 0.5625 0 +vt 0.5625 0.9375 +vt 0.6875 0.9375 vt 0.5625 0 vt 0.6875 0 -vt 0.6875 0.9375000000000001 -vt 0.6874999999999999 0.9375000000000001 -vt 0.6874999999999999 2.220446049250313e-16 -vt 0.5624999999999999 2.220446049250313e-16 -vt 0.5624999999999999 0.9375000000000001 -vt 0.5625000000000001 0.9375 -vt 0.5625000000000001 0 -vt 0.6875000000000001 0 -vt 0.6875000000000001 0.9375 -vt 0.734375 0.21875 -vt 0.734375 0.265625 -vt 0.71875 0.265625 -vt 0.71875 0.21875 -vt 0.734375 0.21875 -vt 0.734375 0.265625 -vt 0.71875 0.265625 -vt 0.71875 0.21875 -vt 0.6875 0.265625 -vt 0.703125 0.265625 -vt 0.703125 0.21875 -vt 0.6875 0.21875 -vt 0.734375 0.21875 -vt 0.71875 0.21875 -vt 0.71875 0.265625 -vt 0.734375 0.265625 -vt 0.734375 0.21875 -vt 0.734375 0.265625 -vt 0.6875 0.265625 -vt 0.6875 0.21875 -vt 0.703125 0.21875 -vt 0.703125 0.265625 -vt 0.6875 0.265625 -vt 0.6875 0.21875 -vt 0.6875 0.21875 -vt 0.703125 0.21875 -vt 0.703125 0.265625 -vt 0.6875 0.265625 -vt 0.71875 0.21875 -vt 0.734375 0.21875 -vt 0.734375 0.265625 -vt 0.71875 0.265625 -vt 0.734375 0.21875 -vt 0.734375 0.265625 -vt 0.6875 0.265625 -vt 0.6875 0.21875 -vt 0.734375 0.21875 -vt 0.734375 0.265625 -vt 0.71875 0.265625 -vt 0.71875 0.21875 -vt 0.734375 0.21875 -vt 0.734375 0.265625 -vt 0.71875 0.265625 -vt 0.71875 0.21875 -vt 0.703125 0.21875 -vt 0.703125 0.265625 -vt 0.6875 0.265625 -vt 0.6875 0.21875 -vt 0.6875 0.21875 -vt 0.703125 0.21875 -vt 0.703125 0.265625 -vt 0.6875 0.265625 -vt 0.71875 0.21875 -vt 0.734375 0.21875 -vt 0.734375 0.265625 -vt 0.71875 0.265625 -vt 0.734375 0.21875 -vt 0.734375 0.265625 -vt 0.6875 0.265625 -vt 0.6875 0.21875 -vt 0.703125 0.21875 -vt 0.703125 0.265625 -vt 0.6875 0.265625 -vt 0.6875 0.21875 -vt 0.6875 0.21875 -vt 0.703125 0.21875 -vt 0.703125 0.265625 -vt 0.6875 0.265625 -vt 0.71875 0.21875 -vt 0.734375 0.21875 -vt 0.734375 0.265625 -vt 0.71875 0.265625 -vt 0.734375 0.21875 -vt 0.734375 0.265625 -vt 0.6875 0.265625 -vt 0.6875 0.21875 -vt 0.734375 0.21875 -vt 0.734375 0.265625 -vt 0.71875 0.265625 -vt 0.71875 0.21875 +vt 0.6875 0.9375 +vt 0.5625 0.9375 +vt 0.6875 0 +vt 0.5625 0 +vt 0.5625 0.9375 +vt 0.6875 0.9375 +vt 0.7188 0.2656 +vt 0.7344 0.2656 +vt 0.7344 0.2188 +vt 0.7188 0.2188 +vt 0.7188 0.2656 +vt 0.7344 0.2656 +vt 0.7344 0.2188 +vt 0.7188 0.2188 +vt 0.7031 0.2188 +vt 0.7031 0.2656 +vt 0.6875 0.2656 +vt 0.6875 0.2188 +vt 0.7188 0.2656 +vt 0.7188 0.2188 +vt 0.7344 0.2188 +vt 0.7344 0.2656 +vt 0.6875 0.2656 +vt 0.7344 0.2656 +vt 0.7344 0.2188 +vt 0.6875 0.2188 +vt 0.6875 0.2656 +vt 0.7031 0.2656 +vt 0.7031 0.2188 +vt 0.6875 0.2188 +vt 0.7031 0.2656 +vt 0.7031 0.2188 +vt 0.6875 0.2188 +vt 0.6875 0.2656 +vt 0.7344 0.2656 +vt 0.7344 0.2188 +vt 0.7188 0.2188 +vt 0.7188 0.2656 +vt 0.6875 0.2656 +vt 0.7344 0.2656 +vt 0.7344 0.2188 +vt 0.6875 0.2188 +vt 0.7188 0.2656 +vt 0.7344 0.2656 +vt 0.7344 0.2188 +vt 0.7188 0.2188 +vt 0.7188 0.2656 +vt 0.7344 0.2656 +vt 0.7344 0.2188 +vt 0.7188 0.2188 +vt 0.6875 0.2656 +vt 0.7031 0.2656 +vt 0.7031 0.2188 +vt 0.6875 0.2188 +vt 0.7031 0.2656 +vt 0.7031 0.2188 +vt 0.6875 0.2188 +vt 0.6875 0.2656 +vt 0.7344 0.2656 +vt 0.7344 0.2188 +vt 0.7188 0.2188 +vt 0.7188 0.2656 +vt 0.6875 0.2656 +vt 0.7344 0.2656 +vt 0.7344 0.2188 +vt 0.6875 0.2188 +vt 0.6875 0.2656 +vt 0.7031 0.2656 +vt 0.7031 0.2188 +vt 0.6875 0.2188 +vt 0.7031 0.2656 +vt 0.7031 0.2188 +vt 0.6875 0.2188 +vt 0.6875 0.2656 +vt 0.7344 0.2656 +vt 0.7344 0.2188 +vt 0.7188 0.2188 +vt 0.7188 0.2656 +vt 0.6875 0.2656 +vt 0.7344 0.2656 +vt 0.7344 0.2188 +vt 0.6875 0.2188 +vt 0.7188 0.2656 +vt 0.7344 0.2656 +vt 0.7344 0.2188 +vt 0.7188 0.2188 +vt 0.6875 0.2188 +vt 0.5625 0.2188 vt 0.5625 1 -vt 0.5625 0.21875 -vt 0.6875 0.21875 vt 0.6875 1 +vt 0.6875 0.2188 +vt 0.5625 0.2188 vt 0.5625 1 -vt 0.5625 0.21875 -vt 0.6875 0.21875 vt 0.6875 1 +vt 0.5625 0.7813 +vt 0.6875 0.7813 vt 0.6875 0 -vt 0.6875 0.78125 -vt 0.5625 0.78125 vt 0.5625 0 +vt 0.6875 0.2188 +vt 0.5625 0.2188 vt 0.5625 1 -vt 0.5625 0.21875 -vt 0.6875 0.21875 vt 0.6875 1 -vt 0.734375 0.21875 -vt 0.734375 0.265625 -vt 0.71875 0.265625 -vt 0.71875 0.21875 -vt 0.734375 0.21875 -vt 0.734375 0.265625 -vt 0.71875 0.265625 -vt 0.71875 0.21875 -vt 0.6875 0.265625 -vt 0.703125 0.265625 -vt 0.703125 0.21875 -vt 0.6875 0.21875 -vt 0.734375 0.21875 -vt 0.71875 0.21875 -vt 0.71875 0.265625 -vt 0.734375 0.265625 -vt 0.734375 0.21875 -vt 0.734375 0.265625 -vt 0.6875 0.265625 -vt 0.6875 0.21875 -vt 0.6875000000000001 0.6874999999999999 -vt 0.6875000000000001 0.8749999999999999 -vt 0.5625000000000001 0.8749999999999999 -vt 0.5625000000000001 0.6874999999999999 -vt 0.6875000000000001 0.6874999999999999 -vt 0.6875000000000001 0.8749999999999999 -vt 0.5625000000000001 0.8749999999999999 -vt 0.5625000000000001 0.6874999999999999 -vt 0.6875000000000001 0.6874999999999999 -vt 0.6875000000000001 0.8749999999999999 -vt 0.5625000000000001 0.8749999999999999 -vt 0.5625000000000001 0.6874999999999999 -vt 0.5625000000000001 0.8749999999999999 -vt 0.5625000000000001 0.6874999999999999 -vt 0.6875000000000001 0.6874999999999999 -vt 0.6875000000000001 0.8749999999999999 -vt 0.6875 0.375 -vt 0.5625 0.375 +vt 0.7188 0.2656 +vt 0.7344 0.2656 +vt 0.7344 0.2188 +vt 0.7188 0.2188 +vt 0.7188 0.2656 +vt 0.7344 0.2656 +vt 0.7344 0.2188 +vt 0.7188 0.2188 +vt 0.7031 0.2188 +vt 0.7031 0.2656 +vt 0.6875 0.2656 +vt 0.6875 0.2188 +vt 0.7188 0.2656 +vt 0.7188 0.2188 +vt 0.7344 0.2188 +vt 0.7344 0.2656 +vt 0.6875 0.2656 +vt 0.7344 0.2656 +vt 0.7344 0.2188 +vt 0.6875 0.2188 +vt 0.5625 0.875 +vt 0.6875 0.875 +vt 0.6875 0.6875 +vt 0.5625 0.6875 +vt 0.5625 0.875 +vt 0.6875 0.875 +vt 0.6875 0.6875 +vt 0.5625 0.6875 +vt 0.5625 0.875 +vt 0.6875 0.875 +vt 0.6875 0.6875 +vt 0.5625 0.6875 +vt 0.6875 0.6875 +vt 0.5625 0.6875 +vt 0.5625 0.875 +vt 0.6875 0.875 vt 0.5625 0.25 +vt 0.5625 0.375 +vt 0.6875 0.375 vt 0.6875 0.25 -vt 0.5624999999999999 0.3125000000000001 -vt 0.6874999999999999 0.3125000000000001 -vt 0.6874999999999999 0.3750000000000001 -vt 0.5624999999999999 0.3750000000000001 -vt 0.875 0 -vt 0.875 0.125 +vt 0.6875 0.375 +vt 0.6875 0.3125 +vt 0.5625 0.3125 +vt 0.5625 0.375 vt 0.8125 0.125 +vt 0.875 0.125 +vt 0.875 0 vt 0.75 0 -vt 0.75 0.125 -vt 0.8125 0 vt 0.875 0 +vt 0.8125 0 +vt 0.75 0.125 vt 0.875 0.125 -vt 0.6875000000000001 0.3124999999999999 -vt 0.6875000000000001 0.875 -vt 0.5625000000000001 0.875 -vt 0.5625000000000001 0.3124999999999999 -vt 0.6874999999999999 0.3125000000000001 -vt 0.6874999999999999 0.875 -vt 0.5624999999999999 0.875 -vt 0.5624999999999999 0.3125000000000001 -vt 0.65625 0.09375 -vt 0.65625 0.65625 -vt 0.53125 0.65625 -vt 0.53125 0.09375 -vt 0.5624999999999999 0.9375 -vt 0.5624999999999999 0.3750000000000001 -vt 0.6874999999999999 0.3750000000000001 -vt 0.6874999999999999 0.9375 +vt 0.5625 0.875 +vt 0.6875 0.875 +vt 0.6875 0.3125 +vt 0.5625 0.3125 +vt 0.5625 0.875 +vt 0.6875 0.875 +vt 0.6875 0.3125 +vt 0.5625 0.3125 +vt 0.5313 0.6563 +vt 0.6563 0.6563 +vt 0.6563 0.0938 +vt 0.5313 0.0938 vt 0.6875 0.375 vt 0.5625 0.375 +vt 0.5625 0.9375 +vt 0.6875 0.9375 vt 0.5625 0.25 +vt 0.5625 0.375 +vt 0.6875 0.375 vt 0.6875 0.25 -vt 0.5624999999999999 0.3125000000000001 -vt 0.6874999999999999 0.3125000000000001 -vt 0.6874999999999999 0.3750000000000001 -vt 0.5624999999999999 0.3750000000000001 -vt 0.875 0 -vt 0.875 0.125 +vt 0.6875 0.375 +vt 0.6875 0.3125 +vt 0.5625 0.3125 +vt 0.5625 0.375 vt 0.8125 0.125 +vt 0.875 0.125 +vt 0.875 0 vt 0.75 0 -vt 0.75 0.125 -vt 0.8125 0 vt 0.875 0 +vt 0.8125 0 +vt 0.75 0.125 vt 0.875 0.125 -vt 0.6875 0.25 -vt 0.6875 0.375 vt 0.625 0.375 -vt 0.625 0.25 -vt 0.6875 0.25 vt 0.6875 0.375 -vt 0.625 0.375 +vt 0.6875 0.25 vt 0.625 0.25 +vt 0.625 0.375 +vt 0.6875 0.375 vt 0.6875 0.25 -vt 0.6875 0.3125 +vt 0.625 0.25 vt 0.5625 0.3125 -vt 0.5625 0.25 -vt 0.6875 0.25 vt 0.6875 0.3125 +vt 0.6875 0.25 +vt 0.5625 0.25 vt 0.5625 0.3125 +vt 0.6875 0.3125 +vt 0.6875 0.25 vt 0.5625 0.25 -vt 0.734375 0 -vt 0.734375 0 +vt 0.7344 0 +vt 0.7344 0 vt 0.5 0 -vt 0.734375 0 vt 0.5 0 -vt 0.734375 0 -vt 0.234375 0 -vt 0.234375 0.25 +vt 0.7344 0 +vt 0.7344 0 vt 0 0.25 +vt 0.2344 0.25 +vt 0.2344 0 vt 0 0 -vt 0.734375 0 -vt 0.734375 0.25 -vt 0.734375 0.25 -vt 0.734375 0 -vt 0.734375 0 -vt 0.734375 0 +vt 0.7344 0.25 +vt 0.7344 0.25 +vt 0.7344 0 vt 0.5 0 +vt 0.7344 0 +vt 0.7344 0 vt 0.5 0 -vt 0.734375 0 -vt 0.734375 0 vt 0.5 0 +vt 0.7344 0 vt 0.5 0 -vt 0.46875 0 -vt 0.46875 0.25 -vt 0.234375 0.25 -vt 0.234375 0 -vt 1 0.46875 -vt 0.984375 0.46875 -vt 0.984375 0.3582640625 -vt 1 0.3582640625 -vt 0.984375 0.515625 -vt 0.984375 0.328125 -vt 1 0.328125 -vt 1 0.515625 -vt 0.546875 0.25 -vt 0.734375 0.25 -vt 0.734375 0.328125 -vt 0.46875 0.328125 -vt 0.734375 0.265625 -vt 0.921875 0.265625 -vt 1 0.34375 -vt 0.734375 0.34375 -vt 0.46875 0.3125 -vt 0.453125 0.3125 -vt 0.453125 0.140625 -vt 0.46875 0.140625 +vt 0.2344 0.25 +vt 0.4688 0.25 +vt 0.4688 0 +vt 0.2344 0 +vt 0.9844 0.3583 +vt 0.9844 0.4688 +vt 1 0.4688 +vt 1 0.3583 +vt 1 0.3281 +vt 0.9844 0.3281 +vt 0.9844 0.5156 +vt 1 0.5156 +vt 0.7344 0.3281 +vt 0.7344 0.25 +vt 0.5469 0.25 +vt 0.4688 0.3281 +vt 1 0.3438 +vt 0.9219 0.2656 +vt 0.7344 0.2656 +vt 0.7344 0.3438 +vt 0.4531 0.1406 +vt 0.4531 0.3125 +vt 0.4688 0.3125 +vt 0.4688 0.1406 +vt 0.9844 0.3281 +vt 0.9844 0.5 vt 1 0.5 -vt 0.984375 0.5 -vt 0.984375 0.328125 -vt 1 0.328125 -vt 0.59375 0.140625 -vt 0.59375 0.40625 -vt 0.578125 0.40625 -vt 0.578125 0.140625 -vt 0.734375 0.34375 -vt 1 0.34375 -vt 1 0.515625 -vt 0.734375 0.515625 -vt 0.734375 0.34375 -vt 1 0.34375 -vt 1 0.515625 -vt 0.734375 0.515625 -vt 0.0625 0.9375 -vt 0.0625 0.0625 +vt 1 0.3281 +vt 0.5781 0.4063 +vt 0.5938 0.4063 +vt 0.5938 0.1406 +vt 0.5781 0.1406 +vt 1 0.5156 +vt 1 0.3438 +vt 0.7344 0.3438 +vt 0.7344 0.5156 +vt 1 0.5156 +vt 1 0.3438 +vt 0.7344 0.3438 +vt 0.7344 0.5156 vt 0.9375 0.0625 -vt 0.9375 0.9375 -vt 0.0625 0.9375 vt 0.0625 0.0625 -vt 0.9375 0.0625 +vt 0.0625 0.9375 vt 0.9375 0.9375 -vt 0.9375 0.875 -vt 0.9375 1 -vt 0.0625 1 -vt 0.0625 0.875 -vt 1 0.71875 -vt 1 0.859375 -vt 0.84375 0.859375 -vt 0.84375 0.71875 -vt 0.25 0.53125 -vt 0.25 0.765625 -vt 0 0.765625 -vt 0 0.53125 -vt 0.484375 0.53125 -vt 0.484375 0.765625 -vt 0.25 0.765625 -vt 0.25 0.53125 -vt 0.484375 0.53125 -vt 0.484375 0.765625 -vt 0.234375 0.765625 -vt 0.234375 0.53125 -vt 0.234375 0.484375 -vt 0 0.484375 +vt 0 0.7656 +vt 0.25 0.7656 +vt 0.25 0.5313 +vt 0 0.5313 +vt 0.25 0.7656 +vt 0.4844 0.7656 +vt 0.4844 0.5313 +vt 0.25 0.5313 +vt 0.2344 0.7656 +vt 0.4844 0.7656 +vt 0.4844 0.5313 +vt 0.2344 0.5313 vt 0 0.25 -vt 0.234375 0.25 -vt 0.484375 0.765625 -vt 0.484375 1 -vt 0.234375 1 -vt 0.234375 0.765625 -vt 0.234375 0.765625 -vt 0.484375 0.765625 -vt 0.484375 1 -vt 0.234375 1 -vt 0.484375 0.765625 -vt 0.484375 1 -vt 0.25 1 -vt 0.25 0.765625 -vt 0.25 0.765625 +vt 0 0.4844 +vt 0.2344 0.4844 +vt 0.2344 0.25 +vt 0.2344 1 +vt 0.4844 1 +vt 0.4844 0.7656 +vt 0.2344 0.7656 +vt 0.4844 1 +vt 0.4844 0.7656 +vt 0.2344 0.7656 +vt 0.2344 1 vt 0.25 1 +vt 0.4844 1 +vt 0.4844 0.7656 +vt 0.25 0.7656 vt 0 1 -vt 0 0.765625 -vt 0 0.765625 -vt 0.25 0.765625 vt 0.25 1 +vt 0.25 0.7656 +vt 0 0.7656 +vt 0.25 1 +vt 0.25 0.7656 +vt 0 0.7656 vt 0 1 -vt 0.484375 0.765625 -vt 0.484375 1 vt 0.25 1 -vt 0.25 0.765625 -vt 1 0.46875 -vt 1 0.484375 -vt 0.984375 0.484375 -vt 0.984375 0.46875 -vt 1 0.46875 -vt 1 0.484375 -vt 0.984375 0.484375 -vt 0.984375 0.46875 -vt 1 0.46875 -vt 1 0.484375 -vt 0.984375 0.484375 -vt 0.984375 0.46875 -vt 1 0.46875 -vt 1 0.484375 -vt 0.984375 0.484375 -vt 0.984375 0.46875 -vt 1 0.46875 -vt 1 0.484375 -vt 0.984375 0.484375 -vt 0.984375 0.46875 -vt 1 0.46875 -vt 1 0.484375 -vt 0.984375 0.484375 -vt 0.984375 0.46875 -vt 1 0.46875 -vt 1 0.484375 -vt 0.984375 0.484375 -vt 0.984375 0.46875 -vt 1 0.46875 -vt 1 0.484375 -vt 0.984375 0.484375 -vt 0.984375 0.46875 -vt 0.734375 0 -vt 0.734375 0.25 -vt 0.734375 0.25 -vt 0.734375 0 -vn 0 0 -1 +vt 0.4844 1 +vt 0.4844 0.7656 +vt 0.25 0.7656 +vt 0.9844 0.4844 +vt 1 0.4844 +vt 1 0.4688 +vt 0.9844 0.4688 +vt 0.9844 0.4844 +vt 1 0.4844 +vt 1 0.4688 +vt 0.9844 0.4688 +vt 0.9844 0.4844 +vt 1 0.4844 +vt 1 0.4688 +vt 0.9844 0.4688 +vt 0.9844 0.4844 +vt 1 0.4844 +vt 1 0.4688 +vt 0.9844 0.4688 +vt 0.9844 0.4844 +vt 1 0.4844 +vt 1 0.4688 +vt 0.9844 0.4688 +vt 0.9844 0.4844 +vt 1 0.4844 +vt 1 0.4688 +vt 0.9844 0.4688 +vt 0.9844 0.4844 +vt 1 0.4844 +vt 1 0.4688 +vt 0.9844 0.4688 +vt 0.9844 0.4844 +vt 1 0.4844 +vt 1 0.4688 +vt 0.9844 0.4688 +vt 0.7344 0.25 +vt 0.7344 0.25 +vt 0.7344 0 +vt 0.7344 0 +vt 0.75 0.2344 +vt 0.75 0.2656 +vt 0.5 0.2656 +vt 0.5 0.2344 +vt 0.0313 0.7344 +vt 0.0313 0.9219 +vt 0 0.9219 +vt 0 0.7344 +vt 0.9375 0.0625 +vt 0.0625 0.0625 +vt 0.0625 0.9375 +vt 0.9375 0.9375 +vt 0.0625 1 +vt 0.9375 1 +vt 0.9375 0.875 +vt 0.0625 0.875 +vt 0.1406 1 +vt 0.1563 1 +vt 0.1563 0.9531 +vt 0.1406 0.9531 +vt 0.1406 1 +vt 0.375 1 +vt 0.375 0.9844 +vt 0.1406 0.9844 +vt 0.1406 1 +vt 0.375 1 +vt 0.375 0.9531 +vt 0.1406 0.9531 +vt 0.75 0.4063 +vt 0.75 0.6563 +vt 0.5 0.6563 +vt 0.5 0.4063 +vt 0 0.9375 +vt 0 0.7969 +vt 0.0781 0.7969 +vt 0.0781 0.9375 +vt 0 0.25 +vt 0.0781 0.25 +vt 0.0781 0.4844 +vt 0 0.4844 +vt 0 0.7656 +vt 0.0781 0.7656 +vt 0.0781 1 +vt 0 1 +vt 0.6719 0.9375 +vt 0.6719 0.7969 +vt 0.75 0.7969 +vt 0.75 0.9375 +vt 0.7344 0.5 +vt 0.6563 0.5 +vt 0.6563 0.25 +vt 0.7344 0.25 +vt 0.5 0 +vt 0.5781 0 +vt 0.5781 0.25 +vt 0.5 0.25 +vt 0.25 1 +vt 0.2344 1 +vt 0.2344 0.9375 +vt 0.25 0.9375 +vt 0.5 1 +vt 0.5 0.9375 +vt 0.75 0.9375 +vt 0.75 1 +vt 0 1 +vt 0 0.9375 +vt 0.2344 0.9375 +vt 0.2344 1 +vt 0.5156 1 +vt 0.5156 0.9375 +vt 0.75 0.9375 +vt 0.75 1 +vt 0 1 +vt 0 0.9375 +vt 0.25 0.9375 +vt 0.25 1 +vt 0.5 0.9375 +vt 0.5156 0.9375 +vt 0.5156 1 +vt 0.5 1 +vt 0.6719 1 +vt 0.6719 0.9375 +vt 0.75 0.9375 +vt 0.75 1 +vt 0 1 +vt 0 0.9375 +vt 0.0781 0.9375 +vt 0.0781 1 +vt 0.25 0.7969 +vt 0.2344 0.7969 +vt 0.2344 0.75 +vt 0.25 0.75 +vt 0.0781 0.75 +vt 0.0781 0.7969 +vt 0 0.7969 +vt 0 0.75 +vt 0 1 +vt 0 0.75 +vt 0.2344 0.75 +vt 0.2344 1 +vt 0.75 0.75 +vt 0.75 0.7969 +vt 0.6719 0.7969 +vt 0.6719 0.75 +vt 0.5 0.75 +vt 0.5156 0.75 +vt 0.5156 0.7969 +vt 0.5 0.7969 +vt 0.25 0.75 +vt 0.25 0.7969 +vt 0 0.7969 +vt 0 0.75 +vt 0.75 0.75 +vt 0.75 0.7969 +vt 0.5156 0.7969 +vt 0.5156 0.75 +vt 0.2344 0.75 +vt 0.2344 0.7969 +vt 0 0.7969 +vt 0 0.75 +vt 0.75 0.75 +vt 0.75 0.7969 +vt 0.5 0.7969 +vt 0.5 0.75 +vt 0.0781 0.9375 +vt 0.2344 0.9375 +vt 0.2344 1 +vt 0.0781 1 +vt 0.0781 0.25 +vt 0.2344 0.25 +vt 0.2344 0.4844 +vt 0.0781 0.4844 +vt 0.0781 0.7656 +vt 0.2344 0.7656 +vt 0.2344 1 +vt 0.0781 1 +vt 0.6719 1 +vt 0.5156 1 +vt 0.5156 0.9375 +vt 0.6719 0.9375 +vt 0.6719 0.9375 +vt 0.5156 0.9375 +vt 0.5156 0.7969 +vt 0.6719 0.7969 +vt 0.6719 0.7969 +vt 0.5156 0.7969 +vt 0.5156 0.75 +vt 0.6719 0.75 +vt 0.4844 0.25 +vt 0.6563 0.25 +vt 0.6563 0.5 +vt 0.4844 0.5 +vt 0.0781 0.75 +vt 0.2344 0.75 +vt 0.2344 0.7969 +vt 0.0781 0.7969 +vt 0.5781 0 +vt 0.7344 0 +vt 0.7344 0.25 +vt 0.5781 0.25 +vt 0.8438 0.8594 +vt 1 0.8594 +vt 1 0.7188 +vt 0.8438 0.7188 +vt 0 0.7656 +vt 0.25 0.7656 +vt 0.25 1 +vt 0 1 +vt 0.75 1 +vt 0.5 1 +vt 0.5 0.7656 +vt 0.75 0.7656 +vt 0.5 0.9844 +vt 0.5 1 +vt 0.0938 1 +vt 0.0938 0.9844 +vt 0.5 0.9531 +vt 0.5 1 +vt 0.0938 1 +vt 0.0938 0.9531 +vt 0.5 0.9531 +vt 0.5 1 +vt 0.0938 1 +vt 0.0938 0.9531 +vt 0.9375 0 +vt 0.0625 0 +vt 0.0625 1 +vt 0.9375 1 +vt 0.875 1 +vt 1 1 +vt 1 0 +vt 0.875 0 +vt 0.9375 0 +vt 0.0625 0 +vt 0.0625 1 +vt 0.9375 1 +vt 0.875 1 +vt 1 1 +vt 1 0 +vt 0.875 0 +vt 0.6094 0.7656 +vt 0.6094 0.8906 +vt 0.5625 0.8906 +vt 0.5625 0.7656 +vt 0.5781 1 +vt 0.5781 0.8594 +vt 0.5625 0.8594 +vt 0.5625 1 +vt 0.5625 0.7656 +vt 0.5625 0.8906 +vt 0.6094 0.8906 +vt 0.6094 0.7656 +vt 0.5781 1 +vt 0.5781 0.8594 +vt 0.5625 0.8594 +vt 0.5625 1 +vt 0.5625 0.7656 +vt 0.5625 0.8906 +vt 0.6094 0.8906 +vt 0.6094 0.7656 +vt 0.5469 0.75 +vt 0.5469 0.7656 +vt 0.5 0.7656 +vt 0.5 0.75 +vt 0.0625 0.2656 +vt 0.2031 0.2656 +vt 0.2031 0.4844 +vt 0.0625 0.4844 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.5469 0.75 +vt 0.5469 1 +vt 0.5313 1 +vt 0.5313 0.75 +vt 0.5469 0.75 +vt 0.5469 1 +vt 0.5 1 +vt 0.5 0.75 +vt 0.6094 0.75 +vt 0.6094 1 +vt 0.5625 1 +vt 0.5625 0.75 +vt 0.5 0.7656 +vt 0.5469 0.7656 +vt 0.5469 0.75 +vt 0.5 0.75 +vt 0.6094 0.7656 +vt 0.6094 0.8906 +vt 0.5625 0.8906 +vt 0.5625 0.7656 +vt 0.6094 0.7656 +vt 0.6094 0.8906 +vt 0.5625 0.8906 +vt 0.5625 0.7656 +vt 0.5781 1 +vt 0.5781 0.8594 +vt 0.5625 0.8594 +vt 0.5625 1 +vt 0.5625 0.7656 +vt 0.5625 0.8906 +vt 0.6094 0.8906 +vt 0.6094 0.7656 +vt 0.5781 1 +vt 0.5781 0.8594 +vt 0.5625 0.8594 +vt 0.5625 1 +vt 0.5625 0.7656 +vt 0.5625 0.8906 +vt 0.6094 0.8906 +vt 0.6094 0.7656 +vt 0.5469 0.75 +vt 0.5469 0.7656 +vt 0.5 0.7656 +vt 0.5 0.75 +vt 0.0625 0.2656 +vt 0.2031 0.2656 +vt 0.2031 0.4844 +vt 0.0625 0.4844 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.5469 0.75 +vt 0.5469 1 +vt 0.5313 1 +vt 0.5313 0.75 +vt 0.6094 0.75 +vt 0.6094 1 +vt 0.5938 1 +vt 0.5938 0.75 +vt 0.5469 0.75 +vt 0.5469 1 +vt 0.5 1 +vt 0.5 0.75 +vt 0.6094 0.75 +vt 0.6094 1 +vt 0.5625 1 +vt 0.5625 0.75 +vt 0.5 0.7656 +vt 0.5469 0.7656 +vt 0.5469 0.75 +vt 0.5 0.75 +vt 0.6094 0.7656 +vt 0.6094 0.8906 +vt 0.5625 0.8906 +vt 0.5625 0.7656 +vt 0.6094 0.7656 +vt 0.6094 0.8906 +vt 0.5625 0.8906 +vt 0.5625 0.7656 +vt 0.5781 1 +vt 0.5781 0.8594 +vt 0.5625 0.8594 +vt 0.5625 1 +vt 0.5625 0.7656 +vt 0.5625 0.8906 +vt 0.6094 0.8906 +vt 0.6094 0.7656 +vt 0.5781 1 +vt 0.5781 0.8594 +vt 0.5625 0.8594 +vt 0.5625 1 +vt 0.5625 0.7656 +vt 0.5625 0.8906 +vt 0.6094 0.8906 +vt 0.6094 0.7656 +vt 0.5469 0.75 +vt 0.5469 0.7656 +vt 0.5 0.7656 +vt 0.5 0.75 +vt 0.0625 0.2656 +vt 0.2031 0.2656 +vt 0.2031 0.4844 +vt 0.0625 0.4844 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.5469 0.75 +vt 0.5469 1 +vt 0.5313 1 +vt 0.5313 0.75 +vt 0.5469 0.75 +vt 0.5469 1 +vt 0.5 1 +vt 0.5 0.75 +vt 0.6094 0.75 +vt 0.6094 1 +vt 0.5625 1 +vt 0.5625 0.75 +vt 0.5 0.7656 +vt 0.5469 0.7656 +vt 0.5469 0.75 +vt 0.5 0.75 +vt 0.6094 0.7656 +vt 0.6094 0.8906 +vt 0.5625 0.8906 +vt 0.5625 0.7656 +vt 0.6094 0.7656 +vt 0.6094 0.8906 +vt 0.5625 0.8906 +vt 0.5625 0.7656 +vt 0.5781 1 +vt 0.5781 0.8594 +vt 0.5625 0.8594 +vt 0.5625 1 +vt 0.5625 0.7656 +vt 0.5625 0.8906 +vt 0.6094 0.8906 +vt 0.6094 0.7656 +vt 0.5781 1 +vt 0.5781 0.8594 +vt 0.5625 0.8594 +vt 0.5625 1 +vt 0.5625 0.7656 +vt 0.5625 0.8906 +vt 0.6094 0.8906 +vt 0.6094 0.7656 +vt 0.5469 0.75 +vt 0.5469 0.7656 +vt 0.5 0.7656 +vt 0.5 0.75 +vt 0.0625 0.2656 +vt 0.2031 0.2656 +vt 0.2031 0.4844 +vt 0.0625 0.4844 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.7656 0.875 +vt 0.7656 1 +vt 0.7344 1 +vt 0.7344 0.875 +vt 0.5469 0.75 +vt 0.5469 1 +vt 0.5313 1 +vt 0.5313 0.75 +vt 0.6094 0.75 +vt 0.6094 1 +vt 0.5938 1 +vt 0.5938 0.75 +vt 0.5469 0.75 +vt 0.5469 1 +vt 0.5 1 +vt 0.5 0.75 +vt 0.6094 0.75 +vt 0.6094 1 +vt 0.5625 1 +vt 0.5625 0.75 +vt 0.5 0.7656 +vt 0.5469 0.7656 +vt 0.5469 0.75 +vt 0.5 0.75 +vt 0.6094 0.7656 +vt 0.6094 0.8906 +vt 0.5625 0.8906 +vt 0.5625 0.7656 +vt 0.5156 0.9844 +vt 0.5156 1 +vt 0.3594 1 +vt 0.3594 0.9844 +vt 0.5156 0.9375 +vt 0.5156 1 +vt 0.3594 1 +vt 0.3594 0.9375 +vt 0.5156 0.9375 +vt 0.5156 1 +vt 0.3594 1 +vt 0.3594 0.9375 +vt 0 1 +vt 0.0313 1 +vt 0.0313 0.7656 +vt 0 0.7656 +vt 0 1 +vt 0.0313 1 +vt 0.0313 0.7656 +vt 0 0.7656 +vt 0.5625 0.9375 +vt 0.5625 0.9688 +vt 0.5469 0.9688 +vt 0.5469 0.9375 +vt 0.25 0.4219 +vt 0.4063 0.4219 +vt 0.4063 0.3125 +vt 0.25 0.3125 +vt 0.25 0.4219 +vt 0.4063 0.4219 +vt 0.4063 0.3125 +vt 0.25 0.3125 +vt 0.25 0.4219 +vt 0.4063 0.4219 +vt 0.4063 0.3125 +vt 0.25 0.3125 +vt 0.25 0.4219 +vt 0.4063 0.4219 +vt 0.4063 0.3125 +vt 0.25 0.3125 +vt 0.2656 0.3438 +vt 0.3906 0.3438 +vt 0.4063 0.3281 +vt 0.25 0.3281 +vt 0.2656 0.3438 +vt 0.3906 0.3438 +vt 0.4063 0.3281 +vt 0.25 0.3281 +vt 0 0.6094 +vt 0.125 0.6094 +vt 0.125 0.4844 +vt 0 0.4844 +vt 0.2656 0.3438 +vt 0.3906 0.3438 +vt 0.4063 0.3281 +vt 0.25 0.3281 +vt 0.2656 0.3281 +vt 0.3906 0.3281 +vt 0.4063 0.3125 +vt 0.25 0.3125 +vt 0.9375 0.8906 +vt 0.9375 1 +vt 1 1 +vt 1 0.8906 +vt 0.8125 1 +vt 0.8125 0.8906 +vt 0.75 0.8906 +vt 0.75 1 +vt 0.8594 1 +vt 0.8594 0.9375 +vt 0.75 0.9375 +vt 0.75 1 +vt 0.8594 0.3125 +vt 0.8594 0.25 +vt 0.75 0.25 +vt 0.75 0.3125 +vt 0.8594 1 +vt 0.8594 0.8906 +vt 0.75 0.8906 +vt 0.75 1 +vt 0.8125 0.3594 +vt 0.8125 0.25 +vt 0.75 0.25 +vt 0.75 0.3594 +vt 0.9375 0.25 +vt 0.9375 0.3594 +vt 1 0.3594 +vt 1 0.25 +vt 0.8594 0.3594 +vt 0.8594 0.25 +vt 0.75 0.25 +vt 0.75 0.3594 +vt 0.9375 0.25 +vt 0.9375 0.3594 +vt 1 0.3594 +vt 1 0.25 +vt 0.8594 1 +vt 0.8594 0.9375 +vt 0.75 0.9375 +vt 0.75 1 +vt 0.8125 0.3594 +vt 0.8125 0.25 +vt 0.75 0.25 +vt 0.75 0.3594 +vt 0.8125 1 +vt 0.8125 0.8906 +vt 0.75 0.8906 +vt 0.75 1 +vt 0.8594 0.3125 +vt 0.8594 0.25 +vt 0.75 0.25 +vt 0.75 0.3125 +vt 0.9375 0.8906 +vt 0.9375 1 +vt 1 1 +vt 1 0.8906 +vt 0.9063 0.25 +vt 0.9063 0.3125 +vt 1 0.3125 +vt 1 0.25 +vt 0.9063 0.9375 +vt 0.9063 1 +vt 1 1 +vt 1 0.9375 +vt 0.9063 0.25 +vt 0.9063 0.3125 +vt 1 0.3125 +vt 1 0.25 +vt 0.9063 0.8906 +vt 0.9063 1 +vt 1 1 +vt 1 0.8906 +vt 0.9063 0.25 +vt 0.9063 0.3594 +vt 1 0.3594 +vt 1 0.25 +vt 0.9063 0.9375 +vt 0.9063 1 +vt 1 1 +vt 1 0.9375 +vt 0.9992 0.3133 +vt 1 0.1258 +vt 0.8133 0.1242 +vt 0.8117 0.3117 +vt 0.9992 0.1242 +vt 0.8117 0.1258 +vt 0.8133 0.3133 +vt 1 0.3117 +vt 0.3125 0.5625 +vt 0.5 0.5625 +vt 0.5 0.375 +vt 0.3125 0.375 +vt 0.3125 0.5 +vt 0.5 0.5 +vt 0.5 0.375 +vt 0.3125 0.375 +vt 0.5 0.8125 +vt 0.5 0.625 +vt 0.3125 0.625 +vt 0.3125 0.8125 +vt 0.5 0.8125 +vt 0.5 0.625 +vt 0.3125 0.625 +vt 0.3125 0.8125 +vt 0.5 0.8125 +vt 0.5 0.625 +vt 0.3125 0.625 +vt 0.3125 0.8125 +vt 0.9992 0.3133 +vt 1 0.1258 +vt 0.8133 0.1242 +vt 0.8117 0.3117 +vt 0.9992 0.1242 +vt 0.8117 0.1258 +vt 0.8133 0.3133 +vt 1 0.3117 +vt 0.3125 0.5625 +vt 0.5 0.5625 +vt 0.5 0.375 +vt 0.3125 0.375 +vt 0.3125 0.5 +vt 0.5 0.5 +vt 0.5 0.375 +vt 0.3125 0.375 +vt 0.5 0.8125 +vt 0.5 0.625 +vt 0.3125 0.625 +vt 0.3125 0.8125 +vt 0.5 0.8125 +vt 0.5 0.625 +vt 0.3125 0.625 +vt 0.3125 0.8125 +vt 0.5 0.8125 +vt 0.5 0.625 +vt 0.3125 0.625 +vt 0.3125 0.8125 +vt 0.7656 0.8813 +vt 0.7656 0.9219 +vt 0.7344 0.9219 +vt 0.7344 0.8813 +vt 0.7656 0.8813 +vt 0.7656 0.9219 +vt 0.7344 0.9219 +vt 0.7344 0.8813 +vt 0.7656 0.8813 +vt 0.7656 0.9219 +vt 0.7344 0.9219 +vt 0.7344 0.8813 +vt 0.7656 0.8813 +vt 0.7656 0.9219 +vt 0.7344 0.9219 +vt 0.7344 0.8813 +vt 0.7656 0.8813 +vt 0.7656 0.9219 +vt 0.7344 0.9219 +vt 0.7344 0.8813 +vt 0.7656 0.8813 +vt 0.7656 0.9219 +vt 0.7344 0.9219 +vt 0.7344 0.8813 +vt 0.7656 0.8813 +vt 0.7656 0.9219 +vt 0.7344 0.9219 +vt 0.7344 0.8813 +vt 0.7656 0.8813 +vt 0.7656 0.9219 +vt 0.7344 0.9219 +vt 0.7344 0.8813 +vt 0.7656 0.8813 +vt 0.7656 0.9219 +vt 0.7344 0.9219 +vt 0.7344 0.8813 +vt 0.7656 0.8813 +vt 0.7656 0.9219 +vt 0.7344 0.9219 +vt 0.7344 0.8813 +vt 0.75 0.75 +vt 0.75 1 +vt 0.5156 1 +vt 0.5156 0.75 +vt 0.75 0.4844 +vt 0.5313 0.4844 +vt 0.5313 1 +vt 0.75 1 +vt 0 1 +vt 0.2344 1 +vt 0.2344 0.4844 +vt 0 0.4844 +vt 0.7656 0.7656 +vt 0.5313 0.7656 +vt 0.5313 1 +vt 0.7656 1 +vt 0.75 0.4844 +vt 0.5156 0.4844 +vt 0.5156 1 +vt 0.75 1 +vt 0 1 +vt 0.2344 1 +vt 0.2344 0.4844 +vt 0 0.4844 +vt 0.75 0.25 +vt 0.5156 0.25 +vt 0.5156 0.4688 +vt 0.75 0.4688 +vt 0.75 0.4844 +vt 0.5313 0.4844 +vt 0.5313 1 +vt 0.75 1 +vt 0 1 +vt 0.25 1 +vt 0.25 0.4844 +vt 0 0.4844 +vt 0 0.4688 +vt 0.25 0.4688 +vt 0.25 0.25 +vt 0 0.25 +vt 0 1 +vt 0.25 1 +vt 0.25 0.7656 +vt 0 0.7656 +vt 0.75 0.4844 +vt 0.5156 0.4844 +vt 0.5156 1 +vt 0.75 1 +vt 0.5156 0.4688 +vt 0.5156 0.25 +vt 0.75 0.25 +vt 0.75 0.4688 +vt 0.25 0.25 +vt 0.25 0.4688 +vt 0 0.4688 +vt 0 0.25 +vt 0.375 0.9531 +vt 0.375 1 +vt 0.1406 1 +vt 0.1406 0.9531 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 0 -1 +vn -1 0 0 +vn 0 1 0 +vn 0 0 -1 +vn 0 0 -1 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 -1 +vn 0 0 -1 +vn 0 1 0 +vn 0 0 -1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 1 0 0 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 0 -1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 0 -1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 1 0 0 +vn 0 0 -1 +vn -1 0 0 +vn 0 0 -1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 1 0 0 +vn 1 0 0 +vn 0 0 -1 +vn -1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 0 -1 +vn 0 0 1 +vn 0 1 0 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 0 -1 +vn 0 0 -1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 -1 0 +vn 1 0 0 +vn -1 0 0 +vn 1 0 0 +vn 0 0 -1 +vn -1 0 0 +vn 0 0 -1 +vn 0 1 0 +vn 0 -1 0 +vn 1 0 0 +vn -1 0 0 +vn 1 0 0 +vn 0 0 -1 +vn -1 0 0 +vn 0 1 0 +vn 0 0 -1 +vn 0 0 -1 +vn 1 0 0 +vn 0 1 0 +vn 1 0 0.05 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 0 -1 +vn 0 0 -1 +vn -1 0 0 +vn 0 1 0 +vn -1 0 0 +vn 0 0 1 +vn 0 0 1 +vn -1 0 0 +vn -1 0 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 1 +vn 1 0 0 +vn -1 0 0 +vn -1 0 0 +vn 1 0 0 +vn 0 -0.83 0.55 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 1 0 0 +vn -1 0 0 +vn 0 0.95 0.32 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 -1 0 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 0 1 +vn 1 0 0 +vn 0.32 0.95 0 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 -0.83 0.55 +vn 0 0 1 +vn 1 0 0 +vn 0.32 0.95 0 +vn 0 0 1 +vn -1 0 0 +vn -0.32 -0.95 0 +vn 0 0 1 +vn -1 0 0 +vn -0.32 -0.95 0 +vn 0 0 1 +vn 1 0 0 +vn -1 0 0 +vn 0 0.95 0.32 +vn 0 0 1 +vn 0 -1 0 +vn 0 1 0 +vn -1 0 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 -1 0 +vn -1 0 0 +vn 0 0 -1 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 -1 +vn 0 -1 0 +vn -1 0 0 +vn 0 0 1 +vn 0 0 1 +vn 0 -1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 1 +vn 0 -1 0 +vn 0 0 1 +vn 0 1 0.01 +vn 0 1 -0.01 +vn 0 1 0 +vn 0 1 0 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0.02 +vn 0 0 1 +vn 0 0 -1 +vn -1 0 0 +vn 1 0 0 +vn -0.01 1 -0.01 +vn 0.02 -1 -0.02 +vn 0 0 1 +vn 0 0 -1 +vn -1 0 0 +vn 1 0 0 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 +vn -1 0 0 +vn 1 0 0 +vn 0 0 -1 +vn 0.02 1 0 +vn 0 -1 0 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 -1 0 +vn 0 1 0.02 +vn -1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 -1 0 +vn 0 1 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 -1 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn -1 0 0 +vn 1 0 0 +vn 0 -0.71 -0.71 +vn -0.02 1 0 +vn 0 -1 0 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn -1 0 0 +vn 1 0 0 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 +vn 0 -1 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 -1 0 +vn 0 1 -0.02 +vn -1 0 0 vn 0 0 1 -vn 0 1 0 +vn 0 0 -1 vn 0 -1 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 0 1 +vn 0 0 1 +vn 1 0 0 +vn 0 0 1 +vn 1 0 0 +vn 0 0 1 +vn 1 0 0 +vn 0 0 -1 +vn 0 0 -1 +vn 1 0 0 vn -1 0 0 vn 0 0 -1 +vn -1 0 0 vn 0 0 -1 -vn 0 1 0 +vn -1 0 0 +vn 0 0 1 +vn 0 0 1 +vn -1 0 0 +vn -1 0 0 +vn 1 0 0 +vn 0 1 -0.01 +vn 0 -1 0 +vn 0 0 1 vn 0 0 -1 vn 1 0 0 +vn 0 -1 0 +vn 0 1 0 +vn 0 0 1 +vn -1 0 0 +vn 0 0 1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 -1 0 +vn 0 1 0 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 -1 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0.71 0.71 +vn 0 -0.73 -0.68 +vn 0 -0.71 0.71 +vn 0 0.71 -0.71 +vn 0 0.71 -0.71 +vn 0 -0.73 -0.68 +vn 0 -0.71 0.71 +vn 0 0.71 0.71 +vn 0 1 0 +vn 0 -1 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0.71 0.71 +vn 0 -0.73 -0.68 +vn 0 -0.71 0.71 +vn 0 0.71 -0.71 +vn 0 0.71 -0.71 +vn 0 -0.73 -0.68 +vn 0 -0.71 0.71 +vn 0 0.71 0.71 +vn 0 -1 0 +vn 0 1 0.02 +vn 0 0 1 +vn 0 0.01 -1 +vn 0 0.01 -1 +vn 0 -1 0 +vn 0 0 1 +vn 0 1 0.02 +vn 0 -1 0 +vn 0 1 0.02 +vn 0 0 1 +vn 0 0.01 -1 +vn 0 0.01 -1 +vn 0 -1 0 +vn 0 0 1 +vn 0 1 0.02 +vn 0 -1 0 +vn 0 1 0 +vn 0 0 -1 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 vn -1 0 0 +vn 0 0 -1 +vn 0 0 -1 +vn 0 0 1 vn 0 1 0 vn 0 -1 0 +vn 1 0 0 +vn -1 0 0 +vn 1 0 0 +vn 0 0 -1 vn 0 0 1 +vn 0 1 0 +vn 0 1 0 vn 1 0 0 vn -1 0 0 vn 0 1 0 +vn 0 0 -1 vn 0 0 1 +vn 0 1 0 +vn -1 0 0 vn 1 0 0 -vn -0.9999999999999996 3.3653587176255905e-8 0 vn 0 1 0 +vn 0 -1 0 vn 0 0 -1 +vn -1 0 0 vn 1 0 0 -vn -0.9999999999999996 3.3653587176255905e-8 -1.1229603467386552e-23 -vn 0 1 -3.2297397080004555e-16 +vn 0 1 0 +vn 0 -1 0 vn 0 0 -1 +vn -1 0 0 vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 -1 vn -1 0 0 +vn 1 0 0 +vn 0 0 -1 +vn 0 -1 0 vn 0 1 0 +vn 0 0 -1 +vn -1 0 0 vn 1 0 0 -vn -0.9999999999999996 3.3653587176255905e-8 0 vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn 0 1 0 +vn -1 0 0 vn 1 0 0 -vn -1 4.7369516105335156e-15 0 +vn 0 -1 0 vn 0 1 0 +vn 1 0 0 vn 0 0 1 vn 0 0 -1 -vn 1 0 0 -vn -0.9999999999999996 3.3653587176255905e-8 -1.1229603467386552e-23 -vn 0 1 -3.2297397080004555e-16 +vn -0.89 0 -0.45 +vn 0 1 0 +vn 0 -1 0 vn 0 0 -1 vn 1 0 0 vn -1 0 0 vn 0 1 0 vn 0 0 -1 +vn 0 0.13 0.99 +vn 0 -0.13 -0.99 +vn 0 0.99 -0.13 +vn 0 -0.99 0.13 +vn -1 0 0 +vn 0 0.71 -0.71 +vn 0 1 0 +vn -1 0 0 +vn 1 0 0 vn 0 0 -1 -vn -1 -4.0063785988003155e-9 0 -vn 1 -2.3684757858670005e-15 0 -vn -1 3.205087791847785e-10 0 -vn 0 9.61531014809225e-9 -1 -vn 0.9999999999999998 2.0192152305753548e-8 0 -vn 0 -1.0416585054236009e-7 -0.9999999999999947 -vn 0.9999999999999999 2.403828468008062e-8 0 -vn -0.9999999999999999 -2.4038270469226703e-8 0 +vn -1 0 0 +vn 1 0 0 +vn 0 0 1 +vn 0 0.71 -0.71 +vn 0 1 0 +vn -1 0 0 +vn 1 0 0 +vn 0 0 1 +vn -0.01 0 -1 +vn 0.71 -0.71 -0.04 +vn -1 0 0 +vn 1 0 0 +vn -1 0 0 +vn 1 0 0 vn 0 1 0 vn 0 -1 0 -vn 0 -1.73609759018645e-8 -0.9999999999999999 -vn -1 2.3684757858670005e-15 0 +vn 0 0 -1 vn -1 0 0 -vn 0 9.61531014809225e-9 -1 -vn 0.9999999999999998 2.0192152305753548e-8 0 -vn 1 4.0063785988003155e-9 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 -1 0 vn 0 1 0 -vn -1 -1.001598799883047e-10 4.447992196268332e-26 +vn 0 0 -1 +vn 0 0 -1 vn 0 0 1 -vn -4.807655062489375e-8 -3.0047846361004626e-9 -0.9999999999999989 -vn 1.3343924326770227e-24 -3.0047846312851245e-9 -1 -vn 2.2702817570549753e-9 0 1 vn 0 1 0 +vn 0 -1 0 vn 1 0 0 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 +vn -1 0 0 +vn 0 0 -1 +vn 0 0 -1 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 +vn -1 0 0 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 vn -1 0 0 +vn 0 0 -1 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 0 -1 +vn 0 0 1 +vn 0 1 0 +vn 0 -1 0 +vn 1 0 0 +vn 0 -1 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0.89 0 -0.45 +vn 0 0 -1 vn 0 1 0 +vn 0 -1 0 +vn 0 -1 0 +vn 0 1 0 +vn 0 0 1 vn 0 0 -1 -vn 0 -1.0416585054236009e-7 -0.9999999999999947 -vn 0.9999999999999999 2.403828468008062e-8 0 -vn -0.9999999999999999 -2.403828468008062e-8 0 +vn -0.89 0 0.45 +vn 0 0 1 vn 0 1 0 vn 0 -1 0 -vn 0 -1.73609759018645e-8 -0.9999999999999999 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 vn 0 -1 0 -vn -1 1.1842378929335002e-15 0 -vn 1 4.0063785988003155e-9 0 +vn 0 0 1 +vn 0 0 1 +vn 0 1 0 +vn -1 0 0 +vn 0 0 -1 +vn 0 0 1 +vn 0 1 0 +vn 0 0.71 -0.71 +vn 0 1 0 +vn -1 0 0 +vn 1 0 0 +vn 0 0 1 +vn 0.01 0 -1 +vn -0.01 -1 0 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn -1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 0 -1 +vn -1 0 0 +vn 0 1 0 +vn 0 0 -1 +vn -1 0 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 -1 +vn 0 0 1 +vn 1 0 0 +vn 0 0 -1 +vn 0 0 -1 +vn -1 0 0 +vn 1 0 0 +vn -1 0 0 +vn 1 0 0 +vn 0 0 -1 +vn 0 0 -1 +vn 0 1 0 +vn 1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 0 -1 vn -1 0 0 -vn 0 9.61531014809225e-9 -1 -vn 0.9999999999999998 2.0192152305753548e-8 0 vn 0 0 -1 -vn 5.608931850705546e-8 0.9999999999999986 0 -vn -5.693407069514731e-23 -1 -1.1842378739554753e-15 -vn -1 -4.006378598800318e-9 -4.4116298923752534e-24 +vn 0 1 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 1 +vn 0 0 -1 +vn 0 0 -1 +vn 0 0 -1 +vn -1 0 0 +vn -1 0 0 +vn 0 0 1 +vn 0 0 1 +vn 0 0 1 +vn 0 0 -1 +vn 0 0 -1 +vn 0 0 -1 vn 1 0 0 +vn 0 0 1 +vn 0 0 1 +vn 0 0 1 vn -1 0 0 -vn 0 9.61531014809225e-9 -1 -vn 0.9999999999999998 2.0192152305753548e-8 2.1175823681357454e-23 vn -1 0 0 -vn -1 1.7027099728352239e-9 1.816224918414553e-9 -vn 0 1 4.736951571734001e-16 -vn 1.0015943612983081e-10 0 -1 -vn 1.0015931299776508e-10 0.001562498042575235 -0.9999987792991885 -vn -1 8.881784192968415e-16 1.8162249184145528e-9 -vn 4.440892098500626e-16 1 0 -vn -0.9999999999999978 1.776356839400245e-15 6.83755558839038e-8 -vn -1 -8.881784197001252e-16 9.473903143468002e-16 -vn 0 4.440892098500626e-16 1 +vn 0 0 -1 +vn 0 0 -1 +vn 0 1 0 +vn 0 1 0 +vn 0 0 1 +vn 0 0 1 +vn 0 0 1 +vn 0 0 1 +vn 0 0 -1 +vn 0 0 -1 +vn 0 0 -1 +vn 0 1 0 +vn 0 1 0 +vn 0 1 0 vn 0 0 1 -vn 1 0 0 +vn 0 0 -1 +vn 0 1 0 +vn 0 0 -1 vn 0 1 0 vn 0 0 -1 vn 0 0 -1 vn 1 0 0 -vn -4.440892098500626e-16 1 0 -vn 1 0 0 -vn 0 4.440892098500628e-16 1 vn 0 0 1 vn 1 0 0 -vn -1 -1.1538619202968069e-8 0 -vn 1 1.1538619202968056e-8 0 -vn 0 -6.923172130817464e-9 -1 -vn 0 6.923172130817471e-9 1 vn 0 0 1 vn 0 0 -1 vn 1 0 0 +vn 1 0 0 vn -1 0 0 -vn 0 1 0 vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 vn 0 0 1 -vn 0 1 0 vn 0 0 -1 +vn 1 0 0 vn -1 0 0 vn 0 0 1 -vn 0 0 1 -vn 1 0 0 vn 0 0 -1 -vn -1 0 0 vn 1 0 0 -vn 1 0 0 -vn 0 1 0 -vn 0 1 0 -vn -1 0 0 -vn 0.7071067526299225 0.7071068097431714 0 -vn -0.7071068097431737 0.7071067526299203 0 -vn 0 1 0 -vn 0 0.7071067983205238 0.7071067640525709 -vn 0 0.7071067640525726 -0.7071067983205221 -vn 1 4.985715710123701e-9 0 vn -1 0 0 vn 0 0 1 -vn 0 0 1 -vn -1 0 0 +vn 0 0 -1 vn 1 0 0 -vn 1 -4.736951571734001e-15 0 vn -1 0 0 -vn -9.853454873813468e-16 -0.8320502943378438 0.5547001962252291 vn 0 0 1 -vn 1.4210854715202016e-15 1 0 -vn 1.887448777873958e-9 -1 -9.437250994797139e-9 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 vn 0 0 1 -vn -0.9999999999999994 -3.52996310481504e-8 0 -vn 0.9999999999999987 5.294944699989987e-8 0 -vn -4.493866839778178e-15 0.948683298050514 0.316227766016838 +vn 0 0 -1 vn 0 0 1 -vn 1 1.7649815381517003e-8 0 -vn -1 -1.0171239436388048e-8 0 -vn -1.887449457362738e-8 -1 0 -vn -2.8048387967739252e-30 1.1842379024986275e-15 1 -vn 1 8.146068602194587e-9 0 -vn -1 -5.187511860761027e-9 0 -vn -1.638164072263065e-8 -1 0 -vn -1.294540977496247e-30 5.465713372376189e-16 1 -vn 4.44089209850063e-16 1 0 -vn 1.5357781731480002e-9 -1 -8.190819291931787e-9 +vn 1 0 0 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 -1 vn 0 0 1 -vn 1 5.2447148494634394e-9 -6.410208617216948e-9 +vn 1 0 0 +vn 1 0 0 vn -1 0 0 vn 0 0 1 -vn -1 7.105427357601002e-15 0 -vn -0.3162277924703032 0.9486832892326916 0 -vn 0 0 1 vn 1 0 0 vn -1 0 0 -vn 0 -0.8320502943378434 0.5547001962252299 +vn 0 0 -1 vn 0 0 1 +vn 1 0 0 vn -1 0 0 -vn -0.31622779657515127 0.9486832878644088 0 +vn 0 0 -1 vn 0 0 1 vn 1 0 0 -vn 0.316227735458527 -0.948683308236617 0 +vn -1 0 0 +vn 0 0 -1 vn 0 0 1 vn 1 0 0 -vn 0.31622773956337297 -0.948683306868335 0 +vn -1 0 0 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 -1 0 +vn 0 1 0 +vn 0 0 -1 +vn 0 0 1 vn 0 0 1 -vn -0.9999999999999994 -3.52996310481504e-8 0 -vn 0.9999999999999987 5.294944699989987e-8 0 -vn -4.493866839778178e-15 0.948683298050514 0.316227766016838 +vn -1 0 0 +vn 0 0 -1 +vn -1 0 0 +vn 0 0 -1 vn 0 0 1 -vn -5.921189474156519e-16 -1 0 -vn -2.0477038369384242e-9 1 0 +vn -1 0 0 +vn -1 0 0 vn 1 0 0 -vn -0.9999999999999992 2.8845947139440435e-8 -2.884594764793919e-8 vn 0 0 1 -vn -2.0180282103170633e-9 0 -1 +vn -1 0 0 vn 1 0 0 vn 0 0 -1 -vn 4.440892098500626e-16 -1 1.4802973661668785e-16 -vn 1 -1.7763568394002505e-15 -5.259072701473422e-31 -vn -1.7694076463591074e-30 3.5416460519152807e-15 -1 +vn 0 0 1 vn -1 0 0 +vn 1 0 0 vn 0 0 -1 -vn -4.440892098500628e-16 -1 0 -vn -1 0 0 -vn 7.888609052210118e-31 1.7763568394002497e-15 -1 -vn 1 2.629536350736712e-31 -2.9605947323337575e-16 -vn 4.440892098500643e-16 -3.552713678800496e-15 1 -vn 4.00637023556527e-10 -1 -2.812564995835683e-15 -vn 1 -1.7708230259576096e-15 -2.9605947323338034e-16 -vn 4.440892098500708e-16 -1.665334544054469e-14 1 -vn -1 0 0 -vn -1.1657341717642864e-15 1.5321077674353097e-14 1 -vn -2.1453450970719878e-24 -1 -7.432134907503474e-10 +vn 0 0 1 vn -1 0 0 -vn 0 -9.615318288515652e-9 1 -vn 0 1.5321077674353097e-14 1 -vn 2.670916821045909e-10 -1 -7.432134907503474e-10 -vn 1.2019125579139e-9 -9.61531828851566e-9 1 -vn 0 -0.9999218840739726 -0.012499029960630773 -vn 0.0003905943894035675 -0.9999218077979403 0.012499029007165801 -vn 0 -1 0 -vn 8.54694270436724e-9 -1 1.8580302513950758e-10 -vn 1 8.840345086491864e-16 1.1050415048229825e-17 -vn -1 0 1.6025509808059724e-9 -vn -0.012498028891920402 0.9998437870725775 0.012498028891913296 -vn 0 -0.9998242651450613 0.01874670176692834 -vn -1.6075746441623402e-9 -4.018936610405879e-10 1 -vn 0 0 -1 -vn 1 1.7819253480546976e-15 -2.2274034617788337e-17 -vn -1 -4.018936610405865e-10 -1.6075746441623431e-9 -vn 0.01249802925231087 0.9998437870635676 -0.012498029252317973 -vn -0.018743408475519238 -0.9996486229057887 -0.01874340847551937 -vn 3.86764526688263e-17 -3.094120780272147e-15 1 -vn 2.7243380884556235e-8 0 -0.9999999999999997 -vn 1 0 0 -vn -1 0 0 -vn 5.315781827164857e-8 5.315781827164857e-8 0.9999999999999972 -vn 0 0.9999978298745641 -0.0020833257456959477 -vn 0 -1 0 vn 1 0 0 +vn 0 0 -1 +vn 0 0 1 vn -1 0 0 -vn 0 -3.126928855479454e-9 -1 -vn -0.02499212384224005 0.9996864277750709 0.0015620077376372486 -vn 0 -1 -4.4408920913838643e-16 vn 1 0 0 +vn 0 0 -1 vn -1 0 0 -vn 0 1 -4.4408920842671063e-16 -vn 0 -1 4.4408920842671083e-16 +vn 0 1 0 vn 0 -1 0 -vn 0 0.9996876473287262 0.024992154336042873 -vn 1 -3.126928855479454e-9 0 +vn 0 0 -1 vn 0 0 1 vn 0 0 -1 -vn -5.921189452015477e-16 -1 0 -vn 5.921189452015477e-16 1 0 vn -1 0 0 vn 0 0 1 -vn 0 0 -1 -vn 0 -1 0 -vn -4.4408920842671063e-16 1 0 +vn -1 0 0 vn 0 0 1 vn 0 0 -1 -vn 1 0 0 vn -1 0 0 -vn 0 -4.273467123692655e-9 -1 -vn 0.024992203434921926 0.9996876461012547 -3.0705975901902473e-9 -vn 0 -1 2.2204460456919321e-16 +vn -1 0 0 vn 1 0 0 +vn 0 0 -1 vn -1 0 0 -vn 0 1 -2.2204460421335531e-16 -vn 3.552713678800602e-15 -1 -2.2204460421335541e-16 vn 1 0 0 -vn -1 0 -7.300512815492057e-9 -vn -7.26490093276516e-8 0 0.9999999999999973 -vn 0 1 2.960594726007742e-16 -vn 0 -1 -2.96059473945051e-16 -vn 4.4408920842671063e-16 -1 0 -vn 0 1 0 vn 0 0 1 vn 0 0 -1 -vn 0 -1 0 -vn -0.001562007737636805 0.9996864277750711 -0.024992123842225846 -vn 1 0 0 -vn 0 0 1 -vn 0 0 -1 -vn 1.0683659681009347e-9 -1 0 -vn -2.6327633412735967e-9 1 0 -vn 0 0 1 -vn 0 0 -1 -vn 2.6645352336142453e-15 -1.4422954270794259e-8 1 -vn 2.842170918049091e-15 -9.615314735801985e-9 1 -vn -1 9.473903189014969e-15 3.7071794909222515e-15 -vn 2.6645352591003863e-15 4.736951571734001e-15 1 -vn -1 1.77635681946509e-14 3.707179490922243e-15 -vn 2.8421709430404127e-15 4.7369515717339955e-15 1 -vn -1 1.9755820930752297e-29 3.707179490922262e-15 -vn -4.12573201409091e-15 -3.552713678800501e-15 -1 -vn -4.12573201409091e-15 -3.552713678800501e-15 -1 -vn -1 1.317054728716824e-29 3.707179490922262e-15 -vn 1 -4.938955232688064e-30 -2.780384618191691e-15 -vn -2.9796953435100957e-15 -5.293002202773237e-30 -1 -vn 1 -5.329070518200756e-15 -2.7803846181916776e-15 -vn -2.9796953435100973e-15 -1.7763568394002432e-15 -1 -vn 1 -7.105427357601002e-15 -4.016111115165738e-15 -vn 4.584146682323239e-15 3.552713678800489e-15 1 -vn 4.584146660731259e-15 -5.875990572007237e-9 1 -vn 1 -1.7763568394002647e-15 -4.016111115165768e-15 -vn 0.9999999999999992 1.004734687179068e-8 -4.018939459259008e-8 -vn -1 0 0 -vn 0.012498029412498021 0.999843787059563 -0.012498029412497932 -vn 0 -1 0 -vn 1.6025509808059837e-9 -2.8467023952422887e-24 1 -vn 0 0 -1 vn -1 0 0 -vn -2.6709146005997245e-10 -1 -1.2820386530164976e-8 -vn 2.220446049250315e-16 1 0 -vn 0 0 1 vn 1 0 0 vn 0 0 1 +vn 0 0 -1 vn -1 0 0 -vn 0 0 1 vn 1 0 0 -vn 2.670916821045784e-10 -1 -8.546926721919264e-9 -vn -2.220446049250313e-16 1 -3.552713678800501e-15 -vn 3.552713678800501e-15 0 1 -vn 1 0 0 -vn -1 0 0 -vn 0 -1 0 -vn 0 0 1 -vn 1 1.4422965666875271e-8 1.0257039406627005e-22 -vn -2.303668371329431e-9 1 7.105427357601002e-15 -vn 0 -1 0 -vn 0 0 1 -vn -0.9999999999999997 0 2.884593186536221e-8 -vn 2.303668140978396e-9 1 0 -vn -8.88178419700126e-16 -1 0 vn 0 0 1 -vn 1 2.3684757858670005e-15 0 +vn 0 0 -1 vn -1 0 0 -vn 0 1 0 -vn 7.105427357601002e-15 -1 0 -vn 0 0 1 vn 1 0 0 -vn -1 -3.552713678800501e-15 0 -vn 1.7763568394002473e-15 1 0 -vn -1.554312234475222e-15 -1 0 vn 0 0 1 -vn 1 0 0 vn -1 0 0 -vn 4.440892098500626e-16 1 -3.552713678800501e-15 -vn -2.220446049250313e-16 -1 0 -vn 0 0 1 -vn 8.881784197001252e-16 1 0 +vn 1 0 0 vn 0 -1 0 vn 0 1 0 -vn 0 -1 0 -vn -0.00012786426028117118 0.7071067754062044 0.7071067754062116 -vn 0 -0.7309916426049663 -0.6823864143150078 -vn 0 -0.7071067811865486 0.7071067811865466 -vn -0.0002202369017392044 0.7074615189952053 -0.7067518310105069 -vn 0 0.7074620893281489 -0.7067512944193668 -vn 0 -0.7309916426049663 -0.6823864143150078 -vn 0 -0.7071067811865486 0.7071067811865466 -vn 0 0.707106781186544 0.7071067811865511 -vn -8.881784197001268e-16 1 -5.921189464667501e-16 -vn 0 -1 5.921189464667501e-16 -vn 0 1 -5.921189464667501e-16 -vn 0 -1 5.921189464667501e-16 -vn 0 0.707106781186544 0.7071067811865511 -vn 0 -0.7309916426049663 -0.6823864143150078 -vn 0 -0.7071067811865486 0.7071067811865466 -vn 0 0.7074620893281489 -0.7067512944193668 -vn 0.0005051596318499985 0.7074632678834316 -0.7067499341418025 -vn 0.0024505310066757716 -0.7310310797310269 -0.6823397653406068 -vn 0 -0.7071067811865486 0.7071067811865466 -vn 0 0.707106781186544 0.7071067811865511 -vn 0 -1 0 -vn 0 0.9997467809857727 0.02250275335565457 -vn 0 0 1 -vn 0 0.01330460620901702 -0.9999114898097846 -vn 0.0018972296263049266 0.013328036574076853 -0.9999093778742278 -vn 0 -1 0 -vn 0 0 1 -vn 0 0.9997467809857727 0.022502753355654565 -vn 0 -1 0 -vn 0.0014085618739093995 0.9997466026734104 0.02246656174009945 vn 0 0 1 -vn 0 0.01330460620901702 -0.9999114898097846 -vn 0 0.01330460620901702 -0.9999114898097846 -vn 0 -1 0 -vn 0 0 1 -vn 0 0.9997467809857727 0.022502753355654565 -vn 2.3684757858670006e-16 -1 -1.7763568394002505e-15 -vn 0 1 1.7763568394002505e-15 vn 0 0 -1 -vn 0 0 1 vn 0 1 0 -vn 0 -1 0 -vn 1 0 0 -vn 0 0 -1 -vn 0 0 -1 vn 0 0 1 -vn 0 1 1.1842378929335002e-15 -vn 0 -1 -1.1842378929335002e-15 -vn -1 0 0 +vn 0 0 -1 +vn 1 0 0 +vn 1 0 0 +vn 0 1 0 vn 1 0 0 vn -1 0 0 vn 0 0 -1 vn 0 0 1 -vn -8.881784197001252e-16 1 0 -vn -8.881784197001252e-16 1 -8.881784197001252e-16 +vn -0.71 0.71 0 +vn 0.71 0.71 0 +vn 0 1 0 +vn 0 0.71 0.71 +vn 0 0.71 -0.71 +vn 0 0 1 +vn 0 0 -1 vn -1 0 0 vn 1 0 0 vn 0 1 0 vn 0 0 -1 vn 0 0 1 -vn -8.881784197001252e-16 1 -8.881784197001252e-16 -vn 1 0 0 -vn -1 0 0 vn 0 1 0 -vn 0 -1 0 vn 0 0 -1 vn 1 0 0 +vn 0 0 1 +vn 0 0 1 vn -1 0 0 -vn 0 1 0 -vn 0 -1 -3.552713678800501e-15 vn 0 0 -1 vn 1 0 0 vn -1 0 0 +vn -1 0 0 +vn 0 1 0 vn 0 1 0 -vn 0 -1 0 -vn 0 0 -1 -vn 0 0 -1 vn 1 0 0 vn -1 0 0 -vn 0 0 -1 -vn 0 -1 0 -vn 1.1842378929335002e-15 1 0 -vn 0 0 -1 vn 1 0 0 -vn -1 0 -2.6175016069520992e-9 -vn 1.362169061321142e-8 1 -1.1217856909685937e-9 -vn -1.3621690631038818e-8 -1 -1.602552445935607e-9 +vn 0 0.95 -0.32 vn 0 0 -1 -vn 0 0 1 -vn 0 1 0 vn 1 0 0 -vn -1 0 0 -vn -1.5491333455961336e-8 -0.9999999999999999 -4.0063811585335595e-9 -vn 1.8162254274924626e-8 0.9999999999999999 4.0063811760113995e-9 -vn -1 0 0 -vn 8.725003094607141e-9 0 1 -vn 0 0 -1 -vn 0.8944271874881695 0 -0.44721360252345055 -vn 4.6474001584341475e-8 0.9999999999999986 -2.8845929791273536e-8 -vn -1.3621690539280162e-8 -1 1.2419773946276775e-8 vn 0 0 -1 vn -1 0 0 +vn -1 0 0 vn 1 0 0 -vn 0 1 0 +vn 0 0.95 -0.32 vn 0 0 -1 -vn 0 0.13052619222005132 0.9914448613738105 -vn 0 -0.13052619222005155 -0.9914448613738105 -vn 0 0.9914448613738105 -0.1305261922200519 -vn 0 -0.9914448613738107 0.13052619222004988 vn 1 0 0 -vn 0 0.7071067811865476 -0.7071067811865476 -vn 0 1 -5.921189464667501e-16 -vn 1 0 0 -vn -1 0 0 vn 0 0 -1 -vn 1 0 0 -vn -1 1.2918958832001822e-15 -5.399689618625107e-31 -vn -1.6025509371470781e-9 0 1 -vn 0.003535842866965644 0.7072840060056999 -0.7069206692859881 -vn -1.4210854328050388e-14 1 0 -vn 1 -5.448674755826246e-9 1.4638024692386221e-12 vn -1 0 0 -vn 0 0 1 -vn 0.013271205704748438 0.0012064732458861873 -0.9999112058185214 vn 0 -1 0 -vn 0.9999997292412979 -0.0000016687319270854808 0.0007358767195217504 -vn -1 2.5837917664003644e-15 0 +vn 0 -1 0 +vn 0 -1 0 +vn 0 -1 0 +vn 0 -1 0 +vn 0 -1 0 +vn 0 -1 0 +vn 0 -1 0 +vn 0 -1 0 +vn 0 -1 0 vn 1 0 0 vn -1 0 0 -vn 0 1 -2.3684757858670005e-15 -vn -5.921189464667501e-16 -1 -1.1842378929335002e-15 -vn 0 0 -1 vn 1 0 0 -vn -1 0 0 -vn 0 1 -2.3684757858670005e-15 -vn 0 -1 -1.1842378929335002e-15 -vn 0 0 -1 -vn 7.105427357601002e-16 -1 -1.7763568394002505e-15 -vn -9.473903143468012e-16 1 0 -vn 0 0 -1 +vn 0 -1 0 vn 0 0 -1 -vn 0 0 1 -vn 0 1 1.1842378929335002e-15 -vn 0 -1 -1.1842378929335002e-15 vn -1 0 0 -vn 0 0 1 -vn 0 1 1.1842378929335002e-15 -vn 0 -1 -3.552713678800501e-15 -vn 1 0 0 -vn 0 0 -1 -vn 0 0 -1 -vn 0 0 1 -vn 0 1 2.3684757858670005e-15 vn 0 -1 0 vn 1 0 0 -vn 0 0 1 -vn -3.552713678800501e-15 1 -1.1842378929335002e-15 -vn 3.552713678800501e-15 -1 0 -vn 1 0 0 -vn 0 0 -1 -vn 2.819614030794046e-16 1 0 -vn -2.819614030794046e-16 -1 0 -vn 0 0 1 vn 0 0 -1 -vn 0 0 -1 -vn 0 0 1 -vn 0 1 0 vn 0 -1 0 -vn -1 0 0 -vn -3.062654421685228e-8 -0.9999999999999997 1.1484953637230455e-8 -vn 2.296990835644732e-8 0.9999999999999998 -1.148495358610477e-8 -vn 0 0 1 -vn 0 0 -1 -vn -0.8944271909999161 0 -0.44721359549995804 -vn 0 0 -1 -vn 0 1 0 vn 0 -1 0 -vn 1.578983857244667e-15 -1 0 -vn -1.578983857244667e-15 1 0 vn 0 0 1 -vn 0 0 -1 -vn 0.8944271909999161 0 0.44721359549995804 -vn 0 0 1 -vn 6.890972335715116e-8 0.9999999999999976 -1.1484953892858852e-8 -vn -6.890972335715113e-8 -0.999999999999997 -3.445486167857556e-8 -vn 1 0 0 -vn -0.9999999999999998 0 2.6709187750384438e-8 vn 0 1 0 -vn -2.2969907172209193e-8 -0.9999999999999999 0 -vn 0 0 1 -vn 0.0016666642969249202 0 0.9999986111140962 -vn -0.003333314814969893 0.9999944444907405 0 -vn 1 0 0 -vn 0 0 -1 -vn -0.002108180304909002 -0.3162270457363234 0.9486811957241902 -vn 0 0.9999987831048713 0.0015600605042196845 -vn -0.003535580374697578 0.7071023616391809 -0.7071023616391809 -vn 0 0.999999963912802 -0.00026865292611645943 -vn 1 0 0 -vn -0.9999968555359872 -0.0025077714583215224 6.714495544225196e-7 -vn 0 -0.0022778982721741127 0.9999974055863655 -vn -0.01362051215381449 0 -0.9999072365218026 -vn -0.024992191840647996 -0.9996876463911116 0 -vn 1 0 0 -vn -0.9999990843815886 0.00113613293579454 -0.0007351448408082318 -vn -2.5376526277146434e-16 1 0 -vn 0 1 2.5376526277146434e-16 -vn -1 0 0 -vn 0 3.9474596431116675e-16 -1 -vn 1 0 0 -vn 0 0 1 -vn 1 -6.7307174352511845e-9 0 -vn 0 -3.205103619544995e-9 -1 -vn 1 0 0 -vn 4.736951571734001e-16 1 4.440892098500626e-16 -vn 0 0 -1 -vn 1 0 0 -vn 9.473903143468002e-16 1 0 -vn 0 0 1 -vn 0 -7.105427357601002e-15 -1 +vn 0 1 0 vn 0 0 1 -vn -1 0 0 -vn 2.5243548967073364e-29 -7.105427357601078e-15 -1 -vn 0 0 -1 -vn 1 0 0 -vn -1 0 0 -vn 1 0 0 -vn -1 0 0 +usemtl common_steel +f 3/1/1 4/2/1 6/3/1 5/4/1 +f 8/5/2 7/6/2 9/7/2 2/8/2 +f 8/9/3 4/10/3 3/11/3 7/12/3 +f 4/13/4 8/14/4 2/15/4 6/16/4 +f 10/17/5 11/18/5 1/19/5 12/20/5 +f 14/21/6 11/22/6 10/23/6 13/24/6 +f 11/25/7 14/26/7 15/27/7 1/28/7 usemtl common_thingies -f 6/1/1 4/2/1 3/3/1 5/4/1 -f 9/5/2 7/6/2 8/7/2 10/8/2 -f 3/9/3 4/10/3 8/11/3 7/12/3 -f 6/13/4 5/14/4 9/15/4 10/16/4 -f 10/17/5 8/18/5 4/19/5 6/20/5 +f 18/29/8 19/30/8 21/31/8 20/32/8 +f 23/33/9 22/34/9 24/35/9 25/36/9 +f 23/37/10 19/38/10 18/39/10 22/40/10 +f 24/41/11 20/42/11 21/43/11 25/44/11 +f 19/45/12 23/46/12 25/47/12 21/48/12 usemtl projectile_workshop -f 14/21/6 13/22/6 11/23/6 12/24/6 -f 16/25/7 15/26/7 13/27/7 14/28/7 +f 26/49/13 28/50/13 29/51/13 27/52/13 +f 28/53/14 30/54/14 31/55/14 29/56/14 usemtl conveyor -f 17/29/8 18/30/8 21/31/8 20/32/8 -f 19/33/9 17/34/9 20/35/9 22/36/9 +f 35/57/15 33/58/15 32/59/15 34/60/15 +f 34/61/16 32/62/16 1/63/16 2/64/16 usemtl common_thingies -f 26/37/10 24/38/10 23/39/10 25/40/10 -f 29/41/11 27/42/11 28/43/11 30/44/11 -f 23/45/12 24/46/12 28/47/12 27/48/12 -f 26/49/13 25/50/13 29/51/13 30/52/13 -f 25/53/14 23/54/14 27/55/14 29/56/14 -f 34/57/15 32/58/15 31/59/15 33/60/15 -f 37/61/16 35/62/16 36/63/16 38/64/16 -f 31/65/17 32/66/17 36/67/17 35/68/17 -f 33/69/18 31/70/18 35/71/18 37/72/18 +f 36/65/17 37/66/17 39/67/17 38/68/17 +f 41/69/18 40/70/18 42/71/18 43/72/18 +f 41/73/19 37/74/19 36/75/19 40/76/19 +f 42/77/20 38/78/20 39/79/20 43/80/20 +f 40/81/21 36/82/21 38/83/21 42/84/21 +f 44/85/22 45/86/22 47/87/22 46/88/22 +f 49/89/23 48/90/23 50/91/23 51/92/23 +f 49/93/24 45/94/24 44/95/24 48/96/24 +f 48/97/25 44/98/25 46/99/25 50/100/25 usemtl common_steel -f 44/73/19 42/74/19 41/75/19 43/76/19 -f 47/77/20 45/78/20 46/79/20 22/80/20 -f 41/81/21 42/82/21 46/83/21 45/84/21 -f 22/85/22 46/86/22 42/87/22 44/88/22 -f 19/89/23 49/90/23 48/91/23 50/92/23 -f 53/93/24 51/94/24 52/95/24 54/96/24 -f 48/97/25 49/98/25 52/99/25 51/100/25 -f 54/101/26 52/102/26 49/103/26 19/104/26 -f 58/105/27 56/106/27 55/107/27 57/108/27 -f 61/109/28 59/110/28 60/111/28 62/112/28 -f 55/113/29 56/114/29 60/115/29 59/116/29 -f 57/117/30 55/118/30 63/119/30 64/120/30 -f 66/121/31 65/122/31 59/123/31 61/124/31 -f 63/125/32 55/126/32 59/127/32 65/128/32 -f 68/129/33 67/130/33 56/131/33 58/132/33 -f 71/133/34 69/134/34 70/135/34 72/136/34 -f 56/137/35 67/138/35 70/139/35 69/140/35 -f 58/141/36 56/142/36 69/143/36 71/144/36 -f 72/145/37 70/146/37 67/147/37 68/148/37 -f 76/149/38 74/150/38 73/151/38 75/152/38 -f 79/153/39 77/154/39 78/155/39 80/156/39 -f 73/157/40 74/158/40 78/159/40 77/160/40 -f 80/161/41 78/162/41 74/163/41 76/164/41 +f 54/101/26 13/102/26 55/103/26 56/104/26 +f 57/105/27 1088/106/27 1091/107/27 58/108/27 +f 60/109/28 59/110/28 61/111/28 62/112/28 +f 60/113/29 1088/114/29 57/115/29 59/116/29 +f 63/117/30 57/118/30 58/119/30 64/120/30 +f 59/121/31 65/122/31 66/123/31 61/124/31 +f 59/125/32 57/126/32 63/127/32 65/128/32 +f 67/129/33 1088/130/33 1091/131/33 68/132/33 +f 69/133/34 70/134/34 72/135/34 71/136/34 +f 74/137/35 73/138/35 75/139/35 76/140/35 +f 74/141/36 70/142/36 69/143/36 73/144/36 +f 70/145/37 74/146/37 76/147/37 72/148/37 usemtl common_thingies -f 40/165/42 83/166/42 82/167/42 84/168/42 -f 87/169/43 85/170/43 86/171/43 88/172/43 -f 82/173/44 83/174/44 86/175/44 85/176/44 -f 88/177/45 86/178/45 83/179/45 40/180/45 +f 78/149/38 79/150/38 53/151/38 80/152/38 +f 82/153/39 81/154/39 83/155/39 84/156/39 +f 82/157/40 79/158/40 78/159/40 81/160/40 +f 79/161/41 82/162/41 84/163/41 53/164/41 usemtl projectile_workshop -f 94/181/46 97/182/46 96/183/46 93/184/46 -f 93/185/47 96/186/47 95/187/47 89/188/47 -f 90/189/48 98/190/48 97/191/48 94/192/48 -f 91/193/49 95/194/49 96/195/49 79/196/49 -f 79/197/50 96/198/50 97/199/50 75/200/50 -f 75/201/51 97/202/51 98/203/51 92/204/51 -f 104/205/52 102/206/52 103/207/52 93/208/52 -f 99/209/53 100/210/53 103/211/53 102/212/53 -f 89/213/54 101/214/54 104/215/54 93/216/54 -f 101/217/55 99/218/55 102/219/55 104/220/55 -f 93/221/56 103/222/56 100/223/56 89/224/56 -f 103/225/57 111/226/57 110/227/57 108/228/57 -f 108/229/58 110/230/58 109/231/58 105/232/58 -f 106/233/59 109/234/59 110/235/59 66/236/59 -f 66/237/60 110/238/60 111/239/60 64/240/60 -f 64/241/61 111/242/61 112/243/61 107/244/61 -f 100/245/62 112/246/62 111/247/62 103/248/62 +f 92/165/42 93/166/42 90/167/42 89/168/42 +f 91/169/43 92/170/43 89/171/43 85/172/43 +f 93/173/44 94/174/44 86/175/44 90/176/44 +f 92/177/45 91/178/45 87/179/45 75/180/45 +f 93/181/46 92/182/46 75/183/46 71/184/46 +f 94/185/47 93/186/47 71/187/47 88/188/47 +f 99/189/48 98/190/48 100/191/48 89/192/48 +f 99/193/49 96/194/49 95/195/49 98/196/49 +f 100/197/50 97/198/50 85/199/50 89/200/50 +f 98/201/51 95/202/51 97/203/51 100/204/51 +f 96/205/52 99/206/52 89/207/52 85/208/52 +f 106/209/53 107/210/53 99/211/53 104/212/53 +f 105/213/54 106/214/54 104/215/54 101/216/54 +f 106/217/55 105/218/55 102/219/55 66/220/55 +f 107/221/56 106/222/56 66/223/56 64/224/56 +f 108/225/57 107/226/57 64/227/57 103/228/57 +f 107/229/58 108/230/58 96/231/58 99/232/58 usemtl common_rough_steel -f 117/249/63 121/250/63 123/251/63 116/252/63 -f 114/253/64 115/254/64 91/255/64 118/256/64 -f 116/257/65 123/258/65 122/259/65 119/260/65 +f 119/233/59 117/234/59 113/235/59 112/236/59 +f 87/237/60 111/238/60 110/239/60 114/240/60 +f 118/241/61 119/242/61 112/243/61 115/244/61 usemtl projectile_workshop -f 120/261/66 107/262/66 121/263/66 117/264/66 -f 115/265/67 121/266/67 107/267/67 91/268/67 +f 117/245/62 103/246/62 116/247/62 113/248/62 +f 103/249/63 117/250/63 111/251/63 87/252/63 usemtl common_rough_steel -f 118/269/68 122/270/68 123/271/68 114/272/68 -f 114/273/69 123/274/69 121/275/69 115/276/69 +f 119/253/64 118/254/64 114/255/64 110/256/64 +f 117/257/65 119/258/65 110/259/65 111/260/65 usemtl common_thingies -f 131/277/70 129/278/70 128/279/70 130/280/70 -f 134/281/71 132/282/71 133/283/71 135/284/71 -f 128/285/72 129/286/72 133/287/72 132/288/72 -f 135/289/73 133/290/73 129/291/73 131/292/73 +f 120/261/66 121/262/66 123/263/66 122/264/66 +f 125/265/67 124/266/67 126/267/67 127/268/67 +f 125/269/68 121/270/68 120/271/68 124/272/68 +f 121/273/69 125/274/69 127/275/69 123/276/69 usemtl projectile_workshop -f 142/293/74 140/294/74 141/295/74 143/296/74 -f 136/297/75 137/298/75 141/299/75 140/300/75 -f 139/301/76 138/302/76 142/303/76 143/304/76 -f 138/305/77 136/306/77 140/307/77 142/308/77 -f 143/309/78 141/310/78 137/311/78 139/312/78 -f 141/313/79 150/314/79 149/315/79 147/316/79 -f 146/317/80 145/318/80 47/319/80 43/320/80 -f 147/321/81 149/322/81 148/323/81 144/324/81 -f 137/325/82 151/326/82 150/327/82 141/328/82 -f 145/329/83 148/330/83 149/331/83 47/332/83 -f 47/333/84 149/334/84 150/335/84 43/336/84 -f 43/337/85 150/338/85 151/339/85 146/340/85 -f 155/341/86 158/342/86 157/343/86 143/344/86 -f 139/345/87 152/346/87 155/347/87 143/348/87 -f 154/349/88 153/350/88 53/351/88 50/352/88 -f 143/353/89 157/354/89 156/355/89 139/356/89 -f 152/357/90 159/358/90 158/359/90 155/360/90 -f 153/361/91 156/362/91 157/363/91 53/364/91 -f 53/365/92 157/366/92 158/367/92 50/368/92 -f 50/369/93 158/370/93 159/371/93 154/372/93 -f 163/373/94 161/374/94 162/375/94 164/376/94 -usemtl common_steel -f 169/377/95 171/378/95 173/379/95 168/380/95 +f 133/277/70 132/278/70 134/279/70 135/280/70 +f 133/281/71 129/282/71 128/283/71 132/284/71 +f 134/285/72 130/286/72 131/287/72 135/288/72 +f 132/289/73 128/290/73 130/291/73 134/292/73 +f 129/293/74 133/294/74 135/295/74 131/296/74 +f 141/297/75 142/298/75 133/299/75 139/300/75 +f 9/301/76 137/302/76 138/303/76 5/304/76 +f 140/305/77 141/306/77 139/307/77 136/308/77 +f 142/309/78 143/310/78 129/311/78 133/312/78 +f 141/313/79 140/314/79 137/315/79 9/316/79 +f 142/317/80 141/318/80 9/319/80 5/320/80 +f 143/321/81 142/322/81 5/323/81 138/324/81 +f 149/325/82 150/326/82 147/327/82 135/328/82 +f 147/329/83 144/330/83 131/331/83 135/332/83 +f 55/333/84 145/334/84 146/335/84 12/336/84 +f 148/337/85 149/338/85 135/339/85 131/340/85 +f 150/341/86 151/342/86 144/343/86 147/344/86 +f 149/345/87 148/346/87 145/347/87 55/348/87 +f 150/349/88 149/350/88 55/351/88 12/352/88 +f 151/353/89 150/354/89 12/355/89 146/356/89 usemtl common_rough_steel -f 165/381/96 166/382/96 169/383/96 168/384/96 -f 166/385/97 172/386/97 171/387/97 169/388/97 +f 155/357/90 781/358/90 780/359/90 156/360/90 +f 761/361/91 779/362/91 778/363/91 769/364/91 usemtl common_steel -f 170/389/98 171/390/98 172/391/98 167/392/98 -f 174/393/99 173/394/99 171/395/99 170/396/99 +f 162/365/92 786/366/92 787/367/92 157/368/92 +f 161/369/93 163/370/93 164/371/93 160/372/93 usemtl common_rough_steel -f 175/397/100 165/398/100 168/399/100 176/400/100 +f 165/373/94 782/374/94 781/375/94 155/376/94 usemtl common_bottom -f 178/401/101 177/402/101 116/403/101 119/404/101 +f 112/377/95 167/378/95 168/379/95 115/380/95 usemtl common_steel -f 168/405/102 173/406/102 177/407/102 176/408/102 -f 176/409/103 177/410/103 180/411/103 175/412/103 -f 179/413/104 180/414/104 177/415/104 178/416/104 -f 181/417/105 186/418/105 185/419/105 182/420/105 +f 774/381/96 784/382/96 783/383/96 765/384/96 +f 762/385/97 777/386/97 776/387/97 763/388/97 usemtl common_rough_steel -f 181/421/106 182/422/106 166/423/106 165/424/106 +f 156/389/98 172/390/98 171/391/98 155/392/98 usemtl common_steel -f 182/425/107 185/426/107 172/427/107 166/428/107 -f 167/429/108 172/430/108 185/431/108 184/432/108 -f 184/433/109 185/434/109 186/435/109 183/436/109 +f 761/393/99 769/394/99 777/395/99 762/396/99 +f 175/397/100 162/398/100 157/399/100 174/400/100 +f 176/401/101 175/402/101 174/403/101 173/404/101 usemtl common_rough_steel -f 187/437/110 181/438/110 165/439/110 175/440/110 +f 155/405/102 171/406/102 177/407/102 165/408/102 usemtl common_steel -f 187/441/111 188/442/111 186/443/111 181/444/111 -f 175/445/112 180/446/112 188/447/112 187/448/112 -f 792/449/113 188/450/113 180/451/113 179/452/113 -f 183/453/114 186/454/114 188/455/114 792/456/114 -usemtl projectile_workshop -f 192/457/115 190/458/115 189/459/115 191/460/115 -f 195/461/116 193/462/116 194/463/116 196/464/116 -f 191/465/117 189/466/117 193/467/117 195/468/117 -f 196/469/118 194/470/118 190/471/118 192/472/118 -usemtl common_rough_steel -f 198/473/119 213/474/119 212/475/119 207/476/119 -f 206/477/120 209/478/120 214/479/120 202/480/120 -f 214/481/121 218/482/121 217/483/121 202/484/121 -f 204/485/122 216/486/122 215/487/122 210/488/122 -f 205/489/123 220/490/123 219/491/123 201/492/123 -f 204/493/124 210/494/124 209/495/124 206/496/124 -f 207/497/125 212/498/125 211/499/125 200/500/125 -f 203/501/126 221/502/126 220/503/126 205/504/126 -f 205/505/127 209/506/127 210/507/127 203/508/127 -f 210/509/128 215/510/128 221/511/128 203/512/128 -f 199/513/129 211/514/129 212/515/129 208/516/129 -f 208/517/130 212/518/130 213/519/130 197/520/130 -f 201/521/131 219/522/131 218/523/131 214/524/131 -f 201/525/132 214/526/132 209/527/132 205/528/132 -f 211/529/133 215/530/133 216/531/133 200/532/133 -f 198/533/134 217/534/134 218/535/134 213/536/134 -f 213/537/135 218/538/135 219/539/135 197/540/135 -f 197/541/136 219/542/136 220/543/136 208/544/136 -f 208/545/137 220/546/137 221/547/137 199/548/137 -f 199/549/138 221/550/138 215/551/138 211/552/138 -usemtl projectile_workshop -f 193/553/139 223/554/139 222/555/139 194/556/139 -f 190/557/140 224/558/140 225/559/140 189/560/140 -usemtl common_thingies -f 222/561/141 223/562/141 225/563/141 224/564/141 -usemtl projectile_workshop -f 194/565/142 222/566/142 224/567/142 190/568/142 -f 189/569/143 225/570/143 223/571/143 193/572/143 +f 763/409/103 776/410/103 775/411/103 764/412/103 +f 764/413/104 775/414/104 774/415/104 765/416/104 +f 170/417/105 178/418/105 726/419/105 169/420/105 +f 178/421/106 176/422/106 173/423/106 726/424/106 usemtl common_copper_cable -f 226/573/144 234/574/144 237/575/144 227/576/144 -f 231/577/145 236/578/145 235/579/145 230/580/145 -f 230/581/146 235/582/146 234/583/146 226/584/146 -f 228/585/147 234/586/147 235/587/147 232/588/147 -f 232/589/148 235/590/148 236/591/148 233/592/148 -f 229/593/149 237/594/149 234/595/149 228/596/149 -f 239/597/150 229/598/150 228/599/150 238/600/150 -f 240/601/151 232/602/151 233/603/151 241/604/151 -f 239/605/152 238/606/152 240/607/152 241/608/152 -f 238/609/153 228/610/153 232/611/153 240/612/153 -f 245/613/154 243/614/154 242/615/154 244/616/154 -f 246/617/155 226/618/155 227/619/155 247/620/155 -f 244/621/156 242/622/156 226/623/156 246/624/156 -f 251/625/157 249/626/157 248/627/157 250/628/157 -f 254/629/158 252/630/158 253/631/158 255/632/158 -f 251/633/159 250/634/159 254/635/159 255/636/159 -f 250/637/160 248/638/160 252/639/160 254/640/160 -f 257/641/161 253/642/161 252/643/161 256/644/161 -f 244/645/162 248/646/162 249/647/162 245/648/162 -f 257/649/163 256/650/163 244/651/163 245/652/163 -f 256/653/164 252/654/164 248/655/164 244/656/164 -f 261/657/165 259/658/165 258/659/165 260/660/165 -f 264/661/166 262/662/166 263/663/166 265/664/166 -f 261/665/167 260/666/167 264/667/167 265/668/167 -f 260/669/168 258/670/168 262/671/168 264/672/168 -f 265/673/169 267/674/169 266/675/169 264/676/169 -f 270/677/170 268/678/170 269/679/170 271/680/170 -f 264/681/171 266/682/171 268/683/171 270/684/171 -f 273/685/172 269/686/172 268/687/172 272/688/172 -f 276/689/173 274/690/173 275/691/173 277/692/173 -f 272/693/174 268/694/174 274/695/174 276/696/174 -f 274/697/175 278/698/175 279/699/175 275/700/175 -f 266/701/176 267/702/176 279/703/176 278/704/176 -f 268/705/177 266/706/177 278/707/177 274/708/177 -f 281/709/178 273/710/178 272/711/178 280/712/178 -f 282/713/179 276/714/179 277/715/179 283/716/179 -f 281/717/180 280/718/180 282/719/180 283/720/180 -f 280/721/181 272/722/181 276/723/181 282/724/181 -f 230/725/182 284/726/182 285/727/182 231/728/182 -f 242/729/183 243/730/183 285/731/183 284/732/183 -f 226/733/184 242/734/184 284/735/184 230/736/184 -f 256/737/185 286/738/185 287/739/185 257/740/185 -f 246/741/186 247/742/186 287/743/186 286/744/186 -f 244/745/187 246/746/187 286/747/187 256/748/187 -f 260/749/188 288/750/188 289/751/188 261/752/188 -f 270/753/189 271/754/189 289/755/189 288/756/189 -f 264/757/190 270/758/190 288/759/190 260/760/190 -f 291/761/191 263/762/191 262/763/191 290/764/191 -f 292/765/192 258/766/192 259/767/192 293/768/192 -f 291/769/193 290/770/193 292/771/193 293/772/193 -f 290/773/194 262/774/194 258/775/194 292/776/194 +f 190/425/107 187/426/107 179/427/107 180/428/107 +f 188/429/108 189/430/108 184/431/108 183/432/108 +f 187/433/109 188/434/109 183/435/109 179/436/109 +f 188/437/110 187/438/110 181/439/110 185/440/110 +f 189/441/111 188/442/111 185/443/111 186/444/111 +f 187/445/112 190/446/112 182/447/112 181/448/112 +f 181/449/113 182/450/113 192/451/113 191/452/113 +f 186/453/114 185/454/114 193/455/114 194/456/114 +f 193/457/115 191/458/115 192/459/115 194/460/115 +f 185/461/116 181/462/116 191/463/116 193/464/116 +f 195/465/117 196/466/117 198/467/117 197/468/117 +f 180/469/118 179/470/118 199/471/118 200/472/118 +f 179/473/119 195/474/119 197/475/119 199/476/119 +f 201/477/120 202/478/120 204/479/120 203/480/120 +f 206/481/121 205/482/121 207/483/121 208/484/121 +f 207/485/122 203/486/122 204/487/122 208/488/122 +f 205/489/123 201/490/123 203/491/123 207/492/123 +f 205/493/124 206/494/124 210/495/124 209/496/124 +f 202/497/125 201/498/125 197/499/125 198/500/125 +f 197/501/126 209/502/126 210/503/126 198/504/126 +f 201/505/127 205/506/127 209/507/127 197/508/127 +f 211/509/128 212/510/128 214/511/128 213/512/128 +f 216/513/129 215/514/129 217/515/129 218/516/129 +f 217/517/130 213/518/130 214/519/130 218/520/130 +f 215/521/131 211/522/131 213/523/131 217/524/131 +f 219/525/132 220/526/132 218/527/132 217/528/132 +f 222/529/133 221/530/133 223/531/133 224/532/133 +f 221/533/134 219/534/134 217/535/134 223/536/134 +f 221/537/135 222/538/135 226/539/135 225/540/135 +f 228/541/136 227/542/136 229/543/136 230/544/136 +f 227/545/137 221/546/137 225/547/137 229/548/137 +f 232/549/138 231/550/138 227/551/138 228/552/138 +f 232/553/139 220/554/139 219/555/139 231/556/139 +f 231/557/140 219/558/140 221/559/140 227/560/140 +f 225/561/141 226/562/141 234/563/141 233/564/141 +f 230/565/142 229/566/142 235/567/142 236/568/142 +f 235/569/143 233/570/143 234/571/143 236/572/143 +f 229/573/144 225/574/144 233/575/144 235/576/144 +f 238/577/145 237/578/145 183/579/145 184/580/145 +f 238/581/146 196/582/146 195/583/146 237/584/146 +f 237/585/147 195/586/147 179/587/147 183/588/147 +f 240/589/148 239/590/148 209/591/148 210/592/148 +f 240/593/149 200/594/149 199/595/149 239/596/149 +f 239/597/150 199/598/150 197/599/150 209/600/150 +f 242/601/151 241/602/151 213/603/151 214/604/151 +f 242/605/152 224/606/152 223/607/152 241/608/152 +f 241/609/153 223/610/153 217/611/153 213/612/153 +f 215/613/154 216/614/154 244/615/154 243/616/154 +f 212/617/155 211/618/155 245/619/155 246/620/155 +f 245/621/156 243/622/156 244/623/156 246/624/156 +f 211/625/157 215/626/157 243/627/157 245/628/157 usemtl common_steel -f 297/777/195 295/778/195 294/779/195 296/780/195 -f 300/781/196 298/782/196 299/783/196 118/784/196 -f 294/785/197 295/786/197 299/787/197 298/788/197 -f 297/789/198 296/790/198 300/791/198 118/792/198 -f 296/793/199 294/794/199 298/795/199 300/796/199 -f 118/797/200 299/798/200 295/799/200 297/800/200 -usemtl common_machinebase -f 302/801/201 310/802/201 309/803/201 304/804/201 -f 306/805/202 308/806/202 310/807/202 302/808/202 +f 247/629/158 248/630/158 250/631/158 249/632/158 +f 252/633/159 251/634/159 743/635/159 114/636/159 +f 252/637/160 248/638/160 247/639/160 251/640/160 +f 743/641/161 249/642/161 250/643/161 114/644/161 +f 251/645/162 247/646/162 249/647/162 743/648/162 +f 248/649/163 252/650/163 114/651/163 250/652/163 usemtl common_bottom -f 307/809/203 306/810/203 302/811/203 304/812/203 +f 254/653/164 258/654/164 259/655/164 256/656/164 usemtl common_machinebase -f 303/813/204 309/814/204 310/815/204 301/816/204 -f 301/817/205 310/818/205 308/819/205 305/820/205 -f 314/821/206 316/822/206 315/823/206 312/824/206 -f 312/825/207 315/826/207 308/827/207 306/828/207 +f 255/657/165 253/658/165 254/659/165 256/660/165 +f 253/661/166 257/662/166 258/663/166 254/664/166 usemtl common_bottom -f 314/829/208 312/830/208 306/831/208 307/832/208 +f 258/665/167 261/666/167 263/667/167 259/668/167 usemtl common_machinebase -f 311/833/209 315/834/209 316/835/209 313/836/209 -f 305/837/210 308/838/210 315/839/210 311/840/210 -f 304/841/211 309/842/211 321/843/211 320/844/211 -f 320/845/212 321/846/212 322/847/212 318/848/212 +f 260/669/168 262/670/168 263/671/168 261/672/168 +f 257/673/169 260/674/169 261/675/169 258/676/169 usemtl common_bottom -f 304/849/213 320/850/213 318/851/213 307/852/213 +f 265/677/170 267/678/170 256/679/170 259/680/170 usemtl common_machinebase -f 319/853/214 321/854/214 309/855/214 303/856/214 -f 317/857/215 322/858/215 321/859/215 319/860/215 -f 324/861/216 328/862/216 316/863/216 314/864/216 +f 266/681/171 255/682/171 256/683/171 267/684/171 +f 264/685/172 266/686/172 267/687/172 265/688/172 usemtl common_steel -f 324/865/217 330/866/217 329/867/217 328/868/217 +f 274/689/173 275/690/173 269/691/173 273/692/173 usemtl common_bottom -f 314/869/218 331/870/218 330/871/218 324/872/218 +f 275/693/174 276/694/174 263/695/174 269/696/174 usemtl common_machinebase -f 313/873/219 316/874/219 328/875/219 323/876/219 +f 262/697/175 268/698/175 269/699/175 263/700/175 usemtl common_steel -f 328/877/220 329/878/220 332/879/220 323/880/220 -f 327/881/221 329/882/221 330/883/221 326/884/221 +f 277/701/176 274/702/176 273/703/176 268/704/176 +f 275/705/177 274/706/177 272/707/177 271/708/177 usemtl common_bottom -f 326/885/222 330/886/222 331/887/222 307/888/222 +f 276/709/178 275/710/178 271/711/178 259/712/178 usemtl common_steel -f 325/889/223 332/890/223 329/891/223 327/892/223 +f 274/713/179 277/714/179 270/715/179 272/716/179 usemtl common_rough_steel -f 301/893/224 333/894/224 334/895/224 311/896/224 -f 335/897/225 319/898/225 317/899/225 325/900/225 -f 335/901/226 336/902/226 337/903/226 333/904/226 -f 338/905/227 323/906/227 334/907/227 339/908/227 -f 301/909/228 342/910/228 341/911/228 343/912/228 -f 346/913/229 344/914/229 345/915/229 347/916/229 -f 341/917/230 342/918/230 345/919/230 344/920/230 -f 301/921/231 343/922/231 346/923/231 347/924/231 -f 343/925/232 341/926/232 344/927/232 346/928/232 -f 347/929/233 345/930/233 342/931/233 301/932/233 -f 350/933/234 349/934/234 348/935/234 319/936/234 -f 353/937/235 351/938/235 352/939/235 354/940/235 -f 348/941/236 349/942/236 352/943/236 351/944/236 -f 350/945/237 319/946/237 353/947/237 354/948/237 -f 319/949/238 348/950/238 351/951/238 353/952/238 -f 354/953/239 352/954/239 349/955/239 350/956/239 +f 253/717/180 278/718/180 279/719/180 260/720/180 +f 280/721/181 266/722/181 264/723/181 270/724/181 +f 280/725/182 281/726/182 282/727/182 278/728/182 +f 283/729/183 268/730/183 279/731/183 284/732/183 +f 286/733/184 6/734/184 253/735/184 287/736/184 +f 289/737/185 288/738/185 290/739/185 291/740/185 +f 289/741/186 6/742/186 286/743/186 288/744/186 +f 290/745/187 287/746/187 253/747/187 291/748/187 +f 288/749/188 286/750/188 287/751/188 290/752/188 +f 6/753/189 289/754/189 291/755/189 253/756/189 +f 292/757/190 293/758/190 294/759/190 266/760/190 +f 296/761/191 295/762/191 297/763/191 298/764/191 +f 296/765/192 293/766/192 292/767/192 295/768/192 +f 297/769/193 266/770/193 294/771/193 298/772/193 +f 295/773/194 292/774/194 266/775/194 297/776/194 +f 293/777/195 296/778/195 298/779/195 294/780/195 usemtl common_steel -f 357/957/240 356/958/240 355/959/240 349/960/240 -f 360/961/241 358/962/241 359/963/241 361/964/241 -f 357/965/242 349/966/242 360/967/242 361/968/242 -f 349/969/243 355/970/243 358/971/243 360/972/243 -f 361/973/244 359/974/244 356/975/244 357/976/244 -f 364/977/245 362/978/245 341/979/245 363/980/245 -f 367/981/246 365/982/246 366/983/246 368/984/246 -f 341/985/247 362/986/247 366/987/247 365/988/247 -f 363/989/248 341/990/248 365/991/248 367/992/248 -f 368/993/249 366/994/249 362/995/249 364/996/249 -f 356/997/250 364/998/250 363/999/250 355/1000/250 -f 358/1001/251 367/1002/251 368/1003/251 359/1004/251 -f 355/1005/252 363/1006/252 367/1007/252 358/1008/252 -f 359/1009/253 368/1010/253 364/1011/253 356/1012/253 +f 299/781/196 300/782/196 301/783/196 293/784/196 +f 303/785/197 302/786/197 304/787/197 305/788/197 +f 304/789/198 293/790/198 301/791/198 305/792/198 +f 302/793/199 299/794/199 293/795/199 304/796/199 +f 300/797/200 303/798/200 305/799/200 301/800/200 +f 286/801/201 306/802/201 308/803/201 307/804/201 +f 310/805/202 309/806/202 311/807/202 312/808/202 +f 310/809/203 306/810/203 286/811/203 309/812/203 +f 309/813/204 286/814/204 307/815/204 311/816/204 +f 306/817/205 310/818/205 312/819/205 308/820/205 +f 307/821/206 308/822/206 300/823/206 299/824/206 +f 312/825/207 311/826/207 302/827/207 303/828/207 +f 311/829/208 307/830/208 299/831/208 302/832/208 +f 308/833/209 312/834/209 303/835/209 300/836/209 usemtl common_bottom -f 372/1013/254 370/1014/254 369/1015/254 371/1016/254 -f 374/1017/255 373/1018/255 345/1019/255 375/1020/255 -f 369/1021/256 370/1022/256 345/1023/256 373/1024/256 -f 371/1025/257 369/1026/257 373/1027/257 374/1028/257 -f 375/1029/258 345/1030/258 370/1031/258 372/1032/258 +f 313/837/210 314/838/210 316/839/210 315/840/210 +f 289/841/211 317/842/211 318/843/211 319/844/211 +f 289/845/212 314/846/212 313/847/212 317/848/212 +f 317/849/213 313/850/213 315/851/213 318/852/213 +f 314/853/214 289/854/214 319/855/214 316/856/214 usemtl common_steel -f 378/1033/259 340/1034/259 376/1035/259 377/1036/259 -f 381/1037/260 379/1038/260 380/1039/260 382/1040/260 -f 378/1041/261 377/1042/261 381/1043/261 382/1044/261 -f 377/1045/262 376/1046/262 379/1047/262 381/1048/262 -f 382/1049/263 380/1050/263 340/1051/263 378/1052/263 -f 340/1053/264 384/1054/264 383/1055/264 376/1056/264 -f 379/1057/265 385/1058/265 386/1059/265 380/1060/265 -f 376/1061/266 383/1062/266 385/1063/266 379/1064/266 -f 380/1065/267 386/1066/267 384/1067/267 340/1068/267 -f 389/1069/268 387/1070/268 71/1071/268 388/1072/268 -f 392/1073/269 390/1074/269 391/1075/269 393/1076/269 -f 71/1077/270 387/1078/270 391/1079/270 390/1080/270 -f 388/1081/271 71/1082/271 390/1083/271 392/1084/271 -f 393/1085/272 391/1086/272 387/1087/272 389/1088/272 -f 395/1089/273 389/1090/273 388/1091/273 394/1092/273 -f 396/1093/274 392/1094/274 393/1095/274 397/1096/274 -f 394/1097/275 388/1098/275 392/1099/275 396/1100/275 -f 397/1101/276 393/1102/276 389/1103/276 395/1104/276 -f 399/1105/277 395/1106/277 394/1107/277 398/1108/277 -f 118/1109/278 396/1110/278 397/1111/278 297/1112/278 -f 399/1113/279 398/1114/279 118/1115/279 297/1116/279 -f 398/1117/280 394/1118/280 396/1119/280 118/1120/280 -f 297/1121/281 397/1122/281 395/1123/281 399/1124/281 -f 384/1125/282 372/1126/282 371/1127/282 383/1128/282 -f 385/1129/283 374/1130/283 375/1131/283 386/1132/283 -f 383/1133/284 371/1134/284 374/1135/284 385/1136/284 -f 386/1137/285 375/1138/285 372/1139/285 384/1140/285 -f 403/1141/286 401/1142/286 400/1143/286 402/1144/286 -f 405/1145/287 351/1146/287 404/1147/287 406/1148/287 -f 400/1149/288 401/1150/288 404/1151/288 351/1152/288 -f 402/1153/289 400/1154/289 351/1155/289 405/1156/289 -f 406/1157/290 404/1158/290 401/1159/290 403/1160/290 -f 408/1161/291 403/1162/291 402/1163/291 407/1164/291 -f 409/1165/292 405/1166/292 406/1167/292 410/1168/292 -f 407/1169/293 402/1170/293 405/1171/293 409/1172/293 -f 410/1173/294 406/1174/294 403/1175/294 408/1176/294 -f 325/1177/295 418/1178/295 417/1179/295 332/1180/295 -f 332/1181/296 417/1182/296 416/1183/296 338/1184/296 -f 412/1185/297 415/1186/297 416/1187/297 413/1188/297 -f 414/1189/298 417/1190/298 418/1191/298 408/1192/298 -f 338/1193/299 416/1194/299 415/1195/299 411/1196/299 -f 413/1197/300 416/1198/300 417/1199/300 414/1200/300 -f 420/1201/301 424/1202/301 426/1203/301 412/1204/301 -f 423/1205/302 425/1206/302 424/1207/302 420/1208/302 -f 419/1209/303 424/1210/303 425/1211/303 422/1212/303 -f 421/1213/304 426/1214/304 424/1215/304 419/1216/304 -f 160/1217/305 431/1218/305 430/1219/305 428/1220/305 -f 428/1221/306 430/1222/306 425/1223/306 423/1224/306 -f 427/1225/307 430/1226/307 431/1227/307 429/1228/307 -f 422/1229/308 425/1230/308 430/1231/308 427/1232/308 -f 429/1233/309 431/1234/309 436/1235/309 433/1236/309 -f 433/1237/310 436/1238/310 435/1239/310 432/1240/310 -f 408/1241/311 435/1242/311 436/1243/311 434/1244/311 -f 434/1245/312 436/1246/312 431/1247/312 160/1248/312 +f 320/857/215 285/858/215 322/859/215 321/860/215 +f 324/861/216 323/862/216 325/863/216 326/864/216 +f 325/865/217 321/866/217 322/867/217 326/868/217 +f 323/869/218 320/870/218 321/871/218 325/872/218 +f 285/873/219 324/874/219 326/875/219 322/876/219 +f 327/877/220 328/878/220 285/879/220 320/880/220 +f 330/881/221 329/882/221 323/883/221 324/884/221 +f 329/885/222 327/886/222 320/887/222 323/888/222 +f 328/889/223 330/890/223 324/891/223 285/892/223 +f 68/893/224 331/894/224 333/895/224 332/896/224 +f 335/897/225 334/898/225 336/899/225 337/900/225 +f 335/901/226 331/902/226 68/903/226 334/904/226 +f 334/905/227 68/906/227 332/907/227 336/908/227 +f 331/909/228 335/910/228 337/911/228 333/912/228 +f 332/913/229 333/914/229 339/915/229 338/916/229 +f 337/917/230 336/918/230 340/919/230 341/920/230 +f 336/921/231 332/922/231 338/923/231 340/924/231 +f 333/925/232 337/926/232 341/927/232 339/928/232 +f 338/929/233 339/930/233 343/931/233 342/932/233 +f 341/933/234 340/934/234 114/935/234 250/936/234 +f 114/937/235 342/938/235 343/939/235 250/940/235 +f 340/941/236 338/942/236 342/943/236 114/944/236 +f 339/945/237 341/946/237 250/947/237 343/948/237 +f 315/949/238 316/950/238 328/951/238 327/952/238 +f 319/953/239 318/954/239 329/955/239 330/956/239 +f 318/957/240 315/958/240 327/959/240 329/960/240 +f 316/961/241 319/962/241 330/963/241 328/964/241 +f 344/965/242 345/966/242 347/967/242 346/968/242 +f 348/969/243 295/970/243 349/971/243 350/972/243 +f 348/973/244 345/974/244 344/975/244 295/976/244 +f 295/977/245 344/978/245 346/979/245 349/980/245 +f 345/981/246 348/982/246 350/983/246 347/984/246 +f 346/985/247 347/986/247 352/987/247 351/988/247 +f 350/989/248 349/990/248 353/991/248 354/992/248 +f 349/993/249 346/994/249 351/995/249 353/996/249 +f 347/997/250 350/998/250 354/999/250 352/1000/250 +f 361/1001/251 362/1002/251 270/1003/251 277/1004/251 +f 360/1005/252 361/1006/252 277/1007/252 283/1008/252 +f 360/1009/253 359/1010/253 356/1011/253 357/1012/253 +f 362/1013/254 361/1014/254 358/1015/254 352/1016/254 +f 359/1017/255 360/1018/255 283/1019/255 355/1020/255 +f 361/1021/256 360/1022/256 357/1023/256 358/1024/256 +f 370/1025/257 368/1026/257 364/1027/257 356/1028/257 +f 368/1029/258 369/1030/258 367/1031/258 364/1032/258 +f 369/1033/259 368/1034/259 363/1035/259 366/1036/259 +f 368/1037/260 370/1038/260 365/1039/260 363/1040/260 +f 374/1041/261 375/1042/261 152/1043/261 372/1044/261 +f 369/1045/262 374/1046/262 372/1047/262 367/1048/262 +f 375/1049/263 374/1050/263 371/1051/263 373/1052/263 +f 374/1053/264 369/1054/264 366/1055/264 371/1056/264 +f 380/1057/265 375/1058/265 373/1059/265 377/1060/265 +f 379/1061/266 380/1062/266 377/1063/266 376/1064/266 +f 380/1065/267 379/1066/267 352/1067/267 378/1068/267 +f 375/1069/268 380/1070/268 378/1071/268 152/1072/268 usemtl common_rough_steel -f 439/1249/313 382/1250/313 437/1251/313 438/1252/313 -f 441/1253/314 390/1254/314 440/1255/314 311/1256/314 -f 437/1257/315 382/1258/315 440/1259/315 390/1260/315 -f 439/1261/316 438/1262/316 441/1263/316 311/1264/316 -f 438/1265/317 437/1266/317 390/1267/317 441/1268/317 -f 311/1269/318 440/1270/318 382/1271/318 439/1272/318 +f 381/1073/269 326/1074/269 383/1075/269 382/1076/269 +f 384/1077/270 334/1078/270 385/1079/270 260/1080/270 +f 384/1081/271 326/1082/271 381/1083/271 334/1084/271 +f 385/1085/272 382/1086/272 383/1087/272 260/1088/272 +f 334/1089/273 381/1090/273 382/1091/273 385/1092/273 +f 326/1093/274 384/1094/274 260/1095/274 383/1096/274 usemtl common_steel -f 444/1273/319 324/1274/319 442/1275/319 443/1276/319 -f 442/1277/320 324/1278/320 330/1279/320 445/1280/320 -f 444/1281/321 443/1282/321 446/1283/321 447/1284/321 -f 443/1285/322 442/1286/322 445/1287/322 446/1288/322 -f 451/1289/323 449/1290/323 448/1291/323 450/1292/323 -f 450/1293/324 448/1294/324 452/1295/324 446/1296/324 -f 455/1297/325 453/1298/325 454/1299/325 456/1300/325 -f 446/1301/326 452/1302/326 453/1303/326 455/1304/326 -f 457/1305/327 318/1306/327 326/1307/327 458/1308/327 -f 445/1309/328 330/1310/328 326/1311/328 318/1312/328 -f 447/1313/329 446/1314/329 457/1315/329 458/1316/329 -f 446/1317/330 445/1318/330 318/1319/330 457/1320/330 -f 458/1321/331 460/1322/331 459/1323/331 457/1324/331 -f 463/1325/332 461/1326/332 462/1327/332 464/1328/332 -f 458/1329/333 457/1330/333 463/1331/333 464/1332/333 -f 457/1333/334 459/1334/334 461/1335/334 463/1336/334 -f 460/1337/335 410/1338/335 409/1339/335 459/1340/335 -f 409/1341/336 410/1342/336 466/1343/336 465/1344/336 -f 460/1345/337 459/1346/337 452/1347/337 467/1348/337 -f 459/1349/338 409/1350/338 465/1351/338 452/1352/338 -f 469/1353/339 468/1354/339 300/1355/339 470/1356/339 -f 465/1357/340 466/1358/340 300/1359/340 468/1360/340 -f 467/1361/341 452/1362/341 469/1363/341 470/1364/341 -f 452/1365/342 465/1366/342 468/1367/342 469/1368/342 -f 474/1369/343 472/1370/343 471/1371/343 473/1372/343 -f 443/1373/344 469/1374/344 470/1375/344 444/1376/344 -f 471/1377/345 472/1378/345 470/1379/345 469/1380/345 -f 474/1381/346 473/1382/346 443/1383/346 444/1384/346 -f 473/1385/347 471/1386/347 469/1387/347 443/1388/347 +f 386/1097/275 269/1098/275 741/1099/275 387/1100/275 +f 275/1101/276 269/1102/276 386/1103/276 388/1104/276 +f 389/1105/277 387/1106/277 741/1107/277 390/1108/277 +f 388/1109/278 386/1110/278 387/1111/278 389/1112/278 +f 391/1113/279 392/1114/279 394/1115/279 393/1116/279 +f 395/1117/280 391/1118/280 393/1119/280 389/1120/280 +f 397/1121/281 396/1122/281 398/1123/281 399/1124/281 +f 396/1125/282 395/1126/282 389/1127/282 398/1128/282 +f 271/1129/283 265/1130/283 400/1131/283 401/1132/283 +f 271/1133/284 275/1134/284 388/1135/284 265/1136/284 +f 400/1137/285 389/1138/285 390/1139/285 401/1140/285 +f 265/1141/286 388/1142/286 389/1143/286 400/1144/286 +f 402/1145/287 403/1146/287 401/1147/287 400/1148/287 +f 405/1149/288 404/1150/288 406/1151/288 407/1152/288 +f 406/1153/289 400/1154/289 401/1155/289 407/1156/289 +f 404/1157/290 402/1158/290 400/1159/290 406/1160/290 +f 353/1161/291 354/1162/291 403/1163/291 402/1164/291 +f 742/1165/292 354/1166/292 353/1167/292 408/1168/292 +f 395/1169/293 402/1170/293 403/1171/293 744/1172/293 +f 408/1173/294 353/1174/294 402/1175/294 395/1176/294 +f 743/1177/295 409/1178/295 410/1179/295 739/1180/295 +f 743/1181/296 742/1182/296 408/1183/296 409/1184/296 +f 410/1185/297 395/1186/297 744/1187/297 739/1188/297 +f 409/1189/298 408/1190/298 395/1191/298 410/1192/298 +f 411/1193/299 738/1194/299 740/1195/299 412/1196/299 +f 739/1197/300 410/1198/300 387/1199/300 741/1200/300 +f 739/1201/301 738/1202/301 411/1203/301 410/1204/301 +f 387/1205/302 412/1206/302 740/1207/302 741/1208/302 +f 410/1209/303 411/1210/303 412/1211/303 387/1212/303 usemtl common_thingies -f 478/1389/348 476/1390/348 475/1391/348 477/1392/348 -f 481/1393/349 479/1394/349 480/1395/349 482/1396/349 -f 475/1397/350 476/1398/350 480/1399/350 479/1400/350 -f 478/1401/351 477/1402/351 481/1403/351 482/1404/351 -f 477/1405/352 475/1406/352 479/1407/352 481/1408/352 -f 486/1409/353 484/1410/353 483/1411/353 485/1412/353 -f 489/1413/354 487/1414/354 488/1415/354 490/1416/354 -f 483/1417/355 484/1418/355 488/1419/355 487/1420/355 -f 486/1421/356 485/1422/356 489/1423/356 490/1424/356 -f 485/1425/357 483/1426/357 487/1427/357 489/1428/357 +f 413/1213/304 414/1214/304 416/1215/304 415/1216/304 +f 418/1217/305 417/1218/305 419/1219/305 420/1220/305 +f 418/1221/306 414/1222/306 413/1223/306 417/1224/306 +f 419/1225/307 415/1226/307 416/1227/307 420/1228/307 +f 417/1229/308 413/1230/308 415/1231/308 419/1232/308 +f 421/1233/309 422/1234/309 424/1235/309 423/1236/309 +f 426/1237/310 425/1238/310 427/1239/310 428/1240/310 +f 426/1241/311 422/1242/311 421/1243/311 425/1244/311 +f 427/1245/312 423/1246/312 424/1247/312 428/1248/312 +f 425/1249/313 421/1250/313 423/1251/313 427/1252/313 usemtl common_steel -f 497/1429/358 499/1430/358 498/1431/358 495/1432/358 -f 496/1433/359 501/1434/359 500/1435/359 81/1436/359 -f 491/1437/360 498/1438/360 499/1439/360 493/1440/360 -f 494/1441/361 500/1442/361 501/1443/361 492/1444/361 -f 503/1445/362 509/1446/362 512/1447/362 502/1448/362 -f 504/1449/363 511/1450/363 510/1451/363 505/1452/363 -f 502/1453/364 512/1454/364 511/1455/364 504/1456/364 -f 505/1457/365 510/1458/365 509/1459/365 503/1460/365 -f 507/1461/366 509/1462/366 510/1463/366 39/1464/366 -f 39/1465/367 510/1466/367 511/1467/367 508/1468/367 -f 508/1469/368 511/1470/368 512/1471/368 506/1472/368 -f 506/1473/369 512/1474/369 509/1475/369 507/1476/369 -f 515/1477/370 518/1478/370 517/1479/370 513/1480/370 -f 514/1481/371 520/1482/371 519/1483/371 516/1484/371 -f 495/1485/372 517/1486/372 518/1487/372 497/1488/372 -f 81/1489/373 519/1490/373 520/1491/373 496/1492/373 -f 507/1493/374 525/1494/374 528/1495/374 506/1496/374 -f 508/1497/375 527/1498/375 526/1499/375 39/1500/375 -f 506/1501/376 528/1502/376 527/1503/376 508/1504/376 -f 39/1505/377 526/1506/377 525/1507/377 507/1508/377 -f 522/1509/378 525/1510/378 526/1511/378 524/1512/378 -f 524/1513/379 526/1514/379 527/1515/379 523/1516/379 -f 523/1517/380 527/1518/380 528/1519/380 521/1520/380 -f 521/1521/381 528/1522/381 525/1523/381 522/1524/381 -f 530/1525/382 537/1526/382 536/1527/382 531/1528/382 -f 39/1529/383 526/1530/383 538/1531/383 534/1532/383 -f 534/1533/384 538/1534/384 537/1535/384 530/1536/384 -f 531/1537/385 536/1538/385 526/1539/385 39/1540/385 -f 524/1541/386 526/1542/386 536/1543/386 533/1544/386 -f 533/1545/387 536/1546/387 537/1547/387 532/1548/387 -f 532/1549/388 537/1550/388 538/1551/388 535/1552/388 -f 535/1553/389 538/1554/389 526/1555/389 524/1556/389 -f 539/1557/390 542/1558/390 113/1559/390 540/1560/390 -f 505/1561/391 510/1562/391 543/1563/391 541/1564/391 -f 541/1565/392 543/1566/392 542/1567/392 539/1568/392 -f 540/1569/393 113/1570/393 510/1571/393 505/1572/393 -f 39/1573/394 510/1574/394 113/1575/394 531/1576/394 -f 531/1577/395 113/1578/395 542/1579/395 530/1580/395 -f 530/1581/396 542/1582/396 543/1583/396 534/1584/396 -f 534/1585/397 543/1586/397 510/1587/397 39/1588/397 +f 436/1253/314 437/1254/314 435/1255/314 433/1256/314 +f 438/1257/315 439/1258/315 434/1259/315 77/1260/315 +f 437/1261/316 436/1262/316 429/1263/316 431/1264/316 +f 439/1265/317 438/1266/317 432/1267/317 430/1268/317 +f 450/1269/318 447/1270/318 441/1271/318 440/1272/318 +f 448/1273/319 449/1274/319 442/1275/319 443/1276/319 +f 449/1277/320 450/1278/320 440/1279/320 442/1280/320 +f 447/1281/321 448/1282/321 443/1283/321 441/1284/321 +f 448/1285/322 447/1286/322 445/1287/322 52/1288/322 +f 449/1289/323 448/1290/323 52/1291/323 446/1292/323 +f 450/1293/324 449/1294/324 446/1295/324 444/1296/324 +f 447/1297/325 450/1298/325 444/1299/325 445/1300/325 +f 455/1301/326 456/1302/326 453/1303/326 451/1304/326 +f 457/1305/327 458/1306/327 452/1307/327 454/1308/327 +f 456/1309/328 455/1310/328 433/1311/328 435/1312/328 +f 458/1313/329 457/1314/329 77/1315/329 434/1316/329 +f 466/1317/330 463/1318/330 445/1319/330 444/1320/330 +f 464/1321/331 465/1322/331 446/1323/331 52/1324/331 +f 465/1325/332 466/1326/332 444/1327/332 446/1328/332 +f 463/1329/333 464/1330/333 52/1331/333 445/1332/333 +f 464/1333/334 463/1334/334 460/1335/334 462/1336/334 +f 465/1337/335 464/1338/335 462/1339/335 461/1340/335 +f 466/1341/336 465/1342/336 461/1343/336 459/1344/336 +f 463/1345/337 466/1346/337 459/1347/337 460/1348/337 +f 474/1349/338 475/1350/338 468/1351/338 469/1352/338 +f 476/1353/339 464/1354/339 52/1355/339 472/1356/339 +f 475/1357/340 476/1358/340 472/1359/340 468/1360/340 +f 464/1361/341 474/1362/341 469/1363/341 52/1364/341 +f 474/1365/342 464/1366/342 462/1367/342 471/1368/342 +f 475/1369/343 474/1370/343 471/1371/343 470/1372/343 +f 476/1373/344 475/1374/344 470/1375/344 473/1376/344 +f 464/1377/345 476/1378/345 473/1379/345 462/1380/345 +f 109/1381/346 480/1382/346 477/1383/346 478/1384/346 +f 481/1385/347 448/1386/347 443/1387/347 479/1388/347 +f 480/1389/348 481/1390/348 479/1391/348 477/1392/348 +f 448/1393/349 109/1394/349 478/1395/349 443/1396/349 +f 109/1397/350 448/1398/350 52/1399/350 469/1400/350 +f 480/1401/351 109/1402/351 469/1403/351 468/1404/351 +f 481/1405/352 480/1406/352 468/1407/352 472/1408/352 +f 448/1409/353 481/1410/353 472/1411/353 52/1412/353 usemtl common_copper_cable -f 547/1589/398 545/1590/398 544/1591/398 546/1592/398 -f 550/1593/399 548/1594/399 549/1595/399 551/1596/399 -f 551/1597/400 549/1598/400 545/1599/400 547/1600/400 +f 482/1413/354 483/1414/354 485/1415/354 484/1416/354 +f 487/1417/355 486/1418/355 488/1419/355 489/1420/355 +f 483/1421/356 487/1422/356 489/1423/356 485/1424/356 usemtl common_thingies -f 558/1601/401 556/1602/401 557/1603/401 559/1604/401 -f 552/1605/402 553/1606/402 557/1607/402 556/1608/402 -f 555/1609/403 554/1610/403 558/1611/403 559/1612/403 -f 554/1613/404 552/1614/404 556/1615/404 558/1616/404 -f 555/1617/405 553/1618/405 552/1619/405 554/1620/405 -f 563/1621/406 561/1622/406 560/1623/406 562/1624/406 -f 566/1625/407 564/1626/407 565/1627/407 567/1628/407 -f 560/1629/408 561/1630/408 565/1631/408 564/1632/408 -f 563/1633/409 562/1634/409 566/1635/409 567/1636/409 -f 567/1637/410 565/1638/410 561/1639/410 563/1640/410 +f 495/1425/357 494/1426/357 496/1427/357 497/1428/357 +f 495/1429/358 491/1430/358 490/1431/358 494/1432/358 +f 496/1433/359 492/1434/359 493/1435/359 497/1436/359 +f 494/1437/360 490/1438/360 492/1439/360 496/1440/360 +f 490/1441/361 491/1442/361 493/1443/361 492/1444/361 +f 498/1445/362 499/1446/362 501/1447/362 500/1448/362 +f 503/1449/363 502/1450/363 504/1451/363 505/1452/363 +f 503/1453/364 499/1454/364 498/1455/364 502/1456/364 +f 504/1457/365 500/1458/365 501/1459/365 505/1460/365 +f 499/1461/366 503/1462/366 505/1463/366 501/1464/366 usemtl projectile_workshop -f 568/1641/411 576/1642/411 579/1643/411 569/1644/411 -f 573/1645/412 578/1646/412 577/1647/412 572/1648/412 -f 569/1649/413 581/1650/413 2/1651/413 568/1652/413 -f 570/1653/414 583/1654/414 582/1655/414 571/1656/414 -f 568/1657/415 2/1658/415 580/1659/415 576/1660/415 -f 576/1661/416 580/1662/416 583/1663/416 570/1664/416 -f 574/1665/417 577/1666/417 578/1667/417 575/1668/417 -f 571/1669/418 579/1670/418 576/1671/418 570/1672/418 -f 577/1673/419 580/1674/419 2/1675/419 572/1676/419 -f 572/1677/420 2/1678/420 581/1679/420 573/1680/420 -f 575/1681/421 582/1682/421 583/1683/421 574/1684/421 -f 574/1685/422 583/1686/422 580/1687/422 577/1688/422 +f 517/1465/367 514/1466/367 506/1467/367 507/1468/367 +f 515/1469/368 516/1470/368 511/1471/368 510/1472/368 +f 17/1473/369 519/1474/369 507/1475/369 506/1476/369 +f 520/1477/370 521/1478/370 508/1479/370 509/1480/370 +f 518/1481/371 17/1482/371 506/1483/371 514/1484/371 +f 521/1485/372 518/1486/372 514/1487/372 508/1488/372 +f 516/1489/373 515/1490/373 512/1491/373 513/1492/373 +f 514/1493/374 517/1494/374 509/1495/374 508/1496/374 +f 17/1497/375 518/1498/375 515/1499/375 510/1500/375 +f 519/1501/376 17/1502/376 510/1503/376 511/1504/376 +f 521/1505/377 520/1506/377 513/1507/377 512/1508/377 +f 518/1509/378 521/1510/378 512/1511/378 515/1512/378 usemtl common_thingies -f 587/1689/423 585/1690/423 584/1691/423 586/1692/423 -f 590/1693/424 588/1694/424 589/1695/424 591/1696/424 -f 584/1697/425 585/1698/425 589/1699/425 588/1700/425 -f 587/1701/426 586/1702/426 590/1703/426 591/1704/426 -f 591/1705/427 589/1706/427 585/1707/427 587/1708/427 -f 595/1709/428 593/1710/428 592/1711/428 594/1712/428 -f 598/1713/429 596/1714/429 597/1715/429 599/1716/429 -f 592/1717/430 593/1718/430 597/1719/430 596/1720/430 -f 595/1721/431 594/1722/431 598/1723/431 599/1724/431 -f 599/1725/432 597/1726/432 593/1727/432 595/1728/432 +f 522/1513/379 523/1514/379 525/1515/379 524/1516/379 +f 527/1517/380 526/1518/380 528/1519/380 529/1520/380 +f 527/1521/381 523/1522/381 522/1523/381 526/1524/381 +f 528/1525/382 524/1526/382 525/1527/382 529/1528/382 +f 523/1529/383 527/1530/383 529/1531/383 525/1532/383 +f 530/1533/384 531/1534/384 533/1535/384 532/1536/384 +f 535/1537/385 534/1538/385 536/1539/385 537/1540/385 +f 535/1541/386 531/1542/386 530/1543/386 534/1544/386 +f 536/1545/387 532/1546/387 533/1547/387 537/1548/387 +f 531/1549/388 535/1550/388 537/1551/388 533/1552/388 usemtl common_rough_steel -f 600/1729/433 610/1730/433 609/1731/433 601/1732/433 -f 605/1733/434 608/1734/434 611/1735/434 604/1736/434 -f 601/1737/435 616/1738/435 615/1739/435 600/1740/435 -f 602/1741/436 614/1742/436 613/1743/436 603/1744/436 -f 609/1745/437 612/1746/437 616/1747/437 601/1748/437 -f 603/1749/438 613/1750/438 612/1751/438 609/1752/438 -f 603/1753/439 609/1754/439 610/1755/439 602/1756/439 -f 606/1757/440 611/1758/440 608/1759/440 607/1760/440 -f 608/1761/441 612/1762/441 613/1763/441 607/1764/441 -f 607/1765/442 613/1766/442 614/1767/442 606/1768/442 -f 604/1769/443 615/1770/443 616/1771/443 605/1772/443 -f 605/1773/444 616/1774/444 612/1775/444 608/1776/444 +f 547/1553/389 548/1554/389 538/1555/389 539/1556/389 +f 549/1557/390 546/1558/390 543/1559/390 542/1560/390 +f 553/1561/391 554/1562/391 539/1563/391 538/1564/391 +f 551/1565/392 552/1566/392 540/1567/392 541/1568/392 +f 554/1569/393 550/1570/393 547/1571/393 539/1572/393 +f 550/1573/394 551/1574/394 541/1575/394 547/1576/394 +f 548/1577/395 547/1578/395 541/1579/395 540/1580/395 +f 546/1581/396 549/1582/396 544/1583/396 545/1584/396 +f 551/1585/397 550/1586/397 546/1587/397 545/1588/397 +f 552/1589/398 551/1590/398 545/1591/398 544/1592/398 +f 554/1593/399 553/1594/399 542/1595/399 543/1596/399 +f 550/1597/400 554/1598/400 543/1599/400 546/1600/400 usemtl common_copper_cable -f 620/1777/445 618/1778/445 617/1779/445 619/1780/445 -f 623/1781/446 621/1782/446 622/1783/446 624/1784/446 -f 619/1785/447 617/1786/447 621/1787/447 623/1788/447 -f 624/1789/448 622/1790/448 618/1791/448 620/1792/448 +f 555/1601/401 556/1602/401 558/1603/401 557/1604/401 +f 560/1605/402 559/1606/402 561/1607/402 562/1608/402 +f 559/1609/403 555/1610/403 557/1611/403 561/1612/403 +f 556/1613/404 560/1614/404 562/1615/404 558/1616/404 usemtl common_thingies -f 628/1793/449 626/1794/449 625/1795/449 627/1796/449 -f 631/1797/450 629/1798/450 630/1799/450 632/1800/450 -f 625/1801/451 626/1802/451 630/1803/451 629/1804/451 -f 627/1805/452 625/1806/452 629/1807/452 631/1808/452 -f 632/1809/453 630/1810/453 626/1811/453 628/1812/453 +f 563/1617/405 564/1618/405 566/1619/405 565/1620/405 +f 568/1621/406 567/1622/406 569/1623/406 570/1624/406 +f 568/1625/407 564/1626/407 563/1627/407 567/1628/407 +f 567/1629/408 563/1630/408 565/1631/408 569/1632/408 +f 564/1633/409 568/1634/409 570/1635/409 566/1636/409 usemtl common_copper_cable -f 635/1813/454 633/1814/454 622/1815/454 634/1816/454 -f 637/1817/455 621/1818/455 636/1819/455 638/1820/455 -f 635/1821/456 634/1822/456 637/1823/456 638/1824/456 -f 634/1825/457 622/1826/457 621/1827/457 637/1828/457 -f 638/1829/458 636/1830/458 633/1831/458 635/1832/458 -f 640/1833/459 639/1834/459 617/1835/459 618/1836/459 -f 617/1837/460 639/1838/460 636/1839/460 621/1840/460 -f 640/1841/461 618/1842/461 622/1843/461 633/1844/461 -f 633/1845/462 636/1846/462 639/1847/462 640/1848/462 +f 560/1637/410 571/1638/410 573/1639/410 572/1640/410 +f 574/1641/411 559/1642/411 575/1643/411 576/1644/411 +f 575/1645/412 572/1646/412 573/1647/412 576/1648/412 +f 559/1649/413 560/1650/413 572/1651/413 575/1652/413 +f 571/1653/414 574/1654/414 576/1655/414 573/1656/414 +f 555/1657/415 577/1658/415 578/1659/415 556/1660/415 +f 574/1661/416 577/1662/416 555/1663/416 559/1664/416 +f 560/1665/417 556/1666/417 578/1667/417 571/1668/417 +f 577/1669/418 574/1670/418 571/1671/418 578/1672/418 usemtl common_thingies -f 644/1849/463 642/1850/463 641/1851/463 643/1852/463 -f 647/1853/464 645/1854/464 646/1855/464 648/1856/464 -f 641/1857/465 642/1858/465 646/1859/465 645/1860/465 -f 643/1861/466 641/1862/466 645/1863/466 647/1864/466 +f 579/1673/419 580/1674/419 582/1675/419 581/1676/419 +f 584/1677/420 583/1678/420 585/1679/420 586/1680/420 +f 584/1681/421 580/1682/421 579/1683/421 583/1684/421 +f 583/1685/422 579/1686/422 581/1687/422 585/1688/422 usemtl projectile_workshop -f 652/1865/467 650/1866/467 649/1867/467 651/1868/467 -f 655/1869/468 653/1870/468 654/1871/468 656/1872/468 -f 649/1873/469 650/1874/469 654/1875/469 653/1876/469 -f 652/1877/470 651/1878/470 655/1879/470 656/1880/470 -f 656/1881/471 654/1882/471 650/1883/471 652/1884/471 -f 662/1885/472 661/1886/472 663/1887/472 664/1888/472 -f 662/1889/473 658/1890/473 657/1891/473 661/1892/473 -f 661/1893/474 657/1894/474 659/1895/474 663/1896/474 -f 658/1897/475 662/1898/475 664/1899/475 660/1900/475 -f 664/1901/476 663/1902/476 667/1903/476 668/1904/476 -f 663/1905/477 659/1906/477 665/1907/477 667/1908/477 -f 660/1909/478 664/1910/478 668/1911/478 666/1912/478 -f 171/1913/479 669/1914/479 671/1915/479 670/1916/479 -f 672/1917/480 522/1918/480 524/1919/480 673/1920/480 -f 672/1921/481 669/1922/481 171/1923/481 522/1924/481 -f 522/1925/482 171/1926/482 670/1927/482 524/1928/482 -f 669/1929/483 672/1930/483 673/1931/483 671/1932/483 -f 670/1933/484 671/1934/484 674/1935/484 170/1936/484 -f 673/1937/485 524/1938/485 675/1939/485 676/1940/485 -f 675/1941/486 170/1942/486 674/1943/486 676/1944/486 -f 524/1945/487 670/1946/487 170/1947/487 675/1948/487 -f 671/1949/488 673/1950/488 676/1951/488 674/1952/488 -f 680/1953/489 678/1954/489 677/1955/489 679/1956/489 -f 683/1957/490 681/1958/490 682/1959/490 684/1960/490 -f 677/1961/491 678/1962/491 682/1963/491 681/1964/491 -f 680/1965/492 679/1966/492 683/1967/492 684/1968/492 -f 684/1969/493 682/1970/493 678/1971/493 680/1972/493 -f 687/1973/494 685/1974/494 529/1975/494 686/1976/494 -f 690/1977/495 688/1978/495 689/1979/495 691/1980/495 -f 529/1981/496 685/1982/496 689/1983/496 688/1984/496 -f 687/1985/497 686/1986/497 690/1987/497 691/1988/497 -f 691/1989/498 689/1990/498 685/1991/498 687/1992/498 +f 587/1689/423 588/1690/423 590/1691/423 589/1692/423 +f 592/1693/424 591/1694/424 593/1695/424 594/1696/424 +f 592/1697/425 588/1698/425 587/1699/425 591/1700/425 +f 593/1701/426 589/1702/426 590/1703/426 594/1704/426 +f 588/1705/427 592/1706/427 594/1707/427 590/1708/427 +f 601/1709/428 599/1710/428 600/1711/428 602/1712/428 +f 595/1713/429 596/1714/429 600/1715/429 599/1716/429 +f 597/1717/430 595/1718/430 599/1719/430 601/1720/430 +f 602/1721/431 600/1722/431 596/1723/431 598/1724/431 +f 605/1725/432 601/1726/432 602/1727/432 606/1728/432 +f 603/1729/433 597/1730/433 601/1731/433 605/1732/433 +f 606/1733/434 602/1734/434 598/1735/434 604/1736/434 +f 609/1737/435 607/1738/435 161/1739/435 608/1740/435 +f 462/1741/436 460/1742/436 610/1743/436 611/1744/436 +f 161/1745/437 607/1746/437 610/1747/437 460/1748/437 +f 608/1749/438 161/1750/438 460/1751/438 462/1752/438 +f 611/1753/439 610/1754/439 607/1755/439 609/1756/439 +f 612/1757/440 609/1758/440 608/1759/440 160/1760/440 +f 613/1761/441 462/1762/441 611/1763/441 614/1764/441 +f 612/1765/442 160/1766/442 613/1767/442 614/1768/442 +f 160/1769/443 608/1770/443 462/1771/443 613/1772/443 +f 614/1773/444 611/1774/444 609/1775/444 612/1776/444 +f 615/1777/445 616/1778/445 618/1779/445 617/1780/445 +f 620/1781/446 619/1782/446 621/1783/446 622/1784/446 +f 620/1785/447 616/1786/447 615/1787/447 619/1788/447 +f 621/1789/448 617/1790/448 618/1791/448 622/1792/448 +f 616/1793/449 620/1794/449 622/1795/449 618/1796/449 +f 467/1797/450 623/1798/450 625/1799/450 624/1800/450 +f 627/1801/451 626/1802/451 628/1803/451 629/1804/451 +f 627/1805/452 623/1806/452 467/1807/452 626/1808/452 +f 628/1809/453 624/1810/453 625/1811/453 629/1812/453 +f 623/1813/454 627/1814/454 629/1815/454 625/1816/454 usemtl common_copper_cable -f 695/1993/499 693/1994/499 692/1995/499 694/1996/499 -f 683/1997/500 696/1998/500 697/1999/500 698/2000/500 -f 698/2001/501 697/2002/501 693/2003/501 695/2004/501 +f 630/1817/455 631/1818/455 633/1819/455 632/1820/455 +f 635/1821/456 634/1822/456 621/1823/456 636/1824/456 +f 631/1825/457 635/1826/457 636/1827/457 633/1828/457 usemtl common_thingies -f 702/2005/502 700/2006/502 699/2007/502 701/2008/502 -f 705/2009/503 703/2010/503 704/2011/503 706/2012/503 -f 699/2013/504 700/2014/504 704/2015/504 703/2016/504 -f 702/2017/505 701/2018/505 705/2019/505 706/2020/505 -f 706/2021/506 704/2022/506 700/2023/506 702/2024/506 -f 713/2025/507 711/2026/507 712/2027/507 714/2028/507 -f 707/2029/508 708/2030/508 712/2031/508 711/2032/508 -f 710/2033/509 709/2034/509 713/2035/509 714/2036/509 -f 709/2037/510 707/2038/510 711/2039/510 713/2040/510 -f 710/2041/511 708/2042/511 707/2043/511 709/2044/511 -f 718/2045/512 716/2046/512 715/2047/512 717/2048/512 -f 719/2049/513 709/2050/513 710/2051/513 720/2052/513 -f 715/2053/514 716/2054/514 710/2055/514 709/2056/514 -f 718/2057/515 717/2058/515 719/2059/515 720/2060/515 -f 717/2061/516 715/2062/516 709/2063/516 719/2064/516 -f 727/2065/517 725/2066/517 726/2067/517 728/2068/517 -f 721/2069/518 722/2070/518 726/2071/518 725/2072/518 -f 724/2073/519 723/2074/519 727/2075/519 728/2076/519 -f 723/2077/520 721/2078/520 725/2079/520 727/2080/520 -f 724/2081/521 722/2082/521 721/2083/521 723/2084/521 +f 637/1829/458 638/1830/458 640/1831/458 639/1832/458 +f 642/1833/459 641/1834/459 643/1835/459 644/1836/459 +f 642/1837/460 638/1838/460 637/1839/460 641/1840/460 +f 643/1841/461 639/1842/461 640/1843/461 644/1844/461 +f 638/1845/462 642/1846/462 644/1847/462 640/1848/462 +f 650/1849/463 649/1850/463 651/1851/463 652/1852/463 +f 650/1853/464 646/1854/464 645/1855/464 649/1856/464 +f 651/1857/465 647/1858/465 648/1859/465 652/1860/465 +f 649/1861/466 645/1862/466 647/1863/466 651/1864/466 +f 645/1865/467 646/1866/467 648/1867/467 647/1868/467 +f 653/1869/468 654/1870/468 656/1871/468 655/1872/468 +f 648/1873/469 647/1874/469 657/1875/469 658/1876/469 +f 648/1877/470 654/1878/470 653/1879/470 647/1880/470 +f 657/1881/471 655/1882/471 656/1883/471 658/1884/471 +f 647/1885/472 653/1886/472 655/1887/472 657/1888/472 +f 664/1889/473 663/1890/473 665/1891/473 666/1892/473 +f 664/1893/474 660/1894/474 659/1895/474 663/1896/474 +f 665/1897/475 661/1898/475 662/1899/475 666/1900/475 +f 663/1901/476 659/1902/476 661/1903/476 665/1904/476 +f 659/1905/477 660/1906/477 662/1907/477 661/1908/477 usemtl common_copper_cable -f 732/2085/522 730/2086/522 729/2087/522 731/2088/522 -f 735/2089/523 733/2090/523 734/2091/523 736/2092/523 -f 731/2093/524 729/2094/524 733/2095/524 735/2096/524 -f 736/2097/525 734/2098/525 730/2099/525 732/2100/525 +f 667/1909/478 668/1910/478 670/1911/478 669/1912/478 +f 672/1913/479 671/1914/479 673/1915/479 674/1916/479 +f 671/1917/480 667/1918/480 669/1919/480 673/1920/480 +f 668/1921/481 672/1922/481 674/1923/481 670/1924/481 usemtl common_thingies -f 740/2101/526 738/2102/526 737/2103/526 739/2104/526 -f 743/2105/527 741/2106/527 742/2107/527 744/2108/527 -f 737/2109/528 738/2110/528 742/2111/528 741/2112/528 -f 740/2113/529 739/2114/529 743/2115/529 744/2116/529 -f 744/2117/530 742/2118/530 738/2119/530 740/2120/530 +f 675/1925/482 676/1926/482 678/1927/482 677/1928/482 +f 680/1929/483 679/1930/483 681/1931/483 682/1932/483 +f 680/1933/484 676/1934/484 675/1935/484 679/1936/484 +f 681/1937/485 677/1938/485 678/1939/485 682/1940/485 +f 676/1941/486 680/1942/486 682/1943/486 678/1944/486 usemtl common_copper_cable -f 748/2121/531 746/2122/531 745/2123/531 747/2124/531 -f 751/2125/532 749/2126/532 750/2127/532 752/2128/532 -f 747/2129/533 745/2130/533 749/2131/533 751/2132/533 -f 752/2133/534 750/2134/534 746/2135/534 748/2136/534 -f 759/2137/535 757/2138/535 758/2139/535 760/2140/535 -f 753/2141/536 754/2142/536 758/2143/536 757/2144/536 -f 755/2145/537 753/2146/537 757/2147/537 759/2148/537 -f 760/2149/538 758/2150/538 754/2151/538 756/2152/538 -f 754/2153/539 762/2154/539 761/2155/539 756/2156/539 -f 755/2157/540 763/2158/540 764/2159/540 753/2160/540 -f 756/2161/541 761/2162/541 763/2163/541 755/2164/541 -f 753/2165/542 764/2166/542 762/2167/542 754/2168/542 -f 767/2169/543 765/2170/543 766/2171/543 768/2172/543 -f 749/2173/544 745/2174/544 766/2175/544 765/2176/544 -f 750/2177/545 749/2178/545 765/2179/545 767/2180/545 -f 768/2181/546 766/2182/546 745/2183/546 746/2184/546 -f 756/2185/547 755/2186/547 767/2187/547 768/2188/547 -f 746/2189/548 750/2190/548 759/2191/548 760/2192/548 -f 767/2193/549 755/2194/549 759/2195/549 750/2196/549 -f 756/2197/550 768/2198/550 746/2199/550 760/2200/550 +f 683/1945/487 684/1946/487 686/1947/487 685/1948/487 +f 688/1949/488 687/1950/488 689/1951/488 690/1952/488 +f 687/1953/489 683/1954/489 685/1955/489 689/1956/489 +f 684/1957/490 688/1958/490 690/1959/490 686/1960/490 +f 696/1961/491 695/1962/491 697/1963/491 698/1964/491 +f 696/1965/492 692/1966/492 691/1967/492 695/1968/492 +f 695/1969/493 691/1970/493 693/1971/493 697/1972/493 +f 692/1973/494 696/1974/494 698/1975/494 694/1976/494 +f 699/1977/495 700/1978/495 692/1979/495 694/1980/495 +f 702/1981/496 701/1982/496 693/1983/496 691/1984/496 +f 701/1985/497 699/1986/497 694/1987/497 693/1988/497 +f 700/1989/498 702/1990/498 691/1991/498 692/1992/498 +f 704/1993/499 703/1994/499 705/1995/499 706/1996/499 +f 704/1997/500 683/1998/500 687/1999/500 703/2000/500 +f 703/2001/501 687/2002/501 688/2003/501 705/2004/501 +f 683/2005/502 704/2006/502 706/2007/502 684/2008/502 +f 705/2009/503 693/2010/503 694/2011/503 706/2012/503 +f 697/2013/504 688/2014/504 684/2015/504 698/2016/504 +f 697/2017/505 693/2018/505 705/2019/505 688/2020/505 +f 684/2021/506 706/2022/506 694/2023/506 698/2024/506 +usemtl projectile_workshop +f 707/2024/507 708/2025/507 711/2026/507 707/2027/507 +f 160/2027/508 709/2028/508 710/2029/508 160/2030/508 +f 711/2031/509 707/2032/509 709/2033/509 160/2034/509 +f 712/2034/510 713/2035/510 714/2036/510 712/2037/510 +f 708/2038/511 713/2039/511 712/2040/511 707/2041/511 +f 709/2041/512 714/2042/512 710/2043/512 709/2044/512 +f 707/2045/513 712/2046/513 714/2047/513 709/2048/513 +f 720/2049/514 719/2050/514 441/2051/514 443/2052/514 +f 715/2053/515 716/2054/515 441/2055/515 719/2056/515 +f 717/2057/516 715/2058/516 719/2059/516 720/2060/516 +f 443/2061/517 441/2062/517 716/2063/517 718/2064/517 +f 714/2065/518 718/2066/518 717/2067/518 16/2068/518 +f 15/2069/519 720/2070/519 443/2071/519 721/2072/519 +f 714/2073/520 16/2074/520 15/2075/520 721/2076/520 +f 16/2077/521 717/2078/521 720/2079/521 15/2080/521 +f 721/2081/522 443/2082/522 718/2083/522 714/2084/522 +usemtl conveyor +f 725/2085/523 723/2086/523 722/2087/523 724/2088/523 +usemtl projectile_workshop +f 729/2089/524 730/2090/524 727/2091/524 728/2092/524 +f 731/2093/525 729/2094/525 728/2095/525 726/2096/525 +f 730/2097/526 732/2098/526 138/2099/526 727/2100/526 +f 732/2101/527 154/2102/527 146/2103/527 138/2104/527 +f 733/2105/528 734/2106/528 732/2107/528 730/2108/528 +f 153/2109/529 734/2110/529 733/2111/529 735/2112/529 +f 734/2113/530 153/2114/530 154/2115/530 732/2116/530 +f 736/2117/531 733/2118/531 730/2119/531 729/2120/531 +f 735/2121/532 733/2122/532 736/2123/532 737/2124/532 +f 737/2125/533 736/2126/533 729/2127/533 731/2128/533 +usemtl common_steel +f 312/2129/534 308/2130/534 307/2131/534 311/2132/534 +f 302/2133/535 299/2134/535 300/2135/535 303/2136/535 +f 323/2137/536 320/2138/536 285/2139/536 324/2140/536 +f 337/2141/537 333/2142/537 332/2143/537 336/2144/537 +f 341/2145/538 339/2146/538 338/2147/538 340/2148/538 +f 319/2149/539 316/2150/539 315/2151/539 318/2152/539 +f 329/2153/540 327/2154/540 328/2155/540 330/2156/540 +f 350/2157/541 347/2158/541 346/2159/541 349/2160/541 +usemtl projectile_workshop +f 708/2161/542 707/2162/542 709/2163/542 710/2164/542 +usemtl common_steel +f 744/2165/543 742/2166/543 743/2167/543 739/2168/543 +f 740/2169/544 738/2170/544 739/2171/544 741/2172/544 +usemtl conveyor +f 746/2173/545 748/2174/545 747/2175/545 723/2176/545 +f 748/2177/546 746/2178/546 76/2179/546 745/2180/546 +usemtl common_steel +f 750/2181/547 1089/2182/547 745/2183/547 384/2184/547 +f 750/2185/548 749/2186/548 1088/2187/548 1089/2188/548 +f 749/2189/549 750/2190/549 384/2191/549 614/2192/549 +usemtl common_rough_steel +f 751/2193/550 112/2194/550 113/2195/550 752/2196/550 +f 768/2197/551 771/2198/551 770/2199/551 760/2200/551 +f 159/2201/552 754/2202/552 755/2203/552 158/2204/552 +f 158/2205/553 755/2206/553 756/2207/553 166/2208/553 +usemtl common_steel +f 766/2209/554 773/2210/554 772/2211/554 767/2212/554 +f 167/2213/555 757/2214/555 758/2215/555 168/2216/555 +f 160/2217/556 759/2218/556 753/2219/556 161/2220/556 +usemtl common_rough_steel +f 156/2221/557 780/2222/557 779/2223/557 761/2224/557 +usemtl common_steel +f 156/2225/558 761/2226/558 762/2227/558 172/2228/558 +f 172/2229/559 762/2230/559 763/2231/559 171/2232/559 +f 171/2233/560 763/2234/560 764/2235/560 177/2236/560 +f 177/2237/561 764/2238/561 765/2239/561 165/2240/561 +f 765/2241/562 783/2242/562 782/2243/562 165/2244/562 +f 756/2245/563 766/2246/563 767/2247/563 166/2248/563 +usemtl common_rough_steel +f 159/2249/564 768/2250/564 760/2251/564 754/2252/564 +f 769/2253/565 778/2254/565 786/2255/565 162/2256/565 +f 753/2257/566 770/2258/566 771/2259/566 161/2260/566 +usemtl common_steel +f 166/2261/567 167/2262/567 163/2263/567 158/2264/567 +f 167/2265/568 772/2266/568 773/2267/568 757/2268/568 +f 170/2269/569 785/2270/569 784/2271/569 774/2272/569 +f 170/2273/570 774/2274/570 775/2275/570 178/2276/570 +f 178/2277/571 775/2278/571 776/2279/571 176/2280/571 +f 176/2281/572 776/2282/572 777/2283/572 175/2284/572 +f 175/2285/573 777/2286/573 769/2287/573 162/2288/573 +usemtl common_rough_steel +f 760/2289/574 779/2290/574 780/2291/574 754/2292/574 +f 754/2293/575 780/2294/575 781/2295/575 755/2296/575 +f 755/2297/576 781/2298/576 782/2299/576 756/2300/576 +usemtl common_steel +f 756/2301/577 782/2302/577 783/2303/577 766/2304/577 +f 766/2305/578 783/2306/578 784/2307/578 773/2308/578 +f 773/2309/579 784/2310/579 785/2311/579 757/2312/579 +f 169/2313/580 758/2314/580 757/2315/580 170/2316/580 +usemtl common_rough_steel +f 753/2317/581 786/2318/581 778/2319/581 770/2320/581 +usemtl common_steel +f 759/2321/582 787/2322/582 786/2323/582 753/2324/582 usemtl projectile_workshop -f 770/2201/551 769/2202/551 773/2203/551 -f 771/2204/552 170/2205/552 772/2206/552 -f 771/2207/553 769/2208/553 773/2209/553 170/2210/553 -f 777/2211/554 775/2212/554 774/2213/554 776/2214/554 -f 774/2215/555 775/2216/555 770/2217/555 769/2218/555 -f 777/2219/556 776/2220/556 771/2221/556 772/2222/556 -f 776/2223/557 774/2224/557 769/2225/557 771/2226/557 -f 503/2227/558 782/2228/558 783/2229/558 505/2230/558 -f 503/2231/559 779/2232/559 778/2233/559 782/2234/559 -f 782/2235/560 778/2236/560 780/2237/560 783/2238/560 -f 779/2239/561 503/2240/561 505/2241/561 781/2242/561 -f 780/2243/562 781/2244/562 776/2245/562 1/2246/562 -f 505/2247/563 783/2248/563 784/2249/563 785/2250/563 -f 784/2251/564 1/2252/564 776/2253/564 785/2254/564 -f 783/2255/565 780/2256/565 1/2257/565 784/2258/565 -f 781/2259/566 505/2260/566 785/2261/566 776/2262/566 +f 779/2325/583 760/2326/583 770/2327/583 778/2328/583 +usemtl common_rough_steel +f 791/2329/584 792/2330/584 793/2331/584 789/2332/584 +f 788/2333/585 793/2334/585 792/2335/585 790/2336/585 +usemtl common_steel +f 794/2337/586 795/2338/586 799/2339/586 798/2340/586 +f 796/2341/587 794/2342/587 798/2343/587 800/2344/587 +f 801/2345/588 799/2346/588 795/2347/588 797/2348/588 usemtl conveyor -f 786/2263/567 787/2264/567 789/2265/567 788/2266/567 -f 790/2267/568 791/2268/568 789/2269/568 787/2270/568 -f 76/2271/569 789/2272/569 791/2273/569 71/2274/569 +f 802/2349/589 803/2350/589 806/2351/589 805/2352/589 +f 807/2353/590 806/2354/590 803/2355/590 804/2356/590 +f 808/2357/591 116/2358/591 803/2359/591 802/2360/591 +f 804/2361/592 803/2362/592 116/2363/592 809/2364/592 +usemtl projectile_workshop +f 813/2365/593 812/2366/593 810/2367/593 811/2368/593 +f 811/2369/594 810/2370/594 814/2371/594 815/2372/594 +f 815/2373/595 814/2374/595 816/2375/595 817/2376/595 +f 821/2377/596 819/2378/596 818/2379/596 820/2380/596 +f 820/2381/597 818/2382/597 822/2383/597 823/2384/597 +f 824/2385/598 819/2386/598 826/2387/598 825/2388/598 +f 823/2389/599 822/2390/599 812/2391/599 813/2392/599 +f 830/2393/600 828/2394/600 827/2395/600 829/2396/600 +f 833/2397/601 831/2398/601 832/2399/601 834/2400/601 +f 834/2401/602 832/2402/602 828/2403/602 830/2404/602 +f 838/2405/603 836/2406/603 835/2407/603 837/2408/603 +f 841/2409/604 839/2410/604 840/2411/604 842/2412/604 +f 837/2413/605 835/2414/605 839/2415/605 841/2416/605 +f 842/2417/606 840/2418/606 836/2419/606 838/2420/606 +f 846/2421/607 844/2422/607 843/2423/607 845/2424/607 +f 849/2425/608 847/2426/608 848/2427/608 850/2428/608 +f 845/2429/609 843/2430/609 847/2431/609 849/2432/609 +f 850/2433/610 848/2434/610 844/2435/610 846/2436/610 +f 854/2437/611 852/2438/611 851/2439/611 853/2440/611 +f 857/2441/612 855/2442/612 856/2443/612 858/2444/612 +f 853/2445/613 851/2446/613 855/2447/613 857/2448/613 +f 858/2449/614 856/2450/614 852/2451/614 854/2452/614 +f 862/2453/615 860/2454/615 859/2455/615 861/2456/615 +f 865/2457/616 863/2458/616 864/2459/616 866/2460/616 +f 861/2461/617 859/2462/617 863/2463/617 865/2464/617 +f 814/2465/618 819/2466/618 824/2467/618 867/2468/618 +f 867/2469/619 824/2470/619 825/2471/619 868/2472/619 +f 816/2473/620 826/2474/620 819/2475/620 814/2476/620 +f 816/2477/621 814/2478/621 867/2479/621 868/2480/621 +f 869/2481/622 826/2482/622 819/2483/622 821/2484/622 +f 823/2485/623 871/2486/623 870/2487/623 820/2488/623 +f 820/2489/624 870/2490/624 872/2491/624 821/2492/624 +f 821/2493/625 872/2494/625 873/2495/625 869/2496/625 +f 815/2497/626 875/2498/626 874/2499/626 811/2500/626 +f 811/2501/627 874/2502/627 876/2503/627 813/2504/627 +f 877/2505/628 875/2506/628 879/2507/628 878/2508/628 +f 813/2509/629 876/2510/629 871/2511/629 823/2512/629 +f 861/2513/630 881/2514/630 880/2515/630 862/2516/630 +f 866/2517/631 882/2518/631 883/2519/631 865/2520/631 +f 865/2521/632 883/2522/632 881/2523/632 861/2524/632 +f 853/2525/633 885/2526/633 884/2527/633 854/2528/633 +f 858/2529/634 886/2530/634 887/2531/634 857/2532/634 +f 854/2533/635 884/2534/635 886/2535/635 858/2536/635 +f 857/2537/636 887/2538/636 885/2539/636 853/2540/636 +f 845/2541/637 889/2542/637 888/2543/637 846/2544/637 +f 850/2545/638 890/2546/638 891/2547/638 849/2548/638 +f 846/2549/639 888/2550/639 890/2551/639 850/2552/639 +f 849/2553/640 891/2554/640 889/2555/640 845/2556/640 +f 837/2557/641 893/2558/641 892/2559/641 838/2560/641 +f 842/2561/642 894/2562/642 895/2563/642 841/2564/642 +f 838/2565/643 892/2566/643 894/2567/643 842/2568/643 +f 841/2569/644 895/2570/644 893/2571/644 837/2572/644 +f 829/2573/645 897/2574/645 896/2575/645 830/2576/645 +f 834/2577/646 898/2578/646 899/2579/646 833/2580/646 +f 830/2581/647 896/2582/647 898/2583/647 834/2584/647 +f 872/2585/648 875/2586/648 877/2587/648 801/2588/648 +f 900/2589/649 878/2590/649 879/2591/649 873/2592/649 +f 801/2593/650 877/2594/650 878/2595/650 900/2596/650 +f 873/2597/651 879/2598/651 875/2599/651 872/2600/651 +f 873/2601/652 872/2602/652 801/2603/652 900/2604/652 +f 817/2605/653 879/2606/653 875/2607/653 815/2608/653 +f 904/2609/654 903/2610/654 901/2611/654 902/2612/654 +f 902/2613/655 901/2614/655 905/2615/655 906/2616/655 +f 906/2617/656 905/2618/656 907/2619/656 908/2620/656 +f 912/2621/657 910/2622/657 909/2623/657 911/2624/657 +f 911/2625/658 909/2626/658 913/2627/658 914/2628/658 +f 915/2629/659 910/2630/659 917/2631/659 916/2632/659 +f 914/2633/660 913/2634/660 903/2635/660 904/2636/660 +f 921/2637/661 919/2638/661 918/2639/661 920/2640/661 +f 924/2641/662 922/2642/662 923/2643/662 925/2644/662 +f 925/2645/663 923/2646/663 919/2647/663 921/2648/663 +f 929/2649/664 927/2650/664 926/2651/664 928/2652/664 +f 932/2653/665 930/2654/665 931/2655/665 933/2656/665 +f 928/2657/666 926/2658/666 930/2659/666 932/2660/666 +f 933/2661/667 931/2662/667 927/2663/667 929/2664/667 +f 937/2665/668 935/2666/668 934/2667/668 936/2668/668 +f 940/2669/669 938/2670/669 939/2671/669 941/2672/669 +f 936/2673/670 934/2674/670 938/2675/670 940/2676/670 +f 941/2677/671 939/2678/671 935/2679/671 937/2680/671 +f 945/2681/672 943/2682/672 942/2683/672 944/2684/672 +f 948/2685/673 946/2686/673 947/2687/673 949/2688/673 +f 944/2689/674 942/2690/674 946/2691/674 948/2692/674 +f 949/2693/675 947/2694/675 943/2695/675 945/2696/675 +f 953/2697/676 951/2698/676 950/2699/676 952/2700/676 +f 956/2701/677 954/2702/677 955/2703/677 957/2704/677 +f 952/2705/678 950/2706/678 954/2707/678 956/2708/678 +f 905/2709/679 910/2710/679 915/2711/679 958/2712/679 +f 958/2713/680 915/2714/680 916/2715/680 959/2716/680 +f 907/2717/681 917/2718/681 910/2719/681 905/2720/681 +f 907/2721/682 905/2722/682 958/2723/682 959/2724/682 +f 960/2725/683 917/2726/683 910/2727/683 912/2728/683 +f 914/2729/684 962/2730/684 961/2731/684 911/2732/684 +f 911/2733/685 961/2734/685 963/2735/685 912/2736/685 +f 912/2737/686 963/2738/686 964/2739/686 960/2740/686 +f 906/2741/687 966/2742/687 965/2743/687 902/2744/687 +f 902/2745/688 965/2746/688 967/2747/688 904/2748/688 +f 797/2749/689 966/2750/689 969/2751/689 968/2752/689 +f 904/2753/690 967/2754/690 962/2755/690 914/2756/690 +f 952/2757/691 971/2758/691 970/2759/691 953/2760/691 +f 957/2761/692 972/2762/692 973/2763/692 956/2764/692 +f 956/2765/693 973/2766/693 971/2767/693 952/2768/693 +f 944/2769/694 975/2770/694 974/2771/694 945/2772/694 +f 949/2773/695 976/2774/695 977/2775/695 948/2776/695 +f 945/2777/696 974/2778/696 976/2779/696 949/2780/696 +f 948/2781/697 977/2782/697 975/2783/697 944/2784/697 +f 936/2785/698 979/2786/698 978/2787/698 937/2788/698 +f 941/2789/699 980/2790/699 981/2791/699 940/2792/699 +f 937/2793/700 978/2794/700 980/2795/700 941/2796/700 +f 940/2797/701 981/2798/701 979/2799/701 936/2800/701 +f 928/2801/702 983/2802/702 982/2803/702 929/2804/702 +f 933/2805/703 984/2806/703 985/2807/703 932/2808/703 +f 929/2809/704 982/2810/704 984/2811/704 933/2812/704 +f 932/2813/705 985/2814/705 983/2815/705 928/2816/705 +f 920/2817/706 987/2818/706 986/2819/706 921/2820/706 +f 925/2821/707 988/2822/707 989/2823/707 924/2824/707 +f 921/2825/708 986/2826/708 988/2827/708 925/2828/708 +f 963/2829/709 966/2830/709 797/2831/709 990/2832/709 +f 991/2833/710 968/2834/710 969/2835/710 964/2836/710 +f 990/2837/711 797/2838/711 968/2839/711 991/2840/711 +f 964/2841/712 969/2842/712 966/2843/712 963/2844/712 +f 964/2845/713 963/2846/713 990/2847/713 991/2848/713 +f 908/2849/714 969/2850/714 966/2851/714 906/2852/714 +usemtl common_steel +f 992/2853/715 993/2854/715 996/2855/715 995/2856/715 +f 990/2857/716 992/2858/716 995/2859/716 997/2860/716 +f 998/2861/717 996/2862/717 993/2863/717 994/2864/717 +usemtl projectile_workshop +f 154/2865/718 999/2866/718 1000/2867/718 146/2868/718 +f 153/2869/719 1001/2870/719 999/2871/719 154/2872/719 +f 1002/2873/720 130/2874/720 1004/2875/720 1003/2876/720 +f 1005/2877/721 1006/2878/721 1008/2879/721 1007/2880/721 +f 1010/2881/722 1009/2882/722 1011/2883/722 1012/2884/722 +f 1009/2885/723 1005/2886/723 1007/2887/723 1011/2888/723 +f 1006/2889/724 1010/2890/724 1012/2891/724 1008/2892/724 +f 1013/2893/725 1014/2894/725 1009/2895/725 1010/2896/725 +f 1016/2897/726 1015/2898/726 1006/2899/726 1005/2900/726 +usemtl common_thingies +f 1016/2901/727 1014/2902/727 1013/2903/727 1015/2904/727 +usemtl projectile_workshop +f 1015/2905/728 1013/2906/728 1010/2907/728 1006/2908/728 +f 1014/2909/729 1016/2910/729 1005/2911/729 1009/2912/729 +usemtl common_rough_steel +f 1031/2913/730 1032/2914/730 1018/2915/730 1026/2916/730 +f 1033/2917/731 1028/2918/731 1025/2919/731 1021/2920/731 +f 1036/2921/732 1037/2922/732 1033/2923/732 1021/2924/732 +f 1034/2925/733 1035/2926/733 1023/2927/733 1029/2928/733 +f 1038/2929/734 1039/2930/734 1024/2931/734 1020/2932/734 +f 1028/2933/735 1029/2934/735 1023/2935/735 1025/2936/735 +f 1030/2937/736 1031/2938/736 1026/2939/736 165/2940/736 +f 1039/2941/737 1040/2942/737 1022/2943/737 1024/2944/737 +f 1029/2945/738 1028/2946/738 1024/2947/738 1022/2948/738 +f 1040/2949/739 1034/2950/739 1029/2951/739 1022/2952/739 +f 1031/2953/740 1030/2954/740 1019/2955/740 1027/2956/740 +f 1032/2957/741 1031/2958/741 1027/2959/741 1017/2960/741 +f 1037/2961/742 1038/2962/742 1020/2963/742 1033/2964/742 +f 1028/2965/743 1033/2966/743 1020/2967/743 1024/2968/743 +f 1035/2969/744 1034/2970/744 1030/2971/744 165/2972/744 +f 1037/2973/745 1036/2974/745 1018/2975/745 1032/2976/745 +f 1038/2977/746 1037/2978/746 1032/2979/746 1017/2980/746 +f 1039/2981/747 1038/2982/747 1017/2983/747 1027/2984/747 +f 1040/2985/748 1039/2986/748 1027/2987/748 1019/2988/748 +f 1034/2989/749 1040/2990/749 1019/2991/749 1030/2992/749 +usemtl common_copper_cable +f 1042/2993/750 1041/2994/750 1048/2995/750 1045/2996/750 +f 1044/2997/751 1043/2998/751 1046/2999/751 1047/3000/751 +f 1046/3001/752 1045/3002/752 1048/3003/752 1047/3004/752 +f 1043/3005/753 1042/3006/753 1045/3007/753 1046/3008/753 +f 1044/3009/754 1049/3010/754 1050/3011/754 1043/3012/754 +f 1043/3013/755 1050/3014/755 1051/3015/755 1042/3016/755 +f 1042/3017/756 1051/3018/756 1052/3019/756 1041/3020/756 +f 1056/3021/757 1063/3022/757 1062/3023/757 1061/3024/757 +f 1057/3025/758 1053/3026/758 1059/3027/758 1060/3028/758 +f 1059/3029/759 1061/3030/759 1062/3031/759 1060/3032/759 +f 1053/3033/760 1056/3034/760 1061/3035/760 1059/3036/760 +f 1057/3037/761 1058/3038/761 1054/3039/761 1053/3040/761 +f 1053/3041/762 1054/3042/762 1055/3043/762 1056/3044/762 +f 1056/3045/763 1055/3046/763 1064/3047/763 1063/3048/763 usemtl projectile_workshop -f 127/2275/570 126/2276/570 124/2277/570 125/2278/570 -f 793/2279/571 796/2280/571 795/2281/571 794/2282/571 -f 794/2283/572 795/2284/572 797/2285/572 792/2286/572 -f 146/2287/573 798/2288/573 796/2289/573 793/2290/573 -f 154/2291/574 164/2292/574 798/2293/574 146/2294/574 -f 798/2295/575 800/2296/575 799/2297/575 796/2298/575 -f 799/2299/576 800/2300/576 162/2301/576 801/2302/576 -f 164/2303/577 162/2304/577 800/2305/577 798/2306/577 -f 796/2307/578 799/2308/578 802/2309/578 795/2310/578 -f 802/2311/579 799/2312/579 801/2313/579 803/2314/579 -f 795/2315/580 802/2316/580 803/2317/580 797/2318/580 +f 830/3049/764 829/3050/764 833/3051/764 834/3052/764 +f 838/3053/765 837/3054/765 841/3055/765 842/3056/765 +f 846/3057/766 845/3058/766 849/3059/766 850/3060/766 +f 854/3061/767 853/3062/767 857/3063/767 858/3064/767 +f 862/3065/768 861/3066/768 865/3067/768 866/3068/768 +f 921/3069/769 920/3070/769 924/3071/769 925/3072/769 +f 929/3073/770 928/3074/770 932/3075/770 933/3076/770 +f 937/3077/771 936/3078/771 940/3079/771 941/3080/771 +f 945/3081/772 944/3082/772 948/3083/772 949/3084/772 +f 953/3085/773 952/3086/773 956/3087/773 957/3088/773 +usemtl common_steel +f 161/3089/774 159/3090/774 158/3091/774 163/3092/774 +f 1068/3093/775 1074/3094/775 1073/3095/775 1066/3096/775 +f 1070/3097/776 1075/3098/776 1076/3099/776 1072/3100/776 +f 1073/3101/777 1079/3102/777 1080/3103/777 1066/3104/777 +f 1067/3105/778 1078/3106/778 1077/3107/778 1065/3108/778 +f 1065/3109/779 1073/3110/779 1074/3111/779 1067/3112/779 +f 1065/3113/780 1077/3114/780 1079/3115/780 1073/3116/780 +f 1071/3117/781 1076/3118/781 1075/3119/781 1069/3120/781 +f 1069/3121/782 1077/3122/782 1078/3123/782 1071/3124/782 +f 1075/3125/783 1079/3126/783 1077/3127/783 1069/3128/783 +f 1070/3129/784 1080/3130/784 1079/3131/784 1075/3132/784 +f 1072/3133/785 1081/3134/785 1080/3135/785 1070/3136/785 +usemtl common_rough_steel +f 1083/3137/786 1084/3138/786 1086/3139/786 1087/3140/786 +f 1084/3141/787 1083/3142/787 1082/3143/787 1085/3144/787 usemtl common_steel -f 363/2319/581 364/2320/581 368/2321/581 367/2322/581 -f 356/2323/582 355/2324/582 358/2325/582 359/2326/582 -f 340/2327/583 376/2328/583 379/2329/583 380/2330/583 -f 388/2331/584 389/2332/584 393/2333/584 392/2334/584 -f 394/2335/585 395/2336/585 397/2337/585 396/2338/585 -f 371/2339/586 372/2340/586 375/2341/586 374/2342/586 -f 384/2343/587 383/2344/587 385/2345/587 386/2346/587 -f 402/2347/588 403/2348/588 406/2349/588 405/2350/588 +f 1090/3145/788 1089/3146/788 1088/3147/788 1091/3148/788 +o lid1 +v 2 0.6906 -1 +v 2 0.6906 -1.0625 +v 2 -0.0594 -1 +v 2 -0.0594 -1.0625 +v 1 0.6906 -1 +v 1 0.6906 -1.0625 +v 1 -0.0594 -1 +v 1 -0.0594 -1.0625 +v 1.5625 0.4375 -1.0625 +v 1.5625 0.4375 -1.125 +v 1.5625 0.3125 -1.0625 +v 1.5625 0.3125 -1.125 +v 1.4375 0.4375 -1.0625 +v 1.4375 0.4375 -1.125 +v 1.4375 0.3125 -1.0625 +v 1.4375 0.3125 -1.125 +vt 0.75 0.5156 +vt 0.75 0.7031 +vt 0.7344 0.7031 +vt 0.7344 0.5156 +vt 1 0.5156 +vt 1 0.7031 +vt 0.9844 0.7031 +vt 0.9844 0.5156 +vt 1 0.6875 +vt 1 0.7031 +vt 0.75 0.7031 +vt 0.75 0.6875 +vt 1 0.5156 +vt 1 0.5313 +vt 0.75 0.5313 +vt 0.75 0.5156 +vt 1 0.5156 +vt 1 0.7031 +vt 0.75 0.7031 +vt 0.75 0.5156 +vt 1 0.5156 +vt 1 0.7031 +vt 0.75 0.7031 +vt 0.75 0.5156 +vt 0.1875 0.9375 +vt 0.1875 0.9688 +vt 0.1719 0.9688 +vt 0.1719 0.9375 +vt 0.2031 0.9375 +vt 0.2031 0.9688 +vt 0.1875 0.9688 +vt 0.1875 0.9375 +vt 0.1719 0.9688 +vt 0.1719 0.9531 +vt 0.2031 0.9531 +vt 0.2031 0.9688 +vt 0.1719 0.9531 +vt 0.1719 0.9375 +vt 0.2031 0.9375 +vt 0.2031 0.9531 +vt 0.2031 0.9375 +vt 0.2031 0.9688 +vt 0.1719 0.9688 +vt 0.1719 0.9375 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 usemtl projectile_workshop -f 771/2351/589 769/2352/589 770/2353/589 772/2354/589 \ No newline at end of file +f 1095/3149/789 1093/3150/789 1092/3151/789 1094/3152/789 +f 1098/3153/790 1096/3154/790 1097/3155/790 1099/3156/790 +f 1092/3157/791 1093/3158/791 1097/3159/791 1096/3160/791 +f 1095/3161/792 1094/3162/792 1098/3163/792 1099/3164/792 +f 1094/3165/793 1092/3166/793 1096/3167/793 1098/3168/793 +f 1099/3169/794 1097/3170/794 1093/3171/794 1095/3172/794 +usemtl common_bottom +f 1103/3173/795 1101/3174/795 1100/3175/795 1102/3176/795 +f 1106/3177/796 1104/3178/796 1105/3179/796 1107/3180/796 +f 1100/3181/797 1101/3182/797 1105/3183/797 1104/3184/797 +f 1103/3185/798 1102/3186/798 1106/3187/798 1107/3188/798 +f 1107/3189/799 1105/3190/799 1101/3191/799 1103/3192/799 +o lid2 +v 1 0.6906 -1 +v 1 0.6906 -1.0625 +v 1 -0.0594 -1 +v 1 -0.0594 -1.0625 +v 0 0.6906 -1 +v 0 0.6906 -1.0625 +v 0 -0.0594 -1 +v 0 -0.0594 -1.0625 +v 0.5625 0.4375 -1.0625 +v 0.5625 0.4375 -1.125 +v 0.5625 0.3125 -1.0625 +v 0.5625 0.3125 -1.125 +v 0.4375 0.4375 -1.0625 +v 0.4375 0.4375 -1.125 +v 0.4375 0.3125 -1.0625 +v 0.4375 0.3125 -1.125 +vt 0.75 0.5156 +vt 0.75 0.7031 +vt 0.7344 0.7031 +vt 0.7344 0.5156 +vt 1 0.5156 +vt 1 0.7031 +vt 0.9844 0.7031 +vt 0.9844 0.5156 +vt 1 0.6875 +vt 1 0.7031 +vt 0.75 0.7031 +vt 0.75 0.6875 +vt 1 0.5156 +vt 1 0.5313 +vt 0.75 0.5313 +vt 0.75 0.5156 +vt 1 0.5156 +vt 1 0.7031 +vt 0.75 0.7031 +vt 0.75 0.5156 +vt 1 0.5156 +vt 1 0.7031 +vt 0.75 0.7031 +vt 0.75 0.5156 +vt 0.1875 0.9375 +vt 0.1875 0.9688 +vt 0.1719 0.9688 +vt 0.1719 0.9375 +vt 0.2031 0.9375 +vt 0.2031 0.9688 +vt 0.1875 0.9688 +vt 0.1875 0.9375 +vt 0.1719 0.9688 +vt 0.1719 0.9531 +vt 0.2031 0.9531 +vt 0.2031 0.9688 +vt 0.1719 0.9531 +vt 0.1719 0.9375 +vt 0.2031 0.9375 +vt 0.2031 0.9531 +vt 0.2031 0.9375 +vt 0.2031 0.9688 +vt 0.1719 0.9688 +vt 0.1719 0.9375 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 1 +vn 0 0 -1 +vn 1 0 0 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +usemtl projectile_workshop +f 1111/3193/800 1109/3194/800 1108/3195/800 1110/3196/800 +f 1114/3197/801 1112/3198/801 1113/3199/801 1115/3200/801 +f 1108/3201/802 1109/3202/802 1113/3203/802 1112/3204/802 +f 1111/3205/803 1110/3206/803 1114/3207/803 1115/3208/803 +f 1110/3209/804 1108/3210/804 1112/3211/804 1114/3212/804 +f 1115/3213/805 1113/3214/805 1109/3215/805 1111/3216/805 +usemtl common_bottom +f 1119/3217/806 1117/3218/806 1116/3219/806 1118/3220/806 +f 1122/3221/807 1120/3222/807 1121/3223/807 1123/3224/807 +f 1116/3225/808 1117/3226/808 1121/3227/808 1120/3228/808 +f 1119/3229/809 1118/3230/809 1122/3231/809 1123/3232/809 +f 1123/3233/810 1121/3234/810 1117/3235/810 1119/3236/810 \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/textures/gui/upgrade/advanced_data.png b/src/main/resources/assets/immersiveintelligence/textures/gui/upgrade/advanced_data.png new file mode 100644 index 0000000000000000000000000000000000000000..953d3fa08503dda33c00c1e51c88393795b33f12 GIT binary patch literal 2632 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
6t{IE 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 delta 237 zcmV($1Ho8o}foe zd4ti6qt?J%|mo7MPxqb1r8IggH?4AIM1p$AOZq>&k%Q zFWvTfVIYLS=uQk|>iMm;44e{ErUpAx!_?ximrei&VU26O&xdWgH)P33nqVOzg nB5L8YJ^A~7aW6mAVz%K2gOH$Vw>G5U00000NkvXXu0mjfVnuJU diff --git a/src/main/resources/assets/immersiveintelligence/textures/gui/upgrade/flagpole/distress_signal.png b/src/main/resources/assets/immersiveintelligence/textures/gui/upgrade/flagpole/distress_signal.png index ac62d1479e02b5f9deb4ab48b796c353a8888260..ccc0d4f07d4821e76ea188d40575e8fd1cd0d97a 100644 GIT binary patch literal 2264 zcmbtU3pA8z82(0saVt^6xD44%MPb+p&76aAnOc`3lSYf&rFCzHBcyVv5KE2Age4KO z<5p6XD4UJ3hLlUxuFEv1wPzY~+u8a58tHQO?Ad+ie7EO)zW4v$=Y7wlIyuowyfi^ys(P!Sum z*IB3EU@3 zE+L(Vm3%tJhdN!8+vgUJIFkLEi=Gz_oNe^(8MLm|a9U(mH04+&j-<=u>s840?O9Prz*UHneUBxa^YNn@f3PT}5YC3xm z8G7?YBhoeQQz-O};PimAoo75BA^lI2ziWA1xwC#CL#($M~cxOy0zh8nrcsb>~>LuUKA>(u==gmE@k3N>tEEDn^Eb?##sAAVyKFJvGJ*Iq1Av|#5VWRqWBFSmc0sluet2o)9*?? zA$Qplt5wB^jkyK&T?yS5?GwHT-xZZIwJh$G+;gJ=qRF?^ZU^?9*Dq(Xw0H znq*KI!Wr$&k9Ic<+PZ*qCN)R-s2fNd6JyJg#u}V9g*o&gO$eSUyy{2p3PBqlbT@|h zWx74rpJFpx6Vt4WOBptC%N_$;?bBXP7bO`H>%oI^R5*pjTT1F$Gf zDLUoV?JGx@m;Tg><=XOPhL)3)SZya5xtfX#H~U+98NWC(Os|r$*Io#8FWEkMWzP${ zp;3+=t;zGXefO~Qa3Lik;@yCz~{KN3ja8e z{ucHY05CITmb}D;XNek zDk`uO$^bH$Ff%g)=I7^O08&fjTp`eCG!P#j4->dtE{KbZqd`Q-kix&Kka>=GS!23t(Sr>ldK(x J*DXC0{|3B(-X;J5 delta 237 zcmV($1Ho8o}foe zd4ti6qt?J%|mo7MPxqb1r8IggH?4AIM1p$AOZq>&k%Q zFWvTfVIYLS=uQk|>iMm;44e{ErUpAx!_?ximrei&VU26O&xdWgH)P33nqVOzg nB5L8YJ^A~7aW6mAVz%K2gOH$Vw>G5U00000NkvXXu0mjfMU-!n diff --git a/src/main/resources/assets/immersiveintelligence/textures/gui/upgrade/flagpole/taser_locks.png b/src/main/resources/assets/immersiveintelligence/textures/gui/upgrade/flagpole/taser_locks.png index ac62d1479e02b5f9deb4ab48b796c353a8888260..d54fd4f3dd3ece6f0b5cdf084623a94d149a5333 100644 GIT binary patch literal 2326 zcmbVN3pCSv9RKanFowb{(nD7s32PLU9+-ECY-H7CnpYm9d9{w@k+7_}s7Mc#tSDE{ zOLQajIH;6&Dxp>>J#1lf_aAn)+;i@^_qX%={l4GN_w#-JcDA&wE_N8S1{wf>aj?g` z3vXp;%c1~)1%7Mc0)X7L&%=x6?i;g|8X4{%6hc`_i=$GOQeuPr0f_DDC6cn<=qXGL zsnU^7R${@0k81Fv2i+6+A-+iQi~ z-2WxbB>85UL5o>vd<~QNQ8jE|Ocd55k@!47A(dZR@^LT?r_Fz4-I$5hIU zU5&$OL~hVLSI7FyIa6o3tFFr`eKbOrP72*%H?O_F;b9}a%e4>njlC=rYo^ut`Ij^U zn7S)9ODp-ups#F_!nTHmy{RVP3%caJW77qu2j8h^p}{fy zGsKU@?3$y%*&Mfph4kSLkUhsL<~3=1`&u2D^O*f?-Cm#3zJNg8=6%X+^~e9^JD@@ z+MnXEX6D^byxwQCiWQqzU>fe639s*Z_ojJ-Ov7@Ws@Hxsd%>&44WXj?b`PJp;d$v< z1t#ZyM_vk|%^5r1+D9Hd-ssP5`?Fqgnuv=()q1tH(G$hxN{thefrF)7H0e3%}gL$JwolqY(BaWq#N&R>3BpK1N{ zSQ)*YdY!1hsIbrVtP8B0mE3nQYaE@z4p5-!!bvpzMy&t#A`|^Sx^WAr*64n$r#&Dc|>u}qLc}!1= zHr{$+9B!JM6?J60T*k0R?n*kz<4FJ4dqv}k{F~??&kwscm8o)H4^^ilQf^y$9odmp_CT)L zPv)WgPD4i7ij?nePP`F6m$ARdgf~~OI4jzzlSW;a#ph94s~SRW$FJGc#y zwY_${tNH3tMB``uj#RJHx}1&oC+d}zYi@9SeXBmhcl3FY`X0VL@V054i~W7RyqZmw zj&;OHxbSBO8DQyb2|xu?e!_Q-P)CuS?C@X``kc94^1Bd`quOuZ3xK=|v|%9cQ}=Y6==^v9XE5K>7}NOAqt8u*Jw%<3fgLkwj;CqW9!9APLVvGiJmzK!T&y z+)T2=gsDm4i>AW!owt@NP7WrPQoS@euETBxNPM3s{He?2yEy z2QfM2Jl&CqCryA&)y!tIrE4)>ZwjEvK`lb9LiNm~5k)|71tMKp2?G@5q5m)dppirC zKhHtrHGPnvw}Dz0>f)4=1W1<5AZdeUR*Xa~Cg2adTC81ICM!tj2 zwsufkc}Yz8H$hwh@55IB#;2YGa`Gcu0Ms0$XhZVM($&=k(4JZ13OYMGXE4!Sz^)hT dlJd_yG3oyb{z&RAg2HN1b_W|5e7TiR;@?(hzP|tf delta 237 zcmV($1Ho8o}foe zd4ti6qt?J%|mo7MPxqb1r8IggH?4AIM1p$AOZq>&k%Q zFWvTfVIYLS=uQk|>iMm;44e{ErUpAx!_?ximrei&VU26O&xdWgH)P33nqVOzg nB5L8YJ^A~7aW6mAVz%K2gOH$Vw>G5U00000NkvXXu0mjf31)9m diff --git a/src/main/resources/assets/immersiveintelligence/textures/gui/upgrade/flagpole/unit_post.png b/src/main/resources/assets/immersiveintelligence/textures/gui/upgrade/flagpole/unit_post.png index ac62d1479e02b5f9deb4ab48b796c353a8888260..a2e9864c9024096d2debf524e5261f267abf401d 100644 GIT binary patch literal 2569 zcmaJ>3pkW%8-8aD<1jfat)$3dMYe4lha5uVALlS8WsQ~7j#D;5<&@T;gSOJqib%yY zC_-g)+$$|fhC;=pkYO;G853g$v)}i%TGxMF|NmasdwA~Weh%;RKHrx^@^V?BxLOea zu)@uiNQQP*c*@HGfQl5h&jKLplj8eRB01#Xy14k*@TeH-y2Ru->N;vtR5$=hz1@C+ zDHBGxw1|~~ncwNDwhlC>1s&{QAN;X@$ZBNRa$?8Cvp8@)#QB?dMTZx9`g9rj7mD6S z>K%#e7qqNr(%)^aPO}^3y-irKI>0XL>sx!$h+r~(Bz=olJ(UumUS@HY$1SlS6t~(q){2r9*q5m+)0(-drbd=2cheJtcY73VpQb6c zWZXFJ3GjXd}q#Wdv04iX^QgEB`vTBn=0O0q;&q;&0mv9pnZR&Tsxy-g|K z?9XF3HbZ@HmY*NP(RR!y&d>eXnacAwoG;lF`T3WluZ?u>BOYm}{rQy9S#`fi*TH7b zqU(lHp&fO*Yf}fbl>);%efp?v!3}Ch@gey8m-~;^OGcF*<&xIfaEBEc`PiP{Heb;8 z#%1YuX_lv`J)9b`NL*=5&tj|TD?H1ycJdKF$HXgaTtzpIz>#D2ph=ic#UBkxpyI5t ztc`wxA^NOb2EL>&=?Btpz6~hDRHE{o%{nx`d+8oy)9XD~*S6r?jR#E~3k|hGldE}G zI4kTg?Ch$H?x54$63+Bz9aRlo<+j-+=Y!KJy{5>`f5n7;=*o05^T<LEfH6 zexYS)7S2qv4co>%^1DV**F{oj%{lj~xGQ6oZ%AQx3!?YFFV#DIrz5m3k77TXZCbS0 zWpKKvHLz_^1)0;SbcHI!Tx2?eiuW6mdFmnIW2b z#yZC^agjO&Yn?w#llDd)Fm(1cmMK+kTfO41k`jlUyPa>CeBVUl*(-?&ubyz4q`R!Q zluE9~2klS2LD6QB9%&T%Sh?C^UL9NP#0TgU_WkjCq2kjGw)D`os>{_j_k=E^>D_$e zvOM0cm9yS26Ltwiw)DQc8ZJ4XJUS{{^s*;?9^1J%jaJgwsWFoQ?rHDyV_3%2_U}`} zTiSCdtf?~X0M=B|mTTvwcKQSJ+JwF-jaaeWxmdNL{j8vI!ikGN*SyUQ(#jAEmAMO= zT9o$wsBvqB`{sqXBV*++V(d0{t48g39F#eqd-PUnM})^c>V+`-vlGr{=Qob*Bkm|k zF%aX2!{p;XcGGS(2}45r6Jq&kS(V$R-Db2pAO8hC#>j)(KFc4r)_-CRQhynEtk7s5 zVN0YRoe?wZN_XiR&~y7n3QSAuj9%w(=+!!^qC?;Q*%E{L?({v)OB{^^7IEc*&Ku4A zzyJwgb9)^0BqCm~B7QnHJ_}I|=y7cy3E-!HSsn<(gRQAFa z=AkXegR6C;vXxYaE^!i8q}P_`?5F9|uctStu^SeHUs7$#+a6|cn$6>@F24UM#+E=i zpmNvgHr0R6P3r09eOnoB&a|@Qv?0wJD@Tc7L$G{pn!T1+Kn7uoy>y*gfTyy4LL;J6dK}D#Mr*2xJYo0wPO+Rnno1qzHh%6+_g?hLUfeo+*u7p?|8$uM~T>TROP*R5{3KU#k1%cQ^H%}+* zm>gQe&|=Us!x?g9;zlI+TB)IQFar{Zv23&zpOF45KFE%j;_-MX3Wlt$tr3;7vNAyH z=;})q71w~KrY6AQ2>&%%exkU$yG!ATfUu+Xl9R}U0166k<{+IG2oU9(HF^Mv0!w5v zd07$wR8>_4KrjuBP$5$-*>SK%83pY1rNGA$2O!sFux`l%Ww0tA0p=z1040M4dcM)H z2Y|A+af5Cnf=+TkED{3gB2-7L0)VfG#o}Pj{~upNKuIDYmgrEDhz?28#l@uzgTa82 zkrA-8LqrNp#=y(?_&9LX!U41Os{vL+0w&c|Kyx#!`9eUL&fBcNAkfMk8iuYpR>ov9 zztjOb1gI*K{niW7b zmYG+)36d;u47zyk~O zGk`zE0kbna5bdK35uuc!WTMH+2nOq5&YXw`1dt66vgNi5ttv)T^595rPF}<+$KcGr E0SiXco&W#< delta 237 zcmV+lBYyzTNkl($1Ho8o}foe zd4ti6qt?J%|mo7MPxqb1r8IggH?4AIM1p$AOZq>&k%Q zFWvTfVIYLS=uQk|>iMm;44e{ErUpAx!_?ximrei&VU26O&xdWgH)P33nqVOzg nB5L8YJ^A~7aW6mAVz%K2gOH$Vw>G5U00000NkvXXu0mjf|0Zun diff --git a/src/main/resources/assets/immersiveintelligence/textures/gui/upgrade/memory.png b/src/main/resources/assets/immersiveintelligence/textures/gui/upgrade/memory.png new file mode 100644 index 0000000000000000000000000000000000000000..804bbea1c9a62e7c06213cd347b58f140eab94e8 GIT binary patch literal 2476 zcma)62UJtZ8lEJVB26Pjfdc`-0#XvuKu}j{CR9UNSYSb_jN01Hcb9Yq~ zktKi>0bLOU^(go>GzFvvmPJ(1Ag&N<$h$WlT|MV{bncnC^Z)bx<@={(QJu*0GHNma z0C`)AwF~@TgLG+008oc!I_3a?X5!s`pt~H5)uP2j1&4+QY0=|oL0Un_LW2P~HqhhY z{pZjYx#bY$T1ZxV4RL#g0<=Xl)-t8}mw6i6()TU>05)?mdD52=PaUs(9M%x$&h6)= zU8D$N7oJ2?e6MUP6$J-#8iH~B^*EKn&4LG2b7dzgRj*LmQx4x=ceIwM|MFKt^KV}A z1#$B;nc6m_sZ4Kdk3?C|l^<1OFHuxp$HutnIdh0yONll45iOE#<%VZC&ZNFWve$GN zW5tmea%DNS#-U$hP+hhybnN@q^Nxfg8|l}fknQ71?}%>{UY-b-D725NOy&+)5dGxF zTNHT((zA|b4$KbWad{tAnMZzc;cRLDcQNd=@3x`#UsBbO7#}cFnq&YL{yLB&C?y}h zZ+W58FG35=micLIfj5I_g<4y!tW^;p=-kKuP0b43R_SigD#_3_*`nPSjT*3aTEit- zEJK{kOS%S5*0&(%th`+bFPal@%M_L#jkbw0tqsW&bc2rSPwpr=+^rN5sOy;ZU3v+j zs3CH`T zH#)C1pE0+rsGX>^pW996S983t8@}Q!$@d((63lVA98mXt%8t}A=00=wB~_@l1*^2$ z3JqP;IO}8A-hXMR^EFGQ!O~#wqt5atR5_XYeeUKO{A?eV!g!*ssp3#dq~NxGNIE@A zf6nuUM_Es_+NK> z_m$L@wjOSo=y{T%u-oQd+d9%TzjEl+=vZMSDZzj?sus1{CH_8M+XN_uzYQhV{FNpB zyU5{!-3i+Z6-OeN^e!GfRi5Twe0qo3*qvSYiS3J4GWm82C#6`dvf;=9=vDa zWWSk5HzFRW&2)X1rQF_I?0Pe(msH+ctaZrJd0_=A-^^6rPtp;Kkqv4Q7hU4K(t6+ajr1 zIZJ*o8VX8g+iL2mZ~N~bd^pma?xI}Eu!#OAbs$ZV|L~1=IStEAj36;y1v=t#p11>C z0#~moh&34Bfa7bb3z%{ml*IjR(aa%-{Fa>~6Sgrsj5l06{r6*D`5}jkg#<$fvyf1} z8a1!PXz~x;)^jQ^rda$UucY-A(N(x`I~js;EN_9j%|C)Xa`(lapU*k&{Uc36h;1_K zj>n

+ * It deliberately extends vanilla {@link Container} directly. Concrete specialisations are responsible + * for defining their backing object and interaction rules. + * * @author Pabilo8 (pabilo@iiteam.net) * @since 23.09.2023 */ -public class ContainerIIBase extends ContainerIEBase +public abstract class ContainerIIBase extends Container implements ICallbackContainer { + protected final InventoryPlayer inventoryPlayer; + @Nullable + public IInventory inv; + public int slotCount; public Slot[] playerInventory = new Slot[0]; - public ContainerIIBase(EntityPlayer player, T tile) + protected ContainerIIBase(InventoryPlayer inventoryPlayer) { - super(player.inventory, tile); - this.slotCount = tile.getInventory().size(); - this.tile = tile; + this.inventoryPlayer = inventoryPlayer; + } + + protected ContainerIIBase(InventoryPlayer inventoryPlayer, @Nullable IInventory inv, int slotCount) + { + this.inventoryPlayer = inventoryPlayer; + this.inv = inv; + this.slotCount = slotCount; } public Slot[] addPlayerInventory(InventoryPlayer inventoryPlayer, int x, int y) @@ -46,17 +63,34 @@ public Slot[] addPlayerInventory(InventoryPlayer inventoryPlayer, int x, int y) return playerInventory; } - protected DefaultInputSlot addSlot(int x, int y, int index) + protected Slot addSlot(int x, int y, int index) { + if(inv==null) + throw new IllegalStateException(getClass().getSimpleName()+" has no IInventory-backed inventory"); return addSlot(x, y, index, DefaultInputSlot::new); } @SuppressWarnings("unchecked") protected SLOT addSlot(int x, int y, int index, SlotConstructor aNew) { + if(inv==null) + throw new IllegalStateException(getClass().getSimpleName()+" has no IInventory-backed inventory"); return (SLOT)addSlotToContainer(aNew.construct(this, this.inv, index, x, y)); } + protected Slot[] addSlotArray(int x, int y, int startIndex, int totalSlots, int slotsPerRow) + { + return addSlotArray(x, y, startIndex, totalSlots, slotsPerRow, 18); + } + + protected Slot[] addSlotArray(int x, int y, int startIndex, int totalSlots, int slotsPerRow, int slotDistance) + { + ArrayList slots = new ArrayList<>(); + for(int i = 0; i < totalSlots; i++) + slots.add(this.addSlot(x+i%slotsPerRow*slotDistance, y+i/slotsPerRow*slotDistance, i+startIndex)); + return slots.toArray(new Slot[0]); + } + protected Slot[] addSlotArray(int x, int y, int startIndex, int totalSlots, int slotsPerRow, SlotConstructor aNew) { return addSlotArray(x, y, startIndex, totalSlots, slotsPerRow, 18, aNew); @@ -70,6 +104,14 @@ protected Slot[] addSlotArray(int x, int y, int startIndex, return slots.toArray(new Slot[0]); } + protected Slot[] addVirtualSlots(int startIndex, int totalSlots) + { + ArrayList slots = new ArrayList<>(); + for(int i = 0; i < totalSlots; i++) + slots.add(this.addSlot(-32, -32, i+startIndex)); + return slots.toArray(new Slot[0]); + } + protected Slot[] addVirtualSlots(int startIndex, int totalSlots, SlotConstructor aNew) { ArrayList slots = new ArrayList<>(); @@ -78,6 +120,103 @@ protected Slot[] addVirtualSlots(int startIndex, int totalSl return slots.toArray(new Slot[0]); } + protected boolean isStackValid(int slot, ItemStack stack) + { + return inv==null||inv.isItemValidForSlot(slot, stack); + } + + protected int getSlotLimit(int slot) + { + return inv==null?64: inv.getInventoryStackLimit(); + } + + @Override + public boolean canInsert(ItemStack stack, int slotNumer, Slot slotObject) + { + return true; + } + + @Override + public boolean canTake(ItemStack stack, int slotNumer, Slot slotObject) + { + return true; + } + + @Nonnull + @Override + public ItemStack slotClick(int id, int button, ClickType clickType, EntityPlayer player) + { + Slot slot = id < 0||id >= this.inventorySlots.size()?null: this.inventorySlots.get(id); + if(!(slot instanceof IESlot.Ghost)) + return super.slotClick(id, button, clickType, player); + + ItemStack stack = ItemStack.EMPTY; + ItemStack stackSlot = slot.getStack(); + if(!stackSlot.isEmpty()) + stack = stackSlot.copy(); + + if(button==2) + slot.putStack(ItemStack.EMPTY); + else if(button==0||button==1) + { + ItemStack stackHeld = player.inventory.getItemStack(); + if(stackSlot.isEmpty()) + { + if(!stackHeld.isEmpty()&&slot.isItemValid(stackHeld)) + slot.putStack(Utils.copyStackWithAmount(stackHeld, 1)); + } + else if(stackHeld.isEmpty()) + slot.putStack(ItemStack.EMPTY); + else if(slot.isItemValid(stackHeld)) + slot.putStack(Utils.copyStackWithAmount(stackHeld, 1)); + } + else if(button==5) + { + ItemStack stackHeld = player.inventory.getItemStack(); + if(!slot.getHasStack()&&!stackHeld.isEmpty()&&slot.isItemValid(stackHeld)) + slot.putStack(Utils.copyStackWithAmount(stackHeld, 1)); + } + return stack; + } + + @Nonnull + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int slot) + { + ItemStack stack = ItemStack.EMPTY; + Slot slotObject = this.inventorySlots.get(slot); + if(slotObject!=null&&slotObject.getHasStack()) + { + ItemStack stackInSlot = slotObject.getStack(); + stack = stackInSlot.copy(); + if(slot < slotCount) + { + if(!this.mergeItemStack(stackInSlot, slotCount, this.inventorySlots.size(), true)) + return ItemStack.EMPTY; + } + else if(!this.mergeItemStack(stackInSlot, 0, slotCount, false)) + return ItemStack.EMPTY; + + if(stackInSlot.isEmpty()) + slotObject.putStack(ItemStack.EMPTY); + else + slotObject.onSlotChanged(); + + if(stackInSlot.getCount()==stack.getCount()) + return ItemStack.EMPTY; + slotObject.onTake(player, stackInSlot); + } + return stack; + } + + @Override + public void onContainerClosed(EntityPlayer playerIn) + { + super.onContainerClosed(playerIn); + if(inv!=null) + this.inv.closeInventory(playerIn); + } + /** * Functional interface for {@link Slot} constructors to create them in batch. * @@ -133,7 +272,13 @@ public class DefaultInputSlot extends IISlot public DefaultInputSlot(Container container, IInventory inv, int id, int x, int y) { super(container, inv, id, x, y); - withFilter(stack -> tile.isStackValid(getSlotIndex(), stack)); + withFilter(stack -> ContainerIIBase.this.isStackValid(getSlotIndex(), stack)); + } + + @Override + public int getSlotStackLimit() + { + return ContainerIIBase.this.getSlotLimit(getSlotIndex()); } } @@ -178,4 +323,158 @@ public static SlotConstructor getFluidContainerSlot(SideConfig m int filter = mode==SideConfig.NONE?0: (mode==SideConfig.INPUT?2: 1); return (container, inv1, id, x, y) -> new FluidContainer(container, inv1, id, x, y, filter); } + + protected static class InventoryIIEInventory implements IInventory + { + protected final T source; + protected final Supplier displayName; + protected final Predicate usabilityCheck; + + public InventoryIIEInventory(T source, Supplier displayName, Predicate usabilityCheck) + { + this.source = source; + this.displayName = displayName; + this.usabilityCheck = usabilityCheck; + } + + @Override + public int getSizeInventory() + { + return source.getInventory().size(); + } + + @Override + public boolean isEmpty() + { + for(ItemStack stack : source.getInventory()) + if(!stack.isEmpty()) + return false; + return true; + } + + @Nonnull + @Override + public ItemStack getStackInSlot(int index) + { + return source.getInventory().get(index); + } + + @Nonnull + @Override + public ItemStack decrStackSize(int index, int count) + { + ItemStack stack = ItemStackHelper.getAndSplit(source.getInventory(), index, count); + if(!stack.isEmpty()) + { + source.doGraphicalUpdates(index); + markDirty(); + } + return stack; + } + + @Nonnull + @Override + public ItemStack removeStackFromSlot(int index) + { + ItemStack stack = ItemStackHelper.getAndRemove(source.getInventory(), index); + if(!stack.isEmpty()) + { + source.doGraphicalUpdates(index); + markDirty(); + } + return stack; + } + + @Override + public void setInventorySlotContents(int index, @Nonnull ItemStack stack) + { + source.getInventory().set(index, stack); + if(stack.getCount() > getInventoryStackLimit()) + stack.setCount(getInventoryStackLimit()); + source.doGraphicalUpdates(index); + markDirty(); + } + + @Override + public int getInventoryStackLimit() + { + return 64; + } + + @Override + public void markDirty() + { + + } + + @Override + public boolean isUsableByPlayer(@Nonnull EntityPlayer player) + { + return usabilityCheck.test(player); + } + + @Override + public void openInventory(@Nonnull EntityPlayer player) + { + + } + + @Override + public void closeInventory(@Nonnull EntityPlayer player) + { + + } + + @Override + public boolean isItemValidForSlot(int index, @Nonnull ItemStack stack) + { + return source.isStackValid(index, stack); + } + + @Override + public int getField(int id) + { + return 0; + } + + @Override + public void setField(int id, int value) + { + + } + + @Override + public int getFieldCount() + { + return 0; + } + + @Override + public void clear() + { + NonNullList inventory = source.getInventory(); + for(int i = 0; i < inventory.size(); i++) + setInventorySlotContents(i, ItemStack.EMPTY); + } + + @Override + public String getName() + { + return getDisplayName().getUnformattedText(); + } + + @Override + public boolean hasCustomName() + { + return false; + } + + @Nonnull + @Override + public ITextComponent getDisplayName() + { + ITextComponent name = displayName.get(); + return name==null?new TextComponentString(""): name; + } + } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gui/ContainerIIEntityBase.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gui/ContainerIIEntityBase.java new file mode 100644 index 000000000..d623c6388 --- /dev/null +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gui/ContainerIIEntityBase.java @@ -0,0 +1,47 @@ +package pl.pabilo8.immersiveintelligence.common.util.gui; + +import blusunrize.immersiveengineering.common.util.inventory.IIEInventory; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; + +/** + * Entity-backed II container base for entities that expose an {@link IIEInventory}. + * + * @param entity type + */ +public abstract class ContainerIIEntityBase extends ContainerIIBase +{ + public final E entity; + + public ContainerIIEntityBase(EntityPlayer player, E entity) + { + super(player.inventory, new InventoryIIEInventory<>(entity, entity::getDisplayName, entityPlayer -> + !entity.isDead&&entityPlayer.getDistanceSq(entity.posX, entity.posY, entity.posZ) <= 64.0D + ), entity.getInventory().size()); + this.entity = entity; + } + + @Override + public boolean canInteractWith(EntityPlayer player) + { + return inv!=null&&inv.isUsableByPlayer(player); + } + + @Override + protected boolean isStackValid(int slot, ItemStack stack) + { + return entity.isStackValid(slot, stack); + } + + @Override + protected int getSlotLimit(int slot) + { + return entity.getSlotLimit(slot); + } + + public E getEntity() + { + return entity; + } +} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gui/ContainerIIItemBase.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gui/ContainerIIItemBase.java new file mode 100644 index 000000000..cf387db66 --- /dev/null +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gui/ContainerIIItemBase.java @@ -0,0 +1,210 @@ +package pl.pabilo8.immersiveintelligence.common.util.gui; + +import blusunrize.immersiveengineering.common.gui.IESlot.ContainerCallback; +import blusunrize.immersiveengineering.common.gui.IESlot.ICallbackContainer; +import blusunrize.immersiveengineering.common.util.Utils; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.ClickType; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.EntityEquipmentSlot; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumHand; +import net.minecraft.world.World; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.IItemHandler; +import pl.pabilo8.immersiveintelligence.common.util.item.IIItemStackHandler; + +import javax.annotation.Nonnull; + +/** + * ItemStack-backed II container base. + */ +public abstract class ContainerIIItemBase extends ContainerIIBase implements ICallbackContainer +{ + protected final World world; + protected final EntityEquipmentSlot equipmentSlot; + protected final ItemStack heldItem; + protected final EntityPlayer player; + public final IItemHandler itemHandler; + /** + * Kept as the short legacy field name because existing item containers usually reference {@code inv} directly. + */ + public final IItemHandler inv; + public int internalSlots; + protected int blockedSlot; + + public ContainerIIItemBase(EntityPlayer player, ItemStack heldStack, EnumHand hand) + { + super(player.inventory); + this.player = player; + this.world = player.world; + this.equipmentSlot = hand==EnumHand.MAIN_HAND?EntityEquipmentSlot.MAINHAND: EntityEquipmentSlot.OFFHAND; + this.heldItem = heldStack.copy(); + + this.itemHandler = heldStack.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null); + this.inv = this.itemHandler; + if(inv instanceof IIItemStackHandler) + ((IIItemStackHandler)inv).setInventoryForUpdate(inventoryPlayer); + updateSlots(); + } + + protected void updateSlots() + { + if(inv==null) + return; + this.internalSlots = this.addSlots(0); + this.slotCount = this.internalSlots; + this.blockedSlot = this.inventoryPlayer.currentItem+27+internalSlots; + } + + protected abstract int addSlots(int i); + + @Override + protected Slot addSlot(int x, int y, int index) + { + return addItemSlot(x, y, index, (container, inv1, id, x1, y1) -> + new ContainerCallback((Container)container, inv1, id, x1, y1)); + } + + @SuppressWarnings("unchecked") + protected SLOT addItemSlot(int x, int y, int index, ItemSlotConstructor aNew) + { + if(inv==null) + throw new IllegalStateException(getClass().getSimpleName()+" has no item handler inventory"); + return (SLOT)addSlotToContainer(aNew.construct(this, this.inv, index, x, y)); + } + + protected Slot[] addItemSlotArray(int x, int y, int startIndex, int totalSlots, int slotsPerRow, ItemSlotConstructor aNew) + { + return addItemSlotArray(x, y, startIndex, totalSlots, slotsPerRow, 18, aNew); + } + + protected Slot[] addItemSlotArray(int x, int y, int startIndex, int totalSlots, int slotsPerRow, int slotDistance, ItemSlotConstructor aNew) + { + java.util.ArrayList slots = new java.util.ArrayList<>(); + for(int i = 0; i < totalSlots; i++) + slots.add(this.addItemSlot(x+i%slotsPerRow*slotDistance, y+i/slotsPerRow*slotDistance, i+startIndex, aNew)); + return slots.toArray(new Slot[0]); + } + + protected Slot[] addVirtualItemSlots(int startIndex, int totalSlots, ItemSlotConstructor aNew) + { + java.util.ArrayList slots = new java.util.ArrayList<>(); + for(int i = 0; i < totalSlots; i++) + slots.add(this.addItemSlot(-32, -32, i+startIndex, aNew)); + return slots.toArray(new Slot[0]); + } + + /** + * Handle when the stack in slot {@code index} is shift-clicked. Normally this moves the stack between the player + * inventory and the item inventory. + */ + @Nonnull + @Override + public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int slot) + { + ItemStack oldStackInSlot = ItemStack.EMPTY; + Slot slotObject = inventorySlots.get(slot); + + if(slotObject!=null&&slotObject.getHasStack()) + { + ItemStack stackInSlot = slotObject.getStack(); + oldStackInSlot = stackInSlot.copy(); + + if(slot < internalSlots) + { + if(!this.mergeItemStack(stackInSlot, internalSlots, internalSlots+36, true)) + return ItemStack.EMPTY; + } + else if(allowShiftclicking()&&!stackInSlot.isEmpty()) + { + boolean untouched = true; + for(int i = 0; i < internalSlots; i++) + { + Slot targetSlot = inventorySlots.get(i); + if(targetSlot!=null&&targetSlot.isItemValid(stackInSlot)) + { + if(!targetSlot.getStack().isEmpty()&&(!ItemStack.areItemsEqual(stackInSlot, targetSlot.getStack())||!Utils.compareItemNBT(stackInSlot, targetSlot.getStack()))) + continue; + int space = Math.min(targetSlot.getItemStackLimit(stackInSlot), stackInSlot.getMaxStackSize()); + if(!targetSlot.getStack().isEmpty()) + space -= targetSlot.getStack().getCount(); + if(space <= 0) + continue; + ItemStack insert = stackInSlot; + if(space < stackInSlot.getCount()) + insert = stackInSlot.splitStack(space); + if(this.mergeItemStack(insert, i, i+1, true)) + untouched = false; + } + } + if(untouched) + return ItemStack.EMPTY; + } + + if(stackInSlot.getCount()==0) + slotObject.putStack(ItemStack.EMPTY); + else + slotObject.onSlotChanged(); + + slotObject.inventory.markDirty(); + if(stackInSlot.getCount()==oldStackInSlot.getCount()) + return ItemStack.EMPTY; + slotObject.onTake(player, oldStackInSlot); + + updatePlayerItem(false); + detectAndSendChanges(); + } + return oldStackInSlot; + } + + protected boolean allowShiftclicking() + { + return true; + } + + @Override + public boolean canInteractWith(@Nonnull EntityPlayer entityplayer) + { + return ItemStack.areItemsEqual(player.getItemStackFromSlot(equipmentSlot), heldItem); + } + + @Override + public boolean canInsert(ItemStack stack, int slotNumer, Slot slotObject) + { + return inv==null||inv.isItemValid(slotNumer, stack); + } + + @Nonnull + @Override + public ItemStack slotClick(int par1, int par2, ClickType par3, EntityPlayer par4EntityPlayer) + { + if(par1==this.blockedSlot||(par3==ClickType.SWAP&&par2==par4EntityPlayer.inventory.currentItem)) + return ItemStack.EMPTY; + ItemStack ret = super.slotClick(par1, par2, par3, par4EntityPlayer); + updatePlayerItem(false); + return ret; + } + + @Override + public void onContainerClosed(EntityPlayer par1EntityPlayer) + { + super.onContainerClosed(par1EntityPlayer); + if(inv instanceof IIItemStackHandler) + ((IIItemStackHandler)inv).setInventoryForUpdate(null); + if(!world.isRemote) + updatePlayerItem(true); + } + + protected void updatePlayerItem(boolean closing) + { + + } + + @FunctionalInterface + public interface ItemSlotConstructor + { + SLOT construct(ICallbackContainer container, IItemHandler inv, int id, int x, int y); + } +} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gui/ContainerIITileBase.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gui/ContainerIITileBase.java new file mode 100644 index 000000000..460754cbc --- /dev/null +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gui/ContainerIITileBase.java @@ -0,0 +1,56 @@ +package pl.pabilo8.immersiveintelligence.common.util.gui; + +import blusunrize.immersiveengineering.common.blocks.TileEntityIEBase; +import blusunrize.immersiveengineering.common.util.inventory.IIEInventory; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; + +/** + * TileEntity-backed II container base. + * + * @param tile type + */ +public class ContainerIITileBase extends ContainerIIBase +{ + public final T tile; + + public ContainerIITileBase(EntityPlayer player, T tile) + { + super(player.inventory, new InventoryIIEInventory(tile, tile::getDisplayName, entityPlayer -> + tile.hasWorld() + &&tile.getWorld().getTileEntity(tile.getPos())==tile + &&entityPlayer.getDistanceSq(tile.getPos().getX()+0.5D, tile.getPos().getY()+0.5D, tile.getPos().getZ()+0.5D) <= 64.0D + ) + { + @Override + public void markDirty() + { + tile.markDirty(); + } + }, tile.getInventory().size()); + this.tile = tile; + } + + @Override + public boolean canInteractWith(EntityPlayer player) + { + return inv!=null&&inv.isUsableByPlayer(player); + } + + @Override + protected boolean isStackValid(int slot, ItemStack stack) + { + return tile.isStackValid(slot, stack); + } + + @Override + protected int getSlotLimit(int slot) + { + return tile.getSlotLimit(slot); + } + + public T getTile() + { + return tile; + } +} diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/ammoprovider/GunAmmoProviderMagazine.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/ammoprovider/GunAmmoProviderMagazine.java index b215d8f0a..68532f10c 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/ammoprovider/GunAmmoProviderMagazine.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/gun/ammoprovider/GunAmmoProviderMagazine.java @@ -142,7 +142,7 @@ protected boolean canFindAmmo() //Try to find a matching magazine in the operator's hotbar ItemStack foundMagazine = findMagazineInHotbar(magazineType); - if(!foundMagazine.isEmpty()) + if(foundMagazine!=null&&!foundMagazine.isEmpty()) { int needed = magazineType.capacity-getBulletCount(); NonNullList magazineBullets = IIContent.itemBulletMagazine.readInventory(foundMagazine); diff --git a/src/main/resources/assets/immersiveintelligence/textures/gui/ammunition_crate.png b/src/main/resources/assets/immersiveintelligence/textures/gui/ammunition_crate.png deleted file mode 100644 index d199189486e696585458d74f0523b6962ad6adda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188442 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 diff --git a/src/main/resources/assets/immersiveintelligence/textures/gui/casing_pouch.png b/src/main/resources/assets/immersiveintelligence/textures/gui/casing_pouch.png deleted file mode 100644 index 82bbddae76e0f3574fdb2aa5d9ee09e2b65afeb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143434 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 From 172421ac7a630f9b46900fa2c98709ec43d33d37 Mon Sep 17 00:00:00 2001 From: Pabilo8 Date: Mon, 1 Jun 2026 23:19:15 +0200 Subject: [PATCH 12/23] Re-added core filling and production to Projectile Workshop, finished Projectile Workshop and Ammunition Assembler GUIs, closes #541 --- .../api/ammo/enums/ComponentRole.java | 11 +- .../api/ammo/enums/FuseType.java | 16 +- .../api/ammo/parts/IAmmoTypeItem.java | 3 +- .../api/crafting/BulletComponentStack.java | 35 +- .../crafting/ProjectileWorkshopRecipe.java | 38 +-- .../client/ClientProxy.java | 7 + .../gui/block/GuiProjectileWorkshop.java | 224 ++++++++++--- .../GuiAmmunitionAssembler.java | 136 +++++--- .../gui/block/inserter/GuiInserter.java | 2 +- .../client/gui/deco/DecoGui.java | 14 + .../storage/DecoItemStackDisplay.java | 19 +- .../storage/DecoItemStackListDisplay.java | 259 --------------- .../component/widget/DecoManualWidget.java | 11 + .../client/gui/deco/util/DecoColors.java | 3 + .../client/gui/deco/util/DecoTextures.java | 7 +- .../immersiveintelligence/common/IIUtils.java | 8 +- .../factory/AmmoComponentFluid.java | 21 +- .../MultiblockAmmunitionAssembler.java | 4 + .../MultiblockProjectileWorkshop.java | 3 + .../TileEntityAmmunitionAssembler.java | 45 +-- .../TileEntityHeavyAmmunitionAssembler.java | 3 +- .../TileEntityProjectileWorkshop.java | 305 +++++++++++++----- .../EmplacementWeaponHeavyChemthrower.java | 7 + .../commands/item/CommandIIGiveBullet.java | 3 +- .../common/crafting/IIRecipes.java | 8 +- .../gui/ContainerAmmunitionAssembler.java | 10 +- .../gui/ContainerProjectileWorkshop.java | 37 +-- .../TileEntityMultiblockIIBase.java | 6 +- .../aabb/multiblock/ammunition_assembler.json | 12 +- .../aabb/multiblock/projectile_workshop.json | 5 +- .../immersiveintelligence/lang/en_us.lang | 38 +++ .../block/multiblock/filler/filler.obj.amt | 2 +- .../textures/gui/ammunition_assembler.png | Bin 31998 -> 33120 bytes .../textures/gui/deco/icons/icon_contact.png | Bin 173 -> 0 bytes .../gui/deco/icons/icon_fuse_contact.png | Bin 0 -> 2481 bytes .../gui/deco/icons/icon_fuse_proximity.png | Bin 0 -> 2429 bytes .../gui/deco/icons/icon_fuse_timed.png | Bin 0 -> 2522 bytes .../gui/deco/icons/icon_proximity.png | Bin 185 -> 0 bytes .../textures/gui/projectile_workshop.png | Bin 33120 -> 38797 bytes 39 files changed, 769 insertions(+), 533 deletions(-) delete mode 100644 src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/storage/DecoItemStackListDisplay.java delete mode 100644 src/main/resources/assets/immersiveintelligence/textures/gui/deco/icons/icon_contact.png create mode 100644 src/main/resources/assets/immersiveintelligence/textures/gui/deco/icons/icon_fuse_contact.png create mode 100644 src/main/resources/assets/immersiveintelligence/textures/gui/deco/icons/icon_fuse_proximity.png create mode 100644 src/main/resources/assets/immersiveintelligence/textures/gui/deco/icons/icon_fuse_timed.png delete mode 100644 src/main/resources/assets/immersiveintelligence/textures/gui/deco/icons/icon_proximity.png diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/api/ammo/enums/ComponentRole.java b/src/main/java/pl/pabilo8/immersiveintelligence/api/ammo/enums/ComponentRole.java index 46a5eeb8b..a34f3730e 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/api/ammo/enums/ComponentRole.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/api/ammo/enums/ComponentRole.java @@ -1,9 +1,10 @@ package pl.pabilo8.immersiveintelligence.api.ammo.enums; import pl.pabilo8.immersiveintelligence.common.util.IIColor; -import pl.pabilo8.immersiveintelligence.common.util.ISerializableEnum; +import pl.pabilo8.immersiveintelligence.common.util.IIReference; +import pl.pabilo8.immersiveintelligence.common.util.ILocalizedEnum; -public enum ComponentRole implements ISerializableEnum +public enum ComponentRole implements ILocalizedEnum { GENERAL_PURPOSE(0xaaaaaa), SHRAPNEL(0x3f4f57), @@ -32,4 +33,10 @@ public IIColor getColor() { return color; } + + @Override + public String geLocaleKey() + { + return IIReference.DESCRIPTION_KEY+"bullet_type."; + } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/api/ammo/enums/FuseType.java b/src/main/java/pl/pabilo8/immersiveintelligence/api/ammo/enums/FuseType.java index 57b58daa9..9a9fd2717 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/api/ammo/enums/FuseType.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/api/ammo/enums/FuseType.java @@ -1,11 +1,9 @@ package pl.pabilo8.immersiveintelligence.api.ammo.enums; -import pl.pabilo8.immersiveintelligence.common.util.ISerializableEnum; +import pl.pabilo8.immersiveintelligence.common.util.IIReference; +import pl.pabilo8.immersiveintelligence.common.util.ILocalizedEnum; -import javax.annotation.Nonnull; -import java.util.Arrays; - -public enum FuseType implements ISerializableEnum +public enum FuseType implements ILocalizedEnum { CONTACT('\u29b0'), TIMED('\u29b1'), @@ -18,11 +16,9 @@ public enum FuseType implements ISerializableEnum this.symbol = symbol; } - //TODO: 28.05.2024 replace with IIUtils.enumValue - @Nonnull - public static FuseType v(String s) + @Override + public String geLocaleKey() { - String ss = s.toUpperCase(); - return Arrays.stream(values()).filter(e -> e.name().equals(ss)).findFirst().orElse(CONTACT); + return IIReference.DESCRIPTION_KEY+"bullet_fuse."; } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/api/ammo/parts/IAmmoTypeItem.java b/src/main/java/pl/pabilo8/immersiveintelligence/api/ammo/parts/IAmmoTypeItem.java index 27469762b..5e9d156d0 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/api/ammo/parts/IAmmoTypeItem.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/api/ammo/parts/IAmmoTypeItem.java @@ -13,6 +13,7 @@ import pl.pabilo8.immersiveintelligence.api.ammo.enums.PropellantType; import pl.pabilo8.immersiveintelligence.api.utils.ItemTooltipHandler; import pl.pabilo8.immersiveintelligence.api.utils.ItemTooltipHandler.IAdvancedTooltipItem; +import pl.pabilo8.immersiveintelligence.common.IIUtils; import pl.pabilo8.immersiveintelligence.common.entity.ammo.EntityAmmoBase; import pl.pabilo8.immersiveintelligence.common.util.IIColor; import pl.pabilo8.immersiveintelligence.common.util.easynbt.EasyNBT; @@ -183,7 +184,7 @@ default FuseType getFuseType(ItemStack stack) { if(!ItemNBTHelper.hasKey(stack, NBT_FUSE)) makeDefault(stack); - return FuseType.v(ItemNBTHelper.getString(stack, NBT_FUSE)); + return IIUtils.enumValue(FuseType.class, ItemNBTHelper.getString(stack, NBT_FUSE)); } @Override diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/api/crafting/BulletComponentStack.java b/src/main/java/pl/pabilo8/immersiveintelligence/api/crafting/BulletComponentStack.java index 80af3159d..b29205c67 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/api/crafting/BulletComponentStack.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/api/crafting/BulletComponentStack.java @@ -1,6 +1,5 @@ package pl.pabilo8.immersiveintelligence.api.crafting; -import net.minecraft.client.resources.I18n; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.util.INBTSerializable; @@ -30,7 +29,7 @@ private BulletComponentStack(String name, int amount, @Nonnull NBTTagCompound ta { this.name = name; this.amount = amount; - this.tagCompound = tag; + this.tagCompound = tag.copy(); Optional first = AmmoRegistry.getAllComponents().stream() .filter(comp -> this.name.equals(comp.getName())) @@ -41,7 +40,12 @@ private BulletComponentStack(String name, int amount, @Nonnull NBTTagCompound ta public BulletComponentStack(AmmoComponent component, @Nullable NBTTagCompound tag) { - this(component.getName(), 16, tag==null?new NBTTagCompound(): tag); + this(component, 16, tag); + } + + public BulletComponentStack(AmmoComponent component, int amount, @Nullable NBTTagCompound tag) + { + this(component.getName(), amount, tag==null?new NBTTagCompound(): tag); } public BulletComponentStack() @@ -49,13 +53,18 @@ public BulletComponentStack() this("", 0, new NBTTagCompound()); } + public BulletComponentStack copy() + { + return new BulletComponentStack(name, amount, tagCompound); + } + @Override public NBTTagCompound serializeNBT() { NBTTagCompound nbt = new NBTTagCompound(); nbt.setString("name", name); nbt.setInteger("amount", amount); - nbt.setTag("nbt", tagCompound); + nbt.setTag("nbt", tagCompound.copy()); return nbt; } @@ -65,7 +74,7 @@ public void deserializeNBT(NBTTagCompound nbt) { name = nbt.getString("name"); amount = nbt.getInteger("amount"); - tagCompound = nbt.getCompoundTag("nbt"); + tagCompound = nbt.getCompoundTag("nbt").copy(); Optional first = AmmoRegistry.getAllComponents().stream() .filter(comp -> this.name.equals(comp.getName())) @@ -76,7 +85,7 @@ public void deserializeNBT(NBTTagCompound nbt) public boolean isEmpty() { - return name.isEmpty()||amount==0; + return name.isEmpty()||amount==0||component==null; } public boolean isFluid() @@ -86,30 +95,34 @@ public boolean isFluid() public boolean matches(ItemStack stack) { - if(isEmpty()||component==null) + if(isEmpty()) return true; + if(stack.isEmpty()||component==null) + return false; NBTTagCompound stackTag = stack.getTagCompound(); if(stackTag==null) stackTag = new NBTTagCompound(); - return component.getName().equals(name)&&this.tagCompound.equals(stackTag); + return component.getMaterial().matchesItemStackIgnoringSize(stack)&&this.tagCompound.equals(stackTag); } public boolean matches(FluidStack fs) { if(isEmpty()) return true; + if(fs==null||component==null||component.getMaterial().fluid==null) + return false; NBTTagCompound stackTag = fs.tag==null?new NBTTagCompound(): fs.tag; - return fs.getFluid().getName().equals(name)&&this.tagCompound.equals(stackTag); + return fs.isFluidEqual(component.getMaterial().fluid)&&this.tagCompound.equals(stackTag); } public void subtract(int amount) { this.amount = Math.max(0, this.amount-amount); - if(amount==0) + if(this.amount==0) { tagCompound = new NBTTagCompound(); name = ""; @@ -135,7 +148,7 @@ public float getAmountPercentage() @SideOnly(Side.CLIENT) public String getTranslatedName() { - return I18n.format("ie.manual.entry.bullet_component."+name); + return component!=null?component.getTranslatedName(): ""; } public AmmoComponent getComponent() diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/api/crafting/ProjectileWorkshopRecipe.java b/src/main/java/pl/pabilo8/immersiveintelligence/api/crafting/ProjectileWorkshopRecipe.java index dbdcbb57a..70656ee0b 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/api/crafting/ProjectileWorkshopRecipe.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/api/crafting/ProjectileWorkshopRecipe.java @@ -17,9 +17,27 @@ **/ public class ProjectileWorkshopRecipe extends IIMultiblockRecipe { + public static final String FILLING_RECIPE_NAME = "core_filling"; + public static final ProjectileWorkshopRecipe CORE_FILLING = new ProjectileWorkshopRecipe(); + + @Nullable public IAmmoTypeItem ammo; public boolean isFilling; - public ItemStack effect, ingredient; + public ItemStack effect = ItemStack.EMPTY, ingredient = ItemStack.EMPTY; + + /** + * Single hard-coded recipe used by Core Filler mode. + */ + private ProjectileWorkshopRecipe() + { + super(FILLING_RECIPE_NAME); + this.isFilling = true; + + this.setTimeAndEnergy( + ProjectileWorkshop.fillingTime, + ProjectileWorkshop.fillingEnergyUsage + ); + } /** * Production recipe @@ -42,25 +60,9 @@ public ProjectileWorkshopRecipe(IAmmoTypeItem ammo, AmmoCore core, CoreTyp ); } - //Filling recipe - /*public ProjectileWorkshopRecipe(ItemStack inputStack, BulletComponentStack component) - { - assert inputStack.getItem() instanceof IAmmoTypeItem; - - this.ammo = (IAmmoTypeItem)inputStack.getItem(); - this.isFilling = true; - - this.totalProcessTime = ProjectileWorkshop.fillingTime; - this.energyPerTick = ProjectileWorkshop.fillingEnergyUsage; - - this.effect = inputStack.copy(); - this.effect.setCount(1); - ammo.addComponents(this.effect, component.getComponent(), component.tagCompound); - }*/ - public ItemStack getEffect() { - return effect; + return effect.copy(); } @Nullable diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/ClientProxy.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/ClientProxy.java index 2a9f08123..8897e4f2f 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/ClientProxy.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/ClientProxy.java @@ -57,6 +57,7 @@ import pl.pabilo8.immersiveintelligence.api.ShrapnelHandler; import pl.pabilo8.immersiveintelligence.api.ShrapnelHandler.Shrapnel; import pl.pabilo8.immersiveintelligence.api.ammo.AmmoRegistry; +import pl.pabilo8.immersiveintelligence.api.ammo.parts.AmmoComponent; import pl.pabilo8.immersiveintelligence.api.ammo.parts.IAmmoTypeItem; import pl.pabilo8.immersiveintelligence.api.crafting.recipe.IIMultiblockRecipe; import pl.pabilo8.immersiveintelligence.api.data.IIDataTypeUtils; @@ -107,6 +108,7 @@ import pl.pabilo8.immersiveintelligence.client.util.font.IIFontRendererCustomGlyphs; import pl.pabilo8.immersiveintelligence.common.*; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Factions; +import pl.pabilo8.immersiveintelligence.common.ammo.components.factory.AmmoComponentFluid; import pl.pabilo8.immersiveintelligence.common.block.data_device.tileentity.TileEntityDataMerger; import pl.pabilo8.immersiveintelligence.common.block.data_device.tileentity.TileEntityRedstoneBuffer; import pl.pabilo8.immersiveintelligence.common.block.data_device.tileentity.TileEntitySmallDataBuffer; @@ -745,6 +747,11 @@ public void postInit(FMLPostInitializationEvent event) ForgeHooksClient.registerTESRItemStack(Item.getItemFromBlock(IIContent.blockMetalDevice), IIBlockTypes_MetalDevice.SMALL_DATA_BUFFER.getMeta(), TileEntitySmallDataBuffer.class); ForgeHooksClient.registerTESRItemStack(Item.getItemFromBlock(IIContent.blockMetalDevice), IIBlockTypes_MetalDevice.DATA_MERGER.getMeta(), TileEntityDataMerger.class); + //Fix colors for fluid ammo components on client + for(AmmoComponent component : AmmoRegistry.getAllComponents()) + if(component instanceof AmmoComponentFluid) + ((AmmoComponentFluid)component).setOverrideColor(IIClientUtils.getFluidTextureColor(((AmmoComponentFluid)component).getFluid())); + //Load Models reloadModels(); IIMultiblockRecipe.loadAllClientSideContent(); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiProjectileWorkshop.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiProjectileWorkshop.java index 3f57a6dc9..b2df81d98 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiProjectileWorkshop.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/GuiProjectileWorkshop.java @@ -1,12 +1,14 @@ package pl.pabilo8.immersiveintelligence.client.gui.block; import blusunrize.immersiveengineering.api.crafting.IngredientStack; +import blusunrize.immersiveengineering.common.IEContent; import blusunrize.immersiveengineering.common.util.Utils; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.Vec3d; +import net.minecraft.util.text.TextFormatting; import pl.pabilo8.immersiveintelligence.api.ammo.AmmoRegistry; import pl.pabilo8.immersiveintelligence.api.ammo.enums.CoreType; import pl.pabilo8.immersiveintelligence.api.ammo.enums.FuseType; @@ -18,7 +20,9 @@ import pl.pabilo8.immersiveintelligence.api.ammo.utils.AmmoBallisticsCache; import pl.pabilo8.immersiveintelligence.api.ammo.utils.AmmoBallisticsCache.CachedBallisticStats; import pl.pabilo8.immersiveintelligence.api.ammo.utils.IIAmmoUtils; +import pl.pabilo8.immersiveintelligence.api.crafting.BulletComponentStack; import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoButton; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.collection.DecoDropdown; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.label.DecoLabel; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoEntryPanelBuilder; @@ -27,6 +31,7 @@ import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoItemStackDisplay; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoScenarioDisplay; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.visual.DecoImage; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.visual.DecoImage.ImageAnimationDirection; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.*; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoBackgroundBuilder.SlotStyle; import pl.pabilo8.immersiveintelligence.client.util.amt.parts.AMTBullet; @@ -37,11 +42,13 @@ import pl.pabilo8.immersiveintelligence.common.IIUtils; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.TileEntityProjectileWorkshop; import pl.pabilo8.immersiveintelligence.common.gui.ContainerProjectileWorkshop; +import pl.pabilo8.immersiveintelligence.common.util.IIColor; import pl.pabilo8.immersiveintelligence.common.util.IIReference; import pl.pabilo8.immersiveintelligence.common.util.easynbt.EasyNBT; import pl.pabilo8.immersiveintelligence.common.util.multiblock.util.MultiblockInteractablePart; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -54,6 +61,8 @@ @DecoTemplate(name = "projectile_workshop", category = DecoGuiCategory.PRODUCTION_TILE) public class GuiProjectileWorkshop extends DecoTileGui { + private static final String GUI_KEY = IIReference.GUI_LABEL_KEY+"projectile_workshop."; + @DecoResource public static ResourceLocation PROGRESS_BAR = IIReference.RES_II.with("gui/projectile_workshop"); @DecoResource @@ -83,7 +92,7 @@ public class GuiProjectileWorkshop extends DecoTileGui coreTypeDropdown; private IAmmoTypeItem ammoType; private AmmoCore ammoCore; @@ -93,8 +102,6 @@ public class GuiProjectileWorkshop extends DecoTileGui 0.5f?tile.lid1: tile.lid2), true); + syncAnimatedParts(openedPart = Utils.RAND.nextGaussian() > 0.5f?tile.lid1: tile.lid2, true); //Add background startBackground() - .withBox(DecoTextures.BG_STEEL_ROUGH, DecoTextures.TEMPLATE_SQUARE, 0, 0, 256, 130) + .withBox(DecoTextures.BG_STEEL_ROUGH, DecoTextures.TEMPLATE_SQUARE, 0, 0, hasFillerUpgrade?176: 256, 130) .withTitleBar(tile) .withNextLayer() - .withBox(DecoTextures.BG_WOODEN, DecoTextures.TEMPLATE_ROUND_WOODEN, 44, 136, 176, 92) + .withBox(DecoTextures.BG_WOODEN, DecoTextures.TEMPLATE_ROUND_WOODEN, hasFillerUpgrade?0: 44, 136, 176, 92) .withInventorySlots(SlotStyle.VANILLA, container.playerInventory) .withInventoryTitleBar() @@ -135,6 +142,13 @@ public void onInit() .withNextLayer() .withBox(DecoTextures.BG_PAPER, DecoTextures.TEMPLATE_TICKET, 44, 18, 96, 72) ) + .conditionally(hasFillerUpgrade, builder -> builder + .withInventorySlots(SlotStyle.IE_INPUT, container.inputSlot) + .withInventorySlots(SlotStyle.IE_INPUT, container.componentInputSlot) + .withNextLayer() + .withBox(DecoTextures.BG_PAPER, DecoTextures.TEMPLATE_PAPER, 4, 128+8-64-4, 176-4-8, 64) + .withTitleBar(GUI_KEY+"component_info", DecoAlignment.TOP_LEFT) + ) .build(); //Add foreground @@ -150,7 +164,113 @@ public void onInit() private void addCoreFillerComponents() { + //Upgraded + addComponents( + //Energy bar + new DecoBar(176-8, 4) + .withSize(12, 64) + .withTemplate(DecoTemplates.BAR_ELECTRIC_ENERGY.apply(tile.energyStorage)), + //Right-side paper panel + this.fillerInfoPanel = new DecoPanel(4, 128+8-64+4) + .withSize(176, 64) + .withBackground(null), + //Stored component display + new DecoItemStackDisplay(176/2-9, 12) + .withSize(16, 16) + .withOnTooltip(gui -> { + AmmoComponent current = tile.componentInside.getComponent(); + if(current==null||tile.componentInside.amount <= 0) + return Collections.singleton(I18n.format("gui.immersiveengineering.empty")); + return Arrays.asList( + tile.componentInside.getColor().getHexCol(tile.componentInside.getTranslatedName()), + tile.componentInside.amount+" mB" + ); + }) + .withBackgroundTexture(DecoSprite.atlasSprite(DecoTextures.SLOT_IE, 32, true)) + .withProgressBar(partialTicks -> tile.componentInside.getAmountPercentage(), + () -> new IIColor[]{tile.componentInside.getColor()} + ), + new DecoItemStackDisplay(176-8-24+2, 45-8) + .withSize(16, 16) + .withBackgroundTexture(DecoSprite.atlasSprite(DecoTextures.SLOT_IE, 32, true)), + + //Progress bar background + new DecoImage(8+64+8+2+1-48-2, 28+4+4+4+1) + .withSize(48, 8) + .withImageLocation(PROGRESS_BAR, true) + .withUV(64, 16, 11, 16+48, 11+8), + new DecoImage(8+64+8+2+1, 28+4+4) + .withSize(8, 19) + .withImageLocation(PROGRESS_BAR, true) + .withUV(64, 37, 19, 37+8, 19+19), + new DecoImage(8+64+8+2+1+2+8, 28+4+4+4) + .withSize(48, 10) + .withImageLocation(PROGRESS_BAR, true) + .withUV(64, 16, 0, 16+48, 10), + + //Progress bar + new DecoImage(8+64+8+2+1-48, 28+4+4+4+1+1) + .withSize(44, 6) + .withImageLocation(PROGRESS_BAR, true) + .withUV(64, 0, 47, 44, 47+6) + .withAnimation(ImageAnimationDirection.LEFT_TO_RIGHT, DecoGuiUtils.getMultiblockProductionSingleProgress(tile, 0f, 0.45f)), + new DecoImage(8+64+8+2+1, 28+4+4) + .withSize(8, 19) + .withImageLocation(PROGRESS_BAR, true) + .withUV(64, 45, 19, 45+8, 19+19) + .withAnimation(ImageAnimationDirection.LEFT_TO_RIGHT, DecoGuiUtils.getMultiblockProductionSingleProgress(tile, 0.45f, 0.55f)), + new DecoImage(8+64+8+2+1+2+8+2, 28+4+4+4+2) + .withSize(44, 6) + .withImageLocation(PROGRESS_BAR, true) + .withUV(64, 0, 39, 44, 39+6) + .withAnimation(ImageAnimationDirection.LEFT_TO_RIGHT, DecoGuiUtils.getMultiblockProductionSingleProgress(tile, 0.55f, 1f)) + ); + + addValueListener(() -> tile.componentInside.serializeNBT().toString()+"|"+tile.componentFillAmount) + .addObserver(hash -> updateFillerInfo()); + updateFillerInfo(); + } + + private void updateFillerInfo() + { + BulletComponentStack stack = tile.componentInside; + this.fillerInfoPanel.cleanup(); + if(stack==null||stack.isEmpty()||stack.component==null) + return; + fillerInfoPanel.addLabel(TextFormatting.ITALIC+stack.component.getTranslatedName(), 4, 0) + .withSize(76, 9) + .withAlign(DecoAlignment.LEFT); + fillerInfoPanel.addLabel(I18n.format(GUI_KEY+"component.role", stack.component.getRole().getLocalizedName()), 4, 12) + .withSize(100, 9) + .withAlign(DecoAlignment.LEFT); + fillerInfoPanel.addLabel(I18n.format(GUI_KEY+"component.density", stack.component.getDensity()), 4, 24) + .withSize(100, 9) + .withAlign(DecoAlignment.LEFT); + fillerInfoPanel.addLabel(I18n.format(GUI_KEY+"component.slots_taken", stack.component.getSlotsTaken()), 4, 36) + .withSize(100, 9) + .withAlign(DecoAlignment.LEFT); + if(stack.component.showInManual()) + fillerInfoPanel.addComponent(new DecoButton(176-6-16-8-2, -4) + .withSize(20, 20) + + .withBackground(DecoTextures.COMPONENT_BUTTON) + .withBackgroundColor(IIColor.fromPackedRGB(0x7A7ABC)) + .withPadding(2, 2, 2, 2) + .withIconAlignment(DecoAlignment.CENTER) + //Engineer's Manual + .withIcon(new ItemStack(IEContent.itemTool, 1, 3)) + .withTranslatedTooltip(IIReference.GUI_TOOLTIP_KEY+"widget.manual.page") + + .withOnLMBPressed(() -> { + int index = AmmoRegistry.getAllComponents().stream() + .filter(AmmoPart::showInManual) + .filter(c -> !c.getMaterial().getExampleStack().isEmpty()) + .collect(Collectors.toList()) + .indexOf(stack.component); + openManualWidget("bullet_components", index); + }) + ); } private void addCoreWorkshopComponents() @@ -176,12 +296,12 @@ private void addCoreWorkshopComponents() new DecoLabel(fontRenderer, 20, 2) .withSize(48, 18) .withAlign(DecoAlignment.LEFT) - .withText("Core") + .withText(GUI_KEY+"entry.core") ) .withElementApplyMethod(this::drawCoreTypeEntry) - .withElementTooltip(typeMeta -> "a") + .withElementTooltip(typeMeta -> GUI_KEY+"tooltip.core_type") ) - .withTranslatedTooltip("Core Type"), + .withTranslatedTooltip(GUI_KEY+"tooltip.core_type"), new DecoDropdown>(0, 93) .withSize(144, 20) @@ -203,13 +323,13 @@ private void addCoreWorkshopComponents() new DecoLabel(fontRenderer, 20, 2) .withSize(48, 18) .withAlign(DecoAlignment.LEFT) - .withText("Type") + .withText(GUI_KEY+"entry.type") ) .withElementApplyMethod(this::drawAmmoTypeEntry) - .withElementTooltip(typeMeta -> "a") + .withElementTooltip(typeMeta -> I18n.format(GUI_KEY+"tooltip.ammunition_type")) ) - .withTranslatedTooltip("Ammunition Type"), + .withTranslatedTooltip(GUI_KEY+"tooltip.ammunition_type"), //3D display and cost label item scenario = new DecoScenarioDisplay(46, 20) .withSize(80, 60) @@ -229,14 +349,28 @@ private void addCoreWorkshopComponents() .withSize(12, 69) .withTemplate(DecoTemplates.BAR_ELECTRIC_ENERGY.apply(tile.energyStorage)), - //Progress bar + //Progress bar background new DecoImage(8, 28) - .withSize(37, 39) + .withSize(16, 29) + .withImageLocation(PROGRESS_BAR, true) + .withUV(64, 0, 0, 16, 29), + new DecoImage(8, 28+29) + .withSize(37, 10) .withImageLocation(PROGRESS_BAR, true) - .withUV(64, 0, 0, 37, 39) + .withUV(64, 0, 29, 37, 29+10), + //Progress bar + new DecoImage(8+2, 28+2) + .withSize(12, 27) + .withImageLocation(PROGRESS_BAR, true) + .withUV(64, 52, 26, 52+12, 26+27) + .withAnimation(ImageAnimationDirection.TOP_TO_BOTTOM, DecoGuiUtils.getMultiblockProductionSingleProgress(tile, 0f, 0.6f)), + new DecoImage(8+2+4, 28+2+27+1) + .withSize(29, 7) + .withImageLocation(PROGRESS_BAR, true) + .withUV(64, 35, 57, 35+29, 57+7) + .withAnimation(ImageAnimationDirection.LEFT_TO_RIGHT, DecoGuiUtils.getMultiblockProductionSingleProgress(tile, 0.6f, 1f)) ); - addLabel("Cost:", 48, 79) - .withSize(78, 9); + addLabel(GUI_KEY+"cost", 48, 79); costLabel = addLabel("", 48, 79) .withSize(62, 9) .withAlign(DecoAlignment.RIGHT); @@ -251,7 +385,7 @@ private void updateCoreInfo() { exampleStackDisplay.withStack(ItemStack.EMPTY); scenario.withModel(false, new AMTLocator("missingno", Vec3d.ZERO)); - costLabel.withText("Cost: 250 Pabulions and one Yevreiski Cent"); + costLabel.withText(GUI_KEY+"invalid_cost"); return; } @@ -264,7 +398,7 @@ private void updateCoreInfo() .withSelectedEntry(coreType); //List cost, available materials and update 3D model - costLabel.withText(ammoType.getCoreMaterialNeeded()+"x"); + costLabel.withRawText(I18n.format(GUI_KEY+"unit.multiplier", ammoType.getCoreMaterialNeeded())); List stacks = AmmoRegistry.getAllCores().stream() .map(AmmoCore::getMaterial) .map(IngredientStack::getExampleStack) @@ -280,7 +414,7 @@ private void updateCoreInfo() ammoInfoPanel.cleanup(); //Core material dropdown ammoInfoPanel.addLabel(new DecoLabel(fontRenderer, 0, 8) - .addText("Material Preview") + .withText(GUI_KEY+"material_preview") .withSize(ammoInfoPanel.width, 8) .withAlign(DecoAlignment.CENTER) ); @@ -304,7 +438,7 @@ private void updateCoreInfo() new DecoLabel(fontRenderer, 20, 2) .withSize(48, 16) .withAlign(DecoAlignment.LEFT) - .withText("Type") + .withText(GUI_KEY+"entry.type") ) .withElementApplyMethod(this::drawAmmoCoreEntry) @@ -317,19 +451,19 @@ private void updateCoreInfo() //Core ammoInfoPanel.addLabel(new DecoLabel(fontRenderer, 0, 37) - .addText("Core") + .withText(GUI_KEY+"section.core") .withSize(ammoInfoPanel.width, 8) .withAlign(DecoAlignment.CENTER) ); addImageWithLabel(1, 45, COMPONENT_SLOTS, coreType.getComponentSlots(), - "Component Slots"); + GUI_KEY+"tooltip.component_slots"); addImageWithLabel(ammoInfoPanel.width/2, 45, COMPONENT_SHAPE, "desc.immersiveintelligence.effect_shape."+coreType.getEffectShape().getName().toLowerCase(), - "Component Effect Shape"); + GUI_KEY+"tooltip.component_effect_shape"); - addImageWithLabel(1, 45+13, COMPONENT_EFFICIENCY, coreType.getComponentEffectivenessMod()*ammoCore.getExplosionModifier()+"x", - "Component Efficiency Modifier", "Determines potency.", "Responsible for explosive power, chemical gas concentration."); - addImageWithLabel(ammoInfoPanel.width/2, 45+13, COMPONENT_SIZE, Utils.formatDouble(ammoType.getComponentSize(), "0.##")+"x", - "Component Size Multiplier", "Determines component volume, responsible for explosion radius, gas spread range multiplier."); + addImageWithLabel(1, 45+13, COMPONENT_EFFICIENCY, I18n.format(GUI_KEY+"unit.multiplier", coreType.getComponentEffectivenessMod()*ammoCore.getExplosionModifier()), + GUI_KEY+"tooltip.component_efficiency", GUI_KEY+"tooltip.component_efficiency.line1", GUI_KEY+"tooltip.component_efficiency.line2"); + addImageWithLabel(ammoInfoPanel.width/2, 45+13, COMPONENT_SIZE, I18n.format(GUI_KEY+"unit.multiplier", Utils.formatDouble(ammoType.getComponentSize(), "0.##")), + GUI_KEY+"tooltip.component_size", GUI_KEY+"tooltip.component_size.line1"); //Ballistics if(ammoType.getClass().isAnnotationPresent(IIAmmoProjectile.class)) @@ -338,30 +472,32 @@ private void updateCoreInfo() assert projectileInfo!=null; CachedBallisticStats stats = AmmoBallisticsCache.get(ammoType, ammoType.getAmmoStack(ammoCore, coreType, FuseType.CONTACT)); ammoInfoPanel.addLabel(new DecoLabel(fontRenderer, 0, 73) - .addText("Ballistics") + .withText(GUI_KEY+"section.ballistics") .withSize(ammoInfoPanel.width, 8) .withAlign(DecoAlignment.CENTER) ); addImageWithLabel(1, 81-2, MASS, Utils.formatDouble(ammoType.getCoreMass(ammoCore, new AmmoComponent[0]), "0.##"), - "Core Mass"); + GUI_KEY+"tooltip.core_mass"); addImageWithLabel(ammoInfoPanel.width/2, 81-2, DAMAGE, Utils.formatDouble(ammoType.getDamage()*ammoCore.getDamageModifier()*coreType.getDamageMod(), "0.##"), - "Damage Dealt"); - addImageWithLabel(1, 81+13, VELOCITY, ammoType.getVelocity()+" b/t", - "Velocity"); + GUI_KEY+"tooltip.damage_dealt"); + addImageWithLabel(1, 81+13, VELOCITY, I18n.format(GUI_KEY+"unit.blocks_per_tick", ammoType.getVelocity()), + GUI_KEY+"tooltip.velocity"); addImageWithLabel(ammoInfoPanel.width/2, 81+13, AVAILABLE_FUZES, ammoType.getAllowedFuseTypes().length+"/"+FuseType.values().length, - "Available Fuzes"); + GUI_KEY+"tooltip.available_fuzes"); addImageWithLabel(1, 81+13+13, PENETRATION_HARDNESS, - Utils.formatDouble(IIAmmoUtils.getCombinedDepth(ammoType, coreType), "0.##")+"b "+ - I18n.format("desc.immersiveintelligence.penetration_hardness."+IIAmmoUtils.getCombinedHardness(ammoCore, coreType).getName().toLowerCase()), - "Penetration Hardness"); + I18n.format(GUI_KEY+"value.penetration_hardness", + Utils.formatDouble(IIAmmoUtils.getCombinedDepth(ammoType, coreType), "0.##"), + I18n.format("desc.immersiveintelligence.penetration_hardness."+IIAmmoUtils.getCombinedHardness(ammoCore, coreType).getName().toLowerCase()) + ), + GUI_KEY+"tooltip.penetration_hardness"); /*addImageWithLabel(ammoInfoPanel.width/2, 81+13+13, MAX_PENETRATION_DEPTH, , "Max. Penetration Depth");*/ - addImageWithLabel(1, 81+13+13+13, FLAT_TRAJECTORY_RANGE, Utils.formatDouble(stats.getMaxDirectRange(), "0.##")+"b", - "Flat-Trajectory Range"); + addImageWithLabel(1, 81+13+13+13, FLAT_TRAJECTORY_RANGE, I18n.format(GUI_KEY+"unit.blocks", Utils.formatDouble(stats.getMaxDirectRange(), "0.##")), + GUI_KEY+"tooltip.flat_trajectory_range"); addImageWithLabel(ammoInfoPanel.width/2, 81+13+13+13, ARTILLERY_RANGE, projectileInfo.artillery()? - Utils.formatDouble(stats.getGetMaxArtilleryRange(), "0.##")+"b": "-", - "Max. Artillery Range"); + I18n.format(GUI_KEY+"unit.blocks", Utils.formatDouble(stats.getGetMaxArtilleryRange(), "0.##")): "-", + GUI_KEY+"tooltip.max_artillery_range"); } } @@ -406,7 +542,11 @@ private void addImageWithLabel(int x, int y, ResourceLocation icon, Object value @Override protected EasyNBT onSaveTileData() { - return super.onSaveTileData() + EasyNBT nbt = super.onSaveTileData(); + if(hasFillerUpgrade) + return nbt.withInt("component_fill_amount", tile.componentFillAmount); + + return nbt .withEnum("core_type", coreType) .withString("produced_bullet", ammoType.getName()); } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/ammunition_production/GuiAmmunitionAssembler.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/ammunition_production/GuiAmmunitionAssembler.java index 69f4f1029..2994ca83b 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/ammunition_production/GuiAmmunitionAssembler.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/ammunition_production/GuiAmmunitionAssembler.java @@ -1,21 +1,30 @@ package pl.pabilo8.immersiveintelligence.client.gui.block.ammunition_production; +import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ResourceLocation; +import pl.pabilo8.immersiveintelligence.api.ammo.enums.FuseType; import pl.pabilo8.immersiveintelligence.client.gui.deco.DecoTileGui; -import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoButton; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.collection.DecoDropdown; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.label.DecoLabel; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoEntryPanelBuilder; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoPanel; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoBar; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoItemStackDisplay; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.text.DecoTextField; -import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoBackgroundBuilder.SlotStyle; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.text.util.TextFilter; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.visual.DecoImage; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.visual.DecoImage.ImageAnimationDirection; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.*; +import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoBackgroundBuilder.SlotStyle; import pl.pabilo8.immersiveintelligence.common.IIGUI; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.TileEntityAmmunitionAssembler; import pl.pabilo8.immersiveintelligence.common.gui.ContainerAmmunitionAssembler; import pl.pabilo8.immersiveintelligence.common.util.IIColor; import pl.pabilo8.immersiveintelligence.common.util.IIReference; import pl.pabilo8.immersiveintelligence.common.util.ResLoc; - -import static pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoTextures.*; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT; +import pl.pabilo8.immersiveintelligence.common.util.easynbt.SyncNBT.SyncEvents; /** * @author Pabilo8 (pabilo@iiteam.net) @@ -27,12 +36,12 @@ @DecoTemplate(name = "ammunition_assembler", category = DecoGuiCategory.PRODUCTION_TILE) public class GuiAmmunitionAssembler extends DecoTileGui { - @DecoResource - public static ResourceLocation TEXTURE_AMMOAS = ResLoc.of(IIReference.RES_II.with("gui/ammunition_assembler")); - - private DecoButton btnProximity, btnContact, btnTime; - private DecoTextField fuseTextField; + public static ResourceLocation TEXTURE = ResLoc.of(IIReference.RES_II.with("gui/ammunition_assembler")); + @SyncNBT(events = SyncEvents.TILE_CLIENT_MESSAGE) + public FuseType fuseType; + @SyncNBT(events = SyncEvents.TILE_CLIENT_MESSAGE) + public int fuseConfig; public GuiAmmunitionAssembler(EntityPlayer player, TileEntityAmmunitionAssembler tile) { @@ -44,51 +53,98 @@ public GuiAmmunitionAssembler(EntityPlayer player, TileEntityAmmunitionAssembler public void onInit() { startBackground() - .withBox(DecoTextures.BG_STEEL_ROUGH, 0, 0, 176, 76) + .withBox(DecoTextures.BG_STEEL_ROUGH, 0, 0, 176, 76+24) .withTitleBar(tile) - .withInventorySlots(SlotStyle.IE_INPUT, container.inputSlot) + .withInventorySlots(SlotStyle.IE_INPUT, container.coreSlot, container.casingSlot) .withInventorySlots(SlotStyle.IE_OUTPUT, container.outputSlot) - .withBox(DecoTextures.BG_WOODEN, DecoTextures.TEMPLATE_ROUND_WOODEN, 0, 76, 176, 92) + .withBox(DecoTextures.BG_WOODEN, DecoTextures.TEMPLATE_ROUND_WOODEN, 0, 76+24, 176, 92) .withInventoryTitleBar() - .withBox(DecoTextures.BG_BLUEPRINT, 100, 0, 76, 70) .withInventorySlots(SlotStyle.VANILLA, container.playerInventory) .build(); + //Set synced variables + this.fuseType = tile.fuseType; + this.fuseConfig = tile.fuseConfig; + + DecoPanel configPanel; addComponents( + //Energy bar new DecoBar(150+11, 0) .withTemplate(DecoTemplates.BAR_ELECTRIC_ENERGY.apply(tile.energyStorage)), - new DecoButton(100, 10) - .withIcon(ICON_PROXIMITY) - .withTranslatedTooltip("PROXIMITY"), - - new DecoButton(120, 10) - .withIcon(ICON_CONTACT) - .withTranslatedTooltip("CONTACT"), + //Progress + new DecoImage(8+64+8+2+1-48-2-4+24-1, 28+4+4+4+1-16) + .withSize(64, 32) + .withImageLocation(TEXTURE, true) + .withUV(64, 0, 0, 64, 32), + new DecoImage(8+64+8+2+1-48-2-4+1+24-1, 28+4+4+4+1-16+1) + .withSize(64, 30) + .withImageLocation(TEXTURE, true) + .withUV(64, 0, 34, 64, 34+30) + .withAnimation(ImageAnimationDirection.LEFT_TO_RIGHT, DecoGuiUtils.getMultiblockProductionMultiProgress(tile)), + + new DecoItemStackDisplay(8+64+8+2+1-48-2-4+64+2, 28+4+4+4+1-16+8), + + //Config bar + configPanel = new DecoPanel(0, 76-2) + .withBackground(DecoTextures.BG_PAPER) + .withBackgroundMask(DecoTextures.TEMPLATE_PAPER) + .withSize(176, 24) + ); - new DecoButton(140, 10) - .withIcon(ICON_TIME) - .withTranslatedTooltip("TIMED"), + DecoLabel configLabel = configPanel.addLabel("pole wspaniale", 4+80+2, 2) + .withAlign(DecoAlignment.RIGHT) + .withSize(64-12, 18); - new DecoTextField(96, 40) - .withSize(65, 18) + DecoTextField textField; + configPanel.addComponents( + (textField = new DecoTextField(176-32-4, 2)) + .withSize(32, 18) .withTextColor(IIColor.WHITE) - .withText("Fuze Time") - -/** - - new DecoImage(20, 20) - .withSize(118, 33) - .withImageLocation(TEXTURE_AMMOAS, false) - .withUV(256, 127, 177, 122, 209), - - new DecoImage(20, 20) - .withSize(118, 33) - .withImageLocation(TEXTURE_AMMOAS, false) - .withUV(256, 0, 177, 245, 209) - .withAnimation(ImageAnimationDirection.LEFT_TO_RIGHT, DecoGuiUtils.getMultiblockProductionMultiProgress(tile)) - **/ + .withFilter(TextFilter.DECIMAL) + .withText(this.fuseConfig) + .withOnTextChanged(newValue -> { + //Contact fuse has no config value + if(this.fuseType==FuseType.CONTACT) + textField.withText(newValue = "0"); + this.fuseConfig = Integer.parseInt(newValue); + }), + new DecoDropdown(4, 2) + .withEntries(FuseType.values()) + .withDisplayFunction(new DecoEntryPanelBuilder() + //Type Icon, Label, and Letter + .withComponent("icon", new DecoImage(2, 2) + .withSize(16, 16) + ) + .withLabel("label", + new DecoLabel(fontRenderer, 20, 2) + .withSize(48, 18) + .withAlign(DecoAlignment.LEFT) + .withText("Proximity") + ) + .withElementApplyMethod(this::drawFuseEntry) + ) + .withScrollBarBackground(DecoTextures.COMPONENT_SLIDER_PAPER) + .withBackground(DecoTextures.COMPONENT_BUTTON_PAPER) + .withListBackground(DecoTextures.COMPONENT_TEXT_FIELD) + .withOnSelectedEntry((oldFuse, newFuse) -> { + textField.withDisabled(newFuse==FuseType.CONTACT); + textField.visible = newFuse!=FuseType.CONTACT; + configLabel.visible = newFuse!=FuseType.CONTACT; + this.fuseType = newFuse; + configLabel.withText(I18n.format(IIReference.GUI_LABEL_KEY+"ammunition_assembler.fuse_config."+newFuse.getName())) + .withTranslatedTooltip(IIReference.GUI_LABEL_KEY+"ammunition_assembler.fuse_config."+newFuse.getName()+".tooltip"); + }) + .withSelectedEntry(this.fuseType) + .withSize(80, 20) ); } + private void drawFuseEntry(FuseType fuseType, DecoEntryPanelBuilder builder) + { + builder.label("label").withRawText(fuseType.getLocalizedName()); + builder.component("icon", DecoImage.class) + .withImageLocation(ResLoc.of(IIReference.RES_II, "gui/deco/icons/icon_fuse_"+fuseType.getName()), true); + } + } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/inserter/GuiInserter.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/inserter/GuiInserter.java index 7a42359dc..eb219ba3e 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/inserter/GuiInserter.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/inserter/GuiInserter.java @@ -48,7 +48,7 @@ public class GuiInserter extends DecoTileGui taskJobList; private DecoPanel panelDetails; @SyncNBT(events = SyncEvents.TILE_CLIENT_MESSAGE) - private EasyMultiTypeCollection tasks; + public EasyMultiTypeCollection tasks; @Nullable private InserterTask selected; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/DecoGui.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/DecoGui.java index 3b9054521..93c64aae7 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/DecoGui.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/DecoGui.java @@ -39,6 +39,7 @@ import pl.pabilo8.immersiveintelligence.client.gui.deco.component.button.DecoTab; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.label.DecoLabel; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.widget.DecoComponentWidgetBase; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.widget.DecoManualWidget; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.*; import pl.pabilo8.immersiveintelligence.client.render.IReloadableModelContainer; import pl.pabilo8.immersiveintelligence.client.util.amt.AMTUtils; @@ -513,6 +514,19 @@ private void drawWidgets(int mouseX, int mouseY, float partialTicks) } } + protected void openManualWidget(String pageName, int index) + { + widgetList.stream() + .filter(widget -> widget instanceof DecoManualWidget) + .map(widget -> (DecoManualWidget)widget) + .findFirst().ifPresent(widget -> { + if(currentWidget!=widget) + setCurrentWidget(widget); + widget.setCurrentPage(pageName, index); + requestFocus(widget); + }); + } + /** * Renders the tooltip for a hovered-over component or itemstack. * diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/storage/DecoItemStackDisplay.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/storage/DecoItemStackDisplay.java index 6237e7f2b..907817ca5 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/storage/DecoItemStackDisplay.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/storage/DecoItemStackDisplay.java @@ -11,6 +11,7 @@ import pl.pabilo8.immersiveintelligence.client.IIClientUtils; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.DecoComponent; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoAlignment; +import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoColors; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoSprite; import pl.pabilo8.immersiveintelligence.client.util.IIDrawUtils; import pl.pabilo8.immersiveintelligence.client.util.amt.AMTUtils; @@ -23,6 +24,7 @@ import java.util.Collections; import java.util.List; import java.util.function.Function; +import java.util.function.Supplier; /** * Displays an item stack inside a Deco GUI. @@ -43,7 +45,8 @@ public class DecoItemStackDisplay extends DecoComponent private DecoSprite backgroundSprite; private Function progressBarValue; - private IIColor barGradientColor1 = IIColor.fromPackedRGB(0xb51500), barGradientColor2 = IIColor.fromPackedRGB(0x600b00); + private Supplier barGradientColorSupplier = + () -> new IIColor[]{DecoColors.GRADIENT1, DecoColors.GRADIENT2}; private DecoAlignment iconAlignment = DecoAlignment.CENTER; private int iconSize = 16; private int cachedIconX, cachedIconY; @@ -74,10 +77,15 @@ public DecoItemStackDisplay withStack(IngredientStack stack) } public DecoItemStackDisplay withProgressBar(Function progressBarValue, IIColor barGradientColor1, IIColor barGradientColor2) + { + final IIColor[] array = new IIColor[]{barGradientColor1, barGradientColor2}; + return withProgressBar(progressBarValue, () -> array); + } + + public DecoItemStackDisplay withProgressBar(Function progressBarValue, Supplier barGradientColorSupplier) { this.progressBarValue = progressBarValue; - this.barGradientColor1 = barGradientColor1; - this.barGradientColor2 = barGradientColor2; + this.barGradientColorSupplier = barGradientColorSupplier; return this; } @@ -174,14 +182,17 @@ protected void draw(int mouseX, int mouseY, float partialTicks) } if(progressBarValue!=null) { + GlStateManager.disableTexture2D(); float progress = MathHelper.clamp(progressBarValue.apply(partialTicks), 0, 1); + IIColor[] colors = barGradientColorSupplier.get(); IIDrawUtils.startColored() .drawColorGradient( x+width+padding[0]-padding[2]+2, y-padding[1]+padding[3]+height-((height+padding[1]+padding[3]-4)*progress), 2, ((height+padding[1]+padding[3]-4)*progress), - barGradientColor1, barGradientColor2 + colors[0], colors.length > 1?colors[1]: colors[0] ) .finish(); + GlStateManager.enableTexture2D(); } GlStateManager.translate(cachedIconX, cachedIconY, 0); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/storage/DecoItemStackListDisplay.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/storage/DecoItemStackListDisplay.java deleted file mode 100644 index d2690c9a6..000000000 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/storage/DecoItemStackListDisplay.java +++ /dev/null @@ -1,259 +0,0 @@ -package pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage; - -import blusunrize.immersiveengineering.client.ClientUtils; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.RenderHelper; -import net.minecraft.client.util.ITooltipFlag.TooltipFlags; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.text.TextFormatting; -import pl.pabilo8.immersiveintelligence.client.IIClientUtils; -import pl.pabilo8.immersiveintelligence.client.gui.deco.component.DecoComponent; -import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoAlignment; -import pl.pabilo8.immersiveintelligence.client.util.IIDrawUtils; -import pl.pabilo8.immersiveintelligence.common.util.IIColor; - -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; -import java.util.Collections; -import java.util.List; -import java.util.function.Supplier; - -/** - * Displays a whole list of item stacks inside a Deco GUI as a grid. - * - * @author Pabilo8 (pabilo@iiteam.net) - * @ii-approved 0.3.1 - * @since 08.01.2026 - */ -@ParametersAreNonnullByDefault -public class DecoItemStackListDisplay extends DecoComponent -{ - private Supplier> stacksSupplier = Collections::emptyList; - - protected int[] padding = new int[]{2, 2, 2, 2}; - private ResourceLocation backgroundTexture; - - private DecoAlignment contentAlignment = DecoAlignment.CENTER; - - private int slotSize = 16; - private int forcedSlotsPerRow = -1; - - private int cachedContentX, cachedContentY; - private int cachedSlotsPerRow = 1; - private int cachedRows = 1; - private int cachedContentW = 0, cachedContentH = 0; - private int lastMouseX, lastMouseY; - - private TooltipFlags tooltipFlag; - - public DecoItemStackListDisplay(int x, int y) - { - super(x, y); - withForcedAdvancedTooltip(false); - withOnTooltip(this::onDisplayTooltip); - } - - public DecoItemStackListDisplay withStacks(List stacks) - { - this.stacksSupplier = () -> stacks; - this.initialized = false; - return this; - } - - public DecoItemStackListDisplay withStacks(Supplier> stacksSupplier) - { - this.stacksSupplier = stacksSupplier; - this.initialized = false; - return this; - } - - public DecoItemStackListDisplay withBackgroundTexture(@Nullable ResourceLocation backgroundTexture) - { - this.backgroundTexture = backgroundTexture; - return this; - } - - public DecoItemStackListDisplay withPadding(int[] padding) - { - this.padding = padding; - this.initialized = false; - return this; - } - - public DecoItemStackListDisplay withContentAlignment(DecoAlignment alignment) - { - this.contentAlignment = alignment; - this.initialized = false; - return this; - } - - public DecoItemStackListDisplay withSlotSize(int slotSize) - { - this.slotSize = MathHelper.clamp(slotSize, 8, 32); - this.initialized = false; - return this; - } - - /** - * Set to -1 to auto-compute. - */ - public DecoItemStackListDisplay withForcedSlotsPerRow(int forcedSlotsPerRow) - { - this.forcedSlotsPerRow = forcedSlotsPerRow; - this.initialized = false; - return this; - } - - public DecoItemStackListDisplay withForcedAdvancedTooltip(boolean forcedAdvancedTooltip) - { - this.tooltipFlag = forcedAdvancedTooltip||ClientUtils.mc().gameSettings.advancedItemTooltips? - TooltipFlags.ADVANCED: TooltipFlags.NORMAL; - this.initialized = false; - return this; - } - - @Override - protected boolean initialize() - { - int xPad = padding[0]+padding[2]; - int yPad = padding[1]+padding[3]; - - int contentBoxW = Math.max(0, width-xPad); - int contentBoxH = Math.max(0, height-yPad); - - int computed = contentBoxW/slotSize; - if(forcedSlotsPerRow > 0) - cachedSlotsPerRow = forcedSlotsPerRow; - else - cachedSlotsPerRow = Math.max(1, computed); - - // Derive rows from current stack count (0 -> 1 row, renders nothing but alignment stays stable) - int count = Math.max(0, getStacks().size()); - cachedRows = Math.max(1, (int)Math.ceil(count/(double)cachedSlotsPerRow)); - - // Actual grid size (may exceed box vertically; caller can size component accordingly) - cachedContentW = cachedSlotsPerRow*slotSize; - cachedContentH = cachedRows*slotSize; - - cachedContentX = contentAlignment.getAlignX(x+padding[0], width, cachedContentW); - cachedContentY = contentAlignment.getAlignY(y+padding[1], height, cachedContentH); - - return true; - } - - private List getStacks() - { - List s = stacksSupplier.get(); - return s==null?Collections.emptyList(): s; - } - - private int getHoveredIndex(int mouseX, int mouseY) - { - if(mouseX < cachedContentX||mouseY < cachedContentY) - return -1; - - int localX = mouseX-cachedContentX; - int localY = mouseY-cachedContentY; - - int col = localX/slotSize; - int row = localY/slotSize; - - if(col < 0||row < 0||col >= cachedSlotsPerRow||row >= cachedRows) - return -1; - - int idx = row*cachedSlotsPerRow+col; - return idx; - } - - private ItemStack getStackAt(int index) - { - List stacks = getStacks(); - if(index < 0||index >= stacks.size()) - return ItemStack.EMPTY; - return stacks.get(index); - } - - private List onDisplayTooltip(DecoItemStackListDisplay gui) - { - int hovered = getHoveredIndex(gui.lastMouseX, gui.lastMouseY); - ItemStack stack = getStackAt(hovered); - if(stack.isEmpty()) - return Collections.emptyList(); - - List tooltip = stack.getTooltip(ClientUtils.mc().player, tooltipFlag); - for(int i = 1; i < tooltip.size(); i++) - tooltip.set(i, TextFormatting.GRAY+tooltip.get(i)); - return tooltip; - } - - @Override - protected void draw(int mouseX, int mouseY, float partialTicks) - { - GlStateManager.pushMatrix(); - - this.lastMouseX = mouseX; - this.lastMouseY = mouseY; - if(backgroundTexture!=null) - { - bindAtlas(); - IIDrawUtils.startTexturedColored() - .drawConnectedTexColorRect(x-padding[0], y-padding[1], width, height, IIColor.WHITE, backgroundTexture, 32, 32, 8, 8) - .finish(); - } - - List stacks = getStacks(); - if(!stacks.isEmpty()) - { - GlStateManager.enableDepth(); - GlStateManager.enableRescaleNormal(); - GlStateManager.color(1.0F, 1.0F, 1.0F); - RenderHelper.enableGUIStandardItemLighting(); - - for(int i = 0; i < stacks.size(); i++) - { - int col = i%cachedSlotsPerRow; - int row = i/cachedSlotsPerRow; - - int px = cachedContentX+col*slotSize; - int py = cachedContentY+row*slotSize; - - GlStateManager.pushMatrix(); - GlStateManager.translate(px, py, 0); - - // Render in a "slotSize x slotSize" square by scaling vanilla 16x16 item render - float scale = 16f/(float)slotSize; - GlStateManager.scale(1f/scale, 1f/scale, 1f); - - ItemStack stack = stacks.get(i); - ClientUtils.mc().getRenderItem().renderItemAndEffectIntoGUI(stack, 0, 0); - ClientUtils.mc().getRenderItem().renderItemOverlayIntoGUI(IIClientUtils.fontRegular, stack, 0, 0, null); - - GlStateManager.popMatrix(); - } - - RenderHelper.disableStandardItemLighting(); - GlStateManager.disableRescaleNormal(); - GlStateManager.disableDepth(); - } - - GlStateManager.popMatrix(); - } - - @Override - public void cleanup() - { - - } - - @Nullable - @Override - public Object getProvidedIngredient() - { - int hovered = getHoveredIndex(this.lastMouseX, this.lastMouseY); - ItemStack stack = getStackAt(hovered); - return stack.isEmpty()?null: stack; - } -} - diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/widget/DecoManualWidget.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/widget/DecoManualWidget.java index 5201967a6..94fbcbab4 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/widget/DecoManualWidget.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/widget/DecoManualWidget.java @@ -150,4 +150,15 @@ public DecoTab provideTab() .withTranslatedTooltip(IIReference.GUI_TOOLTIP_KEY+"widget.manual.show"); } + public void setCurrentPage(String page) + { + setCurrentPage(page, 0); + } + + public void setCurrentPage(String page, int index) + { + wrapper.setSelectedEntry(page); + wrapper.page = index; + } + } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/util/DecoColors.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/util/DecoColors.java index a1e5480b3..ba7541ebb 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/util/DecoColors.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/util/DecoColors.java @@ -38,4 +38,7 @@ public class DecoColors public static final IIColor REACTIVE_ARMOR_INTEGRITY_2 = IIColor.fromPackedRGB(0x30383b); public static final IIColor STRUCTURAL_INTEGRITY_1 = IIColor.fromPackedRGB(0x79675a); public static final IIColor STRUCTURAL_INTEGRITY_2 = IIColor.fromPackedRGB(0x4a3035); + + public static final IIColor GRADIENT1 = IIColor.fromPackedRGB(0xb51500); + public static final IIColor GRADIENT2 = IIColor.fromPackedRGB(0x600b00); } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/util/DecoTextures.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/util/DecoTextures.java index ce1429394..b8bb74bff 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/util/DecoTextures.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/util/DecoTextures.java @@ -129,8 +129,11 @@ public class DecoTextures public static final ResLoc ICON_ENERGY_OUTPUT = ResLoc.of(RES_TEXTURES_DECO_ICON, "icon_energy_output"); public static final ResLoc ICON_ENERGY_INPUT = ResLoc.of(RES_TEXTURES_DECO_ICON, "icon_energy_input"); public static final ResLoc ICON_ENERGY = ResLoc.of(RES_TEXTURES_DECO_ICON, "icon_energy"); - public static final ResLoc ICON_CONTACT = ResLoc.of(RES_TEXTURES_DECO_ICON, "icon_contact"); - public static final ResLoc ICON_PROXIMITY = ResLoc.of(RES_TEXTURES_DECO_ICON, "icon_proximity"); + + //--- Ammo Icons ---// + public static final ResLoc ICON_CONTACT = ResLoc.of(RES_TEXTURES_DECO_ICON, "icon_fuse_contact"); + public static final ResLoc ICON_TIMED = ResLoc.of(RES_TEXTURES_DECO_ICON, "icon_fuse_timed"); + public static final ResLoc ICON_PROXIMITY = ResLoc.of(RES_TEXTURES_DECO_ICON, "icon_fuse_proximity"); //--- Deco Bar Icons ---// public static final ResLoc ICON_ACTION_DUPLICATE = ResLoc.of(RES_TEXTURES_DECO_ICON, "action_duplicate"); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/IIUtils.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/IIUtils.java index b77d7d207..e13861f59 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/IIUtils.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/IIUtils.java @@ -470,7 +470,13 @@ public static T getAnnotation(Class annotationClass, O @Nonnull public static & ISerializableEnum> T enumValue(Class en, String name) { - return Enum.valueOf(en, name.toUpperCase()); + try + { + return Enum.valueOf(en, name.toUpperCase()); + } catch(IllegalArgumentException ignored) + { + return en.getEnumConstants()[0]; + } } /** diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/ammo/components/factory/AmmoComponentFluid.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/ammo/components/factory/AmmoComponentFluid.java index a2219e516..39e9fdc28 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/ammo/components/factory/AmmoComponentFluid.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/ammo/components/factory/AmmoComponentFluid.java @@ -28,7 +28,8 @@ */ public class AmmoComponentFluid extends AmmoComponent { - Fluid fluid; + private final Fluid fluid; + private IIColor overrideColor = null; public AmmoComponentFluid(Fluid fluid) { @@ -59,6 +60,24 @@ public boolean showInManual() return false; } + @Override + public IIColor getColor() + { + if(this.overrideColor!=null) + return this.overrideColor; + return super.getColor(); + } + + public Fluid getFluid() + { + return fluid; + } + + public void setOverrideColor(IIColor overrideColor) + { + this.overrideColor = overrideColor; + } + @Override public void onEffect(World world, Vec3d pos, Vec3d dir, ComponentEffectShape shape, NBTTagCompound tag, float size, float multiplier, Entity owner) { diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/multiblock/MultiblockAmmunitionAssembler.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/multiblock/MultiblockAmmunitionAssembler.java index 91f0204fd..25f82b324 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/multiblock/MultiblockAmmunitionAssembler.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/multiblock/MultiblockAmmunitionAssembler.java @@ -11,6 +11,10 @@ public class MultiblockAmmunitionAssembler extends MultiblockStuctureBase { + public static final int SLOT_CORE = 0; + public static final int SLOT_CASING = 1; + public static final int SLOT_OUTPUT = 2; + public static final String NBT_KEY_EFFECT = "effect"; public static MultiblockAmmunitionAssembler INSTANCE; public MultiblockAmmunitionAssembler() diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/multiblock/MultiblockProjectileWorkshop.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/multiblock/MultiblockProjectileWorkshop.java index c1f462a01..65755f5c1 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/multiblock/MultiblockProjectileWorkshop.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/multiblock/MultiblockProjectileWorkshop.java @@ -13,6 +13,9 @@ public class MultiblockProjectileWorkshop extends MultiblockStuctureBase { + public static final int SLOT_INPUT = 0; + public static final int SLOT_COMPONENT_INPUT = 1; + public static final int SLOT_OUTPUT = 2; public static MultiblockProjectileWorkshop INSTANCE; public MultiblockProjectileWorkshop() diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/TileEntityAmmunitionAssembler.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/TileEntityAmmunitionAssembler.java index 7ec0db4cd..a512c59c6 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/TileEntityAmmunitionAssembler.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/TileEntityAmmunitionAssembler.java @@ -19,6 +19,7 @@ import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Machines.AmmunitionAssembler; import pl.pabilo8.immersiveintelligence.common.IIGUI; import pl.pabilo8.immersiveintelligence.common.IISounds; +import pl.pabilo8.immersiveintelligence.common.IIUtils; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.multiblock.MultiblockAmmunitionAssembler; import pl.pabilo8.immersiveintelligence.common.network.IIPacketHandler; import pl.pabilo8.immersiveintelligence.common.network.messages.MessageBooleanAnimatedPartsSync; @@ -38,28 +39,34 @@ */ public class TileEntityAmmunitionAssembler extends TileEntityMultiblockProductionMulti implements IBooleanAnimatedPartsBlock { - public static final int SLOT_CORE = 0, SLOT_CASING = 1, SLOT_OUTPUT = 2; - public static final String NBT_KEY_EFFECT = "effect"; - @SyncNBT(events = {SyncEvents.TILE_GUI_OPENED, SyncEvents.TILE_CLIENT_MESSAGE}) - public FuseType fuse = FuseType.CONTACT; + public FuseType fuseType = FuseType.CONTACT; + //depends on fuse type: time for timed fuse, distance for proximity fuse @SyncNBT(events = {SyncEvents.TILE_GUI_OPENED, SyncEvents.TILE_CLIENT_MESSAGE}) - public int fuseConfig = 0; //depends on fuse type: time for timed fuse, distance for proximity fuse + public int fuseConfig = 0; @SyncNBT public MultiblockInteractablePart hatch; //inventory: core, casing - IItemHandler coreInputHandler = getSingleInventoryHandler(SLOT_CORE, true, false); - IItemHandler casingInputHandler = getSingleInventoryHandler(SLOT_CASING, true, false); + private IItemHandler coreInputHandler = getSingleInventoryHandler(MultiblockAmmunitionAssembler.SLOT_CORE, true, false); + private IItemHandler casingInputHandler = getSingleInventoryHandler(MultiblockAmmunitionAssembler.SLOT_CASING, true, false); public TileEntityAmmunitionAssembler() { super(MultiblockAmmunitionAssembler.INSTANCE); energyStorage = new FluxStorageAdvanced(AmmunitionAssembler.energyCapacity); - inventory = NonNullList.withSize(4, ItemStack.EMPTY); + inventory = NonNullList.withSize(3, ItemStack.EMPTY); hatch = new MultiblockInteractablePart(10); } + @Override + protected void dummyCleanup() + { + super.dummyCleanup(); + this.coreInputHandler = this.casingInputHandler = null; + this.hatch = null; + } + @Override protected void onUpdate() { @@ -99,9 +106,9 @@ public boolean isStackValid(int i, ItemStack stack) { switch(i) { - case SLOT_CORE: + case MultiblockAmmunitionAssembler.SLOT_CORE: return stack.getItem() instanceof IAmmoTypeItem&&((IAmmoTypeItem)stack.getItem()).isBulletCore(stack); - case SLOT_CASING: + case MultiblockAmmunitionAssembler.SLOT_CASING: return AmmunitionAssemblerRecipe.streamRecipes(AmmunitionAssemblerRecipe.class) .anyMatch(a -> a.casingInput.matchesItemStackIgnoringSize(stack)); default: @@ -132,17 +139,17 @@ public int getMaxProductionQueue() @Override protected IIMultiblockProcess findNewProductionProcess() { - if(!inventory.get(SLOT_CORE).isEmpty()&&!inventory.get(SLOT_CASING).isEmpty()) + if(!inventory.get(MultiblockAmmunitionAssembler.SLOT_CORE).isEmpty()&&!inventory.get(MultiblockAmmunitionAssembler.SLOT_CASING).isEmpty()) for(AmmunitionAssemblerRecipe recipe : AmmunitionAssemblerRecipe.getRecipes(AmmunitionAssemblerRecipe.class)) - if(!recipe.advanced&&recipe.casingInput.matchesItemStack(inventory.get(SLOT_CASING))&&recipe.coreInput.matches(inventory.get(SLOT_CORE))) + if(!recipe.advanced&&recipe.casingInput.matchesItemStack(inventory.get(MultiblockAmmunitionAssembler.SLOT_CASING))&&recipe.coreInput.matches(inventory.get(MultiblockAmmunitionAssembler.SLOT_CORE))) { IIMultiblockProcess process = new IIMultiblockProcess<>(recipe) - .withNBT(nbt -> nbt.withItemStack(NBT_KEY_EFFECT, recipe.process.apply(inventory.get(SLOT_CORE), inventory.get(SLOT_CASING))) - .withItemStack("core", inventory.get(SLOT_CORE)) + .withNBT(nbt -> nbt.withItemStack(MultiblockAmmunitionAssembler.NBT_KEY_EFFECT, recipe.process.apply(inventory.get(MultiblockAmmunitionAssembler.SLOT_CORE), inventory.get(MultiblockAmmunitionAssembler.SLOT_CASING))) + .withItemStack("core", inventory.get(MultiblockAmmunitionAssembler.SLOT_CORE)) .withString("ammo", recipe.ammoItem.getName()) ); - inventory.get(SLOT_CORE).shrink(1); - inventory.get(SLOT_CASING).shrink(1); + inventory.get(MultiblockAmmunitionAssembler.SLOT_CORE).shrink(1); + inventory.get(MultiblockAmmunitionAssembler.SLOT_CASING).shrink(1); return process; } return null; @@ -173,7 +180,7 @@ protected boolean attemptProductionOutput(IIMultiblockProcess process) { - outputOrDrop(process.processData.getItemStack(NBT_KEY_EFFECT), null, facing.getOpposite(), 34); + outputOrDrop(process.processData.getItemStack(MultiblockAmmunitionAssembler.NBT_KEY_EFFECT), null, facing.getOpposite(), 34); } //--- Data Handling ---// @@ -182,14 +189,14 @@ protected void onProductionFinish(IIMultiblockProcess public void receiveData(DataPacket packet, int pos) { if(packet.has('f')) - fuse = FuseType.v(packet.get('f').toString()); + fuseType = IIUtils.enumValue(FuseType.class, packet.get('f').toString()); } public ItemStack getProductionResult(int processID) { if(processQueue.size() <= processID) return ItemStack.EMPTY; - return this.processQueue.get(processID).processData.getItemStack(NBT_KEY_EFFECT); + return this.processQueue.get(processID).processData.getItemStack(MultiblockAmmunitionAssembler.NBT_KEY_EFFECT); } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/TileEntityHeavyAmmunitionAssembler.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/TileEntityHeavyAmmunitionAssembler.java index 30b45cbfa..bc4cde48b 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/TileEntityHeavyAmmunitionAssembler.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/TileEntityHeavyAmmunitionAssembler.java @@ -16,6 +16,7 @@ import pl.pabilo8.immersiveintelligence.api.data.DataPacket; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Machines.AmmunitionAssembler; import pl.pabilo8.immersiveintelligence.common.IIGUI; +import pl.pabilo8.immersiveintelligence.common.IIUtils; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.multiblock.MultiblockHeavyAmmunitionAssembler; import pl.pabilo8.immersiveintelligence.common.entity.tactile.TactileManager; import pl.pabilo8.immersiveintelligence.common.entity.tactile.TactileManager.ITactileListener; @@ -189,7 +190,7 @@ protected void onProductionFinish(IIMultiblockProcess public void receiveData(DataPacket packet, int pos) { if(packet.has('f')) - fuse = FuseType.v(packet.get('f').toString()); + fuse = IIUtils.enumValue(FuseType.class, packet.get('f').toString()); } public ItemStack getProductionResult() diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/TileEntityProjectileWorkshop.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/TileEntityProjectileWorkshop.java index 5e455a551..be4c132c2 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/TileEntityProjectileWorkshop.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/TileEntityProjectileWorkshop.java @@ -6,14 +6,20 @@ import net.minecraft.entity.item.EntityItem; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumFacing; import net.minecraft.util.NonNullList; import net.minecraft.util.SoundCategory; import net.minecraft.world.World; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTank; +import net.minecraftforge.fluids.IFluidTank; +import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import pl.pabilo8.immersiveintelligence.api.ammo.AmmoRegistry; import pl.pabilo8.immersiveintelligence.api.ammo.enums.CoreType; import pl.pabilo8.immersiveintelligence.api.ammo.parts.AmmoComponent; +import pl.pabilo8.immersiveintelligence.api.ammo.parts.AmmoCore; import pl.pabilo8.immersiveintelligence.api.ammo.parts.IAmmoTypeItem; import pl.pabilo8.immersiveintelligence.api.crafting.BulletComponentStack; import pl.pabilo8.immersiveintelligence.api.crafting.ProjectileWorkshopRecipe; @@ -38,6 +44,7 @@ import pl.pabilo8.immersiveintelligence.common.util.multiblock.util.MultiblockPOI; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.Arrays; import java.util.Optional; @@ -50,34 +57,39 @@ public class TileEntityProjectileWorkshop extends TileEntityMultiblockProductionSingle implements IManagedUpgradableDevice, IBooleanAnimatedPartsBlock { - public static final int SLOT_INPUT = 0, SLOT_COMPONENT_INPUT = 1, SLOT_OUTPUT = 2; - - //for core production @Nonnull public IAmmoTypeItem producedAmmo = IIContent.itemAmmoHeavyArtillery; - @Nonnull @SyncNBT(events = {SyncEvents.TILE_GUI_OPENED, SyncEvents.TILE_CLIENT_MESSAGE}) public CoreType coreType = producedAmmo.getAllowedCoreTypes()[0]; - - //how many slots to fill @SyncNBT - public int fillAmount = 1; + public int componentFillAmount = 1; @SyncNBT public BulletComponentStack componentInside = new BulletComponentStack(); + private static final int COMPONENT_AMOUNT_PER_ITEM = 16; + /** * Stores fluids to be converted to ammo components */ @SyncNBT - public FluidTank tanksFiller = new FluidTank(ProjectileWorkshop.componentTankCapacity); + public FluidTank tanksFiller = new FluidTank(ProjectileWorkshop.componentTankCapacity) + { + @Override + public boolean canFillFluidType(FluidStack fluid) + { + return fluid!=null + &&getComponentForFluid(fluid).isPresent() + &&(componentInside.isEmpty()||componentInside.matches(fluid)); + } + }; @SyncNBT public MultiblockInteractablePart lid1, lid2; @SyncNBT(name = "upgrades", events = SyncEvents.TILE_UPGRADES_MODIFIED) public UpgradeManager upgrades; - IItemHandler inputHandler = new IEInventoryHandler(1, this, 0, true, false); - IItemHandler componentInputHandler = new IEInventoryHandler(1, this, 1, true, false); + private IItemHandler inputHandler = new IEInventoryHandler(1, this, 0, true, false); + private IItemHandler componentInputHandler = new IEInventoryHandler(1, this, 1, true, false); public TileEntityProjectileWorkshop() { @@ -98,6 +110,7 @@ protected void dummyCleanup() tanksFiller = null; upgrades = null; componentInside = null; + inputHandler = componentInputHandler = null; } @Override @@ -108,26 +121,11 @@ protected void onUpdate() lid2.update(); upgrades.update(); - //fill component tank + //Fill the internal ammunition component store from both item and fluid input. if(isUpgradeInstalled(IIContent.UPGRADE_CORE_FILLER)&&!world.isRemote) { - if(!componentInputHandler.getStackInSlot(0).isEmpty()) - { - ItemStack stack = componentInputHandler.getStackInSlot(0); - if(componentInside.isEmpty()) - { - Optional matching = AmmoRegistry.getAllComponents().stream().filter(comp -> comp.getMaterial().matchesItemStackIgnoringSize(stack)).findFirst(); - matching.ifPresent(component -> componentInside = new BulletComponentStack(component, componentInputHandler.extractItem(0, 1, false).getTagCompound())); - } - else - { - if(componentInside.matches(stack)&&componentInside.amount+16 <= ProjectileWorkshop.componentCapacity) - { - componentInside.amount += 16; - componentInputHandler.extractItem(0, 1, false); - } - } - } + pullComponentItem(); + pullComponentFluid(); } //Stop working when the machine is disabled @@ -170,6 +168,10 @@ public void receiveMessageFromServer(@Nonnull NBTTagCompound message) IAmmoTypeItem bb = AmmoRegistry.getAmmoItem(message.getString("produced_bullet")); producedAmmo = bb==null?IIContent.itemAmmoHeavyArtillery: bb; } + if(message.hasKey("core_type")) + coreType = CoreType.v(message.getString("core_type")); + if(message.hasKey("component_fill_amount")) + componentFillAmount = Math.max(1, message.getInteger("component_fill_amount")); } @Override @@ -181,6 +183,10 @@ public void receiveMessageFromClient(NBTTagCompound message) IAmmoTypeItem bb = AmmoRegistry.getAmmoItem(message.getString("produced_bullet")); producedAmmo = bb==null?IIContent.itemAmmoHeavyArtillery: bb; } + if(message.hasKey("core_type")) + coreType = CoreType.v(message.getString("core_type")); + if(message.hasKey("component_fill_amount")) + componentFillAmount = Math.max(1, message.getInteger("component_fill_amount")); } @Override @@ -205,9 +211,9 @@ protected int[] listAllPOI(MultiblockPOI poi) @Override public boolean isStackValid(int slot, ItemStack stack) { - if(slot==SLOT_COMPONENT_INPUT&&isUpgradeInstalled(IIContent.UPGRADE_CORE_FILLER)) + if(slot==MultiblockProjectileWorkshop.SLOT_COMPONENT_INPUT&&isUpgradeInstalled(IIContent.UPGRADE_CORE_FILLER)) return AmmoRegistry.getAllComponents().stream().anyMatch(comp -> comp.getMaterial().matchesItemStackIgnoringSize(stack)); - else if(slot==SLOT_INPUT) + else if(slot==MultiblockProjectileWorkshop.SLOT_INPUT) { if(isUpgradeInstalled(IIContent.UPGRADE_CORE_FILLER)) return stack.getItem() instanceof IAmmoTypeItem&&((IAmmoTypeItem)stack.getItem()).isBulletCore(stack); @@ -220,61 +226,180 @@ else if(slot==SLOT_INPUT) @Override public int getSlotLimit(int i) { - return i==1?1: 64; + return i==MultiblockProjectileWorkshop.SLOT_COMPONENT_INPUT?1: 64; } - @Override - protected IIMultiblockProcess findNewProductionProcess() + + private int getFluidPerComponentAmount() { - //filling - /*if(hasUpgrade(IIContent.UPGRADE_CORE_FILLER)) - { - //check for valid component and ammo core - if(componentInside.isEmpty()||inventory.get(SLOT_INPUT).isEmpty()) - return null; - - ItemStack stack = inventory.get(SLOT_INPUT); - IAmmoTypeItem ammo = (IAmmoTypeItem)stack.getItem(); - int componentSlotsTaken = componentInside.component.getSlotsTaken()*fillAmount; - int remainingSlots = ammo.getCoreType(stack).getComponentSlots()- - Arrays.stream(ammo.getComponents(stack)) - .map(AmmoComponent::getSlotsTaken) - .reduce(0, Integer::sum); - - //check if there is enough space in the ammo - if(!componentInside.component.matchesBullet(ammo)||remainingSlots-componentSlotsTaken < 0) - return null; - - IIMultiblockProcess out = new IIMultiblockProcess<>(new ProjectileWorkshopRecipe(stack, componentInside)); - stack.shrink(1); - componentInside.subtract(ammo.getCoreMaterialNeeded()); - return out; + return Math.max(1, ProjectileWorkshop.componentTankCapacity/ProjectileWorkshop.componentCapacity); + } + + private Optional getComponentForFluid(FluidStack fluid) + { + if(fluid==null) + return Optional.empty(); + + return AmmoRegistry.getAllComponents().stream() + .filter(component -> component.getMaterial().fluid!=null) + .filter(component -> fluid.isFluidEqual(component.getMaterial().fluid)) + .findFirst(); + } + + private void pullComponentItem() + { + ItemStack stack = componentInputHandler.getStackInSlot(0); + if(stack.isEmpty()) + return; + + Optional matching = AmmoRegistry.getAllComponents().stream() + .filter(comp -> comp.getMaterial().matchesItemStackIgnoringSize(stack)) + .findFirst(); + if(!matching.isPresent()) + return; + + AmmoComponent component = matching.get(); + if(componentInside.isEmpty()) + { + if(COMPONENT_AMOUNT_PER_ITEM <= ProjectileWorkshop.componentCapacity) + { + ItemStack extracted = componentInputHandler.extractItem(0, 1, false); + componentInside = new BulletComponentStack(component, COMPONENT_AMOUNT_PER_ITEM, extracted.getTagCompound()); + } } - else //production + else if(componentInside.matches(stack) + &&componentInside.amount+COMPONENT_AMOUNT_PER_ITEM <= ProjectileWorkshop.componentCapacity) { - ItemStack stack = inventory.get(SLOT_INPUT); - if(stack.isEmpty()) - return null; + componentInside.amount += COMPONENT_AMOUNT_PER_ITEM; + componentInputHandler.extractItem(0, 1, false); + } + } + + private void pullComponentFluid() + { + FluidStack fluid = tanksFiller.getFluid(); + if(fluid==null) + return; - Optional first = AmmoRegistry.getAllCores() - .stream() - .filter(core -> core.getMaterial().matchesItemStackIgnoringSize(inventory.get(0))) - .findFirst(); + Optional matching = getComponentForFluid(fluid); + if(!matching.isPresent()) + return; + + if(!componentInside.isEmpty()&&!componentInside.matches(fluid)) + return; - if(!first.isPresent()||stack.getCount() < producedAmmo.getCoreMaterialNeeded()) - return null; + int fluidPerAmount = getFluidPerComponentAmount(); + int freeAmount = ProjectileWorkshop.componentCapacity-componentInside.amount; + int availableAmount = fluid.amount/fluidPerAmount; + int acceptedAmount = Math.min(freeAmount, availableAmount); - IIMultiblockProcess out = new IIMultiblockProcess<>(new ProjectileWorkshopRecipe(producedAmmo, first.get(), coreType)); - stack.shrink(producedAmmo.getCoreMaterialNeeded()); - return out; - }*/ - return null; + if(acceptedAmount <= 0) + return; + + if(componentInside.isEmpty()) + { + NBTTagCompound tag = fluid.tag==null?new NBTTagCompound(): fluid.tag.copy(); + componentInside = new BulletComponentStack(matching.get(), 0, tag); + } + + componentInside.amount += acceptedAmount; + tanksFiller.drain(acceptedAmount*fluidPerAmount, true); + } + + private int getRemainingComponentSlots(IAmmoTypeItem ammo, ItemStack stack) + { + return ammo.getCoreType(stack).getComponentSlots() + -Arrays.stream(ammo.getComponents(stack)) + .mapToInt(AmmoComponent::getSlotsTaken) + .sum(); + } + + private boolean canApplyComponent(ItemStack stack, IAmmoTypeItem ammo, AmmoComponent component, int fillAmount) + { + if(!component.matchesBullet(ammo)) + return false; + + int componentSlotsTaken = component.getSlotsTaken()*fillAmount; + return getRemainingComponentSlots(ammo, stack) >= componentSlotsTaken; + } + + @Override + protected IIMultiblockProcess findNewProductionProcess() + { + if(isUpgradeInstalled(IIContent.UPGRADE_CORE_FILLER)) + return findNewFillingProcess(); + return findNewCoreProductionProcess(); + } + + private IIMultiblockProcess findNewCoreProductionProcess() + { + ItemStack stack = inventory.get(MultiblockProjectileWorkshop.SLOT_INPUT); + if(stack.isEmpty()) + return null; + + Optional first = AmmoRegistry.getAllCores() + .stream() + .filter(core -> core.getMaterial().matchesItemStackIgnoringSize(stack)) + .findFirst(); + + if(!first.isPresent()||stack.getCount() < producedAmmo.getCoreMaterialNeeded()) + return null; + + ProjectileWorkshopRecipe recipe = new ProjectileWorkshopRecipe(producedAmmo, first.get(), coreType); + stack.shrink(producedAmmo.getCoreMaterialNeeded()); + return new IIMultiblockProcess<>(recipe); + } + + private IIMultiblockProcess findNewFillingProcess() + { + ItemStack stack = inventory.get(MultiblockProjectileWorkshop.SLOT_INPUT); + if(stack.isEmpty()||!(stack.getItem() instanceof IAmmoTypeItem)) + return null; + + IAmmoTypeItem ammo = (IAmmoTypeItem)stack.getItem(); + if(!ammo.isBulletCore(stack)) + return null; + + if(componentInside.isEmpty()||componentInside.component==null) + return null; + + int fillAmount = Math.max(1, componentFillAmount); + if(componentInside.amount < fillAmount) + return null; + + ItemStack effect = stack.copy(); + effect.setCount(1); + + AmmoComponent component = componentInside.component; + BulletComponentStack usedComponent = new BulletComponentStack(component, fillAmount, componentInside.tagCompound.copy()); + boolean canFill = canApplyComponent(effect, ammo, component, fillAmount); + + if(canFill) + { + for(int i = 0; i < fillAmount; i++) + ammo.addComponents(effect, component, componentInside.tagCompound.copy()); + componentInside.subtract(fillAmount); + } + + stack.shrink(1); + + IIMultiblockProcess process = new IIMultiblockProcess<>(ProjectileWorkshopRecipe.CORE_FILLING) + .withNBT(nbt -> nbt + .withItemStack("effect", effect) + .withBoolean("filled", canFill) + .withSerializable("component", usedComponent) + ); + process.maxTicks *= ammo.getCaliber(); + return process; } @Override protected IIMultiblockProcess getProcessByName(String name) { + if(ProjectileWorkshopRecipe.FILLING_RECIPE_NAME.equals(name)) + return new IIMultiblockProcess<>(ProjectileWorkshopRecipe.CORE_FILLING); + ProjectileWorkshopRecipe recipe = IIMultiblockRecipe.getRecipe(ProjectileWorkshopRecipe.class, name); return recipe==null?null: new IIMultiblockProcess<>(recipe); } @@ -288,7 +413,11 @@ public float getProductionStep(IIMultiblockProcess pro @Override protected boolean attemptProductionOutput(IIMultiblockProcess process) { - outputOrDrop(process.recipe.getEffect(), null, mirrored?facing.rotateYCCW(): facing.rotateY(), + ItemStack effect = process.recipe.isFilling?process.processData.getItemStack("effect"): process.recipe.getEffect(); + if(effect.isEmpty()) + return true; + + outputOrDrop(effect, null, mirrored?facing.rotateYCCW(): facing.rotateY(), getPOI(MultiblockPOI.ITEM_OUTPUT) ); return true; @@ -323,6 +452,35 @@ public void onAnimationChangeServer(boolean state, int part) } } + //--- Capabilities ---// + @Override + protected IFluidTank[] getFluidTanks(int pos, EnumFacing side) + { + if(isUpgradeInstalled(IIContent.UPGRADE_CORE_FILLER) + &&Arrays.stream(getPOI("component_fluid_in")).anyMatch(i -> i==pos)) + return new FluidTank[]{tanksFiller}; + + return super.getFluidTanks(pos, side); + } + + @Override + @SuppressWarnings("unchecked") + public T getCapability(@Nonnull Capability capability, @Nullable EnumFacing facing) + { + if(capability==CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) + { + TileEntityProjectileWorkshop master = master(); + assert master!=null; + if(isPOI("item_in")) + return (T)master.inputHandler; + else if(isPOI("component_in")) + return (T)master.componentInputHandler; + } + return super.getCapability(capability, facing); + } + + //--- Data Handling ---// + @Override public void receiveData(DataPacket packet, int pos) { @@ -338,10 +496,9 @@ public void receiveData(DataPacket packet, int pos) this.coreType = this.producedAmmo.getAllowedCoreTypes()[0]; if(packet.has('a')) - this.fillAmount = packet.getVarInType(DataTypeInteger.class, packet.get('a')).value; + this.componentFillAmount = packet.getVarInType(DataTypeInteger.class, packet.get('a')).value; } - //TODO: 09.07.2024 conveyor interaction @Override public void onEntityCollision(World world, Entity entity) { diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponHeavyChemthrower.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponHeavyChemthrower.java index 94c31b326..7ae19596a 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponHeavyChemthrower.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/block/multiblock/metal_multiblock1/tileentity/emplacement/weapon/EmplacementWeaponHeavyChemthrower.java @@ -7,6 +7,7 @@ import net.minecraftforge.fluids.capability.IFluidTankProperties; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +import pl.pabilo8.immersiveintelligence.api.data.DataPacket; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoPanel; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoFluidTank; import pl.pabilo8.immersiveintelligence.common.IIConfigHandler.IIConfig.Weapons.EmplacementWeapons.HeavyChemthrower; @@ -149,6 +150,12 @@ private double getStackMass() return 0; } + @Override + public boolean handleDataCommand(DataPacket packet) + { + return super.handleDataCommand(packet); + } + static class SidedFluidHandler implements IFluidHandler { EmplacementWeaponHeavyChemthrower barrel; diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/commands/item/CommandIIGiveBullet.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/commands/item/CommandIIGiveBullet.java index e4dde1f63..69cddfa6b 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/commands/item/CommandIIGiveBullet.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/commands/item/CommandIIGiveBullet.java @@ -17,6 +17,7 @@ import pl.pabilo8.immersiveintelligence.api.ammo.parts.AmmoCore; import pl.pabilo8.immersiveintelligence.api.ammo.parts.IAmmoTypeItem; import pl.pabilo8.immersiveintelligence.api.ammo.utils.AmmoFactory; +import pl.pabilo8.immersiveintelligence.common.IIUtils; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -63,7 +64,7 @@ public void execute(@Nonnull MinecraftServer server, @Nonnull ICommandSender sen IAmmoTypeItem ammoType = AmmoRegistry.getAmmoItem(args[1]); AmmoCore core = AmmoRegistry.getCore(args[2]); CoreType coreType = CoreType.v(args[3]); - FuseType fuse = FuseType.v(args[4]); + FuseType fuse = IIUtils.enumValue(FuseType.class, args[4]); //Load components ArrayList components = new ArrayList<>(); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/crafting/IIRecipes.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/crafting/IIRecipes.java index 26efb226e..34bb68272 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/crafting/IIRecipes.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/crafting/IIRecipes.java @@ -95,9 +95,9 @@ /** * @author Pabilo8 (pabilo@iiteam.net) * @author Avalon (avalon@iiteam.net) + * @updated 29.4.2026 * @since 22.03.2020 * @since 28.11.2024 - * @updated 29.4.2026 */ public class IIRecipes { @@ -492,7 +492,7 @@ public static void addCircuitRecipes() new IngredientStack[]{new IngredientStack("plateSteel"), new IngredientStack("wireTungsten", 2), new IngredientStack("electronTube", 2)}, new String[]{"inserter", "solderer", "drill"}, - new String[]{ "inserter pick first", "inserter drop main", "drill work main", "inserter pick second", "inserter drop main", "solderer work main", "inserter pick third", "inserter drop main", "solderer work main"}, + new String[]{"inserter pick first", "inserter drop main", "drill work main", "inserter pick second", "inserter drop main", "solderer work main", "inserter pick third", "inserter drop main", "solderer work main"}, 24000, 1.25f @@ -609,7 +609,7 @@ public static void addBulletPressRecipes() PressMolds.HOWITZER, 2800); addMetalPressBullet(Casing.MEDIUM_ARTILLERY_6BCAL, new IngredientStack("plateBrass", 3), - PressMolds.HOWITZER, 2500); + PressMolds.MEDIUM_HOWITZER, 2500); addMetalPressBullet(Casing.MORTAR_6BCAL, new IngredientStack("plateAluminum", 3), PressMolds.MORTAR, 2500); @@ -618,7 +618,7 @@ public static void addBulletPressRecipes() PressMolds.LIGHT_HOWITZER, 2200); addMetalPressBullet(Casing.LIGHT_GUN_4BCAL, new IngredientStack("ingotBrass", 2), - PressMolds.AUTOCANNON, 1600); + PressMolds.LIGHT_GUN, 1600); addMetalPressBullet(Casing.AUTOCANNON_3BCAL, new IngredientStack("ingotBrass", 2), diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerAmmunitionAssembler.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerAmmunitionAssembler.java index 5fb13f954..60d3c836f 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerAmmunitionAssembler.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerAmmunitionAssembler.java @@ -2,6 +2,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Slot; +import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.multiblock.MultiblockAmmunitionAssembler; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.TileEntityAmmunitionAssembler; import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; @@ -13,16 +14,17 @@ */ public class ContainerAmmunitionAssembler extends ContainerIITileBase { - public Slot inputSlot, outputSlot; + public Slot casingSlot, coreSlot, outputSlot; public ContainerAmmunitionAssembler(EntityPlayer player, TileEntityAmmunitionAssembler tile) { super(player, tile); - inputSlot = addSlot(8, 20-10, 0); - outputSlot = addSlot(8, 60-10, 1); + coreSlot = addSlot(24+8, 20-10+8, MultiblockAmmunitionAssembler.SLOT_CORE); + casingSlot = addSlot(24+8, 60-10-4, MultiblockAmmunitionAssembler.SLOT_CASING); + outputSlot = addSlot(24+8+64+8+2+1-48-2-4+64+2, 28+4+4+4+1-16+8, MultiblockAmmunitionAssembler.SLOT_OUTPUT); - addPlayerInventory(player.inventory, 8, 87); + addPlayerInventory(player.inventory, 8, 87+24); } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerProjectileWorkshop.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerProjectileWorkshop.java index f3972465e..694adba89 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerProjectileWorkshop.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/gui/ContainerProjectileWorkshop.java @@ -2,8 +2,8 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Slot; -import net.minecraft.item.ItemStack; import pl.pabilo8.immersiveintelligence.common.IIContent; +import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.multiblock.MultiblockProjectileWorkshop; import pl.pabilo8.immersiveintelligence.common.block.multiblock.metal_multiblock1.tileentity.TileEntityProjectileWorkshop; import pl.pabilo8.immersiveintelligence.common.util.gui.ContainerIITileBase; @@ -15,42 +15,23 @@ */ public class ContainerProjectileWorkshop extends ContainerIITileBase { - public Slot inputSlot, outputSlot; + public Slot inputSlot, componentInputSlot; public ContainerProjectileWorkshop(EntityPlayer player, TileEntityProjectileWorkshop tile) { super(player, tile); - if(tile.isUpgradeInstalled(IIContent.UPGRADE_CORE_FILLER)) { - inputSlot = this.addSlotToContainer(new Slot(this.inv, 0, 8, 46) - { - @Override - public boolean isItemValid(ItemStack itemStack) - { - return tile.isStackValid(0, itemStack); - } - }); - outputSlot = this.addSlotToContainer(new Slot(this.inv, 1, 48, 20) - { - @Override - public boolean isItemValid(ItemStack itemStack) - { - return tile.isStackValid(1, itemStack); - } - }); + inputSlot = addSlot(8+2+2, 45-8, MultiblockProjectileWorkshop.SLOT_INPUT); + componentInputSlot = addSlot(176/2-9, 12, MultiblockProjectileWorkshop.SLOT_COMPONENT_INPUT); + addPlayerInventory(player.inventory, 8+32+8+4-44, 141+8); } else - inputSlot = this.addSlotToContainer(new Slot(this.inv, 0, 8, 8+2) - { - @Override - public boolean isItemValid(ItemStack itemStack) - { - return tile.isStackValid(0, itemStack); - } - }); + { + inputSlot = addSlot(8, 8+2, MultiblockProjectileWorkshop.SLOT_INPUT); + addPlayerInventory(player.inventory, 8+32+8+4, 141+8); + } - addPlayerInventory(player.inventory, 8+32+8+4, 141+8); } } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/multiblock/TileEntityMultiblockIIBase.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/multiblock/TileEntityMultiblockIIBase.java index 7a5613972..0b1062525 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/common/util/multiblock/TileEntityMultiblockIIBase.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/util/multiblock/TileEntityMultiblockIIBase.java @@ -191,7 +191,11 @@ public void receiveMessageFromClient(NBTTagCompound message) super.receiveMessageFromClient(message); if(isDummy()) return; - NBTSerialisation.synchroniseFor(this, (tag, tile) -> tag.deserializeAll(tile, message, true)); + if(!message.hasNoTags()) + { + NBTSerialisation.synchroniseFor(this, (tag, tile) -> tag.deserializeAll(tile, message, true)); + sendNBTMessageClient(message); + } } @Override diff --git a/src/main/resources/assets/immersiveintelligence/aabb/multiblock/ammunition_assembler.json b/src/main/resources/assets/immersiveintelligence/aabb/multiblock/ammunition_assembler.json index 60a9f6296..bd71d1642 100644 --- a/src/main/resources/assets/immersiveintelligence/aabb/multiblock/ammunition_assembler.json +++ b/src/main/resources/assets/immersiveintelligence/aabb/multiblock/ammunition_assembler.json @@ -61,12 +61,12 @@ }, "poi": { "lid": [49, 1], - "input_core": 87, - "input_casing": 79, - "item_input": [79, 87], - "item_output": [32, 72], - "redstone_input": 45, - "data_input": 43, + "input_core": 20, + "input_casing": 18, + "item_input": [18, 20], + "item_output": 34, + "redstone_input": 8, + "data_input": 14, "energy_input": 50 } } \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/aabb/multiblock/projectile_workshop.json b/src/main/resources/assets/immersiveintelligence/aabb/multiblock/projectile_workshop.json index 693fcd698..4fa34712a 100644 --- a/src/main/resources/assets/immersiveintelligence/aabb/multiblock/projectile_workshop.json +++ b/src/main/resources/assets/immersiveintelligence/aabb/multiblock/projectile_workshop.json @@ -66,11 +66,12 @@ "46": ["energy_box", "energy_top"] }, "poi": { - "item_inputs": [15], + "item_inputs": [15, 22], "item_in": 15, + "component_in": 22, "item_out": 12, "energy": 46, "redstone": 9, - "component_fluid_in": [] + "component_fluid_in": [22] } } \ No newline at end of file diff --git a/src/main/resources/assets/immersiveintelligence/lang/en_us.lang b/src/main/resources/assets/immersiveintelligence/lang/en_us.lang index eb9547ac4..3323e88bb 100644 --- a/src/main/resources/assets/immersiveintelligence/lang/en_us.lang +++ b/src/main/resources/assets/immersiveintelligence/lang/en_us.lang @@ -3362,6 +3362,43 @@ ii.gui.redstone_data_interface.mode.integer_100=Integer 0-100 ii.gui.redstone_data_interface.mode.float=Float 0-1 ii.gui.redstone_data_interface.mode.string=String +ii.gui.projectile_workshop.component_info=Component Info +ii.gui.projectile_workshop.component.role=Role: %s +ii.gui.projectile_workshop.component.density=Density: %s +ii.gui.projectile_workshop.component.slots_taken=Slots Taken: %s +ii.gui.projectile_workshop.entry.core=Core +ii.gui.projectile_workshop.entry.type=Type +ii.gui.projectile_workshop.tooltip.core_type=Core Type +ii.gui.projectile_workshop.tooltip.ammunition_type=Ammunition Type +ii.gui.projectile_workshop.cost=Cost: +ii.gui.projectile_workshop.invalid_cost=Cost: 250 Pabulions +ii.gui.projectile_workshop.material_preview=Material Preview +ii.gui.projectile_workshop.section.core=Core +ii.gui.projectile_workshop.section.ballistics=Ballistics +ii.gui.projectile_workshop.tooltip.component_slots=Component Slots +ii.gui.projectile_workshop.tooltip.component_effect_shape=Component Effect Shape +ii.gui.projectile_workshop.tooltip.component_efficiency=Component Efficiency Modifier +ii.gui.projectile_workshop.tooltip.component_efficiency.line1=Determines potency. +ii.gui.projectile_workshop.tooltip.component_efficiency.line2=Responsible for explosive power, chemical gas concentration. +ii.gui.projectile_workshop.tooltip.component_size=Component Size Multiplier +ii.gui.projectile_workshop.tooltip.component_size.line1=Determines component volume, responsible for explosion radius, gas spread range multiplier. +ii.gui.projectile_workshop.tooltip.core_mass=Core Mass +ii.gui.projectile_workshop.tooltip.damage_dealt=Damage Dealt +ii.gui.projectile_workshop.tooltip.velocity=Velocity +ii.gui.projectile_workshop.tooltip.available_fuzes=Available Fuzes +ii.gui.projectile_workshop.tooltip.penetration_hardness=Penetration Hardness +ii.gui.projectile_workshop.tooltip.flat_trajectory_range=Flat-Trajectory Range +ii.gui.projectile_workshop.tooltip.max_artillery_range=Max. Artillery Range +ii.gui.projectile_workshop.unit.blocks=%s b +ii.gui.projectile_workshop.unit.blocks_per_tick=%s b/t +ii.gui.projectile_workshop.value.penetration_hardness=%s b %s +ii.gui.projectile_workshop.unit.multiplier=%sx + +ii.gui.ammunition_assembler.fuse_config.timed=Time: +ii.gui.ammunition_assembler.fuse_config.timed.tooltip=Time before fuse triggers (in ticks) +ii.gui.ammunition_assembler.fuse_config.proximity=Distance: +ii.gui.ammunition_assembler.fuse_config.proximity.tooltip=Required distance to a solid object to trigger the fuse (in blocks) + #GUI HelpBoxes ii.gui_help.data_input_machine.programming=These slots allow reading a punchtape into the DIM's memory or writing its contents into an empty one. ii.gui_help.data_input_machine.storage=These slots allow storing empty or programmed punchtapes for convenience. @@ -3402,6 +3439,7 @@ ii.gui_tooltip.widget.ownership.hide=Hide Ownership Data ii.gui_tooltip.widget.ownership=Ownership ii.gui_tooltip.widget.manual.show=Show Side Manual ii.gui_tooltip.widget.manual.hide=Hide Side Manual +ii.gui_tooltip.widget.manual.page=Open in Engineer's Manual ii.gui_tooltip.widget.manual=Engineer's Manual ii.gui_tooltip.energy.stored=Energy Stored: %s/%s IF diff --git a/src/main/resources/assets/immersiveintelligence/models/block/multiblock/filler/filler.obj.amt b/src/main/resources/assets/immersiveintelligence/models/block/multiblock/filler/filler.obj.amt index d4041a8ef..8c14b4289 100644 --- a/src/main/resources/assets/immersiveintelligence/models/block/multiblock/filler/filler.obj.amt +++ b/src/main/resources/assets/immersiveintelligence/models/block/multiblock/filler/filler.obj.amt @@ -3,7 +3,7 @@ "fan": [27.525, 22, 10], "filling_part": [8, 18.225, -8], "conveyor_off": [-48, 0, -16], - "conveyor_onii": [-48, 0, -16], + "conveyor_on": [-48, 0, -16], "item": [32, 2, -8], "item_out": [32, 2, -8] }, diff --git a/src/main/resources/assets/immersiveintelligence/textures/gui/ammunition_assembler.png b/src/main/resources/assets/immersiveintelligence/textures/gui/ammunition_assembler.png index 49efd20e05f339366a8f9900b63bad20d1cc11eb..63bfec830ab65c39b7823a86a8eca364b4937439 100644 GIT binary patch literal 33120 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 z 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�Rb&aR$33#B97y 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 P<{(|o2X|}l*hcN diff --git a/src/main/resources/assets/immersiveintelligence/textures/gui/deco/icons/icon_contact.png b/src/main/resources/assets/immersiveintelligence/textures/gui/deco/icons/icon_contact.png deleted file mode 100644 index 88ebc22b46d8ab68686f7ba4c3a9101f26841c4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9FlS3sCCF7+t~P%z%p z#WBR9ckd)ez5@yzEaH#ZD>eUIh^tbFIuj)PJSA*y1Jj)&XV@5e#9w{bvy9c6Q};wi zlUQ@lnyE)mcqLuaPTl=`l6lw!M{XCFkWf4G)%_9wj@@rIiPsA+NEPa@WZ;_f@cZLk SJt9D>7(8A5T-G@yGywoLDLb(M diff --git a/src/main/resources/assets/immersiveintelligence/textures/gui/deco/icons/icon_fuse_contact.png b/src/main/resources/assets/immersiveintelligence/textures/gui/deco/icons/icon_fuse_contact.png new file mode 100644 index 0000000000000000000000000000000000000000..5826a02f47b2c4d232f1da70dd5d154392aa1a40 GIT binary patch literal 2481 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 DeT_5h literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/immersiveintelligence/textures/gui/deco/icons/icon_fuse_timed.png b/src/main/resources/assets/immersiveintelligence/textures/gui/deco/icons/icon_fuse_timed.png new file mode 100644 index 0000000000000000000000000000000000000000..28d1c8bec63bcc2f944ff5d1036e0080e5cae524 GIT binary patch literal 2522 zcmb7E3p~?nAAhE`8JnymNr*^=Bqv3#O_p1>maI-pj>}98bL}{FEK@FtkrbsI>1J|` zsLTgN)X8xvC%TA4Vy5PxynFUGpU&Io{k-S>{Xft1|6RVn-}AdX|NjYB7kiwXsvH0S zx06U9i{FZH$)W&2_)k6-0kBXjhT_g5dqrw8LxX+kfj*k7Xr_;*PZZr3fT*6fz0~yg zdf3^wN@2)T?hPUC+I_geDXxA*&9&!_cfKq)Z#fFm$Z|GUKaE}Bec^9!`0a-L>wJ-F zYRYD^t=(iy`>g7rw~?lkr07%E%h;L+GiuMi7ENsrnq=#8UBi~ykt6JXd4D`&Bx{Y` z;Z^F#WixLtZ7e!Y4?k0+X;4<4x|pZ?rm`i*U2CMUY0ZY-7_Ii=Ln~h18P@#iQWNKg zyRD^Qd@8yTv()My6OE#F^kx`oT&`ag`HR^FSwgIJ#VxkF`&P!F2k-o|((;6HF84FF zuO%}?bi=9J)2*_UF{vjaCBzRk&-8a6&a^zlS=t;^)f1eru-g~cZ+u$CF-gW`QLZ`` z(<0bW8+XM}HvU@Dqo|}49P7QNT@7mn&O4j8aN((8+MpDP8eSW9ec&~57Jue8lHM0o)cU&AMQ(-!ni4J zZ!Rf&v~?_Q$+80z?~5Y)W?tHpoqlES;V;y%J*BvPvGRJCS|t8Nx|ZFJcGi>oiaJea z7I!)Qo?~S0W$ln{>~}7=#WF#E>mWtZvQc^O&lo!g{j21G#92}-Zco6CtJxgafXeE@ z{r>F-9amoLqK5x@KxDysS5nBWa2|O$gJSrW?ciSBXq0oqMz#K8eKPAc%1;wpcpTC1 z<$Cn!Wq!7@w*hVtAa%`6%=r1c$hmc-m<}>lRJR_BE(NpMA zP;)(hM|D-nOldd@e=N@_j1c#tdy+Hzq`HWoIYr8fv7JKI-6zL#rtto+I*I$LCgUsi z(_MD`Rh6Qac_4J;vmMLLYQ5LZVZYBE3P?t5iSyk*LNXF{imB9nQH#2LluX0pBNLOT zyZ{b2sJXc5fo@UU?*3CZb!(>eJ4qoX6|0}L8TeJkEf6G%9CL;lrozVk$;l4Vwq!X%6xgqC@_A8(gX; z&tH1of0mbjjrjDVf5Fq)`eZ_aeqZ}p_Rj&HO7{mZ_otbpC3oTT zv4ks&cD-n5W*3)PsdirW8HixYKf89~xpwy&DshQImh$P*A)>iq-mT$*@E_5R9?G0{ zZ?1b_ZpfPeKHvNN?8(Cqv(8)16uMe$oof~a;h(2vI^=(FvnIYRZB^r|7gDJ1Yd^ef z(s1n2k+WTuA`GwC)@sNLTF>0s_^vG9Ifc>ZF{IaKFDmHnD9>@%dzqM%imFvp^bC@vcQ+ej5r|S!A zO1Or+PXp%M9h^?-r?<}pOKuLMuiRT;q3xDJ`LxY^w5q9-7=;fGS+Pl!eb6rXHtu=1 zb%X{+H@BUkc72SMQ^t!53e7OS5Pap9!^dSyg2M`?SDs9r5GBg+lKPL#9iio}YBAH< zBmQXuq@Rtm4FDyn^0QtG#WL!kqdfu4!6)xdAy=%yFp1PK0DkCz3*q52AS+g)Sv#HW z(8DMMc8m7-QjfJ;n325v7#F<`|;k_0J(Kp=pp10JA1)PC<8dSKlgTw)6iTA?>W z%7l5WpX-}81}ZC70=bbA@VM&(xZC;`AxR5{#o=TD7Ka0q6XT$Bd=2#b-vp2NXH;BV zECIs)xLT`A+@#);9H12zUf(7$jEr+RUqnahxa)WqgaBd^-h9o+{$N%^g#UUg;kcNdlAdyItdnMI<`-b(4 h$5k!tN5gsEQWxYN#sz_X>r{R?>?Z1eyC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/immersiveintelligence/textures/gui/deco/icons/icon_proximity.png b/src/main/resources/assets/immersiveintelligence/textures/gui/deco/icons/icon_proximity.png deleted file mode 100644 index 4fc76d6bb4e3678f2841bd425264878dd1584e3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9FlS3sCCF7+t~P%zum z#WBR9_vj>Vz5@yztn&9JOfGWSweoDYyvyw+n=h`Iz{vRTKt98Q53MtQX6!$!B`EE~ ztlYh>CDDvwm6qnyu*}f<@FrnXi>T%M3(jm=-TA%0vBP8a?1fhn>_S2-O+C(hRB&b6 fZTs7fv6yjo^MY*e83}KI)-rgy`njxgN@xNA*_%RZ diff --git a/src/main/resources/assets/immersiveintelligence/textures/gui/projectile_workshop.png b/src/main/resources/assets/immersiveintelligence/textures/gui/projectile_workshop.png index 20210e02b00bd91e8483b1b2e983e2f23f9f51bc..ef995f4e167cb23252fe50be3e412d24ef69f97e 100644 GIT binary patch literal 38797 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 CHXdLA literal 33120 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 Date: Tue, 2 Jun 2026 01:10:27 +0200 Subject: [PATCH 13/23] Standardised Request and Job naming in machines, fixed inserter task reach distance NBT saving --- .../GuiEmplacementPageFireMissions.java | 4 +- .../gui/block/inserter/GuiInserter.java | 12 +-- .../client/gui/block/packer/GuiPacker.java | 16 ++-- .../gui/block/packer/GuiPackerLabeler.java | 18 +++-- ...DecoTaskJobList.java => DecoTaskList.java} | 80 +++++++++++-------- .../inserter/TileEntityInserterBase.java | 25 +++--- .../immersiveintelligence/lang/en_us.lang | 6 +- 7 files changed, 86 insertions(+), 75 deletions(-) rename src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/panel/{DecoTaskJobList.java => DecoTaskList.java} (77%) diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/emplacement/GuiEmplacementPageFireMissions.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/emplacement/GuiEmplacementPageFireMissions.java index 87edabd73..761d93538 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/emplacement/GuiEmplacementPageFireMissions.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/emplacement/GuiEmplacementPageFireMissions.java @@ -1,7 +1,7 @@ package pl.pabilo8.immersiveintelligence.client.gui.block.emplacement; import net.minecraft.entity.player.EntityPlayer; -import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoTaskJobList; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoTaskList; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoGuiCategory; import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoTemplate; import pl.pabilo8.immersiveintelligence.common.IIGUI; @@ -24,7 +24,7 @@ public void onInit() { super.onInit(); addComponents( - new DecoTaskJobList<>(0, 0) + new DecoTaskList<>(0, 0) .withSize(96, 152-32) .withShowJobsTab(false) ); diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/inserter/GuiInserter.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/inserter/GuiInserter.java index eb219ba3e..3d68e4b61 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/inserter/GuiInserter.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/inserter/GuiInserter.java @@ -12,8 +12,8 @@ import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoEntryPanelBuilder; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoIngredientStackPickerPanel; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoPanel; -import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoTaskJobList; -import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoTaskJobList.ListMode; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoTaskList; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoTaskList.ListMode; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoBar; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoItemStackDisplay; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.text.DecoTextField; @@ -44,8 +44,8 @@ public class GuiInserter extends DecoTileGui { private static final String INSERTER_KEY = IIReference.GUI_LABEL_KEY+"inserter."; - private ListMode mode = ListMode.TASKS; - private DecoTaskJobList taskJobList; + private ListMode mode = ListMode.JOBS; + private DecoTaskList taskList; private DecoPanel panelDetails; @SyncNBT(events = SyncEvents.TILE_CLIENT_MESSAGE) public EasyMultiTypeCollection tasks; @@ -74,7 +74,7 @@ public void onInit() .withBox(DecoTextures.BG_STEEL, DecoTextures.TEMPLATE_SQUARE, 108, 8+3, 120+16, 130+16-2) .build(); - addComponent((taskJobList = new DecoTaskJobList<>(0, 2)) + addComponent((taskList = new DecoTaskList<>(0, 2)) .withSize(108, 116) .withEntries(tasks) .withIsJobPredicate(InserterTask::isJob) @@ -84,7 +84,7 @@ public void onInit() if(!taskSupplier.isPresent()) return null; InserterTask created = taskSupplier.get().get(); - created.isJob = (taskJobList.getMode()==ListMode.JOBS); + created.isJob = (taskList.getMode()==ListMode.JOBS); return created; }) .withOnSelectedChanged(task -> { diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/packer/GuiPacker.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/packer/GuiPacker.java index 618a5df60..867eb7e6a 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/packer/GuiPacker.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/packer/GuiPacker.java @@ -17,8 +17,8 @@ import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoIngredientStackPickerPanel; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoIngredientStackPickerPanel.PickerPanelMode; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoPanel; -import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoTaskJobList; -import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoTaskJobList.ListMode; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoTaskList; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoTaskList.ListMode; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoBar; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoFluidTank; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoItemStackDisplay; @@ -61,10 +61,10 @@ public class GuiPacker extends DecoTileGui @SyncNBT(events = SyncEvents.TILE_CLIENT_MESSAGE) public EasyCollection tasks; @SyncNBT - public ListMode mode = ListMode.TASKS; + public ListMode mode = ListMode.JOBS; private PackerActionType actionType; - private DecoTaskJobList taskJobList; + private DecoTaskList taskList; private DecoPanel panelDetails, panelResources; private DecoCheckbox expiresCheckbox; private DecoTextField expiresTextField; @@ -117,14 +117,14 @@ public void onInit() } // Replace mode tabs + list + action buttons with a single component - addComponent((taskJobList = new DecoTaskJobList<>(0, 0)) + addComponent((taskList = new DecoTaskList<>(0, 0)) .withSize(108, 116+12-8) .withEntries(tasks) - .withIsJobPredicate(t -> t.expirationAmount!=-1) + .withIsJobPredicate(t -> t.expirationAmount==-1) .withModeHandling(mode, m -> mode = m) .withBlankTaskSupplier(() -> { PackerTask created = new PackerTask(PackerHandler.PackerPutMode.ALL_POSSIBLE, actionType, new IngredientStack("*")); - created.expirationAmount = (taskJobList.getMode()==ListMode.TASKS)?-1: 1; + created.expirationAmount = (taskList.getMode()==ListMode.JOBS)?-1: 1; return created; }) .withOnSelectedChanged(task -> { @@ -390,6 +390,8 @@ private void updateExpiresFields() expiresCheckbox.withChecked(selected.expirationAmount!=-1); if(expiresTextField!=null) expiresTextField.withText(selected.expirationAmount==-1?"": String.valueOf(selected.expirationAmount)); + if(taskList!=null) + taskList.setMode(selected.expirationAmount==-1?ListMode.JOBS: ListMode.REQUESTS); } diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/packer/GuiPackerLabeler.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/packer/GuiPackerLabeler.java index c23bd49b1..2267857e8 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/packer/GuiPackerLabeler.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/block/packer/GuiPackerLabeler.java @@ -14,7 +14,8 @@ import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoIngredientStackPickerPanel; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoIngredientStackPickerPanel.PickerPanelMode; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoPanel; -import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoTaskJobList; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoTaskList; +import pl.pabilo8.immersiveintelligence.client.gui.deco.component.panel.DecoTaskList.ListMode; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.storage.DecoItemStackDisplay; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.text.DecoTextField; import pl.pabilo8.immersiveintelligence.client.gui.deco.component.text.util.TextFilter; @@ -49,8 +50,10 @@ public class GuiPackerLabeler extends DecoTileGui labels; + @SyncNBT + public ListMode mode = ListMode.JOBS; - private DecoTaskJobList taskList; + private DecoTaskList taskList; private DecoPanel panelDetails; private DecoCheckbox expiresCheckbox, serialStartCheckbox; private DecoTextField expiresTextField, serialStartTextField; @@ -96,15 +99,16 @@ public void onInit() addLinkTab(IIGUI.PACKER, DecoTextures.ICON_TASKS, "tasks_module"); addLinkTab(IIGUI.PACKER_LABELER, GuiPacker.ICON_LABELER, "labeler_module"); - // Replace list + action buttons with a standardized component (no Jobs tab here) - addComponent((taskList = new DecoTaskJobList<>(0, 0)) + // Replace mode tabs + list + action buttons with a standardized component + addComponent((taskList = new DecoTaskList<>(0, 0)) .withSize(108, 116+12-8) .withEntries(labels) - .withIsJobPredicate(t -> false) + .withIsJobPredicate(t -> t.expirationAmount==-1) + .withModeHandling(mode, m -> mode = m) .withBlankTaskSupplier(() -> { LabelingTask created = new LabelingTask(); created.filter = new IngredientStack("*"); - created.expirationAmount = -1; + created.expirationAmount = (taskList.getMode()==ListMode.JOBS)?-1: 1; created.serialBatch = 0; return created; }) @@ -298,6 +302,8 @@ private void updateExpiresFields() expiresCheckbox.withChecked(selected.expirationAmount!=-1); if(expiresTextField!=null) expiresTextField.withText(selected.expirationAmount==-1?"": String.valueOf(selected.expirationAmount)); + if(taskList!=null) + taskList.setMode(selected.expirationAmount==-1?ListMode.JOBS: ListMode.REQUESTS); } @Override diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/panel/DecoTaskJobList.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/panel/DecoTaskList.java similarity index 77% rename from src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/panel/DecoTaskJobList.java rename to src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/panel/DecoTaskList.java index db60e4e11..641c686f4 100644 --- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/panel/DecoTaskJobList.java +++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/deco/component/panel/DecoTaskList.java @@ -22,9 +22,9 @@ import static pl.pabilo8.immersiveintelligence.common.util.IIReference.GUI_LABEL_KEY; /** - * Generic "task/job editor list" component: + * Generic "request/job editor list" component: *