From 7ad017ec8e1351a67432b9ee605c5cd42b34e7ba Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 18 Feb 2024 17:52:42 +0100 Subject: [PATCH] eeeeeeee macarena! --- changelog | 22 +- src/main/java/com/hbm/blocks/ModBlocks.java | 3 + .../java/com/hbm/blocks/bomb/LaunchPad.java | 23 + .../com/hbm/blocks/bomb/LaunchPadLarge.java | 24 + .../com/hbm/blocks/generic/BlockFallout.java | 1 + .../com/hbm/config/FalloutConfigJSON.java | 8 +- .../hbm/entity/effect/EntityNukeTorex.java | 2 +- .../entity/missile/EntityMissileBaseNT.java | 20 +- .../entity/missile/EntityMissileDoomsday.java | 21 + .../entity/missile/EntityMissileTier3.java | 15 + .../entity/missile/EntityMissileTier4.java | 21 + .../container/ContainerLaunchPadLarge.java | 57 +- .../hbm/inventory/gui/GUILaunchPadLarge.java | 38 ++ .../inventory/gui/GUIMachineHydrotreater.java | 26 +- .../java/com/hbm/inventory/material/Mats.java | 2 +- .../inventory/recipes/ArcWelderRecipes.java | 24 +- .../inventory/recipes/AssemblerRecipes.java | 17 +- .../recipes/CrystallizerRecipes.java | 22 +- src/main/java/com/hbm/main/ClientProxy.java | 23 +- .../java/com/hbm/main/ResourceManager.java | 2 + .../com/hbm/particle/ParticleRocketFlame.java | 95 +-- .../com/hbm/particle/ParticleSmokePlume.java | 19 +- .../hbm/render/item/ItemRenderLibrary.java | 20 + .../tileentity/RenderLaunchPadLarge.java | 33 +- .../java/com/hbm/tileentity/DoorDecl.java | 60 ++ .../hbm/tileentity/TileEntityDoorGeneric.java | 2 +- .../tileentity/bomb/TileEntityLaunchPad.java | 51 +- .../bomb/TileEntityLaunchPadBase.java | 46 +- .../bomb/TileEntityLaunchPadLarge.java | 42 +- .../TileEntityMachineReactorBreeding.java | 5 - .../machine/TileEntityPWRController.java | 10 +- .../oil/TileEntityMachineHydrotreater.java | 2 + .../turret/TileEntityTurretArty.java | 2 + .../turret/TileEntityTurretHIMARS.java | 2 + src/main/java/com/hbm/wiaj/WorldInAJar.java | 2 +- src/main/resources/assets/hbm/lang/de_DE.lang | 1 + src/main/resources/assets/hbm/lang/en_US.lang | 1 + .../hbm/models/doors/silo_hatch_large.obj | 576 ++++++++++++++++++ .../models/doors/silo_hatch_large.png | Bin 0 -> 16520 bytes .../models/doors/silo_hatch_large_base.png | Bin 0 -> 2827 bytes .../models/launchpad/erector_atlas.png | Bin 14476 -> 15292 bytes 41 files changed, 1224 insertions(+), 116 deletions(-) create mode 100644 src/main/resources/assets/hbm/models/doors/silo_hatch_large.obj create mode 100644 src/main/resources/assets/hbm/textures/models/doors/silo_hatch_large.png create mode 100644 src/main/resources/assets/hbm/textures/models/doors/silo_hatch_large_base.png diff --git a/changelog b/changelog index be14b503d..c5627dea7 100644 --- a/changelog +++ b/changelog @@ -19,6 +19,17 @@ * Halogen floodlights are made with bromine and cast a light beam 32 blocks long * Lights are on by default and can be toggled with redstone * Tritium lamps have also been retrofitted with longer range lighting, casting beams in all cardinal directions for 8 blocks +* Launch pad + * The standard launch pad is now a 9x9 platform that changes depending on what missile is loaded + * Missiles now have to be fueled like they would need to be on custom missile launchers + * The old launch pad has been renamed to silo launch pad and has kept the same rough shape + * Launch pads can still receive missiles from hoppers, however they now have a loading delay, making missiles no longer spammable from a single launch pad + * Large launch pads have to physically lift and place the rocket onto the pad, while the silo launch pad has a refueling delay + * Custom missiles are not yet usable on the new launch pad, for now they still require the dedicated custom missile launch pads +* Large silo hatch + * Because the new nuclear missile model is too fat, there's now a larger silo hatch + * Has a 7x7 footprint and a 5x5 opening +* Bedrock ores for neodymium and rare earth chunks ## Changed * Deco bocks now drop all of the time, but they drop themselves instead of ingots @@ -74,6 +85,13 @@ * Instead of taking up the chestplate slot, it's now an armor mod worn in the insert slot * The armor no longer gives absorption, instead it adds 25 points to the shield count * The +25 bypasses the shield limit of 100, meaning that with enough shield infusions, the total maximum is now 125 +* The likelihood of uranium ore turning into schrabidium from full-sized nukes is now 10% instead of 1%. Conversion rates for small dirty explosions such as radioactive barrels remain unchanged. +* Fallout layers will no longer affect players in creative mode +* Rare earth chunks are now centrifugable, yielding larger quantities of the elements that are most needed earlier in the game +* Tier 3 missilles no longer need large fuel tanks and thrusters, instead they use two medium fuel tanks and four medium thrusters +* Tier 4s now need three thrusters +* Tier 0 missiles now come pre-fueled with solid fuel as part of their recipe +* Updated the ABM recipe to use the act welder, being made of a tier 0 missile assembly with extra thrusters and loaded with TNT/TATB ## Fixed * Fixed dupe caused by shift-clicking ashes out of the bricked furnace @@ -91,4 +109,6 @@ * Fixed research reactor OC integration allowing the control rods to be set out of bounds * Fixed fallout falling faster and overlaying if multiple fallout areas intersect * Fixed template folder 3D models rendering with weird shading -* HUD elements like jetpack charge and the shield bar should now still render even if Tinker's Construct replaces the health bar renderer \ No newline at end of file +* HUD elements like jetpack charge and the shield bar should now still render even if Tinker's Construct replaces the health bar renderer +* Fixed players glitching into blocks with larger bounding box when standing on top of them and relogging +* Fixed a rare crash caused by doors on chunk borders diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 21b10b095..8bd04a839 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -608,6 +608,7 @@ public class ModBlocks { public static Block fire_door; public static Block transition_seal; public static Block silo_hatch; + public static Block silo_hatch_large; // 1.12.2 Doors public static Block secure_access_door; @@ -2134,6 +2135,7 @@ public class ModBlocks { fire_door = new BlockDoorGeneric(Material.iron, DoorDecl.FIRE_DOOR).setBlockName("fire_door").setHardness(10.0F).setResistance(1_000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":fire_door"); transition_seal = new BlockDoorGeneric(Material.iron, DoorDecl.TRANSITION_SEAL).setBlockName("transition_seal").setHardness(10.0F).setResistance(1_000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":transition_seal"); silo_hatch = new BlockDoorGeneric(Material.iron, DoorDecl.SILO_HATCH).setBlockName("silo_hatch").setHardness(10.0F).setResistance(100.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); + silo_hatch_large = new BlockDoorGeneric(Material.iron, DoorDecl.SILO_HATCH_LARGE).setBlockName("silo_hatch_large").setHardness(10.0F).setResistance(100.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); secure_access_door = new BlockDoorGeneric(Material.iron, DoorDecl.SECURE_ACCESS_DOOR).setBlockName("secure_access_door").setHardness(20.0F).setResistance(2_000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); large_vehicle_door = new BlockDoorGeneric(Material.iron, DoorDecl.LARGE_VEHICLE_DOOR).setBlockName("large_vehicle_door").setHardness(10.0F).setResistance(1_000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); qe_containment = new BlockDoorGeneric(Material.iron, DoorDecl.QE_CONTAINMENT).setBlockName("qe_containment").setHardness(10.0F).setResistance(1_000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); @@ -3082,6 +3084,7 @@ public class ModBlocks { GameRegistry.registerBlock(fire_door, fire_door.getUnlocalizedName()); GameRegistry.registerBlock(transition_seal, transition_seal.getUnlocalizedName()); GameRegistry.registerBlock(silo_hatch, silo_hatch.getUnlocalizedName()); + GameRegistry.registerBlock(silo_hatch_large, silo_hatch_large.getUnlocalizedName()); GameRegistry.registerBlock(sliding_blast_door, sliding_blast_door.getUnlocalizedName()); //Doors diff --git a/src/main/java/com/hbm/blocks/bomb/LaunchPad.java b/src/main/java/com/hbm/blocks/bomb/LaunchPad.java index ac7910c4a..792432630 100644 --- a/src/main/java/com/hbm/blocks/bomb/LaunchPad.java +++ b/src/main/java/com/hbm/blocks/bomb/LaunchPad.java @@ -2,23 +2,33 @@ package com.hbm.blocks.bomb; import com.hbm.blocks.BlockDummyable; import com.hbm.interfaces.IBomb; +import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.bomb.TileEntityLaunchPad; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; public class LaunchPad extends BlockDummyable implements IBomb { public LaunchPad(Material mat) { super(mat); + this.bounding.add(AxisAlignedBB.getBoundingBox(-1.5D, 0D, -1.5D, -0.5D, 1D, -0.5D)); + this.bounding.add(AxisAlignedBB.getBoundingBox(0.5D, 0D, -1.5D, 1.5D, 1D, -0.5D)); + this.bounding.add(AxisAlignedBB.getBoundingBox(-1.5D, 0D, 0.5D, -0.5D, 1D, 1.5D)); + this.bounding.add(AxisAlignedBB.getBoundingBox(0.5D, 0D, 0.5D, 1.5D, 1D, 1.5D)); + this.bounding.add(AxisAlignedBB.getBoundingBox(-0.5D, 0.5D, -1.5D, 0.5D, 1D, 1.5D)); + this.bounding.add(AxisAlignedBB.getBoundingBox(-1.5D, 0.5D, -0.5D, 1.5D, 1D, 0.5D)); } @Override public TileEntity createNewTileEntity(World world, int meta) { if(meta >= 12) return new TileEntityLaunchPad(); + if(meta >= 6) return new TileEntityProxyCombo().inventory().power().fluid(); return null; } @@ -71,4 +81,17 @@ public class LaunchPad extends BlockDummyable implements IBomb { } super.onNeighborBlockChange( world, x, y, z, blockIn); } + + @Override + public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { + super.fillSpace(world, x, y, z, dir, o); + + x += dir.offsetX * o; + z += dir.offsetZ * o; + + this.makeExtra(world, x + 1, y, z + 1); + this.makeExtra(world, x + 1, y, z - 1); + this.makeExtra(world, x - 1, y, z + 1); + this.makeExtra(world, x - 1, y, z - 1); + } } diff --git a/src/main/java/com/hbm/blocks/bomb/LaunchPadLarge.java b/src/main/java/com/hbm/blocks/bomb/LaunchPadLarge.java index da9f9bdec..72e8100a3 100644 --- a/src/main/java/com/hbm/blocks/bomb/LaunchPadLarge.java +++ b/src/main/java/com/hbm/blocks/bomb/LaunchPadLarge.java @@ -2,23 +2,30 @@ package com.hbm.blocks.bomb; import com.hbm.blocks.BlockDummyable; import com.hbm.interfaces.IBomb; +import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.bomb.TileEntityLaunchPadLarge; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; public class LaunchPadLarge extends BlockDummyable implements IBomb { public LaunchPadLarge(Material mat) { super(mat); + this.bounding.add(AxisAlignedBB.getBoundingBox(-4.5D, 0D, -4.5D, 4.5D, 1D, -0.5D)); + this.bounding.add(AxisAlignedBB.getBoundingBox(-4.5D, 0D, 0.5D, 4.5D, 1D, 4.5D)); + this.bounding.add(AxisAlignedBB.getBoundingBox(-4.5D, 0.875D, -0.5D, 4.5D, 1D, 0.5D)); } @Override public TileEntity createNewTileEntity(World world, int meta) { if(meta >= 12) return new TileEntityLaunchPadLarge(); + if(meta >= 6) return new TileEntityProxyCombo().inventory().power().fluid(); return null; } @@ -71,4 +78,21 @@ public class LaunchPadLarge extends BlockDummyable implements IBomb { } super.onNeighborBlockChange( world, x, y, z, blockIn); } + + @Override + public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { + super.fillSpace(world, x, y, z, dir, o); + + x += dir.offsetX * o; + z += dir.offsetZ * o; + + this.makeExtra(world, x + 4, y, z + 2); + this.makeExtra(world, x + 4, y, z - 2); + this.makeExtra(world, x - 4, y, z + 2); + this.makeExtra(world, x - 4, y, z - 2); + this.makeExtra(world, x + 2, y, z + 4); + this.makeExtra(world, x - 2, y, z + 4); + this.makeExtra(world, x + 2, y, z - 4); + this.makeExtra(world, x - 2, y, z - 4); + } } diff --git a/src/main/java/com/hbm/blocks/generic/BlockFallout.java b/src/main/java/com/hbm/blocks/generic/BlockFallout.java index 0ef093594..9e273006a 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockFallout.java +++ b/src/main/java/com/hbm/blocks/generic/BlockFallout.java @@ -48,6 +48,7 @@ public class BlockFallout extends Block { public void onEntityWalking(World world, int x, int y, int z, Entity entity) { if(!world.isRemote && entity instanceof EntityLivingBase) { + if(entity instanceof EntityPlayer && ((EntityPlayer)entity).capabilities.isCreativeMode) return; PotionEffect effect = new PotionEffect(HbmPotion.radiation.id, 10 * 60 * 20, 0); effect.setCurativeItems(new ArrayList()); ((EntityLivingBase) entity).addPotionEffect(effect); diff --git a/src/main/java/com/hbm/config/FalloutConfigJSON.java b/src/main/java/com/hbm/config/FalloutConfigJSON.java index e2f67f3bc..4d415a994 100644 --- a/src/main/java/com/hbm/config/FalloutConfigJSON.java +++ b/src/main/java/com/hbm/config/FalloutConfigJSON.java @@ -70,8 +70,8 @@ public class FalloutConfigJSON { entries.add(new FalloutEntry() .mMa(Material.plants) .prim(new Triplet(Blocks.air, 0, 1)) .max(woodEffectRange)); entries.add(new FalloutEntry() .mMa(Material.vine) .prim(new Triplet(Blocks.air, 0, 1)) .max(woodEffectRange)); entries.add(new FalloutEntry() .mB(ModBlocks.waste_leaves) .prim(new Triplet(Blocks.air, 0, 1)) .max(woodEffectRange)); - entries.add(new FalloutEntry() .mB(Blocks.leaves) .prim(new Triplet(ModBlocks.waste_leaves, 0, 1)) .min(woodEffectRange)); - entries.add(new FalloutEntry() .mB(Blocks.leaves2) .prim(new Triplet(ModBlocks.waste_leaves, 0, 1)) .min(woodEffectRange)); + entries.add(new FalloutEntry() .mB(Blocks.leaves) .prim(new Triplet(ModBlocks.waste_leaves, 0, 1)) .min(woodEffectRange - 5D)); + entries.add(new FalloutEntry() .mB(Blocks.leaves2) .prim(new Triplet(ModBlocks.waste_leaves, 0, 1)) .min(woodEffectRange - 5D)); entries.add(new FalloutEntry().mB(Blocks.mossy_cobblestone).prim(new Triplet(Blocks.coal_ore, 0, 1))); entries.add(new FalloutEntry().mB(ModBlocks.ore_nether_uranium).prim(new Triplet(ModBlocks.ore_nether_schrabidium, 0, 1), new Triplet(ModBlocks.ore_nether_uranium_scorched, 0, 99))); @@ -84,8 +84,8 @@ public class FalloutConfigJSON { entries.add(new FalloutEntry().prim(new Triplet(ModBlocks.ore_sellafield_diamond, m, 3), new Triplet(ModBlocks.ore_sellafield_emerald, m, 2)) .c(0.5) .max(i * 5).sol(true).mB(Blocks.coal_ore)); entries.add(new FalloutEntry().prim(new Triplet(ModBlocks.ore_sellafield_diamond, m, 1)) .c(0.2) .max(i * 5).sol(true).mB(ModBlocks.ore_lignite)); entries.add(new FalloutEntry().prim(new Triplet(ModBlocks.ore_sellafield_emerald, m, 1)) .max(i * 5).sol(true).mB(ModBlocks.ore_beryllium)); - entries.add(new FalloutEntry().prim(new Triplet(ModBlocks.ore_sellafield_schrabidium, m, 1), new Triplet(ModBlocks.ore_sellafield_uranium_scorched, m, 99)) .max(i * 5).sol(true).mB(ModBlocks.ore_uranium)); - entries.add(new FalloutEntry().prim(new Triplet(ModBlocks.ore_sellafield_schrabidium, m, 1), new Triplet(ModBlocks.ore_sellafield_uranium_scorched, m, 99)) .max(i * 5).sol(true).mB(ModBlocks.ore_gneiss_uranium)); + entries.add(new FalloutEntry().prim(new Triplet(ModBlocks.ore_sellafield_schrabidium, m, 1), new Triplet(ModBlocks.ore_sellafield_uranium_scorched, m, 9)) .max(i * 5).sol(true).mB(ModBlocks.ore_uranium)); + entries.add(new FalloutEntry().prim(new Triplet(ModBlocks.ore_sellafield_schrabidium, m, 1), new Triplet(ModBlocks.ore_sellafield_uranium_scorched, m, 9)) .max(i * 5).sol(true).mB(ModBlocks.ore_gneiss_uranium)); entries.add(new FalloutEntry().prim(new Triplet(ModBlocks.ore_sellafield_radgem, m, 1)) .max(i * 5).sol(true).mB(Blocks.diamond_ore)); entries.add(new FalloutEntry() .prim(new Triplet(ModBlocks.sellafield_slaked, m, 1)).max(i * 5).sol(true).mMa(Material.rock)); entries.add(new FalloutEntry() .prim(new Triplet(ModBlocks.sellafield_slaked, m, 1)).max(i * 5).sol(true).mMa(Material.sand)); diff --git a/src/main/java/com/hbm/entity/effect/EntityNukeTorex.java b/src/main/java/com/hbm/entity/effect/EntityNukeTorex.java index 9951b9410..2995732e3 100644 --- a/src/main/java/com/hbm/entity/effect/EntityNukeTorex.java +++ b/src/main/java/com/hbm/entity/effect/EntityNukeTorex.java @@ -122,7 +122,7 @@ public class EntityNukeTorex extends Entity { for(int i = 0; i < 20; i++) { for(int j = 0; j < 4; j++) { float angle = (float) (Math.PI * 2 * rand.nextDouble()); - Vec3 vec = Vec3.createVectorHelper(torusWidth + rollerSize * (3 + rand.nextDouble()), 0, 0); + Vec3 vec = Vec3.createVectorHelper(torusWidth + rollerSize * (5 + rand.nextDouble()), 0, 0); vec.rotateAroundZ((float) (Math.PI / 45 * j)); vec.rotateAroundY(angle); Cloudlet cloud = new Cloudlet(posX + vec.xCoord, posY + coreHeight - 5 + j * s, posZ + vec.zCoord, angle, 0, (int) ((20 + ticksExisted / 10) * (1 + rand.nextDouble() * 0.1)), TorexType.CONDENSATION); diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileBaseNT.java b/src/main/java/com/hbm/entity/missile/EntityMissileBaseNT.java index 2a2a65b4d..d91efb5db 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileBaseNT.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileBaseNT.java @@ -176,17 +176,29 @@ public abstract class EntityMissileBaseNT extends EntityThrowableInterp implemen } protected void spawnContrail() { + this.spawnContraolWithOffset(0, 0, 0); + } + + protected void spawnContraolWithOffset(double offsetX, double offsetY, double offsetZ) { Vec3 vec = Vec3.createVectorHelper(this.lastTickPosX - this.posX, this.lastTickPosY - this.posY, this.lastTickPosZ - this.posZ); double len = vec.lengthVector(); vec = vec.normalize(); + Vec3 thrust = Vec3.createVectorHelper(0, 1, 0); + thrust.rotateAroundZ(this.rotationPitch * (float) Math.PI / 180F); + thrust.rotateAroundY((this.rotationYaw + 90) * (float) Math.PI / 180F); + for(int i = 0; i < Math.max(Math.min(len, 10), 1); i++) { - int j = i - 1; + double j = i - len; NBTTagCompound data = new NBTTagCompound(); - data.setDouble("posX", posX - vec.xCoord * j); - data.setDouble("posY", posY - vec.yCoord * j); - data.setDouble("posZ", posZ - vec.zCoord * j); + data.setDouble("posX", posX - vec.xCoord * j + offsetX); + data.setDouble("posY", posY - vec.yCoord * j + offsetY); + data.setDouble("posZ", posZ - vec.zCoord * j + offsetZ); data.setString("type", "missileContrail"); data.setFloat("scale", this.getContrailScale()); + data.setDouble("moX", -thrust.xCoord); + data.setDouble("moY", -thrust.yCoord); + data.setDouble("moZ", -thrust.zCoord); + data.setInteger("maxAge", 100 + rand.nextInt(40)); MainRegistry.proxy.effectNT(data); } } diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileDoomsday.java b/src/main/java/com/hbm/entity/missile/EntityMissileDoomsday.java index 33a9da83a..06c55969f 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileDoomsday.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileDoomsday.java @@ -8,6 +8,7 @@ import com.hbm.entity.logic.EntityNukeExplosionMK5; import com.hbm.items.ModItems; import net.minecraft.item.ItemStack; +import net.minecraft.util.Vec3; import net.minecraft.world.World; public class EntityMissileDoomsday extends EntityMissileBaseNT { @@ -26,6 +27,26 @@ public class EntityMissileDoomsday extends EntityMissileBaseNT { EntityNukeTorex.statFac(worldObj, posX, posY, posZ, BombConfig.missileRadius * 2); } + @Override + protected void spawnContrail() { + + byte rot = this.dataWatcher.getWatchableObjectByte(3); + + Vec3 thrust = Vec3.createVectorHelper(0, 0, 1); + switch(rot) { + case 2: thrust.rotateAroundY((float) -Math.PI / 2F); break; + case 4: thrust.rotateAroundY((float) -Math.PI); break; + case 3: thrust.rotateAroundY((float) -Math.PI / 2F * 3F); break; + } + thrust.rotateAroundY((this.rotationYaw + 90) * (float) Math.PI / 180F); + thrust.rotateAroundX(this.rotationPitch * (float) Math.PI / 180F); + thrust.rotateAroundY(-(this.rotationYaw + 90) * (float) Math.PI / 180F); + + this.spawnContraolWithOffset(thrust.xCoord, thrust.yCoord, thrust.zCoord); + this.spawnContraolWithOffset(0, 0, 0); + this.spawnContraolWithOffset(-thrust.xCoord, -thrust.zCoord, -thrust.zCoord); + } + @Override public List getDebris() { return null; } @Override public ItemStack getDebrisRareDrop() { return null; } @Override public String getUnlocalizedName() { return "radar.target.doomsday"; } diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileTier3.java b/src/main/java/com/hbm/entity/missile/EntityMissileTier3.java index fa24a3b32..2cb23dc07 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileTier3.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileTier3.java @@ -11,6 +11,7 @@ import com.hbm.items.ModItems; import api.hbm.entity.IRadarDetectableNT; import net.minecraft.item.ItemStack; +import net.minecraft.util.Vec3; import net.minecraft.world.World; public abstract class EntityMissileTier3 extends EntityMissileBaseNT { @@ -39,6 +40,20 @@ public abstract class EntityMissileTier3 extends EntityMissileBaseNT { public int getBlipLevel() { return IRadarDetectableNT.TIER3; } + + @Override + protected void spawnContrail() { + + Vec3 thrust = Vec3.createVectorHelper(0, 0, 0.5); + thrust.rotateAroundY((this.rotationYaw + 90) * (float) Math.PI / 180F); + thrust.rotateAroundX(this.rotationPitch * (float) Math.PI / 180F); + thrust.rotateAroundY(-(this.rotationYaw + 90) * (float) Math.PI / 180F); + + this.spawnContraolWithOffset(thrust.xCoord, thrust.yCoord, thrust.zCoord); + this.spawnContraolWithOffset(-thrust.zCoord, thrust.yCoord, thrust.xCoord); + this.spawnContraolWithOffset(-thrust.xCoord, -thrust.zCoord, -thrust.zCoord); + this.spawnContraolWithOffset(thrust.zCoord, -thrust.zCoord, -thrust.xCoord); + } public static class EntityMissileBurst extends EntityMissileTier3 { public EntityMissileBurst(World world) { super(world); } diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileTier4.java b/src/main/java/com/hbm/entity/missile/EntityMissileTier4.java index a0d211177..5e9f8472e 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileTier4.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileTier4.java @@ -12,6 +12,7 @@ import com.hbm.items.ModItems; import api.hbm.entity.IRadarDetectableNT; import net.minecraft.item.ItemStack; +import net.minecraft.util.Vec3; import net.minecraft.world.World; public abstract class EntityMissileTier4 extends EntityMissileBaseNT { @@ -39,6 +40,26 @@ public abstract class EntityMissileTier4 extends EntityMissileBaseNT { public int getBlipLevel() { return IRadarDetectableNT.TIER4; } + + @Override + protected void spawnContrail() { + + byte rot = this.dataWatcher.getWatchableObjectByte(3); + + Vec3 thrust = Vec3.createVectorHelper(0, 0, 1); + switch(rot) { + case 2: thrust.rotateAroundY((float) -Math.PI / 2F); break; + case 4: thrust.rotateAroundY((float) -Math.PI); break; + case 3: thrust.rotateAroundY((float) -Math.PI / 2F * 3F); break; + } + thrust.rotateAroundY((this.rotationYaw + 90) * (float) Math.PI / 180F); + thrust.rotateAroundX(this.rotationPitch * (float) Math.PI / 180F); + thrust.rotateAroundY(-(this.rotationYaw + 90) * (float) Math.PI / 180F); + + this.spawnContraolWithOffset(thrust.xCoord, thrust.yCoord, thrust.zCoord); + this.spawnContraolWithOffset(0, 0, 0); + this.spawnContraolWithOffset(-thrust.xCoord, -thrust.zCoord, -thrust.zCoord); + } public static class EntityMissileNuclear extends EntityMissileTier4 { public EntityMissileNuclear(World world) { super(world); } diff --git a/src/main/java/com/hbm/inventory/container/ContainerLaunchPadLarge.java b/src/main/java/com/hbm/inventory/container/ContainerLaunchPadLarge.java index 37bc65623..b319759f1 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerLaunchPadLarge.java +++ b/src/main/java/com/hbm/inventory/container/ContainerLaunchPadLarge.java @@ -1,8 +1,12 @@ package com.hbm.inventory.container; +import com.hbm.inventory.FluidContainerRegistry; import com.hbm.inventory.SlotTakeOnly; +import com.hbm.items.ModItems; import com.hbm.tileentity.bomb.TileEntityLaunchPadBase; +import api.hbm.energy.IBatteryItem; +import api.hbm.item.IDesignatorItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; @@ -42,10 +46,59 @@ public class ContainerLaunchPadLarge extends Container { this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 212)); } } - + @Override public ItemStack transferStackInSlot(EntityPlayer player, int par2) { - return null; //TODO + ItemStack var3 = null; + Slot var4 = (Slot) this.inventorySlots.get(par2); + + if(var4 != null && var4.getHasStack()) { + ItemStack var5 = var4.getStack(); + var3 = var5.copy(); + + if(par2 <= 6) { + if(!this.mergeItemStack(var5, 7, this.inventorySlots.size(), true)) { + return null; + } + } else { + + if(var3.getItem() instanceof IBatteryItem || var3.getItem() == ModItems.battery_creative) { + if(!this.mergeItemStack(var5, 2, 3, false)) { + return null; + } + } else if(launchpad.isMissileValid(var3)) { + if(!this.mergeItemStack(var5, 0, 1, false)) { + return null; + } + } else if(var3.getItem() == ModItems.fluid_barrel_infinite) { + if(!this.mergeItemStack(var5, 3, 4, false)) if(!this.mergeItemStack(var5, 5, 6, false)) { + return null; + } + } else if(FluidContainerRegistry.getFluidContent(var3, launchpad.tanks[0].getTankType()) > 0) { + if(!this.mergeItemStack(var5, 3, 4, false)) { + return null; + } + } else if(FluidContainerRegistry.getFluidContent(var3, launchpad.tanks[1].getTankType()) > 0) { + if(!this.mergeItemStack(var5, 5, 6, false)) { + return null; + } + } else if(var3.getItem() instanceof IDesignatorItem) { + if(!this.mergeItemStack(var5, 1, 2, false)) { + return null; + } + } else { + return null; + } + } + + if(var5.stackSize == 0) { + var4.putStack((ItemStack) null); + } else { + var4.onSlotChanged(); + } + } + + return var3; } @Override diff --git a/src/main/java/com/hbm/inventory/gui/GUILaunchPadLarge.java b/src/main/java/com/hbm/inventory/gui/GUILaunchPadLarge.java index 713ff71d7..ebcbe6365 100644 --- a/src/main/java/com/hbm/inventory/gui/GUILaunchPadLarge.java +++ b/src/main/java/com/hbm/inventory/gui/GUILaunchPadLarge.java @@ -1,5 +1,7 @@ package com.hbm.inventory.gui; +import java.util.ArrayList; +import java.util.List; import java.util.function.Consumer; import org.lwjgl.opengl.GL11; @@ -12,12 +14,14 @@ import com.hbm.items.weapon.ItemMissile; import com.hbm.lib.RefStrings; import com.hbm.render.item.ItemRenderMissileGeneric; import com.hbm.tileentity.bomb.TileEntityLaunchPadBase; +import com.hbm.util.I18nUtil; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.texture.TextureManager; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; public class GUILaunchPadLarge extends GuiInfoContainer { @@ -40,6 +44,17 @@ public class GUILaunchPadLarge extends GuiInfoContainer { this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 107, guiTop + 88 - 52, 16, 52, launchpad.power, launchpad.maxPower); launchpad.tanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 125, guiTop + 88 - 52, 16, 52); launchpad.tanks[1].renderTankInfo(this, mouseX, mouseY, guiLeft + 143, guiTop + 88 - 52, 16, 52); + + if(this.mc.thePlayer.inventory.getItemStack() == null && this.isMouseOverSlot(this.inventorySlots.getSlot(1), mouseX, mouseY) && !this.inventorySlots.getSlot(1).getHasStack()) { + ItemStack[] list = new ItemStack[] { new ItemStack(ModItems.designator), new ItemStack(ModItems.designator_range), new ItemStack(ModItems.designator_manual) }; + List lines = new ArrayList(); + ItemStack selected = list[(int) ((System.currentTimeMillis() % (1000 * list.length)) / 1000)]; + selected.stackSize = 0; + lines.add(list); + + lines.add(new Object[] {I18nUtil.resolveKey(selected.getDisplayName())}); + this.drawStackText(lines, mouseX, mouseY, this.fontRendererObj); + } } @Override @@ -109,5 +124,28 @@ public class GUILaunchPadLarge extends GuiInfoContainer { GL11.glPopMatrix(); } } + + GL11.glPushMatrix(); + RenderHelper.disableStandardItemLighting(); + GL11.glTranslated(guiLeft + 34, guiTop + 107, 0); + String text = ""; + int color = 0xffffff; + if(launchpad.state == launchpad.STATE_MISSING) { + GL11.glScaled(0.5, 0.5, 1); + text = "Not ready"; + color = 0xff0000; + } + if(launchpad.state == launchpad.STATE_LOADING) { + GL11.glScaled(0.6, 0.6, 1); + text = "Loading..."; + color = 0xff8000; + } + if(launchpad.state == launchpad.STATE_READY) { + GL11.glScaled(0.8, 0.8, 1); + text = "Ready"; + color = 0x00ff000; + } + this.fontRendererObj.drawString(text, -this.fontRendererObj.getStringWidth(text) / 2, -this.fontRendererObj.FONT_HEIGHT / 2, color); + GL11.glPopMatrix(); } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineHydrotreater.java b/src/main/java/com/hbm/inventory/gui/GUIMachineHydrotreater.java index 2704a5ce4..f0fd2cf09 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineHydrotreater.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineHydrotreater.java @@ -19,11 +19,11 @@ import net.minecraft.util.ResourceLocation; public class GUIMachineHydrotreater extends GuiInfoContainer { private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/processing/gui_hydrotreater.png"); - private TileEntityMachineHydrotreater refinery; + private TileEntityMachineHydrotreater hydrotreater; public GUIMachineHydrotreater(InventoryPlayer invPlayer, TileEntityMachineHydrotreater tedf) { super(new ContainerMachineHydrotreater(invPlayer, tedf)); - refinery = tedf; + hydrotreater = tedf; this.xSize = 176; this.ySize = 238; @@ -33,11 +33,11 @@ public class GUIMachineHydrotreater extends GuiInfoContainer { public void drawScreen(int mouseX, int mouseY, float f) { super.drawScreen(mouseX, mouseY, f); - refinery.tanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 35, guiTop + 70 - 52, 16, 52); - refinery.tanks[1].renderTankInfo(this, mouseX, mouseY, guiLeft + 53, guiTop + 70 - 52, 16, 52); - refinery.tanks[2].renderTankInfo(this, mouseX, mouseY, guiLeft + 125, guiTop + 70 - 52, 16, 52); - refinery.tanks[3].renderTankInfo(this, mouseX, mouseY, guiLeft + 143, guiTop + 70 - 52, 16, 52); - this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 17, guiTop + 70 - 52, 16, 52, refinery.power, refinery.maxPower); + hydrotreater.tanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 35, guiTop + 70 - 52, 16, 52); + hydrotreater.tanks[1].renderTankInfo(this, mouseX, mouseY, guiLeft + 53, guiTop + 70 - 52, 16, 52); + hydrotreater.tanks[2].renderTankInfo(this, mouseX, mouseY, guiLeft + 125, guiTop + 70 - 52, 16, 52); + hydrotreater.tanks[3].renderTankInfo(this, mouseX, mouseY, guiLeft + 143, guiTop + 70 - 52, 16, 52); + this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 17, guiTop + 70 - 52, 16, 52, hydrotreater.power, hydrotreater.maxPower); if(this.mc.thePlayer.inventory.getItemStack() == null && this.isMouseOverSlot(this.inventorySlots.getSlot(10), mouseX, mouseY) && !this.inventorySlots.getSlot(10).getHasStack()) { List lines = new ArrayList(); @@ -50,7 +50,7 @@ public class GUIMachineHydrotreater extends GuiInfoContainer { @Override protected void drawGuiContainerForegroundLayer(int i, int j) { - String name = this.refinery.hasCustomInventoryName() ? this.refinery.getInventoryName() : I18n.format(this.refinery.getInventoryName()); + String name = this.hydrotreater.hasCustomInventoryName() ? this.hydrotreater.getInventoryName() : I18n.format(this.hydrotreater.getInventoryName()); this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 5, 0xffffff); this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); @@ -62,12 +62,12 @@ public class GUIMachineHydrotreater extends GuiInfoContainer { Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); - int j = (int) (refinery.power * 54 / refinery.maxPower); + int j = (int) (hydrotreater.power * 54 / hydrotreater.maxPower); drawTexturedModalRect(guiLeft + 17, guiTop + 70 - j, 176, 52 - j, 16, j); - refinery.tanks[0].renderTank(guiLeft + 35, guiTop + 70, this.zLevel, 16, 52); - refinery.tanks[1].renderTank(guiLeft + 53, guiTop + 70, this.zLevel, 16, 52); - refinery.tanks[2].renderTank(guiLeft + 125, guiTop + 70, this.zLevel, 16, 52); - refinery.tanks[3].renderTank(guiLeft + 143, guiTop + 70, this.zLevel, 16, 52); + hydrotreater.tanks[0].renderTank(guiLeft + 35, guiTop + 70, this.zLevel, 16, 52); + hydrotreater.tanks[1].renderTank(guiLeft + 53, guiTop + 70, this.zLevel, 16, 52); + hydrotreater.tanks[2].renderTank(guiLeft + 125, guiTop + 70, this.zLevel, 16, 52); + hydrotreater.tanks[3].renderTank(guiLeft + 143, guiTop + 70, this.zLevel, 16, 52); } } diff --git a/src/main/java/com/hbm/inventory/material/Mats.java b/src/main/java/com/hbm/inventory/material/Mats.java index 969e6eb4e..170821e43 100644 --- a/src/main/java/com/hbm/inventory/material/Mats.java +++ b/src/main/java/com/hbm/inventory/material/Mats.java @@ -97,7 +97,7 @@ public class Mats { public static final NTMMaterial MAT_TITANIUM = makeSmeltable(2200, TI, 0xF7F3F2, 0x4F4C4B, 0xA99E79).setShapes(INGOT, DUST, PLATE, CASTPLATE, WELDEDPLATE, BLOCK, HEAVY_COMPONENT); public static final NTMMaterial MAT_COPPER = makeSmeltable(2900, CU, 0xFDCA88, 0x601E0D, 0xC18336).setShapes(WIRE, INGOT, DUST, PLATE, CASTPLATE, WELDEDPLATE, BLOCK, HEAVY_COMPONENT); public static final NTMMaterial MAT_TUNGSTEN = makeSmeltable(7400, W, 0x868686, 0x000000, 0x977474).setShapes(WIRE, BOLT, INGOT, DUST, DENSEWIRE, CASTPLATE, WELDEDPLATE, BLOCK, HEAVY_COMPONENT); - public static final NTMMaterial MAT_ALUMINIUM = makeSmeltable(1300, AL, 0xFFFFFF, 0x344550, 0xD0B8EB).setShapes(WIRE, INGOT, DUST, PLATE, CASTPLATE, BLOCK, HEAVY_COMPONENT); + public static final NTMMaterial MAT_ALUMINIUM = makeSmeltable(1300, AL, 0xFFFFFF, 0x344550, 0xD0B8EB).setShapes(WIRE, INGOT, DUST, PLATE, CASTPLATE, WELDEDPLATE, BLOCK, HEAVY_COMPONENT); public static final NTMMaterial MAT_LEAD = makeSmeltable(8200, PB, 0xA6A6B2, 0x03030F, 0x646470).setShapes(NUGGET, INGOT, DUST, PLATE, CASTPLATE, BLOCK, HEAVY_COMPONENT); public static final NTMMaterial MAT_BISMUTH = makeSmeltable(8300, BI, 0xB200FF).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); public static final NTMMaterial MAT_ARSENIC = makeSmeltable(3300, AS, 0x6CBABA, 0x242525, 0x558080).setShapes(NUGGET, INGOT); diff --git a/src/main/java/com/hbm/inventory/recipes/ArcWelderRecipes.java b/src/main/java/com/hbm/inventory/recipes/ArcWelderRecipes.java index 0a61eb238..7130850c2 100644 --- a/src/main/java/com/hbm/inventory/recipes/ArcWelderRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/ArcWelderRecipes.java @@ -69,6 +69,8 @@ public class ArcWelderRecipes extends SerializableRecipe { //mid-game PWR recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.plate_welded, 1, Mats.MAT_ZIRCONIUM.id), 600, 10_000L, new OreDictStack(ZR.plateCast(), 2))); + recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.plate_welded, 1, Mats.MAT_ALUMINIUM.id), 300, 10_000L, + new OreDictStack(AL.plateCast(), 2))); //late-game fusion recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.plate_welded, 1, Mats.MAT_TCALLOY.id), 1_200, 1_000_000L, new FluidStack(Fluids.OXYGEN, 1_000), new OreDictStack(TCALLOY.plateCast(), 2))); @@ -83,11 +85,11 @@ public class ArcWelderRecipes extends SerializableRecipe { //Missile Parts recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.thruster_small), 60, 1_000L, new OreDictStack(STEEL.plate(), 4), new ComparableStack(ModItems.wire_aluminium, 4), new OreDictStack(CU.plate(), 4))); recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.thruster_medium), 100, 2_000L, new OreDictStack(STEEL.plate(), 8), new ComparableStack(ModItems.motor, 1), new OreDictStack(GRAPHITE.ingot(), 8))); - recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.thruster_large), 200, 5_000L, new OreDictStack(DURA.ingot(), 12), new ComparableStack(ModItems.motor, 2), new OreDictStack(OreDictManager.getReflector(), 16))); + recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.thruster_large), 200, 5_000L, new OreDictStack(DURA.ingot(), 10), new ComparableStack(ModItems.motor, 1), new OreDictStack(OreDictManager.getReflector(), 12))); - recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.fuel_tank_small), 60, 1_000L, new OreDictStack(Fluids.ETHANOL.getDict(1_000), 6), new OreDictStack(AL.plate(), 6), new OreDictStack(STEEL.plate(), 2))); - recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.fuel_tank_medium), 100, 2_000L, new OreDictStack(Fluids.KEROSENE.getDict(1_000), 8), new OreDictStack(TI.plate(), 12), new OreDictStack(STEEL.plate(), 4))); - recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.fuel_tank_large), 200, 5_000L, new OreDictStack(Fluids.KEROSENE.getDict(1_000), 12), new OreDictStack(TI.plate(), 24), new OreDictStack(STEEL.plateCast(), 3))); + recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.fuel_tank_small), 60, 1_000L, new OreDictStack(AL.plate(), 6), new OreDictStack(CU.plate(), 4), new ComparableStack(ModBlocks.steel_scaffold, 4))); + recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.fuel_tank_medium), 100, 2_000L, new OreDictStack(AL.plateCast(), 4), new OreDictStack(TI.plate(), 8), new ComparableStack(ModBlocks.steel_scaffold, 12))); + recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.fuel_tank_large), 200, 5_000L, new OreDictStack(AL.plateWelded(), 8), new OreDictStack(BIGMT.plate(), 12), new ComparableStack(ModBlocks.steel_scaffold, 16))); //Missiles recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.missile_anti_ballistic), 100, 5_000L, new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 3), new ComparableStack(ModItems.missile_assembly), new ComparableStack(ModItems.thruster_small, 4))); @@ -103,14 +105,14 @@ public class ArcWelderRecipes extends SerializableRecipe { recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.missile_buster_strong), 200, 10_000L, new ComparableStack(ModItems.warhead_buster_medium), new ComparableStack(ModItems.fuel_tank_medium), new ComparableStack(ModItems.thruster_medium))); recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.missile_emp_strong), 200, 10_000L, new ComparableStack(ModBlocks.emp_bomb, 3), new ComparableStack(ModItems.fuel_tank_medium), new ComparableStack(ModItems.thruster_medium))); - recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.missile_burst), 300, 25_000L, new ComparableStack(ModItems.warhead_generic_large), new ComparableStack(ModItems.fuel_tank_large), new ComparableStack(ModItems.thruster_large))); - recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.missile_inferno), 300, 25_000L, new ComparableStack(ModItems.warhead_incendiary_large), new ComparableStack(ModItems.fuel_tank_large), new ComparableStack(ModItems.thruster_large))); - recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.missile_rain), 300, 25_000L, new ComparableStack(ModItems.warhead_cluster_large), new ComparableStack(ModItems.fuel_tank_large), new ComparableStack(ModItems.thruster_large))); - recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.missile_drill), 300, 25_000L, new ComparableStack(ModItems.warhead_buster_large), new ComparableStack(ModItems.fuel_tank_large), new ComparableStack(ModItems.thruster_large))); + recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.missile_burst), 300, 25_000L, new ComparableStack(ModItems.warhead_generic_large), new ComparableStack(ModItems.fuel_tank_medium, 2), new ComparableStack(ModItems.thruster_medium, 4))); + recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.missile_inferno), 300, 25_000L, new ComparableStack(ModItems.warhead_incendiary_large), new ComparableStack(ModItems.fuel_tank_medium, 2), new ComparableStack(ModItems.thruster_medium, 4))); + recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.missile_rain), 300, 25_000L, new ComparableStack(ModItems.warhead_cluster_large), new ComparableStack(ModItems.fuel_tank_medium, 2), new ComparableStack(ModItems.thruster_medium, 4))); + recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.missile_drill), 300, 25_000L, new ComparableStack(ModItems.warhead_buster_large), new ComparableStack(ModItems.fuel_tank_medium, 2), new ComparableStack(ModItems.thruster_medium, 4))); - recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.missile_nuclear), 600, 50_000L, new ComparableStack(ModItems.warhead_nuclear), new ComparableStack(ModItems.fuel_tank_large), new ComparableStack(ModItems.thruster_large))); - recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.missile_nuclear_cluster), 600, 50_000L, new ComparableStack(ModItems.warhead_mirv), new ComparableStack(ModItems.fuel_tank_large), new ComparableStack(ModItems.thruster_large))); - recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.missile_volcano), 600, 50_000L, new ComparableStack(ModItems.warhead_volcano), new ComparableStack(ModItems.fuel_tank_large), new ComparableStack(ModItems.thruster_large))); + recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.missile_nuclear), 600, 50_000L, new ComparableStack(ModItems.warhead_nuclear), new ComparableStack(ModItems.fuel_tank_large), new ComparableStack(ModItems.thruster_large, 3))); + recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.missile_nuclear_cluster), 600, 50_000L, new ComparableStack(ModItems.warhead_mirv), new ComparableStack(ModItems.fuel_tank_large), new ComparableStack(ModItems.thruster_large, 3))); + recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.missile_volcano), 600, 50_000L, new ComparableStack(ModItems.warhead_volcano), new ComparableStack(ModItems.fuel_tank_large), new ComparableStack(ModItems.thruster_large, 3))); } public static HashMap getRecipes() { diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java index 51880f151..ef9a74ed4 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java @@ -314,7 +314,6 @@ public class AssemblerRecipes { makeRecipe(new ComparableStack(ModBlocks.float_bomb, 1), new AStack[] {new OreDictStack(TI.plate(), 12), new ComparableStack(ModItems.levitation_unit, 1), new ComparableStack(ModItems.circuit_gold, 4), new ComparableStack(ModItems.wire_gold, 6), },250); makeRecipe(new ComparableStack(ModBlocks.therm_endo, 1), new AStack[] {new OreDictStack(TI.plate(), 12), new ComparableStack(ModItems.powder_ice, 32), new ComparableStack(ModItems.circuit_gold, 1), new ComparableStack(ModItems.coil_gold, 4), },250); makeRecipe(new ComparableStack(ModBlocks.therm_exo, 1), new AStack[] {new OreDictStack(TI.plate(), 12), new OreDictStack(P_RED.dust(), 32), new ComparableStack(ModItems.circuit_gold, 1), new ComparableStack(ModItems.coil_gold, 4), },250); - makeRecipe(new ComparableStack(ModBlocks.launch_pad, 1), new AStack[] {new OreDictStack(STEEL.ingot(), 4), new OreDictStack(ANY_PLASTIC.ingot(), 2), new OreDictStack(STEEL.plate(), 12), new ComparableStack(ModBlocks.machine_battery, 1), new ComparableStack(ModItems.circuit_gold, 2), },250); makeRecipe(new ComparableStack(ModItems.spawn_chopper, 1), new AStack[] {new ComparableStack(ModItems.chopper_blades, 5), new ComparableStack(ModItems.chopper_gun, 1), new ComparableStack(ModItems.chopper_head, 1), new ComparableStack(ModItems.chopper_tail, 1), new ComparableStack(ModItems.chopper_torso, 1), new ComparableStack(ModItems.chopper_wing, 2), },300); makeRecipe(new ComparableStack(ModItems.gun_defabricator, 1), new AStack[] {new OreDictStack(STEEL.ingot(), 2), new OreDictStack(ANY_PLASTIC.ingot(), 8), new OreDictStack(IRON.plate(), 5), new ComparableStack(ModItems.mechanism_special, 3), new ComparableStack(Items.diamond, 1), new ComparableStack(ModItems.plate_dalekanium, 3), },200); makeRecipe(new ComparableStack(ModItems.gun_osipr_ammo, 24), new AStack[] {new OreDictStack(STEEL.plate(), 2), new OreDictStack(REDSTONE.dust(), 1), new ComparableStack(Items.glowstone_dust, 1), },50); @@ -1027,6 +1026,21 @@ public class AssemblerRecipes { new ComparableStack(ModBlocks.glass_quartz, 16) }, 200); + + makeRecipe(new ComparableStack(ModBlocks.launch_pad_large, 1), new AStack[] { + new OreDictStack(STEEL.plateCast(), 6), + new OreDictStack(ANY_CONCRETE.any(), 64), + new OreDictStack(ANY_PLASTIC.ingot(), 16), + new ComparableStack(ModBlocks.steel_scaffold, 24), + new ComparableStack(ModItems.circuit_red_copper, 3) + }, 200); + makeRecipe(new ComparableStack(ModBlocks.launch_pad, 1), new AStack[] { + new OreDictStack(STEEL.plateWelded(), 8), + new OreDictStack(ANY_CONCRETE.any(), 8), + new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), + new ComparableStack(ModItems.circuit_gold, 1) + }, 400); + makeRecipe(new ComparableStack(ModItems.euphemium_capacitor, 1), new AStack[] { new OreDictStack(NB.ingot(), 4), @@ -1226,6 +1240,7 @@ public class AssemblerRecipes { makeRecipe(new ComparableStack(ModBlocks.secure_access_door, 1), new AStack[]{new OreDictStack(STEEL.plateCast(), 12), new OreDictStack(ALLOY.plate(), 16), new ComparableStack(ModItems.plate_polymer, 8), new ComparableStack(ModItems.motor, 4), new OreDictStack(DURA.bolt(), 32), new OreDictStack("dyeRed", 8)}, 4000); makeRecipe(new ComparableStack(ModBlocks.sliding_seal_door, 1), new AStack[]{new OreDictStack(STEEL.plate(), 12), new ComparableStack(ModItems.plate_polymer, 4), new ComparableStack(ModItems.motor, 2), new OreDictStack(DURA.bolt(), 4), new OreDictStack("dyeWhite", 2)}, 200); makeRecipe(new ComparableStack(ModBlocks.silo_hatch, 1), new AStack[]{new OreDictStack(STEEL.plateWelded(), 4), new ComparableStack(ModItems.plate_polymer, 4), new ComparableStack(ModItems.motor, 2), new OreDictStack(STEEL.bolt(), 16), new OreDictStack(KEY_GREEN, 4)}, 200); + makeRecipe(new ComparableStack(ModBlocks.silo_hatch_large, 1), new AStack[]{new OreDictStack(STEEL.plateWelded(), 6), new ComparableStack(ModItems.plate_polymer, 8), new ComparableStack(ModItems.motor, 2), new OreDictStack(STEEL.bolt(), 16), new OreDictStack(KEY_GREEN, 8)}, 200); if(Loader.isModLoaded("Mekanism")) { diff --git a/src/main/java/com/hbm/inventory/recipes/CrystallizerRecipes.java b/src/main/java/com/hbm/inventory/recipes/CrystallizerRecipes.java index 8f33e422e..05282e9bd 100644 --- a/src/main/java/com/hbm/inventory/recipes/CrystallizerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CrystallizerRecipes.java @@ -47,8 +47,9 @@ public class CrystallizerRecipes extends SerializableRecipe { @Override public void registerDefaults() { - int baseTime = 600; - int utilityTime = 100; + final int baseTime = 600; + final int utilityTime = 100; + final int mixingTime = 20; FluidStack sulfur = new FluidStack(Fluids.SULFURIC_ACID, 500); registerRecipe(COAL.ore(), new CrystallizerRecipe(ModItems.crystal_coal, baseTime)); @@ -93,8 +94,8 @@ public class CrystallizerRecipes extends SerializableRecipe { registerRecipe(new ComparableStack(Items.rotten_flesh), new CrystallizerRecipe(Items.leather, utilityTime)); registerRecipe(new ComparableStack(ModItems.coal_infernal), new CrystallizerRecipe(ModItems.solid_fuel, utilityTime)); registerRecipe(new ComparableStack(ModBlocks.stone_gneiss), new CrystallizerRecipe(ModItems.powder_lithium, utilityTime)); - registerRecipe(new ComparableStack(Items.dye, 1, 15), new CrystallizerRecipe(new ItemStack(Items.slime_ball, 4), 20), new FluidStack(Fluids.SULFURIC_ACID, 250)); - registerRecipe(new ComparableStack(Items.bone), new CrystallizerRecipe(new ItemStack(Items.slime_ball, 16), 20), new FluidStack(Fluids.SULFURIC_ACID, 1_000)); + registerRecipe(new ComparableStack(Items.dye, 1, 15), new CrystallizerRecipe(new ItemStack(Items.slime_ball, 4), mixingTime), new FluidStack(Fluids.SULFURIC_ACID, 250)); + registerRecipe(new ComparableStack(Items.bone), new CrystallizerRecipe(new ItemStack(Items.slime_ball, 16), mixingTime), new FluidStack(Fluids.SULFURIC_ACID, 1_000)); registerRecipe(new ComparableStack(DictFrame.fromOne(ModItems.plant_item, EnumPlantType.MUSTARDWILLOW)), new CrystallizerRecipe(new ItemStack(ModItems.powder_cadmium), 100).setReq(10), new FluidStack(Fluids.RADIOSOLVENT, 250)); registerRecipe(new ComparableStack(DictFrame.fromOne(ModItems.powder_ash, EnumAshType.FULLERENE)), new CrystallizerRecipe(new ItemStack(ModItems.ingot_cft), baseTime).setReq(4), new FluidStack(Fluids.XYLENE, 1_000)); @@ -105,6 +106,7 @@ public class CrystallizerRecipes extends SerializableRecipe { registerRecipe(new ComparableStack(ModItems.powder_desh_ready), new CrystallizerRecipe(ModItems.ingot_desh, baseTime)); registerRecipe(new ComparableStack(ModItems.powder_meteorite), new CrystallizerRecipe(ModItems.fragment_meteorite, utilityTime)); registerRecipe(CD.dust(), new CrystallizerRecipe(ModItems.ingot_rubber, baseTime), new FluidStack(Fluids.FISHOIL, 250)); + registerRecipe(new ComparableStack(ModItems.powder_sawdust), new CrystallizerRecipe(ModItems.cordite, mixingTime), new FluidStack(Fluids.NITROGLYCERIN, 250)); registerRecipe(new ComparableStack(ModItems.meteorite_sword_treated), new CrystallizerRecipe(ModItems.meteorite_sword_etched, baseTime)); registerRecipe(new ComparableStack(ModItems.powder_impure_osmiridium), new CrystallizerRecipe(ModItems.crystal_osmiridium, baseTime), new FluidStack(Fluids.SCHRABIDIC, 1_000)); @@ -131,12 +133,12 @@ public class CrystallizerRecipes extends SerializableRecipe { FluidStack[] dyes = new FluidStack[] {new FluidStack(Fluids.WOODOIL, 100), new FluidStack(Fluids.FISHOIL, 100)}; for(FluidStack dye : dyes) { - registerRecipe(COAL.dust(), new CrystallizerRecipe(DictFrame.fromOne(ModItems.chemical_dye, EnumChemDye.BLACK, 4), 20), dye); - registerRecipe(TI.dust(), new CrystallizerRecipe(DictFrame.fromOne(ModItems.chemical_dye, EnumChemDye.WHITE, 4), 20), dye); - registerRecipe(IRON.dust(), new CrystallizerRecipe(DictFrame.fromOne(ModItems.chemical_dye, EnumChemDye.RED, 4), 20), dye); - registerRecipe(W.dust(), new CrystallizerRecipe(DictFrame.fromOne(ModItems.chemical_dye, EnumChemDye.YELLOW, 4), 20), dye); - registerRecipe(CU.dust(), new CrystallizerRecipe(DictFrame.fromOne(ModItems.chemical_dye, EnumChemDye.GREEN, 4), 20), dye); - registerRecipe(CO.dust(), new CrystallizerRecipe(DictFrame.fromOne(ModItems.chemical_dye, EnumChemDye.BLUE, 4), 20), dye); + registerRecipe(COAL.dust(), new CrystallizerRecipe(DictFrame.fromOne(ModItems.chemical_dye, EnumChemDye.BLACK, 4), mixingTime), dye); + registerRecipe(TI.dust(), new CrystallizerRecipe(DictFrame.fromOne(ModItems.chemical_dye, EnumChemDye.WHITE, 4), mixingTime), dye); + registerRecipe(IRON.dust(), new CrystallizerRecipe(DictFrame.fromOne(ModItems.chemical_dye, EnumChemDye.RED, 4), mixingTime), dye); + registerRecipe(W.dust(), new CrystallizerRecipe(DictFrame.fromOne(ModItems.chemical_dye, EnumChemDye.YELLOW, 4), mixingTime), dye); + registerRecipe(CU.dust(), new CrystallizerRecipe(DictFrame.fromOne(ModItems.chemical_dye, EnumChemDye.GREEN, 4), mixingTime), dye); + registerRecipe(CO.dust(), new CrystallizerRecipe(DictFrame.fromOne(ModItems.chemical_dye, EnumChemDye.BLUE, 4), mixingTime), dye); } registerRecipe(new ComparableStack(DictFrame.fromOne(ModItems.oil_tar, EnumTarType.CRUDE)), new CrystallizerRecipe(DictFrame.fromOne(ModItems.oil_tar, EnumTarType.WAX), 20), new FluidStack(Fluids.CHLORINE, 250)); diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 40e1cf518..0027bced9 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -934,7 +934,7 @@ public class ClientProxy extends ServerProxy { Minecraft.getMinecraft().effectRenderer.addEffect(contrail); } if("exKerosene".equals(type)) { - ParticleContrail contrail = new ParticleContrail(man, world, x, y, z); + ParticleContrail contrail = new ParticleContrail(man, world, x, y, z, 0F, 0F, 0F, 1F); Minecraft.getMinecraft().effectRenderer.addEffect(contrail); } if("exSolid".equals(type)) { @@ -973,9 +973,26 @@ public class ClientProxy extends ServerProxy { double z = data.getDouble("posZ"); if("missileContrail".equals(type)) { + + if(Vec3.createVectorHelper(player.posX - x, player.posY - y, player.posZ - z).lengthVector() > 350) return; + float scale = data.hasKey("scale") ? data.getFloat("scale") : 1F; - ParticleContrail contrail = new ParticleContrail(man, world, x, y, z, 0, 0, 0, scale); - Minecraft.getMinecraft().effectRenderer.addEffect(contrail); + double mX = data.getDouble("moX"); + double mY = data.getDouble("moY"); + double mZ = data.getDouble("moZ"); + + /*ParticleContrail contrail = new ParticleContrail(man, world, x, y, z, 0, 0, 0, scale); + contrail.motionX = mX; + contrail.motionY = mY; + contrail.motionZ = mZ; + Minecraft.getMinecraft().effectRenderer.addEffect(contrail);*/ + + ParticleRocketFlame fx = new ParticleRocketFlame(man, world, x, y, z).setScale(scale); + fx.motionX = mX; + fx.motionY = mY; + fx.motionZ = mZ; + if(data.hasKey("maxAge")) fx.setMaxAge(data.getInteger("maxAge")); + Minecraft.getMinecraft().effectRenderer.addEffect(fx); } if("smoke".equals(type)) { diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index d6d9c7086..a89f99725 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -351,6 +351,8 @@ public class ResourceManager { public static final ResourceLocation silo_hatch_tex = new ResourceLocation(RefStrings.MODID, "textures/models/doors/silo_hatch.png"); public static WavefrontObjDisplayList silo_hatch = new WavefrontObjDisplayList(new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/doors/silo_hatch.obj"))); + public static final ResourceLocation silo_hatch_large_tex = new ResourceLocation(RefStrings.MODID, "textures/models/doors/silo_hatch_large.png"); + public static WavefrontObjDisplayList silo_hatch_large = new WavefrontObjDisplayList(new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/doors/silo_hatch_large.obj"))); //Lights diff --git a/src/main/java/com/hbm/particle/ParticleRocketFlame.java b/src/main/java/com/hbm/particle/ParticleRocketFlame.java index 72981706a..ac60a5bf5 100644 --- a/src/main/java/com/hbm/particle/ParticleRocketFlame.java +++ b/src/main/java/com/hbm/particle/ParticleRocketFlame.java @@ -21,8 +21,20 @@ public class ParticleRocketFlame extends EntityFX { super(p_i1218_1_, p_i1218_2_, p_i1218_4_, p_i1218_6_); particleIcon = ModEventHandlerClient.particleBase; maxAge = 300 + rand.nextInt(50); + this.particleScale = 1F; + } + + public ParticleRocketFlame setScale(float scale) { + this.particleScale = scale; + return this; + } + + public ParticleRocketFlame setMaxAge(int maxAge) { + this.maxAge = maxAge; + return this; } + @Override public void onUpdate() { this.prevPosX = this.posX; this.prevPosY = this.posY; @@ -30,51 +42,54 @@ public class ParticleRocketFlame extends EntityFX { this.age++; - if (this.age == this.maxAge) { + if(this.age == this.maxAge) { this.setDead(); } - this.motionX *= 0.9099999785423279D; - this.motionY *= 0.9099999785423279D; - this.motionZ *= 0.9099999785423279D; + this.motionX *= 0.91D; + this.motionY *= 0.91D; + this.motionZ *= 0.91D; - this.moveEntity(this.motionX, this.motionY, this.motionZ); + this.moveEntity(this.motionX, this.motionY, this.motionZ); } + @Override public int getFXLayer() { - return 1; - } - - public void renderParticle(Tessellator p_70539_1_, float p_70539_2_, float p_70539_3_, float p_70539_4_, float p_70539_5_, float p_70539_6_, float p_70539_7_) { - - Random urandom = new Random(this.getEntityId()); - - for(int i = 0; i < 10; i++) { - - float add = urandom.nextFloat() * 0.3F; - float dark = 1 - Math.min(((float)(age) / (float)(maxAge * 0.25F)), 1); - - this.particleRed = 1 * dark + add; - this.particleGreen = 0.6F * dark + add; - this.particleBlue = 0 + add; - - this.particleAlpha = (float) Math.pow(1 - Math.min(((float)(age) / (float)(maxAge)), 1), 0.5); - - p_70539_1_.setColorRGBA_F(this.particleRed, this.particleGreen, this.particleBlue, this.particleAlpha * 0.75F); - p_70539_1_.setNormal(0.0F, 1.0F, 0.0F); - p_70539_1_.setBrightness(240); - - float spread = (float) Math.pow(((float)(age) / (float)maxAge) * 4F, 1.5) + 1F; - - float scale = urandom.nextFloat() * 0.5F + 0.1F + ((float)(age) / (float)maxAge) * 2F; - float pX = (float) ((this.prevPosX + (this.posX - this.prevPosX) * (double)p_70539_2_ - interpPosX) + (urandom.nextGaussian() - 1D) * 0.2F * spread); - float pY = (float) ((this.prevPosY + (this.posY - this.prevPosY) * (double)p_70539_2_ - interpPosY) + (urandom.nextGaussian() - 1D) * 0.5F * spread); - float pZ = (float) ((this.prevPosZ + (this.posZ - this.prevPosZ) * (double)p_70539_2_ - interpPosZ) + (urandom.nextGaussian() - 1D) * 0.2F * spread); - - p_70539_1_.addVertexWithUV((double)(pX - p_70539_3_ * scale - p_70539_6_ * scale), (double)(pY - p_70539_4_ * scale), (double)(pZ - p_70539_5_ * scale - p_70539_7_ * scale), particleIcon.getMaxU(), particleIcon.getMaxV()); - p_70539_1_.addVertexWithUV((double)(pX - p_70539_3_ * scale + p_70539_6_ * scale), (double)(pY + p_70539_4_ * scale), (double)(pZ - p_70539_5_ * scale + p_70539_7_ * scale), particleIcon.getMaxU(), particleIcon.getMinV()); - p_70539_1_.addVertexWithUV((double)(pX + p_70539_3_ * scale + p_70539_6_ * scale), (double)(pY + p_70539_4_ * scale), (double)(pZ + p_70539_5_ * scale + p_70539_7_ * scale), particleIcon.getMinU(), particleIcon.getMinV()); - p_70539_1_.addVertexWithUV((double)(pX + p_70539_3_ * scale - p_70539_6_ * scale), (double)(pY - p_70539_4_ * scale), (double)(pZ + p_70539_5_ * scale - p_70539_7_ * scale), particleIcon.getMinU(), particleIcon.getMaxV()); - } - } + return 1; + } + + @Override + public void renderParticle(Tessellator p_70539_1_, float interp, float sX, float sY, float sZ, float dX, float dZ) { + + Random urandom = new Random(this.getEntityId()); + + for(int i = 0; i < 10; i++) { + + float add = urandom.nextFloat() * 0.3F; + float dark = 1 - Math.min(((float) (age) / (float) (maxAge * 0.25F)), 1); + + this.particleRed = 1 * dark + add; + this.particleGreen = 0.6F * dark + add; + this.particleBlue = 0 + add; + + this.particleAlpha = (float) Math.pow(1 - Math.min(((float) (age) / (float) (maxAge)), 1), 0.5); + + p_70539_1_.setColorRGBA_F(this.particleRed, this.particleGreen, this.particleBlue, this.particleAlpha * 0.75F); + p_70539_1_.setNormal(0.0F, 1.0F, 0.0F); + p_70539_1_.setBrightness(240); + + float spread = (float) Math.pow(((float) (age) / (float) maxAge) * 4F, 1.5) + 1F; + spread *= this.particleScale; + + float scale = (urandom.nextFloat() * 0.5F + 0.1F + ((float) (age) / (float) maxAge) * 2F) * particleScale; + float pX = (float) ((this.prevPosX + (this.posX - this.prevPosX) * (double) interp - interpPosX) + (urandom.nextGaussian() - 1D) * 0.2F * spread); + float pY = (float) ((this.prevPosY + (this.posY - this.prevPosY) * (double) interp - interpPosY) + (urandom.nextGaussian() - 1D) * 0.5F * spread); + float pZ = (float) ((this.prevPosZ + (this.posZ - this.prevPosZ) * (double) interp - interpPosZ) + (urandom.nextGaussian() - 1D) * 0.2F * spread); + + p_70539_1_.addVertexWithUV((double) (pX - sX * scale - dX * scale), (double) (pY - sY * scale), (double) (pZ - sZ * scale - dZ * scale), particleIcon.getMaxU(), particleIcon.getMaxV()); + p_70539_1_.addVertexWithUV((double) (pX - sX * scale + dX * scale), (double) (pY + sY * scale), (double) (pZ - sZ * scale + dZ * scale), particleIcon.getMaxU(), particleIcon.getMinV()); + p_70539_1_.addVertexWithUV((double) (pX + sX * scale + dX * scale), (double) (pY + sY * scale), (double) (pZ + sZ * scale + dZ * scale), particleIcon.getMinU(), particleIcon.getMinV()); + p_70539_1_.addVertexWithUV((double) (pX + sX * scale - dX * scale), (double) (pY - sY * scale), (double) (pZ + sZ * scale - dZ * scale), particleIcon.getMinU(), particleIcon.getMaxV()); + } + } } diff --git a/src/main/java/com/hbm/particle/ParticleSmokePlume.java b/src/main/java/com/hbm/particle/ParticleSmokePlume.java index c17b2e6ea..9ccd4d6ee 100644 --- a/src/main/java/com/hbm/particle/ParticleSmokePlume.java +++ b/src/main/java/com/hbm/particle/ParticleSmokePlume.java @@ -30,7 +30,8 @@ public class ParticleSmokePlume extends EntityFX { public ParticleSmokePlume(TextureManager p_i1213_1_, World p_i1218_1_, double p_i1218_2_, double p_i1218_4_, double p_i1218_6_) { super(p_i1218_1_, p_i1218_2_, p_i1218_4_, p_i1218_6_); theRenderEngine = p_i1213_1_; - maxAge = 100 + rand.nextInt(40); + maxAge = 80 + rand.nextInt(20); + this.particleScale = 0.25F; } public void onUpdate() { @@ -39,6 +40,8 @@ public class ParticleSmokePlume extends EntityFX { this.prevPosZ = this.posZ; particleAlpha = 1 - ((float) age / (float) maxAge); + float prevScale = this.particleScale; + this.particleScale = 0.25F + ((float) age / (float) maxAge) * 2; ++this.age; @@ -48,9 +51,9 @@ public class ParticleSmokePlume extends EntityFX { double bak = Vec3.createVectorHelper(motionX, motionY, motionZ).lengthVector(); - this.moveEntity(this.motionX, this.motionY, this.motionZ); + this.moveEntity(this.motionX, this.motionY + (this.particleScale - prevScale), this.motionZ); - if(Math.abs(motionX) < 0.025 && Math.abs(motionZ) < 0.025) { + if(this.isCollidedVertically) { motionY = bak; } @@ -85,16 +88,16 @@ public class ParticleSmokePlume extends EntityFX { p_70539_1_.startDrawingQuads(); - this.particleRed = this.particleGreen = this.particleBlue = urandom.nextFloat() * 0.7F + 0.2F; + this.particleRed = this.particleGreen = this.particleBlue = urandom.nextFloat() * 0.75F + 0.1F; p_70539_1_.setColorRGBA_F(this.particleRed, this.particleGreen, this.particleBlue, this.particleAlpha); p_70539_1_.setNormal(0.0F, 1.0F, 0.0F); p_70539_1_.setBrightness(240); - float scale = 0.5F; - float pX = (float) ((this.prevPosX + (this.posX - this.prevPosX) * (double) p_70539_2_ - dX) + urandom.nextGaussian() * 0.5); - float pY = (float) ((this.prevPosY + (this.posY - this.prevPosY) * (double) p_70539_2_ - dY) + urandom.nextGaussian() * 0.5); - float pZ = (float) ((this.prevPosZ + (this.posZ - this.prevPosZ) * (double) p_70539_2_ - dZ) + urandom.nextGaussian() * 0.5); + float scale = this.particleScale; + float pX = (float) ((this.prevPosX + (this.posX - this.prevPosX) * (double) p_70539_2_ - dX) + urandom.nextGaussian() * 0.5 * scale); + float pY = (float) ((this.prevPosY + (this.posY - this.prevPosY) * (double) p_70539_2_ - dY) + urandom.nextGaussian() * 0.5 * scale); + float pZ = (float) ((this.prevPosZ + (this.posZ - this.prevPosZ) * (double) p_70539_2_ - dZ) + urandom.nextGaussian() * 0.5 * scale); p_70539_1_.addVertexWithUV((double) (pX - p_70539_3_ * scale - p_70539_6_ * scale), (double) (pY - p_70539_4_ * scale), (double) (pZ - p_70539_5_ * scale - p_70539_7_ * scale), 1, 1); p_70539_1_.addVertexWithUV((double) (pX - p_70539_3_ * scale + p_70539_6_ * scale), (double) (pY + p_70539_4_ * scale), (double) (pZ - p_70539_5_ * scale + p_70539_7_ * scale), 1, 0); diff --git a/src/main/java/com/hbm/render/item/ItemRenderLibrary.java b/src/main/java/com/hbm/render/item/ItemRenderLibrary.java index cec57ea6d..83f42ca39 100644 --- a/src/main/java/com/hbm/render/item/ItemRenderLibrary.java +++ b/src/main/java/com/hbm/render/item/ItemRenderLibrary.java @@ -743,10 +743,30 @@ public class ItemRenderLibrary { GL11.glTranslated(0, 0.875, -1.875); GL11.glRotated(-120, 1, 0, 0); GL11.glTranslated(0, -0.875, 1.875); + GL11.glTranslated(0, 0.25, 0); ResourceManager.silo_hatch.renderPart("Hatch"); GL11.glShadeModel(GL11.GL_FLAT); } }); + renderers.put(Item.getItemFromBlock(ModBlocks.silo_hatch_large), new ItemRenderBase(){ + public void renderInventory() { + GL11.glTranslated(0, -2, 0); + GL11.glScaled(1.5, 1.5, 1.5); + } + public void renderCommon() { + bindTexture(ResourceManager.silo_hatch_large_tex); + GL11.glShadeModel(GL11.GL_SMOOTH); + GL11.glTranslated(1, 0, 0); + GL11.glRotated(90, 0, 1, 0); + ResourceManager.silo_hatch_large.renderPart("Frame"); + GL11.glTranslated(0, 0.875, -2.875); + GL11.glRotated(-120, 1, 0, 0); + GL11.glTranslated(0, -0.875, 2.875); + GL11.glTranslated(0, 0.25, 0); + ResourceManager.silo_hatch_large.renderPart("Hatch"); + GL11.glShadeModel(GL11.GL_FLAT); + } + }); renderers.put(Item.getItemFromBlock(ModBlocks.qe_containment), new ItemRenderBase(){ public void renderInventory() { GL11.glTranslated(0, -3.5, 0); diff --git a/src/main/java/com/hbm/render/tileentity/RenderLaunchPadLarge.java b/src/main/java/com/hbm/render/tileentity/RenderLaunchPadLarge.java index 468ebbaca..4ddd583dd 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderLaunchPadLarge.java +++ b/src/main/java/com/hbm/render/tileentity/RenderLaunchPadLarge.java @@ -5,18 +5,23 @@ import java.util.function.Consumer; import org.lwjgl.opengl.GL11; import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ModBlocks; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.items.weapon.ItemMissile; import com.hbm.items.weapon.ItemMissile.MissileFormFactor; import com.hbm.main.ResourceManager; +import com.hbm.render.item.ItemRenderBase; import com.hbm.render.item.ItemRenderMissileGeneric; import com.hbm.tileentity.bomb.TileEntityLaunchPadLarge; import net.minecraft.client.renderer.texture.TextureManager; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.client.IItemRenderer; -public class RenderLaunchPadLarge extends TileEntitySpecialRenderer { +public class RenderLaunchPadLarge extends TileEntitySpecialRenderer implements IItemRendererProvider { @Override public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float f) { @@ -97,4 +102,30 @@ public class RenderLaunchPadLarge extends TileEntitySpecialRenderer { GL11.glPopMatrix(); } + + @Override + public Item getItemForRenderer() { + return Item.getItemFromBlock(ModBlocks.launch_pad_large); + } + + @Override + public IItemRenderer getRenderer() { + return new ItemRenderBase( ) { + public void renderInventory() { + GL11.glTranslated(0, -3.75, 0); + GL11.glScaled(1.625, 1.625, 1.625); + } + public void renderCommonWithStack(ItemStack item) { + GL11.glScaled(0.5, 0.5, 0.5); + GL11.glRotatef(90, 0F, 1F, 0F); + GL11.glShadeModel(GL11.GL_SMOOTH); + bindTexture(ResourceManager.missile_erector_tex); + ResourceManager.missile_erector.renderPart("Pad"); + bindTexture(ResourceManager.missile_erector_atlas_tex); + ResourceManager.missile_erector.renderPart("Atlas_Pad"); + ResourceManager.missile_erector.renderPart("Atlas_Erector"); + ResourceManager.missile_erector.renderPart("Atlas_Pivot"); + GL11.glShadeModel(GL11.GL_FLAT); + }}; + } } diff --git a/src/main/java/com/hbm/tileentity/DoorDecl.java b/src/main/java/com/hbm/tileentity/DoorDecl.java index 584f23d2c..5844fcded 100644 --- a/src/main/java/com/hbm/tileentity/DoorDecl.java +++ b/src/main/java/com/hbm/tileentity/DoorDecl.java @@ -922,6 +922,66 @@ public abstract class DoorDecl { }; + public static final DoorDecl SILO_HATCH_LARGE = new DoorDecl() { + + @Override public String getOpenSoundEnd() { return "hbm:door.wgh_big_stop"; }; + @Override public String getOpenSoundLoop() { return "hbm:door.wgh_big_start"; }; + @Override public String getOpenSoundStart() { return null; }; + @Override public String getCloseSoundStart() { return null; }; + @Override public String getCloseSoundEnd() { return "hbm:door.wgh_big_stop"; }; + @Override public float getSoundVolume() { return 2; } + @Override public boolean remoteControllable() { return true; } + + @Override + @SideOnly(Side.CLIENT) + public void getTranslation(String partName, float openTicks, boolean child, float[] trans) { + if("Hatch".equals(partName)) { + set(trans, 0, 0.25F * Library.smoothstep(getNormTime(openTicks, 0, 10), 0, 1), 0); + } else { + set(trans, 0, 0, 0); + } + }; + + @Override + @SideOnly(Side.CLIENT) + public void getOrigin(String partName, float[] orig) { + if("Hatch".equals(partName)) { + set(orig, 0F, 0.875F, -2.875F); + return; + } + set(orig, 0, 0, 0); + super.getOrigin(partName, orig); + }; + + @Override + @SideOnly(Side.CLIENT) + public void getRotation(String partName, float openTicks, float[] rot) { + if("Hatch".equals(partName)) { + set(rot, Library.smoothstep(getNormTime(openTicks, 20, 100), 0, 1) * -240, 0, 0); + return; + } + super.getRotation(partName, openTicks, rot); + }; + + @Override + @SideOnly(Side.CLIENT) + public boolean doesRender(String partName, boolean child) { + return true; + }; + + @Override public int timeToOpen() { return 60; }; + @Override public int[][] getDoorOpenRanges() { return new int[][] { { 2, 0, 1, -3, 3, 0 }, { 1, 0, 2, -5, 3, 0 }, { 0, 0, 2, -5, 3, 0 }, { -1, 0, 2, -5, 3, 0 }, { -2, 0, 1, -3, 3, 0 } }; } + @Override public float getDoorRangeOpenTime(int ticks, int idx) { return getNormTime(ticks, 20, 20); }; + + + @Override public int getBlockOffset() { return 3; } + @Override public int[] getDimensions() { return new int[] { 0, 0, 3, 3, 3, 3 }; } + @Override @SideOnly(Side.CLIENT) public ResourceLocation getTextureForPart(String partName) { return ResourceManager.silo_hatch_large_tex; } + @Override public ResourceLocation getTextureForPart(int skinIndex, String partName) { return ResourceManager.silo_hatch_large_tex; } + @Override @SideOnly(Side.CLIENT) public WavefrontObjDisplayList getModel() { return ResourceManager.silo_hatch_large; } + + }; + public static final DoorDecl LARGE_VEHICLE_DOOR = new DoorDecl() { @Override diff --git a/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java b/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java index 8f7cdaa8f..a8f856310 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java +++ b/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java @@ -167,7 +167,7 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase implements IAn public DoorDecl getDoorType(){ - if(this.doorType == null) + if(this.doorType == null && this.getBlockType() instanceof BlockDoorGeneric) this.doorType = ((BlockDoorGeneric)this.getBlockType()).type; return this.doorType; diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPad.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPad.java index 2b7c53dea..a2b9e565c 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPad.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPad.java @@ -1,16 +1,24 @@ package com.hbm.tileentity.bomb; +import java.util.List; + +import com.hbm.entity.missile.EntityMissileBaseNT; +import com.hbm.lib.Library; +import com.hbm.main.MainRegistry; +import com.hbm.util.fauxpointtwelve.DirPos; + import api.hbm.energy.IEnergyUser; import api.hbm.fluid.IFluidStandardReceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; +import net.minecraftforge.common.util.ForgeDirection; public class TileEntityLaunchPad extends TileEntityLaunchPadBase implements IEnergyUser, IFluidStandardReceiver { @Override public boolean isReadyForLaunch() { return delay <= 0; } - @Override public double getLaunchOffset() { return 2D; } + @Override public double getLaunchOffset() { return 1D; } public int delay = 0; @@ -24,11 +32,52 @@ public class TileEntityLaunchPad extends TileEntityLaunchPadBase implements IEne if(!this.isMissileValid() || !this.hasFuel()) { this.delay = 100; } + + if(!this.hasFuel() || !this.isMissileValid()) { + this.state = this.STATE_MISSING; + } else { + if(this.delay > 0) { + this.state = this.STATE_LOADING; + } else { + this.state = this.STATE_READY; + } + } + + } else { + + List entities = worldObj.getEntitiesWithinAABB(EntityMissileBaseNT.class, AxisAlignedBB.getBoundingBox(xCoord - 0.5, yCoord, zCoord - 0.5, xCoord + 1.5, yCoord + 10, zCoord + 1.5)); + + if(!entities.isEmpty()) { + for(int i = 0; i < 15; i++) { + + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); + if(worldObj.rand.nextBoolean()) dir = dir.getOpposite(); + if(worldObj.rand.nextBoolean()) dir = dir.getRotation(ForgeDirection.UP); + float moX = (float) (worldObj.rand.nextGaussian() * 0.15F + 0.75) * dir.offsetX; + float moZ = (float) (worldObj.rand.nextGaussian() * 0.15F + 0.75) * dir.offsetZ; + + MainRegistry.proxy.spawnParticle(xCoord + 0.5, yCoord + 0.25, zCoord + 0.5, "launchsmoke", new float[] {moX, 0, moZ}); + } + } } super.updateEntity(); } + @Override + public DirPos[] getConPos() { + return new DirPos[] { + new DirPos(xCoord + 2, yCoord, zCoord - 1, Library.POS_X), + new DirPos(xCoord + 2, yCoord, zCoord + 1, Library.POS_X), + new DirPos(xCoord - 2, yCoord, zCoord - 1, Library.NEG_X), + new DirPos(xCoord - 2, yCoord, zCoord + 1, Library.NEG_X), + new DirPos(xCoord - 1, yCoord, zCoord + 2, Library.POS_Z), + new DirPos(xCoord + 1, yCoord, zCoord + 2, Library.POS_Z), + new DirPos(xCoord - 1, yCoord, zCoord - 2, Library.NEG_Z), + new DirPos(xCoord + 1, yCoord, zCoord - 2, Library.NEG_Z) + }; + } + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadBase.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadBase.java index efe1d593e..6236d950b 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadBase.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadBase.java @@ -48,7 +48,9 @@ import com.hbm.main.MainRegistry; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.IRadarCommandReceiver; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.TrackerUtil; import com.hbm.util.fauxpointtwelve.BlockPos; +import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.energy.IEnergyUser; import api.hbm.fluid.IFluidStandardReceiver; @@ -66,6 +68,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.MathHelper; import net.minecraft.util.Vec3; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; public abstract class TileEntityLaunchPadBase extends TileEntityMachineBase implements IEnergyUser, IFluidStandardReceiver, IGUIProvider, IRadarCommandReceiver { @@ -116,6 +119,11 @@ public abstract class TileEntityLaunchPadBase extends TileEntityMachineBase impl public int redstonePower; public Set activatedBlocks = new HashSet<>(4); + public int state = 0; + public static final int STATE_MISSING = 0; + public static final int STATE_LOADING = 1; + public static final int STATE_READY = 2; + public FluidTank[] tanks; public TileEntityLaunchPadBase() { @@ -129,12 +137,37 @@ public abstract class TileEntityLaunchPadBase extends TileEntityMachineBase impl public String getName() { return "container.launchPad"; } + + @Override + public boolean canExtractItem(int slot, ItemStack itemStack, int side) { + return false; + } + + @Override + public int[] getAccessibleSlotsFromSide(int side) { + return new int[] { 0 }; + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack stack) { + return slot == 0 && this.isMissileValid(stack); + } + + public abstract DirPos[] getConPos(); @Override public void updateEntity() { if(!worldObj.isRemote) { + if(worldObj.getTotalWorldTime() % 20 == 0) { + for(DirPos pos : getConPos()) { + this.trySubscribe(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + if(tanks[0].getTankType() != Fluids.NONE) this.trySubscribe(tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + if(tanks[1].getTankType() != Fluids.NONE) this.trySubscribe(tanks[1].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + } + } + if(this.redstonePower > 0 && this.prevRedstonePower == 0) { this.launchFromDesignator(); } @@ -161,6 +194,7 @@ public abstract class TileEntityLaunchPadBase extends TileEntityMachineBase impl super.serialize(buf); buf.writeLong(this.power); + buf.writeInt(this.state); tanks[0].serialize(buf); tanks[1].serialize(buf); @@ -178,6 +212,7 @@ public abstract class TileEntityLaunchPadBase extends TileEntityMachineBase impl super.deserialize(buf); this.power = buf.readLong(); + this.state = buf.readInt(); tanks[0].deserialize(buf); tanks[1].deserialize(buf); @@ -248,6 +283,10 @@ public abstract class TileEntityLaunchPadBase extends TileEntityMachineBase impl @Override public long getMaxPower() { return maxPower; } @Override public FluidTank[] getAllTanks() { return this.tanks; } @Override public FluidTank[] getReceivingTanks() { return this.tanks; } + + @Override public boolean canConnect(ForgeDirection dir) { + return dir != ForgeDirection.UP && dir != ForgeDirection.DOWN; + } @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { @@ -284,7 +323,11 @@ public abstract class TileEntityLaunchPadBase extends TileEntityMachineBase impl /** Requires the missile slot to be non-null and he item to be compatible */ public boolean isMissileValid() { - return slots[0] != null && slots[0].getItem() instanceof ItemMissile; + return slots[0] != null && isMissileValid(slots[0]); + } + + public boolean isMissileValid(ItemStack stack) { + return stack.getItem() instanceof ItemMissile; } public boolean hasFuel() { @@ -329,6 +372,7 @@ public abstract class TileEntityLaunchPadBase extends TileEntityMachineBase impl public void finalizeLaunch(Entity missile) { worldObj.spawnEntityInWorld(missile); + TrackerUtil.setTrackingRange(worldObj, missile, 500); worldObj.playSoundEffect(xCoord + 0.5, yCoord, zCoord + 0.5, "hbm:weapon.missileTakeOff", 2.0F, 1.0F); this.power -= 75_000; diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadLarge.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadLarge.java index 32cbc093b..934c43dc7 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadLarge.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadLarge.java @@ -1,11 +1,15 @@ package com.hbm.tileentity.bomb; +import java.util.List; + +import com.hbm.entity.missile.EntityMissileBaseNT; import com.hbm.items.weapon.ItemMissile; import com.hbm.items.weapon.ItemMissile.MissileFormFactor; +import com.hbm.lib.Library; import com.hbm.main.MainRegistry; import com.hbm.sound.AudioWrapper; -import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.IRadarCommandReceiver; +import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.energy.IEnergyUser; import api.hbm.fluid.IFluidStandardReceiver; @@ -14,8 +18,9 @@ import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; +import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase implements IEnergyUser, IFluidStandardReceiver, IGUIProvider, IRadarCommandReceiver { +public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase implements IEnergyUser, IFluidStandardReceiver, IRadarCommandReceiver { public int formFactor = -1; /** Whether the missile has already been placed on the launchpad. Missile will render statically on the pad if true */ @@ -105,6 +110,8 @@ public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase implements //only extend if the erector isn't up yet and the missile can be loaded if(!erected && readyToLoad) { + this.state = this.STATE_LOADING; + //first, rotate the erector if(erector != 0F) { erector = Math.max(erector - erectorSpeed, 0F); @@ -135,6 +142,9 @@ public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase implements } } } + + if(!this.hasFuel() || !this.isMissileValid()) this.state = this.STATE_MISSING; + if(this.erected && this.canLaunch()) this.state = this.STATE_READY; boolean prevLiftMoving = this.liftMoving; boolean prevErectorMoving = this.erectorMoving; @@ -200,6 +210,20 @@ public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase implements data.setFloat("strafe", 0.05F); for(int i = 0; i < 3; i++) MainRegistry.proxy.effectNT(data); } + + List entities = worldObj.getEntitiesWithinAABB(EntityMissileBaseNT.class, AxisAlignedBB.getBoundingBox(xCoord - 0.5, yCoord, zCoord - 0.5, xCoord + 1.5, yCoord + 10, zCoord + 1.5)); + + if(!entities.isEmpty()) { + for(int i = 0; i < 15; i++) { + + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); + if(worldObj.rand.nextBoolean()) dir = dir.getOpposite(); + float moX = (float) (worldObj.rand.nextGaussian() * 0.15F + 0.75) * dir.offsetX; + float moZ = (float) (worldObj.rand.nextGaussian() * 0.15F + 0.75) * dir.offsetZ; + + MainRegistry.proxy.spawnParticle(xCoord + 0.5, yCoord + 0.25, zCoord + 0.5, "launchsmoke", new float[] {moX, 0, moZ}); + } + } } super.updateEntity(); @@ -257,6 +281,20 @@ public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase implements nbt.setInteger("formFactor", formFactor); } + @Override + public DirPos[] getConPos() { + return new DirPos[] { + new DirPos(xCoord + 5, yCoord, zCoord - 2, Library.POS_X), + new DirPos(xCoord + 5, yCoord, zCoord + 2, Library.POS_X), + new DirPos(xCoord - 5, yCoord, zCoord - 2, Library.NEG_X), + new DirPos(xCoord - 5, yCoord, zCoord + 2, Library.NEG_X), + new DirPos(xCoord - 2, yCoord, zCoord + 5, Library.POS_Z), + new DirPos(xCoord + 2, yCoord, zCoord + 5, Library.POS_Z), + new DirPos(xCoord - 2, yCoord, zCoord - 5, Library.NEG_Z), + new DirPos(xCoord + 2, yCoord, zCoord - 5, Library.NEG_Z) + }; + } + AxisAlignedBB bb = null; @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineReactorBreeding.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineReactorBreeding.java index b565d8358..4c42a1ce5 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineReactorBreeding.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineReactorBreeding.java @@ -84,22 +84,17 @@ public class TileEntityMachineReactorBreeding extends TileEntityMachineBase impl for(byte d = 2; d < 6; d++) { ForgeDirection dir = ForgeDirection.getOrientation(d); - Block b = worldObj.getBlock(xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ); - TileEntity te = worldObj.getTileEntity(xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ); if(b == ModBlocks.reactor_research) { int[] pos = ((ReactorResearch) ModBlocks.reactor_research).findCore(worldObj, xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ); if(pos != null) { - TileEntity tile = worldObj.getTileEntity(pos[0], pos[1], pos[2]); if(tile instanceof TileEntityReactorResearch) { - TileEntityReactorResearch reactor = (TileEntityReactorResearch) tile; - this.flux += reactor.totalFlux; } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java index 28adb277d..d5eae7f2e 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java @@ -164,12 +164,12 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG int chunkX = xCoord >> 4; int chunkZ = zCoord >> 4; - //since fluid sources are often not within 1 chunk, we just do 3 chunks distance and call it a day + //since fluid sources are often not within 1 chunk, we just do 2 chunks distance and call it a day if(!worldObj.getChunkProvider().chunkExists(chunkX, chunkZ) || - !worldObj.getChunkProvider().chunkExists(chunkX + 3, chunkZ + 3) || - !worldObj.getChunkProvider().chunkExists(chunkX + 3, chunkZ - 3) || - !worldObj.getChunkProvider().chunkExists(chunkX - 3, chunkZ + 3) || - !worldObj.getChunkProvider().chunkExists(chunkX - 3, chunkZ - 3)) { + !worldObj.getChunkProvider().chunkExists(chunkX + 2, chunkZ + 2) || + !worldObj.getChunkProvider().chunkExists(chunkX + 2, chunkZ - 2) || + !worldObj.getChunkProvider().chunkExists(chunkX - 2, chunkZ + 2) || + !worldObj.getChunkProvider().chunkExists(chunkX - 2, chunkZ - 2)) { this.unloadDelay = 60; } diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineHydrotreater.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineHydrotreater.java index 8590c8098..afdd0fa7b 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineHydrotreater.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineHydrotreater.java @@ -82,12 +82,14 @@ public class TileEntityMachineHydrotreater extends TileEntityMachineBase impleme @Override public void serialize(ByteBuf buf) { super.serialize(buf); + buf.writeLong(power); for(int i = 0; i < 4; i++) tanks[i].serialize(buf); } @Override public void deserialize(ByteBuf buf) { super.deserialize(buf); + this.power = buf.readLong(); for(int i = 0; i < 4; i++) tanks[i].deserialize(buf); } diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java index 03b54b68b..2e0775a00 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java @@ -240,6 +240,8 @@ public class TileEntityTurretArty extends TileEntityTurretBaseArtillery implemen } this.lastRotationPitch = this.rotationPitch; this.lastRotationYaw = this.rotationYaw; + this.rotationPitch = this.syncRotationPitch; + this.rotationYaw = this.syncRotationYaw; } if(!worldObj.isRemote) { diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHIMARS.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHIMARS.java index 1e366da9f..fcfc1d074 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHIMARS.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHIMARS.java @@ -139,6 +139,8 @@ public class TileEntityTurretHIMARS extends TileEntityTurretBaseArtillery implem this.lastRotationPitch = this.rotationPitch; this.lastRotationYaw = this.rotationYaw; this.lastCrane = this.crane; + this.rotationPitch = this.syncRotationPitch; + this.rotationYaw = this.syncRotationYaw; } if(!worldObj.isRemote) { diff --git a/src/main/java/com/hbm/wiaj/WorldInAJar.java b/src/main/java/com/hbm/wiaj/WorldInAJar.java index e1e6e7b47..7f2fc1266 100644 --- a/src/main/java/com/hbm/wiaj/WorldInAJar.java +++ b/src/main/java/com/hbm/wiaj/WorldInAJar.java @@ -83,7 +83,7 @@ public class WorldInAJar implements IBlockAccess { } //always render fullbright, if the situation requires it we could add a very rudimentary system that - //darkens blocks id there is a solid one above + //darkens blocks if there is a solid one above @Override @SideOnly(Side.CLIENT) public int getLightBrightnessForSkyBlocks(int x, int y, int z, int blockBrightness) { diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index fd89e6138..27a5fadc8 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -4505,6 +4505,7 @@ tile.sellafield_core.name=Sellafit-Corium tile.sellafield_slaked.name=Gelöschtes Sellafit tile.semtex.name=Semtex tile.silo_hatch.name=Siloluke +tile.silo_hatch_large.name=Große Siloluke tile.sliding_blast_door.name=Sprengtür tile.solar_mirror.name=Heliostatspiegel tile.soyuz_capsule.name=Landekapsel diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 0a827d824..3038841af 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -5518,6 +5518,7 @@ tile.sellafield.5.name=Sellafite-Corium tile.sellafield_slaked.name=Slaked Sellafite tile.semtex.name=Semtex tile.silo_hatch.name=Silo Hatch +tile.silo_hatch_large.name=Large Silo Hatch tile.sliding_blast_door.name=Sliding Blast Door tile.solar_mirror.name=Heliostat Mirror tile.soyuz_capsule.name=Cargo Landing Capsule diff --git a/src/main/resources/assets/hbm/models/doors/silo_hatch_large.obj b/src/main/resources/assets/hbm/models/doors/silo_hatch_large.obj new file mode 100644 index 000000000..c8f7bfe4a --- /dev/null +++ b/src/main/resources/assets/hbm/models/doors/silo_hatch_large.obj @@ -0,0 +1,576 @@ +# Blender v2.79 (sub 0) OBJ File: 'silo_hatch_large.blend' +# www.blender.org +o Hatch +v 2.750000 0.750000 -1.750000 +v 1.750000 0.750000 -2.750000 +v -2.750000 0.750000 -1.750000 +v -1.750000 0.750000 -2.750000 +v -2.750000 0.750000 1.750000 +v -1.750000 0.750000 2.750000 +v -2.750000 1.000000 -1.750000 +v -2.750000 1.000000 1.750000 +v 2.750000 1.000000 -1.750000 +v 2.750000 1.000000 1.750000 +v 1.750000 1.000000 2.750000 +v -1.750000 1.000000 2.750000 +v 2.750000 0.750000 1.750000 +v 1.750000 0.750000 2.750000 +v 1.750000 1.000000 -2.750000 +v -1.750000 1.000000 -2.750000 +v -1.250000 0.750000 -2.500000 +v 1.250000 0.750000 -2.500000 +v -1.250000 0.750000 -3.000000 +v 1.250000 0.750000 -3.000000 +v -1.250000 0.500000 -3.000000 +v -1.250000 0.500000 -2.500000 +v 1.250000 0.500000 -2.500000 +v 1.250000 0.500000 -3.000000 +v -1.500000 0.750000 -2.500000 +v 1.500000 0.750000 -2.500000 +v -1.500000 0.750000 2.500000 +v 1.500000 0.750000 2.500000 +v 2.500000 0.750000 1.500000 +v 2.500000 0.750000 -1.500000 +v -2.500000 0.750000 -1.500000 +v -2.500000 0.750000 1.500000 +v 1.500000 0.500000 -2.500000 +v 2.500000 0.500000 -1.500000 +v 2.500000 0.500000 1.500000 +v -1.500000 0.500000 2.500000 +v 1.500000 0.500000 2.500000 +v -2.500000 0.500000 -1.500000 +v -2.500000 0.500000 1.500000 +v -1.500000 0.500000 -2.500000 +vt 0.918367 0.620690 +vt 1.000000 0.603448 +vt 1.000000 0.620690 +vt 0.918367 0.620690 +vt 1.000000 0.603448 +vt 1.000000 0.620690 +vt 0.632653 0.620690 +vt 0.918367 0.603448 +vt 0.918367 0.620690 +vt 0.632653 0.620690 +vt 0.918367 0.603448 +vt 0.632653 0.620690 +vt 0.918367 0.603448 +vt 1.000000 0.603448 +vt 1.000000 0.620690 +vt 0.918367 0.620690 +vt 1.000000 0.603448 +vt 1.000000 0.620690 +vt 0.632653 0.620690 +vt 0.918367 0.603448 +vt 0.653061 0.586207 +vt 0.897959 0.586207 +vt 0.918367 1.000000 +vt 0.551020 0.931035 +vt 0.816327 0.224138 +vt 0.612245 0.189655 +vt 0.816327 0.189655 +vt 0.612245 0.172414 +vt 0.816327 0.137931 +vt 0.816327 0.172414 +vt 0.571429 0.189655 +vt 0.857143 0.172414 +vt 0.857143 0.189655 +vt 1.000000 0.586207 +vt 0.653061 0.586207 +vt 0.897959 0.586207 +vt 1.000000 0.586207 +vt 0.918367 0.586207 +vt 1.000000 0.586207 +vt 0.653061 0.586207 +vt 0.897959 0.586207 +vt 1.000000 0.586207 +vt 0.918367 0.586207 +vt 0.632653 0.603448 +vt 0.897959 0.586207 +vt 0.918367 0.586207 +vt 1.000000 0.568965 +vt 0.653061 0.568965 +vt 0.571429 0.293103 +vt 0.897959 0.224138 +vt 0.897959 0.568965 +vt 0.653061 0.586207 +vt 0.897959 0.568965 +vt 1.000000 0.568965 +vt 1.000000 0.568965 +vt 0.897959 0.568965 +vt 0.918367 0.586207 +vt 1.000000 0.568965 +vt 0.897959 0.568965 +vt 0.632653 0.603448 +vt 0.632653 0.603448 +vt 0.632653 0.603448 +vt 1.000000 0.689655 +vt 1.000000 0.931035 +vt 0.632653 1.000000 +vt 0.551020 0.689655 +vt 0.612245 0.224138 +vt 0.612245 0.137931 +vt 0.571429 0.172414 +vt 0.918367 0.568965 +vt 0.979592 0.293103 +vt 0.979592 0.500000 +vt 0.571429 0.500000 +vt 0.653061 0.224138 +vt 0.653061 0.568965 +vt 0.918367 0.568965 +vt 0.918367 0.568965 +vt 0.653061 0.568965 +vt 0.918367 0.568965 +vt 0.653061 0.568965 +vn 0.7071 0.0000 0.7071 +vn -0.7071 0.0000 -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.7071 0.0000 0.7071 +vn 0.7071 0.0000 -0.7071 +vn 1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +s off +f 11/1/1 13/2/1 10/3/1 +f 16/4/2 3/5/2 7/6/2 +f 7/7/3 5/8/3 8/9/3 +f 12/10/4 14/11/4 11/1/4 +f 15/12/5 4/13/5 16/4/5 +f 8/9/6 6/14/6 12/15/6 +f 9/16/7 2/17/7 15/18/7 +f 10/19/8 1/20/8 9/16/8 +f 14/11/9 27/21/9 28/22/9 +f 15/23/10 7/24/10 12/10/10 +f 17/25/10 20/26/10 19/27/10 +f 24/28/9 22/29/9 21/30/9 +f 18/31/8 24/28/8 20/26/8 +f 20/26/5 21/30/5 19/27/5 +f 19/27/3 22/32/3 17/33/3 +f 14/11/9 29/34/9 13/2/9 +f 1/20/9 29/35/9 30/36/9 +f 26/37/9 1/20/9 30/38/9 +f 5/8/9 27/39/9 6/14/9 +f 5/8/9 31/40/9 32/41/9 +f 31/42/9 4/13/9 25/43/9 +f 2/44/9 25/45/9 4/13/9 +f 28/46/1 35/47/1 29/34/1 +f 36/48/9 38/49/9 33/50/9 +f 27/21/4 37/51/4 28/22/4 +f 26/52/5 40/53/5 25/45/5 +f 25/43/2 38/54/2 31/42/2 +f 30/38/7 33/55/7 26/37/7 +f 31/40/3 39/56/3 32/41/3 +f 32/57/6 36/58/6 27/39/6 +f 29/35/8 34/59/8 30/36/8 +f 11/1/1 14/11/1 13/2/1 +f 16/4/2 4/13/2 3/5/2 +f 7/7/3 3/60/3 5/8/3 +f 12/10/4 6/61/4 14/11/4 +f 15/12/5 2/44/5 4/13/5 +f 8/9/6 5/8/6 6/14/6 +f 9/16/7 1/20/7 2/17/7 +f 10/19/8 13/62/8 1/20/8 +f 14/11/9 6/61/9 27/21/9 +f 12/10/10 11/1/10 10/63/10 +f 10/63/10 9/64/10 15/23/10 +f 15/23/10 16/65/10 7/24/10 +f 7/24/10 8/66/10 12/10/10 +f 12/10/10 10/63/10 15/23/10 +f 17/25/10 18/67/10 20/26/10 +f 24/28/9 23/68/9 22/29/9 +f 18/31/8 23/69/8 24/28/8 +f 20/26/5 24/28/5 21/30/5 +f 19/27/3 21/30/3 22/32/3 +f 14/11/9 28/46/9 29/34/9 +f 1/20/9 13/62/9 29/35/9 +f 26/37/9 2/17/9 1/20/9 +f 5/8/9 32/57/9 27/39/9 +f 5/8/9 3/60/9 31/40/9 +f 31/42/9 3/5/9 4/13/9 +f 2/44/9 26/52/9 25/45/9 +f 28/46/1 37/70/1 35/47/1 +f 33/50/9 34/71/9 35/72/9 +f 35/72/9 37/51/9 36/48/9 +f 36/48/9 39/73/9 38/49/9 +f 38/49/9 40/74/9 33/50/9 +f 33/50/9 35/72/9 36/48/9 +f 27/21/4 36/48/4 37/51/4 +f 26/52/5 33/75/5 40/53/5 +f 25/43/2 40/76/2 38/54/2 +f 30/38/7 34/77/7 33/55/7 +f 31/40/3 38/78/3 39/56/3 +f 32/57/6 39/79/6 36/58/6 +f 29/35/8 35/80/8 34/59/8 +o Frame +v -2.500000 0.000000 1.500000 +v -2.500000 0.000000 -3.500000 +v 2.500000 0.000000 -3.500000 +v -3.250000 1.000000 -2.250000 +v -2.500000 0.250000 -3.500000 +v 2.500000 0.250000 -3.500000 +v -3.250000 1.000000 2.250000 +v -2.250000 1.000000 -3.250000 +v 2.250000 1.000000 -3.250000 +v -3.500000 0.250000 -2.500000 +v -1.500000 0.000000 -2.500000 +v 1.500000 0.000000 -2.500000 +v -1.500000 0.750000 -2.500000 +v -3.500000 0.250000 2.500000 +v 1.500000 0.750000 -2.500000 +v -3.500000 0.000000 -2.500000 +v -1.750000 0.750000 -2.750000 +v 1.750000 0.750000 -2.750000 +v -3.500000 0.000000 2.500000 +v -1.750000 1.000000 -2.750000 +v 1.750000 1.000000 -2.750000 +v -1.250000 0.750000 -2.750000 +v 1.250000 0.750000 -2.750000 +v 1.250000 0.500000 -2.500000 +v -1.250000 0.500000 -2.500000 +v -1.250000 1.000000 -2.750000 +v 1.250000 1.000000 -2.750000 +v -1.250000 1.000000 -3.000000 +v 1.250000 1.000000 -3.000000 +v -1.250000 0.500000 -3.000000 +v 1.250000 0.500000 -3.000000 +v -1.250000 0.750000 -2.500000 +v 1.250000 0.750000 -2.500000 +v -2.500000 0.000000 3.500000 +v 2.500000 0.000000 3.500000 +v -2.500000 0.250000 3.500000 +v 2.500000 0.250000 3.500000 +v -2.250000 1.000000 3.250000 +v 2.250000 1.000000 3.250000 +v -1.500000 0.000000 2.500000 +v 1.500000 0.000000 2.500000 +v -1.500000 0.750000 2.500000 +v 1.500000 0.750000 2.500000 +v -1.750000 0.750000 2.750000 +v 1.750000 0.750000 2.750000 +v -1.750000 1.000000 2.750000 +v 1.750000 1.000000 2.750000 +v 3.500000 0.000000 2.500000 +v 3.500000 0.000000 -2.500000 +v 3.500000 0.250000 2.500000 +v 3.500000 0.250000 -2.500000 +v 3.250000 1.000000 2.250000 +v 3.250000 1.000000 -2.250000 +v 2.500000 0.000000 1.500000 +v 2.500000 0.000000 -1.500000 +v 2.500000 0.750000 1.500000 +v 2.500000 0.750000 -1.500000 +v 2.750000 0.750000 1.750000 +v 2.750000 0.750000 -1.750000 +v 2.750000 1.000000 1.750000 +v 2.750000 1.000000 -1.750000 +v -2.500000 0.000000 -1.500000 +v -2.500000 0.750000 -1.500000 +v -2.500000 0.750000 1.500000 +v -2.750000 0.750000 1.750000 +v -2.750000 0.750000 -1.750000 +v -2.750000 1.000000 1.750000 +v -2.750000 1.000000 -1.750000 +vt 0.122449 0.827586 +vt 0.367347 0.827586 +vt 0.142857 0.862069 +vt 0.061224 0.655172 +vt 0.020408 0.931035 +vt 0.020408 0.620690 +vt 0.510204 0.896552 +vt 0.551020 0.620690 +vt 0.551020 0.931035 +vt 0.387755 0.896552 +vt 0.102041 0.913793 +vt 0.102041 0.896552 +vt 0.489796 0.482759 +vt 0.081633 0.500000 +vt 0.081633 0.482759 +vt 0.387755 0.896552 +vt 0.102041 0.913793 +vt 0.102041 0.896552 +vt 0.489796 0.500000 +vt 0.102041 0.551724 +vt 0.367347 0.879310 +vt 0.122449 0.879310 +vt 0.571429 0.413793 +vt 0.489796 0.137931 +vt 0.571429 0.068966 +vt 0.367347 0.879310 +vt 0.122449 0.879310 +vt 0.122449 0.827586 +vt 0.367347 0.827586 +vt 0.489796 -0.000000 +vt 0.163265 0.068966 +vt 0.081633 -0.000000 +vt 0.122449 0.827586 +vt 0.367347 0.827586 +vt 0.000000 0.068966 +vt 0.081633 0.344828 +vt 0.000000 0.413793 +vt 0.142857 0.896552 +vt 0.122449 0.879310 +vt 0.142857 0.879310 +vt 0.489796 0.482759 +vt 0.081633 0.500000 +vt 0.081633 0.482759 +vt 0.489796 0.500000 +vt 0.102041 0.551724 +vt 0.081633 0.500000 +vt 0.489796 0.500000 +vt 0.102041 0.551724 +vt 0.489796 0.482759 +vt 0.081633 0.482759 +vt 0.183673 0.948276 +vt 0.387755 0.982759 +vt 0.183673 0.982759 +vt 0.183673 0.913793 +vt 0.387755 0.948276 +vt 0.142857 0.948276 +vt 0.142857 0.931035 +vt 0.163265 0.931035 +vt 0.142857 0.913793 +vt 0.102041 0.896552 +vt 0.387755 0.896552 +vt 0.346939 0.913793 +vt 0.346939 0.896552 +vt 0.102041 1.000000 +vt 0.469388 1.000000 +vt 0.367347 0.879310 +vt 0.346939 0.879310 +vt 0.408163 0.931035 +vt 0.428571 0.948276 +vt 0.489796 0.482759 +vt 0.081633 0.500000 +vt 0.081633 0.482759 +vt 0.408163 0.413793 +vt 0.489796 0.500000 +vt 0.102041 0.551724 +vt 0.367347 0.879310 +vt 0.122449 0.827586 +vt 0.367347 0.827586 +vt 0.102041 0.896552 +vt 0.122449 0.879310 +vt 0.387755 0.896552 +vt 0.102041 0.913793 +vt 0.428571 0.586207 +vt 0.469388 0.551724 +vt 0.408163 0.068966 +vt 0.469388 0.827586 +vt 0.387755 0.879310 +vt 0.387755 0.827586 +vt 0.469388 0.896552 +vt 0.469388 0.913793 +vt 0.387755 0.913793 +vt 0.433673 0.965517 +vt 0.571429 0.551724 +vt 0.489796 0.551724 +vt 0.571429 0.482759 +vt 0.571429 0.500000 +vt 0.081633 0.137931 +vt 0.387755 0.827586 +vt 0.469388 0.879310 +vt 0.387755 0.879310 +vt 0.469388 0.896552 +vt 0.469388 0.913793 +vt 0.061224 0.896552 +vt 0.142857 0.965517 +vt 0.571429 0.500000 +vt 0.489796 0.551724 +vt 0.571429 0.482759 +vt 0.163265 0.413793 +vt 0.469388 0.879310 +vt 0.387755 0.827586 +vt 0.469388 0.827586 +vt 0.387755 0.879310 +vt 0.469388 0.896552 +vt 0.469388 0.913793 +vt 0.387755 0.913793 +vt 0.142857 0.586207 +vt 0.571429 0.551724 +vt 0.489796 0.551724 +vt 0.571429 0.482759 +vt 0.489796 0.344828 +vt 0.387755 0.879310 +vt 0.469388 0.827586 +vt 0.469388 0.879310 +vt 0.469388 0.896552 +vt 0.469388 0.913793 +vt 0.510204 0.655172 +vt 0.571429 0.551724 +vt 0.571429 0.500000 +vt 0.571429 0.482759 +vt 0.346939 0.862069 +vt 0.387755 0.913793 +vt 0.387755 0.913793 +vt 0.469388 0.551724 +vt 0.469388 0.551724 +vt 0.469388 0.551724 +vt 0.387755 0.913793 +vt 0.163265 0.913793 +vt 0.102041 0.913793 +vt 0.183673 0.965517 +vt 0.387755 0.965517 +vt 0.408163 0.913793 +vt 0.428571 0.931035 +vt 0.469388 0.879310 +vt 0.469388 0.827586 +vt 0.571429 0.551724 +vt 0.571429 0.500000 +vt 0.387755 0.827586 +vt 0.489796 0.551724 +vn 0.0000 0.0000 1.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.3162 -0.9487 +vn 0.0000 -1.0000 0.0000 +vn -0.9487 0.3162 0.0000 +vn 0.9487 0.3162 0.0000 +vn 0.0000 0.3162 0.9487 +vn -0.7071 0.0000 0.7071 +vn 0.6396 0.4264 -0.6396 +vn 0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 0.7071 +vn -0.6396 0.4264 -0.6396 +vn -0.7071 0.0000 -0.7071 +vn -0.6396 0.4264 0.6396 +vn 0.6396 0.4264 0.6396 +s off +f 51/81/11 52/82/11 65/83/11 +f 107/84/12 44/85/12 47/86/12 +f 101/87/12 92/88/12 93/89/12 +f 106/90/13 107/91/13 105/92/13 +f 42/93/14 46/94/14 43/95/14 +f 98/96/15 101/97/15 99/98/15 +f 45/99/16 49/100/16 46/94/16 +f 96/101/12 99/98/12 97/102/12 +f 88/103/17 95/104/17 89/105/17 +f 103/106/12 105/92/12 104/107/12 +f 103/106/13 41/108/13 102/109/13 +f 43/110/17 51/111/17 42/112/17 +f 96/101/15 95/113/15 94/114/15 +f 56/115/17 41/116/17 59/117/17 +f 62/118/12 53/119/12 72/120/12 +f 89/121/13 90/122/13 88/123/13 +f 54/124/18 44/125/18 50/126/18 +f 91/127/19 92/128/19 90/122/19 +f 59/129/15 50/126/15 56/130/15 +f 70/131/11 69/132/11 68/133/11 +f 65/134/12 71/135/12 70/131/12 +f 68/136/13 66/137/13 62/138/13 +f 66/139/11 57/140/11 62/118/11 +f 58/141/11 67/142/11 63/143/11 +f 48/144/12 69/132/12 49/145/12 +f 55/146/12 63/143/12 73/147/12 +f 63/148/15 69/149/15 71/135/15 +f 75/150/11 76/151/11 74/152/11 +f 74/152/17 81/153/17 75/150/17 +f 77/154/20 78/155/20 76/151/20 +f 82/156/14 81/157/14 80/158/14 +f 82/156/12 85/159/12 83/160/12 +f 84/161/14 87/162/14 85/159/14 +f 87/163/12 78/155/12 79/164/12 +f 43/110/17 95/104/17 52/165/17 +f 95/166/21 55/167/21 52/168/21 +f 55/167/12 99/169/12 58/141/12 +f 58/141/21 101/170/21 61/171/21 +f 101/87/12 49/145/12 61/172/12 +f 91/127/22 49/173/22 93/174/22 +f 91/127/23 43/175/23 46/176/23 +f 56/115/17 51/111/17 102/177/17 +f 102/178/24 53/179/24 103/180/24 +f 106/90/12 53/179/12 57/181/12 +f 60/182/24 106/90/24 57/181/24 +f 48/144/12 108/183/12 60/184/12 +f 50/185/25 48/186/25 45/99/25 +f 56/187/26 45/99/26 42/93/26 +f 80/188/17 59/117/17 41/116/17 +f 104/189/23 80/190/23 41/191/23 +f 82/192/12 105/193/12 84/161/12 +f 84/161/23 107/194/23 86/195/23 +f 107/84/12 78/155/12 86/196/12 +f 54/124/27 78/197/27 47/198/27 +f 74/199/21 54/124/21 59/129/21 +f 94/200/17 75/150/17 81/153/17 +f 96/201/26 81/202/26 83/203/26 +f 98/96/12 83/203/12 85/204/12 +f 87/205/26 98/96/26 85/204/26 +f 79/164/12 100/206/12 87/163/12 +f 92/207/28 77/154/28 90/208/28 +f 77/154/24 88/209/24 90/208/24 +f 72/120/11 53/119/11 65/83/11 +f 53/119/11 51/81/11 65/83/11 +f 52/82/11 55/146/11 64/210/11 +f 55/146/11 73/147/11 64/210/11 +f 52/82/11 64/210/11 65/83/11 +f 107/84/12 108/183/12 44/85/12 +f 101/87/12 100/206/12 92/88/12 +f 106/90/13 108/211/13 107/91/13 +f 42/93/14 45/99/14 46/94/14 +f 98/96/15 100/212/15 101/97/15 +f 45/99/16 48/213/16 49/100/16 +f 96/101/12 98/96/12 99/98/12 +f 88/103/17 94/200/17 95/104/17 +f 103/106/12 106/90/12 105/92/12 +f 103/106/13 104/107/13 41/108/13 +f 43/110/17 52/165/17 51/111/17 +f 96/101/15 97/102/15 95/113/15 +f 56/115/17 102/177/17 41/116/17 +f 62/118/12 57/140/12 53/119/12 +f 89/121/13 91/127/13 90/122/13 +f 54/124/18 47/214/18 44/125/18 +f 91/127/19 93/215/19 92/128/19 +f 59/129/15 54/124/15 50/126/15 +f 70/131/11 71/135/11 69/132/11 +f 65/134/12 64/216/12 71/135/12 +f 72/217/13 65/134/13 62/138/13 +f 65/134/13 70/131/13 62/138/13 +f 70/131/13 68/136/13 62/138/13 +f 66/139/11 60/218/11 57/140/11 +f 58/141/11 61/171/11 67/142/11 +f 48/144/12 60/184/12 68/133/12 +f 60/184/12 66/219/12 68/133/12 +f 67/220/12 61/172/12 69/132/12 +f 61/172/12 49/145/12 69/132/12 +f 48/144/12 68/133/12 69/132/12 +f 55/146/12 58/141/12 63/143/12 +f 64/216/15 73/221/15 63/148/15 +f 63/148/15 67/222/15 69/149/15 +f 71/135/15 64/216/15 63/148/15 +f 75/150/11 77/154/11 76/151/11 +f 74/152/17 80/188/17 81/153/17 +f 77/154/20 79/164/20 78/155/20 +f 82/156/14 83/160/14 81/157/14 +f 82/156/12 84/161/12 85/159/12 +f 84/161/14 86/195/14 87/162/14 +f 87/163/12 86/196/12 78/155/12 +f 43/110/17 89/105/17 95/104/17 +f 95/166/21 97/223/21 55/167/21 +f 55/167/12 97/223/12 99/169/12 +f 58/141/21 99/169/21 101/170/21 +f 101/87/12 93/89/12 49/145/12 +f 91/127/22 46/176/22 49/173/22 +f 91/127/23 89/121/23 43/175/23 +f 56/115/17 42/112/17 51/111/17 +f 102/178/24 51/224/24 53/179/24 +f 106/90/12 103/180/12 53/179/12 +f 60/182/24 108/211/24 106/90/24 +f 48/144/12 44/85/12 108/183/12 +f 50/185/25 44/225/25 48/186/25 +f 56/187/26 50/185/26 45/99/26 +f 80/188/17 74/152/17 59/117/17 +f 104/189/23 82/192/23 80/190/23 +f 82/192/12 104/189/12 105/193/12 +f 84/161/23 105/193/23 107/194/23 +f 107/84/12 47/86/12 78/155/12 +f 54/124/27 76/226/27 78/197/27 +f 74/199/21 76/226/21 54/124/21 +f 94/200/17 88/103/17 75/150/17 +f 96/201/26 94/227/26 81/202/26 +f 98/96/12 96/201/12 83/203/12 +f 87/205/26 100/212/26 98/96/26 +f 79/164/12 92/88/12 100/206/12 +f 92/207/28 79/228/28 77/154/28 +f 77/154/24 75/150/24 88/209/24 diff --git a/src/main/resources/assets/hbm/textures/models/doors/silo_hatch_large.png b/src/main/resources/assets/hbm/textures/models/doors/silo_hatch_large.png new file mode 100644 index 0000000000000000000000000000000000000000..e9cbcc6bba6349e7a1d2f56a47f6d6516d29a87b GIT binary patch literal 16520 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 HW9)wb?B*S{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/models/launchpad/erector_atlas.png b/src/main/resources/assets/hbm/textures/models/launchpad/erector_atlas.png index 0513ab1247ff7c8ed8b5c28a4b7305646ca32f65..7d1dcb08a03ea96169684673a8976dfdf3c34f09 100644 GIT binary patch literal 15292 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%0D)yla1h#+W*<2Wv`GQbPI7 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 literal 14476 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