From a074a4a249fca116846728f2f57067e2d5d302dd Mon Sep 17 00:00:00 2001 From: Bob Date: Tue, 28 Jan 2025 23:24:40 +0100 Subject: [PATCH] the escape plan --- changelog | 4 +- gradle.properties | 2 +- .../com/hbm/inventory/gui/GUIPADetector.java | 1 + .../com/hbm/inventory/gui/GUIPADipole.java | 1 + .../hbm/inventory/gui/GUIPAQuadrupole.java | 1 + .../com/hbm/inventory/gui/GUIPASource.java | 18 +++++ .../recipes/ParticleAcceleratorRecipes.java | 8 ++ .../recipes/loader/SerializableRecipe.java | 1 + .../com/hbm/items/machine/ItemPACoil.java | 20 ++++- .../com/hbm/items/tool/ItemCasingBag.java | 5 +- .../weapon/sedna/factory/XFactoryFlamer.java | 8 +- .../items/weapon/sedna/mags/IMagazine.java | 5 +- .../items/weapon/sedna/mags/MagazineBelt.java | 1 + src/main/java/com/hbm/lib/RefStrings.java | 2 +- .../java/com/hbm/main/ModEventHandler.java | 4 +- .../machine/albion/TileEntityCooledBase.java | 4 +- .../machine/albion/TileEntityPADetector.java | 16 ++-- .../machine/albion/TileEntityPADipole.java | 7 +- .../albion/TileEntityPAQuadrupole.java | 4 +- .../machine/albion/TileEntityPARFC.java | 4 +- .../machine/albion/TileEntityPASource.java | 71 ++++++++++++------ src/main/resources/assets/hbm/lang/en_US.lang | 15 ++++ .../gui/particleaccelerator/gui_source.png | Bin 3702 -> 3787 bytes 23 files changed, 146 insertions(+), 56 deletions(-) diff --git a/changelog b/changelog index 8a08fc098..e8ec49e66 100644 --- a/changelog +++ b/changelog @@ -6,6 +6,7 @@ * Standard coolant will be removed soon in favor of perfloromethyl, however for now it continues to function just the same # Particle accelerator * A new and improved version of the old one + * Still a work in progress, the recipes will likely not work, the parts have no recipes and the coil balancing is still not done * Instead of being assembled block by block with weird rules, the new PA is assembled from six different machine parts, similar to how RBMKs work * Ammo casing bag * Can be carried around in the inventory, will fill with empty casings when guns are fired @@ -43,6 +44,7 @@ * This means there is no more ambiguity in the NEI handler over what item smelts into what * As a consequence, the arc furnace's recipe generator no longer accepts wildcard meta, in practice this likely doesn't matter since ores and ingots generally don't use wildcard recipes anyway * Recipe lookups should be a tad faster due to a type change +* Foundry outlets will no longer pour material into a channel if any connected channel contains a different material. This means that it's not much harder to clog foundry channels with different materials, as the output (e.g. a crucible) will wait until the channel is clear before the next type of metal is being poured ## Fixed * Fixed incorrect tooltip in the automatic control rod's GUI @@ -58,4 +60,4 @@ * Hotkey shortcuts may return, but this requires a substantial rewrite of the container base code because vanilla's implementation is atrocious * Fixed legendary crafting causing disconnects on servers * Fixed a dupe caused by shift clicking -* Added more safeguards and range checks to ReaSim water calculation which might fix the issue of ReaSim water breaking completely \ No newline at end of file +* Added more safeguards and range checks to ReaSim water calculation which might fix the issue of ReaSim water breaking completely diff --git a/gradle.properties b/gradle.properties index 85e51effb..e33d5f890 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_version=1.0.27 # Empty build number makes a release type -mod_build_number=5209 +mod_build_number=5224 credits=HbMinecraft,\ \ rodolphito (explosion algorithms),\ diff --git a/src/main/java/com/hbm/inventory/gui/GUIPADetector.java b/src/main/java/com/hbm/inventory/gui/GUIPADetector.java index f426dfad0..de0ee89f8 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIPADetector.java +++ b/src/main/java/com/hbm/inventory/gui/GUIPADetector.java @@ -58,6 +58,7 @@ public class GUIPADetector extends GuiInfoContainer { int heat = (int) Math.ceil(source.temperature); if(heat <= 123) drawTexturedModalRect(guiLeft + 44, guiTop + 18, 176, 8, 8, 8); + if(source.power >= source.usage) drawTexturedModalRect(guiLeft + 44, guiTop + 43, 176, 8, 8, 8); source.tanks[0].renderTank(guiLeft + 134, guiTop + 88, this.zLevel, 16, 52); source.tanks[1].renderTank(guiLeft + 152, guiTop + 88, this.zLevel, 16, 52); diff --git a/src/main/java/com/hbm/inventory/gui/GUIPADipole.java b/src/main/java/com/hbm/inventory/gui/GUIPADipole.java index 1fa9ac5b8..da63bd28c 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIPADipole.java +++ b/src/main/java/com/hbm/inventory/gui/GUIPADipole.java @@ -117,6 +117,7 @@ public class GUIPADipole extends GuiInfoContainer { int heat = (int) Math.ceil(dipole.temperature); if(heat <= 123) drawTexturedModalRect(guiLeft + 93, guiTop + 54, 176, 8, 8, 8); if(dipole.slots[1] != null && dipole.slots[1].getItem() == ModItems.pa_coil) drawTexturedModalRect(guiLeft + 103, guiTop + 54, 176, 8, 8, 8); + if(dipole.power >= dipole.usage) drawTexturedModalRect(guiLeft + 83, guiTop + 54, 176, 8, 8, 8); GL11.glPushMatrix(); GL11.glDisable(GL11.GL_TEXTURE_2D); diff --git a/src/main/java/com/hbm/inventory/gui/GUIPAQuadrupole.java b/src/main/java/com/hbm/inventory/gui/GUIPAQuadrupole.java index cf82d6266..868317dc7 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIPAQuadrupole.java +++ b/src/main/java/com/hbm/inventory/gui/GUIPAQuadrupole.java @@ -60,6 +60,7 @@ public class GUIPAQuadrupole extends GuiInfoContainer { 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); + if(quadrupole.power >= quadrupole.usage) drawTexturedModalRect(guiLeft + 65, 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/GUIPASource.java b/src/main/java/com/hbm/inventory/gui/GUIPASource.java index fa2a41d55..c95e3f344 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIPASource.java +++ b/src/main/java/com/hbm/inventory/gui/GUIPASource.java @@ -1,5 +1,7 @@ package com.hbm.inventory.gui; +import java.util.Locale; + import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerPASource; @@ -36,6 +38,9 @@ public class GUIPASource extends GuiInfoContainer { source.tanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 134, guiTop + 36, 16, 52); source.tanks[1].renderTankInfo(this, mouseX, mouseY, guiLeft + 152, guiTop + 36, 16, 52); this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 18, 16, 52, source.power, source.getMaxPower()); + + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 105, guiTop + 18, 10, 10, mouseX, mouseY, "Last momentum: " + source.lastSpeed); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 105, guiTop + 30, 10, 10, mouseX, mouseY, EnumChatFormatting.RED + "Cancel operation"); } @Override @@ -61,6 +66,9 @@ public class GUIPASource extends GuiInfoContainer { int heat = (int) Math.ceil(source.temperature); String label = (heat > 123 ? EnumChatFormatting.RED : EnumChatFormatting.AQUA) + "" + heat + "K"; this.fontRendererObj.drawString(label, 166 - this.fontRendererObj.getStringWidth(label), 12, 4210752); + + String state = I18n.format("pa." + this.source.state.name().toLowerCase(Locale.US)); + this.fontRendererObj.drawString(state, 79 - this.fontRendererObj.getStringWidth(state) / 2, 76, this.source.state.color); } @Override @@ -74,6 +82,16 @@ public class GUIPASource extends GuiInfoContainer { int heat = (int) Math.ceil(source.temperature); if(heat <= 123) drawTexturedModalRect(guiLeft + 44, guiTop + 18, 176, 8, 8, 8); + if(source.power >= source.usage) drawTexturedModalRect(guiLeft + 44, guiTop + 43, 176, 8, 8, 8); + + int color = source.state.color; + float red = (color & 0xff0000) >> 16; + float green = (color & 0x00ff00) >> 8; + float blue = (color & 0x0000ff); + + GL11.glColor4f(red, green, blue, 1.0F); + drawTexturedModalRect(guiLeft + 45, guiTop + 73, 176, 52, 68, 14); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); source.tanks[0].renderTank(guiLeft + 134, guiTop + 88, this.zLevel, 16, 52); source.tanks[1].renderTank(guiLeft + 152, guiTop + 88, this.zLevel, 16, 52); diff --git a/src/main/java/com/hbm/inventory/recipes/ParticleAcceleratorRecipes.java b/src/main/java/com/hbm/inventory/recipes/ParticleAcceleratorRecipes.java index 7936a6015..24349890b 100644 --- a/src/main/java/com/hbm/inventory/recipes/ParticleAcceleratorRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/ParticleAcceleratorRecipes.java @@ -12,6 +12,7 @@ import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.recipes.loader.SerializableRecipe; import com.hbm.items.ModItems; +import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; @@ -92,6 +93,13 @@ public class ParticleAcceleratorRecipes extends SerializableRecipe { new ItemStack(ModItems.nugget), new ItemStack(ModItems.nugget) )); + recipes.add(new ParticleAcceleratorRecipe( + new ComparableStack(Blocks.sand), + new ComparableStack(Blocks.sand), + 10, + new ItemStack(ModItems.static_sandwich), + new ItemStack(ModItems.static_sandwich) + )); } public ParticleAcceleratorRecipe getOutput(ItemStack input1, ItemStack input2, int momentum) { diff --git a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java index 5cf8d0fdc..7b99b1b9f 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java @@ -74,6 +74,7 @@ public abstract class SerializableRecipe { recipeHandlers.add(new ArcWelderRecipes()); recipeHandlers.add(new RotaryFurnaceRecipes()); recipeHandlers.add(new ExposureChamberRecipes()); + recipeHandlers.add(new ParticleAcceleratorRecipes()); recipeHandlers.add(new AmmoPressRecipes()); recipeHandlers.add(new AssemblerRecipes()); //AFTER Assembler diff --git a/src/main/java/com/hbm/items/machine/ItemPACoil.java b/src/main/java/com/hbm/items/machine/ItemPACoil.java index fc380c1ee..0bd562e21 100644 --- a/src/main/java/com/hbm/items/machine/ItemPACoil.java +++ b/src/main/java/com/hbm/items/machine/ItemPACoil.java @@ -1,6 +1,12 @@ package com.hbm.items.machine; +import java.util.List; + import com.hbm.items.ItemEnumMulti; +import com.hbm.util.EnumUtil; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; public class ItemPACoil extends ItemEnumMulti { @@ -10,9 +16,9 @@ public class ItemPACoil extends ItemEnumMulti { } public static enum EnumCoilType { - GOLD(0, 10_000, 0, 10_000, 0.01D), - NIOBIUM(5_000, 100_000, 5_000, 100_000, 0.001D), - BSCCO(50_000, 500_000, 50_000, 500_000, 0.00025D); + GOLD(0, 10_000, 0, 10_000, 0.99D), + NIOBIUM(5_000, 100_000, 5_000, 100_000, 0.999D), + BSCCO(50_000, 500_000, 50_000, 500_000, 0.99975D); public int quadMin; public int quadMax; @@ -28,4 +34,12 @@ public class ItemPACoil extends ItemEnumMulti { this.diMult = diMult; } } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { + EnumCoilType type = EnumUtil.grabEnumSafely(theEnum, stack.getItemDamage()); + list.add("Quadrupole operational range: " + type.quadMin + " - " + type.quadMax); + list.add("Dipole operational range: " + type.diMin + " - " + type.diMax); + list.add("Dipole momentum multiplier: x" + type.diMult); + } } diff --git a/src/main/java/com/hbm/items/tool/ItemCasingBag.java b/src/main/java/com/hbm/items/tool/ItemCasingBag.java index 342a9198a..6329998f2 100644 --- a/src/main/java/com/hbm/items/tool/ItemCasingBag.java +++ b/src/main/java/com/hbm/items/tool/ItemCasingBag.java @@ -75,7 +75,7 @@ public class ItemCasingBag extends Item implements IGUIProvider { int am = Math.min(toAdd.stackSize, slot.getMaxStackSize() - slot.stackSize); toAdd.stackSize -= am; slot.stackSize += am; - didSomething = true; + if(am > 0) didSomething = true; } } @@ -88,10 +88,9 @@ public class ItemCasingBag extends Item implements IGUIProvider { break; } } - - bag.stackTagCompound.setFloat(name, bag.stackTagCompound.getFloat(name) - 1F); if(didSomething) { + bag.stackTagCompound.setFloat(name, bag.stackTagCompound.getFloat(name) - 1F); ret = true; } else { break; diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryFlamer.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryFlamer.java index 06051e1d6..465f8506e 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryFlamer.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryFlamer.java @@ -110,13 +110,13 @@ public class XFactoryFlamer { } public static void init() { - flame_diesel = new BulletConfig().setItem(EnumAmmo.FLAME_DIESEL).setCasing(new ItemStack(ModItems.plate_steel, 2), 1).setupDamageClass(DamageClass.FIRE).setLife(100).setVel(1F).setGrav(0.02D).setReloadCount(500).setSelfDamageDelay(20).setKnockback(0F) + flame_diesel = new BulletConfig().setItem(EnumAmmo.FLAME_DIESEL).setCasing(new ItemStack(ModItems.plate_steel, 2), 500).setupDamageClass(DamageClass.FIRE).setLife(100).setVel(1F).setGrav(0.02D).setReloadCount(500).setSelfDamageDelay(20).setKnockback(0F) .setOnUpdate(LAMBDA_FIRE).setOnRicochet(LAMBDA_LINGER_DIESEL); - flame_gas = new BulletConfig().setItem(EnumAmmo.FLAME_GAS).setCasing(new ItemStack(ModItems.plate_steel, 2), 1).setupDamageClass(DamageClass.FIRE).setLife(10).setSpread(0.05F).setVel(1F).setGrav(0.0D).setReloadCount(500).setSelfDamageDelay(20).setKnockback(0F) + flame_gas = new BulletConfig().setItem(EnumAmmo.FLAME_GAS).setCasing(new ItemStack(ModItems.plate_steel, 2), 500).setupDamageClass(DamageClass.FIRE).setLife(10).setSpread(0.05F).setVel(1F).setGrav(0.0D).setReloadCount(500).setSelfDamageDelay(20).setKnockback(0F) .setOnUpdate(LAMBDA_FIRE).setOnRicochet(LAMBDA_LINGER_GAS); - flame_napalm = new BulletConfig().setItem(EnumAmmo.FLAME_NAPALM).setCasing(new ItemStack(ModItems.plate_steel, 2), 1).setupDamageClass(DamageClass.FIRE).setLife(200).setVel(1F).setGrav(0.02D).setReloadCount(500).setSelfDamageDelay(20).setKnockback(0F) + flame_napalm = new BulletConfig().setItem(EnumAmmo.FLAME_NAPALM).setCasing(new ItemStack(ModItems.plate_steel, 2), 500).setupDamageClass(DamageClass.FIRE).setLife(200).setVel(1F).setGrav(0.02D).setReloadCount(500).setSelfDamageDelay(20).setKnockback(0F) .setOnUpdate(LAMBDA_FIRE).setOnRicochet(LAMBDA_LINGER_NAPALM); - flame_balefire = new BulletConfig().setItem(EnumAmmo.FLAME_BALEFIRE).setCasing(new ItemStack(ModItems.plate_steel, 2), 1).setupDamageClass(DamageClass.FIRE).setLife(200).setVel(1F).setGrav(0.02D).setReloadCount(500).setSelfDamageDelay(20).setKnockback(0F) + flame_balefire = new BulletConfig().setItem(EnumAmmo.FLAME_BALEFIRE).setCasing(new ItemStack(ModItems.plate_steel, 2), 500).setupDamageClass(DamageClass.FIRE).setLife(200).setVel(1F).setGrav(0.02D).setReloadCount(500).setSelfDamageDelay(20).setKnockback(0F) .setOnUpdate(LAMBDA_BALEFIRE).setOnRicochet(LAMBDA_LINGER_BALEFIRE); flame_nograv = flame_diesel.clone().setGrav(0); diff --git a/src/main/java/com/hbm/items/weapon/sedna/mags/IMagazine.java b/src/main/java/com/hbm/items/weapon/sedna/mags/IMagazine.java index dee52e877..e1d9ae758 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/mags/IMagazine.java +++ b/src/main/java/com/hbm/items/weapon/sedna/mags/IMagazine.java @@ -28,7 +28,7 @@ public interface IMagazine { public int getAmount(ItemStack stack, IInventory inventory); /** Sets the mag's ammo level */ public void setAmount(ItemStack stack, int amount); - /** removes the specified amount fro mthe magazine */ + /** removes the specified amount from the magazine */ public void useUpAmmo(ItemStack stack, IInventory inventory, int amount); /** If a reload can even be initiated, i.e. the player even has bullets to load, inventory can be null */ public boolean canReload(ItemStack stack, IInventory inventory); @@ -53,9 +53,8 @@ public interface IMagazine { public static void handleAmmoBag(IInventory inventory, BulletConfig config, int shotsFired) { if(config.casingItem != null && config.casingAmount > 0 && inventory instanceof InventoryPlayer) { InventoryPlayer inv = (InventoryPlayer) inventory; - EntityPlayer player = inv.player; for(ItemStack stack : inv.mainInventory) { - if(stack != null && stack.getItem() == ModItems.casing_bag && ItemCasingBag.pushCasing(stack, config.casingItem, 1F / config.casingAmount * 0.5F)) return; + if(stack != null && stack.getItem() == ModItems.casing_bag && ItemCasingBag.pushCasing(stack, config.casingItem, 1F / config.casingAmount * 0.5F * shotsFired)) return; } } } diff --git a/src/main/java/com/hbm/items/weapon/sedna/mags/MagazineBelt.java b/src/main/java/com/hbm/items/weapon/sedna/mags/MagazineBelt.java index 712593198..220ddbaa0 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/mags/MagazineBelt.java +++ b/src/main/java/com/hbm/items/weapon/sedna/mags/MagazineBelt.java @@ -40,6 +40,7 @@ public class MagazineBelt implements IMagazine { amount -= toRemove; inventory.decrStackSize(i, toRemove); IMagazine.handleAmmoBag(inventory, first, toRemove); + if(amount <= 0) return; } } } diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index 57a88c495..413e6868e 100644 --- a/src/main/java/com/hbm/lib/RefStrings.java +++ b/src/main/java/com/hbm/lib/RefStrings.java @@ -3,7 +3,7 @@ package com.hbm.lib; public class RefStrings { public static final String MODID = "hbm"; public static final String NAME = "Hbm's Nuclear Tech Mod"; - public static final String VERSION = "1.0.27 BETA (5209)"; + public static final String VERSION = "1.0.27 BETA (5224)"; //HBM's Beta Naming Convention: //V T (X) //V -> next release version diff --git a/src/main/java/com/hbm/main/ModEventHandler.java b/src/main/java/com/hbm/main/ModEventHandler.java index 9debc9d25..bd5ec48e4 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -1323,8 +1323,8 @@ public class ModEventHandler { public void onClickSign(PlayerInteractEvent event) { int x = event.x; - int y = event.y; - int z = event.z; + int y = event.z; + int z = event.y; World world = event.world; if(!world.isRemote && event.action == Action.RIGHT_CLICK_BLOCK && world.getTileEntity(x, y, z) instanceof TileEntitySign) { diff --git a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityCooledBase.java b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityCooledBase.java index 596e6ab0a..18559eaa4 100644 --- a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityCooledBase.java +++ b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityCooledBase.java @@ -27,8 +27,8 @@ public abstract class TileEntityCooledBase extends TileEntityMachineBase impleme 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); + tanks[0] = new FluidTank(Fluids.PERFLUOROMETHYL_COLD, 4_000); + tanks[1] = new FluidTank(Fluids.PERFLUOROMETHYL, 4_000); } @Override 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 748d81ba7..72da84fea 100644 --- a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPADetector.java +++ b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPADetector.java @@ -5,6 +5,7 @@ import com.hbm.inventory.gui.GUIPADetector; import com.hbm.inventory.recipes.ParticleAcceleratorRecipes; import com.hbm.inventory.recipes.ParticleAcceleratorRecipes.ParticleAcceleratorRecipe; import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.machine.albion.TileEntityPASource.PAState; import com.hbm.tileentity.machine.albion.TileEntityPASource.Particle; import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; @@ -19,6 +20,8 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class TileEntityPADetector extends TileEntityCooledBase implements IGUIProvider, IParticleUser { + + public static final long usage = 100_000; public TileEntityPADetector() { super(5); @@ -44,7 +47,7 @@ public class TileEntityPADetector extends TileEntityCooledBase implements IGUIPr @Override public long getMaxPower() { - return 10_000_000; + return 1_000_000; } AxisAlignedBB bb = null; @@ -93,8 +96,10 @@ public class TileEntityPADetector extends TileEntityCooledBase implements IGUIPr public void onEnter(Particle particle, ForgeDirection dir) { particle.invalid = true; //particle will crash if not perfectly focused - if(particle.defocus > 0) return; - + if(particle.defocus > 0) { particle.crash(PAState.CRASH_DEFOCUS); return; } + if(this.power < this.usage) { particle.crash(PAState.CRASH_NOPOWER); return; } + if(!isCool()) { particle.crash(PAState.CRASH_NOCOOL); return; } + for(ParticleAcceleratorRecipe recipe : ParticleAcceleratorRecipes.recipes) { if(particle.momentum >= recipe.momentum && @@ -116,6 +121,7 @@ public class TileEntityPADetector extends TileEntityCooledBase implements IGUIPr slots[4].stackSize += recipe.output2.stackSize; } } + particle.crash(PAState.SUCCESS); return; } } @@ -131,8 +137,8 @@ public class TileEntityPADetector extends TileEntityCooledBase implements IGUIPr //cancel if: output item does not match, meta does not match, resulting stacksize exceeds stack limit if(slots[outputSlot].getItem() != output.getItem() || slots[outputSlot].getItemDamage() != output.getItemDamage() || slots[outputSlot].stackSize + output.stackSize > output.getMaxStackSize()) return false; } - if(slots[outputSlot].getItem().hasContainerItem(slots[outputSlot])) { - ItemStack container = slots[outputSlot].getItem().getContainerItem(slots[outputSlot]); + if(output.getItem().hasContainerItem(output)) { + ItemStack container = output.getItem().getContainerItem(output); //cancel if: container slot is empty, container item does not match, meta does not match if(slots[containerSlot] == null || slots[containerSlot].getItem() != container.getItem() || slots[containerSlot].getItemDamage() != container.getItemDamage()) return false; } 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 48b431591..147f9bf41 100644 --- a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPADipole.java +++ b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPADipole.java @@ -32,7 +32,7 @@ public class TileEntityPADipole extends TileEntityCooledBase implements IGUIProv public int dirRedstone; public int threshold; - public static final long usage = 1_000_000; + public static final long usage = 100_000; public TileEntityPADipole() { super(2); @@ -40,7 +40,7 @@ public class TileEntityPADipole extends TileEntityCooledBase implements IGUIProv @Override public long getMaxPower() { - return 10_000_000; + return 1_000_000; } @Override @@ -79,7 +79,8 @@ public class TileEntityPADipole extends TileEntityCooledBase implements IGUIProv if(type != null && type.diMax < particle.momentum) particle.crash(PAState.CRASH_OVERSPEED); if(particle.invalid) return; - + + particle.momentum *= type.diMult; this.power -= this.usage * mult; } 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 8f68765a6..0a666cfd1 100644 --- a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPAQuadrupole.java +++ b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPAQuadrupole.java @@ -22,7 +22,7 @@ import net.minecraftforge.common.util.ForgeDirection; public class TileEntityPAQuadrupole extends TileEntityCooledBase implements IGUIProvider, IParticleUser { - public static final long usage = 1_000_000; + public static final long usage = 100_000; public static final int focusGain = 100; public TileEntityPAQuadrupole() { @@ -31,7 +31,7 @@ public class TileEntityPAQuadrupole extends TileEntityCooledBase implements IGUI @Override public long getMaxPower() { - return 10_000_000; + return 1_000_000; } @Override 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 d0d353329..14172d8a6 100644 --- a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPARFC.java +++ b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPARFC.java @@ -19,7 +19,7 @@ import net.minecraftforge.common.util.ForgeDirection; public class TileEntityPARFC extends TileEntityCooledBase implements IGUIProvider, IParticleUser { - public static final long usage = 1_000_000; + public static final long usage = 100_000; public static final int momentumGain = 100; public static final int defocusGain = 100; @@ -29,7 +29,7 @@ public class TileEntityPARFC extends TileEntityCooledBase implements IGUIProvide @Override public long getMaxPower() { - return 10_000_000; + return 1_000_000; } @Override 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 2d1c549d8..ec799e43a 100644 --- a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPASource.java +++ b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPASource.java @@ -5,7 +5,6 @@ import com.hbm.interfaces.IControlReceiver; import com.hbm.inventory.container.ContainerPASource; import com.hbm.inventory.gui.GUIPASource; import com.hbm.lib.Library; -import com.hbm.particle.helper.ExplosionSmallCreator; import com.hbm.tileentity.IConditionalInvAccess; import com.hbm.tileentity.IGUIProvider; import com.hbm.util.EnumUtil; @@ -27,23 +26,32 @@ import net.minecraftforge.common.util.ForgeDirection; public class TileEntityPASource extends TileEntityCooledBase implements IGUIProvider, IConditionalInvAccess, IControlReceiver { - public static final long usage = 1_000_000; + public static final long usage = 100_000; public Particle particle; - public PAState state; + public PAState state = PAState.IDLE; + + public int lastSpeed; public int debugSpeed; public static enum PAState { - IDLE, //no particle active - RUNNING, //running without further issue - PAUSE_UNLOADED, //particle suspended because it entered unloaded chunks - CRASH_DEFOCUS, //crash from excessive defocus - CRASH_DERAIL, //crash due to leaving the beamline - CRASH_CANNOT_ENTER, //crash due to hitting PA component from invalid side - CRASH_NOCOOL, //crash due to lack of cooling - CRASH_NOPOWER, //crash due to power outage - CRASH_NOCOIL, //crash due to no coil installed (QP, DP) - CRASH_OVERSPEED //crash due to coil max speed exceeded (QP, DP) + IDLE(0x8080ff), //no particle active + RUNNING(0xffff00), //running without further issue + SUCCESS(0x00ff00), //completed recipe + PAUSE_UNLOADED(0x808080), //particle suspended because it entered unloaded chunks + CRASH_DEFOCUS(0xff0000), //crash from excessive defocus + CRASH_DERAIL(0xff0000), //crash due to leaving the beamline + CRASH_CANNOT_ENTER(0xff0000), //crash due to hitting PA component from invalid side + CRASH_NOCOOL(0xff0000), //crash due to lack of cooling + CRASH_NOPOWER(0xff0000), //crash due to power outage + CRASH_NOCOIL(0xff0000), //crash due to no coil installed (QP, DP) + CRASH_OVERSPEED(0xff0000); //crash due to coil max speed exceeded (QP, DP) + + public int color; + + private PAState(int color) { + this.color = color; + } } public void updateState(PAState state) { this.state = state; } @@ -61,12 +69,16 @@ public class TileEntityPASource extends TileEntityCooledBase implements IGUIProv if(!worldObj.isRemote) { this.power = Library.chargeTEFromItems(slots, 0, power, this.getMaxPower()); - if(particle != null) { - steppy(); - this.debugSpeed = particle.momentum; - if(particle.invalid) this.particle = null; - } else if(this.power >= this.usage && slots[1] != null && slots[2] != null) { - tryRun(); + for(int i = 0; i < 10; i++) { + if(particle != null) { + this.state = PAState.RUNNING; + steppy(); + this.debugSpeed = particle.momentum; + if(particle.invalid) this.particle = null; + } else if(this.power >= this.usage && slots[1] != null && slots[2] != null) { + tryRun(); + break; + } } } @@ -74,8 +86,8 @@ public class TileEntityPASource extends TileEntityCooledBase implements IGUIProv } public void steppy() { - if(!worldObj.getChunkProvider().chunkExists(particle.x >> 4, particle.z >> 4)) return; //halt if we reach unloaded areas - ExplosionSmallCreator.composeEffect(worldObj, particle.x + 0.5, particle.y + 0.5, particle.z + 0.5, 10, 1, 1); + if(!worldObj.getChunkProvider().chunkExists(particle.x >> 4, particle.z >> 4)) { this.state = PAState.PAUSE_UNLOADED; return; } //halt if we reach unloaded areas + //ExplosionSmallCreator.composeEffect(worldObj, particle.x + 0.5, particle.y + 0.5, particle.z + 0.5, 10, 1, 1); Block b = worldObj.getBlock(particle.x, particle.y, particle.z); if(b instanceof BlockDummyable) { @@ -88,7 +100,7 @@ public class TileEntityPASource extends TileEntityCooledBase implements IGUIProv pa.onEnter(particle, particle.dir); BlockPos exit = pa.getExitPos(particle); if(exit != null) particle.move(exit); - } else { particle.crash(PAState.CRASH_CANNOT_ENTER); worldObj.createExplosion(null, particle.x + 0.5, particle.y + 0.5, particle.z + 0.5, 5, false); return; } + } else { particle.crash(PAState.CRASH_CANNOT_ENTER); return; } } else { particle.crash(PAState.CRASH_DERAIL); } @@ -97,10 +109,13 @@ public class TileEntityPASource extends TileEntityCooledBase implements IGUIProv public void tryRun() { if(slots[1].getItem().hasContainerItem(slots[1]) && slots[3] != null) return; if(slots[2].getItem().hasContainerItem(slots[2]) && slots[4] != null) return; + + if(slots[1].getItem().hasContainerItem(slots[1])) slots[3] = slots[1].getItem().getContainerItem(slots[1]).copy(); + if(slots[2].getItem().hasContainerItem(slots[2])) slots[4] = slots[2].getItem().getContainerItem(slots[2]).copy(); this.power -= usage; ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); - ForgeDirection rot = dir.getRotation(ForgeDirection.UP); + ForgeDirection rot = dir.getRotation(ForgeDirection.DOWN); this.particle = new Particle(this, xCoord + rot.offsetX * 5, yCoord, zCoord + rot.offsetZ * 5, rot, slots[1], slots[2]); this.slots[1] = null; this.slots[2] = null; @@ -112,6 +127,7 @@ public class TileEntityPASource extends TileEntityCooledBase implements IGUIProv super.serialize(buf); buf.writeInt(debugSpeed); buf.writeByte((byte) this.state.ordinal()); + buf.writeInt(particle != null ? particle.momentum : 0); } @Override @@ -119,6 +135,10 @@ public class TileEntityPASource extends TileEntityCooledBase implements IGUIProv super.deserialize(buf); debugSpeed = buf.readInt(); state = EnumUtil.grabEnumSafely(PAState.class, buf.readByte()); + int lastSpeed = buf.readInt(); + if(lastSpeed != 0) { + this.lastSpeed = lastSpeed; + } } @Override @@ -208,7 +228,10 @@ public class TileEntityPASource extends TileEntityCooledBase implements IGUIProv @Override public void receiveControl(NBTTagCompound data) { - if(data.hasKey("cancel")) this.particle = null; + if(data.hasKey("cancel")) { + this.particle = null; + this.state = PAState.IDLE; + } } public static class Particle { diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 57c468e11..efdcb62a9 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -3786,6 +3786,9 @@ item.ore_separated.name=Separated %s Ore item.overfuse.name=Singularity Screwdriver item.overfuse.desc=Say what? item.oxy_mask.name=Oxygen Mask +item.pa_coil.bscco.name=Large BSCCO Coil +item.pa_coil.gold.name=Large Gold Coil +item.pa_coil.niobium.name=Large NbTi Coil item.paa_boots.name=PaA "good ol' shoes" item.paa_legs.name=PaA Leg Reinforcements item.paa_plate.name=PaA Chest Protection Plate @@ -4828,6 +4831,18 @@ itemGroup.tabTemplate=NTM Templates itemGroup.tabTest=Nuclear Tech Mod Test Tab itemGroup.tabWeapon=NTM Weapons and Turrets +pa.idle=Idle +pa.running=Running +pa.success=Success +pa.pause_unloaded=Paused +pa.crash_defocus=Defocus! +pa.crash_derail=Derail! +pa.crash_cannot_enter=Denied! +pa.crash_nocool=No cooling! +pa.crash_nopower=No power! +pa.crash_nocoil=No coils! +pa.crash_overspeed=Overspeed! + potion.hbm_bang=! ! ! potion.hbm_death=Astolfization potion.hbm_lead=Lead Poisoning 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 index 190e88643a995008569744e8c7cd041deed7cbb6..8483b85d8786f610d24452195c530b08ea112d69 100644 GIT binary patch delta 3468 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 A!~g&Q