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 000000000..e9cbcc6bb Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/doors/silo_hatch_large.png differ diff --git a/src/main/resources/assets/hbm/textures/models/doors/silo_hatch_large_base.png b/src/main/resources/assets/hbm/textures/models/doors/silo_hatch_large_base.png new file mode 100644 index 000000000..90be104aa Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/doors/silo_hatch_large_base.png differ 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 0513ab124..7d1dcb08a 100644 Binary files a/src/main/resources/assets/hbm/textures/models/launchpad/erector_atlas.png and b/src/main/resources/assets/hbm/textures/models/launchpad/erector_atlas.png differ