diff --git a/changelog b/changelog index e707528ba..441e8123c 100644 --- a/changelog +++ b/changelog @@ -1,52 +1,12 @@ ## Added -* Nitra - * Dropped by the painsaw ability when killing a mob - * Can be used to quickly craft standard ammo types in the 2x2 crafting grid - * Can also refill empty syringes, making stimpaks -* Latex - * Can be made from dandelions or from pressing jungle wood - * Replaces insulator in many recipes where electrical insulation that is potentially made from brick doesn't make sense, like rubber gas masks, jackets, tools and so on - * Latex is interchangable with rubber in all recipes where it's used, but not the other way round - * The old insulator is now mainly used for electrical and heat insulation as well as PWR rods -* Radar screen - * Radars can be linked to one radar screen, which will display all detected blips - * Right-clicking the radar screen will open the GUI of the radar that it is linked to +* Doors! + * Your favorites from 1.12, the 7 remaining doors have finally been ported + * Thanks to KoblizekXD for biting the bullet ## Changed -* Light oil and cracked light oil can now be reformed into large quantities of aromatic hydrocarbons a well as some reformate gas -* The painsaw ability no longer drops ammo and syringes, instead it drops nitra -* Radars have been completely rewritten - * Dots will now move smoothly across the screen, instead of jittering and being bound to the pixel grid - * Radars no longer use CPU-intensive full scans of the map, instead of using an optimized search for nearby scannable entities - * There's now a dedicated toggle for detecting artillery shells - * Radars now have a local area map that can be enabled - * The map scans up to 100 points per tick, the display can show 40,000 points - * The map will scan loaded chunks instantly, unloaded chunks have a limit 10 chunkloads per tick to prevent excessive lag. Chunks that have not yet been generated yet will show up as black spots, and will never be loaded - * The chunk load limit as well as whether chunks should be generated can be adjusted in the machine config file - * The map will show terrain height between Y:50 and Y:128, anything outside that range is truncated - * Radars now have a second GUI which allows the use of a battery, as well as linking the radar to other machines - * By using the number keys, the radar can now launch missiles, ABMs or artillery at the current aimed at position - * Radars can be linked to one additional radar screen which shows part of the radar's GUI in-world -* The turbofan's afterburner now adds a 33% efficiency bonus for every level. This means that instead of the efficiency remaining constant between levels, a tier 3 upgrade will yield double efficiency. -* Reduced the flarestack's base energy efficiency -* Trenchmaster armor is now unbreakable -* The arc welder recipe for advanced circuits now uses simple insulator instead of gold dust -* The arc welder recipes for enhanced and advanced circuits now use only 100mB of fluid instead of 250mB -* Completely rewrote the missile base code, missiles now accelerate smoothly instead of in increments and use interpolated movement, making them less jittery -* Missiles now have a slightly higher top-speed -* Remodeled tier 1, 2 and 3 missiles as well as the anti-ballistic missile -* Anti-ballistic missiles now use predictive targeting as well as a heightened sensor range of 1,000 blocks (instead of 500) which should make them a lot more effective -* Anti-ballistic missiles accelerate 4x faster than normal missiles and have a 50% higher top-speed -* Anti-ballistic missiles can now load their own chunks, allowing them to get to far away incoming missiles without getting stuck -* PWRs that have recently been close to unloaded chunks now have a 40 tick timeframe where they are "frozen", only trying to connect to a fluid network but not doing any fission, this should reduce the amount of meltdowns caused by chunkloading -* Glyphid hive blocks now have some color variance -* Glpyhid spawners now have a unique texture +* Reduced the blast resistance of the large doors from absurdly high to still very but not quite as high +* Custom missiles are now launchable using the radar +* NTM's structures should no longer spawn in dimensions besides the overworld. Ores will still generate, assuming the config option is set. ## Fixed -* Fixed thorium bedrock ore using the wrong ore dict key, making it unable to be processed via centrifuge or acidizer -* Fixed custom machine NEI slots going out of bounds after the third slot -* Fixed bismuth billets not being oredicted, making BFB PWR rods uncraftable -* Fixed missile chunkloading having rounding issues, sometimes causing them to get stuck in unloaded chunks while crossing chunk borders -* Fixed drones not being listed in the creative tabs -* Fixed pre-defined fluid duct items not being being able to be placed where replacable blocks are, eg. water -* Fixed horrible gamebreaking bug where the reinforced glass pane has too much blast resistance \ No newline at end of file +* Fixed ancient bug where custom missiles launched using the launch table would not use the accuracy calculation and always be pin-point accurate \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 98442c95e..60f325e78 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -2144,20 +2144,19 @@ public class ModBlocks { seal_controller = new BlockSeal(Material.iron).setBlockName("seal_controller").setHardness(10.0F).setResistance(100.0F).setCreativeTab(MainRegistry.machineTab); seal_hatch = new BlockHatch(Material.iron).setBlockName("seal_hatch").setHardness(Float.POSITIVE_INFINITY).setResistance(Float.POSITIVE_INFINITY).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":seal_hatch_3"); - vault_door = new VaultDoor(Material.iron).setBlockName("vault_door").setHardness(10.0F).setResistance(10000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":vault_door"); - blast_door = new BlastDoor(Material.iron).setBlockName("blast_door").setHardness(10.0F).setResistance(10000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":blast_door"); + vault_door = new VaultDoor(Material.iron).setBlockName("vault_door").setHardness(10.0F).setResistance(1_000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":vault_door"); + blast_door = new BlastDoor(Material.iron).setBlockName("blast_door").setHardness(10.0F).setResistance(1_000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":blast_door"); - sliding_blast_door = new BlockDoorGeneric(Material.iron, DoorDecl.SLIDE_DOOR).setBlockName("sliding_blast_door").setHardness(150.0F).setResistance(7500.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":sliding_blast_door"); - - fire_door = new BlockDoorGeneric(Material.iron, DoorDecl.FIRE_DOOR).setBlockName("fire_door").setHardness(10.0F).setResistance(10000.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(10000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":transition_seal"); - secure_access_door = new BlockDoorGeneric(Material.iron, DoorDecl.SECURE_ACCESS_DOOR).setBlockName("secure_access_door").setHardness(200.0F).setResistance(20000.0F).setCreativeTab(MainRegistry.machineTab); - large_vehicle_door = new BlockDoorGeneric(Material.iron, DoorDecl.LARGE_VEHICLE_DOOR).setBlockName("large_vehicle_door").setHardness(100.0F).setResistance(10000.0F).setCreativeTab(MainRegistry.machineTab); - qe_containment = new BlockDoorGeneric(Material.iron, DoorDecl.QE_CONTAINMENT).setBlockName("qe_containment").setHardness(100.0F).setResistance(10000.0F).setCreativeTab(MainRegistry.machineTab); - qe_sliding_door = new BlockDoorGeneric(Material.iron, DoorDecl.QE_SLIDING).setBlockName("qe_sliding_door").setHardness(100.0F).setResistance(10000.0F).setCreativeTab(MainRegistry.machineTab); - round_airlock_door = new BlockDoorGeneric(Material.iron, DoorDecl.ROUND_AIRLOCK_DOOR).setBlockName("round_airlock_door").setHardness(100.0F).setResistance(10000.0F).setCreativeTab(MainRegistry.machineTab); - sliding_seal_door = new BlockDoorGeneric(Material.iron, DoorDecl.SLIDING_SEAL_DOOR).setBlockName("sliding_seal_door").setHardness(10.0F).setResistance(10000.0F).setCreativeTab(MainRegistry.machineTab); - water_door = new BlockDoorGeneric(Material.iron, DoorDecl.WATER_DOOR).setBlockName("water_door").setHardness(50.0F).setResistance(500.0F).setCreativeTab(MainRegistry.machineTab); + sliding_blast_door = new BlockDoorGeneric(Material.iron, DoorDecl.SLIDE_DOOR).setBlockName("sliding_blast_door").setHardness(10.0F).setResistance(750.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":sliding_blast_door"); + 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"); + 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"); + qe_sliding_door = new BlockDoorGeneric(Material.iron, DoorDecl.QE_SLIDING).setBlockName("qe_sliding_door").setHardness(10.0F).setResistance(1_000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); + round_airlock_door = new BlockDoorGeneric(Material.iron, DoorDecl.ROUND_AIRLOCK_DOOR).setBlockName("round_airlock_door").setHardness(10.0F).setResistance(1_000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); + sliding_seal_door = new BlockDoorGeneric(Material.iron, DoorDecl.SLIDING_SEAL_DOOR).setBlockName("sliding_seal_door").setHardness(10.0F).setResistance(1_000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); + water_door = new BlockDoorGeneric(Material.iron, DoorDecl.WATER_DOOR).setBlockName("water_door").setHardness(5.0F).setResistance(50.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); door_metal = new BlockModDoor(Material.iron).setBlockName("door_metal").setHardness(5.0F).setResistance(5.0F).setBlockTextureName(RefStrings.MODID + ":door_metal"); door_office = new BlockModDoor(Material.iron).setBlockName("door_office").setHardness(10.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":door_office"); diff --git a/src/main/java/com/hbm/blocks/bomb/CompactLauncher.java b/src/main/java/com/hbm/blocks/bomb/CompactLauncher.java index 10f7547aa..eb9764411 100644 --- a/src/main/java/com/hbm/blocks/bomb/CompactLauncher.java +++ b/src/main/java/com/hbm/blocks/bomb/CompactLauncher.java @@ -123,7 +123,7 @@ public class CompactLauncher extends BlockContainer implements IMultiblock, IBom TileEntityCompactLauncher entity = (TileEntityCompactLauncher) world.getTileEntity(x, y, z); if(entity.canLaunch()) { - entity.launch(); + entity.launchFromDesignator(); return BombReturnCode.LAUNCHED; } diff --git a/src/main/java/com/hbm/blocks/bomb/LaunchTable.java b/src/main/java/com/hbm/blocks/bomb/LaunchTable.java index 3170cea1c..e5f194f59 100644 --- a/src/main/java/com/hbm/blocks/bomb/LaunchTable.java +++ b/src/main/java/com/hbm/blocks/bomb/LaunchTable.java @@ -163,7 +163,7 @@ public class LaunchTable extends BlockContainer implements IMultiblock, IBomb { TileEntityLaunchTable entity = (TileEntityLaunchTable) world.getTileEntity(x, y, z); if(entity.canLaunch()) { - entity.launch(); + entity.launchFromDesignator(); return BombReturnCode.LAUNCHED; } diff --git a/src/main/java/com/hbm/inventory/container/ContainerLaunchPadTier1.java b/src/main/java/com/hbm/inventory/container/ContainerLaunchPadTier1.java index 0abda201e..a19e9a385 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerLaunchPadTier1.java +++ b/src/main/java/com/hbm/inventory/container/ContainerLaunchPadTier1.java @@ -5,7 +5,6 @@ import com.hbm.tileentity.bomb.TileEntityLaunchPad; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; -import net.minecraft.inventory.ICrafting; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; diff --git a/src/main/java/com/hbm/lib/HbmWorldGen.java b/src/main/java/com/hbm/lib/HbmWorldGen.java index e233d59d2..d8019a7ea 100644 --- a/src/main/java/com/hbm/lib/HbmWorldGen.java +++ b/src/main/java/com/hbm/lib/HbmWorldGen.java @@ -236,7 +236,7 @@ public class HbmWorldGen implements IWorldGenerator { enableDungeons = provider.hasDungeons; } - if(GeneralConfig.enableDungeons && world.provider.isSurfaceWorld() && enableDungeons) { + if(GeneralConfig.enableDungeons && world.provider.dimensionId == 0 && enableDungeons) { if(MobConfig.enableHives && rand.nextInt(MobConfig.hiveSpawn) == 0) { int x = i + rand.nextInt(16) + 8; @@ -670,7 +670,7 @@ public class HbmWorldGen implements IWorldGenerator { int x = i + rand.nextInt(16); int z = j + rand.nextInt(16); int y = world.getHeightValue(x, z) - rand.nextInt(10); - (new Meteorite()).generate(world, rand, x, y, z, false, false, false); + if(y > 1) (new Meteorite()).generate(world, rand, x, y, z, false, false, false); } if (GeneralConfig.enableNITAN) { diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 8ee506eb5..2babe6244 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -2062,4 +2062,3 @@ public class ClientProxy extends ServerProxy { Minecraft.getMinecraft().getSoundHandler().playSound(new PositionedSoundRecord(new ResourceLocation(sound), volume, pitch, (float) x, (float) y, (float) z)); } } - diff --git a/src/main/java/com/hbm/tileentity/DoorDecl.java b/src/main/java/com/hbm/tileentity/DoorDecl.java index 64b073fd6..704e7b97a 100644 --- a/src/main/java/com/hbm/tileentity/DoorDecl.java +++ b/src/main/java/com/hbm/tileentity/DoorDecl.java @@ -5,1076 +5,1077 @@ import com.hbm.animloader.Animation; import com.hbm.lib.Library; import com.hbm.main.ResourceManager; import com.hbm.render.loader.WavefrontObjDisplayList; -import com.hbm.sound.MovingSoundPlayerLoop; import com.hbm.util.BobMathUtil; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.event.sound.SoundEvent; import org.lwjgl.opengl.GL11; public abstract class DoorDecl { - public static final DoorDecl TRANSITION_SEAL = new DoorDecl() { - - @Override - public String getOpenSoundStart() { - return "hbm:door.TransitionSealOpen"; - } - - @Override - public float getSoundVolume() { - return 6; - } - - @Override - @SideOnly(Side.CLIENT) - public void getTranslation(String partName, float openTicks, boolean child, float[] trans) { - if (!partName.equals("base")) { - set(trans, 0, 3.5F * getNormTime(openTicks), 0); - } else { - super.getTranslation(partName, openTicks, child, trans); - } - } - - @Override - @SideOnly(Side.CLIENT) - public void doOffsetTransform() { - GL11.glTranslated(0, 0, 0.5); - } - - @Override - @SideOnly(Side.CLIENT) - public double[][] getClippingPlanes() { - return super.getClippingPlanes(); - } - - @Override - public int timeToOpen() { - return 480; - } - - @Override - public int[][] getDoorOpenRanges() { - //3 is tall - //4 is wide - return new int[][]{{-9, 2, 0, 20, 20, 1}}; - } - - @Override - public int[] getDimensions() { - return new int[]{23, 0, 0, 0, 13, 12}; - } - - @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { - return super.getBlockBound(x, y, z, open); - } - - @Override - @SideOnly(Side.CLIENT) - public ResourceLocation getTextureForPart(int skinIndex, String partName) { - return ResourceManager.transition_seal_tex; - } - - @Override - @SideOnly(Side.CLIENT) - public Animation getAnim() { - return ResourceManager.transition_seal_anim; - } - - @Override - @SideOnly(Side.CLIENT) - public AnimatedModel getAnimatedModel() { - return ResourceManager.transition_seal; - } - - @Override - @SideOnly(Side.CLIENT) - public WavefrontObjDisplayList getModel() { - return null; - } - }; - - public static final DoorDecl FIRE_DOOR = new DoorDecl() { - - @Override - public String getOpenSoundEnd() { - return "hbm:door.wghStop"; - } - - @Override - public String getOpenSoundLoop() { - return "hbm:door.wghStart"; - } - - @Override - public String getSoundLoop2() { - return "hbm:door.alarm6"; - } - - @Override - public float getSoundVolume() { - return 2; - } - - @Override - @SideOnly(Side.CLIENT) - public void getTranslation(String partName, float openTicks, boolean child, float[] trans) { - if (!partName.equals("frame")) { - set(trans, 0, 3 * getNormTime(openTicks), 0); - } else { - super.getTranslation(partName, openTicks, child, trans); - } - } - - @Override - @SideOnly(Side.CLIENT) - public void doOffsetTransform() { - GL11.glTranslated(0, 0, 0.5); - } - - @Override - @SideOnly(Side.CLIENT) - public double[][] getClippingPlanes() { - return new double[][]{{0, -1, 0, 3.0001}}; - } - - @Override - public int timeToOpen() { - return 160; - } - - @Override - public int[][] getDoorOpenRanges() { - return new int[][]{{-1, 0, 0, 3, 4, 1}}; - } - - @Override - public int[] getDimensions() { - return new int[]{2, 0, 0, 0, 2, 1}; - } - - @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { - if (!open) - return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 1, 1); - if (z == 1) { - return AxisAlignedBB.getBoundingBox(0.5, 0, 0, 1, 1, 1); - } else if (z == -2) { - return AxisAlignedBB.getBoundingBox(0, 0, 0, 0.5, 1, 1); - } else if (y > 1) { - return AxisAlignedBB.getBoundingBox(0, 0.75, 0, 1, 1, 1); - } else if (y == 0) { - return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 0.1, 1); - } else { - return super.getBlockBound(x, y, z, open); - } - } - - @Override - @SideOnly(Side.CLIENT) - public ResourceLocation getTextureForPart(int skinIndex, String partName) { - return ResourceManager.fire_door_tex; - } - - @Override - @SideOnly(Side.CLIENT) - public WavefrontObjDisplayList getModel() { - return ResourceManager.fire_door; - } - }; - - public static final DoorDecl SLIDE_DOOR = new DoorDecl() { - @Override - public String getOpenSoundEnd() { - return "hbm:door.sliding_door_opened"; - } - - @Override - public String getCloseSoundEnd() { - return "hbm:door.sliding_door_shut"; - } - - @Override - public String getOpenSoundLoop() { - return "hbm:door.sliding_door_opening"; - } - - @Override - public String getSoundLoop2() { - return "hbm:door.sliding_door_opening"; - } - - @Override - public float getSoundVolume() { - return 2; - } - - @Override - @SideOnly(Side.CLIENT) - public void doOffsetTransform() { - GL11.glRotated(-90, 0, 1, 0); - } - - @Override - @SideOnly(Side.CLIENT) - public double[][] getClippingPlanes() { - return new double[][]{ - {-1, 0, 0, 3.50001}, - {1, 0, 0, 3.50001} - }; - } - - @Override - public int timeToOpen() { - return 24; - } - - @Override - public int[][] getDoorOpenRanges() { - return new int[][]{{-2, 0, 0, 4, 5, 1}}; - } - - @Override - public int[] getDimensions() { - return new int[]{3, 0, 0, 0, 3, 3}; - } - - @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { - if (open) { - if (y == 3) { - return AxisAlignedBB.getBoundingBox(0, 0.5, 0, 1, 1, 1); - } else if (y == 0) { - return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 0.08, 1); - } - } - return super.getBlockBound(x, y, z, open); - } - - @Override - public boolean hasSkins() { - return true; - } - - @Override - public int getSkinCount() { - return 3; - } - - @Override - @SideOnly(Side.CLIENT) - public ResourceLocation getTextureForPart(int skinIndex, String partName) { - return new ResourceLocation[] { - ResourceManager.sliding_blast_door_tex, - ResourceManager.sliding_blast_door_variant1_tex, - ResourceManager.sliding_blast_door_variant2_tex - }[skinIndex]; - } - - @Override - public WavefrontObjDisplayList getModel() { - return null; - } - - @Override - public Animation getAnim() { - return ResourceManager.sliding_blast_door_anim; - } - - @Override - public AnimatedModel getAnimatedModel() { - return ResourceManager.sliding_blast_door; - } - }; - - public static final DoorDecl SLIDING_SEAL_DOOR = new DoorDecl(){ - - @Override - public String getOpenSoundEnd() { - return "hbm:door.sliding_seal_stop"; - } - - @Override - public String getOpenSoundStart() { - return "hbm:door.sliding_seal_open"; - } - - public float getSoundVolume(){ - return 2; - } - - @Override - @SideOnly(Side.CLIENT) - public void getTranslation(String partName, float openTicks, boolean child, float[] trans) { - if(partName.startsWith("door")){ - set(trans, 0, 0, Library.smoothstep(getNormTime(openTicks), 0, 1)); - } else { - set(trans, 0, 0, 0); - } - }; - - @Override - @SideOnly(Side.CLIENT) - public double[][] getClippingPlanes() { - return new double[][]{{0, 0, -1, 0.5001}}; - }; - - @Override - @SideOnly(Side.CLIENT) - public void doOffsetTransform() { - GL11.glTranslated(0.375, 0, 0); - }; - - @Override - public int timeToOpen() { - return 20; - }; - - @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { - if(open){ - if(y == 0) - return AxisAlignedBB.getBoundingBox(0, 0, 1-0.25, 1, 0.125, 1); - return super.getBlockBound(x, y, z, open); - } else { - return AxisAlignedBB.getBoundingBox(0, 0, 1-0.25, 1, 1, 1); - } - }; - - @Override - public int[][] getDoorOpenRanges(){ - return new int[][]{{0, 0, 0, 1, 2, 2}}; - } - - @Override - public int[] getDimensions(){ - return new int[]{1, 0, 0, 0, 0, 0}; - } - - @Override - @SideOnly(Side.CLIENT) - public ResourceLocation getTextureForPart(String partName){ - return ResourceManager.sliding_seal_door_tex; - } - - @Override - public ResourceLocation getTextureForPart(int skinIndex, String partName) { - return ResourceManager.sliding_seal_door_tex; - } - - @Override - @SideOnly(Side.CLIENT) - public WavefrontObjDisplayList getModel(){ - return ResourceManager.sliding_seal_door; - } - }; - - public static final DoorDecl SECURE_ACCESS_DOOR = new DoorDecl(){ - - @Override - public String getCloseSoundLoop() { - return "hbm:door.garage_move"; - } - - @Override - public String getCloseSoundEnd() { - return "hbm:door.garage_stop"; - } - - @Override - public String getOpenSoundEnd() { - return "hbm:door.garage_stop"; - } - - @Override - public String getOpenSoundLoop() { - return "hbm:door.garage_move"; - } - - @Override - public float getSoundVolume(){ - return 2; - } - - @Override - @SideOnly(Side.CLIENT) - public void getTranslation(String partName, float openTicks, boolean child, float[] trans) { - if(!partName.equals("base")){ - set(trans, 0, 3.5F*getNormTime(openTicks), 0); - } else { - super.getTranslation(partName, openTicks, child, trans); - } - }; - - @Override - @SideOnly(Side.CLIENT) - public void doOffsetTransform() { - GL11.glRotated(90, 0, 1, 0); - }; - - @Override - @SideOnly(Side.CLIENT) - public double[][] getClippingPlanes() { - return new double[][]{{0, -1, 0, 5}}; - }; - - @Override - public int timeToOpen() { - return 120; - }; - - @Override - public int[][] getDoorOpenRanges(){ - return new int[][]{{-2, 1, 0, 4, 5, 1}}; - } - - @Override - public int[] getDimensions(){ - return new int[]{4, 0, 0, 0, 2, 2}; - } - - @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { - if(!open){ - if(y > 0){ - return AxisAlignedBB.getBoundingBox(0, 0, 0.375, 1, 1, 0.625); - } - return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 1, 1); - } - if(y == 1) { - return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 0.0625, 1); - } else if(y == 4){ - return AxisAlignedBB.getBoundingBox(0, 0.5, 0.15, 1, 1, 0.85); - } else { - return super.getBlockBound(x, y, z, open); - } - } - - @Override - @SideOnly(Side.CLIENT) - public ResourceLocation getTextureForPart(String partName){ - return ResourceManager.secure_access_door_tex; - } - - @Override - public ResourceLocation getTextureForPart(int skinIndex, String partName) { - return ResourceManager.secure_access_door_tex; - } - - @Override - @SideOnly(Side.CLIENT) - public WavefrontObjDisplayList getModel(){ - return ResourceManager.secure_access_door; - } - }; - - public static final DoorDecl ROUND_AIRLOCK_DOOR = new DoorDecl(){ - - @Override - public String getOpenSoundEnd() { - return "hbm:door.garage_stop"; - } - - @Override - public String getOpenSoundLoop() { - return "hbm:door.garage_move"; - } - - public float getSoundVolume(){ - return 2; - } - - @Override - @SideOnly(Side.CLIENT) - public void getTranslation(String partName, float openTicks, boolean child, float[] trans) { - if("doorLeft".equals(partName)){ - set(trans, 0, 0, 1.5F*getNormTime(openTicks)); - } else if("doorRight".equals(partName)){ - set(trans, 0, 0, -1.5F*getNormTime(openTicks)); - } else { - super.getTranslation(partName, openTicks, child, trans); - } - }; - - @Override - @SideOnly(Side.CLIENT) - public void doOffsetTransform() { - GL11.glTranslated(0, 0, 0.5); - }; - - @Override - @SideOnly(Side.CLIENT) - public double[][] getClippingPlanes() { - return new double[][]{{0.0, 0.0, 1.0, 2.0001}, {0.0, 0.0, -1.0, 2.0001}}; - }; - - @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { - if(!open) - return super.getBlockBound(x, y, z, open); - if(z == 1){ - return AxisAlignedBB.getBoundingBox(0.4, 0, 0, 1, 1, 1); - } else if(z == -2){ - return AxisAlignedBB.getBoundingBox(0, 0, 0, 0.6, 1, 1); - } else if(y == 3){ - return AxisAlignedBB.getBoundingBox(0, 0.5, 0, 1, 1, 1); - } else if(y == 0){ - return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 0.0625, 1); - } - return super.getBlockBound(x, y, z, open); - }; - - @Override - public int timeToOpen() { - return 60; - }; - - @Override - public int[][] getDoorOpenRanges(){ - return new int[][]{{0, 0, 0, -2, 4, 2}, {0, 0, 0, 3, 4, 2}}; - } - - @Override - public int[] getDimensions() { - return new int[]{3, 0, 0, 0, 2, 1}; - }; - - @Override - @SideOnly(Side.CLIENT) - public ResourceLocation getTextureForPart(String partName){ - return ResourceManager.round_airlock_door_tex; - } - - @Override - public ResourceLocation getTextureForPart(int skinIndex, String partName) { - return ResourceManager.round_airlock_door_tex; - } - - @Override - @SideOnly(Side.CLIENT) - public WavefrontObjDisplayList getModel(){ - return ResourceManager.round_airlock_door; - } - }; - - public static final DoorDecl QE_SLIDING = new DoorDecl(){ - - @Override - public String getOpenSoundEnd() { - return "hbm:door.qe_sliding_opened"; - }; - @Override - public String getCloseSoundEnd() { - return "hbm:door.qe_sliding_shut"; - }; - @Override - public String getOpenSoundLoop() { - return "hbm:door.qe_sliding_opening"; - }; - - public float getSoundVolume(){ - return 2; - } - - @Override - @SideOnly(Side.CLIENT) - public void getTranslation(String partName, float openTicks, boolean child, float[] trans) { - if(partName.startsWith("left")){ - set(trans, 0, 0, 1*getNormTime(openTicks)); - } else { - set(trans, 0, 0, -1*getNormTime(openTicks)); - } - }; - - @Override - @SideOnly(Side.CLIENT) - public void doOffsetTransform() { - GL11.glTranslated(0.4375, 0, 0.5); - }; - - @Override - public int timeToOpen() { - return 10; - }; - - @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { - if(open){ - if(z == 0){ - return AxisAlignedBB.getBoundingBox(1-0.125, 0, 1-0.125, 1, 1, 1); - } else { - return AxisAlignedBB.getBoundingBox(0, 0, 1-0.125, 0.125, 1, 1); - } - } else { - return AxisAlignedBB.getBoundingBox(0, 0, 1-0.125, 1, 1, 1); - } - }; - - @Override - public int[][] getDoorOpenRanges(){ - return new int[][]{{0, 0, 0, 2, 2, 2}}; - } - - @Override - public int[] getDimensions(){ - return new int[]{1, 0, 0, 0, 1, 0}; - } - - @Override - @SideOnly(Side.CLIENT) - public ResourceLocation getTextureForPart(String partName){ - return ResourceManager.qe_sliding_door_tex; - } - - @Override - public ResourceLocation getTextureForPart(int skinIndex, String partName) { - return getTextureForPart(partName); - } - - @Override - @SideOnly(Side.CLIENT) - public WavefrontObjDisplayList getModel(){ - return ResourceManager.qe_sliding_door; - } - - }; - - public static final DoorDecl QE_CONTAINMENT = new DoorDecl(){ - - @Override - public String getOpenSoundEnd() { - return "hbm:door.wgh_stop"; - }; - @Override - public String getOpenSoundLoop() { - return "hbm:door.wgh_start"; - }; - - @Override - public float getSoundVolume(){ - return 2; - } - - @Override - @SideOnly(Side.CLIENT) - public void getTranslation(String partName, float openTicks, boolean child, float[] trans) { - if(!partName.equals("frame")){ - set(trans, 0, 3*getNormTime(openTicks), 0); - } else { - super.getTranslation(partName, openTicks, child, trans); - } - }; - - @Override - @SideOnly(Side.CLIENT) - public void doOffsetTransform() { - GL11.glTranslated(0.25, 0, 0); - }; - - @Override - @SideOnly(Side.CLIENT) - public double[][] getClippingPlanes() { - return new double[][]{{0, -1, 0, 3.0001}}; - }; - - @Override - public int timeToOpen() { - return 160; - }; - - @Override - public int[][] getDoorOpenRanges(){ - return new int[][]{{-1, 0, 0, 3, 3, 1}}; - } - - @Override - public int[] getDimensions(){ - return new int[]{2, 0, 0, 0, 1, 1}; - } - - @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { - if(!open) - return AxisAlignedBB.getBoundingBox(0, 0, 0.5, 1, 1, 1); - if(y > 1) - return AxisAlignedBB.getBoundingBox(0, 0.5, 0.5, 1, 1, 1); - else if(y == 0) - return AxisAlignedBB.getBoundingBox(0, 0, 0.5, 1, 0.1, 1); - return super.getBlockBound(x, y, z, open); - }; - - @Override - @SideOnly(Side.CLIENT) - public ResourceLocation getTextureForPart(String partName){ - if(partName.equals("decal")) - return ResourceManager.qe_containment_decal; - return ResourceManager.qe_containment_tex; - } - - @Override - public ResourceLocation getTextureForPart(int skinIndex, String partName) { - return getTextureForPart(partName); - } - - @Override - @SideOnly(Side.CLIENT) - public WavefrontObjDisplayList getModel(){ - return ResourceManager.qe_containment; - } - - }; - - public static final DoorDecl WATER_DOOR = 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 "hbm:door.door.lever"; - }; - @Override - public String getCloseSoundStart() { - return null; - }; - @Override - public String getCloseSoundEnd() { - return "hbm:door.door.lever"; - }; - - @Override - public float getSoundVolume(){ - return 2; - } - - @Override - @SideOnly(Side.CLIENT) - public void getTranslation(String partName, float openTicks, boolean child, float[] trans) { - if("bolt".equals(partName)){ - set(trans, 0, 0, 0.4F*Library.smoothstep(getNormTime(openTicks, 0, 30), 0, 1)); - } else { - set(trans, 0, 0, 0); - } - }; - - @Override - @SideOnly(Side.CLIENT) - public void doOffsetTransform(){ - GL11.glTranslated(0.375, 0, 0); - } - - @Override - @SideOnly(Side.CLIENT) - public void getOrigin(String partName, float[] orig) { - if("door".equals(partName) || "bolt".equals(partName)){ - set(orig, 0.125F, 1.5F, 1.18F); - return; - } else if("spinny_upper".equals(partName)){ - set(orig, 0.041499F, 2.43569F, -0.587849F); - return; - } else if("spinny_lower".equals(partName)){ - set(orig, 0.041499F, 0.571054F, -0.587849F); - return; - } - super.getOrigin(partName, orig); - }; - - @Override - @SideOnly(Side.CLIENT) - public void getRotation(String partName, float openTicks, float[] rot) { - if(partName.startsWith("spinny")){ - set(rot, Library.smoothstep(getNormTime(openTicks, 0, 30), 0, 1)*360, 0, 0); - return; - } else if("door".equals(partName) || "bolt".equals(partName)){ - set(rot, 0, Library.smoothstep(getNormTime(openTicks, 30, 60), 0, 1)*-134, 0); - return; - } - super.getRotation(partName, openTicks, rot); - }; - - @Override - @SideOnly(Side.CLIENT) - public boolean doesRender(String partName, boolean child) { - return child || !partName.startsWith("spinny"); - }; - - @Override - @SideOnly(Side.CLIENT) - public String[] getChildren(String partName) { - if("door".equals(partName)) - return new String[]{"spinny_lower", "spinny_upper"}; - return super.getChildren(partName); - }; - - @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { - if(!open){ - return AxisAlignedBB.getBoundingBox(0, 0, 0.75, 1, 1, 1); - } else if(y > 1) { - return AxisAlignedBB.getBoundingBox(0, 0.85, 0.75, 1, 1, 1); - } else if(y == 0){ - return AxisAlignedBB.getBoundingBox(0, 0, 0.75, 1, 0.15, 1); - } - return super.getBlockBound(x, y, z, open); - }; - - @Override - public int timeToOpen() { - return 60; - }; - - @Override - public int[][] getDoorOpenRanges(){ - return new int[][]{{1, 0, 0, -3, 3, 2}}; - } - - public float getDoorRangeOpenTime(int ticks, int idx) { - return getNormTime(ticks, 35, 40); - }; - - @Override - public int[] getDimensions(){ - return new int[]{2, 0, 0, 0, 1, 1}; - } - - @Override - @SideOnly(Side.CLIENT) - public ResourceLocation getTextureForPart(String partName){ - return ResourceManager.water_door_tex; - } - - @Override - public ResourceLocation getTextureForPart(int skinIndex, String partName) { - return ResourceManager.water_door_tex; - } - - @Override - @SideOnly(Side.CLIENT) - public WavefrontObjDisplayList getModel(){ - return ResourceManager.water_door; - } - - }; - - public static final DoorDecl LARGE_VEHICLE_DOOR = new DoorDecl(){ - - @Override - @SideOnly(Side.CLIENT) - public void getTranslation(String partName, float openTicks, boolean child, float[] trans) { - if("doorLeft".equals(partName)){ - set(trans, 0, 0, 3*getNormTime(openTicks)); - } else if("doorRight".equals(partName)){ - set(trans, 0, 0, -3*getNormTime(openTicks)); - } else { - super.getTranslation(partName, openTicks, child, trans); - } - }; - - @Override - public String getOpenSoundEnd() { - return "hbm:door.garage_stop"; - } - - @Override - public String getOpenSoundLoop() { - return "hbm:door.garage_move"; - }; - - public float getSoundVolume(){ - return 2; - } - - @Override - @SideOnly(Side.CLIENT) - public double[][] getClippingPlanes() { - return new double[][]{{0.0, 0.0, 1.0, 3.50001}, {0.0, 0.0, -1.0, 3.50001}}; - }; - - @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { - if(!open) - return super.getBlockBound(x, y, z, open); - if(z == 3){ - return AxisAlignedBB.getBoundingBox(0.4, 0, 0, 1, 1, 1); - } else if(z == -3){ - return AxisAlignedBB.getBoundingBox(0, 0, 0, 0.6, 1, 1); - } - return super.getBlockBound(x, y, z, open); - }; - - @Override - public int timeToOpen() { - return 60; - }; - - @Override - public int[][] getDoorOpenRanges(){ - return new int[][]{{0, 0, 0, -4, 6, 2}, {0, 0, 0, 4, 6, 2}}; - } - - @Override - public int[] getDimensions() { - return new int[]{5, 0, 0, 0, 3, 3}; - }; - - @Override - @SideOnly(Side.CLIENT) - public ResourceLocation getTextureForPart(String partName){ - return ResourceManager.large_vehicle_door_tex; - } - - @Override - public ResourceLocation getTextureForPart(int skinIndex, String partName) { - return ResourceManager.large_vehicle_door_tex; - } - - @Override - @SideOnly(Side.CLIENT) - public WavefrontObjDisplayList getModel(){ - return ResourceManager.large_vehicle_door; - } - - }; - - //Format: x, y, z, tangent amount 1 (how long the door would be if it moved up), tangent amount 2 (door places blocks in this direction), axis (0-x, 1-y, 2-z) - public abstract int[][] getDoorOpenRanges(); - - public abstract int[] getDimensions(); - - public float getDoorRangeOpenTime(int ticks, int idx) { - return getNormTime(ticks); - } - - public int timeToOpen() { - return 20; - } - - public float getNormTime(float time) { - return getNormTime(time, 0, timeToOpen()); - } - - public float getNormTime(float time, float min, float max) { - return BobMathUtil.remap01_clamp(time, min, max); - } - - public boolean hasSkins() { - return false; - } - - public int getSkinCount() { - return 0; - } - - @SideOnly(Side.CLIENT) - public ResourceLocation getTextureForPart(String partName) { - return getTextureForPart(0, partName); - } - - @SideOnly(Side.CLIENT) - public abstract ResourceLocation getTextureForPart(int skinIndex, String partName); - - @SideOnly(Side.CLIENT) - public abstract WavefrontObjDisplayList getModel(); - - @SideOnly(Side.CLIENT) - public AnimatedModel getAnimatedModel() { - return null; - } - - @SideOnly(Side.CLIENT) - public Animation getAnim() { - return null; - } - - @SideOnly(Side.CLIENT) - public void getTranslation(String partName, float openTicks, boolean child, float[] trans) { - set(trans, 0, 0, 0); - } - - @SideOnly(Side.CLIENT) - public void getRotation(String partName, float openTicks, float[] rot) { - set(rot, 0, 0, 0); - } - - @SideOnly(Side.CLIENT) - public void getOrigin(String partName, float[] orig) { - set(orig, 0, 0, 0); - } - - @SideOnly(Side.CLIENT) - public boolean doesRender(String partName, boolean child) { - return true; - } - - private static final String[] nothing = new String[]{}; - - @SideOnly(Side.CLIENT) - public String[] getChildren(String partName) { - return nothing; - } - - @SideOnly(Side.CLIENT) - public double[][] getClippingPlanes() { - return new double[][]{}; - } - - @SideOnly(Side.CLIENT) - public void doOffsetTransform() { - } - - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { - return open ? AxisAlignedBB.getBoundingBox(0, 0, 0, 0, 0, 0) : AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 1, 1); - } - - public boolean isLadder(boolean open) { - return false; - } - - public String getOpenSoundLoop() { - return null; - } - - //Hack - public String getSoundLoop2() { - return null; - } - - public String getCloseSoundLoop() { - return getOpenSoundLoop(); - } - - public String getOpenSoundStart() { - return null; - } - - public String getCloseSoundStart() { - return getOpenSoundStart(); - } - - public String getOpenSoundEnd() { - return null; - } - - public String getCloseSoundEnd() { - return getOpenSoundEnd(); - } - - public float getSoundVolume() { - return 1; - } - - public float[] set(float[] f, float x, float y, float z) { - f[0] = x; - f[1] = y; - f[2] = z; - return f; - } + public static final DoorDecl TRANSITION_SEAL = new DoorDecl() { + + @Override + public String getOpenSoundStart() { + return "hbm:door.TransitionSealOpen"; + } + + @Override + public float getSoundVolume() { + return 6; + } + + @Override + @SideOnly(Side.CLIENT) + public void getTranslation(String partName, float openTicks, boolean child, float[] trans) { + if(!partName.equals("base")) { + set(trans, 0, 3.5F * getNormTime(openTicks), 0); + } else { + super.getTranslation(partName, openTicks, child, trans); + } + } + + @Override + @SideOnly(Side.CLIENT) + public void doOffsetTransform() { + GL11.glTranslated(0, 0, 0.5); + } + + @Override + @SideOnly(Side.CLIENT) + public double[][] getClippingPlanes() { + return super.getClippingPlanes(); + } + + @Override + public int timeToOpen() { + return 480; + } + + @Override + public int[][] getDoorOpenRanges() { + // 3 is tall + // 4 is wide + return new int[][] { { -9, 2, 0, 20, 20, 1 } }; + } + + @Override + public int[] getDimensions() { + return new int[] { 23, 0, 0, 0, 13, 12 }; + } + + @Override + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + return super.getBlockBound(x, y, z, open); + } + + @Override + @SideOnly(Side.CLIENT) + public ResourceLocation getTextureForPart(int skinIndex, String partName) { + return ResourceManager.transition_seal_tex; + } + + @Override + @SideOnly(Side.CLIENT) + public Animation getAnim() { + return ResourceManager.transition_seal_anim; + } + + @Override + @SideOnly(Side.CLIENT) + public AnimatedModel getAnimatedModel() { + return ResourceManager.transition_seal; + } + + @Override + @SideOnly(Side.CLIENT) + public WavefrontObjDisplayList getModel() { + return null; + } + }; + + public static final DoorDecl FIRE_DOOR = new DoorDecl() { + + @Override + public String getOpenSoundEnd() { + return "hbm:door.wghStop"; + } + + @Override + public String getOpenSoundLoop() { + return "hbm:door.wghStart"; + } + + @Override + public String getSoundLoop2() { + return "hbm:door.alarm6"; + } + + @Override + public float getSoundVolume() { + return 2; + } + + @Override + @SideOnly(Side.CLIENT) + public void getTranslation(String partName, float openTicks, boolean child, float[] trans) { + if(!partName.equals("frame")) { + set(trans, 0, 3 * getNormTime(openTicks), 0); + } else { + super.getTranslation(partName, openTicks, child, trans); + } + } + + @Override + @SideOnly(Side.CLIENT) + public void doOffsetTransform() { + GL11.glTranslated(0, 0, 0.5); + } + + @Override + @SideOnly(Side.CLIENT) + public double[][] getClippingPlanes() { + return new double[][] { { 0, -1, 0, 3.0001 } }; + } + + @Override + public int timeToOpen() { + return 160; + } + + @Override + public int[][] getDoorOpenRanges() { + return new int[][] { { -1, 0, 0, 3, 4, 1 } }; + } + + @Override + public int[] getDimensions() { + return new int[] { 2, 0, 0, 0, 2, 1 }; + } + + @Override + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + if(!open) + return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 1, 1); + if(z == 1) { + return AxisAlignedBB.getBoundingBox(0.5, 0, 0, 1, 1, 1); + } else if(z == -2) { + return AxisAlignedBB.getBoundingBox(0, 0, 0, 0.5, 1, 1); + } else if(y > 1) { + return AxisAlignedBB.getBoundingBox(0, 0.75, 0, 1, 1, 1); + } else if(y == 0) { + return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 0.1, 1); + } else { + return super.getBlockBound(x, y, z, open); + } + } + + @Override + @SideOnly(Side.CLIENT) + public ResourceLocation getTextureForPart(int skinIndex, String partName) { + return ResourceManager.fire_door_tex; + } + + @Override + @SideOnly(Side.CLIENT) + public WavefrontObjDisplayList getModel() { + return ResourceManager.fire_door; + } + }; + + public static final DoorDecl SLIDE_DOOR = new DoorDecl() { + + @Override + public String getOpenSoundEnd() { + return "hbm:door.sliding_door_opened"; + } + + @Override + public String getCloseSoundEnd() { + return "hbm:door.sliding_door_shut"; + } + + @Override + public String getOpenSoundLoop() { + return "hbm:door.sliding_door_opening"; + } + + @Override + public String getSoundLoop2() { + return "hbm:door.sliding_door_opening"; + } + + @Override + public float getSoundVolume() { + return 2; + } + + @Override + @SideOnly(Side.CLIENT) + public void doOffsetTransform() { + GL11.glRotated(-90, 0, 1, 0); + } + + @Override + @SideOnly(Side.CLIENT) + public double[][] getClippingPlanes() { + return new double[][] { { -1, 0, 0, 3.50001 }, { 1, 0, 0, 3.50001 } }; + } + + @Override + public int timeToOpen() { + return 24; + } + + @Override + public int[][] getDoorOpenRanges() { + return new int[][] { { -2, 0, 0, 4, 5, 1 } }; + } + + @Override + public int[] getDimensions() { + return new int[] { 3, 0, 0, 0, 3, 3 }; + } + + @Override + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + if(open) { + if(y == 3) { + return AxisAlignedBB.getBoundingBox(0, 0.5, 0, 1, 1, 1); + } else if(y == 0) { + return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 0.08, 1); + } + } + return super.getBlockBound(x, y, z, open); + } + + @Override + public boolean hasSkins() { + return true; + } + + @Override + public int getSkinCount() { + return 3; + } + + @Override + @SideOnly(Side.CLIENT) + public ResourceLocation getTextureForPart(int skinIndex, String partName) { + return new ResourceLocation[] { ResourceManager.sliding_blast_door_tex, ResourceManager.sliding_blast_door_variant1_tex, ResourceManager.sliding_blast_door_variant2_tex }[skinIndex]; + } + + @Override + public WavefrontObjDisplayList getModel() { + return null; + } + + @Override + public Animation getAnim() { + return ResourceManager.sliding_blast_door_anim; + } + + @Override + public AnimatedModel getAnimatedModel() { + return ResourceManager.sliding_blast_door; + } + }; + + public static final DoorDecl SLIDING_SEAL_DOOR = new DoorDecl() { + + @Override + public String getOpenSoundEnd() { + return "hbm:door.sliding_seal_stop"; + } + + @Override + public String getOpenSoundStart() { + return "hbm:door.sliding_seal_open"; + } + + public float getSoundVolume() { + return 2; + } + + @Override + @SideOnly(Side.CLIENT) + public void getTranslation(String partName, float openTicks, boolean child, float[] trans) { + if(partName.startsWith("door")) { + set(trans, 0, 0, Library.smoothstep(getNormTime(openTicks), 0, 1)); + } else { + set(trans, 0, 0, 0); + } + }; + + @Override + @SideOnly(Side.CLIENT) + public double[][] getClippingPlanes() { + return new double[][] { { 0, 0, -1, 0.5001 } }; + }; + + @Override + @SideOnly(Side.CLIENT) + public void doOffsetTransform() { + GL11.glTranslated(0.375, 0, 0); + }; + + @Override + public int timeToOpen() { + return 20; + }; + + @Override + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + if(open) { + if(y == 0) + return AxisAlignedBB.getBoundingBox(0, 0, 1 - 0.25, 1, 0.125, 1); + return super.getBlockBound(x, y, z, open); + } else { + return AxisAlignedBB.getBoundingBox(0, 0, 1 - 0.25, 1, 1, 1); + } + }; + + @Override + public int[][] getDoorOpenRanges() { + return new int[][] { { 0, 0, 0, 1, 2, 2 } }; + } + + @Override + public int[] getDimensions() { + return new int[] { 1, 0, 0, 0, 0, 0 }; + } + + @Override + @SideOnly(Side.CLIENT) + public ResourceLocation getTextureForPart(String partName) { + return ResourceManager.sliding_seal_door_tex; + } + + @Override + public ResourceLocation getTextureForPart(int skinIndex, String partName) { + return ResourceManager.sliding_seal_door_tex; + } + + @Override + @SideOnly(Side.CLIENT) + public WavefrontObjDisplayList getModel() { + return ResourceManager.sliding_seal_door; + } + }; + + public static final DoorDecl SECURE_ACCESS_DOOR = new DoorDecl() { + + @Override + public String getCloseSoundLoop() { + return "hbm:door.garage_move"; + } + + @Override + public String getCloseSoundEnd() { + return "hbm:door.garage_stop"; + } + + @Override + public String getOpenSoundEnd() { + return "hbm:door.garage_stop"; + } + + @Override + public String getOpenSoundLoop() { + return "hbm:door.garage_move"; + } + + @Override + public float getSoundVolume() { + return 2; + } + + @Override + @SideOnly(Side.CLIENT) + public void getTranslation(String partName, float openTicks, boolean child, float[] trans) { + if(!partName.equals("base")) { + set(trans, 0, 3.5F * getNormTime(openTicks), 0); + } else { + super.getTranslation(partName, openTicks, child, trans); + } + }; + + @Override + @SideOnly(Side.CLIENT) + public void doOffsetTransform() { + GL11.glRotated(90, 0, 1, 0); + }; + + @Override + @SideOnly(Side.CLIENT) + public double[][] getClippingPlanes() { + return new double[][] { { 0, -1, 0, 5 } }; + }; + + @Override + public int timeToOpen() { + return 120; + }; + + @Override + public int[][] getDoorOpenRanges() { + return new int[][] { { -2, 1, 0, 4, 5, 1 } }; + } + + @Override + public int[] getDimensions() { + return new int[] { 4, 0, 0, 0, 2, 2 }; + } + + @Override + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + if(!open) { + if(y > 0) { + return AxisAlignedBB.getBoundingBox(0, 0, 0.375, 1, 1, 0.625); + } + return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 1, 1); + } + if(y == 1) { + return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 0.0625, 1); + } else if(y == 4) { + return AxisAlignedBB.getBoundingBox(0, 0.5, 0.15, 1, 1, 0.85); + } else { + return super.getBlockBound(x, y, z, open); + } + } + + @Override + @SideOnly(Side.CLIENT) + public ResourceLocation getTextureForPart(String partName) { + return ResourceManager.secure_access_door_tex; + } + + @Override + public ResourceLocation getTextureForPart(int skinIndex, String partName) { + return ResourceManager.secure_access_door_tex; + } + + @Override + @SideOnly(Side.CLIENT) + public WavefrontObjDisplayList getModel() { + return ResourceManager.secure_access_door; + } + }; + + public static final DoorDecl ROUND_AIRLOCK_DOOR = new DoorDecl() { + + @Override + public String getOpenSoundEnd() { + return "hbm:door.garage_stop"; + } + + @Override + public String getOpenSoundLoop() { + return "hbm:door.garage_move"; + } + + public float getSoundVolume() { + return 2; + } + + @Override + @SideOnly(Side.CLIENT) + public void getTranslation(String partName, float openTicks, boolean child, float[] trans) { + if("doorLeft".equals(partName)) { + set(trans, 0, 0, 1.5F * getNormTime(openTicks)); + } else if("doorRight".equals(partName)) { + set(trans, 0, 0, -1.5F * getNormTime(openTicks)); + } else { + super.getTranslation(partName, openTicks, child, trans); + } + }; + + @Override + @SideOnly(Side.CLIENT) + public void doOffsetTransform() { + GL11.glTranslated(0, 0, 0.5); + }; + + @Override + @SideOnly(Side.CLIENT) + public double[][] getClippingPlanes() { + return new double[][] { { 0.0, 0.0, 1.0, 2.0001 }, { 0.0, 0.0, -1.0, 2.0001 } }; + }; + + @Override + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + if(!open) + return super.getBlockBound(x, y, z, open); + if(z == 1) { + return AxisAlignedBB.getBoundingBox(0.4, 0, 0, 1, 1, 1); + } else if(z == -2) { + return AxisAlignedBB.getBoundingBox(0, 0, 0, 0.6, 1, 1); + } else if(y == 3) { + return AxisAlignedBB.getBoundingBox(0, 0.5, 0, 1, 1, 1); + } else if(y == 0) { + return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 0.0625, 1); + } + return super.getBlockBound(x, y, z, open); + }; + + @Override + public int timeToOpen() { + return 60; + }; + + @Override + public int[][] getDoorOpenRanges() { + return new int[][] { { 0, 0, 0, -2, 4, 2 }, { 0, 0, 0, 3, 4, 2 } }; + } + + @Override + public int[] getDimensions() { + return new int[] { 3, 0, 0, 0, 2, 1 }; + }; + + @Override + @SideOnly(Side.CLIENT) + public ResourceLocation getTextureForPart(String partName) { + return ResourceManager.round_airlock_door_tex; + } + + @Override + public ResourceLocation getTextureForPart(int skinIndex, String partName) { + return ResourceManager.round_airlock_door_tex; + } + + @Override + @SideOnly(Side.CLIENT) + public WavefrontObjDisplayList getModel() { + return ResourceManager.round_airlock_door; + } + }; + + public static final DoorDecl QE_SLIDING = new DoorDecl() { + + @Override + public String getOpenSoundEnd() { + return "hbm:door.qe_sliding_opened"; + }; + + @Override + public String getCloseSoundEnd() { + return "hbm:door.qe_sliding_shut"; + }; + + @Override + public String getOpenSoundLoop() { + return "hbm:door.qe_sliding_opening"; + }; + + public float getSoundVolume() { + return 2; + } + + @Override + @SideOnly(Side.CLIENT) + public void getTranslation(String partName, float openTicks, boolean child, float[] trans) { + if(partName.startsWith("left")) { + set(trans, 0, 0, 1 * getNormTime(openTicks)); + } else { + set(trans, 0, 0, -1 * getNormTime(openTicks)); + } + }; + + @Override + @SideOnly(Side.CLIENT) + public void doOffsetTransform() { + GL11.glTranslated(0.4375, 0, 0.5); + }; + + @Override + public int timeToOpen() { + return 10; + }; + + @Override + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + if(open) { + if(z == 0) { + return AxisAlignedBB.getBoundingBox(1 - 0.125, 0, 1 - 0.125, 1, 1, 1); + } else { + return AxisAlignedBB.getBoundingBox(0, 0, 1 - 0.125, 0.125, 1, 1); + } + } else { + return AxisAlignedBB.getBoundingBox(0, 0, 1 - 0.125, 1, 1, 1); + } + }; + + @Override + public int[][] getDoorOpenRanges() { + return new int[][] { { 0, 0, 0, 2, 2, 2 } }; + } + + @Override + public int[] getDimensions() { + return new int[] { 1, 0, 0, 0, 1, 0 }; + } + + @Override + @SideOnly(Side.CLIENT) + public ResourceLocation getTextureForPart(String partName) { + return ResourceManager.qe_sliding_door_tex; + } + + @Override + public ResourceLocation getTextureForPart(int skinIndex, String partName) { + return getTextureForPart(partName); + } + + @Override + @SideOnly(Side.CLIENT) + public WavefrontObjDisplayList getModel() { + return ResourceManager.qe_sliding_door; + } + + }; + + public static final DoorDecl QE_CONTAINMENT = new DoorDecl() { + + @Override + public String getOpenSoundEnd() { + return "hbm:door.wgh_stop"; + }; + + @Override + public String getOpenSoundLoop() { + return "hbm:door.wgh_start"; + }; + + @Override + public float getSoundVolume() { + return 2; + } + + @Override + @SideOnly(Side.CLIENT) + public void getTranslation(String partName, float openTicks, boolean child, float[] trans) { + if(!partName.equals("frame")) { + set(trans, 0, 3 * getNormTime(openTicks), 0); + } else { + super.getTranslation(partName, openTicks, child, trans); + } + }; + + @Override + @SideOnly(Side.CLIENT) + public void doOffsetTransform() { + GL11.glTranslated(0.25, 0, 0); + }; + + @Override + @SideOnly(Side.CLIENT) + public double[][] getClippingPlanes() { + return new double[][] { { 0, -1, 0, 3.0001 } }; + }; + + @Override + public int timeToOpen() { + return 160; + }; + + @Override + public int[][] getDoorOpenRanges() { + return new int[][] { { -1, 0, 0, 3, 3, 1 } }; + } + + @Override + public int[] getDimensions() { + return new int[] { 2, 0, 0, 0, 1, 1 }; + } + + @Override + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + if(!open) + return AxisAlignedBB.getBoundingBox(0, 0, 0.5, 1, 1, 1); + if(y > 1) + return AxisAlignedBB.getBoundingBox(0, 0.5, 0.5, 1, 1, 1); + else if(y == 0) + return AxisAlignedBB.getBoundingBox(0, 0, 0.5, 1, 0.1, 1); + return super.getBlockBound(x, y, z, open); + }; + + @Override + @SideOnly(Side.CLIENT) + public ResourceLocation getTextureForPart(String partName) { + if(partName.equals("decal")) + return ResourceManager.qe_containment_decal; + return ResourceManager.qe_containment_tex; + } + + @Override + public ResourceLocation getTextureForPart(int skinIndex, String partName) { + return getTextureForPart(partName); + } + + @Override + @SideOnly(Side.CLIENT) + public WavefrontObjDisplayList getModel() { + return ResourceManager.qe_containment; + } + + }; + + public static final DoorDecl WATER_DOOR = 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 "hbm:door.door.lever"; + }; + + @Override + public String getCloseSoundStart() { + return null; + }; + + @Override + public String getCloseSoundEnd() { + return "hbm:door.door.lever"; + }; + + @Override + public float getSoundVolume() { + return 2; + } + + @Override + @SideOnly(Side.CLIENT) + public void getTranslation(String partName, float openTicks, boolean child, float[] trans) { + if("bolt".equals(partName)) { + set(trans, 0, 0, 0.4F * Library.smoothstep(getNormTime(openTicks, 0, 30), 0, 1)); + } else { + set(trans, 0, 0, 0); + } + }; + + @Override + @SideOnly(Side.CLIENT) + public void doOffsetTransform() { + GL11.glTranslated(0.375, 0, 0); + } + + @Override + @SideOnly(Side.CLIENT) + public void getOrigin(String partName, float[] orig) { + if("door".equals(partName) || "bolt".equals(partName)) { + set(orig, 0.125F, 1.5F, 1.18F); + return; + } else if("spinny_upper".equals(partName)) { + set(orig, 0.041499F, 2.43569F, -0.587849F); + return; + } else if("spinny_lower".equals(partName)) { + set(orig, 0.041499F, 0.571054F, -0.587849F); + return; + } + super.getOrigin(partName, orig); + }; + + @Override + @SideOnly(Side.CLIENT) + public void getRotation(String partName, float openTicks, float[] rot) { + if(partName.startsWith("spinny")) { + set(rot, Library.smoothstep(getNormTime(openTicks, 0, 30), 0, 1) * 360, 0, 0); + return; + } else if("door".equals(partName) || "bolt".equals(partName)) { + set(rot, 0, Library.smoothstep(getNormTime(openTicks, 30, 60), 0, 1) * -134, 0); + return; + } + super.getRotation(partName, openTicks, rot); + }; + + @Override + @SideOnly(Side.CLIENT) + public boolean doesRender(String partName, boolean child) { + return child || !partName.startsWith("spinny"); + }; + + @Override + @SideOnly(Side.CLIENT) + public String[] getChildren(String partName) { + if("door".equals(partName)) + return new String[] { "spinny_lower", "spinny_upper" }; + return super.getChildren(partName); + }; + + @Override + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + if(!open) { + return AxisAlignedBB.getBoundingBox(0, 0, 0.75, 1, 1, 1); + } else if(y > 1) { + return AxisAlignedBB.getBoundingBox(0, 0.85, 0.75, 1, 1, 1); + } else if(y == 0) { + return AxisAlignedBB.getBoundingBox(0, 0, 0.75, 1, 0.15, 1); + } + return super.getBlockBound(x, y, z, open); + }; + + @Override + public int timeToOpen() { + return 60; + }; + + @Override + public int[][] getDoorOpenRanges() { + return new int[][] { { 1, 0, 0, -3, 3, 2 } }; + } + + public float getDoorRangeOpenTime(int ticks, int idx) { + return getNormTime(ticks, 35, 40); + }; + + @Override + public int[] getDimensions() { + return new int[] { 2, 0, 0, 0, 1, 1 }; + } + + @Override + @SideOnly(Side.CLIENT) + public ResourceLocation getTextureForPart(String partName) { + return ResourceManager.water_door_tex; + } + + @Override + public ResourceLocation getTextureForPart(int skinIndex, String partName) { + return ResourceManager.water_door_tex; + } + + @Override + @SideOnly(Side.CLIENT) + public WavefrontObjDisplayList getModel() { + return ResourceManager.water_door; + } + + }; + + public static final DoorDecl LARGE_VEHICLE_DOOR = new DoorDecl() { + + @Override + @SideOnly(Side.CLIENT) + public void getTranslation(String partName, float openTicks, boolean child, float[] trans) { + if("doorLeft".equals(partName)) { + set(trans, 0, 0, 3 * getNormTime(openTicks)); + } else if("doorRight".equals(partName)) { + set(trans, 0, 0, -3 * getNormTime(openTicks)); + } else { + super.getTranslation(partName, openTicks, child, trans); + } + }; + + @Override + public String getOpenSoundEnd() { + return "hbm:door.garage_stop"; + } + + @Override + public String getOpenSoundLoop() { + return "hbm:door.garage_move"; + }; + + public float getSoundVolume() { + return 2; + } + + @Override + @SideOnly(Side.CLIENT) + public double[][] getClippingPlanes() { + return new double[][] { { 0.0, 0.0, 1.0, 3.50001 }, { 0.0, 0.0, -1.0, 3.50001 } }; + }; + + @Override + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + if(!open) + return super.getBlockBound(x, y, z, open); + if(z == 3) { + return AxisAlignedBB.getBoundingBox(0.4, 0, 0, 1, 1, 1); + } else if(z == -3) { + return AxisAlignedBB.getBoundingBox(0, 0, 0, 0.6, 1, 1); + } + return super.getBlockBound(x, y, z, open); + }; + + @Override + public int timeToOpen() { + return 60; + }; + + @Override + public int[][] getDoorOpenRanges() { + return new int[][] { { 0, 0, 0, -4, 6, 2 }, { 0, 0, 0, 4, 6, 2 } }; + } + + @Override + public int[] getDimensions() { + return new int[] { 5, 0, 0, 0, 3, 3 }; + }; + + @Override + @SideOnly(Side.CLIENT) + public ResourceLocation getTextureForPart(String partName) { + return ResourceManager.large_vehicle_door_tex; + } + + @Override + public ResourceLocation getTextureForPart(int skinIndex, String partName) { + return ResourceManager.large_vehicle_door_tex; + } + + @Override + @SideOnly(Side.CLIENT) + public WavefrontObjDisplayList getModel() { + return ResourceManager.large_vehicle_door; + } + + }; + + // Format: x, y, z, tangent amount 1 (how long the door would be if it moved + // up), tangent amount 2 (door places blocks in this direction), axis (0-x, + // 1-y, 2-z) + public abstract int[][] getDoorOpenRanges(); + + public abstract int[] getDimensions(); + + public float getDoorRangeOpenTime(int ticks, int idx) { + return getNormTime(ticks); + } + + public int timeToOpen() { + return 20; + } + + public float getNormTime(float time) { + return getNormTime(time, 0, timeToOpen()); + } + + public float getNormTime(float time, float min, float max) { + return BobMathUtil.remap01_clamp(time, min, max); + } + + public boolean hasSkins() { + return false; + } + + public int getSkinCount() { + return 0; + } + + @SideOnly(Side.CLIENT) + public ResourceLocation getTextureForPart(String partName) { + return getTextureForPart(0, partName); + } + + @SideOnly(Side.CLIENT) + public abstract ResourceLocation getTextureForPart(int skinIndex, String partName); + + @SideOnly(Side.CLIENT) + public abstract WavefrontObjDisplayList getModel(); + + @SideOnly(Side.CLIENT) + public AnimatedModel getAnimatedModel() { + return null; + } + + @SideOnly(Side.CLIENT) + public Animation getAnim() { + return null; + } + + @SideOnly(Side.CLIENT) + public void getTranslation(String partName, float openTicks, boolean child, float[] trans) { + set(trans, 0, 0, 0); + } + + @SideOnly(Side.CLIENT) + public void getRotation(String partName, float openTicks, float[] rot) { + set(rot, 0, 0, 0); + } + + @SideOnly(Side.CLIENT) + public void getOrigin(String partName, float[] orig) { + set(orig, 0, 0, 0); + } + + @SideOnly(Side.CLIENT) + public boolean doesRender(String partName, boolean child) { + return true; + } + + private static final String[] nothing = new String[] {}; + + @SideOnly(Side.CLIENT) + public String[] getChildren(String partName) { + return nothing; + } + + @SideOnly(Side.CLIENT) + public double[][] getClippingPlanes() { + return new double[][] {}; + } + + @SideOnly(Side.CLIENT) + public void doOffsetTransform() { + } + + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + return open ? AxisAlignedBB.getBoundingBox(0, 0, 0, 0, 0, 0) : AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 1, 1); + } + + public boolean isLadder(boolean open) { + return false; + } + + public String getOpenSoundLoop() { + return null; + } + + // Hack + public String getSoundLoop2() { + return null; + } + + public String getCloseSoundLoop() { + return getOpenSoundLoop(); + } + + public String getOpenSoundStart() { + return null; + } + + public String getCloseSoundStart() { + return getOpenSoundStart(); + } + + public String getOpenSoundEnd() { + return null; + } + + public String getCloseSoundEnd() { + return getOpenSoundEnd(); + } + + public float getSoundVolume() { + return 1; + } + + public float[] set(float[] f, float x, float y, float z) { + f[0] = x; + f[1] = y; + f[2] = z; + return f; + } } diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java index 24a739811..6dd6a97be 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java @@ -23,6 +23,7 @@ import com.hbm.packet.AuxGaugePacket; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.TEMissileMultipartPacket; import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.IRadarCommandReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.fauxpointtwelve.DirPos; @@ -47,7 +48,7 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityCompactLauncher extends TileEntityLoadedBase implements ISidedInventory, IFluidContainer, IFluidAcceptor, IEnergyUser, IFluidStandardReceiver, IGUIProvider { +public class TileEntityCompactLauncher extends TileEntityLoadedBase implements ISidedInventory, IFluidContainer, IFluidAcceptor, IEnergyUser, IFluidStandardReceiver, IGUIProvider, IRadarCommandReceiver { private ItemStack slots[]; @@ -207,7 +208,7 @@ public class TileEntityCompactLauncher extends TileEntityLoadedBase implements I for(int z = -1; z <= 1; z++) { if(worldObj.isBlockIndirectlyGettingPowered(xCoord + x, yCoord, zCoord + z) && canLaunch()) { - launch(); + launchFromDesignator(); break outer; } } @@ -268,14 +269,31 @@ public class TileEntityCompactLauncher extends TileEntityLoadedBase implements I return false; } - - public void launch() { - worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:weapon.missileTakeOff", 10.0F, 1.0F); + @Override + public boolean sendCommandEntity(Entity target) { + return sendCommandPosition((int) Math.floor(target.posX), yCoord, (int) Math.floor(target.posX)); + } + + @Override + public boolean sendCommandPosition(int x, int y, int z) { + if(!canLaunch()) return false; + this.launchTo(x, z); + return true; + } + + public void launchFromDesignator() { int tX = slots[1].stackTagCompound.getInteger("xCoord"); int tZ = slots[1].stackTagCompound.getInteger("zCoord"); + this.launchTo(tX, tZ); + } + + public void launchTo(int tX, int tZ) { + + worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:weapon.missileTakeOff", 10.0F, 1.0F); + ItemMissile chip = (ItemMissile) Item.getItemById(ItemCustomMissile.readFromNBT(slots[0], "chip")); float c = (Float)chip.attributes[0]; float f = 1.0F; diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java index 1b1281ead..709db4fdb 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java @@ -25,6 +25,7 @@ import com.hbm.packet.AuxGaugePacket; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.TEMissileMultipartPacket; import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.IRadarCommandReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import api.hbm.energy.IEnergyUser; @@ -39,19 +40,22 @@ import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; import li.cil.oc.api.network.SimpleComponent; import net.minecraft.client.gui.GuiScreen; +import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) -public class TileEntityLaunchTable extends TileEntityLoadedBase implements ISidedInventory, IEnergyUser, IFluidContainer, IFluidAcceptor, IFluidStandardReceiver, IGUIProvider, SimpleComponent { +public class TileEntityLaunchTable extends TileEntityLoadedBase implements ISidedInventory, IEnergyUser, IFluidContainer, IFluidAcceptor, IFluidStandardReceiver, IGUIProvider, SimpleComponent, IRadarCommandReceiver { private ItemStack slots[]; @@ -216,7 +220,7 @@ public class TileEntityLaunchTable extends TileEntityLoadedBase implements ISide for(int z = -4; z <= 4; z++) { if(worldObj.isBlockIndirectlyGettingPowered(xCoord + x, yCoord, zCoord + z) && canLaunch()) { - launch(); + launchFromDesignator(); break outer; } } @@ -262,15 +266,47 @@ public class TileEntityLaunchTable extends TileEntityLoadedBase implements ISide return false; } - - public void launch() { - worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:weapon.missileTakeOff", 10.0F, 1.0F); + @Override + public boolean sendCommandEntity(Entity target) { + return sendCommandPosition((int) Math.floor(target.posX), yCoord, (int) Math.floor(target.posX)); + } + + @Override + public boolean sendCommandPosition(int x, int y, int z) { + if(!canLaunch()) return false; + this.launchTo(x, z); + return true; + } + + public void launchFromDesignator() { int tX = slots[1].stackTagCompound.getInteger("xCoord"); int tZ = slots[1].stackTagCompound.getInteger("zCoord"); - EntityMissileCustom missile = new EntityMissileCustom(worldObj, xCoord + 0.5F, yCoord + 2.5F, zCoord + 0.5F, tX, tZ, getStruct(slots[0])); + this.launchTo(tX, tZ); + } + + public void launchTo(int tX, int tZ) { + + worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:weapon.missileTakeOff", 10.0F, 1.0F); + + ItemMissile chip = (ItemMissile) Item.getItemById(ItemCustomMissile.readFromNBT(slots[0], "chip")); + float c = (Float)chip.attributes[0]; + float f = 1.0F; + + if(getStruct(slots[0]).fins != null) { + ItemMissile fins = (ItemMissile) Item.getItemById(ItemCustomMissile.readFromNBT(slots[0], "stability")); + f = (Float) fins.attributes[0]; + } + + Vec3 target = Vec3.createVectorHelper(xCoord - tX, 0, zCoord - tZ); + target.xCoord *= c * f; + target.zCoord *= c * f; + + target.rotateAroundY(worldObj.rand.nextFloat() * 360); + + EntityMissileCustom missile = new EntityMissileCustom(worldObj, xCoord + 0.5F, yCoord + 2.5F, zCoord + 0.5F, tX + (int)target.xCoord, tZ + (int)target.zCoord, getStruct(slots[0])); worldObj.spawnEntityInWorld(missile); subtractFuel(); diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_exposure_chamber.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_exposure_chamber.png new file mode 100644 index 000000000..f9e65f885 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/gui/processing/gui_exposure_chamber.png differ