From cf533339f5d089364a955dd9bd664a0ff1dca2e7 Mon Sep 17 00:00:00 2001 From: Bob Date: Mon, 1 May 2023 22:47:20 +0200 Subject: [PATCH 1/5] fixed tau damage, fluid bucket registry --- gradle.properties | 4 ++-- src/main/java/com/hbm/items/ModItems.java | 10 +++++----- .../java/com/hbm/items/weapon/ItemGunGauss.java | 2 +- .../hbm/textures/items/rbmk_component_card.png | Bin 0 -> 313 bytes 4 files changed, 8 insertions(+), 8 deletions(-) create mode 100644 src/main/resources/assets/hbm/textures/items/rbmk_component_card.png diff --git a/gradle.properties b/gradle.properties index 9383abbe4..311c2314b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_version=1.0.27 # Empty build number makes a release type -mod_build_number=4578 +mod_build_number=4585 credits=HbMinecraft, rodolphito (explosion algorithms), grangerave (explosion algorithms),\ \ Hoboy (textures, models), Doctor17 (russian localization), Drillgon200 (effects, models, porting),\ @@ -11,4 +11,4 @@ credits=HbMinecraft, rodolphito (explosion algorithms), grangerave (explosion al \ Sten89 (models), Pixelguru26 (textures), TheBlueHat (textures), Alcater (GUI textures, porting), impbk2002 (project settings),\ \ OvermindDL1 (project settings), TehTemmie (reacher radiation function), Toshayo (satellite loot system, project settings), Silly541 (config for safe ME drives),\ \ Voxelstice (OpenComputers integration, turbine spinup), BallOfEnergy1 (OpenComputers integration), martemen (project settings),\ - \ Pvndols (thorium fuel recipe, gas turbine), JamesH2 (blood mechanics, nitric acid), sdddddf80 (recipe configs), SuperCraftAlex (tooltips) \ No newline at end of file + \ Pvndols (thorium fuel recipe, gas turbine), JamesH2 (blood mechanics, nitric acid), sdddddf80 (recipe configs), SuperCraftAlex (tooltips) diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index c191ffd59..79043e1e0 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -5460,11 +5460,11 @@ public class ModItems { mysteryshovel = new ItemMS().setUnlocalizedName("mysteryshovel").setFull3D().setMaxStackSize(1).setTextureName(RefStrings.MODID + ":cursed_shovel"); memory = new ItemBattery(Long.MAX_VALUE / 100L, 100000000000000L, 100000000000000L).setUnlocalizedName("memory").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":mo8_anim"); - FluidContainerRegistry.registerFluidContainer(new FluidStack(ModBlocks.mud_fluid, 1000), new ItemStack(ModItems.bucket_mud)); - FluidContainerRegistry.registerFluidContainer(new FluidStack(ModBlocks.acid_fluid, 1000), new ItemStack(ModItems.bucket_acid)); - FluidContainerRegistry.registerFluidContainer(new FluidStack(ModBlocks.toxic_fluid, 1000), new ItemStack(ModItems.bucket_toxic)); - FluidContainerRegistry.registerFluidContainer(new FluidStack(ModBlocks.schrabidic_fluid, 1000), new ItemStack(ModItems.bucket_schrabidic_acid)); - FluidContainerRegistry.registerFluidContainer(new FluidStack(ModBlocks.sulfuric_acid_fluid, 1000), new ItemStack(ModItems.bucket_sulfuric_acid)); + FluidContainerRegistry.registerFluidContainer(new FluidStack(ModBlocks.mud_fluid, 1000), new ItemStack(ModItems.bucket_mud), new ItemStack(Items.bucket)); + FluidContainerRegistry.registerFluidContainer(new FluidStack(ModBlocks.acid_fluid, 1000), new ItemStack(ModItems.bucket_acid), new ItemStack(Items.bucket)); + FluidContainerRegistry.registerFluidContainer(new FluidStack(ModBlocks.toxic_fluid, 1000), new ItemStack(ModItems.bucket_toxic), new ItemStack(Items.bucket)); + FluidContainerRegistry.registerFluidContainer(new FluidStack(ModBlocks.schrabidic_fluid, 1000), new ItemStack(ModItems.bucket_schrabidic_acid), new ItemStack(Items.bucket)); + FluidContainerRegistry.registerFluidContainer(new FluidStack(ModBlocks.sulfuric_acid_fluid, 1000), new ItemStack(ModItems.bucket_sulfuric_acid), new ItemStack(Items.bucket)); BucketHandler.INSTANCE.buckets.put(ModBlocks.mud_block, ModItems.bucket_mud); BucketHandler.INSTANCE.buckets.put(ModBlocks.acid_block, ModItems.bucket_acid); BucketHandler.INSTANCE.buckets.put(ModBlocks.toxic_block, ModItems.bucket_toxic); diff --git a/src/main/java/com/hbm/items/weapon/ItemGunGauss.java b/src/main/java/com/hbm/items/weapon/ItemGunGauss.java index f394e9062..4db1ce526 100644 --- a/src/main/java/com/hbm/items/weapon/ItemGunGauss.java +++ b/src/main/java/com/hbm/items/weapon/ItemGunGauss.java @@ -32,7 +32,7 @@ public class ItemGunGauss extends ItemGunBase { if(!main && getStored(stack) > 0) { EntityBulletBase bullet = new EntityBulletBase(world, altConfig.config.get(0), player); - bullet.overrideDamage = Math.min(getStored(stack), 1) * 10F; + bullet.overrideDamage = Math.max(getStored(stack), 1) * 10F; world.spawnEntityInWorld(bullet); world.playSoundAtEntity(player, "hbm:weapon.tauShoot", 0.5F, 0.75F); setItemWear(stack, getItemWear(stack) + (getCharge(stack)) * 2); diff --git a/src/main/resources/assets/hbm/textures/items/rbmk_component_card.png b/src/main/resources/assets/hbm/textures/items/rbmk_component_card.png new file mode 100644 index 0000000000000000000000000000000000000000..269a3d9308cd82822a9ea23c1cbb9d1d8a2e13f8 GIT binary patch literal 313 zcmV-90mlA`P)-08hXR zT+Y Date: Tue, 2 May 2023 16:40:26 +0200 Subject: [PATCH 2/5] on a rail --- .../java/com/hbm/blocks/rail/IRailNTM.java | 27 +++++ .../hbm/blocks/rail/RailStandardStraight.java | 105 ++++++++++++++++++ 2 files changed, 132 insertions(+) create mode 100644 src/main/java/com/hbm/blocks/rail/IRailNTM.java create mode 100644 src/main/java/com/hbm/blocks/rail/RailStandardStraight.java diff --git a/src/main/java/com/hbm/blocks/rail/IRailNTM.java b/src/main/java/com/hbm/blocks/rail/IRailNTM.java new file mode 100644 index 000000000..87738ed77 --- /dev/null +++ b/src/main/java/com/hbm/blocks/rail/IRailNTM.java @@ -0,0 +1,27 @@ +package com.hbm.blocks.rail; + +import net.minecraft.util.Vec3; +import net.minecraft.world.World; + +public interface IRailNTM { + + /** Returns a vector pointing to the closest snapping position given the starting position */ + public Vec3 getSnappingPos(World world, int x, int y, int z, double trainX, double trainY, double trainZ); + + /** + * Returns a location on the rail based on the train's current X/Y/Z momentum as well as the intended speed along the rail. + * If the train would leave the rail within that tick, the position is the last valid position on that rail. + * Inherently safer than simply adding the motion to the position and then snapping, since that may lead to derailing. + * The motion has to be calculated from the train's rotation, the scalar doesn't matter since it's only used for determining orientation in a clear way. + * Motion ends up being *-1 if the train is going in reverse, still pointing forwards despite the speed being negative. + * Also features a double[] wrapper with size 1 which holds the speed value that overshoots the rail. + * */ + public Vec3 getTravelLocation(World world, int x, int y, int z, double trainX, double trainY, double trainZ, double motionX, double motionY, double motionZ, double speed, double[] leftover); + + /** Returns that rail'S gauge. Trains will derail if the gauge does not match. */ + public TrackGauge getGauge(World world, int x, int y, int z); + + public static enum TrackGauge { + STANDARD //roughly 1.5m + } +} diff --git a/src/main/java/com/hbm/blocks/rail/RailStandardStraight.java b/src/main/java/com/hbm/blocks/rail/RailStandardStraight.java new file mode 100644 index 000000000..66a188e6a --- /dev/null +++ b/src/main/java/com/hbm/blocks/rail/RailStandardStraight.java @@ -0,0 +1,105 @@ +package com.hbm.blocks.rail; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.lib.Library; + +import net.minecraft.block.material.Material; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.MathHelper; +import net.minecraft.util.Vec3; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class RailStandardStraight extends BlockDummyable implements IRailNTM { + + public RailStandardStraight(Material mat) { + super(mat); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return null; + } + + @Override + public int[] getDimensions() { + return new int[] {0, 0, 2, 2, 0, 0}; + } + + @Override + public int getOffset() { + return 2; + } + + @Override + public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { + int meta = world.getBlockMetadata(x, y, z); + this.setBlockBounds(0F, 0F, 0F, 1F, 0.125F, 1F); + } + + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { + this.setBlockBounds(0F, 0F, 0F, 1F, 0.125F, 1F); + return AxisAlignedBB.getBoundingBox(x + this.minX, y + this.minY, z + this.minZ, x + this.maxX, y + this.maxY, z + this.maxZ); + } + + @Override + public Vec3 getSnappingPos(World world, int x, int y, int z, double trainX, double trainY, double trainZ) { + return snapAndMove(world, x, y, z, trainX, trainY, trainZ, 0, 0, 0, 0, new double[1]); + } + + @Override + public Vec3 getTravelLocation(World world, int x, int y, int z, double trainX, double trainY, double trainZ, double motionX, double motionY, double motionZ, double speed, double[] leftover) { + return snapAndMove(world, x, y, z, trainX, trainY, trainZ, motionX, motionY, motionZ, speed, leftover); + } + + /* Very simple function determining the snapping position and adding the motion value to it, if desired. */ + public Vec3 snapAndMove(World world, int x, int y, int z, double trainX, double trainY, double trainZ, double motionX, double motionY, double motionZ, double speed, double[] leftover) { + int[] pos = this.findCore(world, x, y, z); + if(pos == null) return Vec3.createVectorHelper(trainX, trainY, trainZ); + int cX = pos[0]; + int cY = pos[1]; + int cZ = pos[2]; + int meta = world.getBlockMetadata(cX, cY, cZ) - this.offset; + ForgeDirection dir = ForgeDirection.getOrientation(meta); + + Vec3 vec = Vec3.createVectorHelper(trainX, trainY, trainZ); + + if(speed == 0) { + return vec; + } + + if(dir == Library.POS_X || dir == Library.NEG_X) { + double targetX = trainX; + if(motionX > 0) { + targetX += speed; + } else { + targetX -= speed; + } + vec.xCoord = MathHelper.clamp_double(targetX, x - 2, x + 3); + vec.yCoord = y; + vec.zCoord = z + 0.5; + leftover[0] = Math.abs(targetX - vec.xCoord); + } else { + double targetZ = trainZ; + if(motionZ > 0) { + targetZ += speed; + } else { + targetZ -= speed; + } + vec.xCoord = x + 0.5; + vec.yCoord = y; + vec.zCoord = MathHelper.clamp_double(targetZ, z - 2, z + 3); + leftover[0] = Math.abs(targetZ - vec.zCoord); + } + + return vec; + } + + @Override + public TrackGauge getGauge(World world, int x, int y, int z) { + return TrackGauge.STANDARD; + } +} From dd2f929821ee9432429cf927ab1809b0c295f11d Mon Sep 17 00:00:00 2001 From: Boblet Date: Wed, 3 May 2023 10:42:58 +0200 Subject: [PATCH 3/5] EntityRailCarBase --- .../java/com/hbm/blocks/machine/Watz.java | 8 + .../java/com/hbm/blocks/rail/IRailNTM.java | 17 +- .../hbm/blocks/rail/RailStandardStraight.java | 15 +- .../hbm/entity/train/EntityRailCarBase.java | 157 ++++++++++++++++++ 4 files changed, 189 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/hbm/entity/train/EntityRailCarBase.java diff --git a/src/main/java/com/hbm/blocks/machine/Watz.java b/src/main/java/com/hbm/blocks/machine/Watz.java index 8a975bbc2..4f195b722 100644 --- a/src/main/java/com/hbm/blocks/machine/Watz.java +++ b/src/main/java/com/hbm/blocks/machine/Watz.java @@ -1,5 +1,7 @@ package com.hbm.blocks.machine; +import java.util.Random; + import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; import com.hbm.handler.MultiblockHandlerXR; @@ -11,6 +13,7 @@ import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; @@ -29,6 +32,11 @@ public class Watz extends BlockDummyable { if(meta >= 6) return new TileEntityProxyCombo().inventory().fluid(); return null; } + + @Override + public Item getItemDropped(int i, Random rand, int j) { + return null; + } @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { diff --git a/src/main/java/com/hbm/blocks/rail/IRailNTM.java b/src/main/java/com/hbm/blocks/rail/IRailNTM.java index 87738ed77..0bb68d517 100644 --- a/src/main/java/com/hbm/blocks/rail/IRailNTM.java +++ b/src/main/java/com/hbm/blocks/rail/IRailNTM.java @@ -1,8 +1,11 @@ package com.hbm.blocks.rail; +import com.hbm.util.fauxpointtwelve.BlockPos; + import net.minecraft.util.Vec3; import net.minecraft.world.World; +/** in retrospect, not the best name i could have chosen */ public interface IRailNTM { /** Returns a vector pointing to the closest snapping position given the starting position */ @@ -16,12 +19,22 @@ public interface IRailNTM { * Motion ends up being *-1 if the train is going in reverse, still pointing forwards despite the speed being negative. * Also features a double[] wrapper with size 1 which holds the speed value that overshoots the rail. * */ - public Vec3 getTravelLocation(World world, int x, int y, int z, double trainX, double trainY, double trainZ, double motionX, double motionY, double motionZ, double speed, double[] leftover); + public Vec3 getTravelLocation(World world, int x, int y, int z, double trainX, double trainY, double trainZ, double motionX, double motionY, double motionZ, double speed, RailLeaveInfo info); - /** Returns that rail'S gauge. Trains will derail if the gauge does not match. */ + /** Returns that rail's gauge. Trains will derail if the gauge does not match. */ public TrackGauge getGauge(World world, int x, int y, int z); public static enum TrackGauge { STANDARD //roughly 1.5m } + + /** A wrapper for all relevant info required when leaving a rail */ + public static class RailLeaveInfo { + /** The amount of blocks still left to travel after completing the rail */ + public double overshoot; + /** The exit position of that rail */ + public BlockPos pos; + public RailLeaveInfo dist(double d) { this.overshoot = d; return this; } + public RailLeaveInfo pos(BlockPos d) { this.pos = d; return this; } + } } diff --git a/src/main/java/com/hbm/blocks/rail/RailStandardStraight.java b/src/main/java/com/hbm/blocks/rail/RailStandardStraight.java index 66a188e6a..d28329aca 100644 --- a/src/main/java/com/hbm/blocks/rail/RailStandardStraight.java +++ b/src/main/java/com/hbm/blocks/rail/RailStandardStraight.java @@ -2,6 +2,7 @@ package com.hbm.blocks.rail; import com.hbm.blocks.BlockDummyable; import com.hbm.lib.Library; +import com.hbm.util.fauxpointtwelve.BlockPos; import net.minecraft.block.material.Material; import net.minecraft.tileentity.TileEntity; @@ -47,16 +48,16 @@ public class RailStandardStraight extends BlockDummyable implements IRailNTM { @Override public Vec3 getSnappingPos(World world, int x, int y, int z, double trainX, double trainY, double trainZ) { - return snapAndMove(world, x, y, z, trainX, trainY, trainZ, 0, 0, 0, 0, new double[1]); + return snapAndMove(world, x, y, z, trainX, trainY, trainZ, 0, 0, 0, 0, new RailLeaveInfo()); } @Override - public Vec3 getTravelLocation(World world, int x, int y, int z, double trainX, double trainY, double trainZ, double motionX, double motionY, double motionZ, double speed, double[] leftover) { - return snapAndMove(world, x, y, z, trainX, trainY, trainZ, motionX, motionY, motionZ, speed, leftover); + public Vec3 getTravelLocation(World world, int x, int y, int z, double trainX, double trainY, double trainZ, double motionX, double motionY, double motionZ, double speed, RailLeaveInfo info) { + return snapAndMove(world, x, y, z, trainX, trainY, trainZ, motionX, motionY, motionZ, speed, info); } /* Very simple function determining the snapping position and adding the motion value to it, if desired. */ - public Vec3 snapAndMove(World world, int x, int y, int z, double trainX, double trainY, double trainZ, double motionX, double motionY, double motionZ, double speed, double[] leftover) { + public Vec3 snapAndMove(World world, int x, int y, int z, double trainX, double trainY, double trainZ, double motionX, double motionY, double motionZ, double speed, RailLeaveInfo info) { int[] pos = this.findCore(world, x, y, z); if(pos == null) return Vec3.createVectorHelper(trainX, trainY, trainZ); int cX = pos[0]; @@ -81,7 +82,8 @@ public class RailStandardStraight extends BlockDummyable implements IRailNTM { vec.xCoord = MathHelper.clamp_double(targetX, x - 2, x + 3); vec.yCoord = y; vec.zCoord = z + 0.5; - leftover[0] = Math.abs(targetX - vec.xCoord); + info.dist(Math.abs(targetX - vec.xCoord)); + info.pos(new BlockPos(vec.xCoord + (motionX > 0 ? 1 : -1), y, z)); } else { double targetZ = trainZ; if(motionZ > 0) { @@ -92,7 +94,8 @@ public class RailStandardStraight extends BlockDummyable implements IRailNTM { vec.xCoord = x + 0.5; vec.yCoord = y; vec.zCoord = MathHelper.clamp_double(targetZ, z - 2, z + 3); - leftover[0] = Math.abs(targetZ - vec.zCoord); + info.dist(Math.abs(targetZ - vec.zCoord)); + info.pos(new BlockPos(x, y, vec.zCoord + (motionZ > 0 ? 1 : -1))); } return vec; diff --git a/src/main/java/com/hbm/entity/train/EntityRailCarBase.java b/src/main/java/com/hbm/entity/train/EntityRailCarBase.java new file mode 100644 index 000000000..f5c800bb0 --- /dev/null +++ b/src/main/java/com/hbm/entity/train/EntityRailCarBase.java @@ -0,0 +1,157 @@ +package com.hbm.entity.train; + +import com.hbm.blocks.rail.IRailNTM; +import com.hbm.blocks.rail.IRailNTM.RailLeaveInfo; +import com.hbm.blocks.rail.IRailNTM.TrackGauge; +import com.hbm.util.fauxpointtwelve.BlockPos; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.MathHelper; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; + +public abstract class EntityRailCarBase extends Entity { + + public boolean isOnRail = true; + private int turnProgress; + private double trainX; + private double trainY; + private double trainZ; + private double trainYaw; + private double trainPitch; + @SideOnly(Side.CLIENT) private double velocityX; + @SideOnly(Side.CLIENT) private double velocityY; + @SideOnly(Side.CLIENT) private double velocityZ; + + public EntityRailCarBase(World world) { + super(world); + } + + @Override protected void entityInit() { } + @Override protected void readEntityFromNBT(NBTTagCompound nbt) { } + @Override protected void writeEntityToNBT(NBTTagCompound nbt) { } + + @Override + public void onUpdate() { + + if(this.worldObj.isRemote) { + if(this.turnProgress > 0) { + double x = this.posX + (this.trainX - this.posX) / (double) this.turnProgress; + double y = this.posY + (this.trainY - this.posY) / (double) this.turnProgress; + double z = this.posZ + (this.trainZ - this.posZ) / (double) this.turnProgress; + double yaw = MathHelper.wrapAngleTo180_double(this.trainYaw - (double) this.rotationYaw); + this.rotationYaw = (float) ((double) this.rotationYaw + yaw / (double) this.turnProgress); + this.rotationPitch = (float) ((double) this.rotationPitch + (this.trainPitch - (double) this.rotationPitch) / (double) this.turnProgress); + --this.turnProgress; + this.setPosition(x, y, z); + this.setRotation(this.rotationYaw, this.rotationPitch); + } else { + this.setPosition(this.posX, this.posY, this.posZ); + this.setRotation(this.rotationYaw, this.rotationPitch); + } + } else { + + BlockPos anchor = this.getCurentAnchorPos(); + Vec3 corePos = getRelPosAlongRail(anchor, this.getCurrentSpeed()); + + if(corePos == null) { + this.derail(); + } else { + this.setPosition(corePos.xCoord, corePos.yCoord, corePos.zCoord); + + anchor = this.getCurentAnchorPos(); //reset origin to new position + Vec3 frontPos = getRelPosAlongRail(anchor, this.getLengthSpan()); + Vec3 backPos = getRelPosAlongRail(anchor, -this.getLengthSpan()); + + if(frontPos == null) this.derail(); + if(backPos == null) this.derail(); + + if(frontPos != null && backPos != null) this.rotationYaw = generateYaw(frontPos, backPos); + } + } + } + + public Vec3 getRelPosAlongRail(BlockPos anchor, double distanceToCover) { + + double overshoot = 0; + float yaw = this.rotationYaw; + + Vec3 next = null; + + do { + + int x = anchor.getX(); + int y = anchor.getY(); + int z = anchor.getZ(); + Block block = worldObj.getBlock(x, y, z); + + Vec3 rot = Vec3.createVectorHelper(1, 0, 0); + rot.rotateAroundY(yaw); + + if(block instanceof IRailNTM) { + IRailNTM rail = (IRailNTM) block; + + if(rail.getGauge(worldObj, x, y, z) == this.getGauge()) { + RailLeaveInfo info = new RailLeaveInfo(); + Vec3 prev = next; + next = rail.getTravelLocation(worldObj, x, y, z, posX, posY, posZ, rot.xCoord, rot.yCoord, rot.zCoord, distanceToCover, info); + overshoot = info.overshoot; + anchor = info.pos; + yaw = generateYaw(next, prev); + + } else { + return null; + } + } else { + return null; + } + + } while(overshoot != 0); //if there's still length to cover, keep going + + return next; + } + + public float generateYaw(Vec3 front, Vec3 back) { + return 0F; //TODO + } + + /** Returns the amount of blocks that the train should move per tick */ + public abstract double getCurrentSpeed(); + /** Returns the gauge of this train */ + public abstract TrackGauge getGauge(); + /** Returns the length between the core and one of the bogies */ + public abstract double getLengthSpan(); + + /** Returns the "true" position of the train, i.e. the block it wants to snap to */ + public BlockPos getCurentAnchorPos() { + return new BlockPos(posX, posY, posZ); + } + + public void derail() { + isOnRail = false; + } + + @SideOnly(Side.CLIENT) + public void setPositionAndRotation2(double posX, double posY, double posZ, float yaw, float pitch, int turnProg) { + this.trainX = posX; + this.trainY = posY; + this.trainZ = posZ; + this.trainYaw = (double) yaw; + this.trainPitch = (double) pitch; + this.turnProgress = turnProg + 2; + this.motionX = this.velocityX; + this.motionY = this.velocityY; + this.motionZ = this.velocityZ; + } + + @SideOnly(Side.CLIENT) + public void setVelocity(double mX, double mY, double mZ) { + this.velocityX = this.motionX = mX; + this.velocityY = this.motionY = mY; + this.velocityZ = this.motionZ = mZ; + } +} From ec63136436efbe3dd543ccb4646c66e8169c2de7 Mon Sep 17 00:00:00 2001 From: Boblet Date: Wed, 3 May 2023 14:15:16 +0200 Subject: [PATCH 4/5] the black mesa rail network --- .../hbm/entity/train/EntityRailCarBase.java | 19 ++++++-- .../entity/train/EntityRailCarRidable.java | 43 +++++++++++++++++ .../com/hbm/entity/train/TrainCargoTram.java | 46 +++++++++++++++++++ 3 files changed, 104 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/hbm/entity/train/EntityRailCarRidable.java create mode 100644 src/main/java/com/hbm/entity/train/TrainCargoTram.java diff --git a/src/main/java/com/hbm/entity/train/EntityRailCarBase.java b/src/main/java/com/hbm/entity/train/EntityRailCarBase.java index f5c800bb0..7099bebde 100644 --- a/src/main/java/com/hbm/entity/train/EntityRailCarBase.java +++ b/src/main/java/com/hbm/entity/train/EntityRailCarBase.java @@ -34,6 +34,16 @@ public abstract class EntityRailCarBase extends Entity { @Override protected void entityInit() { } @Override protected void readEntityFromNBT(NBTTagCompound nbt) { } @Override protected void writeEntityToNBT(NBTTagCompound nbt) { } + + @Override + public boolean canBePushed() { + return true; + } + + @Override + public boolean canBeCollidedWith() { + return !this.isDead; + } @Override public void onUpdate() { @@ -67,10 +77,11 @@ public abstract class EntityRailCarBase extends Entity { Vec3 frontPos = getRelPosAlongRail(anchor, this.getLengthSpan()); Vec3 backPos = getRelPosAlongRail(anchor, -this.getLengthSpan()); - if(frontPos == null) this.derail(); - if(backPos == null) this.derail(); - - if(frontPos != null && backPos != null) this.rotationYaw = generateYaw(frontPos, backPos); + if(frontPos == null || backPos == null) { + this.derail(); + } else { + this.rotationYaw = generateYaw(frontPos, backPos); + } } } } diff --git a/src/main/java/com/hbm/entity/train/EntityRailCarRidable.java b/src/main/java/com/hbm/entity/train/EntityRailCarRidable.java new file mode 100644 index 000000000..837fcceb2 --- /dev/null +++ b/src/main/java/com/hbm/entity/train/EntityRailCarRidable.java @@ -0,0 +1,43 @@ +package com.hbm.entity.train; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; + +public abstract class EntityRailCarRidable extends EntityRailCarBase { + + public EntityRailCarRidable(World world) { + super(world); + } + + @Override + public boolean interactFirst(EntityPlayer player) { + if(this.riddenByEntity != null && this.riddenByEntity instanceof EntityPlayer && this.riddenByEntity != player) { + return true; + } else { + if(!this.worldObj.isRemote) { + player.mountEntity(this); + } + return true; + } + } + + @Override + public void onUpdate() { + super.onUpdate(); + } + + @Override + public void updateRiderPosition() { + + Vec3 offset = getRiderSeatPosition(); + offset.rotateAroundY(this.rotationYaw); + + if(this.riddenByEntity != null) { + this.riddenByEntity.setPosition(this.posX + offset.xCoord, this.posY + offset.yCoord, this.posZ + offset.zCoord); + } + } + + /** Returns a Vec3 showing the relative position from the driver to the core */ + public abstract Vec3 getRiderSeatPosition(); +} diff --git a/src/main/java/com/hbm/entity/train/TrainCargoTram.java b/src/main/java/com/hbm/entity/train/TrainCargoTram.java new file mode 100644 index 000000000..11c89263a --- /dev/null +++ b/src/main/java/com/hbm/entity/train/TrainCargoTram.java @@ -0,0 +1,46 @@ +package com.hbm.entity.train; + +import com.hbm.blocks.rail.IRailNTM.TrackGauge; + +import net.minecraft.util.Vec3; +import net.minecraft.world.World; + +public class TrainCargoTram extends EntityRailCarRidable { + + /* + * + * _________ + * | | \ <-- + * | | |___ + * | | | | | + * _O\|_|_______|__|_____________________________|/O_ + * |____| |____| + * \__________________________________________/ + * '( + )' '( + )' + * + */ + + public TrainCargoTram(World world) { + super(world); + } + + @Override + public double getCurrentSpeed() { + return 0; + } + + @Override + public TrackGauge getGauge() { + return TrackGauge.STANDARD; + } + + @Override + public double getLengthSpan() { + return 2; + } + + @Override + public Vec3 getRiderSeatPosition() { + return Vec3.createVectorHelper(1, 1, 0); + } +} From abc4dc0cbf92aef81a627d2df2d3ec59cd17faae Mon Sep 17 00:00:00 2001 From: Bob Date: Wed, 3 May 2023 23:10:28 +0200 Subject: [PATCH 5/5] tram trom --- src/main/java/com/hbm/blocks/ModBlocks.java | 5 + .../hbm/blocks/rail/RailStandardStraight.java | 9 +- .../java/com/hbm/entity/EntityMappings.java | 3 + .../hbm/entity/train/EntityRailCarBase.java | 13 +- .../com/hbm/entity/train/TrainCargoTram.java | 16 +- src/main/java/com/hbm/main/ClientProxy.java | 2 + .../com/hbm/main/ModEventHandlerClient.java | 14 + .../java/com/hbm/main/ResourceManager.java | 1 + .../entity/item/RenderTrainCargoTram.java | 37 ++ .../assets/hbm/models/vehicles/tram.obj | 425 ++++++++++++++++++ 10 files changed, 517 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/hbm/render/entity/item/RenderTrainCargoTram.java create mode 100644 src/main/resources/assets/hbm/models/vehicles/tram.obj diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 3b4ee27cf..d806d1efc 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -11,6 +11,7 @@ import com.hbm.blocks.machine.*; import com.hbm.blocks.machine.pile.*; import com.hbm.blocks.machine.rbmk.*; import com.hbm.blocks.network.*; +import com.hbm.blocks.rail.RailStandardStraight; import com.hbm.blocks.siege.*; import com.hbm.blocks.test.*; import com.hbm.blocks.turret.*; @@ -1085,6 +1086,8 @@ public class ModBlocks { public static Block rail_highspeed; public static Block rail_booster; + public static Block rail_large_straight; + public static Block statue_elb; public static Block statue_elb_g; public static Block statue_elb_w; @@ -2109,6 +2112,7 @@ public class ModBlocks { rail_narrow = new RailGeneric().setBlockName("rail_narrow").setHardness(5.0F).setResistance(10.0F).setCreativeTab(CreativeTabs.tabTransport).setBlockTextureName(RefStrings.MODID + ":rail_narrow"); rail_highspeed = new RailGeneric().setMaxSpeed(1F).setFlexible(false).setBlockName("rail_highspeed").setHardness(5.0F).setResistance(10.0F).setCreativeTab(CreativeTabs.tabTransport).setBlockTextureName(RefStrings.MODID + ":rail_highspeed"); rail_booster = new RailBooster().setBlockName("rail_booster").setHardness(5.0F).setResistance(10.0F).setCreativeTab(CreativeTabs.tabTransport).setBlockTextureName(RefStrings.MODID + ":rail_booster"); + rail_large_straight = new RailStandardStraight().setBlockName("rail_large_straight").setHardness(5.0F).setResistance(10.0F).setCreativeTab(CreativeTabs.tabTransport).setBlockTextureName(RefStrings.MODID + ":block_steel"); crate = new BlockCrate(Material.wood).setBlockName("crate").setStepSound(Block.soundTypeWood).setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.consumableTab).setBlockTextureName(RefStrings.MODID + ":crate"); crate_weapon = new BlockCrate(Material.wood).setBlockName("crate_weapon").setStepSound(Block.soundTypeWood).setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.consumableTab).setBlockTextureName(RefStrings.MODID + ":crate_weapon"); @@ -3326,6 +3330,7 @@ public class ModBlocks { GameRegistry.registerBlock(rail_narrow, ItemBlockBase.class, rail_narrow.getUnlocalizedName()); GameRegistry.registerBlock(rail_highspeed, ItemBlockBase.class, rail_highspeed.getUnlocalizedName()); GameRegistry.registerBlock(rail_booster, ItemBlockBase.class, rail_booster.getUnlocalizedName()); + register(rail_large_straight); //Crate GameRegistry.registerBlock(crate, crate.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/rail/RailStandardStraight.java b/src/main/java/com/hbm/blocks/rail/RailStandardStraight.java index d28329aca..91e51c8ca 100644 --- a/src/main/java/com/hbm/blocks/rail/RailStandardStraight.java +++ b/src/main/java/com/hbm/blocks/rail/RailStandardStraight.java @@ -15,8 +15,8 @@ import net.minecraftforge.common.util.ForgeDirection; public class RailStandardStraight extends BlockDummyable implements IRailNTM { - public RailStandardStraight(Material mat) { - super(mat); + public RailStandardStraight() { + super(Material.iron); } @Override @@ -24,6 +24,11 @@ public class RailStandardStraight extends BlockDummyable implements IRailNTM { return null; } + @Override + public int getRenderType() { + return 0; + } + @Override public int[] getDimensions() { return new int[] {0, 0, 2, 2, 0, 0}; diff --git a/src/main/java/com/hbm/entity/EntityMappings.java b/src/main/java/com/hbm/entity/EntityMappings.java index 4d56ebc9b..844c470e9 100644 --- a/src/main/java/com/hbm/entity/EntityMappings.java +++ b/src/main/java/com/hbm/entity/EntityMappings.java @@ -14,6 +14,7 @@ import com.hbm.entity.mob.botprime.*; import com.hbm.entity.mob.siege.*; import com.hbm.entity.particle.*; import com.hbm.entity.projectile.*; +import com.hbm.entity.train.TrainCargoTram; import com.hbm.main.MainRegistry; import com.hbm.util.Tuple.Quartet; @@ -205,6 +206,8 @@ public class EntityMappings { addEntity(EntityChemical.class, "entity_chemthrower_splash", 1000); addEntity(EntityMist.class, "entity_mist", 1000); + addEntity(TrainCargoTram.class, "entity_ntm_cargo_tram", 250, false); + addMob(EntityCreeperNuclear.class, "entity_mob_nuclear_creeper", 0x204131, 0x75CE00); addMob(EntityCreeperTainted.class, "entity_mob_tainted_creeper", 0x813b9b, 0xd71fdd); addMob(EntityCreeperPhosgene.class, "entity_mob_phosgene_creeper", 0xE3D398, 0xB8A06B); diff --git a/src/main/java/com/hbm/entity/train/EntityRailCarBase.java b/src/main/java/com/hbm/entity/train/EntityRailCarBase.java index 7099bebde..deefbf4db 100644 --- a/src/main/java/com/hbm/entity/train/EntityRailCarBase.java +++ b/src/main/java/com/hbm/entity/train/EntityRailCarBase.java @@ -75,7 +75,7 @@ public abstract class EntityRailCarBase extends Entity { anchor = this.getCurentAnchorPos(); //reset origin to new position Vec3 frontPos = getRelPosAlongRail(anchor, this.getLengthSpan()); - Vec3 backPos = getRelPosAlongRail(anchor, -this.getLengthSpan()); + Vec3 backPos = getRelPosAlongRail(anchor, this.getLengthSpan()); if(frontPos == null || backPos == null) { this.derail(); @@ -91,7 +91,7 @@ public abstract class EntityRailCarBase extends Entity { double overshoot = 0; float yaw = this.rotationYaw; - Vec3 next = null; + Vec3 next = Vec3.createVectorHelper(posX, posY, posZ); do { @@ -100,7 +100,7 @@ public abstract class EntityRailCarBase extends Entity { int z = anchor.getZ(); Block block = worldObj.getBlock(x, y, z); - Vec3 rot = Vec3.createVectorHelper(1, 0, 0); + Vec3 rot = Vec3.createVectorHelper(0, 0, 1); rot.rotateAroundY(yaw); if(block instanceof IRailNTM) { @@ -127,7 +127,10 @@ public abstract class EntityRailCarBase extends Entity { } public float generateYaw(Vec3 front, Vec3 back) { - return 0F; //TODO + double deltaX = front.xCoord - back.xCoord; + double deltaZ = front.zCoord - back.zCoord; + double radians = Math.atan(deltaZ / deltaX); + return (float) MathHelper.wrapAngleTo180_double(radians * 180D / Math.PI - 90); } /** Returns the amount of blocks that the train should move per tick */ @@ -144,6 +147,8 @@ public abstract class EntityRailCarBase extends Entity { public void derail() { isOnRail = false; + this.setDead(); + worldObj.createExplosion(this, posX, posY, posZ, 1F, false); } @SideOnly(Side.CLIENT) diff --git a/src/main/java/com/hbm/entity/train/TrainCargoTram.java b/src/main/java/com/hbm/entity/train/TrainCargoTram.java index 11c89263a..c8c7160e4 100644 --- a/src/main/java/com/hbm/entity/train/TrainCargoTram.java +++ b/src/main/java/com/hbm/entity/train/TrainCargoTram.java @@ -2,6 +2,8 @@ package com.hbm.entity.train; import com.hbm.blocks.rail.IRailNTM.TrackGauge; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.DamageSource; import net.minecraft.util.Vec3; import net.minecraft.world.World; @@ -22,11 +24,12 @@ public class TrainCargoTram extends EntityRailCarRidable { public TrainCargoTram(World world) { super(world); + this.setSize(2F, 1F); } @Override public double getCurrentSpeed() { - return 0; + return this.riddenByEntity instanceof EntityPlayer ? ((EntityPlayer) this.riddenByEntity).moveForward * 0.125D : 0; } @Override @@ -41,6 +44,15 @@ public class TrainCargoTram extends EntityRailCarRidable { @Override public Vec3 getRiderSeatPosition() { - return Vec3.createVectorHelper(1, 1, 0); + return Vec3.createVectorHelper(0.75, 1.75, 0.75); + } + + @Override + public boolean attackEntityFrom(DamageSource p_70097_1_, float p_70097_2_) { + if(!this.worldObj.isRemote && !this.isDead) { + this.setDead(); + } + + return true; } } diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index d366c31f2..04a912a51 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -60,6 +60,7 @@ import com.hbm.entity.mob.botprime.*; import com.hbm.entity.mob.siege.*; import com.hbm.entity.particle.*; import com.hbm.entity.projectile.*; +import com.hbm.entity.train.*; import com.hbm.handler.CasingEjector; import com.hbm.handler.HbmKeybinds; import com.hbm.handler.ImpactWorldHandler; @@ -681,6 +682,7 @@ public class ClientProxy extends ServerProxy { RenderingRegistry.registerEntityRenderingHandler(EntityMinecartCrate.class, new RenderMinecart()); RenderingRegistry.registerEntityRenderingHandler(EntityMinecartNTM.class, new RenderNeoCart()); RenderingRegistry.registerEntityRenderingHandler(EntityMagnusCartus.class, new RenderMagnusCartus()); + RenderingRegistry.registerEntityRenderingHandler(TrainCargoTram.class, new RenderTrainCargoTram()); //items RenderingRegistry.registerEntityRenderingHandler(EntityMovingItem.class, new RenderMovingItem()); RenderingRegistry.registerEntityRenderingHandler(EntityMovingPackage.class, new RenderMovingPackage()); diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index 9e8872aec..9938c2ec9 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -127,6 +127,7 @@ import net.minecraftforge.client.event.RenderWorldLastEvent; import net.minecraftforge.client.event.TextureStitchEvent; import net.minecraftforge.client.event.sound.PlaySoundEvent17; import net.minecraftforge.common.ForgeHooks; +import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.event.entity.player.ItemTooltipEvent; public class ModEventHandlerClient { @@ -200,6 +201,19 @@ public class ModEventHandlerClient { GL11.glPopMatrix(); Minecraft.getMinecraft().renderEngine.bindTexture(Gui.icons); }*/ + + List text = new ArrayList(); + text.add("YAW: " + player.rotationYaw); + text.add("PITCH: " + player.rotationPitch); + int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + int j = 0; + if(i == 0) j = 2; + if(i == 1) j = 5; + if(i == 2) j = 3; + if(i == 3) j = 4; + ForgeDirection dir = ForgeDirection.getOrientation(j).getOpposite(); + text.add("x: " + dir.offsetX + " z: " + dir.offsetZ); + ILookOverlay.printGeneric(event, "DEBUG", 0xffff00, 0x4040000, text); } /// HANLDE ANIMATION BUSES /// diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index c56c4ed0d..302a3523c 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -1005,6 +1005,7 @@ public class ResourceManager { public static final IModelCustom cart = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/vehicles/cart.obj")); public static final IModelCustom cart_destroyer = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/vehicles/cart_destroyer.obj")); public static final IModelCustom cart_powder = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/vehicles/cart_powder.obj")); + public static final IModelCustom train_cargo_tram = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/vehicles/tram.obj")); ////Texture Entities diff --git a/src/main/java/com/hbm/render/entity/item/RenderTrainCargoTram.java b/src/main/java/com/hbm/render/entity/item/RenderTrainCargoTram.java new file mode 100644 index 000000000..660340f0f --- /dev/null +++ b/src/main/java/com/hbm/render/entity/item/RenderTrainCargoTram.java @@ -0,0 +1,37 @@ +package com.hbm.render.entity.item; + +import org.lwjgl.opengl.GL11; + +import com.hbm.main.MainRegistry; +import com.hbm.main.ResourceManager; + +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; + +public class RenderTrainCargoTram extends Render { + + @Override + public void doRender(Entity entity, double x, double y, double z, float swing, float interp) { + GL11.glPushMatrix(); + GL11.glTranslated(x, y, z); + + GL11.glRotated(180 - entity.rotationYaw, 0, 1, 0); + GL11.glRotated(-entity.rotationPitch, 0, 0, 1); + + MainRegistry.proxy.displayTooltip("Yaw: " + entity.rotationYaw, 666); + MainRegistry.proxy.displayTooltip("Pitch: " + entity.rotationPitch, 667); + + GL11.glDisable(GL11.GL_CULL_FACE); + bindTexture(ResourceManager.universal); + ResourceManager.train_cargo_tram.renderAll(); + GL11.glEnable(GL11.GL_CULL_FACE); + + GL11.glPopMatrix(); + } + + @Override + protected ResourceLocation getEntityTexture(Entity entity) { + return ResourceManager.universal; + } +} diff --git a/src/main/resources/assets/hbm/models/vehicles/tram.obj b/src/main/resources/assets/hbm/models/vehicles/tram.obj new file mode 100644 index 000000000..38a567ec5 --- /dev/null +++ b/src/main/resources/assets/hbm/models/vehicles/tram.obj @@ -0,0 +1,425 @@ +# Blender v2.79 (sub 0) OBJ File: 'tram.blend' +# www.blender.org +o Plane +v -1.000000 0.500000 2.500000 +v 1.000000 0.500000 2.500000 +v -1.000000 0.500000 -2.500000 +v 1.000000 0.500000 -2.500000 +v -1.000000 0.250000 2.500000 +v 1.000000 0.250000 2.500000 +v -1.000000 0.250000 -2.500000 +v 1.000000 0.250000 -2.500000 +v -1.000000 0.000000 2.250000 +v 1.000000 0.000000 2.250000 +v -1.000000 0.000000 -2.250000 +v 1.000000 0.000000 -2.250000 +v -0.125000 0.500000 1.000000 +v 0.875000 0.500000 1.000000 +v -0.125000 1.500000 1.000000 +v 0.875000 1.500000 1.000000 +v 0.125000 0.500000 2.000000 +v -0.125000 0.500000 1.750000 +v 0.875000 0.500000 1.750000 +v 0.625000 0.500000 2.000000 +v -0.125000 1.500000 1.750000 +v 0.125000 1.500000 2.000000 +v 0.625000 1.500000 2.000000 +v 0.875000 1.500000 1.750000 +v -0.625000 0.750000 2.437500 +v -0.625000 0.750000 2.312500 +v 0.625000 0.750000 2.312500 +v 0.625000 0.750000 2.437500 +v 0.713388 0.713388 2.312500 +v 0.713388 0.713388 2.437500 +v 0.750000 0.625000 2.312500 +v 0.750000 0.625000 2.437500 +v 0.713388 0.536612 2.312500 +v 0.713388 0.536612 2.437500 +v 0.625000 0.500000 2.312500 +v 0.625000 0.500000 2.437500 +v 0.536612 0.536612 2.312500 +v 0.536612 0.536612 2.437500 +v 0.500000 0.625000 2.312500 +v 0.500000 0.625000 2.437500 +v 0.536612 0.713388 2.312500 +v 0.536612 0.713388 2.437500 +v -0.536612 0.713388 2.312500 +v -0.536612 0.713388 2.437500 +v -0.500000 0.625000 2.312500 +v -0.500000 0.625000 2.437500 +v -0.536612 0.536612 2.312500 +v -0.536612 0.536612 2.437500 +v -0.625000 0.500000 2.312500 +v -0.625000 0.500000 2.437500 +v -0.713388 0.536612 2.312500 +v -0.713388 0.536612 2.437500 +v -0.750000 0.625000 2.312500 +v -0.750000 0.625000 2.437500 +v -0.713388 0.713388 2.312500 +v -0.713388 0.713388 2.437500 +v 0.375000 0.500000 2.312500 +v 0.875000 0.500000 2.312500 +v 0.375000 0.500000 2.187500 +v 0.875000 0.500000 2.187500 +v 0.375000 0.750000 2.187500 +v 0.375000 0.750000 2.312500 +v 0.875000 0.750000 2.312500 +v 0.875000 0.750000 2.187500 +v -0.875000 0.500000 2.312500 +v -0.375000 0.500000 2.312500 +v -0.875000 0.500000 2.187500 +v -0.375000 0.500000 2.187500 +v -0.875000 0.750000 2.187500 +v -0.875000 0.750000 2.312500 +v -0.375000 0.750000 2.312500 +v -0.375000 0.750000 2.187500 +v -0.875000 0.500000 1.875000 +v -0.125000 0.500000 1.875000 +v -0.875000 0.500000 1.125000 +v -0.125000 0.500000 1.125000 +v -0.875000 1.000000 1.125000 +v -0.875000 1.000000 1.875000 +v -0.125000 1.000000 1.875000 +v -0.125000 1.000000 1.125000 +v -0.750000 0.500000 -2.250000 +v 0.750000 0.500000 -2.250000 +v -0.750000 0.500000 -1.750000 +v 0.750000 0.500000 -1.750000 +v -0.750000 1.000000 -2.250000 +v 0.750000 1.000000 -2.250000 +v -0.750000 1.000000 -1.750000 +v 0.750000 1.000000 -1.750000 +vt 0.000000 0.833333 +vt 0.320000 0.000000 +vt 0.320000 0.833333 +vt 0.840000 0.333333 +vt 0.800000 0.000000 +vt 0.840000 0.000000 +vt 0.720000 0.833333 +vt 0.720000 0.000000 +vt 0.800000 0.041667 +vt 0.880000 0.333333 +vt 0.880000 0.000000 +vt 0.920000 0.333333 +vt 0.880000 0.000000 +vt 0.920000 0.000000 +vt 0.320000 0.000000 +vt 0.640000 0.750000 +vt 0.320000 0.750000 +vt 0.320000 0.791666 +vt 0.640000 0.791667 +vt 0.640000 0.833333 +vt 0.640000 0.000000 +vt 0.720000 0.041667 +vt 0.800000 0.875000 +vt 0.880000 0.708333 +vt 0.880000 0.875000 +vt 0.640000 0.958333 +vt 0.480000 0.833333 +vt 0.640000 0.833333 +vt 0.280000 1.000000 +vt 0.160000 1.000000 +vt 0.160000 0.833333 +vt 0.160000 0.833333 +vt 0.000000 1.000000 +vt 0.000000 0.833333 +vt 0.640000 0.791667 +vt 0.480000 0.916667 +vt 0.320000 0.958333 +vt 0.320000 0.916667 +vt 0.320000 0.791667 +vt 0.480000 0.791667 +vt 0.760000 0.833333 +vt 0.800000 0.916666 +vt 0.760000 0.916667 +vt 0.906131 0.580162 +vt 0.880000 0.568887 +vt 0.890824 0.541667 +vt 0.400000 0.973065 +vt 0.420000 0.958333 +vt 0.420000 0.973065 +vt 0.320000 1.000000 +vt 0.340000 0.958333 +vt 0.340000 1.000000 +vt 0.460000 0.987796 +vt 0.480000 0.973065 +vt 0.480000 0.987796 +vt 0.360000 0.958333 +vt 0.340000 0.973065 +vt 0.340000 0.958333 +vt 0.760000 0.996828 +vt 0.780000 0.955161 +vt 0.780000 0.996828 +vt 0.380000 0.973065 +vt 0.400000 0.958333 +vt 0.400000 0.973065 +vt 0.360000 0.973065 +vt 0.340000 0.987796 +vt 0.780000 0.996828 +vt 0.800000 0.955161 +vt 0.800000 0.996828 +vt 0.380000 0.987796 +vt 0.400000 0.987796 +vt 0.380000 0.987796 +vt 0.360000 0.973065 +vt 0.380000 0.973065 +vt 0.940000 0.583333 +vt 0.960000 0.666667 +vt 0.940000 0.666667 +vt 0.440000 0.973065 +vt 0.460000 0.958333 +vt 0.460000 0.973065 +vt 0.380000 0.958333 +vt 0.420000 0.987796 +vt 0.440000 0.973065 +vt 0.440000 0.987796 +vt 0.440000 0.987796 +vt 0.460000 0.987796 +vt 0.916955 0.571129 +vt 0.936955 0.556398 +vt 0.936955 0.571129 +vt 0.770824 0.916666 +vt 0.796955 0.927941 +vt 0.786131 0.955161 +vt 0.420000 0.973065 +vt 0.440000 0.958333 +vt 0.916955 0.556398 +vt 0.936955 0.541667 +vt 0.920000 0.250000 +vt 0.960000 0.333333 +vt 0.920000 0.333333 +vt 0.460000 0.973065 +vt 0.480000 0.958333 +vt 0.400000 0.987796 +vt 0.420000 0.987796 +vt 0.920000 0.083333 +vt 0.960000 0.166667 +vt 0.920000 0.166667 +vt 0.940000 0.666667 +vt 0.920000 0.708333 +vt 0.920000 0.666667 +vt 0.920000 0.583333 +vt 0.940000 0.666667 +vt 0.920000 0.666667 +vt 0.960000 0.250000 +vt 0.920000 0.166667 +vt 0.960000 0.166667 +vt 0.800000 0.708333 +vt 0.920000 0.583333 +vt 0.920000 0.708333 +vt 0.640000 0.958333 +vt 0.760000 0.833333 +vt 0.760000 0.958333 +vt 0.960000 0.458333 +vt 0.880000 0.333333 +vt 0.960000 0.333333 +vt 0.960000 0.958333 +vt 0.880000 0.833333 +vt 0.960000 0.833333 +vt 0.880000 1.000000 +vt 0.800000 0.875000 +vt 0.880000 0.875000 +vt 0.880000 0.708333 +vt 0.960000 0.833333 +vt 0.880000 0.833333 +vt 1.000000 0.083333 +vt 0.920000 0.000000 +vt 1.000000 0.000000 +vt 0.880000 0.541667 +vt 0.960000 0.458333 +vt 0.960000 0.541667 +vt 0.800000 0.583333 +vt 0.880000 0.333333 +vt 0.880000 0.583333 +vt 0.000000 0.000000 +vt 0.800000 0.333333 +vt 0.760000 0.000000 +vt 0.800000 0.791666 +vt 0.760000 0.833333 +vt 0.880000 0.333333 +vt 0.640000 0.000000 +vt 0.680000 0.000000 +vt 0.720000 0.791667 +vt 0.680000 0.833333 +vt 0.800000 0.708333 +vt 0.480000 0.958333 +vt 0.280000 0.833333 +vt 0.320000 0.875000 +vt 0.320000 0.958333 +vt 0.160000 1.000000 +vt 0.480000 0.791667 +vt 0.480000 0.958333 +vt 0.800000 0.833333 +vt 0.916955 0.552942 +vt 0.916955 0.568887 +vt 0.890824 0.580162 +vt 0.880000 0.552942 +vt 0.906131 0.541667 +vt 0.400000 0.958333 +vt 0.320000 0.958333 +vt 0.760000 0.955161 +vt 0.380000 0.958333 +vt 0.360000 0.987796 +vt 0.780000 0.955161 +vt 0.960000 0.583333 +vt 0.440000 0.958333 +vt 0.360000 0.958333 +vt 0.760000 0.943886 +vt 0.760000 0.927941 +vt 0.786131 0.916666 +vt 0.796955 0.943886 +vt 0.770824 0.955161 +vt 0.420000 0.958333 +vt 0.916955 0.541667 +vt 0.960000 0.250000 +vt 0.460000 0.958333 +vt 0.960000 0.083333 +vt 0.940000 0.708333 +vt 0.940000 0.583333 +vt 0.920000 0.250000 +vt 0.800000 0.583333 +vt 0.640000 0.833333 +vt 0.880000 0.458333 +vt 0.880000 0.958333 +vt 0.800000 1.000000 +vt 0.960000 0.708333 +vt 0.920000 0.083333 +vt 0.880000 0.458333 +vt 0.800000 0.333333 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -0.7071 -0.7071 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 -0.7071 0.7071 +vn -1.0000 0.0000 0.0000 +vn 0.7071 0.0000 0.7071 +vn -0.7071 0.0000 0.7071 +vn 0.3827 0.9239 0.0000 +vn -0.9239 -0.3827 0.0000 +vn 0.9239 0.3827 0.0000 +vn -0.3827 -0.9239 0.0000 +vn 0.9239 -0.3827 0.0000 +vn 0.3827 -0.9239 0.0000 +vn -0.3827 0.9239 0.0000 +vn -0.9239 0.3827 0.0000 +s off +f 2/1/1 3/2/1 1/3/1 +f 8/4/2 11/5/2 7/6/2 +f 4/7/3 2/8/3 10/9/3 +f 4/10/4 7/6/4 3/11/4 +f 1/12/5 6/13/5 2/14/5 +f 11/15/6 10/16/6 9/17/6 +f 5/18/7 10/16/7 6/19/7 +f 1/20/8 3/21/8 11/22/8 +f 20/23/5 22/24/5 17/25/5 +f 14/26/3 24/27/3 19/28/3 +f 24/29/1 16/30/1 15/31/1 +f 13/32/4 16/33/4 14/34/4 +f 24/27/9 20/35/9 19/28/9 +f 18/36/10 22/37/10 21/38/10 +f 18/36/8 15/39/8 13/40/8 +f 58/41/5 62/42/5 57/43/5 +f 25/44/5 54/45/5 50/46/5 +f 28/47/11 29/48/11 27/49/11 +f 65/50/8 69/51/8 67/52/8 +f 52/53/12 53/54/12 51/55/12 +f 30/56/13 31/57/13 29/58/13 +f 57/59/8 61/60/8 59/61/8 +f 50/62/14 51/63/14 49/64/14 +f 32/65/15 33/66/15 31/57/15 +f 60/67/3 63/68/3 58/69/3 +f 48/70/16 49/64/16 47/71/16 +f 33/72/16 36/73/16 35/74/16 +f 63/75/1 61/76/1 62/77/1 +f 46/78/15 47/79/15 45/80/15 +f 36/73/14 37/81/14 35/74/14 +f 56/82/17 26/83/17 55/84/17 +f 44/85/13 45/80/13 43/86/13 +f 38/87/12 39/88/12 37/89/12 +f 28/90/5 40/91/5 36/92/5 +f 25/93/11 43/94/11 26/83/11 +f 40/95/18 41/96/18 39/88/18 +f 59/97/4 64/98/4 60/99/4 +f 54/100/18 55/101/18 53/54/18 +f 42/102/17 27/49/17 41/103/17 +f 66/104/5 70/105/5 65/106/5 +f 68/107/3 71/108/3 66/109/3 +f 71/110/1 69/111/1 70/112/1 +f 67/113/4 72/114/4 68/115/4 +f 75/116/6 74/117/6 73/118/6 +f 79/119/1 77/120/1 78/121/1 +f 76/122/3 79/123/3 74/124/3 +f 73/125/8 77/126/8 75/127/8 +f 75/128/4 80/129/4 76/130/4 +f 74/131/5 78/132/5 73/133/5 +f 86/134/3 84/135/3 82/136/3 +f 87/137/8 81/138/8 83/139/8 +f 85/140/4 82/141/4 81/142/4 +f 2/1/1 4/143/1 3/2/1 +f 8/4/2 12/144/2 11/5/2 +f 2/8/3 6/145/3 10/9/3 +f 10/9/3 12/146/3 4/7/3 +f 12/146/3 8/147/3 4/7/3 +f 4/10/4 8/4/4 7/6/4 +f 1/12/5 5/148/5 6/13/5 +f 11/15/6 12/149/6 10/16/6 +f 5/18/7 9/17/7 10/16/7 +f 3/21/8 7/150/8 11/22/8 +f 11/22/8 9/151/8 1/20/8 +f 9/151/8 5/152/8 1/20/8 +f 20/23/5 23/153/5 22/24/5 +f 14/26/3 16/154/3 24/27/3 +f 15/31/1 21/155/1 24/29/1 +f 21/155/1 22/156/1 24/29/1 +f 22/156/1 23/157/1 24/29/1 +f 13/32/4 15/158/4 16/33/4 +f 24/27/9 23/159/9 20/35/9 +f 18/36/10 17/160/10 22/37/10 +f 18/36/8 21/38/8 15/39/8 +f 58/41/5 63/161/5 62/42/5 +f 46/162/5 44/163/5 25/44/5 +f 25/44/5 56/164/5 54/45/5 +f 54/45/5 52/165/5 50/46/5 +f 50/46/5 48/166/5 46/162/5 +f 46/162/5 25/44/5 50/46/5 +f 28/47/11 30/167/11 29/48/11 +f 65/50/8 70/168/8 69/51/8 +f 52/53/12 54/100/12 53/54/12 +f 30/56/13 32/65/13 31/57/13 +f 57/59/8 62/169/8 61/60/8 +f 50/62/14 52/170/14 51/63/14 +f 32/65/15 34/171/15 33/66/15 +f 60/67/3 64/172/3 63/68/3 +f 48/70/16 50/62/16 49/64/16 +f 33/72/16 34/171/16 36/73/16 +f 63/75/1 64/173/1 61/76/1 +f 46/78/15 48/174/15 47/79/15 +f 36/73/14 38/175/14 37/81/14 +f 56/82/17 25/93/17 26/83/17 +f 44/85/13 46/78/13 45/80/13 +f 38/87/12 40/95/12 39/88/12 +f 32/176/5 30/177/5 28/90/5 +f 28/90/5 42/178/5 40/91/5 +f 40/91/5 38/179/5 36/92/5 +f 36/92/5 34/180/5 32/176/5 +f 32/176/5 28/90/5 36/92/5 +f 25/93/11 44/181/11 43/94/11 +f 40/95/18 42/182/18 41/96/18 +f 59/97/4 61/183/4 64/98/4 +f 54/100/18 56/184/18 55/101/18 +f 42/102/17 28/47/17 27/49/17 +f 66/104/5 71/185/5 70/105/5 +f 68/107/3 72/186/3 71/108/3 +f 71/110/1 72/187/1 69/111/1 +f 67/113/4 69/188/4 72/114/4 +f 75/116/6 76/189/6 74/117/6 +f 79/119/1 80/190/1 77/120/1 +f 76/122/3 80/191/3 79/123/3 +f 73/125/8 78/192/8 77/126/8 +f 75/128/4 77/193/4 80/129/4 +f 74/131/5 79/194/5 78/132/5 +f 86/134/3 88/195/3 84/135/3 +f 87/137/8 85/196/8 81/138/8 +f 85/140/4 86/197/4 82/141/4