From 6373c090812bb22c9520aced67a9a56ce2f1c3c9 Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 19 Jan 2025 22:45:37 +0100 Subject: [PATCH] PERFLUOROMETHYL WANTS TO KNOW YOUR LOCATION --- changelog | 14 ++- .../java/api/hbm/fluid/IFluidConnector.java | 2 +- .../hbm/redstoneoverradio/package-info.java | 2 +- .../machine/albion/BlockPADetector.java | 14 +++ .../blocks/machine/albion/BlockPADipole.java | 23 ++++ .../machine/albion/BlockPAQuadrupole.java | 19 +++ .../hbm/blocks/machine/albion/BlockPARFC.java | 22 ++++ .../blocks/machine/albion/BlockPASource.java | 14 +++ .../com/hbm/entity/item/EntityMovingItem.java | 19 +++ .../java/com/hbm/entity/mob/EntityFBI.java | 19 --- .../java/com/hbm/handler/WeaponAbility.java | 2 +- .../container/ContainerPADipole.java | 72 ++++++++++++ .../container/ContainerPAQuadrupole.java | 72 ++++++++++++ .../inventory/container/ContainerPARFC.java | 63 ++++++++++ .../java/com/hbm/inventory/fluid/Fluids.java | 15 ++- .../inventory/fluid/trait/FT_Heatable.java | 3 +- .../com/hbm/inventory/gui/GUIPADipole.java | 67 +++++++++++ .../hbm/inventory/gui/GUIPAQuadrupole.java | 67 +++++++++++ .../java/com/hbm/inventory/gui/GUIPARFC.java | 59 ++++++++++ .../inventory/recipes/AmmoPressRecipes.java | 31 ++++- .../inventory/recipes/CompressorRecipes.java | 2 + .../recipes/RotaryFurnaceRecipes.java | 6 +- src/main/java/com/hbm/items/ModItems.java | 65 ++--------- .../com/hbm/items/machine/ItemPACoil.java | 15 +++ .../com/hbm/items/machine/ItemRBMKRod.java | 42 ++++--- src/main/java/com/hbm/main/MainRegistry.java | 17 +++ .../hbm/render/block/RenderHangingVine.java | 51 +------- .../render/entity/item/RenderMovingItem.java | 14 +-- .../hbm/tileentity/TileEntityLoadedBase.java | 9 +- .../java/com/hbm/tileentity/TileMappings.java | 7 ++ .../machine/albion/TileEntityCooledBase.java | 109 ++++++++++++++++++ .../machine/albion/TileEntityPADetector.java | 2 +- .../machine/albion/TileEntityPADipole.java | 66 ++++++++++- .../albion/TileEntityPAQuadrupole.java | 58 +++++++++- .../machine/albion/TileEntityPARFC.java | 60 +++++++++- .../machine/albion/TileEntityPASource.java | 40 ++++++- .../tileentity/machine/rbmk/RBMKDials.java | 24 +++- src/main/java/com/hbm/util/BobMathUtil.java | 32 +++++ src/main/resources/assets/hbm/lang/de_DE.lang | 3 + src/main/resources/assets/hbm/lang/en_US.lang | 3 + .../textures/gui/fluids/perfluoromethyl.png | Bin 0 -> 491 bytes .../gui/fluids/perfluoromethyl_cold.png | Bin 0 -> 490 bytes .../gui/fluids/perfluoromethyl_hot.png | Bin 0 -> 491 bytes .../gui/particleaccelerator/gui_detector.png | Bin 0 -> 3383 bytes .../gui/particleaccelerator/gui_dipole.png | Bin 3911 -> 4129 bytes .../particleaccelerator/gui_quadrupole.png | Bin 4141 -> 4365 bytes .../gui/particleaccelerator/gui_rfc.png | Bin 0 -> 2260 bytes .../gui/particleaccelerator/gui_source.png | Bin 0 -> 3408 bytes .../models/particleaccelerator/detector.png | Bin 4008 -> 10793 bytes .../models/particleaccelerator/source.png | Bin 3278 -> 7977 bytes .../models/tank/tank_PERFLUOROMETHYL.png | Bin 0 -> 1307 bytes .../models/tank/tank_PERFLUOROMETHYL_COLD.png | Bin 0 -> 1338 bytes .../models/tank/tank_PERFLUOROMETHYL_HOT.png | Bin 0 -> 1342 bytes 53 files changed, 1043 insertions(+), 181 deletions(-) create mode 100644 src/main/java/com/hbm/inventory/container/ContainerPADipole.java create mode 100644 src/main/java/com/hbm/inventory/container/ContainerPAQuadrupole.java create mode 100644 src/main/java/com/hbm/inventory/container/ContainerPARFC.java create mode 100644 src/main/java/com/hbm/inventory/gui/GUIPADipole.java create mode 100644 src/main/java/com/hbm/inventory/gui/GUIPAQuadrupole.java create mode 100644 src/main/java/com/hbm/inventory/gui/GUIPARFC.java create mode 100644 src/main/java/com/hbm/items/machine/ItemPACoil.java create mode 100644 src/main/java/com/hbm/tileentity/machine/albion/TileEntityCooledBase.java create mode 100644 src/main/resources/assets/hbm/textures/gui/fluids/perfluoromethyl.png create mode 100644 src/main/resources/assets/hbm/textures/gui/fluids/perfluoromethyl_cold.png create mode 100644 src/main/resources/assets/hbm/textures/gui/fluids/perfluoromethyl_hot.png create mode 100644 src/main/resources/assets/hbm/textures/gui/particleaccelerator/gui_detector.png create mode 100644 src/main/resources/assets/hbm/textures/gui/particleaccelerator/gui_rfc.png create mode 100644 src/main/resources/assets/hbm/textures/gui/particleaccelerator/gui_source.png create mode 100644 src/main/resources/assets/hbm/textures/models/tank/tank_PERFLUOROMETHYL.png create mode 100644 src/main/resources/assets/hbm/textures/models/tank/tank_PERFLUOROMETHYL_COLD.png create mode 100644 src/main/resources/assets/hbm/textures/models/tank/tank_PERFLUOROMETHYL_HOT.png diff --git a/changelog b/changelog index 3b69421f4..58d91a5fb 100644 --- a/changelog +++ b/changelog @@ -1,7 +1,17 @@ ## Changed * The bedrock ore processor now has an NEI handler -* Boilers and crucibles will only consume as much heat fom the source as they can actually accept instead of a fixed rate, preventing them from wasting excess heat +* Boilers and crucibles will only consume as much heat from the source as they can actually accept instead of a fixed rate, preventing them from wasting excess heat +* Rockets can now be made with rocket fuel in addition to cordite (only requires one) +* The rocket recipes using cordite now use 3 pieces of smokeless powder instead of 2 +* Iron ore fragments now take 4x longer to process into steal using the rotary furnace, but require only a quarter of the steam per tick + * Little known secret: it is, indeed, possible to increase processing throughput by playing more than one machine. Either people don't know this, or they fear the immense cost of the rotary furnace, that being a few stone bricks, iron ingots and copper plates. Truly a king's ransom. +* Optimized rendering for conveyor belt items, each frame no longer creates a new item stack and item entity instance which need to be removed by the GC right after +* Changed fuel stats for HEAus, it's now a linear fuel with a multiplier of 35 with a heat/flux of 1.5°C +* Digamma RBMK fuel now lasts substantially longer +* RBMK dials now have gamerules for disabling rod depletion and xenon poison ## Fixed * Fixed incorrect tooltip in the automatic control rod's GUI -* Fixed recipe autogen creating recipes for nonexistant thorium bedrock ore \ No newline at end of file +* Fixed recipe autogen creating recipes for nonexistant thorium bedrock ore +* Fixed FBI agents spawning both the old and new bullet entities when firing +* Fixed dupe concerning one of the weapon abilities \ No newline at end of file diff --git a/src/main/java/api/hbm/fluid/IFluidConnector.java b/src/main/java/api/hbm/fluid/IFluidConnector.java index e299938c1..b76b3b255 100644 --- a/src/main/java/api/hbm/fluid/IFluidConnector.java +++ b/src/main/java/api/hbm/fluid/IFluidConnector.java @@ -89,5 +89,5 @@ public interface IFluidConnector extends ILoadedTile { } } - public static final boolean particleDebug = false; + public static final boolean particleDebug = true; } diff --git a/src/main/java/api/hbm/redstoneoverradio/package-info.java b/src/main/java/api/hbm/redstoneoverradio/package-info.java index 425d8e629..f3813e512 100644 --- a/src/main/java/api/hbm/redstoneoverradio/package-info.java +++ b/src/main/java/api/hbm/redstoneoverradio/package-info.java @@ -32,7 +32,7 @@ INDEX includes: optionally returning a value On the implementation side we can expect: -- ROR readers, torches which have a list of named values which are read, as well as frequencies on which these values are boradcasted +- ROR readers, torches which have a list of named values which are read, as well as frequencies on which these values are broadcasted - ROR controllers, torches which have one frequency and can receive commands with parameters which will be executed on the component - ROR programmers, torches which have a list of frequencies and return frequencies which can receive commands with parameters and then send the return value on the return frequency diff --git a/src/main/java/com/hbm/blocks/machine/albion/BlockPADetector.java b/src/main/java/com/hbm/blocks/machine/albion/BlockPADetector.java index e2f358813..e87e25adc 100644 --- a/src/main/java/com/hbm/blocks/machine/albion/BlockPADetector.java +++ b/src/main/java/com/hbm/blocks/machine/albion/BlockPADetector.java @@ -3,11 +3,14 @@ package com.hbm.blocks.machine.albion; import com.hbm.blocks.BlockDummyable; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; +import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.albion.TileEntityPADetector; import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; public class BlockPADetector extends BlockDummyable { @@ -20,10 +23,21 @@ public class BlockPADetector extends BlockDummyable { @Override public TileEntity createNewTileEntity(World world, int meta) { if(meta >= 12) return new TileEntityPADetector(); + if(meta >= 6) return new TileEntityProxyCombo().power().fluid(); return null; } + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + return standardOpenBehavior(world, x, y, z, player, side); + } + @Override public int[] getDimensions() { return new int[] {2, 2, 2, 2, 4, 4}; } @Override public int getOffset() { return 0; } @Override public int getHeightOffset() { return 2; } + + @Override + public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { + super.fillSpace(world, x, y, z, dir, o); + } } diff --git a/src/main/java/com/hbm/blocks/machine/albion/BlockPADipole.java b/src/main/java/com/hbm/blocks/machine/albion/BlockPADipole.java index 06edef74e..6e26e4fa4 100644 --- a/src/main/java/com/hbm/blocks/machine/albion/BlockPADipole.java +++ b/src/main/java/com/hbm/blocks/machine/albion/BlockPADipole.java @@ -3,11 +3,14 @@ package com.hbm.blocks.machine.albion; import com.hbm.blocks.BlockDummyable; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; +import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.albion.TileEntityPADipole; import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; public class BlockPADipole extends BlockDummyable { @@ -20,10 +23,30 @@ public class BlockPADipole extends BlockDummyable { @Override public TileEntity createNewTileEntity(World world, int meta) { if(meta >= 12) return new TileEntityPADipole(); + if(meta >= 6) return new TileEntityProxyCombo().power().fluid(); return null; } + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + return standardOpenBehavior(world, x, y, z, player, side); + } + @Override public int[] getDimensions() { return new int[] {1, 1, 1, 1, 1, 1}; } @Override public int getOffset() { return 0; } @Override public int getHeightOffset() { return 1; } + + @Override + public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { + super.fillSpace(world, x, y, z, dir, o); + + this.makeExtra(world, x + 1, y - 1, z); + this.makeExtra(world, x - 1, y - 1, z); + this.makeExtra(world, x, y - 1, z + 1); + this.makeExtra(world, x, y - 1, z - 1); + this.makeExtra(world, x + 1, y + 1, z); + this.makeExtra(world, x - 1, y + 1, z); + this.makeExtra(world, x, y + 1, z + 1); + this.makeExtra(world, x, y + 1, z - 1); + } } diff --git a/src/main/java/com/hbm/blocks/machine/albion/BlockPAQuadrupole.java b/src/main/java/com/hbm/blocks/machine/albion/BlockPAQuadrupole.java index 18ef6b85b..9f8330524 100644 --- a/src/main/java/com/hbm/blocks/machine/albion/BlockPAQuadrupole.java +++ b/src/main/java/com/hbm/blocks/machine/albion/BlockPAQuadrupole.java @@ -3,11 +3,14 @@ package com.hbm.blocks.machine.albion; import com.hbm.blocks.BlockDummyable; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; +import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.albion.TileEntityPAQuadrupole; import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; public class BlockPAQuadrupole extends BlockDummyable { @@ -20,10 +23,26 @@ public class BlockPAQuadrupole extends BlockDummyable { @Override public TileEntity createNewTileEntity(World world, int meta) { if(meta >= 12) return new TileEntityPAQuadrupole(); + if(meta >= 6) return new TileEntityProxyCombo().power().fluid(); return null; } + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + return standardOpenBehavior(world, x, y, z, player, side); + } + @Override public int[] getDimensions() { return new int[] {1, 1, 1, 1, 1, 1}; } @Override public int getOffset() { return 0; } @Override public int getHeightOffset() { return 1; } + + @Override + public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { + super.fillSpace(world, x, y, z, dir, o); + + this.makeExtra(world, x + dir.offsetX, y, z + dir.offsetZ); + this.makeExtra(world, x - dir.offsetX, y, z - dir.offsetZ); + this.makeExtra(world, x, y + 1, z); + this.makeExtra(world, x, y - 1, z); + } } diff --git a/src/main/java/com/hbm/blocks/machine/albion/BlockPARFC.java b/src/main/java/com/hbm/blocks/machine/albion/BlockPARFC.java index 454d65a7d..68e5a1dbb 100644 --- a/src/main/java/com/hbm/blocks/machine/albion/BlockPARFC.java +++ b/src/main/java/com/hbm/blocks/machine/albion/BlockPARFC.java @@ -3,11 +3,14 @@ package com.hbm.blocks.machine.albion; import com.hbm.blocks.BlockDummyable; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; +import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.albion.TileEntityPARFC; import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; public class BlockPARFC extends BlockDummyable { @@ -20,10 +23,29 @@ public class BlockPARFC extends BlockDummyable { @Override public TileEntity createNewTileEntity(World world, int meta) { if(meta >= 12) return new TileEntityPARFC(); + if(meta >= 6) return new TileEntityProxyCombo().power().fluid(); return null; } + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + return standardOpenBehavior(world, x, y, z, player, side); + } + @Override public int[] getDimensions() { return new int[] {1, 1, 1, 1, 4, 4}; } @Override public int getOffset() { return 0; } @Override public int getHeightOffset() { return 1; } + + @Override + public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { + super.fillSpace(world, x, y, z, dir, o); + + dir = dir.getRotation(ForgeDirection.UP); + this.makeExtra(world, x + dir.offsetX * 3, y + 1, z + dir.offsetZ * 3); + this.makeExtra(world, x - dir.offsetX * 3, y + 1, z - dir.offsetZ * 3); + this.makeExtra(world, x, y + 1, z); + this.makeExtra(world, x + dir.offsetX * 3, y - 1, z + dir.offsetZ * 3); + this.makeExtra(world, x - dir.offsetX * 3, y - 1, z - dir.offsetZ * 3); + this.makeExtra(world, x, y - 1, z); + } } diff --git a/src/main/java/com/hbm/blocks/machine/albion/BlockPASource.java b/src/main/java/com/hbm/blocks/machine/albion/BlockPASource.java index c4c7deb84..82f7dbae1 100644 --- a/src/main/java/com/hbm/blocks/machine/albion/BlockPASource.java +++ b/src/main/java/com/hbm/blocks/machine/albion/BlockPASource.java @@ -3,11 +3,14 @@ package com.hbm.blocks.machine.albion; import com.hbm.blocks.BlockDummyable; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; +import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.albion.TileEntityPASource; import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; public class BlockPASource extends BlockDummyable { @@ -20,10 +23,21 @@ public class BlockPASource extends BlockDummyable { @Override public TileEntity createNewTileEntity(World world, int meta) { if(meta >= 12) return new TileEntityPASource(); + if(meta >= 6) return new TileEntityProxyCombo().power().fluid(); return null; } + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + return standardOpenBehavior(world, x, y, z, player, side); + } + @Override public int[] getDimensions() { return new int[] {1, 1, 1, 1, 4, 4}; } @Override public int getOffset() { return 0; } @Override public int getHeightOffset() { return 1; } + + @Override + public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { + super.fillSpace(world, x, y, z, dir, o); + } } diff --git a/src/main/java/com/hbm/entity/item/EntityMovingItem.java b/src/main/java/com/hbm/entity/item/EntityMovingItem.java index 0fa248c5f..4a6ed80c0 100644 --- a/src/main/java/com/hbm/entity/item/EntityMovingItem.java +++ b/src/main/java/com/hbm/entity/item/EntityMovingItem.java @@ -15,6 +15,8 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class EntityMovingItem extends EntityMovingConveyorObject implements IConveyorItem { + + public EntityItem cacheForRender = null; public EntityMovingItem(World p_i1582_1_) { super(p_i1582_1_); @@ -67,6 +69,23 @@ public class EntityMovingItem extends EntityMovingConveyorObject implements ICon this.getDataWatcher().addObjectByDataType(10, 5); } + @Override + public void onUpdate() { + super.onUpdate(); + + if(worldObj.isRemote) { + ItemStack item = this.getItemStack(); + //initial cache creation + if(this.cacheForRender == null) { + cacheForRender = new EntityItem(worldObj, 0, 0, 0, item); + } + //if the cache is no longer relevant, update + if(!ItemStack.areItemStacksEqual(cacheForRender.getEntityItem(), item)) { + cacheForRender.setEntityItemStack(item); + } + } + } + @Override protected void readEntityFromNBT(NBTTagCompound nbt) { diff --git a/src/main/java/com/hbm/entity/mob/EntityFBI.java b/src/main/java/com/hbm/entity/mob/EntityFBI.java index 346339226..a20e5c415 100644 --- a/src/main/java/com/hbm/entity/mob/EntityFBI.java +++ b/src/main/java/com/hbm/entity/mob/EntityFBI.java @@ -8,7 +8,6 @@ import com.hbm.blocks.ModBlocks; import com.hbm.config.MobConfig; import com.hbm.entity.mob.ai.EntityAIBreaking; import com.hbm.entity.pathfinder.PathFinderUtils; -import com.hbm.entity.projectile.EntityBullet; import com.hbm.items.ModItems; import net.minecraft.block.Block; @@ -141,24 +140,6 @@ public class EntityFBI extends EntityMob implements IRangedAttackMob { @Override public void attackEntityWithRangedAttack(EntityLivingBase entity, float f) { - - if(this.getEquipmentInSlot(0) != null) { - if(this.getEquipmentInSlot(0).getItem() == ModItems.gun_heavy_revolver) { - EntityBullet bullet = new EntityBullet(worldObj, this, entity, 3F, 2); - bullet.damage = 10; - this.worldObj.spawnEntityInWorld(bullet); - this.playSound("hbm:weapon.revolverShootAlt", 1.0F, 1.0F); - } - - if(this.getEquipmentInSlot(0).getItem() == ModItems.gun_spas12) { - for(int i = 0; i < 7; i++) { - EntityBullet bullet = new EntityBullet(worldObj, this, entity, 3F, 5); - bullet.damage = 3; - this.worldObj.spawnEntityInWorld(bullet); - } - this.playSound("hbm:weapon.shotgunShoot", 1.0F, 1.0F); - } - } } private static final Set canDestroy = new HashSet(); diff --git a/src/main/java/com/hbm/handler/WeaponAbility.java b/src/main/java/com/hbm/handler/WeaponAbility.java index 46025acce..c4f953993 100644 --- a/src/main/java/com/hbm/handler/WeaponAbility.java +++ b/src/main/java/com/hbm/handler/WeaponAbility.java @@ -82,7 +82,7 @@ public abstract class WeaponAbility { if(victim instanceof EntityLivingBase) { EntityLivingBase living = (EntityLivingBase) victim; - + if(living.getHealth() <= 0) return; living.setHealth(living.getHealth() - amount); if(living.getHealth() <= 0) living.onDeath(DamageSource.magic); player.heal(amount); diff --git a/src/main/java/com/hbm/inventory/container/ContainerPADipole.java b/src/main/java/com/hbm/inventory/container/ContainerPADipole.java new file mode 100644 index 000000000..0240a78a7 --- /dev/null +++ b/src/main/java/com/hbm/inventory/container/ContainerPADipole.java @@ -0,0 +1,72 @@ +package com.hbm.inventory.container; + +import com.hbm.items.ModItems; +import com.hbm.tileentity.machine.albion.TileEntityPADipole; + +import api.hbm.energymk2.IBatteryItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerPADipole extends Container { + + private TileEntityPADipole quadrupole; + + public ContainerPADipole(InventoryPlayer playerInv, TileEntityPADipole tile) { + quadrupole = tile; + + //Battery + this.addSlotToContainer(new Slot(tile, 0, 8, 72)); + //Coil + this.addSlotToContainer(new Slot(tile, 1, 89, 36)); + + for(int i = 0; i < 3; i++) { + for(int j = 0; j < 9; j++) { + this.addSlotToContainer(new Slot(playerInv, j + i * 9 + 9, 8 + j * 18, 122 + i * 18)); + } + } + + for(int i = 0; i < 9; i++) { + this.addSlotToContainer(new Slot(playerInv, i, 8 + i * 18, 180)); + } + } + + @Override + public boolean canInteractWith(EntityPlayer player) { + return quadrupole.isUseableByPlayer(player); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int index) { + ItemStack rStack = null; + Slot slot = (Slot) this.inventorySlots.get(index); + + if(slot != null && slot.getHasStack()) { + ItemStack stack = slot.getStack(); + rStack = stack.copy(); + + if(index <= 1) { + if(!this.mergeItemStack(stack, 2, this.inventorySlots.size(), true)) { + return null; + } + } else { + + if(rStack.getItem() instanceof IBatteryItem || rStack.getItem() == ModItems.battery_creative) { + if(!this.mergeItemStack(stack, 0, 1, false)) return null; + } else { + if(!this.mergeItemStack(stack, 1, 2, false)) return null; + } + } + + if(stack.stackSize == 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + } + + return rStack; + } +} diff --git a/src/main/java/com/hbm/inventory/container/ContainerPAQuadrupole.java b/src/main/java/com/hbm/inventory/container/ContainerPAQuadrupole.java new file mode 100644 index 000000000..eefd839db --- /dev/null +++ b/src/main/java/com/hbm/inventory/container/ContainerPAQuadrupole.java @@ -0,0 +1,72 @@ +package com.hbm.inventory.container; + +import com.hbm.items.ModItems; +import com.hbm.tileentity.machine.albion.TileEntityPAQuadrupole; + +import api.hbm.energymk2.IBatteryItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerPAQuadrupole extends Container { + + private TileEntityPAQuadrupole quadrupole; + + public ContainerPAQuadrupole(InventoryPlayer playerInv, TileEntityPAQuadrupole tile) { + quadrupole = tile; + + //Battery + this.addSlotToContainer(new Slot(tile, 0, 26, 72)); + //Coil + this.addSlotToContainer(new Slot(tile, 1, 71, 36)); + + for(int i = 0; i < 3; i++) { + for(int j = 0; j < 9; j++) { + this.addSlotToContainer(new Slot(playerInv, j + i * 9 + 9, 8 + j * 18, 122 + i * 18)); + } + } + + for(int i = 0; i < 9; i++) { + this.addSlotToContainer(new Slot(playerInv, i, 8 + i * 18, 180)); + } + } + + @Override + public boolean canInteractWith(EntityPlayer player) { + return quadrupole.isUseableByPlayer(player); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int index) { + ItemStack rStack = null; + Slot slot = (Slot) this.inventorySlots.get(index); + + if(slot != null && slot.getHasStack()) { + ItemStack stack = slot.getStack(); + rStack = stack.copy(); + + if(index <= 1) { + if(!this.mergeItemStack(stack, 2, this.inventorySlots.size(), true)) { + return null; + } + } else { + + if(rStack.getItem() instanceof IBatteryItem || rStack.getItem() == ModItems.battery_creative) { + if(!this.mergeItemStack(stack, 0, 1, false)) return null; + } else { + if(!this.mergeItemStack(stack, 1, 2, false)) return null; + } + } + + if(stack.stackSize == 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + } + + return rStack; + } +} diff --git a/src/main/java/com/hbm/inventory/container/ContainerPARFC.java b/src/main/java/com/hbm/inventory/container/ContainerPARFC.java new file mode 100644 index 000000000..ebbc2ac1e --- /dev/null +++ b/src/main/java/com/hbm/inventory/container/ContainerPARFC.java @@ -0,0 +1,63 @@ +package com.hbm.inventory.container; + +import com.hbm.tileentity.machine.albion.TileEntityPARFC; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerPARFC extends Container { + + private TileEntityPARFC rfc; + + public ContainerPARFC(InventoryPlayer playerInv, TileEntityPARFC tile) { + rfc = tile; + + //Battery + this.addSlotToContainer(new Slot(tile, 0, 53, 72)); + + for(int i = 0; i < 3; i++) { + for(int j = 0; j < 9; j++) { + this.addSlotToContainer(new Slot(playerInv, j + i * 9 + 9, 8 + j * 18, 122 + i * 18)); + } + } + + for(int i = 0; i < 9; i++) { + this.addSlotToContainer(new Slot(playerInv, i, 8 + i * 18, 180)); + } + } + + @Override + public boolean canInteractWith(EntityPlayer player) { + return rfc.isUseableByPlayer(player); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int index) { + ItemStack rStack = null; + Slot slot = (Slot) this.inventorySlots.get(index); + + if(slot != null && slot.getHasStack()) { + ItemStack stack = slot.getStack(); + rStack = stack.copy(); + + if(index <= 0) { + if(!this.mergeItemStack(stack, 1, this.inventorySlots.size(), true)) { + return null; + } + } else { + if(!this.mergeItemStack(stack, 0, 1, false)) return null; + } + + if(stack.stackSize == 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + } + + return rStack; + } +} diff --git a/src/main/java/com/hbm/inventory/fluid/Fluids.java b/src/main/java/com/hbm/inventory/fluid/Fluids.java index ec91665bc..5b3fed36d 100644 --- a/src/main/java/com/hbm/inventory/fluid/Fluids.java +++ b/src/main/java/com/hbm/inventory/fluid/Fluids.java @@ -44,6 +44,9 @@ public class Fluids { public static FluidType ULTRAHOTSTEAM; public static FluidType COOLANT; public static FluidType COOLANT_HOT; + public static FluidType PERFLUOROMETHYL; + public static FluidType PERFLUOROMETHYL_COLD; + public static FluidType PERFLUOROMETHYL_HOT; public static FluidType LAVA; public static FluidType DEUTERIUM; public static FluidType TRITIUM; @@ -384,7 +387,10 @@ public class Fluids { VITRIOL = new FluidType("VITRIOL", 0x6E5222, 2, 0, 1, EnumSymbol.NONE).addTraits(LIQUID, VISCOUS); SLOP = new FluidType("SLOP", 0x929D45, 0, 0, 0, EnumSymbol.NONE).addTraits(LIQUID, VISCOUS); LEAD = new FluidType("LEAD", 0x666672, 4, 0, 0, EnumSymbol.NONE).setTemp(350).addTraits(LIQUID, VISCOUS); - LEAD_HOT = new FluidType(143, "LEAD_HOT", 0x776563, 4, 0, 0, EnumSymbol.NONE).setTemp(1500).addTraits(LIQUID, VISCOUS); + LEAD_HOT = new FluidType("LEAD_HOT", 0x776563, 4, 0, 0, EnumSymbol.NONE).setTemp(1500).addTraits(LIQUID, VISCOUS); + PERFLUOROMETHYL = new FluidType("PERFLUOROMETHYL", 0xBDC8DC, 1, 0, 1, EnumSymbol.NONE).setTemp(15).addTraits(LIQUID); + PERFLUOROMETHYL_COLD = new FluidType("PERFLUOROMETHYL_COLD",0x99DADE, 1, 0, 1, EnumSymbol.NONE).setTemp(-150).addTraits(LIQUID); + PERFLUOROMETHYL_HOT = new FluidType(146, "PERFLUOROMETHYL_HOT",0xB899DE, 1, 0, 1, EnumSymbol.NONE).setTemp(250).addTraits(LIQUID); // ^ ^ ^ ^ ^ ^ ^ ^ //ADD NEW FLUIDS HERE @@ -414,6 +420,9 @@ public class Fluids { metaOrder.add(CARBONDIOXIDE); metaOrder.add(COOLANT); metaOrder.add(COOLANT_HOT); + metaOrder.add(PERFLUOROMETHYL); + metaOrder.add(PERFLUOROMETHYL_COLD); + metaOrder.add(PERFLUOROMETHYL_HOT); metaOrder.add(CRYOGEL); metaOrder.add(MUG); metaOrder.add(MUG_HOT); @@ -608,6 +617,10 @@ public class Fluids { COOLANT.addTraits(new FT_Heatable().setEff(HeatingType.HEATEXCHANGER, 1.0D).setEff(HeatingType.PWR, 1.0D).setEff(HeatingType.ICF, 1.0D).addStep(300, 1, COOLANT_HOT, 1)); COOLANT_HOT.addTraits(new FT_Coolable(COOLANT, 1, 1, 300).setEff(CoolingType.HEATEXCHANGER, 1.0D)); + PERFLUOROMETHYL_COLD.addTraits(new FT_Heatable().setEff(HeatingType.PA, 1.0D).addStep(300, 1, PERFLUOROMETHYL, 1)); + PERFLUOROMETHYL.addTraits(new FT_Heatable().setEff(HeatingType.HEATEXCHANGER, 1.0D).setEff(HeatingType.PWR, 1.0D).setEff(HeatingType.ICF, 1.0D).addStep(300, 1, PERFLUOROMETHYL_HOT, 1)); + PERFLUOROMETHYL_HOT.addTraits(new FT_Coolable(PERFLUOROMETHYL, 1, 1, 300).setEff(CoolingType.HEATEXCHANGER, 1.0D)); + MUG.addTraits(new FT_Heatable().setEff(HeatingType.HEATEXCHANGER, 1.0D).setEff(HeatingType.PWR, 1.0D).setEff(HeatingType.ICF, 1.25D).addStep(400, 1, MUG_HOT, 1), new FT_PWRModerator(1.15D)); MUG_HOT.addTraits(new FT_Coolable(MUG, 1, 1, 400).setEff(CoolingType.HEATEXCHANGER, 1.0D)); diff --git a/src/main/java/com/hbm/inventory/fluid/trait/FT_Heatable.java b/src/main/java/com/hbm/inventory/fluid/trait/FT_Heatable.java index f5c25c89e..f51d64ab8 100644 --- a/src/main/java/com/hbm/inventory/fluid/trait/FT_Heatable.java +++ b/src/main/java/com/hbm/inventory/fluid/trait/FT_Heatable.java @@ -71,7 +71,8 @@ public class FT_Heatable extends FluidTrait { BOILER("Boilable"), HEATEXCHANGER("Heatable"), PWR("PWR Coolant"), - ICF("ICF Coolant"); + ICF("ICF Coolant"), + PA("Particle Accelerator Coolant"); public String name; diff --git a/src/main/java/com/hbm/inventory/gui/GUIPADipole.java b/src/main/java/com/hbm/inventory/gui/GUIPADipole.java new file mode 100644 index 000000000..09920e519 --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUIPADipole.java @@ -0,0 +1,67 @@ +package com.hbm.inventory.gui; + +import org.lwjgl.opengl.GL11; + +import com.hbm.inventory.container.ContainerPADipole; +import com.hbm.items.ModItems; +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.machine.albion.TileEntityPADipole; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; + +public class GUIPADipole extends GuiInfoContainer { + + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/particleaccelerator/gui_dipole.png"); + private TileEntityPADipole dipole; + + public GUIPADipole(InventoryPlayer player, TileEntityPADipole slopper) { + super(new ContainerPADipole(player, slopper)); + this.dipole = slopper; + + this.xSize = 176; + this.ySize = 204; + } + + @Override + public void drawScreen(int mouseX, int mouseY, float f) { + super.drawScreen(mouseX, mouseY, f); + + dipole.tanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 134, guiTop + 36, 16, 52); + dipole.tanks[1].renderTankInfo(this, mouseX, mouseY, guiLeft + 152, guiTop + 36, 16, 52); + this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 18, 16, 52, dipole.power, dipole.getMaxPower()); + } + + @Override + protected void drawGuiContainerForegroundLayer( int i, int j) { + + String name = this.dipole.hasCustomInventoryName() ? this.dipole.getInventoryName() : I18n.format(this.dipole.getInventoryName()); + this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2 - 9, 6, 4210752); + this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); + + this.fontRendererObj.drawString(EnumChatFormatting.AQUA + "/123K", 136, 22, 4210752); + int heat = (int) Math.ceil(dipole.temperature); + String label = (heat > 123 ? EnumChatFormatting.RED : EnumChatFormatting.AQUA) + "" + heat + "K"; + this.fontRendererObj.drawString(label, 166 - this.fontRendererObj.getStringWidth(label), 12, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float interp, int x, int y) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + + int j = (int) (dipole.power * 52 / dipole.getMaxPower()); + drawTexturedModalRect(guiLeft + 8, guiTop + 70 - j, 184, 52 - j, 16, j); + + int heat = (int) Math.ceil(dipole.temperature); + if(heat <= 123) drawTexturedModalRect(guiLeft + 93, guiTop + 64, 176, 8, 8, 8); + if(dipole.slots[1] != null && dipole.slots[1].getItem() == ModItems.pa_coil) drawTexturedModalRect(guiLeft + 103, guiTop + 64, 176, 8, 8, 8); + + dipole.tanks[0].renderTank(guiLeft + 134, guiTop + 88, this.zLevel, 16, 52); + dipole.tanks[1].renderTank(guiLeft + 152, guiTop + 88, this.zLevel, 16, 52); + } +} diff --git a/src/main/java/com/hbm/inventory/gui/GUIPAQuadrupole.java b/src/main/java/com/hbm/inventory/gui/GUIPAQuadrupole.java new file mode 100644 index 000000000..cf82d6266 --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUIPAQuadrupole.java @@ -0,0 +1,67 @@ +package com.hbm.inventory.gui; + +import org.lwjgl.opengl.GL11; + +import com.hbm.inventory.container.ContainerPAQuadrupole; +import com.hbm.items.ModItems; +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.machine.albion.TileEntityPAQuadrupole; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; + +public class GUIPAQuadrupole extends GuiInfoContainer { + + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/particleaccelerator/gui_quadrupole.png"); + private TileEntityPAQuadrupole quadrupole; + + public GUIPAQuadrupole(InventoryPlayer player, TileEntityPAQuadrupole slopper) { + super(new ContainerPAQuadrupole(player, slopper)); + this.quadrupole = slopper; + + this.xSize = 176; + this.ySize = 204; + } + + @Override + public void drawScreen(int mouseX, int mouseY, float f) { + super.drawScreen(mouseX, mouseY, f); + + quadrupole.tanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 116, guiTop + 36, 16, 52); + quadrupole.tanks[1].renderTankInfo(this, mouseX, mouseY, guiLeft + 134, guiTop + 36, 16, 52); + this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 26, guiTop + 18, 16, 52, quadrupole.power, quadrupole.getMaxPower()); + } + + @Override + protected void drawGuiContainerForegroundLayer( int i, int j) { + + String name = this.quadrupole.hasCustomInventoryName() ? this.quadrupole.getInventoryName() : I18n.format(this.quadrupole.getInventoryName()); + this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2 - 9, 6, 4210752); + this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); + + this.fontRendererObj.drawString(EnumChatFormatting.AQUA + "/123K", 118, 22, 4210752); + int heat = (int) Math.ceil(quadrupole.temperature); + String label = (heat > 123 ? EnumChatFormatting.RED : EnumChatFormatting.AQUA) + "" + heat + "K"; + this.fontRendererObj.drawString(label, 148 - this.fontRendererObj.getStringWidth(label), 12, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float interp, int x, int y) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + + int j = (int) (quadrupole.power * 52 / quadrupole.getMaxPower()); + drawTexturedModalRect(guiLeft + 26, guiTop + 70 - j, 184, 52 - j, 16, j); + + int heat = (int) Math.ceil(quadrupole.temperature); + if(heat <= 123) drawTexturedModalRect(guiLeft + 75, guiTop + 64, 176, 8, 8, 8); + if(quadrupole.slots[1] != null && quadrupole.slots[1].getItem() == ModItems.pa_coil) drawTexturedModalRect(guiLeft + 85, guiTop + 64, 176, 8, 8, 8); + + quadrupole.tanks[0].renderTank(guiLeft + 116, guiTop + 88, this.zLevel, 16, 52); + quadrupole.tanks[1].renderTank(guiLeft + 134, guiTop + 88, this.zLevel, 16, 52); + } +} diff --git a/src/main/java/com/hbm/inventory/gui/GUIPARFC.java b/src/main/java/com/hbm/inventory/gui/GUIPARFC.java new file mode 100644 index 000000000..deba67b70 --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUIPARFC.java @@ -0,0 +1,59 @@ +package com.hbm.inventory.gui; + +import org.lwjgl.opengl.GL11; + +import com.hbm.inventory.container.ContainerPARFC; +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.machine.albion.TileEntityPARFC; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; + +public class GUIPARFC extends GuiInfoContainer { + + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/particleaccelerator/gui_rfc.png"); + private TileEntityPARFC quadrupole; + + public GUIPARFC(InventoryPlayer player, TileEntityPARFC slopper) { + super(new ContainerPARFC(player, slopper)); + this.quadrupole = slopper; + + this.xSize = 176; + this.ySize = 204; + } + + @Override + public void drawScreen(int mouseX, int mouseY, float f) { + super.drawScreen(mouseX, mouseY, f); + + quadrupole.tanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 89, guiTop + 36, 16, 52); + quadrupole.tanks[1].renderTankInfo(this, mouseX, mouseY, guiLeft + 107, guiTop + 36, 16, 52); + this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 53, guiTop + 18, 16, 52, quadrupole.power, quadrupole.getMaxPower()); + } + + @Override + protected void drawGuiContainerForegroundLayer( int i, int j) { + this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); + + this.fontRendererObj.drawString(EnumChatFormatting.AQUA + "/123K", 91, 22, 4210752); + int heat = (int) Math.ceil(quadrupole.temperature); + String label = (heat > 123 ? EnumChatFormatting.RED : EnumChatFormatting.AQUA) + "" + heat + "K"; + this.fontRendererObj.drawString(label, 121 - this.fontRendererObj.getStringWidth(label), 12, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float interp, int x, int y) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + + int j = (int) (quadrupole.power * 52 / quadrupole.getMaxPower()); + drawTexturedModalRect(guiLeft + 53, guiTop + 70 - j, 184, 52 - j, 16, j); + + quadrupole.tanks[0].renderTank(guiLeft + 89, guiTop + 88, this.zLevel, 16, 52); + quadrupole.tanks[1].renderTank(guiLeft + 107, guiTop + 88, this.zLevel, 16, 52); + } +} diff --git a/src/main/java/com/hbm/inventory/recipes/AmmoPressRecipes.java b/src/main/java/com/hbm/inventory/recipes/AmmoPressRecipes.java index 08c98125d..e1fddc0de 100644 --- a/src/main/java/com/hbm/inventory/recipes/AmmoPressRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AmmoPressRecipes.java @@ -41,6 +41,7 @@ public class AmmoPressRecipes extends SerializableRecipe { OreDictStack uranium = new OreDictStack(U238.ingot()); ComparableStack smokeful = new ComparableStack(Items.gunpowder); OreDictStack smokeless = new OreDictStack(ANY_SMOKELESS.dust()); + ComparableStack rocket = new ComparableStack(ModItems.rocket_fuel); OreDictStack he = new OreDictStack(ANY_HIGHEXPLOSIVE.ingot()); OreDictStack wp = new OreDictStack(P_WHITE.ingot()); OreDictStack rp = new OreDictStack(P_RED.dust()); @@ -285,23 +286,43 @@ public class AmmoPressRecipes extends SerializableRecipe { recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.ROCKET_HE, 2), null, dyn, null, null, cBig, null, - null, smokeless.copy(2), null)); + null, smokeless.copy(3), null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.ROCKET_HE, 2), + null, dyn, null, + null, cBig, null, + null, rocket, null)); recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.ROCKET_HEAT, 2), coplate, he, null, null, cBig, null, - null, smokeless.copy(2), null)); + null, smokeless.copy(3), null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.ROCKET_HEAT, 2), + coplate, he, null, + null, cBig, null, + null, rocket, null)); recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.ROCKET_DEMO, 2), null, he.copy(2), null, null, cBig, null, - null, smokeless.copy(2), null)); + null, smokeless.copy(3), null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.ROCKET_DEMO, 2), + null, he.copy(2), null, + null, cBig, null, + null, rocket, null)); recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.ROCKET_INC, 2), diesel, dyn, null, null, cBig, null, - null, smokeless.copy(2), null)); + null, smokeless.copy(3), null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.ROCKET_INC, 2), + diesel, dyn, null, + null, cBig, null, + null, rocket, null)); recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.ROCKET_PHOSPHORUS, 2), wp, he, null, null, cBig, null, - null, smokeless.copy(2), null)); + null, smokeless.copy(3), null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.ROCKET_PHOSPHORUS, 2), + wp, he, null, + null, cBig, null, + null, rocket, null)); OreDictStack sPlate = new OreDictStack(STEEL.plate()); ComparableStack napalm = new ComparableStack(ModItems.canister_napalm); diff --git a/src/main/java/com/hbm/inventory/recipes/CompressorRecipes.java b/src/main/java/com/hbm/inventory/recipes/CompressorRecipes.java index a611276ae..f6dbb99b2 100644 --- a/src/main/java/com/hbm/inventory/recipes/CompressorRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CompressorRecipes.java @@ -27,6 +27,8 @@ public class CompressorRecipes extends SerializableRecipe { recipes.put(new Pair(Fluids.PETROLEUM, 1), new CompressorRecipe(2_000, new FluidStack(Fluids.LPG, 1_000, 0), 20)); recipes.put(new Pair(Fluids.BLOOD, 3), new CompressorRecipe(1_000, new FluidStack(Fluids.HEAVYOIL, 250, 0), 200)); + + recipes.put(new Pair(Fluids.PERFLUOROMETHYL, 1), new CompressorRecipe(1_000, new FluidStack(Fluids.PERFLUOROMETHYL_COLD, 1_000, 0), 100)); } public static class CompressorRecipe { diff --git a/src/main/java/com/hbm/inventory/recipes/RotaryFurnaceRecipes.java b/src/main/java/com/hbm/inventory/recipes/RotaryFurnaceRecipes.java index 4bc753665..77fc33b8c 100644 --- a/src/main/java/com/hbm/inventory/recipes/RotaryFurnaceRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/RotaryFurnaceRecipes.java @@ -38,9 +38,9 @@ public class RotaryFurnaceRecipes extends SerializableRecipe { recipes.add(new RotaryFurnaceRecipe(new MaterialStack(MAT_STEEL, INGOT.q(1)), 100, 100, new OreDictStack(IRON.ingot()), new OreDictStack(COAL.gem()))); recipes.add(new RotaryFurnaceRecipe(new MaterialStack(MAT_STEEL, INGOT.q(1)), 100, 100, new OreDictStack(IRON.ingot()), new OreDictStack(ANY_COKE.gem()))); - recipes.add(new RotaryFurnaceRecipe(new MaterialStack(MAT_STEEL, INGOT.q(2)), 100, 100, new OreDictStack(IRON.fragment(), 9), new OreDictStack(COAL.gem()))); - recipes.add(new RotaryFurnaceRecipe(new MaterialStack(MAT_STEEL, INGOT.q(3)), 100, 100, new OreDictStack(IRON.fragment(), 9), new OreDictStack(ANY_COKE.gem()))); - recipes.add(new RotaryFurnaceRecipe(new MaterialStack(MAT_STEEL, INGOT.q(4)), 200, 100, new OreDictStack(IRON.fragment(), 9), new OreDictStack(ANY_COKE.gem()), new ComparableStack(ModItems.powder_flux))); + recipes.add(new RotaryFurnaceRecipe(new MaterialStack(MAT_STEEL, INGOT.q(2)), 400, 25, new OreDictStack(IRON.fragment(), 9), new OreDictStack(COAL.gem()))); + recipes.add(new RotaryFurnaceRecipe(new MaterialStack(MAT_STEEL, INGOT.q(3)), 400, 25, new OreDictStack(IRON.fragment(), 9), new OreDictStack(ANY_COKE.gem()))); + recipes.add(new RotaryFurnaceRecipe(new MaterialStack(MAT_STEEL, INGOT.q(4)), 800, 25, new OreDictStack(IRON.fragment(), 9), new OreDictStack(ANY_COKE.gem()), new ComparableStack(ModItems.powder_flux))); recipes.add(new RotaryFurnaceRecipe(new MaterialStack(MAT_DESH, INGOT.q(1)), 100, 200, new FluidStack(Fluids.LIGHTOIL, 100), new ComparableStack(ModItems.powder_desh_ready))); diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 1eb1ff19d..2ba03389f 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -593,25 +593,7 @@ public class ModItems { public static Item mechanism_launcher_2; public static Item mechanism_special; - public static Item assembly_iron; - public static Item assembly_steel; - public static Item assembly_lead; - public static Item assembly_gold; - public static Item assembly_schrabidium; - public static Item assembly_nightmare; - public static Item assembly_desh; - //public static Item assembly_pip; - public static Item assembly_nopip; - public static Item assembly_smg; - public static Item assembly_556; - public static Item assembly_762; - public static Item assembly_45; - public static Item assembly_uzi; - public static Item assembly_actionexpress; - public static Item assembly_calamity; - public static Item assembly_lacunae; public static Item assembly_nuke; - public static Item assembly_luna; public static Item casing; @@ -841,6 +823,8 @@ public class ModItems { public static Item demon_core_open; public static Item demon_core_closed; + public static Item pa_coil; + public static Item particle_empty; public static Item particle_hydrogen; public static Item particle_copper; @@ -2851,24 +2835,7 @@ public class ModItems { mechanism_launcher_1 = new Item().setUnlocalizedName("mechanism_launcher_1").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":mechanism_5"); mechanism_launcher_2 = new Item().setUnlocalizedName("mechanism_launcher_2").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":mechanism_6"); mechanism_special = new Item().setUnlocalizedName("mechanism_special").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":mechanism_7"); - assembly_iron = new Item().setUnlocalizedName("assembly_iron").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":assembly_iron"); - assembly_steel = new Item().setUnlocalizedName("assembly_steel").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":assembly_steel"); - assembly_lead = new Item().setUnlocalizedName("assembly_lead").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":assembly_lead"); - assembly_gold = new Item().setUnlocalizedName("assembly_gold").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":assembly_gold"); - assembly_schrabidium = new Item().setUnlocalizedName("assembly_schrabidium").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":assembly_schrabidium"); - assembly_nightmare = new Item().setUnlocalizedName("assembly_nightmare").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":assembly_nightmare"); - assembly_desh = new Item().setUnlocalizedName("assembly_desh").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":assembly_desh"); - assembly_nopip = new Item().setUnlocalizedName("assembly_nopip").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":assembly_nopip"); - assembly_smg = new Item().setUnlocalizedName("assembly_smg").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":assembly_smg"); - assembly_556 = new Item().setUnlocalizedName("assembly_556").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":assembly_556"); - assembly_762 = new Item().setUnlocalizedName("assembly_762").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":assembly_762"); - assembly_45 = new Item().setUnlocalizedName("assembly_45").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":assembly_45"); - assembly_uzi = new Item().setUnlocalizedName("assembly_uzi").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":assembly_uzi"); - assembly_actionexpress = new Item().setUnlocalizedName("assembly_actionexpress").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":assembly_actionexpress"); - assembly_calamity = new Item().setUnlocalizedName("assembly_calamity").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":assembly_calamity"); - assembly_lacunae = new Item().setUnlocalizedName("assembly_lacunae").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":assembly_lacunae"); assembly_nuke = new Item().setUnlocalizedName("assembly_nuke").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":assembly_nuke"); - assembly_luna = new Item().setUnlocalizedName("assembly_luna").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":assembly_luna"); casing = new ItemEnumMulti(ItemEnums.EnumCasingType.class, true, true).setUnlocalizedName("casing").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":casing"); wiring_red_copper = new ItemWiring().setUnlocalizedName("wiring_red_copper").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":wiring_red_copper"); @@ -2928,6 +2895,8 @@ public class ModItems { demon_core_open = new ItemDemonCore().setUnlocalizedName("demon_core_open").setCreativeTab(MainRegistry.nukeTab).setTextureName(RefStrings.MODID + ":demon_core_open"); demon_core_closed = new Item().setUnlocalizedName("demon_core_closed").setCreativeTab(MainRegistry.nukeTab).setTextureName(RefStrings.MODID + ":demon_core_closed"); + + pa_coil = new ItemPACoil().setUnlocalizedName("pa_coil").setCreativeTab(MainRegistry.nukeTab).setTextureName(RefStrings.MODID + ":pa_coil"); particle_empty = new Item().setUnlocalizedName("particle_empty").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":particle_empty"); particle_hydrogen = new Item().setUnlocalizedName("particle_hydrogen").setCreativeTab(MainRegistry.controlTab).setContainerItem(ModItems.particle_empty).setTextureName(RefStrings.MODID + ":particle_hydrogen"); @@ -3488,9 +3457,9 @@ public class ModItems { rbmk_fuel_heaus = (ItemRBMKRod) new ItemRBMKRod(rbmk_pellet_heaus) .setYield(100000000D) .setStats(35) - .setFunction(EnumBurnFunc.SQUARE_ROOT) + .setFunction(EnumBurnFunc.LINEAR) .setXenon(0.05D, 50D) - .setHeat(2D) + .setHeat(1.5D) .setMeltingPoint(5211).setUnlocalizedName("rbmk_fuel_heaus").setTextureName(RefStrings.MODID + ":rbmk_fuel_heaus"); rbmk_fuel_po210be = (ItemRBMKRod) new ItemRBMKRod(rbmk_pellet_po210be) .setYield(25000000D) @@ -3568,7 +3537,7 @@ public class ModItems { .setMeltingPoint(2744) .setUnlocalizedName("rbmk_fuel_zfb_am_mix").setTextureName(RefStrings.MODID + ":rbmk_fuel_zfb_am_mix"); rbmk_fuel_drx = (ItemRBMKRod) new ItemRBMKRod(rbmk_pellet_drx) - .setYield(1000000D) + .setYield(10000000D) .setStats(1000, 10) .setFunction(EnumBurnFunc.QUADRATIC) .setHeat(0.1D) @@ -5714,24 +5683,7 @@ public class ModItems { GameRegistry.registerItem(casing, casing.getUnlocalizedName()); //Bullet Assemblies - GameRegistry.registerItem(assembly_iron, assembly_iron.getUnlocalizedName()); - GameRegistry.registerItem(assembly_steel, assembly_steel.getUnlocalizedName()); - GameRegistry.registerItem(assembly_lead, assembly_lead.getUnlocalizedName()); - GameRegistry.registerItem(assembly_gold, assembly_gold.getUnlocalizedName()); - GameRegistry.registerItem(assembly_schrabidium, assembly_schrabidium.getUnlocalizedName()); - GameRegistry.registerItem(assembly_nightmare, assembly_nightmare.getUnlocalizedName()); - GameRegistry.registerItem(assembly_desh, assembly_desh.getUnlocalizedName()); - GameRegistry.registerItem(assembly_nopip, assembly_nopip.getUnlocalizedName()); - GameRegistry.registerItem(assembly_smg, assembly_smg.getUnlocalizedName()); - GameRegistry.registerItem(assembly_556, assembly_556.getUnlocalizedName()); - GameRegistry.registerItem(assembly_762, assembly_762.getUnlocalizedName()); - GameRegistry.registerItem(assembly_45, assembly_45.getUnlocalizedName()); - GameRegistry.registerItem(assembly_uzi, assembly_uzi.getUnlocalizedName()); - GameRegistry.registerItem(assembly_lacunae, assembly_lacunae.getUnlocalizedName()); - GameRegistry.registerItem(assembly_actionexpress, assembly_actionexpress.getUnlocalizedName()); - GameRegistry.registerItem(assembly_calamity, assembly_calamity.getUnlocalizedName()); GameRegistry.registerItem(assembly_nuke, assembly_nuke.getUnlocalizedName()); - GameRegistry.registerItem(assembly_luna, assembly_luna.getUnlocalizedName()); //Wiring GameRegistry.registerItem(wiring_red_copper, wiring_red_copper.getUnlocalizedName()); @@ -5785,6 +5737,9 @@ public class ModItems { GameRegistry.registerItem(demon_core_open, demon_core_open.getUnlocalizedName()); GameRegistry.registerItem(demon_core_closed, demon_core_closed.getUnlocalizedName()); + //PA + GameRegistry.registerItem(pa_coil, pa_coil.getUnlocalizedName()); + //Particle Containers GameRegistry.registerItem(particle_empty, particle_empty.getUnlocalizedName()); GameRegistry.registerItem(particle_hydrogen, particle_hydrogen.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/machine/ItemPACoil.java b/src/main/java/com/hbm/items/machine/ItemPACoil.java new file mode 100644 index 000000000..32e898430 --- /dev/null +++ b/src/main/java/com/hbm/items/machine/ItemPACoil.java @@ -0,0 +1,15 @@ +package com.hbm.items.machine; + +import com.hbm.items.ItemEnumMulti; + +public class ItemPACoil extends ItemEnumMulti { + + public ItemPACoil() { + super(EnumCoilType.class, true, true); + this.setMaxStackSize(1); + } + + public static enum EnumCoilType { + GOLD, NIOBIUM, BSCCO + } +} diff --git a/src/main/java/com/hbm/items/machine/ItemRBMKRod.java b/src/main/java/com/hbm/items/machine/ItemRBMKRod.java index d02a393d2..895c788c6 100644 --- a/src/main/java/com/hbm/items/machine/ItemRBMKRod.java +++ b/src/main/java/com/hbm/items/machine/ItemRBMKRod.java @@ -134,26 +134,32 @@ public class ItemRBMKRod extends Item { inFlux += selfRate; - double xenon = getPoison(stack); - xenon -= xenonBurnFunc(inFlux); - - inFlux *= (1D - getPoisonLevel(stack)); - - xenon += xenonGenFunc(inFlux); - - if(xenon < 0D) xenon = 0D; - if(xenon > 100D) xenon = 100D; - - setPoison(stack, xenon); + //if xenon poison is enabled + if(RBMKDials.getXenon(world)) { + double xenon = getPoison(stack); + xenon -= xenonBurnFunc(inFlux); + + inFlux *= (1D - getPoisonLevel(stack)); + + xenon += xenonGenFunc(inFlux); + + if(xenon < 0D) xenon = 0D; + if(xenon > 100D) xenon = 100D; + + setPoison(stack, xenon); + } double outFlux = reactivityFunc(inFlux, getEnrichment(stack)) * RBMKDials.getReactivityMod(world); - - double y = getYield(stack); - y -= inFlux; - - if(y < 0D) y = 0D; - - setYield(stack, y); + + //if depletion is enabled + if(RBMKDials.getDepletion(world)) { + double y = getYield(stack); + y -= inFlux; + + if(y < 0D) y = 0D; + + setYield(stack, y); + } double coreHeat = this.getCoreHeat(stack); coreHeat += outFlux * heat; diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 8f818c9a0..798e8f831 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -1623,6 +1623,23 @@ public class MainRegistry { ignoreMappings.add("hbm:item.casing_9"); ignoreMappings.add("hbm:item.casing_50"); ignoreMappings.add("hbm:item.casing_buckshot"); + ignoreMappings.add("hbm:item.assembly_iron"); + ignoreMappings.add("hbm:item.assembly_steel"); + ignoreMappings.add("hbm:item.assembly_lead"); + ignoreMappings.add("hbm:item.assembly_gold"); + ignoreMappings.add("hbm:item.assembly_schrabidium"); + ignoreMappings.add("hbm:item.assembly_nightmare"); + ignoreMappings.add("hbm:item.assembly_desh"); + ignoreMappings.add("hbm:item.assembly_nopip"); + ignoreMappings.add("hbm:item.assembly_smg"); + ignoreMappings.add("hbm:item.assembly_556"); + ignoreMappings.add("hbm:item.assembly_762"); + ignoreMappings.add("hbm:item.assembly_45"); + ignoreMappings.add("hbm:item.assembly_uzi"); + ignoreMappings.add("hbm:item.assembly_actionexpress"); + ignoreMappings.add("hbm:item.assembly_calamity"); + ignoreMappings.add("hbm:item.assembly_lacunae"); + ignoreMappings.add("hbm:item.assembly_luna"); /// REMAP /// remapItems.put("hbm:item.gadget_explosive8", ModItems.early_explosive_lenses); diff --git a/src/main/java/com/hbm/render/block/RenderHangingVine.java b/src/main/java/com/hbm/render/block/RenderHangingVine.java index 074182693..7f0aa0c48 100644 --- a/src/main/java/com/hbm/render/block/RenderHangingVine.java +++ b/src/main/java/com/hbm/render/block/RenderHangingVine.java @@ -1,8 +1,5 @@ package com.hbm.render.block; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; - import com.hbm.blocks.generic.BlockHangingVine; import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; @@ -15,53 +12,7 @@ import net.minecraft.world.IBlockAccess; public class RenderHangingVine implements ISimpleBlockRenderingHandler { @Override - public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { - //TextureUtil.func_152777_a(false, false, 1.0F); - - GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); - GL11.glRotatef(30.0F, -1.0F, 0.0F, 0.0F); - GL11.glTranslatef(-1.0F, -0.5F, -1.0F); - - /*GL11.glRotatef(-90.0F, 0.0F, 1.0F, 0.0F); - GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); - GL11.glRotatef(210.0F, 1.0F, 0.0F, 0.0F); - GL11.glScalef(1.0F, 1.0F, -1.0F); - GL11.glTranslatef(1.0F, 0.5F, 1.0F); - GL11.glScalef(10.0F, 10.0F, 10.0F);*/ - - - IIcon iicon0 = ((BlockHangingVine) block).iconHang; - IIcon iicon1 = ((BlockHangingVine) block).iconHangGlow; - renderStandard2D(iicon0); - renderStandard2D(iicon1); - - } - - public void renderStandard2D(IIcon iicon) { - Tessellator tessellator = Tessellator.instance; - float f = iicon.getMinU(); - float f1 = iicon.getMaxU(); - float f2 = iicon.getMinV(); - float f3 = iicon.getMaxV(); - float f4 = 0.0F; - float f5 = 0.3F; - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - //GL11.glTranslatef(-f4, -f5, 0.0F); - float f6 = 1.5F; - //GL11.glScalef(f6, f6, f6); - //GL11.glRotatef(50.0F, 0.0F, 1.0F, 0.0F); - //GL11.glRotatef(335.0F, 0.0F, 0.0F, 1.0F); - //GL11.glTranslatef(-0.9375F, -0.0625F, 0.0F); - //ItemRenderer.renderItemIn2D(tessellator, f1, f2, f, f3, iicon.getIconWidth(), iicon.getIconHeight(), 0.0625F); - - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, 0.0F, 1.0F); - tessellator.addVertexWithUV(0.0D, 0.0D, 0.0D, (double)f1, (double)f3); - tessellator.addVertexWithUV(1.0D, 0.0D, 0.0D, (double)f, (double)f3); - tessellator.addVertexWithUV(1.0D, 1.0D, 0.0D, (double)f, (double)f2); - tessellator.addVertexWithUV(0.0D, 1.0D, 0.0D, (double)f1, (double)f2); - tessellator.draw(); - } + public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { } @Override public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { diff --git a/src/main/java/com/hbm/render/entity/item/RenderMovingItem.java b/src/main/java/com/hbm/render/entity/item/RenderMovingItem.java index 32743c1e1..2707069bd 100644 --- a/src/main/java/com/hbm/render/entity/item/RenderMovingItem.java +++ b/src/main/java/com/hbm/render/entity/item/RenderMovingItem.java @@ -12,7 +12,6 @@ import net.minecraft.client.renderer.entity.Render; import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.entity.Entity; -import net.minecraft.entity.item.EntityItem; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; @@ -29,7 +28,7 @@ public class RenderMovingItem extends Render { GL11.glTranslated(0, rand.nextDouble() * 0.0625, 0); EntityMovingItem item = (EntityMovingItem) entity; - ItemStack stack = item.getItemStack().copy(); + ItemStack stack = item.getItemStack(); if(!(stack.getItemSpriteNumber() == 0 && stack.getItem() instanceof ItemBlock && RenderBlocks.renderItemIn3d(Block.getBlockFromItem(stack.getItem()).getRenderType()))) { GL11.glRotatef(90F, 1.0F, 0.0F, 0.0F); @@ -40,12 +39,13 @@ public class RenderMovingItem extends Render { } } - EntityItem dummy = new EntityItem(entity.worldObj, 0, 0, 0, stack); - dummy.hoverStart = 0.0F; + if(item.cacheForRender != null) { + item.cacheForRender.hoverStart = 0.0F; - RenderItem.renderInFrame = true; - RenderManager.instance.renderEntityWithPosYaw(dummy, 0.0D, 0.0D, 0.0D, 0.0F, 0.0F); - RenderItem.renderInFrame = false; + RenderItem.renderInFrame = true; + RenderManager.instance.renderEntityWithPosYaw(item.cacheForRender, 0.0D, 0.0D, 0.0D, 0.0F, 0.0F); + RenderItem.renderInFrame = false; + } GL11.glPopMatrix(); } diff --git a/src/main/java/com/hbm/tileentity/TileEntityLoadedBase.java b/src/main/java/com/hbm/tileentity/TileEntityLoadedBase.java index 74b61d7b0..15e7bf426 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityLoadedBase.java +++ b/src/main/java/com/hbm/tileentity/TileEntityLoadedBase.java @@ -65,12 +65,9 @@ public class TileEntityLoadedBase extends TileEntity implements ILoadedTile, IBu /** Sends a sync packet that uses ByteBuf for efficient information-cramming */ public void networkPackNT(int range) { - if(worldObj.isRemote) { - return; - } + if(worldObj.isRemote) return; BufPacket packet = new BufPacket(xCoord, yCoord, zCoord, this); - ByteBuf preBuf = packet.getPreBuf(); // Don't send unnecessary packets, except for maybe one every second or so. @@ -80,9 +77,7 @@ public class TileEntityLoadedBase extends TileEntity implements ILoadedTile, IBu // In my testing, this can be reliably reproduced with a full fluid barrel, for instance. // I think it might be fixable by doing something with getDescriptionPacket() and onDataPacket(), // but this sidesteps the problem for the mean time. - if (preBuf.equals(lastPackedBuf) && this.worldObj.getWorldTime() % 20 != 0) { - return; - } + if(preBuf.equals(lastPackedBuf) && this.worldObj.getWorldTime() % 20 != 0) return; this.lastPackedBuf = preBuf.copy(); diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index d2edfe72d..f2c4a50c0 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -34,6 +34,7 @@ import com.hbm.blocks.rail.RailStandardSwitch.TileEntityRailSwitch; import com.hbm.tileentity.bomb.*; import com.hbm.tileentity.deco.*; import com.hbm.tileentity.machine.*; +import com.hbm.tileentity.machine.albion.*; import com.hbm.tileentity.machine.oil.*; import com.hbm.tileentity.machine.pile.*; import com.hbm.tileentity.machine.rbmk.*; @@ -174,6 +175,12 @@ public class TileMappings { put(TileEntityHadronDiode.class, "tileentity_hadron_diode"); put(TileEntityHadronPower.class, "tileentity_hadron_power"); put(TileEntityHadron.class, "tileentity_hadron"); + put(TileEntityPASource.class, "tileentity_pa_source"); + put(TileEntityPABeamline.class, "tileentity_pa_beamline"); + put(TileEntityPARFC.class, "tileentity_pa_rfc"); + put(TileEntityPAQuadrupole.class, "tileentity_pa_quadrupole"); + put(TileEntityPADipole.class, "tileentity_pa_dipole"); + put(TileEntityPADetector.class, "tileentity_pa_detector"); put(TileEntitySolarBoiler.class, "tileentity_solarboiler"); put(TileEntitySolarMirror.class, "tileentity_solarmirror"); put(TileEntityMachineDetector.class, "tileentity_he_detector"); diff --git a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityCooledBase.java b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityCooledBase.java new file mode 100644 index 000000000..f9ed71aaa --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityCooledBase.java @@ -0,0 +1,109 @@ +package com.hbm.tileentity.machine.albion; + +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.BobMathUtil; +import com.hbm.util.fauxpointtwelve.DirPos; + +import api.hbm.energymk2.IEnergyReceiverMK2; +import api.hbm.fluid.IFluidStandardTransceiver; +import io.netty.buffer.ByteBuf; +import net.minecraft.nbt.NBTTagCompound; + +public abstract class TileEntityCooledBase extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardTransceiver { + + public FluidTank[] tanks; + + public long power; + + public static final float KELVIN = 273F; + public float temperature = KELVIN + 20; + public static final float temperature_target = KELVIN - 150F; + public static final float temp_change_per_mb = 0.5F; + public static final float temp_passive_heating = 2.5F; + public static final float temp_change_max = 5F + temp_passive_heating; + + public TileEntityCooledBase(int slotCount) { + super(slotCount); + tanks = new FluidTank[2]; + tanks[0] = new FluidTank(Fluids.PERFLUOROMETHYL_COLD, 16_000); + tanks[1] = new FluidTank(Fluids.PERFLUOROMETHYL, 16_000); + } + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + + for(DirPos pos : this.getConPos()) { + this.trySubscribe(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + this.trySubscribe(tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + this.sendFluid(tanks[1], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + } + + this.temperature += this.temp_passive_heating; + if(this.temperature > KELVIN + 20) this.temperature = KELVIN + 20; + + if(this.temperature > this.temperature_target) { + int cyclesTemp = (int) Math.ceil((Math.min(this.temperature - temperature_target, temp_change_max)) / temp_change_per_mb); + int cyclesCool = tanks[0].getFill(); + int cyclesHot = tanks[1].getMaxFill() - tanks[1].getFill(); + int cycles = BobMathUtil.min(cyclesTemp, cyclesCool, cyclesHot); + + tanks[0].setFill(tanks[0].getFill() - cycles); + tanks[1].setFill(tanks[1].getFill() + cycles); + this.temperature -= this.temp_change_per_mb * cycles; + } + + this.networkPackNT(50); + } + } + + public abstract DirPos[] getConPos(); + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + tanks[0].serialize(buf); + tanks[1].serialize(buf); + buf.writeFloat(temperature); + buf.writeLong(power); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + tanks[0].deserialize(buf); + tanks[1].deserialize(buf); + this.temperature = buf.readFloat(); + this.power = buf.readLong(); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + tanks[0].readFromNBT(nbt, "t0"); + tanks[1].readFromNBT(nbt, "t1"); + this.temperature = nbt.getFloat("temperature"); + this.power = nbt.getLong("power"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + tanks[0].writeToNBT(nbt, "t0"); + tanks[1].writeToNBT(nbt, "t1"); + nbt.setFloat("temperature", temperature); + nbt.setLong("power", power); + } + + @Override public long getPower() { return this.power; } + @Override public void setPower(long power) { this.power = power; } + + @Override public FluidTank[] getSendingTanks() { return new FluidTank[] {tanks[1]}; } + @Override public FluidTank[] getReceivingTanks() { return new FluidTank[] {tanks[0]}; } + @Override public FluidTank[] getAllTanks() { return tanks; } +} diff --git a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPADetector.java b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPADetector.java index 61d4a7e34..14d16e722 100644 --- a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPADetector.java +++ b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPADetector.java @@ -18,7 +18,7 @@ public class TileEntityPADetector extends TileEntity { yCoord - 2, zCoord - 4, xCoord + 5, - yCoord + 1, + yCoord + 3, zCoord + 5 ); } diff --git a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPADipole.java b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPADipole.java index 72918ce3a..9e0eb7c2c 100644 --- a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPADipole.java +++ b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPADipole.java @@ -1,11 +1,49 @@ package com.hbm.tileentity.machine.albion; +import com.hbm.inventory.container.ContainerPADipole; +import com.hbm.inventory.gui.GUIPADipole; +import com.hbm.lib.Library; +import com.hbm.tileentity.IGUIProvider; +import com.hbm.util.fauxpointtwelve.DirPos; + import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.tileentity.TileEntity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityPADipole extends TileEntity { +public class TileEntityPADipole extends TileEntityCooledBase implements IGUIProvider { + + public TileEntityPADipole() { + super(2); + } + + @Override + public long getMaxPower() { + return 10_000_000; + } + + @Override + public boolean canConnect(ForgeDirection dir) { + return dir == ForgeDirection.UP || dir == ForgeDirection.DOWN; + } + + @Override + public String getName() { + return "container.paDipole"; + } + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + this.power = Library.chargeTEFromItems(slots, 0, power, this.getMaxPower()); + } + + super.updateEntity(); + } AxisAlignedBB bb = null; @@ -31,4 +69,28 @@ public class TileEntityPADipole extends TileEntity { public double getMaxRenderDistanceSquared() { return 65536.0D; } + + @Override + public DirPos[] getConPos() { + return new DirPos[] { + new DirPos(xCoord + 1, yCoord + 2, zCoord, Library.POS_Y), + new DirPos(xCoord - 1, yCoord + 2, zCoord, Library.POS_Y), + new DirPos(xCoord, yCoord + 2, zCoord + 1, Library.POS_Y), + new DirPos(xCoord, yCoord + 2, zCoord - 1, Library.POS_Y), + new DirPos(xCoord + 1, yCoord - 2, zCoord, Library.NEG_Y), + new DirPos(xCoord - 1, yCoord - 2, zCoord, Library.NEG_Y), + new DirPos(xCoord, yCoord - 2, zCoord + 1, Library.NEG_Y), + new DirPos(xCoord, yCoord - 2, zCoord - 1, Library.NEG_Y) + }; + } + + @Override + public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new ContainerPADipole(player.inventory, this); + } + + @Override + public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new GUIPADipole(player.inventory, this); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPAQuadrupole.java b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPAQuadrupole.java index 6fa01672d..99d25945a 100644 --- a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPAQuadrupole.java +++ b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPAQuadrupole.java @@ -1,11 +1,44 @@ package com.hbm.tileentity.machine.albion; +import com.hbm.inventory.container.ContainerPAQuadrupole; +import com.hbm.inventory.gui.GUIPAQuadrupole; +import com.hbm.lib.Library; +import com.hbm.tileentity.IGUIProvider; +import com.hbm.util.fauxpointtwelve.DirPos; + import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.tileentity.TileEntity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityPAQuadrupole extends TileEntity { +public class TileEntityPAQuadrupole extends TileEntityCooledBase implements IGUIProvider { + + public TileEntityPAQuadrupole() { + super(2); + } + + @Override + public long getMaxPower() { + return 10_000_000; + } + + @Override + public String getName() { + return "container.paQuadrupole"; + } + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + this.power = Library.chargeTEFromItems(slots, 0, power, this.getMaxPower()); + } + + super.updateEntity(); + } AxisAlignedBB bb = null; @@ -31,4 +64,25 @@ public class TileEntityPAQuadrupole extends TileEntity { public double getMaxRenderDistanceSquared() { return 65536.0D; } + + @Override + public DirPos[] getConPos() { + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); + return new DirPos[] { + new DirPos(xCoord, yCoord + 2, zCoord, Library.POS_Y), + new DirPos(xCoord, yCoord - 2, zCoord, Library.NEG_Y), + new DirPos(xCoord + dir.offsetX * 2, yCoord, zCoord + dir.offsetZ * 2, dir), + new DirPos(xCoord - dir.offsetX * 2, yCoord, zCoord - dir.offsetZ * 2, dir.getOpposite()) + }; + } + + @Override + public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new ContainerPAQuadrupole(player.inventory, this); + } + + @Override + public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new GUIPAQuadrupole(player.inventory, this); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPARFC.java b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPARFC.java index 1b1b604f9..694b6164f 100644 --- a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPARFC.java +++ b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPARFC.java @@ -1,11 +1,44 @@ package com.hbm.tileentity.machine.albion; +import com.hbm.inventory.container.ContainerPARFC; +import com.hbm.inventory.gui.GUIPARFC; +import com.hbm.lib.Library; +import com.hbm.tileentity.IGUIProvider; +import com.hbm.util.fauxpointtwelve.DirPos; + import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.tileentity.TileEntity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityPARFC extends TileEntity { +public class TileEntityPARFC extends TileEntityCooledBase implements IGUIProvider { + + public TileEntityPARFC() { + super(1); + } + + @Override + public long getMaxPower() { + return 10_000_000; + } + + @Override + public String getName() { + return "container.paRFC"; + } + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + this.power = Library.chargeTEFromItems(slots, 0, power, this.getMaxPower()); + } + + super.updateEntity(); + } AxisAlignedBB bb = null; @@ -31,4 +64,27 @@ public class TileEntityPARFC extends TileEntity { public double getMaxRenderDistanceSquared() { return 65536.0D; } + + @Override + public DirPos[] getConPos() { + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10).getRotation(ForgeDirection.UP); + return new DirPos[] { + new DirPos(xCoord + dir.offsetX * 3, yCoord + 2, zCoord + dir.offsetZ * 3, Library.POS_Y), + new DirPos(xCoord - dir.offsetX * 3, yCoord + 2, zCoord - dir.offsetZ * 3, Library.POS_Y), + new DirPos(xCoord, yCoord + 2, zCoord, Library.POS_Y), + new DirPos(xCoord + dir.offsetX * 3, yCoord - 2, zCoord + dir.offsetZ * 3, Library.NEG_Y), + new DirPos(xCoord - dir.offsetX * 3, yCoord - 2, zCoord - dir.offsetZ * 3, Library.NEG_Y), + new DirPos(xCoord, yCoord - 2, zCoord, Library.NEG_Y) + }; + } + + @Override + public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new ContainerPARFC(player.inventory, this); + } + + @Override + public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new GUIPARFC(player.inventory, this); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPASource.java b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPASource.java index dbf0864e7..c4937c86b 100644 --- a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPASource.java +++ b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPASource.java @@ -1,12 +1,38 @@ package com.hbm.tileentity.machine.albion; +import com.hbm.tileentity.IGUIProvider; +import com.hbm.util.fauxpointtwelve.DirPos; + import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.tileentity.TileEntity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; -public class TileEntityPASource extends TileEntity { +public class TileEntityPASource extends TileEntityCooledBase implements IGUIProvider { + public TileEntityPASource() { + super(5); + } + + @Override + public String getName() { + return "container.paSource"; + } + + @Override + public DirPos[] getConPos() { + return new DirPos[] { + + }; + } + + @Override + public long getMaxPower() { + return 10_000_000; + } + AxisAlignedBB bb = null; @Override @@ -31,4 +57,14 @@ public class TileEntityPASource extends TileEntity { public double getMaxRenderDistanceSquared() { return 65536.0D; } + + @Override + public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { + return null; + } + + @Override + public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { + return null; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java b/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java index 98bf32af6..b8e24f1c8 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/RBMKDials.java @@ -37,7 +37,9 @@ public class RBMKDials { KEY_ENABLE_MELTDOWN_OVERPRESSURE("dialEnableMeltdownOverpressure", false), KEY_MODERATOR_EFFICIENCY("dialModeratorEfficiency", 1.0), KEY_ABSORBER_EFFICIENCY("dialAbsorberEfficiency", 1.0), - KEY_REFLECTOR_EFFICIENCY("dialReflectorEfficiency", 1.0); + KEY_REFLECTOR_EFFICIENCY("dialReflectorEfficiency", 1.0), + KEY_DISABLE_DEPLETION("dialDisableDepletion", true), + KEY_DISABLE_XENON("dialDisableXenon", true); public final String keyString; public final Object defValue; @@ -108,6 +110,8 @@ public class RBMKDials { gameRules.get(RBMKKeys.KEY_MODERATOR_EFFICIENCY).add(new Tuple.Pair<>(world, GameRuleHelper.getClampedDouble(world, RBMKKeys.KEY_MODERATOR_EFFICIENCY, 0.0D, 1.0D))); gameRules.get(RBMKKeys.KEY_ABSORBER_EFFICIENCY).add(new Tuple.Pair<>(world, GameRuleHelper.getClampedDouble(world, RBMKKeys.KEY_ABSORBER_EFFICIENCY, 0.0D, 1.0D))); gameRules.get(RBMKKeys.KEY_REFLECTOR_EFFICIENCY).add(new Tuple.Pair<>(world, GameRuleHelper.getClampedDouble(world, RBMKKeys.KEY_REFLECTOR_EFFICIENCY, 0.0D, 1.0D))); + gameRules.get(RBMKKeys.KEY_DISABLE_DEPLETION).add(new Tuple.Pair<>(world, world.getGameRules().getGameRuleBooleanValue(RBMKKeys.KEY_DISABLE_DEPLETION.keyString))); + gameRules.get(RBMKKeys.KEY_DISABLE_XENON).add(new Tuple.Pair<>(world, world.getGameRules().getGameRuleBooleanValue(RBMKKeys.KEY_DISABLE_XENON.keyString))); } /** @@ -351,4 +355,22 @@ public class RBMKDials { public static double getReflectorEfficiency(World world) { return (double) getGameRule(world, RBMKKeys.KEY_REFLECTOR_EFFICIENCY); } + + /** + * Whether fuel rods should deplete, disabling this makes rods last forever + * @param world + * @return + */ + public static boolean getDepletion(World world) { + return !((boolean) getGameRule(world, RBMKKeys.KEY_DISABLE_DEPLETION)); + } + + /** + * Whether xenon poison should be calculated + * @param world + * @return + */ + public static boolean getXenon(World world) { + return !((boolean) getGameRule(world, RBMKKeys.KEY_DISABLE_XENON)); + } } diff --git a/src/main/java/com/hbm/util/BobMathUtil.java b/src/main/java/com/hbm/util/BobMathUtil.java index 5fa0b93ee..e9da65700 100644 --- a/src/main/java/com/hbm/util/BobMathUtil.java +++ b/src/main/java/com/hbm/util/BobMathUtil.java @@ -15,6 +15,38 @@ import java.util.function.ToIntFunction; public class BobMathUtil { + //finally! + public static int min(int... nums) { + int smallest = Integer.MAX_VALUE; + for(int num : nums) if(num < smallest) smallest = num; + return smallest; + } + public static int max(int... nums) { + int largest = Integer.MIN_VALUE; + for(int num : nums) if(num > largest) largest = num; + return largest; + } + public static float min(float... nums) { + float smallest = Float.MAX_VALUE; + for(float num : nums) if(num < smallest) smallest = num; + return smallest; + } + public static float max(float... nums) { + float largest = Float.MIN_VALUE; + for(float num : nums) if(num > largest) largest = num; + return largest; + } + public static double min(double... nums) { + double smallest = Double.MAX_VALUE; + for(double num : nums) if(num < smallest) smallest = num; + return smallest; + } + public static double max(double... nums) { + double largest = Double.MIN_VALUE; + for(double num : nums) if(num > largest) largest = num; + return largest; + } + public static double safeClamp(double val, double min, double max) { val = MathHelper.clamp_double(val, min, max); diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 673be961c..9c463a4b2 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -783,6 +783,9 @@ hbmfluid.oil_coker=Koker-Öl hbmfluid.oxyhydrogen=Knallgas hbmfluid.oxygen=Flüssiger Sauerstoff hbmfluid.pain=Pandemonium(III)tantalit-Lösung +hbmfluid.perfluoromethyl=Perfluormethyl +hbmfluid.perfluoromethyl_cold=Kaltes Perfluormethyl +hbmfluid.perfluoromethyl_hot=Heißes Perfluormethyl hbmfluid.peroxide=Wasserstoffperoxid hbmfluid.petroil=Gemisch hbmfluid.petroil_leaded=Bleigemisch diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 9f58fe132..54bb88c54 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -1491,6 +1491,9 @@ hbmfluid.oil_ds=Desulfurized Crude Oil hbmfluid.oxygen=Liquid Oxygen hbmfluid.oxyhydrogen=Oxyhydrogen hbmfluid.pain=Pandemonium(III)tantalite Solution +hbmfluid.perfluoromethyl=Perfluoromethyl +hbmfluid.perfluoromethyl_cold=Cold Perfluoromethyl +hbmfluid.perfluoromethyl_hot=Hot Perfluoromethyl hbmfluid.peroxide=Hydrogen Peroxide hbmfluid.petroil=Petroil hbmfluid.petroil_leaded=Leaded Petroil diff --git a/src/main/resources/assets/hbm/textures/gui/fluids/perfluoromethyl.png b/src/main/resources/assets/hbm/textures/gui/fluids/perfluoromethyl.png new file mode 100644 index 0000000000000000000000000000000000000000..864ed637b02c721cb5878b3abd10c4fb940684f4 GIT binary patch literal 491 zcmVwVv$4-hF*qQrWhz!bfRpmA+* zm7%DAK>hyn_t(0v0Eh@NMsjGaF~%SwCAZe%oMRXU+P1}x^0!h7Yb{DC+O{o|dGG)K2Z%A2f-wf?95Kdn zd#-D(S=Y7XDJ5*iXN)Q9JkO+*%3-Ax-unYLN-1KD*nBfkAZV>=+m?ObOOvK)*tQK3 zK|~4+>zrfXcSPjSXxp|jDnM3h7=}Xh&(9CG?|ZJ-EARK4X_^Y|zV8Vk6exKe#}Q); zUDthO?faf(Sr8GdwVcmqPNx&oG#wyiezewv5ZJa2=N$Hazf(u8aZO^)mDU;&A%yVt zK{idza#p8yq%o$b(KO9hg?eMHM4i{QJW&YY%RxO_-cU!K*A`DHeR-=NOWvI2t1aC$ z4aOLjWjVk+K&W}hBWkVbx{mAhiimK#-FQ46#V59D8rrrcgaAO-bzCkNVvKw~A7YGn h?|D9-2VZ1^{R85-JjBjoVQl~a002ovPDHLkV1lg5*pdJM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/gui/fluids/perfluoromethyl_cold.png b/src/main/resources/assets/hbm/textures/gui/fluids/perfluoromethyl_cold.png new file mode 100644 index 0000000000000000000000000000000000000000..ebfca113769affb7c59aa18a501ccfb93490b20b GIT binary patch literal 490 zcmV$qO8hzPgajmP6rd}5oXp>1122mo|l$K`S%#>nUMA;yUJ gp6By<@I^M*Kc&AswdPpJ(*OVf07*qoM6N<$f?8wbd;kCd literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/gui/fluids/perfluoromethyl_hot.png b/src/main/resources/assets/hbm/textures/gui/fluids/perfluoromethyl_hot.png new file mode 100644 index 0000000000000000000000000000000000000000..8a489064d61a10b1ca50bd51359b39332581f4c7 GIT binary patch literal 491 zcmVhjs_t(0v0Eh@NMsjGaF~%SwCAZe%oMRXU+P1}x^0!h7Yb{DC+O{o|dGG)K2Z%A2f-wf?95Kdn zd#-D(S=Y7XDJ5*iXN)Q9JkO+*%3-Ax-unYLN-1KD*nBfkAZV>=+m?ObOOvK)*tQK3 zK|~4+>zrfXcSPjSXxp|jDnM3h7=}Xh&(9CG?|ZJ-EARK4X_^Y|zV8Vk6exKe#}Q); zUDthO?faf(Sr8GdwVcmqPNx&oG#wyiezewv5ZJa2=N$Hazf(u8aZO^)mDU;&A%yVt zK{idza#p8yq%o$b(KO9hg?eMHM4i{QJW&YY%RxO_-cU!K*A`DHeR-=NOWvI2t1aC$ z4aOLjWjVk+K&W}hBWkVbx{mAhiimK#-FQ46#V59D8rrrcgaAO-bzCkNVvKw~A7YGn h?|D9-2VZ1^{R12VJd+aenVtXu002ovPDHLkV1j-3*i!%i literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/gui/particleaccelerator/gui_detector.png b/src/main/resources/assets/hbm/textures/gui/particleaccelerator/gui_detector.png new file mode 100644 index 0000000000000000000000000000000000000000..dad73a5535a8f941658ef849642044fd2956c05b GIT binary patch literal 3383 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 I8xn5*4Goj}QUCw| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/gui/particleaccelerator/gui_dipole.png b/src/main/resources/assets/hbm/textures/gui/particleaccelerator/gui_dipole.png index 38f9935e931ebef9b78e7ba3f4f3ce89a20d2a8f..72d2c39c58edae68bf610d1ae36c30bd8f804a21 100644 GIT binary patch literal 4129 zcmbVPcT|(xvfm*Pa*(PbasIR=dAbEx_90AXTG&&f4`YM`?qIiKQb}ao*?1Q^GZm|kmVr5(DIsvjC;)hd4YW1Q1D-97_1+R93pOvi*jAf# zX!4F#D6yuuvOgD#6w}Ya`siahZ`qGH+#7p=cJq$$m6YY5H#yC*yYK1Pd2Ox!^IXR! zZ9nC;!Nq0v>*&ruHS~VjxhC3u^UTu;1!@|81&!U!8B_&Nk0{(mRd%V5vhGdu$(RT>n{Mx2S*h5jcna)wE7~1MI3n(%IoWne zWmwDKCXt)_Ze``!gte4N!UXoCBjU+xoNdWABK0xOl@vZxxk`{jly84ZEx3e>uCKA9 z;>cy&JO%wl%gINDggRPU?g|MDlPXP0-5;0x`T5QEWS*1%J+6MF_w|gPw(P0hu5FQ? zu*OZd80)z#Lr8X)rk9u3X-2~YwR3dTCXXvhk=8KYcKchOrrSAt+UmlB+c%fTA{vKk zDdAFfdZi8cni>g&i(6VJJKt!^2tB4ye}*z2LgiH&nWBWLtE;ETWql_!_*3m)Zu*DQ zc)kn|V~H`>BduMUE@ofK+CI*jfD+zO;Qz7Q%acFVxYEX zy{Vc9MV;9ZP`)LZ!{4|l`OfuBbh~XMKlJ4ydED?JGGCKO*juR+piYG6$x*{=rB;fE zj~VAR<@$no8Uuel_4%uoev!%4$;h(m>>5{+0N+-_wocYZnhjgW~cwV zYzd{`)i`-)Q45AW$32)>YaAQ2Q<4WxTllJQ!zwI{-On@9*f|>-arvr?6m?MxZ0I~3cd@MjdAOWI%2~xOb z!3(g2$DEk+s{4Z3i|RXp7aLP|fbI5i%~Klk-~+_*HUhL3i1b8W|r?85kJQ z?Oa1Z(Gp%_E*tSOK3qs7QkJW@(y8vl%mHcvfk9E|Z2WwApH_01mWLDUZVI zhF*=-%Jucnq^D^&CQg*IG$)EP8MZuwx12W0TMmUPLk)gil`OVmbD6TsoSuiM^r&8FuPtlVwKJ{FB zwBC~OP$gek0BFmaZoB5ep;~=p%L3SQ6`62}(ko>d745-{udX}cKE6p?TN*=yvJGKA zp42`HE`0O3YS3C?g7?i#<2y>+qN@4sg3>9i9|2aZ_^!YLYY9V#-z~j;W_gkJGU9n$ zG1qdmrQa4QiB_CqW~p~RVrX!PwA!GSu!^a&^VWFNRt&KDaZ&)WCF4^MEx#F=)lJ^R zAF6jo4wx(3K4ZBrvnSG99jcO<#Rlc8t$p>0zTtS84~#q+kk^w6PGjSQ-MgTf-MtKR zdLR=pmQq*b{Z@r7$|VuciRr}nr5P8**(b{M$&0hG9H6*aZ;v+I>>M*!R&Y`PI`1($ z2iY<8uXnDPyQLR9LXghDD6_75oE_brR{v)q7Z7u->>@^I`Ervtp{8p(#e){e64&W-J+(Ak0`!3xVjc#@fIX{?>_@sts05(AzAoYk5xb zRoh}i{f8KIz!?vf*biEqs;Yu2Y6Uw62T2^bH`{|(9Wv6|YXSDml(@R41U-1$b9D|H zHLF2XGRjP;?b>RJ6U0=80x<=QtJ9%cB`S~g`m4SI<>DWjQzR}gS>U)3ghUUdC`*nN z@MPO5E9BF`6Dw-&&~j2!*NO~tL2l(FvJ2*Z3JSN+xc1m>V;%BYiLK*p$YIZ&emlL1 zOAIxStwTxzpu$(}$g4j)7vG~qnbBSlnm+kqA1ea?AlM~bur>UHh8#X*Ij*ezCq+uX zU<_nd(WkLfUalc(w)iTZ$uGUJSMs}8!!2*8w;WSl-jq z(<1AewX+(sqKv0GTXc}#Zr|Q!O{*t;%|?PW-cUj>`t)hKqv+RbU)j+e&OMaPV5d~i zm_%k%anjM&&QCNT$uo7R#sMi*v96vgQb;~e8n@apUx5?*^iRO zTisE74W&&lLcty98D++q?7}YaiAp;{5geM_+`QH}JeC|xW6l$W{y4S7xHv9{&M&Q% zwSdUJa&Tb!UT|zDClD7GUzsPqu##f7M|nj>i(<}HW`F!xP{*7rQu1T;Z#a1bDO=YJ zvt!qD%ia_OZXsv~v%j5}*SbP|EwVmn?KwbaR6QWi1(N5D-KiN z(9xrZ>>4{xY`N}&2#}^k&}89{bqR{$k{C)B_Th$BZ8T-H@AF+Q2dQ?&{zC30DJ#7 za7|*OBLo&gq5aC&KK>UvS_rpJ%v3iL-lvffD=8oPi}?8XoUgq67sU?r4L*$3J)V%XGulQQPl}x>kXR1|sSh<}rKR6g zO|#hBd69cEQ>s4L3npuP{>EGaJEbxEjoV$JQgVe9n0WI}$I#A25y9DN z3NXl7N2EYAIZ~uqj$Ey99DZiO#H_4lg!1VD}>s^x+^UB;Z1=CVn8@yP(kj< zN((LJBPVYNSq+uGw>E_Ro27{Pzyo@|jUbD39_V z?wKlU{@YPt%v#n&x@%++4R+-MOji2IW?xK$tX;i&Rb`Afn^Og3@J&Q$id#dH^!~xM gU!41|b+f}BJK_c;$4$QQ%uf&l9b@e>E%e=g0gHEts{jB1 literal 3911 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 literal 4141 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 diff --git a/src/main/resources/assets/hbm/textures/gui/particleaccelerator/gui_rfc.png b/src/main/resources/assets/hbm/textures/gui/particleaccelerator/gui_rfc.png new file mode 100644 index 0000000000000000000000000000000000000000..ac825a52f0321b4a1430de2d7ecce323c023b817 GIT binary patch literal 2260 zcmb7Fdpy+X8h?K?!wkz9l{)Np2D^mhl3Z#uCTU&LG%LF}Cz|9#?)Ph9D3P`Zq1?t6 zLyl6?Y#fXup^i1e8TVleGsl?7xDI1~s6G4noKBz5dH;Fd&-*;z@ArA0-|u#>xQz2;M>fBMqC=A!VMhL4{h{I%42;5#x~p0Op#l)e*<2{ORFG0bjN& zqi2fWpfKr)Np^^D=@YU_-rg3Mh2WO=J4mi<=Ifukkvzq+37y7-o>J9}9ow+dB247> zU-_ke5xZ^Q^|o=LKoHl652BT1CciSAY&61KH@m1XOGnRjL@eFT;B?<|E#yQQ#~&7O zJr?Hfi6`gTyMkyFZ(7q@{w!!tRygreA^RsdYIh;$=h)?DwiBhs>F62K@fP$TpYLtg z$sMykxO6IJHu^d@hm*W!8k`w*#njZa-r_|}J-M~Dl`j+uTL_+4r}!_4oxWKOtHHdz zWdl4UwW#T-+rvgl^dskc%NIxfZJ1XY9oCxP5r;QDr?RTH>Lt>jbxWEm$jr>lahSK;qyQO%Jjrf}h8kjYOk`2Q6}Bm$R~wEe_WIPsK8%{ZbwK>;myYg|X${(ub(<96 zth>|u*=gd+h$k!OKKekTNP;tOsRJ%*F3I6 zR1z1YHW1rXeM6vh2OrmAZdAG1c|0rSNg?#SPv4*&l--2cBPt=(kaT_q(0U<9Rqfmd z2{88BGBo#p0_pcbGE{c_QLw{Z+5q1eJNRHgS>yNyq31|u3(EQKN^)&8Zf0=k#u z3lf+R;~Q|lRGOW@$OcWq_XiPlcOS5O>HPq$69<$WkUVyL{qs-}IjIL6^1zd_N6K?m zNN54F?KMH^6p}}a1uh7>B@EfWc?1K}RX#>xT@a`!F$Fl<%hQo!T?iq!Gc4uW5Cfyp5}lewe$d99w^II0kOYFs~H13MId!C zbkE59A#|MI!{Is~vso-=rm&QFlQ3Nc zlwfGGxdN@^&F*h~Yc%I#rydwV+v*SGp?0!Km8 z1K~+~mf+@#DT63>DZqxmh>J4oW9Fc0U}u&AG!wK^Bp%VbQyMK&cBpo-z!UGn%Kt!- z?B;i^J>4LsKrVK+0Eup z!^02P9M&&A8v;=*%VPnX3Ez#t;435AZokG0>_sBY!DlV}{7e4iTE+f5-QC^4>i=3- zSC>^NWFC3I*n4}jwPGjxI!r=#E zbKwS>Yy zl~0XbyZxwY8Wv@^q_%Sp;s_N15ZeJR7tmNJfYJo21`tS)0T_Eg`h)8+9=jr06JNrQ z3Iw{YuCCtJgv!C_Md5JM^vsi87Q2@O0s$RuW?^yC$;oM;i#!#vn(Y&>3w@gHb3&6) zenCOW+}zwHycJ=fm|UIZ(0$;99e*$l9jTrk;d99z?Hc?DRP^eUaNU}pytPuD zcI4jJp0ILP`V+Z-Mh$jNY=W_C!7%y#z}BmzKkU9kezqx}A`ac8NtSq=L?x;mR4gN8 z|K8i|eTYL!&IIEp)v-DT!@)XLu%2~rt;K&L{#W<^ONcD>FY^2}8_z%(9U@B!Z)kk@ za;!4H()F-6;db68c^!AArhE&&X!7#})yzOHHb$*VL5daN7fCg0`<^9{i~IN+{U0{B ZY8{$7I*u#9^aFnbW_yfm^}v#v_#3v=v=IOR literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/gui/particleaccelerator/gui_source.png b/src/main/resources/assets/hbm/textures/gui/particleaccelerator/gui_source.png new file mode 100644 index 0000000000000000000000000000000000000000..864b123f18644089dd5d5348dd171227af2046ea GIT binary patch literal 3408 zcmb_edpMhE7JrkFsD?1DVKhjiohk;MYSlF^iA$@YF2%T)R^5p^AyM19w5kTHI&Ljf zg2A!|bxBeNjcKt|XVkT%sK#C5nrx=C^E~^V_I#vZ;_w|#-h}q7LVa)_a-?rw3t1rD% z5~aG%eUqpA^Sd@G-dTCXW48LEkDX=XBL&W@<)7QnZWwKlarMp~=`j{{?+;$;ue5Iv zF@B~rVm)KPq1Ev6>ydaxfkz4xb5wdUQV)wIk;&@ba;!bx3ISjKcE^Wlvpa>2svP~> zB7G+3l#S}%phcGA?Qc6H?s!**(>E_ki9{^5vgmDUFAge(7yBrlB?pf@$r@O?q28fn z8+w)Z;jI?TxsM`COH0_sECcN%3wTPh6U#am}{5 z^pl4~%(Bk-)Rg9dS!&l~w~ly6Nfc^c;j!wk#ZNzM#gll;?u)#=%&PfrzB1NNf>N_J zkVC<_*M#+N7Kl;R^_gK8(3FXg=Ie2Bx^LhoP&|{cA4>wpPA9$@i8nGbD&FbP37t$E z59D8IPcv<5Y-qq@PfcjO)R&I@E^bry%uuH06YkjY3spnH(qx*izvJ8=r}Mp@%uMa| zQ+y*L>~~9k3>eoFu*In}VSPh%rg_qeVexkH=YvLZa+W_o5^p*|Xlo2e7 zBN)|Ab#n^~H}?ft*saz6ES$i0X`T|td1VS2T#PK=n{Zh=`1q{vK7Iq()j~yH;+_xW z=z@0>lrFYD($yN;6 z^q~PKI>CVR^=Ic|dti@F?%VP{SJ#-_CgAz1p8fhe>D3^@x3-AQW=CWi{HoT6b3+fuC-9M{$|(Zx4-guJhl==;5rlB z8ou#o^4{+EIi%6iQSp3x_*aHhhjEFA0U;>N%0iOwP{;lM?r zrG`WvOjBe$@d4&_MxK=kum<75aE9~K`qaV=5nz`{8BnrhOA&)uqc?Cy%Y!=7~Y z%bm{Bmie5yV_8c2r{6f5z5Zo7M}7#FrgQBnq@=7Cp%wGq2{Qa_B@VvpmS^95V-sAn z*vOJ?q{|bpqrCKY?xd7aw5xDGJiej(s7$thQE2J`73p_=C${Hs;9n1=KVQ-gy;RAG|!_78C9ZI0xtrujxzML*McN5)i(H7)==oCoH??JuYUb);1Bvyq2}R@L7Wgq?KN(QhbaOQHGd5?c8kwn?k z1qZvk-2w{lrOpw7;H8u2i;ek#qFj3w-vY#g48U-Bai?HwUjOXmfGaV?T9ioOFlcMi z2EBI6*K@m08|wuihy;t(Cl(=2>@e{M_d%aZ+~QvreIR!)7PrkClG;@L)B{nBU&s(B zrfi$tyPYuFsuxp7Mlu!x7}8KoDmFsu(JT5H>gfv5bAR1`1a3TpNI6RAD*0{mq&!(X z4`RE?#2Co`Y#7=LlCHGgbuxG7oKQl3);b>2-(OU8J727kd$YcQrU26-26KW=O{uhK zU&w+-bkWa%rncCVBVUQxy-zW5mMU*qdGqG%0AH=KupkTWy7@Xxbv9hsXJx&&((5sn z9+USWgD}hQYopD}vfF?8HG2=GXsu0_MZvvI9_-7(2Cc4ha@V}16eZr@q4)sNXKQc` zr79%IUROlE`_LEs143$zB>YK`+S@0ZAX4E?ikOVGXyo)nU8W89a)lmn!^w#4#OcGS z4goM~>vqz52olg7;KuuXN`kSiGA3EY;@CZaMMtPVT2cA7V407)#Kq8NWX%V5LGzhzO1{B%Bgab57 zi7BcswA}4r(+dlh#W;$`0&I-)qq?T1tg7<*>WtYbw)X4c3Y(=#ksgp+kRV>)&|tR! z6HcsQ3(r>ZoG<;Gz9EH$*)E;ef|us7&QO&o{Kw0eS6TUQmPZtUuu8f5;7->}x8N@K zXoHxBBlk*Qnvjnq$_TrVo0pdtE{6AXl7Y^oUNnO13NbFd2M=ElRwE(tfbWeot}r#E z#`@S4f0moBNTmpm;ItFyZWH*ge1%1JrO%%cW$q(d2Vs30Hiq*|IjTl00#c3Myz~Sy zt=R)2X$N0>73)GbK|_SDtdG2Kr^*nlmm;Q>{-LT55m1=6sz00hAdU0KU>KB;_1Y)3 zbZX^PYFQTzCub(~FxV;-6_)P0B-Q0e(!)bHj|mOkBE$p42B=~h0PC_4MdRPcOcVM1 z`%hp_BCPnt-RbF4uB+!cmfb)tf4N45O&}oWsJ{TLrK15P2+1nsW4nC`U|9?l5SG+xLjdJVmFOuYTJj0mkEdspcAVAI>fIHIQ-rUpUtk+|u*s-3HYS6q?nPipTJ(9C@rNKSO|CWlJ8uZG29=p_lrUr!= zT_a#(E{Fo8G5}p-fKfkUVtiHfDO!nTRV$8+ah7>VYS&C@$ bS<2+2`cl8f)5qM3e#5gO5b?F9Ubp@ZBO~(3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/models/particleaccelerator/detector.png b/src/main/resources/assets/hbm/textures/models/particleaccelerator/detector.png index af0410bdd597cd086781a4ed06b442f59d0575c0..c2a747b48ce10df0f872e80e559fc727f8cb6454 100644 GIT binary patch literal 10793 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 literal 4008 zcmbtXc{r4N`+sJ^kQgBog@z=`Ac+!VH+FMmsW68~63UvT#!~i#B>O&VG&R=U&mqVG0Kk5n zo)#VeAPDe4B3QvYhMu$R;0f-jfip*dD-dxt0sy$}a9Zl-e(Ccg)Q1!Ohgz4Czx1{_ zlTLFs+x((*-KM~|Cc=}g1`rB1uw;D#d-loe0UbTSLorUKcwJkUhu#o3L#NnJ{VJT1 zl9wkIk5=B^Bes;jDUgh5zh;|>Irb5Qf4i?@(bm8J)9%Nm`RQs;wXw;#1cg1f9!uV_ z2U{XaJgrgP!taET=yXYkH`lm^dx=PT*dbok8-5JI)Z;zSGUp8F7m3~hMI$_T|~N>I)LJaLWu$p z2rZfjjB8_ouV_)gj|U0V9~koscUayXyL*D4sm^(Mbz~_R&qx>W3(A#_sJ0Up!QQ8j zS8C~*V?i6Lfh47=N#eMcKXu)e?uo~GK&f{@U^rP(rCY6`-GZfgkS6xis)18wcVHpB zj`izvIrU8S^s=Xjaot}iFA9#<3C*dJN^xwUkSkqh)Wy~^SxkUG@vzarRFy{ zN9`MbWOB_WcN~p&h6kBEvmLHW$Tot%ar9qn7L)A}hklXIz$i1`)!u~xE*Wg_A}iSc zjVmWl=pQlgPp-&a;g?`H3mZ7U{j%c~xHo6gR()Kpe&H>_9E_8WAir}bL7?#*qxO`4 z5;!bs{9Ne@oI}>M&k63I)tB%k-X>O;g%i~vVviAxcg(L9CUvDAJG=Z5XkyTiHF-g1fD6CT`2{F!*U`=Lrx)@hpkbIg@`qYw@#F}a4D{KK96kZP10QMTd$DsEaaf>(-5 zAQ;MN&WwF*E=u#Tp$df3fCqWYZpKj9G`S1*I>~#7^=n}m$zq(+1q-=Y9K2iWk3}LV zg^O7_GP_SNsNP-vw)P@UxAgZMisFhG+@~6S0o%Lrqlg!%N(@ZYK9hw=b^Zj_c z=5bn@P)euMZBI|JO}}z0J?keGBW}mKJ*`VDDu!Gq>2&pe=1W&ap^Z%@8RN2?9YRwI zw7a-c#&j61FPZEd9*x~8A67h`82Q-o1TG;$F0OGRI`?_?F&sJ(cRKkM4l1oBXUY-k zv(Qrd^MOLi(tJq{&>a3^5})?bzL_en`-O%1g;FVo5-XlY-cR7}a-YGlkd-V?tn^p3 zz9FA-_*=0A4zFh1SH;E36JK#sTWc11UBgRA>-iTC9?9v)7C?E@o47UV^TUrV;JAbj zN6q-|8%iXG4zrg?lv=1?iQ<4$vjw)(=GHd`5-)QU2-MnWn_oP3J+;3nd-z?&V+EtE z`GClxHG3qAB2{wOnEKKqK-nLK66EyX%Beo|i8WpvHxhB@#gELOnGEwQ@F@UZX`{EN z8|Qu4>r$2e6@l1pa9c;~et{q}KDO9IZ8N=868?!}P@373g1NP==(v$P*s`cI9_co6 z&Zg6zTRRP099w$@*Uxoa=7d6&Mk<9l?%W#&U+!=^eIn{hi(98U989`&^2ztL18CfV z6swCN5qg;n@AF|rk>$u<2v0!MwQ@FRzk7t~su6Xq*;j1)!xW4htA{^Q59z}u@jt3r zZNWU(rh8EF(d^jAZe(rVWw}4fuF{xK-31iF(f4PUi}8$_?bTuT3R|*cT}_6%mahm43s3f$sFg4*1{15QQpbuU?8i*#Dd$?59s zwp<^h+vu9k?s8qXqiWWBSH+^S@Ezg6#M(Iq0+FqK_Uu_Uf&ASk{ZZH=NU{ZL_Fhqv z;j(#$0>6XsUS_I!hZnjvUp}K@OfiG>TT`0|E)uby`DTMknfXGEwKE`i|IIf=I}ML)b_ZYOK;+UoXD??|6pG*R zHxV@V*}5OZRL26RYN^zcA_Y>!5PT{6X~G9{v31ah5B&)%Ob2;Zbga@5q-@y54}Kh?27);%Nk zOpJ|=zU%DlY*OL~GVxilKTC*Gd7xJo;sFbbPom9CE!UtNxSVXF4$B;^9$R!&Ov7a| z*rIz!!LR(OcU?mxUWl&VpYx4_yAz+9^9 z7@+k8%9Bu;w@V)ZS<2hc>vFM-&HZK7GGvbst__JkLuwF1jBx& z_sC^JTtpR{3H5{Db4`*!bj!pk9Yaj(PeO05%EzzxpF*R3eSNzHHMA#(mXZ|BeMY0z z3FBu1{QQtS%Il|2{nijh4mXN!pPc#fk=!@zstCqHp3sSxX_Y4pK&x?7o>r9`VIQ(9 zlB;-?=Mv^sM6Xy6xC4(EjGV1?^G%`8)wPMXF>Y}oUG04Fm9@%iCRCKaQ2C{j`nG}W z3RwQal*-2QQ$O?H_-5AM!<>#XS+)E!6dU4moh&eORsIDGjZ4@(IPnal8Zet9d9_+P zbJynG!i;jju*_JrdD7$^88n70o;7}KZfjqwrI;r)aIZ{}du(!L5Sz(bz+sC{RVN%$S1pYc&=vsXl*Ju8l3VCe+cwSiO zmgbRM{8R7y(N^29)^iZSQ4xyP)b&iFZtw$QB`fSlx6AEo{l2GIrjWp z16}1$(LICBc_SC|WX}1Bk)hfAm>|vSRV8O3EgNN(3uFhO)aPh0Pupx=Tt9Fe?OqP0 z_eLImbzWg<{t_JC<8X$MvfPJ-ZLIJiJY+=zf zU^CAb(vG=Omb5&*8r){XtPcT)mcL@V`5$tZ<$oi{ zIp_ic%7Q8_!k{z>Ky&X#6dumnWB0dA4djdeH<~~D{{NGyiQoTLFeFCz+m#s87CPFL uNOuWRJkF1hy<%y{9r8o0@)sb$L135LcDI-D6ketYfD5N>tW~N(2>A!&@-2V> diff --git a/src/main/resources/assets/hbm/textures/models/particleaccelerator/source.png b/src/main/resources/assets/hbm/textures/models/particleaccelerator/source.png index f54d81a3c3e5eb98efa39524bde359eaeb7c766f..00e7a765db2cb1e084d96a0b0f8045b297b64ca7 100644 GIT binary patch literal 7977 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 literal 3278 zcmZvfc{tSH9>XmrKIe13pY#2^&+B^*(c1E&5I>logM&i| zZHBaEwd_?Z&@in3@CGk)Uf z^opF7p6kK5zY-9_wi?rbWRXx1aXRwuuv*Cud^P6a{?IQE=7G^>sFBp6kss9=Uqdq6 zU3lx%ka~VPw5iX2wql5Qurk#i9piX*07tVO7m_dLU2G-z7&gEDmi3dw0$CuG<`gY7 zCE7qe(1uA4P4KtCmHLX6Fe?7Z+@5{VYZC01VRzwb|=df61^E4>JSL_Sq}| z_8*1A?S;pU21%t~7y{X2{v6~p-vFP>f|G-uZ}~8uE{Q)D+x{xAe`jyKIz(s@a1436 z3)PZqTlbn7`kFLi>fOrenQhVUqIa@N8y}>s63p*m9%_E|jw>R`l;I^vw_FX@Rd>)` z*TWSErmy6E&(lT=8#CrJ-gPt=7P)_Q#HJ!7_;72y3mr4%X&ubS!={B6#L-PUp@i=2tz};IsWMwl18}FV*@X$ z@Docu_cm`{bjqQ$+8iwIg~G6}Iq zGi{EKg4RzE`0TS=b`26vquF~vehP^&H(elv&{9{Qg$pK`{+86eAg4P~10S(wONNgu zx>!$$?~ytbuQkH>Wc>f#8h^z9KSPE{QJ>^^qxbjDt;&1yR|=dx3=z0Q!_hpkpeg}~ z%gEG)f8l7{tZdE9lpa6;w-!5^*kn}rd|%35)I~sRgizFNMa4aULwh?T+qw#X*{jVsOVCm3Z??-Ib~n!p||xxlE>Pi*}Um%G|pnzQyZS z;*{mXv}$GKV^8s;+GfBR`4K|w&P{VV{FlFa#S)!`;inHtM5luO0~P|y<=x*Of}O zOd9mv!hKF5NExZW_1<_D)Q8tV5)_R8taEA}Ozlse8t|I8%m zDGQsIl#0c&t*C#VniW&DhHuE=>PGHbD8M9eRX;3GS5KP=O**9ngDAVZtUg_|=)~02 z&1Ppsc4uNj9xWQVHTq9jx9HKMM>|7fMRJL% z>ZkzvM;|tR#`2y#@Nw*ik&4MzZQRTFl!WF{s22o}gc4DT&USVU&MtE`wRMCkASUCG zIYKui6@hpsO&pw0_<4wj#Yw6LX#{^BoeoE;m56oK#SekmF@n019TxJ)IDg>bkH$={ z)SC33TCihlJ_r&t)R#MZmQ65WJ*(YP{r)y*IH%r8t@85n`b4~*oXI&x9Eh17WPdF& zu+~8aS+4;hv)J14ARsxwgJ2BU6{?j+E>->tr1X}`#u1&-861Xtzn@wa)=c^@^M~VJ zkNWbs72-kFAasvsB2tx(@IOm&s#5EIu&8sEA_Rc!v(_eC<2Y?ZxKq}y4@2vK8yoZ8 z;esa@l_)RSQ)E1&P^2sED?V&oGhw+}?{XoMZqA+=DU&@xO&~Jk5W<_fA zoL9z+DbYP@Z}=+B{qF6x;oP2mW%JLaBr@!$JVK(dpS-< zWzt=Vo^|9~BHX|ytPk$jA@u$#ZjIp-dhO_`td&yjW4(3Cyu%5<(Ai$RE(WZN@X6ZH z7H9K<4CrVGsE@9=*5Pg>@@0Qt)<{IYyAEYaP_enTVJfP|5I9+xqOSv^7)1X5!RNHB zd;6m$@lsQd%oC!BWA>_MtVHROlIWxJm&qRLSh&Rz;MNA&@B4q5xZA?yxnLLO!$@d& zDD9Zd`Ns72@0*3DnanWnG-0BHRhAzPB6&As<6$r6)Ac0JQ0aRe#?H;eINS0y#r>_l zrX9f>#MQ+sE4b#To4#&eN=2e8h&X8l3ZTEXN7;zr9KEeQx!e@aKO7E)ZF+lO2(y6Rc~<^x=;K_enGn>Jqdc*MJvQLtZtjp8W4{@xIQEJl>K1PJn`x)TW zpft=PB$w;+$0VOw?FCzLqU(Z?q9>i?TM0?l;K5$N^Obr!$D=LAsJSjEtax2BQ3%11 bTse^Hi*fFa|M-D@LE%7~S|Y2A-SPhhyd5Cy diff --git a/src/main/resources/assets/hbm/textures/models/tank/tank_PERFLUOROMETHYL.png b/src/main/resources/assets/hbm/textures/models/tank/tank_PERFLUOROMETHYL.png new file mode 100644 index 0000000000000000000000000000000000000000..1fbb312bdfae3c6bb8c706247dbdedd61b738103 GIT binary patch literal 1307 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 literal 0 HcmV?d00001